#include <bits/stdc++.h>
using namespace std;
int n, m, k, s;
const int MAXN = 100000;
int fac[2 * MAXN + 100];
int inv[2 * MAXN + 100];
pair<int, int> cell[2010];
int path[2010][2010];
int dp[2010][21];
const long long mod = 1e9 + 7;
void mul(int &a, int &b, int &c) { a = 1LL * b * c % mod; }
int ksm(int base, int p) {
  int res = 1;
  while (p) {
    if (p & 1) {
      mul(res, base, res);
    }
    p >>= 1;
    mul(base, base, base);
  }
  return res;
}
int C(int n, int m) {
  int res = 0;
  mul(res, fac[n], inv[m]);
  mul(res, res, inv[n - m]);
  return res;
}
void add(int &a, int &b) {
  a += b;
  while (a >= mod) {
    a -= mod;
  }
}
int main() {
  scanf("%d%d%d%d", &n, &m, &k, &s);
  fac[0] = 1;
  inv[0] = 1;
  for (int i = 1; i <= 2 * MAXN; ++i) {
    mul(fac[i], fac[i - 1], i);
    inv[i] = ksm(fac[i], mod - 2);
  }
  for (int i = 0; i < k; ++i) {
    scanf("%d%d", &cell[i].first, &cell[i].second);
  }
  sort(cell, cell + k);
  if (cell[0].first == 1 && cell[0].second == 1) {
    s = (s + 1) / 2;
  } else {
    for (int i = k; i; --i) {
      cell[i] = cell[i - 1];
    }
    cell[0] = pair<int, int>(1, 1);
    k++;
  }
  if (n == 1 && m == 1) {
    printf("%d\n", s);
    return 0;
  }
  if (cell[k - 1].first == n && cell[k - 1].second == m) {
    s = (s + 1) / 2;
  } else {
    cell[k++] = pair<int, int>(n, m);
  }
  for (int i = 0; i < k; ++i) {
    for (int j = 0; j < i; ++j) {
      if (cell[j].first <= cell[i].first && cell[j].second <= cell[i].second)
        path[i][j] =
            C(cell[i].first + cell[i].second - cell[j].first - cell[j].second,
              cell[i].first - cell[j].first);
    }
  }
  dp[0][0] = 1;
  for (int i = 1; i < k; ++i) {
    dp[i][0] = path[i][0];
    for (int j = 1; j < i; ++j) {
      int res = 0;
      mul(res, path[i][j], dp[j][0]);
      dp[i][0] = dp[i][0] - res;
      while (dp[i][0] < 0) dp[i][0] += mod;
    }
  }
  for (int T = 1; T <= 20; ++T) {
    for (int i = 1; i < k; ++i) {
      for (int j = 1; j < i; ++j) {
        int res = dp[j][T - 1] - dp[j][T];
        while (res < 0) res += mod;
        mul(res, path[i][j], res);
        dp[i][T] = dp[i][T] + res;
        while (dp[i][T] >= mod) dp[i][T] -= mod;
      }
    }
  }
  int ans = 0, sum = 0;
  for (int i = 0; i <= 20; ++i, s = (s + 1) / 2) {
    int res = 0;
    add(sum, dp[k - 1][i]);
    mul(res, dp[k - 1][i], s);
    add(ans, res);
  }
  int all = C(n + m - 2, n - 1);
  sum = all - sum;
  while (sum < 0) sum += mod;
  add(ans, sum);
  all = ksm(all, mod - 2);
  mul(ans, ans, all);
  cout << ans << endl;
  return 0;
}
