LS0gJElkOiB0ZXN0ZXMvZGIubHVhICQKLS0gU2VlIENvcHlyaWdodCBOb3RpY2UgaW4gZmlsZSBhbGwubHVhCgotLSB0ZXN0aW5nIGRlYnVnIGxpYnJhcnkKCmxvY2FsIGRlYnVnID0gcmVxdWlyZSAiZGVidWciCgpsb2NhbCBmdW5jdGlvbiBkb3N0cmluZyhzKSByZXR1cm4gYXNzZXJ0KGxvYWQocykpKCkgZW5kCgpwcmludCJ0ZXN0aW5nIGRlYnVnIGxpYnJhcnkgYW5kIGRlYnVnIGluZm9ybWF0aW9uIgoKZG8KbG9jYWwgYT0xCmVuZAoKYXNzZXJ0KG5vdCBkZWJ1Zy5nZXRob29rKCkpCgpsb2NhbCB0ZXN0bGluZSA9IDE5ICAgICAgICAgLS0gbGluZSB3aGVyZSAndGVzdCcgaXMgZGVmaW5lZApsb2NhbCBmdW5jdGlvbiB0ZXN0IChzLCBsLCBwKSAgICAgLS0gdGhpcyBtdXN0IGJlIGxpbmUgMTkKICBjb2xsZWN0Z2FyYmFnZSgpICAgLS0gYXZvaWQgZ2MgZHVyaW5nIHRyYWNlCiAgbG9jYWwgZnVuY3Rpb24gZiAoZXZlbnQsIGxpbmUpCiAgICBhc3NlcnQoZXZlbnQgPT0gJ2xpbmUnKQogICAgbG9jYWwgbCA9IHRhYmxlLnJlbW92ZShsLCAxKQogICAgaWYgcCB0aGVuIHByaW50KGwsIGxpbmUpIGVuZAogICAgYXNzZXJ0KGwgPT0gbGluZSwgIndyb25nIHRyYWNlISEiKQogIGVuZAogIGRlYnVnLnNldGhvb2soZiwibCIpOyBsb2FkKHMpKCk7IGRlYnVnLnNldGhvb2soKQogIGFzc2VydCgjbCA9PSAwKQplbmQKCgpkbwogIGFzc2VydChub3QgcGNhbGwoZGVidWcuZ2V0aW5mbywgcHJpbnQsICJYIikpICAgLS0gaW52YWxpZCBvcHRpb24KICBhc3NlcnQobm90IHBjYWxsKGRlYnVnLmdldGluZm8sIDAsICI+IikpICAgLS0gaW52YWxpZCBvcHRpb24KICBhc3NlcnQobm90IGRlYnVnLmdldGluZm8oMTAwMCkpICAgLS0gb3V0IG9mIHJhbmdlIGxldmVsCiAgYXNzZXJ0KG5vdCBkZWJ1Zy5nZXRpbmZvKC0xKSkgICAgIC0tIG91dCBvZiByYW5nZSBsZXZlbAogIGxvY2FsIGEgPSBkZWJ1Zy5nZXRpbmZvKHByaW50KQogIGFzc2VydChhLndoYXQgPT0gIkMiIGFuZCBhLnNob3J0X3NyYyA9PSAiW0NdIikKICBhID0gZGVidWcuZ2V0aW5mbyhwcmludCwgIkwiKQogIGFzc2VydChhLmFjdGl2ZWxpbmVzID09IG5pbCkKICBsb2NhbCBiID0gZGVidWcuZ2V0aW5mbyh0ZXN0LCAiU2ZMIikKICBhc3NlcnQoYi5uYW1lID09IG5pbCBhbmQgYi53aGF0ID09ICJMdWEiIGFuZCBiLmxpbmVkZWZpbmVkID09IHRlc3RsaW5lIGFuZAogICAgICAgICBiLmxhc3RsaW5lZGVmaW5lZCA9PSBiLmxpbmVkZWZpbmVkICsgMTAgYW5kCiAgICAgICAgIGIuZnVuYyA9PSB0ZXN0IGFuZCBub3Qgc3RyaW5nLmZpbmQoYi5zaG9ydF9zcmMsICIlWyIpKQogIGFzc2VydChiLmFjdGl2ZWxpbmVzW2IubGluZWRlZmluZWQgKyAxXSBhbmQKICAgICAgICAgYi5hY3RpdmVsaW5lc1tiLmxhc3RsaW5lZGVmaW5lZF0pCiAgYXNzZXJ0KG5vdCBiLmFjdGl2ZWxpbmVzW2IubGluZWRlZmluZWRdIGFuZAogICAgICAgICBub3QgYi5hY3RpdmVsaW5lc1tiLmxhc3RsaW5lZGVmaW5lZCArIDFdKQplbmQKCgotLSB0ZXN0IGZpbGUgYW5kIHN0cmluZyBuYW1lcyB0cnVuY2F0aW9uCmxvY2FsIGEgPSAiZnVuY3Rpb24gZiAoKSBlbmQiCmxvY2FsIGZ1bmN0aW9uIGRvc3RyaW5nIChzLCB4KSByZXR1cm4gbG9hZChzLCB4KSgpIGVuZApkb3N0cmluZyhhKQphc3NlcnQoZGVidWcuZ2V0aW5mbyhmKS5zaG9ydF9zcmMgPT0gc3RyaW5nLmZvcm1hdCgnW3N0cmluZyAiJXMiXScsIGEpKQpkb3N0cmluZyhhLi5zdHJpbmcuZm9ybWF0KCI7ICVzXG49MSIsIHN0cmluZy5yZXAoJ3AnLCA0MDApKSkKYXNzZXJ0KHN0cmluZy5maW5kKGRlYnVnLmdldGluZm8oZikuc2hvcnRfc3JjLCAnXiVbc3RyaW5nIFteXG5dKiUuJS4lLiIlXSQnKSkKZG9zdHJpbmcoYS4uc3RyaW5nLmZvcm1hdCgiOyAlcz0xIiwgc3RyaW5nLnJlcCgncCcsIDQwMCkpKQphc3NlcnQoc3RyaW5nLmZpbmQoZGVidWcuZ2V0aW5mbyhmKS5zaG9ydF9zcmMsICdeJVtzdHJpbmcgW15cbl0qJS4lLiUuIiVdJCcpKQpkb3N0cmluZygiXG4iLi5hKQphc3NlcnQoZGVidWcuZ2V0aW5mbyhmKS5zaG9ydF9zcmMgPT0gJ1tzdHJpbmcgIi4uLiJdJykKZG9zdHJpbmcoYSwgIiIpCmFzc2VydChkZWJ1Zy5nZXRpbmZvKGYpLnNob3J0X3NyYyA9PSAnW3N0cmluZyAiIl0nKQpkb3N0cmluZyhhLCAiQHh1eHUiKQphc3NlcnQoZGVidWcuZ2V0aW5mbyhmKS5zaG9ydF9zcmMgPT0gInh1eHUiKQpkb3N0cmluZyhhLCAiQCIuLnN0cmluZy5yZXAoJ3AnLCAxMDAwKS4uJ3QnKQphc3NlcnQoc3RyaW5nLmZpbmQoZGVidWcuZ2V0aW5mbyhmKS5zaG9ydF9zcmMsICJeJS4lLiUucCp0JCIpKQpkb3N0cmluZyhhLCAiPXh1eHUiKQphc3NlcnQoZGVidWcuZ2V0aW5mbyhmKS5zaG9ydF9zcmMgPT0gInh1eHUiKQpkb3N0cmluZyhhLCBzdHJpbmcuZm9ybWF0KCI9JXMiLCBzdHJpbmcucmVwKCd4JywgNTAwKSkpCmFzc2VydChzdHJpbmcuZmluZChkZWJ1Zy5nZXRpbmZvKGYpLnNob3J0X3NyYywgIl54KiQiKSkKZG9zdHJpbmcoYSwgIj0iKQphc3NlcnQoZGVidWcuZ2V0aW5mbyhmKS5zaG9ydF9zcmMgPT0gIiIpCl9HLmEgPSBuaWw7IF9HLmYgPSBuaWw7Cl9HW3N0cmluZy5yZXAoInAiLCA0MDApXSA9IG5pbAoKCnJlcGVhdAogIGxvY2FsIGcgPSB7eCA9IGZ1bmN0aW9uICgpCiAgICBsb2NhbCBhID0gZGVidWcuZ2V0aW5mbygyKQogICAgYXNzZXJ0KGEubmFtZSA9PSAnZicgYW5kIGEubmFtZXdoYXQgPT0gJ2xvY2FsJykKICAgIGEgPSBkZWJ1Zy5nZXRpbmZvKDEpCiAgICBhc3NlcnQoYS5uYW1lID09ICd4JyBhbmQgYS5uYW1ld2hhdCA9PSAnZmllbGQnKQogICAgcmV0dXJuICd4aXhpJwogIGVuZH0KICBsb2NhbCBmID0gZnVuY3Rpb24gKCkgcmV0dXJuIDErMSBhbmQgKG5vdCAxIG9yIGcueCgpKSBlbmQKICBhc3NlcnQoZigpID09ICd4aXhpJykKICBnID0gZGVidWcuZ2V0aW5mbyhmKQogIGFzc2VydChnLndoYXQgPT0gIkx1YSIgYW5kIGcuZnVuYyA9PSBmIGFuZCBnLm5hbWV3aGF0ID09ICIiIGFuZCBub3QgZy5uYW1lKQoKICBmdW5jdGlvbiBmICh4LCBuYW1lKSAgIC0tIGxvY2FsIQogICAgbmFtZSA9IG5hbWUgb3IgJ2YnCiAgICBsb2NhbCBhID0gZGVidWcuZ2V0aW5mbygxKQogICAgYXNzZXJ0KGEubmFtZSA9PSBuYW1lIGFuZCBhLm5hbWV3aGF0ID09ICdsb2NhbCcpCiAgICByZXR1cm4geAogIGVuZAoKICAtLSBicmVha3MgaW4gZGlmZmVyZW50IGNvbmRpdGlvbnMKICBpZiAzPjQgdGhlbiBicmVhayBlbmQ7IGYoKQogIGlmIDM8NCB0aGVuIGE9MSBlbHNlIGJyZWFrIGVuZDsgZigpCiAgd2hpbGUgMSBkbyBsb2NhbCB4PTEwOyBicmVhayBlbmQ7IGYoKQogIGxvY2FsIGIgPSAxCiAgaWYgMz40IHRoZW4gcmV0dXJuIG1hdGguc2luKDEpIGVuZDsgZigpCiAgYSA9IDM8NDsgZigpCiAgYSA9IDM8NCBvciAxOyBmKCkKICByZXBlYXQgbG9jYWwgeD0yMDsgaWYgND4zIHRoZW4gZigpIGVsc2UgYnJlYWsgZW5kOyBmKCkgdW50aWwgMQogIGcgPSB7fQogIGYoZykueCA9IGYoMikgYW5kIGYoMTApK2YoOSkKICBhc3NlcnQoZy54ID09IGYoMTkpKQogIGZ1bmN0aW9uIGcoeCkgaWYgbm90IHggdGhlbiByZXR1cm4gMyBlbmQgcmV0dXJuICh4KCdhJywgJ3gnKSkgZW5kCiAgYXNzZXJ0KGcoZikgPT0gJ2EnKQp1bnRpbCAxCgp0ZXN0KFtbaWYKbWF0aC5zaW4oMSkKdGhlbgogIGE9MQplbHNlCiAgYT0yCmVuZApdXSwgezIsMyw0LDd9KQoKCnRlc3QoW1sKbG9jYWwgZnVuY3Rpb24gZm9vKCkKZW5kCmZvbygpCkEgPSAxCkEgPSAyCkEgPSAzCl1dLCB7MiwgMywgMiwgNCwgNSwgNn0pCl9HLkEgPSBuaWwKCgp0ZXN0KFtbLS0KaWYgbmlsIHRoZW4KICBhPTEKZWxzZQogIGE9MgplbmQKXV0sIHsyLDUsNn0pCgp0ZXN0KFtbYT0xCnJlcGVhdAogIGE9YSsxCnVudGlsIGE9PTMKXV0sIHsxLDMsNCwzLDR9KQoKdGVzdChbWyBkbwogIHJldHVybgplbmQKXV0sIHsyfSkKCnRlc3QoW1tsb2NhbCBhCmE9MQp3aGlsZSBhPD0zIGRvCiAgYT1hKzEKZW5kCl1dLCB7MSwyLDMsNCwzLDQsMyw0LDMsNX0pCgp0ZXN0KFtbd2hpbGUgbWF0aC5zaW4oMSkgZG8KICBpZiBtYXRoLnNpbigxKQogIHRoZW4gYnJlYWsKICBlbmQKZW5kCmE9MV1dLCB7MSwyLDMsNn0pCgp0ZXN0KFtbZm9yIGk9MSwzIGRvCiAgYT1pCmVuZApdXSwgezEsMiwxLDIsMSwyLDEsM30pCgp0ZXN0KFtbZm9yIGksdiBpbiBwYWlyc3snYScsJ2InfSBkbwogIGE9dG9zdHJpbmcoaSkgLi4gdgplbmQKXV0sIHsxLDIsMSwyLDEsM30pCgp0ZXN0KFtbZm9yIGk9MSw0IGRvIGE9MSBlbmRdXSwgezEsMSwxLDF9KQoKX0cuYSA9IG5pbAoKCmRvICAgLS0gdGVzdGluZyBsaW5lIGluZm8vdHJhY2Ugd2l0aCBsYXJnZSBnYXBzIGluIHNvdXJjZQoKICBsb2NhbCBhID0gezEsIDIsIDMsIDEwLCAxMjQsIDEyNSwgMTI2LCAxMjcsIDEyOCwgMTI5LCAxMzAsCiAgICAgICAgICAgICAyNTUsIDI1NiwgMjU3LCA1MDAsIDEwMDB9CiAgbG9jYWwgcyA9IFtbCiAgICAgbG9jYWwgYiA9IHsxMH0KICAgICBhID0gYlsxXSBYICsgWSBiWzFdCiAgICAgYiA9IDQKICBdXQogIGZvciBfLCBpIGluIGlwYWlycyhhKSBkbwogICAgbG9jYWwgc3VicyA9IHtYID0gc3RyaW5nLnJlcCgiXG4iLCBpKX0KICAgIGZvciBfLCBqIGluIGlwYWlycyhhKSBkbwogICAgICBzdWJzLlkgPSBzdHJpbmcucmVwKCJcbiIsIGopCiAgICAgIGxvY2FsIHMgPSBzdHJpbmcuZ3N1YihzLCAiW1hZXSIsIHN1YnMpCiAgICAgIHRlc3QocywgezEsIDIgKyBpLCAyICsgaSArIGosIDIgKyBpLCAyICsgaSArIGosIDMgKyBpICsgan0pCiAgICBlbmQKICBlbmQKZW5kCl9HLmEgPSBuaWwKCgpkbyAgIC0tIHRlc3RpbmcgYWN0aXZlIGxpbmVzCiAgbG9jYWwgZnVuY3Rpb24gY2hlY2thY3RpdmVsaW5lcyAoZiwgbGluZXMpCiAgICBsb2NhbCB0ID0gZGVidWcuZ2V0aW5mbyhmLCAiU0wiKQogICAgZm9yIF8sIGwgaW4gcGFpcnMobGluZXMpIGRvCiAgICAgIGwgPSBsICsgdC5saW5lZGVmaW5lZAogICAgICBhc3NlcnQodC5hY3RpdmVsaW5lc1tsXSkKICAgICAgdC5hY3RpdmVsaW5lc1tsXSA9IHVuZGVmCiAgICBlbmQKICAgIGFzc2VydChuZXh0KHQuYWN0aXZlbGluZXMpID09IG5pbCkgICAtLSBubyBleHRyYSBsaW5lcwogIGVuZAoKICBjaGVja2FjdGl2ZWxpbmVzKGZ1bmN0aW9uICguLi4pICAgLS0gdmFyYXJnIGZ1bmN0aW9uCiAgICAtLSAxc3QgbGluZSBpcyBlbXB0eQogICAgLS0gMm5kIGxpbmUgaXMgZW1wdHkKICAgIC0tIDN0aCBsaW5lIGlzIGVtcHR5CiAgICBsb2NhbCBhID0gMjAKICAgIC0tIDV0aCBsaW5lIGlzIGVtcHR5CiAgICBsb2NhbCBiID0gMzAKICAgIC0tIDd0aCBsaW5lIGlzIGVtcHR5CiAgZW5kLCB7NCwgNiwgOH0pCgogIGNoZWNrYWN0aXZlbGluZXMoZnVuY3Rpb24gKGEpCiAgICAtLSAxc3QgbGluZSBpcyBlbXB0eQogICAgLS0gMm5kIGxpbmUgaXMgZW1wdHkKICAgIGxvY2FsIGEgPSAyMAogICAgbG9jYWwgYiA9IDMwCiAgICAtLSA1dGggbGluZSBpcyBlbXB0eQogIGVuZCwgezMsIDQsIDZ9KQoKICBjaGVja2FjdGl2ZWxpbmVzKGZ1bmN0aW9uIChhLCBiLCAuLi4pIGVuZCwgezB9KQoKICBjaGVja2FjdGl2ZWxpbmVzKGZ1bmN0aW9uIChhLCBiKQogIGVuZCwgezF9KQoKICBmb3IgXywgbiBpbiBwYWlyc3swLCAxLCAyLCAxMCwgNTAsIDEwMCwgMTAwMCwgMTAwMDB9IGRvCiAgICBjaGVja2FjdGl2ZWxpbmVzKAogICAgICBsb2FkKHN0cmluZy5mb3JtYXQoIiVzIHJldHVybiAxIiwgc3RyaW5nLnJlcCgiXG4iLCBuKSkpLAogICAgICB7biArIDF9KQogIGVuZAoKZW5kCgpwcmludCcrJwoKLS0gaW52YWxpZCBsZXZlbHMgaW4gW2dzXWV0bG9jYWwKYXNzZXJ0KG5vdCBwY2FsbChkZWJ1Zy5nZXRsb2NhbCwgMjAsIDEpKQphc3NlcnQobm90IHBjYWxsKGRlYnVnLnNldGxvY2FsLCAtMSwgMSwgMTApKQoKCi0tIHBhcmFtZXRlciBuYW1lcwpsb2NhbCBmdW5jdGlvbiBmb28gKGEsYiwuLi4pIGxvY2FsIGQsIGUgZW5kCmxvY2FsIGNvID0gY29yb3V0aW5lLmNyZWF0ZShmb28pCgphc3NlcnQoZGVidWcuZ2V0bG9jYWwoZm9vLCAxKSA9PSAnYScpCmFzc2VydChkZWJ1Zy5nZXRsb2NhbChmb28sIDIpID09ICdiJykKYXNzZXJ0KG5vdCBkZWJ1Zy5nZXRsb2NhbChmb28sIDMpKQphc3NlcnQoZGVidWcuZ2V0bG9jYWwoY28sIGZvbywgMSkgPT0gJ2EnKQphc3NlcnQoZGVidWcuZ2V0bG9jYWwoY28sIGZvbywgMikgPT0gJ2InKQphc3NlcnQobm90IGRlYnVnLmdldGxvY2FsKGNvLCBmb28sIDMpKQoKYXNzZXJ0KG5vdCBkZWJ1Zy5nZXRsb2NhbChwcmludCwgMSkpCgoKbG9jYWwgZnVuY3Rpb24gZm9vICgpIHJldHVybiAoZGVidWcuZ2V0bG9jYWwoMSwgLTEpKSBlbmQKYXNzZXJ0KG5vdCBmb28oMTApKQoKCi0tIHZhcmFyZ3MKbG9jYWwgZnVuY3Rpb24gZm9vIChhLCAuLi4pCiAgbG9jYWwgdCA9IHRhYmxlLnBhY2soLi4uKQogIGZvciBpID0gMSwgdC5uIGRvCiAgICBsb2NhbCBuLCB2ID0gZGVidWcuZ2V0bG9jYWwoMSwgLWkpCiAgICBhc3NlcnQobiA9PSAiKHZhcmFyZykiIGFuZCB2ID09IHRbaV0pCiAgZW5kCiAgYXNzZXJ0KG5vdCBkZWJ1Zy5nZXRsb2NhbCgxLCAtKHQubiArIDEpKSkKICBhc3NlcnQobm90IGRlYnVnLnNldGxvY2FsKDEsIC0odC5uICsgMSksIDMwKSkKICBpZiB0Lm4gPiAwIHRoZW4KICAgIChmdW5jdGlvbiAoeCkKICAgICAgYXNzZXJ0KGRlYnVnLnNldGxvY2FsKDIsIC0xLCB4KSA9PSAiKHZhcmFyZykiKQogICAgICBhc3NlcnQoZGVidWcuc2V0bG9jYWwoMiwgLXQubiwgeCkgPT0gIih2YXJhcmcpIikKICAgICBlbmQpKDQzMCkKICAgICBhc3NlcnQoLi4uID09IDQzMCkKICBlbmQKZW5kCgpmb28oKQpmb28ocHJpbnQpCmZvbygyMDAsIDMsIDQpCmxvY2FsIGEgPSB7fQpmb3IgaSA9IDEsIChfc29mdCBhbmQgMTAwIG9yIDEwMDApIGRvIGFbaV0gPSBpIGVuZApmb28odGFibGUudW5wYWNrKGEpKQoKCgpkbyAgIC0tIHRlc3QgaG9vayBwcmVzZW5jZSBpbiBkZWJ1ZyBpbmZvCiAgYXNzZXJ0KG5vdCBkZWJ1Zy5nZXRob29rKCkpCiAgbG9jYWwgY291bnQgPSAwCiAgbG9jYWwgZnVuY3Rpb24gZiAoKQogICAgYXNzZXJ0KGRlYnVnLmdldGluZm8oMSkubmFtZXdoYXQgPT0gImhvb2siKQogICAgbG9jYWwgc25kbGluZSA9IHN0cmluZy5tYXRjaChkZWJ1Zy50cmFjZWJhY2soKSwgIlxuKC4tKVxuIikKICAgIGFzc2VydChzdHJpbmcuZmluZChzbmRsaW5lLCAiaG9vayIpKQogICAgY291bnQgPSBjb3VudCArIDEKICBlbmQKICBkZWJ1Zy5zZXRob29rKGYsICJsIikKICBsb2NhbCBhID0gMAogIF9FTlYuYSA9IGEKICBhID0gMQogIGRlYnVnLnNldGhvb2soKQogIGFzc2VydChjb3VudCA9PSA0KQplbmQKX0VOVi5hID0gbmlsCgoKLS0gaG9vayB0YWJsZSBoYXMgd2VhayBrZXlzCmFzc2VydChnZXRtZXRhdGFibGUoZGVidWcuZ2V0cmVnaXN0cnkoKS5fSE9PS0tFWSkuX19tb2RlID09ICdrJykKCgphID0ge307IGxvY2FsIEwgPSBuaWwKbG9jYWwgZ2xvYiA9IDEKbG9jYWwgb2xkZ2xvYiA9IGdsb2IKZGVidWcuc2V0aG9vayhmdW5jdGlvbiAoZSxsKQogIGNvbGxlY3RnYXJiYWdlKCkgICAtLSBmb3JjZSBHQyBkdXJpbmcgYSBob29rCiAgbG9jYWwgZiwgbSwgYyA9IGRlYnVnLmdldGhvb2soKQogIGFzc2VydChtID09ICdjcmwnIGFuZCBjID09IDApCiAgaWYgZSA9PSAibGluZSIgdGhlbgogICAgaWYgZ2xvYiB+PSBvbGRnbG9iIHRoZW4KICAgICAgTCA9IGwtMSAgIC0tIGdldCB0aGUgZmlyc3QgbGluZSB3aGVyZSAiZ2xvYiIgaGFzIGNoYW5nZWQKICAgICAgb2xkZ2xvYiA9IGdsb2IKICAgIGVuZAogIGVsc2VpZiBlID09ICJjYWxsIiB0aGVuCiAgICAgIGxvY2FsIGYgPSBkZWJ1Zy5nZXRpbmZvKDIsICJmIikuZnVuYwogICAgICBhW2ZdID0gMQogIGVsc2UgYXNzZXJ0KGUgPT0gInJldHVybiIpCiAgZW5kCmVuZCwgImNybCIpCgoKZnVuY3Rpb24gZihhLGIpCiAgY29sbGVjdGdhcmJhZ2UoKQogIGxvY2FsIF8sIHggPSBkZWJ1Zy5nZXRsb2NhbCgxLCAxKQogIGxvY2FsIF8sIHkgPSBkZWJ1Zy5nZXRsb2NhbCgxLCAyKQogIGFzc2VydCh4ID09IGEgYW5kIHkgPT0gYikKICBhc3NlcnQoZGVidWcuc2V0bG9jYWwoMiwgMywgInBlcmEiKSA9PSAiQUEiLi4iQUEiKQogIGFzc2VydChkZWJ1Zy5zZXRsb2NhbCgyLCA0LCAibWHn4yIpID09ICJCIikKICB4ID0gZGVidWcuZ2V0aW5mbygyKQogIGFzc2VydCh4LmZ1bmMgPT0gZyBhbmQgeC53aGF0ID09ICJMdWEiIGFuZCB4Lm5hbWUgPT0gJ2cnIGFuZAogICAgICAgICB4Lm51cHMgPT0gMiBhbmQgc3RyaW5nLmZpbmQoeC5zb3VyY2UsICJeQC4qZGIlLmx1YSQiKSkKICBnbG9iID0gZ2xvYisxCiAgYXNzZXJ0KGRlYnVnLmdldGluZm8oMSwgImwiKS5jdXJyZW50bGluZSA9PSBMKzEpCiAgYXNzZXJ0KGRlYnVnLmdldGluZm8oMSwgImwiKS5jdXJyZW50bGluZSA9PSBMKzIpCmVuZAoKZnVuY3Rpb24gZm9vKCkKICBnbG9iID0gZ2xvYisxCiAgYXNzZXJ0KGRlYnVnLmdldGluZm8oMSwgImwiKS5jdXJyZW50bGluZSA9PSBMKzEpCmVuZDsgZm9vKCkgIC0tIHNldCBMCi0tIGNoZWNrIGxpbmUgY291bnRpbmcgaW5zaWRlIHN0cmluZ3MgYW5kIGVtcHR5IGxpbmVzCgpsb2NhbCBfID0gJ2Fsb1wKYWxvJyAuLiBbWwoKXV0KLS1bWwpdXQphc3NlcnQoZGVidWcuZ2V0aW5mbygxLCAibCIpLmN1cnJlbnRsaW5lID09IEwrMTEpICAtLSBjaGVjayBjb3VudCBvZiBsaW5lcwoKCmZ1bmN0aW9uIGcgKC4uLikKICBsb2NhbCBhcmcgPSB7Li4ufQogIGRvIGxvY2FsIGEsYixjOyBhPW1hdGguc2luKDQwKTsgZW5kCiAgbG9jYWwgZmVpamFvCiAgbG9jYWwgQUFBQSxCID0gInh1eHUiLCAibWFt428iCiAgZihBQUFBLEIpCiAgYXNzZXJ0KEFBQUEgPT0gInBlcmEiIGFuZCBCID09ICJtYefjIikKICBkbwogICAgIGxvY2FsIEIgPSAxMwogICAgIGxvY2FsIHgseSA9IGRlYnVnLmdldGxvY2FsKDEsNSkKICAgICBhc3NlcnQoeCA9PSAnQicgYW5kIHkgPT0gMTMpCiAgZW5kCmVuZAoKZygpCgoKYXNzZXJ0KGFbZl0gYW5kIGFbZ10gYW5kIGFbYXNzZXJ0XSBhbmQgYVtkZWJ1Zy5nZXRsb2NhbF0gYW5kIG5vdCBhW3ByaW50XSkKCgotLSB0ZXN0cyBmb3IgbWFuaXB1bGF0aW5nIG5vbi1yZWdpc3RlcmVkIGxvY2FscyAoQyBhbmQgTHVhIHRlbXBvcmFyaWVzKQoKbG9jYWwgbiwgdiA9IGRlYnVnLmdldGxvY2FsKDAsIDEpCmFzc2VydCh2ID09IDAgYW5kIG4gPT0gIihDIHRlbXBvcmFyeSkiKQpsb2NhbCBuLCB2ID0gZGVidWcuZ2V0bG9jYWwoMCwgMikKYXNzZXJ0KHYgPT0gMiBhbmQgbiA9PSAiKEMgdGVtcG9yYXJ5KSIpCmFzc2VydChub3QgZGVidWcuZ2V0bG9jYWwoMCwgMykpCmFzc2VydChub3QgZGVidWcuZ2V0bG9jYWwoMCwgMCkpCgpmdW5jdGlvbiBmKCkKICBhc3NlcnQoc2VsZWN0KDIsIGRlYnVnLmdldGxvY2FsKDIsMykpID09IDEpCiAgYXNzZXJ0KG5vdCBkZWJ1Zy5nZXRsb2NhbCgyLDQpKQogIGRlYnVnLnNldGxvY2FsKDIsIDMsIDEwKQogIHJldHVybiAyMAplbmQKCmZ1bmN0aW9uIGcoYSxiKSByZXR1cm4gKGErMSkgKyBmKCkgZW5kCgphc3NlcnQoZygwLDApID09IDMwKQogCl9HLmYsIF9HLmcgPSBuaWwKCmRlYnVnLnNldGhvb2sobmlsKTsKYXNzZXJ0KG5vdCBkZWJ1Zy5nZXRob29rKCkpCgoKLS0gbWluaW1hbCB0ZXN0cyBmb3Igc2V0dXNlcnZhbHVlL2dldHVzZXJ2YWx1ZQpkbwogIGFzc2VydChub3QgZGVidWcuc2V0dXNlcnZhbHVlKGlvLnN0ZGluLCAxMCkpCiAgbG9jYWwgYSwgYiA9IGRlYnVnLmdldHVzZXJ2YWx1ZShpby5zdGRpbiwgMTApCiAgYXNzZXJ0KGEgPT0gbmlsIGFuZCBub3QgYikKZW5kCgotLSB0ZXN0aW5nIGl0ZXJhY3Rpb24gYmV0d2VlbiBtdWx0aXBsZSB2YWx1ZXMgeCBob29rcwpkbwogIGxvY2FsIGZ1bmN0aW9uIGYoLi4uKSByZXR1cm4gMywgLi4uIGVuZAogIGxvY2FsIGNvdW50ID0gMAogIGxvY2FsIGEgPSB7fQogIGZvciBpID0gMSwgMTAwIGRvIGFbaV0gPSBpIGVuZAogIGRlYnVnLnNldGhvb2soZnVuY3Rpb24gKCkgY291bnQgPSBjb3VudCArIDEgZW5kLCAiIiwgMSkKICBsb2NhbCB0ID0ge3RhYmxlLnVucGFjayhhKX0KICBhc3NlcnQoI3QgPT0gMTAwKQogIHQgPSB7dGFibGUudW5wYWNrKGEsIDEsIDMpfQogIGFzc2VydCgjdCA9PSAzKQogIHQgPSB7Zih0YWJsZS51bnBhY2soYSwgMSwgMzApKX0KICBhc3NlcnQoI3QgPT0gMzEpCmVuZAoKCi0tIHRlc3RpbmcgYWNjZXNzIHRvIGZ1bmN0aW9uIGFyZ3VtZW50cwoKbG9jYWwgZnVuY3Rpb24gY29sbGVjdGxvY2FscyAobGV2ZWwpCiAgbG9jYWwgdGFiID0ge30KICBmb3IgaSA9IDEsIG1hdGguaHVnZSBkbwogICAgbG9jYWwgbiwgdiA9IGRlYnVnLmdldGxvY2FsKGxldmVsICsgMSwgaSkKICAgIGlmIG5vdCAobiBhbmQgc3RyaW5nLmZpbmQobiwgIl5bYS16QS1aMC05X10rJCIpKSB0aGVuCiAgICAgICBicmVhayAgIC0tIGNvbnNpZGVyIG9ubHkgcmVhbCB2YXJpYWJsZXMKICAgIGVuZAogICAgdGFiW25dID0gdgogIGVuZAogIHJldHVybiB0YWIKZW5kCgoKbG9jYWwgWCA9IG5pbAphID0ge30KZnVuY3Rpb24gYTpmIChhLCBiLCAuLi4pIGxvY2FsIGFyZyA9IHsuLi59OyBsb2NhbCBjID0gMTMgZW5kCmRlYnVnLnNldGhvb2soZnVuY3Rpb24gKGUpCiAgYXNzZXJ0KGUgPT0gImNhbGwiKQogIGRvc3RyaW5nKCJYWCA9IDEyIikgIC0tIHRlc3QgZG9zdHJpbmcgaW5zaWRlIGhvb2tzCiAgLS0gdGVzdGluZyBlcnJvcnMgaW5zaWRlIGhvb2tzCiAgYXNzZXJ0KG5vdCBwY2FsbChsb2FkKCJhPSdqb2FvJysxIikpKQogIGRlYnVnLnNldGhvb2soZnVuY3Rpb24gKGUsIGwpIAogICAgYXNzZXJ0KGRlYnVnLmdldGluZm8oMiwgImwiKS5jdXJyZW50bGluZSA9PSBsKQogICAgbG9jYWwgZixtLGMgPSBkZWJ1Zy5nZXRob29rKCkKICAgIGFzc2VydChlID09ICJsaW5lIikKICAgIGFzc2VydChtID09ICdsJyBhbmQgYyA9PSAwKQogICAgZGVidWcuc2V0aG9vayhuaWwpICAtLSBob29rIGlzIGNhbGxlZCBvbmx5IG9uY2UKICAgIGFzc2VydChub3QgWCkgICAgICAgLS0gY2hlY2sgdGhhdAogICAgWCA9IGNvbGxlY3Rsb2NhbHMoMikKICBlbmQsICJsIikKZW5kLCAiYyIpCgphOmYoMSwyLDMsNCw1KQphc3NlcnQoWC5zZWxmID09IGEgYW5kIFguYSA9PSAxICAgYW5kIFguYiA9PSAyIGFuZCBYLmMgPT0gbmlsKQphc3NlcnQoWFggPT0gMTIpCmFzc2VydChub3QgZGVidWcuZ2V0aG9vaygpKQpfRy5YWCA9IG5pbAoKCi0tIHRlc3RpbmcgYWNjZXNzIHRvIGxvY2FsIHZhcmlhYmxlcyBpbiByZXR1cm4gaG9vayAoYnVnIGluIDUuMikKZG8KICBsb2NhbCBYID0gZmFsc2UKCiAgbG9jYWwgZnVuY3Rpb24gZm9vIChhLCBiLCAuLi4pCiAgICBkbyBsb2NhbCB4LHkseiBlbmQKICAgIGxvY2FsIGMsIGQgPSAxMCwgMjAKICAgIHJldHVybgogIGVuZAoKICBsb2NhbCBmdW5jdGlvbiBhdXggKCkKICAgIGlmIGRlYnVnLmdldGluZm8oMikubmFtZSA9PSAiZm9vIiB0aGVuCiAgICAgIFggPSB0cnVlICAgLS0gdG8gc2lnbmFsIHRoYXQgaXQgZm91bmQgJ2ZvbycKICAgICAgbG9jYWwgdGFiID0ge2EgPSAxMDAsIGIgPSAyMDAsIGMgPSAxMCwgZCA9IDIwfQogICAgICBmb3IgbiwgdiBpbiBwYWlycyhjb2xsZWN0bG9jYWxzKDIpKSBkbwogICAgICAgIGFzc2VydCh0YWJbbl0gPT0gdikKICAgICAgICB0YWJbbl0gPSB1bmRlZgogICAgICBlbmQKICAgICAgYXNzZXJ0KG5leHQodGFiKSA9PSBuaWwpICAgIC0tICd0YWInIG11c3QgYmUgZW1wdHkKICAgIGVuZAogIGVuZAoKICBkZWJ1Zy5zZXRob29rKGF1eCwgInIiKTsgZm9vKDEwMCwgMjAwKTsgZGVidWcuc2V0aG9vaygpCiAgYXNzZXJ0KFgpCgplbmQKCgpsb2NhbCBmdW5jdGlvbiBlcXNlcSAodDEsIHQyKQogIGFzc2VydCgjdDEgPT0gI3QyKQogIGZvciBpID0gMSwgI3QxIGRvCiAgICBhc3NlcnQodDFbaV0gPT0gdDJbaV0pCiAgZW5kCmVuZAoKCmRvICBwcmludCgidGVzdGluZyBpbnNwZWN0aW9uIG9mIHBhcmFtZXRlcnMvcmV0dXJuZWQgdmFsdWVzIikKICBsb2NhbCBvbiA9IGZhbHNlCiAgbG9jYWwgaW5wLCBvdXQKCiAgbG9jYWwgZnVuY3Rpb24gaG9vayAoZXZlbnQpCiAgICBpZiBub3Qgb24gdGhlbiByZXR1cm4gZW5kCiAgICBsb2NhbCBhciA9IGRlYnVnLmdldGluZm8oMiwgInJ1UyIpCiAgICBsb2NhbCB0ID0ge30KICAgIGZvciBpID0gYXIuZnRyYW5zZmVyLCBhci5mdHJhbnNmZXIgKyBhci5udHJhbnNmZXIgLSAxIGRvCiAgICAgIGxvY2FsIF8sIHYgPSBkZWJ1Zy5nZXRsb2NhbCgyLCBpKQogICAgICB0WyN0ICsgMV0gPSB2IAogICAgZW5kCiAgICBpZiBldmVudCA9PSAicmV0dXJuIiB0aGVuCiAgICAgIG91dCA9IHQKICAgIGVsc2UKICAgICAgaW5wID0gdAogICAgZW5kCiAgZW5kCgogIGRlYnVnLnNldGhvb2soaG9vaywgImNyIikKCiAgb24gPSB0cnVlOyBtYXRoLnNpbigzKTsgb24gPSBmYWxzZQogIGVxc2VxKGlucCwgezN9KTsgZXFzZXEob3V0LCB7bWF0aC5zaW4oMyl9KQoKICBvbiA9IHRydWU7IHNlbGVjdCgyLCAxMCwgMjAsIDMwLCA0MCk7IG9uID0gZmFsc2UKICBlcXNlcShpbnAsIHsyLCAxMCwgMjAsIDMwLCA0MH0pOyBlcXNlcShvdXQsIHsyMCwgMzAsIDQwfSkKCiAgbG9jYWwgZnVuY3Rpb24gZm9vIChhLCAuLi4pIHJldHVybiAuLi4gZW5kCiAgbG9jYWwgZnVuY3Rpb24gZm9vMSAoKSBvbiA9IG5vdCBvbjsgcmV0dXJuIGZvbygyMCwgMTAsIDApIGVuZAogIGZvbzEoKTsgb24gPSBmYWxzZQogIGVxc2VxKGlucCwgezIwfSk7IGVxc2VxKG91dCwgezEwLCAwfSkKCiAgZGVidWcuc2V0aG9vaygpCmVuZAoKCgotLSB0ZXN0aW5nIHVwdmFsdWUgYWNjZXNzCmxvY2FsIGZ1bmN0aW9uIGdldHVwdmFsdWVzIChmKQogIGxvY2FsIHQgPSB7fQogIGxvY2FsIGkgPSAxCiAgd2hpbGUgdHJ1ZSBkbwogICAgbG9jYWwgbmFtZSwgdmFsdWUgPSBkZWJ1Zy5nZXR1cHZhbHVlKGYsIGkpCiAgICBpZiBub3QgbmFtZSB0aGVuIGJyZWFrIGVuZAogICAgYXNzZXJ0KG5vdCB0W25hbWVdKQogICAgdFtuYW1lXSA9IHZhbHVlCiAgICBpID0gaSArIDEKICBlbmQKICByZXR1cm4gdAplbmQKCmxvY2FsIGEsYixjID0gMSwyLDMKbG9jYWwgZnVuY3Rpb24gZm9vMSAoYSkgYiA9IGE7IHJldHVybiBjIGVuZApsb2NhbCBmdW5jdGlvbiBmb28yICh4KSBhID0geDsgcmV0dXJuIGMrYiBlbmQKYXNzZXJ0KG5vdCBkZWJ1Zy5nZXR1cHZhbHVlKGZvbzEsIDMpKQphc3NlcnQobm90IGRlYnVnLmdldHVwdmFsdWUoZm9vMSwgMCkpCmFzc2VydChub3QgZGVidWcuc2V0dXB2YWx1ZShmb28xLCAzLCAieHV4dSIpKQpsb2NhbCB0ID0gZ2V0dXB2YWx1ZXMoZm9vMSkKYXNzZXJ0KHQuYSA9PSBuaWwgYW5kIHQuYiA9PSAyIGFuZCB0LmMgPT0gMykKdCA9IGdldHVwdmFsdWVzKGZvbzIpCmFzc2VydCh0LmEgPT0gMSBhbmQgdC5iID09IDIgYW5kIHQuYyA9PSAzKQphc3NlcnQoZGVidWcuc2V0dXB2YWx1ZShmb28xLCAxLCAieHV4dSIpID09ICJiIikKYXNzZXJ0KCh7ZGVidWcuZ2V0dXB2YWx1ZShmb28yLCAzKX0pWzJdID09ICJ4dXh1IikKLS0gdXB2YWx1ZXMgb2YgQyBmdW5jdGlvbnMgYXJlIGFsbHdheXMgImNhbGxlZCIgIiIgKHRoZSBlbXB0eSBzdHJpbmcpCmFzc2VydChkZWJ1Zy5nZXR1cHZhbHVlKHN0cmluZy5nbWF0Y2goIngiLCAieCIpLCAxKSA9PSAiIikgIAoKCi0tIHRlc3RpbmcgY291bnQgaG9va3MKbG9jYWwgYT0wCmRlYnVnLnNldGhvb2soZnVuY3Rpb24gKGUpIGE9YSsxIGVuZCwgIiIsIDEpCmE9MDsgZm9yIGk9MSwxMDAwIGRvIGVuZDsgYXNzZXJ0KDEwMDAgPCBhIGFuZCBhIDwgMTAxMikKZGVidWcuc2V0aG9vayhmdW5jdGlvbiAoZSkgYT1hKzEgZW5kLCAiIiwgNCkKYT0wOyBmb3IgaT0xLDEwMDAgZG8gZW5kOyBhc3NlcnQoMjUwIDwgYSBhbmQgYSA8IDI1NSkKbG9jYWwgZixtLGMgPSBkZWJ1Zy5nZXRob29rKCkKYXNzZXJ0KG0gPT0gIiIgYW5kIGMgPT0gNCkKZGVidWcuc2V0aG9vayhmdW5jdGlvbiAoZSkgYT1hKzEgZW5kLCAiIiwgNDAwMCkKYT0wOyBmb3IgaT0xLDEwMDAgZG8gZW5kOyBhc3NlcnQoYSA9PSAwKQoKZG8KICBkZWJ1Zy5zZXRob29rKHByaW50LCAiIiwgMl4yNCAtIDEpICAgLS0gY291bnQgdXBwZXJib3VuZAogIGxvY2FsIGYsbSxjID0gZGVidWcuZ2V0aG9vaygpCiAgYXNzZXJ0KCh7ZGVidWcuZ2V0aG9vaygpfSlbM10gPT0gMl4yNCAtIDEpCmVuZAoKZGVidWcuc2V0aG9vaygpCgpsb2NhbCBnLCBnMQoKLS0gdGVzdHMgZm9yIHRhaWwgY2FsbHMKbG9jYWwgZnVuY3Rpb24gZiAoeCkKICBpZiB4IHRoZW4KICAgIGFzc2VydChkZWJ1Zy5nZXRpbmZvKDEsICJTIikud2hhdCA9PSAiTHVhIikKICAgIGFzc2VydChkZWJ1Zy5nZXRpbmZvKDEsICJ0IikuaXN0YWlsY2FsbCA9PSB0cnVlKQogICAgbG9jYWwgdGFpbCA9IGRlYnVnLmdldGluZm8oMikKICAgIGFzc2VydCh0YWlsLmZ1bmMgPT0gZzEgYW5kIHRhaWwuaXN0YWlsY2FsbCA9PSB0cnVlKQogICAgYXNzZXJ0KGRlYnVnLmdldGluZm8oMywgIlMiKS53aGF0ID09ICJtYWluIikKICAgIHByaW50IisiCiAgICBlbmQKZW5kCgpmdW5jdGlvbiBnKHgpIHJldHVybiBmKHgpIGVuZAoKZnVuY3Rpb24gZzEoeCkgZyh4KSBlbmQKCmxvY2FsIGZ1bmN0aW9uIGggKHgpIGxvY2FsIGY9ZzE7IHJldHVybiBmKHgpIGVuZAoKaCh0cnVlKQoKbG9jYWwgYiA9IHt9CmRlYnVnLnNldGhvb2soZnVuY3Rpb24gKGUpIHRhYmxlLmluc2VydChiLCBlKSBlbmQsICJjciIpCmgoZmFsc2UpCmRlYnVnLnNldGhvb2soKQpsb2NhbCByZXMgPSB7InJldHVybiIsICAgLS0gZmlyc3QgcmV0dXJuIChmcm9tIHNldGhvb2spCiAgImNhbGwiLCAidGFpbCBjYWxsIiwgImNhbGwiLCAidGFpbCBjYWxsIiwKICAicmV0dXJuIiwgInJldHVybiIsCiAgImNhbGwiLCAgICAtLSBsYXN0IGNhbGwgKHRvIHNldGhvb2spCn0KZm9yIGkgPSAxLCAjcmVzIGRvIGFzc2VydChyZXNbaV0gPT0gdGFibGUucmVtb3ZlKGIsIDEpKSBlbmQKCmIgPSAwCmRlYnVnLnNldGhvb2soZnVuY3Rpb24gKGUpCiAgICAgICAgICAgICAgICBpZiBlID09ICJ0YWlsIGNhbGwiIHRoZW4KICAgICAgICAgICAgICAgICAgYiA9IGIgKyAxCiAgICAgICAgICAgICAgICAgIGFzc2VydChkZWJ1Zy5nZXRpbmZvKDIsICJ0IikuaXN0YWlsY2FsbCA9PSB0cnVlKQogICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICBhc3NlcnQoZGVidWcuZ2V0aW5mbygyLCAidCIpLmlzdGFpbGNhbGwgPT0gZmFsc2UpCiAgICAgICAgICAgICAgICBlbmQKICAgICAgICAgICAgICBlbmQsICJjIikKaChmYWxzZSkKZGVidWcuc2V0aG9vaygpCmFzc2VydChiID09IDIpICAgLS0gdHdvIHRhaWwgY2FsbHMKCmxvY2FsIGxpbSA9IF9zb2Z0IGFuZCAzMDAwIG9yIDMwMDAwCmxvY2FsIGZ1bmN0aW9uIGZvbyAoeCkKICBpZiB4PT0wIHRoZW4KICAgIGFzc2VydChkZWJ1Zy5nZXRpbmZvKDIpLndoYXQgPT0gIm1haW4iKQogICAgbG9jYWwgaW5mbyA9IGRlYnVnLmdldGluZm8oMSkKICAgIGFzc2VydChpbmZvLmlzdGFpbGNhbGwgPT0gdHJ1ZSBhbmQgaW5mby5mdW5jID09IGZvbykKICBlbHNlIHJldHVybiBmb28oeC0xKQogIGVuZAplbmQKCmZvbyhsaW0pCgoKcHJpbnQiKyIKCgotLSB0ZXN0aW5nIGxvY2FsIGZ1bmN0aW9uIGluZm9ybWF0aW9uCmNvID0gbG9hZFtbCiAgbG9jYWwgQSA9IGZ1bmN0aW9uICgpCiAgICByZXR1cm4geAogIGVuZAogIHJldHVybgpdXQoKbG9jYWwgYSA9IDAKLS0gJ0EnIHNob3VsZCBiZSB2aXNpYmxlIHRvIGRlYnVnZ2VyIG9ubHkgYWZ0ZXIgaXRzIGNvbXBsZXRlIGRlZmluaXRpb24KZGVidWcuc2V0aG9vayhmdW5jdGlvbiAoZSwgbCkKICBpZiBsID09IDMgdGhlbiBhID0gYSArIDE7IGFzc2VydChkZWJ1Zy5nZXRsb2NhbCgyLCAxKSA9PSAiKHRlbXBvcmFyeSkiKQogIGVsc2VpZiBsID09IDQgdGhlbiBhID0gYSArIDE7IGFzc2VydChkZWJ1Zy5nZXRsb2NhbCgyLCAxKSA9PSAiQSIpCiAgZW5kCmVuZCwgImwiKQpjbygpICAtLSBydW4gbG9jYWwgZnVuY3Rpb24gZGVmaW5pdGlvbgpkZWJ1Zy5zZXRob29rKCkgIC0tIHR1cm4gb2ZmIGhvb2sKYXNzZXJ0KGEgPT0gMikgICAtLSBlbnN1cmUgYWxsIHR3byBsaW5lcyB3aGVyZSBob29rZWQKCi0tIHRlc3RpbmcgdHJhY2ViYWNrCgphc3NlcnQoZGVidWcudHJhY2ViYWNrKHByaW50KSA9PSBwcmludCkKYXNzZXJ0KGRlYnVnLnRyYWNlYmFjayhwcmludCwgNCkgPT0gcHJpbnQpCmFzc2VydChzdHJpbmcuZmluZChkZWJ1Zy50cmFjZWJhY2soImhpIiwgNCksICJeaGlcbiIpKQphc3NlcnQoc3RyaW5nLmZpbmQoZGVidWcudHJhY2ViYWNrKCJoaSIpLCAiXmhpXG4iKSkKYXNzZXJ0KG5vdCBzdHJpbmcuZmluZChkZWJ1Zy50cmFjZWJhY2soImhpIiksICInZGVidWcudHJhY2ViYWNrJyIpKQphc3NlcnQoc3RyaW5nLmZpbmQoZGVidWcudHJhY2ViYWNrKCJoaSIsIDApLCAiJ2RlYnVnLnRyYWNlYmFjayciKSkKYXNzZXJ0KHN0cmluZy5maW5kKGRlYnVnLnRyYWNlYmFjaygpLCAiXnN0YWNrIHRyYWNlYmFjazpcbiIpKQoKZG8gIC0tIEMtZnVuY3Rpb24gbmFtZXMgaW4gdHJhY2ViYWNrCiAgbG9jYWwgc3QsIG1zZyA9IChmdW5jdGlvbiAoKSByZXR1cm4gcGNhbGwgZW5kKSgpKGRlYnVnLnRyYWNlYmFjaykKICBhc3NlcnQoc3QgPT0gdHJ1ZSBhbmQgc3RyaW5nLmZpbmQobXNnLCAicGNhbGwiKSkKZW5kCgoKLS0gdGVzdGluZyBucGFyYW1zLCBudXBzIGUgaXN2YXJhcmcKbG9jYWwgdCA9IGRlYnVnLmdldGluZm8ocHJpbnQsICJ1IikKYXNzZXJ0KHQuaXN2YXJhcmcgPT0gdHJ1ZSBhbmQgdC5ucGFyYW1zID09IDAgYW5kIHQubnVwcyA9PSAwKQoKdCA9IGRlYnVnLmdldGluZm8oZnVuY3Rpb24gKGEsYixjKSBlbmQsICJ1IikKYXNzZXJ0KHQuaXN2YXJhcmcgPT0gZmFsc2UgYW5kIHQubnBhcmFtcyA9PSAzIGFuZCB0Lm51cHMgPT0gMCkKCnQgPSBkZWJ1Zy5nZXRpbmZvKGZ1bmN0aW9uIChhLGIsLi4uKSByZXR1cm4gdFthXSBlbmQsICJ1IikKYXNzZXJ0KHQuaXN2YXJhcmcgPT0gdHJ1ZSBhbmQgdC5ucGFyYW1zID09IDIgYW5kIHQubnVwcyA9PSAxKQoKdCA9IGRlYnVnLmdldGluZm8oMSkgICAtLSBtYWluCmFzc2VydCh0LmlzdmFyYXJnID09IHRydWUgYW5kIHQubnBhcmFtcyA9PSAwIGFuZCB0Lm51cHMgPT0gMSBhbmQKICAgICAgIGRlYnVnLmdldHVwdmFsdWUodC5mdW5jLCAxKSA9PSAiX0VOViIpCgp0ID0gZGVidWcuZ2V0aW5mbyhtYXRoLnNpbikgICAtLSBDIGZ1bmN0aW9uCmFzc2VydCh0LmlzdmFyYXJnID09IHRydWUgYW5kIHQubnBhcmFtcyA9PSAwIGFuZCB0Lm51cHMgPT0gMCkKCnQgPSBkZWJ1Zy5nZXRpbmZvKHN0cmluZy5nbWF0Y2goImFiYyIsICJhIikpICAgLS0gQyBjbG9zdXJlCmFzc2VydCh0LmlzdmFyYXJnID09IHRydWUgYW5kIHQubnBhcmFtcyA9PSAwIGFuZCB0Lm51cHMgPiAwKQoKCgotLSB0ZXN0aW5nIGRlYnVnZ2luZyBvZiBjb3JvdXRpbmVzCgpsb2NhbCBmdW5jdGlvbiBjaGVja3RyYWNlYmFjayAoY28sIHAsIGxldmVsKQogIGxvY2FsIHRiID0gZGVidWcudHJhY2ViYWNrKGNvLCBuaWwsIGxldmVsKQogIGxvY2FsIGkgPSAwCiAgZm9yIGwgaW4gc3RyaW5nLmdtYXRjaCh0YiwgIlteXG5dK1xuPyIpIGRvCiAgICBhc3NlcnQoaSA9PSAwIG9yIHN0cmluZy5maW5kKGwsIHBbaV0pKQogICAgaSA9IGkrMQogIGVuZAogIGFzc2VydChwW2ldID09IHVuZGVmKQplbmQKCgpsb2NhbCBmdW5jdGlvbiBmIChuKQogIGlmIG4gPiAwIHRoZW4gZihuLTEpCiAgZWxzZSBjb3JvdXRpbmUueWllbGQoKSBlbmQKZW5kCgpsb2NhbCBjbyA9IGNvcm91dGluZS5jcmVhdGUoZikKY29yb3V0aW5lLnJlc3VtZShjbywgMykKY2hlY2t0cmFjZWJhY2soY28sIHsieWllbGQiLCAiZGIubHVhIiwgImRiLmx1YSIsICJkYi5sdWEiLCAiZGIubHVhIn0pCmNoZWNrdHJhY2ViYWNrKGNvLCB7ImRiLmx1YSIsICJkYi5sdWEiLCAiZGIubHVhIiwgImRiLmx1YSJ9LCAxKQpjaGVja3RyYWNlYmFjayhjbywgeyJkYi5sdWEiLCAiZGIubHVhIiwgImRiLmx1YSJ9LCAyKQpjaGVja3RyYWNlYmFjayhjbywgeyJkYi5sdWEifSwgNCkKY2hlY2t0cmFjZWJhY2soY28sIHt9LCA0MCkKCgpjbyA9IGNvcm91dGluZS5jcmVhdGUoZnVuY3Rpb24gKHgpCiAgICAgICBsb2NhbCBhID0gMQogICAgICAgY29yb3V0aW5lLnlpZWxkKGRlYnVnLmdldGluZm8oMSwgImwiKSkKICAgICAgIGNvcm91dGluZS55aWVsZChkZWJ1Zy5nZXRpbmZvKDEsICJsIikuY3VycmVudGxpbmUpCiAgICAgICByZXR1cm4gYQogICAgIGVuZCkKCmxvY2FsIHRyID0ge30KbG9jYWwgZm9vID0gZnVuY3Rpb24gKGUsIGwpIGlmIGwgdGhlbiB0YWJsZS5pbnNlcnQodHIsIGwpIGVuZCBlbmQKZGVidWcuc2V0aG9vayhjbywgZm9vLCAibGNyIikKCmxvY2FsIF8sIGwgPSBjb3JvdXRpbmUucmVzdW1lKGNvLCAxMCkKbG9jYWwgeCA9IGRlYnVnLmdldGluZm8oY28sIDEsICJsZkxTIikKYXNzZXJ0KHguY3VycmVudGxpbmUgPT0gbC5jdXJyZW50bGluZSBhbmQgeC5hY3RpdmVsaW5lc1t4LmN1cnJlbnRsaW5lXSkKYXNzZXJ0KHR5cGUoeC5mdW5jKSA9PSAiZnVuY3Rpb24iKQpmb3IgaT14LmxpbmVkZWZpbmVkICsgMSwgeC5sYXN0bGluZWRlZmluZWQgZG8KICBhc3NlcnQoeC5hY3RpdmVsaW5lc1tpXSkKICB4LmFjdGl2ZWxpbmVzW2ldID0gdW5kZWYKZW5kCmFzc2VydChuZXh0KHguYWN0aXZlbGluZXMpID09IG5pbCkgICAtLSBubyAnZXh0cmEnIGVsZW1lbnRzCmFzc2VydChub3QgZGVidWcuZ2V0aW5mbyhjbywgMikpCmxvY2FsIGEsYiA9IGRlYnVnLmdldGxvY2FsKGNvLCAxLCAxKQphc3NlcnQoYSA9PSAieCIgYW5kIGIgPT0gMTApCmEsYiA9IGRlYnVnLmdldGxvY2FsKGNvLCAxLCAyKQphc3NlcnQoYSA9PSAiYSIgYW5kIGIgPT0gMSkKZGVidWcuc2V0bG9jYWwoY28sIDEsIDIsICJoaSIpCmFzc2VydChkZWJ1Zy5nZXRob29rKGNvKSA9PSBmb28pCmFzc2VydCgjdHIgPT0gMiBhbmQKICAgICAgIHRyWzFdID09IGwuY3VycmVudGxpbmUtMSBhbmQgdHJbMl0gPT0gbC5jdXJyZW50bGluZSkKCmEsYixjID0gcGNhbGwoY29yb3V0aW5lLnJlc3VtZSwgY28pCmFzc2VydChhIGFuZCBiIGFuZCBjID09IGwuY3VycmVudGxpbmUrMSkKY2hlY2t0cmFjZWJhY2soY28sIHsieWllbGQiLCAiaW4gZnVuY3Rpb24gPCJ9KQoKYSxiID0gY29yb3V0aW5lLnJlc3VtZShjbykKYXNzZXJ0KGEgYW5kIGIgPT0gImhpIikKYXNzZXJ0KCN0ciA9PSA0IGFuZCB0cls0XSA9PSBsLmN1cnJlbnRsaW5lKzIpCmFzc2VydChkZWJ1Zy5nZXRob29rKGNvKSA9PSBmb28pCmFzc2VydChub3QgZGVidWcuZ2V0aG9vaygpKQpjaGVja3RyYWNlYmFjayhjbywge30pCgoKLS0gY2hlY2sgZ2V0L3NldGxvY2FsIGluIGNvcm91dGluZXMKY28gPSBjb3JvdXRpbmUuY3JlYXRlKGZ1bmN0aW9uICh4KQogIGxvY2FsIGEsIGIgPSBjb3JvdXRpbmUueWllbGQoeCkKICBhc3NlcnQoYSA9PSAxMDAgYW5kIGIgPT0gbmlsKQogIHJldHVybiB4CmVuZCkKYSwgYiA9IGNvcm91dGluZS5yZXN1bWUoY28sIDEwKQphc3NlcnQoYSBhbmQgYiA9PSAxMCkKYSwgYiA9IGRlYnVnLmdldGxvY2FsKGNvLCAxLCAxKQphc3NlcnQoYSA9PSAieCIgYW5kIGIgPT0gMTApCmFzc2VydChub3QgZGVidWcuZ2V0bG9jYWwoY28sIDEsIDUpKQphc3NlcnQoZGVidWcuc2V0bG9jYWwoY28sIDEsIDEsIDMwKSA9PSAieCIpCmFzc2VydChub3QgZGVidWcuc2V0bG9jYWwoY28sIDEsIDUsIDQwKSkKYSwgYiA9IGNvcm91dGluZS5yZXN1bWUoY28sIDEwMCkKYXNzZXJ0KGEgYW5kIGIgPT0gMzApCgoKLS0gY2hlY2sgdHJhY2ViYWNrIG9mIHN1c3BlbmRlZCAob3IgZGVhZCB3aXRoIGVycm9yKSBjb3JvdXRpbmVzCgpmdW5jdGlvbiBmKGkpCiAgaWYgaSA9PSAwIHRoZW4gZXJyb3IoaSkKICBlbHNlIGNvcm91dGluZS55aWVsZCgpOyBmKGktMSkKICBlbmQKZW5kCgoKY28gPSBjb3JvdXRpbmUuY3JlYXRlKGZ1bmN0aW9uICh4KSBmKHgpIGVuZCkKYSwgYiA9IGNvcm91dGluZS5yZXN1bWUoY28sIDMpCnQgPSB7Iidjb3JvdXRpbmUueWllbGQnIiwgIidmJyIsICJpbiBmdW5jdGlvbiA8In0Kd2hpbGUgY29yb3V0aW5lLnN0YXR1cyhjbykgPT0gInN1c3BlbmRlZCIgZG8KICBjaGVja3RyYWNlYmFjayhjbywgdCkKICBhLCBiID0gY29yb3V0aW5lLnJlc3VtZShjbykKICB0YWJsZS5pbnNlcnQodCwgMiwgIidmJyIpICAgLS0gb25lIG1vcmUgcmVjdXJzaXZlIGNhbGwgdG8gJ2YnCmVuZAp0WzFdID0gIidlcnJvciciCmNoZWNrdHJhY2ViYWNrKGNvLCB0KQoKCi0tIHRlc3QgYWNlc3NpbmcgbGluZSBudW1iZXJzIG9mIGEgY29yb3V0aW5lIGZyb20gYSByZXN1bWUgaW5zaWRlCi0tIGEgQyBmdW5jdGlvbiAodGhpcyBpcyBhIGtub3duIGJ1ZyBpbiBMdWEgNS4wKQoKbG9jYWwgZnVuY3Rpb24gZyh4KQogICAgY29yb3V0aW5lLnlpZWxkKHgpCmVuZAoKbG9jYWwgZnVuY3Rpb24gZiAoaSkKICBkZWJ1Zy5zZXRob29rKGZ1bmN0aW9uICgpIGVuZCwgImwiKQogIGZvciBqPTEsMTAwMCBkbwogICAgZyhpK2opCiAgZW5kCmVuZAoKbG9jYWwgY28gPSBjb3JvdXRpbmUud3JhcChmKQpjbygxMCkKcGNhbGwoY28pCnBjYWxsKGNvKQoKCmFzc2VydCh0eXBlKGRlYnVnLmdldHJlZ2lzdHJ5KCkpID09ICJ0YWJsZSIpCgoKLS0gdGVzdCB0YWdtZXRob2QgaW5mb3JtYXRpb24KbG9jYWwgYSA9IHt9CmxvY2FsIGZ1bmN0aW9uIGYgKHQpCiAgbG9jYWwgaW5mbyA9IGRlYnVnLmdldGluZm8oMSk7CiAgYXNzZXJ0KGluZm8ubmFtZXdoYXQgPT0gIm1ldGFtZXRob2QiKQogIGEub3AgPSBpbmZvLm5hbWUKICByZXR1cm4gaW5mby5uYW1lCmVuZApzZXRtZXRhdGFibGUoYSwgewogIF9faW5kZXggPSBmOyBfX2FkZCA9IGY7IF9fZGl2ID0gZjsgX19tb2QgPSBmOyBfX2NvbmNhdCA9IGY7IF9fcG93ID0gZjsKICBfX211bCA9IGY7IF9faWRpdiA9IGY7IF9fdW5tID0gZjsgX19sZW4gPSBmOyBfX3N1YiA9IGY7CiAgX19zaGwgPSBmOyBfX3NociA9IGY7IF9fYm9yID0gZjsgX19ieG9yID0gZjsKICBfX2VxID0gZjsgX19sZSA9IGY7IF9fbHQgPSBmOyBfX3VubSA9IGY7IF9fbGVuID0gZjsgX19iYW5kID0gZjsKICBfX2Jub3QgPSBmOwp9KQoKbG9jYWwgYiA9IHNldG1ldGF0YWJsZSh7fSwgZ2V0bWV0YXRhYmxlKGEpKQoKYXNzZXJ0KGFbM10gPT0gImluZGV4IiBhbmQgYV4zID09ICJwb3ciIGFuZCBhLi5hID09ICJjb25jYXQiKQphc3NlcnQoYS8zID09ICJkaXYiIGFuZCAzJWEgPT0gIm1vZCIpCmFzc2VydChhKzMgPT0gImFkZCIgYW5kIDMtYSA9PSAic3ViIiBhbmQgYSozID09ICJtdWwiIGFuZAogICAgICAgLWEgPT0gInVubSIgYW5kICNhID09ICJsZW4iIGFuZCBhJjMgPT0gImJhbmQiKQphc3NlcnQoYSArIDMwMDAwID09ICJhZGQiIGFuZCBhIC0gMy4wID09ICJzdWIiIGFuZCBhICogMy4wID09ICJtdWwiIGFuZAogICAgICAgLWEgPT0gInVubSIgYW5kICNhID09ICJsZW4iIGFuZCBhICYgMyA9PSAiYmFuZCIpCmFzc2VydChhfDMgPT0gImJvciIgYW5kIDN+YSA9PSAiYnhvciIgYW5kIGE8PDMgPT0gInNobCIgYW5kIGE+PjEgPT0gInNociIpCmFzc2VydCAoYT09YiBhbmQgYS5vcCA9PSAiZXEiKQphc3NlcnQgKGE+PWIgYW5kIGEub3AgPT0gImxlIikKYXNzZXJ0ICgieCI+PWEgYW5kIGEub3AgPT0gImxlIikKYXNzZXJ0IChhPmIgYW5kIGEub3AgPT0gImx0IikKYXNzZXJ0IChhPjEwIGFuZCBhLm9wID09ICJsdCIpCmFzc2VydCh+YSA9PSAiYm5vdCIpCgpkbyAgIC0tIHRlc3RpbmcgZm9yLWl0ZXJhdG9yIG5hbWUKICBsb2NhbCBmdW5jdGlvbiBmKCkKICAgIGFzc2VydChkZWJ1Zy5nZXRpbmZvKDEpLm5hbWUgPT0gImZvciBpdGVyYXRvciIpCiAgZW5kCgogIGZvciBpIGluIGYgZG8gZW5kCmVuZAoKCmRvICAgLS0gdGVzdGluZyBkZWJ1ZyBpbmZvIGZvciBmaW5hbGl6ZXJzCiAgbG9jYWwgbmFtZSA9IG5pbAoKICAtLSBjcmVhdGUgYSBwaWVjZSBvZiBnYXJiYWdlIHdpdGggYSBmaW5hbGl6ZXIKICBzZXRtZXRhdGFibGUoe30sIHtfX2djID0gZnVuY3Rpb24gKCkKICAgIGxvY2FsIHQgPSBkZWJ1Zy5nZXRpbmZvKDEpICAgLS0gZ2V0IGZ1bmN0aW9uIGluZm9ybWF0aW9uCiAgICBhc3NlcnQodC5uYW1ld2hhdCA9PSAibWV0YW1ldGhvZCIpCiAgICBuYW1lID0gdC5uYW1lCiAgZW5kfSkKCiAgLS0gcmVwZWF0IHVudGlsIHByZXZpb3VzIGZpbmFsaXplciBydW5zIChzZXR0aW5nICduYW1lJykKICByZXBlYXQgbG9jYWwgYSA9IHt9IHVudGlsIG5hbWUKICBhc3NlcnQobmFtZSA9PSAiX19nYyIpCmVuZAoKCmRvCiAgcHJpbnQoInRlc3RpbmcgdHJhY2ViYWNrIHNpemVzIikKCiAgbG9jYWwgZnVuY3Rpb24gY291bnRsaW5lcyAocykKICAgIHJldHVybiBzZWxlY3QoMiwgc3RyaW5nLmdzdWIocywgIlxuIiwgIiIpKQogIGVuZAoKICBsb2NhbCBmdW5jdGlvbiBkZWVwIChsdmwsIG4pCiAgICBpZiBsdmwgPT0gMCB0aGVuCiAgICAgIHJldHVybiAoZGVidWcudHJhY2ViYWNrKCJtZXNzYWdlIiwgbikpCiAgICBlbHNlCiAgICAgIHJldHVybiAoZGVlcChsdmwtMSwgbikpCiAgICBlbmQKICBlbmQKCiAgbG9jYWwgZnVuY3Rpb24gY2hlY2tkZWVwICh0b3RhbCwgc3RhcnQpCiAgICBsb2NhbCBzID0gZGVlcCh0b3RhbCwgc3RhcnQpCiAgICBsb2NhbCByZXN0ID0gc3RyaW5nLm1hdGNoKHMsICJebWVzc2FnZVxuc3RhY2sgdHJhY2ViYWNrOlxuKC4qKSQiKQogICAgbG9jYWwgY2wgPSBjb3VudGxpbmVzKHJlc3QpCiAgICAtLSBhdCBtb3N0IDEwIGxpbmVzIGluIGZpcnN0IHBhcnQsIDExIGluIHNlY29uZCwgcGx1cyAnLi4uJwogICAgYXNzZXJ0KGNsIDw9IDEwICsgMTEgKyAxKQogICAgbG9jYWwgYnJrID0gc3RyaW5nLmZpbmQocmVzdCwgIiUuJS4lLiIpCiAgICBpZiBicmsgdGhlbiAgIC0tIGRvZXMgbWVzc2FnZSBoYXZlICcuLi4nPwogICAgICBsb2NhbCByZXN0MSA9IHN0cmluZy5zdWIocmVzdCwgMSwgYnJrKQogICAgICBsb2NhbCByZXN0MiA9IHN0cmluZy5zdWIocmVzdCwgYnJrLCAjcmVzdCkKICAgICAgYXNzZXJ0KGNvdW50bGluZXMocmVzdDEpID09IDEwIGFuZCBjb3VudGxpbmVzKHJlc3QyKSA9PSAxMSkKICAgIGVsc2UKICAgICAgYXNzZXJ0KGNsID09IHRvdGFsIC0gc3RhcnQgKyAyKQogICAgZW5kCiAgZW5kCgogIGZvciBkID0gMSwgNTEsIDEwIGRvCiAgICBmb3IgbCA9IDEsIGQgZG8KICAgICAgLS0gdXNlIGNvcm91dGluZXMgdG8gZW5zdXJlIGNvbXBsZXRlIGNvbnRyb2wgb2YgdGhlIHN0YWNrCiAgICAgIGNvcm91dGluZS53cmFwKGNoZWNrZGVlcCkoZCwgbCkKICAgIGVuZAogIGVuZAoKZW5kCgoKcHJpbnQoInRlc3RpbmcgZGVidWcgZnVuY3Rpb25zIG9uIGNodW5rIHdpdGhvdXQgZGVidWcgaW5mbyIpCmxvY2FsIHByb2cgPSBbWy0tIHByb2dyYW0gdG8gYmUgbG9hZGVkIHdpdGhvdXQgZGVidWcgaW5mb3JtYXRpb24gKHN0cmlwKQpsb2NhbCBkZWJ1ZyA9IHJlcXVpcmUnZGVidWcnCmxvY2FsIGEgPSAxMiAgLS0gYSBsb2NhbCB2YXJpYWJsZQoKbG9jYWwgbiwgdiA9IGRlYnVnLmdldGxvY2FsKDEsIDEpCmFzc2VydChuID09ICIodGVtcG9yYXJ5KSIgYW5kIHYgPT0gZGVidWcpICAgLS0gdW5rb3duIG5hbWUgYnV0IGtub3duIHZhbHVlCm4sIHYgPSBkZWJ1Zy5nZXRsb2NhbCgxLCAyKQphc3NlcnQobiA9PSAiKHRlbXBvcmFyeSkiIGFuZCB2ID09IDEyKSAgIC0tIHVua293biBuYW1lIGJ1dCBrbm93biB2YWx1ZQoKLS0gYSBmdW5jdGlvbiB3aXRoIGFuIHVwdmFsdWUKbG9jYWwgZiA9IGZ1bmN0aW9uICgpIGxvY2FsIHg7IHJldHVybiBhIGVuZApuLCB2ID0gZGVidWcuZ2V0dXB2YWx1ZShmLCAxKQphc3NlcnQobiA9PSAiKG5vIG5hbWUpIiBhbmQgdiA9PSAxMikKYXNzZXJ0KGRlYnVnLnNldHVwdmFsdWUoZiwgMSwgMTMpID09ICIobm8gbmFtZSkiKQphc3NlcnQoYSA9PSAxMykKCmxvY2FsIHQgPSBkZWJ1Zy5nZXRpbmZvKGYpCmFzc2VydCh0Lm5hbWUgPT0gbmlsIGFuZCB0LmxpbmVkZWZpbmVkID4gMCBhbmQKICAgICAgIHQubGFzdGxpbmVkZWZpbmVkID09IHQubGluZWRlZmluZWQgYW5kCiAgICAgICB0LnNob3J0X3NyYyA9PSAiPyIpCmFzc2VydChkZWJ1Zy5nZXRpbmZvKDEpLmN1cnJlbnRsaW5lID09IC0xKQoKdCA9IGRlYnVnLmdldGluZm8oZiwgIkwiKS5hY3RpdmVsaW5lcwphc3NlcnQobmV4dCh0KSA9PSBuaWwpICAgIC0tIGFjdGl2ZSBsaW5lcyBhcmUgZW1wdHkKCi0tIGR1bXAvbG9hZCBhIGZ1bmN0aW9uIHdpdGhvdXQgZGVidWcgaW5mbwpmID0gbG9hZChzdHJpbmcuZHVtcChmKSkKCnQgPSBkZWJ1Zy5nZXRpbmZvKGYpCmFzc2VydCh0Lm5hbWUgPT0gbmlsIGFuZCB0LmxpbmVkZWZpbmVkID4gMCBhbmQKICAgICAgIHQubGFzdGxpbmVkZWZpbmVkID09IHQubGluZWRlZmluZWQgYW5kCiAgICAgICB0LnNob3J0X3NyYyA9PSAiPyIpCmFzc2VydChkZWJ1Zy5nZXRpbmZvKDEpLmN1cnJlbnRsaW5lID09IC0xKQoKcmV0dXJuIGEKXV0KCgotLSBsb2FkICdwcm9nJyB3aXRob3V0IGRlYnVnIGluZm8KbG9jYWwgZiA9IGFzc2VydChsb2FkKHN0cmluZy5kdW1wKGxvYWQocHJvZyksIHRydWUpKSkKCmFzc2VydChmKCkgPT0gMTMpCgpkbyAgIC0tIGJ1ZyBpbiA1LjQuMDogbGluZSBob29rcyBpbiBzdHJpcHBlZCBjb2RlCiAgbG9jYWwgZnVuY3Rpb24gZm9vICgpCiAgICBsb2NhbCBhID0gMQogICAgbG9jYWwgYiA9IDIKICAgIHJldHVybiBiCiAgZW5kCgogIGxvY2FsIHMgPSBsb2FkKHN0cmluZy5kdW1wKGZvbywgdHJ1ZSkpCiAgbG9jYWwgbGluZSA9IHRydWUKICBkZWJ1Zy5zZXRob29rKGZ1bmN0aW9uIChlLCBsKQogICAgYXNzZXJ0KGUgPT0gImxpbmUiKQogICAgbGluZSA9IGwKICBlbmQsICJsIikKICBhc3NlcnQocygpID09IDIpOyBkZWJ1Zy5zZXRob29rKG5pbCkKICBhc3NlcnQobGluZSA9PSBuaWwpICAtLSBob29rIGNhbGxlZCB3aXRob3VnIGRlYnVnIGluZm8gZm9yIDFzdCBpbnN0cnVjdGlvbgplbmQKCmRvICAgLS0gdGVzdHMgZm9yICdzb3VyY2UnIGluIGJpbmFyeSBkdW1wcwogIGxvY2FsIHByb2cgPSBbWwogICAgcmV0dXJuIGZ1bmN0aW9uICh4KQogICAgICByZXR1cm4gZnVuY3Rpb24gKHkpIAogICAgICAgIHJldHVybiB4ICsgeQogICAgICBlbmQKICAgIGVuZAogIF1dCiAgbG9jYWwgbmFtZSA9IHN0cmluZy5yZXAoIngiLCAxMDAwKQogIGxvY2FsIHAgPSBhc3NlcnQobG9hZChwcm9nLCBuYW1lKSkKICAtLSBsb2FkICdwJyBhcyBhIGJpbmFyeSBjaHVuayB3aXRoIGRlYnVnIGluZm9ybWF0aW9uCiAgbG9jYWwgYyA9IHN0cmluZy5kdW1wKHApCiAgYXNzZXJ0KCNjID4gMTAwMCBhbmQgI2MgPCAyMDAwKSAgIC0tIG5vIHJlcGV0aXRpb24gb2YgJ3NvdXJjZScgaW4gZHVtcAogIGxvY2FsIGYgPSBhc3NlcnQobG9hZChjKSkKICBsb2NhbCBnID0gZigpCiAgbG9jYWwgaCA9IGcoMykKICBhc3NlcnQoaCg1KSA9PSA4KQogIGFzc2VydChkZWJ1Zy5nZXRpbmZvKGYpLnNvdXJjZSA9PSBuYW1lIGFuZCAgIC0tIGFsbCBmdW5jdGlvbnMgaGF2ZSAnc291cmNlJwogICAgICAgICBkZWJ1Zy5nZXRpbmZvKGcpLnNvdXJjZSA9PSBuYW1lIGFuZCAKICAgICAgICAgZGVidWcuZ2V0aW5mbyhoKS5zb3VyY2UgPT0gbmFtZSkKICAtLSBhZ2Fpbiwgd2l0aG91dCBkZWJ1ZyBpbmZvCiAgbG9jYWwgYyA9IHN0cmluZy5kdW1wKHAsIHRydWUpCiAgYXNzZXJ0KCNjIDwgNTAwKSAgIC0tIG5vICdzb3VyY2UnIGluIGR1bXAKICBsb2NhbCBmID0gYXNzZXJ0KGxvYWQoYykpCiAgbG9jYWwgZyA9IGYoKQogIGxvY2FsIGggPSBnKDMwKQogIGFzc2VydChoKDUwKSA9PSA4MCkKICBhc3NlcnQoZGVidWcuZ2V0aW5mbyhmKS5zb3VyY2UgPT0gJz0/JyBhbmQgICAtLSBubyBmdW5jdGlvbiBoYXMgJ3NvdXJjZScKICAgICAgICAgZGVidWcuZ2V0aW5mbyhnKS5zb3VyY2UgPT0gJz0/JyBhbmQgCiAgICAgICAgIGRlYnVnLmdldGluZm8oaCkuc291cmNlID09ICc9PycpCmVuZAoKcHJpbnQiT0siCgo=