#include<cstdio>
#include<iostream>
#include<algorithm>
#include<vector>
#include<string>
#include<queue>
#include<map>
#include<stack>
using namespace std;
char mp[205][205];
void dh(int a,int b,int i) //横线
{
for(int k=a;k<=b;k++)
mp[i][k] = '$';
}
void dv(int a,int b,int j) //竖线
{
for(int k=a;k<=b;k++)
mp[k][j] = '$';
}
void dt(int i,int j,int x,int y,int n) //左上角,右下角起始点和层数,得到第n层的外部轮廓图
{
int j1,j2,j3,j4,midj;
int i1,i2,i3,i4,midi;
j1 = j-2;
j2 = j;
j3 = y;
j4 = y+2;
i1 = i;
i2 = i+2;
i3 = x-2;
i4 = x;
if(n==1)
{
midi = (i2+i3)/2;
midj = (j2+j3)/2;
dh(j1+2,j4-2,midi);
dv(i2,i3,midj);
}
dh(j2,j3,i1);
dh(j1,j2,i2);
dh(j3,j4,i2);
dh(j1,j2,i3);
dh(j3,j4,i3);
dh(j2,j3,i4);
dv(i1,i2,j2);
dv(i1,i2,j3);
dv(i2,i3,j1);
dv(i2,i3,j4);
dv(i3,i4,j2);
dv(i3,i4,j3);
}
//思路:画出图形轮廓,设初始点坐标(i,j),将各转折点坐标用i,j表示,
int main()
{
int n;
cin>>n;
int len = 5 + 4*n;
for(int i=0;i<len;i++)
for(int j=0;j<len;j++)
mp[i][j] = '.';
for(int k=n,p=0;k>=1;k--,p++)
{
int i = 2*p;
int j = 2 + 2*p;
int x = len - 1 - 2*p;
int y = len - 3 - 2*p;
dt(i,j,x,y,k);
}
for(int i=0;i<len;i++)
{
for(int j=0;j<len;j++)
{
//cout<<mp[i][j]<<" "; 错误点,输出无用的空格
cout<<mp[i][j];
}
if(i!=len-1)cout<<endl;
}
return 0;
}