#include <bits/stdc++.h>
using namespace std;
int a[(1 << 7)][(1 << 7)], b[(1 << 7)][(1 << 7)], v[(1 << 7)], w[(1 << 7)], n;
void fill(int n) {
  for (int i = 0; i < (1 << n); i++) {
    for (int j = 0; j < (1 << n); j++) {
      a[i][j] = 0;
    }
  }
  for (int m = 0; m < (1 << n); m++) {
    for (int h = 0; h < (1 << (n - 1)); h++) {
      int d = (h << 1) | (1 << n) | 1;
      for (int r = 0; r < (1 << n); r++) {
        int i;
        for (i = 0; i < n; i++) {
          if (((m >> i) & 1) + ((r >> i) & 1) + ((d >> i) & 1) +
                  ((d >> (i + 1)) & 1) ==
              4)
            break;
        }
        if (i == n) a[r][m]++;
      }
    }
  }
}
void mul() {
  for (int i = 0; i < n; i++) {
    for (int j = 0; j < n; j++) {
      unsigned long long v = 0;
      for (int k = 0; k < n; k++) {
        v += (long long)a[i][k] * a[k][j];
        if ((k & 15) == 0) v %= 1000000007;
      }
      b[i][j] = v % 1000000007;
    }
  }
  for (int i = 0; i < n; i++) {
    for (int j = 0; j < n; j++) {
      a[i][j] = b[i][j];
    }
  }
}
void mulv() {
  for (int i = 0; i < n; i++) {
    w[i] = 0;
    for (int j = 0; j < n; j++) {
      w[i] = (w[i] + (long long)a[i][j] * v[j]) % 1000000007;
    }
  }
  for (int i = 0; i < n; i++) {
    v[i] = w[i];
  }
}
void pw(int p) {
  for (; p; mul(), p >>= 1) {
    if (p & 1) mulv();
  }
}
int main() {
  int w[7], k;
  for (int i = 0; i < 7; scanf("%d", &w[i]), i++)
    ;
  for (k = 7; !w[k - 1]; k--)
    ;
  v[0] = 1;
  for (int i = 0; i < k; i++) {
    for (int j = 0; j < (1 << i); j++) {
      v[j | (1 << i)] = v[j];
      v[j] = 0;
    }
    fill(i + 1);
    n = 1 << (i + 1);
    pw(w[i]);
  }
  printf("%d\n", v[(1 << k) - 1]);
  return 0;
}
