#include <stdio.h>
#include <string>
#include <stdlib.h>
#include <iostream>
using namespace std;
void addi(char *s,int size,int pos)
{
char *sum;
int l1=pos,l2=size-pos-1;
int maxl=(l1>=l2)?l1:l2;
sum = (char*)malloc((maxl+1)*sizeof(char));
int c=0,k=maxl,m,n;
for(m=pos-1,n=size-1;m>=0&&n>pos;m--,n--)
{
int a=s[m]-'0',b=s[n]-'0',ts;
ts=a+b+c;
if(ts>=10)
{
c=1;
}
else c=0;
sum[k--]=ts%10;
//printf("a=%d b=%d c=%d sum[%d]=%d\n",a,b,c,k+1,sum[k+1]);
}
//printf("m=%d n=%d\n",m,n);
if(m!=-1)
{
while(m>=0)
{
int a=s[m]-'0',b=0,ts=a+b+c;
if(ts>=10) c=1;
else c=0;
sum[k--]=ts%10;
//printf("a=%d b=%d c=%d sum[%d]=%d\n",a,b,c,k+1,sum[k+1]);
m--;
}
}
else if(n!=pos)
{
while(n>pos)
{
int a=0,b=s[n]-'0',ts=a+b+c;
if(ts>=10) c=1;
else c=0;
sum[k--]=ts%10;
//printf("a=%d b=%d c=%d sum[%d]=%d\n",a,b,c,k+1,sum[k+1]);
n--;
}
}
if(m==-1&&n==pos) if(c==1) sum[k--]=c;
//printf("k=%d\n",k);
int l3=maxl-k,sp1=0,sp2=0,sp3=0,sp;
//printf("l1=%d l2=%d l3=%d\n",l1,l2,l3);
if(l1>=l2+1)
{
if(l2+1>=l3)
{
sp1=0;sp2=l1-l2-1;sp3=l1-l3;sp=l1;
}
else if(l1>l3)
{
sp1=0;sp2=l1-l2-1;sp3=l1-l3;sp=l1;
}
else
{
sp1=l3-l1;sp2=l3-l2-1;sp3=0;sp=l3;
}
}
else
{
if(l1>=l3)
{
sp1=l2+1-l1;sp2=0;sp3=l2+1-l3;sp=l2+1;
//printf("sp=%d sp1=%d sp2=%d sp3=%d\n",sp,sp1,sp2,sp3);
//printf("yes\n");
}
else if(l2+1>=l3)
{
sp1=l2+1-l1;sp2=0;sp3=l2+1-l3;sp=l2+1;
//printf("2bbnd\n");
}
else
{
sp1=l3-l1;sp2=l3-l2-1;sp3=0;sp=l3;
//printf("thrid\n");
}
}
//printf("sp=%d sp1=%d sp2=%d sp3=%d\n",sp,sp1,sp2,sp3);
for(int i=0;i<sp1;i++) {printf(" ");}
for(int i=0;i<l1;i++)
{
printf("%c",s[i]);
}
printf("\n");
for(int i=0;i<sp2;i++)
{
printf(" ");
}
printf("+");
int g=pos+1;
for(int i=0;i<l2;i++)
{
printf("%c",s[g++]);
}
printf("\n");
if(l3>=l2+1)
{
sp=l3;
}
else
{
sp=l2+1;
}
for(int i=0;i<l1-sp;i++)
{
printf(" ");
}
for(int i=0;i<sp;i++)
{
printf("-");
}
printf("\n");
for(int i=0;i<sp3;i++) printf(" ");
for(int i=k+1;i<maxl+1;i++) printf("%d",sum[i]);
printf("\n");
}
void sub(char *s,int size,int pos)
{
char *sum;
int l1=pos,l2=size-pos-1;
int maxl=(l1>=l2)?l1:l2;
sum = (char*)malloc((maxl)*sizeof(char));
int c=0,k=maxl-1,m,n;
for(m=pos-1,n=size-1;m>=0&&n>pos;m--,n--)
{
int a=s[m]-'0',b=s[n]-'0';
if(a+c>=b) {sum[k--]=a-b+c;c=0;}
else
{
sum[k--]=a+c-b+10;
c=-1;
}
//printf("a=%d b=%d c=%d sum[%d]=%d\n",a,b,c,k+1,sum[k+1]);
}
//printf("m=%d n=%d\n",m,n);
if(m!=-1)
{
while(m>=0)
{
int a=s[m]-'0',b=0;
if(a+c>=b) {sum[k--]=a-b+c;c=0;}
else
{
sum[k--]=a+c-b+10;
c=-1;
}
//printf("a=%d b=%d c=%d sum[%d]=%d\n",a,b,c,k+1,sum[k+1]);
m--;
}
}
//if(m==-1&&n==pos) if(c==1) sum[k--]=c;
for(int i=0;i<maxl;i++) if(sum[i]) { k=i;break;}
//printf("k=%d\n",k);
int l3=maxl-k,sp1=0,sp2=0,sp3=0,sp;
if(l1>=l2+1)
{
if(l2+1>=l3)
{
sp1=0;sp2=l1-l2-1;sp3=l1-l3;sp=l1;
}
else if(l1>l3)
{
sp1=0;sp2=l1-l2-1;sp3=l1-l3;sp=l1;
}
else
{
sp1=l3-l1;sp2=l3-l2-1;sp3=0;sp=l3;
}
}
else
{
if(l1>=l3)
{
sp1=l2+1-l1;sp2=0;sp3=l2+1-l3;sp=l2+1;
}
else if(l2+1>=l3)
{
sp1=l2+1-l1;sp2=0;sp3=l2+1-l3;sp=l2+1;
}
else
{
sp1=l3-l1;sp2=l3-l2-1;sp3=0;sp=l3;
}
}
//printf("sp=%d sp1=%d sp2=%d sp3=%d\n",sp,sp1,sp2,sp3);
for(int i=0;i<sp1;i++) {printf(" ");}
for(int i=0;i<l1;i++)
{
printf("%c",s[i]);
}
printf("\n");
for(int i=0;i<sp2;i++)
{
printf(" ");
}
printf("-");
int g=pos+1;
for(int i=0;i<l2;i++)
{
printf("%c",s[g++]);
}
printf("\n");
if(l3>=l2+1)
{
sp=l3;
}
else
{
sp=l2+1;
}
for(int i=0;i<l1-sp;i++)
{
printf(" ");
}
for(int i=0;i<sp;i++)
{
printf("-");
}
printf("\n");
for(int i=0;i<sp3;i++) printf(" ");
for(int i=k;i<maxl;i++) printf("%d",sum[i]);
printf("\n");
}
void mult(char *s,int size,int pos)
{
int l1=pos,l2=size-pos-1;
char **sum,*product;
//printf("mult\n");
sum=(char**)malloc(l2*sizeof(char*));
int *len=(int*) malloc((l2)*sizeof(int));
for(int i=0;i<l2;i++) len[i]=0;
//printf("adf\n");
product=(char*)malloc((l1+l2)*sizeof(char));
for(int i=0;i<l2+l1;i++) product[i]=0;
//printf("pr0=0 sum[0][0]\n");
for(int i=0;i<l2;i++)
{
//printf("int\n");
sum[i]=(char*) malloc((l1+1)*sizeof(char));
sum[i][0]='0';
//printf("int1\n");
}
//printf("sumi0=0\n");
int row=0;
for(int i=size-1;i>pos;i--,row++)
{
int b=s[i]-'0',c=0;
int col=l1;
//printf("innerlop\n");
for(int j=pos-1;j>=0;j--,col--)
{
int a=s[j]-'0';
int pr=a*b+c;
if(pr>=10)
{
//printf("befpr>10 i=%d j=%d row=%d col=%d\n",i,j,row,col);
sum[row][col]=pr%10;
c=pr/10;
//printf("aftpr>10 i=%d j=%d row=%d col=%d\n sum=%d",i,j,row,col,sum[row][col]);
}
else
{
//printf("befpr<10 i=%d j=%d row=%d col=%d\n",i,j,row,col);
sum[row][col]=pr;
c=0;
//printf("aftpr<10 i=%d j=%d row=%d col=%d\n sum=%d",i,j,row,col,sum[row][col]);
}
}
sum[row][col]=c;
if(!c)
{
len[row]=l1;
}
else
{
len[row]=l1+1;
}
if(!b) len[row]=1;
}
//for(int i=0;i<l2;i++) printf("len[%d]=%d\n",i,len[i]);
int car=0,m=l2+l1-1,n=0,temp=0;
for(int n=l1;n>=0;n--)
{
int i=0,k=n;
temp=0;
while(i<l2&&k<l1+1)
{
temp+=sum[i++][k++];
}
temp+=car;
if(temp>=10)
{
product[m]=(temp)%10;
car=temp/10;
m--;
}
else
{
product[m]=(temp);
car=0;
m--;
}
//printf("product[%d]=%d\n",m+1,product[m+1]);
}
//printf("m=%d n=%d\n",m,n);
for(int n=1;n<l2;n++)
{
int i=n,k=0;
temp=0;
while(i<l2&&k<l1+1)
{
temp+=sum[i++][k++];
}
temp+=car;
if(temp>=10)
{
product[m]=temp%10;
car=temp/10;
m--;
}
else
{
product[m]=temp;
car=0;m--;
}
//printf("product[%d]=%d\n",m+1,product[m+1]);
}
product[m]=car;
int prlen;
if(product[0]) prlen=l2+l1;
else prlen=l2+l1-1;
//printf("m=%d n=%d prlen=%d l1=%d l2=%d\n",m,n,prlen,l1,l2);
int max=prlen;
if(prlen<l2+1) max=l2+1;
for(int i=0;i<max-l1;i++)
{
printf(" ");
}
for(int i=0;i<l1;i++)
{
printf("%c",s[i]);
}
printf("\n");
for(int i=0;i<max-l2-1;i++)
{
printf(" ");
}
for(int i=pos;i<size;i++)
{
printf("%c",s[i]);
}
printf("\n");
if(len[0]>=l2+1)
{
for(int i=0;i<max-len[0];i++)
{
printf(" ");
}
for(int i=0;i<len[0];i++)
{
printf("-");
}
}
else
{
for(int i=0;i<max-l2-1;i++)
{
printf(" ");
}
for(int i=0;i<l2+1;i++)
{
printf("-");
}
}
printf("\n");
for(int i=0;i<l2;i++)
{
//printf("as i=%d len[i]=%d j=%d l1+1=%d",i,len[i],l1-len[i]+1,l1+1);
for(int j=0;j<max-len[i]-i;j++)
{
printf(" ");
}
//printf("i=%d len[i]=%d j=%d l1+1=%d",i,len[i],l1-len[i]+1,l1+1);
for(int j=l1-len[i]+1;j<l1+1;j++)
{
//printf("ai=%d j=%d",i,j);
printf("%d",sum[i][j]);
}
printf("\n");
}
for(int i=0;i<max-prlen;i++)
{
printf(" ");
}
for(int i=0;i<prlen;i++)
{
printf("-");
}
printf("\n");
for(int i=0;i<max-prlen;i++)
{
printf(" ");
}
for(int i=l1+l2-prlen;i<l1+l2;i++)
{
printf("%d",product[i]);
}
printf("\n");
}
int main()
{
int t;
scanf("%d",&t);
for(int i=0;i<t;i++)
{
char s[1001];
scanf("%s",s);
int op=0,pos;
int a,b,j;
for(j=0;s[j]!='\0';j++)
{
if(s[j]=='+')
{
//printf("addi\n");
op=1;
pos=j;
}
else if(s[j]=='-')
{
//printf("sub\n");
op=2;
pos=j;
}
else if(s[j]=='*')
{
//printf("mult\n");
op=3;
pos=j;
}
}
if(op==1)
{
addi(s,j,pos);
printf("\n");
}
else if(op==2)
{
sub(s,j,pos);
printf("\n");
}
else if(op==3)
{
mult(s,j,pos);
printf("\n");
}
}
}
I2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdHJpbmc+CiNpbmNsdWRlIDxzdGRsaWIuaD4KI2luY2x1ZGUgPGlvc3RyZWFtPgp1c2luZyBuYW1lc3BhY2Ugc3RkOwp2b2lkIGFkZGkoY2hhciAqcyxpbnQgc2l6ZSxpbnQgcG9zKQp7CiAgICBjaGFyICpzdW07CiAgICBpbnQgbDE9cG9zLGwyPXNpemUtcG9zLTE7CiAgICBpbnQgbWF4bD0obDE+PWwyKT9sMTpsMjsKICAgIHN1bSAgICA9IChjaGFyKiltYWxsb2MoKG1heGwrMSkqc2l6ZW9mKGNoYXIpKTsKCiAgICBpbnQgYz0wLGs9bWF4bCxtLG47CiAgICBmb3IobT1wb3MtMSxuPXNpemUtMTttPj0wJiZuPnBvczttLS0sbi0tKQogICAgewogICAgICAgIGludCBhPXNbbV0tJzAnLGI9c1tuXS0nMCcsdHM7CiAgICAgICAgdHM9YStiK2M7CiAgICAgICAgaWYodHM+PTEwKQogICAgICAgIHsKICAgICAgICAgICAgYz0xOwogICAgICAgIH0KICAgICAgICBlbHNlIGM9MDsKICAgICAgICBzdW1bay0tXT10cyUxMDsKICAgICAgICAvL3ByaW50ZigiYT0lZCBiPSVkIGM9JWQgc3VtWyVkXT0lZFxuIixhLGIsYyxrKzEsc3VtW2srMV0pOwogICAgfQogICAgLy9wcmludGYoIm09JWQgbj0lZFxuIixtLG4pOwogICAgCiAgICAgICAgaWYobSE9LTEpCiAgICAgICAgewogICAgICAgICAgICB3aGlsZShtPj0wKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpbnQgYT1zW21dLScwJyxiPTAsdHM9YStiK2M7CiAgICAgICAgICAgICAgICBpZih0cz49MTApIGM9MTsKICAgICAgICAgICAgICAgIGVsc2UgYz0wOwogICAgICAgICAgICAgICAgc3VtW2stLV09dHMlMTA7CiAgICAgICAgICAgICAgICAvL3ByaW50ZigiYT0lZCBiPSVkIGM9JWQgc3VtWyVkXT0lZFxuIixhLGIsYyxrKzEsc3VtW2srMV0pOwogICAgICAgICAgICAgICAgbS0tOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYobiE9cG9zKQogICAgICAgIHsKICAgICAgICAgICAgd2hpbGUobj5wb3MpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGludCBhPTAsYj1zW25dLScwJyx0cz1hK2IrYzsKICAgICAgICAgICAgICAgIGlmKHRzPj0xMCkgYz0xOwogICAgICAgICAgICAgICAgZWxzZSBjPTA7CiAgICAgICAgICAgICAgICBzdW1bay0tXT10cyUxMDsKICAgICAgICAgICAgICAgIC8vcHJpbnRmKCJhPSVkIGI9JWQgYz0lZCBzdW1bJWRdPSVkXG4iLGEsYixjLGsrMSxzdW1baysxXSk7CiAgICAgICAgICAgICAgICBuLS07CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaWYobT09LTEmJm49PXBvcykgaWYoYz09MSkgc3VtW2stLV09YzsKICAgIC8vcHJpbnRmKCJrPSVkXG4iLGspOwogICAgaW50IGwzPW1heGwtayxzcDE9MCxzcDI9MCxzcDM9MCxzcDsKICAgIC8vcHJpbnRmKCJsMT0lZCBsMj0lZCBsMz0lZFxuIixsMSxsMixsMyk7CiAgICBpZihsMT49bDIrMSkKICAgIHsKICAgICAgICBpZihsMisxPj1sMykgCiAgICAgICAgewogICAgICAgICAgICBzcDE9MDtzcDI9bDEtbDItMTtzcDM9bDEtbDM7c3A9bDE7CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYobDE+bDMpCiAgICAgICAgewogICAgICAgICAgICBzcDE9MDtzcDI9bDEtbDItMTtzcDM9bDEtbDM7c3A9bDE7CiAgICAgICAgfQogICAgICAgIGVsc2UgCiAgICAgICAgewogICAgICAgICAgICBzcDE9bDMtbDE7c3AyPWwzLWwyLTE7c3AzPTA7c3A9bDM7CiAgICAgICAgfQoKICAgIH0KICAgIGVsc2UKICAgIHsKICAgICAgICBpZihsMT49bDMpIAogICAgICAgIHsKICAgICAgICAgICAgc3AxPWwyKzEtbDE7c3AyPTA7c3AzPWwyKzEtbDM7c3A9bDIrMTsKICAgICAgICAgICAgLy9wcmludGYoInNwPSVkIHNwMT0lZCBzcDI9JWQgc3AzPSVkXG4iLHNwLHNwMSxzcDIsc3AzKTsKICAgICAgICAgICAgLy9wcmludGYoInllc1xuIik7CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYobDIrMT49bDMpCiAgICAgICAgewogICAgICAgICAgICBzcDE9bDIrMS1sMTtzcDI9MDtzcDM9bDIrMS1sMztzcD1sMisxOwogICAgICAgICAgICAvL3ByaW50ZigiMmJibmRcbiIpOwogICAgICAgIH0KICAgICAgICBlbHNlIAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBzcDE9bDMtbDE7c3AyPWwzLWwyLTE7c3AzPTA7c3A9bDM7CiAgICAgICAgICAgICAgICAvL3ByaW50ZigidGhyaWRcbiIpOwogICAgICAgICAgICB9CgogICAgfQogICAgLy9wcmludGYoInNwPSVkIHNwMT0lZCBzcDI9JWQgc3AzPSVkXG4iLHNwLHNwMSxzcDIsc3AzKTsKICAgIGZvcihpbnQgaT0wO2k8c3AxO2krKykge3ByaW50ZigiICIpO30KICAgIGZvcihpbnQgaT0wO2k8bDE7aSsrKSAKICAgICAgICB7CiAgICAgICAgICAgIHByaW50ZigiJWMiLHNbaV0pOwogICAgICAgIH0KICAgIHByaW50ZigiXG4iKTsKICAgIGZvcihpbnQgaT0wO2k8c3AyO2krKykgCiAgICAgICAgewogICAgICAgICAgICBwcmludGYoIiAiKTsKICAgICAgICB9CiAgICBwcmludGYoIisiKTsKICAgIGludCBnPXBvcysxOwogICAgZm9yKGludCBpPTA7aTxsMjtpKyspIAogICAgewogICAgICAgIHByaW50ZigiJWMiLHNbZysrXSk7CgogICAgfQogICAgcHJpbnRmKCJcbiIpOwogICAgaWYobDM+PWwyKzEpCiAgICB7CiAgICAgICAgc3A9bDM7CiAgICB9CiAgICBlbHNlIAogICAgewogICAgICAgIHNwPWwyKzE7CiAgICB9CiAgICBmb3IoaW50IGk9MDtpPGwxLXNwO2krKykKICAgIHsKICAgICAgICBwcmludGYoIiAiKTsKICAgIH0KICAgIGZvcihpbnQgaT0wO2k8c3A7aSsrKSAKICAgICAgICB7CiAgICAgICAgICAgIHByaW50ZigiLSIpOwogICAgICAgIH0KICAgIHByaW50ZigiXG4iKTsKICAgIGZvcihpbnQgaT0wO2k8c3AzO2krKykgcHJpbnRmKCIgIik7CiAgICBmb3IoaW50IGk9aysxO2k8bWF4bCsxO2krKykgcHJpbnRmKCIlZCIsc3VtW2ldKTsKICAgICAgICBwcmludGYoIlxuIik7CgoKfQp2b2lkIHN1YihjaGFyICpzLGludCBzaXplLGludCBwb3MpCnsKICAgIGNoYXIgKnN1bTsKICAgIGludCBsMT1wb3MsbDI9c2l6ZS1wb3MtMTsKICAgIGludCBtYXhsPShsMT49bDIpP2wxOmwyOwogICAgc3VtICAgID0gKGNoYXIqKW1hbGxvYygobWF4bCkqc2l6ZW9mKGNoYXIpKTsKCiAgICBpbnQgYz0wLGs9bWF4bC0xLG0sbjsKICAgIGZvcihtPXBvcy0xLG49c2l6ZS0xO20+PTAmJm4+cG9zO20tLSxuLS0pCiAgICB7CiAgICAgICAgaW50IGE9c1ttXS0nMCcsYj1zW25dLScwJzsKICAgICAgICBpZihhK2M+PWIpIHtzdW1bay0tXT1hLWIrYztjPTA7fQogICAgICAgIGVsc2UKICAgICAgICB7CiAgICAgICAgICAgIHN1bVtrLS1dPWErYy1iKzEwOwogICAgICAgICAgICBjPS0xOwogICAgICAgIH0KICAgICAgICAvL3ByaW50ZigiYT0lZCBiPSVkIGM9JWQgc3VtWyVkXT0lZFxuIixhLGIsYyxrKzEsc3VtW2srMV0pOwogICAgfQogICAgLy9wcmludGYoIm09JWQgbj0lZFxuIixtLG4pOwogICAgCiAgICAgICAgaWYobSE9LTEpCiAgICAgICAgewogICAgICAgICAgICB3aGlsZShtPj0wKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpbnQgYT1zW21dLScwJyxiPTA7CiAgICAgICAgICAgICAgICBpZihhK2M+PWIpIHtzdW1bay0tXT1hLWIrYztjPTA7fQogICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHN1bVtrLS1dPWErYy1iKzEwOwogICAgICAgICAgICAgICAgICAgIGM9LTE7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAvL3ByaW50ZigiYT0lZCBiPSVkIGM9JWQgc3VtWyVkXT0lZFxuIixhLGIsYyxrKzEsc3VtW2srMV0pOwogICAgICAgICAgICAgICAgbS0tOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIC8vaWYobT09LTEmJm49PXBvcykgaWYoYz09MSkgc3VtW2stLV09YzsKICAgIGZvcihpbnQgaT0wO2k8bWF4bDtpKyspIGlmKHN1bVtpXSkgeyBrPWk7YnJlYWs7fQogICAgLy9wcmludGYoIms9JWRcbiIsayk7ICAKICAgIGludCBsMz1tYXhsLWssc3AxPTAsc3AyPTAsc3AzPTAsc3A7CiAgICBpZihsMT49bDIrMSkKICAgIHsKICAgICAgICBpZihsMisxPj1sMykgCiAgICAgICAgewogICAgICAgICAgICBzcDE9MDtzcDI9bDEtbDItMTtzcDM9bDEtbDM7c3A9bDE7CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYobDE+bDMpCiAgICAgICAgewogICAgICAgICAgICBzcDE9MDtzcDI9bDEtbDItMTtzcDM9bDEtbDM7c3A9bDE7CiAgICAgICAgfQogICAgICAgIGVsc2UgCiAgICAgICAgewogICAgICAgICAgICBzcDE9bDMtbDE7c3AyPWwzLWwyLTE7c3AzPTA7c3A9bDM7CiAgICAgICAgfQoKICAgIH0KICAgIGVsc2UKICAgIHsKICAgICAgICBpZihsMT49bDMpIAogICAgICAgIHsKICAgICAgICAgICAgc3AxPWwyKzEtbDE7c3AyPTA7c3AzPWwyKzEtbDM7c3A9bDIrMTsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZihsMisxPj1sMykKICAgICAgICB7CiAgICAgICAgICAgIHNwMT1sMisxLWwxO3NwMj0wO3NwMz1sMisxLWwzO3NwPWwyKzE7CiAgICAgICAgfQogICAgICAgIGVsc2UgCiAgICAgICAgewogICAgICAgICAgICBzcDE9bDMtbDE7c3AyPWwzLWwyLTE7c3AzPTA7c3A9bDM7CiAgICAgICAgfQoKICAgIH0KICAgIC8vcHJpbnRmKCJzcD0lZCBzcDE9JWQgc3AyPSVkIHNwMz0lZFxuIixzcCxzcDEsc3AyLHNwMyk7CiAgICBmb3IoaW50IGk9MDtpPHNwMTtpKyspIHtwcmludGYoIiAiKTt9CiAgICBmb3IoaW50IGk9MDtpPGwxO2krKykgCiAgICAgICAgewogICAgICAgICAgICBwcmludGYoIiVjIixzW2ldKTsKICAgICAgICB9CiAgICBwcmludGYoIlxuIik7CiAgICBmb3IoaW50IGk9MDtpPHNwMjtpKyspIAogICAgICAgIHsKICAgICAgICAgICAgcHJpbnRmKCIgIik7CiAgICAgICAgfQogICAgcHJpbnRmKCItIik7CiAgICBpbnQgZz1wb3MrMTsKICAgIGZvcihpbnQgaT0wO2k8bDI7aSsrKSAKICAgIHsKICAgICAgICBwcmludGYoIiVjIixzW2crK10pOwoKICAgIH0KICAgIHByaW50ZigiXG4iKTsKICAgIGlmKGwzPj1sMisxKSAKICAgIHsKICAgICAgICBzcD1sMzsKICAgIH0KICAgIGVsc2UgCiAgICB7CiAgICAgICAgc3A9bDIrMTsKICAgIH0KICAgIGZvcihpbnQgaT0wO2k8bDEtc3A7aSsrKQogICAgewogICAgICAgIHByaW50ZigiICIpOwogICAgfQogICAgZm9yKGludCBpPTA7aTxzcDtpKyspIAogICAgICAgIHsKICAgICAgICAgICAgcHJpbnRmKCItIik7CiAgICAgICAgfQogICAgcHJpbnRmKCJcbiIpOwogICAgZm9yKGludCBpPTA7aTxzcDM7aSsrKSBwcmludGYoIiAiKTsKICAgIGZvcihpbnQgaT1rO2k8bWF4bDtpKyspIHByaW50ZigiJWQiLHN1bVtpXSk7CiAgICAgICAgcHJpbnRmKCJcbiIpOwoKfQp2b2lkIG11bHQoY2hhciAqcyxpbnQgc2l6ZSxpbnQgcG9zKQp7CiAgICBpbnQgbDE9cG9zLGwyPXNpemUtcG9zLTE7CiAgICBjaGFyICoqc3VtLCpwcm9kdWN0OwogICAgLy9wcmludGYoIm11bHRcbiIpOwogICAgc3VtPShjaGFyKiopbWFsbG9jKGwyKnNpemVvZihjaGFyKikpOwogICAgaW50ICpsZW49KGludCopIG1hbGxvYygobDIpKnNpemVvZihpbnQpKTsKICAgIGZvcihpbnQgaT0wO2k8bDI7aSsrKSBsZW5baV09MDsKICAgIC8vcHJpbnRmKCJhZGZcbiIpOwogICAgcHJvZHVjdD0oY2hhciopbWFsbG9jKChsMStsMikqc2l6ZW9mKGNoYXIpKTsKICAgIGZvcihpbnQgaT0wO2k8bDIrbDE7aSsrKSBwcm9kdWN0W2ldPTA7CiAgICAvL3ByaW50ZigicHIwPTAgc3VtWzBdWzBdXG4iKTsKICAgIGZvcihpbnQgaT0wO2k8bDI7aSsrKSAgICAKICAgICAgICB7CiAgICAgICAgICAgIC8vcHJpbnRmKCJpbnRcbiIpOwogICAgICAgICAgICBzdW1baV09KGNoYXIqKSBtYWxsb2MoKGwxKzEpKnNpemVvZihjaGFyKSk7CiAgICAgICAgICAgIHN1bVtpXVswXT0nMCc7CiAgICAgICAgICAgIC8vcHJpbnRmKCJpbnQxXG4iKTsKICAgICAgICB9CiAgICAvL3ByaW50Zigic3VtaTA9MFxuIik7CiAgICBpbnQgcm93PTA7CiAgICBmb3IoaW50IGk9c2l6ZS0xO2k+cG9zO2ktLSxyb3crKykKICAgIHsKICAgICAgICBpbnQgYj1zW2ldLScwJyxjPTA7CiAgICAgICAgaW50IGNvbD1sMTsKICAgICAgICAvL3ByaW50ZigiaW5uZXJsb3BcbiIpOyAKICAgICAgICBmb3IoaW50IGo9cG9zLTE7aj49MDtqLS0sY29sLS0pCiAgICAgICAgewogICAgICAgICAgICBpbnQgYT1zW2pdLScwJzsKICAgICAgICAgICAgaW50IHByPWEqYitjOwogICAgICAgICAgICBpZihwcj49MTApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vcHJpbnRmKCJiZWZwcj4xMCBpPSVkIGo9JWQgcm93PSVkIGNvbD0lZFxuIixpLGoscm93LGNvbCk7CiAgICAgICAgICAgICAgICBzdW1bcm93XVtjb2xdPXByJTEwOwogICAgICAgICAgICAgICAgYz1wci8xMDsKICAgICAgICAgICAgICAgIC8vcHJpbnRmKCJhZnRwcj4xMCBpPSVkIGo9JWQgcm93PSVkIGNvbD0lZFxuIHN1bT0lZCIsaSxqLHJvdyxjb2wsc3VtW3Jvd11bY29sXSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvL3ByaW50ZigiYmVmcHI8MTAgaT0lZCBqPSVkIHJvdz0lZCBjb2w9JWRcbiIsaSxqLHJvdyxjb2wpOwogICAgICAgICAgICAgICAgc3VtW3Jvd11bY29sXT1wcjsKICAgICAgICAgICAgICAgIGM9MDsKICAgICAgICAgICAgICAgIC8vcHJpbnRmKCJhZnRwcjwxMCBpPSVkIGo9JWQgcm93PSVkIGNvbD0lZFxuIHN1bT0lZCIsaSxqLHJvdyxjb2wsc3VtW3Jvd11bY29sXSk7CiAgICAgICAgICAgIH0KCiAgICAgICAgfQogICAgICAgIHN1bVtyb3ddW2NvbF09YzsKICAgICAgICBpZighYykKICAgICAgICB7CiAgICAgICAgICAgIGxlbltyb3ddPWwxOwogICAgICAgIH0KICAgICAgICBlbHNlCiAgICAgICAgewogICAgICAgICAgICBsZW5bcm93XT1sMSsxOwogICAgICAgIH0KICAgICAgICBpZighYikgbGVuW3Jvd109MTsKICAgIH0KICAgIAogICAgLy9mb3IoaW50IGk9MDtpPGwyO2krKykgcHJpbnRmKCJsZW5bJWRdPSVkXG4iLGksbGVuW2ldKTsKICAgIGludCBjYXI9MCxtPWwyK2wxLTEsbj0wLHRlbXA9MDsKICAgIGZvcihpbnQgbj1sMTtuPj0wO24tLSkKICAgIHsKICAgICAgICBpbnQgaT0wLGs9bjsKICAgICAgICB0ZW1wPTA7CiAgICAgICAgd2hpbGUoaTxsMiYmazxsMSsxKQogICAgICAgIHsKICAgICAgICAgICAgdGVtcCs9c3VtW2krK11baysrXTsKICAgICAgICB9CiAgICAgICAgdGVtcCs9Y2FyOwogICAgICAgIGlmKHRlbXA+PTEwKQogICAgICAgIHsKICAgICAgICAgICAgcHJvZHVjdFttXT0odGVtcCklMTA7CiAgICAgICAgICAgIGNhcj10ZW1wLzEwOwogICAgICAgICAgICBtLS07CiAgICAgICAgfQogICAgICAgIGVsc2UKICAgICAgICB7CiAgICAgICAgICAgIHByb2R1Y3RbbV09KHRlbXApOwogICAgICAgICAgICBjYXI9MDsKICAgICAgICAgICAgbS0tOwogICAgICAgIH0KICAgICAgICAvL3ByaW50ZigicHJvZHVjdFslZF09JWRcbiIsbSsxLHByb2R1Y3RbbSsxXSk7CiAgICB9CiAgICAvL3ByaW50ZigibT0lZCBuPSVkXG4iLG0sbik7CiAgICBmb3IoaW50IG49MTtuPGwyO24rKykKICAgIHsKICAgICAgICBpbnQgaT1uLGs9MDsKICAgICAgICB0ZW1wPTA7CiAgICAgICAgd2hpbGUoaTxsMiYmazxsMSsxKQogICAgICAgIHsKICAgICAgICAgICAgdGVtcCs9c3VtW2krK11baysrXTsKICAgICAgICB9CiAgICAgICAgdGVtcCs9Y2FyOwogICAgICAgIGlmKHRlbXA+PTEwKQogICAgICAgIHsKICAgICAgICAgICAgcHJvZHVjdFttXT10ZW1wJTEwOwogICAgICAgICAgICBjYXI9dGVtcC8xMDsKICAgICAgICAgICAgbS0tOwogICAgICAgIH0KICAgICAgICBlbHNlCiAgICAgICAgewogICAgICAgICAgICBwcm9kdWN0W21dPXRlbXA7CiAgICAgICAgICAgIGNhcj0wO20tLTsKICAgICAgICB9CiAgICAgICAgLy9wcmludGYoInByb2R1Y3RbJWRdPSVkXG4iLG0rMSxwcm9kdWN0W20rMV0pOwogICAgfQogICAgcHJvZHVjdFttXT1jYXI7CiAgICBpbnQgcHJsZW47CiAgICBpZihwcm9kdWN0WzBdKSBwcmxlbj1sMitsMTsKICAgIGVsc2UgcHJsZW49bDIrbDEtMTsKICAgIC8vcHJpbnRmKCJtPSVkIG49JWQgcHJsZW49JWQgbDE9JWQgbDI9JWRcbiIsbSxuLHBybGVuLGwxLGwyKTsKICAgIGludCBtYXg9cHJsZW47CiAgICBpZihwcmxlbjxsMisxKSBtYXg9bDIrMTsKICAgIGZvcihpbnQgaT0wO2k8bWF4LWwxO2krKykKICAgIHsKICAgICAgICBwcmludGYoIiAiKTsKICAgIH0KICAgIGZvcihpbnQgaT0wO2k8bDE7aSsrKQogICAgewogICAgICAgIHByaW50ZigiJWMiLHNbaV0pOwogICAgfQogICAgcHJpbnRmKCJcbiIpOwogICAgZm9yKGludCBpPTA7aTxtYXgtbDItMTtpKyspCiAgICB7CiAgICAgICAgcHJpbnRmKCIgIik7CiAgICB9CiAgICBmb3IoaW50IGk9cG9zO2k8c2l6ZTtpKyspCiAgICB7CiAgICAgICAgcHJpbnRmKCIlYyIsc1tpXSk7CiAgICB9CiAgICBwcmludGYoIlxuIik7CiAgICBpZihsZW5bMF0+PWwyKzEpCiAgICB7CiAgICAgICAgZm9yKGludCBpPTA7aTxtYXgtbGVuWzBdO2krKykKICAgICAgICB7CiAgICAgICAgICAgIHByaW50ZigiICIpOwogICAgICAgIH0KICAgICAgICBmb3IoaW50IGk9MDtpPGxlblswXTtpKyspCiAgICAgICAgewogICAgICAgICAgICBwcmludGYoIi0iKTsKICAgICAgICB9CiAgICB9CiAgICBlbHNlCiAgICB7CiAgICAgICAgZm9yKGludCBpPTA7aTxtYXgtbDItMTtpKyspCiAgICAgICAgewogICAgICAgICAgICBwcmludGYoIiAiKTsKICAgICAgICB9CiAgICAgICAgZm9yKGludCBpPTA7aTxsMisxO2krKykKICAgICAgICB7CiAgICAgICAgICAgIHByaW50ZigiLSIpOwogICAgICAgIH0KCiAgICB9CiAgICBwcmludGYoIlxuIik7CiAgICBmb3IoaW50IGk9MDtpPGwyO2krKykKICAgIHsKICAgICAgICAvL3ByaW50ZigiYXMgaT0lZCAgbGVuW2ldPSVkIGo9JWQgbDErMT0lZCIsaSxsZW5baV0sbDEtbGVuW2ldKzEsbDErMSk7CiAgICAgICAgZm9yKGludCBqPTA7ajxtYXgtbGVuW2ldLWk7aisrKQogICAgICAgIHsKICAgICAgICAgICAgcHJpbnRmKCIgIik7CiAgICAgICAgfQogICAgICAgIC8vcHJpbnRmKCJpPSVkICBsZW5baV09JWQgaj0lZCBsMSsxPSVkIixpLGxlbltpXSxsMS1sZW5baV0rMSxsMSsxKTsKICAgICAgICBmb3IoaW50IGo9bDEtbGVuW2ldKzE7ajxsMSsxO2orKykKICAgICAgICB7CiAgICAgICAgICAgIC8vcHJpbnRmKCJhaT0lZCBqPSVkIixpLGopOwogICAgICAgICAgICBwcmludGYoIiVkIixzdW1baV1bal0pOwogICAgICAgIH0KICAgICAgICBwcmludGYoIlxuIik7CiAgICB9CiAgICBmb3IoaW50IGk9MDtpPG1heC1wcmxlbjtpKyspCiAgICB7CiAgICAgICAgcHJpbnRmKCIgIik7CiAgICB9CiAgICBmb3IoaW50IGk9MDtpPHBybGVuO2krKykKICAgIHsKICAgICAgICBwcmludGYoIi0iKTsKICAgIH0KICAgIHByaW50ZigiXG4iKTsKICAgIGZvcihpbnQgaT0wO2k8bWF4LXBybGVuO2krKykKICAgIHsKICAgICAgICBwcmludGYoIiAiKTsKICAgIH0KICAgIGZvcihpbnQgaT1sMStsMi1wcmxlbjtpPGwxK2wyO2krKykKICAgIHsKICAgICAgICBwcmludGYoIiVkIixwcm9kdWN0W2ldKTsKICAgIH0KICAgIHByaW50ZigiXG4iKTsKCn0KaW50IG1haW4oKQp7CiAgICBpbnQgdDsKICAgIHNjYW5mKCIlZCIsJnQpOwogICAgZm9yKGludCBpPTA7aTx0O2krKykKICAgIHsKICAgICAgICBjaGFyIHNbMTAwMV07CiAgICAgICAgc2NhbmYoIiVzIixzKTsKICAgICAgICBpbnQgb3A9MCxwb3M7CiAgICAgICAgaW50ICBhLGIsajsKICAgICAgICBmb3Ioaj0wO3Nbal0hPSdcMCc7aisrKQogICAgICAgIHsKICAgICAgICAgICAgaWYoc1tqXT09JysnKSAKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy9wcmludGYoImFkZGlcbiIpOwogICAgICAgICAgICAgICAgb3A9MTsKICAgICAgICAgICAgICAgIHBvcz1qOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYoc1tqXT09Jy0nKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvL3ByaW50Zigic3ViXG4iKTsKICAgICAgICAgICAgICAgIG9wPTI7CiAgICAgICAgICAgICAgICBwb3M9ajsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmKHNbal09PScqJykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy9wcmludGYoIm11bHRcbiIpOwogICAgICAgICAgICAgICAgb3A9MzsKICAgICAgICAgICAgICAgIHBvcz1qOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmKG9wPT0xKSAKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgYWRkaShzLGoscG9zKTsKICAgICAgICAgICAgICAgIHByaW50ZigiXG4iKTsKCiAgICAgICAgICAgIH0KICAgICAgICBlbHNlIGlmKG9wPT0yKQogICAgICAgIHsKICAgICAgICAgICAgc3ViKHMsaixwb3MpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYob3A9PTMpCiAgICAgICAgewogICAgICAgICAgICBtdWx0KHMsaixwb3MpOwogICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KCiAgICB9Cn0K