#include<map>
#include<set>
#include<cmath>
#include<queue>
#include<bitset>
#include<math.h>
#include<vector>
#include<string>
#include<stdio.h>
#include<cstring>
#include<iostream>
#include<algorithm>
#pragma comment(linker, "/STACK:102400000,102400000")
using namespace std;
const int N=10;
const int mod=12345678;
const int MOD1=1000000007;
const int MOD2=1000000009;
const double EPS=0.00000001;
typedef long long ll;
const ll MOD=1000000007;
const int INF=1000000010;
const ll MAX=1ll<<55;
const double eps=1e-5;
const double inf=~0u>>1;
const double pi=acos(-1.0);
typedef double db;
typedef long double ldb;
typedef unsigned int uint;
typedef unsigned long long ull;
const int dx[]={-1,-1,-1,0,0,1,1,1,0};
const int dy[]={-1,0,1,-1,1,-1,0,1,0};
char s[N][N];
int n,m,ans,x[N],y[N],ma[N][N],num[1<<N],f[30][1<<N];
int cala() {
int i,j,k,h,sum=0,T;
for (i=1;i<=n;i++)
for (j=1;j<=m;j++)
if (s[i][j]=='X') sum++,x[sum]=i,y[sum]=j;
T=1<<sum;
for (i=0;i<T;i++) num[i]=0;
for (i=0;i<T;i++) {
for (j=0;j<=n+1;j++)
for (k=0;k<=m+1;k++) ma[j][k]=0;
for (j=1;j<=sum;j++)
if (~i&(1<<j-1)) ma[x[j]][y[j]]=1;
for (j=1;j<=n;j++)
for (k=1;k<=m;k++) {
for (h=0;h<9;h++)
if (ma[j+dx[h]][k+dy[h]]) break ;
if (h==9) num[i]++;
}
}
for (i=0;i<=n*m;i++)
for (j=0;j<T;j++) f[i][j]=0;
f[0][0]=1;
for (i=1;i<=n*m;i++)
for (j=0;j<T;j++) {
(f[i][j]+=f[i-1][j]*max(num[j]-i+1,0))%=mod;
for (k=1;k<=sum;k++)
if (j&(1<<k-1)) (f[i][j]+=f[i-1][j-(1<<k-1)])%=mod;
}
return f[n*m][T-1];
}
void DFS(int a,int b,int cnt) {
if (a==n+1) {
(ans+=cala()*(cnt&1 ? -1:1))%=mod;return ;
}
if (b==m+1) { DFS(a+1,1,cnt);return ; }
DFS(a,b+1,cnt);
for (int i=0;i<9;i++)
if (s[a+dx[i]][b+dy[i]]=='X') return ;
s[a][b]='X';DFS(a,b+1,cnt+1);s[a][b]='.';
}
int main()
{
int i,j,k;
scanf("%d%d", &n, &m);
for (i=1;i<=n;i++) scanf("%s", s[i]+1);
for (i=1;i<=n;i++)
for (j=1;j<=m;j++)
if (s[i][j]=='X')
for (k=0;k<8;k++)
if (s[i+dx[k]][j+dy[k]]=='X') {
printf("0\n");return 0;
}
ans=0;DFS(1,1,0);
printf("%d\n", (ans+mod)%mod);
return 0;
}