public class Euler716 {
    static final long kMod = 1000000007L;

    static long modPow(long base, long exp) {
        long result = 1;
        while (exp > 0) {
            if ((exp & 1) != 0) {
                result = (result * base) % kMod;
            }
            base = (base * base) % kMod;
            exp >>= 1;
        }
        return result;
    }

    static long modNorm(long x) {
        x %= kMod;
        if (x < 0)
            x += kMod;
        return x;
    }

    public static String solve() {
        long h = 10000;
        long w = 20000;

        long hw = ((h % kMod) * (w % kMod)) % kMod;
        long p2h = modPow(2, h);
        long p2w = modPow(2, w);
        long p2hw = modPow(2, h + w);

        long t0 = (9 * p2hw) % kMod;

        long c1 = modNorm(2 * hw - 8 * (w % kMod) - 10);
        long t1 = (c1 * p2h) % kMod;

        long c2 = modNorm(2 * hw - 8 * (h % kMod) - 10);
        long t2 = (c2 * p2w) % kMod;

        long t3 = modNorm(2 * hw + 10 * (h % kMod) + 10 * (w % kMod) + 10);

        long ans = modNorm(t0 + t1 + t2 + t3);
        return Long.toString(ans);
    }

    public static void main(String[] args) {
        System.out.println(solve());
    }
}
