Problem: Takahashi has an N \times M grid, with N horizontal rows and M vertical columns. Determine if we can place A 1 \times 2 tiles (1 vertical, 2 horizontal) and B 2 \times 1 tiles (2 vertical, 1 horizontal) satisfying the following conditions, and construct one arrangement of the tiles if it is possible:

* All the tiles must be placed on the grid.
* Tiles must not stick out of the grid, and no two different tiles may intersect.
* Neither the grid nor the tiles may be rotated.
* Every tile completely covers exactly two squares.

Constraints

* 1 \leq N,M \leq 1000
* 0 \leq A,B \leq 500000
* N, M, A and B are integers.

Input

Input is given from Standard Input in the following format:


N M A B


Output

If it is impossible to place all the tiles, print `NO`. Otherwise, print the following:


YES
c_{11}...c_{1M}
:
c_{N1}...c_{NM}


Here, c_{ij} must be one of the following characters: `.`, `<`, `>`, `^` and `v`. Represent an arrangement by using each of these characters as follows:

* When c_{ij} is `.`, it indicates that the square at the i-th row and j-th column is empty;
* When c_{ij} is `<`, it indicates that the square at the i-th row and j-th column is covered by the left half of a 1 \times 2 tile;
* When c_{ij} is `>`, it indicates that the square at the i-th row and j-th column is covered by the right half of a 1 \times 2 tile;
* When c_{ij} is `^`, it indicates that the square at the i-th row and j-th column is covered by the top half of a 2 \times 1 tile;
* When c_{ij} is `v`, it indicates that the square at the i-th row and j-th column is covered by the bottom half of a 2 \times 1 tile.

Examples

Input

3 4 4 2


Output

YES
<><>
^<>^
v<>v


Input

4 5 5 3


Output

YES
<>..^
^.<>v
v<>.^
<><>v


Input

7 9 20 20


Output

NO

Solution (in CPP):

Solution:
#include<bits/stdc++.h>
using namespace std;
const int N = 2e3+1;

char c[N][N];
int n,m,a,b;

bool ck(int x,int y){
	if(x>=n-2&&y>=m-2)return 1;
	return 0;
}

bool solve(){
	if(a<2&&b<2||n<3||m<3)return 0;
	for(int i=1;i<=n;++i)
	for(int j=1;j<=m;++j)
	c[i][j]='.';
	c[n-2][m-2]='<';c[n-2][m-1]='>';c[n-2][m]='^';
	c[n-1][m-2]='^';c[n-1][m-1]='.';c[n-1][m]='v';
	c[n][m-2]='v';c[n][m-1]='<';c[n][m]='>';
	a-=2;b-=2;
	if(n&1){
		int tn=min(a,(m-3)/2);
		a-=tn;
		for(int i=1;i<=tn;++i)c[n][i*2-1]='<',c[n][i*2]='>';
	}
	if(m&1){
		int tm=min(b,(n-3)/2);
		b-=tm;
		for(int i=1;i<=tm;++i)c[i*2-1][m]='^',c[i*2][m]='v';
	}
	bool flag=1;
	for(int i=1;i<=n-(n&1);i+=2)
	for(int j=1;j<=m-(m&1);j+=2){
		if(a>=2){
			if(!ck(i,j)&&!ck(i,j+1))c[i][j]='<',c[i][j+1]='>',a--;
			if(!ck(i+1,j)&&!ck(i+1,j+1))c[i+1][j]='<',c[i+1][j+1]='>',a--;
		}
		else if(b>=2){
			if(!ck(i,j)&&!ck(i+1,j))c[i][j]='^',c[i+1][j]='v',b--;
			if(!ck(i,j+1)&&!ck(i+1,j+1))c[i][j+1]='^',c[i+1][j+1]='v',b--;
		}
		else if(a){
			if(!ck(i,j)&&!ck(i,j+1))c[i][j]='<',c[i][j+1]='>',a--;
		}
		else if(b){
			if(!ck(i,j)&&!ck(i+1,j))c[i][j]='^',c[i+1][j]='v',b--;
		}
	}
	if(a||b)return 0;
	return 1;
}

int main(){
	cin>>n>>m>>a>>b;
	int a1=a,b1=b;
	for(int i=1;i<=n;++i)
	for(int j=1;j<=m;++j)
	c[i][j]='.';
	if(n&1){
		int tn=min(a,m/2);
		a-=tn;
		for(int i=1;i<=tn;++i)c[n][i*2-1]='<',c[n][i*2]='>';
	}
	if(m&1){
		int tm=min(b,n/2);
		b-=tm;
		for(int i=1;i<=tm;++i)c[i*2-1][m]='^',c[i*2][m]='v';
	}
	int n1=n,m1=m;
	n=n-(n&1),m=m-(m&1);
	if(n*m<2*(a+(a&1))+2*(b+(b&1))){
		n=n1;m=m1;
		a=a1;b=b1;
		if(solve()){
			printf("YES\n");
			for(int i=1;i<=n1;++i){
				for(int j=1;j<=m1;++j)putchar(c[i][j]);
				cout<<endl;
			}
		}
		else printf("NO\n");
		return 0;
	}
	bool flag=1;
	for(int i=1;i<=n-(n&1);i+=2)
	for(int j=1;j<=m-(m&1);j+=2){
		if(a>=2){
			c[i][j]='<',c[i][j+1]='>',a--;
			c[i+1][j]='<',c[i+1][j+1]='>',a--;
		}
		else if(b>=2){
			c[i][j]='^',c[i+1][j]='v',b--;
			c[i][j+1]='^',c[i+1][j+1]='v',b--;
		}
		else if(a){
			c[i][j]='<',c[i][j+1]='>',a--;
		}
		else if(b){
			c[i][j]='^',c[i+1][j]='v',b--;
		}
	}
	printf("YES\n");
	for(int i=1;i<=n1;++i){
		for(int j=1;j<=m1;++j)putchar(c[i][j]);
		cout<<endl;
	}
}
/*
1000 1000 500000 500000
*/