#include <algorithm>
#include <vector>
#include <string>
#include <iostream>
using namespace std;

int main() {
    string str1, str2;
    while (cin >> str1 >> str2) { //str1是pattern,str2是要匹配的
        int m = str1.size();
        int n = str2.size();

        vector<vector<bool>> v(m + 1, vector<bool>(n + 1,
                               false)); //这个含义是前i个
        //能否匹配字符串的前j个,能的话为true。
        v[0][0] = true;//pattern的前0个匹配字符串的前0个应该为true,大家都是空的
        
        for (int i = 1; i < m + 1; i++) {
            //'*'因为这个符号可以匹配0个
            if (str1[i - 1] == '*') //如果第i个字符为*
                v[i][0] = v[i -
                            1][0]; //为什么不直接赋值true,而要让他等于前一个值,因
            //为要防止这种情况'*A*'这个从2开始就该都是false的,如果直接赋值true或
            //者false那么第三个被错误赋值
            for (int j = 1; j < n + 1; j++) {
                if (str1[i - 1] == '*' &&
                        isalnum(str2[j - 1])) { //这里判断字符串里的必须
                    //要是字母或者数字,如果是符号的话,那么它的转移方程只有不用'*'的
                    //状态,也就是最后一个判断条件。举个例子pattern:t?t12*.* 字符串:
                    //txt123.xls  pattern'.'后面那个'*'和字符串的'.'应该是可以匹配的
                    //如果没有后面那个条件这里会直接跳过变为false
                    v[i][j] = v[i - 1][j] || v[i][j - 1]; //不用'*'和用'*'两种状态
                    //得到现在的状态
                } else if (toupper(str1[i - 1]) == (toupper(str2[j - 1]))) {
                    v[i][j] = v[i - 1][j - 1]; //这里先转换为大写还要判断相等,这个
                    //函数对其它符号不会改变
                } else if (str1[i - 1] == '?' && isalnum(str2[j - 1])) {
                    v[i][j] = v[i - 1][j - 1]; //如果是问好那么只能匹配一个,也就是
                    //根据前面来判断现在可不可以匹配
                } else if (str1[i - 1] == '*') { //这里就是第一个条件说的那个例外
                    v[i][j] = v[i - 1][j]; //只能是不用'*'的情况下的转移方程
                }
            }
        }
        cout << boolalpha << v[m][n] <<
             endl; //要输出pattern是否匹配字符串那么就是
        //前m个和字符串的前n个是不是true。

    }
}