package main
import (
"bufio"
"fmt"
"os"
)
func main() {
reader := bufio.NewReader(os.Stdin)
writer := bufio.NewWriter(os.Stdout)
defer writer.Flush()
var n, m int
if _, err := fmt.Fscanf(reader, "%d %d\n", &n, &m); err != nil {
return
}
grid := make([]string, n)
for i := 0; i < n; i++ {
fmt.Fscanf(reader, "%s\n", &grid[i])
}
type Cell struct{ r, c int }
adj := make(map[Cell][]Cell)
dirs := []Cell{{-1, 0}, {1, 0}, {0, -1}, {0, 1}}
for r := 0; r < n; r++ {
for c := 0; c < m; c++ {
if grid[r][c] == 'X' {
var unmarked []Cell
for _, d := range dirs {
nr, nc := r+d.r, c+d.c
if nr >= 0 && nr < n && nc >= 0 && nc < m && grid[nr][nc] == '.' {
unmarked = append(unmarked, Cell{nr, nc})
}
}
if len(unmarked) == 1 || len(unmarked) == 3 {
fmt.Fprintln(writer, "NO")
return
}
if len(unmarked) == 2 {
u, v := unmarked[0], unmarked[1]
adj[u] = append(adj[u], v)
adj[v] = append(adj[v], u)
} else if len(unmarked) == 4 {
top := Cell{r - 1, c}
bottom := Cell{r + 1, c}
left := Cell{r, c - 1}
right := Cell{r, c + 1}
adj[top] = append(adj[top], left)
adj[left] = append(adj[left], top)
adj[bottom] = append(adj[bottom], right)
adj[right] = append(adj[right], bottom)
}
}
}
}
color := make(map[Cell]int)
for r := 0; r < n; r++ {
for c := 0; c < m; c++ {
if grid[r][c] == '.' {
color[Cell{r, c}] = -1
}
}
}
for r := 0; r < n; r++ {
for c := 0; c < m; c++ {
start := Cell{r, c}
if grid[r][c] == '.' && color[start] == -1 {
color[start] = 0
queue := []Cell{start}
for len(queue) > 0 {
u := queue[0]
queue = queue[1:]
for _, v := range adj[u] {
if color[v] == -1 {
color[v] = 1 - color[u]
queue = append(queue, v)
} else if color[v] == color[u] {
fmt.Fprintln(writer, "NO")
return
}
}
}
}
}
}
ans := make([][]int, n)
for i := range ans {
ans[i] = make([]int, m)
}
for r := 0; r < n; r++ {
for c := 0; c < m; c++ {
if grid[r][c] == '.' {
if color[Cell{r, c}] == 0 {
ans[r][c] = 1
} else {
ans[r][c] = 4
}
}
}
}
for r := 0; r < n; r++ {
for c := 0; c < m; c++ {
if grid[r][c] == 'X' {
sum := 0
for _, d := range dirs {
nr, nc := r+d.r, c+d.c
if nr >= 0 && nr < n && nc >= 0 && nc < m && grid[nr][nc] == '.' {
sum += ans[nr][nc]
}
}
ans[r][c] = sum
}
}
}
fmt.Fprintln(writer, "YES")
for r := 0; r < n; r++ {
for c := 0; c < m; c++ {
if c > 0 {
fmt.Fprint(writer, " ")
}
fmt.Fprint(writer, ans[r][c])
}
fmt.Fprintln(writer)
}
}