#include <bits/stdc++.h>
using namespace std;
const int logn = 22;
const int maxn = 2e5 + 5;
const int mod = 1e9 + 7;
int fac[maxn], invf[maxn], inv[maxn];
int Pow(int a, int b) {
  if (b == 0) return 1;
  int r = Pow(a, b / 2);
  if (b & 1) return (long long)r * r % mod * a % mod;
  return (long long)r * r % mod;
}
void precal() {
  fac[0] = invf[0] = 1;
  for (int i = 1; i < maxn; ++i) {
    inv[i] = Pow(i, mod - 2);
    assert((long long)i * inv[i] % mod == 1);
    fac[i] = (long long)fac[i - 1] * i % mod;
    invf[i] = (long long)invf[i - 1] * inv[i] % mod;
    assert(fac[i] * 1ll * invf[i] % mod == 1);
  }
}
int way(pair<int, int> x, pair<int, int> y) {
  if (x.first == y.first || x.second == y.second) return 1;
  if (x.second > y.second || x.first > y.first) return 0;
  return (long long)fac[y.first + y.second - x.first - x.second] *
         invf[y.first - x.first] % mod * invf[y.second - x.second] % mod;
}
vector<int> v;
int n, m, s, k, sz;
int dp[maxn][logn];
vector<pair<int, int> > a;
int cnt = 0;
void add(int& x, int y) {
  x += y;
  if (x < 0) x += mod;
  if (x >= mod) x -= mod;
}
void solve() {
  a.push_back(make_pair(n, m));
  k = a.size();
  for (int i = 0; i < k; ++i) {
    dp[i][0] = way(make_pair(1, 1), a[i]);
    for (int j = 0; j < i; ++j)
      dp[i][0] = (dp[i][0] - (long long)dp[j][0] * way(a[j], a[i]) +
                  (long long)mod * mod) %
                 mod;
  }
  for (int t = 1; t <= 21; ++t) {
    for (int i = 0; i < k; ++i) {
      dp[i][t] = way(make_pair(1, 1), a[i]);
      for (int tt = 0; tt < t; ++tt) add(dp[i][t], -dp[i][tt]);
      for (int j = 0; j < i; ++j)
        add(dp[i][t], (long long)-dp[j][t] * way(a[j], a[i]) % mod);
    }
  }
  int allpath = way(make_pair(1, 1), make_pair(n, m));
  int res = 0;
  for (int j = 0; j <= 21; ++j) {
    add(res, (long long)dp[k - 1][j] * v[j + cnt] % mod);
    add(allpath, -dp[k - 1][j]);
  }
  add(res, (long long)allpath);
  cout << (long long)res * Pow(way(make_pair(1, 1), make_pair(n, m)), mod - 2) %
              mod;
}
int main() {
  ios_base::sync_with_stdio(0);
  cin.tie(0);
  if (fopen("TEST"
            ".INP",
            "r"))
    freopen(
        "TEST"
        ".INP",
        "r", stdin),
        freopen(
            "TEST"
            ".OUT",
            "w", stdout);
  cin >> n >> m >> k >> s;
  for (int i = s; i > 1; i = i / 2 + i % 2) v.push_back(i);
  v.resize(30, 1);
  for (int i = 1; i <= k; ++i) {
    pair<int, int> tmp;
    cin >> tmp.first >> tmp.second;
    if (tmp.first == 1 && tmp.second == 1)
      ++cnt;
    else if (tmp.first == n && tmp.second == m)
      ++cnt;
    else
      a.push_back(tmp);
  }
  sort(a.begin(), a.end());
  precal();
  solve();
}
