LS0gJElkOiB0ZXN0ZXMvZGIubHVhICQKLS0gU2VlIENvcHlyaWdodCBOb3RpY2UgaW4gZmlsZSBhbGwubHVhCgotLSB0ZXN0aW5nIGRlYnVnIGxpYnJhcnkKCmxvY2FsIGRlYnVnID0gcmVxdWlyZSAiZGVidWciCgpsb2NhbCBmdW5jdGlvbiBkb3N0cmluZyhzKSByZXR1cm4gYXNzZXJ0KGxvYWQocykpKCkgZW5kCgpwcmludCJ0ZXN0aW5nIGRlYnVnIGxpYnJhcnkgYW5kIGRlYnVnIGluZm9ybWF0aW9uIgoKZG8KbG9jYWwgYT0xCmVuZAoKYXNzZXJ0KG5vdCBkZWJ1Zy5nZXRob29rKCkpCgpsb2NhbCB0ZXN0bGluZSA9IDE5ICAgICAgICAgLS0gbGluZSB3aGVyZSAndGVzdCcgaXMgZGVmaW5lZApmdW5jdGlvbiB0ZXN0IChzLCBsLCBwKSAgICAgLS0gdGhpcyBtdXN0IGJlIGxpbmUgMTkKICBjb2xsZWN0Z2FyYmFnZSgpICAgLS0gYXZvaWQgZ2MgZHVyaW5nIHRyYWNlCiAgbG9jYWwgZnVuY3Rpb24gZiAoZXZlbnQsIGxpbmUpCiAgICBhc3NlcnQoZXZlbnQgPT0gJ2xpbmUnKQogICAgbG9jYWwgbCA9IHRhYmxlLnJlbW92ZShsLCAxKQogICAgaWYgcCB0aGVuIHByaW50KGwsIGxpbmUpIGVuZAogICAgYXNzZXJ0KGwgPT0gbGluZSwgIndyb25nIHRyYWNlISEiKQogIGVuZAogIGRlYnVnLnNldGhvb2soZiwibCIpOyBsb2FkKHMpKCk7IGRlYnVnLnNldGhvb2soKQogIGFzc2VydCgjbCA9PSAwKQplbmQKCgpkbwogIGFzc2VydChub3QgcGNhbGwoZGVidWcuZ2V0aW5mbywgcHJpbnQsICJYIikpICAgLS0gaW52YWxpZCBvcHRpb24KICBhc3NlcnQobm90IHBjYWxsKGRlYnVnLmdldGluZm8sIDAsICI+IikpICAgLS0gaW52YWxpZCBvcHRpb24KICBhc3NlcnQobm90IGRlYnVnLmdldGluZm8oMTAwMCkpICAgLS0gb3V0IG9mIHJhbmdlIGxldmVsCiAgYXNzZXJ0KG5vdCBkZWJ1Zy5nZXRpbmZvKC0xKSkgICAgIC0tIG91dCBvZiByYW5nZSBsZXZlbAogIGxvY2FsIGEgPSBkZWJ1Zy5nZXRpbmZvKHByaW50KQogIGFzc2VydChhLndoYXQgPT0gIkMiIGFuZCBhLnNob3J0X3NyYyA9PSAiW0NdIikKICBhID0gZGVidWcuZ2V0aW5mbyhwcmludCwgIkwiKQogIGFzc2VydChhLmFjdGl2ZWxpbmVzID09IG5pbCkKICBsb2NhbCBiID0gZGVidWcuZ2V0aW5mbyh0ZXN0LCAiU2ZMIikKICBhc3NlcnQoYi5uYW1lID09IG5pbCBhbmQgYi53aGF0ID09ICJMdWEiIGFuZCBiLmxpbmVkZWZpbmVkID09IHRlc3RsaW5lIGFuZAogICAgICAgICBiLmxhc3RsaW5lZGVmaW5lZCA9PSBiLmxpbmVkZWZpbmVkICsgMTAgYW5kCiAgICAgICAgIGIuZnVuYyA9PSB0ZXN0IGFuZCBub3Qgc3RyaW5nLmZpbmQoYi5zaG9ydF9zcmMsICIlWyIpKQogIGFzc2VydChiLmFjdGl2ZWxpbmVzW2IubGluZWRlZmluZWQgKyAxXSBhbmQKICAgICAgICAgYi5hY3RpdmVsaW5lc1tiLmxhc3RsaW5lZGVmaW5lZF0pCiAgYXNzZXJ0KG5vdCBiLmFjdGl2ZWxpbmVzW2IubGluZWRlZmluZWRdIGFuZAogICAgICAgICBub3QgYi5hY3RpdmVsaW5lc1tiLmxhc3RsaW5lZGVmaW5lZCArIDFdKQplbmQKCgotLSB0ZXN0IGZpbGUgYW5kIHN0cmluZyBuYW1lcyB0cnVuY2F0aW9uCmEgPSAiZnVuY3Rpb24gZiAoKSBlbmQiCmxvY2FsIGZ1bmN0aW9uIGRvc3RyaW5nIChzLCB4KSByZXR1cm4gbG9hZChzLCB4KSgpIGVuZApkb3N0cmluZyhhKQphc3NlcnQoZGVidWcuZ2V0aW5mbyhmKS5zaG9ydF9zcmMgPT0gc3RyaW5nLmZvcm1hdCgnW3N0cmluZyAiJXMiXScsIGEpKQpkb3N0cmluZyhhLi5zdHJpbmcuZm9ybWF0KCI7ICVzXG49MSIsIHN0cmluZy5yZXAoJ3AnLCA0MDApKSkKYXNzZXJ0KHN0cmluZy5maW5kKGRlYnVnLmdldGluZm8oZikuc2hvcnRfc3JjLCAnXiVbc3RyaW5nIFteXG5dKiUuJS4lLiIlXSQnKSkKZG9zdHJpbmcoYS4uc3RyaW5nLmZvcm1hdCgiOyAlcz0xIiwgc3RyaW5nLnJlcCgncCcsIDQwMCkpKQphc3NlcnQoc3RyaW5nLmZpbmQoZGVidWcuZ2V0aW5mbyhmKS5zaG9ydF9zcmMsICdeJVtzdHJpbmcgW15cbl0qJS4lLiUuIiVdJCcpKQpkb3N0cmluZygiXG4iLi5hKQphc3NlcnQoZGVidWcuZ2V0aW5mbyhmKS5zaG9ydF9zcmMgPT0gJ1tzdHJpbmcgIi4uLiJdJykKZG9zdHJpbmcoYSwgIiIpCmFzc2VydChkZWJ1Zy5nZXRpbmZvKGYpLnNob3J0X3NyYyA9PSAnW3N0cmluZyAiIl0nKQpkb3N0cmluZyhhLCAiQHh1eHUiKQphc3NlcnQoZGVidWcuZ2V0aW5mbyhmKS5zaG9ydF9zcmMgPT0gInh1eHUiKQpkb3N0cmluZyhhLCAiQCIuLnN0cmluZy5yZXAoJ3AnLCAxMDAwKS4uJ3QnKQphc3NlcnQoc3RyaW5nLmZpbmQoZGVidWcuZ2V0aW5mbyhmKS5zaG9ydF9zcmMsICJeJS4lLiUucCp0JCIpKQpkb3N0cmluZyhhLCAiPXh1eHUiKQphc3NlcnQoZGVidWcuZ2V0aW5mbyhmKS5zaG9ydF9zcmMgPT0gInh1eHUiKQpkb3N0cmluZyhhLCBzdHJpbmcuZm9ybWF0KCI9JXMiLCBzdHJpbmcucmVwKCd4JywgNTAwKSkpCmFzc2VydChzdHJpbmcuZmluZChkZWJ1Zy5nZXRpbmZvKGYpLnNob3J0X3NyYywgIl54KiQiKSkKZG9zdHJpbmcoYSwgIj0iKQphc3NlcnQoZGVidWcuZ2V0aW5mbyhmKS5zaG9ydF9zcmMgPT0gIiIpCmEgPSBuaWw7IGYgPSBuaWw7CgoKcmVwZWF0CiAgbG9jYWwgZyA9IHt4ID0gZnVuY3Rpb24gKCkKICAgIGxvY2FsIGEgPSBkZWJ1Zy5nZXRpbmZvKDIpCiAgICBhc3NlcnQoYS5uYW1lID09ICdmJyBhbmQgYS5uYW1ld2hhdCA9PSAnbG9jYWwnKQogICAgYSA9IGRlYnVnLmdldGluZm8oMSkKICAgIGFzc2VydChhLm5hbWUgPT0gJ3gnIGFuZCBhLm5hbWV3aGF0ID09ICdmaWVsZCcpCiAgICByZXR1cm4gJ3hpeGknCiAgZW5kfQogIGxvY2FsIGYgPSBmdW5jdGlvbiAoKSByZXR1cm4gMSsxIGFuZCAobm90IDEgb3IgZy54KCkpIGVuZAogIGFzc2VydChmKCkgPT0gJ3hpeGknKQogIGcgPSBkZWJ1Zy5nZXRpbmZvKGYpCiAgYXNzZXJ0KGcud2hhdCA9PSAiTHVhIiBhbmQgZy5mdW5jID09IGYgYW5kIGcubmFtZXdoYXQgPT0gIiIgYW5kIG5vdCBnLm5hbWUpCgogIGZ1bmN0aW9uIGYgKHgsIG5hbWUpICAgLS0gbG9jYWwhCiAgICBuYW1lID0gbmFtZSBvciAnZicKICAgIGxvY2FsIGEgPSBkZWJ1Zy5nZXRpbmZvKDEpCiAgICBhc3NlcnQoYS5uYW1lID09IG5hbWUgYW5kIGEubmFtZXdoYXQgPT0gJ2xvY2FsJykKICAgIHJldHVybiB4CiAgZW5kCgogIC0tIGJyZWFrcyBpbiBkaWZmZXJlbnQgY29uZGl0aW9ucwogIGlmIDM+NCB0aGVuIGJyZWFrIGVuZDsgZigpCiAgaWYgMzw0IHRoZW4gYT0xIGVsc2UgYnJlYWsgZW5kOyBmKCkKICB3aGlsZSAxIGRvIGxvY2FsIHg9MTA7IGJyZWFrIGVuZDsgZigpCiAgbG9jYWwgYiA9IDEKICBpZiAzPjQgdGhlbiByZXR1cm4gbWF0aC5zaW4oMSkgZW5kOyBmKCkKICBhID0gMzw0OyBmKCkKICBhID0gMzw0IG9yIDE7IGYoKQogIHJlcGVhdCBsb2NhbCB4PTIwOyBpZiA0PjMgdGhlbiBmKCkgZWxzZSBicmVhayBlbmQ7IGYoKSB1bnRpbCAxCiAgZyA9IHt9CiAgZihnKS54ID0gZigyKSBhbmQgZigxMCkrZig5KQogIGFzc2VydChnLnggPT0gZigxOSkpCiAgZnVuY3Rpb24gZyh4KSBpZiBub3QgeCB0aGVuIHJldHVybiAzIGVuZCByZXR1cm4gKHgoJ2EnLCAneCcpKSBlbmQKICBhc3NlcnQoZyhmKSA9PSAnYScpCnVudGlsIDEKCnRlc3QoW1tpZgptYXRoLnNpbigxKQp0aGVuCiAgYT0xCmVsc2UKICBhPTIKZW5kCl1dLCB7MiwzLDQsN30pCgp0ZXN0KFtbCmxvY2FsIGZ1bmN0aW9uIGZvbygpCmVuZApmb28oKQpBID0gMQpBID0gMgpBID0gMwpdXSwgezIsIDMsIDIsIDQsIDUsIDZ9KQoKCnRlc3QoW1stLQppZiBuaWwgdGhlbgogIGE9MQplbHNlCiAgYT0yCmVuZApdXSwgezIsNSw2fSkKCnRlc3QoW1thPTEKcmVwZWF0CiAgYT1hKzEKdW50aWwgYT09MwpdXSwgezEsMyw0LDMsNH0pCgp0ZXN0KFtbIGRvCiAgcmV0dXJuCmVuZApdXSwgezJ9KQoKdGVzdChbW2xvY2FsIGEKYT0xCndoaWxlIGE8PTMgZG8KICBhPWErMQplbmQKXV0sIHsxLDIsMyw0LDMsNCwzLDQsMyw1fSkKCnRlc3QoW1t3aGlsZSBtYXRoLnNpbigxKSBkbwogIGlmIG1hdGguc2luKDEpCiAgdGhlbiBicmVhawogIGVuZAplbmQKYT0xXV0sIHsxLDIsMyw2fSkKCnRlc3QoW1tmb3IgaT0xLDMgZG8KICBhPWkKZW5kCl1dLCB7MSwyLDEsMiwxLDIsMSwzfSkKCnRlc3QoW1tmb3IgaSx2IGluIHBhaXJzeydhJywnYid9IGRvCiAgYT10b3N0cmluZyhpKSAuLiB2CmVuZApdXSwgezEsMiwxLDIsMSwzfSkKCnRlc3QoW1tmb3IgaT0xLDQgZG8gYT0xIGVuZF1dLCB7MSwxLDEsMX0pCgoKZG8gICAtLSB0ZXN0aW5nIGxpbmUgaW5mby90cmFjZSB3aXRoIGxhcmdlIGdhcHMgaW4gc291cmNlCgogIGxvY2FsIGEgPSB7MSwgMiwgMywgMTAsIDEyNCwgMTI1LCAxMjYsIDEyNywgMTI4LCAxMjksIDEzMCwKICAgICAgICAgICAgIDI1NSwgMjU2LCAyNTcsIDUwMCwgMTAwMH0KICBsb2NhbCBzID0gW1sKICAgICBsb2NhbCBiID0gezEwfQogICAgIGEgPSBiWzFdIFggKyBZIGJbMV0KICAgICBiID0gNAogIF1dCiAgZm9yIF8sIGkgaW4gaXBhaXJzKGEpIGRvCiAgICBsb2NhbCBzdWJzID0ge1ggPSBzdHJpbmcucmVwKCJcbiIsIGkpfQogICAgZm9yIF8sIGogaW4gaXBhaXJzKGEpIGRvCiAgICAgIHN1YnMuWSA9IHN0cmluZy5yZXAoIlxuIiwgaikKICAgICAgbG9jYWwgcyA9IHN0cmluZy5nc3ViKHMsICJbWFldIiwgc3VicykKICAgICAgdGVzdChzLCB7MSwgMiArIGksIDIgKyBpICsgaiwgMiArIGksIDIgKyBpICsgaiwgMyArIGkgKyBqfSkKICAgIGVuZAogIGVuZAplbmQKCnByaW50JysnCgotLSBpbnZhbGlkIGxldmVscyBpbiBbZ3NdZXRsb2NhbAphc3NlcnQobm90IHBjYWxsKGRlYnVnLmdldGxvY2FsLCAyMCwgMSkpCmFzc2VydChub3QgcGNhbGwoZGVidWcuc2V0bG9jYWwsIC0xLCAxLCAxMCkpCgoKLS0gcGFyYW1ldGVyIG5hbWVzCmxvY2FsIGZ1bmN0aW9uIGZvbyAoYSxiLC4uLikgbG9jYWwgZCwgZSBlbmQKbG9jYWwgY28gPSBjb3JvdXRpbmUuY3JlYXRlKGZvbykKCmFzc2VydChkZWJ1Zy5nZXRsb2NhbChmb28sIDEpID09ICdhJykKYXNzZXJ0KGRlYnVnLmdldGxvY2FsKGZvbywgMikgPT0gJ2InKQphc3NlcnQobm90IGRlYnVnLmdldGxvY2FsKGZvbywgMykpCmFzc2VydChkZWJ1Zy5nZXRsb2NhbChjbywgZm9vLCAxKSA9PSAnYScpCmFzc2VydChkZWJ1Zy5nZXRsb2NhbChjbywgZm9vLCAyKSA9PSAnYicpCmFzc2VydChub3QgZGVidWcuZ2V0bG9jYWwoY28sIGZvbywgMykpCgphc3NlcnQobm90IGRlYnVnLmdldGxvY2FsKHByaW50LCAxKSkKCgpsb2NhbCBmdW5jdGlvbiBmb28gKCkgcmV0dXJuIChkZWJ1Zy5nZXRsb2NhbCgxLCAtMSkpIGVuZAphc3NlcnQobm90IGZvbygxMCkpCgoKLS0gdmFyYXJncwpsb2NhbCBmdW5jdGlvbiBmb28gKGEsIC4uLikKICBsb2NhbCB0ID0gdGFibGUucGFjayguLi4pCiAgZm9yIGkgPSAxLCB0Lm4gZG8KICAgIGxvY2FsIG4sIHYgPSBkZWJ1Zy5nZXRsb2NhbCgxLCAtaSkKICAgIGFzc2VydChuID09ICIodmFyYXJnKSIgYW5kIHYgPT0gdFtpXSkKICBlbmQKICBhc3NlcnQobm90IGRlYnVnLmdldGxvY2FsKDEsIC0odC5uICsgMSkpKQogIGFzc2VydChub3QgZGVidWcuc2V0bG9jYWwoMSwgLSh0Lm4gKyAxKSwgMzApKQogIGlmIHQubiA+IDAgdGhlbgogICAgKGZ1bmN0aW9uICh4KQogICAgICBhc3NlcnQoZGVidWcuc2V0bG9jYWwoMiwgLTEsIHgpID09ICIodmFyYXJnKSIpCiAgICAgIGFzc2VydChkZWJ1Zy5zZXRsb2NhbCgyLCAtdC5uLCB4KSA9PSAiKHZhcmFyZykiKQogICAgIGVuZCkoNDMwKQogICAgIGFzc2VydCguLi4gPT0gNDMwKQogIGVuZAplbmQKCmZvbygpCmZvbyhwcmludCkKZm9vKDIwMCwgMywgNCkKbG9jYWwgYSA9IHt9CmZvciBpID0gMSwgKF9zb2Z0IGFuZCAxMDAgb3IgMTAwMCkgZG8gYVtpXSA9IGkgZW5kCmZvbyh0YWJsZS51bnBhY2soYSkpCmEgPSBuaWwKCgoKZG8gICAtLSB0ZXN0IGhvb2sgcHJlc2VuY2UgaW4gZGVidWcgaW5mbwogIGFzc2VydChub3QgZGVidWcuZ2V0aG9vaygpKQogIGxvY2FsIGNvdW50ID0gMAogIGxvY2FsIGZ1bmN0aW9uIGYgKCkKICAgIGFzc2VydChkZWJ1Zy5nZXRpbmZvKDEpLm5hbWV3aGF0ID09ICJob29rIikKICAgIGxvY2FsIHNuZGxpbmUgPSBzdHJpbmcubWF0Y2goZGVidWcudHJhY2ViYWNrKCksICJcbiguLSlcbiIpCiAgICBhc3NlcnQoc3RyaW5nLmZpbmQoc25kbGluZSwgImhvb2siKSkKICAgIGNvdW50ID0gY291bnQgKyAxCiAgZW5kCiAgZGVidWcuc2V0aG9vayhmLCAibCIpCiAgbG9jYWwgYSA9IDAKICBfRU5WLmEgPSBhCiAgYSA9IDEKICBkZWJ1Zy5zZXRob29rKCkKICBhc3NlcnQoY291bnQgPT0gNCkKZW5kCgoKLS0gaG9vayB0YWJsZSBoYXMgd2VhayBrZXlzCmFzc2VydChnZXRtZXRhdGFibGUoZGVidWcuZ2V0cmVnaXN0cnkoKS5fSE9PS0tFWSkuX19tb2RlID09ICdrJykKCgphID0ge307IEwgPSBuaWwKbG9jYWwgZ2xvYiA9IDEKbG9jYWwgb2xkZ2xvYiA9IGdsb2IKZGVidWcuc2V0aG9vayhmdW5jdGlvbiAoZSxsKQogIGNvbGxlY3RnYXJiYWdlKCkgICAtLSBmb3JjZSBHQyBkdXJpbmcgYSBob29rCiAgbG9jYWwgZiwgbSwgYyA9IGRlYnVnLmdldGhvb2soKQogIGFzc2VydChtID09ICdjcmwnIGFuZCBjID09IDApCiAgaWYgZSA9PSAibGluZSIgdGhlbgogICAgaWYgZ2xvYiB+PSBvbGRnbG9iIHRoZW4KICAgICAgTCA9IGwtMSAgIC0tIGdldCB0aGUgZmlyc3QgbGluZSB3aGVyZSAiZ2xvYiIgaGFzIGNoYW5nZWQKICAgICAgb2xkZ2xvYiA9IGdsb2IKICAgIGVuZAogIGVsc2VpZiBlID09ICJjYWxsIiB0aGVuCiAgICAgIGxvY2FsIGYgPSBkZWJ1Zy5nZXRpbmZvKDIsICJmIikuZnVuYwogICAgICBhW2ZdID0gMQogIGVsc2UgYXNzZXJ0KGUgPT0gInJldHVybiIpCiAgZW5kCmVuZCwgImNybCIpCgoKZnVuY3Rpb24gZihhLGIpCiAgY29sbGVjdGdhcmJhZ2UoKQogIGxvY2FsIF8sIHggPSBkZWJ1Zy5nZXRsb2NhbCgxLCAxKQogIGxvY2FsIF8sIHkgPSBkZWJ1Zy5nZXRsb2NhbCgxLCAyKQogIGFzc2VydCh4ID09IGEgYW5kIHkgPT0gYikKICBhc3NlcnQoZGVidWcuc2V0bG9jYWwoMiwgMywgInBlcmEiKSA9PSAiQUEiLi4iQUEiKQogIGFzc2VydChkZWJ1Zy5zZXRsb2NhbCgyLCA0LCAibWHn4yIpID09ICJCIikKICB4ID0gZGVidWcuZ2V0aW5mbygyKQogIGFzc2VydCh4LmZ1bmMgPT0gZyBhbmQgeC53aGF0ID09ICJMdWEiIGFuZCB4Lm5hbWUgPT0gJ2cnIGFuZAogICAgICAgICB4Lm51cHMgPT0gMiBhbmQgc3RyaW5nLmZpbmQoeC5zb3VyY2UsICJeQC4qZGIlLmx1YSQiKSkKICBnbG9iID0gZ2xvYisxCiAgYXNzZXJ0KGRlYnVnLmdldGluZm8oMSwgImwiKS5jdXJyZW50bGluZSA9PSBMKzEpCiAgYXNzZXJ0KGRlYnVnLmdldGluZm8oMSwgImwiKS5jdXJyZW50bGluZSA9PSBMKzIpCmVuZAoKZnVuY3Rpb24gZm9vKCkKICBnbG9iID0gZ2xvYisxCiAgYXNzZXJ0KGRlYnVnLmdldGluZm8oMSwgImwiKS5jdXJyZW50bGluZSA9PSBMKzEpCmVuZDsgZm9vKCkgIC0tIHNldCBMCi0tIGNoZWNrIGxpbmUgY291bnRpbmcgaW5zaWRlIHN0cmluZ3MgYW5kIGVtcHR5IGxpbmVzCgpfID0gJ2Fsb1wKYWxvJyAuLiBbWwoKXV0KLS1bWwpdXQphc3NlcnQoZGVidWcuZ2V0aW5mbygxLCAibCIpLmN1cnJlbnRsaW5lID09IEwrMTEpICAtLSBjaGVjayBjb3VudCBvZiBsaW5lcwoKCmZ1bmN0aW9uIGcgKC4uLikKICBsb2NhbCBhcmcgPSB7Li4ufQogIGRvIGxvY2FsIGEsYixjOyBhPW1hdGguc2luKDQwKTsgZW5kCiAgbG9jYWwgZmVpamFvCiAgbG9jYWwgQUFBQSxCID0gInh1eHUiLCAibWFt428iCiAgZihBQUFBLEIpCiAgYXNzZXJ0KEFBQUEgPT0gInBlcmEiIGFuZCBCID09ICJtYefjIikKICBkbwogICAgIGxvY2FsIEIgPSAxMwogICAgIGxvY2FsIHgseSA9IGRlYnVnLmdldGxvY2FsKDEsNSkKICAgICBhc3NlcnQoeCA9PSAnQicgYW5kIHkgPT0gMTMpCiAgZW5kCmVuZAoKZygpCgoKYXNzZXJ0KGFbZl0gYW5kIGFbZ10gYW5kIGFbYXNzZXJ0XSBhbmQgYVtkZWJ1Zy5nZXRsb2NhbF0gYW5kIG5vdCBhW3ByaW50XSkKCgotLSB0ZXN0cyBmb3IgbWFuaXB1bGF0aW5nIG5vbi1yZWdpc3RlcmVkIGxvY2FscyAoQyBhbmQgTHVhIHRlbXBvcmFyaWVzKQoKbG9jYWwgbiwgdiA9IGRlYnVnLmdldGxvY2FsKDAsIDEpCmFzc2VydCh2ID09IDAgYW5kIG4gPT0gIihDIHRlbXBvcmFyeSkiKQpsb2NhbCBuLCB2ID0gZGVidWcuZ2V0bG9jYWwoMCwgMikKYXNzZXJ0KHYgPT0gMiBhbmQgbiA9PSAiKEMgdGVtcG9yYXJ5KSIpCmFzc2VydChub3QgZGVidWcuZ2V0bG9jYWwoMCwgMykpCmFzc2VydChub3QgZGVidWcuZ2V0bG9jYWwoMCwgMCkpCgpmdW5jdGlvbiBmKCkKICBhc3NlcnQoc2VsZWN0KDIsIGRlYnVnLmdldGxvY2FsKDIsMykpID09IDEpCiAgYXNzZXJ0KG5vdCBkZWJ1Zy5nZXRsb2NhbCgyLDQpKQogIGRlYnVnLnNldGxvY2FsKDIsIDMsIDEwKQogIHJldHVybiAyMAplbmQKCmZ1bmN0aW9uIGcoYSxiKSByZXR1cm4gKGErMSkgKyBmKCkgZW5kCgphc3NlcnQoZygwLDApID09IDMwKQogCgpkZWJ1Zy5zZXRob29rKG5pbCk7CmFzc2VydChub3QgZGVidWcuZ2V0aG9vaygpKQoKCi0tIG1pbmltYWwgdGVzdHMgZm9yIHNldHVzZXJ2YWx1ZS9nZXR1c2VydmFsdWUKZG8KICBhc3NlcnQobm90IGRlYnVnLnNldHVzZXJ2YWx1ZShpby5zdGRpbiwgMTApKQogIGxvY2FsIGEsIGIgPSBkZWJ1Zy5nZXR1c2VydmFsdWUoaW8uc3RkaW4sIDEwKQogIGFzc2VydChhID09IG5pbCBhbmQgbm90IGIpCmVuZAoKLS0gdGVzdGluZyBpdGVyYWN0aW9uIGJldHdlZW4gbXVsdGlwbGUgdmFsdWVzIHggaG9va3MKZG8KICBsb2NhbCBmdW5jdGlvbiBmKC4uLikgcmV0dXJuIDMsIC4uLiBlbmQKICBsb2NhbCBjb3VudCA9IDAKICBsb2NhbCBhID0ge30KICBmb3IgaSA9IDEsIDEwMCBkbyBhW2ldID0gaSBlbmQKICBkZWJ1Zy5zZXRob29rKGZ1bmN0aW9uICgpIGNvdW50ID0gY291bnQgKyAxIGVuZCwgIiIsIDEpCiAgbG9jYWwgdCA9IHt0YWJsZS51bnBhY2soYSl9CiAgYXNzZXJ0KCN0ID09IDEwMCkKICB0ID0ge3RhYmxlLnVucGFjayhhLCAxLCAzKX0KICBhc3NlcnQoI3QgPT0gMykKICB0ID0ge2YodGFibGUudW5wYWNrKGEsIDEsIDMwKSl9CiAgYXNzZXJ0KCN0ID09IDMxKQplbmQKCgotLSB0ZXN0aW5nIGFjY2VzcyB0byBmdW5jdGlvbiBhcmd1bWVudHMKCmxvY2FsIGZ1bmN0aW9uIGNvbGxlY3Rsb2NhbHMgKGxldmVsKQogIGxvY2FsIHRhYiA9IHt9CiAgZm9yIGkgPSAxLCBtYXRoLmh1Z2UgZG8KICAgIGxvY2FsIG4sIHYgPSBkZWJ1Zy5nZXRsb2NhbChsZXZlbCArIDEsIGkpCiAgICBpZiBub3QgKG4gYW5kIHN0cmluZy5maW5kKG4sICJeW2EtekEtWjAtOV9dKyQiKSkgdGhlbgogICAgICAgYnJlYWsgICAtLSBjb25zaWRlciBvbmx5IHJlYWwgdmFyaWFibGVzCiAgICBlbmQKICAgIHRhYltuXSA9IHYKICBlbmQKICByZXR1cm4gdGFiCmVuZAoKClggPSBuaWwKYSA9IHt9CmZ1bmN0aW9uIGE6ZiAoYSwgYiwgLi4uKSBsb2NhbCBhcmcgPSB7Li4ufTsgbG9jYWwgYyA9IDEzIGVuZApkZWJ1Zy5zZXRob29rKGZ1bmN0aW9uIChlKQogIGFzc2VydChlID09ICJjYWxsIikKICBkb3N0cmluZygiWFggPSAxMiIpICAtLSB0ZXN0IGRvc3RyaW5nIGluc2lkZSBob29rcwogIC0tIHRlc3RpbmcgZXJyb3JzIGluc2lkZSBob29rcwogIGFzc2VydChub3QgcGNhbGwobG9hZCgiYT0nam9hbycrMSIpKSkKICBkZWJ1Zy5zZXRob29rKGZ1bmN0aW9uIChlLCBsKSAKICAgIGFzc2VydChkZWJ1Zy5nZXRpbmZvKDIsICJsIikuY3VycmVudGxpbmUgPT0gbCkKICAgIGxvY2FsIGYsbSxjID0gZGVidWcuZ2V0aG9vaygpCiAgICBhc3NlcnQoZSA9PSAibGluZSIpCiAgICBhc3NlcnQobSA9PSAnbCcgYW5kIGMgPT0gMCkKICAgIGRlYnVnLnNldGhvb2sobmlsKSAgLS0gaG9vayBpcyBjYWxsZWQgb25seSBvbmNlCiAgICBhc3NlcnQobm90IFgpICAgICAgIC0tIGNoZWNrIHRoYXQKICAgIFggPSBjb2xsZWN0bG9jYWxzKDIpCiAgZW5kLCAibCIpCmVuZCwgImMiKQoKYTpmKDEsMiwzLDQsNSkKYXNzZXJ0KFguc2VsZiA9PSBhIGFuZCBYLmEgPT0gMSAgIGFuZCBYLmIgPT0gMiBhbmQgWC5jID09IG5pbCkKYXNzZXJ0KFhYID09IDEyKQphc3NlcnQobm90IGRlYnVnLmdldGhvb2soKSkKCgotLSB0ZXN0aW5nIGFjY2VzcyB0byBsb2NhbCB2YXJpYWJsZXMgaW4gcmV0dXJuIGhvb2sgKGJ1ZyBpbiA1LjIpCmRvCiAgbG9jYWwgWCA9IGZhbHNlCgogIGxvY2FsIGZ1bmN0aW9uIGZvbyAoYSwgYiwgLi4uKQogICAgZG8gbG9jYWwgeCx5LHogZW5kCiAgICBsb2NhbCBjLCBkID0gMTAsIDIwCiAgICByZXR1cm4KICBlbmQKCiAgbG9jYWwgZnVuY3Rpb24gYXV4ICgpCiAgICBpZiBkZWJ1Zy5nZXRpbmZvKDIpLm5hbWUgPT0gImZvbyIgdGhlbgogICAgICBYID0gdHJ1ZSAgIC0tIHRvIHNpZ25hbCB0aGF0IGl0IGZvdW5kICdmb28nCiAgICAgIGxvY2FsIHRhYiA9IHthID0gMTAwLCBiID0gMjAwLCBjID0gMTAsIGQgPSAyMH0KICAgICAgZm9yIG4sIHYgaW4gcGFpcnMoY29sbGVjdGxvY2FscygyKSkgZG8KICAgICAgICBhc3NlcnQodGFiW25dID09IHYpCiAgICAgICAgdGFiW25dID0gdW5kZWYKICAgICAgZW5kCiAgICAgIGFzc2VydChuZXh0KHRhYikgPT0gbmlsKSAgICAtLSAndGFiJyBtdXN0IGJlIGVtcHR5CiAgICBlbmQKICBlbmQKCiAgZGVidWcuc2V0aG9vayhhdXgsICJyIik7IGZvbygxMDAsIDIwMCk7IGRlYnVnLnNldGhvb2soKQogIGFzc2VydChYKQoKZW5kCgoKbG9jYWwgZnVuY3Rpb24gZXFzZXEgKHQxLCB0MikKICBhc3NlcnQoI3QxID09ICN0MikKICBmb3IgaSA9IDEsICN0MSBkbwogICAgYXNzZXJ0KHQxW2ldID09IHQyW2ldKQogIGVuZAplbmQKCgpkbyAgcHJpbnQoInRlc3RpbmcgaW5zcGVjdGlvbiBvZiBwYXJhbWV0ZXJzL3JldHVybmVkIHZhbHVlcyIpCiAgbG9jYWwgb24gPSBmYWxzZQogIGxvY2FsIGlucCwgb3V0CgogIGxvY2FsIGZ1bmN0aW9uIGhvb2sgKGV2ZW50KQogICAgaWYgbm90IG9uIHRoZW4gcmV0dXJuIGVuZAogICAgbG9jYWwgYXIgPSBkZWJ1Zy5nZXRpbmZvKDIsICJydVMiKQogICAgbG9jYWwgdCA9IHt9CiAgICBmb3IgaSA9IGFyLmZ0cmFuc2ZlciwgYXIuZnRyYW5zZmVyICsgYXIubnRyYW5zZmVyIC0gMSBkbwogICAgICBsb2NhbCBfLCB2ID0gZGVidWcuZ2V0bG9jYWwoMiwgaSkKICAgICAgdFsjdCArIDFdID0gdiAKICAgIGVuZAogICAgaWYgZXZlbnQgPT0gInJldHVybiIgdGhlbgogICAgICBvdXQgPSB0CiAgICBlbHNlCiAgICAgIGlucCA9IHQKICAgIGVuZAogIGVuZAoKICBkZWJ1Zy5zZXRob29rKGhvb2ssICJjciIpCgogIG9uID0gdHJ1ZTsgbWF0aC5zaW4oMyk7IG9uID0gZmFsc2UKICBlcXNlcShpbnAsIHszfSk7IGVxc2VxKG91dCwge21hdGguc2luKDMpfSkKCiAgb24gPSB0cnVlOyBzZWxlY3QoMiwgMTAsIDIwLCAzMCwgNDApOyBvbiA9IGZhbHNlCiAgZXFzZXEoaW5wLCB7MiwgMTAsIDIwLCAzMCwgNDB9KTsgZXFzZXEob3V0LCB7MjAsIDMwLCA0MH0pCgogIGxvY2FsIGZ1bmN0aW9uIGZvbyAoYSwgLi4uKSByZXR1cm4gLi4uIGVuZAogIGxvY2FsIGZ1bmN0aW9uIGZvbzEgKCkgb24gPSBub3Qgb247IHJldHVybiBmb28oMjAsIDEwLCAwKSBlbmQKICBmb28xKCk7IG9uID0gZmFsc2UKICBlcXNlcShpbnAsIHsyMH0pOyBlcXNlcShvdXQsIHsxMCwgMH0pCgogIGRlYnVnLnNldGhvb2soKQplbmQKCgoKLS0gdGVzdGluZyB1cHZhbHVlIGFjY2Vzcwpsb2NhbCBmdW5jdGlvbiBnZXR1cHZhbHVlcyAoZikKICBsb2NhbCB0ID0ge30KICBsb2NhbCBpID0gMQogIHdoaWxlIHRydWUgZG8KICAgIGxvY2FsIG5hbWUsIHZhbHVlID0gZGVidWcuZ2V0dXB2YWx1ZShmLCBpKQogICAgaWYgbm90IG5hbWUgdGhlbiBicmVhayBlbmQKICAgIGFzc2VydChub3QgdFtuYW1lXSkKICAgIHRbbmFtZV0gPSB2YWx1ZQogICAgaSA9IGkgKyAxCiAgZW5kCiAgcmV0dXJuIHQKZW5kCgpsb2NhbCBhLGIsYyA9IDEsMiwzCmxvY2FsIGZ1bmN0aW9uIGZvbzEgKGEpIGIgPSBhOyByZXR1cm4gYyBlbmQKbG9jYWwgZnVuY3Rpb24gZm9vMiAoeCkgYSA9IHg7IHJldHVybiBjK2IgZW5kCmFzc2VydChub3QgZGVidWcuZ2V0dXB2YWx1ZShmb28xLCAzKSkKYXNzZXJ0KG5vdCBkZWJ1Zy5nZXR1cHZhbHVlKGZvbzEsIDApKQphc3NlcnQobm90IGRlYnVnLnNldHVwdmFsdWUoZm9vMSwgMywgInh1eHUiKSkKbG9jYWwgdCA9IGdldHVwdmFsdWVzKGZvbzEpCmFzc2VydCh0LmEgPT0gbmlsIGFuZCB0LmIgPT0gMiBhbmQgdC5jID09IDMpCnQgPSBnZXR1cHZhbHVlcyhmb28yKQphc3NlcnQodC5hID09IDEgYW5kIHQuYiA9PSAyIGFuZCB0LmMgPT0gMykKYXNzZXJ0KGRlYnVnLnNldHVwdmFsdWUoZm9vMSwgMSwgInh1eHUiKSA9PSAiYiIpCmFzc2VydCgoe2RlYnVnLmdldHVwdmFsdWUoZm9vMiwgMyl9KVsyXSA9PSAieHV4dSIpCi0tIHVwdmFsdWVzIG9mIEMgZnVuY3Rpb25zIGFyZSBhbGx3YXlzICJjYWxsZWQiICIiICh0aGUgZW1wdHkgc3RyaW5nKQphc3NlcnQoZGVidWcuZ2V0dXB2YWx1ZShzdHJpbmcuZ21hdGNoKCJ4IiwgIngiKSwgMSkgPT0gIiIpICAKCgotLSB0ZXN0aW5nIGNvdW50IGhvb2tzCmxvY2FsIGE9MApkZWJ1Zy5zZXRob29rKGZ1bmN0aW9uIChlKSBhPWErMSBlbmQsICIiLCAxKQphPTA7IGZvciBpPTEsMTAwMCBkbyBlbmQ7IGFzc2VydCgxMDAwIDwgYSBhbmQgYSA8IDEwMTIpCmRlYnVnLnNldGhvb2soZnVuY3Rpb24gKGUpIGE9YSsxIGVuZCwgIiIsIDQpCmE9MDsgZm9yIGk9MSwxMDAwIGRvIGVuZDsgYXNzZXJ0KDI1MCA8IGEgYW5kIGEgPCAyNTUpCmxvY2FsIGYsbSxjID0gZGVidWcuZ2V0aG9vaygpCmFzc2VydChtID09ICIiIGFuZCBjID09IDQpCmRlYnVnLnNldGhvb2soZnVuY3Rpb24gKGUpIGE9YSsxIGVuZCwgIiIsIDQwMDApCmE9MDsgZm9yIGk9MSwxMDAwIGRvIGVuZDsgYXNzZXJ0KGEgPT0gMCkKCmRvCiAgZGVidWcuc2V0aG9vayhwcmludCwgIiIsIDJeMjQgLSAxKSAgIC0tIGNvdW50IHVwcGVyYm91bmQKICBsb2NhbCBmLG0sYyA9IGRlYnVnLmdldGhvb2soKQogIGFzc2VydCgoe2RlYnVnLmdldGhvb2soKX0pWzNdID09IDJeMjQgLSAxKQplbmQKCmRlYnVnLnNldGhvb2soKQoKCi0tIHRlc3RzIGZvciB0YWlsIGNhbGxzCmxvY2FsIGZ1bmN0aW9uIGYgKHgpCiAgaWYgeCB0aGVuCiAgICBhc3NlcnQoZGVidWcuZ2V0aW5mbygxLCAiUyIpLndoYXQgPT0gIkx1YSIpCiAgICBhc3NlcnQoZGVidWcuZ2V0aW5mbygxLCAidCIpLmlzdGFpbGNhbGwgPT0gdHJ1ZSkKICAgIGxvY2FsIHRhaWwgPSBkZWJ1Zy5nZXRpbmZvKDIpCiAgICBhc3NlcnQodGFpbC5mdW5jID09IGcxIGFuZCB0YWlsLmlzdGFpbGNhbGwgPT0gdHJ1ZSkKICAgIGFzc2VydChkZWJ1Zy5nZXRpbmZvKDMsICJTIikud2hhdCA9PSAibWFpbiIpCiAgICBwcmludCIrIgogICAgZW5kCmVuZAoKZnVuY3Rpb24gZyh4KSByZXR1cm4gZih4KSBlbmQKCmZ1bmN0aW9uIGcxKHgpIGcoeCkgZW5kCgpsb2NhbCBmdW5jdGlvbiBoICh4KSBsb2NhbCBmPWcxOyByZXR1cm4gZih4KSBlbmQKCmgodHJ1ZSkKCmxvY2FsIGIgPSB7fQpkZWJ1Zy5zZXRob29rKGZ1bmN0aW9uIChlKSB0YWJsZS5pbnNlcnQoYiwgZSkgZW5kLCAiY3IiKQpoKGZhbHNlKQpkZWJ1Zy5zZXRob29rKCkKbG9jYWwgcmVzID0geyJyZXR1cm4iLCAgIC0tIGZpcnN0IHJldHVybiAoZnJvbSBzZXRob29rKQogICJjYWxsIiwgInRhaWwgY2FsbCIsICJjYWxsIiwgInRhaWwgY2FsbCIsCiAgInJldHVybiIsICJyZXR1cm4iLAogICJjYWxsIiwgICAgLS0gbGFzdCBjYWxsICh0byBzZXRob29rKQp9CmZvciBpID0gMSwgI3JlcyBkbyBhc3NlcnQocmVzW2ldID09IHRhYmxlLnJlbW92ZShiLCAxKSkgZW5kCgpiID0gMApkZWJ1Zy5zZXRob29rKGZ1bmN0aW9uIChlKQogICAgICAgICAgICAgICAgaWYgZSA9PSAidGFpbCBjYWxsIiB0aGVuCiAgICAgICAgICAgICAgICAgIGIgPSBiICsgMQogICAgICAgICAgICAgICAgICBhc3NlcnQoZGVidWcuZ2V0aW5mbygyLCAidCIpLmlzdGFpbGNhbGwgPT0gdHJ1ZSkKICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgYXNzZXJ0KGRlYnVnLmdldGluZm8oMiwgInQiKS5pc3RhaWxjYWxsID09IGZhbHNlKQogICAgICAgICAgICAgICAgZW5kCiAgICAgICAgICAgICAgZW5kLCAiYyIpCmgoZmFsc2UpCmRlYnVnLnNldGhvb2soKQphc3NlcnQoYiA9PSAyKSAgIC0tIHR3byB0YWlsIGNhbGxzCgpsaW0gPSBfc29mdCBhbmQgMzAwMCBvciAzMDAwMApsb2NhbCBmdW5jdGlvbiBmb28gKHgpCiAgaWYgeD09MCB0aGVuCiAgICBhc3NlcnQoZGVidWcuZ2V0aW5mbygyKS53aGF0ID09ICJtYWluIikKICAgIGxvY2FsIGluZm8gPSBkZWJ1Zy5nZXRpbmZvKDEpCiAgICBhc3NlcnQoaW5mby5pc3RhaWxjYWxsID09IHRydWUgYW5kIGluZm8uZnVuYyA9PSBmb28pCiAgZWxzZSByZXR1cm4gZm9vKHgtMSkKICBlbmQKZW5kCgpmb28obGltKQoKCnByaW50IisiCgoKLS0gdGVzdGluZyBsb2NhbCBmdW5jdGlvbiBpbmZvcm1hdGlvbgpjbyA9IGxvYWRbWwogIGxvY2FsIEEgPSBmdW5jdGlvbiAoKQogICAgcmV0dXJuIHgKICBlbmQKICByZXR1cm4KXV0KCmxvY2FsIGEgPSAwCi0tICdBJyBzaG91bGQgYmUgdmlzaWJsZSB0byBkZWJ1Z2dlciBvbmx5IGFmdGVyIGl0cyBjb21wbGV0ZSBkZWZpbml0aW9uCmRlYnVnLnNldGhvb2soZnVuY3Rpb24gKGUsIGwpCiAgaWYgbCA9PSAzIHRoZW4gYSA9IGEgKyAxOyBhc3NlcnQoZGVidWcuZ2V0bG9jYWwoMiwgMSkgPT0gIih0ZW1wb3JhcnkpIikKICBlbHNlaWYgbCA9PSA0IHRoZW4gYSA9IGEgKyAxOyBhc3NlcnQoZGVidWcuZ2V0bG9jYWwoMiwgMSkgPT0gIkEiKQogIGVuZAplbmQsICJsIikKY28oKSAgLS0gcnVuIGxvY2FsIGZ1bmN0aW9uIGRlZmluaXRpb24KZGVidWcuc2V0aG9vaygpICAtLSB0dXJuIG9mZiBob29rCmFzc2VydChhID09IDIpICAgLS0gZW5zdXJlIGFsbCB0d28gbGluZXMgd2hlcmUgaG9va2VkCgotLSB0ZXN0aW5nIHRyYWNlYmFjawoKYXNzZXJ0KGRlYnVnLnRyYWNlYmFjayhwcmludCkgPT0gcHJpbnQpCmFzc2VydChkZWJ1Zy50cmFjZWJhY2socHJpbnQsIDQpID09IHByaW50KQphc3NlcnQoc3RyaW5nLmZpbmQoZGVidWcudHJhY2ViYWNrKCJoaSIsIDQpLCAiXmhpXG4iKSkKYXNzZXJ0KHN0cmluZy5maW5kKGRlYnVnLnRyYWNlYmFjaygiaGkiKSwgIl5oaVxuIikpCmFzc2VydChub3Qgc3RyaW5nLmZpbmQoZGVidWcudHJhY2ViYWNrKCJoaSIpLCAiJ2RlYnVnLnRyYWNlYmFjayciKSkKYXNzZXJ0KHN0cmluZy5maW5kKGRlYnVnLnRyYWNlYmFjaygiaGkiLCAwKSwgIidkZWJ1Zy50cmFjZWJhY2snIikpCmFzc2VydChzdHJpbmcuZmluZChkZWJ1Zy50cmFjZWJhY2soKSwgIl5zdGFjayB0cmFjZWJhY2s6XG4iKSkKCmRvICAtLSBDLWZ1bmN0aW9uIG5hbWVzIGluIHRyYWNlYmFjawogIGxvY2FsIHN0LCBtc2cgPSAoZnVuY3Rpb24gKCkgcmV0dXJuIHBjYWxsIGVuZCkoKShkZWJ1Zy50cmFjZWJhY2spCiAgYXNzZXJ0KHN0ID09IHRydWUgYW5kIHN0cmluZy5maW5kKG1zZywgInBjYWxsIikpCmVuZAoKCi0tIHRlc3RpbmcgbnBhcmFtcywgbnVwcyBlIGlzdmFyYXJnCmxvY2FsIHQgPSBkZWJ1Zy5nZXRpbmZvKHByaW50LCAidSIpCmFzc2VydCh0LmlzdmFyYXJnID09IHRydWUgYW5kIHQubnBhcmFtcyA9PSAwIGFuZCB0Lm51cHMgPT0gMCkKCnQgPSBkZWJ1Zy5nZXRpbmZvKGZ1bmN0aW9uIChhLGIsYykgZW5kLCAidSIpCmFzc2VydCh0LmlzdmFyYXJnID09IGZhbHNlIGFuZCB0Lm5wYXJhbXMgPT0gMyBhbmQgdC5udXBzID09IDApCgp0ID0gZGVidWcuZ2V0aW5mbyhmdW5jdGlvbiAoYSxiLC4uLikgcmV0dXJuIHRbYV0gZW5kLCAidSIpCmFzc2VydCh0LmlzdmFyYXJnID09IHRydWUgYW5kIHQubnBhcmFtcyA9PSAyIGFuZCB0Lm51cHMgPT0gMSkKCnQgPSBkZWJ1Zy5nZXRpbmZvKDEpICAgLS0gbWFpbgphc3NlcnQodC5pc3ZhcmFyZyA9PSB0cnVlIGFuZCB0Lm5wYXJhbXMgPT0gMCBhbmQgdC5udXBzID09IDEgYW5kCiAgICAgICBkZWJ1Zy5nZXR1cHZhbHVlKHQuZnVuYywgMSkgPT0gIl9FTlYiKQoKdCA9IGRlYnVnLmdldGluZm8obWF0aC5zaW4pICAgLS0gQyBmdW5jdGlvbgphc3NlcnQodC5pc3ZhcmFyZyA9PSB0cnVlIGFuZCB0Lm5wYXJhbXMgPT0gMCBhbmQgdC5udXBzID09IDApCgp0ID0gZGVidWcuZ2V0aW5mbyhzdHJpbmcuZ21hdGNoKCJhYmMiLCAiYSIpKSAgIC0tIEMgY2xvc3VyZQphc3NlcnQodC5pc3ZhcmFyZyA9PSB0cnVlIGFuZCB0Lm5wYXJhbXMgPT0gMCBhbmQgdC5udXBzID4gMCkKCgoKLS0gdGVzdGluZyBkZWJ1Z2dpbmcgb2YgY29yb3V0aW5lcwoKbG9jYWwgZnVuY3Rpb24gY2hlY2t0cmFjZWJhY2sgKGNvLCBwLCBsZXZlbCkKICBsb2NhbCB0YiA9IGRlYnVnLnRyYWNlYmFjayhjbywgbmlsLCBsZXZlbCkKICBsb2NhbCBpID0gMAogIGZvciBsIGluIHN0cmluZy5nbWF0Y2godGIsICJbXlxuXStcbj8iKSBkbwogICAgYXNzZXJ0KGkgPT0gMCBvciBzdHJpbmcuZmluZChsLCBwW2ldKSkKICAgIGkgPSBpKzEKICBlbmQKICBhc3NlcnQocFtpXSA9PSB1bmRlZikKZW5kCgoKbG9jYWwgZnVuY3Rpb24gZiAobikKICBpZiBuID4gMCB0aGVuIGYobi0xKQogIGVsc2UgY29yb3V0aW5lLnlpZWxkKCkgZW5kCmVuZAoKbG9jYWwgY28gPSBjb3JvdXRpbmUuY3JlYXRlKGYpCmNvcm91dGluZS5yZXN1bWUoY28sIDMpCmNoZWNrdHJhY2ViYWNrKGNvLCB7InlpZWxkIiwgImRiLmx1YSIsICJkYi5sdWEiLCAiZGIubHVhIiwgImRiLmx1YSJ9KQpjaGVja3RyYWNlYmFjayhjbywgeyJkYi5sdWEiLCAiZGIubHVhIiwgImRiLmx1YSIsICJkYi5sdWEifSwgMSkKY2hlY2t0cmFjZWJhY2soY28sIHsiZGIubHVhIiwgImRiLmx1YSIsICJkYi5sdWEifSwgMikKY2hlY2t0cmFjZWJhY2soY28sIHsiZGIubHVhIn0sIDQpCmNoZWNrdHJhY2ViYWNrKGNvLCB7fSwgNDApCgoKY28gPSBjb3JvdXRpbmUuY3JlYXRlKGZ1bmN0aW9uICh4KQogICAgICAgbG9jYWwgYSA9IDEKICAgICAgIGNvcm91dGluZS55aWVsZChkZWJ1Zy5nZXRpbmZvKDEsICJsIikpCiAgICAgICBjb3JvdXRpbmUueWllbGQoZGVidWcuZ2V0aW5mbygxLCAibCIpLmN1cnJlbnRsaW5lKQogICAgICAgcmV0dXJuIGEKICAgICBlbmQpCgpsb2NhbCB0ciA9IHt9CmxvY2FsIGZvbyA9IGZ1bmN0aW9uIChlLCBsKSBpZiBsIHRoZW4gdGFibGUuaW5zZXJ0KHRyLCBsKSBlbmQgZW5kCmRlYnVnLnNldGhvb2soY28sIGZvbywgImxjciIpCgpsb2NhbCBfLCBsID0gY29yb3V0aW5lLnJlc3VtZShjbywgMTApCmxvY2FsIHggPSBkZWJ1Zy5nZXRpbmZvKGNvLCAxLCAibGZMUyIpCmFzc2VydCh4LmN1cnJlbnRsaW5lID09IGwuY3VycmVudGxpbmUgYW5kIHguYWN0aXZlbGluZXNbeC5jdXJyZW50bGluZV0pCmFzc2VydCh0eXBlKHguZnVuYykgPT0gImZ1bmN0aW9uIikKZm9yIGk9eC5saW5lZGVmaW5lZCArIDEsIHgubGFzdGxpbmVkZWZpbmVkIGRvCiAgYXNzZXJ0KHguYWN0aXZlbGluZXNbaV0pCiAgeC5hY3RpdmVsaW5lc1tpXSA9IHVuZGVmCmVuZAphc3NlcnQobmV4dCh4LmFjdGl2ZWxpbmVzKSA9PSBuaWwpICAgLS0gbm8gJ2V4dHJhJyBlbGVtZW50cwphc3NlcnQobm90IGRlYnVnLmdldGluZm8oY28sIDIpKQpsb2NhbCBhLGIgPSBkZWJ1Zy5nZXRsb2NhbChjbywgMSwgMSkKYXNzZXJ0KGEgPT0gIngiIGFuZCBiID09IDEwKQphLGIgPSBkZWJ1Zy5nZXRsb2NhbChjbywgMSwgMikKYXNzZXJ0KGEgPT0gImEiIGFuZCBiID09IDEpCmRlYnVnLnNldGxvY2FsKGNvLCAxLCAyLCAiaGkiKQphc3NlcnQoZGVidWcuZ2V0aG9vayhjbykgPT0gZm9vKQphc3NlcnQoI3RyID09IDIgYW5kCiAgICAgICB0clsxXSA9PSBsLmN1cnJlbnRsaW5lLTEgYW5kIHRyWzJdID09IGwuY3VycmVudGxpbmUpCgphLGIsYyA9IHBjYWxsKGNvcm91dGluZS5yZXN1bWUsIGNvKQphc3NlcnQoYSBhbmQgYiBhbmQgYyA9PSBsLmN1cnJlbnRsaW5lKzEpCmNoZWNrdHJhY2ViYWNrKGNvLCB7InlpZWxkIiwgImluIGZ1bmN0aW9uIDwifSkKCmEsYiA9IGNvcm91dGluZS5yZXN1bWUoY28pCmFzc2VydChhIGFuZCBiID09ICJoaSIpCmFzc2VydCgjdHIgPT0gNCBhbmQgdHJbNF0gPT0gbC5jdXJyZW50bGluZSsyKQphc3NlcnQoZGVidWcuZ2V0aG9vayhjbykgPT0gZm9vKQphc3NlcnQobm90IGRlYnVnLmdldGhvb2soKSkKY2hlY2t0cmFjZWJhY2soY28sIHt9KQoKCi0tIGNoZWNrIGdldC9zZXRsb2NhbCBpbiBjb3JvdXRpbmVzCmNvID0gY29yb3V0aW5lLmNyZWF0ZShmdW5jdGlvbiAoeCkKICBsb2NhbCBhLCBiID0gY29yb3V0aW5lLnlpZWxkKHgpCiAgYXNzZXJ0KGEgPT0gMTAwIGFuZCBiID09IG5pbCkKICByZXR1cm4geAplbmQpCmEsIGIgPSBjb3JvdXRpbmUucmVzdW1lKGNvLCAxMCkKYXNzZXJ0KGEgYW5kIGIgPT0gMTApCmEsIGIgPSBkZWJ1Zy5nZXRsb2NhbChjbywgMSwgMSkKYXNzZXJ0KGEgPT0gIngiIGFuZCBiID09IDEwKQphc3NlcnQobm90IGRlYnVnLmdldGxvY2FsKGNvLCAxLCA1KSkKYXNzZXJ0KGRlYnVnLnNldGxvY2FsKGNvLCAxLCAxLCAzMCkgPT0gIngiKQphc3NlcnQobm90IGRlYnVnLnNldGxvY2FsKGNvLCAxLCA1LCA0MCkpCmEsIGIgPSBjb3JvdXRpbmUucmVzdW1lKGNvLCAxMDApCmFzc2VydChhIGFuZCBiID09IDMwKQoKCi0tIGNoZWNrIHRyYWNlYmFjayBvZiBzdXNwZW5kZWQgKG9yIGRlYWQgd2l0aCBlcnJvcikgY29yb3V0aW5lcwoKZnVuY3Rpb24gZihpKQogIGlmIGkgPT0gMCB0aGVuIGVycm9yKGkpCiAgZWxzZSBjb3JvdXRpbmUueWllbGQoKTsgZihpLTEpCiAgZW5kCmVuZAoKCmNvID0gY29yb3V0aW5lLmNyZWF0ZShmdW5jdGlvbiAoeCkgZih4KSBlbmQpCmEsIGIgPSBjb3JvdXRpbmUucmVzdW1lKGNvLCAzKQp0ID0geyInY29yb3V0aW5lLnlpZWxkJyIsICInZiciLCAiaW4gZnVuY3Rpb24gPCJ9CndoaWxlIGNvcm91dGluZS5zdGF0dXMoY28pID09ICJzdXNwZW5kZWQiIGRvCiAgY2hlY2t0cmFjZWJhY2soY28sIHQpCiAgYSwgYiA9IGNvcm91dGluZS5yZXN1bWUoY28pCiAgdGFibGUuaW5zZXJ0KHQsIDIsICInZiciKSAgIC0tIG9uZSBtb3JlIHJlY3Vyc2l2ZSBjYWxsIHRvICdmJwplbmQKdFsxXSA9ICInZXJyb3InIgpjaGVja3RyYWNlYmFjayhjbywgdCkKCgotLSB0ZXN0IGFjZXNzaW5nIGxpbmUgbnVtYmVycyBvZiBhIGNvcm91dGluZSBmcm9tIGEgcmVzdW1lIGluc2lkZQotLSBhIEMgZnVuY3Rpb24gKHRoaXMgaXMgYSBrbm93biBidWcgaW4gTHVhIDUuMCkKCmxvY2FsIGZ1bmN0aW9uIGcoeCkKICAgIGNvcm91dGluZS55aWVsZCh4KQplbmQKCmxvY2FsIGZ1bmN0aW9uIGYgKGkpCiAgZGVidWcuc2V0aG9vayhmdW5jdGlvbiAoKSBlbmQsICJsIikKICBmb3Igaj0xLDEwMDAgZG8KICAgIGcoaStqKQogIGVuZAplbmQKCmxvY2FsIGNvID0gY29yb3V0aW5lLndyYXAoZikKY28oMTApCnBjYWxsKGNvKQpwY2FsbChjbykKCgphc3NlcnQodHlwZShkZWJ1Zy5nZXRyZWdpc3RyeSgpKSA9PSAidGFibGUiKQoKCi0tIHRlc3QgdGFnbWV0aG9kIGluZm9ybWF0aW9uCmxvY2FsIGEgPSB7fQpsb2NhbCBmdW5jdGlvbiBmICh0KQogIGxvY2FsIGluZm8gPSBkZWJ1Zy5nZXRpbmZvKDEpOwogIGFzc2VydChpbmZvLm5hbWV3aGF0ID09ICJtZXRhbWV0aG9kIikKICBhLm9wID0gaW5mby5uYW1lCiAgcmV0dXJuIGluZm8ubmFtZQplbmQKc2V0bWV0YXRhYmxlKGEsIHsKICBfX2luZGV4ID0gZjsgX19hZGQgPSBmOyBfX2RpdiA9IGY7IF9fbW9kID0gZjsgX19jb25jYXQgPSBmOyBfX3BvdyA9IGY7CiAgX19tdWwgPSBmOyBfX2lkaXYgPSBmOyBfX3VubSA9IGY7IF9fbGVuID0gZjsgX19zdWIgPSBmOwogIF9fc2hsID0gZjsgX19zaHIgPSBmOyBfX2JvciA9IGY7IF9fYnhvciA9IGY7CiAgX19lcSA9IGY7IF9fbGUgPSBmOyBfX2x0ID0gZjsgX191bm0gPSBmOyBfX2xlbiA9IGY7IF9fYmFuZCA9IGY7CiAgX19ibm90ID0gZjsKfSkKCmxvY2FsIGIgPSBzZXRtZXRhdGFibGUoe30sIGdldG1ldGF0YWJsZShhKSkKCmFzc2VydChhWzNdID09ICJpbmRleCIgYW5kIGFeMyA9PSAicG93IiBhbmQgYS4uYSA9PSAiY29uY2F0IikKYXNzZXJ0KGEvMyA9PSAiZGl2IiBhbmQgMyVhID09ICJtb2QiKQphc3NlcnQoYSszID09ICJhZGQiIGFuZCAzLWEgPT0gInN1YiIgYW5kIGEqMyA9PSAibXVsIiBhbmQKICAgICAgIC1hID09ICJ1bm0iIGFuZCAjYSA9PSAibGVuIiBhbmQgYSYzID09ICJiYW5kIikKYXNzZXJ0KGEgKyAzMDAwMCA9PSAiYWRkIiBhbmQgYSAtIDMuMCA9PSAic3ViIiBhbmQgYSAqIDMuMCA9PSAibXVsIiBhbmQKICAgICAgIC1hID09ICJ1bm0iIGFuZCAjYSA9PSAibGVuIiBhbmQgYSAmIDMgPT0gImJhbmQiKQphc3NlcnQoYXwzID09ICJib3IiIGFuZCAzfmEgPT0gImJ4b3IiIGFuZCBhPDwzID09ICJzaGwiIGFuZCBhPj4xID09ICJzaHIiKQphc3NlcnQgKGE9PWIgYW5kIGEub3AgPT0gImVxIikKYXNzZXJ0IChhPj1iIGFuZCBhLm9wID09ICJsZSIpCmFzc2VydCAoIngiPj1hIGFuZCBhLm9wID09ICJsZSIpCmFzc2VydCAoYT5iIGFuZCBhLm9wID09ICJsdCIpCmFzc2VydCAoYT4xMCBhbmQgYS5vcCA9PSAibHQiKQphc3NlcnQofmEgPT0gImJub3QiKQoKZG8gICAtLSB0ZXN0aW5nIGZvci1pdGVyYXRvciBuYW1lCiAgbG9jYWwgZnVuY3Rpb24gZigpCiAgICBhc3NlcnQoZGVidWcuZ2V0aW5mbygxKS5uYW1lID09ICJmb3IgaXRlcmF0b3IiKQogIGVuZAoKICBmb3IgaSBpbiBmIGRvIGVuZAplbmQKCgpkbyAgIC0tIHRlc3RpbmcgZGVidWcgaW5mbyBmb3IgZmluYWxpemVycwogIGxvY2FsIG5hbWUgPSBuaWwKCiAgLS0gY3JlYXRlIGEgcGllY2Ugb2YgZ2FyYmFnZSB3aXRoIGEgZmluYWxpemVyCiAgc2V0bWV0YXRhYmxlKHt9LCB7X19nYyA9IGZ1bmN0aW9uICgpCiAgICBsb2NhbCB0ID0gZGVidWcuZ2V0aW5mbygyKSAgIC0tIGdldCBjYWxsZWUgaW5mb3JtYXRpb24KICAgIGFzc2VydCh0Lm5hbWV3aGF0ID09ICJtZXRhbWV0aG9kIikKICAgIG5hbWUgPSB0Lm5hbWUKICBlbmR9KQoKICAtLSByZXBlYXQgdW50aWwgcHJldmlvdXMgZmluYWxpemVyIHJ1bnMgKHNldHRpbmcgJ25hbWUnKQogIHJlcGVhdCBsb2NhbCBhID0ge30gdW50aWwgbmFtZQogIGFzc2VydChuYW1lID09ICJfX2djIikKZW5kCgoKZG8KICBwcmludCgidGVzdGluZyB0cmFjZWJhY2sgc2l6ZXMiKQoKICBsb2NhbCBmdW5jdGlvbiBjb3VudGxpbmVzIChzKQogICAgcmV0dXJuIHNlbGVjdCgyLCBzdHJpbmcuZ3N1YihzLCAiXG4iLCAiIikpCiAgZW5kCgogIGxvY2FsIGZ1bmN0aW9uIGRlZXAgKGx2bCwgbikKICAgIGlmIGx2bCA9PSAwIHRoZW4KICAgICAgcmV0dXJuIChkZWJ1Zy50cmFjZWJhY2soIm1lc3NhZ2UiLCBuKSkKICAgIGVsc2UKICAgICAgcmV0dXJuIChkZWVwKGx2bC0xLCBuKSkKICAgIGVuZAogIGVuZAoKICBsb2NhbCBmdW5jdGlvbiBjaGVja2RlZXAgKHRvdGFsLCBzdGFydCkKICAgIGxvY2FsIHMgPSBkZWVwKHRvdGFsLCBzdGFydCkKICAgIGxvY2FsIHJlc3QgPSBzdHJpbmcubWF0Y2gocywgIl5tZXNzYWdlXG5zdGFjayB0cmFjZWJhY2s6XG4oLiopJCIpCiAgICBsb2NhbCBjbCA9IGNvdW50bGluZXMocmVzdCkKICAgIC0tIGF0IG1vc3QgMTAgbGluZXMgaW4gZmlyc3QgcGFydCwgMTEgaW4gc2Vjb25kLCBwbHVzICcuLi4nCiAgICBhc3NlcnQoY2wgPD0gMTAgKyAxMSArIDEpCiAgICBsb2NhbCBicmsgPSBzdHJpbmcuZmluZChyZXN0LCAiJS4lLiUuIikKICAgIGlmIGJyayB0aGVuICAgLS0gZG9lcyBtZXNzYWdlIGhhdmUgJy4uLic/CiAgICAgIGxvY2FsIHJlc3QxID0gc3RyaW5nLnN1YihyZXN0LCAxLCBicmspCiAgICAgIGxvY2FsIHJlc3QyID0gc3RyaW5nLnN1YihyZXN0LCBicmssICNyZXN0KQogICAgICBhc3NlcnQoY291bnRsaW5lcyhyZXN0MSkgPT0gMTAgYW5kIGNvdW50bGluZXMocmVzdDIpID09IDExKQogICAgZWxzZQogICAgICBhc3NlcnQoY2wgPT0gdG90YWwgLSBzdGFydCArIDIpCiAgICBlbmQKICBlbmQKCiAgZm9yIGQgPSAxLCA1MSwgMTAgZG8KICAgIGZvciBsID0gMSwgZCBkbwogICAgICAtLSB1c2UgY29yb3V0aW5lcyB0byBlbnN1cmUgY29tcGxldGUgY29udHJvbCBvZiB0aGUgc3RhY2sKICAgICAgY29yb3V0aW5lLndyYXAoY2hlY2tkZWVwKShkLCBsKQogICAgZW5kCiAgZW5kCgplbmQKCgpwcmludCgidGVzdGluZyBkZWJ1ZyBmdW5jdGlvbnMgb24gY2h1bmsgd2l0aG91dCBkZWJ1ZyBpbmZvIikKcHJvZyA9IFtbLS0gcHJvZ3JhbSB0byBiZSBsb2FkZWQgd2l0aG91dCBkZWJ1ZyBpbmZvcm1hdGlvbiAoc3RyaXApCmxvY2FsIGRlYnVnID0gcmVxdWlyZSdkZWJ1ZycKbG9jYWwgYSA9IDEyICAtLSBhIGxvY2FsIHZhcmlhYmxlCgpsb2NhbCBuLCB2ID0gZGVidWcuZ2V0bG9jYWwoMSwgMSkKYXNzZXJ0KG4gPT0gIih0ZW1wb3JhcnkpIiBhbmQgdiA9PSBkZWJ1ZykgICAtLSB1bmtvd24gbmFtZSBidXQga25vd24gdmFsdWUKbiwgdiA9IGRlYnVnLmdldGxvY2FsKDEsIDIpCmFzc2VydChuID09ICIodGVtcG9yYXJ5KSIgYW5kIHYgPT0gMTIpICAgLS0gdW5rb3duIG5hbWUgYnV0IGtub3duIHZhbHVlCgotLSBhIGZ1bmN0aW9uIHdpdGggYW4gdXB2YWx1ZQpsb2NhbCBmID0gZnVuY3Rpb24gKCkgbG9jYWwgeDsgcmV0dXJuIGEgZW5kCm4sIHYgPSBkZWJ1Zy5nZXR1cHZhbHVlKGYsIDEpCmFzc2VydChuID09ICIobm8gbmFtZSkiIGFuZCB2ID09IDEyKQphc3NlcnQoZGVidWcuc2V0dXB2YWx1ZShmLCAxLCAxMykgPT0gIihubyBuYW1lKSIpCmFzc2VydChhID09IDEzKQoKbG9jYWwgdCA9IGRlYnVnLmdldGluZm8oZikKYXNzZXJ0KHQubmFtZSA9PSBuaWwgYW5kIHQubGluZWRlZmluZWQgPiAwIGFuZAogICAgICAgdC5sYXN0bGluZWRlZmluZWQgPT0gdC5saW5lZGVmaW5lZCBhbmQKICAgICAgIHQuc2hvcnRfc3JjID09ICI/IikKYXNzZXJ0KGRlYnVnLmdldGluZm8oMSkuY3VycmVudGxpbmUgPT0gLTEpCgp0ID0gZGVidWcuZ2V0aW5mbyhmLCAiTCIpLmFjdGl2ZWxpbmVzCmFzc2VydChuZXh0KHQpID09IG5pbCkgICAgLS0gYWN0aXZlIGxpbmVzIGFyZSBlbXB0eQoKLS0gZHVtcC9sb2FkIGEgZnVuY3Rpb24gd2l0aG91dCBkZWJ1ZyBpbmZvCmYgPSBsb2FkKHN0cmluZy5kdW1wKGYpKQoKdCA9IGRlYnVnLmdldGluZm8oZikKYXNzZXJ0KHQubmFtZSA9PSBuaWwgYW5kIHQubGluZWRlZmluZWQgPiAwIGFuZAogICAgICAgdC5sYXN0bGluZWRlZmluZWQgPT0gdC5saW5lZGVmaW5lZCBhbmQKICAgICAgIHQuc2hvcnRfc3JjID09ICI/IikKYXNzZXJ0KGRlYnVnLmdldGluZm8oMSkuY3VycmVudGxpbmUgPT0gLTEpCgpyZXR1cm4gYQpdXQoKCi0tIGxvYWQgJ3Byb2cnIHdpdGhvdXQgZGVidWcgaW5mbwpsb2NhbCBmID0gYXNzZXJ0KGxvYWQoc3RyaW5nLmR1bXAobG9hZChwcm9nKSwgdHJ1ZSkpKQoKYXNzZXJ0KGYoKSA9PSAxMykKCmRvICAgLS0gYnVnIGluIDUuNC4wOiBsaW5lIGhvb2tzIGluIHN0cmlwcGVkIGNvZGUKICBsb2NhbCBmdW5jdGlvbiBmb28gKCkKICAgIGxvY2FsIGEgPSAxCiAgICBsb2NhbCBiID0gMgogICAgcmV0dXJuIGIKICBlbmQKCiAgbG9jYWwgcyA9IGxvYWQoc3RyaW5nLmR1bXAoZm9vLCB0cnVlKSkKICBsb2NhbCBsaW5lID0gdHJ1ZQogIGRlYnVnLnNldGhvb2soZnVuY3Rpb24gKGUsIGwpCiAgICBhc3NlcnQoZSA9PSAibGluZSIpCiAgICBsaW5lID0gbAogIGVuZCwgImwiKQogIGFzc2VydChzKCkgPT0gMik7IGRlYnVnLnNldGhvb2sobmlsKQogIGFzc2VydChsaW5lID09IG5pbCkgIC0tIGhvb2sgY2FsbGVkIHdpdGhvdWcgZGVidWcgaW5mbyBmb3IgMXN0IGluc3RydWN0aW9uCmVuZAoKZG8gICAtLSB0ZXN0cyBmb3IgJ3NvdXJjZScgaW4gYmluYXJ5IGR1bXBzCiAgbG9jYWwgcHJvZyA9IFtbCiAgICByZXR1cm4gZnVuY3Rpb24gKHgpCiAgICAgIHJldHVybiBmdW5jdGlvbiAoeSkgCiAgICAgICAgcmV0dXJuIHggKyB5CiAgICAgIGVuZAogICAgZW5kCiAgXV0KICBsb2NhbCBuYW1lID0gc3RyaW5nLnJlcCgieCIsIDEwMDApCiAgbG9jYWwgcCA9IGFzc2VydChsb2FkKHByb2csIG5hbWUpKQogIC0tIGxvYWQgJ3AnIGFzIGEgYmluYXJ5IGNodW5rIHdpdGggZGVidWcgaW5mb3JtYXRpb24KICBsb2NhbCBjID0gc3RyaW5nLmR1bXAocCkKICBhc3NlcnQoI2MgPiAxMDAwIGFuZCAjYyA8IDIwMDApICAgLS0gbm8gcmVwZXRpdGlvbiBvZiAnc291cmNlJyBpbiBkdW1wCiAgbG9jYWwgZiA9IGFzc2VydChsb2FkKGMpKQogIGxvY2FsIGcgPSBmKCkKICBsb2NhbCBoID0gZygzKQogIGFzc2VydChoKDUpID09IDgpCiAgYXNzZXJ0KGRlYnVnLmdldGluZm8oZikuc291cmNlID09IG5hbWUgYW5kICAgLS0gYWxsIGZ1bmN0aW9ucyBoYXZlICdzb3VyY2UnCiAgICAgICAgIGRlYnVnLmdldGluZm8oZykuc291cmNlID09IG5hbWUgYW5kIAogICAgICAgICBkZWJ1Zy5nZXRpbmZvKGgpLnNvdXJjZSA9PSBuYW1lKQogIC0tIGFnYWluLCB3aXRob3V0IGRlYnVnIGluZm8KICBsb2NhbCBjID0gc3RyaW5nLmR1bXAocCwgdHJ1ZSkKICBhc3NlcnQoI2MgPCA1MDApICAgLS0gbm8gJ3NvdXJjZScgaW4gZHVtcAogIGxvY2FsIGYgPSBhc3NlcnQobG9hZChjKSkKICBsb2NhbCBnID0gZigpCiAgbG9jYWwgaCA9IGcoMzApCiAgYXNzZXJ0KGgoNTApID09IDgwKQogIGFzc2VydChkZWJ1Zy5nZXRpbmZvKGYpLnNvdXJjZSA9PSAnPT8nIGFuZCAgIC0tIG5vIGZ1bmN0aW9uIGhhcyAnc291cmNlJwogICAgICAgICBkZWJ1Zy5nZXRpbmZvKGcpLnNvdXJjZSA9PSAnPT8nIGFuZCAKICAgICAgICAgZGVidWcuZ2V0aW5mbyhoKS5zb3VyY2UgPT0gJz0/JykKZW5kCgpwcmludCJPSyIKCg==