#include <algorithm>
#include <array>
#include <bitset>
#include <cassert>
#include <cmath>
#include <complex>
#include <cstdio>
#include <cstring>
#include <deque>
#include <functional>
#include <iomanip>
#include <locale>
#include <iostream>
#include <map>
#include <memory>
#include <new>
#include <numeric>
#include <queue>
#include <random>
#include <set>
#include <sstream>
#include <string>
#include <tuple>
#include <unordered_map>
#include <unordered_set>
#include <utility>
#include <vector>

#define REP(i,n) for(int i=0;i<(int)(n);i++)
#define ALL(x) (x).begin(),(x).end()

using namespace std;

using ll = long long;
using ld = long double;

template <typename T> T &chmin(T &a, const T &b) { return a = min(a, b); }
template <typename T> T &chmax(T &a, const T &b) { return a = max(a, b); }
template <typename T> int len(const T &x) { return x.size(); }

template<typename T>
vector<T> table(int n, T v) { return vector<T>(n, v); }

template <class... Args>
auto table(int n, Args... args) {
  auto val = table(args...);
  return vector<decltype(val)>(n, move(val));
}

struct yes_no : numpunct<char> {
  string_type do_truename()  const { return "YES"; }
  string_type do_falsename() const { return "NO"; }
};

vector<string> ev_ev(ll N, ll M, ll A, ll B) {
  // cout << A << " " << B << endl;
  assert (N % 2 == 0 && M % 2 == 0 && A >= 0 && B >= 0);
  vector<string> res(N, string(M, '.'));
  REP(i,N/2) REP(j,M/2) {
    if (A >= 1) {
      res[i * 2 + 0][j * 2 + 0] = '<';
      res[i * 2 + 0][j * 2 + 1] = '>';
      --A;
      if (A >= 1) {
        res[i * 2 + 1][j * 2 + 0] = '<';
        res[i * 2 + 1][j * 2 + 1] = '>';
        --A;
      }
    }
    else if (B >= 1) {
      res[i * 2 + 0][j * 2 + 0] = '^';
      res[i * 2 + 1][j * 2 + 0] = 'v';
      --B;
      if (B >= 1) {
        res[i * 2 + 0][j * 2 + 1] = '^';
        res[i * 2 + 1][j * 2 + 1] = 'v';
        --B;
      }
    }
  }
  if (A == 0 && B == 0) return res;
  else throw 0;
}

vector<string> strategy1(ll N, ll M, ll A, ll B) {
  vector<string> res(N, string(M, '.'));
  if (N % 2 == 1) {
    REP(j,M/2) {
      if (A >= 1) {
        res[N - 1][j * 2 + 0] = '<';
        res[N - 1][j * 2 + 1] = '>';
        --A;
      }
    }
  }
  if (M % 2 == 1) {
    REP(i,N/2) {
      if (B >= 1) {
        res[i * 2 + 0][M - 1] = '^';
        res[i * 2 + 1][M - 1] = 'v';
        --B;
      }
    }
  }
  const int n = N / 2 * 2;
  const int m = M / 2 * 2;
  vector<string> base = ev_ev(n, m, A, B);
  REP(i,n) REP(j,m) res[i][j] = base[i][j];
  return res;
}

vector<string> strategy2(ll N, ll M, ll A, ll B) {
  if (N % 2 == 0 || M % 2 == 0 || N <= 2 || M <= 2) throw 0;
  vector<string> res(N, string(M, '.'));
  if (A >= 1) {
    res[N - 3][M - 3] = '<';
    res[N - 3][M - 2] = '>';
    --A;
  }
  if (A >= 1) {
    res[N - 1][M - 2] = '<';
    res[N - 1][M - 1] = '>';
    --A;
  }
  if (B >= 1) {
    res[N - 3][M - 1] = '^';
    res[N - 2][M - 1] = 'v';
    --B;
  }
  if (B >= 1) {
    res[N - 2][M - 3] = '^';
    res[N - 1][M - 3] = 'v';
    --B;
  }
  REP(j,(M-3)/2) {
    if (A >= 1) {
      res[N - 1][j * 2 + 0] = '<';
      res[N - 1][j * 2 + 1] = '>';
      --A;
    }
  }
  REP(i,(N-3)/2) {
    if (B >= 1) {
      res[i * 2 + 0][M - 1] = '^';
      res[i * 2 + 1][M - 1] = 'v';
      --B;
    }
  }
  REP(i,(N-3)/2) {
    if (A >= 1) {
      res[i * 2 + 0][M - 3] = '<';
      res[i * 2 + 0][M - 2] = '>';
      --A;
      if (A >= 1) {
        res[i * 2 + 1][M - 3] = '<';
        res[i * 2 + 1][M - 2] = '>';
        --A;
      }
    }
    else if (B >= 1) {
      res[i * 2 + 0][M - 3] = '^';
      res[i * 2 + 1][M - 3] = 'v';
      --B;
      if (B >= 1) {
        res[i * 2 + 0][M - 2] = '^';
        res[i * 2 + 1][M - 2] = 'v';
        --B;
      }
    }
  }
  const int n = N - 1, m = M - 3;
  // cout << "ok" << n << m << A << B << endl;
  vector<string> base = ev_ev(n, m, A, B);
  REP(i,n) REP(j,m) res[i][j] = base[i][j];
  return res;
};

void solve(ll N, ll M, ll A, ll B) {
  try {
    vector<string> res = strategy1(N, M, A, B);
    cout << true << endl;
    REP(i,N) cout << res[i] << endl;
  }
  catch (int) {
    try {
      vector<string> res = strategy2(N, M, A, B);
      cout << true << endl;
      REP(i,N) cout << res[i] << endl;
    }
    catch (int) {
      cout << false << endl;
    }
  }
}

int main() {
  locale loc(locale(), new yes_no);
  cout << boolalpha << setprecision(12) << fixed;
  cout.imbue(loc);
	ll N;
	ll B;
	ll M;
	ll A;
	scanf("%lld", &N);
	scanf("%lld", &M);
	scanf("%lld", &A);
	scanf("%lld", &B);
	solve(N, M, A, B);
	return 0;
}


Measured memory_bytes: 3328