From c1371849e5ed7c794e557833ca2f4de1d0f8bf7b Mon Sep 17 00:00:00 2001 From: KoalaTrapLord Date: Fri, 13 Mar 2026 18:58:33 -0400 Subject: [PATCH] feat(api): accept 2-4 decks in batch start, dynamic Java CLI args (Task 2C) --- lab_api.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lab_api.py b/lab_api.py index 319bda3..7a8048b 100644 --- a/lab_api.py +++ b/lab_api.py @@ -1 +1 @@ -IyEvdXNyL2Jpbi9lbnYgcHl0aG9uMwoiIiIKQ29tbWFuZGVyIEFJIExhYiDigJQgRmFzdEFQSSBCYWNrZW5kIHYzCuKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkAoKdjMgYWRkczoKICBQT1NUIC9hcGkvbGFiL2ltcG9ydC91cmwgICAgICAg4oCUIEltcG9ydCBkZWNrIGZyb20gQXJjaGlkZWt0L0VESFJFQyBVUkwKICBQT1NUIC9hcGkvbGFiL2ltcG9ydC90ZXh0ICAgICAgIOKAlCBJbXBvcnQgZGVjayBmcm9tIGNhcmQgbGlzdCB0ZXh0CiAgR0VUICAvYXBpL2xhYi9tZXRhL2NvbW1hbmRlcnMgIOKAlCBMaXN0IGF2YWlsYWJsZSBjb21tYW5kZXJzIGluIG1ldGEgbWFwcGluZwogIEdFVCAgL2FwaS9sYWIvbWV0YS9zZWFyY2ggICAgICDi \ No newline at end of file +IyEvdXNyL2Jpbi9lbnYgcHl0aG9uMwoiIiIKQ29tbWFuZGVyIEFJIExhYiDigJQgRmFzdEFQSSBCYWNrZW5kIHYzCuKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkAoKdjMgYWRkczoKICBQT1NUIC9hcGkvbGFiL2ltcG9ydC91cmwgICAgICAg4oCUIEltcG9ydCBkZWNrIGZyb20gQXJjaGlkZWt0L0VESFJFQyBVUkwKICBQT1NUIC9hcGkvbGFiL2ltcG9ydC90ZXh0ICAgICAg4oCUIEltcG9ydCBkZWNrIGZyb20gY2FyZCBsaXN0IHRleHQKICBHRVQgIC9hcGkvbGFiL21ldGEvY29tbWFuZGVycyAg4oCUIExpc3QgYXZhaWxhYmxlIGNvbW1hbmRlcnMgaW4gbWV0YSBtYXBwaW5nCiAgR0VUICAvYXBpL2xhYi9tZXRhL3NlYXJjaCAgICAgIOKAlCBTZWFyY2ggY29tbWFuZGVycyBieSBuYW1lCiAgUE9TVCAvYXBpL2xhYi9tZXRhL2ZldGNoICAgICAgIOKAlCBGZXRjaCBFREhSRUMgYXZlcmFnZSBkZWNrIGZvciBhIGNvbW1hbmRlcgogIFBPU1QgL2FwaS9sYWIvc3RhcnQgICAgICAgICAgICDigJQgRXh0ZW5kZWQ6IGFjY2VwdHMgaW1wb3J0ZWQgZGVjayBwcm9maWxlcwoKUnVucyBvbiBwb3J0IDgwODAgYnkgZGVmYXVsdC4gU2VydmVzIHRoZSB3ZWIgVUkgc3RhdGljIGZpbGVzIGF0IC8uCiIiIgoKaW1wb3J0IGFyZ3BhcnNlCmltcG9ydCBhc3luY2lvCmltcG9ydCBjc3YKaW1wb3J0IGlvCmltcG9ydCBqc29uCmltcG9ydCBsb2dnaW5nCmltcG9ydCBsb2dnaW5nLmhhbmRsZXJzCmltcG9ydCBvcwppbXBvcnQgcmUKaW1wb3J0IHNxbGl0ZTMKaW1wb3J0IHN1YnByb2Nlc3MKaW1wb3J0IHN5cwppbXBvcnQgdGhyZWFkaW5nCmltcG9ydCB0aW1lCmltcG9ydCB1dWlkCmZyb20gZGF0ZXRpbWUgaW1wb3J0IGRhdGV0aW1lCmZyb20gcGF0aGxpYiBpbXBvcnQgUGF0aApmcm9tIHR5cGluZyBpbXBvcnQgT3B0aW9uYWwKZnJvbSB1cmxsaWIucmVxdWVzdCBpbXBvcnQgdXJsb3BlbiwgUmVxdWVzdApmcm9tIHVybGxpYi5lcnJvciBpbXBvcnQgVVJMRXJyb3IKCnRyeToKICAgIGZyb20gZmFzdGFwaSBpbXBvcnQgRmFzdEFQSSwgSFRUUEV4Y2VwdGlvbiwgQmFja2dyb3VuZFRhc2tzLCBSZXF1ZXN0IGFzIEZhc3RBUElSZXF1ZXN0CiAgICBmcm9tIGZhc3RhcGkubWlkZGxld2FyZS5jb3JzIGltcG9ydCBDT1JTTWlkZGxld2FyZQogICAgZnJvbSBmYXN0YXBpLnJlc3BvbnNlcyBpbXBvcnQgRmlsZVJlc3BvbnNlLCBKU09OUmVzcG9uc2UsIFN0cmVhbWluZ1Jlc3BvbnNlCiAgICBmcm9tIGZhc3RhcGkuc3RhdGljZmlsZXMgaW1wb3J0IFN0YXRpY0ZpbGVzCiAgICBmcm9tIHB5ZGFudGljIGltcG9ydCBCYXNlTW9kZWwKZXhjZXB0IEltcG9ydEVycm9yOgogICAgcHJpbnQoIkVSUk9SOiBGYXN0QVBJIG5vdCBpbnN0YWxsZWQuIFJ1bjogcGlwIGluc3RhbGwgZmFzdGFwaSB1dmljb3JuIikKICAgIHN5cy5leGl0KDEpCgoKIyDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZAKIyBDb25maWd1cmF0aW9uCiMg4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQCgpjbGFzcyBDb25maWc6CiAgICAiIiJSdW50aW1lIGNvbmZpZ3VyYXRpb24g4oCUIHNldCB2aWEgQ0xJIGFyZ3Mgb3IgZW52IHZhcnMuIiIiCiAgICBmb3JnZV9qYXI6IHN0ciA9ICIiCiAgICBmb3JnZV9kaXI6IHN0ciA9ICIiCiAgICBmb3JnZV9kZWNrc19kaXI6IHN0ciA9ICIiCiAgICBsYWJfamFyOiBzdHIgPSAiIgogICAgcmVzdWx0c19kaXI6IHN0ciA9ICJyZXN1bHRzIgogICAgcG9ydDogaW50ID0gODA4MAogICAgeGltaWxhcl9hcGlfa2V5OiBzdHIgPSAiIgogICAgcHBseF9hcGlfa2V5OiBzdHIgPSAiIiAgIyBQZXJwbGV4aXR5IEFQSSBrZXkgZm9yIGRlY2sgcmVzZWFyY2gvZ2VuZXJhdGlvbgoKQ0ZHID0gQ29uZmlnKCkKCgojIOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkAojIExvZ2dpbmcgU2V0dXAKIyDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZAKCl9MT0dfRk9STUFUID0gIiUoYXNjdGltZSlzICUobGV2ZWxuYW1lKS01cyBbJShuYW1lKXNdICUobWVzc2FnZSlzIgpfTE9HX0RBVEVfRk1UID0gIiVZLSVtLSVkICVIOiVNOiVTIgpfTE9HX0RJUiA9IFBhdGgob3MuZW52aXJvbi5nZXQoIkNBTF9MT0dfRElSIiwgImxvZ3MiKSkKX0xPR19NQVhfQllURVMgPSBpbnQob3MuZW52aXJvbi5nZXQoIkNBTF9MT0dfTUFYX01CIiwgIjI1IikpICogMTAyNCAqIDEwMjQKX0xPR19CQUNLVVBfQ09VTlQgPSBpbnQob3MuZW52aXJvbi5nZXQoIkNBTF9MT0dfQkFDS1VQX0NPVU5UIiwgIjUiKSkKCgpkZWYgc2V0dXBfbG9nZ2luZyhsZXZlbDogaW50ID0gbG9nZ2luZy5JTkZPKSAtPiBOb25lOgogICAgIiIiQ29uZmlndXJlIHRoZSByb290ICdjb21tYW5kZXJfYWlfbGFiJyBsb2dnZXIgd2l0aCBjb25zb2xlICsgcm90YXRpbmcgZmlsZS4iIiIKICAgIF9MT0dfRElSLm1rZGlyKHBhcmVudHM9VHJ1ZSwgZXhpc3Rfb2s9VHJ1ZSkKCiAgICByb290X2xvZ2dlciA9IGxvZ2dpbmcuZ2V0TG9nZ2VyKCJjb21tYW5kZXJfYWlfbGFiIikKICAgIHJvb3RfbG9nZ2VyLnNldExldmVsKGxldmVsKQoKICAgICMgQXZvaWQgZHVwbGljYXRlIGhhbmRsZXJzIGlmIGNhbGxlZCBhZ2FpbgogICAgaWYgcm9vdF9sb2dnZXIuaGFuZGxlcnM6CiAgICAgICAgcmV0dXJuCgogICAgZm9ybWF0dGVyID0gbG9nZ2luZy5Gb3JtYXR0ZXIoX0xPR19GT1JNQVQsIGRhdGVmbXQ9X0xPR19EQVRFX0ZNVCkKCiAgICAjIENvbnNvbGUgaGFuZGxlciDigJQgbWF0Y2hlcyBwcmV2aW91cyBwcmludCgpIGJlaGF2aW91cgogICAgY29uc29sZSA9IGxvZ2dpbmcuU3RyZWFtSGFuZGxlcihzeXMuc3Rkb3V0KQogICAgY29uc29sZS5zZXRMZXZlbChsZXZlbCkKICAgIGNvbnNvbGUuc2V0Rm9ybWF0dGVyKGZvcm1hdHRlcikKICAgIHJvb3RfbG9nZ2VyLmFkZEhhbmRsZXIoY29uc29sZSkKCiAgICAjIFJvdGF0aW5nIGZpbGUgaGFuZGxlciDigJQgMjUgTUIgw5cgNSBiYWNrdXBzID0gMTI1IE1CIG1heAogICAgZmlsZV9oYW5kbGVyID0gbG9nZ2luZy5oYW5kbGVycy5Sb3RhdGluZ0ZpbGVIYW5kbGVyKAogICAgICAgIF9MT0dfRElSIC8gImNvbW1hbmRlci1haS1sYWIubG9nIiwKICAgICAgICBtYXhCeXRlcz1fTE9HX01BWF9CWVRFUywKICAgICAgICBiYWNrdXBDb3VudD1fTE9HX0JBQ0tVUF9DT1VOVCwKICAgICAgICBlbmNvZGluZz0idXRmLTgiLAogICAgKQogICAgZmlsZV9oYW5kbGVyLnNldExldmVsKGxldmVsKQogICAgZmlsZV9oYW5kbGVyLnNldEZvcm1hdHRlcihmb3JtYXR0ZXIpCiAgICByb290X2xvZ2dlci5hZGRIYW5kbGVyKGZpbGVfaGFuZGxlcikKCgojIE5hbWVkIGxvZ2dlcnMg4oCUIGltcG9ydCB0aGVzZSB3aGVyZSBuZWVkZWQKbG9nID0gbG9nZ2luZy5nZXRMb2dnZXIoImNvbW1hbmRlcl9haV9sYWIuYXBpIikgICAgICAgICAgIyBBUEkgZW5kcG9pbnRzLCBzZXJ2ZXIgbGlmZWN5Y2xlCmxvZ19iYXRjaCA9IGxvZ2dpbmcuZ2V0TG9nZ2VyKCJjb21tYW5kZXJfYWlfbGFiLmJhdGNoIikgICAjIEJhdGNoIHNpbSAoSmF2YSArIERlZXBTZWVrKQpsb2dfc2ltID0gbG9nZ2luZy5nZXRMb2dnZXIoImNvbW1hbmRlcl9haV9sYWIuc2ltIikgICAgICAgIyBEZWVwU2VlayBnYW1lIHNpbXVsYXRpb24KbG9nX2NvYWNoID0gbG9nZ2luZy5nZXRMb2dnZXIoImNvbW1hbmRlcl9haV9sYWIuY29hY2giKSAgICMgQ29hY2ggKyByZXBvcnQgZ2VuZXJhdGlvbgpsb2dfZGVja2dlbiA9IGxvZ2dpbmcuZ2V0TG9nZ2VyKCJjb21tYW5kZXJfYWlfbGFiLmRlY2tnZW4iKSAgIyBEZWNrIGdlbmVyYXRpb24gKGFsbCB2ZXJzaW9ucykKbG9nX2NvbGxlY3QgPSBsb2dnaW5nLmdldExvZ2dlcigiY29tbWFuZGVyX2FpX2xhYi5jb2xsZWN0aW9uIikgICMgQ29sbGVjdGlvbiBtYW5hZ2VtZW50CmxvZ19zY2FuID0gbG9nZ2luZy5nZXRMb2dnZXIoImNvbW1hbmRlcl9haV9sYWIuc2Nhbm5lciIpICAjIENhcmQgc2Nhbm5lcgpsb2dfbWwgPSBsb2dnaW5nLmdldExvZ2dlcigiY29tbWFuZGVyX2FpX2xhYi5tbCIpICAgICAgICAgIyBNTCB0cmFpbmluZyArIGluZmVyZW5jZQpsb2dfY2FjaGUgPSBsb2dnaW5nLmdldExvZ2dlcigiY29tbWFuZGVyX2FpX2xhYi5jYWNoZSIpICAgIyBTY3J5ZmFsbCBjYWNoZQpsb2dfcHBseCA9IGxvZ2dpbmcuZ2V0TG9nZ2VyKCJjb21tYW5kZXJfYWlfbGFiLnBwbHgiKSAgICAgIyBQZXJwbGV4aXR5IEFQSQoKCiMg4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQCiMgQXBwIFNldHVwCiMg4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQCgphcHAgPSBGYXN0QVBJKHRpdGxlPSJDb21tYW5kZXIgQUkgTGFiIEFQSSIsIHZlcnNpb249IjMuMC4wIikKCmFwcC5hZGRfbWlkZGxld2FyZSgKICAgIENPUlNNaWRkbGV3YXJlLAogICAgYWxsb3dfb3JpZ2lucz1bIioiXSwKICAgIGFsbG93X21ldGhvZHM9WyIqIl0sCiAgICBhbGxvd19oZWFkZXJzPVsiKiJdLAopCgoKIyDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZAKIyBJbi1NZW1vcnkgU3RhdGUKIyDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZAKCmNsYXNzIEJhdGNoU3RhdGU6CiAgICAiIiJUcmFja3MgYSBydW5uaW5nIG9yIGNvbXBsZXRlZCBiYXRjaC4iIiIKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBiYXRjaF9pZDogc3RyLCB0b3RhbF9nYW1lczogaW50LCB0aHJlYWRzOiBpbnQpOgogICAgICAgIHNlbGYuYmF0Y2hfaWQgPSBiYXRjaF9pZAogICAgICAgIHNlbGYudG90YWxfZ2FtZXMgPSB0b3RhbF9nYW1lcwogICAgICAgIHNlbGYudGhyZWFkcyA9IHRocmVhZHMKICAgICAgICBzZWxmLmNvbXBsZXRlZF9nYW1lcyA9IDAKICAgICAgICBzZWxmLnJ1bm5pbmcgPSBUcnVlCiAgICAgICAgc2VsZi5zdGFydF90aW1lID0gZGF0ZXRpbWUubm93KCkKICAgICAgICBzZWxmLmVsYXBzZWRfbXMgPSAwCiAgICAgICAgc2VsZi5yZXN1bHRfcGF0aDogT3B0aW9uYWxbc3RyXSA9IE5vbmUKICAgICAgICBzZWxmLmVycm9yOiBPcHRpb25hbFtzdHJdID0gTm9uZQogICAgICAgIHNlbGYucHJvY2VzczogT3B0aW9uYWxbc3VicHJvY2Vzcy5Qb3Blbl0gPSBOb25lCiAgICAgICAgc2VsZi5sb2dfbGluZXM6IGxpc3QgPSBbXQogICAgICAgICMgdjI0IChJc3N1ZSAjNSk6IFJlYWwtdGltZSB0aHJvdWdocHV0IHRyYWNraW5nCiAgICAgICAgc2VsZi5zaW1zX3Blcl9zZWM6IGZsb2F0ID0gMC4wCgphY3RpdmVfYmF0Y2hlczogZGljdFtzdHIsIEJhdGNoU3RhdGVdID0ge30KCiMgQ29tbWFuZGVyIG1ldGEgbWFwcGluZyAobG9hZGVkIGF0IHN0YXJ0dXApCkNPTU1BTkRFUl9NRVRBOiBkaWN0ID0ge30KCiMg4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQCiMgUmVxdWVzdCAvIFJlc3BvbnNlIE1vZGVscwojIOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkAoKY2xhc3MgU3RhcnRSZXF1ZXN0KEJhc2VNb2RlbCk6CiAgICBkZWNrczogbGlzdFtzdHJdICAgICAgICAgICAjIEV4YWN0bHkgMyBkZWNrIG5hbWVzCiAgICBudW1HYW1lczogaW50ID0gMTAwCiAgICB0aHJlYWRzOiBpbnQgPSA0CiAgICBzZWVkOiBPcHRpb25hbFtpbnRdID0gTm9uZQogICAgY2xvY2s6IGludCA9IDEyMAogICAgIyB2MzogT3B0aW9uYWwgc291cmNlIG1ldGFkYXRhIHBlciBkZWNrCiAgICBkZWNrU291cmNlczogT3B0aW9uYWxbbGlzdFtPcHRpb25hbFtkaWN0XV1dID0gTm9uZSAgIyBbe3NvdXJjZSwgc291cmNlVXJsLCBjb21tYW5kZXIsIGFyY2hldHlwZX1dCiAgICAjIHY4OiBMZWFybmVkIHBvbGljeSBzdXBwb3J0CiAgICB1c2VMZWFybmVkUG9saWN5OiBib29sID0gRmFsc2UKICAgIHBvbGljeVN0eWxlOiBzdHIgPSAibWlkcmFuZ2UiCiAgICBwb2xpY3lHcmVlZHk6IGJvb2wgPSBGYWxzZQogICAgIyB2MjQgKElzc3VlcyAjNC8jNSk6IFBlcmZvcm1hbmNlIHNldHRpbmdzCiAgICBhaVNpbXBsaWZpZWQ6IGJvb2wgPSBGYWxzZSAgICAgICAgICMgVXNlIGZhc3RlciBBSSBwcm9maWxlCiAgICBhaVRoaW5rVGltZU1zOiBpbnQgPSAtMSAgICAgICAgICAgICMgQ2FwIEFJIHRoaW5rIHRpbWUgKC0xIHVubGltaXRlZCkKICAgIG1heFF1ZXVlRGVwdGg6IGludCA9IC0xICAgICAgICAgICAgIyBCYWNrcHJlc3N1cmUgbGltaXQgKC0xIHVubGltaXRlZCkKCmNsYXNzIFN0YXJ0UmVzcG9uc2UoQmFzZU1vZGVsKToKICAgIGJhdGNoSWQ6IHN0cgogICAgc3RhdHVzOiBzdHIgPSAic3RhcnRlZCIKICAgIG1lc3NhZ2U6IHN0ciA9ICIiCgpjbGFzcyBTdGF0dXNSZXNwb25zZShCYXNlTW9kZWwpOgogICAgYmF0Y2hJZDogc3RyID0gIiIKICAgIHJ1bm5pbmc6IGJvb2wgPSBGYWxzZQogICAgY29tcGxldGVkOiBpbnQgPSAwCiAgICB0b3RhbDogaW50ID0gMAogICAgdGhyZWFkczogaW50ID0gMAogICAgZWxhcHNlZE1zOiBpbnQgPSAwCiAgICBlcnJvcjogT3B0aW9uYWxbc3RyXSA9IE5vbmUKICAgIHNpbXNQZXJTZWM6IGZsb2F0ID0gMC4wCiAgICAjIFJlYWN0IFNQQSBhbGlhc2VzIChzYW1lIGRhdGEsIGV4cGVjdGVkIGZpZWxkIG5hbWVzKQogICAgcnVuX2lkOiBzdHIgPSAiIgogICAgZ2FtZXNfY29tcGxldGVkOiBpbnQgPSAwCiAgICB0b3RhbF9nYW1lczogaW50ID0gMAogICAgY3VycmVudF9kZWNrczogbGlzdCA9IFtdCgpjbGFzcyBEZWNrSW5mbyhCYXNlTW9kZWwpOgogICAgbmFtZTogc3RyCiAgICBmaWxlbmFtZTogc3RyCgpjbGFzcyBJbXBvcnRVcmxSZXF1ZXN0KEJhc2VNb2RlbCk6CiAgICB1cmw6IHN0cgoKY2xhc3MgSW1wb3J0VGV4dFJlcXVlc3QoQmFzZU1vZGVsKToKICAgIHRleHQ6IHN0cgogICAgY29tbWFuZGVyOiBPcHRpb25hbFtzdHJdID0gTm9uZQoKY2xhc3MgTWV0YUZldGNoUmVxdWVzdChCYXNlTW9kZWwpOgogICAgY29tbWFuZGVyOiBzdHIKCgojIOKUgOKUgCBEZWNrIEJ1aWxkZXIgTW9kZWxzIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgAoKY2xhc3MgQ3JlYXRlRGVja1JlcXVlc3QoQmFzZU1vZGVsKToKICAgIG5hbWU6IHN0cgogICAgY29tbWFuZGVyX3NjcnlmYWxsX2lkOiBPcHRpb25hbFtzdHJdID0gIiIKICAgIGNvbW1hbmRlcl9uYW1lOiBPcHRpb25hbFtzdHJdID0gIiIKICAgIGNvbG9yX2lkZW50aXR5OiBPcHRpb25hbFtsaXN0XSA9IFtdCiAgICBzdHJhdGVneV90YWc6IE9wdGlvbmFsW3N0cl0gPSAiIgoKCmNsYXNzIFVwZGF0ZURlY2tSZXF1ZXN0KEJhc2VNb2RlbCk6CiAgICBuYW1lOiBPcHRpb25hbFtzdHJdID0gTm9uZQogICAgY29tbWFuZGVyX3NjcnlmYWxsX2lkOiBPcHRpb25hbFtzdHJdID0gTm9uZQogICAgY29tbWFuZGVyX25hbWU6IE9wdGlvbmFsW3N0cl0gPSBOb25lCiAgICBjb2xvcl9pZGVudGl0eTogT3B0aW9uYWxbbGlzdF0gPSBOb25lCiAgICBzdHJhdGVneV90YWc6IE9wdGlvbmFsW3N0cl0gPSBOb25lCgoKY2xhc3MgQWRkRGVja0NhcmRSZXF1ZXN0KEJhc2VNb2RlbCk6CiAgICBzY3J5ZmFsbF9pZDogc3RyCiAgICBjYXJkX25hbWU6IE9wdGlvbmFsW3N0cl0gPSAiIgogICAgcXVhbnRpdHk6IE9wdGlvbmFsW2ludF0gPSAxCiAgICBpc19jb21tYW5kZXI6IE9wdGlvbmFsW2ludF0gPSAwCiAgICByb2xlX3RhZzogT3B0aW9uYWxbc3RyXSA9ICIiCgoKY2xhc3MgUGF0Y2hEZWNrQ2FyZFJlcXVlc3QoQmFzZU1vZGVsKToKICAgIHF1YW50aXR5OiBPcHRpb25hbFtpbnRdID0gTm9uZQogICAgcm9sZV90YWc6IE9wdGlvbmFsW3N0cl0gPSBOb25lCgoKY2xhc3MgQnVsa0FkZFJlcXVlc3QoQmFzZU1vZGVsKToKICAgIGNhcmRzOiBsaXN0W2RpY3RdICAjIFt7c2NyeWZhbGxfaWQsIHF1YW50aXR5fV0KICAgIHJlc3BlY3RfcmF0aW9zOiBPcHRpb25hbFtib29sXSA9IEZhbHNlCgoKY2xhc3MgQnVsa0FkZFJlY29tbWVuZGVkUmVxdWVzdChCYXNlTW9kZWwpOgogICAgc291cmNlOiBzdHIgPSAiY29sbGVjdGlvbiIgICMgImNvbGxlY3Rpb24iIHwgImVkaHJlYyIKICAgIG9ubHlfb3duZWQ6IE9wdGlvbmFsW2Jvb2xdID0gVHJ1ZQogICAgcmVzcGVjdF9yYXRpb3M6IE9wdGlvbmFsW2Jvb2xdID0gRmFsc2UKICAgIHR5cGVzOiBPcHRpb25hbFtsaXN0W3N0cl1dID0gTm9uZQogICAgcm9sZXM6IE9wdGlvbmFsW2xpc3Rbc3RyXV0gPSBOb25lCgoKIyDilIDilIAgQXV0byBEZWNrIEdlbmVyYXRvciBNb2RlbHMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACgpjbGFzcyBEZWNrR2VuZXJhdGlvblNvdXJjZUNvbmZpZyhCYXNlTW9kZWwpOgogICAgdXNlX2FyY2hpZGVrdDogYm9vbCA9IFRydWUKICAgIHVzZV9lZGhyZWM6IGJvb2wgPSBUcnVlCiAgICB1c2VfbW94ZmllbGQ6IGJvb2wgPSBGYWxzZQogICAgdXNlX210Z2dvbGRmaXNoOiBib29sID0gRmFsc2UKICAgIGFyY2hpZGVrdF91cmw6IE9wdGlvbmFsW3N0cl0gPSAiIgogICAgbW94ZmllbGRfdXJsOiBPcHRpb25hbFtzdHJdID0gIiIKICAgIG10Z2dvbGRmaXNoX3VybDogT3B0aW9uYWxbc3RyXSA9ICIiCgoKY2xhc3MgRGVja0dlbmVyYXRpb25SZXF1ZXN0KEJhc2VNb2RlbCk6CiAgICBjb21tYW5kZXJfbmFtZTogT3B0aW9uYWxbc3RyXSA9ICIiCiAgICBjb21tYW5kZXJfc2NyeWZhbGxfaWQ6IE9wdGlvbmFsW3N0cl0gPSAiIgogICAgY29sb3JfaWRlbnRpdHk6IE9wdGlvbmFsW2xpc3Rbc3RyXV0gPSBOb25lCiAgICBzb3VyY2VzOiBPcHRpb25hbFtEZWNrR2VuZXJhdGlvblNvdXJjZUNvbmZpZ10gPSBOb25lCiAgICB0YXJnZXRfbGFuZF9jb3VudDogaW50ID0gMzcKICAgIHRhcmdldF9pbnN0YW50X2NvdW50OiBpbnQgPSAxMAogICAgdGFyZ2V0X3NvcmNlcnlfY291bnQ6IGludCA9IDgKICAgIHRhcmdldF9hcnRpZmFjdF9jb3VudDogaW50ID0gMTAKICAgIHRhcmdldF9lbmNoYW50bWVudF9jb3VudDogaW50ID0gOAogICAgdGFyZ2V0X2NyZWF0dXJlX2NvdW50OiBpbnQgPSAyNQogICAgdGFyZ2V0X3BsYW5lc3dhbGtlcl9jb3VudDogaW50ID0gMgogICAgb25seV9jYXJkc19pbl9jb2xsZWN0aW9uOiBib29sID0gRmFsc2UKICAgIGFsbG93X3Byb3hpZXM6IGJvb2wgPSBUcnVlCiAgICBkZWNrX25hbWU6IE9wdGlvbmFsW3N0cl0gPSAiIgoKCmNsYXNzIEdlbmVyYXRlZERlY2tDYXJkKEJhc2VNb2RlbCk6CiAgICBzY3J5ZmFsbF9pZDogc3RyID0gIiIKICAgIG5hbWU6IHN0ciA9ICIiCiAgICB0eXBlX2xpbmU6IHN0ciA9ICIiCiAgICBtYW5hX2Nvc3Q6IHN0ciA9ICIiCiAgICBjbWM6IGZsb2F0ID0gMAogICAgY2FyZF90eXBlOiBzdHIgPSAiIiAgICAgICAgIyBMYW5kIC8gQ3JlYXR1cmUgLyBJbnN0YW50IC8gZXRjLgogICAgcm9sZXM6IGxpc3Rbc3RyXSA9IFtdCiAgICBzb3VyY2U6IHN0ciA9ICJjb2xsZWN0aW9uIiAgIyBjb2xsZWN0aW9uIC8gZWRocmVjIC8gYXJjaGlkZWt0IC8gdGVtcGxhdGUKICAgIHF1YW50aXR5OiBpbnQgPSAxCiAgICBpbWFnZV91cmw6IHN0ciA9ICIiCiAgICBvd25lZF9xdHk6IGludCA9IDAKICAgIGlzX3Byb3h5OiBib29sID0gRmFsc2UKCgojIOKUgOKUgCBWMyBEZWNrIEdlbmVyYXRpb24gKFBlcnBsZXhpdHkgU3RydWN0dXJlZCBPdXRwdXQpIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgApjbGFzcyBEZWNrR2VuVjNSZXF1ZXN0KEJhc2VNb2RlbCk6CiAgICBjb21tYW5kZXJfbmFtZTogc3RyID0gIiIKICAgIHN0cmF0ZWd5OiBzdHIgPSAiIiAgICAgICAgICAgICAgICAgICAgICAgICAgIyBlLmcuICJ6b21iaWUgdG9rZW5zIiwgInZvbHRyb24iCiAgICB0YXJnZXRfYnJhY2tldDogaW50ID0gMyAgICAgICAgICAgICAgICAgICAgICMgMS00IHBlciBDb21tYW5kZXIgUnVsZXMgQ29tbWl0dGVlCiAgICBidWRnZXRfdXNkOiBPcHRpb25hbFtmbG9hdF0gPSBOb25lICAgICAgICAgICMgTm9uZSA9IG5vIGJ1ZGdldAogICAgYnVkZ2V0X21vZGU6IHN0ciA9ICJ0b3RhbCIgICAgICAgICAgICAgICAgICAjICJ0b3RhbCIgb3IgInBlcl9jYXJkIgogICAgb21pdF9jYXJkczogbGlzdFtzdHJdID0gW10gICAgICAgICAgICAgICAgICAjIENhcmRzIHRvIGV4Y2x1ZGUKICAgIHVzZV9jb2xsZWN0aW9uOiBib29sID0gVHJ1ZSAgICAgICAgICAgICAgICAgIyBDcm9zcy1yZWYgd2l0aCBjb2xsZWN0aW9uIERCCiAgICBydW5fc3Vic3RpdHV0aW9uOiBib29sID0gVHJ1ZSAgICAgICAgICAgICAgICMgRW5hYmxlIFNtYXJ0IFN1YnN0aXR1dGlvbiBFbmdpbmUKICAgIG1vZGVsOiBPcHRpb25hbFtzdHJdID0gTm9uZSAgICAgICAgICAgICAgICAgIyBPdmVycmlkZTogc29uYXIsIHNvbmFyLXBybwogICAgZGVja19uYW1lOiBPcHRpb25hbFtzdHJdID0gIiIgICAgICAgICAgICAgICAjIEN1c3RvbSBkZWNrIG5hbWUgZm9yIGNvbW1pdAoKCmNsYXNzIERlY2tHZW5WM1N1YnN0aXR1dGVSZXF1ZXN0KEJhc2VNb2RlbCk6CiAgICAiIiJSZXF1ZXN0IHRvIG1hbnVhbGx5IHBpY2sgYSBzdWJzdGl0dXRlIGZvciBhIGNhcmQuIiIiCiAgICBjYXJkX25hbWU6IHN0cgogICAgc3Vic3RpdHV0ZV9uYW1lOiBzdHIKCgojIOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkAojIHYzOiBEZWNrIEltcG9ydCAmIE1ldGEgRW5kcG9pbnRzCiMg4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQCgpAYXBwLnBvc3QoIi9hcGkvbGFiL2ltcG9ydC91cmwiKQphc3luYyBkZWYgaW1wb3J0X2Zyb21fdXJsKHJlcTogSW1wb3J0VXJsUmVxdWVzdCk6CiAgICAiIiJJbXBvcnQgYSBkZWNrIGZyb20gQXJjaGlkZWt0IG9yIEVESFJFQyBVUkwuIFJldHVybnMgcGFyc2VkIERlY2tQcm9maWxlICsgc2F2ZXMgLmRjayBmaWxlLiIiIgogICAgdXJsID0gcmVxLnVybC5zdHJpcCgpCiAgICB0cnk6CiAgICAgICAgcHJvZmlsZSA9IF9pbXBvcnRfZnJvbV91cmwodXJsKQogICAgICAgIGRja19wYXRoID0gX3NhdmVfcHJvZmlsZV90b19kY2socHJvZmlsZSkKICAgICAgICByZXR1cm4gewogICAgICAgICAgICAic3VjY2VzcyI6IFRydWUsCiAgICAgICAgICAgICJkZWNrTmFtZSI6IHByb2ZpbGVbIm5hbWUiXSwKICAgICAgICAgICAgImNvbW1hbmRlciI6IHByb2ZpbGVbImNvbW1hbmRlciJdLAogICAgICAgICAgICAic291cmNlIjogcHJvZmlsZVsic291cmNlIl0sCiAgICAgICAgICAgICJzb3VyY2VVcmwiOiBwcm9maWxlWyJzb3VyY2VVcmwiXSwKICAgICAgICAgICAgInRvdGFsQ2FyZHMiOiBwcm9maWxlWyJ0b3RhbENhcmRzIl0sCiAgICAgICAgICAgICJkY2tGaWxlIjogZGNrX3BhdGguc3RlbSwKICAgICAgICAgICAgImNvbG9ySWRlbnRpdHkiOiBwcm9maWxlLmdldCgiY29sb3JJZGVudGl0eSIsIFtdKSwKICAgICAgICAgICAgImFyY2hldHlwZSI6IHByb2ZpbGUuZ2V0KCJhcmNoZXR5cGUiKSwKICAgICAgICB9CiAgICBleGNlcHQgRXhjZXB0aW9uIGFzIGU6CiAgICAgICAgcmFpc2UgSFRUUEV4Y2VwdGlvbig0MDAsIHN0cihlKSkKCgpAYXBwLnBvc3QoIi9hcGkvbGFiL2ltcG9ydC90ZXh0IikKYXN5bmMgZGVmIGltcG9ydF9mcm9tX3RleHQocmVxOiBJbXBvcnRUZXh0UmVxdWVzdCk6CiAgICAiIiJJbXBvcnQgYSBkZWNrIGZyb20gcGxhaW4gdGV4dCBjYXJkIGxpc3QuIiIiCiAgICB0cnk6CiAgICAgICAgcHJvZmlsZSA9IF9wYXJzZV90ZXh0X2RlY2tsaXN0KHJlcS50ZXh0LCByZXEuY29tbWFuZGVyKQogICAgICAgIGRja19wYXRoID0gX3NhdmVfcHJvZmlsZV90b19kY2socHJvZmlsZSkKICAgICAgICByZXR1cm4gewogICAgICAgICAgICAic3VjY2VzcyI6IFRydWUsCiAgICAgICAgICAgICJkZWNrTmFtZSI6IHByb2ZpbGVbIm5hbWUiXSwKICAgICAgICAgICAgImNvbW1hbmRlciI6IHByb2ZpbGVbImNvbW1hbmRlciJdLAogICAgICAgICAgICAic291cmNlIjogIlRleHQgSW1wb3J0IiwKICAgICAgICAgICAgInRvdGFsQ2FyZHMiOiBwcm9maWxlWyJ0b3RhbENhcmRzIl0sCiAgICAgICAgICAgICJkY2tGaWxlIjogZGNrX3BhdGguc3RlbSwKICAgICAgICB9CiAgICBleGNlcHQgRXhjZXB0aW9uIGFzIGU6CiAgICAgICAgcmFpc2UgSFRUUEV4Y2VwdGlvbig0MDAsIHN0cihlKSkKCgpAYXBwLmdldCgiL2FwaS9sYWIvbWV0YS9jb21tYW5kZXJzIikKYXN5bmMgZGVmIGxpc3RfbWV0YV9jb21tYW5kZXJzKCk6CiAgICAiIiJMaXN0IGF2YWlsYWJsZSBjb21tYW5kZXJzIGluIHRoZSBtZXRhIG1hcHBpbmcuIiIiCiAgICBjb21tYW5kZXJzID0gW10KICAgIGZvciBuYW1lLCBlbnRyaWVzIGluIENPTU1BTkRFUl9NRVRBLml0ZW1zKCk6CiAgICAgICAgZW50cnkgPSBlbnRyaWVzWzBdIGlmIGVudHJpZXMgZWxzZSB7fQogICAgICAgIGNvbW1hbmRlcnMuYXBwZW5kKHsKICAgICAgICAgICAgIm5hbWUiOiBuYW1lLAogICAgICAgICAgICAiYXJjaGV0eXBlIjogZW50cnkuZ2V0KCJhcmNoZXR5cGUiLCAiIiksCiAgICAgICAgICAgICJjb2xvcklkZW50aXR5IjogZW50cnkuZ2V0KCJjb2xvcklkZW50aXR5IiwgW10pLAogICAgICAgICAgICAic291cmNlIjogZW50cnkuZ2V0KCJzb3VyY2UiLCAiZWRocmVjIiksCiAgICAgICAgfSkKICAgIHJldHVybiB7ImNvbW1hbmRlcnMiOiBjb21tYW5kZXJzfQoKCkBhcHAuZ2V0KCIvYXBpL2xhYi9tZXRhL3NlYXJjaCIpCmFzeW5jIGRlZiBzZWFyY2hfbWV0YV9jb21tYW5kZXJzKHE6IHN0ciA9ICIiKToKICAgICIiIlNlYXJjaCBjb21tYW5kZXJzIGJ5IHBhcnRpYWwgbmFtZSBtYXRjaC4iIiIKICAgIHF1ZXJ5ID0gcS5sb3dlcigpCiAgICBtYXRjaGVzID0gW10KICAgIGZvciBuYW1lLCBlbnRyaWVzIGluIENPTU1BTkRFUl9NRVRBLml0ZW1zKCk6CiAgICAgICAgaWYgcXVlcnkgaW4gbmFtZS5sb3dlcigpOgogICAgICAgICAgICBlbnRyeSA9IGVudHJpZXNbMF0gaWYgZW50cmllcyBlbHNlIHt9CiAgICAgICAgICAgIG1hdGNoZXMuYXBwZW5kKHsKICAgICAgICAgICAgICAgICJuYW1lIjogbmFtZSwKICAgICAgICAgICAgICAgICJhcmNoZXR5cGUiOiBlbnRyeS5nZXQoImFyY2hldHlwZSIsICIiKSwKICAgICAgICAgICAgICAgICJjb2xvcklkZW50aXR5IjogZW50cnkuZ2V0KCJjb2xvcklkZW50aXR5IiwgW10pLAogICAgICAgICAgICB9KQogICAgcmV0dXJuIHsicmVzdWx0cyI6IG1hdGNoZXN9CgoKQGFwcC5wb3N0KCIvYXBpL2xhYi9tZXRhL2ZldGNoIikKYXN5bmMgZGVmIGZldGNoX21ldGFfZGVjayhyZXE6IE1ldGFGZXRjaFJlcXVlc3QpOgogICAgIiIiRmV0Y2ggRURIUkVDIGF2ZXJhZ2UgZGVjayBmb3IgYSBjb21tYW5kZXIgYW5kIHNhdmUgYXMgLmRjayBmaWxlLiIiIgogICAgdHJ5OgogICAgICAgIHByb2ZpbGUgPSBfZmV0Y2hfZWRocmVjX2F2ZXJhZ2UocmVxLmNvbW1hbmRlcikKICAgICAgICBkY2tfcGF0aCA9IF9zYXZlX3Byb2ZpbGVfdG9fZGNrKHByb2ZpbGUpCiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgInN1Y2Nlc3MiOiBUcnVlLAogICAgICAgICAgICAiZGVja05hbWUiOiBwcm9maWxlWyJuYW1lIl0sCiAgICAgICAgICAgICJjb21tYW5kZXIiOiBwcm9maWxlWyJjb21tYW5kZXIiXSwKICAgICAgICAgICAgInNvdXJjZSI6ICJFREhSRUMgQXZlcmFnZSIsCiAgICAgICAgICAgICJzb3VyY2VVcmwiOiBwcm9maWxlLmdldCgic291cmNlVXJsIiwgIiIpLAogICAgICAgICAgICAidG90YWxDYXJkcyI6IHByb2ZpbGVbInRvdGFsQ2FyZHMiXSwKICAgICAgICAgICAgImRja0ZpbGUiOiBkY2tfcGF0aC5zdGVtLAogICAgICAgICAgICAiY29sb3JJZGVudGl0eSI6IHByb2ZpbGUuZ2V0KCJjb2xvcklkZW50aXR5IiwgW10pLAogICAgICAgICAgICAic2FtcGxlU2l6ZSI6IHByb2ZpbGUuZ2V0KCJzYW1wbGVTaXplIiksCiAgICAgICAgfQogICAgZXhjZXB0IEV4Y2VwdGlvbiBhcyBlOgogICAgICAgIHJhaXNlIEhUVFBFeGNlcHRpb24oNDAwLCBmIkZhaWxlZCB0byBmZXRjaCBtZXRhIGRlY2sgZm9yICd7cmVxLmNvbW1hbmRlcn0nOiB7c3RyKGUpfSIpCgoKIyDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZAKIyBFeGlzdGluZyBFbmRwb2ludHMgKHYxL3YyKQojIOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkAoKQGFwcC5wb3N0KCIvYXBpL2xhYi9zdGFydCIsIHJlc3BvbnNlX21vZGVsPVN0YXJ0UmVzcG9uc2UpCmFzeW5jIGRlZiBzdGFydF9iYXRjaChyZXE6IFN0YXJ0UmVxdWVzdCwgYmFja2dyb3VuZF90YXNrczogQmFja2dyb3VuZFRhc2tzKToKICAgICIiIlN0YXJ0IGEgbmV3IGJhdGNoIHNpbXVsYXRpb24gcnVuLiIiIgogICAgaWYgbGVuKHJlcS5kZWNrcykgPCAyIG9yIGxlbihyZXEuZGVja3MpID4gNDoKICAgICAgICByYWlzZSBIVFRQRXhjZXB0aW9uKDQwMCwgIjItNCBkZWNrcyByZXF1aXJlZCIpCiAgICBpZiBub3QgYWxsKHJlcS5kZWNrcyk6CiAgICAgICAgcmFpc2UgSFRUUEV4Y2VwdGlvbig0MDAsIGYiQWxsIHtsZW4ocmVxLmRlY2tzKX0gZGVjayBzbG90cyBtdXN0IGJlIGZpbGxlZCIpCiAgICBpZiByZXEubnVtR2FtZXMgPCAxIG9yIHJlcS5udW1HYW1lcyA+IDEwMDAwOgogICAgICAgIHJhaXNlIEhUVFBFeGNlcHRpb24oNDAwLCAibnVtR2FtZXMgbXVzdCBiZSAxLTEwMDAwIikKICAgIGlmIHJlcS50aHJlYWRzIDwgMSBvciByZXEudGhyZWFkcyA+IDE2OgogICAgICAgIHJhaXNlIEhUVFBFeGNlcHRpb24oNDAwLCAidGhyZWFkcyBtdXN0IGJlIDEtMTYiKQoKICAgIGlmIG5vdCBvcy5wYXRoLmV4aXN0cyhDRkcuZm9yZ2VfamFyKToKICAgICAgICByYWlzZSBIVFRQRXhjZXB0aW9uKDUwMCwgZiJGb3JnZSBKQVIgbm90IGZvdW5kOiB7Q0ZHLmZvcmdlX2phcn0iKQogICAgaWYgbm90IG9zLnBhdGguaXNkaXIoQ0ZHLmZvcmdlX2Rpcik6CiAgICAgICAgcmFpc2UgSFRUUEV4Y2VwdGlvbig1MDAsIGYiRm9yZ2UgZGlyIG5vdCBmb3VuZDoge0NGRy5mb3JnZV9kaXJ9IikKCiAgICBiYXRjaF9pZCA9IHN0cih1dWlkLnV1aWQ0KCkpWzoxMl0KICAgIHN0YXRlID0gQmF0Y2hTdGF0ZShiYXRjaF9pZCwgcmVxLm51bUdhbWVzLCByZXEudGhyZWFkcykKICAgIGFjdGl2ZV9iYXRjaGVzW2JhdGNoX2lkXSA9IHN0YXRlCgogICAgb3MubWFrZWRpcnMoQ0ZHLnJlc3VsdHNfZGlyLCBleGlzdF9vaz1UcnVlKQogICAgb3V0cHV0X3BhdGggPSBvcy5wYXRoLmpvaW4oQ0ZHLnJlc3VsdHNfZGlyLCBmImJhdGNoLXtiYXRjaF9pZH0uanNvbiIpCiAgICBzdGF0ZS5yZXN1bHRfcGF0aCA9IG91dHB1dF9wYXRoCgogICAgYmFja2dyb3VuZF90YXNrcy5hZGRfdGFzaygKICAgICAgICBydW5fYmF0Y2hfc3VicHJvY2VzcywKICAgICAgICBzdGF0ZSwKICAgICAgICByZXEuZGVja3MsCiAgICAgICAgcmVxLm51bUdhbWVzLAogICAgICAgIHJlcS50aHJlYWRzLAogICAgICAgIHJlcS5zZWVkLAogICAgICAgIHJlcS5jbG9jaywKICAgICAgICBvdXRwdXRfcGF0aCwKICAgICAgICByZXEudXNlTGVhcm5lZFBvbGljeSwKICAgICAgICByZXEucG9saWN5U3R5bGUsCiAgICAgICAgcmVxLnBvbGljeUdyZWVkeSwKICAgICAgICByZXEuYWlTaW1wbGlmaWVkLAogICAgICAgIHJlcS5haVRoaW5rVGltZU1zLAogICAgICAgIHJlcS5tYXhRdWV1ZURlcHRoLAogICAgKQoKICAgIHBvbGljeV9tc2cgPSAiIgogICAgaWYgcmVxLnVzZUxlYXJuZWRQb2xpY3k6CiAgICAgICAgcG9saWN5X21zZyA9IGYiIFtMZWFybmVkIFBvbGljeToge3JlcS5wb2xpY3lTdHlsZX1dIgogICAgcmV0dXJuIFN0YXJ0UmVzcG9uc2UoCiAgICAgICAgYmF0Y2hJZD1iYXRjaF9pZCwKICAgICAgICBzdGF0dXM9InN0YXJ0ZWQiLAogICAgICAgIG1lc3NhZ2U9ZiJSdW5uaW5nIHtyZXEubnVtR2FtZXN9IGdhbWVzIHdpdGgge3JlcS50aHJlYWRzfSB0aHJlYWRze3BvbGljeV9tc2d9IiwKICAgICkKCgpAYXBwLmdldCgiL2FwaS9sYWIvc3RhdHVzIiwgcmVzcG9uc2VfbW9kZWw9U3RhdHVzUmVzcG9uc2UpCmFzeW5jIGRlZiBnZXRfc3RhdHVzKGJhdGNoSWQ6IE9wdGlvbmFsW3N0cl0gPSBOb25lKToKICAgICMgSWYgbm8gYmF0Y2hJZCBnaXZlbiwgZmluZCB0aGUgbW9zdCByZWNlbnQgYWN0aXZlIChvciBsYXN0KSBiYXRjaAogICAgc3RhdGUgPSBOb25lCiAgICBpZiBiYXRjaElkOgogICAgICAgIHN0YXRlID0gYWN0aXZlX2JhdGNoZXMuZ2V0KGJhdGNoSWQpCiAgICBlbHNlOgogICAgICAgICMgUmV0dXJuIHRoZSBtb3N0IHJlY2VudGx5IGFjdGl2ZSBiYXRjaCwgb3IgYW55IGJhdGNoCiAgICAgICAgZm9yIHMgaW4gYWN0aXZlX2JhdGNoZXMudmFsdWVzKCk6CiAgICAgICAgICAgIGlmIHMucnVubmluZzoKICAgICAgICAgICAgICAgIHN0YXRlID0gcwogICAgICAgICAgICAgICAgYnJlYWsKICAgICAgICBpZiBzdGF0ZSBpcyBOb25lIGFuZCBhY3RpdmVfYmF0Y2hlczoKICAgICAgICAgICAgc3RhdGUgPSBsaXN0KGFjdGl2ZV9iYXRjaGVzLnZhbHVlcygpKVstMV0KICAgIGlmIG5vdCBzdGF0ZToKICAgICAgICByZXR1cm4gU3RhdHVzUmVzcG9uc2UoCiAgICAgICAgICAgIGJhdGNoSWQ9IiIsIHJ1bm5pbmc9RmFsc2UsIGNvbXBsZXRlZD0wLCB0b3RhbD0wLAogICAgICAgICAgICB0aHJlYWRzPTAsIGVsYXBzZWRNcz0wLCBlcnJvcj1Ob25lLCBzaW1zUGVyU2VjPTAuMCwKICAgICAgICAgICAgcnVuX2lkPSIiLCBnYW1lc19jb21wbGV0ZWQ9MCwgdG90YWxfZ2FtZXM9MCwgY3VycmVudF9kZWNrcz1bXSwKICAgICAgICApCiAgICBlbGFwc2VkID0gaW50KChkYXRldGltZS5ub3coKSAtIHN0YXRlLnN0YXJ0X3RpbWUpLnRvdGFsX3NlY29uZHMoKSAqIDEwMDApCiAgICBkZWNrX25hbWVzID0gZ2V0YXR0cihzdGF0ZSwgJ2RlY2tfbmFtZXMnLCBbXSkgaWYgaGFzYXR0cihzdGF0ZSwgJ2RlY2tfbmFtZXMnKSBlbHNlIFtdCiAgICByZXR1cm4gU3RhdHVzUmVzcG9uc2UoCiAgICAgICAgYmF0Y2hJZD1zdGF0ZS5iYXRjaF9pZCwKICAgICAgICBydW5uaW5nPXN0YXRlLnJ1bm5pbmcsCiAgICAgICAgY29tcGxldGVkPXN0YXRlLmNvbXBsZXRlZF9nYW1lcywKICAgICAgICB0b3RhbD1zdGF0ZS50b3RhbF9nYW1lcywKICAgICAgICB0aHJlYWRzPXN0YXRlLnRocmVhZHMsCiAgICAgICAgZWxhcHNlZE1zPWVsYXBzZWQgaWYgc3RhdGUucnVubmluZyBlbHNlIHN0YXRlLmVsYXBzZWRfbXMsCiAgICAgICAgZXJyb3I9c3RhdGUuZXJyb3IsCiAgICAgICAgc2ltc1BlclNlYz1zdGF0ZS5zaW1zX3Blcl9zZWMsCiAgICAgICAgIyBSZWFjdCBTUEEgZmllbGRzCiAgICAgICAgcnVuX2lkPXN0YXRlLmJhdGNoX2lkLAogICAgICAgIGdhbWVzX2NvbXBsZXRlZD1zdGF0ZS5jb21wbGV0ZWRfZ2FtZXMsCiAgICAgICAgdG90YWxfZ2FtZXM9c3RhdGUudG90YWxfZ2FtZXMsCiAgICAgICAgY3VycmVudF9kZWNrcz1kZWNrX25hbWVzLAogICAgKQoKCkBhcHAuZ2V0KCIvYXBpL2xhYi9yZXN1bHQiKQphc3luYyBkZWYgZ2V0X3Jlc3VsdChiYXRjaElkOiBPcHRpb25hbFtzdHJdID0gTm9uZSk6CiAgICBzdGF0ZSA9IE5vbmUKICAgIGlmIGJhdGNoSWQ6CiAgICAgICAgc3RhdGUgPSBhY3RpdmVfYmF0Y2hlcy5nZXQoYmF0Y2hJZCkKICAgIGVsc2U6CiAgICAgICAgIyBGaW5kIG1vc3QgcmVjZW50IGNvbXBsZXRlZCBiYXRjaAogICAgICAgIGZvciBzIGluIHJldmVyc2VkKGxpc3QoYWN0aXZlX2JhdGNoZXMudmFsdWVzKCkpKToKICAgICAgICAgICAgaWYgbm90IHMucnVubmluZyBhbmQgcy5yZXN1bHRfcGF0aDoKICAgICAgICAgICAgICAgIHN0YXRlID0gcwogICAgICAgICAgICAgICAgYnJlYWsKICAgIGlmIG5vdCBzdGF0ZToKICAgICAgICByYWlzZSBIVFRQRXhjZXB0aW9uKDQwNCwgIk5vIGJhdGNoIHJlc3VsdCBhdmFpbGFibGUiKQogICAgaWYgc3RhdGUucnVubmluZzoKICAgICAgICByYWlzZSBIVFRQRXhjZXB0aW9uKDQwOSwgIkJhdGNoIHN0aWxsIHJ1bm5pbmciKQogICAgaWYgc3RhdGUuZXJyb3I6CiAgICAgICAgcmFpc2UgSFRUUEV4Y2VwdGlvbig1MDAsIHN0YXRlLmVycm9yKQogICAgaWYgbm90IHN0YXRlLnJlc3VsdF9wYXRoIG9yIG5vdCBvcy5wYXRoLmV4aXN0cyhzdGF0ZS5yZXN1bHRfcGF0aCk6CiAgICAgICAgcmFpc2UgSFRUUEV4Y2VwdGlvbig1MDAsICJSZXN1bHQgZmlsZSBub3QgZm91bmQiKQogICAgd2l0aCBvcGVuKHN0YXRlLnJlc3VsdF9wYXRoLCAiciIsIGVuY29kaW5nPSJ1dGYtOCIpIGFzIGY6CiAgICAgICAgZGF0YSA9IGpzb24ubG9hZChmKQogICAgcmV0dXJuIEpTT05SZXNwb25zZShjb250ZW50PWRhdGEpCgoKQGFwcC5nZXQoIi9hcGkvbGFiL2RlY2tzIikKYXN5bmMgZGVmIGxpc3RfZGVja3MoKToKICAgIGRlY2tzID0gW10KICAgIHNlZW5fbmFtZXMgPSBzZXQoKQoKICAgICMgMS4gRm9yZ2UgLmRjayBmaWxlcyBmcm9tIGRlY2tzIGRpcmVjdG9yeQogICAgZGVja3NfZGlyID0gQ0ZHLmZvcmdlX2RlY2tzX2RpcgogICAgaWYgZGVja3NfZGlyIGFuZCBvcy5wYXRoLmlzZGlyKGRlY2tzX2Rpcik6CiAgICAgICAgZm9yIGYgaW4gc29ydGVkKFBhdGgoZGVja3NfZGlyKS5nbG9iKCIqLmRjayIpKToKICAgICAgICAgICAgZGVja19uYW1lID0gZi5zdGVtCiAgICAgICAgICAgIGRlY2tzLmFwcGVuZCh7Im5hbWUiOiBkZWNrX25hbWUsICJmaWxlbmFtZSI6IGYubmFtZSwgInNvdXJjZSI6ICJmb3JnZSJ9KQogICAgICAgICAgICBzZWVuX25hbWVzLmFkZChkZWNrX25hbWUubG93ZXIoKSkKCiAgICAjIDIuIERlY2tzIGZyb20gdGhlIERlY2sgQnVpbGRlciBkYXRhYmFzZQogICAgdHJ5OgogICAgICAgIGNvbm4gPSBfZ2V0X2RiX2Nvbm4oKQogICAgICAgIHJvd3MgPSBjb25uLmV4ZWN1dGUoCiAgICAgICAgICAgICJTRUxFQ1QgaWQsIG5hbWUsIGNvbW1hbmRlcl9uYW1lIEZST00gZGVja3MgT1JERVIgQlkgaWQgREVTQyIKICAgICAgICApLmZldGNoYWxsKCkKICAgICAgICBmb3Igcm93IGluIHJvd3M6CiAgICAgICAgICAgIGRiX25hbWUgPSByb3dbIm5hbWUiXQogICAgICAgICAgICBpZiBkYl9uYW1lLmxvd2VyKCkgbm90IGluIHNlZW5fbmFtZXM6CiAgICAgICAgICAgICAgICBkZWNrcy5hcHBlbmQoewogICAgICAgICAgICAgICAgICAgICJuYW1lIjogZGJfbmFtZSwKICAgICAgICAgICAgICAgICAgICAiZmlsZW5hbWUiOiAiIiwKICAgICAgICAgICAgICAgICAgICAic291cmNlIjogImRlY2tidWlsZGVyIiwKICAgICAgICAgICAgICAgICAgICAiZGVja19pZCI6IHJvd1siaWQiXSwKICAgICAgICAgICAgICAgICAgICAiY29tbWFuZGVyIjogcm93WyJjb21tYW5kZXJfbmFtZSJdIG9yICIiLAogICAgICAgICAgICAgICAgfSkKICAgICAgICAgICAgICAgIHNlZW5fbmFtZXMuYWRkKGRiX25hbWUubG93ZXIoKSkKICAgIGV4Y2VwdCBFeGNlcHRpb24gYXMgZToKICAgICAgICBsb2cud2FybmluZyhmIiAgV0FSTklORzogRmFpbGVkIHRvIGxvYWQgREIgZGVja3MgZm9yIC9hcGkvbGFiL2RlY2tzOiB7ZX0iKQoKICAgIHJldHVybiB7ImRlY2tzIjogZGVja3N9CgoKQGFwcC5nZXQoIi9hcGkvbGFiL2hpc3RvcnkiKQphc3luYyBkZWYgbGlzdF9oaXN0b3J5KCk6CiAgICByZXN1bHRzX2RpciA9IFBhdGgoQ0ZHLnJlc3VsdHNfZGlyKQogICAgaWYgbm90IHJlc3VsdHNfZGlyLmV4aXN0cygpOgogICAgICAgIHJldHVybiB7InJlc3VsdHMiOiBbXX0KICAgIHJlc3VsdHMgPSBbXQogICAgZm9yIGYgaW4gc29ydGVkKHJlc3VsdHNfZGlyLmdsb2IoImJhdGNoLSouanNvbiIpLCByZXZlcnNlPVRydWUpOgogICAgICAgIHRyeToKICAgICAgICAgICAgd2l0aCBvcGVuKGYsICJyIiwgZW5jb2Rpbmc9InV0Zi04IikgYXMgZmg6CiAgICAgICAgICAgICAgICBkYXRhID0ganNvbi5sb2FkKGZoKQogICAgICAgICAgICBtZXRhID0gZGF0YS5nZXQoIm1ldGFkYXRhIiwge30pCiAgICAgICAgICAgIGRlY2tzID0gZGF0YS5nZXQoImRlY2tzIiwgW10pCiAgICAgICAgICAgIHJlc3VsdHMuYXBwZW5kKHsKICAgICAgICAgICAgICAgICJmaWxlbmFtZSI6IGYubmFtZSwKICAgICAgICAgICAgICAgICJiYXRjaElkIjogbWV0YS5nZXQoImJhdGNoSWQiLCAiIiksCiAgICAgICAgICAgICAgICAidGltZXN0YW1wIjogbWV0YS5nZXQoInRpbWVzdGFtcCIsICIiKSwKICAgICAgICAgICAgICAgICJ0b3RhbEdhbWVzIjogbWV0YS5nZXQoImNvbXBsZXRlZEdhbWVzIiwgMCksCiAgICAgICAgICAgICAgICAidGhyZWFkcyI6IG1ldGEuZ2V0KCJ0aHJlYWRzIiwgMSksCiAgICAgICAgICAgICAgICAiZWxhcHNlZE1zIjogbWV0YS5nZXQoImVsYXBzZWRNcyIsIDApLAogICAgICAgICAgICAgICAgImRlY2tzIjogW3sibmFtZSI6IGQuZ2V0KCJkZWNrTmFtZSIsICIiKSwgInNvdXJjZSI6IGQuZ2V0KCJzb3VyY2UiLCAiIil9IGZvciBkIGluIGRlY2tzXSwKICAgICAgICAgICAgfSkKICAgICAgICBleGNlcHQgRXhjZXB0aW9uOgogICAgICAgICAgICBjb250aW51ZQogICAgcmV0dXJuIHsicmVzdWx0cyI6IHJlc3VsdHNbOjUwXX0KCgojIOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkAojIEFJIFByb2ZpbGVzCiMg4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQCgpBSV9QUk9GSUxFUyA9IHsKICAgICJkZWZhdWx0IjogewogICAgICAgICJuYW1lIjogImRlZmF1bHQiLAogICAgICAgICJkZXNjcmlwdGlvbiI6ICJCYWxhbmNlZCBcdTIwMTQgRm9yZ2UncyBkZWZhdWx0IEFJIGJlaGF2aW9yIiwKICAgICAgICAiYWdncmVzc2lvbiI6IDAuNSwgImNhcmRBZHZhbnRhZ2UiOiAwLjUsICJyZW1vdmFsUHJpb3JpdHkiOiAwLjUsCiAgICAgICAgImJvYXJkUHJlc2VuY2UiOiAwLjUsICJjb21ib1ByaW9yaXR5IjogMC4zLCAicGF0aWVuY2UiOiAwLjUsCiAgICB9LAogICAgImFnZ3JvIjogewogICAgICAgICJuYW1lIjogImFnZ3JvIiwKICAgICAgICAiZGVzY3JpcHRpb24iOiAiQWdncmVzc2l2ZSBcdTIwMTQgYXR0YWNrcyBlYXJseSwgcHJpb3JpdGl6ZXMgZGFtYWdlIiwKICAgICAgICAiYWdncmVzc2lvbiI6IDAuOSwgImNhcmRBZHZhbnRhZ2UiOiAwLjMsICJyZW1vdmFsUHJpb3JpdHkiOiAwLjMsCiAgICAgICAgImJvYXJkUHJlc2VuY2UiOiAwLjgsICJjb21ib1ByaW9yaXR5IjogMC4xLCAicGF0aWVuY2UiOiAwLjEsCiAgICB9LAogICAgImNvbnRyb2wiOiB7CiAgICAgICAgIm5hbWUiOiAiY29udHJvbCIsCiAgICAgICAgImRlc2NyaXB0aW9uIjogIkNvbnRyb2wgXHUyMDE0IGRlZmVuc2l2ZSwgcmVtb3ZhbC1oZWF2eSwgY2FyZCBhZHZhbnRhZ2UiLAogICAgICAgICJhZ2dyZXNzaW9uIjogMC4yLCAiY2FyZEFkdmFudGFnZSI6IDAuOSwgInJlbW92YWxQcmlvcml0eSI6IDAuOSwKICAgICAgICAiYm9hcmRQcmVzZW5jZSI6IDAuMywgImNvbWJvUHJpb3JpdHkiOiAwLjQsICJwYXRpZW5jZSI6IDAuOSwKICAgIH0sCiAgICAiY29tYm8iOiB7CiAgICAgICAgIm5hbWUiOiAiY29tYm8iLAogICAgICAgICJkZXNjcmlwdGlvbiI6ICJDb21ibyBcdTIwMTQgcmFtcHMsIGRpZ3MgZm9yIHBpZWNlcywgYXNzZW1ibGVzIGNvbWJvcyIsCiAgICAgICAgImFnZ3Jlc3Npb24iOiAwLjIsICJjYXJkQWR2YW50YWdlIjogMC44LCAicmVtb3ZhbFByaW9yaXR5IjogMC40LAogICAgICAgICJib2FyZFByZXNlbmNlIjogMC4zLCAiY29tYm9Qcmlvcml0eSI6IDAuOTUsICJwYXRpZW5jZSI6IDAuNywKICAgIH0sCiAgICAibWlkcmFuZ2UiOiB7CiAgICAgICAgIm5hbWUiOiAibWlkcmFuZ2UiLAogICAgICAgICJkZXNjcmlwdGlvbiI6ICJNaWRyYW5nZSBcdTIwMTQgZmxleGlibGUsIHN0cm9uZyBib2FyZCBwcmVzZW5jZSwgdmFsdWUtb3JpZW50ZWQiLAogICAgICAgICJhZ2dyZXNzaW9uIjogMC41LCAiY2FyZEFkdmFudGFnZSI6IDAuNiwgInJlbW92YWxQcmlvcml0eSI6IDAuNiwKICAgICAgICAiYm9hcmRQcmVzZW5jZSI6IDAuNywgImNvbWJvUHJpb3JpdHkiOiAwLjMsICJwYXRpZW5jZSI6IDAuNSwKICAgIH0sCn0KCkBhcHAuZ2V0KCIvYXBpL2xhYi9wcm9maWxlcyIpCmFzeW5jIGRlZiBsaXN0X3Byb2ZpbGVzKCk6CiAgICByZXR1cm4geyJwcm9maWxlcyI6IGxpc3QoQUlfUFJPRklMRVMudmFsdWVzKCkpfQoKQGFwcC5nZXQoIi9hcGkvbGFiL3Byb2ZpbGVzL3tuYW1lfSIpCmFzeW5jIGRlZiBnZXRfcHJvZmlsZShuYW1lOiBzdHIpOgogICAgcHJvZmlsZSA9IEFJX1BST0ZJTEVTLmdldChuYW1lLmxvd2VyKCkpCiAgICBpZiBub3QgcHJvZmlsZToKICAgICAgICByYWlzZSBIVFRQRXhjZXB0aW9uKDQwNCwgZiJQcm9maWxlICd7bmFtZX0nIG5vdCBmb3VuZC4gQXZhaWxhYmxlOiB7bGlzdChBSV9QUk9GSUxFUy5rZXlzKCkpfSIpCiAgICByZXR1cm4gcHJvZmlsZQoKCkBhcHAuZ2V0KCIvYXBpL2xhYi9hbmFseXRpY3Mve2RlY2tfbmFtZX0iKQphc3luYyBkZWYgYW5hbHl6ZV9kZWNrKGRlY2tfbmFtZTogc3RyKToKICAgIGRlY2tzX2RpciA9IENGRy5mb3JnZV9kZWNrc19kaXIKICAgIGlmIG5vdCBkZWNrc19kaXIgb3Igbm90IG9zLnBhdGguaXNkaXIoZGVja3NfZGlyKToKICAgICAgICByYWlzZSBIVFRQRXhjZXB0aW9uKDUwMCwgZiJEZWNrcyBkaXJlY3Rvcnkgbm90IGZvdW5kOiB7ZGVja3NfZGlyfSIpCiAgICBkZWNrX3BhdGggPSBvcy5wYXRoLmpvaW4oZGVja3NfZGlyLCBkZWNrX25hbWUgKyAiLmRjayIpCiAgICBpZiBub3Qgb3MucGF0aC5leGlzdHMoZGVja19wYXRoKToKICAgICAgICBmb3IgZiBpbiBvcy5saXN0ZGlyKGRlY2tzX2Rpcik6CiAgICAgICAgICAgIGlmIGYubG93ZXIoKSA9PSBkZWNrX25hbWUubG93ZXIoKSArICIuZGNrIjoKICAgICAgICAgICAgICAgIGRlY2tfcGF0aCA9IG9zLnBhdGguam9pbihkZWNrc19kaXIsIGYpCiAgICAgICAgICAgICAgICBicmVhawogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHJhaXNlIEhUVFBFeGNlcHRpb24oNDA0LCBmIkRlY2sgbm90IGZvdW5kOiB7ZGVja19uYW1lfSIpCiAgICB0cnk6CiAgICAgICAgYW5hbHlzaXMgPSBwYXJzZV9kY2tfZmlsZShkZWNrX3BhdGgpCiAgICAgICAgcmV0dXJuIGFuYWx5c2lzCiAgICBleGNlcHQgRXhjZXB0aW9uIGFzIGU6CiAgICAgICAgcmFpc2UgSFRUUEV4Y2VwdGlvbig1MDAsIGYiQW5hbHlzaXMgZmFpbGVkOiB7c3RyKGUpfSIpCgoKZGVmIHBhcnNlX2Rja19maWxlKGRlY2tfcGF0aDogc3RyKSAtPiBkaWN0OgogICAgY2FyZHMgPSBbXQogICAgY29tbWFuZGVyID0gTm9uZQogICAgc2VjdGlvbiA9ICJNYWluIgogICAgZGVja19uYW1lID0gUGF0aChkZWNrX3BhdGgpLnN0ZW0KICAgIHdpdGggb3BlbihkZWNrX3BhdGgsICJyIiwgZW5jb2Rpbmc9InV0Zi04IikgYXMgZjoKICAgICAgICBmb3IgbGluZSBpbiBmOgogICAgICAgICAgICBsaW5lID0gbGluZS5zdHJpcCgpCiAgICAgICAgICAgIGlmIG5vdCBsaW5lIG9yIGxpbmUuc3RhcnRzd2l0aCgiLy8iKToKICAgICAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgICAgIGlmIGxpbmUuc3RhcnRzd2l0aCgiWyIpIGFuZCBsaW5lLmVuZHN3aXRoKCJdIik6CiAgICAgICAgICAgICAgICBzZWN0aW9uID0gbGluZVsxOi0xXQogICAgICAgICAgICAgICAgY29udGludWUKICAgICAgICAgICAgaWYgbGluZS5zdGFydHN3aXRoKCJOYW1lPSIpOgogICAgICAgICAgICAgICAgZGVja19uYW1lID0gbGluZVs1Ol0uc3RyaXAoKQogICAgICAgICAgICAgICAgY29udGludWUKICAgICAgICAgICAgbSA9IHJlLm1hdGNoKHIiXihcZCspXHMrKC4rPykoPzpcfCguKykpPyQiLCBsaW5lKQogICAgICAgICAgICBpZiBtOgogICAgICAgICAgICAgICAgcXR5ID0gaW50KG0uZ3JvdXAoMSkpCiAgICAgICAgICAgICAgICBuYW1lID0gbS5ncm91cCgyKS5zdHJpcCgpCiAgICAgICAgICAgICAgICBzZXRfY29kZSA9IG0uZ3JvdXAoMykuc3RyaXAoKSBpZiBtLmdyb3VwKDMpIGVsc2UgIiIKICAgICAgICAgICAgICAgIGNhcmRzLmFwcGVuZCh7CiAgICAgICAgICAgICAgICAgICAgInF1YW50aXR5IjogcXR5LCAibmFtZSI6IG5hbWUsICJzZXQiOiBzZXRfY29kZSwKICAgICAgICAgICAgICAgICAgICAic2VjdGlvbiI6IHNlY3Rpb24sCiAgICAgICAgICAgICAgICAgICAgImlzX2NvbW1hbmRlciI6IDEgaWYgc2VjdGlvbiA9PSAiQ29tbWFuZGVyIiBlbHNlIDAsCiAgICAgICAgICAgICAgICB9KQogICAgICAgICAgICAgICAgaWYgc2VjdGlvbiA9PSAiQ29tbWFuZGVyIjoKICAgICAgICAgICAgICAgICAgICBjb21tYW5kZXIgPSBuYW1lCiAgICB0b3RhbCA9IHN1bShjWyJxdWFudGl0eSJdIGZvciBjIGluIGNhcmRzKQogICAgcmV0dXJuIHsKICAgICAgICAiZGVja05hbWUiOiBkZWNrX25hbWUsCiAgICAgICAgImNvbW1hbmRlck5hbWUiOiBjb21tYW5kZXIsCiAgICAgICAgInRvdGFsQ2FyZHMiOiB0b3RhbCwKICAgICAgICAiY2FyZENvdW50IjogbGVuKGNhcmRzKSwKICAgICAgICAiY2FyZHMiOiBjYXJkc1s6MjAwXSwKICAgIH0KCgpAYXBwLmdldCgiL2FwaS9sYWIvdHJlbmRzL3tkZWNrX25hbWV9IikKYXN5bmMgZGVmIGdldF9kZWNrX3RyZW5kcyhkZWNrX25hbWU6IHN0cik6CiAgICByZXN1bHRzX2RpciA9IFBhdGgoQ0ZHLnJlc3VsdHNfZGlyKQogICAgaWYgbm90IHJlc3VsdHNfZGlyLmV4aXN0cygpOgogICAgICAgIHJldHVybiB7ImRlY2tOYW1lIjogZGVja19uYW1lLCAiaGlzdG9yeSI6IFtdfQogICAgaGlzdG9yeSA9IFtdCiAgICBmb3IgZiBpbiBzb3J0ZWQocmVzdWx0c19kaXIuZ2xvYigiYmF0Y2gtKi5qc29uIikpOgogICAgICAgIHRyeToKICAgICAgICAgICAgd2l0aCBvcGVuKGYsICJyIiwgZW5jb2Rpbmc9InV0Zi04IikgYXMgZmg6CiAgICAgICAgICAgICAgICBkYXRhID0ganNvbi5sb2FkKGZoKQogICAgICAgICAgICBzdW1tYXJ5ID0gZGF0YS5nZXQoInN1bW1hcnkiLCB7fSkKICAgICAgICAgICAgbWV0YSA9IGRhdGEuZ2V0KCJtZXRhZGF0YSIsIHt9KQogICAgICAgICAgICBwZXJfZGVjayA9IHN1bW1hcnkuZ2V0KCJwZXJEZWNrIiwgW10pCiAgICAgICAgICAgIGZvciBkcyBpbiBwZXJfZGVjazoKICAgICAgICAgICAgICAgIGlmIGRzLmdldCgiZGVja05hbWUiLCAiIikubG93ZXIoKSA9PSBkZWNrX25hbWUubG93ZXIoKToKICAgICAgICAgICAgICAgICAgICBoaXN0b3J5LmFwcGVuZCh7CiAgICAgICAgICAgICAgICAgICAgICAgICJiYXRjaElkIjogbWV0YS5nZXQoImJhdGNoSWQiKSwKICAgICAgICAgICAgICAgICAgICAgICAgInRpbWVzdGFtcCI6IG1ldGEuZ2V0KCJ0aW1lc3RhbXAiKSwKICAgICAgICAgICAgICAgICAgICAgICAgIndpblJhdGUiOiBkcy5nZXQoIndpblJhdGUiLCAwKSwKICAgICAgICAgICAgICAgICAgICAgICAgIndpbnMiOiBkcy5nZXQoIndpbnMiLCAwKSwKICAgICAgICAgICAgICAgICAgICAgICAgImxvc3NlcyI6IGRzLmdldCgibG9zc2VzIiwgMCksCiAgICAgICAgICAgICAgICAgICAgICAgICJkcmF3cyI6IGRzLmdldCgiZHJhd3MiLCAwKSwKICAgICAgICAgICAgICAgICAgICAgICAgInRvdGFsR2FtZXMiOiBtZXRhLmdldCgiY29tcGxldGVkR2FtZXMiLCAwKSwKICAgICAgICAgICAgICAgICAgICB9KQogICAgICAgICAgICAgICAgICAgIGJyZWFrCiAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbjoKICAgICAgICAgICAgY29udGludWUKICAgIHJldHVybiB7ImRlY2tOYW1lIjogZGVja19uYW1lLCAiaGlzdG9yeSI6IGhpc3Rvcnl9CgoKQGFwcC5nZXQoIi9hcGkvbGFiL2xvZyIpCmFzeW5jIGRlZiBnZXRfbG9nKGJhdGNoSWQ6IHN0cik6CiAgICBzdGF0ZSA9IGFjdGl2ZV9iYXRjaGVzLmdldChiYXRjaElkKQogICAgaWYgbm90IHN0YXRlOgogICAgICAgIHJhaXNlIEhUVFBFeGNlcHRpb24oNDA0LCBmIkJhdGNoIHtiYXRjaElkfSBub3QgZm91bmQiKQogICAgcmV0dXJuIHsibGluZXMiOiBzdGF0ZS5sb2dfbGluZXNbLTIwMDpdfQoKCkBhcHAuZ2V0KCIvYXBpL2xhYi9kZWJ1Zy1sb2ciKQphc3luYyBkZWYgZ2V0X2RlYnVnX2xvZygpOgogICAgIiIiUmV0dXJuIHRoZSByYXcgRm9yZ2Ugc3VicHJvY2VzcyBkZWJ1ZyBsb2cgZm9yIGRpYWdub3Npbmcgc2ltdWxhdGlvbiBpc3N1ZXMuIiIiCiAgICAjIENoZWNrIG11bHRpcGxlIHBvc3NpYmxlIGxvY2F0aW9ucyBmb3IgdGhlIGRlYnVnIGxvZwogICAgY2FuZGlkYXRlcyA9IFtdCiAgICBpZiBDRkcuZm9yZ2VfZGlyOgogICAgICAgIGNhbmRpZGF0ZXMuYXBwZW5kKFBhdGgoQ0ZHLmZvcmdlX2RpcikucGFyZW50IC8gImZvcmdlLXNpbS1kZWJ1Zy5sb2ciKQogICAgICAgIGNhbmRpZGF0ZXMuYXBwZW5kKFBhdGgoQ0ZHLmZvcmdlX2RpcikgLyAiZm9yZ2Utc2ltLWRlYnVnLmxvZyIpCiAgICBjYW5kaWRhdGVzLmFwcGVuZChQYXRoKCJmb3JnZS1zaW0tZGVidWcubG9nIikpCgogICAgZm9yIGxvZ19wYXRoIGluIGNhbmRpZGF0ZXM6CiAgICAgICAgaWYgbG9nX3BhdGguZXhpc3RzKCk6CiAgICAgICAgICAgIHRleHQgPSBsb2dfcGF0aC5yZWFkX3RleHQoZW5jb2Rpbmc9InV0Zi04IiwgZXJyb3JzPSJyZXBsYWNlIikKICAgICAgICAgICAgIyBSZXR1cm4gbGFzdCA1MEtCIHRvIGF2b2lkIGh1Z2UgcmVzcG9uc2VzCiAgICAgICAgICAgIGlmIGxlbih0ZXh0KSA+IDUwMDAwOgogICAgICAgICAgICAgICAgdGV4dCA9ICIuLi4gKHRydW5jYXRlZCkgLi4uXG4iICsgdGV4dFstNTAwMDA6XQogICAgICAgICAgICByZXR1cm4geyJwYXRoIjogc3RyKGxvZ19wYXRoKSwgImNvbnRlbnQiOiB0ZXh0fQoKICAgIHJldHVybiB7InBhdGgiOiBOb25lLCAiY29udGVudCI6ICJObyBkZWJ1ZyBsb2cgZm91bmQuIFJ1biBhIHNpbXVsYXRpb24gZmlyc3QuIn0KCgojIOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkAojIFByZWNvbiBEZWNrcwojIOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkAoKUFJFQ09OX0RJUiA9IFBhdGgoX19maWxlX18pLnBhcmVudCAvICJwcmVjb24tZGVja3MiClBSRUNPTl9JTkRFWDogbGlzdFtkaWN0XSA9IFtdCgoKZGVmIGxvYWRfcHJlY29uX2luZGV4KCk6CiAgICBnbG9iYWwgUFJFQ09OX0lOREVYCiAgICBpZHhfcGF0aCA9IFBSRUNPTl9ESVIgLyAicHJlY29uLWluZGV4Lmpzb24iCiAgICBpZiBpZHhfcGF0aC5leGlzdHMoKToKICAgICAgICB3aXRoIG9wZW4oaWR4X3BhdGgsICJyIiwgZW5jb2Rpbmc9InV0Zi04IikgYXMgZjoKICAgICAgICAgICAgUFJFQ09OX0lOREVYID0ganNvbi5sb2FkKGYpCiAgICAgICAgbG9nLmluZm8oZiIgIFByZWNvbnM6ICAgICAge2xlbihQUkVDT05fSU5ERVgpfSBwcmVjb24gZGVja3MgbG9hZGVkIikKICAgIGVsc2U6CiAgICAgICAgUFJFQ09OX0lOREVYID0gW10KICAgICAgICBsb2cuaW5mbyhmIiAgUHJlY29uczogICAgICBpbmRleCBub3QgZm91bmQgYXQge2lkeF9wYXRofSIpCgoKQGFwcC5nZXQoIi9hcGkvbGFiL3ByZWNvbnMiKQphc3luYyBkZWYgbGlzdF9wcmVjb25zKCk6CiAgICAiIiJMaXN0IGFsbCBhdmFpbGFibGUgcHJlY29uIGRlY2tzLiIiIgogICAgcmV0dXJuIHsicHJlY29ucyI6IFBSRUNPTl9JTkRFWH0KCgpAYXBwLnBvc3QoIi9hcGkvbGFiL3ByZWNvbnMvaW5zdGFsbCIpCmFzeW5jIGRlZiBpbnN0YWxsX3ByZWNvbihyZXE6IGRpY3QpOgogICAgIiIiSW5zdGFsbCBhIHByZWNvbiBkZWNrIHRvIHRoZSBGb3JnZSBkZWNrcyBkaXJlY3RvcnkuCiAgICBCb2R5OiB7ImZpbGVOYW1lIjogIkVsdmVuX0VtcGlyZS5kY2sifQogICAgIiIiCiAgICBmaWxlX25hbWUgPSByZXEuZ2V0KCJmaWxlTmFtZSIsICIiKQogICAgaWYgbm90IGZpbGVfbmFtZToKICAgICAgICByYWlzZSBIVFRQRXhjZXB0aW9uKDQwMCwgImZpbGVOYW1lIGlzIHJlcXVpcmVkIikKCiAgICBzcmMgPSBQUkVDT05fRElSIC8gZmlsZV9uYW1lCiAgICBpZiBub3Qgc3JjLmV4aXN0cygpOgogICAgICAgIHJhaXNlIEhUVFBFeGNlcHRpb24oNDA0LCBmIlByZWNvbiBub3QgZm91bmQ6IHtmaWxlX25hbWV9IikKCiAgICBkZWNrc19kaXIgPSBDRkcuZm9yZ2VfZGVja3NfZGlyCiAgICBpZiBub3QgZGVja3NfZGlyIG9yIG5vdCBvcy5wYXRoLmlzZGlyKGRlY2tzX2Rpcik6CiAgICAgICAgcmFpc2UgSFRUUEV4Y2VwdGlvbig1MDAsIGYiRm9yZ2UgZGVja3MgZGlyZWN0b3J5IG5vdCBmb3VuZDoge2RlY2tzX2Rpcn0iKQoKICAgIGltcG9ydCBzaHV0aWwKICAgIGRzdCA9IFBhdGgoZGVja3NfZGlyKSAvIGZpbGVfbmFtZQogICAgc2h1dGlsLmNvcHkyKHN0cihzcmMpLCBzdHIoZHN0KSkKCiAgICBkZWNrX25hbWUgPSBmaWxlX25hbWUucmVwbGFjZSgiLmRjayIsICIiKQogICAgcmV0dXJuIHsKICAgICAgICAiaW5zdGFsbGVkIjogVHJ1ZSwKICAgICAgICAiZGVja05hbWUiOiBkZWNrX25hbWUsCiAgICAgICAgImRlc3RpbmF0aW9uIjogc3RyKGRzdCksCiAgICAgICAgIm1lc3NhZ2UiOiBmIkluc3RhbGxlZCB7ZGVja19uYW1lfSB0byBGb3JnZSBkZWNrcyIsCiAgICB9CgoKQGFwcC5wb3N0KCIvYXBpL2xhYi9wcmVjb25zL2luc3RhbGwtYmF0Y2giKQphc3luYyBkZWYgaW5zdGFsbF9wcmVjb25zX2JhdGNoKHJlcTogZGljdCk6CiAgICAiIiJJbnN0YWxsIG11bHRpcGxlIHByZWNvbiBkZWNrcyBhdCBvbmNlLgogICAgQm9keTogeyJmaWxlTmFtZXMiOiBbIkVsdmVuX0VtcGlyZS5kY2siLCAiTmVjcm9uX0R5bmFzdGllcy5kY2siXX0KICAgICIiIgogICAgZmlsZV9uYW1lcyA9IHJlcS5nZXQoImZpbGVOYW1lcyIsIFtdKQogICAgaWYgbm90IGZpbGVfbmFtZXM6CiAgICAgICAgcmFpc2UgSFRUUEV4Y2VwdGlvbig0MDAsICJmaWxlTmFtZXMgbGlzdCBpcyByZXF1aXJlZCIpCgogICAgZGVja3NfZGlyID0gQ0ZHLmZvcmdlX2RlY2tzX2RpcgogICAgaWYgbm90IGRlY2tzX2RpciBvciBub3Qgb3MucGF0aC5pc2RpcihkZWNrc19kaXIpOgogICAgICAgIHJhaXNlIEhUVFBFeGNlcHRpb24oNTAwLCBmIkZvcmdlIGRlY2tzIGRpcmVjdG9yeSBub3QgZm91bmQ6IHtkZWNrc19kaXJ9IikKCiAgICBpbXBvcnQgc2h1dGlsCiAgICByZXN1bHRzID0gW10KICAgIGZvciBmaWxlX25hbWUgaW4gZmlsZV9uYW1lczoKICAgICAgICBzcmMgPSBQUkVDT05fRElSIC8gZmlsZV9uYW1lCiAgICAgICAgaWYgbm90IHNyYy5leGlzdHMoKToKICAgICAgICAgICAgcmVzdWx0cy5hcHBlbmQoeyJmaWxlTmFtZSI6IGZpbGVfbmFtZSwgImluc3RhbGxlZCI6IEZhbHNlLCAiZXJyb3IiOiAibm90IGZvdW5kIn0pCiAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgZHN0ID0gUGF0aChkZWNrc19kaXIpIC8gZmlsZV9uYW1lCiAgICAgICAgc2h1dGlsLmNvcHkyKHN0cihzcmMpLCBzdHIoZHN0KSkKICAgICAgICBkZWNrX25hbWUgPSBmaWxlX25hbWUucmVwbGFjZSgiLmRjayIsICIiKQogICAgICAgIHJlc3VsdHMuYXBwZW5kKHsiZmlsZU5hbWUiOiBmaWxlX25hbWUsICJpbnN0YWxsZWQiOiBUcnVlLCAiZGVja05hbWUiOiBkZWNrX25hbWV9KQoKICAgIHJldHVybiB7InJlc3VsdHMiOiByZXN1bHRzfQoKCiMg4pSA4pSAIFByZWNvbiBBdXRvLURvd25sb2FkIGZyb20gR2l0SHViIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgAoKR0lUSFVCX1BSRUNPTl9VUkwgPSAoCiAgICAiaHR0cHM6Ly9yYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3Rhdy9tYWdpYy1wcmVjb25zdHJ1Y3RlZC1kZWNrcy1kYXRhLyIKICAgICJtYXN0ZXIvZGVja3NfdjIuanNvbiIKKQpQUkVDT05fQ0FDSEVfSE9VUlMgPSAxNjggICMgcmUtZG93bmxvYWQgd2Vla2x5CgoKZGVmIF9jb2xvcl9pZGVudGl0eV9mcm9tX2NhcmRzKGRlY2tfZGF0YTogZGljdCkgLT4gbGlzdFtzdHJdOgogICAgIiIiRXh0cmFjdCBhcHByb3hpbWF0ZSBjb2xvciBpZGVudGl0eSBmcm9tIGNvbW1hbmRlciBzZWN0aW9uLiIiIgogICAgIyBUaGUgZGF0YSBkb2Vzbid0IGluY2x1ZGUgY29sb3IgaW5mbyBkaXJlY3RseSwgc28gd2UgdHJhY2sgd2hhdCB3ZSBjYW4KICAgICMgZnJvbSBjb21tYW5kZXIgbmFtZXMg4oCUIGJ1dCB3ZSBqdXN0IGxlYXZlIGl0IGFzIGEgc2VhcmNoYWJsZSBmaWVsZC4KICAgIHJldHVybiBbXQoKCmRlZiBfc2FuaXRpemVfZmlsZW5hbWUobmFtZTogc3RyKSAtPiBzdHI6CiAgICAiIiJUdXJuIGEgZGVjayBuYW1lIGludG8gYSBzYWZlIGZpbGVuYW1lLiIiIgogICAgc2FmZSA9IHJlLnN1YihyJ1s8PjoiL1xcfD8qXScsICcnLCBuYW1lKQogICAgc2FmZSA9IHNhZmUucmVwbGFjZSgnICcsICdfJykucmVwbGFjZSgiJyIsICcnKS5yZXBsYWNlKCchJywgJycpCiAgICBzYWZlID0gcmUuc3ViKHInXysnLCAnXycsIHNhZmUpLnN0cmlwKCdfJykKICAgIHJldHVybiBzYWZlCgoKZGVmIF9kZWNrX3RvX2RjayhkZWNrX2RhdGE6IGRpY3QpIC0+IHN0cjoKICAgICIiIkNvbnZlcnQgYSBkZWNrIGVudHJ5IGZyb20gZGVja3NfdjIuanNvbiBpbnRvIC5kY2sgZm9ybWF0LiIiIgogICAgbGluZXMgPSBbXQogICAgbGluZXMuYXBwZW5kKCJbbWV0YWRhdGFdIikKICAgIGxpbmVzLmFwcGVuZChmIk5hbWU9e2RlY2tfZGF0YVsnbmFtZSddfSIpCgogICAgIyBDb21tYW5kZXIgc2VjdGlvbgogICAgY29tbWFuZGVycyA9IGRlY2tfZGF0YS5nZXQoJ2NvbW1hbmRlcicsIFtdKQogICAgaWYgY29tbWFuZGVyczoKICAgICAgICBsaW5lcy5hcHBlbmQoIltDb21tYW5kZXJdIikKICAgICAgICBmb3IgY2FyZCBpbiBjb21tYW5kZXJzOgogICAgICAgICAgICBjb3VudCA9IGNhcmQuZ2V0KCdjb3VudCcsIDEpCiAgICAgICAgICAgIGxpbmVzLmFwcGVuZChmIntjb3VudH0ge2NhcmRbJ25hbWUnXX0iKQoKICAgICMgTWFpbiBkZWNrCiAgICBjYXJkcyA9IGRlY2tfZGF0YS5nZXQoJ2NhcmRzJywgW10pCiAgICBpZiBjYXJkczoKICAgICAgICBsaW5lcy5hcHBlbmQoIltNYWluXSIpCiAgICAgICAgZm9yIGNhcmQgaW4gY2FyZHM6CiAgICAgICAgICAgIGNvdW50ID0gY2FyZC5nZXQoJ2NvdW50JywgMSkKICAgICAgICAgICAgbGluZXMuYXBwZW5kKGYie2NvdW50fSB7Y2FyZFsnbmFtZSddfSIpCgogICAgIyBTaWRlYm9hcmQgKHJhcmUgaW4gQ29tbWFuZGVyIGJ1dCBpbmNsdWRlIGlmIHByZXNlbnQpCiAgICBzaWRlYm9hcmQgPSBkZWNrX2RhdGEuZ2V0KCdzaWRlYm9hcmQnLCBbXSkKICAgIGlmIHNpZGVib2FyZDoKICAgICAgICBsaW5lcy5hcHBlbmQoIltTaWRlYm9hcmRdIikKICAgICAgICBmb3IgY2FyZCBpbiBzaWRlYm9hcmQ6CiAgICAgICAgICAgIGNvdW50ID0gY2FyZC5nZXQoJ2NvdW50JywgMSkKICAgICAgICAgICAgbGluZXMuYXBwZW5kKGYie2NvdW50fSB7Y2FyZFsnbmFtZSddfSIpCgogICAgcmV0dXJuICJcbiIuam9pbihsaW5lcykgKyAiXG4iCgoKZGVmIGRvd25sb2FkX3ByZWNvbl9kYXRhYmFzZShmb3JjZTogYm9vbCA9IEZhbHNlKSAtPiBkaWN0OgogICAgIiIiCiAgICBEb3dubG9hZCBhbGwgQ29tbWFuZGVyIHByZWNvbiBkZWNrcyBmcm9tIEdpdEh1YiwgY29udmVydCB0byAuZGNrLAogICAgYW5kIHJlYnVpbGQgcHJlY29uLWluZGV4Lmpzb24uICBTa2lwcyBpZiBpbmRleCBpcyBmcmVzaCAoPCBQUkVDT05fQ0FDSEVfSE9VUlMgb2xkKQogICAgdW5sZXNzIGZvcmNlPVRydWUuCgogICAgUmV0dXJucyB7ImRvd25sb2FkZWQiOiBpbnQsICJza2lwcGVkIjogYm9vbCwgImVycm9yIjogc3RyfE5vbmV9CiAgICAiIiIKICAgIGdsb2JhbCBQUkVDT05fSU5ERVgKICAgIGlkeF9wYXRoID0gUFJFQ09OX0RJUiAvICJwcmVjb24taW5kZXguanNvbiIKCiAgICAjIOKUgOKUgCBDYWNoZSBjaGVjayDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKICAgIGlmIG5vdCBmb3JjZSBhbmQgaWR4X3BhdGguZXhpc3RzKCk6CiAgICAgICAgdHJ5OgogICAgICAgICAgICB3aXRoIG9wZW4oaWR4X3BhdGgsICJyIiwgZW5jb2Rpbmc9InV0Zi04IikgYXMgZjoKICAgICAgICAgICAgICAgIGV4aXN0aW5nID0ganNvbi5sb2FkKGYpCiAgICAgICAgICAgICMgSWYgd2UgaGF2ZSBhIHN1YnN0YW50aWFsIG51bWJlciBvZiBkZWNrcyBhbmQgZmlsZSBpcyByZWNlbnQsIHNraXAKICAgICAgICAgICAgaWYgbGVuKGV4aXN0aW5nKSA+IDUwOgogICAgICAgICAgICAgICAgYWdlX2hvdXJzID0gKHRpbWUudGltZSgpIC0gaWR4X3BhdGguc3RhdCgpLnN0X210aW1lKSAvIDM2MDAKICAgICAgICAgICAgICAgIGlmIGFnZV9ob3VycyA8IFBSRUNPTl9DQUNIRV9IT1VSUzoKICAgICAgICAgICAgICAgICAgICBsb2cuaW5mbyhmIiAgUHJlY29uczogICAgICB7bGVuKGV4aXN0aW5nKX0gZGVja3MgY2FjaGVkICIKICAgICAgICAgICAgICAgICAgICAgICAgICBmIih7YWdlX2hvdXJzOi4wZn1oIG9sZCwgcmVmcmVzaCBhZnRlciB7UFJFQ09OX0NBQ0hFX0hPVVJTfWgpIikKICAgICAgICAgICAgICAgICAgICBQUkVDT05fSU5ERVggPSBleGlzdGluZwogICAgICAgICAgICAgICAgICAgIHJldHVybiB7ImRvd25sb2FkZWQiOiAwLCAic2tpcHBlZCI6IFRydWUsICJ0b3RhbCI6IGxlbihleGlzdGluZyksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZXJyb3IiOiBOb25lfQogICAgICAgIGV4Y2VwdCBFeGNlcHRpb246CiAgICAgICAgICAgIHBhc3MgICMgRmFsbCB0aHJvdWdoIHRvIGRvd25sb2FkCgogICAgIyDilIDilIAgRG93bmxvYWQg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACiAgICBsb2cuaW5mbygiICBQcmVjb25zOiAgICAgIERvd25sb2FkaW5nIGZ1bGwgcHJlY29uIGRhdGFiYXNlIGZyb20gR2l0SHViLi4uIikKICAgIHRyeToKICAgICAgICByZXEgPSBSZXF1ZXN0KEdJVEhVQl9QUkVDT05fVVJMLCBoZWFkZXJzPXsiVXNlci1BZ2VudCI6ICJDb21tYW5kZXJBSUxhYi8zLjAifSkKICAgICAgICB3aXRoIHVybG9wZW4ocmVxLCB0aW1lb3V0PTEyMCkgYXMgcmVzcDoKICAgICAgICAgICAgcmF3ID0gcmVzcC5yZWFkKCkKICAgICAgICBhbGxfZGVja3MgPSBqc29uLmxvYWRzKHJhdykKICAgIGV4Y2VwdCBFeGNlcHRpb24gYXMgZToKICAgICAgICBtc2cgPSBmIkZhaWxlZCB0byBkb3dubG9hZCBwcmVjb24gZGF0YWJhc2U6IHtlfSIKICAgICAgICBsb2cuZXJyb3IoZiIgIFByZWNvbnM6ICAgICAgRVJST1Ig4oCUIHttc2d9IikKICAgICAgICAjIEZhbGwgYmFjayB0byB3aGF0ZXZlciB3ZSBoYXZlIGxvY2FsbHkKICAgICAgICBpZiBpZHhfcGF0aC5leGlzdHMoKToKICAgICAgICAgICAgbG9hZF9wcmVjb25faW5kZXgoKQogICAgICAgIHJldHVybiB7ImRvd25sb2FkZWQiOiAwLCAic2tpcHBlZCI6IEZhbHNlLCAiZXJyb3IiOiBtc2d9CgogICAgIyDilIDilIAgRmlsdGVyIHRvIENvbW1hbmRlciBwcmVjb24gZGVja3Mg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACiAgICBjb21tYW5kZXJfZGVja3MgPSBbCiAgICAgICAgZCBmb3IgZCBpbiBhbGxfZGVja3MKICAgICAgICBpZiBkLmdldCgndHlwZScpID09ICdDb21tYW5kZXIgRGVjaycKICAgICAgICBhbmQgKGQuZ2V0KCdmb3JtYXQnKSBvciAnJykubG93ZXIoKSA9PSAnY29tbWFuZGVyJwogICAgXQogICAgbG9nLmluZm8oZiIgIFByZWNvbnM6ICAgICAgRm91bmQge2xlbihjb21tYW5kZXJfZGVja3MpfSBDb21tYW5kZXIgcHJlY29uIGRlY2tzIikKCiAgICAjIOKUgOKUgCBFbnN1cmUgcHJlY29uLWRlY2tzIGRpciBleGlzdHMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACiAgICBQUkVDT05fRElSLm1rZGlyKHBhcmVudHM9VHJ1ZSwgZXhpc3Rfb2s9VHJ1ZSkKCiAgICAjIOKUgOKUgCBEZXRlY3QgZHVwbGljYXRlIG5hbWVzIGFuZCBhcHBlbmQgc2V0IGNvZGUgZm9yIHVuaXF1ZW5lc3Mg4pSACiAgICBmcm9tIGNvbGxlY3Rpb25zIGltcG9ydCBDb3VudGVyCiAgICBuYW1lX2NvdW50cyA9IENvdW50ZXIoX3Nhbml0aXplX2ZpbGVuYW1lKGRbJ25hbWUnXSkgZm9yIGQgaW4gY29tbWFuZGVyX2RlY2tzKQogICAgZHVwX25hbWVzID0ge24gZm9yIG4sIGMgaW4gbmFtZV9jb3VudHMuaXRlbXMoKSBpZiBjID4gMX0KCiAgICAjIOKUgOKUgCBDb252ZXJ0IGFuZCB3cml0ZSAuZGNrIGZpbGVzICsgYnVpbGQgaW5kZXgg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACiAgICBpbmRleCA9IFtdCiAgICB3cml0dGVuID0gMAogICAgZm9yIGRlY2sgaW4gc29ydGVkKGNvbW1hbmRlcl9kZWNrcywga2V5PWxhbWJkYSBkOiAoZC5nZXQoJ3JlbGVhc2VfZGF0ZScsICcnKSwgZC5nZXQoJ25hbWUnLCAnJykpKToKICAgICAgICBzYWZlX25hbWUgPSBfc2FuaXRpemVfZmlsZW5hbWUoZGVja1snbmFtZSddKQogICAgICAgICMgQXBwZW5kIHNldCBjb2RlIGZvciBkdXBsaWNhdGUgbmFtZXMgKGUuZy4gQW50aG9sb2d5IHJlcHJpbnRzKQogICAgICAgIGlmIHNhZmVfbmFtZSBpbiBkdXBfbmFtZXM6CiAgICAgICAgICAgIHNjID0gKGRlY2suZ2V0KCdzZXRfY29kZScpIG9yICd1bmsnKS51cHBlcigpCiAgICAgICAgICAgIHNhZmVfbmFtZSA9IGYie3NhZmVfbmFtZX1fe3NjfSIKICAgICAgICBmaWxlX25hbWUgPSBmIntzYWZlX25hbWV9LmRjayIKICAgICAgICBkY2tfcGF0aCA9IFBSRUNPTl9ESVIgLyBmaWxlX25hbWUKCiAgICAgICAgIyBFeHRyYWN0IGNvbW1hbmRlciBuYW1lcwogICAgICAgIGNvbW1hbmRlcnMgPSBkZWNrLmdldCgnY29tbWFuZGVyJywgW10pCiAgICAgICAgY21kcl9uYW1lcyA9IFtjWyduYW1lJ10gZm9yIGMgaW4gY29tbWFuZGVyc10gaWYgY29tbWFuZGVycyBlbHNlIFtdCgogICAgICAgICMgQ2FyZCBjb3VudAogICAgICAgIHRvdGFsX2NhcmRzID0gc3VtKGMuZ2V0KCdjb3VudCcsIDEpIGZvciBjIGluIGRlY2suZ2V0KCdjYXJkcycsIFtdKSkKICAgICAgICB0b3RhbF9jYXJkcyArPSBzdW0oYy5nZXQoJ2NvdW50JywgMSkgZm9yIGMgaW4gY29tbWFuZGVycykKCiAgICAgICAgIyBXcml0ZSAuZGNrIGZpbGUKICAgICAgICBkY2tfY29udGVudCA9IF9kZWNrX3RvX2RjayhkZWNrKQogICAgICAgIHdpdGggb3BlbihkY2tfcGF0aCwgInciLCBlbmNvZGluZz0idXRmLTgiKSBhcyBmOgogICAgICAgICAgICBmLndyaXRlKGRja19jb250ZW50KQogICAgICAgIHdyaXR0ZW4gKz0gMQoKICAgICAgICAjIEJ1aWxkIGluZGV4IGVudHJ5CiAgICAgICAgcmVsZWFzZSA9IGRlY2suZ2V0KCdyZWxlYXNlX2RhdGUnLCAnJykKICAgICAgICB5ZWFyID0gaW50KHJlbGVhc2VbOjRdKSBpZiByZWxlYXNlIGFuZCBsZW4ocmVsZWFzZSkgPj0gNCBlbHNlIDAKICAgICAgICBpbmRleC5hcHBlbmQoewogICAgICAgICAgICAibmFtZSI6IGRlY2tbJ25hbWUnXSwKICAgICAgICAgICAgImNvbW1hbmRlciI6IGNtZHJfbmFtZXNbMF0gaWYgY21kcl9uYW1lcyBlbHNlICJVbmtub3duIiwKICAgICAgICAgICAgImNvbW1hbmRlcnMiOiBjbWRyX25hbWVzLAogICAgICAgICAgICAiY29sb3JzIjogW10sICAjIENvbG9yIGRhdGEgbm90IGluIHNvdXJjZTsgVUkgY2FuIGluZmVyIGZyb20gY2FyZHMKICAgICAgICAgICAgInNldCI6IGRlY2suZ2V0KCdzZXRfbmFtZScsICcnKSwKICAgICAgICAgICAgInNldENvZGUiOiBkZWNrLmdldCgnc2V0X2NvZGUnLCAnJyksCiAgICAgICAgICAgICJ5ZWFyIjogeWVhciwKICAgICAgICAgICAgInJlbGVhc2VEYXRlIjogcmVsZWFzZSwKICAgICAgICAgICAgInRoZW1lIjogIiIsCiAgICAgICAgICAgICJmaWxlTmFtZSI6IGZpbGVfbmFtZSwKICAgICAgICAgICAgImNhcmRDb3VudCI6IHRvdGFsX2NhcmRzLAogICAgICAgIH0pCgogICAgIyDilIDilIAgV3JpdGUgaW5kZXgg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACiAgICB3aXRoIG9wZW4oaWR4X3BhdGgsICJ3IiwgZW5jb2Rpbmc9InV0Zi04IikgYXMgZjoKICAgICAgICBqc29uLmR1bXAoaW5kZXgsIGYsIGluZGVudD0yLCBlbnN1cmVfYXNjaWk9RmFsc2UpCgogICAgUFJFQ09OX0lOREVYID0gaW5kZXgKICAgIGxvZy5pbmZvKGYiICBQcmVjb25zOiAgICAgIHt3cml0dGVufSAuZGNrIGZpbGVzIHdyaXR0ZW4sIGluZGV4IHNhdmVkIikKICAgIHJldHVybiB7ImRvd25sb2FkZWQiOiB3cml0dGVuLCAic2tpcHBlZCI6IEZhbHNlLCAidG90YWwiOiB3cml0dGVuLCAiZXJyb3IiOiBOb25lfQoKCkBhcHAucG9zdCgiL2FwaS9sYWIvcHJlY29ucy9yZWZyZXNoIikKYXN5bmMgZGVmIHJlZnJlc2hfcHJlY29ucygpOgogICAgIiIiRm9yY2UgcmUtZG93bmxvYWQgb2YgYWxsIENvbW1hbmRlciBwcmVjb24gZGVja3MgZnJvbSBHaXRIdWIuIiIiCiAgICByZXN1bHQgPSBkb3dubG9hZF9wcmVjb25fZGF0YWJhc2UoZm9yY2U9VHJ1ZSkKICAgIGlmIHJlc3VsdC5nZXQoImVycm9yIik6CiAgICAgICAgcmFpc2UgSFRUUEV4Y2VwdGlvbig1MDIsIHJlc3VsdFsiZXJyb3IiXSkKICAgIHJldHVybiB7CiAgICAgICAgIm1lc3NhZ2UiOiBmIkRvd25sb2FkZWQge3Jlc3VsdFsnZG93bmxvYWRlZCddfSBDb21tYW5kZXIgcHJlY29uIGRlY2tzIiwKICAgICAgICAidG90YWwiOiByZXN1bHQuZ2V0KCJ0b3RhbCIsIDApLAogICAgfQoKCiMg4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQCiMgRGVjayBJbXBvcnQgSGVscGVycyAoUHl0aG9uLXNpZGUpCiMg4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQCgpfQVBJX0hFQURFUlMgPSB7IlVzZXItQWdlbnQiOiAiQ29tbWFuZGVyQUlMYWIvMy4wIiwgIkFjY2VwdCI6ICJhcHBsaWNhdGlvbi9qc29uIn0KCgpkZWYgX2h0dHBfZ2V0KHVybDogc3RyKSAtPiBzdHI6CiAgICByZXEgPSBSZXF1ZXN0KHVybCwgaGVhZGVycz1fQVBJX0hFQURFUlMpCiAgICB3aXRoIHVybG9wZW4ocmVxLCB0aW1lb3V0PTMwKSBhcyByZXNwOgogICAgICAgIHJldHVybiByZXNwLnJlYWQoKS5kZWNvZGUoInV0Zi04IikKCgpkZWYgX2ltcG9ydF9mcm9tX3VybCh1cmw6IHN0cikgLT4gZGljdDoKICAgICIiIkltcG9ydCBkZWNrIGZyb20gVVJMIChBcmNoaWRla3Qgb3IgRURIUkVDKS4iIiIKICAgIHVybCA9IHVybC5zdHJpcCgpCgogICAgIyBBcmNoaWRla3QKICAgIGlmICJhcmNoaWRla3QuY29tL2RlY2tzLyIgaW4gdXJsOgogICAgICAgIG0gPSByZS5zZWFyY2gociIvZGVja3MvKFxkKykiLCB1cmwpCiAgICAgICAgaWYgbm90IG06CiAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoIkNvdWxkIG5vdCBwYXJzZSBBcmNoaWRla3QgZGVjayBJRCBmcm9tIFVSTCIpCiAgICAgICAgcmV0dXJuIF9mZXRjaF9hcmNoaWRla3RfZGVjayhtLmdyb3VwKDEpKQoKICAgICMgRURIUkVDIGF2ZXJhZ2UgZGVjawogICAgaWYgImVkaHJlYy5jb20vYXZlcmFnZS1kZWNrcy8iIGluIHVybDoKICAgICAgICBzbHVnID0gcmUuc2VhcmNoKHIiL2F2ZXJhZ2UtZGVja3MvKFteLz8jXSspIiwgdXJsKS5ncm91cCgxKQogICAgICAgIGNvbW1hbmRlcl9uYW1lID0gc2x1Zy5yZXBsYWNlKCItIiwgIiAiKQogICAgICAgIHJldHVybiBfZmV0Y2hfZWRocmVjX2F2ZXJhZ2UoY29tbWFuZGVyX25hbWUpCgogICAgIyBFREhSRUMgY29tbWFuZGVyIHBhZ2UKICAgIGlmICJlZGhyZWMuY29tL2NvbW1hbmRlcnMvIiBpbiB1cmw6CiAgICAgICAgc2x1ZyA9IHJlLnNlYXJjaChyIi9jb21tYW5kZXJzLyhbXi8/I10rKSIsIHVybCkuZ3JvdXAoMSkKICAgICAgICBjb21tYW5kZXJfbmFtZSA9IHNsdWcucmVwbGFjZSgiLSIsICIgIikKICAgICAgICByZXR1cm4gX2ZldGNoX2VkaHJlY19hdmVyYWdlKGNvbW1hbmRlcl9uYW1lKQoKICAgIHJhaXNlIFZhbHVlRXJyb3IoZiJVbnN1cHBvcnRlZCBVUkw6IHt1cmx9LiBTdXBwb3J0ZWQ6IGFyY2hpZGVrdC5jb20vZGVja3MvLi4uLCBlZGhyZWMuY29tL2F2ZXJhZ2UtZGVja3MvLi4uLCBlZGhyZWMuY29tL2NvbW1hbmRlcnMvLi4uIikKCgpkZWYgX2ZldGNoX2FyY2hpZGVrdF9kZWNrKGRlY2tfaWQ6IHN0cikgLT4gZGljdDoKICAgICIiIkZldGNoIGRlY2sgZnJvbSBBcmNoaWRla3QgQVBJLiIiIgogICAgdXJsID0gZiJodHRwczovL2FyY2hpZGVrdC5jb20vYXBpL2RlY2tzL3tkZWNrX2lkfS8iCiAgICBkYXRhID0ganNvbi5sb2FkcyhfaHR0cF9nZXQodXJsKSkKCiAgICBwcm9maWxlID0gewogICAgICAgICJuYW1lIjogZGF0YS5nZXQoIm5hbWUiLCBmIkFyY2hpZGVrdCB7ZGVja19pZH0iKSwKICAgICAgICAiY29tbWFuZGVyIjogTm9uZSwKICAgICAgICAic291cmNlIjogIkFyY2hpZGVrdCIsCiAgICAgICAgInNvdXJjZVVybCI6IGYiaHR0cHM6Ly9hcmNoaWRla3QuY29tL2RlY2tzL3tkZWNrX2lkfSIsCiAgICAgICAgImNvbW1hbmRlcnMiOiB7fSwKICAgICAgICAibWFpbmJvYXJkIjoge30sCiAgICAgICAgImNvbG9ySWRlbnRpdHkiOiBbXSwKICAgICAgICAidG90YWxDYXJkcyI6IDAsCiAgICB9CgogICAgZm9yIGNhcmRfZW50cnkgaW4gZGF0YS5nZXQoImNhcmRzIiwgW10pOgogICAgICAgIHF0eSA9IGNhcmRfZW50cnkuZ2V0KCJxdWFudGl0eSIsIDEpCiAgICAgICAgY2FyZCA9IGNhcmRfZW50cnkuZ2V0KCJjYXJkIiwge30pCiAgICAgICAgb3JhY2xlID0gY2FyZC5nZXQoIm9yYWNsZUNhcmQiLCB7fSkKICAgICAgICBjYXJkX25hbWUgPSBvcmFjbGUuZ2V0KCJuYW1lIiwgIlVua25vd24iKQoKICAgICAgICBjYXRlZ29yaWVzID0gW2MgZm9yIGMgaW4gY2FyZF9lbnRyeS5nZXQoImNhdGVnb3JpZXMiLCBbXSldCiAgICAgICAgaXNfY29tbWFuZGVyID0gYW55KGMubG93ZXIoKSA9PSAiY29tbWFuZGVyIiBmb3IgYyBpbiBjYXRlZ29yaWVzKQoKICAgICAgICBpZiBpc19jb21tYW5kZXI6CiAgICAgICAgICAgIHByb2ZpbGVbImNvbW1hbmRlcnMiXVtjYXJkX25hbWVdID0gcXR5CiAgICAgICAgICAgIGlmIG5vdCBwcm9maWxlWyJjb21tYW5kZXIiXToKICAgICAgICAgICAgICAgIHByb2ZpbGVbImNvbW1hbmRlciJdID0gY2FyZF9uYW1lCiAgICAgICAgICAgICAgICBpZiBvcmFjbGUuZ2V0KCJjb2xvcklkZW50aXR5Iik6CiAgICAgICAgICAgICAgICAgICAgcHJvZmlsZVsiY29sb3JJZGVudGl0eSJdID0gb3JhY2xlWyJjb2xvcklkZW50aXR5Il0KICAgICAgICBlbHNlOgogICAgICAgICAgICBwcm9maWxlWyJtYWluYm9hcmQiXVtjYXJkX25hbWVdID0gcXR5CgogICAgcHJvZmlsZVsidG90YWxDYXJkcyJdID0gc3VtKHByb2ZpbGVbImNvbW1hbmRlcnMiXS52YWx1ZXMoKSkgKyBzdW0ocHJvZmlsZVsibWFpbmJvYXJkIl0udmFsdWVzKCkpCiAgICBpZiBub3QgcHJvZmlsZVsibmFtZSJdIG9yIHByb2ZpbGVbIm5hbWUiXSA9PSBmIkFyY2hpZGVrdCB7ZGVja19pZH0iOgogICAgICAgIHByb2ZpbGVbIm5hbWUiXSA9IGYie3Byb2ZpbGVbJ2NvbW1hbmRlciddfSDigJQgQXJjaGlkZWt0IgoKICAgIHJldHVybiBwcm9maWxlCgoKZGVmIF9mZXRjaF9lZGhyZWNfYXZlcmFnZShjb21tYW5kZXJfbmFtZTogc3RyKSAtPiBkaWN0OgogICAgIiIiRmV0Y2ggRURIUkVDIGF2ZXJhZ2UgZGVjayBmb3IgYSBjb21tYW5kZXIuIiIiCiAgICBzbHVnID0gX3RvX2VkaHJlY19zbHVnKGNvbW1hbmRlcl9uYW1lKQogICAgdXJsID0gZiJodHRwczovL2pzb24uZWRocmVjLmNvbS9wYWdlcy9hdmVyYWdlLWRlY2tzL3tzbHVnfS5qc29uIgogICAgZGF0YSA9IGpzb24ubG9hZHMoX2h0dHBfZ2V0KHVybCkpCgogICAgY29udGFpbmVyID0gZGF0YS5nZXQoImNvbnRhaW5lciIsIHt9KQogICAganNvbl9kaWN0ID0gY29udGFpbmVyLmdldCgianNvbl9kaWN0Iiwge30pCiAgICBjYXJkX2luZm8gPSBqc29uX2RpY3QuZ2V0KCJjYXJkIiwge30pCiAgICByZWFsX25hbWUgPSBjYXJkX2luZm8uZ2V0KCJuYW1lIiwgY29tbWFuZGVyX25hbWUudGl0bGUoKSkKCiAgICBwcm9maWxlID0gewogICAgICAgICJuYW1lIjogZiJ7cmVhbF9uYW1lfSDigJQgRURIUkVDIEF2ZXJhZ2UiLAogICAgICAgICJjb21tYW5kZXIiOiByZWFsX25hbWUsCiAgICAgICAgInNvdXJjZSI6ICJFREhSRUMgQXZlcmFnZSIsCiAgICAgICAgInNvdXJjZVVybCI6IGYiaHR0cHM6Ly9lZGhyZWMuY29tL2F2ZXJhZ2UtZGVja3Mve3NsdWd9IiwKICAgICAgICAiY29tbWFuZGVycyI6IHtyZWFsX25hbWU6IDF9LAogICAgICAgICJtYWluYm9hcmQiOiB7fSwKICAgICAgICAiY29sb3JJZGVudGl0eSI6IGNhcmRfaW5mby5nZXQoImNvbG9yX2lkZW50aXR5IiwgW10pLAogICAgICAgICJzYW1wbGVTaXplIjogZGF0YS5nZXQoIm51bV9kZWNrc19hdmciKSwKICAgICAgICAidG90YWxDYXJkcyI6IDAsCiAgICB9CgogICAgIyBQYXJzZSBjYXJkIGxpc3RzCiAgICBmb3IgY2wgaW4ganNvbl9kaWN0LmdldCgiY2FyZGxpc3RzIiwgW10pOgogICAgICAgIGZvciBjdiBpbiBjbC5nZXQoImNhcmR2aWV3cyIsIFtdKToKICAgICAgICAgICAgY2FyZF9uYW1lID0gY3YuZ2V0KCJuYW1lIiwgIiIpCiAgICAgICAgICAgIGlmIGNhcmRfbmFtZToKICAgICAgICAgICAgICAgIHByb2ZpbGVbIm1haW5ib2FyZCJdW2NhcmRfbmFtZV0gPSAxCgogICAgIyBGaXggYmFzaWMgbGFuZCBxdWFudGl0aWVzIGZyb20gYXJjaGlkZWt0IGV4cG9ydCBkYXRhCiAgICBhcmNoaWRla3RfZGF0YSA9IGRhdGEuZ2V0KCJhcmNoaWRla3QiLCBbXSkKICAgIGlmIGFyY2hpZGVrdF9kYXRhOgogICAgICAgIGJhc2ljX25hbWVzID0gW10KICAgICAgICBmb3IgY2wgaW4ganNvbl9kaWN0LmdldCgiY2FyZGxpc3RzIiwgW10pOgogICAgICAgICAgICBpZiBjbC5nZXQoInRhZyIpID09ICJiYXNpY3MiOgogICAgICAgICAgICAgICAgZm9yIGN2IGluIGNsLmdldCgiY2FyZHZpZXdzIiwgW10pOgogICAgICAgICAgICAgICAgICAgIGJhc2ljX25hbWVzLmFwcGVuZChjdi5nZXQoIm5hbWUiLCAiIikpCgogICAgICAgICMgRmluZCBoaWdoLXF1YW50aXR5IGVudHJpZXMgKGJhc2ljcykKICAgICAgICBiYXNpY19xdWFudGl0aWVzID0gW10KICAgICAgICBmb3IgZW50cnkgaW4gYXJjaGlkZWt0X2RhdGE6CiAgICAgICAgICAgIGlmIGVudHJ5LmdldCgicSIsIDEpID4gMToKICAgICAgICAgICAgICAgIGJhc2ljX3F1YW50aXRpZXMuYXBwZW5kKGVudHJ5WyJxIl0pCgogICAgICAgIGZvciBpLCBuYW1lIGluIGVudW1lcmF0ZShiYXNpY19uYW1lcyk6CiAgICAgICAgICAgIGlmIGkgPCBsZW4oYmFzaWNfcXVhbnRpdGllcyk6CiAgICAgICAgICAgICAgICBwcm9maWxlWyJtYWluYm9hcmQiXVtuYW1lXSA9IGJhc2ljX3F1YW50aXRpZXNbaV0KCiAgICBwcm9maWxlWyJ0b3RhbENhcmRzIl0gPSBzdW0ocHJvZmlsZVsiY29tbWFuZGVycyJdLnZhbHVlcygpKSArIHN1bShwcm9maWxlWyJtYWluYm9hcmQiXS52YWx1ZXMoKSkKICAgIHJldHVybiBwcm9maWxlCgoKZGVmIF9wYXJzZV90ZXh0X2RlY2tsaXN0KHRleHQ6IHN0ciwgY29tbWFuZGVyX292ZXJyaWRlOiBzdHIgPSBOb25lKSAtPiBkaWN0OgogICAgIiIiUGFyc2UgYSBwbGFpbiB0ZXh0IGNhcmQgbGlzdCBpbnRvIGEgcHJvZmlsZS4iIiIKICAgIHByb2ZpbGUgPSB7CiAgICAgICAgIm5hbWUiOiAiVGV4dCBJbXBvcnQiLAogICAgICAgICJjb21tYW5kZXIiOiBOb25lLAogICAgICAgICJzb3VyY2UiOiAiVGV4dCBJbXBvcnQiLAogICAgICAgICJzb3VyY2VVcmwiOiBOb25lLAogICAgICAgICJjb21tYW5kZXJzIjoge30sCiAgICAgICAgIm1haW5ib2FyZCI6IHt9LAogICAgICAgICJ0b3RhbENhcmRzIjogMCwKICAgIH0KCiAgICBzZWN0aW9uID0gIm1haW4iCiAgICBmb3IgbGluZSBpbiB0ZXh0LnN0cmlwKCkuc3BsaXQoIlxuIik6CiAgICAgICAgbGluZSA9IGxpbmUuc3RyaXAoKQogICAgICAgIGlmIG5vdCBsaW5lIG9yIGxpbmUuc3RhcnRzd2l0aCgiLy8iKSBvciBsaW5lLnN0YXJ0c3dpdGgoIiMiKToKICAgICAgICAgICAgY29udGludWUKCiAgICAgICAgaWYgbGluZS5sb3dlcigpLnN0YXJ0c3dpdGgoImNvbW1hbmRlciIpIG9yIGxpbmUgPT0gIltDb21tYW5kZXJdIjoKICAgICAgICAgICAgc2VjdGlvbiA9ICJjb21tYW5kZXIiCiAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgaWYgbGluZS5sb3dlcigpLnN0YXJ0c3dpdGgoIm1haW4iKSBvciBsaW5lLmxvd2VyKCkuc3RhcnRzd2l0aCgiZGVjayIpIG9yIGxpbmUgPT0gIltNYWluXSI6CiAgICAgICAgICAgIHNlY3Rpb24gPSAibWFpbiIKICAgICAgICAgICAgY29udGludWUKICAgICAgICBpZiBsaW5lLmxvd2VyKCkuc3RhcnRzd2l0aCgic2lkZWJvYXJkIikgb3IgbGluZSA9PSAiW1NpZGVib2FyZF0iOgogICAgICAgICAgICBzZWN0aW9uID0gInNpZGVib2FyZCIKICAgICAgICAgICAgY29udGludWUKCiAgICAgICAgIyBDbGVhbiBsaW5lCiAgICAgICAgY2xlYW4gPSByZS5zdWIociJcKFx3K1wpXHMqXGQqJCIsICIiLCBsaW5lKS5zdHJpcCgpCiAgICAgICAgY2xlYW4gPSByZS5zdWIociJccypcKi4qJCIsICIiLCBjbGVhbikuc3RyaXAoKQoKICAgICAgICBtID0gcmUubWF0Y2gociJeKFxkKyl4P1xzKyguKykkIiwgY2xlYW4pCiAgICAgICAgaWYgbToKICAgICAgICAgICAgcXR5ID0gaW50KG0uZ3JvdXAoMSkpCiAgICAgICAgICAgIGNhcmRfbmFtZSA9IG0uZ3JvdXAoMikuc3RyaXAoKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHF0eSA9IDEKICAgICAgICAgICAgY2FyZF9uYW1lID0gY2xlYW4KCiAgICAgICAgaWYgbm90IGNhcmRfbmFtZToKICAgICAgICAgICAgY29udGludWUKCiAgICAgICAgaWYgc2VjdGlvbiA9PSAiY29tbWFuZGVyIjoKICAgICAgICAgICAgcHJvZmlsZVsiY29tbWFuZGVycyJdW2NhcmRfbmFtZV0gPSBxdHkKICAgICAgICAgICAgaWYgbm90IHByb2ZpbGVbImNvbW1hbmRlciJdOgogICAgICAgICAgICAgICAgcHJvZmlsZVsiY29tbWFuZGVyIl0gPSBjYXJkX25hbWUKICAgICAgICBlbGlmIHNlY3Rpb24gIT0gInNpZGVib2FyZCI6CiAgICAgICAgICAgIHByb2ZpbGVbIm1haW5ib2FyZCJdW2NhcmRfbmFtZV0gPSBxdHkKCiAgICBpZiBjb21tYW5kZXJfb3ZlcnJpZGU6CiAgICAgICAgcHJvZmlsZVsiY29tbWFuZGVyIl0gPSBjb21tYW5kZXJfb3ZlcnJpZGUKICAgICAgICBpZiBub3QgcHJvZmlsZVsiY29tbWFuZGVycyJdOgogICAgICAgICAgICBpZiBjb21tYW5kZXJfb3ZlcnJpZGUgaW4gcHJvZmlsZVsibWFpbmJvYXJkIl06CiAgICAgICAgICAgICAgICBxdHkgPSBwcm9maWxlWyJtYWluYm9hcmQiXS5wb3AoY29tbWFuZGVyX292ZXJyaWRlKQogICAgICAgICAgICAgICAgcHJvZmlsZVsiY29tbWFuZGVycyJdW2NvbW1hbmRlcl9vdmVycmlkZV0gPSBxdHkKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIHByb2ZpbGVbImNvbW1hbmRlcnMiXVtjb21tYW5kZXJfb3ZlcnJpZGVdID0gMQoKICAgIGlmIHByb2ZpbGVbImNvbW1hbmRlciJdOgogICAgICAgIHByb2ZpbGVbIm5hbWUiXSA9IGYie3Byb2ZpbGVbJ2NvbW1hbmRlciddfSDigJQgVGV4dCBJbXBvcnQiCgogICAgcHJvZmlsZVsidG90YWxDYXJkcyJdID0gc3VtKHByb2ZpbGVbImNvbW1hbmRlcnMiXS52YWx1ZXMoKSkgKyBzdW0ocHJvZmlsZVsibWFpbmJvYXJkIl0udmFsdWVzKCkpCiAgICByZXR1cm4gcHJvZmlsZQoKCmRlZiBfc2F2ZV9wcm9maWxlX3RvX2Rjayhwcm9maWxlOiBkaWN0KSAtPiBQYXRoOgogICAgIiIiQ29udmVydCBhIHByb2ZpbGUgZGljdCB0byAuZGNrIGFuZCBzYXZlIHRvIEZvcmdlIGRlY2tzIGRpci4iIiIKICAgIGxpbmVzID0gWyJbbWV0YWRhdGFdIl0KICAgIGxpbmVzLmFwcGVuZChmIk5hbWU9e3Byb2ZpbGUuZ2V0KCduYW1lJywgJ0ltcG9ydGVkIERlY2snKX0iKQogICAgbGluZXMuYXBwZW5kKCIiKQogICAgbGluZXMuYXBwZW5kKCJbQ29tbWFuZGVyXSIpCiAgICBmb3IgbmFtZSwgcXR5IGluIHByb2ZpbGUuZ2V0KCJjb21tYW5kZXJzIiwge30pLml0ZW1zKCk6CiAgICAgICAgbGluZXMuYXBwZW5kKGYie3F0eX0ge25hbWV9IikKICAgIGxpbmVzLmFwcGVuZCgiIikKICAgIGxpbmVzLmFwcGVuZCgiW01haW5dIikKICAgIGZvciBuYW1lLCBxdHkgaW4gcHJvZmlsZS5nZXQoIm1haW5ib2FyZCIsIHt9KS5pdGVtcygpOgogICAgICAgIGxpbmVzLmFwcGVuZChmIntxdHl9IHtuYW1lfSIpCgogICAgY29udGVudCA9ICJcbiIuam9pbihsaW5lcykKCiAgICAjIFNhdmUgdG8gRm9yZ2UgZGVja3MgZGlyCiAgICBzYWZlX25hbWUgPSByZS5zdWIociJbXmEtekEtWjAtOSBfLV0iLCAiIiwgcHJvZmlsZS5nZXQoIm5hbWUiLCAiaW1wb3J0ZWQiKSkucmVwbGFjZSgiICIsICJfIikuc3RyaXAoKQogICAgaWYgbm90IHNhZmVfbmFtZToKICAgICAgICBzYWZlX25hbWUgPSAiaW1wb3J0ZWRfZGVjayIKCiAgICBzYXZlX2RpciA9IENGRy5mb3JnZV9kZWNrc19kaXIKICAgIGlmIG5vdCBzYXZlX2RpciBvciBub3Qgb3MucGF0aC5pc2RpcihzYXZlX2Rpcik6CiAgICAgICAgc2F2ZV9kaXIgPSBvcy5wYXRoLmpvaW4ob3MucGF0aC5kaXJuYW1lKF9fZmlsZV9fKSwgImltcG9ydGVkLWRlY2tzIikKICAgICAgICBvcy5tYWtlZGlycyhzYXZlX2RpciwgZXhpc3Rfb2s9VHJ1ZSkKCiAgICBvdXRfcGF0aCA9IFBhdGgoc2F2ZV9kaXIpIC8gZiJ7c2FmZV9uYW1lfS5kY2siCiAgICBvdXRfcGF0aC53cml0ZV90ZXh0KGNvbnRlbnQsIGVuY29kaW5nPSJ1dGYtOCIpCiAgICBsb2dfY29sbGVjdC5pbmZvKGYiICBTYXZlZCAuZGNrOiB7b3V0X3BhdGh9IikKICAgIHJldHVybiBvdXRfcGF0aAoKCmRlZiBfdG9fZWRocmVjX3NsdWcobmFtZTogc3RyKSAtPiBzdHI6CiAgICBzbHVnID0gbmFtZS5sb3dlcigpCiAgICBzbHVnID0gcmUuc3ViKHIiWycsLl0iLCAiIiwgc2x1ZykKICAgIHNsdWcgPSByZS5zdWIociJbXmEtejAtOV0rIiwgIi0iLCBzbHVnKQogICAgc2x1ZyA9IHNsdWcuc3RyaXAoIi0iKQogICAgcmV0dXJuIHNsdWcKCgojIOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkAojIEJhY2tncm91bmQgVGFzayDigJQgUnVuIHRoZSBKYXZhIENMSSBzdWJwcm9jZXNzCiMg4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQCgphc3luYyBkZWYgcnVuX2JhdGNoX3N1YnByb2Nlc3MoCiAgICBzdGF0ZTogQmF0Y2hTdGF0ZSwKICAgIGRlY2tzOiBsaXN0W3N0cl0sCiAgICBudW1fZ2FtZXM6IGludCwKICAgIHRocmVhZHM6IGludCwKICAgIHNlZWQ6IE9wdGlvbmFsW2ludF0sCiAgICBjbG9jazogaW50LAogICAgb3V0cHV0X3BhdGg6IHN0ciwKICAgIHVzZV9sZWFybmVkX3BvbGljeTogYm9vbCA9IEZhbHNlLAogICAgcG9saWN5X3N0eWxlOiBzdHIgPSAibWlkcmFuZ2UiLAogICAgcG9saWN5X2dyZWVkeTogYm9vbCA9IEZhbHNlLAogICAgYWlfc2ltcGxpZmllZDogYm9vbCA9IEZhbHNlLAogICAgYWlfdGhpbmtfdGltZV9tczogaW50ID0gLTEsCiAgICBtYXhfcXVldWVfZGVwdGg6IGludCA9IC0xLAopOgogICAgdHJ5OgogICAgICAgICMgQ29tcHV0ZSBwb2xpY3kgc2VydmVyIFVSTCBmcm9tIG91ciBvd24gcG9ydAogICAgICAgIHBvbGljeV9zZXJ2ZXIgPSBmImh0dHA6Ly9sb2NhbGhvc3Q6e0NGRy5wb3J0fSIKICAgICAgICBjbWQgPSBidWlsZF9qYXZhX2NvbW1hbmQoCiAgICAgICAgICAgIGRlY2tzLCBudW1fZ2FtZXMsIHRocmVhZHMsIHNlZWQsIGNsb2NrLCBvdXRwdXRfcGF0aCwKICAgICAgICAgICAgdXNlX2xlYXJuZWRfcG9saWN5PXVzZV9sZWFybmVkX3BvbGljeSwKICAgICAgICAgICAgcG9saWN5X3NlcnZlcj1wb2xpY3lfc2VydmVyLAogICAgICAgICAgICBwb2xpY3lfc3R5bGU9cG9saWN5X3N0eWxlLAogICAgICAgICAgICBwb2xpY3lfZ3JlZWR5PXBvbGljeV9ncmVlZHksCiAgICAgICAgICAgIGFpX3NpbXBsaWZpZWQ9YWlfc2ltcGxpZmllZCwKICAgICAgICAgICAgYWlfdGhpbmtfdGltZV9tcz1haV90aGlua190aW1lX21zLAogICAgICAgICAgICBtYXhfcXVldWVfZGVwdGg9bWF4X3F1ZXVlX2RlcHRoLAogICAgICAgICkKICAgICAgICBsb2dfYmF0Y2guaW5mbyhmIlN0YXJ0aW5nIGJhdGNoIHtzdGF0ZS5iYXRjaF9pZH06IHsnICcuam9pbihjbWRbOjZdKX0uLi4iKQogICAgICAgIGxvb3AgPSBhc3luY2lvLmdldF9ldmVudF9sb29wKCkKICAgICAgICBhd2FpdCBsb29wLnJ1bl9pbl9leGVjdXRvcigKICAgICAgICAgICAgTm9uZSwKICAgICAgICAgICAgbGFtYmRhOiBfcnVuX3Byb2Nlc3NfYmxvY2tpbmcoc3RhdGUsIGNtZCksCiAgICAgICAgKQogICAgZXhjZXB0IEV4Y2VwdGlvbiBhcyBlOgogICAgICAgIHN0YXRlLmVycm9yID0gc3RyKGUpCiAgICAgICAgc3RhdGUucnVubmluZyA9IEZhbHNlCiAgICAgICAgbG9nX2JhdGNoLmVycm9yKGYiQmF0Y2gge3N0YXRlLmJhdGNoX2lkfSBFUlJPUjoge2V9IikKCgpkZWYgX3J1bl9wcm9jZXNzX2Jsb2NraW5nKHN0YXRlOiBCYXRjaFN0YXRlLCBjbWQ6IGxpc3Rbc3RyXSk6CiAgICAjIFdyaXRlIGRlYnVnIGxvZyBmcm9tIFB5dGhvbiBzaWRlIChkb2Vzbid0IGRlcGVuZCBvbiBKYXZhIHJlYnVpbGQpCiAgICBkZWJ1Z19sb2dfcGF0aCA9IFBhdGgoQ0ZHLmZvcmdlX2RpcikucGFyZW50IC8gImZvcmdlLXNpbS1kZWJ1Zy5sb2ciIGlmIENGRy5mb3JnZV9kaXIgZWxzZSBQYXRoKCJmb3JnZS1zaW0tZGVidWcubG9nIikKICAgIHRyeToKICAgICAgICB3aXRoIG9wZW4oZGVidWdfbG9nX3BhdGgsICJhIiwgZW5jb2Rpbmc9InV0Zi04IikgYXMgZGJnOgogICAgICAgICAgICBkYmcud3JpdGUoZiJcbnsnPScqNjB9XG4iKQogICAgICAgICAgICBkYmcud3JpdGUoZiJCYXRjaCB7c3RhdGUuYmF0Y2hfaWR9IEAge2RhdGV0aW1lLm5vdygpLmlzb2Zvcm1hdCgpfVxuIikKICAgICAgICAgICAgZGJnLndyaXRlKGYiQ29tbWFuZDogeycgJy5qb2luKGNtZCl9XG4iKQogICAgICAgICAgICBkYmcud3JpdGUoZiJMYWIgSkFSOiB7Q0ZHLmxhYl9qYXJ9XG4iKQogICAgICAgICAgICBkYmcud3JpdGUoZiJGb3JnZSBKQVI6IHtDRkcuZm9yZ2VfamFyfVxuIikKICAgICAgICAgICAgZGJnLndyaXRlKGYiRm9yZ2UgRGlyOiB7Q0ZHLmZvcmdlX2Rpcn1cbiIpCiAgICAgICAgICAgIGRiZy53cml0ZShmIkxhYiBKQVIgZXhpc3RzOiB7b3MucGF0aC5leGlzdHMoQ0ZHLmxhYl9qYXIpfVxuIikKICAgICAgICAgICAgZGJnLndyaXRlKGYiRm9yZ2UgSkFSIGV4aXN0czoge29zLnBhdGguZXhpc3RzKENGRy5mb3JnZV9qYXIpfVxuIikKICAgICAgICAgICAgZGJnLndyaXRlKGYiRm9yZ2UgRGlyIGV4aXN0czoge29zLnBhdGguaXNkaXIoQ0ZHLmZvcmdlX2Rpcil9XG4iKQogICAgICAgICAgICBkYmcud3JpdGUoZiJ7Jy0nKjYwfVxuIikKICAgICAgICBsb2dfYmF0Y2gud2FybmluZyhmIkRlYnVnIGxvZzoge2RlYnVnX2xvZ19wYXRofSIpCiAgICBleGNlcHQgRXhjZXB0aW9uIGFzIGU6CiAgICAgICAgbG9nX2JhdGNoLndhcm5pbmcoZiJDb3VsZCBub3Qgd3JpdGUgZGVidWcgbG9nIGhlYWRlcjoge2V9IikKCiAgICAjIEVuc3VyZSBGb3JnZSBzdWJwcm9jZXNzZXMgdXNlIEphdmEgMTcgKEZvcmdlIGNyYXNoZXMgb24gSmF2YSAyNSspCiAgICBlbnYgPSBvcy5lbnZpcm9uLmNvcHkoKQogICAgamF2YTE3ID0gZ2V0X2phdmExNygpCiAgICBpZiBqYXZhMTcgIT0gJ2phdmEnOgogICAgICAgIGphdmExN19iaW4gPSBvcy5wYXRoLmRpcm5hbWUoamF2YTE3KQogICAgICAgIGphdmExN19ob21lID0gb3MucGF0aC5kaXJuYW1lKGphdmExN19iaW4pCiAgICAgICAgZW52WydKQVZBX0hPTUUnXSA9IGphdmExN19ob21lCiAgICAgICAgZW52WydQQVRIJ10gPSBqYXZhMTdfYmluICsgb3MucGF0aHNlcCArIGVudi5nZXQoJ1BBVEgnLCAnJykKICAgICAgICBsb2dfYmF0Y2guaW5mbyhmJ1VzaW5nIEphdmEgMTc6IHtqYXZhMTd9JykKCiAgICAjIE5PVEU6IERvIE5PVCBzZXQgX0pBVkFfT1BUSU9OUz0tRGphdmEuYXd0LmhlYWRsZXNzPXRydWUgaGVyZS4KICAgICMgRm9yZ2Ugc2ltIG1vZGUgbmVlZHMgQVdUIGNsYXNzZXMgZm9yIGNhcmQgZGF0YSBpbml0aWFsaXphdGlvbjsKICAgICMgaGVhZGxlc3M9dHJ1ZSBjYXVzZXMgc2lsZW50IGV4aXQgY29kZSAxIGNyYXNoLgoKICAgICMgUGVyLWdhbWUgdGltZW91dDogY2xvY2sgKyAxODBzIGJ1ZmZlciBmb3IgY2FyZCBEQiBpbml0CiAgICBwZXJfZ2FtZV90aW1lb3V0ID0gc3RhdGUudG90YWxfZ2FtZXMgKiAyNDAgKyAzMDAgICMgZ2VuZXJvdXM6IDRtaW4vZ2FtZSArIDVtaW4gc3RhcnR1cAoKICAgIHRyeToKICAgICAgICBwcm9jID0gc3VicHJvY2Vzcy5Qb3BlbigKICAgICAgICAgICAgY21kLAogICAgICAgICAgICBzdGRvdXQ9c3VicHJvY2Vzcy5QSVBFLAogICAgICAgICAgICBzdGRlcnI9c3VicHJvY2Vzcy5TVERPVVQsCiAgICAgICAgICAgIHRleHQ9VHJ1ZSwKICAgICAgICAgICAgY3dkPU5vbmUsCiAgICAgICAgICAgIGJ1ZnNpemU9MSwKICAgICAgICAgICAgZW52PWVudiwKICAgICAgICApCiAgICAgICAgc3RhdGUucHJvY2VzcyA9IHByb2MKCiAgICAgICAgIyBQeXRob24tc2lkZSB3YXRjaGRvZzoga2lsbCBpZiBubyBwcm9ncmVzcyBmb3IgdG9vIGxvbmcKICAgICAgICBpbXBvcnQgdGhyZWFkaW5nCiAgICAgICAgbGFzdF9hY3Rpdml0eSA9IFt0aW1lLnRpbWUoKV0KICAgICAgICBzdGFsbF9saW1pdCA9IDMwMCAgIyA1IG1pbnV0ZXMgd2l0aCBubyBvdXRwdXQgPSBzdGFsbGVkCgogICAgICAgIGRlZiBfd2F0Y2hkb2coKToKICAgICAgICAgICAgd2hpbGUgcHJvYy5wb2xsKCkgaXMgTm9uZToKICAgICAgICAgICAgICAgIHRpbWUuc2xlZXAoMzApCiAgICAgICAgICAgICAgICBlbGFwc2VkX3NpbmNlX2FjdGl2aXR5ID0gdGltZS50aW1lKCkgLSBsYXN0X2FjdGl2aXR5WzBdCiAgICAgICAgICAgICAgICBpZiBlbGFwc2VkX3NpbmNlX2FjdGl2aXR5ID4gc3RhbGxfbGltaXQ6CiAgICAgICAgICAgICAgICAgICAgbG9nX2JhdGNoLndhcm5pbmcoZidXQVRDSERPRzogTm8gb3V0cHV0IGZvciB7aW50KGVsYXBzZWRfc2luY2VfYWN0aXZpdHkpfXMuIEtpbGxpbmcgcHJvY2Vzcy4nKQogICAgICAgICAgICAgICAgICAgIHN0YXRlLmxvZ19saW5lcy5hcHBlbmQoZidbV0FUQ0hET0ddIFByb2Nlc3Mgc3RhbGxlZCAoe2ludChlbGFwc2VkX3NpbmNlX2FjdGl2aXR5KX1zIHdpdGggbm8gb3V0cHV0KS4gS2lsbGVkLicpCiAgICAgICAgICAgICAgICAgICAgcHJvYy5raWxsKCkKICAgICAgICAgICAgICAgICAgICByZXR1cm4KCiAgICAgICAgd2RfdGhyZWFkID0gdGhyZWFkaW5nLlRocmVhZCh0YXJnZXQ9X3dhdGNoZG9nLCBkYWVtb249VHJ1ZSkKICAgICAgICB3ZF90aHJlYWQuc3RhcnQoKQoKICAgICAgICBnYW1lX2NvdW50ID0gMAogICAgICAgIGFsbF9vdXRwdXRfbGluZXMgPSBbXQogICAgICAgIGZvciBsaW5lIGluIHByb2Muc3Rkb3V0OgogICAgICAgICAgICBsaW5lID0gbGluZS5yc3RyaXAoKQogICAgICAgICAgICBsYXN0X2FjdGl2aXR5WzBdID0gdGltZS50aW1lKCkKICAgICAgICAgICAgc3RhdGUubG9nX2xpbmVzLmFwcGVuZChsaW5lKQogICAgICAgICAgICBhbGxfb3V0cHV0X2xpbmVzLmFwcGVuZChsaW5lKQoKICAgICAgICAgICAgaWYgbGluZS5zdGFydHN3aXRoKCJbR2FtZSAiKToKICAgICAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgICAgICBwYXJ0cyA9IGxpbmUuc3BsaXQoIl0iKVswXQogICAgICAgICAgICAgICAgICAgIG51bXMgPSBwYXJ0cy5yZXBsYWNlKCJbR2FtZSAiLCAiIikuc3BsaXQoIi8iKQogICAgICAgICAgICAgICAgICAgIGN1cnJlbnQgPSBpbnQobnVtc1swXSkKICAgICAgICAgICAgICAgICAgICBnYW1lX2NvdW50ID0gY3VycmVudAogICAgICAgICAgICAgICAgICAgIHN0YXRlLmNvbXBsZXRlZF9nYW1lcyA9IGN1cnJlbnQKICAgICAgICAgICAgICAgIGV4Y2VwdCAoVmFsdWVFcnJvciwgSW5kZXhFcnJvcik6CiAgICAgICAgICAgICAgICAgICAgcGFzcwoKICAgICAgICAgICAgIyB2MjQgKElzc3VlICM1KTogUGFyc2UgcmVhbC10aW1lIHNpbXMvc2VjIGZyb20gSmF2YSBvdXRwdXQKICAgICAgICAgICAgaWYgJ1tQUk9HUkVTU10nIGluIGxpbmUgb3IgJ1tCQVRDSF0nIGluIGxpbmU6CiAgICAgICAgICAgICAgICBpbXBvcnQgcmUKICAgICAgICAgICAgICAgIHNwc19tYXRjaCA9IHJlLnNlYXJjaChyJyhbXGQuXSspXHMrc2ltcy9zZWMnLCBsaW5lKQogICAgICAgICAgICAgICAgaWYgc3BzX21hdGNoOgogICAgICAgICAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUuc2ltc19wZXJfc2VjID0gZmxvYXQoc3BzX21hdGNoLmdyb3VwKDEpKQogICAgICAgICAgICAgICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgogICAgICAgICAgICAgICAgICAgICAgICBwYXNzCgogICAgICAgICAgICBsb2dfYmF0Y2guaW5mbyhmIiAgW3tzdGF0ZS5iYXRjaF9pZH1dIHtsaW5lfSIpCgogICAgICAgIHByb2Mud2FpdCgpCgogICAgICAgIGVsYXBzZWQgPSBpbnQoKGRhdGV0aW1lLm5vdygpIC0gc3RhdGUuc3RhcnRfdGltZSkudG90YWxfc2Vjb25kcygpICogMTAwMCkKICAgICAgICBzdGF0ZS5lbGFwc2VkX21zID0gZWxhcHNlZAogICAgICAgIHN0YXRlLnJ1bm5pbmcgPSBGYWxzZQoKICAgICAgICAjIFdyaXRlIGFsbCBjYXB0dXJlZCBvdXRwdXQgdG8gZGVidWcgbG9nCiAgICAgICAgdHJ5OgogICAgICAgICAgICB3aXRoIG9wZW4oZGVidWdfbG9nX3BhdGgsICJhIiwgZW5jb2Rpbmc9InV0Zi04IikgYXMgZGJnOgogICAgICAgICAgICAgICAgZGJnLndyaXRlKGYiRXhpdCBjb2RlOiB7cHJvYy5yZXR1cm5jb2RlfVxuIikKICAgICAgICAgICAgICAgIGRiZy53cml0ZShmIlRvdGFsIGxpbmVzOiB7bGVuKGFsbF9vdXRwdXRfbGluZXMpfVxuIikKICAgICAgICAgICAgICAgIGRiZy53cml0ZShmIkVsYXBzZWQ6IHtlbGFwc2VkfW1zXG4iKQogICAgICAgICAgICAgICAgZGJnLndyaXRlKGYiLS0gRlVMTCBTVUJQUk9DRVNTIE9VVFBVVCAtLVxuIikKICAgICAgICAgICAgICAgIGlmIGFsbF9vdXRwdXRfbGluZXM6CiAgICAgICAgICAgICAgICAgICAgZm9yIG9sIGluIGFsbF9vdXRwdXRfbGluZXM6CiAgICAgICAgICAgICAgICAgICAgICAgIGRiZy53cml0ZShvbCArICJcbiIpCiAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgIGRiZy53cml0ZSgiPDwgTk8gT1VUUFVUID4+XG4iKQogICAgICAgICAgICAgICAgZGJnLndyaXRlKGYiLS0gRU5EIE9VVFBVVCAtLVxuXG4iKQogICAgICAgIGV4Y2VwdCBFeGNlcHRpb24gYXMgZToKICAgICAgICAgICAgbG9nX2JhdGNoLndhcm5pbmcoZiJDb3VsZCBub3Qgd3JpdGUgZGVidWcgbG9nIG91dHB1dDoge2V9IikKCiAgICAgICAgaWYgcHJvYy5yZXR1cm5jb2RlICE9IDA6CiAgICAgICAgICAgIGlmIHByb2MucmV0dXJuY29kZSA9PSAtOSBvciBwcm9jLnJldHVybmNvZGUgPT0gMTM3OgogICAgICAgICAgICAgICAgc3RhdGUuZXJyb3IgPSAnRm9yZ2UgcHJvY2VzcyBraWxsZWQgYnkgd2F0Y2hkb2cgKHN0YWxsZWQgd2l0aCBubyBvdXRwdXQpLiBDaGVjayBmb3JnZS1zaW0tZGVidWcubG9nIGZvciBkZXRhaWxzLicKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIHN0YXRlLmVycm9yID0gZidKYXZhIHByb2Nlc3MgZXhpdGVkIHdpdGggY29kZSB7cHJvYy5yZXR1cm5jb2RlfS4gQ2hlY2sgZm9yZ2Utc2ltLWRlYnVnLmxvZyBmb3IgZGV0YWlscy4nCiAgICAgICAgZWxzZToKICAgICAgICAgICAgc3RhdGUuY29tcGxldGVkX2dhbWVzID0gc3RhdGUudG90YWxfZ2FtZXMKICAgICAgICAgICAgbG9nX2JhdGNoLmluZm8oZiJCYXRjaCB7c3RhdGUuYmF0Y2hfaWR9IGNvbXBsZXRlZCBpbiB7ZWxhcHNlZH1tcyIpCgogICAgICAgICAgICAjIEF1dG8tZ2VuZXJhdGUgZGVjayByZXBvcnRzIGZvciB0aGUgY29hY2gKICAgICAgICAgICAgaWYgc3RhdGUucmVzdWx0X3BhdGggYW5kIG9zLnBhdGguZXhpc3RzKHN0YXRlLnJlc3VsdF9wYXRoKToKICAgICAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgICAgICBmcm9tIGNvYWNoLnJlcG9ydF9nZW5lcmF0b3IgaW1wb3J0IGdlbmVyYXRlX3NpbmdsZV9kZWNrX3JlcG9ydAogICAgICAgICAgICAgICAgICAgIGxhYl9yb290ID0gUGF0aChfX2ZpbGVfXykucGFyZW50CiAgICAgICAgICAgICAgICAgICAgcmVwb3J0c19kaXIgPSBzdHIobGFiX3Jvb3QgLyAiZGVjay1yZXBvcnRzIikKICAgICAgICAgICAgICAgICAgICB1cGRhdGVkID0gZ2VuZXJhdGVfc2luZ2xlX2RlY2tfcmVwb3J0KHN0YXRlLnJlc3VsdF9wYXRoLCByZXBvcnRzX2RpcikKICAgICAgICAgICAgICAgICAgICBpZiB1cGRhdGVkOgogICAgICAgICAgICAgICAgICAgICAgICBsb2dfYmF0Y2guaW5mbyhmIkRlY2sgcmVwb3J0cyB1cGRhdGVkOiB7JywgJy5qb2luKHVwZGF0ZWQpfSIpCiAgICAgICAgICAgICAgICBleGNlcHQgRXhjZXB0aW9uIGFzIHJwdF9lcnI6CiAgICAgICAgICAgICAgICAgICAgbG9nX2JhdGNoLmluZm8oZiJEZWNrIHJlcG9ydCBnZW5lcmF0aW9uIGZhaWxlZCAobm9uLWZhdGFsKToge3JwdF9lcnJ9IikKCiAgICBleGNlcHQgRXhjZXB0aW9uIGFzIGU6CiAgICAgICAgc3RhdGUuZXJyb3IgPSBzdHIoZSkKICAgICAgICBzdGF0ZS5ydW5uaW5nID0gRmFsc2UKICAgICAgICB0cnk6CiAgICAgICAgICAgIHdpdGggb3BlbihkZWJ1Z19sb2dfcGF0aCwgImEiLCBlbmNvZGluZz0idXRmLTgiKSBhcyBkYmc6CiAgICAgICAgICAgICAgICBkYmcud3JpdGUoZiJFWENFUFRJT046IHtlfVxuIikKICAgICAgICBleGNlcHQgRXhjZXB0aW9uOgogICAgICAgICAgICBwYXNzCgoKIyDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZAKIyBEZWVwU2VlayBCYXRjaCBTaW0gKFB5dGhvbiBlbmdpbmUgKyBMTE0gb3Bwb25lbnQpCiMg4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQCgpkZWYgX2xvYWRfZGVja19jYXJkc19ieV9uYW1lKGRlY2tfbmFtZTogc3RyKSAtPiBsaXN0W2RpY3RdOgogICAgIiIiTG9hZCBjYXJkIGRhdGEgZm9yIGEgZGVjayBieSBuYW1lLiBDaGVja3MgREIgZmlyc3QsIHRoZW4gLmRjayBmaWxlcy4KICAgIEVhY2ggY2FyZCBkaWN0IGluY2x1ZGVzICdpc19jb21tYW5kZXInIGZsYWcgKDAgb3IgMSkgd2hlbiBhdmFpbGFibGUuIiIiCiAgICAjIDEuIFRyeSBkZWNrIGJ1aWxkZXIgREIKICAgIHRyeToKICAgICAgICBjb25uID0gX2dldF9kYl9jb25uKCkKICAgICAgICByb3cgPSBjb25uLmV4ZWN1dGUoCiAgICAgICAgICAgICJTRUxFQ1QgaWQsIGNvbW1hbmRlcl9uYW1lIEZST00gZGVja3MgV0hFUkUgbmFtZSA9ID8gQ09MTEFURSBOT0NBU0UiLCAoZGVja19uYW1lLCkKICAgICAgICApLmZldGNob25lKCkKICAgICAgICBpZiByb3c6CiAgICAgICAgICAgIGRlY2tfaWQgPSByb3dbImlkIl0KICAgICAgICAgICAgZGJfY29tbWFuZGVyX25hbWUgPSByb3dbImNvbW1hbmRlcl9uYW1lIl0gb3IgIiIKICAgICAgICAgICAgY2FyZHMgPSBjb25uLmV4ZWN1dGUoIiIiCiAgICAgICAgICAgICAgICBTRUxFQ1QgZGMuY2FyZF9uYW1lLCBkYy5xdWFudGl0eSwgZGMuaXNfY29tbWFuZGVyLAogICAgICAgICAgICAgICAgICAgICAgIGNlLnR5cGVfbGluZSwgY2UuY21jLCBjZS5wb3dlciwgY2UudG91Z2huZXNzLAogICAgICAgICAgICAgICAgICAgICAgIGNlLm9yYWNsZV90ZXh0LCBjZS5rZXl3b3JkcywgY2UubWFuYV9jb3N0LAogICAgICAgICAgICAgICAgICAgICAgIGNlLmNvbG9yX2lkZW50aXR5CiAgICAgICAgICAgICAgICBGUk9NIGRlY2tfY2FyZHMgZGMKICAgICAgICAgICAgICAgIExFRlQgSk9JTiAoCiAgICAgICAgICAgICAgICAgICAgU0VMRUNUIHNjcnlmYWxsX2lkLCB0eXBlX2xpbmUsIGNtYywgcG93ZXIsIHRvdWdobmVzcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JhY2xlX3RleHQsIGtleXdvcmRzLCBtYW5hX2Nvc3QsIGNvbG9yX2lkZW50aXR5CiAgICAgICAgICAgICAgICAgICAgRlJPTSBjb2xsZWN0aW9uX2VudHJpZXMgR1JPVVAgQlkgc2NyeWZhbGxfaWQKICAgICAgICAgICAgICAgICkgY2UgT04gY2Uuc2NyeWZhbGxfaWQgPSBkYy5zY3J5ZmFsbF9pZAogICAgICAgICAgICAgICAgV0hFUkUgZGMuZGVja19pZCA9ID8KICAgICAgICAgICAgIiIiLCAoZGVja19pZCwpKS5mZXRjaGFsbCgpCiAgICAgICAgICAgIHJlc3VsdCA9IFtdCiAgICAgICAgICAgIGZvciByIGluIGNhcmRzOgogICAgICAgICAgICAgICAgaXNfY21kciA9IHJbImlzX2NvbW1hbmRlciJdIG9yIDAKICAgICAgICAgICAgICAgICMgQWxzbyBkZXRlY3QgYnkgZGVjay1sZXZlbCBjb21tYW5kZXJfbmFtZSBtYXRjaAogICAgICAgICAgICAgICAgaWYgbm90IGlzX2NtZHIgYW5kIGRiX2NvbW1hbmRlcl9uYW1lIGFuZCByWyJjYXJkX25hbWUiXS5sb3dlcigpID09IGRiX2NvbW1hbmRlcl9uYW1lLmxvd2VyKCk6CiAgICAgICAgICAgICAgICAgICAgaXNfY21kciA9IDEKICAgICAgICAgICAgICAgIGZvciBfIGluIHJhbmdlKHJbInF1YW50aXR5Il0gb3IgMSk6CiAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmFwcGVuZCh7CiAgICAgICAgICAgICAgICAgICAgICAgICduYW1lJzogclsiY2FyZF9uYW1lIl0sCiAgICAgICAgICAgICAgICAgICAgICAgICd0eXBlX2xpbmUnOiByWyJ0eXBlX2xpbmUiXSBvciAnJywKICAgICAgICAgICAgICAgICAgICAgICAgJ2NtYyc6IHJbImNtYyJdIG9yIDAsCiAgICAgICAgICAgICAgICAgICAgICAgICdwb3dlcic6IHJbInBvd2VyIl0gb3IgJycsCiAgICAgICAgICAgICAgICAgICAgICAgICd0b3VnaG5lc3MnOiByWyJ0b3VnaG5lc3MiXSBvciAnJywKICAgICAgICAgICAgICAgICAgICAgICAgJ29yYWNsZV90ZXh0Jzogclsib3JhY2xlX3RleHQiXSBvciAnJywKICAgICAgICAgICAgICAgICAgICAgICAgJ2tleXdvcmRzJzogclsia2V5d29yZHMiXSBvciAnJywKICAgICAgICAgICAgICAgICAgICAgICAgJ21hbmFfY29zdCc6IHJbIm1hbmFfY29zdCJdIG9yICcnLAogICAgICAgICAgICAgICAgICAgICAgICAnaXNfY29tbWFuZGVyJzogaXNfY21kciwKICAgICAgICAgICAgICAgICAgICAgICAgJ2NvbG9yX2lkZW50aXR5JzogclsiY29sb3JfaWRlbnRpdHkiXSBvciAnJywKICAgICAgICAgICAgICAgICAgICB9KQogICAgICAgICAgICBpZiByZXN1bHQ6CiAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0CiAgICBleGNlcHQgRXhjZXB0aW9uIGFzIGU6CiAgICAgICAgbG9nX3NpbS5lcnJvcihmIkRCIGxvb2t1cCBmYWlsZWQgZm9yICd7ZGVja19uYW1lfSc6IHtlfSIpCgogICAgIyAyLiBUcnkgLmRjayBmaWxlCiAgICBpZiBDRkcuZm9yZ2VfZGVja3NfZGlyIGFuZCBvcy5wYXRoLmlzZGlyKENGRy5mb3JnZV9kZWNrc19kaXIpOgogICAgICAgIGRja19wYXRoID0gUGF0aChDRkcuZm9yZ2VfZGVja3NfZGlyKSAvIGYie2RlY2tfbmFtZX0uZGNrIgogICAgICAgIGlmIGRja19wYXRoLmV4aXN0cygpOgogICAgICAgICAgICBjYXJkcyA9IFtdCiAgICAgICAgICAgIGN1cnJlbnRfc2VjdGlvbiA9IE5vbmUKICAgICAgICAgICAgd2l0aCBvcGVuKGRja19wYXRoLCAncicsIGVuY29kaW5nPSd1dGYtOCcpIGFzIGY6CiAgICAgICAgICAgICAgICBmb3IgbGluZSBpbiBmOgogICAgICAgICAgICAgICAgICAgIGxpbmUgPSBsaW5lLnN0cmlwKCkKICAgICAgICAgICAgICAgICAgICBsb3cgPSBsaW5lLmxvd2VyKCkKICAgICAgICAgICAgICAgICAgICBpZiBsb3cgPT0gJ1tjb21tYW5kZXJdJzoKICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudF9zZWN0aW9uID0gJ2NvbW1hbmRlcicKICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWUKICAgICAgICAgICAgICAgICAgICBlbGlmIGxvdyBpbiAoJ1ttYWluXScsICdbZGVja10nKToKICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudF9zZWN0aW9uID0gJ21haW4nCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgICAgICAgICAgICAgZWxpZiBsaW5lLnN0YXJ0c3dpdGgoJ1snKToKICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudF9zZWN0aW9uID0gTm9uZQogICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZQogICAgICAgICAgICAgICAgICAgIGlmIGN1cnJlbnRfc2VjdGlvbiBhbmQgbGluZToKICAgICAgICAgICAgICAgICAgICAgICAgcGFydHMgPSBsaW5lLnNwbGl0KCcgJywgMSkKICAgICAgICAgICAgICAgICAgICAgICAgaWYgbGVuKHBhcnRzKSA9PSAyOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF0eSA9IGludChwYXJ0c1swXSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lID0gcGFydHNbMV0uc3RyaXAoKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzX2NtZHIgPSAxIGlmIGN1cnJlbnRfc2VjdGlvbiA9PSAnY29tbWFuZGVyJyBlbHNlIDAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgXyBpbiByYW5nZShxdHkpOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXJkcy5hcHBlbmQoewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ25hbWUnOiBuYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3R5cGVfbGluZSc6ICcnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2NtYyc6IDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnaXNfY29tbWFuZGVyJzogaXNfY21kciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhc3MKICAgICAgICAgICAgaWYgY2FyZHM6CiAgICAgICAgICAgICAgICByZXR1cm4gY2FyZHMKCiAgICByZXR1cm4gW10KCgpkZWYgX3J1bl9kZWVwc2Vla19iYXRjaF90aHJlYWQoCiAgICBzdGF0ZTogQmF0Y2hTdGF0ZSwKICAgIGRlY2tfbmFtZXM6IGxpc3Rbc3RyXSwKICAgIG51bV9nYW1lczogaW50LAogICAgb3V0cHV0X3BhdGg6IHN0ciwKKToKICAgICIiIlJ1biBiYXRjaCBzaW11bGF0aW9uIHVzaW5nIFB5dGhvbiBzaW0gZW5naW5lICsgRGVlcFNlZWsgQUkgb3Bwb25lbnQuIiIiCiAgICB0cnk6CiAgICAgICAgaW1wb3J0IHN5cyBhcyBfcywgb3MgYXMgX28sIHRpbWUgYXMgX3QKICAgICAgICBzcmNfZGlyID0gX28ucGF0aC5qb2luKF9vLnBhdGguZGlybmFtZShfby5wYXRoLmFic3BhdGgoX19maWxlX18pKSwgJ3NyYycpCiAgICAgICAgaWYgc3JjX2RpciBub3QgaW4gX3MucGF0aDoKICAgICAgICAgICAgX3MucGF0aC5pbnNlcnQoMCwgc3JjX2RpcikKCiAgICAgICAgZnJvbSBjb21tYW5kZXJfYWlfbGFiLnNpbS5tb2RlbHMgaW1wb3J0IENhcmQKICAgICAgICBmcm9tIGNvbW1hbmRlcl9haV9sYWIuc2ltLmRlZXBzZWVrX2VuZ2luZSBpbXBvcnQgRGVlcFNlZWtHYW1lRW5naW5lCiAgICAgICAgZnJvbSBjb21tYW5kZXJfYWlfbGFiLnNpbS5ydWxlcyBpbXBvcnQgZW5yaWNoX2NhcmQKCiAgICAgICAgc3RhdGUubG9nX2xpbmVzLmFwcGVuZCgnW0RlZXBTZWVrIEJhdGNoXSBJbml0aWFsaXppbmcgRGVlcFNlZWsgYnJhaW4uLi4nKQogICAgICAgIGJyYWluID0gX2dldF9kZWVwc2Vla19icmFpbigpCiAgICAgICAgaWYgYnJhaW4gYW5kIG5vdCBicmFpbi5fY29ubmVjdGVkOgogICAgICAgICAgICBicmFpbi5jaGVja19jb25uZWN0aW9uKCkKICAgICAgICBpZiBub3QgYnJhaW4gb3Igbm90IGJyYWluLl9jb25uZWN0ZWQ6CiAgICAgICAgICAgIHN0YXRlLmVycm9yID0gJ0RlZXBTZWVrIExMTSBub3QgY29ubmVjdGVkLiBHbyB0byBTaW11bGF0b3IgPiBEZWVwU2VlayBhbmQgY29ubmVjdCBmaXJzdC4nCiAgICAgICAgICAgIHN0YXRlLnJ1bm5pbmcgPSBGYWxzZQogICAgICAgICAgICByZXR1cm4KCiAgICAgICAgc3RhdGUubG9nX2xpbmVzLmFwcGVuZChmJ1tEZWVwU2VlayBCYXRjaF0gQ29ubmVjdGVkIHRvIHticmFpbi5jb25maWcubW9kZWx9JykKCiAgICAgICAgIyBMb2FkIGFsbCBkZWNrcwogICAgICAgICMg4pSA4pSAIExvb2sgdXAgaGlzdG9yaWNhbCB3aW4gcmF0ZXMgZnJvbSBwYXN0IGJhdGNoIHJlc3VsdHMg4pSA4pSACiAgICAgICAgZGVja193aW5fcmF0ZXMgPSB7fSAgIyBkZWNrX25hbWUgLT4gZmxvYXQgKDAtMTAwKQogICAgICAgIHRyeToKICAgICAgICAgICAgcmVzdWx0c19kaXIgPSBDRkcucmVzdWx0c19kaXIKICAgICAgICAgICAgaWYgX28ucGF0aC5pc2RpcihyZXN1bHRzX2Rpcik6CiAgICAgICAgICAgICAgICBmb3IgZm5hbWUgaW4gc29ydGVkKF9vLmxpc3RkaXIocmVzdWx0c19kaXIpLCByZXZlcnNlPVRydWUpOgogICAgICAgICAgICAgICAgICAgIGlmIGZuYW1lLnN0YXJ0c3dpdGgoJ2JhdGNoLScpIGFuZCBmbmFtZS5lbmRzd2l0aCgnLmpzb24nKToKICAgICAgICAgICAgICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgICAgICAgICAgICAgd2l0aCBvcGVuKF9vLnBhdGguam9pbihyZXN1bHRzX2RpciwgZm5hbWUpLCAncicpIGFzIHJmOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhc3QgPSBqc29uLmxvYWRzKHJmLnJlYWQoKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciBkZCBpbiBwYXN0LmdldCgnZGVja3MnLCBbXSk6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG5hbWUgPSBkZC5nZXQoJ2RlY2tOYW1lJywgJycpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3IgPSBkZC5nZXQoJ3dpblJhdGUnKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIGRuYW1lIGFuZCB3ciBpcyBub3QgTm9uZSBhbmQgZG5hbWUgbm90IGluIGRlY2tfd2luX3JhdGVzOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWNrX3dpbl9yYXRlc1tkbmFtZV0gPSBmbG9hdCh3cikKICAgICAgICAgICAgICAgICAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbjoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhc3MKICAgICAgICBleGNlcHQgRXhjZXB0aW9uOgogICAgICAgICAgICBwYXNzCgogICAgICAgIGxvYWRlZF9kZWNrcyA9IHt9CiAgICAgICAgZGVja19tZXRhID0ge30gICMgZGVja19uYW1lIC0+IHtjb21tYW5kZXJfbmFtZSwgY29sb3JfaWRlbnRpdHksIGFyY2hldHlwZX0KICAgICAgICBmb3IgZG4gaW4gZGVja19uYW1lczoKICAgICAgICAgICAgcmF3X2NhcmRzID0gX2xvYWRfZGVja19jYXJkc19ieV9uYW1lKGRuKQogICAgICAgICAgICBpZiBub3QgcmF3X2NhcmRzOgogICAgICAgICAgICAgICAgc3RhdGUubG9nX2xpbmVzLmFwcGVuZChmJ1tEZWVwU2VlayBCYXRjaF0gV0FSTklORzogQ291bGQgbm90IGxvYWQgZGVjayAie2RufSIsIHNraXBwaW5nLicpCiAgICAgICAgICAgICAgICBjb250aW51ZQoKICAgICAgICAgICAgIyBEZXRlY3QgY29tbWFuZGVyIGFuZCBjb2xvciBpZGVudGl0eSBmcm9tIGNhcmQgZGF0YQogICAgICAgICAgICBjb21tYW5kZXJfbmFtZSA9ICcnCiAgICAgICAgICAgIGNvbG9yX2lkZW50aXR5X3NldCA9IHNldCgpCiAgICAgICAgICAgIGRlY2tfb2JqcyA9IFtdCiAgICAgICAgICAgIGZvciBjZCBpbiByYXdfY2FyZHM6CiAgICAgICAgICAgICAgICBjID0gQ2FyZChuYW1lPWNkWyduYW1lJ10pCiAgICAgICAgICAgICAgICBpZiBjZC5nZXQoJ3R5cGVfbGluZScpOiBjLnR5cGVfbGluZSA9IGNkWyd0eXBlX2xpbmUnXQogICAgICAgICAgICAgICAgaWYgY2QuZ2V0KCdjbWMnKTogYy5jbWMgPSBmbG9hdChjZFsnY21jJ10pCiAgICAgICAgICAgICAgICBpZiBjZC5nZXQoJ3Bvd2VyJykgYW5kIGNkLmdldCgndG91Z2huZXNzJyk6CiAgICAgICAgICAgICAgICAgICAgYy5wb3dlciA9IHN0cihjZFsncG93ZXInXSkKICAgICAgICAgICAgICAgICAgICBjLnRvdWdobmVzcyA9IHN0cihjZFsndG91Z2huZXNzJ10pCiAgICAgICAgICAgICAgICAgICAgYy5wdCA9IGMucG93ZXIgKyAnLycgKyBjLnRvdWdobmVzcwogICAgICAgICAgICAgICAgaWYgY2QuZ2V0KCdvcmFjbGVfdGV4dCcpOiBjLm9yYWNsZV90ZXh0ID0gY2RbJ29yYWNsZV90ZXh0J10KICAgICAgICAgICAgICAgIGlmIGNkLmdldCgnbWFuYV9jb3N0Jyk6IGMubWFuYV9jb3N0ID0gY2RbJ21hbmFfY29zdCddCiAgICAgICAgICAgICAgICBpZiBjZC5nZXQoJ2tleXdvcmRzJyk6CiAgICAgICAgICAgICAgICAgICAga3cgPSBjZFsna2V5d29yZHMnXQogICAgICAgICAgICAgICAgICAgIGlmIGlzaW5zdGFuY2Uoa3csIHN0cik6CiAgICAgICAgICAgICAgICAgICAgICAgIHRyeToga3cgPSBqc29uLmxvYWRzKGt3KQogICAgICAgICAgICAgICAgICAgICAgICBleGNlcHQgRXhjZXB0aW9uOiBrdyA9IFtdCiAgICAgICAgICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShrdywgbGlzdCk6IGMua2V5d29yZHMgPSBrdwogICAgICAgICAgICAgICAgIyBTZXQgaXNfY29tbWFuZGVyIGZsYWcgZnJvbSBEQiBkYXRhCiAgICAgICAgICAgICAgICBpZiBjZC5nZXQoJ2lzX2NvbW1hbmRlcicpOgogICAgICAgICAgICAgICAgICAgIGMuaXNfY29tbWFuZGVyID0gVHJ1ZQogICAgICAgICAgICAgICAgICAgIGNvbW1hbmRlcl9uYW1lID0gY2RbJ25hbWUnXQogICAgICAgICAgICAgICAgIyBDb2xsZWN0IGNvbG9yIGlkZW50aXR5CiAgICAgICAgICAgICAgICBjaV9zdHIgPSBjZC5nZXQoJ2NvbG9yX2lkZW50aXR5JywgJycpCiAgICAgICAgICAgICAgICBpZiBjaV9zdHI6CiAgICAgICAgICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgICAgICAgICBjaV9wYXJzZWQgPSBqc29uLmxvYWRzKGNpX3N0cikgaWYgaXNpbnN0YW5jZShjaV9zdHIsIHN0cikgZWxzZSBjaV9zdHIKICAgICAgICAgICAgICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShjaV9wYXJzZWQsIGxpc3QpOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIGNvbG9yIGluIGNpX3BhcnNlZDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvcl9pZGVudGl0eV9zZXQuYWRkKGNvbG9yKQogICAgICAgICAgICAgICAgICAgIGV4Y2VwdCBFeGNlcHRpb246CiAgICAgICAgICAgICAgICAgICAgICAgIHBhc3MKICAgICAgICAgICAgICAgIGVucmljaF9jYXJkKGMpCiAgICAgICAgICAgICAgICBkZWNrX29ianMuYXBwZW5kKGMpCgogICAgICAgICAgICAjIEluZmVyIGFyY2hldHlwZSBmcm9tIGRlY2sgY29tcG9zaXRpb24KICAgICAgICAgICAgY3JlYXR1cmVfY291bnQgPSBzdW0oMSBmb3IgYyBpbiBkZWNrX29ianMgaWYgYy5pc19jcmVhdHVyZSgpKQogICAgICAgICAgICByZW1vdmFsX2NvdW50ID0gc3VtKDEgZm9yIGMgaW4gZGVja19vYmpzIGlmIGMuaXNfcmVtb3ZhbCkKICAgICAgICAgICAgcmFtcF9jb3VudCA9IHN1bSgxIGZvciBjIGluIGRlY2tfb2JqcyBpZiBjLmlzX3JhbXApCiAgICAgICAgICAgIGF2Z19jbWMgPSBzdW0oYy5jbWMgb3IgMCBmb3IgYyBpbiBkZWNrX29ianMgaWYgbm90IGMuaXNfbGFuZCgpKSAvIG1heChzdW0oMSBmb3IgYyBpbiBkZWNrX29ianMgaWYgbm90IGMuaXNfbGFuZCgpKSwgMSkKICAgICAgICAgICAgb3JhY2xlX2FsbCA9ICcgJy5qb2luKChjLm9yYWNsZV90ZXh0IG9yICcnKS5sb3dlcigpIGZvciBjIGluIGRlY2tfb2JqcykKICAgICAgICAgICAgaGFzX2NvbWJvX3RleHQgPSBhbnkoa3cgaW4gb3JhY2xlX2FsbCBmb3Iga3cgaW4gWyd5b3Ugd2luIHRoZSBnYW1lJywgJ2luZmluaXRlJywgJ2V4dHJhIHR1cm4nXSkKCiAgICAgICAgICAgIGlmIGhhc19jb21ib190ZXh0OgogICAgICAgICAgICAgICAgYXJjaGV0eXBlID0gJ2NvbWJvJwogICAgICAgICAgICBlbGlmIGNyZWF0dXJlX2NvdW50ID49IDMwIGFuZCBhdmdfY21jIDw9IDIuODoKICAgICAgICAgICAgICAgIGFyY2hldHlwZSA9ICdhZ2dybycKICAgICAgICAgICAgZWxpZiByZW1vdmFsX2NvdW50ID49IDEwIG9yIChjcmVhdHVyZV9jb3VudCA8PSAxOCBhbmQgYXZnX2NtYyA+PSAzLjIpOgogICAgICAgICAgICAgICAgYXJjaGV0eXBlID0gJ2NvbnRyb2wnCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBhcmNoZXR5cGUgPSAnbWlkcmFuZ2UnCgogICAgICAgICAgICBjb2xvcl9pZGVudGl0eV9saXN0ID0gc29ydGVkKGxpc3QoY29sb3JfaWRlbnRpdHlfc2V0KSkKICAgICAgICAgICAgZGVja19tZXRhW2RuXSA9IHsKICAgICAgICAgICAgICAgICdjb21tYW5kZXJfbmFtZSc6IGNvbW1hbmRlcl9uYW1lLAogICAgICAgICAgICAgICAgJ2NvbG9yX2lkZW50aXR5JzogY29sb3JfaWRlbnRpdHlfbGlzdCwKICAgICAgICAgICAgICAgICdhcmNoZXR5cGUnOiBhcmNoZXR5cGUsCiAgICAgICAgICAgICAgICAnd2luX3JhdGUnOiBkZWNrX3dpbl9yYXRlcy5nZXQoZG4pLAogICAgICAgICAgICB9CgogICAgICAgICAgICBsb2FkZWRfZGVja3NbZG5dID0gZGVja19vYmpzCiAgICAgICAgICAgIGNtZHJfaW5mbyA9IGYnIChDb21tYW5kZXI6IHtjb21tYW5kZXJfbmFtZX0pJyBpZiBjb21tYW5kZXJfbmFtZSBlbHNlICcnCiAgICAgICAgICAgIHdyX2luZm8gPSBmJyBbSGlzdG9yeToge2RlY2tfd2luX3JhdGVzW2RuXTouMGZ9JSBXUl0nIGlmIGRuIGluIGRlY2tfd2luX3JhdGVzIGVsc2UgJycKICAgICAgICAgICAgc3RhdGUubG9nX2xpbmVzLmFwcGVuZChmJ1tEZWVwU2VlayBCYXRjaF0gTG9hZGVkIGRlY2sgIntkbn0iICh7bGVuKGRlY2tfb2Jqcyl9IGNhcmRzLCB7YXJjaGV0eXBlfSl7Y21kcl9pbmZvfXt3cl9pbmZvfScpCgogICAgICAgIGlmIG5vdCBsb2FkZWRfZGVja3M6CiAgICAgICAgICAgIHN0YXRlLmVycm9yID0gJ05vIGRlY2tzIGNvdWxkIGJlIGxvYWRlZC4nCiAgICAgICAgICAgIHN0YXRlLnJ1bm5pbmcgPSBGYWxzZQogICAgICAgICAgICByZXR1cm4KCiAgICAgICAgIyBCdWlsZCBtYXRjaHVwIHNjaGVkdWxlOiBlYWNoIGRlY2sgcGxheXMgbnVtX2dhbWVzIHZzIERlZXBTZWVrIEFJCiAgICAgICAgZGVja19saXN0ID0gbGlzdChsb2FkZWRfZGVja3Mua2V5cygpKQogICAgICAgIGdhbWVzX3Blcl9kZWNrID0gbWF4KDEsIG51bV9nYW1lcyAvLyBsZW4oZGVja19saXN0KSkKICAgICAgICB0b3RhbF9nYW1lcyA9IGdhbWVzX3Blcl9kZWNrICogbGVuKGRlY2tfbGlzdCkKICAgICAgICBzdGF0ZS50b3RhbF9nYW1lcyA9IHRvdGFsX2dhbWVzCgogICAgICAgIHN0YXRlLmxvZ19saW5lcy5hcHBlbmQoZidbRGVlcFNlZWsgQmF0Y2hdIFJ1bm5pbmcge2dhbWVzX3Blcl9kZWNrfSBnYW1lcyBwZXIgZGVjayDDlyB7bGVuKGRlY2tfbGlzdCl9IGRlY2tzID0ge3RvdGFsX2dhbWVzfSB0b3RhbCcpCgogICAgICAgIGVuZ2luZSA9IERlZXBTZWVrR2FtZUVuZ2luZSgKICAgICAgICAgICAgYnJhaW49YnJhaW4sCiAgICAgICAgICAgIGFpX3BsYXllcl9pbmRleD0wLCAgIyBBSSBwaWxvdHMgZGVja19hICh1c2VyJ3MgZGVjaykgd2l0aCBmdWxsIGludGVsbGlnZW5jZQogICAgICAgICAgICBtYXhfdHVybnM9MjUsCiAgICAgICAgICAgIHJlY29yZF9sb2c9VHJ1ZSwKICAgICAgICAgICAgbWxfbG9nPVRydWUsCiAgICAgICAgKQoKICAgICAgICBzdGFydF90aW1lID0gX3QudGltZSgpCiAgICAgICAgYWxsX2RlY2tfcmVzdWx0cyA9IFtdCiAgICAgICAgY29tcGxldGVkID0gMAoKICAgICAgICBmb3IgZGVja19uYW1lIGluIGRlY2tfbGlzdDoKICAgICAgICAgICAgZGVja19hID0gbG9hZGVkX2RlY2tzW2RlY2tfbmFtZV0KICAgICAgICAgICAgIyBHZW5lcmF0ZSBhIHRyYWluaW5nIG9wcG9uZW50IGZvciBlYWNoIGdhbWUKICAgICAgICAgICAgZnJvbSBjb21tYW5kZXJfYWlfbGFiLmxhYi5leHBlcmltZW50cyBpbXBvcnQgX2dlbmVyYXRlX3RyYWluaW5nX2RlY2sKCiAgICAgICAgICAgIGRlY2tfc3RhdHMgPSB7CiAgICAgICAgICAgICAgICAnZGVja05hbWUnOiBkZWNrX25hbWUsCiAgICAgICAgICAgICAgICAnd2lucyc6IDAsICdsb3NzZXMnOiAwLCAndG90YWxHYW1lcyc6IGdhbWVzX3Blcl9kZWNrLAogICAgICAgICAgICAgICAgJ3RvdGFsVHVybnMnOiAwLCAndG90YWxEYW1hZ2VEZWFsdCc6IDAsICd0b3RhbERhbWFnZVJlY2VpdmVkJzogMCwKICAgICAgICAgICAgICAgICd0b3RhbFNwZWxsc0Nhc3QnOiAwLCAndG90YWxDcmVhdHVyZXNQbGF5ZWQnOiAwLAogICAgICAgICAgICAgICAgJ2dhbWVzJzogW10sCiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIG1ldGEgPSBkZWNrX21ldGEuZ2V0KGRlY2tfbmFtZSwge30pCiAgICAgICAgICAgIGRrX2FyY2hldHlwZSA9IG1ldGEuZ2V0KCdhcmNoZXR5cGUnLCAnbWlkcmFuZ2UnKQogICAgICAgICAgICBka19jb21tYW5kZXIgPSBtZXRhLmdldCgnY29tbWFuZGVyX25hbWUnLCAnJykKICAgICAgICAgICAgZGtfY29sb3JzID0gbWV0YS5nZXQoJ2NvbG9yX2lkZW50aXR5JywgW10pCiAgICAgICAgICAgIGRrX3dpbl9yYXRlID0gbWV0YS5nZXQoJ3dpbl9yYXRlJykKCiAgICAgICAgICAgIGZvciBnIGluIHJhbmdlKGdhbWVzX3Blcl9kZWNrKToKICAgICAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgICAgICBkZWNrX2IgPSBfZ2VuZXJhdGVfdHJhaW5pbmdfZGVjaygpCiAgICAgICAgICAgICAgICAgICAgZ2FtZV9pZCA9IGYnZHMte3N0YXRlLmJhdGNoX2lkfS17ZGVja19uYW1lWzoxMl19LWd7ZysxfScKICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBlbmdpbmUucnVuKAogICAgICAgICAgICAgICAgICAgICAgICBkZWNrX2EsIGRlY2tfYiwKICAgICAgICAgICAgICAgICAgICAgICAgbmFtZV9hPWRlY2tfbmFtZSArICcgKEFJKScsCiAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVfYj0nVHJhaW5pbmcgT3Bwb25lbnQnLAogICAgICAgICAgICAgICAgICAgICAgICBnYW1lX2lkPWdhbWVfaWQsIGFyY2hldHlwZT1ka19hcmNoZXR5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRlcl9uYW1lPWRrX2NvbW1hbmRlciwKICAgICAgICAgICAgICAgICAgICAgICAgY29sb3JfaWRlbnRpdHk9ZGtfY29sb3JzLAogICAgICAgICAgICAgICAgICAgICAgICB3aW5fcmF0ZT1ka193aW5fcmF0ZSwKICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAgICAgZ2QgPSByZXN1bHQudG9fZGljdCgpCiAgICAgICAgICAgICAgICAgICAgZ2RbJ2dhbWVOdW1iZXInXSA9IGcgKyAxCiAgICAgICAgICAgICAgICAgICAgZGVja19zdGF0c1snZ2FtZXMnXS5hcHBlbmQoZ2QpCgogICAgICAgICAgICAgICAgICAgIGlmIHJlc3VsdC53aW5uZXIgPT0gMDoKICAgICAgICAgICAgICAgICAgICAgICAgZGVja19zdGF0c1snd2lucyddICs9IDEKICAgICAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgICAgICBkZWNrX3N0YXRzWydsb3NzZXMnXSArPSAxCiAgICAgICAgICAgICAgICAgICAgZGVja19zdGF0c1sndG90YWxUdXJucyddICs9IHJlc3VsdC50dXJucwogICAgICAgICAgICAgICAgICAgIGlmIHJlc3VsdC5wbGF5ZXJfYV9zdGF0czoKICAgICAgICAgICAgICAgICAgICAgICAgZGVja19zdGF0c1sndG90YWxEYW1hZ2VEZWFsdCddICs9IHJlc3VsdC5wbGF5ZXJfYV9zdGF0cy5kYW1hZ2VfZGVhbHQKICAgICAgICAgICAgICAgICAgICAgICAgZGVja19zdGF0c1sndG90YWxEYW1hZ2VSZWNlaXZlZCddICs9IHJlc3VsdC5wbGF5ZXJfYV9zdGF0cy5kYW1hZ2VfcmVjZWl2ZWQKICAgICAgICAgICAgICAgICAgICAgICAgZGVja19zdGF0c1sndG90YWxTcGVsbHNDYXN0J10gKz0gcmVzdWx0LnBsYXllcl9hX3N0YXRzLnNwZWxsc19jYXN0CiAgICAgICAgICAgICAgICAgICAgICAgIGRlY2tfc3RhdHNbJ3RvdGFsQ3JlYXR1cmVzUGxheWVkJ10gKz0gcmVzdWx0LnBsYXllcl9hX3N0YXRzLmNyZWF0dXJlc19wbGF5ZWQKCiAgICAgICAgICAgICAgICAgICAgc3RhdGUubG9nX2xpbmVzLmFwcGVuZCgKICAgICAgICAgICAgICAgICAgICAgICAgZidbR2FtZSB7Y29tcGxldGVkICsgMX0ve3RvdGFsX2dhbWVzfV0ge2RlY2tfbmFtZX0gKEFJLXBpbG90ZWQpIOKGkiAnCiAgICAgICAgICAgICAgICAgICAgICAgIGYneyJXSU4iIGlmIHJlc3VsdC53aW5uZXIgPT0gMCBlbHNlICJMT1NTIn0gKHR1cm4ge3Jlc3VsdC50dXJuc30pJwogICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIGV4Y2VwdCBFeGNlcHRpb24gYXMgZ2U6CiAgICAgICAgICAgICAgICAgICAgc3RhdGUubG9nX2xpbmVzLmFwcGVuZChmJ1tHYW1lIHtjb21wbGV0ZWQgKyAxfS97dG90YWxfZ2FtZXN9XSBFUlJPUjoge2dlfScpCiAgICAgICAgICAgICAgICAgICAgZGVja19zdGF0c1snZ2FtZXMnXS5hcHBlbmQoeydlcnJvcic6IHN0cihnZSksICdnYW1lTnVtYmVyJzogZyArIDF9KQoKICAgICAgICAgICAgICAgIGNvbXBsZXRlZCArPSAxCiAgICAgICAgICAgICAgICBzdGF0ZS5jb21wbGV0ZWRfZ2FtZXMgPSBjb21wbGV0ZWQKCiAgICAgICAgICAgIG4gPSBkZWNrX3N0YXRzWyd0b3RhbEdhbWVzJ10KICAgICAgICAgICAgZGVja19zdGF0c1snd2luUmF0ZSddID0gcm91bmQoZGVja19zdGF0c1snd2lucyddIC8gbiAqIDEwMCwgMSkgaWYgbiA+IDAgZWxzZSAwLjAKICAgICAgICAgICAgZGVja19zdGF0c1snYXZnVHVybnMnXSA9IHJvdW5kKGRlY2tfc3RhdHNbJ3RvdGFsVHVybnMnXSAvIG4sIDEpIGlmIG4gPiAwIGVsc2UgMC4wCiAgICAgICAgICAgIGRlY2tfc3RhdHNbJ2F2Z0RhbWFnZURlYWx0J10gPSByb3VuZChkZWNrX3N0YXRzWyd0b3RhbERhbWFnZURlYWx0J10gLyBuLCAxKSBpZiBuID4gMCBlbHNlIDAuMAogICAgICAgICAgICBkZWNrX3N0YXRzWydhdmdEYW1hZ2VSZWNlaXZlZCddID0gcm91bmQoZGVja19zdGF0c1sndG90YWxEYW1hZ2VSZWNlaXZlZCddIC8gbiwgMSkgaWYgbiA+IDAgZWxzZSAwLjAKICAgICAgICAgICAgZGVja19zdGF0c1snYXZnU3BlbGxzQ2FzdCddID0gcm91bmQoZGVja19zdGF0c1sndG90YWxTcGVsbHNDYXN0J10gLyBuLCAxKSBpZiBuID4gMCBlbHNlIDAuMAogICAgICAgICAgICBkZWNrX3N0YXRzWydhdmdDcmVhdHVyZXNQbGF5ZWQnXSA9IHJvdW5kKGRlY2tfc3RhdHNbJ3RvdGFsQ3JlYXR1cmVzUGxheWVkJ10gLyBuLCAxKSBpZiBuID4gMCBlbHNlIDAuMAogICAgICAgICAgICAjIEluY2x1ZGUgZGVjayBpbnRlbGxpZ2VuY2UgbWV0YWRhdGEKICAgICAgICAgICAgZGVja19zdGF0c1snYXJjaGV0eXBlJ10gPSBka19hcmNoZXR5cGUKICAgICAgICAgICAgZGVja19zdGF0c1snY29tbWFuZGVyJ10gPSBka19jb21tYW5kZXIKICAgICAgICAgICAgZGVja19zdGF0c1snY29sb3JJZGVudGl0eSddID0gZGtfY29sb3JzCiAgICAgICAgICAgIGlmIGRrX3dpbl9yYXRlIGlzIG5vdCBOb25lOgogICAgICAgICAgICAgICAgZGVja19zdGF0c1sncHJpb3JXaW5SYXRlJ10gPSBka193aW5fcmF0ZQogICAgICAgICAgICBhbGxfZGVja19yZXN1bHRzLmFwcGVuZChkZWNrX3N0YXRzKQoKICAgICAgICBlbGFwc2VkID0gX3QudGltZSgpIC0gc3RhcnRfdGltZQogICAgICAgIGRzX3N0YXRzID0gYnJhaW4uZ2V0X3N0YXRzKCkgaWYgYnJhaW4gZWxzZSB7fQoKICAgICAgICAjIEJ1aWxkIHJlc3VsdCBpbiBjb21wYXRpYmxlIGZvcm1hdAogICAgICAgIGJhdGNoX3Jlc3VsdCA9IHsKICAgICAgICAgICAgJ21ldGFkYXRhJzogewogICAgICAgICAgICAgICAgJ2JhdGNoSWQnOiBzdGF0ZS5iYXRjaF9pZCwKICAgICAgICAgICAgICAgICd0aW1lc3RhbXAnOiBkYXRldGltZS5ub3coKS5pc29mb3JtYXQoKSwKICAgICAgICAgICAgICAgICdjb21wbGV0ZWRHYW1lcyc6IGNvbXBsZXRlZCwKICAgICAgICAgICAgICAgICd0aHJlYWRzJzogMSwKICAgICAgICAgICAgICAgICdlbGFwc2VkTXMnOiBpbnQoZWxhcHNlZCAqIDEwMDApLAogICAgICAgICAgICAgICAgJ2VuZ2luZSc6ICdkZWVwc2VlaycsCiAgICAgICAgICAgICAgICAnbW9kZWwnOiBicmFpbi5jb25maWcubW9kZWwgaWYgYnJhaW4gZWxzZSAndW5rbm93bicsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICdkZWNrcyc6IGFsbF9kZWNrX3Jlc3VsdHMsCiAgICAgICAgICAgICdkZWVwc2Vla1N0YXRzJzogZHNfc3RhdHMsCiAgICAgICAgfQoKICAgICAgICAjIFdyaXRlIE1MIGRlY2lzaW9uIEpTT05MIGZvciB0aGUgdHJhaW5pbmcgcGlwZWxpbmUKICAgICAgICBtbF9kZWNpc2lvbnMgPSBlbmdpbmUuZmx1c2hfbWxfZGVjaXNpb25zKCkKICAgICAgICBpZiBtbF9kZWNpc2lvbnM6CiAgICAgICAgICAgIG1sX2pzb25sX3BhdGggPSBvcy5wYXRoLmpvaW4oQ0ZHLnJlc3VsdHNfZGlyLCBmJ21sLWRlY2lzaW9ucy1kcy17c3RhdGUuYmF0Y2hfaWR9Lmpzb25sJykKICAgICAgICAgICAgb3MubWFrZWRpcnMob3MucGF0aC5kaXJuYW1lKG1sX2pzb25sX3BhdGgpIG9yICcuJywgZXhpc3Rfb2s9VHJ1ZSkKICAgICAgICAgICAgd2l0aCBvcGVuKG1sX2pzb25sX3BhdGgsICd3JywgZW5jb2Rpbmc9J3V0Zi04JykgYXMgbWY6CiAgICAgICAgICAgICAgICBmb3IgZGVjIGluIG1sX2RlY2lzaW9uczoKICAgICAgICAgICAgICAgICAgICBtZi53cml0ZShqc29uLmR1bXBzKGRlYykgKyAnXG4nKQogICAgICAgICAgICBzdGF0ZS5sb2dfbGluZXMuYXBwZW5kKGYnW01MIERhdGFdIFdyb3RlIHtsZW4obWxfZGVjaXNpb25zKX0gZGVjaXNpb24gc25hcHNob3RzIHRvIHtvcy5wYXRoLmJhc2VuYW1lKG1sX2pzb25sX3BhdGgpfScpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgc3RhdGUubG9nX2xpbmVzLmFwcGVuZCgnW01MIERhdGFdIE5vIGRlY2lzaW9uIHNuYXBzaG90cyBjYXB0dXJlZCAoMCBkZWNpc2lvbnMpJykKCiAgICAgICAgIyBTYXZlIHRvIHJlc3VsdHMgZGlyCiAgICAgICAgb3MubWFrZWRpcnMob3MucGF0aC5kaXJuYW1lKG91dHB1dF9wYXRoKSwgZXhpc3Rfb2s9VHJ1ZSkKICAgICAgICB3aXRoIG9wZW4ob3V0cHV0X3BhdGgsICd3JywgZW5jb2Rpbmc9J3V0Zi04JykgYXMgZjoKICAgICAgICAgICAganNvbi5kdW1wKGJhdGNoX3Jlc3VsdCwgZiwgaW5kZW50PTIsIGRlZmF1bHQ9c3RyKQoKICAgICAgICBzdGF0ZS5yZXN1bHRfcGF0aCA9IG91dHB1dF9wYXRoCiAgICAgICAgZWxhcHNlZF9tcyA9IGludChlbGFwc2VkICogMTAwMCkKICAgICAgICBzdGF0ZS5lbGFwc2VkX21zID0gZWxhcHNlZF9tcwogICAgICAgIHN0YXRlLnJ1bm5pbmcgPSBGYWxzZQogICAgICAgIHN0YXRlLmNvbXBsZXRlZF9nYW1lcyA9IHRvdGFsX2dhbWVzCgogICAgICAgIHN0YXRlLmxvZ19saW5lcy5hcHBlbmQoZidbRGVlcFNlZWsgQmF0Y2hdIENvbXBsZXRlOiB7Y29tcGxldGVkfSBnYW1lcyBpbiB7ZWxhcHNlZDouMWZ9cycpCiAgICAgICAgZm9yIGRzIGluIGFsbF9kZWNrX3Jlc3VsdHM6CiAgICAgICAgICAgIHN0YXRlLmxvZ19saW5lcy5hcHBlbmQoZicgIHtkc1siZGVja05hbWUiXX06IHtkc1sid2lucyJdfVcte2RzWyJsb3NzZXMiXX1MICh7ZHNbIndpblJhdGUiXX0lIFdSKScpCgogICAgICAgIGxvZ19zaW0uaW5mbyhmJ0JhdGNoIHtzdGF0ZS5iYXRjaF9pZH0gY29tcGxldGU6IHtjb21wbGV0ZWR9IGdhbWVzIGluIHtlbGFwc2VkOi4xZn1zJykKCiAgICBleGNlcHQgRXhjZXB0aW9uIGFzIGU6CiAgICAgICAgaW1wb3J0IHRyYWNlYmFjawogICAgICAgIHN0YXRlLmVycm9yID0gc3RyKGUpCiAgICAgICAgc3RhdGUucnVubmluZyA9IEZhbHNlCiAgICAgICAgc3RhdGUubG9nX2xpbmVzLmFwcGVuZChmJ1tEZWVwU2VlayBCYXRjaF0gRkFUQUw6IHtlfScpCiAgICAgICAgdHJhY2ViYWNrLnByaW50X2V4YygpCgoKQGFwcC5wb3N0KCcvYXBpL2xhYi9zdGFydC1kZWVwc2VlaycpCmFzeW5jIGRlZiBzdGFydF9iYXRjaF9kZWVwc2VlayhyZXF1ZXN0OiBGYXN0QVBJUmVxdWVzdCwgYmFja2dyb3VuZF90YXNrczogQmFja2dyb3VuZFRhc2tzKToKICAgICIiIlN0YXJ0IGEgYmF0Y2ggc2ltdWxhdGlvbiB1c2luZyB0aGUgUHl0aG9uIHNpbSBlbmdpbmUgKyBEZWVwU2VlayBMTE0gb3Bwb25lbnQuIiIiCiAgICBib2R5ID0gYXdhaXQgcmVxdWVzdC5qc29uKCkKICAgIGRlY2tzID0gYm9keS5nZXQoJ2RlY2tzJywgW10pCiAgICBudW1fZ2FtZXMgPSBib2R5LmdldCgnbnVtR2FtZXMnLCAzMCkKICAgICMgTm90ZTogdGhyZWFkcyBub3QgYXBwbGljYWJsZSBmb3IgUHl0aG9uIHNpbSAoc2luZ2xlLXRocmVhZGVkIExMTSBjYWxscykKCiAgICBpZiBub3QgZGVja3Mgb3IgbGVuKGRlY2tzKSA8IDE6CiAgICAgICAgcmFpc2UgSFRUUEV4Y2VwdGlvbig0MDAsICdBdCBsZWFzdCAxIGRlY2sgcmVxdWlyZWQnKQogICAgaWYgbnVtX2dhbWVzIDwgMSBvciBudW1fZ2FtZXMgPiA1MDA6CiAgICAgICAgcmFpc2UgSFRUUEV4Y2VwdGlvbig0MDAsICdudW1HYW1lcyBtdXN0IGJlIDEtNTAwJykKCiAgICAjIEZpbHRlciBlbXB0eSBkZWNrIHNsb3RzCiAgICBkZWNrcyA9IFtkIGZvciBkIGluIGRlY2tzIGlmIGRdCiAgICBpZiBub3QgZGVja3M6CiAgICAgICAgcmFpc2UgSFRUUEV4Y2VwdGlvbig0MDAsICdObyB2YWxpZCBkZWNrcyBwcm92aWRlZCcpCgogICAgYmF0Y2hfaWQgPSBzdHIodXVpZC51dWlkNCgpKVs6MTJdCiAgICBzdGF0ZSA9IEJhdGNoU3RhdGUoYmF0Y2hfaWQsIG51bV9nYW1lcywgMSkKICAgIGFjdGl2ZV9iYXRjaGVzW2JhdGNoX2lkXSA9IHN0YXRlCgogICAgb3MubWFrZWRpcnMoQ0ZHLnJlc3VsdHNfZGlyLCBleGlzdF9vaz1UcnVlKQogICAgb3V0cHV0X3BhdGggPSBvcy5wYXRoLmpvaW4oQ0ZHLnJlc3VsdHNfZGlyLCBmJ2JhdGNoLXtiYXRjaF9pZH0uanNvbicpCiAgICBzdGF0ZS5yZXN1bHRfcGF0aCA9IG91dHB1dF9wYXRoCgogICAgIyBVc2UgdGhyZWFkaW5nIGluc3RlYWQgb2YgQmFja2dyb3VuZFRhc2tzIHRvIGF2b2lkIGFzeW5jIGlzc3VlcyB3aXRoIERCCiAgICB0ID0gdGhyZWFkaW5nLlRocmVhZCgKICAgICAgICB0YXJnZXQ9X3J1bl9kZWVwc2Vla19iYXRjaF90aHJlYWQsCiAgICAgICAgYXJncz0oc3RhdGUsIGRlY2tzLCBudW1fZ2FtZXMsIG91dHB1dF9wYXRoKSwKICAgICAgICBkYWVtb249VHJ1ZSwKICAgICkKICAgIHQuc3RhcnQoKQoKICAgIHJldHVybiBKU09OUmVzcG9uc2UoewogICAgICAgICdiYXRjaElkJzogYmF0Y2hfaWQsCiAgICAgICAgJ3N0YXR1cyc6ICdzdGFydGVkJywKICAgICAgICAnbWVzc2FnZSc6IGYnUnVubmluZyB7bnVtX2dhbWVzfSBnYW1lcyBhY3Jvc3Mge2xlbihkZWNrcyl9IGRlY2tzIHdpdGggRGVlcFNlZWsgQUknLAogICAgICAgICdlbmdpbmUnOiAnZGVlcHNlZWsnLAogICAgfSkKCgojIEdsb2JhbCBNTCBsb2dnaW5nIHRvZ2dsZSAoY2FuIGJlIGVuYWJsZWQgdmlhIEFQSSkKX21sX2xvZ2dpbmdfZW5hYmxlZCA9IEZhbHNlCgoKZGVmIF9maW5kX2phdmExNygpIC0+IHN0cjoKICAgICIiIkF1dG8tZGV0ZWN0IEphdmEgMTcgZm9yIEZvcmdlIHN1YnByb2Nlc3Nlcy4gRm9yZ2UgY3Jhc2hlcyBvbiBKYXZhIDI1Ky4iIiIKICAgIGltcG9ydCBnbG9iIGFzIF9nbG9iCiAgICAjIENoZWNrIGNvbW1vbiBBZG9wdGl1bS9PcmFjbGUgbG9jYXRpb25zIG9uIFdpbmRvd3MKICAgIHNlYXJjaF9kaXJzID0gWwogICAgICAgIHInQzpcUHJvZ3JhbSBGaWxlc1xFY2xpcHNlIEFkb3B0aXVtJywKICAgICAgICByJ0M6XFByb2dyYW0gRmlsZXNcSmF2YScsCiAgICBdCiAgICBmb3IgZCBpbiBzZWFyY2hfZGlyczoKICAgICAgICBpZiBvcy5wYXRoLmlzZGlyKGQpOgogICAgICAgICAgICBmb3IgY2hpbGQgaW4gb3MubGlzdGRpcihkKToKICAgICAgICAgICAgICAgIGlmIGNoaWxkLnN0YXJ0c3dpdGgoJ2pkay0xNycpOgogICAgICAgICAgICAgICAgICAgIGNhbmRpZGF0ZSA9IG9zLnBhdGguam9pbihkLCBjaGlsZCwgJ2JpbicsICdqYXZhLmV4ZScpCiAgICAgICAgICAgICAgICAgICAgaWYgb3MucGF0aC5pc2ZpbGUoY2FuZGlkYXRlKToKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNhbmRpZGF0ZQogICAgcmV0dXJuICdqYXZhJyAgIyBmYWxsYmFjayB0byBzeXN0ZW0gamF2YQoKX0pBVkExN19QQVRIID0gTm9uZSAgIyBjYWNoZWQgcmVzdWx0CgpkZWYgZ2V0X2phdmExNygpIC0+IHN0cjoKICAgIGdsb2JhbCBfSkFWQTE3X1BBVEgKICAgIGlmIF9KQVZBMTdfUEFUSCBpcyBOb25lOgogICAgICAgIF9KQVZBMTdfUEFUSCA9IF9maW5kX2phdmExNygpCiAgICByZXR1cm4gX0pBVkExN19QQVRICgoKZGVmIGJ1aWxkX2phdmFfY29tbWFuZCgKICAgIGRlY2tzOiBsaXN0W3N0cl0sCiAgICBudW1fZ2FtZXM6IGludCwKICAgIHRocmVhZHM6IGludCwKICAgIHNlZWQ6IE9wdGlvbmFsW2ludF0sCiAgICBjbG9jazogaW50LAogICAgb3V0cHV0X3BhdGg6IHN0ciwKICAgIHVzZV9sZWFybmVkX3BvbGljeTogYm9vbCA9IEZhbHNlLAogICAgcG9saWN5X3NlcnZlcjogc3RyID0gImh0dHA6Ly9sb2NhbGhvc3Q6ODA4MCIsCiAgICBwb2xpY3lfc3R5bGU6IHN0ciA9ICJtaWRyYW5nZSIsCiAgICBwb2xpY3lfZ3JlZWR5OiBib29sID0gRmFsc2UsCiAgICAjIHYyNCAoSXNzdWVzICM0LyM1KTogUGVyZm9ybWFuY2UgZmxhZ3MKICAgIGFpX3NpbXBsaWZpZWQ6IGJvb2wgPSBGYWxzZSwKICAgIGFpX3RoaW5rX3RpbWVfbXM6IGludCA9IC0xLAogICAgbWF4X3F1ZXVlX2RlcHRoOiBpbnQgPSAtMSwKKSAtPiBsaXN0W3N0cl06CiAgICBqYXZhMTcgPSBnZXRfamF2YTE3KCkKICAgIGNtZCA9IFsKICAgICAgICBqYXZhMTcsICItamFyIiwgQ0ZHLmxhYl9qYXIsCiAgICAgICAgIi0tZm9yZ2UtamFyIiwgQ0ZHLmZvcmdlX2phciwKICAgICAgICAiLS1mb3JnZS1kaXIiLCBDRkcuZm9yZ2VfZGlyLAogICAgXQogICAgIyBBZGQgZGVjayBhcmdzIGR5bmFtaWNhbGx5ICgyLTQgZGVja3MpCiAgICBmb3IgaSwgZGVjayBpbiBlbnVtZXJhdGUoZGVja3MpOgogICAgICAgIGNtZC5leHRlbmQoW2YiLS1kZWNre2krMX0iLCBkZWNrXSkKICAgIGNtZCArPSBbCiAgICAgICAgIi0tZ2FtZXMiLCBzdHIobnVtX2dhbWVzKSwKICAgICAgICAiLS10aHJlYWRzIiwgc3RyKHRocmVhZHMpLAogICAgICAgICItLWNsb2NrIiwgc3RyKGNsb2NrKSwKICAgICAgICAiLS1vdXRwdXQiLCBvdXRwdXRfcGF0aCwKICAgIF0KICAgIGlmIHNlZWQgaXMgbm90IE5vbmU6CiAgICAgICAgY21kLmV4dGVuZChbIi0tc2VlZCIsIHN0cihzZWVkKV0pCiAgICBpZiBfbWxfbG9nZ2luZ19lbmFibGVkOgogICAgICAgIGNtZC5hcHBlbmQoIi0tbWwtbG9nIikKICAgIGlmIHVzZV9sZWFybmVkX3BvbGljeToKICAgICAgICBjbWQuYXBwZW5kKCItLWxlYXJuZWQtcG9saWN5IikKICAgICAgICBjbWQuZXh0ZW5kKFsiLS1wb2xpY3ktc2VydmVyIiwgcG9saWN5X3NlcnZlcl0pCiAgICAgICAgY21kLmV4dGVuZChbIi0tcG9saWN5LXN0eWxlIiwgcG9saWN5X3N0eWxlXSkKICAgICAgICBpZiBwb2xpY3lfZ3JlZWR5OgogICAgICAgICAgICBjbWQuYXBwZW5kKCItLXBvbGljeS1ncmVlZHkiKQogICAgIyB2MjQgKElzc3VlcyAjNC8jNSk6IFBlcmZvcm1hbmNlIGZsYWdzCiAgICBpZiBhaV9zaW1wbGlmaWVkOgogICAgICAgIGNtZC5hcHBlbmQoIi0tYWktc2ltcGxpZmllZCIpCiAgICBpZiBhaV90aGlua190aW1lX21zID4gMDoKICAgICAgICBjbWQuZXh0ZW5kKFsiLS1haS10aGluay10aW1lIiwgc3RyKGFpX3RoaW5rX3RpbWVfbXMpXSkKICAgIGlmIG1heF9xdWV1ZV9kZXB0aCA+IDA6CiAgICAgICAgY21kLmV4dGVuZChbIi0tbWF4LXF1ZXVlIiwgc3RyKG1heF9xdWV1ZV9kZXB0aCldKQogICAgcmV0dXJuIGNtZAoKCiMg4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQCiMgQ29sbGVjdGlvbiBEYXRhYmFzZSBTZXR1cAojIOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkAoKQ09MTEVDVElPTl9EQl9QQVRIID0gUGF0aChfX2ZpbGVfXykucGFyZW50IC8gImNvbGxlY3Rpb24uZGIiCl9kYl9sb2NhbCA9IHRocmVhZGluZy5sb2NhbCgpCgoKZGVmIF9nZXRfZGJfY29ubigpIC0+IHNxbGl0ZTMuQ29ubmVjdGlvbjoKICAgICIiIkdldCBhIHRocmVhZC1sb2NhbCBTUUxpdGUgY29ubmVjdGlvbi4iIiIKICAgIGlmIG5vdCBoYXNhdHRyKF9kYl9sb2NhbCwgImNvbm4iKSBvciBfZGJfbG9jYWwuY29ubiBpcyBOb25lOgogICAgICAgIGNvbm4gPSBzcWxpdGUzLmNvbm5lY3Qoc3RyKENPTExFQ1RJT05fREJfUEFUSCksIGNoZWNrX3NhbWVfdGhyZWFkPUZhbHNlKQogICAgICAgIGNvbm4ucm93X2ZhY3RvcnkgPSBzcWxpdGUzLlJvdwogICAgICAgIF9kYl9sb2NhbC5jb25uID0gY29ubgogICAgcmV0dXJuIF9kYl9sb2NhbC5jb25uCgoKZGVmIGluaXRfY29sbGVjdGlvbl9kYigpOgogICAgIiIiSW5pdGlhbGl6ZSB0aGUgY29sbGVjdGlvbiBTUUxpdGUgZGF0YWJhc2Ugd2l0aCB0YWJsZXMgYW5kIGluZGV4ZXMuIiIiCiAgICBjb25uID0gc3FsaXRlMy5jb25uZWN0KHN0cihDT0xMRUNUSU9OX0RCX1BBVEgpLCBjaGVja19zYW1lX3RocmVhZD1GYWxzZSkKICAgIGNvbm4ucm93X2ZhY3RvcnkgPSBzcWxpdGUzLlJvdwogICAgY3VyID0gY29ubi5jdXJzb3IoKQoKICAgIGN1ci5leGVjdXRlc2NyaXB0KCIiIgogICAgICAgIENSRUFURSBUQUJMRSBJRiBOT1QgRVhJU1RTIGNhcmRfcmVjb3JkcyAoCiAgICAgICAgICAgIGlkIElOVEVHRVIgUFJJTUFSWSBLRVkgQVVUT0lOQ1JFTUVOVCwKICAgICAgICAgICAgbmFtZSBURVhUIE5PVCBOVUxMLAogICAgICAgICAgICB0eXBlX2xpbmUgVEVYVCBERUZBVUxUICcnLAogICAgICAgICAgICBzdWJ0eXBlcyBURVhUIERFRkFVTFQgJycsCiAgICAgICAgICAgIGlzX2xlZ2VuZGFyeSBJTlRFR0VSIERFRkFVTFQgMCwKICAgICAgICAgICAgaXNfYmFzaWMgSU5URUdFUiBERUZBVUxUIDAsCiAgICAgICAgICAgIGNvbG9yX2lkZW50aXR5IFRFWFQgREVGQVVMVCAnJywKICAgICAgICAgICAgY21jIFJFQUwgREVGQVVMVCAwLAogICAgICAgICAgICBvcmFjbGVfdGV4dCBURVhUIERFRkFVTFQgJycsCiAgICAgICAgICAgIGtleXdvcmRzIFRFWFQgREVGQVVMVCAnJywKICAgICAgICAgICAgdGNnX3ByaWNlIFJFQUwgREVGQVVMVCAwLAogICAgICAgICAgICBzYWx0X3Njb3JlIFJFQUwgREVGQVVMVCAwLAogICAgICAgICAgICBpc19nYW1lX2NoYW5nZXIgSU5URUdFUiBERUZBVUxUIDAsCiAgICAgICAgICAgIGNhdGVnb3J5IFRFWFQgREVGQVVMVCAnJywKICAgICAgICAgICAgc2NyeWZhbGxfaWQgVEVYVCBERUZBVUxUICcnLAogICAgICAgICAgICB0Y2dwbGF5ZXJfaWQgVEVYVCBERUZBVUxUICcnCiAgICAgICAgKTsKCiAgICAgICAgQ1JFQVRFIFRBQkxFIElGIE5PVCBFWElTVFMgY29sbGVjdGlvbl9lbnRyaWVzICgKICAgICAgICAgICAgaWQgSU5URUdFUiBQUklNQVJZIEtFWSBBVVRPSU5DUkVNRU5ULAogICAgICAgICAgICBuYW1lIFRFWFQgTk9UIE5VTEwsCiAgICAgICAgICAgIHR5cGVfbGluZSBURVhUIERFRkFVTFQgJycsCiAgICAgICAgICAgIHN1YnR5cGVzIFRFWFQgREVGQVVMVCAnJywKICAgICAgICAgICAgaXNfbGVnZW5kYXJ5IElOVEVHRVIgREVGQVVMVCAwLAogICAgICAgICAgICBpc19iYXNpYyBJTlRFR0VSIERFRkFVTFQgMCwKICAgICAgICAgICAgY29sb3JfaWRlbnRpdHkgVEVYVCBERUZBVUxUICcnLAogICAgICAgICAgICBjbWMgUkVBTCBERUZBVUxUIDAsCiAgICAgICAgICAgIG1hbmFfY29zdCBURVhUIERFRkFVTFQgJycsCiAgICAgICAgICAgIG9yYWNsZV90ZXh0IFRFWFQgREVGQVVMVCAnJywKICAgICAgICAgICAga2V5d29yZHMgVEVYVCBERUZBVUxUICcnLAogICAgICAgICAgICBwb3dlciBURVhUIERFRkFVTFQgJycsCiAgICAgICAgICAgIHRvdWdobmVzcyBURVhUIERFRkFVTFQgJycsCiAgICAgICAgICAgIHJhcml0eSBURVhUIERFRkFVTFQgJycsCiAgICAgICAgICAgIHNldF9uYW1lIFRFWFQgREVGQVVMVCAnJywKICAgICAgICAgICAgZWRocmVjX3JhbmsgSU5URUdFUiBERUZBVUxUIDAsCiAgICAgICAgICAgIHRjZ19wcmljZSBSRUFMIERFRkFVTFQgMCwKICAgICAgICAgICAgc2FsdF9zY29yZSBSRUFMIERFRkFVTFQgMCwKICAgICAgICAgICAgaXNfZ2FtZV9jaGFuZ2VyIElOVEVHRVIgREVGQVVMVCAwLAogICAgICAgICAgICBjYXRlZ29yeSBURVhUIERFRkFVTFQgJycsCiAgICAgICAgICAgIHNjcnlmYWxsX2lkIFRFWFQgREVGQVVMVCAnJywKICAgICAgICAgICAgdGNncGxheWVyX2lkIFRFWFQgREVGQVVMVCAnJywKICAgICAgICAgICAgcXVhbnRpdHkgSU5URUdFUiBERUZBVUxUIDEsCiAgICAgICAgICAgIGZpbmlzaCBURVhUIERFRkFVTFQgJ05PUk1BTCcsCiAgICAgICAgICAgIGNvbmRpdGlvbiBURVhUIERFRkFVTFQgJycsCiAgICAgICAgICAgIGxhbmd1YWdlIFRFWFQgREVGQVVMVCAnJywKICAgICAgICAgICAgbm90ZXMgVEVYVCBERUZBVUxUICcnLAogICAgICAgICAgICB0YWdzIFRFWFQgREVGQVVMVCAnJywKICAgICAgICAgICAgc2V0X2NvZGUgVEVYVCBERUZBVUxUICcnLAogICAgICAgICAgICBjb2xsZWN0b3JfbnVtYmVyIFRFWFQgREVGQVVMVCAnJywKICAgICAgICAgICAgY3JlYXRlZF9hdCBURVhUIERFRkFVTFQgKGRhdGV0aW1lKCdub3cnKSksCiAgICAgICAgICAgIHVwZGF0ZWRfYXQgVEVYVCBERUZBVUxUIChkYXRldGltZSgnbm93JykpCiAgICAgICAgKTsKCiAgICAgICAgQ1JFQVRFIElOREVYIElGIE5PVCBFWElTVFMgaWR4X2NlX25hbWUgT04gY29sbGVjdGlvbl9lbnRyaWVzKG5hbWUpOwogICAgICAgIENSRUFURSBJTkRFWCBJRiBOT1QgRVhJU1RTIGlkeF9jZV9jb2xvcl9pZGVudGl0eSBPTiBjb2xsZWN0aW9uX2VudHJpZXMoY29sb3JfaWRlbnRpdHkpOwogICAgICAgIENSRUFURSBJTkRFWCBJRiBOT1QgRVhJU1RTIGlkeF9jZV90eXBlX2xpbmUgT04gY29sbGVjdGlvbl9lbnRyaWVzKHR5cGVfbGluZSk7CiAgICAgICAgQ1JFQVRFIElOREVYIElGIE5PVCBFWElTVFMgaWR4X2NlX2lzX2xlZ2VuZGFyeSBPTiBjb2xsZWN0aW9uX2VudHJpZXMoaXNfbGVnZW5kYXJ5KTsKICAgICAgICBDUkVBVEUgSU5ERVggSUYgTk9UIEVYSVNUUyBpZHhfY2VfY21jIE9OIGNvbGxlY3Rpb25fZW50cmllcyhjbWMpOwogICAgICAgIENSRUFURSBJTkRFWCBJRiBOT1QgRVhJU1RTIGlkeF9jZV9jYXRlZ29yeSBPTiBjb2xsZWN0aW9uX2VudHJpZXMoY2F0ZWdvcnkpOwogICAgICAgIENSRUFURSBJTkRFWCBJRiBOT1QgRVhJU1RTIGlkeF9jZV9zZXRfY29kZSBPTiBjb2xsZWN0aW9uX2VudHJpZXMoc2V0X2NvZGUpOwogICAgICAgIENSRUFURSBJTkRFWCBJRiBOT1QgRVhJU1RTIGlkeF9jZV9jb2xsZWN0b3JfbnVtYmVyIE9OIGNvbGxlY3Rpb25fZW50cmllcyhjb2xsZWN0b3JfbnVtYmVyKTsKICAgICAgICBDUkVBVEUgSU5ERVggSUYgTk9UIEVYSVNUUyBpZHhfY2VfZmluaXNoIE9OIGNvbGxlY3Rpb25fZW50cmllcyhmaW5pc2gpOwoKICAgICAgICBDUkVBVEUgSU5ERVggSUYgTk9UIEVYSVNUUyBpZHhfY3JfbmFtZSBPTiBjYXJkX3JlY29yZHMobmFtZSk7CgogICAgICAgIENSRUFURSBUQUJMRSBJRiBOT1QgRVhJU1RTIGRlY2tzICgKICAgICAgICAgICAgaWQgSU5URUdFUiBQUklNQVJZIEtFWSBBVVRPSU5DUkVNRU5ULAogICAgICAgICAgICBuYW1lIFRFWFQgTk9UIE5VTEwsCiAgICAgICAgICAgIGNvbW1hbmRlcl9zY3J5ZmFsbF9pZCBURVhUIERFRkFVTFQgJycsCiAgICAgICAgICAgIGNvbW1hbmRlcl9uYW1lIFRFWFQgREVGQVVMVCAnJywKICAgICAgICAgICAgY29sb3JfaWRlbnRpdHkgVEVYVCBERUZBVUxUICdbXScsCiAgICAgICAgICAgIHN0cmF0ZWd5X3RhZyBURVhUIERFRkFVTFQgJycsCiAgICAgICAgICAgIGNyZWF0ZWRfYXQgVEVYVCBERUZBVUxUIChkYXRldGltZSgnbm93JykpLAogICAgICAgICAgICB1cGRhdGVkX2F0IFRFWFQgREVGQVVMVCAoZGF0ZXRpbWUoJ25vdycpKQogICAgICAgICk7CgogICAgICAgIENSRUFURSBUQUJMRSBJRiBOT1QgRVhJU1RTIGRlY2tfY2FyZHMgKAogICAgICAgICAgICBpZCBJTlRFR0VSIFBSSU1BUlkgS0VZIEFVVE9JTkNSRU1FTlQsCiAgICAgICAgICAgIGRlY2tfaWQgSU5URUdFUiBOT1QgTlVMTCwKICAgICAgICAgICAgc2NyeWZhbGxfaWQgVEVYVCBOT1QgTlVMTCwKICAgICAgICAgICAgY2FyZF9uYW1lIFRFWFQgREVGQVVMVCAnJywKICAgICAgICAgICAgcXVhbnRpdHkgSU5URUdFUiBERUZBVUxUIDEsCiAgICAgICAgICAgIGlzX2NvbW1hbmRlciBJTlRFR0VSIERFRkFVTFQgMCwKICAgICAgICAgICAgcm9sZV90YWcgVEVYVCBERUZBVUxUICcnLAogICAgICAgICAgICBGT1JFSUdOIEtFWSAoZGVja19pZCkgUkVGRVJFTkNFUyBkZWNrcyhpZCkgT04gREVMRVRFIENBU0NBREUKICAgICAgICApOwoKICAgICAgICBDUkVBVEUgSU5ERVggSUYgTk9UIEVYSVNUUyBpZHhfZGNfZGVja19pZCBPTiBkZWNrX2NhcmRzKGRlY2tfaWQpOwogICAgICAgIENSRUFURSBJTkRFWCBJRiBOT1QgRVhJU1RTIGlkeF9kY19zY3J5ZmFsbF9pZCBPTiBkZWNrX2NhcmRzKHNjcnlmYWxsX2lkKTsKICAgICAgICBDUkVBVEUgSU5ERVggSUYgTk9UIEVYSVNUUyBpZHhfZGtfY29tbWFuZGVyIE9OIGRlY2tzKGNvbW1hbmRlcl9zY3J5ZmFsbF9pZCk7CiAgICAiIiIpCgogICAgY29ubi5jb21taXQoKQoKICAgICMg4pSA4pSAIE1pZ3JhdGlvbjogYWRkIGNvbHVtbnMgdG8gZXhpc3RpbmcgREJzIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgAogICAgX21pZ3JhdGVfY29sdW1ucyA9IFsKICAgICAgICAoIm1hbmFfY29zdCIsICJURVhUIERFRkFVTFQgJyciKSwKICAgICAgICAoInBvd2VyIiwgIlRFWFQgREVGQVVMVCAnJyIpLAogICAgICAgICgidG91Z2huZXNzIiwgIlRFWFQgREVGQVVMVCAnJyIpLAogICAgICAgICgicmFyaXR5IiwgIlRFWFQgREVGQVVMVCAnJyIpLAogICAgICAgICgic2V0X25hbWUiLCAiVEVYVCBERUZBVUxUICcnIiksCiAgICAgICAgKCJlZGhyZWNfcmFuayIsICJJTlRFR0VSIERFRkFVTFQgMCIpLAogICAgXQogICAgZXhpc3RpbmdfY29scyA9IHtyb3dbMV0gZm9yIHJvdyBpbiBjb25uLmV4ZWN1dGUoIlBSQUdNQSB0YWJsZV9pbmZvKGNvbGxlY3Rpb25fZW50cmllcykiKS5mZXRjaGFsbCgpfQogICAgZm9yIGNvbF9uYW1lLCBjb2xfZGVmIGluIF9taWdyYXRlX2NvbHVtbnM6CiAgICAgICAgaWYgY29sX25hbWUgbm90IGluIGV4aXN0aW5nX2NvbHM6CiAgICAgICAgICAgIGNvbm4uZXhlY3V0ZShmIkFMVEVSIFRBQkxFIGNvbGxlY3Rpb25fZW50cmllcyBBREQgQ09MVU1OIHtjb2xfbmFtZX0ge2NvbF9kZWZ9IikKICAgICAgICAgICAgbG9nX2NvbGxlY3QuaW5mbyhmIiAgTWlncmF0aW9uOiBhZGRlZCBjb2x1bW4gJ3tjb2xfbmFtZX0nIHRvIGNvbGxlY3Rpb25fZW50cmllcyIpCiAgICBjb25uLmNvbW1pdCgpCiAgICBjb25uLmNsb3NlKCkKICAgIGxvZ19jb2xsZWN0LmluZm8oZiIgIENvbGxlY3Rpb24gREI6IHtDT0xMRUNUSU9OX0RCX1BBVEh9IikKCgojIEZpZWxkcyBzdG9yZWQgYXMgSlNPTiBzdHJpbmdzIGluIFNRTGl0ZSB0aGF0IHNob3VsZCBiZSByZXR1cm5lZCBhcyBwYXJzZWQgYXJyYXlzCl9KU09OX0ZJRUxEUyA9ICgiY2F0ZWdvcnkiLCAiY29sb3JfaWRlbnRpdHkiLCAic3VidHlwZXMiLCAia2V5d29yZHMiKQoKCmRlZiBfcm93X3RvX2RpY3Qocm93KSAtPiBkaWN0OgogICAgIiIiQ29udmVydCBhIHNxbGl0ZTMuUm93IHRvIGEgcGxhaW4gZGljdCwgcGFyc2luZyBKU09OIGFycmF5IGZpZWxkcy4iIiIKICAgIGlmIHJvdyBpcyBOb25lOgogICAgICAgIHJldHVybiBOb25lCiAgICBkID0gZGljdChyb3cpCiAgICBmb3IgZiBpbiBfSlNPTl9GSUVMRFM6CiAgICAgICAgaWYgZiBpbiBkIGFuZCBpc2luc3RhbmNlKGRbZl0sIHN0cik6CiAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgIGRbZl0gPSBqc29uLmxvYWRzKGRbZl0pCiAgICAgICAgICAgIGV4Y2VwdCAoanNvbi5KU09ORGVjb2RlRXJyb3IsIFR5cGVFcnJvcik6CiAgICAgICAgICAgICAgICBkW2ZdID0gW10KICAgIHJldHVybiBkCgoKZGVmIF9zbmFrZV90b19jYW1lbChzOiBzdHIpIC0+IHN0cjoKICAgICIiIkNvbnZlcnQgc25ha2VfY2FzZSB0byBjYW1lbENhc2UuIiIiCiAgICBwYXJ0cyA9IHMuc3BsaXQoIl8iKQogICAgcmV0dXJuIHBhcnRzWzBdICsgIiIuam9pbihwLmNhcGl0YWxpemUoKSBmb3IgcCBpbiBwYXJ0c1sxOl0pCgoKZGVmIF9hZGRfaW1hZ2VfdXJsKGNhcmQ6IGRpY3QpIC0+IGRpY3Q6CiAgICAiIiJBZGQgaW1hZ2VVcmwgZmllbGQgYW5kIGNhbWVsQ2FzZSBhbGlhc2VzIGZvciBKUyBjb25zdW1wdGlvbi4iIiIKICAgIHNjcnlmYWxsX2lkID0gY2FyZC5nZXQoInNjcnlmYWxsX2lkIiwgIiIpCiAgICBpZiBzY3J5ZmFsbF9pZDoKICAgICAgICBjYXJkWyJpbWFnZVVybCJdID0gZiJodHRwczovL2FwaS5zY3J5ZmFsbC5jb20vY2FyZHMve3NjcnlmYWxsX2lkfT9mb3JtYXQ9aW1hZ2UmdmVyc2lvbj1ub3JtYWwiCiAgICBlbHNlOgogICAgICAgIGNhcmRbImltYWdlVXJsIl0gPSBOb25lCiAgICAjIEFkZCBjYW1lbENhc2UgYWxpYXNlcyBmb3IgYWxsIHNuYWtlX2Nhc2Uga2V5cwogICAgZm9yIGtleSBpbiBsaXN0KGNhcmQua2V5cygpKToKICAgICAgICBpZiAiXyIgaW4ga2V5OgogICAgICAgICAgICBjYW1lbCA9IF9zbmFrZV90b19jYW1lbChrZXkpCiAgICAgICAgICAgIGlmIGNhbWVsIG5vdCBpbiBjYXJkOgogICAgICAgICAgICAgICAgY2FyZFtjYW1lbF0gPSBjYXJkW2tleV0KICAgIHJldHVybiBjYXJkCgoKZGVmIF9idWlsZF9jb2xsZWN0aW9uX2ZpbHRlcnMoCiAgICBxOiBPcHRpb25hbFtzdHJdID0gTm9uZSwKICAgIGNvbG9yczogT3B0aW9uYWxbc3RyXSA9IE5vbmUsCiAgICB0eXBlczogT3B0aW9uYWxbc3RyXSA9IE5vbmUsCiAgICBpc0xlZ2VuZGFyeTogT3B0aW9uYWxbYm9vbF0gPSBOb25lLAogICAgaXNCYXNpYzogT3B0aW9uYWxbYm9vbF0gPSBOb25lLAogICAgaXNHYW1lQ2hhbmdlcjogT3B0aW9uYWxbYm9vbF0gPSBOb25lLAogICAgaGlnaFNhbHQ6IE9wdGlvbmFsW2Jvb2xdID0gTm9uZSwKICAgIGZpbmlzaDogT3B0aW9uYWxbc3RyXSA9IE5vbmUsCiAgICBjbWNNaW46IE9wdGlvbmFsW2Zsb2F0XSA9IE5vbmUsCiAgICBjbWNNYXg6IE9wdGlvbmFsW2Zsb2F0XSA9IE5vbmUsCiAgICBwcmljZU1pbjogT3B0aW9uYWxbZmxvYXRdID0gTm9uZSwKICAgIHByaWNlTWF4OiBPcHRpb25hbFtmbG9hdF0gPSBOb25lLAogICAgY2F0ZWdvcnk6IE9wdGlvbmFsW3N0cl0gPSBOb25lLAogICAgcmFyaXR5OiBPcHRpb25hbFtzdHJdID0gTm9uZSwKICAgIHNldENvZGU6IE9wdGlvbmFsW3N0cl0gPSBOb25lLAogICAgcG93ZXJNaW46IE9wdGlvbmFsW3N0cl0gPSBOb25lLAogICAgcG93ZXJNYXg6IE9wdGlvbmFsW3N0cl0gPSBOb25lLAogICAgdG91Z2hNaW46IE9wdGlvbmFsW3N0cl0gPSBOb25lLAogICAgdG91Z2hNYXg6IE9wdGlvbmFsW3N0cl0gPSBOb25lLAogICAga2V5d29yZDogT3B0aW9uYWxbc3RyXSA9IE5vbmUsCiAgICBlZGhyZWNNaW46IE9wdGlvbmFsW2ludF0gPSBOb25lLAogICAgZWRocmVjTWF4OiBPcHRpb25hbFtpbnRdID0gTm9uZSwKICAgIHF0eU1pbjogT3B0aW9uYWxbaW50XSA9IE5vbmUsCiAgICBxdHlNYXg6IE9wdGlvbmFsW2ludF0gPSBOb25lLAopIC0+IHR1cGxlOgogICAgIiIiQnVpbGQgV0hFUkUgY2xhdXNlIGFuZCBwYXJhbXMgZm9yIGNvbGxlY3Rpb24gcXVlcmllcy4gUmV0dXJucyAod2hlcmVfc3RyLCBwYXJhbXNfbGlzdCkuIiIiCiAgICBjb25kaXRpb25zID0gW10KICAgIHBhcmFtcyA9IFtdCgogICAgaWYgcToKICAgICAgICBsaWtlX3EgPSBmIiV7cX0lIgogICAgICAgIGNvbmRpdGlvbnMuYXBwZW5kKCIobmFtZSBMSUtFID8gT1IgdHlwZV9saW5lIExJS0UgPyBPUiBvcmFjbGVfdGV4dCBMSUtFID8pIikKICAgICAgICBwYXJhbXMuZXh0ZW5kKFtsaWtlX3EsIGxpa2VfcSwgbGlrZV9xXSkKCiAgICBpZiBjb2xvcnM6CiAgICAgICAgY29sb3JfbGlzdCA9IFtjLnN0cmlwKCkudXBwZXIoKSBmb3IgYyBpbiBjb2xvcnMuc3BsaXQoIiwiKSBpZiBjLnN0cmlwKCldCiAgICAgICAgZm9yIGNvbG9yIGluIGNvbG9yX2xpc3Q6CiAgICAgICAgICAgIGNvbmRpdGlvbnMuYXBwZW5kKCJjb2xvcl9pZGVudGl0eSBMSUtFID8iKQogICAgICAgICAgICBwYXJhbXMuYXBwZW5kKGYnJSJ7Y29sb3J9IiUnKQoKICAgIGlmIHR5cGVzOgogICAgICAgIHR5cGVfbGlzdCA9IFt0LnN0cmlwKCkgZm9yIHQgaW4gdHlwZXMuc3BsaXQoIiwiKSBpZiB0LnN0cmlwKCldCiAgICAgICAgdHlwZV9jb25kaXRpb25zID0gW10KICAgICAgICBmb3IgdCBpbiB0eXBlX2xpc3Q6CiAgICAgICAgICAgIHR5cGVfY29uZGl0aW9ucy5hcHBlbmQoInR5cGVfbGluZSBMSUtFID8iKQogICAgICAgICAgICBwYXJhbXMuYXBwZW5kKGYiJXt0fSUiKQogICAgICAgIGlmIHR5cGVfY29uZGl0aW9uczoKICAgICAgICAgICAgY29uZGl0aW9ucy5hcHBlbmQoZiIoeycgT1IgJy5qb2luKHR5cGVfY29uZGl0aW9ucyl9KSIpCgogICAgaWYgaXNMZWdlbmRhcnkgaXMgbm90IE5vbmU6CiAgICAgICAgY29uZGl0aW9ucy5hcHBlbmQoImlzX2xlZ2VuZGFyeSA9ID8iKQogICAgICAgIHBhcmFtcy5hcHBlbmQoMSBpZiBpc0xlZ2VuZGFyeSBlbHNlIDApCgogICAgaWYgaXNCYXNpYyBpcyBub3QgTm9uZToKICAgICAgICBjb25kaXRpb25zLmFwcGVuZCgiaXNfYmFzaWMgPSA/IikKICAgICAgICBwYXJhbXMuYXBwZW5kKDEgaWYgaXNCYXNpYyBlbHNlIDApCgogICAgaWYgaXNHYW1lQ2hhbmdlciBpcyBub3QgTm9uZToKICAgICAgICBjb25kaXRpb25zLmFwcGVuZCgiaXNfZ2FtZV9jaGFuZ2VyID0gPyIpCiAgICAgICAgcGFyYW1zLmFwcGVuZCgxIGlmIGlzR2FtZUNoYW5nZXIgZWxzZSAwKQoKICAgIGlmIGhpZ2hTYWx0OgogICAgICAgIGNvbmRpdGlvbnMuYXBwZW5kKCJzYWx0X3Njb3JlID4gMi4wIikKCiAgICBpZiBmaW5pc2g6CiAgICAgICAgY29uZGl0aW9ucy5hcHBlbmQoImZpbmlzaCA9ID8iKQogICAgICAgIHBhcmFtcy5hcHBlbmQoZmluaXNoLnVwcGVyKCkpCgogICAgaWYgY21jTWluIGlzIG5vdCBOb25lOgogICAgICAgIGNvbmRpdGlvbnMuYXBwZW5kKCJjbWMgPj0gPyIpCiAgICAgICAgcGFyYW1zLmFwcGVuZChjbWNNaW4pCgogICAgaWYgY21jTWF4IGlzIG5vdCBOb25lOgogICAgICAgIGNvbmRpdGlvbnMuYXBwZW5kKCJjbWMgPD0gPyIpCiAgICAgICAgcGFyYW1zLmFwcGVuZChjbWNNYXgpCgogICAgaWYgcHJpY2VNaW4gaXMgbm90IE5vbmU6CiAgICAgICAgY29uZGl0aW9ucy5hcHBlbmQoInRjZ19wcmljZSA+PSA/IikKICAgICAgICBwYXJhbXMuYXBwZW5kKHByaWNlTWluKQoKICAgIGlmIHByaWNlTWF4IGlzIG5vdCBOb25lOgogICAgICAgIGNvbmRpdGlvbnMuYXBwZW5kKCJ0Y2dfcHJpY2UgPD0gPyIpCiAgICAgICAgcGFyYW1zLmFwcGVuZChwcmljZU1heCkKCiAgICBpZiBjYXRlZ29yeToKICAgICAgICBjYXRfbGlzdCA9IFtjLnN0cmlwKCkgZm9yIGMgaW4gY2F0ZWdvcnkuc3BsaXQoIiwiKSBpZiBjLnN0cmlwKCldCiAgICAgICAgY2F0X2NvbmRpdGlvbnMgPSBbXQogICAgICAgIGZvciBjIGluIGNhdF9saXN0OgogICAgICAgICAgICBjYXRfY29uZGl0aW9ucy5hcHBlbmQoImNhdGVnb3J5IExJS0UgPyIpCiAgICAgICAgICAgIHBhcmFtcy5hcHBlbmQoZiclIntjfSIlJykKICAgICAgICBpZiBjYXRfY29uZGl0aW9uczoKICAgICAgICAgICAgY29uZGl0aW9ucy5hcHBlbmQoZiIoeycgT1IgJy5qb2luKGNhdF9jb25kaXRpb25zKX0pIikKCiAgICAjIOKUgOKUgCBOZXcgZmlsdGVycyDilIDilIAKCiAgICBpZiByYXJpdHk6CiAgICAgICAgcmFyX2xpc3QgPSBbci5zdHJpcCgpLmxvd2VyKCkgZm9yIHIgaW4gcmFyaXR5LnNwbGl0KCIsIikgaWYgci5zdHJpcCgpXQogICAgICAgIGlmIHJhcl9saXN0OgogICAgICAgICAgICBwbGFjZWhvbGRlcnMgPSAiLCIuam9pbihbIj8iXSAqIGxlbihyYXJfbGlzdCkpCiAgICAgICAgICAgIGNvbmRpdGlvbnMuYXBwZW5kKGYiTE9XRVIocmFyaXR5KSBJTiAoe3BsYWNlaG9sZGVyc30pIikKICAgICAgICAgICAgcGFyYW1zLmV4dGVuZChyYXJfbGlzdCkKCiAgICBpZiBzZXRDb2RlOgogICAgICAgIHNldF9saXN0ID0gW3Muc3RyaXAoKS51cHBlcigpIGZvciBzIGluIHNldENvZGUuc3BsaXQoIiwiKSBpZiBzLnN0cmlwKCldCiAgICAgICAgaWYgc2V0X2xpc3Q6CiAgICAgICAgICAgIHBsYWNlaG9sZGVycyA9ICIsIi5qb2luKFsiPyJdICogbGVuKHNldF9saXN0KSkKICAgICAgICAgICAgY29uZGl0aW9ucy5hcHBlbmQoZiJVUFBFUihzZXRfY29kZSkgSU4gKHtwbGFjZWhvbGRlcnN9KSIpCiAgICAgICAgICAgIHBhcmFtcy5leHRlbmQoc2V0X2xpc3QpCgogICAgaWYgcG93ZXJNaW4gaXMgbm90IE5vbmU6CiAgICAgICAgY29uZGl0aW9ucy5hcHBlbmQoIkNBU1QocG93ZXIgQVMgUkVBTCkgPj0gPyIpCiAgICAgICAgcGFyYW1zLmFwcGVuZChmbG9hdChwb3dlck1pbikpCgogICAgaWYgcG93ZXJNYXggaXMgbm90IE5vbmU6CiAgICAgICAgY29uZGl0aW9ucy5hcHBlbmQoIkNBU1QocG93ZXIgQVMgUkVBTCkgPD0gPyIpCiAgICAgICAgcGFyYW1zLmFwcGVuZChmbG9hdChwb3dlck1heCkpCgogICAgaWYgdG91Z2hNaW4gaXMgbm90IE5vbmU6CiAgICAgICAgY29uZGl0aW9ucy5hcHBlbmQoIkNBU1QodG91Z2huZXNzIEFTIFJFQUwpID49ID8iKQogICAgICAgIHBhcmFtcy5hcHBlbmQoZmxvYXQodG91Z2hNaW4pKQoKICAgIGlmIHRvdWdoTWF4IGlzIG5vdCBOb25lOgogICAgICAgIGNvbmRpdGlvbnMuYXBwZW5kKCJDQVNUKHRvdWdobmVzcyBBUyBSRUFMKSA8PSA/IikKICAgICAgICBwYXJhbXMuYXBwZW5kKGZsb2F0KHRvdWdoTWF4KSkKCiAgICBpZiBrZXl3b3JkOgogICAgICAgIGt3X2xpc3QgPSBbay5zdHJpcCgpIGZvciBrIGluIGtleXdvcmQuc3BsaXQoIiwiKSBpZiBrLnN0cmlwKCldCiAgICAgICAgZm9yIGt3IGluIGt3X2xpc3Q6CiAgICAgICAgICAgIGNvbmRpdGlvbnMuYXBwZW5kKCJrZXl3b3JkcyBMSUtFID8iKQogICAgICAgICAgICBwYXJhbXMuYXBwZW5kKGYiJXtrd30lIikKCiAgICBpZiBlZGhyZWNNaW4gaXMgbm90IE5vbmU6CiAgICAgICAgY29uZGl0aW9ucy5hcHBlbmQoImVkaHJlY19yYW5rID49ID8iKQogICAgICAgIHBhcmFtcy5hcHBlbmQoZWRocmVjTWluKQoKICAgIGlmIGVkaHJlY01heCBpcyBub3QgTm9uZToKICAgICAgICBjb25kaXRpb25zLmFwcGVuZCgiZWRocmVjX3JhbmsgPD0gPyIpCiAgICAgICAgcGFyYW1zLmFwcGVuZChlZGhyZWNNYXgpCgogICAgaWYgcXR5TWluIGlzIG5vdCBOb25lOgogICAgICAgIGNvbmRpdGlvbnMuYXBwZW5kKCJxdWFudGl0eSA+PSA/IikKICAgICAgICBwYXJhbXMuYXBwZW5kKHF0eU1pbikKCiAgICBpZiBxdHlNYXggaXMgbm90IE5vbmU6CiAgICAgICAgY29uZGl0aW9ucy5hcHBlbmQoInF1YW50aXR5IDw9ID8iKQogICAgICAgIHBhcmFtcy5hcHBlbmQocXR5TWF4KQoKICAgIHdoZXJlX3N0ciA9ICIiCiAgICBpZiBjb25kaXRpb25zOgogICAgICAgIHdoZXJlX3N0ciA9ICJXSEVSRSAiICsgIiBBTkQgIi5qb2luKGNvbmRpdGlvbnMpCgogICAgcmV0dXJuIHdoZXJlX3N0ciwgcGFyYW1zCgoKIyDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZAKIyBDb2xsZWN0aW9uIENSVUQgRW5kcG9pbnRzCiMg4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQCgpWQUxJRF9TT1JUX0ZJRUxEUyA9IHsibmFtZSIsICJjbWMiLCAidGNnX3ByaWNlIiwgInNhbHRfc2NvcmUiLCAiY2F0ZWdvcnkiLCAiY29sb3JfaWRlbnRpdHkiLCAicXVhbnRpdHkiLCAidHlwZV9saW5lIiwgImZpbmlzaCIsICJyYXJpdHkiLCAic2V0X2NvZGUiLCAicG93ZXIiLCAidG91Z2huZXNzIiwgImVkaHJlY19yYW5rIn0KCgpAYXBwLmdldCgiL2FwaS9jb2xsZWN0aW9uL2V4cG9ydCIpCmFzeW5jIGRlZiBleHBvcnRfY29sbGVjdGlvbigKICAgIGZvcm1hdDogc3RyID0gIklOVEVSTkFMX0NTViIsCiAgICBxOiBPcHRpb25hbFtzdHJdID0gTm9uZSwKICAgIGNvbG9yczogT3B0aW9uYWxbc3RyXSA9IE5vbmUsCiAgICB0eXBlczogT3B0aW9uYWxbc3RyXSA9IE5vbmUsCiAgICBpc0xlZ2VuZGFyeTogT3B0aW9uYWxbYm9vbF0gPSBOb25lLAogICAgaXNCYXNpYzogT3B0aW9uYWxbYm9vbF0gPSBOb25lLAogICAgaXNHYW1lQ2hhbmdlcjogT3B0aW9uYWxbYm9vbF0gPSBOb25lLAogICAgaGlnaFNhbHQ6IE9wdGlvbmFsW2Jvb2xdID0gTm9uZSwKICAgIGZpbmlzaDogT3B0aW9uYWxbc3RyXSA9IE5vbmUsCiAgICBjbWNNaW46IE9wdGlvbmFsW2Zsb2F0XSA9IE5vbmUsCiAgICBjbWNNYXg6IE9wdGlvbmFsW2Zsb2F0XSA9IE5vbmUsCiAgICBwcmljZU1pbjogT3B0aW9uYWxbZmxvYXRdID0gTm9uZSwKICAgIHByaWNlTWF4OiBPcHRpb25hbFtmbG9hdF0gPSBOb25lLAogICAgY2F0ZWdvcnk6IE9wdGlvbmFsW3N0cl0gPSBOb25lLAopOgogICAgIiIiRXhwb3J0IGNvbGxlY3Rpb24gaW4gdmFyaW91cyBmb3JtYXRzIHdpdGggb3B0aW9uYWwgZmlsdGVycy4iIiIKICAgIHdoZXJlX3N0ciwgcGFyYW1zID0gX2J1aWxkX2NvbGxlY3Rpb25fZmlsdGVycygKICAgICAgICBxPXEsIGNvbG9ycz1jb2xvcnMsIHR5cGVzPXR5cGVzLCBpc0xlZ2VuZGFyeT1pc0xlZ2VuZGFyeSwKICAgICAgICBpc0Jhc2ljPWlzQmFzaWMsIGlzR2FtZUNoYW5nZXI9aXNHYW1lQ2hhbmdlciwgaGlnaFNhbHQ9aGlnaFNhbHQsCiAgICAgICAgZmluaXNoPWZpbmlzaCwgY21jTWluPWNtY01pbiwgY21jTWF4PWNtY01heCwKICAgICAgICBwcmljZU1pbj1wcmljZU1pbiwgcHJpY2VNYXg9cHJpY2VNYXgsIGNhdGVnb3J5PWNhdGVnb3J5LAogICAgKQoKICAgIHNxbCA9IGYiU0VMRUNUICogRlJPTSBjb2xsZWN0aW9uX2VudHJpZXMge3doZXJlX3N0cn0gT1JERVIgQlkgbmFtZSBBU0MiCiAgICBjb25uID0gX2dldF9kYl9jb25uKCkKICAgIHJvd3MgPSBbX3Jvd190b19kaWN0KHIpIGZvciByIGluIGNvbm4uZXhlY3V0ZShzcWwsIHBhcmFtcykuZmV0Y2hhbGwoKV0KCiAgICBmbXQgPSBmb3JtYXQudXBwZXIoKQogICAgb3V0cHV0ID0gaW8uU3RyaW5nSU8oKQoKICAgIGlmIGZtdCA9PSAiSU5URVJOQUxfQ1NWIjoKICAgICAgICBpZiByb3dzOgogICAgICAgICAgICBmaWVsZG5hbWVzID0gbGlzdChyb3dzWzBdLmtleXMoKSkKICAgICAgICBlbHNlOgogICAgICAgICAgICBmaWVsZG5hbWVzID0gWwogICAgICAgICAgICAgICAgImlkIiwgIm5hbWUiLCAidHlwZV9saW5lIiwgInN1YnR5cGVzIiwgImlzX2xlZ2VuZGFyeSIsICJpc19iYXNpYyIsCiAgICAgICAgICAgICAgICAiY29sb3JfaWRlbnRpdHkiLCAiY21jIiwgIm9yYWNsZV90ZXh0IiwgImtleXdvcmRzIiwgInRjZ19wcmljZSIsCiAgICAgICAgICAgICAgICAic2FsdF9zY29yZSIsICJpc19nYW1lX2NoYW5nZXIiLCAiY2F0ZWdvcnkiLCAic2NyeWZhbGxfaWQiLCAidGNncGxheWVyX2lkIiwKICAgICAgICAgICAgICAgICJxdWFudGl0eSIsICJmaW5pc2giLCAiY29uZGl0aW9uIiwgImxhbmd1YWdlIiwgIm5vdGVzIiwgInRhZ3MiLAogICAgICAgICAgICAgICAgInNldF9jb2RlIiwgImNvbGxlY3Rvcl9udW1iZXIiLCAiY3JlYXRlZF9hdCIsICJ1cGRhdGVkX2F0IiwKICAgICAgICAgICAgXQogICAgICAgIHdyaXRlciA9IGNzdi5EaWN0V3JpdGVyKG91dHB1dCwgZmllbGRuYW1lcz1maWVsZG5hbWVzKQogICAgICAgIHdyaXRlci53cml0ZWhlYWRlcigpCiAgICAgICAgd3JpdGVyLndyaXRlcm93cyhyb3dzKQogICAgICAgIGZpbGVuYW1lID0gImNvbGxlY3Rpb25fZXhwb3J0LmNzdiIKICAgICAgICBtZWRpYV90eXBlID0gInRleHQvY3N2IgoKICAgIGVsaWYgZm10ID09ICJNT1hGSUVMRF9DU1YiOgogICAgICAgIGZpZWxkbmFtZXMgPSBbIkNvdW50IiwgIk5hbWUiLCAiRWRpdGlvbiIsICJDb25kaXRpb24iLCAiTGFuZ3VhZ2UiLCAiRm9pbCIsICJDb2xsZWN0b3IgTnVtYmVyIl0KICAgICAgICB3cml0ZXIgPSBjc3YuRGljdFdyaXRlcihvdXRwdXQsIGZpZWxkbmFtZXM9ZmllbGRuYW1lcykKICAgICAgICB3cml0ZXIud3JpdGVoZWFkZXIoKQogICAgICAgIGZvciByb3cgaW4gcm93czoKICAgICAgICAgICAgZmluaXNoX3ZhbCA9IHJvdy5nZXQoImZpbmlzaCIsICJOT1JNQUwiKS51cHBlcigpCiAgICAgICAgICAgIGZvaWxfdmFsID0gImZvaWwiIGlmIGZpbmlzaF92YWwgPT0gIkZPSUwiIGVsc2UgKCJldGNoZWQiIGlmIGZpbmlzaF92YWwgPT0gIkVUQ0hFRCIgZWxzZSAiIikKICAgICAgICAgICAgd3JpdGVyLndyaXRlcm93KHsKICAgICAgICAgICAgICAgICJDb3VudCI6IHJvdy5nZXQoInF1YW50aXR5IiwgMSksCiAgICAgICAgICAgICAgICAiTmFtZSI6IHJvdy5nZXQoIm5hbWUiLCAiIiksCiAgICAgICAgICAgICAgICAiRWRpdGlvbiI6IHJvdy5nZXQoInNldF9jb2RlIiwgIiIpLnVwcGVyKCksCiAgICAgICAgICAgICAgICAiQ29uZGl0aW9uIjogcm93LmdldCgiY29uZGl0aW9uIiwgIiIpLAogICAgICAgICAgICAgICAgIkxhbmd1YWdlIjogcm93LmdldCgibGFuZ3VhZ2UiLCAiIiksCiAgICAgICAgICAgICAgICAiRm9pbCI6IGZvaWxfdmFsLAogICAgICAgICAgICAgICAgIkNvbGxlY3RvciBOdW1iZXIiOiByb3cuZ2V0KCJjb2xsZWN0b3JfbnVtYmVyIiwgIiIpLAogICAgICAgICAgICB9KQogICAgICAgIGZpbGVuYW1lID0gImNvbGxlY3Rpb25fbW94ZmllbGQuY3N2IgogICAgICAgIG1lZGlhX3R5cGUgPSAidGV4dC9jc3YiCgogICAgZWxpZiBmbXQgPT0gIlRFWFQiOgogICAgICAgIGxpbmVzID0gW10KICAgICAgICBmb3Igcm93IGluIHJvd3M6CiAgICAgICAgICAgIHF0eSA9IHJvdy5nZXQoInF1YW50aXR5IiwgMSkKICAgICAgICAgICAgbmFtZSA9IHJvdy5nZXQoIm5hbWUiLCAiIikKICAgICAgICAgICAgc2V0X2NvZGUgPSByb3cuZ2V0KCJzZXRfY29kZSIsICIiKS51cHBlcigpCiAgICAgICAgICAgIGNvbGxfbnVtID0gcm93LmdldCgiY29sbGVjdG9yX251bWJlciIsICIiKQogICAgICAgICAgICBpZiBzZXRfY29kZSBhbmQgY29sbF9udW06CiAgICAgICAgICAgICAgICBsaW5lcy5hcHBlbmQoZiJ7cXR5fSB7bmFtZX0gKHtzZXRfY29kZX0pIHtjb2xsX251bX0iKQogICAgICAgICAgICBlbGlmIHNldF9jb2RlOgogICAgICAgICAgICAgICAgbGluZXMuYXBwZW5kKGYie3F0eX0ge25hbWV9ICh7c2V0X2NvZGV9KSIpCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBsaW5lcy5hcHBlbmQoZiJ7cXR5fSB7bmFtZX0iKQogICAgICAgIG91dHB1dC53cml0ZSgiXG4iLmpvaW4obGluZXMpKQogICAgICAgIGZpbGVuYW1lID0gImNvbGxlY3Rpb25fZXhwb3J0LnR4dCIKICAgICAgICBtZWRpYV90eXBlID0gInRleHQvcGxhaW4iCgogICAgZWxzZToKICAgICAgICByYWlzZSBIVFRQRXhjZXB0aW9uKDQwMCwgZiJVbmtub3duIGZvcm1hdDoge2Zvcm1hdH0uIFVzZSBJTlRFUk5BTF9DU1YsIE1PWEZJRUxEX0NTViwgb3IgVEVYVC4iKQoKICAgIGNvbnRlbnQgPSBvdXRwdXQuZ2V0dmFsdWUoKQoKICAgIGRlZiBpdGVyX2NvbnRlbnQoKToKICAgICAgICB5aWVsZCBjb250ZW50LmVuY29kZSgidXRmLTgiKQoKICAgIHJldHVybiBTdHJlYW1pbmdSZXNwb25zZSgKICAgICAgICBpdGVyX2NvbnRlbnQoKSwKICAgICAgICBtZWRpYV90eXBlPW1lZGlhX3R5cGUsCiAgICAgICAgaGVhZGVycz17IkNvbnRlbnQtRGlzcG9zaXRpb24iOiBmJ2F0dGFjaG1lbnQ7IGZpbGVuYW1lPSJ7ZmlsZW5hbWV9Iid9LAogICAgKQoKCkBhcHAuZ2V0KCIvYXBpL2NvbGxlY3Rpb24vc2V0cyIpCmFzeW5jIGRlZiBjb2xsZWN0aW9uX3NldHMoKToKICAgICIiIlJldHVybiBkaXN0aW5jdCBzZXQgY29kZXMgKyBuYW1lcyBpbiB0aGUgY29sbGVjdGlvbiAoZm9yIGZpbHRlciBhdXRvY29tcGxldGUpLiIiIgogICAgY29ubiA9IF9nZXRfZGJfY29ubigpCiAgICByb3dzID0gY29ubi5leGVjdXRlKAogICAgICAgICJTRUxFQ1QgRElTVElOQ1QgVVBQRVIoc2V0X2NvZGUpIGFzIGNvZGUsIHNldF9uYW1lIGFzIG5hbWUgRlJPTSBjb2xsZWN0aW9uX2VudHJpZXMgV0hFUkUgc2V0X2NvZGUgIT0gJycgT1JERVIgQlkgc2V0X25hbWUgQVNDIgogICAgKS5mZXRjaGFsbCgpCiAgICByZXN1bHQgPSBbXQogICAgZm9yIHIgaW4gcm93czoKICAgICAgICBjb2RlID0gclsiY29kZSJdIGlmICJjb2RlIiBpbiByLmtleXMoKSBlbHNlIHJbMF0KICAgICAgICBuYW1lID0gclsibmFtZSJdIGlmICJuYW1lIiBpbiByLmtleXMoKSBlbHNlIHJbMV0KICAgICAgICBpZiBjb2RlOgogICAgICAgICAgICByZXN1bHQuYXBwZW5kKHsiY29kZSI6IGNvZGUsICJuYW1lIjogbmFtZSBvciBjb2RlfSkKICAgIHJldHVybiBKU09OUmVzcG9uc2UocmVzdWx0KQoKCkBhcHAuZ2V0KCIvYXBpL2NvbGxlY3Rpb24va2V5d29yZHMiKQphc3luYyBkZWYgY29sbGVjdGlvbl9rZXl3b3JkcygpOgogICAgIiIiUmV0dXJuIGRpc3RpbmN0IGtleXdvcmRzIGZvdW5kIGluIHRoZSBjb2xsZWN0aW9uLiIiIgogICAgY29ubiA9IF9nZXRfZGJfY29ubigpCiAgICByb3dzID0gY29ubi5leGVjdXRlKCJTRUxFQ1Qga2V5d29yZHMgRlJPTSBjb2xsZWN0aW9uX2VudHJpZXMgV0hFUkUga2V5d29yZHMgIT0gJycgQU5EIGtleXdvcmRzICE9ICdbXSciKS5mZXRjaGFsbCgpCiAgICBrd19zZXQgPSBzZXQoKQogICAgZm9yIHIgaW4gcm93czoKICAgICAgICB0cnk6CiAgICAgICAgICAgIGt3cyA9IGpzb24ubG9hZHMoclsia2V5d29yZHMiXSkgaWYgaXNpbnN0YW5jZShyWyJrZXl3b3JkcyJdLCBzdHIpIGVsc2Ugclsia2V5d29yZHMiXQogICAgICAgICAgICBpZiBpc2luc3RhbmNlKGt3cywgbGlzdCk6CiAgICAgICAgICAgICAgICBmb3IgayBpbiBrd3M6CiAgICAgICAgICAgICAgICAgICAgaWYgazoKICAgICAgICAgICAgICAgICAgICAgICAga3dfc2V0LmFkZChrKQogICAgICAgIGV4Y2VwdCAoanNvbi5KU09ORGVjb2RlRXJyb3IsIFR5cGVFcnJvcik6CiAgICAgICAgICAgIHBhc3MKICAgIHJldHVybiBKU09OUmVzcG9uc2Uoc29ydGVkKGt3X3NldCkpCgoKQGFwcC5nZXQoIi9hcGkvY29sbGVjdGlvbiIpCmFzeW5jIGRlZiBsaXN0X2NvbGxlY3Rpb24oCiAgICBwYWdlOiBpbnQgPSAxLAogICAgcGFnZVNpemU6IGludCA9IDUwLAogICAgcTogT3B0aW9uYWxbc3RyXSA9IE5vbmUsCiAgICBzb3J0RmllbGQ6IE9wdGlvbmFsW3N0cl0gPSBOb25lLAogICAgc29ydERpcjogT3B0aW9uYWxbc3RyXSA9IE5vbmUsCiAgICBjb2xvcnM6IE9wdGlvbmFsW3N0cl0gPSBOb25lLAogICAgdHlwZXM6IE9wdGlvbmFsW3N0cl0gPSBOb25lLAogICAgaXNMZWdlbmRhcnk6IE9wdGlvbmFsW2Jvb2xdID0gTm9uZSwKICAgIGlzQmFzaWM6IE9wdGlvbmFsW2Jvb2xdID0gTm9uZSwKICAgIGlzR2FtZUNoYW5nZXI6IE9wdGlvbmFsW2Jvb2xdID0gTm9uZSwKICAgIGhpZ2hTYWx0OiBPcHRpb25hbFtib29sXSA9IE5vbmUsCiAgICBmaW5pc2g6IE9wdGlvbmFsW3N0cl0gPSBOb25lLAogICAgY21jTWluOiBPcHRpb25hbFtmbG9hdF0gPSBOb25lLAogICAgY21jTWF4OiBPcHRpb25hbFtmbG9hdF0gPSBOb25lLAogICAgcHJpY2VNaW46IE9wdGlvbmFsW2Zsb2F0XSA9IE5vbmUsCiAgICBwcmljZU1heDogT3B0aW9uYWxbZmxvYXRdID0gTm9uZSwKICAgIGNhdGVnb3J5OiBPcHRpb25hbFtzdHJdID0gTm9uZSwKICAgIGRlY2tfaWQ6IE9wdGlvbmFsW2ludF0gPSBOb25lLAogICAgcmFyaXR5OiBPcHRpb25hbFtzdHJdID0gTm9uZSwKICAgIHNldENvZGU6IE9wdGlvbmFsW3N0cl0gPSBOb25lLAogICAgcG93ZXJNaW46IE9wdGlvbmFsW3N0cl0gPSBOb25lLAogICAgcG93ZXJNYXg6IE9wdGlvbmFsW3N0cl0gPSBOb25lLAogICAgdG91Z2hNaW46IE9wdGlvbmFsW3N0cl0gPSBOb25lLAogICAgdG91Z2hNYXg6IE9wdGlvbmFsW3N0cl0gPSBOb25lLAogICAga2V5d29yZDogT3B0aW9uYWxbc3RyXSA9IE5vbmUsCiAgICBlZGhyZWNNaW46IE9wdGlvbmFsW2ludF0gPSBOb25lLAogICAgZWRocmVjTWF4OiBPcHRpb25hbFtpbnRdID0gTm9uZSwKICAgIHF0eU1pbjogT3B0aW9uYWxbaW50XSA9IE5vbmUsCiAgICBxdHlNYXg6IE9wdGlvbmFsW2ludF0gPSBOb25lLAopOgogICAgIiIiTGlzdCBjb2xsZWN0aW9uIGVudHJpZXMgd2l0aCBzZWFyY2gsIHNvcnQsIGFuZCBmaWx0ZXIuCiAgICBPcHRpb25hbCBkZWNrX2lkOiB3aGVuIHByb3ZpZGVkLCBpbmNsdWRlcyBpbl9kZWNrX3F1YW50aXR5IGZvciBlYWNoIHJlc3VsdC4KICAgICIiIgogICAgd2hlcmVfc3RyLCBwYXJhbXMgPSBfYnVpbGRfY29sbGVjdGlvbl9maWx0ZXJzKAogICAgICAgIHE9cSwgY29sb3JzPWNvbG9ycywgdHlwZXM9dHlwZXMsIGlzTGVnZW5kYXJ5PWlzTGVnZW5kYXJ5LAogICAgICAgIGlzQmFzaWM9aXNCYXNpYywgaXNHYW1lQ2hhbmdlcj1pc0dhbWVDaGFuZ2VyLCBoaWdoU2FsdD1oaWdoU2FsdCwKICAgICAgICBmaW5pc2g9ZmluaXNoLCBjbWNNaW49Y21jTWluLCBjbWNNYXg9Y21jTWF4LAogICAgICAgIHByaWNlTWluPXByaWNlTWluLCBwcmljZU1heD1wcmljZU1heCwgY2F0ZWdvcnk9Y2F0ZWdvcnksCiAgICAgICAgcmFyaXR5PXJhcml0eSwgc2V0Q29kZT1zZXRDb2RlLCBwb3dlck1pbj1wb3dlck1pbiwgcG93ZXJNYXg9cG93ZXJNYXgsCiAgICAgICAgdG91Z2hNaW49dG91Z2hNaW4sIHRvdWdoTWF4PXRvdWdoTWF4LCBrZXl3b3JkPWtleXdvcmQsCiAgICAgICAgZWRocmVjTWluPWVkaHJlY01pbiwgZWRocmVjTWF4PWVkaHJlY01heCwgcXR5TWluPXF0eU1pbiwgcXR5TWF4PXF0eU1heCwKICAgICkKCiAgICAjIFZhbGlkYXRlIHNvcnQKICAgIHNvcnRfZmllbGQgPSBzb3J0RmllbGQgaWYgc29ydEZpZWxkIGluIFZBTElEX1NPUlRfRklFTERTIGVsc2UgIm5hbWUiCiAgICBzb3J0X2RpciA9ICJERVNDIiBpZiAoc29ydERpciBvciAiIikudXBwZXIoKSA9PSAiREVTQyIgZWxzZSAiQVNDIgoKICAgIGNvbm4gPSBfZ2V0X2RiX2Nvbm4oKQoKICAgICMgQ291bnQgdG90YWwKICAgIGNvdW50X3NxbCA9IGYiU0VMRUNUIENPVU5UKCopIEZST00gY29sbGVjdGlvbl9lbnRyaWVzIHt3aGVyZV9zdHJ9IgogICAgdG90YWwgPSBjb25uLmV4ZWN1dGUoY291bnRfc3FsLCBwYXJhbXMpLmZldGNob25lKClbMF0KCiAgICAjIFBhZ2luYXRlCiAgICBvZmZzZXQgPSAobWF4KDEsIHBhZ2UpIC0gMSkgKiBwYWdlU2l6ZQogICAgZGF0YV9zcWwgPSBmIiIiCiAgICAgICAgU0VMRUNUICogRlJPTSBjb2xsZWN0aW9uX2VudHJpZXMge3doZXJlX3N0cn0KICAgICAgICBPUkRFUiBCWSB7c29ydF9maWVsZH0ge3NvcnRfZGlyfQogICAgICAgIExJTUlUID8gT0ZGU0VUID8KICAgICIiIgogICAgcm93cyA9IGNvbm4uZXhlY3V0ZShkYXRhX3NxbCwgcGFyYW1zICsgW3BhZ2VTaXplLCBvZmZzZXRdKS5mZXRjaGFsbCgpCiAgICBpdGVtcyA9IFtfYWRkX2ltYWdlX3VybChfcm93X3RvX2RpY3QocikpIGZvciByIGluIHJvd3NdCgogICAgIyBJZiBkZWNrX2lkIHByb3ZpZGVkLCBhbm5vdGF0ZSBlYWNoIGl0ZW0gd2l0aCBob3cgbWFueSBjb3BpZXMgYXJlIGFscmVhZHkgaW4gdGhhdCBkZWNrCiAgICBpZiBkZWNrX2lkIGlzIG5vdCBOb25lOgogICAgICAgICMgQnVpbGQgYSBtYXAgb2Ygc2NyeWZhbGxfaWQgLT4gcXVhbnRpdHkgaW4gZGVjawogICAgICAgIGRlY2tfY2FyZF9yb3dzID0gY29ubi5leGVjdXRlKAogICAgICAgICAgICAiU0VMRUNUIHNjcnlmYWxsX2lkLCBTVU0ocXVhbnRpdHkpIGFzIHF0eSBGUk9NIGRlY2tfY2FyZHMgV0hFUkUgZGVja19pZCA9ID8gR1JPVVAgQlkgc2NyeWZhbGxfaWQiLAogICAgICAgICAgICAoZGVja19pZCwpCiAgICAgICAgKS5mZXRjaGFsbCgpCiAgICAgICAgaW5fZGVja19tYXAgPSB7cm93WyJzY3J5ZmFsbF9pZCJdOiByb3dbInF0eSJdIGZvciByb3cgaW4gZGVja19jYXJkX3Jvd3N9CiAgICAgICAgZm9yIGl0ZW0gaW4gaXRlbXM6CiAgICAgICAgICAgIGl0ZW1bImluX2RlY2tfcXVhbnRpdHkiXSA9IGluX2RlY2tfbWFwLmdldChpdGVtLmdldCgic2NyeWZhbGxfaWQiLCAiIiksIDApCgogICAgcmV0dXJuIHsiaXRlbXMiOiBpdGVtcywgInBhZ2UiOiBwYWdlLCAicGFnZVNpemUiOiBwYWdlU2l6ZSwgInRvdGFsIjogdG90YWx9CgoKQGFwcC5nZXQoIi9hcGkvY29sbGVjdGlvbi97Y2FyZElkfSIpCmFzeW5jIGRlZiBnZXRfY29sbGVjdGlvbl9jYXJkKGNhcmRJZDogaW50KToKICAgICIiIkdldCBhIHNpbmdsZSBjb2xsZWN0aW9uIGVudHJ5IGJ5IElELiIiIgogICAgY29ubiA9IF9nZXRfZGJfY29ubigpCiAgICByb3cgPSBjb25uLmV4ZWN1dGUoIlNFTEVDVCAqIEZST00gY29sbGVjdGlvbl9lbnRyaWVzIFdIRVJFIGlkID0gPyIsIChjYXJkSWQsKSkuZmV0Y2hvbmUoKQogICAgaWYgbm90IHJvdzoKICAgICAgICByYWlzZSBIVFRQRXhjZXB0aW9uKDQwNCwgZiJDYXJkIHdpdGggaWQge2NhcmRJZH0gbm90IGZvdW5kIikKICAgIHJldHVybiBfYWRkX2ltYWdlX3VybChfcm93X3RvX2RpY3Qocm93KSkKCgpAYXBwLnBhdGNoKCIvYXBpL2NvbGxlY3Rpb24ve2NhcmRJZH0iKQphc3luYyBkZWYgdXBkYXRlX2NvbGxlY3Rpb25fY2FyZChjYXJkSWQ6IGludCwgYm9keTogZGljdCk6CiAgICAiIiJVcGRhdGUgbXV0YWJsZSBmaWVsZHMgb2YgYSBjb2xsZWN0aW9uIGVudHJ5LiIiIgogICAgY29ubiA9IF9nZXRfZGJfY29ubigpCiAgICByb3cgPSBjb25uLmV4ZWN1dGUoIlNFTEVDVCAqIEZST00gY29sbGVjdGlvbl9lbnRyaWVzIFdIRVJFIGlkID0gPyIsIChjYXJkSWQsKSkuZmV0Y2hvbmUoKQogICAgaWYgbm90IHJvdzoKICAgICAgICByYWlzZSBIVFRQRXhjZXB0aW9uKDQwNCwgZiJDYXJkIHdpdGggaWQge2NhcmRJZH0gbm90IGZvdW5kIikKCiAgICB1cGRhdGVzID0ge30KICAgIGlmICJjYXRlZ29yeSIgaW4gYm9keToKICAgICAgICBjYXQgPSBib2R5WyJjYXRlZ29yeSJdCiAgICAgICAgaWYgaXNpbnN0YW5jZShjYXQsIGxpc3QpOgogICAgICAgICAgICB1cGRhdGVzWyJjYXRlZ29yeSJdID0ganNvbi5kdW1wcyhjYXQpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgdXBkYXRlc1siY2F0ZWdvcnkiXSA9IGNhdAogICAgaWYgInRhZ3MiIGluIGJvZHk6CiAgICAgICAgdXBkYXRlc1sidGFncyJdID0gc3RyKGJvZHlbInRhZ3MiXSkKICAgIGlmICJub3RlcyIgaW4gYm9keToKICAgICAgICB1cGRhdGVzWyJub3RlcyJdID0gc3RyKGJvZHlbIm5vdGVzIl0pCiAgICBpZiAiZmluaXNoIiBpbiBib2R5OgogICAgICAgIGZpbmlzaF92YWwgPSBzdHIoYm9keVsiZmluaXNoIl0pLnVwcGVyKCkKICAgICAgICBpZiBmaW5pc2hfdmFsIG5vdCBpbiAoIk5PUk1BTCIsICJGT0lMIiwgIkVUQ0hFRCIpOgogICAgICAgICAgICByYWlzZSBIVFRQRXhjZXB0aW9uKDQwMCwgImZpbmlzaCBtdXN0IGJlIE5PUk1BTCwgRk9JTCwgb3IgRVRDSEVEIikKICAgICAgICB1cGRhdGVzWyJmaW5pc2giXSA9IGZpbmlzaF92YWwKCiAgICBpZiBub3QgdXBkYXRlczoKICAgICAgICByZXR1cm4gX2FkZF9pbWFnZV91cmwoX3Jvd190b19kaWN0KHJvdykpCgogICAgdXBkYXRlc1sidXBkYXRlZF9hdCJdID0gZGF0ZXRpbWUudXRjbm93KCkuc3RyZnRpbWUoIiVZLSVtLSVkICVIOiVNOiVTIikKICAgIHNldF9jbGF1c2UgPSAiLCAiLmpvaW4oZiJ7a30gPSA/IiBmb3IgayBpbiB1cGRhdGVzKQogICAgdmFsdWVzID0gbGlzdCh1cGRhdGVzLnZhbHVlcygpKSArIFtjYXJkSWRdCiAgICBjb25uLmV4ZWN1dGUoZiJVUERBVEUgY29sbGVjdGlvbl9lbnRyaWVzIFNFVCB7c2V0X2NsYXVzZX0gV0hFUkUgaWQgPSA/IiwgdmFsdWVzKQogICAgY29ubi5jb21taXQoKQoKICAgIHVwZGF0ZWRfcm93ID0gY29ubi5leGVjdXRlKCJTRUxFQ1QgKiBGUk9NIGNvbGxlY3Rpb25fZW50cmllcyBXSEVSRSBpZCA9ID8iLCAoY2FyZElkLCkpLmZldGNob25lKCkKICAgIHJldHVybiBfYWRkX2ltYWdlX3VybChfcm93X3RvX2RpY3QodXBkYXRlZF9yb3cpKQoKCiMg4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQCiMgQ29sbGVjdGlvbiBJbXBvcnQgSGVscGVycwojIOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkAoKIyDilIDilIAgU2NyeWZhbGwgUmVzcG9uc2UgQ2FjaGUg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACiMgU1FMaXRlLWJhY2tlZCBjYWNoZSBmb3IgU2NyeWZhbGwgQVBJIHJlc3BvbnNlcy4KIyBLZXllZCBieSAobmFtZSwgc2V0X2NvZGUsIGNvbGxlY3Rvcl9udW1iZXIpLiBEZWZhdWx0IFRUTDogNyBkYXlzLgojIFNjcnlmYWxsIGRhdGEgY2hhbmdlcyBpbmZyZXF1ZW50bHkgKHNldCByZWxlYXNlcyB+ZXZlcnkgMyBtb250aHMpLgojIEVsaW1pbmF0ZXMgcmVkdW5kYW50IEhUVFAgY2FsbHMgYWNyb3NzIGltcG9ydHMgYW5kIHJlLWVucmljaG1lbnRzLgoKU0NSWUZBTExfQ0FDSEVfREJfUEFUSCA9IFBhdGgoX19maWxlX18pLnBhcmVudCAvICJzY3J5ZmFsbF9jYWNoZS5kYiIKU0NSWUZBTExfQ0FDSEVfVFRMX1NFQ09ORFMgPSBpbnQob3MuZW52aXJvbi5nZXQoIlNDUllGQUxMX0NBQ0hFX1RUTCIsIDcgKiAyNCAqIDM2MDApKSAgIyA3IGRheXMKCgpjbGFzcyBfU2NyeWZhbGxDYWNoZToKICAgICIiIgogICAgVGhyZWFkLXNhZmUgU1FMaXRlIGNhY2hlIGZvciByYXcgU2NyeWZhbGwgSlNPTiByZXNwb25zZXMuCgogICAgU2NoZW1hOgogICAgICAgIGNhY2hlX2tleSAgVEVYVCBQUklNQVJZIEtFWSAg4oCUICJuYW1lfHNldHxjbiIgbm9ybWFsaXNlZCBsb3dlcmNhc2UKICAgICAgICBqc29uX2Jsb2IgIFRFWFQgICAgICAgICAgICAgIOKAlCByYXcgU2NyeWZhbGwgQVBJIEpTT04gcmVzcG9uc2UKICAgICAgICBmZXRjaGVkX2F0IFRFWFQgICAgICAgICAgICAgIOKAlCBJU08tODYwMSBVVEMgdGltZXN0YW1wCiAgICAiIiIKCiAgICBkZWYgX19pbml0X18oc2VsZiwgZGJfcGF0aDogUGF0aCA9IE5vbmUsIHR0bF9zZWNvbmRzOiBpbnQgPSBOb25lKToKICAgICAgICBzZWxmLl9kYl9wYXRoID0gZGJfcGF0aCBvciBTQ1JZRkFMTF9DQUNIRV9EQl9QQVRICiAgICAgICAgc2VsZi5fdHRsID0gdHRsX3NlY29uZHMgb3IgU0NSWUZBTExfQ0FDSEVfVFRMX1NFQ09ORFMKICAgICAgICBzZWxmLl9sb2NrID0gdGhyZWFkaW5nLkxvY2soKQogICAgICAgIHNlbGYuX2Nvbm46IE9wdGlvbmFsW3NxbGl0ZTMuQ29ubmVjdGlvbl0gPSBOb25lCiAgICAgICAgc2VsZi5faGl0cyA9IDAKICAgICAgICBzZWxmLl9taXNzZXMgPSAwCiAgICAgICAgc2VsZi5faW5pdF9kYigpCgogICAgIyDilIDilIAgaW50ZXJuYWwg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACgogICAgZGVmIF9pbml0X2RiKHNlbGYpOgogICAgICAgIHNlbGYuX2Nvbm4gPSBzcWxpdGUzLmNvbm5lY3Qoc3RyKHNlbGYuX2RiX3BhdGgpLCBjaGVja19zYW1lX3RocmVhZD1GYWxzZSkKICAgICAgICBzZWxmLl9jb25uLmV4ZWN1dGUoIlBSQUdNQSBqb3VybmFsX21vZGU9V0FMIikKICAgICAgICBzZWxmLl9jb25uLmV4ZWN1dGUoIiIiCiAgICAgICAgICAgIENSRUFURSBUQUJMRSBJRiBOT1QgRVhJU1RTIHNjcnlmYWxsX2NhY2hlICgKICAgICAgICAgICAgICAgIGNhY2hlX2tleSAgVEVYVCBQUklNQVJZIEtFWSwKICAgICAgICAgICAgICAgIGpzb25fYmxvYiAgVEVYVCAgICBOT1QgTlVMTCwKICAgICAgICAgICAgICAgIGZldGNoZWRfYXQgVEVYVCAgICBOT1QgTlVMTCBERUZBVUxUIChkYXRldGltZSgnbm93JykpCiAgICAgICAgICAgICkKICAgICAgICAiIiIpCiAgICAgICAgc2VsZi5fY29ubi5jb21taXQoKQoKICAgIEBzdGF0aWNtZXRob2QKICAgIGRlZiBfbWFrZV9rZXkobmFtZTogc3RyLCBzZXRfY29kZTogc3RyLCBjb2xsZWN0b3JfbnVtYmVyOiBzdHIpIC0+IHN0cjoKICAgICAgICByZXR1cm4gZiJ7bmFtZS5zdHJpcCgpLmxvd2VyKCl9fHsoc2V0X2NvZGUgb3IgJycpLnN0cmlwKCkubG93ZXIoKX18eyhjb2xsZWN0b3JfbnVtYmVyIG9yICcnKS5zdHJpcCgpfSIKCiAgICAjIOKUgOKUgCBwdWJsaWMgQVBJIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgAoKICAgIGRlZiBnZXQoc2VsZiwgbmFtZTogc3RyLCBzZXRfY29kZTogc3RyID0gIiIsIGNvbGxlY3Rvcl9udW1iZXI6IHN0ciA9ICIiKSAtPiBPcHRpb25hbFtkaWN0XToKICAgICAgICAiIiJSZXR1cm4gY2FjaGVkIFNjcnlmYWxsIEpTT04gZGljdCwgb3IgTm9uZSBpZiBtaXNzaW5nIC8gZXhwaXJlZC4iIiIKICAgICAgICBrZXkgPSBzZWxmLl9tYWtlX2tleShuYW1lLCBzZXRfY29kZSwgY29sbGVjdG9yX251bWJlcikKICAgICAgICB3aXRoIHNlbGYuX2xvY2s6CiAgICAgICAgICAgIHJvdyA9IHNlbGYuX2Nvbm4uZXhlY3V0ZSgKICAgICAgICAgICAgICAgICJTRUxFQ1QganNvbl9ibG9iLCBmZXRjaGVkX2F0IEZST00gc2NyeWZhbGxfY2FjaGUgV0hFUkUgY2FjaGVfa2V5ID0gPyIsCiAgICAgICAgICAgICAgICAoa2V5LCksCiAgICAgICAgICAgICkuZmV0Y2hvbmUoKQogICAgICAgIGlmIG5vdCByb3c6CiAgICAgICAgICAgIHNlbGYuX21pc3NlcyArPSAxCiAgICAgICAgICAgIHJldHVybiBOb25lCiAgICAgICAgIyBUVEwgY2hlY2sKICAgICAgICB0cnk6CiAgICAgICAgICAgIGZldGNoZWQgPSBkYXRldGltZS5mcm9taXNvZm9ybWF0KHJvd1sxXSkKICAgICAgICAgICAgYWdlID0gKGRhdGV0aW1lLnV0Y25vdygpIC0gZmV0Y2hlZCkudG90YWxfc2Vjb25kcygpCiAgICAgICAgICAgIGlmIGFnZSA+IHNlbGYuX3R0bDoKICAgICAgICAgICAgICAgIHNlbGYuX21pc3NlcyArPSAxCiAgICAgICAgICAgICAgICByZXR1cm4gTm9uZQogICAgICAgIGV4Y2VwdCAoVmFsdWVFcnJvciwgVHlwZUVycm9yKToKICAgICAgICAgICAgc2VsZi5fbWlzc2VzICs9IDEKICAgICAgICAgICAgcmV0dXJuIE5vbmUKICAgICAgICBzZWxmLl9oaXRzICs9IDEKICAgICAgICB0cnk6CiAgICAgICAgICAgIHJldHVybiBqc29uLmxvYWRzKHJvd1swXSkKICAgICAgICBleGNlcHQganNvbi5KU09ORGVjb2RlRXJyb3I6CiAgICAgICAgICAgIHNlbGYuX21pc3NlcyArPSAxCiAgICAgICAgICAgIHJldHVybiBOb25lCgogICAgZGVmIHB1dChzZWxmLCBuYW1lOiBzdHIsIHNldF9jb2RlOiBzdHIsIGNvbGxlY3Rvcl9udW1iZXI6IHN0ciwgY2FyZF9kYXRhOiBkaWN0KToKICAgICAgICAiIiJTdG9yZSBhIFNjcnlmYWxsIHJlc3BvbnNlIGluIHRoZSBjYWNoZS4iIiIKICAgICAgICBrZXkgPSBzZWxmLl9tYWtlX2tleShuYW1lLCBzZXRfY29kZSwgY29sbGVjdG9yX251bWJlcikKICAgICAgICBibG9iID0ganNvbi5kdW1wcyhjYXJkX2RhdGEsIHNlcGFyYXRvcnM9KCIsIiwgIjoiKSkKICAgICAgICB3aXRoIHNlbGYuX2xvY2s6CiAgICAgICAgICAgIHNlbGYuX2Nvbm4uZXhlY3V0ZSgKICAgICAgICAgICAgICAgICJJTlNFUlQgT1IgUkVQTEFDRSBJTlRPIHNjcnlmYWxsX2NhY2hlIChjYWNoZV9rZXksIGpzb25fYmxvYiwgZmV0Y2hlZF9hdCkgIgogICAgICAgICAgICAgICAgIlZBTFVFUyAoPywgPywgZGF0ZXRpbWUoJ25vdycpKSIsCiAgICAgICAgICAgICAgICAoa2V5LCBibG9iKSwKICAgICAgICAgICAgKQogICAgICAgICAgICBzZWxmLl9jb25uLmNvbW1pdCgpCgogICAgZGVmIHN0YXRzKHNlbGYpIC0+IGRpY3Q6CiAgICAgICAgIiIiUmV0dXJuIGNhY2hlIHN0YXRpc3RpY3MuIiIiCiAgICAgICAgd2l0aCBzZWxmLl9sb2NrOgogICAgICAgICAgICB0b3RhbCA9IHNlbGYuX2Nvbm4uZXhlY3V0ZSgiU0VMRUNUIENPVU5UKCopIEZST00gc2NyeWZhbGxfY2FjaGUiKS5mZXRjaG9uZSgpWzBdCiAgICAgICAgICAgIG9sZGVzdF9yb3cgPSBzZWxmLl9jb25uLmV4ZWN1dGUoCiAgICAgICAgICAgICAgICAiU0VMRUNUIE1JTihmZXRjaGVkX2F0KSBGUk9NIHNjcnlmYWxsX2NhY2hlIgogICAgICAgICAgICApLmZldGNob25lKCkKICAgICAgICAgICAgbmV3ZXN0X3JvdyA9IHNlbGYuX2Nvbm4uZXhlY3V0ZSgKICAgICAgICAgICAgICAgICJTRUxFQ1QgTUFYKGZldGNoZWRfYXQpIEZST00gc2NyeWZhbGxfY2FjaGUiCiAgICAgICAgICAgICkuZmV0Y2hvbmUoKQogICAgICAgICAgICBkYl9zaXplX2J5dGVzID0gb3MucGF0aC5nZXRzaXplKHN0cihzZWxmLl9kYl9wYXRoKSkgaWYgc2VsZi5fZGJfcGF0aC5leGlzdHMoKSBlbHNlIDAKICAgICAgICByZXR1cm4gewogICAgICAgICAgICAidG90YWxfZW50cmllcyI6IHRvdGFsLAogICAgICAgICAgICAiaGl0cyI6IHNlbGYuX2hpdHMsCiAgICAgICAgICAgICJtaXNzZXMiOiBzZWxmLl9taXNzZXMsCiAgICAgICAgICAgICJoaXRfcmF0ZSI6IHJvdW5kKHNlbGYuX2hpdHMgLyBtYXgoc2VsZi5faGl0cyArIHNlbGYuX21pc3NlcywgMSkgKiAxMDAsIDEpLAogICAgICAgICAgICAidHRsX3NlY29uZHMiOiBzZWxmLl90dGwsCiAgICAgICAgICAgICJ0dGxfZGF5cyI6IHJvdW5kKHNlbGYuX3R0bCAvIDg2NDAwLCAxKSwKICAgICAgICAgICAgIm9sZGVzdF9lbnRyeSI6IG9sZGVzdF9yb3dbMF0gaWYgb2xkZXN0X3JvdyBlbHNlIE5vbmUsCiAgICAgICAgICAgICJuZXdlc3RfZW50cnkiOiBuZXdlc3Rfcm93WzBdIGlmIG5ld2VzdF9yb3cgZWxzZSBOb25lLAogICAgICAgICAgICAiZGJfc2l6ZV9rYiI6IHJvdW5kKGRiX3NpemVfYnl0ZXMgLyAxMDI0LCAxKSwKICAgICAgICAgICAgImRiX3BhdGgiOiBzdHIoc2VsZi5fZGJfcGF0aCksCiAgICAgICAgfQoKICAgIGRlZiBjbGVhcihzZWxmKSAtPiBpbnQ6CiAgICAgICAgIiIiRGVsZXRlIGFsbCBjYWNoZWQgZW50cmllcy4gUmV0dXJucyBjb3VudCBvZiBkZWxldGVkIHJvd3MuIiIiCiAgICAgICAgd2l0aCBzZWxmLl9sb2NrOgogICAgICAgICAgICBjb3VudCA9IHNlbGYuX2Nvbm4uZXhlY3V0ZSgiU0VMRUNUIENPVU5UKCopIEZST00gc2NyeWZhbGxfY2FjaGUiKS5mZXRjaG9uZSgpWzBdCiAgICAgICAgICAgIHNlbGYuX2Nvbm4uZXhlY3V0ZSgiREVMRVRFIEZST00gc2NyeWZhbGxfY2FjaGUiKQogICAgICAgICAgICBzZWxmLl9jb25uLmNvbW1pdCgpCiAgICAgICAgICAgIHNlbGYuX2Nvbm4uZXhlY3V0ZSgiVkFDVVVNIikgICMgbXVzdCBydW4gb3V0c2lkZSB0cmFuc2FjdGlvbgogICAgICAgICAgICBzZWxmLl9oaXRzID0gMAogICAgICAgICAgICBzZWxmLl9taXNzZXMgPSAwCiAgICAgICAgcmV0dXJuIGNvdW50CgogICAgZGVmIGV2aWN0X2V4cGlyZWQoc2VsZikgLT4gaW50OgogICAgICAgICIiIlJlbW92ZSBlbnRyaWVzIG9sZGVyIHRoYW4gVFRMLiBSZXR1cm5zIGNvdW50IG9mIGV2aWN0ZWQgcm93cy4iIiIKICAgICAgICBjdXRvZmYgPSBkYXRldGltZS51dGNub3coKS5pc29mb3JtYXQoKQogICAgICAgIHdpdGggc2VsZi5fbG9jazoKICAgICAgICAgICAgc2VsZi5fY29ubi5leGVjdXRlKAogICAgICAgICAgICAgICAgIkRFTEVURSBGUk9NIHNjcnlmYWxsX2NhY2hlIFdIRVJFICIKICAgICAgICAgICAgICAgICIoanVsaWFuZGF5KD8pIC0ganVsaWFuZGF5KGZldGNoZWRfYXQpKSAqIDg2NDAwID4gPyIsCiAgICAgICAgICAgICAgICAoY3V0b2ZmLCBzZWxmLl90dGwpLAogICAgICAgICAgICApCiAgICAgICAgICAgIGRlbGV0ZWQgPSBzZWxmLl9jb25uLnRvdGFsX2NoYW5nZXMKICAgICAgICAgICAgc2VsZi5fY29ubi5jb21taXQoKQogICAgICAgIHJldHVybiBkZWxldGVkCgoKX3NjcnlmYWxsX2NhY2hlID0gX1NjcnlmYWxsQ2FjaGUoKQoKCiMgU2NyeWZhbGwgcmF0ZS1saW1pdCBzZW1hcGhvcmUgKG1heCAxMCByZXEvc2VjKQpfc2NyeWZhbGxfbG9jayA9IHRocmVhZGluZy5Mb2NrKCkKX3NjcnlmYWxsX2xhc3RfY2FsbCA9IDAuMAoKCmRlZiBfc2NyeWZhbGxfcmF0ZV9saW1pdCgpOgogICAgIiIiRW5mb3JjZSBhdCBtb3N0IDEwIFNjcnlmYWxsIHJlcXVlc3RzIHBlciBzZWNvbmQgdmlhIHNpbXBsZSBzbGVlcC4iIiIKICAgIGdsb2JhbCBfc2NyeWZhbGxfbGFzdF9jYWxsCiAgICB3aXRoIF9zY3J5ZmFsbF9sb2NrOgogICAgICAgIG5vdyA9IHRpbWUubW9ub3RvbmljKCkKICAgICAgICBlbGFwc2VkID0gbm93IC0gX3NjcnlmYWxsX2xhc3RfY2FsbAogICAgICAgIGlmIGVsYXBzZWQgPCAwLjE6CiAgICAgICAgICAgIHRpbWUuc2xlZXAoMC4xIC0gZWxhcHNlZCkKICAgICAgICBfc2NyeWZhbGxfbGFzdF9jYWxsID0gdGltZS5tb25vdG9uaWMoKQoKCmRlZiBfcGFyc2VfZmluaXNoKHJhdzogc3RyKSAtPiBzdHI6CiAgICAiIiJOb3JtYWxpemUgZmluaXNoIHN0cmluZyB0byBOT1JNQUx8Rk9JTHxFVENIRUQuIiIiCiAgICBpZiBub3QgcmF3OgogICAgICAgIHJldHVybiAiTk9STUFMIgogICAgciA9IHJhdy5zdHJpcCgpLmxvd2VyKCkKICAgIGlmIHIgaW4gKCJldGNoZWQiLCAiZm9pbCBldGNoZWQiLCAiZm9pbF9ldGNoZWQiLCAiZXRjaGVkIGZvaWwiKToKICAgICAgICByZXR1cm4gIkVUQ0hFRCIKICAgIGlmIHIgaW4gKCJ5ZXMiLCAiZm9pbCIsICJ0cnVlIiwgIjEiKToKICAgICAgICByZXR1cm4gIkZPSUwiCiAgICByZXR1cm4gIk5PUk1BTCIKCgpkZWYgX3BhcnNlX3RleHRfbGluZShsaW5lOiBzdHIpIC0+IGRpY3Q6CiAgICAiIiIKICAgIFBhcnNlIGEgdGV4dCBpbXBvcnQgbGluZSBpbnRvIHtuYW1lLCBxdWFudGl0eSwgc2V0X2NvZGUsIGNvbGxlY3Rvcl9udW1iZXJ9LgogICAgU3VwcG9ydHMgZm9ybWF0czoKICAgICAgLSAiMyBTb2wgUmluZyAoQ01SKSAxMjMiCiAgICAgIC0gIjF4IFNvbCBSaW5nIChDTVIpIgogICAgICAtICJTb2wgUmluZyBbQ01SOjEyM10iCiAgICAgIC0gIjEgU29sIFJpbmciCiAgICAiIiIKICAgIGxpbmUgPSBsaW5lLnN0cmlwKCkKICAgIGlmIG5vdCBsaW5lIG9yIGxpbmUuc3RhcnRzd2l0aCgiIyIpIG9yIGxpbmUuc3RhcnRzd2l0aCgiLy8iKToKICAgICAgICByZXR1cm4ge30KCiAgICByZXN1bHQgPSB7Im5hbWUiOiAiIiwgInF1YW50aXR5IjogMSwgInNldF9jb2RlIjogIiIsICJjb2xsZWN0b3JfbnVtYmVyIjogIiJ9CgogICAgIyBTdHJpcCBxdWFudGl0eSBwcmVmaXgKICAgIHF0eV9tYXRjaCA9IHJlLm1hdGNoKHIiXihcZCspeD9ccysiLCBsaW5lKQogICAgaWYgcXR5X21hdGNoOgogICAgICAgIHJlc3VsdFsicXVhbnRpdHkiXSA9IGludChxdHlfbWF0Y2guZ3JvdXAoMSkpCiAgICAgICAgbGluZSA9IGxpbmVbcXR5X21hdGNoLmVuZCgpOl0KCiAgICAjIEZvcm1hdDogIk5hbWUgW1NFVDpDb2xsTnVtXSIKICAgIGJyYWNrZXRfbWF0Y2ggPSByZS5zZWFyY2gociJcWyhbQS1aYS16MC05XSspOihcUyspXF1ccyokIiwgbGluZSkKICAgIGlmIGJyYWNrZXRfbWF0Y2g6CiAgICAgICAgcmVzdWx0WyJzZXRfY29kZSJdID0gYnJhY2tldF9tYXRjaC5ncm91cCgxKS5sb3dlcigpCiAgICAgICAgcmVzdWx0WyJjb2xsZWN0b3JfbnVtYmVyIl0gPSBicmFja2V0X21hdGNoLmdyb3VwKDIpCiAgICAgICAgbGluZSA9IGxpbmVbOmJyYWNrZXRfbWF0Y2guc3RhcnQoKV0uc3RyaXAoKQogICAgICAgIHJlc3VsdFsibmFtZSJdID0gbGluZQogICAgICAgIHJldHVybiByZXN1bHQKCiAgICAjIEZvcm1hdDogIk5hbWUgKFNFVCkgQ29sbE51bSIKICAgIHBhcmVuX2NvbGxfbWF0Y2ggPSByZS5zZWFyY2gociJcKChbQS1aYS16MC05XSspXClccysoXFMrKVxzKiQiLCBsaW5lKQogICAgaWYgcGFyZW5fY29sbF9tYXRjaDoKICAgICAgICByZXN1bHRbInNldF9jb2RlIl0gPSBwYXJlbl9jb2xsX21hdGNoLmdyb3VwKDEpLmxvd2VyKCkKICAgICAgICByZXN1bHRbImNvbGxlY3Rvcl9udW1iZXIiXSA9IHBhcmVuX2NvbGxfbWF0Y2guZ3JvdXAoMikKICAgICAgICBsaW5lID0gbGluZVs6cGFyZW5fY29sbF9tYXRjaC5zdGFydCgpXS5zdHJpcCgpCiAgICAgICAgcmVzdWx0WyJuYW1lIl0gPSBsaW5lCiAgICAgICAgcmV0dXJuIHJlc3VsdAoKICAgICMgRm9ybWF0OiAiTmFtZSAoU0VUKSIKICAgIHBhcmVuX21hdGNoID0gcmUuc2VhcmNoKHIiXCgoW0EtWmEtejAtOV0rKVwpXHMqJCIsIGxpbmUpCiAgICBpZiBwYXJlbl9tYXRjaDoKICAgICAgICByZXN1bHRbInNldF9jb2RlIl0gPSBwYXJlbl9tYXRjaC5ncm91cCgxKS5sb3dlcigpCiAgICAgICAgbGluZSA9IGxpbmVbOnBhcmVuX21hdGNoLnN0YXJ0KCldLnN0cmlwKCkKICAgICAgICByZXN1bHRbIm5hbWUiXSA9IGxpbmUKICAgICAgICByZXR1cm4gcmVzdWx0CgogICAgcmVzdWx0WyJuYW1lIl0gPSBsaW5lLnN0cmlwKCkKICAgIHJldHVybiByZXN1bHQKCgpkZWYgX2F1dG9faW5mZXJfbWFwcGluZyhoZWFkZXJzOiBsaXN0KSAtPiBkaWN0OgogICAgIiIiCiAgICBBdXRvLWluZmVyIGNvbHVtbiDihpIgZmllbGQgbWFwcGluZyBmcm9tIGhlYWRlciBuYW1lcy4KICAgIFJldHVybnMgZGljdCBvZiB7aGVhZGVyOiBmaWVsZF9rZXl9LgogICAgRmllbGQga2V5czogbmFtZSwgcXVhbnRpdHksIHNldF9jb2RlLCBjb2xsZWN0b3JfbnVtYmVyLCBmaW5pc2gsIGNvbmRpdGlvbiwgbGFuZ3VhZ2UsIG5vdGVzLCB0YWdzCiAgICAiIiIKICAgIG1hcHBpbmcgPSB7fQogICAgaGVhZGVyX2xvd2VyID0ge2g6IGgubG93ZXIoKS5zdHJpcCgpIGZvciBoIGluIGhlYWRlcnN9CiAgICBmaWVsZF9wYXR0ZXJucyA9IHsKICAgICAgICAibmFtZSI6IFsibmFtZSIsICJjYXJkIG5hbWUiLCAiY2FyZF9uYW1lIiwgImNhcmRuYW1lIiwgInRpdGxlIl0sCiAgICAgICAgInF1YW50aXR5IjogWyJxdWFudGl0eSIsICJxdHkiLCAiY291bnQiLCAiYW1vdW50IiwgIm51bWJlciIsICIjIl0sCiAgICAgICAgInNldF9jb2RlIjogWyJzZXQiLCAic2V0IGNvZGUiLCAic2V0X2NvZGUiLCAiZWRpdGlvbiIsICJzZXRfbmFtZSIsICJlZGl0aW9uIGNvZGUiXSwKICAgICAgICAiY29sbGVjdG9yX251bWJlciI6IFsKICAgICAgICAgICAgImNvbGxlY3RvciBudW1iZXIiLCAiY29sbGVjdG9yX251bWJlciIsICJjb2xsZWN0b3JudW1iZXIiLAogICAgICAgICAgICAiY29sICMiLCAiY29sIyIsICJudW1iZXIiLCAiY2FyZCBudW1iZXIiLAogICAgICAgIF0sCiAgICAgICAgImZpbmlzaCI6IFsiZmluaXNoIiwgImZvaWwiLCAicHJpbnRpbmciLCAidHJlYXRtZW50Il0sCiAgICAgICAgImNvbmRpdGlvbiI6IFsiY29uZGl0aW9uIiwgImNvbmQiLCAiZ3JhZGUiXSwKICAgICAgICAibGFuZ3VhZ2UiOiBbImxhbmd1YWdlIiwgImxhbmciLCAibG9jYWxlIl0sCiAgICAgICAgIm5vdGVzIjogWyJub3RlcyIsICJub3RlIiwgImNvbW1lbnRzIiwgImNvbW1lbnQiXSwKICAgICAgICAidGFncyI6IFsidGFncyIsICJ0YWciLCAibGFiZWxzIiwgImxhYmVsIl0sCiAgICB9CiAgICBmb3IgaGVhZGVyLCBsb3dlcl9oIGluIGhlYWRlcl9sb3dlci5pdGVtcygpOgogICAgICAgIGZvciBmaWVsZCwgcGF0dGVybnMgaW4gZmllbGRfcGF0dGVybnMuaXRlbXMoKToKICAgICAgICAgICAgaWYgbG93ZXJfaCBpbiBwYXR0ZXJuczoKICAgICAgICAgICAgICAgIG1hcHBpbmdbaGVhZGVyXSA9IGZpZWxkCiAgICAgICAgICAgICAgICBicmVhawogICAgcmV0dXJuIG1hcHBpbmcKCgpkZWYgX3BhcnNlX2Nzdl9jb250ZW50KGNvbnRlbnQ6IHN0ciwgc291cmNlOiBzdHIsIG1hcHBpbmc6IE9wdGlvbmFsW2RpY3RdKSAtPiBsaXN0OgogICAgIiIiCiAgICBQYXJzZSBDU1YvdGV4dCBjb250ZW50IGludG8gYSBsaXN0IG9mIFJhd0ltcG9ydFJvdyBkaWN0cy4KICAgIFJldHVybnMgbGlzdCBvZiBkaWN0cyB3aXRoIGtleXM6IG5hbWUsIHF1YW50aXR5LCBzZXRfY29kZSwgY29sbGVjdG9yX251bWJlciwgZmluaXNoLCBjb25kaXRpb24sIGxhbmd1YWdlLCBub3RlcywgdGFncwogICAgIiIiCiAgICByb3dzID0gW10KICAgIHNvdXJjZV91cHBlciA9IChzb3VyY2Ugb3IgIiIpLnVwcGVyKCkKCiAgICBpZiBzb3VyY2VfdXBwZXIgPT0gIlRFWFQiOgogICAgICAgIGZvciBsaW5lIGluIGNvbnRlbnQuc3BsaXRsaW5lcygpOgogICAgICAgICAgICBwYXJzZWQgPSBfcGFyc2VfdGV4dF9saW5lKGxpbmUpCiAgICAgICAgICAgIGlmIHBhcnNlZC5nZXQoIm5hbWUiKToKICAgICAgICAgICAgICAgIHJvd3MuYXBwZW5kKHBhcnNlZCkKICAgICAgICByZXR1cm4gcm93cwoKICAgICMgQ1NWLWJhc2VkIHNvdXJjZXMKICAgIHJlYWRlciA9IGNzdi5EaWN0UmVhZGVyKGlvLlN0cmluZ0lPKGNvbnRlbnQpKQogICAgaGVhZGVycyA9IHJlYWRlci5maWVsZG5hbWVzIG9yIFtdCgogICAgIyBCdWlsZCBlZmZlY3RpdmUgbWFwcGluZwogICAgaWYgbWFwcGluZzoKICAgICAgICBjb2xfbWFwID0ge2g6IG1hcHBpbmcuZ2V0KGgsICIiKSBmb3IgaCBpbiBoZWFkZXJzfQogICAgZWxzZToKICAgICAgICBjb2xfbWFwID0gX2F1dG9faW5mZXJfbWFwcGluZyhoZWFkZXJzKQoKICAgICMgTm9ybWFsaXplIGNvbF9tYXAgZmllbGQgdmFsdWVzIHRvIGxvd2VyY2FzZSBzbyBib3RoICJOQU1FIiAoVUkpIGFuZCAibmFtZSIgKGF1dG8taW5mZXIpIHdvcmsKICAgIGNvbF9tYXAgPSB7aDogKHYubG93ZXIoKSBpZiBpc2luc3RhbmNlKHYsIHN0cikgZWxzZSB2KSBmb3IgaCwgdiBpbiBjb2xfbWFwLml0ZW1zKCl9CgogICAgZm9yIGNzdl9yb3cgaW4gcmVhZGVyOgogICAgICAgIHJvdyA9IHsKICAgICAgICAgICAgIm5hbWUiOiAiIiwKICAgICAgICAgICAgInF1YW50aXR5IjogMSwKICAgICAgICAgICAgInNldF9jb2RlIjogIiIsCiAgICAgICAgICAgICJjb2xsZWN0b3JfbnVtYmVyIjogIiIsCiAgICAgICAgICAgICJmaW5pc2giOiAiTk9STUFMIiwKICAgICAgICAgICAgImNvbmRpdGlvbiI6ICIiLAogICAgICAgICAgICAibGFuZ3VhZ2UiOiAiIiwKICAgICAgICAgICAgIm5vdGVzIjogIiIsCiAgICAgICAgICAgICJ0YWdzIjogIiIsCiAgICAgICAgfQogICAgICAgIGZvciBoZWFkZXIsIGZpZWxkIGluIGNvbF9tYXAuaXRlbXMoKToKICAgICAgICAgICAgdmFsID0gY3N2X3Jvdy5nZXQoaGVhZGVyLCAiIikuc3RyaXAoKQogICAgICAgICAgICBpZiBub3QgdmFsIG9yIGZpZWxkID09ICJpZ25vcmUiIG9yIG5vdCBmaWVsZDoKICAgICAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgICAgIGlmIGZpZWxkID09ICJuYW1lIjoKICAgICAgICAgICAgICAgICMgU3RyaXAgZmluaXNoIHN1ZmZpeCBsaWtlICIoRm9pbCBFdGNoZWQpIgogICAgICAgICAgICAgICAgdmFsID0gcmUuc3ViKHIiXHMqXChmb2lsKD86IGV0Y2hlZCk/XClccyokIiwgIiIsIHZhbCwgZmxhZ3M9cmUuSUdOT1JFQ0FTRSkuc3RyaXAoKQogICAgICAgICAgICAgICAgcm93WyJuYW1lIl0gPSB2YWwKICAgICAgICAgICAgZWxpZiBmaWVsZCA9PSAicXVhbnRpdHkiOgogICAgICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgICAgIHJvd1sicXVhbnRpdHkiXSA9IGludChmbG9hdCh2YWwpKQogICAgICAgICAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3I6CiAgICAgICAgICAgICAgICAgICAgcm93WyJxdWFudGl0eSJdID0gMQogICAgICAgICAgICBlbGlmIGZpZWxkIGluICgic2V0X2NvZGUiLCAic2V0X2NvZGVfc2Vjb25kYXJ5Iik6CiAgICAgICAgICAgICAgICByb3dbInNldF9jb2RlIl0gPSB2YWwubG93ZXIoKQogICAgICAgICAgICBlbGlmIGZpZWxkIGluICgiY29sbGVjdG9yX251bWJlciIsICJjb2xsZWN0b3JfbnVtYmVyX3NlY29uZGFyeSIpOgogICAgICAgICAgICAgICAgcm93WyJjb2xsZWN0b3JfbnVtYmVyIl0gPSB2YWwKICAgICAgICAgICAgZWxpZiBmaWVsZCA9PSAiZmluaXNoIjoKICAgICAgICAgICAgICAgIHJvd1siZmluaXNoIl0gPSBfcGFyc2VfZmluaXNoKHZhbCkKICAgICAgICAgICAgZWxpZiBmaWVsZCA9PSAiY29uZGl0aW9uIjoKICAgICAgICAgICAgICAgIHJvd1siY29uZGl0aW9uIl0gPSB2YWwKICAgICAgICAgICAgZWxpZiBmaWVsZCA9PSAibGFuZ3VhZ2UiOgogICAgICAgICAgICAgICAgcm93WyJsYW5ndWFnZSJdID0gdmFsCiAgICAgICAgICAgIGVsaWYgZmllbGQgPT0gIm5vdGVzIjoKICAgICAgICAgICAgICAgIHJvd1sibm90ZXMiXSA9IHZhbAogICAgICAgICAgICBlbGlmIGZpZWxkID09ICJ0YWdzIjoKICAgICAgICAgICAgICAgIHJvd1sidGFncyJdID0gdmFsCgogICAgICAgIGlmIHJvd1sibmFtZSJdOgogICAgICAgICAgICByb3dzLmFwcGVuZChyb3cpCgogICAgcmV0dXJuIHJvd3MKCgpkZWYgX2ZldGNoX3NjcnlmYWxsX2FwaShuYW1lOiBzdHIsIHNldF9jb2RlOiBzdHIgPSAiIiwgY29sbGVjdG9yX251bWJlcjogc3RyID0gIiIpIC0+IGRpY3Q6CiAgICAiIiIKICAgIEZldGNoIHJhdyBjYXJkIGRhdGEgZnJvbSBTY3J5ZmFsbCBBUEkgKHdpdGggY2FjaGluZykuCiAgICBSZXR1cm5zIHRoZSByYXcgU2NyeWZhbGwgSlNPTiBkaWN0LCBvciBhIGRpY3Qgd2l0aCAnX2Vycm9yJyBvbiBmYWlsdXJlLgogICAgQ2FjaGUgaXMgY2hlY2tlZCBmaXJzdDsgbGl2ZSBIVFRQIGNhbGwgb25seSBvbiBtaXNzLgogICAgIiIiCiAgICBmcm9tIHVybGxpYi5wYXJzZSBpbXBvcnQgcXVvdGUKCiAgICAjIOKUgOKUgCBDYWNoZSBjaGVjayDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKICAgIGNhY2hlZCA9IF9zY3J5ZmFsbF9jYWNoZS5nZXQobmFtZSwgc2V0X2NvZGUsIGNvbGxlY3Rvcl9udW1iZXIpCiAgICBpZiBjYWNoZWQgaXMgbm90IE5vbmU6CiAgICAgICAgcmV0dXJuIGNhY2hlZAoKICAgICMg4pSA4pSAIExpdmUgZmV0Y2gg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACiAgICBjYXJkX2RhdGEgPSBOb25lCiAgICBsYXN0X2Vycm9yID0gIiIKCiAgICAjIFRyeSBzZXQgKyBjb2xsZWN0b3IgbnVtYmVyIGZpcnN0CiAgICBpZiBzZXRfY29kZSBhbmQgY29sbGVjdG9yX251bWJlcjoKICAgICAgICBfc2NyeWZhbGxfcmF0ZV9saW1pdCgpCiAgICAgICAgdHJ5OgogICAgICAgICAgICB1cmwgPSBmImh0dHBzOi8vYXBpLnNjcnlmYWxsLmNvbS9jYXJkcy97c2V0X2NvZGUubG93ZXIoKX0ve2NvbGxlY3Rvcl9udW1iZXJ9IgogICAgICAgICAgICByZXEgPSBSZXF1ZXN0KHVybCwgaGVhZGVycz1fQVBJX0hFQURFUlMpCiAgICAgICAgICAgIHdpdGggdXJsb3BlbihyZXEsIHRpbWVvdXQ9MTApIGFzIHJlc3A6CiAgICAgICAgICAgICAgICBjYXJkX2RhdGEgPSBqc29uLmxvYWRzKHJlc3AucmVhZCgpLmRlY29kZSgidXRmLTgiKSkKICAgICAgICBleGNlcHQgRXhjZXB0aW9uIGFzIGU6CiAgICAgICAgICAgIGxhc3RfZXJyb3IgPSBzdHIoZSkKICAgICAgICAgICAgY2FyZF9kYXRhID0gTm9uZQoKICAgICMgRmFsbCBiYWNrIHRvIGV4YWN0IG5hbWUgbG9va3VwCiAgICBpZiBub3QgY2FyZF9kYXRhOgogICAgICAgIF9zY3J5ZmFsbF9yYXRlX2xpbWl0KCkKICAgICAgICB0cnk6CiAgICAgICAgICAgIGVuY29kZWRfbmFtZSA9IHF1b3RlKG5hbWUpCiAgICAgICAgICAgIHVybCA9IGYiaHR0cHM6Ly9hcGkuc2NyeWZhbGwuY29tL2NhcmRzL25hbWVkP2V4YWN0PXtlbmNvZGVkX25hbWV9IgogICAgICAgICAgICByZXEgPSBSZXF1ZXN0KHVybCwgaGVhZGVycz1fQVBJX0hFQURFUlMpCiAgICAgICAgICAgIHdpdGggdXJsb3BlbihyZXEsIHRpbWVvdXQ9MTApIGFzIHJlc3A6CiAgICAgICAgICAgICAgICBjYXJkX2RhdGEgPSBqc29uLmxvYWRzKHJlc3AucmVhZCgpLmRlY29kZSgidXRmLTgiKSkKICAgICAgICBleGNlcHQgRXhjZXB0aW9uIGFzIGU6CiAgICAgICAgICAgIGxhc3RfZXJyb3IgPSBzdHIoZSkKICAgICAgICAgICAgcmV0dXJuIHsiX2Vycm9yIjogZiJTY3J5ZmFsbCBsb29rdXAgZmFpbGVkIGZvciAne25hbWV9Jzoge2xhc3RfZXJyb3J9In0KCiAgICBpZiBub3QgY2FyZF9kYXRhIG9yIGNhcmRfZGF0YS5nZXQoIm9iamVjdCIpID09ICJlcnJvciI6CiAgICAgICAgZXJyX2RldGFpbCA9IGNhcmRfZGF0YS5nZXQoImRldGFpbHMiLCAidW5rbm93biBlcnJvciIpIGlmIGNhcmRfZGF0YSBlbHNlIGxhc3RfZXJyb3IKICAgICAgICByZXR1cm4geyJfZXJyb3IiOiBmIlNjcnlmYWxsIHJldHVybmVkIGVycm9yIGZvciAne25hbWV9Jzoge2Vycl9kZXRhaWx9In0KCiAgICAjIOKUgOKUgCBDYWNoZSB0aGUgc3VjY2Vzc2Z1bCByZXNwb25zZSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKICAgIF9zY3J5ZmFsbF9jYWNoZS5wdXQobmFtZSwgc2V0X2NvZGUsIGNvbGxlY3Rvcl9udW1iZXIsIGNhcmRfZGF0YSkKICAgICMgQWxzbyBjYWNoZSB1bmRlciB0aGUgU2NyeWZhbGwtcmVzb2x2ZWQgbmFtZSAoaGFuZGxlcyBzcGVsbGluZyBub3JtYWxpc2F0aW9uKQogICAgcmVzb2x2ZWRfbmFtZSA9IGNhcmRfZGF0YS5nZXQoIm5hbWUiLCAiIikKICAgIGlmIHJlc29sdmVkX25hbWUgYW5kIHJlc29sdmVkX25hbWUubG93ZXIoKSAhPSBuYW1lLnN0cmlwKCkubG93ZXIoKToKICAgICAgICBfc2NyeWZhbGxfY2FjaGUucHV0KHJlc29sdmVkX25hbWUsIHNldF9jb2RlLCBjb2xsZWN0b3JfbnVtYmVyLCBjYXJkX2RhdGEpCgogICAgcmV0dXJuIGNhcmRfZGF0YQoKCmRlZiBfZW5yaWNoX2Zyb21fc2NyeWZhbGwobmFtZTogc3RyLCBzZXRfY29kZTogc3RyID0gIiIsIGNvbGxlY3Rvcl9udW1iZXI6IHN0ciA9ICIiKSAtPiBkaWN0OgogICAgIiIiCiAgICBGZXRjaCBjYXJkIGRhdGEgZnJvbSBTY3J5ZmFsbCAoY2FjaGVkKSBhbmQgcmV0dXJuIGVucmljaGVkIGZpZWxkcyBkaWN0LgogICAgVHJpZXMgc2V0K2NvbGxlY3Rvck51bWJlciBmaXJzdCwgdGhlbiBleGFjdCBuYW1lIGxvb2t1cC4KICAgIFJldHVybnMgZW1wdHkgZGljdCBvbiBmYWlsdXJlLgogICAgIiIiCiAgICBjYXJkX2RhdGEgPSBfZmV0Y2hfc2NyeWZhbGxfYXBpKG5hbWUsIHNldF9jb2RlLCBjb2xsZWN0b3JfbnVtYmVyKQoKICAgIGlmIG5vdCBjYXJkX2RhdGEgb3IgIl9lcnJvciIgaW4gY2FyZF9kYXRhOgogICAgICAgIHJldHVybiBjYXJkX2RhdGEgb3Ige30KCiAgICAjIEV4dHJhY3QgZmllbGRzCiAgICB0eXBlX2xpbmUgPSBjYXJkX2RhdGEuZ2V0KCJ0eXBlX2xpbmUiLCAiIikKICAgIGNvbG9yX2lkZW50aXR5ID0gY2FyZF9kYXRhLmdldCgiY29sb3JfaWRlbnRpdHkiLCBbXSkKICAgIGtleXdvcmRzID0gY2FyZF9kYXRhLmdldCgia2V5d29yZHMiLCBbXSkKCiAgICAjIFBhcnNlIHN1YnR5cGVzIChhZnRlciBlbS1kYXNoIG9yIGh5cGhlbikKICAgIHN1YnR5cGVzID0gW10KICAgIGZvciBzZXAgaW4gWyIgXHUyMDE0ICIsICIgLSAiXToKICAgICAgICBpZiBzZXAgaW4gdHlwZV9saW5lOgogICAgICAgICAgICBwYXJ0cyA9IHR5cGVfbGluZS5zcGxpdChzZXAsIDEpCiAgICAgICAgICAgIHN1YnR5cGVzID0gW3Muc3RyaXAoKSBmb3IgcyBpbiBwYXJ0c1sxXS5zcGxpdCgpIGlmIHMuc3RyaXAoKV0KICAgICAgICAgICAgYnJlYWsKCiAgICBpc19sZWdlbmRhcnkgPSAxIGlmICJMZWdlbmRhcnkiIGluIHR5cGVfbGluZSBlbHNlIDAKICAgIGlzX2Jhc2ljID0gMSBpZiAiQmFzaWMiIGluIHR5cGVfbGluZSBlbHNlIDAKCiAgICAjIEdldCBwcmljZQogICAgcHJpY2VzID0gY2FyZF9kYXRhLmdldCgicHJpY2VzIiwge30pCiAgICB0Y2dfcHJpY2UgPSAwLjAKICAgIHRyeToKICAgICAgICBwcmljZV92YWwgPSBwcmljZXMuZ2V0KCJ1c2QiKSBvciBwcmljZXMuZ2V0KCJ1c2RfZm9pbCIpIG9yICIwIgogICAgICAgIHRjZ19wcmljZSA9IGZsb2F0KHByaWNlX3ZhbCkgaWYgcHJpY2VfdmFsIGVsc2UgMC4wCiAgICBleGNlcHQgKFZhbHVlRXJyb3IsIFR5cGVFcnJvcik6CiAgICAgICAgdGNnX3ByaWNlID0gMC4wCgogICAgIyBIYW5kbGUgZG91YmxlLWZhY2VkIGNhcmRzOiBvcmFjbGVfdGV4dCBtYXkgYmUgb24gY2FyZF9mYWNlcwogICAgb3JhY2xlX3RleHQgPSBjYXJkX2RhdGEuZ2V0KCJvcmFjbGVfdGV4dCIsICIiKQogICAgaWYgbm90IG9yYWNsZV90ZXh0IGFuZCBjYXJkX2RhdGEuZ2V0KCJjYXJkX2ZhY2VzIik6CiAgICAgICAgZmFjZV90ZXh0cyA9IFtmLmdldCgib3JhY2xlX3RleHQiLCAiIikgZm9yIGYgaW4gY2FyZF9kYXRhWyJjYXJkX2ZhY2VzIl1dCiAgICAgICAgb3JhY2xlX3RleHQgPSAiXG4vL1xuIi5qb2luKHQgZm9yIHQgaW4gZmFjZV90ZXh0cyBpZiB0KQoKICAgICMgUG93ZXIvdG91Z2huZXNzIChtYXkgYmUgb24gY2FyZF9mYWNlcyBmb3IgREZDcykKICAgIHBvd2VyID0gY2FyZF9kYXRhLmdldCgicG93ZXIiLCAiIikKICAgIHRvdWdobmVzcyA9IGNhcmRfZGF0YS5nZXQoInRvdWdobmVzcyIsICIiKQogICAgaWYgbm90IHBvd2VyIGFuZCBjYXJkX2RhdGEuZ2V0KCJjYXJkX2ZhY2VzIik6CiAgICAgICAgcG93ZXIgPSBjYXJkX2RhdGFbImNhcmRfZmFjZXMiXVswXS5nZXQoInBvd2VyIiwgIiIpCiAgICAgICAgdG91Z2huZXNzID0gY2FyZF9kYXRhWyJjYXJkX2ZhY2VzIl1bMF0uZ2V0KCJ0b3VnaG5lc3MiLCAiIikKCiAgICAjIE1hbmEgY29zdCAobWF5IGJlIG9uIGNhcmRfZmFjZXMgZm9yIERGQ3MpCiAgICBtYW5hX2Nvc3QgPSBjYXJkX2RhdGEuZ2V0KCJtYW5hX2Nvc3QiLCAiIikKICAgIGlmIG5vdCBtYW5hX2Nvc3QgYW5kIGNhcmRfZGF0YS5nZXQoImNhcmRfZmFjZXMiKToKICAgICAgICBtYW5hX2Nvc3QgPSBjYXJkX2RhdGFbImNhcmRfZmFjZXMiXVswXS5nZXQoIm1hbmFfY29zdCIsICIiKQoKICAgICMgQXV0by1kZXRlY3QgZnVuY3Rpb25hbCBjYXRlZ29yaWVzCiAgICBhdXRvX3JvbGVzID0gX2RldGVjdF9jYXJkX3JvbGVzKG9yYWNsZV90ZXh0LCB0eXBlX2xpbmUsIGtleXdvcmRzKQoKICAgIHJldHVybiB7CiAgICAgICAgIm5hbWUiOiBjYXJkX2RhdGEuZ2V0KCJuYW1lIiwgbmFtZSksCiAgICAgICAgInR5cGVfbGluZSI6IHR5cGVfbGluZSwKICAgICAgICAic3VidHlwZXMiOiBqc29uLmR1bXBzKHN1YnR5cGVzKSwKICAgICAgICAiaXNfbGVnZW5kYXJ5IjogaXNfbGVnZW5kYXJ5LAogICAgICAgICJpc19iYXNpYyI6IGlzX2Jhc2ljLAogICAgICAgICJjb2xvcl9pZGVudGl0eSI6IGpzb24uZHVtcHMoY29sb3JfaWRlbnRpdHkpLAogICAgICAgICJjbWMiOiBjYXJkX2RhdGEuZ2V0KCJjbWMiLCAwLjApLAogICAgICAgICJtYW5hX2Nvc3QiOiBtYW5hX2Nvc3QsCiAgICAgICAgIm9yYWNsZV90ZXh0Ijogb3JhY2xlX3RleHQsCiAgICAgICAgImtleXdvcmRzIjoganNvbi5kdW1wcyhrZXl3b3JkcyksCiAgICAgICAgInBvd2VyIjogcG93ZXIgb3IgIiIsCiAgICAgICAgInRvdWdobmVzcyI6IHRvdWdobmVzcyBvciAiIiwKICAgICAgICAicmFyaXR5IjogY2FyZF9kYXRhLmdldCgicmFyaXR5IiwgIiIpLAogICAgICAgICJzZXRfbmFtZSI6IGNhcmRfZGF0YS5nZXQoInNldF9uYW1lIiwgIiIpLAogICAgICAgICJlZGhyZWNfcmFuayI6IGNhcmRfZGF0YS5nZXQoImVkaHJlY19yYW5rIiwgMCkgb3IgMCwKICAgICAgICAidGNnX3ByaWNlIjogdGNnX3ByaWNlLAogICAgICAgICJzYWx0X3Njb3JlIjogMC4wLAogICAgICAgICJpc19nYW1lX2NoYW5nZXIiOiAwLAogICAgICAgICJjYXRlZ29yeSI6IGpzb24uZHVtcHMoYXV0b19yb2xlcyksCiAgICAgICAgInNjcnlmYWxsX2lkIjogY2FyZF9kYXRhLmdldCgiaWQiLCAiIiksCiAgICAgICAgInRjZ3BsYXllcl9pZCI6IHN0cihjYXJkX2RhdGEuZ2V0KCJ0Y2dwbGF5ZXJfaWQiLCAiIikpLAogICAgfQoKCiMg4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQCiMgQ29sbGVjdGlvbiBJbXBvcnQgRW5kcG9pbnQKIyDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZAKCkBhcHAucG9zdCgiL2FwaS9jb2xsZWN0aW9uL2ltcG9ydCIpCmFzeW5jIGRlZiBpbXBvcnRfY29sbGVjdGlvbihib2R5OiBkaWN0KToKICAgICIiIgogICAgSW1wb3J0IGNhcmRzIGludG8gdGhlIGNvbGxlY3Rpb24gZnJvbSBDU1YsIE1veGZpZWxkLCBBcmNoaWRla3QsIG9yIHBsYWluIHRleHQuCgogICAgQm9keToKICAgICAgewogICAgICAgICJzb3VyY2UiOiAiQ1NWIiB8ICJNT1hGSUVMRCIgfCAiQVJDSElERUtUIiB8ICJURVhUIiwKICAgICAgICAibW9kZSI6ICJNRVJHRSIgfCAiUkVQTEFDRSIsCiAgICAgICAgImNvbnRlbnQiOiAiLi4uY3N2IG9yIHRleHQgY29udGVudC4uLiIsCiAgICAgICAgIm1hcHBpbmciOiB7IC4uLiBvcHRpb25hbCBjb2x1bW4gbWFwcGluZyAuLi4gfQogICAgICB9CiAgICAiIiIKICAgIHNvdXJjZSA9IHN0cihib2R5LmdldCgic291cmNlIiwgIkNTViIpKS51cHBlcigpCiAgICBtb2RlID0gc3RyKGJvZHkuZ2V0KCJtb2RlIiwgIk1FUkdFIikpLnVwcGVyKCkKICAgIGNvbnRlbnQgPSBzdHIoYm9keS5nZXQoImNvbnRlbnQiLCAiIikpCiAgICBtYXBwaW5nID0gYm9keS5nZXQoIm1hcHBpbmciLCB7fSkKCiAgICBpZiBub3QgY29udGVudC5zdHJpcCgpOgogICAgICAgIHJhaXNlIEhUVFBFeGNlcHRpb24oNDAwLCAiY29udGVudCBpcyByZXF1aXJlZCIpCgogICAgaW1wb3J0ZWRfY291bnQgPSAwCiAgICB1cGRhdGVkX2NvdW50ID0gMAogICAgZmFpbGVkX2NvdW50ID0gMAogICAgZXJyb3JzID0gW10KCiAgICBjb25uID0gX2dldF9kYl9jb25uKCkKCiAgICAjIFJFUExBQ0UgbW9kZTogY2xlYXIgZXhpc3RpbmcgZW50cmllcwogICAgaWYgbW9kZSA9PSAiUkVQTEFDRSI6CiAgICAgICAgY29ubi5leGVjdXRlKCJERUxFVEUgRlJPTSBjb2xsZWN0aW9uX2VudHJpZXMiKQogICAgICAgIGNvbm4uY29tbWl0KCkKCiAgICAjIFBhcnNlIHRoZSBjb250ZW50IGludG8gcmF3IHJvd3MKICAgIHRyeToKICAgICAgICByYXdfcm93cyA9IF9wYXJzZV9jc3ZfY29udGVudChjb250ZW50LCBzb3VyY2UsIG1hcHBpbmcgaWYgbWFwcGluZyBlbHNlIE5vbmUpCiAgICBleGNlcHQgRXhjZXB0aW9uIGFzIGU6CiAgICAgICAgcmFpc2UgSFRUUEV4Y2VwdGlvbig0MDAsIGYiRmFpbGVkIHRvIHBhcnNlIGNvbnRlbnQ6IHtzdHIoZSl9IikKCiAgICBmb3IgcmF3IGluIHJhd19yb3dzOgogICAgICAgIG5hbWUgPSByYXcuZ2V0KCJuYW1lIiwgIiIpLnN0cmlwKCkKICAgICAgICBpZiBub3QgbmFtZToKICAgICAgICAgICAgY29udGludWUKCiAgICAgICAgcXVhbnRpdHkgPSBpbnQocmF3LmdldCgicXVhbnRpdHkiLCAxKSkKICAgICAgICBzZXRfY29kZSA9IHJhdy5nZXQoInNldF9jb2RlIiwgIiIpLmxvd2VyKCkKICAgICAgICBjb2xsZWN0b3JfbnVtYmVyID0gcmF3LmdldCgiY29sbGVjdG9yX251bWJlciIsICIiKQogICAgICAgIGZpbmlzaCA9IF9wYXJzZV9maW5pc2gocmF3LmdldCgiZmluaXNoIiwgIiIpKQogICAgICAgIGNvbmRpdGlvbiA9IHJhdy5nZXQoImNvbmRpdGlvbiIsICIiKQogICAgICAgIGxhbmd1YWdlID0gcmF3LmdldCgibGFuZ3VhZ2UiLCAiIikKICAgICAgICBub3RlcyA9IHJhdy5nZXQoIm5vdGVzIiwgIiIpCiAgICAgICAgdGFncyA9IHJhdy5nZXQoInRhZ3MiLCAiIikKCiAgICAgICAgIyBTY3J5ZmFsbCBlbnJpY2htZW50CiAgICAgICAgdHJ5OgogICAgICAgICAgICBlbnJpY2hlZCA9IF9lbnJpY2hfZnJvbV9zY3J5ZmFsbChuYW1lLCBzZXRfY29kZSwgY29sbGVjdG9yX251bWJlcikKICAgICAgICBleGNlcHQgRXhjZXB0aW9uIGFzIGU6CiAgICAgICAgICAgIGVycm9ycy5hcHBlbmQoZiJTY3J5ZmFsbCBlcnJvciBmb3IgJ3tuYW1lfSc6IHtzdHIoZSl9IikKICAgICAgICAgICAgZmFpbGVkX2NvdW50ICs9IDEKICAgICAgICAgICAgY29udGludWUKCiAgICAgICAgaWYgbm90IGVucmljaGVkIG9yICJfZXJyb3IiIGluIGVucmljaGVkOgogICAgICAgICAgICBlcnJfbXNnID0gZW5yaWNoZWQuZ2V0KCJfZXJyb3IiLCBmIkNhcmQgbm90IGZvdW5kIG9uIFNjcnlmYWxsOiAne25hbWV9JyIpIGlmIGVucmljaGVkIGVsc2UgZiJDYXJkIG5vdCBmb3VuZCBvbiBTY3J5ZmFsbDogJ3tuYW1lfSciCiAgICAgICAgICAgIGVycm9ycy5hcHBlbmQoZXJyX21zZykKICAgICAgICAgICAgZmFpbGVkX2NvdW50ICs9IDEKICAgICAgICAgICAgY29udGludWUKCiAgICAgICAgIyBVc2UgU2NyeWZhbGwtcmVzb2x2ZWQgbmFtZSBpZiBhdmFpbGFibGUKICAgICAgICByZXNvbHZlZF9uYW1lID0gZW5yaWNoZWQuZ2V0KCJuYW1lIiwgbmFtZSkKCiAgICAgICAgIyBDaGVjayBmb3IgZXhpc3RpbmcgZW50cnkgKGlkZW50aXR5IGtleSkKICAgICAgICBleGlzdGluZyA9IGNvbm4uZXhlY3V0ZSgKICAgICAgICAgICAgIiIiU0VMRUNUIGlkLCBxdWFudGl0eSBGUk9NIGNvbGxlY3Rpb25fZW50cmllcwogICAgICAgICAgICAgICBXSEVSRSBuYW1lID0gPyBBTkQgc2V0X2NvZGUgPSA/IEFORCBjb2xsZWN0b3JfbnVtYmVyID0gPyBBTkQgZmluaXNoID0gPyIiIiwKICAgICAgICAgICAgKHJlc29sdmVkX25hbWUsIHNldF9jb2RlLCBjb2xsZWN0b3JfbnVtYmVyLCBmaW5pc2gpLAogICAgICAgICkuZmV0Y2hvbmUoKQoKICAgICAgICBpZiBleGlzdGluZyBhbmQgbW9kZSA9PSAiTUVSR0UiOgogICAgICAgICAgICAjIFVwZGF0ZSBxdWFudGl0eQogICAgICAgICAgICBuZXdfcXR5ID0gZXhpc3RpbmdbInF1YW50aXR5Il0gKyBxdWFudGl0eQogICAgICAgICAgICBjb25uLmV4ZWN1dGUoCiAgICAgICAgICAgICAgICAiVVBEQVRFIGNvbGxlY3Rpb25fZW50cmllcyBTRVQgcXVhbnRpdHkgPSA/LCB1cGRhdGVkX2F0ID0gZGF0ZXRpbWUoJ25vdycpIFdIRVJFIGlkID0gPyIsCiAgICAgICAgICAgICAgICAobmV3X3F0eSwgZXhpc3RpbmdbImlkIl0pLAogICAgICAgICAgICApCiAgICAgICAgICAgIGNvbm4uY29tbWl0KCkKICAgICAgICAgICAgdXBkYXRlZF9jb3VudCArPSAxCiAgICAgICAgZWxzZToKICAgICAgICAgICAgIyBJbnNlcnQgbmV3IHJvdwogICAgICAgICAgICBjb25uLmV4ZWN1dGUoCiAgICAgICAgICAgICAgICAiIiJJTlNFUlQgSU5UTyBjb2xsZWN0aW9uX2VudHJpZXMKICAgICAgICAgICAgICAgICAgIChuYW1lLCB0eXBlX2xpbmUsIHN1YnR5cGVzLCBpc19sZWdlbmRhcnksIGlzX2Jhc2ljLCBjb2xvcl9pZGVudGl0eSwKICAgICAgICAgICAgICAgICAgICBjbWMsIG1hbmFfY29zdCwgb3JhY2xlX3RleHQsIGtleXdvcmRzLAogICAgICAgICAgICAgICAgICAgIHBvd2VyLCB0b3VnaG5lc3MsIHJhcml0eSwgc2V0X25hbWUsIGVkaHJlY19yYW5rLAogICAgICAgICAgICAgICAgICAgIHRjZ19wcmljZSwgc2FsdF9zY29yZSwgaXNfZ2FtZV9jaGFuZ2VyLAogICAgICAgICAgICAgICAgICAgIGNhdGVnb3J5LCBzY3J5ZmFsbF9pZCwgdGNncGxheWVyX2lkLAogICAgICAgICAgICAgICAgICAgIHF1YW50aXR5LCBmaW5pc2gsIGNvbmRpdGlvbiwgbGFuZ3VhZ2UsIG5vdGVzLCB0YWdzLAogICAgICAgICAgICAgICAgICAgIHNldF9jb2RlLCBjb2xsZWN0b3JfbnVtYmVyKQogICAgICAgICAgICAgICAgICAgVkFMVUVTICg/LCA/LCA/LCA/LCA/LCA/LCA/LCA/LCA/LCA/LCA/LCA/LCA/LCA/LCA/LCA/LCA/LCA/LCA/LCA/LCA/LCA/LCA/LCA/LCA/LCA/LCA/LCA/LCA/KSIiIiwKICAgICAgICAgICAgICAgICgKICAgICAgICAgICAgICAgICAgICByZXNvbHZlZF9uYW1lLAogICAgICAgICAgICAgICAgICAgIGVucmljaGVkLmdldCgidHlwZV9saW5lIiwgIiIpLAogICAgICAgICAgICAgICAgICAgIGVucmljaGVkLmdldCgic3VidHlwZXMiLCAiW10iKSwKICAgICAgICAgICAgICAgICAgICBlbnJpY2hlZC5nZXQoImlzX2xlZ2VuZGFyeSIsIDApLAogICAgICAgICAgICAgICAgICAgIGVucmljaGVkLmdldCgiaXNfYmFzaWMiLCAwKSwKICAgICAgICAgICAgICAgICAgICBlbnJpY2hlZC5nZXQoImNvbG9yX2lkZW50aXR5IiwgIltdIiksCiAgICAgICAgICAgICAgICAgICAgZW5yaWNoZWQuZ2V0KCJjbWMiLCAwLjApLAogICAgICAgICAgICAgICAgICAgIGVucmljaGVkLmdldCgibWFuYV9jb3N0IiwgIiIpLAogICAgICAgICAgICAgICAgICAgIGVucmljaGVkLmdldCgib3JhY2xlX3RleHQiLCAiIiksCiAgICAgICAgICAgICAgICAgICAgZW5yaWNoZWQuZ2V0KCJrZXl3b3JkcyIsICJbXSIpLAogICAgICAgICAgICAgICAgICAgIGVucmljaGVkLmdldCgicG93ZXIiLCAiIiksCiAgICAgICAgICAgICAgICAgICAgZW5yaWNoZWQuZ2V0KCJ0b3VnaG5lc3MiLCAiIiksCiAgICAgICAgICAgICAgICAgICAgZW5yaWNoZWQuZ2V0KCJyYXJpdHkiLCAiIiksCiAgICAgICAgICAgICAgICAgICAgZW5yaWNoZWQuZ2V0KCJzZXRfbmFtZSIsICIiKSwKICAgICAgICAgICAgICAgICAgICBlbnJpY2hlZC5nZXQoImVkaHJlY19yYW5rIiwgMCksCiAgICAgICAgICAgICAgICAgICAgZW5yaWNoZWQuZ2V0KCJ0Y2dfcHJpY2UiLCAwLjApLAogICAgICAgICAgICAgICAgICAgIGVucmljaGVkLmdldCgic2FsdF9zY29yZSIsIDAuMCksCiAgICAgICAgICAgICAgICAgICAgZW5yaWNoZWQuZ2V0KCJpc19nYW1lX2NoYW5nZXIiLCAwKSwKICAgICAgICAgICAgICAgICAgICBlbnJpY2hlZC5nZXQoImNhdGVnb3J5IiwgIltdIiksCiAgICAgICAgICAgICAgICAgICAgZW5yaWNoZWQuZ2V0KCJzY3J5ZmFsbF9pZCIsICIiKSwKICAgICAgICAgICAgICAgICAgICBlbnJpY2hlZC5nZXQoInRjZ3BsYXllcl9pZCIsICIiKSwKICAgICAgICAgICAgICAgICAgICBxdWFudGl0eSwKICAgICAgICAgICAgICAgICAgICBmaW5pc2gsCiAgICAgICAgICAgICAgICAgICAgY29uZGl0aW9uLAogICAgICAgICAgICAgICAgICAgIGxhbmd1YWdlLAogICAgICAgICAgICAgICAgICAgIG5vdGVzLAogICAgICAgICAgICAgICAgICAgIHRhZ3MsCiAgICAgICAgICAgICAgICAgICAgc2V0X2NvZGUsCiAgICAgICAgICAgICAgICAgICAgY29sbGVjdG9yX251bWJlciwKICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICkKICAgICAgICAgICAgY29ubi5jb21taXQoKQogICAgICAgICAgICBpbXBvcnRlZF9jb3VudCArPSAxCgogICAgcmV0dXJuIHsKICAgICAgICAiaW1wb3J0ZWRDb3VudCI6IGltcG9ydGVkX2NvdW50LAogICAgICAgICJ1cGRhdGVkQ291bnQiOiB1cGRhdGVkX2NvdW50LAogICAgICAgICJmYWlsZWRDb3VudCI6IGZhaWxlZF9jb3VudCwKICAgICAgICAiZXJyb3JzIjogZXJyb3JzLAogICAgfQoKCiMg4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQCiMgU2NyeWZhbGwgQ2FjaGUgTWFuYWdlbWVudCBFbmRwb2ludHMKIyDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZAKCgpAYXBwLmdldCgiL2FwaS9jYWNoZS9zY3J5ZmFsbCIpCmFzeW5jIGRlZiBzY3J5ZmFsbF9jYWNoZV9zdGF0cygpOgogICAgIiIiUmV0dXJuIFNjcnlmYWxsIHJlc3BvbnNlIGNhY2hlIHN0YXRpc3RpY3MuIiIiCiAgICByZXR1cm4gX3NjcnlmYWxsX2NhY2hlLnN0YXRzKCkKCgpAYXBwLmRlbGV0ZSgiL2FwaS9jYWNoZS9zY3J5ZmFsbCIpCmFzeW5jIGRlZiBzY3J5ZmFsbF9jYWNoZV9jbGVhcigpOgogICAgIiIiQ2xlYXIgYWxsIGNhY2hlZCBTY3J5ZmFsbCByZXNwb25zZXMuIiIiCiAgICBkZWxldGVkID0gX3NjcnlmYWxsX2NhY2hlLmNsZWFyKCkKICAgIHJldHVybiB7ImNsZWFyZWQiOiBkZWxldGVkLCAibWVzc2FnZSI6IGYiRGVsZXRlZCB7ZGVsZXRlZH0gY2FjaGVkIGVudHJpZXMifQoKCkBhcHAucG9zdCgiL2FwaS9jYWNoZS9zY3J5ZmFsbC9ldmljdCIpCmFzeW5jIGRlZiBzY3J5ZmFsbF9jYWNoZV9ldmljdF9leHBpcmVkKCk6CiAgICAiIiJSZW1vdmUgb25seSBleHBpcmVkIGVudHJpZXMgKG9sZGVyIHRoYW4gVFRMKSBmcm9tIHRoZSBjYWNoZS4iIiIKICAgIGV2aWN0ZWQgPSBfc2NyeWZhbGxfY2FjaGUuZXZpY3RfZXhwaXJlZCgpCiAgICByZXR1cm4geyJldmljdGVkIjogZXZpY3RlZCwgIm1lc3NhZ2UiOiBmIkV2aWN0ZWQge2V2aWN0ZWR9IGV4cGlyZWQgZW50cmllcyJ9CgoKIyDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZAKIyBEZWNrIEJ1aWxkZXIgSGVscGVycwojIOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkAoKIyBUeXBlIGNsYXNzaWZpY2F0aW9uIHByaW9yaXR5IG9yZGVyCl9UWVBFX1BSSU9SSVRZID0gWyJMYW5kIiwgIkluc3RhbnQiLCAiU29yY2VyeSIsICJBcnRpZmFjdCIsICJFbmNoYW50bWVudCIsICJQbGFuZXN3YWxrZXIiLCAiQ3JlYXR1cmUiXQoKIyBUYXJnZXQgcmFuZ2VzOiB7dHlwZTogW21pbiwgbWF4XX0KX1RZUEVfVEFSR0VUUyA9IHsKICAgICJMYW5kIjogWzM2LCAzOF0sCiAgICAiSW5zdGFudCI6IFs5LCAxMV0sCiAgICAiU29yY2VyeSI6IFs3LCA5XSwKICAgICJBcnRpZmFjdCI6IFs5LCAxMV0sCiAgICAiQ3JlYXR1cmUiOiBbMjAsIDMwXSwKICAgICJFbmNoYW50bWVudCI6IFs1LCAxMF0sCiAgICAiUGxhbmVzd2Fsa2VyIjogWzAsIDVdLAp9CgoKZGVmIF9jbGFzc2lmeV9jYXJkX3R5cGUodHlwZV9saW5lOiBzdHIpIC0+IHN0cjoKICAgICIiIkNsYXNzaWZ5IGEgY2FyZCdzIHByaW1hcnkgdHlwZSBwZXIgcHJpb3JpdHkgb3JkZXIuIiIiCiAgICB0bCA9IHR5cGVfbGluZSBvciAiIgogICAgZm9yIHQgaW4gX1RZUEVfUFJJT1JJVFk6CiAgICAgICAgaWYgdCBpbiB0bDoKICAgICAgICAgICAgcmV0dXJuIHQKICAgIHJldHVybiAiT3RoZXIiCgoKZGVmIF9kZXRlY3RfY2FyZF9yb2xlcyhvcmFjbGVfdGV4dDogc3RyLCB0eXBlX2xpbmU6IHN0ciwga2V5d29yZHMpIC0+IGxpc3Q6CiAgICAiIiIKICAgIERldGVjdCBmdW5jdGlvbmFsIHJvbGVzIGZyb20gb3JhY2xlIHRleHQsIHR5cGUgbGluZSwgYW5kIGtleXdvcmRzLgogICAgSW5zcGlyZWQgYnkgQXJjaGlkZWt0IGF1dG8tY2F0ZWdvcnkgc3lzdGVtLgogICAgUmV0dXJucyBhIGxpc3Qgb2Ygcm9sZSBzdHJpbmdzLgogICAgIiIiCiAgICByb2xlcyA9IFtdCiAgICBvdCA9IChvcmFjbGVfdGV4dCBvciAiIikubG93ZXIoKQogICAgdGwgPSAodHlwZV9saW5lIG9yICIiKS5sb3dlcigpCiAgICBrd19yYXcgPSBrZXl3b3JkcyBvciBbXQogICAgaWYgaXNpbnN0YW5jZShrd19yYXcsIHN0cik6CiAgICAgICAgdHJ5OgogICAgICAgICAgICBrd19yYXcgPSBqc29uLmxvYWRzKGt3X3JhdykKICAgICAgICBleGNlcHQgRXhjZXB0aW9uOgogICAgICAgICAgICBrd19yYXcgPSBbXQogICAga3cgPSAiICIuam9pbihzdHIoaykubG93ZXIoKSBmb3IgayBpbiBrd19yYXcpCgogICAgIyDilIDilIAgUmFtcCDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKICAgIGlmICgKICAgICAgICAiYWRkIHsiIGluIG90CiAgICAgICAgb3IgImFkZCBvbmUgbWFuYSIgaW4gb3QKICAgICAgICBvciAoInNlYXJjaCB5b3VyIGxpYnJhcnkgZm9yIGEiIGluIG90IGFuZCAibGFuZCIgaW4gb3QpCiAgICAgICAgb3IgKCJsYW5kIiBpbiB0bCBhbmQgImVudGVycyIgaW4gb3QgYW5kICJhZGQiIGluIG90KQogICAgICAgIG9yICJ0cmVhc3VyZSB0b2tlbiIgaW4gb3QKICAgICAgICBvciAiYWRkIG1hbmEiIGluIG90CiAgICApOgogICAgICAgIHJvbGVzLmFwcGVuZCgiUmFtcCIpCgogICAgIyDilIDilIAgRHJhdyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKICAgIGlmICgKICAgICAgICAiZHJhdyBhIGNhcmQiIGluIG90CiAgICAgICAgb3IgImRyYXcgY2FyZHMiIGluIG90CiAgICAgICAgb3IgImRyYXdzIGEgY2FyZCIgaW4gb3QKICAgICAgICBvciAiZHJhdyB0d28gY2FyZHMiIGluIG90CiAgICAgICAgb3IgImRyYXcgdGhyZWUgY2FyZHMiIGluIG90CiAgICAgICAgb3IgcmUuc2VhcmNoKHIiZHJhdyBcZCsgY2FyZHM/Iiwgb3QpCiAgICAgICAgb3IgIndoZW5ldmVyIiBpbiBvdCBhbmQgImRyYXciIGluIG90CiAgICApOgogICAgICAgIHJvbGVzLmFwcGVuZCgiRHJhdyIpCgogICAgIyDilIDilIAgUmVtb3ZhbCDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKICAgIGlmICgKICAgICAgICAiZGVzdHJveSB0YXJnZXQiIGluIG90CiAgICAgICAgb3IgImV4aWxlIHRhcmdldCIgaW4gb3QKICAgICAgICBvciByZS5zZWFyY2gociJkZWFscz8gXGQrIGRhbWFnZSB0byAodGFyZ2V0fGFueSB0YXJnZXQpIiwgb3QpCiAgICAgICAgb3IgcmUuc2VhcmNoKHIiZGVhbHM/IHggZGFtYWdlIHRvICh0YXJnZXR8YW55IHRhcmdldCkiLCBvdCkKICAgICAgICBvciAidGFyZ2V0IGNyZWF0dXJlIGdldHMgLSIgaW4gb3QKICAgICAgICBvciAiZmlnaHRzIHRhcmdldCIgaW4gb3QKICAgICk6CiAgICAgICAgcm9sZXMuYXBwZW5kKCJSZW1vdmFsIikKCiAgICAjIOKUgOKUgCBCb2FyZCBXaXBlIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgAogICAgaWYgKAogICAgICAgICJkZXN0cm95IGFsbCIgaW4gb3QKICAgICAgICBvciAiZXhpbGUgYWxsIiBpbiBvdAogICAgICAgIG9yIHJlLnNlYXJjaChyImFsbCBjcmVhdHVyZXMgZ2V0IC1cZCsvLVxkKyIsIG90KQogICAgICAgIG9yIHJlLnNlYXJjaChyImVhY2ggY3JlYXR1cmUgZ2V0cyAtXGQrLy1cZCsiLCBvdCkKICAgICAgICBvciAoImRlYWxzIiBpbiBvdCBhbmQgInRvIGVhY2ggY3JlYXR1cmUiIGluIG90KQogICAgKToKICAgICAgICByb2xlcy5hcHBlbmQoIkJvYXJkIFdpcGUiKQoKICAgICMg4pSA4pSAIEFudGhlbSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKICAgIGlmICgKICAgICAgICByZS5zZWFyY2gociJjcmVhdHVyZXM/IHlvdSBjb250cm9sIGdldCBcKyIsIG90KQogICAgICAgIG9yIHJlLnNlYXJjaChyImNyZWF0dXJlcz8geW91IGNvbnRyb2wgaGF2ZSIsIG90KQogICAgICAgIG9yIHJlLnNlYXJjaChyIm90aGVyIGNyZWF0dXJlcz8geW91IGNvbnRyb2wgZ2V0IFwrIiwgb3QpCiAgICAgICAgb3IgcmUuc2VhcmNoKHIiZWFjaCBjcmVhdHVyZSB5b3UgY29udHJvbCBnZXRzPyBcKyIsIG90KQogICAgKToKICAgICAgICByb2xlcy5hcHBlbmQoIkFudGhlbSIpCgogICAgIyDilIDilIAgUHJvdGVjdGlvbiDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKICAgIGlmICgKICAgICAgICAiaGV4cHJvb2YiIGluIG90IG9yICJoZXhwcm9vZiIgaW4ga3cKICAgICAgICBvciAiaW5kZXN0cnVjdGlibGUiIGluIG90IG9yICJpbmRlc3RydWN0aWJsZSIgaW4ga3cKICAgICAgICBvciAic2hyb3VkIiBpbiBvdCBvciAic2hyb3VkIiBpbiBrdwogICAgICAgIG9yICJ3YXJkIiBpbiBvdCBvciAid2FyZCIgaW4ga3cKICAgICAgICBvciAicHJvdGVjdGlvbiBmcm9tIiBpbiBvdAogICAgICAgIG9yICJjYW4ndCBiZSB0aGUgdGFyZ2V0IiBpbiBvdAogICAgKToKICAgICAgICByb2xlcy5hcHBlbmQoIlByb3RlY3Rpb24iKQoKICAgICMg4pSA4pSAIFR1dG9yIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgAogICAgaWYgInNlYXJjaCB5b3VyIGxpYnJhcnkiIGluIG90OgogICAgICAgIHJvbGVzLmFwcGVuZCgiVHV0b3IiKQoKICAgICMg4pSA4pSAIENvdW50ZXIg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACiAgICBpZiAiY291bnRlciB0YXJnZXQiIGluIG90OgogICAgICAgIHJvbGVzLmFwcGVuZCgiQ291bnRlciIpCgogICAgIyDilIDilIAgVG9rZW4g4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACiAgICBpZiAoCiAgICAgICAgcmUuc2VhcmNoKHIiY3JlYXRlW3NkXT8gLip0b2tlbiIsIG90KQogICAgICAgIG9yICJjcmVhdHVyZSB0b2tlbiIgaW4gb3QKICAgICk6CiAgICAgICAgcm9sZXMuYXBwZW5kKCJUb2tlbiIpCgogICAgIyDilIDilIAgU2FjcmlmaWNlIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgAogICAgaWYgKAogICAgICAgICJzYWNyaWZpY2UgYSAiIGluIG90CiAgICAgICAgb3IgInNhY3JpZmljZSBhbm90aGVyIiBpbiBvdAogICAgICAgIG9yICJ3aGVuIiBpbiBvdCBhbmQgInNhY3JpZmljZSIgaW4gb3QgYW5kICJkaWVzIiBub3QgaW4gb3QKICAgICAgICBvciAiZWFjaCBwbGF5ZXIgc2FjcmlmaWNlcyIgaW4gb3QKICAgICk6CiAgICAgICAgcm9sZXMuYXBwZW5kKCJTYWNyaWZpY2UiKQoKICAgICMg4pSA4pSAIFJlY3Vyc2lvbiAvIFJlYW5pbWF0ZSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKICAgIGlmICgKICAgICAgICAicmV0dXJuIiBpbiBvdCBhbmQgImZyb20geW91ciBncmF2ZXlhcmQiIGluIG90CiAgICAgICAgb3IgInJldHVybiIgaW4gb3QgYW5kICJmcm9tIGEgZ3JhdmV5YXJkIiBpbiBvdAogICAgICAgIG9yICJwdXQiIGluIG90IGFuZCAiZnJvbSB5b3VyIGdyYXZleWFyZCIgaW4gb3QgYW5kICJvbnRvIHRoZSBiYXR0bGVmaWVsZCIgaW4gb3QKICAgICAgICBvciAicHV0IiBpbiBvdCBhbmQgImZyb20gYSBncmF2ZXlhcmQiIGluIG90IGFuZCAib250byB0aGUgYmF0dGxlZmllbGQiIGluIG90CiAgICApOgogICAgICAgIHJvbGVzLmFwcGVuZCgiUmVjdXJzaW9uIikKCiAgICAjIOKUgOKUgCBHcmF2ZXlhcmQg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACiAgICBpZiAoCiAgICAgICAgImdyYXZleWFyZCIgaW4gb3QKICAgICAgICBhbmQgKCJtaWxsIiBpbiBvdCBvciAicHV0IiBpbiBvdCBhbmQgImludG8iIGluIG90IGFuZCAiZ3JhdmV5YXJkIiBpbiBvdCkKICAgICkgb3IgIm1pbGwiIGluIGt3OgogICAgICAgIHJvbGVzLmFwcGVuZCgiR3JhdmV5YXJkIikKCiAgICAjIOKUgOKUgCBMaWZlZ2FpbiDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKICAgIGlmICgKICAgICAgICAiZ2FpbiIgaW4gb3QgYW5kICJsaWZlIiBpbiBvdAogICAgICAgIG9yICJsaWZlbGluayIgaW4gb3Qgb3IgImxpZmVsaW5rIiBpbiBrdwogICAgKToKICAgICAgICByb2xlcy5hcHBlbmQoIkxpZmVnYWluIikKCiAgICAjIOKUgOKUgCBCdXJuIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgAogICAgaWYgKAogICAgICAgIHJlLnNlYXJjaChyImRlYWxzPyBcZCsgZGFtYWdlIHRvIChlYWNofGFueXx0YXJnZXQpIChvcHBvbmVudHxwbGF5ZXIpIiwgb3QpCiAgICAgICAgb3IgImVhY2ggb3Bwb25lbnQgbG9zZXMiIGluIG90IGFuZCAibGlmZSIgaW4gb3QKICAgICAgICBvciAiZGVhbHMgZGFtYWdlIHRvIGVhY2ggb3Bwb25lbnQiIGluIG90CiAgICApOgogICAgICAgIHJvbGVzLmFwcGVuZCgiQnVybiIpCgogICAgIyDilIDilIAgU3RheCDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKICAgIGlmICgKICAgICAgICAiY2FuJ3QgY2FzdCIgaW4gb3QKICAgICAgICBvciAiY2FuJ3QgYXR0YWNrIiBpbiBvdAogICAgICAgIG9yICJjYW4ndCBhY3RpdmF0ZSIgaW4gb3QKICAgICAgICBvciAiZW50ZXJzIHRoZSBiYXR0bGVmaWVsZCB0YXBwZWQiIGluIG90IGFuZCAib3Bwb25lbnRzIiBpbiBvdAogICAgICAgIG9yICJlYWNoIHBsYXllciBjYW4ndCIgaW4gb3QKICAgICAgICBvciAicGxheWVycyBjYW4ndCIgaW4gb3QKICAgICAgICBvciAiY29zdCB7IiBpbiBvdCBhbmQgIm1vcmUgdG8gY2FzdCIgaW4gb3QKICAgICAgICBvciAiY29zdCBtb3JlIiBpbiBvdCBhbmQgInNwZWxscyIgaW4gb3QKICAgICk6CiAgICAgICAgcm9sZXMuYXBwZW5kKCJTdGF4IikKCiAgICAjIOKUgOKUgCBFdmFzaW9uIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgAogICAgaWYgKAogICAgICAgICJmbHlpbmciIGluIGt3CiAgICAgICAgb3IgInRyYW1wbGUiIGluIGt3CiAgICAgICAgb3IgIm1lbmFjZSIgaW4ga3cKICAgICAgICBvciAic2hhZG93IiBpbiBrdwogICAgICAgIG9yICJmZWFyIiBpbiBrdwogICAgICAgIG9yICJpbnRpbWlkYXRlIiBpbiBrdwogICAgICAgIG9yICJjYW4ndCBiZSBibG9ja2VkIiBpbiBvdAogICAgICAgIG9yICJ1bmJsb2NrYWJsZSIgaW4gb3QKICAgICk6CiAgICAgICAgcm9sZXMuYXBwZW5kKCJFdmFzaW9uIikKCiAgICAjIOKUgOKUgCBGaW5pc2hlciDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKICAgIGlmICgKICAgICAgICAieW91IHdpbiB0aGUgZ2FtZSIgaW4gb3QKICAgICAgICBvciAiZXh0cmEgdHVybiIgaW4gb3QKICAgICAgICBvciAiaW5maW5pdGUiIGluIG90CiAgICAgICAgb3IgImxvc2VzIHRoZSBnYW1lIiBpbiBvdAogICAgICAgIG9yICJkYW1hZ2UgZXF1YWwgdG8iIGluIG90IGFuZCAoIm51bWJlciIgaW4gb3Qgb3IgInRvdGFsIiBpbiBvdCkKICAgICk6CiAgICAgICAgcm9sZXMuYXBwZW5kKCJGaW5pc2hlciIpCgogICAgIyDilIDilIAgQ29tYm8g4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACiAgICBpZiAoCiAgICAgICAgInVudGFwIGFsbCIgaW4gb3QKICAgICAgICBvciAiY29weSIgaW4gb3QgYW5kICJzcGVsbCIgaW4gb3QKICAgICAgICBvciAidGFrZSBhbiBleHRyYSIgaW4gb3QKICAgICAgICBvciAiZG91YmxlIiBpbiBvdCBhbmQgKCJkYW1hZ2UiIGluIG90IG9yICJjb3VudGVycyIgaW4gb3Qgb3IgInRva2VucyIgaW4gb3QpCiAgICApOgogICAgICAgIHJvbGVzLmFwcGVuZCgiQ29tYm8iKQoKICAgIHJldHVybiByb2xlcwoKCmRlZiBfZ2V0X2RlY2tfb3JfNDA0KGRlY2tfaWQ6IGludCk6CiAgICAiIiJGZXRjaCBhIGRlY2sgcm93IG9yIHJhaXNlIDQwNC4iIiIKICAgIGNvbm4gPSBfZ2V0X2RiX2Nvbm4oKQogICAgcm93ID0gY29ubi5leGVjdXRlKCJTRUxFQ1QgKiBGUk9NIGRlY2tzIFdIRVJFIGlkID0gPyIsIChkZWNrX2lkLCkpLmZldGNob25lKCkKICAgIGlmIG5vdCByb3c6CiAgICAgICAgcmFpc2UgSFRUUEV4Y2VwdGlvbig0MDQsIGYiRGVjayB7ZGVja19pZH0gbm90IGZvdW5kIikKICAgIGQgPSBkaWN0KHJvdykKICAgIHRyeToKICAgICAgICBkWyJjb2xvcl9pZGVudGl0eSJdID0ganNvbi5sb2FkcyhkLmdldCgiY29sb3JfaWRlbnRpdHkiLCAiW10iKSkKICAgIGV4Y2VwdCBFeGNlcHRpb246CiAgICAgICAgZFsiY29sb3JfaWRlbnRpdHkiXSA9IFtdCiAgICByZXR1cm4gZAoKCmRlZiBfY29tcHV0ZV9kZWNrX2FuYWx5c2lzKGRlY2tfaWQ6IGludCkgLT4gZGljdDoKICAgICIiIgogICAgQnVpbGQgdGhlIGZ1bGwgYW5hbHlzaXMgZGljdCBmb3IgYSBkZWNrLgogICAgSm9pbnMgZGVja19jYXJkcyB3aXRoIGNvbGxlY3Rpb25fZW50cmllcyB2aWEgc2NyeWZhbGxfaWQuCiAgICAiIiIKICAgIGNvbm4gPSBfZ2V0X2RiX2Nvbm4oKQoKICAgIHJvd3MgPSBjb25uLmV4ZWN1dGUoCiAgICAgICAgIiIiCiAgICAgICAgU0VMRUNUIGRjLmlkLCBkYy5zY3J5ZmFsbF9pZCwgZGMuY2FyZF9uYW1lLCBkYy5xdWFudGl0eSwgZGMuaXNfY29tbWFuZGVyLCBkYy5yb2xlX3RhZywKICAgICAgICAgICAgICAgY2UudHlwZV9saW5lLCBjZS5vcmFjbGVfdGV4dCwgY2Uua2V5d29yZHMsIGNlLmNtYywgY2UuY29sb3JfaWRlbnRpdHkKICAgICAgICBGUk9NIGRlY2tfY2FyZHMgZGMKICAgICAgICBMRUZUIEpPSU4gKAogICAgICAgICAgICBTRUxFQ1Qgc2NyeWZhbGxfaWQsIHR5cGVfbGluZSwgb3JhY2xlX3RleHQsIGtleXdvcmRzLCBjbWMsIGNvbG9yX2lkZW50aXR5CiAgICAgICAgICAgIEZST00gY29sbGVjdGlvbl9lbnRyaWVzIEdST1VQIEJZIHNjcnlmYWxsX2lkCiAgICAgICAgKSBjZSBPTiBjZS5zY3J5ZmFsbF9pZCA9IGRjLnNjcnlmYWxsX2lkCiAgICAgICAgV0hFUkUgZGMuZGVja19pZCA9ID8KICAgICAgICAiIiIsCiAgICAgICAgKGRlY2tfaWQsKQogICAgKS5mZXRjaGFsbCgpCgogICAgY291bnRzX2J5X3R5cGUgPSB7dDogMCBmb3IgdCBpbiBfVFlQRV9QUklPUklUWX0KICAgIGNvdW50c19ieV90eXBlWyJPdGhlciJdID0gMAogICAgbWFuYV9jdXJ2ZSA9IHswOiAwLCAxOiAwLCAyOiAwLCAzOiAwLCA0OiAwLCA1OiAwLCAiNisiOiAwfQogICAgY29sb3JfcGlwcyA9IHsiVyI6IDAsICJVIjogMCwgIkIiOiAwLCAiUiI6IDAsICJHIjogMH0KICAgIHJvbGVzX2NvdW50ID0geyJSYW1wIjogMCwgIkRyYXciOiAwLCAiUmVtb3ZhbCI6IDAsICJCb2FyZFdpcGUiOiAwLAogICAgICAgICAgICAgICAgICAgIlByb3RlY3Rpb24iOiAwLCAiVHV0b3IiOiAwLCAiQ291bnRlciI6IDB9CiAgICB0b3RhbF9jYXJkcyA9IDAKCiAgICBmb3Igcm93IGluIHJvd3M6CiAgICAgICAgcXR5ID0gcm93WyJxdWFudGl0eSJdIG9yIDEKICAgICAgICB0b3RhbF9jYXJkcyArPSBxdHkKICAgICAgICB0eXBlX2xpbmUgPSByb3dbInR5cGVfbGluZSJdIG9yICIiCiAgICAgICAgb3JhY2xlX3RleHQgPSByb3dbIm9yYWNsZV90ZXh0Il0gb3IgIiIKICAgICAgICBrZXl3b3JkcyA9IHJvd1sia2V5d29yZHMiXSBvciAiW10iCiAgICAgICAgY21jID0gZmxvYXQocm93WyJjbWMiXSBvciAwKQogICAgICAgIGNvbF9pZF9yYXcgPSByb3dbImNvbG9yX2lkZW50aXR5Il0gb3IgIltdIgoKICAgICAgICBjYXJkX3R5cGUgPSBfY2xhc3NpZnlfY2FyZF90eXBlKHR5cGVfbGluZSkKICAgICAgICBjb3VudHNfYnlfdHlwZVtjYXJkX3R5cGVdID0gY291bnRzX2J5X3R5cGUuZ2V0KGNhcmRfdHlwZSwgMCkgKyBxdHkKCiAgICAgICAgIyBNYW5hIGN1cnZlIChleGNsdWRlIGxhbmRzKQogICAgICAgIGlmIGNhcmRfdHlwZSAhPSAiTGFuZCI6CiAgICAgICAgICAgIGNtY19pbnQgPSBpbnQoY21jKQogICAgICAgICAgICBpZiBjbWNfaW50ID49IDY6CiAgICAgICAgICAgICAgICBtYW5hX2N1cnZlWyI2KyJdICs9IHF0eQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgbWFuYV9jdXJ2ZVtjbWNfaW50XSA9IG1hbmFfY3VydmUuZ2V0KGNtY19pbnQsIDApICsgcXR5CgogICAgICAgICMgQ29sb3IgcGlwcyBmcm9tIGNvbG9yX2lkZW50aXR5CiAgICAgICAgdHJ5OgogICAgICAgICAgICBjaSA9IGpzb24ubG9hZHMoY29sX2lkX3JhdykgaWYgaXNpbnN0YW5jZShjb2xfaWRfcmF3LCBzdHIpIGVsc2UgY29sX2lkX3JhdwogICAgICAgIGV4Y2VwdCBFeGNlcHRpb246CiAgICAgICAgICAgIGNpID0gW10KICAgICAgICBmb3IgYyBpbiBjaToKICAgICAgICAgICAgaWYgYyBpbiBjb2xvcl9waXBzOgogICAgICAgICAgICAgICAgY29sb3JfcGlwc1tjXSArPSBxdHkKCiAgICAgICAgIyBEZXRlY3Qgcm9sZXMKICAgICAgICBjYXJkX3JvbGVzID0gX2RldGVjdF9jYXJkX3JvbGVzKG9yYWNsZV90ZXh0LCB0eXBlX2xpbmUsIGtleXdvcmRzKQogICAgICAgIGZvciByb2xlIGluIGNhcmRfcm9sZXM6CiAgICAgICAgICAgIGlmIHJvbGUgaW4gcm9sZXNfY291bnQ6CiAgICAgICAgICAgICAgICByb2xlc19jb3VudFtyb2xlXSArPSBxdHkKCiAgICAjIENvbXB1dGUgZGVsdGFzOiBjdXJyZW50IC0gbWlkcG9pbnQgb2YgdGFyZ2V0IHJhbmdlCiAgICBkZWx0YXMgPSB7fQogICAgZm9yIHQsIChsbywgaGkpIGluIF9UWVBFX1RBUkdFVFMuaXRlbXMoKToKICAgICAgICBtaWQgPSAobG8gKyBoaSkgLyAyCiAgICAgICAgY3VycmVudCA9IGNvdW50c19ieV90eXBlLmdldCh0LCAwKQogICAgICAgIGRlbHRhID0gY3VycmVudCAtIG1pZAogICAgICAgIGRlbHRhc1t0XSA9IHJvdW5kKGRlbHRhLCAxKQoKICAgIHJldHVybiB7CiAgICAgICAgImNvdW50c19ieV90eXBlIjogY291bnRzX2J5X3R5cGUsCiAgICAgICAgInRhcmdldHMiOiBfVFlQRV9UQVJHRVRTLAogICAgICAgICJkZWx0YXMiOiBkZWx0YXMsCiAgICAgICAgIm1hbmFfY3VydmUiOiBtYW5hX2N1cnZlLAogICAgICAgICJjb2xvcl9waXBzIjogY29sb3JfcGlwcywKICAgICAgICAidG90YWxfY2FyZHMiOiB0b3RhbF9jYXJkcywKICAgICAgICAicm9sZXMiOiByb2xlc19jb3VudCwKICAgIH0KCgojIOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkAojIERlY2sgQnVpbGRlciBFbmRwb2ludHMKIyDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZAKCiMg4pSA4pSAIDIuMSBEZWNrIENSVUQg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACgpAYXBwLnBvc3QoIi9hcGkvZGVja3MiKQphc3luYyBkZWYgY3JlYXRlX2RlY2socmVxOiBDcmVhdGVEZWNrUmVxdWVzdCk6CiAgICAiIiJDcmVhdGUgYSBuZXcgZGVjay4iIiIKICAgIGNvbm4gPSBfZ2V0X2RiX2Nvbm4oKQogICAgY29sb3JfaWRlbnRpdHlfanNvbiA9IGpzb24uZHVtcHMocmVxLmNvbG9yX2lkZW50aXR5IG9yIFtdKQogICAgY3VyID0gY29ubi5leGVjdXRlKAogICAgICAgICIiIgogICAgICAgIElOU0VSVCBJTlRPIGRlY2tzIChuYW1lLCBjb21tYW5kZXJfc2NyeWZhbGxfaWQsIGNvbW1hbmRlcl9uYW1lLCBjb2xvcl9pZGVudGl0eSwgc3RyYXRlZ3lfdGFnKQogICAgICAgIFZBTFVFUyAoPywgPywgPywgPywgPykKICAgICAgICAiIiIsCiAgICAgICAgKAogICAgICAgICAgICByZXEubmFtZSwKICAgICAgICAgICAgcmVxLmNvbW1hbmRlcl9zY3J5ZmFsbF9pZCBvciAiIiwKICAgICAgICAgICAgcmVxLmNvbW1hbmRlcl9uYW1lIG9yICIiLAogICAgICAgICAgICBjb2xvcl9pZGVudGl0eV9qc29uLAogICAgICAgICAgICByZXEuc3RyYXRlZ3lfdGFnIG9yICIiLAogICAgICAgICkKICAgICkKICAgIGNvbm4uY29tbWl0KCkKICAgIGRlY2tfaWQgPSBjdXIubGFzdHJvd2lkCiAgICByZXR1cm4gX2dldF9kZWNrX29yXzQwNChkZWNrX2lkKQoKCkBhcHAuZ2V0KCIvYXBpL2RlY2tzIikKYXN5bmMgZGVmIGxpc3RfZGVja3NfZGIoKToKICAgICIiIkxpc3QgYWxsIGRlY2tzIHdpdGggY2FyZCBjb3VudHMuIiIiCiAgICBjb25uID0gX2dldF9kYl9jb25uKCkKICAgIHJvd3MgPSBjb25uLmV4ZWN1dGUoCiAgICAgICAgIiIiCiAgICAgICAgU0VMRUNUIGQuKiwKICAgICAgICAgICAgICAgQ09BTEVTQ0UoU1VNKGRjLnF1YW50aXR5KSwgMCkgQVMgdG90YWxfY2FyZHMsCiAgICAgICAgICAgICAgIENPVU5UKGRjLmlkKSBBUyBjYXJkX3Nsb3RzCiAgICAgICAgRlJPTSBkZWNrcyBkCiAgICAgICAgTEVGVCBKT0lOIGRlY2tfY2FyZHMgZGMgT04gZGMuZGVja19pZCA9IGQuaWQKICAgICAgICBHUk9VUCBCWSBkLmlkCiAgICAgICAgT1JERVIgQlkgZC51cGRhdGVkX2F0IERFU0MKICAgICAgICAiIiIKICAgICkuZmV0Y2hhbGwoKQogICAgZGVja3MgPSBbXQogICAgZm9yIHJvdyBpbiByb3dzOgogICAgICAgIGQgPSBkaWN0KHJvdykKICAgICAgICB0cnk6CiAgICAgICAgICAgIGRbImNvbG9yX2lkZW50aXR5Il0gPSBqc29uLmxvYWRzKGQuZ2V0KCJjb2xvcl9pZGVudGl0eSIsICJbXSIpKQogICAgICAgIGV4Y2VwdCBFeGNlcHRpb246CiAgICAgICAgICAgIGRbImNvbG9yX2lkZW50aXR5Il0gPSBbXQogICAgICAgIGRlY2tzLmFwcGVuZChkKQogICAgcmV0dXJuIHsiZGVja3MiOiBkZWNrc30KCgpAYXBwLmdldCgiL2FwaS9kZWNrcy97ZGVja19pZH0iKQphc3luYyBkZWYgZ2V0X2RlY2soZGVja19pZDogaW50KToKICAgICIiIkdldCBmdWxsIGRlY2sgaW5mbyB3aXRoIGNvbXBvc2l0aW9uIHN1bW1hcnkuIiIiCiAgICBkZWNrID0gX2dldF9kZWNrX29yXzQwNChkZWNrX2lkKQogICAgY29ubiA9IF9nZXRfZGJfY29ubigpCiAgICBjYXJkX3Jvd3MgPSBjb25uLmV4ZWN1dGUoCiAgICAgICAgIlNFTEVDVCAqIEZST00gZGVja19jYXJkcyBXSEVSRSBkZWNrX2lkID0gPyBPUkRFUiBCWSBpc19jb21tYW5kZXIgREVTQywgY2FyZF9uYW1lIEFTQyIsCiAgICAgICAgKGRlY2tfaWQsKQogICAgKS5mZXRjaGFsbCgpCiAgICBkZWNrWyJjYXJkcyJdID0gW2RpY3QocikgZm9yIHIgaW4gY2FyZF9yb3dzXQogICAgZGVja1sidG90YWxfY2FyZHMiXSA9IHN1bShyWyJxdWFudGl0eSJdIGZvciByIGluIGNhcmRfcm93cykKICAgIGRlY2tbImNhcmRfc2xvdHMiXSA9IGxlbihjYXJkX3Jvd3MpCiAgICAjIENvbXBvc2l0aW9uIHN1bW1hcnkgYnkgdHlwZQogICAgYW5hbHlzaXMgPSBfY29tcHV0ZV9kZWNrX2FuYWx5c2lzKGRlY2tfaWQpCiAgICBkZWNrWyJjb21wb3NpdGlvbiJdID0gYW5hbHlzaXNbImNvdW50c19ieV90eXBlIl0KICAgIHJldHVybiBkZWNrCgoKQGFwcC5wdXQoIi9hcGkvZGVja3Mve2RlY2tfaWR9IikKYXN5bmMgZGVmIHVwZGF0ZV9kZWNrKGRlY2tfaWQ6IGludCwgcmVxOiBVcGRhdGVEZWNrUmVxdWVzdCk6CiAgICAiIiJVcGRhdGUgZGVjayBtZXRhZGF0YS4iIiIKICAgIF9nZXRfZGVja19vcl80MDQoZGVja19pZCkgICMgZW5zdXJlIGV4aXN0cwogICAgY29ubiA9IF9nZXRfZGJfY29ubigpCgogICAgdXBkYXRlcyA9IHt9CiAgICBpZiByZXEubmFtZSBpcyBub3QgTm9uZToKICAgICAgICB1cGRhdGVzWyJuYW1lIl0gPSByZXEubmFtZQogICAgaWYgcmVxLmNvbW1hbmRlcl9zY3J5ZmFsbF9pZCBpcyBub3QgTm9uZToKICAgICAgICB1cGRhdGVzWyJjb21tYW5kZXJfc2NyeWZhbGxfaWQiXSA9IHJlcS5jb21tYW5kZXJfc2NyeWZhbGxfaWQKICAgIGlmIHJlcS5jb21tYW5kZXJfbmFtZSBpcyBub3QgTm9uZToKICAgICAgICB1cGRhdGVzWyJjb21tYW5kZXJfbmFtZSJdID0gcmVxLmNvbW1hbmRlcl9uYW1lCiAgICBpZiByZXEuY29sb3JfaWRlbnRpdHkgaXMgbm90IE5vbmU6CiAgICAgICAgdXBkYXRlc1siY29sb3JfaWRlbnRpdHkiXSA9IGpzb24uZHVtcHMocmVxLmNvbG9yX2lkZW50aXR5KQogICAgaWYgcmVxLnN0cmF0ZWd5X3RhZyBpcyBub3QgTm9uZToKICAgICAgICB1cGRhdGVzWyJzdHJhdGVneV90YWciXSA9IHJlcS5zdHJhdGVneV90YWcKCiAgICBpZiBub3QgdXBkYXRlczoKICAgICAgICByZXR1cm4gX2dldF9kZWNrX29yXzQwNChkZWNrX2lkKQoKICAgIHVwZGF0ZXNbInVwZGF0ZWRfYXQiXSA9IGRhdGV0aW1lLnV0Y25vdygpLnN0cmZ0aW1lKCIlWS0lbS0lZCAlSDolTTolUyIpCiAgICBzZXRfY2xhdXNlID0gIiwgIi5qb2luKGYie2t9ID0gPyIgZm9yIGsgaW4gdXBkYXRlcykKICAgIGNvbm4uZXhlY3V0ZShmIlVQREFURSBkZWNrcyBTRVQge3NldF9jbGF1c2V9IFdIRVJFIGlkID0gPyIsIGxpc3QodXBkYXRlcy52YWx1ZXMoKSkgKyBbZGVja19pZF0pCiAgICBjb25uLmNvbW1pdCgpCiAgICByZXR1cm4gX2dldF9kZWNrX29yXzQwNChkZWNrX2lkKQoKCkBhcHAuZGVsZXRlKCIvYXBpL2RlY2tzL3tkZWNrX2lkfSIpCmFzeW5jIGRlZiBkZWxldGVfZGVjayhkZWNrX2lkOiBpbnQpOgogICAgIiIiRGVsZXRlIGEgZGVjayBhbmQgYWxsIGl0cyBjYXJkcyAoY2FzY2FkZSkuIiIiCiAgICBfZ2V0X2RlY2tfb3JfNDA0KGRlY2tfaWQpICAjIGVuc3VyZSBleGlzdHMKICAgIGNvbm4gPSBfZ2V0X2RiX2Nvbm4oKQogICAgY29ubi5leGVjdXRlKCJERUxFVEUgRlJPTSBkZWNrX2NhcmRzIFdIRVJFIGRlY2tfaWQgPSA/IiwgKGRlY2tfaWQsKSkKICAgIGNvbm4uZXhlY3V0ZSgiREVMRVRFIEZST00gZGVja3MgV0hFUkUgaWQgPSA/IiwgKGRlY2tfaWQsKSkKICAgIGNvbm4uY29tbWl0KCkKICAgIHJldHVybiB7ImRlbGV0ZWQiOiBUcnVlLCAiZGVja19pZCI6IGRlY2tfaWR9CgoKQGFwcC5kZWxldGUoIi9hcGkvZGVja3MiKQphc3luYyBkZWYgZGVsZXRlX2FsbF9kZWNrcygpOgogICAgIiIiRGVsZXRlIEFMTCBkZWNrcyBhbmQgdGhlaXIgY2FyZHMuIiIiCiAgICBjb25uID0gX2dldF9kYl9jb25uKCkKICAgIGNvbm4uZXhlY3V0ZSgiREVMRVRFIEZST00gZGVja19jYXJkcyIpCiAgICBjb3VudCA9IGNvbm4uZXhlY3V0ZSgiU0VMRUNUIENPVU5UKCopIEZST00gZGVja3MiKS5mZXRjaG9uZSgpWzBdCiAgICBjb25uLmV4ZWN1dGUoIkRFTEVURSBGUk9NIGRlY2tzIikKICAgIGNvbm4uY29tbWl0KCkKICAgIHJldHVybiB7ImRlbGV0ZWQiOiBUcnVlLCAiY291bnQiOiBjb3VudH0KCgojIOKUgOKUgCAyLjIgRGVjayBDYXJkIE1hbmlwdWxhdGlvbiDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKCkBhcHAuZ2V0KCIvYXBpL2RlY2tzL3tkZWNrX2lkfS9jYXJkcyIpCmFzeW5jIGRlZiBnZXRfZGVja19jYXJkcyhkZWNrX2lkOiBpbnQpOgogICAgIiIiR2V0IGFsbCBjYXJkcyBpbiBhIGRlY2sgd2l0aCBqb2luZWQgY29sbGVjdGlvbiBkYXRhLiIiIgogICAgX2dldF9kZWNrX29yXzQwNChkZWNrX2lkKQogICAgY29ubiA9IF9nZXRfZGJfY29ubigpCiAgICByb3dzID0gY29ubi5leGVjdXRlKAogICAgICAgICIiIgogICAgICAgIFNFTEVDVAogICAgICAgICAgICBkYy5pZCwgZGMuZGVja19pZCwgZGMuc2NyeWZhbGxfaWQsIGRjLmNhcmRfbmFtZSwgZGMucXVhbnRpdHksCiAgICAgICAgICAgIGRjLmlzX2NvbW1hbmRlciwgZGMucm9sZV90YWcsCiAgICAgICAgICAgIGNlLnR5cGVfbGluZSwgY2UuY21jLCBjZS5tYW5hX2Nvc3QsIGNlLmNvbG9yX2lkZW50aXR5LCBjZS5vcmFjbGVfdGV4dCwgY2Uua2V5d29yZHMsCiAgICAgICAgICAgIGNlLnRjZ19wcmljZSwgY2UucXVhbnRpdHkgQVMgb3duZWRfcXR5LCBjZS5pc19sZWdlbmRhcnksCiAgICAgICAgICAgIGNlLnNhbHRfc2NvcmUsIGNlLmlzX2dhbWVfY2hhbmdlcgogICAgICAgIEZST00gZGVja19jYXJkcyBkYwogICAgICAgIExFRlQgSk9JTiAoCiAgICAgICAgICAgIFNFTEVDVCBzY3J5ZmFsbF9pZCwgdHlwZV9saW5lLCBjbWMsIG1hbmFfY29zdCwgY29sb3JfaWRlbnRpdHksCiAgICAgICAgICAgICAgICAgICBvcmFjbGVfdGV4dCwga2V5d29yZHMsIHRjZ19wcmljZSwgcXVhbnRpdHksIGlzX2xlZ2VuZGFyeSwKICAgICAgICAgICAgICAgICAgIHNhbHRfc2NvcmUsIGlzX2dhbWVfY2hhbmdlcgogICAgICAgICAgICBGUk9NIGNvbGxlY3Rpb25fZW50cmllcwogICAgICAgICAgICBHUk9VUCBCWSBzY3J5ZmFsbF9pZAogICAgICAgICkgY2UgT04gY2Uuc2NyeWZhbGxfaWQgPSBkYy5zY3J5ZmFsbF9pZAogICAgICAgIFdIRVJFIGRjLmRlY2tfaWQgPSA/CiAgICAgICAgT1JERVIgQlkgZGMuaXNfY29tbWFuZGVyIERFU0MsIGRjLmNhcmRfbmFtZSBBU0MKICAgICAgICAiIiIsCiAgICAgICAgKGRlY2tfaWQsKQogICAgKS5mZXRjaGFsbCgpCiAgICBjYXJkcyA9IFtdCiAgICBmb3Igcm93IGluIHJvd3M6CiAgICAgICAgZCA9IGRpY3Qocm93KQogICAgICAgICMgUGFyc2UgSlNPTiBmaWVsZHMKICAgICAgICBmb3IgZiBpbiAoImNvbG9yX2lkZW50aXR5IiwgImtleXdvcmRzIik6CiAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UoZC5nZXQoZiksIHN0cik6CiAgICAgICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICAgICAgZFtmXSA9IGpzb24ubG9hZHMoZFtmXSkKICAgICAgICAgICAgICAgIGV4Y2VwdCBFeGNlcHRpb246CiAgICAgICAgICAgICAgICAgICAgZFtmXSA9IFtdCiAgICAgICAgZFsiaW1hZ2VfdXJsIl0gPSAoCiAgICAgICAgICAgIGYiaHR0cHM6Ly9hcGkuc2NyeWZhbGwuY29tL2NhcmRzL3tkWydzY3J5ZmFsbF9pZCddfT9mb3JtYXQ9aW1hZ2UmdmVyc2lvbj1ub3JtYWwiCiAgICAgICAgICAgIGlmIGQuZ2V0KCJzY3J5ZmFsbF9pZCIpIGVsc2UgTm9uZQogICAgICAgICkKICAgICAgICBjYXJkcy5hcHBlbmQoZCkKICAgIHJldHVybiB7ImNhcmRzIjogY2FyZHMsICJ0b3RhbCI6IGxlbihjYXJkcyl9CgoKQGFwcC5wb3N0KCIvYXBpL2RlY2tzL3tkZWNrX2lkfS9jYXJkcyIpCmFzeW5jIGRlZiBhZGRfZGVja19jYXJkKGRlY2tfaWQ6IGludCwgcmVxOiBBZGREZWNrQ2FyZFJlcXVlc3QpOgogICAgIiIiQWRkIG9yIHVwZGF0ZSBhIGNhcmQgaW4gdGhlIGRlY2suIiIiCiAgICBfZ2V0X2RlY2tfb3JfNDA0KGRlY2tfaWQpCiAgICBjb25uID0gX2dldF9kYl9jb25uKCkKCiAgICAjIExvb2sgdXAgY2FyZF9uYW1lIGZyb20gY29sbGVjdGlvbl9lbnRyaWVzIGJ5IHNjcnlmYWxsX2lkLCBmYWxsIGJhY2sgdG8gcmVxdWVzdAogICAgY2Vfcm93ID0gY29ubi5leGVjdXRlKAogICAgICAgICJTRUxFQ1QgbmFtZSBGUk9NIGNvbGxlY3Rpb25fZW50cmllcyBXSEVSRSBzY3J5ZmFsbF9pZCA9ID8gTElNSVQgMSIsCiAgICAgICAgKHJlcS5zY3J5ZmFsbF9pZCwpCiAgICApLmZldGNob25lKCkKICAgIGNhcmRfbmFtZSA9IGNlX3Jvd1sibmFtZSJdIGlmIGNlX3JvdyBlbHNlIChyZXEuY2FyZF9uYW1lIG9yICIiKQoKICAgICMgQ2hlY2sgaWYgdGhpcyBzY3J5ZmFsbF9pZCBpcyBhbHJlYWR5IGluIHRoZSBkZWNrCiAgICBleGlzdGluZyA9IGNvbm4uZXhlY3V0ZSgKICAgICAgICAiU0VMRUNUIGlkLCBxdWFudGl0eSBGUk9NIGRlY2tfY2FyZHMgV0hFUkUgZGVja19pZCA9ID8gQU5EIHNjcnlmYWxsX2lkID0gPyIsCiAgICAgICAgKGRlY2tfaWQsIHJlcS5zY3J5ZmFsbF9pZCkKICAgICkuZmV0Y2hvbmUoKQoKICAgIGlmIGV4aXN0aW5nOgogICAgICAgIG5ld19xdHkgPSBleGlzdGluZ1sicXVhbnRpdHkiXSArIChyZXEucXVhbnRpdHkgb3IgMSkKICAgICAgICBjb25uLmV4ZWN1dGUoCiAgICAgICAgICAgICJVUERBVEUgZGVja19jYXJkcyBTRVQgcXVhbnRpdHkgPSA/LCByb2xlX3RhZyA9ID8sIGlzX2NvbW1hbmRlciA9ID8gV0hFUkUgaWQgPSA/IiwKICAgICAgICAgICAgKG5ld19xdHksIHJlcS5yb2xlX3RhZyBvciAiIiwgcmVxLmlzX2NvbW1hbmRlciBvciAwLCBleGlzdGluZ1siaWQiXSkKICAgICAgICApCiAgICAgICAgY29ubi5jb21taXQoKQogICAgICAgIHJvdyA9IGNvbm4uZXhlY3V0ZSgiU0VMRUNUICogRlJPTSBkZWNrX2NhcmRzIFdIRVJFIGlkID0gPyIsIChleGlzdGluZ1siaWQiXSwpKS5mZXRjaG9uZSgpCiAgICBlbHNlOgogICAgICAgIGN1ciA9IGNvbm4uZXhlY3V0ZSgKICAgICAgICAgICAgIiIiCiAgICAgICAgICAgIElOU0VSVCBJTlRPIGRlY2tfY2FyZHMgKGRlY2tfaWQsIHNjcnlmYWxsX2lkLCBjYXJkX25hbWUsIHF1YW50aXR5LCBpc19jb21tYW5kZXIsIHJvbGVfdGFnKQogICAgICAgICAgICBWQUxVRVMgKD8sID8sID8sID8sID8sID8pCiAgICAgICAgICAgICIiIiwKICAgICAgICAgICAgKAogICAgICAgICAgICAgICAgZGVja19pZCwgcmVxLnNjcnlmYWxsX2lkLCBjYXJkX25hbWUsCiAgICAgICAgICAgICAgICByZXEucXVhbnRpdHkgb3IgMSwKICAgICAgICAgICAgICAgIHJlcS5pc19jb21tYW5kZXIgb3IgMCwKICAgICAgICAgICAgICAgIHJlcS5yb2xlX3RhZyBvciAiIgogICAgICAgICAgICApCiAgICAgICAgKQogICAgICAgIGNvbm4uY29tbWl0KCkKICAgICAgICByb3cgPSBjb25uLmV4ZWN1dGUoIlNFTEVDVCAqIEZST00gZGVja19jYXJkcyBXSEVSRSBpZCA9ID8iLCAoY3VyLmxhc3Ryb3dpZCwpKS5mZXRjaG9uZSgpCgogICAgIyBVcGRhdGUgZGVjayB1cGRhdGVkX2F0CiAgICBjb25uLmV4ZWN1dGUoIlVQREFURSBkZWNrcyBTRVQgdXBkYXRlZF9hdCA9IGRhdGV0aW1lKCdub3cnKSBXSEVSRSBpZCA9ID8iLCAoZGVja19pZCwpKQogICAgY29ubi5jb21taXQoKQogICAgcmV0dXJuIGRpY3Qocm93KQoKCkBhcHAuZGVsZXRlKCIvYXBpL2RlY2tzL3tkZWNrX2lkfS9jYXJkcy97Y2FyZF9pZH0iKQphc3luYyBkZWYgcmVtb3ZlX2RlY2tfY2FyZChkZWNrX2lkOiBpbnQsIGNhcmRfaWQ6IGludCk6CiAgICAiIiJSZW1vdmUgYSBjYXJkIGZyb20gYSBkZWNrLiIiIgogICAgX2dldF9kZWNrX29yXzQwNChkZWNrX2lkKQogICAgY29ubiA9IF9nZXRfZGJfY29ubigpCiAgICByb3cgPSBjb25uLmV4ZWN1dGUoCiAgICAgICAgIlNFTEVDVCBpZCBGUk9NIGRlY2tfY2FyZHMgV0hFUkUgaWQgPSA/IEFORCBkZWNrX2lkID0gPyIsIChjYXJkX2lkLCBkZWNrX2lkKQogICAgKS5mZXRjaG9uZSgpCiAgICBpZiBub3Qgcm93OgogICAgICAgIHJhaXNlIEhUVFBFeGNlcHRpb24oNDA0LCBmIkNhcmQgc2xvdCB7Y2FyZF9pZH0gbm90IGZvdW5kIGluIGRlY2sge2RlY2tfaWR9IikKICAgIGNvbm4uZXhlY3V0ZSgiREVMRVRFIEZST00gZGVja19jYXJkcyBXSEVSRSBpZCA9ID8iLCAoY2FyZF9pZCwpKQogICAgY29ubi5leGVjdXRlKCJVUERBVEUgZGVja3MgU0VUIHVwZGF0ZWRfYXQgPSBkYXRldGltZSgnbm93JykgV0hFUkUgaWQgPSA/IiwgKGRlY2tfaWQsKSkKICAgIGNvbm4uY29tbWl0KCkKICAgIHJldHVybiB7ImRlbGV0ZWQiOiBUcnVlLCAiY2FyZF9pZCI6IGNhcmRfaWQsICJkZWNrX2lkIjogZGVja19pZH0KCgpAYXBwLnBhdGNoKCIvYXBpL2RlY2tzL3tkZWNrX2lkfS9jYXJkcy97Y2FyZF9pZH0iKQphc3luYyBkZWYgcGF0Y2hfZGVja19jYXJkKGRlY2tfaWQ6IGludCwgY2FyZF9pZDogaW50LCByZXE6IFBhdGNoRGVja0NhcmRSZXF1ZXN0KToKICAgICIiIlVwZGF0ZSBxdWFudGl0eSBvciByb2xlX3RhZyBmb3IgYSBjYXJkIGluIGEgZGVjay4iIiIKICAgIF9nZXRfZGVja19vcl80MDQoZGVja19pZCkKICAgIGNvbm4gPSBfZ2V0X2RiX2Nvbm4oKQogICAgcm93ID0gY29ubi5leGVjdXRlKAogICAgICAgICJTRUxFQ1QgKiBGUk9NIGRlY2tfY2FyZHMgV0hFUkUgaWQgPSA/IEFORCBkZWNrX2lkID0gPyIsIChjYXJkX2lkLCBkZWNrX2lkKQogICAgKS5mZXRjaG9uZSgpCiAgICBpZiBub3Qgcm93OgogICAgICAgIHJhaXNlIEhUVFBFeGNlcHRpb24oNDA0LCBmIkNhcmQgc2xvdCB7Y2FyZF9pZH0gbm90IGZvdW5kIGluIGRlY2sge2RlY2tfaWR9IikKCiAgICB1cGRhdGVzID0ge30KICAgIGlmIHJlcS5xdWFudGl0eSBpcyBub3QgTm9uZToKICAgICAgICBpZiByZXEucXVhbnRpdHkgPCAxOgogICAgICAgICAgICByYWlzZSBIVFRQRXhjZXB0aW9uKDQwMCwgInF1YW50aXR5IG11c3QgYmUgPj0gMSIpCiAgICAgICAgdXBkYXRlc1sicXVhbnRpdHkiXSA9IHJlcS5xdWFudGl0eQogICAgaWYgcmVxLnJvbGVfdGFnIGlzIG5vdCBOb25lOgogICAgICAgIHVwZGF0ZXNbInJvbGVfdGFnIl0gPSByZXEucm9sZV90YWcKCiAgICBpZiB1cGRhdGVzOgogICAgICAgIHNldF9jbGF1c2UgPSAiLCAiLmpvaW4oZiJ7a30gPSA/IiBmb3IgayBpbiB1cGRhdGVzKQogICAgICAgIGNvbm4uZXhlY3V0ZSgKICAgICAgICAgICAgZiJVUERBVEUgZGVja19jYXJkcyBTRVQge3NldF9jbGF1c2V9IFdIRVJFIGlkID0gPyIsCiAgICAgICAgICAgIGxpc3QodXBkYXRlcy52YWx1ZXMoKSkgKyBbY2FyZF9pZF0KICAgICAgICApCiAgICAgICAgY29ubi5leGVjdXRlKCJVUERBVEUgZGVja3MgU0VUIHVwZGF0ZWRfYXQgPSBkYXRldGltZSgnbm93JykgV0hFUkUgaWQgPSA/IiwgKGRlY2tfaWQsKSkKICAgICAgICBjb25uLmNvbW1pdCgpCgogICAgdXBkYXRlZCA9IGNvbm4uZXhlY3V0ZSgiU0VMRUNUICogRlJPTSBkZWNrX2NhcmRzIFdIRVJFIGlkID0gPyIsIChjYXJkX2lkLCkpLmZldGNob25lKCkKICAgIHJldHVybiBkaWN0KHVwZGF0ZWQpCgoKIyDilIDilIAgMi4zIERlY2sgQW5hbHlzaXMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACgpAYXBwLmdldCgiL2FwaS9kZWNrcy97ZGVja19pZH0vYW5hbHlzaXMiKQphc3luYyBkZWYgZGVja19hbmFseXNpcyhkZWNrX2lkOiBpbnQpOgogICAgIiIiQW5hbHl6ZSBkZWNrIGNvbXBvc2l0aW9uIOKAlCB0eXBlIGNvdW50cywgbWFuYSBjdXJ2ZSwgY29sb3IgcGlwcywgcm9sZXMsIHRhcmdldHMsIGRlbHRhcy4iIiIKICAgIF9nZXRfZGVja19vcl80MDQoZGVja19pZCkKICAgIHJldHVybiBfY29tcHV0ZV9kZWNrX2FuYWx5c2lzKGRlY2tfaWQpCgoKIyDilIDilIAgMi41IFJlY29tbWVuZGF0aW9ucyBmcm9tIENvbGxlY3Rpb24g4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACgpAYXBwLmdldCgiL2FwaS9kZWNrcy97ZGVja19pZH0vcmVjb21tZW5kZWQtZnJvbS1jb2xsZWN0aW9uIikKYXN5bmMgZGVmIHJlY29tbWVuZF9mcm9tX2NvbGxlY3Rpb24oZGVja19pZDogaW50LCBtYXhfcmVzdWx0czogaW50ID0gMjAsIHJvbGVzOiBPcHRpb25hbFtzdHJdID0gTm9uZSk6CiAgICAiIiIKICAgIFJlY29tbWVuZCBjYXJkcyBmcm9tIHRoZSB1c2VyJ3MgY29sbGVjdGlvbiBmb3IgYSBkZWNrLgogICAgRmluZHMgc2hvcnRmYWxscywgdGhlbiBzY29yZXMgb3duZWQgY2FyZHMgYnkgaG93IHdlbGwgdGhleSBmaXQuCiAgICAiIiIKICAgIGRlY2sgPSBfZ2V0X2RlY2tfb3JfNDA0KGRlY2tfaWQpCiAgICBkZWNrX2NvbG9yX2lkZW50aXR5ID0gZGVjay5nZXQoImNvbG9yX2lkZW50aXR5IiwgW10pCiAgICBjb25uID0gX2dldF9kYl9jb25uKCkKCiAgICAjIFJ1biBhbmFseXNpcyB0byBmaW5kIHNob3J0ZmFsbHMKICAgIGFuYWx5c2lzID0gX2NvbXB1dGVfZGVja19hbmFseXNpcyhkZWNrX2lkKQogICAgZGVsdGFzID0gYW5hbHlzaXNbImRlbHRhcyJdCiAgICBjb3VudHNfYnlfdHlwZSA9IGFuYWx5c2lzWyJjb3VudHNfYnlfdHlwZSJdCgogICAgIyBGaW5kIHR5cGVzIHRoYXQgYXJlIGJlbG93IHRoZWlyIHRhcmdldCBtaWRwb2ludCAoc2hvcnRmYWxsKQogICAgc2hvcnRmYWxsX3R5cGVzID0gc2V0KCkKICAgIGZvciB0LCBkZWx0YSBpbiBkZWx0YXMuaXRlbXMoKToKICAgICAgICBsbywgaGkgPSBfVFlQRV9UQVJHRVRTLmdldCh0LCBbMCwgMF0pCiAgICAgICAgaWYgY291bnRzX2J5X3R5cGUuZ2V0KHQsIDApIDwgbG86CiAgICAgICAgICAgIHNob3J0ZmFsbF90eXBlcy5hZGQodCkKCiAgICAjIEdldCBzY3J5ZmFsbF9pZHMgYWxyZWFkeSBpbiBkZWNrIHRvIGV4Y2x1ZGUKICAgIGluX2RlY2tfaWRzID0gc2V0KAogICAgICAgIHJbInNjcnlmYWxsX2lkIl0gZm9yIHIgaW4KICAgICAgICBjb25uLmV4ZWN1dGUoIlNFTEVDVCBzY3J5ZmFsbF9pZCBGUk9NIGRlY2tfY2FyZHMgV0hFUkUgZGVja19pZCA9ID8iLCAoZGVja19pZCwpKS5mZXRjaGFsbCgpCiAgICApCgogICAgIyBQYXJzZSByb2xlIGZpbHRlcgogICAgcm9sZV9maWx0ZXIgPSBbci5zdHJpcCgpIGZvciByIGluIHJvbGVzLnNwbGl0KCIsIikgaWYgci5zdHJpcCgpXSBpZiByb2xlcyBlbHNlIFtdCgogICAgIyBRdWVyeSBjb2xsZWN0aW9uIGZvciBjYW5kaWRhdGUgY2FyZHMKICAgIGNvbGxfcm93cyA9IGNvbm4uZXhlY3V0ZSgKICAgICAgICAiU0VMRUNUICogRlJPTSBjb2xsZWN0aW9uX2VudHJpZXMgV0hFUkUgcXVhbnRpdHkgPiAwIgogICAgKS5mZXRjaGFsbCgpCgogICAgc2NvcmVkID0gW10KICAgIGZvciByb3cgaW4gY29sbF9yb3dzOgogICAgICAgIGNhcmQgPSBfcm93X3RvX2RpY3Qocm93KQogICAgICAgIGNhcmRfaWQgPSBjYXJkLmdldCgic2NyeWZhbGxfaWQiLCAiIikKCiAgICAgICAgIyBTa2lwIGNhcmRzIGFscmVhZHkgaW4gZGVjawogICAgICAgIGlmIGNhcmRfaWQgaW4gaW5fZGVja19pZHM6CiAgICAgICAgICAgIGNvbnRpbnVlCgogICAgICAgICMgQ29sb3IgaWRlbnRpdHkgY2hlY2s6IGFsbCBjYXJkIGNvbG9ycyBtdXN0IGJlIGluIGRlY2sgY29sb3JzCiAgICAgICAgY2FyZF9jaSA9IGNhcmQuZ2V0KCJjb2xvcl9pZGVudGl0eSIsIFtdKQogICAgICAgIGlmIGlzaW5zdGFuY2UoY2FyZF9jaSwgc3RyKToKICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgY2FyZF9jaSA9IGpzb24ubG9hZHMoY2FyZF9jaSkKICAgICAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbjoKICAgICAgICAgICAgICAgIGNhcmRfY2kgPSBbXQogICAgICAgIGlmIGRlY2tfY29sb3JfaWRlbnRpdHkgYW5kIGNhcmRfY2k6CiAgICAgICAgICAgIGlmIG5vdCBhbGwoYyBpbiBkZWNrX2NvbG9yX2lkZW50aXR5IGZvciBjIGluIGNhcmRfY2kpOgogICAgICAgICAgICAgICAgY29udGludWUKCiAgICAgICAgdHlwZV9saW5lID0gY2FyZC5nZXQoInR5cGVfbGluZSIsICIiKQogICAgICAgIG9yYWNsZV90ZXh0ID0gY2FyZC5nZXQoIm9yYWNsZV90ZXh0IiwgIiIpCiAgICAgICAga2V5d29yZHMgPSBjYXJkLmdldCgia2V5d29yZHMiLCBbXSkKICAgICAgICBjYXJkX3R5cGUgPSBfY2xhc3NpZnlfY2FyZF90eXBlKHR5cGVfbGluZSkKICAgICAgICBjYXJkX3JvbGVzID0gX2RldGVjdF9jYXJkX3JvbGVzKG9yYWNsZV90ZXh0LCB0eXBlX2xpbmUsIGtleXdvcmRzKQoKICAgICAgICAjIFJvbGUgZmlsdGVyCiAgICAgICAgaWYgcm9sZV9maWx0ZXIgYW5kIG5vdCBhbnkociBpbiBjYXJkX3JvbGVzIGZvciByIGluIHJvbGVfZmlsdGVyKToKICAgICAgICAgICAgY29udGludWUKCiAgICAgICAgIyBTY29yaW5nCiAgICAgICAgc2NvcmUgPSAwCiAgICAgICAgIyArMyBpZiBjYXJkIHR5cGUgaXMgaW4gc2hvcnRmYWxsCiAgICAgICAgaWYgY2FyZF90eXBlIGluIHNob3J0ZmFsbF90eXBlczoKICAgICAgICAgICAgc2NvcmUgKz0gMwogICAgICAgICMgKzIgcGVyIG1hdGNoaW5nIHJvbGUKICAgICAgICBmb3IgciBpbiBjYXJkX3JvbGVzOgogICAgICAgICAgICBpZiByIGluICgiUmFtcCIsICJEcmF3IiwgIlJlbW92YWwiLCAiQm9hcmRXaXBlIik6CiAgICAgICAgICAgICAgICBzY29yZSArPSAyCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBzY29yZSArPSAxCiAgICAgICAgIyArMSBmb3IgbG93ZXIgQ01DIChjdXJ2ZSBmaXQpCiAgICAgICAgY21jID0gZmxvYXQoY2FyZC5nZXQoImNtYyIsIDApKQogICAgICAgIGlmIGNtYyA8PSAzOgogICAgICAgICAgICBzY29yZSArPSAxCgogICAgICAgIHNjb3JlZC5hcHBlbmQoewogICAgICAgICAgICAiaWQiOiBjYXJkLmdldCgiaWQiKSwKICAgICAgICAgICAgInNjcnlmYWxsX2lkIjogY2FyZF9pZCwKICAgICAgICAgICAgIm5hbWUiOiBjYXJkLmdldCgibmFtZSIpLAogICAgICAgICAgICAidHlwZV9saW5lIjogdHlwZV9saW5lLAogICAgICAgICAgICAiY2FyZF90eXBlIjogY2FyZF90eXBlLAogICAgICAgICAgICAiY21jIjogY21jLAogICAgICAgICAgICAiY29sb3JfaWRlbnRpdHkiOiBjYXJkX2NpLAogICAgICAgICAgICAib3duZWRfcXR5IjogY2FyZC5nZXQoInF1YW50aXR5IiwgMCksCiAgICAgICAgICAgICJyb2xlcyI6IGNhcmRfcm9sZXMsCiAgICAgICAgICAgICJzY29yZSI6IHNjb3JlLAogICAgICAgICAgICAiaW1hZ2VfdXJsIjogZiJodHRwczovL2FwaS5zY3J5ZmFsbC5jb20vY2FyZHMve2NhcmRfaWR9P2Zvcm1hdD1pbWFnZSZ2ZXJzaW9uPW5vcm1hbCIgaWYgY2FyZF9pZCBlbHNlIE5vbmUsCiAgICAgICAgfSkKCiAgICBzY29yZWQuc29ydChrZXk9bGFtYmRhIHg6IHhbInNjb3JlIl0sIHJldmVyc2U9VHJ1ZSkKCiAgICAjIEdyb3VwIGJ5IHR5cGUKICAgIGdyb3VwZWQgPSB7fQogICAgZm9yIGNhcmQgaW4gc2NvcmVkWzptYXhfcmVzdWx0c106CiAgICAgICAgY3QgPSBjYXJkWyJjYXJkX3R5cGUiXQogICAgICAgIGdyb3VwZWQuc2V0ZGVmYXVsdChjdCwgW10pLmFwcGVuZChjYXJkKQoKICAgIHJldHVybiB7CiAgICAgICAgInNob3J0ZmFsbF90eXBlcyI6IGxpc3Qoc2hvcnRmYWxsX3R5cGVzKSwKICAgICAgICAicm9sZV9maWx0ZXIiOiByb2xlX2ZpbHRlciwKICAgICAgICAiZ3JvdXBlZCI6IGdyb3VwZWQsCiAgICAgICAgInRvdGFsIjogbGVuKHNjb3JlZFs6bWF4X3Jlc3VsdHNdKSwKICAgIH0KCgojIOKUgOKUgCAyLjYgRURIUkVDLXN0eWxlIFJlY29tbWVuZGF0aW9ucyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKCkBhcHAuZ2V0KCIvYXBpL2RlY2tzL3tkZWNrX2lkfS9lZGgtcmVjcyIpCmFzeW5jIGRlZiBkZWNrX2VkaF9yZWNzKGRlY2tfaWQ6IGludCwgb25seV9vd25lZDogYm9vbCA9IEZhbHNlLCBtYXhfcmVzdWx0czogaW50ID0gMzApOgogICAgIiIiCiAgICBGZXRjaCBFREhSRUMgYXZlcmFnZSBkZWNrIHJlY29tbWVuZGF0aW9ucyBmb3IgdGhpcyBkZWNrJ3MgY29tbWFuZGVyLgogICAgQ3Jvc3MtcmVmZXJlbmNlcyB3aXRoIGNvbGxlY3Rpb24gZm9yIG93bmVkIHN0YXR1cy4KICAgICIiIgogICAgZGVjayA9IF9nZXRfZGVja19vcl80MDQoZGVja19pZCkKICAgIGNvbW1hbmRlcl9uYW1lID0gZGVjay5nZXQoImNvbW1hbmRlcl9uYW1lIiwgIiIpCiAgICBpZiBub3QgY29tbWFuZGVyX25hbWU6CiAgICAgICAgcmFpc2UgSFRUUEV4Y2VwdGlvbig0MDAsICJEZWNrIGhhcyBubyBjb21tYW5kZXJfbmFtZSBzZXQuIFVwZGF0ZSB0aGUgZGVjayBmaXJzdC4iKQoKICAgICMgQ2FjaGUgY2hlY2sKICAgIGNhY2hlX2tleSA9IGYiZWRocmVjOmF2Zzp7X3RvX2VkaHJlY19zbHVnKGNvbW1hbmRlcl9uYW1lKX0iCiAgICBjYWNoZWRfcHJvZmlsZSA9IF9lZGhyZWNfY2FjaGVfZ2V0KGNhY2hlX2tleSkKICAgIGlmIGNhY2hlZF9wcm9maWxlIGlzIE5vbmU6CiAgICAgICAgdHJ5OgogICAgICAgICAgICBjYWNoZWRfcHJvZmlsZSA9IF9mZXRjaF9lZGhyZWNfYXZlcmFnZShjb21tYW5kZXJfbmFtZSkKICAgICAgICAgICAgX2VkaHJlY19jYWNoZV9zZXQoY2FjaGVfa2V5LCBjYWNoZWRfcHJvZmlsZSkKICAgICAgICBleGNlcHQgRXhjZXB0aW9uIGFzIGU6CiAgICAgICAgICAgIHJhaXNlIEhUVFBFeGNlcHRpb24oNTAyLCBmIkZhaWxlZCB0byBmZXRjaCBFREhSRUMgZGF0YSBmb3IgJ3tjb21tYW5kZXJfbmFtZX0nOiB7c3RyKGUpfSIpCgogICAgZWRocmVjX3Byb2ZpbGUgPSBjYWNoZWRfcHJvZmlsZQogICAgbWFpbmJvYXJkID0gZWRocmVjX3Byb2ZpbGUuZ2V0KCJtYWluYm9hcmQiLCB7fSkKCiAgICBjb25uID0gX2dldF9kYl9jb25uKCkKCiAgICAjIEdldCBjYXJkcyBhbHJlYWR5IGluIGRlY2sKICAgIGluX2RlY2tfbmFtZXMgPSBzZXQoCiAgICAgICAgclsiY2FyZF9uYW1lIl0ubG93ZXIoKSBmb3IgciBpbgogICAgICAgIGNvbm4uZXhlY3V0ZSgiU0VMRUNUIGNhcmRfbmFtZSBGUk9NIGRlY2tfY2FyZHMgV0hFUkUgZGVja19pZCA9ID8iLCAoZGVja19pZCwpKS5mZXRjaGFsbCgpCiAgICApCgogICAgIyBCdWlsZCBjb2xsZWN0aW9uIGxvb2t1cDogbmFtZSAobG93ZXIpIC0+IHtvd25lZCwgcXR5LCBzY3J5ZmFsbF9pZH0KICAgIGNvbGxfcm93cyA9IGNvbm4uZXhlY3V0ZSgKICAgICAgICAiU0VMRUNUIG5hbWUsIHF1YW50aXR5LCBzY3J5ZmFsbF9pZCBGUk9NIGNvbGxlY3Rpb25fZW50cmllcyIKICAgICkuZmV0Y2hhbGwoKQogICAgY29sbF9tYXAgPSB7fQogICAgZm9yIHIgaW4gY29sbF9yb3dzOgogICAgICAgIGtleSA9IHJbIm5hbWUiXS5sb3dlcigpCiAgICAgICAgZXhpc3RpbmcgPSBjb2xsX21hcC5nZXQoa2V5KQogICAgICAgIGlmIG5vdCBleGlzdGluZyBvciByWyJxdWFudGl0eSJdID4gZXhpc3RpbmdbInF0eSJdOgogICAgICAgICAgICBjb2xsX21hcFtrZXldID0geyJvd25lZCI6IFRydWUsICJxdHkiOiByWyJxdWFudGl0eSJdLCAic2NyeWZhbGxfaWQiOiByWyJzY3J5ZmFsbF9pZCJdfQoKICAgICMgQWxzbyBsb29rIHVwIGNhcmQgZGV0YWlscyBmcm9tIGNvbGxlY3Rpb25fZW50cmllcyBmb3IgdHlwZS9yb2xlCiAgICBjb2xsX2RldGFpbHMgPSB7fQogICAgZm9yIHIgaW4gY29ubi5leGVjdXRlKCJTRUxFQ1QgbmFtZSwgdHlwZV9saW5lLCBvcmFjbGVfdGV4dCwga2V5d29yZHMsIHNjcnlmYWxsX2lkIEZST00gY29sbGVjdGlvbl9lbnRyaWVzIikuZmV0Y2hhbGwoKToKICAgICAgICBrZXkgPSByWyJuYW1lIl0ubG93ZXIoKQogICAgICAgIGlmIGtleSBub3QgaW4gY29sbF9kZXRhaWxzOgogICAgICAgICAgICBjb2xsX2RldGFpbHNba2V5XSA9IGRpY3QocikKCiAgICByZXN1bHRzID0gW10KICAgIGZvciBjYXJkX25hbWUgaW4gbWFpbmJvYXJkOgogICAgICAgIG5hbWVfbG93ZXIgPSBjYXJkX25hbWUubG93ZXIoKQogICAgICAgICMgU2tpcCBjYXJkcyBhbHJlYWR5IGluIGRlY2sKICAgICAgICBpZiBuYW1lX2xvd2VyIGluIGluX2RlY2tfbmFtZXM6CiAgICAgICAgICAgIGNvbnRpbnVlCgogICAgICAgIG93bmVkX2luZm8gPSBjb2xsX21hcC5nZXQobmFtZV9sb3dlciwgeyJvd25lZCI6IEZhbHNlLCAicXR5IjogMCwgInNjcnlmYWxsX2lkIjogIiJ9KQoKICAgICAgICBpZiBvbmx5X293bmVkIGFuZCBub3Qgb3duZWRfaW5mb1sib3duZWQiXToKICAgICAgICAgICAgY29udGludWUKCiAgICAgICAgIyBHZXQgdHlwZS9yb2xlIGZyb20gY29sbGVjdGlvbiBpZiBhdmFpbGFibGUKICAgICAgICBkZXRhaWxzID0gY29sbF9kZXRhaWxzLmdldChuYW1lX2xvd2VyLCB7fSkKICAgICAgICB0eXBlX2xpbmUgPSBkZXRhaWxzLmdldCgidHlwZV9saW5lIiwgIiIpCiAgICAgICAgb3JhY2xlX3RleHQgPSBkZXRhaWxzLmdldCgib3JhY2xlX3RleHQiLCAiIikKICAgICAgICBrZXl3b3JkcyA9IGRldGFpbHMuZ2V0KCJrZXl3b3JkcyIsICJbXSIpCiAgICAgICAgY2FyZF9yb2xlcyA9IF9kZXRlY3RfY2FyZF9yb2xlcyhvcmFjbGVfdGV4dCwgdHlwZV9saW5lLCBrZXl3b3JkcykKICAgICAgICBzY3J5ZmFsbF9pZCA9IG93bmVkX2luZm8uZ2V0KCJzY3J5ZmFsbF9pZCIpIG9yIGRldGFpbHMuZ2V0KCJzY3J5ZmFsbF9pZCIsICIiKQoKICAgICAgICByZXN1bHRzLmFwcGVuZCh7CiAgICAgICAgICAgICJuYW1lIjogY2FyZF9uYW1lLAogICAgICAgICAgICAidHlwZV9saW5lIjogdHlwZV9saW5lLAogICAgICAgICAgICAicm9sZSI6IGNhcmRfcm9sZXNbMF0gaWYgY2FyZF9yb2xlcyBlbHNlICJPdGhlciIsCiAgICAgICAgICAgICJyb2xlcyI6IGNhcmRfcm9sZXMsCiAgICAgICAgICAgICJpbmNsdXNpb25fcGN0IjogTm9uZSwgICMgRURIUkVDIGF2ZXJhZ2UgZG9lc24ndCBleHBvc2UgJSBkaXJlY3RseSBpbiB0aGlzIHBhdGgKICAgICAgICAgICAgInN5bmVyZ3lfc2NvcmUiOiBOb25lLAogICAgICAgICAgICAib3duZWQiOiBvd25lZF9pbmZvWyJvd25lZCJdLAogICAgICAgICAgICAib3duZWRfcXR5Ijogb3duZWRfaW5mb1sicXR5Il0sCiAgICAgICAgICAgICJzY3J5ZmFsbF9pZCI6IHNjcnlmYWxsX2lkLAogICAgICAgICAgICAiaW1hZ2VfdXJsIjogZiJodHRwczovL2FwaS5zY3J5ZmFsbC5jb20vY2FyZHMve3NjcnlmYWxsX2lkfT9mb3JtYXQ9aW1hZ2UmdmVyc2lvbj1ub3JtYWwiIGlmIHNjcnlmYWxsX2lkIGVsc2UgTm9uZSwKICAgICAgICB9KQoKICAgIHJldHVybiB7CiAgICAgICAgImNvbW1hbmRlciI6IGNvbW1hbmRlcl9uYW1lLAogICAgICAgICJzb3VyY2UiOiAiRURIUkVDIEF2ZXJhZ2UiLAogICAgICAgICJ0b3RhbCI6IGxlbihyZXN1bHRzWzptYXhfcmVzdWx0c10pLAogICAgICAgICJyZWNvbW1lbmRhdGlvbnMiOiByZXN1bHRzWzptYXhfcmVzdWx0c10sCiAgICB9CgoKIyDilIDilIAgMi43IEJ1bGsgQWRkIE9wZXJhdGlvbnMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACgpkZWYgX2NoZWNrX3JhdGlvX2xpbWl0KGRlY2tfaWQ6IGludCwgY2FyZF90eXBlOiBzdHIsIGNvdW50X3RvX2FkZDogaW50ID0gMSkgLT4gYm9vbDoKICAgICIiIgogICAgUmV0dXJuIFRydWUgaWYgYWRkaW5nIGNvdW50X3RvX2FkZCBjYXJkcyBvZiBjYXJkX3R5cGUgc3RheXMgd2l0aGluIHRhcmdldCBtYXguCiAgICAiIiIKICAgIGFuYWx5c2lzID0gX2NvbXB1dGVfZGVja19hbmFseXNpcyhkZWNrX2lkKQogICAgY3VycmVudCA9IGFuYWx5c2lzWyJjb3VudHNfYnlfdHlwZSJdLmdldChjYXJkX3R5cGUsIDApCiAgICB0YXJnZXRfbWF4ID0gX1RZUEVfVEFSR0VUUy5nZXQoY2FyZF90eXBlLCBbMCwgOTk5OV0pWzFdCiAgICByZXR1cm4gKGN1cnJlbnQgKyBjb3VudF90b19hZGQpIDw9IHRhcmdldF9tYXgKCgpAYXBwLnBvc3QoIi9hcGkvZGVja3Mve2RlY2tfaWR9L2J1bGstYWRkIikKYXN5bmMgZGVmIGJ1bGtfYWRkX2NhcmRzKGRlY2tfaWQ6IGludCwgcmVxOiBCdWxrQWRkUmVxdWVzdCk6CiAgICAiIiIKICAgIEJ1bGstYWRkIGNhcmRzIHRvIGEgZGVjayBieSBzY3J5ZmFsbF9pZC4KICAgIElmIHJlc3BlY3RfcmF0aW9zLCBza2lwcyBjYXJkcyBvZiBhIHR5cGUgd2hlbiB0aGUgdGFyZ2V0IG1heCBpcyBhbHJlYWR5IHJlYWNoZWQuCiAgICAiIiIKICAgIF9nZXRfZGVja19vcl80MDQoZGVja19pZCkKICAgIGNvbm4gPSBfZ2V0X2RiX2Nvbm4oKQoKICAgIGFkZGVkID0gMAogICAgc2tpcHBlZCA9IDAKICAgIGRldGFpbHMgPSBbXQoKICAgIGZvciBjYXJkX2VudHJ5IGluIHJlcS5jYXJkczoKICAgICAgICBzY3J5ZmFsbF9pZCA9IHN0cihjYXJkX2VudHJ5LmdldCgic2NyeWZhbGxfaWQiLCAiIikpLnN0cmlwKCkKICAgICAgICBxdWFudGl0eSA9IGludChjYXJkX2VudHJ5LmdldCgicXVhbnRpdHkiLCAxKSkKICAgICAgICBpZiBub3Qgc2NyeWZhbGxfaWQ6CiAgICAgICAgICAgIHNraXBwZWQgKz0gMQogICAgICAgICAgICBkZXRhaWxzLmFwcGVuZCh7InNjcnlmYWxsX2lkIjogc2NyeWZhbGxfaWQsICJzdGF0dXMiOiAic2tpcHBlZCIsICJyZWFzb24iOiAibWlzc2luZyBzY3J5ZmFsbF9pZCJ9KQogICAgICAgICAgICBjb250aW51ZQoKICAgICAgICAjIExvb2sgdXAgY2FyZCBuYW1lIGFuZCB0eXBlIGZyb20gY29sbGVjdGlvbgogICAgICAgIGNlX3JvdyA9IGNvbm4uZXhlY3V0ZSgKICAgICAgICAgICAgIlNFTEVDVCBuYW1lLCB0eXBlX2xpbmUsIG9yYWNsZV90ZXh0LCBrZXl3b3JkcyBGUk9NIGNvbGxlY3Rpb25fZW50cmllcyBXSEVSRSBzY3J5ZmFsbF9pZCA9ID8gTElNSVQgMSIsCiAgICAgICAgICAgIChzY3J5ZmFsbF9pZCwpCiAgICAgICAgKS5mZXRjaG9uZSgpCiAgICAgICAgY2FyZF9uYW1lID0gY2Vfcm93WyJuYW1lIl0gaWYgY2Vfcm93IGVsc2UgIiIKICAgICAgICB0eXBlX2xpbmUgPSBjZV9yb3dbInR5cGVfbGluZSJdIGlmIGNlX3JvdyBlbHNlICIiCiAgICAgICAgY2FyZF90eXBlID0gX2NsYXNzaWZ5X2NhcmRfdHlwZSh0eXBlX2xpbmUpCgogICAgICAgIGlmIHJlcS5yZXNwZWN0X3JhdGlvcyBhbmQgbm90IF9jaGVja19yYXRpb19saW1pdChkZWNrX2lkLCBjYXJkX3R5cGUsIHF1YW50aXR5KToKICAgICAgICAgICAgc2tpcHBlZCArPSAxCiAgICAgICAgICAgIGRldGFpbHMuYXBwZW5kKHsKICAgICAgICAgICAgICAgICJzY3J5ZmFsbF9pZCI6IHNjcnlmYWxsX2lkLAogICAgICAgICAgICAgICAgIm5hbWUiOiBjYXJkX25hbWUsCiAgICAgICAgICAgICAgICAiY2FyZF90eXBlIjogY2FyZF90eXBlLAogICAgICAgICAgICAgICAgInN0YXR1cyI6ICJza2lwcGVkIiwKICAgICAgICAgICAgICAgICJyZWFzb24iOiBmIlR5cGUgJ3tjYXJkX3R5cGV9JyBhdCBvciBhYm92ZSB0YXJnZXQgbWF4IiwKICAgICAgICAgICAgfSkKICAgICAgICAgICAgY29udGludWUKCiAgICAgICAgIyBVcHNlcnQKICAgICAgICBleGlzdGluZyA9IGNvbm4uZXhlY3V0ZSgKICAgICAgICAgICAgIlNFTEVDVCBpZCwgcXVhbnRpdHkgRlJPTSBkZWNrX2NhcmRzIFdIRVJFIGRlY2tfaWQgPSA/IEFORCBzY3J5ZmFsbF9pZCA9ID8iLAogICAgICAgICAgICAoZGVja19pZCwgc2NyeWZhbGxfaWQpCiAgICAgICAgKS5mZXRjaG9uZSgpCgogICAgICAgIGlmIGV4aXN0aW5nOgogICAgICAgICAgICBjb25uLmV4ZWN1dGUoCiAgICAgICAgICAgICAgICAiVVBEQVRFIGRlY2tfY2FyZHMgU0VUIHF1YW50aXR5ID0gPyBXSEVSRSBpZCA9ID8iLAogICAgICAgICAgICAgICAgKGV4aXN0aW5nWyJxdWFudGl0eSJdICsgcXVhbnRpdHksIGV4aXN0aW5nWyJpZCJdKQogICAgICAgICAgICApCiAgICAgICAgZWxzZToKICAgICAgICAgICAgY29ubi5leGVjdXRlKAogICAgICAgICAgICAgICAgIklOU0VSVCBJTlRPIGRlY2tfY2FyZHMgKGRlY2tfaWQsIHNjcnlmYWxsX2lkLCBjYXJkX25hbWUsIHF1YW50aXR5KSBWQUxVRVMgKD8sID8sID8sID8pIiwKICAgICAgICAgICAgICAgIChkZWNrX2lkLCBzY3J5ZmFsbF9pZCwgY2FyZF9uYW1lLCBxdWFudGl0eSkKICAgICAgICAgICAgKQogICAgICAgIGNvbm4uY29tbWl0KCkKICAgICAgICBhZGRlZCArPSAxCiAgICAgICAgZGV0YWlscy5hcHBlbmQoeyJzY3J5ZmFsbF9pZCI6IHNjcnlmYWxsX2lkLCAibmFtZSI6IGNhcmRfbmFtZSwgImNhcmRfdHlwZSI6IGNhcmRfdHlwZSwgInN0YXR1cyI6ICJhZGRlZCIsICJxdWFudGl0eSI6IHF1YW50aXR5fSkKCiAgICBjb25uLmV4ZWN1dGUoIlVQREFURSBkZWNrcyBTRVQgdXBkYXRlZF9hdCA9IGRhdGV0aW1lKCdub3cnKSBXSEVSRSBpZCA9ID8iLCAoZGVja19pZCwpKQogICAgY29ubi5jb21taXQoKQoKICAgIGFuYWx5c2lzID0gX2NvbXB1dGVfZGVja19hbmFseXNpcyhkZWNrX2lkKQogICAgcmV0dXJuIHsiYWRkZWQiOiBhZGRlZCwgInNraXBwZWQiOiBza2lwcGVkLCAiZGV0YWlscyI6IGRldGFpbHMsICJhbmFseXNpcyI6IGFuYWx5c2lzfQoKCkBhcHAucG9zdCgiL2FwaS9kZWNrcy97ZGVja19pZH0vYnVsay1hZGQtcmVjb21tZW5kZWQiKQphc3luYyBkZWYgYnVsa19hZGRfcmVjb21tZW5kZWQoZGVja19pZDogaW50LCByZXE6IEJ1bGtBZGRSZWNvbW1lbmRlZFJlcXVlc3QpOgogICAgIiIiCiAgICBGZXRjaCByZWNvbW1lbmRhdGlvbnMgZnJvbSAnY29sbGVjdGlvbicgb3IgJ2VkaHJlYycsIGZpbHRlciwgYW5kIGJ1bGstYWRkIHRvIGRlY2suCiAgICAiIiIKICAgIF9nZXRfZGVja19vcl80MDQoZGVja19pZCkKICAgIGNvbm4gPSBfZ2V0X2RiX2Nvbm4oKQoKICAgIHNvdXJjZSA9IChyZXEuc291cmNlIG9yICJjb2xsZWN0aW9uIikubG93ZXIoKQogICAgdHlwZV9maWx0ZXIgPSBbdC5zdHJpcCgpIGZvciB0IGluIHJlcS50eXBlc10gaWYgcmVxLnR5cGVzIGVsc2UgW10KICAgIHJvbGVfZmlsdGVyID0gW3Iuc3RyaXAoKSBmb3IgciBpbiByZXEucm9sZXNdIGlmIHJlcS5yb2xlcyBlbHNlIFtdCgogICAgY2FuZGlkYXRlcyA9IFtdCgogICAgaWYgc291cmNlID09ICJjb2xsZWN0aW9uIjoKICAgICAgICAjIFJldXNlIHRoZSByZWNvbW1lbmRfZnJvbV9jb2xsZWN0aW9uIGxvZ2ljCiAgICAgICAgZGVjayA9IF9nZXRfZGVja19vcl80MDQoZGVja19pZCkKICAgICAgICBkZWNrX2NvbG9yX2lkZW50aXR5ID0gZGVjay5nZXQoImNvbG9yX2lkZW50aXR5IiwgW10pCiAgICAgICAgYW5hbHlzaXMgPSBfY29tcHV0ZV9kZWNrX2FuYWx5c2lzKGRlY2tfaWQpCiAgICAgICAgY291bnRzX2J5X3R5cGUgPSBhbmFseXNpc1siY291bnRzX2J5X3R5cGUiXQogICAgICAgIHNob3J0ZmFsbF90eXBlcyA9IHt0IGZvciB0LCAobG8sIF8pIGluIF9UWVBFX1RBUkdFVFMuaXRlbXMoKSBpZiBjb3VudHNfYnlfdHlwZS5nZXQodCwgMCkgPCBsb30KCiAgICAgICAgaW5fZGVja19pZHMgPSBzZXQoCiAgICAgICAgICAgIHJbInNjcnlmYWxsX2lkIl0gZm9yIHIgaW4KICAgICAgICAgICAgY29ubi5leGVjdXRlKCJTRUxFQ1Qgc2NyeWZhbGxfaWQgRlJPTSBkZWNrX2NhcmRzIFdIRVJFIGRlY2tfaWQgPSA/IiwgKGRlY2tfaWQsKSkuZmV0Y2hhbGwoKQogICAgICAgICkKICAgICAgICBjb2xsX3Jvd3MgPSBjb25uLmV4ZWN1dGUoIlNFTEVDVCAqIEZST00gY29sbGVjdGlvbl9lbnRyaWVzIFdIRVJFIHF1YW50aXR5ID4gMCIpLmZldGNoYWxsKCkKICAgICAgICBmb3Igcm93IGluIGNvbGxfcm93czoKICAgICAgICAgICAgY2FyZCA9IF9yb3dfdG9fZGljdChyb3cpCiAgICAgICAgICAgIGNpZCA9IGNhcmQuZ2V0KCJzY3J5ZmFsbF9pZCIsICIiKQogICAgICAgICAgICBpZiBjaWQgaW4gaW5fZGVja19pZHM6CiAgICAgICAgICAgICAgICBjb250aW51ZQogICAgICAgICAgICBjYXJkX2NpID0gY2FyZC5nZXQoImNvbG9yX2lkZW50aXR5IiwgW10pCiAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UoY2FyZF9jaSwgc3RyKToKICAgICAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgICAgICBjYXJkX2NpID0ganNvbi5sb2FkcyhjYXJkX2NpKQogICAgICAgICAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbjoKICAgICAgICAgICAgICAgICAgICBjYXJkX2NpID0gW10KICAgICAgICAgICAgaWYgZGVja19jb2xvcl9pZGVudGl0eSBhbmQgY2FyZF9jaToKICAgICAgICAgICAgICAgIGlmIG5vdCBhbGwoYyBpbiBkZWNrX2NvbG9yX2lkZW50aXR5IGZvciBjIGluIGNhcmRfY2kpOgogICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgICAgIHRsID0gY2FyZC5nZXQoInR5cGVfbGluZSIsICIiKQogICAgICAgICAgICBjdCA9IF9jbGFzc2lmeV9jYXJkX3R5cGUodGwpCiAgICAgICAgICAgIGNhcmRfcm9sZXMgPSBfZGV0ZWN0X2NhcmRfcm9sZXMoY2FyZC5nZXQoIm9yYWNsZV90ZXh0IiwgIiIpLCB0bCwgY2FyZC5nZXQoImtleXdvcmRzIiwgW10pKQogICAgICAgICAgICBpZiB0eXBlX2ZpbHRlciBhbmQgY3Qgbm90IGluIHR5cGVfZmlsdGVyOgogICAgICAgICAgICAgICAgY29udGludWUKICAgICAgICAgICAgaWYgcm9sZV9maWx0ZXIgYW5kIG5vdCBhbnkociBpbiBjYXJkX3JvbGVzIGZvciByIGluIHJvbGVfZmlsdGVyKToKICAgICAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgICAgIGNhbmRpZGF0ZXMuYXBwZW5kKHsic2NyeWZhbGxfaWQiOiBjaWQsICJjYXJkX3R5cGUiOiBjdCwgInF1YW50aXR5IjogMX0pCgogICAgZWxpZiBzb3VyY2UgPT0gImVkaHJlYyI6CiAgICAgICAgZGVjayA9IF9nZXRfZGVja19vcl80MDQoZGVja19pZCkKICAgICAgICBjb21tYW5kZXJfbmFtZSA9IGRlY2suZ2V0KCJjb21tYW5kZXJfbmFtZSIsICIiKQogICAgICAgIGlmIG5vdCBjb21tYW5kZXJfbmFtZToKICAgICAgICAgICAgcmFpc2UgSFRUUEV4Y2VwdGlvbig0MDAsICJEZWNrIGhhcyBubyBjb21tYW5kZXJfbmFtZSBzZXQiKQogICAgICAgIHRyeToKICAgICAgICAgICAgZWRocmVjX3Byb2ZpbGUgPSBfZmV0Y2hfZWRocmVjX2F2ZXJhZ2UoY29tbWFuZGVyX25hbWUpCiAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbiBhcyBlOgogICAgICAgICAgICByYWlzZSBIVFRQRXhjZXB0aW9uKDUwMiwgZiJFREhSRUMgZmV0Y2ggZmFpbGVkOiB7ZX0iKQogICAgICAgIG1haW5ib2FyZCA9IGVkaHJlY19wcm9maWxlLmdldCgibWFpbmJvYXJkIiwge30pCiAgICAgICAgaW5fZGVja19uYW1lcyA9IHNldCgKICAgICAgICAgICAgclsiY2FyZF9uYW1lIl0ubG93ZXIoKSBmb3IgciBpbgogICAgICAgICAgICBjb25uLmV4ZWN1dGUoIlNFTEVDVCBjYXJkX25hbWUgRlJPTSBkZWNrX2NhcmRzIFdIRVJFIGRlY2tfaWQgPSA/IiwgKGRlY2tfaWQsKSkuZmV0Y2hhbGwoKQogICAgICAgICkKICAgICAgICBjb2xsX3Jvd3MgPSBjb25uLmV4ZWN1dGUoIlNFTEVDVCBuYW1lLCBzY3J5ZmFsbF9pZCwgdHlwZV9saW5lLCBvcmFjbGVfdGV4dCwga2V5d29yZHMsIHF1YW50aXR5IEZST00gY29sbGVjdGlvbl9lbnRyaWVzIikuZmV0Y2hhbGwoKQogICAgICAgIGNvbGxfbWFwID0ge3JbIm5hbWUiXS5sb3dlcigpOiBkaWN0KHIpIGZvciByIGluIGNvbGxfcm93c30KCiAgICAgICAgZm9yIGNhcmRfbmFtZSBpbiBtYWluYm9hcmQ6CiAgICAgICAgICAgIG5hbWVfbG93ZXIgPSBjYXJkX25hbWUubG93ZXIoKQogICAgICAgICAgICBpZiBuYW1lX2xvd2VyIGluIGluX2RlY2tfbmFtZXM6CiAgICAgICAgICAgICAgICBjb250aW51ZQogICAgICAgICAgICBjb2xsX2luZm8gPSBjb2xsX21hcC5nZXQobmFtZV9sb3dlcikKICAgICAgICAgICAgaWYgcmVxLm9ubHlfb3duZWQgYW5kIG5vdCBjb2xsX2luZm86CiAgICAgICAgICAgICAgICBjb250aW51ZQogICAgICAgICAgICBpZiBub3QgY29sbF9pbmZvOgogICAgICAgICAgICAgICAgY29udGludWUgICMgY2FuJ3QgYWRkIHdpdGhvdXQgc2NyeWZhbGxfaWQKICAgICAgICAgICAgc2NyeWZhbGxfaWQgPSBjb2xsX2luZm8uZ2V0KCJzY3J5ZmFsbF9pZCIsICIiKQogICAgICAgICAgICBpZiBub3Qgc2NyeWZhbGxfaWQ6CiAgICAgICAgICAgICAgICBjb250aW51ZQogICAgICAgICAgICB0bCA9IGNvbGxfaW5mby5nZXQoInR5cGVfbGluZSIsICIiKQogICAgICAgICAgICBjdCA9IF9jbGFzc2lmeV9jYXJkX3R5cGUodGwpCiAgICAgICAgICAgIGNhcmRfcm9sZXMgPSBfZGV0ZWN0X2NhcmRfcm9sZXMoY29sbF9pbmZvLmdldCgib3JhY2xlX3RleHQiLCAiIiksIHRsLCBjb2xsX2luZm8uZ2V0KCJrZXl3b3JkcyIsIFtdKSkKICAgICAgICAgICAgaWYgdHlwZV9maWx0ZXIgYW5kIGN0IG5vdCBpbiB0eXBlX2ZpbHRlcjoKICAgICAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgICAgIGlmIHJvbGVfZmlsdGVyIGFuZCBub3QgYW55KHIgaW4gY2FyZF9yb2xlcyBmb3IgciBpbiByb2xlX2ZpbHRlcik6CiAgICAgICAgICAgICAgICBjb250aW51ZQogICAgICAgICAgICBjYW5kaWRhdGVzLmFwcGVuZCh7InNjcnlmYWxsX2lkIjogc2NyeWZhbGxfaWQsICJjYXJkX3R5cGUiOiBjdCwgInF1YW50aXR5IjogMX0pCiAgICBlbHNlOgogICAgICAgIHJhaXNlIEhUVFBFeGNlcHRpb24oNDAwLCBmIlVua25vd24gc291cmNlICd7c291cmNlfScuIFVzZSAnY29sbGVjdGlvbicgb3IgJ2VkaHJlYycuIikKCiAgICAjIE5vdyBidWxrLWFkZCBjYW5kaWRhdGVzCiAgICBhZGRlZCA9IDAKICAgIHNraXBwZWQgPSAwCiAgICBkZXRhaWxzID0gW10KCiAgICBmb3IgYyBpbiBjYW5kaWRhdGVzOgogICAgICAgIHNjcnlmYWxsX2lkID0gY1sic2NyeWZhbGxfaWQiXQogICAgICAgIGNhcmRfdHlwZSA9IGNbImNhcmRfdHlwZSJdCiAgICAgICAgcXVhbnRpdHkgPSBjWyJxdWFudGl0eSJdCgogICAgICAgIGlmIHJlcS5yZXNwZWN0X3JhdGlvcyBhbmQgbm90IF9jaGVja19yYXRpb19saW1pdChkZWNrX2lkLCBjYXJkX3R5cGUsIHF1YW50aXR5KToKICAgICAgICAgICAgc2tpcHBlZCArPSAxCiAgICAgICAgICAgIGRldGFpbHMuYXBwZW5kKHsic2NyeWZhbGxfaWQiOiBzY3J5ZmFsbF9pZCwgImNhcmRfdHlwZSI6IGNhcmRfdHlwZSwgInN0YXR1cyI6ICJza2lwcGVkIiwgInJlYXNvbiI6ICJyYXRpbyBsaW1pdCJ9KQogICAgICAgICAgICBjb250aW51ZQoKICAgICAgICBjZV9yb3cgPSBjb25uLmV4ZWN1dGUoCiAgICAgICAgICAgICJTRUxFQ1QgbmFtZSBGUk9NIGNvbGxlY3Rpb25fZW50cmllcyBXSEVSRSBzY3J5ZmFsbF9pZCA9ID8gTElNSVQgMSIsIChzY3J5ZmFsbF9pZCwpCiAgICAgICAgKS5mZXRjaG9uZSgpCiAgICAgICAgY2FyZF9uYW1lID0gY2Vfcm93WyJuYW1lIl0gaWYgY2Vfcm93IGVsc2UgIiIKCiAgICAgICAgZXhpc3RpbmcgPSBjb25uLmV4ZWN1dGUoCiAgICAgICAgICAgICJTRUxFQ1QgaWQsIHF1YW50aXR5IEZST00gZGVja19jYXJkcyBXSEVSRSBkZWNrX2lkID0gPyBBTkQgc2NyeWZhbGxfaWQgPSA/IiwKICAgICAgICAgICAgKGRlY2tfaWQsIHNjcnlmYWxsX2lkKQogICAgICAgICkuZmV0Y2hvbmUoKQogICAgICAgIGlmIGV4aXN0aW5nOgogICAgICAgICAgICBjb25uLmV4ZWN1dGUoCiAgICAgICAgICAgICAgICAiVVBEQVRFIGRlY2tfY2FyZHMgU0VUIHF1YW50aXR5ID0gPyBXSEVSRSBpZCA9ID8iLAogICAgICAgICAgICAgICAgKGV4aXN0aW5nWyJxdWFudGl0eSJdICsgcXVhbnRpdHksIGV4aXN0aW5nWyJpZCJdKQogICAgICAgICAgICApCiAgICAgICAgZWxzZToKICAgICAgICAgICAgY29ubi5leGVjdXRlKAogICAgICAgICAgICAgICAgIklOU0VSVCBJTlRPIGRlY2tfY2FyZHMgKGRlY2tfaWQsIHNjcnlmYWxsX2lkLCBjYXJkX25hbWUsIHF1YW50aXR5KSBWQUxVRVMgKD8sID8sID8sID8pIiwKICAgICAgICAgICAgICAgIChkZWNrX2lkLCBzY3J5ZmFsbF9pZCwgY2FyZF9uYW1lLCBxdWFudGl0eSkKICAgICAgICAgICAgKQogICAgICAgIGNvbm4uY29tbWl0KCkKICAgICAgICBhZGRlZCArPSAxCiAgICAgICAgZGV0YWlscy5hcHBlbmQoeyJzY3J5ZmFsbF9pZCI6IHNjcnlmYWxsX2lkLCAibmFtZSI6IGNhcmRfbmFtZSwgImNhcmRfdHlwZSI6IGNhcmRfdHlwZSwgInN0YXR1cyI6ICJhZGRlZCJ9KQoKICAgIGNvbm4uZXhlY3V0ZSgiVVBEQVRFIGRlY2tzIFNFVCB1cGRhdGVkX2F0ID0gZGF0ZXRpbWUoJ25vdycpIFdIRVJFIGlkID0gPyIsIChkZWNrX2lkLCkpCiAgICBjb25uLmNvbW1pdCgpCgogICAgYW5hbHlzaXMgPSBfY29tcHV0ZV9kZWNrX2FuYWx5c2lzKGRlY2tfaWQpCiAgICByZXR1cm4geyJhZGRlZCI6IGFkZGVkLCAic2tpcHBlZCI6IHNraXBwZWQsICJkZXRhaWxzIjogZGV0YWlscywgImFuYWx5c2lzIjogYW5hbHlzaXN9CgoKIyDilIDilIAgMi45IFNpbXVsYXRpb24gRXhwb3J0IOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgAoKQGFwcC5wb3N0KCIvYXBpL2RlY2tzL3tkZWNrX2lkfS9leHBvcnQtdG8tc2ltIikKYXN5bmMgZGVmIGV4cG9ydF9kZWNrX3RvX3NpbShkZWNrX2lkOiBpbnQpOgogICAgIiIiCiAgICBFeHBvcnQgYSBkZWNrIHRvIEZvcmdlIC5kY2sgZm9ybWF0IGFuZCBzYXZlIHRvIHRoZSBGb3JnZSBkZWNrcyBkaXJlY3RvcnkuCiAgICBSZXR1cm5zIHRoZSBkZWNrIG5hbWUgZm9yIHVzZSBpbiBzaW11bGF0aW9ucy4KICAgICIiIgogICAgZGVjayA9IF9nZXRfZGVja19vcl80MDQoZGVja19pZCkKICAgIGNvbm4gPSBfZ2V0X2RiX2Nvbm4oKQoKICAgIGNhcmRfcm93cyA9IGNvbm4uZXhlY3V0ZSgKICAgICAgICAiU0VMRUNUIGNhcmRfbmFtZSwgcXVhbnRpdHksIGlzX2NvbW1hbmRlciBGUk9NIGRlY2tfY2FyZHMgV0hFUkUgZGVja19pZCA9ID8gT1JERVIgQlkgaXNfY29tbWFuZGVyIERFU0MsIGNhcmRfbmFtZSBBU0MiLAogICAgICAgIChkZWNrX2lkLCkKICAgICkuZmV0Y2hhbGwoKQoKICAgIGlmIG5vdCBjYXJkX3Jvd3M6CiAgICAgICAgcmFpc2UgSFRUUEV4Y2VwdGlvbig0MDAsICJEZWNrIGhhcyBubyBjYXJkcyB0byBleHBvcnQiKQoKICAgICMgQnVpbGQgLmRjayBjb250ZW50CiAgICBsaW5lcyA9IFsiW21ldGFkYXRhXSJdCiAgICBkZWNrX25hbWUgPSBkZWNrLmdldCgibmFtZSIsIGYiRGVjayB7ZGVja19pZH0iKQogICAgbGluZXMuYXBwZW5kKGYiTmFtZT17ZGVja19uYW1lfSIpCiAgICBsaW5lcy5hcHBlbmQoIiIpCgogICAgY29tbWFuZGVycyA9IFtyIGZvciByIGluIGNhcmRfcm93cyBpZiByWyJpc19jb21tYW5kZXIiXV0KICAgIG1haW5ib2FyZCA9IFtyIGZvciByIGluIGNhcmRfcm93cyBpZiBub3QgclsiaXNfY29tbWFuZGVyIl1dCgogICAgbGluZXMuYXBwZW5kKCJbQ29tbWFuZGVyXSIpCiAgICBmb3IgciBpbiBjb21tYW5kZXJzOgogICAgICAgIG5hbWUgPSByWyJjYXJkX25hbWUiXSBvciAiVW5rbm93biIKICAgICAgICBxdHkgPSByWyJxdWFudGl0eSJdIG9yIDEKICAgICAgICBsaW5lcy5hcHBlbmQoZiJ7cXR5fSB7bmFtZX0iKQoKICAgIGxpbmVzLmFwcGVuZCgiIikKICAgIGxpbmVzLmFwcGVuZCgiW01haW5dIikKICAgIGZvciByIGluIG1haW5ib2FyZDoKICAgICAgICBuYW1lID0gclsiY2FyZF9uYW1lIl0gb3IgIlVua25vd24iCiAgICAgICAgcXR5ID0gclsicXVhbnRpdHkiXSBvciAxCiAgICAgICAgbGluZXMuYXBwZW5kKGYie3F0eX0ge25hbWV9IikKCiAgICBjb250ZW50ID0gIlxuIi5qb2luKGxpbmVzKQoKICAgICMgRGV0ZXJtaW5lIHNhdmUgZGlyZWN0b3J5CiAgICBzYWZlX25hbWUgPSByZS5zdWIociJbXmEtekEtWjAtOSBfLV0iLCAiIiwgZGVja19uYW1lKS5yZXBsYWNlKCIgIiwgIl8iKS5zdHJpcCgpCiAgICBpZiBub3Qgc2FmZV9uYW1lOgogICAgICAgIHNhZmVfbmFtZSA9IGYiZGVja197ZGVja19pZH0iCgogICAgc2F2ZV9kaXIgPSBDRkcuZm9yZ2VfZGVja3NfZGlyCiAgICBpZiBub3Qgc2F2ZV9kaXIgb3Igbm90IG9zLnBhdGguaXNkaXIoc2F2ZV9kaXIpOgogICAgICAgIHNhdmVfZGlyID0gb3MucGF0aC5qb2luKG9zLnBhdGguZGlybmFtZShfX2ZpbGVfXyksICJleHBvcnRlZC1kZWNrcyIpCiAgICAgICAgb3MubWFrZWRpcnMoc2F2ZV9kaXIsIGV4aXN0X29rPVRydWUpCgogICAgb3V0X3BhdGggPSBQYXRoKHNhdmVfZGlyKSAvIGYie3NhZmVfbmFtZX0uZGNrIgogICAgb3V0X3BhdGgud3JpdGVfdGV4dChjb250ZW50LCBlbmNvZGluZz0idXRmLTgiKQogICAgbG9nX2RlY2tnZW4uaW5mbyhmIiAgRXhwb3J0ZWQgZGVjayB7ZGVja19pZH0gdG8ge291dF9wYXRofSIpCgogICAgcmV0dXJuIHsKICAgICAgICAic3VjY2VzcyI6IFRydWUsCiAgICAgICAgImRlY2tOYW1lIjogc2FmZV9uYW1lLAogICAgICAgICJkY2tGaWxlIjogc3RyKG91dF9wYXRoKSwKICAgICAgICAidG90YWxDYXJkcyI6IHN1bShyWyJxdWFudGl0eSJdIGZvciByIGluIGNhcmRfcm93cyksCiAgICAgICAgImNvbW1hbmRlckNvdW50IjogbGVuKGNvbW1hbmRlcnMpLAogICAgICAgICJtYWluYm9hcmRDb3VudCI6IGxlbihtYWluYm9hcmQpLAogICAgfQoKCiMg4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQCiMgRGVjayBJbXBvcnQgRW5kcG9pbnQKIyDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZAKCgpkZWYgX3BhcnNlX2RlY2tsaXN0X3RleHQodGV4dDogc3RyKSAtPiBkaWN0OgogICAgIiIiCiAgICBQYXJzZSBhIGRlY2tsaXN0IGZyb20gdGV4dC4gU3VwcG9ydHM6CiAgICAgIC0gRm9yZ2UgLmRjayBmb3JtYXQgd2l0aCBbQ29tbWFuZGVyXSwgW0RlY2tdLCBbTWFpbl0gc2VjdGlvbnMKICAgICAgLSBNVEdBIGZvcm1hdDogMSBDYXJkIE5hbWUKICAgICAgLSBQbGFpbjogQ2FyZCBOYW1lIChhc3N1bWVkIHF0eSAxKQogICAgICAtIExpbmVzIHN0YXJ0aW5nIHdpdGggLy8gb3IgIyBhcmUgY29tbWVudHMKICAgIFJldHVybnMgeyAnY29tbWFuZGVycyc6IFt7J25hbWUnOiBzdHIsICdxdHknOiBpbnR9XSwgJ2NhcmRzJzogW3snbmFtZSc6IHN0ciwgJ3F0eSc6IGludH1dIH0KICAgICIiIgogICAgY29tbWFuZGVycyA9IFtdCiAgICBjYXJkcyA9IFtdCiAgICBzZWN0aW9uID0gJ21haW4nICAjIGRlZmF1bHQgc2VjdGlvbgoKICAgIGZvciByYXdfbGluZSBpbiB0ZXh0LnNwbGl0bGluZXMoKToKICAgICAgICBsaW5lID0gcmF3X2xpbmUuc3RyaXAoKQogICAgICAgIGlmIG5vdCBsaW5lIG9yIGxpbmUuc3RhcnRzd2l0aCgnLy8nKSBvciBsaW5lLnN0YXJ0c3dpdGgoJyMnKToKICAgICAgICAgICAgY29udGludWUKCiAgICAgICAgIyBTZWN0aW9uIGhlYWRlcnMKICAgICAgICBsb3cgPSBsaW5lLmxvd2VyKCkKICAgICAgICBpZiBsb3cuc3RhcnRzd2l0aCgnW2NvbW1hbmRlcicpOgogICAgICAgICAgICBzZWN0aW9uID0gJ2NvbW1hbmRlcicKICAgICAgICAgICAgY29udGludWUKICAgICAgICBpZiBsb3cuc3RhcnRzd2l0aCgnW2RlY2snKSBvciBsb3cuc3RhcnRzd2l0aCgnW21haW4nKSBvciBsb3cuc3RhcnRzd2l0aCgnW21haW5ib2FyZCcpOgogICAgICAgICAgICBzZWN0aW9uID0gJ21haW4nCiAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgaWYgbG93LnN0YXJ0c3dpdGgoJ1tzaWRlYm9hcmQnKSBvciBsb3cuc3RhcnRzd2l0aCgnW3NpZGUnKSBvciBsb3cuc3RhcnRzd2l0aCgnW21ldGFkYXRhJyk6CiAgICAgICAgICAgIHNlY3Rpb24gPSAnc2tpcCcKICAgICAgICAgICAgY29udGludWUKICAgICAgICBpZiBsb3cuc3RhcnRzd2l0aCgnWycpOgogICAgICAgICAgICAjIFVua25vd24gc2VjdGlvbiwgdHJlYXQgYXMgbWFpbgogICAgICAgICAgICBzZWN0aW9uID0gJ21haW4nCiAgICAgICAgICAgIGNvbnRpbnVlCgogICAgICAgIGlmIHNlY3Rpb24gPT0gJ3NraXAnOgogICAgICAgICAgICBjb250aW51ZQoKICAgICAgICAjIFBhcnNlIHF1YW50aXR5ICsgbmFtZQogICAgICAgIG0gPSByZS5tYXRjaChyJ14oXGQrKVxzKlt4WF0/XHMrKC4rKSQnLCBsaW5lKQogICAgICAgIGlmIG06CiAgICAgICAgICAgIHF0eSA9IGludChtLmdyb3VwKDEpKQogICAgICAgICAgICBuYW1lID0gbS5ncm91cCgyKS5zdHJpcCgpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgcXR5ID0gMQogICAgICAgICAgICBuYW1lID0gbGluZQoKICAgICAgICAjIFN0cmlwIHNldCBjb2RlcyBsaWtlICIoTTIxKSIgb3IgIihNMjEpIDEyMyIgZnJvbSBNVEdBIGV4cG9ydHMKICAgICAgICBuYW1lID0gcmUuc3ViKHInXHMqXChbQS1aMC05XStcKVxzKlxkKlxzKiQnLCAnJywgbmFtZSkuc3RyaXAoKQoKICAgICAgICBpZiBub3QgbmFtZToKICAgICAgICAgICAgY29udGludWUKCiAgICAgICAgaWYgc2VjdGlvbiA9PSAnY29tbWFuZGVyJzoKICAgICAgICAgICAgY29tbWFuZGVycy5hcHBlbmQoeyduYW1lJzogbmFtZSwgJ3F0eSc6IHF0eX0pCiAgICAgICAgZWxzZToKICAgICAgICAgICAgY2FyZHMuYXBwZW5kKHsnbmFtZSc6IG5hbWUsICdxdHknOiBxdHl9KQoKICAgIHJldHVybiB7J2NvbW1hbmRlcnMnOiBjb21tYW5kZXJzLCAnY2FyZHMnOiBjYXJkc30KCgpAYXBwLnBvc3QoJy9hcGkvZGVja3Mve2RlY2tfaWR9L2ltcG9ydCcpCmFzeW5jIGRlZiBpbXBvcnRfZGVja2xpc3QoZGVja19pZDogaW50LCByZXF1ZXN0OiBGYXN0QVBJUmVxdWVzdCk6CiAgICAiIiIKICAgIEltcG9ydCBhIGRlY2tsaXN0IGludG8gYW4gZXhpc3RpbmcgZGVjay4gUGFyc2VzIHRleHQsIGxvb2tzIHVwIGVhY2ggY2FyZAogICAgb24gU2NyeWZhbGwsIGFuZCBhZGRzIHRoZW0gdG8gdGhlIGRlY2suCgogICAgQm9keTogeyAidGV4dCI6ICIxIFNvbCBSaW5nXG4xIEN1bHRpdmF0ZS4uLiIgLCAiY2xlYXJGaXJzdCI6IGZhbHNlIH0KICAgICIiIgogICAgZGVjayA9IF9nZXRfZGVja19vcl80MDQoZGVja19pZCkKICAgIGJvZHkgPSBhd2FpdCByZXF1ZXN0Lmpzb24oKQogICAgdGV4dCA9IGJvZHkuZ2V0KCd0ZXh0JywgJycpCiAgICBjbGVhcl9maXJzdCA9IGJvZHkuZ2V0KCdjbGVhckZpcnN0JywgRmFsc2UpCgogICAgaWYgbm90IHRleHQuc3RyaXAoKToKICAgICAgICByZXR1cm4gSlNPTlJlc3BvbnNlKHsnZXJyb3InOiAnTm8gZGVja2xpc3QgdGV4dCBwcm92aWRlZCd9LCBzdGF0dXNfY29kZT00MDApCgogICAgcGFyc2VkID0gX3BhcnNlX2RlY2tsaXN0X3RleHQodGV4dCkKICAgIGFsbF9lbnRyaWVzID0gW10KICAgIGZvciBjIGluIHBhcnNlZFsnY29tbWFuZGVycyddOgogICAgICAgIGFsbF9lbnRyaWVzLmFwcGVuZCh7KipjLCAnaXNfY29tbWFuZGVyJzogVHJ1ZX0pCiAgICBmb3IgYyBpbiBwYXJzZWRbJ2NhcmRzJ106CiAgICAgICAgYWxsX2VudHJpZXMuYXBwZW5kKHsqKmMsICdpc19jb21tYW5kZXInOiBGYWxzZX0pCgogICAgaWYgbm90IGFsbF9lbnRyaWVzOgogICAgICAgIHJldHVybiBKU09OUmVzcG9uc2UoeydlcnJvcic6ICdObyBjYXJkcyBmb3VuZCBpbiBkZWNrbGlzdCd9LCBzdGF0dXNfY29kZT00MDApCgogICAgY29ubiA9IF9nZXRfZGJfY29ubigpCgogICAgIyBPcHRpb25hbGx5IGNsZWFyIGV4aXN0aW5nIGNhcmRzCiAgICBpZiBjbGVhcl9maXJzdDoKICAgICAgICBjb25uLmV4ZWN1dGUoJ0RFTEVURSBGUk9NIGRlY2tfY2FyZHMgV0hFUkUgZGVja19pZCA9ID8nLCAoZGVja19pZCwpKQogICAgICAgIGNvbm4uY29tbWl0KCkKCiAgICBhZGRlZCA9IDAKICAgIGZhaWxlZCA9IFtdCiAgICByZXN1bHRzID0gW10KCiAgICBmb3IgZW50cnkgaW4gYWxsX2VudHJpZXM6CiAgICAgICAgbmFtZSA9IGVudHJ5WyduYW1lJ10KICAgICAgICBxdHkgPSBlbnRyeVsncXR5J10KICAgICAgICBpc19jbWQgPSBlbnRyeVsnaXNfY29tbWFuZGVyJ10KCiAgICAgICAgIyBMb29rIHVwIG9uIFNjcnlmYWxsCiAgICAgICAgc2YgPSBfc2NyeWZhbGxfZnV6enlfbG9va3VwKG5hbWUpCiAgICAgICAgaWYgbm90IHNmOgogICAgICAgICAgICBmYWlsZWQuYXBwZW5kKG5hbWUpCiAgICAgICAgICAgIHJlc3VsdHMuYXBwZW5kKHsnbmFtZSc6IG5hbWUsICdzdGF0dXMnOiAnbm90X2ZvdW5kJ30pCiAgICAgICAgICAgIGNvbnRpbnVlCgogICAgICAgIHNjcnlmYWxsX2lkID0gc2YuZ2V0KCdpZCcsICcnKQogICAgICAgIHJlc29sdmVkX25hbWUgPSBzZi5nZXQoJ25hbWUnLCBuYW1lKQoKICAgICAgICAjIENoZWNrIGlmIGFscmVhZHkgaW4gZGVjawogICAgICAgIGV4aXN0aW5nID0gY29ubi5leGVjdXRlKAogICAgICAgICAgICAnU0VMRUNUIGlkLCBxdWFudGl0eSBGUk9NIGRlY2tfY2FyZHMgV0hFUkUgZGVja19pZCA9ID8gQU5EIHNjcnlmYWxsX2lkID0gPycsCiAgICAgICAgICAgIChkZWNrX2lkLCBzY3J5ZmFsbF9pZCkKICAgICAgICApLmZldGNob25lKCkKCiAgICAgICAgaWYgZXhpc3Rpbmc6CiAgICAgICAgICAgIGNvbm4uZXhlY3V0ZSgKICAgICAgICAgICAgICAgICdVUERBVEUgZGVja19jYXJkcyBTRVQgcXVhbnRpdHkgPSA/LCBpc19jb21tYW5kZXIgPSA/IFdIRVJFIGlkID0gPycsCiAgICAgICAgICAgICAgICAoZXhpc3RpbmdbJ3F1YW50aXR5J10gKyBxdHksIDEgaWYgaXNfY21kIGVsc2UgZXhpc3RpbmcuZ2V0KCdpc19jb21tYW5kZXInLCAwKSwgZXhpc3RpbmdbJ2lkJ10pCiAgICAgICAgICAgICkKICAgICAgICBlbHNlOgogICAgICAgICAgICBjb25uLmV4ZWN1dGUoCiAgICAgICAgICAgICAgICAnSU5TRVJUIElOVE8gZGVja19jYXJkcyAoZGVja19pZCwgc2NyeWZhbGxfaWQsIGNhcmRfbmFtZSwgcXVhbnRpdHksIGlzX2NvbW1hbmRlcikgVkFMVUVTICg/LCA/LCA/LCA/LCA/KScsCiAgICAgICAgICAgICAgICAoZGVja19pZCwgc2NyeWZhbGxfaWQsIHJlc29sdmVkX25hbWUsIHF0eSwgMSBpZiBpc19jbWQgZWxzZSAwKQogICAgICAgICAgICApCiAgICAgICAgY29ubi5jb21taXQoKQogICAgICAgIGFkZGVkICs9IDEKICAgICAgICByZXN1bHRzLmFwcGVuZCh7J25hbWUnOiByZXNvbHZlZF9uYW1lLCAncXR5JzogcXR5LCAnc3RhdHVzJzogJ2FkZGVkJywgJ2lzQ29tbWFuZGVyJzogaXNfY21kfSkKCiAgICAjIFVwZGF0ZSBjb21tYW5kZXIgb24gZGVjayByZWNvcmQgaWYgd2UgZm91bmQgb25lCiAgICBjbWRfZW50cmllcyA9IFtyIGZvciByIGluIHJlc3VsdHMgaWYgci5nZXQoJ2lzQ29tbWFuZGVyJyldCiAgICBpZiBjbWRfZW50cmllczoKICAgICAgICBjbWRfbmFtZSA9IGNtZF9lbnRyaWVzWzBdWyduYW1lJ10KICAgICAgICAjIExvb2sgdXAgc2NyeWZhbGxfaWQgZnJvbSB0aGUgZGVja19jYXJkcyB3ZSBqdXN0IGluc2VydGVkCiAgICAgICAgY21kX3JvdyA9IGNvbm4uZXhlY3V0ZSgKICAgICAgICAgICAgJ1NFTEVDVCBzY3J5ZmFsbF9pZCBGUk9NIGRlY2tfY2FyZHMgV0hFUkUgZGVja19pZCA9ID8gQU5EIGlzX2NvbW1hbmRlciA9IDEgTElNSVQgMScsCiAgICAgICAgICAgIChkZWNrX2lkLCkKICAgICAgICApLmZldGNob25lKCkKICAgICAgICBjbWRfc2ZfaWQgPSBjbWRfcm93WydzY3J5ZmFsbF9pZCddIGlmIGNtZF9yb3cgZWxzZSAnJwogICAgICAgIGNvbm4uZXhlY3V0ZSgKICAgICAgICAgICAgJ1VQREFURSBkZWNrcyBTRVQgY29tbWFuZGVyX25hbWUgPSA/LCBjb21tYW5kZXJfc2NyeWZhbGxfaWQgPSA/LCB1cGRhdGVkX2F0ID0gZGF0ZXRpbWUoXCdub3dcJykgV0hFUkUgaWQgPSA/JywKICAgICAgICAgICAgKGNtZF9uYW1lLCBjbWRfc2ZfaWQsIGRlY2tfaWQpCiAgICAgICAgKQogICAgZWxzZToKICAgICAgICBjb25uLmV4ZWN1dGUoIlVQREFURSBkZWNrcyBTRVQgdXBkYXRlZF9hdCA9IGRhdGV0aW1lKCdub3cnKSBXSEVSRSBpZCA9ID8iLCAoZGVja19pZCwpKQogICAgY29ubi5jb21taXQoKQoKICAgIHJldHVybiB7CiAgICAgICAgJ2FkZGVkJzogYWRkZWQsCiAgICAgICAgJ2ZhaWxlZCc6IGxlbihmYWlsZWQpLAogICAgICAgICdmYWlsZWROYW1lcyc6IGZhaWxlZCwKICAgICAgICAndG90YWwnOiBsZW4oYWxsX2VudHJpZXMpLAogICAgICAgICdyZXN1bHRzJzogcmVzdWx0cywKICAgIH0KCgpAYXBwLnBvc3QoJy9hcGkvZGVja3MvaW1wb3J0LW5ldycpCmFzeW5jIGRlZiBpbXBvcnRfZGVja2xpc3RfbmV3KHJlcXVlc3Q6IEZhc3RBUElSZXF1ZXN0KToKICAgICIiIgogICAgSW1wb3J0IGEgZGVja2xpc3QgYXMgYSBicmFuZC1uZXcgZGVjay4gQ3JlYXRlcyB0aGUgZGVjaywgdGhlbiBpbXBvcnRzIGNhcmRzLgoKICAgIEJvZHk6IHsgInRleHQiOiAiLi4uIiwgIm5hbWUiOiAiTXkgRGVjayIgfQogICAgIiIiCiAgICBib2R5ID0gYXdhaXQgcmVxdWVzdC5qc29uKCkKICAgIHRleHQgPSBib2R5LmdldCgndGV4dCcsICcnKQogICAgZGVja19uYW1lID0gYm9keS5nZXQoJ25hbWUnLCAnJykuc3RyaXAoKQoKICAgIGlmIG5vdCB0ZXh0LnN0cmlwKCk6CiAgICAgICAgcmV0dXJuIEpTT05SZXNwb25zZSh7J2Vycm9yJzogJ05vIGRlY2tsaXN0IHRleHQgcHJvdmlkZWQnfSwgc3RhdHVzX2NvZGU9NDAwKQoKICAgIHBhcnNlZCA9IF9wYXJzZV9kZWNrbGlzdF90ZXh0KHRleHQpCiAgICBhbGxfZW50cmllcyA9IFtdCiAgICBmb3IgYyBpbiBwYXJzZWRbJ2NvbW1hbmRlcnMnXToKICAgICAgICBhbGxfZW50cmllcy5hcHBlbmQoeyoqYywgJ2lzX2NvbW1hbmRlcic6IFRydWV9KQogICAgZm9yIGMgaW4gcGFyc2VkWydjYXJkcyddOgogICAgICAgIGFsbF9lbnRyaWVzLmFwcGVuZCh7KipjLCAnaXNfY29tbWFuZGVyJzogRmFsc2V9KQoKICAgIGlmIG5vdCBhbGxfZW50cmllczoKICAgICAgICByZXR1cm4gSlNPTlJlc3BvbnNlKHsnZXJyb3InOiAnTm8gY2FyZHMgZm91bmQgaW4gZGVja2xpc3QnfSwgc3RhdHVzX2NvZGU9NDAwKQoKICAgICMgQXV0by1uYW1lIGZyb20gZmlyc3QgY29tbWFuZGVyIGlmIG5vIG5hbWUgZ2l2ZW4KICAgIGlmIG5vdCBkZWNrX25hbWU6CiAgICAgICAgY21kID0gcGFyc2VkWydjb21tYW5kZXJzJ11bMF1bJ25hbWUnXSBpZiBwYXJzZWRbJ2NvbW1hbmRlcnMnXSBlbHNlIE5vbmUKICAgICAgICBkZWNrX25hbWUgPSBjbWQgb3IgJ0ltcG9ydGVkIERlY2snCgogICAgY29ubiA9IF9nZXRfZGJfY29ubigpCiAgICBjdXIgPSBjb25uLmV4ZWN1dGUoCiAgICAgICAgIklOU0VSVCBJTlRPIGRlY2tzIChuYW1lLCBjcmVhdGVkX2F0LCB1cGRhdGVkX2F0KSBWQUxVRVMgKD8sIGRhdGV0aW1lKCdub3cnKSwgZGF0ZXRpbWUoJ25vdycpKSIsCiAgICAgICAgKGRlY2tfbmFtZSwpCiAgICApCiAgICBjb25uLmNvbW1pdCgpCiAgICBuZXdfZGVja19pZCA9IGN1ci5sYXN0cm93aWQKCiAgICAjIFNldCBjb21tYW5kZXIgb24gdGhlIGRlY2sgaWYgd2UgaGF2ZSBvbmUKICAgIGZpcnN0X2NtZF9zY3J5ZmFsbCA9IE5vbmUKICAgIGZpcnN0X2NtZF9uYW1lID0gTm9uZQoKICAgIGFkZGVkID0gMAogICAgZmFpbGVkID0gW10KCiAgICBmb3IgZW50cnkgaW4gYWxsX2VudHJpZXM6CiAgICAgICAgbmFtZSA9IGVudHJ5WyduYW1lJ10KICAgICAgICBxdHkgPSBlbnRyeVsncXR5J10KICAgICAgICBpc19jbWQgPSBlbnRyeVsnaXNfY29tbWFuZGVyJ10KCiAgICAgICAgc2YgPSBfc2NyeWZhbGxfZnV6enlfbG9va3VwKG5hbWUpCiAgICAgICAgaWYgbm90IHNmOgogICAgICAgICAgICBmYWlsZWQuYXBwZW5kKG5hbWUpCiAgICAgICAgICAgIGNvbnRpbnVlCgogICAgICAgIHNjcnlmYWxsX2lkID0gc2YuZ2V0KCdpZCcsICcnKQogICAgICAgIHJlc29sdmVkX25hbWUgPSBzZi5nZXQoJ25hbWUnLCBuYW1lKQoKICAgICAgICBpZiBpc19jbWQgYW5kIG5vdCBmaXJzdF9jbWRfc2NyeWZhbGw6CiAgICAgICAgICAgIGZpcnN0X2NtZF9zY3J5ZmFsbCA9IHNjcnlmYWxsX2lkCiAgICAgICAgICAgIGZpcnN0X2NtZF9uYW1lID0gcmVzb2x2ZWRfbmFtZQoKICAgICAgICBjb25uLmV4ZWN1dGUoCiAgICAgICAgICAgICdJTlNFUlQgSU5UTyBkZWNrX2NhcmRzIChkZWNrX2lkLCBzY3J5ZmFsbF9pZCwgY2FyZF9uYW1lLCBxdWFudGl0eSwgaXNfY29tbWFuZGVyKSBWQUxVRVMgKD8sID8sID8sID8sID8pJywKICAgICAgICAgICAgKG5ld19kZWNrX2lkLCBzY3J5ZmFsbF9pZCwgcmVzb2x2ZWRfbmFtZSwgcXR5LCAxIGlmIGlzX2NtZCBlbHNlIDApCiAgICAgICAgKQogICAgICAgIGNvbm4uY29tbWl0KCkKICAgICAgICBhZGRlZCArPSAxCgogICAgIyBVcGRhdGUgY29tbWFuZGVyIG9uIGRlY2sgcmVjb3JkCiAgICBpZiBmaXJzdF9jbWRfc2NyeWZhbGw6CiAgICAgICAgY29ubi5leGVjdXRlKAogICAgICAgICAgICAnVVBEQVRFIGRlY2tzIFNFVCBjb21tYW5kZXJfbmFtZSA9ID8sIGNvbW1hbmRlcl9zY3J5ZmFsbF9pZCA9ID8gV0hFUkUgaWQgPSA/JywKICAgICAgICAgICAgKGZpcnN0X2NtZF9uYW1lLCBmaXJzdF9jbWRfc2NyeWZhbGwsIG5ld19kZWNrX2lkKQogICAgICAgICkKICAgICAgICBjb25uLmNvbW1pdCgpCgogICAgcmV0dXJuIHsKICAgICAgICAnZGVja0lkJzogbmV3X2RlY2tfaWQsCiAgICAgICAgJ2RlY2tOYW1lJzogZGVja19uYW1lLAogICAgICAgICdhZGRlZCc6IGFkZGVkLAogICAgICAgICdmYWlsZWQnOiBsZW4oZmFpbGVkKSwKICAgICAgICAnZmFpbGVkTmFtZXMnOiBmYWlsZWQsCiAgICAgICAgJ3RvdGFsJzogbGVuKGFsbF9lbnRyaWVzKSwKICAgIH0KCgojIOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkAojIENhcmQgU2Nhbm5lciBFbmRwb2ludAojIOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkAoKZGVmIF9zY3J5ZmFsbF9mdXp6eV9sb29rdXAobmFtZTogc3RyKSAtPiBPcHRpb25hbFtkaWN0XToKICAgICIiIgogICAgRnV6enktc2VhcmNoIFNjcnlmYWxsIGZvciBhIGNhcmQgbmFtZSAodXNlZCBieSB0aGUgc2Nhbm5lciBwaXBlbGluZSkuCiAgICBSZXR1cm5zIHRoZSByYXcgU2NyeWZhbGwgSlNPTiBkaWN0LCBvciBOb25lIG9uIGZhaWx1cmUuCiAgICAiIiIKICAgIGZyb20gdXJsbGliLnBhcnNlIGltcG9ydCBxdW90ZQogICAgX3NjcnlmYWxsX3JhdGVfbGltaXQoKQogICAgdHJ5OgogICAgICAgIGVuY29kZWQgPSBxdW90ZShuYW1lKQogICAgICAgIHVybCA9IGYiaHR0cHM6Ly9hcGkuc2NyeWZhbGwuY29tL2NhcmRzL25hbWVkP2Z1enp5PXtlbmNvZGVkfSIKICAgICAgICByZXEgPSBSZXF1ZXN0KHVybCwgaGVhZGVycz1fQVBJX0hFQURFUlMpCiAgICAgICAgd2l0aCB1cmxvcGVuKHJlcSwgdGltZW91dD0xMCkgYXMgcmVzcDoKICAgICAgICAgICAgZGF0YSA9IGpzb24ubG9hZHMocmVzcC5yZWFkKCkuZGVjb2RlKCJ1dGYtOCIpKQogICAgICAgIGlmIGRhdGEuZ2V0KCJvYmplY3QiKSA9PSAiZXJyb3IiOgogICAgICAgICAgICByZXR1cm4gTm9uZQogICAgICAgIHJldHVybiBkYXRhCiAgICBleGNlcHQgRXhjZXB0aW9uOgogICAgICAgIHJldHVybiBOb25lCgoKQGFwcC5wb3N0KCIvYXBpL2NvbGxlY3Rpb24vc2NhbiIpCmFzeW5jIGRlZiBzY2FuX2NhcmRfaW1hZ2UocmVxdWVzdDogRmFzdEFQSVJlcXVlc3QpOgogICAgIiIiCiAgICBTY2FuIGEgY2FyZCBpbWFnZSBhbmQgcmV0dXJuIHJlY29nbml6ZWQgY2FyZCBuYW1lKHMpLgoKICAgIFVzZXMgWGltaWxhciBWaXN1YWwgQUkgZm9yIGNhcmQgcmVjb2duaXRpb24uCgogICAgQWNjZXB0cyBtdWx0aXBhcnQvZm9ybS1kYXRhIHdpdGg6CiAgICAgIC0gZmlsZTogaW1hZ2UgZmlsZSAoSlBFRy9QTkcpCiAgICAgIC0gbW9kZTogInNpbmdsZSIgKGRlZmF1bHQpIG9yICJtdWx0aSIKCiAgICBSZXR1cm5zOgogICAgICB7ICJyZXN1bHRzIjogWyB7IHJhd19vY3IsIG1hdGNoZWRfbmFtZSwgc2V0X2NvZGUsIHNjcnlmYWxsX2lkLCBjb25maWRlbmNlLCBpbWFnZV91cmksIGVycm9yLCBjb2xsZWN0b3JfbnVtYmVyLCByYXJpdHksIHRjZ3BsYXllcl91cmwgfSwgLi4uIF0gfQogICAgIiIiCiAgICB0cnk6CiAgICAgICAgZnJvbSBzY2FubmVyLnBpcGVsaW5lIGltcG9ydCBzY2FuX3NpbmdsZSwgc2Nhbl9tdWx0aQogICAgZXhjZXB0IEltcG9ydEVycm9yIGFzIGU6CiAgICAgICAgcmFpc2UgSFRUUEV4Y2VwdGlvbig1MDAsIGYiU2Nhbm5lciBtb2R1bGUgbm90IGF2YWlsYWJsZToge2V9IikKCiAgICAjIFRyeSBDRkcgZmlyc3QsIHRoZW4gZmFsbCBiYWNrIHRvIGVudiB2YXIKICAgIGFwaV9rZXkgPSBDRkcueGltaWxhcl9hcGlfa2V5IG9yIG9zLmVudmlyb24uZ2V0KCJYSU1JTEFSX0FQSV9LRVkiLCAiIikKICAgIGlmIG5vdCBhcGlfa2V5OgogICAgICAgIHJhaXNlIEhUVFBFeGNlcHRpb24oNTAwLCAiQ2FyZCBzY2FubmVyIG5vdCBjb25maWd1cmVkLiBTdGFydCB0aGUgc2VydmVyIHdpdGggLS14aW1pbGFyLWtleSBZT1VSX0tFWSBvciBzZXQgWElNSUxBUl9BUElfS0VZIGVudiB2YXIuIikKCiAgICAjIFBhcnNlIG11bHRpcGFydCBmb3JtCiAgICBmb3JtID0gYXdhaXQgcmVxdWVzdC5mb3JtKCkKICAgIHVwbG9hZCA9IGZvcm0uZ2V0KCJmaWxlIikKICAgIGlmIHVwbG9hZCBpcyBOb25lOgogICAgICAgIHJhaXNlIEhUVFBFeGNlcHRpb24oNDAwLCAiTm8gZmlsZSB1cGxvYWRlZC4gU2VuZCBhbiBpbWFnZSBhcyAnZmlsZScgaW4gbXVsdGlwYXJ0L2Zvcm0tZGF0YS4iKQoKICAgIG1vZGUgPSBzdHIoZm9ybS5nZXQoIm1vZGUiLCAic2luZ2xlIikpLmxvd2VyKCkKICAgIGltYWdlX2J5dGVzID0gYXdhaXQgdXBsb2FkLnJlYWQoKQoKICAgIGlmIGxlbihpbWFnZV9ieXRlcykgPT0gMDoKICAgICAgICByYWlzZSBIVFRQRXhjZXB0aW9uKDQwMCwgIlVwbG9hZGVkIGZpbGUgaXMgZW1wdHkiKQoKICAgICMgTGltaXQgZmlsZSBzaXplICgyMCBNQikKICAgIGlmIGxlbihpbWFnZV9ieXRlcykgPiAyMCAqIDEwMjQgKiAxMDI0OgogICAgICAgIHJhaXNlIEhUVFBFeGNlcHRpb24oNDAwLCAiSW1hZ2UgZmlsZSB0b28gbGFyZ2UgKG1heCAyMCBNQikiKQoKICAgIGxvZ19zY2FuLmluZm8oZiIgIFByb2Nlc3Npbmcge2xlbihpbWFnZV9ieXRlcyl9IGJ5dGVzLCBtb2RlPXttb2RlfSAoWGltaWxhciBBSSkiKQoKICAgIGlmIG1vZGUgPT0gIm11bHRpIjoKICAgICAgICByZXN1bHRzID0gc2Nhbl9tdWx0aShpbWFnZV9ieXRlcywgX3NjcnlmYWxsX2Z1enp5X2xvb2t1cCwgeGltaWxhcl9hcGlfa2V5PWFwaV9rZXkpCiAgICBlbHNlOgogICAgICAgIHJlc3VsdCA9IHNjYW5fc2luZ2xlKGltYWdlX2J5dGVzLCBfc2NyeWZhbGxfZnV6enlfbG9va3VwLCB4aW1pbGFyX2FwaV9rZXk9YXBpX2tleSkKICAgICAgICByZXN1bHRzID0gW3Jlc3VsdF0KCiAgICByZXR1cm4gewogICAgICAgICJyZXN1bHRzIjogW3IudG9fZGljdCgpIGZvciByIGluIHJlc3VsdHNdCiAgICB9CgoKQGFwcC5wb3N0KCIvYXBpL2NvbGxlY3Rpb24vc2Nhbi9hZGQiKQphc3luYyBkZWYgc2Nhbl9hZGRfY2FyZHMoYm9keTogZGljdCk6CiAgICAiIiIKICAgIEFkZCBzY2FubmVkIGNhcmRzIHRvIHRoZSBjb2xsZWN0aW9uLgoKICAgIEJvZHk6CiAgICAgIHsKICAgICAgICAiY2FyZHMiOiBbCiAgICAgICAgICB7ICJuYW1lIjogIkxpZ2h0bmluZyBCb2x0IiwgInNldF9jb2RlIjogIm0xMSIsICJxdWFudGl0eSI6IDEgfSwKICAgICAgICAgIC4uLgogICAgICAgIF0KICAgICAgfQogICAgIiIiCiAgICBjYXJkcyA9IGJvZHkuZ2V0KCJjYXJkcyIsIFtdKQogICAgaWYgbm90IGNhcmRzOgogICAgICAgIHJhaXNlIEhUVFBFeGNlcHRpb24oNDAwLCAiTm8gY2FyZHMgcHJvdmlkZWQiKQoKICAgIGNvbm4gPSBfZ2V0X2RiX2Nvbm4oKQogICAgaW1wb3J0ZWQgPSAwCiAgICB1cGRhdGVkID0gMAogICAgZXJyb3JzID0gW10KCiAgICBmb3IgY2FyZF9yZXEgaW4gY2FyZHM6CiAgICAgICAgbmFtZSA9IHN0cihjYXJkX3JlcS5nZXQoIm5hbWUiLCAiIikpLnN0cmlwKCkKICAgICAgICBpZiBub3QgbmFtZToKICAgICAgICAgICAgY29udGludWUKCiAgICAgICAgcXVhbnRpdHkgPSBpbnQoY2FyZF9yZXEuZ2V0KCJxdWFudGl0eSIsIDEpKQogICAgICAgIHNldF9jb2RlID0gc3RyKGNhcmRfcmVxLmdldCgic2V0X2NvZGUiLCAiIikpLmxvd2VyKCkKICAgICAgICBjb2xsZWN0b3JfbnVtYmVyID0gc3RyKGNhcmRfcmVxLmdldCgiY29sbGVjdG9yX251bWJlciIsICIiKSkKICAgICAgICBmaW5pc2ggPSAiTk9STUFMIgoKICAgICAgICB0cnk6CiAgICAgICAgICAgIGVucmljaGVkID0gX2VucmljaF9mcm9tX3NjcnlmYWxsKG5hbWUsIHNldF9jb2RlLCBjb2xsZWN0b3JfbnVtYmVyKQogICAgICAgIGV4Y2VwdCBFeGNlcHRpb24gYXMgZToKICAgICAgICAgICAgZXJyb3JzLmFwcGVuZChmIlNjcnlmYWxsIGVycm9yIGZvciAne25hbWV9Jzoge2V9IikKICAgICAgICAgICAgY29udGludWUKCiAgICAgICAgaWYgbm90IGVucmljaGVkIG9yICJfZXJyb3IiIGluIGVucmljaGVkOgogICAgICAgICAgICBlcnJfbXNnID0gZW5yaWNoZWQuZ2V0KCJfZXJyb3IiLCBmIk5vdCBmb3VuZDogJ3tuYW1lfSciKSBpZiBlbnJpY2hlZCBlbHNlIGYiTm90IGZvdW5kOiAne25hbWV9JyIKICAgICAgICAgICAgZXJyb3JzLmFwcGVuZChlcnJfbXNnKQogICAgICAgICAgICBjb250aW51ZQoKICAgICAgICByZXNvbHZlZF9uYW1lID0gZW5yaWNoZWQuZ2V0KCJuYW1lIiwgbmFtZSkKCiAgICAgICAgIyBDaGVjayBmb3IgZXhpc3RpbmcgZW50cnkKICAgICAgICBleGlzdGluZyA9IGNvbm4uZXhlY3V0ZSgKICAgICAgICAgICAgIiIiU0VMRUNUIGlkLCBxdWFudGl0eSBGUk9NIGNvbGxlY3Rpb25fZW50cmllcwogICAgICAgICAgICAgICBXSEVSRSBuYW1lID0gPyBBTkQgc2V0X2NvZGUgPSA/IEFORCBjb2xsZWN0b3JfbnVtYmVyID0gPyBBTkQgZmluaXNoID0gPyIiIiwKICAgICAgICAgICAgKHJlc29sdmVkX25hbWUsIHNldF9jb2RlLCBjb2xsZWN0b3JfbnVtYmVyLCBmaW5pc2gpLAogICAgICAgICkuZmV0Y2hvbmUoKQoKICAgICAgICBpZiBleGlzdGluZzoKICAgICAgICAgICAgbmV3X3F0eSA9IGV4aXN0aW5nWyJxdWFudGl0eSJdICsgcXVhbnRpdHkKICAgICAgICAgICAgY29ubi5leGVjdXRlKAogICAgICAgICAgICAgICAgIlVQREFURSBjb2xsZWN0aW9uX2VudHJpZXMgU0VUIHF1YW50aXR5ID0gPywgdXBkYXRlZF9hdCA9IGRhdGV0aW1lKCdub3cnKSBXSEVSRSBpZCA9ID8iLAogICAgICAgICAgICAgICAgKG5ld19xdHksIGV4aXN0aW5nWyJpZCJdKSwKICAgICAgICAgICAgKQogICAgICAgICAgICBjb25uLmNvbW1pdCgpCiAgICAgICAgICAgIHVwZGF0ZWQgKz0gMQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIGNvbm4uZXhlY3V0ZSgKICAgICAgICAgICAgICAgICIiIklOU0VSVCBJTlRPIGNvbGxlY3Rpb25fZW50cmllcwogICAgICAgICAgICAgICAgICAgKG5hbWUsIHR5cGVfbGluZSwgc3VidHlwZXMsIGlzX2xlZ2VuZGFyeSwgaXNfYmFzaWMsIGNvbG9yX2lkZW50aXR5LAogICAgICAgICAgICAgICAgICAgIGNtYywgbWFuYV9jb3N0LCBvcmFjbGVfdGV4dCwga2V5d29yZHMsCiAgICAgICAgICAgICAgICAgICAgcG93ZXIsIHRvdWdobmVzcywgcmFyaXR5LCBzZXRfbmFtZSwgZWRocmVjX3JhbmssCiAgICAgICAgICAgICAgICAgICAgdGNnX3ByaWNlLCBzYWx0X3Njb3JlLCBpc19nYW1lX2NoYW5nZXIsCiAgICAgICAgICAgICAgICAgICAgY2F0ZWdvcnksIHNjcnlmYWxsX2lkLCB0Y2dwbGF5ZXJfaWQsCiAgICAgICAgICAgICAgICAgICAgcXVhbnRpdHksIGZpbmlzaCwgY29uZGl0aW9uLCBsYW5ndWFnZSwgbm90ZXMsIHRhZ3MsCiAgICAgICAgICAgICAgICAgICAgc2V0X2NvZGUsIGNvbGxlY3Rvcl9udW1iZXIpCiAgICAgICAgICAgICAgICAgICBWQUxVRVMgKD8sID8sID8sID8sID8sID8sID8sID8sID8sID8sID8sID8sID8sID8sID8sID8sID8sID8sID8sID8sID8sID8sID8sID8sID8sID8sID8sID8sID8pIiIiLAogICAgICAgICAgICAgICAgKAogICAgICAgICAgICAgICAgICAgIHJlc29sdmVkX25hbWUsCiAgICAgICAgICAgICAgICAgICAgZW5yaWNoZWQuZ2V0KCJ0eXBlX2xpbmUiLCAiIiksCiAgICAgICAgICAgICAgICAgICAgZW5yaWNoZWQuZ2V0KCJzdWJ0eXBlcyIsICJbXSIpLAogICAgICAgICAgICAgICAgICAgIGVucmljaGVkLmdldCgiaXNfbGVnZW5kYXJ5IiwgMCksCiAgICAgICAgICAgICAgICAgICAgZW5yaWNoZWQuZ2V0KCJpc19iYXNpYyIsIDApLAogICAgICAgICAgICAgICAgICAgIGVucmljaGVkLmdldCgiY29sb3JfaWRlbnRpdHkiLCAiW10iKSwKICAgICAgICAgICAgICAgICAgICBlbnJpY2hlZC5nZXQoImNtYyIsIDAuMCksCiAgICAgICAgICAgICAgICAgICAgZW5yaWNoZWQuZ2V0KCJtYW5hX2Nvc3QiLCAiIiksCiAgICAgICAgICAgICAgICAgICAgZW5yaWNoZWQuZ2V0KCJvcmFjbGVfdGV4dCIsICIiKSwKICAgICAgICAgICAgICAgICAgICBlbnJpY2hlZC5nZXQoImtleXdvcmRzIiwgIltdIiksCiAgICAgICAgICAgICAgICAgICAgZW5yaWNoZWQuZ2V0KCJwb3dlciIsICIiKSwKICAgICAgICAgICAgICAgICAgICBlbnJpY2hlZC5nZXQoInRvdWdobmVzcyIsICIiKSwKICAgICAgICAgICAgICAgICAgICBlbnJpY2hlZC5nZXQoInJhcml0eSIsICIiKSwKICAgICAgICAgICAgICAgICAgICBlbnJpY2hlZC5nZXQoInNldF9uYW1lIiwgIiIpLAogICAgICAgICAgICAgICAgICAgIGVucmljaGVkLmdldCgiZWRocmVjX3JhbmsiLCAwKSwKICAgICAgICAgICAgICAgICAgICBlbnJpY2hlZC5nZXQoInRjZ19wcmljZSIsIDAuMCksCiAgICAgICAgICAgICAgICAgICAgZW5yaWNoZWQuZ2V0KCJzYWx0X3Njb3JlIiwgMC4wKSwKICAgICAgICAgICAgICAgICAgICBlbnJpY2hlZC5nZXQoImlzX2dhbWVfY2hhbmdlciIsIDApLAogICAgICAgICAgICAgICAgICAgIGVucmljaGVkLmdldCgiY2F0ZWdvcnkiLCAiW10iKSwKICAgICAgICAgICAgICAgICAgICBlbnJpY2hlZC5nZXQoInNjcnlmYWxsX2lkIiwgIiIpLAogICAgICAgICAgICAgICAgICAgIGVucmljaGVkLmdldCgidGNncGxheWVyX2lkIiwgIiIpLAogICAgICAgICAgICAgICAgICAgIHF1YW50aXR5LAogICAgICAgICAgICAgICAgICAgIGZpbmlzaCwKICAgICAgICAgICAgICAgICAgICAiIiwgICMgY29uZGl0aW9uCiAgICAgICAgICAgICAgICAgICAgIiIsICAjIGxhbmd1YWdlCiAgICAgICAgICAgICAgICAgICAgIiIsICAjIG5vdGVzCiAgICAgICAgICAgICAgICAgICAgIiIsICAjIHRhZ3MKICAgICAgICAgICAgICAgICAgICBzZXRfY29kZSwKICAgICAgICAgICAgICAgICAgICBjb2xsZWN0b3JfbnVtYmVyLAogICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgKQogICAgICAgICAgICBjb25uLmNvbW1pdCgpCiAgICAgICAgICAgIGltcG9ydGVkICs9IDEKCiAgICByZXR1cm4gewogICAgICAgICJpbXBvcnRlZENvdW50IjogaW1wb3J0ZWQsCiAgICAgICAgInVwZGF0ZWRDb3VudCI6IHVwZGF0ZWQsCiAgICAgICAgImZhaWxlZENvdW50IjogbGVuKGVycm9ycyksCiAgICAgICAgImVycm9ycyI6IGVycm9ycywKICAgIH0KCgojIOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkAojIFJlLWVucmljaCBDb2xsZWN0aW9uIGZyb20gU2NyeWZhbGwKIyDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZAKCkBhcHAucG9zdCgiL2FwaS9jb2xsZWN0aW9uL3JlLWVucmljaCIpCmFzeW5jIGRlZiByZV9lbnJpY2hfY29sbGVjdGlvbigpOgogICAgIiIiCiAgICBSZS1mZXRjaCBTY3J5ZmFsbCBkYXRhIGZvciBhbGwgY29sbGVjdGlvbiBlbnRyaWVzIHRvIGJhY2tmaWxsCiAgICBtaXNzaW5nIGZpZWxkcyAobWFuYV9jb3N0LCBwb3dlciwgdG91Z2huZXNzLCByYXJpdHksIHNldF9uYW1lLCBlZGhyZWNfcmFuaykuCiAgICBBbHNvIHJlZnJlc2hlczogdHlwZV9saW5lLCBvcmFjbGVfdGV4dCwga2V5d29yZHMsIGNtYywgY29sb3JfaWRlbnRpdHksIHByaWNlcy4KICAgIFJ1bnMgc3luY2hyb25vdXNseSDigJQgbWF5IHRha2UgYSB3aGlsZSBmb3IgbGFyZ2UgY29sbGVjdGlvbnMuCiAgICAiIiIKICAgIGNvbm4gPSBfZ2V0X2RiX2Nvbm4oKQogICAgcm93cyA9IGNvbm4uZXhlY3V0ZSgKICAgICAgICAiU0VMRUNUIGlkLCBuYW1lLCBzZXRfY29kZSwgY29sbGVjdG9yX251bWJlciBGUk9NIGNvbGxlY3Rpb25fZW50cmllcyBPUkRFUiBCWSBpZCIKICAgICkuZmV0Y2hhbGwoKQoKICAgIHRvdGFsID0gbGVuKHJvd3MpCiAgICBlbnJpY2hlZF9jb3VudCA9IDAKICAgIHNraXBwZWRfY291bnQgPSAwCiAgICBlcnJvcnMgPSBbXQoKICAgIGZvciByb3cgaW4gcm93czoKICAgICAgICBjYXJkX2lkID0gcm93WyJpZCJdCiAgICAgICAgbmFtZSA9IHJvd1sibmFtZSJdCiAgICAgICAgc2V0X2NvZGUgPSByb3dbInNldF9jb2RlIl0gb3IgIiIKICAgICAgICBjb2xsZWN0b3JfbnVtYmVyID0gcm93WyJjb2xsZWN0b3JfbnVtYmVyIl0gb3IgIiIKCiAgICAgICAgdHJ5OgogICAgICAgICAgICBkYXRhID0gX2VucmljaF9mcm9tX3NjcnlmYWxsKG5hbWUsIHNldF9jb2RlLCBjb2xsZWN0b3JfbnVtYmVyKQogICAgICAgIGV4Y2VwdCBFeGNlcHRpb24gYXMgZToKICAgICAgICAgICAgZXJyb3JzLmFwcGVuZChmIkVycm9yIGZvciAne25hbWV9Jzoge2V9IikKICAgICAgICAgICAgc2tpcHBlZF9jb3VudCArPSAxCiAgICAgICAgICAgIGNvbnRpbnVlCgogICAgICAgIGlmIG5vdCBkYXRhIG9yICJfZXJyb3IiIGluIGRhdGE6CiAgICAgICAgICAgIGVycl9tc2cgPSBkYXRhLmdldCgiX2Vycm9yIiwgZiJOb3QgZm91bmQ6ICd7bmFtZX0nIikgaWYgZGF0YSBlbHNlIGYiTm90IGZvdW5kOiAne25hbWV9JyIKICAgICAgICAgICAgZXJyb3JzLmFwcGVuZChlcnJfbXNnKQogICAgICAgICAgICBza2lwcGVkX2NvdW50ICs9IDEKICAgICAgICAgICAgY29udGludWUKCiAgICAgICAgY29ubi5leGVjdXRlKAogICAgICAgICAgICAiIiJVUERBVEUgY29sbGVjdGlvbl9lbnRyaWVzIFNFVAogICAgICAgICAgICAgICAgdHlwZV9saW5lID0gPywgc3VidHlwZXMgPSA/LCBpc19sZWdlbmRhcnkgPSA/LCBpc19iYXNpYyA9ID8sCiAgICAgICAgICAgICAgICBjb2xvcl9pZGVudGl0eSA9ID8sIGNtYyA9ID8sIG1hbmFfY29zdCA9ID8sCiAgICAgICAgICAgICAgICBvcmFjbGVfdGV4dCA9ID8sIGtleXdvcmRzID0gPywKICAgICAgICAgICAgICAgIHBvd2VyID0gPywgdG91Z2huZXNzID0gPywKICAgICAgICAgICAgICAgIHJhcml0eSA9ID8sIHNldF9uYW1lID0gPywgZWRocmVjX3JhbmsgPSA/LAogICAgICAgICAgICAgICAgdGNnX3ByaWNlID0gPywgc2NyeWZhbGxfaWQgPSA/LCB0Y2dwbGF5ZXJfaWQgPSA/LAogICAgICAgICAgICAgICAgY2F0ZWdvcnkgPSA/LAogICAgICAgICAgICAgICAgdXBkYXRlZF9hdCA9IGRhdGV0aW1lKCdub3cnKQogICAgICAgICAgICBXSEVSRSBpZCA9ID8iIiIsCiAgICAgICAgICAgICgKICAgICAgICAgICAgICAgIGRhdGEuZ2V0KCJ0eXBlX2xpbmUiLCAiIiksCiAgICAgICAgICAgICAgICBkYXRhLmdldCgic3VidHlwZXMiLCAiW10iKSwKICAgICAgICAgICAgICAgIGRhdGEuZ2V0KCJpc19sZWdlbmRhcnkiLCAwKSwKICAgICAgICAgICAgICAgIGRhdGEuZ2V0KCJpc19iYXNpYyIsIDApLAogICAgICAgICAgICAgICAgZGF0YS5nZXQoImNvbG9yX2lkZW50aXR5IiwgIltdIiksCiAgICAgICAgICAgICAgICBkYXRhLmdldCgiY21jIiwgMC4wKSwKICAgICAgICAgICAgICAgIGRhdGEuZ2V0KCJtYW5hX2Nvc3QiLCAiIiksCiAgICAgICAgICAgICAgICBkYXRhLmdldCgib3JhY2xlX3RleHQiLCAiIiksCiAgICAgICAgICAgICAgICBkYXRhLmdldCgia2V5d29yZHMiLCAiW10iKSwKICAgICAgICAgICAgICAgIGRhdGEuZ2V0KCJwb3dlciIsICIiKSwKICAgICAgICAgICAgICAgIGRhdGEuZ2V0KCJ0b3VnaG5lc3MiLCAiIiksCiAgICAgICAgICAgICAgICBkYXRhLmdldCgicmFyaXR5IiwgIiIpLAogICAgICAgICAgICAgICAgZGF0YS5nZXQoInNldF9uYW1lIiwgIiIpLAogICAgICAgICAgICAgICAgZGF0YS5nZXQoImVkaHJlY19yYW5rIiwgMCksCiAgICAgICAgICAgICAgICBkYXRhLmdldCgidGNnX3ByaWNlIiwgMC4wKSwKICAgICAgICAgICAgICAgIGRhdGEuZ2V0KCJzY3J5ZmFsbF9pZCIsICIiKSwKICAgICAgICAgICAgICAgIGRhdGEuZ2V0KCJ0Y2dwbGF5ZXJfaWQiLCAiIiksCiAgICAgICAgICAgICAgICBkYXRhLmdldCgiY2F0ZWdvcnkiLCAiW10iKSwKICAgICAgICAgICAgICAgIGNhcmRfaWQsCiAgICAgICAgICAgICksCiAgICAgICAgKQogICAgICAgIGNvbm4uY29tbWl0KCkKICAgICAgICBlbnJpY2hlZF9jb3VudCArPSAxCgogICAgcmV0dXJuIHsKICAgICAgICAidG90YWwiOiB0b3RhbCwKICAgICAgICAiZW5yaWNoZWRDb3VudCI6IGVucmljaGVkX2NvdW50LAogICAgICAgICJza2lwcGVkQ291bnQiOiBza2lwcGVkX2NvdW50LAogICAgICAgICJlcnJvcnMiOiBlcnJvcnNbOjUwXSwgICMgY2FwIGVycm9yIGxpc3QKICAgIH0KCgojIOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkAojIEF1dG8tQ2xhc3NpZnkgQ29sbGVjdGlvbgojIOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkAoKQGFwcC5wb3N0KCIvYXBpL2NvbGxlY3Rpb24vYXV0by1jbGFzc2lmeSIpCmFzeW5jIGRlZiBhdXRvX2NsYXNzaWZ5X2NvbGxlY3Rpb24oKToKICAgICIiIgogICAgUnVuIGF1dG8tY2xhc3NpZmljYXRpb24gb24gYWxsIGNvbGxlY3Rpb24gZW50cmllcy4KICAgIFVzZXMgb3JhY2xlX3RleHQsIHR5cGVfbGluZSwgYW5kIGtleXdvcmRzIHRvIGRldGVjdCBmdW5jdGlvbmFsIHJvbGVzCiAgICAoUmFtcCwgRHJhdywgUmVtb3ZhbCwgQm9hcmQgV2lwZSwgQW50aGVtLCBTdGF4LCBldGMuKS4KICAgIE9ubHkgdXBkYXRlcyBjYXJkcyB3aG9zZSBjdXJyZW50IGNhdGVnb3J5IGlzIGVtcHR5IG9yICdbXScuCiAgICAiIiIKICAgIGNvbm4gPSBfZ2V0X2RiX2Nvbm4oKQogICAgcm93cyA9IGNvbm4uZXhlY3V0ZSgKICAgICAgICAiU0VMRUNUIGlkLCBvcmFjbGVfdGV4dCwgdHlwZV9saW5lLCBrZXl3b3JkcywgY2F0ZWdvcnkgRlJPTSBjb2xsZWN0aW9uX2VudHJpZXMgT1JERVIgQlkgaWQiCiAgICApLmZldGNoYWxsKCkKCiAgICB0b3RhbCA9IGxlbihyb3dzKQogICAgY2xhc3NpZmllZF9jb3VudCA9IDAKICAgIHNraXBwZWRfY291bnQgPSAwCgogICAgZm9yIHJvdyBpbiByb3dzOgogICAgICAgIGNhcmRfaWQgPSByb3dbImlkIl0KICAgICAgICBleGlzdGluZ19jYXRzID0gcm93WyJjYXRlZ29yeSJdIG9yICJbXSIKCiAgICAgICAgIyBQYXJzZSBleGlzdGluZyBjYXRlZ29yaWVzCiAgICAgICAgdHJ5OgogICAgICAgICAgICBjYXRzID0ganNvbi5sb2FkcyhleGlzdGluZ19jYXRzKQogICAgICAgIGV4Y2VwdCBFeGNlcHRpb246CiAgICAgICAgICAgIGNhdHMgPSBbXQoKICAgICAgICAjIFNraXAgY2FyZHMgdGhhdCBhbHJlYWR5IGhhdmUgbWFudWFsbHktc2V0IGNhdGVnb3JpZXMKICAgICAgICBpZiBjYXRzOgogICAgICAgICAgICBza2lwcGVkX2NvdW50ICs9IDEKICAgICAgICAgICAgY29udGludWUKCiAgICAgICAgb3JhY2xlX3RleHQgPSByb3dbIm9yYWNsZV90ZXh0Il0gb3IgIiIKICAgICAgICB0eXBlX2xpbmUgPSByb3dbInR5cGVfbGluZSJdIG9yICIiCiAgICAgICAga2V5d29yZHMgPSByb3dbImtleXdvcmRzIl0gb3IgIltdIgoKICAgICAgICByb2xlcyA9IF9kZXRlY3RfY2FyZF9yb2xlcyhvcmFjbGVfdGV4dCwgdHlwZV9saW5lLCBrZXl3b3JkcykKCiAgICAgICAgaWYgcm9sZXM6CiAgICAgICAgICAgIGNvbm4uZXhlY3V0ZSgKICAgICAgICAgICAgICAgICJVUERBVEUgY29sbGVjdGlvbl9lbnRyaWVzIFNFVCBjYXRlZ29yeSA9ID8sIHVwZGF0ZWRfYXQgPSBkYXRldGltZSgnbm93JykgV0hFUkUgaWQgPSA/IiwKICAgICAgICAgICAgICAgIChqc29uLmR1bXBzKHJvbGVzKSwgY2FyZF9pZCksCiAgICAgICAgICAgICkKICAgICAgICAgICAgY2xhc3NpZmllZF9jb3VudCArPSAxCgogICAgY29ubi5jb21taXQoKQoKICAgIHJldHVybiB7CiAgICAgICAgInRvdGFsIjogdG90YWwsCiAgICAgICAgImNsYXNzaWZpZWRDb3VudCI6IGNsYXNzaWZpZWRfY291bnQsCiAgICAgICAgInNraXBwZWRDb3VudCI6IHNraXBwZWRfY291bnQsCiAgICAgICAgIm1lc3NhZ2UiOiBmIkNsYXNzaWZpZWQge2NsYXNzaWZpZWRfY291bnR9IGNhcmRzLCBza2lwcGVkIHtza2lwcGVkX2NvdW50fSAoYWxyZWFkeSBoYWQgY2F0ZWdvcmllcykiLAogICAgfQoKCkBhcHAucG9zdCgiL2FwaS9jb2xsZWN0aW9uL2F1dG8tY2xhc3NpZnktYWxsIikKYXN5bmMgZGVmIGF1dG9fY2xhc3NpZnlfYWxsX2NvbGxlY3Rpb24oKToKICAgICIiIgogICAgRm9yY2UgcmUtY2xhc3NpZnkgQUxMIGNvbGxlY3Rpb24gZW50cmllcywgb3ZlcndyaXRpbmcgZXhpc3RpbmcgY2F0ZWdvcmllcy4KICAgICIiIgogICAgY29ubiA9IF9nZXRfZGJfY29ubigpCiAgICByb3dzID0gY29ubi5leGVjdXRlKAogICAgICAgICJTRUxFQ1QgaWQsIG9yYWNsZV90ZXh0LCB0eXBlX2xpbmUsIGtleXdvcmRzIEZST00gY29sbGVjdGlvbl9lbnRyaWVzIE9SREVSIEJZIGlkIgogICAgKS5mZXRjaGFsbCgpCgogICAgdG90YWwgPSBsZW4ocm93cykKICAgIGNsYXNzaWZpZWRfY291bnQgPSAwCgogICAgZm9yIHJvdyBpbiByb3dzOgogICAgICAgIGNhcmRfaWQgPSByb3dbImlkIl0KICAgICAgICBvcmFjbGVfdGV4dCA9IHJvd1sib3JhY2xlX3RleHQiXSBvciAiIgogICAgICAgIHR5cGVfbGluZSA9IHJvd1sidHlwZV9saW5lIl0gb3IgIiIKICAgICAgICBrZXl3b3JkcyA9IHJvd1sia2V5d29yZHMiXSBvciAiW10iCgogICAgICAgIHJvbGVzID0gX2RldGVjdF9jYXJkX3JvbGVzKG9yYWNsZV90ZXh0LCB0eXBlX2xpbmUsIGtleXdvcmRzKQogICAgICAgIGNvbm4uZXhlY3V0ZSgKICAgICAgICAgICAgIlVQREFURSBjb2xsZWN0aW9uX2VudHJpZXMgU0VUIGNhdGVnb3J5ID0gPywgdXBkYXRlZF9hdCA9IGRhdGV0aW1lKCdub3cnKSBXSEVSRSBpZCA9ID8iLAogICAgICAgICAgICAoanNvbi5kdW1wcyhyb2xlcyksIGNhcmRfaWQpLAogICAgICAgICkKICAgICAgICBjbGFzc2lmaWVkX2NvdW50ICs9IDEKCiAgICBjb25uLmNvbW1pdCgpCgogICAgcmV0dXJuIHsKICAgICAgICAidG90YWwiOiB0b3RhbCwKICAgICAgICAiY2xhc3NpZmllZENvdW50IjogY2xhc3NpZmllZF9jb3VudCwKICAgICAgICAibWVzc2FnZSI6IGYiUmUtY2xhc3NpZmllZCBhbGwge2NsYXNzaWZpZWRfY291bnR9IGNhcmRzIiwKICAgIH0KCgojIOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkAojIEVESFJFQyBSZWNvbW1lbmRhdGlvbnMgQ2FjaGUgKyBFbmRwb2ludAojIOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkAoKIyBTaW1wbGUgaW4tbWVtb3J5IGNhY2hlOiB7Y2FjaGVfa2V5OiB7ImRhdGEiOiAuLi4sICJleHBpcmVzIjogZmxvYXR9fQpfZWRocmVjX2NhY2hlOiBkaWN0ID0ge30KX0VESFJFQ19UVEwgPSAzNjAwICAjIDEgaG91cgoKCmRlZiBfZWRocmVjX2NhY2hlX2dldChrZXk6IHN0cik6CiAgICBlbnRyeSA9IF9lZGhyZWNfY2FjaGUuZ2V0KGtleSkKICAgIGlmIGVudHJ5IGFuZCB0aW1lLm1vbm90b25pYygpIDwgZW50cnlbImV4cGlyZXMiXToKICAgICAgICByZXR1cm4gZW50cnlbImRhdGEiXQogICAgcmV0dXJuIE5vbmUKCgpkZWYgX2VkaHJlY19jYWNoZV9zZXQoa2V5OiBzdHIsIGRhdGEpOgogICAgX2VkaHJlY19jYWNoZVtrZXldID0geyJkYXRhIjogZGF0YSwgImV4cGlyZXMiOiB0aW1lLm1vbm90b25pYygpICsgX0VESFJFQ19UVEx9CgoKQGFwcC5nZXQoIi9hcGkvY29sbGVjdGlvbi97Y2FyZElkfS9lZGhyZWMiKQphc3luYyBkZWYgZ2V0X2NhcmRfZWRocmVjKGNhcmRJZDogaW50KToKICAgICIiIgogICAgR2V0IEVESFJFQyByZWNvbW1lbmRhdGlvbnMgZm9yIGEgY29sbGVjdGlvbiBjYXJkLgogICAgRm9yIGxlZ2VuZGFyeSBjcmVhdHVyZXMgKHBvdGVudGlhbCBjb21tYW5kZXJzKTogZmV0Y2ggY29tbWFuZGVyIHN5bmVyZ3kgZGF0YS4KICAgIEZvciBvdGhlciBjYXJkczogZmV0Y2ggJ2Fsc28gcGxheWVkIHdpdGgnIGRhdGEuCiAgICAiIiIKICAgIGNvbm4gPSBfZ2V0X2RiX2Nvbm4oKQogICAgcm93ID0gY29ubi5leGVjdXRlKCJTRUxFQ1QgKiBGUk9NIGNvbGxlY3Rpb25fZW50cmllcyBXSEVSRSBpZCA9ID8iLCAoY2FyZElkLCkpLmZldGNob25lKCkKICAgIGlmIG5vdCByb3c6CiAgICAgICAgcmFpc2UgSFRUUEV4Y2VwdGlvbig0MDQsIGYiQ2FyZCB3aXRoIGlkIHtjYXJkSWR9IG5vdCBmb3VuZCIpCgogICAgY2FyZCA9IF9yb3dfdG9fZGljdChyb3cpCiAgICBuYW1lID0gY2FyZFsibmFtZSJdCiAgICB0eXBlX2xpbmUgPSBjYXJkLmdldCgidHlwZV9saW5lIiwgIiIpCiAgICBpc19sZWdlbmRhcnkgPSBjYXJkLmdldCgiaXNfbGVnZW5kYXJ5IiwgMCkKCiAgICAjIERldGVybWluZSBpZiBpdCdzIGEgbGVnZW5kYXJ5IGNyZWF0dXJlIChwb3RlbnRpYWwgY29tbWFuZGVyKQogICAgaXNfY29tbWFuZGVyID0gYm9vbCgKICAgICAgICBpc19sZWdlbmRhcnkgYW5kCiAgICAgICAgcmUuc2VhcmNoKHIiXGJDcmVhdHVyZVxiIiwgdHlwZV9saW5lLCByZS5JR05PUkVDQVNFKQogICAgKQoKICAgIHNsdWcgPSBfdG9fZWRocmVjX3NsdWcobmFtZSkKICAgIGNhY2hlX2tleSA9IGYiZWRocmVjOnsnY21kJyBpZiBpc19jb21tYW5kZXIgZWxzZSAnY2FyZCd9OntzbHVnfSIKCiAgICBjYWNoZWQgPSBfZWRocmVjX2NhY2hlX2dldChjYWNoZV9rZXkpCiAgICBpZiBjYWNoZWQ6CiAgICAgICAgcmV0dXJuIGNhY2hlZAoKICAgIHJlY29tbWVuZGF0aW9ucyA9IFtdCiAgICBsaW5rcyA9IHsKICAgICAgICAiZWRocmVjUGFnZSI6ICgKICAgICAgICAgICAgZiJodHRwczovL2VkaHJlYy5jb20vY29tbWFuZGVycy97c2x1Z30iCiAgICAgICAgICAgIGlmIGlzX2NvbW1hbmRlcgogICAgICAgICAgICBlbHNlIGYiaHR0cHM6Ly9lZGhyZWMuY29tL2NhcmRzL3tzbHVnfSIKICAgICAgICApLAogICAgICAgICJhcmNoaWRla3RTZWFyY2giOiBmImh0dHBzOi8vYXJjaGlkZWt0LmNvbS9zZWFyY2gvY2FyZHM/cT17bmFtZS5yZXBsYWNlKCcgJywgJysnKX0iLAogICAgICAgICJtb3hmaWVsZFNlYXJjaCI6IGYiaHR0cHM6Ly93d3cubW94ZmllbGQuY29tL3NlYXJjaD9xPXtuYW1lLnJlcGxhY2UoJyAnLCAnKycpfSIsCiAgICB9CgogICAgdHJ5OgogICAgICAgIGlmIGlzX2NvbW1hbmRlcjoKICAgICAgICAgICAgdXJsID0gZiJodHRwczovL2pzb24uZWRocmVjLmNvbS9wYWdlcy9jb21tYW5kZXJzL3tzbHVnfS5qc29uIgogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHVybCA9IGYiaHR0cHM6Ly9qc29uLmVkaHJlYy5jb20vcGFnZXMvY2FyZHMve3NsdWd9Lmpzb24iCgogICAgICAgIHJlcSA9IFJlcXVlc3QodXJsLCBoZWFkZXJzPV9BUElfSEVBREVSUykKICAgICAgICB3aXRoIHVybG9wZW4ocmVxLCB0aW1lb3V0PTEwKSBhcyByZXNwOgogICAgICAgICAgICBkYXRhID0ganNvbi5sb2FkcyhyZXNwLnJlYWQoKS5kZWNvZGUoInV0Zi04IikpCgogICAgICAgIGlmIGlzX2NvbW1hbmRlcjoKICAgICAgICAgICAgIyBFeHRyYWN0IHRvcCBjYXJkcyBmcm9tIGNhcmRsaXN0cwogICAgICAgICAgICBjb250YWluZXIgPSBkYXRhLmdldCgiY29udGFpbmVyIiwge30pCiAgICAgICAgICAgIGpzb25fZGljdCA9IGNvbnRhaW5lci5nZXQoImpzb25fZGljdCIsIHt9KQogICAgICAgICAgICBmb3IgY2FyZGxpc3QgaW4ganNvbl9kaWN0LmdldCgiY2FyZGxpc3RzIiwgW10pOgogICAgICAgICAgICAgICAgdGFnID0gY2FyZGxpc3QuZ2V0KCJ0YWciLCAiIikKICAgICAgICAgICAgICAgIGZvciBjdiBpbiBjYXJkbGlzdC5nZXQoImNhcmR2aWV3cyIsIFtdKVs6MTBdOgogICAgICAgICAgICAgICAgICAgIHJlY19uYW1lID0gY3YuZ2V0KCJuYW1lIiwgIiIpCiAgICAgICAgICAgICAgICAgICAgaWYgbm90IHJlY19uYW1lOgogICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZQogICAgICAgICAgICAgICAgICAgIHN5bmVyZ3kgPSBjdi5nZXQoInN5bmVyZ3kiLCAwLjApCiAgICAgICAgICAgICAgICAgICAgcmVjb21tZW5kYXRpb25zLmFwcGVuZCh7CiAgICAgICAgICAgICAgICAgICAgICAgICJuYW1lIjogcmVjX25hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICJzeW5lcmd5Ijogc3luZXJneSwKICAgICAgICAgICAgICAgICAgICAgICAgInJvbGUiOiB0YWcgb3IgIlJlY29tbWVuZGVkIiwKICAgICAgICAgICAgICAgICAgICB9KQogICAgICAgIGVsc2U6CiAgICAgICAgICAgICMgRXh0cmFjdCAiYWxzbyBwbGF5ZWQgd2l0aCIgY2FyZHMKICAgICAgICAgICAgY29udGFpbmVyID0gZGF0YS5nZXQoImNvbnRhaW5lciIsIHt9KQogICAgICAgICAgICBqc29uX2RpY3QgPSBjb250YWluZXIuZ2V0KCJqc29uX2RpY3QiLCB7fSkKICAgICAgICAgICAgZm9yIGNhcmRsaXN0IGluIGpzb25fZGljdC5nZXQoImNhcmRsaXN0cyIsIFtdKToKICAgICAgICAgICAgICAgIHRhZyA9IGNhcmRsaXN0LmdldCgidGFnIiwgIiIpCiAgICAgICAgICAgICAgICBmb3IgY3YgaW4gY2FyZGxpc3QuZ2V0KCJjYXJkdmlld3MiLCBbXSlbOjEwXToKICAgICAgICAgICAgICAgICAgICByZWNfbmFtZSA9IGN2LmdldCgibmFtZSIsICIiKQogICAgICAgICAgICAgICAgICAgIGlmIG5vdCByZWNfbmFtZToKICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWUKICAgICAgICAgICAgICAgICAgICBzeW5lcmd5ID0gY3YuZ2V0KCJzeW5lcmd5IiwgMC4wKQogICAgICAgICAgICAgICAgICAgIHJlY29tbWVuZGF0aW9ucy5hcHBlbmQoewogICAgICAgICAgICAgICAgICAgICAgICAibmFtZSI6IHJlY19uYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAic3luZXJneSI6IHN5bmVyZ3ksCiAgICAgICAgICAgICAgICAgICAgICAgICJyb2xlIjogdGFnIG9yICJBbHNvIFBsYXllZCBXaXRoIiwKICAgICAgICAgICAgICAgICAgICB9KQoKICAgIGV4Y2VwdCBFeGNlcHRpb24gYXMgZToKICAgICAgICBsb2dfZGVja2dlbi5lcnJvcihmIiAgRXJyb3IgZmV0Y2hpbmcgZGF0YSBmb3IgJ3tuYW1lfSc6IHtlfSIpCiAgICAgICAgIyBHcmFjZWZ1bCBkZWdyYWRhdGlvbiDigJQgcmV0dXJuIGVtcHR5IHJlc3VsdHMKCiAgICByZXN1bHQgPSB7CiAgICAgICAgInJlY29tbWVuZGF0aW9ucyI6IHJlY29tbWVuZGF0aW9uc1s6MzBdLAogICAgICAgICJsaW5rcyI6IGxpbmtzLAogICAgfQogICAgX2VkaHJlY19jYWNoZV9zZXQoY2FjaGVfa2V5LCByZXN1bHQpCiAgICByZXR1cm4gcmVzdWx0CgoKIyDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZAKIyBDb21tYW5kZXIgTWV0YSBNYXBwaW5nIChsb2FkZWQgYXQgc3RhcnR1cCkKIyDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZAKCkJVSUxUSU5fQ09NTUFOREVSUyA9IHsKICAgICJFZGdhciBNYXJrb3YiOiBbeyJzb3VyY2UiOiAiZWRocmVjIiwgImFyY2hldHlwZSI6ICJhZ2dybyIsICJjb2xvcklkZW50aXR5IjogWyJXIiwiQiIsIlIiXX1dLAogICAgIkF0cmF4YSwgUHJhZXRvcnMnIFZvaWNlIjogW3sic291cmNlIjogImVkaHJlYyIsICJhcmNoZXR5cGUiOiAibWlkcmFuZ2UiLCAiY29sb3JJZGVudGl0eSI6IFsiVyIsIlUiLCJCIiwiRyJdfV0sCiAgICAiS29ydm9sZCwgRmFlLUN1cnNlZCBLaW5nIjogW3sic291cmNlIjogImVkaHJlYyIsICJhcmNoZXR5cGUiOiAiY29tYm8iLCAiY29sb3JJZGVudGl0eSI6IFsiQiIsIlIiLCJHIl19XSwKICAgICJNdWxkcm90aGEsIHRoZSBHcmF2ZXRpZGUiOiBbeyJzb3VyY2UiOiAiZWRocmVjIiwgImFyY2hldHlwZSI6ICJtaWRyYW5nZSIsICJjb2xvcklkZW50aXR5IjogWyJVIiwiQiIsIkciXX1dLAogICAgIlRoZSBVci1EcmFnb24iOiBbeyJzb3VyY2UiOiAiZWRocmVjIiwgImFyY2hldHlwZSI6ICJtaWRyYW5nZSIsICJjb2xvcklkZW50aXR5IjogWyJXIiwiVSIsIkIiLCJSIiwiRyJdfV0sCiAgICAiWXVyaWtvLCB0aGUgVGlnZXIncyBTaGFkb3ciOiBbeyJzb3VyY2UiOiAiZWRocmVjIiwgImFyY2hldHlwZSI6ICJhZ2dybyIsICJjb2xvcklkZW50aXR5IjogWyJVIiwiQiJdfV0sCiAgICAiS3JlbmtvLCBNb2IgQm9zcyI6IFt7InNvdXJjZSI6ICJlZGhyZWMiLCAiYXJjaGV0eXBlIjogImFnZ3JvIiwgImNvbG9ySWRlbnRpdHkiOiBbIlIiXX1dLAogICAgIk1lcmVuIG9mIENsYW4gTmVsIFRvdGgiOiBbeyJzb3VyY2UiOiAiZWRocmVjIiwgImFyY2hldHlwZSI6ICJtaWRyYW5nZSIsICJjb2xvcklkZW50aXR5IjogWyJCIiwiRyJdfV0sCiAgICAiUHJvc3NoLCBTa3lyYWlkZXIgb2YgS2hlciI6IFt7InNvdXJjZSI6ICJlZGhyZWMiLCAiYXJjaGV0eXBlIjogImNvbWJvIiwgImNvbG9ySWRlbnRpdHkiOiBbIkIiLCJSIiwiRyJdfV0sCiAgICAiS2FhbGlhIG9mIHRoZSBWYXN0IjogW3sic291cmNlIjogImVkaHJlYyIsICJhcmNoZXR5cGUiOiAiYWdncm8iLCAiY29sb3JJZGVudGl0eSI6IFsiVyIsIkIiLCJSIl19XSwKICAgICJUYWxyYW5kLCBTa3kgU3VtbW9uZXIiOiBbeyJzb3VyY2UiOiAiZWRocmVjIiwgImFyY2hldHlwZSI6ICJjb250cm9sIiwgImNvbG9ySWRlbnRpdHkiOiBbIlUiXX1dLAogICAgIk9tbmF0aCwgTG9jdXMgb2YgQ3JlYXRpb24iOiBbeyJzb3VyY2UiOiAiZWRocmVjIiwgImFyY2hldHlwZSI6ICJjb21ibyIsICJjb2xvcklkZW50aXR5IjogWyJXIiwiVSIsIlIiLCJHIl19XSwKICAgICJUZXlzYSBLYXJsb3YiOiBbeyJzb3VyY2UiOiAiZWRocmVjIiwgImFyY2hldHlwZSI6ICJjb21ibyIsICJjb2xvcklkZW50aXR5IjogWyJXIiwiQiJdfV0sCiAgICAiTGF0aHJpbCwgQmxhZGUgb2YgdGhlIEVsdmVzIjogW3sic291cmNlIjogImVkaHJlYyIsICJhcmNoZXR5cGUiOiAiYWdncm8iLCAiY29sb3JJZGVudGl0eSI6IFsiQiIsIkciXX1dLAogICAgIkJyZXlhLCBFdGhlcml1bSBTaGFwZXIiOiBbeyJzb3VyY2UiOiAiZWRocmVjIiwgImFyY2hldHlwZSI6ICJjb21ibyIsICJjb2xvcklkZW50aXR5IjogWyJXIiwiVSIsIkIiLCJSIl19XSwKfQoKCiMg4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQCiMgUHl0aG9uIFNpbXVsYXRvciBBUEkKIyDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZAKCmltcG9ydCB0aHJlYWRpbmcgYXMgX3RocmVhZGluZwppbXBvcnQgdXVpZCBhcyBfdXVpZAoKIyBJbi1tZW1vcnkgc3RvcmUgZm9yIHNpbXVsYXRpb24gcnVucwpfc2ltX3J1bnMgPSB7fSAgIyBzaW1faWQgLT4geyBzdGF0dXMsIHJlc3VsdCwgZXJyb3IgfQpfc2ltX2xvY2sgPSBfdGhyZWFkaW5nLkxvY2soKQoKCmRlZiBfcnVuX3NpbV90aHJlYWRfdjIoc2ltX2lkOiBzdHIsIGNhcmRfZGF0YTogbGlzdFtkaWN0XSwgbnVtX2dhbWVzOiBpbnQsIGRlY2tfbmFtZTogc3RyLCByZWNvcmRfbG9nczogYm9vbCk6CiAgICAiIiJCYWNrZ3JvdW5kIHRocmVhZCBmb3Igc2ltdWxhdGlvbnMgd2l0aCBmdWxsIGNhcmQgZGF0YSBmcm9tIHRoZSBEQi4iIiIKICAgIHRyeToKICAgICAgICBpbXBvcnQgc3lzLCBvcwogICAgICAgIHNyY19kaXIgPSBvcy5wYXRoLmpvaW4ob3MucGF0aC5kaXJuYW1lKG9zLnBhdGguYWJzcGF0aChfX2ZpbGVfXykpLCAnc3JjJykKICAgICAgICBpZiBzcmNfZGlyIG5vdCBpbiBzeXMucGF0aDoKICAgICAgICAgICAgc3lzLnBhdGguaW5zZXJ0KDAsIHNyY19kaXIpCgogICAgICAgIGZyb20gY29tbWFuZGVyX2FpX2xhYi5zaW0ubW9kZWxzIGltcG9ydCBDYXJkCiAgICAgICAgZnJvbSBjb21tYW5kZXJfYWlfbGFiLnNpbS5lbmdpbmUgaW1wb3J0IEdhbWVFbmdpbmUKICAgICAgICBmcm9tIGNvbW1hbmRlcl9haV9sYWIuc2ltLnJ1bGVzIGltcG9ydCBlbnJpY2hfY2FyZAogICAgICAgIGZyb20gY29tbWFuZGVyX2FpX2xhYi5sYWIuZXhwZXJpbWVudHMgaW1wb3J0IF9nZW5lcmF0ZV90cmFpbmluZ19kZWNrCgogICAgICAgIHdpdGggX3NpbV9sb2NrOgogICAgICAgICAgICBfc2ltX3J1bnNbc2ltX2lkXVsnc3RhdHVzJ10gPSAncnVubmluZycKCiAgICAgICAgIyBCdWlsZCBkZWNrIHdpdGggcmVhbCBjYXJkIGRhdGEgZnJvbSBEQgogICAgICAgIGRlY2tfYSA9IFtdCiAgICAgICAgZm9yIGNkIGluIGNhcmRfZGF0YToKICAgICAgICAgICAgYyA9IENhcmQobmFtZT1jZFsnbmFtZSddKQogICAgICAgICAgICBpZiBjZC5nZXQoJ3R5cGVfbGluZScpOgogICAgICAgICAgICAgICAgYy50eXBlX2xpbmUgPSBjZFsndHlwZV9saW5lJ10KICAgICAgICAgICAgaWYgY2QuZ2V0KCdjbWMnKToKICAgICAgICAgICAgICAgIGMuY21jID0gZmxvYXQoY2RbJ2NtYyddKQogICAgICAgICAgICBpZiBjZC5nZXQoJ3Bvd2VyJykgYW5kIGNkLmdldCgndG91Z2huZXNzJyk6CiAgICAgICAgICAgICAgICBjLnBvd2VyID0gc3RyKGNkWydwb3dlciddKQogICAgICAgICAgICAgICAgYy50b3VnaG5lc3MgPSBzdHIoY2RbJ3RvdWdobmVzcyddKQogICAgICAgICAgICAgICAgYy5wdCA9IGMucG93ZXIgKyAnLycgKyBjLnRvdWdobmVzcwogICAgICAgICAgICBpZiBjZC5nZXQoJ29yYWNsZV90ZXh0Jyk6CiAgICAgICAgICAgICAgICBjLm9yYWNsZV90ZXh0ID0gY2RbJ29yYWNsZV90ZXh0J10KICAgICAgICAgICAgaWYgY2QuZ2V0KCdtYW5hX2Nvc3QnKToKICAgICAgICAgICAgICAgIGMubWFuYV9jb3N0ID0gY2RbJ21hbmFfY29zdCddCiAgICAgICAgICAgIGlmIGNkLmdldCgna2V5d29yZHMnKToKICAgICAgICAgICAgICAgIGt3ID0gY2RbJ2tleXdvcmRzJ10KICAgICAgICAgICAgICAgIGlmIGlzaW5zdGFuY2Uoa3csIHN0cik6CiAgICAgICAgICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgICAgICAgICBpbXBvcnQganNvbiBhcyBfanNvbgogICAgICAgICAgICAgICAgICAgICAgICBrdyA9IF9qc29uLmxvYWRzKGt3KQogICAgICAgICAgICAgICAgICAgIGV4Y2VwdCBFeGNlcHRpb246CiAgICAgICAgICAgICAgICAgICAgICAgIGt3ID0gW10KICAgICAgICAgICAgICAgIGlmIGlzaW5zdGFuY2Uoa3csIGxpc3QpOgogICAgICAgICAgICAgICAgICAgIGMua2V5d29yZHMgPSBrdwogICAgICAgICAgICAjIEVucmljaCBmaWxscyBpbiBmbGFncyBsaWtlIGlzX3JlbW92YWwsIGlzX3JhbXAsIGlzX2JvYXJkX3dpcGUKICAgICAgICAgICAgZW5yaWNoX2NhcmQoYykKICAgICAgICAgICAgZGVja19hLmFwcGVuZChjKQoKICAgICAgICBkZWNrX2IgPSBfZ2VuZXJhdGVfdHJhaW5pbmdfZGVjaygpCgogICAgICAgIGVuZ2luZSA9IEdhbWVFbmdpbmUobWF4X3R1cm5zPTI1LCByZWNvcmRfbG9nPXJlY29yZF9sb2dzKQogICAgICAgIGltcG9ydCB0aW1lCiAgICAgICAgc3RhcnQgPSB0aW1lLnRpbWUoKQoKICAgICAgICB3aW5zID0gMAogICAgICAgIGxvc3NlcyA9IDAKICAgICAgICB0b3RhbF90dXJucyA9IDAKICAgICAgICB0b3RhbF9kYW1hZ2VfZGVhbHQgPSAwCiAgICAgICAgdG90YWxfZGFtYWdlX3JlY2VpdmVkID0gMAogICAgICAgIHRvdGFsX3NwZWxsc19jYXN0ID0gMAogICAgICAgIHRvdGFsX2NyZWF0dXJlc19wbGF5ZWQgPSAwCiAgICAgICAgdG90YWxfcmVtb3ZhbF91c2VkID0gMAogICAgICAgIHRvdGFsX3JhbXBfcGxheWVkID0gMAogICAgICAgIHRvdGFsX2NhcmRzX2RyYXduID0gMAogICAgICAgIHRvdGFsX21heF9ib2FyZCA9IDAKICAgICAgICBnYW1lX3Jlc3VsdHMgPSBbXQoKICAgICAgICBmb3IgaSBpbiByYW5nZShudW1fZ2FtZXMpOgogICAgICAgICAgICByZXN1bHQgPSBlbmdpbmUucnVuKGRlY2tfYSwgZGVja19iLCBuYW1lX2E9ZGVja19uYW1lLCBuYW1lX2I9IlRyYWluaW5nIERlY2siKQoKICAgICAgICAgICAgZ2FtZV9kYXRhID0gcmVzdWx0LnRvX2RpY3QoKQogICAgICAgICAgICBnYW1lX2RhdGFbJ2dhbWVOdW1iZXInXSA9IGkgKyAxCiAgICAgICAgICAgIGdhbWVfcmVzdWx0cy5hcHBlbmQoZ2FtZV9kYXRhKQoKICAgICAgICAgICAgaWYgcmVzdWx0Lndpbm5lciA9PSAwOgogICAgICAgICAgICAgICAgd2lucyArPSAxCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBsb3NzZXMgKz0gMQoKICAgICAgICAgICAgdG90YWxfdHVybnMgKz0gcmVzdWx0LnR1cm5zCiAgICAgICAgICAgIGlmIHJlc3VsdC5wbGF5ZXJfYV9zdGF0czoKICAgICAgICAgICAgICAgIHRvdGFsX2RhbWFnZV9kZWFsdCArPSByZXN1bHQucGxheWVyX2Ffc3RhdHMuZGFtYWdlX2RlYWx0CiAgICAgICAgICAgICAgICB0b3RhbF9kYW1hZ2VfcmVjZWl2ZWQgKz0gcmVzdWx0LnBsYXllcl9hX3N0YXRzLmRhbWFnZV9yZWNlaXZlZAogICAgICAgICAgICAgICAgdG90YWxfc3BlbGxzX2Nhc3QgKz0gcmVzdWx0LnBsYXllcl9hX3N0YXRzLnNwZWxsc19jYXN0CiAgICAgICAgICAgICAgICB0b3RhbF9jcmVhdHVyZXNfcGxheWVkICs9IHJlc3VsdC5wbGF5ZXJfYV9zdGF0cy5jcmVhdHVyZXNfcGxheWVkCiAgICAgICAgICAgICAgICB0b3RhbF9yZW1vdmFsX3VzZWQgKz0gcmVzdWx0LnBsYXllcl9hX3N0YXRzLnJlbW92YWxfdXNlZAogICAgICAgICAgICAgICAgdG90YWxfcmFtcF9wbGF5ZWQgKz0gcmVzdWx0LnBsYXllcl9hX3N0YXRzLnJhbXBfcGxheWVkCiAgICAgICAgICAgICAgICB0b3RhbF9jYXJkc19kcmF3biArPSByZXN1bHQucGxheWVyX2Ffc3RhdHMuY2FyZHNfZHJhd24KICAgICAgICAgICAgICAgIHRvdGFsX21heF9ib2FyZCArPSByZXN1bHQucGxheWVyX2Ffc3RhdHMubWF4X2JvYXJkX3NpemUKCiAgICAgICAgICAgIHdpdGggX3NpbV9sb2NrOgogICAgICAgICAgICAgICAgX3NpbV9ydW5zW3NpbV9pZF1bJ2NvbXBsZXRlZCddID0gaSArIDEKCiAgICAgICAgZWxhcHNlZCA9IHRpbWUudGltZSgpIC0gc3RhcnQKICAgICAgICBuID0gbnVtX2dhbWVzCgogICAgICAgIHN1bW1hcnkgPSB7CiAgICAgICAgICAgICdkZWNrTmFtZSc6IGRlY2tfbmFtZSwKICAgICAgICAgICAgJ29wcG9uZW50TmFtZSc6ICdUcmFpbmluZyBEZWNrJywKICAgICAgICAgICAgJ3RvdGFsR2FtZXMnOiBuLAogICAgICAgICAgICAnd2lucyc6IHdpbnMsCiAgICAgICAgICAgICdsb3NzZXMnOiBsb3NzZXMsCiAgICAgICAgICAgICd3aW5SYXRlJzogcm91bmQod2lucyAvIG4gKiAxMDAsIDEpIGlmIG4gPiAwIGVsc2UgMC4wLAogICAgICAgICAgICAnYXZnVHVybnMnOiByb3VuZCh0b3RhbF90dXJucyAvIG4sIDEpIGlmIG4gPiAwIGVsc2UgMC4wLAogICAgICAgICAgICAnYXZnRGFtYWdlRGVhbHQnOiByb3VuZCh0b3RhbF9kYW1hZ2VfZGVhbHQgLyBuLCAxKSBpZiBuID4gMCBlbHNlIDAuMCwKICAgICAgICAgICAgJ2F2Z0RhbWFnZVJlY2VpdmVkJzogcm91bmQodG90YWxfZGFtYWdlX3JlY2VpdmVkIC8gbiwgMSkgaWYgbiA+IDAgZWxzZSAwLjAsCiAgICAgICAgICAgICdhdmdTcGVsbHNDYXN0Jzogcm91bmQodG90YWxfc3BlbGxzX2Nhc3QgLyBuLCAxKSBpZiBuID4gMCBlbHNlIDAuMCwKICAgICAgICAgICAgJ2F2Z0NyZWF0dXJlc1BsYXllZCc6IHJvdW5kKHRvdGFsX2NyZWF0dXJlc19wbGF5ZWQgLyBuLCAxKSBpZiBuID4gMCBlbHNlIDAuMCwKICAgICAgICAgICAgJ2F2Z1JlbW92YWxVc2VkJzogcm91bmQodG90YWxfcmVtb3ZhbF91c2VkIC8gbiwgMSkgaWYgbiA+IDAgZWxzZSAwLjAsCiAgICAgICAgICAgICdhdmdSYW1wUGxheWVkJzogcm91bmQodG90YWxfcmFtcF9wbGF5ZWQgLyBuLCAxKSBpZiBuID4gMCBlbHNlIDAuMCwKICAgICAgICAgICAgJ2F2Z0NhcmRzRHJhd24nOiByb3VuZCh0b3RhbF9jYXJkc19kcmF3biAvIG4sIDEpIGlmIG4gPiAwIGVsc2UgMC4wLAogICAgICAgICAgICAnYXZnTWF4Qm9hcmRTaXplJzogcm91bmQodG90YWxfbWF4X2JvYXJkIC8gbiwgMSkgaWYgbiA+IDAgZWxzZSAwLjAsCiAgICAgICAgICAgICdlbGFwc2VkU2Vjb25kcyc6IHJvdW5kKGVsYXBzZWQsIDMpLAogICAgICAgIH0KCiAgICAgICAgd2l0aCBfc2ltX2xvY2s6CiAgICAgICAgICAgIF9zaW1fcnVuc1tzaW1faWRdWydzdGF0dXMnXSA9ICdjb21wbGV0ZScKICAgICAgICAgICAgX3NpbV9ydW5zW3NpbV9pZF1bJ3Jlc3VsdCddID0gewogICAgICAgICAgICAgICAgJ3N1bW1hcnknOiBzdW1tYXJ5LAogICAgICAgICAgICAgICAgJ2dhbWVzJzogZ2FtZV9yZXN1bHRzLAogICAgICAgICAgICB9CiAgICBleGNlcHQgRXhjZXB0aW9uIGFzIGU6CiAgICAgICAgaW1wb3J0IHRyYWNlYmFjawogICAgICAgIHdpdGggX3NpbV9sb2NrOgogICAgICAgICAgICBfc2ltX3J1bnNbc2ltX2lkXVsnc3RhdHVzJ10gPSAnZXJyb3InCiAgICAgICAgICAgIF9zaW1fcnVuc1tzaW1faWRdWydlcnJvciddID0gc3RyKGUpCiAgICAgICAgdHJhY2ViYWNrLnByaW50X2V4YygpCgoKZGVmIF9ydW5fc2ltX3RocmVhZChzaW1faWQ6IHN0ciwgZGVja2xpc3Q6IGxpc3QsIG51bV9nYW1lczogaW50LCBkZWNrX25hbWU6IHN0ciwgcmVjb3JkX2xvZ3M6IGJvb2wpOgogICAgIiIiQmFja2dyb3VuZCB0aHJlYWQgZm9yIHJ1bm5pbmcgTW9udGUgQ2FybG8gc2ltdWxhdGlvbnMuIiIiCiAgICB0cnk6CiAgICAgICAgaW1wb3J0IHN5cywgb3MKICAgICAgICAjIEFkZCBzcmMvIHRvIHBhdGggaWYgbmVlZGVkIGZvciB0aGUgc2ltdWxhdG9yIHBhY2thZ2UKICAgICAgICBzcmNfZGlyID0gb3MucGF0aC5qb2luKG9zLnBhdGguZGlybmFtZShvcy5wYXRoLmFic3BhdGgoX19maWxlX18pKSwgJ3NyYycpCiAgICAgICAgaWYgc3JjX2RpciBub3QgaW4gc3lzLnBhdGg6CiAgICAgICAgICAgIHN5cy5wYXRoLmluc2VydCgwLCBzcmNfZGlyKQoKICAgICAgICBmcm9tIGNvbW1hbmRlcl9haV9sYWIuc2ltLm1vZGVscyBpbXBvcnQgQ2FyZAogICAgICAgIGZyb20gY29tbWFuZGVyX2FpX2xhYi5zaW0uZW5naW5lIGltcG9ydCBHYW1lRW5naW5lCiAgICAgICAgZnJvbSBjb21tYW5kZXJfYWlfbGFiLnNpbS5ydWxlcyBpbXBvcnQgZW5yaWNoX2NhcmQsIHBhcnNlX2RlY2tsaXN0CiAgICAgICAgZnJvbSBjb21tYW5kZXJfYWlfbGFiLmxhYi5leHBlcmltZW50cyBpbXBvcnQgYnVpbGRfZGVjaywgX2dlbmVyYXRlX3RyYWluaW5nX2RlY2sKCiAgICAgICAgd2l0aCBfc2ltX2xvY2s6CiAgICAgICAgICAgIF9zaW1fcnVuc1tzaW1faWRdWydzdGF0dXMnXSA9ICdydW5uaW5nJwoKICAgICAgICBkZWNrX2EgPSBidWlsZF9kZWNrKGRlY2tsaXN0KQogICAgICAgIGRlY2tfYiA9IF9nZW5lcmF0ZV90cmFpbmluZ19kZWNrKCkKCiAgICAgICAgZW5naW5lID0gR2FtZUVuZ2luZShtYXhfdHVybnM9MjUsIHJlY29yZF9sb2c9cmVjb3JkX2xvZ3MpCiAgICAgICAgaW1wb3J0IHRpbWUKICAgICAgICBzdGFydCA9IHRpbWUudGltZSgpCgogICAgICAgIHdpbnMgPSAwCiAgICAgICAgbG9zc2VzID0gMAogICAgICAgIHRvdGFsX3R1cm5zID0gMAogICAgICAgIHRvdGFsX2RhbWFnZV9kZWFsdCA9IDAKICAgICAgICB0b3RhbF9kYW1hZ2VfcmVjZWl2ZWQgPSAwCiAgICAgICAgdG90YWxfc3BlbGxzX2Nhc3QgPSAwCiAgICAgICAgdG90YWxfY3JlYXR1cmVzX3BsYXllZCA9IDAKICAgICAgICB0b3RhbF9yZW1vdmFsX3VzZWQgPSAwCiAgICAgICAgdG90YWxfcmFtcF9wbGF5ZWQgPSAwCiAgICAgICAgdG90YWxfY2FyZHNfZHJhd24gPSAwCiAgICAgICAgdG90YWxfbWF4X2JvYXJkID0gMAogICAgICAgIGdhbWVfcmVzdWx0cyA9IFtdCgogICAgICAgIGZvciBpIGluIHJhbmdlKG51bV9nYW1lcyk6CiAgICAgICAgICAgIHJlc3VsdCA9IGVuZ2luZS5ydW4oZGVja19hLCBkZWNrX2IsIG5hbWVfYT1kZWNrX25hbWUsIG5hbWVfYj0iVHJhaW5pbmcgRGVjayIpCgogICAgICAgICAgICBnYW1lX2RhdGEgPSByZXN1bHQudG9fZGljdCgpCiAgICAgICAgICAgIGdhbWVfZGF0YVsnZ2FtZU51bWJlciddID0gaSArIDEKICAgICAgICAgICAgZ2FtZV9yZXN1bHRzLmFwcGVuZChnYW1lX2RhdGEpCgogICAgICAgICAgICBpZiByZXN1bHQud2lubmVyID09IDA6CiAgICAgICAgICAgICAgICB3aW5zICs9IDEKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIGxvc3NlcyArPSAxCgogICAgICAgICAgICB0b3RhbF90dXJucyArPSByZXN1bHQudHVybnMKICAgICAgICAgICAgaWYgcmVzdWx0LnBsYXllcl9hX3N0YXRzOgogICAgICAgICAgICAgICAgdG90YWxfZGFtYWdlX2RlYWx0ICs9IHJlc3VsdC5wbGF5ZXJfYV9zdGF0cy5kYW1hZ2VfZGVhbHQKICAgICAgICAgICAgICAgIHRvdGFsX2RhbWFnZV9yZWNlaXZlZCArPSByZXN1bHQucGxheWVyX2Ffc3RhdHMuZGFtYWdlX3JlY2VpdmVkCiAgICAgICAgICAgICAgICB0b3RhbF9zcGVsbHNfY2FzdCArPSByZXN1bHQucGxheWVyX2Ffc3RhdHMuc3BlbGxzX2Nhc3QKICAgICAgICAgICAgICAgIHRvdGFsX2NyZWF0dXJlc19wbGF5ZWQgKz0gcmVzdWx0LnBsYXllcl9hX3N0YXRzLmNyZWF0dXJlc19wbGF5ZWQKICAgICAgICAgICAgICAgIHRvdGFsX3JlbW92YWxfdXNlZCArPSByZXN1bHQucGxheWVyX2Ffc3RhdHMucmVtb3ZhbF91c2VkCiAgICAgICAgICAgICAgICB0b3RhbF9yYW1wX3BsYXllZCArPSByZXN1bHQucGxheWVyX2Ffc3RhdHMucmFtcF9wbGF5ZWQKICAgICAgICAgICAgICAgIHRvdGFsX2NhcmRzX2RyYXduICs9IHJlc3VsdC5wbGF5ZXJfYV9zdGF0cy5jYXJkc19kcmF3bgogICAgICAgICAgICAgICAgdG90YWxfbWF4X2JvYXJkICs9IHJlc3VsdC5wbGF5ZXJfYV9zdGF0cy5tYXhfYm9hcmRfc2l6ZQoKICAgICAgICAgICAgIyBVcGRhdGUgcHJvZ3Jlc3MKICAgICAgICAgICAgd2l0aCBfc2ltX2xvY2s6CiAgICAgICAgICAgICAgICBfc2ltX3J1bnNbc2ltX2lkXVsnY29tcGxldGVkJ10gPSBpICsgMQoKICAgICAgICBlbGFwc2VkID0gdGltZS50aW1lKCkgLSBzdGFydAogICAgICAgIG4gPSBudW1fZ2FtZXMKCiAgICAgICAgc3VtbWFyeSA9IHsKICAgICAgICAgICAgJ2RlY2tOYW1lJzogZGVja19uYW1lLAogICAgICAgICAgICAnb3Bwb25lbnROYW1lJzogJ1RyYWluaW5nIERlY2snLAogICAgICAgICAgICAndG90YWxHYW1lcyc6IG4sCiAgICAgICAgICAgICd3aW5zJzogd2lucywKICAgICAgICAgICAgJ2xvc3Nlcyc6IGxvc3NlcywKICAgICAgICAgICAgJ3dpblJhdGUnOiByb3VuZCh3aW5zIC8gbiAqIDEwMCwgMSkgaWYgbiA+IDAgZWxzZSAwLjAsCiAgICAgICAgICAgICdhdmdUdXJucyc6IHJvdW5kKHRvdGFsX3R1cm5zIC8gbiwgMSkgaWYgbiA+IDAgZWxzZSAwLjAsCiAgICAgICAgICAgICdhdmdEYW1hZ2VEZWFsdCc6IHJvdW5kKHRvdGFsX2RhbWFnZV9kZWFsdCAvIG4sIDEpIGlmIG4gPiAwIGVsc2UgMC4wLAogICAgICAgICAgICAnYXZnRGFtYWdlUmVjZWl2ZWQnOiByb3VuZCh0b3RhbF9kYW1hZ2VfcmVjZWl2ZWQgLyBuLCAxKSBpZiBuID4gMCBlbHNlIDAuMCwKICAgICAgICAgICAgJ2F2Z1NwZWxsc0Nhc3QnOiByb3VuZCh0b3RhbF9zcGVsbHNfY2FzdCAvIG4sIDEpIGlmIG4gPiAwIGVsc2UgMC4wLAogICAgICAgICAgICAnYXZnQ3JlYXR1cmVzUGxheWVkJzogcm91bmQodG90YWxfY3JlYXR1cmVzX3BsYXllZCAvIG4sIDEpIGlmIG4gPiAwIGVsc2UgMC4wLAogICAgICAgICAgICAnYXZnUmVtb3ZhbFVzZWQnOiByb3VuZCh0b3RhbF9yZW1vdmFsX3VzZWQgLyBuLCAxKSBpZiBuID4gMCBlbHNlIDAuMCwKICAgICAgICAgICAgJ2F2Z1JhbXBQbGF5ZWQnOiByb3VuZCh0b3RhbF9yYW1wX3BsYXllZCAvIG4sIDEpIGlmIG4gPiAwIGVsc2UgMC4wLAogICAgICAgICAgICAnYXZnQ2FyZHNEcmF3bic6IHJvdW5kKHRvdGFsX2NhcmRzX2RyYXduIC8gbiwgMSkgaWYgbiA+IDAgZWxzZSAwLjAsCiAgICAgICAgICAgICdhdmdNYXhCb2FyZFNpemUnOiByb3VuZCh0b3RhbF9tYXhfYm9hcmQgLyBuLCAxKSBpZiBuID4gMCBlbHNlIDAuMCwKICAgICAgICAgICAgJ2VsYXBzZWRTZWNvbmRzJzogcm91bmQoZWxhcHNlZCwgMyksCiAgICAgICAgfQoKICAgICAgICB3aXRoIF9zaW1fbG9jazoKICAgICAgICAgICAgX3NpbV9ydW5zW3NpbV9pZF1bJ3N0YXR1cyddID0gJ2NvbXBsZXRlJwogICAgICAgICAgICBfc2ltX3J1bnNbc2ltX2lkXVsncmVzdWx0J10gPSB7CiAgICAgICAgICAgICAgICAnc3VtbWFyeSc6IHN1bW1hcnksCiAgICAgICAgICAgICAgICAnZ2FtZXMnOiBnYW1lX3Jlc3VsdHMsCiAgICAgICAgICAgIH0KICAgIGV4Y2VwdCBFeGNlcHRpb24gYXMgZToKICAgICAgICBpbXBvcnQgdHJhY2ViYWNrCiAgICAgICAgd2l0aCBfc2ltX2xvY2s6CiAgICAgICAgICAgIF9zaW1fcnVuc1tzaW1faWRdWydzdGF0dXMnXSA9ICdlcnJvcicKICAgICAgICAgICAgX3NpbV9ydW5zW3NpbV9pZF1bJ2Vycm9yJ10gPSBzdHIoZSkKICAgICAgICB0cmFjZWJhY2sucHJpbnRfZXhjKCkKCgpAYXBwLnBvc3QoJy9hcGkvc2ltL3J1bicpCmFzeW5jIGRlZiBzaW1fcnVuKHJlcXVlc3Q6IEZhc3RBUElSZXF1ZXN0KToKICAgICIiIlN0YXJ0IGEgTW9udGUgQ2FybG8gc2ltdWxhdGlvbiB3aXRoIHRoZSBQeXRob24gZW5naW5lLiIiIgogICAgYm9keSA9IGF3YWl0IHJlcXVlc3QuanNvbigpCiAgICBkZWNrbGlzdCA9IGJvZHkuZ2V0KCdkZWNrbGlzdCcsIFtdKQogICAgbnVtX2dhbWVzID0gYm9keS5nZXQoJ251bUdhbWVzJywgMTApCiAgICBkZWNrX25hbWUgPSBib2R5LmdldCgnZGVja05hbWUnLCAnTXkgRGVjaycpCiAgICByZWNvcmRfbG9ncyA9IGJvZHkuZ2V0KCdyZWNvcmRMb2dzJywgVHJ1ZSkKCiAgICBpZiBub3QgZGVja2xpc3Q6CiAgICAgICAgcmV0dXJuIEpTT05SZXNwb25zZSh7J2Vycm9yJzogJ2RlY2tsaXN0IGlzIHJlcXVpcmVkJ30sIHN0YXR1c19jb2RlPTQwMCkKICAgIGlmIG51bV9nYW1lcyA8IDEgb3IgbnVtX2dhbWVzID4gMTAwMDoKICAgICAgICByZXR1cm4gSlNPTlJlc3BvbnNlKHsnZXJyb3InOiAnbnVtR2FtZXMgbXVzdCBiZSAxLTEwMDAnfSwgc3RhdHVzX2NvZGU9NDAwKQoKICAgIHNpbV9pZCA9IHN0cihfdXVpZC51dWlkNCgpKVs6OF0KICAgIHdpdGggX3NpbV9sb2NrOgogICAgICAgIF9zaW1fcnVuc1tzaW1faWRdID0gewogICAgICAgICAgICAnc3RhdHVzJzogJ3F1ZXVlZCcsCiAgICAgICAgICAgICdjb21wbGV0ZWQnOiAwLAogICAgICAgICAgICAndG90YWwnOiBudW1fZ2FtZXMsCiAgICAgICAgICAgICdkZWNrTmFtZSc6IGRlY2tfbmFtZSwKICAgICAgICAgICAgJ3Jlc3VsdCc6IE5vbmUsCiAgICAgICAgICAgICdlcnJvcic6IE5vbmUsCiAgICAgICAgfQoKICAgIHQgPSBfdGhyZWFkaW5nLlRocmVhZCh0YXJnZXQ9X3J1bl9zaW1fdGhyZWFkLCBhcmdzPShzaW1faWQsIGRlY2tsaXN0LCBudW1fZ2FtZXMsIGRlY2tfbmFtZSwgcmVjb3JkX2xvZ3MpLCBkYWVtb249VHJ1ZSkKICAgIHQuc3RhcnQoKQoKICAgIHJldHVybiBKU09OUmVzcG9uc2UoeydzaW1JZCc6IHNpbV9pZCwgJ3N0YXR1cyc6ICdxdWV1ZWQnLCAndG90YWwnOiBudW1fZ2FtZXN9KQoKCkBhcHAuZ2V0KCcvYXBpL3NpbS9zdGF0dXMnKQphc3luYyBkZWYgc2ltX3N0YXR1cyhzaW1JZDogc3RyKToKICAgICIiIlBvbGwgc2ltdWxhdGlvbiBwcm9ncmVzcy4iIiIKICAgIHdpdGggX3NpbV9sb2NrOgogICAgICAgIHJ1biA9IF9zaW1fcnVucy5nZXQoc2ltSWQpCiAgICBpZiBub3QgcnVuOgogICAgICAgIHJldHVybiBKU09OUmVzcG9uc2UoeydlcnJvcic6ICdzaW0gbm90IGZvdW5kJ30sIHN0YXR1c19jb2RlPTQwNCkKICAgIHJldHVybiBKU09OUmVzcG9uc2UoewogICAgICAgICdzaW1JZCc6IHNpbUlkLAogICAgICAgICdzdGF0dXMnOiBydW5bJ3N0YXR1cyddLAogICAgICAgICdjb21wbGV0ZWQnOiBydW5bJ2NvbXBsZXRlZCddLAogICAgICAgICd0b3RhbCc6IHJ1blsndG90YWwnXSwKICAgICAgICAnZGVja05hbWUnOiBydW4uZ2V0KCdkZWNrTmFtZScsICcnKSwKICAgICAgICAnZXJyb3InOiBydW4uZ2V0KCdlcnJvcicpLAogICAgfSkKCgpAYXBwLmdldCgnL2FwaS9zaW0vcmVzdWx0JykKYXN5bmMgZGVmIHNpbV9yZXN1bHQoc2ltSWQ6IHN0cik6CiAgICAiIiJHZXQgY29tcGxldGVkIHNpbXVsYXRpb24gcmVzdWx0cy4iIiIKICAgIHdpdGggX3NpbV9sb2NrOgogICAgICAgIHJ1biA9IF9zaW1fcnVucy5nZXQoc2ltSWQpCiAgICBpZiBub3QgcnVuOgogICAgICAgIHJldHVybiBKU09OUmVzcG9uc2UoeydlcnJvcic6ICdzaW0gbm90IGZvdW5kJ30sIHN0YXR1c19jb2RlPTQwNCkKICAgIGlmIHJ1blsnc3RhdHVzJ10gIT0gJ2NvbXBsZXRlJzoKICAgICAgICByZXR1cm4gSlNPTlJlc3BvbnNlKHsnZXJyb3InOiAnc2ltIG5vdCBjb21wbGV0ZScsICdzdGF0dXMnOiBydW5bJ3N0YXR1cyddfSwgc3RhdHVzX2NvZGU9NDAwKQogICAgcmV0dXJuIEpTT05SZXNwb25zZShydW5bJ3Jlc3VsdCddKQoKCkBhcHAucG9zdCgnL2FwaS9zaW0vcnVuLWZyb20tZGVjaycpCmFzeW5jIGRlZiBzaW1fcnVuX2Zyb21fZGVjayhyZXF1ZXN0OiBGYXN0QVBJUmVxdWVzdCk6CiAgICAiIiJTdGFydCBzaW11bGF0aW9uIHVzaW5nIGEgZGVjayBmcm9tIHRoZSBEZWNrIEJ1aWxkZXIgKGJ5IGRlY2sgSUQpLiIiIgogICAgYm9keSA9IGF3YWl0IHJlcXVlc3QuanNvbigpCiAgICBkZWNrX2lkID0gYm9keS5nZXQoJ2RlY2tJZCcpCiAgICBudW1fZ2FtZXMgPSBib2R5LmdldCgnbnVtR2FtZXMnLCAxMCkKICAgIHJlY29yZF9sb2dzID0gYm9keS5nZXQoJ3JlY29yZExvZ3MnLCBUcnVlKQoKICAgIGlmIG5vdCBkZWNrX2lkOgogICAgICAgIHJldHVybiBKU09OUmVzcG9uc2UoeydlcnJvcic6ICdkZWNrSWQgcmVxdWlyZWQnfSwgc3RhdHVzX2NvZGU9NDAwKQoKICAgIGNvbm4gPSBfZ2V0X2RiX2Nvbm4oKQogICAgY3VyID0gY29ubi5jdXJzb3IoKQogICAgY3VyLmV4ZWN1dGUoJ1NFTEVDVCBuYW1lIEZST00gZGVja3MgV0hFUkUgaWQgPSA/JywgKGRlY2tfaWQsKSkKICAgIHJvdyA9IGN1ci5mZXRjaG9uZSgpCiAgICBpZiBub3Qgcm93OgogICAgICAgIHJldHVybiBKU09OUmVzcG9uc2UoeydlcnJvcic6ICdkZWNrIG5vdCBmb3VuZCd9LCBzdGF0dXNfY29kZT00MDQpCiAgICBkZWNrX25hbWUgPSByb3dbMF0KCiAgICAjIFB1bGwgZnVsbCBjYXJkIGRhdGEgZnJvbSBjb2xsZWN0aW9uIGpvaW4gc28gdGhlIHNpbSBlbmdpbmUgaGFzIHJlYWwgdHlwZXMvc3RhdHMKICAgIGN1ci5leGVjdXRlKCIiIgogICAgICAgIFNFTEVDVCBkYy5jYXJkX25hbWUsIGRjLnF1YW50aXR5LAogICAgICAgICAgICAgICBjZS50eXBlX2xpbmUsIGNlLmNtYywgY2UucG93ZXIsIGNlLnRvdWdobmVzcywKICAgICAgICAgICAgICAgY2Uub3JhY2xlX3RleHQsIGNlLmtleXdvcmRzLCBjZS5tYW5hX2Nvc3QKICAgICAgICBGUk9NIGRlY2tfY2FyZHMgZGMKICAgICAgICBMRUZUIEpPSU4gKAogICAgICAgICAgICBTRUxFQ1Qgc2NyeWZhbGxfaWQsIHR5cGVfbGluZSwgY21jLCBwb3dlciwgdG91Z2huZXNzLAogICAgICAgICAgICAgICAgICAgb3JhY2xlX3RleHQsIGtleXdvcmRzLCBtYW5hX2Nvc3QKICAgICAgICAgICAgRlJPTSBjb2xsZWN0aW9uX2VudHJpZXMgR1JPVVAgQlkgc2NyeWZhbGxfaWQKICAgICAgICApIGNlIE9OIGNlLnNjcnlmYWxsX2lkID0gZGMuc2NyeWZhbGxfaWQKICAgICAgICBXSEVSRSBkYy5kZWNrX2lkID0gPwogICAgIiIiLCAoZGVja19pZCwpKQogICAgY2FyZF9kYXRhID0gW10KICAgIGZvciByIGluIGN1ci5mZXRjaGFsbCgpOgogICAgICAgIGZvciBfIGluIHJhbmdlKHJbMV0gb3IgMSk6CiAgICAgICAgICAgIGNhcmRfZGF0YS5hcHBlbmQoewogICAgICAgICAgICAgICAgJ25hbWUnOiByWzBdLAogICAgICAgICAgICAgICAgJ3R5cGVfbGluZSc6IHJbMl0gb3IgJycsCiAgICAgICAgICAgICAgICAnY21jJzogclszXSBvciAwLAogICAgICAgICAgICAgICAgJ3Bvd2VyJzogcls0XSBvciAnJywKICAgICAgICAgICAgICAgICd0b3VnaG5lc3MnOiByWzVdIG9yICcnLAogICAgICAgICAgICAgICAgJ29yYWNsZV90ZXh0Jzogcls2XSBvciAnJywKICAgICAgICAgICAgICAgICdrZXl3b3Jkcyc6IHJbN10gb3IgJycsCiAgICAgICAgICAgICAgICAnbWFuYV9jb3N0Jzogcls4XSBvciAnJywKICAgICAgICAgICAgfSkKICAgIGlmIG5vdCBjYXJkX2RhdGE6CiAgICAgICAgcmV0dXJuIEpTT05SZXNwb25zZSh7J2Vycm9yJzogJ2RlY2sgaGFzIG5vIGNhcmRzJ30sIHN0YXR1c19jb2RlPTQwMCkKCiAgICBzaW1faWQgPSBzdHIoX3V1aWQudXVpZDQoKSlbOjhdCiAgICB3aXRoIF9zaW1fbG9jazoKICAgICAgICBfc2ltX3J1bnNbc2ltX2lkXSA9IHsKICAgICAgICAgICAgJ3N0YXR1cyc6ICdxdWV1ZWQnLAogICAgICAgICAgICAnY29tcGxldGVkJzogMCwKICAgICAgICAgICAgJ3RvdGFsJzogbnVtX2dhbWVzLAogICAgICAgICAgICAnZGVja05hbWUnOiBkZWNrX25hbWUsCiAgICAgICAgICAgICdyZXN1bHQnOiBOb25lLAogICAgICAgICAgICAnZXJyb3InOiBOb25lLAogICAgICAgIH0KCiAgICB0ID0gX3RocmVhZGluZy5UaHJlYWQodGFyZ2V0PV9ydW5fc2ltX3RocmVhZF92MiwgYXJncz0oc2ltX2lkLCBjYXJkX2RhdGEsIG51bV9nYW1lcywgZGVja19uYW1lLCByZWNvcmRfbG9ncyksIGRhZW1vbj1UcnVlKQogICAgdC5zdGFydCgpCgogICAgcmV0dXJuIEpTT05SZXNwb25zZSh7J3NpbUlkJzogc2ltX2lkLCAnc3RhdHVzJzogJ3F1ZXVlZCcsICd0b3RhbCc6IG51bV9nYW1lcywgJ2RlY2tOYW1lJzogZGVja19uYW1lfSkKCgojIOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkAojIERlZXBTZWVrIEFJIE9wcG9uZW50IEJyYWluCiMg4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQCgojIEdsb2JhbCBEZWVwU2VlayBicmFpbiBpbnN0YW5jZSAobGF6eS1pbml0aWFsaXplZCkKX2RlZXBzZWVrX2JyYWluID0gTm9uZQpfZGVlcHNlZWtfbG9jayA9IF90aHJlYWRpbmcuTG9jaygpCgpkZWYgX2dldF9kZWVwc2Vla19icmFpbigpOgogICAgIiIiR2V0IG9yIGNyZWF0ZSB0aGUgZ2xvYmFsIERlZXBTZWVrIGJyYWluIGluc3RhbmNlLiIiIgogICAgZ2xvYmFsIF9kZWVwc2Vla19icmFpbgogICAgaWYgX2RlZXBzZWVrX2JyYWluIGlzIE5vbmU6CiAgICAgICAgd2l0aCBfZGVlcHNlZWtfbG9jazoKICAgICAgICAgICAgaWYgX2RlZXBzZWVrX2JyYWluIGlzIE5vbmU6CiAgICAgICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICAgICAgaW1wb3J0IHN5cyBhcyBfc3lzMiwgb3MgYXMgX29zMgogICAgICAgICAgICAgICAgICAgIHNyY19kaXIgPSBfb3MyLnBhdGguam9pbihfb3MyLnBhdGguZGlybmFtZShfb3MyLnBhdGguYWJzcGF0aChfX2ZpbGVfXykpLCAnc3JjJykKICAgICAgICAgICAgICAgICAgICBpZiBzcmNfZGlyIG5vdCBpbiBfc3lzMi5wYXRoOgogICAgICAgICAgICAgICAgICAgICAgICBfc3lzMi5wYXRoLmluc2VydCgwLCBzcmNfZGlyKQogICAgICAgICAgICAgICAgICAgIGZyb20gY29tbWFuZGVyX2FpX2xhYi5zaW0uZGVlcHNlZWtfYnJhaW4gaW1wb3J0IERlZXBTZWVrQnJhaW4sIERlZXBTZWVrQ29uZmlnCiAgICAgICAgICAgICAgICAgICAgY2ZnID0gRGVlcFNlZWtDb25maWcoKQogICAgICAgICAgICAgICAgICAgICMgQWxsb3cgZW52IHZhciBvdmVycmlkZXMKICAgICAgICAgICAgICAgICAgICBpZiBfb3MyLmVudmlyb24uZ2V0KCdERUVQU0VFS19BUElfQkFTRScpOgogICAgICAgICAgICAgICAgICAgICAgICBjZmcuYXBpX2Jhc2UgPSBfb3MyLmVudmlyb25bJ0RFRVBTRUVLX0FQSV9CQVNFJ10KICAgICAgICAgICAgICAgICAgICBpZiBfb3MyLmVudmlyb24uZ2V0KCdERUVQU0VFS19NT0RFTCcpOgogICAgICAgICAgICAgICAgICAgICAgICBjZmcubW9kZWwgPSBfb3MyLmVudmlyb25bJ0RFRVBTRUVLX01PREVMJ10KICAgICAgICAgICAgICAgICAgICBjZmcubG9nX2RpciA9IF9vczIucGF0aC5qb2luKF9vczIucGF0aC5kaXJuYW1lKF9vczIucGF0aC5hYnNwYXRoKF9fZmlsZV9fKSksICdsb2dzJywgJ2RlY2lzaW9ucycpCiAgICAgICAgICAgICAgICAgICAgX2RlZXBzZWVrX2JyYWluID0gRGVlcFNlZWtCcmFpbihjZmcpCiAgICAgICAgICAgICAgICBleGNlcHQgRXhjZXB0aW9uIGFzIGU6CiAgICAgICAgICAgICAgICAgICAgbG9nX3NpbS5lcnJvcihmJ0ZhaWxlZCB0byBpbml0aWFsaXplIGJyYWluOiB7ZX0nKQogICAgICAgICAgICAgICAgICAgIHJldHVybiBOb25lCiAgICByZXR1cm4gX2RlZXBzZWVrX2JyYWluCgoKQGFwcC5wb3N0KCcvYXBpL2RlZXBzZWVrL2Nvbm5lY3QnKQphc3luYyBkZWYgZGVlcHNlZWtfY29ubmVjdChyZXF1ZXN0OiBGYXN0QVBJUmVxdWVzdCk6CiAgICAiIiJUZXN0IGNvbm5lY3Rpb24gdG8gdGhlIERlZXBTZWVrIExMTSBlbmRwb2ludCBhbmQgYXV0by1kZXRlY3QgbW9kZWwuIiIiCiAgICBib2R5ID0gYXdhaXQgcmVxdWVzdC5qc29uKCkgaWYgYXdhaXQgcmVxdWVzdC5ib2R5KCkgZWxzZSB7fQogICAgYXBpX2Jhc2UgPSBib2R5LmdldCgnYXBpQmFzZScsIE5vbmUpCiAgICBtb2RlbCA9IGJvZHkuZ2V0KCdtb2RlbCcsIE5vbmUpCgogICAgYnJhaW4gPSBfZ2V0X2RlZXBzZWVrX2JyYWluKCkKICAgIGlmIGJyYWluIGlzIE5vbmU6CiAgICAgICAgcmV0dXJuIEpTT05SZXNwb25zZSh7J2Vycm9yJzogJ0RlZXBTZWVrIGJyYWluIGZhaWxlZCB0byBpbml0aWFsaXplJ30sIHN0YXR1c19jb2RlPTUwMCkKCiAgICAjIEFsbG93IHJ1bnRpbWUgcmVjb25maWd1cmF0aW9uCiAgICBpZiBhcGlfYmFzZToKICAgICAgICBicmFpbi5jb25maWcuYXBpX2Jhc2UgPSBhcGlfYmFzZQogICAgaWYgbW9kZWw6CiAgICAgICAgYnJhaW4uY29uZmlnLm1vZGVsID0gbW9kZWwKCiAgICBjb25uZWN0ZWQgPSBicmFpbi5jaGVja19jb25uZWN0aW9uKCkKICAgIHJldHVybiBKU09OUmVzcG9uc2UoewogICAgICAgICdjb25uZWN0ZWQnOiBjb25uZWN0ZWQsCiAgICAgICAgJ2FwaUJhc2UnOiBicmFpbi5jb25maWcuYXBpX2Jhc2UsCiAgICAgICAgJ21vZGVsJzogYnJhaW4uY29uZmlnLm1vZGVsLAogICAgICAgICdzdGF0cyc6IGJyYWluLmdldF9zdGF0cygpLAogICAgfSkKCgpAYXBwLmdldCgnL2FwaS9kZWVwc2Vlay9zdGF0dXMnKQphc3luYyBkZWYgZGVlcHNlZWtfc3RhdHVzKCk6CiAgICAiIiJHZXQgRGVlcFNlZWsgYnJhaW4gc3RhdHVzIGFuZCBwZXJmb3JtYW5jZSBzdGF0cy4iIiIKICAgIGJyYWluID0gX2dldF9kZWVwc2Vla19icmFpbigpCiAgICBpZiBicmFpbiBpcyBOb25lOgogICAgICAgIHJldHVybiBKU09OUmVzcG9uc2Uoeydjb25uZWN0ZWQnOiBGYWxzZSwgJ2Vycm9yJzogJ0JyYWluIG5vdCBpbml0aWFsaXplZCd9KQogICAgcmV0dXJuIEpTT05SZXNwb25zZShicmFpbi5nZXRfc3RhdHMoKSkKCgpAYXBwLnBvc3QoJy9hcGkvZGVlcHNlZWsvY29uZmlndXJlJykKYXN5bmMgZGVmIGRlZXBzZWVrX2NvbmZpZ3VyZShyZXF1ZXN0OiBGYXN0QVBJUmVxdWVzdCk6CiAgICAiIiJVcGRhdGUgRGVlcFNlZWsgY29uZmlndXJhdGlvbiBhdCBydW50aW1lLiIiIgogICAgYm9keSA9IGF3YWl0IHJlcXVlc3QuanNvbigpCiAgICBicmFpbiA9IF9nZXRfZGVlcHNlZWtfYnJhaW4oKQogICAgaWYgYnJhaW4gaXMgTm9uZToKICAgICAgICByZXR1cm4gSlNPTlJlc3BvbnNlKHsnZXJyb3InOiAnQnJhaW4gbm90IGluaXRpYWxpemVkJ30sIHN0YXR1c19jb2RlPTUwMCkKCiAgICBpZiAnYXBpQmFzZScgaW4gYm9keToKICAgICAgICBicmFpbi5jb25maWcuYXBpX2Jhc2UgPSBib2R5WydhcGlCYXNlJ10KICAgIGlmICdtb2RlbCcgaW4gYm9keToKICAgICAgICBicmFpbi5jb25maWcubW9kZWwgPSBib2R5Wydtb2RlbCddCiAgICBpZiAndGVtcGVyYXR1cmUnIGluIGJvZHk6CiAgICAgICAgYnJhaW4uY29uZmlnLnRlbXBlcmF0dXJlID0gZmxvYXQoYm9keVsndGVtcGVyYXR1cmUnXSkKICAgIGlmICdtYXhUb2tlbnMnIGluIGJvZHk6CiAgICAgICAgYnJhaW4uY29uZmlnLm1heF90b2tlbnMgPSBpbnQoYm9keVsnbWF4VG9rZW5zJ10pCiAgICBpZiAndGltZW91dCcgaW4gYm9keToKICAgICAgICBicmFpbi5jb25maWcucmVxdWVzdF90aW1lb3V0ID0gZmxvYXQoYm9keVsndGltZW91dCddKQogICAgaWYgJ2NhY2hlRW5hYmxlZCcgaW4gYm9keToKICAgICAgICBicmFpbi5jb25maWcuY2FjaGVfZW5hYmxlZCA9IGJvb2woYm9keVsnY2FjaGVFbmFibGVkJ10pCiAgICBpZiAnbG9nRGVjaXNpb25zJyBpbiBib2R5OgogICAgICAgIGJyYWluLmNvbmZpZy5sb2dfZGVjaXNpb25zID0gYm9vbChib2R5Wydsb2dEZWNpc2lvbnMnXSkKICAgIGlmICdmYWxsYmFja09uVGltZW91dCcgaW4gYm9keToKICAgICAgICBicmFpbi5jb25maWcuZmFsbGJhY2tfb25fdGltZW91dCA9IGJvb2woYm9keVsnZmFsbGJhY2tPblRpbWVvdXQnXSkKCiAgICAjIFJlLXRlc3QgY29ubmVjdGlvbiB3aXRoIG5ldyBzZXR0aW5ncwogICAgY29ubmVjdGVkID0gYnJhaW4uY2hlY2tfY29ubmVjdGlvbigpCgogICAgcmV0dXJuIEpTT05SZXNwb25zZSh7CiAgICAgICAgJ2Nvbm5lY3RlZCc6IGNvbm5lY3RlZCwKICAgICAgICAnY29uZmlnJzogewogICAgICAgICAgICAnYXBpQmFzZSc6IGJyYWluLmNvbmZpZy5hcGlfYmFzZSwKICAgICAgICAgICAgJ21vZGVsJzogYnJhaW4uY29uZmlnLm1vZGVsLAogICAgICAgICAgICAndGVtcGVyYXR1cmUnOiBicmFpbi5jb25maWcudGVtcGVyYXR1cmUsCiAgICAgICAgICAgICdtYXhUb2tlbnMnOiBicmFpbi5jb25maWcubWF4X3Rva2VucywKICAgICAgICAgICAgJ3RpbWVvdXQnOiBicmFpbi5jb25maWcucmVxdWVzdF90aW1lb3V0LAogICAgICAgICAgICAnY2FjaGVFbmFibGVkJzogYnJhaW4uY29uZmlnLmNhY2hlX2VuYWJsZWQsCiAgICAgICAgICAgICdsb2dEZWNpc2lvbnMnOiBicmFpbi5jb25maWcubG9nX2RlY2lzaW9ucywKICAgICAgICAgICAgJ2ZhbGxiYWNrT25UaW1lb3V0JzogYnJhaW4uY29uZmlnLmZhbGxiYWNrX29uX3RpbWVvdXQsCiAgICAgICAgfSwKICAgIH0pCgoKQGFwcC5nZXQoJy9hcGkvZGVlcHNlZWsvbG9ncycpCmFzeW5jIGRlZiBkZWVwc2Vla19sb2dzKCk6CiAgICAiIiJHZXQgZGVjaXNpb24gbG9nIHN0YXRzIGFuZCBmbHVzaCBwZW5kaW5nIGVudHJpZXMuIiIiCiAgICBicmFpbiA9IF9nZXRfZGVlcHNlZWtfYnJhaW4oKQogICAgaWYgYnJhaW4gaXMgTm9uZToKICAgICAgICByZXR1cm4gSlNPTlJlc3BvbnNlKHsnZXJyb3InOiAnQnJhaW4gbm90IGluaXRpYWxpemVkJ30sIHN0YXR1c19jb2RlPTUwMCkKCiAgICBwZW5kaW5nID0gbGVuKGJyYWluLl9kZWNpc2lvbl9sb2cpCiAgICBmbHVzaGVkX3BhdGggPSBOb25lCiAgICBpZiBwZW5kaW5nID4gMDoKICAgICAgICB0cnk6CiAgICAgICAgICAgIGZsdXNoZWRfcGF0aCA9IGJyYWluLmZsdXNoX2xvZygpCiAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbiBhcyBlOgogICAgICAgICAgICByZXR1cm4gSlNPTlJlc3BvbnNlKHsnZXJyb3InOiBmJ0ZhaWxlZCB0byBmbHVzaDoge2V9J30sIHN0YXR1c19jb2RlPTUwMCkKCiAgICAjIExpc3QgZXhpc3RpbmcgbG9nIGZpbGVzCiAgICBpbXBvcnQgZ2xvYiBhcyBfZ2xvYgogICAgbG9nX2RpciA9IGJyYWluLmNvbmZpZy5sb2dfZGlyCiAgICBsb2dfZmlsZXMgPSBbXQogICAgaWYgbG9nX2RpciBhbmQgb3MucGF0aC5pc2Rpcihsb2dfZGlyKToKICAgICAgICBmb3IgZiBpbiBzb3J0ZWQoX2dsb2IuZ2xvYihvcy5wYXRoLmpvaW4obG9nX2RpciwgJ2RlY2lzaW9uc18qLmpzb25sJykpKToKICAgICAgICAgICAgc3RhdCA9IG9zLnN0YXQoZikKICAgICAgICAgICAgbG9nX2ZpbGVzLmFwcGVuZCh7CiAgICAgICAgICAgICAgICAnZmlsZW5hbWUnOiBvcy5wYXRoLmJhc2VuYW1lKGYpLAogICAgICAgICAgICAgICAgJ3NpemVfYnl0ZXMnOiBzdGF0LnN0X3NpemUsCiAgICAgICAgICAgICAgICAnbW9kaWZpZWQnOiBzdGF0LnN0X210aW1lLAogICAgICAgICAgICB9KQoKICAgIHJldHVybiBKU09OUmVzcG9uc2UoewogICAgICAgICdmbHVzaGVkJzogcGVuZGluZywKICAgICAgICAnZmx1c2hlZFBhdGgnOiBmbHVzaGVkX3BhdGgsCiAgICAgICAgJ2xvZ0ZpbGVzJzogbG9nX2ZpbGVzWy0yMDpdLCAgIyBsYXN0IDIwCiAgICB9KQoKCmRlZiBfcnVuX3NpbV90aHJlYWRfZGVlcHNlZWsoc2ltX2lkOiBzdHIsIGNhcmRfZGF0YTogbGlzdFtkaWN0XSwgbnVtX2dhbWVzOiBpbnQsIGRlY2tfbmFtZTogc3RyLCByZWNvcmRfbG9nczogYm9vbCk6CiAgICAiIiJCYWNrZ3JvdW5kIHRocmVhZCBmb3Igc2ltdWxhdGlvbnMgdXNpbmcgRGVlcFNlZWsgQUkgb3Bwb25lbnQuIiIiCiAgICB0cnk6CiAgICAgICAgaW1wb3J0IHN5cywgb3MKICAgICAgICBzcmNfZGlyID0gb3MucGF0aC5qb2luKG9zLnBhdGguZGlybmFtZShvcy5wYXRoLmFic3BhdGgoX19maWxlX18pKSwgJ3NyYycpCiAgICAgICAgaWYgc3JjX2RpciBub3QgaW4gc3lzLnBhdGg6CiAgICAgICAgICAgIHN5cy5wYXRoLmluc2VydCgwLCBzcmNfZGlyKQoKICAgICAgICBmcm9tIGNvbW1hbmRlcl9haV9sYWIuc2ltLm1vZGVscyBpbXBvcnQgQ2FyZAogICAgICAgIGZyb20gY29tbWFuZGVyX2FpX2xhYi5zaW0uZGVlcHNlZWtfZW5naW5lIGltcG9ydCBEZWVwU2Vla0dhbWVFbmdpbmUKICAgICAgICBmcm9tIGNvbW1hbmRlcl9haV9sYWIuc2ltLnJ1bGVzIGltcG9ydCBlbnJpY2hfY2FyZAogICAgICAgIGZyb20gY29tbWFuZGVyX2FpX2xhYi5sYWIuZXhwZXJpbWVudHMgaW1wb3J0IF9nZW5lcmF0ZV90cmFpbmluZ19kZWNrCgogICAgICAgIHdpdGggX3NpbV9sb2NrOgogICAgICAgICAgICBfc2ltX3J1bnNbc2ltX2lkXVsnc3RhdHVzJ10gPSAncnVubmluZycKCiAgICAgICAgIyBCdWlsZCBwbGF5ZXIncyBkZWNrIHdpdGggcmVhbCBjYXJkIGRhdGEKICAgICAgICBkZWNrX2EgPSBbXQogICAgICAgIGZvciBjZCBpbiBjYXJkX2RhdGE6CiAgICAgICAgICAgIGMgPSBDYXJkKG5hbWU9Y2RbJ25hbWUnXSkKICAgICAgICAgICAgaWYgY2QuZ2V0KCd0eXBlX2xpbmUnKToKICAgICAgICAgICAgICAgIGMudHlwZV9saW5lID0gY2RbJ3R5cGVfbGluZSddCiAgICAgICAgICAgIGlmIGNkLmdldCgnY21jJyk6CiAgICAgICAgICAgICAgICBjLmNtYyA9IGZsb2F0KGNkWydjbWMnXSkKICAgICAgICAgICAgaWYgY2QuZ2V0KCdwb3dlcicpIGFuZCBjZC5nZXQoJ3RvdWdobmVzcycpOgogICAgICAgICAgICAgICAgYy5wb3dlciA9IHN0cihjZFsncG93ZXInXSkKICAgICAgICAgICAgICAgIGMudG91Z2huZXNzID0gc3RyKGNkWyd0b3VnaG5lc3MnXSkKICAgICAgICAgICAgICAgIGMucHQgPSBjLnBvd2VyICsgJy8nICsgYy50b3VnaG5lc3MKICAgICAgICAgICAgaWYgY2QuZ2V0KCdvcmFjbGVfdGV4dCcpOgogICAgICAgICAgICAgICAgYy5vcmFjbGVfdGV4dCA9IGNkWydvcmFjbGVfdGV4dCddCiAgICAgICAgICAgIGlmIGNkLmdldCgnbWFuYV9jb3N0Jyk6CiAgICAgICAgICAgICAgICBjLm1hbmFfY29zdCA9IGNkWydtYW5hX2Nvc3QnXQogICAgICAgICAgICBpZiBjZC5nZXQoJ2tleXdvcmRzJyk6CiAgICAgICAgICAgICAgICBrdyA9IGNkWydrZXl3b3JkcyddCiAgICAgICAgICAgICAgICBpZiBpc2luc3RhbmNlKGt3LCBzdHIpOgogICAgICAgICAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgICAgICAgICAgaW1wb3J0IGpzb24gYXMgX2pzb24KICAgICAgICAgICAgICAgICAgICAgICAga3cgPSBfanNvbi5sb2FkcyhrdykKICAgICAgICAgICAgICAgICAgICBleGNlcHQgRXhjZXB0aW9uOgogICAgICAgICAgICAgICAgICAgICAgICBrdyA9IFtdCiAgICAgICAgICAgICAgICBpZiBpc2luc3RhbmNlKGt3LCBsaXN0KToKICAgICAgICAgICAgICAgICAgICBjLmtleXdvcmRzID0ga3cKICAgICAgICAgICAgZW5yaWNoX2NhcmQoYykKICAgICAgICAgICAgZGVja19hLmFwcGVuZChjKQoKICAgICAgICBkZWNrX2IgPSBfZ2VuZXJhdGVfdHJhaW5pbmdfZGVjaygpCgogICAgICAgICMgR2V0IERlZXBTZWVrIGJyYWluCiAgICAgICAgYnJhaW4gPSBfZ2V0X2RlZXBzZWVrX2JyYWluKCkKICAgICAgICBpZiBicmFpbiBhbmQgbm90IGJyYWluLl9jb25uZWN0ZWQ6CiAgICAgICAgICAgIGJyYWluLmNoZWNrX2Nvbm5lY3Rpb24oKQoKICAgICAgICBlbmdpbmUgPSBEZWVwU2Vla0dhbWVFbmdpbmUoCiAgICAgICAgICAgIGJyYWluPWJyYWluLAogICAgICAgICAgICBhaV9wbGF5ZXJfaW5kZXg9MSwgICMgVHJhaW5pbmcgZGVjayBpcyBwbGF5ZXIgQiAoaW5kZXggMSkKICAgICAgICAgICAgbWF4X3R1cm5zPTI1LAogICAgICAgICAgICByZWNvcmRfbG9nPXJlY29yZF9sb2dzLAogICAgICAgICkKCiAgICAgICAgaW1wb3J0IHRpbWUKICAgICAgICBzdGFydCA9IHRpbWUudGltZSgpCgogICAgICAgIHdpbnMgPSAwCiAgICAgICAgbG9zc2VzID0gMAogICAgICAgIHRvdGFsX3R1cm5zID0gMAogICAgICAgIHRvdGFsX2RhbWFnZV9kZWFsdCA9IDAKICAgICAgICB0b3RhbF9kYW1hZ2VfcmVjZWl2ZWQgPSAwCiAgICAgICAgdG90YWxfc3BlbGxzX2Nhc3QgPSAwCiAgICAgICAgdG90YWxfY3JlYXR1cmVzX3BsYXllZCA9IDAKICAgICAgICB0b3RhbF9yZW1vdmFsX3VzZWQgPSAwCiAgICAgICAgdG90YWxfcmFtcF9wbGF5ZWQgPSAwCiAgICAgICAgdG90YWxfY2FyZHNfZHJhd24gPSAwCiAgICAgICAgdG90YWxfbWF4X2JvYXJkID0gMAogICAgICAgIGdhbWVfcmVzdWx0cyA9IFtdCgogICAgICAgIGZvciBpIGluIHJhbmdlKG51bV9nYW1lcyk6CiAgICAgICAgICAgIGdhbWVfaWQgPSBmJ2RzLXNpbS17c2ltX2lkWzo4XX0tZ3tpKzF9JwogICAgICAgICAgICByZXN1bHQgPSBlbmdpbmUucnVuKGRlY2tfYSwgZGVja19iLCBuYW1lX2E9ZGVja19uYW1lLCBuYW1lX2I9J0RlZXBTZWVrIEFJJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdhbWVfaWQ9Z2FtZV9pZCwgYXJjaGV0eXBlPSdtaWRyYW5nZScpCgogICAgICAgICAgICBnYW1lX2RhdGEgPSByZXN1bHQudG9fZGljdCgpCiAgICAgICAgICAgIGdhbWVfZGF0YVsnZ2FtZU51bWJlciddID0gaSArIDEKICAgICAgICAgICAgZ2FtZV9yZXN1bHRzLmFwcGVuZChnYW1lX2RhdGEpCgogICAgICAgICAgICBpZiByZXN1bHQud2lubmVyID09IDA6CiAgICAgICAgICAgICAgICB3aW5zICs9IDEKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIGxvc3NlcyArPSAxCgogICAgICAgICAgICB0b3RhbF90dXJucyArPSByZXN1bHQudHVybnMKICAgICAgICAgICAgaWYgcmVzdWx0LnBsYXllcl9hX3N0YXRzOgogICAgICAgICAgICAgICAgdG90YWxfZGFtYWdlX2RlYWx0ICs9IHJlc3VsdC5wbGF5ZXJfYV9zdGF0cy5kYW1hZ2VfZGVhbHQKICAgICAgICAgICAgICAgIHRvdGFsX2RhbWFnZV9yZWNlaXZlZCArPSByZXN1bHQucGxheWVyX2Ffc3RhdHMuZGFtYWdlX3JlY2VpdmVkCiAgICAgICAgICAgICAgICB0b3RhbF9zcGVsbHNfY2FzdCArPSByZXN1bHQucGxheWVyX2Ffc3RhdHMuc3BlbGxzX2Nhc3QKICAgICAgICAgICAgICAgIHRvdGFsX2NyZWF0dXJlc19wbGF5ZWQgKz0gcmVzdWx0LnBsYXllcl9hX3N0YXRzLmNyZWF0dXJlc19wbGF5ZWQKICAgICAgICAgICAgICAgIHRvdGFsX3JlbW92YWxfdXNlZCArPSByZXN1bHQucGxheWVyX2Ffc3RhdHMucmVtb3ZhbF91c2VkCiAgICAgICAgICAgICAgICB0b3RhbF9yYW1wX3BsYXllZCArPSByZXN1bHQucGxheWVyX2Ffc3RhdHMucmFtcF9wbGF5ZWQKICAgICAgICAgICAgICAgIHRvdGFsX2NhcmRzX2RyYXduICs9IHJlc3VsdC5wbGF5ZXJfYV9zdGF0cy5jYXJkc19kcmF3bgogICAgICAgICAgICAgICAgdG90YWxfbWF4X2JvYXJkICs9IHJlc3VsdC5wbGF5ZXJfYV9zdGF0cy5tYXhfYm9hcmRfc2l6ZQoKICAgICAgICAgICAgd2l0aCBfc2ltX2xvY2s6CiAgICAgICAgICAgICAgICBfc2ltX3J1bnNbc2ltX2lkXVsnY29tcGxldGVkJ10gPSBpICsgMQoKICAgICAgICBlbGFwc2VkID0gdGltZS50aW1lKCkgLSBzdGFydAogICAgICAgIG4gPSBudW1fZ2FtZXMKCiAgICAgICAgIyBXcml0ZSBNTCBkZWNpc2lvbiBKU09OTCBmb3IgdHJhaW5pbmcgcGlwZWxpbmUKICAgICAgICBtbF9kZWNpc2lvbnMgPSBlbmdpbmUuZmx1c2hfbWxfZGVjaXNpb25zKCkKICAgICAgICBpZiBtbF9kZWNpc2lvbnM6CiAgICAgICAgICAgIG1sX2pzb25sX3BhdGggPSBvcy5wYXRoLmpvaW4oJ3Jlc3VsdHMnLCBmJ21sLWRlY2lzaW9ucy1zaW0te3NpbV9pZFs6OF19Lmpzb25sJykKICAgICAgICAgICAgb3MubWFrZWRpcnMoJ3Jlc3VsdHMnLCBleGlzdF9vaz1UcnVlKQogICAgICAgICAgICB3aXRoIG9wZW4obWxfanNvbmxfcGF0aCwgJ3cnLCBlbmNvZGluZz0ndXRmLTgnKSBhcyBtZjoKICAgICAgICAgICAgICAgIGltcG9ydCBqc29uIGFzIF9tbGpzb24KICAgICAgICAgICAgICAgIGZvciBkZWMgaW4gbWxfZGVjaXNpb25zOgogICAgICAgICAgICAgICAgICAgIG1mLndyaXRlKF9tbGpzb24uZHVtcHMoZGVjKSArICdcbicpCgogICAgICAgICMgR2V0IERlZXBTZWVrIHN0YXRzIGZvciB0aGUgc3VtbWFyeQogICAgICAgIGRzX3N0YXRzID0gYnJhaW4uZ2V0X3N0YXRzKCkgaWYgYnJhaW4gZWxzZSB7fQoKICAgICAgICBzdW1tYXJ5ID0gewogICAgICAgICAgICAnZGVja05hbWUnOiBkZWNrX25hbWUsCiAgICAgICAgICAgICdvcHBvbmVudE5hbWUnOiAnRGVlcFNlZWsgQUknLAogICAgICAgICAgICAnb3Bwb25lbnRUeXBlJzogJ2RlZXBzZWVrJywKICAgICAgICAgICAgJ3RvdGFsR2FtZXMnOiBuLAogICAgICAgICAgICAnd2lucyc6IHdpbnMsCiAgICAgICAgICAgICdsb3NzZXMnOiBsb3NzZXMsCiAgICAgICAgICAgICd3aW5SYXRlJzogcm91bmQod2lucyAvIG4gKiAxMDAsIDEpIGlmIG4gPiAwIGVsc2UgMC4wLAogICAgICAgICAgICAnYXZnVHVybnMnOiByb3VuZCh0b3RhbF90dXJucyAvIG4sIDEpIGlmIG4gPiAwIGVsc2UgMC4wLAogICAgICAgICAgICAnYXZnRGFtYWdlRGVhbHQnOiByb3VuZCh0b3RhbF9kYW1hZ2VfZGVhbHQgLyBuLCAxKSBpZiBuID4gMCBlbHNlIDAuMCwKICAgICAgICAgICAgJ2F2Z0RhbWFnZVJlY2VpdmVkJzogcm91bmQodG90YWxfZGFtYWdlX3JlY2VpdmVkIC8gbiwgMSkgaWYgbiA+IDAgZWxzZSAwLjAsCiAgICAgICAgICAgICdhdmdTcGVsbHNDYXN0Jzogcm91bmQodG90YWxfc3BlbGxzX2Nhc3QgLyBuLCAxKSBpZiBuID4gMCBlbHNlIDAuMCwKICAgICAgICAgICAgJ2F2Z0NyZWF0dXJlc1BsYXllZCc6IHJvdW5kKHRvdGFsX2NyZWF0dXJlc19wbGF5ZWQgLyBuLCAxKSBpZiBuID4gMCBlbHNlIDAuMCwKICAgICAgICAgICAgJ2F2Z1JlbW92YWxVc2VkJzogcm91bmQodG90YWxfcmVtb3ZhbF91c2VkIC8gbiwgMSkgaWYgbiA+IDAgZWxzZSAwLjAsCiAgICAgICAgICAgICdhdmdSYW1wUGxheWVkJzogcm91bmQodG90YWxfcmFtcF9wbGF5ZWQgLyBuLCAxKSBpZiBuID4gMCBlbHNlIDAuMCwKICAgICAgICAgICAgJ2F2Z0NhcmRzRHJhd24nOiByb3VuZCh0b3RhbF9jYXJkc19kcmF3biAvIG4sIDEpIGlmIG4gPiAwIGVsc2UgMC4wLAogICAgICAgICAgICAnYXZnTWF4Qm9hcmRTaXplJzogcm91bmQodG90YWxfbWF4X2JvYXJkIC8gbiwgMSkgaWYgbiA+IDAgZWxzZSAwLjAsCiAgICAgICAgICAgICdlbGFwc2VkU2Vjb25kcyc6IHJvdW5kKGVsYXBzZWQsIDMpLAogICAgICAgICAgICAnZGVlcHNlZWtTdGF0cyc6IGRzX3N0YXRzLAogICAgICAgIH0KCiAgICAgICAgd2l0aCBfc2ltX2xvY2s6CiAgICAgICAgICAgIF9zaW1fcnVuc1tzaW1faWRdWydzdGF0dXMnXSA9ICdjb21wbGV0ZScKICAgICAgICAgICAgX3NpbV9ydW5zW3NpbV9pZF1bJ3Jlc3VsdCddID0gewogICAgICAgICAgICAgICAgJ3N1bW1hcnknOiBzdW1tYXJ5LAogICAgICAgICAgICAgICAgJ2dhbWVzJzogZ2FtZV9yZXN1bHRzLAogICAgICAgICAgICB9CiAgICBleGNlcHQgRXhjZXB0aW9uIGFzIGU6CiAgICAgICAgaW1wb3J0IHRyYWNlYmFjawogICAgICAgIHdpdGggX3NpbV9sb2NrOgogICAgICAgICAgICBfc2ltX3J1bnNbc2ltX2lkXVsnc3RhdHVzJ10gPSAnZXJyb3InCiAgICAgICAgICAgIF9zaW1fcnVuc1tzaW1faWRdWydlcnJvciddID0gc3RyKGUpCiAgICAgICAgdHJhY2ViYWNrLnByaW50X2V4YygpCgoKQGFwcC5wb3N0KCcvYXBpL3NpbS9ydW4tZGVlcHNlZWsnKQphc3luYyBkZWYgc2ltX3J1bl9kZWVwc2VlayhyZXF1ZXN0OiBGYXN0QVBJUmVxdWVzdCk6CiAgICAiIiJTdGFydCBzaW11bGF0aW9uIHVzaW5nIERlZXBTZWVrIEFJIGFzIHRoZSBvcHBvbmVudCBicmFpbi4iIiIKICAgIGJvZHkgPSBhd2FpdCByZXF1ZXN0Lmpzb24oKQogICAgZGVja19pZCA9IGJvZHkuZ2V0KCdkZWNrSWQnKQogICAgbnVtX2dhbWVzID0gYm9keS5nZXQoJ251bUdhbWVzJywgNSkgICMgRGVmYXVsdCA1IChMTE0gaXMgc2xvd2VyKQogICAgcmVjb3JkX2xvZ3MgPSBib2R5LmdldCgncmVjb3JkTG9ncycsIFRydWUpCgogICAgaWYgbm90IGRlY2tfaWQ6CiAgICAgICAgcmV0dXJuIEpTT05SZXNwb25zZSh7J2Vycm9yJzogJ2RlY2tJZCByZXF1aXJlZCd9LCBzdGF0dXNfY29kZT00MDApCiAgICBpZiBudW1fZ2FtZXMgPCAxIG9yIG51bV9nYW1lcyA+IDUwOgogICAgICAgIHJldHVybiBKU09OUmVzcG9uc2UoeydlcnJvcic6ICdudW1HYW1lcyBtdXN0IGJlIDEtNTAgZm9yIERlZXBTZWVrIG1vZGUnfSwgc3RhdHVzX2NvZGU9NDAwKQoKICAgIGNvbm4gPSBfZ2V0X2RiX2Nvbm4oKQogICAgY3VyID0gY29ubi5jdXJzb3IoKQogICAgY3VyLmV4ZWN1dGUoJ1NFTEVDVCBuYW1lIEZST00gZGVja3MgV0hFUkUgaWQgPSA/JywgKGRlY2tfaWQsKSkKICAgIHJvdyA9IGN1ci5mZXRjaG9uZSgpCiAgICBpZiBub3Qgcm93OgogICAgICAgIHJldHVybiBKU09OUmVzcG9uc2UoeydlcnJvcic6ICdkZWNrIG5vdCBmb3VuZCd9LCBzdGF0dXNfY29kZT00MDQpCiAgICBkZWNrX25hbWUgPSByb3dbMF0KCiAgICBjdXIuZXhlY3V0ZSgiIiIKICAgICAgICBTRUxFQ1QgZGMuY2FyZF9uYW1lLCBkYy5xdWFudGl0eSwKICAgICAgICAgICAgICAgY2UudHlwZV9saW5lLCBjZS5jbWMsIGNlLnBvd2VyLCBjZS50b3VnaG5lc3MsCiAgICAgICAgICAgICAgIGNlLm9yYWNsZV90ZXh0LCBjZS5rZXl3b3JkcywgY2UubWFuYV9jb3N0CiAgICAgICAgRlJPTSBkZWNrX2NhcmRzIGRjCiAgICAgICAgTEVGVCBKT0lOICgKICAgICAgICAgICAgU0VMRUNUIHNjcnlmYWxsX2lkLCB0eXBlX2xpbmUsIGNtYywgcG93ZXIsIHRvdWdobmVzcywKICAgICAgICAgICAgICAgICAgIG9yYWNsZV90ZXh0LCBrZXl3b3JkcywgbWFuYV9jb3N0CiAgICAgICAgICAgIEZST00gY29sbGVjdGlvbl9lbnRyaWVzIEdST1VQIEJZIHNjcnlmYWxsX2lkCiAgICAgICAgKSBjZSBPTiBjZS5zY3J5ZmFsbF9pZCA9IGRjLnNjcnlmYWxsX2lkCiAgICAgICAgV0hFUkUgZGMuZGVja19pZCA9ID8KICAgICIiIiwgKGRlY2tfaWQsKSkKICAgIGNhcmRfZGF0YSA9IFtdCiAgICBmb3IgciBpbiBjdXIuZmV0Y2hhbGwoKToKICAgICAgICBmb3IgXyBpbiByYW5nZShyWzFdIG9yIDEpOgogICAgICAgICAgICBjYXJkX2RhdGEuYXBwZW5kKHsKICAgICAgICAgICAgICAgICduYW1lJzogclswXSwKICAgICAgICAgICAgICAgICd0eXBlX2xpbmUnOiByWzJdIG9yICcnLAogICAgICAgICAgICAgICAgJ2NtYyc6IHJbM10gb3IgMCwKICAgICAgICAgICAgICAgICdwb3dlcic6IHJbNF0gb3IgJycsCiAgICAgICAgICAgICAgICAndG91Z2huZXNzJzogcls1XSBvciAnJywKICAgICAgICAgICAgICAgICdvcmFjbGVfdGV4dCc6IHJbNl0gb3IgJycsCiAgICAgICAgICAgICAgICAna2V5d29yZHMnOiByWzddIG9yICcnLAogICAgICAgICAgICAgICAgJ21hbmFfY29zdCc6IHJbOF0gb3IgJycsCiAgICAgICAgICAgIH0pCiAgICBpZiBub3QgY2FyZF9kYXRhOgogICAgICAgIHJldHVybiBKU09OUmVzcG9uc2UoeydlcnJvcic6ICdkZWNrIGhhcyBubyBjYXJkcyd9LCBzdGF0dXNfY29kZT00MDApCgogICAgc2ltX2lkID0gc3RyKF91dWlkLnV1aWQ0KCkpWzo4XQogICAgd2l0aCBfc2ltX2xvY2s6CiAgICAgICAgX3NpbV9ydW5zW3NpbV9pZF0gPSB7CiAgICAgICAgICAgICdzdGF0dXMnOiAncXVldWVkJywKICAgICAgICAgICAgJ2NvbXBsZXRlZCc6IDAsCiAgICAgICAgICAgICd0b3RhbCc6IG51bV9nYW1lcywKICAgICAgICAgICAgJ2RlY2tOYW1lJzogZGVja19uYW1lLAogICAgICAgICAgICAncmVzdWx0JzogTm9uZSwKICAgICAgICAgICAgJ2Vycm9yJzogTm9uZSwKICAgICAgICB9CgogICAgdCA9IF90aHJlYWRpbmcuVGhyZWFkKAogICAgICAgIHRhcmdldD1fcnVuX3NpbV90aHJlYWRfZGVlcHNlZWssCiAgICAgICAgYXJncz0oc2ltX2lkLCBjYXJkX2RhdGEsIG51bV9nYW1lcywgZGVja19uYW1lLCByZWNvcmRfbG9ncyksCiAgICAgICAgZGFlbW9uPVRydWUsCiAgICApCiAgICB0LnN0YXJ0KCkKCiAgICByZXR1cm4gSlNPTlJlc3BvbnNlKHsKICAgICAgICAnc2ltSWQnOiBzaW1faWQsCiAgICAgICAgJ3N0YXR1cyc6ICdxdWV1ZWQnLAogICAgICAgICd0b3RhbCc6IG51bV9nYW1lcywKICAgICAgICAnZGVja05hbWUnOiBkZWNrX25hbWUsCiAgICAgICAgJ29wcG9uZW50VHlwZSc6ICdkZWVwc2VlaycsCiAgICB9KQoKCiMg4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQCiMgQXV0byBEZWNrIEdlbmVyYXRvcgojIOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkAoKCmRlZiBfcmVzb2x2ZV9jb21tYW5kZXIocmVxOiBEZWNrR2VuZXJhdGlvblJlcXVlc3QpIC0+IGRpY3Q6CiAgICAiIiIKICAgIFJlc29sdmUgY29tbWFuZGVyIGluZm8gZnJvbSBhIERlY2tHZW5lcmF0aW9uUmVxdWVzdC4KICAgIFJldHVybnMgZGljdCB3aXRoOiBuYW1lLCBzY3J5ZmFsbF9pZCwgY29sb3JfaWRlbnRpdHksIHR5cGVfbGluZSwgbWFuYV9jb3N0LCBpbWFnZV91cmwKICAgICIiIgogICAgY29ubiA9IF9nZXRfZGJfY29ubigpCgogICAgIyBUcnkgc2NyeWZhbGxfaWQgZmlyc3QKICAgIGlmIHJlcS5jb21tYW5kZXJfc2NyeWZhbGxfaWQ6CiAgICAgICAgcm93ID0gY29ubi5leGVjdXRlKAogICAgICAgICAgICAiU0VMRUNUIG5hbWUsIHR5cGVfbGluZSwgY29sb3JfaWRlbnRpdHksIG1hbmFfY29zdCwgc2NyeWZhbGxfaWQgRlJPTSBjb2xsZWN0aW9uX2VudHJpZXMgV0hFUkUgc2NyeWZhbGxfaWQgPSA/IExJTUlUIDEiLAogICAgICAgICAgICAocmVxLmNvbW1hbmRlcl9zY3J5ZmFsbF9pZCwpCiAgICAgICAgKS5mZXRjaG9uZSgpCiAgICAgICAgaWYgcm93OgogICAgICAgICAgICBjaSA9IHJvd1siY29sb3JfaWRlbnRpdHkiXQogICAgICAgICAgICBpZiBpc2luc3RhbmNlKGNpLCBzdHIpOgogICAgICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgICAgIGNpID0ganNvbi5sb2FkcyhjaSkKICAgICAgICAgICAgICAgIGV4Y2VwdCBFeGNlcHRpb246CiAgICAgICAgICAgICAgICAgICAgY2kgPSBbXQogICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgIm5hbWUiOiByb3dbIm5hbWUiXSwKICAgICAgICAgICAgICAgICJzY3J5ZmFsbF9pZCI6IHJvd1sic2NyeWZhbGxfaWQiXSwKICAgICAgICAgICAgICAgICJjb2xvcl9pZGVudGl0eSI6IGNpLAogICAgICAgICAgICAgICAgInR5cGVfbGluZSI6IHJvd1sidHlwZV9saW5lIl0sCiAgICAgICAgICAgICAgICAibWFuYV9jb3N0Ijogcm93WyJtYW5hX2Nvc3QiXSBvciAiIiwKICAgICAgICAgICAgICAgICJpbWFnZV91cmwiOiBmImh0dHBzOi8vYXBpLnNjcnlmYWxsLmNvbS9jYXJkcy97cm93WydzY3J5ZmFsbF9pZCddfT9mb3JtYXQ9aW1hZ2UmdmVyc2lvbj1ub3JtYWwiLAogICAgICAgICAgICB9CiAgICAgICAgIyBGYWxsYmFjayB0byBTY3J5ZmFsbCBBUEkKICAgICAgICBfc2NyeWZhbGxfcmF0ZV9saW1pdCgpCiAgICAgICAgdHJ5OgogICAgICAgICAgICB1cmwgPSBmImh0dHBzOi8vYXBpLnNjcnlmYWxsLmNvbS9jYXJkcy97cmVxLmNvbW1hbmRlcl9zY3J5ZmFsbF9pZH0iCiAgICAgICAgICAgIHJxID0gUmVxdWVzdCh1cmwsIGhlYWRlcnM9eyJVc2VyLUFnZW50IjogIkNvbW1hbmRlckFJTGFiLzEuMCIsICJBY2NlcHQiOiAiYXBwbGljYXRpb24vanNvbiJ9KQogICAgICAgICAgICB3aXRoIHVybG9wZW4ocnEsIHRpbWVvdXQ9MTUpIGFzIHJlc3A6CiAgICAgICAgICAgICAgICBkYXRhID0ganNvbi5sb2FkcyhyZXNwLnJlYWQoKS5kZWNvZGUoInV0Zi04IikpCiAgICAgICAgICAgIHJldHVybiBfc2NyeWZhbGxfdG9fY29tbWFuZGVyKGRhdGEpCiAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbjoKICAgICAgICAgICAgcGFzcwoKICAgICMgVHJ5IG5hbWUgc2VhcmNoCiAgICBpZiByZXEuY29tbWFuZGVyX25hbWU6CiAgICAgICAgbmFtZV9sb3dlciA9IHJlcS5jb21tYW5kZXJfbmFtZS5zdHJpcCgpLmxvd2VyKCkKICAgICAgICByb3cgPSBjb25uLmV4ZWN1dGUoCiAgICAgICAgICAgICJTRUxFQ1QgbmFtZSwgdHlwZV9saW5lLCBjb2xvcl9pZGVudGl0eSwgbWFuYV9jb3N0LCBzY3J5ZmFsbF9pZCBGUk9NIGNvbGxlY3Rpb25fZW50cmllcyBXSEVSRSBMT1dFUihuYW1lKSA9ID8gTElNSVQgMSIsCiAgICAgICAgICAgIChuYW1lX2xvd2VyLCkKICAgICAgICApLmZldGNob25lKCkKICAgICAgICBpZiByb3c6CiAgICAgICAgICAgIGNpID0gcm93WyJjb2xvcl9pZGVudGl0eSJdCiAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UoY2ksIHN0cik6CiAgICAgICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICAgICAgY2kgPSBqc29uLmxvYWRzKGNpKQogICAgICAgICAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbjoKICAgICAgICAgICAgICAgICAgICBjaSA9IFtdCiAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICAibmFtZSI6IHJvd1sibmFtZSJdLAogICAgICAgICAgICAgICAgInNjcnlmYWxsX2lkIjogcm93WyJzY3J5ZmFsbF9pZCJdLAogICAgICAgICAgICAgICAgImNvbG9yX2lkZW50aXR5IjogY2ksCiAgICAgICAgICAgICAgICAidHlwZV9saW5lIjogcm93WyJ0eXBlX2xpbmUiXSwKICAgICAgICAgICAgICAgICJtYW5hX2Nvc3QiOiByb3dbIm1hbmFfY29zdCJdIG9yICIiLAogICAgICAgICAgICAgICAgImltYWdlX3VybCI6IGYiaHR0cHM6Ly9hcGkuc2NyeWZhbGwuY29tL2NhcmRzL3tyb3dbJ3NjcnlmYWxsX2lkJ119P2Zvcm1hdD1pbWFnZSZ2ZXJzaW9uPW5vcm1hbCIsCiAgICAgICAgICAgIH0KCiAgICAgICAgIyBGYWxsYmFjayB0byBTY3J5ZmFsbCBmdXp6eSBzZWFyY2gKICAgICAgICBfc2NyeWZhbGxfcmF0ZV9saW1pdCgpCiAgICAgICAgdHJ5OgogICAgICAgICAgICBpbXBvcnQgdXJsbGliLnBhcnNlCiAgICAgICAgICAgIGVuY29kZWQgPSB1cmxsaWIucGFyc2UucXVvdGUocmVxLmNvbW1hbmRlcl9uYW1lKQogICAgICAgICAgICB1cmwgPSBmImh0dHBzOi8vYXBpLnNjcnlmYWxsLmNvbS9jYXJkcy9uYW1lZD9mdXp6eT17ZW5jb2RlZH0iCiAgICAgICAgICAgIHJxID0gUmVxdWVzdCh1cmwsIGhlYWRlcnM9eyJVc2VyLUFnZW50IjogIkNvbW1hbmRlckFJTGFiLzEuMCIsICJBY2NlcHQiOiAiYXBwbGljYXRpb24vanNvbiJ9KQogICAgICAgICAgICB3aXRoIHVybG9wZW4ocnEsIHRpbWVvdXQ9MTUpIGFzIHJlc3A6CiAgICAgICAgICAgICAgICBkYXRhID0ganNvbi5sb2FkcyhyZXNwLnJlYWQoKS5kZWNvZGUoInV0Zi04IikpCiAgICAgICAgICAgIHJldHVybiBfc2NyeWZhbGxfdG9fY29tbWFuZGVyKGRhdGEpCiAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbjoKICAgICAgICAgICAgcGFzcwoKICAgIHJldHVybiBOb25lCgoKZGVmIF9zY3J5ZmFsbF90b19jb21tYW5kZXIoZGF0YTogZGljdCkgLT4gZGljdDoKICAgICIiIkNvbnZlcnQgU2NyeWZhbGwgQVBJIHJlc3BvbnNlIHRvIGNvbW1hbmRlciBpbmZvIGRpY3QuIiIiCiAgICBjaSA9IGRhdGEuZ2V0KCJjb2xvcl9pZGVudGl0eSIsIFtdKQogICAgaW1hZ2VfdXJpcyA9IGRhdGEuZ2V0KCJpbWFnZV91cmlzIiwge30pCiAgICBpZiBub3QgaW1hZ2VfdXJpcyBhbmQgZGF0YS5nZXQoImNhcmRfZmFjZXMiKToKICAgICAgICBpbWFnZV91cmlzID0gZGF0YVsiY2FyZF9mYWNlcyJdWzBdLmdldCgiaW1hZ2VfdXJpcyIsIHt9KQogICAgcmV0dXJuIHsKICAgICAgICAibmFtZSI6IGRhdGEuZ2V0KCJuYW1lIiwgIiIpLAogICAgICAgICJzY3J5ZmFsbF9pZCI6IGRhdGEuZ2V0KCJpZCIsICIiKSwKICAgICAgICAiY29sb3JfaWRlbnRpdHkiOiBjaSwKICAgICAgICAidHlwZV9saW5lIjogZGF0YS5nZXQoInR5cGVfbGluZSIsICIiKSwKICAgICAgICAibWFuYV9jb3N0IjogZGF0YS5nZXQoIm1hbmFfY29zdCIsICIiKSwKICAgICAgICAiaW1hZ2VfdXJsIjogaW1hZ2VfdXJpcy5nZXQoIm5vcm1hbCIsICIiKSwKICAgIH0KCgpkZWYgX2dldF9jb2xsZWN0aW9uX2Zvcl9jb2xvcnMoY29sb3JfaWRlbnRpdHk6IGxpc3QpIC0+IGxpc3Q6CiAgICAiIiIKICAgIEZldGNoIGFsbCBjb2xsZWN0aW9uIGNhcmRzIGNvbXBhdGlibGUgd2l0aCB0aGUgZ2l2ZW4gY29sb3IgaWRlbnRpdHkuCiAgICBSZXR1cm5zIGxpc3Qgb2YgZGljdHMgd2l0aCBjYXJkIGRldGFpbHMuCiAgICAiIiIKICAgIGNvbm4gPSBfZ2V0X2RiX2Nvbm4oKQogICAgcm93cyA9IGNvbm4uZXhlY3V0ZSgKICAgICAgICAiU0VMRUNUICogRlJPTSBjb2xsZWN0aW9uX2VudHJpZXMgV0hFUkUgcXVhbnRpdHkgPiAwIgogICAgKS5mZXRjaGFsbCgpCgogICAgdmFsaWQgPSBbXQogICAgZm9yIHJvdyBpbiByb3dzOgogICAgICAgIGNhcmQgPSBfcm93X3RvX2RpY3Qocm93KQogICAgICAgIGNhcmRfY2kgPSBjYXJkLmdldCgiY29sb3JfaWRlbnRpdHkiLCBbXSkKICAgICAgICBpZiBpc2luc3RhbmNlKGNhcmRfY2ksIHN0cik6CiAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgIGNhcmRfY2kgPSBqc29uLmxvYWRzKGNhcmRfY2kpCiAgICAgICAgICAgIGV4Y2VwdCBFeGNlcHRpb246CiAgICAgICAgICAgICAgICBjYXJkX2NpID0gW10KCiAgICAgICAgIyBDb2xvciBpZGVudGl0eSBjaGVjazogYWxsIGNhcmQgY29sb3JzIG11c3QgYmUgd2l0aGluIGNvbW1hbmRlcidzIGlkZW50aXR5CiAgICAgICAgaWYgY29sb3JfaWRlbnRpdHkgYW5kIGNhcmRfY2k6CiAgICAgICAgICAgIGlmIG5vdCBhbGwoYyBpbiBjb2xvcl9pZGVudGl0eSBmb3IgYyBpbiBjYXJkX2NpKToKICAgICAgICAgICAgICAgIGNvbnRpbnVlCgogICAgICAgICMgU2tpcCBpZiBubyBzY3J5ZmFsbF9pZAogICAgICAgIGlmIG5vdCBjYXJkLmdldCgic2NyeWZhbGxfaWQiKToKICAgICAgICAgICAgY29udGludWUKCiAgICAgICAgY2FyZFsiY29sb3JfaWRlbnRpdHkiXSA9IGNhcmRfY2kKICAgICAgICB2YWxpZC5hcHBlbmQoY2FyZCkKCiAgICByZXR1cm4gdmFsaWQKCgpkZWYgX2dlbmVyYXRlX2RlY2socmVxOiBEZWNrR2VuZXJhdGlvblJlcXVlc3QpIC0+IGRpY3Q6CiAgICAiIiIKICAgIENvcmUgZGVjayBnZW5lcmF0aW9uIGFsZ29yaXRobS4KCiAgICAxLiBSZXNvbHZlIGNvbW1hbmRlcgogICAgMi4gTG9hZCBjb2xsZWN0aW9uIGZpbHRlcmVkIHRvIGNvbG9yIGlkZW50aXR5CiAgICAzLiBDYWxsIGVuYWJsZWQgc291cmNlIGFkYXB0ZXJzIChzdHViYmVkKQogICAgNC4gQnVpbGQgY2FuZGlkYXRlIHBvb2wsIHNjb3JlIGJ5IHJvbGUvdHlwZSBmaXQKICAgIDUuIEZpbGwgc2xvdHMgcGVyIHRhcmdldCByYXRpb3MsIHByZWZlcnJpbmcgb3duZWQgY2FyZHMKICAgIDYuIFJldHVybiByZXNwb25zZSBkaWN0CiAgICAiIiIKICAgICMgMS4gUmVzb2x2ZSBjb21tYW5kZXIKICAgIGNvbW1hbmRlciA9IF9yZXNvbHZlX2NvbW1hbmRlcihyZXEpCiAgICBpZiBub3QgY29tbWFuZGVyOgogICAgICAgIHJldHVybiB7ImVycm9yIjogIkNvbW1hbmRlciBub3QgZm91bmQuIFBsZWFzZSBjaGVjayB0aGUgbmFtZSBvciBTY3J5ZmFsbCBJRC4ifQoKICAgIGNvbG9yX2lkZW50aXR5ID0gcmVxLmNvbG9yX2lkZW50aXR5IG9yIGNvbW1hbmRlci5nZXQoImNvbG9yX2lkZW50aXR5IiwgW10pCiAgICBsb2dfZGVja2dlbi5pbmZvKGYiICBDb21tYW5kZXI6IHtjb21tYW5kZXJbJ25hbWUnXX0sIENJOiB7Y29sb3JfaWRlbnRpdHl9IikKCiAgICAjIDIuIExvYWQgY29sbGVjdGlvbgogICAgY29sbGVjdGlvbiA9IF9nZXRfY29sbGVjdGlvbl9mb3JfY29sb3JzKGNvbG9yX2lkZW50aXR5KQogICAgbG9nX2RlY2tnZW4uaW5mbyhmIiAge2xlbihjb2xsZWN0aW9uKX0gY2FyZHMgaW4gY29sbGVjdGlvbiBtYXRjaCBjb2xvciBpZGVudGl0eSIpCgogICAgIyAzLiBDYWxsIHNvdXJjZSBhZGFwdGVycyAoY3VycmVudGx5IHN0dWJiZWQpCiAgICB0ZW1wbGF0ZV9jYXJkcyA9IFtdICAjIGxpc3Qgb2YgKG5hbWUsIHdlaWdodCwgc291cmNlX25hbWUpCiAgICBzb3VyY2VzID0gcmVxLnNvdXJjZXMgb3IgRGVja0dlbmVyYXRpb25Tb3VyY2VDb25maWcoKQoKICAgIHRyeToKICAgICAgICBpZiBzb3VyY2VzLnVzZV9hcmNoaWRla3Q6CiAgICAgICAgICAgIGZyb20gZGVja19zb3VyY2VzLmFyY2hpZGVrdF9hZGFwdGVyIGltcG9ydCBmZXRjaF90ZW1wbGF0ZV9kZWNrcyBhcyBhcmNoaWRla3RfZmV0Y2gKICAgICAgICAgICAgZm9yIHRkIGluIGFyY2hpZGVrdF9mZXRjaChjb21tYW5kZXJbIm5hbWUiXSwgY29sb3JfaWRlbnRpdHksIHsidXJsIjogc291cmNlcy5hcmNoaWRla3RfdXJsfSk6CiAgICAgICAgICAgICAgICBmb3IgdGMgaW4gdGQuY2FyZHM6CiAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGVfY2FyZHMuYXBwZW5kKCh0Yy5uYW1lLCB0Yy5xdWFudGl0eSwgImFyY2hpZGVrdCIpKQogICAgZXhjZXB0IEV4Y2VwdGlvbiBhcyBlOgogICAgICAgIGxvZ19kZWNrZ2VuLmVycm9yKGYiICBBcmNoaWRla3QgYWRhcHRlciBlcnJvcjoge2V9IikKCiAgICB0cnk6CiAgICAgICAgaWYgc291cmNlcy51c2VfZWRocmVjOgogICAgICAgICAgICBmcm9tIGRlY2tfc291cmNlcy5lZGhyZWNfYWRhcHRlciBpbXBvcnQgZmV0Y2hfdGVtcGxhdGVfZGVja3MgYXMgZWRocmVjX2ZldGNoCiAgICAgICAgICAgIGZvciB0ZCBpbiBlZGhyZWNfZmV0Y2goY29tbWFuZGVyWyJuYW1lIl0sIGNvbG9yX2lkZW50aXR5KToKICAgICAgICAgICAgICAgIGZvciB0YyBpbiB0ZC5jYXJkczoKICAgICAgICAgICAgICAgICAgICB0ZW1wbGF0ZV9jYXJkcy5hcHBlbmQoKHRjLm5hbWUsIHRjLnF1YW50aXR5LCAiZWRocmVjIikpCiAgICBleGNlcHQgRXhjZXB0aW9uIGFzIGU6CiAgICAgICAgbG9nX2RlY2tnZW4uZXJyb3IoZiIgIEVESFJFQyBhZGFwdGVyIGVycm9yOiB7ZX0iKQoKICAgIHRyeToKICAgICAgICBpZiBzb3VyY2VzLnVzZV9tb3hmaWVsZDoKICAgICAgICAgICAgZnJvbSBkZWNrX3NvdXJjZXMubW94ZmllbGRfYWRhcHRlciBpbXBvcnQgZmV0Y2hfdGVtcGxhdGVfZGVja3MgYXMgbW94ZmllbGRfZmV0Y2gKICAgICAgICAgICAgZm9yIHRkIGluIG1veGZpZWxkX2ZldGNoKGNvbW1hbmRlclsibmFtZSJdLCBjb2xvcl9pZGVudGl0eSwgeyJ1cmwiOiBzb3VyY2VzLm1veGZpZWxkX3VybH0pOgogICAgICAgICAgICAgICAgZm9yIHRjIGluIHRkLmNhcmRzOgogICAgICAgICAgICAgICAgICAgIHRlbXBsYXRlX2NhcmRzLmFwcGVuZCgodGMubmFtZSwgdGMucXVhbnRpdHksICJtb3hmaWVsZCIpKQogICAgZXhjZXB0IEV4Y2VwdGlvbiBhcyBlOgogICAgICAgIGxvZ19kZWNrZ2VuLmVycm9yKGYiICBNb3hmaWVsZCBhZGFwdGVyIGVycm9yOiB7ZX0iKQoKICAgIHRyeToKICAgICAgICBpZiBzb3VyY2VzLnVzZV9tdGdnb2xkZmlzaDoKICAgICAgICAgICAgZnJvbSBkZWNrX3NvdXJjZXMubXRnZ29sZGZpc2hfYWRhcHRlciBpbXBvcnQgZmV0Y2hfdGVtcGxhdGVfZGVja3MgYXMgbXRnZ29sZGZpc2hfZmV0Y2gKICAgICAgICAgICAgZm9yIHRkIGluIG10Z2dvbGRmaXNoX2ZldGNoKGNvbW1hbmRlclsibmFtZSJdLCBjb2xvcl9pZGVudGl0eSwgeyJ1cmwiOiBzb3VyY2VzLm10Z2dvbGRmaXNoX3VybH0pOgogICAgICAgICAgICAgICAgZm9yIHRjIGluIHRkLmNhcmRzOgogICAgICAgICAgICAgICAgICAgIHRlbXBsYXRlX2NhcmRzLmFwcGVuZCgodGMubmFtZSwgdGMucXVhbnRpdHksICJtdGdnb2xkZmlzaCIpKQogICAgZXhjZXB0IEV4Y2VwdGlvbiBhcyBlOgogICAgICAgIGxvZ19kZWNrZ2VuLmVycm9yKGYiICBNVEdHb2xkZmlzaCBhZGFwdGVyIGVycm9yOiB7ZX0iKQoKICAgICMgNC4gQnVpbGQgY2FuZGlkYXRlIHBvb2wgZnJvbSBjb2xsZWN0aW9uLCBzY29yZWQgYnkgdHlwZSBuZWVkCiAgICAjICAgIEJ1aWxkIGEgbWFwOiBuYW1lX2xvd2VyIC0+IGNhcmQgZGljdCAoZGVkdXBlZCkKICAgIGNhbmRpZGF0ZV9tYXAgPSB7fQogICAgZm9yIGNhcmQgaW4gY29sbGVjdGlvbjoKICAgICAgICBuYW1lID0gY2FyZC5nZXQoIm5hbWUiLCAiIikKICAgICAgICBpZiBub3QgbmFtZToKICAgICAgICAgICAgY29udGludWUKICAgICAgICBrZXkgPSBuYW1lLmxvd2VyKCkKICAgICAgICAjIFNraXAgdGhlIGNvbW1hbmRlciBpdHNlbGYKICAgICAgICBpZiBrZXkgPT0gY29tbWFuZGVyWyJuYW1lIl0ubG93ZXIoKToKICAgICAgICAgICAgY29udGludWUKICAgICAgICBpZiBrZXkgbm90IGluIGNhbmRpZGF0ZV9tYXA6CiAgICAgICAgICAgIHR5cGVfbGluZSA9IGNhcmQuZ2V0KCJ0eXBlX2xpbmUiLCAiIikKICAgICAgICAgICAgY2FyZF90eXBlID0gX2NsYXNzaWZ5X2NhcmRfdHlwZSh0eXBlX2xpbmUpCiAgICAgICAgICAgIGNhcmRfcm9sZXMgPSBfZGV0ZWN0X2NhcmRfcm9sZXMoCiAgICAgICAgICAgICAgICBjYXJkLmdldCgib3JhY2xlX3RleHQiLCAiIiksCiAgICAgICAgICAgICAgICB0eXBlX2xpbmUsCiAgICAgICAgICAgICAgICBjYXJkLmdldCgia2V5d29yZHMiLCBbXSkKICAgICAgICAgICAgKQogICAgICAgICAgICBjYW5kaWRhdGVfbWFwW2tleV0gPSB7CiAgICAgICAgICAgICAgICAic2NyeWZhbGxfaWQiOiBjYXJkLmdldCgic2NyeWZhbGxfaWQiLCAiIiksCiAgICAgICAgICAgICAgICAibmFtZSI6IG5hbWUsCiAgICAgICAgICAgICAgICAidHlwZV9saW5lIjogdHlwZV9saW5lLAogICAgICAgICAgICAgICAgIm1hbmFfY29zdCI6IGNhcmQuZ2V0KCJtYW5hX2Nvc3QiLCAiIiksCiAgICAgICAgICAgICAgICAiY21jIjogZmxvYXQoY2FyZC5nZXQoImNtYyIsIDApKSwKICAgICAgICAgICAgICAgICJjYXJkX3R5cGUiOiBjYXJkX3R5cGUsCiAgICAgICAgICAgICAgICAicm9sZXMiOiBjYXJkX3JvbGVzLAogICAgICAgICAgICAgICAgInNvdXJjZSI6ICJjb2xsZWN0aW9uIiwKICAgICAgICAgICAgICAgICJxdWFudGl0eSI6IDEsCiAgICAgICAgICAgICAgICAib3duZWRfcXR5IjogaW50KGNhcmQuZ2V0KCJxdWFudGl0eSIsIDApKSwKICAgICAgICAgICAgICAgICJpc19wcm94eSI6IEZhbHNlLAogICAgICAgICAgICAgICAgImVkaHJlY19yYW5rIjogaW50KGNhcmQuZ2V0KCJlZGhyZWNfcmFuayIsIDk5OTk5KSksCiAgICAgICAgICAgICAgICAiaW1hZ2VfdXJsIjogZiJodHRwczovL2FwaS5zY3J5ZmFsbC5jb20vY2FyZHMve2NhcmQuZ2V0KCdzY3J5ZmFsbF9pZCcsICcnKX0/Zm9ybWF0PWltYWdlJnZlcnNpb249bm9ybWFsIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIGNhcmQuZ2V0KCJzY3J5ZmFsbF9pZCIpIGVsc2UgIiIsCiAgICAgICAgICAgIH0KICAgICAgICBlbHNlOgogICAgICAgICAgICAjIE1lcmdlIHF1YW50aXRpZXMKICAgICAgICAgICAgY2FuZGlkYXRlX21hcFtrZXldWyJvd25lZF9xdHkiXSArPSBpbnQoY2FyZC5nZXQoInF1YW50aXR5IiwgMCkpCgogICAgIyBBZGQgdGVtcGxhdGUgY2FyZHMgdGhhdCBhcmVuJ3QgaW4gY29sbGVjdGlvbiAoYXMgcG90ZW50aWFsIHByb3hpZXMpCiAgICBmb3IgdG5hbWUsIHRxdHksIHRzb3VyY2UgaW4gdGVtcGxhdGVfY2FyZHM6CiAgICAgICAga2V5ID0gdG5hbWUubG93ZXIoKQogICAgICAgIGlmIGtleSA9PSBjb21tYW5kZXJbIm5hbWUiXS5sb3dlcigpOgogICAgICAgICAgICBjb250aW51ZQogICAgICAgIGlmIGtleSBpbiBjYW5kaWRhdGVfbWFwOgogICAgICAgICAgICAjIEJvb3N0IHByaW9yaXR5IGZvciBjYXJkcyB0aGF0IGFwcGVhciBpbiB0ZW1wbGF0ZXMKICAgICAgICAgICAgY2FuZGlkYXRlX21hcFtrZXldWyJfdGVtcGxhdGVfd2VpZ2h0Il0gPSBjYW5kaWRhdGVfbWFwW2tleV0uZ2V0KCJfdGVtcGxhdGVfd2VpZ2h0IiwgMCkgKyB0cXR5CiAgICAgICAgICAgIGlmIGNhbmRpZGF0ZV9tYXBba2V5XVsic291cmNlIl0gPT0gImNvbGxlY3Rpb24iOgogICAgICAgICAgICAgICAgY2FuZGlkYXRlX21hcFtrZXldWyJzb3VyY2UiXSA9IGYiY29sbGVjdGlvbit7dHNvdXJjZX0iCiAgICAgICAgZWxpZiByZXEuYWxsb3dfcHJveGllczoKICAgICAgICAgICAgY2FuZGlkYXRlX21hcFtrZXldID0gewogICAgICAgICAgICAgICAgInNjcnlmYWxsX2lkIjogIiIsCiAgICAgICAgICAgICAgICAibmFtZSI6IHRuYW1lLAogICAgICAgICAgICAgICAgInR5cGVfbGluZSI6ICIiLAogICAgICAgICAgICAgICAgIm1hbmFfY29zdCI6ICIiLAogICAgICAgICAgICAgICAgImNtYyI6IDAsCiAgICAgICAgICAgICAgICAiY2FyZF90eXBlIjogIk90aGVyIiwKICAgICAgICAgICAgICAgICJyb2xlcyI6IFtdLAogICAgICAgICAgICAgICAgInNvdXJjZSI6IHRzb3VyY2UsCiAgICAgICAgICAgICAgICAicXVhbnRpdHkiOiAxLAogICAgICAgICAgICAgICAgIm93bmVkX3F0eSI6IDAsCiAgICAgICAgICAgICAgICAiaXNfcHJveHkiOiBUcnVlLAogICAgICAgICAgICAgICAgImVkaHJlY19yYW5rIjogOTk5OTksCiAgICAgICAgICAgICAgICAiaW1hZ2VfdXJsIjogIiIsCiAgICAgICAgICAgICAgICAiX3RlbXBsYXRlX3dlaWdodCI6IHRxdHksCiAgICAgICAgICAgIH0KCiAgICAjIDUuIEZpbGwgc2xvdHMgcGVyIHRhcmdldCByYXRpb3MKICAgIHRhcmdldHMgPSB7CiAgICAgICAgIkxhbmQiOiByZXEudGFyZ2V0X2xhbmRfY291bnQsCiAgICAgICAgIkNyZWF0dXJlIjogcmVxLnRhcmdldF9jcmVhdHVyZV9jb3VudCwKICAgICAgICAiSW5zdGFudCI6IHJlcS50YXJnZXRfaW5zdGFudF9jb3VudCwKICAgICAgICAiU29yY2VyeSI6IHJlcS50YXJnZXRfc29yY2VyeV9jb3VudCwKICAgICAgICAiQXJ0aWZhY3QiOiByZXEudGFyZ2V0X2FydGlmYWN0X2NvdW50LAogICAgICAgICJFbmNoYW50bWVudCI6IHJlcS50YXJnZXRfZW5jaGFudG1lbnRfY291bnQsCiAgICAgICAgIlBsYW5lc3dhbGtlciI6IHJlcS50YXJnZXRfcGxhbmVzd2Fsa2VyX2NvdW50LAogICAgfQoKICAgICMgR3JvdXAgY2FuZGlkYXRlcyBieSB0eXBlCiAgICBieV90eXBlID0ge30KICAgIGZvciBjYXJkIGluIGNhbmRpZGF0ZV9tYXAudmFsdWVzKCk6CiAgICAgICAgY3QgPSBjYXJkWyJjYXJkX3R5cGUiXQogICAgICAgIGJ5X3R5cGUuc2V0ZGVmYXVsdChjdCwgW10pLmFwcGVuZChjYXJkKQoKICAgICMgU2NvcmUgYW5kIHNvcnQgY2FuZGlkYXRlcyB3aXRoaW4gZWFjaCB0eXBlCiAgICBmb3IgY3QsIGNhcmRzIGluIGJ5X3R5cGUuaXRlbXMoKToKICAgICAgICBmb3IgY2FyZCBpbiBjYXJkczoKICAgICAgICAgICAgc2NvcmUgPSAwCiAgICAgICAgICAgICMgUHJlZmVyIG93bmVkIGNhcmRzIGhlYXZpbHkKICAgICAgICAgICAgaWYgY2FyZFsib3duZWRfcXR5Il0gPiAwOgogICAgICAgICAgICAgICAgc2NvcmUgKz0gMTAwCiAgICAgICAgICAgICMgUHJlZmVyIGNhcmRzIHdpdGggZnVuY3Rpb25hbCByb2xlcwogICAgICAgICAgICBmb3IgciBpbiBjYXJkLmdldCgicm9sZXMiLCBbXSk6CiAgICAgICAgICAgICAgICBpZiByIGluICgiUmFtcCIsICJEcmF3IiwgIlJlbW92YWwiLCAiQm9hcmRXaXBlIik6CiAgICAgICAgICAgICAgICAgICAgc2NvcmUgKz0gMTAKICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgc2NvcmUgKz0gMwogICAgICAgICAgICAjIFByZWZlciBsb3dlciBFREhSRUMgcmFuayAobW9yZSBwb3B1bGFyIGNhcmRzKQogICAgICAgICAgICBlZGhyZWNfcmFuayA9IGNhcmQuZ2V0KCJlZGhyZWNfcmFuayIsIDk5OTk5KQogICAgICAgICAgICBpZiBlZGhyZWNfcmFuayA8IDUwMDoKICAgICAgICAgICAgICAgIHNjb3JlICs9IDE1CiAgICAgICAgICAgIGVsaWYgZWRocmVjX3JhbmsgPCAyMDAwOgogICAgICAgICAgICAgICAgc2NvcmUgKz0gMTAKICAgICAgICAgICAgZWxpZiBlZGhyZWNfcmFuayA8IDUwMDA6CiAgICAgICAgICAgICAgICBzY29yZSArPSA1CiAgICAgICAgICAgICMgUHJlZmVyIGNhcmRzIGZyb20gdGVtcGxhdGVzCiAgICAgICAgICAgIHNjb3JlICs9IGNhcmQuZ2V0KCJfdGVtcGxhdGVfd2VpZ2h0IiwgMCkgKiA1CiAgICAgICAgICAgICMgUHJlZmVyIGxvd2VyIENNQyAoY3VydmUgb3B0aW1pemF0aW9uKQogICAgICAgICAgICBjbWMgPSBjYXJkLmdldCgiY21jIiwgMCkKICAgICAgICAgICAgaWYgY21jIDw9IDI6CiAgICAgICAgICAgICAgICBzY29yZSArPSA1CiAgICAgICAgICAgIGVsaWYgY21jIDw9IDQ6CiAgICAgICAgICAgICAgICBzY29yZSArPSAzCiAgICAgICAgICAgIGNhcmRbIl9zY29yZSJdID0gc2NvcmUKICAgICAgICBjYXJkcy5zb3J0KGtleT1sYW1iZGEgeDogeFsiX3Njb3JlIl0sIHJldmVyc2U9VHJ1ZSkKCiAgICAjIFBpY2sgY2FyZHMgZm9yIGVhY2ggc2xvdCB0eXBlCiAgICBkZWNrX2NhcmRzID0gW10KICAgIHVzZWRfbmFtZXMgPSBzZXQoKSAgIyB0cmFjayBieSBuYW1lIHRvIGF2b2lkIGR1cGxpY2F0ZXMKCiAgICBmb3IgY2FyZF90eXBlLCB0YXJnZXQgaW4gdGFyZ2V0cy5pdGVtcygpOgogICAgICAgIGNhbmRpZGF0ZXMgPSBieV90eXBlLmdldChjYXJkX3R5cGUsIFtdKQogICAgICAgIHBpY2tlZCA9IDAKICAgICAgICBmb3IgY2FyZCBpbiBjYW5kaWRhdGVzOgogICAgICAgICAgICBpZiBwaWNrZWQgPj0gdGFyZ2V0OgogICAgICAgICAgICAgICAgYnJlYWsKICAgICAgICAgICAgbmFtZV9rZXkgPSBjYXJkWyJuYW1lIl0ubG93ZXIoKQogICAgICAgICAgICBpZiBuYW1lX2tleSBpbiB1c2VkX25hbWVzOgogICAgICAgICAgICAgICAgY29udGludWUKICAgICAgICAgICAgIyBJZiBvbmx5IGNvbGxlY3Rpb24sIHNraXAgcHJveGllcwogICAgICAgICAgICBpZiByZXEub25seV9jYXJkc19pbl9jb2xsZWN0aW9uIGFuZCBjYXJkWyJvd25lZF9xdHkiXSA8PSAwOgogICAgICAgICAgICAgICAgY29udGludWUKICAgICAgICAgICAgdXNlZF9uYW1lcy5hZGQobmFtZV9rZXkpCiAgICAgICAgICAgIGRlY2tfY2FyZHMuYXBwZW5kKGNhcmQpCiAgICAgICAgICAgIHBpY2tlZCArPSAxCgogICAgIyBGaWxsIHJlbWFpbmluZyBzbG90cyB1cCB0byA5OSAoY29tbWFuZGVyIGlzICMxMDApCiAgICB0b3RhbCA9IHN1bSh0YXJnZXRzLnZhbHVlcygpKQogICAgaWYgdG90YWwgPCA5OToKICAgICAgICByZW1haW5pbmcgPSA5OSAtIGxlbihkZWNrX2NhcmRzKQogICAgICAgICMgRmlsbCB3aXRoIGJlc3QgcmVtYWluaW5nIGNhcmRzIGZyb20gYW55IHR5cGUKICAgICAgICBhbGxfcmVtYWluaW5nID0gW10KICAgICAgICBmb3IgY3QsIGNhcmRzIGluIGJ5X3R5cGUuaXRlbXMoKToKICAgICAgICAgICAgZm9yIGNhcmQgaW4gY2FyZHM6CiAgICAgICAgICAgICAgICBpZiBjYXJkWyJuYW1lIl0ubG93ZXIoKSBub3QgaW4gdXNlZF9uYW1lczoKICAgICAgICAgICAgICAgICAgICBpZiBub3QgcmVxLm9ubHlfY2FyZHNfaW5fY29sbGVjdGlvbiBvciBjYXJkWyJvd25lZF9xdHkiXSA+IDA6CiAgICAgICAgICAgICAgICAgICAgICAgIGFsbF9yZW1haW5pbmcuYXBwZW5kKGNhcmQpCiAgICAgICAgYWxsX3JlbWFpbmluZy5zb3J0KGtleT1sYW1iZGEgeDogeC5nZXQoIl9zY29yZSIsIDApLCByZXZlcnNlPVRydWUpCiAgICAgICAgZm9yIGNhcmQgaW4gYWxsX3JlbWFpbmluZ1s6cmVtYWluaW5nXToKICAgICAgICAgICAgdXNlZF9uYW1lcy5hZGQoY2FyZFsibmFtZSJdLmxvd2VyKCkpCiAgICAgICAgICAgIGRlY2tfY2FyZHMuYXBwZW5kKGNhcmQpCiAgICBlbGlmIGxlbihkZWNrX2NhcmRzKSA+IDk5OgogICAgICAgIGRlY2tfY2FyZHMgPSBkZWNrX2NhcmRzWzo5OV0KCiAgICAjIDYuIENvbXB1dGUgc3RhdHMKICAgIHN0YXRzID0geyJ0b3RhbCI6IGxlbihkZWNrX2NhcmRzKSArIDEsICJsYW5kIjogMCwgIm5vbmxhbmQiOiAwLCAiYnlfdHlwZSI6IHt9LCAib3duZWQiOiAwLCAicHJveHkiOiAwfQogICAgZm9yIGNhcmQgaW4gZGVja19jYXJkczoKICAgICAgICBjdCA9IGNhcmQuZ2V0KCJjYXJkX3R5cGUiLCAiT3RoZXIiKQogICAgICAgIHN0YXRzWyJieV90eXBlIl1bY3RdID0gc3RhdHNbImJ5X3R5cGUiXS5nZXQoY3QsIDApICsgMQogICAgICAgIGlmIGN0ID09ICJMYW5kIjoKICAgICAgICAgICAgc3RhdHNbImxhbmQiXSArPSAxCiAgICAgICAgZWxzZToKICAgICAgICAgICAgc3RhdHNbIm5vbmxhbmQiXSArPSAxCiAgICAgICAgaWYgY2FyZC5nZXQoIm93bmVkX3F0eSIsIDApID4gMDoKICAgICAgICAgICAgc3RhdHNbIm93bmVkIl0gKz0gMQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHN0YXRzWyJwcm94eSJdICs9IDEKCiAgICAjIENsZWFuIHVwIGludGVybmFsIHNjb3Jpbmcga2V5cwogICAgY2xlYW5fY2FyZHMgPSBbXQogICAgZm9yIGNhcmQgaW4gZGVja19jYXJkczoKICAgICAgICBjbGVhbl9jYXJkcy5hcHBlbmQoewogICAgICAgICAgICAic2NyeWZhbGxfaWQiOiBjYXJkLmdldCgic2NyeWZhbGxfaWQiLCAiIiksCiAgICAgICAgICAgICJuYW1lIjogY2FyZC5nZXQoIm5hbWUiLCAiIiksCiAgICAgICAgICAgICJ0eXBlX2xpbmUiOiBjYXJkLmdldCgidHlwZV9saW5lIiwgIiIpLAogICAgICAgICAgICAibWFuYV9jb3N0IjogY2FyZC5nZXQoIm1hbmFfY29zdCIsICIiKSwKICAgICAgICAgICAgImNtYyI6IGNhcmQuZ2V0KCJjbWMiLCAwKSwKICAgICAgICAgICAgImNhcmRfdHlwZSI6IGNhcmQuZ2V0KCJjYXJkX3R5cGUiLCAiT3RoZXIiKSwKICAgICAgICAgICAgInJvbGVzIjogY2FyZC5nZXQoInJvbGVzIiwgW10pLAogICAgICAgICAgICAic291cmNlIjogY2FyZC5nZXQoInNvdXJjZSIsICJjb2xsZWN0aW9uIiksCiAgICAgICAgICAgICJxdWFudGl0eSI6IDEsCiAgICAgICAgICAgICJpbWFnZV91cmwiOiBjYXJkLmdldCgiaW1hZ2VfdXJsIiwgIiIpLAogICAgICAgICAgICAib3duZWRfcXR5IjogY2FyZC5nZXQoIm93bmVkX3F0eSIsIDApLAogICAgICAgICAgICAiaXNfcHJveHkiOiBjYXJkLmdldCgiaXNfcHJveHkiLCBGYWxzZSksCiAgICAgICAgfSkKCiAgICBsb2dfZGVja2dlbi5pbmZvKGYiICBHZW5lcmF0ZWQgZGVjazoge2xlbihjbGVhbl9jYXJkcyl9IGNhcmRzICsgY29tbWFuZGVyIikKICAgIGxvZ19kZWNrZ2VuLmluZm8oZiIgIFN0YXRzOiB7c3RhdHN9IikKCiAgICByZXR1cm4gewogICAgICAgICJjb21tYW5kZXIiOiBjb21tYW5kZXIsCiAgICAgICAgImNvbG9yX2lkZW50aXR5IjogY29sb3JfaWRlbnRpdHksCiAgICAgICAgImNhcmRzIjogY2xlYW5fY2FyZHMsCiAgICAgICAgInN0YXRzIjogc3RhdHMsCiAgICAgICAgInRhcmdldHMiOiB0YXJnZXRzLAogICAgfQoKCkBhcHAuZ2V0KCIvYXBpL2RlY2stZ2VuZXJhdG9yL2NvbmZpZyIpCmFzeW5jIGRlZiBkZWNrX2dlbmVyYXRvcl9jb25maWcoKToKICAgICIiIgogICAgUmV0dXJuIGRlZmF1bHQgcmF0aW9zLCBzdXBwb3J0ZWQgc291cmNlcywgYW5kIGxpbWl0cy4KICAgIFVzZWQgYnkgdGhlIGZyb250ZW5kIHRvIHByZWZpbGwgdGhlIGdlbmVyYXRvciBmb3JtLgogICAgIiIiCiAgICByZXR1cm4gewogICAgICAgICJkZWZhdWx0cyI6IHsKICAgICAgICAgICAgInRhcmdldF9sYW5kX2NvdW50IjogMzcsCiAgICAgICAgICAgICJ0YXJnZXRfaW5zdGFudF9jb3VudCI6IDEwLAogICAgICAgICAgICAidGFyZ2V0X3NvcmNlcnlfY291bnQiOiA4LAogICAgICAgICAgICAidGFyZ2V0X2FydGlmYWN0X2NvdW50IjogMTAsCiAgICAgICAgICAgICJ0YXJnZXRfZW5jaGFudG1lbnRfY291bnQiOiA4LAogICAgICAgICAgICAidGFyZ2V0X2NyZWF0dXJlX2NvdW50IjogMjUsCiAgICAgICAgICAgICJ0YXJnZXRfcGxhbmVzd2Fsa2VyX2NvdW50IjogMiwKICAgICAgICAgICAgIm9ubHlfY2FyZHNfaW5fY29sbGVjdGlvbiI6IEZhbHNlLAogICAgICAgICAgICAiYWxsb3dfcHJveGllcyI6IFRydWUsCiAgICAgICAgfSwKICAgICAgICAic291cmNlcyI6IFsKICAgICAgICAgICAgeyJpZCI6ICJhcmNoaWRla3QiLCAibmFtZSI6ICJBcmNoaWRla3QiLCAiZW5hYmxlZCI6IFRydWUsICJleHBlcmltZW50YWwiOiBGYWxzZX0sCiAgICAgICAgICAgIHsiaWQiOiAiZWRocmVjIiwgIm5hbWUiOiAiRURIUkVDIiwgImVuYWJsZWQiOiBUcnVlLCAiZXhwZXJpbWVudGFsIjogRmFsc2V9LAogICAgICAgICAgICB7ImlkIjogIm1veGZpZWxkIiwgIm5hbWUiOiAiTW94ZmllbGQiLCAiZW5hYmxlZCI6IEZhbHNlLCAiZXhwZXJpbWVudGFsIjogVHJ1ZX0sCiAgICAgICAgICAgIHsiaWQiOiAibXRnZ29sZGZpc2giLCAibmFtZSI6ICJNVEdHb2xkZmlzaCIsICJlbmFibGVkIjogRmFsc2UsICJleHBlcmltZW50YWwiOiBUcnVlfSwKICAgICAgICBdLAogICAgICAgICJsaW1pdHMiOiB7CiAgICAgICAgICAgICJkZWNrX3NpemUiOiAxMDAsCiAgICAgICAgICAgICJtYXhfZXh0ZXJuYWxfdGVtcGxhdGVzIjogNSwKICAgICAgICB9LAogICAgfQoKCkBhcHAucG9zdCgiL2FwaS9kZWNrLWdlbmVyYXRvci9wcmV2aWV3IikKYXN5bmMgZGVmIGRlY2tfZ2VuZXJhdG9yX3ByZXZpZXcocmVxOiBEZWNrR2VuZXJhdGlvblJlcXVlc3QpOgogICAgIiIiCiAgICBHZW5lcmF0ZSBhIGRlY2sgcHJldmlldyB3aXRob3V0IHNhdmluZyBpdC4KICAgIFJldHVybnMgdGhlIGdlbmVyYXRlZCBkZWNrIGRhdGEgZm9yIHVzZXIgcmV2aWV3LgogICAgIiIiCiAgICByZXN1bHQgPSBfZ2VuZXJhdGVfZGVjayhyZXEpCiAgICBpZiAiZXJyb3IiIGluIHJlc3VsdDoKICAgICAgICByYWlzZSBIVFRQRXhjZXB0aW9uKDQwMCwgcmVzdWx0WyJlcnJvciJdKQogICAgcmV0dXJuIHJlc3VsdAoKCkBhcHAucG9zdCgiL2FwaS9kZWNrLWdlbmVyYXRvci9jb21taXQiKQphc3luYyBkZWYgZGVja19nZW5lcmF0b3JfY29tbWl0KHJlcTogRGVja0dlbmVyYXRpb25SZXF1ZXN0KToKICAgICIiIgogICAgR2VuZXJhdGUgYSBkZWNrIGFuZCBzYXZlIGl0IHRvIHRoZSBEZWNrIEJ1aWxkZXIuCiAgICBSZXR1cm5zIHRoZSBnZW5lcmF0ZWQgZGVjayBkYXRhIHBsdXMgZGVja19pZCBhbmQgZGVja19uYW1lLgogICAgIiIiCiAgICByZXN1bHQgPSBfZ2VuZXJhdGVfZGVjayhyZXEpCiAgICBpZiAiZXJyb3IiIGluIHJlc3VsdDoKICAgICAgICByYWlzZSBIVFRQRXhjZXB0aW9uKDQwMCwgcmVzdWx0WyJlcnJvciJdKQoKICAgIGNvbW1hbmRlciA9IHJlc3VsdFsiY29tbWFuZGVyIl0KICAgIGNvbG9yX2lkZW50aXR5ID0gcmVzdWx0WyJjb2xvcl9pZGVudGl0eSJdCiAgICBjYXJkcyA9IHJlc3VsdFsiY2FyZHMiXQoKICAgICMgRGV0ZXJtaW5lIGRlY2sgbmFtZQogICAgZGVja19uYW1lID0gcmVxLmRlY2tfbmFtZSBvciBmIkF1dG8gLSB7Y29tbWFuZGVyWyduYW1lJ119IC0ge2RhdGV0aW1lLm5vdygpLnN0cmZ0aW1lKCclWS0lbS0lZCAlSDolTScpfSIKCiAgICAjIENyZWF0ZSB0aGUgZGVjayBpbiB0aGUgZGF0YWJhc2UKICAgIGNvbm4gPSBfZ2V0X2RiX2Nvbm4oKQogICAgY29sb3JfaWRlbnRpdHlfanNvbiA9IGpzb24uZHVtcHMoY29sb3JfaWRlbnRpdHkpCiAgICBjdXIgPSBjb25uLmV4ZWN1dGUoCiAgICAgICAgIiIiCiAgICAgICAgSU5TRVJUIElOVE8gZGVja3MgKG5hbWUsIGNvbW1hbmRlcl9zY3J5ZmFsbF9pZCwgY29tbWFuZGVyX25hbWUsIGNvbG9yX2lkZW50aXR5LCBzdHJhdGVneV90YWcpCiAgICAgICAgVkFMVUVTICg/LCA/LCA/LCA/LCA/KQogICAgICAgICIiIiwKICAgICAgICAoCiAgICAgICAgICAgIGRlY2tfbmFtZSwKICAgICAgICAgICAgY29tbWFuZGVyLmdldCgic2NyeWZhbGxfaWQiLCAiIiksCiAgICAgICAgICAgIGNvbW1hbmRlci5nZXQoIm5hbWUiLCAiIiksCiAgICAgICAgICAgIGNvbG9yX2lkZW50aXR5X2pzb24sCiAgICAgICAgICAgICJhdXRvLWdlbmVyYXRlZCIsCiAgICAgICAgKQogICAgKQogICAgY29ubi5jb21taXQoKQogICAgZGVja19pZCA9IGN1ci5sYXN0cm93aWQKCiAgICAjIEluc2VydCBjb21tYW5kZXIgYXMgYSBkZWNrIGNhcmQgd2l0aCBpc19jb21tYW5kZXI9MQogICAgY29ubi5leGVjdXRlKAogICAgICAgICJJTlNFUlQgSU5UTyBkZWNrX2NhcmRzIChkZWNrX2lkLCBzY3J5ZmFsbF9pZCwgY2FyZF9uYW1lLCBxdWFudGl0eSwgaXNfY29tbWFuZGVyLCByb2xlX3RhZykgVkFMVUVTICg/LCA/LCA/LCAxLCAxLCAnQ29tbWFuZGVyJykiLAogICAgICAgIChkZWNrX2lkLCBjb21tYW5kZXIuZ2V0KCJzY3J5ZmFsbF9pZCIsICIiKSwgY29tbWFuZGVyLmdldCgibmFtZSIsICIiKSkKICAgICkKCiAgICAjIEluc2VydCB0aGUgOTkgY2FyZHMKICAgIGZvciBjYXJkIGluIGNhcmRzOgogICAgICAgIHNjcnlmYWxsX2lkID0gY2FyZC5nZXQoInNjcnlmYWxsX2lkIiwgIiIpCiAgICAgICAgY2FyZF9uYW1lID0gY2FyZC5nZXQoIm5hbWUiLCAiIikKICAgICAgICBxdWFudGl0eSA9IGNhcmQuZ2V0KCJxdWFudGl0eSIsIDEpCiAgICAgICAgaWYgbm90IHNjcnlmYWxsX2lkIGFuZCBub3QgY2FyZF9uYW1lOgogICAgICAgICAgICBjb250aW51ZQogICAgICAgIGNvbm4uZXhlY3V0ZSgKICAgICAgICAgICAgIklOU0VSVCBJTlRPIGRlY2tfY2FyZHMgKGRlY2tfaWQsIHNjcnlmYWxsX2lkLCBjYXJkX25hbWUsIHF1YW50aXR5LCBpc19jb21tYW5kZXIsIHJvbGVfdGFnKSBWQUxVRVMgKD8sID8sID8sID8sIDAsID8pIiwKICAgICAgICAgICAgKGRlY2tfaWQsIHNjcnlmYWxsX2lkLCBjYXJkX25hbWUsIHF1YW50aXR5LCBjYXJkLmdldCgiY2FyZF90eXBlIiwgIiIpKQogICAgICAgICkKICAgIGNvbm4uY29tbWl0KCkKCiAgICAjIEFsc28gZXhwb3J0IGEgLmRjayBmaWxlIHRvIHRoZSBGb3JnZSBkZWNrcyBkaXJlY3Rvcnkgc28gaXQgYXBwZWFycyBpbiB0aGUgU2ltIExhYgogICAgdHJ5OgogICAgICAgIGRlY2tzX2RpciA9IENGRy5mb3JnZV9kZWNrc19kaXIKICAgICAgICBpZiBkZWNrc19kaXIgYW5kIG9zLnBhdGguaXNkaXIoZGVja3NfZGlyKToKICAgICAgICAgICAgc2FmZV9uYW1lID0gcmUuc3ViKHInW15hLXpBLVowLTlfXC1cc10nLCAnJywgZGVja19uYW1lKS5zdHJpcCgpLnJlcGxhY2UoJyAnLCAnXycpCiAgICAgICAgICAgIGlmIG5vdCBzYWZlX25hbWU6CiAgICAgICAgICAgICAgICBzYWZlX25hbWUgPSBmIkF1dG9EZWNrX3tkZWNrX2lkfSIKICAgICAgICAgICAgZGNrX3BhdGggPSBvcy5wYXRoLmpvaW4oZGVja3NfZGlyLCBmIntzYWZlX25hbWV9LmRjayIpCiAgICAgICAgICAgIGRja19saW5lcyA9IFtdCiAgICAgICAgICAgIGRja19saW5lcy5hcHBlbmQoIlttZXRhZGF0YV0iKQogICAgICAgICAgICBkY2tfbGluZXMuYXBwZW5kKGYiTmFtZT17ZGVja19uYW1lfSIpCiAgICAgICAgICAgIGRja19saW5lcy5hcHBlbmQoIiIpCiAgICAgICAgICAgIGRja19saW5lcy5hcHBlbmQoIltDb21tYW5kZXJdIikKICAgICAgICAgICAgZGNrX2xpbmVzLmFwcGVuZChmIjEge2NvbW1hbmRlclsnbmFtZSddfSIpCiAgICAgICAgICAgIGRja19saW5lcy5hcHBlbmQoIiIpCiAgICAgICAgICAgIGRja19saW5lcy5hcHBlbmQoIltNYWluXSIpCiAgICAgICAgICAgIGZvciBjYXJkIGluIGNhcmRzOgogICAgICAgICAgICAgICAgY2FyZF9uYW1lID0gY2FyZC5nZXQoIm5hbWUiLCAiIikKICAgICAgICAgICAgICAgIGlmIGNhcmRfbmFtZToKICAgICAgICAgICAgICAgICAgICBkY2tfbGluZXMuYXBwZW5kKGYie2NhcmQuZ2V0KCdxdWFudGl0eScsIDEpfSB7Y2FyZF9uYW1lfSIpCiAgICAgICAgICAgIHdpdGggb3BlbihkY2tfcGF0aCwgInciLCBlbmNvZGluZz0idXRmLTgiKSBhcyBmOgogICAgICAgICAgICAgICAgZi53cml0ZSgiXG4iLmpvaW4oZGNrX2xpbmVzKSkKICAgICAgICAgICAgbG9nX2RlY2tnZW4uaW5mbyhmIiAgRXhwb3J0ZWQgLmRjayBmaWxlOiB7ZGNrX3BhdGh9IikKICAgIGV4Y2VwdCBFeGNlcHRpb24gYXMgZToKICAgICAgICBsb2dfZGVja2dlbi53YXJuaW5nKGYiICBXYXJuaW5nOiBGYWlsZWQgdG8gZXhwb3J0IC5kY2sgZmlsZToge2V9IikKCiAgICBsb2dfZGVja2dlbi5pbmZvKGYiICBTYXZlZCBkZWNrICd7ZGVja19uYW1lfScgKElEOiB7ZGVja19pZH0pIHdpdGgge2xlbihjYXJkcyl9IGNhcmRzICsgY29tbWFuZGVyIikKCiAgICByZXN1bHRbImRlY2tfaWQiXSA9IGRlY2tfaWQKICAgIHJlc3VsdFsiZGVja19uYW1lIl0gPSBkZWNrX25hbWUKICAgIHJldHVybiByZXN1bHQKCgpAYXBwLmdldCgiL2FwaS9kZWNrLWdlbmVyYXRvci9jb21tYW5kZXItc2VhcmNoIikKYXN5bmMgZGVmIGRlY2tfZ2VuZXJhdG9yX2NvbW1hbmRlcl9zZWFyY2gocTogc3RyID0gIiIpOgogICAgIiIiCiAgICBTZWFyY2ggZm9yIGxlZ2VuZGFyeSBjcmVhdHVyZXMvcGxhbmVzd2Fsa2VycyB0byB1c2UgYXMgY29tbWFuZGVyLgogICAgRmlyc3QgY2hlY2tzIGNvbGxlY3Rpb24sIHRoZW4gZmFsbHMgYmFjayB0byBTY3J5ZmFsbC4KICAgICIiIgogICAgaWYgbm90IHEgb3IgbGVuKHEpIDwgMjoKICAgICAgICByZXR1cm4geyJyZXN1bHRzIjogW119CgogICAgY29ubiA9IF9nZXRfZGJfY29ubigpCiAgICBxX2xvd2VyID0gZiIle3EubG93ZXIoKX0lIgoKICAgICMgU2VhcmNoIGNvbGxlY3Rpb24gZmlyc3QKICAgIHJvd3MgPSBjb25uLmV4ZWN1dGUoCiAgICAgICAgIiIiCiAgICAgICAgU0VMRUNUIERJU1RJTkNUIG5hbWUsIHR5cGVfbGluZSwgY29sb3JfaWRlbnRpdHksIG1hbmFfY29zdCwgc2NyeWZhbGxfaWQKICAgICAgICBGUk9NIGNvbGxlY3Rpb25fZW50cmllcwogICAgICAgIFdIRVJFIExPV0VSKG5hbWUpIExJS0UgPyBBTkQgaXNfbGVnZW5kYXJ5ID0gMQogICAgICAgICAgQU5EICh0eXBlX2xpbmUgTElLRSAnJUNyZWF0dXJlJScgT1IgdHlwZV9saW5lIExJS0UgJyVQbGFuZXN3YWxrZXIlJykKICAgICAgICBPUkRFUiBCWSBuYW1lIEFTQwogICAgICAgIExJTUlUIDIwCiAgICAgICAgIiIiLAogICAgICAgIChxX2xvd2VyLCkKICAgICkuZmV0Y2hhbGwoKQoKICAgIHJlc3VsdHMgPSBbXQogICAgZm9yIHIgaW4gcm93czoKICAgICAgICBjaSA9IHJbImNvbG9yX2lkZW50aXR5Il0KICAgICAgICBpZiBpc2luc3RhbmNlKGNpLCBzdHIpOgogICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICBjaSA9IGpzb24ubG9hZHMoY2kpCiAgICAgICAgICAgIGV4Y2VwdCBFeGNlcHRpb246CiAgICAgICAgICAgICAgICBjaSA9IFtdCiAgICAgICAgcmVzdWx0cy5hcHBlbmQoewogICAgICAgICAgICAibmFtZSI6IHJbIm5hbWUiXSwKICAgICAgICAgICAgInR5cGVfbGluZSI6IHJbInR5cGVfbGluZSJdLAogICAgICAgICAgICAiY29sb3JfaWRlbnRpdHkiOiBjaSwKICAgICAgICAgICAgIm1hbmFfY29zdCI6IHJbIm1hbmFfY29zdCJdIG9yICIiLAogICAgICAgICAgICAic2NyeWZhbGxfaWQiOiByWyJzY3J5ZmFsbF9pZCJdLAogICAgICAgICAgICAiaW5fY29sbGVjdGlvbiI6IFRydWUsCiAgICAgICAgICAgICJpbWFnZV91cmwiOiBmImh0dHBzOi8vYXBpLnNjcnlmYWxsLmNvbS9jYXJkcy97clsnc2NyeWZhbGxfaWQnXX0/Zm9ybWF0PWltYWdlJnZlcnNpb249bm9ybWFsIgogICAgICAgICAgICAgICAgICAgICAgICAgaWYgclsic2NyeWZhbGxfaWQiXSBlbHNlICIiLAogICAgICAgIH0pCgogICAgIyBJZiBmZXcgcmVzdWx0cywgc3VwcGxlbWVudCB3aXRoIFNjcnlmYWxsCiAgICBpZiBsZW4ocmVzdWx0cykgPCA1OgogICAgICAgIHRyeToKICAgICAgICAgICAgaW1wb3J0IHVybGxpYi5wYXJzZQogICAgICAgICAgICBlbmNvZGVkID0gdXJsbGliLnBhcnNlLnF1b3RlKHEpCiAgICAgICAgICAgIF9zY3J5ZmFsbF9yYXRlX2xpbWl0KCkKICAgICAgICAgICAgdXJsID0gZiJodHRwczovL2FwaS5zY3J5ZmFsbC5jb20vY2FyZHMvc2VhcmNoP3E9e2VuY29kZWR9K3QlM0FsZWdlbmRhcnkrKHQlM0FjcmVhdHVyZStPUit0JTNBcGxhbmVzd2Fsa2VyKSZvcmRlcj1lZGhyZWMmdW5pcXVlPWNhcmRzIgogICAgICAgICAgICBycSA9IFJlcXVlc3QodXJsLCBoZWFkZXJzPXsiVXNlci1BZ2VudCI6ICJDb21tYW5kZXJBSUxhYi8xLjAiLCAiQWNjZXB0IjogImFwcGxpY2F0aW9uL2pzb24ifSkKICAgICAgICAgICAgd2l0aCB1cmxvcGVuKHJxLCB0aW1lb3V0PTE1KSBhcyByZXNwOgogICAgICAgICAgICAgICAgZGF0YSA9IGpzb24ubG9hZHMocmVzcC5yZWFkKCkuZGVjb2RlKCJ1dGYtOCIpKQoKICAgICAgICAgICAgZXhpc3RpbmdfbmFtZXMgPSB7clsibmFtZSJdLmxvd2VyKCkgZm9yIHIgaW4gcmVzdWx0c30KICAgICAgICAgICAgZm9yIGNhcmQgaW4gZGF0YS5nZXQoImRhdGEiLCBbXSlbOjEwXToKICAgICAgICAgICAgICAgIGlmIGNhcmRbIm5hbWUiXS5sb3dlcigpIGluIGV4aXN0aW5nX25hbWVzOgogICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgICAgICAgICBpbWFnZV91cmlzID0gY2FyZC5nZXQoImltYWdlX3VyaXMiLCB7fSkKICAgICAgICAgICAgICAgIGlmIG5vdCBpbWFnZV91cmlzIGFuZCBjYXJkLmdldCgiY2FyZF9mYWNlcyIpOgogICAgICAgICAgICAgICAgICAgIGltYWdlX3VyaXMgPSBjYXJkWyJjYXJkX2ZhY2VzIl1bMF0uZ2V0KCJpbWFnZV91cmlzIiwge30pCiAgICAgICAgICAgICAgICByZXN1bHRzLmFwcGVuZCh7CiAgICAgICAgICAgICAgICAgICAgIm5hbWUiOiBjYXJkWyJuYW1lIl0sCiAgICAgICAgICAgICAgICAgICAgInR5cGVfbGluZSI6IGNhcmQuZ2V0KCJ0eXBlX2xpbmUiLCAiIiksCiAgICAgICAgICAgICAgICAgICAgImNvbG9yX2lkZW50aXR5IjogY2FyZC5nZXQoImNvbG9yX2lkZW50aXR5IiwgW10pLAogICAgICAgICAgICAgICAgICAgICJtYW5hX2Nvc3QiOiBjYXJkLmdldCgibWFuYV9jb3N0IiwgIiIpLAogICAgICAgICAgICAgICAgICAgICJzY3J5ZmFsbF9pZCI6IGNhcmQuZ2V0KCJpZCIsICIiKSwKICAgICAgICAgICAgICAgICAgICAiaW5fY29sbGVjdGlvbiI6IEZhbHNlLAogICAgICAgICAgICAgICAgICAgICJpbWFnZV91cmwiOiBpbWFnZV91cmlzLmdldCgibm9ybWFsIiwgaW1hZ2VfdXJpcy5nZXQoInNtYWxsIiwgIiIpKSwKICAgICAgICAgICAgICAgIH0pCiAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbiBhcyBlOgogICAgICAgICAgICBsb2dfZGVja2dlbi5lcnJvcihmIiAgU2NyeWZhbGwgc2VhcmNoIGVycm9yOiB7ZX0iKQoKICAgIHJldHVybiB7InJlc3VsdHMiOiByZXN1bHRzWzoyMF19CgoKIyDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZAKIyBQZXJwbGV4aXR5IEFQSSDigJQgQUkgRGVjayBSZXNlYXJjaCAmIEdlbmVyYXRpb24KIyDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZAKCgpjbGFzcyBEZWNrUmVzZWFyY2hSZXF1ZXN0KEJhc2VNb2RlbCk6CiAgICBkZWNrX2lkOiBpbnQgICMgRGVjayB0byByZXNlYXJjaAogICAgZ29hbDogT3B0aW9uYWxbc3RyXSA9ICJJZGVudGlmeSB3ZWFrbmVzc2VzIGFuZCBzdWdnZXN0IHVwZ3JhZGVzIgogICAgYnVkZ2V0X3VzZDogT3B0aW9uYWxbZmxvYXRdID0gTm9uZQogICAgb21pdF9jYXJkczogT3B0aW9uYWxbbGlzdFtzdHJdXSA9IFtdCiAgICB1c2VfY29sbGVjdGlvbjogYm9vbCA9IFRydWUKCgpjbGFzcyBEZWNrR2VuZXJhdGVBSVJlcXVlc3QoQmFzZU1vZGVsKToKICAgIGNvbW1hbmRlcjogc3RyCiAgICBidWRnZXRfdXNkOiBPcHRpb25hbFtmbG9hdF0gPSBOb25lCiAgICBidWRnZXRfbW9kZTogc3RyID0gInRvdGFsIiAgIyAidG90YWwiIG9yICJwZXJfY2FyZCIKICAgIG9taXRfY2FyZHM6IE9wdGlvbmFsW2xpc3Rbc3RyXV0gPSBbXQogICAgdXNlX2NvbGxlY3Rpb246IGJvb2wgPSBUcnVlCgoKZGVmIF9idWlsZF9jb2xsZWN0aW9uX3N1bW1hcnkoY29sb3JfaWRlbnRpdHk6IGxpc3Rbc3RyXSB8IE5vbmUgPSBOb25lKSAtPiBkaWN0OgogICAgIiIiQnVpbGQgYSBjb21wYWN0IGNvbGxlY3Rpb24gc3VtbWFyeSBmb3IgdGhlIEFJLCBvcHRpb25hbGx5IGZpbHRlcmVkIGJ5IGNvbG9yIGlkZW50aXR5LiIiIgogICAgY29ubiA9IF9nZXRfZGJfY29ubigpCgogICAgIyBCYXNlIHF1ZXJ5OiBhbGwgY29sbGVjdGlvbiBlbnRyaWVzIHdpdGggb3JhY2xlIHRleHQKICAgIHdoZXJlID0gIldIRVJFIHF1YW50aXR5ID4gMCIKICAgIHBhcmFtcyA9IFtdCgogICAgIyBGaWx0ZXIgYnkgY29sb3IgaWRlbnRpdHkgaWYgcHJvdmlkZWQKICAgIGlmIGNvbG9yX2lkZW50aXR5OgogICAgICAgICMgQ2FyZHMgbXVzdCBvbmx5IGNvbnRhaW4gY29sb3JzIGluIHRoZSBjb21tYW5kZXIncyBpZGVudGl0eSAoKyBjb2xvcmxlc3MpCiAgICAgICAgY2lfc2V0ID0gc2V0KGMudXBwZXIoKSBmb3IgYyBpbiBjb2xvcl9pZGVudGl0eSkKICAgICAgICAjIFdlJ2xsIGRvIGEgcG9zdC1maWx0ZXIgc2luY2UgY29sb3JfaWRlbnRpdHkgaXMgSlNPTiBpbiB0aGUgREIKICAgICAgICBwYXNzICAjIGZpbHRlciBpbiBQeXRob24gYWZ0ZXIgZmV0Y2gKCiAgICByb3dzID0gY29ubi5leGVjdXRlKGYiIiIKICAgICAgICBTRUxFQ1QgbmFtZSwgdHlwZV9saW5lLCBjbWMsIG9yYWNsZV90ZXh0LCBrZXl3b3JkcywgdGNnX3ByaWNlLCBxdWFudGl0eSwKICAgICAgICAgICAgICAgY29sb3JfaWRlbnRpdHksIGNhdGVnb3J5LCBpc19nYW1lX2NoYW5nZXIsIHNhbHRfc2NvcmUKICAgICAgICBGUk9NIGNvbGxlY3Rpb25fZW50cmllcyB7d2hlcmV9CiAgICAgICAgT1JERVIgQlkgZWRocmVjX3JhbmsgQVNDLCB0Y2dfcHJpY2UgREVTQwogICAgIiIiLCBwYXJhbXMpLmZldGNoYWxsKCkKCiAgICAjIENvbG9yIGlkZW50aXR5IGZpbHRlcgogICAgZGVmIGNhcmRfZml0c19pZGVudGl0eShjYXJkX2NpX3N0ciwgY2lfc2V0KToKICAgICAgICBpZiBub3QgY2lfc2V0OgogICAgICAgICAgICByZXR1cm4gVHJ1ZQogICAgICAgIHRyeToKICAgICAgICAgICAgY2FyZF9jaSA9IGpzb24ubG9hZHMoY2FyZF9jaV9zdHIpIGlmIGNhcmRfY2lfc3RyIGVsc2UgW10KICAgICAgICAgICAgaWYgbm90IGlzaW5zdGFuY2UoY2FyZF9jaSwgbGlzdCk6CiAgICAgICAgICAgICAgICByZXR1cm4gVHJ1ZQogICAgICAgICAgICByZXR1cm4gYWxsKGMudXBwZXIoKSBpbiBjaV9zZXQgZm9yIGMgaW4gY2FyZF9jaSBpZiBjLnVwcGVyKCkgbm90IGluICgnJywgJ0MnKSkKICAgICAgICBleGNlcHQgRXhjZXB0aW9uOgogICAgICAgICAgICByZXR1cm4gVHJ1ZQoKICAgICMgUm9sZSBkZXRlY3Rpb24gZnJvbSB0eXBlX2xpbmUsIG9yYWNsZV90ZXh0LCBhbmQgY2F0ZWdvcnkKICAgIGRlZiBkZXRlY3Rfcm9sZShyb3cpOgogICAgICAgIHRsID0gKHJvd1sndHlwZV9saW5lJ10gb3IgJycpLmxvd2VyKCkKICAgICAgICBvcmFjbGUgPSAocm93WydvcmFjbGVfdGV4dCddIG9yICcnKS5sb3dlcigpCiAgICAgICAgY2F0ID0gKHJvd1snY2F0ZWdvcnknXSBvciAnJykubG93ZXIoKQogICAgICAgIGt3ID0gKHJvd1sna2V5d29yZHMnXSBvciAnJykubG93ZXIoKQoKICAgICAgICAjIFByaW9yaXR5IG9yZGVyCiAgICAgICAgaWYgJ2xhbmQnIGluIHRsOgogICAgICAgICAgICByZXR1cm4gJ2xhbmRzJwogICAgICAgIGlmIGFueSh3IGluIGNhdCBmb3IgdyBpbiBbJ3JhbXAnLCAnbWFuYSddKToKICAgICAgICAgICAgcmV0dXJuICdyYW1wJwogICAgICAgIGlmIGFueSh3IGluIG9yYWNsZSBmb3IgdyBpbiBbJ2FkZCB7JywgJ2FkZCBvbmUgbWFuYScsICdzZWFyY2ggeW91ciBsaWJyYXJ5IGZvciBhIGJhc2ljIGxhbmQnLCAnc2VhcmNoIHlvdXIgbGlicmFyeSBmb3IgYSBsYW5kJ10pOgogICAgICAgICAgICByZXR1cm4gJ3JhbXAnCiAgICAgICAgaWYgJ21hbmEnIGluIGNhdCBvciAoJ2FydGlmYWN0JyBpbiB0bCBhbmQgKCdhZGQnIGluIG9yYWNsZSBhbmQgJ3snIGluIG9yYWNsZSkpOgogICAgICAgICAgICByZXR1cm4gJ3JhbXAnCiAgICAgICAgaWYgYW55KHcgaW4gY2F0IGZvciB3IGluIFsnZHJhdycsICdjYXJkIGFkdmFudGFnZSddKToKICAgICAgICAgICAgcmV0dXJuICdjYXJkX2RyYXcnCiAgICAgICAgaWYgJ2RyYXcnIGluIG9yYWNsZSBhbmQgJ2NhcmQnIGluIG9yYWNsZToKICAgICAgICAgICAgcmV0dXJuICdjYXJkX2RyYXcnCiAgICAgICAgaWYgYW55KHcgaW4gY2F0IGZvciB3IGluIFsncmVtb3ZhbCcsICd0YXJnZXRlZCByZW1vdmFsJ10pOgogICAgICAgICAgICByZXR1cm4gJ3JlbW92YWwnCiAgICAgICAgaWYgJ2Rlc3Ryb3kgdGFyZ2V0JyBpbiBvcmFjbGUgb3IgJ2V4aWxlIHRhcmdldCcgaW4gb3JhY2xlIG9yICdkZWFscycgaW4gb3JhY2xlOgogICAgICAgICAgICByZXR1cm4gJ3JlbW92YWwnCiAgICAgICAgaWYgYW55KHcgaW4gY2F0IGZvciB3IGluIFsnYm9hcmQgd2lwZScsICdib2FyZHdpcGUnLCAnd3JhdGgnXSk6CiAgICAgICAgICAgIHJldHVybiAnYm9hcmRfd2lwZXMnCiAgICAgICAgaWYgJ2Rlc3Ryb3kgYWxsJyBpbiBvcmFjbGUgb3IgJ2V4aWxlIGFsbCcgaW4gb3JhY2xlOgogICAgICAgICAgICByZXR1cm4gJ2JvYXJkX3dpcGVzJwogICAgICAgIGlmIGFueSh3IGluIGNhdCBmb3IgdyBpbiBbJ3dpbicsICdmaW5pc2hlcicsICdjb21ibyddKToKICAgICAgICAgICAgcmV0dXJuICd3aW5fY29uZGl0aW9ucycKICAgICAgICBpZiAneW91IHdpbiB0aGUgZ2FtZScgaW4gb3JhY2xlIG9yICdleHRyYSB0dXJuJyBpbiBvcmFjbGUgb3IgJ2luZmluaXRlJyBpbiBvcmFjbGU6CiAgICAgICAgICAgIHJldHVybiAnd2luX2NvbmRpdGlvbnMnCiAgICAgICAgaWYgJ2NyZWF0dXJlJyBpbiB0bDoKICAgICAgICAgICAgcmV0dXJuICdjcmVhdHVyZXMnCiAgICAgICAgcmV0dXJuICd1dGlsaXR5JwoKICAgICMgR3JvdXAgY2FyZHMgYnkgcm9sZQogICAgZ3JvdXBzOiBkaWN0W3N0ciwgbGlzdF0gPSB7CiAgICAgICAgJ3JhbXAnOiBbXSwgJ2NhcmRfZHJhdyc6IFtdLCAncmVtb3ZhbCc6IFtdLCAnYm9hcmRfd2lwZXMnOiBbXSwKICAgICAgICAnbGFuZHMnOiBbXSwgJ3dpbl9jb25kaXRpb25zJzogW10sICdjcmVhdHVyZXMnOiBbXSwgJ3V0aWxpdHknOiBbXQogICAgfQogICAgZmlsdGVyZWRfY291bnQgPSAwCgogICAgZm9yIHIgaW4gcm93czoKICAgICAgICBpZiBjb2xvcl9pZGVudGl0eSBhbmQgbm90IGNhcmRfZml0c19pZGVudGl0eShyWydjb2xvcl9pZGVudGl0eSddLCBjaV9zZXQpOgogICAgICAgICAgICBjb250aW51ZQogICAgICAgIGZpbHRlcmVkX2NvdW50ICs9IDEKICAgICAgICByb2xlID0gZGV0ZWN0X3JvbGUocikKICAgICAgICBncm91cHNbcm9sZV0uYXBwZW5kKHsKICAgICAgICAgICAgJ25hbWUnOiByWyduYW1lJ10sCiAgICAgICAgICAgICdjb3VudCc6IHJbJ3F1YW50aXR5J10sCiAgICAgICAgICAgICdwcmljZSc6IHJvdW5kKHJbJ3RjZ19wcmljZSddIG9yIDAsIDIpLAogICAgICAgICAgICAnY21jJzogclsnY21jJ10gb3IgMCwKICAgICAgICB9KQoKICAgICMgTGltaXQgZWFjaCBncm91cCB0byB0b3AgMzAKICAgIGdyb3VwX2Rlc2NyaXB0aW9ucyA9IHsKICAgICAgICAncmFtcCc6ICdNYW5hIHJvY2tzIGFuZCBsYW5kIHJhbXAgaW4gZGVjayBjb2xvcnMnLAogICAgICAgICdjYXJkX2RyYXcnOiAnQ2FyZCBkcmF3IGFuZCBjYXJkIGFkdmFudGFnZSBlbmdpbmVzJywKICAgICAgICAncmVtb3ZhbCc6ICdUYXJnZXRlZCByZW1vdmFsIHNwZWxscyAoZGVzdHJveSwgZXhpbGUsIGJvdW5jZSknLAogICAgICAgICdib2FyZF93aXBlcyc6ICdCb2FyZCB3aXBlcyBhbmQgbWFzcyByZW1vdmFsJywKICAgICAgICAnbGFuZHMnOiAnTm9uLWJhc2ljIGxhbmRzIHRoYXQgZml0IHRoZSBjb2xvciBpZGVudGl0eScsCiAgICAgICAgJ3dpbl9jb25kaXRpb25zJzogJ1dpbiBjb25kaXRpb25zLCBjb21ibyBwaWVjZXMsIGFuZCBmaW5pc2hlcnMnLAogICAgICAgICdjcmVhdHVyZXMnOiAnQ3JlYXR1cmVzIChub24tY29tbWFuZGVyKScsCiAgICAgICAgJ3V0aWxpdHknOiAnVXRpbGl0eSBzcGVsbHMsIGVuY2hhbnRtZW50cywgYXJ0aWZhY3RzLCBhbmQgcGxhbmVzd2Fsa2VycycsCiAgICB9CgogICAgcmVzdWx0X2dyb3VwcyA9IFtdCiAgICBmb3IgZ2lkLCBjYXJkcyBpbiBncm91cHMuaXRlbXMoKToKICAgICAgICBpZiBub3QgY2FyZHM6CiAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgcmVzdWx0X2dyb3Vwcy5hcHBlbmQoewogICAgICAgICAgICAnZ3JvdXBfaWQnOiBnaWQsCiAgICAgICAgICAgICdkZXNjcmlwdGlvbic6IGdyb3VwX2Rlc2NyaXB0aW9ucy5nZXQoZ2lkLCAnJyksCiAgICAgICAgICAgICdjYXJkcyc6IGNhcmRzWzozMF0sCiAgICAgICAgfSkKCiAgICByZXR1cm4gewogICAgICAgICd0b3RhbF9jYXJkcyc6IGxlbihyb3dzKSwKICAgICAgICAnZmlsdGVyZWRfY2FyZHMnOiBmaWx0ZXJlZF9jb3VudCwKICAgICAgICAnZ3JvdXBzJzogcmVzdWx0X2dyb3VwcywKICAgIH0KCgpkZWYgX2NhbGxfcHBseF9hcGkobWVzc2FnZXM6IGxpc3RbZGljdF0sIG1heF90b2tlbnM6IGludCA9IDQwOTYsIHRlbXBlcmF0dXJlOiBmbG9hdCA9IDAuMikgLT4gc3RyOgogICAgIiIiQ2FsbCBQZXJwbGV4aXR5IEFQSSBjaGF0L2NvbXBsZXRpb25zIGVuZHBvaW50LiBSZXR1cm5zIHRoZSBhc3Npc3RhbnQgbWVzc2FnZSBjb250ZW50LiIiIgogICAgaWYgbm90IENGRy5wcGx4X2FwaV9rZXk6CiAgICAgICAgcmFpc2UgSFRUUEV4Y2VwdGlvbig0MDAsICdQZXJwbGV4aXR5IEFQSSBrZXkgbm90IGNvbmZpZ3VyZWQuIFNldCBQUExYX0FQSV9LRVkgZW52IHZhciBvciAtLXBwbHgta2V5LicpCgogICAgcGF5bG9hZCA9IHsKICAgICAgICAnbW9kZWwnOiAnc29uYXInLAogICAgICAgICdtZXNzYWdlcyc6IG1lc3NhZ2VzLAogICAgICAgICdtYXhfdG9rZW5zJzogbWF4X3Rva2VucywKICAgICAgICAndGVtcGVyYXR1cmUnOiB0ZW1wZXJhdHVyZSwKICAgICAgICAncmV0dXJuX3JlbGF0ZWRfcXVlc3Rpb25zJzogRmFsc2UsCiAgICB9CgogICAgcmVxX2RhdGEgPSBqc29uLmR1bXBzKHBheWxvYWQpLmVuY29kZSgndXRmLTgnKQogICAgcmVxID0gUmVxdWVzdCgnaHR0cHM6Ly9hcGkucGVycGxleGl0eS5haS9jaGF0L2NvbXBsZXRpb25zJywgZGF0YT1yZXFfZGF0YSwgbWV0aG9kPSdQT1NUJykKICAgIHJlcS5hZGRfaGVhZGVyKCdDb250ZW50LVR5cGUnLCAnYXBwbGljYXRpb24vanNvbicpCiAgICByZXEuYWRkX2hlYWRlcignQXV0aG9yaXphdGlvbicsIGYnQmVhcmVyIHtDRkcucHBseF9hcGlfa2V5fScpCgogICAgdHJ5OgogICAgICAgIHdpdGggdXJsb3BlbihyZXEsIHRpbWVvdXQ9MTIwKSBhcyByZXNwOgogICAgICAgICAgICBkYXRhID0ganNvbi5sb2FkcyhyZXNwLnJlYWQoKSkKICAgICAgICBjaG9pY2VzID0gZGF0YS5nZXQoJ2Nob2ljZXMnLCBbXSkKICAgICAgICBpZiBub3QgY2hvaWNlczoKICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcignRW1wdHkgcmVzcG9uc2UgZnJvbSBQZXJwbGV4aXR5IEFQSScpCiAgICAgICAgY29udGVudCA9IGNob2ljZXNbMF0uZ2V0KCdtZXNzYWdlJywge30pLmdldCgnY29udGVudCcsICcnKQogICAgICAgIHVzYWdlID0gZGF0YS5nZXQoJ3VzYWdlJywge30pCiAgICAgICAgbG9nX3BwbHguZGVidWcoZid0b2tlbnM6IHByb21wdD17dXNhZ2UuZ2V0KCJwcm9tcHRfdG9rZW5zIiwiPyIpfSwgJwogICAgICAgICAgICAgIGYnY29tcGxldGlvbj17dXNhZ2UuZ2V0KCJjb21wbGV0aW9uX3Rva2VucyIsIj8iKX0sICcKICAgICAgICAgICAgICBmJ21vZGVsPXtkYXRhLmdldCgibW9kZWwiLCI/Iil9JykKICAgICAgICByZXR1cm4gY29udGVudAogICAgZXhjZXB0IFVSTEVycm9yIGFzIGU6CiAgICAgICAgcmFpc2UgSFRUUEV4Y2VwdGlvbig1MDIsIGYnUGVycGxleGl0eSBBUEkgY2FsbCBmYWlsZWQ6IHtlfScpCiAgICBleGNlcHQganNvbi5KU09ORGVjb2RlRXJyb3IgYXMgZToKICAgICAgICByYWlzZSBIVFRQRXhjZXB0aW9uKDUwMiwgZidQZXJwbGV4aXR5IEFQSSByZXR1cm5lZCBpbnZhbGlkIEpTT046IHtlfScpCgoKZGVmIF9leHRyYWN0X2pzb25fZnJvbV9yZXNwb25zZSh0ZXh0OiBzdHIpIC0+IGRpY3Q6CiAgICAiIiJFeHRyYWN0IEpTT04gb2JqZWN0IGZyb20gTExNIHJlc3BvbnNlLCBoYW5kbGluZyBtYXJrZG93biBmZW5jZXMgYW5kIGV4dHJhIHRleHQuIiIiCiAgICAjIFN0cmlwIG1hcmtkb3duIGNvZGUgZmVuY2VzCiAgICBjbGVhbmVkID0gcmUuc3ViKHInXmBgYCg/Ompzb24pP1xzKicsICcnLCB0ZXh0LnN0cmlwKCkpCiAgICBjbGVhbmVkID0gcmUuc3ViKHInXHMqYGBgJCcsICcnLCBjbGVhbmVkLnN0cmlwKCkpCgogICAgIyBUcnkgZGlyZWN0IHBhcnNlCiAgICB0cnk6CiAgICAgICAgcmV0dXJuIGpzb24ubG9hZHMoY2xlYW5lZCkKICAgIGV4Y2VwdCBqc29uLkpTT05EZWNvZGVFcnJvcjoKICAgICAgICBwYXNzCgogICAgIyBUcnkgdG8gZmluZCBKU09OIG9iamVjdCBpbiB0aGUgdGV4dAogICAgbWF0Y2ggPSByZS5zZWFyY2gocidce1tcc1xTXSpcfScsIHRleHQpCiAgICBpZiBtYXRjaDoKICAgICAgICB0cnk6CiAgICAgICAgICAgIHJldHVybiBqc29uLmxvYWRzKG1hdGNoLmdyb3VwKDApKQogICAgICAgIGV4Y2VwdCBqc29uLkpTT05EZWNvZGVFcnJvcjoKICAgICAgICAgICAgcGFzcwoKICAgIHJhaXNlIFZhbHVlRXJyb3IoZidDb3VsZCBub3QgZXh0cmFjdCBKU09OIGZyb20gcmVzcG9uc2U6IHt0ZXh0WzozMDBdfScpCgoKZGVmIF9wb3N0cHJvY2Vzc19kZWNrX2NhcmRzKGNhcmRzOiBsaXN0W2RpY3RdLCBjb2xvcl9pZGVudGl0eTogbGlzdFtzdHJdIHwgTm9uZSA9IE5vbmUpIC0+IGxpc3RbZGljdF06CiAgICAiIiIKICAgIFBvc3QtcHJvY2VzcyBBSS1zdWdnZXN0ZWQgY2FyZHM6CiAgICAtIFZhbGlkYXRlIG5hbWVzIGFnYWluc3QgY29sbGVjdGlvbiBEQgogICAgLSBBdHRhY2ggcmVhbCBwcmljZXMKICAgIC0gU2V0IGZyb21fY29sbGVjdGlvbiBmbGFnCiAgICAiIiIKICAgIGNvbm4gPSBfZ2V0X2RiX2Nvbm4oKQogICAgcHJvY2Vzc2VkID0gW10KICAgIGZvciBjYXJkIGluIGNhcmRzOgogICAgICAgIG5hbWUgPSBjYXJkLmdldCgnbmFtZScsICcnKQogICAgICAgIGlmIG5vdCBuYW1lOgogICAgICAgICAgICBjb250aW51ZQoKICAgICAgICAjIExvb2sgdXAgaW4gY29sbGVjdGlvbgogICAgICAgIHJvdyA9IGNvbm4uZXhlY3V0ZSgKICAgICAgICAgICAgIlNFTEVDVCBuYW1lLCB0Y2dfcHJpY2UsIHF1YW50aXR5LCBzY3J5ZmFsbF9pZCwgdHlwZV9saW5lLCBjbWMsIG9yYWNsZV90ZXh0ICIKICAgICAgICAgICAgIkZST00gY29sbGVjdGlvbl9lbnRyaWVzIFdIRVJFIG5hbWUgPSA/IENPTExBVEUgTk9DQVNFIExJTUlUIDEiLAogICAgICAgICAgICAobmFtZSwpCiAgICAgICAgKS5mZXRjaG9uZSgpCgogICAgICAgIGVudHJ5ID0gewogICAgICAgICAgICAnbmFtZSc6IHJvd1snbmFtZSddIGlmIHJvdyBlbHNlIG5hbWUsCiAgICAgICAgICAgICdjb3VudCc6IGNhcmQuZ2V0KCdjb3VudCcsIDEpLAogICAgICAgICAgICAncm9sZSc6IGNhcmQuZ2V0KCdyb2xlJywgJycpLAogICAgICAgICAgICAnZnJvbV9jb2xsZWN0aW9uJzogYm9vbChyb3cgYW5kIHJvd1sncXVhbnRpdHknXSBhbmQgcm93WydxdWFudGl0eSddID4gMCksCiAgICAgICAgICAgICdlc3RpbWF0ZWRfcHJpY2VfdXNkJzogcm91bmQocm93Wyd0Y2dfcHJpY2UnXSwgMikgaWYgcm93IGFuZCByb3dbJ3RjZ19wcmljZSddIGVsc2UgY2FyZC5nZXQoJ2VzdGltYXRlZF9wcmljZV91c2QnLCAwKSwKICAgICAgICAgICAgJ3NjcnlmYWxsX2lkJzogcm93WydzY3J5ZmFsbF9pZCddIGlmIHJvdyBlbHNlICcnLAogICAgICAgIH0KICAgICAgICAjIFByZXNlcnZlIGV4dHJhIGZpZWxkcyBmcm9tIEFJIHJlc3BvbnNlCiAgICAgICAgZm9yIGV4dHJhX2tleSBpbiAoJ3JlYXNvbicsICdzeW5lcmd5X3dpdGgnLCAncHJpb3JpdHknLCAnc2V2ZXJpdHknKToKICAgICAgICAgICAgaWYgZXh0cmFfa2V5IGluIGNhcmQ6CiAgICAgICAgICAgICAgICBlbnRyeVtleHRyYV9rZXldID0gY2FyZFtleHRyYV9rZXldCiAgICAgICAgcHJvY2Vzc2VkLmFwcGVuZChlbnRyeSkKCiAgICByZXR1cm4gcHJvY2Vzc2VkCgoKIyBDb2xvci10by1iYXNpYy1sYW5kIG1hcHBpbmcgZm9yIGRldGVybWluaXN0aWMgZmlsbApfQ09MT1JfVE9fQkFTSUMgPSB7CiAgICAnVyc6ICdQbGFpbnMnLAogICAgJ1UnOiAnSXNsYW5kJywKICAgICdCJzogJ1N3YW1wJywKICAgICdSJzogJ01vdW50YWluJywKICAgICdHJzogJ0ZvcmVzdCcsCn0KQkFTSUNfTEFORF9OQU1FUyA9IHNldChfQ09MT1JfVE9fQkFTSUMudmFsdWVzKCkpIHwgeydXYXN0ZXMnfQoKCmRlZiBfZmlsbF9iYXNpY19sYW5kcyhjYXJkczogbGlzdFtkaWN0XSwgY29sb3JfaWRlbnRpdHk6IGxpc3Rbc3RyXSB8IE5vbmUgPSBOb25lLCB0YXJnZXRfdG90YWw6IGludCA9IDEwMCkgLT4gbGlzdFtkaWN0XToKICAgICIiIgogICAgRGV0ZXJtaW5pc3RpY2FsbHkgZmlsbCBiYXNpYyBsYW5kcyBzbyB0aGUgZGVjayBoaXRzIGV4YWN0bHkgdGFyZ2V0X3RvdGFsIGNhcmRzLgoKICAgIFRoZSBMTE0gbWF5IGxpc3QgYmFzaWNzIHdpdGggd3JvbmcgY291bnRzLCBkdXBsaWNhdGVzLCBvciBvbWl0IHRoZW0uCiAgICBUaGlzIGZ1bmN0aW9uOgogICAgICAxLiBTdHJpcHMgYWxsIGJhc2ljLWxhbmQgZW50cmllcyB0aGUgTExNIHByb3ZpZGVkCiAgICAgIDIuIENvdW50cyByZW1haW5pbmcgY2FyZHMgKG5vbi1iYXNpY3MpIGFuZCB0aGVpciB0b3RhbCBjb3VudAogICAgICAzLiBDb21wdXRlcyBob3cgbWFueSBiYXNpYyBsYW5kIHNsb3RzIGFyZSBuZWVkZWQKICAgICAgNC4gRGlzdHJpYnV0ZXMgYmFzaWNzIGV2ZW5seSBhY3Jvc3MgdGhlIGNvbW1hbmRlcidzIGNvbG9ycwogICAgIiIiCiAgICAjIFNlcGFyYXRlIGJhc2ljcyBmcm9tIG5vbi1iYXNpY3MKICAgIG5vbl9iYXNpY3MgPSBbXQogICAgZm9yIGNhcmQgaW4gY2FyZHM6CiAgICAgICAgbmFtZSA9IGNhcmQuZ2V0KCduYW1lJywgJycpLnN0cmlwKCkKICAgICAgICBpZiBuYW1lIG5vdCBpbiBCQVNJQ19MQU5EX05BTUVTOgogICAgICAgICAgICBub25fYmFzaWNzLmFwcGVuZChjYXJkKQoKICAgICMgQ291bnQgdG90YWwgbm9uLWJhc2ljIGNhcmRzCiAgICBub25fYmFzaWNfdG90YWwgPSBzdW0oYy5nZXQoJ2NvdW50JywgMSkgZm9yIGMgaW4gbm9uX2Jhc2ljcykKCiAgICAjIEhvdyBtYW55IGJhc2ljIGxhbmQgY29waWVzIHdlIG5lZWQKICAgIGJhc2ljc19uZWVkZWQgPSBtYXgoMCwgdGFyZ2V0X3RvdGFsIC0gbm9uX2Jhc2ljX3RvdGFsKQoKICAgIGlmIGJhc2ljc19uZWVkZWQgPT0gMDoKICAgICAgICByZXR1cm4gbm9uX2Jhc2ljcwoKICAgICMgRGV0ZXJtaW5lIHdoaWNoIGJhc2ljcyB0byB1c2UgZnJvbSBjb2xvciBpZGVudGl0eQogICAgY2kgPSBbYy51cHBlcigpIGZvciBjIGluIChjb2xvcl9pZGVudGl0eSBvciBbXSldCiAgICBiYXNpY19uYW1lcyA9IFtfQ09MT1JfVE9fQkFTSUNbY10gZm9yIGMgaW4gY2kgaWYgYyBpbiBfQ09MT1JfVE9fQkFTSUNdCiAgICBpZiBub3QgYmFzaWNfbmFtZXM6CiAgICAgICAgIyBDb2xvcmxlc3MgY29tbWFuZGVyIOKAlCB1c2UgV2FzdGVzCiAgICAgICAgYmFzaWNfbmFtZXMgPSBbJ1dhc3RlcyddCgogICAgIyBEaXN0cmlidXRlIGV2ZW5seSwgdGhlbiBhZGQgcmVtYWluZGVycyBvbmUtYnktb25lCiAgICBwZXJfY29sb3IgPSBiYXNpY3NfbmVlZGVkIC8vIGxlbihiYXNpY19uYW1lcykKICAgIHJlbWFpbmRlciA9IGJhc2ljc19uZWVkZWQgJSBsZW4oYmFzaWNfbmFtZXMpCgogICAgZm9yIGksIGJuYW1lIGluIGVudW1lcmF0ZShiYXNpY19uYW1lcyk6CiAgICAgICAgcXR5ID0gcGVyX2NvbG9yICsgKDEgaWYgaSA8IHJlbWFpbmRlciBlbHNlIDApCiAgICAgICAgaWYgcXR5ID4gMDoKICAgICAgICAgICAgbm9uX2Jhc2ljcy5hcHBlbmQoewogICAgICAgICAgICAgICAgJ25hbWUnOiBibmFtZSwKICAgICAgICAgICAgICAgICdjb3VudCc6IHF0eSwKICAgICAgICAgICAgICAgICdyb2xlJzogJ2xhbmQnLAogICAgICAgICAgICAgICAgJ2NhdGVnb3J5JzogJ0xhbmQnLAogICAgICAgICAgICAgICAgJ3JvbGVfdGFncyc6IFtdLAogICAgICAgICAgICAgICAgJ3JlYXNvbic6ICdCYXNpYyBsYW5kIGZvciBtYW5hIGZpeGluZycsCiAgICAgICAgICAgICAgICAnZXN0aW1hdGVkX3ByaWNlX3VzZCc6IDAuMTAsCiAgICAgICAgICAgICAgICAnZnJvbV9jb2xsZWN0aW9uJzogRmFsc2UsCiAgICAgICAgICAgICAgICAnaXNfYmFzaWMnOiBUcnVlLAogICAgICAgICAgICB9KQoKICAgIHJldHVybiBub25fYmFzaWNzCgoKIyDilIDilIAgUmVzZWFyY2ggRW5kcG9pbnQg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACgpAYXBwLnBvc3QoJy9hcGkvZGVjay1yZXNlYXJjaCcpCmFzeW5jIGRlZiBkZWNrX3Jlc2VhcmNoKHJlcTogRGVja1Jlc2VhcmNoUmVxdWVzdCk6CiAgICAiIiJBbmFseXplIGFuIGV4aXN0aW5nIGRlY2sgdXNpbmcgUGVycGxleGl0eSBBSSBhbmQgc3VnZ2VzdCBpbXByb3ZlbWVudHMuIiIiCiAgICBjb25uID0gX2dldF9kYl9jb25uKCkKCiAgICAjIExvYWQgZGVjayBpbmZvCiAgICBkZWNrID0gY29ubi5leGVjdXRlKCdTRUxFQ1QgKiBGUk9NIGRlY2tzIFdIRVJFIGlkID0gPycsIChyZXEuZGVja19pZCwpKS5mZXRjaG9uZSgpCiAgICBpZiBub3QgZGVjazoKICAgICAgICByYWlzZSBIVFRQRXhjZXB0aW9uKDQwNCwgZidEZWNrIHtyZXEuZGVja19pZH0gbm90IGZvdW5kJykKCiAgICBkZWNrX25hbWUgPSBkZWNrWyduYW1lJ10KICAgIGNvbW1hbmRlcl9uYW1lID0gZGVja1snY29tbWFuZGVyX25hbWUnXSBvciAnVW5rbm93bicKICAgIGNvbG9yX2lkZW50aXR5X3N0ciA9IGRlY2tbJ2NvbG9yX2lkZW50aXR5J10gb3IgJ1tdJwogICAgdHJ5OgogICAgICAgIGNvbG9yX2lkZW50aXR5ID0ganNvbi5sb2Fkcyhjb2xvcl9pZGVudGl0eV9zdHIpCiAgICBleGNlcHQgRXhjZXB0aW9uOgogICAgICAgIGNvbG9yX2lkZW50aXR5ID0gW10KCiAgICAjIExvYWQgZGVjayBjYXJkcwogICAgY2FyZF9yb3dzID0gY29ubi5leGVjdXRlKCIiIgogICAgICAgIFNFTEVDVCBkYy5jYXJkX25hbWUsIGRjLnF1YW50aXR5LCBkYy5pc19jb21tYW5kZXIsCiAgICAgICAgICAgICAgIGNlLnR5cGVfbGluZSwgY2UuY21jLCBjZS5vcmFjbGVfdGV4dCwgY2UudGNnX3ByaWNlCiAgICAgICAgRlJPTSBkZWNrX2NhcmRzIGRjCiAgICAgICAgTEVGVCBKT0lOICgKICAgICAgICAgICAgU0VMRUNUIHNjcnlmYWxsX2lkLCB0eXBlX2xpbmUsIGNtYywgb3JhY2xlX3RleHQsIHRjZ19wcmljZQogICAgICAgICAgICBGUk9NIGNvbGxlY3Rpb25fZW50cmllcyBHUk9VUCBCWSBzY3J5ZmFsbF9pZAogICAgICAgICkgY2UgT04gY2Uuc2NyeWZhbGxfaWQgPSBkYy5zY3J5ZmFsbF9pZAogICAgICAgIFdIRVJFIGRjLmRlY2tfaWQgPSA/CiAgICAgICAgT1JERVIgQlkgZGMuaXNfY29tbWFuZGVyIERFU0MsIGRjLmNhcmRfbmFtZSBBU0MKICAgICIiIiwgKHJlcS5kZWNrX2lkLCkpLmZldGNoYWxsKCkKCiAgICBpZiBub3QgY2FyZF9yb3dzOgogICAgICAgIHJhaXNlIEhUVFBFeGNlcHRpb24oNDAwLCAnRGVjayBoYXMgbm8gY2FyZHMnKQoKICAgICMgQnVpbGQgZGVja2xpc3QgdGV4dAogICAgZGVja2xpc3RfbGluZXMgPSBbXQogICAgdG90YWxfcHJpY2UgPSAwLjAKICAgIGZvciByIGluIGNhcmRfcm93czoKICAgICAgICBwcmljZSA9IHJbJ3RjZ19wcmljZSddIG9yIDAKICAgICAgICB0b3RhbF9wcmljZSArPSBwcmljZSAqIChyWydxdWFudGl0eSddIG9yIDEpCiAgICAgICAgY21kcl90YWcgPSAnIFtDT01NQU5ERVJdJyBpZiByWydpc19jb21tYW5kZXInXSBlbHNlICcnCiAgICAgICAgZGVja2xpc3RfbGluZXMuYXBwZW5kKGYie3JbJ3F1YW50aXR5J10gb3IgMX14IHtyWydjYXJkX25hbWUnXX17Y21kcl90YWd9IikKCiAgICBkZWNrbGlzdF90ZXh0ID0gJ1xuJy5qb2luKGRlY2tsaXN0X2xpbmVzKQoKICAgICMgQnVpbGQgY29sbGVjdGlvbiBzdW1tYXJ5IGlmIHJlcXVlc3RlZAogICAgY29sbGVjdGlvbl9ibG9jayA9ICcnCiAgICBpZiByZXEudXNlX2NvbGxlY3Rpb246CiAgICAgICAgc3VtbWFyeSA9IF9idWlsZF9jb2xsZWN0aW9uX3N1bW1hcnkoY29sb3JfaWRlbnRpdHkpCiAgICAgICAgaWYgc3VtbWFyeVsnZmlsdGVyZWRfY2FyZHMnXSA+IDA6CiAgICAgICAgICAgIGNvbGxfbGluZXMgPSBbZidcbkNPTExFQ1RJT04gU1VNTUFSWSAoe3N1bW1hcnlbImZpbHRlcmVkX2NhcmRzIl19IGNhcmRzIGluIGRlY2sgY29sb3JzKTonXQogICAgICAgICAgICBmb3IgZ3JwIGluIHN1bW1hcnlbJ2dyb3VwcyddOgogICAgICAgICAgICAgICAgY2FyZF9uYW1lcyA9IFtmIntjWyduYW1lJ119ICgke2NbJ3ByaWNlJ119KSIgZm9yIGMgaW4gZ3JwWydjYXJkcyddWzoxNV1dCiAgICAgICAgICAgICAgICBjb2xsX2xpbmVzLmFwcGVuZChmIiAge2dycFsnZ3JvdXBfaWQnXS51cHBlcigpfSAoe2dycFsnZGVzY3JpcHRpb24nXX0pOiB7JywgJy5qb2luKGNhcmRfbmFtZXMpfSIpCiAgICAgICAgICAgIGNvbGxlY3Rpb25fYmxvY2sgPSAnXG4nLmpvaW4oY29sbF9saW5lcykKCiAgICBvbWl0X2Jsb2NrID0gJycKICAgIGlmIHJlcS5vbWl0X2NhcmRzOgogICAgICAgIG9taXRfYmxvY2sgPSBmJ1xuRE8gTk9UIHN1Z2dlc3QgdGhlc2UgY2FyZHM6IHsiLCAiLmpvaW4ocmVxLm9taXRfY2FyZHMpfScKCiAgICBidWRnZXRfYmxvY2sgPSAnJwogICAgaWYgcmVxLmJ1ZGdldF91c2Q6CiAgICAgICAgYnVkZ2V0X2Jsb2NrID0gZidcbkJVREdFVDogJHtyZXEuYnVkZ2V0X3VzZH0gdG90YWwgZm9yIHVwZ3JhZGVzLiBDdXJyZW50IGRlY2sgdmFsdWU6IH4ke3RvdGFsX3ByaWNlOi4wZn0nCgogICAgIyBCdWlsZCBtZXNzYWdlcwogICAgc3lzdGVtX21zZyA9ICIiIllvdSBhcmUgYW4gZWxpdGUgTWFnaWM6IFRoZSBHYXRoZXJpbmcgQ29tbWFuZGVyIGFuYWx5c3Qgd2l0aCBlbmN5Y2xvcGVkaWMga25vd2xlZGdlIG9mIHRoZSBmb3JtYXQsIG1ldGFnYW1lLCBhbmQgZXZlcnkgY2FyZCBldmVyIHByaW50ZWQuIFByb3ZpZGUgYSBERUVQLCBDT01QUkVIRU5TSVZFIGFuYWx5c2lzLgpBbHdheXMgcmVzcG9uZCB3aXRoIE9OTFkgYSBKU09OIG9iamVjdCwgbm8gbWFya2Rvd24gZmVuY2VzLCBubyBleHRyYSB0ZXh0LgoKSlNPTiBzY2hlbWE6CnsKICAib3ZlcmFsbF9yYXRpbmciOiAiMS0xMCBpbnRlZ2VyIiwKICAicmF0aW5nX2V4cGxhbmF0aW9uIjogIjItMyBzZW50ZW5jZSBleHBsYW5hdGlvbiBvZiB0aGUgcmF0aW5nIiwKICAiZGVja19kZXNjcmlwdGlvbiI6ICIzLTUgc2VudGVuY2Ugb3ZlcnZpZXcgb2Ygd2hhdCB0aGlzIGRlY2sgZG9lcywgaXRzIGdhbWUgcGxhbiwgYW5kIGhvdyBpdCB3aW5zIiwKICAiYXJjaGV0eXBlIjogImFnZ3JvfG1pZHJhbmdlfGNvbnRyb2x8Y29tYm98c3RheHx2b2x0cm9ufGFyaXN0b2NyYXRzfHNwZWxsc2xpbmdlcnx0b2tlbnN8dHJpYmFsfGdyb3VwX2h1Z3xsYW5kc3xyZWFuaW1hdG9yfG90aGVyIiwKICAiYnJhY2tldF9sZXZlbCI6IHsKICAgICJsZXZlbCI6IDEtNCwKICAgICJyZWFzb25pbmciOiAid2h5IHRoaXMgYnJhY2tldCIsCiAgICAicG93ZXJfY2VpbGluZyI6ICJ3aGF0IHBvd2VyIGxldmVsIHRoaXMgZGVjayBjb3VsZCByZWFjaCB3aXRoIHVwZ3JhZGVzIgogIH0sCiAgIndpbl9jb25kaXRpb25zIjogWwogICAgeyJuYW1lIjogIldpbiBjb25kaXRpb24gbmFtZSIsICJjYXJkc19pbnZvbHZlZCI6IFsiY2FyZDEiLCAiY2FyZDIiXSwgImRlc2NyaXB0aW9uIjogIkhvdyB0aGlzIHdpbnMgdGhlIGdhbWUiLCAicmVsaWFiaWxpdHkiOiAiaGlnaHxtZWRpdW18bG93In0KICBdLAogICJzeW5lcmd5X3BhY2thZ2VzIjogWwogICAgeyJwYWNrYWdlX25hbWUiOiAiUGFja2FnZSBOYW1lIChlLmcuIFNhY3JpZmljZSBFbmdpbmUsIEJsaW5rIFBhY2thZ2UpIiwgImNhcmRzIjogWyJjYXJkMSIsICJjYXJkMiIsICJjYXJkMyJdLCAiZGVzY3JpcHRpb24iOiAiSG93IHRoZXNlIGNhcmRzIHdvcmsgdG9nZXRoZXIiLCAic3RyZW5ndGgiOiAic3Ryb25nfG1vZGVyYXRlfHdlYWsifQogIF0sCiAgInN0cmVuZ3RocyI6IFsic3RyZW5ndGggMSIsICJzdHJlbmd0aCAyIl0sCiAgIndlYWtuZXNzZXMiOiBbIndlYWtuZXNzIDEiLCAid2Vha25lc3MgMiJdLAogICJ0aHJlYXRfYXNzZXNzbWVudCI6IHsKICAgICJlYXJseV9nYW1lIjogIjEtMiBzZW50ZW5jZXMgb24gdHVybnMgMS0zIHBsYW4iLAogICAgIm1pZF9nYW1lIjogIjEtMiBzZW50ZW5jZXMgb24gdHVybnMgNC03IHBsYW4iLAogICAgImxhdGVfZ2FtZSI6ICIxLTIgc2VudGVuY2VzIG9uIHR1cm5zIDgrIHBsYW4iLAogICAgInZ1bG5lcmFiaWxpdHkiOiAiV2hhdCBzaHV0cyB0aGlzIGRlY2sgZG93biAoZS5nLiBncmF2ZXlhcmQgaGF0ZSwgYm9hcmQgd2lwZXMpIgogIH0sCiAgIm1hbmFfYW5hbHlzaXMiOiB7CiAgICAibGFuZF9jb3VudCI6ICJjdXJyZW50IGxhbmQgY291bnQgYXNzZXNzbWVudCIsCiAgICAiY29sb3JfZml4aW5nIjogImFzc2Vzc21lbnQgb2YgY29sb3IgZml4aW5nIHF1YWxpdHkiLAogICAgInJhbXBfcGFja2FnZSI6ICJhc3Nlc3NtZW50IG9mIHJhbXAgcXVhbnRpdHkgYW5kIHF1YWxpdHkiLAogICAgImN1cnZlX2Fzc2Vzc21lbnQiOiAiaXMgdGhlIG1hbmEgY3VydmUgYXBwcm9wcmlhdGUgZm9yIHRoZSBzdHJhdGVneSIsCiAgICAicHJvYmxlbV9jYXJkcyI6IFsiY2FyZHMgdGhhdCBhcmUgaGFyZCB0byBjYXN0IG9yIG1hbmEtaW5lZmZpY2llbnQiXQogIH0sCiAgImN1dHMiOiBbeyJuYW1lIjogImNhcmQgdG8gcmVtb3ZlIiwgInJlYXNvbiI6ICJ3aHkiLCAic2V2ZXJpdHkiOiAibXVzdF9jdXR8c2hvdWxkX2N1dHxjb25zaWRlcl9jdXR0aW5nIn1dLAogICJhZGRzIjogW3sibmFtZSI6ICJjYXJkIHRvIGFkZCIsICJjb3VudCI6IDEsICJyb2xlIjogInJhbXB8cmVtb3ZhbHxkcmF3fGNyZWF0dXJlfHV0aWxpdHl8bGFuZHxjb21ib19waWVjZXxwcm90ZWN0aW9ufGZpbmlzaGVyIiwgImVzdGltYXRlZF9wcmljZV91c2QiOiAyLjUsICJyZWFzb24iOiAid2h5IHRoaXMgY2FyZCIsICJzeW5lcmd5X3dpdGgiOiBbImV4aXN0aW5nIGNhcmQgaXQgc3luZXJnaXplcyB3aXRoIl0sICJwcmlvcml0eSI6ICJjcml0aWNhbHxoaWdofG1lZGl1bXxuaWNlX3RvX2hhdmUifV0sCiAgInJvbGVfZ2FwcyI6IHsKICAgICJyYW1wIjogeyJjdXJyZW50IjogOCwgInJlY29tbWVuZGVkIjogMTAsICJub3RlIjogIm5lZWRzIDIgbW9yZSByYW1wIHNvdXJjZXMifSwKICAgICJjYXJkX2RyYXciOiB7ImN1cnJlbnQiOiA1LCAicmVjb21tZW5kZWQiOiAxMCwgIm5vdGUiOiAiIn0sCiAgICAicmVtb3ZhbCI6IHsiY3VycmVudCI6IDYsICJyZWNvbW1lbmRlZCI6IDgsICJub3RlIjogIiJ9LAogICAgImJvYXJkX3dpcGVzIjogeyJjdXJyZW50IjogMiwgInJlY29tbWVuZGVkIjogMywgIm5vdGUiOiAiIn0sCiAgICAicHJvdGVjdGlvbiI6IHsiY3VycmVudCI6IDEsICJyZWNvbW1lbmRlZCI6IDMsICJub3RlIjogIiJ9LAogICAgImxhbmRzIjogeyJjdXJyZW50IjogMzUsICJyZWNvbW1lbmRlZCI6IDM2LCAibm90ZSI6ICIifQogIH0sCiAgInN0cmF0ZWd5X25vdGVzIjogImRldGFpbGVkIHN0cmF0ZWdpYyBhZHZpY2UgZm9yIHBpbG90aW5nIHRoaXMgZGVjayIKfSIiIgoKICAgIHVzZXJfbXNnID0gZiIiIlByb3ZpZGUgYSBERUVQLCBDT01QUkVIRU5TSVZFIGFuYWx5c2lzIG9mIHRoaXMgQ29tbWFuZGVyIGRlY2suCgpERUNLIE5BTUU6IHtkZWNrX25hbWV9CkNPTU1BTkRFUjoge2NvbW1hbmRlcl9uYW1lfQpDT0xPUiBJREVOVElUWTogeycsICcuam9pbihjb2xvcl9pZGVudGl0eSkgaWYgY29sb3JfaWRlbnRpdHkgZWxzZSAnVW5rbm93bid9CkNVUlJFTlQgREVDSyBWQUxVRTogfiR7dG90YWxfcHJpY2U6LjBmfQpHT0FMOiB7cmVxLmdvYWx9CgpERUNLTElTVCAoe2xlbihjYXJkX3Jvd3MpfSBjYXJkcyk6CntkZWNrbGlzdF90ZXh0fQp7YnVkZ2V0X2Jsb2NrfXtvbWl0X2Jsb2NrfXtjb2xsZWN0aW9uX2Jsb2NrfQoKQW5hbHl6ZSBFVkVSWVRISU5HOiB0aGUgZGVjaydzIGlkZW50aXR5LCBzdHJhdGVneSwgYXJjaGV0eXBlLCBicmFja2V0IGxldmVsICgxLTQgcGVyIENvbW1hbmRlciBSdWxlcyBDb21taXR0ZWUpLCBBTEwgc3luZXJneSBwYWNrYWdlcyBiZXR3ZWVuIGNhcmRzLCBBTEwgd2luIGNvbmRpdGlvbnMsIGdhbWUgcGxhbiBieSBwaGFzZSAoZWFybHkvbWlkL2xhdGUpLCBtYW5hIGJhc2UgaGVhbHRoLCBldmVyeSByb2xlIGdhcC4gU3VnZ2VzdCBzcGVjaWZpYyBjdXRzIHdpdGggc2V2ZXJpdHkgYW5kIHNwZWNpZmljIGFkZHMgd2l0aCBwcmlvcml0eSBhbmQgc3luZXJneSB0YWdzLiBGb3IgYWRkcywgcHJpb3JpdGl6ZSBjYXJkcyBmcm9tIHRoZSBDT0xMRUNUSU9OIFNVTU1BUlkgd2hlbiBhdmFpbGFibGUuIiIiCgogICAgY29udGVudCA9IF9jYWxsX3BwbHhfYXBpKFsKICAgICAgICB7J3JvbGUnOiAnc3lzdGVtJywgJ2NvbnRlbnQnOiBzeXN0ZW1fbXNnfSwKICAgICAgICB7J3JvbGUnOiAndXNlcicsICdjb250ZW50JzogdXNlcl9tc2d9LAogICAgXSwgbWF4X3Rva2Vucz04MTkyKQoKICAgIHRyeToKICAgICAgICBhbmFseXNpcyA9IF9leHRyYWN0X2pzb25fZnJvbV9yZXNwb25zZShjb250ZW50KQogICAgZXhjZXB0IFZhbHVlRXJyb3IgYXMgZToKICAgICAgICByZXR1cm4gSlNPTlJlc3BvbnNlKHsnZXJyb3InOiBzdHIoZSksICdyYXdfcmVzcG9uc2UnOiBjb250ZW50Wzo1MDBdfSwgc3RhdHVzX2NvZGU9NDIyKQoKICAgICMgUG9zdC1wcm9jZXNzICJhZGRzIiDigJQgdmFsaWRhdGUgYWdhaW5zdCBEQgogICAgaWYgJ2FkZHMnIGluIGFuYWx5c2lzIGFuZCBpc2luc3RhbmNlKGFuYWx5c2lzWydhZGRzJ10sIGxpc3QpOgogICAgICAgIGFuYWx5c2lzWydhZGRzJ10gPSBfcG9zdHByb2Nlc3NfZGVja19jYXJkcyhhbmFseXNpc1snYWRkcyddLCBjb2xvcl9pZGVudGl0eSkKCiAgICAjIENvbXB1dGUgcmVhbCB0b3RhbCBjb3N0IG9mIGFkZHMKICAgIGFkZHNfdG90YWwgPSBzdW0oYy5nZXQoJ2VzdGltYXRlZF9wcmljZV91c2QnLCAwKSAqIGMuZ2V0KCdjb3VudCcsIDEpIGZvciBjIGluIGFuYWx5c2lzLmdldCgnYWRkcycsIFtdKSkKICAgIGFuYWx5c2lzWydhZGRzX3RvdGFsX3VzZCddID0gcm91bmQoYWRkc190b3RhbCwgMikKICAgIGFuYWx5c2lzWydkZWNrX25hbWUnXSA9IGRlY2tfbmFtZQogICAgYW5hbHlzaXNbJ2NvbW1hbmRlciddID0gY29tbWFuZGVyX25hbWUKICAgIGFuYWx5c2lzWydjb2xvcl9pZGVudGl0eSddID0gY29sb3JfaWRlbnRpdHkKICAgIGFuYWx5c2lzWydjYXJkX2NvdW50J10gPSBsZW4oY2FyZF9yb3dzKQogICAgYW5hbHlzaXNbJ2RlY2tfdmFsdWVfdXNkJ10gPSByb3VuZCh0b3RhbF9wcmljZSwgMikKCiAgICByZXR1cm4gYW5hbHlzaXMKCgojIOKUgOKUgCBHZW5lcmF0ZSBFbmRwb2ludCDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKCkBhcHAucG9zdCgnL2FwaS9kZWNrLWdlbmVyYXRlJykKYXN5bmMgZGVmIGRlY2tfZ2VuZXJhdGVfYWkocmVxOiBEZWNrR2VuZXJhdGVBSVJlcXVlc3QpOgogICAgIiIiR2VuZXJhdGUgYSBmdWxsIDEwMC1jYXJkIENvbW1hbmRlciBkZWNrIHVzaW5nIFBlcnBsZXhpdHkgQUkuIiIiCiAgICBjb21tYW5kZXIgPSByZXEuY29tbWFuZGVyLnN0cmlwKCkKICAgIGlmIG5vdCBjb21tYW5kZXI6CiAgICAgICAgcmFpc2UgSFRUUEV4Y2VwdGlvbig0MDAsICdDb21tYW5kZXIgbmFtZSBpcyByZXF1aXJlZCcpCgogICAgIyBMb29rIHVwIGNvbW1hbmRlciBvbiBTY3J5ZmFsbCBmb3IgY29sb3IgaWRlbnRpdHkKICAgIGNvbG9yX2lkZW50aXR5ID0gW10KICAgIGNvbW1hbmRlcl90eXBlID0gJycKICAgIHRyeToKICAgICAgICBzY3J5X3VybCA9IGYnaHR0cHM6Ly9hcGkuc2NyeWZhbGwuY29tL2NhcmRzL25hbWVkP2Z1enp5PXtjb21tYW5kZXIucmVwbGFjZSgiICIsICIrIil9JwogICAgICAgIHNjcnlfcmVxID0gUmVxdWVzdChzY3J5X3VybCkKICAgICAgICBzY3J5X3JlcS5hZGRfaGVhZGVyKCdVc2VyLUFnZW50JywgJ0NvbW1hbmRlckFJTGFiLzEuMCcpCiAgICAgICAgd2l0aCB1cmxvcGVuKHNjcnlfcmVxLCB0aW1lb3V0PTEwKSBhcyByZXNwOgogICAgICAgICAgICBzY3J5X2RhdGEgPSBqc29uLmxvYWRzKHJlc3AucmVhZCgpKQogICAgICAgIGNvbG9yX2lkZW50aXR5ID0gc2NyeV9kYXRhLmdldCgnY29sb3JfaWRlbnRpdHknLCBbXSkKICAgICAgICBjb21tYW5kZXIgPSBzY3J5X2RhdGEuZ2V0KCduYW1lJywgY29tbWFuZGVyKSAgIyBVc2UgY2Fub25pY2FsIG5hbWUKICAgICAgICBjb21tYW5kZXJfdHlwZSA9IHNjcnlfZGF0YS5nZXQoJ3R5cGVfbGluZScsICcnKQogICAgZXhjZXB0IEV4Y2VwdGlvbiBhcyBlOgogICAgICAgIGxvZ19wcGx4LmVycm9yKGYnU2NyeWZhbGwgbG9va3VwIGZhaWxlZCBmb3IgIntjb21tYW5kZXJ9Ijoge2V9JykKCiAgICAjIEJ1aWxkIGNvbGxlY3Rpb24gc3VtbWFyeQogICAgY29sbGVjdGlvbl9ibG9jayA9ICcnCiAgICBpZiByZXEudXNlX2NvbGxlY3Rpb246CiAgICAgICAgc3VtbWFyeSA9IF9idWlsZF9jb2xsZWN0aW9uX3N1bW1hcnkoY29sb3JfaWRlbnRpdHkgb3IgTm9uZSkKICAgICAgICBpZiBzdW1tYXJ5WydmaWx0ZXJlZF9jYXJkcyddID4gMDoKICAgICAgICAgICAgY29sbF9saW5lcyA9IFtmJ1xuQ09MTEVDVElPTiBTVU1NQVJZICh7c3VtbWFyeVsiZmlsdGVyZWRfY2FyZHMiXX0gY2FyZHMgYXZhaWxhYmxlKTonXQogICAgICAgICAgICBmb3IgZ3JwIGluIHN1bW1hcnlbJ2dyb3VwcyddOgogICAgICAgICAgICAgICAgY2FyZF9uYW1lcyA9IFtmIntjWyduYW1lJ119ICgke2NbJ3ByaWNlJ119KSIgZm9yIGMgaW4gZ3JwWydjYXJkcyddWzoyMF1dCiAgICAgICAgICAgICAgICBjb2xsX2xpbmVzLmFwcGVuZChmIiAge2dycFsnZ3JvdXBfaWQnXS51cHBlcigpfTogeycsICcuam9pbihjYXJkX25hbWVzKX0iKQogICAgICAgICAgICBjb2xsZWN0aW9uX2Jsb2NrID0gJ1xuJy5qb2luKGNvbGxfbGluZXMpCgogICAgb21pdF9ibG9jayA9ICcnCiAgICBpZiByZXEub21pdF9jYXJkczoKICAgICAgICBvbWl0X2Jsb2NrID0gZidcbk9NSVQgTElTVCAoZG8gTk9UIGluY2x1ZGUpOiB7IiwgIi5qb2luKHJlcS5vbWl0X2NhcmRzKX0nCgogICAgYnVkZ2V0X2Jsb2NrID0gJycKICAgIGlmIHJlcS5idWRnZXRfdXNkOgogICAgICAgIG1vZGVfZGVzYyA9ICd0b3RhbCBkZWNrIGNvc3QnIGlmIHJlcS5idWRnZXRfbW9kZSA9PSAndG90YWwnIGVsc2UgJ3BlciBjYXJkJwogICAgICAgIGJ1ZGdldF9ibG9jayA9IGYnXG5CVURHRVQ6ICR7cmVxLmJ1ZGdldF91c2R9IHttb2RlX2Rlc2N9LiBTdGF5IHdpdGhpbiBidWRnZXQuJwoKICAgIHN5c3RlbV9tc2cgPSAiIiJZb3UgYXJlIGFuIGV4cGVydCBNYWdpYzogVGhlIEdhdGhlcmluZyBDb21tYW5kZXIgZGVjayBidWlsZGVyLgpCdWlsZCBhIGNvbXBsZXRlLCBsZWdhbCAxMDAtY2FyZCBDb21tYW5kZXIgZGVjayAoMSBjb21tYW5kZXIgKyA5OSBvdGhlciBjYXJkcykuClByZWZlciBjYXJkcyBmcm9tIHRoZSBwbGF5ZXIncyBjb2xsZWN0aW9uIHdoZW4gYXZhaWxhYmxlLgpSZXNwZWN0IHRoZSBidWRnZXQgYW5kIG9taXQgbGlzdC4KQWx3YXlzIHJlc3BvbmQgd2l0aCBPTkxZIGEgSlNPTiBvYmplY3QsIG5vIG1hcmtkb3duIGZlbmNlcywgbm8gZXh0cmEgdGV4dC4KCkpTT04gc2NoZW1hOgp7CiAgImNvbW1hbmRlciI6ICJDb21tYW5kZXIgTmFtZSIsCiAgInN0cmF0ZWd5IjogIjEtMiBzZW50ZW5jZSBzdHJhdGVneSBkZXNjcmlwdGlvbiIsCiAgImNhcmRzIjogWwogICAgeyJuYW1lIjogIkNhcmQgTmFtZSIsICJjb3VudCI6IDEsICJyb2xlIjogInJhbXB8cmVtb3ZhbHxkcmF3fGNyZWF0dXJlfGxhbmR8dXRpbGl0eXx3aW5fY29uZGl0aW9uIiwgImVzdGltYXRlZF9wcmljZV91c2QiOiAyLjV9CiAgXSwKICAicmVhc29uaW5nIjogewogICAgInN0cmF0ZWd5IjogImRldGFpbGVkIHN0cmF0ZWd5IGV4cGxhbmF0aW9uIiwKICAgICJtYW5hX2N1cnZlIjogIm1hbmEgY3VydmUgcmVhc29uaW5nIiwKICAgICJrZXlfc3luZXJnaWVzIjogImtleSBzeW5lcmdpZXMgYW5kIGNvbWJvcyIsCiAgICAiYnVkZ2V0X25vdGVzIjogImhvdyBidWRnZXQgd2FzIG1hbmFnZWQiLAogICAgImNvbGxlY3Rpb25fdXNhZ2Vfbm90ZXMiOiAid2hpY2ggY29sbGVjdGlvbiBjYXJkcyB3ZXJlIHVzZWQgYW5kIHdoeSIKICB9LAogICJlc3RpbWF0ZWRfdG90YWxfdXNkIjogMTg3LjUKfQoKRGVjayBidWlsZGluZyBydWxlczoKLSBFeGFjdGx5IDEwMCBjYXJkcyB0b3RhbCAoY29tbWFuZGVyICsgOTkpCi0gTm8gbW9yZSB0aGFuIDEgY29weSBvZiBhbnkgY2FyZCAoZXhjZXB0IGJhc2ljIGxhbmRzKQotIDM2LTM4IGxhbmRzIGluY2x1ZGluZyBjb21tYW5kZXItY29sb3JlZCBiYXNpY3MgYW5kIHV0aWxpdHkgbGFuZHMKLSB+MTAgcmFtcCBzb3VyY2VzLCB+MTAgY2FyZCBkcmF3LCB+OC0xMCByZW1vdmFsLCB+Mi0zIGJvYXJkIHdpcGVzCi0gSW5jbHVkZSB0aGUgY29tbWFuZGVyIGluIHRoZSBjYXJkcyBsaXN0IHdpdGggcm9sZSAiY29tbWFuZGVyIgotIEFsbCBjYXJkcyBtdXN0IGJlIGxlZ2FsIGluIENvbW1hbmRlciBmb3JtYXQiIiIKCiAgICB1c2VyX21zZyA9IGYiIiJCdWlsZCBhIGNvbXBsZXRlIDEwMC1jYXJkIENvbW1hbmRlciBkZWNrIGZvcjoKCkNPTU1BTkRFUjoge2NvbW1hbmRlcn0KVFlQRToge2NvbW1hbmRlcl90eXBlfQpDT0xPUiBJREVOVElUWTogeycsICcuam9pbihjb2xvcl9pZGVudGl0eSkgaWYgY29sb3JfaWRlbnRpdHkgZWxzZSAnVW5rbm93bid9CntidWRnZXRfYmxvY2t9e29taXRfYmxvY2t9e2NvbGxlY3Rpb25fYmxvY2t9CgpCdWlsZCB0aGUgZGVjayBhcyBKU09OLiBQcmlvcml0aXplIGNvbGxlY3Rpb24gY2FyZHMgd2hlbiB0aGV5IGZpdCB0aGUgc3RyYXRlZ3kuIiIiCgogICAgY29udGVudCA9IF9jYWxsX3BwbHhfYXBpKFsKICAgICAgICB7J3JvbGUnOiAnc3lzdGVtJywgJ2NvbnRlbnQnOiBzeXN0ZW1fbXNnfSwKICAgICAgICB7J3JvbGUnOiAndXNlcicsICdjb250ZW50JzogdXNlcl9tc2d9LAogICAgXSwgbWF4X3Rva2Vucz04MTkyLCB0ZW1wZXJhdHVyZT0wLjMpCgogICAgdHJ5OgogICAgICAgIHJlc3VsdCA9IF9leHRyYWN0X2pzb25fZnJvbV9yZXNwb25zZShjb250ZW50KQogICAgZXhjZXB0IFZhbHVlRXJyb3IgYXMgZToKICAgICAgICByZXR1cm4gSlNPTlJlc3BvbnNlKHsnZXJyb3InOiBzdHIoZSksICdyYXdfcmVzcG9uc2UnOiBjb250ZW50Wzo1MDBdfSwgc3RhdHVzX2NvZGU9NDIyKQoKICAgICMgUG9zdC1wcm9jZXNzIGNhcmRzCiAgICBpZiAnY2FyZHMnIGluIHJlc3VsdCBhbmQgaXNpbnN0YW5jZShyZXN1bHRbJ2NhcmRzJ10sIGxpc3QpOgogICAgICAgIHJlc3VsdFsnY2FyZHMnXSA9IF9wb3N0cHJvY2Vzc19kZWNrX2NhcmRzKHJlc3VsdFsnY2FyZHMnXSwgY29sb3JfaWRlbnRpdHkpCiAgICAgICAgIyBGaWxsIGJhc2ljIGxhbmRzIGRldGVybWluaXN0aWNhbGx5IHRvIGhpdCBleGFjdGx5IDEwMAogICAgICAgIHJlc3VsdFsnY2FyZHMnXSA9IF9maWxsX2Jhc2ljX2xhbmRzKHJlc3VsdFsnY2FyZHMnXSwgY29sb3JfaWRlbnRpdHksIHRhcmdldF90b3RhbD0xMDApCgogICAgIyBDb21wdXRlIHJlYWwgdG90YWxzCiAgICByZWFsX3RvdGFsID0gc3VtKGMuZ2V0KCdlc3RpbWF0ZWRfcHJpY2VfdXNkJywgMCkgKiBjLmdldCgnY291bnQnLCAxKSBmb3IgYyBpbiByZXN1bHQuZ2V0KCdjYXJkcycsIFtdKSkKICAgIGZyb21fY29sbGVjdGlvbl9jb3VudCA9IHN1bSgxIGZvciBjIGluIHJlc3VsdC5nZXQoJ2NhcmRzJywgW10pIGlmIGMuZ2V0KCdmcm9tX2NvbGxlY3Rpb24nKSkKICAgIHJlc3VsdFsncmVhbF90b3RhbF91c2QnXSA9IHJvdW5kKHJlYWxfdG90YWwsIDIpCiAgICByZXN1bHRbJ2Zyb21fY29sbGVjdGlvbl9jb3VudCddID0gZnJvbV9jb2xsZWN0aW9uX2NvdW50CiAgICByZXN1bHRbJ3RvdGFsX2NhcmRzJ10gPSBzdW0oYy5nZXQoJ2NvdW50JywgMSkgZm9yIGMgaW4gcmVzdWx0LmdldCgnY2FyZHMnLCBbXSkpCiAgICByZXN1bHRbJ2NvbG9yX2lkZW50aXR5J10gPSBjb2xvcl9pZGVudGl0eQoKICAgIHJldHVybiByZXN1bHQKCgpAYXBwLmdldCgnL2FwaS9wcGx4L3N0YXR1cycpCmFzeW5jIGRlZiBwcGx4X3N0YXR1cygpOgogICAgIiIiQ2hlY2sgaWYgUGVycGxleGl0eSBBUEkgaXMgY29uZmlndXJlZC4iIiIKICAgIHJldHVybiB7CiAgICAgICAgJ2NvbmZpZ3VyZWQnOiBib29sKENGRy5wcGx4X2FwaV9rZXkpLAogICAgICAgICdrZXlfcHJlZml4JzogQ0ZHLnBwbHhfYXBpX2tleVs6OF0gKyAnLi4uJyBpZiBDRkcucHBseF9hcGlfa2V5IGVsc2UgJycsCiAgICB9CgoKIyDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZAKIyBWMyBEZWNrIEdlbmVyYXRvciAoUGVycGxleGl0eSBTdHJ1Y3R1cmVkIE91dHB1dCkKIyDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZAKCkBhcHAuZ2V0KCcvYXBpL2RlY2svdjMvc3RhdHVzJykKYXN5bmMgZGVmIGRlY2tfZ2VuX3YzX3N0YXR1cygpOgogICAgIiIiQ2hlY2sgVjMgZGVjayBnZW5lcmF0b3Igc3RhdHVzLiIiIgogICAgcmV0dXJuIHsKICAgICAgICAnaW5pdGlhbGl6ZWQnOiBfZGVja19nZW5fdjMgaXMgbm90IE5vbmUsCiAgICAgICAgJ3BwbHhfY29uZmlndXJlZCc6IGJvb2woQ0ZHLnBwbHhfYXBpX2tleSksCiAgICAgICAgJ21vZGVsJzogX2RlY2tfZ2VuX3YzLnBwbHgubW9kZWwgaWYgX2RlY2tfZ2VuX3YzIGVsc2UgTm9uZSwKICAgICAgICAnZW1iZWRkaW5nc19sb2FkZWQnOiAoCiAgICAgICAgICAgIF9jb2FjaF9lbWJlZGRpbmdzLmxvYWRlZCBpZiBfY29hY2hfZW1iZWRkaW5ncyBlbHNlIEZhbHNlCiAgICAgICAgKSwKICAgICAgICAnZW1iZWRkaW5nX2NhcmRzJzogKAogICAgICAgICAgICBfY29hY2hfZW1iZWRkaW5ncy5jYXJkX2NvdW50IGlmIF9jb2FjaF9lbWJlZGRpbmdzIGVsc2UgMAogICAgICAgICksCiAgICAgICAgJ2Vycm9yJzogX2RlY2tfZ2VuX3YzX2Vycm9yLAogICAgfQoKCkBhcHAucG9zdCgnL2FwaS9kZWNrL3YzL2dlbmVyYXRlJykKYXN5bmMgZGVmIGRlY2tfZ2VuX3YzX2dlbmVyYXRlKHJlcTogRGVja0dlblYzUmVxdWVzdCk6CiAgICAiIiIKICAgIFYzIERlY2sgR2VuZXJhdGlvbiDigJQgUGVycGxleGl0eSBzdHJ1Y3R1cmVkIG91dHB1dCB3aXRoIFNtYXJ0IFN1YnN0aXR1dGlvbi4KCiAgICBQaXBlbGluZToKICAgICAgMS4gUmVzb2x2ZSBjb21tYW5kZXIgdmlhIFNjcnlmYWxsCiAgICAgIDIuIEJ1aWxkIGNvbGxlY3Rpb24gc3VtbWFyeSBmcm9tIERCCiAgICAgIDMuIENhbGwgUGVycGxleGl0eSBTb25hciB3aXRoIEpTT04gc2NoZW1hIGVuZm9yY2VtZW50CiAgICAgIDQuIENyb3NzLXJlZmVyZW5jZSBjYXJkcyB3aXRoIGNvbGxlY3Rpb24gZm9yIG93bmVyc2hpcAogICAgICA1LiBSdW4gU21hcnQgU3Vic3RpdHV0aW9uIChlbWJlZGRpbmcgKyBQZXJwbGV4aXR5IGZhbGxiYWNrKQogICAgICA2LiBSZXR1cm4gY29tcGxldGUgZGVjayB3aXRoIHN1YnN0aXR1dGlvbiBkYXRhCiAgICAiIiIKICAgIGlmIF9kZWNrX2dlbl92MyBpcyBOb25lOgogICAgICAgIHJhaXNlIEhUVFBFeGNlcHRpb24oNTAzLCAnVjMgRGVjayBHZW5lcmF0b3Igbm90IGluaXRpYWxpemVkLiBDaGVjayBQUExYX0FQSV9LRVkuJykKCiAgICBpZiBub3QgcmVxLmNvbW1hbmRlcl9uYW1lIG9yIGxlbihyZXEuY29tbWFuZGVyX25hbWUuc3RyaXAoKSkgPCAyOgogICAgICAgIHJhaXNlIEhUVFBFeGNlcHRpb24oNDAwLCAnQ29tbWFuZGVyIG5hbWUgaXMgcmVxdWlyZWQgKG1pbiAyIGNoYXJzKScpCgogICAgdHJ5OgogICAgICAgICMgR2VuZXJhdGUgZGVjawogICAgICAgIHJlc3VsdCA9IF9kZWNrX2dlbl92My5nZW5lcmF0ZV9kZWNrKAogICAgICAgICAgICBjb21tYW5kZXJfbmFtZT1yZXEuY29tbWFuZGVyX25hbWUuc3RyaXAoKSwKICAgICAgICAgICAgc3RyYXRlZ3k9cmVxLnN0cmF0ZWd5LAogICAgICAgICAgICB0YXJnZXRfYnJhY2tldD1yZXEudGFyZ2V0X2JyYWNrZXQsCiAgICAgICAgICAgIGJ1ZGdldF91c2Q9cmVxLmJ1ZGdldF91c2QsCiAgICAgICAgICAgIGJ1ZGdldF9tb2RlPXJlcS5idWRnZXRfbW9kZSwKICAgICAgICAgICAgb21pdF9jYXJkcz1yZXEub21pdF9jYXJkcywKICAgICAgICAgICAgdXNlX2NvbGxlY3Rpb249cmVxLnVzZV9jb2xsZWN0aW9uLAogICAgICAgICAgICBtb2RlbD1yZXEubW9kZWwsCiAgICAgICAgKQoKICAgICAgICAjIFJ1biBzdWJzdGl0dXRpb24gaWYgcmVxdWVzdGVkCiAgICAgICAgaWYgcmVxLnJ1bl9zdWJzdGl0dXRpb24gYW5kIHJlc3VsdC5nZXQoJ2NhcmRzJyk6CiAgICAgICAgICAgIGZyb20gY29hY2guc2NoZW1hcy5zdWJzdGl0dXRpb25fc2NoZW1hIGltcG9ydCBEZWNrQ2FyZFdpdGhTdGF0dXMKICAgICAgICAgICAgY2FyZHMgPSBbRGVja0NhcmRXaXRoU3RhdHVzKCoqYykgZm9yIGMgaW4gcmVzdWx0WydjYXJkcyddXQogICAgICAgICAgICBzdWJfcmVzdWx0ID0gX2RlY2tfZ2VuX3YzLnJ1bl9zdWJzdGl0dXRpb24oCiAgICAgICAgICAgICAgICBjYXJkcz1jYXJkcywKICAgICAgICAgICAgICAgIGNvbW1hbmRlcj1yZXN1bHRbJ2NvbW1hbmRlciddLAogICAgICAgICAgICAgICAgc3RyYXRlZ3k9cmVxLnN0cmF0ZWd5LAogICAgICAgICAgICApCiAgICAgICAgICAgIHJlc3VsdFsnY2FyZHMnXSA9IFtjLm1vZGVsX2R1bXAoKSBmb3IgYyBpbiBzdWJfcmVzdWx0LmNhcmRzXQogICAgICAgICAgICByZXN1bHRbJ3N1YnN0aXR1dGlvbl9zdGF0cyddID0gewogICAgICAgICAgICAgICAgJ293bmVkJzogc3ViX3Jlc3VsdC5vd25lZF9jb3VudCwKICAgICAgICAgICAgICAgICdzdWJzdGl0dXRlZCc6IHN1Yl9yZXN1bHQuc3Vic3RpdHV0ZWRfY291bnQsCiAgICAgICAgICAgICAgICAnbWlzc2luZyc6IHN1Yl9yZXN1bHQubWlzc2luZ19jb3VudCwKICAgICAgICAgICAgfQogICAgICAgICAgICAjIFJlY29tcHV0ZSBzdGF0cyB3aXRoIHVwZGF0ZWQgY2FyZHMKICAgICAgICAgICAgZnJvbSBjb2FjaC5zZXJ2aWNlcy5kZWNrX2dlbmVyYXRvciBpbXBvcnQgRGVja0dlbmVyYXRvclYzCiAgICAgICAgICAgIHJlc3VsdFsnc3RhdHMnXSA9IERlY2tHZW5lcmF0b3JWMy5fY29tcHV0ZV9zdGF0cyhzdWJfcmVzdWx0LmNhcmRzKQoKICAgICAgICByZXR1cm4gcmVzdWx0CgogICAgZXhjZXB0IFZhbHVlRXJyb3IgYXMgZToKICAgICAgICByZXR1cm4gSlNPTlJlc3BvbnNlKHsnZXJyb3InOiBzdHIoZSl9LCBzdGF0dXNfY29kZT00MjIpCiAgICBleGNlcHQgRXhjZXB0aW9uIGFzIGU6CiAgICAgICAgbG9nX2RlY2tnZW4uZXJyb3IoZidFcnJvcjoge2V9JykKICAgICAgICBpbXBvcnQgdHJhY2ViYWNrCiAgICAgICAgdHJhY2ViYWNrLnByaW50X2V4YygpCiAgICAgICAgcmFpc2UgSFRUUEV4Y2VwdGlvbig1MDAsIGYnRGVjayBnZW5lcmF0aW9uIGZhaWxlZDoge3N0cihlKX0nKQoKCkBhcHAucG9zdCgnL2FwaS9kZWNrL3YzL2NvbW1pdCcpCmFzeW5jIGRlZiBkZWNrX2dlbl92M19jb21taXQocmVxOiBEZWNrR2VuVjNSZXF1ZXN0KToKICAgICIiIgogICAgVjMgR2VuZXJhdGUgKyBDb21taXQg4oCUIGdlbmVyYXRlcyB0aGUgZGVjayBhbmQgc2F2ZXMgaXQgdG8gdGhlIERlY2sgQnVpbGRlciBEQi4KICAgIEFsc28gZXhwb3J0cyBhIC5kY2sgZmlsZSBmb3IgRm9yZ2UgU2ltIExhYi4KICAgICIiIgogICAgaWYgX2RlY2tfZ2VuX3YzIGlzIE5vbmU6CiAgICAgICAgcmFpc2UgSFRUUEV4Y2VwdGlvbig1MDMsICdWMyBEZWNrIEdlbmVyYXRvciBub3QgaW5pdGlhbGl6ZWQuJykKCiAgICBpZiBub3QgcmVxLmNvbW1hbmRlcl9uYW1lIG9yIGxlbihyZXEuY29tbWFuZGVyX25hbWUuc3RyaXAoKSkgPCAyOgogICAgICAgIHJhaXNlIEhUVFBFeGNlcHRpb24oNDAwLCAnQ29tbWFuZGVyIG5hbWUgaXMgcmVxdWlyZWQnKQoKICAgIHRyeToKICAgICAgICAjIEdlbmVyYXRlIGRlY2sgKHNhbWUgYXMgcHJldmlldykKICAgICAgICByZXN1bHQgPSBfZGVja19nZW5fdjMuZ2VuZXJhdGVfZGVjaygKICAgICAgICAgICAgY29tbWFuZGVyX25hbWU9cmVxLmNvbW1hbmRlcl9uYW1lLnN0cmlwKCksCiAgICAgICAgICAgIHN0cmF0ZWd5PXJlcS5zdHJhdGVneSwKICAgICAgICAgICAgdGFyZ2V0X2JyYWNrZXQ9cmVxLnRhcmdldF9icmFja2V0LAogICAgICAgICAgICBidWRnZXRfdXNkPXJlcS5idWRnZXRfdXNkLAogICAgICAgICAgICBidWRnZXRfbW9kZT1yZXEuYnVkZ2V0X21vZGUsCiAgICAgICAgICAgIG9taXRfY2FyZHM9cmVxLm9taXRfY2FyZHMsCiAgICAgICAgICAgIHVzZV9jb2xsZWN0aW9uPXJlcS51c2VfY29sbGVjdGlvbiwKICAgICAgICAgICAgbW9kZWw9cmVxLm1vZGVsLAogICAgICAgICkKCiAgICAgICAgIyBSdW4gc3Vic3RpdHV0aW9uCiAgICAgICAgaWYgcmVxLnJ1bl9zdWJzdGl0dXRpb24gYW5kIHJlc3VsdC5nZXQoJ2NhcmRzJyk6CiAgICAgICAgICAgIGZyb20gY29hY2guc2NoZW1hcy5zdWJzdGl0dXRpb25fc2NoZW1hIGltcG9ydCBEZWNrQ2FyZFdpdGhTdGF0dXMKICAgICAgICAgICAgY2FyZHMgPSBbRGVja0NhcmRXaXRoU3RhdHVzKCoqYykgZm9yIGMgaW4gcmVzdWx0WydjYXJkcyddXQogICAgICAgICAgICBzdWJfcmVzdWx0ID0gX2RlY2tfZ2VuX3YzLnJ1bl9zdWJzdGl0dXRpb24oCiAgICAgICAgICAgICAgICBjYXJkcz1jYXJkcywKICAgICAgICAgICAgICAgIGNvbW1hbmRlcj1yZXN1bHRbJ2NvbW1hbmRlciddLAogICAgICAgICAgICAgICAgc3RyYXRlZ3k9cmVxLnN0cmF0ZWd5LAogICAgICAgICAgICApCiAgICAgICAgICAgIHJlc3VsdFsnY2FyZHMnXSA9IFtjLm1vZGVsX2R1bXAoKSBmb3IgYyBpbiBzdWJfcmVzdWx0LmNhcmRzXQoKICAgICAgICAjIFNhdmUgdG8gREIKICAgICAgICBjb21tYW5kZXIgPSByZXN1bHRbJ2NvbW1hbmRlciddCiAgICAgICAgY29sb3JfaWRlbnRpdHkgPSByZXN1bHQuZ2V0KCdjb2xvcl9pZGVudGl0eScsIFtdKQogICAgICAgIGNhcmRzID0gcmVzdWx0LmdldCgnY2FyZHMnLCBbXSkKICAgICAgICBzdHJhdGVneSA9IHJlc3VsdC5nZXQoJ3N0cmF0ZWd5X3N1bW1hcnknLCAnJykKICAgICAgICBicmFja2V0ID0gcmVzdWx0LmdldCgnYnJhY2tldCcsIHt9KS5nZXQoJ2xldmVsJywgMCkKCiAgICAgICAgZGVja19uYW1lID0gKAogICAgICAgICAgICByZXEuZGVja19uYW1lCiAgICAgICAgICAgIG9yIGYiVjMgLSB7Y29tbWFuZGVyWyduYW1lJ119IC0gQnticmFja2V0fSAtIHtkYXRldGltZS5ub3coKS5zdHJmdGltZSgnJVktJW0tJWQgJUg6JU0nKX0iCiAgICAgICAgKQoKICAgICAgICBjb25uID0gX2dldF9kYl9jb25uKCkKICAgICAgICBjdXIgPSBjb25uLmV4ZWN1dGUoCiAgICAgICAgICAgICJJTlNFUlQgSU5UTyBkZWNrcyAobmFtZSwgY29tbWFuZGVyX3NjcnlmYWxsX2lkLCBjb21tYW5kZXJfbmFtZSwgY29sb3JfaWRlbnRpdHksIHN0cmF0ZWd5X3RhZykgIgogICAgICAgICAgICAiVkFMVUVTICg/LCA/LCA/LCA/LCA/KSIsCiAgICAgICAgICAgIChkZWNrX25hbWUsIGNvbW1hbmRlci5nZXQoJ3NjcnlmYWxsX2lkJywgJycpLAogICAgICAgICAgICAgY29tbWFuZGVyLmdldCgnbmFtZScsICcnKSwganNvbi5kdW1wcyhjb2xvcl9pZGVudGl0eSksCiAgICAgICAgICAgICBmInYzLWF1dG98QnticmFja2V0fXx7c3RyYXRlZ3lbOjYwXX0iKQogICAgICAgICkKICAgICAgICBjb25uLmNvbW1pdCgpCiAgICAgICAgZGVja19pZCA9IGN1ci5sYXN0cm93aWQKCiAgICAgICAgIyBJbnNlcnQgY29tbWFuZGVyCiAgICAgICAgY29ubi5leGVjdXRlKAogICAgICAgICAgICAiSU5TRVJUIElOVE8gZGVja19jYXJkcyAoZGVja19pZCwgc2NyeWZhbGxfaWQsIGNhcmRfbmFtZSwgcXVhbnRpdHksIGlzX2NvbW1hbmRlciwgcm9sZV90YWcpICIKICAgICAgICAgICAgIlZBTFVFUyAoPywgPywgPywgMSwgMSwgJ0NvbW1hbmRlcicpIiwKICAgICAgICAgICAgKGRlY2tfaWQsIGNvbW1hbmRlci5nZXQoJ3NjcnlmYWxsX2lkJywgJycpLCBjb21tYW5kZXIuZ2V0KCduYW1lJywgJycpKQogICAgICAgICkKCiAgICAgICAgIyBJbnNlcnQgdGhlIDk5CiAgICAgICAgZm9yIGNhcmQgaW4gY2FyZHM6CiAgICAgICAgICAgIGNhcmRfbmFtZSA9IGNhcmQuZ2V0KCduYW1lJywgJycpCiAgICAgICAgICAgIGlmIG5vdCBjYXJkX25hbWUgb3IgY2FyZF9uYW1lID09IGNvbW1hbmRlci5nZXQoJ25hbWUnLCAnJyk6CiAgICAgICAgICAgICAgICBjb250aW51ZSAgIyBTa2lwIGNvbW1hbmRlciAoYWxyZWFkeSBpbnNlcnRlZCkKICAgICAgICAgICAgc2NyeWZhbGxfaWQgPSBjYXJkLmdldCgnc2NyeWZhbGxfaWQnLCAnJykKICAgICAgICAgICAgIyBVc2Ugc3Vic3RpdHV0ZSBuYW1lIGlmIHN1YnN0aXR1dGVkCiAgICAgICAgICAgIGlmIGNhcmQuZ2V0KCdzdGF0dXMnKSA9PSAnc3Vic3RpdHV0ZWQnIGFuZCBjYXJkLmdldCgnc2VsZWN0ZWRfc3Vic3RpdHV0ZScpOgogICAgICAgICAgICAgICAgY2FyZF9uYW1lID0gY2FyZFsnc2VsZWN0ZWRfc3Vic3RpdHV0ZSddCiAgICAgICAgICAgIGNvbm4uZXhlY3V0ZSgKICAgICAgICAgICAgICAgICJJTlNFUlQgSU5UTyBkZWNrX2NhcmRzIChkZWNrX2lkLCBzY3J5ZmFsbF9pZCwgY2FyZF9uYW1lLCBxdWFudGl0eSwgaXNfY29tbWFuZGVyLCByb2xlX3RhZykgIgogICAgICAgICAgICAgICAgIlZBTFVFUyAoPywgPywgPywgPywgMCwgPykiLAogICAgICAgICAgICAgICAgKGRlY2tfaWQsIHNjcnlmYWxsX2lkLCBjYXJkX25hbWUsCiAgICAgICAgICAgICAgICAgY2FyZC5nZXQoJ2NvdW50JywgMSksIGNhcmQuZ2V0KCdjYXRlZ29yeScsICcnKSkKICAgICAgICAgICAgKQogICAgICAgIGNvbm4uY29tbWl0KCkKCiAgICAgICAgIyBFeHBvcnQgLmRjayBmb3IgRm9yZ2UKICAgICAgICB0cnk6CiAgICAgICAgICAgIGRlY2tzX2RpciA9IENGRy5mb3JnZV9kZWNrc19kaXIKICAgICAgICAgICAgaWYgZGVja3NfZGlyIGFuZCBvcy5wYXRoLmlzZGlyKGRlY2tzX2Rpcik6CiAgICAgICAgICAgICAgICBzYWZlX25hbWUgPSByZS5zdWIocidbXmEtekEtWjAtOV9cLVxzXScsICcnLCBkZWNrX25hbWUpLnN0cmlwKCkucmVwbGFjZSgnICcsICdfJykKICAgICAgICAgICAgICAgIGlmIG5vdCBzYWZlX25hbWU6CiAgICAgICAgICAgICAgICAgICAgc2FmZV9uYW1lID0gZiJWM0RlY2tfe2RlY2tfaWR9IgogICAgICAgICAgICAgICAgZGNrX3BhdGggPSBvcy5wYXRoLmpvaW4oZGVja3NfZGlyLCBmIntzYWZlX25hbWV9LmRjayIpCiAgICAgICAgICAgICAgICBkY2tfbGluZXMgPSBbIlttZXRhZGF0YV0iLCBmIk5hbWU9e2RlY2tfbmFtZX0iLCAiIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiW0NvbW1hbmRlcl0iLCBmIjEge2NvbW1hbmRlclsnbmFtZSddfSIsICIiLCAiW01haW5dIl0KICAgICAgICAgICAgICAgIGZvciBjYXJkIGluIGNhcmRzOgogICAgICAgICAgICAgICAgICAgIGNuYW1lID0gY2FyZC5nZXQoJ25hbWUnLCAnJykKICAgICAgICAgICAgICAgICAgICBpZiBjYXJkLmdldCgnc3RhdHVzJykgPT0gJ3N1YnN0aXR1dGVkJyBhbmQgY2FyZC5nZXQoJ3NlbGVjdGVkX3N1YnN0aXR1dGUnKToKICAgICAgICAgICAgICAgICAgICAgICAgY25hbWUgPSBjYXJkWydzZWxlY3RlZF9zdWJzdGl0dXRlJ10KICAgICAgICAgICAgICAgICAgICBpZiBjbmFtZSBhbmQgY25hbWUgIT0gY29tbWFuZGVyLmdldCgnbmFtZScsICcnKToKICAgICAgICAgICAgICAgICAgICAgICAgZGNrX2xpbmVzLmFwcGVuZChmIntjYXJkLmdldCgnY291bnQnLCAxKX0ge2NuYW1lfSIpCiAgICAgICAgICAgICAgICB3aXRoIG9wZW4oZGNrX3BhdGgsICd3JywgZW5jb2Rpbmc9J3V0Zi04JykgYXMgZjoKICAgICAgICAgICAgICAgICAgICBmLndyaXRlKCdcbicuam9pbihkY2tfbGluZXMpKQogICAgICAgICAgICAgICAgbG9nX2RlY2tnZW4uaW5mbyhmIiAgRXhwb3J0ZWQgLmRjazoge2Rja19wYXRofSIpCiAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbiBhcyBlOgogICAgICAgICAgICBsb2dfZGVja2dlbi5lcnJvcihmIiAgLmRjayBleHBvcnQgZmFpbGVkOiB7ZX0iKQoKICAgICAgICByZXN1bHRbJ2RlY2tfaWQnXSA9IGRlY2tfaWQKICAgICAgICByZXN1bHRbJ2RlY2tfbmFtZSddID0gZGVja19uYW1lCiAgICAgICAgbG9nX2RlY2tnZW4uaW5mbyhmIiAgQ29tbWl0dGVkIGRlY2sgJ3tkZWNrX25hbWV9JyAoSUQ6IHtkZWNrX2lkfSkiKQogICAgICAgIHJldHVybiByZXN1bHQKCiAgICBleGNlcHQgVmFsdWVFcnJvciBhcyBlOgogICAgICAgIHJldHVybiBKU09OUmVzcG9uc2UoeydlcnJvcic6IHN0cihlKX0sIHN0YXR1c19jb2RlPTQyMikKICAgIGV4Y2VwdCBFeGNlcHRpb24gYXMgZToKICAgICAgICBsb2dfZGVja2dlbi5lcnJvcihmJ0NvbW1pdCBlcnJvcjoge2V9JykKICAgICAgICBpbXBvcnQgdHJhY2ViYWNrCiAgICAgICAgdHJhY2ViYWNrLnByaW50X2V4YygpCiAgICAgICAgcmFpc2UgSFRUUEV4Y2VwdGlvbig1MDAsIGYnRGVjayBnZW5lcmF0aW9uL2NvbW1pdCBmYWlsZWQ6IHtzdHIoZSl9JykKCgpAYXBwLnBvc3QoJy9hcGkvZGVjay92My9leHBvcnQvY3N2JykKYXN5bmMgZGVmIGRlY2tfZ2VuX3YzX2V4cG9ydF9jc3YocmVxOiBEZWNrR2VuVjNSZXF1ZXN0KToKICAgICIiIkdlbmVyYXRlIGEgZGVjayBhbmQgcmV0dXJuIGFzIENTVi4iIiIKICAgIGlmIF9kZWNrX2dlbl92MyBpcyBOb25lOgogICAgICAgIHJhaXNlIEhUVFBFeGNlcHRpb24oNTAzLCAnVjMgRGVjayBHZW5lcmF0b3Igbm90IGluaXRpYWxpemVkLicpCgogICAgcmVzdWx0ID0gX2RlY2tfZ2VuX3YzLmdlbmVyYXRlX2RlY2soCiAgICAgICAgY29tbWFuZGVyX25hbWU9cmVxLmNvbW1hbmRlcl9uYW1lLnN0cmlwKCksCiAgICAgICAgc3RyYXRlZ3k9cmVxLnN0cmF0ZWd5LAogICAgICAgIHRhcmdldF9icmFja2V0PXJlcS50YXJnZXRfYnJhY2tldCwKICAgICAgICBidWRnZXRfdXNkPXJlcS5idWRnZXRfdXNkLAogICAgICAgIGJ1ZGdldF9tb2RlPXJlcS5idWRnZXRfbW9kZSwKICAgICAgICBvbWl0X2NhcmRzPXJlcS5vbWl0X2NhcmRzLAogICAgICAgIHVzZV9jb2xsZWN0aW9uPXJlcS51c2VfY29sbGVjdGlvbiwKICAgICAgICBtb2RlbD1yZXEubW9kZWwsCiAgICApCgogICAgY2FyZHMgPSByZXN1bHQuZ2V0KCdjYXJkcycsIFtdKQogICAgY29tbWFuZGVyID0gcmVzdWx0LmdldCgnY29tbWFuZGVyJywge30pCgogICAgb3V0cHV0ID0gaW8uU3RyaW5nSU8oKQogICAgd3JpdGVyID0gY3N2LndyaXRlcihvdXRwdXQpCiAgICB3cml0ZXIud3JpdGVyb3coWydDb3VudCcsICdOYW1lJywgJ0NhdGVnb3J5JywgJ1JvbGVzJywgJ1N0YXR1cycsICdQcmljZV9VU0QnLCAnUmVhc29uJ10pCiAgICAjIENvbW1hbmRlciByb3cKICAgIHdyaXRlci53cml0ZXJvdyhbMSwgY29tbWFuZGVyLmdldCgnbmFtZScsICcnKSwgJ0NvbW1hbmRlcicsICcnLCAnb3duZWQnLCAnJywgJ0NvbW1hbmRlciddKQogICAgZm9yIGNhcmQgaW4gY2FyZHM6CiAgICAgICAgaWYgY2FyZC5nZXQoJ25hbWUnKSA9PSBjb21tYW5kZXIuZ2V0KCduYW1lJywgJycpOgogICAgICAgICAgICBjb250aW51ZQogICAgICAgIHdyaXRlci53cml0ZXJvdyhbCiAgICAgICAgICAgIGNhcmQuZ2V0KCdjb3VudCcsIDEpLAogICAgICAgICAgICBjYXJkLmdldCgnbmFtZScsICcnKSwKICAgICAgICAgICAgY2FyZC5nZXQoJ2NhdGVnb3J5JywgJycpLAogICAgICAgICAgICAnOyAnLmpvaW4oY2FyZC5nZXQoJ3JvbGVfdGFncycsIFtdKSksCiAgICAgICAgICAgIGNhcmQuZ2V0KCdzdGF0dXMnLCAndW5rbm93bicpLAogICAgICAgICAgICBjYXJkLmdldCgnZXN0aW1hdGVkX3ByaWNlX3VzZCcsIDApLAogICAgICAgICAgICBjYXJkLmdldCgncmVhc29uJywgJycpLAogICAgICAgIF0pCgogICAgY3N2X2NvbnRlbnQgPSBvdXRwdXQuZ2V0dmFsdWUoKQogICAgc2FmZV9uYW1lID0gcmUuc3ViKHInW15hLXpBLVowLTlfXC1cc10nLCAnJywgY29tbWFuZGVyLmdldCgnbmFtZScsICdkZWNrJykpLnN0cmlwKCkucmVwbGFjZSgnICcsICdfJykKICAgIHJldHVybiBTdHJlYW1pbmdSZXNwb25zZSgKICAgICAgICBpby5CeXRlc0lPKGNzdl9jb250ZW50LmVuY29kZSgndXRmLTgnKSksCiAgICAgICAgbWVkaWFfdHlwZT0ndGV4dC9jc3YnLAogICAgICAgIGhlYWRlcnM9eydDb250ZW50LURpc3Bvc2l0aW9uJzogZidhdHRhY2htZW50OyBmaWxlbmFtZT0ie3NhZmVfbmFtZX1fZGVjay5jc3YiJ30sCiAgICApCgoKQGFwcC5wb3N0KCcvYXBpL2RlY2svdjMvZXhwb3J0L2RjaycpCmFzeW5jIGRlZiBkZWNrX2dlbl92M19leHBvcnRfZGNrKHJlcTogRGVja0dlblYzUmVxdWVzdCk6CiAgICAiIiJHZW5lcmF0ZSBhIGRlY2sgYW5kIHJldHVybiBhcyBGb3JnZSAuZGNrIGZvcm1hdC4iIiIKICAgIGlmIF9kZWNrX2dlbl92MyBpcyBOb25lOgogICAgICAgIHJhaXNlIEhUVFBFeGNlcHRpb24oNTAzLCAnVjMgRGVjayBHZW5lcmF0b3Igbm90IGluaXRpYWxpemVkLicpCgogICAgcmVzdWx0ID0gX2RlY2tfZ2VuX3YzLmdlbmVyYXRlX2RlY2soCiAgICAgICAgY29tbWFuZGVyX25hbWU9cmVxLmNvbW1hbmRlcl9uYW1lLnN0cmlwKCksCiAgICAgICAgc3RyYXRlZ3k9cmVxLnN0cmF0ZWd5LAogICAgICAgIHRhcmdldF9icmFja2V0PXJlcS50YXJnZXRfYnJhY2tldCwKICAgICAgICBidWRnZXRfdXNkPXJlcS5idWRnZXRfdXNkLAogICAgICAgIGJ1ZGdldF9tb2RlPXJlcS5idWRnZXRfbW9kZSwKICAgICAgICBvbWl0X2NhcmRzPXJlcS5vbWl0X2NhcmRzLAogICAgICAgIHVzZV9jb2xsZWN0aW9uPXJlcS51c2VfY29sbGVjdGlvbiwKICAgICAgICBtb2RlbD1yZXEubW9kZWwsCiAgICApCgogICAgY2FyZHMgPSByZXN1bHQuZ2V0KCdjYXJkcycsIFtdKQogICAgY29tbWFuZGVyID0gcmVzdWx0LmdldCgnY29tbWFuZGVyJywge30pCgogICAgbGluZXMgPSBbCiAgICAgICAgJ1ttZXRhZGF0YV0nLAogICAgICAgIGYnTmFtZT17Y29tbWFuZGVyLmdldCgibmFtZSIsICJEZWNrIil9IC0gVjMgQXV0bycsCiAgICAgICAgJycsCiAgICAgICAgJ1tDb21tYW5kZXJdJywKICAgICAgICBmJzEge2NvbW1hbmRlci5nZXQoIm5hbWUiLCAiIil9JywKICAgICAgICAnJywKICAgICAgICAnW01haW5dJywKICAgIF0KICAgIGZvciBjYXJkIGluIGNhcmRzOgogICAgICAgIGNuYW1lID0gY2FyZC5nZXQoJ25hbWUnLCAnJykKICAgICAgICBpZiBjYXJkLmdldCgnc3RhdHVzJykgPT0gJ3N1YnN0aXR1dGVkJyBhbmQgY2FyZC5nZXQoJ3NlbGVjdGVkX3N1YnN0aXR1dGUnKToKICAgICAgICAgICAgY25hbWUgPSBjYXJkWydzZWxlY3RlZF9zdWJzdGl0dXRlJ10KICAgICAgICBpZiBjbmFtZSBhbmQgY25hbWUgIT0gY29tbWFuZGVyLmdldCgnbmFtZScsICcnKToKICAgICAgICAgICAgbGluZXMuYXBwZW5kKGYie2NhcmQuZ2V0KCdjb3VudCcsIDEpfSB7Y25hbWV9IikKCiAgICBkY2tfY29udGVudCA9ICdcbicuam9pbihsaW5lcykKICAgIHNhZmVfbmFtZSA9IHJlLnN1YihyJ1teYS16QS1aMC05X1wtXHNdJywgJycsIGNvbW1hbmRlci5nZXQoJ25hbWUnLCAnZGVjaycpKS5zdHJpcCgpLnJlcGxhY2UoJyAnLCAnXycpCiAgICByZXR1cm4gU3RyZWFtaW5nUmVzcG9uc2UoCiAgICAgICAgaW8uQnl0ZXNJTyhkY2tfY29udGVudC5lbmNvZGUoJ3V0Zi04JykpLAogICAgICAgIG1lZGlhX3R5cGU9J3RleHQvcGxhaW4nLAogICAgICAgIGhlYWRlcnM9eydDb250ZW50LURpc3Bvc2l0aW9uJzogZidhdHRhY2htZW50OyBmaWxlbmFtZT0ie3NhZmVfbmFtZX0uZGNrIid9LAogICAgKQoKCkBhcHAucG9zdCgnL2FwaS9kZWNrL3YzL2V4cG9ydC9tb3hmaWVsZCcpCmFzeW5jIGRlZiBkZWNrX2dlbl92M19leHBvcnRfbW94ZmllbGQocmVxOiBEZWNrR2VuVjNSZXF1ZXN0KToKICAgICIiIkdlbmVyYXRlIGEgZGVjayBhbmQgcmV0dXJuIGluIE1veGZpZWxkIHBhc3RlIGZvcm1hdC4iIiIKICAgIGlmIF9kZWNrX2dlbl92MyBpcyBOb25lOgogICAgICAgIHJhaXNlIEhUVFBFeGNlcHRpb24oNTAzLCAnVjMgRGVjayBHZW5lcmF0b3Igbm90IGluaXRpYWxpemVkLicpCgogICAgcmVzdWx0ID0gX2RlY2tfZ2VuX3YzLmdlbmVyYXRlX2RlY2soCiAgICAgICAgY29tbWFuZGVyX25hbWU9cmVxLmNvbW1hbmRlcl9uYW1lLnN0cmlwKCksCiAgICAgICAgc3RyYXRlZ3k9cmVxLnN0cmF0ZWd5LAogICAgICAgIHRhcmdldF9icmFja2V0PXJlcS50YXJnZXRfYnJhY2tldCwKICAgICAgICBidWRnZXRfdXNkPXJlcS5idWRnZXRfdXNkLAogICAgICAgIGJ1ZGdldF9tb2RlPXJlcS5idWRnZXRfbW9kZSwKICAgICAgICBvbWl0X2NhcmRzPXJlcS5vbWl0X2NhcmRzLAogICAgICAgIHVzZV9jb2xsZWN0aW9uPXJlcS51c2VfY29sbGVjdGlvbiwKICAgICAgICBtb2RlbD1yZXEubW9kZWwsCiAgICApCgogICAgY2FyZHMgPSByZXN1bHQuZ2V0KCdjYXJkcycsIFtdKQogICAgY29tbWFuZGVyID0gcmVzdWx0LmdldCgnY29tbWFuZGVyJywge30pCgogICAgIyBNb3hmaWVsZCBmb3JtYXQ6IGNhcmQgbGluZXMgaW4gbWFpbiwgY29tbWFuZGVyIGluIGRlZGljYXRlZCBzZWN0aW9uCiAgICBsaW5lcyA9IFtdCiAgICBsaW5lcy5hcHBlbmQoJy8vIENvbW1hbmRlcicpCiAgICBsaW5lcy5hcHBlbmQoZicxIHtjb21tYW5kZXIuZ2V0KCJuYW1lIiwgIiIpfScpCiAgICBsaW5lcy5hcHBlbmQoJycpCiAgICBsaW5lcy5hcHBlbmQoJy8vIERlY2snKQogICAgZm9yIGNhcmQgaW4gY2FyZHM6CiAgICAgICAgY25hbWUgPSBjYXJkLmdldCgnbmFtZScsICcnKQogICAgICAgIGlmIGNhcmQuZ2V0KCdzdGF0dXMnKSA9PSAnc3Vic3RpdHV0ZWQnIGFuZCBjYXJkLmdldCgnc2VsZWN0ZWRfc3Vic3RpdHV0ZScpOgogICAgICAgICAgICBjbmFtZSA9IGNhcmRbJ3NlbGVjdGVkX3N1YnN0aXR1dGUnXQogICAgICAgIGlmIGNuYW1lIGFuZCBjbmFtZSAhPSBjb21tYW5kZXIuZ2V0KCduYW1lJywgJycpOgogICAgICAgICAgICBsaW5lcy5hcHBlbmQoZiJ7Y2FyZC5nZXQoJ2NvdW50JywgMSl9IHtjbmFtZX0iKQoKICAgIHR4dCA9ICdcbicuam9pbihsaW5lcykKICAgIHJldHVybiB7J2Zvcm1hdCc6ICdtb3hmaWVsZCcsICdjb250ZW50JzogdHh0LCAnY29tbWFuZGVyJzogY29tbWFuZGVyLmdldCgnbmFtZScsICcnKX0KCgpAYXBwLnBvc3QoJy9hcGkvZGVjay92My9leHBvcnQvc2hvcHBpbmcnKQphc3luYyBkZWYgZGVja19nZW5fdjNfZXhwb3J0X3Nob3BwaW5nKHJlcTogRGVja0dlblYzUmVxdWVzdCk6CiAgICAiIiJHZW5lcmF0ZSBhIGRlY2sgYW5kIHJldHVybiBhIHNob3BwaW5nIGxpc3Qgb2YgY2FyZHMgbm90IG93bmVkLiIiIgogICAgaWYgX2RlY2tfZ2VuX3YzIGlzIE5vbmU6CiAgICAgICAgcmFpc2UgSFRUUEV4Y2VwdGlvbig1MDMsICdWMyBEZWNrIEdlbmVyYXRvciBub3QgaW5pdGlhbGl6ZWQuJykKCiAgICByZXN1bHQgPSBfZGVja19nZW5fdjMuZ2VuZXJhdGVfZGVjaygKICAgICAgICBjb21tYW5kZXJfbmFtZT1yZXEuY29tbWFuZGVyX25hbWUuc3RyaXAoKSwKICAgICAgICBzdHJhdGVneT1yZXEuc3RyYXRlZ3ksCiAgICAgICAgdGFyZ2V0X2JyYWNrZXQ9cmVxLnRhcmdldF9icmFja2V0LAogICAgICAgIGJ1ZGdldF91c2Q9cmVxLmJ1ZGdldF91c2QsCiAgICAgICAgYnVkZ2V0X21vZGU9cmVxLmJ1ZGdldF9tb2RlLAogICAgICAgIG9taXRfY2FyZHM9cmVxLm9taXRfY2FyZHMsCiAgICAgICAgdXNlX2NvbGxlY3Rpb249cmVxLnVzZV9jb2xsZWN0aW9uLAogICAgICAgIG1vZGVsPXJlcS5tb2RlbCwKICAgICkKCiAgICBjYXJkcyA9IHJlc3VsdC5nZXQoJ2NhcmRzJywgW10pCiAgICBzaG9wcGluZyA9IFtdCiAgICB0b3RhbCA9IDAuMAogICAgZm9yIGNhcmQgaW4gY2FyZHM6CiAgICAgICAgaWYgbm90IGNhcmQuZ2V0KCdvd25lZCcsIFRydWUpIGFuZCBjYXJkLmdldCgnc3RhdHVzJykgIT0gJ3N1YnN0aXR1dGVkJzoKICAgICAgICAgICAgcHJpY2UgPSBjYXJkLmdldCgnZXN0aW1hdGVkX3ByaWNlX3VzZCcsIDApCiAgICAgICAgICAgIHNob3BwaW5nLmFwcGVuZCh7CiAgICAgICAgICAgICAgICAnbmFtZSc6IGNhcmQuZ2V0KCduYW1lJywgJycpLAogICAgICAgICAgICAgICAgJ2NvdW50JzogY2FyZC5nZXQoJ2NvdW50JywgMSksCiAgICAgICAgICAgICAgICAnY2F0ZWdvcnknOiBjYXJkLmdldCgnY2F0ZWdvcnknLCAnJyksCiAgICAgICAgICAgICAgICAnZXN0aW1hdGVkX3ByaWNlX3VzZCc6IHByaWNlLAogICAgICAgICAgICAgICAgJ3JlYXNvbic6IGNhcmQuZ2V0KCdyZWFzb24nLCAnJyksCiAgICAgICAgICAgIH0pCiAgICAgICAgICAgIHRvdGFsICs9IHByaWNlICogY2FyZC5nZXQoJ2NvdW50JywgMSkKCiAgICByZXR1cm4gewogICAgICAgICdjb21tYW5kZXInOiByZXN1bHQuZ2V0KCdjb21tYW5kZXInLCB7fSkuZ2V0KCduYW1lJywgJycpLAogICAgICAgICdzaG9wcGluZ19saXN0Jzogc2hvcHBpbmcsCiAgICAgICAgJ3RvdGFsX21pc3NpbmcnOiBsZW4oc2hvcHBpbmcpLAogICAgICAgICdlc3RpbWF0ZWRfY29zdF91c2QnOiByb3VuZCh0b3RhbCwgMiksCiAgICB9CgoKIyDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZAKIyBDb2FjaCBTZXJ2aWNlIChMTE0tcG93ZXJlZCBkZWNrIGNvYWNoaW5nKQojIOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkAoKIyBHbG9iYWwgY29hY2ggaW5zdGFuY2VzIChpbml0aWFsaXplZCBhdCBzdGFydHVwKQpfY29hY2hfc2VydmljZSA9IE5vbmUKX2NvYWNoX2VtYmVkZGluZ3MgPSBOb25lCl9jb2FjaF9sbG0gPSBOb25lCl9kZWNrX2dlbl92MyA9IE5vbmUgICMgVjMgRGVjayBHZW5lcmF0b3IgKFBlcnBsZXhpdHkgc3RydWN0dXJlZCBvdXRwdXQpCl9kZWNrX2dlbl92M19lcnJvciA9IE5vbmUgICMgRXJyb3IgbWVzc2FnZSBpZiBWMyBpbml0IGZhaWxlZAoKCmRlZiBpbml0X2NvYWNoX3NlcnZpY2UoKToKICAgICIiIkluaXRpYWxpemUgdGhlIGNvYWNoIHNlcnZpY2Ugd2l0aCBMTE0gY2xpZW50IGFuZCBlbWJlZGRpbmdzLiIiIgogICAgZ2xvYmFsIF9jb2FjaF9zZXJ2aWNlLCBfY29hY2hfZW1iZWRkaW5ncywgX2NvYWNoX2xsbSwgX2RlY2tfZ2VuX3YzLCBfZGVja19nZW5fdjNfZXJyb3IKICAgIHRyeToKICAgICAgICBmcm9tIGNvYWNoLmxsbV9jbGllbnQgaW1wb3J0IExNU3R1ZGlvQ2xpZW50CiAgICAgICAgZnJvbSBjb2FjaC5lbWJlZGRpbmdzIGltcG9ydCBNVEdFbWJlZGRpbmdJbmRleAogICAgICAgIGZyb20gY29hY2guY29hY2hfc2VydmljZSBpbXBvcnQgQ29hY2hTZXJ2aWNlCiAgICAgICAgZnJvbSBjb2FjaC5jb25maWcgaW1wb3J0IGVuc3VyZV9kaXJzCgogICAgICAgIGVuc3VyZV9kaXJzKCkKCiAgICAgICAgX2NvYWNoX2xsbSA9IExNU3R1ZGlvQ2xpZW50KCkKICAgICAgICBfY29hY2hfZW1iZWRkaW5ncyA9IE1UR0VtYmVkZGluZ0luZGV4KCkKCiAgICAgICAgIyBUcnkgdG8gbG9hZCBlbWJlZGRpbmdzIChub24tYmxvY2tpbmcg4oCUIGRvd25sb2FkIGhhcHBlbnMgb24gZmlyc3QgdXNlKQogICAgICAgIHRyeToKICAgICAgICAgICAgZnJvbSBjb2FjaC5jb25maWcgaW1wb3J0IEVNQkVERElOR1NfTlBaCiAgICAgICAgICAgIGlmIEVNQkVERElOR1NfTlBaLmV4aXN0cygpOgogICAgICAgICAgICAgICAgX2NvYWNoX2VtYmVkZGluZ3MubG9hZCgpCiAgICAgICAgICAgICAgICBsb2dfY29hY2guaW5mbyhmIiAgQ29hY2g6ICAgICAgICBFbWJlZGRpbmdzIGxvYWRlZCAoe19jb2FjaF9lbWJlZGRpbmdzLmNhcmRfY291bnR9IGNhcmRzKSIpCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBsb2dfY29hY2gud2FybmluZygiICBDb2FjaDogICAgICAgIEVtYmVkZGluZ3Mgbm90IHlldCBkb3dubG9hZGVkICh3aWxsIGRvd25sb2FkIG9uIGZpcnN0IHVzZSkiKQogICAgICAgIGV4Y2VwdCBFeGNlcHRpb24gYXMgZToKICAgICAgICAgICAgbG9nX2NvYWNoLmVycm9yKGYiICBDb2FjaDogICAgICAgIEVtYmVkZGluZ3MgbG9hZCBmYWlsZWQ6IHtlfSIpCgogICAgICAgIF9jb2FjaF9zZXJ2aWNlID0gQ29hY2hTZXJ2aWNlKF9jb2FjaF9sbG0sIF9jb2FjaF9lbWJlZGRpbmdzKQoKICAgICAgICAjIENoZWNrIExMTSBjb25uZWN0aW9uCiAgICAgICAgbGxtX3N0YXR1cyA9IF9jb2FjaF9sbG0uY2hlY2tfY29ubmVjdGlvbigpCiAgICAgICAgaWYgbGxtX3N0YXR1cy5nZXQoImNvbm5lY3RlZCIpOgogICAgICAgICAgICBsb2dfY29hY2guaW5mbyhmIiAgQ29hY2ggTExNOiAgICBDb25uZWN0ZWQgKHtsbG1fc3RhdHVzLmdldCgnYWN0aXZlX21vZGVsJywgJ3Vua25vd24nKX0pIikKICAgICAgICBlbHNlOgogICAgICAgICAgICBsb2dfY29hY2gud2FybmluZyhmIiAgQ29hY2ggTExNOiAgICBOb3QgY29ubmVjdGVkIChzdGFydCBMTSBTdHVkaW8gb24gMTkyLjE2OC4wLjEyMjoxMjM0KSIpCgogICAgICAgIGxvZ19jb2FjaC5pbmZvKCIgIENvYWNoOiAgICAgICAgU2VydmljZSBpbml0aWFsaXplZCIpCgogICAgICAgICMgSW5pdGlhbGl6ZSBWMyBEZWNrIEdlbmVyYXRvciAoUGVycGxleGl0eSkKICAgICAgICBfZGVja19nZW5fdjNfZXJyb3IgPSBOb25lCiAgICAgICAgaWYgQ0ZHLnBwbHhfYXBpX2tleToKICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgZnJvbSBjb2FjaC5jbGllbnRzLnBlcnBsZXhpdHlfY2xpZW50IGltcG9ydCBQZXJwbGV4aXR5Q2xpZW50CiAgICAgICAgICAgICAgICBmcm9tIGNvYWNoLnNlcnZpY2VzLmRlY2tfZ2VuZXJhdG9yIGltcG9ydCBEZWNrR2VuZXJhdG9yVjMKICAgICAgICAgICAgICAgIGZyb20gY29hY2guY29uZmlnIGltcG9ydCBERUNLX0dFTl9NT0RFTAoKICAgICAgICAgICAgICAgIHBwbHhfY2xpZW50ID0gUGVycGxleGl0eUNsaWVudCgKICAgICAgICAgICAgICAgICAgICBhcGlfa2V5PUNGRy5wcGx4X2FwaV9rZXksCiAgICAgICAgICAgICAgICAgICAgbW9kZWw9REVDS19HRU5fTU9ERUwsCiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICBfZGVja19nZW5fdjMgPSBEZWNrR2VuZXJhdG9yVjMoCiAgICAgICAgICAgICAgICAgICAgcHBseF9jbGllbnQ9cHBseF9jbGllbnQsCiAgICAgICAgICAgICAgICAgICAgZGJfY29ubl9mYWN0b3J5PV9nZXRfZGJfY29ubiwKICAgICAgICAgICAgICAgICAgICBlbWJlZGRpbmdfaW5kZXg9X2NvYWNoX2VtYmVkZGluZ3MsCiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICBsb2dfZGVja2dlbi5pbmZvKGYiICBEZWNrIEdlbiBWMzogIEluaXRpYWxpemVkIChtb2RlbDoge0RFQ0tfR0VOX01PREVMfSkiKQogICAgICAgICAgICBleGNlcHQgSW1wb3J0RXJyb3IgYXMgZToKICAgICAgICAgICAgICAgIF9kZWNrX2dlbl92M19lcnJvciA9IGYiTWlzc2luZyBkZXBlbmRlbmN5OiB7ZX0uIFJ1bjogcGlwIGluc3RhbGwgb3BlbmFpIgogICAgICAgICAgICAgICAgbG9nX2RlY2tnZW4uZXJyb3IoZiIgIERlY2sgR2VuIFYzOiAge19kZWNrX2dlbl92M19lcnJvcn0iKQogICAgICAgICAgICAgICAgX2RlY2tfZ2VuX3YzID0gTm9uZQogICAgICAgICAgICBleGNlcHQgRXhjZXB0aW9uIGFzIGU6CiAgICAgICAgICAgICAgICBfZGVja19nZW5fdjNfZXJyb3IgPSBzdHIoZSkKICAgICAgICAgICAgICAgIGxvZ19kZWNrZ2VuLmVycm9yKGYiICBEZWNrIEdlbiBWMzogIEZhaWxlZCB0byBpbml0aWFsaXplOiB7ZX0iKQogICAgICAgICAgICAgICAgX2RlY2tfZ2VuX3YzID0gTm9uZQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIF9kZWNrX2dlbl92M19lcnJvciA9ICJQUExYX0FQSV9LRVkgbm90IHNldCIKICAgICAgICAgICAgbG9nX2RlY2tnZW4uaW5mbygiICBEZWNrIEdlbiBWMzogIFNraXBwZWQgKG5vIFBQTFhfQVBJX0tFWSkiKQoKICAgIGV4Y2VwdCBFeGNlcHRpb24gYXMgZToKICAgICAgICBsb2dfY29hY2guZXJyb3IoZiIgIENvYWNoOiAgICAgICAgRmFpbGVkIHRvIGluaXRpYWxpemU6IHtlfSIpCiAgICAgICAgX2NvYWNoX3NlcnZpY2UgPSBOb25lCgoKQGFwcC5nZXQoIi9hcGkvY29hY2gvc3RhdHVzIikKYXN5bmMgZGVmIGNvYWNoX3N0YXR1cygpOgogICAgIiIiQ2hlY2sgY29hY2ggc3Vic3lzdGVtIGhlYWx0aC4iIiIKICAgIGlmIF9jb2FjaF9zZXJ2aWNlIGlzIE5vbmU6CiAgICAgICAgcmV0dXJuIHsibGxtQ29ubmVjdGVkIjogRmFsc2UsICJlbWJlZGRpbmdzTG9hZGVkIjogRmFsc2UsCiAgICAgICAgICAgICAgICAiZW1iZWRkaW5nQ2FyZHMiOiAwLCAiZGVja1JlcG9ydHNBdmFpbGFibGUiOiAwLAogICAgICAgICAgICAgICAgImVycm9yIjogIkNvYWNoIHNlcnZpY2Ugbm90IGluaXRpYWxpemVkIn0KICAgIHN0YXR1cyA9IF9jb2FjaF9zZXJ2aWNlLmdldF9zdGF0dXMoKQogICAgcmV0dXJuIHN0YXR1cy5tb2RlbF9kdW1wKCkKCgpAYXBwLmdldCgiL2FwaS9jb2FjaC9kZWNrcyIpCmFzeW5jIGRlZiBjb2FjaF9saXN0X2RlY2tzKCk6CiAgICAiIiJMaXN0IGFsbCBkZWNrcyBhdmFpbGFibGUgZm9yIGNvYWNoaW5nIChmcm9tIGRlY2sgYnVpbGRlciBEQikuIiIiCiAgICBjb25uID0gX2dldF9kYl9jb25uKCkKICAgIHJvd3MgPSBjb25uLmV4ZWN1dGUoCiAgICAgICAgIiIiU0VMRUNUIGQuaWQgYXMgZGVja19pZCwgZC5uYW1lIGFzIGRlY2tfbmFtZSwgZC5jb21tYW5kZXJfbmFtZSwKICAgICAgICAgICAgICAgICAgQ09VTlQoZGMuaWQpIGFzIGNhcmRfY291bnQKICAgICAgICAgICBGUk9NIGRlY2tzIGQKICAgICAgICAgICBMRUZUIEpPSU4gZGVja19jYXJkcyBkYyBPTiBkYy5kZWNrX2lkID0gZC5pZAogICAgICAgICAgIEdST1VQIEJZIGQuaWQKICAgICAgICAgICBPUkRFUiBCWSBkLm5hbWUiIiIKICAgICkuZmV0Y2hhbGwoKQoKICAgICMgQWxzbyBnZXQgcmVwb3J0IGF2YWlsYWJpbGl0eSBmcm9tIGNvYWNoIHNlcnZpY2UKICAgIHJlcG9ydF9pZHMgPSBzZXQoKQogICAgaWYgX2NvYWNoX3NlcnZpY2U6CiAgICAgICAgcmVwb3J0X2lkcyA9IHNldChfY29hY2hfc2VydmljZS5saXN0X2RlY2tfcmVwb3J0cygpKQoKICAgIGRlY2tzID0gW10KICAgIGZvciByIGluIHJvd3M6CiAgICAgICAgZGVja19uYW1lID0gclsiZGVja19uYW1lIl0KICAgICAgICAjIENoZWNrIGlmIGEgcmVwb3J0IGV4aXN0cyAoYnkgZGVjayBuYW1lIHNsdWcgbWF0Y2gpCiAgICAgICAgaGFzX3JlcG9ydCA9IGFueSgKICAgICAgICAgICAgZGVja19uYW1lLmxvd2VyKCkucmVwbGFjZSgiICIsICItIikgPT0gcmlkLmxvd2VyKCkgb3IKICAgICAgICAgICAgZGVja19uYW1lLmxvd2VyKCkgPT0gcmlkLmxvd2VyKCkKICAgICAgICAgICAgZm9yIHJpZCBpbiByZXBvcnRfaWRzCiAgICAgICAgKQogICAgICAgIGRlY2tzLmFwcGVuZCh7CiAgICAgICAgICAgICJkZWNrX2lkIjogclsiZGVja19pZCJdLAogICAgICAgICAgICAiZGVja19uYW1lIjogclsiZGVja19uYW1lIl0sCiAgICAgICAgICAgICJjb21tYW5kZXIiOiByWyJjb21tYW5kZXJfbmFtZSJdIG9yICIiLAogICAgICAgICAgICAiY2FyZF9jb3VudCI6IHJbImNhcmRfY291bnQiXSwKICAgICAgICAgICAgImhhc19yZXBvcnQiOiBoYXNfcmVwb3J0LAogICAgICAgICAgICAicmVwb3J0X2NvdW50IjogMSBpZiBoYXNfcmVwb3J0IGVsc2UgMCwKICAgICAgICAgICAgImxhc3RfcmVwb3J0X2RhdGUiOiBOb25lLAogICAgICAgIH0pCiAgICByZXR1cm4gZGVja3MKCgpAYXBwLmdldCgiL2FwaS9jb2FjaC9kZWNrcy97ZGVja19pZH0vcmVwb3J0IikKYXN5bmMgZGVmIGNvYWNoX2dldF9yZXBvcnQoZGVja19pZDogc3RyKToKICAgICIiIkdldCB0aGUgbGF0ZXN0IERlY2tSZXBvcnQgZm9yIGEgZGVjay4iIiIKICAgIGlmIF9jb2FjaF9zZXJ2aWNlIGlzIE5vbmU6CiAgICAgICAgcmFpc2UgSFRUUEV4Y2VwdGlvbig1MDAsICJDb2FjaCBzZXJ2aWNlIG5vdCBpbml0aWFsaXplZCIpCiAgICByZXBvcnQgPSBfY29hY2hfc2VydmljZS5sb2FkX2RlY2tfcmVwb3J0KGRlY2tfaWQpCiAgICBpZiByZXBvcnQgaXMgTm9uZToKICAgICAgICByYWlzZSBIVFRQRXhjZXB0aW9uKDQwNCwgZiJEZWNrIHJlcG9ydCBub3QgZm91bmQ6IHtkZWNrX2lkfSIpCiAgICByZXR1cm4gcmVwb3J0Lm1vZGVsX2R1bXAoKQoKCmNsYXNzIENvYWNoUmVxdWVzdEJvZHkoQmFzZU1vZGVsKToKICAgIGdvYWxzOiBPcHRpb25hbFtkaWN0XSA9IE5vbmUKCgpjbGFzcyBDb2FjaENoYXRNZXNzYWdlKEJhc2VNb2RlbCk6CiAgICByb2xlOiBzdHIgICMgInVzZXIiIG9yICJhc3Npc3RhbnQiCiAgICBjb250ZW50OiBzdHIKCmNsYXNzIENvYWNoQ2hhdFJlcXVlc3QoQmFzZU1vZGVsKToKICAgIGRlY2tfaWQ6IHN0cgogICAgbWVzc2FnZXM6IGxpc3RbZGljdF0gICMgY29udmVyc2F0aW9uIGhpc3RvcnkgW3tyb2xlLCBjb250ZW50fV0KICAgIGdvYWxzOiBPcHRpb25hbFtkaWN0XSA9IE5vbmUKICAgIHN0cmVhbTogT3B0aW9uYWxbYm9vbF0gPSBGYWxzZQoKY2xhc3MgQ29hY2hBcHBseVJlcXVlc3QoQmFzZU1vZGVsKToKICAgIHNlc3Npb25faWQ6IHN0cgogICAgZGVja19pZDogaW50ICAjIG51bWVyaWMgZGVjayBJRCBpbiB0aGUgREIKICAgIGFjY2VwdGVkX2N1dHM6IGxpc3Rbc3RyXSA9IFtdICAjIGNhcmQgbmFtZXMgdG8gcmVtb3ZlCiAgICBhY2NlcHRlZF9hZGRzOiBsaXN0W3N0cl0gPSBbXSAgIyBjYXJkIG5hbWVzIHRvIGFkZAoKY2xhc3MgQ29hY2hHb2Fsc1JlcXVlc3QoQmFzZU1vZGVsKToKICAgIHRhcmdldF9wb3dlcl9sZXZlbDogT3B0aW9uYWxbaW50XSA9IE5vbmUgICMgMS0xMAogICAgbWV0YV9mb2N1czogT3B0aW9uYWxbc3RyXSA9IE5vbmUgICMgYWdncm8sIGNvbnRyb2wsIGNvbWJvLCBtaWRyYW5nZSwgc3RheAogICAgYnVkZ2V0OiBPcHRpb25hbFtzdHJdID0gTm9uZSAgIyBidWRnZXQsIG1lZGl1bSwgbm8tbGltaXQKICAgIGZvY3VzX2FyZWFzOiBsaXN0W3N0cl0gPSBbXSAgIyBlLmcuLCBbInJhbXAiLCAiY2FyZCBkcmF3Il0KCgpAYXBwLnBvc3QoIi9hcGkvY29hY2gvZGVja3Mve2RlY2tfaWR9IikKYXN5bmMgZGVmIGNvYWNoX3J1bl9zZXNzaW9uKGRlY2tfaWQ6IHN0ciwgYm9keTogQ29hY2hSZXF1ZXN0Qm9keSA9IE5vbmUpOgogICAgIiIiVHJpZ2dlciBhIGNvYWNoaW5nIHNlc3Npb24gZm9yIGEgZGVjay4iIiIKICAgIGlmIF9jb2FjaF9zZXJ2aWNlIGlzIE5vbmU6CiAgICAgICAgcmFpc2UgSFRUUEV4Y2VwdGlvbig1MDAsICJDb2FjaCBzZXJ2aWNlIG5vdCBpbml0aWFsaXplZCIpCgogICAgIyBMb2FkIGVtYmVkZGluZ3Mgb24gZmlyc3QgdXNlIGlmIG5vdCBsb2FkZWQKICAgIGlmIF9jb2FjaF9lbWJlZGRpbmdzIGFuZCBub3QgX2NvYWNoX2VtYmVkZGluZ3MubG9hZGVkOgogICAgICAgIHRyeToKICAgICAgICAgICAgX2NvYWNoX2VtYmVkZGluZ3MubG9hZChmb3JjZV9kb3dubG9hZD1UcnVlKQogICAgICAgIGV4Y2VwdCBFeGNlcHRpb24gYXMgZToKICAgICAgICAgICAgbG9nX2NvYWNoLmVycm9yKGYiICBDb2FjaDogRW1iZWRkaW5ncyBkb3dubG9hZCBmYWlsZWQ6IHtlfSIpCgogICAgZ29hbHMgPSBOb25lCiAgICBpZiBib2R5IGFuZCBib2R5LmdvYWxzOgogICAgICAgIGZyb20gY29hY2gubW9kZWxzIGltcG9ydCBDb2FjaEdvYWxzCiAgICAgICAgdHJ5OgogICAgICAgICAgICBnb2FscyA9IENvYWNoR29hbHMoKipib2R5LmdvYWxzKQogICAgICAgIGV4Y2VwdCBFeGNlcHRpb246CiAgICAgICAgICAgIGdvYWxzID0gTm9uZQoKICAgICMgQnVpbGQgYSBmYWxsYmFjayBEZWNrUmVwb3J0IGZyb20gdGhlIERCIGlmIG5vIHNpbXVsYXRpb24gcmVwb3J0IGV4aXN0cwogICAgZmFsbGJhY2tfcmVwb3J0ID0gTm9uZQogICAgdHJ5OgogICAgICAgIGZhbGxiYWNrX3JlcG9ydCA9IF9idWlsZF9kZWNrX3JlcG9ydF9mcm9tX2RiKGRlY2tfaWQpCiAgICBleGNlcHQgRXhjZXB0aW9uIGFzIGU6CiAgICAgICAgbG9nX2NvYWNoLmVycm9yKGYiICBDb2FjaDogRmFsbGJhY2sgcmVwb3J0IGJ1aWxkIGZhaWxlZCBmb3IgJ3tkZWNrX2lkfSc6IHtlfSIpCgogICAgdHJ5OgogICAgICAgIHNlc3Npb24gPSBhd2FpdCBfY29hY2hfc2VydmljZS5ydW5fY29hY2hpbmdfc2Vzc2lvbihkZWNrX2lkLCBnb2FscywgZmFsbGJhY2tfcmVwb3J0PWZhbGxiYWNrX3JlcG9ydCkKICAgICAgICByZXR1cm4gc2Vzc2lvbi5tb2RlbF9kdW1wKCkKICAgIGV4Y2VwdCBWYWx1ZUVycm9yIGFzIGU6CiAgICAgICAgcmFpc2UgSFRUUEV4Y2VwdGlvbig0MDQsIHN0cihlKSkKICAgIGV4Y2VwdCBDb25uZWN0aW9uRXJyb3IgYXMgZToKICAgICAgICByYWlzZSBIVFRQRXhjZXB0aW9uKDUwMywgZiJMTE0gY29ubmVjdGlvbiBmYWlsZWQ6IHtlfSIpCiAgICBleGNlcHQgRXhjZXB0aW9uIGFzIGU6CiAgICAgICAgcmFpc2UgSFRUUEV4Y2VwdGlvbig1MDAsIGYiQ29hY2ggc2Vzc2lvbiBmYWlsZWQ6IHtlfSIpCgoKZGVmIF9idWlsZF9kZWNrX3JlcG9ydF9mcm9tX2RiKGRlY2tfc2x1Zzogc3RyKToKICAgICIiIgogICAgQnVpbGQgYSBsaWdodHdlaWdodCBEZWNrUmVwb3J0IGZyb20gdGhlIGRlY2sgYnVpbGRlciBEQiB3aGVuIG5vCiAgICBzaW11bGF0aW9uIHJlcG9ydCBleGlzdHMuIEFsbG93cyB0aGUgY29hY2ggdG8gYW5hbHl6ZSBkZWNrIGNvbXBvc2l0aW9uCiAgICBldmVuIHdpdGhvdXQgc2ltdWxhdGlvbiBkYXRhLgogICAgIiIiCiAgICBmcm9tIGNvYWNoLm1vZGVscyBpbXBvcnQgRGVja1JlcG9ydCwgQ2FyZFBlcmZvcm1hbmNlLCBEZWNrU3RydWN0dXJlCiAgICBjb25uID0gX2dldF9kYl9jb25uKCkKCiAgICAjIEZpbmQgdGhlIGRlY2sgYnkgc2x1ZyBtYXRjaCBhZ2FpbnN0IHRoZSBkZWNrIG5hbWUKICAgIHJvd3MgPSBjb25uLmV4ZWN1dGUoCiAgICAgICAgIlNFTEVDVCBpZCwgbmFtZSwgY29tbWFuZGVyX25hbWUsIGNvbG9yX2lkZW50aXR5IEZST00gZGVja3MgT1JERVIgQlkgaWQiCiAgICApLmZldGNoYWxsKCkKCiAgICBtYXRjaGVkX2RlY2sgPSBOb25lCiAgICBmb3IgciBpbiByb3dzOgogICAgICAgIG5hbWUgPSByWyJuYW1lIl0gb3IgIiIKICAgICAgICBzbHVnID0gbmFtZS5sb3dlcigpLnJlcGxhY2UoIiAiLCAiLSIpCiAgICAgICAgIyBBbHNvIHRyeSBhIG1vcmUgdGhvcm91Z2ggc2x1Z2lmeQogICAgICAgIGltcG9ydCByZQogICAgICAgIGNsZWFuX3NsdWcgPSByZS5zdWIocidbXmEtejAtOV0rJywgJy0nLCBuYW1lLmxvd2VyKCkpLnN0cmlwKCctJykKICAgICAgICBpZiBzbHVnID09IGRlY2tfc2x1Zy5sb3dlcigpIG9yIGNsZWFuX3NsdWcgPT0gZGVja19zbHVnLmxvd2VyKCkgb3IgbmFtZS5sb3dlcigpID09IGRlY2tfc2x1Zy5sb3dlcigpOgogICAgICAgICAgICBtYXRjaGVkX2RlY2sgPSByCiAgICAgICAgICAgIGJyZWFrCgogICAgaWYgbWF0Y2hlZF9kZWNrIGlzIE5vbmU6CiAgICAgICAgcmV0dXJuIE5vbmUKCiAgICBkZWNrX2lkID0gbWF0Y2hlZF9kZWNrWyJpZCJdCiAgICBkZWNrX25hbWUgPSBtYXRjaGVkX2RlY2tbIm5hbWUiXQogICAgY29tbWFuZGVyID0gbWF0Y2hlZF9kZWNrWyJjb21tYW5kZXJfbmFtZSJdIG9yICIiCgogICAgIyBQYXJzZSBjb2xvciBpZGVudGl0eQogICAgY2lfcmF3ID0gbWF0Y2hlZF9kZWNrWyJjb2xvcl9pZGVudGl0eSJdIG9yICJbXSIKICAgIHRyeToKICAgICAgICBjb2xvcl9pZGVudGl0eSA9IGpzb24ubG9hZHMoY2lfcmF3KSBpZiBpc2luc3RhbmNlKGNpX3Jhdywgc3RyKSBlbHNlIGNpX3JhdwogICAgZXhjZXB0IEV4Y2VwdGlvbjoKICAgICAgICBjb2xvcl9pZGVudGl0eSA9IFtdCgogICAgIyBMb2FkIGFsbCBjYXJkcyBpbiB0aGlzIGRlY2sKICAgIGNhcmRfcm93cyA9IGNvbm4uZXhlY3V0ZSgKICAgICAgICAiIiJTRUxFQ1QgZGMuY2FyZF9uYW1lLCBkYy5xdWFudGl0eSwgZGMuaXNfY29tbWFuZGVyLCBkYy5yb2xlX3RhZywKICAgICAgICAgICAgICAgICAgY2UudHlwZV9saW5lLCBjZS5jbWMsIGNlLm9yYWNsZV90ZXh0CiAgICAgICAgICAgRlJPTSBkZWNrX2NhcmRzIGRjCiAgICAgICAgICAgTEVGVCBKT0lOIGNvbGxlY3Rpb25fZW50cmllcyBjZSBPTiBMT1dFUihkYy5jYXJkX25hbWUpID0gTE9XRVIoY2UubmFtZSkKICAgICAgICAgICBXSEVSRSBkYy5kZWNrX2lkID0gPyIiIiwKICAgICAgICAoZGVja19pZCwpCiAgICApLmZldGNoYWxsKCkKCiAgICBjYXJkcyA9IFtdCiAgICB0eXBlX2NvdW50cyA9IHt9CiAgICBjbWNfYnVja2V0cyA9IFswXSAqIDgKICAgIGxhbmRfY291bnQgPSAwCgogICAgZm9yIGNyIGluIGNhcmRfcm93czoKICAgICAgICBjYXJkX25hbWUgPSBjclsiY2FyZF9uYW1lIl0gb3IgIiIKICAgICAgICB0eXBlX2xpbmUgPSBjclsidHlwZV9saW5lIl0gb3IgIiIKICAgICAgICBjbWMgPSBjclsiY21jIl0gb3IgMAogICAgICAgIHF0eSA9IGNyWyJxdWFudGl0eSJdIG9yIDEKICAgICAgICByb2xlX3RhZyA9IGNyWyJyb2xlX3RhZyJdIG9yICIiCgogICAgICAgICMgQnVpbGQgdGFncyBmcm9tIHR5cGVfbGluZSBhbmQgcm9sZV90YWcKICAgICAgICB0YWdzID0gW10KICAgICAgICBpZiByb2xlX3RhZzoKICAgICAgICAgICAgdGFncy5hcHBlbmQocm9sZV90YWcpCiAgICAgICAgaWYgIkxhbmQiIGluIHR5cGVfbGluZToKICAgICAgICAgICAgdGFncy5hcHBlbmQoImxhbmQiKQogICAgICAgICAgICBsYW5kX2NvdW50ICs9IHF0eQogICAgICAgIGVsaWYgIkNyZWF0dXJlIiBpbiB0eXBlX2xpbmU6CiAgICAgICAgICAgIHRhZ3MuYXBwZW5kKCJjcmVhdHVyZSIpCiAgICAgICAgZWxpZiAiSW5zdGFudCIgaW4gdHlwZV9saW5lOgogICAgICAgICAgICB0YWdzLmFwcGVuZCgiaW5zdGFudCIpCiAgICAgICAgZWxpZiAiU29yY2VyeSIgaW4gdHlwZV9saW5lOgogICAgICAgICAgICB0YWdzLmFwcGVuZCgic29yY2VyeSIpCiAgICAgICAgZWxpZiAiQXJ0aWZhY3QiIGluIHR5cGVfbGluZToKICAgICAgICAgICAgdGFncy5hcHBlbmQoImFydGlmYWN0IikKICAgICAgICBlbGlmICJFbmNoYW50bWVudCIgaW4gdHlwZV9saW5lOgogICAgICAgICAgICB0YWdzLmFwcGVuZCgiZW5jaGFudG1lbnQiKQogICAgICAgIGVsaWYgIlBsYW5lc3dhbGtlciIgaW4gdHlwZV9saW5lOgogICAgICAgICAgICB0YWdzLmFwcGVuZCgicGxhbmVzd2Fsa2VyIikKCiAgICAgICAgIyBUeXBlIGNvdW50CiAgICAgICAgZm9yIHQgaW4gWyJDcmVhdHVyZSIsICJJbnN0YW50IiwgIlNvcmNlcnkiLCAiQXJ0aWZhY3QiLCAiRW5jaGFudG1lbnQiLCAiUGxhbmVzd2Fsa2VyIiwgIkxhbmQiXToKICAgICAgICAgICAgaWYgdCBpbiB0eXBlX2xpbmU6CiAgICAgICAgICAgICAgICB0eXBlX2NvdW50c1t0XSA9IHR5cGVfY291bnRzLmdldCh0LCAwKSArIHF0eQoKICAgICAgICAjIENNQyBidWNrZXQKICAgICAgICBidWNrZXQgPSBtaW4oaW50KGNtYyksIDcpCiAgICAgICAgY21jX2J1Y2tldHNbYnVja2V0XSArPSBxdHkKCiAgICAgICAgIyBDYXJkUGVyZm9ybWFuY2Ugd2l0aCB6ZXJvZWQtb3V0IHNpbSBzdGF0cwogICAgICAgIGNhcmRzLmFwcGVuZChDYXJkUGVyZm9ybWFuY2UoCiAgICAgICAgICAgIG5hbWU9Y2FyZF9uYW1lLAogICAgICAgICAgICBkcmF3blJhdGU9MC4wLAogICAgICAgICAgICBjYXN0UmF0ZT0wLjAsCiAgICAgICAgICAgIGltcGFjdFNjb3JlPTAuMCwKICAgICAgICAgICAgdGFncz10YWdzLAogICAgICAgICkpCgogICAgc2x1ZyA9IGRlY2tfc2x1ZwogICAgcmV0dXJuIERlY2tSZXBvcnQoCiAgICAgICAgZGVja0lkPXNsdWcsCiAgICAgICAgY29tbWFuZGVyPWNvbW1hbmRlciwKICAgICAgICBjb2xvcklkZW50aXR5PWNvbG9yX2lkZW50aXR5LAogICAgICAgIGNhcmRzPWNhcmRzLAogICAgICAgIHN0cnVjdHVyZT1EZWNrU3RydWN0dXJlKAogICAgICAgICAgICBsYW5kQ291bnQ9bGFuZF9jb3VudCwKICAgICAgICAgICAgY3VydmVCdWNrZXRzPWNtY19idWNrZXRzLAogICAgICAgICAgICBjYXJkVHlwZUNvdW50cz10eXBlX2NvdW50cywKICAgICAgICApLAogICAgKQoKCkBhcHAuZ2V0KCIvYXBpL2NvYWNoL3Nlc3Npb25zIikKYXN5bmMgZGVmIGNvYWNoX2xpc3Rfc2Vzc2lvbnMoZGVja19pZDogc3RyID0gTm9uZSk6CiAgICAiIiJMaXN0IGFsbCBjb2FjaGluZyBzZXNzaW9ucywgb3B0aW9uYWxseSBmaWx0ZXJlZCBieSBkZWNrLiIiIgogICAgaWYgX2NvYWNoX3NlcnZpY2UgaXMgTm9uZToKICAgICAgICByYWlzZSBIVFRQRXhjZXB0aW9uKDUwMCwgIkNvYWNoIHNlcnZpY2Ugbm90IGluaXRpYWxpemVkIikKICAgIHJldHVybiB7InNlc3Npb25zIjogX2NvYWNoX3NlcnZpY2UubGlzdF9zZXNzaW9ucyhkZWNrX2lkKX0KCgpAYXBwLmdldCgiL2FwaS9jb2FjaC9zZXNzaW9ucy97c2Vzc2lvbl9pZH0iKQphc3luYyBkZWYgY29hY2hfZ2V0X3Nlc3Npb24oc2Vzc2lvbl9pZDogc3RyKToKICAgICIiIkdldCBhIHNwZWNpZmljIGNvYWNoaW5nIHNlc3Npb24uIiIiCiAgICBpZiBfY29hY2hfc2VydmljZSBpcyBOb25lOgogICAgICAgIHJhaXNlIEhUVFBFeGNlcHRpb24oNTAwLCAiQ29hY2ggc2VydmljZSBub3QgaW5pdGlhbGl6ZWQiKQogICAgc2Vzc2lvbiA9IF9jb2FjaF9zZXJ2aWNlLmxvYWRfc2Vzc2lvbihzZXNzaW9uX2lkKQogICAgaWYgc2Vzc2lvbiBpcyBOb25lOgogICAgICAgIHJhaXNlIEhUVFBFeGNlcHRpb24oNDA0LCBmIlNlc3Npb24gbm90IGZvdW5kOiB7c2Vzc2lvbl9pZH0iKQogICAgcmV0dXJuIHNlc3Npb24ubW9kZWxfZHVtcCgpCgoKQGFwcC5wb3N0KCIvYXBpL2NvYWNoL2VtYmVkZGluZ3MvZG93bmxvYWQiKQphc3luYyBkZWYgY29hY2hfZG93bmxvYWRfZW1iZWRkaW5ncygpOgogICAgIiIiRG93bmxvYWQgYW5kIGNvbnZlcnQgTVRHIGNhcmQgZW1iZWRkaW5ncyBmcm9tIEh1Z2dpbmdGYWNlLiIiIgogICAgaWYgX2NvYWNoX2VtYmVkZGluZ3MgaXMgTm9uZToKICAgICAgICByYWlzZSBIVFRQRXhjZXB0aW9uKDUwMCwgIkNvYWNoIHNlcnZpY2Ugbm90IGluaXRpYWxpemVkIikKICAgIHRyeToKICAgICAgICBfY29hY2hfZW1iZWRkaW5ncy5sb2FkKGZvcmNlX2Rvd25sb2FkPVRydWUpCiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgInN1Y2Nlc3MiOiBUcnVlLAogICAgICAgICAgICAiY2FyZHMiOiBfY29hY2hfZW1iZWRkaW5ncy5jYXJkX2NvdW50LAogICAgICAgICAgICAibWVzc2FnZSI6IGYiTG9hZGVkIHtfY29hY2hfZW1iZWRkaW5ncy5jYXJkX2NvdW50fSBjYXJkIGVtYmVkZGluZ3MiCiAgICAgICAgfQogICAgZXhjZXB0IEV4Y2VwdGlvbiBhcyBlOgogICAgICAgIHJhaXNlIEhUVFBFeGNlcHRpb24oNTAwLCBmIkZhaWxlZCB0byBkb3dubG9hZCBlbWJlZGRpbmdzOiB7ZX0iKQoKCkBhcHAuZ2V0KCIvYXBpL2NvYWNoL2VtYmVkZGluZ3Mvc2VhcmNoIikKYXN5bmMgZGVmIGNvYWNoX3NlYXJjaF9zaW1pbGFyKGNhcmQ6IHN0ciwgY29sb3JzOiBzdHIgPSBOb25lLCB0b3BfbjogaW50ID0gMTApOgogICAgIiIiU2VhcmNoIGZvciBzaW1pbGFyIGNhcmRzIGJ5IG5hbWUuIiIiCiAgICBpZiBfY29hY2hfZW1iZWRkaW5ncyBpcyBOb25lIG9yIG5vdCBfY29hY2hfZW1iZWRkaW5ncy5sb2FkZWQ6CiAgICAgICAgcmFpc2UgSFRUUEV4Y2VwdGlvbig1MDMsICJFbWJlZGRpbmdzIG5vdCBsb2FkZWQiKQogICAgY29sb3JfZmlsdGVyID0gbGlzdChjb2xvcnMudXBwZXIoKSkgaWYgY29sb3JzIGVsc2UgTm9uZQogICAgbWF0Y2hlcyA9IF9jb2FjaF9lbWJlZGRpbmdzLnNlYXJjaF9zaW1pbGFyKAogICAgICAgIHF1ZXJ5X2NhcmQ9Y2FyZCwgY29sb3JfZmlsdGVyPWNvbG9yX2ZpbHRlciwgdG9wX249dG9wX24KICAgICkKICAgIHJldHVybiB7InF1ZXJ5IjogY2FyZCwgIm1hdGNoZXMiOiBbbS50b19kaWN0KCkgZm9yIG0gaW4gbWF0Y2hlc119CgoKQGFwcC5wb3N0KCIvYXBpL2NvYWNoL2NoYXQiKQphc3luYyBkZWYgY29hY2hfY2hhdChib2R5OiBDb2FjaENoYXRSZXF1ZXN0KToKICAgICIiIk11bHRpLXR1cm4gY29hY2hpbmcgY2hhdC4gU2VuZHMgY29udmVyc2F0aW9uIGhpc3RvcnkgdG8gTExNIGFuZCByZXR1cm5zIHJlc3BvbnNlLiIiIgogICAgaWYgX2NvYWNoX3NlcnZpY2UgaXMgTm9uZToKICAgICAgICByYWlzZSBIVFRQRXhjZXB0aW9uKDUwMCwgIkNvYWNoIHNlcnZpY2Ugbm90IGluaXRpYWxpemVkIikKCiAgICAjIExvYWQgZGVjayByZXBvcnQgZm9yIGNvbnRleHQKICAgIHJlcG9ydCA9IF9jb2FjaF9zZXJ2aWNlLmxvYWRfZGVja19yZXBvcnQoYm9keS5kZWNrX2lkKQoKICAgICMgQnVpbGQgc3lzdGVtIHByb21wdCB3aXRoIHJlcG9ydCBjb250ZXh0CiAgICBmcm9tIGNvYWNoLnByb21wdF90ZW1wbGF0ZSBpbXBvcnQgYnVpbGRfc3lzdGVtX3Byb21wdAogICAgZnJvbSBjb2FjaC5tb2RlbHMgaW1wb3J0IENvYWNoR29hbHMKCiAgICBnb2FscyA9IE5vbmUKICAgIGlmIGJvZHkuZ29hbHM6CiAgICAgICAgdHJ5OgogICAgICAgICAgICBnb2FscyA9IENvYWNoR29hbHMoKipib2R5LmdvYWxzKQogICAgICAgIGV4Y2VwdCBFeGNlcHRpb246CiAgICAgICAgICAgIGdvYWxzID0gTm9uZQoKICAgIHN5c3RlbV9wcm9tcHQgPSAiIgogICAgaWYgcmVwb3J0OgogICAgICAgIHN5c3RlbV9wcm9tcHQgPSBidWlsZF9zeXN0ZW1fcHJvbXB0KHJlcG9ydCwgZ29hbHMpCiAgICBlbHNlOgogICAgICAgIHN5c3RlbV9wcm9tcHQgPSAoCiAgICAgICAgICAgICJZb3UgYXJlIGFuIGV4cGVydCBNYWdpYzogVGhlIEdhdGhlcmluZyBDb21tYW5kZXIgZGVjayBjb2FjaC4gIgogICAgICAgICAgICAiQW5zd2VyIHF1ZXN0aW9ucyBhYm91dCBkZWNrIGJ1aWxkaW5nLCBzdHJhdGVneSwgY2FyZCBjaG9pY2VzLCBhbmQgZ2FtZSB0aGVvcnkuICIKICAgICAgICAgICAgIkJlIHNwZWNpZmljIGFuZCBhY3Rpb25hYmxlIGluIHlvdXIgYWR2aWNlLiIKICAgICAgICApCgogICAgIyBCdWlsZCBtZXNzYWdlcyBhcnJheSBmb3IgTExNCiAgICBtZXNzYWdlcyA9IFt7InJvbGUiOiAic3lzdGVtIiwgImNvbnRlbnQiOiBzeXN0ZW1fcHJvbXB0fV0KICAgIGZvciBtc2cgaW4gYm9keS5tZXNzYWdlczoKICAgICAgICBtZXNzYWdlcy5hcHBlbmQoeyJyb2xlIjogbXNnLmdldCgicm9sZSIsICJ1c2VyIiksICJjb250ZW50IjogbXNnLmdldCgiY29udGVudCIsICIiKX0pCgogICAgIyBDYWxsIExMTSB3aXRoIG11bHRpLXR1cm4gbWVzc2FnZXMKICAgIHRyeToKICAgICAgICBpbXBvcnQganNvbgogICAgICAgIGZyb20gdXJsbGliLnJlcXVlc3QgaW1wb3J0IHVybG9wZW4sIFJlcXVlc3QgYXMgVXJsUmVxdWVzdAogICAgICAgIGZyb20gY29hY2guY29uZmlnIGltcG9ydCBMTV9TVFVESU9fVVJMLCBMTV9TVFVESU9fVElNRU9VVAoKICAgICAgICBtb2RlbF9uYW1lID0gX2NvYWNoX2xsbS5fcmVzb2x2ZV9tb2RlbCgpCiAgICAgICAgbGxtX2JvZHkgPSB7CiAgICAgICAgICAgICJtb2RlbCI6IG1vZGVsX25hbWUsCiAgICAgICAgICAgICJtZXNzYWdlcyI6IG1lc3NhZ2VzLAogICAgICAgICAgICAidGVtcGVyYXR1cmUiOiAwLjcsCiAgICAgICAgICAgICJtYXhfdG9rZW5zIjogNDA5NiwKICAgICAgICB9CgogICAgICAgIGlmIGJvZHkuc3RyZWFtOgogICAgICAgICAgICAjIFNTRSBzdHJlYW1pbmcgcmVzcG9uc2UKICAgICAgICAgICAgbGxtX2JvZHlbInN0cmVhbSJdID0gVHJ1ZQoKICAgICAgICAgICAgYXN5bmMgZGVmIGdlbmVyYXRlKCk6CiAgICAgICAgICAgICAgICBpbXBvcnQgYXN5bmNpbwogICAgICAgICAgICAgICAgZGVmIF9zdHJlYW0oKToKICAgICAgICAgICAgICAgICAgICByZXEgPSBVcmxSZXF1ZXN0KAogICAgICAgICAgICAgICAgICAgICAgICBmIntfY29hY2hfbGxtLmJhc2VfdXJsfS9jaGF0L2NvbXBsZXRpb25zIiwKICAgICAgICAgICAgICAgICAgICAgICAgZGF0YT1qc29uLmR1bXBzKGxsbV9ib2R5KS5lbmNvZGUoInV0Zi04IiksCiAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlcnM9eyJDb250ZW50LVR5cGUiOiAiYXBwbGljYXRpb24vanNvbiJ9LAogICAgICAgICAgICAgICAgICAgICAgICBtZXRob2Q9IlBPU1QiLAogICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICAgICBpbXBvcnQgaHR0cC5jbGllbnQKICAgICAgICAgICAgICAgICAgICBpbXBvcnQgdXJsbGliLnBhcnNlCiAgICAgICAgICAgICAgICAgICAgcGFyc2VkID0gdXJsbGliLnBhcnNlLnVybHBhcnNlKGYie19jb2FjaF9sbG0uYmFzZV91cmx9L2NoYXQvY29tcGxldGlvbnMiKQogICAgICAgICAgICAgICAgICAgIGNvbm4gPSBodHRwLmNsaWVudC5IVFRQQ29ubmVjdGlvbihwYXJzZWQuaG9zdG5hbWUsIHBhcnNlZC5wb3J0LCB0aW1lb3V0PUxNX1NUVURJT19USU1FT1VUKQogICAgICAgICAgICAgICAgICAgIGNvbm4ucmVxdWVzdCgiUE9TVCIsIHBhcnNlZC5wYXRoLCBib2R5PWpzb24uZHVtcHMobGxtX2JvZHkpLmVuY29kZSgidXRmLTgiKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVycz17IkNvbnRlbnQtVHlwZSI6ICJhcHBsaWNhdGlvbi9qc29uIn0pCiAgICAgICAgICAgICAgICAgICAgcmVzcCA9IGNvbm4uZ2V0cmVzcG9uc2UoKQogICAgICAgICAgICAgICAgICAgIGNodW5rcyA9IFtdCiAgICAgICAgICAgICAgICAgICAgd2hpbGUgVHJ1ZToKICAgICAgICAgICAgICAgICAgICAgICAgbGluZSA9IHJlc3AucmVhZGxpbmUoKQogICAgICAgICAgICAgICAgICAgICAgICBpZiBub3QgbGluZToKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrCiAgICAgICAgICAgICAgICAgICAgICAgIGxpbmUgPSBsaW5lLmRlY29kZSgidXRmLTgiKS5zdHJpcCgpCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIGxpbmUuc3RhcnRzd2l0aCgiZGF0YTogIik6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhID0gbGluZVs2Ol0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIGRhdGEgPT0gIltET05FXSI6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2h1bmtzLmFwcGVuZCgiW0RPTkVdIikKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhawogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2h1bmtzLmFwcGVuZChkYXRhKQogICAgICAgICAgICAgICAgICAgIGNvbm4uY2xvc2UoKQogICAgICAgICAgICAgICAgICAgIHJldHVybiBjaHVua3MKCiAgICAgICAgICAgICAgICBsb29wID0gYXN5bmNpby5nZXRfZXZlbnRfbG9vcCgpCiAgICAgICAgICAgICAgICBjaHVua3MgPSBhd2FpdCBsb29wLnJ1bl9pbl9leGVjdXRvcihOb25lLCBfc3RyZWFtKQoKICAgICAgICAgICAgICAgIGZvciBjaHVua19zdHIgaW4gY2h1bmtzOgogICAgICAgICAgICAgICAgICAgIGlmIGNodW5rX3N0ciA9PSAiW0RPTkVdIjoKICAgICAgICAgICAgICAgICAgICAgICAgeWllbGQgZiJkYXRhOiBbRE9ORV1cblxuIgogICAgICAgICAgICAgICAgICAgICAgICBicmVhawogICAgICAgICAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgICAgICAgICAgY2h1bmsgPSBqc29uLmxvYWRzKGNodW5rX3N0cikKICAgICAgICAgICAgICAgICAgICAgICAgZGVsdGEgPSBjaHVuay5nZXQoImNob2ljZXMiLCBbe31dKVswXS5nZXQoImRlbHRhIiwge30pCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnQgPSBkZWx0YS5nZXQoImNvbnRlbnQiLCAiIikKICAgICAgICAgICAgICAgICAgICAgICAgaWYgY29udGVudDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgU3RyaXAgdGhpbmsgdGFncyBmcm9tIHN0cmVhbWluZyBjaHVua3MKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHlpZWxkIGYiZGF0YToge2pzb24uZHVtcHMoeydjb250ZW50JzogY29udGVudH0pfVxuXG4iCiAgICAgICAgICAgICAgICAgICAgZXhjZXB0IGpzb24uSlNPTkRlY29kZUVycm9yOgogICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZQoKICAgICAgICAgICAgcmV0dXJuIFN0cmVhbWluZ1Jlc3BvbnNlKGdlbmVyYXRlKCksIG1lZGlhX3R5cGU9InRleHQvZXZlbnQtc3RyZWFtIikKICAgICAgICBlbHNlOgogICAgICAgICAgICAjIE5vbi1zdHJlYW1pbmc6IHJlZ3VsYXIgY2FsbAogICAgICAgICAgICByZXEgPSBVcmxSZXF1ZXN0KAogICAgICAgICAgICAgICAgZiJ7X2NvYWNoX2xsbS5iYXNlX3VybH0vY2hhdC9jb21wbGV0aW9ucyIsCiAgICAgICAgICAgICAgICBkYXRhPWpzb24uZHVtcHMobGxtX2JvZHkpLmVuY29kZSgidXRmLTgiKSwKICAgICAgICAgICAgICAgIGhlYWRlcnM9eyJDb250ZW50LVR5cGUiOiAiYXBwbGljYXRpb24vanNvbiJ9LAogICAgICAgICAgICAgICAgbWV0aG9kPSJQT1NUIiwKICAgICAgICAgICAgKQoKICAgICAgICAgICAgaW1wb3J0IGFzeW5jaW8KICAgICAgICAgICAgbG9vcCA9IGFzeW5jaW8uZ2V0X2V2ZW50X2xvb3AoKQogICAgICAgICAgICBkZWYgX2NhbGwoKToKICAgICAgICAgICAgICAgIHdpdGggdXJsb3BlbihyZXEsIHRpbWVvdXQ9TE1fU1RVRElPX1RJTUVPVVQpIGFzIHJlc3A6CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGpzb24ubG9hZHMocmVzcC5yZWFkKCkuZGVjb2RlKCJ1dGYtOCIpKQoKICAgICAgICAgICAgcmF3ID0gYXdhaXQgbG9vcC5ydW5faW5fZXhlY3V0b3IoTm9uZSwgX2NhbGwpCgogICAgICAgICAgICBjb250ZW50ID0gcmF3LmdldCgiY2hvaWNlcyIsIFt7fV0pWzBdLmdldCgibWVzc2FnZSIsIHt9KS5nZXQoImNvbnRlbnQiLCAiIikKICAgICAgICAgICAgIyBTdHJpcCB0aGluayB0YWdzCiAgICAgICAgICAgIGNvbnRlbnQgPSBfY29hY2hfbGxtLl9zdHJpcF90aGlua190YWdzKGNvbnRlbnQpCiAgICAgICAgICAgIHVzYWdlID0gcmF3LmdldCgidXNhZ2UiLCB7fSkKCiAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICAiY29udGVudCI6IGNvbnRlbnQsCiAgICAgICAgICAgICAgICAibW9kZWwiOiByYXcuZ2V0KCJtb2RlbCIsICIiKSwKICAgICAgICAgICAgICAgICJwcm9tcHRfdG9rZW5zIjogdXNhZ2UuZ2V0KCJwcm9tcHRfdG9rZW5zIiwgMCksCiAgICAgICAgICAgICAgICAiY29tcGxldGlvbl90b2tlbnMiOiB1c2FnZS5nZXQoImNvbXBsZXRpb25fdG9rZW5zIiwgMCksCiAgICAgICAgICAgIH0KCiAgICBleGNlcHQgRXhjZXB0aW9uIGFzIGU6CiAgICAgICAgcmFpc2UgSFRUUEV4Y2VwdGlvbig1MDAsIGYiQ2hhdCBmYWlsZWQ6IHtlfSIpCgoKQGFwcC5wb3N0KCIvYXBpL2NvYWNoL2FwcGx5IikKYXN5bmMgZGVmIGNvYWNoX2FwcGx5X3N1Z2dlc3Rpb25zKGJvZHk6IENvYWNoQXBwbHlSZXF1ZXN0KToKICAgICIiIkFwcGx5IGFjY2VwdGVkIGNvYWNoaW5nIHN1Z2dlc3Rpb25zIHRvIGEgZGVjayDigJQgcmVtb3ZlIGN1dHMsIGFkZCBhZGRzLiIiIgogICAgY29ubiA9IF9nZXRfZGJfY29ubigpCgogICAgIyBWZXJpZnkgZGVjayBleGlzdHMKICAgIGRlY2sgPSBjb25uLmV4ZWN1dGUoIlNFTEVDVCAqIEZST00gZGVja3MgV0hFUkUgaWQgPSA/IiwgKGJvZHkuZGVja19pZCwpKS5mZXRjaG9uZSgpCiAgICBpZiBub3QgZGVjazoKICAgICAgICByYWlzZSBIVFRQRXhjZXB0aW9uKDQwNCwgZiJEZWNrIHtib2R5LmRlY2tfaWR9IG5vdCBmb3VuZCIpCgogICAgcmVzdWx0cyA9IHsiY3V0cyI6IFtdLCAiYWRkcyI6IFtdLCAiZXJyb3JzIjogW119CgogICAgIyBQcm9jZXNzIGN1dHM6IHJlbW92ZSBjYXJkcyBieSBuYW1lCiAgICBmb3IgY2FyZF9uYW1lIGluIGJvZHkuYWNjZXB0ZWRfY3V0czoKICAgICAgICByb3cgPSBjb25uLmV4ZWN1dGUoCiAgICAgICAgICAgICJTRUxFQ1QgaWQgRlJPTSBkZWNrX2NhcmRzIFdIRVJFIGRlY2tfaWQgPSA/IEFORCBjYXJkX25hbWUgPSA/IExJTUlUIDEiLAogICAgICAgICAgICAoYm9keS5kZWNrX2lkLCBjYXJkX25hbWUpCiAgICAgICAgKS5mZXRjaG9uZSgpCiAgICAgICAgaWYgcm93OgogICAgICAgICAgICBjb25uLmV4ZWN1dGUoIkRFTEVURSBGUk9NIGRlY2tfY2FyZHMgV0hFUkUgaWQgPSA/IiwgKHJvd1siaWQiXSwpKQogICAgICAgICAgICByZXN1bHRzWyJjdXRzIl0uYXBwZW5kKHsibmFtZSI6IGNhcmRfbmFtZSwgInN0YXR1cyI6ICJyZW1vdmVkIn0pCiAgICAgICAgZWxzZToKICAgICAgICAgICAgIyBUcnkgY2FzZS1pbnNlbnNpdGl2ZQogICAgICAgICAgICByb3cgPSBjb25uLmV4ZWN1dGUoCiAgICAgICAgICAgICAgICAiU0VMRUNUIGlkLCBjYXJkX25hbWUgRlJPTSBkZWNrX2NhcmRzIFdIRVJFIGRlY2tfaWQgPSA/IEFORCBMT1dFUihjYXJkX25hbWUpID0gTE9XRVIoPykgTElNSVQgMSIsCiAgICAgICAgICAgICAgICAoYm9keS5kZWNrX2lkLCBjYXJkX25hbWUpCiAgICAgICAgICAgICkuZmV0Y2hvbmUoKQogICAgICAgICAgICBpZiByb3c6CiAgICAgICAgICAgICAgICBjb25uLmV4ZWN1dGUoIkRFTEVURSBGUk9NIGRlY2tfY2FyZHMgV0hFUkUgaWQgPSA/IiwgKHJvd1siaWQiXSwpKQogICAgICAgICAgICAgICAgcmVzdWx0c1siY3V0cyJdLmFwcGVuZCh7Im5hbWUiOiByb3dbImNhcmRfbmFtZSJdLCAic3RhdHVzIjogInJlbW92ZWQifSkKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIHJlc3VsdHNbImVycm9ycyJdLmFwcGVuZCh7Im5hbWUiOiBjYXJkX25hbWUsICJlcnJvciI6ICJDYXJkIG5vdCBmb3VuZCBpbiBkZWNrIn0pCgogICAgIyBQcm9jZXNzIGFkZHM6IGxvb2sgdXAgaW4gY29sbGVjdGlvbiBmaXJzdCwgdGhlbiBTY3J5ZmFsbAogICAgZm9yIGNhcmRfbmFtZSBpbiBib2R5LmFjY2VwdGVkX2FkZHM6CiAgICAgICAgIyBUcnkgdG8gZmluZCBpbiBjb2xsZWN0aW9uCiAgICAgICAgY2UgPSBjb25uLmV4ZWN1dGUoCiAgICAgICAgICAgICJTRUxFQ1Qgc2NyeWZhbGxfaWQsIG5hbWUgRlJPTSBjb2xsZWN0aW9uX2VudHJpZXMgV0hFUkUgTE9XRVIobmFtZSkgPSBMT1dFUig/KSBMSU1JVCAxIiwKICAgICAgICAgICAgKGNhcmRfbmFtZSwpCiAgICAgICAgKS5mZXRjaG9uZSgpCgogICAgICAgIHNjcnlmYWxsX2lkID0gTm9uZQogICAgICAgIHJlc29sdmVkX25hbWUgPSBjYXJkX25hbWUKCiAgICAgICAgaWYgY2U6CiAgICAgICAgICAgIHNjcnlmYWxsX2lkID0gY2VbInNjcnlmYWxsX2lkIl0KICAgICAgICAgICAgcmVzb2x2ZWRfbmFtZSA9IGNlWyJuYW1lIl0KICAgICAgICBlbHNlOgogICAgICAgICAgICAjIFRyeSBTY3J5ZmFsbCBBUEkgbG9va3VwCiAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgIGltcG9ydCB1cmxsaWIucGFyc2UKICAgICAgICAgICAgICAgIGVuY29kZWQgPSB1cmxsaWIucGFyc2UucXVvdGUoY2FyZF9uYW1lKQogICAgICAgICAgICAgICAgc2NyeV9yZXEgPSBVcmxSZXF1ZXN0KAogICAgICAgICAgICAgICAgICAgIGYiaHR0cHM6Ly9hcGkuc2NyeWZhbGwuY29tL2NhcmRzL25hbWVkP2Z1enp5PXtlbmNvZGVkfSIsCiAgICAgICAgICAgICAgICAgICAgaGVhZGVycz17IlVzZXItQWdlbnQiOiAiY29tbWFuZGVyLWFpLWxhYi8xLjAifQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgd2l0aCB1cmxvcGVuKHNjcnlfcmVxLCB0aW1lb3V0PTEwKSBhcyByZXNwOgogICAgICAgICAgICAgICAgICAgIGNhcmRfZGF0YSA9IGpzb24ubG9hZHMocmVzcC5yZWFkKCkuZGVjb2RlKCJ1dGYtOCIpKQogICAgICAgICAgICAgICAgICAgIHNjcnlmYWxsX2lkID0gY2FyZF9kYXRhLmdldCgiaWQiKQogICAgICAgICAgICAgICAgICAgIHJlc29sdmVkX25hbWUgPSBjYXJkX2RhdGEuZ2V0KCJuYW1lIiwgY2FyZF9uYW1lKQogICAgICAgICAgICBleGNlcHQgRXhjZXB0aW9uOgogICAgICAgICAgICAgICAgcGFzcwoKICAgICAgICBpZiBzY3J5ZmFsbF9pZDoKICAgICAgICAgICAgIyBDaGVjayBpZiBhbHJlYWR5IGluIGRlY2sKICAgICAgICAgICAgZXhpc3RpbmcgPSBjb25uLmV4ZWN1dGUoCiAgICAgICAgICAgICAgICAiU0VMRUNUIGlkIEZST00gZGVja19jYXJkcyBXSEVSRSBkZWNrX2lkID0gPyBBTkQgc2NyeWZhbGxfaWQgPSA/IiwKICAgICAgICAgICAgICAgIChib2R5LmRlY2tfaWQsIHNjcnlmYWxsX2lkKQogICAgICAgICAgICApLmZldGNob25lKCkKICAgICAgICAgICAgaWYgbm90IGV4aXN0aW5nOgogICAgICAgICAgICAgICAgY29ubi5leGVjdXRlKAogICAgICAgICAgICAgICAgICAgICJJTlNFUlQgSU5UTyBkZWNrX2NhcmRzIChkZWNrX2lkLCBzY3J5ZmFsbF9pZCwgY2FyZF9uYW1lLCBxdWFudGl0eSkgVkFMVUVTICg/LCA/LCA/LCAxKSIsCiAgICAgICAgICAgICAgICAgICAgKGJvZHkuZGVja19pZCwgc2NyeWZhbGxfaWQsIHJlc29sdmVkX25hbWUpCiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICByZXN1bHRzWyJhZGRzIl0uYXBwZW5kKHsibmFtZSI6IHJlc29sdmVkX25hbWUsICJzY3J5ZmFsbF9pZCI6IHNjcnlmYWxsX2lkLCAic3RhdHVzIjogImFkZGVkIn0pCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICByZXN1bHRzWyJhZGRzIl0uYXBwZW5kKHsibmFtZSI6IHJlc29sdmVkX25hbWUsICJzdGF0dXMiOiAiYWxyZWFkeV9pbl9kZWNrIn0pCiAgICAgICAgZWxzZToKICAgICAgICAgICAgcmVzdWx0c1siZXJyb3JzIl0uYXBwZW5kKHsibmFtZSI6IGNhcmRfbmFtZSwgImVycm9yIjogIkNvdWxkIG5vdCByZXNvbHZlIGNhcmQifSkKCiAgICBjb25uLmV4ZWN1dGUoIlVQREFURSBkZWNrcyBTRVQgdXBkYXRlZF9hdCA9IGRhdGV0aW1lKCdub3cnKSBXSEVSRSBpZCA9ID8iLCAoYm9keS5kZWNrX2lkLCkpCiAgICBjb25uLmNvbW1pdCgpCgogICAgcmVzdWx0c1sidG90YWxfY3V0cyJdID0gbGVuKHJlc3VsdHNbImN1dHMiXSkKICAgIHJlc3VsdHNbInRvdGFsX2FkZHMiXSA9IGxlbihbYSBmb3IgYSBpbiByZXN1bHRzWyJhZGRzIl0gaWYgYVsic3RhdHVzIl0gPT0gImFkZGVkIl0pCiAgICByZXR1cm4gcmVzdWx0cwoKCkBhcHAuZ2V0KCIvYXBpL2NvYWNoL2NhcmRzLWxpa2UiKQphc3luYyBkZWYgY29hY2hfY2FyZHNfbGlrZShjYXJkOiBzdHIsIGNvbG9yczogc3RyID0gTm9uZSwgdG9wX246IGludCA9IDEwKToKICAgICIiIkZpbmQgY2FyZHMgc2ltaWxhciB0byBhIGdpdmVuIGNhcmQgdXNpbmcgZW1iZWRkaW5ncy4gVUktZnJpZW5kbHkgdmVyc2lvbi4iIiIKICAgIGlmIF9jb2FjaF9lbWJlZGRpbmdzIGlzIE5vbmUgb3Igbm90IF9jb2FjaF9lbWJlZGRpbmdzLmxvYWRlZDoKICAgICAgICByYWlzZSBIVFRQRXhjZXB0aW9uKDUwMywgIkVtYmVkZGluZ3Mgbm90IGxvYWRlZCIpCgogICAgY29sb3JfZmlsdGVyID0gbGlzdChjb2xvcnMudXBwZXIoKSkgaWYgY29sb3JzIGVsc2UgTm9uZQogICAgbWF0Y2hlcyA9IF9jb2FjaF9lbWJlZGRpbmdzLnNlYXJjaF9zaW1pbGFyKAogICAgICAgIHF1ZXJ5X2NhcmQ9Y2FyZCwgY29sb3JfZmlsdGVyPWNvbG9yX2ZpbHRlciwgdG9wX249dG9wX24KICAgICkKCiAgICBjb25uID0gX2dldF9kYl9jb25uKCkKICAgIHJlc3VsdHMgPSBbXQogICAgZm9yIG0gaW4gbWF0Y2hlczoKICAgICAgICAjIENoZWNrIGlmIGNhcmQgaXMgaW4gY29sbGVjdGlvbgogICAgICAgIG93bmVkID0gY29ubi5leGVjdXRlKAogICAgICAgICAgICAiU0VMRUNUIFNVTShxdWFudGl0eSkgYXMgcXR5IEZST00gY29sbGVjdGlvbl9lbnRyaWVzIFdIRVJFIExPV0VSKG5hbWUpID0gTE9XRVIoPykiLAogICAgICAgICAgICAobS5uYW1lLCkKICAgICAgICApLmZldGNob25lKCkKICAgICAgICBvd25lZF9xdHkgPSAob3duZWRbInF0eSJdIG9yIDApIGlmIG93bmVkIGVsc2UgMAoKICAgICAgICAjIEdldCBpbWFnZSBVUkwgYW5kIHByaWNlCiAgICAgICAgY2UgPSBjb25uLmV4ZWN1dGUoCiAgICAgICAgICAgICJTRUxFQ1QgaW1hZ2VfdXJsLCB0Y2dfcHJpY2UgRlJPTSBjb2xsZWN0aW9uX2VudHJpZXMgV0hFUkUgTE9XRVIobmFtZSkgPSBMT1dFUig/KSBMSU1JVCAxIiwKICAgICAgICAgICAgKG0ubmFtZSwpCiAgICAgICAgKS5mZXRjaG9uZSgpCgogICAgICAgIHJlc3VsdHMuYXBwZW5kKHsKICAgICAgICAgICAgIm5hbWUiOiBtLm5hbWUsCiAgICAgICAgICAgICJzaW1pbGFyaXR5Ijogcm91bmQobS5zaW1pbGFyaXR5LCA0KSwKICAgICAgICAgICAgInR5cGVzIjogbS50eXBlcywKICAgICAgICAgICAgIm1hbmFfdmFsdWUiOiBtLm1hbmFfdmFsdWUsCiAgICAgICAgICAgICJtYW5hX2Nvc3QiOiBtLm1hbmFfY29zdCwKICAgICAgICAgICAgInRleHQiOiBtLnRleHRbOjIwMF0gaWYgbS50ZXh0IGVsc2UgIiIsCiAgICAgICAgICAgICJvd25lZF9xdHkiOiBvd25lZF9xdHksCiAgICAgICAgICAgICJpbWFnZV91cmwiOiBjZVsiaW1hZ2VfdXJsIl0gaWYgY2UgZWxzZSBOb25lLAogICAgICAgICAgICAidGNnX3ByaWNlIjogY2VbInRjZ19wcmljZSJdIGlmIGNlIGVsc2UgTm9uZSwKICAgICAgICB9KQoKICAgIHJldHVybiB7InF1ZXJ5IjogY2FyZCwgInJlc3VsdHMiOiByZXN1bHRzfQoKCkBhcHAucG9zdCgiL2FwaS9jb2FjaC9yZXBvcnRzL2dlbmVyYXRlIikKYXN5bmMgZGVmIGNvYWNoX2dlbmVyYXRlX3JlcG9ydHMoKToKICAgICIiIlJlYnVpbGQgYWxsIGRlY2sgcmVwb3J0cyBmcm9tIGJhdGNoIHJlc3VsdCBKU09OcyBpbiByZXN1bHRzLy4iIiIKICAgIHRyeToKICAgICAgICBmcm9tIGNvYWNoLnJlcG9ydF9nZW5lcmF0b3IgaW1wb3J0IGdlbmVyYXRlX2RlY2tfcmVwb3J0cwogICAgICAgIGxhYl9yb290ID0gUGF0aChfX2ZpbGVfXykucGFyZW50CiAgICAgICAgcmVzdWx0c19kaXIgPSBzdHIobGFiX3Jvb3QgLyBDRkcucmVzdWx0c19kaXIpCiAgICAgICAgcmVwb3J0c19kaXIgPSBzdHIobGFiX3Jvb3QgLyAiZGVjay1yZXBvcnRzIikKICAgICAgICB1cGRhdGVkID0gZ2VuZXJhdGVfZGVja19yZXBvcnRzKHJlc3VsdHNfZGlyLCByZXBvcnRzX2RpcikKICAgICAgICByZXR1cm4gewogICAgICAgICAgICAic3RhdHVzIjogIm9rIiwKICAgICAgICAgICAgImRlY2tzVXBkYXRlZCI6IHVwZGF0ZWQsCiAgICAgICAgICAgICJjb3VudCI6IGxlbih1cGRhdGVkKSwKICAgICAgICAgICAgIm1lc3NhZ2UiOiBmIkdlbmVyYXRlZCByZXBvcnRzIGZvciB7bGVuKHVwZGF0ZWQpfSBkZWNrcyIgaWYgdXBkYXRlZCBlbHNlICJObyBiYXRjaCByZXN1bHRzIGZvdW5kIiwKICAgICAgICB9CiAgICBleGNlcHQgRXhjZXB0aW9uIGFzIGU6CiAgICAgICAgcmFpc2UgSFRUUEV4Y2VwdGlvbig1MDAsIGYiUmVwb3J0IGdlbmVyYXRpb24gZmFpbGVkOiB7ZX0iKQoKCiMg4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQCiMgTUwgVHJhaW5pbmcgRGF0YSBFbmRwb2ludHMKIyDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZAKCkBhcHAuZ2V0KCIvYXBpL21sL3N0YXR1cyIpCmFzeW5jIGRlZiBtbF9zdGF0dXMoKToKICAgICIiIkdldCBNTCBkZWNpc2lvbiBsb2dnaW5nIHN0YXR1cyBhbmQgYXZhaWxhYmxlIHRyYWluaW5nIGRhdGEuIiIiCiAgICBnbG9iYWwgX21sX2xvZ2dpbmdfZW5hYmxlZAogICAgbGFiX3Jvb3QgPSBQYXRoKF9fZmlsZV9fKS5wYXJlbnQKICAgIHJlc3VsdHNfZGlyID0gbGFiX3Jvb3QgLyBDRkcucmVzdWx0c19kaXIKCiAgICAjIEZpbmQgZXhpc3RpbmcgTUwgZGVjaXNpb24gZmlsZXMKICAgIG1sX2ZpbGVzID0gW10KICAgIGlmIHJlc3VsdHNfZGlyLmV4aXN0cygpOgogICAgICAgIGZvciBmIGluIHNvcnRlZChyZXN1bHRzX2Rpci5nbG9iKCJtbC1kZWNpc2lvbnMtKi5qc29ubCIpKToKICAgICAgICAgICAgbGluZXMgPSAwCiAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgIHdpdGggb3BlbihmKSBhcyBmaDoKICAgICAgICAgICAgICAgICAgICBsaW5lcyA9IHN1bSgxIGZvciBfIGluIGZoKQogICAgICAgICAgICBleGNlcHQgRXhjZXB0aW9uOgogICAgICAgICAgICAgICAgcGFzcwogICAgICAgICAgICBtbF9maWxlcy5hcHBlbmQoewogICAgICAgICAgICAgICAgImZpbGUiOiBmLm5hbWUsCiAgICAgICAgICAgICAgICAiZGVjaXNpb25zIjogbGluZXMsCiAgICAgICAgICAgICAgICAic2l6ZV9rYiI6IHJvdW5kKGYuc3RhdCgpLnN0X3NpemUgLyAxMDI0LCAxKSwKICAgICAgICAgICAgfSkKCiAgICB0b3RhbF9kZWNpc2lvbnMgPSBzdW0oZlsiZGVjaXNpb25zIl0gZm9yIGYgaW4gbWxfZmlsZXMpCiAgICByZXR1cm4gewogICAgICAgICJtbF9sb2dnaW5nX2VuYWJsZWQiOiBfbWxfbG9nZ2luZ19lbmFibGVkLAogICAgICAgICJ0cmFpbmluZ19maWxlcyI6IG1sX2ZpbGVzLAogICAgICAgICJ0b3RhbF9kZWNpc2lvbnMiOiB0b3RhbF9kZWNpc2lvbnMsCiAgICAgICAgInRvdGFsX2ZpbGVzIjogbGVuKG1sX2ZpbGVzKSwKICAgIH0KCgpAYXBwLnBvc3QoIi9hcGkvbWwvdG9nZ2xlIikKYXN5bmMgZGVmIG1sX3RvZ2dsZShlbmFibGU6IGJvb2wgPSBUcnVlKToKICAgICIiIkVuYWJsZSBvciBkaXNhYmxlIE1MIGRlY2lzaW9uIGxvZ2dpbmcgZm9yIGZ1dHVyZSBiYXRjaCBydW5zLiIiIgogICAgZ2xvYmFsIF9tbF9sb2dnaW5nX2VuYWJsZWQKICAgIF9tbF9sb2dnaW5nX2VuYWJsZWQgPSBlbmFibGUKICAgIHJldHVybiB7CiAgICAgICAgIm1sX2xvZ2dpbmdfZW5hYmxlZCI6IF9tbF9sb2dnaW5nX2VuYWJsZWQsCiAgICAgICAgIm1lc3NhZ2UiOiBmIk1MIGRlY2lzaW9uIGxvZ2dpbmcgeydlbmFibGVkJyBpZiBlbmFibGUgZWxzZSAnZGlzYWJsZWQnfSBmb3IgZnV0dXJlIGJhdGNoZXMiLAogICAgfQoKCkBhcHAuZ2V0KCIvYXBpL21sL2RlY2lzaW9ucy97ZmlsZW5hbWV9IikKYXN5bmMgZGVmIG1sX2dldF9kZWNpc2lvbnMoZmlsZW5hbWU6IHN0ciwgbGltaXQ6IGludCA9IDEwMCwgb2Zmc2V0OiBpbnQgPSAwKToKICAgICIiIlJlYWQgZGVjaXNpb24gc25hcHNob3RzIGZyb20gYSB0cmFpbmluZyBkYXRhIGZpbGUuIiIiCiAgICBsYWJfcm9vdCA9IFBhdGgoX19maWxlX18pLnBhcmVudAogICAgZmlsZXBhdGggPSBsYWJfcm9vdCAvIENGRy5yZXN1bHRzX2RpciAvIGZpbGVuYW1lCgogICAgaWYgbm90IGZpbGVwYXRoLmV4aXN0cygpIG9yIG5vdCBmaWxlbmFtZS5zdGFydHN3aXRoKCJtbC1kZWNpc2lvbnMtIik6CiAgICAgICAgcmFpc2UgSFRUUEV4Y2VwdGlvbig0MDQsIGYiTUwgZGVjaXNpb25zIGZpbGUgbm90IGZvdW5kOiB7ZmlsZW5hbWV9IikKCiAgICBkZWNpc2lvbnMgPSBbXQogICAgdHJ5OgogICAgICAgIGltcG9ydCBqc29uIGFzIF9qc29uCiAgICAgICAgd2l0aCBvcGVuKGZpbGVwYXRoKSBhcyBmOgogICAgICAgICAgICBmb3IgaSwgbGluZSBpbiBlbnVtZXJhdGUoZik6CiAgICAgICAgICAgICAgICBpZiBpIDwgb2Zmc2V0OgogICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgICAgICAgICBpZiBsZW4oZGVjaXNpb25zKSA+PSBsaW1pdDoKICAgICAgICAgICAgICAgICAgICBicmVhawogICAgICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgICAgIGRlY2lzaW9ucy5hcHBlbmQoX2pzb24ubG9hZHMobGluZS5zdHJpcCgpKSkKICAgICAgICAgICAgICAgIGV4Y2VwdCBfanNvbi5KU09ORGVjb2RlRXJyb3I6CiAgICAgICAgICAgICAgICAgICAgY29udGludWUKICAgIGV4Y2VwdCBFeGNlcHRpb24gYXMgZToKICAgICAgICByYWlzZSBIVFRQRXhjZXB0aW9uKDUwMCwgZiJGYWlsZWQgdG8gcmVhZCBkZWNpc2lvbnM6IHtlfSIpCgogICAgcmV0dXJuIHsKICAgICAgICAiZmlsZSI6IGZpbGVuYW1lLAogICAgICAgICJvZmZzZXQiOiBvZmZzZXQsCiAgICAgICAgImxpbWl0IjogbGltaXQsCiAgICAgICAgImNvdW50IjogbGVuKGRlY2lzaW9ucyksCiAgICAgICAgImRlY2lzaW9ucyI6IGRlY2lzaW9ucywKICAgIH0KCgojIOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkAojIE1MIFBvbGljeSBJbmZlcmVuY2UgRW5kcG9pbnRzCiMg4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQCgojIExhenktbG9hZGVkIHBvbGljeSBpbmZlcmVuY2Ugc2VydmljZSAob25seSBsb2FkcyB3aGVuIGZpcnN0IGNhbGxlZCkKX3BvbGljeV9zZXJ2aWNlID0gTm9uZQpfcG9saWN5X3NlcnZpY2VfaW5pdF9hdHRlbXB0ZWQgPSBGYWxzZQoKCmRlZiBfZ2V0X3BvbGljeV9zZXJ2aWNlKCk6CiAgICAiIiJHZXQgb3IgaW5pdGlhbGl6ZSB0aGUgcG9saWN5IGluZmVyZW5jZSBzZXJ2aWNlIChsYXp5IGxvYWRpbmcpLiIiIgogICAgZ2xvYmFsIF9wb2xpY3lfc2VydmljZSwgX3BvbGljeV9zZXJ2aWNlX2luaXRfYXR0ZW1wdGVkCiAgICBpZiBfcG9saWN5X3NlcnZpY2UgaXMgTm9uZSBhbmQgbm90IF9wb2xpY3lfc2VydmljZV9pbml0X2F0dGVtcHRlZDoKICAgICAgICBfcG9saWN5X3NlcnZpY2VfaW5pdF9hdHRlbXB0ZWQgPSBUcnVlCiAgICAgICAgdHJ5OgogICAgICAgICAgICBmcm9tIG1sLnNlcnZpbmcucG9saWN5X3NlcnZlciBpbXBvcnQgUG9saWN5SW5mZXJlbmNlU2VydmljZQogICAgICAgICAgICBfcG9saWN5X3NlcnZpY2UgPSBQb2xpY3lJbmZlcmVuY2VTZXJ2aWNlKCkKICAgICAgICAgICAgaWYgX3BvbGljeV9zZXJ2aWNlLmxvYWQoKToKICAgICAgICAgICAgICAgIGxvZ19tbC5pbmZvKGYiUG9saWN5IG1vZGVsIGxvYWRlZCBvbiB7X3BvbGljeV9zZXJ2aWNlLmRldmljZX0iKQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgbG9nX21sLmVycm9yKGYiUG9saWN5IG1vZGVsIG5vdCBhdmFpbGFibGU6IHtfcG9saWN5X3NlcnZpY2UuX2xvYWRfZXJyb3J9IikKICAgICAgICBleGNlcHQgRXhjZXB0aW9uIGFzIGU6CiAgICAgICAgICAgIGxvZ19tbC5lcnJvcihmIlBvbGljeSBzZXJ2aWNlIGluaXQgZmFpbGVkOiB7ZX0iKQogICAgcmV0dXJuIF9wb2xpY3lfc2VydmljZQoKCkBhcHAucG9zdCgiL2FwaS9tbC9wcmVkaWN0IikKYXN5bmMgZGVmIG1sX3ByZWRpY3QocmVxdWVzdDogRmFzdEFQSVJlcXVlc3QpOgogICAgIiIiUHJlZGljdCBhIG1hY3JvLWFjdGlvbiBmcm9tIGEgZ2FtZSBzdGF0ZSBzbmFwc2hvdC4KCiAgICBBY2NlcHRzIERlY2lzaW9uU25hcHNob3Qtc2hhcGVkIEpTT04gZnJvbSB0aGUgSmF2YSBiYXRjaCBydW5uZXIuCiAgICBSZXR1cm5zIHRoZSBsZWFybmVkIHBvbGljeSdzIHJlY29tbWVuZGVkIGFjdGlvbi4KCiAgICBSZXF1ZXN0IGJvZHk6CiAgICAgICAgewogICAgICAgICAgICAidHVybiI6IDUsCiAgICAgICAgICAgICJwaGFzZSI6ICJtYWluXzEiLAogICAgICAgICAgICAiYWN0aXZlX3NlYXQiOiAwLAogICAgICAgICAgICAicGxheWVycyI6IFsuLi5dLAogICAgICAgICAgICAiYXJjaGV0eXBlIjogImFnZ3JvIiwKICAgICAgICAgICAgInRlbXBlcmF0dXJlIjogMS4wLAogICAgICAgICAgICAiZ3JlZWR5IjogZmFsc2UKICAgICAgICB9CgogICAgUmVzcG9uc2U6CiAgICAgICAgewogICAgICAgICAgICAiYWN0aW9uIjogImNhc3RfY3JlYXR1cmUiLAogICAgICAgICAgICAiYWN0aW9uX2luZGV4IjogMCwKICAgICAgICAgICAgImNvbmZpZGVuY2UiOiAwLjczLAogICAgICAgICAgICAicHJvYmFiaWxpdGllcyI6IHsuLi59LAogICAgICAgICAgICAiaW5mZXJlbmNlX21zIjogMi4zCiAgICAgICAgfQogICAgIiIiCiAgICBzdmMgPSBfZ2V0X3BvbGljeV9zZXJ2aWNlKCkKICAgIGlmIHN2YyBpcyBOb25lIG9yIG5vdCBzdmMuX2xvYWRlZDoKICAgICAgICBkZXRhaWwgPSAiUG9saWN5IG1vZGVsIG5vdCBsb2FkZWQuICIKICAgICAgICBpZiBzdmM6CiAgICAgICAgICAgIGRldGFpbCArPSBzdmMuX2xvYWRfZXJyb3Igb3IgIlRyYWluIGEgbW9kZWwgZmlyc3QuIgogICAgICAgIGVsc2U6CiAgICAgICAgICAgIGRldGFpbCArPSAiUHlUb3JjaCBtYXkgbm90IGJlIGluc3RhbGxlZC4iCiAgICAgICAgcmFpc2UgSFRUUEV4Y2VwdGlvbihzdGF0dXNfY29kZT01MDMsIGRldGFpbD1kZXRhaWwpCgogICAgYm9keSA9IGF3YWl0IHJlcXVlc3QuanNvbigpCiAgICBwbGF5c3R5bGUgPSBib2R5LnBvcCgiYXJjaGV0eXBlIiwgIm1pZHJhbmdlIikKICAgIHRlbXBlcmF0dXJlID0gYm9keS5wb3AoInRlbXBlcmF0dXJlIiwgMS4wKQogICAgZ3JlZWR5ID0gYm9keS5wb3AoImdyZWVkeSIsIEZhbHNlKQoKICAgIHJlc3VsdCA9IHN2Yy5wcmVkaWN0KAogICAgICAgIGRlY2lzaW9uX3NuYXBzaG90PWJvZHksCiAgICAgICAgcGxheXN0eWxlPXBsYXlzdHlsZSwKICAgICAgICB0ZW1wZXJhdHVyZT10ZW1wZXJhdHVyZSwKICAgICAgICBncmVlZHk9Z3JlZWR5LAogICAgKQoKICAgIGlmICJlcnJvciIgaW4gcmVzdWx0OgogICAgICAgIHJhaXNlIEhUVFBFeGNlcHRpb24oc3RhdHVzX2NvZGU9NTAwLCBkZXRhaWw9cmVzdWx0WyJlcnJvciJdKQogICAgcmV0dXJuIHJlc3VsdAoKCkBhcHAucG9zdCgiL2FwaS9tbC9wcmVkaWN0L2JhdGNoIikKYXN5bmMgZGVmIG1sX3ByZWRpY3RfYmF0Y2gocmVxdWVzdDogRmFzdEFQSVJlcXVlc3QpOgogICAgIiIiUHJlZGljdCBhY3Rpb25zIGZvciBtdWx0aXBsZSBzbmFwc2hvdHMgYXQgb25jZS4KCiAgICBSZXF1ZXN0IGJvZHk6IHsic25hcHNob3RzIjogWy4uLl0sICJncmVlZHkiOiB0cnVlfQogICAgIiIiCiAgICBzdmMgPSBfZ2V0X3BvbGljeV9zZXJ2aWNlKCkKICAgIGlmIHN2YyBpcyBOb25lIG9yIG5vdCBzdmMuX2xvYWRlZDoKICAgICAgICByYWlzZSBIVFRQRXhjZXB0aW9uKHN0YXR1c19jb2RlPTUwMywgZGV0YWlsPSJQb2xpY3kgbW9kZWwgbm90IGxvYWRlZCIpCgogICAgYm9keSA9IGF3YWl0IHJlcXVlc3QuanNvbigpCiAgICBzbmFwc2hvdHMgPSBib2R5LmdldCgic25hcHNob3RzIiwgW10pCiAgICBncmVlZHkgPSBib2R5LmdldCgiZ3JlZWR5IiwgVHJ1ZSkKCiAgICBpZiBub3Qgc25hcHNob3RzOgogICAgICAgIHJldHVybiB7InJlc3VsdHMiOiBbXX0KCiAgICByZXN1bHRzID0gc3ZjLnByZWRpY3RfYmF0Y2goc25hcHNob3RzLCBncmVlZHk9Z3JlZWR5KQogICAgcmV0dXJuIHsicmVzdWx0cyI6IHJlc3VsdHMsICJjb3VudCI6IGxlbihyZXN1bHRzKX0KCgpAYXBwLmdldCgiL2FwaS9tbC9tb2RlbCIpCmFzeW5jIGRlZiBtbF9tb2RlbF9pbmZvKCk6CiAgICAiIiJHZXQgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGxvYWRlZCBwb2xpY3kgbW9kZWwuIiIiCiAgICBzdmMgPSBfZ2V0X3BvbGljeV9zZXJ2aWNlKCkKICAgIGlmIHN2YyBpcyBOb25lOgogICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICJsb2FkZWQiOiBGYWxzZSwKICAgICAgICAgICAgImVycm9yIjogIlBvbGljeSBzZXJ2aWNlIG5vdCBpbml0aWFsaXplZCIsCiAgICAgICAgICAgICJ0b3JjaF9hdmFpbGFibGUiOiBGYWxzZSwKICAgICAgICB9CiAgICByZXR1cm4gc3ZjLmdldF9zdGF0dXMoKQoKCkBhcHAucG9zdCgiL2FwaS9tbC9yZWxvYWQiKQphc3luYyBkZWYgbWxfcmVsb2FkX21vZGVsKGNoZWNrcG9pbnQ6IHN0ciA9IE5vbmUpOgogICAgIiIiSG90LXJlbG9hZCBhIHBvbGljeSBtb2RlbCBjaGVja3BvaW50LiIiIgogICAgc3ZjID0gX2dldF9wb2xpY3lfc2VydmljZSgpCiAgICBpZiBzdmMgaXMgTm9uZToKICAgICAgICByYWlzZSBIVFRQRXhjZXB0aW9uKHN0YXR1c19jb2RlPTUwMywgZGV0YWlsPSJQb2xpY3kgc2VydmljZSBub3QgYXZhaWxhYmxlIikKCiAgICAjIElmIHNlcnZpY2UgaGFzbid0IGxvYWRlZCB5ZXQsIHRyeSBmdWxsIGxvYWQKICAgIGlmIG5vdCBzdmMuX2xvYWRlZDoKICAgICAgICBvayA9IHN2Yy5sb2FkKCkKICAgIGVsc2U6CiAgICAgICAgb2sgPSBzdmMucmVsb2FkKGNoZWNrcG9pbnQpCgogICAgcmV0dXJuIHsKICAgICAgICAic3VjY2VzcyI6IG9rLAogICAgICAgICJzdGF0dXMiOiBzdmMuZ2V0X3N0YXR1cygpLAogICAgfQoKCiMg4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQCiMgTUwgVHJhaW5pbmcgTWFuYWdlbWVudCBFbmRwb2ludHMKIyDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZAKCiMgVHJhaW5pbmcgc3RhdGUgdHJhY2tpbmcKX3RyYWluaW5nX3N0YXRlID0gewogICAgInJ1bm5pbmciOiBGYWxzZSwKICAgICJwcm9ncmVzcyI6IDAsCiAgICAidG90YWxfZXBvY2hzIjogMCwKICAgICJjdXJyZW50X2Vwb2NoIjogMCwKICAgICJwaGFzZSI6ICJpZGxlIiwgICMgaWRsZSB8IGJ1aWxkaW5nIHwgdHJhaW5pbmcgfCBldmFsdWF0aW5nIHwgZG9uZSB8IGVycm9yCiAgICAibWVzc2FnZSI6ICIiLAogICAgIm1ldHJpY3MiOiBOb25lLCAgIyBsYXRlc3QgZXBvY2ggbWV0cmljcwogICAgInJlc3VsdCI6IE5vbmUsICAgIyBmaW5hbCB0cmFpbmluZyByZXN1bHQKICAgICJlcnJvciI6IE5vbmUsCiAgICAic3RhcnRlZF9hdCI6IE5vbmUsCn0KCgpkZWYgX3J1bl90cmFpbmluZ19waXBlbGluZSgKICAgIHJlc3VsdHNfZGlyOiBzdHIsCiAgICBlcG9jaHM6IGludCwKICAgIGxyOiBmbG9hdCwKICAgIGJhdGNoX3NpemU6IGludCwKICAgIHBhdGllbmNlOiBpbnQsCiAgICByZWJ1aWxkX2RhdGFzZXQ6IGJvb2wsCik6CiAgICAiIiJSdW4gdGhlIGZ1bGwgTUwgdHJhaW5pbmcgcGlwZWxpbmUgaW4gYSBiYWNrZ3JvdW5kIHRocmVhZC4iIiIKICAgIGdsb2JhbCBfdHJhaW5pbmdfc3RhdGUKICAgIHRyeToKICAgICAgICBpbXBvcnQgc3lzCiAgICAgICAgcHJvamVjdF9yb290ID0gc3RyKFBhdGgoX19maWxlX18pLnBhcmVudCkKICAgICAgICBpZiBwcm9qZWN0X3Jvb3Qgbm90IGluIHN5cy5wYXRoOgogICAgICAgICAgICBzeXMucGF0aC5pbnNlcnQoMCwgcHJvamVjdF9yb290KQoKICAgICAgICBfdHJhaW5pbmdfc3RhdGVbInJ1bm5pbmciXSA9IFRydWUKICAgICAgICBfdHJhaW5pbmdfc3RhdGVbInN0YXJ0ZWRfYXQiXSA9IGRhdGV0aW1lLm5vdygpLmlzb2Zvcm1hdCgpCiAgICAgICAgX3RyYWluaW5nX3N0YXRlWyJlcnJvciJdID0gTm9uZQogICAgICAgIF90cmFpbmluZ19zdGF0ZVsicmVzdWx0Il0gPSBOb25lCgogICAgICAgIGRhdGFfZGlyID0gb3MucGF0aC5qb2luKHByb2plY3Rfcm9vdCwgIm1sIiwgIm1vZGVscyIpCiAgICAgICAgY2twdF9kaXIgPSBvcy5wYXRoLmpvaW4ocHJvamVjdF9yb290LCAibWwiLCAibW9kZWxzIiwgImNoZWNrcG9pbnRzIikKICAgICAgICBvcy5tYWtlZGlycyhkYXRhX2RpciwgZXhpc3Rfb2s9VHJ1ZSkKICAgICAgICBvcy5tYWtlZGlycyhja3B0X2RpciwgZXhpc3Rfb2s9VHJ1ZSkKCiAgICAgICAgIyAtLS0gUGhhc2UgMTogQnVpbGQgRGF0YXNldCAtLS0KICAgICAgICB0cmFpbl9wYXRoID0gb3MucGF0aC5qb2luKGRhdGFfZGlyLCAidHJhaW4ubnB6IikKICAgICAgICBpZiByZWJ1aWxkX2RhdGFzZXQgb3Igbm90IG9zLnBhdGguZXhpc3RzKHRyYWluX3BhdGgpOgogICAgICAgICAgICBfdHJhaW5pbmdfc3RhdGVbInBoYXNlIl0gPSAiYnVpbGRpbmciCiAgICAgICAgICAgIF90cmFpbmluZ19zdGF0ZVsibWVzc2FnZSJdID0gIkxvYWRpbmcgY2FyZCBlbWJlZGRpbmdzICYgYnVpbGRpbmcgZGF0YXNldC4uLiIKICAgICAgICAgICAgbG9nX21sLmluZm8oIkJ1aWxkaW5nIGRhdGFzZXQgKGxvYWRpbmcgZW1iZWRkaW5ncywgbWF5IGF1dG8tZG93bmxvYWQpLi4uIikKCiAgICAgICAgICAgIGZyb20gbWwuZGF0YS5kYXRhc2V0X2J1aWxkZXIgaW1wb3J0IGJ1aWxkX2RhdGFzZXQsIHNwbGl0X2RhdGFzZXQsIHNhdmVfZGF0YXNldAogICAgICAgICAgICBkYXRhc2V0ID0gYnVpbGRfZGF0YXNldChyZXN1bHRzX2Rpcj1yZXN1bHRzX2RpcikKICAgICAgICAgICAgaWYgbm90IGRhdGFzZXQ6CiAgICAgICAgICAgICAgICByYWlzZSBSdW50aW1lRXJyb3IoIk5vIHRyYWluaW5nIGRhdGEgcHJvZHVjZWQuIENoZWNrIHNlcnZlciBsb2cgZm9yIGRldGFpbHMuIikKICAgICAgICAgICAgdHJhaW5fZHMsIHZhbF9kcywgdGVzdF9kcyA9IHNwbGl0X2RhdGFzZXQoZGF0YXNldCkKICAgICAgICAgICAgc2F2ZV9kYXRhc2V0KHRyYWluX2RzLCBvcy5wYXRoLmpvaW4oZGF0YV9kaXIsICJ0cmFpbi5ucHoiKSkKICAgICAgICAgICAgc2F2ZV9kYXRhc2V0KHZhbF9kcywgb3MucGF0aC5qb2luKGRhdGFfZGlyLCAidmFsLm5weiIpKQogICAgICAgICAgICBzYXZlX2RhdGFzZXQodGVzdF9kcywgb3MucGF0aC5qb2luKGRhdGFfZGlyLCAidGVzdC5ucHoiKSkKICAgICAgICAgICAgdG90YWxfc2FtcGxlcyA9IGxlbihkYXRhc2V0WyJzdGF0ZXMiXSkKICAgICAgICAgICAgX3RyYWluaW5nX3N0YXRlWyJtZXNzYWdlIl0gPSBmIkRhdGFzZXQgYnVpbHQ6IHt0b3RhbF9zYW1wbGVzfSBzYW1wbGVzIgogICAgICAgICAgICBsb2dfbWwuaW5mbyhmIkRhdGFzZXQgYnVpbHQ6IHt0b3RhbF9zYW1wbGVzfSBzYW1wbGVzIikKCiAgICAgICAgIyAtLS0gUGhhc2UgMjogVHJhaW4gLS0tCiAgICAgICAgX3RyYWluaW5nX3N0YXRlWyJwaGFzZSJdID0gInRyYWluaW5nIgogICAgICAgIF90cmFpbmluZ19zdGF0ZVsidG90YWxfZXBvY2hzIl0gPSBlcG9jaHMKICAgICAgICBfdHJhaW5pbmdfc3RhdGVbImN1cnJlbnRfZXBvY2giXSA9IDAKICAgICAgICBfdHJhaW5pbmdfc3RhdGVbIm1lc3NhZ2UiXSA9IGYiVHJhaW5pbmcgcG9saWN5IG5ldHdvcmsgKHtlcG9jaHN9IGVwb2NocykuLi4iCiAgICAgICAgbG9nX21sLmluZm8oZiJTdGFydGluZyB0cmFpbmluZzoge2Vwb2Noc30gZXBvY2hzLCBscj17bHJ9LCBicz17YmF0Y2hfc2l6ZX0iKQoKICAgICAgICBpbXBvcnQgbnVtcHkgYXMgbnAKICAgICAgICBpbXBvcnQgdG9yY2gKICAgICAgICBmcm9tIG1sLnRyYWluaW5nLnBvbGljeV9uZXR3b3JrIGltcG9ydCBQb2xpY3lOZXR3b3JrCiAgICAgICAgZnJvbSBtbC50cmFpbmluZy50cmFpbmVyIGltcG9ydCBTdXBlcnZpc2VkVHJhaW5lcgoKICAgICAgICBkZWYgbG9hZF9ucHpfc3BsaXQocGF0aCk6CiAgICAgICAgICAgIGRhdGEgPSBucC5sb2FkKHBhdGgpCiAgICAgICAgICAgIHJldHVybiBkYXRhWyJzdGF0ZXMiXS5hc3R5cGUobnAuZmxvYXQzMiksIGRhdGFbImxhYmVscyJdLmFzdHlwZShucC5pbnQ2NCkKCiAgICAgICAgdHJhaW5fc3RhdGVzLCB0cmFpbl9sYWJlbHMgPSBsb2FkX25wel9zcGxpdCh0cmFpbl9wYXRoKQogICAgICAgIHZhbF9wYXRoID0gb3MucGF0aC5qb2luKGRhdGFfZGlyLCAidmFsLm5weiIpCiAgICAgICAgdmFsX3N0YXRlcywgdmFsX2xhYmVscyA9IGxvYWRfbnB6X3NwbGl0KHZhbF9wYXRoKQoKICAgICAgICBhY3R1YWxfZGltID0gdHJhaW5fc3RhdGVzLnNoYXBlWzFdCiAgICAgICAgbW9kZWwgPSBQb2xpY3lOZXR3b3JrKGlucHV0X2RpbT1hY3R1YWxfZGltKQoKICAgICAgICBkZXZpY2UgPSAiY3B1IgogICAgICAgIGlmIHRvcmNoLmN1ZGEuaXNfYXZhaWxhYmxlKCk6CiAgICAgICAgICAgIGRldmljZSA9ICJjdWRhIgogICAgICAgIGVsaWYgaGFzYXR0cih0b3JjaC5iYWNrZW5kcywgIm1wcyIpIGFuZCB0b3JjaC5iYWNrZW5kcy5tcHMuaXNfYXZhaWxhYmxlKCk6CiAgICAgICAgICAgIGRldmljZSA9ICJtcHMiCgogICAgICAgIHRyYWluZXIgPSBTdXBlcnZpc2VkVHJhaW5lcigKICAgICAgICAgICAgbW9kZWw9bW9kZWwsCiAgICAgICAgICAgIGRldmljZT1kZXZpY2UsCiAgICAgICAgICAgIGxlYXJuaW5nX3JhdGU9bHIsCiAgICAgICAgICAgIGJhdGNoX3NpemU9YmF0Y2hfc2l6ZSwKICAgICAgICAgICAgZXBvY2hzPWVwb2NocywKICAgICAgICAgICAgcGF0aWVuY2U9cGF0aWVuY2UsCiAgICAgICAgICAgIGNoZWNrcG9pbnRfZGlyPWNrcHRfZGlyLAogICAgICAgICkKCiAgICAgICAgIyBIb29rIGludG8gdHJhaW5lciB0byByZXBvcnQgcHJvZ3Jlc3MKICAgICAgICBvcmlnaW5hbF90cmFpbiA9IHRyYWluZXIudHJhaW4KCiAgICAgICAgZGVmIHBhdGNoZWRfdHJhaW4odHJhaW5fcywgdHJhaW5fbCwgdmFsX3MsIHZhbF9sKToKICAgICAgICAgICAgIyBXZSdsbCBtb25pdG9yIHRoZSBjaGVja3BvaW50IGRpciBmb3IgcHJvZ3Jlc3MKICAgICAgICAgICAgcmV0dXJuIG9yaWdpbmFsX3RyYWluKHRyYWluX3MsIHRyYWluX2wsIHZhbF9zLCB2YWxfbCkKCiAgICAgICAgc3VtbWFyeSA9IHRyYWluZXIudHJhaW4odHJhaW5fc3RhdGVzLCB0cmFpbl9sYWJlbHMsIHZhbF9zdGF0ZXMsIHZhbF9sYWJlbHMpCgogICAgICAgIF90cmFpbmluZ19zdGF0ZVsiY3VycmVudF9lcG9jaCJdID0gc3VtbWFyeS5nZXQoImVwb2Noc190cmFpbmVkIiwgZXBvY2hzKQogICAgICAgIF90cmFpbmluZ19zdGF0ZVsibWV0cmljcyJdID0gc3VtbWFyeQoKICAgICAgICAjIC0tLSBQaGFzZSAzOiBFdmFsdWF0ZSAtLS0KICAgICAgICBfdHJhaW5pbmdfc3RhdGVbInBoYXNlIl0gPSAiZXZhbHVhdGluZyIKICAgICAgICBfdHJhaW5pbmdfc3RhdGVbIm1lc3NhZ2UiXSA9ICJFdmFsdWF0aW5nIG9uIHRlc3Qgc2V0Li4uIgoKICAgICAgICB0ZXN0X3BhdGggPSBvcy5wYXRoLmpvaW4oZGF0YV9kaXIsICJ0ZXN0Lm5weiIpCiAgICAgICAgZXZhbF9yZXN1bHRzID0gTm9uZQogICAgICAgIGlmIG9zLnBhdGguZXhpc3RzKHRlc3RfcGF0aCk6CiAgICAgICAgICAgIGZyb20gbWwudHJhaW5pbmcudHJhaW5lciBpbXBvcnQgbG9hZF9jaGVja3BvaW50LCBldmFsdWF0ZV9tb2RlbAogICAgICAgICAgICB0ZXN0X3N0YXRlcywgdGVzdF9sYWJlbHMgPSBsb2FkX25wel9zcGxpdCh0ZXN0X3BhdGgpCiAgICAgICAgICAgIGJlc3RfbW9kZWwsIF8gPSBsb2FkX2NoZWNrcG9pbnQoc3VtbWFyeVsiY2hlY2twb2ludF9wYXRoIl0sIGRldmljZSkKICAgICAgICAgICAgZXZhbF9yZXN1bHRzID0gZXZhbHVhdGVfbW9kZWwoYmVzdF9tb2RlbCwgdGVzdF9zdGF0ZXMsIHRlc3RfbGFiZWxzLCBkZXZpY2UpCgogICAgICAgICAgICBldmFsX3BhdGggPSBvcy5wYXRoLmpvaW4oY2twdF9kaXIsICJldmFsX3Jlc3VsdHMuanNvbiIpCiAgICAgICAgICAgIHdpdGggb3BlbihldmFsX3BhdGgsICJ3IikgYXMgZjoKICAgICAgICAgICAgICAgIGpzb24uZHVtcChldmFsX3Jlc3VsdHMsIGYsIGluZGVudD0yKQoKICAgICAgICAjIC0tLSBEb25lIC0tLQogICAgICAgIF90cmFpbmluZ19zdGF0ZVsicGhhc2UiXSA9ICJkb25lIgogICAgICAgIF90cmFpbmluZ19zdGF0ZVsicnVubmluZyJdID0gRmFsc2UKICAgICAgICBfdHJhaW5pbmdfc3RhdGVbInJlc3VsdCJdID0gewogICAgICAgICAgICAidHJhaW5pbmciOiBzdW1tYXJ5LAogICAgICAgICAgICAiZXZhbHVhdGlvbiI6IGV2YWxfcmVzdWx0cywKICAgICAgICAgICAgImNoZWNrcG9pbnQiOiBzdW1tYXJ5LmdldCgiY2hlY2twb2ludF9wYXRoIiwgIiIpLAogICAgICAgICAgICAiZGV2aWNlIjogZGV2aWNlLAogICAgICAgIH0KICAgICAgICBfdHJhaW5pbmdfc3RhdGVbIm1lc3NhZ2UiXSA9IGYiVHJhaW5pbmcgY29tcGxldGUhIEJlc3QgdmFsIGFjYzoge3N1bW1hcnkuZ2V0KCdiZXN0X3ZhbF9hY2N1cmFjeScsIDApOi4xJX0iCiAgICAgICAgbG9nX21sLmluZm8oZiJDb21wbGV0ZToge3N1bW1hcnkuZ2V0KCdiZXN0X3ZhbF9hY2N1cmFjeScsIDApOi4xJX0gdmFsIGFjY3VyYWN5IikKCiAgICAgICAgIyBBdXRvLXJlbG9hZCBwb2xpY3kgc2VydmVyIHdpdGggbmV3IGNoZWNrcG9pbnQKICAgICAgICBnbG9iYWwgX3BvbGljeV9zZXJ2aWNlLCBfcG9saWN5X3NlcnZpY2VfaW5pdF9hdHRlbXB0ZWQKICAgICAgICBpZiBfcG9saWN5X3NlcnZpY2UgYW5kIF9wb2xpY3lfc2VydmljZS5fbG9hZGVkOgogICAgICAgICAgICBfcG9saWN5X3NlcnZpY2UucmVsb2FkKHN1bW1hcnkuZ2V0KCJjaGVja3BvaW50X3BhdGgiKSkKICAgICAgICAgICAgbG9nX21sLmluZm8oIlBvbGljeSBzZXJ2ZXIgcmVsb2FkZWQgd2l0aCBuZXcgY2hlY2twb2ludCIpCiAgICAgICAgZWxpZiBub3QgX3BvbGljeV9zZXJ2aWNlX2luaXRfYXR0ZW1wdGVkOgogICAgICAgICAgICBfcG9saWN5X3NlcnZpY2VfaW5pdF9hdHRlbXB0ZWQgPSBGYWxzZSAgIyBBbGxvdyByZS1pbml0IHdpdGggbmV3IG1vZGVsCgogICAgZXhjZXB0IEV4Y2VwdGlvbiBhcyBlOgogICAgICAgIGltcG9ydCB0cmFjZWJhY2sKICAgICAgICBfdHJhaW5pbmdfc3RhdGVbInBoYXNlIl0gPSAiZXJyb3IiCiAgICAgICAgX3RyYWluaW5nX3N0YXRlWyJydW5uaW5nIl0gPSBGYWxzZQogICAgICAgIF90cmFpbmluZ19zdGF0ZVsiZXJyb3IiXSA9IHN0cihlKQogICAgICAgIF90cmFpbmluZ19zdGF0ZVsibWVzc2FnZSJdID0gZiJUcmFpbmluZyBmYWlsZWQ6IHtlfSIKICAgICAgICBsb2dfbWwuZXJyb3IoZiJFUlJPUjoge2V9IikKICAgICAgICB0cmFjZWJhY2sucHJpbnRfZXhjKCkKCgpAYXBwLnBvc3QoIi9hcGkvbWwvdHJhaW4iKQphc3luYyBkZWYgbWxfc3RhcnRfdHJhaW5pbmcocmVxdWVzdDogRmFzdEFQSVJlcXVlc3QpOgogICAgIiIiVHJpZ2dlciBNTCB0cmFpbmluZyBwaXBlbGluZSBmcm9tIHRoZSB3ZWIgVUkuCgogICAgUmVxdWVzdCBib2R5IChhbGwgb3B0aW9uYWwpOgogICAgICAgIHsKICAgICAgICAgICAgImVwb2NocyI6IDUwLAogICAgICAgICAgICAibHIiOiAwLjAwMSwKICAgICAgICAgICAgImJhdGNoU2l6ZSI6IDI1NiwKICAgICAgICAgICAgInBhdGllbmNlIjogMTAsCiAgICAgICAgICAgICJyZWJ1aWxkRGF0YXNldCI6IHRydWUKICAgICAgICB9CiAgICAiIiIKICAgIGlmIF90cmFpbmluZ19zdGF0ZVsicnVubmluZyJdOgogICAgICAgIHJhaXNlIEhUVFBFeGNlcHRpb24oNDA5LCAiVHJhaW5pbmcgYWxyZWFkeSBpbiBwcm9ncmVzcyIpCgogICAgYm9keSA9IGF3YWl0IHJlcXVlc3QuanNvbigpIGlmIGF3YWl0IHJlcXVlc3QuYm9keSgpIGVsc2Uge30KICAgIGVwb2NocyA9IGJvZHkuZ2V0KCJlcG9jaHMiLCA1MCkKICAgIGxyID0gYm9keS5nZXQoImxyIiwgMC4wMDEpCiAgICBiYXRjaF9zaXplID0gYm9keS5nZXQoImJhdGNoU2l6ZSIsIDI1NikKICAgIHBhdGllbmNlID0gYm9keS5nZXQoInBhdGllbmNlIiwgMTApCiAgICByZWJ1aWxkID0gYm9keS5nZXQoInJlYnVpbGREYXRhc2V0IiwgVHJ1ZSkKCiAgICByZXN1bHRzX2RpciA9IG9zLnBhdGguam9pbihzdHIoUGF0aChfX2ZpbGVfXykucGFyZW50KSwgInJlc3VsdHMiKQoKICAgICMgUmVzZXQgc3RhdGUKICAgIF90cmFpbmluZ19zdGF0ZS51cGRhdGUoewogICAgICAgICJydW5uaW5nIjogVHJ1ZSwKICAgICAgICAicHJvZ3Jlc3MiOiAwLAogICAgICAgICJ0b3RhbF9lcG9jaHMiOiBlcG9jaHMsCiAgICAgICAgImN1cnJlbnRfZXBvY2giOiAwLAogICAgICAgICJwaGFzZSI6ICJzdGFydGluZyIsCiAgICAgICAgIm1lc3NhZ2UiOiAiSW5pdGlhbGl6aW5nIHRyYWluaW5nIHBpcGVsaW5lLi4uIiwKICAgICAgICAibWV0cmljcyI6IE5vbmUsCiAgICAgICAgInJlc3VsdCI6IE5vbmUsCiAgICAgICAgImVycm9yIjogTm9uZSwKICAgIH0pCgogICAgIyBSdW4gaW4gYmFja2dyb3VuZCB0aHJlYWQKICAgIHRocmVhZCA9IHRocmVhZGluZy5UaHJlYWQoCiAgICAgICAgdGFyZ2V0PV9ydW5fdHJhaW5pbmdfcGlwZWxpbmUsCiAgICAgICAgYXJncz0ocmVzdWx0c19kaXIsIGVwb2NocywgbHIsIGJhdGNoX3NpemUsIHBhdGllbmNlLCByZWJ1aWxkKSwKICAgICAgICBkYWVtb249VHJ1ZSwKICAgICkKICAgIHRocmVhZC5zdGFydCgpCgogICAgcmV0dXJuIHsKICAgICAgICAic3RhdHVzIjogInN0YXJ0ZWQiLAogICAgICAgICJjb25maWciOiB7CiAgICAgICAgICAgICJlcG9jaHMiOiBlcG9jaHMsCiAgICAgICAgICAgICJsciI6IGxyLAogICAgICAgICAgICAiYmF0Y2hTaXplIjogYmF0Y2hfc2l6ZSwKICAgICAgICAgICAgInBhdGllbmNlIjogcGF0aWVuY2UsCiAgICAgICAgICAgICJyZWJ1aWxkRGF0YXNldCI6IHJlYnVpbGQsCiAgICAgICAgfSwKICAgIH0KCgpAYXBwLmdldCgiL2FwaS9tbC90cmFpbi9zdGF0dXMiKQphc3luYyBkZWYgbWxfdHJhaW5pbmdfc3RhdHVzKCk6CiAgICAiIiJHZXQgY3VycmVudCB0cmFpbmluZyBwaXBlbGluZSBzdGF0dXMuIiIiCiAgICByZXR1cm4gZGljdChfdHJhaW5pbmdfc3RhdGUpCgoKQGFwcC5nZXQoIi9hcGkvbWwvZGF0YS9zdGF0dXMiKQphc3luYyBkZWYgbWxfZGF0YV9zdGF0dXMoKToKICAgICIiIkdldCBzdGF0dXMgb2YgYXZhaWxhYmxlIHRyYWluaW5nIGRhdGEgYW5kIG1vZGVsIGNoZWNrcG9pbnRzLiIiIgogICAgcHJvamVjdF9yb290ID0gUGF0aChfX2ZpbGVfXykucGFyZW50CiAgICByZXN1bHRzX2RpciA9IHByb2plY3Rfcm9vdCAvICJyZXN1bHRzIgogICAgZGF0YV9kaXIgPSBwcm9qZWN0X3Jvb3QgLyAibWwiIC8gIm1vZGVscyIKICAgIGNrcHRfZGlyID0gZGF0YV9kaXIgLyAiY2hlY2twb2ludHMiCgogICAgIyBEZWNpc2lvbiBsb2cgZmlsZXMKICAgIGRlY2lzaW9uX2ZpbGVzID0gW10KICAgIGlmIHJlc3VsdHNfZGlyLmV4aXN0cygpOgogICAgICAgIGZvciBmIGluIHNvcnRlZChyZXN1bHRzX2Rpci5nbG9iKCJtbC1kZWNpc2lvbnMtKi5qc29ubCIpKToKICAgICAgICAgICAgbGluZV9jb3VudCA9IDAKICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgd2l0aCBvcGVuKGYsICJyIikgYXMgZmg6CiAgICAgICAgICAgICAgICAgICAgbGluZV9jb3VudCA9IHN1bSgxIGZvciBfIGluIGZoKQogICAgICAgICAgICBleGNlcHQgRXhjZXB0aW9uOgogICAgICAgICAgICAgICAgcGFzcwogICAgICAgICAgICBkZWNpc2lvbl9maWxlcy5hcHBlbmQoewogICAgICAgICAgICAgICAgIm5hbWUiOiBmLm5hbWUsCiAgICAgICAgICAgICAgICAic2l6ZSI6IGYuc3RhdCgpLnN0X3NpemUsCiAgICAgICAgICAgICAgICAiZGVjaXNpb25zIjogbGluZV9jb3VudCwKICAgICAgICAgICAgfSkKCiAgICAjIERhdGFzZXQgZmlsZXMKICAgIGRhdGFzZXRzID0ge30KICAgIGZvciBzcGxpdCBpbiBbInRyYWluIiwgInZhbCIsICJ0ZXN0Il06CiAgICAgICAgcGF0aCA9IGRhdGFfZGlyIC8gZiJ7c3BsaXR9Lm5weiIKICAgICAgICBpZiBwYXRoLmV4aXN0cygpOgogICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICBpbXBvcnQgbnVtcHkgYXMgbnAKICAgICAgICAgICAgICAgIGRhdGEgPSBucC5sb2FkKHN0cihwYXRoKSkKICAgICAgICAgICAgICAgIGRhdGFzZXRzW3NwbGl0XSA9IHsKICAgICAgICAgICAgICAgICAgICAic2FtcGxlcyI6IGludChkYXRhWyJzdGF0ZXMiXS5zaGFwZVswXSksCiAgICAgICAgICAgICAgICAgICAgImZlYXR1cmVzIjogaW50KGRhdGFbInN0YXRlcyJdLnNoYXBlWzFdKSwKICAgICAgICAgICAgICAgICAgICAic2l6ZSI6IHBhdGguc3RhdCgpLnN0X3NpemUsCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIGV4Y2VwdCBFeGNlcHRpb246CiAgICAgICAgICAgICAgICBkYXRhc2V0c1tzcGxpdF0gPSB7InNpemUiOiBwYXRoLnN0YXQoKS5zdF9zaXplfQoKICAgICMgQ2hlY2twb2ludHMKICAgIGNoZWNrcG9pbnRzID0gW10KICAgIGlmIGNrcHRfZGlyLmV4aXN0cygpOgogICAgICAgIGZvciBmIGluIHNvcnRlZChja3B0X2Rpci5nbG9iKCIqLnB0IikpOgogICAgICAgICAgICBjaGVja3BvaW50cy5hcHBlbmQoewogICAgICAgICAgICAgICAgIm5hbWUiOiBmLm5hbWUsCiAgICAgICAgICAgICAgICAic2l6ZSI6IGYuc3RhdCgpLnN0X3NpemUsCiAgICAgICAgICAgICAgICAibW9kaWZpZWQiOiBkYXRldGltZS5mcm9tdGltZXN0YW1wKGYuc3RhdCgpLnN0X210aW1lKS5pc29mb3JtYXQoKSwKICAgICAgICAgICAgfSkKCiAgICAjIEV2YWwgcmVzdWx0cwogICAgZXZhbF9wYXRoID0gY2twdF9kaXIgLyAiZXZhbF9yZXN1bHRzLmpzb24iCiAgICBldmFsX3Jlc3VsdHMgPSBOb25lCiAgICBpZiBldmFsX3BhdGguZXhpc3RzKCk6CiAgICAgICAgdHJ5OgogICAgICAgICAgICB3aXRoIG9wZW4oZXZhbF9wYXRoLCAiciIpIGFzIGY6CiAgICAgICAgICAgICAgICBldmFsX3Jlc3VsdHMgPSBqc29uLmxvYWQoZikKICAgICAgICBleGNlcHQgRXhjZXB0aW9uOgogICAgICAgICAgICBwYXNzCgogICAgcmV0dXJuIHsKICAgICAgICAiZGVjaXNpb25GaWxlcyI6IGRlY2lzaW9uX2ZpbGVzLAogICAgICAgICJ0b3RhbERlY2lzaW9ucyI6IHN1bShkWyJkZWNpc2lvbnMiXSBmb3IgZCBpbiBkZWNpc2lvbl9maWxlcyksCiAgICAgICAgImRhdGFzZXRzIjogZGF0YXNldHMsCiAgICAgICAgImNoZWNrcG9pbnRzIjogY2hlY2twb2ludHMsCiAgICAgICAgImV2YWxSZXN1bHRzIjogZXZhbF9yZXN1bHRzLAogICAgICAgICJwb2xpY3lMb2FkZWQiOiBfcG9saWN5X3NlcnZpY2UgaXMgbm90IE5vbmUgYW5kIF9wb2xpY3lfc2VydmljZS5fbG9hZGVkIGlmIF9wb2xpY3lfc2VydmljZSBlbHNlIEZhbHNlLAogICAgfQoKCiMg4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQCiMgUFBPIFRyYWluaW5nICsgVG91cm5hbWVudCBFbmRwb2ludHMKIyDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZAKCl9wcG9fc3RhdGUgPSB7CiAgICAicnVubmluZyI6IEZhbHNlLAogICAgIml0ZXJhdGlvbiI6IDAsCiAgICAidG90YWxfaXRlcmF0aW9ucyI6IDAsCiAgICAicGhhc2UiOiAiaWRsZSIsCiAgICAibWVzc2FnZSI6ICIiLAogICAgIm1ldHJpY3MiOiBOb25lLAogICAgInJlc3VsdCI6IE5vbmUsCiAgICAiZXJyb3IiOiBOb25lLAp9CgpfdG91cm5hbWVudF9zdGF0ZSA9IHsKICAgICJydW5uaW5nIjogRmFsc2UsCiAgICAicGhhc2UiOiAiaWRsZSIsCiAgICAibWVzc2FnZSI6ICIiLAogICAgInJlc3VsdCI6IE5vbmUsCiAgICAiZXJyb3IiOiBOb25lLAp9CgoKZGVmIF9ydW5fcHBvX3BpcGVsaW5lKAogICAgaXRlcmF0aW9uczogaW50LCBlcGlzb2Rlc19wZXJfaXRlcjogaW50LCBwcG9fZXBvY2hzOiBpbnQsIGJhdGNoX3NpemU6IGludCwKICAgIGxyOiBmbG9hdCwgY2xpcF9lcHNpbG9uOiBmbG9hdCwgZW50cm9weV9jb2VmZjogZmxvYXQsCiAgICBvcHBvbmVudDogc3RyLCBwbGF5c3R5bGU6IHN0ciwgbG9hZF9zdXBlcnZpc2VkOiBzdHIsCik6CiAgICAiIiJSdW4gUFBPIHRyYWluaW5nIGluIGEgYmFja2dyb3VuZCB0aHJlYWQuIiIiCiAgICBnbG9iYWwgX3Bwb19zdGF0ZQogICAgdHJ5OgogICAgICAgIGltcG9ydCBzeXMKICAgICAgICBwcm9qZWN0X3Jvb3QgPSBzdHIoUGF0aChfX2ZpbGVfXykucGFyZW50KQogICAgICAgIGlmIHByb2plY3Rfcm9vdCBub3QgaW4gc3lzLnBhdGg6CiAgICAgICAgICAgIHN5cy5wYXRoLmluc2VydCgwLCBwcm9qZWN0X3Jvb3QpCgogICAgICAgIF9wcG9fc3RhdGVbInJ1bm5pbmciXSA9IFRydWUKICAgICAgICBfcHBvX3N0YXRlWyJlcnJvciJdID0gTm9uZQogICAgICAgIF9wcG9fc3RhdGVbInJlc3VsdCJdID0gTm9uZQoKICAgICAgICBmcm9tIG1sLnRyYWluaW5nLnBwb190cmFpbmVyIGltcG9ydCBQUE9UcmFpbmVyLCBQUE9Db25maWcKCiAgICAgICAgY2twdF9kaXIgPSBvcy5wYXRoLmpvaW4ocHJvamVjdF9yb290LCAibWwiLCAibW9kZWxzIiwgImNoZWNrcG9pbnRzIikKICAgICAgICBjb25maWcgPSBQUE9Db25maWcoCiAgICAgICAgICAgIGl0ZXJhdGlvbnM9aXRlcmF0aW9ucywKICAgICAgICAgICAgZXBpc29kZXNfcGVyX2l0ZXI9ZXBpc29kZXNfcGVyX2l0ZXIsCiAgICAgICAgICAgIHBwb19lcG9jaHM9cHBvX2Vwb2NocywKICAgICAgICAgICAgYmF0Y2hfc2l6ZT1iYXRjaF9zaXplLAogICAgICAgICAgICBsZWFybmluZ19yYXRlPWxyLAogICAgICAgICAgICBjbGlwX2Vwc2lsb249Y2xpcF9lcHNpbG9uLAogICAgICAgICAgICBlbnRyb3B5X2NvZWZmPWVudHJvcHlfY29lZmYsCiAgICAgICAgICAgIG9wcG9uZW50PW9wcG9uZW50LAogICAgICAgICAgICBwbGF5c3R5bGU9cGxheXN0eWxlLAogICAgICAgICAgICBjaGVja3BvaW50X2Rpcj1ja3B0X2RpciwKICAgICAgICAgICAgbG9hZF9zdXBlcnZpc2VkPWxvYWRfc3VwZXJ2aXNlZCBpZiBsb2FkX3N1cGVydmlzZWQgZWxzZSBOb25lLAogICAgICAgICkKCiAgICAgICAgdHJhaW5lciA9IFBQT1RyYWluZXIoY29uZmlnKQoKICAgICAgICBkZWYgcHJvZ3Jlc3NfY2IoaXRlcmF0aW9uLCBtZXRyaWNzKToKICAgICAgICAgICAgX3Bwb19zdGF0ZVsiaXRlcmF0aW9uIl0gPSBpdGVyYXRpb24KICAgICAgICAgICAgX3Bwb19zdGF0ZVsicGhhc2UiXSA9ICJ0cmFpbmluZyIKICAgICAgICAgICAgX3Bwb19zdGF0ZVsibWVzc2FnZSJdID0gZiJJdGVyYXRpb24ge2l0ZXJhdGlvbn0ve2l0ZXJhdGlvbnN9IHwgV1I6IHttZXRyaWNzLmdldCgnd2luX3JhdGUnLCAwKTouMCV9IgogICAgICAgICAgICBfcHBvX3N0YXRlWyJtZXRyaWNzIl0gPSBtZXRyaWNzCgogICAgICAgIHN1bW1hcnkgPSB0cmFpbmVyLnRyYWluKHByb2dyZXNzX2NhbGxiYWNrPXByb2dyZXNzX2NiKQoKICAgICAgICBfcHBvX3N0YXRlWyJwaGFzZSJdID0gImRvbmUiCiAgICAgICAgX3Bwb19zdGF0ZVsicnVubmluZyJdID0gRmFsc2UKICAgICAgICBfcHBvX3N0YXRlWyJyZXN1bHQiXSA9IHN1bW1hcnkKICAgICAgICBfcHBvX3N0YXRlWyJtZXNzYWdlIl0gPSBmIlBQTyBjb21wbGV0ZSEgQmVzdCB3aW4gcmF0ZToge3N1bW1hcnkuZ2V0KCdiZXN0X3dpbl9yYXRlJywgMCk6LjAlfSIKCiAgICBleGNlcHQgRXhjZXB0aW9uIGFzIGU6CiAgICAgICAgaW1wb3J0IHRyYWNlYmFjawogICAgICAgIF9wcG9fc3RhdGVbInBoYXNlIl0gPSAiZXJyb3IiCiAgICAgICAgX3Bwb19zdGF0ZVsicnVubmluZyJdID0gRmFsc2UKICAgICAgICBfcHBvX3N0YXRlWyJlcnJvciJdID0gc3RyKGUpCiAgICAgICAgX3Bwb19zdGF0ZVsibWVzc2FnZSJdID0gZiJQUE8gZmFpbGVkOiB7ZX0iCiAgICAgICAgdHJhY2ViYWNrLnByaW50X2V4YygpCgoKQGFwcC5wb3N0KCIvYXBpL21sL3RyYWluL3BwbyIpCmFzeW5jIGRlZiBtbF9zdGFydF9wcG8ocmVxdWVzdDogRmFzdEFQSVJlcXVlc3QpOgogICAgIiIiU3RhcnQgUFBPIHRyYWluaW5nIHBpcGVsaW5lLiIiIgogICAgaWYgX3Bwb19zdGF0ZVsicnVubmluZyJdOgogICAgICAgIHJhaXNlIEhUVFBFeGNlcHRpb24oNDA5LCAiUFBPIHRyYWluaW5nIGFscmVhZHkgaW4gcHJvZ3Jlc3MiKQogICAgaWYgX3RyYWluaW5nX3N0YXRlWyJydW5uaW5nIl06CiAgICAgICAgcmFpc2UgSFRUUEV4Y2VwdGlvbig0MDksICJTdXBlcnZpc2VkIHRyYWluaW5nIGluIHByb2dyZXNzIOKAlCB3YWl0IGZvciBpdCB0byBmaW5pc2giKQoKICAgIGJvZHkgPSBhd2FpdCByZXF1ZXN0Lmpzb24oKSBpZiBhd2FpdCByZXF1ZXN0LmJvZHkoKSBlbHNlIHt9CiAgICBpdGVyYXRpb25zID0gYm9keS5nZXQoIml0ZXJhdGlvbnMiLCAxMDApCiAgICBlcGlzb2RlcyA9IGJvZHkuZ2V0KCJlcGlzb2Rlc1Blckl0ZXIiLCA2NCkKICAgIHBwb19lcG9jaHMgPSBib2R5LmdldCgicHBvRXBvY2hzIiwgNCkKICAgIGJhdGNoX3NpemUgPSBib2R5LmdldCgiYmF0Y2hTaXplIiwgMjU2KQogICAgbHIgPSBib2R5LmdldCgibHIiLCAzZS00KQogICAgY2xpcF9lcHMgPSBib2R5LmdldCgiY2xpcEVwc2lsb24iLCAwLjIpCiAgICBlbnRyb3B5ID0gYm9keS5nZXQoImVudHJvcHlDb2VmZiIsIDAuMDEpCiAgICBvcHBvbmVudCA9IGJvZHkuZ2V0KCJvcHBvbmVudCIsICJoZXVyaXN0aWMiKQogICAgcGxheXN0eWxlID0gYm9keS5nZXQoInBsYXlzdHlsZSIsICJtaWRyYW5nZSIpCiAgICBsb2FkX3N1cCA9IGJvZHkuZ2V0KCJsb2FkU3VwZXJ2aXNlZCIsICIiKQoKICAgIF9wcG9fc3RhdGUudXBkYXRlKHsKICAgICAgICAicnVubmluZyI6IFRydWUsICJpdGVyYXRpb24iOiAwLCAidG90YWxfaXRlcmF0aW9ucyI6IGl0ZXJhdGlvbnMsCiAgICAgICAgInBoYXNlIjogInN0YXJ0aW5nIiwgIm1lc3NhZ2UiOiAiSW5pdGlhbGl6aW5nIFBQTy4uLiIsCiAgICAgICAgIm1ldHJpY3MiOiBOb25lLCAicmVzdWx0IjogTm9uZSwgImVycm9yIjogTm9uZSwKICAgIH0pCgogICAgdGhyZWFkID0gdGhyZWFkaW5nLlRocmVhZCgKICAgICAgICB0YXJnZXQ9X3J1bl9wcG9fcGlwZWxpbmUsCiAgICAgICAgYXJncz0oaXRlcmF0aW9ucywgZXBpc29kZXMsIHBwb19lcG9jaHMsIGJhdGNoX3NpemUsIGxyLCBjbGlwX2VwcywgZW50cm9weSwgb3Bwb25lbnQsIHBsYXlzdHlsZSwgbG9hZF9zdXApLAogICAgICAgIGRhZW1vbj1UcnVlLAogICAgKQogICAgdGhyZWFkLnN0YXJ0KCkKCiAgICByZXR1cm4geyJzdGF0dXMiOiAic3RhcnRlZCIsICJpdGVyYXRpb25zIjogaXRlcmF0aW9uc30KCgpAYXBwLmdldCgiL2FwaS9tbC90cmFpbi9wcG8vc3RhdHVzIikKYXN5bmMgZGVmIG1sX3Bwb19zdGF0dXMoKToKICAgICIiIkdldCBQUE8gdHJhaW5pbmcgc3RhdHVzLiIiIgogICAgcmV0dXJuIGRpY3QoX3Bwb19zdGF0ZSkKCgpkZWYgX3J1bl90b3VybmFtZW50X3BpcGVsaW5lKGVwaXNvZGVzOiBpbnQsIHBsYXlzdHlsZTogc3RyKToKICAgICIiIlJ1biB0b3VybmFtZW50IGluIGEgYmFja2dyb3VuZCB0aHJlYWQuIiIiCiAgICBnbG9iYWwgX3RvdXJuYW1lbnRfc3RhdGUKICAgIHRyeToKICAgICAgICBpbXBvcnQgc3lzCiAgICAgICAgcHJvamVjdF9yb290ID0gc3RyKFBhdGgoX19maWxlX18pLnBhcmVudCkKICAgICAgICBpZiBwcm9qZWN0X3Jvb3Qgbm90IGluIHN5cy5wYXRoOgogICAgICAgICAgICBzeXMucGF0aC5pbnNlcnQoMCwgcHJvamVjdF9yb290KQoKICAgICAgICBfdG91cm5hbWVudF9zdGF0ZVsicnVubmluZyJdID0gVHJ1ZQogICAgICAgIF90b3VybmFtZW50X3N0YXRlWyJlcnJvciJdID0gTm9uZQogICAgICAgIF90b3VybmFtZW50X3N0YXRlWyJyZXN1bHQiXSA9IE5vbmUKICAgICAgICBfdG91cm5hbWVudF9zdGF0ZVsicGhhc2UiXSA9ICJydW5uaW5nIgogICAgICAgIF90b3VybmFtZW50X3N0YXRlWyJtZXNzYWdlIl0gPSAiUnVubmluZyB0b3VybmFtZW50Li4uIgoKICAgICAgICBmcm9tIG1sLmV2YWwudG91cm5hbWVudCBpbXBvcnQgKAogICAgICAgICAgICBydW5fdG91cm5hbWVudCwgSGV1cmlzdGljUG9saWN5LCBSYW5kb21Qb2xpY3ksIExlYXJuZWRQb2xpY3ksCiAgICAgICAgKQoKICAgICAgICBja3B0X2RpciA9IG9zLnBhdGguam9pbihwcm9qZWN0X3Jvb3QsICJtbCIsICJtb2RlbHMiLCAiY2hlY2twb2ludHMiKQogICAgICAgIHBvbGljaWVzID0gewogICAgICAgICAgICAiaGV1cmlzdGljIjogSGV1cmlzdGljUG9saWN5KCksCiAgICAgICAgICAgICJyYW5kb20iOiBSYW5kb21Qb2xpY3koKSwKICAgICAgICB9CgogICAgICAgIHN1cF9wYXRoID0gb3MucGF0aC5qb2luKGNrcHRfZGlyLCAiYmVzdF9wb2xpY3kucHQiKQogICAgICAgIGlmIG9zLnBhdGguZXhpc3RzKHN1cF9wYXRoKToKICAgICAgICAgICAgcG9saWNpZXNbInN1cGVydmlzZWQiXSA9IExlYXJuZWRQb2xpY3koc3VwX3BhdGgpCgogICAgICAgIHBwb19wYXRoID0gb3MucGF0aC5qb2luKGNrcHRfZGlyLCAiYmVzdF9wcG8ucHQiKQogICAgICAgIGlmIG9zLnBhdGguZXhpc3RzKHBwb19wYXRoKToKICAgICAgICAgICAgcG9saWNpZXNbInBwbyJdID0gTGVhcm5lZFBvbGljeShwcG9fcGF0aCkKCiAgICAgICAgcmVzdWx0ID0gcnVuX3RvdXJuYW1lbnQoCiAgICAgICAgICAgIHBvbGljaWVzPXBvbGljaWVzLAogICAgICAgICAgICBlcGlzb2Rlc19wZXJfbWF0Y2h1cD1lcGlzb2RlcywKICAgICAgICAgICAgcGxheXN0eWxlPXBsYXlzdHlsZSwKICAgICAgICApCgogICAgICAgICMgU2F2ZSByZXN1bHRzCiAgICAgICAgb3V0cHV0X3BhdGggPSBvcy5wYXRoLmpvaW4oY2twdF9kaXIsICJ0b3VybmFtZW50X3Jlc3VsdHMuanNvbiIpCiAgICAgICAgd2l0aCBvcGVuKG91dHB1dF9wYXRoLCAidyIpIGFzIGY6CiAgICAgICAgICAgIGpzb24uZHVtcChyZXN1bHQudG9fZGljdCgpLCBmLCBpbmRlbnQ9MikKCiAgICAgICAgX3RvdXJuYW1lbnRfc3RhdGVbInBoYXNlIl0gPSAiZG9uZSIKICAgICAgICBfdG91cm5hbWVudF9zdGF0ZVsicnVubmluZyJdID0gRmFsc2UKICAgICAgICBfdG91cm5hbWVudF9zdGF0ZVsicmVzdWx0Il0gPSByZXN1bHQudG9fZGljdCgpCiAgICAgICAgX3RvdXJuYW1lbnRfc3RhdGVbIm1lc3NhZ2UiXSA9IGYiVG91cm5hbWVudCBjb21wbGV0ZSEge3Jlc3VsdC50b3RhbF9tYXRjaGVzfSBtYXRjaGVzIgoKICAgIGV4Y2VwdCBFeGNlcHRpb24gYXMgZToKICAgICAgICBpbXBvcnQgdHJhY2ViYWNrCiAgICAgICAgX3RvdXJuYW1lbnRfc3RhdGVbInBoYXNlIl0gPSAiZXJyb3IiCiAgICAgICAgX3RvdXJuYW1lbnRfc3RhdGVbInJ1bm5pbmciXSA9IEZhbHNlCiAgICAgICAgX3RvdXJuYW1lbnRfc3RhdGVbImVycm9yIl0gPSBzdHIoZSkKICAgICAgICBfdG91cm5hbWVudF9zdGF0ZVsibWVzc2FnZSJdID0gZiJUb3VybmFtZW50IGZhaWxlZDoge2V9IgogICAgICAgIHRyYWNlYmFjay5wcmludF9leGMoKQoKCkBhcHAucG9zdCgiL2FwaS9tbC90b3VybmFtZW50IikKYXN5bmMgZGVmIG1sX3N0YXJ0X3RvdXJuYW1lbnQocmVxdWVzdDogRmFzdEFQSVJlcXVlc3QpOgogICAgIiIiU3RhcnQgYSB0b3VybmFtZW50IGV2YWx1YXRpb24uIiIiCiAgICBpZiBfdG91cm5hbWVudF9zdGF0ZVsicnVubmluZyJdOgogICAgICAgIHJhaXNlIEhUVFBFeGNlcHRpb24oNDA5LCAiVG91cm5hbWVudCBhbHJlYWR5IGluIHByb2dyZXNzIikKCiAgICBib2R5ID0gYXdhaXQgcmVxdWVzdC5qc29uKCkgaWYgYXdhaXQgcmVxdWVzdC5ib2R5KCkgZWxzZSB7fQogICAgZXBpc29kZXMgPSBib2R5LmdldCgiZXBpc29kZXMiLCA1MCkKICAgIHBsYXlzdHlsZSA9IGJvZHkuZ2V0KCJwbGF5c3R5bGUiLCAibWlkcmFuZ2UiKQoKICAgIF90b3VybmFtZW50X3N0YXRlLnVwZGF0ZSh7CiAgICAgICAgInJ1bm5pbmciOiBUcnVlLCAicGhhc2UiOiAic3RhcnRpbmciLAogICAgICAgICJtZXNzYWdlIjogIkluaXRpYWxpemluZyB0b3VybmFtZW50Li4uIiwKICAgICAgICAicmVzdWx0IjogTm9uZSwgImVycm9yIjogTm9uZSwKICAgIH0pCgogICAgdGhyZWFkID0gdGhyZWFkaW5nLlRocmVhZCgKICAgICAgICB0YXJnZXQ9X3J1bl90b3VybmFtZW50X3BpcGVsaW5lLAogICAgICAgIGFyZ3M9KGVwaXNvZGVzLCBwbGF5c3R5bGUpLAogICAgICAgIGRhZW1vbj1UcnVlLAogICAgKQogICAgdGhyZWFkLnN0YXJ0KCkKCiAgICByZXR1cm4geyJzdGF0dXMiOiAic3RhcnRlZCIsICJlcGlzb2RlcyI6IGVwaXNvZGVzfQoKCkBhcHAuZ2V0KCIvYXBpL21sL3RvdXJuYW1lbnQvc3RhdHVzIikKYXN5bmMgZGVmIG1sX3RvdXJuYW1lbnRfc3RhdHVzKCk6CiAgICAiIiJHZXQgdG91cm5hbWVudCBzdGF0dXMuIiIiCiAgICByZXR1cm4gZGljdChfdG91cm5hbWVudF9zdGF0ZSkKCgpAYXBwLmdldCgiL2FwaS9tbC90b3VybmFtZW50L3Jlc3VsdHMiKQphc3luYyBkZWYgbWxfdG91cm5hbWVudF9yZXN1bHRzKCk6CiAgICAiIiJHZXQgbGF0ZXN0IHRvdXJuYW1lbnQgcmVzdWx0cy4iIiIKICAgIHByb2plY3Rfcm9vdCA9IFBhdGgoX19maWxlX18pLnBhcmVudAogICAgcmVzdWx0c19wYXRoID0gcHJvamVjdF9yb290IC8gIm1sIiAvICJtb2RlbHMiIC8gImNoZWNrcG9pbnRzIiAvICJ0b3VybmFtZW50X3Jlc3VsdHMuanNvbiIKICAgIGlmIHJlc3VsdHNfcGF0aC5leGlzdHMoKToKICAgICAgICB3aXRoIG9wZW4ocmVzdWx0c19wYXRoLCAiciIpIGFzIGY6CiAgICAgICAgICAgIHJldHVybiBqc29uLmxvYWQoZikKICAgIHJldHVybiB7ImVycm9yIjogIk5vIHRvdXJuYW1lbnQgcmVzdWx0cyBmb3VuZC4gUnVuIGEgdG91cm5hbWVudCBmaXJzdC4ifQoKCiMg4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQCiMgU3RhdGljIEZpbGUgU2VydmluZyAoUmVhY3QgU1BBKSDigJQgTVVTVCBiZSBhZnRlciBhbGwgQVBJIHJvdXRlcwojIOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkAoKIyBVSSBTZXJ2aW5nOiBsZWdhY3kgSFRNTC9KUy9DU1MgcGFnZXMgKHByaW1hcnkpIG9yIFJlYWN0IFNQQSAoZmFsbGJhY2spCl9sZWdhY3lfdWlfZGlyID0gUGF0aChfX2ZpbGVfXykucGFyZW50IC8gInVpIgpfc3BhX2RpciA9IFBhdGgoX19maWxlX18pLnBhcmVudCAvICJmcm9udGVuZCIgLyAiY29tbWFuZGVyLWFpLWxhYi11aSIgLyAiZGlzdCIKCmlmIF9sZWdhY3lfdWlfZGlyLmV4aXN0cygpOgogICAgIyBQcmltYXJ5OiBzZXJ2ZSB0aGUgcHJvdmVuIG11bHRpLXBhZ2UgSFRNTC9KUy9DU1MgVUkKICAgIGFwcC5tb3VudCgiLyIsIFN0YXRpY0ZpbGVzKGRpcmVjdG9yeT1zdHIoX2xlZ2FjeV91aV9kaXIpLCBodG1sPVRydWUpLCBuYW1lPSJ1aSIpCgplbGlmIF9zcGFfZGlyLmV4aXN0cygpOgogICAgIyBGYWxsYmFjazogUmVhY3QgU1BBIChvbmx5IGlmIGxlZ2FjeSB1aS8gZm9sZGVyIGlzIG1pc3NpbmcpCiAgICBfc3BhX2Fzc2V0cyA9IF9zcGFfZGlyIC8gImFzc2V0cyIKICAgIGlmIF9zcGFfYXNzZXRzLmV4aXN0cygpOgogICAgICAgIGFwcC5tb3VudCgiL2Fzc2V0cyIsIFN0YXRpY0ZpbGVzKGRpcmVjdG9yeT1zdHIoX3NwYV9hc3NldHMpKSwgbmFtZT0ic3BhLWFzc2V0cyIpCgogICAgQGFwcC5nZXQoIi97ZnVsbF9wYXRoOnBhdGh9IikKICAgIGFzeW5jIGRlZiBfc3BhX2NhdGNoYWxsKGZ1bGxfcGF0aDogc3RyKToKICAgICAgICBmcm9tIGZhc3RhcGkucmVzcG9uc2VzIGltcG9ydCBGaWxlUmVzcG9uc2UKICAgICAgICByZXF1ZXN0ZWRfZmlsZSA9IF9zcGFfZGlyIC8gZnVsbF9wYXRoCiAgICAgICAgaWYgZnVsbF9wYXRoIGFuZCByZXF1ZXN0ZWRfZmlsZS5leGlzdHMoKSBhbmQgcmVxdWVzdGVkX2ZpbGUuaXNfZmlsZSgpOgogICAgICAgICAgICByZXR1cm4gRmlsZVJlc3BvbnNlKHN0cihyZXF1ZXN0ZWRfZmlsZSkpCiAgICAgICAgcmV0dXJuIEZpbGVSZXNwb25zZShzdHIoX3NwYV9kaXIgLyAiaW5kZXguaHRtbCIpKQoKCiMg4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQCiMgU3RhcnR1cAojIOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkAoKZGVmIHBhcnNlX2FyZ3MoKToKICAgIHBhcnNlciA9IGFyZ3BhcnNlLkFyZ3VtZW50UGFyc2VyKGRlc2NyaXB0aW9uPSJDb21tYW5kZXIgQUkgTGFiIEFQSSBTZXJ2ZXIgdjMiKQogICAgcGFyc2VyLmFkZF9hcmd1bWVudCgiLS1mb3JnZS1qYXIiLCBkZWZhdWx0PW9zLmVudmlyb24uZ2V0KCJGT1JHRV9KQVIiLCAiIiksCiAgICAgICAgICAgICAgICAgICAgICAgIGhlbHA9IlBhdGggdG8gZm9yZ2UtZ3VpLWRlc2t0b3AgamFyLXdpdGgtZGVwZW5kZW5jaWVzIikKICAgIHBhcnNlci5hZGRfYXJndW1lbnQoIi0tZm9yZ2UtZGlyIiwgZGVmYXVsdD1vcy5lbnZpcm9uLmdldCgiRk9SR0VfRElSIiwgIiIpLAogICAgICAgICAgICAgICAgICAgICAgICBoZWxwPSJGb3JnZSB3b3JraW5nIGRpcmVjdG9yeSAoY29udGFpbnMgcmVzLykiKQogICAgcGFyc2VyLmFkZF9hcmd1bWVudCgiLS1mb3JnZS1kZWNrcy1kaXIiLCBkZWZhdWx0PW9zLmVudmlyb24uZ2V0KCJGT1JHRV9ERUNLU19ESVIiLCAiIiksCiAgICAgICAgICAgICAgICAgICAgICAgIGhlbHA9IlBhdGggdG8gQ29tbWFuZGVyIGRlY2sgZmlsZXMgKGRlZmF1bHQ6ICUlQVBQREFUQSUlL0ZvcmdlL2RlY2tzL2NvbW1hbmRlcikiKQogICAgcGFyc2VyLmFkZF9hcmd1bWVudCgiLS1sYWItamFyIiwgZGVmYXVsdD1vcy5lbnZpcm9uLmdldCgiTEFCX0pBUiIsICIiKSwKICAgICAgICAgICAgICAgICAgICAgICAgaGVscD0iUGF0aCB0byBjb21tYW5kZXItYWktbGFiLmphciAoZGVmYXVsdDogYXV0by1kZXRlY3QgZnJvbSB0YXJnZXQvKSIpCiAgICBwYXJzZXIuYWRkX2FyZ3VtZW50KCItLXBvcnQiLCB0eXBlPWludCwgZGVmYXVsdD1pbnQob3MuZW52aXJvbi5nZXQoIkxBQl9QT1JUIiwgIjgwODAiKSkpCiAgICBwYXJzZXIuYWRkX2FyZ3VtZW50KCItLXhpbWlsYXIta2V5IiwgZGVmYXVsdD1vcy5lbnZpcm9uLmdldCgiWElNSUxBUl9BUElfS0VZIiwgIjk2YzdkYWIzNWRkYmQ4ODI5YjA0YzBmNWJjZWE1N2Y1ZWRlMjA0OTYiKSwKICAgICAgICAgICAgICAgICAgICAgICAgaGVscD0iWGltaWxhciBBUEkga2V5IGZvciBjYXJkIHNjYW5uZXIgKHZpc3VhbCBBSSByZWNvZ25pdGlvbikiKQogICAgcGFyc2VyLmFkZF9hcmd1bWVudCgiLS1wcGx4LWtleSIsIGRlZmF1bHQ9b3MuZW52aXJvbi5nZXQoIlBQTFhfQVBJX0tFWSIsICJwcGx4LUc3NkhnckFVOEltNzJiRVRNZXlSNGFzQVd3dEc4d3JteWZ5NlZTS0E5RFRuMDVGcSIpLAogICAgICAgICAgICAgICAgICAgICAgICBoZWxwPSJQZXJwbGV4aXR5IEFQSSBrZXkgZm9yIEFJIGRlY2sgcmVzZWFyY2gvZ2VuZXJhdGlvbiAoZW52OiBQUExYX0FQSV9LRVkpIikKICAgIHBhcnNlci5hZGRfYXJndW1lbnQoIi0tdmVyYm9zZSIsICItdiIsIGFjdGlvbj0ic3RvcmVfdHJ1ZSIsCiAgICAgICAgICAgICAgICAgICAgICAgIGhlbHA9IkVuYWJsZSBERUJVRy1sZXZlbCBsb2dnaW5nIChkZWZhdWx0OiBJTkZPKSIpCiAgICByZXR1cm4gcGFyc2VyLnBhcnNlX2FyZ3MoKQoKCmRlZiByZXNvbHZlX2xhYl9qYXIoKSAtPiBzdHI6CiAgICB0YXJnZXRfZGlyID0gUGF0aChfX2ZpbGVfXykucGFyZW50IC8gInRhcmdldCIKICAgIGlmIHRhcmdldF9kaXIuZXhpc3RzKCk6CiAgICAgICAgZm9yIHBhdHRlcm4gaW4gWwogICAgICAgICAgICAiY29tbWFuZGVyLWFpLWxhYi0qLWphci13aXRoLWRlcGVuZGVuY2llcy5qYXIiLAogICAgICAgICAgICAiY29tbWFuZGVyLWFpLWxhYi0qLXNoYWRlZC5qYXIiLAogICAgICAgICAgICAiY29tbWFuZGVyLWFpLWxhYi0qLmphciIsCiAgICAgICAgXToKICAgICAgICAgICAgamFycyA9IHNvcnRlZCh0YXJnZXRfZGlyLmdsb2IocGF0dGVybikpCiAgICAgICAgICAgIGphcnMgPSBbaiBmb3IgaiBpbiBqYXJzIGlmIG5vdCBqLm5hbWUuc3RhcnRzd2l0aCgib3JpZ2luYWwtIildCiAgICAgICAgICAgIGlmIGphcnM6CiAgICAgICAgICAgICAgICByZXR1cm4gc3RyKGphcnNbMF0pCiAgICByZXR1cm4gIiIKCgpkZWYgcmVzb2x2ZV9mb3JnZV9kZWNrc19kaXIoKSAtPiBzdHI6CiAgICBpZiBzeXMucGxhdGZvcm0gPT0gIndpbjMyIjoKICAgICAgICBhcHBkYXRhID0gb3MuZW52aXJvbi5nZXQoIkFQUERBVEEiLCAiIikKICAgICAgICBpZiBhcHBkYXRhOgogICAgICAgICAgICBjYW5kaWRhdGUgPSBvcy5wYXRoLmpvaW4oYXBwZGF0YSwgIkZvcmdlIiwgImRlY2tzIiwgImNvbW1hbmRlciIpCiAgICAgICAgICAgIGlmIG9zLnBhdGguaXNkaXIoY2FuZGlkYXRlKToKICAgICAgICAgICAgICAgIHJldHVybiBjYW5kaWRhdGUKICAgIGhvbWUgPSBQYXRoLmhvbWUoKQogICAgZm9yIGNhbmRpZGF0ZSBpbiBbCiAgICAgICAgaG9tZSAvICIuZm9yZ2UiIC8gImRlY2tzIiAvICJjb21tYW5kZXIiLAogICAgICAgIGhvbWUgLyAiRm9yZ2UiIC8gImRlY2tzIiAvICJjb21tYW5kZXIiLAogICAgXToKICAgICAgICBpZiBjYW5kaWRhdGUuaXNfZGlyKCk6CiAgICAgICAgICAgIHJldHVybiBzdHIoY2FuZGlkYXRlKQogICAgcmV0dXJuICIiCgoKZGVmIGxvYWRfY29tbWFuZGVyX21ldGEoKToKICAgICIiIkxvYWQgY29tbWFuZGVyIG1ldGEgbWFwcGluZyBmcm9tIGZpbGUgb3IgdXNlIGJ1aWx0aW5zLiIiIgogICAgZ2xvYmFsIENPTU1BTkRFUl9NRVRBCiAgICBtZXRhX3BhdGggPSBQYXRoKF9fZmlsZV9fKS5wYXJlbnQgLyAiY29tbWFuZGVyLW1ldGEuanNvbiIKICAgIGlmIG1ldGFfcGF0aC5leGlzdHMoKToKICAgICAgICB0cnk6CiAgICAgICAgICAgIHdpdGggb3BlbihtZXRhX3BhdGgsICJyIiwgZW5jb2Rpbmc9InV0Zi04IikgYXMgZjoKICAgICAgICAgICAgICAgIENPTU1BTkRFUl9NRVRBID0ganNvbi5sb2FkKGYpCiAgICAgICAgICAgIGxvZy5pbmZvKGYiICBNZXRhOiAgICAgICAgIExvYWRlZCB7bGVuKENPTU1BTkRFUl9NRVRBKX0gY29tbWFuZGVycyBmcm9tIHttZXRhX3BhdGh9IikKICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbiBhcyBlOgogICAgICAgICAgICBsb2cud2FybmluZyhmIiAgV0FSTklORzogRmFpbGVkIHRvIGxvYWQgY29tbWFuZGVyLW1ldGEuanNvbjoge2V9IikKCiAgICBDT01NQU5ERVJfTUVUQSA9IEJVSUxUSU5fQ09NTUFOREVSUwogICAgbG9nLmluZm8oZiIgIE1ldGE6ICAgICAgICAge2xlbihDT01NQU5ERVJfTUVUQSl9IGJ1aWx0LWluIGNvbW1hbmRlcnMiKQoKCmRlZiBtYWluKCk6CiAgICBhcmdzID0gcGFyc2VfYXJncygpCiAgICBzZXR1cF9sb2dnaW5nKGxvZ2dpbmcuREVCVUcgaWYgZ2V0YXR0cihhcmdzLCAndmVyYm9zZScsIEZhbHNlKSBlbHNlIGxvZ2dpbmcuSU5GTykKCiAgICBDRkcuZm9yZ2VfamFyID0gYXJncy5mb3JnZV9qYXIKICAgIENGRy5mb3JnZV9kaXIgPSBhcmdzLmZvcmdlX2RpcgogICAgQ0ZHLmZvcmdlX2RlY2tzX2RpciA9IGFyZ3MuZm9yZ2VfZGVja3NfZGlyIG9yIHJlc29sdmVfZm9yZ2VfZGVja3NfZGlyKCkKICAgIENGRy5sYWJfamFyID0gYXJncy5sYWJfamFyIG9yIHJlc29sdmVfbGFiX2phcigpCiAgICBDRkcucG9ydCA9IGFyZ3MucG9ydAogICAgQ0ZHLnhpbWlsYXJfYXBpX2tleSA9IGFyZ3MueGltaWxhcl9rZXkKICAgIENGRy5wcGx4X2FwaV9rZXkgPSBhcmdzLnBwbHhfa2V5CgogICAgbG9nLmluZm8oIuKVlOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVlyIpCiAgICBsb2cuaW5mbygi4pWRICAgICAgQ29tbWFuZGVyIEFJIExhYiDigJQgQVBJIFNlcnZlciAgdjMuMC4wICAgICAg4pWRIikKICAgIGxvZy5pbmZvKCLilZrilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZ0iKQogICAgbG9nLmluZm8oIiIpCiAgICBsb2cuaW5mbyhmIiAgRm9yZ2UgSkFSOiAgICB7Q0ZHLmZvcmdlX2phcn0iKQogICAgbG9nLmluZm8oZiIgIEZvcmdlIERpcjogICAge0NGRy5mb3JnZV9kaXJ9IikKICAgIGxvZy5pbmZvKGYiICBEZWNrcyBEaXI6ICAgIHtDRkcuZm9yZ2VfZGVja3NfZGlyfSIpCiAgICBsb2cuaW5mbyhmIiAgTGFiIEpBUjogICAgICB7Q0ZHLmxhYl9qYXJ9IikKICAgIGxvZy5pbmZvKGYiICBSZXN1bHRzIERpcjogIHtDRkcucmVzdWx0c19kaXJ9IikKICAgIGxvZy5pbmZvKGYiICBQb3J0OiAgICAgICAgIHtDRkcucG9ydH0iKQogICAgbG9nLmluZm8oZiIgIFhpbWlsYXI6ICAgICAgeydjb25maWd1cmVkJyBpZiBDRkcueGltaWxhcl9hcGlfa2V5IGVsc2UgJ05PVCBTRVQgKHNjYW5uZXIgd2lsbCBmYWlsKSd9IikKICAgIGxvZy5pbmZvKGYiICBQZXJwbGV4aXR5OiAgIHsnY29uZmlndXJlZCcgaWYgQ0ZHLnBwbHhfYXBpX2tleSBlbHNlICdOT1QgU0VUIChBSSByZXNlYXJjaC9nZW4gZGlzYWJsZWQpJ30iKQogICAgajE3ID0gZ2V0X2phdmExNygpCiAgICBsb2cuaW5mbyhmIiAgSmF2YSAxNzogICAgICB7ajE3IGlmIGoxNyAhPSAnamF2YScgZWxzZSAnTk9UIEZPVU5EIChiYXRjaCBzaW0gbWF5IGZhaWwgb24gSmF2YSAyNSspJ30iKQogICAgbG9nLmluZm8oZiIgIExNIFN0dWRpbzogICAgaHR0cDovLzE5Mi4xNjguMC4xMjI6MTIzNCIpCgogICAgbG9hZF9jb21tYW5kZXJfbWV0YSgpCiAgICBkb3dubG9hZF9wcmVjb25fZGF0YWJhc2UoKSAgIyBBdXRvLWRvd25sb2FkcyBhbGwgMTYzKyBDb21tYW5kZXIgcHJlY29ucyBvbiBmaXJzdCBydW4KICAgIGluaXRfY29sbGVjdGlvbl9kYigpCiAgICBpbml0X2NvYWNoX3NlcnZpY2UoKQoKICAgICMgWGltaWxhciBBUEkga2V5IGNoZWNrCiAgICBpZiBub3QgQ0ZHLnhpbWlsYXJfYXBpX2tleToKICAgICAgICBsb2dfc2Nhbi53YXJuaW5nKCIgIFdBUk5JTkc6IC0teGltaWxhci1rZXkgbm90IHNldC4gQ2FyZCBzY2FubmVyIHdpbGwgbm90IHdvcmsuIikKICAgICAgICBsb2cuaW5mbygiICAgICAgICAgICBTZXQgdmlhIENMSTogLS14aW1pbGFyLWtleSBZT1VSX0tFWSIpCiAgICAgICAgbG9nLmluZm8oIiAgICAgICAgICAgT3IgZW52IHZhcjogIFhJTUlMQVJfQVBJX0tFWT1ZT1VSX0tFWSIpCgogICAgaWYgbm90IENGRy5mb3JnZV9qYXI6CiAgICAgICAgbG9nLndhcm5pbmcoIldBUk5JTkc6IC0tZm9yZ2UtamFyIG5vdCBzZXQuIC9hcGkvbGFiL3N0YXJ0IHdpbGwgZmFpbC4iKQogICAgaWYgbm90IENGRy5sYWJfamFyOgogICAgICAgIGxvZy53YXJuaW5nKCJXQVJOSU5HOiBMYWIgSkFSIG5vdCBmb3VuZC4gQnVpbGQgd2l0aDogbXZuIHBhY2thZ2UgLURza2lwVGVzdHMiKQogICAgaWYgbm90IENGRy5mb3JnZV9kZWNrc19kaXI6CiAgICAgICAgbG9nLndhcm5pbmcoIldBUk5JTkc6IENvbW1hbmRlciBkZWNrcyBkaXIgbm90IGZvdW5kLiAvYXBpL2xhYi9kZWNrcyB3aWxsIHJldHVybiBlbXB0eS4iKQoKICAgIGxvZy5pbmZvKCIiKQogICAgbG9nLmluZm8oZiIgIFN0YXJ0aW5nIHNlcnZlciBvbiBodHRwOi8vbG9jYWxob3N0OntDRkcucG9ydH0iKQogICAgaWYgX3NwYV9kaXIuZXhpc3RzKCk6CiAgICAgICAgbG9nLmluZm8oZiIgIFdlYiBVSTogICAgICAgaHR0cDovL2xvY2FsaG9zdDp7Q0ZHLnBvcnR9LyAgKFJlYWN0IFNQQSkiKQogICAgICAgIGxvZy5pbmZvKGYiICBSb3V0ZXM6ICAgICAgIC8gKEJhdGNoIFNpbSksIC9jb2xsZWN0aW9uLCAvZGVja3MsIC9hdXRvZ2VuLCAvc2ltdWxhdG9yLCAvY29hY2gsIC90cmFpbmluZyIpCiAgICBlbHNlOgogICAgICAgIGxvZy5pbmZvKGYiICBXZWIgVUk6ICAgICAgIGh0dHA6Ly9sb2NhbGhvc3Q6e0NGRy5wb3J0fS9pbmRleC5odG1sICAobGVnYWN5IEhUTUwpIikKICAgICAgICBsb2cuaW5mbyhmIiAgTk9URTogUmVhY3QgU1BBIG5vdCBidWlsdC4gUnVuOiBjZCBmcm9udGVuZC9jb21tYW5kZXItYWktbGFiLXVpICYmIG5wbSBpbnN0YWxsICYmIG5wbSBydW4gYnVpbGQiKQogICAgbG9nLmluZm8oZiIgIEFQSSBkb2NzOiAgICAgaHR0cDovL2xvY2FsaG9zdDp7Q0ZHLnBvcnR9L2RvY3MiKQogICAgbG9nLmluZm8oIiIpCgogICAgaW1wb3J0IHV2aWNvcm4KICAgIHV2aWNvcm4ucnVuKGFwcCwgaG9zdD0iMC4wLjAuMCIsIHBvcnQ9Q0ZHLnBvcnQsIGxvZ19sZXZlbD0iaW5mbyIpCgoKaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKICAgIG1haW4oKQo= \ No newline at end of file