#include <bits/stdc++.h>
using namespace std;
const int N = 7;
const int M = (1 << N);
const int MOD = 1e9 + 7;
const int INF = 1e8 + 7;
int w[N];
int cur, use[N];
void add(int &x, int y) {
  x += y;
  if (x >= MOD) x -= MOD;
}
struct Matrix {
  int size, a[M][M];
  Matrix(int _size) : size(_size) {
    for (int i = 0; i < size; ++i)
      for (int j = 0; j < size; ++j) a[i][j] = 0;
  }
  void clear(int sz) {
    for (int i = 0; i < sz; ++i)
      for (int j = 0; j < sz; ++j) a[i][j] = 0;
  }
  Matrix operator*(Matrix &p) {
    Matrix ret(size);
    for (int i = 0; i < size; ++i)
      for (int j = 0; j < size; ++j)
        for (int k = 0; k < size; ++k) {
          add(ret.a[i][j], (long long)a[i][k] * p.a[k][j] % MOD);
        }
    return ret;
  }
  Matrix operator^(int b) {
    Matrix ret(size), a = *this;
    for (int i = 0; i < size; ++i) ret.a[i][i] = 1;
    while (b > 0) {
      if (b & 1) ret = ret * a;
      a = a * a;
      b >>= 1;
    }
    return ret;
  }
};
int main() {
  for (int i = 0; i < 7; ++i) scanf("%d", &w[i]);
  Matrix ans(M);
  ans.clear(M);
  ans.a[0][0] = 1;
  for (int i = 1; i <= 7; ++i) {
    Matrix go(1 << i);
    for (int mask = 0; mask < (1 << (3 * i - 1)); ++mask) {
      int msk1 = mask & ((1 << i) - 1);
      int msk2 = (mask >> i) & ((1 << (i - 1)) - 1);
      int msk3 = (mask >> ((i << 1) - 1)) & ((1 << i) - 1);
      ++cur;
      for (int j = 0; j < i; ++j) {
        if (msk1 >> j & 1) use[j] = cur;
        if (msk2 >> j & 1) use[j] = use[j + 1] = cur;
        if (msk3 >> j & 1) use[j] = cur;
      }
      int flag = 1;
      for (int j = 0; j < i; ++j) flag &= (use[j] == cur);
      go.a[msk1][msk3] += flag;
    }
    go = go ^ w[i - 1];
    go.size = M;
    ans = ans * go;
  }
  printf("%d", ans.a[0][0]);
  return 0;
}
