using System;
using System.Linq;
using System.Collections.Generic;
using static System.Console;
using System.Text;
using System.IO;
using static System.Math;
namespace AtCoder
{
    class Program
    {
        static public long[] Sarray() { return ReadLine().Split().Select(long.Parse).ToArray(); }
        static public List<long> Slist() { return ReadLine().Split().Select(long.Parse).ToList(); }

        static readonly long Mod = 1000000000 + 7;

        static void Main(string[] args)
        {
            var HWN = Sarray();
            var H = HWN[0];
            var W = HWN[1];
            var N = HWN[2];
            var wall = new List<Tuple<long, long>>();
            for (var i = 0; i < N; ++i)
            {
                var rc = Sarray();
                wall.Add(Tuple.Create(rc[0], rc[1]));
            }
            wall = wall.OrderBy(h => h.Item1).ThenBy(w => w.Item2).ToList();
            //壁を通る場合の数を数え上げる
            var dp = new long[N, 2];//0:奇数個(+)、1:偶数個(-)
            var cmb = new Combination(H + W, Mod);
            for (var i = (int)N - 1; 0 <= i; --i)
            {
                var right = cmb.com(H - wall[i].Item1 + W - wall[i].Item2, H - wall[i].Item1);
                dp[i, 0] = right;
                for (var j = (int)N - 1; i < j; --j)
                {
                    if (wall[i].Item2 <= wall[j].Item2) //右下にある壁を通る
                    {
                        var wleft = cmb.com(wall[j].Item1 - wall[i].Item1 + wall[j].Item2 - wall[i].Item2, wall[j].Item1 - wall[i].Item1);
                        dp[i, 0] = (dp[i, 0] + dp[j, 1] * wleft % Mod) % Mod;
                        dp[i, 1] = (dp[i, 1] + dp[j, 0] * wleft % Mod) % Mod;
                    }
                }
            }
            for (var i = 0; i < N; ++i)
            {
                var left = cmb.com(wall[i].Item1 - 1 + wall[i].Item2 - 1, wall[i].Item1 - 1);
                dp[i, 0] = dp[i, 0] * left % Mod;
                dp[i, 1] = dp[i, 1] * left % Mod;
            }
            long wpath = 0;
            for (var i = 0; i < N; ++i)
                wpath = (wpath + dp[i, 0] - dp[i, 1] + Mod) % Mod;
            var ans = (cmb.com(H - 1 + W - 1, H - 1) - wpath + Mod) % Mod;
            WriteLine(ans);
        }
        public class Combination
        {
            readonly long mod;
            readonly long[] fac, finv, inv;
            public Combination(long n, long mod = 1000000007)
            {
                long max = n + 1;
                this.mod = mod;
                fac = new long[max];
                finv = new long[max];
                inv = new long[max];
                fac[0] = fac[1] = 1;
                finv[0] = finv[1] = 1;
                inv[1] = 1;
                for (int i = 2; i < max; ++i)
                {
                    fac[i] = fac[i - 1] * i % mod;
                    inv[i] = mod - inv[mod % i] * (mod / i) % mod;
                    finv[i] = finv[i - 1] * inv[i] % mod;
                }
            }
            public long com(long n, long k)
            {
                if (n < k) return 0;
                if (n < 0 | k < 0) return 0;
                return fac[n] * (finv[k] * finv[n - k] % mod) % mod;
            }
        }

    }
}

Measured memory_bytes: 18400