#include <bits/stdc++.h>

#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>
#include <ext/pb_ds/detail/standard_policies.hpp>
using namespace __gnu_pbds;

#if !ONLINE_JUDGE
#define debug
#endif

using namespace std;
 
/*******  All Required define Pre-Processors and typedef Constants *******/
#define mem(a, b) memset(a, (b), sizeof(a))
#define repd(i,k) for(ll i=k;i>=0;i--)
#define rep(i,k) for(ll i=0;i<k;i++)
#define repn(i,k1,k2) for(ll i=k1;i<k2;i++)
#define sz(x) (ll)(x).size()
#define ff first
#define ss second

#define all(cont) cont.begin(), cont.end()
#define rall(cont) cont.end(), cont.begin()
#define mp make_pair
#define pb push_back
#define eb emplace_back
#define INF (ll)1e9
#define EPS 1e-9
#define PI 3.1415926535897932384626433832795
#define MOD 1000000007
#define ee6 (ll)1000001
#define ee5 (ll)100001

#define trav(a, v) for(auto& a : v)

#define tt ll t;cin>>t; while(t--)
typedef long long int ll;
 
typedef pair<ll, ll> pr;
typedef vector<ll> vi;
typedef vector<string> vs;
typedef vector<pr> vpr;
typedef vector<vpr>vvpr;
typedef vector<vi> vvi;

//*X.find_by_order(2) element at index=2
//X.order_of_key(1) how many elements strictly less than 1

template <typename T>
using ordered_set = tree<T, null_type, less<T>, rb_tree_tag,
    tree_order_statistics_node_update>;

#ifdef debug
#define dbg(...) { cerr<<"[ "; dump(#__VA_ARGS__, __VA_ARGS__);}
#undef endl
template <typename Arg1,typename Arg2>
ostream& operator << (ostream& out, const pair<Arg1,Arg2> &x) {
    return out<<"("<<x.ff<<","<<x.ss<<")";
}
 
template <typename Arg1>
ostream& operator << (ostream& out, const vector<Arg1> &a) {
    out<<"[";for(const auto &x:a)out<<x<<",";return out<<"]";
}
 
template <typename Arg1>
ostream& operator << (ostream& out, const set<Arg1> &a) {
    out<<"[";for(const auto &x:a)out<<x<<",";return out<<"]";
}
 
template <typename Arg1,typename Arg2>
ostream& operator << (ostream& out, const map<Arg1,Arg2> &a) {
    out<<"[";for(const auto &x:a)out<<x<<",";return out<<"]";
}
 
template <typename Arg1,typename Arg2>
ostream& operator << (ostream& out, const unordered_map<Arg1,Arg2> &a) {
    out<<"[";for(const auto &x:a)out<<x<<",";return out<<"]";
} 
 
template <typename Arg1>
void dump(const string name, Arg1&& arg1){
    cerr << name << " : " << arg1 << " ] " << endl;
}
 
template <typename Arg1, typename... Args>
void dump(const string names, Arg1&& arg1, Args&&... args){
    const string name = names.substr(0,names.find(','));
    cerr<<name<<" : "<<arg1<<" | ";
    dump(names.substr(1+(ll)name.size()), args...);
}
#else
    #define dbg(args...)
#endif
 
ll powmod(ll x, ll y) 
{ 
    ll res = 1;  
    x = x % MOD;
    while (y > 0) 
    { 
        if (y & 1) 
          res = (res*x) % MOD; 
        y = y>>1; // y = y/2 
        x = (x*x) % MOD;   
    } 
    return res; 
} 
ll dp1[2*ee5];
ll dp2[2*ee5];
ll s[2*ee5];
const ll N=2*ee5;
void update(ll fen[],ll idx,ll e){  
  idx++;
  while(idx<=N){
    fen[idx]=(fen[idx]+e)%MOD;
    idx+=(idx&-idx);
  }
}

ll query(ll fen[],ll idx){
  if(idx<0)return 0;
  idx++;
  ll sum=0;
  while(idx>0){
    sum=(sum+fen[idx])%MOD;
    idx-=(idx&-idx);
  }
  return sum;
}

int main()
{
  #if !ONLINE_JUDGE
  //freopen("in.txt","r",stdin);
  #endif
  ios_base::sync_with_stdio(false);
  cin.tie(NULL);
  ll n,a,b;cin>>n>>a>>b;
  s[0]=-1e18-5;
  rep(i,n)cin>>s[i+1];   
  
  //dp1[i][j] no of ways of dist such that ith A and last in B is j
  //dp2[i][j] no of ways of dist such that ith B and last in A is j
/*


                  dp1[i-1][j]   -----> dp1[i][j]  s[i]-s[i-1]>=a
                      |
                      -------------> dp2[i][i-1]  s[i]-s[j]>=b 

                  dp2[i-1][j] ----->   dp2[i][j]  s[i]-s[i-1]>=b
                      |
                      -------------> dp1[i][i-1]  s[i]-s[j]>=a

*/ 
  vector<pair<ll,ll> >upd1,upd2;
  update(dp1,0,1);
  upd1.eb(0,1);
  update(dp2,0,1);
  upd2.eb(0,1);
  
/*
  0 1 2 3 4 5 6
  1 0 0 0 0 0 0
  1 0 0 0 0 0 0

  0 1 0 0 0 0 0
  0 1 0 0 0 0 0
*/


  for(ll i=2;i<=n;i++){
    
    ll idx=upper_bound(s,s+n+1,s[i]-b)-s-1;    
    idx=min(idx,i-2);
    ll x=query(dp1,idx);  
    
    ll idy=upper_bound(s,s+n+1,s[i]-a)-s-1;
    idy=min(idy,i-2);
    ll y=query(dp2,idy);
    
    if(s[i]-s[i-1]<a){
      while(!upd1.empty())
        {update(dp1,upd1.back().ff,-upd1.back().ss);upd1.pop_back();}
    }
    if(s[i]-s[i-1]<b){
      while(!upd2.empty())
        {update(dp2,upd2.back().ff,-upd2.back().ss);upd2.pop_back();}
    }
    update(dp1,i-1,y);
    upd1.eb(i-1,y);
    update(dp2,i-1,x);
    upd2.eb(i-1,x);
        
  }  

  ll ans=0;
  ans=(query(dp1,n-1)+query(dp2,n-1))%MOD;
  cout<<ans;
} 

Measured memory_bytes: 8936