// Original C++ solution (slower):
#include <bits/stdc++.h>

using namespace std;

typedef long long ll;

typedef unsigned long long ull;

typedef pair<ll, int> pii;

#define f(i, l, r) for (int i = l; i <= r; i++)

#define rf(i, r, l) for (int i = r; i >= l; i--)

#define all(x) (x).begin(), (x).end()

#define sf(a) scanf("%d",&a)

#define llsf(a) scanf("%lld", &a)

#define l l

#define r r

#define lch (o << 1)

#define rch (o << 1 | 1)

#define mid ((l + r) >> 1)

#define mem(x, y) memset(x, y, sizeof(x))



const int inf = 2e9 + 7;

const ll INF = INT64_MAX;

double eps = 1e-6;

int mod = 1e9 + 7;

const int N = 1e6 + 10;

const double pi = acos(-1.0);



ll f[N];

ll exgcd(ll a, ll b, ll & x, ll & y) {

	ll c;

	return !b ? (x = 1, y = 0, a) : (c = exgcd(b, a % b, y, x), y -= (a / b) * x, c);

}

ll C(int a,int b) {

	if (a > b)swap(a, b);

	b = a + b - 2; a = a - 1;

	ll x, y; exgcd(f[a] * f[b - a] % mod, mod, x, y); if (x < 0)x += mod;

	return f[b] * x % mod;

}

int main() {

#ifdef local

	freopen("in.txt", "r", stdin);

#endif

	f[0] = 1;

	f(i, 1, 2e5)f[i] = f[i - 1] * i % mod;

	int h, w, a, b; cin >> h >> w >> a >> b;

	ll res = 0;

	f(i, 1, h - a) {

		res = (res + C(i, b + 1) * C(h - i + 1, w - b-1) % mod) % mod;

	}

	res = (res + C(h-a,b+1)*C(a,w-b)%mod) % mod;

	cout << res;

}

// Optimized solution to the same problem (faster):
#include <stdio.h>

#include <iostream>

#include <algorithm>

#include <queue>

#include <cstring>

#include <string>

#include <stack>

#include <map>

#include <set>

#include <cmath>

#include <iomanip>

using namespace std;



#define pb push_back

#define All(a) a.begin(), a.end()

#define met(a, b) memset(a, b, sizeof(a))

#define rep1(i, l, r) for(int i = l; i <= r; ++i)

#define rep2(i, l, r) for(int i = l; i < r; ++i) 

#define per(i, r, l) for(int i = r; i >= l; --i)

typedef long long ll;

typedef double db;

typedef long double ldb;

const int NIL = -1;

const int oo = 0x3f3f3f3f;

const ll INF = 2e18;

const db eps = 1e-8;

const db PI = acos(-1.0);

const int maxn = 2e5 + 7;

const int mod = 1e9 + 7;



struct node

{

	int x, y;

	node(int a, int b):x(a), y(b){}

};



ll C1[maxn], C2[maxn];



inline int read(void)

{

	int x = 0, f = 1; char ch = getchar();

	while(ch < '0' || ch > '9')	{ if(ch == '-') f = -1; ch = getchar(); } 

	while(ch >= '0' && ch <= '9') {	x = (x << 1) + (x << 3) + ch - '0';	ch = getchar();	}

	return x * f;

}



inline void write(ll x)

{

	if(x < 0) { putchar('-'); x = -x; }

    if(x>=10) write(x/10); 

	putchar(x%10+'0'); 

}



ll find(ll a, ll b)

{

	if(a == 1) return 1;

	ll ans = b / a + 1;

	ans = ans * find(a*ans-b, b) % b;

	return ans;

}



int main(void)

{

	int n = read(), m = read(), a = read(), b = read();

	node begin(1, 1), mid(n-a, b+1), end(n, m);

	C1[0] = C2[0] = 1;

	int n1 = n-a-1+b, n2 = a+m-b-1;

	C1[n1] = C2[n2] = 1;

	rep1(i, 1, n1/2) C1[n1-i] = C1[i] = C1[i-1] * (n1 - i + 1) % mod * find(i, mod) % mod;

	rep1(i, 1, n2/2) C2[n2-i] = C2[i] = C2[i-1] * (n2 - i + 1) % mod * find(i, mod) % mod;

//	if((n1&1)== 0) cout<<C1[n1/2-1]<<" "<<C1[n1/2]<<" "<<C1[n1/2+1]<<endl;

//	else cout<<C1[n1/2]<<" "<<C1[n1/2+1]<<endl;

//	if((n2&1) == 0) cout<<C2[n2/2-1]<<" "<<C2[n2/2]<<" "<<C2[n2/2+1]<<endl;

//	else cout<<C2[n2/2]<<" "<<C2[n2/2+1]<<endl;

	ll ans = 0;

	while(mid.x > 0 && mid.y <= m)

	{

		ans = (ans + C1[mid.y-1] * C2[end.y-mid.y] % mod) % mod;

		--mid.x;

		++mid.y;

	}

	cout<<ans;

	

	return 0;

} 

// Fastest known solution for this problem: