// Slower C++ solution:
#include <bits/stdc++.h>



#define ft first

#define sd second

#define sz(x) ((int)x.size())



using namespace std;



typedef long long ll;

typedef pair<int, int> pii;

typedef pair<ll, ll> pll;



const int D = 1000 * 1000 * 1000 + 7, MAXN = 2 * 100 * 1000 + 123;





void multi(int& x, int y) { x = (ll)x * y % D; }

int inv(int x) {

	int res = 1;

	for (int i = D - 2; i; i >>= 1, x = (ll)x * x % D)

		if (i & 1)

			res = (ll)res * x % D;

	return res;

}



int r, c, a, b, ans, jav, fact[MAXN];





int main() {

	fact[0] = 1;

	for (int i = 1; i < MAXN; i++)

		fact[i] = (ll)fact[i - 1] * i % D;

	cin >> r >> c >> a >> b;

	for (int i = 0; i < r - a; i++) {

		jav = fact[b + i - 1];

		multi(jav, inv(fact[b - 1]));

		multi(jav, inv(fact[i]));

		multi(jav, fact[r - i + c - b - 2]);

		multi(jav, inv(fact[r - i - 1]));

		multi(jav, inv(fact[c - b - 1]));

		ans += jav;

		ans %= D;

	}

	cout << ans;

	return 0;

}

// Faster C++ solution for the same problem (measured speedup: 1.6282106148943618x):
#include <bits/stdc++.h>



using namespace std;



long long options1[100010];

long long options2[100010];

long long moduo = 1e9 + 7;



long long fast_pow(long long n,long long k)

{

    if(k == 0) return 1;

    else

    {

        long long a = fast_pow(n,k/2)%moduo;

        if(k%2 == 0) return (a*a)%moduo;

        else return (((n*a)%moduo)*a)%moduo;

    }

}



void generate_opt1(int n,int m,int h,int w)

{

    options1[1] = 1;

    long long k = 2; /// bilo je ranije 1

    while(k <= n-h)

    {

        long long inverz = fast_pow(k-1,moduo-2)%moduo;

        /*if(options1[k] < 0)

        {

            cout<<options2[k]<<" "<<k<<" "<<inverz<<" __1"<<endl;

            system("PAUSE");

        }*/

        inverz%=moduo;

        options1[k] = (((options1[k-1]*(w+ k-1 +1-2))%moduo)*inverz)%moduo;

        options1[k] %= moduo;

        k++;

    }



    /*for(int i = 1; i <= n-h; i++)

    {

        cout<<"options1["<<i<<"]: "<<options1[i]<<endl;

    }*/

}



long long factoriel(long long a) /// treba da mod

{

    long long ret = 1;

    for(long long i = 1; i <= a; i++)

    {

        ret*=i;

        ret%=moduo;

    }



    return ret%moduo;

}



long long calculate_A_nad_B(long long a, long long b)

{

    if(a == b) return 1;

    long long ret = 0;

    long long pom1,pom2,pom3;

    //cout<<"a b "<<a<<" "<<b<<endl;

    pom1 = factoriel(a)%moduo; pom2 = factoriel(b)%moduo; pom3 = factoriel(a-b)%moduo; /// svuda si dodao %moduo

    //cout<<pom1<<" "<<pom2<<" "<<pom3<<endl;

    //cout<<"long_long_max"<<LONG_LONG_MAX<<endl;

    //ret = (pom1%moduo)*(fast_pow(pom2,moduo-2)%moduo)*(fast_pow(pom3,moduo-2)%moduo)%moduo; ///mnozenje inverzima zbog modula

    long long x = fast_pow(pom2,moduo-2)%moduo;

    long long y = fast_pow(pom3,moduo-2)%moduo;

    ret = (((pom1*x)%moduo)*y)%moduo;

    //cout<<ret<<endl;



    return ret%moduo;

}



void generate_opt2(int n,int m,int h,int w)

{

    long long d = m-w;

    long long k = h+1;

    long long br = k - 1;

    options2[k-br] = calculate_A_nad_B(k+d-2,k-1)%moduo; /// promenios sa opt od 1 na opt od k

    //cout<<"options2[1]: "<<options2[1]<<endl;



    k++; /// ovo si dodao

    while(k <= n)

    {

        //cout<<"k: "<<k<<endl;

        long long inverz = fast_pow(k-1,moduo-2)%moduo; ///umesto ka promenio si na k -1

        inverz%=moduo;

        //cout<<"k inverz1: "<<k<<" "<<inverz<<endl;

        options2[k -br] = (((options2[k-1 -br]*(d+ k-1 +1-2))%moduo)*inverz)%moduo; /// dodo si -br da bih ubacivao u niz pocevsi od indexa 1 , a ne od indexa k sto moze biti veliki br

        options2[k -br]%=moduo;

        /*if(options2[k - br] < 0)

        {

            cout<<options2[k - br]<<" "<<k<<" "<<inverz<<" __2"<<endl;

            system("PAUSE");

        }*/

        k++;

        //cout << "uso2"<<endl;

    }



    //for(int i = n-h; i>= 1; i--)

        //cout<<"options2["<<i<<"]: "<<options2[i]<<endl;

}



int main()

{

    ios_base::sync_with_stdio(false);

    cin.tie(NULL);



    int n,m,h,w;

    cin>> n >> m >>h >> w;

    //cout<<fast_pow(n,m);



    generate_opt1(n,m,h,w);

    generate_opt2(n,m,h,w);



    long long res = 0;

    long long d = n-h;



    for(int i = 1; i <= d; i++)

    {

        long long pom1 = options1[i] % moduo;

        long long pom2 = options2[d-i+1] % moduo;

        long long pom3 = (pom1 * pom2) % moduo;

        res+= pom3;

        res%=moduo;

    }



    cout<< res;



    return 0;

}