Petya loves lucky numbers. We all know that lucky numbers are the positive integers whose decimal representations contain only the lucky digits 4 and 7. For example, numbers 47, 744, 4 are lucky and 5, 17, 467 are not.

Unfortunately, not all numbers are lucky. Petya calls a number nearly lucky if the number of lucky digits in it is a lucky number. He wonders whether number n is a nearly lucky number.

Input

The only line contains an integer n (1 ≤ n ≤ 1018).

Please do not use the %lld specificator to read or write 64-bit numbers in С++. It is preferred to use the cin, cout streams or the %I64d specificator.

Output

Print on the single line "YES" if n is a nearly lucky number. Otherwise, print "NO" (without the quotes).

Examples

Input

40047


Output

NO


Input

7747774


Output

YES


Input

1000000000000000000


Output

NO

Note

In the first sample there are 3 lucky digits (first one and last two), so the answer is "NO".

In the second sample there are 7 lucky digits, 7 is lucky number, so the answer is "YES".

In the third sample there are no lucky digits, so the answer is "NO".
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.util.StringTokenizer;

@SuppressWarnings("unused")
public class TaskA {

    BufferedReader stdin = new BufferedReader(new InputStreamReader(System.in));
    PrintWriter out = new PrintWriter(System.out);
    StringTokenizer st = new StringTokenizer("");

    public static void main(String[] args) throws Exception {
        new TaskA().run();
    }

    private void run() throws Exception {

        String s = readString();
        int four = s.length() - s.replace("4","").length();
        int seven = s.length() - s.replace("7","").length();
        if (four+seven == 4|| four+seven == 7) print("YES");
        else print("NO");

    }

    private void print(double d) {
        out.print(d);
        out.flush();
    }

    private void print(String string) {
        out.print(string);
        out.flush();
    }

    private void print(boolean b) {
        out.print(b);
        out.flush();
    }

    private void print(int i) {
        out.print(i);
        out.flush();
    }

    private void print(long l) {
        out.print(l);
        out.flush();
    }

    private String readString() throws Exception {
        while(!st.hasMoreTokens())
            st = new StringTokenizer(stdin.readLine());
        return st.nextToken();
    }

    private String readStringChar() throws Exception {
        while(!st.hasMoreTokens())
            st = new StringTokenizer(stdin.readLine());
        return st.nextToken();
    }

    private int readInt() throws Exception {
        return Integer.parseInt(readString());
    }

    private double readDouble() throws Exception {
        return Double.parseDouble(readString());
    }

    private long readLong() throws Exception {
        return Long.parseLong(readString());
    }

    private void close() {
        out.close();
    }

    private void readIntArrays(boolean tandem, int[]... arrays) throws Exception {
        if (tandem) {
            for (int i = 0; i < arrays[0].length; i++) {
                for (int j = 0; j < arrays.length; j++)
                    arrays[j][i] = readInt();
            }
            return;
        }
        for (int[] i : arrays) {
            for (int j=0; j<i.length; j++) i[j] = readInt();
        }
    }

    private void readLongArrays(boolean tandem, long[]... arrays) throws Exception {
        if (tandem) {
            for (int i = 0; i < arrays[0].length; i++) {
                for (int j = 0; j < arrays.length; j++)
                    arrays[j][i] = readInt();
            }
            return;
        }
        for (long[] i : arrays) {
            for (int j=0; j<i.length; j++) i[j] = readLong();
        }
    }

    private void readLongArrays(boolean tandem, Long[]... arrays) throws Exception {
        if (tandem) {
            for (int i = 0; i < arrays[0].length; i++) {
                for (int j = 0; j < arrays.length; j++)
                    arrays[j][i] = readLong();
            }
            return;
        }
        for (Long[] i : arrays) {
            for (int j=0; j<i.length; j++) i[j] = readLong();
        }
    }

    private void readStringArrays(boolean tandem, String[]... arrays) throws Exception {
        if (tandem) {
            for (int i = 0; i < arrays[0].length; i++) {
                for (int j = 0; j < arrays.length; j++)
                    arrays[j][i] = readString();
            }
            return;
        }
        for (String[] i : arrays) {
            for (int j=0; j<i.length; j++) i[j] = readString();
        }
    }

    private void readDoubleArrays(boolean tandem, double[]... arrays) throws Exception {
        if (tandem) {
            for (int i = 0; i < arrays[0].length; i++) {
                for (int j = 0; j < arrays.length; j++)
                    arrays[j][i] = readDouble();
            }
            return;
        }
        for (double[] i : arrays) {
            for (int j=0; j<i.length; j++) i[j] = readDouble();
        }
    }

}