/*
これを入れて実行
g++ code.cpp
./a.out
 */
 
#include <iostream>
#include <cstdio>
#include <stdio.h>
#include <vector>
#include <string>
#include <cstring>
#include <queue>
#include <deque>
#include <stack>
#include <algorithm>
#include <utility>
#include <set>
#include <map>
#include <unordered_map>
#include <unordered_set>
#include <cmath>
#include <math.h>
#include <tuple>
#include <iomanip>
#include <bitset>
#include <functional>
#include <cassert>
#include <random>

#define all(x) (x).begin(),(x).end()
#define rep(i, n) for (int i = 0; i < (int)(n); i++)
 
using namespace std;
typedef long long ll;
typedef long double ld;
 
int dy4[4] = {-1, 0, +1, 0};
int dx4[4] = {0, +1, 0, -1};
int dy8[8] = {-1, -1, 0, 1, 1, 1, 0, -1};
int dx8[8] = {0, 1, 1, 1, 0, -1, -1, -1};
 
const long long INF = 1LL << 60;
const ll MOD = 1e9 + 7;
 
bool greaterSecond(const pair<int, int>& f, const pair<int, int>& s){
    return f.second > s.second;
}
 
ll gcd(ll a, ll b){
	if (b == 0)return a;
	return gcd(b, a % b);
}
 
ll lcm(ll a, ll b){
    return a / gcd(a, b) * b;
}

ll conbinationMemo[100][100];

void cmemoInit(){
    rep(i, 100){
        rep(j, 100){
            conbinationMemo[i][j] = -1;
        }
    }
}
 
ll nCr(ll n, ll r){
    if(conbinationMemo[n][r] != -1) return conbinationMemo[n][r];
    if(r == 0 || r == n){
        return 1;
    } else if(r == 1){
        return n;
    }
    return conbinationMemo[n][r] = (nCr(n - 1, r) + nCr(n - 1, r - 1));
}
 
ll nPr(ll n, ll r){
    r = n - r;
    ll ret = 1;
    for (ll i = n; i >= r + 1; i--) ret *= i;
    return ret;
}
//-----------------------ここから-----------
ll modpow(ll a, ll b){
    ll res = 1;
    while(b > 0){
        if(b & 1){
            res *= a;
            res %= MOD;
        }
        a *= a;
        a %= MOD;
        b >>= 1;
    }
    return res;
}
int main(void){
    ll h, w;
    cin >> h >> w;
    vector<string> s(h);
    rep(i, h) cin >> s[i];

    vector<vector<ll>> ve(h, vector<ll>(w, 0)), ho(h, vector<ll>(w, 0));
    ll k = 0;
    rep(i, h){
        ll cnt = 0;
        rep(j, w){
            if(s[i][j] == '.'){
                k++;
                cnt++;
            } else {
                cnt = 0;
            }
            ho[i][j] = cnt;
        }

        for(ll j = w - 2; j >= 0; j--){
            if(s[i][j] == '.'){
                ho[i][j] = max(ho[i][j], ho[i][j + 1]);
            }
        }
    }

    rep(i, w){
        ll cnt = 0;
        rep(j, h){
            if(s[j][i] == '.'){
                cnt++;
            } else {
                cnt = 0;
            }
            ve[j][i] = cnt;
        }

        for(ll j = h - 2; j >= 0; j--){
            if(s[j][i] == '.'){
                ve[j][i] = max(ve[j][i], ve[j + 1][i]);
            }
        }
    }
    ll ans = 0;
    rep(i, h){
        rep(j, w){
            if(s[i][j] == '.'){
                //cout << i << " " << j << "   " << ho[i][j] << " " << ve[i][j] << endl;
                ans += modpow(2LL,k) - modpow(2LL, k - (ho[i][j] + ve[i][j] - 1));
                ans %= MOD;
            }
        }
    }

    while(ans < 0) ans += MOD;

    cout << ans % MOD << endl;
}
#include<bits/stdc++.h>
using namespace std;
using ll=long long;
static const ll mod=1000000007;
ll H,W;
char f[2005][2005];
ll modpow(ll x,ll y){
  if(y==0)
    return 1;
  else if(y%2==0){
  ll z=modpow(x,y/2);
    return (z*z)%mod;
  }else{
   ll z=modpow(x,y/2);
    return (x*((z*z)%mod))%mod;
  }
}
ll sum[2005][2005];
int main(){
cin>>H>>W;ll K=0;
  for(ll i=0;i<H;i++){
  string s;cin>>s;
    for(ll j=0;j<W;j++){
      f[i][j]=s[j];
    if(f[i][j]=='.')K++;
    }
  }
  for(ll i=0;i<H;i++){
  ll x=0;
    for(ll j=0;j<W;j++){
    if(f[i][j]=='#')
      x=0;
      else{
      x++;sum[i][j]+=x;
      }
     }
   } for(ll j=0;j<W;j++){
  ll x=0;
    for(ll i=H-1;0<=i;i--){
    if(f[i][j]=='#')
      x=0;
      else{
      x++;sum[i][j]+=x;
      }
     }
   } for(ll i=0;i<H;i++){
  ll x=0;
    for(ll j=W-1;0<=j;j--){
    if(f[i][j]=='#')
      x=0;
      else{
      x++;sum[i][j]+=x;
      }
     }
   } for(ll j=0;j<W;j++){
  ll x=0;
    for(ll i=0;i<H;i++){
    if(f[i][j]=='#')
      x=0;
      else{
      x++;sum[i][j]+=x;
      }
     }
   }ll ans=0;ll k=modpow(2,K);
  for(ll i=0;i<H;i++)
    for(ll j=0;j<W;j++)
      if(f[i][j]!='#'){
        ll y=sum[i][j]-3;
      ll x=(k-modpow(2,K-y)+mod)%mod;
      ans=(ans+x)%mod;
      }cout<<ans<<endl;
      return 0;
}