1 line
36 KiB
Python
1 line
36 KiB
Python
IyBDb3B5cmlnaHQgKEMpIDIwMjQgQ2V0bWl4IE/DnAojIExpY2Vuc2UgQUdQTC0zLjAgb3IgbGF0ZXIgKGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsKS4KCgpmcm9tIG9kb28gaW1wb3J0IF8KZnJvbSBvZG9vLmV4Y2VwdGlvbnMgaW1wb3J0IEFjY2Vzc0Vycm9yLCBWYWxpZGF0aW9uRXJyb3IKZnJvbSBvZG9vLnRlc3RzIGltcG9ydCBUcmFuc2FjdGlvbkNhc2UsIHRhZ2dlZAoKCmNsYXNzIFRlc3RUb3dlcllhbWxNaXhpbihUcmFuc2FjdGlvbkNhc2UpOgogICAgQGNsYXNzbWV0aG9kCiAgICBkZWYgc2V0VXBDbGFzcyhjbHMsICphcmdzLCAqKmt3YXJncyk6CiAgICAgICAgc3VwZXIoKS5zZXRVcENsYXNzKCphcmdzLCAqKmt3YXJncykKICAgICAgICBjbHMuVXNlcnMgPSBjbHMuZW52WyJyZXMudXNlcnMiXS53aXRoX2NvbnRleHQobm9fcmVzZXRfcGFzc3dvcmQ9VHJ1ZSkKICAgICAgICBjbHMuWWFtbE1peGluID0gY2xzLmVudlsiY3gudG93ZXIueWFtbC5taXhpbiJdCiAgICAgICAgY2xzLkNvbW1hbmQgPSBjbHMuZW52WyJjeC50b3dlci5jb21tYW5kIl0KICAgICAgICBjbHMuSmV0VGVtcGxhdGUgPSBjbHMuZW52WyJjeC50b3dlci5qZXQudGVtcGxhdGUiXQogICAgICAgIGNscy5TY2hlZHVsZWRUYXNrID0gY2xzLmVudlsiY3gudG93ZXIuc2NoZWR1bGVkLnRhc2siXQogICAgICAgIFRvd2VyVGFnID0gY2xzLmVudlsiY3gudG93ZXIudGFnIl0KICAgICAgICBjbHMudGFnX2RvZ2UgPSBUb3dlclRhZy5jcmVhdGUoeyJuYW1lIjogIkRvZ2UiLCAicmVmZXJlbmNlIjogImRvZ2UifSkKICAgICAgICBjbHMudGFnX3BlcGUgPSBUb3dlclRhZy5jcmVhdGUoeyJuYW1lIjogIlBlcGUiLCAicmVmZXJlbmNlIjogInBlcGUifSkKICAgICAgICBjbHMuamV0X3N0YXRlX3J1bm5pbmcgPSBjbHMuZW52WyJjeC50b3dlci5qZXQuc3RhdGUiXS5nZXRfYnlfcmVmZXJlbmNlKAogICAgICAgICAgICAicnVubmluZyIKICAgICAgICApCiAgICAgICAgY2xzLmNvbW1hbmRfZm9yX3NjaGVkdWxlID0gY2xzLkNvbW1hbmQuY3JlYXRlKAogICAgICAgICAgICB7Im5hbWUiOiAiQ29tbWFuZCBmb3Igc2NoZWR1bGUiLCAiYWN0aW9uIjogInNzaF9jb21tYW5kIn0KICAgICAgICApCiAgICAgICAgY2xzLmpldF90ZW1wbGF0ZV9leGlzdGluZyA9IGNscy5lbnZbImN4LnRvd2VyLmpldC50ZW1wbGF0ZSJdLmNyZWF0ZSgKICAgICAgICAgICAgeyJuYW1lIjogIkV4aXN0aW5nIEpldCBUZW1wbGF0ZSIsICJyZWZlcmVuY2UiOiAiZXhpc3RpbmdfamV0X3RlbXBsYXRlIn0KICAgICAgICApCiAgICAgICAgY2xzLndheXBvaW50X3RlbXBsYXRlX2V4aXN0aW5nID0gY2xzLmVudlsKICAgICAgICAgICAgImN4LnRvd2VyLmpldC53YXlwb2ludC50ZW1wbGF0ZSIKICAgICAgICBdLmNyZWF0ZSgKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIm5hbWUiOiAiRXhpc3RpbmcgV2F5cG9pbnQgVGVtcGxhdGUiLAogICAgICAgICAgICAgICAgInJlZmVyZW5jZSI6ICJleGlzdGluZ193YXlwb2ludF90ZW1wbGF0ZSIsCiAgICAgICAgICAgICAgICAiamV0X3RlbXBsYXRlX2lkIjogY2xzLmpldF90ZW1wbGF0ZV9leGlzdGluZy5pZCwKICAgICAgICAgICAgfQogICAgICAgICkKCiAgICBkZWYgdGVzdF9jb252ZXJ0X2RpY3RfdG9feWFtbChzZWxmKToKICAgICAgICAjIC0tIDEgLS0KICAgICAgICAjIFRlc3QgcmVndWxhciBmbG93CiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKICAgICAgICAgICAgc2VsZi5ZYW1sTWl4aW4uX2NvbnZlcnRfZGljdF90b195YW1sKHsiYSI6IDEsICJiIjogMn0pLAogICAgICAgICAgICAiYTogMVxuYjogMlxuIiwKICAgICAgICAgICAgIkRpY3Rpb25hcnkgd2FzIG5vdCBjb252ZXJ0ZWQgdG8gWUFNTCBjb3JyZWN0bHkiLAogICAgICAgICkKCiAgICAgICAgIyAtLSAyIC0tCiAgICAgICAgIyBUZXN0IGZsb3cgd2l0aCBleGNlcHRpb24gZHVlIHRvIHdyb25nIHZhbHVlcwogICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoVmFsaWRhdGlvbkVycm9yKSBhcyBlOgogICAgICAgICAgICBzZWxmLllhbWxNaXhpbi5fY29udmVydF9kaWN0X3RvX3lhbWwoIm5vdF9hX2RpY3QiKQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCiAgICAgICAgICAgIHN0cihlLmV4Y2VwdGlvbiksCiAgICAgICAgICAgIF8oIlZhbHVlcyBtdXN0IGJlIGEgZGljdGlvbmFyeSIpLAogICAgICAgICAgICAiRXhjZXB0aW9uIG1lc3NhZ2UgZG9lc24ndCBtYXRjaCIsCiAgICAgICAgKQoKICAgIGRlZiB0ZXN0X3lhbWxfZmllbGRfYWNjZXNzKHNlbGYpOgogICAgICAgICMgQ3JlYXRlIFJvb3QgdXNlciB3aXRoIG5vIGFjY2VzcyB0byB0aGUgJ3lhbWxfY29kZSBmaWVsZAogICAgICAgIHVzZXJfcm9vdCA9IHNlbGYuVXNlcnMuY3JlYXRlKAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAibmFtZSI6ICJSb290IFVzZXIiLAogICAgICAgICAgICAgICAgImxvZ2luIjogInJvb3RAZXhhbXBsZS5jb20iLAogICAgICAgICAgICAgICAgImdyb3Vwc19pZCI6IFsKICAgICAgICAgICAgICAgICAgICAoNCwgc2VsZi5lbnYucmVmKCJiYXNlLmdyb3VwX3VzZXIiKS5pZCksCiAgICAgICAgICAgICAgICAgICAgKDQsIHNlbGYuZW52LnJlZigiY2V0bWl4X3Rvd2VyX3NlcnZlci5ncm91cF9yb290IikuaWQpLAogICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgfQogICAgICAgICkKICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKEFjY2Vzc0Vycm9yKToKICAgICAgICAgICAgc2VsZi50YWdfZG9nZS53aXRoX3VzZXIodXNlcl9yb290KS5yZWFkKFsieWFtbF9jb2RlIl0pCgogICAgICAgICMgQWRkIHVzZXIgdG8gdGhlICdjZXRtaXhfdG93ZXJfeWFtbC5ncm91cF9leHBvcnQnIGdyb3VwCiAgICAgICAgIyBhbmQgY2hlY2sgaWYgYWNjZXNzIGlzIGdyYW50ZWQKICAgICAgICB1c2VyX3Jvb3Qud3JpdGUoCiAgICAgICAgICAgIHsiZ3JvdXBzX2lkIjogWyg0LCBzZWxmLmVudi5yZWYoImNldG1peF90b3dlcl95YW1sLmdyb3VwX2V4cG9ydCIpLmlkKV19CiAgICAgICAgKQogICAgICAgIHlhbWxfY29kZSA9ICgKICAgICAgICAgICAgc2VsZi50YWdfZG9nZS53aXRoX3VzZXIodXNlcl9yb290KS5yZWFkKFsieWFtbF9jb2RlIl0pWzBdLmdldCgieWFtbF9jb2RlIikKICAgICAgICApCgogICAgICAgICMgTW9kaWZ5IFlBTUwgY29kZSBhbmQgY2hlY2sgaWYgaXQncyBzYXZlZAogICAgICAgIHlhbWxfY29kZSA9IHlhbWxfY29kZS5yZXBsYWNlKCJEb2dlIiwgIldvd0RvZ2UiKQogICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoQWNjZXNzRXJyb3IpOgogICAgICAgICAgICBzZWxmLnRhZ19kb2dlLndpdGhfdXNlcih1c2VyX3Jvb3QpLndyaXRlKHsieWFtbF9jb2RlIjogeWFtbF9jb2RlfSkKCiAgICAgICAgIyBBZGQgdXNlciB0byB0aGUgJ2NldG1peF90b3dlcl95YW1sLmdyb3VwX2ltcG9ydCcgZ3JvdXAKICAgICAgICAjIGFuZCBjaGVjayBpZiBhY2Nlc3MgaXMgZ3JhbnRlZAogICAgICAgIHVzZXJfcm9vdC53cml0ZSgKICAgICAgICAgICAgeyJncm91cHNfaWQiOiBbKDQsIHNlbGYuZW52LnJlZigiY2V0bWl4X3Rvd2VyX3lhbWwuZ3JvdXBfaW1wb3J0IikuaWQpXX0KICAgICAgICApCiAgICAgICAgc2VsZi50YWdfZG9nZS53aXRoX3VzZXIodXNlcl9yb290KS53cml0ZSh7InlhbWxfY29kZSI6IHlhbWxfY29kZX0pCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKICAgICAgICAgICAgc2VsZi50YWdfZG9nZS53aXRoX3VzZXIodXNlcl9yb290KS55YW1sX2NvZGUsCiAgICAgICAgICAgIHlhbWxfY29kZSwKICAgICAgICAgICAgIllBTUwgY29kZSB3YXMgbm90IHNhdmVkIiwKICAgICAgICApCgogICAgZGVmIHRlc3RfcG9zdF9wcm9jZXNzX3JlY29yZF92YWx1ZXMoc2VsZik6CiAgICAgICAgIiIiVGVzdCB2YWx1ZSBwb3N0IHByb2Nlc3NpbmcuCiAgICAgICAgV2UgdGVzdCBjb21tb24gZmllbGRzIG9ubHkgYmVjYXVzZSB0aGlzIG1ldGhvZCBjYW4gYmUgb3ZlcnJpZGRlbgogICAgICAgIGluIG1vZGVscyBpbmhlcml0aW5nIHRoaXMgbWl4aW4uCiAgICAgICAgIiIiCgogICAgICAgICMgUGF0Y2ggbWV0aG9kIHRvIHJldHVybiAiYWNjZXNzX2xldmVsIiBmaWVsZCB0b28KICAgICAgICBkZWYgX2dldF9maWVsZHNfZm9yX3lhbWwoc2VsZik6CiAgICAgICAgICAgIHJldHVybiBbImFjY2Vzc19sZXZlbCIsICJuYW1lIiwgInJlZmVyZW5jZSJdCgogICAgICAgIHNlbGYuWWFtbE1peGluLl9wYXRjaF9tZXRob2QoIl9nZXRfZmllbGRzX2Zvcl95YW1sIiwgX2dldF9maWVsZHNfZm9yX3lhbWwpCgogICAgICAgIHNvdXJjZV92YWx1ZXMgPSB7CiAgICAgICAgICAgICJhY2Nlc3NfbGV2ZWwiOiAiMyIsCiAgICAgICAgICAgICJpZCI6IDIyMzMyLAogICAgICAgICAgICAibmFtZSI6ICJEb2dlIE11Y2ggTGlrZSIsCiAgICAgICAgICAgICJyZWZlcmVuY2UiOiAic3VjaF9tdWNoX2RvZ2UiLAogICAgICAgIH0KCiAgICAgICAgcmVzdWx0X3ZhbHVlcyA9IHNlbGYuWWFtbE1peGluLl9wb3N0X3Byb2Nlc3NfcmVjb3JkX3ZhbHVlcyhzb3VyY2VfdmFsdWVzLmNvcHkoKSkKCiAgICAgICAgc2VsZi5hc3NlcnROb3RJbigiaWQiLCByZXN1bHRfdmFsdWVzLCAiSUQgbXVzdCBiZSByZW1vdmVkIikKICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAogICAgICAgICAgICByZXN1bHRfdmFsdWVzWyJhY2Nlc3NfbGV2ZWwiXSwKICAgICAgICAgICAgc2VsZi5ZYW1sTWl4aW4uVE9fWUFNTF9BQ0NFU1NfTEVWRUxbc291cmNlX3ZhbHVlc1siYWNjZXNzX2xldmVsIl1dLAogICAgICAgICAgICAiQWNjZXNzIGxldmVsIGlzIG5vdCBwYXJzZWQgY29ycmVjdGx5IiwKICAgICAgICApCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKICAgICAgICAgICAgcmVzdWx0X3ZhbHVlc1sibmFtZSJdLAogICAgICAgICAgICBzb3VyY2VfdmFsdWVzWyJuYW1lIl0sCiAgICAgICAgICAgICJPdGhlciB2YWx1ZXMgc2hvdWxkIHJlbWFpbiB1bmNoYW5nZWQiLAogICAgICAgICkKICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAogICAgICAgICAgICByZXN1bHRfdmFsdWVzWyJyZWZlcmVuY2UiXSwKICAgICAgICAgICAgc291cmNlX3ZhbHVlc1sicmVmZXJlbmNlIl0sCiAgICAgICAgICAgICJPdGhlciB2YWx1ZXMgc2hvdWxkIHJlbWFpbiB1bmNoYW5nZWQiLAogICAgICAgICkKCiAgICAgICAgIyBSZXN0b3JlIG9yaWdpbmFsIG1ldGhvZAogICAgICAgIHNlbGYuWWFtbE1peGluLl9yZXZlcnRfbWV0aG9kKCJfZ2V0X2ZpZWxkc19mb3JfeWFtbCIpCgogICAgZGVmIHRlc3RfcG9zdF9wcm9jZXNzX3lhbWxfZGljdF92YWx1ZXMoc2VsZik6CiAgICAgICAgIiIiVGVzdCBZQU1MIGRpY3QgdmFsdWUgcG9zdCBwcm9jZXNzaW5nLgogICAgICAgIFdlIHRlc3QgY29tbW9uIGZpZWxkcyBvbmx5IGJlY2F1c2UgdGhpcyBtZXRob2QgY2FuIGJlIG92ZXJyaWRkZW4KICAgICAgICBpbiBtb2RlbHMgaW5oZXJpdGluZyB0aGlzIG1peGluLgogICAgICAgICIiIgoKICAgICAgICAjIFBhdGNoIG1ldGhvZCB0byByZXR1cm4gImFjY2Vzc19sZXZlbCIgZmllbGQgdG9vCiAgICAgICAgZGVmIF9nZXRfZmllbGRzX2Zvcl95YW1sKHNlbGYpOgogICAgICAgICAgICByZXR1cm4gWyJhY2Nlc3NfbGV2ZWwiLCAibmFtZSIsICJyZWZlcmVuY2UiXQoKICAgICAgICBzZWxmLllhbWxNaXhpbi5fcGF0Y2hfbWV0aG9kKCJfZ2V0X2ZpZWxkc19mb3JfeWFtbCIsIF9nZXRfZmllbGRzX2Zvcl95YW1sKQoKICAgICAgICAjIC0tIDEgLS0KICAgICAgICAjIFRlc3QgcmVndWxhciBmbG93CiAgICAgICAgc291cmNlX3ZhbHVlcyA9IHsKICAgICAgICAgICAgImFjY2Vzc19sZXZlbCI6ICJ1c2VyIiwKICAgICAgICAgICAgIm5hbWUiOiAiRG9nZSBNdWNoIExpa2UiLAogICAgICAgICAgICAicmVmZXJlbmNlIjogInN1Y2hfbXVjaF9kb2dlIiwKICAgICAgICAgICAgInNvbWVfZG9nZV9maWVsZCI6ICJzb21lX21lbWUiLAogICAgICAgIH0KCiAgICAgICAgcmVzdWx0X3ZhbHVlcyA9IHNlbGYuWWFtbE1peGluLl9wb3N0X3Byb2Nlc3NfeWFtbF9kaWN0X3ZhbHVlcygKICAgICAgICAgICAgc291cmNlX3ZhbHVlcy5jb3B5KCkKICAgICAgICApCiAgICAgICAgc2VsZi5hc3NlcnROb3RJbigKICAgICAgICAgICAgInNvbWVfZG9nZV9maWVsZCIsIHJlc3VsdF92YWx1ZXMsICJOb24gbGlzdGVkIGZpZWxkcyBtdXN0IGJlIHJlbW92ZWQiCiAgICAgICAgKQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCiAgICAgICAgICAgIHJlc3VsdF92YWx1ZXNbImFjY2Vzc19sZXZlbCJdLAogICAgICAgICAgICBzZWxmLllhbWxNaXhpbi5UT19UT1dFUl9BQ0NFU1NfTEVWRUxbc291cmNlX3ZhbHVlc1siYWNjZXNzX2xldmVsIl1dLAogICAgICAgICAgICAiQWNjZXNzIGxldmVsIGlzIG5vdCBwYXJzZWQgY29ycmVjdGx5IiwKICAgICAgICApCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKICAgICAgICAgICAgcmVzdWx0X3ZhbHVlc1sibmFtZSJdLAogICAgICAgICAgICBzb3VyY2VfdmFsdWVzWyJuYW1lIl0sCiAgICAgICAgICAgICJPdGhlciB2YWx1ZXMgc2hvdWxkIHJlbWFpbiB1bmNoYW5nZWQiLAogICAgICAgICkKICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAogICAgICAgICAgICByZXN1bHRfdmFsdWVzWyJyZWZlcmVuY2UiXSwKICAgICAgICAgICAgc291cmNlX3ZhbHVlc1sicmVmZXJlbmNlIl0sCiAgICAgICAgICAgICJPdGhlciB2YWx1ZXMgc2hvdWxkIHJlbWFpbiB1bmNoYW5nZWQiLAogICAgICAgICkKCiAgICAgICAgIyAtLSBUZXN0IDIgLS0KICAgICAgICAjIFN1Ym1pdCB3cm9uZyB2YWx1ZSBmb3IgYWNjZXNzIGxldmVsCiAgICAgICAgc291cmNlX3ZhbHVlcy51cGRhdGUoCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICJhY2Nlc3NfbGV2ZWwiOiAiZG9nZSIsCiAgICAgICAgICAgIH0KICAgICAgICApCiAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhWYWxpZGF0aW9uRXJyb3IpIGFzIGU6CiAgICAgICAgICAgIHJlc3VsdF92YWx1ZXMgPSBzZWxmLllhbWxNaXhpbi5fcG9zdF9wcm9jZXNzX3lhbWxfZGljdF92YWx1ZXMoCiAgICAgICAgICAgICAgICBzb3VyY2VfdmFsdWVzLmNvcHkoKQogICAgICAgICAgICApCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKICAgICAgICAgICAgc3RyKGUuZXhjZXB0aW9uKSwKICAgICAgICAgICAgXygKICAgICAgICAgICAgICAgICJXcm9uZyB2YWx1ZSBmb3IgJ2FjY2Vzc19sZXZlbCcga2V5OiAlKGFjdilzIiwKICAgICAgICAgICAgICAgIGFjdj0iZG9nZSIsCiAgICAgICAgICAgICksCiAgICAgICAgICAgICJFeGNlcHRpb24gbWVzc2FnZSBkb2Vzbid0IG1hdGNoIiwKICAgICAgICApCgogICAgICAgICMgUmVzdG9yZSBvcmlnaW5hbCBtZXRob2QKICAgICAgICBzZWxmLllhbWxNaXhpbi5fcmV2ZXJ0X21ldGhvZCgiX2dldF9maWVsZHNfZm9yX3lhbWwiKQoKICAgIGRlZiB0ZXN0X3Bvc3RfcHJvY2Vzc195YW1sX2RpY3RfdmFsdWVzX2RlZmVyc19jb21tYW5kX3RlbXBsYXRlX2xpbmtzKHNlbGYpOgogICAgICAgICIiIlJlZmVyZW5jZS1vbmx5IHVucmVzb2x2ZWQgY29tbWFuZCB0ZW1wbGF0ZSBsaW5rcyBtdXN0IGJlIGRlZmVycmVkLiIiIgogICAgICAgIGRlZmVycmVkX3F1ZXVlID0gW10KICAgICAgICB2YWx1ZXMgPSB7CiAgICAgICAgICAgICJyZWZlcmVuY2UiOiAiY29tbWFuZF9kZWZlcnJlZF9saW5rcyIsCiAgICAgICAgICAgICJuYW1lIjogIkNvbW1hbmQgRGVmZXJyZWQgTGlua3MiLAogICAgICAgICAgICAiYWN0aW9uIjogImpldF9hY3Rpb24iLAogICAgICAgICAgICAiamV0X3RlbXBsYXRlX2lkIjogImZ1dHVyZV9qZXRfdGVtcGxhdGUiLAogICAgICAgICAgICAid2F5cG9pbnRfdGVtcGxhdGVfaWQiOiB7InJlZmVyZW5jZSI6ICJmdXR1cmVfd2F5cG9pbnRfdGVtcGxhdGUifSwKICAgICAgICB9CgogICAgICAgIHJlc3VsdF92YWx1ZXMgPSBzZWxmLkNvbW1hbmQud2l0aF9jb250ZXh0KAogICAgICAgICAgICB5YW1sX2RlZmVycmVkX20yb19xdWV1ZT1kZWZlcnJlZF9xdWV1ZQogICAgICAgICkuX3Bvc3RfcHJvY2Vzc195YW1sX2RpY3RfdmFsdWVzKHZhbHVlcykKCiAgICAgICAgc2VsZi5hc3NlcnROb3RJbigKICAgICAgICAgICAgImpldF90ZW1wbGF0ZV9pZCIsCiAgICAgICAgICAgIHJlc3VsdF92YWx1ZXMsCiAgICAgICAgICAgICJEZWZlcnJlZCBqZXQgdGVtcGxhdGUgbGluayBtdXN0IGJlIG9taXR0ZWQgZnJvbSBmaXJzdC1wYXNzIHZhbHVlcyIsCiAgICAgICAgKQogICAgICAgIHNlbGYuYXNzZXJ0Tm90SW4oCiAgICAgICAgICAgICJ3YXlwb2ludF90ZW1wbGF0ZV9pZCIsCiAgICAgICAgICAgIHJlc3VsdF92YWx1ZXMsCiAgICAgICAgICAgICJEZWZlcnJlZCB3YXlwb2ludCB0ZW1wbGF0ZSBsaW5rIG11c3QgYmUgb21pdHRlZCBmcm9tIGZpcnN0LXBhc3MgdmFsdWVzIiwKICAgICAgICApCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oZGVmZXJyZWRfcXVldWUpLCAyLCAiVHdvIGRlZmVycmVkIGl0ZW1zIG11c3QgYmUgcXVldWVkIikKICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAogICAgICAgICAgICBkZWZlcnJlZF9xdWV1ZVswXVsicmVjb3JkX3JlZmVyZW5jZSJdLAogICAgICAgICAgICB2YWx1ZXNbInJlZmVyZW5jZSJdLAogICAgICAgICAgICAiRGVmZXJyZWQgcXVldWUgbXVzdCBwcmVzZXJ2ZSBjb21tYW5kIHJlZmVyZW5jZSIsCiAgICAgICAgKQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCiAgICAgICAgICAgIGRlZmVycmVkX3F1ZXVlWzBdWyJmaWVsZF9uYW1lIl0sCiAgICAgICAgICAgICJqZXRfdGVtcGxhdGVfaWQiLAogICAgICAgICAgICAiRGVmZXJyZWQgcXVldWUgbXVzdCBwcmVzZXJ2ZSB0aGUgZGVmZXJyZWQgZmllbGQgbmFtZSIsCiAgICAgICAgKQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCiAgICAgICAgICAgIGRlZmVycmVkX3F1ZXVlWzFdWyJmaWVsZF9uYW1lIl0sCiAgICAgICAgICAgICJ3YXlwb2ludF90ZW1wbGF0ZV9pZCIsCiAgICAgICAgICAgICJEZWZlcnJlZCBxdWV1ZSBtdXN0IHByZXNlcnZlIGVhY2ggZGVmZXJyZWQgZmllbGQgc2VwYXJhdGVseSIsCiAgICAgICAgKQoKICAgIGRlZiB0ZXN0X3Bvc3RfcHJvY2Vzc195YW1sX2RpY3RfdmFsdWVzX3Jlc29sdmVzX2V4aXN0aW5nX2NvbW1hbmRfdGVtcGxhdGVfbGlua3MoCiAgICAgICAgc2VsZgogICAgKToKICAgICAgICAiIiJBbHJlYWR5IGV4aXN0aW5nIGNvbW1hbmQgdGVtcGxhdGUgbGlua3MgbXVzdCBiZSByZXNvbHZlZCBpbW1lZGlhdGVseS4iIiIKICAgICAgICBkZWZlcnJlZF9xdWV1ZSA9IFtdCiAgICAgICAgdmFsdWVzID0gewogICAgICAgICAgICAicmVmZXJlbmNlIjogImNvbW1hbmRfaW1tZWRpYXRlX2xpbmtzIiwKICAgICAgICAgICAgIm5hbWUiOiAiQ29tbWFuZCBJbW1lZGlhdGUgTGlua3MiLAogICAgICAgICAgICAiYWN0aW9uIjogImNyZWF0ZV93YXlwb2ludCIsCiAgICAgICAgICAgICJqZXRfdGVtcGxhdGVfaWQiOiBzZWxmLmpldF90ZW1wbGF0ZV9leGlzdGluZy5yZWZlcmVuY2UsCiAgICAgICAgICAgICJ3YXlwb2ludF90ZW1wbGF0ZV9pZCI6IHsKICAgICAgICAgICAgICAgICJyZWZlcmVuY2UiOiBzZWxmLndheXBvaW50X3RlbXBsYXRlX2V4aXN0aW5nLnJlZmVyZW5jZQogICAgICAgICAgICB9LAogICAgICAgIH0KCiAgICAgICAgcmVzdWx0X3ZhbHVlcyA9IHNlbGYuQ29tbWFuZC53aXRoX2NvbnRleHQoCiAgICAgICAgICAgIHlhbWxfZGVmZXJyZWRfbTJvX3F1ZXVlPWRlZmVycmVkX3F1ZXVlCiAgICAgICAgKS5fcG9zdF9wcm9jZXNzX3lhbWxfZGljdF92YWx1ZXModmFsdWVzKQoKICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAogICAgICAgICAgICByZXN1bHRfdmFsdWVzWyJqZXRfdGVtcGxhdGVfaWQiXSwKICAgICAgICAgICAgc2VsZi5qZXRfdGVtcGxhdGVfZXhpc3RpbmcuaWQsCiAgICAgICAgICAgICJFeGlzdGluZyBqZXQgdGVtcGxhdGUgbXVzdCByZXNvbHZlIGR1cmluZyB0aGUgZmlyc3QgaW1wb3J0IHBhc3MiLAogICAgICAgICkKICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAogICAgICAgICAgICByZXN1bHRfdmFsdWVzWyJ3YXlwb2ludF90ZW1wbGF0ZV9pZCJdLAogICAgICAgICAgICBzZWxmLndheXBvaW50X3RlbXBsYXRlX2V4aXN0aW5nLmlkLAogICAgICAgICAgICAiRXhpc3Rpbmcgd2F5cG9pbnQgdGVtcGxhdGUgbXVzdCByZXNvbHZlIGR1cmluZyB0aGUgZmlyc3QgaW1wb3J0IHBhc3MiLAogICAgICAgICkKICAgICAgICBzZWxmLmFzc2VydEZhbHNlKAogICAgICAgICAgICBkZWZlcnJlZF9xdWV1ZSwKICAgICAgICAgICAgIk5vIGRlZmVycmVkIGl0ZW1zIG11c3QgYmUgcXVldWVkIHdoZW4gdGFyZ2V0cyBhbHJlYWR5IGV4aXN0IiwKICAgICAgICApCgogICAgZGVmIHRlc3RfcG9zdF9wcm9jZXNzX3lhbWxfZGljdF92YWx1ZXNfZGVmZXJzX3RlbXBsYXRlX2RlcGVuZGVuY3lfY2hpbGRyZW4oc2VsZik6CiAgICAgICAgIiIiVW5yZXNvbHZlZCB0ZW1wbGF0ZSBkZXBlbmRlbmN5IGNoaWxkcmVuIG11c3QgYmUgZGVmZXJyZWQuIiIiCiAgICAgICAgZGVmZXJyZWRfcXVldWUgPSBbXQogICAgICAgIHZhbHVlcyA9IHsKICAgICAgICAgICAgInJlZmVyZW5jZSI6ICJvd25lcl90ZW1wbGF0ZV9kZWZlcnJlZF9kZXBlbmRlbmN5IiwKICAgICAgICAgICAgIm5hbWUiOiAiT3duZXIgVGVtcGxhdGUgRGVmZXJyZWQgRGVwZW5kZW5jeSIsCiAgICAgICAgICAgICJ0ZW1wbGF0ZV9yZXF1aXJlc19pZHMiOiBbCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgInJlZmVyZW5jZSI6IEZhbHNlLAogICAgICAgICAgICAgICAgICAgICJ0ZW1wbGF0ZV9yZXF1aXJlZF9pZCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInJlZmVyZW5jZSI6ICJmdXR1cmVfdGVtcGxhdGVfZGVwZW5kZW5jeV90YXJnZXQiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAic3RhdGVfcmVxdWlyZWRfaWQiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJyZWZlcmVuY2UiOiBzZWxmLmpldF9zdGF0ZV9ydW5uaW5nLnJlZmVyZW5jZQogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIF0sCiAgICAgICAgfQoKICAgICAgICByZXN1bHRfdmFsdWVzID0gc2VsZi5KZXRUZW1wbGF0ZS53aXRoX2NvbnRleHQoCiAgICAgICAgICAgIHlhbWxfZGVmZXJyZWRfeDJtX3F1ZXVlPWRlZmVycmVkX3F1ZXVlCiAgICAgICAgKS5fcG9zdF9wcm9jZXNzX3lhbWxfZGljdF92YWx1ZXModmFsdWVzKQoKICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAogICAgICAgICAgICByZXN1bHRfdmFsdWVzLmdldCgidGVtcGxhdGVfcmVxdWlyZXNfaWRzIiksCiAgICAgICAgICAgIFtdLAogICAgICAgICAgICAiRGVmZXJyZWQgZGVwZW5kZW5jeSBjaGlsZCBtdXN0IGJlIHJlbW92ZWQgZnJvbSBmaXJzdC1wYXNzIGNyZWF0ZSB2YWx1ZXMiLAogICAgICAgICkKICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAogICAgICAgICAgICBsZW4oZGVmZXJyZWRfcXVldWUpLAogICAgICAgICAgICAxLAogICAgICAgICAgICAiT25lIGRlcGVuZGVuY3kgY2hpbGQgbXVzdCBiZSBxdWV1ZWQgZm9yIGRlZmVycmVkIGNyZWF0aW9uIiwKICAgICAgICApCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKICAgICAgICAgICAgZGVmZXJyZWRfcXVldWVbMF1bImZpZWxkX25hbWUiXSwKICAgICAgICAgICAgInRlbXBsYXRlX3JlcXVpcmVzX2lkcyIsCiAgICAgICAgICAgICJEZWZlcnJlZCBxdWV1ZSBtdXN0IHByZXNlcnZlIHRoZSBwYXJlbnQgeDJtIGZpZWxkIG5hbWUiLAogICAgICAgICkKICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAogICAgICAgICAgICBkZWZlcnJlZF9xdWV1ZVswXVsidGFyZ2V0X3JlZmVyZW5jZSJdLAogICAgICAgICAgICAiZnV0dXJlX3RlbXBsYXRlX2RlcGVuZGVuY3lfdGFyZ2V0IiwKICAgICAgICAgICAgIkRlZmVycmVkIHF1ZXVlIG11c3QgcHJlc2VydmUgdGhlIG1pc3NpbmcgZGVwZW5kZW5jeSB0YXJnZXQgcmVmZXJlbmNlIiwKICAgICAgICApCgogICAgZGVmIHRlc3RfcG9zdF9wcm9jZXNzX3lhbWxfZGljdF92YWx1ZXNfc2tpcHNfZW1wdHlfc2NoZWR1bGVkX3Rhc2tfY3VzdG9tX3ZhbHVlcygKICAgICAgICBzZWxmCiAgICApOgogICAgICAgICIiIlBsYWNlaG9sZGVyIHNjaGVkdWxlZC10YXNrIGN1c3RvbSB2YWx1ZXMgbXVzdCBiZSBza2lwcGVkLiIiIgogICAgICAgIGRlZmVycmVkX3F1ZXVlID0gW10KICAgICAgICBzY2hlZHVsZWRfdGFza192YWx1ZXMgPSB7CiAgICAgICAgICAgICJyZWZlcmVuY2UiOiAic2NoZWR1bGVkX3Rhc2tfc2tpcF9lbXB0eV9jaGlsZCIsCiAgICAgICAgICAgICJuYW1lIjogIlNjaGVkdWxlZCBUYXNrIFNraXAgRW1wdHkgQ2hpbGQiLAogICAgICAgICAgICAiYWN0aW9uIjogImNvbW1hbmQiLAogICAgICAgICAgICAiY29tbWFuZF9pZCI6IHNlbGYuY29tbWFuZF9mb3Jfc2NoZWR1bGUucmVmZXJlbmNlLAogICAgICAgICAgICAiaW50ZXJ2YWxfbnVtYmVyIjogMSwKICAgICAgICAgICAgImludGVydmFsX3R5cGUiOiAiZGF5cyIsCiAgICAgICAgICAgICJuZXh0X2NhbGwiOiAiMjAyNi0wMy0yNyAwMDowMDowMCIsCiAgICAgICAgICAgICJjdXN0b21fdmFyaWFibGVfdmFsdWVfaWRzIjogW3sicmVmZXJlbmNlIjogRmFsc2V9XSwKICAgICAgICB9CgogICAgICAgIHJlc3VsdF92YWx1ZXMgPSBzZWxmLlNjaGVkdWxlZFRhc2sud2l0aF9jb250ZXh0KAogICAgICAgICAgICB5YW1sX2RlZmVycmVkX3gybV9xdWV1ZT1kZWZlcnJlZF9xdWV1ZQogICAgICAgICkuX3Bvc3RfcHJvY2Vzc195YW1sX2RpY3RfdmFsdWVzKHNjaGVkdWxlZF90YXNrX3ZhbHVlcykKCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKICAgICAgICAgICAgcmVzdWx0X3ZhbHVlcy5nZXQoImN1c3RvbV92YXJpYWJsZV92YWx1ZV9pZHMiKSwKICAgICAgICAgICAgW10sCiAgICAgICAgICAgICJQbGFjZWhvbGRlciBjaGlsZCByb3dzIG11c3QgYmUgcmVtb3ZlZCBmcm9tIHNjaGVkdWxlZCB0YXNrIGltcG9ydCB2YWx1ZXMiLAogICAgICAgICkKICAgICAgICBzZWxmLmFzc2VydEZhbHNlKAogICAgICAgICAgICBkZWZlcnJlZF9xdWV1ZSwKICAgICAgICAgICAgIkVtcHR5IHBsYWNlaG9sZGVyIHJvd3MgbXVzdCBiZSBza2lwcGVkIHJhdGhlciB0aGFuIGRlZmVycmVkIiwKICAgICAgICApCgogICAgZGVmIHRlc3RfcG9zdF9wcm9jZXNzX3lhbWxfZGljdF92YWx1ZXNfZGVmZXJzX3NjaGVkdWxlZF90YXNrX2N1c3RvbV92YWx1ZXMoc2VsZik6CiAgICAgICAgIiIiVW5yZXNvbHZlZCBzY2hlZHVsZWQtdGFzayBjdXN0b20gdmFsdWVzIG11c3QgYmUgZGVmZXJyZWQuIiIiCiAgICAgICAgZGVmZXJyZWRfcXVldWUgPSBbXQogICAgICAgIHNjaGVkdWxlZF90YXNrX3ZhbHVlcyA9IHsKICAgICAgICAgICAgInJlZmVyZW5jZSI6ICJzY2hlZHVsZWRfdGFza19kZWZlcnJlZF9jdXN0b21fdmFsdWUiLAogICAgICAgICAgICAibmFtZSI6ICJTY2hlZHVsZWQgVGFzayBEZWZlcnJlZCBDdXN0b20gVmFsdWUiLAogICAgICAgICAgICAiYWN0aW9uIjogImNvbW1hbmQiLAogICAgICAgICAgICAiY29tbWFuZF9pZCI6IHNlbGYuY29tbWFuZF9mb3Jfc2NoZWR1bGUucmVmZXJlbmNlLAogICAgICAgICAgICAiaW50ZXJ2YWxfbnVtYmVyIjogMSwKICAgICAgICAgICAgImludGVydmFsX3R5cGUiOiAiZGF5cyIsCiAgICAgICAgICAgICJuZXh0X2NhbGwiOiAiMjAyNi0wMy0yNyAwMDowMDowMCIsCiAgICAgICAgICAgICJjdXN0b21fdmFyaWFibGVfdmFsdWVfaWRzIjogWwogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICJyZWZlcmVuY2UiOiBGYWxzZSwKICAgICAgICAgICAgICAgICAgICAidmFyaWFibGVfdmFsdWVfaWQiOiB7InJlZmVyZW5jZSI6ICJmdXR1cmVfdmFyaWFibGVfdmFsdWVfcmVmIn0sCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIF0sCiAgICAgICAgfQoKICAgICAgICByZXN1bHRfdmFsdWVzID0gc2VsZi5TY2hlZHVsZWRUYXNrLndpdGhfY29udGV4dCgKICAgICAgICAgICAgeWFtbF9kZWZlcnJlZF94Mm1fcXVldWU9ZGVmZXJyZWRfcXVldWUKICAgICAgICApLl9wb3N0X3Byb2Nlc3NfeWFtbF9kaWN0X3ZhbHVlcyhzY2hlZHVsZWRfdGFza192YWx1ZXMpCgogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCiAgICAgICAgICAgIHJlc3VsdF92YWx1ZXMuZ2V0KCJjdXN0b21fdmFyaWFibGVfdmFsdWVfaWRzIiksCiAgICAgICAgICAgIFtdLAogICAgICAgICAgICAiRGVmZXJyZWQgc2NoZWR1bGVkLXRhc2sgY2hpbGQgcm93cyBtdXN0IGJlIHJlbW92ZWQgZnJvbSBmaXJzdC1wYXNzIHZhbHVlcyIsCiAgICAgICAgKQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCiAgICAgICAgICAgIGxlbihkZWZlcnJlZF9xdWV1ZSksCiAgICAgICAgICAgIDEsCiAgICAgICAgICAgICJPbmUgc2NoZWR1bGVkLXRhc2sgY3VzdG9tIHZhbHVlIHJvdyBtdXN0IGJlIHF1ZXVlZCBmb3IgZGVmZXJyZWQgY3JlYXRpb24iLAogICAgICAgICkKICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAogICAgICAgICAgICBkZWZlcnJlZF9xdWV1ZVswXVsiZmllbGRfbmFtZSJdLAogICAgICAgICAgICAiY3VzdG9tX3ZhcmlhYmxlX3ZhbHVlX2lkcyIsCiAgICAgICAgICAgICJEZWZlcnJlZCBxdWV1ZSBtdXN0IHByZXNlcnZlIHRoZSBzY2hlZHVsZWQtdGFzayBjaGlsZCBmaWVsZCBuYW1lIiwKICAgICAgICApCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKICAgICAgICAgICAgZGVmZXJyZWRfcXVldWVbMF1bInRhcmdldF9yZWZlcmVuY2UiXSwKICAgICAgICAgICAgImZ1dHVyZV92YXJpYWJsZV92YWx1ZV9yZWYiLAogICAgICAgICAgICAiRGVmZXJyZWQgcXVldWUgbXVzdCBwcmVzZXJ2ZSB0aGUgbWlzc2luZyB2YXJpYWJsZSB2YWx1ZSByZWZlcmVuY2UiLAogICAgICAgICkKCiAgICBkZWYgdGVzdF9wcm9jZXNzX3JlbGF0aW9uX2ZpZWxkX3ZhbHVlX3JlZmVyZW5jZV9vbmx5X2RpY3Rfbm9fcGxhY2Vob2xkZXJfY3JlYXRlKAogICAgICAgIHNlbGYKICAgICk6CiAgICAgICAgIiIiUmVmZXJlbmNlLW9ubHkgZGljdCBtdXN0IG5vdCBjcmVhdGUgcGxhY2Vob2xkZXIgbTJvIHJlY29yZHMuIiIiCiAgICAgICAgY29tbWFuZCA9IHNlbGYuQ29tbWFuZC5jcmVhdGUoCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICJuYW1lIjogIkNvbW1hbmQgcmVmZXJlbmNlLW9ubHkgZGljdCIsCiAgICAgICAgICAgICAgICAiYWN0aW9uIjogImZpbGVfdXNpbmdfdGVtcGxhdGUiLAogICAgICAgICAgICB9CiAgICAgICAgKQogICAgICAgIG1pc3NpbmdfcmVmZXJlbmNlID0gIm1pc3NpbmdfZmlsZV90ZW1wbGF0ZV9yZWZlcmVuY2Vfb25seSIKCiAgICAgICAgcmVzdWx0ID0gY29tbWFuZC5fcHJvY2Vzc19yZWxhdGlvbl9maWVsZF92YWx1ZSgKICAgICAgICAgICAgZmllbGQ9ImZpbGVfdGVtcGxhdGVfaWQiLAogICAgICAgICAgICB2YWx1ZT17InJlZmVyZW5jZSI6IG1pc3NpbmdfcmVmZXJlbmNlfSwKICAgICAgICAgICAgcmVjb3JkX21vZGU9RmFsc2UsCiAgICAgICAgKQoKICAgICAgICBzZWxmLmFzc2VydEZhbHNlKAogICAgICAgICAgICByZXN1bHQsCiAgICAgICAgICAgICJSZWZlcmVuY2Utb25seSBkaWN0IG11c3Qgc3RheSB1bnJlc29sdmVkIGluc3RlYWQgb2YgY3JlYXRpbmcgYSByZWNvcmQiLAogICAgICAgICkKICAgICAgICBzZWxmLmFzc2VydEZhbHNlKAogICAgICAgICAgICBzZWxmLmVudlsiY3gudG93ZXIuZmlsZS50ZW1wbGF0ZSJdLmdldF9ieV9yZWZlcmVuY2UobWlzc2luZ19yZWZlcmVuY2UpLAogICAgICAgICAgICAiUmVmZXJlbmNlLW9ubHkgZGljdCBtdXN0IG5vdCBjcmVhdGUgYSBwbGFjZWhvbGRlciByZWxhdGVkIHJlY29yZCIsCiAgICAgICAgKQoKICAgIGRlZiB0ZXN0X3Byb2Nlc3NfcmVsYXRpb25fZmllbGRfdmFsdWVfbm9fZXhwbG9kZShzZWxmKToKICAgICAgICAiIiJUZXN0IG5vbiBleHBsb2RlZCByZWxhdGVkIGZpZWxkIHZhbHVlcy4KICAgICAgICBOb24gZXhwbG9kZWQgdmFsdWVzIHJlcHJlc2VudCByZWxhdGVkIHJlY29yZCB3aXRoIHJlZmVyZW5jZSBvbmx5LgoKICAgICAgICBDb3ZlcnMgdGhlIGZvbGxvd2luZyBjaGlsZCBmdW5jdGlvbnM6CiAgICAgICAgICAgIC0gX3Byb2Nlc3NfbTJvX3ZhbHVlKC4uKQogICAgICAgICAgICAtIF9wcm9jZXNzX3gybV92YWx1ZXMoLi4pCiAgICAgICAgIiIiCgogICAgICAgICMgV2UgYXJlIHVzaW5nIGNvbW1hbmQgd2l0aCBmaWxlIHRlbXBsYXRlIGZvciB0aGF0CiAgICAgICAgZmlsZV90ZW1wbGF0ZSA9IHNlbGYuZW52WyJjeC50b3dlci5maWxlLnRlbXBsYXRlIl0uY3JlYXRlKAogICAgICAgICAgICB7Im5hbWUiOiAiVGVzdCBtMm8iLCAicmVmZXJlbmNlIjogInRlc3RfbTJvIn0KICAgICAgICApCiAgICAgICAgY29tbWFuZCA9IHNlbGYuZW52WyJjeC50b3dlci5jb21tYW5kIl0uY3JlYXRlKAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAibmFtZSI6ICJDb21tYW5kIHRlc3QgbTJvIiwKICAgICAgICAgICAgICAgICJhY3Rpb24iOiAiZmlsZV91c2luZ190ZW1wbGF0ZSIsCiAgICAgICAgICAgICAgICAiZmlsZV90ZW1wbGF0ZV9pZCI6IGZpbGVfdGVtcGxhdGUuaWQsCiAgICAgICAgICAgICAgICAidGFnX2lkcyI6IFsoNCwgc2VsZi50YWdfZG9nZS5pZCksICg0LCBzZWxmLnRhZ19wZXBlLmlkKV0sCiAgICAgICAgICAgIH0KICAgICAgICApCgogICAgICAgICMgLS0gMSAtLQogICAgICAgICMgUmVjb3JkIC0+IFlhbWwKCiAgICAgICAgIyAtLSAxLjEgLS0KICAgICAgICAjIE1hbnkyb25lCiAgICAgICAgcmVzdWx0ID0gY29tbWFuZC5fcHJvY2Vzc19yZWxhdGlvbl9maWVsZF92YWx1ZSgKICAgICAgICAgICAgZmllbGQ9ImZpbGVfdGVtcGxhdGVfaWQiLAogICAgICAgICAgICB2YWx1ZT0oY29tbWFuZC5maWxlX3RlbXBsYXRlX2lkLmlkLCBjb21tYW5kLmZpbGVfdGVtcGxhdGVfaWQubmFtZSksCiAgICAgICAgICAgIHJlY29yZF9tb2RlPVRydWUsCiAgICAgICAgKQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCiAgICAgICAgICAgIHJlc3VsdCwgZmlsZV90ZW1wbGF0ZS5yZWZlcmVuY2UsICJSZWZlcmVuY2Ugd2FzIG5vdCByZXNvbHZlZCBjb3JyZWN0bHkiCiAgICAgICAgKQogICAgICAgICMgLS0gMS4yIC0tCiAgICAgICAgIyBNYW55Mm1hbnkKICAgICAgICByZXN1bHQgPSBjb21tYW5kLl9wcm9jZXNzX3JlbGF0aW9uX2ZpZWxkX3ZhbHVlKAogICAgICAgICAgICBmaWVsZD0idGFnX2lkcyIsCiAgICAgICAgICAgIHZhbHVlPVtzZWxmLnRhZ19kb2dlLmlkLCBzZWxmLnRhZ19wZXBlLmlkXSwKICAgICAgICAgICAgcmVjb3JkX21vZGU9VHJ1ZSwKICAgICAgICApCgogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKHJlc3VsdCksIDIsICJNdXN0IGJlIDIgcmVmZXJlbmNlcyIpCiAgICAgICAgc2VsZi5hc3NlcnRJbigKICAgICAgICAgICAgc2VsZi50YWdfZG9nZS5yZWZlcmVuY2UsIHJlc3VsdCwgIlJlZmVyZW5jZSB3YXMgbm90IHJlc29sdmVkIGNvcnJlY3RseSIKICAgICAgICApCiAgICAgICAgc2VsZi5hc3NlcnRJbigKICAgICAgICAgICAgc2VsZi50YWdfcGVwZS5yZWZlcmVuY2UsIHJlc3VsdCwgIlJlZmVyZW5jZSB3YXMgbm90IHJlc29sdmVkIGNvcnJlY3RseSIKICAgICAgICApCgogICAgICAgICMgLS0gMiAtLQogICAgICAgICMgWWFtbCAtPiBSZWNvcmQKCiAgICAgICAgIyAtLSAyLjEuIC0tCiAgICAgICAgIyBNYW55Mm9uZQogICAgICAgIHJlc3VsdCA9IGNvbW1hbmQuX3Byb2Nlc3NfcmVsYXRpb25fZmllbGRfdmFsdWUoCiAgICAgICAgICAgIGZpZWxkPSJmaWxlX3RlbXBsYXRlX2lkIiwgdmFsdWU9ZmlsZV90ZW1wbGF0ZS5yZWZlcmVuY2UsIHJlY29yZF9tb2RlPUZhbHNlCiAgICAgICAgKQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCiAgICAgICAgICAgIHJlc3VsdCwgZmlsZV90ZW1wbGF0ZS5pZCwgIlJlY29yZCBJRCB3YXMgbm90IHJlc29sdmVkIGNvcnJlY3RseSIKICAgICAgICApCgogICAgICAgICMgLS0gMi4yIC0tCiAgICAgICAgIyBNYW55Mm1hbnkKICAgICAgICByZXN1bHQgPSBjb21tYW5kLl9wcm9jZXNzX3JlbGF0aW9uX2ZpZWxkX3ZhbHVlKAogICAgICAgICAgICBmaWVsZD0idGFnX2lkcyIsCiAgICAgICAgICAgIHZhbHVlPVtzZWxmLnRhZ19kb2dlLnJlZmVyZW5jZSwgc2VsZi50YWdfcGVwZS5yZWZlcmVuY2VdLAogICAgICAgICAgICByZWNvcmRfbW9kZT1GYWxzZSwKICAgICAgICApCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4ocmVzdWx0KSwgMiwgIk11c3QgYmUgMiByZWNvcmRzIikKICAgICAgICBzZWxmLmFzc2VydEluKAogICAgICAgICAgICAoNCwgc2VsZi50YWdfZG9nZS5pZCksIHJlc3VsdCwgIlJlY29yZCBJRCB3YXMgbm90IHJlc29sdmVkIGNvcnJlY3RseSIKICAgICAgICApCiAgICAgICAgc2VsZi5hc3NlcnRJbigKICAgICAgICAgICAgKDQsIHNlbGYudGFnX3BlcGUuaWQpLCByZXN1bHQsICJSZWNvcmQgSUQgd2FzIG5vdCByZXNvbHZlZCBjb3JyZWN0bHkiCiAgICAgICAgKQoKICAgICAgICAjIC0tIDMgLS0KICAgICAgICAjIFlhbWwgd2l0aCBub24gZXhpc3RpbmcgcmVmZXJlbmNlIC0+IFJlY29yZAogICAgICAgIHJlc3VsdCA9IGNvbW1hbmQuX3Byb2Nlc3NfcmVsYXRpb25fZmllbGRfdmFsdWUoCiAgICAgICAgICAgIGZpZWxkPSJmaWxlX3RlbXBsYXRlX2lkIiwgdmFsdWU9InN1Y2hfbXVjaF9ub3RfcmVmZXJlbmNlIiwgcmVjb3JkX21vZGU9RmFsc2UKICAgICAgICApCiAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShyZXN1bHQsICJNdXN0IGJlICdGYWxzZSciKQoKICAgICAgICAjIC0tIDQgLS0KICAgICAgICAjIE5vIHJlY29yZCAtPiBZYW1sCiAgICAgICAgcmVzdWx0ID0gY29tbWFuZC5fcHJvY2Vzc19yZWxhdGlvbl9maWVsZF92YWx1ZSgKICAgICAgICAgICAgZmllbGQ9ImZpbGVfdGVtcGxhdGVfaWQiLAogICAgICAgICAgICB2YWx1ZT1zZWxmLmVudlsiY3gudG93ZXIuZmlsZS50ZW1wbGF0ZSJdLAogICAgICAgICAgICByZWNvcmRfbW9kZT1UcnVlLAogICAgICAgICkKICAgICAgICBzZWxmLmFzc2VydEZhbHNlKHJlc3VsdCwgIlJlc3VsdCBtdXN0IGJlICdGYWxzZSciKQoKICAgIGRlZiB0ZXN0X3Byb2Nlc3NfcmVsYXRpb25fZmllbGRfdmFsdWVfZXhwbG9kZShzZWxmKToKICAgICAgICAiIiJUZXN0IGV4cGxvZGVkIHJlbGF0ZWQgZmllbGQgdmFsdWVzLgogICAgICAgIEV4cGxvZGVkIHZhbHVlcyByZXByZXNlbnQgcmVsYXRlZCByZWNvcmQgd2l0aCBhIGNoaWxkIFlBTUwgc3RydWN0dXJlLgoKICAgICAgICBDb3ZlcnMgdGhlIGZvbGxvd2luZyBjaGlsZCBmdW5jdGlvbnM6CiAgICAgICAgICAgIC0gX3Byb2Nlc3NfbTJvX3ZhbHVlKC4uKQogICAgICAgICAgICAtIF9wcm9jZXNzX3gybV92YWx1ZXMoLi4pCiAgICAgICAgIiIiCgogICAgICAgICMgV2UgYXJlIHVzaW5nIGNvbW1hbmQgd2l0aCBmaWxlIHRlbXBsYXRlIGZvciB0aGF0CiAgICAgICAgZmlsZV90ZW1wbGF0ZSA9IHNlbGYuZW52WyJjeC50b3dlci5maWxlLnRlbXBsYXRlIl0uY3JlYXRlKAogICAgICAgICAgICB7Im5hbWUiOiAiVGVzdCBtMm8iLCAicmVmZXJlbmNlIjogInRlc3RfbTJvIn0KICAgICAgICApCiAgICAgICAgZmlsZV90ZW1wbGF0ZV92YWx1ZXMgPSBmaWxlX3RlbXBsYXRlLndpdGhfY29udGV4dCgKICAgICAgICAgICAgbm9feWFtbF9zZXJ2aWNlX2ZpZWxkcz1UcnVlCiAgICAgICAgKS5fcHJlcGFyZV9yZWNvcmRfZm9yX3lhbWwoKQogICAgICAgIHRhZ19kb2dlX3ZhbHVlcyA9IHNlbGYudGFnX2RvZ2Uud2l0aF9jb250ZXh0KAogICAgICAgICAgICBub195YW1sX3NlcnZpY2VfZmllbGRzPVRydWUKICAgICAgICApLl9wcmVwYXJlX3JlY29yZF9mb3JfeWFtbCgpCiAgICAgICAgdGFnX3BlcGVfdmFsdWVzID0gc2VsZi50YWdfcGVwZS53aXRoX2NvbnRleHQoCiAgICAgICAgICAgIG5vX3lhbWxfc2VydmljZV9maWVsZHM9VHJ1ZQogICAgICAgICkuX3ByZXBhcmVfcmVjb3JkX2Zvcl95YW1sKCkKICAgICAgICBjb21tYW5kID0gKAogICAgICAgICAgICBzZWxmLmVudlsiY3gudG93ZXIuY29tbWFuZCJdCiAgICAgICAgICAgIC5jcmVhdGUoCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIm5hbWUiOiAiQ29tbWFuZCB0ZXN0IG0ybyIsCiAgICAgICAgICAgICAgICAgICAgImFjdGlvbiI6ICJmaWxlX3VzaW5nX3RlbXBsYXRlIiwKICAgICAgICAgICAgICAgICAgICAiZmlsZV90ZW1wbGF0ZV9pZCI6IGZpbGVfdGVtcGxhdGUuaWQsCiAgICAgICAgICAgICAgICAgICAgInRhZ19pZHMiOiBbKDQsIHNlbGYudGFnX2RvZ2UuaWQpLCAoNCwgc2VsZi50YWdfcGVwZS5pZCldLAogICAgICAgICAgICAgICAgfQogICAgICAgICAgICApCiAgICAgICAgICAgIC53aXRoX2NvbnRleHQoZXhwbG9kZV9yZWxhdGVkX3JlY29yZD1UcnVlKQogICAgICAgICkgICMgYW5kIHRoaXMgaXMgdGhlIGFjdHVhbCB0cmlnZ2VyCgogICAgICAgICMgLS0gMSAtLQogICAgICAgICMgUmVjb3JkIC0+IFlhbWwKCiAgICAgICAgIyAtLSAxLjEgLS0KICAgICAgICAjIE1hbnkyb25lCiAgICAgICAgcmVzdWx0ID0gY29tbWFuZC5fcHJvY2Vzc19yZWxhdGlvbl9maWVsZF92YWx1ZSgKICAgICAgICAgICAgZmllbGQ9ImZpbGVfdGVtcGxhdGVfaWQiLAogICAgICAgICAgICB2YWx1ZT0oY29tbWFuZC5maWxlX3RlbXBsYXRlX2lkLmlkLCBjb21tYW5kLmZpbGVfdGVtcGxhdGVfaWQubmFtZSksCiAgICAgICAgICAgIHJlY29yZF9tb2RlPVRydWUsCiAgICAgICAgKQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCiAgICAgICAgICAgIHJlc3VsdCwgZmlsZV90ZW1wbGF0ZV92YWx1ZXMsICJSZWZlcmVuY2Ugd2FzIG5vdCByZXNvbHZlZCBjb3JyZWN0bHkiCiAgICAgICAgKQoKICAgICAgICAjIC0tIDEuMiAtLQogICAgICAgICMgTWFueTJtYW55CiAgICAgICAgcmVzdWx0ID0gY29tbWFuZC5fcHJvY2Vzc19yZWxhdGlvbl9maWVsZF92YWx1ZSgKICAgICAgICAgICAgZmllbGQ9InRhZ19pZHMiLAogICAgICAgICAgICB2YWx1ZT1bc2VsZi50YWdfZG9nZS5pZCwgc2VsZi50YWdfcGVwZS5pZF0sCiAgICAgICAgICAgIHJlY29yZF9tb2RlPVRydWUsCiAgICAgICAgKQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKHJlc3VsdCksIDIsICJNdXN0IGJlIDIgcmVjb3JkcyIpCiAgICAgICAgc2VsZi5hc3NlcnRJbih0YWdfZG9nZV92YWx1ZXMsIHJlc3VsdCwgIlJlY29yZCBJRCB3YXMgbm90IHJlc29sdmVkIGNvcnJlY3RseSIpCiAgICAgICAgc2VsZi5hc3NlcnRJbih0YWdfcGVwZV92YWx1ZXMsIHJlc3VsdCwgIlJlY29yZCBJRCB3YXMgbm90IHJlc29sdmVkIGNvcnJlY3RseSIpCgogICAgICAgICMgLS0gMiAtLQogICAgICAgICMgWWFtbCAtPiBSZWNvcmQKCiAgICAgICAgIyAtLSAyLjEgLS0KICAgICAgICAjIE1hbnkyb25lCiAgICAgICAgcmVzdWx0ID0gY29tbWFuZC5fcHJvY2Vzc19yZWxhdGlvbl9maWVsZF92YWx1ZSgKICAgICAgICAgICAgZmllbGQ9ImZpbGVfdGVtcGxhdGVfaWQiLCB2YWx1ZT1maWxlX3RlbXBsYXRlX3ZhbHVlcywgcmVjb3JkX21vZGU9RmFsc2UKICAgICAgICApCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKICAgICAgICAgICAgcmVzdWx0LCBmaWxlX3RlbXBsYXRlLmlkLCAiUmVjb3JkIElEIHdhcyBub3QgcmVzb2x2ZWQgY29ycmVjdGx5IgogICAgICAgICkKCiAgICAgICAgIyAtLSAyLjIgLS0KICAgICAgICAjIE1hbnkybWFueQogICAgICAgIHJlc3VsdCA9IGNvbW1hbmQuX3Byb2Nlc3NfcmVsYXRpb25fZmllbGRfdmFsdWUoCiAgICAgICAgICAgIGZpZWxkPSJ0YWdfaWRzIiwgdmFsdWU9W3RhZ19kb2dlX3ZhbHVlcywgdGFnX3BlcGVfdmFsdWVzXSwgcmVjb3JkX21vZGU9RmFsc2UKICAgICAgICApCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4ocmVzdWx0KSwgMiwgIk11c3QgYmUgMiByZWNvcmRzIikKICAgICAgICBzZWxmLmFzc2VydEluKAogICAgICAgICAgICAoNCwgc2VsZi50YWdfZG9nZS5pZCksIHJlc3VsdCwgIlJlY29yZCBJRCB3YXMgbm90IHJlc29sdmVkIGNvcnJlY3RseSIKICAgICAgICApCiAgICAgICAgc2VsZi5hc3NlcnRJbigKICAgICAgICAgICAgKDQsIHNlbGYudGFnX3BlcGUuaWQpLCByZXN1bHQsICJSZWNvcmQgSUQgd2FzIG5vdCByZXNvbHZlZCBjb3JyZWN0bHkiCiAgICAgICAgKQogICAgICAgICMgLS0gMyAtLQogICAgICAgICMgWWFtbCB3aXRoIG5vbiBleGlzdGluZyByZWZlcmVuY2UgLT4gUmVjb3JkCiAgICAgICAgZmlsZV90ZW1wbGF0ZV92YWx1ZXMudXBkYXRlKAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAibmFtZSI6ICJWZXJ5IG5ldyBuYW1lIiwKICAgICAgICAgICAgICAgICJyZWZlcmVuY2UiOiAic3VjaF9tdWNoX25vdF9yZWZlcmVuY2UiLAogICAgICAgICAgICAgICAgInNvdXJjZSI6ICJzZXJ2ZXIiLAogICAgICAgICAgICAgICAgImZpbGVfdHlwZSI6ICJiaW5hcnkiLAogICAgICAgICAgICB9CiAgICAgICAgKQogICAgICAgIHJlc3VsdCA9IGNvbW1hbmQuX3Byb2Nlc3NfcmVsYXRpb25fZmllbGRfdmFsdWUoCiAgICAgICAgICAgIGZpZWxkPSJmaWxlX3RlbXBsYXRlX2lkIiwgdmFsdWU9ZmlsZV90ZW1wbGF0ZV92YWx1ZXMsIHJlY29yZF9tb2RlPUZhbHNlCiAgICAgICAgKQoKICAgICAgICAjIE5ldyByZWNvcmQgbXVzdCBiZSBjcmVhdGVkCiAgICAgICAgcmVjb3JkID0gc2VsZi5lbnZbImN4LnRvd2VyLmZpbGUudGVtcGxhdGUiXS5icm93c2UocmVzdWx0KQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCiAgICAgICAgICAgIHJlY29yZC5uYW1lLCBmaWxlX3RlbXBsYXRlX3ZhbHVlc1sibmFtZSJdLCAiTmV3IHJlY29yZCB2YWx1ZSBkb2Vzbid0IG1hdGNoIgogICAgICAgICkKICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAogICAgICAgICAgICByZWNvcmQucmVmZXJlbmNlLAogICAgICAgICAgICBmaWxlX3RlbXBsYXRlX3ZhbHVlc1sicmVmZXJlbmNlIl0sCiAgICAgICAgICAgICJOZXcgcmVjb3JkIHZhbHVlIGRvZXNuJ3QgbWF0Y2giLAogICAgICAgICkKICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAogICAgICAgICAgICByZWNvcmQuc291cmNlLAogICAgICAgICAgICBmaWxlX3RlbXBsYXRlX3ZhbHVlc1sic291cmNlIl0sCiAgICAgICAgICAgICJOZXcgcmVjb3JkIHZhbHVlIGRvZXNuJ3QgbWF0Y2giLAogICAgICAgICkKICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAogICAgICAgICAgICByZWNvcmQuZmlsZV90eXBlLAogICAgICAgICAgICBmaWxlX3RlbXBsYXRlX3ZhbHVlc1siZmlsZV90eXBlIl0sCiAgICAgICAgICAgICJOZXcgcmVjb3JkIHZhbHVlIGRvZXNuJ3QgbWF0Y2giLAogICAgICAgICkKCiAgICAgICAgIyAtLSA0IC0tCiAgICAgICAgIyBZYW1sIHdpdGggbm8gcmVmZXJlbmNlIGF0IGFsbCAtPiBSZWNvcmQKICAgICAgICB2YWx1ZXNfd2l0aF9ub19yZWZlcmVuY2VzID0gewogICAgICAgICAgICAibmFtZSI6ICJTb3JyeSBubyByZWZlcmVuY2UgaGVyZSIsCiAgICAgICAgICAgICJzb3VyY2UiOiAidG93ZXIiLAogICAgICAgICAgICAiZmlsZV90eXBlIjogImJpbmFyeSIsCiAgICAgICAgfQogICAgICAgIHJlc3VsdCA9IGNvbW1hbmQuX3Byb2Nlc3NfcmVsYXRpb25fZmllbGRfdmFsdWUoCiAgICAgICAgICAgIGZpZWxkPSJmaWxlX3RlbXBsYXRlX2lkIiwgdmFsdWU9dmFsdWVzX3dpdGhfbm9fcmVmZXJlbmNlcywgcmVjb3JkX21vZGU9RmFsc2UKICAgICAgICApCgogICAgICAgICMgTmV3IHJlY29yZCBtdXN0IGJlIGNyZWF0ZWQKICAgICAgICByZWNvcmQgPSBzZWxmLmVudlsiY3gudG93ZXIuZmlsZS50ZW1wbGF0ZSJdLmJyb3dzZShyZXN1bHQpCgogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCiAgICAgICAgICAgIHJlY29yZC5uYW1lLAogICAgICAgICAgICB2YWx1ZXNfd2l0aF9ub19yZWZlcmVuY2VzWyJuYW1lIl0sCiAgICAgICAgICAgICJOZXcgcmVjb3JkIHZhbHVlIGRvZXNuJ3QgbWF0Y2giLAogICAgICAgICkKICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAogICAgICAgICAgICByZWNvcmQuc291cmNlLAogICAgICAgICAgICB2YWx1ZXNfd2l0aF9ub19yZWZlcmVuY2VzWyJzb3VyY2UiXSwKICAgICAgICAgICAgIk5ldyByZWNvcmQgdmFsdWUgZG9lc24ndCBtYXRjaCIsCiAgICAgICAgKQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCiAgICAgICAgICAgIHJlY29yZC5maWxlX3R5cGUsCiAgICAgICAgICAgIHZhbHVlc193aXRoX25vX3JlZmVyZW5jZXNbImZpbGVfdHlwZSJdLAogICAgICAgICAgICAiTmV3IHJlY29yZCB2YWx1ZSBkb2Vzbid0IG1hdGNoIiwKICAgICAgICApCgogICAgICAgICMgLS0gNSAtLQogICAgICAgICMgTm8gcmVjb3JkIC0+IFlhbWwKICAgICAgICByZXN1bHQgPSBjb21tYW5kLl9wcm9jZXNzX3JlbGF0aW9uX2ZpZWxkX3ZhbHVlKAogICAgICAgICAgICBmaWVsZD0iZmlsZV90ZW1wbGF0ZV9pZCIsCiAgICAgICAgICAgIHZhbHVlPXNlbGYuZW52WyJjeC50b3dlci5maWxlLnRlbXBsYXRlIl0sCiAgICAgICAgICAgIHJlY29yZF9tb2RlPVRydWUsCiAgICAgICAgKQogICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UocmVzdWx0LCAiUmVzdWx0IG11c3QgYmUgJ0ZhbHNlJyIpCgogICAgZGVmIHRlc3RfdXBkYXRlX29yX2NyZWF0ZV9yZWxhdGVkX3JlY29yZChzZWxmKToKICAgICAgICAiIiJUZXN0IGlmIHJlbGF0ZWQgcmVjb3JkIGlzIHVwZGF0ZWQgb3IgY3JlYXRlZCBjb3JyZWN0bHkiIiIKCiAgICAgICAgIyAtLSAxIC0tCiAgICAgICAgIyBVcGRhdGUgZXhpc3RpbmcgdmFsdWVzCiAgICAgICAgIyBXZSBhcmUgdXNpbmcgZmlsZSB0ZW1wbGF0ZSBmb3IgdGhhdAogICAgICAgIEZpbGVUZW1wbGF0ZU1vZGVsID0gc2VsZi5lbnZbImN4LnRvd2VyLmZpbGUudGVtcGxhdGUiXQogICAgICAgIGZpbGVfdGVtcGxhdGUgPSBzZWxmLmVudlsiY3gudG93ZXIuZmlsZS50ZW1wbGF0ZSJdLmNyZWF0ZSgKICAgICAgICAgICAgeyJuYW1lIjogIlRlc3QgbTJvIiwgInJlZmVyZW5jZSI6ICJ0ZXN0X20ybyJ9CiAgICAgICAgKQogICAgICAgIHZhbHVlc190b191cGRhdGUgPSB7Im5hbWUiOiAiTXVjaCBuZXcgbmFtZSJ9CiAgICAgICAgcmVjb3JkID0gRmlsZVRlbXBsYXRlTW9kZWwuX3VwZGF0ZV9vcl9jcmVhdGVfcmVsYXRlZF9yZWNvcmQoCiAgICAgICAgICAgIG1vZGVsPUZpbGVUZW1wbGF0ZU1vZGVsLAogICAgICAgICAgICByZWZlcmVuY2U9ZmlsZV90ZW1wbGF0ZS5yZWZlcmVuY2UsCiAgICAgICAgICAgIHZhbHVlcz12YWx1ZXNfdG9fdXBkYXRlLAogICAgICAgICkKICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAogICAgICAgICAgICByZWNvcmQubmFtZSwgdmFsdWVzX3RvX3VwZGF0ZVsibmFtZSJdLCAiVmFsdWUgd2FzIG5vdCB1cGRhdGVkIHByb3Blcmx5IgogICAgICAgICkKICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlY29yZC5pZCwgZmlsZV90ZW1wbGF0ZS5pZCwgIlNhbWUgcmVjb3JkIG11c3QgYmUgdXBkYXRlZCIpCgogICAgICAgICMgLS0gMiAtLQogICAgICAgICMgUmVmZXJlbmNlIG5vdCBmb3VuZC4gTXVzdCBjcmVhdGUgYSBuZXcgcmVjb3JkCiAgICAgICAgdmFsdWVzX3RvX3VwZGF0ZSA9IHsibmFtZSI6ICJEb2dlIGZpbGUifQogICAgICAgIHJlY29yZCA9IEZpbGVUZW1wbGF0ZU1vZGVsLl91cGRhdGVfb3JfY3JlYXRlX3JlbGF0ZWRfcmVjb3JkKAogICAgICAgICAgICBtb2RlbD1GaWxlVGVtcGxhdGVNb2RlbCwKICAgICAgICAgICAgcmVmZXJlbmNlPSJkb2dlX2ZpbGUiLAogICAgICAgICAgICB2YWx1ZXM9dmFsdWVzX3RvX3VwZGF0ZSwKICAgICAgICAgICAgY3JlYXRlX2ltbWVkaWF0ZWx5PVRydWUsCiAgICAgICAgKQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCiAgICAgICAgICAgIHJlY29yZC5uYW1lLCB2YWx1ZXNfdG9fdXBkYXRlWyJuYW1lIl0sICJWYWx1ZSB3YXMgbm90IHVwZGF0ZWQgcHJvcGVybHkiCiAgICAgICAgKQogICAgICAgIHNlbGYuYXNzZXJ0Tm90RXF1YWwocmVjb3JkLmlkLCBmaWxlX3RlbXBsYXRlLmlkLCAiTmV3IHJlY29yZCBtdXN0IGJlIGNyZWF0ZWQiKQoKICAgICAgICAjIC0tIDIgLS0KICAgICAgICAjIFJlZmVyZW5jZSBub3QgcHJvdmlkZWQuIE11c3QgY3JlYXRlIGEgbmV3IHJlY29yZAogICAgICAgIHZhbHVlc190b191cGRhdGUgPSB7Im5hbWUiOiAiRG9nZSBmaWxlIn0KICAgICAgICByZWNvcmQgPSBGaWxlVGVtcGxhdGVNb2RlbC5fdXBkYXRlX29yX2NyZWF0ZV9yZWxhdGVkX3JlY29yZCgKICAgICAgICAgICAgbW9kZWw9RmlsZVRlbXBsYXRlTW9kZWwsCiAgICAgICAgICAgIHJlZmVyZW5jZT1GYWxzZSwKICAgICAgICAgICAgdmFsdWVzPXZhbHVlc190b191cGRhdGUsCiAgICAgICAgICAgIGNyZWF0ZV9pbW1lZGlhdGVseT1UcnVlLAogICAgICAgICkKICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAogICAgICAgICAgICByZWNvcmQubmFtZSwgdmFsdWVzX3RvX3VwZGF0ZVsibmFtZSJdLCAiVmFsdWUgd2FzIG5vdCB1cGRhdGVkIHByb3Blcmx5IgogICAgICAgICkKICAgICAgICBzZWxmLmFzc2VydE5vdEVxdWFsKHJlY29yZC5pZCwgZmlsZV90ZW1wbGF0ZS5pZCwgIk5ldyByZWNvcmQgbXVzdCBiZSBjcmVhdGVkIikKCiAgICBAdGFnZ2VkKCJwb3N0X2luc3RhbGwiLCAiLWF0X2luc3RhbGwiKQogICAgZGVmIHRlc3RfcHJlcGFyZV9yZWNvcmRfdHJ1bmNhdGVzX2NvZGVfZm9yX3NlcnZlcl9maWxlcyhzZWxmKToKICAgICAgICAiIiJNaXhpbiBtdXN0IHNldCBjb2RlPUZhbHNlIGZvciBjeC50b3dlci5maWxlIHdoZW4gc291cmNlPT0nc2VydmVyJy4iIiIKICAgICAgICBGaWxlID0gc2VsZi5lbnZbImN4LnRvd2VyLmZpbGUiXQogICAgICAgIHNydl9maWxlID0gRmlsZS5jcmVhdGUoCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICJuYW1lIjogInNydi5sb2ciLAogICAgICAgICAgICAgICAgInJlZmVyZW5jZSI6ICJzcnZsb2ciLAogICAgICAgICAgICAgICAgInNvdXJjZSI6ICJzZXJ2ZXIiLAogICAgICAgICAgICAgICAgImZpbGVfdHlwZSI6ICJ0ZXh0IiwKICAgICAgICAgICAgICAgICJzZXJ2ZXJfZGlyIjogIi90bXAiLAogICAgICAgICAgICAgICAgImNvZGUiOiAiQklHIERBVEEiLAogICAgICAgICAgICB9CiAgICAgICAgKQogICAgICAgIHJlYyA9IHNydl9maWxlLl9wcmVwYXJlX3JlY29yZF9mb3JfeWFtbCgpCiAgICAgICAgc2VsZi5hc3NlcnRJbigiY29kZSIsIHJlYykKICAgICAgICBzZWxmLmFzc2VydEZhbHNlKHJlY1siY29kZSJdLCAiRXhwZWN0ZWQgY29kZT1GYWxzZSBmb3Igc2VydmVyLXNvdXJjZWQgZmlsZXMiKQoKICAgIEB0YWdnZWQoInBvc3RfaW5zdGFsbCIsICItYXRfaW5zdGFsbCIpCiAgICBkZWYgdGVzdF9wcmVwYXJlX3JlY29yZF9rZWVwc19jb2RlX2Zvcl90b3dlcl9maWxlcyhzZWxmKToKICAgICAgICAiIiJNaXhpbiBtdXN0IGtlZXAgY29kZSBmb3IgY3gudG93ZXIuZmlsZSB3aGVuIHNvdXJjZT09J3Rvd2VyJy4iIiIKICAgICAgICBGaWxlID0gc2VsZi5lbnZbImN4LnRvd2VyLmZpbGUiXQogICAgICAgIHR3X2ZpbGUgPSBGaWxlLmNyZWF0ZSgKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIm5hbWUiOiAibG9jYWwudHh0IiwKICAgICAgICAgICAgICAgICJyZWZlcmVuY2UiOiAibG9jYWx0eHQiLAogICAgICAgICAgICAgICAgInNvdXJjZSI6ICJ0b3dlciIsCiAgICAgICAgICAgICAgICAiZmlsZV90eXBlIjogInRleHQiLAogICAgICAgICAgICAgICAgInNlcnZlcl9kaXIiOiAiL2V0YyIsCiAgICAgICAgICAgICAgICAiY29kZSI6ICJTTUFMTCBEQVRBIiwKICAgICAgICAgICAgfQogICAgICAgICkKICAgICAgICByZWMgPSB0d19maWxlLl9wcmVwYXJlX3JlY29yZF9mb3JfeWFtbCgpCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKICAgICAgICAgICAgcmVjWyJjb2RlIl0sCiAgICAgICAgICAgICJTTUFMTCBEQVRBIiwKICAgICAgICAgICAgIkV4cGVjdGVkIG9yaWdpbmFsIGNvZGUgZm9yIHRvd2VyLXNvdXJjZWQgZmlsZXMiLAogICAgICAgICkK |