/*
 * File: AlienAbductionAgain.cpp
 * Author: Magica
 * Date: 2014.09.02
 ****************************************/
#include <bits/stdc++.h>
using namespace std;
#define Multicase for (int TestCase = 1, TestCaseSum = xint(); TestCase <= TestCaseSum; ++TestCase)
#define __cin__ { cin.sync_with_stdio(0); cin.tie(0); }
#define inject(x) { cerr << "Function: " << __FUNCTION__ << ", Line: " << __LINE__ << ", " << #x << ": " << (x) << endl; }
#define mp make_pair
#define pb push_back
#define init(range, val) memset(range, val, sizeof(range))
typedef pair<int, int> pii;
typedef long long ll;
char buf;
int signbuf;
inline char xchar() { while (buf = getchar(), isspace(buf)); return buf; }
inline int xint() { while (buf = getchar(), (buf < '0' || buf > '9') && buf != '-'); int x = (buf == '-' ? 0 : buf - '0'); signbuf = (buf == '-' ? -1 : 1); for (; buf = getchar(), buf >= '0' && buf <= '9'; x = x * 10 + buf - '0'); return signbuf * x; }
inline int xuint() { while (buf = getchar(), buf < '0' || buf > '9'); int x = buf - '0'; for (; buf = getchar(), buf >= '0' && buf <= '9'; x = x * 10 + buf - '0'); return x; }
inline long long xll() { while (buf = getchar(), (buf < '0' || buf > '9') && buf != '-'); long long x = (buf == '-' ? 0 : buf - '0'); signbuf = (buf == '-'); for (; buf = getchar(), buf >= '0' && buf <= '9'; x = x * 10 + buf - '0'); return signbuf * x; }
inline long long xull() { while (buf = getchar(), buf < '0' || buf > '9'); long long x = buf - '0'; for (; buf = getchar(), buf >= '0' && buf <= '9'; x = x * 10 + buf - '0'); return x; }
inline string xstring() { while (buf = getchar(), buf == ' ' || buf == '\n'); string x = ""; for (x += buf; buf = getchar(), buf != ' ' && buf != '\n' && buf != '\r'; x += buf); return x; }
inline string xline() { while (buf = getchar(), buf == ' ' || buf == '\n'); string x = ""; for (x += buf; buf = getchar(), buf != '\n' && buf != '\r'; x += buf); return x; }
#define ROOT 1
#define MOD 1000000007
#define LSon(x) (x << 1)
#define RSon(x) (x << 1 | 1)
int Left[4000005], Right[4000005], Mid[4000005];
ll Lazy[4000005][4], Value[4000005], Sum[1000005][4];
inline ll Mod(ll x)
{
    x %= MOD;
    return x < 0 ? x + MOD : x;
}
inline ll GetSum(int x, int L, int R)
{
    return Mod(Sum[R][x] - (L == 0 ? 0 : Sum[L - 1][x]));
}
inline void UpdateValue(int r, int x, ll v)
{
    Value[r] = Mod(Value[r] + Mod(v * GetSum(x, Left[r], Right[r])));
}
inline void SendLazy(int r)
{
    for (int i = 0; i < 4; ++i)
        if (Lazy[r][i]) {
            Lazy[LSon(r)][i] = Mod(Lazy[LSon(r)][i] + Lazy[r][i]);
            UpdateValue(LSon(r), i, Lazy[r][i]);
            Lazy[RSon(r)][i] = Mod(Lazy[RSon(r)][i] + Lazy[r][i]);
            UpdateValue(RSon(r), i, Lazy[r][i]);
            Lazy[r][i] = 0;
        }
}
inline void Maintain(int r)
{
    Value[r] = Mod(Value[LSon(r)] + Value[RSon(r)]);
}
void BuildTree(int r, int L, int R)
{
    Left[r] = L; Right[r] = R; Mid[r] = (L + R) >> 1;
    if (L == R)
        return;
    BuildTree(LSon(r), L, Mid[r]);
    BuildTree(RSon(r), Mid[r] + 1, R);
}
void Modify(int r, int L, int R, int v[4])
{
    if (Left[r] == L && Right[r] == R) {
        for (int i = 0; i < 4; ++i) {
            Lazy[r][i] = Mod(Lazy[r][i] + v[i]);
            UpdateValue(r, i, v[i]);
        }
        return;
    }
    SendLazy(r);
    if (R <= Mid[r])
        Modify(LSon(r), L, R, v);
    else if (L > Mid[r])
        Modify(RSon(r), L, R, v);
    else {
        Modify(LSon(r), L, Mid[r], v);
        Modify(RSon(r), Mid[r] + 1, R, v);
    }
    Maintain(r);
}
ll Query(int r, int L, int R)
{
    if (Left[r] == L && Right[r] == R)
        return Value[r];
    SendLazy(r);
    if (R <= Mid[r])
        return Query(LSon(r), L, R);
    if (L > Mid[r])
        return Query(RSon(r), L, R);
    return Mod(Query(LSon(r), L, Mid[r]) + Query(RSon(r), Mid[r] + 1, R));
}
int main()
{
    int i, j, n;
    int x1, x2, v[4];
    ll cur, E;
    for (i = 0; i < 1000000; ++i) {
        cur = 1;
        for (j = 0; j < 4; ++j) {
            Sum[i][j] = Mod((i ? Sum[i - 1][j] : 0) + cur);
            cur = Mod(cur * i);
        }
    }
    BuildTree(ROOT, 0, 999999);
    Multicase {
        printf("Case #%d:\n", TestCase);
        init(Value, 0);
        init(Lazy, 0);
        n = xuint();
        for (i = 0; i < n; ++i)
            if (xchar() == 'p') {
                x1 = xuint(); x2 = xuint();
                for (j = 3; ~j; --j)
                    v[j] = xint();
                Modify(ROOT, x1, x2, v);
            }
            else {
                x1 = xuint(); x2 = xuint();
                for (j = 3; ~j; --j)
                    v[j] = xint();
                printf("%lld\n", E = Query(ROOT, x1, x2));
                Modify(ROOT, min(x1 * E % 1000000, x2 * E % 1000000),
                             max(x1 * E % 1000000, x2 * E % 1000000), v);
            }
    }
    return 0;
}
