#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
//#include<cctype>
#include<climits>
#include<iostream>
#include<string>
#include<vector>
#include<map>
//#include<list>
#include<queue>
#include<deque>
#include<algorithm>
//#include<numeric>
#include<utility>
#include<complex>
//#include<memory>
#include<functional>
#include<cassert>
#include<set>
#include<stack>

const int dx[] = {1, 0, -1, 0};
const int dy[] = {0, 1, 0, -1};
using namespace std;
typedef long long ll;
typedef vector<int> vi;
typedef vector<ll> vll;
typedef pair<int, int> pii;

const int MAXN = 100010;
const ll MOD = 1e9+7;
ll fact[3*MAXN], rfact[3*MAXN];

// extgcd
ll extgcd(ll a, ll b, ll& x, ll& y) {
    ll d = a;
    if (b != 0) {
        d = extgcd(b, a % b, y, x);
        y -= (a / b) * x;
    } else {
        x = 1; y = 0;
    }
    return d;
}
// mod_inverse
ll mod_inverse(ll a, ll m = MOD) {
    ll x, y;
    extgcd(a, m, x, y);
    return (m+x%m) % m;
}

ll nCr(int n, int r) {
    ll ret = fact[n];
    (ret *= rfact[r]) %= MOD;
    (ret *= rfact[n-r]) %= MOD;
    return ret;
}

int main() {
    cin.tie(0);
    ios::sync_with_stdio(false);
    fact[0] = rfact[0] = 1;
    for (int i = 1; i < 3*MAXN; i++) {
        fact[i] = (fact[i-1] * i) % MOD;
        rfact[i] = mod_inverse(fact[i]);
    }
    int N, M, K;
    cin >> N >> M >> K;
    ll ans = 0;
    int total = N+M+2*K;
    for (int i = 0; i <= K; i++) {
        int yoko = N+2*i;
        int tate = M+2*(K-i);
        ll y = nCr(yoko, i);
        if (i > 0) {
            (y -= nCr(yoko, i-1)) %= MOD;
            if (y < 0) y += MOD;
        }
        ll t = nCr(tate, (K-i));
        if (K-i > 0) {
            (t -= nCr(tate, (K-i)-1)) %= MOD;
            if (t < 0) t += MOD;
        }
        ll plus = (y*t)%MOD;
        (plus *= nCr(total, yoko)) %= MOD;
        ans += plus;
    }
    cout << ans%MOD << endl;
    return 0;
}