#include <bits/stdc++.h>
using namespace std;
const int mod = 1000 * 1000 * 1000 + 7;
vector<vector<int> > mul(vector<vector<int> > &a, vector<vector<int> > &b) {
  int n = a.size();
  vector<vector<int> > ret(n, vector<int>(n, 0));
  for (int k = 0; k < n; ++k)
    for (int i = 0; i < n; ++i)
      for (int j = 0; j < n; ++j)
        ret[i][j] = (ret[i][j] + (long long)a[i][k] * b[k][j]) % mod;
  return ret;
}
vector<vector<int> > pw(vector<vector<int> > a, vector<vector<int> > mat,
                        int x) {
  int n = a.size();
  vector<vector<int> > ret(n, vector<int>(n, 0));
  for (int i = 0; i < n; ++i) ret[i][i] = 1;
  while (x) {
    if (x & 1) ret = mul(ret, mat);
    mat = mul(mat, mat), x >>= 1;
  }
  return mul(a, ret);
}
int w[10];
int adj[10][1 << 7][1 << 7];
int main() {
  for (int i = 1; i <= 7; ++i) scanf("%d", w + i);
  int last = 0;
  for (int i = 1; i <= 7; ++i)
    if (w[i]) last = i;
  for (int len = 1; len <= 7; ++len) {
    for (int i = 0; i < (1 << len); ++i)
      for (int j = 0; j < (1 << len); ++j) {
        int c0 = 0, c1 = 1;
        for (int k = 0; k < len; ++k) {
          int nc0 = c0 + c1;
          int nc1 = c0;
          if (!(i >> k & 1) || !(j >> k & 1)) nc1 += c1;
          c0 = nc0, c1 = nc1;
        }
        adj[len][i][j] = c1;
      }
  }
  int prv[1 << 7] = {0};
  int nxt[1 << 7];
  prv[0] = 1;
  for (int len = 1; len <= 7; ++len) {
    memset(nxt, 0, sizeof(nxt));
    vector<vector<int> > a(1 << len, vector<int>(1 << len, 0));
    vector<vector<int> > mat(1 << len, vector<int>(1 << len, 0));
    for (int i = 0; i < (1 << (len - 1)); ++i) {
      a[i + (1 << (len - 1))][i + (1 << (len - 1))] = prv[i];
    }
    for (int i = 0; i < (1 << len); ++i)
      for (int j = 0; j < (1 << len); ++j) mat[i][j] = adj[len][i][j];
    if (len == last) {
      w[len]--;
      vector<vector<int> > ret = pw(a, mat, w[len]);
      for (int i = 0; i < (1 << len); ++i)
        for (int j = 0; j < (1 << len); ++j)
          nxt[i] = (nxt[i] + ret[j][i]) % mod;
      int ans = 0;
      for (int i = 0; i < (1 << len); ++i)
        ans = (ans + (long long)adj[len][i][(1 << len) - 1] * nxt[i]) % mod;
      printf("%d\n", ans);
    } else {
      vector<vector<int> > ret = pw(a, mat, w[len]);
      for (int i = 0; i < (1 << len); ++i)
        for (int j = 0; j < (1 << len); ++j)
          nxt[i] = (nxt[i] + ret[j][i]) % mod;
      memcpy(prv, nxt, sizeof(prv));
    }
  }
}
