#include <bits/stdc++.h>
using namespace std;
int countHorizontal(vector<string> &grid, int i, int j) {
int cntHoriZontal = 0;
for (int dx = 0; dx < grid.size(); dx++) {
if (j + dx < grid.size()) {
if (grid[i][j + dx] == 'X') {
cntHoriZontal++;
} else {
break;
}
}
}
return cntHoriZontal;
}
int countVertical(vector<string> &grid, int i, int j) {
int cntVertical = 0;
for (int dx = 0; dx < grid.size(); dx++) {
if (i + dx < grid.size()) {
if (grid[i + dx][j] == 'X') {
cntVertical++;
} else {
break;
}
}
}
return cntVertical;
}
int countOppositeDiagonal(vector<string> &grid, int i, int j) {
int cnt = 0;
for (int dx = 0; dx < grid.size(); dx++) {
if (i + dx < grid.size() && j - dx >= 0) {
if (grid[i + dx][j - dx] == 'X') {
cnt++;
} else {
break;
}
}
}
return cnt;
}
int countMainDiagonal(vector<string> &grid, int i, int j) {
int cnt = 0;
for (int dx = 0; dx < grid.size(); dx++) {
if (i + dx < grid.size() && j + dx < grid.size()) {
if (grid[i + dx][j + dx] == 'X') {
cnt++;
} else {
break;
}
}
}
return cnt;
}
int isWinning(vector<string> grid, int K) {
for (int i = 0; i < grid.size(); i++) {
for (int j = 0; j < grid[i].size(); j++) {
// row
if (countHorizontal(grid, i, j) >= K) {
return true;
}
// column
if (countVertical(grid, i, j) >= K) {
return true;
}
// main digoanal
if (countMainDiagonal(grid, i, j) >= K) {
return true;
}
// antigonal digoanal
if (countOppositeDiagonal(grid, i, j) >= K) {
return true;
}
}
}
return false;
}
int canWin(vector<string> grid, int K) {
for (int i = 0; i < grid.size(); i++) {
for (int j = 0; j < grid[i].size(); j++) {
if (grid[i][j] == '.') {
vector<string> copyGrid = grid;
copyGrid[i][j] = 'X';
if (isWinning(copyGrid, K)) {
return true;
}
}
}
}
return false;
}
int main() {
int T;
cin >> T;
while (T--) {
int N, K;
cin >> N >> K;
vector<string> grid;
for (int i = 0; i < N; i++) {
string s;
cin >> s;
grid.push_back(s);
}
puts(canWin(grid, K) ? "YES" : "NO");
}
return 0;
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CiAKdXNpbmcgbmFtZXNwYWNlIHN0ZDsKIAppbnQgY291bnRIb3Jpem9udGFsKHZlY3RvcjxzdHJpbmc+ICZncmlkLCBpbnQgaSwgaW50IGopIHsKCWludCBjbnRIb3JpWm9udGFsID0gMDsKCWZvciAoaW50IGR4ID0gMDsgZHggPCBncmlkLnNpemUoKTsgZHgrKykgewoJCWlmIChqICsgZHggPCBncmlkLnNpemUoKSkgewoJCQlpZiAoZ3JpZFtpXVtqICsgZHhdID09ICdYJykgewoJCQkJY250SG9yaVpvbnRhbCsrOwoJCQl9IGVsc2UgewoJCQkJYnJlYWs7CgkJCX0KCQl9Cgl9CglyZXR1cm4gY250SG9yaVpvbnRhbDsKfQogCmludCBjb3VudFZlcnRpY2FsKHZlY3RvcjxzdHJpbmc+ICZncmlkLCBpbnQgaSwgaW50IGopIHsKCWludCBjbnRWZXJ0aWNhbCA9IDA7Cglmb3IgKGludCBkeCA9IDA7IGR4IDwgZ3JpZC5zaXplKCk7IGR4KyspIHsKCQlpZiAoaSArIGR4IDwgZ3JpZC5zaXplKCkpIHsKCQkJaWYgKGdyaWRbaSArIGR4XVtqXSA9PSAnWCcpIHsKCQkJCWNudFZlcnRpY2FsKys7CgkJCX0gZWxzZSB7CgkJCQlicmVhazsKCQkJfQoJCX0KCX0KCXJldHVybiBjbnRWZXJ0aWNhbDsKfQogCmludCBjb3VudE9wcG9zaXRlRGlhZ29uYWwodmVjdG9yPHN0cmluZz4gJmdyaWQsIGludCBpLCBpbnQgaikgewoJaW50IGNudCA9IDA7Cglmb3IgKGludCBkeCA9IDA7IGR4IDwgZ3JpZC5zaXplKCk7IGR4KyspIHsKCQlpZiAoaSArIGR4IDwgZ3JpZC5zaXplKCkgJiYgaiAtIGR4ID49IDApIHsKCQkJaWYgKGdyaWRbaSArIGR4XVtqIC0gZHhdID09ICdYJykgewoJCQkJY250Kys7CgkJCX0gZWxzZSB7CgkJCQlicmVhazsKCQkJfQoJCX0KCX0KCXJldHVybiBjbnQ7Cn0KIAppbnQgY291bnRNYWluRGlhZ29uYWwodmVjdG9yPHN0cmluZz4gJmdyaWQsIGludCBpLCBpbnQgaikgewoJaW50IGNudCA9IDA7Cglmb3IgKGludCBkeCA9IDA7IGR4IDwgZ3JpZC5zaXplKCk7IGR4KyspIHsKCQlpZiAoaSArIGR4IDwgZ3JpZC5zaXplKCkgJiYgaiArIGR4IDwgZ3JpZC5zaXplKCkpIHsKCQkJaWYgKGdyaWRbaSArIGR4XVtqICsgZHhdID09ICdYJykgewoJCQkJY250Kys7CgkJCX0gZWxzZSB7CgkJCQlicmVhazsKCQkJfQoJCX0KCX0KCXJldHVybiBjbnQ7Cn0KIAppbnQgaXNXaW5uaW5nKHZlY3RvcjxzdHJpbmc+IGdyaWQsIGludCBLKSB7Cglmb3IgKGludCBpID0gMDsgaSA8IGdyaWQuc2l6ZSgpOyBpKyspIHsKCQlmb3IgKGludCBqID0gMDsgaiA8IGdyaWRbaV0uc2l6ZSgpOyBqKyspIHsKCQkJLy8gcm93CgkJCWlmIChjb3VudEhvcml6b250YWwoZ3JpZCwgaSwgaikgPj0gSykgewoJCQkJcmV0dXJuIHRydWU7CgkJCX0JCgkJCS8vIGNvbHVtbgoJCQlpZiAoY291bnRWZXJ0aWNhbChncmlkLCBpLCBqKSA+PSBLKSB7CgkJCQlyZXR1cm4gdHJ1ZTsKCQkJfQoJCQkvLyBtYWluIGRpZ29hbmFsCgkJCWlmIChjb3VudE1haW5EaWFnb25hbChncmlkLCBpLCBqKSA+PSBLKSB7CgkJCQlyZXR1cm4gdHJ1ZTsKCQkJfQoJCQkvLyBhbnRpZ29uYWwgZGlnb2FuYWwKCQkJaWYgKGNvdW50T3Bwb3NpdGVEaWFnb25hbChncmlkLCBpLCBqKSA+PSBLKSB7CgkJCQlyZXR1cm4gdHJ1ZTsKCQkJfQoJCX0KCX0KCXJldHVybiBmYWxzZTsKfQogCmludCBjYW5XaW4odmVjdG9yPHN0cmluZz4gZ3JpZCwgaW50IEspIHsKCWZvciAoaW50IGkgPSAwOyBpIDwgZ3JpZC5zaXplKCk7IGkrKykgewoJCWZvciAoaW50IGogPSAwOyBqIDwgZ3JpZFtpXS5zaXplKCk7IGorKykgewoJCQlpZiAoZ3JpZFtpXVtqXSA9PSAnLicpIHsKCQkJCXZlY3RvcjxzdHJpbmc+IGNvcHlHcmlkID0gZ3JpZDsKCQkJCWNvcHlHcmlkW2ldW2pdID0gJ1gnOwoJCQkJaWYgKGlzV2lubmluZyhjb3B5R3JpZCwgSykpIHsKCQkJCQlyZXR1cm4gdHJ1ZTsKCQkJCX0KCQkJfQoJCX0KCX0KCXJldHVybiBmYWxzZTsKfQogCmludCBtYWluKCkgewoJaW50IFQ7CgljaW4gPj4gVDsKCXdoaWxlIChULS0pIHsKCQlpbnQgTiwgSzsKCQljaW4gPj4gTiA+PiBLOwoJCXZlY3RvcjxzdHJpbmc+IGdyaWQ7CgkJZm9yIChpbnQgaSA9IDA7IGkgPCBOOyBpKyspIHsKCQkJc3RyaW5nIHM7CgkJCWNpbiA+PiBzOwoJCQlncmlkLnB1c2hfYmFjayhzKTsKCQl9CgkJcHV0cyhjYW5XaW4oZ3JpZCwgSykgPyAiWUVTIiA6ICJOTyIpOwoJfQoJcmV0dXJuIDA7Cn0g