#include <bits/stdc++.h>
using namespace std;
const int maxn = (4e3) + 20, N = 3e5 + 10, mod = 1e9 + 7;
int n, m, k, s;
long long int res[maxn][maxn], fuc[N], gguu[25], ww[maxn], P, Q, ifuc[N];
vector<pair<int, int> > v;
inline long long int pw(long long int a, int b) {
  long long int ans = 1;
  while (b) {
    if (b & 1) ans = (ans * a) % mod;
    b = b >> 1;
    a = (a * a) % mod;
  }
  return ans % mod;
}
inline long long int get_C(int a, int b) {
  if (a == 0) return 1;
  long long int res = (ifuc[a] * ifuc[b - a]) % mod;
  return (long long int)(fuc[b] * res) % mod;
}
int32_t main() {
  ios::sync_with_stdio(false);
  cin.tie(0);
  cout.tie(0);
  scanf("%d%d%d%d", &n, &m, &k, &s);
  bool fi = 0, si = 0;
  for (int i = 1; i <= k; i++) {
    int x, y;
    scanf("%d%d", &x, &y);
    if (x == 1 and y == 1) {
      fi = 1;
      continue;
    }
    if (x == n and y == m) si = 1;
    v.push_back(make_pair(x, y));
  }
  fuc[0] = 1;
  for (int i = 1; i <= n + m + 10; i++) fuc[i] = (fuc[i - 1] * i) % mod;
  ifuc[0] = 1;
  for (int i = 1; i <= n + m + 10; i++) ifuc[i] = (pw(fuc[i], mod - 2)) % mod;
  sort(v.begin(), v.end());
  if (!si) v.push_back(make_pair(n, m));
  for (int i = 0; i < (int)v.size(); i++) {
    pair<int, int> a = v[i];
    ww[i] = res[0][i] = get_C(a.first - 1, a.first + a.second - 2);
    for (int j = 0; j < i; j++) {
      pair<int, int> b = v[j];
      if (a.first < b.first or a.second < b.second) continue;
      long long int num =
          get_C(a.first - b.first, a.first - b.first + a.second - b.second);
      res[0][i] = (res[0][i] - (res[0][j] * num) % mod + 2 * mod) % mod;
    }
  }
  for (int i = 0; i < (int)v.size(); i++) {
    pair<int, int> a = v[i];
    long long int num = ww[i];
    long long int par = res[0][i];
    for (int k = 1; k <= 19; k++) {
      res[k][i] = (num - par + 2 * mod) % mod;
      for (int j = 0; j < i; j++) {
        pair<int, int> b = v[j];
        if (a.first < b.first or a.second < b.second) continue;
        long long int numm =
            get_C(a.first - b.first, a.first - b.first + a.second - b.second);
        res[k][i] = (res[k][i] - (numm * res[k][j]) % mod + 2 * mod) % mod;
      }
      par = (par + res[k][i]) % mod;
    }
  }
  long long int num = 0;
  gguu[0] = s;
  long long int tt = get_C(n - 1, n + m - 2);
  for (int i = 1; i <= 22; i++) gguu[i] = ceil(((double)(gguu[i - 1]) / 2));
  long long int rr = 0;
  for (int i = 0; i < 20; i++) {
    rr = (rr + res[i][v.size() - 1]) % mod;
    num = (num + (res[i][v.size() - 1] * gguu[i + si + fi]) % mod) % mod;
  }
  tt = (tt - rr + 2 * mod) % mod;
  num = (num + tt) % mod;
  long long int ans = ((num)*pw(get_C(n - 1, n + m - 2), mod - 2) % mod) % mod;
  printf("%lld\n", ans);
}
