#include <bits/stdc++.h>
#define MOD 1000000007
using namespace std;
typedef struct point
{
        long long x,y;
        bool operator < (const struct point & t)const
        {
                return x==t.x?y<t.y:x<t.x;
        }
}POINT,*PPOINT;
POINT arr[200002];
long long h,w;
long long fac[200002],inv[200002],f[200002];
void init()
{
        int i;
        fac[0]=fac[1]=inv[0]=inv[1]=1;
        for(i=2;i<=h+w-2;i++)
                inv[i]=-MOD/i*inv[MOD%i]%MOD;
        for(i=2;i<=h+w-2;i++)
        {
                fac[i]=fac[i-1]*i%MOD;
                inv[i]=inv[i-1]*inv[i]%MOD;
        }
}
long long comb(long long n,long long m)
{
        return fac[n]*inv[n-m]%MOD*inv[m]%MOD;
}
int main()
{
        long long i,j,n;
        scanf("%lld %lld %lld",&h,&w,&n);
        for(i=0;i<n;i++)
        {
                scanf("%lld %lld",&arr[i].x,&arr[i].y);
        }
        arr[n].x=h;
        arr[n].y=w;
        sort(arr,arr+n+1);
        init();
        for(i=0;i<=n;i++)
        {
                f[i]=comb(arr[i].x+arr[i].y-2,arr[i].x-1);
                for(j=0;j<i;j++)
                {
                        if(arr[j].y<=arr[i].y)
                        f[i]=f[i]-f[j]*comb(arr[i].x-arr[j].x+arr[i].y-arr[j].y,arr[i].x-arr[j].x)%MOD;
                }
                f[i]=(f[i]+MOD)%MOD;
        }
        printf("%lld\n",(f[n]+MOD)%MOD);
}
