#include <bits/stdc++.h>
using namespace std;
const int maxn = 3e5 + 5;
#define sz(x) ((int) (x).size())
#define _ <<" "<< 
typedef pair<int, int> pii;
typedef long long ll;
const ll MOD = 998244353;
int T, n, m;
ll f[maxn], g[maxn];
ll add(ll a, ll b) {
    return (a + b) % MOD;
}
ll mul(ll a, ll b) {
    return (a * b) % MOD;
}

ll fpow(ll a, ll n) {
    a %= MOD; ll ret = 1;
    for (; n; n >>= 1, a = mul(a, a) )
    	if (n & 1) ret = mul(ret, a);
    return ret;
}

ll inv(ll a) {
    return fpow(a, MOD-2);
}

ll inv4 = inv(4);
ll inv8 = inv(8);

int main() {
    cin >> n >> m;
    vector<vector<char>> A(n+1, vector<char>(m+1));
    vector<vector<int>> r(n+1, vector<int>(m+1)), c(n+1, vector<int>(m+1));

    g[1] = 0; g[2] = 1*inv(2);
    f[1] = 0; f[2] = 1*inv(4);
    for (int i = 3; i <= 3e5; ++i) {
        g[i] = add(inv4, mul(inv4, g[i-2]));
        f[i] = add(inv8, mul(inv8, g[i-2]));
    }
    ll sum = 0;
    for (int i = 1; i <= n; ++i) {
        for (int j = 1; j <= m; ++j) {
            cin >> A[i][j];  
            if (A[i][j] == 'o') sum++;
        }
    }
    ll ans = 0;
    for (int i = 1; i <= n; ++i) {
        for (int j = 1; j <= m; ++j) {
            if (A[i][j] == 'o') {
                r[i][j] = r[i][j-1] + 1;
                ans = add(ans, f[r[i][j]]);
            }
        }
    }
    for (int i = 1; i <= m; ++i) {
        for (int j = 1; j <= n; ++j) {
            if (A[j][i] == 'o') {
                c[j][i] = c[j-1][i] + 1;
                ans = add(ans, f[c[j][i]]);
            }
        }
    }
    cout << mul(fpow(2, sum), ans) << endl;
    return 0;
}