#include <bits/stdc++.h>   int T;   int n, m;   bool get() {     char ch = getchar();     while (ch !=  O  && ch !=  X ) ch = getchar();     return (ch ==  X );   }   int map[21][21], con[4001][2], top, cnt[4001], head[401], nxt[100001],       b[100001], k = 1, dis[4001], pre[4001];   char ans[41][41];   int q[4001], h, t;   void push(int s, int t) {     nxt[++k] = head[s];     head[s] = k;     b[k] = t;   }   bool iscut[4001], chosen[4001], lim[4001], good[4001][4001];   std::vector<int> vec[4001];   int Cnt;   int hash(int i, int j) { return (i - 1) * m + j; }   void dfs(int x, bool *vis) {     if (vis[x]) return;     ++Cnt;     vis[x] = 1;     for (int i = head[x]; i; i = nxt[i])       if (!chosen[i >> 1]) dfs(b[i], vis);   }   int main() {     scanf( %d , &T);     for (int fd = 1; fd <= T; fd++) {       scanf( %d%d , &n, &m);       int all = 0;       top = 0;       memset(chosen, 0, sizeof chosen);       memset(lim, 0, sizeof lim);       memset(head, 0, sizeof head);       k = 1;       for (int i = 1; i <= n; i++)         for (int j = 1; j <= m; j++) map[i][j] = get(), all += (!map[i][j]);       for (int i = 1; i < n; i++)         for (int j = 1; j <= m; j++)           if (!map[i][j] && !map[i + 1][j]) {             ++top;             con[top][0] = hash(i, j);             con[top][1] = hash(i + 1, j);             push(hash(i, j), hash(i + 1, j));             push(hash(i + 1, j), hash(i, j));           }       for (int i = 1; i <= n; i++)         for (int j = 1; j < m; j++)           if (!map[i][j] && !map[i][j + 1]) {             ++top;             con[top][0] = hash(i, j);             con[top][1] = hash(i, j + 1);             push(hash(i, j), hash(i, j + 1));             push(hash(i, j + 1), hash(i, j));           }       for (int i = 1; i <= n; i++)         for (int j = 1; j <= m; j++)           if ((i + j) % 2 == 0 && (i > 1 || j > 1)) lim[hash(i, j)] = 1;       memset(cnt, 0, sizeof cnt);       for (int i = 1; i <= top; i++) {         ++cnt[con[i][0]], ++cnt[con[i][1]];       }       bool cando = 1;       for (int i = 1; i <= n; i++)         for (int j = 1; j <= m; j++)           if (lim[hash(i, j)] && cnt[hash(i, j)] <= 1 && !map[i][j]) {             cando = 0;           }       memset(good[0], 0, sizeof good[0]);       Cnt = 0;       dfs(1, good[0]);       if (Cnt < all) cando = 0;       if (!cando)         puts( NO );       else {         for (;;) {           memset(cnt, 0, sizeof cnt);           for (int i = 1; i <= top; i++)             if (!chosen[i]) {               if (lim[con[i][0]])                 ++cnt[con[i][0]];               else                 ++cnt[con[i][1]];               Cnt = 0;               chosen[i] = 1;               memset(good[i], 0, sizeof good[i]);               dfs(1, good[i]);               iscut[i] = (Cnt < all);               chosen[i] = 0;             }           for (int i = 1; i <= top; i++) vec[i].clear();           for (int i = 1; i <= top; i++)             if (chosen[i])               for (int j = 1; j <= top; j++)                 if (!chosen[j]) {                   int u = (lim[con[i][0]] ? con[i][0] : con[i][1]),                       v = (lim[con[j][0]] ? con[j][0] : con[j][1]);                   if (u == v || cnt[v] >= 3) {                     vec[j].push_back(i);                   }                   if (!iscut[j] || good[j][con[i][0]] != good[j][con[i][1]]) {                     vec[i].push_back(j);                   }                 }           h = t = 0;           for (int i = 1; i <= top; i++) {             dis[i] = 0x7f7f7f7f;             pre[i] = 0;             if (!chosen[i] && !iscut[i]) dis[i] = 0, q[++t] = i;           }           while (h < t) {             ++h;             for (int i = 0; i < vec[q[h]].size(); i++)               if (dis[vec[q[h]][i]] == 0x7f7f7f7f) {                 dis[vec[q[h]][i]] = dis[q[h]] + 1;                 q[++t] = vec[q[h]][i];                 pre[vec[q[h]][i]] = q[h];               }           }           int p = 0;           for (int i = 1; i <= top; i++) {             if (!chosen[i] && (cnt[con[i][0]] >= 3 || !lim[con[i][0]]) &&                 (cnt[con[i][1]] >= 3 || !lim[con[i][1]]) &&                 dis[i] != 0x7f7f7f7f) {               if (!p || dis[p] > dis[i]) p = i;             }           }           if (!p) break;           while (p) {             chosen[p] ^= 1;             p = pre[p];           }         }         Cnt = 0;         for (int i = 1; i <= top; i++) Cnt += (!chosen[i]);         if (Cnt != all - 1)           puts( NO );         else {           puts( YES );           for (int i = 1; i <= (n << 1); i++)             for (int j = 1; j <= (m << 1); j++) ans[i][j] =    ;           for (int i = 1; i <= n; i++)             for (int j = 1; j <= m; j++)               ans[(i << 1) - 1][(j << 1) - 1] = (map[i][j]) ?  X  :  O ;           for (int i = 1; i <= top; i++)             if (!chosen[i]) {               int u = con[i][0], v = con[i][1];               if (v == u + 1)                 ans[(((u - 1) / m + 1) << 1) - 1][((u - 1) % m + 1) << 1] =  O ;               else                 ans[(((u - 1) / m + 1) << 1)][(((u - 1) % m + 1) << 1) - 1] =  O ;             }           for (int i = 1; i < (n << 1); i++, putchar(  n ))             for (int j = 1; j < (m << 1); j++) putchar(ans[i][j]);         }       }     }   }   