#include <iostream>
using namespace std;
const int dir[8][2] = {{-1,-1},{0,-1},{1,-1},{-1,0},{1,0},{-1,1},{0,1},{1,1}}; // cst指不变常量 这步是一个大伏笔啊!
int main (){
int n , m;
cin >> n >> m;
char A[1010][1010]; // 对于这个矩阵 依旧多空出来 10个位置保险
for(int i = 1; i <= n ;i++){ // 这里从1开始de原因是 要对*旁边八个地方进行加一 但是*可能在第一行或者第一列啊
for(int j = 1 ; j <= m; j++){
cin >> A[i][j];
}
}
for(int i = 1; i <=n; i++){
for(int j = 1; j <= m; j++){
if(A[i][j] == '*') {
cout << A[i][j];
continue;//不加这个的话 岂不是*的地方也要参与运算了? 不符合题意啊
}
int cnt = 0 ;
for(int p = 0; p < 8; p++){
if(A[i+dir[p][0]][j+ dir[p][1]] == '*') cnt++;//细节了老弟 这波用dir省了多少事!
}
A[i][j] = cnt +'0';
cout << A[i][j] ;
}
cout << endl;
}
return 0;
}