From 118c993e311c66dbad29f767f8031601caf7e14b Mon Sep 17 00:00:00 2001 From: git_admin Date: Mon, 27 Apr 2026 06:53:31 +0000 Subject: [PATCH] Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) --- addons/cetmix_tower_server/ssh/ssh.py | 1 + 1 file changed, 1 insertion(+) create mode 100644 addons/cetmix_tower_server/ssh/ssh.py diff --git a/addons/cetmix_tower_server/ssh/ssh.py b/addons/cetmix_tower_server/ssh/ssh.py new file mode 100644 index 0000000..7203240 --- /dev/null +++ b/addons/cetmix_tower_server/ssh/ssh.py @@ -0,0 +1 @@ +IyBydWZmOiBub3FhOiBVUDAwNwoKaW1wb3J0IGlvCmltcG9ydCBsb2dnaW5nCmltcG9ydCB0aW1lCmZyb20gdHlwaW5nIGltcG9ydCBPcHRpb25hbCwgVW5pb24KCl9sb2dnZXIgPSBsb2dnaW5nLmdldExvZ2dlcihfX25hbWVfXykKCgp0cnk6CiAgICBmcm9tIHBhcmFtaWtvIGltcG9ydCAoCiAgICAgICAgQXV0b0FkZFBvbGljeSwKICAgICAgICBEU1NLZXksCiAgICAgICAgRUNEU0FLZXksCiAgICAgICAgRWQyNTUxOUtleSwKICAgICAgICBNaXNzaW5nSG9zdEtleVBvbGljeSwKICAgICAgICBSU0FLZXksCiAgICAgICAgU0ZUUENsaWVudCwKICAgICAgICBTU0hDbGllbnQsCiAgICAgICAgU1NIRXhjZXB0aW9uLAogICAgKQpleGNlcHQgSW1wb3J0RXJyb3I6CiAgICBfbG9nZ2VyLmVycm9yKAogICAgICAgICJMb29rcyBsaWtlICdwYXJhbWlrbycgaXMgbm90IGluc3RhbGxlZCwgcGxlYXNlIHRyeSB0byAiCiAgICAgICAgImluc3RhbGwgaXQgdXNpbmcgJ3BpcCBpbnN0YWxsIHBhcmFtaWtvJyIKICAgICkKICAgIEF1dG9BZGRQb2xpY3kgPSBNaXNzaW5nSG9zdEtleVBvbGljeSA9IFJTQUtleSA9IFNTSENsaWVudCA9IE5vbmUKCgpjbGFzcyBLZXlMb2FkZXI6CiAgICAiIiIKICAgIFV0aWxpdHkgZm9yIGxvYWRpbmcgcHJpdmF0ZSBTU0gga2V5IGluIHN1cHBvcnRlZCBmb3JtYXRzLgogICAgIiIiCgogICAgQHN0YXRpY21ldGhvZAogICAgZGVmIGxvYWRfcHJpdmF0ZV9rZXkoc3NoX2tleTogc3RyKSAtPiBVbmlvbltSU0FLZXksIERTU0tleSwgRUNEU0FLZXksIEVkMjU1MTlLZXldOgogICAgICAgICIiIgogICAgICAgIExvYWQgYSBwcml2YXRlIFNTSCBrZXkgZnJvbSBhIHN0cmluZy4KICAgICAgICAiIiIKICAgICAgICBrZXlfZmlsZSA9IGlvLlN0cmluZ0lPKHNzaF9rZXkpCiAgICAgICAgZm9yIGtleV9jbGFzcyBpbiAoUlNBS2V5LCBEU1NLZXksIEVDRFNBS2V5LCBFZDI1NTE5S2V5KToKICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAga2V5X2ZpbGUuc2VlaygwKQogICAgICAgICAgICAgICAgcmV0dXJuIGtleV9jbGFzcy5mcm9tX3ByaXZhdGVfa2V5KGtleV9maWxlKQogICAgICAgICAgICBleGNlcHQgU1NIRXhjZXB0aW9uOgogICAgICAgICAgICAgICAgX2xvZ2dlci53YXJuaW5nKAogICAgICAgICAgICAgICAgICAgIGYiS2V5TG9hZGVyOiBmYWlsZWQgdG8gbG9hZCBrZXkgdGhyb3VnaCB7a2V5X2NsYXNzLl9fbmFtZV9ffS4iCiAgICAgICAgICAgICAgICApCiAgICAgICAgX2xvZ2dlci5lcnJvcigKICAgICAgICAgICAgIktleUxvYWRlcjogdW5hYmxlIHRvIGxvYWQgcHJpdmF0ZSBrZXkuICIKICAgICAgICAgICAgIlVuc3VwcG9ydGVkIGZvcm1hdCBvciBpbnZhbGlkIFNTSCBrZXkuIgogICAgICAgICkKICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJVbnN1cHBvcnRlZCBmb3JtYXQgb3IgaW52YWxpZCBTU0gga2V5LiIpCgoKY2xhc3MgU1NIQ29ubmVjdGlvbjoKICAgICIiIgogICAgQ2xhc3MgZm9yIG1hbmFnaW5nIFNTSCBjb25uZWN0aW9uLgogICAgIiIiCgogICAgZGVmIF9faW5pdF9fKAogICAgICAgIHNlbGYsCiAgICAgICAgaG9zdDogc3RyLAogICAgICAgIHBvcnQ6IGludCwKICAgICAgICB1c2VybmFtZTogc3RyLAogICAgICAgIHBhc3N3b3JkOiBPcHRpb25hbFtzdHJdID0gTm9uZSwKICAgICAgICBzc2hfa2V5OiBPcHRpb25hbFtzdHJdID0gTm9uZSwKICAgICAgICBob3N0X2tleTogT3B0aW9uYWxbc3RyXSA9IE5vbmUsCiAgICAgICAgbW9kZTogc3RyID0gInAiLCAgIyAicCIgZm9yIHBhc3N3b3JkLCAiayIgZm9yIGtleQogICAgICAgIGFsbG93X2FnZW50OiBib29sID0gRmFsc2UsCiAgICAgICAgdGltZW91dDogaW50ID0gNTAwMCwKICAgICk6CiAgICAgICAgIiIiCiAgICAgICAgSW5pdGlhbGl6ZSB0aGUgU1NIQ29ubmVjdGlvbiBpbnN0YW5jZS4KICAgICAgICAiIiIKICAgICAgICBzZWxmLmhvc3QgPSBob3N0CiAgICAgICAgc2VsZi5wb3J0ID0gcG9ydAogICAgICAgIHNlbGYudXNlcm5hbWUgPSB1c2VybmFtZQogICAgICAgIHNlbGYucGFzc3dvcmQgPSBwYXNzd29yZAogICAgICAgIHNlbGYuc3NoX2tleSA9IHNzaF9rZXkKICAgICAgICBzZWxmLmhvc3Rfa2V5ID0gaG9zdF9rZXkKICAgICAgICBzZWxmLm1vZGUgPSBtb2RlCiAgICAgICAgc2VsZi5hbGxvd19hZ2VudCA9IGFsbG93X2FnZW50CiAgICAgICAgc2VsZi50aW1lb3V0ID0gdGltZW91dAogICAgICAgIHNlbGYuX3NzaF9jbGllbnQ6IE9wdGlvbmFsW1NTSENsaWVudF0gPSBOb25lCgogICAgZGVmIGNvbm5lY3Qoc2VsZikgLT4gU1NIQ2xpZW50OgogICAgICAgICIiIgogICAgICAgIENvbm5lY3QgdG8gdGhlIFNTSCBzZXJ2ZXIuCiAgICAgICAgIiIiCiAgICAgICAgaWYgc2VsZi5fc3NoX2NsaWVudCBpcyBub3QgTm9uZToKICAgICAgICAgICAgcmV0dXJuIHNlbGYuX3NzaF9jbGllbnQKCiAgICAgICAgc2VsZi5fc3NoX2NsaWVudCA9IFNTSENsaWVudCgpCiAgICAgICAgc2VsZi5fc3NoX2NsaWVudC5sb2FkX3N5c3RlbV9ob3N0X2tleXMoKQoKICAgICAgICBpZiBzZWxmLmhvc3Rfa2V5OgogICAgICAgICAgICBzZWxmLl9zc2hfY2xpZW50LnNldF9taXNzaW5nX2hvc3Rfa2V5X3BvbGljeSgKICAgICAgICAgICAgICAgIEN1c3RvbUhvc3RLZXlQb2xpY3koc2VsZi5ob3N0X2tleSkKICAgICAgICAgICAgKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHNlbGYuX3NzaF9jbGllbnQuc2V0X21pc3NpbmdfaG9zdF9rZXlfcG9saWN5KEF1dG9BZGRQb2xpY3koKSkKCiAgICAgICAgY29ubmVjdF9wYXJhbXMgPSB7CiAgICAgICAgICAgICJob3N0bmFtZSI6IHNlbGYuaG9zdCwKICAgICAgICAgICAgInBvcnQiOiBzZWxmLnBvcnQsCiAgICAgICAgICAgICJ1c2VybmFtZSI6IHNlbGYudXNlcm5hbWUsCiAgICAgICAgICAgICJhbGxvd19hZ2VudCI6IHNlbGYuYWxsb3dfYWdlbnQsCiAgICAgICAgICAgICJ0aW1lb3V0Ijogc2VsZi50aW1lb3V0LAogICAgICAgIH0KCiAgICAgICAgaWYgc2VsZi5tb2RlID09ICJwIjoKICAgICAgICAgICAgaWYgbm90IHNlbGYucGFzc3dvcmQ6CiAgICAgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJGb3IgcGFzc3dvcmQgbW9kZSwgeW91IG5lZWQgdG8gcGFzcyBhIHBhc3N3b3JkLiIpCiAgICAgICAgICAgIGNvbm5lY3RfcGFyYW1zWyJwYXNzd29yZCJdID0gc2VsZi5wYXNzd29yZAogICAgICAgIGVsaWYgc2VsZi5tb2RlID09ICJrIjoKICAgICAgICAgICAgaWYgbm90IHNlbGYuc3NoX2tleToKICAgICAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoIkZvciBrZXkgbW9kZSwgeW91IG5lZWQgdG8gcGFzcyBhbiBTU0gga2V5LiIpCiAgICAgICAgICAgIGNvbm5lY3RfcGFyYW1zWyJwa2V5Il0gPSBLZXlMb2FkZXIubG9hZF9wcml2YXRlX2tleShzZWxmLnNzaF9rZXkpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcihmIlVuc3VwcG9ydGVkIGNvbm5lY3Rpb24gbW9kZToge3NlbGYubW9kZX0iKQoKICAgICAgICBzZWxmLl9zc2hfY2xpZW50LmNvbm5lY3QoKipjb25uZWN0X3BhcmFtcykKICAgICAgICByZXR1cm4gc2VsZi5fc3NoX2NsaWVudAoKICAgIGRlZiBkaXNjb25uZWN0KHNlbGYpIC0+IE5vbmU6CiAgICAgICAgIiIiCiAgICAgICAgRGlzY29ubmVjdCB0aGUgU1NIIGNvbm5lY3Rpb24uCiAgICAgICAgIiIiCiAgICAgICAgaWYgc2VsZi5fc3NoX2NsaWVudDoKICAgICAgICAgICAgX2xvZ2dlci5pbmZvKCJTU0hDb25uZWN0aW9uOiBjbG9zaW5nIFNTSCBjb25uZWN0aW9uLiIpCiAgICAgICAgICAgIHNlbGYuX3NzaF9jbGllbnQuY2xvc2UoKQogICAgICAgICAgICBzZWxmLl9zc2hfY2xpZW50ID0gTm9uZQoKICAgIGRlZiBnZXRfdHJhbnNwb3J0KHNlbGYpOgogICAgICAgICIiIgogICAgICAgIEdldCB0aGUgU1NIIHRyYW5zcG9ydC4KICAgICAgICAiIiIKICAgICAgICBpZiBzZWxmLl9zc2hfY2xpZW50IGlzIE5vbmU6CiAgICAgICAgICAgIHNlbGYuY29ubmVjdCgpCiAgICAgICAgcmV0dXJuIHNlbGYuX3NzaF9jbGllbnQuZ2V0X3RyYW5zcG9ydCgpCgoKY2xhc3MgQ3VzdG9tSG9zdEtleVBvbGljeShNaXNzaW5nSG9zdEtleVBvbGljeSk6CiAgICAiIiIKICAgIEN1c3RvbSBTU0ggaG9zdCBrZXkgcG9saWN5IGZvciB2YWxpZGF0aW5nIHRoZSBzZXJ2ZXIncyBob3N0IGtleS4KCiAgICBUaGlzIHBvbGljeSBjb21wYXJlcyB0aGUgc2VydmVyJ3MgaG9zdCBrZXkgKGluIEJhc2U2NCBmb3JtYXQpIHdpdGggdGhlIGV4cGVjdGVkIGtleS4KICAgIElmIHRoZXkgZG8gbm90IG1hdGNoLCBhbiBTU0hFeGNlcHRpb24gaXMgcmFpc2VkIHRvIHByZXZlbnQgY29ubmVjdGluZwogICAgdG8gYW4gdW50cnVzdGVkIHNlcnZlci4gSWYgdGhleSBtYXRjaCwgdGhlIGtleSBpcyBhZGRlZCB0byB0aGUgY2xpZW50J3MgaG9zdCBrZXlzLgogICAgIiIiCgogICAgZGVmIF9faW5pdF9fKHNlbGYsIGV4cGVjdGVkX2hvc3Rfa2V5OiBzdHIpOgogICAgICAgICIiIgogICAgICAgIEluaXRpYWxpemUgdGhlIHBvbGljeSB3aXRoIHRoZSBleHBlY3RlZCBob3N0IGtleS4KCiAgICAgICAgQXJnczoKICAgICAgICAgICAgZXhwZWN0ZWRfaG9zdF9rZXkgKHN0cik6IFRoZSBleHBlY3RlZCBob3N0IGtleSBpbiBCYXNlNjQgZm9ybWF0LgogICAgICAgICIiIgogICAgICAgIHNlbGYuZXhwZWN0ZWRfaG9zdF9rZXkgPSBleHBlY3RlZF9ob3N0X2tleQoKICAgIGRlZiBtaXNzaW5nX2hvc3Rfa2V5KHNlbGYsIGNsaWVudCwgaG9zdG5hbWUsIGtleSk6CiAgICAgICAgIiIiCiAgICAgICAgQ2FsbGVkIHdoZW4gdGhlIFNTSCBjbGllbnQgcmVjZWl2ZXMgYSBob3N0IGtleSBmcm9tIHRoZSBzZXJ2ZXIKICAgICAgICB0aGF0IGlzIG5vdCBpbiBpdHMga25vd24gaG9zdHMuCgogICAgICAgIEFyZ3M6CiAgICAgICAgICAgIGNsaWVudDogVGhlIFNTSCBjbGllbnQgaW5zdGFuY2UuCiAgICAgICAgICAgIGhvc3RuYW1lOiBUaGUgaG9zdG5hbWUgb2YgdGhlIHNlcnZlci4KICAgICAgICAgICAga2V5OiBUaGUgaG9zdCBrZXkgcmVjZWl2ZWQgZnJvbSB0aGUgc2VydmVyLgoKICAgICAgICBSYWlzZXM6CiAgICAgICAgICAgIFNTSEV4Y2VwdGlvbjogSWYgdGhlIHJlY2VpdmVkIGhvc3Qga2V5IGRvZXMgbm90IG1hdGNoIHRoZSBleHBlY3RlZCBob3N0IGtleS4KICAgICAgICAiIiIKICAgICAgICByZWNlaXZlZF9rZXkgPSBrZXkuZ2V0X2Jhc2U2NCgpCiAgICAgICAgaWYgcmVjZWl2ZWRfa2V5ICE9IHNlbGYuZXhwZWN0ZWRfaG9zdF9rZXk6CiAgICAgICAgICAgIHJhaXNlIFNTSEV4Y2VwdGlvbihmIkhvc3Qga2V5IG1pc21hdGNoIGZvciB7aG9zdG5hbWV9LiAiKQogICAgICAgICMgSWYgdGhlIGtleSBtYXRjaGVzLCBhZGQgaXQgdG8gdGhlIGNsaWVudCdzIGtub3duIGhvc3RzCiAgICAgICAgY2xpZW50Ll9ob3N0X2tleXMuYWRkKGhvc3RuYW1lLCBrZXkuZ2V0X25hbWUoKSwga2V5KQoKCmNsYXNzIFNmdHBTZXJ2aWNlOgogICAgIiIiCiAgICBTZXJ2aWNlIGZvciB3b3JraW5nIHdpdGggU0ZUUCwgdXNpbmcgU1NIIGNvbm5lY3Rpb24uCiAgICAiIiIKCiAgICBkZWYgX19pbml0X18oc2VsZiwgY29ubmVjdGlvbjogU1NIQ29ubmVjdGlvbik6CiAgICAgICAgIiIiCiAgICAgICAgSW5pdGlhbGl6ZSB0aGUgU2Z0cFNlcnZpY2UgaW5zdGFuY2UuCiAgICAgICAgIiIiCiAgICAgICAgc2VsZi5jb25uZWN0aW9uID0gY29ubmVjdGlvbgogICAgICAgIHNlbGYuX3NmdHBfY2xpZW50OiBPcHRpb25hbFtTRlRQQ2xpZW50XSA9IE5vbmUKCiAgICBkZWYgZ2V0X2NsaWVudChzZWxmKSAtPiBTRlRQQ2xpZW50OgogICAgICAgICIiIgogICAgICAgIEdldCB0aGUgU0ZUUCBjbGllbnQuCiAgICAgICAgIiIiCiAgICAgICAgaWYgc2VsZi5fc2Z0cF9jbGllbnQgaXMgTm9uZToKICAgICAgICAgICAgdHJhbnNwb3J0ID0gc2VsZi5jb25uZWN0aW9uLmdldF90cmFuc3BvcnQoKQogICAgICAgICAgICBzZWxmLl9zZnRwX2NsaWVudCA9IFNGVFBDbGllbnQuZnJvbV90cmFuc3BvcnQodHJhbnNwb3J0KQogICAgICAgIHJldHVybiBzZWxmLl9zZnRwX2NsaWVudAoKICAgIGRlZiB1cGxvYWRfZmlsZShzZWxmLCBmaWxlOiBVbmlvbltzdHIsIGlvLkJ5dGVzSU9dLCByZW1vdGVfcGF0aDogc3RyKSAtPiBOb25lOgogICAgICAgICIiIgogICAgICAgIFVwbG9hZCBhIGZpbGUgdG8gdGhlIHJlbW90ZSBzZXJ2ZXIuCiAgICAgICAgIiIiCiAgICAgICAgY2xpZW50ID0gc2VsZi5nZXRfY2xpZW50KCkKICAgICAgICBpZiBpc2luc3RhbmNlKGZpbGUsIGlvLkJ5dGVzSU8pOgogICAgICAgICAgICBjbGllbnQucHV0Zm8oZmlsZSwgcmVtb3RlX3BhdGgpCiAgICAgICAgZWxpZiBpc2luc3RhbmNlKGZpbGUsIHN0cik6CiAgICAgICAgICAgIGNsaWVudC5wdXQoZmlsZSwgcmVtb3RlX3BhdGgpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgcmFpc2UgVHlwZUVycm9yKGYiRmlsZSB0eXBlIHt0eXBlKGZpbGUpLl9fbmFtZV9ffSBpcyBub3Qgc3VwcG9ydGVkLiIpCgogICAgZGVmIGRvd25sb2FkX2ZpbGUoc2VsZiwgcmVtb3RlX3BhdGg6IHN0cikgLT4gYnl0ZXM6CiAgICAgICAgIiIiCiAgICAgICAgRG93bmxvYWQgYSBmaWxlIGZyb20gdGhlIHJlbW90ZSBzZXJ2ZXIuCiAgICAgICAgIiIiCiAgICAgICAgY2xpZW50ID0gc2VsZi5nZXRfY2xpZW50KCkKICAgICAgICB3aXRoIGNsaWVudC5vcGVuKHJlbW90ZV9wYXRoLCAicmIiKSBhcyByZW1vdGVfZmlsZToKICAgICAgICAgICAgcmV0dXJuIHJlbW90ZV9maWxlLnJlYWQoKQoKICAgIGRlZiBkZWxldGVfZmlsZShzZWxmLCByZW1vdGVfcGF0aDogc3RyKSAtPiBOb25lOgogICAgICAgICIiIgogICAgICAgIERlbGV0ZSBhIGZpbGUgZnJvbSB0aGUgcmVtb3RlIHNlcnZlci4KICAgICAgICAiIiIKICAgICAgICBjbGllbnQgPSBzZWxmLmdldF9jbGllbnQoKQogICAgICAgIGNsaWVudC5yZW1vdmUocmVtb3RlX3BhdGgpCgogICAgZGVmIGRpc2Nvbm5lY3Qoc2VsZikgLT4gTm9uZToKICAgICAgICAiIiIKICAgICAgICBEaXNjb25uZWN0IHRoZSBTRlRQIGNsaWVudC4KICAgICAgICAiIiIKICAgICAgICBpZiBzZWxmLl9zZnRwX2NsaWVudDoKICAgICAgICAgICAgX2xvZ2dlci5pbmZvKCJTZnRwU2VydmljZTogY2xvc2luZyBTRlRQIGNvbm5lY3Rpb24uIikKICAgICAgICAgICAgc2VsZi5fc2Z0cF9jbGllbnQuY2xvc2UoKQogICAgICAgICAgICBzZWxmLl9zZnRwX2NsaWVudCA9IE5vbmUKCgpjbGFzcyBDb21tYW5kRXhlY3V0b3I6CiAgICAiIiIKICAgIENsYXNzIGZvciBleGVjdXRpbmcgY29tbWFuZHMgb24gYSByZW1vdGUgc2VydmVyLgogICAgIiIiCgogICAgZGVmIF9faW5pdF9fKHNlbGYsIGNvbm5lY3Rpb246IFNTSENvbm5lY3Rpb24pOgogICAgICAgICIiIgogICAgICAgIEluaXRpYWxpemUgdGhlIENvbW1hbmRFeGVjdXRvciBpbnN0YW5jZS4KICAgICAgICAiIiIKICAgICAgICBzZWxmLmNvbm5lY3Rpb24gPSBjb25uZWN0aW9uCgogICAgZGVmIGV4ZWNfY29tbWFuZCgKICAgICAgICBzZWxmLCBjb21tYW5kOiBzdHIsIHN1ZG86IE9wdGlvbmFsW3N0cl0gPSBOb25lCiAgICApIC0+IHR1cGxlW2ludCwgbGlzdFtzdHJdLCBsaXN0W3N0cl1dOgogICAgICAgICIiIgogICAgICAgIFJ1biBhIGNvbW1hbmQgb24gdGhlIHJlbW90ZSBzZXJ2ZXIuCgogICAgICAgIEFyZ3M6CiAgICAgICAgICAgIGNvbW1hbmQgKHN0cik6IFRoZSBjb21tYW5kIHRvIGV4ZWN1dGUuCiAgICAgICAgICAgIHN1ZG8gKE9wdGlvbmFsW3N0cl0pOiBTdWRvIG1vZGUuCgogICAgICAgIFJldHVybnM6CiAgICAgICAgICAgIHR1cGxlOgogICAgICAgICAgICAgICAgLSBleGl0X3N0YXR1cyAoaW50KQogICAgICAgICAgICAgICAgLSBzdGRvdXQgKGxpc3Rbc3RyXSkKICAgICAgICAgICAgICAgIC0gc3RkZXJyIChsaXN0W3N0cl0pCiAgICAgICAgIiIiCiAgICAgICAgc3NoX2NsaWVudCA9IHNlbGYuY29ubmVjdGlvbi5jb25uZWN0KCkKICAgICAgICB1c2Vfc3Vkb193aXRoX3Bhc3N3b3JkID0gc3VkbyA9PSAicCIgYW5kIHNlbGYuY29ubmVjdGlvbi51c2VybmFtZSAhPSAicm9vdCIKCiAgICAgICAgaWYgdXNlX3N1ZG9fd2l0aF9wYXNzd29yZCBhbmQgbm90IHNlbGYuY29ubmVjdGlvbi5wYXNzd29yZDoKICAgICAgICAgICAgcmV0dXJuIDI1NSwgW10sIFsiU3VkbyBwYXNzd29yZCBub3QgcHJvdmlkZWQhIl0KCiAgICAgICAgdHJ5OgogICAgICAgICAgICBzdGRpbiwgc3Rkb3V0LCBzdGRlcnIgPSBzc2hfY2xpZW50LmV4ZWNfY29tbWFuZChjb21tYW5kKQogICAgICAgICAgICBpZiB1c2Vfc3Vkb193aXRoX3Bhc3N3b3JkOgogICAgICAgICAgICAgICAgc3RkaW4ud3JpdGUoc2VsZi5jb25uZWN0aW9uLnBhc3N3b3JkICsgIlxuIikKICAgICAgICAgICAgICAgIHN0ZGluLmZsdXNoKCkKICAgICAgICAgICAgZXhpdF9zdGF0dXMgPSBzdGRvdXQuY2hhbm5lbC5yZWN2X2V4aXRfc3RhdHVzKCkKICAgICAgICAgICAgcmVzcG9uc2UgPSBzdGRvdXQucmVhZGxpbmVzKCkKICAgICAgICAgICAgZXJyb3IgPSBzdGRlcnIucmVhZGxpbmVzKCkKICAgICAgICAgICAgcmV0dXJuIGV4aXRfc3RhdHVzLCByZXNwb25zZSwgZXJyb3IKICAgICAgICBleGNlcHQgRXhjZXB0aW9uIGFzIGU6CiAgICAgICAgICAgIHJldHVybiAyNTUsIFtdLCBbc3RyKGUpXQoKCmNsYXNzIFNTSE1hbmFnZXI6CiAgICAiIiIKICAgIEZhY2FkZSBmb3Igd29ya2luZyB3aXRoIFNTSCBjb25uZWN0aW9uLCBTRlRQIGFuZCBjb21tYW5kIGV4ZWN1dGlvbi4KICAgICIiIgoKICAgIF9jb25uZWN0aW9uX2NhY2hlID0ge30KCiAgICBkZWYgX19uZXdfXyhjbHMsIGNvbm5lY3Rpb246IFNTSENvbm5lY3Rpb24pOgogICAgICAgICIiIgogICAgICAgIENyZWF0ZSBhIG5ldyBTU0hNYW5hZ2VyIGluc3RhbmNlLgogICAgICAgICIiIgogICAgICAgIGtleSA9ICgKICAgICAgICAgICAgY29ubmVjdGlvbi5ob3N0LAogICAgICAgICAgICBjb25uZWN0aW9uLnBvcnQsCiAgICAgICAgICAgIGNvbm5lY3Rpb24udXNlcm5hbWUsCiAgICAgICAgICAgIGNvbm5lY3Rpb24ubW9kZSwKICAgICAgICAgICAgY29ubmVjdGlvbi5hbGxvd19hZ2VudCwKICAgICAgICAgICAgY29ubmVjdGlvbi5wYXNzd29yZCBvciAiIiwKICAgICAgICAgICAgY29ubmVjdGlvbi5zc2hfa2V5IG9yICIiLAogICAgICAgICAgICBjb25uZWN0aW9uLmhvc3Rfa2V5IG9yICIiLAogICAgICAgICkKICAgICAgICBpZiBrZXkgaW4gY2xzLl9jb25uZWN0aW9uX2NhY2hlOgogICAgICAgICAgICBpbnN0YW5jZSwgY3JlYXRlZF9hdCwgY2FjaGVkX3RpbWVvdXQgPSBjbHMuX2Nvbm5lY3Rpb25fY2FjaGVba2V5XQogICAgICAgICAgICAjIGlmIHRpbWVvdXQgaXMgY2hhbmdlZCwgdXBkYXRlIHRoZSBjYWNoZWQgdGltZW91dAogICAgICAgICAgICBpZiBjb25uZWN0aW9uLnRpbWVvdXQgIT0gY2FjaGVkX3RpbWVvdXQ6CiAgICAgICAgICAgICAgICBjbHMuZGVsZXRlX2NhY2hlKGtleSkKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIF9sb2dnZXIuaW5mbygKICAgICAgICAgICAgICAgICAgICAiVXNpbmcgY2FjaGVkIFNTSCBjb25uZWN0aW9uIGZvciAiCiAgICAgICAgICAgICAgICAgICAgImhvc3Q9JXMsIHBvcnQ9JXMsIHVzZXI9JXMsIG1vZGU9JXMiLAogICAgICAgICAgICAgICAgICAgIGNvbm5lY3Rpb24uaG9zdCwKICAgICAgICAgICAgICAgICAgICBjb25uZWN0aW9uLnBvcnQsCiAgICAgICAgICAgICAgICAgICAgY29ubmVjdGlvbi51c2VybmFtZSwKICAgICAgICAgICAgICAgICAgICBjb25uZWN0aW9uLm1vZGUsCiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICByZXR1cm4gaW5zdGFuY2UKCiAgICAgICAgX2xvZ2dlci5pbmZvKAogICAgICAgICAgICAiQ3JlYXRpbmcgbmV3IFNTSCBjb25uZWN0aW9uIGZvciBob3N0PSVzLCBwb3J0PSVzLCB1c2VyPSVzLCBtb2RlPSVzIiwKICAgICAgICAgICAgY29ubmVjdGlvbi5ob3N0LAogICAgICAgICAgICBjb25uZWN0aW9uLnBvcnQsCiAgICAgICAgICAgIGNvbm5lY3Rpb24udXNlcm5hbWUsCiAgICAgICAgICAgIGNvbm5lY3Rpb24ubW9kZSwKICAgICAgICApCiAgICAgICAgaW5zdGFuY2UgPSBzdXBlcigpLl9fbmV3X18oY2xzKQogICAgICAgIGNscy5fY29ubmVjdGlvbl9jYWNoZVtrZXldID0gKGluc3RhbmNlLCB0aW1lLnRpbWUoKSwgY29ubmVjdGlvbi50aW1lb3V0KQogICAgICAgIHJldHVybiBpbnN0YW5jZQoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBjb25uZWN0aW9uOiBTU0hDb25uZWN0aW9uKToKICAgICAgICAiIiIKICAgICAgICBJbml0aWFsaXplIHRoZSBTU0hNYW5hZ2VyIGluc3RhbmNlLgogICAgICAgICIiIgogICAgICAgICMgaW5pdGlhbGl6ZSBvbmx5IG9uY2UKICAgICAgICBpZiBoYXNhdHRyKHNlbGYsICJfaW5pdGlhbGl6ZWQiKSBhbmQgc2VsZi5faW5pdGlhbGl6ZWQ6CiAgICAgICAgICAgIHJldHVybgogICAgICAgIHNlbGYuY29ubmVjdGlvbiA9IGNvbm5lY3Rpb24KICAgICAgICBzZWxmLmNvbW1hbmRfZXhlY3V0b3IgPSBDb21tYW5kRXhlY3V0b3IoY29ubmVjdGlvbikKICAgICAgICBzZWxmLnNmdHBfc2VydmljZSA9IFNmdHBTZXJ2aWNlKGNvbm5lY3Rpb24pCiAgICAgICAgc2VsZi5faW5pdGlhbGl6ZWQgPSBUcnVlCgogICAgQGNsYXNzbWV0aG9kCiAgICBkZWYgZGVsZXRlX2NhY2hlKGNscywga2V5KToKICAgICAgICAiIiIKICAgICAgICBEZWxldGUgdGhlIGNhY2hlIG9mIFNTSCBjb25uZWN0aW9ucy4KICAgICAgICAiIiIKICAgICAgICBpZiBrZXkgaW4gU1NITWFuYWdlci5fY29ubmVjdGlvbl9jYWNoZToKICAgICAgICAgICAgZGVsIFNTSE1hbmFnZXIuX2Nvbm5lY3Rpb25fY2FjaGVba2V5XQoKICAgIGRlZiBkaXNjb25uZWN0KHNlbGYpIC0+IE5vbmU6CiAgICAgICAgIiIiCiAgICAgICAgRGlzY29ubmVjdCB0aGUgU1NIIGNvbm5lY3Rpb24gYW5kIFNGVFAgY2xpZW50LgogICAgICAgICIiIgogICAgICAgIGlmIHNlbGYuc2Z0cF9zZXJ2aWNlLl9zZnRwX2NsaWVudCBpcyBub3QgTm9uZToKICAgICAgICAgICAgc2VsZi5zZnRwX3NlcnZpY2UuZGlzY29ubmVjdCgpCgogICAgICAgIGlmIHNlbGYuY29ubmVjdGlvbi5fc3NoX2NsaWVudCBpcyBub3QgTm9uZToKICAgICAgICAgICAgc2VsZi5jb25uZWN0aW9uLmRpc2Nvbm5lY3QoKQoKICAgICAgICBrZXkgPSAoCiAgICAgICAgICAgIHNlbGYuY29ubmVjdGlvbi5ob3N0LAogICAgICAgICAgICBzZWxmLmNvbm5lY3Rpb24ucG9ydCwKICAgICAgICAgICAgc2VsZi5jb25uZWN0aW9uLnVzZXJuYW1lLAogICAgICAgICAgICBzZWxmLmNvbm5lY3Rpb24ubW9kZSwKICAgICAgICAgICAgc2VsZi5jb25uZWN0aW9uLmFsbG93X2FnZW50LAogICAgICAgICAgICBzZWxmLmNvbm5lY3Rpb24ucGFzc3dvcmQgb3IgIiIsCiAgICAgICAgICAgIHNlbGYuY29ubmVjdGlvbi5zc2hfa2V5IG9yICIiLAogICAgICAgICAgICBzZWxmLmNvbm5lY3Rpb24uaG9zdF9rZXkgb3IgIiIsCiAgICAgICAgKQogICAgICAgIHNlbGYuZGVsZXRlX2NhY2hlKGtleSkKCiAgICBAY2xhc3NtZXRob2QKICAgIGRlZiBnZXRfY29ubmVjdGlvbl9jYWNoZShjbHMpOgogICAgICAgICIiIgogICAgICAgIEdldCB0aGUgY29ubmVjdGlvbiBjYWNoZS4KICAgICAgICAiIiIKICAgICAgICByZXR1cm4gY2xzLl9jb25uZWN0aW9uX2NhY2hlCg== \ No newline at end of file