#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstring>
#include <cmath>
#include <queue>
#include <stack>
#include <vector>
#include <set>
#include <map>
#include <sstream>
#include <algorithm>
using namespace std;
typedef long long ll;
const int maxn=20;
const ll mod=(ll)(1e9+7);
ll bit[maxn],tp[maxn];
struct node
{
ll cnt;
ll sum;
ll sqsum;
node(ll _cnt=0,ll _sum=0,ll _sqsum=0):cnt(_cnt),sum(_sum),sqsum(_sqsum){}
}F[maxn][maxn][maxn];
node dfs(int pos,int sum,int ori,bool lead,bool limit)
{
node ret, tmp;
if(!pos) return node((sum&&ori), 0, 0);
if(!limit && !lead && F[pos][sum][ori].cnt != -1) return F[pos][sum][ori];
int endi=limit?bit[pos]:9;
tmp=node(0, 0, 0);
for (int i = 0; i <= endi; i ++) {
if(i == 7) continue;
ret = dfs(pos-1, (sum+i)%7, (ori*10+i)%7, lead&&!i, limit&&(i==endi));
tmp.cnt = (tmp.cnt + ret.cnt) % mod;
tmp.sum = (tmp.sum + ret.sum + ret.cnt * i % mod * tp[pos-1] % mod) % mod;
tmp.sqsum = (tmp.sqsum + ret.sqsum + 2 * ret.sum % mod * i % mod * tp[pos-1] % mod) % mod;
tmp.sqsum = (tmp.sqsum + i * i * tp[pos-1] % mod * tp[pos-1] % mod * ret.cnt % mod) % mod;
}
return (!limit&&!lead) ? F[pos][sum][ori] = tmp: tmp;
}
ll solve(ll x)
{
bit[0]=0;
while(x){
bit[++bit[0]]=x%10;
x/=10;
}
return dfs(bit[0],0,0,1,1).sqsum;
}
int main()
{
memset(F,-1,sizeof(F));
tp[0] = 1;
for (int i=1; i<=19; ++i) tp[i]=tp[i-1]*10 % mod;
int T;
scanf("%d", &T);
while (T--) {
long long L, R;
scanf("%lld%lld", &L, &R);
printf("%lld\n", (solve(R) - solve(L-1) + mod) % mod);
}
return 0;
}