#include <bits/stdc++.h>
using namespace std;
const int MAXN = 200010, mod = 1000000007;
int faktorijel[MAXN];
inline int add(int a, int b) {
  int ret = a + b;
  if (ret >= mod) ret %= mod;
  return ret;
}
inline int sub(int a, int b) {
  int ret = a - b;
  if (ret < 0) {
    ret %= mod;
    ret += mod;
  }
  return ret;
}
inline int mul(int a, int b) {
  long long int ret = (long long int)a * b;
  if (ret >= mod) ret %= mod;
  return ret;
}
inline int pot(int a, int x) {
  int ret = 1;
  while (x) {
    if (x & 1) ret = mul(ret, a);
    a = mul(a, a);
    x /= 2;
  }
  return ret;
}
inline int dijeli(int a, int b) { return mul(a, pot(b, mod - 2)); }
inline int povrh(int n, int k) {
  return dijeli(faktorijel[n], mul(faktorijel[k], faktorijel[n - k]));
}
void postavi() {
  faktorijel[0] = 1;
  for (int i = 1; i < MAXN; i++) faktorijel[i] = mul(faktorijel[i - 1], i);
}
int h, w, n;
int dp[MAXN];
vector<pair<int, int> > niz;
int f(int x, int y) {
  int desno = niz[y].first - niz[x].first;
  int dolje = niz[y].second - niz[x].second;
  return povrh(desno + dolje, desno);
}
int main() {
  postavi();
  scanf("%d %d %d", &h, &w, &n);
  for (int i = 0; i < n; i++) {
    pair<int, int> p;
    scanf("%d %d", &p.first, &p.second);
    niz.push_back(p);
  }
  niz.push_back(make_pair(h, w));
  sort(niz.begin(), niz.end());
  niz.push_back(make_pair(1, 1));
  for (int i = 0; i <= n; i++) {
    dp[i] = f(n + 1, i);
    for (int j = 0; j < i; j++)
      if (niz[j].first <= niz[i].first && niz[j].second <= niz[i].second)
        dp[i] = sub(dp[i], mul(dp[j], f(j, i)));
  }
  printf("%d\n", dp[n]);
  return 0;
}
