#include <bits/stdc++.h>
using namespace std;
const int inf = 0x3f3f3f3f;
const int N = 1e5 + 10;
const double eps = 1e-8;
const int MOD = 1e9 + 7;
void fre() { freopen("in.txt", "r", stdin); }
void freout() { freopen("out.txt", "w", stdout); }
inline int read() {
  int x = 0, f = 1;
  char ch = getchar();
  while (ch > '9' || ch < '0') {
    if (ch == '-') f = -1;
    ch = getchar();
  }
  while (ch >= '0' && ch <= '9') {
    x = x * 10 + ch - '0';
    ch = getchar();
  }
  return x * f;
}
long long p1[2 * N], q[2 * N];
long long mul(long long x, long long y) {
  long long ret = 1;
  while (y) {
    if (y % 2 == 1) ret = ret * x % MOD;
    x = x * x % MOD;
    y /= 2;
  }
  return ret;
}
long long C(long long x, long long y) {
  if (x == y) return 1;
  if (y == 0) return 1;
  if (x == 0) return 0;
  return p1[x] * q[y] % MOD * q[x - y] % MOD;
}
long long way(long long x1, long long y1, long long x2, long long y2) {
  if (x2 < x1 || y2 < y1) return 0;
  return C(x2 - x1 + y2 - y1, x2 - x1);
}
void init() {
  p1[0] = q[0] = 1;
  for (int i = 1; i <= 200000; i++) p1[i] = p1[i - 1] * i % MOD;
  q[200000] = mul(p1[200000], MOD - 2);
  for (int i = 199999; i >= 1; i--) q[i] = q[i + 1] * (i + 1) % MOD;
}
struct Point {
  int x, y;
  Point() {}
  Point(int _x, int _y) : x(_x), y(_y) {}
  bool operator<(const Point &rhs) const {
    if (x == rhs.x) return y < rhs.y;
    return x < rhs.x;
  }
} p[N];
long long dp[N][25 * 2];
int main() {
  init();
  int n, m, k, s;
  scanf("%d%d%d%d", &n, &m, &k, &s);
  for (int i = 1; i <= k; i++) {
    scanf("%d%d", &p[i].x, &p[i].y);
  }
  sort(p + 1, p + 1 + k);
  p[0].x = 1, p[0].y = 1;
  for (int i = k; i >= 0; i--) {
    for (int j = 0; j <= 20; j++) {
      dp[i][j] = way(p[i].x, p[i].y, n, m);
      for (int r = i + 1; r <= k; r++) {
        dp[i][j] =
            ((dp[i][j] - dp[r][j] * way(p[i].x, p[i].y, p[r].x, p[r].y)) % MOD +
             MOD) %
            MOD;
      }
      for (int r = 0; r <= j - 1; r++)
        dp[i][j] = ((dp[i][j] - dp[i][r]) + MOD) % MOD;
    }
  }
  long long ans1 = 0, ans2 = 0, num = 0;
  int cnt = 0;
  while (s != 1) {
    ans1 = (ans1 + s * dp[0][cnt]) % MOD;
    num = (num + dp[0][cnt]) % MOD;
    s = s / 2 + s % 2;
    cnt++;
  }
  ans2 = way(1, 1, n, m);
  num = (ans2 - num + MOD) % MOD;
  ans1 = (ans1 + num) % MOD;
  ans2 = mul(ans2, MOD - 2);
  long long ans = ans1 * ans2 % MOD;
  printf("%I64d\n", ans);
  return 0;
}
