#include <bits/stdc++.h>
using namespace std;
char s[4 * 300][4 * 300];
char t[2 * 7][4][4] = {
    {"...", "...", "..."}, {"...", ".O.", "..."}, {"..O", "...", "O.."},
    {"..O", ".O.", "O.."}, {"O.O", "...", "O.O"}, {"O.O", ".O.", "O.O"},
    {"O.O", "O.O", "O.O"}, {"...", "...", "..."}, {"...", ".O.", "..."},
    {"O..", "...", "..O"}, {"O..", ".O.", "..O"}, {"O.O", "...", "O.O"},
    {"O.O", ".O.", "O.O"}, {"OOO", "...", "OOO"}};
int a[300][300], b, c, d, e, f[300], g[300], h, i, j, k, l, m, n, ii, jj;
int main() {
  scanf("%d%d", &n, &m);
  for (i = 0; i < 4 * n + 1; scanf("%s", s[i]), i++)
    ;
  for (i = 0; i < n; i++) {
    for (j = 0; j < m; j++) {
      for (k = 0; k < 2 * 7; k++) {
        l = 1;
        for (ii = 0; ii < 3; ii++)
          for (jj = 0; jj < 3; jj++)
            if (t[k][ii][jj] != s[4 * i + 1 + ii][4 * j + 1 + jj]) l = 0;
        if (l) a[i][j] |= k / 7 + 1;
      }
    }
  }
  f[0] = 1;
  for (j = 0; j < m; j++) {
    for (i = 0; (a[i][j] & 1) && i < n; i++)
      ;
    if (i >= n && !(n & 1)) f[j + 1] = (f[j + 1] + f[j]) % 1000000007;
    if (j + 2 <= m) {
      memset(g, 0, sizeof(g));
      g[0] = 1;
      for (i = 0; i < n; i++) {
        if (i + 1 < n)
          if ((a[i][j] & 1) && (a[i + 1][j] & 1) && (a[i][j + 1] & 1) &&
              (a[i + 1][j + 1] & 1))
            g[i + 2] = (g[i + 2] + g[i]) % 1000000007;
        if ((a[i][j] & 2) && (a[i][j + 1] & 2))
          g[i + 1] = (g[i + 1] + g[i]) % 1000000007;
      }
      for (i = 0; (a[i][j] & 1) && (a[i][j + 1] & 1) && i < n; i++)
        ;
      if (i >= n && !(n & 1)) g[n] = (g[n] + 1000000007 - 1) % 1000000007;
      f[j + 2] = (f[j + 2] + 1ll * f[j] * g[n]) % 1000000007;
    }
  }
  printf("%d", f[m]);
  return 0;
}
