{"remainingRequest":"D:\\jenkins\\workspace\\bzzgj-fvue\\node_modules\\@vue\\cli-plugin-babel\\node_modules\\thread-loader\\dist\\cjs.js!D:\\jenkins\\workspace\\bzzgj-fvue\\node_modules\\babel-loader\\lib\\index.js!D:\\jenkins\\workspace\\bzzgj-fvue\\node_modules\\@vue\\cli-plugin-babel\\node_modules\\cache-loader\\dist\\cjs.js??ref--0-0!D:\\jenkins\\workspace\\bzzgj-fvue\\node_modules\\vue-loader\\lib\\index.js??vue-loader-options!D:\\jenkins\\workspace\\bzzgj-fvue\\src\\components\\eipControl\\EipSunDialog.vue?vue&type=script&lang=js&","dependencies":[{"path":"D:\\jenkins\\workspace\\bzzgj-fvue\\src\\components\\eipControl\\EipSunDialog.vue","mtime":1705895419251},{"path":"D:\\jenkins\\workspace\\bzzgj-fvue\\babel.config.js","mtime":1725536844935},{"path":"D:\\jenkins\\workspace\\bzzgj-fvue\\node_modules\\@vue\\cli-plugin-babel\\node_modules\\cache-loader\\dist\\cjs.js","mtime":499162500000},{"path":"D:\\jenkins\\workspace\\bzzgj-fvue\\node_modules\\@vue\\cli-plugin-babel\\node_modules\\thread-loader\\dist\\cjs.js","mtime":499162500000},{"path":"D:\\jenkins\\workspace\\bzzgj-fvue\\node_modules\\babel-loader\\lib\\index.js","mtime":456789000000},{"path":"D:\\jenkins\\workspace\\bzzgj-fvue\\node_modules\\@vue\\cli-plugin-babel\\node_modules\\cache-loader\\dist\\cjs.js","mtime":499162500000},{"path":"D:\\jenkins\\workspace\\bzzgj-fvue\\node_modules\\vue-loader\\lib\\index.js","mtime":499162500000}],"contextDependencies":[],"result":[{"type":"Buffer","data":"base64:aW1wb3J0IF90b0NvbnN1bWFibGVBcnJheSBmcm9tICJEOi9qZW5raW5zL3dvcmtzcGFjZS9ienpnai1mdnVlL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS90b0NvbnN1bWFibGVBcnJheS5qcyI7CmltcG9ydCBfYXN5bmNUb0dlbmVyYXRvciBmcm9tICJEOi9qZW5raW5zL3dvcmtzcGFjZS9ienpnai1mdnVlL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9hc3luY1RvR2VuZXJhdG9yLmpzIjsKaW1wb3J0ICJyZWdlbmVyYXRvci1ydW50aW1lL3J1bnRpbWUuanMiOwppbXBvcnQgImNvcmUtanMvbW9kdWxlcy9lcy5lcnJvci5jYXVzZS5qcyI7CmltcG9ydCAiY29yZS1qcy9tb2R1bGVzL2VzLmFycmF5LmZpbHRlci5qcyI7CmltcG9ydCAiY29yZS1qcy9tb2R1bGVzL2VzLmFycmF5LnB1c2guanMiOwppbXBvcnQgImNvcmUtanMvbW9kdWxlcy9lcy5hcnJheS5zcGxpY2UuanMiOwppbXBvcnQgImNvcmUtanMvbW9kdWxlcy9lcy5mdW5jdGlvbi5uYW1lLmpzIjsKaW1wb3J0ICJjb3JlLWpzL21vZHVsZXMvZXMuaXRlcmF0b3IuY29uc3RydWN0b3IuanMiOwppbXBvcnQgImNvcmUtanMvbW9kdWxlcy9lcy5pdGVyYXRvci5maWx0ZXIuanMiOwppbXBvcnQgImNvcmUtanMvbW9kdWxlcy9lcy5pdGVyYXRvci5mb3ItZWFjaC5qcyI7CmltcG9ydCAiY29yZS1qcy9tb2R1bGVzL2VzLmpzb24uc3RyaW5naWZ5LmpzIjsKaW1wb3J0ICJjb3JlLWpzL21vZHVsZXMvZXMub2JqZWN0LmtleXMuanMiOwppbXBvcnQgImNvcmUtanMvbW9kdWxlcy9lcy5vYmplY3QudG8tc3RyaW5nLmpzIjsKaW1wb3J0ICJjb3JlLWpzL21vZHVsZXMvZXMucmVnZXhwLmNvbnN0cnVjdG9yLmpzIjsKaW1wb3J0ICJjb3JlLWpzL21vZHVsZXMvZXMucmVnZXhwLmRvdC1hbGwuanMiOwppbXBvcnQgImNvcmUtanMvbW9kdWxlcy9lcy5yZWdleHAuZXhlYy5qcyI7CmltcG9ydCAiY29yZS1qcy9tb2R1bGVzL2VzLnJlZ2V4cC5zdGlja3kuanMiOwppbXBvcnQgImNvcmUtanMvbW9kdWxlcy9lcy5yZWdleHAudG8tc3RyaW5nLmpzIjsKaW1wb3J0ICJjb3JlLWpzL21vZHVsZXMvZXMuc3RyaW5nLnJlcGxhY2UuanMiOwppbXBvcnQgImNvcmUtanMvbW9kdWxlcy9lcy5zdHJpbmcuc2VhcmNoLmpzIjsKaW1wb3J0ICJjb3JlLWpzL21vZHVsZXMvd2ViLmRvbS1jb2xsZWN0aW9ucy5mb3ItZWFjaC5qcyI7Ci8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCgppbXBvcnQgeyBtYXBTdGF0ZSB9IGZyb20gJ3Z1ZXgnOwppbXBvcnQgdXRpbHMgZnJvbSAnQC91dGlscy5qcyc7CmltcG9ydCBob3RlbnRVaVV0aWxzIGZyb20gJ0AvaG90ZW50LXVpLXV0aWwuanMnOwppbXBvcnQgeyBNZXNzYWdlIH0gZnJvbSAnZWxlbWVudC11aSc7CmltcG9ydCByZXEgZnJvbSAnQC9yZXF1ZXN0LmpzJzsKaW1wb3J0IHN1Yl9waW9fbWl4aW4gZnJvbSAnQC9zdWItcGVybWlzc2lvbi1taXhpbi5qcyc7CmltcG9ydCBFaXBUYWcgZnJvbSAnQC9jb21wb25lbnRzL2VpcENvbnRyb2wvRWlwVGFnLnZ1ZSc7CmltcG9ydCBFaXBTZWxlY3REaWEgZnJvbSAnQC9jb21wb25lbnRzL2VpcENvbnRyb2wvRWlwU2VsZWN0RGlhLnZ1ZSc7CmV4cG9ydCBkZWZhdWx0IHsKICBjb21wb25lbnRzOiB7CiAgICBFaXBUYWc6IEVpcFRhZywKICAgIEVpcFNlbGVjdERpYTogRWlwU2VsZWN0RGlhCiAgfSwKICBuYW1lOiAnZWlwLWRpYWxvZycsCiAgcHJvcHM6IFsndmFsaWRhdGUnLCAndmFsdWUnLCAnbmFtZScsICdwZXJtaXNzaW9uJywgJ2F0dGVyJywgJ3NpbmdsZScsICdzZWxlY3RvcmNvbmZpZycsICdjdXN0ZGlhbG9nJywgJ3BsYWNlaG9sZGVyJywgJ3Rvb2x0aXBwbGFjZW1lbnQnLCAnaW5pdEZpbGxEYXRhJywgJ2luaXRGaWxsRGF0YVR5cGUnLCAncmVsYXRpb24nLCAnbWF4Um93J10sCiAgbWl4aW5zOiBbc3ViX3Bpb19taXhpbl0sCiAgLy/mt7flhaXmlrnlvI/lvJXlhaXooajljZXnu4Tku7bkuK3lhazlhbHlsZ7mgKfvvIzlpITnkIblrZDooajjgIHlrZnooajooYzlhoXogZTliqjvvIjliIfpnaLkv67mlLlwZXJtaXNzaW9uX3N1Yu+8iQogIGRhdGE6IGZ1bmN0aW9uIGRhdGEoKSB7CiAgICByZXR1cm4gewogICAgICBkYXRhOiB7CiAgICAgICAgcXhkZDoge30KICAgICAgfSwKICAgICAgaW5wdXRTdWZmaXhXaWR0aDogMCwKICAgICAgcGxhY2Vob2xkZXJCbzogJycsCiAgICAgIHF1aWNrU2VhcmNoOiAnJywKICAgICAgLy/loavlhpnmj5DnpLoKICAgICAgY29uZGl0aW9uQmluZDogW10sCiAgICAgIC8v5Y+C5pWw5p+l6K+i5a2X5q61CiAgICAgIG5vZGVLZXk6ICdJRF8nLAogICAgICAvL+agkeW9ouaVsOaNrueItklkCiAgICAgIGN1c3RvbURpYWxvZ1Nob3dMaXN0OiBmYWxzZSwKICAgICAgY3VzdG9tRGlhbG9nU2hvd1RyZWU6IGZhbHNlLAogICAgICBzZWxlY3RPcmdQcm9wczogewogICAgICAgIGxhYmVsOiAnbmFtZScKICAgICAgfSwKICAgICAgc3R5bGU6ICcnLAogICAgICAvL+WvueivneahhuWuvemrmAogICAgICBzZWxlY3RPcmdzOiBudWxsLAogICAgICBpbnB1dFN1ZmZpeEhlaWdodDogMzMsCiAgICAgIGNvbmZpZzogbnVsbCwKICAgICAgdXBkYXRpbmc6IGZhbHNlLAogICAgICBkaXNwbGF5ZmllbGQ6IFtdLAogICAgICAvL+aYvuekuuWtl+autQogICAgICBjdXN0b21EaWFsb2c6IHt9LAogICAgICBxdWVyeVBhcmFtOiAnJywKICAgICAgLy/mn6Xor6LmnaHku7bovpPlhaXnmoTlgLwKICAgICAgcHJvcHMxOiBbXSwKICAgICAgc2hvd0RhdGE6IFtdLAogICAgICBjaGVja0JveERhdGFBbGw6IFtdLAogICAgICAvL+mAieS4reWvueixoeeahOmbhuWQiAogICAgICBkZWZhdWx0UHJvcHM6IHsKICAgICAgICBjaGlsZHJlbjogJ2NoaWxkcmVuJywKICAgICAgICBsYWJlbDogJ2xhYmVsJwogICAgICB9LAogICAgICBwcm9wc0RhdGE6IFtdLAogICAgICBxdWVyeXNTaG93OiBmYWxzZSwKICAgICAgLy/mmK/lkKbmmL7npLrmkJzntKLmoYYKICAgICAgdW5kZWZpbmVkYTogJycsCiAgICAgIGlzQ3VycmVudENoYW5nZTogZmFsc2UsCiAgICAgIC8v5piv5ZCm5LiN5omn6KGMIG9yZ1RhYmxlU2VsZWN0aW9u5pa55rOVCiAgICAgIHBhZ2luYXRpb246IHsKICAgICAgICBwYWdlOiAxLAogICAgICAgIHBhZ2VTaXplOiAyMCwKICAgICAgICB0b3RhbDogMAogICAgICB9LAogICAgICBwYXJhbTogW10sCiAgICAgIC8v57uR5a6a55qE6KGo5Y2V5a2X5q61CiAgICAgIHRyZWVMaXN0OiBbXSwKICAgICAgZGlzcGxheUZpZWxkOiB7fSwKICAgICAgcXVlcnlQYXJhbXM6IFtdLAogICAgICBwbGFjZWhvbGRlcnM6IFtdLAogICAgICBvbGRzZWxlY3RPcmdzOiBbXSwKICAgICAgY29tYmluYXRpb25UcmVlRGF0YTogW10sCiAgICAgIGNvbWJpVHJlZURpc3BsYXlGaWVsZDogW10sCiAgICAgIGNvbWJpbmF0aW9uVHJlZVF1ZXJ5czogW10sCiAgICAgIGNvbWJpbmF0aW9uUnVsZToge30sCiAgICAgIHRvZ2dsZUJ0bjogJ2VsLWljb24tYXJyb3ctbGVmdCcsCiAgICAgIHRyZWVTaG93OiB0cnVlLAogICAgICB0cmFuc3Rpb25XaWR0aDogJzI1JScsCiAgICAgIGxlZnRUcmVlVGl0bGU6ICcnLAogICAgICB3cml0ZWFibGU6IHRydWUsCiAgICAgIGlzU2hvdzogdHJ1ZQogICAgfTsKICB9LAogIHdhdGNoOiB7CiAgICBwcm9wczE6IGZ1bmN0aW9uIHByb3BzMShuZXdWYWwsIG9sZFZhbCkgewogICAgICAvL+agkeW9ogogICAgICBpZiAodGhpcy5zaG93RGF0YSAhPSB1bmRlZmluZWQgJiYgdGhpcy5zaG93RGF0YS5sZW5ndGggPiAwKSB7CiAgICAgICAgdmFyIHRoaXNfID0gdGhpczsKICAgICAgICB2YXIgZGF0YSA9IFtdOwogICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5zaG93RGF0YS5sZW5ndGg7IGkrKykgewogICAgICAgICAgZGF0YS5wdXNoKHRoaXMuc2hvd0RhdGFbaV0pOwogICAgICAgIH0KICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHsKICAgICAgICAgIGZvciAodmFyIF9pID0gMDsgX2kgPCBkYXRhLmxlbmd0aDsgX2krKykgewogICAgICAgICAgICB0aGlzXy4kcmVmcy50cmVlLnNldENoZWNrZWQoZGF0YVtfaV0sIHRydWUpOwogICAgICAgICAgICB0aGlzXy5jaGVja05vZGUoZGF0YVtfaV0sIHRoaXNfKTsKICAgICAgICAgIH0KICAgICAgICB9LCAyMDApOwogICAgICB9CiAgICB9CiAgfSwKICBtb3VudGVkOiBmdW5jdGlvbiBtb3VudGVkKCkgewogICAgaWYgKHRoaXMuaW5pdEZpbGxEYXRhKSB7CiAgICAgIHRoaXMuaW5pdFRlbXBsYXRlRGF0YSgpOwogICAgfQogICAgdmFyIHJlcXVlc3RUeXBlID0gd2luZG93LmxvY2F0aW9uLmhyZWYuc3BsaXQoJz8nKVswXS5zcGxpdCgnLycpOwogICAgdmFyIGlzRG9uZUxpc3QgPSB3aW5kb3cubG9jYXRpb24uaHJlZi5zcGxpdCgnLycpOwogICAgaWYgKHJlcXVlc3RUeXBlW3JlcXVlc3RUeXBlLmxlbmd0aCAtIDFdID09ICdnZXQnIHx8IHJlcXVlc3RUeXBlW3JlcXVlc3RUeXBlLmxlbmd0aCAtIDJdID09ICdnZXQnIHx8IGlzRG9uZUxpc3RbaXNEb25lTGlzdC5sZW5ndGggLSAxXSA9PSAnZG9uZUxpc3QnKSB7CiAgICAgIHRoaXMuaXNTaG93ID0gZmFsc2U7CiAgICB9CiAgfSwKICBjb21wdXRlZDogbWFwU3RhdGUoewogICAgdG90YWw6IGZ1bmN0aW9uIHRvdGFsKHN0YXRlKSB7CiAgICAgIHJldHVybiBzdGF0ZS5kaWFsb2cudG90YWw7CiAgICB9LAogICAgZGlhbG9nRGF0YTogZnVuY3Rpb24gZGlhbG9nRGF0YShzdGF0ZSkgewogICAgICByZXR1cm4gc3RhdGUuZGlhbG9nLnJvd3M7CiAgICB9LAogICAgaW5wdXRWYWw6IGZ1bmN0aW9uIGlucHV0VmFsKCkgewogICAgICBpZiAoIXRoaXMudmFsdWUgfHwgdGhpcy52YWx1ZSA9PSAnfHxbXScpIHsKICAgICAgICB0aGlzLmNoZWNrQm94RGF0YUFsbCA9IFtdOwogICAgICAgIC8vIHRoaXMuc2hvd0RhdGEgPSBbXTsKICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgfSBlbHNlIHsKICAgICAgICB2YXIgbmFtZUFyeSA9IHRoaXMudmFsdWUuc3BsaXQoJywnKTsKICAgICAgICBpZiAodGhpcy52YWx1ZS5pbmRleE9mKCd8fCcpID4gMCkgewogICAgICAgICAgbmFtZUFyeSA9IHRoaXMudmFsdWUuc3BsaXQoJ3x8JylbMF0uc3BsaXQoJywnKTsKICAgICAgICAgIC8vIHRoaXMuc2hvd0RhdGE9SlNPTi5wYXJzZSh0aGlzLnZhbHVlLnNwbGl0KCJ8fCIpWzFdKTsKICAgICAgICB9CiAgICAgICAgLy8gIHRoaXMuc2hvd0RhdGEgPXRoaXMuc2VsZWN0T3JnczsKICAgICAgICB2YXIgaWRBcnkgPSBudWxsOwogICAgICAgIHZhciBhY2NvdW50QXJ5ID0gbnVsbDsKICAgICAgICB2YXIgcmVzdWx0ID0gW107CiAgICAgICAgbmFtZUFyeS5mb3JFYWNoKGZ1bmN0aW9uIChtLCBpKSB7CiAgICAgICAgICB2YXIgbiA9IHsKICAgICAgICAgICAgdmFsdWU6IG0KICAgICAgICAgIH07CiAgICAgICAgICByZXN1bHQucHVzaChuKTsKICAgICAgICB9KTsKICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICB9CiAgICB9LAogICAgaW5wdXRXcml0ZWFibGU6IGZ1bmN0aW9uIGlucHV0V3JpdGVhYmxlKCkgewogICAgICByZXR1cm4gdGhpcy53cml0ZWFibGUgPyB1dGlscy5nZXRXcml0ZWFibGUodGhpcy5wZXJtaXNzaW9uX3N1YikgOiB0aGlzLndyaXRlYWJsZTsKICAgIH0sCiAgICBpbnB1dFZhbGlkYXRlOiBmdW5jdGlvbiBpbnB1dFZhbGlkYXRlKCkgewogICAgICB2YXIgdmFsaWRhdGVPYmogPSB0aGlzLiRzdG9yZS5zdGF0ZS5pbmRleC52YWxpZGF0ZTsKICAgICAgcmV0dXJuIHV0aWxzLmFkZFJlcXVpcmVkT3JOb3QodGhpcy5wZXJtaXNzaW9uX3N1YiwgdGhpcy52YWxpZGF0ZSwgdmFsaWRhdGVPYmosIHRoaXMpOwogICAgfSwKICAgIGlucHV0TmFtZTogZnVuY3Rpb24gaW5wdXROYW1lKCkgewogICAgICB2YXIgbGFiZWxkZXNjID0gJyc7CiAgICAgIGlmICh0aGlzLiRzbG90cyAmJiB0aGlzLiRzbG90cy5sYWJlbGRlc2MgJiYgdGhpcy4kc2xvdHMubGFiZWxkZXNjWzBdLmNoaWxkcmVuICYmIHRoaXMuJHNsb3RzLmxhYmVsZGVzY1swXS5jaGlsZHJlblswXS50ZXh0KSB7CiAgICAgICAgbGFiZWxkZXNjID0gdGhpcy4kc2xvdHMubGFiZWxkZXNjWzBdLmNoaWxkcmVuWzBdLnRleHQ7CiAgICAgICAgcmV0dXJuIHRoaXMubmFtZSA/IHRoaXMubmFtZSA6IHV0aWxzLmdldE5hbWUoKSArICctJyArIGxhYmVsZGVzYzsKICAgICAgfSBlbHNlIHsKICAgICAgICByZXR1cm4gdGhpcy5uYW1lID8gdGhpcy5uYW1lIDogdXRpbHMuZ2V0TmFtZSgpOwogICAgICB9CiAgICB9LAogICAgLy8g5piv5ZCm5pyJ5Zue5aGr6K6+572uCiAgICBiaW5kU2V0OiBmdW5jdGlvbiBiaW5kU2V0KCkgewogICAgICByZXR1cm4gdGhpcy5zZWxlY3RvcmNvbmZpZyA/IHRoaXMuc2VsZWN0b3Jjb25maWcuYmluZCA6IG51bGw7CiAgICB9CiAgfSksCiAgY3JlYXRlZDogZnVuY3Rpb24gY3JlYXRlZCgpIHsKICAgIGlmICghdGhpcy5wbGFjZWhvbGRlcikgewogICAgICB0aGlzLnBsYWNlaG9sZGVyQm8gPSAn6K+36YCJ5oup5YaF5a65JzsKICAgIH0gZWxzZSB7CiAgICAgIHRoaXMucGxhY2Vob2xkZXJCbyA9IHRoaXMucGxhY2Vob2xkZXI7CiAgICB9CiAgICB0aGlzLiR2YWxpZGF0b3IgPSB0aGlzLiRyb290LiR2YWxpZGF0b3I7CiAgfSwKICBtZXRob2RzOiB7CiAgICBzZWxlY3RBbGw6IGZ1bmN0aW9uIHNlbGVjdEFsbChzZWxlY3Rpb24pIHsKICAgICAgaWYgKHRoaXMub2xkc2VsZWN0T3JncyAhPSBudWxsICYmIHNlbGVjdGlvbi5sZW5ndGggPiAwKSB7CiAgICAgICAgZm9yICh2YXIgeCA9IDA7IHggPCBzZWxlY3Rpb24ubGVuZ3RoOyB4KyspIHsKICAgICAgICAgIGlmICh0aGlzLmluZGV4QXJyYXkodGhpcy5vbGRzZWxlY3RPcmdzLCBzZWxlY3Rpb25beF0pID09PSAtMSkgewogICAgICAgICAgICB0aGlzLm9sZHNlbGVjdE9yZ3MucHVzaChzZWxlY3Rpb25beF0pOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICB0aGlzLnNlbGVjdE9yZ3MgPSBfLmNsb25lRGVlcCh0aGlzLm9sZHNlbGVjdE9yZ3MpOwogICAgICB9IGVsc2UgewogICAgICAgIHRoaXMuc2VsZWN0T3JncyA9IF8uY2xvbmVEZWVwKHNlbGVjdGlvbik7CiAgICAgIH0KICAgIH0sCiAgICBjaGVja05vZGU6IGZ1bmN0aW9uIGNoZWNrTm9kZShkYXRhLCB0aGlzXywgcG5vZGUpIHsKICAgICAgaWYgKGRhdGEuUGlkKSB7CiAgICAgICAgdmFyIG5vZGUgPSB0aGlzXy4kcmVmcy50cmVlLmdldE5vZGUoZGF0YS5QaWQpOwogICAgICAgIG5vZGUuaW5kZXRlcm1pbmF0ZSA9IHRydWU7CiAgICAgICAgaWYgKG5vZGUuZGF0YS5QaWQpIHsKICAgICAgICAgIHRoaXNfLiRyZWZzLnRyZWUuZ2V0Tm9kZShub2RlLmRhdGEuUGlkKS5pbmRldGVybWluYXRlID0gdHJ1ZTsKICAgICAgICAgIHRoaXMuY2hlY2tOb2RlKHRoaXNfLiRyZWZzLnRyZWUuZ2V0Tm9kZShub2RlLmRhdGEuUGlkKS5kYXRhLCB0aGlzXywgdGhpc18uJHJlZnMudHJlZS5nZXROb2RlKG5vZGUuZGF0YS5QaWQpKTsKICAgICAgICB9CiAgICAgICAgaWYgKCFub2RlLmluZGV0ZXJtaW5hdGUpIHsKICAgICAgICAgIG5vZGUuaW5kZXRlcm1pbmF0ZSA9IHRydWU7CiAgICAgICAgfQogICAgICB9IGVsc2UgaWYgKHBub2RlICYmICFwbm9kZS5pbmRldGVybWluYXRlKSB7CiAgICAgICAgcG5vZGUuaW5kZXRlcm1pbmF0ZSA9IHRydWU7CiAgICAgIH0KICAgIH0sCiAgICAvL+Wbnui9puafpeivogogICAgc2VhcmNoRW50ZXJGdW46IGZ1bmN0aW9uIHNlYXJjaEVudGVyRnVuKGUpIHsKICAgICAgdmFyIGtleUNvZGUgPSB3aW5kb3cuZXZlbnQgPyBlLmtleUNvZGUgOiBlLndoaWNoOwogICAgICBpZiAoa2V5Q29kZSA9PSAxMykgewogICAgICAgIHRoaXMuc2VhcmNoKCk7CiAgICAgIH0KICAgIH0sCiAgICBoYW5kbGVTaXplQ2hhbmdlOiBmdW5jdGlvbiBoYW5kbGVTaXplQ2hhbmdlKHNpemUpIHsKICAgICAgdGhpcy5pc0N1cnJlbnRDaGFuZ2UgPSB0cnVlOwogICAgICAvL+avj+mhteS4i+aLieaYvuekuuaVsOaNrgogICAgICB0aGlzLnBhZ2luYXRpb24ucGFnZVNpemUgPSBzaXplOwogICAgICB0aGlzLnNlYXJjaCgpOwogICAgfSwKICAgIGhhbmRsZUN1cnJlbnRDaGFuZ2U6IGZ1bmN0aW9uIGhhbmRsZUN1cnJlbnRDaGFuZ2UoY3VycmVudFBhZ2UpIHsKICAgICAgdmFyIHRoaXNfID0gdGhpczsKICAgICAgaWYgKHRoaXMuc2VsZWN0T3JncyAhPSB1bmRlZmluZWQgJiYgdGhpcy5zZWxlY3RPcmdzLmxlbmd0aCA+IDApIHsKICAgICAgICB0aGlzLnNlbGVjdE9yZ3MuZm9yRWFjaChmdW5jdGlvbiAocm93KSB7CiAgICAgICAgICB2YXIgcmVzID0gdGhpc18uaW5kZXhBcnJheSh0aGlzXy5jaGVja0JveERhdGFBbGwsIHJvdyk7CiAgICAgICAgICBpZiAocmVzID09IC0xKSB7CiAgICAgICAgICAgIHRoaXNfLmNoZWNrQm94RGF0YUFsbC5wdXNoKHJvdyk7CiAgICAgICAgICB9CiAgICAgICAgfSk7CiAgICAgIH0KICAgICAgdGhpcy5pc0N1cnJlbnRDaGFuZ2UgPSB0cnVlOwogICAgICAvL+eCueWHu+esrOWHoOmhtQogICAgICB0aGlzLnBhZ2luYXRpb24ucGFnZSA9IGN1cnJlbnRQYWdlOwogICAgICB0aGlzLnNlYXJjaCgpOwogICAgfSwKICAgIGNoZWNrTGlzdDogZnVuY3Rpb24gY2hlY2tMaXN0KCkgewogICAgICB2YXIgdGhpc18gPSB0aGlzOwogICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHsKICAgICAgICAvL+WIl+ihqAogICAgICAgIGlmICh0aGlzXy5jaGVja0JveERhdGFBbGwgIT0gdW5kZWZpbmVkICYmIHRoaXNfLmNoZWNrQm94RGF0YUFsbC5sZW5ndGggPiAwKSB7CiAgICAgICAgICB0aGlzXy5jaGVja0JveERhdGFBbGwuZm9yRWFjaChmdW5jdGlvbiAocm93KSB7CiAgICAgICAgICAgIHZhciByZXMgPSB0aGlzXy5pbmRleEFycmF5KHRoaXNfLmRpYWxvZ0RhdGEsIHJvdyk7CiAgICAgICAgICAgIHRoaXNfLnVuZGVmaW5lZGEgPSByZXM7CiAgICAgICAgICAgIGlmIChyZXMgIT0gLTEpIHsKICAgICAgICAgICAgICB0aGlzXy5pc0N1cnJlbnRDaGFuZ2UgPSB0cnVlOwogICAgICAgICAgICAgIHRoaXNfLnRvZ2dsZVJvd1NlbGVjdGlvbihyZXMsIHRydWUpOwogICAgICAgICAgICB9CiAgICAgICAgICB9KTsKICAgICAgICB9CiAgICAgIH0sIDMwMCk7CiAgICB9LAogICAgdG9nZ2xlUm93U2VsZWN0aW9uOiBmdW5jdGlvbiB0b2dnbGVSb3dTZWxlY3Rpb24ocmVzLCB2YWwpIHsKICAgICAgdGhpcy4kcmVmcy5vcmdUYWJsZS50b2dnbGVSb3dTZWxlY3Rpb24odGhpcy5kaWFsb2dEYXRhW3Jlc10sIHZhbCk7CiAgICB9LAogICAgc2hvd0RpYWxvZzogZnVuY3Rpb24gc2hvd0RpYWxvZyhpdGVtKSB7CiAgICAgIHZhciBfdGhpczIgPSB0aGlzOwogICAgICB2YXIgdGhpc18gPSB0aGlzOwogICAgICAvL+esrOS6jOasoeeCueWHu+WtkOihqOWbnuWhq+WvueivneahhiDnrKzkuIDmrKHpgInkuK3nmoTmlbDmja7kuI3mmK/pgInkuK3nirbmgIEKICAgICAgaWYgKHRoaXNfLnNlbGVjdE9yZ3MpIHsKICAgICAgICB0aGlzXy5zZWxlY3RPcmdzLmVtcHR5KCk7CiAgICAgICAgdGhpc18uY2hlY2tCb3hEYXRhQWxsLmVtcHR5KCk7CiAgICAgIH0KICAgICAgdmFyIGFsaWFzID0gdGhpcy5jdXN0ZGlhbG9nLmN1c3REaWFsb2cuYWxpYXM7CiAgICAgIHRoaXMuJHN0b3JlLmRpc3BhdGNoKCdmb3JtL2dldEJ5QWxpYXMnLCBhbGlhcykudGhlbihmdW5jdGlvbiAoY3VzdG9tRGlhbG9nKSB7CiAgICAgICAgaWYgKCFjdXN0b21EaWFsb2cgfHwgIWN1c3RvbURpYWxvZy5hbGlhcykgewogICAgICAgICAgTWVzc2FnZS5lcnJvcign5a+56K+d5qGG5Yir5ZCN44CQJyArIGFsaWFzICsgJ+OAkeS4jeWtmOWcqO+8gScpOwogICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICBpZiAoY3VzdG9tRGlhbG9nLnN0eWxlID09IDEpIHsKICAgICAgICAgIHZhciBkaXNwbGF5bGlzdCA9IEpTT04ucGFyc2UoY3VzdG9tRGlhbG9nLmRpc3BsYXlmaWVsZCk7CiAgICAgICAgICB0aGlzXy5ub2RlS2V5ID0gZGlzcGxheWxpc3QuaWQ7CiAgICAgICAgfQogICAgICAgIC8v5a+56K+d5qGG5oyJ6KGo5Y2V5a2X5q615p+l6K+i77yI5Y+C5pWw5Lyg5YWl55qE77yJCiAgICAgICAgdmFyIGJpbmRMaXN0ID0gdGhpc18uY3VzdGRpYWxvZy5jdXN0RGlhbG9nLmNvbmRpdGlvbnM7CiAgICAgICAgdGhpc18ucGFyYW0gPSBbXTsgLy/nu5HlrprnmoTooajljZXlrZfmrrUKICAgICAgICBpZiAoYmluZExpc3QubGVuZ3RoID4gMCkgewogICAgICAgICAgYmluZExpc3QuZm9yRWFjaChmdW5jdGlvbiAoZWxlKSB7CiAgICAgICAgICAgIC8v57uR5a6a6KGo5Y2V5a2X5q61CiAgICAgICAgICAgIGlmIChlbGUuZGVmYXVsdFR5cGUgPT0gJzMnICYmIGVsZS5iaW5kKSB7CiAgICAgICAgICAgICAgdmFyIG9iaiA9IHt9OwogICAgICAgICAgICAgIG9iai5maWVsZCA9IGVsZS5maWVsZDsKICAgICAgICAgICAgICBvYmouYmluZCA9IGVsZS5iaW5kOwogICAgICAgICAgICAgIHRoaXNfLnBhcmFtLnB1c2gob2JqKTsKICAgICAgICAgICAgfQogICAgICAgICAgfSk7CiAgICAgICAgfQogICAgICAgIC8v5Yik5pat5a+56K+d5qGG5p+l6K+i5piv5ZCm5pyJ5p2h5Lu2CiAgICAgICAgdmFyIHVzZXJJbnB1dExpc3QgPSBKU09OLnBhcnNlKGN1c3RvbURpYWxvZy5jb25kaXRpb25maWVsZCk7CiAgICAgICAgdGhpc18ucXVpY2tTZWFyY2ggPSAnJzsgLy/loavlhpnmj5DnpLogcGxhY2Vob2xkZXIKICAgICAgICB0aGlzXy5jb25kaXRpb25CaW5kID0gW107CiAgICAgICAgdmFyIHF1ZXJ5UGFyYW1zID0gW107CiAgICAgICAgdmFyIHBsYWNlaG9sZGVycyA9IFtdOwogICAgICAgIGlmICh1c2VySW5wdXRMaXN0Lmxlbmd0aCA+IDApIHsKICAgICAgICAgIHVzZXJJbnB1dExpc3QuZm9yRWFjaChmdW5jdGlvbiAoZWxlKSB7CiAgICAgICAgICAgIHZhciBvYmogPSB7fTsKICAgICAgICAgICAgLy/mnaHku7bmn6Xor6Llj4LmlbDvvIjnlKjmiLfovpPlhaXnmoTvvIkg5paH5pys5qGG6L6T5YWlCiAgICAgICAgICAgIGlmIChlbGUuZGVmYXVsdFR5cGUgPT0gJzEnKSB7CiAgICAgICAgICAgICAgb2JqW2VsZS5maWVsZF0gPSAnJzsKICAgICAgICAgICAgICBxdWVyeVBhcmFtcy5wdXNoKG9iaik7CiAgICAgICAgICAgICAgdGhpc18uY29uZGl0aW9uQmluZC5wdXNoKGVsZSk7CiAgICAgICAgICAgICAgcGxhY2Vob2xkZXJzLnB1c2goJ+ivt+i+k+WFpScgKyBlbGUuY29tbWVudCk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0pOwogICAgICAgICAgX3RoaXMyLiRzZXQoX3RoaXMyLCAncXVlcnlQYXJhbXMnLCBxdWVyeVBhcmFtcyk7CiAgICAgICAgICBfdGhpczIuJHNldChfdGhpczIsICdwbGFjZWhvbGRlcnMnLCBwbGFjZWhvbGRlcnMpOwogICAgICAgIH0KICAgICAgICAvL+WIpOaWreaYr+WQpuaYvuekuuadoeS7tuafpeivoui+k+WFpeahhgogICAgICAgIGlmICh0aGlzXy5xdWlja1NlYXJjaCAhPSAnJykgewogICAgICAgICAgdGhpc18ucXVlcnlzU2hvdyA9IHRydWU7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHRoaXNfLnF1ZXJ5c1Nob3cgPSBmYWxzZTsKICAgICAgICB9CiAgICAgICAgdGhpc18ucXVpY2tTZWFyY2ggPSAn6K+36L6T5YWlJyArIF90aGlzMi5xdWlja1NlYXJjaCArICfmn6Xor6InOwogICAgICAgIHRoaXNfLnN0eWxlID0gJ2hlaWdodDonICsgY3VzdG9tRGlhbG9nLmhlaWdodCArICdweCc7CiAgICAgICAgaWYgKHdpbmRvdy5zY3JlZW4uaGVpZ2h0ICYmIHdpbmRvdy5zY3JlZW4uaGVpZ2h0IDw9IDkwMCkgewogICAgICAgICAgX3RoaXMyLnN0eWxlID0gJ2hlaWdodDo0NDBweCc7CiAgICAgICAgfQogICAgICAgIGlmIChjdXN0b21EaWFsb2cuc3R5bGUgPT0gMCB8fCBjdXN0b21EaWFsb2cuc3R5bGUgPT0gMikgewogICAgICAgICAgLy/liJfooagKICAgICAgICAgIHRoaXNfLmN1c3RvbURpYWxvZ1Nob3coewogICAgICAgICAgICBhbGlhczogYWxpYXMsCiAgICAgICAgICAgIGN1c3RvbURpYWxvZzogY3VzdG9tRGlhbG9nCiAgICAgICAgICB9KTsKICAgICAgICB9IGVsc2UgaWYgKGN1c3RvbURpYWxvZy5zdHlsZSA9PSAxKSB7CiAgICAgICAgICAvL+agkeW9ogogICAgICAgICAgdGhpc18uY3VzdG9tRGlhbG9nVHJlZVNob3coewogICAgICAgICAgICBhbGlhczogYWxpYXMsCiAgICAgICAgICAgIGN1c3RvbURpYWxvZzogY3VzdG9tRGlhbG9nCiAgICAgICAgICB9KTsKICAgICAgICB9CiAgICAgIH0pOwogICAgfSwKICAgIC8v5Yik5pat5pWw5o2u5piv5ZCm5YyF5ZCr5p+Q5Liq5a+56LGh77yM5bm26L+U5Zue5pWw5o2u5YyF5ZCr5a+56LGh55qE5LiL5qCHCiAgICBpbmRleEFycmF5OiBmdW5jdGlvbiBpbmRleEFycmF5KGFycmF5LCBpdGVtKSB7CiAgICAgIGlmIChhcnJheS5sZW5ndGggPT0gMCkgewogICAgICAgIHJldHVybiAtMTsKICAgICAgfQogICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFycmF5Lmxlbmd0aDsgaSsrKSB7CiAgICAgICAgaWYgKEpTT04uc3RyaW5naWZ5KGFycmF5W2ldKSA9PSBKU09OLnN0cmluZ2lmeShpdGVtKSkgewogICAgICAgICAgcmV0dXJuIGk7CiAgICAgICAgfQogICAgICB9CiAgICAgIHJldHVybiAtMTsKICAgIH0sCiAgICAvL+eCueWHu+WIl+ihqOafkOS4gOS4quWkjemAieahhuaXtuinpuWPkQogICAgb25UYWJsZVNlbGVjdDogZnVuY3Rpb24gb25UYWJsZVNlbGVjdChyb3dzLCByb3cpIHsKICAgICAgdGhpcy5pc0N1cnJlbnRDaGFuZ2UgPSBmYWxzZTsKICAgICAgLy/liKTmlq3ngrnlh7vliJfooajmlbDmja7ml7blpI3pgInmoYbmmK/lkKbli77pgIkgIHNlbGVjdGVk77yadHJ1ZeS4jeWLvumAie+8jGZhbHNl5Yu+6YCJCiAgICAgIHZhciBzZWxlY3RlZCA9IHRoaXMuc2VsZWN0T3JncyAmJiB0aGlzLnNlbGVjdE9yZ3MubGVuZ3RoID4gMCAmJiB0aGlzLmluZGV4QXJyYXkodGhpcy5zZWxlY3RPcmdzLCByb3cpICE9PSAtMTsKICAgICAgaWYgKHNlbGVjdGVkKSB7CiAgICAgICAgdGhpcy5pc0N1cnJlbnRDaGFuZ2UgPSB0cnVlOwogICAgICAgIHZhciByZXMgPSB0aGlzLmluZGV4QXJyYXkodGhpcy5zZWxlY3RPcmdzLCByb3cpOwogICAgICAgIHRoaXMuc2VsZWN0T3Jncy5zcGxpY2UocmVzLCAxKTsKICAgICAgfQogICAgfSwKICAgIC8v54K55Ye75YiX6KGo5p+Q5LiA5p2h5pWw5o2u5pe26Kem5Y+RCiAgICBvcmdSb3dDbGljazogZnVuY3Rpb24gb3JnUm93Q2xpY2socm93LCBjb2x1bW4sIGV2ZW50KSB7CiAgICAgIGlmICh0aGlzLmN1c3RvbURpYWxvZy5zZWxlY3ROdW0gPT09IDEpIHsKICAgICAgICAkKGV2ZW50LmN1cnJlbnRUYXJnZXQuY2hpbGRyZW5bMF0uY2hpbGRyZW5bMF0uY2hpbGRyZW5bMF0pLnRyaWdnZXIoJ2NsaWNrJyk7CiAgICAgICAgdGhpcy5zZWxlY3RPcmdzID0gW107CiAgICAgICAgdGhpcy5zZWxlY3RPcmdzLnB1c2gocm93KTsKICAgICAgfSBlbHNlIGlmICh0aGlzLmN1c3RvbURpYWxvZy5zZWxlY3ROdW0gIT0gMSkgewogICAgICAgIHRoaXMuaXNDdXJyZW50Q2hhbmdlID0gZmFsc2U7CiAgICAgICAgLy/liKTmlq3ngrnlh7vliJfooajmlbDmja7ml7blpI3pgInmoYbmmK/lkKbli77pgIkgIHNlbGVjdGVk77yadHJ1ZeS4jeWLvumAie+8jGZhbHNl5Yu+6YCJCiAgICAgICAgdmFyIHNlbGVjdGVkID0gdGhpcy5zZWxlY3RPcmdzICYmIHRoaXMuc2VsZWN0T3Jncy5sZW5ndGggPiAwICYmIHRoaXMuaW5kZXhBcnJheSh0aGlzLnNlbGVjdE9yZ3MsIHJvdykgIT09IC0xOwogICAgICAgIGlmIChzZWxlY3RlZCkgewogICAgICAgICAgdGhpcy5pc0N1cnJlbnRDaGFuZ2UgPSB0cnVlOwogICAgICAgICAgdmFyIHJlcyA9IHRoaXMuaW5kZXhBcnJheSh0aGlzLnNlbGVjdE9yZ3MsIHJvdyk7CiAgICAgICAgICB0aGlzLnNlbGVjdE9yZ3Muc3BsaWNlKHJlcywgMSk7CiAgICAgICAgfQogICAgICAgIHRoaXMuJHJlZnMub3JnVGFibGUudG9nZ2xlUm93U2VsZWN0aW9uKHJvdyk7CiAgICAgIH0KICAgIH0sCiAgICAvL+WIl+ihqOWkjemAieahhuacieaUueWPmOaXtuinpuWPkQogICAgb3JnVGFibGVTZWxlY3Rpb246IGZ1bmN0aW9uIG9yZ1RhYmxlU2VsZWN0aW9uKHNlbGVjdGlvbikgewogICAgICAvL+WFqOmAieeahOaDheWGteeJueauiuWkhOeQhijkuLrkuobkuI7ljp/mnKzlip/og73pgLvovpHkuI3lhrLnqoEs5YWI5aSN5Yi25LiA5Lu95pen55qE6YCJ5Lit5pWw5o2uLueEtuWQjuaLv+WIsOWFqOmAieS6i+S7tuS4reWOu+iuoeeulykKICAgICAgdGhpcy5vbGRzZWxlY3RPcmdzID0gXy5jbG9uZURlZXAodGhpcy5zZWxlY3RPcmdzKTsKICAgICAgLy/lpJrpgIkKICAgICAgaWYgKHRoaXMuY3VzdG9tRGlhbG9nLnNlbGVjdE51bSAhPSAxICYmICF0aGlzLmlzQ3VycmVudENoYW5nZSkgewogICAgICAgIGlmIChzZWxlY3Rpb24gJiYgc2VsZWN0aW9uLmxlbmd0aCA+IDApIHsKICAgICAgICAgIGlmIChzZWxlY3Rpb24ubGVuZ3RoID09IDEgJiYgKCF0aGlzLnNlbGVjdE9yZ3MgfHwgdGhpcy5zZWxlY3RPcmdzLmxlbmd0aCA9PSAwKSkgewogICAgICAgICAgICB0aGlzLnNlbGVjdE9yZ3MgPSBzZWxlY3Rpb247CiAgICAgICAgICB9IGVsc2UgaWYgKCghdGhpcy5zZWxlY3RPcmdzIHx8IHRoaXMuc2VsZWN0T3Jncy5sZW5ndGggPT0gMCkgJiYgc2VsZWN0aW9uLmxlbmd0aCA+IDEpIHsKICAgICAgICAgICAgaWYgKCF0aGlzLnNlbGVjdE9yZ3MpIHsKICAgICAgICAgICAgICB0aGlzLnNlbGVjdE9yZ3MgPSBbXTsKICAgICAgICAgICAgfQogICAgICAgICAgICBmb3IgKHZhciBpID0gc2VsZWN0aW9uLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7CiAgICAgICAgICAgICAgdGhpcy5zZWxlY3RPcmdzLnB1c2goc2VsZWN0aW9uW2ldKTsKICAgICAgICAgICAgfQogICAgICAgICAgfSBlbHNlIGlmICh0aGlzLmlzQ3VycmVudENoYW5nZSAmJiBzZWxlY3Rpb24ubGVuZ3RoID49IDEwKSB7CiAgICAgICAgICAgIGlmICghdGhpcy5zZWxlY3RPcmdzKSB7CiAgICAgICAgICAgICAgdGhpcy5zZWxlY3RPcmdzID0gW107CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgZm9yICh2YXIgdSA9IHRoaXMuc2VsZWN0T3Jncy5sZW5ndGggLSAxOyB1ID49IDA7IHUtLSkgewogICAgICAgICAgICAgICAgdmFyIHJlcyA9IHRoaXMuaW5kZXhBcnJheShzZWxlY3Rpb24sIHRoaXMuc2VsZWN0T3Jnc1t1XSk7CiAgICAgICAgICAgICAgICBpZiAocmVzICE9IC0xKSB7CiAgICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0T3Jncy5zcGxpY2UocmVzLCAxKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZm9yICh2YXIgX2kyID0gMDsgX2kyIDwgc2VsZWN0aW9uLmxlbmd0aDsgX2kyKyspIHsKICAgICAgICAgICAgICB0aGlzLnNlbGVjdE9yZ3MucHVzaChzZWxlY3Rpb25bX2kyXSk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGZvciAodmFyIF9pMyA9IHNlbGVjdGlvbi5sZW5ndGggLSAxOyBfaTMgPj0gMDsgX2kzLS0pIHsKICAgICAgICAgICAgICB0aGlzLnNlbGVjdE9yZ3MucHVzaChzZWxlY3Rpb25bX2kzXSk7CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgIH0sCiAgICBkaWFsb2dDb25maXJtOiBmdW5jdGlvbiBkaWFsb2dDb25maXJtKCkgewogICAgICBpZiAoIXRoaXMuc2VsZWN0T3JncyB8fCB0aGlzLnNlbGVjdE9yZ3MubGVuZ3RoID09IDApIHsKICAgICAgICB0aGlzLiRtZXNzYWdlLmVycm9yKCfor7fpgInmi6nmlbDmja7lm57loasnKTsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgICAgdGhpcy5xdWVyeVBhcmFtID0gJyc7CiAgICAgIHRoaXMuY3VzdG9tRGlhbG9nU2hvd0xpc3QgPSBmYWxzZTsKICAgICAgdGhpcy5jYWxhY0lucHV0U3VmZml4SGVpZ2h0KCk7CiAgICAgIHRoaXMuc3luY0lucHV0VmFsdWUoKTsKICAgIH0sCiAgICAvL+mHjee9rgogICAgcmVzZXQ6IGZ1bmN0aW9uIHJlc2V0KCkgewogICAgICB2YXIgX3RoaXMzID0gdGhpczsKICAgICAgdGhpcy5xdWVyeVBhcmFtcy5mb3JFYWNoKGZ1bmN0aW9uIChwYXJhbU9iaikgewogICAgICAgIGZvciAodmFyIGtleSBpbiBwYXJhbU9iaikgewogICAgICAgICAgX3RoaXMzLnF1ZXJ5UGFyYW1zW2tleV0gPSAnJzsKICAgICAgICB9CiAgICAgIH0pOwogICAgICAvL+e7hOWQiOagkemHjee9rgogICAgICBpZiAodGhpcy4kcmVmcy5jb21iaW5hdGlvblRyZWUpIHsKICAgICAgICB2YXIgbm9kZXMgPSB0aGlzLiRyZWZzLmNvbWJpbmF0aW9uVHJlZS5zdG9yZS5ub2Rlc01hcDsKICAgICAgICBmb3IgKHZhciBrZXkgaW4gbm9kZXMpIHsKICAgICAgICAgIG5vZGVzW2tleV0uZXhwYW5kZWQgPSBmYWxzZTsKICAgICAgICB9CiAgICAgIH0KICAgICAgdGhpcy5jb21iaW5hdGlvblRyZWVRdWVyeXMuc3BsaWNlKDApOwogICAgICB0aGlzLnNlYXJjaCh0cnVlKTsKICAgIH0sCiAgICAvL+afpeivogogICAgc2VhcmNoOiBmdW5jdGlvbiBzZWFyY2gocmVzZXRQYWdpbnRpb24pIHsKICAgICAgdmFyIF90aGlzNCA9IHRoaXM7CiAgICAgIHZhciBxdWVyeXMgPSBbXTsgLy/mn6Xor6LmnaHku7YKICAgICAgdmFyIHF1ZXJ5RmlsdGVyID0ge307CiAgICAgIGlmIChKU09OLnN0cmluZ2lmeSh0aGlzLnBhZ2luYXRpb24pID09ICd7fScpIHsKICAgICAgICB0aGlzLnBhZ2luYXRpb24gPSB7CiAgICAgICAgICBwYWdlOiAxLAogICAgICAgICAgcGFnZVNpemU6IDIwLAogICAgICAgICAgc2hvd1RvdGFsOiAndHJ1ZScKICAgICAgICB9OwogICAgICB9CiAgICAgIHZhciBwYWdlQmVhbiA9IHsKICAgICAgICBwYWdlQmVhbjogdGhpcy5wYWdpbmF0aW9uCiAgICAgIH07CiAgICAgIGlmIChyZXNldFBhZ2ludGlvbikgewogICAgICAgIHBhZ2VCZWFuLnBhZ2VCZWFuID0gewogICAgICAgICAgcGFnZTogMSwKICAgICAgICAgIHBhZ2VTaXplOiAyMCwKICAgICAgICAgIHNob3dUb3RhbDogJ3RydWUnCiAgICAgICAgfTsKICAgICAgfQogICAgICAvL+eUqOaIt+i+k+WFpeeahAogICAgICBpZiAodGhpcy5xdWVyeVBhcmFtcy5sZW5ndGggIT0gMCAmJiB0aGlzLnF1ZXJ5UGFyYW1zWzBdICE9ICcnKSB7CiAgICAgICAgdGhpcy5jb25kaXRpb25CaW5kLmZvckVhY2goZnVuY3Rpb24gKGl0ZW0sIGluZGV4KSB7CiAgICAgICAgICBxdWVyeXMucHVzaCh7CiAgICAgICAgICAgIHByb3BlcnR5OiBpdGVtLmZpZWxkLAogICAgICAgICAgICB2YWx1ZTogX3RoaXM0LnF1ZXJ5UGFyYW1zW2l0ZW0uZmllbGRdLAogICAgICAgICAgICBncm91cDogJ21haW4nLAogICAgICAgICAgICBvcGVyYXRpb246ICdMSUtFJywKICAgICAgICAgICAgcmVsYXRpb246ICdBTkQnCiAgICAgICAgICB9KTsKICAgICAgICB9KTsKICAgICAgfQogICAgICAvL+WPguaVsOS8oOWFpeeahOafpeivouaLvOaOpQogICAgICBpZiAodGhpcy5wYXJhbSkgewogICAgICAgIHZhciBwSW5zdCA9IHV0aWxzLmdldE9ubGluZUZvcm1JbnN0YW5jZSh0aGlzKTsKICAgICAgICB0aGlzLnBhcmFtLmZvckVhY2goZnVuY3Rpb24gKGl0ZW0pIHsKICAgICAgICAgIHF1ZXJ5cy5wdXNoKHsKICAgICAgICAgICAgcHJvcGVydHk6IGl0ZW0uZmllbGQsCiAgICAgICAgICAgIHZhbHVlOiB1dGlscy5nZXRWYWx1ZUJ5UGF0aChwSW5zdCwgaXRlbS5iaW5kKSwKICAgICAgICAgICAgZ3JvdXA6ICdtYWluJywKICAgICAgICAgICAgb3BlcmF0aW9uOiAnTElLRScsCiAgICAgICAgICAgIHJlbGF0aW9uOiAnQU5EJwogICAgICAgICAgfSk7CiAgICAgICAgfSk7CiAgICAgIH0KICAgICAgLy/mnaXoh6rnu4TlkIjlr7nor53moYbnmoQKICAgICAgaWYgKHRoaXMuY29tYmluYXRpb25UcmVlUXVlcnlzICYmIHRoaXMuY29tYmluYXRpb25UcmVlUXVlcnlzLmxlbmd0aCAhPSAwKSB7CiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmNvbWJpbmF0aW9uVHJlZVF1ZXJ5cy5sZW5ndGg7IGkrKykgewogICAgICAgICAgcXVlcnlzLnB1c2godGhpcy5jb21iaW5hdGlvblRyZWVRdWVyeXNbaV0pOwogICAgICAgIH0KICAgICAgfQogICAgICBpZiAocXVlcnlzLmxlbmd0aCA+IDApIHsKICAgICAgICBxdWVyeUZpbHRlciA9IHsKICAgICAgICAgIHBhZ2VCZWFuOiBwYWdlQmVhbi5wYWdlQmVhbiwKICAgICAgICAgIHF1ZXJ5czogcXVlcnlzCiAgICAgICAgfTsKICAgICAgICB0aGlzLmN1c3RvbURpYWxvZy5wYWdlQmVhbiA9IHF1ZXJ5RmlsdGVyOwogICAgICAgIHRoaXMuJHN0b3JlLmRpc3BhdGNoKCdkaWFsb2cvZ2V0bGlzdEpzb24nLCB0aGlzLmN1c3RvbURpYWxvZykudGhlbihmdW5jdGlvbiAoKSB7CiAgICAgICAgICBfdGhpczQuY2hlY2tMaXN0KCk7CiAgICAgICAgfSk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgdGhpcy5jdXN0b21EaWFsb2cucGFnZUJlYW4gPSBwYWdlQmVhbjsKICAgICAgICB0aGlzLiRzdG9yZS5kaXNwYXRjaCgnZGlhbG9nL2dldGxpc3RKc29uJywgdGhpcy5jdXN0b21EaWFsb2cpLnRoZW4oZnVuY3Rpb24gKCkgewogICAgICAgICAgX3RoaXM0LmNoZWNrTGlzdCgpOwogICAgICAgIH0pOwogICAgICB9CiAgICB9LAogICAgZG9RdWVyeTogZnVuY3Rpb24gZG9RdWVyeShwYXJhbSkgewogICAgICB2YXIgX3RoaXM1ID0gdGhpczsKICAgICAgcmV0dXJuIF9hc3luY1RvR2VuZXJhdG9yKC8qI19fUFVSRV9fKi9yZWdlbmVyYXRvclJ1bnRpbWUubWFyayhmdW5jdGlvbiBfY2FsbGVlKCkgewogICAgICAgIHZhciBwYXJhbUxvYWREYXRhLCBwSW5zdCwgaSwgYmluZFZhbCwgb2JqLCBxdWVyeVVybCwgcmVxdWVzdE1ldGhvZDsKICAgICAgICByZXR1cm4gcmVnZW5lcmF0b3JSdW50aW1lLndyYXAoZnVuY3Rpb24gX2NhbGxlZSQoX2NvbnRleHQpIHsKICAgICAgICAgIHdoaWxlICgxKSBzd2l0Y2ggKF9jb250ZXh0LnByZXYgPSBfY29udGV4dC5uZXh0KSB7CiAgICAgICAgICAgIGNhc2UgMDoKICAgICAgICAgICAgICBwYXJhbUxvYWREYXRhID0gW107CiAgICAgICAgICAgICAgcEluc3QgPSB1dGlscy5nZXRPbmxpbmVGb3JtSW5zdGFuY2UoX3RoaXM1KTsgLy/ojrflj5blhbPogZTmn6Xor6Lnu5HlrprnmoTooajljZXlj4LmlbAKICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcGFyYW0uY29uZGl0aW9uZmllbGQubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgIGlmIChwYXJhbS5jb25kaXRpb25maWVsZFtpXS5maWVsZFBhdGggIT0gJycpIHsKICAgICAgICAgICAgICAgICAgYmluZFZhbCA9IHV0aWxzLmdldFZhbHVlQnlQYXRoKHBJbnN0LCBwYXJhbS5jb25kaXRpb25maWVsZFtpXS5maWVsZFBhdGgsIG51bGwpOwogICAgICAgICAgICAgICAgICBvYmogPSB7CiAgICAgICAgICAgICAgICAgICAga2V5OiBwYXJhbS5jb25kaXRpb25maWVsZFtpXS5maWVsZCwKICAgICAgICAgICAgICAgICAgICB2YWx1ZTogYmluZFZhbAogICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICBwYXJhbUxvYWREYXRhLnB1c2gob2JqKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgcXVlcnlVcmwgPSBwYXJhbS5kc1R5cGUgPT0gJ2RhdGFTb3VyY2UnID8gJyR7Zm9ybX0vZm9ybS9jdXN0b21RdWVyeS92MS9kb1F1ZXJ5P2FsaWFzPScgKyBwYXJhbS5hbGlhcyArICcmcGFnZT0xJyA6IHBhcmFtLnVybDsKICAgICAgICAgICAgICByZXF1ZXN0TWV0aG9kID0gJ1BPU1QnOyAvL+WmguaenOWFs+iBlOaVsOaNruWIl+ihqOafpeivouaVsOaNruS4jeaYr+aVsOaNrua6kOWImeivt+axguaWueazleS4unJlc3RmdWzphY3nva7nmoTor7fmsYLmlrnlvI8KICAgICAgICAgICAgICBpZiAocGFyYW0uZHNUeXBlICE9ICdkYXRhU291cmNlJykgewogICAgICAgICAgICAgICAgcmVxdWVzdE1ldGhvZCA9IHBhcmFtLnJlcXVlc3RUeXBlOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAvL+afpeivouaVsOaNrgogICAgICAgICAgICAgIHJlcS5yZXF1ZXN0KHsKICAgICAgICAgICAgICAgIHVybDogcXVlcnlVcmwsCiAgICAgICAgICAgICAgICBtZXRob2Q6IHJlcXVlc3RNZXRob2QsCiAgICAgICAgICAgICAgICBkYXRhOiBwYXJhbUxvYWREYXRhCiAgICAgICAgICAgICAgfSkudGhlbihmdW5jdGlvbiAocmVzKSB7CiAgICAgICAgICAgICAgICAvL+WIpOaWreaYr+WQpuacieWFs+iBlOafpeivouaVsOaNrui/lOWbngogICAgICAgICAgICAgICAgaWYgKHJlcy5kYXRhLnJvd3MubGVuZ3RoID4gMCkgewogICAgICAgICAgICAgICAgICAvL+iOt+WPluWFs+iBlOafpeivoui/lOWbnueahOihqOWNleWPguaVsAogICAgICAgICAgICAgICAgICBmb3IgKHZhciBpbyA9IDA7IGlvIDwgcGFyYW0ucmVzdWx0ZmllbGQubGVuZ3RoOyBpbysrKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKHBhcmFtLnJlc3VsdGZpZWxkW2lvXS5maWVsZFBhdGggIT0gJycpIHsKICAgICAgICAgICAgICAgICAgICAgIHZhciB2YWwgPSAnJzsKICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgcmVzLmRhdGEucm93cy5sZW5ndGg7IGorKykgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVzLmRhdGEucm93c1tqXVtwYXJhbS5yZXN1bHRmaWVsZFtpb10uZmllbGRdKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsID0gdmFsICsgcmVzLmRhdGEucm93c1tqXVtwYXJhbS5yZXN1bHRmaWVsZFtpb10uZmllbGRdICsgJywnOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICB2YWwgPSB2YWwuc3Vic3RyaW5nKDAsIHZhbC5sZW5ndGggLSAxKTsKICAgICAgICAgICAgICAgICAgICAgIHZhciBwYXRoQXJyID0gcGFyYW0ucmVzdWx0ZmllbGRbaW9dLmZpZWxkUGF0aC5zcGxpdCgnLicpOwogICAgICAgICAgICAgICAgICAgICAgaWYgKHBhdGhBcnIubGVuZ3RoID09IDMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy/kuLvooagKICAgICAgICAgICAgICAgICAgICAgICAgdXRpbHMuc2V0VmFsdWVCeVBhdGgocEluc3QsIHBhcmFtLnJlc3VsdGZpZWxkW2lvXS5maWVsZFBhdGgsIHZhbCwgbnVsbCk7CiAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHBhdGhBcnIubGVuZ3RoID09IDQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy/lrZDooagKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHN1YkRhdGEgPSBwSW5zdC5kYXRhW3BhdGhBcnJbMV1dW3BhdGhBcnJbMl1dOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3ViRGF0YS5sZW5ndGggPT0gMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgIC8v5a2Q6KGo5rKh5pWw5o2u55qE5oOF5Ya1CiAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHN1YlRhYk5hbWUgPSBwYXRoQXJyWzJdLnJlcGxhY2UoJ3N1Yl8nLCAnJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgLy/lvpfliLDlrZDooajnmoTmiYDmnInlrZfmrrUKICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgc3ViSW5pdERhdGEgPSBwSW5zdC5kYXRhW3BhdGhBcnJbMV1dLmluaXREYXRhW3N1YlRhYk5hbWVdIHx8IHt9OwogICAgICAgICAgICAgICAgICAgICAgICAgIC8v5oqK5pWw57uE6YeM6Z2i55qE5YC85Li6IG51bGwg6L2s5o2i5Li656m65a2X56ym5LiyCiAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHN0ciA9IEpTT04uc3RyaW5naWZ5KHN1YkluaXREYXRhKS5yZXBsYWNlKC9udWxsL2csICciIicpOwogICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBfc3ViRGF0YSA9IEpTT04ucGFyc2Uoc3RyKTsKICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBrZXkgaW4gX3N1YkRhdGEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8v54K55re75Yqg5pe25Yik5pat6KaB5paw5aKe5a2Q6KGo6K6w5b2V5Lit55qE5a2Z6KGo5piv5ZCm5pyJ5YC8CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoa2V5LmluZGV4T2YoJ3N1Yl8nKSA9PSAwICYmIF9zdWJEYXRhW2tleV0ubGVuZ3RoID4gMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfc3ViRGF0YVtrZXldID0gW107IC8v5pyJ5YiZ5riF56m6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL+eCuea3u+WKoOaXtuWIpOaWreimgeaWsOWinuWtkOihqOiusOW9leS4reeahOWtl+auteaYr+WQpuacieWAvAogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKF9zdWJEYXRhW2tleV0pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX3N1YkRhdGFba2V5XSA9ICcnOyAvL+acieWImea4heepugogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAvL+aWsOWinuS4gOadoeaVsOaNrgogICAgICAgICAgICAgICAgICAgICAgICAgIHBJbnN0LmRhdGFbcGF0aEFyclsxXV1bcGF0aEFyclsyXV0ucHVzaChfc3ViRGF0YSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgLy/lr7nor53moYblhbPogZTmn6Xor6Lov5Tlm57nmoTlgLzotYvlgLznu5nnu5HlrprnmoTlrZfmrrUKICAgICAgICAgICAgICAgICAgICAgICAgICB1dGlscy5zZXRWYWx1ZUJ5UGF0aChwSW5zdCwgcGFyYW0ucmVzdWx0ZmllbGRbaW9dLmZpZWxkUGF0aCwgdmFsLCAwKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAvL+WtkOihqOacieaVsOaNrueahOaDheWGtQogICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIHAgPSAwOyBwIDwgc3ViRGF0YS5sZW5ndGg7IHArKykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy/lr7nor53moYblhbPogZTmn6Xor6Lov5Tlm57nmoTlgLzotYvlgLznu5nnu5HlrprnmoTlrZfmrrUKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHV0aWxzLnNldFZhbHVlQnlQYXRoKHBJbnN0LCBwYXJhbS5yZXN1bHRmaWVsZFtpb10uZmllbGRQYXRoLCB2YWwsIHApOwogICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgLy/msqHmnInov5Tlm57nmoTlgLzliJnmuIXnqboKICAgICAgICAgICAgICAgICAgLy/ojrflj5blhbPogZTmn6Xor6Lov5Tlm57nmoTooajljZXlj4LmlbAKICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaW9wID0gMDsgaW9wIDwgcGFyYW0ucmVzdWx0ZmllbGQubGVuZ3RoOyBpb3ArKykgewogICAgICAgICAgICAgICAgICAgIGlmIChwYXJhbS5yZXN1bHRmaWVsZFtpb3BdLmZpZWxkUGF0aCAhPSAnJykgewogICAgICAgICAgICAgICAgICAgICAgdmFyIF9wYXRoQXJyID0gcGFyYW0ucmVzdWx0ZmllbGRbaW9wXS5maWVsZFBhdGguc3BsaXQoJy4nKTsKICAgICAgICAgICAgICAgICAgICAgIGlmIChfcGF0aEFyci5sZW5ndGggPT0gMykgewogICAgICAgICAgICAgICAgICAgICAgICAvL+S4u+ihqAogICAgICAgICAgICAgICAgICAgICAgICAvL+i1i+WAvOe7mee7keWumueahOWtl+autQogICAgICAgICAgICAgICAgICAgICAgICB1dGlscy5zZXRWYWx1ZUJ5UGF0aChwSW5zdCwgcGFyYW0ucmVzdWx0ZmllbGRbaW9wXS5maWVsZFBhdGgsICcnLCBudWxsKTsKICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoX3BhdGhBcnIubGVuZ3RoID09IDQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy/lrZDooagKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIF9zdWJEYXRhMiA9IHBJbnN0LmRhdGFbX3BhdGhBcnJbMV1dW19wYXRoQXJyWzJdXTsKICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgX3AgPSAwOyBfcCA8IF9zdWJEYXRhMi5sZW5ndGg7IF9wKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAvL+WvueivneahhuWFs+iBlOafpeivoui/lOWbnueahOWAvOi1i+WAvOe7mee7keWumueahOWtl+autQogICAgICAgICAgICAgICAgICAgICAgICAgIHV0aWxzLnNldFZhbHVlQnlQYXRoKHBJbnN0LCBwYXJhbS5yZXN1bHRmaWVsZFtpb3BdLmZpZWxkUGF0aCwgJycsIF9wKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH0pOwogICAgICAgICAgICBjYXNlIDc6CiAgICAgICAgICAgIGNhc2UgImVuZCI6CiAgICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0LnN0b3AoKTsKICAgICAgICAgIH0KICAgICAgICB9LCBfY2FsbGVlKTsKICAgICAgfSkpKCk7CiAgICB9LAogICAgLy8g5ZCM5q2l6YCJ5oup57uT5p6cCiAgICBzeW5jSW5wdXRWYWx1ZTogZnVuY3Rpb24gc3luY0lucHV0VmFsdWUoKSB7CiAgICAgIHZhciByZXR1cm5TdHIgPSBKU09OLnBhcnNlKHRoaXMuY3VzdG9tRGlhbG9nLnJlc3VsdGZpZWxkKTsKICAgICAgLy/mi7/liLDov5Tlm57nmoTlrZfmrrUKICAgICAgdmFyIGZpZWxkID0gbmV3IEFycmF5KFtyZXR1cm5TdHIubGVuZ3RoXSk7CiAgICAgIHZhciBjb21tZW50ID0gbmV3IEFycmF5KFtyZXR1cm5TdHIubGVuZ3RoXSk7CiAgICAgIHZhciBzdHIgPSBbXTsKICAgICAgdmFyIGlkcyA9IFtdOwogICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHJldHVyblN0ci5sZW5ndGg7IGkrKykgewogICAgICAgIGZpZWxkW2ldID0gdGhpcy5jdXN0b21EaWFsb2cuZHNUeXBlID09ICdkYXRhU291cmNlJyA/IHJldHVyblN0cltpXS5maWVsZC50b0xvd2VyQ2FzZSgpIDogcmV0dXJuU3RyW2ldLmZpZWxkOwogICAgICAgIGNvbW1lbnRbaV0gPSB0aGlzLmN1c3RvbURpYWxvZy5kc1R5cGUgPT0gJ2RhdGFTb3VyY2UnID8gcmV0dXJuU3RyW2ldLmNvbW1lbnQudG9Mb3dlckNhc2UoKSA6IHJldHVyblN0cltpXS5jb21tZW50OwogICAgICB9CiAgICAgIHZhciB0aGlzXyA9IHRoaXM7CiAgICAgIHRoaXMuc2VsZWN0T3Jncy5mb3JFYWNoKGZ1bmN0aW9uIChyb3cpIHsKICAgICAgICBpZiAodGhpc18uY2hlY2tCb3hEYXRhQWxsIHx8IHRoaXNfLmNoZWNrQm94RGF0YUFsbC5sZW5ndGggPCAxKSB7CiAgICAgICAgICB0aGlzXy5jaGVja0JveERhdGFBbGwucHVzaChyb3cpOwogICAgICAgIH0gZWxzZSBpZiAoSlNPTi5zdHJpbmdpZnkodGhpc18uaW5kZXhBcnJheSkuaW5kZXhPZihKU09OLnN0cmluZ2lmeShyb3cpKSA9PSAtMSkgewogICAgICAgICAgdGhpc18uY2hlY2tCb3hEYXRhQWxsLnB1c2gocm93KTsKICAgICAgICB9CiAgICAgIH0pOwogICAgICB2YXIgcyA9IHRoaXMuc2VsZWN0T3JnczsKICAgICAgaWYgKHRoaXMuY3VzdG9tRGlhbG9nLnNlbGVjdE51bSA9PT0gMSkgewogICAgICAgIHZhciB0ZW1wID0gJyc7CiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjb21tZW50Lmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICB2YXIgZW5jb2RlU3RyID0gZW5jb2RlVVJJQ29tcG9uZW50KHNbMF1bZmllbGRbaV1dKTsKICAgICAgICAgIHRlbXAgKz0gJyInICsgY29tbWVudFtpXSArICciOiInICsgZW5jb2RlU3RyICsgJyIsJzsKICAgICAgICB9CiAgICAgICAgaWYgKHRlbXAgIT0gJycpIHsKICAgICAgICAgIHRlbXAgPSAneycgKyB0ZW1wLnN1YnN0cmluZygwLCB0ZW1wLmxlbmd0aCAtIDEpICsgJ30nOwogICAgICAgIH0KICAgICAgICBzdHIucHVzaChKU09OLnBhcnNlKHRlbXApKTsKICAgICAgICBpZHMucHVzaChzWzBdLmlkKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgIHZhciB0ZW1wID0gJyc7CiAgICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IGNvbW1lbnQubGVuZ3RoOyBqKyspIHsKICAgICAgICAgICAgdmFyIF9lbmNvZGVTdHIgPSBlbmNvZGVVUklDb21wb25lbnQoc1tpXVtmaWVsZFtqXV0pOwogICAgICAgICAgICB0ZW1wICs9ICciJyArIGNvbW1lbnRbal0gKyAnIjoiJyArIF9lbmNvZGVTdHIgKyAnIiwnOwogICAgICAgICAgfQogICAgICAgICAgaWYgKHRlbXAgIT0gJycpIHsKICAgICAgICAgICAgdGVtcCA9ICd7JyArIHRlbXAuc3Vic3RyaW5nKDAsIHRlbXAubGVuZ3RoIC0gMSkgKyAnfSc7CiAgICAgICAgICB9CiAgICAgICAgICBzdHIucHVzaChKU09OLnBhcnNlKHRlbXApKTsKICAgICAgICAgIGlkcy5wdXNoKHNbaV0uaWQpOwogICAgICAgIH0KICAgICAgfQogICAgICB2YXIgcmV0dXJuRGF0YSA9IHN0cjsKICAgICAgdmFyIF90aGlzID0gdGhpczsKICAgICAgdmFyIGZvcm1JbnN0ID0gdXRpbHMuZ2V0T25saW5lRm9ybUluc3RhbmNlKHRoaXMpOwogICAgICB0cnkgewogICAgICAgIHZhciByZXR1cm5TaXplID0gcmV0dXJuRGF0YS5sZW5ndGg7CiAgICAgICAgLy/liKTmlq3mmK/lkKbmmK/kuIDlr7nkuIDlrZnooagKICAgICAgICBpZiAoX3RoaXMucmVsYXRpb24gJiYgX3RoaXMucmVsYXRpb24gPT0gJ29uZXRvb25lJykgewogICAgICAgICAgaWYgKHJldHVyblNpemUgPiAxKSB7CiAgICAgICAgICAgIHRoaXNfLiRtZXNzYWdlLmVycm9yKCfkuIDlr7nkuIDlrZnooajlj6rog73pgInmi6nkuIDmnaHmlbDmja4nKTsKICAgICAgICAgICAgdGhpc18uY3VzdG9tRGlhbG9nU2hvd0xpc3QgPSB0cnVlOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybkRhdGEuZm9yRWFjaChmdW5jdGlvbiAocm93KSB7CiAgICAgICAgICB2YXIgdGFyZ2V0QXJyYXkgPSBudWxsOwogICAgICAgICAgdmFyIHN1YkxpbmVEYXRhID0ge307CiAgICAgICAgICBfdGhpcy5jdXN0ZGlhbG9nLmN1c3REaWFsb2cubWFwcGluZ0NvbmYuZm9yRWFjaChmdW5jdGlvbiAoY29uKSB7CiAgICAgICAgICAgIGlmIChjb24udGFyZ2V0WzBdKSB7CiAgICAgICAgICAgICAgdGFyZ2V0QXJyYXkgPSBjb24udGFyZ2V0WzBdLnNwbGl0KCcuJyk7CiAgICAgICAgICAgICAgdmFyIGZyb20gPSAnJzsKICAgICAgICAgICAgICBpZiAoX3RoaXMuY3VzdG9tRGlhbG9nLmRzVHlwZSA9PSAncmVzdGZ1bCcpIHsKICAgICAgICAgICAgICAgIGZyb20gPSBjb24uZnJvbTsKICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgZnJvbSA9IGNvbi5mcm9tLnRvTG93ZXJDYXNlKCk7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIHN1YkxpbmVEYXRhW3RhcmdldEFycmF5W3RhcmdldEFycmF5Lmxlbmd0aCAtIDFdXSA9IGRlY29kZVVSSUNvbXBvbmVudChyb3dbZnJvbV0pOwogICAgICAgICAgICB9CiAgICAgICAgICB9KTsKICAgICAgICAgIGlmICh0YXJnZXRBcnJheSkgewogICAgICAgICAgICAvL+WtkOihqOeahOS4i+aghwogICAgICAgICAgICB2YXIgc3ViSW5kZXggPSB1dGlscy5nZXRTb21lQXR0cmlidXRlRnJvbVBhcmVudEVsZW1lbnQoX3RoaXMuJGVsLCAnZGF0YS1pbmRleCcpOwogICAgICAgICAgICAvL+WIpOaWreWtmeihqOaYr+WQpuetieS6juepugogICAgICAgICAgICBpZiAoIWZvcm1JbnN0WydkYXRhJ11bdGFyZ2V0QXJyYXlbMF1dW3RhcmdldEFycmF5WzFdXVtzdWJJbmRleF1bdGFyZ2V0QXJyYXlbMl1dKSB7CiAgICAgICAgICAgICAgLy/lpoLmnpznrYnkuo7nqbrliJnorqnlroPnrYnkuo7nqbrmlbDnu4QKICAgICAgICAgICAgICBmb3JtSW5zdFsnZGF0YSddW3RhcmdldEFycmF5WzBdXVt0YXJnZXRBcnJheVsxXV1bc3ViSW5kZXhdW3RhcmdldEFycmF5WzJdXSA9IG5ldyBBcnJheSgpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHZhciBzdWJCbyA9IGZvcm1JbnN0WydkYXRhJ11bdGFyZ2V0QXJyYXlbMF1dW3RhcmdldEFycmF5WzFdXVtzdWJJbmRleF1bdGFyZ2V0QXJyYXlbMl1dOwogICAgICAgICAgICAvL+WIpOaWreaYr+WQpuWkp+S6juWtmeihqOaVsOaNruacgOWkp+ihjOaVsAogICAgICAgICAgICBpZiAodGhpc18ubWF4Um93ICE9IDAgJiYgc3ViQm8ubGVuZ3RoICsgcmV0dXJuU2l6ZSA+IHRoaXNfLm1heFJvdykgewogICAgICAgICAgICAgIHRoaXNfLiRtZXNzYWdlLmVycm9yKCflrZnooajmlbDmja7lt7LotoXov4fmnIDlpKfooYzmlbDjgJAnICsgdGhpc18ubWF4Um93ICsgJ+OAkScpOwogICAgICAgICAgICAgIHRoaXNfLmN1c3RvbURpYWxvZ1Nob3dMaXN0ID0gdHJ1ZTsKICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0VuZEl0ZXJhdGl2ZScpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8v5Yik5pat5piv5ZCm5piv5LiA5a+55LiA5a2Z6KGoCiAgICAgICAgICAgIGlmIChfdGhpcy5yZWxhdGlvbiAmJiBfdGhpcy5yZWxhdGlvbiA9PSAnb25ldG9vbmUnKSB7CiAgICAgICAgICAgICAgc3ViQm8uZW1wdHkoKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBzdWJCby5wdXNoKHN1YkxpbmVEYXRhKTsKICAgICAgICAgICAgcmV0dXJuU2l6ZS0tOwogICAgICAgICAgfQogICAgICAgIH0pOwogICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgaWYgKGUubWVzc2FnZSAhPSAnRW5kSXRlcmF0aXZlJykgdGhyb3cgZTsKICAgICAgfQogICAgfSwKICAgIC8v5Y+W5raI5oyJ6ZKuCiAgICBkaWFsb2dDYW5jZWw6IGZ1bmN0aW9uIGRpYWxvZ0NhbmNlbCgpIHsKICAgICAgdmFyIF90aGlzNiA9IHRoaXM7CiAgICAgIHZhciB0aGlzXyA9IHRoaXM7CiAgICAgIHRoaXNfLnF1ZXJ5UGFyYW0gPSAnJzsKICAgICAgdGhpc18uJHN0b3JlLmRpc3BhdGNoKCdkaWFsb2cvc2V0RGlhbG9nRGF0YScsIFtdKS50aGVuKGZ1bmN0aW9uICgpIHsKICAgICAgICB0aGlzXy5jdXN0b21EaWFsb2dTaG93TGlzdCA9IGZhbHNlOwogICAgICAgIC8v5Yik5pat5piv5ZCm5piv54K55Ye75LqG56Gu6K6k5YaN54K55Ye75Y+W5raI55qEICBpbnB1dFZhbOayoeacieWAvOWImeihqOekuuebtOaOpeeCueWHu+eahOWPlua2iAogICAgICAgIGlmICghdGhpc18uaW5wdXRWYWwpIHsKICAgICAgICAgIHRoaXNfLnNlbGVjdE9yZ3MgPSBbXTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgdGhpc18uc2VsZWN0T3JncyA9IF90b0NvbnN1bWFibGVBcnJheSh0aGlzXy5zaG93RGF0YSk7CiAgICAgICAgICBfdGhpczYuY2hlY2tCb3hEYXRhQWxsID0gX3RvQ29uc3VtYWJsZUFycmF5KHRoaXNfLnNlbGVjdE9yZ3MpOwogICAgICAgIH0KICAgICAgfSk7CiAgICB9LAogICAgZGlhbG9nVHJlZUNvbmZpcm06IGZ1bmN0aW9uIGRpYWxvZ1RyZWVDb25maXJtKCkgewogICAgICB2YXIgX3RoaXM3ID0gdGhpczsKICAgICAgdmFyIHRoaXNfID0gdGhpczsKICAgICAgaWYgKHRoaXNfLnByb3BzRGF0YS5sZW5ndGggPT0gMCkgewogICAgICAgIHRoaXNfLiRtZXNzYWdlLmVycm9yKCfor7fpgInmi6nmlbDmja7lm57loasnKTsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgICAgdGhpcy4kc3RvcmUuZGlzcGF0Y2goJ2RpYWxvZy9zZXREaWFsb2dEYXRhJywgW10pOwogICAgICB2YXIgcmV0dXJuU3RyID0gSlNPTi5wYXJzZSh0aGlzLmN1c3RvbURpYWxvZy5yZXN1bHRmaWVsZCk7CiAgICAgIHZhciBmaWVsZCA9IG5ldyBBcnJheShbcmV0dXJuU3RyLmxlbmd0aF0pOwogICAgICB2YXIgY29tbWVudCA9IG5ldyBBcnJheShbcmV0dXJuU3RyLmxlbmd0aF0pOwogICAgICB2YXIgc3RyID0gW107CiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcmV0dXJuU3RyLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgZmllbGRbaV0gPSByZXR1cm5TdHJbaV0uZmllbGQ7CiAgICAgICAgY29tbWVudFtpXSA9IHJldHVyblN0cltpXS5jb21tZW50OwogICAgICB9CiAgICAgIGlmICh0aGlzLmN1c3RvbURpYWxvZy5zZWxlY3ROdW0gPT09IDEpIHsKICAgICAgICB2YXIgbm9kZXMgPSB0aGlzLnByb3BzRGF0YVswXTsKICAgICAgICB2YXIgdGVtcCA9ICcnOwogICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY29tbWVudC5sZW5ndGg7IGkrKykgewogICAgICAgICAgdGVtcCArPSAnIicgKyBjb21tZW50W2ldICsgJyI6IicgKyBub2Rlc1tmaWVsZFtpXV0gKyAnIiwnOwogICAgICAgIH0KICAgICAgICBpZiAodGVtcCAhPSAnJykgewogICAgICAgICAgdGVtcCA9ICd7JyArIHRlbXAuc3Vic3RyaW5nKDAsIHRlbXAubGVuZ3RoIC0gMSkgKyAnfSc7CiAgICAgICAgfQogICAgICAgIHN0ci5wdXNoKEpTT04ucGFyc2UodGVtcCkpOwogICAgICB9IGVsc2UgewogICAgICAgIHZhciBub2RlcyA9IHRoaXMucHJvcHNEYXRhOwogICAgICAgIG5vZGVzLmZvckVhY2goZnVuY3Rpb24gKGl0ZW0sIGspIHsKICAgICAgICAgIHZhciB0ZW1wID0gJyc7CiAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNvbW1lbnQubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgdGVtcCArPSAnIicgKyBjb21tZW50W2ldICsgJyI6IicgKyBub2Rlc1tmaWVsZFtpXV0gKyAnIiwnOwogICAgICAgICAgICB0ZW1wICs9ICciJyArIGNvbW1lbnRbaV0gKyAnIjoiJyArIG5vZGVzW2tdW2ZpZWxkW2ldXSArICciLCc7CiAgICAgICAgICB9CiAgICAgICAgICBpZiAodGVtcCAhPSAnJykgewogICAgICAgICAgICB0ZW1wID0gJ3snICsgdGVtcC5zdWJzdHJpbmcoMCwgdGVtcC5sZW5ndGggLSAxKSArICd9JzsKICAgICAgICAgIH0KICAgICAgICAgIHN0ci5wdXNoKEpTT04ucGFyc2UodGVtcCkpOwogICAgICAgIH0pOwogICAgICB9CiAgICAgIHZhciByZXR1cm5EYXRhID0gc3RyOwogICAgICB2YXIgZm9ybUluc3QgPSB1dGlscy5nZXRPbmxpbmVGb3JtSW5zdGFuY2UodGhpcyk7CiAgICAgIHRyeSB7CiAgICAgICAgdmFyIHJldHVyblNpemUgPSByZXR1cm5EYXRhLmxlbmd0aDsKICAgICAgICAvL+WIpOaWreaYr+WQpuaYr+S4gOWvueS4gOWtmeihqAogICAgICAgIGlmICh0aGlzXy5yZWxhdGlvbiAmJiB0aGlzXy5yZWxhdGlvbiA9PSAnb25ldG9vbmUnKSB7CiAgICAgICAgICBpZiAocmV0dXJuU2l6ZSA+IDEpIHsKICAgICAgICAgICAgdGhpc18uJG1lc3NhZ2UuZXJyb3IoJ+S4gOWvueS4gOWtmeihqOWPquiDvemAieaLqeS4gOadoeaVsOaNricpOwogICAgICAgICAgICB0aGlzXy5jdXN0b21EaWFsb2dTaG93VHJlZSA9IHRydWU7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuRGF0YS5mb3JFYWNoKGZ1bmN0aW9uIChyb3cpIHsKICAgICAgICAgIHZhciB0YXJnZXRBcnJheSA9IG51bGw7CiAgICAgICAgICB2YXIgc3ViTGluZURhdGEgPSB7fTsKICAgICAgICAgIHZhciBwYXRoQXJyYXkgPSBudWxsOwogICAgICAgICAgX3RoaXM3LmN1c3RkaWFsb2cuY3VzdERpYWxvZy5tYXBwaW5nQ29uZi5mb3JFYWNoKGZ1bmN0aW9uIChjb24pIHsKICAgICAgICAgICAgdGFyZ2V0QXJyYXkgPSBudWxsOwogICAgICAgICAgICBpZiAoY29uLnRhcmdldFswXSkgewogICAgICAgICAgICAgIHRhcmdldEFycmF5ID0gY29uLnRhcmdldFswXS5zcGxpdCgnLicpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChjb24udGFyZ2V0WzBdICYmICFwYXRoQXJyYXkpIHsKICAgICAgICAgICAgICBwYXRoQXJyYXkgPSBjb24udGFyZ2V0WzBdLnNwbGl0KCcuJyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdmFyIGZyb20gPSAnJzsKICAgICAgICAgICAgaWYgKHRoaXNfLmN1c3RvbURpYWxvZy5kc1R5cGUgPT0gJ3Jlc3RmdWwnKSB7CiAgICAgICAgICAgICAgZnJvbSA9IGNvbi5mcm9tOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgIGZyb20gPSBjb24uZnJvbTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAodGFyZ2V0QXJyYXkpIHsKICAgICAgICAgICAgICBzdWJMaW5lRGF0YVt0YXJnZXRBcnJheVt0YXJnZXRBcnJheS5sZW5ndGggLSAxXV0gPSByb3dbZnJvbV07CiAgICAgICAgICAgIH0KICAgICAgICAgIH0pOwogICAgICAgICAgaWYgKHBhdGhBcnJheSkgewogICAgICAgICAgICAvL+WtkOihqOeahOS4i+aghwogICAgICAgICAgICB2YXIgc3ViSW5kZXggPSB1dGlscy5nZXRTb21lQXR0cmlidXRlRnJvbVBhcmVudEVsZW1lbnQodGhpc18uJGVsLCAnZGF0YS1pbmRleCcpOwogICAgICAgICAgICAvL+WIpOaWreWtmeihqOaYr+WQpuetieS6juepugogICAgICAgICAgICBpZiAoIWZvcm1JbnN0WydkYXRhJ11bcGF0aEFycmF5WzBdXVtwYXRoQXJyYXlbMV1dW3N1YkluZGV4XVtwYXRoQXJyYXlbMl1dKSB7CiAgICAgICAgICAgICAgLy/lpoLmnpznrYnkuo7nqbrliJnorqnlroPnrYnkuo7nqbrmlbDnu4QKICAgICAgICAgICAgICBmb3JtSW5zdFsnZGF0YSddW3BhdGhBcnJheVswXV1bcGF0aEFycmF5WzFdXVtzdWJJbmRleF1bcGF0aEFycmF5WzJdXSA9IG5ldyBBcnJheSgpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHZhciBzdWJCbyA9IGZvcm1JbnN0WydkYXRhJ11bcGF0aEFycmF5WzBdXVtwYXRoQXJyYXlbMV1dW3N1YkluZGV4XVtwYXRoQXJyYXlbMl1dOwogICAgICAgICAgICAvL+WIpOaWreaYr+WQpuWkp+S6juWtmeihqOaVsOaNruacgOWkp+ihjOaVsAogICAgICAgICAgICBpZiAodGhpc18ubWF4Um93ICE9IDAgJiYgc3ViQm8ubGVuZ3RoICsgcmV0dXJuU2l6ZSA+IHRoaXNfLm1heFJvdykgewogICAgICAgICAgICAgIHRoaXNfLiRtZXNzYWdlLmVycm9yKCflrZnooajmlbDmja7lt7LotoXov4fmnIDlpKfooYzmlbDjgJAnICsgdGhpc18ubWF4Um93ICsgJ+OAkScpOwogICAgICAgICAgICAgIHRoaXNfLmN1c3RvbURpYWxvZ1Nob3dUcmVlID0gdHJ1ZTsKICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0VuZEl0ZXJhdGl2ZScpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8v5Yik5pat5piv5ZCm5piv5LiA5a+55LiA5a2Z6KGoCiAgICAgICAgICAgIGlmICh0aGlzXy5yZWxhdGlvbiAmJiB0aGlzXy5yZWxhdGlvbiA9PSAnb25ldG9vbmUnKSB7CiAgICAgICAgICAgICAgc3ViQm8uZW1wdHkoKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBzdWJCby5wdXNoKHN1YkxpbmVEYXRhKTsKICAgICAgICAgICAgcmV0dXJuU2l6ZS0tOwogICAgICAgICAgfQogICAgICAgIH0pOwogICAgICAgIHRoaXMuY3VzdG9tRGlhbG9nU2hvd1RyZWUgPSBmYWxzZTsKICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgIGlmIChlLm1lc3NhZ2UgIT0gJ0VuZEl0ZXJhdGl2ZScpIHRocm93IGU7CiAgICAgIH0KICAgIH0sCiAgICBkaWFsb2dDYW5jZWxUcmVlOiBmdW5jdGlvbiBkaWFsb2dDYW5jZWxUcmVlKCkgewogICAgICB0aGlzLiRzdG9yZS5kaXNwYXRjaCgnZGlhbG9nL3NldERpYWxvZ0RhdGEnLCBbXSk7CiAgICAgIHRoaXMuY3VzdG9tRGlhbG9nU2hvd1RyZWUgPSBmYWxzZTsKICAgIH0sCiAgICBnZXRDaGVja2VkOiBmdW5jdGlvbiBnZXRDaGVja2VkKGRhdGEsIGNoZWNrZWQsIGluZGV0ZXJtaW5hdGUpIHsKICAgICAgaWYgKHRoaXMuY3VzdG9tRGlhbG9nLnNlbGVjdE51bSA9PT0gMSkgewogICAgICAgIHRoaXMucHJvcHNEYXRhID0gW107CiAgICAgICAgdGhpcy5wcm9wc0RhdGEucHVzaChkYXRhKTsKICAgICAgfSBlbHNlIHsKICAgICAgICB0aGlzLnByb3BzRGF0YSA9IHRoaXMuJHJlZnMudHJlZS5nZXRDaGVja2VkTm9kZXMoKTsKICAgICAgfQogICAgfSwKICAgIHRyZWVDbGljazogZnVuY3Rpb24gdHJlZUNsaWNrKGRhdGEsIG4sIGkpIHsKICAgICAgaWYgKHRoaXMuY3VzdG9tRGlhbG9nLnNlbGVjdE51bSA9PT0gMSkgewogICAgICAgIHRoaXMucHJvcHNEYXRhID0gW107CiAgICAgICAgdGhpcy5wcm9wc0RhdGEucHVzaChkYXRhKTsKICAgICAgfQogICAgfSwKICAgIGNsZWFyQWxsU2VsZWN0T3JnczogZnVuY3Rpb24gY2xlYXJBbGxTZWxlY3RPcmdzKCkgewogICAgICB0aGlzLnNlbGVjdE9yZ3MgPSBudWxsOwogICAgICB0aGlzLiRyZWZzLm9yZ1RhYmxlLmNsZWFyU2VsZWN0aW9uKCk7CiAgICB9LAogICAgcmVtb3ZlU2VsZWN0T3JnOiBmdW5jdGlvbiByZW1vdmVTZWxlY3RPcmcoaXRlbSkgewogICAgICB2YXIgX3RoaXM4ID0gdGhpczsKICAgICAgaWYgKHRoaXMuY3VzdG9tRGlhbG9nLnNlbGVjdE51bSA9PT0gMSkgewogICAgICAgIHRoaXMuJGVtaXQoJ2lucHV0JywgJycpOwogICAgICAgIHRoaXMuc2VsZWN0T3Jncy5zcGxpY2UoaXRlbSwgMSk7CiAgICAgICAgdGhpcy5zaG93RGF0YS5zcGxpY2UoaXRlbSwgMSk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgdGhpcy5pbnB1dFZhbC5zcGxpY2UoaXRlbSwgMSk7CiAgICAgICAgLy8gbGV0IHJlbW92ZUlkID0gdGhpcy5zaG93RGF0YVtpdGVtXTsKICAgICAgICAvL+agkeW9ogogICAgICAgIGlmICh0aGlzLnByb3BzRGF0YS5sZW5ndGggPiAwKSB7CiAgICAgICAgICB0aGlzLnByb3BzRGF0YS5zcGxpY2UoaXRlbSwgMSk7CiAgICAgICAgfQogICAgICAgIGlmICh0aGlzLnNob3dEYXRhLmxlbmd0aCA+IDApIHsKICAgICAgICAgIHRoaXMuc2hvd0RhdGEuc3BsaWNlKGl0ZW0sIDEpOwogICAgICAgIH0KICAgICAgICAvL+WIl+ihqAogICAgICAgIGlmICh0aGlzLnNlbGVjdE9yZ3MgIT0gbnVsbCkgewogICAgICAgICAgdGhpcy5zZWxlY3RPcmdzLnNwbGljZShpdGVtLCAxKTsKICAgICAgICAgIHRoaXMuY2hlY2tCb3hEYXRhQWxsLnNwbGljZShpdGVtLCAxKTsKICAgICAgICAgIHRoaXMuc2VsZWN0T3Jncy5mb3JFYWNoKGZ1bmN0aW9uIChyb3cpIHsKICAgICAgICAgICAgLy8gaWYoaXRlbS5pZCA9PXJlbW92ZUlkICl7CiAgICAgICAgICAgIF90aGlzOC5pc0N1cnJlbnRDaGFuZ2UgPSB0cnVlOwogICAgICAgICAgICBfdGhpczgudG9nZ2xlUm93U2VsZWN0aW9uKHJvdywgZmFsc2UpOwogICAgICAgICAgICAvLyB9CiAgICAgICAgICB9KTsKICAgICAgICB9CiAgICAgICAgdGhpcy5jYWxhY0lucHV0U3VmZml4SGVpZ2h0KCk7CiAgICAgICAgdmFyIHZhbHVlID0gJyc7CiAgICAgICAgdGhpcy5pbnB1dFZhbC5mb3JFYWNoKGZ1bmN0aW9uICh2YWwpIHsKICAgICAgICAgIHZhbHVlICs9IHZhbC52YWx1ZSArICcsJzsKICAgICAgICB9KTsKICAgICAgICBpZiAodmFsdWUubGVuZ3RoID4gMCkgewogICAgICAgICAgdmFsdWUgPSB2YWx1ZS5zdWJzdHJpbmcoMCwgdmFsdWUubGVuZ3RoIC0gMSk7CiAgICAgICAgfQogICAgICAgIGlmICh2YWx1ZSAhPSAnJykgewogICAgICAgICAgdmFsdWUgPSB2YWx1ZSArICd8fCcgKyBKU09OLnN0cmluZ2lmeSh0aGlzLnNob3dEYXRhKTsKICAgICAgICB9CiAgICAgICAgdGhpcy4kZW1pdCgnaW5wdXQnLCB2YWx1ZSk7CiAgICAgIH0KICAgICAgdGhpcy5zeW5jSW5wdXRWYWx1ZSgpOwogICAgfSwKICAgIGNhbGFjSW5wdXRTdWZmaXhIZWlnaHQ6IGZ1bmN0aW9uIGNhbGFjSW5wdXRTdWZmaXhIZWlnaHQoKSB7CiAgICAgIHZhciBfdGhpczkgPSB0aGlzOwogICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHsKICAgICAgICBpZiAoIV90aGlzOS4kcmVmcy50YWdTcGFucykgcmV0dXJuOwogICAgICAgIGlmIChfdGhpczkuJHJlZnMudGFnU3BhbnMub2Zmc2V0SGVpZ2h0KSB7CiAgICAgICAgICBfdGhpczkuaW5wdXRTdWZmaXhIZWlnaHQgPSBfdGhpczkuJHJlZnMudGFnU3BhbnMub2Zmc2V0SGVpZ2h0ICsgNTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgX3RoaXM5LmlucHV0U3VmZml4SGVpZ2h0ID0gMzA7CiAgICAgICAgfQogICAgICAgIC8vIOinpuWPkemqjOivgQogICAgICAgIF90aGlzOS4kdmFsaWRhdG9yLnZhbGlkYXRlKCk7CiAgICAgIH0sIDApOwogICAgfSwKICAgIGN1c3RvbURpYWxvZ1Nob3c6IGZ1bmN0aW9uIGN1c3RvbURpYWxvZ1Nob3cocGFnZVBhcmFtKSB7CiAgICAgIHRoaXMuY3VzdG9tRGlhbG9nU2hvd0xpc3QgPSB0cnVlOwogICAgICB0aGlzLmN1c3RvbURpYWxvZyA9IHBhZ2VQYXJhbS5jdXN0b21EaWFsb2c7CiAgICAgIHRoaXMuY3VzdG9tRGlhbG9nLnF1ZXJ5VXJsID0gdGhpcy5jdXN0b21EaWFsb2cuZHNUeXBlID09ICdkYXRhU291cmNlJyA/ICcke2Zvcm19L2Zvcm0vY3VzdG9tRGlhbG9nL3YxL2dldExpc3REYXRhP2FsaWFzPScgKyB0aGlzLmN1c3RvbURpYWxvZy5hbGlhcyArICcmbWFwUGFyYW09JyArICh0aGlzLmN1c3RvbURpYWxvZy5tYXBQYXJhbSA/IHRoaXMuY3VzdG9tRGlhbG9nLm1hcFBhcmFtIDogJycpIDogdGhpcy5jdXN0b21EaWFsb2cudXJsOwogICAgICBpZiAodGhpcy5kaWFsb2dEYXRhLmxlbmd0aCA8IDEpIHsKICAgICAgICB0aGlzLnBhZ2luYXRpb24gPSB7CiAgICAgICAgICBwYWdlOiAxLAogICAgICAgICAgcGFnZVNpemU6IDIwLAogICAgICAgICAgc2hvd1RvdGFsOiAndHJ1ZScKICAgICAgICB9OwogICAgICAgIHRoaXMuc2VhcmNoKCk7CiAgICAgICAgdGhpcy5kaXNwbGF5ZmllbGQgPSBKU09OLnBhcnNlKHBhZ2VQYXJhbS5jdXN0b21EaWFsb2cuZGlzcGxheWZpZWxkKTsKICAgICAgICBpZiAodGhpcy5jdXN0b21EaWFsb2cuZHNUeXBlID09ICdkYXRhU291cmNlJykgewogICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmRpc3BsYXlmaWVsZC5sZW5ndGg7IGkrKykgewogICAgICAgICAgICB0aGlzLmRpc3BsYXlmaWVsZFtpXS5maWVsZCA9IHRoaXMuZGlzcGxheWZpZWxkW2ldLmZpZWxkLnRvTG93ZXJDYXNlKCk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9IGVsc2UgaWYgKHRoaXMuZGlhbG9nRGF0YS5sZW5ndGggPiAxKSB7CiAgICAgICAgdGhpcy5zZWFyY2goKTsKICAgICAgfQogICAgICBpZiAodGhpcy5kaWFsb2dEYXRhLmxlbmd0aCA+IDAgJiYgdGhpcy5kaXNwbGF5ZmllbGQubGVuZ3RoID09IDApIHsKICAgICAgICB0aGlzLnNlYXJjaCgpOwogICAgICAgIHRoaXMuZGlzcGxheWZpZWxkID0gSlNPTi5wYXJzZShwYWdlUGFyYW0uY3VzdG9tRGlhbG9nLmRpc3BsYXlmaWVsZCk7CiAgICAgICAgaWYgKHRoaXMuY3VzdG9tRGlhbG9nLmRzVHlwZSA9PSAnZGF0YVNvdXJjZScpIHsKICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5kaXNwbGF5ZmllbGQubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgdGhpcy5kaXNwbGF5ZmllbGRbaV0uZmllbGQgPSB0aGlzLmRpc3BsYXlmaWVsZFtpXS5maWVsZC50b0xvd2VyQ2FzZSgpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgfSwKICAgIGN1c3RvbURpYWxvZ1RyZWVTaG93OiBmdW5jdGlvbiBjdXN0b21EaWFsb2dUcmVlU2hvdyhwYWdlUGFyYW0pIHsKICAgICAgdGhpcy5jdXN0b21EaWFsb2cgPSBwYWdlUGFyYW0uY3VzdG9tRGlhbG9nOwogICAgICB2YXIgY3VzdG9tRGlhbG9nID0gdGhpcy5jdXN0b21EaWFsb2c7CiAgICAgIHZhciBtYXBQYXJhbSA9ICcnOwogICAgICBpZiAocGFnZVBhcmFtLnBhcmFtICE9IHVuZGVmaW5lZCkgewogICAgICAgIG1hcFBhcmFtID0gSlNPTi5zdHJpbmdpZnkocGFnZVBhcmFtLnBhcmFtKTsKICAgICAgICBtYXBQYXJhbSA9IG1hcFBhcmFtLnN1YnN0cmluZygxLCBtYXBQYXJhbS5sZW5ndGggLSAxKTsKICAgICAgfQogICAgICB2YXIgcmVxdWVzdFR5cGUgPSBjdXN0b21EaWFsb2cuZHNUeXBlID09ICdkYXRhU291cmNlJyA/ICdHRVQnIDogY3VzdG9tRGlhbG9nLnJlcXVlc3RUeXBlID8gY3VzdG9tRGlhbG9nLnJlcXVlc3RUeXBlIDogJ1BPU1QnOwogICAgICB2YXIgdXJsID0gJyR7Zm9ybX0vZm9ybS9jdXN0b21EaWFsb2cvdjEvZ2V0VHJlZURhdGE/YWxpYXM9JyArIHBhZ2VQYXJhbS5hbGlhcyArICcmbWFwUGFyYW09JyArIG1hcFBhcmFtOwogICAgICB2YXIgcGFyYW1zT2JqID0ge307CiAgICAgIGlmIChjdXN0b21EaWFsb2cuZHNUeXBlICE9ICdkYXRhU291cmNlJykgewogICAgICAgIHVybCA9IGN1c3RvbURpYWxvZy51cmw7CiAgICAgICAgdmFyIHRlbXBsYXRlUGEgPSBjdXN0b21EaWFsb2cuZGF0YVBhcmFtOwogICAgICAgIGlmIChjdXN0b21EaWFsb2cuY29uZGl0aW9uZmllbGQpIHsKICAgICAgICAgIHZhciBjb25kaXRpb25zID0gSlNPTi5wYXJzZShjdXN0b21EaWFsb2cuY29uZGl0aW9uZmllbGQpOwogICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjb25kaXRpb25zLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgIHZhciBjb24gPSBjb25kaXRpb25zW2ldOwogICAgICAgICAgICBpZiAocmVxdWVzdFR5cGUgPT0gJ1BPU1QnKSB7CiAgICAgICAgICAgICAgaWYgKHRlbXBsYXRlUGEpIHsKICAgICAgICAgICAgICAgIHRlbXBsYXRlUGEgPSB0ZW1wbGF0ZVBhLnJlcGxhY2UobmV3IFJlZ0V4cCgnXFx7JyArIGNvbi5maWVsZCArICdcXH0nLCAnZycpLCBjb24uZGVmYXVsdFZhbHVlKTsKICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgcGFyYW1zT2JqW2Nvbi5maWVsZF0gPSBjb24uZGVmYXVsdFZhbHVlOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICB2YXIgbGpDaGFyID0gdXJsLmluZGV4T2YoJz8nKSA9PSAtMSA/ICc/JyA6ICcmJzsKICAgICAgICAgICAgICB1cmwgPSB1cmwgKyBsakNoYXIgKyBjb24uZmllbGQgKyAnPScgKyBjb24uZGVmYXVsdFZhbHVlOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgICBpZiAodGVtcGxhdGVQYSkgewogICAgICAgICAgICBwYXJhbXNPYmogPSBKU09OLnBhcnNlKHRlbXBsYXRlUGEpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgICB2YXIgcmVxdWVzdFBhcmFtcyA9IHt9OwogICAgICByZXF1ZXN0UGFyYW1zLnJlcXVlc3RUeXBlID0gcmVxdWVzdFR5cGU7CiAgICAgIHJlcXVlc3RQYXJhbXMudXJsID0gdXJsOwogICAgICByZXF1ZXN0UGFyYW1zLnBhcmFtc09iaiA9IHBhcmFtc09iajsKICAgICAgdGhpcy5zZWFyY2hUcmVlKHJlcXVlc3RQYXJhbXMpOwogICAgICB0aGlzLmN1c3RvbURpYWxvZ1Nob3dUcmVlID0gdHJ1ZTsKICAgIH0sCiAgICAvL+agkeW9ouafpeivogogICAgc2VhcmNoVHJlZTogZnVuY3Rpb24gc2VhcmNoVHJlZShyZXF1ZXN0UGFyYW1zKSB7CiAgICAgIHZhciB0aGlzXyA9IHRoaXM7CiAgICAgIHZhciBxdWVyeSA9IHJlcXVlc3RQYXJhbXMucmVxdWVzdFR5cGUgPT0gJ1BPU1QnID8gcmVxLnBvc3QocmVxdWVzdFBhcmFtcy51cmwsIHJlcXVlc3RQYXJhbXMucGFyYW1zT2JqKSA6IHJlcS5nZXQocmVxdWVzdFBhcmFtcy51cmwpOwogICAgICBxdWVyeS50aGVuKGZ1bmN0aW9uIChyZXNwb25zZSkgewogICAgICAgIC8v5pi+56S65a2X5q616YWN572uCiAgICAgICAgdmFyIGRpc3BsYXlmaWVsZCA9IEpTT04ucGFyc2UodGhpc18uY3VzdG9tRGlhbG9nLmRpc3BsYXlmaWVsZCk7CiAgICAgICAgdGhpc18uZGlzcGxheUZpZWxkID0gZGlzcGxheWZpZWxkOwogICAgICAgIC8v5oqK5a+56K+d5qGG6YWN572u55qE5pi+56S65a2X5q615pi+56S65ZCN56ew6LWL5YC857uZ5qCR5b2i55qE5pi+56S65YC8CiAgICAgICAgdGhpc18uZGVmYXVsdFByb3BzLmxhYmVsID0gZGlzcGxheWZpZWxkLmRpc3BsYXlOYW1lOwogICAgICAgIHRoaXNfLnRyZWVMaXN0ID0gcmVzcG9uc2UuZGF0YTsKICAgICAgICAvL+W+l+WIsOimgeWKoOi9veagkeeahOS/oeaBrwogICAgICAgIHRoaXNfLnByb3BzMSA9IHRoaXNfLnRvVHJlZURhdGEocmVzcG9uc2UuZGF0YSwgZGlzcGxheWZpZWxkLmlkLCBkaXNwbGF5ZmllbGQucGlkLCBkaXNwbGF5ZmllbGQuZGlzcGxheU5hbWUsIGRpc3BsYXlmaWVsZC5wdmFsdWUgPyBkaXNwbGF5ZmllbGQucHZhbHVlIDogMCk7CiAgICAgIH0pOwogICAgfSwKICAgIC8v5Yqg6L295qCR55qE5L+h5oGvCiAgICB0b1RyZWVEYXRhOiBmdW5jdGlvbiB0b1RyZWVEYXRhKGRhdGEsIGlkLCBwaWQsIG5hbWUsIHB2YWx1ZSkgewogICAgICAvLyDlu7rnq4vkuKrmoJHlvaLnu5PmnoQs6ZyA6KaB5a6a5LmJ5Liq5pyA6aG25bGC55qE54i26IqC54K577yMcHZhbHVl5pivMAogICAgICByZXR1cm4gdGhpcy50cmFuc2xhdGVEYXRhVG9UcmVlKGRhdGEsIHBpZCwgaWQsIG5hbWUsIHB2YWx1ZSk7CiAgICB9LAogICAgdHJhbnNsYXRlRGF0YVRvVHJlZTogZnVuY3Rpb24gdHJhbnNsYXRlRGF0YVRvVHJlZShkYXRhLCBwaWQsIGlkLCBuYW1lLCBwdmFsdWUpIHsKICAgICAgLy/miormoJHmlbDmja7mnInlrZDoioLngrnnmoTmlbDmja7lhajpg6jov4fmu6TmjonvvIjlj6rnlZnniLboioLngrnnmoTmlbDmja7vvIkKICAgICAgdmFyIHBhcmVudHMgPSBkYXRhLmZpbHRlcihmdW5jdGlvbiAodmFsdWUpIHsKICAgICAgICByZXR1cm4gdmFsdWVbaWRdID09IHZhbHVlW3BpZF0gfHwgdmFsdWVbcGlkXSA9PSBudWxsIHx8IHZhbHVlW3BpZF0gPT0gcHZhbHVlOwogICAgICB9KTsKICAgICAgaWYgKCFwYXJlbnRzKSB7CiAgICAgICAgcGFyZW50cyA9IGRhdGEuZmlsdGVyKGZ1bmN0aW9uICh2YWx1ZSkgewogICAgICAgICAgcmV0dXJuIHZhbHVlW3BpZF0gIT09ICd1bmRlZmluZWQnICYmIHZhbHVlW3BpZF0gIT0gbnVsbCAmJiB2YWx1ZVtpZF0gIT0gdmFsdWVbcGlkXTsKICAgICAgICB9KTsKICAgICAgfQogICAgICByZXR1cm4gcGFyZW50czsKICAgIH0sCiAgICBsb2FkVHJlZTogZnVuY3Rpb24gbG9hZFRyZWUobm9kZSwgcmVzb2x2ZSkgewogICAgICB2YXIgX3RoaXMxMCA9IHRoaXM7CiAgICAgIGlmIChub2RlKSB7CiAgICAgICAgdmFyIHRoaXNfID0gdGhpczsKICAgICAgICB2YXIgZGlzcGxheUZpZWxkID0gdGhpc18uY3VzdG9tRGlhbG9nLnN0eWxlID09IDIgPyB0aGlzXy5jb21iaVRyZWVEaXNwbGF5RmllbGQgOiB0aGlzXy5kaXNwbGF5RmllbGQ7CiAgICAgICAgcmVzb2x2ZSh0aGlzLnRyZWVMaXN0LmZpbHRlcihmdW5jdGlvbiAodmFsdWUpIHsKICAgICAgICAgIHJldHVybiB2YWx1ZVtkaXNwbGF5RmllbGQucGlkXSA9PT0gbm9kZS5kYXRhW2Rpc3BsYXlGaWVsZC5pZF07CiAgICAgICAgfSkpOwogICAgICAgIGlmICh0aGlzLnNob3dEYXRhICYmIHRoaXMuc2hvd0RhdGEubGVuZ3RoID4gMCkgewogICAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIF90aGlzMTAuc2hvd0RhdGEuZm9yRWFjaChmdW5jdGlvbiAodikgewogICAgICAgICAgICAgIGlmICh2LlBpZCA9PSBub2RlLmtleSkgewogICAgICAgICAgICAgICAgdGhpc18uJHJlZnMudHJlZS5zZXRDaGVja2VkKHYsIHRydWUpOwogICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICB0aGlzXy5jaGVja05vZGUodiwgdGhpc18pOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgICB9LCA0MDApOwogICAgICAgIH0KICAgICAgfQogICAgfSwKICAgIGFmdGVyT3BlbjogZnVuY3Rpb24gYWZ0ZXJPcGVuKCkgewogICAgICAvL+aJk+W8gOWvueivneahhuS5i+WQjuWKoOi9veagkQogICAgICB0aGlzLmxvYWRDb21iaW5hdGlvblRyZWUoKTsKICAgIH0sCiAgICBsb2FkQ29tYmluYXRpb25UcmVlOiBmdW5jdGlvbiBsb2FkQ29tYmluYXRpb25UcmVlKCkgewogICAgICB2YXIgX3RoaXMxMSA9IHRoaXM7CiAgICAgIGlmICh0aGlzLmN1c3RvbURpYWxvZy5zdHlsZSAhPSAyKSB7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIHZhciBjb21iaW5hdGlvblJ1bGUgPSBKU09OLnBhcnNlKHRoaXMuY3VzdG9tRGlhbG9nLmNvbWJpbmF0aW9uUnVsZSk7CiAgICAgIHRoaXMuY29tYmluYXRpb25SdWxlID0gY29tYmluYXRpb25SdWxlOwogICAgICB2YXIgdHJlZUFsaWFzID0gY29tYmluYXRpb25SdWxlLmxlZnRUcmVlOwogICAgICAvL+iOt+WPluWvueivneahhuaVsOaNrgogICAgICByZXEuZ2V0KCcke2Zvcm19L2Zvcm0vY3VzdG9tRGlhbG9nL3YxL2dldEJ5QWxpYXM/YWxpYXM9JyArIHRyZWVBbGlhcykudGhlbihmdW5jdGlvbiAocmVzcCkgewogICAgICAgIHZhciB0cmVlRGlhbG9nID0gcmVzcC5kYXRhOwogICAgICAgIF90aGlzMTEubGVmdFRyZWVUaXRsZSA9IHRyZWVEaWFsb2cubmFtZTsKICAgICAgICB2YXIgcmVxUGFyYW0gPSB7fTsKICAgICAgICB2YXIgcmVxdWVzdFR5cGUgPSB0cmVlRGlhbG9nLmRzVHlwZSA9PSAnZGF0YVNvdXJjZScgPyAnR0VUJyA6IHRyZWVEaWFsb2cucmVxdWVzdFR5cGUgPyB0cmVlRGlhbG9nLnJlcXVlc3RUeXBlIDogJ1BPU1QnOwogICAgICAgIHZhciB1cmwgPSAnJHtmb3JtfS9mb3JtL2N1c3RvbURpYWxvZy92MS9nZXRUcmVlRGF0YT9hbGlhcz0nICsgdHJlZUFsaWFzICsgJyZtYXBQYXJhbT0nOwogICAgICAgIHZhciBwYXJhbXNPYmogPSB7fTsKICAgICAgICBpZiAodHJlZURpYWxvZy5kc1R5cGUgIT0gJ2RhdGFTb3VyY2UnKSB7CiAgICAgICAgICB1cmwgPSB0cmVlRGlhbG9nLnVybDsKICAgICAgICAgIHZhciB0ZW1wbGF0ZVBhID0gdHJlZURpYWxvZy5kYXRhUGFyYW07CiAgICAgICAgICBpZiAodHJlZURpYWxvZy5jb25kaXRpb25maWVsZCkgewogICAgICAgICAgICB2YXIgY29uZGl0aW9ucyA9IEpTT04ucGFyc2UodHJlZURpYWxvZy5jb25kaXRpb25maWVsZCk7CiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY29uZGl0aW9ucy5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgIHZhciBjb24gPSBjb25kaXRpb25zW2ldOwogICAgICAgICAgICAgIGlmIChyZXF1ZXN0VHlwZSA9PSAnUE9TVCcpIHsKICAgICAgICAgICAgICAgIGlmICh0ZW1wbGF0ZVBhKSB7CiAgICAgICAgICAgICAgICAgIHRlbXBsYXRlUGEgPSB0ZW1wbGF0ZVBhLnJlcGxhY2UobmV3IFJlZ0V4cCgnXFx7JyArIGNvbi5maWVsZCArICdcXH0nLCAnZycpLCBjb24uZGVmYXVsdFZhbHVlKTsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgIHBhcmFtc09ialtjb24uZmllbGRdID0gY29uLmRlZmF1bHRWYWx1ZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgdmFyIGxqQ2hhciA9IHVybC5pbmRleE9mKCc/JykgPT0gLTEgPyAnPycgOiAnJic7CiAgICAgICAgICAgICAgICB1cmwgPSB1cmwgKyBsakNoYXIgKyBjb24uZmllbGQgKyAnPScgKyBjb24uZGVmYXVsdFZhbHVlOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAodGVtcGxhdGVQYSkgewogICAgICAgICAgICAgIHBhcmFtc09iaiA9IEpTT04ucGFyc2UodGVtcGxhdGVQYSk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgdmFyIHJlcXVlc3RQYXJhbXMgPSB7fTsKICAgICAgICByZXF1ZXN0UGFyYW1zLnJlcXVlc3RUeXBlID0gcmVxdWVzdFR5cGU7CiAgICAgICAgcmVxdWVzdFBhcmFtcy51cmwgPSB1cmw7CiAgICAgICAgcmVxdWVzdFBhcmFtcy5wYXJhbXNPYmogPSBwYXJhbXNPYmo7CiAgICAgICAgX3RoaXMxMS4kc3RvcmUuZGlzcGF0Y2goJ2RpYWxvZy9nZXRUcmVlRGF0YScsIHJlcXVlc3RQYXJhbXMpLnRoZW4oZnVuY3Rpb24gKHJlc3ApIHsKICAgICAgICAgIGlmICh0cmVlRGlhbG9nLmRpc3BsYXlmaWVsZCAmJiB0cmVlRGlhbG9nLnJlc3VsdGZpZWxkKSB7CiAgICAgICAgICAgIHZhciBkaXNwbGF5RmllbGQgPSBKU09OLnBhcnNlKHRyZWVEaWFsb2cuZGlzcGxheWZpZWxkKTsKICAgICAgICAgICAgdmFyIHJlc3VsdGZpZWxkID0gSlNPTi5wYXJzZSh0cmVlRGlhbG9nLnJlc3VsdGZpZWxkKTsKICAgICAgICAgICAgX3RoaXMxMS5kZWZhdWx0UHJvcHMubGFiZWwgPSBkaXNwbGF5RmllbGQuZGlzcGxheU5hbWU7CiAgICAgICAgICAgIF90aGlzMTEudHJlZUxpc3QgPSByZXNwOwogICAgICAgICAgICBfdGhpczExLmNvbWJpVHJlZURpc3BsYXlGaWVsZCA9IGRpc3BsYXlGaWVsZDsKICAgICAgICAgICAgX3RoaXMxMS5jb21iaW5hdGlvblRyZWVEYXRhID0gX3RoaXMxMS50b1RyZWVEYXRhKHJlc3AsIGRpc3BsYXlGaWVsZC5pZCwgZGlzcGxheUZpZWxkLnBpZCwgZGlzcGxheUZpZWxkLmRpc3BsYXlOYW1lLCBkaXNwbGF5RmllbGQucHZhbHVlID8gZGlzcGxheUZpZWxkLnB2YWx1ZSA6ICcwJywgcmVzdWx0ZmllbGQpOwogICAgICAgICAgfQogICAgICAgIH0pOwogICAgICB9KTsKICAgIH0sCiAgICBjb21iaVRyZWVDbGljazogZnVuY3Rpb24gY29tYmlUcmVlQ2xpY2socGFyYW1PYmosIG5vZGUsIG5vZGVDb21wb25lbnQpIHsKICAgICAgLy/nu4TlkIjlr7nor53moYbngrnlh7vlt6bmoJEKICAgICAgLy/muIXnqbrml6fnmoQKICAgICAgdGhpcy5jb21iaW5hdGlvblRyZWVRdWVyeXMuc3BsaWNlKDApOwogICAgICB2YXIgY29tYmluYXRpb25SdWxlID0gSlNPTi5wYXJzZSh0aGlzLmN1c3RvbURpYWxvZy5jb21iaW5hdGlvblJ1bGUpOwogICAgICBpZiAoIWNvbWJpbmF0aW9uUnVsZS5ydWxlcyB8fCBjb21iaW5hdGlvblJ1bGUucnVsZXMubGVuZ3RoID09IDApIHsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgICAgdmFyIHJ1bGVzID0gY29tYmluYXRpb25SdWxlLnJ1bGVzOwogICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHJ1bGVzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgdmFyIHZhbHVlID0gcGFyYW1PYmpbcnVsZXNbaV0udHJlZUZpZWxkXTsKICAgICAgICB2YXIgcHJvcGVydHkgPSBydWxlc1tpXS5saXN0RmllbGQ7CiAgICAgICAgdGhpcy5jb21iaW5hdGlvblRyZWVRdWVyeXMucHVzaCh7CiAgICAgICAgICBwcm9wZXJ0eTogcHJvcGVydHksCiAgICAgICAgICB2YWx1ZTogdmFsdWUsCiAgICAgICAgICBncm91cDogJ3RyZWVHcm91cCcsCiAgICAgICAgICBvcGVyYXRpb246IHRoaXMuZ2V0T3BlcmF0aW9uKHJ1bGVzW2ldLmNvbmRpdGlvbiksCiAgICAgICAgICByZWxhdGlvbjogJ0FORCcKICAgICAgICB9KTsKICAgICAgfQogICAgICB0aGlzLnNlYXJjaCgpOwogICAgfSwKICAgIC8v6I635Y+W6L+Q566X56ym5Y+3CiAgICBnZXRPcGVyYXRpb246IGZ1bmN0aW9uIGdldE9wZXJhdGlvbihvbGQpIHsKICAgICAgaWYgKCFvbGQpIHsKICAgICAgICByZXR1cm4gJyc7CiAgICAgIH0KICAgICAgaWYgKG9sZCA9PSAnRVEnKSB7CiAgICAgICAgcmV0dXJuICdFUVVBTCc7CiAgICAgIH0KICAgICAgaWYgKG9sZCA9PSAnTEsnKSB7CiAgICAgICAgcmV0dXJuICdMSUtFJzsKICAgICAgfQogICAgICBpZiAob2xkID09ICdMRksnKSB7CiAgICAgICAgcmV0dXJuICdMSUtFJzsKICAgICAgfQogICAgICBpZiAob2xkID09ICdJTicpIHsKICAgICAgICByZXR1cm4gJ0lOJzsKICAgICAgfQogICAgfSwKICAgIHRvZ2dsZVRyZWU6IGZ1bmN0aW9uIHRvZ2dsZVRyZWUoKSB7CiAgICAgIGlmICh0aGlzLnRyZWVTaG93KSB7CiAgICAgICAgdGhpcy50cmVlU2hvdyA9IGZhbHNlOwogICAgICAgIHRoaXMudHJhbnN0aW9uV2lkdGggPSAnMCUnOwogICAgICAgIHRoaXMudG9nZ2xlQnRuID0gJ2VsLWljb24tYXJyb3ctcmlnaHQnOwogICAgICB9IGVsc2UgewogICAgICAgIHRoaXMudHJlZVNob3cgPSB0cnVlOwogICAgICAgIHRoaXMudHJhbnN0aW9uV2lkdGggPSAnMjUlJzsKICAgICAgICB0aGlzLnRvZ2dsZUJ0biA9ICdlbC1pY29uLWFycm93LWxlZnQnOwogICAgICB9CiAgICB9CiAgfQp9Ow=="},null]}