class UnionFind: def __init__(self, n): self.table = [-1] * n def root(self, x): stack = [] tbl = self.table while tbl[x] >= 0: stack.append(x) x = tbl[x] for y in stack: tbl[y] = x return x def find(self, x, y): return self.root(x) == self.root(y) def unite(self, x, y): r1 = self.root(x) r2 = self.root(y) if r1 == r2: return False d1 = self.table[r1] d2 = self.table[r2] if d1 <= d2: self.table[r2] = r1 self.table[r1] += d2 else: self.table[r1] = r2 self.table[r2] += d1 return True def get_size(self, x): return -self.table[self.root(x)] def solve(n): if n == 2: return [['#', '.'], ['.', '.']] if n % 2 == 0: ans2 = solve(n - 1) for i in range(n - 1): if ans2[0][i] == '#' or ans2[i][0] == '#': return [] ans = [['#', '.'] * (n // 2)] for i in range(n - 1): ans.append(['.' if i % 2 == 0 else '#'] + ans2[i]) return ans w = n // 2 def get_key(i, j): return i // 2 * w + j // 2 uft = UnionFind(w ** 2) ans = [] for i in range(n): if i % 2 == 0: ans.append(['.'] * n) else: ans.append(['.', '#'] * w + ['.']) t = 2 while t < n - 1: for i in range(t, n - 1, t * 2): for j in range(t, n - 1, t * 2): ans[i][j] = '#' uft.unite(get_key(i - 1, j - 1), get_key(i - 1, j + 1)) uft.unite(get_key(i - 1, j - 1), get_key(i + 1, j - 1)) uft.unite(get_key(i - 1, j - 1), get_key(i + 1, j + 1)) t <<= 1 ans[-1][-1] = '#' lb = get_key(n - 2, n - 2) j = lb - 1 while j > lb - w: if uft.find(j, lb): j -= 1 continue k = j - 1 while uft.find(j, k): k -= 1 k += 1 ans[-1][(k % w) * 2] = '#' ans[(k % w) * 2][-1] = '#' uft.unite(k - 1, lb) j = k - 1 return ans n = int(input()) ans = solve(n) if len(ans) == 0: print(-1) else: for row in ans: print(''.join(row))