#include <bits/stdc++.h>
#define el '\n'
#define fi first
#define sec second
#define pb push_back
#define ll long long
#define sz(v) (int)(v).size()
#define all(v) (v).begin(),(v).end()
#define FOR(i, a, b) for(int i = (a), _b = b; i <= _b; i++)
#define REP(i, a, b) for(int i = (a), _b = b; i >= _b; i--)
using namespace std;
const int MAX_N = 1e7;
const int MOD = 1e9 + 7;
int fact[2 * MAX_N + 5], invfact[2 * MAX_N + 5];
int n, m;
void Input(){
cin >> n >> m;
}
ll bin_pow(ll a, int b){
ll res = 1;
while(b){
if(b & 1) res = (res * a) % MOD;
a = (a * a) % MOD;
b /= 2;
}
return res;
}
ll C(int k, int n){
return 1LL * fact[n] * invfact[k] % MOD * invfact[n - k] % MOD;
}
void Solve(){
fact[0] = 1;
FOR(i, 1, n + m) fact[i] = (1LL * fact[i - 1] * i) % MOD;
invfact[n + m] = bin_pow(fact[n + m], MOD - 2);
REP(i, n + m - 1, 0) invfact[i] = (1LL * invfact[i + 1] * (i + 1)) % MOD;
ll ans = 0;
FOR(k, 0, min(n, m)){
ans = (ans + (1LL * C(n - k, n + m - k) * C(m - k, m)) % MOD) % MOD;
}
cout << ans;
}
int main(){
ios_base::sync_with_stdio(0);
cin.tie(0);
Input();
Solve();
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CgojZGVmaW5lIGVsICdcbicKI2RlZmluZSBmaSBmaXJzdAojZGVmaW5lIHNlYyBzZWNvbmQKI2RlZmluZSBwYiBwdXNoX2JhY2sKI2RlZmluZSBsbCBsb25nIGxvbmcKI2RlZmluZSBzeih2KSAoaW50KSh2KS5zaXplKCkKI2RlZmluZSBhbGwodikgKHYpLmJlZ2luKCksKHYpLmVuZCgpCiNkZWZpbmUgRk9SKGksIGEsIGIpIGZvcihpbnQgaSA9IChhKSwgX2IgPSBiOyBpIDw9IF9iOyBpKyspCiNkZWZpbmUgUkVQKGksIGEsIGIpIGZvcihpbnQgaSA9IChhKSwgX2IgPSBiOyBpID49IF9iOyBpLS0pCgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKY29uc3QgaW50IE1BWF9OID0gMWU3Owpjb25zdCBpbnQgTU9EID0gMWU5ICsgNzsKCmludCBmYWN0WzIgKiBNQVhfTiArIDVdLCBpbnZmYWN0WzIgKiBNQVhfTiArIDVdOwppbnQgbiwgbTsKCnZvaWQgSW5wdXQoKXsKICAgIGNpbiA+PiBuID4+IG07Cn0KCmxsIGJpbl9wb3cobGwgYSwgaW50IGIpewogICAgbGwgcmVzID0gMTsKICAgIHdoaWxlKGIpewogICAgICAgIGlmKGIgJiAxKSByZXMgPSAocmVzICogYSkgJSBNT0Q7CiAgICAgICAgYSA9IChhICogYSkgJSBNT0Q7CiAgICAgICAgYiAvPSAyOwogICAgfQogICAgcmV0dXJuIHJlczsKfQoKbGwgQyhpbnQgaywgaW50IG4pewogICAgcmV0dXJuIDFMTCAqIGZhY3Rbbl0gKiBpbnZmYWN0W2tdICUgTU9EICogaW52ZmFjdFtuIC0ga10gJSBNT0Q7Cn0KCnZvaWQgU29sdmUoKXsKCiAgICBmYWN0WzBdID0gMTsKICAgIEZPUihpLCAxLCBuICsgbSkgZmFjdFtpXSA9ICgxTEwgKiBmYWN0W2kgLSAxXSAqIGkpICUgTU9EOwoKCiAgICBpbnZmYWN0W24gKyBtXSA9IGJpbl9wb3coZmFjdFtuICsgbV0sIE1PRCAtIDIpOwogICAgUkVQKGksIG4gKyBtIC0gMSwgMCkgaW52ZmFjdFtpXSA9ICgxTEwgKiBpbnZmYWN0W2kgKyAxXSAqIChpICsgMSkpICUgTU9EOwoKICAgIGxsIGFucyA9IDA7CiAgICBGT1IoaywgMCwgbWluKG4sIG0pKXsKICAgICAgICBhbnMgPSAoYW5zICsgKDFMTCAqIEMobiAtIGssIG4gKyBtIC0gaykgKiBDKG0gLSBrLCBtKSkgJSBNT0QpICUgTU9EOwogICAgfQoKICAgIGNvdXQgPDwgYW5zOwp9CgppbnQgbWFpbigpewogICAgaW9zX2Jhc2U6OnN5bmNfd2l0aF9zdGRpbygwKTsKICAgIGNpbi50aWUoMCk7CgogICAgSW5wdXQoKTsKICAgIFNvbHZlKCk7Cn0K