#pragma GCC optimize("Ofast")
#pragma GCC optimize("unroll-loops")
#pragma GCC optimize("inline")
#include<bits/stdc++.h>
using namespace std;
template<class T> struct cLtraits_identity{
using type = T;
}
;
template<class T> using cLtraits_try_make_signed =
typename conditional<
is_integral<T>::value,
make_signed<T>,
cLtraits_identity<T>
>::type;
template <class S, class T> struct cLtraits_common_type{
using tS = typename cLtraits_try_make_signed<S>::type;
using tT = typename cLtraits_try_make_signed<T>::type;
using type = typename common_type<tS,tT>::type;
}
;
void*wmem;
char memarr[96000000];
template<class S, class T> inline auto min_L(S a, T b)
-> typename cLtraits_common_type<S,T>::type{
return (typename cLtraits_common_type<S,T>::type) a <= (typename cLtraits_common_type<S,T>::type) b ? a : b;
}
template<class S, class T> inline auto max_L(S a, T b)
-> typename cLtraits_common_type<S,T>::type{
return (typename cLtraits_common_type<S,T>::type) a >= (typename cLtraits_common_type<S,T>::type) b ? a : b;
}
template<class T> inline void walloc1d(T **arr, int x, void **mem = &wmem){
static int skip[16] = {0, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1};
(*mem) = (void*)( ((char*)(*mem)) + skip[((unsigned long long)(*mem)) & 15] );
(*arr)=(T*)(*mem);
(*mem)=((*arr)+x);
}
template<class T> inline void walloc1d(T **arr, int x1, int x2, void **mem = &wmem){
walloc1d(arr, x2-x1, mem);
(*arr) -= x1;
}
inline int my_getchar_unlocked(){
static char buf[1048576];
static int s = 1048576;
static int e = 1048576;
if(s == e && e == 1048576){
e = fread_unlocked(buf, 1, 1048576, stdin);
s = 0;
}
if(s == e){
return EOF;
}
return buf[s++];
}
inline void rd(int &x){
int k;
int m=0;
x=0;
for(;;){
k = my_getchar_unlocked();
if(k=='-'){
m=1;
break;
}
if('0'<=k&&k<='9'){
x=k-'0';
break;
}
}
for(;;){
k = my_getchar_unlocked();
if(k<'0'||k>'9'){
break;
}
x=x*10+k-'0';
}
if(m){
x=-x;
}
}
inline int rd_int(void){
int x;
rd(x);
return x;
}
struct MY_WRITER{
char buf[1048576];
int s;
int e;
MY_WRITER(){
s = 0;
e = 1048576;
}
~MY_WRITER(){
if(s){
fwrite_unlocked(buf, 1, s, stdout);
}
}
}
;
MY_WRITER MY_WRITER_VAR;
void my_putchar_unlocked(int a){
if(MY_WRITER_VAR.s == MY_WRITER_VAR.e){
fwrite_unlocked(MY_WRITER_VAR.buf, 1, MY_WRITER_VAR.s, stdout);
MY_WRITER_VAR.s = 0;
}
MY_WRITER_VAR.buf[MY_WRITER_VAR.s++] = a;
}
inline void wt_L(char a){
my_putchar_unlocked(a);
}
inline void wt_L(int x){
int s=0;
int m=0;
char f[10];
if(x<0){
m=1;
x=-x;
}
while(x){
f[s++]=x%10;
x/=10;
}
if(!s){
f[s++]=0;
}
if(m){
my_putchar_unlocked('-');
}
while(s--){
my_putchar_unlocked(f[s]+'0');
}
}
inline void wt_L(const char c[]){
int i=0;
for(i=0;c[i]!='\0';i++){
my_putchar_unlocked(c[i]);
}
}
template<class T, class S> struct maxflow{
int node;
int st;
int ed;
int*es;
int*emem;
int**edge;
int**rev;
int*level;
int*qq;
T**flow;
T eps;
void malloc(int N){
int i;
es = (int*)std::malloc(N*sizeof(int));
emem = (int*)std::malloc(N*sizeof(int));
level = (int*)std::malloc(N*sizeof(int));
qq = (int*)std::malloc(N*sizeof(int));
edge = (int**)std::malloc(N*sizeof(int*));
rev = (int**)std::malloc(N*sizeof(int*));
flow = (T**)std::malloc(N*sizeof(T*));
for(i=(0);i<(N);i++){
emem[i] = 0;
edge[i] = rev[i] = NULL;
flow[i] = NULL;
}
}
void walloc(int N, void**mem = &wmem){
int i;
walloc1d(&es, N, mem);
walloc1d(&emem, N, mem);
walloc1d(&level, N, mem);
walloc1d(&qq, N, mem);
walloc1d(&edge, N, mem);
walloc1d(&rev, N, mem);
walloc1d(&flow, N, mem);
(*mem) = (flow + N);
}
void levelize(void){
int i;
int j;
int k;
int t;
int q_st = 0;
int q_ed = 1;
for(i=(0);i<(node);i++){
level[i] = -1;
}
level[st] = 0;
qq[0] = st;
while(q_st != q_ed){
i = qq[q_st++];
t = level[i] + 1;
for(j=(0);j<(es[i]);j++){
if(flow[i][j] > eps){
k = edge[i][j];
if(level[k]!=-1){
continue;
}
level[k] = t;
qq[q_ed++] = k;
if(k==ed){
return;
}
}
}
}
}
S pushflow(int i, S lim){
int j;
int k;
int ji;
S s;
S t;
S res = 0;
if(i==ed){
return lim;
}
for(j=(0);j<(es[i]);j++){
if(flow[i][j] > eps){
k = edge[i][j];
if(level[k] != level[i]+1){
continue;
}
s =min_L(lim, (S)flow[i][j]);
t = pushflow(k, s);
if(!t){
continue;
}
res += t;
lim -= t;
ji = rev[i][j];
flow[i][j] -= t;
flow[k][ji] += t;
if(!lim){
break;
}
}
}
if(lim){
level[i] = -1;
}
return res;
}
S solve(int st_, int ed_){
S res = 0;
st = st_;
ed = ed_;
for(;;){
levelize();
if(level[ed] == -1){
break;
}
res += pushflow(st, numeric_limits<S>::max());
}
return res;
}
void init(int N){
int i;
node = N;
for(i=(0);i<(N);i++){
es[i] = 0;
}
eps = (T)1e-9;
}
void memoryExpand(int i, int sz){
if(sz <= emem[i]){
return;
}
sz =max_L(sz,max_L(3, emem[i]*2));
emem[i]=sz;
edge[i] = (int*)realloc(edge[i], sz*sizeof(int));
rev[i] = (int*)realloc(rev[i], sz*sizeof(int));
flow[i] = (T*)realloc(flow[i], sz*sizeof(T));
}
void addEdge(int n1, int n2, T f1, T f2 = 0){
int s1 = es[n1]++;
int s2 = es[n2]++;
if(s1 >= emem[n1]){
memoryExpand(n1, es[n1]);
}
if(s2 >= emem[n2]){
memoryExpand(n2, es[n2]);
}
edge[n1][s1]=n2;
edge[n2][s2]=n1;
flow[n1][s1]=f1;
flow[n2][s2]=f2;
rev[n1][s1]=s2;
rev[n2][s2]=s1;
}
void addEdgeAdv(int n1, int n2, T f1, T f2 = 0){
int s1 = es[n1]++;
int s2 = es[n2]++;
edge[n1][s1]=n2;
edge[n2][s2]=n1;
flow[n1][s1]=f1;
flow[n2][s2]=f2;
rev[n1][s1]=s2;
rev[n2][s2]=s1;
}
void setGraph(int N, int M, int n1[], int n2[], T f1[], T f2[]){
int i;
node = N;
for(i=(0);i<(N);i++){
es[i] = 0;
}
for(i=(0);i<(M);i++){
es[n1[i]]++;
es[n2[i]]++;
}
for(i=(0);i<(N);i++){
memoryExpand(i, es[i]);
}
for(i=(0);i<(N);i++){
es[i] = 0;
}
for(i=(0);i<(M);i++){
addEdgeAdv(n1[i], n2[i], f1[i], f2[i]);
}
eps = (T)1e-9;
}
void setGraph_w(int N, int M, int n1[], int n2[], T f1[], T f2[], void **mem = wmem){
int i;
int j;
int k;
node = N;
for(i=(0);i<(N);i++){
es[i] = emem[i] = 0;
}
for(i=(0);i<(M);i++){
es[n1[i]]++;
es[n2[i]]++;
}
edge[0] = (int*)(*mem);
int ffyvhy7f = N;
for(i=(1);i<(ffyvhy7f);i++){
edge[i] = edge[i-1] + es[i-1];
}
rev[0] = edge[N-1] + es[N-1];
int YtJecZqT = N;
for(i=(1);i<(YtJecZqT);i++){
rev[i] = rev[i-1] + es[i-1];
}
flow[0] = (T*)(rev[N-1] + es[N-1]);
int T4XCq7VD = N;
for(i=(1);i<(T4XCq7VD);i++){
flow[i] = flow[i-1] + es[i-1];
}
*mem = (void*)(flow[N-1] + es[N-1]);
for(i=(0);i<(N);i++){
es[i] = 0;
}
for(i=(0);i<(M);i++){
addEdgeAdv(n1[i], n2[i], f1[i], f2[i]);
}
eps = (T)1e-9;
}
}
;
int TEST;
int X;
int Y;
int R[20];
int C[20];
int mp[20][20];
int rr[20];
int cc[20];
char res[20][22];
maxflow<int,int> flow;
int chk(){
int i;
int node;
int st;
int ed;
int tot = 0;
node = X + Y;
st = node++;
ed = node++;
flow.init(node);
for(i=(0);i<(X);i++){
rr[i] = R[i];
}
for(i=(0);i<(Y);i++){
cc[i] = C[i];
}
for(i=(0);i<(X);i++){
int j;
for(j=(0);j<(Y);j++){
if(mp[i][j]==1){
rr[i]--;
cc[j]--;
}
}
}
for(i=(0);i<(X);i++){
int j;
for(j=(0);j<(Y);j++){
if(mp[i][j]==-1){
flow.addEdge(i,X+j,1);
}
}
}
int tU__gIr_;
int a2conNHc;
if(X==0){
a2conNHc = 0;
}
else{
a2conNHc = rr[0];
for(tU__gIr_=(1);tU__gIr_<(X);tU__gIr_++){
a2conNHc = min_L(a2conNHc, rr[tU__gIr_]);
}
}
int APIVbQlN;
int YREPHmFM;
if(Y==0){
YREPHmFM = 0;
}
else{
YREPHmFM = cc[0];
for(APIVbQlN=(1);APIVbQlN<(Y);APIVbQlN++){
YREPHmFM = min_L(YREPHmFM, cc[APIVbQlN]);
}
}
if(a2conNHc< 0 ||YREPHmFM< 0){
return 0;
}
int ZIeRIny5;
int iMWUTgY_;
if(X==0){
iMWUTgY_ = 0;
}
else{
iMWUTgY_ = rr[0];
for(ZIeRIny5=(1);ZIeRIny5<(X);ZIeRIny5++){
iMWUTgY_ += rr[ZIeRIny5];
}
}
int jPV_0s1p;
int BUotOFBp;
if(Y==0){
BUotOFBp = 0;
}
else{
BUotOFBp = cc[0];
for(jPV_0s1p=(1);jPV_0s1p<(Y);jPV_0s1p++){
BUotOFBp += cc[jPV_0s1p];
}
}
if(iMWUTgY_!=BUotOFBp){
return 0;
}
int gEg5UqEA;
cLtraits_try_make_signed<remove_reference<decltype((*((int*)NULL)))>::type>::type qSsg05KM;
if(X==0){
qSsg05KM = 0;
}
else{
qSsg05KM = rr[0];
for(gEg5UqEA=(1);gEg5UqEA<(X);gEg5UqEA++){
qSsg05KM += rr[gEg5UqEA];
}
}
tot =qSsg05KM;
for(i=(0);i<(X);i++){
if(rr[i]){
flow.addEdge(st, i, rr[i]);
}
}
for(i=(0);i<(Y);i++){
if(cc[i]){
flow.addEdge(X+i, ed, cc[i]);
}
}
if(flow.solve(st,ed) == tot){
return 1;
}
return 0;
}
int main(){
wmem = memarr;
flow.malloc(100000);
int O3U4gd88 = rd_int();
for(TEST=(0);TEST<(O3U4gd88);TEST++){
int i;
wt_L("Case #");
wt_L(TEST+1);
wt_L(": ");
rd(X);
rd(Y);
{
int OC5CYxKD;
for(OC5CYxKD=(0);OC5CYxKD<(X);OC5CYxKD++){
rd(R[OC5CYxKD]);
}
}
{
int qE8LMwYZ;
for(qE8LMwYZ=(0);qE8LMwYZ<(Y);qE8LMwYZ++){
rd(C[qE8LMwYZ]);
}
}
for(i=(0);i<(X);i++){
int j;
for(j=(0);j<(Y);j++){
mp[i][j] = -1;
}
}
if(!chk()){
wt_L("IMPOSSIBLE");
wt_L('\n');
continue;
}
for(i=(0);i<(X);i++){
int j;
for(j=(Y)-1;j>=(0);j--){
mp[i][j] = 1;
if(!chk()){
mp[i][j] = 0;
}
}
}
for(i=(0);i<(X);i++){
int j;
for(j=(0);j<(Y);j++){
if(mp[i][j]){
res[i][j] ='/';
}
else{
res[i][j] ='\\';
}
}
}
for(i=(0);i<(X);i++){
res[i][Y] = '\0';
}
wt_L("POSSIBLE");
wt_L('\n');
{
int jG1yfsum;
for(jG1yfsum=(0);jG1yfsum<(X);jG1yfsum++){
wt_L(res[jG1yfsum]);
wt_L('\n');
}
}
}
return 0;
}
// cLay version 20210607-1
// --- original code ---
// int TEST;
// int X, Y, R[20], C[20], mp[20][20];
// int rr[20], cc[20];
// char res[20][22];
// maxflow<int,int> flow;
//
// int chk(){
// int node, st, ed, tot = 0;
// node = X + Y;
// st = node++;
// ed = node++;
// flow.init(node);
//
// rep(i,X) rr[i] = R[i];
// rep(i,Y) cc[i] = C[i];
// rep(i,X) rep(j,Y) if(mp[i][j]==1) rr[i]--, cc[j]--;
// rep(i,X) rep(j,Y) if(mp[i][j]==-1) flow.addEdge(i,X+j,1);
//
// if(min(rr(X)) < 0 || min(cc(Y)) < 0) return 0;
// if(sum(rr(X)) != sum(cc(Y))) return 0;
// tot = sum(rr(X));
// rep(i,X) if(rr[i]) flow.addEdge(st, i, rr[i]);
// rep(i,Y) if(cc[i]) flow.addEdge(X+i, ed, cc[i]);
// if(flow.solve(st,ed) == tot) return 1;
// return 0;
// }
//
// {
// flow.malloc(1d5);
// REP(TEST, rd_int()){
// wtF("Case #{TEST+1}: ");
// rd(X,Y,R(X),C(Y));
// rep(i,X) rep(j,Y) mp[i][j] = -1;
//
// if(!chk()) wt("IMPOSSIBLE"), continue;
//
// rep(i,X) rrep(j,Y){
// mp[i][j] = 1;
// if(!chk()) mp[i][j] = 0;
// }
//
// rep(i,X) rep(j,Y) res[i][j] = if[mp[i][j], '/', '\\'];
// rep(i,X) res[i][Y] = '\0';
// wt("POSSIBLE");
// wtLn(res(X));
// }
// }
I3ByYWdtYSBHQ0Mgb3B0aW1pemUoIk9mYXN0IikKI3ByYWdtYSBHQ0Mgb3B0aW1pemUoInVucm9sbC1sb29wcyIpCiNwcmFnbWEgR0NDIG9wdGltaXplKCJpbmxpbmUiKQojaW5jbHVkZTxiaXRzL3N0ZGMrKy5oPgp1c2luZyBuYW1lc3BhY2Ugc3RkOwp0ZW1wbGF0ZTxjbGFzcyBUPiBzdHJ1Y3QgY0x0cmFpdHNfaWRlbnRpdHl7CiAgdXNpbmcgdHlwZSA9IFQ7Cn0KOwp0ZW1wbGF0ZTxjbGFzcyBUPiB1c2luZyBjTHRyYWl0c190cnlfbWFrZV9zaWduZWQgPQogIHR5cGVuYW1lIGNvbmRpdGlvbmFsPAogICAgaXNfaW50ZWdyYWw8VD46OnZhbHVlLAogICAgbWFrZV9zaWduZWQ8VD4sCiAgICBjTHRyYWl0c19pZGVudGl0eTxUPgogICAgPjo6dHlwZTsKdGVtcGxhdGUgPGNsYXNzIFMsIGNsYXNzIFQ+IHN0cnVjdCBjTHRyYWl0c19jb21tb25fdHlwZXsKICB1c2luZyB0UyA9IHR5cGVuYW1lIGNMdHJhaXRzX3RyeV9tYWtlX3NpZ25lZDxTPjo6dHlwZTsKICB1c2luZyB0VCA9IHR5cGVuYW1lIGNMdHJhaXRzX3RyeV9tYWtlX3NpZ25lZDxUPjo6dHlwZTsKICB1c2luZyB0eXBlID0gdHlwZW5hbWUgY29tbW9uX3R5cGU8dFMsdFQ+Ojp0eXBlOwp9CjsKdm9pZCp3bWVtOwpjaGFyIG1lbWFycls5NjAwMDAwMF07CnRlbXBsYXRlPGNsYXNzIFMsIGNsYXNzIFQ+IGlubGluZSBhdXRvIG1pbl9MKFMgYSwgVCBiKQotPiB0eXBlbmFtZSBjTHRyYWl0c19jb21tb25fdHlwZTxTLFQ+Ojp0eXBlewogIHJldHVybiAodHlwZW5hbWUgY0x0cmFpdHNfY29tbW9uX3R5cGU8UyxUPjo6dHlwZSkgYSA8PSAodHlwZW5hbWUgY0x0cmFpdHNfY29tbW9uX3R5cGU8UyxUPjo6dHlwZSkgYiA/IGEgOiBiOwp9CnRlbXBsYXRlPGNsYXNzIFMsIGNsYXNzIFQ+IGlubGluZSBhdXRvIG1heF9MKFMgYSwgVCBiKQotPiB0eXBlbmFtZSBjTHRyYWl0c19jb21tb25fdHlwZTxTLFQ+Ojp0eXBlewogIHJldHVybiAodHlwZW5hbWUgY0x0cmFpdHNfY29tbW9uX3R5cGU8UyxUPjo6dHlwZSkgYSA+PSAodHlwZW5hbWUgY0x0cmFpdHNfY29tbW9uX3R5cGU8UyxUPjo6dHlwZSkgYiA/IGEgOiBiOwp9CnRlbXBsYXRlPGNsYXNzIFQ+IGlubGluZSB2b2lkIHdhbGxvYzFkKFQgKiphcnIsIGludCB4LCB2b2lkICoqbWVtID0gJndtZW0pewogIHN0YXRpYyBpbnQgc2tpcFsxNl0gPSB7MCwgMTUsIDE0LCAxMywgMTIsIDExLCAxMCwgOSwgOCwgNywgNiwgNSwgNCwgMywgMiwgMX07CiAgKCptZW0pID0gKHZvaWQqKSggKChjaGFyKikoKm1lbSkpICsgc2tpcFsoKHVuc2lnbmVkIGxvbmcgbG9uZykoKm1lbSkpICYgMTVdICk7CiAgKCphcnIpPShUKikoKm1lbSk7CiAgKCptZW0pPSgoKmFycikreCk7Cn0KdGVtcGxhdGU8Y2xhc3MgVD4gaW5saW5lIHZvaWQgd2FsbG9jMWQoVCAqKmFyciwgaW50IHgxLCBpbnQgeDIsIHZvaWQgKiptZW0gPSAmd21lbSl7CiAgd2FsbG9jMWQoYXJyLCB4Mi14MSwgbWVtKTsKICAoKmFycikgLT0geDE7Cn0KaW5saW5lIGludCBteV9nZXRjaGFyX3VubG9ja2VkKCl7CiAgc3RhdGljIGNoYXIgYnVmWzEwNDg1NzZdOwogIHN0YXRpYyBpbnQgcyA9IDEwNDg1NzY7CiAgc3RhdGljIGludCBlID0gMTA0ODU3NjsKICBpZihzID09IGUgJiYgZSA9PSAxMDQ4NTc2KXsKICAgIGUgPSBmcmVhZF91bmxvY2tlZChidWYsIDEsIDEwNDg1NzYsIHN0ZGluKTsKICAgIHMgPSAwOwogIH0KICBpZihzID09IGUpewogICAgcmV0dXJuIEVPRjsKICB9CiAgcmV0dXJuIGJ1ZltzKytdOwp9CmlubGluZSB2b2lkIHJkKGludCAmeCl7CiAgaW50IGs7CiAgaW50IG09MDsKICB4PTA7CiAgZm9yKDs7KXsKICAgIGsgPSBteV9nZXRjaGFyX3VubG9ja2VkKCk7CiAgICBpZihrPT0nLScpewogICAgICBtPTE7CiAgICAgIGJyZWFrOwogICAgfQogICAgaWYoJzAnPD1rJiZrPD0nOScpewogICAgICB4PWstJzAnOwogICAgICBicmVhazsKICAgIH0KICB9CiAgZm9yKDs7KXsKICAgIGsgPSBteV9nZXRjaGFyX3VubG9ja2VkKCk7CiAgICBpZihrPCcwJ3x8az4nOScpewogICAgICBicmVhazsKICAgIH0KICAgIHg9eCoxMCtrLScwJzsKICB9CiAgaWYobSl7CiAgICB4PS14OwogIH0KfQppbmxpbmUgaW50IHJkX2ludCh2b2lkKXsKICBpbnQgeDsKICByZCh4KTsKICByZXR1cm4geDsKfQpzdHJ1Y3QgTVlfV1JJVEVSewogIGNoYXIgYnVmWzEwNDg1NzZdOwogIGludCBzOwogIGludCBlOwogIE1ZX1dSSVRFUigpewogICAgcyA9IDA7CiAgICBlID0gMTA0ODU3NjsKICB9CiAgfk1ZX1dSSVRFUigpewogICAgaWYocyl7CiAgICAgIGZ3cml0ZV91bmxvY2tlZChidWYsIDEsIHMsIHN0ZG91dCk7CiAgICB9CiAgfQp9CjsKTVlfV1JJVEVSIE1ZX1dSSVRFUl9WQVI7CnZvaWQgbXlfcHV0Y2hhcl91bmxvY2tlZChpbnQgYSl7CiAgaWYoTVlfV1JJVEVSX1ZBUi5zID09IE1ZX1dSSVRFUl9WQVIuZSl7CiAgICBmd3JpdGVfdW5sb2NrZWQoTVlfV1JJVEVSX1ZBUi5idWYsIDEsIE1ZX1dSSVRFUl9WQVIucywgc3Rkb3V0KTsKICAgIE1ZX1dSSVRFUl9WQVIucyA9IDA7CiAgfQogIE1ZX1dSSVRFUl9WQVIuYnVmW01ZX1dSSVRFUl9WQVIucysrXSA9IGE7Cn0KaW5saW5lIHZvaWQgd3RfTChjaGFyIGEpewogIG15X3B1dGNoYXJfdW5sb2NrZWQoYSk7Cn0KaW5saW5lIHZvaWQgd3RfTChpbnQgeCl7CiAgaW50IHM9MDsKICBpbnQgbT0wOwogIGNoYXIgZlsxMF07CiAgaWYoeDwwKXsKICAgIG09MTsKICAgIHg9LXg7CiAgfQogIHdoaWxlKHgpewogICAgZltzKytdPXglMTA7CiAgICB4Lz0xMDsKICB9CiAgaWYoIXMpewogICAgZltzKytdPTA7CiAgfQogIGlmKG0pewogICAgbXlfcHV0Y2hhcl91bmxvY2tlZCgnLScpOwogIH0KICB3aGlsZShzLS0pewogICAgbXlfcHV0Y2hhcl91bmxvY2tlZChmW3NdKycwJyk7CiAgfQp9CmlubGluZSB2b2lkIHd0X0woY29uc3QgY2hhciBjW10pewogIGludCBpPTA7CiAgZm9yKGk9MDtjW2ldIT0nXDAnO2krKyl7CiAgICBteV9wdXRjaGFyX3VubG9ja2VkKGNbaV0pOwogIH0KfQp0ZW1wbGF0ZTxjbGFzcyBULCBjbGFzcyBTPiBzdHJ1Y3QgbWF4Zmxvd3sKICBpbnQgbm9kZTsKICBpbnQgc3Q7CiAgaW50IGVkOwogIGludCplczsKICBpbnQqZW1lbTsKICBpbnQqKmVkZ2U7CiAgaW50KipyZXY7CiAgaW50KmxldmVsOwogIGludCpxcTsKICBUKipmbG93OwogIFQgZXBzOwogIHZvaWQgbWFsbG9jKGludCBOKXsKICAgIGludCBpOwogICAgZXMgPSAoaW50KilzdGQ6Om1hbGxvYyhOKnNpemVvZihpbnQpKTsKICAgIGVtZW0gPSAoaW50KilzdGQ6Om1hbGxvYyhOKnNpemVvZihpbnQpKTsKICAgIGxldmVsID0gKGludCopc3RkOjptYWxsb2MoTipzaXplb2YoaW50KSk7CiAgICBxcSA9IChpbnQqKXN0ZDo6bWFsbG9jKE4qc2l6ZW9mKGludCkpOwogICAgZWRnZSA9IChpbnQqKilzdGQ6Om1hbGxvYyhOKnNpemVvZihpbnQqKSk7CiAgICByZXYgPSAoaW50Kiopc3RkOjptYWxsb2MoTipzaXplb2YoaW50KikpOwogICAgZmxvdyA9IChUKiopc3RkOjptYWxsb2MoTipzaXplb2YoVCopKTsKICAgIGZvcihpPSgwKTtpPChOKTtpKyspewogICAgICBlbWVtW2ldID0gMDsKICAgICAgZWRnZVtpXSA9IHJldltpXSA9IE5VTEw7CiAgICAgIGZsb3dbaV0gPSBOVUxMOwogICAgfQogIH0KICB2b2lkIHdhbGxvYyhpbnQgTiwgdm9pZCoqbWVtID0gJndtZW0pewogICAgaW50IGk7CiAgICB3YWxsb2MxZCgmZXMsIE4sIG1lbSk7CiAgICB3YWxsb2MxZCgmZW1lbSwgTiwgbWVtKTsKICAgIHdhbGxvYzFkKCZsZXZlbCwgTiwgbWVtKTsKICAgIHdhbGxvYzFkKCZxcSwgTiwgbWVtKTsKICAgIHdhbGxvYzFkKCZlZGdlLCBOLCBtZW0pOwogICAgd2FsbG9jMWQoJnJldiwgTiwgbWVtKTsKICAgIHdhbGxvYzFkKCZmbG93LCBOLCBtZW0pOwogICAgKCptZW0pID0gKGZsb3cgKyBOKTsKICB9CiAgdm9pZCBsZXZlbGl6ZSh2b2lkKXsKICAgIGludCBpOwogICAgaW50IGo7CiAgICBpbnQgazsKICAgIGludCB0OwogICAgaW50IHFfc3QgPSAwOwogICAgaW50IHFfZWQgPSAxOwogICAgZm9yKGk9KDApO2k8KG5vZGUpO2krKyl7CiAgICAgIGxldmVsW2ldID0gLTE7CiAgICB9CiAgICBsZXZlbFtzdF0gPSAwOwogICAgcXFbMF0gPSBzdDsKICAgIHdoaWxlKHFfc3QgIT0gcV9lZCl7CiAgICAgIGkgPSBxcVtxX3N0KytdOwogICAgICB0ID0gbGV2ZWxbaV0gKyAxOwogICAgICBmb3Ioaj0oMCk7ajwoZXNbaV0pO2orKyl7CiAgICAgICAgaWYoZmxvd1tpXVtqXSA+IGVwcyl7CiAgICAgICAgICBrID0gZWRnZVtpXVtqXTsKICAgICAgICAgIGlmKGxldmVsW2tdIT0tMSl7CiAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgfQogICAgICAgICAgbGV2ZWxba10gPSB0OwogICAgICAgICAgcXFbcV9lZCsrXSA9IGs7CiAgICAgICAgICBpZihrPT1lZCl7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgIH0KICB9CiAgUyBwdXNoZmxvdyhpbnQgaSwgUyBsaW0pewogICAgaW50IGo7CiAgICBpbnQgazsKICAgIGludCBqaTsKICAgIFMgczsKICAgIFMgdDsKICAgIFMgcmVzID0gMDsKICAgIGlmKGk9PWVkKXsKICAgICAgcmV0dXJuIGxpbTsKICAgIH0KICAgIGZvcihqPSgwKTtqPChlc1tpXSk7aisrKXsKICAgICAgaWYoZmxvd1tpXVtqXSA+IGVwcyl7CiAgICAgICAgayA9IGVkZ2VbaV1bal07CiAgICAgICAgaWYobGV2ZWxba10gIT0gbGV2ZWxbaV0rMSl7CiAgICAgICAgICBjb250aW51ZTsKICAgICAgICB9CiAgICAgICAgcyA9bWluX0wobGltLCAoUylmbG93W2ldW2pdKTsKICAgICAgICB0ID0gcHVzaGZsb3coaywgcyk7CiAgICAgICAgaWYoIXQpewogICAgICAgICAgY29udGludWU7CiAgICAgICAgfQogICAgICAgIHJlcyArPSB0OwogICAgICAgIGxpbSAtPSB0OwogICAgICAgIGppID0gcmV2W2ldW2pdOwogICAgICAgIGZsb3dbaV1bal0gLT0gdDsKICAgICAgICBmbG93W2tdW2ppXSArPSB0OwogICAgICAgIGlmKCFsaW0pewogICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICBpZihsaW0pewogICAgICBsZXZlbFtpXSA9IC0xOwogICAgfQogICAgcmV0dXJuIHJlczsKICB9CiAgUyBzb2x2ZShpbnQgc3RfLCBpbnQgZWRfKXsKICAgIFMgcmVzID0gMDsKICAgIHN0ID0gc3RfOwogICAgZWQgPSBlZF87CiAgICBmb3IoOzspewogICAgICBsZXZlbGl6ZSgpOwogICAgICBpZihsZXZlbFtlZF0gPT0gLTEpewogICAgICAgIGJyZWFrOwogICAgICB9CiAgICAgIHJlcyArPSBwdXNoZmxvdyhzdCwgbnVtZXJpY19saW1pdHM8Uz46Om1heCgpKTsKICAgIH0KICAgIHJldHVybiByZXM7CiAgfQogIHZvaWQgaW5pdChpbnQgTil7CiAgICBpbnQgaTsKICAgIG5vZGUgPSBOOwogICAgZm9yKGk9KDApO2k8KE4pO2krKyl7CiAgICAgIGVzW2ldID0gMDsKICAgIH0KICAgIGVwcyA9IChUKTFlLTk7CiAgfQogIHZvaWQgbWVtb3J5RXhwYW5kKGludCBpLCBpbnQgc3opewogICAgaWYoc3ogPD0gZW1lbVtpXSl7CiAgICAgIHJldHVybjsKICAgIH0KICAgIHN6ID1tYXhfTChzeixtYXhfTCgzLCBlbWVtW2ldKjIpKTsKICAgIGVtZW1baV09c3o7CiAgICBlZGdlW2ldID0gKGludCopcmVhbGxvYyhlZGdlW2ldLCBzeipzaXplb2YoaW50KSk7CiAgICByZXZbaV0gPSAoaW50KilyZWFsbG9jKHJldltpXSwgc3oqc2l6ZW9mKGludCkpOwogICAgZmxvd1tpXSA9IChUKilyZWFsbG9jKGZsb3dbaV0sIHN6KnNpemVvZihUKSk7CiAgfQogIHZvaWQgYWRkRWRnZShpbnQgbjEsIGludCBuMiwgVCBmMSwgVCBmMiA9IDApewogICAgaW50IHMxID0gZXNbbjFdKys7CiAgICBpbnQgczIgPSBlc1tuMl0rKzsKICAgIGlmKHMxID49IGVtZW1bbjFdKXsKICAgICAgbWVtb3J5RXhwYW5kKG4xLCBlc1tuMV0pOwogICAgfQogICAgaWYoczIgPj0gZW1lbVtuMl0pewogICAgICBtZW1vcnlFeHBhbmQobjIsIGVzW24yXSk7CiAgICB9CiAgICBlZGdlW24xXVtzMV09bjI7CiAgICBlZGdlW24yXVtzMl09bjE7CiAgICBmbG93W24xXVtzMV09ZjE7CiAgICBmbG93W24yXVtzMl09ZjI7CiAgICByZXZbbjFdW3MxXT1zMjsKICAgIHJldltuMl1bczJdPXMxOwogIH0KICB2b2lkIGFkZEVkZ2VBZHYoaW50IG4xLCBpbnQgbjIsIFQgZjEsIFQgZjIgPSAwKXsKICAgIGludCBzMSA9IGVzW24xXSsrOwogICAgaW50IHMyID0gZXNbbjJdKys7CiAgICBlZGdlW24xXVtzMV09bjI7CiAgICBlZGdlW24yXVtzMl09bjE7CiAgICBmbG93W24xXVtzMV09ZjE7CiAgICBmbG93W24yXVtzMl09ZjI7CiAgICByZXZbbjFdW3MxXT1zMjsKICAgIHJldltuMl1bczJdPXMxOwogIH0KICB2b2lkIHNldEdyYXBoKGludCBOLCBpbnQgTSwgaW50IG4xW10sIGludCBuMltdLCBUIGYxW10sIFQgZjJbXSl7CiAgICBpbnQgaTsKICAgIG5vZGUgPSBOOwogICAgZm9yKGk9KDApO2k8KE4pO2krKyl7CiAgICAgIGVzW2ldID0gMDsKICAgIH0KICAgIGZvcihpPSgwKTtpPChNKTtpKyspewogICAgICBlc1tuMVtpXV0rKzsKICAgICAgZXNbbjJbaV1dKys7CiAgICB9CiAgICBmb3IoaT0oMCk7aTwoTik7aSsrKXsKICAgICAgbWVtb3J5RXhwYW5kKGksIGVzW2ldKTsKICAgIH0KICAgIGZvcihpPSgwKTtpPChOKTtpKyspewogICAgICBlc1tpXSA9IDA7CiAgICB9CiAgICBmb3IoaT0oMCk7aTwoTSk7aSsrKXsKICAgICAgYWRkRWRnZUFkdihuMVtpXSwgbjJbaV0sIGYxW2ldLCBmMltpXSk7CiAgICB9CiAgICBlcHMgPSAoVCkxZS05OwogIH0KICB2b2lkIHNldEdyYXBoX3coaW50IE4sIGludCBNLCBpbnQgbjFbXSwgaW50IG4yW10sIFQgZjFbXSwgVCBmMltdLCB2b2lkICoqbWVtID0gd21lbSl7CiAgICBpbnQgaTsKICAgIGludCBqOwogICAgaW50IGs7CiAgICBub2RlID0gTjsKICAgIGZvcihpPSgwKTtpPChOKTtpKyspewogICAgICBlc1tpXSA9IGVtZW1baV0gPSAwOwogICAgfQogICAgZm9yKGk9KDApO2k8KE0pO2krKyl7CiAgICAgIGVzW24xW2ldXSsrOwogICAgICBlc1tuMltpXV0rKzsKICAgIH0KICAgIGVkZ2VbMF0gPSAoaW50KikoKm1lbSk7CiAgICBpbnQgZmZ5dmh5N2YgPSBOOwogICAgZm9yKGk9KDEpO2k8KGZmeXZoeTdmKTtpKyspewogICAgICBlZGdlW2ldID0gZWRnZVtpLTFdICsgZXNbaS0xXTsKICAgIH0KICAgIHJldlswXSA9IGVkZ2VbTi0xXSArIGVzW04tMV07CiAgICBpbnQgWXRKZWNacVQgPSBOOwogICAgZm9yKGk9KDEpO2k8KFl0SmVjWnFUKTtpKyspewogICAgICByZXZbaV0gPSByZXZbaS0xXSArIGVzW2ktMV07CiAgICB9CiAgICBmbG93WzBdID0gKFQqKShyZXZbTi0xXSArIGVzW04tMV0pOwogICAgaW50IFQ0WENxN1ZEID0gTjsKICAgIGZvcihpPSgxKTtpPChUNFhDcTdWRCk7aSsrKXsKICAgICAgZmxvd1tpXSA9IGZsb3dbaS0xXSArIGVzW2ktMV07CiAgICB9CiAgICAqbWVtID0gKHZvaWQqKShmbG93W04tMV0gKyBlc1tOLTFdKTsKICAgIGZvcihpPSgwKTtpPChOKTtpKyspewogICAgICBlc1tpXSA9IDA7CiAgICB9CiAgICBmb3IoaT0oMCk7aTwoTSk7aSsrKXsKICAgICAgYWRkRWRnZUFkdihuMVtpXSwgbjJbaV0sIGYxW2ldLCBmMltpXSk7CiAgICB9CiAgICBlcHMgPSAoVCkxZS05OwogIH0KfQo7CmludCBURVNUOwppbnQgWDsKaW50IFk7CmludCBSWzIwXTsKaW50IENbMjBdOwppbnQgbXBbMjBdWzIwXTsKaW50IHJyWzIwXTsKaW50IGNjWzIwXTsKY2hhciByZXNbMjBdWzIyXTsKbWF4ZmxvdzxpbnQsaW50PiBmbG93OwppbnQgY2hrKCl7CiAgaW50IGk7CiAgaW50IG5vZGU7CiAgaW50IHN0OwogIGludCBlZDsKICBpbnQgdG90ID0gMDsKICBub2RlID0gWCArIFk7CiAgc3QgPSBub2RlKys7CiAgZWQgPSBub2RlKys7CiAgZmxvdy5pbml0KG5vZGUpOwogIGZvcihpPSgwKTtpPChYKTtpKyspewogICAgcnJbaV0gPSBSW2ldOwogIH0KICBmb3IoaT0oMCk7aTwoWSk7aSsrKXsKICAgIGNjW2ldID0gQ1tpXTsKICB9CiAgZm9yKGk9KDApO2k8KFgpO2krKyl7CiAgICBpbnQgajsKICAgIGZvcihqPSgwKTtqPChZKTtqKyspewogICAgICBpZihtcFtpXVtqXT09MSl7CiAgICAgICAgcnJbaV0tLTsKICAgICAgICBjY1tqXS0tOwogICAgICB9CiAgICB9CiAgfQogIGZvcihpPSgwKTtpPChYKTtpKyspewogICAgaW50IGo7CiAgICBmb3Ioaj0oMCk7ajwoWSk7aisrKXsKICAgICAgaWYobXBbaV1bal09PS0xKXsKICAgICAgICBmbG93LmFkZEVkZ2UoaSxYK2osMSk7CiAgICAgIH0KICAgIH0KICB9CiAgaW50IHRVX19nSXJfOwogIGludCBhMmNvbk5IYzsKICBpZihYPT0wKXsKICAgIGEyY29uTkhjID0gMDsKICB9CiAgZWxzZXsKICAgIGEyY29uTkhjID0gcnJbMF07CiAgICBmb3IodFVfX2dJcl89KDEpO3RVX19nSXJfPChYKTt0VV9fZ0lyXysrKXsKICAgICAgYTJjb25OSGMgPSBtaW5fTChhMmNvbk5IYywgcnJbdFVfX2dJcl9dKTsKICAgIH0KICB9CiAgaW50IEFQSVZiUWxOOwogIGludCBZUkVQSG1GTTsKICBpZihZPT0wKXsKICAgIFlSRVBIbUZNID0gMDsKICB9CiAgZWxzZXsKICAgIFlSRVBIbUZNID0gY2NbMF07CiAgICBmb3IoQVBJVmJRbE49KDEpO0FQSVZiUWxOPChZKTtBUElWYlFsTisrKXsKICAgICAgWVJFUEhtRk0gPSBtaW5fTChZUkVQSG1GTSwgY2NbQVBJVmJRbE5dKTsKICAgIH0KICB9CiAgaWYoYTJjb25OSGM8IDAgfHxZUkVQSG1GTTwgMCl7CiAgICByZXR1cm4gMDsKICB9CiAgaW50IFpJZVJJbnk1OwogIGludCBpTVdVVGdZXzsKICBpZihYPT0wKXsKICAgIGlNV1VUZ1lfID0gMDsKICB9CiAgZWxzZXsKICAgIGlNV1VUZ1lfID0gcnJbMF07CiAgICBmb3IoWkllUklueTU9KDEpO1pJZVJJbnk1PChYKTtaSWVSSW55NSsrKXsKICAgICAgaU1XVVRnWV8gKz0gcnJbWkllUklueTVdOwogICAgfQogIH0KICBpbnQgalBWXzBzMXA7CiAgaW50IEJVb3RPRkJwOwogIGlmKFk9PTApewogICAgQlVvdE9GQnAgPSAwOwogIH0KICBlbHNlewogICAgQlVvdE9GQnAgPSBjY1swXTsKICAgIGZvcihqUFZfMHMxcD0oMSk7alBWXzBzMXA8KFkpO2pQVl8wczFwKyspewogICAgICBCVW90T0ZCcCArPSBjY1tqUFZfMHMxcF07CiAgICB9CiAgfQogIGlmKGlNV1VUZ1lfIT1CVW90T0ZCcCl7CiAgICByZXR1cm4gMDsKICB9CiAgaW50IGdFZzVVcUVBOwogIGNMdHJhaXRzX3RyeV9tYWtlX3NpZ25lZDxyZW1vdmVfcmVmZXJlbmNlPGRlY2x0eXBlKCgqKChpbnQqKU5VTEwpKSk+Ojp0eXBlPjo6dHlwZSBxU3NnMDVLTTsKICBpZihYPT0wKXsKICAgIHFTc2cwNUtNID0gMDsKICB9CiAgZWxzZXsKICAgIHFTc2cwNUtNID0gcnJbMF07CiAgICBmb3IoZ0VnNVVxRUE9KDEpO2dFZzVVcUVBPChYKTtnRWc1VXFFQSsrKXsKICAgICAgcVNzZzA1S00gKz0gcnJbZ0VnNVVxRUFdOwogICAgfQogIH0KICB0b3QgPXFTc2cwNUtNOwogIGZvcihpPSgwKTtpPChYKTtpKyspewogICAgaWYocnJbaV0pewogICAgICBmbG93LmFkZEVkZ2Uoc3QsIGksIHJyW2ldKTsKICAgIH0KICB9CiAgZm9yKGk9KDApO2k8KFkpO2krKyl7CiAgICBpZihjY1tpXSl7CiAgICAgIGZsb3cuYWRkRWRnZShYK2ksIGVkLCBjY1tpXSk7CiAgICB9CiAgfQogIGlmKGZsb3cuc29sdmUoc3QsZWQpID09IHRvdCl7CiAgICByZXR1cm4gMTsKICB9CiAgcmV0dXJuIDA7Cn0KaW50IG1haW4oKXsKICB3bWVtID0gbWVtYXJyOwogIGZsb3cubWFsbG9jKDEwMDAwMCk7CiAgaW50IE8zVTRnZDg4ID0gcmRfaW50KCk7CiAgZm9yKFRFU1Q9KDApO1RFU1Q8KE8zVTRnZDg4KTtURVNUKyspewogICAgaW50IGk7CiAgICB3dF9MKCJDYXNlICMiKTsKICAgIHd0X0woVEVTVCsxKTsKICAgIHd0X0woIjogIik7CiAgICByZChYKTsKICAgIHJkKFkpOwogICAgewogICAgICBpbnQgT0M1Q1l4S0Q7CiAgICAgIGZvcihPQzVDWXhLRD0oMCk7T0M1Q1l4S0Q8KFgpO09DNUNZeEtEKyspewogICAgICAgIHJkKFJbT0M1Q1l4S0RdKTsKICAgICAgfQogICAgfQogICAgewogICAgICBpbnQgcUU4TE13WVo7CiAgICAgIGZvcihxRThMTXdZWj0oMCk7cUU4TE13WVo8KFkpO3FFOExNd1laKyspewogICAgICAgIHJkKENbcUU4TE13WVpdKTsKICAgICAgfQogICAgfQogICAgZm9yKGk9KDApO2k8KFgpO2krKyl7CiAgICAgIGludCBqOwogICAgICBmb3Ioaj0oMCk7ajwoWSk7aisrKXsKICAgICAgICBtcFtpXVtqXSA9IC0xOwogICAgICB9CiAgICB9CiAgICBpZighY2hrKCkpewogICAgICB3dF9MKCJJTVBPU1NJQkxFIik7CiAgICAgIHd0X0woJ1xuJyk7CiAgICAgIGNvbnRpbnVlOwogICAgfQogICAgZm9yKGk9KDApO2k8KFgpO2krKyl7CiAgICAgIGludCBqOwogICAgICBmb3Ioaj0oWSktMTtqPj0oMCk7ai0tKXsKICAgICAgICBtcFtpXVtqXSA9IDE7CiAgICAgICAgaWYoIWNoaygpKXsKICAgICAgICAgIG1wW2ldW2pdID0gMDsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIGZvcihpPSgwKTtpPChYKTtpKyspewogICAgICBpbnQgajsKICAgICAgZm9yKGo9KDApO2o8KFkpO2orKyl7CiAgICAgICAgaWYobXBbaV1bal0pewogICAgICAgICAgcmVzW2ldW2pdID0nLyc7CiAgICAgICAgfQogICAgICAgIGVsc2V7CiAgICAgICAgICByZXNbaV1bal0gPSdcXCc7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICBmb3IoaT0oMCk7aTwoWCk7aSsrKXsKICAgICAgcmVzW2ldW1ldID0gJ1wwJzsKICAgIH0KICAgIHd0X0woIlBPU1NJQkxFIik7CiAgICB3dF9MKCdcbicpOwogICAgewogICAgICBpbnQgakcxeWZzdW07CiAgICAgIGZvcihqRzF5ZnN1bT0oMCk7akcxeWZzdW08KFgpO2pHMXlmc3VtKyspewogICAgICAgIHd0X0wocmVzW2pHMXlmc3VtXSk7CiAgICAgICAgd3RfTCgnXG4nKTsKICAgICAgfQogICAgfQogIH0KICByZXR1cm4gMDsKfQovLyBjTGF5IHZlcnNpb24gMjAyMTA2MDctMQoKLy8gLS0tIG9yaWdpbmFsIGNvZGUgLS0tCi8vIGludCBURVNUOwovLyBpbnQgWCwgWSwgUlsyMF0sIENbMjBdLCBtcFsyMF1bMjBdOwovLyBpbnQgcnJbMjBdLCBjY1syMF07Ci8vIGNoYXIgcmVzWzIwXVsyMl07Ci8vIG1heGZsb3c8aW50LGludD4gZmxvdzsKLy8gCi8vIGludCBjaGsoKXsKLy8gICBpbnQgbm9kZSwgc3QsIGVkLCB0b3QgPSAwOwovLyAgIG5vZGUgPSBYICsgWTsKLy8gICBzdCA9IG5vZGUrKzsKLy8gICBlZCA9IG5vZGUrKzsKLy8gICBmbG93LmluaXQobm9kZSk7Ci8vIAovLyAgIHJlcChpLFgpIHJyW2ldID0gUltpXTsKLy8gICByZXAoaSxZKSBjY1tpXSA9IENbaV07Ci8vICAgcmVwKGksWCkgcmVwKGosWSkgaWYobXBbaV1bal09PTEpIHJyW2ldLS0sIGNjW2pdLS07Ci8vICAgcmVwKGksWCkgcmVwKGosWSkgaWYobXBbaV1bal09PS0xKSBmbG93LmFkZEVkZ2UoaSxYK2osMSk7Ci8vIAovLyAgIGlmKG1pbihycihYKSkgPCAwIHx8IG1pbihjYyhZKSkgPCAwKSByZXR1cm4gMDsKLy8gICBpZihzdW0ocnIoWCkpICE9IHN1bShjYyhZKSkpIHJldHVybiAwOwovLyAgIHRvdCA9IHN1bShycihYKSk7Ci8vICAgcmVwKGksWCkgaWYocnJbaV0pIGZsb3cuYWRkRWRnZShzdCwgaSwgcnJbaV0pOwovLyAgIHJlcChpLFkpIGlmKGNjW2ldKSBmbG93LmFkZEVkZ2UoWCtpLCBlZCwgY2NbaV0pOwovLyAgIGlmKGZsb3cuc29sdmUoc3QsZWQpID09IHRvdCkgcmV0dXJuIDE7Ci8vICAgcmV0dXJuIDA7Ci8vIH0KLy8gCi8vIHsKLy8gICBmbG93Lm1hbGxvYygxZDUpOwovLyAgIFJFUChURVNULCByZF9pbnQoKSl7Ci8vICAgICB3dEYoIkNhc2UgI3tURVNUKzF9OiAiKTsKLy8gICAgIHJkKFgsWSxSKFgpLEMoWSkpOwovLyAgICAgcmVwKGksWCkgcmVwKGosWSkgbXBbaV1bal0gPSAtMTsKLy8gCi8vICAgICBpZighY2hrKCkpIHd0KCJJTVBPU1NJQkxFIiksIGNvbnRpbnVlOwovLyAKLy8gICAgIHJlcChpLFgpIHJyZXAoaixZKXsKLy8gICAgICAgbXBbaV1bal0gPSAxOwovLyAgICAgICBpZighY2hrKCkpIG1wW2ldW2pdID0gMDsKLy8gICAgIH0KLy8gCi8vICAgICByZXAoaSxYKSByZXAoaixZKSByZXNbaV1bal0gPSBpZlttcFtpXVtqXSwgJy8nLCAnXFwnXTsKLy8gICAgIHJlcChpLFgpIHJlc1tpXVtZXSA9ICdcMCc7Ci8vICAgICB3dCgiUE9TU0lCTEUiKTsKLy8gICAgIHd0TG4ocmVzKFgpKTsKLy8gICB9Ci8vIH0K