// src: http://t...content-available-to-author-only...i.com/cubecontest/winners.html
// By: Tomas Sirgedas, Ann Arbor, MI, USA
// fix by noski , Pete Lomax
#include <string.h>
#include <iostream>
using std :: string;
using std :: cout;
using std :: swap;
using std :: endl;
string data = "2#6'&78)5+1/AT[NJ_PERLQO@IAHPNSMBJCKLRMSDHEJNPOQFKGIQLSNF@DBROPMAGCEMPOACSRQDF";
char inva[48], b[48], cur_phase, search_mode, history_idx, history_mov[48], history_rpt[48], depth_to_go[5<<20], hash_table[48][6912];
struct Cubelet {
char pos, twi;
} cubelet [48];
int min(unsigned int a, unsigned int b) {
return a <b ? a : b;
}
void rot(char cur_phase) {
if (cur_phase <4) {
for (int i = -1; ++i<4;) {
cubelet[64^data[20+cur_phase*8+i]].twi = (cubelet[64^data[20+cur_phase*8+i]].twi+2-i%2) % 3;
cubelet[64^data[20+cur_phase*8+i+4]].twi ^= cur_phase <2;
}
}
for (int i = -1; ++i<7;) {
swap(cubelet[64^data[20+cur_phase*8+i+(i!=3)]], cubelet[64^data[20+cur_phase*8+i]]);
}
}
int hashf() {
int ret = 0;
switch (cur_phase) {
case 0:
for (int i = -1; ++i<11;) {
ret += ret + cubelet[i].twi;
}
return ret;
case 1:
for (int i = -1; ++i<7;) {
ret = ret*3 + cubelet[i+12].twi;
}
for (int i = -1; ++i<11;) {
ret += ret + (cubelet[i].pos>7);
}
return ret-7;
case 2:
for (int i = -1; ++i<8;) {
if (cubelet[i+12].pos<16) {
inva[cubelet[i+12].pos&3] = ret++;
}
else
{
b[i-ret] = cubelet[i+12].pos&3;
}
}
for (int i = -1; ++i<7;) {
ret += ret + (cubelet[i].pos>3);
}
for (int i = -1; ++i<7;) {
ret += ret + (cubelet[i+12].pos>15);
}
return ret*54 + (inva[b[0]] ^ inva[b[1]])*2 + ((inva[b[0]] ^ inva [b[2]]) > (inva[b[0]] ^ inva[b[3]])) - 3587708;
}
for (int i = -1; ++i<5;) {
ret *= 24;
for (int cp = -1; ++cp<4;) {
for (int k = -1; ++k<cp;) {
if (cubelet[i*4+cp].pos < cubelet[i*4+k].pos) {
//ret += cp << cp / 3;
ret += cp + (cp==3?cp:0);
}
}
}
}
return ret / 2;
}
int do_search(int dpt) {
int h = hashf(),
q = (cur_phase/2*19+8)<<7;
//if (dpt<1 && cur_phase==0) {
// cout << "do_search(" << dpt << " (cp=" << (int)cur_phase << ")) " << h << " " << q << endl;
//}
if ((dpt < hash_table[cur_phase][h%q] | dpt < hash_table[cur_phase+4][h/q]) ^ search_mode) {
if (search_mode) {
if (dpt <= depth_to_go[h]) {
return ! h;
}
else {
depth_to_go[h] = dpt;
}
}
if (hash_table[cur_phase][h%q] > dpt)
hash_table[cur_phase][h%q] = dpt;
if (hash_table[cur_phase+4][h/q] > dpt)
hash_table[cur_phase+4][h/q] = dpt;
for (int k = -1; ++k<6;) {
for (int i = -1; ++i<4;) {
rot(k);
if (k < cur_phase*2 & i!=1 || i>2)
continue;
history_mov[history_idx] = k;
history_rpt[history_idx++] = i;
if (do_search(dpt-search_mode*2+1))
return 1;
history_idx--;
}
}
}
return 0;
}
/*
const char *argv[] = {"rubik.exe", "UF", "UR", "UB", "UL", "DF", "DR", "DB", "DL", "FR", "FL", "BR", "BL", "UFR", "URB", "UBL", "ULF", "DRF", "DFL", "DLB", "DBR", NULL}; // (solved)
const char *argv[] = {"rubik.exe", "UR", "UB", "UL", "UF", "DF", "DR", "DB", "DL", "FR", "FL", "BR", "BL", "URB", "UBL", "ULF", "UFR", "DRF", "DFL", "DLB", "DBR", NULL};
const char *argv[] = {"rubik.exe", "UB", "UL", "UF", "UR", "DF", "DR", "DB", "DL", "FR", "FL", "BR", "BL", "UBL", "ULF", "UFR", "URB", "DRF", "DFL", "DLB", "DBR", NULL};
const char *argv[] = {"rubik.exe", "UL", "UF", "UR", "UB", "DF", "DR", "DB", "DL", "FR", "FL", "BR", "BL", "ULF", "UFR", "URB", "UBL", "DRF", "DFL", "DLB", "DBR", NULL};
*/
/*
const char *argv[] = {"rubik.exe", "LF", "UR", "UB", "UL", "RF", "DR", "DB", "DL", "FU", "FD", "BR", "BL", "LFU", "URB", "UBL", "LDF", "RUF", "RFD", "DLB", "DBR", NULL};
const char *argv[] = {"rubik.exe", "DF", "UR", "UB", "UL", "UF", "DR", "DB", "DL", "FL", "FR", "BR", "BL", "DFL", "URB", "UBL", "DRF", "ULF", "UFR", "DLB", "DBR", NULL};
const char *argv[] = {"rubik.exe", "RF", "UR", "UB", "UL", "LF", "DR", "DB", "DL", "FD", "FU", "BR", "BL", "RFD", "URB", "UBL", "RUF", "LDF", "LFU", "DLB", "DBR", NULL};
const char *argv[] = {"rubik.exe", "UF", "FR", "UB", "UL", "DF", "BR", "DB", "DL", "DR", "FL", "UR", "BL", "FDR", "FRU", "UBL", "ULF", "BRD", "DFL", "DLB", "BUR", NULL};
const char *argv[] = {"rubik.exe", "UF", "DR", "UB", "UL", "DF", "UR", "DB", "DL", "BR", "FL", "FR", "BL", "DBR", "DRF", "UBL", "ULF", "URB", "DFL", "DLB", "UFR", NULL};
const char *argv[] = {"rubik.exe", "UF", "BR", "UB", "UL", "DF", "FR", "DB", "DL", "UR", "FL", "DR", "BL", "BUR", "BRD", "UBL", "ULF", "FRU", "DFL", "DLB", "FDR", NULL};
const char *argv[] = {"rubik.exe", "UF", "UR", "UB", "UL", "DL", "DF", "DR", "DB", "FR", "FL", "BR", "BL", "UFR", "URB", "UBL", "ULF", "DFL", "DLB", "DBR", "DRF", NULL};
const char *argv[] = {"rubik.exe", "UF", "UR", "UB", "UL", "DB", "DL", "DF", "DR", "FR", "FL", "BR", "BL", "UFR", "URB", "UBL", "ULF", "DLB", "DBR", "DRF", "DFL", NULL};
const char *argv[] = {"rubik.exe", "UF", "UR", "UB", "UL", "DR", "DB", "DL", "DF", "FR", "FL", "BR", "BL", "UFR", "URB", "UBL", "ULF", "DBR", "DRF", "DFL", "DLB", NULL};
const char *argv[] = {"rubik.exe", "UF", "UR", "RB", "UL", "DF", "DR", "LB", "DL", "FR", "FL", "BD", "BU", "UFR", "RDB", "RBU", "ULF", "DRF", "DFL", "LUB", "LBD", NULL};
const char *argv[] = {"rubik.exe", "UF", "UR", "DB", "UL", "DF", "DR", "UB", "DL", "FR", "FL", "BL", "BR", "UFR", "DLB", "DBR", "ULF", "DRF", "DFL", "URB", "UBL", NULL};
const char *argv[] = {"rubik.exe", "UF", "UR", "LB", "UL", "DF", "DR", "RB", "DL", "FR", "FL", "BU", "BD", "UFR", "LUB", "LBD", "ULF", "DRF", "DFL", "RDB", "RBU", NULL};
const char *argv[] = {"rubik.exe", "UF", "UR", "UB", "BL", "DF", "DR", "DB", "FL", "FR", "UL", "BR", "DL", "UFR", "URB", "BDL", "BLU", "DRF", "FUL", "FLD", "DBR", NULL};
const char *argv[] = {"rubik.exe", "UF", "UR", "UB", "DL", "DF", "DR", "DB", "UL", "FR", "BL", "BR", "FL", "UFR", "URB", "DFL", "DLB", "DRF", "UBL", "ULF", "DBR", NULL};
const char *argv[] = {"rubik.exe", "UF", "UR", "UB", "FL", "DF", "DR", "DB", "BL", "FR", "DL", "BR", "UL", "UFR", "URB", "FUL", "FLD", "DRF", "BDL", "BLU", "DBR", NULL};
const char *argv[] = {"rubik.exe", "LB", "UL", "UF", "UR", "DF", "DR", "RB", "DL", "FR", "FL", "BU", "BD", "LBD", "ULF", "UFR", "LUB", "DRF", "DFL", "RDB", "RBU", NULL};
const char *argv[] = {"rubik.exe", "UR", "UB", "UL", "DL", "DF", "DR", "DB", "UF", "FR", "BL", "BR", "FL", "URB", "UBL", "DFL", "DLB", "DRF", "ULF", "UFR", "DBR", NULL};
const char *argv[] = {"rubik.exe", "UL", "BR", "UR", "UB", "DF", "FR", "DB", "DL", "UF", "FL", "DR", "BL", "RUF", "BRD", "URB", "UBL", "LFU", "DFL", "DLB", "FDR", NULL};
const char *argv[] = {"rubik.exe", "UF", "UR", "UB", "BL", "FL", "DF", "DR", "DB", "FR", "UL", "BR", "DL", "UFR", "URB", "BDL", "BLU", "FUL", "FLD", "DBR", "DRF", NULL};
const char *argv[] = {"rubik.exe", "UF", "UR", "UB", "DL", "UL", "DF", "DR", "DB", "FR", "BL", "BR", "FL", "UFR", "URB", "DFL", "DLB", "UBL", "ULF", "DBR", "DRF", NULL};
const char *argv[] = {"rubik.exe", "RF", "UR", "UB", "UL", "DB", "DL", "LF", "DR", "FD", "FU", "BR", "BL", "RFD", "URB", "UBL", "RUF", "DLB", "DBR", "LDF", "LFU", NULL};
const char *argv[] = {"rubik.exe", "LF", "DR", "UB", "UL", "RF", "UR", "DB", "DL", "BR", "FD", "FU", "BL", "DBR", "RUF", "UBL", "LDF", "URB", "RFD", "DLB", "LFU", NULL};
const char *argv[] = {"rubik.exe", "DF", "FL", "UB", "UL", "UF", "BR", "DB", "DL", "DR", "FR", "UR", "BL", "FUL", "FLD", "UBL", "DRF", "BRD", "UFR", "DLB", "BUR", NULL};
const char *argv[] = {"rubik.exe", "UB", "UL", "UF", "UR", "DL", "DF", "DR", "DB", "FR", "FL", "BR", "BL", "UBL", "ULF", "UFR", "URB", "DFL", "DLB", "DBR", "DRF", NULL};
const char *argv[] = {"rubik.exe", "UF", "DR", "UB", "BL", "DF", "UR", "DB", "FL", "BR", "UL", "FR", "DL", "DBR", "DRF", "BDL", "BLU", "URB", "FUL", "FLD", "UFR", NULL};
const char *argv[] = {"rubik.exe", "UF", "UR", "UB", "BL", "DL", "DF", "DR", "FL", "FR", "UL", "BR", "DB", "UFR", "URB", "RDB", "BLU", "DFL", "FUL", "LBD", "DRF", NULL};
const char *argv[] = {"rubik.exe", "DF", "UR", "UB", "UL", "DR", "DB", "DL", "UF", "FL", "FR", "BR", "BL", "DFL", "URB", "UBL", "DRF", "DBR", "ULF", "UFR", "DLB", NULL};
const char *argv[] = {"rubik.exe", "UB", "UL", "UF", "FR", "DF", "BR", "DB", "DL", "DR", "FL", "UR", "BL", "UBL", "ULF", "FDR", "FRU", "BRD", "DFL", "DLB", "BUR", NULL};
const char *argv[] = {"rubik.exe", "UR", "UB", "UL", "BL", "DF", "DR", "DB", "FL", "FR", "UF", "BR", "DL", "URB", "UBL", "BDL", "LFU", "DRF", "RUF", "FLD", "DBR", NULL};
const char *argv[] = {"rubik.exe", "UL", "UF", "DR", "UB", "DF", "UR", "DB", "DL", "BR", "FL", "FR", "BL", "ULF", "DBR", "DRF", "UBL", "URB", "DFL", "DLB", "UFR", NULL};
const char *argv[] = {"rubik.exe", "UL", "UF", "FR", "UB", "DF", "BR", "DB", "DL", "DR", "FL", "UR", "BL", "ULF", "FDR", "FRU", "UBL", "BRD", "DFL", "DLB", "BUR", NULL};
const char *argv[] = {"rubik.exe", "RF", "UL", "UF", "UR", "LF", "DR", "DB", "DL", "FD", "BU", "BR", "BL", "RFD", "ULF", "UFR", "LUB", "LDF", "RBU", "DLB", "DBR", NULL};
const char *argv[] = {"rubik.exe", "UB", "UL", "UF", "BR", "DF", "FR", "DB", "DL", "UR", "FL", "DR", "BL", "UBL", "ULF", "BUR", "BRD", "FRU", "DFL", "DLB", "FDR", NULL};
const char *argv[] = {"rubik.exe", "DR", "UR", "UB", "UL", "LF", "DB", "DL", "RF", "FD", "FU", "BR", "BL", "RUF", "URB", "UBL", "DBR", "LDF", "LFU", "RFD", "DLB", NULL};
const char *argv[] = {"rubik.exe", "DR", "UL", "UF", "UR", "UB", "DB", "DL", "DF", "FL", "FR", "BR", "BL", "DRF", "ULF", "UFR", "DBR", "URB", "UBL", "DFL", "DLB", NULL};
const char *argv[] = {"rubik.exe", "UF", "FR", "UB", "BL", "DB", "DL", "DF", "FL", "DR", "UL", "UR", "BR", "FDR", "FRU", "DBR", "BLU", "DLB", "FUL", "URB", "DFL", NULL};
const char *argv[] = {"rubik.exe", "UF", "BR", "UB", "UL", "DR", "DB", "DL", "FR", "UR", "FL", "DF", "BL", "BUR", "RFD", "UBL", "ULF", "DBR", "LDF", "FRU", "DLB", NULL};
const char *argv[] = {"rubik.exe", "RD", "FR", "DB", "UL", "LF", "BL", "UB", "DL", "FD", "FU", "UR", "BR", "LUB", "FRU", "DBR", "RFD", "LDF", "LFU", "URB", "BDL", NULL};
const char *argv[] = {"rubik.exe", "DF", "UR", "DB", "FR", "UF", "DR", "UB", "BR", "FL", "DL", "BL", "UL", "DFL", "DLB", "FDR", "FRU", "ULF", "BUR", "BRD", "UBL", NULL};
const char *argv[] = {"rubik.exe", "UL", "UF", "DR", "LB", "DF", "UR", "RB", "DL", "BU", "FL", "FR", "BD", "ULF", "RBU", "DRF", "LBD", "LUB", "DFL", "RDB", "UFR", NULL};
const char *argv[] = {"rubik.exe", "LF", "UR", "UB", "UL", "RB", "DR", "DB", "DL", "FR", "FD", "FU", "BL", "UFR", "RDB", "UBL", "LDF", "DRF", "RBU", "DLB", "LFU", NULL};
const char *argv[] = {"rubik.exe", "UF", "BR", "UB", "DB", "DL", "DF", "FR", "UL", "UR", "BL", "DR", "FL", "BUR", "BRD", "DLB", "FDR", "DFL", "UBL", "ULF", "FRU", NULL};
const char *argv[] = {"rubik.exe", "RF", "UR", "UB", "UL", "LB", "DR", "DB", "DL", "FD", "FL", "BR", "FU", "RFD", "URB", "LBD", "ULF", "LUB", "DFL", "RUF", "DBR", NULL};
const char *argv[] = {"rubik.exe", "LF", "BU", "LB", "UL", "RU", "FR", "RB", "DL", "FU", "FD", "DR", "BD", "LFU", "BUR", "LBD", "LDF", "UBL", "RUF", "RDB", "FDR", NULL};
const char *argv[] = {"rubik.exe", "DR", "UB", "UL", "BL", "DF", "UR", "DB", "FL", "BR", "UF", "FR", "DL", "DRF", "UBL", "BDL", "LFU", "URB", "RDB", "FLD", "UFR", NULL};
const char *argv[] = {"rubik.exe", "UF", "BR", "LB", "BD", "DF", "FR", "RD", "FL", "UR", "UL", "BU", "DL", "BUR", "LUB", "DRF", "BDL", "FRU", "FUL", "FLD", "RDB", NULL};
const char *argv[] = {"rubik.exe", "UL", "UF", "DB", "UB", "DF", "FR", "BR", "DL", "UR", "FL", "BL", "DR", "ULF", "DLB", "FDR", "UBL", "FRU", "DFL", "BUR", "BRD", NULL};
const char *argv[] = {"rubik.exe", "UF", "UR", "RB", "BU", "DF", "DR", "LF", "BL", "FR", "DL", "BD", "UL", "UFR", "RDB", "FLD", "BUR", "DRF", "BDL", "BLU", "LFU", NULL};
const char *argv[] = {"rubik.exe", "UF", "UR", "DB", "FL", "DR", "UB", "BL", "DF", "FR", "DL", "UL", "BR", "UFR", "BLU", "DBR", "FLD", "FUL", "DRF", "BDL", "URB", NULL};
const char *argv[] = {"rubik.exe", "DF", "BR", "RD", "UL", "UF", "FL", "LB", "DL", "UR", "FR", "BD", "BU", "BUR", "LFU", "RDB", "DRF", "FLD", "UFR", "LUB", "LBD", NULL};
const char *argv[] = {"rubik.exe", "LF", "UR", "UB", "UL", "DF", "DR", "DB", "RF", "FU", "LD", "BR", "BL", "LFU", "URB", "UBL", "BDL", "DRF", "RUF", "FLD", "DBR", NULL};
const char *argv[] = {"rubik.exe", "RU", "LF", "BL", "FR", "BR", "DB", "FD", "LD", "DR", "FU", "UB", "LU", "LDF", "BLU", "FRU", "DBR", "LBD", "DRF", "ULF", "RBU", NULL};
const char *argv[] = {"rubik.exe", "UF", "BD", "BL", "FL", "RB", "UB", "DR", "UL", "RF", "RU", "FD", "LD", "LDF", "LBD", "RUF", "FDR", "DBR", "LFU", "BUR", "LUB", NULL};
const char *argv[] = {"rubik.exe", "DF", "FU", "DB", "BL", "LF", "LU", "DR", "UR", "FR", "LD", "BR", "UB", "DFL", "ULF", "UFR", "BRD", "LUB", "DRF", "BUR", "LBD", NULL};
const char *argv[] = {"rubik.exe", "LU", "UB", "DR", "FR", "UF", "FL", "DL", "DF", "BD", "LB", "RU", "BR", "FUL", "BLU", "FRU", "DLB", "URB", "BRD", "RFD", "DFL", NULL};
const char *argv[] = {"rubik.exe", "RF", "RB", "LU", "FD", "FU", "FL", "LD", "RD", "DB", "UR", "BL", "BU", "RFD", "RUF", "LDF", "LUB", "ULF", "URB", "LBD", "BRD", NULL};
const char *argv[] = {"rubik.exe", "FL", "LU", "RU", "DL", "FU", "FR", "RD", "UB", "RB", "DB", "FD", "BL", "ULF", "RFD", "BDL", "FLD", "BUR", "FRU", "BRD", "BLU", NULL};
const char *argv[] = {"rubik.exe", "LU", "FD", "FL", "FU", "DR", "BD", "UB", "LB", "RB", "DL", "UR", "FR", "LBD", "UFR", "RFD", "BLU", "BUR", "ULF", "FLD", "DBR", NULL};
const char *argv[] = {"rubik.exe", "LB", "RB", "FU", "DF", "UB", "DB", "DL", "UR", "FR", "LF", "UL", "DR", "BDL", "UBL", "RUF", "FLD", "RDB", "ULF", "URB", "FDR", NULL};
const char *argv[] = {"rubik.exe", "FD", "FL", "UF", "UL", "UR", "DB", "DR", "BU", "BR", "FR", "LB", "LD", "DLB", "UFR", "LUB", "FUL", "BUR", "DRF", "BRD", "LDF", NULL};
const char *argv[] = {"rubik.exe", "UB", "UR", "UL", "DF", "DB", "LD", "RF", "BR", "LF", "RD", "BL", "UF", "BLU", "FDR", "BDL", "FUL", "RUF", "BRD", "DFL", "BUR", NULL};
const char *argv[] = {"rubik.exe", "LF", "UB", "UF", "DF", "UR", "DB", "RB", "UL", "RD", "RF", "LB", "LD", "BDL", "BRD", "LDF", "UFR", "BUR", "UBL", "LFU", "RFD", NULL};
const char *argv[] = {"rubik.exe", "DF", "FR", "UB", "BD", "FU", "BL", "RU", "BR", "RD", "DL", "LU", "LF", "DBR", "RUF", "BDL", "UBL", "RFD", "FLD", "BUR", "LFU", NULL};
const char *argv[] = {"rubik.exe", "FU", "FR", "RU", "LU", "LD", "BL", "FL", "RB", "UB", "BD", "RD", "FD", "FDR", "FUL", "FRU", "BDL", "LUB", "RDB", "URB", "FLD", NULL};
const char *argv[] = {"rubik.exe", "LD", "DF", "FR", "BR", "UF", "RU", "UB", "FL", "RD", "LB", "UL", "DB", "LDF", "BRD", "FRU", "LFU", "BDL", "RFD", "BUR", "LUB", NULL};
const char *argv[] = {"rubik.exe", "BD", "BU", "RU", "DL", "DF", "BL", "FR", "FL", "LU", "DR", "BR", "UF", "LDF", "LBD", "URB", "FUL", "BRD", "RUF", "UBL", "RFD", NULL};
const char *argv[] = {"rubik.exe", "FR", "LU", "BU", "DL", "BD", "UF", "UR", "BL", "FL", "FD", "BR", "DR", "RFD", "RUF", "BRD", "DFL", "LFU", "LBD", "UBL", "URB", NULL};
const char *argv[] = {"rubik.exe", "LU", "FU", "RU", "DF", "LB", "RB", "DL", "BD", "LF", "RD", "RF", "BU", "BRD", "DFL", "RBU", "LUB", "DLB", "LFU", "FDR", "RUF", NULL};
const char *argv[] = {"rubik.exe", "UB", "DF", "BD", "UF", "LB", "LF", "LU", "UR", "LD", "RD", "BR", "FR", "RBU", "LBD", "FDR", "UBL", "LFU", "DBR", "LDF", "RUF", NULL};
const char *argv[] = {"rubik.exe", "RB", "UB", "RF", "LF", "UF", "RD", "BL", "DL", "RU", "DF", "DB", "LU", "RFD", "LFU", "LDF", "RUF", "UBL", "RDB", "LBD", "URB", NULL};
const char *argv[] = {"rubik.exe", "FR", "LB", "FD", "FU", "DR", "BR", "LU", "BD", "UR", "BU", "LF", "LD", "LUB", "LFU", "BDL", "DBR", "DRF", "RBU", "FLD", "RUF", NULL};
const char *argv[] = {"rubik.exe", "UL", "DL", "RF", "UB", "FD", "BR", "DB", "UF", "DR", "UR", "BL", "FL", "FDR", "BLU", "DLB", "URB", "RUF", "FLD", "BRD", "FUL", NULL};
const char *argv[] = {"rubik.exe", "RU", "BU", "FL", "RD", "BD", "FR", "LU", "FD", "FU", "DL", "BL", "RB", "RUF", "DFL", "UBL", "ULF", "URB", "BDL", "DBR", "FDR", NULL};
const char *argv[] = {"rubik.exe", "RF", "DL", "BL", "LF", "DB", "BR", "FD", "BU", "RD", "FU", "RU", "LU", "URB", "LUB", "RFD", "DFL", "FRU", "BDL", "DBR", "ULF", NULL};
const char *argv[] = {"rubik.exe", "RU", "FL", "FR", "FU", "DL", "RD", "UB", "BD", "UL", "FD", "BL", "RB", "BDL", "BRD", "UFR", "FDR", "BLU", "RBU", "FLD", "LFU", NULL};
const char *argv[] = {"rubik.exe", "RF", "FU", "BU", "FL", "UL", "LD", "RB", "DB", "BL", "FD", "RU", "RD", "BRD", "RUF", "DLB", "UBL", "DFL", "LFU", "URB", "FDR", NULL};
const char *argv[] = {"rubik.exe", "FR", "RU", "UF", "LF", "BD", "LU", "BU", "DL", "RB", "FD", "LB", "DR", "FLD", "RUF", "BLU", "RFD", "DBR", "LFU", "LBD", "BUR", NULL};
const char *argv[] = {"rubik.exe", "FL", "RD", "BR", "UB", "UR", "DF", "BL", "UL", "FU", "BD", "DL", "RF", "ULF", "UBL", "FRU", "URB", "DRF", "BRD", "FLD", "DLB", NULL};
const char *argv[] = {"rubik.exe", "BR", "LU", "UB", "BL", "FR", "RD", "FL", "FD", "BD", "UF", "UR", "DL", "DBR", "BUR", "FLD", "LUB", "RFD", "FRU", "ULF", "BDL", NULL};
const char *argv[] = {"rubik.exe", "UL", "DF", "LB", "RU", "BR", "UF", "BD", "LD", "LF", "BU", "DR", "FR", "FRU", "BUR", "LDF", "DRF", "UBL", "RDB", "BDL", "ULF", NULL};
const char *argv[] = {"rubik.exe", "UB", "FR", "LU", "RD", "RU", "UF", "LF", "RB", "LB", "DF", "LD", "BD", "RFD", "BDL", "ULF", "LUB", "LDF", "BUR", "RUF", "BRD", NULL};
const char *argv[] = {"rubik.exe", "BR", "FD", "UF", "LB", "UL", "UB", "RF", "DR", "FL", "RU", "LD", "BD", "UBL", "ULF", "RUF", "FLD", "BDL", "RDB", "BUR", "DRF", NULL};
const char *argv[] = {"rubik.exe", "RU", "FR", "LB", "DL", "BD", "DF", "LF", "BR", "UF", "UL", "DR", "UB", "DFL", "BLU", "BRD", "UFR", "LBD", "ULF", "FDR", "RBU", NULL};
const char *argv[] = {"rubik.exe", "LD", "LU", "DF", "LB", "UR", "FL", "DR", "BR", "FR", "UF", "UB", "BD", "DFL", "DRF", "LUB", "LFU", "DLB", "RUF", "DBR", "RBU", NULL};
const char *argv[] = {"rubik.exe", "LB", "DB", "RU", "DF", "LU", "BU", "RF", "RB", "UF", "RD", "DL", "LF", "DLB", "LFU", "FLD", "RDB", "FDR", "BLU", "BUR", "UFR", NULL};
const char *argv[] = {"rubik.exe", "DR", "DB", "BU", "DL", "BL", "DF", "BR", "FL", "UL", "UR", "FR", "FU", "ULF", "UFR", "DBR", "DFL", "BLU", "BUR", "BDL", "RFD", NULL};
const char *argv[] = {"rubik.exe", "DB", "DL", "DF", "UF", "UB", "FR", "LB", "DR", "UL", "LF", "UR", "BR", "DRF", "LDF", "UFR", "BRD", "DLB", "RBU", "UBL", "FUL", NULL};
const char *argv[] = {"rubik.exe", "BL", "DF", "UL", "RB", "BD", "UR", "UB", "FL", "LD", "DR", "RF", "UF", "URB", "LBD", "LFU", "RFD", "BRD", "BLU", "FRU", "DFL", NULL};
const char *argv[] = {"rubik.exe", "UL", "DR", "BU", "BL", "DF", "LD", "BR", "DB", "LF", "RF", "FU", "RU", "BLU", "URB", "LBD", "FDR", "DFL", "DBR", "LFU", "FRU", NULL};
const char *argv[] = {"rubik.exe", "UR", "BL", "DB", "RB", "FL", "UB", "DL", "UF", "DF", "RF", "RD", "LU", "DFL", "BLU", "FDR", "LBD", "BUR", "UFR", "LFU", "RDB", NULL};
const char *argv[] = {"rubik.exe", "DL", "LU", "FU", "BD", "RD", "FR", "RB", "BL", "FD", "UR", "FL", "UB", "BDL", "FLD", "ULF", "RBU", "FRU", "RDB", "BLU", "RFD", NULL};
const char *argv[] = {"rubik.exe", "UB", "FU", "LU", "DL", "RB", "DB", "LB", "RF", "FD", "RU", "LF", "DR", "FRU", "DRF", "BLU", "BUR", "BRD", "DLB", "FLD", "ULF", NULL};
const char *argv[] = {"rubik.exe", "UR", "FU", "DL", "UL", "BL", "LF", "FD", "UB", "RB", "FR", "DR", "DB", "UFR", "BLU", "BUR", "FLD", "DLB", "LFU", "RFD", "DBR", NULL};
const char *argv[] = {"rubik.exe", "RB", "UF", "DF", "FR", "DL", "DR", "UL", "UR", "UB", "BL", "FL", "BD", "FLD", "RDB", "BLU", "BUR", "RUF", "RFD", "LBD", "FUL", NULL};
const char *argv[] = {"rubik.exe", "BD", "LU", "UB", "DL", "DR", "BL", "RF", "DF", "BR", "UF", "LF", "UR", "FLD", "LUB", "RUF", "LBD", "RDB", "ULF", "DRF", "RBU", NULL};
const char *argv[] = {"rubik.exe", "RU", "LF", "RD", "RF", "FU", "UL", "BD", "DF", "RB", "LB", "BU", "LD", "LBD", "URB", "LUB", "DRF", "ULF", "FLD", "RDB", "UFR", NULL};
*/
const char *argv[] = {"rubik.exe", "UL", "DB", "BR", "FL", "BL", "DR", "FD", "RU", "FR", "UB", "LD", "FU", "FDR", "FUL", "BDL", "RBU", "FLD", "RUF", "DBR", "LUB", NULL};
/*
*/
int argc = sizeof(argv) / sizeof(char*) - 1;
int main () {
if (argc != 21) {
cout << endl
<< "### Input Error. Argument Format:" << endl
<< argc << endl
<< argv << endl
<< "rubik.exe UF UR UB UL DF DR DB DL FR FR BR BR UFR URB UBL ULF DRF DFL DLB DBR" << endl;
return 0;
}
memset(hash_table, 6, sizeof(hash_table));
for (int i = -1; ++i<20;) {
cubelet[i].pos = i;
}
for (cur_phase = -1; ++cur_phase<4;) {
do_search(0);
}
for (int i = -1; ++i<20;) {
string s = argv [i + 1] + string ("!");
cubelet[i].pos = data.find(s[0] ^ s[1] ^ s[2]);
int x = min(s.find('U'), s.find('D'));
cubelet[i].twi = ~ x? x: s[0]>'F';
//cout << "cubelet(" << i << ") = {" << (int)cubelet[i].pos << "," << (int)cubelet[i].twi << "}" << endl;
}
for (int i = -1; ++i<5;) {
int j = 64^data[20+cur_phase*8+i+16],
k = 64^data[20+cur_phase*8+i+21];
swap(cubelet[j], cubelet[k]);
//cout << "swap(" << j << "," << k << ")" << endl;
}
// for (int i = -1; ++i<20;) {
//cout << "cubelet(" << i << ") = {" << (int)cubelet[i].pos << "," << (int)cubelet[i].twi << "}" << endl;
// }
search_mode = 1;
for (cur_phase = -1; ++cur_phase<4;) {
// cout << (int)cur_phase << endl;
for (int i = -1; ++i<20;) {
// cout << (int)cur_phase << ",i=" << i << endl;
if (do_search (i)) break ;
}
}
cout << "soluton (" << (int)history_idx << " moves)" << endl;
for (int k = -1; ++k<history_idx;) {
cout << "FBRLUD"[history_mov[k]] << history_rpt[k]+1 << "";
}
cout << endl;
return 0;
}
Ly8gc3JjOiBodHRwOi8vdC4uLmNvbnRlbnQtYXZhaWxhYmxlLXRvLWF1dGhvci1vbmx5Li4uaS5jb20vY3ViZWNvbnRlc3Qvd2lubmVycy5odG1sIAovLyBCeTogVG9tYXMgU2lyZ2VkYXMsIEFubiBBcmJvciwgTUksIFVTQSAKLy8gZml4IGJ5IG5vc2tpICwgUGV0ZSBMb21heAojaW5jbHVkZSA8c3RyaW5nLmg+IAojaW5jbHVkZSA8aW9zdHJlYW0+IAp1c2luZyBzdGQgOjogc3RyaW5nOyAKdXNpbmcgc3RkIDo6IGNvdXQ7IAp1c2luZyBzdGQgOjogc3dhcDsgCnVzaW5nIHN0ZCA6OiBlbmRsOyAKc3RyaW5nIGRhdGEgPSAiMiM2JyY3OCk1KzEvQVRbTkpfUEVSTFFPQElBSFBOU01CSkNLTFJNU0RIRUpOUE9RRktHSVFMU05GQERCUk9QTUFHQ0VNUE9BQ1NSUURGIjsKY2hhciBpbnZhWzQ4XSwgYls0OF0sIGN1cl9waGFzZSwgc2VhcmNoX21vZGUsIGhpc3RvcnlfaWR4LCBoaXN0b3J5X21vdls0OF0sIGhpc3RvcnlfcnB0WzQ4XSwgZGVwdGhfdG9fZ29bNTw8MjBdLCBoYXNoX3RhYmxlWzQ4XVs2OTEyXTsKCnN0cnVjdCBDdWJlbGV0IHsgCiAgY2hhciBwb3MsIHR3aTsgCn0gY3ViZWxldCBbNDhdOyAKCmludCBtaW4odW5zaWduZWQgaW50IGEsIHVuc2lnbmVkIGludCBiKSB7IAogICAgcmV0dXJuIGEgPGIgPyBhIDogYjsgCn0gCgp2b2lkIHJvdChjaGFyIGN1cl9waGFzZSkgeyAKICAgIGlmIChjdXJfcGhhc2UgPDQpIHsKICAgICAgICBmb3IgKGludCBpID0gLTE7ICsraTw0OykgewogICAgICAgICAgICBjdWJlbGV0WzY0XmRhdGFbMjArY3VyX3BoYXNlKjgraV1dLnR3aSA9IChjdWJlbGV0WzY0XmRhdGFbMjArY3VyX3BoYXNlKjgraV1dLnR3aSsyLWklMikgJSAzOwogICAgICAgICAgICBjdWJlbGV0WzY0XmRhdGFbMjArY3VyX3BoYXNlKjgraSs0XV0udHdpIF49IGN1cl9waGFzZSA8MjsgCiAgICAgICAgfQogICAgfSAKICAgIGZvciAoaW50IGkgPSAtMTsgKytpPDc7KSB7CiAgICAgICAgc3dhcChjdWJlbGV0WzY0XmRhdGFbMjArY3VyX3BoYXNlKjgraSsoaSE9MyldXSwgY3ViZWxldFs2NF5kYXRhWzIwK2N1cl9waGFzZSo4K2ldXSk7IAogICAgfQp9CgppbnQgaGFzaGYoKSB7IAogICAgaW50IHJldCA9IDA7IAogICAgc3dpdGNoIChjdXJfcGhhc2UpIHsgCiAgICAgICAgY2FzZSAwOiAKICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAtMTsgKytpPDExOykgewogICAgICAgICAgICAgICAgICAgIHJldCArPSByZXQgKyBjdWJlbGV0W2ldLnR3aTsgCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4gcmV0OyAKICAgICAgICBjYXNlIDE6IAogICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IC0xOyArK2k8NzspIHsKICAgICAgICAgICAgICAgICAgICByZXQgPSByZXQqMyArIGN1YmVsZXRbaSsxMl0udHdpOyAKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAtMTsgKytpPDExOykgewogICAgICAgICAgICAgICAgICAgIHJldCArPSByZXQgKyAoY3ViZWxldFtpXS5wb3M+Nyk7IAogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcmV0dXJuIHJldC03OyAKICAgICAgICBjYXNlIDI6IAogICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IC0xOyArK2k8ODspIHsKICAgICAgICAgICAgICAgICAgICBpZiAoY3ViZWxldFtpKzEyXS5wb3M8MTYpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaW52YVtjdWJlbGV0W2krMTJdLnBvcyYzXSA9IHJldCsrOyAKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgYltpLXJldF0gPSBjdWJlbGV0W2krMTJdLnBvcyYzOyAKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gLTE7ICsraTw3OykgewogICAgICAgICAgICAgICAgICAgIHJldCArPSByZXQgKyAoY3ViZWxldFtpXS5wb3M+Myk7IAogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IC0xOyArK2k8NzspIHsKICAgICAgICAgICAgICAgICAgICByZXQgKz0gcmV0ICsgKGN1YmVsZXRbaSsxMl0ucG9zPjE1KTsgCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4gcmV0KjU0ICsgKGludmFbYlswXV0gXiBpbnZhW2JbMV1dKSoyICsgKChpbnZhW2JbMF1dIF4gaW52YSBbYlsyXV0pID4gKGludmFbYlswXV0gXiBpbnZhW2JbM11dKSkgLSAzNTg3NzA4OyAKICAgIH0gCiAgICBmb3IgKGludCBpID0gLTE7ICsraTw1OykgeyAKICAgICAgICByZXQgKj0gMjQ7IAogICAgICAgIGZvciAoaW50IGNwID0gLTE7ICsrY3A8NDspIHsKICAgICAgICAgICAgZm9yIChpbnQgayA9IC0xOyArK2s8Y3A7KSB7CiAgICAgICAgICAgICAgICBpZiAoY3ViZWxldFtpKjQrY3BdLnBvcyA8IGN1YmVsZXRbaSo0K2tdLnBvcykgewogICAgICAgICAgICAgICAgICAgIC8vcmV0ICs9IGNwIDw8IGNwIC8gMzsgCiAgICAgICAgICAgICAgICAgICAgcmV0ICs9IGNwICsgKGNwPT0zP2NwOjApOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfSAKICAgIHJldHVybiByZXQgLyAyOyAKfSAKCmludCBkb19zZWFyY2goaW50IGRwdCkgeyAKICAgIGludCBoID0gaGFzaGYoKSwgCiAgICAgICAgcSA9IChjdXJfcGhhc2UvMioxOSs4KTw8NzsgCi8vaWYgKGRwdDwxICYmIGN1cl9waGFzZT09MCkgewogIC8vICBjb3V0IDw8ICJkb19zZWFyY2goIiA8PCBkcHQgPDwgIiAoY3A9IiA8PCAoaW50KWN1cl9waGFzZSA8PCAiKSkgIiA8PCBoIDw8ICIgIiA8PCBxIDw8IGVuZGw7Ci8vfQogICAgaWYgKChkcHQgPCBoYXNoX3RhYmxlW2N1cl9waGFzZV1baCVxXSB8IGRwdCA8IGhhc2hfdGFibGVbY3VyX3BoYXNlKzRdW2gvcV0pIF4gc2VhcmNoX21vZGUpIHsgCiAgICAgICAgaWYgKHNlYXJjaF9tb2RlKSB7CiAgICAgICAgICAgIGlmIChkcHQgPD0gZGVwdGhfdG9fZ29baF0pIHsKICAgICAgICAgICAgICAgIHJldHVybiAhIGg7IAogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgZGVwdGhfdG9fZ29baF0gPSBkcHQ7IAogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmIChoYXNoX3RhYmxlW2N1cl9waGFzZV1baCVxXSA+IGRwdCkgCiAgICAgICAgICAgIGhhc2hfdGFibGVbY3VyX3BoYXNlXVtoJXFdID0gZHB0OyAKICAgICAgICBpZiAoaGFzaF90YWJsZVtjdXJfcGhhc2UrNF1baC9xXSA+IGRwdCkgCiAgICAgICAgICAgIGhhc2hfdGFibGVbY3VyX3BoYXNlKzRdW2gvcV0gPSBkcHQ7IAogICAgICAgIGZvciAoaW50IGsgPSAtMTsgKytrPDY7KSB7CiAgICAgICAgICAgIGZvciAoaW50IGkgPSAtMTsgKytpPDQ7KSB7IAogICAgICAgICAgICAgICAgcm90KGspOyAKICAgICAgICAgICAgICAgIGlmIChrIDwgY3VyX3BoYXNlKjIgJiBpIT0xIHx8IGk+MikgCiAgICAgICAgICAgICAgICAgICAgY29udGludWU7IAogICAgICAgICAgICAgICAgaGlzdG9yeV9tb3ZbaGlzdG9yeV9pZHhdID0gazsgCiAgICAgICAgICAgICAgICBoaXN0b3J5X3JwdFtoaXN0b3J5X2lkeCsrXSA9IGk7IAogICAgICAgICAgICAgICAgaWYgKGRvX3NlYXJjaChkcHQtc2VhcmNoX21vZGUqMisxKSkgCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDE7IAogICAgICAgICAgICAgICAgaGlzdG9yeV9pZHgtLTsgCiAgICAgICAgICAgIH0gCiAgICAgICAgfQogICAgfSAKICAgIHJldHVybiAwOyAKfSAKCi8qCmNvbnN0IGNoYXIgKmFyZ3ZbXSA9IHsicnViaWsuZXhlIiwgIlVGIiwgIlVSIiwgIlVCIiwgIlVMIiwgIkRGIiwgIkRSIiwgIkRCIiwgIkRMIiwgIkZSIiwgIkZMIiwgIkJSIiwgIkJMIiwgIlVGUiIsICJVUkIiLCAiVUJMIiwgIlVMRiIsICJEUkYiLCAiREZMIiwgIkRMQiIsICJEQlIiLCBOVUxMfTsgICAgICAgLy8gKHNvbHZlZCkKY29uc3QgY2hhciAqYXJndltdID0geyJydWJpay5leGUiLCAiVVIiLCAiVUIiLCAiVUwiLCAiVUYiLCAiREYiLCAiRFIiLCAiREIiLCAiREwiLCAiRlIiLCAiRkwiLCAiQlIiLCAiQkwiLCAiVVJCIiwgIlVCTCIsICJVTEYiLCAiVUZSIiwgIkRSRiIsICJERkwiLCAiRExCIiwgIkRCUiIsIE5VTEx9Owpjb25zdCBjaGFyICphcmd2W10gPSB7InJ1YmlrLmV4ZSIsICJVQiIsICJVTCIsICJVRiIsICJVUiIsICJERiIsICJEUiIsICJEQiIsICJETCIsICJGUiIsICJGTCIsICJCUiIsICJCTCIsICJVQkwiLCAiVUxGIiwgIlVGUiIsICJVUkIiLCAiRFJGIiwgIkRGTCIsICJETEIiLCAiREJSIiwgTlVMTH07CmNvbnN0IGNoYXIgKmFyZ3ZbXSA9IHsicnViaWsuZXhlIiwgIlVMIiwgIlVGIiwgIlVSIiwgIlVCIiwgIkRGIiwgIkRSIiwgIkRCIiwgIkRMIiwgIkZSIiwgIkZMIiwgIkJSIiwgIkJMIiwgIlVMRiIsICJVRlIiLCAiVVJCIiwgIlVCTCIsICJEUkYiLCAiREZMIiwgIkRMQiIsICJEQlIiLCBOVUxMfTsKKi8KLyoKY29uc3QgY2hhciAqYXJndltdID0geyJydWJpay5leGUiLCAiTEYiLCAiVVIiLCAiVUIiLCAiVUwiLCAiUkYiLCAiRFIiLCAiREIiLCAiREwiLCAiRlUiLCAiRkQiLCAiQlIiLCAiQkwiLCAiTEZVIiwgIlVSQiIsICJVQkwiLCAiTERGIiwgIlJVRiIsICJSRkQiLCAiRExCIiwgIkRCUiIsIE5VTEx9Owpjb25zdCBjaGFyICphcmd2W10gPSB7InJ1YmlrLmV4ZSIsICJERiIsICJVUiIsICJVQiIsICJVTCIsICJVRiIsICJEUiIsICJEQiIsICJETCIsICJGTCIsICJGUiIsICJCUiIsICJCTCIsICJERkwiLCAiVVJCIiwgIlVCTCIsICJEUkYiLCAiVUxGIiwgIlVGUiIsICJETEIiLCAiREJSIiwgTlVMTH07CmNvbnN0IGNoYXIgKmFyZ3ZbXSA9IHsicnViaWsuZXhlIiwgIlJGIiwgIlVSIiwgIlVCIiwgIlVMIiwgIkxGIiwgIkRSIiwgIkRCIiwgIkRMIiwgIkZEIiwgIkZVIiwgIkJSIiwgIkJMIiwgIlJGRCIsICJVUkIiLCAiVUJMIiwgIlJVRiIsICJMREYiLCAiTEZVIiwgIkRMQiIsICJEQlIiLCBOVUxMfTsKY29uc3QgY2hhciAqYXJndltdID0geyJydWJpay5leGUiLCAiVUYiLCAiRlIiLCAiVUIiLCAiVUwiLCAiREYiLCAiQlIiLCAiREIiLCAiREwiLCAiRFIiLCAiRkwiLCAiVVIiLCAiQkwiLCAiRkRSIiwgIkZSVSIsICJVQkwiLCAiVUxGIiwgIkJSRCIsICJERkwiLCAiRExCIiwgIkJVUiIsIE5VTEx9Owpjb25zdCBjaGFyICphcmd2W10gPSB7InJ1YmlrLmV4ZSIsICJVRiIsICJEUiIsICJVQiIsICJVTCIsICJERiIsICJVUiIsICJEQiIsICJETCIsICJCUiIsICJGTCIsICJGUiIsICJCTCIsICJEQlIiLCAiRFJGIiwgIlVCTCIsICJVTEYiLCAiVVJCIiwgIkRGTCIsICJETEIiLCAiVUZSIiwgTlVMTH07CmNvbnN0IGNoYXIgKmFyZ3ZbXSA9IHsicnViaWsuZXhlIiwgIlVGIiwgIkJSIiwgIlVCIiwgIlVMIiwgIkRGIiwgIkZSIiwgIkRCIiwgIkRMIiwgIlVSIiwgIkZMIiwgIkRSIiwgIkJMIiwgIkJVUiIsICJCUkQiLCAiVUJMIiwgIlVMRiIsICJGUlUiLCAiREZMIiwgIkRMQiIsICJGRFIiLCBOVUxMfTsKY29uc3QgY2hhciAqYXJndltdID0geyJydWJpay5leGUiLCAiVUYiLCAiVVIiLCAiVUIiLCAiVUwiLCAiREwiLCAiREYiLCAiRFIiLCAiREIiLCAiRlIiLCAiRkwiLCAiQlIiLCAiQkwiLCAiVUZSIiwgIlVSQiIsICJVQkwiLCAiVUxGIiwgIkRGTCIsICJETEIiLCAiREJSIiwgIkRSRiIsIE5VTEx9Owpjb25zdCBjaGFyICphcmd2W10gPSB7InJ1YmlrLmV4ZSIsICJVRiIsICJVUiIsICJVQiIsICJVTCIsICJEQiIsICJETCIsICJERiIsICJEUiIsICJGUiIsICJGTCIsICJCUiIsICJCTCIsICJVRlIiLCAiVVJCIiwgIlVCTCIsICJVTEYiLCAiRExCIiwgIkRCUiIsICJEUkYiLCAiREZMIiwgTlVMTH07CmNvbnN0IGNoYXIgKmFyZ3ZbXSA9IHsicnViaWsuZXhlIiwgIlVGIiwgIlVSIiwgIlVCIiwgIlVMIiwgIkRSIiwgIkRCIiwgIkRMIiwgIkRGIiwgIkZSIiwgIkZMIiwgIkJSIiwgIkJMIiwgIlVGUiIsICJVUkIiLCAiVUJMIiwgIlVMRiIsICJEQlIiLCAiRFJGIiwgIkRGTCIsICJETEIiLCBOVUxMfTsKY29uc3QgY2hhciAqYXJndltdID0geyJydWJpay5leGUiLCAiVUYiLCAiVVIiLCAiUkIiLCAiVUwiLCAiREYiLCAiRFIiLCAiTEIiLCAiREwiLCAiRlIiLCAiRkwiLCAiQkQiLCAiQlUiLCAiVUZSIiwgIlJEQiIsICJSQlUiLCAiVUxGIiwgIkRSRiIsICJERkwiLCAiTFVCIiwgIkxCRCIsIE5VTEx9Owpjb25zdCBjaGFyICphcmd2W10gPSB7InJ1YmlrLmV4ZSIsICJVRiIsICJVUiIsICJEQiIsICJVTCIsICJERiIsICJEUiIsICJVQiIsICJETCIsICJGUiIsICJGTCIsICJCTCIsICJCUiIsICJVRlIiLCAiRExCIiwgIkRCUiIsICJVTEYiLCAiRFJGIiwgIkRGTCIsICJVUkIiLCAiVUJMIiwgTlVMTH07CmNvbnN0IGNoYXIgKmFyZ3ZbXSA9IHsicnViaWsuZXhlIiwgIlVGIiwgIlVSIiwgIkxCIiwgIlVMIiwgIkRGIiwgIkRSIiwgIlJCIiwgIkRMIiwgIkZSIiwgIkZMIiwgIkJVIiwgIkJEIiwgIlVGUiIsICJMVUIiLCAiTEJEIiwgIlVMRiIsICJEUkYiLCAiREZMIiwgIlJEQiIsICJSQlUiLCBOVUxMfTsKY29uc3QgY2hhciAqYXJndltdID0geyJydWJpay5leGUiLCAiVUYiLCAiVVIiLCAiVUIiLCAiQkwiLCAiREYiLCAiRFIiLCAiREIiLCAiRkwiLCAiRlIiLCAiVUwiLCAiQlIiLCAiREwiLCAiVUZSIiwgIlVSQiIsICJCREwiLCAiQkxVIiwgIkRSRiIsICJGVUwiLCAiRkxEIiwgIkRCUiIsIE5VTEx9Owpjb25zdCBjaGFyICphcmd2W10gPSB7InJ1YmlrLmV4ZSIsICJVRiIsICJVUiIsICJVQiIsICJETCIsICJERiIsICJEUiIsICJEQiIsICJVTCIsICJGUiIsICJCTCIsICJCUiIsICJGTCIsICJVRlIiLCAiVVJCIiwgIkRGTCIsICJETEIiLCAiRFJGIiwgIlVCTCIsICJVTEYiLCAiREJSIiwgTlVMTH07CmNvbnN0IGNoYXIgKmFyZ3ZbXSA9IHsicnViaWsuZXhlIiwgIlVGIiwgIlVSIiwgIlVCIiwgIkZMIiwgIkRGIiwgIkRSIiwgIkRCIiwgIkJMIiwgIkZSIiwgIkRMIiwgIkJSIiwgIlVMIiwgIlVGUiIsICJVUkIiLCAiRlVMIiwgIkZMRCIsICJEUkYiLCAiQkRMIiwgIkJMVSIsICJEQlIiLCBOVUxMfTsKY29uc3QgY2hhciAqYXJndltdID0geyJydWJpay5leGUiLCAiTEIiLCAiVUwiLCAiVUYiLCAiVVIiLCAiREYiLCAiRFIiLCAiUkIiLCAiREwiLCAiRlIiLCAiRkwiLCAiQlUiLCAiQkQiLCAiTEJEIiwgIlVMRiIsICJVRlIiLCAiTFVCIiwgIkRSRiIsICJERkwiLCAiUkRCIiwgIlJCVSIsIE5VTEx9Owpjb25zdCBjaGFyICphcmd2W10gPSB7InJ1YmlrLmV4ZSIsICJVUiIsICJVQiIsICJVTCIsICJETCIsICJERiIsICJEUiIsICJEQiIsICJVRiIsICJGUiIsICJCTCIsICJCUiIsICJGTCIsICJVUkIiLCAiVUJMIiwgIkRGTCIsICJETEIiLCAiRFJGIiwgIlVMRiIsICJVRlIiLCAiREJSIiwgTlVMTH07CmNvbnN0IGNoYXIgKmFyZ3ZbXSA9IHsicnViaWsuZXhlIiwgIlVMIiwgIkJSIiwgIlVSIiwgIlVCIiwgIkRGIiwgIkZSIiwgIkRCIiwgIkRMIiwgIlVGIiwgIkZMIiwgIkRSIiwgIkJMIiwgIlJVRiIsICJCUkQiLCAiVVJCIiwgIlVCTCIsICJMRlUiLCAiREZMIiwgIkRMQiIsICJGRFIiLCBOVUxMfTsKY29uc3QgY2hhciAqYXJndltdID0geyJydWJpay5leGUiLCAiVUYiLCAiVVIiLCAiVUIiLCAiQkwiLCAiRkwiLCAiREYiLCAiRFIiLCAiREIiLCAiRlIiLCAiVUwiLCAiQlIiLCAiREwiLCAiVUZSIiwgIlVSQiIsICJCREwiLCAiQkxVIiwgIkZVTCIsICJGTEQiLCAiREJSIiwgIkRSRiIsIE5VTEx9Owpjb25zdCBjaGFyICphcmd2W10gPSB7InJ1YmlrLmV4ZSIsICJVRiIsICJVUiIsICJVQiIsICJETCIsICJVTCIsICJERiIsICJEUiIsICJEQiIsICJGUiIsICJCTCIsICJCUiIsICJGTCIsICJVRlIiLCAiVVJCIiwgIkRGTCIsICJETEIiLCAiVUJMIiwgIlVMRiIsICJEQlIiLCAiRFJGIiwgTlVMTH07CmNvbnN0IGNoYXIgKmFyZ3ZbXSA9IHsicnViaWsuZXhlIiwgIlJGIiwgIlVSIiwgIlVCIiwgIlVMIiwgIkRCIiwgIkRMIiwgIkxGIiwgIkRSIiwgIkZEIiwgIkZVIiwgIkJSIiwgIkJMIiwgIlJGRCIsICJVUkIiLCAiVUJMIiwgIlJVRiIsICJETEIiLCAiREJSIiwgIkxERiIsICJMRlUiLCBOVUxMfTsKY29uc3QgY2hhciAqYXJndltdID0geyJydWJpay5leGUiLCAiTEYiLCAiRFIiLCAiVUIiLCAiVUwiLCAiUkYiLCAiVVIiLCAiREIiLCAiREwiLCAiQlIiLCAiRkQiLCAiRlUiLCAiQkwiLCAiREJSIiwgIlJVRiIsICJVQkwiLCAiTERGIiwgIlVSQiIsICJSRkQiLCAiRExCIiwgIkxGVSIsIE5VTEx9Owpjb25zdCBjaGFyICphcmd2W10gPSB7InJ1YmlrLmV4ZSIsICJERiIsICJGTCIsICJVQiIsICJVTCIsICJVRiIsICJCUiIsICJEQiIsICJETCIsICJEUiIsICJGUiIsICJVUiIsICJCTCIsICJGVUwiLCAiRkxEIiwgIlVCTCIsICJEUkYiLCAiQlJEIiwgIlVGUiIsICJETEIiLCAiQlVSIiwgTlVMTH07CmNvbnN0IGNoYXIgKmFyZ3ZbXSA9IHsicnViaWsuZXhlIiwgIlVCIiwgIlVMIiwgIlVGIiwgIlVSIiwgIkRMIiwgIkRGIiwgIkRSIiwgIkRCIiwgIkZSIiwgIkZMIiwgIkJSIiwgIkJMIiwgIlVCTCIsICJVTEYiLCAiVUZSIiwgIlVSQiIsICJERkwiLCAiRExCIiwgIkRCUiIsICJEUkYiLCBOVUxMfTsKY29uc3QgY2hhciAqYXJndltdID0geyJydWJpay5leGUiLCAiVUYiLCAiRFIiLCAiVUIiLCAiQkwiLCAiREYiLCAiVVIiLCAiREIiLCAiRkwiLCAiQlIiLCAiVUwiLCAiRlIiLCAiREwiLCAiREJSIiwgIkRSRiIsICJCREwiLCAiQkxVIiwgIlVSQiIsICJGVUwiLCAiRkxEIiwgIlVGUiIsIE5VTEx9Owpjb25zdCBjaGFyICphcmd2W10gPSB7InJ1YmlrLmV4ZSIsICJVRiIsICJVUiIsICJVQiIsICJCTCIsICJETCIsICJERiIsICJEUiIsICJGTCIsICJGUiIsICJVTCIsICJCUiIsICJEQiIsICJVRlIiLCAiVVJCIiwgIlJEQiIsICJCTFUiLCAiREZMIiwgIkZVTCIsICJMQkQiLCAiRFJGIiwgTlVMTH07CmNvbnN0IGNoYXIgKmFyZ3ZbXSA9IHsicnViaWsuZXhlIiwgIkRGIiwgIlVSIiwgIlVCIiwgIlVMIiwgIkRSIiwgIkRCIiwgIkRMIiwgIlVGIiwgIkZMIiwgIkZSIiwgIkJSIiwgIkJMIiwgIkRGTCIsICJVUkIiLCAiVUJMIiwgIkRSRiIsICJEQlIiLCAiVUxGIiwgIlVGUiIsICJETEIiLCBOVUxMfTsKY29uc3QgY2hhciAqYXJndltdID0geyJydWJpay5leGUiLCAiVUIiLCAiVUwiLCAiVUYiLCAiRlIiLCAiREYiLCAiQlIiLCAiREIiLCAiREwiLCAiRFIiLCAiRkwiLCAiVVIiLCAiQkwiLCAiVUJMIiwgIlVMRiIsICJGRFIiLCAiRlJVIiwgIkJSRCIsICJERkwiLCAiRExCIiwgIkJVUiIsIE5VTEx9Owpjb25zdCBjaGFyICphcmd2W10gPSB7InJ1YmlrLmV4ZSIsICJVUiIsICJVQiIsICJVTCIsICJCTCIsICJERiIsICJEUiIsICJEQiIsICJGTCIsICJGUiIsICJVRiIsICJCUiIsICJETCIsICJVUkIiLCAiVUJMIiwgIkJETCIsICJMRlUiLCAiRFJGIiwgIlJVRiIsICJGTEQiLCAiREJSIiwgTlVMTH07CmNvbnN0IGNoYXIgKmFyZ3ZbXSA9IHsicnViaWsuZXhlIiwgIlVMIiwgIlVGIiwgIkRSIiwgIlVCIiwgIkRGIiwgIlVSIiwgIkRCIiwgIkRMIiwgIkJSIiwgIkZMIiwgIkZSIiwgIkJMIiwgIlVMRiIsICJEQlIiLCAiRFJGIiwgIlVCTCIsICJVUkIiLCAiREZMIiwgIkRMQiIsICJVRlIiLCBOVUxMfTsKY29uc3QgY2hhciAqYXJndltdID0geyJydWJpay5leGUiLCAiVUwiLCAiVUYiLCAiRlIiLCAiVUIiLCAiREYiLCAiQlIiLCAiREIiLCAiREwiLCAiRFIiLCAiRkwiLCAiVVIiLCAiQkwiLCAiVUxGIiwgIkZEUiIsICJGUlUiLCAiVUJMIiwgIkJSRCIsICJERkwiLCAiRExCIiwgIkJVUiIsIE5VTEx9Owpjb25zdCBjaGFyICphcmd2W10gPSB7InJ1YmlrLmV4ZSIsICJSRiIsICJVTCIsICJVRiIsICJVUiIsICJMRiIsICJEUiIsICJEQiIsICJETCIsICJGRCIsICJCVSIsICJCUiIsICJCTCIsICJSRkQiLCAiVUxGIiwgIlVGUiIsICJMVUIiLCAiTERGIiwgIlJCVSIsICJETEIiLCAiREJSIiwgTlVMTH07CmNvbnN0IGNoYXIgKmFyZ3ZbXSA9IHsicnViaWsuZXhlIiwgIlVCIiwgIlVMIiwgIlVGIiwgIkJSIiwgIkRGIiwgIkZSIiwgIkRCIiwgIkRMIiwgIlVSIiwgIkZMIiwgIkRSIiwgIkJMIiwgIlVCTCIsICJVTEYiLCAiQlVSIiwgIkJSRCIsICJGUlUiLCAiREZMIiwgIkRMQiIsICJGRFIiLCBOVUxMfTsKY29uc3QgY2hhciAqYXJndltdID0geyJydWJpay5leGUiLCAiRFIiLCAiVVIiLCAiVUIiLCAiVUwiLCAiTEYiLCAiREIiLCAiREwiLCAiUkYiLCAiRkQiLCAiRlUiLCAiQlIiLCAiQkwiLCAiUlVGIiwgIlVSQiIsICJVQkwiLCAiREJSIiwgIkxERiIsICJMRlUiLCAiUkZEIiwgIkRMQiIsIE5VTEx9Owpjb25zdCBjaGFyICphcmd2W10gPSB7InJ1YmlrLmV4ZSIsICJEUiIsICJVTCIsICJVRiIsICJVUiIsICJVQiIsICJEQiIsICJETCIsICJERiIsICJGTCIsICJGUiIsICJCUiIsICJCTCIsICJEUkYiLCAiVUxGIiwgIlVGUiIsICJEQlIiLCAiVVJCIiwgIlVCTCIsICJERkwiLCAiRExCIiwgTlVMTH07CmNvbnN0IGNoYXIgKmFyZ3ZbXSA9IHsicnViaWsuZXhlIiwgIlVGIiwgIkZSIiwgIlVCIiwgIkJMIiwgIkRCIiwgIkRMIiwgIkRGIiwgIkZMIiwgIkRSIiwgIlVMIiwgIlVSIiwgIkJSIiwgIkZEUiIsICJGUlUiLCAiREJSIiwgIkJMVSIsICJETEIiLCAiRlVMIiwgIlVSQiIsICJERkwiLCBOVUxMfTsKY29uc3QgY2hhciAqYXJndltdID0geyJydWJpay5leGUiLCAiVUYiLCAiQlIiLCAiVUIiLCAiVUwiLCAiRFIiLCAiREIiLCAiREwiLCAiRlIiLCAiVVIiLCAiRkwiLCAiREYiLCAiQkwiLCAiQlVSIiwgIlJGRCIsICJVQkwiLCAiVUxGIiwgIkRCUiIsICJMREYiLCAiRlJVIiwgIkRMQiIsIE5VTEx9Owpjb25zdCBjaGFyICphcmd2W10gPSB7InJ1YmlrLmV4ZSIsICJSRCIsICJGUiIsICJEQiIsICJVTCIsICJMRiIsICJCTCIsICJVQiIsICJETCIsICJGRCIsICJGVSIsICJVUiIsICJCUiIsICJMVUIiLCAiRlJVIiwgIkRCUiIsICJSRkQiLCAiTERGIiwgIkxGVSIsICJVUkIiLCAiQkRMIiwgTlVMTH07CmNvbnN0IGNoYXIgKmFyZ3ZbXSA9IHsicnViaWsuZXhlIiwgIkRGIiwgIlVSIiwgIkRCIiwgIkZSIiwgIlVGIiwgIkRSIiwgIlVCIiwgIkJSIiwgIkZMIiwgIkRMIiwgIkJMIiwgIlVMIiwgIkRGTCIsICJETEIiLCAiRkRSIiwgIkZSVSIsICJVTEYiLCAiQlVSIiwgIkJSRCIsICJVQkwiLCBOVUxMfTsKY29uc3QgY2hhciAqYXJndltdID0geyJydWJpay5leGUiLCAiVUwiLCAiVUYiLCAiRFIiLCAiTEIiLCAiREYiLCAiVVIiLCAiUkIiLCAiREwiLCAiQlUiLCAiRkwiLCAiRlIiLCAiQkQiLCAiVUxGIiwgIlJCVSIsICJEUkYiLCAiTEJEIiwgIkxVQiIsICJERkwiLCAiUkRCIiwgIlVGUiIsIE5VTEx9Owpjb25zdCBjaGFyICphcmd2W10gPSB7InJ1YmlrLmV4ZSIsICJMRiIsICJVUiIsICJVQiIsICJVTCIsICJSQiIsICJEUiIsICJEQiIsICJETCIsICJGUiIsICJGRCIsICJGVSIsICJCTCIsICJVRlIiLCAiUkRCIiwgIlVCTCIsICJMREYiLCAiRFJGIiwgIlJCVSIsICJETEIiLCAiTEZVIiwgTlVMTH07CmNvbnN0IGNoYXIgKmFyZ3ZbXSA9IHsicnViaWsuZXhlIiwgIlVGIiwgIkJSIiwgIlVCIiwgIkRCIiwgIkRMIiwgIkRGIiwgIkZSIiwgIlVMIiwgIlVSIiwgIkJMIiwgIkRSIiwgIkZMIiwgIkJVUiIsICJCUkQiLCAiRExCIiwgIkZEUiIsICJERkwiLCAiVUJMIiwgIlVMRiIsICJGUlUiLCBOVUxMfTsKY29uc3QgY2hhciAqYXJndltdID0geyJydWJpay5leGUiLCAiUkYiLCAiVVIiLCAiVUIiLCAiVUwiLCAiTEIiLCAiRFIiLCAiREIiLCAiREwiLCAiRkQiLCAiRkwiLCAiQlIiLCAiRlUiLCAiUkZEIiwgIlVSQiIsICJMQkQiLCAiVUxGIiwgIkxVQiIsICJERkwiLCAiUlVGIiwgIkRCUiIsIE5VTEx9Owpjb25zdCBjaGFyICphcmd2W10gPSB7InJ1YmlrLmV4ZSIsICJMRiIsICJCVSIsICJMQiIsICJVTCIsICJSVSIsICJGUiIsICJSQiIsICJETCIsICJGVSIsICJGRCIsICJEUiIsICJCRCIsICJMRlUiLCAiQlVSIiwgIkxCRCIsICJMREYiLCAiVUJMIiwgIlJVRiIsICJSREIiLCAiRkRSIiwgTlVMTH07CmNvbnN0IGNoYXIgKmFyZ3ZbXSA9IHsicnViaWsuZXhlIiwgIkRSIiwgIlVCIiwgIlVMIiwgIkJMIiwgIkRGIiwgIlVSIiwgIkRCIiwgIkZMIiwgIkJSIiwgIlVGIiwgIkZSIiwgIkRMIiwgIkRSRiIsICJVQkwiLCAiQkRMIiwgIkxGVSIsICJVUkIiLCAiUkRCIiwgIkZMRCIsICJVRlIiLCBOVUxMfTsKY29uc3QgY2hhciAqYXJndltdID0geyJydWJpay5leGUiLCAiVUYiLCAiQlIiLCAiTEIiLCAiQkQiLCAiREYiLCAiRlIiLCAiUkQiLCAiRkwiLCAiVVIiLCAiVUwiLCAiQlUiLCAiREwiLCAiQlVSIiwgIkxVQiIsICJEUkYiLCAiQkRMIiwgIkZSVSIsICJGVUwiLCAiRkxEIiwgIlJEQiIsIE5VTEx9Owpjb25zdCBjaGFyICphcmd2W10gPSB7InJ1YmlrLmV4ZSIsICJVTCIsICJVRiIsICJEQiIsICJVQiIsICJERiIsICJGUiIsICJCUiIsICJETCIsICJVUiIsICJGTCIsICJCTCIsICJEUiIsICJVTEYiLCAiRExCIiwgIkZEUiIsICJVQkwiLCAiRlJVIiwgIkRGTCIsICJCVVIiLCAiQlJEIiwgTlVMTH07CmNvbnN0IGNoYXIgKmFyZ3ZbXSA9IHsicnViaWsuZXhlIiwgIlVGIiwgIlVSIiwgIlJCIiwgIkJVIiwgIkRGIiwgIkRSIiwgIkxGIiwgIkJMIiwgIkZSIiwgIkRMIiwgIkJEIiwgIlVMIiwgIlVGUiIsICJSREIiLCAiRkxEIiwgIkJVUiIsICJEUkYiLCAiQkRMIiwgIkJMVSIsICJMRlUiLCBOVUxMfTsKY29uc3QgY2hhciAqYXJndltdID0geyJydWJpay5leGUiLCAiVUYiLCAiVVIiLCAiREIiLCAiRkwiLCAiRFIiLCAiVUIiLCAiQkwiLCAiREYiLCAiRlIiLCAiREwiLCAiVUwiLCAiQlIiLCAiVUZSIiwgIkJMVSIsICJEQlIiLCAiRkxEIiwgIkZVTCIsICJEUkYiLCAiQkRMIiwgIlVSQiIsIE5VTEx9Owpjb25zdCBjaGFyICphcmd2W10gPSB7InJ1YmlrLmV4ZSIsICJERiIsICJCUiIsICJSRCIsICJVTCIsICJVRiIsICJGTCIsICJMQiIsICJETCIsICJVUiIsICJGUiIsICJCRCIsICJCVSIsICJCVVIiLCAiTEZVIiwgIlJEQiIsICJEUkYiLCAiRkxEIiwgIlVGUiIsICJMVUIiLCAiTEJEIiwgTlVMTH07CmNvbnN0IGNoYXIgKmFyZ3ZbXSA9IHsicnViaWsuZXhlIiwgIkxGIiwgIlVSIiwgIlVCIiwgIlVMIiwgIkRGIiwgIkRSIiwgIkRCIiwgIlJGIiwgIkZVIiwgIkxEIiwgIkJSIiwgIkJMIiwgIkxGVSIsICJVUkIiLCAiVUJMIiwgIkJETCIsICJEUkYiLCAiUlVGIiwgIkZMRCIsICJEQlIiLCBOVUxMfTsKY29uc3QgY2hhciAqYXJndltdID0geyJydWJpay5leGUiLCAiUlUiLCAiTEYiLCAiQkwiLCAiRlIiLCAiQlIiLCAiREIiLCAiRkQiLCAiTEQiLCAiRFIiLCAiRlUiLCAiVUIiLCAiTFUiLCAiTERGIiwgIkJMVSIsICJGUlUiLCAiREJSIiwgIkxCRCIsICJEUkYiLCAiVUxGIiwgIlJCVSIsIE5VTEx9Owpjb25zdCBjaGFyICphcmd2W10gPSB7InJ1YmlrLmV4ZSIsICJVRiIsICJCRCIsICJCTCIsICJGTCIsICJSQiIsICJVQiIsICJEUiIsICJVTCIsICJSRiIsICJSVSIsICJGRCIsICJMRCIsICJMREYiLCAiTEJEIiwgIlJVRiIsICJGRFIiLCAiREJSIiwgIkxGVSIsICJCVVIiLCAiTFVCIiwgTlVMTH07CmNvbnN0IGNoYXIgKmFyZ3ZbXSA9IHsicnViaWsuZXhlIiwgIkRGIiwgIkZVIiwgIkRCIiwgIkJMIiwgIkxGIiwgIkxVIiwgIkRSIiwgIlVSIiwgIkZSIiwgIkxEIiwgIkJSIiwgIlVCIiwgIkRGTCIsICJVTEYiLCAiVUZSIiwgIkJSRCIsICJMVUIiLCAiRFJGIiwgIkJVUiIsICJMQkQiLCBOVUxMfTsKY29uc3QgY2hhciAqYXJndltdID0geyJydWJpay5leGUiLCAiTFUiLCAiVUIiLCAiRFIiLCAiRlIiLCAiVUYiLCAiRkwiLCAiREwiLCAiREYiLCAiQkQiLCAiTEIiLCAiUlUiLCAiQlIiLCAiRlVMIiwgIkJMVSIsICJGUlUiLCAiRExCIiwgIlVSQiIsICJCUkQiLCAiUkZEIiwgIkRGTCIsIE5VTEx9Owpjb25zdCBjaGFyICphcmd2W10gPSB7InJ1YmlrLmV4ZSIsICJSRiIsICJSQiIsICJMVSIsICJGRCIsICJGVSIsICJGTCIsICJMRCIsICJSRCIsICJEQiIsICJVUiIsICJCTCIsICJCVSIsICJSRkQiLCAiUlVGIiwgIkxERiIsICJMVUIiLCAiVUxGIiwgIlVSQiIsICJMQkQiLCAiQlJEIiwgTlVMTH07CmNvbnN0IGNoYXIgKmFyZ3ZbXSA9IHsicnViaWsuZXhlIiwgIkZMIiwgIkxVIiwgIlJVIiwgIkRMIiwgIkZVIiwgIkZSIiwgIlJEIiwgIlVCIiwgIlJCIiwgIkRCIiwgIkZEIiwgIkJMIiwgIlVMRiIsICJSRkQiLCAiQkRMIiwgIkZMRCIsICJCVVIiLCAiRlJVIiwgIkJSRCIsICJCTFUiLCBOVUxMfTsKY29uc3QgY2hhciAqYXJndltdID0geyJydWJpay5leGUiLCAiTFUiLCAiRkQiLCAiRkwiLCAiRlUiLCAiRFIiLCAiQkQiLCAiVUIiLCAiTEIiLCAiUkIiLCAiREwiLCAiVVIiLCAiRlIiLCAiTEJEIiwgIlVGUiIsICJSRkQiLCAiQkxVIiwgIkJVUiIsICJVTEYiLCAiRkxEIiwgIkRCUiIsIE5VTEx9Owpjb25zdCBjaGFyICphcmd2W10gPSB7InJ1YmlrLmV4ZSIsICJMQiIsICJSQiIsICJGVSIsICJERiIsICJVQiIsICJEQiIsICJETCIsICJVUiIsICJGUiIsICJMRiIsICJVTCIsICJEUiIsICJCREwiLCAiVUJMIiwgIlJVRiIsICJGTEQiLCAiUkRCIiwgIlVMRiIsICJVUkIiLCAiRkRSIiwgTlVMTH07CmNvbnN0IGNoYXIgKmFyZ3ZbXSA9IHsicnViaWsuZXhlIiwgIkZEIiwgIkZMIiwgIlVGIiwgIlVMIiwgIlVSIiwgIkRCIiwgIkRSIiwgIkJVIiwgIkJSIiwgIkZSIiwgIkxCIiwgIkxEIiwgIkRMQiIsICJVRlIiLCAiTFVCIiwgIkZVTCIsICJCVVIiLCAiRFJGIiwgIkJSRCIsICJMREYiLCBOVUxMfTsKY29uc3QgY2hhciAqYXJndltdID0geyJydWJpay5leGUiLCAiVUIiLCAiVVIiLCAiVUwiLCAiREYiLCAiREIiLCAiTEQiLCAiUkYiLCAiQlIiLCAiTEYiLCAiUkQiLCAiQkwiLCAiVUYiLCAiQkxVIiwgIkZEUiIsICJCREwiLCAiRlVMIiwgIlJVRiIsICJCUkQiLCAiREZMIiwgIkJVUiIsIE5VTEx9Owpjb25zdCBjaGFyICphcmd2W10gPSB7InJ1YmlrLmV4ZSIsICJMRiIsICJVQiIsICJVRiIsICJERiIsICJVUiIsICJEQiIsICJSQiIsICJVTCIsICJSRCIsICJSRiIsICJMQiIsICJMRCIsICJCREwiLCAiQlJEIiwgIkxERiIsICJVRlIiLCAiQlVSIiwgIlVCTCIsICJMRlUiLCAiUkZEIiwgTlVMTH07CmNvbnN0IGNoYXIgKmFyZ3ZbXSA9IHsicnViaWsuZXhlIiwgIkRGIiwgIkZSIiwgIlVCIiwgIkJEIiwgIkZVIiwgIkJMIiwgIlJVIiwgIkJSIiwgIlJEIiwgIkRMIiwgIkxVIiwgIkxGIiwgIkRCUiIsICJSVUYiLCAiQkRMIiwgIlVCTCIsICJSRkQiLCAiRkxEIiwgIkJVUiIsICJMRlUiLCBOVUxMfTsKY29uc3QgY2hhciAqYXJndltdID0geyJydWJpay5leGUiLCAiRlUiLCAiRlIiLCAiUlUiLCAiTFUiLCAiTEQiLCAiQkwiLCAiRkwiLCAiUkIiLCAiVUIiLCAiQkQiLCAiUkQiLCAiRkQiLCAiRkRSIiwgIkZVTCIsICJGUlUiLCAiQkRMIiwgIkxVQiIsICJSREIiLCAiVVJCIiwgIkZMRCIsIE5VTEx9Owpjb25zdCBjaGFyICphcmd2W10gPSB7InJ1YmlrLmV4ZSIsICJMRCIsICJERiIsICJGUiIsICJCUiIsICJVRiIsICJSVSIsICJVQiIsICJGTCIsICJSRCIsICJMQiIsICJVTCIsICJEQiIsICJMREYiLCAiQlJEIiwgIkZSVSIsICJMRlUiLCAiQkRMIiwgIlJGRCIsICJCVVIiLCAiTFVCIiwgTlVMTH07CmNvbnN0IGNoYXIgKmFyZ3ZbXSA9IHsicnViaWsuZXhlIiwgIkJEIiwgIkJVIiwgIlJVIiwgIkRMIiwgIkRGIiwgIkJMIiwgIkZSIiwgIkZMIiwgIkxVIiwgIkRSIiwgIkJSIiwgIlVGIiwgIkxERiIsICJMQkQiLCAiVVJCIiwgIkZVTCIsICJCUkQiLCAiUlVGIiwgIlVCTCIsICJSRkQiLCBOVUxMfTsKY29uc3QgY2hhciAqYXJndltdID0geyJydWJpay5leGUiLCAiRlIiLCAiTFUiLCAiQlUiLCAiREwiLCAiQkQiLCAiVUYiLCAiVVIiLCAiQkwiLCAiRkwiLCAiRkQiLCAiQlIiLCAiRFIiLCAiUkZEIiwgIlJVRiIsICJCUkQiLCAiREZMIiwgIkxGVSIsICJMQkQiLCAiVUJMIiwgIlVSQiIsIE5VTEx9Owpjb25zdCBjaGFyICphcmd2W10gPSB7InJ1YmlrLmV4ZSIsICJMVSIsICJGVSIsICJSVSIsICJERiIsICJMQiIsICJSQiIsICJETCIsICJCRCIsICJMRiIsICJSRCIsICJSRiIsICJCVSIsICJCUkQiLCAiREZMIiwgIlJCVSIsICJMVUIiLCAiRExCIiwgIkxGVSIsICJGRFIiLCAiUlVGIiwgTlVMTH07CmNvbnN0IGNoYXIgKmFyZ3ZbXSA9IHsicnViaWsuZXhlIiwgIlVCIiwgIkRGIiwgIkJEIiwgIlVGIiwgIkxCIiwgIkxGIiwgIkxVIiwgIlVSIiwgIkxEIiwgIlJEIiwgIkJSIiwgIkZSIiwgIlJCVSIsICJMQkQiLCAiRkRSIiwgIlVCTCIsICJMRlUiLCAiREJSIiwgIkxERiIsICJSVUYiLCBOVUxMfTsKY29uc3QgY2hhciAqYXJndltdID0geyJydWJpay5leGUiLCAiUkIiLCAiVUIiLCAiUkYiLCAiTEYiLCAiVUYiLCAiUkQiLCAiQkwiLCAiREwiLCAiUlUiLCAiREYiLCAiREIiLCAiTFUiLCAiUkZEIiwgIkxGVSIsICJMREYiLCAiUlVGIiwgIlVCTCIsICJSREIiLCAiTEJEIiwgIlVSQiIsIE5VTEx9Owpjb25zdCBjaGFyICphcmd2W10gPSB7InJ1YmlrLmV4ZSIsICJGUiIsICJMQiIsICJGRCIsICJGVSIsICJEUiIsICJCUiIsICJMVSIsICJCRCIsICJVUiIsICJCVSIsICJMRiIsICJMRCIsICJMVUIiLCAiTEZVIiwgIkJETCIsICJEQlIiLCAiRFJGIiwgIlJCVSIsICJGTEQiLCAiUlVGIiwgTlVMTH07CmNvbnN0IGNoYXIgKmFyZ3ZbXSA9IHsicnViaWsuZXhlIiwgIlVMIiwgIkRMIiwgIlJGIiwgIlVCIiwgIkZEIiwgIkJSIiwgIkRCIiwgIlVGIiwgIkRSIiwgIlVSIiwgIkJMIiwgIkZMIiwgIkZEUiIsICJCTFUiLCAiRExCIiwgIlVSQiIsICJSVUYiLCAiRkxEIiwgIkJSRCIsICJGVUwiLCBOVUxMfTsKY29uc3QgY2hhciAqYXJndltdID0geyJydWJpay5leGUiLCAiUlUiLCAiQlUiLCAiRkwiLCAiUkQiLCAiQkQiLCAiRlIiLCAiTFUiLCAiRkQiLCAiRlUiLCAiREwiLCAiQkwiLCAiUkIiLCAiUlVGIiwgIkRGTCIsICJVQkwiLCAiVUxGIiwgIlVSQiIsICJCREwiLCAiREJSIiwgIkZEUiIsIE5VTEx9Owpjb25zdCBjaGFyICphcmd2W10gPSB7InJ1YmlrLmV4ZSIsICJSRiIsICJETCIsICJCTCIsICJMRiIsICJEQiIsICJCUiIsICJGRCIsICJCVSIsICJSRCIsICJGVSIsICJSVSIsICJMVSIsICJVUkIiLCAiTFVCIiwgIlJGRCIsICJERkwiLCAiRlJVIiwgIkJETCIsICJEQlIiLCAiVUxGIiwgTlVMTH07CmNvbnN0IGNoYXIgKmFyZ3ZbXSA9IHsicnViaWsuZXhlIiwgIlJVIiwgIkZMIiwgIkZSIiwgIkZVIiwgIkRMIiwgIlJEIiwgIlVCIiwgIkJEIiwgIlVMIiwgIkZEIiwgIkJMIiwgIlJCIiwgIkJETCIsICJCUkQiLCAiVUZSIiwgIkZEUiIsICJCTFUiLCAiUkJVIiwgIkZMRCIsICJMRlUiLCBOVUxMfTsKY29uc3QgY2hhciAqYXJndltdID0geyJydWJpay5leGUiLCAiUkYiLCAiRlUiLCAiQlUiLCAiRkwiLCAiVUwiLCAiTEQiLCAiUkIiLCAiREIiLCAiQkwiLCAiRkQiLCAiUlUiLCAiUkQiLCAiQlJEIiwgIlJVRiIsICJETEIiLCAiVUJMIiwgIkRGTCIsICJMRlUiLCAiVVJCIiwgIkZEUiIsIE5VTEx9Owpjb25zdCBjaGFyICphcmd2W10gPSB7InJ1YmlrLmV4ZSIsICJGUiIsICJSVSIsICJVRiIsICJMRiIsICJCRCIsICJMVSIsICJCVSIsICJETCIsICJSQiIsICJGRCIsICJMQiIsICJEUiIsICJGTEQiLCAiUlVGIiwgIkJMVSIsICJSRkQiLCAiREJSIiwgIkxGVSIsICJMQkQiLCAiQlVSIiwgTlVMTH07CmNvbnN0IGNoYXIgKmFyZ3ZbXSA9IHsicnViaWsuZXhlIiwgIkZMIiwgIlJEIiwgIkJSIiwgIlVCIiwgIlVSIiwgIkRGIiwgIkJMIiwgIlVMIiwgIkZVIiwgIkJEIiwgIkRMIiwgIlJGIiwgIlVMRiIsICJVQkwiLCAiRlJVIiwgIlVSQiIsICJEUkYiLCAiQlJEIiwgIkZMRCIsICJETEIiLCBOVUxMfTsKY29uc3QgY2hhciAqYXJndltdID0geyJydWJpay5leGUiLCAiQlIiLCAiTFUiLCAiVUIiLCAiQkwiLCAiRlIiLCAiUkQiLCAiRkwiLCAiRkQiLCAiQkQiLCAiVUYiLCAiVVIiLCAiREwiLCAiREJSIiwgIkJVUiIsICJGTEQiLCAiTFVCIiwgIlJGRCIsICJGUlUiLCAiVUxGIiwgIkJETCIsIE5VTEx9Owpjb25zdCBjaGFyICphcmd2W10gPSB7InJ1YmlrLmV4ZSIsICJVTCIsICJERiIsICJMQiIsICJSVSIsICJCUiIsICJVRiIsICJCRCIsICJMRCIsICJMRiIsICJCVSIsICJEUiIsICJGUiIsICJGUlUiLCAiQlVSIiwgIkxERiIsICJEUkYiLCAiVUJMIiwgIlJEQiIsICJCREwiLCAiVUxGIiwgTlVMTH07CmNvbnN0IGNoYXIgKmFyZ3ZbXSA9IHsicnViaWsuZXhlIiwgIlVCIiwgIkZSIiwgIkxVIiwgIlJEIiwgIlJVIiwgIlVGIiwgIkxGIiwgIlJCIiwgIkxCIiwgIkRGIiwgIkxEIiwgIkJEIiwgIlJGRCIsICJCREwiLCAiVUxGIiwgIkxVQiIsICJMREYiLCAiQlVSIiwgIlJVRiIsICJCUkQiLCBOVUxMfTsKY29uc3QgY2hhciAqYXJndltdID0geyJydWJpay5leGUiLCAiQlIiLCAiRkQiLCAiVUYiLCAiTEIiLCAiVUwiLCAiVUIiLCAiUkYiLCAiRFIiLCAiRkwiLCAiUlUiLCAiTEQiLCAiQkQiLCAiVUJMIiwgIlVMRiIsICJSVUYiLCAiRkxEIiwgIkJETCIsICJSREIiLCAiQlVSIiwgIkRSRiIsIE5VTEx9Owpjb25zdCBjaGFyICphcmd2W10gPSB7InJ1YmlrLmV4ZSIsICJSVSIsICJGUiIsICJMQiIsICJETCIsICJCRCIsICJERiIsICJMRiIsICJCUiIsICJVRiIsICJVTCIsICJEUiIsICJVQiIsICJERkwiLCAiQkxVIiwgIkJSRCIsICJVRlIiLCAiTEJEIiwgIlVMRiIsICJGRFIiLCAiUkJVIiwgTlVMTH07CmNvbnN0IGNoYXIgKmFyZ3ZbXSA9IHsicnViaWsuZXhlIiwgIkxEIiwgIkxVIiwgIkRGIiwgIkxCIiwgIlVSIiwgIkZMIiwgIkRSIiwgIkJSIiwgIkZSIiwgIlVGIiwgIlVCIiwgIkJEIiwgIkRGTCIsICJEUkYiLCAiTFVCIiwgIkxGVSIsICJETEIiLCAiUlVGIiwgIkRCUiIsICJSQlUiLCBOVUxMfTsKY29uc3QgY2hhciAqYXJndltdID0geyJydWJpay5leGUiLCAiTEIiLCAiREIiLCAiUlUiLCAiREYiLCAiTFUiLCAiQlUiLCAiUkYiLCAiUkIiLCAiVUYiLCAiUkQiLCAiREwiLCAiTEYiLCAiRExCIiwgIkxGVSIsICJGTEQiLCAiUkRCIiwgIkZEUiIsICJCTFUiLCAiQlVSIiwgIlVGUiIsIE5VTEx9Owpjb25zdCBjaGFyICphcmd2W10gPSB7InJ1YmlrLmV4ZSIsICJEUiIsICJEQiIsICJCVSIsICJETCIsICJCTCIsICJERiIsICJCUiIsICJGTCIsICJVTCIsICJVUiIsICJGUiIsICJGVSIsICJVTEYiLCAiVUZSIiwgIkRCUiIsICJERkwiLCAiQkxVIiwgIkJVUiIsICJCREwiLCAiUkZEIiwgTlVMTH07CmNvbnN0IGNoYXIgKmFyZ3ZbXSA9IHsicnViaWsuZXhlIiwgIkRCIiwgIkRMIiwgIkRGIiwgIlVGIiwgIlVCIiwgIkZSIiwgIkxCIiwgIkRSIiwgIlVMIiwgIkxGIiwgIlVSIiwgIkJSIiwgIkRSRiIsICJMREYiLCAiVUZSIiwgIkJSRCIsICJETEIiLCAiUkJVIiwgIlVCTCIsICJGVUwiLCBOVUxMfTsKY29uc3QgY2hhciAqYXJndltdID0geyJydWJpay5leGUiLCAiQkwiLCAiREYiLCAiVUwiLCAiUkIiLCAiQkQiLCAiVVIiLCAiVUIiLCAiRkwiLCAiTEQiLCAiRFIiLCAiUkYiLCAiVUYiLCAiVVJCIiwgIkxCRCIsICJMRlUiLCAiUkZEIiwgIkJSRCIsICJCTFUiLCAiRlJVIiwgIkRGTCIsIE5VTEx9Owpjb25zdCBjaGFyICphcmd2W10gPSB7InJ1YmlrLmV4ZSIsICJVTCIsICJEUiIsICJCVSIsICJCTCIsICJERiIsICJMRCIsICJCUiIsICJEQiIsICJMRiIsICJSRiIsICJGVSIsICJSVSIsICJCTFUiLCAiVVJCIiwgIkxCRCIsICJGRFIiLCAiREZMIiwgIkRCUiIsICJMRlUiLCAiRlJVIiwgTlVMTH07CmNvbnN0IGNoYXIgKmFyZ3ZbXSA9IHsicnViaWsuZXhlIiwgIlVSIiwgIkJMIiwgIkRCIiwgIlJCIiwgIkZMIiwgIlVCIiwgIkRMIiwgIlVGIiwgIkRGIiwgIlJGIiwgIlJEIiwgIkxVIiwgIkRGTCIsICJCTFUiLCAiRkRSIiwgIkxCRCIsICJCVVIiLCAiVUZSIiwgIkxGVSIsICJSREIiLCBOVUxMfTsKY29uc3QgY2hhciAqYXJndltdID0geyJydWJpay5leGUiLCAiREwiLCAiTFUiLCAiRlUiLCAiQkQiLCAiUkQiLCAiRlIiLCAiUkIiLCAiQkwiLCAiRkQiLCAiVVIiLCAiRkwiLCAiVUIiLCAiQkRMIiwgIkZMRCIsICJVTEYiLCAiUkJVIiwgIkZSVSIsICJSREIiLCAiQkxVIiwgIlJGRCIsIE5VTEx9Owpjb25zdCBjaGFyICphcmd2W10gPSB7InJ1YmlrLmV4ZSIsICJVQiIsICJGVSIsICJMVSIsICJETCIsICJSQiIsICJEQiIsICJMQiIsICJSRiIsICJGRCIsICJSVSIsICJMRiIsICJEUiIsICJGUlUiLCAiRFJGIiwgIkJMVSIsICJCVVIiLCAiQlJEIiwgIkRMQiIsICJGTEQiLCAiVUxGIiwgTlVMTH07CmNvbnN0IGNoYXIgKmFyZ3ZbXSA9IHsicnViaWsuZXhlIiwgIlVSIiwgIkZVIiwgIkRMIiwgIlVMIiwgIkJMIiwgIkxGIiwgIkZEIiwgIlVCIiwgIlJCIiwgIkZSIiwgIkRSIiwgIkRCIiwgIlVGUiIsICJCTFUiLCAiQlVSIiwgIkZMRCIsICJETEIiLCAiTEZVIiwgIlJGRCIsICJEQlIiLCBOVUxMfTsKY29uc3QgY2hhciAqYXJndltdID0geyJydWJpay5leGUiLCAiUkIiLCAiVUYiLCAiREYiLCAiRlIiLCAiREwiLCAiRFIiLCAiVUwiLCAiVVIiLCAiVUIiLCAiQkwiLCAiRkwiLCAiQkQiLCAiRkxEIiwgIlJEQiIsICJCTFUiLCAiQlVSIiwgIlJVRiIsICJSRkQiLCAiTEJEIiwgIkZVTCIsIE5VTEx9Owpjb25zdCBjaGFyICphcmd2W10gPSB7InJ1YmlrLmV4ZSIsICJCRCIsICJMVSIsICJVQiIsICJETCIsICJEUiIsICJCTCIsICJSRiIsICJERiIsICJCUiIsICJVRiIsICJMRiIsICJVUiIsICJGTEQiLCAiTFVCIiwgIlJVRiIsICJMQkQiLCAiUkRCIiwgIlVMRiIsICJEUkYiLCAiUkJVIiwgTlVMTH07CmNvbnN0IGNoYXIgKmFyZ3ZbXSA9IHsicnViaWsuZXhlIiwgIlJVIiwgIkxGIiwgIlJEIiwgIlJGIiwgIkZVIiwgIlVMIiwgIkJEIiwgIkRGIiwgIlJCIiwgIkxCIiwgIkJVIiwgIkxEIiwgIkxCRCIsICJVUkIiLCAiTFVCIiwgIkRSRiIsICJVTEYiLCAiRkxEIiwgIlJEQiIsICJVRlIiLCBOVUxMfTsKKi8KY29uc3QgY2hhciAqYXJndltdID0geyJydWJpay5leGUiLCAiVUwiLCAiREIiLCAiQlIiLCAiRkwiLCAiQkwiLCAiRFIiLCAiRkQiLCAiUlUiLCAiRlIiLCAiVUIiLCAiTEQiLCAiRlUiLCAiRkRSIiwgIkZVTCIsICJCREwiLCAiUkJVIiwgIkZMRCIsICJSVUYiLCAiREJSIiwgIkxVQiIsIE5VTEx9OwovKgoqLwppbnQgYXJnYyA9IHNpemVvZihhcmd2KSAvIHNpemVvZihjaGFyKikgLSAxOwppbnQgbWFpbiAoKSB7IAogICAgaWYgKGFyZ2MgIT0gMjEpIHsgCiAgICAgICAgY291dCA8PCBlbmRsIAogICAgICAgICAgICAgPDwgIiMjIyBJbnB1dCBFcnJvci4gQXJndW1lbnQgRm9ybWF0OiIgPDwgZW5kbCAKICAgICAgICAgICAgIDw8IGFyZ2MgPDwgZW5kbAogICAgICAgICAgICAgPDwgYXJndiA8PCBlbmRsCiAgICAgICAgICAgICA8PCAicnViaWsuZXhlIFVGIFVSIFVCIFVMIERGIERSIERCIERMIEZSIEZSIEJSIEJSIFVGUiBVUkIgVUJMIFVMRiBEUkYgREZMIERMQiBEQlIiIDw8IGVuZGw7IAogICAgICAgIHJldHVybiAwOyAKICAgIH0gCiAgICBtZW1zZXQoaGFzaF90YWJsZSwgNiwgc2l6ZW9mKGhhc2hfdGFibGUpKTsgCiAgICBmb3IgKGludCBpID0gLTE7ICsraTwyMDspIHsKICAgICAgICBjdWJlbGV0W2ldLnBvcyA9IGk7IAogICAgfQogICAgZm9yIChjdXJfcGhhc2UgPSAtMTsgKytjdXJfcGhhc2U8NDspIHsKICAgICAgICBkb19zZWFyY2goMCk7IAogICAgfQogICAgZm9yIChpbnQgaSA9IC0xOyArK2k8MjA7KSB7IAogICAgICAgIHN0cmluZyBzID0gYXJndiBbaSArIDFdICsgc3RyaW5nICgiISIpOyAKICAgICAgICBjdWJlbGV0W2ldLnBvcyA9IGRhdGEuZmluZChzWzBdIF4gc1sxXSBeIHNbMl0pOyAKICAgICAgICBpbnQgeCA9IG1pbihzLmZpbmQoJ1UnKSwgcy5maW5kKCdEJykpOyAKICAgICAgICBjdWJlbGV0W2ldLnR3aSA9IH4geD8geDogc1swXT4nRic7IAovL2NvdXQgPDwgImN1YmVsZXQoIiA8PCBpIDw8ICIpID0geyIgPDwgKGludCljdWJlbGV0W2ldLnBvcyA8PCAiLCIgPDwgKGludCljdWJlbGV0W2ldLnR3aSA8PCAifSIgPDwgZW5kbDsKICAgIH0gCiAgICBmb3IgKGludCBpID0gLTE7ICsraTw1OykgewogICAgICAgIGludCBqID0gNjReZGF0YVsyMCtjdXJfcGhhc2UqOCtpKzE2XSwKICAgICAgICAgICAgayA9IDY0XmRhdGFbMjArY3VyX3BoYXNlKjgraSsyMV07CiAgICAgICAgc3dhcChjdWJlbGV0W2pdLCBjdWJlbGV0W2tdKTsKICAgICAgICAvL2NvdXQgPDwgInN3YXAoIiA8PCBqIDw8ICIsIiA8PCBrIDw8ICIpIiA8PCBlbmRsOwogICAgfQovLyAgICBmb3IgKGludCBpID0gLTE7ICsraTwyMDspIHsgCi8vY291dCA8PCAiY3ViZWxldCgiIDw8IGkgPDwgIikgPSB7IiA8PCAoaW50KWN1YmVsZXRbaV0ucG9zIDw8ICIsIiA8PCAoaW50KWN1YmVsZXRbaV0udHdpIDw8ICJ9IiA8PCBlbmRsOwovLyAgICB9IAoKICAgIHNlYXJjaF9tb2RlID0gMTsgCiAgICBmb3IgKGN1cl9waGFzZSA9IC0xOyArK2N1cl9waGFzZTw0OykgewogIC8vICAgICAgY291dCA8PCAoaW50KWN1cl9waGFzZSA8PCBlbmRsOyAKICAgICAgICBmb3IgKGludCBpID0gLTE7ICsraTwyMDspIHsKICAgIC8vICAgICAgICBjb3V0IDw8IChpbnQpY3VyX3BoYXNlIDw8ICIsaT0iIDw8IGkgPDwgZW5kbDsgCiAgICAgICAgICAgIGlmIChkb19zZWFyY2ggKGkpKSBicmVhayA7CiAgICAgICAgfQogICAgfQogICAgY291dCA8PCAic29sdXRvbiAoIiA8PCAoaW50KWhpc3RvcnlfaWR4IDw8ICIgbW92ZXMpIiA8PCBlbmRsOwogICAgZm9yIChpbnQgayA9IC0xOyArK2s8aGlzdG9yeV9pZHg7KSB7CiAgICAgICAgY291dCA8PCAiRkJSTFVEIltoaXN0b3J5X21vdltrXV0gPDwgaGlzdG9yeV9ycHRba10rMSA8PCAiIjsgCiAgICB9CiAgICBjb3V0IDw8IGVuZGw7IAogICAgcmV0dXJuIDA7IAp9IAo=