Problem:
Score : 600 points

Problem Statement

Snuke is standing on a two-dimensional plane. In one operation, he can move by 1 in the positive x-direction, or move by 1 in the positive y-direction.

Let us define a function f(r, c) as follows:

f(r,c) := (The number of paths from the point (0, 0) to the point (r, c) that Snuke can trace by repeating the operation above)

Given are integers r_1, r_2, c_1, and c_2.
Find the sum of f(i, j) over all pair of integers (i, j) such that r_1 ≤ i ≤ r_2 and c_1 ≤ j ≤ c_2, and compute this value modulo (10^9+7).

Constraints

1 ≤ r_1 ≤ r_2 ≤ 10^6

1 ≤ c_1 ≤ c_2 ≤ 10^6

All values in input are integers.

Input

Input is given from Standard Input in the following format:

r_1 c_1 r_2 c_2

Output

Print the sum of f(i, j) modulo (10^9+7).

Sample Input 1

1 1 2 2

Sample Output 1

14

For example, there are two paths from the point (0, 0) to the point (1, 1): (0,0) → (0,1) → (1,1) and (0,0) → (1,0) → (1,1), so f(1,1)=2.

Similarly, f(1,2)=3, f(2,1)=3, and f(2,2)=6. Thus, the sum is 14.

Sample Input 2

314 159 2653 589

Sample Output 2

602215194

Solution in OCaml (4.02.3) (judge verdict: Accepted)

Scanf.scanf "%d %d %d %d" (fun r1 c1 r2 c2 ->
    let m = 1_000_000_007 in

    let extgcd x y =
        let rec eg r0 r1 a0 a1 b0 b1 =
            if r1 = 0 then a0 else
                let q1 = r0 / r1 in
                eg r1 (r0 mod r1) a1 (a0 - q1 * a1) b1 (b0 - q1 * b1)
        in
        eg x y 1 0 0 1
    in
    let inv x y = (* 1/x in mod y *)
        let c = extgcd x y in
        if c < 0 then c + y else c
    in
    let ( */) a b = ((a mod m) * (b mod m) ) mod m in
    let ( //) a b = a */ inv b m in
    let ( +/) a b = (a + b) mod m in
    let ( -/) a b = (((a - b) mod m) + m) mod m in

    let wholesum r c =
        let rec loop cur acc a b i =
            if i > c then acc else loop (cur */ a // b) (acc + cur) (a + 1) (b + 1) (i + 1)
        in
        loop (r + 1) 0 (r + 2) 2 0
    in
    let ans = wholesum r2 c2 -/ wholesum (r1 - 1) c2 -/ wholesum r2 (c1 - 1) +/ wholesum (r1 - 1) (c1 - 1) in
    Printf.printf "%d\n" ans
)