#include<bits/stdc++.h>
using namespace std;
const int N = 1e5+5;
const int mod = 1e9+7;
typedef long long ll;
int T,n;
ll pre[N],rear[N],a[N],ans,temp;
/* http://codeforces.com/gym/101810/problem/E
* 题意:给出一个n维度空间,求曼哈顿距离是1的点的对数
* (其中每个维度的坐标都为正整数)
* 我觉得这道题很有启发性!代码非常“简明”,我觉得值得总结一下
* 本题的思路是:由于坐标都为整数,要使得曼哈顿距离为1
* 就需要其中某一维的坐标差为1,其他维度坐标相同。
* 假设三维空间大小(a,b,c),
* 那么ans=(a-1)*b*c+a*(b-1)*c+a*b*(c-1);
* 如果有更多维则顺推
* 如何用程序计算呢?如果直接的乘法会有n^2的复杂度;
* 这里用的办法是前缀后缀积的办法
* 类似前缀和,把前后的数都乘好,存在pre和rear数组里(注意取模)
* 然后每一项的答案就是ans+=pre[i-1]*(a[i]-1)*rear[i+1];
* 但是!有许多细节需要琢磨
*
*/
int main(){
scanf("%d",&T);
while(T--)
{
ans=0;
scanf("%d",&n);
pre[0]=1;rear[n+1]=1;//两端之外赋为1,可以更方便;
for(int i=1;i<=n;i++)
{
scanf("%lld",&a[i]);
pre[i]=(pre[i-1]*a[i])%mod;
}
for(int i=n;i>=1;i--)
{
rear[i]=(rear[i+1]*a[i])%mod;
temp=(pre[i-1]*rear[i+1])%mod;
//注意取模以后还是1e9+7的数量级,很可能会溢出
//所以除了类型要定义成longlong外,最好先mod一次
ans=(ans+(a[i]-1)*temp)%mod;
}
printf("%lld\n",ans);
}
return 0;
}
/*
*/