#include <bits/stdc++.h>
using namespace std;
int p[8][1 << 7][1 << 7];
void prec() {
  for (int l = 1; l <= 7; ++l) {
    for (int A = 0; A < ((1 << l)); ++A) {
      for (int B = 0; B < ((1 << l)); ++B) {
        p[l][A][B] = 0;
        int cl = (1 << (l - 1));
        for (int C = 0; C < (cl); ++C) {
          int cc = 1 | (C << 1) | (1 << l);
          if ((A & B & cc & (cc >> 1)) == 0) {
            ++p[l][A][B];
          }
        }
      }
    }
  }
}
const int MOD = 1000000007;
int tmp[1 << 7][1 << 7];
struct mat {
  int c[1 << 7][1 << 7], n;
  mat(int _n, int I = 0) : n(_n) {
    for (int i = 0; i < (n); ++i) {
      for (int j = 0; j < (n); ++j) {
        c[i][j] = 0;
      }
      c[i][i] = I;
    }
  }
  mat &operator*=(const mat &a) {
    for (int i = 0; i < (n); ++i) {
      for (int j = 0; j < (n); ++j) {
        tmp[i][j] = 0;
        for (int k = 0; k < (n); ++k) {
          tmp[i][j] = ((long long)c[i][k] * a.c[k][j] + tmp[i][j]) % MOD;
        }
      }
    }
    for (int i = 0; i < (n); ++i) {
      for (int j = 0; j < (n); ++j) {
        c[i][j] = tmp[i][j];
      }
    }
    return *this;
  }
};
mat pow(const mat &a, int n) {
  mat res(a.n, 1);
  int l = 0;
  for (; (1 << l) <= n; ++l)
    ;
  for (--l; l >= 0; --l) {
    res *= res;
    if (n & (1 << l)) {
      res *= a;
    }
  }
  return res;
}
int dp[8][1 << 7], c[8];
int main(void) {
  prec();
  for (int i = 1; i <= 7; ++i) {
    scanf("%d", &c[i]);
  }
  dp[0][0] = 1;
  for (int i = 1; i <= 7; ++i) {
    mat A(1 << i);
    for (int j = 0; j < ((1 << i)); ++j) {
      for (int k = 0; k < ((1 << i)); ++k) {
        A.c[j][k] = p[i][j][k];
      }
    }
    A = pow(A, c[i]);
    for (int mask = 0; mask < ((1 << i)); ++mask) {
      dp[i][mask] = 0;
      for (int t = 0; t < ((1 << (i - 1))); ++t) {
        dp[i][mask] = ((long long)A.c[t | (1 << (i - 1))][mask] * dp[i - 1][t] +
                       dp[i][mask]) %
                      MOD;
      }
    }
  }
  printf("%d\n", dp[7][(1 << 7) - 1]);
  return 0;
}
