#include <bits/stdc++.h>
using namespace std;
int g() {
  char ch;
  bool f = 0;
  while (!((ch = getchar() - 48) >= 0))
    if (ch == -3) f = 1;
  int v = ch;
  while (((ch = getchar() - 48) >= 0)) v = v * 10 + ch;
  return f ? -v : v;
}
const int mod = 1e9 + 7;
const int Maxn = 2005;
const int Maxm = 200005;
int n, m, k, S;
long long F[Maxn][30], fac[Maxm], inv[Maxm];
long long Pow(long long x, long long t) {
  long long res = 1;
  for (; t; t >>= 1, x = x * x % mod)
    if (t & 1) res = res * x % mod;
  return res;
}
struct Point {
  int x, y;
  void init() {
    x = g();
    y = g();
  }
  bool operator<(const Point &t1) const {
    return x < t1.x || (x == t1.x && y < t1.y);
  }
} p[Maxn];
void Pre() {
  fac[0] = 1;
  for (int i = 1; i <= 200000; i++) fac[i] = fac[i - 1] * i % mod;
  inv[200000] = Pow(fac[200000], mod - 2);
  for (int i = 199999; i >= 0; i--) inv[i] = inv[i + 1] * (i + 1) % mod;
}
void Dec(long long &a, long long b) {
  a -= b;
  if (a < 0) a += mod;
}
void Add(long long &a, long long b) {
  a += b;
  if (a >= mod) a -= mod;
}
long long C(int a, int b) {
  if (a < 0 || b < 0 || a < b) return 0;
  return fac[a] * inv[b] % mod * inv[a - b] % mod;
}
int main() {
  n = g();
  m = g();
  k = g();
  S = g();
  Pre();
  for (int i = 1; i <= k; i++) p[i].init();
  p[++k].x = n;
  p[k].y = m;
  sort(p + 1, p + k + 1);
  for (int i = 1; i <= k; i++) F[i][0] = C(p[i].x + p[i].y - 2, p[i].x - 1);
  for (int i = 1; i < k; i++) {
    for (int j = i + 1; j <= k; j++)
      if (p[j].y >= p[i].y) {
        long long tp = C(p[j].y - p[i].y + p[j].x - p[i].x, p[j].x - p[i].x);
        for (int k = 0; k <= 19; k++) {
          long long cur = tp * F[i][k] % mod;
          Dec(F[j][k], cur);
          Add(F[j][k + 1], cur);
        }
      }
  }
  long long res = 0;
  for (int i = 0; i <= 20; i++) {
    Add(res, F[k][i] * S % mod);
    if (S & 1)
      S = (S + 1) >> 1;
    else
      S >>= 1;
  }
  res = res * Pow(C(n + m - 2, n - 1), mod - 2) % mod;
  printf("%d\n", res);
  return 0;
}
