Fox Ciel has a board with n rows and n columns. So, the board consists of n × n cells. Each cell contains either a symbol '.', or a symbol '#'.

A cross on the board is a connected set of exactly five cells of the board that looks like a cross. The picture below shows how it looks.

<image>

Ciel wants to draw several (may be zero) crosses on the board. Each cross must cover exactly five cells with symbols '#', and any cell with symbol '#' must belong to some cross. No two crosses can share a cell.

Please, tell Ciel if she can draw the crosses in the described way.

Input

The first line contains an integer n (3 ≤ n ≤ 100) — the size of the board.

Each of the next n lines describes one row of the board. The i-th line describes the i-th row of the board and consists of n characters. Each character is either a symbol '.', or a symbol '#'.

Output

Output a single line with "YES" if Ciel can draw the crosses in the described way. Otherwise output a single line with "NO".

Examples

Input

5
.#...
####.
.####
...#.
.....


Output

YES


Input

4
####
####
####
####


Output

NO


Input

6
.#....
####..
.####.
.#.##.
######
.#..#.


Output

YES


Input

6
.#..#.
######
.####.
.####.
######
.#..#.


Output

NO


Input

3
...
...
...


Output

YES

Note

In example 1, you can draw two crosses. The picture below shows what they look like.

<image>

In example 2, the board contains 16 cells with '#', but each cross contains 5. Since 16 is not a multiple of 5, so it's impossible to cover all.
import java.io.*;
import java.util.*;

public class Main {
	public static void main(String[] args) {
		FastScanner fs = new FastScanner();
		PrintWriter out = new PrintWriter(System.out);
		// int t = fs.nextInt();
		
		for (int tt = 1; tt <= 1; tt++) {
			int n=fs.nextInt();
			String arr[][]=new String[n][n];
			Pair visit[][]=new Pair[n][n];
			for(int i=0;i<n;i++){
				String row[]=fs.next().split("");
				for(int j=0;j<n;j++){
					arr[i][j]=row[j];
					boolean x=false;
					boolean y=false;
					visit[i][j]=new Pair(x,y);
				}
				
			}
			

			
			boolean result=solve(n,arr,visit);
			if(result){
				out.println("YES");
			}
			else{
				out.println("NO");
			}

			
		}

		out.close();
	}
	public static boolean solve(int n, String arr[][], Pair[][] visit){
		if(arr[0][0].equals("#")||arr[0][n-1].equals("#")||arr[n-1][0].equals("#")||arr[n-1][n-1].equals("#")){
			return false;
		}
		for(int i=0;i<n;i++){
			for(int j=0;j<n;j++){
				if(arr[i][j].equals("#")&&!visit[i][j].covered){
					if(i+2>n-1||j+1>n-1||!arr[i+1][j].equals("#")||!arr[i+1][j-1].equals("#")||!arr[i+1][j+1].equals("#")||!arr[i+2][j].equals("#")){
						
						return false;
					}
					if(i+2>n-1||j+1>n-1||visit[i+1][j].shared||visit[i+1][j-1].shared||visit[i+1][j+1].shared||visit[i+2][j].shared){
						
						return false;
					}
					visit[i][j].covered=true;
					visit[i][j].shared=true;
					visit[i+1][j].covered=true;
					visit[i+1][j-1].covered=true;
					visit[i+1][j+1].covered=true;
					visit[i+2][j].covered=true;
					visit[i+1][j].shared=true;
					visit[i+1][j-1].shared=true;
					visit[i+1][j+1].shared=true;
					visit[i+2][j].shared=true;
					
				}
			}	
		}
		return true;
	}
	public static void prime_seive(int n, int[] b) {
       
        Arrays.fill(b,1);
		for(int i=2;i<n;i++){
			if(b[i]==1){
				for(long j=i*(long)i;j<n;j=j+i)
					b[(int)j] = 0;
				//p.add((long)i);
				
			}
		}
		b[0]=b[1]=0;
        
    }
	public static int binarySearch(int arr[], int num) {
		if (num < arr[0]) {
			return 0;
		}
		int low = 0;
		int high = arr.length - 1;
		int index = -1;
		while (low <= high) {
			int mid = low + (high - low) / 2;

			if (arr[mid] <= num) {
				if (arr[mid] == num) {
					// System.out.println(arr[mid]+" "+mid+" "+index);
					index = Math.max(index, mid + 1);
				}
				low = mid + 1;
			}

			else {
				high = mid - 1;
			}
		}
		if (index == -1) {
			index = low;
		}
		return index;
	}

	public static int noOfonesBinary(int a) {
		int count = 0;

		int orig = a;

		while (a > 0) {
			a = a >> 1 << 1;
			if (orig - a == 1)
				count++;
			orig = a >> 1;
			a = orig;
		}
		return count;

	}

	public void swap(int[] arr, int i, int j) {
		int temp = arr[i];
		arr[i] = arr[j];
		arr[j] = temp;
	}

	public static long nCr(int n, int r) {
		long result = 1L;
		for (int i = 0; i < r; i++) {
			result *= (long) (n - i); // n * n-1 * n-2 * .... * n-(r-1)
			result /= (long) (i + 1); // r * r-1 * ... * 1
		}
		return result;
	}

	int pow(int x, int y) {
		// Initialize diff
		int res = 1;

		while (y > 0) {
			// If y is odd,
			// multiply
			// x with diff
			if ((y & 1) == 1)
				res = res * x;

			// n must be even now
			y = y >> 1; // y = y/2
			x = x * x; // Change x to x^2
		}
		return res;
	}

	public static int gcd(int a, int b) {
		if (a == 0)
			return b;

		return gcd(b % a, a);
	}

	static int gcdCoeff(int a, int b, int arr[])// euclidean gcd + extended euclidean
	{
		if (b == 0)
			return a;
		int tmp[] = { 1, 1 };// must be 1,1, because at base step b=0, a=anything, 1.0+ 1.a=a
		int diff = gcdCoeff(b, a % b, tmp);
		arr[0] = tmp[1];// x=y1
		arr[1] = (tmp[0] - (a / b) * tmp[1]);// y=(x1-(a/b)*y1)
		return diff;
	}

	static class Pair {
		boolean covered=false;
		boolean shared=false;;
		
		public Pair(){
			this.covered=false;
			this.shared=false;
		}
		public Pair(boolean val, boolean index ) {
			this.covered = val;
			this.shared = index;
		
		}

	}

	static class FastScanner {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st = new StringTokenizer("");

		String next() {
			while (!st.hasMoreTokens())
				try {
					st = new StringTokenizer(br.readLine());
				} catch (IOException e) {
					e.printStackTrace();
				}
			return st.nextToken();
		}

		int nextInt() {
			return Integer.parseInt(next());
		}

		int[] readIntArray(int n) {
			int[] a = new int[n];
			for (int i = 0; i < n; i++)
				a[i] = nextInt();
			return a;
		}

		Long[] readLongArray(int n) {
			Long[] a = new Long[n];
			for (int i = 0; i < n; i++)
				a[i] = nextLong();
			return a;
		}

		long nextLong() {
			return Long.parseLong(next());
		}
	}
}