package main
import (
"fmt"
"io/ioutil"
"os"
"strconv"
"strings"
)
const MOD = 1000000007
const MAX = 400005
var fact [MAX]int64
var invFact [MAX]int64
func power(base, exp int64) int64 {
var res int64 = 1
base %= MOD
for exp > 0 {
if exp%2 == 1 {
res = (res * base) % MOD
}
base = (base * base) % MOD
exp /= 2
}
return res
}
func init() {
fact[0] = 1
invFact[0] = 1
for i := 1; i < MAX; i++ {
fact[i] = (fact[i-1] * int64(i)) % MOD
}
invFact[MAX-1] = power(fact[MAX-1], MOD-2)
for i := MAX - 2; i >= 1; i-- {
invFact[i] = (invFact[i+1] * int64(i+1)) % MOD
}
}
func nCr(n, k int) int64 {
if k < 0 || k > n {
return 0
}
if n == 0 {
return 1
}
return fact[n] * invFact[k] % MOD * invFact[n-k] % MOD
}
func getWays(start_bit int, c00, c01, c10, c11 int) int64 {
if c00 < 0 || c01 < 0 || c10 < 0 || c11 < 0 {
return 0
}
if start_bit == 1 {
if c10 == c01 {
if c10 == 0 {
if c00 == 0 {
return 1
}
return 0
}
return (nCr(c11+c10, c10) * nCr(c00+c10-1, c10-1)) % MOD
} else if c10 == c01+1 {
if c10 == 0 {
return 0
}
return (nCr(c11+c10-1, c10-1) * nCr(c00+c10-1, c10-1)) % MOD
}
return 0
} else {
if c01 == c10 {
if c01 == 0 {
if c11 == 0 {
return 1
}
return 0
}
return (nCr(c00+c01, c01) * nCr(c11+c01-1, c01-1)) % MOD
} else if c01 == c10+1 {
if c01 == 0 {
return 0
}
return (nCr(c00+c01-1, c01-1) * nCr(c11+c01-1, c01-1)) % MOD
}
return 0
}
}
func countLessEq(X string, c00, c01, c10, c11 int) int64 {
if len(X) > c00+c01+c10+c11+1 {
return getWays(1, c00, c01, c10, c11)
}
if len(X) < c00+c01+c10+c11+1 {
return 0
}
var ans int64 = 0
curr_c := []int{c00, c01, c10, c11}
for i := 0; i < len(X); i++ {
if i > 0 && X[i] == '1' {
prev := X[i-1] - '0'
idx := prev*2 + 0
temp_c := make([]int, 4)
copy(temp_c, curr_c)
temp_c[idx]--
if temp_c[idx] >= 0 {
ans = (ans + getWays(0, temp_c[0], temp_c[1], temp_c[2], temp_c[3])) % MOD
}
}
if i > 0 {
prev := X[i-1] - '0'
curr := X[i] - '0'
idx := prev*2 + curr
curr_c[idx]--
if curr_c[idx] < 0 {
break
}
}
}
if curr_c[0] == 0 && curr_c[1] == 0 && curr_c[2] == 0 && curr_c[3] == 0 {
ans = (ans + 1) % MOD
}
return ans
}
func isValid(X string, c00, c01, c10, c11 int) int64 {
if len(X) != c00+c01+c10+c11+1 {
return 0
}
t00, t01, t10, t11 := 0, 0, 0, 0
for i := 0; i < len(X)-1; i++ {
if X[i] == '0' && X[i+1] == '0' {
t00++
}
if X[i] == '0' && X[i+1] == '1' {
t01++
}
if X[i] == '1' && X[i+1] == '0' {
t10++
}
if X[i] == '1' && X[i+1] == '1' {
t11++
}
}
if t00 == c00 && t01 == c01 && t10 == c10 && t11 == c11 {
return 1
}
return 0
}
func main() {
bytes_arr, err := ioutil.ReadAll(os.Stdin)
if err != nil {
return
}
tokens := strings.Fields(string(bytes_arr))
if len(tokens) < 6 {
return
}
A := tokens[0]
B := tokens[1]
c00, _ := strconv.Atoi(tokens[2])
c01, _ := strconv.Atoi(tokens[3])
c10, _ := strconv.Atoi(tokens[4])
c11, _ := strconv.Atoi(tokens[5])
ans := (countLessEq(B, c00, c01, c10, c11) - countLessEq(A, c00, c01, c10, c11) + isValid(A, c00, c01, c10, c11)) % MOD
if ans < 0 {
ans += MOD
}
fmt.Println(ans)
}