#include <bits/stdc++.h>
using namespace std;
const int iinf = 1e9 + 7;
const long long linf = 1ll << 60;
const double dinf = 1e10;
inline long long read() {
  bool f = 0;
  long long x = 0;
  char c = getchar();
  while ((c < '0' || c > '9') && c != '-') c = getchar();
  if (c == '-') {
    f = 1;
    c = getchar();
  }
  while (c >= '0' && c <= '9') {
    x = x * 10 + c - '0';
    c = getchar();
  }
  if (f) x = -x;
  return x;
}
inline void scf(int &x) {
  bool f = 0;
  x = 0;
  char c = getchar();
  while ((c < '0' || c > '9') && c != '-') c = getchar();
  if (c == '-') {
    f = 1;
    c = getchar();
  }
  while (c >= '0' && c <= '9') {
    x = x * 10 + c - '0';
    c = getchar();
  }
  if (f) x = -x;
  return;
}
void scf(int &x, int &y) {
  scf(x);
  return scf(y);
}
void scf(int &x, int &y, int &z) {
  scf(x);
  scf(y);
  return scf(z);
}
const int N = 2333;
const int M = 2e5 + 100;
const long long MOD = 1e9 + 7;
int r, c, n, k, s;
long long fac[M], inv[M];
bool f_11, f_rc;
pair<int, int> pnt[N];
long long dp[N][30], f[N][N], ans;
long long val[N];
inline long long kiss_me(long long x, long long n) {
  long long ret = 1ll;
  while (n) {
    if (n & 1) ret = ret * x % MOD;
    x = x * x % MOD;
    n >>= 1;
  }
  return ret;
}
inline long long INV(long long x) { return kiss_me(x, MOD - 2); }
inline long long C(int n, int m) {
  return n < m ? 0 : fac[n] * inv[m] % MOD * inv[n - m] % MOD;
}
int main() {
  fac[0] = inv[0] = 1ll;
  for (int i = (1); i <= (M - 1); i++)
    fac[i] = fac[i - 1] * (long long)i % MOD, inv[i] = INV(fac[i]);
  scf(r, c);
  scf(n, s);
  for (int i = 0; i < (n); i++) {
    int x, y;
    scf(x, y);
    pnt[i] = make_pair(x, y);
    if (x == 1 && y == 1) f_11 = 1;
    if (x == r && y == c) f_rc = 1;
  }
  if (!f_rc) pnt[n++] = make_pair(r, c), k++;
  sort(pnt, pnt + n);
  for (int i = 0; i < (n); i++)
    for (int j = 0; j < (i); j++)
      if (pnt[j] < pnt[i])
        f[j][i] = C(pnt[i].first - pnt[j].first + pnt[i].second - pnt[j].second,
                    pnt[i].first - pnt[j].first);
  val[k++] = (long long)s - 1ll;
  while (s > 1) s++, s >>= 1, val[k++] = (long long)s - 1ll;
  for (int i = 0; i < (n); i++)
    for (int j = (1); j <= (k - 1); j++) {
      dp[i][j] = C(pnt[i].first + pnt[i].second - 2, pnt[i].first - 1);
      for (int _ = 0; _ < (i); _++) {
        dp[i][j] -= dp[_][j] * f[_][i] % MOD;
        (dp[i][j] < 0) && (dp[i][j] += MOD);
      }
      for (int _ = (1); _ <= (j - 1); _++) {
        dp[i][j] -= dp[i][_];
        (dp[i][j] < 0) && (dp[i][j] += MOD);
      }
    }
  ans = C(pnt[n - 1].first + pnt[n - 1].second - 2, pnt[n - 1].first - 1);
  for (int i = (1); i <= (k - 1); i++) {
    ans += dp[n - 1][i] * val[i] % MOD;
    (ans >= MOD) && (ans -= MOD);
  }
  ans = ans *
        INV(C(pnt[n - 1].first + pnt[n - 1].second - 2, pnt[n - 1].first - 1)) %
        MOD;
  printf("%I64d\n", ans);
  return 0;
}
