//jinhaonan
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef double db;
template<class T>inline void read(T &x){
	x=0;char c=getchar();bool f=0;
	for(;c>'9'||c<'0';f=c=='-',c=getchar());
	for(;c>='0'&&c<='9';x=(x<<1)+(x<<3)+c-'0',c=getchar());
	x=f?-x:x;
}
template<class T>inline void write(T x){
	if(x<0)putchar('-'),x=-x;
	if(x>=10)write(x/10);
	putchar(x%10+48);
}
template<class T>inline bool chkmax(T &a,T const &b){
	return a<b?a=b,1:0;
}
template<class T>inline bool chkmin(T &a,T const &b){
	return a>b?a=b,1:0;
}
const int mo=1e9+7;
const int N=100000+10;
vector<int> has;
vector<pair<int,int>> p;
int x[N],y[N],t[N],NM;
void add(int &x,int y){
	if((x+=y)>=mo)
		x-=mo;
}
void Modify(int x,int v){
	for(;x<=NM;x+=x&-x)
		add(t[x],v);
}
int Query(int x){
	int res=0;
	for(;x;x-=x&-x)
		add(res,t[x]);
	return res;
}
int main(){
	// freopen("in.txt","r",stdin);
	int n,m;read(n),read(m);
	for(int i=1;i<=n;++i){
		read(x[i]);
	}
	for(int i=1;i<=m;++i){
		read(y[i]);
	}
	int i=1;
	for(;i<=n&&x[i]<y[1];++i);
	for(int j=1;j<m;++j){
		for(;i<=n&&x[i]>y[j]&&x[i]<y[j+1];++i){
			int xx=x[i]-y[j],yy=y[j+1]-x[i];
			p.push_back({xx,yy});
			has.push_back(yy);
		}
	}
	sort(p.begin(),p.end(),[](const pair<int,int> &A,const pair<int,int> &B)->bool{
		if(A.first!=B.first)
			return A.first<B.first;
		return A.second>B.second;
	});
	p.erase(unique(p.begin(),p.end()),p.end());
	sort(has.begin(),has.end());
	has.erase(unique(has.begin(),has.end()),has.end());
	NM=has.size();
	int ans=1;
	for(auto pp:p){
		int pos=lower_bound(has.begin(),has.end(),pp.second)-has.begin()+1;
		int tmp=Query(pos-1)+1;
		add(ans,tmp);
		Modify(pos,tmp);
	}
	write(ans),putchar('\n');
	return 0;
}