#include "bits/stdc++.h"
using namespace std;

//諸機能
#pragma region MACRO 
#define putans(x) cerr << "answer: " ; cout << (x) << endl
#define dputans(x) cerr << "answer: "; cout << setprecision(10) << (double)(x) << endl
#define REP(i,a,n) for(int i=(a); i<(int)(n); i++)
#define RREP(i,a,n) for(int i=(int)(n); i>= a; i--)
#define rep(i,n) REP(i,0,n)
#define rrep(i,n) RREP(i,0,n)
#define all(a) begin((a)),end((a))
#define mp make_pair
#define exist(container, n) ((container).find((n)) != (container).end())
#define substr(s,i,l) string((s), (i), (l))
#define tos(x) (to_string((x)))
#ifdef _DEBUG //ファイルからテストデータを読み込む
std::ifstream ifs("data.txt");
#define input ifs >>
#else 
#define input cin >>
#endif
#pragma endregion
//デバッグなどの支援
#pragma region CODING_SUPPORT
#define dbg(var0) { std::cerr << ( #var0 ) << "=" << ( var0 ) << endl; }
#define dbg2(var0, var1) { std::cerr << ( #var0 ) << "=" << ( var0 ) << ", "; dbg(var1); }
#define dbg3(var0, var1, var2) { std::cerr << ( #var0 ) << "=" << ( var0 ) << ", "; dbg2(var1, var2); }
#define dbgArray(a,n) {std::cerr << (#a) << "=";  rep(i,n){std::cerr <<(a[i])<<",";} cerr<<endl;} 
#ifndef _DEBUG
#define dbg1 {}
#define dbg2 {}
#define dbg3 {}
#define dbgArray {}
#endif 
#pragma endregion 
//typedef（書き換える、書き足す可能性ある）
#pragma region TYPE_DEF
typedef long long ll;
typedef pair<int, int> pii; typedef pair<string, string> pss; typedef pair<int, string>pis; typedef pair<string, int>psi;
typedef vector<string> vs; typedef vector<int> vi;
#pragma endregion
//諸々の定数(書き換える可能性ある)
#pragma region CONST_VAL
#define PI (2*acos(0.0))
#define EPS (1e-9)
#define MOD (ll)(1e9 + 7)
#define INF (1e9)
#pragma endregion


ll gcd(ll x, ll y) { if (y == 0) return x; gcd(y, x% y); }
ll lcm(ll a, ll b) { return a * b / gcd(a, b); };
//ax + by = g となる xとy　また、g = gcd(a,b)を求める
ll extgcd(ll a, ll b, ll &x, ll &y) {
	ll g = a; x = 1; y = 0;
	if (b != 0) g = extgcd(b, a % b, y, x), y -= ( a / b ) * x;
	return g;
}

//ab ≡ 1 (mod m) となるaの逆元bを求める。m を素数にすると解が必ず一意に定まる。
ll mod_inverse(ll a, ll m) {
	ll x, y;
	extgcd(a, m, x, y);
	return ( m + x%m ) % m;
}

//組み合わせ nCr (mod m)を求めるときに使う
//O(logn)に
//MODがでかいとき用 m = MOD = 10^9 + 7 とか O(r)
ll mod_comb_big_MOD(ll n, ll r) {
	ll ret = 1;
	while (true) {
		if (r == 0)break;
		ll N = n % MOD;
		ll R = r % MOD;
		ll imul = 1;
		if (N < R) return 0;
		for (int i = 0; i < R; i++) {
			ret = ( ret * ( N - i ) ) % MOD;
			imul = ( imul *( i + 1 ) ) % MOD;
		}
		ret = ( ret * mod_inverse(imul, MOD) ) % MOD;
		n /= MOD;
		r /= MOD;
	}
	return ret;
}

ll mPow(ll a, ll n,ll m) {
	ll bin = 1;
	ll tmp = a;
	ll ans = 1;
	while (n >= bin) {
		if (( n & bin ) != 0) {
			ans *= tmp;
			ans %= MOD;
		}
		bin *= 2;
		tmp = tmp * tmp;
		tmp %= MOD;
	}
	return ans;
}

int main() {

	vector<ll> tab;
	vector<ll> bat;
	ll k = 1;
	tab.push_back(1);
	bat.push_back(1);
	rep(i, 1000000) {
		k *= i+1;k %= MOD;
		ll abst = mPow(k, MOD - 2, MOD);
		tab.push_back(k);
		bat.push_back(abst);
	}
	ll h, w, a, b; input h >> w >> a >> b;
	vector<ll> s;
	vector<ll> g;
	vector<ll> tt;
	vector<ll> mm;
	rep(i, w ) {
		ll m =  (( tab[h-a-1+i] * bat[h-a-1]) % MOD * bat[i]) % MOD ;
		s.push_back(m % MOD);
	}
	rep(i, w) {
		ll m = ( ( tab[a - 1 + i] * bat[a - 1] ) % MOD * bat[i] ) % MOD;
		g.push_back(m % MOD);
	}
	reverse(all(s));

	tt.push_back(1);
	mm.push_back(1);
	rep(i, w-1) {
		ll m = ( h - a + i )* tt[i] ; m %= MOD;
		m *= mod_inverse(i + 1, MOD); m %= MOD;
		tt.push_back(m);
	}
	rep(i,w-1) {
		ll m = ( a + i ) * mm[i]; m %= MOD;
		m = m * mod_inverse(i + 1, MOD) + MOD; m %= MOD;
		mm.push_back(m);
	}
	reverse(all(tt));
	ll bns = 0;
	ll ans = 0;
	rep(i, w-b) {
		ans += s[i] * g[i];
		ans %= MOD;
		bns += mm[i] * tt[i];
		bns %= MOD;
	}
	putans(bns);
	return 0;
}

Measured memory_bytes: 20308