#include <cstdio>
#include <vector>
#include <algorithm>
#include <cassert>
#include <cstdlib>
#include <cstring>
#include <iostream>
#define int long long
using namespace std;
inline int gi(){
char tmp=getchar();int ans=0;
while(!isdigit(tmp)) tmp=getchar();
while(isdigit(tmp)){
ans = ans * 10 + tmp - '0';
tmp = getchar();
}
return ans;
}
const int N = 1e6;
const int Mod = 1e9 + 7 ;
struct Edg{
int v,nxt;
}Edge[N<<1];int Head[N],cnt;
inline void Add(int u,int v){
Edge[++cnt].v=v;Edge[cnt].nxt=Head[u];Head[u]=cnt;
}
int F[N],G[N];
vector<int> V[N],Pre[N],Suf[N];
void Dfs1(int pos,int fa){
F[pos]=1;
for(int i = Head[pos];i;i=Edge[i].nxt){
int arr = Edge[i].v;
if(arr == fa) continue;
Dfs1(arr,pos);
Pre[pos].push_back(F[arr]+1);
Suf[pos].push_back(F[arr]+1);
V[pos].push_back(arr);
F[pos] *= (F[arr] + 1);
F[pos] %= Mod;
}
if(V[pos].size() == 0) return ;
for(int i=0;i<V[pos].size();++i){
int arr = V[pos][i];
Pre[pos][i] = F[arr] + 1;
if(i!=0)
Pre[pos][i] = Pre[pos][i-1] * Pre[pos][i] % Mod;
}
for(int i=V[pos].size()-1;~i;--i){
int arr = V[pos][i];
Suf[pos][i] = F[arr] + 1;
if(i != V[pos].size()-1)
Suf[pos][i] = Suf[pos][i+1] * Suf[pos][i] % Mod;
}
}
void Dfs2(int pos,int fa){
if(V[pos].size() == 0) return ;
for(int i = 0;i < V[pos].size();++i){
int arr = V[pos][i];
int q,p;
if(i==0) p = 1;
else p = Pre[pos][i-1];
if(i == V[pos].size()-1) q = 1;
else q = Suf[pos][i+1];
G[arr] = (G[pos] * q%Mod * p%Mod +1) %Mod;
Dfs2(arr,pos);
}
}
signed main()
{
#ifdef TSUKIAKIOI
freopen("data.in","r",stdin);
#endif
int n=gi();
for(int i=2;i<=n;++i){
int v = gi();
Add(v,i);Add(i,v);
}
Dfs1(1,0);
G[1]=1;
Dfs2(1,0);
for(int i=1;i<=n;++i)
printf("%lld ",F[i]*G[i]%Mod);
return 0;
}