#include <bits/stdc++.h>
using namespace std;
const int MAXN = 7, MAXM = 1e5 + 5, MOD = 1e9 + 7, bit_one = (1 << MAXN) - 1;
int n, ans;
int w[MAXN];
int pre_process[MAXN][(1 << MAXN)][(1 << MAXN)];
int add(int a, int b) {
  int c = a + b;
  while (c >= MOD) c -= MOD;
  return c;
}
int mul(int a, int b) { return 1LL * a * b % MOD; }
struct matrix {
  int data[(1 << MAXN)][(1 << MAXN)];
  int n, m;
  matrix(int a = (1 << MAXN), int b = (1 << MAXN), bool c = 0) {
    n = a;
    m = b;
    for (int i = 0; i < n; i++)
      for (int j = 0; j < m; j++) data[i][j] = (i == j) * c;
  }
  void operator*=(matrix tmp) {
    matrix res(n, tmp.m);
    for (int i = 0; i < n; i++)
      for (int j = 0; j < m; j++)
        for (int k = 0; k < tmp.m; k++)
          res.data[i][k] = add(res.data[i][k], mul(data[i][j], tmp.data[j][k]));
    (*this) = res;
  }
  void operator^=(int tmp) {
    matrix res(n, m, 1);
    for (; tmp; tmp /= 2) {
      if (tmp & 1) res *= (*this);
      (*this) *= (*this);
    }
    (*this) = res;
  }
};
bool cheak(int a, int b, int c, int d) {
  for (int i = 0; i <= a; i++)
    if (((d >> i) & 1) && ((d >> (i + 1)) & 1) && ((b >> i) & 1) &&
        ((c >> i) & 1))
      return 0;
  return 1;
}
int main() {
  for (int i = 0; i < 7; i++) scanf("%d", &w[i]);
  for (int i = 0; i < 7; i++)
    for (int j = 0; j < (1 << (i + 1)); j++)
      for (int k = 0; k < (1 << (i + 1)); k++)
        for (int h = 0; h < (1 << i); h++)
          pre_process[i][j][k] += cheak(i, j, k, (1 << (i + 1)) | (h << 1 | 1));
  matrix M[7];
  for (int i = 0; i < 7; i++) M[i].n = M[i].m = (1 << (i + 1));
  for (int i = 0; i < 7; i++) {
    for (int j = 0; j < (1 << (i + 1)); j++)
      for (int k = 0; k < (1 << (i + 1)); k++)
        M[i].data[j][k] = pre_process[i][j][k];
    M[i] ^= w[i];
  }
  matrix A[7];
  for (int i = 0; i < 7; i++) {
    A[i].n = (1 << (i + 1));
    A[i].m = 1;
  }
  A[0].data[1][0] = 1;
  M[0] *= A[0];
  A[0] = M[0];
  for (int i = 1; i < 7; i++) {
    for (int j = 0; j < (1 << i); j++) {
      int tmp = j << 1 | 1;
      A[i].data[tmp][0] = A[i - 1].data[j][0];
    }
    M[i] *= A[i];
    A[i] = M[i];
  }
  ans = A[6].data[bit_one][0];
  printf("%d", ans);
}
