#include<bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp> 
#include <ext/pb_ds/tree_policy.hpp> 
using namespace __gnu_pbds; 
using namespace std;
#define IOS {ios :: sync_with_stdio(false); cin.tie(0);cout.tie(0); }
#define F first
#define S second
#define pb push_back
typedef long double ld;
#define deci(n) cout << fixed << setprecision(n);
typedef long long ll;

#define mem0(x)  memset(x,0,sizeof(x));
#define mem1(x)  memset(x,1,sizeof(x));
#define memm1(x) memset(x,-1,sizeof(x));
#define all(a) a.begin(), a.end()
#define pll pair<ll, ll>
#define bits(x) __builtin_popcount(x)
#define fori(n)  for (ll i = 0; i < n; i++)
#define fori2(n) for(ll i=1;i<=n;i++)
#define forj(n)  for (ll j = 0; j < n; j++)
#define forj2(n) for(ll j=1;j<=n;j++)
#define fork(n)  for (ll k = 0; k < n; k++)
#define fork2(n) for(ll k=1;k<=n;k++)
#define vll vector <ll>
#define mll map <ll, ll>
#define vpll vector <pll>
const ll md = 1e9 + 7;

#define BSET(a, p) ((a) | (1ll << (p)))
#define BCHK(a, p) ((a) & (1ll << (p)))
#define BXOR(a, p) ((a) ^ (1ll << (p)));
#define BREM(a, p) (BCHK(a, p)?(BXOR(a, p)):(a))
#define BSHO(a, N) (bitset<N>(a))
const ll N = 200005;
ll fac[N] = {1};
#define calfac for(ll i=1  ;i<N;i++) fac[i] = (fac[i-1]*i)%md;
// ll C[N+1][M+1]; 
// void  ncr(){
//     ll n = N,k = M; 
//     for (ll i = 0; i <= n; i++) { 
//         for (ll j = 0; j <= min(i, k); j++) { 
//             if (j == 0 || j == i)  C[i][j] = 1; 
//             else C[i][j] = C[i - 1][j - 1] +  C[i - 1][j]; 
//         } 
//     } 
// } 


#define RBTTYPE int
#define ordered_set tree<RBTTYPE, null_type, less<RBTTYPE>, rb_tree_tag,tree_order_statistics_node_update> 
// Ordered set docs:
// order_of_key (k) : Number of items strictly smaller than k .
// find_by_order(k) : K-th element in a set (counting from zero).
ll modexp(ll x, ll ex) {
    ll ans = 1ll;
    while (ex > 0) {
        if (ex & 1ll) ans = (ans * x) % md;
        ex >>= 1ll;
        x = (x * x) % md;
    }
    return ans;
}
ll po(ll x,ll n){
    if(n==0) return 1;
    if(n%2==1) return (x*po(x,n-1))%md;
    else {
        ll k=po(x,n/2);
        return (k*k)%md;
    }
}
ll modInv(ll a)
{
    return po(a,md-2);
}
 
// ll nCr(ll n,ll r)
// {
//     if(r==0) return 1;
//     // cout << fac[n] <<" "<< fac[r] <<" "<<fac[n-r]<<" "<<modInv((fac[r]*fac[n-r])%md)<<"\n";
//     ll tmp  = ( ((fac[n] * modInv(fac[r]))%md) *modInv(fac[n-r]) )%md;
//     return tmp;
// }

ll nCr(ll n,ll r)
{
    return (fac[n]*modInv((fac[r]*fac[n-r])%md))%md;
}

 

vpll e;
ll dp[3005];

int32_t main(){
    IOS;
    calfac;
    ll i,j,k,n,m,h,w,x,y;
    cin >> h >> w >> n;
    fori(n){
        cin >> x >> y;
        x--;y--;
        e.pb({x,y});
    }
    sort(all(e) , [&] (const pll a, const pll b){
        return a.F + a.S < b.F + b.S;
    });
    e.pb({h-1,w-1});
    // for(auto p : e) cout << p.F <<" "<<p.S <<"\n";
    // dp[i] number of paths to e[i] such that it
    // it is the first forbidden vertex in the path
    // cout << nCr(5,1)<<"\n";
    // cout << nCr(100000)<<"\n";;
    for(i =0 ; i <= n ; i++){
        x = e[i].F;
        y = e[i].S;
        ll tmp = nCr(x + y,y);
        // cout <<x<<" "<<y<<" "<<" "<< tmp <<"\n";
        for(j = 0;j < i ;j++){
            if(e[j].F <= x && e[j].S <= y){
                ll v1 = dp[j];
                ll dy = y - e[j].S;   
                ll dx = x - e[j].F;
                ll v2 = nCr(dx + dy,dx);
                tmp = ( (tmp -  (v1 * v2) % md) + md)%md;
                // tmp %= md;
            }
        }
        dp[i] = tmp;
    }
    // fori(n+1) cout << dp[i] <<" ";
    // cout <<"\n";
    cout << dp[n] <<"\n";

} 

Measured memory_bytes: 1920