```go
package main
import (
"bufio"
"fmt"
"os"
"strings"
)
func main() {
reader := bufio.NewReader(os.Stdin)
var n, m int
fmt.Fscan(reader, &n, &m)
grid := make([][]byte, n)
for i := 0; i < n; i++ {
line, _ := reader.ReadString('\n')
line = strings.TrimSpace(line)
grid[i] = []byte(line)
}
c := make([][]bool, n)
for i := 0; i < n; i++ {
c[i] = make([]bool, m)
}
for i := 1; i < n-1; i++ {
for j := 1; j < m-1; j++ {
allHash := true
check:
for dx := -1; dx <= 1; dx++ {
for dy := -1; dy <= 1; dy++ {
if dx == 0 && dy == 0 {
continue
}
ni := i + dx
nj := j + dy
if grid[ni][nj] != '#' {
allHash = false
break check
}
}
}
if allHash {
c[i][j] = true
}
}
}
possible := true
for i := 0; i < n; i++ {
for j := 0; j < m; j++ {
if grid[i][j] == '#' {
has := false
checkhas:
for dx := -1; dx <= 1; dx++ {
for dy := -1; dy <= 1; dy++ {
if dx == 0 && dy == 0 {
continue
}
ni := i + dx
nj := j + dy
if ni >= 0 && ni < n && nj >= 0 && nj < m && c[ni][nj] {
has = true
break checkhas
}
}
}
if !has {
possible = false
break
}
}
}
if !possible {
break
}
}
if possible {
fmt.Println("YES")
} else {
fmt.Println("NO")
}
}
```