LS0gJElkOiB0ZXN0ZXMvc3RyaW5ncy5sdWEgJAotLSBTZWUgQ29weXJpZ2h0IE5vdGljZSBpbiBmaWxlIGFsbC5sdWEKCnByaW50KCd0ZXN0aW5nIHN0cmluZ3MgYW5kIHN0cmluZyBsaWJyYXJ5JykKCmxvY2FsIG1heGksIG1pbmkgPSBtYXRoLm1heGludGVnZXIsIG1hdGgubWluaW50ZWdlcgoKCmxvY2FsIGZ1bmN0aW9uIGNoZWNrZXJyb3IgKG1zZywgZiwgLi4uKQogIGxvY2FsIHMsIGVyciA9IHBjYWxsKGYsIC4uLikKICBhc3NlcnQobm90IHMgYW5kIHN0cmluZy5maW5kKGVyciwgbXNnKSkKZW5kCgoKLS0gdGVzdGluZyBzdHJpbmcgY29tcGFyaXNvbnMKYXNzZXJ0KCdhbG8nIDwgJ2FsbzEnKQphc3NlcnQoJycgPCAnYScpCmFzc2VydCgnYWxvXDBhbG8nIDwgJ2Fsb1wwYicpCmFzc2VydCgnYWxvXDBhbG9cMFwwJyA+ICdhbG9cMGFsb1wwJykKYXNzZXJ0KCdhbG8nIDwgJ2Fsb1wwJykKYXNzZXJ0KCdhbG9cMCcgPiAnYWxvJykKYXNzZXJ0KCdcMCcgPCAnXDEnKQphc3NlcnQoJ1wwXDAnIDwgJ1wwXDEnKQphc3NlcnQoJ1wxXDBhXDBhJyA8PSAnXDFcMGFcMGEnKQphc3NlcnQobm90ICgnXDFcMGFcMGInIDw9ICdcMVwwYVwwYScpKQphc3NlcnQoJ1wwXDBcMCcgPCAnXDBcMFwwXDAnKQphc3NlcnQobm90KCdcMFwwXDBcMCcgPCAnXDBcMFwwJykpCmFzc2VydCgnXDBcMFwwJyA8PSAnXDBcMFwwXDAnKQphc3NlcnQobm90KCdcMFwwXDBcMCcgPD0gJ1wwXDBcMCcpKQphc3NlcnQoJ1wwXDBcMCcgPD0gJ1wwXDBcMCcpCmFzc2VydCgnXDBcMFwwJyA+PSAnXDBcMFwwJykKYXNzZXJ0KG5vdCAoJ1wwXDBiJyA8ICdcMFwwYVwwJykpCgotLSB0ZXN0aW5nIHN0cmluZy5zdWIKYXNzZXJ0KHN0cmluZy5zdWIoIjEyMzQ1Njc4OSIsMiw0KSA9PSAiMjM0IikKYXNzZXJ0KHN0cmluZy5zdWIoIjEyMzQ1Njc4OSIsNykgPT0gIjc4OSIpCmFzc2VydChzdHJpbmcuc3ViKCIxMjM0NTY3ODkiLDcsNikgPT0gIiIpCmFzc2VydChzdHJpbmcuc3ViKCIxMjM0NTY3ODkiLDcsNykgPT0gIjciKQphc3NlcnQoc3RyaW5nLnN1YigiMTIzNDU2Nzg5IiwwLDApID09ICIiKQphc3NlcnQoc3RyaW5nLnN1YigiMTIzNDU2Nzg5IiwtMTAsMTApID09ICIxMjM0NTY3ODkiKQphc3NlcnQoc3RyaW5nLnN1YigiMTIzNDU2Nzg5IiwxLDkpID09ICIxMjM0NTY3ODkiKQphc3NlcnQoc3RyaW5nLnN1YigiMTIzNDU2Nzg5IiwtMTAsLTIwKSA9PSAiIikKYXNzZXJ0KHN0cmluZy5zdWIoIjEyMzQ1Njc4OSIsLTEpID09ICI5IikKYXNzZXJ0KHN0cmluZy5zdWIoIjEyMzQ1Njc4OSIsLTQpID09ICI2Nzg5IikKYXNzZXJ0KHN0cmluZy5zdWIoIjEyMzQ1Njc4OSIsLTYsIC00KSA9PSAiNDU2IikKYXNzZXJ0KHN0cmluZy5zdWIoIjEyMzQ1Njc4OSIsIG1pbmksIC00KSA9PSAiMTIzNDU2IikKYXNzZXJ0KHN0cmluZy5zdWIoIjEyMzQ1Njc4OSIsIG1pbmksIG1heGkpID09ICIxMjM0NTY3ODkiKQphc3NlcnQoc3RyaW5nLnN1YigiMTIzNDU2Nzg5IiwgbWluaSwgbWluaSkgPT0gIiIpCmFzc2VydChzdHJpbmcuc3ViKCJcMDAwMTIzNDU2Nzg5IiwzLDUpID09ICIyMzQiKQphc3NlcnQoKCJcMDAwMTIzNDU2Nzg5Iik6c3ViKDgpID09ICI3ODkiKQoKLS0gdGVzdGluZyBzdHJpbmcuZmluZAphc3NlcnQoc3RyaW5nLmZpbmQoIjEyMzQ1Njc4OSIsICIzNDUiKSA9PSAzKQphLGIgPSBzdHJpbmcuZmluZCgiMTIzNDU2Nzg5IiwgIjM0NSIpCmFzc2VydChzdHJpbmcuc3ViKCIxMjM0NTY3ODkiLCBhLCBiKSA9PSAiMzQ1IikKYXNzZXJ0KHN0cmluZy5maW5kKCIxMjM0NTY3ODkwMTIzNDU2Nzg5IiwgIjM0NSIsIDMpID09IDMpCmFzc2VydChzdHJpbmcuZmluZCgiMTIzNDU2Nzg5MDEyMzQ1Njc4OSIsICIzNDUiLCA0KSA9PSAxMykKYXNzZXJ0KHN0cmluZy5maW5kKCIxMjM0NTY3ODkwMTIzNDU2Nzg5IiwgIjM0NiIsIDQpID09IG5pbCkKYXNzZXJ0KHN0cmluZy5maW5kKCIxMjM0NTY3ODkwMTIzNDU2Nzg5IiwgIi40NSIsIC05KSA9PSAxMykKYXNzZXJ0KHN0cmluZy5maW5kKCJhYmNkZWZnIiwgIlwwIiwgNSwgMSkgPT0gbmlsKQphc3NlcnQoc3RyaW5nLmZpbmQoIiIsICIiKSA9PSAxKQphc3NlcnQoc3RyaW5nLmZpbmQoIiIsICIiLCAxKSA9PSAxKQphc3NlcnQobm90IHN0cmluZy5maW5kKCIiLCAiIiwgMikpCmFzc2VydChzdHJpbmcuZmluZCgnJywgJ2FhYScsIDEpID09IG5pbCkKYXNzZXJ0KCgnYWxvKC4pYWxvJyk6ZmluZCgnKC4pJywgMSwgMSkgPT0gNCkKCmFzc2VydChzdHJpbmcubGVuKCIiKSA9PSAwKQphc3NlcnQoc3RyaW5nLmxlbigiXDBcMFwwIikgPT0gMykKYXNzZXJ0KHN0cmluZy5sZW4oIjEyMzQ1Njc4OTAiKSA9PSAxMCkKCmFzc2VydCgjIiIgPT0gMCkKYXNzZXJ0KCMiXDBcMFwwIiA9PSAzKQphc3NlcnQoIyIxMjM0NTY3ODkwIiA9PSAxMCkKCi0tIHRlc3Rpbmcgc3RyaW5nLmJ5dGUvc3RyaW5nLmNoYXIKYXNzZXJ0KHN0cmluZy5ieXRlKCJhIikgPT0gOTcpCmFzc2VydChzdHJpbmcuYnl0ZSgiXHhlNCIpID4gMTI3KQphc3NlcnQoc3RyaW5nLmJ5dGUoc3RyaW5nLmNoYXIoMjU1KSkgPT0gMjU1KQphc3NlcnQoc3RyaW5nLmJ5dGUoc3RyaW5nLmNoYXIoMCkpID09IDApCmFzc2VydChzdHJpbmcuYnl0ZSgiXDAiKSA9PSAwKQphc3NlcnQoc3RyaW5nLmJ5dGUoIlwwXDBhbG9cMHgiLCAtMSkgPT0gc3RyaW5nLmJ5dGUoJ3gnKSkKYXNzZXJ0KHN0cmluZy5ieXRlKCJiYSIsIDIpID09IDk3KQphc3NlcnQoc3RyaW5nLmJ5dGUoIlxuXG4iLCAyLCAtMSkgPT0gMTApCmFzc2VydChzdHJpbmcuYnl0ZSgiXG5cbiIsIDIsIDIpID09IDEwKQphc3NlcnQoc3RyaW5nLmJ5dGUoIiIpID09IG5pbCkKYXNzZXJ0KHN0cmluZy5ieXRlKCJoaSIsIC0zKSA9PSBuaWwpCmFzc2VydChzdHJpbmcuYnl0ZSgiaGkiLCAzKSA9PSBuaWwpCmFzc2VydChzdHJpbmcuYnl0ZSgiaGkiLCA5LCAxMCkgPT0gbmlsKQphc3NlcnQoc3RyaW5nLmJ5dGUoImhpIiwgMiwgMSkgPT0gbmlsKQphc3NlcnQoc3RyaW5nLmNoYXIoKSA9PSAiIikKYXNzZXJ0KHN0cmluZy5jaGFyKDAsIDI1NSwgMCkgPT0gIlwwXDI1NVwwIikKYXNzZXJ0KHN0cmluZy5jaGFyKDAsIHN0cmluZy5ieXRlKCJceGU0IiksIDApID09ICJcMFx4ZTRcMCIpCmFzc2VydChzdHJpbmcuY2hhcihzdHJpbmcuYnl0ZSgiXHhlNGxcMPN1IiwgMSwgLTEpKSA9PSAiXHhlNGxcMPN1IikKYXNzZXJ0KHN0cmluZy5jaGFyKHN0cmluZy5ieXRlKCJceGU0bFww83UiLCAxLCAwKSkgPT0gIiIpCmFzc2VydChzdHJpbmcuY2hhcihzdHJpbmcuYnl0ZSgiXHhlNGxcMPN1IiwgLTEwLCAxMDApKSA9PSAiXHhlNGxcMPN1IikKCmFzc2VydChzdHJpbmcudXBwZXIoImFiXDBjIikgPT0gIkFCXDBDIikKYXNzZXJ0KHN0cmluZy5sb3dlcigiXDBBQkNjJSQiKSA9PSAiXDBhYmNjJSQiKQphc3NlcnQoc3RyaW5nLnJlcCgndGVzdGUnLCAwKSA9PSAnJykKYXNzZXJ0KHN0cmluZy5yZXAoJ3Tpc1wwMHTqJywgMikgPT0gJ3Tpc1wwdOp06XNcMDAwdOonKQphc3NlcnQoc3RyaW5nLnJlcCgnJywgMTApID09ICcnKQoKaWYgc3RyaW5nLnBhY2tzaXplKCJpIikgPT0gNCB0aGVuCiAgLS0gcmVzdWx0IGxlbmd0aCB3b3VsZCBiZSAyXjMxIChpbnQgb3ZlcmZsb3cpCiAgY2hlY2tlcnJvcigidG9vIGxhcmdlIiwgc3RyaW5nLnJlcCwgJ2FhJywgKDEgPDwgMzApKQogIGNoZWNrZXJyb3IoInRvbyBsYXJnZSIsIHN0cmluZy5yZXAsICdhJywgKDEgPDwgMzApLCAnLCcpCmVuZAoKLS0gcmVwZXRpdGlvbnMgd2l0aCBzZXBhcmF0b3IKYXNzZXJ0KHN0cmluZy5yZXAoJ3Rlc3RlJywgMCwgJ3h1eHUnKSA9PSAnJykKYXNzZXJ0KHN0cmluZy5yZXAoJ3Rlc3RlJywgMSwgJ3h1eHUnKSA9PSAndGVzdGUnKQphc3NlcnQoc3RyaW5nLnJlcCgnXDFcMFwxJywgMiwgJ1wwXDAnKSA9PSAnXDFcMFwxXDBcMFwxXDBcMScpCmFzc2VydChzdHJpbmcucmVwKCcnLCAxMCwgJy4nKSA9PSBzdHJpbmcucmVwKCcuJywgOSkpCmFzc2VydChub3QgcGNhbGwoc3RyaW5nLnJlcCwgImFhIiwgbWF4aSAvLyAyICsgMTApKQphc3NlcnQobm90IHBjYWxsKHN0cmluZy5yZXAsICIiLCBtYXhpIC8vIDIgKyAxMCwgImFhIikpCgphc3NlcnQoc3RyaW5nLnJldmVyc2UiIiA9PSAiIikKYXNzZXJ0KHN0cmluZy5yZXZlcnNlIlwwXDFcMlwzIiA9PSAiXDNcMlwxXDAiKQphc3NlcnQoc3RyaW5nLnJldmVyc2UiXDAwMDEyMzQiID09ICI0MzIxXDAiKQoKZm9yIGk9MCwzMCBkbyBhc3NlcnQoc3RyaW5nLmxlbihzdHJpbmcucmVwKCdhJywgaSkpID09IGkpIGVuZAoKYXNzZXJ0KHR5cGUodG9zdHJpbmcobmlsKSkgPT0gJ3N0cmluZycpCmFzc2VydCh0eXBlKHRvc3RyaW5nKDEyKSkgPT0gJ3N0cmluZycpCmFzc2VydChzdHJpbmcuZmluZCh0b3N0cmluZ3t9LCAndGFibGU6JykpCmFzc2VydChzdHJpbmcuZmluZCh0b3N0cmluZyhwcmludCksICdmdW5jdGlvbjonKSkKYXNzZXJ0KCN0b3N0cmluZygnXDAnKSA9PSAxKQphc3NlcnQodG9zdHJpbmcodHJ1ZSkgPT0gInRydWUiKQphc3NlcnQodG9zdHJpbmcoZmFsc2UpID09ICJmYWxzZSIpCmFzc2VydCh0b3N0cmluZygtMTIwMykgPT0gIi0xMjAzIikKYXNzZXJ0KHRvc3RyaW5nKDEyMDMuMTI1KSA9PSAiMTIwMy4xMjUiKQphc3NlcnQodG9zdHJpbmcoLTAuNSkgPT0gIi0wLjUiKQphc3NlcnQodG9zdHJpbmcoLTMyNzY3KSA9PSAiLTMyNzY3IikKaWYgbWF0aC50b2ludGVnZXIoMjE0NzQ4MzY0NykgdGhlbiAgIC0tIG5vIG92ZXJmbG93PyAoMzIgYml0cykKICBhc3NlcnQodG9zdHJpbmcoLTIxNDc0ODM2NDcpID09ICItMjE0NzQ4MzY0NyIpCmVuZAppZiBtYXRoLnRvaW50ZWdlcig0NjExNjg2MDE4NDI3Mzg3OTA0KSB0aGVuICAgLS0gbm8gb3ZlcmZsb3c/ICg2NCBiaXRzKQogIGFzc2VydCh0b3N0cmluZyg0NjExNjg2MDE4NDI3Mzg3OTA0KSA9PSAiNDYxMTY4NjAxODQyNzM4NzkwNCIpCiAgYXNzZXJ0KHRvc3RyaW5nKC00NjExNjg2MDE4NDI3Mzg3OTA0KSA9PSAiLTQ2MTE2ODYwMTg0MjczODc5MDQiKQplbmQKCmlmIHRvc3RyaW5nKDAuMCkgPT0gIjAuMCIgdGhlbiAgIC0tICJzdGFuZGFyZCIgY29lcmNpb24gZmxvYXQtPnN0cmluZwogIGFzc2VydCgnJyAuLiAxMiA9PSAnMTInIGFuZCAxMi4wIC4uICcnID09ICcxMi4wJykKICBhc3NlcnQodG9zdHJpbmcoLTEyMDMgKyAwLjApID09ICItMTIwMy4wIikKZWxzZSAgIC0tIGNvbXBhdGlibGUgY29lcmNpb24KICBhc3NlcnQodG9zdHJpbmcoMC4wKSA9PSAiMCIpCiAgYXNzZXJ0KCcnIC4uIDEyID09ICcxMicgYW5kIDEyLjAgLi4gJycgPT0gJzEyJykKICBhc3NlcnQodG9zdHJpbmcoLTEyMDMgKyAwLjApID09ICItMTIwMyIpCmVuZAoKCnggPSAnIu1sbyJcblxcJwphc3NlcnQoc3RyaW5nLmZvcm1hdCgnJXElcycsIHgsIHgpID09ICciXFwi7WxvXFwiXFxcblxcXFwiIu1sbyJcblxcJykKYXNzZXJ0KHN0cmluZy5mb3JtYXQoJyVxJywgIlwwIikgPT0gW1siXDAiXV0pCmFzc2VydChsb2FkKHN0cmluZy5mb3JtYXQoJ3JldHVybiAlcScsIHgpKSgpID09IHgpCnggPSAiXDBcMVwwMDIzXDVcMDAwOSIKYXNzZXJ0KGxvYWQoc3RyaW5nLmZvcm1hdCgncmV0dXJuICVxJywgeCkpKCkgPT0geCkKYXNzZXJ0KHN0cmluZy5mb3JtYXQoIlwwJWNcMCVjJXhcMCIsIHN0cmluZy5ieXRlKCJceGU0IiksIHN0cmluZy5ieXRlKCJiIiksIDE0MCkgPT0KICAgICAgICAgICAgICAiXDBceGU0XDBiOGNcMCIpCmFzc2VydChzdHJpbmcuZm9ybWF0KCcnKSA9PSAiIikKYXNzZXJ0KHN0cmluZy5mb3JtYXQoIiVjIiwzNCkuLnN0cmluZy5mb3JtYXQoIiVjIiw0OCkuLnN0cmluZy5mb3JtYXQoIiVjIiw5MCkuLnN0cmluZy5mb3JtYXQoIiVjIiwxMDApID09CiAgICAgICBzdHJpbmcuZm9ybWF0KCIlYyVjJWMlYyIsIDM0LCA0OCwgOTAsIDEwMCkpCmFzc2VydChzdHJpbmcuZm9ybWF0KCIlc1wwIGlzIG5vdCBcMCVzIiwgJ25vdCBiZScsICdiZScpID09ICdub3QgYmVcMCBpcyBub3QgXDBiZScpCmFzc2VydChzdHJpbmcuZm9ybWF0KCIlJSVkICUwMTBkIiwgMTAsIDIzKSA9PSAiJTEwIDAwMDAwMDAwMjMiKQphc3NlcnQodG9udW1iZXIoc3RyaW5nLmZvcm1hdCgiJWYiLCAxMC4zKSkgPT0gMTAuMykKeCA9IHN0cmluZy5mb3JtYXQoJyIlLTUwcyInLCAnYScpCmFzc2VydCgjeCA9PSA1MikKYXNzZXJ0KHN0cmluZy5zdWIoeCwgMSwgNCkgPT0gJyJhICAnKQoKYXNzZXJ0KHN0cmluZy5mb3JtYXQoIi0lLjIwcy4yMHMiLCBzdHJpbmcucmVwKCIlIiwgMjAwMCkpID09CiAgICAgICAgICAgICAgICAgICAgICItIi4uc3RyaW5nLnJlcCgiJSIsIDIwKS4uIi4yMHMiKQphc3NlcnQoc3RyaW5nLmZvcm1hdCgnIi0lMjBzLjIwcyInLCBzdHJpbmcucmVwKCIlIiwgMjAwMCkpID09CiAgICAgICBzdHJpbmcuZm9ybWF0KCIlcSIsICItIi4uc3RyaW5nLnJlcCgiJSIsIDIwMDApLi4iLjIwcyIpKQoKZG8KICBsb2NhbCBmdW5jdGlvbiBjaGVja1EgKHYpCiAgICBsb2NhbCBzID0gc3RyaW5nLmZvcm1hdCgiJXEiLCB2KQogICAgbG9jYWwgbnYgPSBsb2FkKCJyZXR1cm4gIiAuLiBzKSgpCiAgICBhc3NlcnQodiA9PSBudiBhbmQgbWF0aC50eXBlKHYpID09IG1hdGgudHlwZShudikpCiAgZW5kCiAgY2hlY2tRKCJcMFwwXDFcMjU1XHV7MjM0fSIpCiAgY2hlY2tRKG1hdGgubWF4aW50ZWdlcikKICBjaGVja1EobWF0aC5taW5pbnRlZ2VyKQogIGNoZWNrUShtYXRoLnBpKQogIGNoZWNrUSgwLjEpCiAgY2hlY2tRKHRydWUpCiAgY2hlY2tRKG5pbCkKICBjaGVja1EoZmFsc2UpCiAgY2hlY2tRKG1hdGguaHVnZSkKICBjaGVja1EoLW1hdGguaHVnZSkKICBhc3NlcnQoc3RyaW5nLmZvcm1hdCgiJXEiLCAwLzApID09ICIoMC8wKSIpICAgLS0gTmFOCiAgY2hlY2tlcnJvcigibm8gbGl0ZXJhbCIsIHN0cmluZy5mb3JtYXQsICIlcSIsIHt9KQplbmQKCmFzc2VydChzdHJpbmcuZm9ybWF0KCJcMCVzXDAiLCAiXDBcMFwxIikgPT0gIlwwXDBcMFwxXDAiKQpjaGVja2Vycm9yKCJjb250YWlucyB6ZXJvcyIsIHN0cmluZy5mb3JtYXQsICIlMTBzIiwgIlwwIikKCi0tIGZvcm1hdCB4IHRvc3RyaW5nCmFzc2VydChzdHJpbmcuZm9ybWF0KCIlcyAlcyIsIG5pbCwgdHJ1ZSkgPT0gIm5pbCB0cnVlIikKYXNzZXJ0KHN0cmluZy5mb3JtYXQoIiVzICUuNHMiLCBmYWxzZSwgdHJ1ZSkgPT0gImZhbHNlIHRydWUiKQphc3NlcnQoc3RyaW5nLmZvcm1hdCgiJS4zcyAlLjNzIiwgZmFsc2UsIHRydWUpID09ICJmYWwgdHJ1IikKbG9jYWwgbSA9IHNldG1ldGF0YWJsZSh7fSwge19fdG9zdHJpbmcgPSBmdW5jdGlvbiAoKSByZXR1cm4gImhlbGxvIiBlbmQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX25hbWUgPSAiaGkifSkKYXNzZXJ0KHN0cmluZy5mb3JtYXQoIiVzICUuMTBzIiwgbSwgbSkgPT0gImhlbGxvIGhlbGxvIikKZ2V0bWV0YXRhYmxlKG0pLl9fdG9zdHJpbmcgPSBuaWwgICAtLSB3aWxsIHVzZSAnX19uYW1lJyBmcm9tIG5vdyBvbgphc3NlcnQoc3RyaW5nLmZvcm1hdCgiJS40cyIsIG0pID09ICJoaTogIikKCmdldG1ldGF0YWJsZShtKS5fX3Rvc3RyaW5nID0gZnVuY3Rpb24gKCkgcmV0dXJuIHt9IGVuZApjaGVja2Vycm9yKCInX190b3N0cmluZycgbXVzdCByZXR1cm4gYSBzdHJpbmciLCB0b3N0cmluZywgbSkKCgphc3NlcnQoc3RyaW5nLmZvcm1hdCgiJXgiLCAwLjApID09ICIwIikKYXNzZXJ0KHN0cmluZy5mb3JtYXQoIiUwMngiLCAwLjApID09ICIwMCIpCmFzc2VydChzdHJpbmcuZm9ybWF0KCIlMDhYIiwgMHhGRkZGRkZGRikgPT0gIkZGRkZGRkZGIikKYXNzZXJ0KHN0cmluZy5mb3JtYXQoIiUrMDhkIiwgMzE1MDEpID09ICIrMDAzMTUwMSIpCmFzc2VydChzdHJpbmcuZm9ybWF0KCIlKzA4ZCIsIC0zMDkyNykgPT0gIi0wMDMwOTI3IikKCgpkbyAgICAtLSBsb25nZXN0IG51bWJlciB0aGF0IGNhbiBiZSBmb3JtYXR0ZWQKICBsb2NhbCBpID0gMQogIGxvY2FsIGogPSAxMDAwMAogIHdoaWxlIGkgKyAxIDwgaiBkbyAgIC0tIGJpbmFyeSBzZWFyY2ggZm9yIG1heGltdW0gZmluaXRlIGZsb2F0CiAgICBsb2NhbCBtID0gKGkgKyBqKSAvLyAyCiAgICBpZiAxMF5tIDwgbWF0aC5odWdlIHRoZW4gaSA9IG0gZWxzZSBqID0gbSBlbmQKICBlbmQKICBhc3NlcnQoMTBeaSA8IG1hdGguaHVnZSBhbmQgMTBeaiA9PSBtYXRoLmh1Z2UpCiAgbG9jYWwgcyA9IHN0cmluZy5mb3JtYXQoJyUuOTlmJywgLSgxMF5pKSkKICBhc3NlcnQoc3RyaW5nLmxlbihzKSA+PSBpICsgMTAxKQogIGFzc2VydCh0b251bWJlcihzKSA9PSAtKDEwXmkpKQplbmQKCgotLSB0ZXN0aW5nIGxhcmdlIG51bWJlcnMgZm9yIGZvcm1hdApkbyAgIC0tIGFzc3VtZSBhdCBsZWFzdCAzMiBiaXRzCiAgbG9jYWwgbWF4LCBtaW4gPSAweDdmZmZmZmZmLCAtMHg4MDAwMDAwMCAgICAtLSAibGFyZ2UiIGZvciAzMiBiaXRzCiAgYXNzZXJ0KHN0cmluZy5zdWIoc3RyaW5nLmZvcm1hdCgiJTh4IiwgLTEpLCAtOCkgPT0gImZmZmZmZmZmIikKICBhc3NlcnQoc3RyaW5nLmZvcm1hdCgiJXgiLCBtYXgpID09ICI3ZmZmZmZmZiIpCiAgYXNzZXJ0KHN0cmluZy5zdWIoc3RyaW5nLmZvcm1hdCgiJXgiLCBtaW4pLCAtOCkgPT0gIjgwMDAwMDAwIikKICBhc3NlcnQoc3RyaW5nLmZvcm1hdCgiJWQiLCBtYXgpID09ICAiMjE0NzQ4MzY0NyIpCiAgYXNzZXJ0KHN0cmluZy5mb3JtYXQoIiVkIiwgbWluKSA9PSAiLTIxNDc0ODM2NDgiKQogIGFzc2VydChzdHJpbmcuZm9ybWF0KCIldSIsIDB4ZmZmZmZmZmYpID09ICI0Mjk0OTY3Mjk1IikKICBhc3NlcnQoc3RyaW5nLmZvcm1hdCgiJW8iLCAweEFCQ0QpID09ICIxMjU3MTUiKQoKICBtYXgsIG1pbiA9IDB4N2ZmZmZmZmZmZmZmZmZmZiwgLTB4ODAwMDAwMDAwMDAwMDAwMAogIGlmIG1heCA+IDIuMF41MyB0aGVuICAtLSBvbmx5IGZvciA2NCBiaXRzCiAgICBhc3NlcnQoc3RyaW5nLmZvcm1hdCgiJXgiLCAoMl41MiB8IDApIC0gMSkgPT0gImZmZmZmZmZmZmZmZmYiKQogICAgYXNzZXJ0KHN0cmluZy5mb3JtYXQoIjB4JThYIiwgMHg4ZjAwMDAwMykgPT0gIjB4OEYwMDAwMDMiKQogICAgYXNzZXJ0KHN0cmluZy5mb3JtYXQoIiVkIiwgMl41MykgPT0gIjkwMDcxOTkyNTQ3NDA5OTIiKQogICAgYXNzZXJ0KHN0cmluZy5mb3JtYXQoIiVpIiwgLTJeNTMpID09ICItOTAwNzE5OTI1NDc0MDk5MiIpCiAgICBhc3NlcnQoc3RyaW5nLmZvcm1hdCgiJXgiLCBtYXgpID09ICI3ZmZmZmZmZmZmZmZmZmZmIikKICAgIGFzc2VydChzdHJpbmcuZm9ybWF0KCIleCIsIG1pbikgPT0gIjgwMDAwMDAwMDAwMDAwMDAiKQogICAgYXNzZXJ0KHN0cmluZy5mb3JtYXQoIiVkIiwgbWF4KSA9PSAgIjkyMjMzNzIwMzY4NTQ3NzU4MDciKQogICAgYXNzZXJ0KHN0cmluZy5mb3JtYXQoIiVkIiwgbWluKSA9PSAiLTkyMjMzNzIwMzY4NTQ3NzU4MDgiKQogICAgYXNzZXJ0KHN0cmluZy5mb3JtYXQoIiV1IiwgfigtMSA8PCA2NCkpID09ICIxODQ0Njc0NDA3MzcwOTU1MTYxNSIpCiAgICBhc3NlcnQodG9zdHJpbmcoMTIzNDU2Nzg5MDEyMykgPT0gJzEyMzQ1Njc4OTAxMjMnKQogIGVuZAplbmQKCgpkbyBwcmludCgidGVzdGluZyAnZm9ybWF0ICVhICVBJyIpCiAgbG9jYWwgZnVuY3Rpb24gbWF0Y2hoZXhhIChuKQogICAgbG9jYWwgcyA9IHN0cmluZy5mb3JtYXQoIiVhIiwgbikKICAgIC0tIHJlc3VsdCBtYXRjaGVzIElTTyBDIHJlcXVpcmVtZW50cwogICAgYXNzZXJ0KHN0cmluZy5maW5kKHMsICJeJS0/MHhbMS05YS1mXSUuP1swLTlhLWZdKnBbLStdPyVkKyQiKSkKICAgIGFzc2VydCh0b251bWJlcihzKSA9PSBuKSAgLS0gYW5kIGhhcyBmdWxsIHByZWNpc2lvbgogICAgcyA9IHN0cmluZy5mb3JtYXQoIiVBIiwgbikKICAgIGFzc2VydChzdHJpbmcuZmluZChzLCAiXiUtPzBYWzEtOUEtRl0lLj9bMC05QS1GXSpQWy0rXT8lZCskIikpCiAgICBhc3NlcnQodG9udW1iZXIocykgPT0gbikKICBlbmQKICBmb3IgXywgbiBpbiBpcGFpcnN7MC4xLCAtMC4xLCAxLzMsIC0xLzMsIDFlMzAsIC0xZTMwLAogICAgICAgICAgICAgICAgICAgICAtNDUvMjQ3LCAxLCAtMSwgMiwgLTIsIDNlLTIwLCAtM2UtMjB9IGRvCiAgICBtYXRjaGhleGEobikKICBlbmQKCiAgYXNzZXJ0KHN0cmluZy5maW5kKHN0cmluZy5mb3JtYXQoIiVBIiwgMC4wKSwgIl4wWDAlLj8wP1AlKz8wJCIpKQogIGFzc2VydChzdHJpbmcuZmluZChzdHJpbmcuZm9ybWF0KCIlYSIsIC0wLjApLCAiXiUtMHgwJS4/MD9wJSs/MCQiKSkKCiAgaWYgbm90IF9wb3J0IHRoZW4gICAtLSB0ZXN0IGluZiwgLWluZiwgTmFOLCBhbmQgLTAuMAogICAgYXNzZXJ0KHN0cmluZy5maW5kKHN0cmluZy5mb3JtYXQoIiVhIiwgMS8wKSwgIl5pbmYiKSkKICAgIGFzc2VydChzdHJpbmcuZmluZChzdHJpbmcuZm9ybWF0KCIlQSIsIC0xLzApLCAiXiUtSU5GIikpCiAgICBhc3NlcnQoc3RyaW5nLmZpbmQoc3RyaW5nLmZvcm1hdCgiJWEiLCAwLzApLCAiXiUtP25hbiIpKQogICAgYXNzZXJ0KHN0cmluZy5maW5kKHN0cmluZy5mb3JtYXQoIiVhIiwgLTAuMCksICJeJS0weDAiKSkKICBlbmQKICAKICBpZiBub3QgcGNhbGwoc3RyaW5nLmZvcm1hdCwgIiUuM2EiLCAwKSB0aGVuCiAgICAoTWVzc2FnZSBvciBwcmludCkoIlxuID4+PiBtb2RpZmllcnMgZm9yIGZvcm1hdCAnJWEnIG5vdCBhdmFpbGFibGUgPDw8XG4iKQogIGVsc2UKICAgIGFzc2VydChzdHJpbmcuZmluZChzdHJpbmcuZm9ybWF0KCIlKy4yQSIsIDEyKSwgIl4lKzBYJXglLiV4MFAlKz8lZCQiKSkKICAgIGFzc2VydChzdHJpbmcuZmluZChzdHJpbmcuZm9ybWF0KCIlLjRBIiwgLTEyKSwgIl4lLTBYJXglLiV4MDAwUCUrPyVkJCIpKQogIGVuZAplbmQKCgotLSBlcnJvcnMgaW4gZm9ybWF0Cgpsb2NhbCBmdW5jdGlvbiBjaGVjayAoZm10LCBtc2cpCiAgY2hlY2tlcnJvcihtc2csIHN0cmluZy5mb3JtYXQsIGZtdCwgMTApCmVuZAoKbG9jYWwgYXV4ID0gc3RyaW5nLnJlcCgnMCcsIDYwMCkKY2hlY2soIiUxMDAuM2QiLCAidG9vIGxvbmciKQpjaGVjaygiJTEiLi5hdXguLiIuM2QiLCAidG9vIGxvbmciKQpjaGVjaygiJTEuMTAwZCIsICJ0b28gbG9uZyIpCmNoZWNrKCIlMTAuMSIuLmF1eC4uIjAwNGQiLCAidG9vIGxvbmciKQpjaGVjaygiJXQiLCAiaW52YWxpZCBvcHRpb24iKQpjaGVjaygiJSIuLmF1eC4uImQiLCAicmVwZWF0ZWQgZmxhZ3MiKQpjaGVjaygiJWQgJWQiLCAibm8gdmFsdWUiKQoKCmFzc2VydChsb2FkKCJyZXR1cm4gMVxuLS1jb21tZW50IHdpdGhvdXQgZW5kaW5nIEVPTCIpKCkgPT0gMSkKCgpjaGVja2Vycm9yKCJ0YWJsZSBleHBlY3RlZCIsIHRhYmxlLmNvbmNhdCwgMykKYXNzZXJ0KHRhYmxlLmNvbmNhdHt9ID09ICIiKQphc3NlcnQodGFibGUuY29uY2F0KHt9LCAneCcpID09ICIiKQphc3NlcnQodGFibGUuY29uY2F0KHsnXDAnLCAnXDBcMScsICdcMFwxXDInfSwgJy5cMC4nKSA9PSAiXDAuXDAuXDBcMS5cMC5cMFwxXDIiKQpsb2NhbCBhID0ge307IGZvciBpPTEsMzAwIGRvIGFbaV0gPSAieHV4dSIgZW5kCmFzc2VydCh0YWJsZS5jb25jYXQoYSwgIjEyMyIpLi4iMTIzIiA9PSBzdHJpbmcucmVwKCJ4dXh1MTIzIiwgMzAwKSkKYXNzZXJ0KHRhYmxlLmNvbmNhdChhLCAiYiIsIDIwLCAyMCkgPT0gInh1eHUiKQphc3NlcnQodGFibGUuY29uY2F0KGEsICIiLCAyMCwgMjEpID09ICJ4dXh1eHV4dSIpCmFzc2VydCh0YWJsZS5jb25jYXQoYSwgIngiLCAyMiwgMjEpID09ICIiKQphc3NlcnQodGFibGUuY29uY2F0KGEsICIzIiwgMjk5KSA9PSAieHV4dTN4dXh1IikKYXNzZXJ0KHRhYmxlLmNvbmNhdCh7fSwgIngiLCBtYXhpLCBtYXhpIC0gMSkgPT0gIiIpCmFzc2VydCh0YWJsZS5jb25jYXQoe30sICJ4IiwgbWluaSArIDEsIG1pbmkpID09ICIiKQphc3NlcnQodGFibGUuY29uY2F0KHt9LCAieCIsIG1heGksIG1pbmkpID09ICIiKQphc3NlcnQodGFibGUuY29uY2F0KHtbbWF4aV0gPSAiYWxvIn0sICJ4IiwgbWF4aSwgbWF4aSkgPT0gImFsbyIpCmFzc2VydCh0YWJsZS5jb25jYXQoe1ttYXhpXSA9ICJhbG8iLCBbbWF4aSAtIDFdID0gInkifSwgIi0iLCBtYXhpIC0gMSwgbWF4aSkKICAgICAgID09ICJ5LWFsbyIpCgphc3NlcnQobm90IHBjYWxsKHRhYmxlLmNvbmNhdCwgeyJhIiwgImIiLCB7fX0pKQoKYSA9IHsiYSIsImIiLCJjIn0KYXNzZXJ0KHRhYmxlLmNvbmNhdChhLCAiLCIsIDEsIDApID09ICIiKQphc3NlcnQodGFibGUuY29uY2F0KGEsICIsIiwgMSwgMSkgPT0gImEiKQphc3NlcnQodGFibGUuY29uY2F0KGEsICIsIiwgMSwgMikgPT0gImEsYiIpCmFzc2VydCh0YWJsZS5jb25jYXQoYSwgIiwiLCAyKSA9PSAiYixjIikKYXNzZXJ0KHRhYmxlLmNvbmNhdChhLCAiLCIsIDMpID09ICJjIikKYXNzZXJ0KHRhYmxlLmNvbmNhdChhLCAiLCIsIDQpID09ICIiKQoKaWYgbm90IF9wb3J0IHRoZW4KCiAgbG9jYWwgbG9jYWxlcyA9IHsgInB0YiIsICJwdF9CUi5pc284ODU5MSIsICJJU08tODg1OS0xIiB9CiAgbG9jYWwgZnVuY3Rpb24gdHJ5bG9jYWxlICh3KQogICAgZm9yIGkgPSAxLCAjbG9jYWxlcyBkbwogICAgICBpZiBvcy5zZXRsb2NhbGUobG9jYWxlc1tpXSwgdykgdGhlbgogICAgICAgIHByaW50KHN0cmluZy5mb3JtYXQoIiclcycgbG9jYWxlIHNldCB0byAnJXMnIiwgdywgbG9jYWxlc1tpXSkpCiAgICAgICAgcmV0dXJuIGxvY2FsZXNbaV0KICAgICAgZW5kCiAgICBlbmQKICAgIHByaW50KHN0cmluZy5mb3JtYXQoIiclcycgbG9jYWxlIG5vdCBmb3VuZCIsIHcpKQogICAgcmV0dXJuIGZhbHNlCiAgZW5kCgogIGlmIHRyeWxvY2FsZSgiY29sbGF0ZSIpICB0aGVuCiAgICBhc3NlcnQoImFsbyIgPCAi4WxvIiBhbmQgIuFsbyIgPCAiYW1vIikKICBlbmQKCiAgaWYgdHJ5bG9jYWxlKCJjdHlwZSIpIHRoZW4KICAgIGFzc2VydChzdHJpbmcuZ3N1Yigi4ent8/oiLCAiJWEiLCAieCIpID09ICJ4eHh4eCIpCiAgICBhc3NlcnQoc3RyaW5nLmdzdWIoIuHB6ckiLCAiJWwiLCAieCIpID09ICJ4wXjJIikKICAgIGFzc2VydChzdHJpbmcuZ3N1Yigi4cHpySIsICIldSIsICJ4IikgPT0gIuF46XgiKQogICAgYXNzZXJ0KHN0cmluZy51cHBlciLhwel7eHV4dX3n428iID09ICLBwcl7WFVYVX3Hw08iKQogIGVuZAoKICBvcy5zZXRsb2NhbGUoIkMiKQogIGFzc2VydChvcy5zZXRsb2NhbGUoKSA9PSAnQycpCiAgYXNzZXJ0KG9zLnNldGxvY2FsZShuaWwsICJudW1lcmljIikgPT0gJ0MnKQoKZW5kCgoKLS0gYnVnIGluIEx1YSA1LjMuMgotLSAnZ21hdGNoJyBpdGVyYXRvciBkb2VzIG5vdCB3b3JrIGFjcm9zcyBjb3JvdXRpbmVzCmRvCiAgbG9jYWwgZiA9IHN0cmluZy5nbWF0Y2goIjEgMiAzIDQgNSIsICIlZCsiKQogIGFzc2VydChmKCkgPT0gIjEiKQogIGNvID0gY29yb3V0aW5lLndyYXAoZikKICBhc3NlcnQoY28oKSA9PSAiMiIpCmVuZAoKcHJpbnQoJ09LJykKCg==