From 54c3d037a0e42e58b4fc0cbc735bffb086d23dcd Mon Sep 17 00:00:00 2001 From: git_admin Date: Mon, 27 Apr 2026 06:53:53 +0000 Subject: [PATCH] Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) --- addons/cetmix_tower_server/tests/test_command_wizard.py | 1 + 1 file changed, 1 insertion(+) create mode 100644 addons/cetmix_tower_server/tests/test_command_wizard.py diff --git a/addons/cetmix_tower_server/tests/test_command_wizard.py b/addons/cetmix_tower_server/tests/test_command_wizard.py new file mode 100644 index 0000000..2f91aa8 --- /dev/null +++ b/addons/cetmix_tower_server/tests/test_command_wizard.py @@ -0,0 +1 @@ +IyBDb3B5cmlnaHQgKEMpIDIwMjIgQ2V0bWl4IE/DnAojIExpY2Vuc2UgQUdQTC0zLjAgb3IgbGF0ZXIgKGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsKS4KCmZyb20gb2Rvby5leGNlcHRpb25zIGltcG9ydCBBY2Nlc3NFcnJvciwgVmFsaWRhdGlvbkVycm9yCgpmcm9tIC5jb21tb24gaW1wb3J0IFRlc3RUb3dlckNvbW1vbgoKCmNsYXNzIFRlc3RUb3dlckNvbW1hbmRXaXphcmQoVGVzdFRvd2VyQ29tbW9uKToKICAgICIiIlRlc3QgVG93ZXIgQ29tbWFuZCBSdW4gV2l6YXJkIiIiCgogICAgZGVmIHRlc3RfdXNlcl9hY2Nlc3NfcnVsZXMoc2VsZik6CiAgICAgICAgIiIiVGVzdCB1c2VyIGFjY2VzcyBydWxlcyIiIgoKICAgICAgICAjIEFkZCBCb2IgdG8gYHJvb3RgIGdyb3VwIGluIG9yZGVyIHRvIGNyZWF0ZSBhIHdpemFyZAogICAgICAgIHNlbGYuYWRkX3RvX2dyb3VwKHNlbGYudXNlcl9ib2IsICJjZXRtaXhfdG93ZXJfc2VydmVyLmdyb3VwX3Jvb3QiKQoKICAgICAgICAjIENyZWF0ZSBuZXcgd2l6YXJkCiAgICAgICAgdGVzdF93aXphcmQgPSAoCiAgICAgICAgICAgIHNlbGYuZW52WyJjeC50b3dlci5jb21tYW5kLnJ1bi53aXphcmQiXQogICAgICAgICAgICAud2l0aF91c2VyKHNlbGYudXNlcl9ib2IpCiAgICAgICAgICAgIC5jcmVhdGUoCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgInNlcnZlcl9pZHMiOiBbc2VsZi5zZXJ2ZXJfdGVzdF8xLmlkXSwKICAgICAgICAgICAgICAgICAgICAiY29tbWFuZF9pZCI6IHNlbGYuY29tbWFuZF9jcmVhdGVfZGlyLmlkLAogICAgICAgICAgICAgICAgfQogICAgICAgICAgICApCiAgICAgICAgKS53aXRoX3VzZXIoc2VsZi51c2VyX2JvYikKCiAgICAgICAgIyBGb3JjZSByZW5kZXJlZCBjb2RlIGNvbXB1dGF0aW9uCiAgICAgICAgdGVzdF93aXphcmQuX2NvbXB1dGVfcmVuZGVyZWRfY29kZSgpCgogICAgICAgICMgUmVtb3ZlIGJvYiBmcm9tIGFsbCBjeHRvd2VyX3NlcnZlciBncm91cHMKICAgICAgICBzZWxmLnJlbW92ZV9mcm9tX2dyb3VwKAogICAgICAgICAgICBzZWxmLnVzZXJfYm9iLAogICAgICAgICAgICBbCiAgICAgICAgICAgICAgICAiY2V0bWl4X3Rvd2VyX3NlcnZlci5ncm91cF91c2VyIiwKICAgICAgICAgICAgICAgICJjZXRtaXhfdG93ZXJfc2VydmVyLmdyb3VwX21hbmFnZXIiLAogICAgICAgICAgICAgICAgImNldG1peF90b3dlcl9zZXJ2ZXIuZ3JvdXBfcm9vdCIsCiAgICAgICAgICAgIF0sCiAgICAgICAgKQogICAgICAgICMgRW5zdXJlIHRoYXQgcmVndWxhciB1c2VyIGNhbm5vdCBleGVjdXRlIGNvbW1hbmQgaW4gd2l6YXJkCiAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhBY2Nlc3NFcnJvcik6CiAgICAgICAgICAgIHRlc3Rfd2l6YXJkLnJ1bl9jb21tYW5kX2luX3dpemFyZCgpCgogICAgICAgICMgQWRkIGJvYiBiYWNrIHRvIGB1c2VyYCBncm91cCBhbmQgdHJ5IGFnYWluCiAgICAgICAgc2VsZi5hZGRfdG9fZ3JvdXAoc2VsZi51c2VyX2JvYiwgImNldG1peF90b3dlcl9zZXJ2ZXIuZ3JvdXBfdXNlciIpCiAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhBY2Nlc3NFcnJvcik6CiAgICAgICAgICAgIHRlc3Rfd2l6YXJkLnJ1bl9jb21tYW5kX2luX3dpemFyZCgpCgogICAgICAgICMgTm93IHByb21vdGUgYm9iIHRvIGBtYW5hZ2VyYCBncm91cCBhbmQgdHJ5IGFnYWluCiAgICAgICAgc2VsZi5hZGRfdG9fZ3JvdXAoc2VsZi51c2VyX2JvYiwgImNldG1peF90b3dlcl9zZXJ2ZXIuZ3JvdXBfbWFuYWdlciIpCiAgICAgICAgdGVzdF93aXphcmQucnVuX2NvbW1hbmRfaW5fd2l6YXJkKCkKCiAgICBkZWYgdGVzdF9leGVjdXRlX2NvZGVfd2l0aG91dF9hX2NvbW1hbmQoc2VsZik6CiAgICAgICAgIiIiUnVuIGNvbW1hbmQgY29kZSB3aXRob3V0IGEgY29tbWFuZCBzZWxlY3RlZCIiIgoKICAgICAgICAjIEFkZCBCb2IgdG8gYHJvb3RgIGdyb3VwIGluIG9yZGVyIHRvIGNyZWF0ZSBhIHdpemFyZAogICAgICAgIHNlbGYuYWRkX3RvX2dyb3VwKHNlbGYudXNlcl9ib2IsICJjZXRtaXhfdG93ZXJfc2VydmVyLmdyb3VwX3Jvb3QiKQoKICAgICAgICAjIENyZWF0ZSBuZXcgd2l6YXJkCiAgICAgICAgdGVzdF93aXphcmQgPSAoCiAgICAgICAgICAgIHNlbGYuZW52WyJjeC50b3dlci5jb21tYW5kLnJ1bi53aXphcmQiXQogICAgICAgICAgICAud2l0aF91c2VyKHNlbGYudXNlcl9ib2IpCiAgICAgICAgICAgIC5jcmVhdGUoCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgInNlcnZlcl9pZHMiOiBbc2VsZi5zZXJ2ZXJfdGVzdF8xLmlkXSwKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgKQogICAgICAgICkud2l0aF91c2VyKHNlbGYudXNlcl9ib2IpCgogICAgICAgICMgU2hvdWxkIG5vdCBhbGxvdyB0byBydW4gY29tbWFuZCBvbiBzZXJ2ZXIgaWYgbm8gY29tbWFuZCBpcyBzZWxlY3RlZAogICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoVmFsaWRhdGlvbkVycm9yKToKICAgICAgICAgICAgdGVzdF93aXphcmQucnVuX2NvbW1hbmRfb25fc2VydmVyKCkKCiAgICBkZWYgdGVzdF9ydW5fY29tbWFuZF9vbl9zZXJ2ZXJfYWNjZXNzX3JpZ2h0cyhzZWxmKToKICAgICAgICAiIiJUZXN0IGFjY2VzcyByaWdodHMgZm9yIGV4ZWN1dGluZyBjb21tYW5kIG9uIHNlcnZlciIiIgoKICAgICAgICAjIEFkZCBCb2IgdG8gYHJvb3RgIGdyb3VwCiAgICAgICAgc2VsZi5hZGRfdG9fZ3JvdXAoc2VsZi51c2VyX2JvYiwgImNldG1peF90b3dlcl9zZXJ2ZXIuZ3JvdXBfcm9vdCIpCgogICAgICAgICMgQ3JlYXRlIG5ldyB3aXphcmQgd2l0aCBCb2IgYXMgYSByb290IHVzZXIKICAgICAgICB0ZXN0X3dpemFyZCA9ICgKICAgICAgICAgICAgc2VsZi5lbnZbImN4LnRvd2VyLmNvbW1hbmQucnVuLndpemFyZCJdCiAgICAgICAgICAgIC53aXRoX3VzZXIoc2VsZi51c2VyX2JvYikKICAgICAgICAgICAgLmNyZWF0ZSgKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAic2VydmVyX2lkcyI6IFtzZWxmLnNlcnZlcl90ZXN0XzEuaWRdLAogICAgICAgICAgICAgICAgICAgICJjb21tYW5kX2lkIjogc2VsZi5jb21tYW5kX2NyZWF0ZV9kaXIuaWQsCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICkKICAgICAgICApLndpdGhfdXNlcihzZWxmLnVzZXJfYm9iKQoKICAgICAgICAjIEVuc3VyZSBjb21tYW5kIGNhbiBiZSBleGVjdXRlZCBieSByb290CiAgICAgICAgdGVzdF93aXphcmQucnVuX2NvbW1hbmRfb25fc2VydmVyKCkKCiAgICAgICAgIyBSZW1vdmUgQm9iIGZyb20gYWxsIHRvd2VyIHNlcnZlciBncm91cHMKICAgICAgICBzZWxmLnJlbW92ZV9mcm9tX2dyb3VwKAogICAgICAgICAgICBzZWxmLnVzZXJfYm9iLAogICAgICAgICAgICBbCiAgICAgICAgICAgICAgICAiY2V0bWl4X3Rvd2VyX3NlcnZlci5ncm91cF91c2VyIiwKICAgICAgICAgICAgICAgICJjZXRtaXhfdG93ZXJfc2VydmVyLmdyb3VwX21hbmFnZXIiLAogICAgICAgICAgICAgICAgImNldG1peF90b3dlcl9zZXJ2ZXIuZ3JvdXBfcm9vdCIsCiAgICAgICAgICAgIF0sCiAgICAgICAgKQoKICAgICAgICAjIEVuc3VyZSB0aGF0IHJlZ3VsYXIgdXNlciBjYW5ub3QgZXhlY3V0ZSBjb21tYW5kIG9uIHNlcnZlcgogICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoQWNjZXNzRXJyb3IpOgogICAgICAgICAgICB0ZXN0X3dpemFyZC5ydW5fY29tbWFuZF9vbl9zZXJ2ZXIoKQoKICAgICAgICAjICBBZGQgQm9iIHRvIGB1c2VyYCBncm91cCBhbmQgZW5zdXJlIGhlIGNhbiBleGVjdXRlIGNvbW1hbmRzCiAgICAgICAgc2VsZi5hZGRfdG9fZ3JvdXAoc2VsZi51c2VyX2JvYiwgImNldG1peF90b3dlcl9zZXJ2ZXIuZ3JvdXBfdXNlciIpCiAgICAgICAgdGVzdF93aXphcmQucnVuX2NvbW1hbmRfb25fc2VydmVyKCkKICAgICAgICAjIEVuc3VyZSB0aGF0IEJvYiBoYXMgYWNjZXNzIHRvIHBhdGggZmllbGQgYnV0IGNhbid0IHJlYWQgaXRzIHZhbHVlCiAgICAgICAgYWxsb3dlZF9wYXRoID0gKAogICAgICAgICAgICBzZWxmLnVzZXJfYm9iLmhhc19ncm91cCgiY2V0bWl4X3Rvd2VyX3NlcnZlci5ncm91cF9tYW5hZ2VyIikKICAgICAgICAgICAgYW5kIHRlc3Rfd2l6YXJkLnBhdGgKICAgICAgICApCgogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYWxsb3dlZF9wYXRoLCBGYWxzZSkKICAgICAgICAjIEVuc3VyZSB0aGF0IEJvYiBjYW4gd3JpdGUgdG8gdGhlIHBhdGggZmllbGQgYXMgYSBtZW1iZXIgb2YgYGdyb3VwX3VzZXJgCiAgICAgICAgIyB0aGUgcmVzdWx0IHdpbGwgYmUgTm9uZQogICAgICAgIHRlc3Rfd2l6YXJkLndyaXRlKHsicGF0aCI6ICIvbmV3L2ludmFsaWQvcGF0aCJ9KQogICAgICAgIGFsbG93ZWRfcGF0aCA9ICgKICAgICAgICAgICAgdGVzdF93aXphcmQucGF0aAogICAgICAgICAgICBpZiBzZWxmLnVzZXJfYm9iLmhhc19ncm91cCgiY2V0bWl4X3Rvd2VyX3NlcnZlci5ncm91cF9tYW5hZ2VyIikKICAgICAgICAgICAgYW5kIHRlc3Rfd2l6YXJkLnBhdGgKICAgICAgICAgICAgZWxzZSBOb25lCiAgICAgICAgKQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYWxsb3dlZF9wYXRoLCBOb25lKQoKICAgICAgICAjIEFkZCBCb2IgdG8gYG1hbmFnZXJgIGdyb3VwIGFuZCBlbnN1cmUgYWNjZXNzIHRvIGV4ZWN1dGUgY29tbWFuZHMKICAgICAgICBzZWxmLmFkZF90b19ncm91cChzZWxmLnVzZXJfYm9iLCAiY2V0bWl4X3Rvd2VyX3NlcnZlci5ncm91cF9tYW5hZ2VyIikKICAgICAgICB0ZXN0X3dpemFyZC5ydW5fY29tbWFuZF9vbl9zZXJ2ZXIoKQogICAgICAgICMgQ2hlY2sgdGhhdCBwYXRoIGFjY2VzcyBpcyB2YWxpZCBmb3IgdGhlIG1hbmFnZXIKICAgICAgICB0ZXN0X3dpemFyZC5yZWFkKFsicGF0aCJdKQoKICAgIGRlZiB0ZXN0X3J1bl9jb21tYW5kX3dpdGhfc2Vuc2l0aXZlX3ZhcnNfb25fc2VydmVyX2FjY2Vzc19yaWdodHMoc2VsZik6CiAgICAgICAgIiIiVGVzdCBhY2Nlc3MgcmlnaHRzIGZvciBleGVjdXRpbmcgY29tbWFuZCBvbiBzZXJ2ZXIiIiIKICAgICAgICAjIGNyZWF0ZSBuZXcgY29tbWFuZAogICAgICAgIGNvbW1hbmQgPSBzZWxmLkNvbW1hbmQuY3JlYXRlKAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAibmFtZSI6ICJDcmVhdGUgbmV3IGNvbW1hbmQiLAogICAgICAgICAgICAgICAgImFjdGlvbiI6ICJweXRob25fY29kZSIsCiAgICAgICAgICAgICAgICAiY29kZSI6ICIiIgogICAgICAgIHByb3BlcnRpZXMgPSB7CiAgICAgICAgICAgICJTZXJ2ZXIgTmFtZSI6IHt7IHRvd2VyLnNlcnZlci5uYW1lIH19LAogICAgICAgICAgICAiU2VydmVyIFJlZmVyZW5jZSI6IHt7IHRvd2VyLnNlcnZlci5yZWZlcmVuY2UgfX0sCiAgICAgICAgICAgICJTU0ggVXNlcm5hbWUiOiB7eyB0b3dlci5zZXJ2ZXIudXNlcm5hbWUgfX0sCiAgICAgICAgICAgICJJUHY0IEFkZHJlc3MiOiB7eyB0b3dlci5zZXJ2ZXIuaXB2NCB9fSwKICAgICAgICAgICAgIklQdjYgQWRkcmVzcyI6IHt7IHRvd2VyLnNlcnZlci5pcHY2IH19LAogICAgICAgICAgICAiUGFydG5lciBOYW1lIjoge3sgdG93ZXIuc2VydmVyLnBhcnRuZXJfbmFtZSB9fQogICAgICAgIH0KICAgICAgICByZXN1bHQgPSB7ImV4aXRfY29kZSI6IDAsICJtZXNzYWdlIjogcHJvcGVydGllc30KICAgICAgICAgICAgICAgICAgICAgICAgIiIiLAogICAgICAgICAgICAgICAgImFjY2Vzc19sZXZlbCI6ICIxIiwKICAgICAgICAgICAgfQogICAgICAgICkKCiAgICAgICAgIyBBZGQgQm9iIHRvIGByb290YCBncm91cCBpbiBvcmRlciB0byBjcmVhdGUgYSB3aXphcmQKICAgICAgICBzZWxmLmFkZF90b19ncm91cChzZWxmLnVzZXJfYm9iLCAiY2V0bWl4X3Rvd2VyX3NlcnZlci5ncm91cF9yb290IikKCiAgICAgICAgc2VydmVyID0gc2VsZi5TZXJ2ZXIud2l0aF91c2VyKHNlbGYudXNlcl9ib2IpLmNyZWF0ZSgKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIm5hbWUiOiAiVGVzdCAyIiwKICAgICAgICAgICAgICAgICJpcF92NF9hZGRyZXNzIjogImxvY2FsaG9zdCIsCiAgICAgICAgICAgICAgICAic3NoX3VzZXJuYW1lIjogInJvb3QiLAogICAgICAgICAgICAgICAgInNzaF9wYXNzd29yZCI6ICJwYXNzd29yZCIsCiAgICAgICAgICAgICAgICAic3NoX2F1dGhfbW9kZSI6ICJwIiwKICAgICAgICAgICAgICAgICJvc19pZCI6IHNlbGYub3NfZGViaWFuXzEwLmlkLAogICAgICAgICAgICB9CiAgICAgICAgKQoKICAgICAgICBzZWxmLnJlbW92ZV9mcm9tX2dyb3VwKAogICAgICAgICAgICBzZWxmLnVzZXJfYm9iLAogICAgICAgICAgICBbCiAgICAgICAgICAgICAgICAiY2V0bWl4X3Rvd2VyX3NlcnZlci5ncm91cF91c2VyIiwKICAgICAgICAgICAgICAgICJjZXRtaXhfdG93ZXJfc2VydmVyLmdyb3VwX21hbmFnZXIiLAogICAgICAgICAgICAgICAgImNldG1peF90b3dlcl9zZXJ2ZXIuZ3JvdXBfcm9vdCIsCiAgICAgICAgICAgIF0sCiAgICAgICAgKQoKICAgICAgICAjIEFkZCB1c2VyIGJvYiB0byBncm91cCB1c2VyCiAgICAgICAgc2VsZi5hZGRfdG9fZ3JvdXAoc2VsZi51c2VyX2JvYiwgImNldG1peF90b3dlcl9zZXJ2ZXIuZ3JvdXBfdXNlciIpCgogICAgICAgICMgQ3JlYXRlIG5ldyB3aXphcmQgd2l0aCBCb2IKICAgICAgICB0ZXN0X3dpemFyZCA9ICgKICAgICAgICAgICAgc2VsZi5lbnZbImN4LnRvd2VyLmNvbW1hbmQucnVuLndpemFyZCJdCiAgICAgICAgICAgIC53aXRoX3VzZXIoc2VsZi51c2VyX2JvYikKICAgICAgICAgICAgLmNyZWF0ZSgKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAic2VydmVyX2lkcyI6IFtzZXJ2ZXIuaWRdLAogICAgICAgICAgICAgICAgICAgICJjb21tYW5kX2lkIjogY29tbWFuZC5pZCwKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgKQogICAgICAgICkud2l0aF91c2VyKHNlbGYudXNlcl9ib2IpCgogICAgICAgICMgQWRkIEJvYiBhcyBhIHVzZXIgdG8gdGhlIGNvbW1hbmQKICAgICAgICBjb21tYW5kLndyaXRlKHsidXNlcl9pZHMiOiBbKDQsIHNlbGYudXNlcl9ib2IuaWQpXX0pCgogICAgICAgICMgRW5zdXJlIGNvbW1hbmQgY2FuIGJlIGV4ZWN1dGVkIGJ5IHVzZXIKICAgICAgICB0ZXN0X3dpemFyZC5ydW5fY29tbWFuZF9vbl9zZXJ2ZXIoKQoKICAgIGRlZiB0ZXN0X3J1bl9jb21tYW5kX2luX3dpemFyZF9tdWx0aXBsZV9zZXJ2ZXJzKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIFRlc3QgdGhhdCByYWlzZXMgYW4gZXJyb3Igd2hlbiBtdWx0aXBsZSBzZXJ2ZXJzIGFyZSBzZWxlY3RlZAogICAgICAgICIiIgoKICAgICAgICAjIEFkZCBCb2IgdG8gYHJvb3RgIGdyb3VwIGluIG9yZGVyIHRvIGNyZWF0ZSBhIHdpemFyZAoKICAgICAgICBzZXJ2ZXJfdGVzdF8yID0gc2VsZi5TZXJ2ZXIuY3JlYXRlKAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAibmFtZSI6ICJUZXN0IDIiLAogICAgICAgICAgICAgICAgImlwX3Y0X2FkZHJlc3MiOiAibG9jYWxob3N0IiwKICAgICAgICAgICAgICAgICJzc2hfdXNlcm5hbWUiOiAicm9vdCIsCiAgICAgICAgICAgICAgICAic3NoX3Bhc3N3b3JkIjogInBhc3N3b3JkIiwKICAgICAgICAgICAgICAgICJzc2hfYXV0aF9tb2RlIjogInAiLAogICAgICAgICAgICAgICAgIm9zX2lkIjogc2VsZi5vc19kZWJpYW5fMTAuaWQsCiAgICAgICAgICAgIH0KICAgICAgICApCgogICAgICAgIHNlbGYuYWRkX3RvX2dyb3VwKHNlbGYudXNlcl9ib2IsICJjZXRtaXhfdG93ZXJfc2VydmVyLmdyb3VwX3Jvb3QiKQoKICAgICAgICAjIENyZWF0ZSBuZXcgd2l6YXJkIHdpdGggbXVsdGlwbGUgc2VydmVycyBzZWxlY3RlZAogICAgICAgIHRlc3Rfd2l6YXJkID0gKAogICAgICAgICAgICBzZWxmLmVudlsiY3gudG93ZXIuY29tbWFuZC5ydW4ud2l6YXJkIl0KICAgICAgICAgICAgLndpdGhfdXNlcihzZWxmLnVzZXJfYm9iKQogICAgICAgICAgICAuY3JlYXRlKAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICJzZXJ2ZXJfaWRzIjogW3NlbGYuc2VydmVyX3Rlc3RfMS5pZCwgc2VydmVyX3Rlc3RfMi5pZF0sCiAgICAgICAgICAgICAgICAgICAgImNvbW1hbmRfaWQiOiBzZWxmLmNvbW1hbmRfY3JlYXRlX2Rpci5pZCwKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgKQogICAgICAgICkud2l0aF91c2VyKHNlbGYudXNlcl9ib2IpCgogICAgICAgICMgRm9yY2UgcmVuZGVyZWQgY29kZSBjb21wdXRhdGlvbgogICAgICAgIHRlc3Rfd2l6YXJkLl9jb21wdXRlX3JlbmRlcmVkX2NvZGUoKQoKICAgICAgICAjIEVuc3VyZSB0aGF0IGV4ZWN1dGluZyBjb21tYW5kIHdpdGggbXVsdGlwbGUgc2VydmVycwogICAgICAgICMgc2VsZWN0ZWQgcmFpc2VzIGEgVmFsaWRhdGlvbkVycm9yCiAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcygKICAgICAgICAgICAgVmFsaWRhdGlvbkVycm9yLAogICAgICAgICAgICBtc2c9IllvdSBjYW5ub3QgcnVuIGN1c3RvbSBjb2RlIG9uIG11bHRpcGxlIHNlcnZlcnMgYXQgb25jZS4iLAogICAgICAgICk6CiAgICAgICAgICAgIHRlc3Rfd2l6YXJkLnJ1bl9jb21tYW5kX2luX3dpemFyZCgpCgogICAgICAgICMgTm93LCB0ZXN0IHdpdGggYSBzaW5nbGUgc2VydmVyIHNlbGVjdGVkCiAgICAgICAgdGVzdF93aXphcmQuc2VydmVyX2lkcyA9IFtzZWxmLnNlcnZlcl90ZXN0XzEuaWRdCgogICAgICAgICMgRW5zdXJlIHRoYXQgZXhlY3V0aW5nIGNvbW1hbmQgd29ya3Mgd2l0aCBhIHNpbmdsZSBzZXJ2ZXIgc2VsZWN0ZWQKICAgICAgICB0ZXN0X3dpemFyZC5ydW5fY29tbWFuZF9pbl93aXphcmQoKQogICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgKICAgICAgICAgICAgdGVzdF93aXphcmQucmVzdWx0LAogICAgICAgICAgICBtc2c9IkNvbW1hbmQgZXhlY3V0aW9uIHNob3VsZCBzdWNjZWVkIHdpdGggYSBzaW5nbGUgc2VydmVyIHNlbGVjdGVkIiwKICAgICAgICApCgogICAgZGVmIHRlc3RfY3VzdG9tX3ZhcmlhYmxlX3ZhbHVlc19jcmVhdGlvbihzZWxmKToKICAgICAgICAiIiIKICAgICAgICBUZXN0IHRoYXQgY3VzdG9tIHZhcmlhYmxlIHZhbHVlcyBhcmUgY3JlYXRlZCBwcm9wZXJseQogICAgICAgIHdoZW4gY29tbWFuZCBoYXMgdmFyaWFibGVzCiAgICAgICAgIiIiCiAgICAgICAgIyBBZGQgbWFuYWdlciBhcyBzZXJ2ZXIgdXNlcgogICAgICAgIHNlbGYuc2VydmVyX3Rlc3RfMS53cml0ZSh7InVzZXJfaWRzIjogWyg0LCBzZWxmLm1hbmFnZXIuaWQpXX0pCgogICAgICAgICMgQ3JlYXRlIHZhcmlhYmxlcyB0aGF0IHdpbGwgYmUgdXNlZCBpbiBjb21tYW5kCiAgICAgICAgdmFyaWFibGUgPSBzZWxmLlZhcmlhYmxlLmNyZWF0ZSgKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIm5hbWUiOiAiVGVzdCBWYXJpYWJsZSIsCiAgICAgICAgICAgICAgICAicmVmZXJlbmNlIjogInRlc3RfdmFyIiwKICAgICAgICAgICAgICAgICJ2YXJpYWJsZV90eXBlIjogInMiLCAgIyBzdHJpbmcgdHlwZQogICAgICAgICAgICB9CiAgICAgICAgKQogICAgICAgIG9wdGlvbl92YXJpYWJsZSA9IHNlbGYuVmFyaWFibGUuY3JlYXRlKAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAibmFtZSI6ICJPcHRpb24gVmFyaWFibGUiLAogICAgICAgICAgICAgICAgInJlZmVyZW5jZSI6ICJvcHRfdmFyIiwKICAgICAgICAgICAgICAgICJ2YXJpYWJsZV90eXBlIjogIm8iLCAgIyBvcHRpb24gdHlwZQogICAgICAgICAgICB9CiAgICAgICAgKQogICAgICAgIG9wdGlvbiA9IHNlbGYuVmFyaWFibGVPcHRpb24uY3JlYXRlKAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAibmFtZSI6ICJUZXN0IE9wdGlvbiIsCiAgICAgICAgICAgICAgICAidmFsdWVfY2hhciI6ICJvcHRpb25fdmFsdWUiLAogICAgICAgICAgICAgICAgInZhcmlhYmxlX2lkIjogb3B0aW9uX3ZhcmlhYmxlLmlkLAogICAgICAgICAgICB9CiAgICAgICAgKQoKICAgICAgICAjIEFkZCB2YXJpYWJsZSB2YWx1ZXMgdG8gc2VydmVyCiAgICAgICAgc2VsZi5WYXJpYWJsZVZhbHVlLmNyZWF0ZSgKICAgICAgICAgICAgWwogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICJ2YXJpYWJsZV9pZCI6IHZhcmlhYmxlLmlkLAogICAgICAgICAgICAgICAgICAgICJzZXJ2ZXJfaWQiOiBzZWxmLnNlcnZlcl90ZXN0XzEuaWQsCiAgICAgICAgICAgICAgICAgICAgInZhbHVlX2NoYXIiOiAic2VydmVyIHZhbHVlIiwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgInZhcmlhYmxlX2lkIjogb3B0aW9uX3ZhcmlhYmxlLmlkLAogICAgICAgICAgICAgICAgICAgICJzZXJ2ZXJfaWQiOiBzZWxmLnNlcnZlcl90ZXN0XzEuaWQsCiAgICAgICAgICAgICAgICAgICAgInZhbHVlX2NoYXIiOiAib3B0aW9uX3ZhbHVlIiwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIF0KICAgICAgICApCgogICAgICAgICMgQ3JlYXRlIGNvbW1hbmQgdGhhdCB1c2VzIHRoZXNlIHZhcmlhYmxlcyBpbiBpdHMgY29kZQogICAgICAgIGNvbW1hbmQgPSBzZWxmLkNvbW1hbmQuY3JlYXRlKAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAibmFtZSI6ICJUZXN0IENvbW1hbmQgd2l0aCBWYXJpYWJsZXMiLAogICAgICAgICAgICAgICAgImFjdGlvbiI6ICJzc2hfY29tbWFuZCIsCiAgICAgICAgICAgICAgICAiY29kZSI6ICJlY2hvIHt7IHRlc3RfdmFyIH19ICYmIGVjaG8ge3sgb3B0X3ZhciB9fSIsCiAgICAgICAgICAgIH0KICAgICAgICApCgogICAgICAgICMgQ3JlYXRlIHdpemFyZAogICAgICAgIHdpemFyZCA9ICgKICAgICAgICAgICAgc2VsZi5lbnZbImN4LnRvd2VyLmNvbW1hbmQucnVuLndpemFyZCJdCiAgICAgICAgICAgIC53aXRoX3VzZXIoc2VsZi5tYW5hZ2VyKQogICAgICAgICAgICAuY3JlYXRlKAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICJzZXJ2ZXJfaWRzIjogW3NlbGYuc2VydmVyX3Rlc3RfMS5pZF0sCiAgICAgICAgICAgICAgICAgICAgImNvbW1hbmRfaWQiOiBjb21tYW5kLmlkLAogICAgICAgICAgICAgICAgICAgICJhY3Rpb24iOiAic3NoX2NvbW1hbmQiLAogICAgICAgICAgICAgICAgfQogICAgICAgICAgICApCiAgICAgICAgKQoKICAgICAgICAjIFRyaWdnZXIgb25jaGFuZ2UgdG8gZ2VuZXJhdGUgY3VzdG9tX3ZhcmlhYmxlX3ZhbHVlcwogICAgICAgIHdpemFyZC5fb25jaGFuZ2VfY29tbWFuZF92YXJpYWJsZV9pZHMoKQoKICAgICAgICAjIENoZWNrIHRoYXQgY3VzdG9tIHZhcmlhYmxlIHZhbHVlcyB3ZXJlIGNyZWF0ZWQKICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbih3aXphcmQuY3VzdG9tX3ZhcmlhYmxlX3ZhbHVlX2lkcyksIDIpCgogICAgICAgICMgQ2hlY2sgY2hhciB2YXJpYWJsZSB2YWx1ZQogICAgICAgIGNoYXJfdmFsdWUgPSB3aXphcmQuY3VzdG9tX3ZhcmlhYmxlX3ZhbHVlX2lkcy5maWx0ZXJlZCgKICAgICAgICAgICAgbGFtYmRhIHY6IHYudmFyaWFibGVfaWQgPT0gdmFyaWFibGUKICAgICAgICApCiAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGNoYXJfdmFsdWUpCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjaGFyX3ZhbHVlLnZhbHVlX2NoYXIsICJzZXJ2ZXIgdmFsdWUiKQoKICAgICAgICAjIENoZWNrIG9wdGlvbiB2YXJpYWJsZSB2YWx1ZQogICAgICAgIG9wdGlvbl92YWx1ZSA9IHdpemFyZC5jdXN0b21fdmFyaWFibGVfdmFsdWVfaWRzLmZpbHRlcmVkKAogICAgICAgICAgICBsYW1iZGEgdjogdi52YXJpYWJsZV9pZCA9PSBvcHRpb25fdmFyaWFibGUKICAgICAgICApCiAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG9wdGlvbl92YWx1ZSkKICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG9wdGlvbl92YWx1ZS52YWx1ZV9jaGFyLCAib3B0aW9uX3ZhbHVlIikKICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG9wdGlvbl92YWx1ZS5vcHRpb25faWQsIG9wdGlvbikKCiAgICAgICAgIyBUcnkgdG8gY2hhbmdlIHZhcmlhYmxlIHZhbHVlIHdoZW4gdXNlciBkb2Vzbid0IGhhdmUgd3JpdGUgYWNjZXNzCiAgICAgICAgY2hhcl92YWx1ZS52YWx1ZV9jaGFyID0gImN1c3RvbSB2YWx1ZSIKCiAgICAgICAgIyBSdW4gY29tbWFuZAogICAgICAgIHdpemFyZC5ydW5fY29tbWFuZF9vbl9zZXJ2ZXIoKQoKICAgICAgICAjIEdldCBsYXRlc3QgY29tbWFuZCBsb2cKICAgICAgICBjb21tYW5kX2xvZyA9IHNlbGYuZW52WyJjeC50b3dlci5jb21tYW5kLmxvZyJdLnNlYXJjaCgKICAgICAgICAgICAgWwogICAgICAgICAgICAgICAgKCJzZXJ2ZXJfaWQiLCAiPSIsIHNlbGYuc2VydmVyX3Rlc3RfMS5pZCksCiAgICAgICAgICAgICAgICAoImNvbW1hbmRfaWQiLCAiPSIsIGNvbW1hbmQuaWQpLAogICAgICAgICAgICBdLAogICAgICAgICAgICBvcmRlcj0iY3JlYXRlX2RhdGUgZGVzYyIsCiAgICAgICAgICAgIGxpbWl0PTEsCiAgICAgICAgKQoKICAgICAgICAjIFZlcmlmeSB0aGF0IG9yaWdpbmFsIHNlcnZlciB2YWx1ZXMgd2VyZSB1c2VkCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjb21tYW5kX2xvZy5jb2RlLCAiZWNobyBzZXJ2ZXIgdmFsdWUgJiYgZWNobyBvcHRpb25fdmFsdWUiKQoKICAgIGRlZiB0ZXN0X2N1c3RvbV92YXJpYWJsZV92YWx1ZXNfd2l0aF9tYW5hZ2VyX2FjY2VzcyhzZWxmKToKICAgICAgICAiIiIKICAgICAgICBUZXN0IHRoYXQgY3VzdG9tIHZhcmlhYmxlIHZhbHVlcyBhcmUgYXBwbGllZAogICAgICAgIHdoZW4gbWFuYWdlciBoYXMgd3JpdGUgYWNjZXNzCiAgICAgICAgIiIiCiAgICAgICAgIyBBZGQgbWFuYWdlciBhcyBzZXJ2ZXIgbWFuYWdlcgogICAgICAgIHNlbGYuc2VydmVyX3Rlc3RfMS53cml0ZSh7Im1hbmFnZXJfaWRzIjogWyg0LCBzZWxmLm1hbmFnZXIuaWQpXX0pCgogICAgICAgICMgQ3JlYXRlIHZhcmlhYmxlcyB0aGF0IHdpbGwgYmUgdXNlZCBpbiBjb21tYW5kCiAgICAgICAgdmFyaWFibGUgPSBzZWxmLlZhcmlhYmxlLmNyZWF0ZSgKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIm5hbWUiOiAiVGVzdCBWYXJpYWJsZSIsCiAgICAgICAgICAgICAgICAicmVmZXJlbmNlIjogInRlc3RfdmFyIiwKICAgICAgICAgICAgICAgICJ2YXJpYWJsZV90eXBlIjogInMiLCAgIyBzdHJpbmcgdHlwZQogICAgICAgICAgICB9CiAgICAgICAgKQoKICAgICAgICAjIEFkZCB2YXJpYWJsZSB2YWx1ZSB0byBzZXJ2ZXIKICAgICAgICBzZWxmLlZhcmlhYmxlVmFsdWUuY3JlYXRlKAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAidmFyaWFibGVfaWQiOiB2YXJpYWJsZS5pZCwKICAgICAgICAgICAgICAgICJzZXJ2ZXJfaWQiOiBzZWxmLnNlcnZlcl90ZXN0XzEuaWQsCiAgICAgICAgICAgICAgICAidmFsdWVfY2hhciI6ICJzZXJ2ZXIgdmFsdWUiLAogICAgICAgICAgICB9CiAgICAgICAgKQoKICAgICAgICAjIENyZWF0ZSBjb21tYW5kIHRoYXQgdXNlcyB0aGUgdmFyaWFibGUKICAgICAgICBjb21tYW5kID0gc2VsZi5Db21tYW5kLmNyZWF0ZSgKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIm5hbWUiOiAiVGVzdCBDb21tYW5kIHdpdGggVmFyaWFibGVzIiwKICAgICAgICAgICAgICAgICJhY3Rpb24iOiAic3NoX2NvbW1hbmQiLAogICAgICAgICAgICAgICAgImNvZGUiOiAiZWNobyB7eyB0ZXN0X3ZhciB9fSIsCiAgICAgICAgICAgIH0KICAgICAgICApCgogICAgICAgICMgQ3JlYXRlIHdpemFyZAogICAgICAgIHdpemFyZCA9ICgKICAgICAgICAgICAgc2VsZi5lbnZbImN4LnRvd2VyLmNvbW1hbmQucnVuLndpemFyZCJdCiAgICAgICAgICAgIC53aXRoX3VzZXIoc2VsZi5tYW5hZ2VyKQogICAgICAgICAgICAuY3JlYXRlKAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICJzZXJ2ZXJfaWRzIjogW3NlbGYuc2VydmVyX3Rlc3RfMS5pZF0sCiAgICAgICAgICAgICAgICAgICAgImNvbW1hbmRfaWQiOiBjb21tYW5kLmlkLAogICAgICAgICAgICAgICAgICAgICJhY3Rpb24iOiAic3NoX2NvbW1hbmQiLAogICAgICAgICAgICAgICAgfQogICAgICAgICAgICApCiAgICAgICAgKQoKICAgICAgICAjIFRyaWdnZXIgb25jaGFuZ2UgdG8gZ2VuZXJhdGUgY3VzdG9tX3ZhcmlhYmxlX3ZhbHVlX2lkcwogICAgICAgIHdpemFyZC5fb25jaGFuZ2VfY29tbWFuZF92YXJpYWJsZV9pZHMoKQoKICAgICAgICAjIE1vZGlmeSB2YXJpYWJsZSB2YWx1ZQogICAgICAgIHdpemFyZC5jdXN0b21fdmFyaWFibGVfdmFsdWVfaWRzLmZpbHRlcmVkKAogICAgICAgICAgICBsYW1iZGEgdjogdi52YXJpYWJsZV9pZCA9PSB2YXJpYWJsZQogICAgICAgICkudmFsdWVfY2hhciA9ICJtYW5hZ2VyIHZhbHVlIgoKICAgICAgICAjIFJ1biBjb21tYW5kCiAgICAgICAgd2l6YXJkLnJ1bl9jb21tYW5kX29uX3NlcnZlcigpCgogICAgICAgICMgR2V0IGxhdGVzdCBjb21tYW5kIGxvZwogICAgICAgIGNvbW1hbmRfbG9nID0gc2VsZi5lbnZbImN4LnRvd2VyLmNvbW1hbmQubG9nIl0uc2VhcmNoKAogICAgICAgICAgICBbCiAgICAgICAgICAgICAgICAoInNlcnZlcl9pZCIsICI9Iiwgc2VsZi5zZXJ2ZXJfdGVzdF8xLmlkKSwKICAgICAgICAgICAgICAgICgiY29tbWFuZF9pZCIsICI9IiwgY29tbWFuZC5pZCksCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgIG9yZGVyPSJjcmVhdGVfZGF0ZSBkZXNjIiwKICAgICAgICAgICAgbGltaXQ9MSwKICAgICAgICApCgogICAgICAgICMgVmVyaWZ5IHRoYXQgY3VzdG9tIHZhbHVlIHdhcyB1c2VkCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjb21tYW5kX2xvZy5jb2RlLCAiZWNobyBtYW5hZ2VyIHZhbHVlIikKCiAgICBkZWYgdGVzdF9kZWZhdWx0X2FwcGxpY2FiaWxpdHlfZm9yX3JlZ3VsYXJfYW5kX21hbmFnZXIoc2VsZik6CiAgICAgICAgIiIic2V0cyBhcHBsaWNhYmlsaXR5PSd0aGlzJyBmb3IgcmVndWxhciB1c2Vycywga2VlcHMgZGVmYXVsdCBmb3IgbWFuYWdlcnMuIiIiCiAgICAgICAgIyBSZWd1bGFyIHVzZXIgKG5vIHNwZWNpYWwgZ3JvdXBzKQogICAgICAgIGRlZmF1bHRfdXNyID0gKAogICAgICAgICAgICBzZWxmLmVudlsiY3gudG93ZXIuY29tbWFuZC5ydW4ud2l6YXJkIl0KICAgICAgICAgICAgLndpdGhfdXNlcihzZWxmLnVzZXJfYm9iKQogICAgICAgICAgICAuZGVmYXVsdF9nZXQoWyJhcHBsaWNhYmlsaXR5Il0pCiAgICAgICAgKQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZGVmYXVsdF91c3IuZ2V0KCJhcHBsaWNhYmlsaXR5IiksICJ0aGlzIikKCiAgICAgICAgIyBNYW5hZ2VyIHVzZXIgc2hvdWxkIHJlY2VpdmUgdGhlIG9yaWdpbmFsIGRlZmF1bHQgKCJzaGFyZWQiKQogICAgICAgIHNlbGYuYWRkX3RvX2dyb3VwKHNlbGYudXNlcl9ib2IsICJjZXRtaXhfdG93ZXJfc2VydmVyLmdyb3VwX21hbmFnZXIiKQogICAgICAgIGRlZmF1bHRfbWdyID0gKAogICAgICAgICAgICBzZWxmLmVudlsiY3gudG93ZXIuY29tbWFuZC5ydW4ud2l6YXJkIl0KICAgICAgICAgICAgLndpdGhfdXNlcihzZWxmLnVzZXJfYm9iKQogICAgICAgICAgICAuZGVmYXVsdF9nZXQoWyJhcHBsaWNhYmlsaXR5Il0pCiAgICAgICAgKQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZGVmYXVsdF9tZ3IuZ2V0KCJhcHBsaWNhYmlsaXR5IiksICJzaGFyZWQiKQoKICAgIGRlZiB0ZXN0X2NvbXB1dGVfc2hvd19zZXJ2ZXJzX2JlaGF2aW9yKHNlbGYpOgogICAgICAgICIiIlNob3VsZCBlbmZvcmNlICd0aGlzJyBmb3IgcmVndWxhciB1c2VycyBidXQgcHJlc2VydmUgbWFuYWdlciBjaG9pY2UuIiIiCiAgICAgICAgIyBHcmFudCBCb2IgdGhlIGJhc2ljICd1c2VyJyBncm91cCBzbyBoZSBjYW4gcmVhZCBzZXJ2ZXJzIGFuZCBjcmVhdGUgdGhlIHdpemFyZAogICAgICAgIHNlbGYuYWRkX3RvX2dyb3VwKHNlbGYudXNlcl9ib2IsICJjZXRtaXhfdG93ZXJfc2VydmVyLmdyb3VwX3VzZXIiKQoKICAgICAgICAjIEVuc3VyZSBCb2IgaGFzIHJlYWQgYWNjZXNzIHRvIHRoZSBmaXJzdCBzZXJ2ZXIKICAgICAgICBzZWxmLnNlcnZlcl90ZXN0XzEud3JpdGUoeyJ1c2VyX2lkcyI6IFsoNCwgc2VsZi51c2VyX2JvYi5pZCldfSkKICAgICAgICAjIENyZWF0ZSBhIHNlY29uZCBzZXJ2ZXIgYW5kIGdyYW50IEJvYiByZWFkIGFjY2VzcyB0byBpdAogICAgICAgIHNydjIgPSBzZWxmLlNlcnZlci5jcmVhdGUoCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICJuYW1lIjogIlNlcnZlciAyIiwKICAgICAgICAgICAgICAgICJpcF92NF9hZGRyZXNzIjogIjEyNy4wLjAuMiIsCiAgICAgICAgICAgICAgICAic3NoX3VzZXJuYW1lIjogInJvb3QiLAogICAgICAgICAgICAgICAgInNzaF9wYXNzd29yZCI6ICJwd2QiLAogICAgICAgICAgICAgICAgInNzaF9hdXRoX21vZGUiOiAicCIsCiAgICAgICAgICAgICAgICAib3NfaWQiOiBzZWxmLm9zX2RlYmlhbl8xMC5pZCwKICAgICAgICAgICAgfQogICAgICAgICkKICAgICAgICBzcnYyLndyaXRlKHsidXNlcl9pZHMiOiBbKDQsIHNlbGYudXNlcl9ib2IuaWQpXX0pCgogICAgICAgICMgLS0tIFJlZ3VsYXIgdXNlciBzY2VuYXJpbyAtLS0KICAgICAgICB3aXpfdXNyID0gKAogICAgICAgICAgICBzZWxmLmVudlsiY3gudG93ZXIuY29tbWFuZC5ydW4ud2l6YXJkIl0KICAgICAgICAgICAgLndpdGhfdXNlcihzZWxmLnVzZXJfYm9iKQogICAgICAgICAgICAuY3JlYXRlKHsic2VydmVyX2lkcyI6IFtzZWxmLnNlcnZlcl90ZXN0XzEuaWQsIHNydjIuaWRdfSkKICAgICAgICApCiAgICAgICAgIyBDb21wdXRlIHNob3dfc2VydmVycyB1bmRlciBCb2I7IGhlIHNob3VsZCBzZWUgYm90aCBzZXJ2ZXJzCiAgICAgICAgd2l6X3Vzci5fY29tcHV0ZV9zaG93X3NlcnZlcnMoKQogICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh3aXpfdXNyLnNob3dfc2VydmVycykKICAgICAgICAjIEVuZm9yY2VtZW50IHNob3VsZCBzZXQgYXBwbGljYWJpbGl0eSB0byAndGhpcycKICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHdpel91c3IuYXBwbGljYWJpbGl0eSwgInRoaXMiKQoKICAgICAgICAjIC0tLSBNYW5hZ2VyIHVzZXIgc2NlbmFyaW8gLS0tCiAgICAgICAgc2VsZi5hZGRfdG9fZ3JvdXAoc2VsZi51c2VyX2JvYiwgImNldG1peF90b3dlcl9zZXJ2ZXIuZ3JvdXBfbWFuYWdlciIpCiAgICAgICAgIyBHcmFudCBCb2IgbWFuYWdlciBhY2Nlc3MgdG8gYm90aCBzZXJ2ZXJzCiAgICAgICAgc2VsZi5zZXJ2ZXJfdGVzdF8xLndyaXRlKHsibWFuYWdlcl9pZHMiOiBbKDQsIHNlbGYudXNlcl9ib2IuaWQpXX0pCiAgICAgICAgc3J2Mi53cml0ZSh7Im1hbmFnZXJfaWRzIjogWyg0LCBzZWxmLnVzZXJfYm9iLmlkKV19KQoKICAgICAgICB3aXpfbWdyID0gKAogICAgICAgICAgICBzZWxmLmVudlsiY3gudG93ZXIuY29tbWFuZC5ydW4ud2l6YXJkIl0KICAgICAgICAgICAgLndpdGhfdXNlcihzZWxmLnVzZXJfYm9iKQogICAgICAgICAgICAuY3JlYXRlKHsic2VydmVyX2lkcyI6IFtzZWxmLnNlcnZlcl90ZXN0XzEuaWQsIHNydjIuaWRdfSkKICAgICAgICApCiAgICAgICAgIyBDb21wdXRlIHNob3dfc2VydmVycyB1bmRlciBCb2IgYXMgbWFuYWdlcgogICAgICAgIHdpel9tZ3IuX2NvbXB1dGVfc2hvd19zZXJ2ZXJzKCkKICAgICAgICAjIE1hbmFnZXIgc2hvdWxkIGFsc28gc2VlIGJvdGggc2VydmVycwogICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh3aXpfbWdyLnNob3dfc2VydmVycykKICAgICAgICAjIEVuZm9yY2VtZW50IHNob3VsZCBub3Qgb3ZlcnJpZGUgbWFuYWdlcidzIGNob2ljZSBvZiAnc2hhcmVkJwogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwod2l6X21nci5hcHBsaWNhYmlsaXR5LCAic2hhcmVkIikKCiAgICBkZWYgdGVzdF9yZXF1aXJlZF92YXJpYWJsZV92YWxpZGF0aW9uKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIFdpemFyZCBtdXN0IGJsb2NrIGV4ZWN1dGlvbiB3aGVuIGEgcmVxdWlyZWQgdmFyaWFibGUgaXMgZW1wdHkKICAgICAgICBhbmQgYWxsb3cgaXQgYWZ0ZXIgdGhlIHZhbHVlIGlzIHByb3ZpZGVkLgogICAgICAgICIiIgogICAgICAgICMgQ3JlYXRlIGEgcmVxdWlyZWQgdmFyaWFibGUKICAgICAgICB2YXIgPSBzZWxmLlZhcmlhYmxlLmNyZWF0ZSgKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIm5hbWUiOiAiUmVxIFZhciIsCiAgICAgICAgICAgICAgICAicmVmZXJlbmNlIjogInJlcV92YXIiLAogICAgICAgICAgICAgICAgInZhcmlhYmxlX3R5cGUiOiAicyIsCiAgICAgICAgICAgIH0KICAgICAgICApCiAgICAgICAgc2VsZi5WYXJpYWJsZVZhbHVlLmNyZWF0ZSgKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgInZhcmlhYmxlX2lkIjogdmFyLmlkLAogICAgICAgICAgICAgICAgInNlcnZlcl9pZCI6IHNlbGYuc2VydmVyX3Rlc3RfMS5pZCwKICAgICAgICAgICAgICAgICJyZXF1aXJlZCI6IFRydWUsCiAgICAgICAgICAgICAgICAidmFsdWVfY2hhciI6ICIiLAogICAgICAgICAgICB9CiAgICAgICAgKQoKICAgICAgICAjIENyZWF0ZSBjb21tYW5kIHRoYXQgdXNlcyB0aGlzIHZhcmlhYmxlCiAgICAgICAgY21kID0gc2VsZi5Db21tYW5kLmNyZWF0ZSgKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIm5hbWUiOiAiRWNobyBSZXEgVmFyIiwKICAgICAgICAgICAgICAgICJhY3Rpb24iOiAic3NoX2NvbW1hbmQiLAogICAgICAgICAgICAgICAgImNvZGUiOiAiZWNobyB7eyByZXFfdmFyIH19IiwKICAgICAgICAgICAgICAgICJ2YXJpYWJsZV9pZHMiOiBbKDQsIHZhci5pZCldLAogICAgICAgICAgICB9CiAgICAgICAgKQoKICAgICAgICBzZWxmLnNlcnZlcl90ZXN0XzEud3JpdGUoeyJ1c2VyX2lkcyI6IFsoNCwgc2VsZi5tYW5hZ2VyLmlkKV19KQoKICAgICAgICAjIENyZWF0ZSB3aXphcmQgYXMgbWFuYWdlciB1c2VyCiAgICAgICAgd2l6ID0gKAogICAgICAgICAgICBzZWxmLmVudlsiY3gudG93ZXIuY29tbWFuZC5ydW4ud2l6YXJkIl0KICAgICAgICAgICAgLndpdGhfdXNlcihzZWxmLm1hbmFnZXIpCiAgICAgICAgICAgIC5jcmVhdGUoCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgInNlcnZlcl9pZHMiOiBbc2VsZi5zZXJ2ZXJfdGVzdF8xLmlkXSwKICAgICAgICAgICAgICAgICAgICAiY29tbWFuZF9pZCI6IGNtZC5pZCwKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgKQogICAgICAgICkKCiAgICAgICAgIyBDcmVhdGUgbGluZXMgb2YgY29uZmlndXJhdGlvbgogICAgICAgIHdpei5fb25jaGFuZ2VfY29tbWFuZF92YXJpYWJsZV9pZHMoKQogICAgICAgIHdpei5fY29tcHV0ZV9oYXNfbWlzc2luZ19yZXF1aXJlZF92YWx1ZXMoKQoKICAgICAgICAjIFRlc3QgYmxvY2tpbmcgYmVoYXZpb3IKICAgICAgICBzZWxmLmFzc2VydFRydWUod2l6Lmhhc19taXNzaW5nX3JlcXVpcmVkX3ZhbHVlcykKICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbGlkYXRpb25FcnJvcik6CiAgICAgICAgICAgIHdpei5ydW5fY29tbWFuZF9vbl9zZXJ2ZXIoKQoKICAgICAgICAjIEZpbGwgdGhlIHZhbHVlIGRpcmVjdGx5IGluIHRoZSB3aXphcmQgbGluZQogICAgICAgIHdpei5jdXN0b21fdmFyaWFibGVfdmFsdWVfaWRzLmZpbHRlcmVkKAogICAgICAgICAgICBsYW1iZGEgbGluZTogbGluZS52YXJpYWJsZV9pZCA9PSB2YXIKICAgICAgICApLnZhbHVlX2NoYXIgPSAiZmlsbGVkIgoKICAgICAgICAjIFJlY29tcHV0ZSB0aGUgZmxhZwogICAgICAgIHdpei5fY29tcHV0ZV9oYXNfbWlzc2luZ19yZXF1aXJlZF92YWx1ZXMoKQogICAgICAgIHNlbGYuYXNzZXJ0RmFsc2Uod2l6Lmhhc19taXNzaW5nX3JlcXVpcmVkX3ZhbHVlcykKCiAgICAgICAgIyBOb3cgdGhlIGV4ZWN1dGlvbiBzaG91bGQgcGFzcwogICAgICAgIHdpei5ydW5fY29tbWFuZF9vbl9zZXJ2ZXIoKQo= \ No newline at end of file