import java.util.Scanner

object Main {
  def main(args: Array[String]) {
    if (args.length > 0 && args(0) == "TEST") {
      println(test())
    } else {
      val input = io.Source.stdin.getLines().mkString("\n")
      println(solve(input).trim())
    }
  }

  def countMine(x:Int, y: Int, g:Vector[Vector[Char]]): Int = {
    val xMax = g.size
    val yMax = g(0).size
    var mineCount: Int = 0
    for (
      cx <- x - 1 to x + 1 if cx >= 0 && cx < xMax;
      cy <- y - 1 to y + 1 if cy >= 0 && cy < yMax && (cx, cy) != (x, y)
    ) {
      if (g(cx)(cy) == '#') mineCount = mineCount + 1
    }
    mineCount
  }

  def solve(input: String): String = {
    val s: Scanner = new Scanner(input)
    val h,w = s.nextInt
    val g:Vector[Vector[Char]] = Vector.fill(h)(s.next.toCharArray.toVector)
    val ans:Vector[Vector[String]] =
      Vector.tabulate(h, w){(y, x) => if (g(y)(x) == '#') "#" else countMine(y,x,g).toString}
    ans.map(_.mkString("")).mkString("\n")
  }

  val tests = List(
    """3 5
      |.....
      |.#.#.
      |.....
    """.stripMargin ->
      """
        |11211
        |1#2#1
        |11211
      """.stripMargin,
    """3 5
      |#####
      |#####
      |#####
    """.stripMargin ->
    """
      |#####
      |#####
      |#####
    """.stripMargin,
    """6 6
      |#####.
      |#.#.##
      |####.#
      |.#..#.
      |#.##..
      |#.#...
    """.stripMargin ->
    """
      |#####3
      |#8#7##
      |####5#
      |4#65#2
      |#5##21
      |#4#310
    """.stripMargin
  )

  def test(): String = tests.map { case (i, o) => (i.trim(), o.trim()) }
    .zipWithIndex.map {
    case ((input, outputExpect), i) =>
      val output = solve(input).trim()
      val tnum = i + 1
      s"test$tnum:" + (
        if (output == outputExpect) "Passed"
        else s"Failed\nexpect:\n$outputExpect\noutput:\n$output")
  }
    .mkString("\n")
}