#include <bits/stdc++.h>
using namespace std;
inline long long read() {
  long long x = 0;
  char ch = getchar();
  bool positive = 1;
  for (; !isdigit(ch); ch = getchar())
    if (ch == '-') positive = 0;
  for (; isdigit(ch); ch = getchar()) x = x * 10 + ch - '0';
  return positive ? x : -x;
}
inline void write(long long a) {
  if (a < 0) {
    a = -a;
    putchar('-');
  }
  if (a >= 10) write(a / 10);
  putchar('0' + a % 10);
}
int rnd(int mod) {
  unsigned long long ans = 0;
  for (int i = 0; i < 5; i++) ans = ans << 15 ^ rand();
  return ans % (mod - 1) + 1;
}
int n, m, k, t;
const int inf = 0x3f3f3f3f;
const int N = 200000;
const int o = 1000000007;
struct point {
  int x, y;
  inline bool operator<(const point t) const {
    if (x != t.x)
      return x < t.x;
    else
      return y < t.y;
  }
};
point p[3000];
int fac[300000], inv[300000];
int f[3000][30], h[3000][30];
int s;
inline int power(int x, int y) {
  if (!y) return 1;
  int t = power(x, y / 2);
  t = 1LL * t * t % o;
  if (y & 1) {
    t = 1LL * t * x % o;
  }
  return t;
}
inline void pre_c() {
  fac[0] = 1;
  for (int i = 1; i <= N; i++) {
    fac[i] = 1LL * fac[i - 1] * i % o;
  }
  inv[N] = power(fac[N], o - 2);
  for (int i = N - 1; i >= 0; i--) {
    inv[i] = 1LL * inv[i + 1] * (i + 1) % o;
  }
  return;
}
inline int C(int x, int y) {
  return 1LL * inv[y] * inv[x - y] % o * fac[x] % o;
}
int main() {
  scanf("%d%d%d%d", &n, &m, &k, &t);
  for (int i = 1; i <= k; i++) {
    p[i].x = read();
    p[i].y = read();
  }
  sort(p + 1, p + k + 1);
  k++;
  p[k].x = n;
  p[k].y = m;
  pre_c();
  for (int i = 1; i <= k; i++) {
    for (int j = 0; j <= 25; j++) {
      f[i][j] = C(p[i].x - 1 + p[i].y - 1, p[i].x - 1);
      if (j < 25) {
        for (int l = 1; l < i; l++) {
          if ((p[l].x <= p[i].x) && (p[l].y <= p[i].y)) {
            f[i][j] =
                (f[i][j] -
                 1LL * C(p[i].x - p[l].x + p[i].y - p[l].y, p[i].x - p[l].x) *
                     f[l][j] % o +
                 o) %
                o;
          }
        }
      }
      for (int l = 0; l < j; l++) {
        f[i][j] = (f[i][j] - f[i][l] + o) % o;
      }
    }
  }
  for (int j = 0; j <= 25; j++) {
    s = (s + 1LL * f[k][j] * t) % o;
    t = t - t / 2;
  }
  s = 1LL * s * inv[n + m - 2] % o * fac[n - 1] % o * fac[m - 1] % o;
  printf("%d", s);
  return 0;
}
