#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
#define fi first
#define se second
#define mp make_pair
#define pb push_back
#define P 1000000007
#define N 210
int n, m;
string a[N];
int ff(string a, string b, string c, string d) {
multiset<string> u;
u.insert(a);
u.insert(b);
u.insert(c);
u.insert(d);
a = *u.begin();
u.erase(u.begin());
b = *u.begin();
u.erase(u.begin());
c = *u.begin();
u.erase(u.begin());
d = *u.begin();
u.erase(u.begin());
if (a == b && b == c && c == d) return 1;
if (a == b && b == c || b == c && c == d) return 4;
if (a == b && c == d) return 6;
if (a == b || b == c || c == d) return 12;
return 12;
}
bool gg(string a, string b, string c, string d) {
multiset<string> u;
u.insert(a);
u.insert(b);
u.insert(c);
u.insert(d);
a = *u.begin();
u.erase(u.begin());
b = *u.begin();
u.erase(u.begin());
c = *u.begin();
u.erase(u.begin());
d = *u.begin();
u.erase(u.begin());
if (a != b && b != c && c != d) return true;
return false;
}
bool b[N], c[N];
int main() {
cin >> n >> m;
for (int i = 0; i < n; i ++) {
cin >> a[i];
}
ll S = 1;
for (int i = 0; i*2 < n-1; i ++)
for (int j = 0; j*2 < m-1; j ++) {
S = (ll)S*ff(string(1, a[i][j]), string(1, a[n-1-i][j]), string(1, a[n-1-i][m-1-j]), string(1, a[i][m-1-j]))%P;
if (gg(string(1, a[i][j]), string(1, a[n-1-i][j]), string(1, a[n-1-i][m-1-j]), string(1, a[i][m-1-j]))) b[i] = c[j] = true;
}
/*
for (int i = 0; i*2 < n-1; i ++) {
int j = 0;
S = (ll)S*gg(string(1, a[i][j]), string(1, a[n-1-i][j]), string(1, a[n-1-i][m-1-j]), string(1, a[i][m-1-j]))%P;
}
for (int j = 1; j*2 < m-1; j ++) {
int i = 0;
S = (ll)S*gg(string(1, a[i][j]), string(1, a[n-1-i][j]), string(1, a[n-1-i][m-1-j]), string(1, a[i][m-1-j]))%P;
}
*/
int T = 0;
for (int i = 0; i*2 < n-1; i ++) if (b[i]) T ++;
for (int j = 0; j*2 < m-1; j ++) if (c[j]) T ++;
for (int i = 0; i < T-1; i++) S = (ll)S*2%P;
if (n&1) {
bool F = true;
for (int i = 0; i < m; i++)
if (a[n/2][i] != a[n/2][m-1-i]) F = false;
if (!F) S = (ll)S*2%P;
}
if (m&1) {
bool F = true;
for (int i = 0; i < n; i++)
if (a[i][m/2] != a[n-1-i][m/2]) F = false;
if (!F) S = (ll)S*2%P;
}
cout << S << endl;
return 0;
}