An integer sequence is called beautiful if the difference between any two consecutive numbers is equal to 1. More formally, a sequence s_1, s_2, …, s_{n} is beautiful if |s_i - s_{i+1}| = 1 for all 1 ≤ i ≤ n - 1.

Trans has a numbers 0, b numbers 1, c numbers 2 and d numbers 3. He wants to construct a beautiful sequence using all of these a + b + c + d numbers.

However, it turns out to be a non-trivial task, and Trans was not able to do it. Could you please help Trans?

Input

The only input line contains four non-negative integers a, b, c and d (0 < a+b+c+d ≤ 10^5).

Output

If it is impossible to construct a beautiful sequence satisfying the above constraints, print "NO" (without quotes) in one line.

Otherwise, print "YES" (without quotes) in the first line. Then in the second line print a + b + c + d integers, separated by spaces — a beautiful sequence. There should be a numbers equal to 0, b numbers equal to 1, c numbers equal to 2 and d numbers equal to 3.

If there are multiple answers, you can print any of them.

Examples

Input


2 2 2 1


Output


YES
0 1 0 1 2 3 2


Input


1 2 3 4


Output


NO


Input


2 2 2 3


Output


NO

Note

In the first test, it is easy to see, that the sequence is beautiful because the difference between any two consecutive numbers is equal to 1. Also, there are exactly two numbers, equal to 0, 1, 2 and exactly one number, equal to 3.

It can be proved, that it is impossible to construct beautiful sequences in the second and third tests.
import com.sun.source.tree.Tree;

import java.io.*;
import java.util.*;
import java.lang.*;

public class Main {
    public static PrintWriter out = new PrintWriter(new BufferedOutputStream(System.out));
    static long MOD = (long) (1e9 + 7);
    //static int MOD = 998244353;
    static long MOD2 = MOD * MOD;
    static FastReader sc = new FastReader();
    static int pInf = Integer.MAX_VALUE;
    static int nInf = Integer.MIN_VALUE;
    static long ded = (long)(1e17)+9;
    public static void main(String[] args) throws Exception {
        int test = 1;
        //test = sc.nextInt();
        for (int i = 1; i <= test; i++){
            //out.print("Case #"+i+": ");
            solve();
        }
        out.flush();
        out.close();
    }
    static int a,b,c,d;
    static char temp1,temp2;
    static void solve(){
        a = sc.nextInt();b = sc.nextInt();
        c = sc.nextInt();d = sc.nextInt();
        if(a+b+c+d==1){
            out.println("YES");
            if(a==1){
                out.println("0");
            }else if(b==1){
                out.println("1");
            }else if(c==1){
                out.println("2");
            }else{
                out.println("3");
            }
            return;
        }
        int minab = Math.min(a,b);
        a -= minab;
        b -= minab;
        StringBuffer sb = new StringBuffer();
        for(int i= 0; i < minab; i++){
            sb.append("01");
        }
        int mincd = Math.min(c,d);
        c -= mincd;
        d -= mincd;
        StringBuffer sb1 = new StringBuffer();
        for(int i = 0; i < mincd; i++){
            sb1.append("23");
        }
        int minbc = Math.min(b,c);
        b -= minbc;
        c -= minbc;
        for(int i = 0; i < minbc; i++){
            sb.append("21");
        }
        char[] ans = new char[sb1.length()+sb.length()];
        int h = 0;
        for(; h < sb.length(); h++){
            ans[h] = sb.charAt(h);
        }
        for(int i = 0; i < sb1.length(); i++,h++){
            ans[h] = sb1.charAt(i);
        }
        if(ans.length==0){
            out.println("NO");
            return;
        }
        temp1 = '*';
        temp2 = '*';
        add(0,temp1,ans);
        add(ans.length-1,temp2,ans);
        if(a>0||b>0||c>0||d>0){
            out.println("NO");
            return;
        }
        out.println("YES");
        if(temp1!='*'){
            out.print(temp1+" ");
        }
        for(char g: ans){
            out.print(g+" ");
        }
        if(temp2!='*'){
            out.print(temp2+" ");
        }
    }
    static void add(int i,char f,char[] ans){
        if(ans[i]=='0'&b>0){
            b--;
            f = '1';
        }else if(ans[i]=='1'){
            if(a>0){
                f = '0';
                a--;
            }else if(c>0){
                f = '2';
                c--;
            }
        }else if(ans[i]=='2'){
            if(b>0){
                f = '1';
                b--;
            }else if(d>0){
                f = '3';
                d--;
            }
        } else if (ans[i] == '3' && c > 0) {
            c--;
            f = '2';
        }
        if(i==0){
            temp1 = f;
        }else{
            temp2 = f;
        }
    }
    static class Pair implements Comparable<Pair> {
        int x;int y;
        public Pair(int x, int y) {
            this.x = x;
            this.y = y;
        }
        @Override
        public int compareTo(Pair o) {
            if(this.x==o.x){
                return (this.y-o.y);
            }
            return (this.x-o.x);
        }
    }
    static long nC2(long n) {
        return add((n * (n + 1)) / 2, 0);
    }
    public static long mul(long a, long b) {
        return ((a % MOD) * (b % MOD)) % MOD;
    }
    public static long add(long a, long b) {
        return ((a % MOD) + (b % MOD)) % MOD;
    }
    public static long c2(long n) {
        if ((n & 1) == 0) {
            return mul(n / 2, n - 1);
        } else {
            return mul(n, (n - 1) / 2);
        }
    }
    //Shuffle Sort
    static final Random random = new Random();
    static void ruffleSort(int[] a) {
        int n = a.length;//shuffle, then sort
        for (int i = 0; i < n; i++) {
            int oi = random.nextInt(n); int temp= a[oi];
            a[oi] = a[i];
            a[i] = temp;
        }
        Arrays.sort(a);
    }
    //Brian Kernighans Algorithm
    static long countSetBits(long n) {
        if (n == 0) return 0;
        return 1 + countSetBits(n & (n - 1));
    }
    //Euclidean Algorithm
    static long gcd(long A, long B) {
        if (B == 0) return A;
        return gcd(B, A % B);
    }
    //Modular Exponentiation
    static long fastExpo(long x, long n) {
        if (n == 0) return 1;
        if ((n & 1) == 0) return fastExpo((x * x) % MOD, n / 2) % MOD;
        return ((x % MOD) * fastExpo((x * x) % MOD, (n - 1) / 2)) % MOD;
    }
    //AKS Algorithm
    static boolean isPrime(long n) {
        if (n <= 1) return false;
        if (n <= 3) return true;
        if (n % 2 == 0 || n % 3 == 0) return false;
        for (int i = 5; i <= Math.sqrt(n); i += 6)
            if (n % i == 0 || n % (i + 2) == 0) return false;
        return true;
    }
    public static long modinv(long x) {
        return modpow(x, MOD - 2);
    }
    public static long modpow(long a, long b) {
        if (b == 0) {
            return 1;
        }
        long x = modpow(a, b / 2);
        x = (x * x) % MOD;
        if (b % 2 == 1) {
            return (x * a) % MOD;
        }
        return x;
    }
    static class FastReader {
        BufferedReader br;
        StringTokenizer st;
        public FastReader() {
            br = new BufferedReader(new InputStreamReader(System.in));
        }

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

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

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

        double nextDouble() {
            return Double.parseDouble(next());
        }

        String nextLine() {
            String str = "";
            try {
                str = br.readLine();
            } catch (IOException e) {
                e.printStackTrace();
            }
            return str;
        }
    }
}