#include <bits/stdc++.h>
using namespace std;
const int MOD = 1e9 + 7;
using ll = long long;
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
int n;
if(!(cin >> n)) return 0;
// Kích thước là power of two >= n
int M = 1;
while (M < n) M <<= 1;
vector<ll> f(M, 0);
for (int i = 0; i < n; ++i) cin >> f[i]; // a[i] đặt ở chỉ số i (0-based)
// FWT-OR (forward): F[mask] = sum_{submask ⊆ mask} a[submask]
for (int bit = 0; bit < __lg(M) + 1; ++bit) {
for (int mask = 0; mask < M; ++mask) if (mask & (1 << bit)) {
f[mask] = (f[mask] + f[mask ^ (1 << bit)]) % MOD;
}
}
// Bình phương hệ số trong không gian FWT
for (int mask = 0; mask < M; ++mask) f[mask] = f[mask] * f[mask] % MOD;
// FWT-OR (inverse): F[mask] = sum_{i|j=mask} a_i a_j (OR-convolution)
for (int bit = 0; bit < __lg(M) + 1; ++bit) {
for (int mask = 0; mask < M; ++mask) if (mask & (1 << bit)) {
f[mask] = (f[mask] - f[mask ^ (1 << bit)]) % MOD;
if (f[mask] < 0) f[mask] += MOD;
}
}
// Giờ f[mask] = h[mask] = sum_{i|j=mask} a_i a_j.
// Đáp án cho U là sum_{t ⊆ U} h[t] → SOS DP theo submask:
for (int bit = 0; bit < __lg(M) + 1; ++bit) {
for (int mask = 0; mask < M; ++mask) if (mask & (1 << bit)) {
f[mask] += f[mask ^ (1 << bit)];
if (f[mask] >= MOD) f[mask] -= MOD;
}
}
// In cho U = 0..n-1
for (int U = 0; U < n; ++U) {
cout << f[U] << (U + 1 == n ? '\n' : ' ');
}
return 0;
}