// Original C++ solution (slower):
#include <bits/stdc++.h>

#define mset(a,b) memset(a,b,sizeof a)

#define mcpy(a,b) memcpy(a,b,sizeof b)

#define swap(a,b) a^=b^=a^=b

#define lb(x) ((x)&(-(x)))

#define inf 0x3f3f3f3f

#define dalao 1000000007

#define N 200010

typedef long long ll;

using namespace std;

struct wxh{

	int x,v;

	bool operator <(const wxh& b)const{return v<b.v;}

}a[N];

struct yjq{

	int l,r;

	bool operator <(const yjq& b)const{return l<b.l||(l==b.l&&r<b.r);}

}b[N];

int n,x[N],t[N],sum[N<<2],tag[N<<2],tag2[N<<2];

inline void upd(int& a,int b){a+=b;if(a>=dalao)a-=dalao;}

inline int add(int a,int b){return a+b>=dalao?a+b-dalao:a+b;}

inline void down(int x,int l,int r){

	if(tag2[x]^1){

		if(l^r){

			tag2[x<<1]=1ll*tag2[x<<1]*tag2[x]%dalao,tag2[x<<1|1]=1ll*tag2[x<<1|1]*tag2[x]%dalao;

			tag[x<<1]=1ll*tag[x<<1]*tag2[x]%dalao,tag[x<<1|1]=1ll*tag[x<<1|1]*tag2[x]%dalao;

			sum[x<<1]=1ll*sum[x<<1]*tag2[x]%dalao,sum[x<<1|1]=1ll*sum[x<<1|1]*tag2[x]%dalao;

		}

		tag2[x]=1;

	}

	if(tag[x]){

		if(l^r){

			int mid=l+r>>1;

			upd(tag[x<<1],tag[x]),upd(tag[x<<1|1],tag[x]);

			upd(sum[x<<1],1ll*(mid-l+1)*tag[x]%dalao),upd(sum[x<<1|1],1ll*(r-mid)*tag[x]%dalao);

		}

		tag[x]=0;

	}

}

inline void modify(int x,int l,int r,int L,int R,int v){

	down(x,L,R);

	if(l==L&&r==R){upd(sum[x],1ll*(r-l+1)*v%dalao),upd(tag[x],v);return;}

	int mid=L+R>>1;

	if(r<=mid)modify(x<<1,l,r,L,mid,v);

	else if(l>mid)modify(x<<1|1,l,r,mid+1,R,v);

	else modify(x<<1,l,mid,L,mid,v),modify(x<<1|1,mid+1,r,mid+1,R,v);

	sum[x]=add(sum[x<<1],sum[x<<1|1]);

}

inline void modify2(int x,int l,int r,int L,int R,int v){

	down(x,L,R);

	if(l==L&&r==R){sum[x]=1ll*sum[x]*v%dalao,tag2[x]=1ll*tag2[x]*v%dalao,tag[x]=1ll*tag[x]*v%dalao;return;}

	int mid=L+R>>1;

	if(r<=mid)modify2(x<<1,l,r,L,mid,v);

	else if(l>mid)modify2(x<<1|1,l,r,mid+1,R,v);

	else modify2(x<<1,l,mid,L,mid,v),modify2(x<<1|1,mid+1,r,mid+1,R,v);

	sum[x]=add(sum[x<<1],sum[x<<1|1]);

}

inline int query(int x,int l,int r,int L,int R){

	down(x,L,R);

	if(l==L&&r==R)return sum[x];

	int mid=L+R>>1;

	if(r<=mid)return query(x<<1,l,r,L,mid);

	else if(l>mid)return query(x<<1|1,l,r,mid+1,R);

	return add(query(x<<1,l,mid,L,mid),query(x<<1|1,mid+1,r,mid+1,R));

}

namespace init_b{

	int mi[N],mx[N],smi[N],smx[N];

	inline void main(){

		mset(mi,inf);

		for(int i=1;i<=n;i++)mi[a[i].x]=min(mi[a[i].x],i),mx[a[i].x]=max(mx[a[i].x],i);

		for(int i=1;i<=n;i++)smx[i]=max(smx[i-1],mx[i]);

		smi[n+1]=inf;

		for(int i=n;i;i--)smi[i]=min(smi[i+1],mi[i]);

		for(int i=1;i<=n;i++)b[i].l=smi[a[i].x],b[i].r=smx[a[i].x];

	}

}

int main(){

	cin>>n;

	for(int i=1;i<=n;i++)scanf("%d%d",&a[i].x,&a[i].v),x[i]=a[i].x;

	sort(x+1,x+1+n),sort(a+1,a+1+n);

	for(int i=1;i<=n;i++)a[i].x=lower_bound(x+1,x+1+n,a[i].x)-x;

	init_b::main();

	sort(b+1,b+1+n);

	modify(1,0,0,0,n,1);

	for(int i=1;i<=n;i++){

		int c=query(1,b[i].l-1,b[i].r,0,n);

		modify(1,b[i].r,b[i].r,0,n,c);

		if(b[i].r<n)modify2(1,b[i].r+1,n,0,n,2);

	}

	printf("%d",query(1,n,n,0,n));

	return 0;

}

// Optimized solution to the same problem (faster):
#include <bits/stdc++.h>

#define mset(a,b) memset(a,b,sizeof a)

#define mcpy(a,b) memcpy(a,b,sizeof b)

#define lb(x) ((x)&(-(x)))

#define xx first

#define yy second

#define pb(a) push_back(a)

#define mp(a,b) make_pair(a,b)

#define pii pair<int,int> 

#define dalao 1000000007

#define inf 0x3f3f3f3f

#define N 200005

using namespace std;

typedef long long ll;

int n,x[N],f[N];

pii a[N],b[N];

int main(){

//	freopen("11.txt","r",stdin);

	cin>>n;

	for(int i=1;i<=n;i++)scanf("%d%d",&a[i].xx,&a[i].yy),x[i]=a[i].yy;

	sort(a+1,a+1+n),sort(x+1,x+1+n);

	int mx=0;

	for(int i=1;i<=n;i++){

		mx=max(mx,a[i].yy);

		b[i].yy=lower_bound(x+1,x+1+n,mx)-x;

	}

	mx=inf;

	for(int i=n;i;i--){

		mx=min(mx,a[i].yy);

		b[i].xx=lower_bound(x+1,x+1+n,mx)-x;

	}

	sort(b+1,b+1+n);

	int ans=0;

	for(int i=1,j=1,tot=0,s=0;i<=n;i++){

		while(b[j].yy+1<b[i].xx)s=(s+f[j])%dalao,j++;

		f[i]=(tot-s+dalao)%dalao;

		if(b[i].xx==1)f[i]++;

		tot=(tot+f[i])%dalao;

		if(b[i].yy==n)ans=(ans+f[i])%dalao;

	}

	cout<<ans<<endl;

	return 0;

}

// Fastest known solution for this problem: