#include <bits/stdc++.h>
using namespace std;
int _mx[] = {0, 1, 0, -1};
int _my[] = {-1, 0, 1, 0};
struct POINT {
  int r, c;
};
int R, C;
char a[1100][1100];
int col[1100][1100];
int deg[1100][1100];
stack<POINT> bucket[5];
POINT m[20];
inline POINT point(int r, int c) {
  POINT p;
  p.r = r, p.c = c;
  return p;
}
inline bool inside(int r, int c) {
  if (r < 0 || c < 0 || r >= R || c >= C)
    return false;
  else
    return true;
}
int main() {
  cin >> R >> C;
  for (int r = 0; r < (R); r++) {
    string s;
    cin >> s;
    for (int c = 0; c < (C); c++) a[r][c] = s[c];
  }
  for (int r = 0; r < (R); r++)
    for (int c = 0; c < (C); c++) {
      if (a[r][c] != '.') continue;
      for (int i = 0; i < (4); i++) {
        int rr = r + _my[i], cc = c + _mx[i];
        if (!inside(rr, cc)) continue;
        if (a[rr][cc] == '.') deg[r][c]++;
      }
      if (deg[r][c] == 0) {
        cout << -1 << endl;
        return 0;
      }
      bucket[deg[r][c]].push(point(r, c));
    }
  while (true) {
    POINT p;
    bool found = false;
    for (int i = 0; i < (5); i++) {
      while (!bucket[i].empty()) {
        p = bucket[i].top();
        bucket[i].pop();
        if (a[p.r][p.c] == '.') {
          found = true;
          break;
        }
      }
      if (found) break;
    }
    if (!found) break;
    POINT n;
    for (int i = 0; i < (4); i++) {
      int rr = p.r + _my[i], cc = p.c + _mx[i];
      if (!inside(rr, cc)) continue;
      if (a[rr][cc] != '.') continue;
      deg[rr][cc]--;
      n = point(rr, cc);
    }
    m[0] = p;
    m[1] = n;
    int M = 2;
    for (int i = 0; i < (4); i++) {
      int rr = n.r + _my[i], cc = n.c + _mx[i];
      if (!inside(rr, cc)) continue;
      if (a[rr][cc] != '.') continue;
      deg[rr][cc]--;
      if (deg[rr][cc] == 0) {
        m[M].r = rr, m[M].c = cc;
        M++;
      }
    }
    int c = 0;
    for (int i = 0; i < (M); i++) {
      c |= col[m[i].r][m[i].c];
    }
    int color = 0;
    for (int i = 0; i < (10); i++) {
      if ((c & (1 << i)) == 0) {
        color = i;
        break;
      }
    }
    for (int i = 0; i < (M); i++) {
      p = m[i];
      a[p.r][p.c] = '0' + color;
      for (int j = 0; j < (4); j++) {
        int rr = p.r + _my[j], cc = p.c + _mx[j];
        if (!inside(rr, cc)) continue;
        if (a[rr][cc] != '.') continue;
        col[rr][cc] |= (1 << color);
        bucket[deg[rr][cc]].push(point(rr, cc));
      }
    }
  }
  for (int r = 0; r < (R); r++) {
    for (int c = 0; c < (C); c++) cout << a[r][c];
    cout << endl;
  }
  return 0;
}
