#include <bits/stdc++.h>
using namespace std;
template <class T>
using vv = vector<vector<T>>;
template <class T>
ostream &operator<<(ostream &os, const vector<T> &t) {
  os << "{";
  for (int(i) = 0; (i) < (t.size()); ++(i)) {
    os << t[i] << ",";
  }
  os << "}" << endl;
  return os;
}
template <class S, class T>
ostream &operator<<(ostream &os, const pair<S, T> &t) {
  return os << "(" << t.first << "," << t.second << ")";
}
template <class T>
inline bool MX(T &l, const T &r) {
  return l < r ? l = r, 1 : 0;
}
template <class T>
inline bool MN(T &l, const T &r) {
  return l > r ? l = r, 1 : 0;
}
const long long MOD = 1e9 + 7;
long long modpow(long long r, long long n, long long m = MOD) {
  long long re = 1, d = r % m;
  if (n < 0) (n %= MOD - 1) += MOD - 1;
  for (; n; n /= 2) {
    if (n & 1) (re *= d) %= m;
    (d *= d) %= m;
  }
  return re;
}
vector<long long> fact, finv, inv;
long long comb(long long n, long long r) {
  if (n < r || r < 0) return 0;
  return fact[n] * finv[n - r] % MOD * finv[r] % MOD;
}
class Doralion {
  void Modinvs(vector<long long> &re, int n) {
    re.resize(n + 1);
    re[1] = 1;
    for (int i = 2; i <= n; ++i) re[i] = re[MOD % i] * (MOD - MOD / i) % MOD;
  }
  void Facts(vector<long long> &re, int n) {
    re.resize(n + 1);
    re[0] = 1;
    for (int(i) = 0; (i) < (n); ++(i)) re[i + 1] = re[i] * (i + 1) % MOD;
  }
  void Factinvs(vector<long long> &re, const vector<long long> &inv, int n) {
    re.resize(n + 1);
    re[0] = 1;
    for (int(i) = 0; (i) < (n); ++(i)) re[i + 1] = re[i] * inv[i + 1] % MOD;
  }

 public:
  Doralion(int n) {
    Modinvs(inv, n);
    Facts(fact, n);
    Factinvs(finv, inv, n);
  }
} doralion(212345);
long long dp[22][2222];
int main() {
  ios_base::sync_with_stdio(false);
  cout << fixed << setprecision(0);
  int n, m, t, s;
  cin >> n >> m >> t >> s;
  vector<pair<int, int>> ps(t);
  for (int(i) = 0; (i) < (t); ++(i)) {
    int x, y;
    cin >> y >> x;
    --y;
    --x;
    ps[i] = pair<int, int>(x, y);
  }
  sort((ps).begin(), (ps).end(), [](pair<int, int> a, pair<int, int> b) {
    return pair<int, int>(a.first + a.second, a.first) <
           pair<int, int>(b.first + b.second, b.first);
  });
  if (ps.size() && ps[0] == pair<int, int>()) s = (s + 1) / 2;
  if (ps.size() && ps.back() == pair<int, int>(m - 1, n - 1)) s = (s + 1) / 2;
  ps.emplace_back(0, 0);
  ps.emplace_back(m - 1, n - 1);
  sort((ps).begin(), (ps).end(), [](pair<int, int> a, pair<int, int> b) {
    return pair<int, int>(a.first + a.second, a.first) <
           pair<int, int>(b.first + b.second, b.first);
  });
  (ps).erase(unique((ps).begin(), (ps).end()), (ps).end());
  t = ps.size();
  dp[0][0] = 1;
  for (int(i) = 0; (i) < (20); ++(i))
    for (int(j) = 1; (j) < (t); ++(j)) {
      int x, y;
      tie(x, y) = ps[j];
      dp[i][j] = comb(x + y, x);
      for (int(k) = 1; (k) < (j); ++(k))
        if (ps[k].first <= x && ps[k].second <= y)
          (dp[i][j] +=
           MOD - dp[i][k] *
                     comb(x - ps[k].first + y - ps[k].second, x - ps[k].first) %
                     MOD) %= MOD;
      for (int(k) = 0; (k) < (i); ++(k)) (dp[i][j] += MOD - dp[k][j]) %= MOD;
    }
  long long re = 0, rem = comb(n - 1 + m - 1, n - 1);
  for (int(i) = 0; (i) < (20); ++(i)) {
    (rem += MOD - dp[i][t - 1]) %= MOD;
    (re += dp[i][t - 1] * s % MOD) %= MOD;
    s = (s + 1) / 2;
  }
  (re += rem * s % MOD) %= MOD;
  long long q = comb(n - 1 + m - 1, n - 1);
  cout << re * modpow(q, -1) % MOD << endl;
  return 0;
}
