#include <bits/stdc++.h>
using namespace std;
const int MOD = 1e9 + 7;
const int SIZE = 1e6 + 10;
long long fac[SIZE], inv[SIZE];
long long mypow(long long first, long long second) {
  long long res = 1;
  while (second) {
    if (second & 1) res = res * first % MOD;
    second >>= 1;
    first = first * first % MOD;
  }
  return res;
}
long long C(int first, int second) {
  if (second < 0 || second > first) return 0;
  return fac[first] * inv[second] % MOD * inv[first - second] % MOD;
}
void build() {
  assert(MOD >= SIZE);
  fac[0] = 1;
  for (int i = (1); i < (SIZE); ++i) fac[i] = fac[i - 1] * i % MOD;
  inv[SIZE - 1] = mypow(fac[SIZE - 1], MOD - 2);
  for (int i = SIZE - 2; i >= 0; i--) inv[i] = inv[i + 1] * (i + 1) % MOD;
}
long long dp[2016][21];
pair<int, int> p[2016];
void ADD(long long& first, long long v) {
  first = (first + v) % MOD;
  if (first < 0) first += MOD;
}
int main() {
  build();
  int n, m;
  scanf("%d%d", &n, &m);
  int K, S;
  scanf("%d%d", &K, &S);
  for (int i = (1); i < (K + 1); ++i)
    scanf("%d%d", &(p[i].first), &(p[i].second));
  sort(p + 1, p + K + 1);
  K++;
  p[K] = make_pair(n, m);
  p[0] = make_pair(1, 1);
  dp[0][0] = 1;
  for (int i = (1); i < (K + 1); ++i) {
    for (int j = 0; j < (21); ++j) {
      ADD(dp[i][j], C(p[i].first + p[i].second - 2, p[i].first - 1));
      for (int k = 0; k < (i); ++k)
        ADD(dp[i][j],
            -dp[k][j] * C(p[i].first + p[i].second - p[k].first - p[k].second,
                          p[i].first - p[k].first));
    }
    for (int j = 20; j > 0; j--) ADD(dp[i][j], -dp[i][j - 1]);
  }
  long long an = 0, sum = 0;
  for (int i = (1); i < (21); ++i) {
    ADD(an, S * dp[K][i]);
    ADD(sum, dp[K][i]);
    S = (S + 1) / 2;
  }
  ADD(an, C(n + m - 2, n - 1) - sum);
  printf("%I64d\n", an * mypow(C(n + m - 2, n - 1), MOD - 2) % MOD);
  return 0;
}
