#define _USE_MATH_DEFINES

#include <cstdio>
#include <cstdlib>
#include <iostream>
#include <cmath>
#include <cstring>
#include <algorithm>
#include <vector>
#include <queue>
#include <map>
#include <set>
#include <unordered_map> 
#include <unordered_set>
#include <functional>
#include <bitset>

using namespace std;

typedef pair<long long int, long long int> P;
typedef tuple<int, int, int> T;

long long int INF = 1e18;
long long int MOD = 1e9 + 7;

int const TREE_SIZE = (1 << 20);

class LazySegTreeUpdate{
	public:
	// コンストラクタ
	LazySegTreeUpdate(function<long long int(long long int, long long int)> monoidFunc_, 
		function<long long int(long long int, long long int)> nodeUpdateFunc_, 
		function<long long int(long long int, long long int, long long int)> resultFunc_, long long int invalidValue_){
		monoidFunc = monoidFunc_;
		nodeUpdateFunc = nodeUpdateFunc_;
		resultFunc = resultFunc_;
		invalidValue = invalidValue_;
	}
	// 値の初期化
	void init(long long int initValue){
		for(int i = 0; i < TREE_SIZE; i++){
			segTree[i] = initValue;
			isAssigned[i] = false;
		}
	}
	// 区間 [a, b] (0-indexed)を w に変更する O(log N)
	void update(int a, int b, long long int w){
		update_(a + 1, b + 2, 1, w, 0, TREE_SIZE / 2);
	}
	// 区間 [a, b] (0-indexed)の値を求める O(log N)
	long long int query(int a, int b){
		return query_(a + 1, b + 2, 1, 0, TREE_SIZE / 2);
	}
	private:
	function<long long int(long long int, long long int)> monoidFunc;
	function<long long int(long long int, long long int)> nodeUpdateFunc;
	function<long long int(long long int, long long int, long long int)> resultFunc;
	long long int invalidValue;
	long long int segTree[TREE_SIZE]; // 1-indexed
	bool isAssigned[TREE_SIZE]; // 値か代入されたかどうか、1-indexed

	// [a, b) を num に変更する
	long long int update_(int a, int b, int index, long long int num, int l, int r){
		if(r <= a || b <= l){
			return segTree[index];
		}
		if(a <= l && r <= b){
			segTree[index] = nodeUpdateFunc(num, r - l);
			isAssigned[index] = true;
			return segTree[index];
		}
		if(isAssigned[index]){
			isAssigned[index * 2] = isAssigned[index * 2 + 1] = true;
			segTree[index * 2] = segTree[index * 2 + 1] = resultFunc(segTree[index], r - l, (r - l) / 2);
			isAssigned[index] = false;
		}
		return segTree[index] = monoidFunc(
			update_(a, b, index * 2, num, l, (l + r) / 2),
			update_(a, b, index * 2 + 1, num, (l + r) / 2, r)
		);
	}
	// 区間 [a, b) の値を求める O(log N)
	long long int query_(int a, int b, int index, int l, int r){
		if(r <= a || b <= l){
			return invalidValue;
		}
		if(a <= l && r <= b){
			return segTree[index];
		}
		if(isAssigned[index]){
			return resultFunc(segTree[index], (r - l), min(r, b) - max(l, a));
		}
		return monoidFunc(
			query_(a, b, index * 2, l, (l + r) / 2), 
			query_(a, b, index * 2 + 1, (l + r) / 2, r)
		);
	}
};

long long int rev_mod(long long int num){
	long long int pow_num = MOD - 2;
	long long int mod_num = MOD;
	long long int pow_cur = num;
	long long int ret = 1;
	while(pow_num > 0){
		if(pow_num % 2 == 1){
			ret *= pow_cur;
			ret %= mod_num;
		}
		pow_cur *= pow_cur;
		pow_cur %= mod_num;
		pow_num /= 2;
	}
	return ret;
}

long long int monoidFunc(long long int a, long long int b){
	return (a + b) % MOD;
}
// 各要素に代入された値が num、区間幅が len のときの、区間の値
long long int nodeUpdateFunc(long long int num, long long int len){
	return num * len % MOD;
}
// 頂点の区間の値が num、頂点の区間幅が len であり、区間の要素は全て同じ値であるとする。
// このとき頂点の区間に含まれる、区間幅が len1 である区間の値
long long int resultFunc(long long int num, long long int len, long long int len1){
	return num * rev_mod(len) % MOD * len1 % MOD;
}
LazySegTreeUpdate segTree1(monoidFunc, nodeUpdateFunc, resultFunc, 0), segTree2(monoidFunc, nodeUpdateFunc, resultFunc, 0);

long long int S[110000];

int main(){
	segTree1.init(0);
	segTree2.init(0);
	long long int N, A, B;
	cin >> N >> A >> B;
	for(int i = 2; i <= N + 1; i++){
		cin >> S[i];
	}
	S[0] = S[1] = -INF;
	segTree2.update(0, 0, 1);
	for(int i = 2; i <= N + 1; i++){
		int pos = distance(S, upper_bound(S, S + (N + 2), S[i] - A)) - 1;
		long long int S1 = segTree2.query(0, pos);
		pos = distance(S, upper_bound(S, S + (N + 2), S[i] - B)) - 1;
		long long int S2 = segTree1.query(0, pos);
		if(S[i] - S[i - 1] < A){
			segTree1.update(0, i, 0);
		}
		if(S[i] - S[i - 1] < B){
			segTree2.update(0, i, 0);
		}
		segTree1.update(i - 1, i - 1, S1);
		segTree2.update(i - 1, i - 1, S2);
	}
	cout << (segTree1.query(0, N) + segTree2.query(0, N)) % MOD << endl;
	return 0;
}

Measured memory_bytes: 19584