#include<bits/stdc++.h>
#define int long long
using namespace std;
const int maxn=4e5+10;
const int mod=1e4+7;
int n,m;
struct node{
int l,r;
int sum1,sum2,sum3;
int ps,tm,cg;
}t[maxn<<2];
inline int read(){
int s=0,w=1;
char ch=getchar();
while(ch<'0'||ch>'9'){
if(ch=='-') w=-1;
ch=getchar();
}
while(ch>='0'&&ch<='9'){
s=s*10+ch-'0';
ch=getchar();
}
return s*w;
}
inline void write(int a){
if(a>9) write(a/10);
putchar(a%10+'0');
}
inline void upd(int i){
t[i].sum1=(t[i<<1].sum1+t[i<<1|1].sum1)%mod;
t[i].sum2=(t[i<<1].sum2+t[i<<1|1].sum2)%mod;
t[i].sum3=(t[i<<1].sum3+t[i<<1|1].sum3)%mod;
}
inline void build(int i,int l,int r){
t[i].l=l,t[i].r=r;
t[i].sum1=t[i].sum2=t[i].sum3=0;
t[i].ps=t[i].tm=t[i].cg=0;
if(l==r)return ;
int mid=l+r>>1;
build(i<<1,l,mid);
build(i<<1|1,mid+1,r);
}
inline void pushdown(int i){
if(t[i].cg!=0){
t[i<<1].ps=t[i<<1].tm=0,t[i<<1].cg=t[i].cg;
t[i<<1].sum1=t[i].cg*(t[i<<1].r-t[i<<1].l+1)%mod;
t[i<<1].sum2=t[i].cg*t[i].cg%mod*(t[i<<1].r-t[i<<1].l+1)%mod;
t[i<<1].sum3=t[i].cg*t[i].cg%mod*t[i].cg%mod*(t[i<<1].r-t[i<<1].l+1)%mod;
t[i<<1|1].ps=t[i<<1|1].tm=0,t[i<<1|1].cg=t[i].cg;
t[i<<1|1].sum1=t[i].cg*(t[i<<1|1].r-t[i<<1|1].l+1)%mod;
t[i<<1|1].sum2=t[i].cg*t[i].cg%mod*(t[i<<1|1].r-t[i<<1|1].l+1)%mod;
t[i<<1|1].sum3=t[i].cg*t[i].cg%mod*t[i].cg%mod*(t[i<<1|1].r-t[i<<1|1].l+1)%mod;
t[i].cg=0;
}
if(t[i].tm!=0){
t[i<<1].tm=(t[i<<1].tm*t[i].tm)%mod;
t[i<<1].ps=(t[i<<1].ps*t[i].tm)%mod;
t[i<<1].sum1=t[i].tm*t[i<<1].sum1%mod;
t[i<<1].sum2=t[i].tm*t[i].tm%mod*t[i<<1].sum2%mod;
t[i<<1].sum3=t[i].tm*t[i].tm%mod*t[i].tm%mod*t[i<<1].sum3%mod;
t[i<<1|1].tm=(t[i<<1|1].tm*t[i].tm)%mod;
t[i<<1|1].ps=(t[i<<1|1].ps*t[i].tm)%mod;
t[i<<1|1].sum1=t[i].tm*t[i<<1|1].sum1%mod;
t[i<<1|1].sum2=t[i].tm*t[i].tm%mod*t[i<<1|1].sum2%mod;
t[i<<1|1].sum3=t[i].tm*t[i].tm%mod*t[i].tm%mod*t[i<<1|1].sum3%mod;
t[i].tm=0;
}
if(t[i].ps!=0){
int p=t[i<<1].sum1;
int q=t[i<<1].sum2;
t[i<<1].ps=(t[i<<1].ps+t[i].ps)%mod;
t[i<<1].sum1=(t[i<<1].sum1+t[i].ps*(t[i<<1].r-t[i<<1].l+1)%mod)%mod;
t[i<<1].sum2=(t[i<<1].sum2+2*t[i].ps%mod*p%mod+t[i].ps*t[i].ps%mod*(t[i<<1].r-t[i<<1].l+1)%mod)%mod;
t[i<<1].sum3=(t[i<<1].sum3+3*t[i].ps%mod*q%mod+3*t[i].ps%mod*t[i].ps*p%mod+t[i].ps*t[i].ps%mod*t[i].ps%mod*(t[i<<1].r-t[i<<1].l+1)%mod)%mod;
p=t[i<<1|1].sum1;
q=t[i<<1|1].sum2;
t[i<<1|1].ps=(t[i<<1|1].ps+t[i].ps)%mod;
t[i<<1|1].sum1=(t[i<<1|1].sum1+t[i].ps*(t[i<<1|1].r-t[i<<1|1].l+1)%mod)%mod;
t[i<<1|1].sum2=(t[i<<1|1].sum2+2*t[i].ps*p%mod+t[i].ps*t[i].ps*(t[i<<1|1].r-t[i<<1|1].l+1)%mod)%mod;
t[i<<1|1].sum3=(t[i<<1|1].sum3+3*t[i].ps*q%mod+3*t[i].ps*t[i].ps*p%mod+t[i].ps*t[i].ps*t[i].ps*(t[i<<1|1].r-t[i<<1|1].l+1)%mod)%mod;
t[i].ps=0;
}
}
inline void change1(int i,int l,int r,int x){
if(t[i].l>r||t[i].r<l)return ;
if(l<=t[i].l&&t[i].r<=r){
t[i].ps=(t[i].ps+x)%mod;
int p=t[i].sum1;
int q=t[i].sum2;
t[i].sum1=(t[i].sum1+x*(t[i].r-t[i].l+1)%mod)%mod;
t[i].sum2=(t[i].sum2+2*x%mod*p%mod+x*x%mod*(t[i].r-t[i].l+1)%mod)%mod;
t[i].sum3=(t[i].sum3+3*x%mod*q%mod+3*x%mod*x%mod*p%mod+x*x%mod*x%mod*(t[i].r-t[i].l+1)%mod)%mod;
return ;
}
pushdown(i);
change1(i<<1,l,r,x);
change1(i<<1|1,l,r,x);
upd(i);
}
inline void change2(int i,int l,int r,int x){
if(t[i].l>r||t[i].r<l)return ;
if(l<=t[i].l&&t[i].r<=r){
int p=t[i].sum1;
int q=t[i].sum2;
t[i].tm=(t[i].tm*x)%mod;
t[i].ps=(t[i].ps*x)%mod;
t[i].sum1=x*t[i].sum1%mod;
t[i].sum2=t[i].sum2*x%mod*x%mod;
t[i].sum3=t[i].sum3*x%mod*x%mod*x%mod;
return ;
}
pushdown(i);
change2(i<<1,l,r,x);
change2(i<<1|1,l,r,x);
upd(i);
}
inline void change3(int i,int l,int r,int x){
if(t[i].l>r||t[i].r<l)return ;
if(l<=t[i].l&&t[i].r<=r){
int p=t[i].sum1;
int q=t[i].sum2;
t[i].tm=0,t[i].ps=0,t[i].cg=x;
t[i].sum1=(t[i].r-t[i].l+1)*x%mod;
t[i].sum2=(t[i].r-t[i].l+1)*x%mod*x%mod;
t[i].sum3=(t[i].r-t[i].l+1)*x%mod*x%mod*x%mod;
return ;
}
pushdown(i);
change3(i<<1,l,r,x);
change3(i<<1|1,l,r,x);
upd(i);
}
inline int query1(int i,int l,int r){
if(t[i].l>r||t[i].r<l)return 0;
if(l<=t[i].l&&t[i].r<=r)return t[i].sum1;
pushdown(i);
int p=(query1(i<<1,l,r)+query1(i<<1|1,l,r))%mod;
return p;
}
inline int query2(int i,int l,int r){
if(t[i].l>r||t[i].r<l)return 0;
if(l<=t[i].l&&t[i].r<=r)return t[i].sum2;
pushdown(i);
int p=(query2(i<<1,l,r)+query2(i<<1|1,l,r))%mod;
return p;
}
inline int query3(int i,int l,int r){
if(t[i].l>r||t[i].r<l)return 0;
if(l<=t[i].l&&t[i].r<=r)return t[i].sum3;
pushdown(i);
int p=(query3(i<<1,l,r)+query3(i<<1|1,l,r))%mod;
return p;
}
inline void solve(){
build(1,1,n);
while(m--){
int op,l,r,x;
op=read(),l=read(),r=read(),x=read();
if(op==1)change1(1,l,r,x);
else if(op==2)change2(1,l,r,x);
else if(op==3)change3(1,l,r,x);
else {
if(x==1)write(query1(1,l,r)),printf("\n");
else if(x==2)write(query2(1,l,r)),printf("\n");
else write(query3(1,l,r)),printf("\n");
}
}
}
signed main(){
while(1){
n=read(),m=read();
if(n==0&&m==0)return 0;
solve();
}
return 0;
}