#include <bits/stdc++.h>

using namespace std;
typedef long long int ll;
typedef unsigned int uint;
typedef unsigned char uchar;
typedef unsigned long long ull;
typedef pair<int, int> pii;
typedef pair<ll, ll> pll;
typedef vector<int> vi;

#define REP(i, x) for(int i=0;i<(int)(x);i++)
#define REPS(i, x) for(int i=1;i<=(int)(x);i++)
#define RREP(i, x) for(int i=((int)(x)-1);i>=0;i--)
#define RREPS(i, x) for(int i=((int)(x));i>0;i--)
#define FOR(i, c) for(__typeof((c).begin())i=(c).begin();i!=(c).end();i++)
#define RFOR(i, c) for(__typeof((c).rbegin())i=(c).rbegin();i!=(c).rend();i++)
#define ALL(container) (container).begin(), (container).end()
#define RALL(container) (container).rbegin(), (container).rend()
#define SZ(container) ((int)container.size())
#define mp(a, b) make_pair(a, b)
#define pb push_back
#define eb emplace_back
#define UNIQUE(v) v.erase( unique(v.begin(), v.end()), v.end() );
#define __builtin_popcount __builtin_popcountll

template<class T>
bool chmax(T &a, const T &b) {
    if (a < b) {
        a = b;
        return 1;
    }
    return 0;
}

template<class T>
bool chmin(T &a, const T &b) {
    if (a > b) {
        a = b;
        return 1;
    }
    return 0;
}

template<class T>
ostream &operator<<(ostream &os, const vector<T> &t) {
    os << "[";
    FOR(it, t) {
        if (it != t.begin()) os << ",";
        os << *it;
    }
    os << "]";
    return os;
}

template<class T>
ostream &operator<<(ostream &os, const set<T> &t) {
    os << "{";
    FOR(it, t) {
        if (it != t.begin()) os << ",";
        os << *it;
    }
    os << "}";
    return os;
}

template<class S, class T>
ostream &operator<<(ostream &os, const pair<S, T> &t) { return os << "(" << t.first << "," << t.second << ")"; }

template<class S, class T>
pair<S, T> operator+(const pair<S, T> &s, const pair<S, T> &t) {
    return pair<S, T>(s.first + t.first, s.second + t.second);
}

template<class S, class T>
pair<S, T> operator-(const pair<S, T> &s, const pair<S, T> &t) {
    return pair<S, T>(s.first - t.first, s.second - t.second);
}

const int INF = 1 << 28;
const double EPS = 1e-8;
const int MOD = 1000000007;

int n, m;

int table[8] = {
        0, 0, 0, 1, 0, 1, 1, 1
};

int main(int argc, char *argv[]) {
    ios::sync_with_stdio(false);
    string s;
    cin >> s;
    n = s.size();
    vector<ll> dp(2 * 4 * 4);
    dp[0] = 1;
    ll ans = 1;
    REP(i, n) {
        char c = s[i];
        if (c == '?') ans = ans * 2 % MOD;
        vector<ll> nxt(2 * 4 * 4);
        REP(j, 2 * 4 * 4) {
            dp[j] %= MOD;
            REP(k, 2) {
                if ('0' + k == c || c == '?') {
                    int x1 = j >> 4;
                    int x2 = (j >> 2) & 3;
                    int x3 = j & 3;
                    x2 ++;
                    x3 = x3 * 2 + k;
                    if (x2 == 3) {
                        if (x3 & 4) {
                            x1 ++;
                            x2 --;
                            x3 -= 4;
                        } else {
                            x3 = table[x3];
                            x2 = 1;
                        }
                    }
                    if (x1 == 2) continue;
                    nxt[(x1 << 4) | (x2 << 2) | x3] += dp[j];
                }
            }
        }
        swap(dp, nxt);
    }
    REP(j, dp.size()) {
        int x1 = j >> 4;
        int x2 = (j >> 2) & 3;
        int x3 = j & 3;
        int y;
        if (x2 == 1) y = x3;
        else y = table[(x1 << 2) | x3];
        if (!y) ans += MOD - dp[j] % MOD;
    }
    cout << ans % MOD << endl;
    return 0;
}


Measured memory_bytes: 720