#include <bits/stdc++.h>
using namespace std;
const int MOD = 1e9 + 7;
int sum(int a, int b) { return a + b >= MOD ? a + b - MOD : a + b; }
int sub(int a, int b) { return a - b < 0 ? a - b + MOD : a - b; }
int mul(int a, int b) { return (a * 1LL * b) % MOD; }
int pw(int a, int b) {
  if (!b) return 1;
  int r = pw(a, b / 2);
  r = mul(r, r);
  if (b % 2) r = mul(r, a);
  return r;
}
const int MAXN = 2e5 + 7;
int fct[MAXN], ifct[MAXN];
int nCr(int n, int r) {
  if (n < r || r < 0) return 0;
  return mul(fct[n], mul(ifct[r], ifct[n - r]));
}
int ways(int x1, int y1, int x2, int y2) {
  if (x1 <= x2 && y1 <= y2) {
    int R = x2 - x1;
    int U = y2 - y1;
    return nCr(R + U, R);
  } else {
    return 0;
  }
}
int ways(pair<int, int> p, pair<int, int> q) {
  return ways(p.first, p.second, q.first, q.second);
}
ostream &operator<<(ostream &out, const pair<int, int> &p) {
  return out << "(" << p.first << "," << p.second << ")";
}
const int MAXK = 2007, LOG = 23;
pair<int, int> anomaly[MAXK];
int charge[LOG];
int dp[LOG][MAXK];
int main() {
  fct[0] = 1;
  for (int i = 1; i < MAXN; i++) fct[i] = mul(i, fct[i - 1]);
  ifct[MAXN - 1] = pw(fct[MAXN - 1], MOD - 2);
  for (int i = MAXN - 2; i >= 0; i--) ifct[i] = mul(i + 1, ifct[i + 1]);
  int n, m, k, s;
  cin >> n >> m >> k >> s;
  charge[0] = s;
  for (int k = 1; k < LOG; k++) {
    charge[k] = (charge[k - 1] + 1) / 2;
  }
  int start = 0, finish = 0;
  for (int i = 0; i < k; i++) {
    cin >> anomaly[i].first >> anomaly[i].second;
    if (anomaly[i].first == 1 && anomaly[i].second == 1) {
      start = 1;
    }
    if (anomaly[i].first == n && anomaly[i].second == m) {
      finish = 1;
    }
  }
  if (start == 0) {
    anomaly[k].first = 1;
    anomaly[k].second = 1;
    k++;
  }
  if (finish == 0) {
    anomaly[k].first = n;
    anomaly[k].second = m;
    k++;
  }
  vector<int> id(k);
  for (int i = 0; i < k; i++) id[i] = i;
  sort(id.begin(), id.end(),
       [&](int i, int j) { return anomaly[i] < anomaly[j]; });
  for (int _i = 0; _i < id.size(); _i++) {
    int i = id[_i];
    for (int z = 1; z < LOG; z++) {
      dp[z][i] = ways(1, 1, anomaly[i].first, anomaly[i].second);
      for (int _j = 0; _j < _i; _j++) {
        int j = id[_j];
        dp[z][i] = sub(dp[z][i], mul(dp[z][j], ways(anomaly[j], anomaly[i])));
      }
    }
    for (int z = LOG - 1; z > 0; z--) {
      dp[z][i] = sub(dp[z][i], dp[z - 1][i]);
    }
  }
  vector<int> vc;
  int offset = (1 - finish) + (1 - start);
  int run = 0;
  for (int k = 0; charge[k] > 1; k++) {
    vc.push_back(dp[k + offset][id.back()]);
    run = sum(run, vc.back());
  }
  int total = ways(1, 1, n, m);
  vc.push_back(sub(total, run));
  int ans = 0;
  for (int i = 0; i < vc.size(); i++) {
    ans = sum(ans, mul(charge[i], vc[i]));
  }
  ans = mul(ans, pw(total, MOD - 2));
  cout << ans << endl;
  return 0;
}
