#include <bits/stdc++.h>
using namespace std;

int main() {
  int H,W;
  cin>> H >> W;
  // H要素の配列で初期化
  vector<string> vec(H);

  // H個の入力を受け取る
  for (int i = 0; i < H; i++) {
    cin >> vec.at(i);
  }
  //W=H=1の場合
  if(W==1&H==1){
    if(vec.at(0).at(0)=='.'){
      int count =0;//なぜか回らんのでうまくいってるのこりパートを流用
        string Scount=to_string(count);//int型のcountをstring型に変換
        vec.at(0).at(0)=Scount.at(0);//1文字しかないstring型をchar型に変換。もっといいやり方があるはず
    }
  }
  //ここからH=1の場合
  else if(H==1&W!=1){
    int i=0;
    for(int j = 0; j<W; j++){
     if(j==0&vec.at(i).at(j)=='.'){
       int count=0;
         for(int l=0; l<2; l++){
           if(vec.at(i).at(l)=='#'){
               count++;
           } 
         }
         string Scount=to_string(count);//int型のcountをstring型に変換
         vec.at(i).at(j)=Scount.at(0);//1文字しかないstring型をchar型に変換。もっといいやり方があるはず
       }
       else if(j==W-1&vec.at(i).at(j)=='.'){
          int count=0;
           for(int l=W-2; l<W; l++){
             if(vec.at(i).at(l)=='#'){
               count++;
             }
           }
         string Scount=to_string(count);//int型のcountをstring型に変換
         vec.at(i).at(j)=Scount.at(0);//1文字しかないstring型をchar型に変換。もっといいやり方があるはず
       }
       else if(vec.at(i).at(j)=='.'){
         int count=0;
         for(int l=j-1; l<j+2; l++){
             if(vec.at(i).at(l)=='#'){
               count++;
             }
         }
         string Scount=to_string(count);//int型のcountをstring型に変換
         vec.at(i).at(j)=Scount.at(0);//1文字しかないstring型をchar型に変換。もっといいやり方があるはず
       }
   }
  }
//次にW=1の場合
      else if(H!=1&W==1){
    int j=0;
    for(int i = 0; i<H; i++){
     if(i==0&vec.at(i).at(j)=='.'){
       int count=0;
         for(int k=0; k<2; k++){
           if(vec.at(k).at(j)=='#'){
               count++;
           } 
         }
         string Scount=to_string(count);//int型のcountをstring型に変換
         vec.at(i).at(j)=Scount.at(0);//1文字しかないstring型をchar型に変換。もっといいやり方があるはず
       }
       else if(i==H-1&vec.at(i).at(j)=='.'){
          int count=0;
           for(int k=H-2; k<H; k++){
             if(vec.at(k).at(j)=='#'){
               count++;
             }
           }
         string Scount=to_string(count);//int型のcountをstring型に変換
         vec.at(i).at(j)=Scount.at(0);//1文字しかないstring型をchar型に変換。もっといいやり方があるはず
       }
      else if(vec.at(i).at(j)=='.'){
          int count=0;
           for(int k=i-1; k<i+2; k++){
             if(vec.at(k).at(j)=='#'){
               count++;
             }
           }
         string Scount=to_string(count);//int型のcountをstring型に変換
         vec.at(i).at(j)=Scount.at(0);//1文字しかないstring型をchar型に変換。もっといいやり方があるはず
       }
   }
  }
//ここから一般の場合    
  else{
    for(int i = 0; i < H; i++){
      if(i == 0){
        for(int j = 0; j<W; j++){
          if(j==0&vec.at(i).at(j)=='.'){
            int count=0;
            for(int k=0; k<2; k++){
              for(int l=0; l<2; l++){
                if(vec.at(k).at(l)=='#'){
                  count++;
                }
              }
            }
           string Scount=to_string(count);//int型のcountをstring型に変換
           vec.at(i).at(j)=Scount.at(0);//1文字しかないstring型をchar型に変換。もっといいやり方があるはず
          }
          else if(j==W-1&vec.at(i).at(j)=='.'){
            int count=0;
            for(int k=0; k<2; k++){
              for(int l=W-2; l<W; l++){
                if(vec.at(k).at(l)=='#'){
                  count++;
                }
              }
            }
            string Scount=to_string(count);//int型のcountをstring型に変換
            vec.at(i).at(j)=Scount.at(0);//1文字しかないstring型をchar型に変換。もっといいやり方があるはず
          }
          else if(vec.at(i).at(j)=='.'){
            int count=0;
            for(int k=0; k<2; k++){
              for(int l=j-1; l<j+2; l++){
                if(vec.at(k).at(l)=='#'){
                  count++;
                }
              }
            }
            string Scount=to_string(count);//int型のcountをstring型に変換
            vec.at(i).at(j)=Scount.at(0);//1文字しかないstring型をchar型に変換。もっといいやり方があるはず
          }
      }
      }
      else if(i==H-1){
        for(int j = 0; j<W; j++){
          if(j==0&vec.at(i).at(j)=='.'){
            int count=0;
            for(int k=H-2; k<H; k++){
              for(int l=0; l<2; l++){
                if(vec.at(k).at(l)=='#'){
                  count++;
                }
              }
            }
            string Scount=to_string(count);//int型のcountをstring型に変換
            vec.at(i).at(j)=Scount.at(0);//1文字しかないstring型をchar型に変換。もっといいやり方があるはず
          }
          else if(j==W-1&vec.at(i).at(j)=='.'){
             int count=0;
            for(int k=H-2; k<H; k++){
              for(int l=W-2; l<W; l++){
                if(vec.at(k).at(l)=='#'){
                  count++;
                }
              }
            }
            string Scount=to_string(count);//int型のcountをstring型に変換
            vec.at(i).at(j)=Scount.at(0);//1文字しかないstring型をchar型に変換。もっといいやり方があるはず
          }
          else if(vec.at(i).at(j)=='.'){
            int count=0;
            for(int k=H-2; k<H; k++){
              for(int l=j-1; l<j+2; l++){
                if(vec.at(k).at(l)=='#'){
                  count++;
                }
              }
            }
            string Scount=to_string(count);//int型のcountをstring型に変換
            vec.at(i).at(j)=Scount.at(0);//1文字しかないstring型をchar型に変換。もっといいやり方があるはず
          }
        }
      }
      else{
        for(int j = 0; j<W; j++){
          if(j==0&vec.at(i).at(j)=='.'){
            int count=0;
            for(int k=i-1; k<i+2; k++){
              for(int l=0; l<2; l++){
                if(vec.at(k).at(l)=='#'){
                  count++;
                }
              }
            }
            string Scount=to_string(count);//int型のcountをstring型に変換
            vec.at(i).at(j)=Scount.at(0);//1文字しかないstring型をchar型に変換。もっといいやり方があるはず
          }
          else if(j==W-1&vec.at(i).at(j)=='.'){
            int count=0;
            for(int k=i-1; k<i+2; k++){
              for(int l=W-2; l<W; l++){
                if(vec.at(k).at(l)=='#'){
                  count++;
                }
              }
            }
            string Scount=to_string(count);//int型のcountをstring型に変換
            vec.at(i).at(j)=Scount.at(0);//1文字しかないstring型をchar型に変換。もっといいやり方があるはず
          }
          else if(vec.at(i).at(j)=='.'){
            int count=0;
            for(int k=i-1; k<i+2; k++){
              for(int l=j-1; l<j+2; l++){
                if(vec.at(k).at(l)=='#'){
                  count++;
                }
              }
            }
            string Scount=to_string(count);//int型のcountをstring型に変換
            vec.at(i).at(j)=Scount.at(0);//1文字しかないstring型をchar型に変換。もっといいやり方があるはず
          }
        }
   }
  }
  }
  for(int i=0;i<H;i++){
    for(int j=0; j<W; j++){
      cout<<vec.at(i).at(j);
    }
    cout<<endl;
  }
}

Measured memory_bytes: 256