#include <bits/stdc++.h>
using namespace std;
#define ll long long
const ll mod=1e8+7;
const ll MAXN=1e6+5;
ll n,m,sum,ppow;
ll dp[MAXN],f[MAXN],inv[MAXN];
ll qpow(ll a,ll b)
{
ll res=1;
while(b>0)
{
if(b&1)res=res*a%mod;
a=a*a%mod;
b/=2;
}
return res;
}
void p() {
f[0] = 1;
for (ll i = 1; i < MAXN; i++) {
f[i] = f[i - 1] * i % mod;
}
inv[MAXN - 1] = qpow(f[MAXN - 1], mod - 2);
for (ll i = MAXN - 2; i >= 0; i--) {
inv[i] = inv[i + 1] * (i + 1) % mod;
}
}
ll C(ll a,ll b)
{
if(a<0||b<0||a<b)return 0;
return f[a] * inv[b] % mod * inv[a - b] % mod;
}
int main()
{
cin>>n>>m;
memset(dp,-1,sizeof dp);
p();
ppow=qpow(2,n);
dp[0]=1;
dp[1]=0;
for (ll i = 2; i <= m; i++) {
ll t1 = C(ppow - 1, i - 1) * f[i - 1] % mod;
ll t2 = dp[i - 1];
ll t3 = (i - 1) * (ppow - i + 1) % mod * dp[i - 2] % mod;
dp[i] = (t1 - t2 - t3 + 2 * mod) % mod;
}
cout<<dp[m]*inv[m]%mod<<"\n";
return 0;
}