Skip to content

Instantly share code, notes, and snippets.

@rsmnarts
Created March 4, 2022 02:16
Show Gist options
  • Save rsmnarts/913749894183e2c18d337a04e782c8bb to your computer and use it in GitHub Desktop.
Save rsmnarts/913749894183e2c18d337a04e782c8bb to your computer and use it in GitHub Desktop.
{"created_by":"Tampermonkey","version":"1","scripts":[{"name":"AdsBypasser","options":{"check_for_updates":true,"comment":null,"compatopts_for_requires":true,"compat_wrappedjsobject":false,"compat_metadata":false,"compat_foreach":false,"compat_prototypes":false,"noframes":null,"unwrap":null,"run_at":null,"tab_types":null,"override":{"use_includes":[],"orig_includes":["http://*","https://*"],"merge_includes":true,"use_matches":[],"orig_matches":[],"merge_matches":true,"use_excludes":[],"orig_excludes":[],"merge_excludes":true,"use_connects":[],"orig_connects":["*"],"merge_connects":true,"use_blockers":[],"orig_run_at":"document-start","orig_noframes":null}},"storage":{"ts":1646360105692,"data":{"version":"n4","external_server_support":"bfalse","log_level":"n1","change_background":"btrue","scale_image":"btrue","align_center":"btrue","redirect_image":"btrue"}},"enabled":true,"position":1,"file_url":"https://adsbypasser.github.io/releases/adsbypasser.full.es7.user.js","uuid":"d7e4657f-37d1-485d-8268-e618168a42d1","source":"Ly8gPT1Vc2VyU2NyaXB0PT0KLy8gQG5hbWUgICAgICAgICAgIEFkc0J5cGFzc2VyCi8vIEBuYW1lc3BhY2UgICAgICBBZHNCeXBhc3NlcgovLyBAZGVzY3JpcHRpb24gICAgQnlwYXNzIEFkcwovLyBAY29weXJpZ2h0ICAgICAgMjAxMissIFdlaS1DaGVuZyBQYW4sIGh0dHBzOi8vYWRzYnlwYXNzZXIuZ2l0aHViLmlvLwovLyBAdmVyc2lvbiAgICAgICAgNy4xOS4wCi8vIEBsaWNlbnNlICAgICAgICBCU0QKLy8gQGhvbWVwYWdlVVJMICAgIGh0dHBzOi8vYWRzYnlwYXNzZXIuZ2l0aHViLmlvLwovLyBAc3VwcG9ydFVSTCAgICAgaHR0cHM6Ly9naXRodWIuY29tL2Fkc2J5cGFzc2VyL2Fkc2J5cGFzc2VyL2lzc3VlcwovLyBAdXBkYXRlVVJMICAgICAgaHR0cHM6Ly9hZHNieXBhc3Nlci5naXRodWIuaW8vcmVsZWFzZXMvYWRzYnlwYXNzZXIuZnVsbC5lczcubWV0YS5qcwovLyBAZG93bmxvYWRVUkwgICAgaHR0cHM6Ly9hZHNieXBhc3Nlci5naXRodWIuaW8vcmVsZWFzZXMvYWRzYnlwYXNzZXIuZnVsbC5lczcudXNlci5qcwovLyBAaWNvbiAgICAgICAgICAgaHR0cHM6Ly9yYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tL2Fkc2J5cGFzc2VyL2Fkc2J5cGFzc2VyL3Y3LjE5LjAvcmVzb3VyY2VzL2ltZy9sb2dvLnBuZwovLyBAZ3JhbnQgICAgICAgICAgR01fZGVsZXRlVmFsdWUKLy8gQGdyYW50ICAgICAgICAgIEdNX2dldFJlc291cmNlVVJMCi8vIEBncmFudCAgICAgICAgICBHTV9nZXRWYWx1ZQovLyBAZ3JhbnQgICAgICAgICAgR01fb3BlbkluVGFiCi8vIEBncmFudCAgICAgICAgICBHTV9yZWdpc3Rlck1lbnVDb21tYW5kCi8vIEBncmFudCAgICAgICAgICBHTV9zZXRWYWx1ZQovLyBAZ3JhbnQgICAgICAgICAgR01feG1saHR0cFJlcXVlc3QKLy8gQGdyYW50ICAgICAgICAgIEdNLmRlbGV0ZVZhbHVlCi8vIEBncmFudCAgICAgICAgICBHTS5nZXRSZXNvdXJjZVVybAovLyBAZ3JhbnQgICAgICAgICAgR00uZ2V0VmFsdWUKLy8gQGdyYW50ICAgICAgICAgIEdNLm9wZW5JblRhYgovLyBAZ3JhbnQgICAgICAgICAgR00uc2V0VmFsdWUKLy8gQGdyYW50ICAgICAgICAgIEdNLnhtbEh0dHBSZXF1ZXN0Ci8vIEBncmFudCAgICAgICAgICB1bnNhZmVXaW5kb3cKLy8gQHJlc291cmNlICAgICAgIGFsaWduQ2VudGVyIGh0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9hZHNieXBhc3Nlci9hZHNieXBhc3Nlci92Ny4xOS4wL3Jlc291cmNlcy9jc3MvYWxpZ25fY2VudGVyLmNzcwovLyBAcmVzb3VyY2UgICAgICAgc2NhbGVJbWFnZSBodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vYWRzYnlwYXNzZXIvYWRzYnlwYXNzZXIvdjcuMTkuMC9yZXNvdXJjZXMvY3NzL3NjYWxlX2ltYWdlLmNzcwovLyBAcmVzb3VyY2UgICAgICAgYmdJbWFnZSBodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vYWRzYnlwYXNzZXIvYWRzYnlwYXNzZXIvdjcuMTkuMC9yZXNvdXJjZXMvaW1nL2ltYWdlZG9jLWRhcmtub2lzZS5wbmcKLy8gQHJ1bi1hdCAgICAgICAgIGRvY3VtZW50LXN0YXJ0Ci8vIEBpbmNsdWRlICAgICAgICBodHRwOi8vKgovLyBAaW5jbHVkZSAgICAgICAgaHR0cHM6Ly8qCi8vIEBjb25uZWN0ICAgICAgICAqCi8vID09L1VzZXJTY3JpcHQ9PQoKIChmdW5jdGlvbihtb2R1bGVzKSB7IAogCXZhciBpbnN0YWxsZWRNb2R1bGVzID0ge307CiAJZnVuY3Rpb24gX193ZWJwYWNrX3JlcXVpcmVfXyhtb2R1bGVJZCkgewogCQlpZihpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXSkgewogCQkJcmV0dXJuIGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdLmV4cG9ydHM7CiAJCX0KIAkJdmFyIG1vZHVsZSA9IGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdID0gewogCQkJaTogbW9kdWxlSWQsCiAJCQlsOiBmYWxzZSwKIAkJCWV4cG9ydHM6IHt9CiAJCX07CiAJCW1vZHVsZXNbbW9kdWxlSWRdLmNhbGwobW9kdWxlLmV4cG9ydHMsIG1vZHVsZSwgbW9kdWxlLmV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pOwogCQltb2R1bGUubCA9IHRydWU7CiAJCXJldHVybiBtb2R1bGUuZXhwb3J0czsKIAl9CiAJX193ZWJwYWNrX3JlcXVpcmVfXy5tID0gbW9kdWxlczsKIAlfX3dlYnBhY2tfcmVxdWlyZV9fLmMgPSBpbnN0YWxsZWRNb2R1bGVzOwogCV9fd2VicGFja19yZXF1aXJlX18uZCA9IGZ1bmN0aW9uKGV4cG9ydHMsIG5hbWUsIGdldHRlcikgewogCQlpZighX193ZWJwYWNrX3JlcXVpcmVfXy5vKGV4cG9ydHMsIG5hbWUpKSB7CiAJCQlPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgbmFtZSwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGdldHRlciB9KTsKIAkJfQogCX07CiAJX193ZWJwYWNrX3JlcXVpcmVfXy5yID0gZnVuY3Rpb24oZXhwb3J0cykgewogCQlpZih0eXBlb2YgU3ltYm9sICE9PSAndW5kZWZpbmVkJyAmJiBTeW1ib2wudG9TdHJpbmdUYWcpIHsKIAkJCU9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBTeW1ib2wudG9TdHJpbmdUYWcsIHsgdmFsdWU6ICdNb2R1bGUnIH0pOwogCQl9CiAJCU9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAnX19lc01vZHVsZScsIHsgdmFsdWU6IHRydWUgfSk7CiAJfTsKIAlfX3dlYnBhY2tfcmVxdWlyZV9fLnQgPSBmdW5jdGlvbih2YWx1ZSwgbW9kZSkgewogCQlpZihtb2RlICYgMSkgdmFsdWUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKHZhbHVlKTsKIAkJaWYobW9kZSAmIDgpIHJldHVybiB2YWx1ZTsKIAkJaWYoKG1vZGUgJiA0KSAmJiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmIHZhbHVlICYmIHZhbHVlLl9fZXNNb2R1bGUpIHJldHVybiB2YWx1ZTsKIAkJdmFyIG5zID0gT2JqZWN0LmNyZWF0ZShudWxsKTsKIAkJX193ZWJwYWNrX3JlcXVpcmVfXy5yKG5zKTsKIAkJT2JqZWN0LmRlZmluZVByb3BlcnR5KG5zLCAnZGVmYXVsdCcsIHsgZW51bWVyYWJsZTogdHJ1ZSwgdmFsdWU6IHZhbHVlIH0pOwogCQlpZihtb2RlICYgMiAmJiB0eXBlb2YgdmFsdWUgIT0gJ3N0cmluZycpIGZvcih2YXIga2V5IGluIHZhbHVlKSBfX3dlYnBhY2tfcmVxdWlyZV9fLmQobnMsIGtleSwgZnVuY3Rpb24oa2V5KSB7IHJldHVybiB2YWx1ZVtrZXldOyB9LmJpbmQobnVsbCwga2V5KSk7CiAJCXJldHVybiBuczsKIAl9OwogCV9fd2VicGFja19yZXF1aXJlX18ubiA9IGZ1bmN0aW9uKG1vZHVsZSkgewogCQl2YXIgZ2V0dGVyID0gbW9kdWxlICYmIG1vZHVsZS5fX2VzTW9kdWxlID8KIAkJCWZ1bmN0aW9uIGdldERlZmF1bHQoKSB7IHJldHVybiBtb2R1bGVbJ2RlZmF1bHQnXTsgfSA6CiAJCQlmdW5jdGlvbiBnZXRNb2R1bGVFeHBvcnRzKCkgeyByZXR1cm4gbW9kdWxlOyB9OwogCQlfX3dlYnBhY2tfcmVxdWlyZV9fLmQoZ2V0dGVyLCAnYScsIGdldHRlcik7CiAJCXJldHVybiBnZXR0ZXI7CiAJfTsKIAlfX3dlYnBhY2tfcmVxdWlyZV9fLm8gPSBmdW5jdGlvbihvYmplY3QsIHByb3BlcnR5KSB7IHJldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqZWN0LCBwcm9wZXJ0eSk7IH07CiAJX193ZWJwYWNrX3JlcXVpcmVfXy5wID0gIiI7CiAJcmV0dXJuIF9fd2VicGFja19yZXF1aXJlX18oX193ZWJwYWNrX3JlcXVpcmVfXy5zID0gMCk7CiB9KQogKFsKIChmdW5jdGlvbihtb2R1bGUsIF9fd2VicGFja19leHBvcnRzX18sIF9fd2VicGFja19yZXF1aXJlX18pIHsKInVzZSBzdHJpY3QiOwpfX3dlYnBhY2tfcmVxdWlyZV9fLnIoX193ZWJwYWNrX2V4cG9ydHNfXyk7CiB2YXIgdXRpbF9jb3JlX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEpOwogdmFyIHV0aWxfZGlzcGF0Y2hlcl9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMV9fID0gX193ZWJwYWNrX3JlcXVpcmVfXygyKTsKIHZhciB1dGlsX3BsYXRmb3JtX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8yX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDMpOwogdmFyIHV0aWxfY29uZmlnX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8zX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDQpOwogdmFyIHV0aWxfbG9nZ2VyX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV80X18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDUpOwogdmFyIF9BRFNCWVBBU1NFUl9IQU5ETEVSU19fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzVfXyA9IF9fd2VicGFja19yZXF1aXJlX18oNik7CmNvbnN0IGlzU2FmYXJpID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHdpbmRvdy5IVE1MRWxlbWVudCkuaW5kZXhPZignQ29uc3RydWN0b3InKSA+IDA7CmZ1bmN0aW9uIGRpc2FibGVXaW5kb3dPcGVuICgpIHsKICB0cnkgewogICAgdXRpbF9wbGF0Zm9ybV9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMl9fWyJ1c3ciXS5vcGVuID0gZnVuY3Rpb24gKCkgewogICAgICByZXR1cm4gewogICAgICAgIGNsb3NlZDogZmFsc2UsCiAgICAgIH07CiAgICB9OwogIH0gY2F0Y2ggKGUpIHsKICAgIE9iamVjdCh1dGlsX2xvZ2dlcl9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfNF9fWyJ3YXJuIl0pKCdjYW5ub3QgbW9jayB3aW5kb3cub3BlbicpOwogIH0KICB1dGlsX3BsYXRmb3JtX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8yX19bInVzdyJdLmFsZXJ0ID0gdXRpbF9jb3JlX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIm5vcCJdOwogIHV0aWxfcGxhdGZvcm1fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzJfX1sidXN3Il0uY29uZmlybSA9IHV0aWxfY29yZV9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyJub3AiXTsKfQpmdW5jdGlvbiBkaXNhYmxlTGVhdmVQcm9tcHQgKGVsZW1lbnQpIHsKICBpZiAoIWVsZW1lbnQpIHsKICAgIHJldHVybjsKICB9CiAgY29uc3Qgc2VhbCA9IHsKICAgIHNldDogZnVuY3Rpb24gKCkgewogICAgICBPYmplY3QodXRpbF9sb2dnZXJfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzRfX1siaW5mbyJdKSgnYmxvY2tlZCBvbmJlZm9yZXVubG9hZCcpOwogICAgfSwKICB9OwogIGVsZW1lbnQub25iZWZvcmV1bmxvYWQgPSB1bmRlZmluZWQ7CiAgaWYgKGlzU2FmYXJpKSB7CiAgICBlbGVtZW50Ll9fZGVmaW5lU2V0dGVyX18oJ29uYmVmb3JldW5sb2FkJywgc2VhbC5zZXQpOwogIH0gZWxzZSB7CiAgICB1dGlsX3BsYXRmb3JtX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8yX19bInVzdyJdLk9iamVjdC5kZWZpbmVQcm9wZXJ0eShlbGVtZW50LCAnb25iZWZvcmV1bmxvYWQnLCB7CiAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSwKICAgICAgZW51bWVyYWJsZTogZmFsc2UsCiAgICAgIGdldDogdW5kZWZpbmVkLAogICAgICBzZXQ6IHNlYWwuc2V0LAogICAgfSk7CiAgfQogIGNvbnN0IG9hZWwgPSBlbGVtZW50LmFkZEV2ZW50TGlzdGVuZXI7CiAgY29uc3QgbmFlbCA9IGZ1bmN0aW9uICh0eXBlKSB7CiAgICBpZiAodHlwZSA9PT0gJ2JlZm9yZXVubG9hZCcpIHsKICAgICAgT2JqZWN0KHV0aWxfbG9nZ2VyX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV80X19bImluZm8iXSkoJ2Jsb2NrZWQgYWRkRXZlbnRMaXN0ZW5lciBvbmJlZm9yZXVubG9hZCcpOwogICAgICByZXR1cm47CiAgICB9CiAgICByZXR1cm4gb2FlbC5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwogIH07CiAgZWxlbWVudC5hZGRFdmVudExpc3RlbmVyID0gbmFlbDsKfQpmdW5jdGlvbiBjaGFuZ2VUaXRsZSAoKSB7CiAgZG9jdW1lbnQudGl0bGUgKz0gJyAtIEFkc0J5cGFzc2VyJzsKfQphc3luYyBmdW5jdGlvbiBiZWZvcmVET01SZWFkeSAoaGFuZGxlcikgewogIGNvbnN0IGNvbmZpZyA9IGF3YWl0IE9iamVjdCh1dGlsX2NvbmZpZ19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfM19fWyJkdW1wQ29uZmlnIl0pKCk7CiAgT2JqZWN0KHV0aWxfbG9nZ2VyX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV80X19bImluZm8iXSkoJ3dvcmtpbmcgb25cbiVzIFxud2l0aFxuJXMnLCB3aW5kb3cubG9jYXRpb24udG9TdHJpbmcoKSwgSlNPTi5zdHJpbmdpZnkoY29uZmlnKSk7CiAgZGlzYWJsZUxlYXZlUHJvbXB0KHV0aWxfcGxhdGZvcm1fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzJfX1sidXN3Il0pOwogIGRpc2FibGVXaW5kb3dPcGVuKCk7CiAgYXdhaXQgaGFuZGxlci5zdGFydCgpOwp9CmFzeW5jIGZ1bmN0aW9uIGFmdGVyRE9NUmVhZHkgKGhhbmRsZXIpIHsKICBkaXNhYmxlTGVhdmVQcm9tcHQodXRpbF9wbGF0Zm9ybV9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMl9fWyJ1c3ciXS5kb2N1bWVudC5ib2R5KTsKICBjaGFuZ2VUaXRsZSgpOwogIGF3YWl0IGhhbmRsZXIucmVhZHkoKTsKfQpmdW5jdGlvbiB3YWl0RE9NICgpIHsKICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHsKICAgIGlmIChkb2N1bWVudC5yZWFkeVN0YXRlICE9PSAnbG9hZGluZycpIHsKICAgICAgcmVzb2x2ZSgpOwogICAgICByZXR1cm47CiAgICB9CiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdET01Db250ZW50TG9hZGVkJywgKCkgPT4gewogICAgICByZXNvbHZlKCk7CiAgICB9KTsKICB9KTsKfQphc3luYyBmdW5jdGlvbiBtYWluICgpIHsKICBpZiAodXRpbF9wbGF0Zm9ybV9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMl9fWyJyYXdVU1ciXS50b3AgIT09IHV0aWxfcGxhdGZvcm1fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzJfX1sicmF3VVNXIl0uc2VsZikgewogICAgcmV0dXJuOwogIH0KICB1dGlsX3BsYXRmb3JtX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8yX19bIkdNQVBJIl0ucmVnaXN0ZXJNZW51Q29tbWFuZCgnQWRzQnlwYXNzZXIgLSBDb25maWd1cmUnLCAoKSA9PiB7CiAgICB1dGlsX3BsYXRmb3JtX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8yX19bIkdNQVBJIl0ub3BlbkluVGFiKCdodHRwczovL2Fkc2J5cGFzc2VyLmdpdGh1Yi5pby9jb25maWd1cmUuaHRtbCcpOwogIH0pOwogIGF3YWl0IE9iamVjdCh1dGlsX2NvbmZpZ19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfM19fWyJsb2FkQ29uZmlnIl0pKCk7CiAgY29uc3QgaGFuZGxlciA9IE9iamVjdCh1dGlsX2Rpc3BhdGNoZXJfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzFfX1siZmluZEhhbmRsZXIiXSkoKTsKICBpZiAoaGFuZGxlcikgewogICAgYXdhaXQgYmVmb3JlRE9NUmVhZHkoaGFuZGxlcik7CiAgICBhd2FpdCB3YWl0RE9NKCk7CiAgICBhd2FpdCBhZnRlckRPTVJlYWR5KGhhbmRsZXIpOwogICAgcmV0dXJuOwogIH0KfQptYWluKCkuY2F0Y2goKGUpID0+IHsKICBPYmplY3QodXRpbF9sb2dnZXJfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzRfX1sid2FybiJdKShlKTsKfSk7CiB9KSwKIChmdW5jdGlvbihtb2R1bGUsIF9fd2VicGFja19leHBvcnRzX18sIF9fd2VicGFja19yZXF1aXJlX18pIHsKInVzZSBzdHJpY3QiOwpfX3dlYnBhY2tfcmVxdWlyZV9fLnIoX193ZWJwYWNrX2V4cG9ydHNfXyk7CiBfX3dlYnBhY2tfcmVxdWlyZV9fLmQoX193ZWJwYWNrX2V4cG9ydHNfXywgIkFkc0J5cGFzc2VyRXJyb3IiLCBmdW5jdGlvbigpIHsgcmV0dXJuIEFkc0J5cGFzc2VyRXJyb3I7IH0pOwogX193ZWJwYWNrX3JlcXVpcmVfXy5kKF9fd2VicGFja19leHBvcnRzX18sICJldmVyeSIsIGZ1bmN0aW9uKCkgeyByZXR1cm4gZXZlcnk7IH0pOwogX193ZWJwYWNrX3JlcXVpcmVfXy5kKF9fd2VicGFja19leHBvcnRzX18sICJmaW5kIiwgZnVuY3Rpb24oKSB7IHJldHVybiBmaW5kOyB9KTsKIF9fd2VicGFja19yZXF1aXJlX18uZChfX3dlYnBhY2tfZXhwb3J0c19fLCAiZm9yRWFjaCIsIGZ1bmN0aW9uKCkgeyByZXR1cm4gZm9yRWFjaDsgfSk7CiBfX3dlYnBhY2tfcmVxdWlyZV9fLmQoX193ZWJwYWNrX2V4cG9ydHNfXywgImlzU3RyaW5nIiwgZnVuY3Rpb24oKSB7IHJldHVybiBpc1N0cmluZzsgfSk7CiBfX3dlYnBhY2tfcmVxdWlyZV9fLmQoX193ZWJwYWNrX2V4cG9ydHNfXywgIm1hcCIsIGZ1bmN0aW9uKCkgeyByZXR1cm4gbWFwOyB9KTsKIF9fd2VicGFja19yZXF1aXJlX18uZChfX3dlYnBhY2tfZXhwb3J0c19fLCAibm9uZSIsIGZ1bmN0aW9uKCkgeyByZXR1cm4gbm9uZTsgfSk7CiBfX3dlYnBhY2tfcmVxdWlyZV9fLmQoX193ZWJwYWNrX2V4cG9ydHNfXywgIm5vcCIsIGZ1bmN0aW9uKCkgeyByZXR1cm4gbm9wOyB9KTsKIF9fd2VicGFja19yZXF1aXJlX18uZChfX3dlYnBhY2tfZXhwb3J0c19fLCAicGFydGlhbCIsIGZ1bmN0aW9uKCkgeyByZXR1cm4gcGFydGlhbDsgfSk7CiBfX3dlYnBhY2tfcmVxdWlyZV9fLmQoX193ZWJwYWNrX2V4cG9ydHNfXywgInRyeUV2ZXJ5IiwgZnVuY3Rpb24oKSB7IHJldHVybiB0cnlFdmVyeTsgfSk7CiBfX3dlYnBhY2tfcmVxdWlyZV9fLmQoX193ZWJwYWNrX2V4cG9ydHNfXywgIndhaXQiLCBmdW5jdGlvbigpIHsgcmV0dXJuIHdhaXQ7IH0pOwpjbGFzcyBBZHNCeXBhc3NlckVycm9yIGV4dGVuZHMgRXJyb3IgewogIGNvbnN0cnVjdG9yIChtZXNzYWdlKSB7CiAgICBzdXBlcihtZXNzYWdlKTsKICB9CiAgZ2V0IG5hbWUgKCkgewogICAgcmV0dXJuICdBZHNCeXBhc3NlckVycm9yJzsKICB9Cn0KZnVuY3Rpb24gZm9yRWFjaCAoY29sbGVjdGlvbiwgZm4pIHsKICBpZiAoaXNBcnJheUxpa2UoY29sbGVjdGlvbikpIHsKICAgIHJldHVybiBBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKGNvbGxlY3Rpb24sIGZuKTsKICB9CiAgcmV0dXJuIE9iamVjdC5rZXlzKGNvbGxlY3Rpb24pLmZvckVhY2goKGspID0+IHsKICAgIHJldHVybiBmbihjb2xsZWN0aW9uW2tdLCBrLCBjb2xsZWN0aW9uKTsKICB9KTsKfQpmdW5jdGlvbiBldmVyeSAoY29sbGVjdGlvbiwgZm4pIHsKICBpZiAoaXNBcnJheUxpa2UoY29sbGVjdGlvbikpIHsKICAgIHJldHVybiBBcnJheS5wcm90b3R5cGUuZXZlcnkuY2FsbChjb2xsZWN0aW9uLCBmbik7CiAgfQogIHJldHVybiBPYmplY3Qua2V5cyhjb2xsZWN0aW9uKS5ldmVyeSgoaykgPT4gewogICAgcmV0dXJuIGZuKGNvbGxlY3Rpb25ba10sIGssIGNvbGxlY3Rpb24pOwogIH0pOwp9CmZ1bmN0aW9uIG1hcCAoY29sbGVjdGlvbiwgZm4pIHsKICBpZiAoaXNBcnJheUxpa2UoY29sbGVjdGlvbikpIHsKICAgIHJldHVybiBBcnJheS5wcm90b3R5cGUubWFwLmNhbGwoY29sbGVjdGlvbiwgZm4pOwogIH0KICBjb25zdCBtYXBwZWQgPSBPYmplY3QuYXNzaWduKHt9LCBjb2xsZWN0aW9uKTsKICBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhtYXBwZWQpLmZvckVhY2goKGspID0+IHsKICAgIG1hcHBlZFtrXSA9IGZuKGNvbGxlY3Rpb25ba10sIGssIGNvbGxlY3Rpb24pOwogIH0pOwogIHJldHVybiBtYXBwZWQ7Cn0KZnVuY3Rpb24gZmluZCAoY29sbGVjdGlvbiwgZm4pIHsKICBmb3IgKGNvbnN0IFtrLCB2XSBvZiBlbnVtZXJhdGUoY29sbGVjdGlvbikpIHsKICAgIGNvbnN0IHIgPSBmbih2LCBrLCBjb2xsZWN0aW9uKTsKICAgIGlmIChyICE9PSBub25lKSB7CiAgICAgIHJldHVybiBbaywgdiwgcl07CiAgICB9CiAgfQogIHJldHVybiBbbm9uZSwgbm9uZSwgbm9uZV07Cn0KZnVuY3Rpb24gKiBlbnVtZXJhdGUgKGNvbGxlY3Rpb24pIHsKICBpZiAoaXNBcnJheUxpa2UoY29sbGVjdGlvbikpIHsKICAgIHlpZWxkICogQXJyYXkucHJvdG90eXBlLmVudHJpZXMuY2FsbChjb2xsZWN0aW9uKTsKICAgIHJldHVybjsKICB9CiAgY29uc3Qga2V5cyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKGNvbGxlY3Rpb24pOwogIGZvciAoY29uc3QgayBvZiBrZXlzKSB7CiAgICB5aWVsZCBbaywgY29sbGVjdGlvbltrXV07CiAgfQp9CmZ1bmN0aW9uIGlzQXJyYXlMaWtlIChjb2xsZWN0aW9uKSB7CiAgcmV0dXJuIEFycmF5LmlzQXJyYXkoY29sbGVjdGlvbikgfHwgaXNOb2RlTGlzdChjb2xsZWN0aW9uKTsKfQpmdW5jdGlvbiBpc05vZGVMaXN0IChjb2xsZWN0aW9uKSB7CiAgcmV0dXJuIGNvbGxlY3Rpb24uY29uc3RydWN0b3IubmFtZSA9PT0gJ05vZGVMaXN0JzsKfQpmdW5jdGlvbiBwYXJ0aWFsIChmbiwgLi4uYXJncykgewogIGlmICh0eXBlb2YgZm4gIT09ICdmdW5jdGlvbicpIHsKICAgIHRocm93IG5ldyBBZHNCeXBhc3NlckVycm9yKCdtdXN0IGdpdmUgYSBmdW5jdGlvbicpOwogIH0KICByZXR1cm4gKC4uLmlubmVyQXJncykgPT4gewogICAgcmV0dXJuIGZuKC4uLmFyZ3MuY29uY2F0KGlubmVyQXJncykpOwogIH07Cn0KZnVuY3Rpb24gaXNTdHJpbmcgKHZhbHVlKSB7CiAgcmV0dXJuICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSB8fCAodmFsdWUgaW5zdGFuY2VvZiBTdHJpbmcpOwp9CmZ1bmN0aW9uIG5vcCAoKSB7Cn0KY29uc3Qgbm9uZSA9IG5vcDsKZnVuY3Rpb24gd2FpdCAobXNEZWxheSkgewogIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4gewogICAgc2V0VGltZW91dChyZXNvbHZlLCBtc0RlbGF5KTsKICB9KTsKfQpmdW5jdGlvbiB0cnlFdmVyeSAobXNJbnRlcnZhbCwgZm4pIHsKICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHsKICAgIGNvbnN0IGhhbmRsZSA9IHNldEludGVydmFsKGZ1bmN0aW9uICgpIHsKICAgICAgY29uc3QgcmVzdWx0ID0gZm4oKTsKICAgICAgaWYgKHJlc3VsdCAhPT0gbm9uZSkgewogICAgICAgIGNsZWFySW50ZXJ2YWwoaGFuZGxlKTsKICAgICAgICByZXNvbHZlKHJlc3VsdCk7CiAgICAgIH0KICAgIH0sIG1zSW50ZXJ2YWwpOwogIH0pOwp9CiB9KSwKIChmdW5jdGlvbihtb2R1bGUsIF9fd2VicGFja19leHBvcnRzX18sIF9fd2VicGFja19yZXF1aXJlX18pIHsKInVzZSBzdHJpY3QiOwpfX3dlYnBhY2tfcmVxdWlyZV9fLnIoX193ZWJwYWNrX2V4cG9ydHNfXyk7CiBfX3dlYnBhY2tfcmVxdWlyZV9fLmQoX193ZWJwYWNrX2V4cG9ydHNfXywgInJlZ2lzdGVyIiwgZnVuY3Rpb24oKSB7IHJldHVybiByZWdpc3RlcjsgfSk7CiBfX3dlYnBhY2tfcmVxdWlyZV9fLmQoX193ZWJwYWNrX2V4cG9ydHNfXywgImZpbmRIYW5kbGVyIiwgZnVuY3Rpb24oKSB7IHJldHVybiBmaW5kSGFuZGxlcjsgfSk7CiB2YXIgdXRpbF9jb3JlX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEpOwpjb25zdCBwYXR0ZXJucyA9IFtdOwpmdW5jdGlvbiByZWdpc3RlciAocGF0dGVybikgewogIHBhdHRlcm5zLnB1c2gocGF0dGVybik7Cn0KZnVuY3Rpb24gZGlzcGF0Y2hCeU9iamVjdCAocnVsZSwgdXJsXzYpIHsKICBjb25zdCBtYXRjaGVkID0gT2JqZWN0KHV0aWxfY29yZV9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyJtYXAiXSkocnVsZSwgKHBhdHRlcm4sIHBhcnQpID0+IHsKICAgIGlmIChwYXR0ZXJuIGluc3RhbmNlb2YgUmVnRXhwKSB7CiAgICAgIHJldHVybiB1cmxfNltwYXJ0XS5tYXRjaChwYXR0ZXJuKTsKICAgIH0KICAgIGlmIChBcnJheS5pc0FycmF5KHBhdHRlcm4pKSB7CiAgICAgIGNvbnN0IFssICwgcl0gPSBPYmplY3QodXRpbF9jb3JlX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bImZpbmQiXSkocGF0dGVybiwgKHNwKSA9PiB7CiAgICAgICAgY29uc3QgbSA9IHVybF82W3BhcnRdLm1hdGNoKHNwKTsKICAgICAgICByZXR1cm4gbSB8fCB1dGlsX2NvcmVfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1sibm9uZSJdOwogICAgICB9KTsKICAgICAgcmV0dXJuIHIgIT09IHV0aWxfY29yZV9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyJub25lIl0gPyByIDogbnVsbDsKICAgIH0KICAgIHRocm93IG5ldyB1dGlsX2NvcmVfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siQWRzQnlwYXNzZXJFcnJvciJdKCdpbnZhbGlkIHJ1bGUnKTsKICB9KTsKICBjb25zdCBwYXNzZWQgPSBPYmplY3QodXRpbF9jb3JlX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bImV2ZXJ5Il0pKG1hdGNoZWQsICh2KSA9PiB7CiAgICByZXR1cm4gISF2OwogIH0pOwogIHJldHVybiBwYXNzZWQgPyBtYXRjaGVkIDogbnVsbDsKfQpmdW5jdGlvbiBkaXNwYXRjaEJ5UmVnRXhwIChydWxlLCB1cmxfMSkgewogIHJldHVybiB1cmxfMS5tYXRjaChydWxlKTsKfQpmdW5jdGlvbiBkaXNwYXRjaEJ5QXJyYXkgKHJ1bGVzLCB1cmxfMSwgdXJsXzMsIHVybF82KSB7CiAgY29uc3QgWywgLCByXSA9IE9iamVjdCh1dGlsX2NvcmVfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siZmluZCJdKShydWxlcywgKHJ1bGUpID0+IHsKICAgIGNvbnN0IG0gPSBkaXNwYXRjaChydWxlLCB1cmxfMSwgdXJsXzMsIHVybF82KTsKICAgIHJldHVybiBtID8gbSA6IHV0aWxfY29yZV9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyJub25lIl07CiAgfSk7CiAgcmV0dXJuIHIgIT09IHV0aWxfY29yZV9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyJub25lIl0gPyByIDogbnVsbDsKfQpmdW5jdGlvbiBkaXNwYXRjaEJ5U3RyaW5nIChydWxlLCB1cmxfMykgewogIGxldCBzY2hlbWUgPSAvXCp8aHR0cHM/fGZpbGV8ZnRwfGNocm9tZS1leHRlbnNpb24vOwogIGxldCBob3N0ID0gL1wqfChcKlwuKT8oW14vKl0rKS87CiAgbGV0IHBhdGggPSAvXC8uKi87CiAgbGV0IHRtcCA9IGBeKCR7c2NoZW1lLnNvdXJjZX0pOi8vKCR7aG9zdC5zb3VyY2V9KT8oJHtwYXRoLnNvdXJjZX0pJGA7CiAgbGV0IHVwID0gbmV3IFJlZ0V4cCh0bXApOwogIGNvbnN0IG1hdGNoZWQgPSBydWxlLm1hdGNoKHVwKTsKICBpZiAoIW1hdGNoZWQpIHsKICAgIHJldHVybiBudWxsOwogIH0KICBzY2hlbWUgPSBtYXRjaGVkWzFdOwogIGhvc3QgPSBtYXRjaGVkWzJdOwogIGNvbnN0IHdjID0gbWF0Y2hlZFszXTsKICBjb25zdCBzZCA9IG1hdGNoZWRbNF07CiAgcGF0aCA9IG1hdGNoZWRbNV07CiAgaWYgKHNjaGVtZSA9PT0gJyonICYmICEvaHR0cHM/Ly50ZXN0KHVybF8zLnNjaGVtZSkpIHsKICAgIHJldHVybiBudWxsOwogIH0KICBpZiAoc2NoZW1lICE9PSB1cmxfMy5zY2hlbWUpIHsKICAgIHJldHVybiBudWxsOwogIH0KICBpZiAoc2NoZW1lICE9PSAnZmlsZScgJiYgaG9zdCAhPT0gJyonKSB7CiAgICBpZiAod2MpIHsKICAgICAgdXAgPSB1cmxfMy5ob3N0LmluZGV4T2Yoc2QpOwogICAgICBpZiAodXAgPCAwIHx8IHVwICsgc2QubGVuZ3RoICE9PSB1cmxfMy5ob3N0Lmxlbmd0aCkgewogICAgICAgIHJldHVybiBudWxsOwogICAgICB9CiAgICB9IGVsc2UgaWYgKGhvc3QgIT09IHVybF8zLmhvc3QpIHsKICAgICAgcmV0dXJuIG51bGw7CiAgICB9CiAgfQogIHRtcCA9IHBhdGgucmVwbGFjZSgvWyouW1xdPysjXS9nLCAoYykgPT4gewogICAgaWYgKGMgPT09ICcqJykgewogICAgICByZXR1cm4gJy4qJzsKICAgIH0KICAgIHJldHVybiAnXFwnICsgYzsKICB9KTsKICBwYXRoID0gbmV3IFJlZ0V4cChgXiR7dG1wfSRgKTsKICBpZiAoIXBhdGgudGVzdCh1cmxfMy5wYXRoKSkgewogICAgcmV0dXJuIG51bGw7CiAgfQogIHJldHVybiB1cmxfMzsKfQpmdW5jdGlvbiBkaXNwYXRjaEJ5RnVuY3Rpb24gKHJ1bGUsIHVybF8xLCB1cmxfMywgdXJsXzYpIHsKICByZXR1cm4gcnVsZSh1cmxfMSwgdXJsXzMsIHVybF82KTsKfQpmdW5jdGlvbiBkaXNwYXRjaCAocnVsZSwgdXJsXzEsIHVybF8zLCB1cmxfNikgewogIGlmIChBcnJheS5pc0FycmF5KHJ1bGUpKSB7CiAgICByZXR1cm4gZGlzcGF0Y2hCeUFycmF5KHJ1bGUsIHVybF8xLCB1cmxfMywgdXJsXzYpOwogIH0KICBpZiAodHlwZW9mIHJ1bGUgPT09ICdmdW5jdGlvbicpIHsKICAgIHJldHVybiBkaXNwYXRjaEJ5RnVuY3Rpb24ocnVsZSwgdXJsXzEsIHVybF8zLCB1cmxfNik7CiAgfQogIGlmIChydWxlIGluc3RhbmNlb2YgUmVnRXhwKSB7CiAgICByZXR1cm4gZGlzcGF0Y2hCeVJlZ0V4cChydWxlLCB1cmxfMSk7CiAgfQogIGlmIChPYmplY3QodXRpbF9jb3JlX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bImlzU3RyaW5nIl0pKHJ1bGUpKSB7CiAgICByZXR1cm4gZGlzcGF0Y2hCeVN0cmluZyhydWxlLCB1cmxfMyk7CiAgfQogIHJldHVybiBkaXNwYXRjaEJ5T2JqZWN0KHJ1bGUsIHVybF82KTsKfQpmdW5jdGlvbiBmaW5kSGFuZGxlciAoKSB7CiAgY29uc3QgdXJsXzEgPSB3aW5kb3cubG9jYXRpb24udG9TdHJpbmcoKTsKICBjb25zdCB1cmxfMyA9IHsKICAgIHNjaGVtZTogd2luZG93LmxvY2F0aW9uLnByb3RvY29sLnNsaWNlKDAsIC0xKSwKICAgIGhvc3Q6IHdpbmRvdy5sb2NhdGlvbi5ob3N0LAogICAgcGF0aDogd2luZG93LmxvY2F0aW9uLnBhdGhuYW1lICsgd2luZG93LmxvY2F0aW9uLnNlYXJjaCArIHdpbmRvdy5sb2NhdGlvbi5oYXNoLAogIH07CiAgY29uc3QgdXJsXzYgPSB7CiAgICBzY2hlbWU6IHdpbmRvdy5sb2NhdGlvbi5wcm90b2NvbCwKICAgIGhvc3Q6IHdpbmRvdy5sb2NhdGlvbi5ob3N0bmFtZSwKICAgIHBvcnQ6IHdpbmRvdy5sb2NhdGlvbi5wb3J0LAogICAgcGF0aDogd2luZG93LmxvY2F0aW9uLnBhdGhuYW1lLAogICAgcXVlcnk6IHdpbmRvdy5sb2NhdGlvbi5zZWFyY2gsCiAgICBoYXNoOiB3aW5kb3cubG9jYXRpb24uaGFzaCwKICB9OwogIGNvbnN0IFtpLCBwYXR0ZXJuLCBtYXRjaGVkXSA9IE9iamVjdCh1dGlsX2NvcmVfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siZmluZCJdKShwYXR0ZXJucywgKHBhdHRlcm4pID0+IHsKICAgIGNvbnN0IG0gPSBkaXNwYXRjaChwYXR0ZXJuLnJ1bGUsIHVybF8xLCB1cmxfMywgdXJsXzYpOwogICAgcmV0dXJuIG0gPyBtIDogdXRpbF9jb3JlX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIm5vbmUiXTsKICB9KTsKICBpZiAoaSA9PT0gdXRpbF9jb3JlX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIm5vbmUiXSkgewogICAgcmV0dXJuIG51bGw7CiAgfQogIGlmICghcGF0dGVybi5zdGFydCAmJiAhcGF0dGVybi5yZWFkeSkgewogICAgcmV0dXJuIG51bGw7CiAgfQogIHJldHVybiB7CiAgICBzdGFydDogcGF0dGVybi5zdGFydCA/IE9iamVjdCh1dGlsX2NvcmVfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1sicGFydGlhbCJdKShwYXR0ZXJuLnN0YXJ0LCBtYXRjaGVkKSA6IHV0aWxfY29yZV9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyJub3AiXSwKICAgIHJlYWR5OiBwYXR0ZXJuLnJlYWR5ID8gT2JqZWN0KHV0aWxfY29yZV9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyJwYXJ0aWFsIl0pKHBhdHRlcm4ucmVhZHksIG1hdGNoZWQpIDogdXRpbF9jb3JlX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIm5vcCJdLAogIH07Cn0KIH0pLAogKGZ1bmN0aW9uKG1vZHVsZSwgX193ZWJwYWNrX2V4cG9ydHNfXywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoidXNlIHN0cmljdCI7Cl9fd2VicGFja19yZXF1aXJlX18ucihfX3dlYnBhY2tfZXhwb3J0c19fKTsKIF9fd2VicGFja19yZXF1aXJlX18uZChfX3dlYnBhY2tfZXhwb3J0c19fLCAicmF3VVNXIiwgZnVuY3Rpb24oKSB7IHJldHVybiByYXdVU1c7IH0pOwogX193ZWJwYWNrX3JlcXVpcmVfXy5kKF9fd2VicGFja19leHBvcnRzX18sICJ1c3ciLCBmdW5jdGlvbigpIHsgcmV0dXJuIHVzdzsgfSk7CiBfX3dlYnBhY2tfcmVxdWlyZV9fLmQoX193ZWJwYWNrX2V4cG9ydHNfXywgIkdNQVBJIiwgZnVuY3Rpb24oKSB7IHJldHVybiBHTUFQSTsgfSk7CiB2YXIgdXRpbF9jb3JlX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEpOwpjb25zdCByYXdVU1cgPSBnZXRVbnNhZmVXaW5kb3coKTsKY29uc3QgdXN3ID0gZ2V0VW5zYWZlV2luZG93UHJveHkoKTsKY29uc3QgR01BUEkgPSBnZXRHcmVhc2VNb25rZXlBUEkoKTsKZnVuY3Rpb24gZ2V0VW5zYWZlV2luZG93ICgpIHsKICBsZXQgdyA9IG51bGw7CiAgdHJ5IHsKICAgIHcgPSB1bnNhZmVXaW5kb3c7CiAgfSBjYXRjaCAoZSkgewogICAgdHJ5IHsKICAgICAgdyA9ICgwLCBldmFsKSgndGhpcycpLmdsb2JhbDsKICAgIH0gY2F0Y2ggKGUpIHsKICAgIH0KICB9CiAgcmV0dXJuIHcgPyB3IDogKDAsIGV2YWwpKCd0aGlzJykud2luZG93Owp9CmZ1bmN0aW9uIGdldEdyZWFzZU1vbmtleUFQSSAoKSB7CiAgaWYgKHJhd1VTVy5nbG9iYWwpIHsKICAgIHJldHVybiBudWxsOwogIH0KICBjb25zdCBnbSA9IHt9OwogIGlmICh0eXBlb2YgR01fb3BlbkluVGFiID09PSAnZnVuY3Rpb24nKSB7CiAgICBnbS5vcGVuSW5UYWIgPSBHTV9vcGVuSW5UYWI7CiAgfSBlbHNlIHsKICAgIGdtLm9wZW5JblRhYiA9IEdNLm9wZW5JblRhYjsKICB9CiAgaWYgKHR5cGVvZiBHTV9nZXRWYWx1ZSA9PT0gJ2Z1bmN0aW9uJykgewogICAgZ20uZ2V0VmFsdWUgPSAobmFtZSwgZGVmYXVsdF8pID0+IHsKICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShHTV9nZXRWYWx1ZShuYW1lLCBkZWZhdWx0XykpOwogICAgfTsKICB9IGVsc2UgewogICAgZ20uZ2V0VmFsdWUgPSBHTS5nZXRWYWx1ZTsKICB9CiAgaWYgKHR5cGVvZiBHTV9zZXRWYWx1ZSA9PT0gJ2Z1bmN0aW9uJykgewogICAgZ20uc2V0VmFsdWUgPSAobmFtZSwgdmFsdWUpID0+IHsKICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShHTV9zZXRWYWx1ZShuYW1lLCB2YWx1ZSkpOwogICAgfTsKICB9IGVsc2UgewogICAgZ20uc2V0VmFsdWUgPSBHTS5zZXRWYWx1ZTsKICB9CiAgaWYgKHR5cGVvZiBHTV9kZWxldGVWYWx1ZSA9PT0gJ2Z1bmN0aW9uJykgewogICAgZ20uZGVsZXRlVmFsdWUgPSAobmFtZSkgPT4gewogICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKEdNX2RlbGV0ZVZhbHVlKG5hbWUpKTsKICAgIH07CiAgfSBlbHNlIHsKICAgIGdtLmRlbGV0ZVZhbHVlID0gR00uZGVsZXRlVmFsdWU7CiAgfQogIGlmICh0eXBlb2YgR01feG1saHR0cFJlcXVlc3QgPT09ICdmdW5jdGlvbicpIHsKICAgIGdtLnhtbEh0dHBSZXF1ZXN0ID0gR01feG1saHR0cFJlcXVlc3Q7CiAgfSBlbHNlIHsKICAgIGdtLnhtbEh0dHBSZXF1ZXN0ID0gR00ueG1sSHR0cFJlcXVlc3Q7CiAgfQogIGlmICh0eXBlb2YgR01fcmVnaXN0ZXJNZW51Q29tbWFuZCA9PT0gJ2Z1bmN0aW9uJykgewogICAgZ20ucmVnaXN0ZXJNZW51Q29tbWFuZCA9IEdNX3JlZ2lzdGVyTWVudUNvbW1hbmQ7CiAgfSBlbHNlIHsKICAgIGdtLnJlZ2lzdGVyTWVudUNvbW1hbmQgPSB1dGlsX2NvcmVfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1sibm9wIl07CiAgfQogIGlmICh0eXBlb2YgR01fZ2V0UmVzb3VyY2VVUkwgPT09ICdmdW5jdGlvbicpIHsKICAgIGdtLmdldFJlc291cmNlVXJsID0gKHJlc291cmNlTmFtZSkgPT4gewogICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKEdNX2dldFJlc291cmNlVVJMKHJlc291cmNlTmFtZSkpOwogICAgfTsKICB9IGVsc2UgaWYgKHR5cGVvZiBHTSA9PT0gJ29iamVjdCcgJiYgR00gJiYgR00uZ2V0UmVzb3VyY2VVcmwpIHsKICAgIGdtLmdldFJlc291cmNlVXJsID0gR00uZ2V0UmVzb3VyY2VVcmw7CiAgfQogIHJldHVybiBnbTsKfQpjb25zdCBNQUdJQ19LRVkgPSAnX19hZHNieXBhc3Nlcl9yZXZlcnNlX3Byb3h5X18nOwpmdW5jdGlvbiBnZXRVbnNhZmVXaW5kb3dQcm94eSAoKSB7CiAgY29uc3QgaXNGaXJlZm94ID0gdHlwZW9mIEluc3RhbGxUcmlnZ2VyICE9PSAndW5kZWZpbmVkJzsKICBjb25zdCBpc1dlYkV4dGVuc2lvbiA9IHR5cGVvZiBjbG9uZUludG8gPT09ICd1bmRlZmluZWQnIHx8IHR5cGVvZiBleHBvcnRGdW5jdGlvbiA9PT0gJ3VuZGVmaW5lZCc7CiAgaWYgKCFpc0ZpcmVmb3ggfHwgaXNXZWJFeHRlbnNpb24pIHsKICAgIHJldHVybiByYXdVU1c7CiAgfQogIGNvbnN0IGRlY29yYXRvciA9IHsKICAgIHNldCAodGFyZ2V0LCBrZXksIHZhbHVlKSB7CiAgICAgIGlmIChrZXkgPT09IE1BR0lDX0tFWSkgewogICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgfQogICAgICBpZiAodGFyZ2V0ID09PSB1bnNhZmVXaW5kb3cgJiYga2V5ID09PSAnb3BlbicpIHsKICAgICAgICBjb25zdCBkID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih0YXJnZXQsIGtleSk7CiAgICAgICAgZC52YWx1ZSA9IGNsb25lKGZ1bmN0aW9uICgpIHsKICAgICAgICAgIGNvbnN0IHJ2ID0gdmFsdWUoKTsKICAgICAgICAgIHJldHVybiBjbG9uZUludG8ocnYsIHVuc2FmZVdpbmRvdyk7CiAgICAgICAgfSk7CiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCBkKTsKICAgICAgfSBlbHNlIHsKICAgICAgICB0YXJnZXRba2V5XSA9IGNsb25lKHZhbHVlKTsKICAgICAgfQogICAgICByZXR1cm4gdHJ1ZTsKICAgIH0sCiAgICBnZXQgKHRhcmdldCwga2V5KSB7CiAgICAgIGlmIChrZXkgPT09IE1BR0lDX0tFWSkgewogICAgICAgIHJldHVybiB0YXJnZXQ7CiAgICAgIH0KICAgICAgY29uc3QgdmFsdWUgPSB0YXJnZXRba2V5XTsKICAgICAgY29uc3QgdHlwZSA9IHR5cGVvZiB2YWx1ZTsKICAgICAgaWYgKHZhbHVlID09PSBudWxsIHx8ICh0eXBlICE9PSAnZnVuY3Rpb24nICYmIHR5cGUgIT09ICdvYmplY3QnKSkgewogICAgICAgIHJldHVybiB2YWx1ZTsKICAgICAgfQogICAgICByZXR1cm4gbmV3IFByb3h5KHZhbHVlLCBkZWNvcmF0b3IpOwogICAgfSwKICAgIGFwcGx5ICh0YXJnZXQsIHNlbGYsIGFyZ3MpIHsKICAgICAgYXJncyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3MpOwogICAgICBpZiAodGFyZ2V0ID09PSB1bnNhZmVXaW5kb3cuT2JqZWN0LmRlZmluZVByb3BlcnR5KSB7CiAgICAgICAgYXJnc1swXSA9IGFyZ3NbMF1bTUFHSUNfS0VZXTsKICAgICAgfQogICAgICBpZiAodGFyZ2V0ID09PSB1bnNhZmVXaW5kb3cuRnVuY3Rpb24uYXBwbHkpIHsKICAgICAgICBzZWxmID0gc2VsZltNQUdJQ19LRVldOwogICAgICAgIGFyZ3NbMV0gPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmdzWzFdKTsKICAgICAgfQogICAgICBpZiAodGFyZ2V0ID09PSB1bnNhZmVXaW5kb3cuZG9jdW1lbnQucXVlcnlTZWxlY3RvcikgewogICAgICAgIHNlbGYgPSBzZWxmW01BR0lDX0tFWV07CiAgICAgIH0KICAgICAgaWYgKHRhcmdldCA9PT0gdW5zYWZlV2luZG93LmRvY3VtZW50LndyaXRlKSB7CiAgICAgICAgc2VsZiA9IHNlbGZbTUFHSUNfS0VZXTsKICAgICAgfQogICAgICBjb25zdCB1c2FyZ3MgPSBjbG9uZShhcmdzKTsKICAgICAgcmV0dXJuIHRhcmdldC5hcHBseShzZWxmLCB1c2FyZ3MpOwogICAgfSwKICAgIGNvbnN0cnVjdCAodGFyZ2V0LCBhcmdzKSB7CiAgICAgIGFyZ3MgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmdzKTsKICAgICAgYXJncy51bnNoaWZ0KHVuZGVmaW5lZCk7CiAgICAgIGNvbnN0IHVzYXJncyA9IGNsb25lKGFyZ3MpOwogICAgICBjb25zdCBiaW5kID0gdW5zYWZlV2luZG93LkZ1bmN0aW9uLnByb3RvdHlwZS5iaW5kOwogICAgICByZXR1cm4gbmV3IChiaW5kLmFwcGx5KHRhcmdldCwgdXNhcmdzKSk7CiAgICB9LAogIH07CiAgcmV0dXJuIG5ldyBQcm94eSh1bnNhZmVXaW5kb3csIGRlY29yYXRvcik7Cn0KZnVuY3Rpb24gY2xvbmUgKHNhZmUpIHsKICBpZiAoc2FmZSA9PT0gbnVsbCB8fCAhKHNhZmUgaW5zdGFuY2VvZiBPYmplY3QpKSB7CiAgICByZXR1cm4gc2FmZTsKICB9CiAgaWYgKHNhZmUgPT09IHVuc2FmZVdpbmRvdykgewogICAgcmV0dXJuIHNhZmU7CiAgfQogIGlmIChzYWZlIGluc3RhbmNlb2YgU3RyaW5nKSB7CiAgICByZXR1cm4gc2FmZS50b1N0cmluZygpOwogIH0KICBpZiAoc2FmZSBpbnN0YW5jZW9mIEZ1bmN0aW9uKSB7CiAgICByZXR1cm4gZXhwb3J0RnVuY3Rpb24oc2FmZSwgdW5zYWZlV2luZG93LCB7CiAgICAgIGFsbG93Q3Jvc3NPcmlnaW5Bcmd1bWVudHM6IHRydWUsCiAgICB9KTsKICB9CiAgaWYgKHNhZmUgaW5zdGFuY2VvZiBBcnJheSkgewogICAgY29uc3QgdW5zYWZlID0gbmV3IHVuc2FmZVdpbmRvdy5BcnJheSgpOwogICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzYWZlLmxlbmd0aDsgKytpKSB7CiAgICAgIHVuc2FmZS5wdXNoKGNsb25lKHNhZmVbaV0pKTsKICAgIH0KICAgIHJldHVybiB1bnNhZmU7CiAgfQogIGNvbnN0IHVuc2FmZSA9IG5ldyB1bnNhZmVXaW5kb3cuT2JqZWN0KCk7CiAgT2JqZWN0KHV0aWxfY29yZV9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyJmb3JFYWNoIl0pKHNhZmUsICh2LCBrKSA9PiB7CiAgICB1bnNhZmVba10gPSBjbG9uZSh2KTsKICB9KTsKICByZXR1cm4gdW5zYWZlOwp9CiB9KSwKIChmdW5jdGlvbihtb2R1bGUsIF9fd2VicGFja19leHBvcnRzX18sIF9fd2VicGFja19yZXF1aXJlX18pIHsKInVzZSBzdHJpY3QiOwpfX3dlYnBhY2tfcmVxdWlyZV9fLnIoX193ZWJwYWNrX2V4cG9ydHNfXyk7CiBfX3dlYnBhY2tfcmVxdWlyZV9fLmQoX193ZWJwYWNrX2V4cG9ydHNfXywgImR1bXBDb25maWciLCBmdW5jdGlvbigpIHsgcmV0dXJuIGR1bXBDb25maWc7IH0pOwogX193ZWJwYWNrX3JlcXVpcmVfXy5kKF9fd2VicGFja19leHBvcnRzX18sICJsb2FkQ29uZmlnIiwgZnVuY3Rpb24oKSB7IHJldHVybiBsb2FkQ29uZmlnOyB9KTsKIHZhciB1dGlsX2NvcmVfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfXyA9IF9fd2VicGFja19yZXF1aXJlX18oMSk7CiB2YXIgdXRpbF9kaXNwYXRjaGVyX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8xX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDIpOwogdmFyIHV0aWxfcGxhdGZvcm1fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzJfXyA9IF9fd2VicGFja19yZXF1aXJlX18oMyk7CmNvbnN0IE1BTklGRVNUID0gWwogIHsKICAgIGtleTogJ3ZlcnNpb24nLAogICAgZGVmYXVsdF86IDAsCiAgICB2ZXJpZnkgKHYpIHsKICAgICAgcmV0dXJuIHR5cGVvZiB2ID09PSAnbnVtYmVyJyAmJiB2ID49IDA7CiAgICB9LAogICAgbm9ybWFsaXplOiB0b051bWJlciwKICB9LAogIHsKICAgIGtleTogJ2FsaWduX2NlbnRlcicsCiAgICBkZWZhdWx0XzogdHJ1ZSwKICAgIHZlcmlmeTogaXNCb29sZWFuLAogICAgbm9ybWFsaXplOiB0b0Jvb2xlYW4sCiAgfSwKICB7CiAgICBrZXk6ICdjaGFuZ2VfYmFja2dyb3VuZCcsCiAgICBkZWZhdWx0XzogdHJ1ZSwKICAgIHZlcmlmeTogaXNCb29sZWFuLAogICAgbm9ybWFsaXplOiB0b0Jvb2xlYW4sCiAgfSwKICB7CiAgICBrZXk6ICdyZWRpcmVjdF9pbWFnZScsCiAgICBkZWZhdWx0XzogdHJ1ZSwKICAgIHZlcmlmeTogaXNCb29sZWFuLAogICAgbm9ybWFsaXplOiB0b0Jvb2xlYW4sCiAgfSwKICB7CiAgICBrZXk6ICdzY2FsZV9pbWFnZScsCiAgICBkZWZhdWx0XzogdHJ1ZSwKICAgIHZlcmlmeTogaXNCb29sZWFuLAogICAgbm9ybWFsaXplOiB0b0Jvb2xlYW4sCiAgfSwKICB7CiAgICBrZXk6ICdsb2dfbGV2ZWwnLAogICAgZGVmYXVsdF86IDEsCiAgICB2ZXJpZnkgKHYpIHsKICAgICAgcmV0dXJuIHR5cGVvZiB2ID09PSAnbnVtYmVyJyAmJiB2ID49IDAgJiYgdiA8PSAyOwogICAgfSwKICAgIG5vcm1hbGl6ZTogdG9OdW1iZXIsCiAgfSwKXTsKY29uc3QgUEFUQ0hFUyA9IFsKICBhc3luYyAoKSA9PiB7CiAgICBjb25zdCBhbGlnbkNlbnRlciA9IGF3YWl0IHV0aWxfcGxhdGZvcm1fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzJfX1siR01BUEkiXS5nZXRWYWx1ZSgnYWxpZ25fY2VudGVyJyk7CiAgICBjb25zdCBjaGFuZ2VCYWNrZ3JvdW5kID0gYXdhaXQgdXRpbF9wbGF0Zm9ybV9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMl9fWyJHTUFQSSJdLmdldFZhbHVlKCdjaGFuZ2VfYmFja2dyb3VuZCcpOwogICAgY29uc3Qgc2NhbGVJbWFnZSA9IGF3YWl0IHV0aWxfcGxhdGZvcm1fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzJfX1siR01BUEkiXS5nZXRWYWx1ZSgnc2NhbGVfaW1hZ2UnKTsKICAgIGNvbnN0IHJlZGlyZWN0SW1hZ2UgPSBhd2FpdCB1dGlsX3BsYXRmb3JtX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8yX19bIkdNQVBJIl0uZ2V0VmFsdWUoJ3JlZGlyZWN0X2ltYWdlJyk7CiAgICBjb25zdCBhYyA9IHR5cGVvZiBhbGlnbkNlbnRlciA9PT0gJ2Jvb2xlYW4nOwogICAgaWYgKHR5cGVvZiBjaGFuZ2VCYWNrZ3JvdW5kICE9PSAnYm9vbGVhbicpIHsKICAgICAgYXdhaXQgdXRpbF9wbGF0Zm9ybV9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMl9fWyJHTUFQSSJdLnNldFZhbHVlKCdjaGFuZ2VfYmFja2dyb3VuZCcsIGFjID8gYWxpZ25DZW50ZXIgOiB0cnVlKTsKICAgIH0KICAgIGlmICh0eXBlb2Ygc2NhbGVJbWFnZSAhPT0gJ2Jvb2xlYW4nKSB7CiAgICAgIGF3YWl0IHV0aWxfcGxhdGZvcm1fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzJfX1siR01BUEkiXS5zZXRWYWx1ZSgnc2NhbGVfaW1hZ2UnLCBhYyA/IGFsaWduQ2VudGVyIDogdHJ1ZSk7CiAgICB9CiAgICBpZiAoIWFjKSB7CiAgICAgIGF3YWl0IHV0aWxfcGxhdGZvcm1fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzJfX1siR01BUEkiXS5zZXRWYWx1ZSgnYWxpZ25fY2VudGVyJywgdHJ1ZSk7CiAgICB9CiAgICBpZiAodHlwZW9mIHJlZGlyZWN0SW1hZ2UgIT09ICdib29sZWFuJykgewogICAgICBhd2FpdCB1dGlsX3BsYXRmb3JtX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8yX19bIkdNQVBJIl0uc2V0VmFsdWUoJ3JlZGlyZWN0X2ltYWdlJywgdHJ1ZSk7CiAgICB9CiAgfSwKICBhc3luYyAoKSA9PiB7CiAgICBjb25zdCBleHRlcm5hbFNlcnZlclN1cHBvcnQgPSBhd2FpdCB1dGlsX3BsYXRmb3JtX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8yX19bIkdNQVBJIl0uZ2V0VmFsdWUoJ2V4dGVybmFsX3NlcnZlcl9zdXBwb3J0Jyk7CiAgICBpZiAodHlwZW9mIGV4dGVybmFsU2VydmVyU3VwcG9ydCAhPT0gJ2Jvb2xlYW4nKSB7CiAgICAgIGF3YWl0IHV0aWxfcGxhdGZvcm1fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzJfX1siR01BUEkiXS5zZXRWYWx1ZSgnZXh0ZXJuYWxfc2VydmVyX3N1cHBvcnQnLCBmYWxzZSk7CiAgICB9CiAgfSwKICBhc3luYyAoKSA9PiB7CiAgICBjb25zdCBsb2dMZXZlbCA9IGF3YWl0IHV0aWxfcGxhdGZvcm1fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzJfX1siR01BUEkiXS5nZXRWYWx1ZSgnbG9nX2xldmVsJyk7CiAgICBpZiAodHlwZW9mIGxvZ0xldmVsICE9PSAnbnVtYmVyJykgewogICAgICBhd2FpdCB1dGlsX3BsYXRmb3JtX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8yX19bIkdNQVBJIl0uc2V0VmFsdWUoJ2xvZ19sZXZlbCcsIDEpOwogICAgfQogIH0sCiAgYXN5bmMgKCkgPT4gewogICAgYXdhaXQgdXRpbF9wbGF0Zm9ybV9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMl9fWyJHTUFQSSJdLmRlbGV0ZVZhbHVlKCdleHRlcm5hbF9zZXJ2ZXJfc3VwcG9ydCcpOwogIH0sCl07CmZ1bmN0aW9uIGlzQm9vbGVhbiAodikgewogIHJldHVybiB0eXBlb2YgdiA9PT0gJ2Jvb2xlYW4nOwp9CmZ1bmN0aW9uIHRvQm9vbGVhbiAodikgewogIHJldHVybiAhIXY7Cn0KZnVuY3Rpb24gdG9OdW1iZXIgKHYpIHsKICByZXR1cm4gcGFyc2VJbnQodiwgMTApOwp9CmFzeW5jIGZ1bmN0aW9uIHNlbml0eUNoZWNrICgpIHsKICBsZXQgdmVyaWZ5UmVzdWx0cyA9IE1BTklGRVNULm1hcChhc3luYyAoZGVzY3JpcHRvcikgPT4gewogICAgY29uc3QgcnYgPSBhd2FpdCB1dGlsX3BsYXRmb3JtX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8yX19bIkdNQVBJIl0uZ2V0VmFsdWUoZGVzY3JpcHRvci5rZXkpOwogICAgcmV0dXJuIGRlc2NyaXB0b3IudmVyaWZ5KHJ2KTsKICB9KTsKICB2ZXJpZnlSZXN1bHRzID0gYXdhaXQgUHJvbWlzZS5hbGwodmVyaWZ5UmVzdWx0cyk7CiAgY29uc3Qgb2sgPSBPYmplY3QodXRpbF9jb3JlX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bImV2ZXJ5Il0pKHZlcmlmeVJlc3VsdHMsIHYgPT4gdik7CiAgaWYgKCFvaykgewogICAgYXdhaXQgdXRpbF9wbGF0Zm9ybV9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMl9fWyJHTUFQSSJdLnNldFZhbHVlKCd2ZXJzaW9uJywgMCk7CiAgfQp9CmFzeW5jIGZ1bmN0aW9uIG1pZ3JhdGUgKCkgewogIGxldCBjdXJyZW50VmVyc2lvbiA9IGF3YWl0IHV0aWxfcGxhdGZvcm1fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzJfX1siR01BUEkiXS5nZXRWYWx1ZSgndmVyc2lvbicpOwogIGlmIChjdXJyZW50VmVyc2lvbiAhPT0gMCAmJiAhY3VycmVudFZlcnNpb24pIHsKICAgIHRocm93IG5ldyB1dGlsX2NvcmVfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siQWRzQnlwYXNzZXJFcnJvciJdKCdpbnZhbGlkIHZlcnNpb24nKTsKICB9CiAgd2hpbGUgKGN1cnJlbnRWZXJzaW9uIDwgUEFUQ0hFUy5sZW5ndGgpIHsKICAgIFBBVENIRVNbY3VycmVudFZlcnNpb25dKCk7CiAgICArK2N1cnJlbnRWZXJzaW9uOwogIH0KICBhd2FpdCB1dGlsX3BsYXRmb3JtX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8yX19bIkdNQVBJIl0uc2V0VmFsdWUoJ3ZlcnNpb24nLCBjdXJyZW50VmVyc2lvbik7Cn0KYXN5bmMgZnVuY3Rpb24gbG9hZENvbmZpZyAoKSB7CiAgYXdhaXQgc2VuaXR5Q2hlY2soKTsKICBhd2FpdCBtaWdyYXRlKCk7CiAgT2JqZWN0KHV0aWxfZGlzcGF0Y2hlcl9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMV9fWyJyZWdpc3RlciJdKSh7CiAgICBydWxlOiB7CiAgICAgIGhvc3Q6IC9eYWRzYnlwYXNzZXJcLmdpdGh1YlwuaW8kLywKICAgICAgcGF0aDogL15cL2NvbmZpZ3VyZVwuaHRtbCQvLAogICAgfSwKICAgIGFzeW5jIHJlYWR5ICgpIHsKICAgICAgYXdhaXQgd2FpdEZvclBhZ2UoKTsKICAgICAgdXRpbF9wbGF0Zm9ybV9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMl9fWyJ1c3ciXS5jb21taXQgPSBhc3luYyAoZGF0YSkgPT4gewogICAgICAgIGZvciAoY29uc3QgW2ssIHZdIG9mIE9iamVjdC5lbnRyaWVzKGRhdGEpKSB7CiAgICAgICAgICBhd2FpdCB1dGlsX3BsYXRmb3JtX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8yX19bIkdNQVBJIl0uc2V0VmFsdWUoaywgdik7CiAgICAgICAgfQogICAgICB9OwogICAgICB1dGlsX3BsYXRmb3JtX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8yX19bInVzdyJdLnJlbmRlcih7CiAgICAgICAgdmVyc2lvbjogYXdhaXQgdXRpbF9wbGF0Zm9ybV9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMl9fWyJHTUFQSSJdLmdldFZhbHVlKCd2ZXJzaW9uJyksCiAgICAgICAgb3B0aW9uczogewogICAgICAgICAgYWxpZ25fY2VudGVyOiB7CiAgICAgICAgICAgIHR5cGU6ICdjaGVja2JveCcsCiAgICAgICAgICAgIHZhbHVlOiBhd2FpdCB1dGlsX3BsYXRmb3JtX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8yX19bIkdNQVBJIl0uZ2V0VmFsdWUoJ2FsaWduX2NlbnRlcicpLAogICAgICAgICAgICBsYWJlbDogJ0FsaWduIENlbnRlcicsCiAgICAgICAgICAgIGhlbHA6ICdBbGlnbiBpbWFnZSB0byB0aGUgY2VudGVyIGlmIHBvc3NpYmxlLiAoZGVmYXVsdDogZW5hYmxlZCknLAogICAgICAgICAgfSwKICAgICAgICAgIGNoYW5nZV9iYWNrZ3JvdW5kOiB7CiAgICAgICAgICAgIHR5cGU6ICdjaGVja2JveCcsCiAgICAgICAgICAgIHZhbHVlOiBhd2FpdCB1dGlsX3BsYXRmb3JtX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8yX19bIkdNQVBJIl0uZ2V0VmFsdWUoJ2NoYW5nZV9iYWNrZ3JvdW5kJyksCiAgICAgICAgICAgIGxhYmVsOiAnQ2hhbmdlIEJhY2tncm91bmQnLAogICAgICAgICAgICBoZWxwOiAnVXNlIEZpcmVmb3gtbGlrZSBpbWFnZSBiYWNrZ3JvdW5kIGlmIHBvc3NpYmxlLiAoZGVmYXVsdDogZW5hYmxlZCknLAogICAgICAgICAgfSwKICAgICAgICAgIHJlZGlyZWN0X2ltYWdlOiB7CiAgICAgICAgICAgIHR5cGU6ICdjaGVja2JveCcsCiAgICAgICAgICAgIHZhbHVlOiBhd2FpdCB1dGlsX3BsYXRmb3JtX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8yX19bIkdNQVBJIl0uZ2V0VmFsdWUoJ3JlZGlyZWN0X2ltYWdlJyksCiAgICAgICAgICAgIGxhYmVsOiAnUmVkaXJlY3QgSW1hZ2UnLAogICAgICAgICAgICBoZWxwOiBbCiAgICAgICAgICAgICAgJ0RpcmVjdGx5IG9wZW4gaW1hZ2UgbGluayBpZiBwb3NzaWJsZS4gKGRlZmF1bHQ6IGVuYWJsZWQpJywKICAgICAgICAgICAgICAnSWYgZGlzYWJsZWQsIHJlZGlyZWN0aW9uIHdpbGwgb25seSB3b3JrcyBvbiBsaW5rIHNob3J0ZW5lciBzaXRlcy4nLAogICAgICAgICAgICBdLmpvaW4oJzxici8+XG4nKSwKICAgICAgICAgIH0sCiAgICAgICAgICBzY2FsZV9pbWFnZTogewogICAgICAgICAgICB0eXBlOiAnY2hlY2tib3gnLAogICAgICAgICAgICB2YWx1ZTogYXdhaXQgdXRpbF9wbGF0Zm9ybV9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMl9fWyJHTUFQSSJdLmdldFZhbHVlKCdzY2FsZV9pbWFnZScpLAogICAgICAgICAgICBsYWJlbDogJ1NjYWxlIEltYWdlJywKICAgICAgICAgICAgaGVscDogJ1doZW4gaW1hZ2UgbG9hZGVkLCBzY2FsZSBpdCB0byBmaXQgd2luZG93IGlmIHBvc3NpYmxlLiAoZGVmYXVsdDogZW5hYmxlZCknLAogICAgICAgICAgfSwKICAgICAgICAgIGxvZ19sZXZlbDogewogICAgICAgICAgICB0eXBlOiAnc2VsZWN0JywKICAgICAgICAgICAgdmFsdWU6IGF3YWl0IHV0aWxfcGxhdGZvcm1fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzJfX1siR01BUEkiXS5nZXRWYWx1ZSgnbG9nX2xldmVsJyksCiAgICAgICAgICAgIG1lbnU6IFsKICAgICAgICAgICAgICBbMCwgJzAgKHF1aWV0KSddLAogICAgICAgICAgICAgIFsxLCAnMSAoZGVmYXVsdCknXSwKICAgICAgICAgICAgICBbMiwgJzIgKHZlcmJvc2UpJ10sCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgIGxhYmVsOiAnTG9nIExldmVsJywKICAgICAgICAgICAgaGVscDogWwogICAgICAgICAgICAgICdMb2cgbGV2ZWwgaW4gZGV2ZWxvcGVyIGNvbnNvbGUuIChkZWZhdWx0OiAxKScsCiAgICAgICAgICAgICAgJzAgd2lsbCBub3QgcHJpbnQgYW55dGhpbmcgaW4gY29uc29sZS4nLAogICAgICAgICAgICAgICcxIHdpbGwgb25seSBwcmludCBsb2dzIG9uIGFmZmVjdGVkIHNpdGVzLicsCiAgICAgICAgICAgICAgJzIgd2lsbCBwcmludCBvbiBhbnkgc2l0ZXMuJywKICAgICAgICAgICAgXS5qb2luKCc8YnIvPlxuJyksCiAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgIH0pOwogICAgfSwKICB9KTsKfQpmdW5jdGlvbiB3YWl0Rm9yUGFnZSAoKSB7CiAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7CiAgICBjb25zdCBpID0gc2V0SW50ZXJ2YWwoKCkgPT4gewogICAgICBpZiAodXRpbF9wbGF0Zm9ybV9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMl9fWyJ1c3ciXS5yZW5kZXIpIHsKICAgICAgICBjbGVhckludGVydmFsKGkpOwogICAgICAgIHJlc29sdmUoKTsKICAgICAgfQogICAgfSwgNTApOwogIH0pOwp9CmFzeW5jIGZ1bmN0aW9uIGR1bXBDb25maWcgKCkgewogIGxldCBydiA9IE1BTklGRVNULm1hcChhc3luYyAoZGVzY3JpcHRvcikgPT4gewogICAgcmV0dXJuIFtkZXNjcmlwdG9yLmtleSwgYXdhaXQgdXRpbF9wbGF0Zm9ybV9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMl9fWyJHTUFQSSJdLmdldFZhbHVlKGRlc2NyaXB0b3Iua2V5KV07CiAgfSk7CiAgcnYgPSBhd2FpdCBQcm9taXNlLmFsbChydik7CiAgY29uc3QgbyA9IHt9OwogIGZvciAoY29uc3QgW2ssIHZdIG9mIHJ2KSB7CiAgICBvW2tdID0gdjsKICB9CiAgcmV0dXJuIG87Cn0KIH0pLAogKGZ1bmN0aW9uKG1vZHVsZSwgX193ZWJwYWNrX2V4cG9ydHNfXywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoidXNlIHN0cmljdCI7Cl9fd2VicGFja19yZXF1aXJlX18ucihfX3dlYnBhY2tfZXhwb3J0c19fKTsKIF9fd2VicGFja19yZXF1aXJlX18uZChfX3dlYnBhY2tfZXhwb3J0c19fLCAiZGVidWciLCBmdW5jdGlvbigpIHsgcmV0dXJuIGRlYnVnOyB9KTsKIF9fd2VicGFja19yZXF1aXJlX18uZChfX3dlYnBhY2tfZXhwb3J0c19fLCAiaW5mbyIsIGZ1bmN0aW9uKCkgeyByZXR1cm4gaW5mbzsgfSk7CiBfX3dlYnBhY2tfcmVxdWlyZV9fLmQoX193ZWJwYWNrX2V4cG9ydHNfXywgIndhcm4iLCBmdW5jdGlvbigpIHsgcmV0dXJuIHdhcm47IH0pOwogdmFyIHV0aWxfY29yZV9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fID0gX193ZWJwYWNrX3JlcXVpcmVfXygxKTsKY29uc3QgcXVpZXQgPSBmYWxzZTsKZnVuY3Rpb24gbG9nIChtZXRob2QsIGFyZ3MpIHsKICBpZiAocXVpZXQpIHsKICAgIHJldHVybjsKICB9CiAgYXJncyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3MpOwogIGlmIChPYmplY3QodXRpbF9jb3JlX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bImlzU3RyaW5nIl0pKGFyZ3NbMF0pKSB7CiAgICBhcmdzWzBdID0gJ0Fkc0J5cGFzc2VyOiAnICsgYXJnc1swXTsKICB9IGVsc2UgewogICAgYXJncy51bnNoaWZ0KCdBZHNCeXBhc3NlcjonKTsKICB9CiAgY29uc3QgZiA9IGNvbnNvbGVbbWV0aG9kXTsKICBpZiAodHlwZW9mIGYgPT09ICdmdW5jdGlvbicpIHsKICAgIGYuYXBwbHkoY29uc29sZSwgYXJncyk7CiAgfQp9CmZ1bmN0aW9uIGRlYnVnICgpIHsKICBsb2coJ2RlYnVnJywgYXJndW1lbnRzKTsKfQpmdW5jdGlvbiBpbmZvICgpIHsKICBsb2coJ2luZm8nLCBhcmd1bWVudHMpOwp9CmZ1bmN0aW9uIHdhcm4gKCkgewogIGxvZygnd2FybicsIGFyZ3VtZW50cyk7Cn0KIH0pLAogKGZ1bmN0aW9uKG1vZHVsZSwgX193ZWJwYWNrX2V4cG9ydHNfXywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoidXNlIHN0cmljdCI7Cl9fd2VicGFja19yZXF1aXJlX18ucihfX3dlYnBhY2tfZXhwb3J0c19fKTsKIHZhciBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fID0gX193ZWJwYWNrX3JlcXVpcmVfXyg3KTsKX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siXyJdLnJlZ2lzdGVyKHsKICBydWxlOiB7CiAgICBob3N0OiAvXmFrb2FtXC5uZXQkLywKICAgIHBhdGg6IC9eXC9kb3dubG9hZFwvKFteL10rKVwvLywKICB9LAogIGFzeW5jIHN0YXJ0IChtKSB7CiAgICBsZXQgZGF0YSA9IGF3YWl0IF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXS5wb3N0KGxvY2F0aW9uLmhyZWYsIG0ucGF0aFsxXSk7CiAgICB0cnkgewogICAgICBkYXRhID0gSlNPTi5wYXJzZShkYXRhKTsKICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siXyJdLndhcm4oJ0pTT04gZXJyb3I6JywgZSk7CiAgICAgIHJldHVybjsKICAgIH0KICAgIGF3YWl0IF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXS5vcGVuTGluayhkYXRhLmRpcmVjdF9saW5rKTsKICB9LAp9KTsKX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siXyJdLnJlZ2lzdGVyKHsKICBydWxlOiB7CiAgICBob3N0OiAvXih3d3dcLik/Y29vbHJvbVwuY29tJC8sCiAgICBwYXRoOiAvXlwvZGxwb3BcLnBocCQvLAogIH0sCiAgYXN5bmMgcmVhZHkgKCkgewogICAgY29uc3QgbWF0Y2hlcyA9IF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXS5zZWFyY2hGcm9tU2NyaXB0cygvPGZvcm0gbWV0aG9kPSJQT1NUIiBhY3Rpb249IihbXiJdKykiPi8pOwogICAgYXdhaXQgX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdLm9wZW5MaW5rKG1hdGNoZXNbMV0pOwogIH0sCn0pOwooZnVuY3Rpb24gKCkgewogIF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIl8iXS5yZWdpc3Rlcih7CiAgICBydWxlOiB7CiAgICAgIGhvc3Q6IC9eKHd3d1wuKT9kbC1wcm90ZWN0XC5jb20kLywKICAgICAgcGF0aDogL1wvW0EtWjAtOV0rLywKICAgIH0sCiAgICBhc3luYyByZWFkeSAoKSB7CiAgICAgIGlmIChfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0uJCgnI2NhcHRjaGEnKSkgewogICAgICAgIHJldHVybjsKICAgICAgfQogICAgICBjb25zdCBmID0gX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdLiQoJ2Zvcm1bbmFtZT1jY2VydXJlXScpOwogICAgICBpZiAoZikgewogICAgICAgIGNvbnN0IGlJbiA9IE9iamVjdChfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0pKCdpbnB1dFtpZD1pbl0nKTsKICAgICAgICBpZiAoaUluLnZhbHVlKSB7CiAgICAgICAgICBhd2FpdCBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyJfIl0ud2FpdCg2MDApOwogICAgICAgICAgZi5zdWJtaXQoKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgY29uc3QgWywgLCBwXSA9IGF3YWl0IHdhaXRET00oaUluLCB7CiAgICAgICAgICAgIGF0dHJpYnV0ZXM6IHRydWUsCiAgICAgICAgICB9LCAobXV0YXRpb24pID0+IHsKICAgICAgICAgICAgaWYgKCFtdXRhdGlvbi50YXJnZXQudmFsdWUgfHwgbXV0YXRpb24uYXR0cmlidXRlTmFtZSAhPT0gJ3ZhbHVlJykgewogICAgICAgICAgICAgIHJldHVybiBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyJfIl0ubm9uZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpSW4udmFsdWUgPSAnVHJhY2tpbmcgdG9vIG11Y2ggaHVydHMgdXNlcnNcJyBwcml2YWN5JzsKICAgICAgICAgICAgaWYgKCFjYW5GYXN0UmVkaXJlY3QoKSkgewogICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siXyJdLndhaXQoNjAwKTsKICAgICAgICAgIH0pOwogICAgICAgICAgaWYgKHApIHsKICAgICAgICAgICAgYXdhaXQgcDsKICAgICAgICAgICAgZi5zdWJtaXQoKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIGNvbnN0IGwgPSBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0uJCQoJyNzbGlua3MgPiBhJyk7CiAgICAgIGlmIChsLmxlbmd0aCA9PT0gMSkgewogICAgICAgIGF3YWl0IF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXS5vcGVuTGluayhsWzBdLmhyZWYpOwogICAgICB9CiAgICB9LAogIH0pOwogIGZ1bmN0aW9uIGNhbkZhc3RSZWRpcmVjdCAoKSB7CiAgICByZXR1cm4gIV9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXS4kKCdmb3JtW25hbWU9Y2NlcnVyZV0nKS5vbnN1Ym1pdCAmJiAhX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdLiQoJ2Zvcm1bbmFtZT1jY2VydXJlXSBpbnB1dFtuYW1lPXB3ZF0nKTsKICB9CiAgZnVuY3Rpb24gd2FpdERPTSAoZWxlbWVudCwgY29uZmlnLCBmbikgewogICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7CiAgICAgIGNvbnN0IG9ic2VydmVyID0gbmV3IE11dGF0aW9uT2JzZXJ2ZXIoKG11dGF0aW9ucykgPT4gewogICAgICAgIGNvbnN0IFtrLCB2LCByXSA9IF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIl8iXS5maW5kKG11dGF0aW9ucywgZm4pOwogICAgICAgIGlmIChrICE9PSBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyJfIl0ubm9uZSkgewogICAgICAgICAgb2JzZXJ2ZXIuZGlzY29ubmVjdCgpOwogICAgICAgICAgcmVzb2x2ZShbaywgdiwgcl0pOwogICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgfSk7CiAgICAgIG9ic2VydmVyLm9ic2VydmUoZWxlbWVudCwgY29uZmlnKTsKICAgIH0pOwogIH0KfSkoKTsKX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siXyJdLnJlZ2lzdGVyKHsKICBydWxlOiB7CiAgICBob3N0OiAvXmVsc2ZpbGVcLm9yZyQvLAogIH0sCiAgYXN5bmMgcmVhZHkgKCkgewogICAgY29uc3QgZG93biA9IF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXS4kKCcjYnRuX2Rvd25sb2FkJyk7CiAgICBpZiAoZG93bikgewogICAgICBkb3duLmNsaWNrKCk7CiAgICAgIHJldHVybjsKICAgIH0KICAgIGNvbnN0IGNvdW50ZG93biA9IE9iamVjdChfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0pKCcjZnJtZGxjZW50ZXInKTsKICAgIGNvbnN0IG8gPSBuZXcgTXV0YXRpb25PYnNlcnZlcigoKSA9PiB7CiAgICAgIGNvbnN0IHN1Ym1pdCA9IF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXS4kKCdpbnB1dFt0eXBlPSJzdWJtaXQiXVtuYW1lPSJtZXRob2RfZnJlZSJdJyk7CiAgICAgIGlmIChzdWJtaXQpIHsKICAgICAgICBzdWJtaXQuY2xpY2soKTsKICAgICAgfQogICAgfSk7CiAgICBvLm9ic2VydmUoY291bnRkb3duLCB7CiAgICAgIGNoaWxkTGlzdDogdHJ1ZQogICAgfSk7CiAgICBsZXQgc2NyaXB0ID0gX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdLnNlYXJjaEZyb21TY3JpcHRzKC8uKmV2YWxcKGZ1bmN0aW9uXChwLGEsYyxrLGUsZFwpLiovKTsKICAgIGlmIChzY3JpcHQubGVuZ3RoID4gMCkgewogICAgICBzY3JpcHQgPSBzY3JpcHRbMF0ucmVwbGFjZSgnfHxpbXBvcnRhbnQnLCAnfDB8aW1wb3J0YW50Jyk7CiAgICAgIF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIl8iXS5ldmlsKHNjcmlwdCk7CiAgICB9CiAgfSwKfSk7Cl9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIl8iXS5yZWdpc3Rlcih7CiAgcnVsZTogewogICAgaG9zdDogL14od3d3XC4pP2VtYmVkdXBsb2FkXC5jb20kLywKICAgIHBhdGg6IC9eXC8kLywKICAgIHF1ZXJ5OiAvXlw/XHd7Mn09XHcrJC8sCiAgfSwKICBhc3luYyByZWFkeSAoKSB7CiAgICBjb25zdCBkb3dubG9hZFBhZ2UgPSBPYmplY3QoX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdKSgnLmNhdGVnb3JpZXMgYVt0YXJnZXQ9X2JsYW5rXScpOwogICAgYXdhaXQgX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdLm9wZW5MaW5rKGRvd25sb2FkUGFnZSk7CiAgfSwKfSk7Cl9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIl8iXS5yZWdpc3Rlcih7CiAgcnVsZTogewogICAgaG9zdDogL153d3dcLmZpbGVwcm9qZWN0XC5jb21cLmJyJC8sCiAgICBwYXRoOiAvXlwvZmlsZXNcLysvLAogIH0sCiAgYXN5bmMgcmVhZHkgKCkgewogICAgY29uc3QgbSA9IF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXS5zZWFyY2hGcm9tU2NyaXB0cygvPGEgaWQ9ImRvd24iIGhyZWY9IihbXiJdKykiPi8pOwogICAgYXdhaXQgX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdLm9wZW5MaW5rKG1bMV0pOwogIH0sCn0pOwpfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyJfIl0ucmVnaXN0ZXIoewogIHJ1bGU6IHsKICAgIGhvc3Q6IFsKICAgICAgL14od3d3XC4pP2luZGlzaGFyZVwuKG9yZ3xtZSkkLywKICAgICAgL15iZHVwbG9hZFwuKGluZm98YXNpYSkkLywKICAgICAgL151cGdyYW5kXC5zaXRlJC8sCiAgICAgIC9eM3pmaWxlXC5uZXQkLywKICAgICAgL151cGxvYWRyYXJcLmNvbSQvLAogICAgXSwKICB9LAogIGFzeW5jIHJlYWR5ICgpIHsKICAgIGNvbnN0IGJ0biA9IE9iamVjdChfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0pKCdidXR0b24jZG93bmxvYWRidG4uZG93bmxvYWRidG4nKTsKICAgIGJ0bi5yZW1vdmVBdHRyaWJ1dGUoJ2Rpc2FibGVkJyk7CiAgICBidG4uY2xpY2soKTsKICB9LAp9KTsKX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siXyJdLnJlZ2lzdGVyKHsKICBydWxlOiB7CiAgICBob3N0OiAvXmluc3VyYW5jZS13YWlmdVwuY2YkLywKICAgIHF1ZXJ5OiAvdT0oLispJC8sCiAgfSwKICBhc3luYyByZWFkeSAoKSB7CiAgICBjb25zdCBmID0gT2JqZWN0KF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXSkoJ2Zvcm0nKTsKICAgIGNvbnN0IGFyZ3MgPSB7fTsKICAgIF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIl8iXS5mb3JFYWNoKGYsICh2KSA9PiB7CiAgICAgIGFyZ3Nbdi5uYW1lXSA9IHYudmFsdWU7CiAgICB9KTsKICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdLnBvc3QoZi5nZXRBdHRyaWJ1dGUoJ2FjdGlvbicpLCBhcmdzKTsKICAgIGNvbnN0IGwgPSByZXNwb25zZS5tYXRjaCgvd2luZG93XC5sb2NhdGlvblwuaHJlZi4nKFteJ10rKSc7Lyk7CiAgICBhd2FpdCBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0ub3BlbkxpbmsobFsxXSk7CiAgfSwKfSk7Cl9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIl8iXS5yZWdpc3Rlcih7CiAgcnVsZTogewogICAgaG9zdDogL14od3d3XC4pP2poZWJlcmdcLm5ldCQvLAogICAgcGF0aDogL15cL2NhcHRjaGFcLy8sCiAgfSwKICBhc3luYyByZWFkeSAoKSB7CiAgICBPYmplY3QoX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdKSgnLmRsLWJ1dHRvbicpLmNsaWNrKCk7CiAgfSwKfSk7Cl9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIl8iXS5yZWdpc3Rlcih7CiAgcnVsZTogewogICAgaG9zdDogL14od3d3XC4pP2poZWJlcmdcLm5ldCQvLAogICAgcGF0aDogL15cL3JlZGlyZWN0XC8vLAogIH0sCiAgYXN5bmMgcmVhZHkgKCkgewogICAgJ3VzZSBzdHJpY3QnOwogICAgX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdLnJlbW92ZUFsbFRpbWVyKCk7CiAgICBjb25zdCBtYXRjaGVzID0gX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdLnNlYXJjaEZyb21TY3JpcHRzKC8nc2x1Zyc6XHMqJyhbXiddKyknLFxzKidob3N0ZXInOlxzKicoW14nXSspJy8pOwogICAgY29uc3Qgc2x1ZyA9IG1hdGNoZXNbMV07CiAgICBjb25zdCBob3N0ZXIgPSBtYXRjaGVzWzJdOwogICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0ucG9zdCgnL2dldC9saW5rLycsIHsKICAgICAgc2x1ZywKICAgICAgaG9zdGVyLAogICAgfSk7CiAgICBjb25zdCByZXNwSlNPTiA9IEpTT04ucGFyc2UocmVzcG9uc2UpOwogICAgYXdhaXQgX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdLm9wZW5MaW5rKHJlc3BKU09OLnVybCk7CiAgfSwKfSk7Cl9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIl8iXS5yZWdpc3Rlcih7CiAgcnVsZTogewogICAgaG9zdDogL15taXJyb3JhY2VcLihjb218b3JnKSQvLAogICAgcGF0aDogL15cL21cLy4rXC9cZCsvLAogIH0sCiAgYXN5bmMgcmVhZHkgKCkgewogICAgY29uc3QgbWEgPSBPYmplY3QoX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdKSgnYS51ay1idXR0b246bnRoLWNoaWxkKDIpJyk7CiAgICBhd2FpdCBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0ub3BlbkxpbmsobWEuaHJlZik7CiAgfSwKfSk7Cl9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIl8iXS5yZWdpc3Rlcih7CiAgcnVsZTogewogICAgaG9zdDogWwogICAgICAvXih3d3dcLik/bWlycm9yY3JlYXRvclwuY29tJC8sCiAgICAgIC9eKHd3d1wuKT9taXJyb3JlZFwudG8kLywKICAgIF0sCiAgICBwYXRoOiAvXlwvZG93bmxpbmtcLy8sCiAgfSwKICBhc3luYyByZWFkeSAoKSB7CiAgICBjb25zdCBhID0gT2JqZWN0KF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXSkoJy5jb2wtc20uY2VudGVyZWQuaGlnaGxpZ2h0IGEnKTsKICAgIGF3YWl0IF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXS5vcGVuTGluayhhLmhyZWYpOwogIH0sCn0pOwpfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyJfIl0ucmVnaXN0ZXIoewogIHJ1bGU6IHsKICAgIGhvc3Q6IFsKICAgICAgL14od3d3XC4pP21pcnJvcmNyZWF0b3JcLmNvbSQvLAogICAgICAvXih3d3dcLik/bWlycm9yZWRcLnRvJC8sCiAgICBdLAogICAgcGF0aDogL15cL2ZpbGVzXC8vLAogIH0sCiAgYXN5bmMgcmVhZHkgKCkgewogICAgT2JqZWN0KF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXSkoJyNkbF9mb3JtJykuc3VibWl0KCk7CiAgfSwKfSk7Cl9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIl8iXS5yZWdpc3Rlcih7CiAgcnVsZTogewogICAgaG9zdDogL15tdWx0aWZpbGVtaXJyb3JcLmNvbSQvLAogIH0sCiAgYXN5bmMgcmVhZHkgKCkgewogICAgY29uc3QgbSA9IE9iamVjdChfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0pKCcjbGNvZGUgZm9ybSBidXR0b24nKTsKICAgIG0uY2xpY2soKTsKICB9LAp9KTsKX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siXyJdLnJlZ2lzdGVyKHsKICBydWxlOiB7CiAgICBob3N0OiAvXnd3d1wubXVsdGl1cGZpbGVcLmNvbSQvLAogICAgcGF0aDogL15cL2ZcLy8sCiAgfSwKICBhc3luYyByZWFkeSAoKSB7CiAgICBjb25zdCBmID0gT2JqZWN0KF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXSkoJyN5dzAnKTsKICAgIGYuc3VibWl0KCk7CiAgfSwKfSk7Cl9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIl8iXS5yZWdpc3Rlcih7CiAgcnVsZTogewogICAgaG9zdDogL15teWxpbmtnZW5cLmNvbSQvLAogICAgcGF0aDogL15cL3BcLyguKykkLywKICB9LAogIGFzeW5jIHN0YXJ0IChtKSB7CiAgICBhd2FpdCBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0ub3BlbkxpbmsoJy9nLycgKyBtLnBhdGhbMV0pOwogIH0sCn0pOwpfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyJfIl0ucmVnaXN0ZXIoewogIHJ1bGU6IHsKICAgIGhvc3Q6IC9ebXlsaW5rZ2VuXC5jb20kLywKICAgIHBhdGg6IC9eXC9nXC8vLAogIH0sCiAgYXN5bmMgcmVhZHkgKCkgewogICAgY29uc3QgYSA9IE9iamVjdChfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0pKCcjbWFpbi1jb250ZW50IGEuYnRuLmJ0bi1kZWZhdWx0Jyk7CiAgICBhd2FpdCBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0ub3BlbkxpbmsoYS5ocmVmKTsKICB9LAp9KTsKX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siXyJdLnJlZ2lzdGVyKHsKICBydWxlOiB7CiAgICBob3N0OiAvXih3d3dcLik/cHV0bG9ja2VyXC5jb20kLywKICAgIHBhdGg6IC9eXC9maWxlXC9bMC05QS1GXSskLywKICB9LAogIGFzeW5jIHJlYWR5ICgpIHsKICAgIGNvbnN0IGMgPSBPYmplY3QoX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdKSgnI2NvbmZpcm1fZm9ybScpOwogICAgYy5zdWJtaXQoKTsKICB9LAp9KTsKX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siXyJdLnJlZ2lzdGVyKHsKICBydWxlOiB7CiAgICBob3N0OiAvXnVwbG9hZGhhdmVuXC5jb20kLywKICAgIHBhdGg6IC9eXC9kb3dubG9hZFwvLywKICB9LAogIGFzeW5jIHJlYWR5ICgpIHsKICAgIGF3YWl0IF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIl8iXS53YWl0KDUwMDApOwogICAgY29uc3QgZiA9IE9iamVjdChfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0pKCcuY29udGFjdEZvcm0gI2Rvd25sb2FkTm93QnRuLmJ0bi5idG4tcHJpbWFyeScpOwogICAgZi5jbGljaygpOwogIH0sCn0pOwpfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyJfIl0ucmVnaXN0ZXIoewogIHJ1bGU6IHsKICAgIGhvc3Q6IC9eKHd3d1wuKT91cG1pcnJvclwuaW5mbyQvLAogIH0sCiAgYXN5bmMgcmVhZHkgKCkgewogICAgX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdLnNldENvb2tpZSgndXNlcicsICdwcHAnKTsKICAgIGlmIChfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0uJCgnI2NvdW50RG93blRleHQnKSkgewogICAgICBhd2FpdCBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0ub3BlbkxpbmsoZG9jdW1lbnQubG9jYXRpb24udG9TdHJpbmcoKSk7CiAgICB9CiAgfSwKfSk7Cl9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIl8iXS5yZWdpc3Rlcih7CiAgcnVsZTogewogICAgaG9zdDogL14od3d3XC4pP3ZpZHRvXC5tZSQvLAogIH0sCiAgYXN5bmMgcmVhZHkgKCkgewogICAgY29uc3QgZiA9IE9iamVjdChfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0pKCcjYnRuX2Rvd25sb2FkJykuZm9ybTsKICAgIGF3YWl0IF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIl8iXS53YWl0KDYgKiAxMDAwKTsKICAgIGYuc3VibWl0KCk7CiAgfSwKfSk7Cl9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIl8iXS5yZWdpc3Rlcih7CiAgcnVsZTogewogICAgaG9zdDogWwogICAgICAvXnp1cGxvYWRcLm1lJC8sCiAgICAgIC9eemVlZmlsZXNcLmRvd25sb2FkJC8sCiAgICBdLAogIH0sCiAgYXN5bmMgcmVhZHkgKCkgewogICAgY29uc3QgeiA9IE9iamVjdChfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0pKCdidXR0b24jbGlua19idXR0b24nKTsKICAgIHoucmVtb3ZlQXR0cmlidXRlKCdkaXNhYmxlZCcpOwogICAgei5jbGljaygpOwogIH0sCn0pOwpfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyJfIl0ucmVnaXN0ZXIoewogIHJ1bGU6IHsKICAgIGhvc3Q6IC9eMDFcLm5sJC8sCiAgfSwKICBhc3luYyByZWFkeSAoKSB7CiAgICBjb25zdCBmID0gT2JqZWN0KF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXSkoJ2lmcmFtZSNyZWRpcmVjdGZyYW1lJyk7CiAgICBhd2FpdCBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0ub3BlbkxpbmsoZi5zcmMpOwogIH0sCn0pOwpfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyJfIl0ucmVnaXN0ZXIoewogIHJ1bGU6IHsKICAgIGhvc3Q6IC9eMTBjb1wuKGJpenx4eXp8Y298bWUpJC8sCiAgfSwKICBhc3luYyByZWFkeSAoKSB7CiAgICBjb25zdCBkID0gT2JqZWN0KF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXSkoJy5nbycpOwogICAgYXdhaXQgX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdLm9wZW5MaW5rKGQuZGF0YXNldC5ocmVmKTsKICB9LAp9KTsKX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siXyJdLnJlZ2lzdGVyKHsKICBydWxlOiB7CiAgICBob3N0OiAvXih3d3dcLik/KDFiZXwxZGwpXC5iaXokLywKICAgIHBhdGg6IC9eXC96XC5waHAkLywKICAgIHF1ZXJ5OiAvXlw/KC4rKS8sCiAgfSwKICBhc3luYyBzdGFydCAobSkgewogICAgYXdhaXQgX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdLm9wZW5MaW5rKG0ucXVlcnlbMV0pOwogIH0sCn0pOwpfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyJfIl0ucmVnaXN0ZXIoewogIHJ1bGU6IHsKICAgIGhvc3Q6IC9eKDFiZXwxZGwpXC5iaXokLywKICAgIHBhdGg6IC9eXC9banRdXC5waHAkLywKICAgIHF1ZXJ5OiAvXlw/cz0vLAogIH0sCiAgYXN5bmMgcmVhZHkgKCkgewogICAgY29uc3QgYSA9IE9iamVjdChfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0pKCcuai1saW5rJyk7CiAgICBhd2FpdCBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0ub3BlbkxpbmsoYS5ocmVmKTsKICB9LAp9KTsKX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siXyJdLnJlZ2lzdGVyKHsKICBydWxlOiB7CiAgICBob3N0OiAvXjFpbmtcLihjY3xpbmZvKSQvLAogICAgcGF0aDogL15cL1x3KyQvLAogIH0sCiAgYXN5bmMgcmVhZHkgKCkgewogICAgbGV0IHVybCA9IGRvY3VtZW50LmhlYWQucXVlcnlTZWxlY3RvcignW25hbWU9a2V5d29yZHNdJykuY29udGVudDsKICAgIGNvbnN0IHVybENoZWNrID0gdXJsLm1hdGNoKC9eaHR0cHM/OlwvXC8vKTsKICAgIGlmICghdXJsQ2hlY2spIHsKICAgICAgdXJsID0gJ2h0dHA6Ly8nICsgdXJsOwogICAgfQogICAgYXdhaXQgX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdLm9wZW5MaW5rKHVybCk7CiAgfSwKfSk7Cl9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIl8iXS5yZWdpc3Rlcih7CiAgcnVsZTogewogICAgaG9zdDogL14od3d3XC4pPzF0aW55XC5uZXQkLywKICAgIHBhdGg6IC9cL1x3Ky8sCiAgfSwKICBhc3luYyByZWFkeSAoKSB7CiAgICBjb25zdCBkaXJlY3RVcmwgPSBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0uc2VhcmNoRnJvbVNjcmlwdHMoL3dpbmRvd1wubG9jYXRpb249JyhbXiddKyknOy8pOwogICAgaWYgKCFkaXJlY3RVcmwpIHsKICAgICAgdGhyb3cgbmV3IF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIl8iXS5BZHNCeXBhc3NlckVycm9yKCdzY3JpcHQgY29udGVudCBjaGFuZ2VkJyk7CiAgICB9CiAgICBhd2FpdCBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0ub3BlbkxpbmsoZGlyZWN0VXJsWzFdKTsKICB9LAp9KTsKX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siXyJdLnJlZ2lzdGVyKHsKICBydWxlOiB7CiAgICBob3N0OiAvXjF2XC50byQvLAogICAgcGF0aDogL15cL3RcL1thLXpBLVowLTkvPV0rLywKICB9LAogIGFzeW5jIHN0YXJ0ICgpIHsKICAgIGNvbnN0IHBhdGggPSB3aW5kb3cubG9jYXRpb24uaHJlZi5yZXBsYWNlKCcvdC8nLCAnL3NhbGllbmRvLycpOwogICAgYXdhaXQgX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdLm9wZW5MaW5rKHBhdGgpOwogIH0sCn0pOwpfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyJfIl0ucmVnaXN0ZXIoewogIHJ1bGU6IHsKICAgIGhvc3Q6IC9eKHd3d1wuKT80ZnVuXC50dyQvLAogIH0sCiAgYXN5bmMgcmVhZHkgKCkgewogICAgY29uc3QgaSA9IE9iamVjdChfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0pKCcjb3JpZ2luYWxfdXJsJyk7CiAgICBhd2FpdCBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0ub3BlbkxpbmsoaS52YWx1ZSk7CiAgfSwKfSk7Cl9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIl8iXS5yZWdpc3Rlcih7CiAgcnVsZTogewogICAgaG9zdDogL15hZDJsaW5rc1wuY29tJC8sCiAgICBwYXRoOiAvXlwvXHctLiskLywKICB9LAogIGFzeW5jIHJlYWR5ICgpIHsKICAgIF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXS5yZW1vdmUoJ2lmcmFtZScpOwogICAgYXdhaXQgX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdLm9wZW5MaW5rKHdpbmRvdy5sb2NhdGlvbi50b1N0cmluZygpLCB7CiAgICAgIHBvc3Q6IHsKICAgICAgICBpbWFnZTogJ1NraXAgQWQuJywKICAgICAgfSwKICAgIH0pOwogIH0sCn0pOwpfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyJfIl0ucmVnaXN0ZXIoewogIHJ1bGU6IHsKICAgIGhvc3Q6IC9eYWQ0XC5mciQvLAogIH0sCiAgYXN5bmMgcmVhZHkgKCkgewogICAgX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdLnJlbW92ZSgnaWZyYW1lJyk7CiAgICBjb25zdCBzID0gX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdLnNlYXJjaEZyb21TY3JpcHRzKC8ic3JjIiwgIihbXiJdKykiLyk7CiAgICBpZiAoIXMpIHsKICAgICAgX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siXyJdLndhcm4oJ2NoYW5nZWQnKTsKICAgICAgcmV0dXJuOwogICAgfQogICAgYXdhaXQgX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdLm9wZW5MaW5rKHNbMV0pOwogIH0sCn0pOwooZnVuY3Rpb24gKCkgewogIF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIl8iXS5yZWdpc3Rlcih7CiAgICBydWxlOiB7CiAgICAgIGhvc3Q6IC9eYWQ3XC5iaXokLywKICAgICAgcGF0aDogL15cL1xkK1wvKC4qKSQvLAogICAgfSwKICAgIGFzeW5jIHN0YXJ0IChtKSB7CiAgICAgIF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXS5yZW1vdmUoJ2lmcmFtZScpOwogICAgICBsZXQgcmVkaXJlY3RMaW5rID0gbS5wYXRoWzFdOwogICAgICBpZiAoIXJlZGlyZWN0TGluay5tYXRjaCgvXmh0dHBzPzpcL1wvLykpIHsKICAgICAgICByZWRpcmVjdExpbmsgPSAnaHR0cDovLycgKyByZWRpcmVjdExpbms7CiAgICAgIH0KICAgICAgYXdhaXQgX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdLm9wZW5MaW5rKHJlZGlyZWN0TGluayk7CiAgICB9LAogIH0pOwogIF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIl8iXS5yZWdpc3Rlcih7CiAgICBydWxlOiB7CiAgICAgIGhvc3Q6IC9eYWQ3XC5iaXokLywKICAgICAgcGF0aDogL15cL1x3KyQvLAogICAgfSwKICAgIGFzeW5jIHJlYWR5ICgpIHsKICAgICAgX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdLnJlbW92ZSgnaWZyYW1lJyk7CiAgICAgIGNvbnN0IHNjcmlwdCA9IF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXS5zZWFyY2hGcm9tU2NyaXB0cygnY29uc3Qgcl91cmwnKTsKICAgICAgbGV0IHVybCA9IHNjcmlwdC5tYXRjaCgvJnVybD0oW14mXSspLyk7CiAgICAgIHVybCA9IHVybFsxXTsKICAgICAgYXdhaXQgX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdLm9wZW5MaW5rKHVybCk7CiAgICB9LAogIH0pOwp9KSgpOwooZnVuY3Rpb24gKCkgewogIF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIl8iXS5yZWdpc3Rlcih7CiAgICBydWxlOiB7CiAgICAgIGhvc3Q6IFsKICAgICAgICAvXih3d3dcLik/YWRiXC51ZyQvLAogICAgICAgIC9eKHd3d1wuKT9seW5rXC5teSQvLAogICAgICAgIC9eKHd3d1wuKT9hZHlvdVwuKGNvfG1lKSQvLAogICAgICBdLAogICAgICBwYXRoOiAvXig/IVwvKD86cHJpdmFjeXx0ZXJtc3xjb250YWN0KFwvLiopP3wjLiopPyQpLiokLywKICAgIH0sCiAgICBhc3luYyByZWFkeSAoKSB7CiAgICAgIF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXS5yZW1vdmUoJ2lmcmFtZScpOwogICAgICBjb25zdCBtID0gX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdLnNlYXJjaEZyb21TY3JpcHRzKC90b3BcLmxvY2F0aW9uXC5ocmVmPSIoW14iXSspIi8pOwogICAgICBpZiAobSkgewogICAgICAgIGF3YWl0IF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXS5vcGVuTGluayhtWzFdKTsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgICAgY29uc3QgYXJncyA9IGF3YWl0IGdldEFyZ3VtZW50cygpOwogICAgICB0cnlMaW5rKGFyZ3MpOwogICAgfSwKICB9KTsKICBmdW5jdGlvbiBnZXRBcmd1bWVudHMgKCkgewogICAgY29uc3QgUEFUVEVSTiA9IC9ce1xzKl9hcmdzW159XStcfVtefV0rXH0vOwogICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7CiAgICAgIGNvbnN0IG0gPSBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0uc2VhcmNoRnJvbVNjcmlwdHMoUEFUVEVSTik7CiAgICAgIGlmIChtKSB7CiAgICAgICAgcmVzb2x2ZShtKTsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgICAgY29uc3Qgb2JzZXJ2ZXIgPSBuZXcgTXV0YXRpb25PYnNlcnZlcigobXV0YXRpb25zKSA9PiB7CiAgICAgICAgbXV0YXRpb25zLmZvckVhY2goKG11dGF0aW9uKSA9PiB7CiAgICAgICAgICBtdXRhdGlvbi5hZGRlZE5vZGVzLmZvckVhY2goKG5vZGUpID0+IHsKICAgICAgICAgICAgaWYgKG5vZGUubG9jYWxOYW1lID09PSAnc2NyaXB0JykgewogICAgICAgICAgICAgIGNvbnN0IG0gPSBub2RlLnRleHRDb250ZW50Lm1hdGNoKFBBVFRFUk4pOwogICAgICAgICAgICAgIGlmIChtKSB7CiAgICAgICAgICAgICAgICBvYnNlcnZlci5kaXNjb25uZWN0KCk7CiAgICAgICAgICAgICAgICByZXNvbHZlKG0pOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgfSk7CiAgICAgICAgfSk7CiAgICAgIH0pOwogICAgICBvYnNlcnZlci5vYnNlcnZlKGRvY3VtZW50LmJvZHksIHsKICAgICAgICBjaGlsZExpc3Q6IHRydWUsCiAgICAgIH0pOwogICAgfSkudGhlbigobSkgPT4gewogICAgICByZXR1cm4gX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siXyJdLmV2aWwoYCgke21bMF19KWApOwogICAgfSk7CiAgfQogIGZ1bmN0aW9uIHRyeUxpbmsgKGFyZ3MpIHsKICAgIGNvbnN0IHVybCA9IHdpbmRvdy5sb2NhdGlvbi5wYXRobmFtZSArICcvc2tpcF90aW1lcic7CiAgICBjb25zdCBpID0gc2V0SW50ZXJ2YWwoKCkgPT4gewogICAgICBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0ucG9zdCh1cmwsIGFyZ3MpLnRoZW4oKHRleHQpID0+IHsKICAgICAgICBjb25zdCBqaiA9IEpTT04ucGFyc2UodGV4dCk7CiAgICAgICAgaWYgKCFqai5lcnJvcnMgJiYgamoubWVzc2FnZXMpIHsKICAgICAgICAgIGNsZWFySW50ZXJ2YWwoaSk7CiAgICAgICAgICBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0ub3BlbkxpbmsoamoubWVzc2FnZXMudXJsKTsKICAgICAgICB9CiAgICAgIH0pOwogICAgfSwgMTAwMCk7CiAgfQp9KSgpOwooZnVuY3Rpb24gKCkgewogIF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIl8iXS5yZWdpc3Rlcih7CiAgICBydWxlOiB7CiAgICAgIGhvc3Q6IC9eYWRmXC5seSQvLAogICAgICBwYXRoOiAvXlwvcmVkaXJlY3RpbmdcLyguKykkLywKICAgIH0sCiAgICBhc3luYyBzdGFydCAobSkgewogICAgICBjb25zdCB1cmwgPSBhdG9iKG0ucGF0aFsxXSk7CiAgICAgIGF3YWl0IF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXS5vcGVuTGluayh1cmwpOwogICAgfSwKICB9KTsKICBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyJfIl0ucmVnaXN0ZXIoewogICAgcnVsZTogewogICAgICBwYXRoOiAvXC9sb2NrZWQkLywKICAgICAgcXVlcnk6IC91cmw9KFteJl0rKS8sCiAgICB9LAogICAgYXN5bmMgc3RhcnQgKG0pIHsKICAgICAgX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdLnJlc2V0Q29va2llcygpOwogICAgICBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0uc2V0Q29va2llKCdGTFlTRVNTSUQnLCBnZW5lcmF0ZVJhbmRvbVNlc3Npb25Db29raWUoNDApKTsKICAgICAgY29uc3QgdXJsID0gZGVjb2RlVVJJQ29tcG9uZW50KG0ucXVlcnlbMV0pOwogICAgICBpZiAodXJsLm1hdGNoKC9eaHR0cC8pKSB7CiAgICAgICAgYXdhaXQgX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdLm9wZW5MaW5rKHVybCk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgYXdhaXQgX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdLm9wZW5MaW5rKGRvY3VtZW50LnJlZmVycmVyKTsKICAgICAgfQogICAgfSwKICB9KTsKICBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyJfIl0ucmVnaXN0ZXIoewogICAgcnVsZTogewogICAgICBwYXRoOiAvcHVzaHJlZGlyZWN0LywKICAgICAgcXVlcnk6IC8uKmRlc3Q9KFteJl0rKS8sCiAgICB9LAogICAgYXN5bmMgc3RhcnQgKG0pIHsKICAgICAgY29uc3QgdXJsID0gZGVjb2RlVVJJQ29tcG9uZW50KG0ucXVlcnlbMV0pOwogICAgICBpZiAodXJsLm1hdGNoKC9eaHR0cC8pKSB7CiAgICAgICAgYXdhaXQgX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdLm9wZW5MaW5rKHVybCk7CiAgICAgIH0KICAgIH0sCiAgfSk7CiAgX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siXyJdLnJlZ2lzdGVyKHsKICAgIHJ1bGU6IHsKICAgICAgcXVlcnk6IC9scD1hZGZseV9hbGxvdyYuKmhyZWY9KFteJl0rKS8sCiAgICB9LAogICAgYXN5bmMgc3RhcnQgKG0pIHsKICAgICAgY29uc3QgdXJsID0gZGVjb2RlVVJJQ29tcG9uZW50KG0ucXVlcnlbMV0pOwogICAgICBpZiAodXJsLm1hdGNoKC9eaHR0cC8pKSB7CiAgICAgICAgYXdhaXQgX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdLm9wZW5MaW5rKHVybCk7CiAgICAgIH0KICAgIH0sCiAgfSk7CiAgX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siXyJdLnJlZ2lzdGVyKHsKICAgIHJ1bGUgKCkgewogICAgICBjb25zdCBoID0gX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdLiQoJ2h0bWxbaWQ9Im1haW5faHRtbCJdJyk7CiAgICAgIGlmIChoKSB7CiAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgIH0KICAgIH0sCiAgICBhc3luYyBzdGFydCAoKSB7CiAgICAgIF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXS53aW5kb3cuZG9jdW1lbnQud3JpdGUgPSBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyJfIl0ubm9wOwogICAgICBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0ud2luZG93LmJ0b2EgPSBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyJfIl0ubm9wOwogICAgfSwKICAgIGFzeW5jIHJlYWR5ICgpIHsKICAgICAgX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdLnJlbW92ZSgnaWZyYW1lJyk7CiAgICAgIF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXS5zZXRDb29raWUoJ0ZMWVNFU1NJRCcsIGdlbmVyYXRlUmFuZG9tU2Vzc2lvbkNvb2tpZSg0MCkpOwogICAgICBjb25zdCBjbG9zZSA9IF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXS4kKCdkaXZbb25jbGljaz0iY2xvc2VfYmFyKCk7Il0nKTsKICAgICAgaWYgKGNsb3NlKSB7CiAgICAgICAgY2xvc2UuY2xpY2soKTsKICAgICAgfQogICAgICBsZXQgcnYgPSBhd2FpdCBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0uZ2V0KGxvY2F0aW9uLmhyZWYsICcnLCB7CiAgICAgICAgJ09yaWdpbic6IF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIl8iXS5ub25lLAogICAgICAgICdSZWZlcmVyJzogX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siXyJdLm5vbmUsCiAgICAgICAgJ1gtUmVxdWVzdGVkLVdpdGgnOiBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyJfIl0ubm9uZSwKICAgICAgfSk7CiAgICAgIHJ2ID0gX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdLnRvRE9NKHJ2KTsKICAgICAgcnYgPSBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0uc2VhcmNoRnJvbVNjcmlwdHMoL3ZhciB5c21tID0gJyhbXiddKyknLywgcnYpOwogICAgICBydiA9IHJ2WzFdOwogICAgICBydiA9IGRlY29kZVRva2VuKHJ2KTsKICAgICAgYXdhaXQgX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdLm9wZW5MaW5rKHJ2KTsKICAgIH0sCiAgfSk7CiAgZnVuY3Rpb24gZ2VuZXJhdGVSYW5kb21TZXNzaW9uQ29va2llIChsZW5ndGgpIHsKICAgIGNvbnN0IHJ2ID0gW107CiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbmd0aDsgKytpKSB7CiAgICAgIHJ2LnB1c2goTWF0aC5yYW5kb20oKS50b1N0cmluZygzNikuY2hhckF0KDIpKTsKICAgIH0KICAgIHJldHVybiBydi5qb2luKCcnKTsKICB9CiAgZnVuY3Rpb24gZGVjb2RlVG9rZW4gKHRva2VuKSB7CiAgICBsZXQgYSA9ICcnOwogICAgbGV0IGIgPSAnJzsKICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdG9rZW4ubGVuZ3RoOyArK2kpIHsKICAgICAgaWYgKGkgJSAyID09PSAwKSB7CiAgICAgICAgYSA9IGEgKyB0b2tlbi5jaGFyQXQoaSk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgYiA9IHRva2VuLmNoYXJBdChpKSArIGI7CiAgICAgIH0KICAgIH0KICAgIHRva2VuID0gYSArIGI7CiAgICBhID0gdG9rZW4uc3BsaXQoJycpOwogICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhLmxlbmd0aDsgKytpKSB7CiAgICAgIGlmICgvXGQvLnRlc3QoYVtpXSkpIHsKICAgICAgICBmb3IgKGxldCBqID0gaSArIDE7IGogPCBhLmxlbmd0aDsgKytqKSB7CiAgICAgICAgICBpZiAoL1xkLy50ZXN0KGFbal0pKSB7CiAgICAgICAgICAgIGIgPSBhW2ldIF4gYVtqXTsKICAgICAgICAgICAgaWYgKGIgPCAxMCkgewogICAgICAgICAgICAgIGFbaV0gPSBiOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGkgPSBqOwogICAgICAgICAgICBqID0gYS5sZW5ndGg7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICB0b2tlbiA9IGEuam9pbignJyk7CiAgICB0b2tlbiA9IGF0b2IodG9rZW4pOwogICAgdG9rZW4gPSB0b2tlbi5zdWJzdHJpbmcoMTYpOwogICAgdG9rZW4gPSB0b2tlbi5zdWJzdHJpbmcoMCwgdG9rZW4ubGVuZ3RoIC0gMTYpOwogICAgaWYgKGxvY2F0aW9uLmhhc2gpIHsKICAgICAgdG9rZW4gKz0gbG9jYXRpb24uaGFzaDsKICAgIH0KICAgIHJldHVybiB0b2tlbjsKICB9Cn0pKCk7Cl9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIl8iXS5yZWdpc3Rlcih7CiAgcnVsZTogJ2h0dHA6Ly9hZGZvYy51cy8qJywKICBhc3luYyByZWFkeSAoKSB7CiAgICBjb25zdCBwcm9taXNlID0gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHsKICAgICAgY29uc3Qgcm9vdCA9IGRvY3VtZW50LmJvZHk7CiAgICAgIGNvbnN0IG9ic2VydmVyID0gbmV3IE11dGF0aW9uT2JzZXJ2ZXIoKCkgPT4gewogICAgICAgIGxldCBvID0gX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdLiQoJyNzaG93U2tpcCcpOwogICAgICAgIGlmIChvKSB7CiAgICAgICAgICBvYnNlcnZlci5kaXNjb25uZWN0KCk7CiAgICAgICAgICBvID0gby5xdWVyeVNlbGVjdG9yKCdhJyk7CiAgICAgICAgICByZXNvbHZlKG8uaHJlZik7CiAgICAgICAgfQogICAgICB9KTsKICAgICAgb2JzZXJ2ZXIub2JzZXJ2ZShyb290LCB7CiAgICAgICAgY2hpbGRMaXN0OiB0cnVlLAogICAgICAgIHN1YnRyZWU6IHRydWUsCiAgICAgIH0pOwogICAgfSk7CiAgICBjb25zdCB1cmwgPSBhd2FpdCBwcm9taXNlOwogICAgYXdhaXQgX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdLm9wZW5MaW5rKHVybCk7CiAgfSwKfSk7Cl9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIl8iXS5yZWdpc3Rlcih7CiAgcnVsZTogewogICAgaG9zdDogL14od3d3XC4pP2FkbG90XC51cyQvLAogIH0sCiAgYXN5bmMgcmVhZHkgKCkgewogICAgX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdLnJlbW92ZSgnaWZyYW1lJyk7CiAgICBjb25zdCBzY3JpcHQgPSBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0uc2VhcmNoRnJvbVNjcmlwdHMoJ2Zvcm0nKTsKICAgIGNvbnN0IHAgPSAvbmFtZT0nKFteJ10rKScgdmFsdWU9JyhbXiddKyknL2c7CiAgICBjb25zdCBvcHQgPSB7CiAgICAgIGltYWdlOiAnICcsCiAgICB9OwogICAgbGV0IHRtcCA9IG51bGw7CiAgICB3aGlsZSAoKHRtcCA9IHAuZXhlYyhzY3JpcHQpKSkgewogICAgICBvcHRbdG1wWzFdXSA9IHRtcFsyXTsKICAgIH0KICAgIGF3YWl0IF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXS5vcGVuTGluaygnJywgewogICAgICBwYXRoOiBvcHQsCiAgICB9KTsKICB9LAp9KTsKX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siXyJdLnJlZ2lzdGVyKHsKICBydWxlOiB7CiAgICBob3N0OiAvXmFkbXlcLmxpbmskLywKICB9LAogIGFzeW5jIHJlYWR5ICgpIHsKICAgIGNvbnN0IGYgPSBPYmplY3QoX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdKSgnZm9ybS5lZGl0X2xpbmsnKTsKICAgIGYuc3VibWl0KCk7CiAgfSwKfSk7Cl9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIl8iXS5yZWdpc3Rlcih7CiAgcnVsZTogewogICAgaG9zdDogL14od3d3XC4pP2FoLWluZm9ybWF0aXF1ZVwuY29tJC8sCiAgICBwYXRoOiAvXlwvWmlwVXJsLywKICB9LAogIGFzeW5jIHJlYWR5ICgpIHsKICAgIGNvbnN0IGEgPSBPYmplY3QoX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdKSgnI3ppcDMgYScpOwogICAgYXdhaXQgX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdLm9wZW5MaW5rKGEuaHJlZik7CiAgfSwKfSk7CihmdW5jdGlvbiAoKSB7CiAgX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siXyJdLnJlZ2lzdGVyKHsKICAgIHJ1bGU6IHsKICAgICAgaG9zdDogL15haFwucGUkLywKICAgIH0sCiAgICBhc3luYyByZWFkeSAoKSB7CiAgICAgIGxldCBzY3JpcHQgPSBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0uc2VhcmNoRnJvbVNjcmlwdHMoJ2V2YWwnKTsKICAgICAgc2NyaXB0ID0gZGVjb2RlU2NyaXB0KHNjcmlwdCk7CiAgICAgIHNjcmlwdCA9IGRlY29kZVNjcmlwdChzY3JpcHQpOwogICAgICBzY3JpcHQgPSBkZWNvZGVTY3JpcHQoc2NyaXB0KTsKICAgICAgbGV0IHBhdGggPSBzY3JpcHQubWF0Y2goLyhbXjs9IF0rKT0oW14rIDtdKylcKyJcLiJcKyhbXisgXSspXCsiXC4iXCsoW147IF0rKTsvKTsKICAgICAgaWYgKCFwYXRoKSB7CiAgICAgICAgdGhyb3cgbmV3IF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIl8iXS5BZHNCeXBhc3NlckVycm9yKCdzY3JpcHQgY2hhbmdlZCcpOwogICAgICB9CiAgICAgIGlmICh0eXBlb2YgX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdLndpbmRvd1twYXRoWzJdXSA9PT0gJ3VuZGVmaW5lZCcpIHsKICAgICAgICBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyJfIl0uaW5mbygncmVjYXB0Y2hhJyk7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIHBhdGggPSBbX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdLndpbmRvd1twYXRoWzJdXSwgX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdLndpbmRvd1twYXRoWzNdXSwgX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdLndpbmRvd1twYXRoWzRdXV0uam9pbignLicpOwogICAgICBhd2FpdCBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0ub3BlbkxpbmsocGF0aCk7CiAgICB9LAogIH0pOwogIGZ1bmN0aW9uIGRlY29kZVNjcmlwdCAoZW5jb2RlZCkgewogICAgbGV0IGEgPSBlbmNvZGVkLm1hdGNoKC9eXHMqO2V2YWxcKCguKylcKTtccyokLyk7CiAgICBhID0gYVsxXTsKICAgIGNvbnN0IGIgPSBhLm1hdGNoKC9eKC4rKVwoJyhbXiddKyknLCcoW14nXSspJywnKFteJ10rKScsJyhbXiddKyknXCkkLyk7CiAgICBjb25zdCBjID0gX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siXyJdLmV2aWwoYCgke2JbMV19KWApOwogICAgcmV0dXJuIGMoYlsyXSwgYlszXSwgYls0XSwgYls1XSk7CiAgfQp9KSgpOwpfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyJfIl0ucmVnaXN0ZXIoewogIHJ1bGU6IHsKICAgIGhvc3Q6IC9eYWthXC5nciQvLAogIH0sCiAgYXN5bmMgcmVhZHkgKCkgewogICAgY29uc3QgbCA9IE9iamVjdChfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0pKCdpZnJhbWUjeW91cmxzLWZyYW1lJyk7CiAgICBhd2FpdCBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0ub3BlbkxpbmsobC5zcmMpOwogIH0sCn0pOwpfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyJfIl0ucmVnaXN0ZXIoewogIHJ1bGU6IHsKICAgIGhvc3Q6IFsKICAgICAgL15hbFwubHkkLywKICAgICAgL15hbGx5XC5zaCQvLAogICAgICAvXmFsbHlcLnNob3J0ZW5zXC5jbyQvLAogICAgICAvXihkYXVzZWx8b25sZSlcLmNvJC8sCiAgICBdLAogIH0sCiAgYXN5bmMgcmVhZHkgKCkgewogICAgbGV0IGkgPSBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0uJCgnI2h0bWxfZWxlbWVudCcpOwogICAgaWYgKGkpIHsKICAgICAgX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdLnJlbW92ZSgnI21lc3NhJyk7CiAgICAgIGkuY2xhc3NMaXN0LnJlbW92ZSgnaGlkZGVuJyk7CiAgICAgIHJldHVybjsKICAgIH0KICAgIGkgPSBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0uc2VhcmNoRnJvbVNjcmlwdHMoLyJocmVmIiwiKFteIl0rKSIgXCsgaGFzaFwpXC5yZW1vdmUvKTsKICAgIGlmICghaSkgewogICAgICBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyJfIl0ud2Fybignc2l0ZSBjaGFuZ2VkJyk7CiAgICAgIHJldHVybjsKICAgIH0KICAgIGkgPSBpWzFdICsgbG9jYXRpb24uaGFzaDsKICAgIF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXS5vcGVuTGluayhpKTsKICB9LAp9KTsKX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siXyJdLnJlZ2lzdGVyKHsKICBydWxlOiB7CiAgICBob3N0OiBbCiAgICAgIC9eKHd3d1wuKT9hbGxrZXlzaG9wXC5jb20kLywKICAgICAgL15jc2hvcnRcLm9yZyQvLAogICAgXSwKICB9LAogIGFzeW5jIHJlYWR5ICgpIHsKICAgIGxldCBtYXRjaGVzID0gX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdLnNlYXJjaEZyb21TY3JpcHRzKC93aW5kb3dcLmxvY2F0aW9uXC5ocmVmID0gIihbXiJdKykiLyk7CiAgICBtYXRjaGVzID0gbWF0Y2hlc1sxXTsKICAgIF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXS5udWtlKG1hdGNoZXMpOwogICAgYXdhaXQgX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdLm9wZW5MaW5rKG1hdGNoZXMpOwogIH0sCn0pOwpfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyJfIl0ucmVnaXN0ZXIoewogIHJ1bGU6IHsKICAgIGhvc3Q6IC9eYXBrbW9kaWZcLmNvbSQvLAogIH0sCiAgYXN5bmMgcmVhZHkgKCkgewogICAgY29uc3QgYSA9IE9iamVjdChfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0pKCdbbmFtZT0iZ2V0dXJsIl0nKS5nZXRBdHRyaWJ1dGUoJ3ZhbHVlJyk7CiAgICBhd2FpdCBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0ub3BlbkxpbmsoYSk7CiAgfSwKfSk7CihmdW5jdGlvbiAoKSB7CiAgY29uc3QgYWpheFBhdHRlcm4gPSAvXCQucG9zdFwoJyhbXiddKiknW157XSsoXHtccypvcHQ6XHMqJ21ha2VfbG9nJ1tefV0rXH1ccypcfSksL2k7CiAgX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siXyJdLnJlZ2lzdGVyKHsKICAgIHJ1bGU6IHsKICAgICAgaG9zdDogL15iY1wudmMkLywKICAgICAgcGF0aDogL14uKyhodHRwcz86XC9cLy4rKSQvLAogICAgfSwKICAgIGFzeW5jIHN0YXJ0IChtKSB7CiAgICAgIGF3YWl0IF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXS5vcGVuTGluayhtLnBhdGhbMV0gKyBkb2N1bWVudC5sb2NhdGlvbi5zZWFyY2ggKyBkb2N1bWVudC5sb2NhdGlvbi5oYXNoKTsKICAgIH0sCiAgfSk7CiAgX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siXyJdLnJlZ2lzdGVyKHsKICAgIHJ1bGU6IHsKICAgICAgaG9zdDogL15iY1wudmMkLywKICAgICAgcGF0aDogL15cLy4rLywKICAgIH0sCiAgICBhc3luYyByZWFkeSAoKSB7CiAgICAgIF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXS5yZW1vdmUoJ2lmcmFtZScpOwogICAgICBjb25zdCB0b2tlbiA9IGF3YWl0IGZpbmRBSkFYVG9rZW4oKTsKICAgICAgY29uc3QgdGltZSA9IGZha2VBSkFYVG9rZW4oKTsKICAgICAgY29uc3QgdXJsID0gYC9mbHkvbG4ucGhwP3dkcz0ke3Rva2VuLndkc30mdGltZT0ke3RpbWV9YDsKICAgICAgYXdhaXQgX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siXyJdLndhaXQoNTAwMCk7CiAgICAgIGxldCBydiA9IGF3YWl0IF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXS5wb3N0KHVybCwgewogICAgICAgIHhkZjogewogICAgICAgICAgYWZnOiAzMDAsCiAgICAgICAgICBiZmc6IDY0MCwKICAgICAgICAgIGNmZzogNDgwLAogICAgICAgICAgamtpOiB0b2tlbi5qa2ksCiAgICAgICAgICBkZmc6IDY0MCwKICAgICAgICAgIGVmZzogNDgwLAogICAgICAgICAgcnQ6IHRva2VuLnJ0LAogICAgICAgIH0sCiAgICAgICAgb2prOiB0b2tlbi5vamssCiAgICAgIH0pOwogICAgICBydiA9IEpTT04ucGFyc2UocnYpOwogICAgICBpZiAocnYuZXJyb3IpIHsKICAgICAgICB0aHJvdyBuZXcgX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siXyJdLkFkc0J5cGFzc2VyRXJyb3IoJ2F1dGggZXJyb3InKTsKICAgICAgfQogICAgICBhd2FpdCBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0ub3BlbkxpbmsocnYubWVzc2FnZS51cmwpOwogICAgfSwKICB9KTsKICBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyJfIl0ucmVnaXN0ZXIoewogICAgcnVsZTogewogICAgICBob3N0OiBbCiAgICAgICAgL15teWxpbmtcLnVzJC8sCiAgICAgICAgL154YWZveFwuY29tJC8sCiAgICAgICAgL156cG96XC5uZXQkLywKICAgICAgICAvXnd3d1wuYWRqZXRcLmV1JC8sCiAgICAgIF0sCiAgICAgIHBhdGg6IC9eXC8uKy8sCiAgICB9LAogICAgcmVhZHk6IHJ1biwKICB9KTsKICBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyJfIl0ucmVnaXN0ZXIoewogICAgcnVsZTogewogICAgICBob3N0OiAvXnlzZWFyXC5jaCQvLAogICAgICBwYXRoOiAvXlwvLisvLAogICAgfSwKICAgIGFzeW5jIHJlYWR5ICgpIHsKICAgICAgY29uc3QgYSA9IF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXS4kKCdkaXYuZmx5X2hlYWQgYS5jbG9zZScpOwogICAgICBjb25zdCBmID0gX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdLiQoJ2lmcmFtZS5mbHlfZnJhbWUnKTsKICAgICAgaWYgKGEgJiYgZikgewogICAgICAgIGF3YWl0IF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXS5vcGVuTGluayhmLnNyYyk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgYXdhaXQgcnVuKCk7CiAgICAgIH0KICAgIH0sCiAgfSk7CiAgX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siXyJdLnJlZ2lzdGVyKHsKICAgIHJ1bGU6IHsKICAgICAgaG9zdDogL15hZDVcLmV1JC8sCiAgICAgIHBhdGg6IC9eXC9bXi5dKyQvLAogICAgfSwKICAgIGFzeW5jIHJlYWR5ICgpIHsKICAgICAgX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdLnJlbW92ZSgnaWZyYW1lJyk7CiAgICAgIGNvbnN0IHMgPSBzZWFyY2hTY3JpcHQodHJ1ZSk7CiAgICAgIGxldCBtID0gcy5zY3JpcHQubWF0Y2goLyg8Zm9ybSBuYW1lPSJmb3JtMSJtZXRob2Q9InBvc3QiLiooPyE8XFxmb3JtPik8XC9mb3JtPikvKTsKICAgICAgaWYgKCFtKSB7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIG0gPSBtWzFdOwogICAgICBjb25zdCB0eiA9IC0obmV3IERhdGUoKS5nZXRUaW1lem9uZU9mZnNldCgpIC8gNjApOwogICAgICBtID0gbS5yZXBsYWNlKCdcJyt0aW1lem9uZStcJycsIHR6KTsKICAgICAgY29uc3QgZCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpOwogICAgICBkLnNldEF0dHJpYnV0ZSgnaWQnLCAnQWRzQnlwYXNzZXJGVFcnKTsKICAgICAgZC5zZXRBdHRyaWJ1dGUoJ3N0eWxlJywgJ2Rpc3BsYXk6bm9uZTsnKTsKICAgICAgZC5pbm5lckhUTUwgPSBtOwogICAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGQpOwogICAgICBPYmplY3QoX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdKSgnI0Fkc0J5cGFzc2VyRlRXID4gZm9ybVtuYW1lPWZvcm0xXScpLnN1Ym1pdCgpOwogICAgfSwKICB9KTsKICBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyJfIl0ucmVnaXN0ZXIoewogICAgcnVsZTogewogICAgICBob3N0OiAvXnRyNVwuaW4kLywKICAgICAgcGF0aDogL15cLy4rLywKICAgIH0sCiAgICBhc3luYyByZWFkeSAoKSB7CiAgICAgIGF3YWl0IHJ1bih0cnVlKTsKICAgIH0sCiAgfSk7CiAgZnVuY3Rpb24gZGVjb21wcmVzcyAoc2NyaXB0LCB1bnppcCkgewogICAgaWYgKCF1bnppcCkgewogICAgICByZXR1cm4gc2NyaXB0OwogICAgfQogICAgbGV0IG1hdGNoZXMgPSBzY3JpcHQubWF0Y2goL2V2YWwoLiopLyk7CiAgICBpZiAoIW1hdGNoZXMpIHsKICAgICAgdGhyb3cgbmV3IF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIl8iXS5BZHNCeXBhc3NlckVycm9yKCdubyBzY3JpcHQgbWF0Y2hlcyAvZXZhbCguKikvJyk7CiAgICB9CiAgICBtYXRjaGVzID0gbWF0Y2hlc1sxXTsKICAgIHNjcmlwdCA9IF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIl8iXS5ldmlsKG1hdGNoZXMpOwogICAgcmV0dXJuIHNjcmlwdDsKICB9CiAgZnVuY3Rpb24gc2VhcmNoU2NyaXB0ICh1bnppcCkgewogICAgbGV0IGNvbnRlbnQgPSBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0uc2VhcmNoRnJvbVNjcmlwdHMoJ21ha2VfbG9nJyk7CiAgICBpZiAoY29udGVudCkgewogICAgICByZXR1cm4gewogICAgICAgIGRpcmVjdDogZmFsc2UsCiAgICAgICAgc2NyaXB0OiBkZWNvbXByZXNzKGNvbnRlbnQsIHVuemlwKSwKICAgICAgfTsKICAgIH0KICAgIGNvbnRlbnQgPSBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0uc2VhcmNoRnJvbVNjcmlwdHMoJ2NsaWNrX2xvZycpOwogICAgaWYgKGNvbnRlbnQpIHsKICAgICAgcmV0dXJuIHsKICAgICAgICBkaXJlY3Q6IHRydWUsCiAgICAgICAgc2NyaXB0OiBkZWNvbXByZXNzKGNvbnRlbnQsIHVuemlwKSwKICAgICAgfTsKICAgIH0KICAgIHRocm93IG5ldyBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyJfIl0uQWRzQnlwYXNzZXJFcnJvcignc2NyaXB0IGNoYW5nZWQnKTsKICB9CiAgZnVuY3Rpb24ga25vY2tTZXJ2ZXIgKHNjcmlwdCwgZGlydHlGaXgpIHsKICAgIGNvbnN0IG1hdGNoZXMgPSBzY3JpcHQubWF0Y2goYWpheFBhdHRlcm4pOwogICAgaWYgKCFtYXRjaGVzKSB7CiAgICAgIHRocm93IG5ldyBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyJfIl0uQWRzQnlwYXNzZXJFcnJvcignKGluIGtub2NrIHNlcnZlcikgbm8gc2NyaXB0IG1hdGNoZXMgJC5wb3N0Jyk7CiAgICB9CiAgICBjb25zdCBtYWtlX3VybCA9IG1hdGNoZXNbMV07CiAgICBjb25zdCBtYWtlX29wdHMgPSBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyJfIl0uZXZpbChgKCR7bWF0Y2hlc1syXX0pYCk7CiAgICBjb25zdCBpID0gc2V0SW50ZXJ2YWwoZnVuY3Rpb24gKCkgewogICAgICBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0ucG9zdChtYWtlX3VybCwgbWFrZV9vcHRzKS50aGVuKGZ1bmN0aW9uICh0ZXh0KSB7CiAgICAgICAgaWYgKGRpcnR5Rml4KSB7CiAgICAgICAgICB0ZXh0ID0gdGV4dC5tYXRjaCgvXHsuK1x9LylbMF07CiAgICAgICAgfQogICAgICAgIGNvbnN0IGpqID0gSlNPTi5wYXJzZSh0ZXh0KTsKICAgICAgICBpZiAoamoubWVzc2FnZSkgewogICAgICAgICAgY2xlYXJJbnRlcnZhbChpKTsKICAgICAgICAgIHJldHVybiBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0ub3BlbkxpbmsoamoubWVzc2FnZS51cmwpOwogICAgICAgIH0KICAgICAgfSk7CiAgICB9LCAxMDAwKTsKICB9CiAgYXN5bmMgZnVuY3Rpb24gcnVuIChkaXJ0eUZpeCkgewogICAgX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdLnJlbW92ZSgnaWZyYW1lJyk7CiAgICBsZXQgcmVzdWx0ID0gc2VhcmNoU2NyaXB0KHRydWUpOwogICAgaWYgKCFyZXN1bHQuZGlyZWN0KSB7CiAgICAgIGtub2NrU2VydmVyKHJlc3VsdC5zY3JpcHQsZGlydHlGaXgpOwogICAgfSBlbHNlIHsKICAgICAgcmVzdWx0ID0gcmVzdWx0LnNjcmlwdC5tYXRjaCgvdG9wXC5sb2NhdGlvblwuaHJlZj0nKFteJ10rKScvKTsKICAgICAgaWYgKCFyZXN1bHQpIHsKICAgICAgICB0aHJvdyBuZXcgX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siXyJdLkFkc0J5cGFzc2VyRXJyb3IoJ3NjcmlwdCBjaGFuZ2VkJyk7CiAgICAgIH0KICAgICAgcmVzdWx0ID0gcmVzdWx0WzFdOwogICAgICBhd2FpdCBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0ub3BlbkxpbmsocmVzdWx0KTsKICAgIH0KICB9CiAgYXN5bmMgZnVuY3Rpb24gZmluZEFKQVhUb2tlbiAoKSB7CiAgICBjb25zdCBydiA9IF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXS5zZWFyY2hGcm9tU2NyaXB0cygneHl6Jyk7CiAgICBpZiAoIXJ2KSB7CiAgICAgIHRocm93IG5ldyBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyJfIl0uQWRzQnlwYXNzZXJFcnJvcignc2NyaXB0IGNoYW5nZWQnKTsKICAgIH0KICAgIGxldCB3ZHMgPSBydi5tYXRjaCgveHl6XHMqPVxzKicoW14nXSspJy8pOwogICAgaWYgKCF3ZHMpIHsKICAgICAgdGhyb3cgbmV3IF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIl8iXS5BZHNCeXBhc3NlckVycm9yKCdzY3JpcHQgY2hhbmdlZCcpOwogICAgfQogICAgd2RzID0gd2RzWzFdOwogICAgbGV0IGpraSA9IHJ2Lm1hdGNoKC90a25ccyo9XHMqJyhbXiddKyknLyk7CiAgICBpZiAoIWpraSkgewogICAgICB0aHJvdyBuZXcgX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siXyJdLkFkc0J5cGFzc2VyRXJyb3IoJ3NjcmlwdCBjaGFuZ2VkJyk7CiAgICB9CiAgICBqa2kgPSBqa2lbMV07CiAgICBjb25zdCBydCA9IE9iamVjdChfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0pKCcjcmVjYXB0Y2hhVG9rZW4nKTsKICAgIHdoaWxlICghcnQudmFsdWUpIHsKICAgICAgYXdhaXQgX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siXyJdLndhaXQoNTAwKTsKICAgIH0KICAgIHJldHVybiB7CiAgICAgIHdkczogd2RzLAogICAgICBqa2k6IGpraSwKICAgICAgb2prOiAnamZoZycsCiAgICAgIHJ0OiBydC52YWx1ZSwKICAgIH07CiAgfQogIGZ1bmN0aW9uIGZha2VBSkFYVG9rZW4gKCkgewogICAgY29uc3Qgc2tpcEFkID0gT2JqZWN0KF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXSkoJyNnZXRMaW5rJykucGFyZW50RWxlbWVudDsKICAgIGNvbnN0IG1hcmdpbiA9IDY7CiAgICBjb25zdCBmYWtlUGFnZVggPSBza2lwQWQub2Zmc2V0TGVmdCArIG1hcmdpbiArIDUwICsgKE1hdGgucmFuZG9tKCkgKiAxMCk7CiAgICBjb25zdCBmYWtlUGFnZVkgPSBza2lwQWQub2Zmc2V0VG9wICsgbWFyZ2luICsgMTUgKyAoTWF0aC5yYW5kb20oKSAqIDEpOwogICAgY29uc3QgcG8gPSBmYWtlUGFnZVggKyAnLCcgKyBmYWtlUGFnZVk7CiAgICBjb25zdCBwb3NYID0galF1ZXJ5T2Zmc2V0KHNraXBBZCkubGVmdCArIG1hcmdpbjsKICAgIGNvbnN0IHBvc1kgPSBqUXVlcnlPZmZzZXQoc2tpcEFkKS50b3AgKyBtYXJnaW47CiAgICBjb25zdCBwb3MgPSBNYXRoLmFicyhmYWtlUGFnZVggLSBwb3NYKSArICcsJyArIE1hdGguYWJzKGZha2VQYWdlWSAtIHBvc1kpOwogICAgY29uc3QgdHN0YV8gPSBNYXRoLmZsb29yKCg1ICsgTWF0aC5yYW5kb20oKSkgKiAxMDAwKTsKICAgIGNvbnN0IHRpbWUgPSBwbyArICc6JyArIHBvcyArICc6JyArIHRzdGFfOwogICAgcmV0dXJuIHRpbWU7CiAgfQogIGZ1bmN0aW9uIGpRdWVyeU9mZnNldCAoZWxlbWVudCkgewogICAgY29uc3QgciA9IGVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7CiAgICByZXR1cm4gewogICAgICB0b3A6IHIudG9wICsgZG9jdW1lbnQuYm9keS5zY3JvbGxUb3AsCiAgICAgIGxlZnQ6IHIubGVmdCArIGRvY3VtZW50LmJvZHkuc2Nyb2xsTGVmdCwKICAgIH07CiAgfQp9KSgpOwpfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyJfIl0ucmVnaXN0ZXIoewogIHJ1bGU6IHsKICAgIGhvc3Q6IC9eKHd3d1wuKT9iaWdsaXN0b2Z3ZWJzaXRlc1wuY29tJC8sCiAgICBwYXRoOiAvXlwvZ29cLyhcdytcLlx3KykkLywKICB9LAogIGFzeW5jIHN0YXJ0IChtKSB7CiAgICBhd2FpdCBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0ub3BlbkxpbmsoJ2h0dHA6Ly8nICsgbS5wYXRoWzFdKTsKICB9LAp9KTsKX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siXyJdLnJlZ2lzdGVyKHsKICBydWxlOiAnaHR0cDovL3d3dy5iaWxkLm1lL2JpbGQucGhwP2ZpbGU9KicsCiAgYXN5bmMgcmVhZHkgKCkgewogICAgY29uc3QgaSA9IE9iamVjdChfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0pKCcjQmlsZCcpOwogICAgYXdhaXQgX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdLm9wZW5MaW5rKGkuc3JjKTsKICB9LAp9KTsKX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siXyJdLnJlZ2lzdGVyKHsKICBydWxlOiAnaHR0cDovL2JpbGRyLm5vL3ZpZXcvKicsCiAgYXN5bmMgcmVhZHkgKCkgewogICAgY29uc3QgaSA9IE9iamVjdChfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0pKCdpbWcuYmlsZGUnKTsKICAgIGF3YWl0IF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXS5vcGVuTGluayhpLnNyYyk7CiAgfSwKfSk7Cl9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIl8iXS5yZWdpc3Rlcih7CiAgcnVsZTogWwogICAgewogICAgICBob3N0OiAvXih3d3dcLik/KFthLXpBLVowLTldK1wuKT9iaW5ib3hcLmlvJC8sCiAgICAgIHBhdGg6IC9cL29cLyhbYS16QS1aMC05XSspLywKICAgIH0sCiAgICB7CiAgICAgIGhvc3Q6IC9eZ3Ntem9uZVwuc2l0ZSQvLAogICAgICBwYXRoOiAvXC9nb1wvKFthLXpBLVowLTldKykvLAogICAgfSwKICBdLAogIGFzeW5jIHN0YXJ0IChtKSB7CiAgICBjb25zdCBkaXJlY3RfbGluayA9IHdpbmRvdy5hdG9iKG0ucGF0aFsxXSk7CiAgICBhd2FpdCBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0ub3BlbkxpbmsoZGlyZWN0X2xpbmspOwogIH0sCn0pOwpfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyJfIl0ucmVnaXN0ZXIoewogIHJ1bGU6IHsKICAgIGhvc3Q6IC9eYmxvZ1wubGFuZ3dcLndlYlwuaWQkLywKICB9LAogIGFzeW5jIHJlYWR5ICgpIHsKICAgIGNvbnN0IHVybCA9IGRlY29kZVVSSUNvbXBvbmVudChkZWNvZGVVUklDb21wb25lbnQoX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdLmdldENvb2tpZSgnd3BiX3Zpc2l0X3RpbWUnKSkpOwogICAgaWYgKHVybC5tYXRjaCgvXmh0dHAvKSkgewogICAgICBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0ucmVzZXRDb29raWVzKCk7CiAgICAgIGF3YWl0IF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXS5vcGVuTGluayh1cmwpOwogICAgfQogIH0sCn0pOwpfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyJfIl0ucmVnaXN0ZXIoewogIHJ1bGU6IHsKICAgIGhvc3Q6IC9eYmx1ZW1lZGlhZmlsZXNcLmNvbSQvLAogICAgcGF0aDogL15cL2NyZWF0aW5nbGlua3MvLAogIH0sCiAgYXN5bmMgcmVhZHkgKCkgewogICAgY29uc3QgYiA9IF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXS5zZWFyY2hGcm9tU2NyaXB0cygvRmluaXNoTWVzc2FnZSA9ICc8YSBocmVmPSIoW14iXSspIiA+Lyk7CiAgICBhd2FpdCBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0ub3BlbkxpbmsoYlsxXSk7CiAgfSwKfSk7Cl9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIl8iXS5yZWdpc3Rlcih7CiAgcnVsZTogewogICAgaG9zdDogL15jYXRjdXRcLm5ldCQvLAogIH0sCiAgYXN5bmMgcmVhZHkgKCkgewogICAgbGV0IGEgPSBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0uc2VhcmNoRnJvbVNjcmlwdHMoL2RlY29kZVVSSUNvbXBvbmVudFwoJyhbXiddKyknXCkvKTsKICAgIGEgPSBkZWNvZGVVUklDb21wb25lbnQoYVsxXSk7CiAgICBhID0gbmV3IFVSTChhKTsKICAgIGEgPSBhLnNlYXJjaFBhcmFtcy5nZXQoJ2EnKTsKICAgIGEgPSBhdG9iKGEpOwogICAgYXdhaXQgX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdLm9wZW5MaW5rKGEpOwogIH0sCn0pOwpfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyJfIl0ucmVnaXN0ZXIoewogIHJ1bGU6IHsKICAgIGhvc3Q6IC9eKHd3d1wuKT9jbGlcLmdzJC8sCiAgfSwKICBhc3luYyByZWFkeSAoKSB7CiAgICBjb25zdCBhID0gT2JqZWN0KF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXSkoJ2EuUmVkaXJlY3RMaW5rJyk7CiAgICBhd2FpdCBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0ub3BlbkxpbmsoYS5ocmVmKTsKICB9LAp9KTsKX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siXyJdLnJlZ2lzdGVyKHsKICBydWxlOiB7CiAgICBob3N0OiAvXmNsa1wuaW0kLywKICB9LAogIGFzeW5jIHJlYWR5ICgpIHsKICAgIF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXS5yZW1vdmUoJ2lmcmFtZScpOwogICAgY29uc3QgbWF0Y2hlcyA9IF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXS5zZWFyY2hGcm9tU2NyaXB0cygvXCRcKCJcLmNvdW50ZG93biJcKVwuYXR0clwoImhyZWYiLCIoW14iXSspIlwpLyk7CiAgICBhd2FpdCBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0ub3BlbkxpbmsobWF0Y2hlc1sxXSk7CiAgfSwKfSk7Cl9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIl8iXS5yZWdpc3Rlcih7CiAgcnVsZTogewogICAgaG9zdDogL15jb2NvbGVlY2hcLmNvbSQvLAogIH0sCiAgYXN5bmMgcmVhZHkgKCkgewogICAgY29uc3QgYSA9IE9iamVjdChfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0pKCcuYnRuLmJ0bi1ibG9jay5idG4tc3VjY2VzcycpOwogICAgYXdhaXQgX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdLm9wZW5MaW5rKGEuaHJlZik7CiAgfSwKfSk7CihmdW5jdGlvbiAoKSB7CiAgX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siXyJdLnJlZ2lzdGVyKHsKICAgIHJ1bGU6IHsKICAgICAgaG9zdDogWwogICAgICAgIC9eKGNvZWd8ZGlzaW5na2F0KVwuaW4kLywKICAgICAgICAvXnd3d1wuKHRlbG9uZGFzbXV8c2lvdG9uZ3xzaWhlcnApXC5jb20kLywKICAgICAgICAvXnd3d1wuZ3JlZ2V0XC5zcGFjZSQvLAogICAgICBdLAogICAgICBwYXRoOiAvXlwvLiskLywKICAgIH0sCiAgICBhc3luYyByZWFkeSAobSkgewogICAgICBjb25zdCBtYXBwZXIgPSBob3N0TWFwcGVyKG0uaG9zdFswXSk7CiAgICAgIGNvbnN0IGI2NCA9IG1hcHBlcigpLm1hdGNoKC9cP3I9KFtcdy9dKz17MCwyfSkvKTsKICAgICAgYXdhaXQgX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdLm9wZW5MaW5rKGF0b2IoYjY0WzFdKSk7CiAgICB9LAogIH0pOwogIF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIl8iXS5yZWdpc3Rlcih7CiAgICBydWxlOiB7CiAgICAgIGhvc3Q6IC9ec2lwa3VyXC5uZXQkLywKICAgICAgcGF0aDogWwogICAgICAgIC9eXC9cdyskLywKICAgICAgICAvXlwvbWVudWp1bGlua1wvLywKICAgICAgXSwKICAgIH0sCiAgICBhc3luYyByZWFkeSAoKSB7CiAgICAgIGxldCBkID0gT2JqZWN0KF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXSkoJyN0ZXN0YXBrID4gZGl2Jyk7CiAgICAgIGQgPSBkLm9uY2xpY2sudG9TdHJpbmcoKTsKICAgICAgZCA9IGQubWF0Y2goL3dpbmRvd1wub3BlblwoJyhbXiddKyknLyk7CiAgICAgIGF3YWl0IF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXS5vcGVuTGluayhkWzFdKTsKICAgIH0sCiAgfSk7CiAgZnVuY3Rpb24gaG9zdE1hcHBlciAoaG9zdCkgewogICAgc3dpdGNoIChob3N0KSB7CiAgICBjYXNlICdkaXNpbmdrYXQuaW4nOgogICAgICByZXR1cm4gKCkgPT4gewogICAgICAgIGNvbnN0IGEgPSBPYmplY3QoX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdKSgnYS5idG4tYmxvY2sucmVkaXJlY3QnKTsKICAgICAgICByZXR1cm4gYS5ocmVmOwogICAgICB9OwogICAgY2FzZSAnY29lZy5pbic6CiAgICBjYXNlICd3d3cudGVsb25kYXNtdS5jb20nOgogICAgY2FzZSAnd3d3LnNpb3RvbmcuY29tJzoKICAgIGNhc2UgJ3d3dy5zaWhlcnAuY29tJzoKICAgIGNhc2UgJ3d3dy5ncmVnZXQuc3BhY2UnOgogICAgICByZXR1cm4gKCkgPT4gewogICAgICAgIGNvbnN0IGEgPSBPYmplY3QoX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdKSgnLmRvd25sb2FkLWxpbmsgYScpOwogICAgICAgIHJldHVybiBhLmhyZWY7CiAgICAgIH07CiAgICBkZWZhdWx0OgogICAgICByZXR1cm4gbnVsbDsKICAgIH0KICB9Cn0pKCk7Cl9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIl8iXS5yZWdpc3Rlcih7CiAgcnVsZTogewogICAgaG9zdDogWwogICAgICAvXig/OihcdyspXC4pP2NvaW51cmxcLmNvbSQvLAogICAgICAvXig/OihcdyspXC4pP2N1clwubHYkLywKICAgIF0sCiAgICBwYXRoOiAvXlwvKFstXHddKykkLywKICB9LAogIGFzeW5jIHJlYWR5IChtKSB7CiAgICBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0ucmVtb3ZlKCdpZnJhbWUnKTsKICAgIGNvbnN0IGhvc3QgPSAnaHR0cDovL2N1ci5sdi9yZWRpcmVjdF9jdXJsdi5waHAnOwogICAgY29uc3QgcGFyYW0gPSBtLmhvc3RbMV0gPT09IHVuZGVmaW5lZCA/IHsKICAgICAgY29kZTogbS5wYXRoWzFdLAogICAgfSA6IHsKICAgICAgem9uZTogbS5ob3N0WzFdLAogICAgICBuYW1lOiBtLnBhdGhbMV0sCiAgICB9OwogICAgY29uc3QgbWFpbkZyYW1lQ29udGVudCA9IGF3YWl0IF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXS5nZXQoaG9zdCwgcGFyYW0pOwogICAgbGV0IGRvY01haW5GcmFtZSA9IG51bGw7CiAgICB0cnkgewogICAgICBkb2NNYWluRnJhbWUgPSBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0udG9ET00obWFpbkZyYW1lQ29udGVudCk7CiAgICB9IGNhdGNoIChlKSB7CiAgICAgIHRocm93IG5ldyBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyJfIl0uQWRzQnlwYXNzZXJFcnJvcignbWFpbiBmcmFtZSBjaGFuZ2VkJyk7CiAgICB9CiAgICBjb25zdCByRXh0cmFjdExpbmsgPSAvb25jbGljaz0ib3Blbl91cmxcKCcoW14nXSspJyxccyonZ28nXCkvOwogICAgX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siXyJdLmZvckVhY2goX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdLiQkKCdpZnJhbWUnLCBkb2NNYWluRnJhbWUpLCAoY3VyckZyYW1lKSA9PiB7CiAgICAgIGNvbnN0IGN1cnJGcmFtZUFkZHIgPSBjdXJyRnJhbWUuZ2V0QXR0cmlidXRlKCdzcmMnKTsKICAgICAgX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdLmdldChjdXJyRnJhbWVBZGRyKS50aGVuKChjdXJyRnJhbWVDb250ZW50KSA9PiB7CiAgICAgICAgY29uc3QgYVJlYWxMaW5rID0gckV4dHJhY3RMaW5rLmV4ZWMoY3VyckZyYW1lQ29udGVudCk7CiAgICAgICAgaWYgKGFSZWFsTGluayA9PT0gdW5kZWZpbmVkIHx8IGFSZWFsTGlua1sxXSA9PT0gdW5kZWZpbmVkKSB7CiAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIGNvbnN0IHJlYWxMaW5rID0gYVJlYWxMaW5rWzFdOwogICAgICAgIHJldHVybiBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0ub3BlbkxpbmsocmVhbExpbmspOwogICAgICB9KTsKICAgIH0pOwogIH0sCn0pOwpfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyJfIl0ucmVnaXN0ZXIoewogIHJ1bGU6IHsKICAgIGhvc3Q6IC9eY29teW9uZXRcLmNvbSQvLAogIH0sCiAgYXN5bmMgcmVhZHkgKCkgewogICAgY29uc3QgaW5wdXQgPSBPYmplY3QoX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdKSgnaW5wdXRbbmFtZT0iZW50ZXIiXScpOwogICAgaW5wdXQuY2xpY2soKTsKICB9LAp9KTsKX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siXyJdLnJlZ2lzdGVyKHsKICBydWxlOiB7CiAgICBob3N0OiAvXmNyb2Nrb2xpbmtzXC5jb20kLywKICB9LAogIGFzeW5jIHJlYWR5ICgpIHsKICAgIGNvbnN0IGMgPSBPYmplY3QoX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdKSgnLmhlYWQgPiBkaXY6bnRoLWNoaWxkKDMpID4gLnNraXAnKTsKICAgIGMuY2xpY2soKTsKICB9LAp9KTsKX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siXyJdLnJlZ2lzdGVyKHsKICBydWxlOiB7CiAgICBob3N0OiAvXmRhd25zdGF0aW9uXC5jb20kLywKICB9LAogIGFzeW5jIHJlYWR5ICgpIHsKICAgIGNvbnN0IGEgPSBPYmplY3QoX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdKSgnI3RpZGFrYWthbnNlbGFtYW55YSA+IGEnKTsKICAgIGF3YWl0IF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXS5vcGVuTGluayhhLmhyZWYpOwogIH0sCn0pOwpfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyJfIl0ucmVnaXN0ZXIoewogIHJ1bGU6IHsKICAgIGhvc3Q6IC9eZHVybFwubWUkLywKICB9LAogIGFzeW5jIHJlYWR5ICgpIHsKICAgIGNvbnN0IGEgPSBPYmplY3QoX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdKSgnYVtjbGFzcz0icHJvY2VlZEJ0biJdJyk7CiAgICBhd2FpdCBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0ub3BlbkxpbmsoYS5ocmVmKTsKICB9LAp9KTsKX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siXyJdLnJlZ2lzdGVyKHsKICBydWxlOiB7CiAgICBob3N0OiBbCiAgICAgIC9eZWFzeXVybFwubmV0JC8sCiAgICAgIC9eKGF0dXxjbGlja3RocnV8cmVkaXJlY3RzfHJlYWR0aGlzKVwuY2EkLywKICAgICAgL15nb3Nocmlua1wuY29tJC8sCiAgICBdLAogIH0sCiAgYXN5bmMgcmVhZHkgKCkgewogICAgY29uc3QgZiA9IE9iamVjdChfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0pKCdmcmFtZVtuYW1lPW1haW5dJyk7CiAgICBhd2FpdCBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0ub3BlbkxpbmsoZi5zcmMpOwogIH0sCn0pOwpfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyJfIl0ucmVnaXN0ZXIoewogIHJ1bGU6IHsKICAgIGhvc3Q6IFsKICAgICAgL14od3d3XC4pP3NoaW5rXC5tZSQvLAogICAgICAvXihzaG9ufGxpa24pXC54eXokLywKICAgICAgL15mYXNcLmxpJC8sCiAgICAgIC9eKHd3d1wuKT9jcm9jb1wuKG1lfHNpdGUpJC8sCiAgICAgIC9eY3BtbGlua1wubmV0JC8sCiAgICBdLAogICAgcGF0aDogL15cL1tcdy1dKyQvLAogIH0sCiAgYXN5bmMgcmVhZHkgKCkgewogICAgaWYgKCFfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0uJCgnI2NhcHRjaGEnKSkgewogICAgICBsZXQgZiA9IF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXS4kKCcjc2tpcCcpOwogICAgICBpZiAoZikgewogICAgICAgIGYuc3VibWl0KCk7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIGYgPSBPYmplY3QoX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdKSgnI2J0bi1tYWluJyk7CiAgICAgIGF3YWl0IF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXS5vcGVuTGluayhmLmhyZWYpOwogICAgICByZXR1cm47CiAgICB9CiAgICBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0ucmVtb3ZlKCdkaXZbY2xhc3MkPU92ZXJsYXldJyk7CiAgICBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0uYmxvY2soKG5vZGUpID0+IHsKICAgICAgaWYgKG5vZGUuY2xhc3NOYW1lLm1hdGNoKC9PdmVybGF5JC8pKSB7CiAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgIH0KICAgICAgaWYgKG5vZGUubG9jYWxOYW1lID09PSAnZGl2JykgewogICAgICAgIHJldHVybiBbCiAgICAgICAgICAnMjE0NzQ4MzY0NycsCiAgICAgICAgICAnMicsCiAgICAgICAgXS5zb21lKCh6KSA9PiB7CiAgICAgICAgICByZXR1cm4geiA9PT0gbm9kZS5zdHlsZS56SW5kZXg7CiAgICAgICAgfSk7CiAgICAgIH0KICAgICAgcmV0dXJuIGZhbHNlOwogICAgfSwgZG9jdW1lbnQuYm9keSk7CiAgfSwKfSk7Cl9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIl8iXS5yZWdpc3Rlcih7CiAgcnVsZTogWwogICAgewogICAgICBob3N0OiAvXmNwbWxpbmtcLm5ldCQvLAogICAgICBwYXRoOiAvXlwvZ29cL1tcdy1dKyQvLAogICAgfSwKICAgIHsKICAgICAgaG9zdDogL14od3d3XC4pP2Nyb2NvXC4obWV8c2l0ZSkkLywKICAgICAgcGF0aDogL15cL29rXC9cdyskLywKICAgIH0sCiAgXSwKICBhc3luYyByZWFkeSAoKSB7CiAgICBsZXQgYSA9IE9iamVjdChfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0pKCcjYnRuLW1haW4nKTsKICAgIGNvbnN0IGkgPSBhLmhyZWYubGFzdEluZGV4T2YoJ2h0dHAnKTsKICAgIGEgPSBhLmhyZWYuc3Vic3RyKGkpOwogICAgYXdhaXQgX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdLm9wZW5MaW5rKGEpOwogIH0sCn0pOwpfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyJfIl0ucmVnaXN0ZXIoewogIHJ1bGU6IHsKICAgIGhvc3Q6IFsKICAgICAgL15mYXNcLmxpJC8sCiAgICAgIC9eKHd3d1wuKT9zaGlua1wubWUkLywKICAgIF0sCiAgICBwYXRoOiAvXlwvZ29cL1x3KyQvLAogIH0sCiAgYXN5bmMgcmVhZHkgKCkgewogICAgY29uc3QgZiA9IE9iamVjdChfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0pKCcjc2tpcCcpOwogICAgZi5zdWJtaXQoKTsKICB9LAp9KTsKX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siXyJdLnJlZ2lzdGVyKHsKICBydWxlOiB7CiAgICBob3N0OiAvXmZpbGVtZWRpYVwubmV0JC8sCiAgfSwKICBhc3luYyByZWFkeSAoKSB7CiAgICBjb25zdCBzY3JpcHQgPSBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0uc2VhcmNoRnJvbVNjcmlwdHMoL3dpbmRvdy5sb2NhdGlvbi5ocmVmXHM/PVxzP1woIihodHRwLis/KSJcKS8pOwogICAgaWYgKHNjcmlwdC5sZW5ndGggPiAxKSB7CiAgICAgIGF3YWl0IF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXS5vcGVuTGluayhzY3JpcHRbMV0pOwogICAgfQogIH0sCn0pOwpfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyJfIl0ucmVnaXN0ZXIoewogIHJ1bGU6IHsKICAgIGhvc3Q6IC9eKHd3d1wuKT9maWxvb3BzXC5pbmZvJC8sCiAgfSwKICBhc3luYyByZWFkeSAoKSB7CiAgICBjb25zdCBhID0gT2JqZWN0KF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXSkoJyN0ZXh0ID4gY2VudGVyIGEsICN0ZXh0ID4gZGl2W2FsaWduPWNlbnRlcl0gYScpOwogICAgYXdhaXQgX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdLm9wZW5MaW5rKGEuaHJlZik7CiAgfSwKfSk7Cl9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIl8iXS5yZWdpc3Rlcih7CiAgcnVsZTogewogICAgaG9zdDogL14od3d3fGxpbmtzKVwuZml1eHlcLihjb3xieikkLywKICB9LAogIGFzeW5jIHJlYWR5ICgpIHsKICAgIGF3YWl0IF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXS5vcGVuTGluayhPYmplY3QoX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdKSgnYS5idG4uYScpLmhyZWYpOwogIH0KfSk7Cl9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIl8iXS5yZWdpc3Rlcih7CiAgcnVsZTogewogICAgaG9zdDogL15nYW1lbW9kXC5wcm8kLywKICAgIHBhdGg6IC9eXC9kb3dubG9hZC1maWxlXC8vLAogIH0sCiAgYXN5bmMgcmVhZHkgKCkgewogICAgY29uc3QgZ3AgPSBPYmplY3QoX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdKSgnI3dhaXQtZG9uZSA+IHAgPiBhJyk7CiAgICBhd2FpdCBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0ub3BlbkxpbmsoZ3AuaHJlZik7CiAgfSwKfSk7Cl9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIl8iXS5yZWdpc3Rlcih7CiAgcnVsZTogewogICAgaG9zdDogL15na3VybFwudXMkLywKICB9LAogIGFzeW5jIHJlYWR5ICgpIHsKICAgIGNvbnN0IGlmcmFtZSA9IE9iamVjdChfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0pKCcjZ2t1cmwtZnJhbWUnKTsKICAgIGF3YWl0IF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXS5vcGVuTGluayhpZnJhbWUuc3JjKTsKICB9LAp9KTsKX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siXyJdLnJlZ2lzdGVyKHsKICBydWxlOiB7CiAgICBob3N0OiAvXmdvdG9cLmxvbmNhdFwuaW4kLywKICAgIHF1ZXJ5OiAvb3Blbj0oLispLywKICB9LAogIGFzeW5jIHN0YXJ0IChtKSB7CiAgICBjb25zdCB1cmwgPSBhdG9iKGF0b2IobS5xdWVyeVsxXSkpOwogICAgYXdhaXQgX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdLm9wZW5MaW5rKHVybCk7CiAgfSwKfSk7Cl9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIl8iXS5yZWdpc3Rlcih7CiAgcnVsZTogewogICAgaG9zdDogWwogICAgICAvXmdzdXJsXC4obWV8aW4pJC8sCiAgICAgIC9eKGdzdWx8Z2V0c2x8Z2xpbmtzKVwubWUkLywKICAgICAgL15nc3VyXC5pbiQvLAogICAgICAvXmc1dVwucHckLywKICAgICAgL15ndXJsXC5seSQvLAogICAgXSwKICB9LAogIGFzeW5jIHJlYWR5ICgpIHsKICAgIF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXS5yZW1vdmUoJyNjb250YWluZXInKTsKICAgIGNvbnN0IGEgPSBPYmplY3QoX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdKSgnI2xpbmsnKTsKICAgIGF3YWl0IF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXS5vcGVuTGluayhgJHthLmhyZWZ9JmFiPSR7X0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdLndpbmRvdy54fWApOwogIH0sCn0pOwpfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyJfIl0ucmVnaXN0ZXIoewogIHJ1bGU6IHsKICAgIGhvc3Q6IC9eZ3VudGluZ1wud2ViXC5pZCQvLAogICAgcGF0aDogL15cL1x3KyQvLAogIH0sCiAgYXN5bmMgcmVhZHkgKCkgewogICAgY29uc3QgbCA9IE9iamVjdChfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0pKCdhLmJ0bi1ibG9jay5yZWRpcmVjdCcpOwogICAgYXdhaXQgX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdLm9wZW5MaW5rKGwuaHJlZik7CiAgfSwKfSk7Cl9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIl8iXS5yZWdpc3Rlcih7CiAgcnVsZTogewogICAgaG9zdDogL15oZWFsdGh5a2tcLmNvbSQvLAogICAgcGF0aDogL15cL3dvcmRwcmVzc1wvLywKICB9LAogIGFzeW5jIHJlYWR5ICgpIHsKICAgIGNvbnN0IGggPSBPYmplY3QoX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdKSgnI2NvbnRlbnQgY2VudGVyIGJ1dHRvbicpOwogICAgaC5jbGljaygpOwogIH0sCn0pOwpfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyJfIl0ucmVnaXN0ZXIoewogIHJ1bGU6IHsKICAgIGhvc3Q6IC9eaGVuLXRheVwubmV0JC8sCiAgICBwYXRoOiAvXlwvZ29cLy8sCiAgfSwKICBhc3luYyByZWFkeSAoKSB7CiAgICBjb25zdCBoID0gT2JqZWN0KF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXSkoJyNkb3dubG9hZF91cmwgZGl2IGEnKTsKICAgIGF3YWl0IF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXS5vcGVuTGluayhoLmhyZWYpOwogIH0sCn0pOwpfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyJfIl0ucmVnaXN0ZXIoewogIHJ1bGU6IHsKICAgIGhvc3Q6IC9eaG90c2hvcnR1cmxcLmNvbSQvLAogIH0sCiAgYXN5bmMgcmVhZHkgKCkgewogICAgY29uc3QgZnJhbWUgPSBPYmplY3QoX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdKSgnZnJhbWVbc2Nyb2xsaW5nPXllc10nKTsKICAgIGF3YWl0IF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXS5vcGVuTGluayhmcmFtZS5zcmMpOwogIH0sCn0pOwpfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyJfIl0ucmVnaXN0ZXIoewogIHJ1bGU6IHsKICAgIGhvc3Q6IC9eaWl2XC5wbCQvLAogIH0sCiAgYXN5bmMgcmVhZHkgKCkgewogICAgbGV0IGQgPSBPYmplY3QoX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdKSgnI2NvdW50aW5nJyk7CiAgICBsZXQgcnYgPSBhd2FpdCBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0ucG9zdChsb2NhdGlvbi5wYXRobmFtZSwgewogICAgICBibG9ja2VyOiAwLAogICAgICBzYWx0OiBkLmRhdGFzZXQuc2FsdCwKICAgIH0sIHsKICAgICAgJ1gtT0NUT0JFUi1SRVFVRVNULUhBTkRMRVInOiAnb25BZnRlclNob3J0Y3V0VmlldycsCiAgICAgICdYLU9DVE9CRVItUkVRVUVTVC1QQVJUSUFMUyc6ICdzaG9ydGN1dC9saW5rX3Nob3cnLAogICAgfSk7CiAgICBydiA9IEpTT04ucGFyc2UocnYpOwogICAgZCA9IF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXS50b0RPTShydlsnc2hvcnRjdXQvbGlua19zaG93J10pOwogICAgcnYgPSBPYmplY3QoX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdKSgnYScsIGQpOwogICAgYXdhaXQgX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdLm9wZW5MaW5rKHJ2LmhyZWYpOwogIH0sCn0pOwpfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyJfIl0ucmVnaXN0ZXIoewogIHJ1bGU6IHsKICAgIGhvc3Q6IC9eaXR3XC5tZSQvLAogICAgcGF0aDogL15cL3JcLy8sCiAgfSwKICBhc3luYyByZWFkeSAoKSB7CiAgICBjb25zdCBmID0gT2JqZWN0KF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXSkoJy5nby1mb3JtJyk7CiAgICBmLnN1Ym1pdCgpOwogIH0sCn0pOwpfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyJfIl0ucmVnaXN0ZXIoewogIHJ1bGU6IHsKICAgIGhvc3Q6IC9eaXR5XC5pbSQvLAogIH0sCiAgYXN5bmMgcmVhZHkgKCkgewogICAgbGV0IGYgPSBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0uJCgnI21haW4nKTsKICAgIGlmIChmKSB7CiAgICAgIGF3YWl0IF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXS5vcGVuTGluayhmLnNyYyk7CiAgICAgIHJldHVybjsKICAgIH0KICAgIFssICwgZl0gPSBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyJfIl0uZmluZChfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0uJCQoJ2ZyYW1lJyksIChmcmFtZSkgPT4gewogICAgICBpZiAoZnJhbWUuc3JjLmluZGV4T2YoJ2ludGVyaGVhZGVyLnBocCcpIDwgMCkgewogICAgICAgIHJldHVybiBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyJfIl0ubm9uZTsKICAgICAgfQogICAgICByZXR1cm4gZnJhbWUuc3JjOwogICAgfSk7CiAgICBpZiAoZiAhPT0gX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siXyJdLm5vbmUpIHsKICAgICAgYXdhaXQgX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdLm9wZW5MaW5rKGYpOwogICAgICByZXR1cm47CiAgICB9CiAgICBmID0gX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdLnNlYXJjaEZyb21TY3JpcHRzKC9rcnlwdGVkPShbXiZdKykvKTsKICAgIGlmICghZikgewogICAgICB0aHJvdyBuZXcgX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siXyJdLkFkc0J5cGFzc2VyRXJyb3IoJ3NpdGUgY2hhbmdlZCcpOwogICAgfQogICAgZiA9IGZbMV07CiAgICBjb25zdCBkYXRhID0gX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdLndpbmRvdy5kZXMoJ2tzbnNsbXRtazB2NFBkdml1c2FqcXUnLCBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0ud2luZG93LmhleFRvU3RyaW5nKGYpLCAwLCAwKTsKICAgIGlmIChkYXRhKSB7CiAgICAgIGF3YWl0IF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXS5vcGVuTGluaygnaHR0cDovL2l0eS5pbS8xMTA0XzIxXzUwODQ2XycgKyBkYXRhKTsKICAgIH0KICB9LAp9KTsKX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siXyJdLnJlZ2lzdGVyKHsKICBydWxlOiB7CiAgICBob3N0OiAvXih3d3dcLik/a2luZ29mc2hyaW5rXC5jb20kLywKICB9LAogIGFzeW5jIHJlYWR5ICgpIHsKICAgIGNvbnN0IGwgPSBPYmplY3QoX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdKSgnI3RleHRyZXN1bHQgPiBhJyk7CiAgICBhd2FpdCBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0ub3BlbkxpbmsobC5ocmVmKTsKICB9LAp9KTsKX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siXyJdLnJlZ2lzdGVyKHsKICBydWxlOiBbCiAgICB7CiAgICAgIGhvc3Q6IC9ec3RcLmt1cm9nYXplXC5uZXQkLywKICAgICAgcXVlcnk6IC9yPSguKykvLAogICAgfSwKICAgIHsKICAgICAgaG9zdDogL15zXC55dWtpc3Vic1wuY29tJC8sCiAgICAgIHF1ZXJ5OiAvbGluaz0oLispLywKICAgIH0sCiAgXSwKICBhc3luYyBzdGFydCAobSkgewogICAgY29uc3QgciA9IGF0b2IobS5xdWVyeVsxXSk7CiAgICBhd2FpdCBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0ub3Blbkxpbmsocik7CiAgfSwKfSk7Cl9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIl8iXS5yZWdpc3Rlcih7CiAgcnVsZTogewogICAgaG9zdDogL15zdFwua3Vyb2dhemVcLm5ldCQvLAogIH0sCiAgYXN5bmMgcmVhZHkgKCkgewogICAgY29uc3QgYSA9IE9iamVjdChfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0pKCdhLnJlZGlyZWN0Jyk7CiAgICBhd2FpdCBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0ub3BlbkxpbmsoYS5ocmVmKTsKICB9LAp9KTsKX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siXyJdLnJlZ2lzdGVyKHsKICBydWxlOiB7CiAgICBob3N0OiAvXmRsXC5sYXlhcmthY2EyMVwudmlwJC8sCiAgICBwYXRoOiAvXlwvaWZyYW1lXC8vLAogIH0sCiAgYXN5bmMgcmVhZHkgKCkgewogICAgY29uc3QgbHYgPSBPYmplY3QoX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdKSgnLmNvbnRlbnQgI3NraXAgYScpOwogICAgYXdhaXQgX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdLm9wZW5MaW5rKGx2LmhyZWYpOwogIH0sCn0pOwpfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyJfIl0ucmVnaXN0ZXIoewogIHJ1bGU6IHsKICAgIGhvc3Q6IC9eZGxcLmxheWFya2FjYTIxXC52aXAkLywKICAgIHBhdGg6IC9eXC8oLispXC8vLAogIH0sCiAgYXN5bmMgc3RhcnQgKG0pIHsKICAgIGF3YWl0IF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXS5vcGVuTGluaygnL2lmcmFtZS90b3AucGhwP3NsdWc9JyArIG0ucGF0aFsxXSk7CiAgfSwKfSk7Cl9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIl8iXS5yZWdpc3Rlcih7CiAgcnVsZTogewogICAgaG9zdDogL15sZWVjaGFsbFwuZG93bmxvYWQkLywKICAgIHBhdGg6IC9eXC9maWxlXC8oW2EtekEtWjAtOS89XSspLywKICB9LAogIGFzeW5jIHN0YXJ0IChtKSB7CiAgICBhd2FpdCBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0ub3BlbkxpbmsoZGVjb2RlVVJJQ29tcG9uZW50KGF0b2IobS5wYXRoWzFdKSkpOwogIH0sCn0pOwpfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyJfIl0ucmVnaXN0ZXIoewogIHJ1bGU6ICdodHRwOi8vd3d3LmxpZW5zY2FzaC5jb20vbC8qJywKICBhc3luYyByZWFkeSAoKSB7CiAgICBjb25zdCBhID0gT2JqZWN0KF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXSkoJyNyZWRpcl9idG4nKTsKICAgIGF3YWl0IF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXS5vcGVuTGluayhhLmhyZWYpOwogIH0sCn0pOwpfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyJfIl0ucmVnaXN0ZXIoewogIHJ1bGU6IHsKICAgIGhvc3Q6IC9eKHd3d1wuKT9saW5rXC5pbSQvLAogICAgcGF0aDogL15cL1x3KyQvLAogIH0sCiAgYXN5bmMgc3RhcnQgKCkgewogICAgY29uc3QgdGV4dCA9IGF3YWl0IF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXS5wb3N0KGRvY3VtZW50LmxvY2F0aW9uLmhyZWYsIHsKICAgICAgaW1hZ2U6ICdDb250aW51ZScsCiAgICB9KTsKICAgIGNvbnN0IG0gPSB0ZXh0Lm1hdGNoKC93aW5kb3dcLmxvY2F0aW9uXC5yZXBsYWNlXCgnKFteJ10rKSdcKS8pOwogICAgYXdhaXQgX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdLm9wZW5MaW5rKG1bMV0pOwogIH0sCn0pOwpfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyJfIl0ucmVnaXN0ZXIoewogIHJ1bGU6IHsKICAgIGhvc3Q6IC9ebGlua1wudGwkLywKICAgIHBhdGg6IC9cLy8sCiAgfSwKICBhc3luYyByZWFkeSAoKSB7CiAgICBsZXQgbSA9IF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXS5zZWFyY2hGcm9tU2NyaXB0cygvZXZhbFwoKC4rfVwpKVwpLyk7CiAgICBtID0gX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siXyJdLmV2aWwoYCgke21bMV19KWApOwogICAgbGV0IGwgPSBtLm1hdGNoKC8oPzpcJFwuYWpheC4rfGhyZWY9JykoaHR0cC4rc2tpcC4rfGh0dHBbXiddKyknLGRhdGEvKTsKICAgIGwgPSBsWzFdOwogICAgaWYgKCFsLm1hdGNoKC9za2lwLykpIHsKICAgICAgYXdhaXQgX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdLm9wZW5MaW5rKGwpOwogICAgICByZXR1cm47CiAgICB9CiAgICBjb25zdCB0b2tlbiA9IG0ubWF0Y2goLydYLUNTUkYtVE9LRU4nOicoW14nXSspJ30sLyk7CiAgICBsZXQgcmwgPSBhd2FpdCBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0ucG9zdChsLCAnJywgewogICAgICAnWC1DU1JGLVRPS0VOJzogdG9rZW5bMV0sCiAgICB9KTsKICAgIHJsID0gSlNPTi5wYXJzZShybCk7CiAgICBhd2FpdCBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0ub3BlbkxpbmsocmwudXJsKTsKICB9LAp9KTsKX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siXyJdLnJlZ2lzdGVyKHsKICBydWxlOiB7CiAgICBob3N0OiAvXmxpbms0YWRcLmNvbSQvLAogICAgcGF0aDogL15cLyguKykkLywKICB9LAogIGFzeW5jIHJlYWR5IChtKSB7CiAgICBsZXQgZCA9IE9iamVjdChfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0pKCdkaXZbaWRePW1vZHVsZV9dJyk7CiAgICBkID0gZC5pZC5tYXRjaCgvbW9kdWxlXyhcZCspLyk7CiAgICBkID0gZFsxXTsKICAgIGNvbnN0IHVybCA9IGF3YWl0IF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXS5wb3N0KCdmb3JtLnBocD9ibG9ja19pZD0nICsgZCwgewogICAgICBjbWQ6ICdnZXRfc291cmNlJywKICAgICAgYWN0OiAnd2FpdGluZycsCiAgICAgIGlkOiBtLnBhdGhbMV0sCiAgICB9KTsKICAgIGF3YWl0IF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXS5vcGVuTGluayh1cmwpOwogIH0sCn0pOwooZnVuY3Rpb24oKSB7CiAgY29uc3QgaG9zdFJ1bGVzID0gWwogICAgL14oKFtcd117OH18d3d3KVwuKT8oYWxsYW5hbHBhc3N8ZHJzdGlja3lmaW5nZXJzfHdoYWNreXZpZHopXC5jb20kLywKICAgIC9eKChbXHddezh9fHd3dylcLik/KGxpbmtiYWJlc3xsaW5rYnVja3MpXC5jb20kLywKICAgIC9eKChbXHddezh9fHd3dylcLik/dGhlc2VibG9nc1wuY29tJC8sCiAgICAvXndhcm5pbmctdGhpcy1saW5rY29kZS13aWxsLWNlYXNlLXdvcmtpbmctc29vblwud3d3XC5saW5rYnVja3NkbnNcLmNvbSQvLAogICAgL14oKFtcd117OH18d3d3KVwuKT8oZmlsZXNvbnRoZXxwb29udG93bnxzZXJpb3VzZGVhbHN8dXJsYmVhdClcLm5ldCQvLAogICAgL14oKFtcd117OH18d3d3KVwuKT8oemF0bmF3cXl8cmh2Z21yaXRteml3Y218ZHdyZnNsc3FwZGZxZnd5KVwubmV0JC8sCiAgICAvXigoW1x3XXs4fXx3d3cpXC4pP2ZyZWVhblwudXMkLywKICAgIC9eKChbXHddezh9fHd3dylcLik/KG1pbml1cmxzfHFxY3xycXF8dGlueWxpbmtzfHl5dilcLmNvJC8sCiAgICAvXigoW1x3XXs4fXx3d3cpXC4pP3lvdWZhcFwubWUkLywKICBdOwogIF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIl8iXS5yZWdpc3Rlcih7CiAgICBydWxlOiB7CiAgICAgIGhvc3Q6IGhvc3RSdWxlcywKICAgICAgcGF0aDogL15cL1x3K1wvdXJsXC8oLispJC8sCiAgICB9LAogICAgYXN5bmMgcmVhZHkobSkgewogICAgICBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0ucmVtb3ZlQWxsVGltZXIoKTsKICAgICAgX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdLnJlc2V0Q29va2llcygpOwogICAgICBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0ucmVtb3ZlKCdpZnJhbWUnKTsKICAgICAgbGV0IHVybCA9IG0ucGF0aFsxXSArIHdpbmRvdy5sb2NhdGlvbi5zZWFyY2g7CiAgICAgIGNvbnN0IG1hdGNoID0gX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdLnNlYXJjaEZyb21TY3JpcHRzKC9VcmxFbmNvZGVkOiAoW14sXSspLyk7CiAgICAgIGlmIChtYXRjaCAmJiBtYXRjaFsxXSA9PT0gJ3RydWUnKSB7CiAgICAgICAgdXJsID0gZGVjcnlwdCh1cmwpOwogICAgICB9CiAgICAgIGF3YWl0IF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXS5vcGVuTGluayh1cmwpOwogICAgfQogIH0pOwogIF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIl8iXS5yZWdpc3Rlcih7CiAgICBydWxlOiB7CiAgICAgIGhvc3Q6IGhvc3RSdWxlcywKICAgIH0sCiAgICBhc3luYyBzdGFydCAoKSB7CiAgICAgIF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXS53aW5kb3cuWE1MSHR0cFJlcXVlc3QgPSBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyJfIl0ubm9wOwogICAgfSwKICAgIGFzeW5jIHJlYWR5ICgpIHsKICAgICAgX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdLnJlbW92ZUFsbFRpbWVyKCk7CiAgICAgIF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXS5yZXNldENvb2tpZXMoKTsKICAgICAgX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdLnJlbW92ZSgnaWZyYW1lJyk7CiAgICAgIGlmICh3aW5kb3cubG9jYXRpb24ucGF0aG5hbWUuaW5kZXhPZigndmVyaWZ5JykgPj0gMCkgewogICAgICAgIGNvbnN0IHBhdGggPSB3aW5kb3cubG9jYXRpb24ucGF0aG5hbWUucmVwbGFjZSgnL3ZlcmlmeScsICcnKTsKICAgICAgICBhd2FpdCBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0ub3BlbkxpbmsocGF0aCk7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIGNvbnN0IHRva2VuID0gZmluZFRva2VuKGRvY3VtZW50KTsKICAgICAgY29uc3QgdXJsID0gYXdhaXQgc2VuZFJlcXVlc3QodG9rZW4pOwogICAgICBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0ubnVrZSh1cmwpOwogICAgICBhd2FpdCBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0ub3BlbkxpbmsodXJsKTsKICAgIH0sCiAgfSk7CiAgX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siXyJdLnJlZ2lzdGVyKHsKICAgIHJ1bGU6IHsKICAgICAgcXVlcnk6IC9eKC4qKVs/Jl1fbGJHYXRlPVxkKyQvLAogICAgfSwKICAgIGFzeW5jIHN0YXJ0IChtKSB7CiAgICAgIF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXS5zZXRDb29raWUoJ19sYkdhdGVQYXNzZWQnLCAndHJ1ZScpOwogICAgICBhd2FpdCBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0ub3Blbkxpbmsod2luZG93LmxvY2F0aW9uLnBhdGhuYW1lICsgbS5xdWVyeVsxXSk7CiAgICB9LAogIH0pOwogIGZ1bmN0aW9uIGZpbmRUb2tlbiAoY29udGV4dCkgewogICAgY29uc3Qgc2NyaXB0ID0gX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdLnNlYXJjaEZyb21TY3JpcHRzKCcgICAgdmFyIGYgPSB3aW5kb3dbXCdpbml0XCcgKyBcJ0xiXCcgKyBcJ2pzXCcgKyBcJ1wnXScsIGNvbnRleHQpOwogICAgaWYgKCFzY3JpcHQpIHsKICAgICAgX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siXyJdLndhcm4oJ3BhdHRlcm4gY2hhbmdlZCcpOwogICAgICByZXR1cm4gbnVsbDsKICAgIH0KICAgIGxldCBhZHVybCA9IHNjcmlwdC5tYXRjaCgvQWRVcmxccyo6XHMqJyhbXiddKyknLyk7CiAgICBpZiAoIWFkdXJsKSB7CiAgICAgIHJldHVybiBudWxsOwogICAgfQogICAgYWR1cmwgPSBhZHVybFsxXTsKICAgIGNvbnN0IG0xID0gc2NyaXB0Lm1hdGNoKC9BZFBvcFVybFxzKjpccyonLitcP1tePV0rPShbXHdcZF0rKScvKTsKICAgIGNvbnN0IG0yID0gc2NyaXB0Lm1hdGNoKC9Ub2tlblxzKjpccyonKFtcd1xkXSspJy8pOwogICAgY29uc3QgdG9rZW4gPSBtMVsxXSB8fCBtMlsxXTsKICAgIGxldCBtID0gc2NyaXB0Lm1hdGNoKC89XHMqKFxkKyk7Lyk7CiAgICBsZXQgYWsgPSBwYXJzZUludChtWzFdLCAxMCk7CiAgICBjb25zdCByZSA9IC9cK1xzKihcZCspOy9nOwogICAgbGV0IHRtcCA9IG51bGw7CiAgICB3aGlsZSgobSA9IHJlLmV4ZWMoc2NyaXB0KSkgIT09IG51bGwpIHsKICAgICAgdG1wID0gbVsxXTsKICAgIH0KICAgIGFrICs9IHBhcnNlSW50KHRtcCwgMTApOwogICAgcmV0dXJuIHsKICAgICAgdDogdG9rZW4sCiAgICAgIGFLOiBhaywKICAgICAgYWR1cmw6IGFkdXJsLAogICAgfTsKICB9CiAgYXN5bmMgZnVuY3Rpb24gc2VuZFJlcXVlc3QgKHRva2VuKSB7CiAgICBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0uZ2V0KHRva2VuLmFkdXJsKTsKICAgIGRlbGV0ZSB0b2tlbi5hZHVybDsKICAgIHRva2VuLmFfYiA9IGZhbHNlOwogICAgX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siXyJdLmluZm8oJ3dhaXRpbmcgdGhlIGludGVydmFsJyk7CiAgICBhd2FpdCBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyJfIl0ud2FpdCg1MDAwKTsKICAgIF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIl8iXS5pbmZvKCdzZW5kaW5nIHRva2VuOiAlbycsIHRva2VuKTsKICAgIGNvbnN0IHRleHQgPSBhd2FpdCBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0uZ2V0KCcvaW50ZXJtaXNzaW9uL2xvYWRUYXJnZXRVcmwnLCB0b2tlbiwgewogICAgICAnWC1SZXF1ZXN0ZWQtV2l0aCc6IF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIl8iXS5ub25lLAogICAgICBPcmlnaW46IF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIl8iXS5ub25lLAogICAgfSk7CiAgICBjb25zdCBkYXRhID0gSlNPTi5wYXJzZSh0ZXh0KTsKICAgIF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIl8iXS5pbmZvKCdyZXNwb25zZTogJW8nLCBkYXRhKTsKICAgIGlmICghZGF0YS5TdWNjZXNzICYmIGRhdGEuRXJyb3JzWzBdID09PSAnSW52YWxpZCB0b2tlbicpIHsKICAgICAgX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siXyJdLndhcm4oJ2dvdCBpbnZhbGlkIHRva2VuJyk7CiAgICAgIHJldHVybiBhd2FpdCByZXRyeSgpOwogICAgfQogICAgaWYgKGRhdGEuQWRCbG9ja1Nwb3R0ZWQpIHsKICAgICAgX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siXyJdLndhcm4oJ2FkYmxvY2sgc3BvdHRlZCcpOwogICAgICByZXR1cm47CiAgICB9CiAgICBpZiAoZGF0YS5TdWNjZXNzICYmICFkYXRhLkFkQmxvY2tTcG90dGVkICYmIGRhdGEuVXJsKSB7CiAgICAgIHJldHVybiBkYXRhLlVybDsKICAgIH0KICB9CiAgYXN5bmMgZnVuY3Rpb24gcmV0cnkgKCkgewogICAgY29uc3QgdGV4dCA9IGF3YWl0IF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXS5nZXQod2luZG93LmxvY2F0aW9uLnRvU3RyaW5nKCksIHt9LCB7CiAgICAgICdYLUZvcndhcmRlZC1Gb3InOiBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyJfIl0uZ2VuZXJhdGVSYW5kb21JUCgpLAogICAgfSk7CiAgICBjb25zdCBkID0gX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdLnRvRE9NKHRleHQpOwogICAgY29uc3QgdCA9IGZpbmRUb2tlbihkKTsKICAgIGlmICghdCkgewogICAgICBhd2FpdCBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyJfIl0ud2FpdCgxMDAwKTsKICAgICAgcmV0dXJuIGF3YWl0IHJldHJ5KCk7CiAgICB9CiAgICByZXR1cm4gYXdhaXQgc2VuZFJlcXVlc3QodCk7CiAgfQogIGZ1bmN0aW9uIGRlY3J5cHQgKHVybCkgewogICAgdXJsID0gQ29udmVydEZyb21IZXgodXJsKTsKICAgIGxldCB1bnNhZmUgPSBgKCR7RW5jb2RlLnRvU3RyaW5nKCl9KSgiJHt1cmx9IilgOwogICAgdW5zYWZlID0gKDAsIGV2YWwpKHVuc2FmZSk7CiAgICByZXR1cm4gdW5zYWZlOwogIH0KICBmdW5jdGlvbiBDb252ZXJ0RnJvbUhleCAoc3RyKSB7CiAgICBjb25zdCByZXN1bHQgPSBbXTsKICAgIHdoaWxlIChzdHIubGVuZ3RoID49IDIpIHsKICAgICAgcmVzdWx0LnB1c2goU3RyaW5nLmZyb21DaGFyQ29kZShwYXJzZUludChzdHIuc3Vic3RyaW5nKDAsIDIpLCAxNikpKTsKICAgICAgc3RyID0gc3RyLnN1YnN0cmluZygyLCBzdHIubGVuZ3RoKTsKICAgIH0KICAgIHJldHVybiByZXN1bHQuam9pbignJyk7CiAgfQogIGNvbnN0IEVuY29kZSA9IGZ1bmN0aW9uIChzdHIpIHsKICAgIHZhciBzID0gW10sIGogPSAwLCB4LCByZXMgPSAnJywgayA9IGFyZ3VtZW50cy5jYWxsZWUudG9TdHJpbmcoKS5yZXBsYWNlKC9ccysvZywgJycpOwogICAgZm9yICh2YXIgaSA9IDA7IGkgPCAyNTY7IGkrKykgewogICAgICBzW2ldID0gaTsKICAgIH0KICAgIGZvciAoaSA9IDA7IGkgPCAyNTY7IGkrKykgewogICAgICBqID0gKGogKyBzW2ldICsgay5jaGFyQ29kZUF0KGkgJSBrLmxlbmd0aCkpICUgMjU2OwogICAgICB4ID0gc1tpXTsKICAgICAgc1tpXSA9IHNbal07CiAgICAgIHNbal0gPSB4OwogICAgfQogICAgaSA9IDA7CiAgICBqID0gMDsKICAgIGZvciAodmFyIHkgPSAwOyB5IDwgc3RyLmxlbmd0aDsgeSsrKSB7CiAgICAgIGkgPSAoaSArIDEpICUgMjU2OwogICAgICBqID0gKGogKyBzW2ldKSAlIDI1NjsKICAgICAgeCA9IHNbaV07CiAgICAgIHNbaV0gPSBzW2pdOwogICAgICBzW2pdID0geDsKICAgICAgcmVzICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoc3RyLmNoYXJDb2RlQXQoeSkgXiBzWyhzW2ldICsgc1tqXSkgJSAyNTZdKTsKICAgIH0KICAgIHJldHVybiByZXM7CiAgfTsKfSkoKTsKX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siXyJdLnJlZ2lzdGVyKHsKICBydWxlOiB7CiAgICBob3N0OiAvXnd3d1wubGlua2RlY29kZVwuY29tJC8sCiAgICBwYXRoOiAvXlwvJC8sCiAgICBxdWVyeTogL15cPyguKykkLywKICB9LAogIGFzeW5jIHJlYWR5IChtKSB7CiAgICBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0ucmVtb3ZlKCdpZnJhbWUnKTsKICAgIGxldCBsbmsgPSBtLnF1ZXJ5WzFdOwogICAgaWYgKG0ucXVlcnlbMV0ubWF0Y2goL15odHRwcz86XC9cLy8pKSB7CiAgICAgIGF3YWl0IF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXS5vcGVuTGluayhsbmspOwogICAgICByZXR1cm47CiAgICB9CiAgICBsZXQgYiA9IF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXS4kKCcjcG9wdXAnKTsKICAgIGlmIChiICYmIGIuaHJlZikgewogICAgICBhd2FpdCBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0ub3BlbkxpbmsoYi5ocmVmKTsKICAgICAgcmV0dXJuOwogICAgfQogICAgYiA9IE9iamVjdChfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0pKCcjbSA+IC5WaXNpdF9MaW5rJyk7CiAgICBiID0gYi5vbmNsaWNrLnRvU3RyaW5nKCkubWF0Y2goL3dpbmRvd1wub3BlblwoJyhbXiddKyknLyk7CiAgICBpZiAoIWIpIHsKICAgICAgdGhyb3cgbmV3IF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIl8iXS5BZHNCeXBhc3NlcigncGF0dGVybiBjaGFuZ2VkJyk7CiAgICB9CiAgICBsbmsgPSBiWzFdLm1hdGNoKC9cPyhodHRwcz86XC9cLy4qKSQvKTsKICAgIGlmIChsbmspIHsKICAgICAgYXdhaXQgX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdLm9wZW5MaW5rKGxua1sxXSk7CiAgICAgIHJldHVybjsKICAgIH0KICAgIGF3YWl0IF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXS5vcGVuTGluayhiWzFdKTsKICB9LAp9KTsKKGZ1bmN0aW9uICgpIHsKICBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyJfIl0ucmVnaXN0ZXIoewogICAgcnVsZTogewogICAgICBob3N0OiBbCiAgICAgICAgL15tZXRcLmJ6JC8sCiAgICAgICAgL150dWlcLmNsaWNrJC8sCiAgICAgICAgL15lYXJuLWd1aWRlXC5jb20kLywKICAgICAgICAvXmFkdXJsXC5pZCQvLAogICAgICAgIC9eKGN1dHdpfGN1dC13fGN1dGx8ZG11cylcLmluJC8sCiAgICAgICAgL14od3d3XC4pP2p1cmxcLmlvJC8sCiAgICAgICAgL15sYXBha1wubGluayQvLAogICAgICAgIC9eKHVsc2hhcmV8dXJsaWtlKVwubmV0JC8sCiAgICAgIF0sCiAgICB9LAogICAgYXN5bmMgcmVhZHkgKCkgewogICAgICBjb25zdCBoYW5kbGVyID0gbmV3IE5vUmVjYXB0Y2hhSGFuZGxlcigpOwogICAgICBhd2FpdCBoYW5kbGVyLmNhbGwoKTsKICAgIH0sCiAgfSk7CiAgX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siXyJdLnJlZ2lzdGVyKHsKICAgIHJ1bGU6IHsKICAgICAgaG9zdDogWwogICAgICAgIC9eKGR6NGxpbmt8Z29jaXRsaW5rfDNyYWJjdXR8c2hvcnQyd2lufGFkc3J0fHNob3J0Z2xvYmFsfGphaW5qaW52YW5pfGFncmFkYXJwYW58YmlyZHVybHMpXC5jb20kLywKICAgICAgICAvXihwYXlzaG9ydHVybHx1cmx0aXBzfHNocmlua2Vhcm58aXRpYWR8Y3V0c291ZnxlbmV3c3RhbGt8bG5rczRhbGx8amVqYWtsYWd1fHVybHNob3J0eClcLmNvbSQvLAogICAgICAgIC9eKGVhcm4tdXJsfGJpdC11cmx8Y3V0LXdpbnxsaW5rLXplcm98Y3V0LWVhcm58b3R1cmx8Z2xvcnktbGlua3xjb29sbWl0dGVufGhvc2V4eClcLmNvbSQvLAogICAgICAgIC9eKGVtcGlyZXNob3J0fGVtcGVhcm58dGFybndoMml8dGFiZWlraHx5b3Vydy1heXxyZWI3a29ubGluZXxmYWN0dXJhbHxha2xhNHx0ZWNoc2FwcGFyZWwpXC5jb20kLywKICAgICAgICAvXihzaHJpbmtidWNrfGNsa3BheXxsaW5rc2h0fGhheHJzfGNsaWNrMi11cmx8Y29vbHR4dGdlbnxhcmJhN2NvfHNob3J0bGlua298ZXo0bGlua3NzKVwuY29tJC8sCiAgICAgICAgL14ocGFydHFiMml8a2hyYWJhfGFkbHB1fHRhYmFraGVsb3xhbWVuaXRpZWVzfGNvc21pY21vbnl8aWxpbmtzaG9ydHh8YS1lZ3l8YWRzYWZlbGluaylcLmNvbSQvLAogICAgICAgIC9eKGFkdmFuY2Utd2lzaGluZ2pzfGdvdnRzbWFydGpvYnxibG9nZ2luZ3JhamF8dGVjaGt0aXxzeHRzcXVhZHxhZHBheXRtfHB1c3RrYWxhKVwuY29tJC8sCiAgICAgICAgL14odGhlZ3lhYW5pcG9pbnR8ZG93bmxvYWRkb29tfGxpbmtmYXl8NWJyZ2VkaWR8ZWFydGhwaWNsb3ZlcnxhZGlncHx0b21pZW50fGR6NGludmVzdClcLmNvbSQvLAogICAgICAgIC9eKHRlY2htZW4td29ybGR8cmF6ZXJmbGl4c3xnYW1lc2luZGlhbnN8ZGlzbG9va3N8ZWxraGJyZWw3c3J5fG9uYWFofHVsdHJhc2tvcmEpXC5jb20kLywKICAgICAgICAvXih3cmFwLXcwcmxkfG9tbWFudHJhbWVkaXRhdGlvbnxtYXdkb2t8dGVjaGZpbmRhfGNsaXhnfGJvYXJkZ2lmdHxiZWFzdC1iaXJkc3xjbGljay1wYWlkKVwuY29tJC8sCiAgICAgICAgL14odGFsa2l0dGVjaHl8bmV3c2luanVsZXN8a3V0cGF5fG5pa2thcnJ8dmVibGlua3xhbDNhbWFsbHw2YWJhMmRheXxvcGxvdmVyemhvbWUpXC5jb20kLywKICAgICAgICAvXihrb29yYW11YmFzaGlyfGhlYWx0aGZhcnl8anVzdGxpa2V5b2puYXxzYXJrYXJpam9ic3Jlc3VsdHNzfHphbGlwYXl8dGhlZnJlZWNoKVwuY29tJC8sCiAgICAgICAgL14oaGluZGliZWVufHBhc3Rla2FufGU3a2VseWFuYXxlYS1pc2x5fGFyaXN0b2RlcmFzfHNob3J0em9ufHRyYWRpbmctYXJlYXxhbHNlb28pXC5jb20kLywKICAgICAgICAvXih0ZWNodHJlbWVuZG91c3xmcmVlc3BpbndpbnN8dy1yYWplbXx0aW1ldG9rYXxmb29kcHVmZnxsaW5rc29wfGJvbGx5d29vZGRyYW1hbmV3cylcLmNvbSQvLAogICAgICAgIC9eKGxpbmtleGF8YWRtZXd8c2hydGZseXxrdXlsaW5rfGN1dDRsaW5rc3xhZHNraXBtZXxza2lwdXJsc3xlbHktb203fGJyZW5oZWFsdGgpXC5jb20kLywKICAgICAgICAvXihzbWFydGVhc3lzdHVkeXxjeWFoZWFsdGh8ZXJzaGFkYXR8ejJpfHNydGZseXxhcmJhN2twcm98aGVhbHRoLWdvb29kfHN0YXRlZ29zc2lwKVwuY29tJC8sCiAgICAgICAgL14oYmxvZ2dpbmdneWFuYm94fHlvdXJ0ZWNoZ3VpZGVyfGdpZnNpc3wzcmFiLWNhc2h8cGlua2hpbmRpfHdpc2hlczJ8d2Vhd3B8YTViYXJmYXdyaWEpXC5jb20kLywKICAgICAgICAvXihteWtpbmdnb3xsaS1ua3p8d2luNGN1dHxraGFicmF0a3xwcm9ncmFtc2ZyZXxzYWZlbGlua2Jsb2dnZXJ8bGlua3dlYXxvdXJjYXJlZXJibG9nKVwuY29tJC8sCiAgICAgICAgL14obGlua29ybGlua3xtcmZvdXJ0ZWNofGZhYnNkZWFsc3x0ZWNoNHV0b2RheXx1cmxzYW1vfGVhcm53aXRoc2hvcnRsaW5rfHN3aWdneWdvbGQpXC5jb20kLywKICAgICAgICAvXihlYXJubW9uZXl0YWxrfG5ld3VwZGF0ZXNvbmxpbmV8dXB0b29zfGJha2lsaW5rfGdvc3NpcGNvcm5lcnN8c2xlZ2xlfGZ1dHVyZWZvdW5kYXRpb25uZ28pXC5jb20kLywKICAgICAgICAvXihsb29wZGlldHxpbmZvdGF4Y298bmV3c2F0Zml0fGdvOTl0ZWNofGZ1bGx5dGVjaDI0fGFkZmx5dXJsfGtla29saW5rfHJpZnVybHxhYy1tbylcLmNvbSQvLAogICAgICAgIC9eKGFwa3NocnQpXC5jb20kLywKICAgICAgICAvXih2eVwuKT9hZHN2eVwuY29tJC8sCiAgICAgICAgL14od3d3XC4pPyhjbGtwYXlzfGxua2pvYnxlZnNob3J0KVwuY29tJC8sCiAgICAgICAgL15zaHJ0KDh8MTApXC5jb20kLywKICAgICAgICAvXih0cmxpbmt8d29saW5rfHRvY2RvfGN1dHVybHxjb3Vuc2VsbGluZ3Jlc3VsdDIwMTZ8aWl0amVlbWFpbmd1aWRlfGhlYWx0aGhpbmRpZ3lhbilcLmluJC8sCiAgICAgICAgL14odXRpbWV0YWJsZXJlc3VsdHxkYWlseS1zYWxlfGxpbmtzem9uZXx2aXJhbHRlY2huaWNhbClcLmluJC8sCiAgICAgICAgL14ob2tlfGN1b258Y3Vpb3xjdWVlfGN1dXN8Y3V0b3xsaW5rdG9yfGZseWxpbmt8dWl6fHVpaXxleGV5fHNocmlua21lfHNob3RseSlcLmlvJC8sCiAgICAgICAgL15jdSgyfDN8NXw2fDcpXC5pbyQvLAogICAgICAgIC9eKGFkYmlsdHl8YWRwb3B8dWp2fHRweHxhZHNydHwyZmx5fGxpbjY1fHNob3J0MndpbnxzdWFyYW5rcml8aW5mb3RyZW5keSlcLm1lJC8sCiAgICAgICAgL14oYWR2YW5jZWRhdXRvcmVwYWlydGlwc3x0YWtlaXRmb3J8amVsYWphaGludGVybmV0fHZpcnR1YWxkYXRhfG11aGFtbWFkeW9nYXxzMncpXC5tZSQvLAogICAgICAgIC9eKGNlcG11emlraW5kaXJ8c2hyaW5rZSlcLm1lJC8sCiAgICAgICAgL15saW5rXC5ha3Vub1wubmV0JC8sCiAgICAgICAgL14oc2FmZWxpbmt1fHRpbnlsaW5rc3xsaWNrbGlua3xsaW5rcmV4fHpsc2hvcnRlfHZpdmFkc3xjbGlja2FyfGJpZ2Iwc3MpXC5uZXQkLywKICAgICAgICAvXih2bnVybHx2aW5hdXJsfGZveHVybHxzaG9ydDJ3aW58Y2FzaGF0fHNocnRmbHl8c2hvcnR5ZXx2ZW50YXgpXC5uZXQkLywKICAgICAgICAvXihsaW5rNHdpbnxsaW5rc2FkfHRvcHVybHx4ZW1saW5rfGRpcmVjdGVkbGlua3xpbGxpbmspXC5uZXQkLywKICAgICAgICAvXihjbGljazJ1cmx8bG40MzV8bWVyZGVrYWlkKVwub25saW5lJC8sCiAgICAgICAgL14od3d3XC4pP2Jsb2dnZXJ3b3JsZFwub25saW5lJC8sCiAgICAgICAgL14obG90ZWNobm9jYW58dXBkYXRldHJpYnVufHRlbXBsaW5rfGV6NGxpbmt8c2hvcnRlYXJufGFkYnVsbHxvbmV1cmxzfGFkc3J0fGZyZWViY2MpXC5vcmckLywKICAgICAgICAvXnZveGNcLm9yZyQvLAogICAgICAgIC9eKGNsaWt8dG9rZW5mbHl8Z2V0bGlua3xwc2x8cHNzfHNobG58bHBlfGNocnR8c3pzfG1pbml1cmwpXC5wdyQvLAogICAgICAgIC9eKHd3d1wuKT9sd3RcLnB3JC8sCiAgICAgICAgL14oZWwzaWR8YWxscmVwb3J0c3xjbGlja3NrYXJvKVwuc2l0ZSQvLAogICAgICAgIC9eMTIzbGlua1wuY2FycGFydHN2aWV0OTdcLnNpdGUkLywKICAgICAgICAvXihzaGlua3xzaHJ0ZW58Z2ctbHx2bnVybHxibG9nZ2luZ2Rla2h8bG4xMXxzaDExfHRyYWRlZ3VydXxuZXdza2FydHxraWRzb3JzfHh6MilcLnh5eiQvLAogICAgICAgIC9eKHRlY2hpbmh1Ynx2aXJhbG5vd3xzaG9waGlwcm98dGVjaG5vY2FudmFzfGdldGZyZXNoY2xvdWR8cHJvZml0c3R1ZHl8aWpvYmFuYW5hKVwueHl6JC8sCiAgICAgICAgL14oYXV0b2NhcnNtYWd6fGdldHBvY2tldHx5YXNpbmV3c3xkdW55YW5ld3N8a29taXVwZGF0ZXN8YWxsYXBwfHNtd2Vic3xuZXdzLXRlY2gpXC54eXokLywKICAgICAgICAvXmN1dGRsXC54eXokLywKICAgICAgICAvXihja2t8aWlyfHRpaSlcLmFpJC8sCiAgICAgICAgL150aGluXC5hdCQvLAogICAgICAgIC9eKHRpcHNcLik/YXR2XC5wdyQvLAogICAgICAgIC9ec2tpcFwuYXokLywKICAgICAgICAvXihmdW5ueXF1aXp8bWVkaWFraXRhfGthYmFydmlyYWwpXC5ibG9nJC8sCiAgICAgICAgL14oaWN1dGl0fGVhcm5iaWd8Y3V0ZWFybilcLmNhJC8sCiAgICAgICAgL15lMnNcLmNjJC8sCiAgICAgICAgL14oYWR6dXJsfGxpbmsybGluaylcLmNmJC8sCiAgICAgICAgL14obWxpbmt8Y2wyNTB8eHBpY2tsZXxpbmZvc2VoYXRrdSlcLmNsdWIkLywKICAgICAgICAvXigzYnN0fGNvaW5saW5rfGl0aXVybHxjb3NoaW5rfGxpbms1c3xjdXJzfG1ha2V1cmx8bW9vZGRpc29yZGVyfGN1dGxzKVwuY28kLywKICAgICAgICAvXmJlc3RzY2hvbGFlc2hpcGRlZ3JlZVwuZGF0ZSQvLAogICAgICAgIC9eY2xpY2syc2VlXC5kZXNpJC8sCiAgICAgICAgL14odG55fHRpbnkpXC5lYyQvLAogICAgICAgIC9eOG9cLmVlJC8sCiAgICAgICAgL15wYTRsXC5lc3lcLmVzJC8sCiAgICAgICAgL14oc2hvcnRlYXJufGVucnQpXC5ldSQvLAogICAgICAgIC9eKHNjaWVuY2VsaWZlfGNwbTRhbGwpXC5nYSQvLAogICAgICAgIC9eemFcLmdsJC8sCiAgICAgICAgL156aVwuaHQkLywKICAgICAgICAvXnNob3J0ZWRcLmlkJC8sCiAgICAgICAgL14oaWdyYW18Z3JhbXxwaW5naXQpXC5pbSQvLAogICAgICAgIC9ebWVnYXVybFwuKGlufGxpbmspJC8sCiAgICAgICAgL14oYnVzaW5lc3Npc3MyfHRlY2hhbmRyZXZpZXd8eWVzbW92aWVzYXBwfGtwc2N0aHVsYXNpbG9naW4pXC5pbmZvJC8sCiAgICAgICAgL15zdGZseVwuKGlvfHByZXNzKSQvLAogICAgICAgIC9ebHlvblwua2ltJC8sCiAgICAgICAgL15mY1wubGMkLywKICAgICAgICAvXihwZXR0eXxza2lwc3x0cnxmbGF6KVwubGluayQvLAogICAgICAgIC9ecGF5c2tpcFwuKG1lfG9yZykkLywKICAgICAgICAvXmJ0Y1wubXMkLywKICAgICAgICAvXnNwbGFzaG5ld3NcLm9vbyQvLAogICAgICAgIC9eZXhwcmVzcy1jdXRcLm92aCQvLAogICAgICAgIC9ec2hvcnRcLnBlJC8sCiAgICAgICAgL14oY2xrfGNsbClcLihwcmVzc3xpbmt8c2h8aWN1KSQvLAogICAgICAgIC9eKGxvcHRlfG1lZ2FsaW5rKVwucHJvJC8sCiAgICAgICAgL14xMjNsaW5rXC4ocHd8dmlwKSQvLAogICAgICAgIC9ecm95YWxvd25cLnJldmlldyQvLAogICAgICAgIC9eZWFyblwudGhlcGx1c2l0XC5ybyQvLAogICAgICAgIC9ec2staXBcLihydXx0ZWNoKSQvLAogICAgICAgIC9edGlueWxpbmtcLnJ1biQvLAogICAgICAgIC9eKG9rb3xhaWl8c2hvcnRlbilcLnNoJC8sCiAgICAgICAgL14oZHV0Y2h5Y29ycHxhYm91dHRlY2gpXC5zcGFjZSQvLAogICAgICAgIC9eYnV5aXRvbmxpbmVcLnN0b3JlJC8sCiAgICAgICAgL15lYXRpbmdzXC5zdHJlYW0kLywKICAgICAgICAvXnRsXC50YyQvLAogICAgICAgIC9eKDE5MjE2ODEyNTR8Z2VraXx3ZWduZXJ8Z3BzaG9ydClcLnRlY2gkLywKICAgICAgICAvXihsaW5rdmlwfDRzaG9ydClcLnRrJC8sCiAgICAgICAgL14od3d3XC4pP3BuZFwudGwkLywKICAgICAgICAvXmdldFwudWp2XC5hbCQvLAogICAgICAgIC9eKHVybGNsb3VkfGltYWdlb3B0aW1pemVyKVwudXMkLywKICAgICAgICAvXihrb3lsaW5rc3xidXktaW4tNTk5cnMpXC53aW4kLywKICAgICAgICAvXmV4ZVwuKGlvfGFwcCkkLywKICAgICAgICAvXnNsaW5rXC5iaWQkLywKICAgICAgXSwKICAgIH0sCiAgICBhc3luYyByZWFkeSAoKSB7CiAgICAgIGNvbnN0IGhhbmRsZXIgPSBuZXcgUmVjYXB0Y2hhSGFuZGxlcigpOwogICAgICBhd2FpdCBoYW5kbGVyLmNhbGwoKTsKICAgIH0sCiAgfSk7CiAgX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siXyJdLnJlZ2lzdGVyKHsKICAgIHJ1bGU6IHsKICAgICAgaG9zdDogWwogICAgICAgIC9eKGFyYWJ0dmxpbmt8c2FmZWt1fGR6NGxpbmspXC5jb20kLywKICAgICAgICAvXmxpbmtzb2ZsaWZlXC5jbyQvLAogICAgICAgIC9ed2lcLmNyJC8sCiAgICAgICAgL14oYml0Y29pbmx5fGNhc2h1cmwpXC5pbiQvLAogICAgICAgIC9ebGlua3NvZlwubGlmZSQvLAogICAgICAgIC9ed2ljclwubWUkLywKICAgICAgICAvXnNocnRpdFwudGVjaCQvLAogICAgICAgIC9eZmlyZXNob3J0c1wudGskLywKICAgICAgICAvXm1pdGx5XC51cyQvLAogICAgICBdLAogICAgfSwKICAgIGFzeW5jIHJlYWR5ICgpIHsKICAgICAgY29uc3QgaGFuZGxlciA9IG5ldyBJbnZpc2libGVSZWNhcHRjaGFIYW5kbGVyKCk7CiAgICAgIGF3YWl0IGhhbmRsZXIuY2FsbCgpOwogICAgfSwKICB9KTsKICBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyJfIl0ucmVnaXN0ZXIoewogICAgcnVsZTogewogICAgICBob3N0OiBbCiAgICAgICAgL14xMjNzaG9ydFwuYml6JC8sCiAgICAgICAgL14oY3V0cGFpZHx0bWVhcm58aWN1dGxpbmspXC5jb20kLywKICAgICAgICAvXihjdHVpfGN1dGkpXC5pbiQvLAogICAgICAgIC9eenV0cm94XC5saW5rJC8sCiAgICAgICAgL14odGVjaGNyYXplfGhlYWx0aGluc2lkZXIpXC5vbmxpbmUkLywKICAgICAgICAvXmN1dHdpblwuKHVzfGNvbSkkLywKICAgICAgICAvXih3d3dcLik/c2hyaW5rXC52aXAkLywKICAgICAgXSwKICAgIH0sCiAgICBhc3luYyByZWFkeSAoKSB7CiAgICAgIGNvbnN0IGhhbmRsZXIgPSBuZXcgTm9uRGlzYWJsZWRSZWNhcHRjaGFIYW5kbGVyKCk7CiAgICAgIGF3YWl0IGhhbmRsZXIuY2FsbCgpOwogICAgfSwKICB9KTsKICBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyJfIl0ucmVnaXN0ZXIoewogICAgcnVsZTogewogICAgICBob3N0OiAvXih3d3dcLik/b3VybFwuaW8kLywKICAgIH0sCiAgICBhc3luYyByZWFkeSAoKSB7CiAgICAgIGNvbnN0IGhhbmRsZXIgPSBuZXcgT1VSTEhhbmRsZXIoKTsKICAgICAgYXdhaXQgaGFuZGxlci5jYWxsKCk7CiAgICB9LAogIH0pOwogIF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIl8iXS5yZWdpc3Rlcih7CiAgICBydWxlOiB7CiAgICAgIGhvc3Q6IC9eKHd3d1wuKT9saW5rZHJvcFwubmV0JC8sCiAgICB9LAogICAgYXN5bmMgcmVhZHkgKCkgewogICAgICBjb25zdCBoYW5kbGVyID0gbmV3IExpbmtEcm9wSGFuZGxlcigpOwogICAgICBhd2FpdCBoYW5kbGVyLmNhbGwoKTsKICAgIH0sCiAgfSk7CiAgX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siXyJdLnJlZ2lzdGVyKHsKICAgIHJ1bGU6IHsKICAgICAgaG9zdDogL153d3dcLnNob3J0bHlcLnh5eiQvLAogICAgICBwYXRoOiAvXlwvbGluayQvLAogICAgfSwKICAgIGFzeW5jIHJlYWR5ICgpIHsKICAgICAgY29uc3QgaGFuZGxlciA9IG5ldyBTaG9ydGx5SGFuZGxlcigpOwogICAgICBhd2FpdCBoYW5kbGVyLmNhbGwoKTsKICAgIH0sCiAgfSk7CiAgX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siXyJdLnJlZ2lzdGVyKHsKICAgIHJ1bGU6IHsKICAgICAgaG9zdDogWwogICAgICAgIC9eKGN1dC11cmxzfGxpbmNsaWt8cHJlbWl1bXplbnxieTZka3xtaWt5bW9vbnN8bWFuMnBybylcLmNvbSQvLAogICAgICAgIC9eKGxpbms0d2lufGxvYWR1cmx8Y3V0NGxpbmt8cmFvbGlua3xhZHNob3J0ZSlcLmNvbSQvLAogICAgICAgIC9ec2hvcnRcLnBhc3Rld21hXC5jb20kLywKICAgICAgICAvXmxpbmtmbHlcLmdhb3NtZWRpYVwuY29tJC8sCiAgICAgICAgL14od3d3XC4pP3ZpcmFsdWtrXC5jb20kLywKICAgICAgICAvXih3d3dcLik/bmlhZ29zaG9ydFwuY29tJC8sCiAgICAgICAgL153d3dcLndvcmxkaGFja1wubmV0JC8sCiAgICAgICAgL14oZWtsaW5rKVwubmV0JC8sCiAgICAgICAgL15yb3l1cmxzXC5iaWQkLywKICAgICAgICAvXnNob3J0aXRcLmNhJC8sCiAgICAgICAgL14odXJsZXxhZHNob3J0KVwuY28kLywKICAgICAgICAvXigxKT9pZHNseVwuKGNvbXxiaWR8bmV0fG9yZykkLywKICAgICAgICAvXnNob3J0YWRcLmNmJC8sCiAgICAgICAgL14oYWRiaWx0eXx0YWl2ZSlcLmluJC8sCiAgICAgICAgL14oY3Vyc3xjcnVzfDRjdXR8dTJzfGwycylcLmlvJC8sCiAgICAgICAgL14xMjNsaW5rXC4oaW98Y298cHJlc3N8cHJvKSQvLAogICAgICAgIC9ecGV0dHlcLmxpbmskLywKICAgICAgICAvXih3ZWVmeXxhZGJ1bGx8emVpenxsaW5rNHxhZGNvaW4pXC5tZSQvLAogICAgICAgIC9eZHp1cmxcLm1sJC8sCiAgICAgICAgL15zcGFtbGlua1wub3JnJC8sCiAgICAgICAgL14odHdpa3xhZHNsaW5rKVwucHckLywKICAgICAgICAvXmdpdFwudGMkLywKICAgICAgICAvXihhZGZ1fGxpbmt1KVwudXMkLywKICAgICAgXSwKICAgIH0sCiAgICBhc3luYyByZWFkeSAoKSB7CiAgICAgIGNvbnN0IGhhbmRsZXIgPSBuZXcgU3RhZ2VkSGFuZGxlcigpOwogICAgICBhd2FpdCBoYW5kbGVyLmNhbGwoKTsKICAgIH0sCiAgfSk7CiAgY2xhc3MgQWJzdHJhY3RIYW5kbGVyIHsKICAgIGNvbnN0cnVjdG9yICgpIHsKICAgICAgdGhpcy5fb3ZlcmxheVNlbGVjdG9yID0gWwogICAgICAgICdbY2xhc3MkPSJPdmVybGF5Il0nLAogICAgICAgICcjX19yYW5kb21fY2xhc3NfbmFtZV9fJywKICAgICAgICAnI2hlYWRsaW5lYXRhcycsCiAgICAgICAgJyNteU1vZGFsJywKICAgICAgICAnLm9wYWNpdHlfd3JhcHBlcicsCiAgICAgICAgJyNvdmVybGF5JywKICAgICAgXS5qb2luKCcsICcpOwogICAgICB0aGlzLl9mb3JtU2VsZWN0b3IgPSBbCiAgICAgICAgJyNnby1saW5rJywKICAgICAgICAnLmdvLWxpbmsnLAogICAgICAgICcjb3JpZ2luYWxMaW5rLmdldC1saW5rJywKICAgICAgICAnZm9ybVthY3Rpb249Ii9saW5rcy9nbyJdJywKICAgICAgICAnZm9ybVthY3Rpb249Ii9saW5rcy9saW5rZHJvcGdvIl0nLAogICAgICBdLmpvaW4oJywgJyk7CiAgICB9CiAgICByZW1vdmVPdmVybGF5ICgpIHsKICAgICAgX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdLnJlbW92ZSh0aGlzLl9vdmVybGF5U2VsZWN0b3IpOwogICAgICBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0uYmxvY2sodGhpcy5fb3ZlcmxheVNlbGVjdG9yLCBkb2N1bWVudC5ib2R5KTsKICAgICAgc2V0SW50ZXJ2YWwoKCkgPT4gewogICAgICAgIGRvY3VtZW50LmJvZHkuc3R5bGUub3ZlcmZsb3cgPSAnaW5pdGlhbCc7CiAgICAgIH0sIDUwMCk7CiAgICB9CiAgICByZW1vdmVGcmFtZSAoKSB7CiAgICAgIF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXS5yZW1vdmUoJ2lmcmFtZScpOwogICAgfQogICAgYXN5bmMgY2FsbCAoKSB7CiAgICAgIGNvbnN0IG9rID0gYXdhaXQgdGhpcy5wcmVwYXJlKCk7CiAgICAgIGlmICghb2spIHsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgICAgY29uc3QgbXcgPSBhd2FpdCB0aGlzLmdldE1pZGRsZXdhcmUoKTsKICAgICAgaWYgKCFtdykgewogICAgICAgIHRoaXMud2l0aG91dE1pZGRsZXdhcmUoKTsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgICAgY29uc3QgdXJsID0gYXdhaXQgdGhpcy5nZXRVUkwobXcpOwogICAgICBhd2FpdCBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0ub3BlbkxpbmsodXJsKTsKICAgIH0KICB9CiAgY2xhc3MgTm9SZWNhcHRjaGFIYW5kbGVyIGV4dGVuZHMgQWJzdHJhY3RIYW5kbGVyIHsKICAgIHByZXBhcmUgKCkgewogICAgICB0aGlzLnJlbW92ZUZyYW1lKCk7CiAgICAgIHRoaXMucmVtb3ZlT3ZlcmxheSgpOwogICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KICAgIGFzeW5jIGdldE1pZGRsZXdhcmUgKCkgewogICAgICByZXR1cm4gYXdhaXQgZ2V0SlF1ZXJ5Rm9ybSh0aGlzLl9mb3JtU2VsZWN0b3IpOwogICAgfQogICAgd2l0aG91dE1pZGRsZXdhcmUgKCkgewogICAgICBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyJfIl0uaW5mbygnbm8gZm9ybScpOwogICAgfQogICAgYXN5bmMgZ2V0VVJMIChqRm9ybSkgewogICAgICByZXR1cm4gYXdhaXQgZ2V0VVJMRnJvbUpRdWVyeUZvcm0oakZvcm0pOwogICAgfQogIH0KICBjbGFzcyBSZWNhcHRjaGFIYW5kbGVyIGV4dGVuZHMgQWJzdHJhY3RIYW5kbGVyIHsKICAgIGFzeW5jIHByZXBhcmUgKCkgewogICAgICB0aGlzLnJlbW92ZU92ZXJsYXkoKTsKICAgICAgY29uc3QgZiA9IF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXS4kKCcjY2FwdGNoYVNob3J0bGluaywgZGl2LmctcmVjYXB0Y2hhJyk7CiAgICAgIGlmICghZikgewogICAgICAgIHJldHVybiB0cnVlOwogICAgICB9CiAgICAgIF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIl8iXS5pbmZvKCdyZWNhcHRjaGEgZGV0ZWN0ZWQsIHN0b3AnKTsKICAgICAgX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siXyJdLmluZm8oJ3RyeWluZyB0byBsaXN0ZW4gc3VibWl0IGJ1dHRvbicpOwogICAgICBjb25zdCBiID0gX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdLiQoJyNpbnZpc2libGVDYXB0Y2hhU2hvcnRsaW5rJyk7CiAgICAgIGlmICghYikgewogICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgfQogICAgICBhd2FpdCB0aGlzLnN1Ym1pdExpc3RlbihiLCBmKTsKICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogICAgYXN5bmMgc3VibWl0TGlzdGVuIChiKSB7CiAgICAgIGNvbnN0IG8gPSBuZXcgTXV0YXRpb25PYnNlcnZlcigoKSA9PiB7CiAgICAgICAgaWYgKCFiLmRpc2FibGVkKSB7CiAgICAgICAgICBiLmNsaWNrKCk7CiAgICAgICAgfQogICAgICB9KTsKICAgICAgby5vYnNlcnZlKGIsIHsKICAgICAgICBhdHRyaWJ1dGVzOiB0cnVlLAogICAgICB9KTsKICAgIH0KICAgIGFzeW5jIGdldE1pZGRsZXdhcmUgKCkgewogICAgICByZXR1cm4gYXdhaXQgZ2V0SlF1ZXJ5Rm9ybSh0aGlzLl9mb3JtU2VsZWN0b3IpOwogICAgfQogICAgd2l0aG91dE1pZGRsZXdhcmUgKCkgewogICAgICBjb25zdCBmID0gT2JqZWN0KF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXSkoJyNsaW5rLXZpZXcnKTsKICAgICAgZi5zdWJtaXQoKTsKICAgIH0KICAgIGFzeW5jIGdldFVSTCAoakZvcm0pIHsKICAgICAgd2hpbGUgKHRydWUpIHsKICAgICAgICBhd2FpdCBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyJfIl0ud2FpdCgxMDAwKTsKICAgICAgICB0cnkgewogICAgICAgICAgY29uc3QgdXJsID0gYXdhaXQgZ2V0VVJMRnJvbUpRdWVyeUZvcm0oakZvcm0pOwogICAgICAgICAgaWYgKHVybCkgewogICAgICAgICAgICByZXR1cm4gdXJsOwogICAgICAgICAgfQogICAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICAgIF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIl8iXS53YXJuKGUpOwogICAgICAgIH0KICAgICAgfQogICAgfQogIH0KICBjbGFzcyBJbnZpc2libGVSZWNhcHRjaGFIYW5kbGVyIGV4dGVuZHMgUmVjYXB0Y2hhSGFuZGxlciB7CiAgICBhc3luYyBzdWJtaXRMaXN0ZW4gKGIsIGYpIHsKICAgICAgYXdhaXQgX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siXyJdLndhaXQoMTAwMCk7CiAgICAgIGNvbnN0IGNsaWNrID0gZi5jbGllbnRXaWR0aCA9PT0gMCB8fCBmLmNoaWxkTm9kZXMubGVuZ3RoID09PSAwOwogICAgICBpZiAoY2xpY2sgJiYgIWIuZGlzYWJsZWQpIHsKICAgICAgICBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyJfIl0uaW5mbygnY2xpY2tpbmcgc3VibWl0IGJ1dHRvbiwgYmVjYXVzZSByZWNhcHRjaGEgd2FzIGVtcHR5Jyk7CiAgICAgICAgYi5zZXRBdHRyaWJ1dGUoJ29uY2xpY2snLCAnJyk7CiAgICAgICAgYi5jbGljaygpOwogICAgICB9CiAgICB9CiAgfQogIGNsYXNzIE5vbkRpc2FibGVkUmVjYXB0Y2hhSGFuZGxlciBleHRlbmRzIFJlY2FwdGNoYUhhbmRsZXIgewogICAgYXN5bmMgc3VibWl0TGlzdGVuIChiKSB7CiAgICAgIHdoaWxlICh0cnVlKSB7CiAgICAgICAgYXdhaXQgX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siXyJdLndhaXQoNTAwKTsKICAgICAgICBpZiAoZ3JlY2FwdGNoYSAmJiBncmVjYXB0Y2hhLmdldFJlc3BvbnNlKCkubGVuZ3RoICE9PSAwKSB7CiAgICAgICAgICBiLmNsaWNrKCk7CiAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICB9CiAgY2xhc3MgT1VSTEhhbmRsZXIgZXh0ZW5kcyBSZWNhcHRjaGFIYW5kbGVyIHsKICAgIGFzeW5jIGdldE1pZGRsZXdhcmUgKCkgewogICAgICByZXR1cm4gewogICAgICAgIHZlcmlmeTogYXdhaXQgZ2V0SlF1ZXJ5Rm9ybSgnI2dldC1saW5rJyksCiAgICAgICAgZ286IGF3YWl0IGdldEpRdWVyeUZvcm0odGhpcy5fZm9ybVNlbGVjdG9yKSwKICAgICAgfTsKICAgIH0KICAgIGFzeW5jIGdldFVSTCAoakZvcm1PYmplY3QpIHsKICAgICAgYXdhaXQgZ2V0VVJMRnJvbUpRdWVyeUZvcm0oakZvcm1PYmplY3QudmVyaWZ5KTsKICAgICAgcmV0dXJuIGF3YWl0IGdldFVSTEZyb21KUXVlcnlGb3JtKGpGb3JtT2JqZWN0LmdvKTsKICAgIH0KICB9CiAgY2xhc3MgTGlua0Ryb3BIYW5kbGVyIGV4dGVuZHMgUmVjYXB0Y2hhSGFuZGxlciB7CiAgICBhc3luYyBnZXRNaWRkbGV3YXJlICgpIHsKICAgICAgcmV0dXJuIGF3YWl0IGdldEpRdWVyeUZvcm0oJyNteWxpbmsxJyk7CiAgICB9CiAgfQogIGNsYXNzIFN0YWdlZEhhbmRsZXIgZXh0ZW5kcyBBYnN0cmFjdEhhbmRsZXIgewogICAgcHJlcGFyZSAoKSB7CiAgICAgIHRoaXMucmVtb3ZlRnJhbWUoKTsKICAgICAgdGhpcy5yZW1vdmVPdmVybGF5KCk7CiAgICAgIHJldHVybiB0cnVlOwogICAgfQogICAgYXN5bmMgZ2V0TWlkZGxld2FyZSAoKSB7CiAgICAgIGNvbnN0IGYgPSBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0uJCgnI2xpbmstdmlldycpOwogICAgICBpZiAoIWYpIHsKICAgICAgICByZXR1cm4gZG9jdW1lbnQ7CiAgICAgIH0KICAgICAgY29uc3QgYXJncyA9IGV4dHJhY3RBcmd1bWVudChmKTsKICAgICAgY29uc3QgdXJsID0gZi5nZXRBdHRyaWJ1dGUoJ2FjdGlvbicpOwogICAgICBsZXQgcGFnZSA9IGF3YWl0IF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXS5wb3N0KHVybCwgYXJncyk7CiAgICAgIHBhZ2UgPSBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0udG9ET00ocGFnZSk7CiAgICAgIHJldHVybiBwYWdlOwogICAgfQogICAgd2l0aG91dE1pZGRsZXdhcmUgKCkgewogICAgICBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyJfIl0uaW5mbygnbm8gcGFnZScpOwogICAgfQogICAgYXN5bmMgZ2V0VVJMIChwYWdlKSB7CiAgICAgIGNvbnN0IGYgPSBPYmplY3QoX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdKSgnI2dvLWxpbmsnLCBwYWdlKTsKICAgICAgY29uc3QgYXJncyA9IGV4dHJhY3RBcmd1bWVudChmKTsKICAgICAgY29uc3QgdXJsID0gZi5nZXRBdHRyaWJ1dGUoJ2FjdGlvbicpOwogICAgICBsZXQgZGF0YSA9IGF3YWl0IF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXS5wb3N0KHVybCwgYXJncyk7CiAgICAgIGRhdGEgPSBKU09OLnBhcnNlKGRhdGEpOwogICAgICBpZiAoZGF0YSAmJiBkYXRhLnVybCkgewogICAgICAgIF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXS5udWtlKGRhdGEudXJsKTsKICAgICAgICByZXR1cm4gZGF0YS51cmw7CiAgICAgIH0KICAgICAgdGhyb3cgbmV3IF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIl8iXS5BZHNCeXBhc3NlckVycm9yKCd3cm9uZyBkYXRhJyk7CiAgICB9CiAgfQogIGNsYXNzIFNob3J0bHlIYW5kbGVyIGV4dGVuZHMgQWJzdHJhY3RIYW5kbGVyIHsKICAgIHByZXBhcmUgKCkgewogICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KICAgIGFzeW5jIGdldE1pZGRsZXdhcmUgKCkgewogICAgICBsZXQgYSA9IE9iamVjdChfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0pKCcjbXlNb2RhbCAuYnRuLXByaW1hcnknKTsKICAgICAgYSA9IGEucGF0aG5hbWUubWF0Y2goL15cL3JcLyguKykvKTsKICAgICAgcmV0dXJuIGFbMV07CiAgICB9CiAgICB3aXRob3V0TWlkZGxld2FyZSAoKSB7CiAgICAgIF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIl8iXS5pbmZvKCdubyBwYWdlJyk7CiAgICB9CiAgICBhc3luYyBnZXRVUkwgKGlkKSB7CiAgICAgIHdoaWxlICh0cnVlKSB7CiAgICAgICAgX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdLndpbmRvdy5qUXVlcnkucG9zdCgnZ2V0bGluay5waHAnLCB7aWQ6IGlkfSkuZG9uZShmdW5jdGlvbiAodXJsKSB7CiAgICAgICAgICBpZiAodXJsLm1hdGNoKC9eaHR0cC8pKSB7CiAgICAgICAgICAgIF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXS5vcGVuTGluayh1cmwpOwogICAgICAgICAgfQogICAgICAgIH0pOwogICAgICAgIGF3YWl0IF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIl8iXS53YWl0KDUwMCk7CiAgICAgIH0KICAgIH0KICB9CiAgZnVuY3Rpb24gZXh0cmFjdEFyZ3VtZW50IChmb3JtKSB7CiAgICBjb25zdCBhcmdzID0ge307CiAgICBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyJfIl0uZm9yRWFjaChfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0uJCQoJ2lucHV0JywgZm9ybSksICh2KSA9PiB7CiAgICAgIGFyZ3Nbdi5uYW1lXSA9IHYudmFsdWU7CiAgICB9KTsKICAgIHJldHVybiBhcmdzOwogIH0KICBhc3luYyBmdW5jdGlvbiBnZXRKUXVlcnlGb3JtIChzZWxlY3RvcikgewogICAgbGV0IGpRdWVyeSA9IF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXS53aW5kb3cuJDsKICAgIHdoaWxlICghalF1ZXJ5KSB7CiAgICAgIGF3YWl0IF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIl8iXS53YWl0KDUwKTsKICAgICAgalF1ZXJ5ID0gX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdLndpbmRvdy4kOwogICAgfQogICAgY29uc3QgZiA9IGpRdWVyeShzZWxlY3Rvcik7CiAgICBpZiAoZi5sZW5ndGggPiAwKSB7CiAgICAgIHJldHVybiBmOwogICAgfQogICAgcmV0dXJuIG51bGw7CiAgfQogIGZ1bmN0aW9uIGdldFVSTEZyb21KUXVlcnlGb3JtIChqRm9ybSkgewogICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHsKICAgICAgaWYgKGpGb3JtLmlzKCdhJykgJiYgakZvcm0uYXR0cignaHJlZicpKSB7CiAgICAgICAgcmVzb2x2ZShqRm9ybS5hdHRyKCdocmVmJykpOwogICAgICB9CiAgICAgIGNvbnN0IGpRdWVyeSA9IF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXS53aW5kb3cuJDsKICAgICAgalF1ZXJ5LmFqYXgoewogICAgICAgIGRhdGFUeXBlOiAnanNvbicsCiAgICAgICAgdHlwZTogJ1BPU1QnLAogICAgICAgIHVybDogakZvcm0uYXR0cignYWN0aW9uJyksCiAgICAgICAgZGF0YTogakZvcm0uc2VyaWFsaXplKCksCiAgICAgICAgc3VjY2VzczogKHJlc3VsdCkgPT4gewogICAgICAgICAgaWYgKHJlc3VsdC51cmwpIHsKICAgICAgICAgICAgcmVzb2x2ZShyZXN1bHQudXJsKTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHJlamVjdChuZXcgX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siXyJdLkFkc0J5cGFzc2VyRXJyb3IocmVzdWx0Lm1lc3NhZ2UpKTsKICAgICAgICAgIH0KICAgICAgICB9LAogICAgICAgIGVycm9yOiAoeGhyLCBzdGF0dXMsIGVycm9yKSA9PiB7CiAgICAgICAgICBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyJfIl0ud2Fybih4aHIsIHN0YXR1cywgZXJyb3IpOwogICAgICAgICAgcmVqZWN0KG5ldyBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyJfIl0uQWRzQnlwYXNzZXJFcnJvcigncmVxdWVzdCBlcnJvcicpKTsKICAgICAgICB9LAogICAgICB9KTsKICAgIH0pOwogIH0KfSkoKTsKX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siXyJdLnJlZ2lzdGVyKHsKICBydWxlOiB7CiAgICBob3N0OiAvXmxpbmtkdWl0XC5uZXQkLywKICB9LAogIGFzeW5jIHJlYWR5ICgpIHsKICAgIGNvbnN0IGwgPSBPYmplY3QoX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdKSgnLmNvbC1sZy04IGgxJykudGV4dENvbnRlbnQ7CiAgICBjb25zdCBjaGVjayA9IGwubWF0Y2goL15odHRwcz86XC9cLy8pOwogICAgaWYgKGNoZWNrKSB7CiAgICAgIGF3YWl0IF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXS5vcGVuTGluayhsKTsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybjsKICAgIH0KICB9LAp9KTsKX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siXyJdLnJlZ2lzdGVyKHsKICBydWxlOiB7CiAgICBob3N0OiAvXih3d3dcLik/bGlua3BsdWdhcHBcLmNvbSQvLAogIH0sCiAgYXN5bmMgcmVhZHkgKCkgewogICAgY29uc3QgYSA9IE9iamVjdChfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0pKCcjbWNfZW1iZWRfc2lnbnVwX3Njcm9sbCBhJyk7CiAgICBhd2FpdCBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0ub3BlbkxpbmsoYS5ocmVmKTsKICB9LAp9KTsKX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siXyJdLnJlZ2lzdGVyKHsKICBydWxlOiB7CiAgICBob3N0OiAvXmxpbmtzYXNcLnVzJC8sCiAgICBwYXRoOiAvXihcL1x3KykkLywKICB9LAogIGFzeW5jIHJlYWR5IChtKSB7CiAgICBjb25zdCByZWNhcHRjaGEgPSBhd2FpdCBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyJfIl0udHJ5RXZlcnkoMTAwMCwgKCkgPT4gewogICAgICBjb25zdCByZWNhcHRjaGEgPSBPYmplY3QoX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdKSgnI2ctcmVjYXB0Y2hhLXJlc3BvbnNlJyk7CiAgICAgIGlmICghcmVjYXB0Y2hhKSB7CiAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgIH0KICAgICAgaWYgKCFyZWNhcHRjaGEudmFsdWUpIHsKICAgICAgICByZXR1cm4gX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siXyJdLm5vbmU7CiAgICAgIH0KICAgICAgcmV0dXJuIHJlY2FwdGNoYS52YWx1ZTsKICAgIH0pOwogICAgY29uc3QgdXJsID0gYGh0dHA6Ly9pcGluZm8uaW8vJHtfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyJfIl0uZ2VuZXJhdGVSYW5kb21JUCgpfS9qc29uYDsKICAgIGxldCBpcGluZm8gPSBhd2FpdCBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0uZ2V0KHVybCk7CiAgICBpcGluZm8gPSBKU09OLnBhcnNlKGlwaW5mbyk7CiAgICBjb25zdCBwYXlsb2FkID0gewogICAgICBjb2RlQWRzOiAxLAogICAgICBjb3VudHJ5OiBpcGluZm8uY291bnRyeSwKICAgICAgaXBBZGRyZXNzOiBpcGluZm8uaXAsCiAgICAgIHJlY2FwdGNoYTogcmVjYXB0Y2hhLAogICAgfTsKICAgIGNvbnN0IHRva2VuID0gX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdLmdldENvb2tpZSgnWFNSRi1UT0tFTicpOwogICAgbGV0IGRhdGEgPSBhd2FpdCBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0ucG9zdCgnL2dvJyArIG0ucGF0aFsxXSwgcGF5bG9hZCwgewogICAgICAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nLAogICAgICAnWC1YU1JGLVRPS0VOJzogdG9rZW4sCiAgICB9KTsKICAgIGRhdGEgPSBKU09OLnBhcnNlKGRhdGEpOwogICAgYXdhaXQgX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdLm9wZW5MaW5rKGRhdGEubWVzc2FnZSk7CiAgfSwKfSk7Cl9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIl8iXS5yZWdpc3Rlcih7CiAgcnVsZTogewogICAgaG9zdDogL15saW5rc2FzXC51cyQvLAogICAgcGF0aDogL15cL2dvXC8vLAogIH0sCiAgYXN5bmMgcmVhZHkgKCkgewogICAgY29uc3QgYSA9IF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXS4kKCcjYnRuU3VibWl0Jyk7CiAgICBpZiAoIWEpIHsKICAgICAgcmV0dXJuOwogICAgfQogICAgY29uc3QgdXJsID0gYS5ocmVmOwogICAgY29uc3QgcGF0dGVybiA9IC9odHRwcz86XC9cLy9nOwogICAgbGV0IGxhc3RVUkwgPSAnJzsKICAgIHdoaWxlICh0cnVlKSB7CiAgICAgIGNvbnN0IG1hdGNoZWQgPSBwYXR0ZXJuLmV4ZWModXJsKTsKICAgICAgaWYgKCFtYXRjaGVkKSB7CiAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgICAgbGFzdFVSTCA9IG1hdGNoZWQgKyB1cmwuc3Vic3RyaW5nKHBhdHRlcm4ubGFzdEluZGV4KTsKICAgIH0KICAgIGF3YWl0IF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXS5vcGVuTGluayhsYXN0VVJMKTsKICB9LAp9KTsKX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siXyJdLnJlZ2lzdGVyKHsKICBydWxlOiB7CiAgICBob3N0OiAvXihsaW5rc2hyaW5rfGxua3Nocm5rKVwubmV0JC8sCiAgICBwYXRoOiAvXlwvW2EtekEtWjAtOV0rJC8sCiAgfSwKICBhc3luYyBzdGFydCAoKSB7CiAgICBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0ud2luZG93Ll9pbXBzcGNhYmUgPSAwOwogIH0sCiAgYXN5bmMgcmVhZHkgKCkgewogICAgbGV0IGwgPSBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0uc2VhcmNoRnJvbVNjcmlwdHMoL3JldkNcKCIoW14iXSspIlwpLyk7CiAgICBsID0gYXRvYihsWzFdKTsKICAgIGF3YWl0IF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXS5vcGVuTGluaygnLycgKyBsKTsKICB9LAp9KTsKX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siXyJdLnJlZ2lzdGVyKHsKICBydWxlOiB7CiAgICBob3N0OiAvXihsaW5rc2hyaW5rfGxua3Nocm5rKVwubmV0JC8sCiAgICBwYXRoOiAvPSguKykkLywKICB9LAogIGFzeW5jIHN0YXJ0IChtKSB7CiAgICBhd2FpdCBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0ub3BlbkxpbmsobS5wYXRoWzFdKTsKICB9LAp9KTsKX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siXyJdLnJlZ2lzdGVyKHsKICBydWxlOiB7CiAgICBob3N0OiAvXmR3aW5kbHlcLmlvJC8sCiAgfSwKICBhc3luYyByZWFkeSAoKSB7CiAgICBsZXQgbCA9IF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXS5zZWFyY2hGcm9tU2NyaXB0cygvZW5jRFwoIihbXiJdKykiXCkvKTsKICAgIGlmIChsKSB7CiAgICAgIGwgPSBhdG9iKGxbMV0pOwogICAgICBhd2FpdCBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0ub3BlbkxpbmsoJy8nICsgbCk7CiAgICAgIHJldHVybjsKICAgIH0KICAgIGwgPSBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0uc2VhcmNoRnJvbVNjcmlwdHMoL2RvY3VtZW50XC5sb2NhdGlvblwuaHJlZiA9ICIoW14iXSspIi8pOwogICAgYXdhaXQgX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdLm9wZW5MaW5rKGxbMV0pOwogIH0sCn0pOwpfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyJfIl0ucmVnaXN0ZXIoewogIHJ1bGU6IHsKICAgIGhvc3Q6IFsKICAgICAgL15saW5rc3VwdG9cLmNvbSQvLAogICAgICAvXnVwbGlua3RvXC5tZSQvLAogICAgXSwKICAgIHBhdGg6IC9eXC92aWV3XC8vLAogIH0sCiAgYXN5bmMgcmVhZHkgKCkgewogICAgY29uc3QgbCA9IE9iamVjdChfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0pKCcuc3VibWl0LWNhcHRjaGEucm93IC5jb2wtc20tMy5jb2wtc20tb2Zmc2V0LTQgYnV0dG9uJyk7CiAgICBsLmNsaWNrKCk7CiAgfSwKfSk7Cl9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIl8iXS5yZWdpc3Rlcih7CiAgcnVsZTogewogICAgaG9zdDogWwogICAgICAvXmxpbmstdG9cLm5ldCQvLAogICAgICAvXmxpbmt2ZXJ0aXNlXC5jb20kLywKICAgIF0sCiAgICBxdWVyeTogL15cP3I9KFthLXpBLVowLTkvPV0rKSQvLAogIH0sCiAgYXN5bmMgc3RhcnQgKG0pIHsKICAgIGNvbnN0IHVybCA9IGF0b2IobS5xdWVyeVsxXSk7CiAgICBhd2FpdCBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0ub3BlbkxpbmsodXJsKTsKICB9LAp9KTsKX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siXyJdLnJlZ2lzdGVyKHsKICBydWxlOiB7CiAgICBob3N0OiAvXmRpcmVjdC1saW5rXC5uZXQkLywKICB9LAogIGFzeW5jIHJlYWR5ICgpIHsKICAgIGNvbnN0IGx2ID0gX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdLnNlYXJjaEZyb21TY3JpcHRzKC93aW5kb3cubG9jYXRpb24uaHJlZiA9IFwoIihbXiJdKykiXCk7Lyk7CiAgICBhd2FpdCBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0ub3BlbkxpbmsobHZbMV0pOwogIH0sCn0pOwpfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyJfIl0ucmVnaXN0ZXIoewogIHJ1bGU6IHsKICAgIGhvc3Q6IC9eKHJkPylsbmtcLmNvJC8sCiAgICBwYXRoOiAvXlwvW14uXSskLywKICB9LAogIGFzeW5jIHJlYWR5ICgpIHsKICAgIGNvbnN0IGYgPSBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0uJCgnaWZyYW1lI2Rlc3QnKTsKICAgIGlmIChmKSB7CiAgICAgIGF3YWl0IF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXS5vcGVuTGluayhmLnNyYyk7CiAgICAgIHJldHVybjsKICAgIH0KICAgIF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXS5yZW1vdmUoJ2lmcmFtZScpOwogICAgbGV0IG8gPSBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0uJCgnI3VybGhvbGRlcicpOwogICAgaWYgKG8pIHsKICAgICAgYXdhaXQgX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdLm9wZW5MaW5rKG8udmFsdWUpOwogICAgICByZXR1cm47CiAgICB9CiAgICBvID0gX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdLiQoJyNza2lwQnRuJyk7CiAgICBpZiAobykgewogICAgICBvID0gby5xdWVyeVNlbGVjdG9yKCdhJyk7CiAgICAgIGF3YWl0IF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXS5vcGVuTGluayhvLmhyZWYpOwogICAgICByZXR1cm47CiAgICB9CiAgICBvID0gZG9jdW1lbnQudGl0bGUucmVwbGFjZSgvKExOSy5jb3xMaW5rYmVlKVxzKjpccyovLCAnJyk7CiAgICBhd2FpdCBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0ub3Blbkxpbmsobyk7CiAgfSwKfSk7Cl9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIl8iXS5yZWdpc3Rlcih7CiAgcnVsZTogewogICAgaG9zdDogL153d3dcLmxvbGluZXpcLmNvbSQvLAogICAgcXVlcnk6IC9cPyguKykvLAogIH0sCiAgYXN5bmMgc3RhcnQgKG0pIHsKICAgIGF3YWl0IF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXS5vcGVuTGluayhtLnF1ZXJ5WzFdKTsKICB9LAp9KTsKX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siXyJdLnJlZ2lzdGVyKHsKICBydWxlOiB7CiAgICBob3N0OiAvXnd3d1wubWlqZVwubmV0JC8sCiAgICBwYXRoOiAvXlwvXHcrXC8oLispJC8sCiAgfSwKICBhc3luYyBzdGFydCAobSkgewogICAgY29uc3QgdXJsID0gYXRvYihtLnBhdGhbMV0pOwogICAgYXdhaXQgX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdLm9wZW5MaW5rKHVybCk7CiAgfSwKfSk7Cl9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIl8iXS5yZWdpc3Rlcih7CiAgcnVsZTogewogICAgaG9zdDogWwogICAgICAvXm1pbmlkcm9pZFwubmV0JC8sCiAgICAgIC9ebGlua3BvaVwuaW4kLywKICAgIF0sCiAgfSwKICBhc3luYyByZWFkeSAoKSB7CiAgICBjb25zdCBhID0gT2JqZWN0KF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXSkoJ2EucmVkaXJlY3QsIGFbdGFyZ2V0PV9ibGFua11bcmVsPW5vZm9sbG93XScpOwogICAgYXdhaXQgX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdLm9wZW5MaW5rKGEuaHJlZik7CiAgfSwKfSk7Cl9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIl8iXS5yZWdpc3Rlcih7CiAgcnVsZTogewogICAgaG9zdDogL15taXJyb3JmaWxlaG9zdFwuY29tJC8sCiAgfSwKICBhc3luYyByZWFkeSAoKSB7CiAgICBhd2FpdCBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyJfIl0ud2FpdCgzICogMTAwMCk7CiAgICBjb25zdCBmcmFtZSA9IGZyYW1lc1swXTsKICAgIGNvbnN0IGZvcm0gPSBmcmFtZS5kb2N1bWVudC5jcmVhdGVFbGVtZW50KCdmb3JtJyk7CiAgICBmb3JtLnRhcmdldCA9ICdfcGFyZW50JzsKICAgIGZvcm0uYWN0aW9uID0gbG9jYXRpb24udG9TdHJpbmcoKTsKICAgIGNvbnN0IGlucHV0ID0gZnJhbWUuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaW5wdXQnKTsKICAgIGlucHV0LnZhbHVlID0gJ0Rvd25sb2FkJzsKICAgIGlucHV0LnR5cGUgPSAnc3VibWl0JzsKICAgIGZvcm0uYXBwZW5kQ2hpbGQoaW5wdXQpOwogICAgZnJhbWUuZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChmb3JtKTsKICAgIGlucHV0LmNsaWNrKCk7CiAgfSwKfSk7Cl9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIl8iXS5yZWdpc3Rlcih7CiAgcnVsZTogewogICAgaG9zdDogL15tb2VzdWJzXC5jb20kLywKICAgIHBhdGg6IC9eXC91cmxcLy8sCiAgfSwKICBhc3luYyByZWFkeSAoKSB7CiAgICBsZXQgYSA9IE9iamVjdChfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0pKCcuZ290b2xpbmsgPiBjZW50ZXI6bnRoLWNoaWxkKDEpID4gZGl2Om50aC1jaGlsZCgxKSA+IGk6bnRoLWNoaWxkKDIpJyk7CiAgICBhID0gYS50ZXh0Q29udGVudDsKICAgIGNvbnN0IGkgPSBhLmxhc3RJbmRleE9mKCdodHRwJyk7CiAgICBhID0gYS5zdWJzdHIoaSk7CiAgICBhd2FpdCBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0ub3BlbkxpbmsoYSk7CiAgfSwKfSk7Cl9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIl8iXS5yZWdpc3Rlcih7CiAgcnVsZTogJ2h0dHA6Ly9teS1saW5rLnByby8qJywKICBhc3luYyByZWFkeSAoKSB7CiAgICBjb25zdCBpID0gT2JqZWN0KF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXSkoJ2lmcmFtZVtzY3JvbGxpbmc9YXV0b10nKTsKICAgIGlmIChpKSB7CiAgICAgIGF3YWl0IF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXS5vcGVuTGluayhpLnNyYyk7CiAgICB9CiAgfSwKfSk7Cl9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIl8iXS5yZWdpc3Rlcih7CiAgcnVsZTogewogICAgaG9zdDogL14od3d3XC4pP215bGlua1wuem9uZSQvLAogICAgcGF0aDogL15cL1teL10rJC8sCiAgfSwKICBhc3luYyByZWFkeSAoKSB7CiAgICBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0ucmVtb3ZlKCdpZnJhbWUnKTsKICAgIGNvbnN0IG1hdGNoZXMgPSBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0uc2VhcmNoRnJvbVNjcmlwdHMoLzxhIGhyZWY9Imh0dHBzOlwvXC8oPzp3d3dcLik/bXlsaW5rXC56b25lXC9saW5rXC9yZWRpcmVjdFwvXD91cmw9KFteJl0rKSYvKTsKICAgIGNvbnN0IHVybCA9IGRlY29kZVVSSUNvbXBvbmVudChtYXRjaGVzWzFdKTsKICAgIGF3YWl0IF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXS5vcGVuTGluayh1cmwpOwogIH0sCn0pOwpfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyJfIl0ucmVnaXN0ZXIoewogIHJ1bGU6IHsKICAgIGhvc3Q6IC9eb25lcGllY2UtZXhcLmNvbVwuYnIkLywKICB9LAogIGFzeW5jIHJlYWR5ICgpIHsKICAgIF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXS5yZW1vdmUoJ2lmcmFtZScpOwogICAgY29uc3QgbWF0Y2hlcyA9IF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXS5zZWFyY2hGcm9tU2NyaXB0cygvPGEgaHJlZj0iKFteJl0rKSg/PSIgKS8pOwogICAgYXdhaXQgX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdLm9wZW5MaW5rKG1hdGNoZXNbMV0pOwogIH0sCn0pOwpfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyJfIl0ucmVnaXN0ZXIoewogIHJ1bGU6IHsKICAgIGhvc3Q6IFsKICAgICAgL153d3dcLm5hbWl5dFwuY29tJC8sCiAgICAgIC9ecmVhbHNodFwubW9iaSQvLAogICAgXSwKICB9LAogIGFzeW5jIHJlYWR5ICgpIHsKICAgIGNvbnN0IG4gPSBPYmplY3QoX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdKSgnI3NlY3Rpb24xIGZvcm0gaW5wdXQjc2VjdGlvbjEnKTsKICAgIG4uY2xpY2soKTsKICB9LAp9KTsKX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siXyJdLnJlZ2lzdGVyKHsKICBydWxlOiB7CiAgICBob3N0OiAvXm5tYWNcLnRvJC8sCiAgICBwYXRoOiAvXlwvZG93bmxvYWRcLyguKykvLAogIH0sCiAgYXN5bmMgc3RhcnQgKG0pIHsKICAgIGNvbnN0IHVybCA9IGF0b2IobS5wYXRoWzFdKTsKICAgIGF3YWl0IF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXS5vcGVuTGluayh1cmwpOwogIH0sCn0pOwpfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyJfIl0ucmVnaXN0ZXIoewogIHJ1bGU6IHsKICAgIGhvc3Q6IC9ebnNmd1wuaW4kLywKICB9LAogIGFzeW5jIHJlYWR5ICgpIHsKICAgIGNvbnN0IGEgPSBPYmplY3QoX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdKSgnI2xvbmdfdXJsIGEnKTsKICAgIGF3YWl0IF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXS5vcGVuTGluayhhLmhyZWYpOwogIH0sCn0pOwpfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyJfIl0ucmVnaXN0ZXIoewogIHJ1bGU6IHsKICAgIGhvc3Q6IC9ebnV0c2hlbGx1cmxcLmNvbSQvLAogIH0sCiAgYXN5bmMgcmVhZHkgKCkgewogICAgY29uc3QgaWZyYW1lID0gT2JqZWN0KF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXSkoJ2lmcmFtZScpOwogICAgYXdhaXQgX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdLm9wZW5MaW5rKGlmcmFtZS5zcmMpOwogIH0sCn0pOwpfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyJfIl0ucmVnaXN0ZXIoewogIHJ1bGU6IHsKICAgIGhvc3Q6IC9ed3d3XC5vbmlcLnZuJC8sCiAgfSwKICBhc3luYyByZWFkeSAoKSB7CiAgICBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0ucmVtb3ZlKCdpZnJhbWUnKTsKICAgIGxldCBkYXRhID0gX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdLnNlYXJjaEZyb21TY3JpcHRzKC9kYXRhOiIoW14iXSspIi8pOwogICAgaWYgKCFkYXRhKSB7CiAgICAgIHRocm93IG5ldyBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyJfIl0uQWRzQnlwYXNzZXJFcnJvcigncGF0dGVybiBjaGFuZ2VkJyk7CiAgICB9CiAgICBkYXRhID0gZGF0YVsxXTsKICAgIGNvbnN0IHVybCA9IGF3YWl0IF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXS5nZXQoJy9jbGljay5odG1sJywgZGF0YSk7CiAgICBhd2FpdCBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0ub3BlbkxpbmsodXJsKTsKICB9LAp9KTsKX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siXyJdLnJlZ2lzdGVyKHsKICBydWxlOiB7CiAgICBob3N0OiBbCiAgICAgIC9eKHd3d1wuKT9vdW9cLihpb3xwcmVzcykkLywKICAgICAgL14oc2xvb21wfG5vdmFlbnJldGEpXC5zcGFjZSQvLAogICAgXSwKICAgIHBhdGg6IC9eXC9nb1wvXHcrJC8sCiAgfSwKICBhc3luYyByZWFkeSAoKSB7CiAgICBPYmplY3QoX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdKSgnZm9ybScpLnN1Ym1pdCgpOwogIH0sCn0pOwpfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyJfIl0ucmVnaXN0ZXIoewogIHJ1bGU6IHsKICAgIGhvc3Q6IC9ecFwucHckLywKICB9LAogIGFzeW5jIHJlYWR5ICgpIHsKICAgIF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXS5yZW1vdmUoJ2lmcmFtZScpOwogICAgbGV0IG0gPSBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0uc2VhcmNoRnJvbVNjcmlwdHMoL3dpbmRvd1wubG9jYXRpb24gPSAiKC4qKSI7Lyk7CiAgICBtID0gbVsxXTsKICAgIGF3YWl0IF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXS5vcGVuTGluayhtKTsKICB9LAp9KTsKX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siXyJdLnJlZ2lzdGVyKHsKICBydWxlOiB7CiAgICBob3N0OiAvXnBkaTJcLm5ldCQvLAogIH0sCiAgYXN5bmMgcmVhZHkgKCkgewogICAgbGV0IHMgPSBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0uc2VhcmNoRnJvbVNjcmlwdHMoL3RvcFwubG9jYXRpb24gPSAnKFteJ10rKScvKTsKICAgIHMgPSBzWzFdOwogICAgYXdhaXQgX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdLm9wZW5MaW5rKHMpOwogIH0sCn0pOwpfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyJfIl0ucmVnaXN0ZXIoewogIHJ1bGU6IHsKICAgIGhvc3Q6IFsKICAgICAgL14ocHJvYnVzaW5lc3NodWJ8dGVjbm9nYilcLmNvbSQvLAogICAgICAvXih0cmFja3l3ZXxzdGFydmF0ZSlcLmluJC8sCiAgICAgIC9edmlyYWxjb2xsZWN0XC5pbmZvJC8sCiAgICAgIC9eKHRlY2hub2RpYXxvdXJ0ZWNobm9ld3xtdXRoYXJhbW1zc3x0aGFuZGF8dGhpbmFuYSlcLnh5eiQvLAogICAgICAvXmVudHJldGVuZG9uYXdlYlwuZ2EkLywKICAgIF0sCiAgfSwKICBhc3luYyByZWFkeSAoKSB7CiAgICBsZXQgZiA9IF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXS4kKCdmb3JtW2lkJD0tc3Vic2NyaWJlXScpOwogICAgaWYgKGYpIHsKICAgICAgZi5hY3Rpb24gPSBmLmFjdGlvbi5yZXBsYWNlKCdodHRwOicsICdodHRwczonKTsKICAgICAgZi5zdWJtaXQoKTsKICAgICAgcmV0dXJuOwogICAgfQogICAgZiA9IF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXS5zZWFyY2hGcm9tU2NyaXB0cygvbG9jYXRpb25cLmhyZWY9IihbXiJdKykiLyk7CiAgICBmID0gZlsxXTsKICAgIGF3YWl0IF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXS5vcGVuTGluayhmKTsKICB9LAp9KTsKX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siXyJdLnJlZ2lzdGVyKHsKICBydWxlOiB7CiAgICBob3N0OiAvXnB1Y3VrXC54eXokLywKICAgIHBhdGg6IC9eXC9cdysvLAogIH0sCiAgYXN5bmMgcmVhZHkgKCkgewogICAgY29uc3QgcHggPSBPYmplY3QoX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdKSgnI2NvbnRlbnQgYXJ0aWNsZSBjZW50ZXIgYS5idXR0b24uaWNvbi5mYS1saW5rJyk7CiAgICBhd2FpdCBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0ub3BlbkxpbmsocHguaHJlZik7CiAgfSwKfSk7Cl9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIl8iXS5yZWdpc3Rlcih7CiAgcnVsZTogJ2h0dHA6Ly9yaWNobGluay5jb20vYXBwL3dlYnNjcj9jbWQ9X2NsaWNrJmtleT0qJywKICBhc3luYyByZWFkeSAoKSB7CiAgICBsZXQgZiA9IE9iamVjdChfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0pKCdmcmFtZXNldCcpOwogICAgZiA9IGYub25sb2FkLnRvU3RyaW5nKCk7CiAgICBmID0gZi5tYXRjaCgvdXJsPShbXiZdKykvKTsKICAgIGlmIChmKSB7CiAgICAgIGYgPSBkZWNvZGVVUklDb21wb25lbnQoZlsxXSk7CiAgICB9IGVsc2UgewogICAgICBmID0gT2JqZWN0KF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXSkoJ2ZyYW1lW25hbWU9c2l0ZV0nKTsKICAgICAgZiA9IGYuc3JjOwogICAgfQogICAgYXdhaXQgX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdLm9wZW5MaW5rKGYpOwogIH0sCn0pOwpfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyJfIl0ucmVnaXN0ZXIoewogIHJ1bGU6IHsKICAgIGhvc3Q6IC9ecHJldmlld1wucmx1XC5ydSQvLAogIH0sCiAgYXN5bmMgcmVhZHkgKCkgewogICAgY29uc3QgYSA9IE9iamVjdChfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0pKCcjY29udGVudCA+IC5sb25nX3VybCA+IGEnKTsKICAgIGF3YWl0IF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXS5vcGVuTGluayhhLmhyZWYpOwogIH0sCn0pOwpfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyJfIl0ucmVnaXN0ZXIoewogIHJ1bGU6IHsKICAgIGhvc3Q6IC9ed3d3XC5yb25cLnZuJC8sCiAgfSwKICBhc3luYyByZWFkeSAoKSB7CiAgICBjb25zdCBzY3JpcHQgPSBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0uc2VhcmNoRnJvbVNjcmlwdHMoJ2xpbmtuZXh0dG9wJyk7CiAgICBjb25zdCBkYXRhID0gc2NyaXB0Lm1hdGNoKC9kYXRhOiIoW14iXSspIi8pOwogICAgbGV0IHVybCA9IF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXS53aW5kb3cuZG9tYWluICsgJ2NsaWNrLmh0bWw/JyArIGRhdGFbMV07CiAgICB1cmwgPSBhd2FpdCBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0uZ2V0KHVybCwge30sIHsKICAgICAgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uOyBjaGFyc2V0PXV0Zi04JywKICAgIH0pOwogICAgYXdhaXQgX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdLm9wZW5MaW5rKHVybCk7CiAgfSwKfSk7Cl9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIl8iXS5yZWdpc3Rlcih7CiAgcnVsZTogewogICAgaG9zdDogL14od3d3XC4pP3NhXC5hZSQvLAogICAgcGF0aDogL15cL1x3K1wvJC8sCiAgfSwKICBhc3luYyByZWFkeSAoKSB7CiAgICBjb25zdCBtID0gX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdLnNlYXJjaEZyb21TY3JpcHRzKC9jb25zdCByZWFsX2xpbmsgPSAnKFteJ10rKSc7Lyk7CiAgICBhd2FpdCBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0ub3BlbkxpbmsobVsxXSk7CiAgfSwKfSk7Cl9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIl8iXS5yZWdpc3Rlcih7CiAgcnVsZTogewogICAgaG9zdDogL14od3d3XC4pP3NhZmV1cmxcLmV1JC8sCiAgICBwYXRoOiAvXC9cdysvLAogIH0sCiAgYXN5bmMgcmVhZHkgKCkgewogICAgbGV0IGRpcmVjdFVybCA9IF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXS5zZWFyY2hGcm9tU2NyaXB0cygvd2luZG93XC5vcGVuXCgiKFteIl0rKSJcKTsvKTsKICAgIGlmICghZGlyZWN0VXJsKSB7CiAgICAgIHRocm93IG5ldyBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyJfIl0uQWRzQnlwYXNzZXJFcnJvcignc2NyaXB0IGNvbnRlbnQgY2hhbmdlZCcpOwogICAgfQogICAgZGlyZWN0VXJsID0gZGlyZWN0VXJsWzFdOwogICAgYXdhaXQgX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdLm9wZW5MaW5rKGRpcmVjdFVybCk7CiAgfSwKfSk7Cl9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIl8iXS5yZWdpc3Rlcih7CiAgcnVsZTogewogICAgaG9zdDogWwogICAgICAvXnNlZ21lbnRuZXh0XC5jb20kLywKICAgICAgL14od3d3XC4pP3ZpZGVvZ2FtZXNibG9nZ2VyXC5jb20kLywKICAgIF0sCiAgICBwYXRoOiAvXlwvaW50ZXJzdGl0aWFsXC5odG1sJC8sCiAgICBxdWVyeTogL3JldHVybl91cmw9KFteJl0rKS8sCiAgfSwKICBhc3luYyBzdGFydCAobSkgewogICAgYXdhaXQgX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdLm9wZW5MaW5rKGRlY29kZVVSSUNvbXBvbmVudChtLnF1ZXJ5WzFdKSk7CiAgfSwKfSk7Cl9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIl8iXS5yZWdpc3Rlcih7CiAgcnVsZTogewogICAgaG9zdDogWwogICAgICAvXih3d3dcLik/c2VtcHJvdFwuY29tJC8sCiAgICAgIC9eNDZcLjE2NlwuMTY3XC4xNiQvLAogICAgXSwKICAgIHBhdGg6IC9eXC9haGxpXC5waHAvLAogICAgcXVlcnk6IC9eXD91cmw9KC4qKS8sCiAgfSwKICBhc3luYyByZWFkeSAoKSB7CiAgICBjb25zdCBzZW0gPSBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0uc2VhcmNoRnJvbVNjcmlwdHMoL3ZhciB0aGVfdXJsID0gJyhbXiddKyknOy8pOwogICAgYXdhaXQgX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdLm9wZW5MaW5rKHNlbVsxXSk7CiAgfSwKfSk7Cl9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIl8iXS5yZWdpc3Rlcih7CiAgcnVsZTogewogICAgaG9zdDogWwogICAgICAvXih3d3dcLik/YXBwbG9hZHpcLnJ1JC8sCiAgICAgIC9eKHd3d1wuKT9zZW9tYWZpYVwubmV0JC8sCiAgICBdLAogIH0sCiAgYXN5bmMgcmVhZHkgKCkgewogICAgX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdLnJlbW92ZSgnaWZyYW1lJyk7CiAgICBjb25zdCBhID0gT2JqZWN0KF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXSkoJ3RhYmxlIGEnKTsKICAgIGF3YWl0IF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXS5vcGVuTGluayhhLmhyZWYpOwogIH0sCn0pOwooZnVuY3Rpb24gKCkgewogIGNvbnN0IGhvc3RSdWxlcyA9IFsKICAgIC9eKGpudzB8Y2xsa21lfGNsa21laW58Y29ybmVleXxjZWVzdHkpXC5jb20kLywKICAgIC9eKGRlc3R5eXxmZXN0eXl8Z2VzdHl5KVwuY29tJC8sCiAgICAvXnNoXC5zdCQvLAogICAgL14odmlpZHx3aWlkfGNsa21lKVwubWUkLywKICBdOwogIF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIl8iXS5yZWdpc3Rlcih7CiAgICBydWxlOiB7CiAgICAgIGhvc3Q6IGhvc3RSdWxlcywKICAgICAgcGF0aDogL15cL2ZyZWV6ZVwvLisvLAogICAgfSwKICAgIGFzeW5jIHJlYWR5ICgpIHsKICAgICAgY29uc3QgcHJvbWlzZSA9IG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7CiAgICAgICAgY29uc3QgbyA9IG5ldyBNdXRhdGlvbk9ic2VydmVyKChtdXRhdGlvbnMpID0+IHsKICAgICAgICAgIG11dGF0aW9ucy5mb3JFYWNoKChtdXRhdGlvbikgPT4gewogICAgICAgICAgICBpZiAobXV0YXRpb24udGFyZ2V0LmdldEF0dHJpYnV0ZSgnY2xhc3MnKS5tYXRjaCgvYWN0aXZlLykpIHsKICAgICAgICAgICAgICBvLmRpc2Nvbm5lY3QoKTsKICAgICAgICAgICAgICByZXNvbHZlKG11dGF0aW9uLnRhcmdldC5ocmVmKTsKICAgICAgICAgICAgfQogICAgICAgICAgfSk7CiAgICAgICAgfSk7CiAgICAgICAgby5vYnNlcnZlKE9iamVjdChfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0pKCcjc2tpcF9idXR0b24nKSwgewogICAgICAgICAgYXR0cmlidXRlczogdHJ1ZSwKICAgICAgICAgIGF0dHJpYnV0ZUZpbHRlcjogWydjbGFzcyddLAogICAgICAgIH0pOwogICAgICB9KTsKICAgICAgY29uc3QgdXJsID0gYXdhaXQgcHJvbWlzZTsKICAgICAgYXdhaXQgX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdLm9wZW5MaW5rKHVybCk7CiAgICB9LAogIH0pOwogIF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIl8iXS5yZWdpc3Rlcih7CiAgICBydWxlOiB7CiAgICAgIGhvc3Q6IGhvc3RSdWxlcywKICAgICAgcGF0aDogL2h0dHBzPzpcL1wvLywKICAgIH0sCiAgICBhc3luYyBzdGFydCAoKSB7CiAgICAgIGxldCB1cmwgPSB3aW5kb3cubG9jYXRpb24ucGF0aG5hbWUgKyB3aW5kb3cubG9jYXRpb24uc2VhcmNoICsgd2luZG93LmxvY2F0aW9uLmhhc2g7CiAgICAgIHVybCA9IHVybC5tYXRjaCgvKGh0dHBzPzpcL1wvLiopJC8pOwogICAgICB1cmwgPSB1cmxbMV07CiAgICAgIGF3YWl0IF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXS5vcGVuTGluayh1cmwpOwogICAgfSwKICB9KTsKICBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyJfIl0ucmVnaXN0ZXIoewogICAgcnVsZTogewogICAgICBob3N0OiBob3N0UnVsZXMsCiAgICAgIHBhdGg6IC9eXC9bXGRcd10rLywKICAgIH0sCiAgICBhc3luYyBzdGFydCAoKSB7CiAgICAgIF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXS53aW5kb3cuX2ltcHNwY2FiZSA9IDA7CiAgICB9LAogICAgYXN5bmMgcmVhZHkgKCkgewogICAgICBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0ucmVtb3ZlKCdpZnJhbWUnKTsKICAgICAgX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdLnJlbW92ZUFsbFRpbWVyKCk7CiAgICAgIGNvbnN0IG0gPSBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0uc2VhcmNoRnJvbVNjcmlwdHMoL3Nlc3Npb25JZDogIihbXGRcd10rKSIsLyk7CiAgICAgIGlmIChtKSB7CiAgICAgICAgYWZ0ZXJHb3RTZXNzaW9uSWQobVsxXSk7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIGNvbnN0IG8gPSBuZXcgTXV0YXRpb25PYnNlcnZlcigobXV0YXRpb25zKSA9PiB7CiAgICAgICAgbXV0YXRpb25zLmZvckVhY2goKCkgPT4gewogICAgICAgICAgY29uc3QgbSA9IF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXS5zZWFyY2hGcm9tU2NyaXB0cygvc2Vzc2lvbklkOiAiKFtcZFx3XSspIiwvKTsKICAgICAgICAgIGlmIChtKSB7CiAgICAgICAgICAgIG8uZGlzY29ubmVjdCgpOwogICAgICAgICAgICBhZnRlckdvdFNlc3Npb25JZChtWzFdKTsKICAgICAgICAgIH0KICAgICAgICB9KTsKICAgICAgfSk7CiAgICAgIG8ub2JzZXJ2ZShkb2N1bWVudC5ib2R5LCB7CiAgICAgICAgY2hpbGRMaXN0OiB0cnVlLAogICAgICB9KTsKICAgIH0sCiAgfSk7CiAgZnVuY3Rpb24gYWZ0ZXJHb3RTZXNzaW9uSWQgKHNlc3Npb25JZCkgewogICAgY29uc3QgWF9OZXdSZWxpY19JRCA9IF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXS5zZWFyY2hGcm9tU2NyaXB0cygveHBpZDoiKFteIl0rKSIvKTsKICAgIGNvbnN0IGRhdGEgPSB7CiAgICAgIGFkU2Vzc2lvbklkOiBzZXNzaW9uSWQsCiAgICB9OwogICAgY29uc3QgaGVhZGVyID0gewogICAgICBBY2NlcHQ6ICdhcHBsaWNhdGlvbi9qc29uLCB0ZXh0L2phdmFzY3JpcHQnLAogICAgfTsKICAgIGlmIChYX05ld1JlbGljX0lEKSB7CiAgICAgIGhlYWRlclsnWC1OZXdSZWxpYy1JRCddID0gWF9OZXdSZWxpY19JRDsKICAgIH0KICAgIGNvbnN0IGkgPSBzZXRJbnRlcnZhbChmdW5jdGlvbiAoKSB7CiAgICAgIF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXS5nZXQoJy9zaG9ydGVzdC11cmwvZW5kLWFkc2Vzc2lvbicsIGRhdGEsIGhlYWRlcikudGhlbihmdW5jdGlvbiAodGV4dCkgewogICAgICAgIGNvbnN0IHIgPSBKU09OLnBhcnNlKHRleHQpOwogICAgICAgIGlmIChyLnN0YXR1cyA9PSAnb2snICYmIHIuZGVzdGluYXRpb25VcmwpIHsKICAgICAgICAgIGNsZWFySW50ZXJ2YWwoaSk7CiAgICAgICAgICBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0ucmVtb3ZlQWxsVGltZXIoKTsKICAgICAgICAgIGNvbnN0IHVybCA9IGRlY29kZVVSSUNvbXBvbmVudChyLmRlc3RpbmF0aW9uVXJsKTsKICAgICAgICAgIHJldHVybiBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0ub3BlbkxpbmsodXJsKTsKICAgICAgICB9CiAgICAgIH0pOwogICAgfSwgMTAwMCk7CiAgfQp9KSgpOwpfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyJfIl0ucmVnaXN0ZXIoewogIHJ1bGU6IHsKICAgIGhvc3Q6IC9eKHNob3J0fHNydClcLmFtJC8sCiAgfSwKICBhc3luYyByZWFkeSAoKSB7CiAgICBhd2FpdCBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyJfIl0ud2FpdCg1MDAwKTsKICAgIGF3YWl0IF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXS5vcGVuTGluaygnJywgewogICAgICBwb3N0OiB7CiAgICAgICAgX2ltYWdlOiAnQ29udGludWUnLAogICAgICB9LAogICAgfSk7CiAgfSwKfSk7Cl9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIl8iXS5yZWdpc3Rlcih7CiAgcnVsZTogewogICAgaG9zdDogL14od3d3XC4pP3Nob3J0aVwuZ2EkLywKICAgIHBhdGg6IFsKICAgICAgL15cL1x3KyQvLAogICAgICAvXlwvdXJsX3JlZGlyZWN0b3JcLmh0bWwkLywKICAgIF0sCiAgfSwKICBhc3luYyByZWFkeSAoKSB7CiAgICBjb25zdCBmID0gX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdLiQkKCdmcmFtZScpOwogICAgY29uc3QgWywgdixdID0gX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siXyJdLmZpbmQoZiwgKHZhbHVlKSA9PiB7CiAgICAgIGlmICh2YWx1ZS5nZXRBdHRyaWJ1dGUoJ2NsYXNzJykpIHsKICAgICAgICByZXR1cm4gX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siXyJdLm5vbmU7CiAgICAgIH0KICAgICAgcmV0dXJuICdUYXJnZXQgZnJhbWUgZm91bmQnOwogICAgfSk7CiAgICBhd2FpdCBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0ub3Blbkxpbmsodi5zcmMpOwogIH0sCn0pOwpfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyJfIl0ucmVnaXN0ZXIoewogIHJ1bGU6IHsKICAgIGhvc3Q6IC9ec2hvcnRpZFwuY28kLywKICAgIHBhdGg6IC9eXC9bYS16QS1aMC05XSsvLAogIH0sCiAgYXN5bmMgcmVhZHkgKCkgewogICAgY29uc3QgcyA9IE9iamVjdChfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0pKCdhI21ha2luZ2RpZmZlcmVudHRpbWVyJyk7CiAgICBhd2FpdCBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0ub3Blbkxpbmsocy5ocmVmKTsKICB9LAp9KTsKX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siXyJdLnJlZ2lzdGVyKHsKICBydWxlOiB7CiAgICBob3N0OiAvXmdldFwuc2hyaW5rLXNlcnZpY2VcLml0JC8sCiAgICBwYXRoOiAvXlwvKC4rKS8sCiAgfSwKICBhc3luYyBzdGFydCAobSkgewogICAgYXdhaXQgX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdLm9wZW5MaW5rKGAvL3d3dy5zaHJpbmstc2VydmljZS5pdC9zaHJpbmtlZC8ke20ucGF0aFsxXX1gKTsKICB9LAp9KTsKX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siXyJdLnJlZ2lzdGVyKHsKICBydWxlOiB7CiAgICBob3N0OiAvXnd3d1wuc2hyaW5rLXNlcnZpY2VcLml0JC8sCiAgICBwYXRoOiAvXlwvc2hyaW5rZWRcLy8sCiAgfSwKICBhc3luYyByZWFkeSAoKSB7CiAgICBjb25zdCBpID0gT2JqZWN0KF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXSkoJ2lucHV0W2lkXVtuYW1lXScpOwogICAgYXdhaXQgX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdLm9wZW5MaW5rKGkudmFsdWUpOwogIH0sCn0pOwpfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyJfIl0ucmVnaXN0ZXIoewogIHJ1bGU6IHsKICAgIGhvc3Q6IC9ed3d3XC5zaHJpbmstc2VydmljZVwuaXQkLywKICAgIHBhdGg6IC9eXC9bc2VdXC8vLAogIH0sCiAgYXN5bmMgcmVhZHkgKCkgewogICAgX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdLnJlbW92ZSgnaWZyYW1lJyk7CiAgICBjb25zdCBpID0gT2JqZWN0KF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXSkoJ2JvZHkgPiBpbnB1dFtpZF1bbmFtZV0nKTsKICAgIF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXS5vcGVuTGluayhpLnZhbHVlKTsKICB9LAp9KTsKX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siXyJdLnJlZ2lzdGVyKHsKICBydWxlOiB7CiAgICBob3N0OiAvXnNodFwuaW8kLywKICAgIHBhdGg6IC9eXC9cZCtcLyguKykkLywKICB9LAogIGFzeW5jIHN0YXJ0IChtKSB7CiAgICBsZXQgdXJsID0gYXRvYihtLnBhdGhbMV0pOwogICAgdXJsID0gdXJsLm1hdGNoKC9ce3NodC1pb1x9KC4rKVx7c2h0LWlvXH0uKlx7c2h0LWlvXH0vKTsKICAgIGF3YWl0IF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXS5vcGVuTGluayh1cmxbMV0pOwogIH0sCn0pOwpfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyJfIl0ucmVnaXN0ZXIoewogIHJ1bGU6IHsKICAgIGhvc3Q6IC9ec2h0bGlua1wuY28kLywKICAgIHBhdGg6IC9eXC9zaG9ydC11cmxcLy8sCiAgfSwKICBhc3luYyByZWFkeSAoKSB7CiAgICBjb25zdCBtZXRhID0gT2JqZWN0KF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXSkoJ21ldGFbbmFtZT0iZGVzY3JpcHRpb24iXScpOwogICAgY29uc3QgdXJsID0gbWV0YS5jb250ZW50OwogICAgYXdhaXQgX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdLm9wZW5MaW5rKHVybCk7CiAgfSwKfSk7Cl9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIl8iXS5yZWdpc3Rlcih7CiAgcnVsZTogewogICAgaG9zdDogL15zaHRtZVwuY28kLywKICAgIHBhdGg6IC9eXC9cdysvLAogIH0sCiAgYXN5bmMgcmVhZHkgKCkgewogICAgY29uc3QgcyA9IE9iamVjdChfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0pKCcuY29udGVudCBkaXYgYSBidXR0b24nKTsKICAgIHMuY2xpY2soKTsKICB9LAp9KTsKX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siXyJdLnJlZ2lzdGVyKHsKICBydWxlOiB7CiAgICBob3N0OiAvXih3d3dcLik/c2ltaWxhcnNpdGVzXC5jb20kLywKICAgIHBhdGg6IC9eXC9nb3RvXC8oW14/XSspLwogIH0sCiAgYXN5bmMgc3RhcnQgKG0pIHsKICAgIGxldCBsID0gbS5wYXRoWzFdOwogICAgaWYgKCEvXmh0dHBzPzpcL1wvLy50ZXN0KGwpKSB7CiAgICAgIGwgPSAnaHR0cDovLycgKyBsOwogICAgfQogICAgYXdhaXQgX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdLm9wZW5MaW5rKGwpOwogIH0sCn0pOwpfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyJfIl0ucmVnaXN0ZXIoewogIHJ1bGU6IHsKICAgIGhvc3Q6IC9ec2xpbmtcLmJpZCQvLAogICAgcGF0aDogL15cL3Nob3J0XC8vLAogIH0sCiAgYXN5bmMgcmVhZHkgKCkgewogICAgY29uc3QgYSA9IE9iamVjdChfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0pKCcudGV4dC1jZW50ZXIgYSNidG4tbWFpbi5idG4uYnRuLW1haW4nKTsKICAgIGF3YWl0IF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXS5vcGVuTGluayhhLmhyZWYpOwogIH0sCn0pOwpfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyJfIl0ucmVnaXN0ZXIoewogIHJ1bGU6IHsKICAgIGhvc3Q6IC9ed3d3XC5zcGFzdGVcLmNvbSQvLAogICAgcGF0aDogL15cL2dvXC9cdyskLywKICB9LAogIGFzeW5jIHJlYWR5ICgpIHsKICAgIGNvbnN0IGlkID0gX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdLnNlYXJjaEZyb21TY3JpcHRzKC9ce2lkOicoXGQrKSdcfS8pOwogICAgYXdhaXQgX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siXyJdLndhaXQoMzAwMCk7CiAgICBjb25zdCB1cmwgPSBhd2FpdCBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0ucG9zdCgnL3NpdGUvZ2V0UmVkaXJlY3RMaW5rJywgewogICAgICBpZDogaWRbMV0sCiAgICB9KTsKICAgIGF3YWl0IF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXS5vcGVuTGluayh1cmwpOwogIH0sCn0pOwpfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyJfIl0ucmVnaXN0ZXIoewogIHJ1bGU6IHsKICAgIGhvc3Q6IC9ed3d3XC5zcGFzdGVcLmNvbSQvLAogICAgcGF0aDogL15cLyhzfHNpdGUpXC9cdyskLywKICB9LAogIGFzeW5jIHJlYWR5ICgpIHsKICAgIGNvbnN0IGNhcHRjaGEgPSBPYmplY3QoX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdKSgnI2dsb2JhbENhcHRjaGFDb25maXJtJyk7CiAgICBjYXB0Y2hhLmNsaWNrKCk7CiAgICBhd2FpdCBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyJfIl0ud2FpdCgxMDAwKTsKICAgIGZvciAobGV0IGkgPSAwOyBpIDwgMzsgKytpKSB7CiAgICAgIGNvbnN0IHdvcmQgPSBPYmplY3QoX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdKSgnI2N1cnJlbnRDYXBRdWUnKS50ZXh0Q29udGVudDsKICAgICAgYXdhaXQgX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siXyJdLndhaXQoMTAwKTsKICAgICAgT2JqZWN0KF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXSkoYFtkYXRhLWlkPScke3dvcmR9J11gKS5jbGljaygpOwogICAgfQogICAgT2JqZWN0KF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXSkoJyN0ZW1wbGF0ZS1jb250YWN0Zm9ybS1zdWJtaXQnKS5jbGljaygpOwogIH0sCn0pOwpfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyJfIl0ucmVnaXN0ZXIoewogIHJ1bGU6IHsKICAgIGhvc3Q6IC9ec3ViMnVubG9ja1wuY29tJC8sCiAgICBwYXRoOiAvXlwvbGlua1wvZ2V0XC8vLAogIH0sCiAgYXN5bmMgcmVhZHkgKCkgewogICAgY29uc3Qgc3UgPSBPYmplY3QoX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdKSgnYSNsaW5rLnVubG9jay1zdGVwLWxpbmsuZ2V0bGluaycpOwogICAgYXdhaXQgX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdLm9wZW5MaW5rKHN1LmhyZWYpOwogIH0sCn0pOwpfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyJfIl0ucmVnaXN0ZXIoewogIHJ1bGU6IHsKICAgIGhvc3Q6IC9ec3ViMnVubG9ja1wuY29tJC8sCiAgICBwYXRoOiAvXlwvW2EtekEtWjAtOV0rLywKICB9LAogIGFzeW5jIHJlYWR5ICgpIHsKICAgIGNvbnN0IHN1ID0gX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdLnNlYXJjaEZyb21TY3JpcHRzKC8naHJlZicsICcoW14nXSspJy8pOwogICAgYXdhaXQgX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdLm9wZW5MaW5rKHN1WzFdKTsKICB9LAp9KTsKX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siXyJdLnJlZ2lzdGVyKHsKICBydWxlOiB7CiAgICBob3N0OiAvXih3d3dcLik/c3VwZXJjaGVhdHNcLmNvbSQvLAogICAgcGF0aDogL15cL2ludGVyc3RpdGlhbFwuaHRtbCQvLAogICAgcXVlcnk6IC8oPzpcP3wmKW9sZHVybD0oW14mXSspKD86JHwmKS8sCiAgfSwKICBhc3luYyBzdGFydCAobSkgewogICAgYXdhaXQgX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdLm9wZW5MaW5rKG0ucXVlcnlbMV0pOwogIH0sCn0pOwpfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyJfIl0ucmVnaXN0ZXIoewogIHJ1bGU6IHsKICAgIGhvc3Q6IC9ec3VyZnNlZXNcLmNvbSQvLAogICAgcXVlcnk6IC9eXD9nbz0oW2EtekEtWjAtOV0rKSQvLAogIH0sCiAgYXN5bmMgc3RhcnQgKCkgewogICAgY29uc3QgcGF0aCA9IHdpbmRvdy5sb2NhdGlvbi5ocmVmLnJlcGxhY2UoJ2dvJywgJ2xpbmsnKTsKICAgIGF3YWl0IF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXS5vcGVuTGluayhwYXRoKTsKICB9LAp9KTsKX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siXyJdLnJlZ2lzdGVyKHsKICBydWxlOiB7CiAgICBob3N0OiAvXnN1cmZzZWVzXC5jb20kLywKICAgIHF1ZXJ5OiAvXlw/bGluaz0oW2EtekEtWjAtOV0rKShjbGlja2FydXJsKT8kLywKICB9LAogIGFzeW5jIHJlYWR5ICgpIHsKICAgIGNvbnN0IHMgPSBPYmplY3QoX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdKSgnaW5wdXQuYnRuLmJ0bi1wcmltYXJ5Jyk7CiAgICBzLmNsaWNrKCk7CiAgfSwKfSk7Cl9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIl8iXS5yZWdpc3Rlcih7CiAgcnVsZTogewogICAgaG9zdDogL15zdXJmc2Vlc1wuY29tJC8sCiAgfSwKICBhc3luYyByZWFkeSAoKSB7CiAgICBjb25zdCBzdXJsID0gT2JqZWN0KF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXSkoJyN3cHNhZmUtbGlua3ogYScpOwogICAgYXdhaXQgX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdLm9wZW5MaW5rKHN1cmwuaHJlZik7CiAgfSwKfSk7Cl9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIl8iXS5yZWdpc3Rlcih7CiAgcnVsZTogewogICAgaG9zdDogL15zd3p6XC54eXokLywKICAgIHBhdGg6IC9eXC9saW5rXC9cdytcLyQvLAogIH0sCiAgYXN5bmMgcmVhZHkgKCkgewogICAgY29uc3QgZyA9IE9iamVjdChfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0pKCdhLmJ0bi13cmFwcGVyLmxpbmsnKTsKICAgIGF3YWl0IF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXS5vcGVuTGluayhnLmhyZWYpOwogIH0sCn0pOwpfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyJfIl0ucmVnaXN0ZXIoewogIHJ1bGU6IFsKICAgIHsKICAgICAgaG9zdDogL14od3d3XC4pP3N5bG5rXC5uZXQkLywKICAgICAgcXVlcnk6IC9saW5rPShbXiZdKykvLAogICAgfSwKICAgIHsKICAgICAgaG9zdDogL14od3d3XC4pP2NvbXB1bFwuaW4kLywKICAgICAgcGF0aDogL15cL1tucF1cLnBocCQvLAogICAgICBxdWVyeTogL3Y9KFteJl0rKS8sCiAgICB9LAogICAgewogICAgICBob3N0OiBbCiAgICAgICAgL14oc3BvcnRzMTR8bW90b3Nwb3J0KVwucHckLywKICAgICAgICAvXmxpbmR1bmdcLmluJC8sCiAgICAgICAgL15tb3RvbmV3c1wuY2x1YiQvLAogICAgICAgIC9ed3dbMjNdXC5waWNuaWN0cmFuc1wuY29tJC8sCiAgICAgICAgL14oYXpoaWV8c2tpbm55Y2F0KVwubmV0JC8sCiAgICAgICAgL153dzJcLmF3c3Vic1wuY28kLywKICAgICAgICAvXnBsYW50YWhlaW1cLih3ZWJcLmlkfGNvbSkkLywKICAgICAgICAvXmlyaXN2ZXJhXC5jb20kLywKICAgICAgXSwKICAgICAgcXVlcnk6IC9eXD9kPShbYS16QS1aMC05Lz1dKykkLywKICAgIH0sCiAgICB7CiAgICAgIGhvc3Q6IFsKICAgICAgICAvXmlcLmd0YWluZFwuY29tJC8sCiAgICAgICAgL15wZWJpc25pcy1tdWRhXC5jb20kLywKICAgICAgICAvXmhpa2FyaW5vYWthcmlvc3RcLmluZm8kLywKICAgICAgXSwKICAgICAgcXVlcnk6IC9eXD8oW2EtekEtWjAtOS89XSspJC8sCiAgICB9LAogICAgewogICAgICBob3N0OiBbCiAgICAgICAgL1wuYmxvZ3Nwb3RcLmNvbT8vLAogICAgICAgIC9eKHd3d1wuKT9kZXNpZ25teWhvbWVlXC5jb20kLywKICAgICAgICAvXih3d3dcLik/bG9zc3RvclwuY29tJC8sCiAgICAgICAgL14oKGt1cm9zYWZlfGt1cm9zYWZldHkpXC4pP21lbmFudGlzZW5qYVwuY29tJC8sCiAgICAgICAgL15kcml2ZVwuamVwaXRrZXJ0YXNcLmNvbSQvLAogICAgICAgIC9ebGV3YXRcLndpYnVpbmRvXC5jb20kLywKICAgICAgICAvXihvbWdtdXNpa3xvbWdseXJpY3N8azJuYmxvZylcLmNvbSQvLAogICAgICAgIC9eKHNpbWFob2xpbmF8YXV0ZWNoKVwueHl6JC8sCiAgICAgICAgL14od3d3XC4pP2lkLXNlY3VyZWxpbmtcLnh5eiQvLAogICAgICAgIC9eKHd3d1wuKT9jb252ZXJ0aGlua3NcLnh5eiQvLAogICAgICAgIC9eKHd3d1wuKT9tYXJpdmVsa2VjZVwueHl6JC8sCiAgICAgICAgL14od3d3XC4pP3lhbWV0ZXNlbnBhaVwueHl6JC8sCiAgICAgICAgL14od3d3XC4pP3RvanJvc1wudGskLywKICAgICAgICAvXih3d3dcLik/YW5qYXlcLmluZm8kLywKICAgICAgICAvXih3d3dcLik/a2Fra29paXNhZmVcLnVzJC8sCiAgICAgICAgL14od3d3XC4pP2t1cm9zYWZlXC4od2Vic2l0ZXxvbmxpbmUpJC8sCiAgICAgICAgL14od3d3XC4pP2RyYWtvcnNhZmVcLnRlY2gkLywKICAgICAgICAvXihmbWxhd2tlcnN8aW5kZXhtb3ZpZSlcLmNsdWIkLywKICAgICAgICAvXm1pY2luXC5vbmxpbmUkLywKICAgICAgICAvXnVuZHVoXC5pbi8sCiAgICAgICAgL15hZDRtc2FuXC53aW4kLywKICAgICAgICAvXm5vb3l1bFwuY28kLywKICAgICAgICAvXnBhZnBhZlwuaW5mbyQvLAogICAgICAgIC9eaGlnaHRlY2hcLndlYlwuaWQkLywKICAgICAgXSwKICAgICAgcXVlcnk6IFsKICAgICAgICAvXlw/dXJsPShbYS16QS1aMC05Lz1dKykkLywKICAgICAgICAvXlw/aWQ9KFthLXpBLVowLTkvPV0rKSQvLAogICAgICAgIC9eXD9zaXRlPShbYS16QS1aMC05Lz1dKykkLywKICAgICAgXSwKICAgIH0sCiAgICB7CiAgICAgIGhvc3Q6IFsKICAgICAgICAvXihzZWhhdGxlZ2F8ZGF2aW5zdXJhbmNlfGhlYWx0aHRvZHxpcmlzdmVyYXxha2Fub3NvcmF8c3ViZXRlbmV3cylcLmNvbSQvLAogICAgICAgIC9eKHd3d1wuKT9tZW5hbnRpc2VuamFcLmNvbSQvLAogICAgICAgIC9eKGJ1c2luZXNzZm9yeW91YW5kfHRyYXZlbHdpdGh0cmlja3N8c2l0dXNiYXJ1KVwubWUkLywKICAgICAgICAvXnBsYW50YWhlaW1cLih3ZWJcLmlkfGNvbSkkLywKICAgICAgICAvXih3d3dcLik/c3RhcnpvbmVcLmNjJC8sCiAgICAgICAgL14od3d3XC4pP2tha2tvaWlzYWZlXC51cyQvLAogICAgICAgIC9eKHd3d1wuKT9wb2xyZWNcLnNpdGUkLywKICAgICAgICAvXnl1bWVjaGFuXC5jbHViJC8sCiAgICAgICAgL15jZWtsaW5rdVwueHl6JC8sCiAgICAgICAgL15saW5kdW5nXC4oaW58bWUpJC8sCiAgICAgICAgL14od3d3XC4pP2JvbGFva2VcLmNsdWIkLywKICAgICAgXSwKICAgICAgcXVlcnk6IC9eXD9yPShbYS16QS1aMC05Lz1dKykkLywKICAgIH0sCiAgICB7CiAgICAgIGhvc3Q6IC9ed3d3XC5jb21wYXJ0aWVuZG9mdWxsXC5uZXQkLywKICAgICAgcGF0aDogL15cL2dvMi8sCiAgICAgIHF1ZXJ5OiAvXlw/cD0oW2EtekEtWjAtOS89XSspJC8sCiAgICB9LAogICAgewogICAgICBob3N0OiAvXmFuaW1lZm9yY2VcLnN0cmVhbSQvLAogICAgICBxdWVyeTogL15cP2w9KFthLXpBLVowLTkvPV0rKSQvLAogICAgfSwKICAgIHsKICAgICAgaG9zdDogL14od3d3XC4pP2R1a3VuLWNpdFwuY29tJC8sCiAgICAgIHF1ZXJ5OiAvXlw/cz0oW2EtekEtWjAtOS89XSspJC8sCiAgICB9LAogICAgewogICAgICBob3N0OiAvXnVsdGltYXRlXC50dXJrZG93blwuY29tJC8sCiAgICAgIHF1ZXJ5OiAvXlw/c3RlcG9uZT0oW2EtekEtWjAtOS89XSspJC8sCiAgICB9LAogICAgewogICAgICBob3N0OiAvXmxlZWNocHJlbWl1bVwubGluayQvLAogICAgICBwYXRoOiAvXlwvY2hlYXRcLy8sCiAgICAgIHF1ZXJ5OiAvXlw/bGluaz0oW2EtekEtWjAtOS89XSspJC8sCiAgICB9LAogICAgewogICAgICBob3N0OiAvXmNsb3NldG9waWNcLnNpdGUkLywKICAgICAgcXVlcnk6IC9eXD9nbz0oW2EtekEtWjAtOS89XSspJC8sCiAgICB9LAogICAgewogICAgICBob3N0OiAvXmluZm9zaWFcLnh5eiQvLAogICAgICBxdWVyeTogL15cP2tlc2VoYXRhbj0oW2EtekEtWjAtOS89JV0rKSQvLAogICAgfSwKICAgIHsKICAgICAgaG9zdDogL15yZW1peXVcLm1lJC8sCiAgICAgIHF1ZXJ5OiAvXlw/cmVmZj0oW2EtekEtWjAtOS89XSspJC8sCiAgICB9LAogIF0sCiAgYXN5bmMgc3RhcnQgKG0pIHsKICAgIGNvbnN0IHJhd0xpbmsgPSBhdG9iKGRlY29kZVVSSUNvbXBvbmVudChtLnF1ZXJ5WzFdKSk7CiAgICBhd2FpdCBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0ub3BlbkxpbmsocmF3TGluayk7CiAgfSwKfSk7Cl9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIl8iXS5yZWdpc3Rlcih7CiAgcnVsZTogWwogICAgewogICAgICBob3N0OiBbCiAgICAgICAgLyhefFwuKXNhZmVsaW5rKGNvbnZlcnRlcnxyZXZpZXd4PylcLmNvbT8kLywKICAgICAgICAvXmdpZ2E3NFwuY29tJC8sCiAgICAgICAgL14oYXdzdWJzY298YWQ0bXNhbilcLm1sJC8sCiAgICAgICAgL15uZWtvcG9pXC5nYSQvLAogICAgICBdLAogICAgICBxdWVyeTogL2lkPShbXHdcXF0rPSopLywKICAgIH0sCiAgICB7CiAgICAgIGhvc3Q6IFsKICAgICAgICAvXihuYWlzaG98ZmlsbWt1fGhlbnBvaSlcLmxvbXBhdFwuaW4kLywKICAgICAgICAvXmVkb2dhd2FcLmxvblwucHckLywKICAgICAgICAvXnRlbG9sZXRcLmluJC8sCiAgICAgIF0sCiAgICAgIHF1ZXJ5OiAvZ289KFtcd1xcXSs9KikvLAogICAgfSwKICBdLAogIGFzeW5jIHN0YXJ0IChtKSB7CiAgICBsZXQgbCA9IGF0b2IobS5xdWVyeVsxXSk7CiAgICBjb25zdCB0YWJsZSA9IHsKICAgICAgJyEnOiAnYScsCiAgICAgICcpJzogJ2UnLAogICAgICAnXyc6ICdpJywKICAgICAgJygnOiAnbycsCiAgICAgICcqJzogJ3UnLAogICAgfTsKICAgIGwgPSBsLnJlcGxhY2UoL1shKV8oKl0vZywgZnVuY3Rpb24gKG0pIHsKICAgICAgcmV0dXJuIHRhYmxlW21dOwogICAgfSk7CiAgICBhd2FpdCBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0ub3BlbkxpbmsobCk7CiAgfSwKfSk7Cl9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIl8iXS5yZWdpc3Rlcih7CiAgcnVsZTogewogICAgaG9zdDogL14od3d3XC4pP3NhZmVsaW5rcmV2aWV3XC5jb20kLywKICAgIHBhdGg6IC9eXC9cdytcL2Nvc3RcLyhbXHcuXSspXC8/JC8sCiAgfSwKICBhc3luYyBzdGFydCAobSkgewogICAgY29uc3QgbCA9ICdodHRwOi8vJyArIG0ucGF0aFsxXTsKICAgIGF3YWl0IF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXS5vcGVuTGluayhsKTsKICB9LAp9KTsKX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siXyJdLnJlZ2lzdGVyKHsKICBydWxlOiB7CiAgICBob3N0OiBbCiAgICAgIC9eKGdhbWVpbmZvfGFwYXNpaHxhdXRvcmlkZSlcLnB3JC8sCiAgICAgIC9eKHd3d1wuKT9saWZlc3VyYW5jZVwuaW5mbyQvLAogICAgICAvXnNwZWVkY2FyXC5jbHViJC8sCiAgICAgIC9eKHd3d1wuKT9ib2xhb2tlXC5jbHViJC8sCiAgICAgIC9eKGludGVyY2VsZXN0aWFsfHN3ZWV0bGFudGVybnxkYXZpbnN1cmFuY2V8dGVjaG5sYWIpXC5jb20kLywKICAgICAgL15hd2NhclwuaWN1JC8sCiAgICAgIC9ec2t5aW5zdXJhbmNlXC5tbCQvLAogICAgICAvXihnZXRpbmZvc3xzZWhhdHNlZ2FyfGxvbmVseW1vb24pXC5uZXQkLywKICAgICAgL15zdHRcLmF3c3Vic1wuY28kLywKICAgICAgL14od2lidWluZG98bmF0dXJhbGhlYWx0aHkpXC54eXokLywKICAgICAgL153YWlmdXNhZmVcLm9vbyQvLAogICAgXSwKICAgIHF1ZXJ5OiAvXlw/KGlkfGN8ayk9KFthLXpBLVowLTkvPV0rKSQvLAogIH0sCiAgYXN5bmMgcmVhZHkgKCkgewogICAgY29uc3QgZiA9IE9iamVjdChfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0pKCdmb3JtJyk7CiAgICBmLnN1Ym1pdCgpOwogIH0sCn0pOwpfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyJfIl0ucmVnaXN0ZXIoewogIHJ1bGU6IHsKICAgIGhvc3Q6IFsKICAgICAgL14obGlua2FjaHxhdXRvbGlua2FjaClcLmNvbSQvLAogICAgXSwKICAgIHF1ZXJ5OiAvXlw/aWQ9KFthLXpBLVowLTkvPV0rKSQvLAogIH0sCiAgYXN5bmMgcmVhZHkgKCkgewogICAgY29uc3QgZyA9IE9iamVjdChfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0pKCcuaHVtYW5jaGVjayBmb3JtJyk7CiAgICBnLnN1Ym1pdCgpOwogIH0sCn0pOwpfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyJfIl0ucmVnaXN0ZXIoewogIHJ1bGU6IFsKICAgIHsKICAgICAgaG9zdDogWwogICAgICAgIC9ebW90b25ld3NcLmNsdWIkLywKICAgICAgICAvXih3d3dcLik/Ym9sYW9rZVwuY2x1YiQvLAogICAgICAgIC9eKGFuaS1zaGFyZXxhdXRvbGlua2FjaClcLmNvbSQvLAogICAgICAgIC9eKGF1dG9mYW5zfGxhbmRzY2FwZW5hdHVyZSlcLnB3JC8sCiAgICAgICAgL14od3d3XC4pP2xpZmVzdXJhbmNlXC5pbmZvJC8sCiAgICAgIF0sCiAgICAgIHF1ZXJ5OiAvZ2V0PShbXiZdKykvLAogICAgfSwKICAgIHsKICAgICAgaG9zdDogWwogICAgICAgIC9eKGdhbWVpbmZvKVwucHckLywKICAgICAgICAvXih3d3dcLik/bGlmZXN1cmFuY2VcLmluZm8kLywKICAgICAgICAvXnNwZWVkY2FyXC5jbHViJC8sCiAgICAgICAgL14od3d3XC4pP2JvbGFva2VcLmNsdWIkLywKICAgICAgICAvXihhdXRvbGlua2FjaHxkYXZpbnN1cmFuY2UpXC5jb20kLywKICAgICAgICAvXmF3Y2FyXC5pY3UkLywKICAgICAgICAvXnNreWluc3VyYW5jZVwubWwkLywKICAgICAgICAvXihnZXRpbmZvcylcLm5ldCQvLAogICAgICAgIC9ec3R0XC5hd3N1YnNcLmNvJC8sCiAgICAgICAgL153aWJ1aW5kb1wueHl6JC8sCiAgICAgIF0sCiAgICB9LAogIF0sCiAgYXN5bmMgcmVhZHkgKG0pIHsKICAgIGxldCBzID0gX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdLnNlYXJjaEZyb21TY3JpcHRzKC8oY29uc3R8dmFyKSBhPScoW14nXSspJy8pOwogICAgaWYgKHMpIHsKICAgICAgYXdhaXQgX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdLm9wZW5MaW5rKHNbMl0pOwogICAgICByZXR1cm47CiAgICB9CiAgICBzID0gYXRvYihtLnF1ZXJ5WzFdKTsKICAgIGF3YWl0IF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXS5vcGVuTGluayhzKTsKICB9LAp9KTsKX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siXyJdLnJlZ2lzdGVyKHsKICBydWxlOiB7CiAgICBob3N0OiBbCiAgICAgIC9ed2FpZnVzYWZlXC5vb28kLywKICAgICAgL15uYXR1cmFsaGVhbHRoeVwueHl6JC8sCiAgICBdLAogIH0sCiAgYXN5bmMgcmVhZHkgKCkgewogICAgYXdhaXQgX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siXyJdLndhaXQoMTAwMCk7CiAgICBjb25zdCBsbiA9IE9iamVjdChfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0pKCcjbGFuZGluZy5ydXJhc2FmZWN0cmwgLnRvIGEnKTsKICAgIGxuLmNsaWNrKCk7CiAgICBhd2FpdCBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyJfIl0ud2FpdCgxMDAwKTsKICAgIGNvbnN0IHRsID0gT2JqZWN0KF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXSkoJy5ydXJhc2FmZWN0cmwgaW1nI3Nob3dsaW5rLnNwb2ludCcpOwogICAgdGwuY2xpY2soKTsKICB9LAp9KTsKX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siXyJdLnJlZ2lzdGVyKHsKICBydWxlOiB7CiAgICBob3N0OiBbCiAgICAgIC9eKHNlaGF0c2VnYXJ8bG9uZWx5bW9vbilcLm5ldCQvLAogICAgICAvXihpbnRlcmNlbGVzdGlhbHxzd2VldGxhbnRlcm4pXC5jb20kLywKICAgIF0sCiAgfSwKICBhc3luYyByZWFkeSAoKSB7CiAgICBhd2FpdCBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyJfIl0ud2FpdCgxMDAwKTsKICAgIGNvbnN0IGxuID0gT2JqZWN0KF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXSkoJyNsYW5kaW5nLnNvcmFjdHJsIC50byBhJyk7CiAgICBsbi5jbGljaygpOwogICAgYXdhaXQgX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siXyJdLndhaXQoMjAwMCk7IAogICAgY29uc3QgdGwgPSBPYmplY3QoX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdKSgnLnNvcmFjdHJsIGltZyNzaG93bGluay5zcG9pbnQnKTsKICAgIHRsLmNsaWNrKCk7CiAgfSwKfSk7Cl9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIl8iXS5yZWdpc3Rlcih7CiAgcnVsZTogewogICAgaG9zdDogWwogICAgICAvXihsaW5rYWNofHRlY2hubGFiKVwuY29tJC8sCiAgICAgIC9eKGFwYXNpaHxhdXRvcmlkZSlcLnB3JC8sCiAgICBdLAogIH0sCiAgYXN5bmMgcmVhZHkgKCkgewogICAgYXdhaXQgX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siXyJdLndhaXQoMTAwMCk7CiAgICBjb25zdCBsbiA9IE9iamVjdChfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0pKCcjbGFuZGluZy5zb3JhY3RybCAudG8gYScpOwogICAgbG4uY2xpY2soKTsKICAgIGF3YWl0IF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIl8iXS53YWl0KDUwMDApOyAKICAgIGNvbnN0IHRsID0gT2JqZWN0KF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXSkoJy5zb3JhY3RybCBpbWcjc2hvd2xpbmsuc3BvaW50Jyk7CiAgICB0bC5jbGljaygpOwogIH0sCn0pOwpfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyJfIl0ucmVnaXN0ZXIoewogIHJ1bGU6IHsKICAgIGhvc3Q6IC9ebGV3YXRcLmluJC8sCiAgfSwKICBhc3luYyByZWFkeSAoKSB7CiAgICBjb25zdCBsID0gT2JqZWN0KF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXSkoJyNsYW5qdXQgPiAjZ29lcyA+IGEnKTsKICAgIGF3YWl0IF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXS5vcGVuTGluayhsLmhyZWYpOwogIH0sCn0pOwpfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyJfIl0ucmVnaXN0ZXIoewogIHJ1bGU6IHsKICAgIGhvc3Q6IC9ec2FyZGVhdGhcLmNvbSQvLAogIH0sCiAgYXN5bmMgcmVhZHkgKCkgewogICAgY29uc3Qgc2QgPSBPYmplY3QoX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdKSgnLmRvd25sb2FkLWxpbmsgPiBhJyk7CiAgICBhd2FpdCBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0ub3Blbkxpbmsoc2QuaHJlZik7CiAgfSwKfSk7Cl9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIl8iXS5yZWdpc3Rlcih7CiAgcnVsZTogewogICAgaG9zdDogL15nb291XC5pbiQvLAogIH0sCiAgYXN5bmMgcmVhZHkgKCkgewogICAgY29uc3QgZyA9IE9iamVjdChfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0pKCcjZG93bmxvYWRfbGluayA+IGEnKTsKICAgIGF3YWl0IF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXS5vcGVuTGluayhnLmhyZWYpOwogIH0sCn0pOwpfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyJfIl0ucmVnaXN0ZXIoewogIHJ1bGU6IFsKICAgIHsKICAgICAgaG9zdDogL150b3V0LWRlYnJpZFwubmV0JC8sCiAgICAgIHBhdGg6IC9eXC9hcGlcLy8sCiAgICB9LAogICAgewogICAgICBob3N0OiAvXjE2M1wuMTcyXC44M1wuMTQ1JC8sCiAgICAgIHBhdGg6IC9eXC9kZWJcL2FwaVwvLywKICAgIH0sCiAgXSwKICBhc3luYyByZWFkeSAoKSB7CiAgICBjb25zdCB0ID0gT2JqZWN0KF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXSkoJy5kb3dubG9hZC1ib3ggPiBkaXYgPiBhJyk7CiAgICBhd2FpdCBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0ub3BlbkxpbmsodC5ocmVmKTsKICB9LAp9KTsKX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siXyJdLnJlZ2lzdGVyKHsKICBydWxlOiB7CiAgICBob3N0OiAvXmRyaXZlaHViXC5saW5rJC8sCiAgICBwYXRoOiAvXlwvZmlsZVwucGhwLywKICAgIHF1ZXJ5OiAvXlw/aWQ9KC4rKS8sCiAgfSwKICBhc3luYyByZWFkeSAoKSB7CiAgICBjb25zdCBkID0gT2JqZWN0KF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXSkoJy5pbmZvYm94ID4gY2VudGVyID4gYiA+IGEjcHJvY2VlZC5idG4uYnRuLWRhbmdlcicpOwogICAgYXdhaXQgX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdLm9wZW5MaW5rKGQuaHJlZik7CiAgfSwKfSk7Cl9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIl8iXS5yZWdpc3Rlcih7CiAgcnVsZTogewogICAgaG9zdDogL15rb21iYXRjaFwubG9uY2F0XC5wdyQvLAogIH0sCiAgYXN5bmMgcmVhZHkgKCkgewogICAgbGV0IHMgPSBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0uc2VhcmNoRnJvbVNjcmlwdHMoL1wub3BlblwoIihbXiJdKykiLC8pOwogICAgcyA9IHNbMV0ubWF0Y2goL2dvPShbXiZdKykvKTsKICAgIHMgPSBhdG9iKHNbMV0pOwogICAgYXdhaXQgX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdLm9wZW5MaW5rKHMpOwogIH0sCn0pOwpfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyJfIl0ucmVnaXN0ZXIoewogIHJ1bGU6IHsKICAgIGhvc3Q6IC9ec2tpcGxpbmtcLmlvJC8sCiAgICBwYXRoOiAvXlwvZ2V0XC9saW5rXC8vLAogIH0sCiAgYXN5bmMgcmVhZHkgKCkgewogICAgY29uc3QgcyA9IE9iamVjdChfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0pKCcucGFuZWwucGFuZWwtZGVmYXVsdC5wYW5lbC1ib2R5ID4gY2VudGVyID4gY2VudGVyID4gYScpOwogICAgYXdhaXQgX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdLm9wZW5MaW5rKHMuaHJlZik7CiAgfSwKfSk7Cl9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIl8iXS5yZWdpc3Rlcih7CiAgcnVsZTogewogICAgaG9zdDogWwogICAgICAvXih2MVwuKT9oZXhhZmlsZVwubmV0JC8sCiAgICAgIC9ec2tpcGxpbmtcLmlvJC8sCiAgICBdLAogICAgcGF0aDogL15cL1thLXpBLVowLTldKy8sCiAgfSwKICBhc3luYyByZWFkeSAoKSB7CiAgICBjb25zdCBoID0gX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdLnNlYXJjaEZyb21TY3JpcHRzKC89IihbXiJdKykiLGU9MCxmPWEvKTsKICAgIGF3YWl0IF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXS5vcGVuTGluayhoWzFdKTsKICB9LAp9KTsKX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siXyJdLnJlZ2lzdGVyKHsKICBydWxlOiB7CiAgICBob3N0OiAvXmRyaXZlZmlsZXNcLmJpZCQvLAogIH0sCiAgYXN5bmMgcmVhZHkgKCkgewogICAgY29uc3QgZCA9IF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXS5zZWFyY2hGcm9tU2NyaXB0cygvd2luZG93XC5vcGVuXCgnKFteJ10rKSdcKTsvKTsKICAgIGF3YWl0IF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXS5vcGVuTGluayhkWzFdKTsKICB9LAp9KTsKX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siXyJdLnJlZ2lzdGVyKHsKICBydWxlOiB7CiAgICBob3N0OiAvXmFuZHJvaWQtMVwuY29tJC8sCiAgfSwKICBhc3luYyByZWFkeSAoKSB7CiAgICBjb25zdCBhID0gX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdLnNlYXJjaEZyb21TY3JpcHRzKC9pZD1kb3dubG9hZD48XC9kaXY+PGEgaHJlZj0oW14+XSspPi8pOwogICAgYXdhaXQgX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdLm9wZW5MaW5rKGFbMV0pOwogIH0sCn0pOwpfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyJfIl0ucmVnaXN0ZXIoewogIHJ1bGU6IHsKICAgIGhvc3Q6IC9eYm9vc3RcLmluayQvLAogIH0sCiAgYXN5bmMgc3RhcnQgKCkgewogICAgY29uc3QgYiA9IE9iamVjdChfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0pKCdib2R5JykuZ2V0QXR0cmlidXRlKCdyZXN1bHQnKTsKICAgIGlmIChiKSB7CiAgICAgIGF3YWl0IF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXS5vcGVuTGluayhhdG9iKGIpKTsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybjsKICAgIH0KICB9LAp9KTsKX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siXyJdLnJlZ2lzdGVyKHsKICBydWxlOiB7CiAgICBob3N0OiAvXmRvd25sb2FkLW1pcnJvclwuZ2EkLywKICB9LAogIGFzeW5jIHJlYWR5ICgpIHsKICAgIGNvbnN0IGRtID0gX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdLnNlYXJjaEZyb21TY3JpcHRzKC9hIGhyZWY9JyhbXiddKyknLyk7CiAgICBhd2FpdCBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0ub3BlbkxpbmsoZG1bMV0pOwogIH0sCn0pOwpfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyJfIl0ucmVnaXN0ZXIoewogIHJ1bGU6IHsKICAgIGhvc3Q6IC9edXJsXC5odWxibG9nXC5jb20kLywKICAgIHBhdGg6IC9eXC9bYS16QS1aMC05XSsvLAogIH0sCiAgYXN5bmMgcmVhZHkgKCkgewogICAgY29uc3QgaCA9IF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXS5zZWFyY2hGcm9tU2NyaXB0cygvImhyZWY9JyhbXiddKyknLyk7CiAgICBhd2FpdCBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0ub3BlbkxpbmsoaFsxXSk7CiAgfSwKfSk7Cl9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIl8iXS5yZWdpc3Rlcih7CiAgcnVsZTogewogICAgaG9zdDogWwogICAgICAvXnd3WzIzXVwucGljbmljdHJhbnNcLmNvbSQvLAogICAgICAvXnNob3J0XC5hd3N1YnNcLihjb3xtZSkkLywKICAgIF0sCiAgfSwKICBhc3luYyByZWFkeSAoKSB7CiAgICBjb25zdCBhID0gT2JqZWN0KF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXSkoJ2Rpdi5raXJpID4gY2VudGVyID4gYScpOwogICAgYXdhaXQgX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdLm9wZW5MaW5rKGEuaHJlZik7CiAgfSwKfSk7Cl9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIl8iXS5yZWdpc3Rlcih7CiAgcnVsZTogewogICAgaG9zdDogWwogICAgICAvXih3d3dcLik/YW5qYXlcLmluZm8kLywKICAgICAgL14od3d3XC4pP3RldGV3XC5pbmZvJC8sCiAgICAgIC9ed3d3XC5uamlpclwuY29tJC8sCiAgICBdLAogIH0sCiAgYXN5bmMgcmVhZHkgKCkgewogICAgbGV0IGEgPSBPYmplY3QoX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdKSgnZGl2LmRvd25sb2FkLWxpbmsgPiBhJyk7CiAgICBhID0gYS5ocmVmLm1hdGNoKC9yPSguKikkLyk7CiAgICBhID0gYXRvYihhWzFdKTsKICAgIGF3YWl0IF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXS5vcGVuTGluayhhKTsKICB9LAp9KTsKX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siXyJdLnJlZ2lzdGVyKHsKICBydWxlOiB7CiAgICBob3N0OiBbCiAgICAgIC9ec3BhY2V0aWNhXC5jb20kLywKICAgICAgL15za2lubnljYXRcLm9yZyQvLAogICAgXSwKICAgIHBhdGg6IC9eXC9cdyskLywKICB9LAogIGFzeW5jIHJlYWR5ICgpIHsKICAgIGNvbnN0IGwgPSBPYmplY3QoX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdKSgnLmJ0bicpOwogICAgYXdhaXQgX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdLm9wZW5MaW5rKGwuaHJlZik7CiAgfSwKfSk7Cl9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIl8iXS5yZWdpc3Rlcih7CiAgcnVsZTogewogICAgaG9zdDogL15kYXVuc2hvcnRlXC50ZWtub2xvZ2lsaW5rXC5jb20kLywKICAgIHBhdGg6IC9eXC9saW5rc2hvcnRlbGlua1wvc2FmZWxpbmtcLnBocCQvLAogIH0sCiAgYXN5bmMgcmVhZHkgKCkgewogICAgY29uc3QgbCA9IE9iamVjdChfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0pKCdkaXYuYXJ0aWNsZSA+IGRpdjpudGgtY2hpbGQoMSkgPiBjZW50ZXIgPiBhJyk7CiAgICBhd2FpdCBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0ub3BlbkxpbmsobC5ocmVmLCB7CiAgICAgIHJlZmVyZXI6IGZhbHNlLAogICAgfSk7CiAgfSwKfSk7Cl9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIl8iXS5yZWdpc3Rlcih7CiAgcnVsZTogewogICAgaG9zdDogL150ZWtub3NhZmVcLnRla25vbG9naWxpbmtcLmNvbSQvLAogICAgcGF0aDogL15cL2xpbmt0ZWtub2xpbmtcL3NhZmVsaW5rc2NyaXB0XC5waHAkLywKICB9LAogIGFzeW5jIHJlYWR5ICgpIHsKICAgIGNvbnN0IGwgPSBPYmplY3QoX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdKSgnI3RlbXBsYXRlbW9fY29udGVudCA+IGRpdiA+IGEnKTsKICAgIGF3YWl0IF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXS5vcGVuTGluayhsLmhyZWYsIHsKICAgICAgcmVmZXJlcjogZmFsc2UsCiAgICB9KTsKICB9LAp9KTsKX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siXyJdLnJlZ2lzdGVyKHsKICBydWxlOiB7CiAgICBob3N0OiAvXnphcFwuaW4kLywKICB9LAogIGFzeW5jIHJlYWR5ICgpIHsKICAgIGNvbnN0IHogPSBPYmplY3QoX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdKSgnLnBhbmVsLWJvZHkgYnV0dG9uJyk7CiAgICB6LmNsaWNrKCk7CiAgfSwKfSk7Cl9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIl8iXS5yZWdpc3Rlcih7CiAgcnVsZTogewogICAgaG9zdDogWwogICAgICAvXihzYXRhbmlhYmF0Y2h8Z2V0LWNsaWNrMilcLmJsb2dzcG90XC5jb20kLywKICAgICAgL14od3d3XC4pP3ZlaGljbGUtdGVjaG5vXC5jZiQvLAogICAgICAvXih3d3dcLik/dGV0ZXdsaW5rXC5tZSQvLAogICAgXSwKICB9LAogIGFzeW5jIHJlYWR5ICgpIHsKICAgIGNvbnN0IGNsYnQgPSBPYmplY3QoX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdKSgnYnV0dG9uI2dvdG9saW5rJyk7CiAgICBjbGJ0LnJlbW92ZUF0dHJpYnV0ZSgnZGlzYWJsZWQnKTsKICAgIGF3YWl0IF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIl8iXS53YWl0KDEpOwogICAgY2xidC5jbGljaygpOwogIH0sCn0pOwpfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyJfIl0ucmVnaXN0ZXIoewogIHJ1bGU6IHsKICAgIGhvc3Q6IC9eaWRuYXRpb25cLm5ldCQvLAogICAgcXVlcnk6IC9eXD9wYWdlPS8sCiAgfSwKICBhc3luYyByZWFkeSAoKSB7CiAgICBjb25zdCBsID0gT2JqZWN0KF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXSkoJyNsaW5rbycpOwogICAgYXdhaXQgX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdLm9wZW5MaW5rKGwuaHJlZik7CiAgfSwKfSk7Cl9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIl8iXS5yZWdpc3Rlcih7CiAgcnVsZTogewogICAgaG9zdDogL150ZWNoZnVuZGFcLm5ldCQvLAogICAgcGF0aDogWwogICAgICAvXlwvbGlua1wvLywKICAgICAgL15cL3NhZmVcLy8sCiAgICBdLAogIH0sCiAgYXN5bmMgcmVhZHkgKCkgewogICAgY29uc3QgYSA9IE9iamVjdChfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0pKCcuaGlkZSBhLmJ0bicpOwogICAgYXdhaXQgX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdLm9wZW5MaW5rKGEuaHJlZik7CiAgfSwKfSk7Cl9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIl8iXS5yZWdpc3Rlcih7CiAgcnVsZTogewogICAgaG9zdDogL150aGluZmlcLmNvbSQvLAogIH0sCiAgYXN5bmMgcmVhZHkgKCkgewogICAgY29uc3QgYSA9IE9iamVjdChfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0pKCdkaXYgcCBhJyk7CiAgICBhd2FpdCBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0ub3BlbkxpbmsoYS5ocmVmKTsKICB9LAp9KTsKX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siXyJdLnJlZ2lzdGVyKHsKICBydWxlOiB7CiAgICBob3N0OiAvXmhlbGxvXC50cmlidW50ZWtub1wuY29tJC8sCiAgfSwKICBhc3luYyByZWFkeSAoKSB7CiAgICBjb25zdCBhID0gT2JqZWN0KF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXSkoJ2RpdiBwIHUgYiBhJyk7CiAgICBhd2FpdCBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0ub3BlbkxpbmsoYS5ocmVmKTsKICB9LAp9KTsKX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siXyJdLnJlZ2lzdGVyKHsKICBydWxlOiBbCiAgICB7CiAgICAgIGhvc3Q6IC9edGlueWFycm93c1wuY29tJC8sCiAgICAgIHBhdGg6IC9eXC9wcmV2aWV3XC5waHAkLywKICAgICAgcXVlcnk6IC9eXD9wYWdlPShbXiZdKykvLAogICAgfSwKICAgIHsKICAgICAgaG9zdDogL153d3dcLmphdmxpYnJhcnlcLmNvbSQvLAogICAgICBxdWVyeTogL3VybD0oW14mXSspLywKICAgIH0sCiAgXSwKICBhc3luYyBzdGFydCAobSkgewogICAgYXdhaXQgX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdLm9wZW5MaW5rKGRlY29kZVVSSUNvbXBvbmVudChtLnF1ZXJ5WzFdKSk7CiAgfSwKfSk7Cl9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIl8iXS5yZWdpc3Rlcih7CiAgcnVsZTogewogICAgaG9zdDogL150aW55dXJsXC5pcyQvLAogIH0sCiAgYXN5bmMgcmVhZHkgKCkgewogICAgX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdLndpbmRvdy5jb3VudD0wOwogICAgY29uc3QgbGluayA9IGF3YWl0IF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIl8iXS50cnlFdmVyeSgyMDAsICgpID0+IHsKICAgICAgY29uc3QgbGluayA9IE9iamVjdChfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0pKCdhW2lkXj1za2lwLWJ0bl0nKS5ocmVmOwogICAgICBpZiAobGluay5pbmNsdWRlcygndGlueXVybC5pcycpKSB7CiAgICAgICAgcmV0dXJuIF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIl8iXS5ub25lOwogICAgICB9IGVsc2UgewogICAgICAgIHJldHVybiBsaW5rOwogICAgICB9CiAgICB9KTsKICAgIGF3YWl0IF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXS5vcGVuTGluayhsaW5rKTsKICB9LAp9KTsKX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siXyJdLnJlZ2lzdGVyKHsKICBydWxlOiB7CiAgICBob3N0OiAvXih3d3dcLik/dG90YWxkZWJyaWRcLm9yZyQvLAogICAgcGF0aDovXC9sXC8obFwucGhwKT8kLywKICAgIHF1ZXJ5OiAvXD9hZHM9KFthLXpBLVowLTk9XSspJC8sCiAgfSwKICBhc3luYyBzdGFydCAobSkgewogICAgY29uc3QgbCA9IGF0b2IobS5xdWVyeVsxXSk7CiAgICBhd2FpdCBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0ub3BlbkxpbmsobCk7CiAgfSwKfSk7Cl9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIl8iXS5yZWdpc3Rlcih7CiAgcnVsZTogewogICAgaG9zdDogL150dXJrZG93blwuY29tJC8sCiAgICBwYXRoOiAvXlwvbGluay8sCiAgICBxdWVyeTogL15cP2lkPSguKykvLAogIH0sCiAgYXN5bmMgcmVhZHkgKG0pIHsKICAgIGxldCBodG1sID0gYXdhaXQgX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdLmdldChgP2FqYXg9JHttLnF1ZXJ5WzFdfWApOwogICAgaHRtbCA9IEpTT04ucGFyc2UoaHRtbCk7CiAgICBjb25zdCByZXMgPSAvc3RlcG9uZT0oLispLy5leGVjKGh0bWwudXJsKTsKICAgIGF3YWl0IF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXS5vcGVuTGluayhhdG9iKHJlc1sxXSkpOwogIH0sCn0pOwpfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyJfIl0ucmVnaXN0ZXIoewogIHJ1bGU6IHsKICAgIGhvc3Q6IC9edVwudG8kLywKICAgIHBhdGg6IC9eXC9bXHctXSsvLAogIH0sCiAgYXN5bmMgcmVhZHkgKCkgewogICAgY29uc3QgdSA9IF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXS5zZWFyY2hGcm9tU2NyaXB0cygvd2luZG93LmxvY2F0aW9uPScoW14nXSspJzsvKTsKICAgIGF3YWl0IF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXS5vcGVuTGluayh1WzFdKTsKICB9LAp9KTsKX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siXyJdLnJlZ2lzdGVyKHsKICBydWxlOiB7CiAgICBob3N0OiAvXnVuZmFrZVwuaXQkLywKICB9LAogIGFzeW5jIHJlYWR5ICgpIHsKICAgIGNvbnN0IGZyYW1lID0gT2JqZWN0KF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXSkoJ2ZyYW1lJyk7CiAgICBjb25zdCBpID0gZnJhbWUuc3JjLmxhc3RJbmRleE9mKCdodHRwOi8vJyk7CiAgICBhd2FpdCBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0ub3BlbkxpbmsoZnJhbWUuc3JjLnN1YnN0cihpKSk7CiAgfSwKfSk7Cl9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIl8iXS5yZWdpc3Rlcih7CiAgcnVsZTogewogICAgaG9zdDogWwogICAgICAvXnVyXC5seSQvLAogICAgICAvXnVybHlcLm1vYmkkLywKICAgIF0sCiAgICBwYXRoOiAvXlwveCguKykvLAogIH0sCiAgYXN5bmMgcmVhZHkgKCkgewogICAgY29uc3QgcGF0aCA9IHdpbmRvdy5sb2NhdGlvbi5ocmVmLnJlcGxhY2UoJy94JywgJy9nb2lpLycpOwogICAgYXdhaXQgX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdLm9wZW5MaW5rKHBhdGgpOwogIH0KfSk7Cl9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIl8iXS5yZWdpc3Rlcih7CiAgcnVsZTogewogICAgaG9zdDogL151cmxcLmZtJC8sCiAgfSwKICBhc3luYyByZWFkeSAoKSB7CiAgICBjb25zdCBhID0gT2JqZWN0KF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXSkoJyNjbGlja2J0biBhJyk7CiAgICBhd2FpdCBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0ub3BlbkxpbmsoYS5ocmVmKTsKICB9LAp9KTsKX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siXyJdLnJlZ2lzdGVyKHsKICBydWxlOiB7CiAgICBob3N0OiAvXnVybFwuaWUkLywKICB9LAogIGFzeW5jIHJlYWR5ICgpIHsKICAgIGNvbnN0IGEgPSBPYmplY3QoX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdKSgnYVt0aXRsZT0iTGluayB0byBvcmlnaW5hbCBVUkwiXScpOwogICAgYXdhaXQgX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdLm9wZW5MaW5rKGEuaHJlZik7CiAgfSwKfSk7Cl9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIl8iXS5yZWdpc3Rlcih7CiAgcnVsZTogewogICAgaG9zdDogWwogICAgICAvKF58XC4pdXJsY2FzaFwuKGNvbXxuZXR8b3JnKSQvLAogICAgICAvXihiYXQ1fGRldG9uYXRpbmd8Y2VsZWJjbGt8ZWlnaHR0ZWVufHNtaWxpbmdsaW5rc3xwZWVrYXRteWdpcmxmcmllbmR8cG9ybnlob3N0fGNsYjF8dXJsZ2FsbGVyaWVzKVwuY29tJC8sCiAgICAgIC9ebG9vYmxlXC5uZXQkLywKICAgICAgL154eHhzXC5vcmckLywKICAgIF0sCiAgfSwKICBhc3luYyByZWFkeSAoKSB7CiAgICBpZiAoX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdLndpbmRvdyAmJiBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0ud2luZG93LmxpbmtEZXN0VXJsKSB7CiAgICAgIGF3YWl0IF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXS5vcGVuTGluayhfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0ud2luZG93LmxpbmtEZXN0VXJsKTsKICAgICAgcmV0dXJuOwogICAgfQogICAgY29uc3QgbWF0Y2hlcyA9IGRvY3VtZW50LmJvZHkuaW5uZXJIVE1MLm1hdGNoKC9saW5rRGVzdFVybCA9ICcoLispJy8pOwogICAgaWYgKG1hdGNoZXMpIHsKICAgICAgYXdhaXQgX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdLm9wZW5MaW5rKG1hdGNoZXNbMV0pOwogICAgICByZXR1cm47CiAgICB9CiAgfSwKfSk7Cl9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIl8iXS5yZWdpc3Rlcih7CiAgcnVsZTogewogICAgaG9zdDogL151cmxpbm5cLmNvbSQvLAogIH0sCiAgYXN5bmMgcmVhZHkgKCkgewogICAgY29uc3QgbSA9IE9iamVjdChfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0pKCdNRVRBW0hUVFAtRVFVSVY9cmVmcmVzaF0nKS5nZXRBdHRyaWJ1dGUoJ0NPTlRFTlQnKS5tYXRjaCgvdXJsPScoW14nXSspJy8pOwogICAgaWYgKG0pIHsKICAgICAgYXdhaXQgX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdLm9wZW5MaW5rKG1bMV0pOwogICAgfQogIH0sCn0pOwpfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyJfIl0ucmVnaXN0ZXIoewogIHJ1bGU6IHsKICAgIGhvc3Q6IC9edXJsbXNcLmNvbSQvLAogIH0sCiAgYXN5bmMgcmVhZHkgKCkgewogICAgY29uc3QgaWZyYW1lID0gT2JqZWN0KF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXSkoJyNjb250ZW50Jyk7CiAgICBhd2FpdCBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0ub3BlbkxpbmsoaWZyYW1lLnNyYyk7CiAgfSwKfSk7Cl9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIl8iXS5yZWdpc3Rlcih7CiAgcnVsZTogewogICAgaG9zdDogL14od3d3XC4pP3VybHYyXC5jb20kLywKICB9LAogIGFzeW5jIHJlYWR5ICgpIHsKICAgIGlmICh3aW5kb3cubG9jYXRpb24ucGF0aG5hbWUuaW5kZXhPZignbG9ja2VkJykgPj0gMCkgewogICAgICBjb25zdCBwYXRoID0gd2luZG93LmxvY2F0aW9uLnBhdGhuYW1lLnJlcGxhY2UoJy9sb2NrZWQnLCAnJyk7CiAgICAgIGF3YWl0IF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXS5vcGVuTGluayhwYXRoKTsKICAgICAgcmV0dXJuOwogICAgfQogICAgY29uc3QgbSA9IF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXS5zZWFyY2hGcm9tU2NyaXB0cygvamV0b249KFtcd10rKS8pOwogICAgY29uc3QgbCA9ICdodHRwOi8vdXJsdjIuY29tL2FsZ28ucGhwP2FjdGlvbj1wYXNzZXImcHg9MCZzbz0xJmpldG9uPScgKyBtWzFdOwogICAgYXdhaXQgX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siXyJdLndhaXQoNSAqIDEwMDApOwogICAgYXdhaXQgX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdLm9wZW5MaW5rKGwpOwogIH0sCn0pOwpfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyJfIl0ucmVnaXN0ZXIoewogIHJ1bGU6IHsKICAgIGhvc3Q6IC9eKHd3d1wuKT91c2tpcFwubWUkLywKICAgIHBhdGg6IC9eXC9nb1wvXHcrJC8sCiAgfSwKICBhc3luYyByZWFkeSAoKSB7CiAgICBjb25zdCBhID0gT2JqZWN0KF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXSkoJyNidG4tbWFpbicpOwogICAgYXdhaXQgX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdLm9wZW5MaW5rKGEuaHJlZik7CiAgfSwKfSk7Cl9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIl8iXS5yZWdpc3Rlcih7CiAgcnVsZTogewogICAgaG9zdDogL151eDlcLmRlJC8sCiAgfSwKICBhc3luYyByZWFkeSAoKSB7CiAgICBjb25zdCBtZXRhID0gT2JqZWN0KF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXSkoJ21ldGFbaHR0cC1lcXVpdj0icmVmcmVzaCJdW2NvbnRlbnQqPSJ1cmw9Il0nKTsKICAgIGNvbnN0IHVybCA9IG1ldGEuZ2V0QXR0cmlidXRlKCdjb250ZW50JykubWF0Y2goL2h0dHAuKi8pWzBdOwogICAgYXdhaXQgX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdLm9wZW5MaW5rKHVybCk7CiAgfSwKfSk7Cl9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIl8iXS5yZWdpc3Rlcih7CiAgcnVsZTogewogICAgaG9zdDogL152YXZpXC5jbyQvLAogIH0sCiAgYXN5bmMgcmVhZHkgKCkgewogICAgY29uc3QgbCA9IE9iamVjdChfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0pKCcjZ29MaW5rJyk7CiAgICBhd2FpdCBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0ub3BlbkxpbmsobC5ocmVmKTsKICB9LAp9KTsKX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siXyJdLnJlZ2lzdGVyKHsKICBydWxlOiB7CiAgICBob3N0OiAvXnZjcnlwdFwubmV0JC8sCiAgICBwYXRoOiAvXlwvZmFzdHNoaWVsZFwvLywKICB9LAogIGFzeW5jIHJlYWR5ICgpIHsKICAgIGNvbnN0IHYgPSBPYmplY3QoX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdKSgnZm9ybSBpbnB1dC5idG5jb250aW51ZScpOwogICAgdi5jbGljaygpOwogIH0sCn0pOwpfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyJfIl0ucmVnaXN0ZXIoewogIHJ1bGU6IHsKICAgIGhvc3Q6IC9ed3d3XC52aWlkaWlcLmluZm8kLywKICAgIHF1ZXJ5OiAvdXJsPShbXiZdKykvLAogIH0sCiAgYXN5bmMgc3RhcnQgKG0pIHsKICAgIGNvbnN0IHVybCA9IGRlY29kZVVSSUNvbXBvbmVudChtLnF1ZXJ5WzFdKTsKICAgIGF3YWl0IF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXS5vcGVuTGluayh1cmwpOwogIH0sCn0pOwpfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyJfIl0ucmVnaXN0ZXIoewogIHJ1bGU6IHsKICAgIGhvc3Q6IC9ed3d3XC52aWlkaWlcLmluZm8kLywKICB9LAogIGFzeW5jIHJlYWR5ICgpIHsKICAgIGNvbnN0IG8gPSBPYmplY3QoX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdKSgnLmJnbGluaycpOwogICAgYXdhaXQgX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdLm9wZW5MaW5rKG8uaHJlZik7CiAgfSwKfSk7Cl9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIl8iXS5yZWdpc3Rlcih7CiAgcnVsZTogewogICAgaG9zdDogL14od3d3XC4pP3ZpclwuYWwkLywKICB9LAogIGFzeW5jIHJlYWR5ICgpIHsKICAgIGNvbnN0IG0gPSBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0uc2VhcmNoRnJvbVNjcmlwdHMoL2NvbnN0IHRhcmdldF91cmwgPSAnKFteJ10rKSc7Lyk7CiAgICBpZiAoIW0pIHsKICAgICAgdGhyb3cgbmV3IF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIl8iXS5BZHNCeXBhc3NlckVycm9yKCdzaXRlIGNoYW5nZWQnKTsKICAgIH0KICAgIGF3YWl0IF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXS5vcGVuTGluayhtWzFdKTsKICB9LAp9KTsKX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siXyJdLnJlZ2lzdGVyKHsKICBydWxlOiB7CiAgICBob3N0OiAvXih3d3dcLik/dnp0dXJsXC5jb20kLywKICB9LAogIGFzeW5jIHJlYWR5ICgpIHsKICAgIGNvbnN0IGZyYW1lID0gT2JqZWN0KF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXSkoJ2ZyYW1lW3Njcm9sbGluZz15ZXNdJyk7CiAgICBhd2FpdCBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0ub3BlbkxpbmsoZnJhbWUuc3JjKTsKICB9LAp9KTsKX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siXyJdLnJlZ2lzdGVyKHsKICBydWxlOiB7CiAgICBob3N0OiAvXnN0XC53YXJkaGFuaW1lXC5uZXQkLywKICAgIHBhdGg6IC9eXC9pXC9cZCskLywKICB9LAogIGFzeW5jIHJlYWR5ICgpIHsKICAgIGNvbnN0IGEgPSBPYmplY3QoX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdKSgnI3dyYXBwZXIgPiBbY2xhc3NePSJ0b21ibyJdID4gYVt0YXJnZXQ9Il9ibGFuayJdJyk7CiAgICBhd2FpdCBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0ub3BlbkxpbmsoYS5ocmVmKTsKICB9LAp9KTsKX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siXyJdLnJlZ2lzdGVyKHsKICBydWxlOiB7CiAgICBob3N0OiAvXndpa2lhbGxcLm9yZyQvLAogIH0sCiAgYXN5bmMgcmVhZHkgKCkgewogICAgY29uc3QgZGl2ID0gT2JqZWN0KF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXSkoJ2RpdiNwbGFjZS5nZXQtYnRuJyk7CiAgICBjb25zdCBvID0gbmV3IE11dGF0aW9uT2JzZXJ2ZXIoKCkgPT4gewogICAgICBjb25zdCBhID0gX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdLiQoJ2RpdiNwbGFjZS5nZXQtYnRuID4gYVtocmVmXScpOwogICAgICBpZiAoYSAmJiBhLmhyZWYpIHsKICAgICAgICBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0ub3BlbkxpbmsoYS5ocmVmKTsKICAgICAgfQogICAgfSk7CiAgICBvLm9ic2VydmUoZGl2LCB7CiAgICAgIGNoaWxkTGlzdDogdHJ1ZQogICAgfSk7CiAgfSwKfSk7Cl9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIl8iXS5yZWdpc3Rlcih7CiAgcnVsZTogewogICAgaG9zdDogL153b25cLnBlJC8sCiAgfSwKICBhc3luYyByZWFkeSAoKSB7CiAgICBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0ucmVtb3ZlKCcucHJvZ3Jlc3MuY2FwdGNoYV9sb2FkZXIsIHNraXBib3gnKTsKICAgIGNvbnN0IGNhcHRjaGEgPSBPYmplY3QoX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdKSgnI3JlY2FwdGNoYScpOwogICAgY2FwdGNoYS5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJzsKICAgIGNvbnN0IHAgPSBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4gewogICAgICBjb25zdCBvYnNlcnZlciA9IG5ldyBNdXRhdGlvbk9ic2VydmVyKCgpID0+IHsKICAgICAgICBpZiAoY2FwdGNoYS5zdHlsZS5kaXNwbGF5ID09PSAnbm9uZScpIHsKICAgICAgICAgIG9ic2VydmVyLmRpc2Nvbm5lY3QoKTsKICAgICAgICAgIHJlc29sdmUoKTsKICAgICAgICB9CiAgICAgIH0pOwogICAgICBvYnNlcnZlci5vYnNlcnZlKGNhcHRjaGEsIHsKICAgICAgICBhdHRyaWJ1dGVzOiB0cnVlLAogICAgICB9KTsKICAgIH0pOwogICAgYXdhaXQgcDsKICAgIGF3YWl0IF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXS5vcGVuTGluayhfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0ud2luZG93LmxvbmdVUkwpOwogIH0sCn0pOwpfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyJfIl0ucmVnaXN0ZXIoewogIHJ1bGU6ICdodHRwOi8veWVwLml0L3ByZXZpZXcucGhwP3A9KicsCiAgYXN5bmMgcmVhZHkgKCkgewogICAgY29uc3QgbGluayA9IE9iamVjdChfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0pKCdmb250W2NvbG9yPSJncmV5Il0nKS5pbm5lckhUTUw7CiAgICBhd2FpdCBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0ub3BlbkxpbmsobGluayk7CiAgfSwKfSk7CigoKSA9PiB7CiAgX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siXyJdLnJlZ2lzdGVyKHsKICAgIHJ1bGU6ICdodHRwOi8vd3d3Lnlvb2NsaWNrLmNvbS9sLyonLAogICAgYXN5bmMgcmVhZHkgKCkgewogICAgICBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0ucmVtb3ZlKCdpZnJhbWUnKTsKICAgICAgY29uc3QgdW5pcSA9IF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXS53aW5kb3cudW5pcSB8fCBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0ud2luZG93LnVuaXFpOwogICAgICBpZiAoIXVuaXEpIHsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgICAgY29uc3QgcGF0aCA9IHdpbmRvdy5sb2NhdGlvbi5wYXRobmFtZTsKICAgICAgY29uc3QgdXJsID0gYCR7cGF0aH0/YWpheD10cnVlJmFkYmxvY2s9ZmFsc2Umb2xkPWZhbHNlJmZyYW1lZD1mYWxzZSZ1bmlxPSR7dW5pcX1gOwogICAgICBhd2FpdCBnZXRVUkwodXJsKTsKICAgIH0sCiAgfSk7CiAgYXN5bmMgZnVuY3Rpb24gZ2V0VVJMICh1cmwpIHsKICAgIGNvbnN0IHRleHQgPSBhd2FpdCBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0uZ2V0KHVybCk7CiAgICBjb25zdCBnb29kVVJMID0gL14oaHR0cHM/fGZ0cCk6XC9cLygoKChbYS16XXxcZHwtfFwufF98fnxbXHUwMEEwLVx1RDdGRlx1RjkwMC1cdUZEQ0ZcdUZERjAtXHVGRkVGXSl8KCVbXGRhLWZdezJ9KXxbISQmJygpKissOz1dfDopKkApPygoKFxkfFsxLTldXGR8MVxkXGR8MlswLTRdXGR8MjVbMC01XSlcLihcZHxbMS05XVxkfDFcZFxkfDJbMC00XVxkfDI1WzAtNV0pXC4oXGR8WzEtOV1cZHwxXGRcZHwyWzAtNF1cZHwyNVswLTVdKVwuKFxkfFsxLTldXGR8MVxkXGR8MlswLTRdXGR8MjVbMC01XSkpfCgoKFthLXpdfFxkfFtcdTAwQTAtXHVEN0ZGXHVGOTAwLVx1RkRDRlx1RkRGMC1cdUZGRUZdKXwoKFthLXpdfFxkfFtcdTAwQTAtXHVEN0ZGXHVGOTAwLVx1RkRDRlx1RkRGMC1cdUZGRUZdKShbYS16XXxcZHwtfFwufF98fnxbXHUwMEEwLVx1RDdGRlx1RjkwMC1cdUZEQ0ZcdUZERjAtXHVGRkVGXSkqKFthLXpdfFxkfFtcdTAwQTAtXHVEN0ZGXHVGOTAwLVx1RkRDRlx1RkRGMC1cdUZGRUZdKSkpXC4pKygoW2Etel18W1x1MDBBMC1cdUQ3RkZcdUY5MDAtXHVGRENGXHVGREYwLVx1RkZFRl0pfCgoW2Etel18W1x1MDBBMC1cdUQ3RkZcdUY5MDAtXHVGRENGXHVGREYwLVx1RkZFRl0pKFthLXpdfFxkfC18XC58X3x+fFtcdTAwQTAtXHVEN0ZGXHVGOTAwLVx1RkRDRlx1RkRGMC1cdUZGRUZdKSooW2Etel18W1x1MDBBMC1cdUQ3RkZcdUY5MDAtXHVGRENGXHVGREYwLVx1RkZFRl0pKSlcLj8pKDpcZCopPykoXC8oKChbYS16XXxcZHwtfFwufF98fnxbXHUwMEEwLVx1RDdGRlx1RjkwMC1cdUZEQ0ZcdUZERjAtXHVGRkVGXSl8KCVbXGRhLWZdezJ9KXxbISQmJygpKissOz1dfDp8QCkrKFwvKChbYS16XXxcZHwtfFwufF98fnxbXHUwMEEwLVx1RDdGRlx1RjkwMC1cdUZEQ0ZcdUZERjAtXHVGRkVGXSl8KCVbXGRhLWZdezJ9KXxbISQmJygpKissOz1dfDp8QCkqKSopPyk/KFw/KCgoW2Etel18XGR8LXxcLnxffH58W1x1MDBBMC1cdUQ3RkZcdUY5MDAtXHVGRENGXHVGREYwLVx1RkZFRl0pfCglW1xkYS1mXXsyfSl8WyEkJicoKSorLDs9XXw6fEApfFtcdUUwMDAtXHVGOEZGXXxcL3xcPykqKT8oIygoKFthLXpdfFxkfC18XC58X3x+fFtcdTAwQTAtXHVEN0ZGXHVGOTAwLVx1RkRDRlx1RkRGMC1cdUZGRUZdKXwoJVtcZGEtZl17Mn0pfFshJCYnKCkqKyw7PV18OnxAKXxcL3xcPykqKT8kL2kudGVzdCh0ZXh0KTsKICAgIGlmIChnb29kVVJMKSB7CiAgICAgIGF3YWl0IF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXS5vcGVuTGluayh0ZXh0KTsKICAgICAgcmV0dXJuOwogICAgfQogICAgYXdhaXQgX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siXyJdLndhaXQoNTAwKTsKICAgIGF3YWl0IGdldFVSTCh1cmwpOwogIH0KfSkoKTsKKGZ1bmN0aW9uICgpIHsKICBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyJfIl0ucmVnaXN0ZXIoewogICAgcnVsZTogewogICAgICBob3N0OiAvXih3d3dcLik/KFthLXpBLVowLTldK1wuKT9iaW5ib3hcLmlvJC8sCiAgICAgIHBhdGg6IC9cLyhbYS16QS1aMC05XSspLywKICAgICAgaGFzaDogLyg/OiMoW2EtekEtWjAtOV0rKSk/LywKICAgIH0sCiAgICBhc3luYyByZWFkeSAobSkgewogICAgICBjb25zdCBzamNsID0gX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdLndpbmRvdy5zamNsOwogICAgICBjb25zdCBwYXN0ZV9pZCA9IG0ucGF0aFsxXTsKICAgICAgY29uc3QgcGFzdGVfc2FsdCA9IG0uaGFzaFsxXTsKICAgICAgY29uc3QgQVBJX1VSTCA9IGBodHRwczovL2JpbmJveC5pby8ke3Bhc3RlX2lkfS5qc29uYDsKICAgICAgbGV0IHBhc3RlSW5mbyA9IGF3YWl0IF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXS5nZXQoQVBJX1VSTCwgZmFsc2UsIHsKICAgICAgICBPcmlnaW46IF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIl8iXS5ub25lLAogICAgICAgIFJlZmVyZXI6IF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIl8iXS5ub25lLAogICAgICAgIENvb2tpZTogJ3JlZmVycmVyPTEnLAogICAgICAgICdYLVJlcXVlc3RlZC1XaXRoJzogX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siXyJdLm5vbmUsCiAgICAgIH0pOwogICAgICBwYXN0ZUluZm8gPSBKU09OLnBhcnNlKHBhc3RlSW5mbyk7CiAgICAgIGlmICghcGFzdGVJbmZvLm9rKSB7CiAgICAgICAgdGhyb3cgbmV3IF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIl8iXS5BZHNCeXBhc3NlckVycm9yKCdlcnJvciB3aGVuIGdldHRpbmcgcGFzdGUgaW5mb3JtYXRpb24nKTsKICAgICAgfQogICAgICBpZiAocGFzdGVJbmZvLnBhc3RlLnVybCkgewogICAgICAgIGF3YWl0IF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXS5vcGVuTGluayhwYXN0ZUluZm8ucGFzdGUudXJsKTsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgICAgY29uc3QgcmF3X3Bhc3RlID0gc2pjbC5kZWNyeXB0KHBhc3RlX3NhbHQsIHBhc3RlSW5mby5wYXN0ZS50ZXh0KTsKICAgICAgaWYgKGlzTGluayhyYXdfcGFzdGUpKSB7CiAgICAgICAgYXdhaXQgX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdLm9wZW5MaW5rKHJhd19wYXN0ZSk7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIGNvbnN0IGVsbSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3ByZScpOwogICAgICBlbG0uaWQgPSAncGFzdGUtdGV4dCc7CiAgICAgIGVsbS5pbm5lckhUTUwgPSBsaW5raWZ5KHJhd19wYXN0ZSk7CiAgICAgIGNvbnN0IGZyYW1lID0gT2JqZWN0KF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXSkoJyNwYXN0ZS1mcmFtZSwgI2NhcHRjaGEtcGFnZScpOwogICAgICBmcmFtZS5wYXJlbnROb2RlLnJlcGxhY2VDaGlsZChlbG0sIGZyYW1lKTsKICAgIH0sCiAgfSk7CiAgY29uc3Qgc1VybCA9ICcoXFxiKGh0dHBzP3xmdHB8ZmlsZSk6Ly9bLUEtWjAtOSsmQCMvJT89fl98ITosLjtdKlstQS1aMC05KyZAIy8lPX5ffF0pJzsKICBmdW5jdGlvbiBpc0xpbmsgKHRleHQpIHsKICAgIGNvbnN0IHJVcmwgPSBuZXcgUmVnRXhwKGBeJHtzVXJsfSRgLCAnaScpOwogICAgcmV0dXJuIHJVcmwudGVzdCh0ZXh0KTsKICB9CiAgZnVuY3Rpb24gbGlua2lmeSAodGV4dCkgewogICAgY29uc3QgclVybCA9IG5ldyBSZWdFeHAoc1VybCwgJ2lnJyk7CiAgICByZXR1cm4gdGV4dC5yZXBsYWNlKHJVcmwsIChtYXRjaCkgPT4gewogICAgICByZXR1cm4gYDxhIGhyZWY9IiR7bWF0Y2h9Ij4ke21hdGNofTwvYT5gOwogICAgfSk7CiAgfQp9KSgpOwpfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyJfIl0ucmVnaXN0ZXIoewogIHJ1bGU6IHsKICAgIGhvc3Q6IC9eKHd3d1wuKT9wYXN0ZWRcLmNvJC8sCiAgICBwYXRoOiAvXlwvXHcrJC8sCiAgfSwKICBhc3luYyByZWFkeSAoKSB7CiAgICBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0ucmVtb3ZlKCcjY2FwdGNoYV9vdmVybGF5Jyk7CiAgfSwKfSk7Cl9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIl8iXS5yZWdpc3Rlcih7CiAgcnVsZTogewogICAgaG9zdDogL153d3dcLjJpXC4oc2t8Y3opJC8sCiAgfSwKICBhc3luYyByZWFkeSAoKSB7CiAgICBjb25zdCBpbWcgPSBPYmplY3QoX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdKSgnI3dyYXAzIGltZycpOwogICAgYXdhaXQgX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdLm9wZW5JbWFnZShpbWcuc3JjKTsKICB9LAp9KTsKX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siXyJdLnJlZ2lzdGVyKHsKICBydWxlOiBbCiAgICAnaHR0cDovLyouYWJsb2FkLmRlL2ltYWdlLnBocD9pbWc9KicsCiAgICAnaHR0cDovL3d3dy5pbWFnZXVwLnJ1LyovKi8qLmh0bWwnLAogIF0sCiAgYXN5bmMgcmVhZHkgKCkgewogICAgY29uc3QgaSA9IE9iamVjdChfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0pKCcjaW1hZ2UnKTsKICAgIGF3YWl0IF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXS5vcGVuSW1hZ2UoaS5zcmMpOwogIH0sCn0pOwpfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyJfIl0ucmVnaXN0ZXIoewogIHJ1bGU6IHsKICAgIGhvc3Q6IC9eYWxsLXBvc3RlclwucnUkLywKICAgIHF1ZXJ5OiAvXlw/dj0vLAogIH0sCiAgYXN5bmMgcmVhZHkgKCkgewogICAgY29uc3QgaSA9IE9iamVjdChfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0pKCcjaW1hZ2VuIGltZycpOwogICAgYXdhaXQgX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdLm9wZW5JbWFnZShpLnNyYyk7CiAgfSwKfSk7Cl9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIl8iXS5yZWdpc3Rlcih7CiAgcnVsZTogewogICAgaG9zdDogL15idW5ueWZvcnVtXC5vcmckLywKICAgIHF1ZXJ5OiAvXlw/dj0vLAogIH0sCiAgYXN5bmMgcmVhZHkgKCkgewogICAgY29uc3QgaSA9IE9iamVjdChfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0pKCdpbWdbdGl0bGVePUNsaWNrXScpOwogICAgYXdhaXQgX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdLm9wZW5JbWFnZShpLnNyYyk7CiAgfSwKfSk7Cl9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIl8iXS5yZWdpc3Rlcih7CiAgcnVsZTogewogICAgaG9zdDogL15iYXlpbWdcLmNvbSQvLAogIH0sCiAgYXN5bmMgcmVhZHkgKCkgewogICAgY29uc3QgaSA9IE9iamVjdChfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0pKCcjbWFpbkltYWdlJyk7CiAgICBhd2FpdCBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0ub3BlbkltYWdlKGkuc3JjKTsKICB9LAp9KTsKX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siXyJdLnJlZ2lzdGVyKHsKICBydWxlOiB7CiAgICBob3N0OiAvXmJlZWltZ1wuY29tJC8sCiAgICBwYXRoOiAvXC92aWV3XC8uKi8sCiAgfSwKICBhc3luYyByZWFkeSAoKSB7CiAgICBjb25zdCBpbWcgPSBPYmplY3QoX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdKSgnaW1nLmltZy1yZXNwb25zaXZlJyk7CiAgICBhd2FpdCBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0ub3BlbkltYWdlKGltZy5zcmMsIHsKICAgICAgcmVwbGFjZTogdHJ1ZSwKICAgIH0pOwogIH0sCn0pOwpfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyJfIl0ucmVnaXN0ZXIoewogIHJ1bGU6ICdodHRwOi8vd3d3LmJpbGRlci11cGxvYWQuZXUvc2hvdy5waHA/ZmlsZT0qJywKICBhc3luYyByZWFkeSAoKSB7CiAgICBjb25zdCBpID0gT2JqZWN0KF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXSkoJ2lucHV0W3R5cGU9aW1hZ2VdJyk7CiAgICBhd2FpdCBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0ub3BlbkltYWdlKGkuc3JjKTsKICB9LAp9KTsKX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siXyJdLnJlZ2lzdGVyKHsKICBydWxlOiAnaHR0cDovL3d3dy5jYXNpbWFnZXMuY29tL2ltZy5waHA/KicsCiAgYXN5bmMgcmVhZHkgKCkgewogICAgY29uc3QgaW1nID0gT2JqZWN0KF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXSkoJ3RkIGEgaW1nJyk7CiAgICBhd2FpdCBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0ub3BlbkltYWdlKGltZy5zcmMpOwogIH0sCn0pOwpfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyJfIl0ucmVnaXN0ZXIoewogIHJ1bGU6ICdodHRwOi8vY3ViZXVwbG9hZC5jb20vaW0vKicsCiAgYXN5bmMgcmVhZHkgKCkgewogICAgY29uc3QgaW1nID0gT2JqZWN0KF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXSkoJ2ltZy5nYWxsZXJ5QmlnSW1nJyk7CiAgICBhd2FpdCBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0ub3BlbkltYWdlKGltZy5zcmMpOwogIH0sCn0pOwpfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyJfIl0ucmVnaXN0ZXIoewogIHJ1bGU6IHsKICAgIGhvc3Q6IC9eZGVwaWNcLm1lJC8sCiAgfSwKICBhc3luYyByZWFkeSAoKSB7CiAgICBjb25zdCBpID0gT2JqZWN0KF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXSkoJyNwaWMnKTsKICAgIGF3YWl0IF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXS5vcGVuSW1hZ2UoaS5zcmMpOwogIH0sCn0pOwpfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyJfIl0ucmVnaXN0ZXIoewogIHJ1bGU6IHsKICAgIGhvc3Q6IC9eKGltZ2Rpbm98aW1ndGlnZXJ8aW1nemFwKVwuY29tJC8sCiAgICBwYXRoOiAvXlwvdmlld2VyXC5waHAkLywKICAgIHF1ZXJ5OiAvXlw/ZmlsZT0vLAogIH0sCiAgYXN5bmMgcmVhZHkgKCkgewogICAgY29uc3QgbyA9IE9iamVjdChfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0pKCcjY3Vyc29yX2x1cGEnKTsKICAgIGF3YWl0IF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXS5vcGVuSW1hZ2Uoby5zcmMpOwogIH0sCn0pOwpfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyJfIl0ucmVnaXN0ZXIoewogIHJ1bGU6ICdodHRwOi8vKi5kaXJlY3R1cGxvYWQubmV0L2ZpbGUvKi5odG0nLAogIGFzeW5jIHJlYWR5ICgpIHsKICAgIGNvbnN0IGkgPSBPYmplY3QoX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdKSgnI0ltZ0ZyYW1lJyk7CiAgICBhd2FpdCBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0ub3BlbkltYWdlKGkuc3JjKTsKICB9LAp9KTsKX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siXyJdLnJlZ2lzdGVyKHsKICBydWxlOiB7CiAgICBob3N0OiBbCiAgICAgIC9eZXdhXC5hYyQvLAogICAgICAvXmVsaWxcLmNjJC8sCiAgICBdLAogICAgcGF0aDogL15cLyguKikkLywKICB9LAogIGFzeW5jIHJlYWR5IChtKSB7CiAgICBhd2FpdCBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyJfIl0ud2FpdCg1MDAwKTsKICAgIGNvbnN0IHVybCA9IGF3YWl0IF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXS5wb3N0KCcvc2l0ZS9nZXQtbmV3LXJlZGlyZWN0LWxpbmsnLCB7CiAgICAgIGNvZGU6IG0ucGF0aFsxXSwKICAgICAgYWRzX2Jsb2NrZWQ6IGZhbHNlLAogICAgfSk7CiAgICBhd2FpdCBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0ub3BlbkltYWdlKHVybCk7CiAgfSwKfSk7Cl9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIl8iXS5yZWdpc3Rlcih7CiAgcnVsZTogewogICAgaG9zdDogL15pbWcodml2fGZzaHxicmR8a29yKVwueHl6JC8sCiAgICBwYXRoOiAvXlwvLiokLywKICB9LAogIGFzeW5jIHJlYWR5ICgpIHsKICAgIGNvbnN0IGQgPSBPYmplY3QoX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdKSgnLm1haW4tY29udGVudC1ib3gnKTsKICAgIGNvbnN0IHJ2ID0gX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdLnNlYXJjaEZyb21TY3JpcHRzKC9kb2N1bWVudFwubG9jYXRpb25cLmhyZWY9IihbXiJdKykiLywgZCk7CiAgICBhd2FpdCBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0ub3BlbkltYWdlKHJ2WzFdKTsKICB9LAp9KTsKX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siXyJdLnJlZ2lzdGVyKHsKICBydWxlOiB7CiAgICBob3N0OiAvXmZhc3RwaWNcLnJ1JC8sCiAgICBwYXRoOiAvXlwvdmlld1wvLywKICB9LAogIGFzeW5jIHJlYWR5ICgpIHsKICAgIGNvbnN0IGkgPSBPYmplY3QoX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdKSgnI3BpY0NvbnRhaW5lciBpbWcnKTsKICAgIGF3YWl0IF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXS5vcGVuSW1hZ2UoaS5zcmMsIHsKICAgICAgcmVmZXJlcjogdHJ1ZSwKICAgIH0pOwogIH0sCn0pOwpfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyJfIl0ucmVnaXN0ZXIoewogIHJ1bGU6IHsKICAgIGhvc3Q6IC9eZmFzdHBpY1wub3JnJC8sCiAgICBwYXRoOiAvXlwvdmlld1wvLywKICB9LAogIGFzeW5jIHJlYWR5ICgpIHsKICAgIGNvbnN0IGkgPSBPYmplY3QoX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdKSgnI3BpY0NvbnRhaW5lciBpbWcnKTsKICAgIGF3YWl0IF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXS5vcGVuSW1hZ2UoaS5zcmMpOwogIH0sCn0pOwpfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyJfIl0ucmVnaXN0ZXIoewogIHJ1bGU6IHsKICAgIGhvc3Q6IC9eZm9wa29kaWFrXC5zaXRlJC8sCiAgICBwYXRoOiAvXlwvaW1hZ2VcLy8sCiAgfSwKICBhc3luYyByZWFkeSAoKSB7CiAgICBjb25zdCBpbWcgPSBPYmplY3QoX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdKSgnaGVhZCA+IGxpbmtbcmVsPWltYWdlX3NyY10nKTsKICAgIGF3YWl0IF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXS5vcGVuSW1hZ2UoaW1nLmhyZWYpOwogIH0KfSk7Cl9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIl8iXS5yZWdpc3Rlcih7CiAgcnVsZTogJ2h0dHA6Ly93d3cuZm90b2xpbmsuc3Uvdi5waHA/aWQ9KicsCiAgYXN5bmMgcmVhZHkgKCkgewogICAgY29uc3QgaSA9IE9iamVjdChfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0pKCcjY29udGVudCBpbWcnKTsKICAgIGF3YWl0IF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXS5vcGVuSW1hZ2UoaS5zcmMpOwogIH0sCn0pOwpfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyJfIl0ucmVnaXN0ZXIoewogIHJ1bGU6ICdodHRwOi8vd3d3LmZvdG9zaWsucGwvcG9rYXpfb2JyYXplay9wZWxueS8qLmh0bWwnLAogIGFzeW5jIHJlYWR5ICgpIHsKICAgIGNvbnN0IGkgPSBPYmplY3QoX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdKSgnYS5ub2JvcmRlciBpbWcnKTsKICAgIGF3YWl0IF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXS5vcGVuSW1hZ2UoaS5zcmMpOwogIH0sCn0pOwpfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyJfIl0ucmVnaXN0ZXIoewogIHJ1bGU6IHsKICAgIGhvc3Q6IFsKICAgICAgL15mcmVha2ltYWdlXC5jb20kLywKICAgICAgL153d3dcLmhvc3RwaWNcLm9yZyQvLAogICAgXSwKICAgIHBhdGg6IC9eXC92aWV3XC5waHAkLywKICAgIHF1ZXJ5OiAvXlw/ZmlsZW5hbWU9KFteJl0rKS8sCiAgfSwKICBhc3luYyBzdGFydCAobSkgewogICAgYXdhaXQgX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdLm9wZW5JbWFnZSgnL2ltYWdlcy8nICsgbS5xdWVyeVsxXSk7CiAgfSwKfSk7Cl9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIl8iXS5yZWdpc3Rlcih7CiAgcnVsZTogewogICAgaG9zdDogL14od3d3XC4pP2ZyZWVpbWd1cFwuY29tJC8sCiAgICBwYXRoOiAvXlwveHh4XC8vLAogIH0sCiAgYXN5bmMgcmVhZHkgKCkgewogICAgY29uc3QgaW1nID0gT2JqZWN0KF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXSkoJyNtYWluaW1hZ2UnKTsKICAgIGF3YWl0IF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXS5vcGVuSW1hZ2UoaW1nLnNyYyk7CiAgfSwKfSk7Cl9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIl8iXS5yZWdpc3Rlcih7CiAgcnVsZTogewogICAgaG9zdDogL15mdWxsaW1nXC5jb20kLywKICAgIHF1ZXJ5OiAvXlw/dj0oW14mXSspLywKICB9LAogIGFzeW5jIHN0YXJ0IChtKSB7CiAgICBhd2FpdCBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0ub3BlbkltYWdlKCcvaW1hZ2VzLycgKyBtLnF1ZXJ5WzFdKTsKICB9LAp9KTsKX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siXyJdLnJlZ2lzdGVyKHsKICBydWxlOiB7CiAgICBob3N0OiAvXmltYWdlcDJwXC5jb20kLywKICAgIHF1ZXJ5OiAvXlw/dj0oW14mXSspLywKICB9LAogIGFzeW5jIHN0YXJ0IChtKSB7CiAgICBhd2FpdCBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0ub3BlbkltYWdlKCcvaW1hZ2VzLycgKyBtLnF1ZXJ5WzFdICsgJy5qcGVnJyk7CiAgfSwKfSk7Cl9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIl8iXS5yZWdpc3Rlcih7CiAgcnVsZTogWwogICAgJ2h0dHA6Ly9mdW5reWltZy5jb20vdmlld2VyLnBocD9pbWc9KicsCiAgICAnaHR0cDovL2Z1bmt5aW1nLmNvbS92aWV3LyonLAogIF0sCiAgYXN5bmMgcmVhZHkgKCkgewogICAgY29uc3QgaSA9IE9iamVjdChfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0pKCcjdmlld2VyIGltZycpOwogICAgYXdhaXQgX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdLm9wZW5JbWFnZShpLnNyYyk7CiAgfSwKfSk7CihmdW5jdGlvbiAoKSB7CiAgY29uc3QgaG9zdFJ1bGUgPSAvXmdvaW1hZ2Vob3N0XC5jb20kLzsKICBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyJfIl0ucmVnaXN0ZXIoewogICAgcnVsZTogewogICAgICBob3N0OiBob3N0UnVsZSwKICAgICAgcGF0aDogL15cL3h4eFwvaW1hZ2VzXC8vLAogICAgfSwKICB9KTsKICBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyJfIl0ucmVnaXN0ZXIoewogICAgcnVsZTogewogICAgICBob3N0OiBob3N0UnVsZSwKICAgICAgcGF0aDogL15cL3h4eFwvKC4rKS8sCiAgICB9LAogICAgYXN5bmMgc3RhcnQgKG0pIHsKICAgICAgYXdhaXQgX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdLm9wZW5JbWFnZSgnL3h4eC9pbWFnZXMvJyArIG0ucGF0aFsxXSk7CiAgICB9LAogIH0pOwogIF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIl8iXS5yZWdpc3Rlcih7CiAgICBydWxlOiB7CiAgICAgIGhvc3Q6IGhvc3RSdWxlLAogICAgICBxdWVyeTogL15cP3Y9KC4rKS8sCiAgICB9LAogICAgYXN5bmMgc3RhcnQgKG0pIHsKICAgICAgYXdhaXQgX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdLm9wZW5JbWFnZSgnL3h4eC9pbWFnZXMvJyArIG0ucXVlcnlbMV0pOwogICAgfSwKICB9KTsKfSkoKTsKX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siXyJdLnJlZ2lzdGVyKHsKICBydWxlOiAnaHR0cDovL3d3dy5ob3N0aW5ncGljcy5uZXQvdmlld2VyLnBocD9pZD0qJywKICBhc3luYyByZWFkeSAoKSB7CiAgICBjb25zdCBpID0gT2JqZWN0KF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXSkoJyNpbWdfdmlld2VyJyk7CiAgICBhd2FpdCBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0ub3BlbkltYWdlKGkuc3JjKTsKICB9LAp9KTsKX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siXyJdLnJlZ2lzdGVyKHsKICBydWxlOiBbCiAgICAnaHR0cDovL2lmb3Rvcy5wbC96b2JhY3ovKicsCiAgICAnaHR0cHM6Ly9wb3N0aW1nLmNjLyonLAogICAgJ2h0dHBzOi8vcGl4eHhlbHMuY2MvKicsCiAgXSwKICBhc3luYyByZWFkeSAoKSB7CiAgICBjb25zdCBtID0gT2JqZWN0KF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXSkoJ21ldGFbcHJvcGVydHk9Im9nOmltYWdlIl0nKTsKICAgIGF3YWl0IF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXS5vcGVuSW1hZ2UobS5jb250ZW50KTsKICB9LAp9KTsKX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siXyJdLnJlZ2lzdGVyKHsKICBydWxlOiB7CiAgICBob3N0OiAvXmltYVwuc28kLywKICB9LAogIGFzeW5jIHJlYWR5ICgpIHsKICAgIGNvbnN0IGEgPSBPYmplY3QoX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdKSgnI2ltYWdlX2Jsb2NrIGEnKTsKICAgIGF3YWl0IF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXS5vcGVuSW1hZ2UoYS5ocmVmKTsKICB9LAp9KTsKX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siXyJdLnJlZ2lzdGVyKHsKICBydWxlOiB7CiAgICBob3N0OiAvXmltYWR1bFwuY29tJC8sCiAgICBxdWVyeTogL1w/cFttdF09KC4rKS8sCiAgfSwKICBhc3luYyBzdGFydCAobSkgewogICAgYXdhaXQgX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdLm9wZW5JbWFnZSgnLz9kaT0nICsgbS5xdWVyeVsxXSk7CiAgfSwKfSk7Cl9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIl8iXS5yZWdpc3Rlcih7CiAgcnVsZTogewogICAgaG9zdDogL15pbWFnZTJ5b3VcLnJ1JC8sCiAgICBwYXRoOiAvXlwvXGQrXC9cZCsvLAogIH0sCiAgYXN5bmMgcmVhZHkgKCkgewogICAgY29uc3QgaSA9IF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXS4kKCdkaXYudF90aXBzMiBkaXYgPiBpbWcnKTsKICAgIGlmICghaSkgewogICAgICBhd2FpdCBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0ub3BlbkxpbmsoJycsIHsKICAgICAgICBwb3N0OiB7CiAgICAgICAgICBfY29uZmlybTogJycsCiAgICAgICAgfSwKICAgICAgfSk7CiAgICAgIHJldHVybjsKICAgIH0KICAgIGF3YWl0IF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXS5vcGVuSW1hZ2UoaS5zcmMpOwogIH0sCn0pOwpfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyJfIl0ucmVnaXN0ZXIoewogIHJ1bGU6IHsKICAgIGhvc3Q6IC9ed3d3XC5pbWFnZWJhbVwuY29tJC8sCiAgICBwYXRoOiAvXlwvKHZpZXd8aW1hZ2UpXC8uKiQvLAogIH0sCiAgYXN5bmMgcmVhZHkgKCkgewogICAgbGV0IG8gPSBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0uJCgnZGl2LnZpZXctbmF2aWdhdGlvbiA+IGE6bnRoLWNoaWxkKDMpJyk7CiAgICBpZiAobykgewogICAgICBhd2FpdCBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0ub3BlbkltYWdlKG8uaHJlZik7CiAgICAgIHJldHVybjsKICAgIH0KICAgIG8gPSBPYmplY3QoX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdKSgnI2FwcCA+IG1haW4gPiBkaXYgPiBoMiA+IGEnKTsKICAgIGF3YWl0IF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXS5vcGVuTGluayhvLmhyZWYpOwogIH0sCn0pOwpfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyJfIl0ucmVnaXN0ZXIoewogIHJ1bGU6ICdodHRwOi8vd3d3LmltYWdlaG91c2luZy5jb20vaW1hZ2UvKicsCiAgYXN5bmMgcmVhZHkgKCkgewogICAgY29uc3QgaSA9IE9iamVjdChfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0pKCd0ZC50ZXh0X2l0ZW0gaW1nJyk7CiAgICBhd2FpdCBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0ub3BlbkltYWdlKGkuc3JjKTsKICB9LAp9KTsKX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siXyJdLnJlZ2lzdGVyKHsKICBydWxlOiAnaHR0cDovL2ltYWdlbm8uY29tLyouaHRtbCcsCiAgYXN5bmMgcmVhZHkgKCkgewogICAgY29uc3QgaSA9IE9iamVjdChfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0pKCcjaW1hZ2VfZGl2IGltZycpOwogICAgYXdhaXQgX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdLm9wZW5JbWFnZShpLnNyYyk7CiAgfSwKfSk7CihmdW5jdGlvbiAoKSB7CiAgX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siXyJdLnJlZ2lzdGVyKHsKICAgIHJ1bGU6IHsKICAgICAgaG9zdDogL14od3d3XC4pP2ltYWdlcG9ydGVyXC5jb20kLywKICAgICAgcGF0aDogL15cL1x3ezEyfVwvLipcLmh0bWwkLywKICAgIH0sCiAgICByZWFkeTogcnVuLAogIH0pOwogIF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIl8iXS5yZWdpc3Rlcih7CiAgICBydWxlOiB7CiAgICAgIGhvc3Q6IFsKICAgICAgICAvXih3d3dcLik/KGltYWdlY2Fycnl8aW1hZ2VkdW5rfGltYWdlcG9ydGVyfGltYWdlc3dpdGNoKVwuY29tJC8sCiAgICAgICAgL14od3d3XC4pPyhwaWNsZWV0fHBpY3R1cmVkaXB8cGljdHVyZXR1cm4pXC5jb20kLywKICAgICAgICAvXih3d3dcLik/aW1nc3BpY2VcLmNvbSQvLAogICAgICAgIC9eKHd3d1wuKT8ocGljbGFtYm98eWFua29pbWFnZXMpXC5uZXQkLywKICAgICAgXSwKICAgIH0sCiAgICByZWFkeTogcnVuLAogIH0pOwogIGFzeW5jIGZ1bmN0aW9uIHJ1biAoKSB7CiAgICBjb25zdCBvID0gT2JqZWN0KF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXSkoJyNkb3dubG9hZF9ib3ggaW1nW2lkXScpOwogICAgYXdhaXQgX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdLm9wZW5JbWFnZShvLnNyYyk7CiAgfQp9KSgpOwooZnVuY3Rpb24gKCkgewogIGNvbnN0IGhvc3QgPSAvXmltYWdlc2hhY2tcLnVzJC87CiAgX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siXyJdLnJlZ2lzdGVyKHsKICAgIHJ1bGU6IHsKICAgICAgaG9zdDogaG9zdCwKICAgICAgcGF0aDogL15cL3Bob3RvXC8uK1wvKC4rKVwvKFteL10rKS8sCiAgICB9LAogICAgYXN5bmMgc3RhcnQgKG0pIHsKICAgICAgYXdhaXQgX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdLm9wZW5JbWFnZShgL2YvJHttLnBhdGhbMV19LyR7bS5wYXRoWzJdfS9gKTsKICAgIH0sCiAgfSk7CiAgX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siXyJdLnJlZ2lzdGVyKHsKICAgIHJ1bGU6IHsKICAgICAgaG9zdDogaG9zdCwKICAgICAgcGF0aDogL15cL2ZcLy4rXC9bXi9dKy8sCiAgICB9LAogICAgYXN5bmMgcmVhZHkgKCkgewogICAgICBjb25zdCBpID0gT2JqZWN0KF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXSkoJyNmdWxsaW1nJyk7CiAgICAgIGF3YWl0IF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXS5vcGVuSW1hZ2UoaS5zcmMpOwogICAgfSwKICB9KTsKfSkoKTsKX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siXyJdLnJlZ2lzdGVyKHsKICBydWxlOiAnaHR0cDovL2ltYWdlc2hvc3QucnUvcGhvdG8vKi9pZCouaHRtbCcsCiAgYXN5bmMgcmVhZHkgKCkgewogICAgY29uc3QgYSA9IE9iamVjdChfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0pKCcjYnBob3RvIGEnKTsKICAgIGF3YWl0IF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXS5vcGVuSW1hZ2UoYS5ocmVmKTsKICB9LAp9KTsKKGZ1bmN0aW9uICgpIHsKICBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyJfIl0ucmVnaXN0ZXIoewogICAgcnVsZTogWwogICAgICB7CiAgICAgICAgaG9zdDogWwogICAgICAgICAgL153d3dcLihmcmVlYnVua2VyfGltZ2NhcnJ5fGltZ3Nob3RzKVwuY29tJC8sCiAgICAgICAgICAvXnd3d1wuaW1hZ2VzbmFrZVwuKGNvbXxvcmcpJC8sCiAgICAgICAgXSwKICAgICAgICBwYXRoOiAvXlwvc2hvd1wucGhwJC8sCiAgICAgICAgcXVlcnk6IC9eXD8vLAogICAgICB9LAogICAgICB7CiAgICAgICAgaG9zdDogL153d3dcLihmcmVlYnVua2VyfGltZ3Nob3RzKVwuY29tJC8sCiAgICAgICAgcGF0aDogL15cL3Nob3dcLy8sCiAgICAgIH0sCiAgICAgIHsKICAgICAgICBob3N0OiAvXmltYWdlYmFuXC4ocnV8bmV0KSQvLAogICAgICAgIHBhdGg6IC9eXC9zaG93XC9cZHs0fVwvXGR7Mn1cL1xkezJ9XC8uKy8sCiAgICAgIH0sCiAgICAgICdodHRwOi8vZm90b28ucGwvc2hvdy5waHA/aW1nPSouaHRtbCcsCiAgICAgIHsKICAgICAgICBob3N0OiAvXnd3d1wuaW1hZ2VzdGltZVwuY29tJC8sCiAgICAgICAgcGF0aDogL15cL3Nob3dcLnBocFwvLipcLmh0bWwkLywKICAgICAgfSwKICAgIF0sCiAgICByZWFkeTogcnVuLAogIH0pOwogIF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIl8iXS5yZWdpc3Rlcih7CiAgICBydWxlOiB7CiAgICAgIGhvc3Q6IFsKICAgICAgICAvXnd3d1wuKGltZ2NhcnJ5fGltYWdlZnJ1aXQpXC5jb20kLywKICAgICAgICAvXnd3d1wucG9ybmJ1c1wub3JnJC8sCiAgICAgICAgL153d3dcLmltYWdlc25ha2VcLihjb218b3JnKSQvLAogICAgICBdLAogICAgICBwYXRoOiAvXlwvKGltZ3xzaG93KVwvLywKICAgIH0sCiAgICByZWFkeTogcnVuMiwKICB9KTsKICBhc3luYyBmdW5jdGlvbiBydW4gKCkgewogICAgY29uc3QgaSA9IE9iamVjdChfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0pKCcjaW1nX29iaicpOwogICAgYXdhaXQgX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdLm9wZW5JbWFnZShpLnNyYywgewogICAgICByZWZlcmVyOiB0cnVlLAogICAgfSk7CiAgfQogIGFzeW5jIGZ1bmN0aW9uIHJ1bjIgKCkgewogICAgY29uc3QgaSA9IE9iamVjdChfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0pKCcjaW1nX29iaicpOwogICAgYXdhaXQgX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdLm9wZW5JbWFnZShpLnNyYywgewogICAgICByZXBsYWNlOiB0cnVlLAogICAgfSk7CiAgfQp9KSgpOwooZnVuY3Rpb24gKCkgewogIF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIl8iXS5yZWdpc3Rlcih7CiAgICBydWxlOiBbCiAgICAgIHsKICAgICAgICBob3N0OiAvXmltYWdlbnBpY1wuY29tJC8sCiAgICAgICAgcGF0aDogL15cLy4qXC8uK1wuaHRtbD8kLywKICAgICAgfSwKICAgICAgewogICAgICAgIGhvc3Q6IFsKICAgICAgICAgIC9eaW1hZ2V0d2lzdFwuY29tJC8sCiAgICAgICAgICAvXnZpcHJcLmltJC8sCiAgICAgICAgXQogICAgICB9LAogICAgXSwKICAgIHJlYWR5OiBydW4sCiAgfSk7CiAgX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siXyJdLnJlZ2lzdGVyKHsKICAgIHJ1bGU6IHsKICAgICAgaG9zdDogL14oaW1hZ2V4cG9ydHxpbWFnZXNoaW1hZ2UpXC5jb20kLywKICAgIH0sCiAgICByZWFkeTogcnVuLAogIH0pOwogIGFzeW5jIGZ1bmN0aW9uIHJ1biAoKSB7CiAgICBjb25zdCBpID0gT2JqZWN0KF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXSkoJ2ltZy5waWMnKTsKICAgIGF3YWl0IF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXS5vcGVuSW1hZ2UoaS5zcmMpOwogIH0KfSkoKTsKX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siXyJdLnJlZ2lzdGVyKHsKICBydWxlOiAnaHR0cDovL2ltYWdldXBwZXIuY29tL2kvPyonLAogIGFzeW5jIHJlYWR5ICgpIHsKICAgIGNvbnN0IGkgPSBPYmplY3QoX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdKSgnI2ltZycpOwogICAgYXdhaXQgX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdLm9wZW5JbWFnZShpLnNyYyk7CiAgfSwKfSk7Cl9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIl8iXS5yZWdpc3Rlcih7CiAgcnVsZTogWwogICAgJ2h0dHBzOi8vKi5pbWFnZXZlbnVlLmNvbS8qJywKICBdLAogIGFzeW5jIHJlYWR5ICgpIHsKICAgIGNvbnN0IGkgPSBPYmplY3QoX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdKSgnYVt0aXRsZV0gaW1nJyk7CiAgICBhd2FpdCBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0ub3BlbkltYWdlKGkuc3JjKTsKICB9LAp9KTsKX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siXyJdLnJlZ2lzdGVyKHsKICBydWxlOiB7CiAgICBob3N0OiAvXmltYWdlemlsbGFcLm5ldCQvLAogIH0sCiAgYXN5bmMgcmVhZHkgKCkgewogICAgY29uc3QgaSA9IE9iamVjdChfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0pKCcjcGhvdG8nKTsKICAgIGF3YWl0IF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXS5vcGVuSW1hZ2UoaS5zcmMsIHsKICAgICAgcmVmZXJlcjogdHJ1ZSwKICAgIH0pOwogIH0sCn0pOwpfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyJfIl0ucmVnaXN0ZXIoewogIHJ1bGU6ICdodHRwOi8vaW1nLjNlenkubmV0LyouaHRtJywKICBhc3luYyByZWFkeSAoKSB7CiAgICBjb25zdCBsID0gT2JqZWN0KF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXSkoJ2xpbmtbcmVsPSJpbWFnZV9zcmMiXScpOwogICAgYXdhaXQgX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdLm9wZW5JbWFnZShsLmhyZWYpOwogIH0sCn0pOwpfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyJfIl0ucmVnaXN0ZXIoewogIHJ1bGU6ICdodHRwOi8vaW1nMS5pbWFnaWxpdmUuY29tLyovKicsCiAgYXN5bmMgcmVhZHkgKCkgewogICAgY29uc3QgYSA9IF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXS4kKCcjcGFnZSBhLmJ1dHRvbicpOwogICAgaWYgKGEpIHsKICAgICAgYXdhaXQgX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdLm9wZW5MaW5rKGEuaHJlZik7CiAgICAgIHJldHVybjsKICAgIH0KICAgIGNvbnN0IGkgPSBPYmplY3QoX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdKSgnI3BhZ2UgPiBpbWc6bm90KFtpZF0pJyk7CiAgICBhd2FpdCBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0ub3BlbkltYWdlKGkuc3JjKTsKICB9LAp9KTsKX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siXyJdLnJlZ2lzdGVyKHsKICBydWxlOiB7CiAgICBob3N0OiAvXnd3d1wuKGltZ2JhYmVzfGltZ2ZsYXJlKVwuY29tJC8sCiAgfSwKICBhc3luYyByZWFkeSAoKSB7CiAgICBsZXQgaSA9IF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXS4kKCdpbnB1dFtvbmNsaWNrXScpOwogICAgaWYgKGkpIHsKICAgICAgX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdLndpbmRvdy5EZWNvZGUoKTsKICAgICAgcmV0dXJuOwogICAgfQogICAgaSA9IE9iamVjdChfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0pKCcjdGhpc19pbWFnZScpOwogICAgYXdhaXQgX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdLm9wZW5JbWFnZShpLnNyYyk7CiAgfSwKfSk7Cl9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIl8iXS5yZWdpc3Rlcih7CiAgcnVsZTogewogICAgaG9zdDogL15pbWdiYXJcLm5ldCQvLAogICAgcGF0aDogL15cL2ltZ19zaG93XC5waHAkLywKICAgIHF1ZXJ5OiAvXlw/dmlld19pZD0vLAogIH0sCiAgYXN5bmMgcmVhZHkgKCkgewogICAgY29uc3QgaSA9IE9iamVjdChfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0pKCdjZW50ZXIgaW1nJyk7CiAgICBhd2FpdCBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0ub3BlbkltYWdlKGkuc3JjKTsKICB9LAp9KTsKX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siXyJdLnJlZ2lzdGVyKHsKICBydWxlOiB7CiAgICBob3N0OiAvXmltZ2JhclwubmV0JC8sCiAgfSwKICBhc3luYyByZWFkeSAoKSB7CiAgICBjb25zdCBpID0gT2JqZWN0KF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXSkoJ2Rpdi5wYW5lbC50b3AgZm9ybSBpbnB1dFtuYW1lPXNpZF0nKTsKICAgIGF3YWl0IF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXS5vcGVuTGluaygnL2ltZ19zaG93LnBocD92aWV3X2lkPScgKyBpLnZhbHVlKTsKICB9LAp9KTsKX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siXyJdLnJlZ2lzdGVyKHsKICBydWxlOiB7CiAgICBob3N0OiAvXmltZ2JveFwuY29tJC8sCiAgICBwYXRoOiAvXlwvW1xkXHddKyQvLAogIH0sCiAgYXN5bmMgcmVhZHkgKCkgewogICAgX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdLnJlbW92ZSgnaWZyYW1lJyk7CiAgICBjb25zdCBpID0gT2JqZWN0KF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXSkoJyNpbWcnKTsKICAgIGF3YWl0IF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXS5vcGVuSW1hZ2UoaS5zcmMpOwogIH0sCn0pOwooZnVuY3Rpb24gKCkgewogIF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIl8iXS5yZWdpc3Rlcih7CiAgICBydWxlOiB7CiAgICAgIGhvc3Q6IFsKICAgICAgICAvXihpbWdmYW50YXN5fGltZ25lbW98aW1nY3VybHxpbWFnZWRvbWlubylcLmNvbSQvLAogICAgICAgIC9eMGltZ1wubmV0JC8sCiAgICAgICAgL15idW5ueWZvcnVtXC5vcmckLywKICAgICAgXSwKICAgICAgcXVlcnk6IC9eXD9bcHZdPS8sCiAgICB9LAogICAgcmVhZHk6IF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIl8iXS5wYXJ0aWFsKGhlbHBlciwgZmFsc2UpLAogIH0pOwogIF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIl8iXS5yZWdpc3Rlcih7CiAgICBydWxlOiB7CiAgICAgIGhvc3Q6IC9eaW1nc2F5XC5jb20kLywKICAgICAgcXVlcnk6IC9eXD9bcHZdPS8sCiAgICB9LAogICAgcmVhZHk6IF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIl8iXS5wYXJ0aWFsKGhlbHBlciwgdHJ1ZSksCiAgfSk7CiAgYXN5bmMgZnVuY3Rpb24gaGVscGVyIChkb1JlcGxhY2UpIHsKICAgIGlmIChfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0ud2luZG93LmNvbmZpcm1BZ2UpIHsKICAgICAgX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdLndpbmRvdy5jb25maXJtQWdlKDEpOwogICAgICByZXR1cm47CiAgICB9CiAgICBjb25zdCBpID0gT2JqZWN0KF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXSkoJyNjb250YWluZXItaG9tZSBpbWdbb25jbGlja10nKTsKICAgIGF3YWl0IF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXS5vcGVuSW1hZ2UoaS5zcmMsIHsKICAgICAgcmVwbGFjZTogZG9SZXBsYWNlLAogICAgfSk7CiAgfQp9KSgpOwpfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyJfIl0ucmVnaXN0ZXIoewogIHJ1bGU6IHsKICAgIGhvc3Q6IFsKICAgICAgL15jb3JlcGl4XC5vcmckLywKICAgICAgL14od3d3XC4pP3h4eGltYWdldHBiXC5vcmckLywKICAgICAgL15pbWdob3N0XC4odG9wfGNsdWIpJC8sCiAgICAgIC9ecG9ybmJha2VyXC5tZW4kLywKICAgICAgL15zb21uYXRoMjAwM1wueHl6JC8sCiAgICBdLAogICAgcGF0aDogL15cL2ltYWdlXC8uKyQvLAogIH0sCiAgYXN5bmMgcmVhZHkgKCkgewogICAgY29uc3QgaSA9IE9iamVjdChfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0pKCdpbnB1dCNlbWJlZC1jb2RlLTIudGV4dC1pbnB1dCcpLmdldEF0dHJpYnV0ZSgndmFsdWUnKTsKICAgIGF3YWl0IF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXS5vcGVuSW1hZ2UoaSk7CiAgfSwKfSk7Cl9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIl8iXS5yZWdpc3Rlcih7CiAgcnVsZTogewogICAgaG9zdDogL15pbWdtYXNzXC5jb20kLywKICAgIHBhdGg6IC9eXC9pbWFnZVwvW1xkXHddKyQvLAogIH0sCiAgYXN5bmMgcmVhZHkgKCkgewogICAgX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdLnJlbW92ZSgnI2xvYWRpbmcyJyk7CiAgICBjb25zdCBkID0gT2JqZWN0KF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXSkoJy5ib3gnKTsKICAgIGQuc3R5bGUuZGlzcGxheSA9ICdpbml0aWFsJzsKICAgIGQuc3R5bGUub3BhY2l0eSA9ICdpbml0aWFsJzsKICB9LAp9KTsKKGZ1bmN0aW9uICgpIHsKICBjb25zdCBQQVRIX1JVTEUgPSAvXlwvKFswLTlhLXpBLVotX10rKShcLnxcL3wkKS87CiAgX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siXyJdLnJlZ2lzdGVyKHsKICAgIHJ1bGU6IHsKICAgICAgaG9zdDogWwogICAgICAgIC9eKGltZ21vbmtleXxpbWd0cmV4fGltZ3ZlfHVwbG9hZHJyfGltYWdlZWVyfHBpYy1tYW5pYWMpXC5jb20kLywKICAgICAgICAvXihodWxraW1nZXxpbWdzZW58aW1nc3RvfGt2YWRvcnxrcm9waWN8cGljZG9sbGFyfHNpbHZlcnBpYylcLmNvbSQvLAogICAgICAgIC9ed3d3XC51aW1nc2hhcmVcLmNvbSQvLAogICAgICAgIC9eKHd3d1wuKT9pbWdzZWVcLm1lJC8sCiAgICAgICAgL14oaW1nY2xpY2t8cGljczR5b3UpXC5uZXQkLywKICAgICAgXSwKICAgICAgcGF0aDogUEFUSF9SVUxFLAogICAgfSwKICAgIGFzeW5jIHJlYWR5IChtKSB7CiAgICAgIGF3YWl0IGhlbHBlcihtLnBhdGhbMV0sIGdldE5leHQxKTsKICAgIH0sCiAgfSk7CiAgX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siXyJdLnJlZ2lzdGVyKHsKICAgIHJ1bGU6IHsKICAgICAgaG9zdDogL15pbWdvdXRsZXRcLmNvbSQvLAogICAgICBwYXRoOiBQQVRIX1JVTEUsCiAgICB9LAogICAgYXN5bmMgcmVhZHkgKCkgewogICAgICBjb25zdCBpID0gX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdLiQoJ2ltZy5waWMnKTsKICAgICAgaWYgKGkpIHsKICAgICAgICBhd2FpdCBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0ub3BlbkltYWdlKGkuc3JjKTsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgICAgY29uc3QgZCA9IE9iamVjdChfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0pKCdkaXZbaWRePSJpbWFnZXZpZXdpIl0nKTsKICAgICAgY29uc3Qgbm9kZSA9IGF3YWl0IHdhaXRET00oZCwgKG5vZGUpID0+IHsKICAgICAgICByZXR1cm4gbm9kZS5ub2RlTmFtZSA9PT0gJ0ZPUk0nICYmIF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXS4kKCdpbnB1dFtuYW1lPSJpZCJdJywgbm9kZSk7CiAgICAgIH0pOwogICAgICBub2RlLnN1Ym1pdCgpOwogICAgfSwKICB9KTsKICBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyJfIl0ucmVnaXN0ZXIoewogICAgcnVsZTogewogICAgICBob3N0OiAvXmltZ3JvY2tcLmluZm8kLywKICAgICAgcGF0aDogUEFUSF9SVUxFLAogICAgfSwKICAgIGFzeW5jIHJlYWR5ICgpIHsKICAgICAgY29uc3QgaSA9IF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXS4kKCdpbWcucGljdmlldycpOwogICAgICBpZiAoaSkgewogICAgICAgIGF3YWl0IF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXS5vcGVuSW1hZ2UoaS5zcmMpOwogICAgICAgIHJldHVybjsKICAgICAgfQogICAgICBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0ud2luZG93Ll8weDMzN2M0YiA9IG51bGw7CiAgICAgIGNvbnN0IG5vZGUgPSBhd2FpdCBnZXRBbWJpZ3VvdXNGb3JtKCdkaXZbaWRdICsgZGl2W2lkXSA+IHN0eWxlJywgKG5vZGUpID0+IHsKICAgICAgICByZXR1cm4gbm9kZS5wYXJlbnRFbGVtZW50OwogICAgICB9KTsKICAgICAgbm9kZS5jbGljaygpOwogICAgICBub2RlLmNsaWNrKCk7CiAgICAgIG5vZGUuY2xpY2soKTsKICAgIH0sCiAgfSk7CiAgX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siXyJdLnJlZ2lzdGVyKHsKICAgIHJ1bGU6IHsKICAgICAgaG9zdDogL15waWNyb2tcLmNvbSQvLAogICAgICBwYXRoOiBQQVRIX1JVTEUsCiAgICB9LAogICAgYXN5bmMgcmVhZHkgKCkgewogICAgICBjb25zdCBpID0gX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdLiQoJ2ltZy5waWN2aWV3Jyk7CiAgICAgIGlmIChpKSB7CiAgICAgICAgYXdhaXQgX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdLm9wZW5JbWFnZShpLnNyYyk7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIGNvbnN0IG5vZGUgPSBhd2FpdCBnZXRBbWJpZ3VvdXNGb3JtKCdib2R5ID4gZGl2ID4gZGl2W2lkXSA+IHN0eWxlJywgKG5vZGUpID0+IHsKICAgICAgICByZXR1cm4gbm9kZS5wYXJlbnRFbGVtZW50OwogICAgICB9KTsKICAgICAgbm9kZS5jbGljaygpOwogICAgICBub2RlLmNsaWNrKCk7CiAgICAgIG5vZGUuY2xpY2soKTsKICAgIH0sCiAgfSk7CiAgX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siXyJdLnJlZ2lzdGVyKHsKICAgIHJ1bGU6IHsKICAgICAgaG9zdDogL15pbWdvdXRsZXRcLnB3JC8sCiAgICAgIHBhdGg6IFBBVEhfUlVMRSwKICAgIH0sCiAgICBhc3luYyByZWFkeSAoKSB7CiAgICAgIGNvbnN0IGkgPSBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0uJCgnaW1nLnBpY3ZpZXcnKTsKICAgICAgaWYgKGkpIHsKICAgICAgICBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0ud2luZG93Ll8weDViNTBiNyA9IG51bGw7CiAgICAgICAgYXdhaXQgX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdLm9wZW5JbWFnZShpLnNyYyk7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXS53aW5kb3cuXzB4NWI1MGI3ID0gbnVsbDsKICAgICAgbGV0IG5vZGUgPSBudWxsOwogICAgICB3aGlsZSAoIW5vZGUpIHsKICAgICAgICBhd2FpdCBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyJfIl0ud2FpdCg1MDApOwogICAgICAgIG5vZGUgPSBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0uJCgnYnV0dG9uW25hbWU9Im5leHQiXScpOwogICAgICB9CiAgICAgIG5vZGUuY2xpY2soKTsKICAgICAgbm9kZS5jbGljaygpOwogICAgICBub2RlLmNsaWNrKCk7CiAgICB9LAogIH0pOwogIF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIl8iXS5yZWdpc3Rlcih7CiAgICBydWxlOiB7CiAgICAgIGhvc3Q6IFsKICAgICAgICAvXihwaWNiYXJvbnxpbWdiYXJvbnxrdmFkb3J8Zm90b2tpeilcLmNvbSQvLAogICAgICAgIC9eaW1nZmlsZXNcLm9yZyQvLAogICAgICBdLAogICAgICBwYXRoOiBQQVRIX1JVTEUsCiAgICB9LAogICAgYXN5bmMgcmVhZHkgKCkgewogICAgICBjb25zdCBpID0gX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdLiQoJ2ltZy5waWMnKTsKICAgICAgaWYgKGkpIHsKICAgICAgICBhd2FpdCBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0ub3BlbkltYWdlKGkuc3JjKTsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgICAgY29uc3QgZiA9IE9iamVjdChfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0pKCdmb3JtJyk7CiAgICAgIGYuc3VibWl0KCk7CiAgICB9LAogIH0pOwogIF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIl8iXS5yZWdpc3Rlcih7CiAgICBydWxlOiAvXmh0dHA6XC9cL2ltZ2RyYWdvblwuY29tXC8oZ2V0ZmlsXC5waHB8ZGwpJC8sCiAgICBhc3luYyByZWFkeSAoKSB7CiAgICAgIGNvbnN0IGkgPSBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0uJCgnaW1nLnBpYycpOwogICAgICBpZiAoaSkgewogICAgICAgIGF3YWl0IF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXS5vcGVuSW1hZ2UoaS5zcmMpOwogICAgICAgIHJldHVybjsKICAgICAgfQogICAgICBhd2FpdCBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyJfIl0ud2FpdCg1MDApOwogICAgICBjb25zdCBmID0gT2JqZWN0KF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXSkoJyNDb250aW51ZUZSTScpOwogICAgICBmLnN1Ym1pdCgpOwogICAgfSwKICB9KTsKICBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyJfIl0ucmVnaXN0ZXIoewogICAgcnVsZTogewogICAgICBob3N0OiAvXmltZ3JvY2tcLnB3JC8sCiAgICAgIHBhdGg6IFBBVEhfUlVMRSwKICAgIH0sCiAgICBhc3luYyByZWFkeSAoKSB7CiAgICAgIGNvbnN0IGkgPSBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0uJCgnaW1nLnBpY3ZpZXcnKTsKICAgICAgaWYgKGkpIHsKICAgICAgICBhd2FpdCBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0ub3BlbkltYWdlKGkuc3JjKTsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgICAgY29uc3Qgbm9kZSA9IGF3YWl0IGdldEFtYmlndW91c0Zvcm0oCiAgICAgICAgJ2RpdltpZF0gKyBkaXZbaWRdID4gaW5wdXQ6bm90KFtzdHlsZV0pJywKICAgICAgICAobm9kZSkgPT4gewogICAgICAgICAgY29uc3QgZCA9IG5vZGUucGFyZW50RWxlbWVudDsKICAgICAgICAgIG5vZGUuY2xpY2soKTsKICAgICAgICAgIHJldHVybiBkOwogICAgICAgIH0pOwogICAgICBub2RlLmNsaWNrKCk7CiAgICB9LAogIH0pOwogIF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIl8iXS5yZWdpc3Rlcih7CiAgICBydWxlOiB7CiAgICAgIGhvc3Q6IC9eKGltZ3ZpZXd8aW1ndG93bnxpbWdtYXplfGltZ2RldylcLnB3JC8sCiAgICAgIHBhdGg6IFBBVEhfUlVMRSwKICAgIH0sCiAgICBhc3luYyByZWFkeSAoKSB7CiAgICAgIF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXS5yZW1vdmUoJ2lmcmFtZScpOwogICAgICBjb25zdCBpID0gX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdLiQoJ2ltZy5waWN2aWV3Jyk7CiAgICAgIGlmIChpKSB7CiAgICAgICAgYXdhaXQgX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdLm9wZW5JbWFnZShpLnNyYyk7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXS53aW5kb3cuXzB4NThmZjM1ID0gbnVsbDsKICAgICAgY29uc3Qgbm9kZSA9IGF3YWl0IGdldEFtYmlndW91c0Zvcm0oCiAgICAgICAgJ3NjcmlwdCArIGRpdltpZF0gPiBpbnB1dDpub3QoW3N0eWxlXSknLAogICAgICAgIChub2RlKSA9PiB7CiAgICAgICAgICBjb25zdCBkID0gbm9kZS5wYXJlbnRFbGVtZW50OwogICAgICAgICAgbm9kZS5jbGljaygpOwogICAgICAgICAgcmV0dXJuIGQ7CiAgICAgICAgfSk7CiAgICAgIG5vZGUuY2xpY2soKTsKICAgIH0sCiAgfSk7CiAgX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siXyJdLnJlZ2lzdGVyKHsKICAgIHJ1bGU6IHsKICAgICAgaG9zdDogL15pbWdhbnRcLmNvbSQvLAogICAgICBwYXRoOiAvXlwvaW1nLShcZCspXC5odG1sJC8sCiAgICB9LAogICAgYXN5bmMgc3RhcnQgKG0pIHsKICAgICAgYXdhaXQgX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdLm9wZW5MaW5rKGBpbWd2aWV3LSR7bS5wYXRoWzFdfS5odG1sYCk7CiAgICB9LAogIH0pOwogIF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIl8iXS5yZWdpc3Rlcih7CiAgICBydWxlOiB7CiAgICAgIGhvc3Q6IC9eaW1nYW50XC5jb20kLywKICAgICAgcGF0aDogL15cL2ltZ3ZpZXctXGQrXC5odG1sJC8sCiAgICB9LAogICAgYXN5bmMgcmVhZHkgKCkgewogICAgICBjb25zdCBpID0gT2JqZWN0KF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXSkoJyNwaWNWaWV3Jyk7CiAgICAgIGF3YWl0IF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXS5vcGVuSW1hZ2UoaS5zcmMpOwogICAgfSwKICB9KTsKICBmdW5jdGlvbiB3YWl0RE9NIChlbGVtZW50LCBmbikgewogICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7CiAgICAgIGNvbnN0IG9ic2VydmVyID0gbmV3IE11dGF0aW9uT2JzZXJ2ZXIoKG11dGF0aW9ucykgPT4gewogICAgICAgIG11dGF0aW9ucy5mb3JFYWNoKChtdXRhdGlvbikgPT4gewogICAgICAgICAgaWYgKG11dGF0aW9uLnR5cGUgIT09ICdjaGlsZExpc3QnKSB7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgIH0KICAgICAgICAgIGNvbnN0IFtrLCAsIHJdID0gX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siXyJdLmZpbmQobXV0YXRpb24uYWRkZWROb2RlcywgKGNoaWxkKSA9PiB7CiAgICAgICAgICAgIHJldHVybiBmbihjaGlsZCkgPyBjaGlsZCA6IF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIl8iXS5ub25lOwogICAgICAgICAgfSk7CiAgICAgICAgICBpZiAoayA9PT0gX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siXyJdLm5vbmUpIHsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgfQogICAgICAgICAgb2JzZXJ2ZXIuZGlzY29ubmVjdCgpOwogICAgICAgICAgcmVzb2x2ZShyKTsKICAgICAgICB9KTsKICAgICAgfSk7CiAgICAgIG9ic2VydmVyLm9ic2VydmUoZWxlbWVudCwgewogICAgICAgIGNoaWxkTGlzdDogdHJ1ZSwKICAgICAgfSk7CiAgICB9KTsKICB9CiAgYXN5bmMgZnVuY3Rpb24gZ2V0QW1iaWd1b3VzRm9ybSAoc2VsZWN0b3IsIHNoZWxsTm9ybWFsaXplcikgewogICAgY29uc3QgZCA9IGF3YWl0IHdhaXRGb3JtU2hlbGwoc2VsZWN0b3IsIHNoZWxsTm9ybWFsaXplcik7CiAgICBjb25zdCBzdHlsZSA9IE9iamVjdChfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0pKCdzdHlsZScsIGQpOwogICAgbGV0IHZpc2libGVDbGFzc2VzID0gcGFyc2VTdHlsZShzdHlsZSk7CiAgICB2aXNpYmxlQ2xhc3NlcyA9IGZpbHRlckR1cGxpY2F0ZWQodmlzaWJsZUNsYXNzZXMpOwogICAgd2hpbGUgKHRydWUpIHsKICAgICAgY29uc3QgYnV0dG9uID0gZmluZFZpc2libGVGb3JtKHZpc2libGVDbGFzc2VzKTsKICAgICAgaWYgKGJ1dHRvbikgewogICAgICAgIHJldHVybiBidXR0b247CiAgICAgIH0KICAgICAgYXdhaXQgX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siXyJdLndhaXQoNTAwKTsKICAgIH0KICB9CiAgZnVuY3Rpb24gd2FpdEZvcm1TaGVsbCAoc2VsZWN0b3IsIG5vcm1hbGl6ZXIpIHsKICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4gewogICAgICBjb25zdCBoYW5kbGUgPSBzZXRJbnRlcnZhbCgoKSA9PiB7CiAgICAgICAgbGV0IHNoZWxsID0gX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdLiQoc2VsZWN0b3IpOwogICAgICAgIGlmICghc2hlbGwpIHsKICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgY2xlYXJJbnRlcnZhbChoYW5kbGUpOwogICAgICAgIHNoZWxsID0gbm9ybWFsaXplcihzaGVsbCk7CiAgICAgICAgcmVzb2x2ZShzaGVsbCk7CiAgICAgIH0sIDUwMCk7CiAgICB9KTsKICB9CiAgZnVuY3Rpb24gcGFyc2VTdHlsZSAoc3R5bGUpIHsKICAgIHN0eWxlID0gc3R5bGUudGV4dENvbnRlbnQ7CiAgICBjb25zdCBwYXR0ZXJuID0gL1wuKFx3Kylce3Zpc2liaWxpdHk6aW5pdGlhbDtcfS9nOwogICAgbGV0IHJ2ID0gbnVsbDsKICAgIGNvbnN0IGNsYXNzZXMgPSBbXTsKICAgIHdoaWxlICgocnYgPSBwYXR0ZXJuLmV4ZWMoc3R5bGUpKSAhPT0gbnVsbCkgewogICAgICBjbGFzc2VzLnB1c2gocnZbMV0pOwogICAgfQogICAgcmV0dXJuIGNsYXNzZXM7CiAgfQogIGZ1bmN0aW9uIGZpbHRlckR1cGxpY2F0ZWQgKGNsYXNzZXMpIHsKICAgIGNvbnN0IHRhYmxlID0gbmV3IE1hcCgpOwogICAgZm9yIChjb25zdCBjIG9mIGNsYXNzZXMpIHsKICAgICAgaWYgKHRhYmxlLmhhcyhjKSkgewogICAgICAgIHRhYmxlLnNldChjLCBmYWxzZSk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgdGFibGUuc2V0KGMsIHRydWUpOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gQXJyYXkuZnJvbSh0YWJsZS5lbnRyaWVzKCkpLmZpbHRlcigoW18sIHVuaXF1ZV0pID0+IHsKICAgICAgcmV0dXJuIHVuaXF1ZTsKICAgIH0pLm1hcCgoW18sIGNdKSA9PiB7CiAgICAgIHJldHVybiBjOwogICAgfSk7CiAgfQogIGZ1bmN0aW9uIGZpbmRWaXNpYmxlRm9ybSAoY2xhc3NlcykgewogICAgZm9yIChjb25zdCBjbGFzc18gb2YgY2xhc3NlcykgewogICAgICBjb25zdCBmb3JtID0gX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdLiQoYGZvcm0uJHtjbGFzc199YCk7CiAgICAgIGlmICghZm9ybSkgewogICAgICAgIGNvbnRpbnVlOwogICAgICB9CiAgICAgIGNvbnN0IGJ1dHRvbiA9IF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXS4kKCdpbnB1dFt0eXBlPSJidXR0b24iXSwgYnV0dG9uW3R5cGU9ImJ1dHRvbiJdLCBidXR0b25bY2xhc3NdJywgZm9ybSk7CiAgICAgIGlmICghYnV0dG9uKSB7CiAgICAgICAgY29udGludWU7CiAgICAgIH0KICAgICAgY29uc3QgdiA9IGdldENvbXB1dGVkU3R5bGUoYnV0dG9uKS5nZXRQcm9wZXJ0eVZhbHVlKCd2aXNpYmlsaXR5Jyk7CiAgICAgIGlmICh2ICE9PSAndmlzaWJsZScpIHsKICAgICAgICBjb250aW51ZTsKICAgICAgfQogICAgICByZXR1cm4gYnV0dG9uOwogICAgfQogICAgcmV0dXJuIG51bGw7CiAgfQogIGZ1bmN0aW9uIGdldE5leHQxIChpKSB7CiAgICByZXR1cm4gaS52YWx1ZTsKICB9CiAgYXN5bmMgZnVuY3Rpb24gaGVscGVyIChpZCwgZ2V0TmV4dCkgewogICAgY29uc3QgcmVjYXB0Y2hhID0gX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdLiQoJyNyZWNhcHRjaGFfd2lkZ2V0LCAjY2FwdGNoYScpOwogICAgaWYgKHJlY2FwdGNoYSkgewogICAgICBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyJfIl0uaW5mbygnc3RvcCBiZWNhdXNlIHJlY2FwdGNoYScpOwogICAgICByZXR1cm47CiAgICB9CiAgICBsZXQgaSA9IF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXS4kKCdpbnB1dFtuYW1lPSJuZXh0Il0nKTsKICAgIGlmIChpKSB7CiAgICAgIGNvbnN0IG5leHQgPSBnZXROZXh0KGkpOwogICAgICBhd2FpdCBnbyhpZCwgT2JqZWN0KF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXSkoJ2lucHV0W25hbWU9InByZSJdJykudmFsdWUsIG5leHQpOwogICAgICByZXR1cm47CiAgICB9CiAgICBpID0gX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdLiQoJ2ltZy5waWN2aWV3LCBpbWcucGljJyk7CiAgICBpZiAoaSkgewogICAgICBhd2FpdCBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0ub3BlbkltYWdlKGkuc3JjKTsKICAgICAgcmV0dXJuOwogICAgfQogICAgX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siXyJdLmluZm8oJ2RvIG5vdGhpbmcnKTsKICB9CiAgYXN5bmMgZnVuY3Rpb24gZ28gKGlkLCBwcmUsIG5leHQpIHsKICAgIGF3YWl0IF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXS5vcGVuTGluaygnJywgewogICAgICBwb3N0OiB7CiAgICAgICAgb3A6ICd2aWV3JywKICAgICAgICBpZDogaWQsCiAgICAgICAgcHJlOiBwcmUsCiAgICAgICAgbmV4dDogbmV4dCwKICAgICAgICBhZGI6ICcwJywKICAgICAgfSwKICAgIH0pOwogIH0KfSkoKTsKX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siXyJdLnJlZ2lzdGVyKHsKICBydWxlOiB7CiAgICBob3N0OiAvXmltZ3RvcnJudFwuaW4kLywKICAgIHBhdGg6IC9eXC92aWV3XC5waHAkLywKICAgIHF1ZXJ5OiAvXlw/aWQ9LiovLAogIH0sCiAgYXN5bmMgcmVhZHkgKCkgewogICAgY29uc3QgaW1nID0gT2JqZWN0KF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXSkoJ2NlbnRlciBkaXYgdGFibGUudGcgdGJvZHkgdHIgdGQgY2VudGVyIGltZycpOwogICAgYXdhaXQgX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdLm9wZW5JbWFnZShpbWcuc3JjKTsKICB9LAp9KTsKX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siXyJdLnJlZ2lzdGVyKHsKICBydWxlOiB7CiAgICBob3N0OiAvXmltZ3ZhdWx0XC5wdyQvLAogICAgcGF0aDogL15cL3ZpZXctaW1hZ2VcLy8sCiAgfSwKICBhc3luYyByZWFkeSAoKSB7CiAgICBjb25zdCBhID0gT2JqZWN0KF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXSkoJ2FydGljbGUgZGl2LnNwYW43IGFbdGFyZ2V0PSJfYmxhbmsiXScpOwogICAgYXdhaXQgX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdLm9wZW5JbWFnZShhLmhyZWYpOwogIH0sCn0pOwpfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyJfIl0ucmVnaXN0ZXIoewogIHJ1bGU6IHsKICAgIGhvc3Q6IFsKICAgICAgL153d3dcLihpbWdza3l8aW1nZmlsZXxpbWdzZWUpXC5uZXQkLywKICAgICAgL153d3dcLmltYWdlc3BpY3lcLnNpdGUkLywKICAgIF0sCiAgICBwYXRoOiAvXlwvc2l0ZVwvdlwvXGQrJC8sCiAgfSwKICBhc3luYyByZWFkeSAoKSB7CiAgICBjb25zdCBhID0gT2JqZWN0KF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXSkoJyNteVVuaXF1ZUltZycpLnBhcmVudE5vZGU7CiAgICBhd2FpdCBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0ub3BlbkxpbmsoYS5ocmVmKTsKICB9LAp9KTsKX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siXyJdLnJlZ2lzdGVyKHsKICBydWxlOiBbCiAgICB7CiAgICAgIGhvc3Q6IFsKICAgICAgICAvXnd3d1wuKGltZ3NreXxpbWdmaWxlfGltZ3NlZSlcLm5ldCQvLAogICAgICAgIC9ed3d3XC5pbWFnZXNwaWN5XC5zaXRlJC8sCiAgICAgICAgL14oaW1neGVufGltZ3dlbmd8aW1ndGlnZXJ8aW1ndml2b3xpbWd3ZXdvfGltZ2ZseWVyKVwueHl6JC8sCiAgICAgIF0sCiAgICAgIHBhdGg6IC9eXC9bYS16fDAtOV17NCwxMH0kLywKICAgIH0sCiAgICB7CiAgICAgIGhvc3Q6IFsKICAgICAgICAvXih3d3dcLik/aW1nYWlyXC5uZXQkLywKICAgICAgICAvXih3d3dcLik/aW1hZ2VraW5nXC54eXokLywKICAgICAgICAvXnd3d1wuY2xvdWRnYWxsZXJ5XC5uZXQkLywKICAgICAgICAvXmtla29sYW5ndGlcLmNvbSQvLAogICAgICAgIC9eaW1na2lhXC5idXp6JC8sCiAgICAgIF0sCiAgICB9LAogIF0sCiAgYXN5bmMgcmVhZHkgKCkgewogICAgY29uc3QgbWF0Y2hlcyA9IF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXS5zZWFyY2hGcm9tU2NyaXB0cygvZG9jdW1lbnRcLmdldEVsZW1lbnRCeUlkXCgic29EYUJ1ZyJcKVwuc3JjID0gIihbXiJdKykiOy8pOwogICAgYXdhaXQgX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdLm9wZW5JbWFnZShtYXRjaGVzWzFdKTsKICB9LAp9KTsKX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siXyJdLnJlZ2lzdGVyKHsKICBydWxlOiBbCiAgICB7CiAgICAgIGhvc3Q6IFsKICAgICAgICAvXmltZ2t1aXdcLnh5eiQvLAogICAgICAgIC9eKGltZ3dleHxpbWd3YW5nfGltZ21lbm98aW1nd2F2fGltZ3h2ZHxpbWdiYmR8aW1ncXRlfGltZ2tvYylcLmJ1enokLywKICAgICAgXSwKICAgICAgcGF0aDogL15cL1thLXp8MC05XXs0LDEwfSQvLAogICAgfSwKICBdLAogIGFzeW5jIHJlYWR5ICgpIHsKICAgIGNvbnN0IG1hdGNoZXMgPSBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0uc2VhcmNoRnJvbVNjcmlwdHMoL2RvY3VtZW50XC5nZXRFbGVtZW50QnlJZFwoIm5ld0ltZ0UiXClcLnNyYyA9ICIoW14iXSspIjsvKTsKICAgIGF3YWl0IF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXS5vcGVuSW1hZ2UobWF0Y2hlc1sxXSk7CiAgfSwKfSk7Cl9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIl8iXS5yZWdpc3Rlcih7CiAgcnVsZTogJ2h0dHA6Ly9pcGljLnN1Lz9wYWdlPWltZyZwaWM9KicsCiAgYXN5bmMgcmVhZHkgKCkgewogICAgY29uc3QgaSA9IE9iamVjdChfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0pKCcjZnonKTsKICAgIGF3YWl0IF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXS5vcGVuSW1hZ2UoaS5zcmMpOwogIH0sCn0pOwpfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyJfIl0ucmVnaXN0ZXIoewogIHJ1bGU6IHsKICAgIGhvc3Q6IC9eaVwuamF2dG9yXC5jb20kLywKICAgIHBhdGg6IC9eXC9pbWFnZVwvLywKICB9LAogIGFzeW5jIHJlYWR5ICgpIHsKICAgIGNvbnN0IGkgPSBPYmplY3QoX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdKSgnI3Nob3dfaW1nIGltZycpOwogICAgYXdhaXQgX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdLm9wZW5JbWFnZShpLnNyYyk7CiAgfSwKfSk7Cl9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIl8iXS5yZWdpc3Rlcih7CiAgcnVsZTogewogICAgaG9zdDogL15rZXB0YXJvbG9cLmh1JC8sCiAgICBwYXRoOiAvXihcL1teL10rXC9bXi9dK1wuanBnKSQvLAogIH0sCiAgYXN5bmMgc3RhcnQgKG0pIHsKICAgIGF3YWl0IF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXS5vcGVuSW1hZ2UoJ2h0dHA6Ly93d3cua2VwdGFyb2xvLmh1L2tlcCcgKyBtLnBhdGhbMV0pOwogIH0sCn0pOwpfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyJfIl0ucmVnaXN0ZXIoewogIHJ1bGU6IHsKICAgIGhvc3Q6IC9ebG9zdHBpY1wubmV0JC8sCiAgICBxdWVyeTogL15cP3Bob3RvPVxkKyQvLAogIH0sCiAgYXN5bmMgcmVhZHkgKCkgewogICAgY29uc3QgaSA9IE9iamVjdChfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0pKCdpbWcubm90aW5saW5lLmNpcmNsZScpOwogICAgYXdhaXQgX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdLm9wZW5JbWFnZShpLnNyYyk7CiAgfSwKfSk7CihmdW5jdGlvbiAoKSB7CiAgX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siXyJdLnJlZ2lzdGVyKHsKICAgIHJ1bGU6IHsKICAgICAgaG9zdDogWwogICAgICAgIC9ebWlyYWdlcGljc1wuY29tJC8sCiAgICAgICAgL15mdW5leHRyYVwuaG9zdHppXC5jb20kLywKICAgICAgICAvXmJpbGRlclwubml4aGVscFwuZGUkLywKICAgICAgICAvXmltYWdlY3VybFwuKGNvbXxvcmcpJC8sCiAgICAgICAgL15mb3RvLXBpY1wubmV0JC8sCiAgICAgIF0sCiAgICAgIHBhdGg6IC9eXC92aWV3ZXJcLnBocCQvLAogICAgICBxdWVyeTogL2ZpbGU9KFteJl0rKS8sCiAgICB9LAogICAgc3RhcnQ6IGhlbHBlciwKICB9KTsKICBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyJfIl0ucmVnaXN0ZXIoewogICAgcnVsZTogewogICAgICBob3N0OiAvXmltZ3NpblwuY29tJC8sCiAgICAgIHBhdGg6IC9eXC92aWV3ZXJcLnBocCQvLAogICAgICBxdWVyeTogL2ZpbGU9KFteJl0rKS8sCiAgICB9LAogICAgYXN5bmMgc3RhcnQgKG0pIHsKICAgICAgYXdhaXQgX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdLm9wZW5JbWFnZSgnL2ZpbGVzLycgKyBtLnF1ZXJ5WzFdKTsKICAgIH0sCiAgfSk7CiAgX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siXyJdLnJlZ2lzdGVyKHsKICAgIHJ1bGU6IHsKICAgICAgaG9zdDogL14oaW1nbmlwfGltZ2NlbnRyYWx8aW1nY3JlYW0pXC5jb20kLywKICAgICAgcGF0aDogL15cL3ZpZXdlcnIuKlwucGhwJC8sCiAgICAgIHF1ZXJ5OiAvZmlsZT0oW14mXSspLywKICAgIH0sCiAgICBzdGFydDogaGVscGVyLAogIH0pOwogIF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIl8iXS5yZWdpc3Rlcih7CiAgICBydWxlOiBbCiAgICAgICdodHRwOi8vd3d3Lm92ZXJwaWMubmV0L3ZpZXdlci5waHA/ZmlsZT0qJywKICAgIF0sCiAgICBhc3luYyByZWFkeSAoKSB7CiAgICAgIGNvbnN0IGkgPSBPYmplY3QoX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdKSgnI21haW5faW1nJyk7CiAgICAgIGF3YWl0IF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXS5vcGVuSW1hZ2UoaS5zcmMpOwogICAgfSwKICB9KTsKICBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyJfIl0ucmVnaXN0ZXIoewogICAgcnVsZTogewogICAgICBob3N0OiAvXnh4eGhvc3RcLm1lJC8sCiAgICAgIHBhdGg6IC9eXC92aWV3ZXJcZCtcLnBocCQvLAogICAgICBxdWVyeTogL2ZpbGU9KFteJl0rKS8sCiAgICB9LAogICAgYXN5bmMgc3RhcnQgKG0pIHsKICAgICAgYXdhaXQgX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdLm9wZW5JbWFnZSgnZmlsZXMvJyArIG0ucXVlcnlbMV0pOwogICAgfSwKICB9KTsKICBhc3luYyBmdW5jdGlvbiBoZWxwZXIgKG0pIHsKICAgIGF3YWl0IF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXS5vcGVuSW1hZ2UoJy9pbWFnZXMvJyArIG0ucXVlcnlbMV0pOwogIH0KfSkoKTsKX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siXyJdLnJlZ2lzdGVyKHsKICBydWxlOiB7CiAgICBob3N0OiAvXnd3d1wubXJqaFwub3JnJC8sCiAgICBwYXRoOiAvXlwvZ2FsbGVyeVwucGhwJC8sCiAgICBxdWVyeTogL15cP2VudHJ5PSguKykkLywKICB9LAogIGFzeW5jIHJlYWR5IChtKSB7CiAgICBjb25zdCB1cmwgPSBtLnF1ZXJ5WzFdOwogICAgYXdhaXQgX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdLm9wZW5JbWFnZSgnLycgKyB1cmwpOwogIH0sCn0pOwpfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyJfIl0ucmVnaXN0ZXIoewogIHJ1bGU6IHsKICAgIGhvc3Q6IC9ed3d3XC5ub2Vsc2hhY2tcLmNvbSQvLAogIH0sCiAgYXN5bmMgcmVhZHkgKCkgewogICAgY29uc3QgaSA9IE9iamVjdChfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0pKCcjZWx0X3RvX2FmZicpOwogICAgYXdhaXQgX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdLm9wZW5JbWFnZShpLnNyYyk7CiAgfSwKfSk7Cl9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIl8iXS5yZWdpc3Rlcih7CiAgcnVsZTogewogICAgaG9zdDogWwogICAgICAvXm92ZXJkcmVhbVwuY3okLywKICAgICAgL15waWNsaWNrXC5vcmckLywKICAgIF0sCiAgICBwYXRoOiAvXlwvaW1hZ2VcLy8sCiAgfSwKICBhc3luYyByZWFkeSAoKSB7CiAgICBjb25zdCBpbWcgPSBPYmplY3QoX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdKSgnI2Z1bGxfaW1hZ2UnKTsKICAgIGF3YWl0IF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXS5vcGVuSW1hZ2UoaW1nLnNyYyk7CiAgfSwKfSk7Cl9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIl8iXS5yZWdpc3Rlcih7CiAgcnVsZTogewogICAgaG9zdDogWwogICAgICAvXmltZ2F6dXJlXC5jb20kLywKICAgICAgL15zaGFnZ3lpbWdcLnBybyQvLAogICAgICAvXnBpYy1tb25leVwucnUkLywKICAgICAgL15kYWlseWltYWdlc1wueHl6JC8sCiAgICBdLAogIH0sCiAgYXN5bmMgcmVhZHkgKCkgewogICAgY29uc3QgZiA9IGRvY3VtZW50LmZvcm1zWzBdOwogICAgY29uc3Qgc2lnID0gT2JqZWN0KF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXSkoJ2lucHV0W25hbWU9InNpZyJdJywgZikudmFsdWU7CiAgICBjb25zdCBwaWNfaWQgPSBPYmplY3QoX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdKSgnaW5wdXRbbmFtZT0icGljX2lkIl0nLCBmKS52YWx1ZTsKICAgIGNvbnN0IHJlZmVyZXIgPSBPYmplY3QoX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdKSgnaW5wdXRbbmFtZT0icmVmZXJlciJdJywgZikudmFsdWU7CiAgICBhd2FpdCBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0ub3BlbkltYWdlKGAvcGljLmpwZWc/cGljX2lkPSR7cGljX2lkfSZzaWc9JHtzaWd9JnJlZmVyZXI9JHtyZWZlcmVyfWApOwogIH0sCn0pOwpfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyJfIl0ucmVnaXN0ZXIoewogIHJ1bGU6ICdodHRwOi8vd3d3LnBpYy11cGxvYWQuZGUvdmlldy0qLmh0bWwnLAogIGFzeW5jIHJlYWR5ICgpIHsKICAgIF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXS5yZW1vdmUoJy5hZHZlcnQnKTsKICAgIGNvbnN0IGkgPSBPYmplY3QoX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdKSgnaW1nLnByZXZpZXdfcGljdHVyZV8yYiwgaW1nLm9yaWdpbmFsX3BpY3R1cmVfMmInKTsKICAgIGF3YWl0IF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXS5vcGVuSW1hZ2UoaS5zcmMpOwogIH0sCn0pOwpfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyJfIl0ucmVnaXN0ZXIoewogIHJ1bGU6IHsKICAgIGhvc3Q6IFsKICAgICAgL15waWM0eW91XC5ydSQvLAogICAgICAvXnBpYzV5b3VcLnJ1JC8sCiAgICBdLAogIH0sCiAgYXN5bmMgcmVhZHkgKCkgewogICAgaWYgKF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXS4kKCcjZDEgPiBpbWcnKSAhPSBudWxsKSB7CiAgICAgIGNvbnN0IFVSTHBhcmFtcyA9IGxvY2F0aW9uLmhyZWYuc3BsaXQoJy8nLCA1KTsKICAgICAgbGV0IG5leHQgPSBVUkxwYXJhbXMuam9pbignLycpOwogICAgICBuZXh0ID0gbmV4dCArICcvMS8nOwogICAgICBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0uc2V0Q29va2llKCdwNHljbGljaycsICcxJyk7CiAgICAgIGF3YWl0IF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXS5vcGVuTGluayhuZXh0KTsKICAgIH0gZWxzZSB7CiAgICAgIGNvbnN0IGkgPSBPYmplY3QoX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdKSgnI2QxIGltZycpLnNyYzsKICAgICAgYXdhaXQgX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdLm9wZW5JbWFnZShpKTsKICAgIH0KICB9LAp9KTsKX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siXyJdLnJlZ2lzdGVyKHsKICBydWxlOiB7CiAgICBob3N0OiAvXih3d3dcLik/cGljY2FzaFwubmV0JC8sCiAgfSwKICBhc3luYyByZWFkeSAoKSB7CiAgICBjb25zdCBpID0gT2JqZWN0KF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXSkoJy5jb250YWluZXIgPiBpbWcnKTsKICAgIGNvbnN0IG0gPSBpLm9uY2xpY2sudG9TdHJpbmcoKS5tYXRjaCgvbXNob3dcKCcoW14nXSspJ1wpOy8pOwogICAgYXdhaXQgX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdLm9wZW5JbWFnZShtWzFdKTsKICB9LAp9KTsKX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siXyJdLnJlZ2lzdGVyKHsKICBydWxlOiB7CiAgICBob3N0OiAvXihwaWNleHBvc2VkfGNyb2VhKVwuY29tJC8sCiAgfSwKICBhc3luYyByZWFkeSAoKSB7CiAgICBjb25zdCBpID0gT2JqZWN0KF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXSkoJ2ltZy5waWMnKTsKICAgIGF3YWl0IF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXS5vcGVuSW1hZ2UoaS5zcmMpOwogIH0sCn0pOwpfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyJfIl0ucmVnaXN0ZXIoewogIHJ1bGU6IFsKICAgICdodHRwOi8vYW1hdGV1cmZyZWFrLm9yZy9zaGFyZS0qLmh0bWwnLAogICAgJ2h0dHA6Ly9hbWF0ZXVyZnJlYWsub3JnL3NoYXJlLnBocD9pZD0qJywKICAgICdodHRwOi8vcGljZm94Lm9yZy8qJywKICAgICdodHRwOi8vd3d3LmV1cm8tcGljLmV1L3NoYXJlLnBocD9pZD0qJywKICAgICdodHRwOi8veHh4LmZyZWVpbWFnZS51cy9zaGFyZS5waHA/aWQ9KicsCiAgICAnaHR0cDovL3d3dy5waXhzb3IuY29tL3NoYXJlLnBocD9pZD0qJywKICAgICdodHRwOi8vd3d3LnBpeHNvci5jb20vc2hhcmUtKi5odG1sJywKICAgICdodHRwOi8vcGl4c29yLmNvbS9YWFgvc2hhcmUtKi5odG1sJywKICAgICdodHRwOi8vaG9sZHRoZW1vYW4ubmV0L3gvc2hhcmUtKi5odG1sJywKICAgICdodHRwOi8vd3d3LmltZ3oucHcvc2hhcmUtKi5odG1sJywKICAgICdodHRwczovL2ltZ3V1ci5waWN0dXJlcy9zaGFyZS0qLmh0bWwnCiAgXSwKICBhc3luYyByZWFkeSAoKSB7CiAgICBjb25zdCBvID0gT2JqZWN0KF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXSkoJyNpaW1nJyk7CiAgICBhd2FpdCBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0ub3BlbkltYWdlKG8uc3JjKTsKICB9LAp9KTsKX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siXyJdLnJlZ2lzdGVyKHsKICBydWxlOiB7CiAgICBob3N0OiBbCiAgICAgIC9eKGRybGlua3xwaWNwaWMpXC5vbmxpbmUkLywKICAgICAgL15waWNjbG9ja1wucnUkLywKICAgIF0sCiAgICBwYXRoOiAvXlwvXGQrXC9cZCtcLyQvLAogIH0sCiAgYXN5bmMgcmVhZHkgKCkgewogICAgbGV0IGkgPSBPYmplY3QoX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdKSgnI3BheV90aHVtYl9pbWcgaW1nJyk7CiAgICBpID0gaS5nZXRBdHRyaWJ1dGUoJ29uY2xpY2snKTsKICAgIGkgPSBpLm1hdGNoKC9tc2hvd1woJyguKyknXCkvKTsKICAgIGkgPSBpWzFdOwogICAgYXdhaXQgX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdLm9wZW5JbWFnZShpKTsKICB9LAp9KTsKX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siXyJdLnJlZ2lzdGVyKHsKICBydWxlOiBbCiAgICAnaHR0cDovL3BpY3MtbW9uZXkucnUvYWxscGljZnJlZS8qJywKICAgICdodHRwOi8vd3d3LnBpY3MtbW9uZXkucnUvYWxsaW1hZ2UvKicsCiAgXSwKfSk7Cl9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIl8iXS5yZWdpc3Rlcih7CiAgcnVsZTogewogICAgaG9zdDogL15waWNzLW1vbmV5XC5ydSQvLAogICAgcGF0aDogL15cL3ZcLnBocCQvLAogIH0sCiAgYXN5bmMgcmVhZHkgKCkgewogICAgX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdLnJlbW92ZSgnaWZyYW1lJyk7CiAgICBjb25zdCBpID0gT2JqZWN0KF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXSkoJ2NlbnRlciBpbWc6bm90KFtpZF0pJyk7CiAgICBhd2FpdCBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0ub3BlbkltYWdlKGkuc3JjKTsKICB9LAp9KTsKX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siXyJdLnJlZ2lzdGVyKHsKICBydWxlOiB7CiAgICBob3N0OiBbCiAgICAgIC9ed3d3XC5waWNzLW1vbmV5XC5ydSQvLAogICAgICAvXihwaWNrZXItY2xpY2t8cDB4cGljbW9uZXkpXC5ydSQvLAogICAgXSwKICB9LAogIGFzeW5jIHJlYWR5ICgpIHsKICAgIF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXS5yZW1vdmUoJ2lmcmFtZScpOwogICAgbGV0IGkgPSBPYmplY3QoX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdKSgnI2QxIGltZywgI3BheV90aHVtYl9pbWcgPiBpbWcnKTsKICAgIGkgPSBpLm9uY2xpY2sudG9TdHJpbmcoKTsKICAgIGkgPSBpLm1hdGNoKC9tc2hvd1woJyguKyknXCkvKTsKICAgIGkgPSBpWzFdOwogICAgYXdhaXQgX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdLm9wZW5JbWFnZShpKTsKICB9LAp9KTsKX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siXyJdLnJlZ2lzdGVyKHsKICBydWxlOiAnaHR0cDovL3BpY3NoYXJlLmdlZW56YS5jb20vcGljcy8qJywKICBhc3luYyByZWFkeSAoKSB7CiAgICBjb25zdCBpID0gT2JqZWN0KF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXSkoJyNwaWNTaGFyZV9pbWFnZV9jb250YWluZXInKTsKICAgIGF3YWl0IF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXS5vcGVuSW1hZ2UoaS5zcmMpOwogIH0sCn0pOwpfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyJfIl0ucmVnaXN0ZXIoewogIHJ1bGU6IHsKICAgIGhvc3Q6IC9ecGljc3RyZWFtXC50diQvLAogICAgcGF0aDogL15cLy4qXC8uKlwuaHRtbCQvLAogIH0sCiAgYXN5bmMgcmVhZHkgKCkgewogICAgY29uc3QgaW1nID0gT2JqZWN0KF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXSkoJyN2aWV3MSA+IGRpdjpudGgtY2hpbGQoMSkgPiBpbWc6bnRoLWNoaWxkKDEpJyk7CiAgICBhd2FpdCBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0ub3BlbkltYWdlKGltZy5zcmMpOwogIH0sCn0pOwpfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyJfIl0ucmVnaXN0ZXIoewogIHJ1bGU6IHsKICAgIGhvc3Q6IC9eKHd3d1wuKT9waW1wYW5kaG9zdFwuY29tJC8sCiAgICBwYXRoOiAvXlwvaW1hZ2VcL1xkKy8sCiAgICBxdWVyeTogL15cP3NpemU9b3JpZ2luYWwvLAogIH0sCiAgYXN5bmMgcmVhZHkgKCkgewogICAgY29uc3QgaW1nID0gT2JqZWN0KF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXSkoJyNvdmVyZmxvdy13cmFwcGVyIGltZy5vcmlnaW5hbCcpOwogICAgYXdhaXQgX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdLm9wZW5JbWFnZShpbWcuc3JjKTsKICB9LAp9KTsKX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siXyJdLnJlZ2lzdGVyKHsKICBydWxlOiB7CiAgICBob3N0OiAvXih3d3dcLik/cGltcGFuZGhvc3RcLmNvbSQvLAogICAgcGF0aDogL15cL2ltYWdlXC9cZCsvLAogIH0sCiAgYXN5bmMgc3RhcnQgKG0pIHsKICAgIGF3YWl0IF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXS5vcGVuTGluayhtLnBhdGggKyAnP3NpemU9b3JpZ2luYWwnKTsKICB9LAp9KTsKX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siXyJdLnJlZ2lzdGVyKHsKICBydWxlOiBbCiAgICB7CiAgICAgIGhvc3Q6IC9eKHd3d1wuKT9waXhob3N0XC50byQvLAogICAgICBwYXRoOiAvXlwvc2hvd1wvLywKICAgIH0sCiAgICB7CiAgICAgIGhvc3Q6IC9eM3hwbGFuZXRcLmNvbSQvLAogICAgICBwYXRoOiAvXlwvdmlld2ltYWdlXC8vLAogICAgfSwKICBdLAogIGFzeW5jIHJlYWR5ICgpIHsKICAgIF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXS5yZW1vdmUoJ2lmcmFtZSwgI2FkJyk7CiAgICBsZXQgbyA9IF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXS4kKCcjYWxsJyk7CiAgICBpZiAobykgewogICAgICBvLnN0eWxlLmRpc3BsYXkgPSAnJzsKICAgIH0KICAgIG8gPSBPYmplY3QoX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdKSgnI3Nob3dfaW1hZ2UsICNpbWFnZScpOwogICAgYXdhaXQgX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdLm9wZW5JbWFnZShvLnNyYyk7CiAgfSwKfSk7Cl9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIl8iXS5yZWdpc3Rlcih7CiAgcnVsZTogewogICAgaG9zdDogL14od3d3XC4pP3BpeHJvdXRlXC5jb20kLywKICB9LAogIGFzeW5jIHJlYWR5ICgpIHsKICAgIGNvbnN0IG8gPSBPYmplY3QoX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdKSgnI2Rvd25sb2FkX2JveCBpbWcjaW1ncHJldmlldy5waWMnKTsKICAgIGF3YWl0IF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXS5vcGVuSW1hZ2Uoby5zcmMpOwogIH0sCn0pOwpfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyJfIl0ucmVnaXN0ZXIoewogIHJ1bGU6IHsKICAgIGhvc3Q6IFsKICAgICAgL15wcm50c2NyXC5jb20kLywKICAgICAgL15wcm50XC5zYyQvLAogICAgXSwKICAgIHBhdGg6IC9cLmh0bWwkLywKICB9LAp9KTsKX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siXyJdLnJlZ2lzdGVyKHsKICBydWxlOiB7CiAgICBob3N0OiBbCiAgICAgIC9ecHJudHNjclwuY29tJC8sCiAgICAgIC9ecHJudFwuc2MkLywKICAgIF0sCiAgfSwKICBhc3luYyByZWFkeSAoKSB7CiAgICBjb25zdCBpID0gT2JqZWN0KF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXSkoJyNzY3JlZW5zaG90LWltYWdlJyk7CiAgICBhd2FpdCBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0ub3BlbkltYWdlKGkuc3JjKTsKICB9LAp9KTsKX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siXyJdLnJlZ2lzdGVyKHsKICBydWxlOiB7CiAgICBob3N0OiAvXnByb25waWNcLm9yZyQvLAogIH0sCiAgYXN5bmMgcmVhZHkgKCkgewogICAgY29uc3QgdXJsQmFzZUltZyA9IE9iamVjdChfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0pKCd0YWJsZS5uZXdfdGFibGUyOm50aC1jaGlsZCgxKSBpbWcubGluaycpOwogICAgY29uc3QgYmFzZVVybCA9IHVybEJhc2VJbWcuc3JjLnNwbGl0KCd0aF8nKVswXTsKICAgIGNvbnN0IGltZyA9IE9iamVjdChfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0pKCd0YWJsZS5uZXdfdGFibGUyOm50aC1jaGlsZCgyKSBpbWcubGluaycpOwogICAgY29uc3QgdXJsID0gYmFzZVVybCArIGltZy5zcmMuc3BsaXQoJ3RoXycpWzFdOwogICAgYXdhaXQgX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdLm9wZW5JbWFnZSh1cmwpOwogIH0sCn0pOwpfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyJfIl0ucmVnaXN0ZXIoewogIHJ1bGU6IHsKICAgIGhvc3Q6IC9ecXJycm9cLmNvbSQvLAogICAgcGF0aDogL14oXC9pbWFnZXNcLy4rKVwuaHRtbCQvLAogIH0sCiAgYXN5bmMgc3RhcnQgKG0pIHsKICAgIGF3YWl0IF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXS5vcGVuSW1hZ2UobS5wYXRoWzFdKTsKICB9LAp9KTsKX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siXyJdLnJlZ2lzdGVyKHsKICBydWxlOiB7CiAgICBob3N0OiAvXnJhZGlrYWxcLnJ1JC8sCiAgICBwYXRoOiAvXlwvYmlnXC8vLAogIH0sCiAgYXN5bmMgcmVhZHkgKCkgewogICAgY29uc3QgaSA9IF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXS4kKCcuYmFzZS1wYWdlX2NlbnRlciA+IGRpdjpudGgtY2hpbGQoMikgPiBpbWc6bnRoLWNoaWxkKDEpJyk7CiAgICBhd2FpdCBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0ub3BlbkltYWdlKGkuc3JjKTsKICB9LAp9KTsKKGZ1bmN0aW9uICgpIHsKICBjb25zdCBkZWZhdWx0QWN0aW9uID0gX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siXyJdLnBhcnRpYWwoYWN0aW9uLCAnI2NvbnRpbnVldG9pbWFnZSA+IGZvcm0gaW5wdXQnLCAnaW1nW2NsYXNzXj1jZW50cmVkXScpOwogIF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIl8iXS5yZWdpc3Rlcih7CiAgICBydWxlOiBbCiAgICAgIHsKICAgICAgICBob3N0OiBbCiAgICAgICAgICAvXihpbWFnZWNvcm58aW1hZ2VkZWNvZGV8aW1hZ2Vrb3xpbWFnZXNodG9ybXxpbWFnZXJhdmVuKVwuY29tJC8sCiAgICAgICAgICAvXihpbWdpY3l8aW1nc2F2dnl8aW1ndHphcnxpbWd0b3JuYWRvfGltZ2tpY2tzfGltZzJzaGFyZSlcLmNvbSQvLAogICAgICAgICAgL14oaW1ndHJpYWx8aW1ncmVwdXRhfGltZ2ZhcHBlcnxpbWdwYXJ0fGltZ2JhbGFuYXxpbWdqYXp6KVwuY29tJC8sCiAgICAgICAgICAvXihob3N0dXJpbWFnZXxncmVhc3lpbWFnZXxkYW1pbWFnZXx4eHhzY3JlZW5zfHdwYzh8ZGltdHVzKVwuY29tJC8sCiAgICAgICAgICAvXihpbWdpeHh4fGltZ2hpdHxpbWdtYWlufGltZy1wbGFuZXR8aW1nLXBheSlcLmNvbSQvLAogICAgICAgICAgL14odGluaXpvfGVyaW1nZXxuaW16c2hhcmV8aGRtb3phfGltZ2Rhd2drbnV0dHopXC5jb20kLywKICAgICAgICAgIC9eKHd3d1wuKT8oaW1nbGVtb258aW1hZ2VibGlua3N8bXVsdGlpbWcpXC5jb20kLywKICAgICAgICAgIC9eKGl8eHh4KVwuaGVudGFpeW91dHViZVwuY29tJC8sCiAgICAgICAgICAvXihpXC4pP2ltZ3NlZWRzP1wuY29tJC8sCiAgICAgICAgICAvXmhvdGltYWdlc1wuZXUkLywKICAgICAgICAgIC8oXnxcLik1NTg4OFwuZXUkLywKICAgICAgICAgIC9eKGltZ3NlcnZlfGltZ3Byb2plY3R8aW1ncHl0aG9ufGltZ3BpeHxuYXVnaHR5Z2F0ZXxnYWxsZXJ5Y2xvdWR8eHhpbWd8aW1nLXZpZXcpXC5uZXQkLywKICAgICAgICAgIC9eKHh4eHdlYmRseHh4fHRlZW5zaG90fGltYWdlb258aW1hZ2V0ZWFtfHZveWV1cmltYWdlfHRlZW5pbWFnZXxtZWdhaW1hZ2UpXC5vcmckLywKICAgICAgICAgIC9eKGltZ3N0dWRpb3xpbWdzcG90KVwub3JnJC8sCiAgICAgICAgICAvXihwaWN6fHVucG9ybilcLnNpdGUkLywKICAgICAgICAgIC9ecGljXC5ob3RpbWdcLnNpdGUkLywKICAgICAgICAgIC9eKGRhbGV6b2J1eHxlY29pbWFnZXN8dXZvbmFoYXplKVwueHl6JC8sCiAgICAgICAgICAvXnh4eFwuKHNleGV4fHBvcm5zY3JlZW4pXC54eXokLywKICAgICAgICAgIC9eYWNpZGltZ1wuY2MkLywKICAgICAgICAgIC9edW5kZXJwaWNcLmNsdWIkLywKICAgICAgICAgIC9eaW1nY2xvdWRcLmNvJC8sCiAgICAgICAgICAvXmRhcnBpeFwuZ2EkLywKICAgICAgICAgIC9eKHBvcC1pbWd8YWRzLWltZylcLmluZm8kLywKICAgICAgICAgIC9eY3Vib25hd1wubWwkLywKICAgICAgICAgIC9eKGRvbWFpbmt8cG9ybm8tcGlyYXQpXC5ydSQvLAogICAgICAgICAgL15pcGljdHVyZVwuc3UkLywKICAgICAgICAgIC9eaW1hZ2VzcHVibGljXC50ayQvLAogICAgICAgICAgL15zXC5pbWdob3N0XC50b3AkLywKICAgICAgICAgIC9ed3d3XC5ob3RpbWFnZVwudWskLywKICAgICAgICAgIC9ecGl4dXBcLnVzJC8sCiAgICAgICAgXSwKICAgICAgICBwYXRoOiAvXC9pbWctLipcLmh0bWwvLAogICAgICB9LAogICAgICB7CiAgICAgICAgaG9zdDogL14oaGVudGFpLXBvcHxzdGFyLWhlbnRhaSlcLmNvbSQvLAogICAgICAgIHBhdGg6IC9eXC9bdGldXC9pbWctLipcLmh0bWwvLAogICAgICB9LAogICAgICB7CiAgICAgICAgaG9zdDogL15pbWdraW5nXC5jbyQvLAogICAgICAgIHBhdGg6IC9eXC9pbWc0Py0uKlwuaHRtbC8sCiAgICAgIH0sCiAgICAgIHsKICAgICAgICBob3N0OiAvXmltYVwuZ3kkLywKICAgICAgICBwYXRoOiAvXlwvaVwvLiskLywKICAgICAgfSwKICAgICAgewogICAgICAgIGhvc3Q6IC9ecGljbW96YVwuY29tJC8sCiAgICAgICAgcGF0aDogL15cL1wvP2ltZy0uKlwuaHRtbCQvLAogICAgICB9LAogICAgXSwKICAgIHJlYWR5OiBkZWZhdWx0QWN0aW9uLAogIH0pOwogIF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIl8iXS5yZWdpc3Rlcih7CiAgICBydWxlOiB7CiAgICAgIGhvc3Q6IC9eaW1ncmF0XC5jb20kLywKICAgICAgcGF0aDogL15cL2ltZy0uKlwuaHRtbC8sCiAgICB9LAogICAgcmVhZHk6IF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIl8iXS5wYXJ0aWFsKGFjdGlvbiwgJyNjbG9zZScsICcjbWFpbl9pbWFnZSBpbWcuY2VudGVyLWJsb2NrLmltZy1yZXNwb25zaXZlJyksCiAgfSk7CiAgX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siXyJdLnJlZ2lzdGVyKHsKICAgIHJ1bGU6IHsKICAgICAgaG9zdDogL14od3d3XC4pP2ltZ2ZyZXNoXC5pbmZvJC8sCiAgICAgIHBhdGg6IC9eXC9pbWctLipcLmh0bWwkLywKICAgIH0sCiAgICBhc3luYyByZWFkeSAoKSB7CiAgICAgIF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXS5yZW1vdmUoJ2lmcmFtZScpOwogICAgICBsZXQgbm9kZSA9IF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXS4kKCcjY29udGludWV0b2ltYWdlID4gZm9ybSBpbnB1dCcpOwogICAgICBpZiAobm9kZSkgewogICAgICAgIG5vZGUuY2xpY2soKTsKICAgICAgICBub2RlLmNsaWNrKCk7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXS5yZXNldENvb2tpZXMoKTsKICAgICAgbm9kZSA9IF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXS4kKCdpbWdbY2xhc3NePWNlbnRyZWRdJyk7CiAgICAgIGlmIChub2RlKSB7CiAgICAgICAgYXdhaXQgX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdLm9wZW5JbWFnZShub2RlLnNyYyk7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIGF3YWl0IF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXS5wb3N0KHdpbmRvdy5sb2NhdGlvbi5ocmVmLnRvU3RyaW5nKCksIHsKICAgICAgICBjdGk6IDEsCiAgICAgICAgcmVmOiAnJywKICAgICAgICByYzogMSwKICAgICAgICBycDogMSwKICAgICAgICBidDogMCwKICAgICAgICBidzogJ2VkZ2UnLAogICAgICB9KTsKICAgICAgd2luZG93LmxvY2F0aW9uLnJlbG9hZCgpOwogICAgfSwKICB9KTsKICBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyJfIl0ucmVnaXN0ZXIoewogICAgcnVsZTogWwogICAgICB7CiAgICAgICAgaG9zdDogL15pbWdraW5nXC5jbyQvLAogICAgICAgIHBhdGg6IC9eXC9pbWdzLS4qXC5odG1sLywKICAgICAgfSwKICAgICAgewogICAgICAgIGhvc3Q6IC9eKGltZ2tpbmdzfGltYWdlcmFyKVwuY29tJC8sCiAgICAgICAgcGF0aDogL15cL2ltZy0uKlwuaHRtbC8sCiAgICAgIH0sCiAgICBdLAogICAgYXN5bmMgcmVhZHkgKCkgewogICAgICBjb25zdCB1cmwgPSBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0ud2luZG93LmxpbmtpZDsKICAgICAgYXdhaXQgX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdLm9wZW5JbWFnZSh1cmwpOwogICAgfSwKICB9KTsKICBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyJfIl0ucmVnaXN0ZXIoewogICAgcnVsZTogewogICAgICBob3N0OiAvXmltZ2tpbmdzXC5jb20kLywKICAgICAgcGF0aDogL15cL2ltZzItLipcLmh0bWwvLAogICAgfSwKICAgIHJlYWR5OiBkZWZhdWx0QWN0aW9uLAogIH0pOwogIF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIl8iXS5yZWdpc3Rlcih7CiAgICBydWxlOiB7CiAgICAgIGhvc3Q6IC9eaW1ncHJpbWVcLmNvbSQvLAogICAgICBwYXRoOiAvXlwvaW1nYS11XC8oLispXC5qcGVnXC5odG1sLywKICAgIH0sCiAgICBhc3luYyBzdGFydCAoKSB7CiAgICAgIGNvbnN0IHBhdGggPSB3aW5kb3cubG9jYXRpb24uaHJlZi5yZXBsYWNlKCcvaW1nYS11JywgJy91JykucmVwbGFjZSgnLmh0bWwnLCAnJyk7CiAgICAgIGF3YWl0IF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXS5vcGVuTGluayhwYXRoKTsKICAgIH0sCiAgfSk7CiAgX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siXyJdLnJlZ2lzdGVyKHsKICAgIHJ1bGU6IHsKICAgICAgaG9zdDogL15wb3JueWZhcFwuY29tJC8sCiAgICAgIHBhdGg6IC9cL3BpY1wvLywKICAgIH0sCiAgICBhc3luYyByZWFkeSAoKSB7CiAgICAgIGNvbnN0IHAgPSBPYmplY3QoX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdKSgnaW1nI215SW1nJyk7CiAgICAgIGF3YWl0IF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXS5vcGVuSW1hZ2UocC5zcmMpOwogICAgfSwKICB9KTsKICBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyJfIl0ucmVnaXN0ZXIoewogICAgcnVsZTogewogICAgICBob3N0OiAvXmZ1bmltZ1wubmV0JC8sCiAgICAgIHBhdGg6IC9cL2ltZy0uKlwuaHRtbC8sCiAgICB9LAogICAgYXN5bmMgc3RhcnQgKCkgewogICAgICBjb25zdCBwYXRoID0gd2luZG93LmxvY2F0aW9uLmhyZWYucmVwbGFjZSgnL2ltZy0nLCAnL2ltZzMtJyk7CiAgICAgIGF3YWl0IF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXS5vcGVuTGluayhwYXRoKTsKICAgIH0sCiAgfSk7CiAgX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siXyJdLnJlZ2lzdGVyKHsKICAgIHJ1bGU6IHsKICAgICAgaG9zdDogL15mdW5pbWdcLm5ldCQvLAogICAgICBwYXRoOiAvXC9pbWczLS4qXC5odG1sLywKICAgIH0sCiAgICBhc3luYyByZWFkeSAoKSB7CiAgICAgIGNvbnN0IGkgPSBPYmplY3QoX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdKSgnI2NvbnRpbnVldG9pbWFnZSBpbWcnKTsKICAgICAgYXdhaXQgX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdLm9wZW5JbWFnZShpLnNyYyk7CiAgICB9LAogIH0pOwogIF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIl8iXS5yZWdpc3Rlcih7CiAgICBydWxlOiB7CiAgICAgIGhvc3Q6IC9eMjJwaXh4XC54eXokLywKICAgICAgcGF0aDogL15cL2lhLVtpb11cLyguKylcLmpwZWdcLmh0bWwvLAogICAgfSwKICAgIGFzeW5jIHN0YXJ0ICgpIHsKICAgICAgY29uc3QgcGF0aCA9IHdpbmRvdy5sb2NhdGlvbi5ocmVmLnJlcGxhY2UoJy9pYS0nLCAnLycpLnJlcGxhY2UoJy5odG1sJywgJycpOwogICAgICBhd2FpdCBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0ub3BlbkxpbmsocGF0aCk7CiAgICB9LAogIH0pOwogIF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIl8iXS5yZWdpc3Rlcih7CiAgICBydWxlOiB7CiAgICAgIGhvc3Q6IC9eMjJwaXh4XC54eXokLywKICAgICAgcGF0aDogL15cL3gtb1wvKC4rKVwuanBlZ1wuaHRtbC8sCiAgICB9LAogICAgYXN5bmMgc3RhcnQgKCkgewogICAgICBjb25zdCBwYXRoID0gd2luZG93LmxvY2F0aW9uLmhyZWYucmVwbGFjZSgnL3gtJywgJy8nKS5yZXBsYWNlKCcuaHRtbCcsICcnKTsKICAgICAgYXdhaXQgX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdLm9wZW5MaW5rKHBhdGgpOwogICAgfSwKICB9KTsKICAgIF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIl8iXS5yZWdpc3Rlcih7CiAgICBydWxlOiB7CiAgICAgIGhvc3Q6IC9eMjJwaXh4XC54eXokLywKICAgICAgcGF0aDogL15cL3ktb1wvKC4rKVwuanBlZ1wuaHRtbC8sCiAgICB9LAogICAgYXN5bmMgc3RhcnQgKCkgewogICAgICBjb25zdCBwYXRoID0gd2luZG93LmxvY2F0aW9uLmhyZWYucmVwbGFjZSgnL3ktJywgJy8nKS5yZXBsYWNlKCcuaHRtbCcsICcnKTsKICAgICAgYXdhaXQgX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdLm9wZW5MaW5rKHBhdGgpOwogICAgfSwKICB9KTsKICBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyJfIl0ucmVnaXN0ZXIoewogICAgcnVsZTogewogICAgICBob3N0OiAvXjIycGl4eFwueHl6JC8sCiAgICAgIHBhdGg6IC9eXC94LWlcLyguKylcLmpwZWdcLmh0bWwvLAogICAgfSwKICAgIGFzeW5jIHN0YXJ0ICgpIHsKICAgICAgY29uc3QgcGF0aCA9IHdpbmRvdy5sb2NhdGlvbi5ocmVmLnJlcGxhY2UoJy94JywgJy95Jyk7CiAgICAgIGF3YWl0IF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXS5vcGVuTGluayhwYXRoKTsKICAgIH0sCiAgfSk7CiAgX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siXyJdLnJlZ2lzdGVyKHsKICAgIHJ1bGU6IHsKICAgICAgaG9zdDogL150cnVlaW1nXC54eXokLywKICAgICAgcGF0aDogL15cL3UtYlwvKC4rKVwuanBlZ1wuaHRtbC8sCiAgICB9LAogICAgYXN5bmMgc3RhcnQgKCkgewogICAgICBjb25zdCBwYXRoID0gd2luZG93LmxvY2F0aW9uLmhyZWYucmVwbGFjZSgnL3UtJywgJy8nKS5yZXBsYWNlKCcuaHRtbCcsICcnKTsKICAgICAgYXdhaXQgX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdLm9wZW5MaW5rKHBhdGgpOwogICAgfSwKICB9KTsKICBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyJfIl0ucmVnaXN0ZXIoewogICAgcnVsZTogWwogICAgICB7CiAgICAgICAgaG9zdDogL15pbWFnZXJhclwuY29tJC8sCiAgICAgICAgcGF0aDogL15cL2ltZzItLywKICAgICAgfSwKICAgICAgewogICAgICAgIGhvc3Q6IC9eaW1na2luZ1wuY28kLywKICAgICAgICBwYXRoOiAvXlwvaW1nW3YzXS0uKlwuaHRtbC8sCiAgICAgIH0sCiAgICAgIHsKICAgICAgICBob3N0OiAvXnBpY3N0YXRlXC5jb20kLywKICAgICAgICBwYXRoOiAvXlwvdmlld1wvZnVsbFwvLiovLAogICAgICB9LAogICAgXSwKICAgIGFzeW5jIHJlYWR5ICgpIHsKICAgICAgY29uc3QgaSA9IE9iamVjdChfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0pKCdpbWdbYWx0XScpOwogICAgICBhd2FpdCBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0ub3BlbkltYWdlKGkuc3JjKTsKICAgIH0sCiAgfSk7CiAgX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siXyJdLnJlZ2lzdGVyKHsKICAgIHJ1bGU6IHsKICAgICAgaG9zdDogL15pbWdwcmltZVwuY29tJC8sCiAgICAgIHBhdGg6IC9eXC9pbWcuKlwuaHRtbCQvLAogICAgfSwKICAgIGFzeW5jIHJlYWR5ICgpIHsKICAgICAgbGV0IGEgPSBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0uJCgnI2NvbnRpbnVldG9pbWFnZSBhJyk7CiAgICAgIGlmIChhKSB7CiAgICAgICAgYXdhaXQgX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdLm9wZW5MaW5rKGEuaHJlZik7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIGEgPSBPYmplY3QoX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdKSgnaW1nW2FsdF0nKTsKICAgICAgYXdhaXQgX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdLm9wZW5JbWFnZShhLnNyYyk7CiAgICB9LAogIH0pOwogIF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIl8iXS5yZWdpc3Rlcih7CiAgICBydWxlOiB7CiAgICAgIGhvc3Q6IC9eaW14XC50byQvLAogICAgICBwYXRoOiBbCiAgICAgICAgL15cL2ltZy0uKlwuaHRtbC8sCiAgICAgICAgL15cL2lcLy4qLywKICAgICAgXSwKICAgIH0sCiAgICByZWFkeTogX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siXyJdLnBhcnRpYWwoYWN0aW9uLCAnI2NvbnRpbnVlYnV0dG9uLCAjY29udGludWV0b2ltYWdlIGlucHV0W3R5cGU9InN1Ym1pdCJdJywgJ2ltZ1tjbGFzc149Y2VudHJlZF0nKSwKICB9KTsKICBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyJfIl0ucmVnaXN0ZXIoewogICAgcnVsZTogewogICAgICBob3N0OiBbCiAgICAgICAgL14od3d3XC4pP2ltZ2RyaXZlXC5uZXQkLywKICAgICAgICAvXih3d3dcLik/KGltZ3RheGl8aW1nd2FsbGV0fGltZ2FkdWx0KVwuY29tJC8sCiAgICAgIF0sCiAgICAgIHBhdGg6IC9eXC9pbWctLipcLmh0bWwkLywKICAgIH0sCiAgICBhc3luYyByZWFkeSAoKSB7CiAgICAgIGxldCBtID0gT2JqZWN0KF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXSkoJ21ldGFbcHJvcGVydHk9Im9nOmltYWdlIl0nKTsKICAgICAgbSA9IG0uY29udGVudC5yZXBsYWNlKCdzbWFsbCcsICdiaWcnKTsKICAgICAgYXdhaXQgX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdLm9wZW5JbWFnZShtKTsKICAgIH0sCiAgfSk7CiAgX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siXyJdLnJlZ2lzdGVyKHsKICAgIHJ1bGU6IHsKICAgICAgaG9zdDogL15pbWFnZXNjYW5uZXJcLmNjJC8sCiAgICAgIHBhdGg6IC9eXC8uKlwuanBnXC5odG1sLywKICAgIH0sCiAgICBhc3luYyBzdGFydCAoKSB7CiAgICAgIGNvbnN0IHBhdGggPSB3aW5kb3cubG9jYXRpb24uaHJlZi5yZXBsYWNlKCcuaHRtbCcsICcnKTsKICAgICAgYXdhaXQgX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdLm9wZW5MaW5rKHBhdGgpOwogICAgfSwKICB9KTsKICBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyJfIl0ucmVnaXN0ZXIoewogICAgcnVsZTogJ2h0dHBzOi8vaW1nY2xvdWQucHcvaW1hZ2UvKicsCiAgICBhc3luYyByZWFkeSAoKSB7CiAgICAgIGNvbnN0IGwgPSBPYmplY3QoX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdKSgnbGlua1tyZWw9ImltYWdlX3NyYyJdJyk7CiAgICAgIGF3YWl0IF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXS5vcGVuSW1hZ2UobC5ocmVmKTsKICAgIH0sCiAgfSk7CiAgYXN5bmMgZnVuY3Rpb24gYWN0aW9uIChmaXJzdFNlbGVjdG9yLCBzZWNvbmRTZWxlY3RvcikgewogICAgX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdLnJlbW92ZSgnaWZyYW1lLCAjYWRibG9ja19kZXRlY3QsIC5wb3B1cE92ZXJsYXknKTsKICAgIGxldCBub2RlID0gX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdLiQoZmlyc3RTZWxlY3Rvcik7CiAgICBpZiAobm9kZSkgewogICAgICBub2RlID0gZmluZEZpcnN0Rm9ybShub2RlKTsKICAgICAgZG9jdW1lbnQuYm9keS5pbm5lckhUTUwgPSBub2RlLm91dGVySFRNTDsKICAgICAgbm9kZSA9IE9iamVjdChfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0pKCdmb3JtIGlucHV0Jyk7CiAgICAgIG5vZGUuY2xpY2soKTsKICAgICAgcmV0dXJuOwogICAgfQogICAgbm9kZSA9IE9iamVjdChfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0pKHNlY29uZFNlbGVjdG9yKTsKICAgIGF3YWl0IF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXS5vcGVuSW1hZ2Uobm9kZS5zcmMpOwogIH0KICBmdW5jdGlvbiBmaW5kRmlyc3RGb3JtIChjaGlsZCkgewogICAgd2hpbGUgKGNoaWxkICYmIGNoaWxkLmxvY2FsTmFtZSAhPT0gJ2Zvcm0nKSB7CiAgICAgIGNoaWxkID0gY2hpbGQucGFyZW50RWxlbWVudDsKICAgIH0KICAgIHJldHVybiBjaGlsZDsKICB9Cn0pKCk7Cl9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIl8iXS5yZWdpc3Rlcih7CiAgcnVsZTogewogICAgaG9zdDogL15waWNcLnMtamF2XC5jb20kLywKICB9LAogIGFzeW5jIHJlYWR5ICgpIHsKICAgIGNvbnN0IGltZyA9IE9iamVjdChfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0pKCcud3AtcG9zdC1pbWFnZScpOwogICAgYXdhaXQgX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdLm9wZW5JbWFnZShpbWcuc3JjKTsKICB9LAp9KTsKX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siXyJdLnJlZ2lzdGVyKHsKICBydWxlOiBbCiAgICAnaHR0cDovL3NjcmVlbmxpc3QucnUvZGV0YWlscy5waHA/aW1hZ2VfaWQ9KicsCiAgICAnaHR0cDovL3d3dy5pbWFnZW5ldHouZGUvKi8qLmh0bWwnLAogIF0sCiAgYXN5bmMgcmVhZHkgKCkgewogICAgY29uc3QgaW1nID0gT2JqZWN0KF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXSkoJyNwaWN0dXJlJyk7CiAgICBhd2FpdCBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0ub3BlbkltYWdlKGltZy5zcmMpOwogIH0sCn0pOwpfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyJfIl0ucmVnaXN0ZXIoewogIHJ1bGU6ICdodHRwOi8vd3d3LnN1YmlyaW1hZ2VuZXMuY29tLyouaHRtbCcsCiAgYXN5bmMgcmVhZHkgKCkgewogICAgY29uc3QgaSA9IE9iamVjdChfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0pKCcjSW1hZ2VuVmlzdWFsaXphZGEnKTsKICAgIGF3YWl0IF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXS5vcGVuSW1hZ2UoaS5zcmMpOwogIH0sCn0pOwpfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyJfIl0ucmVnaXN0ZXIoewogIHJ1bGU6ICdodHRwOi8vdGlueXBpYy5jb20vdmlldy5waHA/cGljPSonLAogIGFzeW5jIHJlYWR5ICgpIHsKICAgIGNvbnN0IGkgPSBPYmplY3QoX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdKSgnI2ltZ0VsZW1lbnQnKTsKICAgIGF3YWl0IF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXS5vcGVuSW1hZ2UoaS5zcmMpOwogIH0sCn0pOwpfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyJfIl0ucmVnaXN0ZXIoewogIHJ1bGU6IHsKICAgIGhvc3Q6IC9ed3d3XC50dXJib2ltYWdlaG9zdFwuY29tJC8sCiAgICBwYXRoOiAvXlwvcFwvLywKICB9LAogIGFzeW5jIHJlYWR5ICgpIHsKICAgIGNvbnN0IGkgPSBPYmplY3QoX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdKSgnI2ltYWdlaWQnKTsKICAgIGF3YWl0IF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXS5vcGVuSW1hZ2UoaS5zcmMpOwogIH0sCn0pOwpfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyJfIl0ucmVnaXN0ZXIoewogIHJ1bGU6IHsKICAgIGhvc3Q6IFsKICAgICAgL154YW91dGNob3VjXC5saXZlJC8sCiAgICAgIC9eeHh4XC5mb3Brb2RpYWtcLnNpdGUkLywKICAgICAgL15ibGFtZWxlc3NcLndvcmskLywKICAgIF0sCiAgICBwYXRoOiAvXlwvaW1nLS8sCiAgfSwKICBhc3luYyByZWFkeSAoKSB7CiAgICBpZiAoZG9jdW1lbnQucmVmZXJyZXIgPT0gZG9jdW1lbnQubG9jYXRpb24uaHJlZikgewogICAgICBsZXQgaW1nID0gX0FEU0JZUEFTU0VSX05BTUVTUEFDRV9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siJCJdLiQoJyNjb250YWluZXIgPiBhID4gaW1nJyk7CiAgICAgIGlmICghaW1nKSB7CiAgICAgICAgaW1nID0gT2JqZWN0KF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXSkoJyNjb250YWluZXIgPiBpbWcnKTsKICAgICAgfQogICAgICBhd2FpdCBfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0ub3BlbkltYWdlKGltZy5zcmMpOwogICAgfSBlbHNlIHsKICAgICAgY29uc3QgZiA9IE9iamVjdChfQURTQllQQVNTRVJfTkFNRVNQQUNFX19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyIkIl0pKCdmb3JtJyk7CiAgICAgIGF3YWl0IF9BRFNCWVBBU1NFUl9OQU1FU1BBQ0VfX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIiQiXS5vcGVuTGluayhmLmFjdGlvbiwgeyAKICAgICAgICBwb3N0OiB7CiAgICAgICAgICBpbWdDb250aW51ZTogJ0NvbnRpbnVlIHRvIGltYWdlIC4uLicsCiAgICAgICAgfQogICAgICB9KTsKICAgIH0KICB9Cn0pOwogfSksCiAoZnVuY3Rpb24obW9kdWxlLCBfX3dlYnBhY2tfZXhwb3J0c19fLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7CiJ1c2Ugc3RyaWN0IjsKX193ZWJwYWNrX3JlcXVpcmVfXy5yKF9fd2VicGFja19leHBvcnRzX18pOwogX193ZWJwYWNrX3JlcXVpcmVfXy5kKF9fd2VicGFja19leHBvcnRzX18sICJfIiwgZnVuY3Rpb24oKSB7IHJldHVybiBfOyB9KTsKIF9fd2VicGFja19yZXF1aXJlX18uZChfX3dlYnBhY2tfZXhwb3J0c19fLCAiJCIsIGZ1bmN0aW9uKCkgeyByZXR1cm4gJDsgfSk7CiB2YXIgdXRpbF9hamF4X19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDgpOwogdmFyIHV0aWxfY29va2llX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8xX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDkpOwogdmFyIHV0aWxfY29yZV9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMl9fID0gX193ZWJwYWNrX3JlcXVpcmVfXygxKTsKIHZhciB1dGlsX2Rpc3BhdGNoZXJfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzNfXyA9IF9fd2VicGFja19yZXF1aXJlX18oMik7CiB2YXIgdXRpbF9kb21fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzRfXyA9IF9fd2VicGFja19yZXF1aXJlX18oMTApOwogdmFyIHV0aWxfaW1hZ2VfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzVfXyA9IF9fd2VicGFja19yZXF1aXJlX18oMTEpOwogdmFyIHV0aWxfbGlua19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfNl9fID0gX193ZWJwYWNrX3JlcXVpcmVfXygxMik7CiB2YXIgdXRpbF9sb2dnZXJfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzdfXyA9IF9fd2VicGFja19yZXF1aXJlX18oNSk7CiB2YXIgdXRpbF9taXNjX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV84X18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEzKTsKIHZhciB1dGlsX3BsYXRmb3JtX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV85X18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDMpOwpjb25zdCBfID0gewogIEFkc0J5cGFzc2VyRXJyb3I6IHV0aWxfY29yZV9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMl9fWyJBZHNCeXBhc3NlckVycm9yIl0sCiAgZXZpbDogdXRpbF9taXNjX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV84X19bImV2aWwiXSwKICBmaW5kOiB1dGlsX2NvcmVfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzJfX1siZmluZCJdLAogIGZvckVhY2g6IHV0aWxfY29yZV9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMl9fWyJmb3JFYWNoIl0sCiAgZ2VuZXJhdGVSYW5kb21JUDogdXRpbF9taXNjX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV84X19bImdlbmVyYXRlUmFuZG9tSVAiXSwKICBpbmZvOiB1dGlsX2xvZ2dlcl9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfN19fWyJpbmZvIl0sCiAgbm9uZTogdXRpbF9jb3JlX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8yX19bIm5vbmUiXSwKICBwYXJ0aWFsOiB1dGlsX2NvcmVfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzJfX1sicGFydGlhbCJdLAogIHJlZ2lzdGVyOiB1dGlsX2Rpc3BhdGNoZXJfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzNfX1sicmVnaXN0ZXIiXSwKICB0cnlFdmVyeTogdXRpbF9jb3JlX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8yX19bInRyeUV2ZXJ5Il0sCiAgd2FpdDogdXRpbF9jb3JlX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8yX19bIndhaXQiXSwKICB3YXJuOiB1dGlsX2xvZ2dlcl9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfN19fWyJ3YXJuIl0sCn07CmZ1bmN0aW9uICQgKHNlbGVjdG9yLCBjb250ZXh0KSB7CiAgcmV0dXJuIE9iamVjdCh1dGlsX2RvbV9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfNF9fWyJxdWVyeVNlbGVjdG9yIl0pKHNlbGVjdG9yLCBjb250ZXh0KTsKfQokLiQgPSB1dGlsX2RvbV9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfNF9fWyJxdWVyeVNlbGVjdG9yT3JOdWxsIl07CiQuJCQgPSB1dGlsX2RvbV9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfNF9fWyJxdWVyeVNlbGVjdG9yQWxsIl07CiQuYmxvY2sgPSB1dGlsX2RvbV9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfNF9fWyJibG9jayJdOwokLmdldCA9IHV0aWxfYWpheF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyJnZXQiXTsKJC5nZXRDb29raWUgPSB1dGlsX2Nvb2tpZV9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMV9fWyJnZXRDb29raWUiXTsKJC5udWtlID0gdXRpbF9taXNjX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV84X19bIm51a2UiXTsKJC5vcGVuSW1hZ2UgPSB1dGlsX2ltYWdlX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV81X19bIm9wZW5JbWFnZSJdOwokLm9wZW5MaW5rID0gdXRpbF9saW5rX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV82X19bIm9wZW5MaW5rIl07CiQucG9zdCA9IHV0aWxfYWpheF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyJwb3N0Il07CiQucmVtb3ZlID0gdXRpbF9kb21fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzRfX1sicmVtb3ZlIl07CiQucmVtb3ZlQWxsVGltZXIgPSB1dGlsX21pc2NfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzhfX1sicmVtb3ZlQWxsVGltZXIiXTsKJC5yZXNldENvb2tpZXMgPSB1dGlsX2Nvb2tpZV9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMV9fWyJyZXNldENvb2tpZXMiXTsKJC5zZWFyY2hGcm9tU2NyaXB0cyA9IHV0aWxfZG9tX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV80X19bInNlYXJjaEZyb21TY3JpcHRzIl07CiQuc2V0Q29va2llID0gdXRpbF9jb29raWVfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzFfX1sic2V0Q29va2llIl07CiQudG9ET00gPSB1dGlsX2RvbV9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfNF9fWyJ0b0RPTSJdOwokLndpbmRvdyA9IHV0aWxfcGxhdGZvcm1fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzlfX1sidXN3Il07CiB9KSwKIChmdW5jdGlvbihtb2R1bGUsIF9fd2VicGFja19leHBvcnRzX18sIF9fd2VicGFja19yZXF1aXJlX18pIHsKInVzZSBzdHJpY3QiOwpfX3dlYnBhY2tfcmVxdWlyZV9fLnIoX193ZWJwYWNrX2V4cG9ydHNfXyk7CiBfX3dlYnBhY2tfcmVxdWlyZV9fLmQoX193ZWJwYWNrX2V4cG9ydHNfXywgImdldCIsIGZ1bmN0aW9uKCkgeyByZXR1cm4gZ2V0OyB9KTsKIF9fd2VicGFja19yZXF1aXJlX18uZChfX3dlYnBhY2tfZXhwb3J0c19fLCAicG9zdCIsIGZ1bmN0aW9uKCkgeyByZXR1cm4gcG9zdDsgfSk7CiB2YXIgdXRpbF9jb3JlX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEpOwogdmFyIHV0aWxfcGxhdGZvcm1fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzFfXyA9IF9fd2VicGFja19yZXF1aXJlX18oMyk7CiB2YXIgdXRpbF9sb2dnZXJfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzJfXyA9IF9fd2VicGFja19yZXF1aXJlX18oNSk7CmNsYXNzIEFqYXhFcnJvciBleHRlbmRzIHV0aWxfY29yZV9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyJBZHNCeXBhc3NlckVycm9yIl0gewogIGNvbnN0cnVjdG9yIChtZXRob2QsIHVybCwgZGF0YSwgaGVhZGVycywgc3RhdHVzLCByZXNwb25zZSkgewogICAgc3VwZXIoYCR7bWV0aG9kfSAke3VybH0gZ290ICR7c3RhdHVzfWApOwogICAgdGhpcy5fbWV0aG9kID0gbWV0aG9kOwogICAgdGhpcy5fdXJsID0gdXJsOwogICAgdGhpcy5fZGF0YSA9IGRhdGE7CiAgICB0aGlzLl9oZWFkZXJzID0gaGVhZGVyczsKICAgIHRoaXMuX3N0YXR1cyA9IHN0YXR1czsKICAgIHRoaXMuX3Jlc3BvbnNlID0gcmVzcG9uc2U7CiAgfQogIGdldCBuYW1lICgpIHsKICAgIHJldHVybiAnQWpheEVycm9yJzsKICB9CiAgZ2V0IG1ldGhvZCAoKSB7CiAgICByZXR1cm4gdGhpcy5fbWV0aG9kOwogIH0KICBnZXQgdXJsICgpIHsKICAgIHJldHVybiB0aGlzLl91cmw7CiAgfQogIGdldCBkYXRhICgpIHsKICAgIHJldHVybiB0aGlzLl9kYXRhOwogIH0KICBnZXQgaGVhZGVycyAoKSB7CiAgICByZXR1cm4gdGhpcy5faGVhZGVyczsKICB9CiAgZ2V0IHN0YXR1cyAoKSB7CiAgICByZXR1cm4gdGhpcy5fc3RhdHVzOwogIH0KICBnZXQgcmVzcG9uc2UgKCkgewogICAgcmV0dXJuIHRoaXMuX3Jlc3BvbnNlOwogIH0KfQpmdW5jdGlvbiAqIGZsYXR0ZW5PYmplY3QgKG9iamVjdCkgewogIGlmICghb2JqZWN0KSB7CiAgICByZXR1cm47CiAgfQogIGZvciAoY29uc3QgW2ssIHZdIG9mIE9iamVjdC5lbnRyaWVzKG9iamVjdCkpIHsKICAgIGlmIChBcnJheS5pc0FycmF5KHYpKSB7CiAgICAgIGZvciAoY29uc3Qgdl8gb2YgdikgewogICAgICAgIHlpZWxkIFtbaywgJyddLCB2X107CiAgICAgIH0KICAgIH0gZWxzZSBpZiAodHlwZW9mIHYgPT09ICdvYmplY3QnKSB7CiAgICAgIGZvciAoY29uc3QgW2tfLCB2X10gb2YgZmxhdHRlbk9iamVjdCh2KSkgewogICAgICAgIHlpZWxkIFtbaywgLi4ua19dLCB2X107CiAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgIHlpZWxkIFtba10sIHZdOwogICAgfQogIH0KfQpmdW5jdGlvbiBmbGF0dGVuS2V5IChrZXlMaXN0KSB7CiAgY29uc3QgW2hlYWQsIC4uLnJlc3RdID0ga2V5TGlzdDsKICByZXR1cm4gYCR7aGVhZH0ke3Jlc3QubWFwKF8gPT4gYFske199XWApfWA7Cn0KZnVuY3Rpb24gZGVlcEpvaW4gKHByZWZpeCwgb2JqZWN0KSB7CiAgY29uc3Qga2V5cyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKG9iamVjdCk7CiAgY29uc3QgbWFwcGVkID0gT2JqZWN0KHV0aWxfY29yZV9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyJtYXAiXSkoa2V5cywgKGspID0+IHsKICAgIGNvbnN0IHYgPSBvYmplY3Rba107CiAgICBjb25zdCBrZXkgPSBgJHtwcmVmaXh9WyR7a31dYDsKICAgIGlmICh0eXBlb2YgdiA9PT0gJ29iamVjdCcpIHsKICAgICAgcmV0dXJuIGRlZXBKb2luKGtleSwgdik7CiAgICB9CiAgICBjb25zdCB0bXAgPSBba2V5LCB2XS5tYXAoZW5jb2RlVVJJQ29tcG9uZW50KTsKICAgIHJldHVybiB0bXAuam9pbignPScpOwogIH0pOwogIHJldHVybiBtYXBwZWQuam9pbignJicpOwp9CmZ1bmN0aW9uIHRvUXVlcnkgKGRhdGEpIHsKICBjb25zdCB0eXBlID0gdHlwZW9mIGRhdGE7CiAgaWYgKGRhdGEgPT09IG51bGwgfHwgKHR5cGUgIT09ICdzdHJpbmcnICYmIHR5cGUgIT09ICdvYmplY3QnKSkgewogICAgcmV0dXJuICcnOwogIH0KICBpZiAodHlwZSA9PT0gJ3N0cmluZycpIHsKICAgIHJldHVybiBkYXRhOwogIH0KICBpZiAoZGF0YSBpbnN0YW5jZW9mIFN0cmluZykgewogICAgcmV0dXJuIGRhdGEudG9TdHJpbmcoKTsKICB9CiAgY29uc3Qga2V5cyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKGRhdGEpOwogIHJldHVybiBPYmplY3QodXRpbF9jb3JlX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIm1hcCJdKShrZXlzLCAoaykgPT4gewogICAgY29uc3QgdiA9IGRhdGFba107CiAgICBpZiAodHlwZW9mIHYgPT09ICdvYmplY3QnKSB7CiAgICAgIHJldHVybiBkZWVwSm9pbihrLCB2KTsKICAgIH0KICAgIGNvbnN0IHRtcCA9IFtrLCB2XS5tYXAoZW5jb2RlVVJJQ29tcG9uZW50KTsKICAgIHJldHVybiB0bXAuam9pbignPScpOwogIH0pLmpvaW4oJyYnKTsKfQpmdW5jdGlvbiB0b0Zvcm0gKGRhdGEpIHsKICBjb25zdCB0eXBlID0gdHlwZW9mIGRhdGE7CiAgaWYgKGRhdGEgPT09IG51bGwgfHwgKHR5cGUgIT09ICdzdHJpbmcnICYmIHR5cGUgIT09ICdvYmplY3QnKSkgewogICAgcmV0dXJuICcnOwogIH0KICBpZiAodHlwZSA9PT0gJ3N0cmluZycpIHsKICAgIHJldHVybiBkYXRhOwogIH0KICBpZiAoZGF0YSBpbnN0YW5jZW9mIFN0cmluZykgewogICAgcmV0dXJuIGRhdGEudG9TdHJpbmcoKTsKICB9CiAgY29uc3QgZm9ybSA9IG5ldyBGb3JtRGF0YSgpOwogIGZvciAoY29uc3QgW2ssIHZdIG9mIGZsYXR0ZW5PYmplY3QoZGF0YSkpIHsKICAgIGZvcm0uYXBwZW5kKGZsYXR0ZW5LZXkoayksIHYpOwogIH0KICByZXR1cm4gZm9ybTsKfQpmdW5jdGlvbiBhamF4IChtZXRob2QsIHVybCwgZGF0YSwgaGVhZGVycykgewogIE9iamVjdCh1dGlsX2xvZ2dlcl9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMl9fWyJkZWJ1ZyJdKSgnYWpheCcsIG1ldGhvZCwgdXJsLCBkYXRhLCBoZWFkZXJzKTsKICBjb25zdCBsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYScpOwogIGwuaHJlZiA9IHVybDsKICBjb25zdCByZXFIb3N0ID0gbC5ob3N0bmFtZTsKICBjb25zdCBvdmVycmlkZUhlYWRlcnMgPSB7CiAgICBIb3N0OiByZXFIb3N0IHx8IHdpbmRvdy5sb2NhdGlvbi5ob3N0LAogICAgT3JpZ2luOiB3aW5kb3cubG9jYXRpb24ub3JpZ2luLAogICAgUmVmZXJlcjogd2luZG93LmxvY2F0aW9uLmhyZWYsCiAgICAnWC1SZXF1ZXN0ZWQtV2l0aCc6ICdYTUxIdHRwUmVxdWVzdCcsCiAgfTsKICBPYmplY3QodXRpbF9jb3JlX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bImZvckVhY2giXSkob3ZlcnJpZGVIZWFkZXJzLCAodiwgaykgPT4gewogICAgaWYgKGhlYWRlcnNba10gPT09IHV0aWxfY29yZV9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyJub25lIl0pIHsKICAgICAgZGVsZXRlIGhlYWRlcnNba107CiAgICB9IGVsc2UgewogICAgICBoZWFkZXJzW2tdID0gdjsKICAgIH0KICB9KTsKICBpZiAoZGF0YSkgewogICAgaWYgKGhlYWRlcnNbJ0NvbnRlbnQtVHlwZSddLmluZGV4T2YoJ2pzb24nKSA+PSAwKSB7CiAgICAgIGRhdGEgPSBKU09OLnN0cmluZ2lmeShkYXRhKTsKICAgIH0gZWxzZSBpZiAoaGVhZGVyc1snQ29udGVudC1UeXBlJ10uaW5kZXhPZignbXVsdGlwYXJ0JykgPj0gMCkgewogICAgICBkYXRhID0gdG9Gb3JtKGRhdGEpOwogICAgfSBlbHNlIHsKICAgICAgZGF0YSA9IHRvUXVlcnkoZGF0YSk7CiAgICB9CiAgICBoZWFkZXJzWydDb250ZW50LUxlbmd0aCddID0gZGF0YS5sZW5ndGg7CiAgfQogIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7CiAgICB1dGlsX3BsYXRmb3JtX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8xX19bIkdNQVBJIl0ueG1sSHR0cFJlcXVlc3QoewogICAgICBtZXRob2Q6IG1ldGhvZCwKICAgICAgdXJsOiB1cmwsCiAgICAgIGRhdGE6IGRhdGEsCiAgICAgIGhlYWRlcnM6IGhlYWRlcnMsCiAgICAgIG9ubG9hZCAocmVzcG9uc2UpIHsKICAgICAgICByZXNwb25zZSA9ICh0eXBlb2YgcmVzcG9uc2UucmVzcG9uc2VUZXh0ICE9PSAndW5kZWZpbmVkJykgPyByZXNwb25zZSA6IHRoaXM7CiAgICAgICAgaWYgKHJlc3BvbnNlLnN0YXR1cyAhPT0gMjAwKSB7CiAgICAgICAgICByZWplY3QobmV3IEFqYXhFcnJvcihtZXRob2QsIHVybCwgZGF0YSwgaGVhZGVycywgcmVzcG9uc2Uuc3RhdHVzLCByZXNwb25zZS5yZXNwb25zZVRleHQpKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgcmVzb2x2ZShyZXNwb25zZS5yZXNwb25zZVRleHQpOwogICAgICAgIH0KICAgICAgfSwKICAgICAgb25lcnJvciAocmVzcG9uc2UpIHsKICAgICAgICByZXNwb25zZSA9ICh0eXBlb2YgcmVzcG9uc2UucmVzcG9uc2VUZXh0ICE9PSAndW5kZWZpbmVkJykgPyByZXNwb25zZSA6IHRoaXM7CiAgICAgICAgcmVqZWN0KG5ldyBBamF4RXJyb3IobWV0aG9kLCB1cmwsIGRhdGEsIGhlYWRlcnMsIHJlc3BvbnNlLnN0YXR1cywgcmVzcG9uc2UucmVzcG9uc2VUZXh0KSk7CiAgICAgIH0sCiAgICB9KTsKICB9KTsKfQpmdW5jdGlvbiBnZXQgKHVybCwgZGF0YSwgaGVhZGVycykgewogIGRhdGEgPSB0b1F1ZXJ5KGRhdGEpOwogIGRhdGEgPSBkYXRhID8gJz8nICsgZGF0YSA6ICcnOwogIGhlYWRlcnMgPSBoZWFkZXJzIHx8IHt9OwogIHJldHVybiBhamF4KCdHRVQnLCB1cmwgKyBkYXRhLCAnJywgaGVhZGVycyk7Cn0KZnVuY3Rpb24gcG9zdCAodXJsLCBkYXRhLCBoZWFkZXJzKSB7CiAgY29uc3QgaCA9IHsKICAgICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkOyBjaGFyc2V0PVVURi04JywKICB9OwogIGlmIChoZWFkZXJzKSB7CiAgICBPYmplY3QodXRpbF9jb3JlX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bImZvckVhY2giXSkoaGVhZGVycywgKHYsIGspID0+IHsKICAgICAgaFtrXSA9IHY7CiAgICB9KTsKICB9CiAgcmV0dXJuIGFqYXgoJ1BPU1QnLCB1cmwsIGRhdGEsIGgpOwp9CiB9KSwKIChmdW5jdGlvbihtb2R1bGUsIF9fd2VicGFja19leHBvcnRzX18sIF9fd2VicGFja19yZXF1aXJlX18pIHsKInVzZSBzdHJpY3QiOwpfX3dlYnBhY2tfcmVxdWlyZV9fLnIoX193ZWJwYWNrX2V4cG9ydHNfXyk7CiBfX3dlYnBhY2tfcmVxdWlyZV9fLmQoX193ZWJwYWNrX2V4cG9ydHNfXywgInNldENvb2tpZSIsIGZ1bmN0aW9uKCkgeyByZXR1cm4gc2V0Q29va2llOyB9KTsKIF9fd2VicGFja19yZXF1aXJlX18uZChfX3dlYnBhY2tfZXhwb3J0c19fLCAiZ2V0Q29va2llIiwgZnVuY3Rpb24oKSB7IHJldHVybiBnZXRDb29raWU7IH0pOwogX193ZWJwYWNrX3JlcXVpcmVfXy5kKF9fd2VicGFja19leHBvcnRzX18sICJyZXNldENvb2tpZXMiLCBmdW5jdGlvbigpIHsgcmV0dXJuIHJlc2V0Q29va2llczsgfSk7CiB2YXIgdXRpbF9jb3JlX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEpOwpmdW5jdGlvbiBzZXRDb29raWUgKGtleSwgdmFsdWUpIHsKICBkb2N1bWVudC5jb29raWUgPSBgJHtrZXl9PSR7dmFsdWV9O3BhdGg9JHtsb2NhdGlvbi5wYXRobmFtZX07YDsKfQpmdW5jdGlvbiBnZXRDb29raWUgKGtleSkgewogIGxldCBbLCBjLF0gPSBPYmplY3QodXRpbF9jb3JlX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bImZpbmQiXSkoZG9jdW1lbnQuY29va2llLnNwbGl0KCc7JyksICh2KSA9PiB7CiAgICBjb25zdCBrID0gdi5yZXBsYWNlKC9eXHMqKFthLXpBLVowLTktX10rKT0uKyQvLCAnJDEnKTsKICAgIGlmIChrICE9PSBrZXkpIHsKICAgICAgcmV0dXJuIHV0aWxfY29yZV9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyJub25lIl07CiAgICB9CiAgfSk7CiAgaWYgKGMgPT09IHV0aWxfY29yZV9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyJub25lIl0pIHsKICAgIHJldHVybiBudWxsOwogIH0KICBjID0gYy5yZXBsYWNlKC9eXHMqW2EtekEtWjAtOS1fXSs9KFteO10rKS4/JC8sICckMScpOwogIGlmICghYykgewogICAgcmV0dXJuIG51bGw7CiAgfQogIHJldHVybiBjOwp9CmZ1bmN0aW9uIHJlc2V0Q29va2llcyAoKSB7CiAgY29uc3QgYSA9IGRvY3VtZW50LmRvbWFpbjsKICBjb25zdCBiID0gZG9jdW1lbnQuZG9tYWluLnJlcGxhY2UoL153d3dcLi8sICcnKTsKICBjb25zdCBjID0gZG9jdW1lbnQuZG9tYWluLnJlcGxhY2UoL14oXHcrXC4pKz8oXHcrXC5cdyspJC8sICckMicpOwogIGNvbnN0IGQgPSAobmV3IERhdGUoMWUzKSkudG9VVENTdHJpbmcoKTsKICBPYmplY3QodXRpbF9jb3JlX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bImZvckVhY2giXSkoZG9jdW1lbnQuY29va2llLnNwbGl0KCc7JyksICh2KSA9PiB7CiAgICBjb25zdCBrID0gdi5yZXBsYWNlKC9eXHMqKFx3Kyk9LiskLywgJyQxJyk7CiAgICBkb2N1bWVudC5jb29raWUgPSBgJHtrfT07ZXhwaXJlcz0ke2R9O2A7CiAgICBkb2N1bWVudC5jb29raWUgPSBgJHtrfT07cGF0aD0vO2V4cGlyZXM9JHtkfTtgOwogICAgY29uc3QgZSA9IChhLCBiLCBjKSA9PiBgJHthfT07cGF0aD0vO2RvbWFpbj0ke2J9O2V4cGlyZXM9JHtjfTtgOwogICAgZG9jdW1lbnQuY29va2llID0gZShrLCBhLCBkKTsKICAgIGRvY3VtZW50LmNvb2tpZSA9IGUoaywgYiwgZCk7CiAgICBkb2N1bWVudC5jb29raWUgPSBlKGssIGMsIGQpOwogIH0pOwp9CiB9KSwKIChmdW5jdGlvbihtb2R1bGUsIF9fd2VicGFja19leHBvcnRzX18sIF9fd2VicGFja19yZXF1aXJlX18pIHsKInVzZSBzdHJpY3QiOwpfX3dlYnBhY2tfcmVxdWlyZV9fLnIoX193ZWJwYWNrX2V4cG9ydHNfXyk7CiBfX3dlYnBhY2tfcmVxdWlyZV9fLmQoX193ZWJwYWNrX2V4cG9ydHNfXywgImJsb2NrIiwgZnVuY3Rpb24oKSB7IHJldHVybiBibG9jazsgfSk7CiBfX3dlYnBhY2tfcmVxdWlyZV9fLmQoX193ZWJwYWNrX2V4cG9ydHNfXywgInF1ZXJ5U2VsZWN0b3IiLCBmdW5jdGlvbigpIHsgcmV0dXJuIHF1ZXJ5U2VsZWN0b3I7IH0pOwogX193ZWJwYWNrX3JlcXVpcmVfXy5kKF9fd2VicGFja19leHBvcnRzX18sICJxdWVyeVNlbGVjdG9yQWxsIiwgZnVuY3Rpb24oKSB7IHJldHVybiBxdWVyeVNlbGVjdG9yQWxsOyB9KTsKIF9fd2VicGFja19yZXF1aXJlX18uZChfX3dlYnBhY2tfZXhwb3J0c19fLCAicXVlcnlTZWxlY3Rvck9yTnVsbCIsIGZ1bmN0aW9uKCkgeyByZXR1cm4gcXVlcnlTZWxlY3Rvck9yTnVsbDsgfSk7CiBfX3dlYnBhY2tfcmVxdWlyZV9fLmQoX193ZWJwYWNrX2V4cG9ydHNfXywgInJlbW92ZSIsIGZ1bmN0aW9uKCkgeyByZXR1cm4gcmVtb3ZlOyB9KTsKIF9fd2VicGFja19yZXF1aXJlX18uZChfX3dlYnBhY2tfZXhwb3J0c19fLCAic2VhcmNoRnJvbVNjcmlwdHMiLCBmdW5jdGlvbigpIHsgcmV0dXJuIHNlYXJjaEZyb21TY3JpcHRzOyB9KTsKIF9fd2VicGFja19yZXF1aXJlX18uZChfX3dlYnBhY2tfZXhwb3J0c19fLCAidG9ET00iLCBmdW5jdGlvbigpIHsgcmV0dXJuIHRvRE9NOyB9KTsKIHZhciB1dGlsX2NvcmVfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfXyA9IF9fd2VicGFja19yZXF1aXJlX18oMSk7CiB2YXIgdXRpbF9sb2dnZXJfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzFfXyA9IF9fd2VicGFja19yZXF1aXJlX18oNSk7CmNsYXNzIERvbU5vdEZvdW5kRXJyb3IgZXh0ZW5kcyB1dGlsX2NvcmVfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siQWRzQnlwYXNzZXJFcnJvciJdIHsKICBjb25zdHJ1Y3RvciAoc2VsZWN0b3IpIHsKICAgIHN1cGVyKGBcYCR7c2VsZWN0b3J9XGAgbm90IGZvdW5kYCk7CiAgfQogIGdldCBuYW1lICgpIHsKICAgIHJldHVybiAnRG9tTm90Rm91bmRFcnJvcic7CiAgfQp9CmZ1bmN0aW9uIHF1ZXJ5U2VsZWN0b3IgKHNlbGVjdG9yLCBjb250ZXh0KSB7CiAgaWYgKCFjb250ZXh0IHx8ICFjb250ZXh0LnF1ZXJ5U2VsZWN0b3IpIHsKICAgIGNvbnRleHQgPSBkb2N1bWVudDsKICB9CiAgY29uc3QgbiA9IGNvbnRleHQucXVlcnlTZWxlY3RvcihzZWxlY3Rvcik7CiAgaWYgKCFuKSB7CiAgICB0aHJvdyBuZXcgRG9tTm90Rm91bmRFcnJvcihzZWxlY3Rvcik7CiAgfQogIHJldHVybiBuOwp9CmZ1bmN0aW9uIHF1ZXJ5U2VsZWN0b3JPck51bGwgKHNlbGVjdG9yLCBjb250ZXh0KSB7CiAgdHJ5IHsKICAgIHJldHVybiBxdWVyeVNlbGVjdG9yKHNlbGVjdG9yLCBjb250ZXh0KTsKICB9IGNhdGNoIChlKSB7CiAgICByZXR1cm4gbnVsbDsKICB9Cn0KZnVuY3Rpb24gcXVlcnlTZWxlY3RvckFsbCAoc2VsZWN0b3IsIGNvbnRleHQpIHsKICBpZiAoIWNvbnRleHQgfHwgIWNvbnRleHQucXVlcnlTZWxlY3RvckFsbCkgewogICAgY29udGV4dCA9IGRvY3VtZW50OwogIH0KICBjb25zdCBucyA9IGNvbnRleHQucXVlcnlTZWxlY3RvckFsbChzZWxlY3Rvcik7CiAgcmV0dXJuIG5zOwp9CmZ1bmN0aW9uIHRvRE9NIChyYXdIVE1MKSB7CiAgdHJ5IHsKICAgIGNvbnN0IHBhcnNlciA9IG5ldyBET01QYXJzZXIoKTsKICAgIGNvbnN0IERPTUhUTUwgPSBwYXJzZXIucGFyc2VGcm9tU3RyaW5nKHJhd0hUTUwsICd0ZXh0L2h0bWwnKTsKICAgIHJldHVybiBET01IVE1MOwogIH0gY2F0Y2ggKGUpIHsKICAgIHRocm93IG5ldyB1dGlsX2NvcmVfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siQWRzQnlwYXNzZXJFcnJvciJdKCdjb3VsZCBub3QgcGFyc2UgSFRNTCB0byBET00nKTsKICB9Cn0KZnVuY3Rpb24gcmVtb3ZlIChzZWxlY3RvciwgY29udGV4dCkgewogIGNvbnN0IG5vZGVzID0gcXVlcnlTZWxlY3RvckFsbChzZWxlY3RvciwgY29udGV4dCk7CiAgT2JqZWN0KHV0aWxfY29yZV9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyJmb3JFYWNoIl0pKG5vZGVzLCAoZSkgPT4gewogICAgT2JqZWN0KHV0aWxfbG9nZ2VyX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8xX19bImRlYnVnIl0pKCdyZW1vdmVkJywgZSk7CiAgICBlLnJlbW92ZSgpOwogIH0pOwp9CmZ1bmN0aW9uIGJsb2NrIChzZWxlY3RvciwgY29udGV4dD1udWxsKSB7CiAgaWYgKCFjb250ZXh0KSB7CiAgICBjb250ZXh0ID0gZG9jdW1lbnQ7CiAgfQogIGxldCBmbiA9IG51bGw7CiAgaWYgKE9iamVjdCh1dGlsX2NvcmVfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siaXNTdHJpbmciXSkoc2VsZWN0b3IpKSB7CiAgICBmbiA9ICgpID0+IHsKICAgICAgcmVtb3ZlKHNlbGVjdG9yLCBjb250ZXh0KTsKICAgIH07CiAgfSBlbHNlIGlmICh0eXBlb2Ygc2VsZWN0b3IgPT09ICdmdW5jdGlvbicpIHsKICAgIGZuID0gKG11dGF0aW9uKSA9PiB7CiAgICAgIG11dGF0aW9uLmFkZGVkTm9kZXMuZm9yRWFjaCgobm9kZSkgPT4gewogICAgICAgIGlmIChzZWxlY3Rvcihub2RlKSkgewogICAgICAgICAgbm9kZS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKG5vZGUpOwogICAgICAgIH0KICAgICAgfSk7CiAgICB9OwogIH0gZWxzZSB7CiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCd3cm9uZyBzZWxlY3RvcicpOwogIH0KICBjb25zdCBvID0gbmV3IE11dGF0aW9uT2JzZXJ2ZXIoKG11dGF0aW9ucykgPT4gewogICAgbXV0YXRpb25zLmZvckVhY2goKG11dGF0aW9uKSA9PiB7CiAgICAgIGZuKG11dGF0aW9uKTsKICAgIH0pOwogIH0pOwogIG8ub2JzZXJ2ZShjb250ZXh0LCB7CiAgICBjaGlsZExpc3Q6IHRydWUsCiAgICBzdWJ0cmVlOiB0cnVlLAogIH0pOwp9CmZ1bmN0aW9uIHNlYXJjaEZyb21TY3JpcHRzQnlSZWdFeHAgKHBhdHRlcm4sIGNvbnRleHQpIHsKICBjb25zdCBzY3JpcHRzID0gcXVlcnlTZWxlY3RvckFsbCgnc2NyaXB0JywgY29udGV4dCk7CiAgY29uc3QgWywgLCBtXSA9IE9iamVjdCh1dGlsX2NvcmVfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siZmluZCJdKShzY3JpcHRzLCAocykgPT4gewogICAgY29uc3QgbSA9IHMudGV4dENvbnRlbnQubWF0Y2gocGF0dGVybik7CiAgICBpZiAoIW0pIHsKICAgICAgcmV0dXJuIHV0aWxfY29yZV9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyJub25lIl07CiAgICB9CiAgICByZXR1cm4gbTsKICB9KTsKICBpZiAobSA9PT0gdXRpbF9jb3JlX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIm5vbmUiXSkgewogICAgcmV0dXJuIG51bGw7CiAgfQogIHJldHVybiBtOwp9CmZ1bmN0aW9uIHNlYXJjaEZyb21TY3JpcHRzQnlTdHJpbmcgKHBhdHRlcm4sIGNvbnRleHQpIHsKICBjb25zdCBzY3JpcHRzID0gcXVlcnlTZWxlY3RvckFsbCgnc2NyaXB0JywgY29udGV4dCk7CiAgY29uc3QgWywgbSxdID0gT2JqZWN0KHV0aWxfY29yZV9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyJmaW5kIl0pKHNjcmlwdHMsIChzKSA9PiB7CiAgICBjb25zdCBtID0gcy50ZXh0Q29udGVudC5pbmRleE9mKHBhdHRlcm4pOwogICAgaWYgKG0gPCAwKSB7CiAgICAgIHJldHVybiB1dGlsX2NvcmVfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1sibm9uZSJdOwogICAgfQogICAgcmV0dXJuIG07CiAgfSk7CiAgaWYgKG0gPT09IHV0aWxfY29yZV9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyJub25lIl0pIHsKICAgIHJldHVybiBudWxsOwogIH0KICByZXR1cm4gbS50ZXh0Q29udGVudDsKfQpmdW5jdGlvbiBzZWFyY2hGcm9tU2NyaXB0cyAocGF0dGVybiwgY29udGV4dCkgewogIGlmIChwYXR0ZXJuIGluc3RhbmNlb2YgUmVnRXhwKSB7CiAgICByZXR1cm4gc2VhcmNoRnJvbVNjcmlwdHNCeVJlZ0V4cChwYXR0ZXJuLCBjb250ZXh0KTsKICB9IGVsc2UgaWYgKE9iamVjdCh1dGlsX2NvcmVfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1siaXNTdHJpbmciXSkocGF0dGVybikpIHsKICAgIHJldHVybiBzZWFyY2hGcm9tU2NyaXB0c0J5U3RyaW5nKHBhdHRlcm4sIGNvbnRleHQpOwogIH0gZWxzZSB7CiAgICByZXR1cm4gbnVsbDsKICB9Cn0KIH0pLAogKGZ1bmN0aW9uKG1vZHVsZSwgX193ZWJwYWNrX2V4cG9ydHNfXywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoidXNlIHN0cmljdCI7Cl9fd2VicGFja19yZXF1aXJlX18ucihfX3dlYnBhY2tfZXhwb3J0c19fKTsKIF9fd2VicGFja19yZXF1aXJlX18uZChfX3dlYnBhY2tfZXhwb3J0c19fLCAib3BlbkltYWdlIiwgZnVuY3Rpb24oKSB7IHJldHVybiBvcGVuSW1hZ2U7IH0pOwogdmFyIHV0aWxfbGlua19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fID0gX193ZWJwYWNrX3JlcXVpcmVfXygxMik7CiB2YXIgdXRpbF9kb21fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzFfXyA9IF9fd2VicGFja19yZXF1aXJlX18oMTApOwogdmFyIHV0aWxfbG9nZ2VyX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8yX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDUpOwogdmFyIHV0aWxfbWlzY19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfM19fID0gX193ZWJwYWNrX3JlcXVpcmVfXygxMyk7CiB2YXIgdXRpbF9wbGF0Zm9ybV9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfNF9fID0gX193ZWJwYWNrX3JlcXVpcmVfXygzKTsKYXN5bmMgZnVuY3Rpb24gb3BlbkltYWdlIChpbWdTcmMsIG9wdGlvbnMpIHsKICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTsKICBjb25zdCByZXBsYWNlID0gISFvcHRpb25zLnJlcGxhY2U7CiAgY29uc3QgcmVmZXJlciA9ICEhb3B0aW9ucy5yZWZlcmVyOwogIGlmIChyZXBsYWNlKSB7CiAgICBhd2FpdCByZXBsYWNlQm9keShpbWdTcmMpOwogICAgcmV0dXJuOwogIH0KICBjb25zdCByZWRpcmVjdEltYWdlID0gYXdhaXQgdXRpbF9wbGF0Zm9ybV9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfNF9fWyJHTUFQSSJdLmdldFZhbHVlKCdyZWRpcmVjdF9pbWFnZScpOwogIGlmIChyZWRpcmVjdEltYWdlKSB7CiAgICBhd2FpdCBPYmplY3QodXRpbF9saW5rX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bIm9wZW5MaW5rIl0pKGltZ1NyYywgewogICAgICByZWZlcmVyOiByZWZlcmVyLAogICAgfSk7CiAgfQp9CmZ1bmN0aW9uIGVuYWJsZVNjcm9sbGluZyAoKSB7CiAgY29uc3QgbyA9IGRvY3VtZW50LmNvbXBhdE1vZGUgPT09ICdDU1MxQ29tcGF0JyA/IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCA6IGRvY3VtZW50LmJvZHk7CiAgby5zdHlsZS5vdmVyZmxvdyA9ICcnOwp9CmZ1bmN0aW9uIHRvZ2dsZVNocmlua2luZyAoKSB7CiAgdGhpcy5jbGFzc0xpc3QudG9nZ2xlKCdhZHNieXBhc3Nlci1zaHJpbmtlZCcpOwp9CmZ1bmN0aW9uIGNoZWNrU2NhbGluZyAoKSB7CiAgY29uc3QgbncgPSB0aGlzLm5hdHVyYWxXaWR0aDsKICBjb25zdCBuaCA9IHRoaXMubmF0dXJhbEhlaWdodDsKICBjb25zdCBjdyA9IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aDsKICBjb25zdCBjaCA9IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQ7CiAgaWYgKChudyA+IGN3IHx8IG5oID4gY2gpICYmICF0aGlzLmNsYXNzTGlzdC5jb250YWlucygnYWRzYnlwYXNzZXItcmVzaXphYmxlJykpIHsKICAgIHRoaXMuY2xhc3NMaXN0LmFkZCgnYWRzYnlwYXNzZXItcmVzaXphYmxlJyk7CiAgICB0aGlzLmNsYXNzTGlzdC5hZGQoJ2Fkc2J5cGFzc2VyLXNocmlua2VkJyk7CiAgICB0aGlzLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgdG9nZ2xlU2hyaW5raW5nKTsKICB9IGVsc2UgaWYgKChudyA8PSBjdyAmJiBuaCA8PSBjaCkgJiYgdGhpcy5jbGFzc0xpc3QuY29udGFpbnMoJ2Fkc2J5cGFzc2VyLXJlc2l6YWJsZScpKSB7CiAgICB0aGlzLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgdG9nZ2xlU2hyaW5raW5nKTsKICAgIHRoaXMuY2xhc3NMaXN0LnJlbW92ZSgnYWRzYnlwYXNzZXItc2hyaW5rZWQnKTsKICAgIHRoaXMuY2xhc3NMaXN0LnJlbW92ZSgnYWRzYnlwYXNzZXItcmVzaXphYmxlJyk7CiAgfQp9CmFzeW5jIGZ1bmN0aW9uIHNjYWxlSW1hZ2UgKGkpIHsKICBjb25zdCBzaVVSTCA9IGF3YWl0IHV0aWxfcGxhdGZvcm1fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzRfX1siR01BUEkiXS5nZXRSZXNvdXJjZVVybCgnc2NhbGVJbWFnZScpOwogIGFwcGVuZFN0eWxlVVJMKHNpVVJMKTsKICBpZiAoaS5uYXR1cmFsV2lkdGggJiYgaS5uYXR1cmFsSGVpZ2h0KSB7CiAgICBjaGVja1NjYWxpbmcuY2FsbChpKTsKICB9IGVsc2UgewogICAgaS5hZGRFdmVudExpc3RlbmVyKCdsb2FkJywgY2hlY2tTY2FsaW5nKTsKICB9CiAgbGV0IGggPSAwOwogIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdyZXNpemUnLCAoKSA9PiB7CiAgICB3aW5kb3cuY2xlYXJUaW1lb3V0KGgpOwogICAgaCA9IHdpbmRvdy5zZXRUaW1lb3V0KGNoZWNrU2NhbGluZy5iaW5kKGkpLCAxMDApOwogIH0pOwp9CmFzeW5jIGZ1bmN0aW9uIGNoYW5nZUJhY2tncm91bmQgKCkgewogIGNvbnN0IGJnSW1hZ2UgPSBhd2FpdCB1dGlsX3BsYXRmb3JtX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV80X19bIkdNQVBJIl0uZ2V0UmVzb3VyY2VVcmwoJ2JnSW1hZ2UnKTsKICBkb2N1bWVudC5ib2R5LnN0eWxlLmJhY2tncm91bmRDb2xvciA9ICcjMjIyMjIyJzsKICBkb2N1bWVudC5ib2R5LnN0eWxlLmJhY2tncm91bmRJbWFnZSA9IGB1cmwoJyR7YmdJbWFnZX0nKWA7Cn0KYXN5bmMgZnVuY3Rpb24gYWxpZ25DZW50ZXIgKCkgewogIGNvbnN0IGFjVVJMID0gYXdhaXQgdXRpbF9wbGF0Zm9ybV9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfNF9fWyJHTUFQSSJdLmdldFJlc291cmNlVXJsKCdhbGlnbkNlbnRlcicpOwogIGFwcGVuZFN0eWxlVVJMKGFjVVJMKTsKfQpmdW5jdGlvbiBpbmplY3RTdHlsZSAoZCwgaSkgewogIE9iamVjdCh1dGlsX2RvbV9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMV9fWyJyZW1vdmUiXSkoJ3N0eWxlLCBsaW5rW3JlbD1zdHlsZXNoZWV0XScpOwogIGQuaWQgPSAnYWRzYnlwYXNzZXItd3JhcHBlcic7CiAgaS5pZCA9ICdhZHNieXBhc3Nlci1pbWFnZSc7Cn0KZnVuY3Rpb24gYXBwZW5kU3R5bGVVUkwgKHVybCkgewogIGNvbnN0IGxpbmsgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdsaW5rJyk7CiAgbGluay5yZWwgPSAnc3R5bGVzaGVldCc7CiAgbGluay50eXBlID0gJ3RleHQvY3NzJzsKICBsaW5rLmhyZWYgPSB1cmw7CiAgZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChsaW5rKTsKfQphc3luYyBmdW5jdGlvbiByZXBsYWNlQm9keSAoaW1nU3JjKSB7CiAgY29uc3QgcmVkaXJlY3RJbWFnZSA9IGF3YWl0IHV0aWxfcGxhdGZvcm1fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzRfX1siR01BUEkiXS5nZXRWYWx1ZSgncmVkaXJlY3RfaW1hZ2UnKTsKICBpZiAoIXJlZGlyZWN0SW1hZ2UpIHsKICAgIHJldHVybjsKICB9CiAgaWYgKCFpbWdTcmMpIHsKICAgIE9iamVjdCh1dGlsX2xvZ2dlcl9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMl9fWyJ3YXJuIl0pKCdmYWxzZSB1cmwnKTsKICAgIHJldHVybjsKICB9CiAgT2JqZWN0KHV0aWxfbG9nZ2VyX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8yX19bImluZm8iXSkoYHJlcGxhY2luZyBib2R5IHdpdGggXGAke2ltZ1NyY31cYCAuLi5gKTsKICBPYmplY3QodXRpbF9taXNjX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8zX19bInJlbW92ZUFsbFRpbWVyIl0pKCk7CiAgZW5hYmxlU2Nyb2xsaW5nKCk7CiAgZG9jdW1lbnQuYm9keSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2JvZHknKTsKICBjb25zdCBkID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7CiAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChkKTsKICBjb25zdCBpID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaW1nJyk7CiAgaS5zcmMgPSBpbWdTcmM7CiAgZC5hcHBlbmRDaGlsZChpKTsKICBjb25zdCBhYyA9IGF3YWl0IHV0aWxfcGxhdGZvcm1fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzRfX1siR01BUEkiXS5nZXRWYWx1ZSgnYWxpZ25fY2VudGVyJyk7CiAgY29uc3Qgc2kgPSBhd2FpdCB1dGlsX3BsYXRmb3JtX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV80X19bIkdNQVBJIl0uZ2V0VmFsdWUoJ3NjYWxlX2ltYWdlJyk7CiAgaWYgKGFjIHx8IHNpKSB7CiAgICBpbmplY3RTdHlsZShkLCBpKTsKICB9CiAgaWYgKGFjKSB7CiAgICBhd2FpdCBhbGlnbkNlbnRlcigpOwogIH0KICBjb25zdCBjYiA9IGF3YWl0IHV0aWxfcGxhdGZvcm1fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzRfX1siR01BUEkiXS5nZXRWYWx1ZSgnY2hhbmdlX2JhY2tncm91bmQnKTsKICBpZiAoY2IpIHsKICAgIGF3YWl0IGNoYW5nZUJhY2tncm91bmQoKTsKICB9CiAgaWYgKHNpKSB7CiAgICBhd2FpdCBzY2FsZUltYWdlKGkpOwogIH0KfQogfSksCiAoZnVuY3Rpb24obW9kdWxlLCBfX3dlYnBhY2tfZXhwb3J0c19fLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7CiJ1c2Ugc3RyaWN0IjsKX193ZWJwYWNrX3JlcXVpcmVfXy5yKF9fd2VicGFja19leHBvcnRzX18pOwogX193ZWJwYWNrX3JlcXVpcmVfXy5kKF9fd2VicGFja19leHBvcnRzX18sICJvcGVuTGluayIsIGZ1bmN0aW9uKCkgeyByZXR1cm4gb3Blbkxpbms7IH0pOwogdmFyIHV0aWxfY29yZV9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fID0gX193ZWJwYWNrX3JlcXVpcmVfXygxKTsKIHZhciB1dGlsX2xvZ2dlcl9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMV9fID0gX193ZWJwYWNrX3JlcXVpcmVfXyg1KTsKZnVuY3Rpb24gcHJlcGFyZSAoZSkgewogIGlmICghZG9jdW1lbnQuYm9keSkgewogICAgZG9jdW1lbnQuYm9keSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2JvZHknKTsKICB9CiAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChlKTsKICByZXR1cm4gT2JqZWN0KHV0aWxfY29yZV9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fWyJ3YWl0Il0pKDApOwp9CmFzeW5jIGZ1bmN0aW9uIGdldCAodXJsKSB7CiAgY29uc3QgYSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2EnKTsKICBhLmhyZWYgPSB1cmw7CiAgbGV0IGNsaWNrZWQgPSBmYWxzZTsKICBhLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKGV2ZW50KSA9PiB7CiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTsKICAgIGNsaWNrZWQgPSB0cnVlOwogIH0sIHRydWUpOwogIGF3YWl0IHByZXBhcmUoYSk7CiAgYS5jbGljaygpOwogIGNvbnN0IHRpY2sgPSBzZXRJbnRlcnZhbCgoKSA9PiB7CiAgICBpZiAoY2xpY2tlZCkgewogICAgICBPYmplY3QodXRpbF9sb2dnZXJfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzFfX1siaW5mbyJdKSgnYWxyZWFkeSBjbGlja2VkJyk7CiAgICAgIGNsZWFySW50ZXJ2YWwodGljayk7CiAgICAgIHJldHVybjsKICAgIH0KICAgIE9iamVjdCh1dGlsX2xvZ2dlcl9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMV9fWyJpbmZvIl0pKCd0cnkgYWdhaW4nKTsKICAgIGEuY2xpY2soKTsKICB9LCA1MDApOwp9CmFzeW5jIGZ1bmN0aW9uIHBvc3QgKHBhdGgsIHBhcmFtcykgewogIHBhcmFtcyA9IHBhcmFtcyB8fCB7fTsKICBjb25zdCBmb3JtID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZm9ybScpOwogIGZvcm0ubWV0aG9kID0gJ3Bvc3QnOwogIGZvcm0uYWN0aW9uID0gcGF0aDsKICBPYmplY3QodXRpbF9jb3JlX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bImZvckVhY2giXSkocGFyYW1zLCAodmFsdWUsIGtleSkgPT4gewogICAgY29uc3QgaW5wdXQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpbnB1dCcpOwogICAgaW5wdXQudHlwZSA9ICdoaWRkZW4nOwogICAgaW5wdXQubmFtZSA9IGtleTsKICAgIGlucHV0LnZhbHVlID0gdmFsdWU7CiAgICBmb3JtLmFwcGVuZENoaWxkKGlucHV0KTsKICB9KTsKICBhd2FpdCBwcmVwYXJlKGZvcm0pOwogIGZvcm0uc3VibWl0KCk7Cn0KYXN5bmMgZnVuY3Rpb24gb3BlbkxpbmsgKHRvLCBvcHRpb25zKSB7CiAgaWYgKCFPYmplY3QodXRpbF9jb3JlX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bImlzU3RyaW5nIl0pKHRvKSAmJiAhdG8pIHsKICAgIE9iamVjdCh1dGlsX2xvZ2dlcl9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMV9fWyJ3YXJuIl0pKCdmYWxzZSBVUkwnKTsKICAgIHJldHVybjsKICB9CiAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307CiAgY29uc3Qgd2l0aFJlZmVyZXIgPSB0eXBlb2Ygb3B0aW9ucy5yZWZlcmVyID09PSAndW5kZWZpbmVkJyA/IHRydWUgOiBvcHRpb25zLnJlZmVyZXI7CiAgY29uc3QgcG9zdERhdGEgPSBvcHRpb25zLnBvc3Q7CiAgY29uc3QgZnJvbSA9IHdpbmRvdy5sb2NhdGlvbi50b1N0cmluZygpOwogIE9iamVjdCh1dGlsX2xvZ2dlcl9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMV9fWyJpbmZvIl0pKGAke2Zyb219IC0+ICR7dG99YCk7CiAgaWYgKHBvc3REYXRhKSB7CiAgICBhd2FpdCBwb3N0KHRvLCBwb3N0RGF0YSk7CiAgICByZXR1cm47CiAgfQogIGlmICh3aXRoUmVmZXJlcikgewogICAgYXdhaXQgZ2V0KHRvKTsKICAgIHJldHVybjsKICB9CiAgd2luZG93LnRvcC5sb2NhdGlvbi5yZXBsYWNlKHRvKTsKfQogfSksCiAoZnVuY3Rpb24obW9kdWxlLCBfX3dlYnBhY2tfZXhwb3J0c19fLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7CiJ1c2Ugc3RyaWN0IjsKX193ZWJwYWNrX3JlcXVpcmVfXy5yKF9fd2VicGFja19leHBvcnRzX18pOwogX193ZWJwYWNrX3JlcXVpcmVfXy5kKF9fd2VicGFja19leHBvcnRzX18sICJyZW1vdmVBbGxUaW1lciIsIGZ1bmN0aW9uKCkgeyByZXR1cm4gcmVtb3ZlQWxsVGltZXI7IH0pOwogX193ZWJwYWNrX3JlcXVpcmVfXy5kKF9fd2VicGFja19leHBvcnRzX18sICJudWtlIiwgZnVuY3Rpb24oKSB7IHJldHVybiBudWtlOyB9KTsKIF9fd2VicGFja19yZXF1aXJlX18uZChfX3dlYnBhY2tfZXhwb3J0c19fLCAiZ2VuZXJhdGVSYW5kb21JUCIsIGZ1bmN0aW9uKCkgeyByZXR1cm4gZ2VuZXJhdGVSYW5kb21JUDsgfSk7CiBfX3dlYnBhY2tfcmVxdWlyZV9fLmQoX193ZWJwYWNrX2V4cG9ydHNfXywgImV2aWwiLCBmdW5jdGlvbigpIHsgcmV0dXJuIGV2aWw7IH0pOwogdmFyIHV0aWxfY29yZV9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fID0gX193ZWJwYWNrX3JlcXVpcmVfXygxKTsKIHZhciB1dGlsX3BsYXRmb3JtX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8xX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDMpOwogdmFyIHV0aWxfbG9nZ2VyX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8yX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDUpOwpmdW5jdGlvbiByZW1vdmVBbGxUaW1lciAoKSB7CiAgbGV0IGhhbmRsZSA9IHdpbmRvdy5zZXRJbnRlcnZhbCh1dGlsX2NvcmVfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1sibm9wIl0sIDEwKTsKICB3aGlsZSAoaGFuZGxlID4gMCkgewogICAgd2luZG93LmNsZWFySW50ZXJ2YWwoaGFuZGxlLS0pOwogIH0KICBoYW5kbGUgPSB3aW5kb3cuc2V0VGltZW91dCh1dGlsX2NvcmVfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1sibm9wIl0sIDEwKTsKICB3aGlsZSAoaGFuZGxlID4gMCkgewogICAgd2luZG93LmNsZWFyVGltZW91dChoYW5kbGUtLSk7CiAgfQp9CmZ1bmN0aW9uIG51a2UgKHVybCkgewogIHRyeSB7CiAgICB1dGlsX3BsYXRmb3JtX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8xX19bInVzdyJdLmRvY3VtZW50LndyaXRlKCdudWtlZCBieSBBZHNCeXBhc3NlciwgbGVhZGluZyB0byAuLi48YnIvPicpOwogIH0gY2F0Y2ggKGUpIHsKICAgIE9iamVjdCh1dGlsX2xvZ2dlcl9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMl9fWyJ3YXJuIl0pKCdudWtlIGZhaWxlZCcsIGUpOwogIH0KICBjb25zdCBhID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYScpOwogIGEuaHJlZiA9IHVybDsKICBhLnRleHRDb250ZW50ID0gdXJsOwogIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoYSk7Cn0KZnVuY3Rpb24gZ2VuZXJhdGVSYW5kb21JUCAoKSB7CiAgcmV0dXJuIFswLCAwLCAwLCAwXS5tYXAoKCkgPT4gewogICAgcmV0dXJuIE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIDI1Nik7CiAgfSkuam9pbignLicpOwp9CmZ1bmN0aW9uIGV2aWwgKHNjcmlwdCkgewogIHJldHVybiAoKAogICAgR00sCiAgICBHTV9kZWxldGVWYWx1ZSwKICAgIEdNX2dldFJlc291cmNlVVJMLAogICAgR01fZ2V0VmFsdWUsCiAgICBHTV9vcGVuSW5UYWIsCiAgICBHTV9yZWdpc3Rlck1lbnVDb21tYW5kLAogICAgR01fc2V0VmFsdWUsCiAgICBHTV94bWxodHRwUmVxdWVzdCwKICAgIHVuc2FmZVdpbmRvdywKICAgIHdpbmRvdywKICApID0+IHsKICAgIHJldHVybiBldmFsKHNjcmlwdCk7CiAgfSkoKTsKfQogfSkKIF0pOw==","resources":[{"meta":{"name":"align_center.css","url":"https://raw.githubusercontent.com/adsbypasser/adsbypasser/v7.19.0/resources/css/align_center.css","ts":1646360096107,"mimetype":"text/css"},"source":"aHRtbCB7CiAgaGVpZ2h0OiAxMDAlOwp9Cgpib2R5IHsKICBoZWlnaHQ6IDEwMCU7CiAgbWFyZ2luOiAwOwp9CgojYWRzYnlwYXNzZXItd3JhcHBlciB7CiAgd2lkdGg6IDEwMCU7CiAgaGVpZ2h0OiAxMDAlOwogIHBvc2l0aW9uOiByZWxhdGl2ZTsKICB0ZXh0LWFsaWduOiBjZW50ZXI7CiAgbGluZS1oZWlnaHQ6IDA7Cn0KCiNhZHNieXBhc3Nlci1pbWFnZSB7CiAgbWFyZ2luOiBhdXRvOwogIHRvcDogMDsKICBib3R0b206IDA7CiAgbGVmdDogMDsKICByaWdodDogMDsKfQo="},{"meta":{"name":"scale_image.css","url":"https://raw.githubusercontent.com/adsbypasser/adsbypasser/v7.19.0/resources/css/scale_image.css","ts":1646360096108,"mimetype":"text/css"},"source":"I2Fkc2J5cGFzc2VyLWltYWdlLmFkc2J5cGFzc2VyLXJlc2l6YWJsZSB7CiAgY3Vyc29yOiAtd2Via2l0LXpvb20tb3V0OwogIGN1cnNvcjogLW1vei16b29tLW91dDsKICBjdXJzb3I6IHpvb20tb3V0Owp9CgojYWRzYnlwYXNzZXItaW1hZ2UuYWRzYnlwYXNzZXItcmVzaXphYmxlLmFkc2J5cGFzc2VyLXNocmlua2VkIHsKICBtYXgtd2lkdGg6IDEwMCU7CiAgbWF4LWhlaWdodDogMTAwJTsKICBjdXJzb3I6IC13ZWJraXQtem9vbS1pbjsKICBjdXJzb3I6IC1tb3otem9vbS1pbjsKICBjdXJzb3I6IHpvb20taW47Cn0K"},{"meta":{"name":"imagedoc-darknoise.png","url":"https://raw.githubusercontent.com/adsbypasser/adsbypasser/v7.19.0/resources/img/imagedoc-darknoise.png","ts":1646360096122,"mimetype":"image/png"},"source":"wolQTkcNChoKAAAADUlIRFIAAABYAAAAWAQDAAAAwoPCuy0HAAAAG1BMVEXDvsO+w74BAQHDv8O/w78KCgoDAwN/f3/DtcO1w7XCgMKAwoDDvMO8w7zDoQ8Ew7YAAAAJdFJOUwUFBQUFBQUFBcKHDsOTw70AAAvDgklEQVR4Xg3DijljwrJaEADDkBnDtnIue3lxL0HCjUkJwpp8wrEEw6NWwoJLTAkaE0swbj/Du8K9w64UB37DhS1uKsOzwqLDsMOCWHzDqMKfw4BICSlZwqjDvirCtsObw59Rw7MfQsKjc2tIwpfCtMKADcKlwpvCpcKQTxPCl13Cs8Kow4k3I13CjAzCilrCp2vCoMKIwrFZFAhjwqE/wpDDpjvChMKHIi/Dtl/CrAPCt1zDv8O0w6gLwpQnecKSd8O8w73DpMOgfcK8wobCpcOQM8OlacKVwoc/wrREw6gyF8KOYsKqKkvChsKvw6xNZylOwp49RkpVCsK+fFkME8KIw403w4x7R8OJwoDCnsOcw7xiCDnDlS4rFjIEVQ7DjsO2OgAuQF8fEcO6wo5Ow6EtI8OTCsKBND3DhMKswoYmw71xw4VtCMOtH1MXD8KXVG7CnX04V2PCkDlywrPDocOSw4LCsGAdG8OLw7cFTcO+wpjCvFYjwojDgcOLw78PUcKRW8KlLg7DskstADnClCI1w64lHcKwwqYpOsOmHzAEw4bCnsKZw79mw43DlsOqCi/Dp1HCvsO9Wz0DL8O/w4HDrmTCh8OLwrDCvEPDrsKbwqo5HkDDjA3CvcOZWsOpw7DCtsKvwpTDjENUw7DDmmENw5bDrzbDksKMw55Jw7HDpgjCulDDhMKQwpfDp8KGwrPDrcK7wprCtsKDwrcXwpZ0f8KTw6tlLMO8bMKlEsOaw7sKw58jwpXCt8KXKsOwH8OmwonDscOwPcKuVsOdScO8ZsOlV8Olw5DDiMKlCMKcw6UGw6PCh8Oqwo3DizMrbsK6w4h1woABwoHCvXpIb8OLwol4McKmwrjDojYVw4ldwpEUS8KSw6fCh8K2HcOLMMK2Y13CqR/DvlfCg8O0O8OXwrheelbCgxVSQkNXwqXCgwLDhMKeFXpdJcKaLnrCjnYIIMKQEDJ3RcO7NMOEwosrwqPDt2rDt8KKMlPDlMOtGsKUw7QnLWJvJMK0e18ew5fCg8OXw6bDtQPCqhbDryjDm8OZwrdBCsKFw4HCk3huSMK/RsKKazbDkwoqw5EET8OYwozCsMKcworCpkjCoMK4CivCn2zCs8KSw70wG3M1EEVDJMO+VTfCucKuLjYCwoJcw50ZDsObwqHCgcKgRmorw44UQ8Krw43DoMKCWDLClC/CoQTCsTLDi8KmUFjDnALCmmrCrcOow7vDhMOECsKGEA9Vw5lyE8Ojw7fDksO4wo3CnMOHWcO5wrXDnznCkMOgwqMdw7PDlk4Ow7YUwp/DvsK8wqPCssKCC37CrytFbEDDiVjCv8KmPwpgw4PCocOtFMKyB8Kawq4ow5ptZ2fDmxorCMKKEMOkw5Vmw5XCpcKewqHDjgzDu8K9w6PDlV8oP8Kzw47Cl8Oywp3Dn8OZZU5IWcKdHcKCesKRHC4uOBpBwrE/DcOtwobDhScwA8KJbcKewqPDtMO9w6/Dk8KKFxY8w45Pw74dH8ONNEkzwoEgbMKYDcO5ScKswrPDlm/Drm8YJmEDwqZ9w7zCkcKHw5gdw4fCjcKmUVXDucOXaipaR8OxAzzCrkgsccOVw4zCsMOHeMOIXsOlw4kQRsOswrMpwqjDkxMyw60rJCVvQsOkwoPDmMKuwoPDsELDqcOtw63DvkUQw7PDlyTCtcKRbGHDnC/ChDfCsx3DkywDelvCrsO2wq/DsjkIwqkLw6s0wrDDgk0AI8OPwqIEJMKvw5XCjsOQQMO+UUrCgsOEw5tuw67Di8OLw6fDm2Y6dhLDgcKASxHCh18cTGjDiMK/fMK+w6tCwqbCt3YAZQXDvMKpw73DmyQ1HMO/wppdwo7DmMK+KwAZw7Rsw7NDN3bDncOdSQQJw5LCvWkWB8OGH8KwwoHCpcKywpHDosK0w5jCjD3Cg8OFfR/CjnnDhG4/LGB+woPDvcO8eRHDncOEdsOswoohwonCoMOXCk/Dt1TDk8O6wpTCjE/DtTBnwrDDh8KAAUZlwqLCrsKPw7DCpREsGw0Ww6jCgMOcwrsNw73Dn2rCpCfCiijCgGBLOw3Dpk/Cq3Ydw67Ch0VbwrzDi8KOIsKJwokPV8OBOiDCqiLDi8OkwpUuWzkITGnCqEkLw6Rcw7vCqXPDuUvDscKawq05Py/Ci8KgYhDClMKywq/ClcOGwofCsFHCvVIuwrofw7rCnR8+wrvCsMO0RsKGwo/Cq8K4L3ZCA3kkQyYuw4ZREEjCicK7wr8FJcK8wrNPw4FsdMKvdF7CgRx7OcO2R8KYwotTNmFzMmZ/XMKNY3gJNMKVEMK9wrpTw450w4BudXknw4jCi8Oiwq3CjlrDqEkSd1ZVPMKEwq/DgzlUZMOWwrbDs8KmUsKNQ8Kyc8KswqlxOWcywoTDsMKuP8Oxw4l8w7nDjVcCwrp1RULCs8O6IsKPw7fCqMO2FcOFJgPDq8O0HnErw5IlHUrCtErDpcObwoDCj1FQamvDqcKJwqXDkcOYwpddD8KoPMKfwoTCshcfw5/CjT4LwpAvwqDChMKXJMKPV8K1w4DDv8KDwqx6w6kiIxo8fkXDlsK3GkbDvBlZw7Enw6nDvH7DvC7Dj3VwARjCs0rCjsK9VEnCnlfDiHjDrGnDtcOMEsKFw63CgsOgH8KPKQzCisKDDBzChMKXVAc9w4kGOcKjwpQgw7DDgzTCnhXCggNhw6jCiEgBc1EHw7sGwqsuPEfDnMK5w7rDsMOPw5zCiFrCiMOVwrHCtMKYE8KxwojDmsOeOsOkwqERw7/DvcKkwozDocKbUGHDmcOGw5hXGcO2IcKEO3pYw5jCpcKmw7/DpEdPF2PDksKZw4zCvsOraMO6e2HDgTzDlsOew7vDglUyw6RQBsK1wp0vw5vCgcKHwobDmG0GwpAnTsOFw4nDtykKw6vDksK7FTJiM8O6asO7w7DDtgTDnAI9Lk1aIUsDwocMNsKHTsOPJ8OJwqchMBcWwqFQw5bCp3/DpVoKwp4IwrMneAUhSsOoQ8OZEmnCucOyw45KLsOewpsTwpXChcKLDhrCicKVw5jCkMKEKjXCrsOuS8Kqw4LDp8KyFEnCg8KBWFHDkl4oHn8Ww7PCtRnCuxbDvMKJw554SxHDlsKJKcOPKnMyAhzDncKGLcKwN8OwKB9zwpjDgMK2wqPCuybDgcOyH8OQeMKSYl9YCMK3w6dfwoo/wqDCr0DCiUV0NmNOEMOqwq8xHzfDlsKbw5FIwoHDiGJbT8KXw7PCq0jCosOSBsONEcK1woBDWirCiRDCkMK5w74VdnbDh3LClHLCnsOdw7zDlSzCmMOpwoUIb8Oiw5N2AcOywpjCtHojUsOgwrUIfA06AMKrw59CY8O/VAXDksOUA8O2wpMyfsO0wrAaTcKnw68XI8K7bz8Uw7TDoMKpwpXDncKqw5XDocOGwrbDj8KZFsK7dMOgCcKIwpbDpsOOPMO+w5drJ8Oiw77CvS3CiX3CmmjDtMO9Dz4+TVPDgcKheyMcPMOWfsK5wprDgMOrGX5gU8O+TcK+c8KrM8O+G8ODw6cIw6vCjT7Dl8KBGWcTM8OuZcOqw6bCi1jDqn1Kw4TDnsKuw5V0V8OJwrvCmhPDtAd+VUh1fMKMCBYQcsOxOcKMwroSHl9lw6nCmsKIJsK9LULDncKbwrDCiyR8w63ClMKrwo9Cb8OUOkQBwokbcMK9w5HCpjZXwpnCmk9XwonClx/DjMO8Nh8CS8Okfj7ClxPCnkhywq/ClQlpKMKzw5MIw4rDm2EwwpfDrMOSw7rClMOuwoNDw5DDkCTCpyUOS33DlHvDrsO1WcK5w7gjwpEPw7J1w74Vw6c6RGjDmsK+JcKZwqtAwq7ClnXCkFpyYwcvw5RmLnPDlMKzT8OMYwYFw47CjMKrXcKEDExxwoBQwpPCn8K6ZHnCr8K/TGTDrcK8DMKBF0FUw7nDgGw9w7U2NU9Bwo4IL8OBw41rw7xEQAPDgMKAwp3DkMK4w5Q0wqnDhMOow6RVa0lOwp7CqGg7S8O3w55cFnMBdMOKdMOgTsKRccOLw60OKcOaYTQ1wonClH8ubMKqBsOpYlfCtMKsQMOBwrsiwpbCkEkHw6HCgcOCKcKvTsOAwqvCv1R7LSXDvRMZAMODwo4ZEcOMVMOcwr50OHnDigMiwpk1w61fwoofwqFWwqItRGDCg3/CuyHCusO5wp7DulTDlsK1w6XDucKhwovCnMOnw4NrCcKqwqNgworDiFdDw4XDiQfCocOZwpzDmRLCo1LDq0LDrsKGc8O5w4MHwozCkkbClMO3ekMDw7RWPMOXwobCpMOwwoHCgiUeDsO1dC9TX3UTw78efmLDrsK1CsOuR8OtwpTChcKeIUIYbsOcw7MWX2fClMKHwpo1w7oXw7sfw6rDiWzDiAASw5NkNsOewqvDuENmwpxgw5oJIcO4woDCn0lPDlLCknzDiWY1w67DpDkQZsK+GGXChcKaesOBd8Obw5fDnMKjwq15wokJaMOKT8OAwp4Two8ww6NuGQ4wwqnCligpc1TCncKgw7NWBhZfw5zDkxPDiCp3ICRnVCrDtmhRQm7DkgYaIAh6E0xNeQ15wqrCklfDjMOSE8KBw74Ww7sPw6hRwqLCjjPCngQxSMK1wo/CnMKvOCsEe8OCWMKnBUbCj8Kdw6U2I8OMY8OUZcK2B3jCicOKfMOZw7vDjcOrw5zDpEgVCMOjScOJSRTDnh8+w6HDlMKFw7jDmCrDtMKSVcKjw4YzwrTDpMOEwpfDlMKGwpN4OcKTRGEeKsOwL8K1wqbCgWjCtCfCjcO7Ric/wrhyMXLDi8Kvw6IKMsOGF2/DoFvDqMOQwoRFMWxAT8OJDMOXwovDoFvDokc9w4DCriMjA0tZwrwQAMOrWCkSw5rCisKQw4fDuX4TPMOzwobDsDDCjWPCggLDtyBkw5bCpyJuOFTCgRnDg3HDvcO5wqZfXcOmwotbwr0Iw44heUTCu8KXVcK2bktFwqLCuSlnA8O8w7XDui3CocKdw5vCkMKuNHHCv8K+B8KIB1kcwqQpwp7DuMKfInZXI3wQCwDClMKgwoM5w6wYccKOAMKYHRnDm8KMwp3CmD5sBsKeGATChlfDlsOhw719wrA+w4VTwpgSw7HCmTTDkMKwEcKFwpBDwqRkwpTDrBgJwr4ewrtMDcK1wrDCvTXDjsK6w5XDtcK7wrBxIsKvV8KJwr7Cg8KQUxtSK012wrYsUMK5GsKGw4AhBEh9FjdzL8OQTQEcU0rCvsOTw57DrWsTw6IWUmDCiMKnBMOZHcKQwq7Dpl9THCvCgnDDqFnCqcO3wqTCuQxjQ8KxKMOIZQkDAMKvw77CrUk6w6JeCcOPw7fClknDm8OvwqzDgMKqw6PCvwwEISvDvsK2cMO/F8Oaw43DviASw4jChsOyw7xEeinCoHpIAsKycsKxwoTDk8KYw4MewrnCs8OXwofDhcK7w6tALzFRw7rDrjrCoMKDTsK+w753wrkxwp7Ct8OXPsKyRMOoZcKiHcOdPQjCq2bCgSnCr8ONMMKCw5/DnBHCuFsBBMOmRMK7RsKHw4lxCwDDgQXCvk54wp4aEsKtwrlcE0xPasOzWcOnVsObMjPCj8OgwoIMwqlnwpciQcONPzXCqBXCqcOrw5h7wr5Ww7dOYRXDuDNmw5rCusKjw5Ykw7sFC8KwVVsuPkwqw5XDrk/DssOYDcKNVsOIwpTDjMOwXcOjNcOWRmrCjx3DiihTwonDjcONw4IDIVXChi8fw4VWeRbDuF0Aw45mM8KpEsOow6gKwrtewowWCWrDn8O2w79BUjB3DsOHUCzCnltOCT4wwrl0w6/ChgvDk8KfwqnDsHhVf8Kww4LDqMKfwrfDq2HCs2TCrMOeLsKnwpDDoT4kXMKDw7sCwoUvw6XCjF/CqcOww4A7w5rDkS1/O8ODJcKeJ1rDq8OTw6HDt8Knw64Ww7DCqETDi8OXwpwnw6wsw7PDpgvDuEDDpRnDjDROHwzCrSlUw6Q4BHLDmhLCvMOvw78Aw73DtABmwozDlmTDkAAAAABJRU5Ewq5CYMKC"}]}]}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment