#include <bits/stdc++.h>
using namespace std;
const int maxN = 1 << 7, maxL = 7, M = 1e9 + 7;
struct Matr {
  int size;
  int ele[maxN][maxN];
} m[maxL + 1];
int ans, w[maxL + 1], dp[maxL][2], sum[maxL + 1][maxN];
int solve(int u, int v, int n) {
  memset(dp, 0, sizeof dp);
  dp[0][1] = 1;
  for (int i = 0; i < n; i++) {
    dp[i + 1][0] = (dp[i][0] + dp[i][1]) % M;
    dp[i + 1][1] = dp[i][0];
    if (((u >> i) & 1) == 1 || ((v >> i) & 1) == 1)
      dp[i + 1][1] = (dp[i + 1][1] + dp[i][1]) % M;
  }
  return dp[n][1];
}
void init(int x) {
  m[x].size = x;
  for (int i = 0; i < (1 << x); i++)
    for (int j = 0; j < (1 << x); j++) m[x].ele[i][j] = solve(i, j, x);
}
Matr muti(Matr &x, Matr &y) {
  int n;
  Matr t;
  t.size = n = x.size;
  for (int i = 0; i < (1 << n); i++)
    for (int j = 0; j < (1 << n); j++) {
      t.ele[i][j] = 0;
      for (int k = 0; k < (1 << n); k++)
        t.ele[i][j] = (1LL * x.ele[i][k] * y.ele[k][j] + t.ele[i][j]) % M;
    }
  return t;
}
Matr pow(Matr x, int k) {
  if (k == 1) return x;
  Matr t = pow(x, k >> 1);
  t = muti(t, t);
  if (k & 1) t = muti(t, x);
  return t;
}
int main() {
  for (int i = 1; i <= maxL; i++) init(i);
  for (int i = 1; i <= maxL; i++) scanf("%d", &w[i]);
  sum[0][0] = 1;
  for (int i = 1; i <= maxL; i++)
    if (w[i] > 0) {
      m[i] = pow(m[i], w[i]);
      for (int u = 0; u < (1 << i); u++)
        for (int v = 0; v < (1 << i); v++)
          sum[i][v] = (1LL * m[i].ele[v][u] * sum[i - 1][u] + sum[i][v]) % M;
      ans = sum[i][0];
    } else {
      for (int u = 0; u < (1 << i); u++) sum[i][u] = sum[i - 1][u];
    }
  printf("%d\n", ans);
}
