#include <bits/stdc++.h>

#define rep(i, n) for(int i = 0; i<(n); i++)
#define chmax(x, y) x = max(x, y)
#define chmin(x, y) x = min(x, y)
using namespace std;
typedef long long ll;

// auto mod int
// https://youtu.be/L8grWxBlIZ4?t=9858
// https://youtu.be/ERZuLAxZffQ?t=4807 : optimize
// https://youtu.be/8uowVvQ_-Mo?t=1329 : division
const int mod = 1000000007;

struct mint {
    ll x; // typedef long long ll;
    mint(ll x = 0) : x(x % mod) {}

    mint &operator+=(const mint a) {
        if ((x += a.x) >= mod) x -= mod;
        return *this;
    }

    mint &operator-=(const mint a) {
        if ((x += mod - a.x) >= mod) x -= mod;
        return *this;
    }

    mint &operator*=(const mint a) {
        (x *= a.x) %= mod;
        return *this;
    }

    mint operator+(const mint a) const {
        mint res(*this);
        return res += a;
    }

    mint operator-(const mint a) const {
        mint res(*this);
        return res -= a;
    }

    mint operator*(const mint a) const {
        mint res(*this);
        return res *= a;
    }

    mint pow(ll t) const {
        if (!t) return 1;
        mint a = pow(t >> 1);
        a *= a;
        if (t & 1) a *= *this;
        return a;
    }

    // for prime mod
    mint inv() const {
        return pow(mod - 2);
    }

    mint &operator/=(const mint a) {
        return (*this) *= a.inv();
    }

    mint operator/(const mint a) const {
        mint res(*this);
        return res /= a;
    }
};

struct combination {
    vector<mint> fact, ifact;

    combination(int n) : fact(n + 1), ifact(n + 1) {
        fact[0] = 1;
        for (int i = 1; i <= n; ++i) fact[i] = fact[i - 1] * i;
        ifact[n] = fact[n].inv();
        for (int i = n; i >= 1; --i) ifact[i - 1] = ifact[i] * i;
    }

    mint operator()(int n, int k) {
        if (k < 0 || k > n) return 0;
        return fact[n] * ifact[k] * ifact[n - k];
    }
} comb(100005);

mint f(int n, int k) {
    if (n < 0) return 0;
    // nPk = nCk * k!
    mint res = comb(n, k);
    res *= comb.fact[k];
    return res;
}

/**
 * dp[i][j][k][l]
 * i: i桁目
 * j: L <= x を満たしているか
 * k: y <= R を満たしているか
 * s: 先頭ビットが既にあらわれたか
 */
mint dp[61][2][2][2];

int main() {
    ll L, R;
    cin >> L >> R;

    dp[60][0][0][0] = 1;
    for (int i = 59; i >= 0; i--) {
        int lb = (L >> i) & 1;
        int rb = (R >> i) & 1;
        rep(j, 2) {
            rep(k, 2) {
                rep(s, 2) {
                    mint pre = dp[i + 1][j][k][s]; // 遷移前の状態

                    rep(x, 2) {
                        rep(y, 2) {
                            // 次の状態へ遷移
                            if (x && !y) continue; // (x, y) = (1, 0) の組は除外
                            int nj = j, nk = k, ns = s;

                            // sの状態
                            if (!s && x != y) continue;
                            if (x && y) ns = 1;

                            // jの状態(L <= x)
                            if (!j && !x && lb) continue;
                            if (x && !lb) nj = 1;

                            // kの状態(y <= R)
                            if (!k && y && !rb) continue;
                            if (!y && rb) nk = 1;

                            dp[i][nj][nk][ns] += pre;
                        }
                    }
                }
            }
        }
    }

    mint ans;
    rep(j, 2) rep(k, 2) rep(s, 2) ans += dp[0][j][k][s];
    cout << ans.x << endl;
}

Measured memory_bytes: 1792