#include <bits/stdc++.h>
const long double PI = acos(-1);
const long double eps = 0.0000000001;
const long long INF = 0x3fffffffffffffff;
const long long MOD = 1000000007;
long long hash(char A, char B, char C, char D, char E, char F, char G, char H,
               char I) {
  return (A == 'O') << 0 | (B == 'O') << 1 | (C == 'O') << 2 | (D == 'O') << 3 |
         (E == 'O') << 4 | (F == 'O') << 5 | (G == 'O') << 6 | (H == 'O') << 7 |
         (I == 'O') << 8;
}
const long long A[] = {hash('.', '.', '.', '.', '.', '.', '.', '.', '.'),
                       hash('.', '.', '.', '.', 'O', '.', '.', '.', '.'),
                       hash('.', '.', 'O', '.', '.', '.', 'O', '.', '.'),
                       hash('O', '.', '.', '.', '.', '.', '.', '.', 'O'),
                       hash('.', '.', 'O', '.', 'O', '.', 'O', '.', '.'),
                       hash('O', '.', '.', '.', 'O', '.', '.', '.', 'O'),
                       hash('O', '.', 'O', '.', '.', '.', 'O', '.', 'O'),
                       hash('O', '.', 'O', '.', 'O', '.', 'O', '.', 'O'),
                       hash('O', '.', 'O', 'O', '.', 'O', 'O', '.', 'O'),
                       hash('O', 'O', 'O', '.', '.', '.', 'O', 'O', 'O')};
const long long B[] = {0, 0, +1, -1, +1, -1, 0, 0, +1, -1};
long long n, m, v[255][255], g[255];
char c[1005][1005];
bool all(long long now) {
  for (long long i = 1; i <= n; ++i)
    if (v[i][now] < 0) return false;
  return true;
}
long long work(long long now) {
  long long p[255];
  memset(p, 0, sizeof(p));
  p[0] = 1;
  for (long long i = 1; i <= n; ++i) {
    if (i >= 2 && v[i - 1][now - 1] >= 0 && v[i - 1][now] >= 0 &&
        v[i][now - 1] >= 0 && v[i][now] >= 0)
      p[i] = (p[i] + p[i - 2]) % MOD;
    if (i && v[i][now - 1] <= 0 && v[i][now] <= 0)
      p[i] = (p[i] + p[i - 1]) % MOD;
  }
  return p[n];
}
signed main() {
  std::ios::sync_with_stdio(false);
  std::cin >> n >> m;
  for (long long i = 1; i <= 4 * n + 1; ++i)
    for (long long j = 1; j <= 4 * m + 1; ++j) std::cin >> c[i][j];
  for (long long i = 1; i <= n; ++i)
    for (long long j = 1; j <= m; ++j)
      v[i][j] =
          B[std::find(A, A + 10,
                      hash(c[i * 4 - 2][j * 4 - 2], c[i * 4 - 2][j * 4 - 1],
                           c[i * 4 - 2][j * 4 - 0], c[i * 4 - 1][j * 4 - 2],
                           c[i * 4 - 1][j * 4 - 1], c[i * 4 - 1][j * 4 - 0],
                           c[i * 4 - 0][j * 4 - 2], c[i * 4 - 0][j * 4 - 1],
                           c[i * 4 - 0][j * 4 - 0])) -
            A];
  g[0] = 1;
  for (long long i = 1; i <= m; ++i) {
    if (i >= 2)
      g[i] =
          (g[i] + g[i - 2] * (work(i) - (n % 2 == 0 && all(i - 1) && all(i)))) %
          MOD;
    if (all(i) && n % 2 == 0) g[i] = (g[i] + g[i - 1]) % MOD;
  }
  std::cout << g[m] << std::endl;
  return 0;
}
