#include <iostream>
#include <algorithm>
#include <vector>

using namespace std;
#define S_MAX 20
#define N_MAX 10

class Piece {
public:
  int h, w;
  char c[S_MAX][S_MAX];

  bool operator < (const Piece &p) const {
    return h*w > p.h*p.w;
  }
  void rotate() {
    char t[S_MAX][S_MAX];
    for(int i = 0; i < h; ++i) {
      for(int j = 0; j < w; ++j) {
	t[w-1-j][i] = c[i][j];
      }
    }
    swap(h, w);
    for(int i = 0; i < h; ++i) {
      for(int j = 0; j < w; ++j) {
	c[i][j] = t[i][j];
      }
    }
  }
};

int H, W;
char B[S_MAX][S_MAX];
int n;
Piece P[N_MAX];
vector<Piece> V;

bool canPut(Piece &p, int x, int y) {
  for(int i = 0; i < p.h; ++i) {
    for(int j = 0; j < p.w; ++j) {
      int nx = x + j;
      int ny = y + i;
      if(p.c[i][j] == '#') {
	if(nx < 0 || ny < 0) return false;
	if(nx >= W || ny >= H) return false;
	if(B[ny][nx] == '#') return false;
      }
    }
  }
  return true;
}

bool put(Piece &p, int x, int y) {
  if(!canPut(p, x, y)) return false;
  for(int i = 0; i < p.h; ++i) {
    for(int j = 0; j < p.w; ++j) {
      if(p.c[i][j] == '#') {
	int nx = x + j;
	int ny = y + i;
	if(nx < 0 || ny < 0) continue;
	if(nx >= W || ny >= H) continue;
	B[ny][nx] = '#';
      }
    }
  }
  return true;
}

void remove(Piece &p, int x, int y) {
  for(int i = 0; i < p.h; ++i) {
    for(int j = 0; j < p.w; ++j) {
      if(p.c[i][j] == '#') {
	int nx = x + j;
	int ny = y + i;
	if(nx >= W || ny >= H) continue;
	B[ny][nx] = '.';
      }
    }
  }
}

bool isComplete() {
  for(int i = 0; i < H; ++i) {
    for(int j = 0; j < W; ++j) {
      if(B[i][j] != '#') return false;
    }
  }
  return true;
}

bool rec(int p) {
  /*
  for(int i = 0; i < H; ++i) {
    for(int j = 0; j < W; ++j) {
      cout << B[i][j];
    }
    cout << endl;
  }
  cout << endl;*/
  if(p == V.size()) return isComplete();
  for(int i = -V[p].h; i < H; ++i) {
    for(int j = -V[p].w; j < W; ++j) {
      for(int k = 0; k < 4; ++k) {
	if(put(V[p], j, i)) {
	  bool flag = rec(p+1);
	  remove(V[p], j, i);
	  if(flag) return true;
	}
	V[p].rotate();
      }
    }
  }
  return false;
}

void solve() {
  sort(V.begin(), V.end());
  if(rec(0)) cout << "YES" << endl;
  else       cout << "NO" << endl;
}

main() {
  while((cin >> H >> W) && (H || W)) {
    for(int i = 0; i < H; ++i) {
      for(int j = 0; j < W; ++j) {
	cin >> B[i][j];
      }
    }

    cin >> n;
    for(int k = 0; k < n; ++k) {
      cin >> P[k].h >> P[k].w;
      for(int i = 0; i < P[k].h; ++i) {
	for(int j = 0; j < P[k].w; ++j) {
	  cin >> P[k].c[i][j];
	}
      }
    }

    int p;
    cin >> p;
    for(int i = 0; i < p; ++i) {
      V.clear();
      int k;
      cin >> k;
      for(int j = 0; j < k; ++j) {
	int t;
	cin >> t;
	t--;
	V.push_back(P[t]);
      }
      solve();
    }
  }
}