#include <iostream>
#include <vector>
#include <string.h>
#define ai_jiang signed main()
#define rep(a,b,c) for(int a=b;a<=c;a++)
#define drep(a,b,c) for(int a=b;a>=c;a--)
#define all(a) a.begin(),a.end()
#define ll long long
using namespace std;
using poly=vector<ll>;
namespace ai {
constexpr int N = 1e6+5,mod = 1e9+7;
int t,fa[N],dep[N],top[N],siz[N],hs[N],pi[N],ans;
char s[N];
vector<int> e[N];
vector<int> tp[N];
void clr() {
int sz=strlen(s+1);
rep(i,0,sz) e[i].clear(),tp[i].clear();
memset(fa,0,sizeof(fa));
memset(dep,0,sizeof(dep));
memset(top,0,sizeof(top));
memset(siz,0,sizeof(siz));
memset(pi,0,sizeof(pi));
memset(hs,-1,sizeof(hs));
}
void kmp(char *s) {
int sz=strlen(s+1); e[1].push_back(0); e[0].push_back(1);
for(int i=2,j=0;i<=sz;i++) {
while(j&&s[i]!=s[j+1]) j=pi[j];
if(s[i]==s[j+1]) pi[i]=(++j);
e[i].push_back(j);
e[j].push_back(i);
}
}
void dfs1(int u,int f) {
dep[u]=dep[f]+1;
siz[u]=1;
fa[u]=f;
for(auto v:e[u]) {
if(v==f) continue;
dfs1(v,u); siz[u]+=siz[v];
if(hs[u]==-1||siz[v]>siz[hs[u]]) hs[u]=v;
}
}
void dfs2(int u,int t) {
top[u]=t; tp[t].push_back(u);
if(!hs[u]) return;
dfs2(hs[u],t);
for(auto v:e[u]) {
if(v==fa[u]||v==hs[u]) continue;
dfs2(v,v);
}
}
int qry(int x) {
int tar=x>>1;
while(x) {
if(top[x]>tar) x=fa[top[x]];
else {
auto pos = lower_bound(tp[top[x]].begin(), tp[top[x]].end(), tar);
while(*pos > tar) {
if(pos == tp[top[x]].begin()) return 1;
else --pos;
}
return dep[*pos];
}
} return 1;
}
void solve() {
scanf("%s",s+1); int sz=strlen(s+1); ans=1;
clr();
kmp(s);
dfs1(0,0); dfs2(0,0);
rep(i,1,sz) ans*=(qry(i)),ans=(ans%mod+mod)%mod;
cout<<ans<<'\n';
}
}
using namespace ai;
ai_jiang {
cin.tie(0); cout.tie(0);
cin>>t;
while(t--) solve();
return 0;
}