algDict = {0: '0 ', 1: 'U ', 2: 'U ', 3: 'H ', 4: 'Z ', 5: 'A ',
6: 'A ', 7: 'E ', 8: 'J ', 9: 'J ', 10: 'R ', 11: 'R ',
12: 'G ', 13: 'G ', 14: 'G ', 15: 'G ', 16: 'N ', 17: 'N ',
18: 'T ', 19: 'Y ', 20: 'F ', 21: 'V '}
highest = 0
algs = ["",
"R' U R' U' R' U' R' U R U R2",
"R U' R U R U R U' R' U' R2",
"R2 U2 R U2 R2 U2 R2 U2 R U2 R2",
"R2 U R2 U' R2 F2 R2 U' F2 U R2 F2",
"R U' R F2 R' U R' U' R2 F2 R2",
"R2 F2 R2 U R U' R F2 R' U R'",
"R U R' U R' U' R F' R U R' U' R' F R2 U' R2 U R",
"F' U2 R' U F U' F' U' R U' F",
"R U R' F' R U R' U' R' F R2 U' R'",
"R' U2 R U2 R' F R U R' U' R' F' R2",
"F' R' U' R F' R' U F' U' F' U F R F2",
"F2 R2 U' R' U' R F2 R' U R F2 U R2 F2",
"F2 R2 U' F2 R' U' R F2 R' U R U R2 F2",
"R' U' R2 U' R2 U' R U2 R2 F U R' U' R F' R",
"R' F R' U R U' F' R2 U2 R' U R2 U R2 U R",
"F' R U R' U' R' F R2 F U' R' U' R U F' R",
"R' U R' F R F' R U' R' F' U F R U R' U' R",
"R U R' U' R' F R2 U' R' U' R U R' F'",
"F R U' R' U' R U R' F' R U R' U' R' F R F'",
"F' U2 F' U' R' F' R2 U' R' U R' F R U' F",
"R U' R U F R F2 U F U' F R' F' R'"]
#21, 14, 9
def tryOne(aTemp, this): #string of alg trying, string of alg trying to solve
wtf = MyCube(); wtf.doAlg(this); wtf.doUp()
for try1 in range(4):
wtf.doU(); wtf2 = wtf
wtf2.doAlg(aTemp)
if wtf2.checkSolved(): return True
return False
def tryTwo(aTemp, bTemp, this):
now = MyCube(); now.doAlg(this); now.doUp()
for try1 in range(4):
now.doU(); mow = now
mow.doAlg(aTemp)
for try2 in range(4):
mow.doU(); oow = mow
oow.doAlg(bTemp)
if oow.checkSolved(): return True
return False
def tryCombo(a, b, listNow):
for alg in range(0, len(algs)):
if listNow[alg] == 0:
aCube = MyCube(); aCube.doAlg(algs[alg])
if aCube.checkSolved(): #basically, check if it's already good (case algs[0])
listNow[alg] = True; print 'try000 solved: ', algs[alg]; continue
if tryOne(a, algs[alg]): listNow[alg] = True; print 'try1 a solved: ', algs[alg]; continue
if tryOne(b, algs[alg]): listNow[alg] = True; print 'try1 b solved: ', algs[alg]; continue
if tryTwo(a, b, algs[alg]): listNow[alg] = True; print 'try2ab solved: ', algs[alg]; continue
if tryTwo(b, a, algs[alg]): listNow[alg] = True; print 'try2ba solved: ', algs[alg]; continue
if tryTwo(a, a, algs[alg]): listNow[alg] = True; print 'try2aa solved: ', algs[alg]; continue
if tryTwo(b, b, algs[alg]): listNow[alg] = True; print 'try2bb solved: ', algs[alg]; continue
## if aCube.checkSolved(): #basically, check if it's already good (case algs[0])
## listNow[alg] = 1; continue
##
## elif tryOne(a, algs[alg]): listNow[alg] = 1; continue
## elif tryOne(b, algs[alg]): listNow[alg] = 1; continue
##
## elif tryTwo(a, b, algs[alg]): listNow[alg] = 1; continue
## elif tryTwo(b, a, algs[alg]): listNow[alg] = 1; continue
##
## elif tryTwo(a, a, algs[alg]): listNow[alg] = 1; continue
## elif tryTwo(b, b, algs[alg]): listNow[alg] = 1; continue
#else: return listNow
return listNow
##################################################
class MyCube:
"""A virtual 3x3x3 matrix"""
def __init__(self):
self.uSide = ['U', 'U', 'U', 'U', 'U', 'U', 'U', 'U'] #URF, UF, etc
self.fSide = ['F', 'F', 'F', 'F', 'F', 'F', 'F', 'F'] #FRD, FD, etc
self.lSide = ['L', 'L', 'L', 'L', 'L', 'L', 'L', 'L'] #LFD, LD, etc
self.bSide = ['B', 'B', 'B', 'B', 'B', 'B', 'B', 'B'] #BRD, BD, etc
self.rSide = ['R', 'R', 'R', 'R', 'R', 'R', 'R', 'R'] #RBD, RD, etc
self.dSide = ['D', 'D', 'D', 'D', 'D', 'D', 'D', 'D'] #DBR, DR, etc
def doU(self):
self.uSide[0], self.uSide[1], self.uSide[2], self.uSide[3], self.uSide[4], self.uSide[5], self.uSide[6], self.uSide[7] = self.uSide[6], self.uSide[7], self.uSide[0], self.uSide[1], self.uSide[2], self.uSide[3], self.uSide[4], self.uSide[5]
self.fSide[5], self.lSide[5], self.bSide[1], self.rSide[5] = self.rSide[5], self.fSide[5], self.lSide[5], self.bSide[1]
self.fSide[6], self.lSide[6], self.bSide[2], self.rSide[6] = self.rSide[6], self.fSide[6], self.lSide[6], self.bSide[2]
self.fSide[7], self.lSide[7], self.bSide[3], self.rSide[7] = self.rSide[7], self.fSide[7], self.lSide[7], self.bSide[3]
def doUp(self):
self.uSide[6], self.uSide[7], self.uSide[0], self.uSide[1], self.uSide[2], self.uSide[3], self.uSide[4], self.uSide[5] = self.uSide[0], self.uSide[1], self.uSide[2], self.uSide[3], self.uSide[4], self.uSide[5], self.uSide[6], self.uSide[7]
self.rSide[5], self.fSide[5], self.lSide[5], self.bSide[1] = self.fSide[5], self.lSide[5], self.bSide[1], self.rSide[5]
self.rSide[6], self.fSide[6], self.lSide[6], self.bSide[2] = self.fSide[6], self.lSide[6], self.bSide[2], self.rSide[6]
self.rSide[7], self.fSide[7], self.lSide[7], self.bSide[3] = self.fSide[7], self.lSide[7], self.bSide[3], self.rSide[7]
def doR(self):
self.rSide[0], self.rSide[1], self.rSide[2], self.rSide[3], self.rSide[4], self.rSide[5], self.rSide[6], self.rSide[7] = self.rSide[6], self.rSide[7], self.rSide[0], self.rSide[1], self.rSide[2], self.rSide[3], self.rSide[4], self.rSide[5]
self.fSide[7], self.uSide[7], self.bSide[7], self.dSide[7] = self.dSide[7], self.fSide[7], self.uSide[7], self.bSide[7]
self.fSide[0], self.uSide[0], self.bSide[0], self.dSide[0] = self.dSide[0], self.fSide[0], self.uSide[0], self.bSide[0]
self.fSide[1], self.uSide[1], self.bSide[1], self.dSide[1] = self.dSide[1], self.fSide[1], self.uSide[1], self.bSide[1]
def doRp(self):
self.rSide[6], self.rSide[7], self.rSide[0], self.rSide[1], self.rSide[2], self.rSide[3], self.rSide[4], self.rSide[5] = self.rSide[0], self.rSide[1], self.rSide[2], self.rSide[3], self.rSide[4], self.rSide[5], self.rSide[6], self.rSide[7]
self.dSide[7], self.fSide[7], self.uSide[7], self.bSide[7] = self.fSide[7], self.uSide[7], self.bSide[7], self.dSide[7]
self.dSide[0], self.fSide[0], self.uSide[0], self.bSide[0] = self.fSide[0], self.uSide[0], self.bSide[0], self.dSide[0]
self.dSide[1], self.fSide[1], self.uSide[1], self.bSide[1] = self.fSide[1], self.uSide[1], self.bSide[1], self.dSide[1]
def doF(self):
self.fSide[0], self.fSide[1], self.fSide[2], self.fSide[3], self.fSide[4], self.fSide[5], self.fSide[6], self.fSide[7] = self.fSide[6], self.fSide[7], self.fSide[0], self.fSide[1], self.fSide[2], self.fSide[3], self.fSide[4], self.fSide[5]
self.uSide[1], self.rSide[3], self.dSide[5], self.lSide[7] = self.lSide[7], self.uSide[1], self.rSide[3], self.dSide[5]
self.uSide[2], self.rSide[4], self.dSide[6], self.lSide[0] = self.lSide[0], self.uSide[2], self.rSide[4], self.dSide[6]
self.uSide[3], self.rSide[5], self.dSide[7], self.lSide[1] = self.lSide[1], self.uSide[3], self.rSide[5], self.dSide[7]
def doFp(self):
self.fSide[6], self.fSide[7], self.fSide[0], self.fSide[1], self.fSide[2], self.fSide[3], self.fSide[4], self.fSide[5] = self.fSide[0], self.fSide[1], self.fSide[2], self.fSide[3], self.fSide[4], self.fSide[5], self.fSide[6], self.fSide[7]
self.lSide[7], self.uSide[1], self.rSide[3], self.dSide[5] = self.uSide[1], self.rSide[3], self.dSide[5], self.lSide[7]
self.lSide[0], self.uSide[2], self.rSide[4], self.dSide[6] = self.uSide[2], self.rSide[4], self.dSide[6], self.lSide[0]
self.lSide[1], self.uSide[3], self.rSide[5], self.dSide[7] = self.uSide[3], self.rSide[5], self.dSide[7], self.lSide[1]
def doAlg(self, algString):
ialg = algString.replace('(', '') #get rid of unwanted
ialg = ialg.replace(')', '') # or otherwise unneeded characters
ialg = ialg.replace("2'", '2') # incl. whitespace, paren., 2's
ialg = ialg.replace(' ', ' ')
parts = ialg.split(' ') #Divide the alg up into individual moves
for part in parts:
if part == 'U': self.doU()
elif part == 'U2': self.doU(); self.doU()
elif part == "U'": self.doUp()
elif part == 'F': self.doF()
elif part == 'F2': self.doF(); self.doF()
elif part == "F'": self.doFp()
elif part == 'R': self.doR()
elif part == 'R2': self.doR(); self.doR()
elif part == "R'": self.doRp()
def printCube(self):
print
print " ", self.bSide[5] + self.bSide[6] + self.bSide[7]
print " ", self.bSide[4] + "b" + self.bSide[0]
print " ", self.bSide[3] + self.bSide[2] + self.bSide[1] + '\n'
print " ", self.uSide[5] + self.uSide[6] + self.uSide[7]
print " ", self.uSide[4] + "u" + self.uSide[0]
print " ", self.uSide[3] + self.uSide[2] + self.uSide[1] + '\n'
print "" + self.lSide[5] + self.lSide[6] + self.lSide[7], self.fSide[5] + self.fSide[6] + self.fSide[7], self.rSide[5] + self.rSide[6] + self.rSide[7]
print "" + self.lSide[4] + 'l' + self.lSide[0], self.fSide[4] + 'f' + self.fSide[0], self.rSide[4] + 'r' + self.rSide[0]
print "" + self.lSide[3] + self.lSide[2] + self.lSide[1], self.fSide[3] + self.fSide[2] + self.fSide[1], self.rSide[3] + self.rSide[2] + self.rSide[1] + '\n'
print " ", self.dSide[5] + self.dSide[6] + self.dSide[7]
print " ", self.dSide[4] + "d" + self.dSide[0]
print " ", self.dSide[3] + self.dSide[2] + self.dSide[1] + '\n'
def printMin(self):
print
print " ", self.bSide[3] + self.bSide[2] + self.bSide[1] + '\n'
print " ", self.uSide[5] + self.uSide[6] + self.uSide[7]
print " ", self.uSide[4] + "u" + self.uSide[0]
print " ", self.uSide[3] + self.uSide[2] + self.uSide[1] + '\n'
print "" + self.lSide[5] + self.lSide[6] + self.lSide[7], self.fSide[5] + self.fSide[6] + self.fSide[7], self.rSide[5] + self.rSide[6] + self.rSide[7]
def checkSolved(self):
if self.uSide[0] == self.uSide[1] == self.uSide[2] == self.uSide[3] == self.uSide[4] == self.uSide[5] == self.uSide[6] == self.uSide[7]:
if self.fSide[5] == self.fSide[6] == self.fSide[7]:
if self.lSide[5] == self.lSide[6] == self.lSide[7]:
if self.rSide[5] == self.rSide[6] == self.rSide[7]:
if self.bSide[3] == self.bSide[2] == self.bSide[1]:
return True
return False
##################################################
def tryOne(aTemp, this): #string of alg trying, string of alg trying to solve
wtf = MyCube(); wtf.doAlg(this); wtf.doUp()
for try1 in range(4):
wtf.doU(); wtf2 = wtf
wtf2.doAlg(aTemp)
if wtf2.checkSolved(): return True
return False
def tryTwo(aTemp, bTemp, this):
now = MyCube(); now.doAlg(this); now.doUp()
for try1 in range(4):
now.doU(); mow = now
mow.doAlg(aTemp)
for try2 in range(4):
mow.doU(); oow = mow
oow.doAlg(bTemp)
if oow.checkSolved(): return True
return False
def tryCombo(a, b, c):
for alg in range(0, len(algs)):
aCube = MyCube(); aCube.doAlg(algs[alg])
if aCube.checkSolved(): #basically, check if it's already good (case algs[0])
continue
elif tryOne(a, algs[alg]): continue
elif tryOne(b, algs[alg]): continue
elif tryOne(c, algs[alg]): continue
elif tryTwo(a, b, algs[alg]): continue
elif tryTwo(a, c, algs[alg]): continue
elif tryTwo(b, a, algs[alg]): continue
elif tryTwo(b, c, algs[alg]): continue
elif tryTwo(c, a, algs[alg]): continue
elif tryTwo(c, b, algs[alg]): continue
elif tryTwo(a, a, algs[alg]): continue
elif tryTwo(b, b, algs[alg]): continue
elif tryTwo(c, c, algs[alg]): continue
else: return False
return True
count = 0
for l1 in range(15):
#for l1 in range(len(algs)):
#print "L1: ", l1
for l2 in range(l1):
#print "L2: ", l2,
for l3 in range(l2):
if tryCombo(algs[l1], algs[l2], algs[l3]):
print
print "Algs used: ", l1, l2, l3
print "Cases solved: " + str(sum(algsDone)) + " out of " + str(len(algs))
print algsDone; print
highest = sum(algsDone)
YWxnRGljdCA9IHswOiAgJzAgJywgMTogICdVICcsIDI6ICAnVSAnLCAzOiAgJ0ggJywgNDogICdaICcsIDU6ICAnQSAnLAogICAgICAgICAgIDY6ICAnQSAnLCA3OiAgJ0UgJywgODogICdKICcsIDk6ICAnSiAnLCAxMDogJ1IgJywgMTE6ICdSICcsCiAgICAgICAgICAgMTI6ICdHICcsIDEzOiAnRyAnLCAxNDogJ0cgJywgMTU6ICdHICcsIDE2OiAnTiAnLCAxNzogJ04gJywKICAgICAgICAgICAxODogJ1QgJywgMTk6ICdZICcsIDIwOiAnRiAnLCAyMTogJ1YgJ30KaGlnaGVzdCA9IDAKCmFsZ3MgPSBbIiIsCiJSJyBVIFInIFUnIFInIFUnIFInIFUgUiBVIFIyIiwKIlIgVScgUiBVIFIgVSBSIFUnIFInIFUnIFIyIiwKIlIyIFUyIFIgVTIgUjIgVTIgUjIgVTIgUiBVMiBSMiIsCiJSMiBVIFIyIFUnIFIyIEYyIFIyIFUnIEYyIFUgUjIgRjIiLAoiUiBVJyBSIEYyIFInIFUgUicgVScgUjIgRjIgUjIiLAoiUjIgRjIgUjIgVSBSIFUnIFIgRjIgUicgVSBSJyIsCiJSIFUgUicgVSBSJyBVJyBSIEYnIFIgVSBSJyBVJyBSJyBGIFIyIFUnIFIyIFUgUiIsCiJGJyBVMiBSJyBVIEYgVScgRicgVScgUiBVJyBGIiwKIlIgVSBSJyBGJyBSIFUgUicgVScgUicgRiBSMiBVJyBSJyIsCiJSJyBVMiBSIFUyIFInIEYgUiBVIFInIFUnIFInIEYnIFIyIiwKIkYnIFInIFUnIFIgRicgUicgVSBGJyBVJyBGJyBVIEYgUiBGMiIsCiJGMiBSMiBVJyBSJyBVJyBSIEYyIFInIFUgUiBGMiBVIFIyIEYyIiwKIkYyIFIyIFUnIEYyIFInIFUnIFIgRjIgUicgVSBSIFUgUjIgRjIiLAoiUicgVScgUjIgVScgUjIgVScgUiBVMiBSMiBGIFUgUicgVScgUiBGJyBSIiwKIlInIEYgUicgVSBSIFUnIEYnIFIyIFUyIFInIFUgUjIgVSBSMiBVIFIiLAoiRicgUiBVIFInIFUnIFInIEYgUjIgRiBVJyBSJyBVJyBSIFUgRicgUiIsCiJSJyBVIFInIEYgUiBGJyBSIFUnIFInIEYnIFUgRiBSIFUgUicgVScgUiIsCiJSIFUgUicgVScgUicgRiBSMiBVJyBSJyBVJyBSIFUgUicgRiciLAoiRiBSIFUnIFInIFUnIFIgVSBSJyBGJyBSIFUgUicgVScgUicgRiBSIEYnIiwKIkYnIFUyIEYnIFUnIFInIEYnIFIyIFUnIFInIFUgUicgRiBSIFUnIEYiLAoiUiBVJyBSIFUgRiBSIEYyIFUgRiBVJyBGIFInIEYnIFInIl0KIzIxLCAxNCwgOQoKZGVmIHRyeU9uZShhVGVtcCwgdGhpcyk6CSNzdHJpbmcgb2YgYWxnIHRyeWluZywgc3RyaW5nIG9mIGFsZyB0cnlpbmcgdG8gc29sdmUKICAgIHd0ZiA9IE15Q3ViZSgpOyB3dGYuZG9BbGcodGhpcyk7IHd0Zi5kb1VwKCkKICAgIGZvciB0cnkxIGluIHJhbmdlKDQpOgogICAgICAgIHd0Zi5kb1UoKTsgd3RmMiA9IHd0ZgogICAgICAgIHd0ZjIuZG9BbGcoYVRlbXApCgogICAgICAgIGlmIHd0ZjIuY2hlY2tTb2x2ZWQoKTogcmV0dXJuIFRydWUKCiAgICByZXR1cm4gRmFsc2UKCmRlZiB0cnlUd28oYVRlbXAsIGJUZW1wLCB0aGlzKToKICAgIG5vdyA9IE15Q3ViZSgpOyBub3cuZG9BbGcodGhpcyk7IG5vdy5kb1VwKCkKICAgIGZvciB0cnkxIGluIHJhbmdlKDQpOgogICAgICBub3cuZG9VKCk7IG1vdyA9IG5vdwogICAgICBtb3cuZG9BbGcoYVRlbXApCiAgICAgIGZvciB0cnkyIGluIHJhbmdlKDQpOgogICAgICAgICAgbW93LmRvVSgpOyBvb3cgPSBtb3cKICAgICAgICAgIG9vdy5kb0FsZyhiVGVtcCkKICAgICAgICAgIGlmIG9vdy5jaGVja1NvbHZlZCgpOiByZXR1cm4gVHJ1ZQoKICAgIHJldHVybiBGYWxzZQoKZGVmIHRyeUNvbWJvKGEsIGIsIGxpc3ROb3cpOgogICAgZm9yIGFsZyBpbiByYW5nZSgwLCBsZW4oYWxncykpOgogICAgICAgIGlmIGxpc3ROb3dbYWxnXSA9PSAwOgoKICAgICAgICAgICAgYUN1YmUgPSBNeUN1YmUoKTsgYUN1YmUuZG9BbGcoYWxnc1thbGddKQoKICAgICAgICAgICAgaWYgYUN1YmUuY2hlY2tTb2x2ZWQoKTogCQkjYmFzaWNhbGx5LCBjaGVjayBpZiBpdCdzIGFscmVhZHkgZ29vZCAoY2FzZSBhbGdzWzBdKQogICAgICAgICAgICAgICAgbGlzdE5vd1thbGddID0gVHJ1ZTsgcHJpbnQgJ3RyeTAwMCBzb2x2ZWQ6ICcsIGFsZ3NbYWxnXTsgY29udGludWUKCiAgICAgICAgICAgIGlmIHRyeU9uZShhLCBhbGdzW2FsZ10pOiAgICBsaXN0Tm93W2FsZ10gPSBUcnVlOyBwcmludCAndHJ5MSBhIHNvbHZlZDogJywgYWxnc1thbGddOyAgY29udGludWUKICAgICAgICAgICAgaWYgdHJ5T25lKGIsIGFsZ3NbYWxnXSk6ICAgIGxpc3ROb3dbYWxnXSA9IFRydWU7IHByaW50ICd0cnkxIGIgc29sdmVkOiAnLCBhbGdzW2FsZ107ICBjb250aW51ZQoKICAgICAgICAgICAgaWYgdHJ5VHdvKGEsIGIsIGFsZ3NbYWxnXSk6IGxpc3ROb3dbYWxnXSA9IFRydWU7IHByaW50ICd0cnkyYWIgc29sdmVkOiAnLCBhbGdzW2FsZ107IGNvbnRpbnVlCiAgICAgICAgICAgIGlmIHRyeVR3byhiLCBhLCBhbGdzW2FsZ10pOiBsaXN0Tm93W2FsZ10gPSBUcnVlOyBwcmludCAndHJ5MmJhIHNvbHZlZDogJywgYWxnc1thbGddOyBjb250aW51ZQoKICAgICAgICAgICAgaWYgdHJ5VHdvKGEsIGEsIGFsZ3NbYWxnXSk6IGxpc3ROb3dbYWxnXSA9IFRydWU7IHByaW50ICd0cnkyYWEgc29sdmVkOiAnLCBhbGdzW2FsZ107ICBjb250aW51ZQogICAgICAgICAgICBpZiB0cnlUd28oYiwgYiwgYWxnc1thbGddKTogbGlzdE5vd1thbGddID0gVHJ1ZTsgcHJpbnQgJ3RyeTJiYiBzb2x2ZWQ6ICcsIGFsZ3NbYWxnXTsgIGNvbnRpbnVlCgojIyAgICAgICAgICAgIGlmIGFDdWJlLmNoZWNrU29sdmVkKCk6IAkJI2Jhc2ljYWxseSwgY2hlY2sgaWYgaXQncyBhbHJlYWR5IGdvb2QgKGNhc2UgYWxnc1swXSkKIyMgICAgICAgICAgICAgICAgbGlzdE5vd1thbGddID0gMTsgY29udGludWUKIyMKIyMgICAgICAgICAgICBlbGlmIHRyeU9uZShhLCBhbGdzW2FsZ10pOiAgICBsaXN0Tm93W2FsZ10gPSAxOyAgY29udGludWUKIyMgICAgICAgICAgICBlbGlmIHRyeU9uZShiLCBhbGdzW2FsZ10pOiAgICBsaXN0Tm93W2FsZ10gPSAxOyAgY29udGludWUKIyMKIyMgICAgICAgICAgICBlbGlmIHRyeVR3byhhLCBiLCBhbGdzW2FsZ10pOiBsaXN0Tm93W2FsZ10gPSAxOyBjb250aW51ZQojIyAgICAgICAgICAgIGVsaWYgdHJ5VHdvKGIsIGEsIGFsZ3NbYWxnXSk6IGxpc3ROb3dbYWxnXSA9IDE7IGNvbnRpbnVlCiMjCiMjICAgICAgICAgICAgZWxpZiB0cnlUd28oYSwgYSwgYWxnc1thbGddKTogbGlzdE5vd1thbGddID0gMTsgIGNvbnRpbnVlCiMjICAgICAgICAgICAgZWxpZiB0cnlUd28oYiwgYiwgYWxnc1thbGddKTogbGlzdE5vd1thbGddID0gMTsgIGNvbnRpbnVlCgogICAgICAgICAgICAjZWxzZTogcmV0dXJuIGxpc3ROb3cKCiAgICByZXR1cm4gbGlzdE5vdwoKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKY2xhc3MgTXlDdWJlOgogICIiIkEgdmlydHVhbCAzeDN4MyBtYXRyaXgiIiIKICBkZWYgX19pbml0X18oc2VsZik6CiAgICBzZWxmLnVTaWRlID0gWydVJywgJ1UnLCAnVScsICdVJywgJ1UnLCAnVScsICdVJywgJ1UnXSAjVVJGLCBVRiwgZXRjCiAgICBzZWxmLmZTaWRlID0gWydGJywgJ0YnLCAnRicsICdGJywgJ0YnLCAnRicsICdGJywgJ0YnXSAjRlJELCBGRCwgZXRjCiAgICBzZWxmLmxTaWRlID0gWydMJywgJ0wnLCAnTCcsICdMJywgJ0wnLCAnTCcsICdMJywgJ0wnXSAjTEZELCBMRCwgZXRjCiAgICBzZWxmLmJTaWRlID0gWydCJywgJ0InLCAnQicsICdCJywgJ0InLCAnQicsICdCJywgJ0InXSAjQlJELCBCRCwgZXRjCiAgICBzZWxmLnJTaWRlID0gWydSJywgJ1InLCAnUicsICdSJywgJ1InLCAnUicsICdSJywgJ1InXSAjUkJELCBSRCwgZXRjCiAgICBzZWxmLmRTaWRlID0gWydEJywgJ0QnLCAnRCcsICdEJywgJ0QnLCAnRCcsICdEJywgJ0QnXSAjREJSLCBEUiwgZXRjCgoKICBkZWYgZG9VKHNlbGYpOgoKICAgIHNlbGYudVNpZGVbMF0sIHNlbGYudVNpZGVbMV0sIHNlbGYudVNpZGVbMl0sIHNlbGYudVNpZGVbM10sIHNlbGYudVNpZGVbNF0sIHNlbGYudVNpZGVbNV0sIHNlbGYudVNpZGVbNl0sIHNlbGYudVNpZGVbN10gPSBzZWxmLnVTaWRlWzZdLCBzZWxmLnVTaWRlWzddLCBzZWxmLnVTaWRlWzBdLCBzZWxmLnVTaWRlWzFdLCBzZWxmLnVTaWRlWzJdLCBzZWxmLnVTaWRlWzNdLCBzZWxmLnVTaWRlWzRdLCBzZWxmLnVTaWRlWzVdCgogICAgc2VsZi5mU2lkZVs1XSwgc2VsZi5sU2lkZVs1XSwgc2VsZi5iU2lkZVsxXSwgc2VsZi5yU2lkZVs1XSA9IHNlbGYuclNpZGVbNV0sIHNlbGYuZlNpZGVbNV0sIHNlbGYubFNpZGVbNV0sIHNlbGYuYlNpZGVbMV0KICAgIHNlbGYuZlNpZGVbNl0sIHNlbGYubFNpZGVbNl0sIHNlbGYuYlNpZGVbMl0sIHNlbGYuclNpZGVbNl0gPSBzZWxmLnJTaWRlWzZdLCBzZWxmLmZTaWRlWzZdLCBzZWxmLmxTaWRlWzZdLCBzZWxmLmJTaWRlWzJdCiAgICBzZWxmLmZTaWRlWzddLCBzZWxmLmxTaWRlWzddLCBzZWxmLmJTaWRlWzNdLCBzZWxmLnJTaWRlWzddID0gc2VsZi5yU2lkZVs3XSwgc2VsZi5mU2lkZVs3XSwgc2VsZi5sU2lkZVs3XSwgc2VsZi5iU2lkZVszXQoKICBkZWYgZG9VcChzZWxmKToKICAgIHNlbGYudVNpZGVbNl0sIHNlbGYudVNpZGVbN10sIHNlbGYudVNpZGVbMF0sIHNlbGYudVNpZGVbMV0sIHNlbGYudVNpZGVbMl0sIHNlbGYudVNpZGVbM10sIHNlbGYudVNpZGVbNF0sIHNlbGYudVNpZGVbNV0gPSBzZWxmLnVTaWRlWzBdLCBzZWxmLnVTaWRlWzFdLCBzZWxmLnVTaWRlWzJdLCBzZWxmLnVTaWRlWzNdLCBzZWxmLnVTaWRlWzRdLCBzZWxmLnVTaWRlWzVdLCBzZWxmLnVTaWRlWzZdLCBzZWxmLnVTaWRlWzddCgogICAgc2VsZi5yU2lkZVs1XSwgc2VsZi5mU2lkZVs1XSwgc2VsZi5sU2lkZVs1XSwgc2VsZi5iU2lkZVsxXSA9IHNlbGYuZlNpZGVbNV0sIHNlbGYubFNpZGVbNV0sIHNlbGYuYlNpZGVbMV0sIHNlbGYuclNpZGVbNV0KICAgIHNlbGYuclNpZGVbNl0sIHNlbGYuZlNpZGVbNl0sIHNlbGYubFNpZGVbNl0sIHNlbGYuYlNpZGVbMl0gPSBzZWxmLmZTaWRlWzZdLCBzZWxmLmxTaWRlWzZdLCBzZWxmLmJTaWRlWzJdLCBzZWxmLnJTaWRlWzZdCiAgICBzZWxmLnJTaWRlWzddLCBzZWxmLmZTaWRlWzddLCBzZWxmLmxTaWRlWzddLCBzZWxmLmJTaWRlWzNdID0gc2VsZi5mU2lkZVs3XSwgc2VsZi5sU2lkZVs3XSwgc2VsZi5iU2lkZVszXSwgc2VsZi5yU2lkZVs3XQoKICBkZWYgZG9SKHNlbGYpOgoKICAgIHNlbGYuclNpZGVbMF0sIHNlbGYuclNpZGVbMV0sIHNlbGYuclNpZGVbMl0sIHNlbGYuclNpZGVbM10sIHNlbGYuclNpZGVbNF0sIHNlbGYuclNpZGVbNV0sIHNlbGYuclNpZGVbNl0sIHNlbGYuclNpZGVbN10gPSBzZWxmLnJTaWRlWzZdLCBzZWxmLnJTaWRlWzddLCBzZWxmLnJTaWRlWzBdLCBzZWxmLnJTaWRlWzFdLCBzZWxmLnJTaWRlWzJdLCBzZWxmLnJTaWRlWzNdLCBzZWxmLnJTaWRlWzRdLCBzZWxmLnJTaWRlWzVdCgogICAgc2VsZi5mU2lkZVs3XSwgc2VsZi51U2lkZVs3XSwgc2VsZi5iU2lkZVs3XSwgc2VsZi5kU2lkZVs3XSA9IHNlbGYuZFNpZGVbN10sIHNlbGYuZlNpZGVbN10sIHNlbGYudVNpZGVbN10sIHNlbGYuYlNpZGVbN10KICAgIHNlbGYuZlNpZGVbMF0sIHNlbGYudVNpZGVbMF0sIHNlbGYuYlNpZGVbMF0sIHNlbGYuZFNpZGVbMF0gPSBzZWxmLmRTaWRlWzBdLCBzZWxmLmZTaWRlWzBdLCBzZWxmLnVTaWRlWzBdLCBzZWxmLmJTaWRlWzBdCiAgICBzZWxmLmZTaWRlWzFdLCBzZWxmLnVTaWRlWzFdLCBzZWxmLmJTaWRlWzFdLCBzZWxmLmRTaWRlWzFdID0gc2VsZi5kU2lkZVsxXSwgc2VsZi5mU2lkZVsxXSwgc2VsZi51U2lkZVsxXSwgc2VsZi5iU2lkZVsxXQoKICBkZWYgZG9ScChzZWxmKToKICAgIHNlbGYuclNpZGVbNl0sIHNlbGYuclNpZGVbN10sIHNlbGYuclNpZGVbMF0sIHNlbGYuclNpZGVbMV0sIHNlbGYuclNpZGVbMl0sIHNlbGYuclNpZGVbM10sIHNlbGYuclNpZGVbNF0sIHNlbGYuclNpZGVbNV0gPSBzZWxmLnJTaWRlWzBdLCBzZWxmLnJTaWRlWzFdLCBzZWxmLnJTaWRlWzJdLCBzZWxmLnJTaWRlWzNdLCBzZWxmLnJTaWRlWzRdLCBzZWxmLnJTaWRlWzVdLCBzZWxmLnJTaWRlWzZdLCBzZWxmLnJTaWRlWzddCgogICAgc2VsZi5kU2lkZVs3XSwgc2VsZi5mU2lkZVs3XSwgc2VsZi51U2lkZVs3XSwgc2VsZi5iU2lkZVs3XSA9IHNlbGYuZlNpZGVbN10sIHNlbGYudVNpZGVbN10sIHNlbGYuYlNpZGVbN10sIHNlbGYuZFNpZGVbN10KICAgIHNlbGYuZFNpZGVbMF0sIHNlbGYuZlNpZGVbMF0sIHNlbGYudVNpZGVbMF0sIHNlbGYuYlNpZGVbMF0gPSBzZWxmLmZTaWRlWzBdLCBzZWxmLnVTaWRlWzBdLCBzZWxmLmJTaWRlWzBdLCBzZWxmLmRTaWRlWzBdCiAgICBzZWxmLmRTaWRlWzFdLCBzZWxmLmZTaWRlWzFdLCBzZWxmLnVTaWRlWzFdLCBzZWxmLmJTaWRlWzFdID0gc2VsZi5mU2lkZVsxXSwgc2VsZi51U2lkZVsxXSwgc2VsZi5iU2lkZVsxXSwgc2VsZi5kU2lkZVsxXQoKICBkZWYgZG9GKHNlbGYpOgogICAgc2VsZi5mU2lkZVswXSwgc2VsZi5mU2lkZVsxXSwgc2VsZi5mU2lkZVsyXSwgc2VsZi5mU2lkZVszXSwgc2VsZi5mU2lkZVs0XSwgc2VsZi5mU2lkZVs1XSwgc2VsZi5mU2lkZVs2XSwgc2VsZi5mU2lkZVs3XSA9IHNlbGYuZlNpZGVbNl0sIHNlbGYuZlNpZGVbN10sIHNlbGYuZlNpZGVbMF0sIHNlbGYuZlNpZGVbMV0sIHNlbGYuZlNpZGVbMl0sIHNlbGYuZlNpZGVbM10sIHNlbGYuZlNpZGVbNF0sIHNlbGYuZlNpZGVbNV0KCiAgICBzZWxmLnVTaWRlWzFdLCBzZWxmLnJTaWRlWzNdLCBzZWxmLmRTaWRlWzVdLCBzZWxmLmxTaWRlWzddID0gc2VsZi5sU2lkZVs3XSwgc2VsZi51U2lkZVsxXSwgc2VsZi5yU2lkZVszXSwgc2VsZi5kU2lkZVs1XQogICAgc2VsZi51U2lkZVsyXSwgc2VsZi5yU2lkZVs0XSwgc2VsZi5kU2lkZVs2XSwgc2VsZi5sU2lkZVswXSA9IHNlbGYubFNpZGVbMF0sIHNlbGYudVNpZGVbMl0sIHNlbGYuclNpZGVbNF0sIHNlbGYuZFNpZGVbNl0KICAgIHNlbGYudVNpZGVbM10sIHNlbGYuclNpZGVbNV0sIHNlbGYuZFNpZGVbN10sIHNlbGYubFNpZGVbMV0gPSBzZWxmLmxTaWRlWzFdLCBzZWxmLnVTaWRlWzNdLCBzZWxmLnJTaWRlWzVdLCBzZWxmLmRTaWRlWzddCgogIGRlZiBkb0ZwKHNlbGYpOgogICAgc2VsZi5mU2lkZVs2XSwgc2VsZi5mU2lkZVs3XSwgc2VsZi5mU2lkZVswXSwgc2VsZi5mU2lkZVsxXSwgc2VsZi5mU2lkZVsyXSwgc2VsZi5mU2lkZVszXSwgc2VsZi5mU2lkZVs0XSwgc2VsZi5mU2lkZVs1XSA9IHNlbGYuZlNpZGVbMF0sIHNlbGYuZlNpZGVbMV0sIHNlbGYuZlNpZGVbMl0sIHNlbGYuZlNpZGVbM10sIHNlbGYuZlNpZGVbNF0sIHNlbGYuZlNpZGVbNV0sIHNlbGYuZlNpZGVbNl0sIHNlbGYuZlNpZGVbN10KCiAgICBzZWxmLmxTaWRlWzddLCBzZWxmLnVTaWRlWzFdLCBzZWxmLnJTaWRlWzNdLCBzZWxmLmRTaWRlWzVdID0gc2VsZi51U2lkZVsxXSwgc2VsZi5yU2lkZVszXSwgc2VsZi5kU2lkZVs1XSwgc2VsZi5sU2lkZVs3XQogICAgc2VsZi5sU2lkZVswXSwgc2VsZi51U2lkZVsyXSwgc2VsZi5yU2lkZVs0XSwgc2VsZi5kU2lkZVs2XSA9IHNlbGYudVNpZGVbMl0sIHNlbGYuclNpZGVbNF0sIHNlbGYuZFNpZGVbNl0sIHNlbGYubFNpZGVbMF0KICAgIHNlbGYubFNpZGVbMV0sIHNlbGYudVNpZGVbM10sIHNlbGYuclNpZGVbNV0sIHNlbGYuZFNpZGVbN10gPSBzZWxmLnVTaWRlWzNdLCBzZWxmLnJTaWRlWzVdLCBzZWxmLmRTaWRlWzddLCBzZWxmLmxTaWRlWzFdCgoKCiAgZGVmIGRvQWxnKHNlbGYsIGFsZ1N0cmluZyk6CiAgICBpYWxnID0gYWxnU3RyaW5nLnJlcGxhY2UoJygnLCAnJykgICAgICNnZXQgcmlkIG9mIHVud2FudGVkCiAgICBpYWxnID0gaWFsZy5yZXBsYWNlKCcpJywgJycpICAgICAgICAgICMgb3Igb3RoZXJ3aXNlIHVubmVlZGVkIGNoYXJhY3RlcnMKICAgIGlhbGcgPSBpYWxnLnJlcGxhY2UoIjInIiwgJzInKSAgICAgICAgIyBpbmNsLiB3aGl0ZXNwYWNlLCBwYXJlbi4sIDIncwogICAgaWFsZyA9IGlhbGcucmVwbGFjZSgnICAnLCAnICcpCiAgICBwYXJ0cyA9IGlhbGcuc3BsaXQoJyAnKSAgICAgICAgICAgICAgICNEaXZpZGUgdGhlIGFsZyB1cCBpbnRvIGluZGl2aWR1YWwgbW92ZXMKCiAgICBmb3IgcGFydCBpbiBwYXJ0czoKICAgICAgaWYgcGFydCA9PSAgICdVJzogIHNlbGYuZG9VKCkKICAgICAgZWxpZiBwYXJ0ID09ICdVMic6IHNlbGYuZG9VKCk7IHNlbGYuZG9VKCkKICAgICAgZWxpZiBwYXJ0ID09ICJVJyI6IHNlbGYuZG9VcCgpCgogICAgICBlbGlmIHBhcnQgPT0gJ0YnOiAgc2VsZi5kb0YoKQogICAgICBlbGlmIHBhcnQgPT0gJ0YyJzogc2VsZi5kb0YoKTsgc2VsZi5kb0YoKQogICAgICBlbGlmIHBhcnQgPT0gIkYnIjogc2VsZi5kb0ZwKCkKCiAgICAgIGVsaWYgcGFydCA9PSAnUic6ICBzZWxmLmRvUigpCiAgICAgIGVsaWYgcGFydCA9PSAnUjInOiBzZWxmLmRvUigpOyBzZWxmLmRvUigpCiAgICAgIGVsaWYgcGFydCA9PSAiUiciOiBzZWxmLmRvUnAoKQoKICBkZWYgcHJpbnRDdWJlKHNlbGYpOgogICAgcHJpbnQKICAgIHByaW50ICIgICAiLCBzZWxmLmJTaWRlWzVdICsgc2VsZi5iU2lkZVs2XSArIHNlbGYuYlNpZGVbN10KICAgIHByaW50ICIgICAiLCBzZWxmLmJTaWRlWzRdICsgImIiICsgCSAgc2VsZi5iU2lkZVswXQogICAgcHJpbnQgIiAgICIsIHNlbGYuYlNpZGVbM10gKyBzZWxmLmJTaWRlWzJdICsgc2VsZi5iU2lkZVsxXSArICdcbicKCiAgICBwcmludCAiICAgIiwgc2VsZi51U2lkZVs1XSArIHNlbGYudVNpZGVbNl0gKyBzZWxmLnVTaWRlWzddCiAgICBwcmludCAiICAgIiwgc2VsZi51U2lkZVs0XSArICJ1IiArIAkgIHNlbGYudVNpZGVbMF0KICAgIHByaW50ICIgICAiLCBzZWxmLnVTaWRlWzNdICsgc2VsZi51U2lkZVsyXSArIHNlbGYudVNpZGVbMV0gKyAnXG4nCgogICAgcHJpbnQgIiIgKyBzZWxmLmxTaWRlWzVdICsgc2VsZi5sU2lkZVs2XSArIHNlbGYubFNpZGVbN10sIHNlbGYuZlNpZGVbNV0gKyBzZWxmLmZTaWRlWzZdICsgc2VsZi5mU2lkZVs3XSwgc2VsZi5yU2lkZVs1XSArIHNlbGYuclNpZGVbNl0gKyBzZWxmLnJTaWRlWzddCiAgICBwcmludCAiIiArIHNlbGYubFNpZGVbNF0gKyAnbCcgKyAgICAgICAgICAgc2VsZi5sU2lkZVswXSwgc2VsZi5mU2lkZVs0XSArICdmJyArICAgICAgICAgICBzZWxmLmZTaWRlWzBdLCBzZWxmLnJTaWRlWzRdICsgJ3InICsgICAgICAgICAgIHNlbGYuclNpZGVbMF0KICAgIHByaW50ICIiICsgc2VsZi5sU2lkZVszXSArIHNlbGYubFNpZGVbMl0gKyBzZWxmLmxTaWRlWzFdLCBzZWxmLmZTaWRlWzNdICsgc2VsZi5mU2lkZVsyXSArIHNlbGYuZlNpZGVbMV0sIHNlbGYuclNpZGVbM10gKyBzZWxmLnJTaWRlWzJdICsgc2VsZi5yU2lkZVsxXSArICdcbicKCiAgICBwcmludCAiICAgIiwgc2VsZi5kU2lkZVs1XSArIHNlbGYuZFNpZGVbNl0gKyBzZWxmLmRTaWRlWzddCiAgICBwcmludCAiICAgIiwgc2VsZi5kU2lkZVs0XSArICJkIiArIAkgIHNlbGYuZFNpZGVbMF0KICAgIHByaW50ICIgICAiLCBzZWxmLmRTaWRlWzNdICsgc2VsZi5kU2lkZVsyXSArIHNlbGYuZFNpZGVbMV0gKyAnXG4nCgogIGRlZiBwcmludE1pbihzZWxmKToKICAgIHByaW50CgogICAgcHJpbnQgIiAgICIsIHNlbGYuYlNpZGVbM10gKyBzZWxmLmJTaWRlWzJdICsgc2VsZi5iU2lkZVsxXSArICdcbicKCiAgICBwcmludCAiICAgIiwgc2VsZi51U2lkZVs1XSArIHNlbGYudVNpZGVbNl0gKyBzZWxmLnVTaWRlWzddCiAgICBwcmludCAiICAgIiwgc2VsZi51U2lkZVs0XSArICJ1IiArIAkgIHNlbGYudVNpZGVbMF0KICAgIHByaW50ICIgICAiLCBzZWxmLnVTaWRlWzNdICsgc2VsZi51U2lkZVsyXSArIHNlbGYudVNpZGVbMV0gKyAnXG4nCgogICAgcHJpbnQgIiIgKyBzZWxmLmxTaWRlWzVdICsgc2VsZi5sU2lkZVs2XSArIHNlbGYubFNpZGVbN10sIHNlbGYuZlNpZGVbNV0gKyBzZWxmLmZTaWRlWzZdICsgc2VsZi5mU2lkZVs3XSwgc2VsZi5yU2lkZVs1XSArIHNlbGYuclNpZGVbNl0gKyBzZWxmLnJTaWRlWzddCgogIGRlZiBjaGVja1NvbHZlZChzZWxmKToKICAgIGlmIHNlbGYudVNpZGVbMF0gPT0gc2VsZi51U2lkZVsxXSA9PSBzZWxmLnVTaWRlWzJdID09IHNlbGYudVNpZGVbM10gPT0gc2VsZi51U2lkZVs0XSA9PSBzZWxmLnVTaWRlWzVdID09IHNlbGYudVNpZGVbNl0gPT0gc2VsZi51U2lkZVs3XToKICAgICAgaWYgc2VsZi5mU2lkZVs1XSA9PSBzZWxmLmZTaWRlWzZdID09IHNlbGYuZlNpZGVbN106CiAgICAgICAgaWYgc2VsZi5sU2lkZVs1XSA9PSBzZWxmLmxTaWRlWzZdID09IHNlbGYubFNpZGVbN106CiAgICAgICAgICBpZiBzZWxmLnJTaWRlWzVdID09IHNlbGYuclNpZGVbNl0gPT0gc2VsZi5yU2lkZVs3XToKICAgICAgICAgICAgaWYgc2VsZi5iU2lkZVszXSA9PSBzZWxmLmJTaWRlWzJdID09IHNlbGYuYlNpZGVbMV06CiAgICAgICAgICAgICAgcmV0dXJuIFRydWUKICAgIHJldHVybiBGYWxzZQoKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKZGVmIHRyeU9uZShhVGVtcCwgdGhpcyk6CSNzdHJpbmcgb2YgYWxnIHRyeWluZywgc3RyaW5nIG9mIGFsZyB0cnlpbmcgdG8gc29sdmUKICAgIHd0ZiA9IE15Q3ViZSgpOyB3dGYuZG9BbGcodGhpcyk7IHd0Zi5kb1VwKCkKICAgIGZvciB0cnkxIGluIHJhbmdlKDQpOgogICAgICAgIHd0Zi5kb1UoKTsgd3RmMiA9IHd0ZgogICAgICAgIHd0ZjIuZG9BbGcoYVRlbXApCgogICAgICAgIGlmIHd0ZjIuY2hlY2tTb2x2ZWQoKTogcmV0dXJuIFRydWUKCiAgICByZXR1cm4gRmFsc2UKCmRlZiB0cnlUd28oYVRlbXAsIGJUZW1wLCB0aGlzKToKICAgIG5vdyA9IE15Q3ViZSgpOyBub3cuZG9BbGcodGhpcyk7IG5vdy5kb1VwKCkKICAgIGZvciB0cnkxIGluIHJhbmdlKDQpOgogICAgICBub3cuZG9VKCk7IG1vdyA9IG5vdwogICAgICBtb3cuZG9BbGcoYVRlbXApCiAgICAgIGZvciB0cnkyIGluIHJhbmdlKDQpOgogICAgICAgICAgbW93LmRvVSgpOyBvb3cgPSBtb3cKICAgICAgICAgIG9vdy5kb0FsZyhiVGVtcCkKICAgICAgICAgIGlmIG9vdy5jaGVja1NvbHZlZCgpOiByZXR1cm4gVHJ1ZQoKICAgIHJldHVybiBGYWxzZQoKZGVmIHRyeUNvbWJvKGEsIGIsIGMpOgogICAgZm9yIGFsZyBpbiByYW5nZSgwLCBsZW4oYWxncykpOgoKICAgICAgICBhQ3ViZSA9IE15Q3ViZSgpOyBhQ3ViZS5kb0FsZyhhbGdzW2FsZ10pCgogICAgICAgIGlmIGFDdWJlLmNoZWNrU29sdmVkKCk6IAkJI2Jhc2ljYWxseSwgY2hlY2sgaWYgaXQncyBhbHJlYWR5IGdvb2QgKGNhc2UgYWxnc1swXSkKICAgICAgICAgICAgY29udGludWUKCiAgICAgICAgZWxpZiB0cnlPbmUoYSwgYWxnc1thbGddKTogICAgY29udGludWUKICAgICAgICBlbGlmIHRyeU9uZShiLCBhbGdzW2FsZ10pOiAgICBjb250aW51ZQogICAgICAgIGVsaWYgdHJ5T25lKGMsIGFsZ3NbYWxnXSk6ICAgIGNvbnRpbnVlCgogICAgICAgIGVsaWYgdHJ5VHdvKGEsIGIsIGFsZ3NbYWxnXSk6IGNvbnRpbnVlCiAgICAgICAgZWxpZiB0cnlUd28oYSwgYywgYWxnc1thbGddKTogY29udGludWUKICAgICAgICBlbGlmIHRyeVR3byhiLCBhLCBhbGdzW2FsZ10pOiBjb250aW51ZQogICAgICAgIGVsaWYgdHJ5VHdvKGIsIGMsIGFsZ3NbYWxnXSk6IGNvbnRpbnVlCiAgICAgICAgZWxpZiB0cnlUd28oYywgYSwgYWxnc1thbGddKTogY29udGludWUKICAgICAgICBlbGlmIHRyeVR3byhjLCBiLCBhbGdzW2FsZ10pOiBjb250aW51ZQoKICAgICAgICBlbGlmIHRyeVR3byhhLCBhLCBhbGdzW2FsZ10pOiBjb250aW51ZQogICAgICAgIGVsaWYgdHJ5VHdvKGIsIGIsIGFsZ3NbYWxnXSk6IGNvbnRpbnVlCiAgICAgICAgZWxpZiB0cnlUd28oYywgYywgYWxnc1thbGddKTogY29udGludWUKCiAgICAgICAgZWxzZTogcmV0dXJuIEZhbHNlCgogICAgcmV0dXJuIFRydWUKCgoKY291bnQgPSAwCmZvciBsMSBpbiByYW5nZSgxNSk6CiNmb3IgbDEgaW4gcmFuZ2UobGVuKGFsZ3MpKToKICAgICNwcmludCAiTDE6ICIsIGwxCiAgICBmb3IgbDIgaW4gcmFuZ2UobDEpOgogICAgICAgICNwcmludCAiTDI6ICIsIGwyLAogICAgICAgIGZvciBsMyBpbiByYW5nZShsMik6CgogICAgICAgICAgICBpZiB0cnlDb21ibyhhbGdzW2wxXSwgYWxnc1tsMl0sIGFsZ3NbbDNdKToKICAgICAgICAgICAgICAgIHByaW50CiAgICAgICAgICAgICAgICBwcmludCAiQWxncyB1c2VkOiAiLCBsMSwgbDIsIGwzCiAgICAgICAgICAgICAgICBwcmludCAiQ2FzZXMgc29sdmVkOiAiICsgc3RyKHN1bShhbGdzRG9uZSkpICsgIiBvdXQgb2YgIiArIHN0cihsZW4oYWxncykpCiAgICAgICAgICAgICAgICBwcmludCBhbGdzRG9uZTsgcHJpbnQKICAgICAgICAgICAgICAgIGhpZ2hlc3QgPSBzdW0oYWxnc0RvbmUp