#include <bits/stdc++.h>
using namespace std;
const long long MOD = 1e9 + 7;
inline long long read() {
  long long k = 0, f = 1;
  char ch = getchar();
  while (ch < '0' || ch > '9') {
    if (ch == '-') f = -1;
    ch = getchar();
  }
  while (ch >= '0' && ch <= '9') {
    k = k * 10 + ch - '0';
    ch = getchar();
  }
  return k * f;
}
struct juzhen {
  long long a[130][130];
} ans, a, pre;
long long L;
inline juzhen cheng(juzhen a, juzhen b) {
  juzhen c;
  memset(c.a, 0, sizeof c.a);
  for (long long i = 0; i < L; i++)
    for (long long j = 0; j < L; j++)
      for (long long k = 0; k < L; k++)
        c.a[i][j] = (c.a[i][j] + a.a[i][k] * b.a[k][j]) % MOD;
  return c;
}
inline juzhen mi(juzhen a, long long b) {
  if (b == -1) return pre;
  juzhen x = a, y = a;
  while (b) {
    if (b & 1) x = cheng(x, y);
    y = cheng(y, y);
    b >>= 1;
  }
  return x;
}
signed main() {
  for (long long i = 0; i < 128; i++) pre.a[i][i] = 1;
  ans.a[0][0] = 1;
  for (long long k = 0; k < 7; k++) {
    L = (1 << (k + 1));
    for (long long i = 0; i < (1 << k); i++)
      ans.a[0][i | (1 << k)] = ans.a[0][i], ans.a[0][i] = 0;
    memset(a.a, 0, sizeof a.a);
    for (long long i = 0; i < (1 << (k + 1)); i++)
      for (long long j = 0; j < (1 << (k + 1)); j++) {
        long long p = (i & j);
        for (long long K = 0; K < (1 << k); K++) {
          bool flag = 1;
          for (long long l = 0; l <= k; l++)
            if ((p & (1 << l)) > 0) {
              long long q = 1;
              if (l > 0) q &= ((K & (1 << (l - 1))) > 0);
              if (l < k) q &= ((K & (1 << l)) > 0);
              if (q) {
                flag = 0;
                break;
              }
            }
          if (flag) {
            a.a[i][j]++;
            if (a.a[i][j] > MOD) a.a[i][j] -= MOD;
          }
        }
      }
    long long x = read();
    a = mi(a, x - 1);
    ans = cheng(ans, a);
  }
  printf("%lld", ans.a[0][127]);
  return 0;
}
