You've got an array a, consisting of n integers. The array elements are indexed from 1 to n. Let's determine a two step operation like that:

  1. First we build by the array a an array s of partial sums, consisting of n elements. Element number i (1 ≤ i ≤ n) of array s equals <image>. The operation x mod y means that we take the remainder of the division of number x by number y. 
  2. Then we write the contents of the array s to the array a. Element number i (1 ≤ i ≤ n) of the array s becomes the i-th element of the array a (ai = si). 



You task is to find array a after exactly k described operations are applied.

Input

The first line contains two space-separated integers n and k (1 ≤ n ≤ 2000, 0 ≤ k ≤ 109). The next line contains n space-separated integers a1, a2, ..., an — elements of the array a (0 ≤ ai ≤ 109).

Output

Print n integers — elements of the array a after the operations are applied to it. Print the elements in the order of increasing of their indexes in the array a. Separate the printed numbers by spaces.

Examples

Input

3 1
1 2 3


Output

1 3 6


Input

5 0
3 14 15 92 6


Output

3 14 15 92 6
import java.io.*;
import java.math.BigInteger;
import java.util.*;
import static java.lang.Math.*;

public class C {

	void count() throws IOException {
		int n = nextInt();
		long k = nextLong();
		long mod = (long) (1e+9 + 7);
		long[] a = new long[n];
		for (int i = 0; i < n; i++) {
			a[i] = nextLong();
		}
		long[] back = new long[n + 1];
		for (int i = 1; i <= n; i++) {
			back[i] = BigInteger.valueOf(i).modInverse(BigInteger.valueOf(mod))
					.longValue();
		}
		long[] res = new long[n];
		if (k == 0) {
			for (int i = 0; i < n; i++) {
				res[i] = a[i];
			}
		} else if (k == 1) {
			res[0] = a[0];
			for (int i = 1; i < n; i++) {
				res[i] = (res[i - 1] + a[i]) % mod;
			}
		} else {
			k--;
			for (int i = 0; i < n; i++) {
				res[i] = (res[i] + a[i]) % mod;
				long cur = 1;
				for (int j = 1; i + j < n; j++) {
					cur = (cur * (k + j)) % mod * back[j] % mod;
					res[i + j] = (res[i + j] + a[i] * cur) % mod;
				}
			}
		}
		for (int i = 0; i < n; i++) {
			out.print(res[i] + " ");
		}
		out.println();
	}

	BufferedReader in;
	PrintWriter out;
	StringTokenizer str;
	String readline;

	String nextToken() throws IOException {
		while (str == null || !str.hasMoreTokens()) {
			readline = in.readLine();
			if (readline == null) {
				return null;
			} else {
				str = new StringTokenizer(readline);
			}
		}
		return str.nextToken();
	}

	int nextInt() throws IOException {
		return Integer.parseInt(nextToken());
	}

	long nextLong() throws IOException {
		return Long.parseLong(nextToken());
	}

	double nextDouble() throws IOException {
		return Double.parseDouble(nextToken());
	}

	void run() throws IOException {
		in = new BufferedReader(new InputStreamReader(System.in));
		out = new PrintWriter(System.out);
		count();
		out.close();
	}

	public static void main(String[] args) throws IOException {
		new C().run();
	}
}