Problem: While walking down the street Vanya saw a label "Hide&Seek". Because he is a programmer, he used & as a bitwise AND for these two words represented as a integers in base 64 and got new word. Now Vanya thinks of some string s and wants to know the number of pairs of words of length |s| (length of s), such that their bitwise AND is equal to s. As this number can be large, output it modulo 109 + 7.

To represent the string as a number in numeral system with base 64 Vanya uses the following rules:

  * digits from '0' to '9' correspond to integers from 0 to 9; 
  * letters from 'A' to 'Z' correspond to integers from 10 to 35; 
  * letters from 'a' to 'z' correspond to integers from 36 to 61; 
  * letter '-' correspond to integer 62; 
  * letter '_' correspond to integer 63. 

Input

The only line of the input contains a single word s (1 ≤ |s| ≤ 100 000), consisting of digits, lowercase and uppercase English letters, characters '-' and '_'.

Output

Print a single integer — the number of possible pairs of words, such that their bitwise AND is equal to string s modulo 109 + 7.

Examples

Input

z


Output

3


Input

V_V


Output

9


Input

Codeforces


Output

130653412

Note

For a detailed definition of bitwise AND we recommend to take a look in the corresponding article in Wikipedia.

In the first sample, there are 3 possible solutions: 

  1. z&_ = 61&63 = 61 = z
  2. _&z = 63&61 = 61 = z
  3. z&z = 61&61 = 61 = z

Solution (in JAVA):

Solution:
import java.io.*;
import java.util.*;
import java.text.*;
import java.math.*;

public class main {
    public static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    public static PrintWriter pw = new PrintWriter(System.out);
    public static String line;
    public static StringTokenizer st;
    public static ArrayList<ArrayList<Integer>> adjList;
    public static int[] dx = {-1, 0, 1, 0, -1, 1, 1, -1};
    public static int[] dy = {0, 1, 0, -1, 1, 1, -1, -1};

    public static int toInt(char c){
        if(c >= '0' && c <= '9'){
            return c-'0';
        } else if (c >= 'A' && c <= 'Z'){
            return (int)c - 55;
        } else if(c >= 'a' && c <= 'z'){
            return (int)c - 61;
        } else if(c == '-'){
            return 62;
        } else{
            return 63;
        }
    }

    public static void main(String[] args) throws Exception{
        line = br.readLine();
        long cnt = 1;
        int mod = (int)(1e9 + 7);
        for(int i = 0; i < line.length(); i++){
            char c = line.charAt(i);
            int n = toInt(c);
            // System.out.println(n);
            for(int j = 0; j < 6; j++){
                if(((1 << j) & n) == 0){
                    cnt = (cnt * 3) % mod;
                }
            }
        }
        System.out.println(cnt);

        pw.close();
        br.close();
    }
}

class Pair implements Comparable<Pair>{
    public int a, b;

    Pair(int a, int b){
        this.a = a;
        this.b = b;

    }

    @Override
    public int compareTo(Pair P){
        if(P.b != this.b){
            return this.b - P.b;
        } else{
            return a - P.a;
        }
    }

    public String toString(){
        return a + " " + b;
    }
}