{"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\\dataTemplate\\TemplateDynamicView.vue?vue&type=script&lang=js&","dependencies":[{"path":"D:\\jenkins\\workspace\\bzzgj-fvue\\src\\components\\dataTemplate\\TemplateDynamicView.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:aW1wb3J0IF90b0NvbnN1bWFibGVBcnJheSBmcm9tICJEOi9qZW5raW5zL3dvcmtzcGFjZS9ienpnai1mdnVlL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS90b0NvbnN1bWFibGVBcnJheS5qcyI7CmltcG9ydCBfYXN5bmNUb0dlbmVyYXRvciBmcm9tICJEOi9qZW5raW5zL3dvcmtzcGFjZS9ienpnai1mdnVlL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9hc3luY1RvR2VuZXJhdG9yLmpzIjsKaW1wb3J0IF9jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyIGZyb20gIkQ6L2plbmtpbnMvd29ya3NwYWNlL2J6emdqLWZ2dWUvbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2NyZWF0ZUZvck9mSXRlcmF0b3JIZWxwZXIuanMiOwppbXBvcnQgX29iamVjdFNwcmVhZCBmcm9tICJEOi9qZW5raW5zL3dvcmtzcGFjZS9ienpnai1mdnVlL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9vYmplY3RTcHJlYWQyLmpzIjsKaW1wb3J0ICJyZWdlbmVyYXRvci1ydW50aW1lL3J1bnRpbWUuanMiOwppbXBvcnQgImNvcmUtanMvbW9kdWxlcy9lcy5hcnJheS5jb25jYXQuanMiOwppbXBvcnQgImNvcmUtanMvbW9kdWxlcy9lcy5hcnJheS5maWx0ZXIuanMiOwppbXBvcnQgImNvcmUtanMvbW9kdWxlcy9lcy5hcnJheS5pbmNsdWRlcy5qcyI7CmltcG9ydCAiY29yZS1qcy9tb2R1bGVzL2VzLmFycmF5LmpvaW4uanMiOwppbXBvcnQgImNvcmUtanMvbW9kdWxlcy9lcy5hcnJheS5tYXAuanMiOwppbXBvcnQgImNvcmUtanMvbW9kdWxlcy9lcy5hcnJheS5wdXNoLmpzIjsKaW1wb3J0ICJjb3JlLWpzL21vZHVsZXMvZXMuYXJyYXkucmVkdWNlLmpzIjsKaW1wb3J0ICJjb3JlLWpzL21vZHVsZXMvZXMuYXJyYXkuc29ydC5qcyI7CmltcG9ydCAiY29yZS1qcy9tb2R1bGVzL2VzLmZ1bmN0aW9uLm5hbWUuanMiOwppbXBvcnQgImNvcmUtanMvbW9kdWxlcy9lcy5pdGVyYXRvci5jb25zdHJ1Y3Rvci5qcyI7CmltcG9ydCAiY29yZS1qcy9tb2R1bGVzL2VzLml0ZXJhdG9yLmZpbHRlci5qcyI7CmltcG9ydCAiY29yZS1qcy9tb2R1bGVzL2VzLml0ZXJhdG9yLmZvci1lYWNoLmpzIjsKaW1wb3J0ICJjb3JlLWpzL21vZHVsZXMvZXMuaXRlcmF0b3IubWFwLmpzIjsKaW1wb3J0ICJjb3JlLWpzL21vZHVsZXMvZXMuaXRlcmF0b3IucmVkdWNlLmpzIjsKaW1wb3J0ICJjb3JlLWpzL21vZHVsZXMvZXMuanNvbi5zdHJpbmdpZnkuanMiOwppbXBvcnQgImNvcmUtanMvbW9kdWxlcy9lcy5udW1iZXIuY29uc3RydWN0b3IuanMiOwppbXBvcnQgImNvcmUtanMvbW9kdWxlcy9lcy5udW1iZXIudG8tZml4ZWQuanMiOwppbXBvcnQgImNvcmUtanMvbW9kdWxlcy9lcy5vYmplY3Qua2V5cy5qcyI7CmltcG9ydCAiY29yZS1qcy9tb2R1bGVzL2VzLm9iamVjdC50by1zdHJpbmcuanMiOwppbXBvcnQgImNvcmUtanMvbW9kdWxlcy9lcy5yZWdleHAuZXhlYy5qcyI7CmltcG9ydCAiY29yZS1qcy9tb2R1bGVzL2VzLnN0cmluZy5pbmNsdWRlcy5qcyI7CmltcG9ydCAiY29yZS1qcy9tb2R1bGVzL2VzLnN0cmluZy5pdGVyYXRvci5qcyI7CmltcG9ydCAiY29yZS1qcy9tb2R1bGVzL2VzLnN0cmluZy5yZXBsYWNlLmpzIjsKaW1wb3J0ICJjb3JlLWpzL21vZHVsZXMvZXMuc3RyaW5nLnNlYXJjaC5qcyI7CmltcG9ydCAiY29yZS1qcy9tb2R1bGVzL3dlYi5kb20tY29sbGVjdGlvbnMuZm9yLWVhY2guanMiOwppbXBvcnQgImNvcmUtanMvbW9kdWxlcy93ZWIuZG9tLWNvbGxlY3Rpb25zLml0ZXJhdG9yLmpzIjsKaW1wb3J0ICJjb3JlLWpzL21vZHVsZXMvd2ViLnNlbGYuanMiOwppbXBvcnQgImNvcmUtanMvbW9kdWxlcy93ZWIudXJsLmpzIjsKaW1wb3J0ICJjb3JlLWpzL21vZHVsZXMvd2ViLnVybC50by1qc29uLmpzIjsKaW1wb3J0ICJjb3JlLWpzL21vZHVsZXMvd2ViLnVybC1zZWFyY2gtcGFyYW1zLmpzIjsKaW1wb3J0ICJjb3JlLWpzL21vZHVsZXMvd2ViLnVybC1zZWFyY2gtcGFyYW1zLmRlbGV0ZS5qcyI7CmltcG9ydCAiY29yZS1qcy9tb2R1bGVzL3dlYi51cmwtc2VhcmNoLXBhcmFtcy5oYXMuanMiOwppbXBvcnQgImNvcmUtanMvbW9kdWxlcy93ZWIudXJsLXNlYXJjaC1wYXJhbXMuc2l6ZS5qcyI7Ci8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCgppbXBvcnQgeyBMb2FkaW5nIH0gZnJvbSAnZWxlbWVudC11aSc7CmltcG9ydCBIdENoZWNrYm94IGZyb20gJ0AvY29tcG9uZW50cy9jb250cm9sL0h0Q2hlY2tib3gudnVlJzsKaW1wb3J0IEh0RGlhbG9nIGZyb20gJ0AvY29tcG9uZW50cy9jb250cm9sL0h0RGlhbG9nLnZ1ZSc7CmltcG9ydCBIdERpYWxvZ0J0biBmcm9tICdAL2NvbXBvbmVudHMvY29udHJvbC9odERpYWxvZ0J0bi52dWUnOwppbXBvcnQgRWlwU2VsZWN0IGZyb20gJ0AvY29tcG9uZW50cy9laXBDb250cm9sL0VpcFNlbGVjdC52dWUnOwppbXBvcnQgVlJ1bnRpbWVUZW1wbGF0ZSBmcm9tICd2LXJ1bnRpbWUtdGVtcGxhdGUnOwppbXBvcnQgdXRpbHMgZnJvbSAnQC91dGlscy5qcyc7CmltcG9ydCB7IEJhc2U2NCB9IGZyb20gJ2pzLWJhc2U2NCc7CmltcG9ydCBWdWUgZnJvbSAndnVlJzsKaW1wb3J0IFFSQ29kZSBmcm9tICdxcmNvZGUnOwppbXBvcnQgcmVxIGZyb20gJ0AvcmVxdWVzdC5qcyc7CmltcG9ydCBmb3JtIGZyb20gJ0AvYXBpL2Zvcm0uanMnOwppbXBvcnQgZGlhbG9nIGZyb20gJ0AvYXBpL2RpYWxvZ0FwaS5qcyc7CnZhciBUZW1wbGF0ZUJhdGNoVXBkYXRlRGlhbG9nID0gZnVuY3Rpb24gVGVtcGxhdGVCYXRjaFVwZGF0ZURpYWxvZygpIHsKICByZXR1cm4gaW1wb3J0KCdAL2NvbXBvbmVudHMvZGlhbG9nL1RlbXBsYXRlQmF0Y2hVcGRhdGVEaWFsb2cudnVlJyk7Cn07CmV4cG9ydCBkZWZhdWx0IHsKICBuYW1lOiAndGVtcGxhdGUtZHluYW1pYy12aWV3JywKICBwcm9wczogewogICAgdGVtcGxhdGVLZXk6IFN0cmluZywKICAgIGh0bWw6IFN0cmluZywKICAgIHRlbXBsYXRlSW5mbzogT2JqZWN0LAogICAgcGFyYW1ldGVycVF1ZXJ5czogU3RyaW5nLAogICAgc2luZ2xlOiB7CiAgICAgIGRlZmF1bHQ6ICd0cnVlJwogICAgfSwKICAgIGRlZktleTogU3RyaW5nLAogICAgdGFza1R5cGU6IHsKICAgICAgZGVmYXVsdDogJycKICAgIH0sCiAgICBkYXRhVmlldzogT2JqZWN0LAogICAgaXNKb2luRmxvdzogewogICAgICBkZWZhdWx0OiBmYWxzZQogICAgfQogIH0sCiAgZGF0YTogZnVuY3Rpb24gZGF0YSgpIHsKICAgIHJldHVybiB7CiAgICAgIHJlZnJlc2hUaW1lOiBuZXcgRGF0ZSgpLmdldFRpbWUoKSwKICAgICAgc2hvd0RhdGVWaWV3OiB0cnVlCiAgICB9OwogIH0sCiAgY3JlYXRlZDogZnVuY3Rpb24gY3JlYXRlZCgpIHsKICAgIHRoaXMuaW5pdCgpOwogIH0sCiAgd2F0Y2g6IHsKICAgIGh0bWw6IGZ1bmN0aW9uIGh0bWwobmV3VmFsKSB7CiAgICAgIGlmIChuZXdWYWwpIHsKICAgICAgICB0aGlzLmluaXQoKTsKICAgICAgfQogICAgfQogIH0sCiAgbWV0aG9kczogewogICAgaW5pdDogZnVuY3Rpb24gaW5pdCgpIHsKICAgICAgVnVlLmNvbXBvbmVudCgnaHQtZGF0YXZpZXctcnVudGltZS10ZW1wbGF0ZScsIHsKICAgICAgICB0ZW1wbGF0ZTogdGhpcy5odG1sLAogICAgICAgIHByb3BzOiB7CiAgICAgICAgICB0ZW1wbGF0ZUtleTogU3RyaW5nLAogICAgICAgICAgdGVtcGxhdGVJbmZvOiBPYmplY3QsCiAgICAgICAgICBzaW5nbGU6IFN0cmluZywKICAgICAgICAgIGRlZktleTogU3RyaW5nLAogICAgICAgICAgdGFza1R5cGU6IHsKICAgICAgICAgICAgZGVmYXVsdDogJycKICAgICAgICAgIH0sCiAgICAgICAgICBkYXRhVmlldzogT2JqZWN0LAogICAgICAgICAgaXNKb2luRmxvdzogewogICAgICAgICAgICBkZWZhdWx0OiBmYWxzZQogICAgICAgICAgfSwKICAgICAgICAgIHBhcmFtZXRlcnFRdWVyeXM6IFN0cmluZwogICAgICAgIH0sCiAgICAgICAgZGF0YTogZnVuY3Rpb24gZGF0YSgpIHsKICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgIHRyZWVRdWVyeXM6IFtdLAogICAgICAgICAgICBhbGlhc19uZXc6ICdzdGF0ZW1lbnQnLAogICAgICAgICAgICBsb2FkaW5nOiBmYWxzZSwKICAgICAgICAgICAgUVJDb2RldXJsOiAnJywKICAgICAgICAgICAgUVJDb2RlRGlhbG9nOiBmYWxzZSwKICAgICAgICAgICAgaHRtbDogJycsCiAgICAgICAgICAgIHRhYmxlRGF0YTogewogICAgICAgICAgICAgIHNlbGVjdFJvd3M6IFtdLAogICAgICAgICAgICAgIHF1ZXJ5czogJycKICAgICAgICAgICAgfSwKICAgICAgICAgICAgZGlhbG9nRXhwb3J0VmlzaWJsZTogZmFsc2UsCiAgICAgICAgICAgIGV4cG9ydERhdGE6IHsKICAgICAgICAgICAgICBnZXRUeXBlOiAnYWxsJywKICAgICAgICAgICAgICBleHBGaWVsZDogW10KICAgICAgICAgICAgfSwKICAgICAgICAgICAgZGlzcGxheUZpZWxkczogW10sCiAgICAgICAgICAgIGV4cG9ydFNlbGxlY3Rpb246IFtdLAogICAgICAgICAgICBzZWFyY2hGb3JtOiB7CiAgICAgICAgICAgICAgRl94YjogJycsCiAgICAgICAgICAgICAgRl94bTogJycKICAgICAgICAgICAgfSwKICAgICAgICAgICAgcXVlcnlGb3JtOiB7CiAgICAgICAgICAgICAgcXVlcnlEYXRhOiAnJwogICAgICAgICAgICB9LAogICAgICAgICAgICBmb3JtVHlwZTogZmFsc2UsCiAgICAgICAgICAgIGxhYmVsUG9zaXRpb246ICdsZWZ0JywKICAgICAgICAgICAgaW5jb25zOiAnZWwtaWNvbi1hcnJvdy1kb3duJywKICAgICAgICAgICAgb3B0aW9uczogewogICAgICAgICAgICAgIGZ1bGxzY3JlZW46IHRydWUsCiAgICAgICAgICAgICAgbG9jazogdHJ1ZQogICAgICAgICAgICB9LAogICAgICAgICAgICByb3dUZW1wbGF0ZUlkOiBudWxsLAogICAgICAgICAgICByb3dJZDogbnVsbCwKICAgICAgICAgICAgUVJDb2RlU2hvdzogdHJ1ZSwKICAgICAgICAgICAgUVJDb2RlRGVzYzogW10sCiAgICAgICAgICAgIHRyZWU6IFtdLAogICAgICAgICAgICBjdXN0b21EaWFsb2c6IFtdLAogICAgICAgICAgICB0YWJsZUhlaWdodDogMC42ODUgKiB3aW5kb3cuaW5uZXJIZWlnaHQsCiAgICAgICAgICAgIGRpYWxvZ1N1YlZpc2libGU6IGZhbHNlLAogICAgICAgICAgICB0YWJzOiBbXSwKICAgICAgICAgICAgZW50czogW10sCiAgICAgICAgICAgIG1vZGlmeVJlY29yZDogewogICAgICAgICAgICAgIHBhZ2luYXRpb246IHsKICAgICAgICAgICAgICAgIHBhZ2VCZWFuOiB7CiAgICAgICAgICAgICAgICAgIHBhZ2U6IDEsCiAgICAgICAgICAgICAgICAgIHBhZ2VTaXplOiAyMCwKICAgICAgICAgICAgICAgICAgdG90YWw6IDAKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHJlY29yZExpc3Q6IFtdLAogICAgICAgICAgICByZWNvcmRSZWZJZDogJycsCiAgICAgICAgICAgIGRpYWxvZ1JlY29yZFZpc2libGU6IGZhbHNlLAogICAgICAgICAgICByZWNvcmRUYWJsZUxvYWRpbmc6IGZhbHNlLAogICAgICAgICAgICBtb2RpZnlEZXRhaWxEaWFsb2dWaXNpYmxlOiBmYWxzZSwKICAgICAgICAgICAgY3VycmVudE1vZGlmeToge30sCiAgICAgICAgICAgIHJlZklkOiAnJywKICAgICAgICAgICAgcXVlcnlTdWJWYWx1ZTogJycsCiAgICAgICAgICAgIHN1YlRhYmxlTG9hZGluZzogZmFsc2UsCiAgICAgICAgICAgIGN1cnJlbnRUYWJOYW1lOiAnJywKICAgICAgICAgICAgY3VycmVudFRhYjoge30sCiAgICAgICAgICAgIGV4cG9ydFR5cGU6ICdtYWluJywKICAgICAgICAgICAgc3ViRGlzcGxheUZpZWxkczogW10sCiAgICAgICAgICAgIHN1YkRpc3BsYXlGaWVsZHNMaXN0OiBbXSwKICAgICAgICAgICAgbm90UHJpbnQ6IGZhbHNlLAogICAgICAgICAgICBkaXNwbGF5RmllbGQ6IHt9LAogICAgICAgICAgICB0cmVlTGlzdDogW10sCiAgICAgICAgICAgIHJvd3M6IFtdLAogICAgICAgICAgICBwYWdpbmF0aW9uOiB7CiAgICAgICAgICAgICAgcGFnZTogMSwKICAgICAgICAgICAgICBwYWdlU2l6ZTogMTAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgcGFnaW5hdGlvbkxheW91dDogJ3RvdGFsLCBzaXplcywgcHJldiwgcGFnZXIsIG5leHQsIGp1bXBlcicsCiAgICAgICAgICAgIHRvdGFsOiAwLAogICAgICAgICAgICBwZXJtaXNzaW9uOiB7CiAgICAgICAgICAgICAgcHJpbnQ6IHRydWUsCiAgICAgICAgICAgICAgYWRkOiB0cnVlLAogICAgICAgICAgICAgIGRlbDogdHJ1ZSwKICAgICAgICAgICAgICBleHBvcnQ6IHRydWUsCiAgICAgICAgICAgICAgZWRpdDogdHJ1ZSwKICAgICAgICAgICAgICBoaWRkZW46IGZhbHNlCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHNob3dSaWdodE1lbnU6IHRydWUsCiAgICAgICAgICAgIGxpc3RTZWxlY3RhYmxlOiB0cnVlLAogICAgICAgICAgICBmaWx0ZXJzOiB7fSwKICAgICAgICAgICAgc29ydGVyOiBudWxsLAogICAgICAgICAgICBkaWFsb2dTdW5WaXNpYmxlOiBmYWxzZSwKICAgICAgICAgICAgLy/lrZnooajlr7nor53moYYKICAgICAgICAgICAgc3VuVGFiczogW10sCiAgICAgICAgICAgIC8v5a2Z6KGo5pWw5o2uCiAgICAgICAgICAgIHF1ZXJ5U3VuVmFsdWU6ICcnLAogICAgICAgICAgICBvcGVyYXRlQ29sV2lkdGg6ICcyNDAnLAogICAgICAgICAgICBzdW1tYXJ5RmllbGRzOiBbXSwKICAgICAgICAgICAgZGlhbG9nVmlzaWJsZTogZmFsc2UsCiAgICAgICAgICAgIHBhZ2VSZXN1bHQ6IHsKICAgICAgICAgICAgICBwYWdlOiAxLAogICAgICAgICAgICAgIHBhZ2VTaXplOiAyMCwKICAgICAgICAgICAgICB0b3RhbDogMAogICAgICAgICAgICB9LAogICAgICAgICAgICBsb2dEYXRhOiBbXSwKICAgICAgICAgICAgbm90U29ydGFibGVGaWVsZHM6IFsnYnBtX3N0YXR1c18nLCAnYnBtX3Byb2NfaW5zdF9pZF8nLCAnYnBtX3N1YmplY3RfJywgJ2JwbV9wcm9jX2RlZl9uYW1lXycsICdicG1fY3JlYXRlX3RpbWVfJywgJ2JwbV9lbmRfdGltZV8nLCAnYnBtX2lzX2ZvcmJpZGRlbl8nLCAnYnBtX2NyZWF0b3JfJ10sCiAgICAgICAgICAgIGRlZmF1bHRWYWx1ZUxpc3Q6IFtdLAogICAgICAgICAgICAvL+aJuemHj+abtOaWsOaVsOaNrgogICAgICAgICAgICBpZ25vcmVkQWxpYXM6IFsnYXBwQ2VudGVyRnJvbnQnXSwKICAgICAgICAgICAgUVJDb2RlUGF0dGVybjogdHJ1ZSwKICAgICAgICAgICAgUVJDb2RlVHlwZTogJycsCiAgICAgICAgICAgIGlzTW9iaWxlOiBmYWxzZSwKICAgICAgICAgICAgYWN0aXZlTmFtZXM6IFsnMSddLAogICAgICAgICAgICBzd2l0Y2hNYXA6IHt9LAogICAgICAgICAgICBmaWx0ZXJNYXA6IHt9CiAgICAgICAgICB9OwogICAgICAgIH0sCiAgICAgICAgY29tcG9uZW50czogewogICAgICAgICAgVlJ1bnRpbWVUZW1wbGF0ZTogVlJ1bnRpbWVUZW1wbGF0ZSwKICAgICAgICAgIEh0Q2hlY2tib3g6IEh0Q2hlY2tib3gsCiAgICAgICAgICBIdERpYWxvZzogSHREaWFsb2csCiAgICAgICAgICBIdERpYWxvZ0J0bjogSHREaWFsb2dCdG4sCiAgICAgICAgICBUZW1wbGF0ZUJhdGNoVXBkYXRlRGlhbG9nOiBUZW1wbGF0ZUJhdGNoVXBkYXRlRGlhbG9nLAogICAgICAgICAgRWlwU2VsZWN0OiBFaXBTZWxlY3QKICAgICAgICB9LAogICAgICAgIHdhdGNoOiB7CiAgICAgICAgICBlbnRzOiB7CiAgICAgICAgICAgIGhhbmRsZXI6IGZ1bmN0aW9uIGhhbmRsZXIobmV3VmFsLCBvbGRWYWx1ZSkgewogICAgICAgICAgICAgIGlmIChuZXdWYWwgJiYgbmV3VmFsLmxlbmd0aCA+PSAxICYmIG5ld1ZhbCAhPSBvbGRWYWx1ZSkgewogICAgICAgICAgICAgICAgdGhpcy5nZXRTdWJEYXRhKHRoaXMsIHRoaXMucmVmSWQpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwKICAgICAgICAgICAgZGVlcDogdHJ1ZSwKICAgICAgICAgICAgaW1tZWRpYXRlOiB0cnVlCiAgICAgICAgICB9LAogICAgICAgICAgdGVtcGxhdGVJbmZvOiB7CiAgICAgICAgICAgIGhhbmRsZXI6IGZ1bmN0aW9uIGhhbmRsZXIobmV3VmFsLCBvbGRWYWwpIHsKICAgICAgICAgICAgICB2YXIgX3RoaXMgPSB0aGlzOwogICAgICAgICAgICAgIGlmIChuZXdWYWwgJiYgbmV3VmFsLmlkKSB7CiAgICAgICAgICAgICAgICB2YXIgbG9hZGluZyA9IHRoaXMuJGxvYWRpbmcodGhpcy5vcHRpb25zKTsKICAgICAgICAgICAgICAgIHZhciBfbWUgPSB0aGlzOwogICAgICAgICAgICAgICAgX21lLnRlbXBsYXRlSW5mbyA9IG5ld1ZhbDsKICAgICAgICAgICAgICAgIGlmIChfbWUudGVtcGxhdGVJbmZvLmRpc3BsYXlGaWVsZCkgewogICAgICAgICAgICAgICAgICB2YXIgZGlzcGxheUZpZWxkID0gdXRpbHMucGFyc2VUb0pzb24oX21lLnRlbXBsYXRlSW5mby5kaXNwbGF5RmllbGQpOwogICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGRpc3BsYXlGaWVsZC5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgICAgICAgIGlmIChkaXNwbGF5RmllbGRbaV0udHlwZSkgewogICAgICAgICAgICAgICAgICAgICAgdGhpcy5kaXNwbGF5RmllbGRzLnB1c2goZGlzcGxheUZpZWxkW2ldKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmIChfbWUudGVtcGxhdGVJbmZvLmNvbmRpdGlvbkZpZWxkKSB7CiAgICAgICAgICAgICAgICAgIHZhciBjb25kaXRpb25GaWVsZCA9IHV0aWxzLnBhcnNlVG9Kc29uKF9tZS50ZW1wbGF0ZUluZm8uY29uZGl0aW9uRmllbGQpOwogICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNvbmRpdGlvbkZpZWxkLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGZpZWxkTmFtZSA9ICdGXycgKyBjb25kaXRpb25GaWVsZFtpXS5uYW1lOwogICAgICAgICAgICAgICAgICAgIHRoaXMuJHNldCh0aGlzLnNlYXJjaEZvcm0sIGZpZWxkTmFtZSwgJycpOwogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB2YXIgcGFyYW1zID0gewogICAgICAgICAgICAgICAgICB0ZW1wbGF0ZUlkOiBfbWUudGVtcGxhdGVJbmZvLmlkCiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgdmFyIHBhZ2VCZWFuID0gewogICAgICAgICAgICAgICAgICBwYWdlQmVhbjogewogICAgICAgICAgICAgICAgICAgIHBhZ2U6ICcxJywKICAgICAgICAgICAgICAgICAgICBwYWdlU2l6ZTogbmV3VmFsLnBhZ2VTaXplLAogICAgICAgICAgICAgICAgICAgIHNob3dUb3RhbDogJ3RydWUnCiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH07IC8v5Yid5qyh5Yqg6L296buY6K6kcGFnZUJlYW4KICAgICAgICAgICAgICAgIHBhcmFtcy5wYWdpbmF0aW9uID0gcGFnZUJlYW47CiAgICAgICAgICAgICAgICBpZiAoX21lLmlzSm9pbkZsb3cpIHsKICAgICAgICAgICAgICAgICAgcGFyYW1zLmlzSm9pbkZsb3cgPSB0cnVlOwogICAgICAgICAgICAgICAgICBwYXJhbXMudGFza1R5cGUgPSBfbWUudGFza1R5cGU7CiAgICAgICAgICAgICAgICAgIHBhcmFtcy5kZWZLZXkgPSBfbWUuZGVmS2V5OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKF9tZS5kYXRhVmlldykgewogICAgICAgICAgICAgICAgICBfbWUuaGFuZGVsQmluZEZpbGVkVmFsdWEoKTsKICAgICAgICAgICAgICAgICAgLy/lhbPogZTmn6Xor6LlrZfmrrUKICAgICAgICAgICAgICAgICAgaWYgKF9tZS5kYXRhVmlldy5zZWxlY3RMaXN0ICYmIF9tZS5kYXRhVmlldy5zZWxlY3RMaXN0Lmxlbmd0aCA+IDApIHsKICAgICAgICAgICAgICAgICAgICBwYXJhbXMuc2VsZWN0TGlzdCA9IF9tZS5kYXRhVmlldy5zZWxlY3RMaXN0OwogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIHBhcmFtcy5yZWZJZFZhbHVlID0gX21lLmRhdGFWaWV3LnJlZklkVmFsdWU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAodGhpcy5wYXJhbWV0ZXJxUXVlcnlzKSB7CiAgICAgICAgICAgICAgICAgIHZhciBxdWVyeXMgPSBKU09OLnBhcnNlKEJhc2U2NC5kZWNvZGUoZGVjb2RlVVJJQ29tcG9uZW50KHRoaXMucGFyYW1ldGVycVF1ZXJ5cykpKTsKICAgICAgICAgICAgICAgICAgcGFyYW1zLnBhZ2luYXRpb24ucXVlcnlzID0gcXVlcnlzOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgdmFyIGRlZmF1bHRRdWVyeSA9IHRoaXMuYnVpbGREZWZhdWx0UXVlcnlzKCk7CiAgICAgICAgICAgICAgICBpZiAoZGVmYXVsdFF1ZXJ5Lmxlbmd0aCA+IDApIHsKICAgICAgICAgICAgICAgICAgaWYgKHBhcmFtcy5wYWdpbmF0aW9uLnF1ZXJ5cykgewogICAgICAgICAgICAgICAgICAgIHBhcmFtcy5wYWdpbmF0aW9uLnF1ZXJ5cy5jb25jYXQoZGVmYXVsdFF1ZXJ5KTsKICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBwYXJhbXMucGFnaW5hdGlvbi5xdWVyeXMgPSBkZWZhdWx0UXVlcnk7CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC8v5aaC5p6c5pyJ6K6+572u6buY6K6k5o6S5bqPLOS8mOWFiOS9v+eUqOm7mOiupOaOkuW6jwogICAgICAgICAgICAgICAgaWYgKHRoaXMudGVtcGxhdGVJbmZvLnNvcnRGaWVsZCkgewogICAgICAgICAgICAgICAgICB2YXIgc29ydEZpZWxkID0gSlNPTi5wYXJzZSh0aGlzLnRlbXBsYXRlSW5mby5zb3J0RmllbGQpOwogICAgICAgICAgICAgICAgICB2YXIgc29ydGVyID0gW107CiAgICAgICAgICAgICAgICAgIGZvciAodmFyIHggPSAwOyB4IDwgc29ydEZpZWxkLmxlbmd0aDsgeCsrKSB7CiAgICAgICAgICAgICAgICAgICAgc29ydGVyLnB1c2goewogICAgICAgICAgICAgICAgICAgICAgJ3Byb3BlcnR5Jzogc29ydEZpZWxkW3hdLm5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAnZGlyZWN0aW9uJzogc29ydEZpZWxkW3hdLnNvcnQKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICBwYXJhbXMucGFnaW5hdGlvbi5zb3J0ZXIgPSBzb3J0ZXI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB2YXIgdGhpc18gPSB0aGlzOwogICAgICAgICAgICAgICAgaWYgKHBhcmFtcy50ZW1wbGF0ZUlkKSB7CiAgICAgICAgICAgICAgICAgIHRoaXMuJHN0b3JlLmRpc3BhdGNoKCdmb3JtL2dldEJwbVRlbXBsYXRlQnlQYWdpbmF0aW9uJywgcGFyYW1zKS50aGVuKGZ1bmN0aW9uIChyZXNwb25zZSkgewogICAgICAgICAgICAgICAgICAgIHRoaXNfLnJvd3MgPSByZXNwb25zZS5kYXRhLnJvd3M7CiAgICAgICAgICAgICAgICAgICAgdGhpc18udG90YWwgPSByZXNwb25zZS5kYXRhLnRvdGFsOwogICAgICAgICAgICAgICAgICAgIHRoaXNfLnBhZ2luYXRpb24ucGFnZSA9IHJlc3BvbnNlLmRhdGEucGFnZTsKICAgICAgICAgICAgICAgICAgICB0aGlzXy5wYWdpbmF0aW9uLnBhZ2VTaXplID0gcmVzcG9uc2UuZGF0YS5wYWdlU2l6ZTsKICAgICAgICAgICAgICAgICAgICBsb2FkaW5nLmNsb3NlKCk7CiAgICAgICAgICAgICAgICAgICAgdGhpc18uaW5pdFN3aXRjaFN0YXR1cygpOwogICAgICAgICAgICAgICAgICAgIGlmICh0aGlzXy4kZWwgJiYgdGhpc18uJGVsLnF1ZXJ5U2VsZWN0b3IpIHsKICAgICAgICAgICAgICAgICAgICAgIHZhciB0b3BCdG5Eb20gPSB0aGlzXy4kZWwucXVlcnlTZWxlY3RvcignZGl2LnRvcF9idG5fY29sJyk7CiAgICAgICAgICAgICAgICAgICAgICBpZiAoIXRvcEJ0bkRvbSB8fCAhdG9wQnRuRG9tLnF1ZXJ5U2VsZWN0b3IoJ2kuZWwtaWNvbi1kZWxldGUnKSAmJiAhdG9wQnRuRG9tLnF1ZXJ5U2VsZWN0b3IoJ2kuZWwtaWNvbi1lZGl0JykgJiYgIXRvcEJ0bkRvbS5xdWVyeVNlbGVjdG9yKCdpLmVsLWljb24tcy1ncmlkJykpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpc18ubGlzdFNlbGVjdGFibGUgPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgdGREb20gPSB0aGlzXy4kZWwucXVlcnlTZWxlY3RvcigndGQucmlnaHRfbWVudScpOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXRkRG9tIHx8ICF0ZERvbS5xdWVyeVNlbGVjdG9yKCdidXR0b24nKSAmJiB0ZERvbS5xdWVyeVNlbGVjdG9yKCdzd2l0Y2gnKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXNfLnNob3dSaWdodE1lbnUgPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgfSwgMjAwKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgbG9hZGluZy5jbG9zZSgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKG5ld1ZhbC50cmVlRmllbGQgJiYgbmV3VmFsLnRyZWVGaWVsZCAhPT0gJ3t9JykgewogICAgICAgICAgICAgICAgICB2YXIgdHJlZUZpZWxkID0gSlNPTi5wYXJzZShuZXdWYWwudHJlZUZpZWxkKTsKICAgICAgICAgICAgICAgICAgdGhpcy5pbml0VHJlZSh0cmVlRmllbGQpOwogICAgICAgICAgICAgICAgICBmb3JtLmdldFN1YkVudHNCeUZvcm1LZXkodGhpcy50ZW1wbGF0ZUluZm8uZm9ybUtleSwgZnVuY3Rpb24gKHJlc3ApIHsKICAgICAgICAgICAgICAgICAgICByZXNwLmRhdGEuZm9yRWFjaChmdW5jdGlvbiAoaXRlbSkgewogICAgICAgICAgICAgICAgICAgICAgdmFyIHN1YkRpc3BsYXlGaWVsZHMgPSBbXTsKICAgICAgICAgICAgICAgICAgICAgIGl0ZW0uYXR0cmlidXRlTGlzdC5mb3JFYWNoKGZ1bmN0aW9uIChhdHRyKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHN1YkRpc3BsYXlGaWVsZHMucHVzaCh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzYzogYXR0ci5jb21tZW50LAogICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6IGF0dHIuZmllbGROYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IGF0dHIuY29sdW1uVHlwZQogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgX3RoaXMuc3ViRGlzcGxheUZpZWxkcy5wdXNoKHsKICAgICAgICAgICAgICAgICAgICAgICAgZmllbGRzOiBzdWJEaXNwbGF5RmllbGRzLAogICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiBpdGVtLm5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1lbnQ6IGl0ZW0uY29tbWVudAogICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKG5ld1ZhbC5zdW1tYXJ5RmllbGQpIHsKICAgICAgICAgICAgICAgICAgdGhpcy5zdW1tYXJ5RmllbGRzID0gSlNPTi5wYXJzZShuZXdWYWwuc3VtbWFyeUZpZWxkKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGRlZXA6IHRydWUsCiAgICAgICAgICAgIGltbWVkaWF0ZTogdHJ1ZQogICAgICAgICAgfSwKICAgICAgICAgIGN1cnJlbnRUYWJOYW1lOiBmdW5jdGlvbiBjdXJyZW50VGFiTmFtZShuZXdWYWwpIHsKICAgICAgICAgICAgaWYgKG5ld1ZhbCkgewogICAgICAgICAgICAgIHRoaXMucXVlcnlTdWJWYWx1ZSA9ICcnOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfSwKICAgICAgICBjb21wdXRlZDogewogICAgICAgICAgc2hvd0RyYWZ0TGlzdDogZnVuY3Rpb24gc2hvd0RyYWZ0TGlzdCgpIHsKICAgICAgICAgICAgLy/lpoLmnpzlvZPliY3pobXpnaLooqvltYzlhaVpZnJhbWXph4zpnaLkuI3mmL7npLrojYnnqL8KICAgICAgICAgICAgcmV0dXJuIHdpbmRvdy5zZWxmID09PSB3aW5kb3cudG9wOwogICAgICAgICAgfQogICAgICAgIH0sCiAgICAgICAgbW91bnRlZDogZnVuY3Rpb24gbW91bnRlZCgpIHsKICAgICAgICAgIHRoaXMuaGFuZGVsQmluZEZpbGVkVmFsdWEoKTsKICAgICAgICAgIHZhciB0aGlzXyA9IHRoaXM7CiAgICAgICAgICB0aGlzLiRyb290LiRvbignZm9ybS1yZWxvYWQtc3VjY2VzcycsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgdGhpc18uaGFuZGVsQmluZEZpbGVkVmFsdWEoKTsKICAgICAgICAgIH0pOwogICAgICAgICAgdGhpcy4kZW1pdCgnYWZ0ZXJNb3VudGVkJyk7CiAgICAgICAgfSwKICAgICAgICBtZXRob2RzOiB7CiAgICAgICAgICBsb2FkRGF0YTogZnVuY3Rpb24gbG9hZERhdGEocGFyYW0sIGNiKSB7CiAgICAgICAgICAgIHZhciBfdGhpczIgPSB0aGlzOwogICAgICAgICAgICB2YXIgcXVlcnlzID0gcGFyYW0ucXVlcnlzIHx8IFtdOwogICAgICAgICAgICB2YXIgaGFzRGVmYXVsdFF1ZXJ5ID0gZmFsc2U7CiAgICAgICAgICAgIHRoaXMuaGFuZGVsQmluZEZpbGVkVmFsdWEoKTsKICAgICAgICAgICAgdmFyIHBJRCA9IHRoaXMuZGF0YVZpZXcucmVmSWRWYWx1ZTsKICAgICAgICAgICAgcXVlcnlzLmZvckVhY2goZnVuY3Rpb24gKHEpIHsKICAgICAgICAgICAgICBpZiAocS5wcm9wZXJ0eSA9PSAnUElkJykgewogICAgICAgICAgICAgICAgaGFzRGVmYXVsdFF1ZXJ5ID0gdHJ1ZTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICBpZiAoIWhhc0RlZmF1bHRRdWVyeSkgewogICAgICAgICAgICAgIHF1ZXJ5cy5wdXNoKHsKICAgICAgICAgICAgICAgIG9wZXJhdGlvbjogJ0VRVUFMJywKICAgICAgICAgICAgICAgIGdyb3VwOiAnZGVmYWx1dCcsCiAgICAgICAgICAgICAgICBwcm9wZXJ0eTogJ1BJZCcsCiAgICAgICAgICAgICAgICByZWxhdGlvbjogJ0FORCcsCiAgICAgICAgICAgICAgICB2YWx1ZTogcElECiAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgcXVlcnlzLnB1c2goewogICAgICAgICAgICAgICAgb3BlcmF0aW9uOiAnRVFVQUwnLAogICAgICAgICAgICAgICAgZ3JvdXA6ICdkZWZhbHV0JywKICAgICAgICAgICAgICAgIHByb3BlcnR5OiAnYm9BbGlhcycsCiAgICAgICAgICAgICAgICByZWxhdGlvbjogJ0FORCcsCiAgICAgICAgICAgICAgICB2YWx1ZTogdGhpcy50ZW1wbGF0ZUluZm8uYm9EZWZBbGlhcwogICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHBhcmFtLnF1ZXJ5cyA9IHF1ZXJ5czsKICAgICAgICAgICAgcmVxLnBvc3Qod2luZG93LmNvbnRleHQuZm9ybSArICcvZm9ybS9mb3JtRGF0YUltcG9ydExvZy92MS9saXN0SnNvbicsIHBhcmFtKS50aGVuKGZ1bmN0aW9uIChkYXRhKSB7CiAgICAgICAgICAgICAgdmFyIHJlc3BvbnNlID0gZGF0YS5kYXRhOwogICAgICAgICAgICAgIF90aGlzMi5sb2dEYXRhID0gcmVzcG9uc2Uucm93czsKICAgICAgICAgICAgICBfdGhpczIucGFnZVJlc3VsdCA9IHsKICAgICAgICAgICAgICAgIHBhZ2U6IHJlc3BvbnNlLnBhZ2UsCiAgICAgICAgICAgICAgICBwYWdlU2l6ZTogcmVzcG9uc2UucGFnZVNpemUsCiAgICAgICAgICAgICAgICB0b3RhbDogcmVzcG9uc2UudG90YWwKICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9KS5maW5hbGx5KGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICByZXR1cm4gY2IoKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgICB9LAogICAgICAgICAgaGFuZGVsQmluZEZpbGVkVmFsdWE6IGZ1bmN0aW9uIGhhbmRlbEJpbmRGaWxlZFZhbHVhKCkgewogICAgICAgICAgICAvL+aVsOaNruinhuWbvuaOp+S7tgogICAgICAgICAgICB2YXIgX21lID0gdGhpczsKICAgICAgICAgICAgaWYgKHRoaXMuZGF0YVZpZXcpIHsKICAgICAgICAgICAgICB2YXIgcEluc3QgPSB1dGlscy5nZXRPbmxpbmVGb3JtSW5zdGFuY2UodGhpcy4kcGFyZW50LiRwYXJlbnQuJHBhcmVudC4kcGFyZW50KTsKICAgICAgICAgICAgICBpZiAoIXBJbnN0W3RoaXMuZGF0YVZpZXcuYm9EZWZBbGlhc10pIHsKICAgICAgICAgICAgICAgIHRoaXMuZGF0YVZpZXcuYm9EZWZBbGlhcyA9IE9iamVjdC5rZXlzKHBJbnN0LmRhdGEpWzBdOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB2YXIgcmVmSWRWYWx1ZSA9IHV0aWxzLmdldFZhbHVlQnlQYXRoKHBJbnN0LCAnZGF0YS4nICsgdGhpcy5kYXRhVmlldy5ib0RlZkFsaWFzICsgJy5pZF8nKTsKICAgICAgICAgICAgICBpZiAoc2Vzc2lvblN0b3JhZ2UuZ2V0SXRlbSgnZm9ybUltcG9ydFRlbXBSZWZJZCcpICYmICFyZWZJZFZhbHVlKSB7CiAgICAgICAgICAgICAgICByZWZJZFZhbHVlID0gc2Vzc2lvblN0b3JhZ2UuZ2V0SXRlbSgnZm9ybUltcG9ydFRlbXBSZWZJZCcpOwogICAgICAgICAgICAgIH0gZWxzZSBpZiAoIXJlZklkVmFsdWUpIHsKICAgICAgICAgICAgICAgIC8v5a+85YWl55qE5pe25YCZ5rKh5pyJ5YWz6ZSu55qE5aSW6ZSu77yM5YiZ5Li65YW26Ieq5Yqo5re75YqgCiAgICAgICAgICAgICAgICByZWZJZFZhbHVlID0gbmV3IERhdGUoKS5nZXRUaW1lKCk7CiAgICAgICAgICAgICAgICBzZXNzaW9uU3RvcmFnZS5zZXRJdGVtKCdmb3JtSW1wb3J0VGVtcFJlZklkJywgcmVmSWRWYWx1ZSk7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIF9tZS5kYXRhVmlldy5yZWZJZFZhbHVlID0gcmVmSWRWYWx1ZTsKICAgICAgICAgICAgICBpZiAocEluc3QucGVybWlzc2lvbiAmJiBwSW5zdC5wZXJtaXNzaW9uLnRhYmxlICYmIHBJbnN0LnBlcm1pc3Npb24udGFibGVbdGhpcy50ZW1wbGF0ZUluZm8uYm9EZWZBbGlhc10pIHsKICAgICAgICAgICAgICAgIHRoaXMucGVybWlzc2lvbiA9IHBJbnN0LnBlcm1pc3Npb24udGFibGVbdGhpcy50ZW1wbGF0ZUluZm8uYm9EZWZBbGlhc107CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIGlmICh0aGlzLnBlcm1pc3Npb24uaGlkZGVuKSB7CiAgICAgICAgICAgICAgICB0aGlzLiRwYXJlbnQuc2hvd0RhdGVWaWV3ID0gZmFsc2U7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIC8v5YWz6IGU5p+l6K+i5a2X5q61CiAgICAgICAgICAgICAgdmFyIHNlbGVjdExpc3QgPSB0aGlzLmRhdGFWaWV3LnNlbGVjdExpc3Q7CiAgICAgICAgICAgICAgaWYgKHNlbGVjdExpc3QgJiYgc2VsZWN0TGlzdC5sZW5ndGggPiAwKSB7CiAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHNlbGVjdExpc3QubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgICAgaWYgKHNlbGVjdExpc3RbaV0uc2VsZWN0RmllbGQpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgcGF0aCA9ICdkYXRhLicgKyB0aGlzLmRhdGFWaWV3LmJvRGVmQWxpYXMgKyAnLicgKyBzZWxlY3RMaXN0W2ldLnNlbGVjdEZpZWxkOwogICAgICAgICAgICAgICAgICAgIHZhciB2YWx1ZSA9IHV0aWxzLmdldFZhbHVlQnlQYXRoKHBJbnN0LCBwYXRoKTsKICAgICAgICAgICAgICAgICAgICBzZWxlY3RMaXN0W2ldLnNlbGVjdFZhbHVlID0gdmFsdWU7CgogICAgICAgICAgICAgICAgICAgIC8v5re75Yqg55uR5ZCsCiAgICAgICAgICAgICAgICAgICAgcEluc3QuJHdhdGNoKHBhdGgsIGZ1bmN0aW9uIChuZXdWYWwsIG9sZFZhbCkgewogICAgICAgICAgICAgICAgICAgICAgLy8g55uR5ZCs5Lit5L2/55So6Ze06ZqU6K+35rGC77yM5YeP5bCR6K+35rGC5qyh5pWwCiAgICAgICAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQodGhpcy50aW1lb3V0KTsKICAgICAgICAgICAgICAgICAgICAgIHRoaXMudGltZW91dCA9IHNldFRpbWVvdXQoZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAobmV3VmFsICE9PSBvbGRWYWwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAvL19tZS5zZXREYXRhVmlld1ZhbHVlKF9tZS5kYXRhVmlldyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgX21lLnNlYXJjaCgpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICB9LCA1MDApOwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIC8v5YWz6IGU5aGr5YWF5a2X5q61CiAgICAgICAgICAgICAgdmFyIGJpbmRMaXN0ID0gdGhpcy5kYXRhVmlldy5iaW5kTGlzdDsKICAgICAgICAgICAgICBpZiAoYmluZExpc3QgJiYgYmluZExpc3QubGVuZ3RoID4gMCkgewogICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBiaW5kTGlzdC5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgICAgICBpZiAoYmluZExpc3RbaV0uZmlsbEZpZWxkKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIF9wYXRoID0gJ2RhdGEuJyArIHRoaXMuZGF0YVZpZXcuYm9EZWZBbGlhcyArICcuJyArIGJpbmRMaXN0W2ldLmZpbGxGaWVsZDsKICAgICAgICAgICAgICAgICAgICB2YXIgX3ZhbHVlID0gdXRpbHMuZ2V0VmFsdWVCeVBhdGgocEluc3QsIF9wYXRoKTsKICAgICAgICAgICAgICAgICAgICBiaW5kTGlzdFtpXS5maWxsVmFsdWUgPSBfdmFsdWU7CiAgICAgICAgICAgICAgICAgICAgcEluc3QuJHdhdGNoKF9wYXRoLCBmdW5jdGlvbiAobmV3VmFsLCBvbGRWYWwpIHsKICAgICAgICAgICAgICAgICAgICAgIC8vIOebkeWQrOS4reS9v+eUqOmXtOmalOivt+axgu+8jOWHj+Wwkeivt+axguasoeaVsAogICAgICAgICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHRoaXMudGltZW91dCk7CiAgICAgICAgICAgICAgICAgICAgICB0aGlzLnRpbWVvdXQgPSBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5ld1ZhbCAhPT0gb2xkVmFsKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgLy9fbWUuc2V0RGF0YVZpZXdWYWx1ZShfbWUuZGF0YVZpZXcpOwogICAgICAgICAgICAgICAgICAgICAgICAgIF9tZS5zZWFyY2goKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgfSwgNTAwKTsKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgfSwKICAgICAgICAgIHByaW50TGlzdDogZnVuY3Rpb24gcHJpbnRMaXN0KCkgewogICAgICAgICAgICB2YXIgX3RoaXMzID0gdGhpczsKICAgICAgICAgICAgdGhpcy5ub3RQcmludCA9IHRydWU7CiAgICAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgIGRvY3VtZW50LmJvZHkuaW5uZXJIVE1MID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3ByaW50RGF0YScpLmlubmVySFRNTDsKICAgICAgICAgICAgICB3aW5kb3cucHJpbnQoKTsKICAgICAgICAgICAgICBsb2NhdGlvbi5yZWxvYWQoKTsKICAgICAgICAgICAgfSwgMjAwKTsKICAgICAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgX3RoaXMzLm5vdFByaW50ID0gZmFsc2U7CiAgICAgICAgICAgIH0sIDIwMCk7CiAgICAgICAgICB9LAogICAgICAgICAgcHJpbnREZXRhaWw6IGZ1bmN0aW9uIHByaW50RGV0YWlsKHRlbXBsYXRlSWQsIGlkLCBhY3Rpb24pIHsKICAgICAgICAgICAgLy/mlbDmja7pmo/mnLrmt7vliqDliLDlhbbku5boj5zljZXkuIvpnaLml7bojrflj5blvZPliY3oj5zljZXnmoTliKvlkI0KICAgICAgICAgICAgaWYgKHNlc3Npb25TdG9yYWdlLm1lbnVfYWxpYXMpIHsKICAgICAgICAgICAgICB0aGlzLmFsaWFzX25ldyA9IHNlc3Npb25TdG9yYWdlLm1lbnVfYWxpYXM7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdmFyIHVybCA9ICcvJyArIHRoaXMuYWxpYXNfbmV3ICsgJy90ZW1wbGF0ZS9mb3JtLycgKyB0aGlzLnRlbXBsYXRlS2V5ICsgJy8nICsgYWN0aW9uICsgJy90cnVlJzsKICAgICAgICAgICAgaWYgKGlkKSB7CiAgICAgICAgICAgICAgdXJsID0gdXJsICsgJz9pZD0nICsgaWQgKyAnJic7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgdXJsICs9ICc/JzsKICAgICAgICAgICAgfQogICAgICAgICAgICB2YXIgc3RhcnRGbG93U3RyID0gJ3N0YXJ0Rmxvdz1mYWxzZSc7CiAgICAgICAgICAgIHZhciBwYXRoID0gdXJsICsgc3RhcnRGbG93U3RyOwogICAgICAgICAgICBpZiAocGF0aC5pbmRleE9mKCdvdGhlcm1lbnUnKSAhPSAtMSkgewogICAgICAgICAgICAgIHBhdGggPSBwYXRoLnJlcGxhY2UoJy9vdGhlcm1lbnUnLCAnL3N0YXRlbWVudCcpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHRoaXMuJHJvdXRlci5wdXNoKHsKICAgICAgICAgICAgICBwYXRoOiBwYXRoLAogICAgICAgICAgICAgIHF1ZXJ5OiB7CiAgICAgICAgICAgICAgICBpc1ByaW50OiB0cnVlCiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICAgIH0sCiAgICAgICAgICBjb21wbGV0ZTogZnVuY3Rpb24gY29tcGxldGUocm93LCB0YXNrVHlwZSkgewogICAgICAgICAgICB2YXIgX3RoaXM0ID0gdGhpczsKICAgICAgICAgICAgaWYgKHRhc2tUeXBlID09ICd0b2RvJykgewogICAgICAgICAgICAgIHZhciB1cmwgPSB3aW5kb3cuY29udGV4dC5icG1SdW5UaW1lICsgJy9ydW50aW1lL3Rhc2svdjEvZ2V0QnBtVGFza0J5SW5zdElkP2luc3RJZD0nICsgcm93LmJwbV9wcm9jX2luc3RfaWRfOwogICAgICAgICAgICAgIHJlcS5nZXQodXJsKS50aGVuKGZ1bmN0aW9uIChyZXMpIHsKICAgICAgICAgICAgICAgIGlmIChyZXMuZGF0YS5sZW5ndGggPT0gMCkgewogICAgICAgICAgICAgICAgICBfdGhpczQuJG1lc3NhZ2UuZXJyb3IoJ+atpOS7u+WKoeW3suiiq+WkhOeQhuaIluS4jeWtmOWcqO+8gScpOwogICAgICAgICAgICAgICAgfSBlbHNlIGlmIChyZXMuZGF0YS5sZW5ndGggPT0gMSkgewogICAgICAgICAgICAgICAgICBfdGhpczQuJHJvdXRlci5wdXNoKCcvcmVwb3J0TW9kdWxlSW5zdC8nICsgcmVzLmRhdGFbMF0uaWQgKyAnLzAnICsgJy8nICsgX3RoaXM0LmRlZktleSArICcvdHJ1ZS8nICsgX3RoaXM0LnRlbXBsYXRlS2V5KTsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgIF90aGlzNC4kbWVzc2FnZS5lcnJvcign5pqC5LiN5pSv5oyB77yBJyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0gZWxzZSBpZiAodGFza1R5cGUgPT0gJ2RvbmUnKSB7CiAgICAgICAgICAgICAgdGhpcy4kcm91dGVyLnB1c2goJy9yZXBvcnRNb2R1bGVJbnN0RG9uZS8nICsgcm93LmJwbV9wcm9jX2luc3RfaWRfICsgJy9kb25lTGlzdC8nICsgdGhpcy5kZWZLZXkgKyAnLycgKyB0aGlzLnRlbXBsYXRlS2V5KTsKICAgICAgICAgICAgfSBlbHNlIGlmICh0YXNrVHlwZSA9PSAncmVxdWVzdCcpIHsKICAgICAgICAgICAgICB0aGlzLiRyb3V0ZXIucHVzaCgnL3JlcG9ydE1vZHVsZUluc3REb25lLycgKyByb3cuYnBtX3Byb2NfaW5zdF9pZF8gKyAnL3JlcXVlc3QvJyArIHRoaXMuZGVmS2V5ICsgJy8nICsgdGhpcy50ZW1wbGF0ZUtleSk7CiAgICAgICAgICAgIH0gZWxzZSBpZiAodGFza1R5cGUgPT0gJ3RvZG9SZWFkJykgewogICAgICAgICAgICAgIHZhciBwYWdlQmVhbiA9IHsKICAgICAgICAgICAgICAgICdwYWdlJzogMSwKICAgICAgICAgICAgICAgICdwYWdlU2l6ZSc6IDEwLAogICAgICAgICAgICAgICAgJ3Nob3dUb3RhbCc6ICd0cnVlJwogICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgdmFyIHN0YXR1cyA9IHJvdy5icG1fc3RhdHVzXzsKICAgICAgICAgICAgICByZXEucG9zdCgnJHticG1SdW5UaW1lfS9ydW50aW1lL3Rhc2svdjEvZ2V0Tm90aWNlVG9kb1JlYWRMaXN0JywgewogICAgICAgICAgICAgICAgcGFnZUJlYW46IHBhZ2VCZWFuLAogICAgICAgICAgICAgICAgcXVlcnlzOiBbewogICAgICAgICAgICAgICAgICBwcm9wZXJ0eTogJ3Byb2NfaW5zdF9pZF8nLAogICAgICAgICAgICAgICAgICB2YWx1ZTogcm93LmJwbV9wcm9jX2luc3RfaWRfLAogICAgICAgICAgICAgICAgICBvcGVyYXRpb246ICdFUVVBTCcsCiAgICAgICAgICAgICAgICAgIHJlbGF0aW9uOiAnQU5EJwogICAgICAgICAgICAgICAgfV0KICAgICAgICAgICAgICB9KS50aGVuKGZ1bmN0aW9uIChyZXNwb25zZSkgewogICAgICAgICAgICAgICAgaWYgKHJlc3BvbnNlLmRhdGEucm93cyAmJiByZXNwb25zZS5kYXRhLnJvd3MubGVuZ3RoID4gMCkgewogICAgICAgICAgICAgICAgICB2YXIgaWQgPSByZXNwb25zZS5kYXRhLnJvd3NbMF0uaWQ7CiAgICAgICAgICAgICAgICAgIHZhciBfdXJsID0gJyc7CiAgICAgICAgICAgICAgICAgIDc7CiAgICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gJ0ZPTExPVycpIHsKICAgICAgICAgICAgICAgICAgICBfdXJsID0gJy9yZXBvcnRNb2R1bGVJbnN0VGFza1JlYWQvJyArIGlkICsgJy9GT0xMT1cvJyArIF90aGlzNC5kZWZLZXkgKyAnLycgKyBfdGhpczQudGVtcGxhdGVLZXk7CiAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzID09ICdDT01NVScpIHsKICAgICAgICAgICAgICAgICAgICBfdXJsID0gJy9yZXBvcnRNb2R1bGVJbnN0LycgKyBpZCArICcvMC8nICsgX3RoaXM0LmRlZktleSArICcvdHJ1ZS8nICsgX3RoaXM0LnRlbXBsYXRlS2V5OwogICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIF91cmwgPSAnL3JlcG9ydE1vZHVsZUluc3RSZWFkLycgKyByb3cuYnBtX3Byb2NfaW5zdF9pZF8gKyAnL3JlYWQvJyArIGlkICsgJy8nICsgX3RoaXM0LmRlZktleSArICcvJyArIF90aGlzNC50ZW1wbGF0ZUtleTsKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICBfdGhpczQuJHJvdXRlci5wdXNoKF91cmwpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9IGVsc2UgaWYgKHRhc2tUeXBlID09ICdkb25lUmVhZCcpIHsKICAgICAgICAgICAgICB2YXIgX3BhZ2VCZWFuID0gewogICAgICAgICAgICAgICAgJ3BhZ2UnOiAxLAogICAgICAgICAgICAgICAgJ3BhZ2VTaXplJzogMTAsCiAgICAgICAgICAgICAgICAnc2hvd1RvdGFsJzogJ3RydWUnCiAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICByZXEucG9zdCgnJHticG1SdW5UaW1lfS9ydW50aW1lL3Rhc2svdjEvZ2V0Tm90aWNlRG9uZVJlYWRMaXN0JywgewogICAgICAgICAgICAgICAgcGFnZUJlYW46IF9wYWdlQmVhbiwKICAgICAgICAgICAgICAgIHF1ZXJ5czogW3sKICAgICAgICAgICAgICAgICAgcHJvcGVydHk6ICdwcm9jX2luc3RfaWRfJywKICAgICAgICAgICAgICAgICAgdmFsdWU6IHJvdy5icG1fcHJvY19pbnN0X2lkXywKICAgICAgICAgICAgICAgICAgb3BlcmF0aW9uOiAnRVFVQUwnLAogICAgICAgICAgICAgICAgICByZWxhdGlvbjogJ0FORCcKICAgICAgICAgICAgICAgIH1dCiAgICAgICAgICAgICAgfSkudGhlbihmdW5jdGlvbiAocmVzcG9uc2UpIHsKICAgICAgICAgICAgICAgIGlmIChyZXNwb25zZS5kYXRhLnJvd3MgJiYgcmVzcG9uc2UuZGF0YS5yb3dzLmxlbmd0aCA+IDApIHsKICAgICAgICAgICAgICAgICAgdmFyIGlkID0gcmVzcG9uc2UuZGF0YS5yb3dzWzBdLmlkOwogICAgICAgICAgICAgICAgICBfdGhpczQuJHJvdXRlci5wdXNoKCcvcmVwb3J0TW9kdWxlSW5zdERvbmUvJyArIHJvdy5icG1fcHJvY19pbnN0X2lkXyArICcvcmVhZC9kb25lLycgKyBpZCArICcvJyArIF90aGlzNC5kZWZLZXkgKyAnLycgKyBfdGhpczQudGVtcGxhdGVLZXkpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9IGVsc2UgaWYgKHRhc2tUeXBlID09ICdteVJlYWQnKSB7CiAgICAgICAgICAgICAgdmFyIF9wYWdlQmVhbjIgPSB7CiAgICAgICAgICAgICAgICAncGFnZSc6IDEsCiAgICAgICAgICAgICAgICAncGFnZVNpemUnOiAxMCwKICAgICAgICAgICAgICAgICdzaG93VG90YWwnOiAndHJ1ZScKICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgIHJlcS5wb3N0KCcke2JwbVJ1blRpbWV9L3J1bnRpbWUvdGFzay92MS9nZXRNeU5vdGljZVJlYWRMaXN0JywgewogICAgICAgICAgICAgICAgcGFnZUJlYW46IF9wYWdlQmVhbjIsCiAgICAgICAgICAgICAgICBxdWVyeXM6IFt7CiAgICAgICAgICAgICAgICAgIHByb3BlcnR5OiAncHJvY19pbnN0X2lkXycsCiAgICAgICAgICAgICAgICAgIHZhbHVlOiByb3cuYnBtX3Byb2NfaW5zdF9pZF8sCiAgICAgICAgICAgICAgICAgIG9wZXJhdGlvbjogJ0VRVUFMJywKICAgICAgICAgICAgICAgICAgcmVsYXRpb246ICdBTkQnCiAgICAgICAgICAgICAgICB9XQogICAgICAgICAgICAgIH0pLnRoZW4oZnVuY3Rpb24gKHJlc3BvbnNlKSB7CiAgICAgICAgICAgICAgICBpZiAocmVzcG9uc2UuZGF0YS5yb3dzICYmIHJlc3BvbnNlLmRhdGEucm93cy5sZW5ndGggPiAwKSB7CiAgICAgICAgICAgICAgICAgIHZhciBpZCA9IHJlc3BvbnNlLmRhdGEucm93c1swXS5pZDsKICAgICAgICAgICAgICAgICAgX3RoaXM0LiRyb3V0ZXIucHVzaCgnL3JlcG9ydE1vZHVsZUluc3RNeVJlYWQvJyArIHJvdy5icG1fcHJvY19pbnN0X2lkXyArICcvJyArIGlkICsgJy9teVJlYWQvJyArIF90aGlzNC5kZWZLZXkgKyAnLycgKyBfdGhpczQudGVtcGxhdGVLZXkpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9IGVsc2UgaWYgKHRhc2tUeXBlID09ICdteURlbGVnYXRlJykgewogICAgICAgICAgICAgIHRoaXMuJHJvdXRlci5wdXNoKCcvcmVwb3J0TW9kdWxlSW5zdFJlYWQvJyArIHJvdy5icG1fcHJvY19pbnN0X2lkXyArICcvZGVsZWdhdGUvJyArIHRoaXMuZGVmS2V5ICsgJy8nICsgdGhpcy50ZW1wbGF0ZUtleSk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0sCiAgICAgICAgICAvL+S4i+i9veWFqOmDqOmAieS4reeahOS6jOe7tOeggQogICAgICAgICAgZG93bmxvYWRBbGxRUkNvZGU6IGZ1bmN0aW9uIGRvd25sb2FkQWxsUVJDb2RlKHRlbXBsYXRlSWQsIG1vYmlsZUZvcm1BbGlhcywgZGlzcGxheSwgcGtGaWVsZCwgUVJDb2RlUGF0dGVybikgewogICAgICAgICAgICB2YXIgX3RoaXM1ID0gdGhpczsKICAgICAgICAgICAgdGhpcy5RUkNvZGVQYXR0ZXJuID0gUVJDb2RlUGF0dGVybjsKICAgICAgICAgICAgdmFyIF9zZWxlY3REYXRhID0gdGhpcy4kcmVmcy5tdWx0aXBsZVRlbXBsYXRlVGFibGUuc2VsZWN0aW9uOwogICAgICAgICAgICBpZiAoX3NlbGVjdERhdGEubGVuZ3RoID09PSAwKSB7CiAgICAgICAgICAgICAgdGhpcy4kbWVzc2FnZS5lcnJvcign6K+36Iez5bCR6YCJ5Lit5LiA5p2h5pWw5o2uIScpOwogICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQogICAgICAgICAgICB0aGlzLmxvYWRpbmcgPSB0cnVlOwogICAgICAgICAgICB2YXIgYWNjb3VudCA9IEJhc2U2NC5lbmNvZGUodGhpcy4kc3RvcmUuc3RhdGUubG9naW4uY3VycmVudFVzZXIuYWNjb3VudCk7CiAgICAgICAgICAgIHZhciB0b2tlbiA9IHRoaXMuJHN0b3JlLnN0YXRlLmxvZ2luLmN1cnJlbnRVc2VyLnRva2VuOwogICAgICAgICAgICB2YXIgbW9iaWxlID0gd2luZG93LmNvbnRleHQubW9iaWxlOwogICAgICAgICAgICB2YXIgUVJDb2RldXJsID0gJyc7CiAgICAgICAgICAgIHZhciB6aXAgPSBuZXcgSlNaaXAoKTsKICAgICAgICAgICAgLy8g5Yib5bu65LiA5Liq5ZCN5Li6aW1hZ2Vz55qE5paw55qE5paH5Lu255uu5b2VCiAgICAgICAgICAgIHZhciBpbWcgPSB6aXAuZm9sZGVyKCdpbWFnZXMnKTsKICAgICAgICAgICAgdmFyIHBsaXN0ID0gW107CiAgICAgICAgICAgIGZvciAodmFyIHggPSAwOyB4IDwgX3NlbGVjdERhdGEubGVuZ3RoOyB4KyspIHsKICAgICAgICAgICAgICBpZiAodGhpcy5RUkNvZGVQYXR0ZXJuKSB7CiAgICAgICAgICAgICAgICBRUkNvZGV1cmwgPSBtb2JpbGUgKyAnL1FSQ29kZUZvcm0vJyArIHRoaXMudGVtcGxhdGVLZXkgKyAnL2dldCcgKyAnP2lkPScgKyBfc2VsZWN0RGF0YVt4XVtwa0ZpZWxkXSArICcmdG9rZW49JyArIHRva2VuOwogICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBRUkNvZGV1cmwgPSBtb2JpbGUgKyAnL1FSQ29kZUZvcm0vJyArIHRoaXMudGVtcGxhdGVLZXkgKyAnL2VkaXQnICsgJz9pZD0nICsgX3NlbGVjdERhdGFbeF1bcGtGaWVsZF07CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIHZhciBtc2cgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdjYW52YXMnKTsKICAgICAgICAgICAgICBRUkNvZGUudG9DYW52YXMobXNnLCBRUkNvZGV1cmwsIGZ1bmN0aW9uIChlcnJvcikgewogICAgICAgICAgICAgICAgY29uc29sZS5sb2coZXJyb3IpOwogICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgIHZhciBfY2FudmFzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7CiAgICAgICAgICAgICAgX2NhbnZhcy5zZXRBdHRyaWJ1dGUoJ2lkJywgJ1FSQ29kZUFuZERlc2NBbGwnICsgeCk7CiAgICAgICAgICAgICAgX2NhbnZhcy5zZXRBdHRyaWJ1dGUoJ3N0eWxlJywgJ3RleHQtYWxpZ246Y2VudGVyO3dpZHRoOicgKyBtc2cud2lkdGggKyAncHg7Jyk7CiAgICAgICAgICAgICAgX2NhbnZhcy5hcHBlbmRDaGlsZChtc2cpOwogICAgICAgICAgICAgIC8v5Yib5bu65bqV6YOo55qE5o+P6L+w5L+h5oGvCiAgICAgICAgICAgICAgZm9yICh2YXIgWSA9IDA7IFkgPCBkaXNwbGF5Lmxlbmd0aDsgWSsrKSB7CiAgICAgICAgICAgICAgICB2YXIgaXRlbSA9IEpTT04ucGFyc2UoZGlzcGxheVtZXSk7CiAgICAgICAgICAgICAgICBpZiAoX3NlbGVjdERhdGFbeF1baXRlbS5uYW1lXSkgewogICAgICAgICAgICAgICAgICB2YXIgZGVzYyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpOwogICAgICAgICAgICAgICAgICBkZXNjLmlubmVySFRNTCA9IGl0ZW0uZGVzYyArICc6JyArIF9zZWxlY3REYXRhW3hdW2l0ZW0ubmFtZV07CiAgICAgICAgICAgICAgICAgIF9jYW52YXMuYXBwZW5kQ2hpbGQoZGVzYyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdRUkNvZGVBbmREZXNjQWxsJykuYXBwZW5kQ2hpbGQoX2NhbnZhcyk7CiAgICAgICAgICAgICAgcGxpc3QucHVzaCh0aGlzLmRvd25sb2FkUVJDb2RlQW5kRGVzYygnI1FSQ29kZUFuZERlc2NBbGwnICsgeCwgX2NhbnZhcykpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIFByb21pc2UuYWxsKHBsaXN0KS50aGVuKGZ1bmN0aW9uIChyZXN1bHQpIHsKICAgICAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnUVJDb2RlQW5kRGVzY0FsbCcpLmlubmVySFRNTCA9ICcnOwogICAgICAgICAgICAgIGZvciAodmFyIF94ID0gMDsgX3ggPCByZXN1bHQubGVuZ3RoOyBfeCsrKSB7CiAgICAgICAgICAgICAgICB2YXIgY2FudmFzID0gcmVzdWx0W194XTsKICAgICAgICAgICAgICAgIHZhciBpbWFnZSA9IGNhbnZhcy50b0RhdGFVUkwoKS5zcGxpdCgnO2Jhc2U2NCwnKVsxXTsKICAgICAgICAgICAgICAgIC8vIOi/meS4qmltYWdlc+aWh+S7tuebruW9leS4reWIm+W7uuS4gOS4qmJhc2U2NOaVsOaNruS4umltZ0RhdGHnmoTlm77lg4/vvIzlm77lg4/lkI3mmK9zbWlsZS5naWYKICAgICAgICAgICAgICAgIGltZy5maWxlKF94ICsgJy5wbmcnLCBpbWFnZSwgewogICAgICAgICAgICAgICAgICBiYXNlNjQ6IHRydWUKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAvLyDmiormiZPljIXlhoXlrrnlvILmraXovazmiJBibG9i5LqM6L+b5Yi25qC85byPCiAgICAgICAgICAgICAgemlwLmdlbmVyYXRlQXN5bmMoewogICAgICAgICAgICAgICAgdHlwZTogJ2Jsb2InCiAgICAgICAgICAgICAgfSkudGhlbihmdW5jdGlvbiAoY29udGVudCkgewogICAgICAgICAgICAgICAgdmFyIGVsZUxpbmsgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJyk7CiAgICAgICAgICAgICAgICBlbGVMaW5rLmRvd25sb2FkID0gJ+S6jOe7tOeggS56aXAnOwogICAgICAgICAgICAgICAgZWxlTGluay5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnOwogICAgICAgICAgICAgICAgLy8g5LiL6L295YaF5a656L2s5Y+Y5oiQYmxvYuWcsOWdgAogICAgICAgICAgICAgICAgZWxlTGluay5ocmVmID0gVVJMLmNyZWF0ZU9iamVjdFVSTChjb250ZW50KTsKICAgICAgICAgICAgICAgIC8vIOinpuWPkeeCueWHuwogICAgICAgICAgICAgICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChlbGVMaW5rKTsKICAgICAgICAgICAgICAgIGVsZUxpbmsuY2xpY2soKTsKICAgICAgICAgICAgICAgIC8vIOeEtuWQjuenu+mZpAogICAgICAgICAgICAgICAgZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChlbGVMaW5rKTsKICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICBfdGhpczUubG9hZGluZyA9IGZhbHNlOwogICAgICAgICAgICB9KTsKICAgICAgICAgIH0sCiAgICAgICAgICBvbkNvcHk6IGZ1bmN0aW9uIG9uQ29weShlKSB7CiAgICAgICAgICAgIHRoaXMuJG1lc3NhZ2Uuc3VjY2Vzcygn5YaF5a655bey5aSN5Yi25Yiw5Ymq5YiH5p2/77yBJyk7CiAgICAgICAgICB9LAogICAgICAgICAgLy8g5aSN5Yi25aSx6LSl5pe255qE5Zue6LCD5Ye95pWwCiAgICAgICAgICBvbkVycm9yOiBmdW5jdGlvbiBvbkVycm9yKGUpIHsKICAgICAgICAgICAgdGhpcy4kbWVzc2FnZS5lcnJvcign5oqx5q2J77yM5aSN5Yi25aSx6LSl77yBJyk7CiAgICAgICAgICB9LAogICAgICAgICAgZG93bmxvYWRRUkNvZGU6IGZ1bmN0aW9uIGRvd25sb2FkUVJDb2RlKCkgewogICAgICAgICAgICB2YXIgcGxpc3QgPSBbXTsKICAgICAgICAgICAgdmFyIF9jYW52YXMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjUVJDb2RlQW5kRGVzYycpOwogICAgICAgICAgICBwbGlzdC5wdXNoKHRoaXMuZG93bmxvYWRRUkNvZGVBbmREZXNjKCcjUVJDb2RlQW5kRGVzYycsIF9jYW52YXMpKTsKICAgICAgICAgICAgUHJvbWlzZS5hbGwocGxpc3QpLnRoZW4oZnVuY3Rpb24gKHJlc3VsdCkgewogICAgICAgICAgICAgIHZhciBjYW52YXMgPSByZXN1bHRbMF07CiAgICAgICAgICAgICAgdmFyIGxpbmsgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJyk7CiAgICAgICAgICAgICAgbGluay5ocmVmID0gY2FudmFzLnRvRGF0YVVSTCgpOyAvL+S4i+i9vemTvuaOpQogICAgICAgICAgICAgIGxpbmsuc2V0QXR0cmlidXRlKCdkb3dubG9hZCcsICfkuoznu7TnoIEuanBnJyk7CiAgICAgICAgICAgICAgbGluay5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnOyAvL2HmoIfnrb7pmpDol48KICAgICAgICAgICAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGxpbmspOwogICAgICAgICAgICAgIGxpbmsuY2xpY2soKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgICB9LAogICAgICAgICAgLy/miorkuoznu7TnoIHkuI7kuoznu7TnoIHor7TmmI7kuIDotbfkuIvovb3miJDlm77niYcKICAgICAgICAgIGRvd25sb2FkUVJDb2RlQW5kRGVzYzogZnVuY3Rpb24gZG93bmxvYWRRUkNvZGVBbmREZXNjKGNsYXNzcywgX2NhbnZhcykgewogICAgICAgICAgICB2YXIgcDIgPSBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7CiAgICAgICAgICAgICAgdmFyIGNhbnZhczIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdjYW52YXMnKTsKICAgICAgICAgICAgICB2YXIgdyA9IHBhcnNlSW50KHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKF9jYW52YXMpLndpZHRoKTsKICAgICAgICAgICAgICB2YXIgaCA9IHBhcnNlSW50KHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKF9jYW52YXMpLmhlaWdodCk7CiAgICAgICAgICAgICAgLy/lsIZjYW52YXPnlLvluIPmlL7lpKfoi6XlubLlgI3vvIznhLblkI7nm5vmlL7lnKjovoPlsI/nmoTlrrnlmajlhoXvvIzlsLHmmL7lvpfkuI3mqKHns4rkuoYKICAgICAgICAgICAgICBjYW52YXMyLndpZHRoID0gdyAqIDI7CiAgICAgICAgICAgICAgY2FudmFzMi5oZWlnaHQgPSBoICogMjsKICAgICAgICAgICAgICBjYW52YXMyLnN0eWxlLndpZHRoID0gdyArICdweCc7CiAgICAgICAgICAgICAgY2FudmFzMi5zdHlsZS5oZWlnaHQgPSBoICsgJ3B4JzsKICAgICAgICAgICAgICAvL+WPr+S7peaMieeFp+iHquW3seeahOmcgOaxgu+8jOWvuWNvbnRleHTnmoTlj4LmlbDkv67mlLksdHJhbnNsYXRl5oyH55qE5piv5YGP56e76YePCiAgICAgICAgICAgICAgdmFyIGNvbnRleHQgPSBjYW52YXMyLmdldENvbnRleHQoJzJkJyk7CiAgICAgICAgICAgICAgY29udGV4dC5zY2FsZSgyLCAyKTsKICAgICAgICAgICAgICByZXR1cm4gaHRtbDJjYW52YXMoZG9jdW1lbnQucXVlcnlTZWxlY3RvcihjbGFzc3MpLCB7CiAgICAgICAgICAgICAgICBjYW52YXM6IGNhbnZhczIKICAgICAgICAgICAgICB9KS50aGVuKGZ1bmN0aW9uIChjYW52YXMpIHsKICAgICAgICAgICAgICAgIHJlc29sdmUoY2FudmFzKTsKICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIHJldHVybiBwMjsKICAgICAgICAgIH0sCiAgICAgICAgICBRUkNvZGVEaWFsb2dDbG9zZTogZnVuY3Rpb24gUVJDb2RlRGlhbG9nQ2xvc2UoKSB7CiAgICAgICAgICAgIHRoaXMuUVJDb2RlVHlwZSA9ICcnOwogICAgICAgICAgICB0aGlzLlFSQ29kZURpYWxvZyA9IGZhbHNlOwogICAgICAgICAgfSwKICAgICAgICAgIGZvdW5kUVJDb2RlOiBmdW5jdGlvbiBmb3VuZFFSQ29kZSgpIHsKICAgICAgICAgICAgLyp0aGlzLlFSQ29kZXVybCA9DQogICAgICAgICAgICAgIHdpbmRvdy5jb250ZXh0LmZyb250ICsNCiAgICAgICAgICAgICAgIi9RUkNvZGVGb3JtLyIgKw0KICAgICAgICAgICAgICB0aGlzLnRlbXBsYXRlS2V5ICsNCiAgICAgICAgICAgICAgIi9nZXQiICsNCiAgICAgICAgICAgICAgIj9pZD0iICsNCiAgICAgICAgICAgICAgdGhpcy5yb3dJZCArDQogICAgICAgICAgICAgICImdG9rZW49IiArDQogICAgICAgICAgICAgIHRoaXMuJHN0b3JlLnN0YXRlLmxvZ2luLmN1cnJlbnRVc2VyLnRva2VuOyovCiAgICAgICAgICAgIGlmICh0aGlzLlFSQ29kZVR5cGUgPT0gJ2FkZCcpIHsKICAgICAgICAgICAgICB2YXIgaXNTdGFydEZsb3cgPSB0aGlzLnRlbXBsYXRlSW5mby5kZWZJZCA/ICd0cnVlJyA6ICdmYWxzZSc7CiAgICAgICAgICAgICAgdGhpcy5RUkNvZGV1cmwgPSByZXEuZ2V0Q29udGV4dCgpLm1vYmlsZSArICcvdGVtcGxhdGUvZm9ybS8nICsgdGhpcy50ZW1wbGF0ZUtleSArICcvYWRkLz9zdGFydEZsb3c9JyArIGlzU3RhcnRGbG93OwogICAgICAgICAgICAgIGlmICh0aGlzLlFSQ29kZVBhdHRlcm4pIHsKICAgICAgICAgICAgICAgIHZhciB0b2tlbiA9IHRoaXMuJHN0b3JlLnN0YXRlLmxvZ2luLmN1cnJlbnRVc2VyLnRva2VuOwogICAgICAgICAgICAgICAgdGhpcy5RUkNvZGV1cmwgKz0gJyZ0b2tlbj0nICsgdG9rZW47CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgIC8v5LiN6K666ZyA5LiN6ZyA6KaB55m75b2V77yM6K6/6Zeu55qE6YO95piv5piO57uG6aG16Z2iCiAgICAgICAgICAgICAgaWYgKHRoaXMuUVJDb2RlUGF0dGVybikgewogICAgICAgICAgICAgICAgLy/lhY3nmbvlvZUKICAgICAgICAgICAgICAgIHRoaXMuUVJDb2RldXJsID0gcmVxLmdldENvbnRleHQoKS5tb2JpbGUgKyAnL1FSQ29kZUZvcm0vJyArIHRoaXMudGVtcGxhdGVLZXkgKyAnL2dldD9pZD0nICsgdGhpcy5yb3dJZCArICcmdG9rZW49JyArIHRoaXMuJHN0b3JlLnN0YXRlLmxvZ2luLmN1cnJlbnRVc2VyLnRva2VuOwogICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAvL+mcgOimgeeZu+W9lQogICAgICAgICAgICAgICAgdGhpcy5RUkNvZGV1cmwgPSByZXEuZ2V0Q29udGV4dCgpLm1vYmlsZSArICcvUVJDb2RlRm9ybS8nICsgdGhpcy50ZW1wbGF0ZUtleSArICcvZ2V0P2lkPScgKyB0aGlzLnJvd0lkOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICAvLyBCYXNlNjQuZW5jb2RlKHRoaXMuJHN0b3JlLnN0YXRlLmxvZ2luLmN1cnJlbnRVc2VyLmFjY291bnQpOwogICAgICAgICAgICB2YXIgbXNnID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ1FSQ29kZScpOwogICAgICAgICAgICBRUkNvZGUudG9DYW52YXMobXNnLCB0aGlzLlFSQ29kZXVybCwgZnVuY3Rpb24gKGVycm9yKSB7CiAgICAgICAgICAgICAgY29uc29sZS5sb2coZXJyb3IpOwogICAgICAgICAgICB9KTsKICAgICAgICAgICAgdGhpcy5RUkNvZGVTaG93ID0gdHJ1ZTsKICAgICAgICAgIH0sCiAgICAgICAgICBnZXRRUkNvZGU6IGZ1bmN0aW9uIGdldFFSQ29kZSh0ZW1wbGF0ZUlkLCBpZCwgbW9iaWxlRm9ybUFsaWFzLCBkaXNwbGF5LCBpbmRleCwgUVJDb2RlUGF0dGVybikgewogICAgICAgICAgICB0aGlzLlFSQ29kZVBhdHRlcm4gPSBRUkNvZGVQYXR0ZXJuOwogICAgICAgICAgICB0aGlzLlFSQ29kZURlc2MgPSBbXTsKICAgICAgICAgICAgZm9yICh2YXIgeCA9IDA7IHggPCBkaXNwbGF5Lmxlbmd0aDsgeCsrKSB7CiAgICAgICAgICAgICAgdmFyIGl0ZW0gPSBKU09OLnBhcnNlKGRpc3BsYXlbeF0pOwogICAgICAgICAgICAgIGlmICh0aGlzLnJvd3NbaW5kZXhdW2l0ZW0ubmFtZV0pIHsKICAgICAgICAgICAgICAgIHRoaXMuUVJDb2RlRGVzYy5wdXNoKGl0ZW0uZGVzYyArICc6JyArIHRoaXMucm93c1tpbmRleF1baXRlbS5uYW1lXSk7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIHRoaXMubW9iaWxlRm9ybUFsaWFzID0gbW9iaWxlRm9ybUFsaWFzOwogICAgICAgICAgICB0aGlzLlFSQ29kZVNob3cgPSBmYWxzZTsKICAgICAgICAgICAgdGhpcy5RUkNvZGVEaWFsb2cgPSB0cnVlOwogICAgICAgICAgICB0aGlzLnJvd1RlbXBsYXRlSWQgPSB0ZW1wbGF0ZUlkOwogICAgICAgICAgICB0aGlzLnJvd0lkID0gaWQ7CiAgICAgICAgICB9LAogICAgICAgICAgaGFuZGxlU2l6ZUNoYW5nZTogZnVuY3Rpb24gaGFuZGxlU2l6ZUNoYW5nZShzaXplKSB7CiAgICAgICAgICAgIC8v5q+P6aG15LiL5ouJ5pi+56S65pWw5o2uCiAgICAgICAgICAgIHRoaXMucGFnaW5hdGlvbi5wYWdlU2l6ZSA9IHNpemU7CiAgICAgICAgICAgIHRoaXMuc2VhcmNoKCk7CiAgICAgICAgICB9LAogICAgICAgICAgaGFuZGxlQ3VycmVudENoYW5nZTogZnVuY3Rpb24gaGFuZGxlQ3VycmVudENoYW5nZShjdXJyZW50UGFnZSkgewogICAgICAgICAgICAvL+eCueWHu+esrOWHoOmhtQogICAgICAgICAgICB0aGlzLnBhZ2luYXRpb24ucGFnZSA9IGN1cnJlbnRQYWdlOwogICAgICAgICAgICB0aGlzLnNlYXJjaCgpOwogICAgICAgICAgfSwKICAgICAgICAgIGdldFBhcmFtOiBmdW5jdGlvbiBnZXRQYXJhbSgpIHsKICAgICAgICAgICAgdmFyIHBhcmFtcyA9IHt9OwogICAgICAgICAgICBpZiAoc3RyID09ICdmaW5kJykgewogICAgICAgICAgICAgIC8vIHRoaXMuJHN0b3JlLmRpc3BhdGNoKCJmb3JtL3NldEJwbVRlbXBsYXRlUGFnaW5hdGlvblBhZ2VOdW0iLCAxKTsKICAgICAgICAgICAgICB0aGlzLnBhZ2luYXRpb24ucGFnZSA9IDE7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8v5Yik5pat5Li65ZCI5bm25p+l6K+i6L+Y5piv5YiG5byA5p+l6K+iCiAgICAgICAgICAgIGlmICh0aGlzLmZvcm1UeXBlKSB7CiAgICAgICAgICAgICAgcGFyYW1zID0gdGhpcy5nZXRRdWVyeUZpbHRlcigpOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgIC8v5Yik5pat5piv5ZCm6YWN572u5LqG5ZCI5bm25p+l6K+iCiAgICAgICAgICAgICAgaWYgKCQoJy5zZWFyY2gtcXVlcnknKS5sZW5ndGggPiAwKSB7CiAgICAgICAgICAgICAgICBwYXJhbXMgPSB0aGlzLmdldENvbmRpdGlvblF1ZXJ5KCk7CiAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIHBhcmFtcyA9IHRoaXMuZ2V0UXVlcnlGaWx0ZXIoKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKHBhcmFtcy5wYWdpbmF0aW9uICYmIHBhcmFtcy5wYWdpbmF0aW9uICYmIHBhcmFtcy5wYWdpbmF0aW9uLnF1ZXJ5cykgewogICAgICAgICAgICAgIHZhciB0ZW1wUXVlcnlTID0gW107CiAgICAgICAgICAgICAgdmFyIGJldHdlZW5Db25kaXRpb25zID0ge307CiAgICAgICAgICAgICAgcGFyYW1zLnBhZ2luYXRpb24ucXVlcnlzLmZvckVhY2goZnVuY3Rpb24gKHEpIHsKICAgICAgICAgICAgICAgIGlmIChxLnZhbHVlICYmIChxLm9wZXJhdGlvbiAhPSAnQkVUV0VFTicgfHwgcS52YWx1ZS5jb25zdHJ1Y3RvciA9PSBBcnJheSkpIHsKICAgICAgICAgICAgICAgICAgdGVtcFF1ZXJ5Uy5wdXNoKHEpOwogICAgICAgICAgICAgICAgfSBlbHNlIGlmIChxLnZhbHVlKSB7CiAgICAgICAgICAgICAgICAgIHZhciBjb25kaXRpb25zID0gcTsKICAgICAgICAgICAgICAgICAgaWYgKGJldHdlZW5Db25kaXRpb25zW3EucHJvcGVydHldKSB7CiAgICAgICAgICAgICAgICAgICAgY29uZGl0aW9ucyA9IGJldHdlZW5Db25kaXRpb25zW3EucHJvcGVydHldOwogICAgICAgICAgICAgICAgICAgIGNvbmRpdGlvbnMudmFsdWUgPSBbY29uZGl0aW9ucy52YWx1ZV07CiAgICAgICAgICAgICAgICAgICAgY29uZGl0aW9ucy52YWx1ZS5wdXNoKHEudmFsdWUpOwogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIGJldHdlZW5Db25kaXRpb25zW3EucHJvcGVydHldID0gY29uZGl0aW9uczsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICBmb3IgKHZhciBrZXkgaW4gYmV0d2VlbkNvbmRpdGlvbnMpIHsKICAgICAgICAgICAgICAgIHRlbXBRdWVyeVMucHVzaChiZXR3ZWVuQ29uZGl0aW9uc1trZXldKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgcGFyYW1zLnBhZ2luYXRpb24ucXVlcnlzID0gdGVtcFF1ZXJ5UzsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gcGFyYW1zOwogICAgICAgICAgfSwKICAgICAgICAgIHNlYXJjaDogZnVuY3Rpb24gc2VhcmNoKHN0cikgewogICAgICAgICAgICB2YXIgbG9hZGluZyA9IHRoaXMuJGxvYWRpbmcodGhpcy5vcHRpb25zKTsKICAgICAgICAgICAgdmFyIHBhcmFtcyA9IHt9OwogICAgICAgICAgICBpZiAoc3RyID09ICdmaW5kJykgewogICAgICAgICAgICAgIC8vIHRoaXMuJHN0b3JlLmRpc3BhdGNoKCJmb3JtL3NldEJwbVRlbXBsYXRlUGFnaW5hdGlvblBhZ2VOdW0iLCAxKTsKICAgICAgICAgICAgICB0aGlzLnBhZ2luYXRpb24ucGFnZSA9IDE7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy/liKTmlq3kuLrlkIjlubbmn6Xor6Lov5jmmK/liIblvIDmn6Xor6IKICAgICAgICAgICAgaWYgKHRoaXMuZm9ybVR5cGUpIHsKICAgICAgICAgICAgICBwYXJhbXMgPSB0aGlzLmdldFF1ZXJ5RmlsdGVyKCk7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgLy/liKTmlq3mmK/lkKbphY3nva7kuoblkIjlubbmn6Xor6IKICAgICAgICAgICAgICBpZiAoJCgnLnNlYXJjaC1xdWVyeScpLmxlbmd0aCA+IDApIHsKICAgICAgICAgICAgICAgIHBhcmFtcyA9IHRoaXMuZ2V0Q29uZGl0aW9uUXVlcnkoKTsKICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgcGFyYW1zID0gdGhpcy5nZXRRdWVyeUZpbHRlcigpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAocGFyYW1zLnBhZ2luYXRpb24gJiYgcGFyYW1zLnBhZ2luYXRpb24ucXVlcnlzKSB7CiAgICAgICAgICAgICAgdmFyIHRlbXBRdWVyeVMgPSBbXTsKICAgICAgICAgICAgICB2YXIgYmV0d2VlbkNvbmRpdGlvbnMgPSB7fTsKICAgICAgICAgICAgICBwYXJhbXMucGFnaW5hdGlvbi5xdWVyeXMuZm9yRWFjaChmdW5jdGlvbiAocSkgewogICAgICAgICAgICAgICAgaWYgKHEudmFsdWUgJiYgKHEub3BlcmF0aW9uICE9ICdCRVRXRUVOJyB8fCBxLnZhbHVlLmNvbnN0cnVjdG9yID09IEFycmF5KSkgewogICAgICAgICAgICAgICAgICB0ZW1wUXVlcnlTLnB1c2gocSk7CiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHEudmFsdWUpIHsKICAgICAgICAgICAgICAgICAgdmFyIGNvbmRpdGlvbnMgPSBxOwogICAgICAgICAgICAgICAgICBpZiAoYmV0d2VlbkNvbmRpdGlvbnNbcS5wcm9wZXJ0eV0pIHsKICAgICAgICAgICAgICAgICAgICBjb25kaXRpb25zID0gYmV0d2VlbkNvbmRpdGlvbnNbcS5wcm9wZXJ0eV07CiAgICAgICAgICAgICAgICAgICAgY29uZGl0aW9ucy52YWx1ZSA9IFtjb25kaXRpb25zLnZhbHVlXTsKICAgICAgICAgICAgICAgICAgICBjb25kaXRpb25zLnZhbHVlLnB1c2gocS52YWx1ZSk7CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgYmV0d2VlbkNvbmRpdGlvbnNbcS5wcm9wZXJ0eV0gPSBjb25kaXRpb25zOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgIGZvciAodmFyIGtleSBpbiBiZXR3ZWVuQ29uZGl0aW9ucykgewogICAgICAgICAgICAgICAgdGVtcFF1ZXJ5Uy5wdXNoKGJldHdlZW5Db25kaXRpb25zW2tleV0pOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBwYXJhbXMucGFnaW5hdGlvbi5xdWVyeXMgPSB0ZW1wUXVlcnlTOwogICAgICAgICAgICAgIHBhcmFtcy5wYWdpbmF0aW9uLnF1ZXJ5cyA9IHBhcmFtcy5wYWdpbmF0aW9uLnF1ZXJ5cyA/IHBhcmFtcy5wYWdpbmF0aW9uLnF1ZXJ5cy5jb25jYXQodGhpcy50cmVlUXVlcnlzKSA6IHRoaXMudHJlZVF1ZXJ5czsKICAgICAgICAgICAgfQogICAgICAgICAgICAvL+aKiui/h+a7pOagkeeahOadoeS7tuS5n+aLvOaOpei/m+WOuwogICAgICAgICAgICBpZiAodGhpcy50cmVlUXVlcnlzICYmIHRoaXMudHJlZVF1ZXJ5cy5sZW5ndGggPiAwKSB7CiAgICAgICAgICAgICAgcGFyYW1zLnBhZ2luYXRpb24ucXVlcnlzID0gcGFyYW1zLnBhZ2luYXRpb24ucXVlcnlzID8gcGFyYW1zLnBhZ2luYXRpb24ucXVlcnlzLmNvbmNhdCh0aGlzLnRyZWVRdWVyeXMpIDogdGhpcy50cmVlUXVlcnlzOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvL+aVsOaNruinhuWbvuaOp+S7tgogICAgICAgICAgICBpZiAodGhpcy5kYXRhVmlldykgewogICAgICAgICAgICAgIHRoaXMuaGFuZGVsQmluZEZpbGVkVmFsdWEoKTsKICAgICAgICAgICAgICBwYXJhbXMucmVmSWRWYWx1ZSA9IHRoaXMuZGF0YVZpZXcucmVmSWRWYWx1ZTsKICAgICAgICAgICAgICAvL+WFs+iBlOafpeivouWtl+autQogICAgICAgICAgICAgIGlmICh0aGlzLmRhdGFWaWV3LnNlbGVjdExpc3QgJiYgdGhpcy5kYXRhVmlldy5zZWxlY3RMaXN0Lmxlbmd0aCA+IDApIHsKICAgICAgICAgICAgICAgIHBhcmFtcy5zZWxlY3RMaXN0ID0gdGhpcy5kYXRhVmlldy5zZWxlY3RMaXN0OwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICB2YXIgdGhpc18gPSB0aGlzOwogICAgICAgICAgICBpZiAodGhpc18uaXNKb2luRmxvdykgewogICAgICAgICAgICAgIHBhcmFtcy5pc0pvaW5GbG93ID0gdHJ1ZTsKICAgICAgICAgICAgICBwYXJhbXMudGFza1R5cGUgPSB0aGlzXy50YXNrVHlwZTsKICAgICAgICAgICAgICBwYXJhbXMuZGVmS2V5ID0gdGhpc18uZGVmS2V5OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICgkLmlzRW1wdHlPYmplY3QodGhpcy5zZWFyY2hGb3JtKSkgewogICAgICAgICAgICAgIHRoaXMuJHN0b3JlLmRpc3BhdGNoKCdmb3JtL2dldEJwbVRlbXBsYXRlQnlQYWdpbmF0aW9uJywgcGFyYW1zKS50aGVuKGZ1bmN0aW9uIChyZXNwb25zZSkgewogICAgICAgICAgICAgICAgdGhpc18ucm93cyA9IHJlc3BvbnNlLmRhdGEucm93czsKICAgICAgICAgICAgICAgIHRoaXNfLnRvdGFsID0gcmVzcG9uc2UuZGF0YS50b3RhbDsKICAgICAgICAgICAgICAgIHRoaXNfLnBhZ2luYXRpb24ucGFnZSA9IHJlc3BvbnNlLmRhdGEucGFnZTsKICAgICAgICAgICAgICAgIHRoaXNfLnBhZ2luYXRpb24ucGFnZVNpemUgPSByZXNwb25zZS5kYXRhLnBhZ2VTaXplOwogICAgICAgICAgICAgICAgbG9hZGluZy5jbG9zZSgpOwogICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgIHRoaXMuJHN0b3JlLmRpc3BhdGNoKCdmb3JtL2dldEJwbVRlbXBsYXRlQnlQYWdpbmF0aW9uJywgcGFyYW1zKS50aGVuKGZ1bmN0aW9uIChyZXNwb25zZSkgewogICAgICAgICAgICAgICAgdGhpc18ucm93cyA9IHJlc3BvbnNlLmRhdGEucm93czsKICAgICAgICAgICAgICAgIHRoaXNfLnRvdGFsID0gcmVzcG9uc2UuZGF0YS50b3RhbDsKICAgICAgICAgICAgICAgIHRoaXNfLnBhZ2luYXRpb24ucGFnZSA9IHJlc3BvbnNlLmRhdGEucGFnZTsKICAgICAgICAgICAgICAgIHRoaXNfLnBhZ2luYXRpb24ucGFnZVNpemUgPSByZXNwb25zZS5kYXRhLnBhZ2VTaXplOwogICAgICAgICAgICAgICAgbG9hZGluZy5jbG9zZSgpOwogICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CiAgICAgICAgICB9LAogICAgICAgICAgZ2V0UXVlcnlGaWx0ZXI6IGZ1bmN0aW9uIGdldFF1ZXJ5RmlsdGVyKCkgewogICAgICAgICAgICB2YXIgX3RoaXM2ID0gdGhpczsKICAgICAgICAgICAgdmFyIG9wZXJhdGlvbk1hcCA9IHRoaXMuZ2V0U2VhcmNoSXRlbXMoKTsKICAgICAgICAgICAgdmFyIGZpZWxkVHlwZU1hcCA9IHRoaXMuZ2V0RmllbGRUeXBlKCk7CiAgICAgICAgICAgIHZhciBzcGVjaWFsTWFwID0gdGhpcy5nZXRTcGVjaWFsTWFwKCk7CiAgICAgICAgICAgIHZhciBxdWVyeXMgPSBbXTsgLy/mn6Xor6LmnaHku7YKICAgICAgICAgICAgdmFyIHF1ZXJ5RmlsdGVyID0ge307CiAgICAgICAgICAgIHZhciBwYWdlQmVhbiA9IHsKICAgICAgICAgICAgICBwYWdlQmVhbjogdGhpcy5wYWdpbmF0aW9uCiAgICAgICAgICAgIH07CiAgICAgICAgICAgIHZhciBwYXJhbXMgPSB7CiAgICAgICAgICAgICAgdGVtcGxhdGVJZDogdGhpcy50ZW1wbGF0ZUluZm8uaWQKICAgICAgICAgICAgfTsKICAgICAgICAgICAgcGFyYW1zLnBhZ2luYXRpb24gPSBwYWdlQmVhbjsKICAgICAgICAgICAgaWYgKCQuaXNFbXB0eU9iamVjdCh0aGlzLnNlYXJjaEZvcm0pKSB7CiAgICAgICAgICAgICAgcmV0dXJuIHBhcmFtczsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICB2YXIgX2xvb3AgPSBmdW5jdGlvbiBfbG9vcChrZXkpIHsKICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgX3RoaXM2LnNlYXJjaEZvcm1ba2V5XSAhPSAndW5kZWZpbmVkJyAmJiBfdGhpczYuc2VhcmNoRm9ybVtrZXldICE9ICcnICYmIF90aGlzNi5zZWFyY2hGb3JtW2tleV0gIT0gbnVsbCkgewogICAgICAgICAgICAgICAgICBpZiAoX3RoaXM2LnNlYXJjaEZvcm1ba2V5XSBpbnN0YW5jZW9mIEFycmF5KSB7CiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBfdGhpczYuc2VhcmNoRm9ybVtrZXldLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgICBxdWVyeXMucHVzaCh7CiAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnR5OiBrZXksCiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiBfdGhpczYuc2VhcmNoRm9ybVtrZXldW2ldLAogICAgICAgICAgICAgICAgICAgICAgICBncm91cDogJ21haW4nLAogICAgICAgICAgICAgICAgICAgICAgICBvcGVyYXRpb246IG9wZXJhdGlvbk1hcFtrZXldLAogICAgICAgICAgICAgICAgICAgICAgICByZWxhdGlvbjogJ0FORCcKICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChfdGhpczYuc2VhcmNoRm9ybVtrZXldLmluY2x1ZGVzKCcsJykgJiYgIXNwZWNpYWxNYXBba2V5XSkgewogICAgICAgICAgICAgICAgICAgIHZhciBhcnIgPSBfdGhpczYuc2VhcmNoRm9ybVtrZXldLnNwbGl0KCcsJyk7CiAgICAgICAgICAgICAgICAgICAgYXJyLmZvckVhY2goZnVuY3Rpb24gKHYpIHsKICAgICAgICAgICAgICAgICAgICAgIHF1ZXJ5cy5wdXNoKHsKICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydHk6IGtleSwKICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IHYsCiAgICAgICAgICAgICAgICAgICAgICAgIGdyb3VwOiAnbWFpbicsCiAgICAgICAgICAgICAgICAgICAgICAgIG9wZXJhdGlvbjogb3BlcmF0aW9uTWFwW2tleV0sCiAgICAgICAgICAgICAgICAgICAgICAgIHJlbGF0aW9uOiAnQU5EJwogICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHZhbHVlID0gX3RoaXM2LnNlYXJjaEZvcm1ba2V5XTsKICAgICAgICAgICAgICAgICAgICAvL+aVtOaVsOexu+WeiwogICAgICAgICAgICAgICAgICAgIGlmIChmaWVsZFR5cGVNYXBba2V5XSAmJiBmaWVsZFR5cGVNYXBba2V5XSA9PSAnbnVtYmVyJykgewogICAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBwYXJzZUZsb2F0KF90aGlzNi5zZWFyY2hGb3JtW2tleV0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBxdWVyeXMucHVzaCh7CiAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eToga2V5LAogICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IHZhbHVlLAogICAgICAgICAgICAgICAgICAgICAgZ3JvdXA6ICdtYWluJywKICAgICAgICAgICAgICAgICAgICAgIG9wZXJhdGlvbjogb3BlcmF0aW9uTWFwW2tleV0sCiAgICAgICAgICAgICAgICAgICAgICByZWxhdGlvbjogJ0FORCcKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgZm9yICh2YXIga2V5IGluIHRoaXMuc2VhcmNoRm9ybSkgewogICAgICAgICAgICAgICAgX2xvb3Aoa2V5KTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgdGhpcy5jbGVhclF1ZXJ5QnlHcm91cE5hbWUocXVlcnlzLCAnZmlsdGVyJyk7CiAgICAgICAgICAgICAgLy8g5bCG6L+H5ruk5p2h5Lu25re75Yqg5p+l6K+i5Y+C5pWw5pWw57uE5LitCiAgICAgICAgICAgICAgaWYgKHRoaXMuZmlsdGVycyAmJiBPYmplY3Qua2V5cyh0aGlzLmZpbHRlcnMpLmxlbmd0aCA+IDApIHsKICAgICAgICAgICAgICAgIHZhciBwcmVmaXggPSB0aGlzLnRlbXBsYXRlSW5mby5pc0V4dGVybmFsID09PSAxID8gJycgOiAnRl8nOwogICAgICAgICAgICAgICAgT2JqZWN0LmtleXModGhpcy5maWx0ZXJzKS5mb3JFYWNoKGZ1bmN0aW9uIChrKSB7CiAgICAgICAgICAgICAgICAgIHZhciBmaWx0ZXIgPSBfdGhpczYuZmlsdGVyc1trXTsKICAgICAgICAgICAgICAgICAgdmFyIHF1ZXJ5ID0gewogICAgICAgICAgICAgICAgICAgIHByb3BlcnR5OiBwcmVmaXggKyBrLAogICAgICAgICAgICAgICAgICAgIHZhbHVlOiBmaWx0ZXJbMF0sCiAgICAgICAgICAgICAgICAgICAgZ3JvdXA6ICdmaWx0ZXInLAogICAgICAgICAgICAgICAgICAgIHJlbGF0aW9uOiAnQU5EJwogICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICBpZiAoZmlsdGVyLmxlbmd0aCA9PSAxKSB7CiAgICAgICAgICAgICAgICAgICAgcXVlcnkub3BlcmF0aW9uID0gJ0VRVUFMJzsKICAgICAgICAgICAgICAgICAgICBxdWVyeXMucHVzaChxdWVyeSk7CiAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZmlsdGVyLmxlbmd0aCA+IDEpIHsKICAgICAgICAgICAgICAgICAgICBxdWVyeS5vcGVyYXRpb24gPSAnSU4nOwogICAgICAgICAgICAgICAgICAgIHF1ZXJ5LnZhbHVlID0gZmlsdGVyOwogICAgICAgICAgICAgICAgICAgIHF1ZXJ5cy5wdXNoKHF1ZXJ5KTsKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIHF1ZXJ5RmlsdGVyID0gewogICAgICAgICAgICAgICAgcGFnZUJlYW46IHRoaXMucGFnaW5hdGlvbiwKICAgICAgICAgICAgICAgIHF1ZXJ5czogcXVlcnlzCiAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAvL+WmguaenOacieiuvue9rum7mOiupOaOkuW6jyzkvJjlhYjkvb/nlKjpu5jorqTmjpLluo8KICAgICAgICAgICAgICBpZiAodGhpcy50ZW1wbGF0ZUluZm8uc29ydEZpZWxkKSB7CiAgICAgICAgICAgICAgICB2YXIgc29ydEZpZWxkID0gSlNPTi5wYXJzZSh0aGlzLnRlbXBsYXRlSW5mby5zb3J0RmllbGQpOwogICAgICAgICAgICAgICAgdmFyIHNvcnRlciA9IFtdOwogICAgICAgICAgICAgICAgZm9yICh2YXIgeCA9IDA7IHggPCBzb3J0RmllbGQubGVuZ3RoOyB4KyspIHsKICAgICAgICAgICAgICAgICAgc29ydGVyLnB1c2goewogICAgICAgICAgICAgICAgICAgICdwcm9wZXJ0eSc6IHNvcnRGaWVsZFt4XS5uYW1lLAogICAgICAgICAgICAgICAgICAgICdkaXJlY3Rpb24nOiBzb3J0RmllbGRbeF0uc29ydAogICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHF1ZXJ5RmlsdGVyLnNvcnRlciA9IHNvcnRlcjsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgaWYgKHRoaXMuc29ydGVyICYmIHRoaXMuc29ydGVyLmxlbmd0aCA+IDApIHsKICAgICAgICAgICAgICAgIHF1ZXJ5RmlsdGVyLnNvcnRlciA9IHRoaXMuc29ydGVyOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBwYXJhbXMucGFnaW5hdGlvbiA9IHF1ZXJ5RmlsdGVyOwogICAgICAgICAgICAgIHJldHVybiBwYXJhbXM7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0sCiAgICAgICAgICAvLyDpgJrov4fliIbnu4TlkI3np7DmuIXpmaTlr7nlupTmn6Xor6LmnaHku7YKICAgICAgICAgIGNsZWFyUXVlcnlCeUdyb3VwTmFtZTogZnVuY3Rpb24gY2xlYXJRdWVyeUJ5R3JvdXBOYW1lKHF1ZXJ5cywgZ3JvdXBOYW1lKSB7CiAgICAgICAgICAgIC8vIOW+heWIoOmZpOeahOafpeivouadoeS7tgogICAgICAgICAgICB2YXIgdG9EZWxldGUgPSBbXTsKICAgICAgICAgICAgcXVlcnlzICYmIHF1ZXJ5cy5mb3JFYWNoKGZ1bmN0aW9uIChxdWVyeSkgewogICAgICAgICAgICAgIGlmIChxdWVyeS5ncm91cCA9PSBncm91cE5hbWUpIHsKICAgICAgICAgICAgICAgIHRvRGVsZXRlLnB1c2gocXVlcnkpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIHRvRGVsZXRlLmZvckVhY2goZnVuY3Rpb24gKGQpIHsKICAgICAgICAgICAgICBxdWVyeXMucmVtb3ZlKGQpOwogICAgICAgICAgICB9KTsKICAgICAgICAgIH0sCiAgICAgICAgICBoYW5kbGVTb3J0Q2hhbmdlOiBmdW5jdGlvbiBoYW5kbGVTb3J0Q2hhbmdlKGNvbHVtbikgewogICAgICAgICAgICBpZiAoIWNvbHVtbi5vcmRlcikgewogICAgICAgICAgICAgIHRoaXMuc29ydGVyID0gbnVsbDsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICB0aGlzLnNvcnRlciA9IFt7CiAgICAgICAgICAgICAgICBwcm9wZXJ0eTogY29sdW1uLnByb3AsCiAgICAgICAgICAgICAgICBkaXJlY3Rpb246IGNvbHVtbi5vcmRlciA9PSAnYXNjZW5kaW5nJyA/ICdBU0MnIDogJ0RFU0MnCiAgICAgICAgICAgICAgfV07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdGhpcy5zZWFyY2goKTsKICAgICAgICAgIH0sCiAgICAgICAgICBoYW5kbGVGaWx0ZXJDaGFuZ2U6IGZ1bmN0aW9uIGhhbmRsZUZpbHRlckNoYW5nZShtKSB7CiAgICAgICAgICAgIHZhciBfdGhpczcgPSB0aGlzOwogICAgICAgICAgICB0aGlzLmZpbHRlcnMgPSBfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIHRoaXMuZmlsdGVycyksIG0pOwogICAgICAgICAgICBPYmplY3Qua2V5cyh0aGlzLmZpbHRlcnMpLmZvckVhY2goZnVuY3Rpb24gKGspIHsKICAgICAgICAgICAgICBpZiAoIV90aGlzNy5maWx0ZXJzW2tdIHx8IF90aGlzNy5maWx0ZXJzW2tdLmxlbmd0aCA9PSAwKSB7CiAgICAgICAgICAgICAgICBkZWxldGUgX3RoaXM3LmZpbHRlcnNba107CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICAgICAgdGhpcy5zZWFyY2goKTsKICAgICAgICAgIH0sCiAgICAgICAgICBnZXRTZWFyY2hJdGVtczogZnVuY3Rpb24gZ2V0U2VhcmNoSXRlbXMoKSB7CiAgICAgICAgICAgIHZhciBzZWFyY2hJdGVtcyA9ICQoJy5zZWFyY2gtaXRlbScpOwogICAgICAgICAgICB2YXIgb3BlcmF0aW9uTWFwID0ge307CiAgICAgICAgICAgIHZhciBvcGVyYXRpb25UeXBlID0gewogICAgICAgICAgICAgIGxpa2U6ICdMSUtFJywKICAgICAgICAgICAgICBlcXVhbDogJ0VRVUFMJywKICAgICAgICAgICAgICBiZXR3ZWVuOiAnQkVUV0VFTicsCiAgICAgICAgICAgICAgbGVmdF9saWtlOiAnTEVGVF9MSUtFJywKICAgICAgICAgICAgICByaWdodF9saWtlOiAnUklHSFRfTElLRScKICAgICAgICAgICAgfTsKICAgICAgICAgICAgaWYgKHNlYXJjaEl0ZW1zKSB7CiAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzZWFyY2hJdGVtcy5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgICAgdmFyIG9wZXJhdGlvbiA9ICc9JzsKICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgJChzZWFyY2hJdGVtc1tpXSkuYXR0cignaHQtcXVlcnknKSAhPSAndW5kZWZpbmVkJykgewogICAgICAgICAgICAgICAgICBvcGVyYXRpb24gPSAkKHNlYXJjaEl0ZW1zW2ldKS5hdHRyKCdvcGVyYXRpb24nKTsKICAgICAgICAgICAgICAgICAgb3BlcmF0aW9uTWFwWyQoc2VhcmNoSXRlbXNbaV0pLmF0dHIoJ2h0LXF1ZXJ5JyldID0gdHlwZW9mIG9wZXJhdGlvblR5cGVbb3BlcmF0aW9uXSAhPSAndW5kZWZpbmVkJyA/IG9wZXJhdGlvblR5cGVbb3BlcmF0aW9uXSA6IG9wZXJhdGlvbjsKICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZW9mICQoc2VhcmNoSXRlbXNbaV0pLmNoaWxkcmVuKCkuYXR0cignaHQtcXVlcnknKSAhPSAndW5kZWZpbmVkJykgewogICAgICAgICAgICAgICAgICBvcGVyYXRpb24gPSAkKHNlYXJjaEl0ZW1zW2ldKS5jaGlsZHJlbigpLmF0dHIoJ29wZXJhdGlvbicpOwogICAgICAgICAgICAgICAgICBvcGVyYXRpb25NYXBbJChzZWFyY2hJdGVtc1tpXSkuY2hpbGRyZW4oKS5hdHRyKCdodC1xdWVyeScpXSA9IHR5cGVvZiBvcGVyYXRpb25UeXBlW29wZXJhdGlvbl0gIT0gJ3VuZGVmaW5lZCcgPyBvcGVyYXRpb25UeXBlW29wZXJhdGlvbl0gOiBvcGVyYXRpb247CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBvcGVyYXRpb25NYXA7CiAgICAgICAgICB9LAogICAgICAgICAgZ2V0RmllbGRUeXBlOiBmdW5jdGlvbiBnZXRGaWVsZFR5cGUoKSB7CiAgICAgICAgICAgIHZhciBzZWFyY2hJdGVtcyA9ICQoJy5zZWFyY2gtaXRlbScpOwogICAgICAgICAgICB2YXIgb3BlcmF0aW9uTWFwID0ge307CiAgICAgICAgICAgIHZhciBvcGVyYXRpb25UeXBlID0gewogICAgICAgICAgICAgIG51bWJlcjogJ251bWJlcicsCiAgICAgICAgICAgICAgdGV4dDogJ3RleHQnCiAgICAgICAgICAgIH07CiAgICAgICAgICAgIGlmIChzZWFyY2hJdGVtcykgewogICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc2VhcmNoSXRlbXMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgIHZhciBvcGVyYXRpb24gPSAnPSc7CiAgICAgICAgICAgICAgICBpZiAodHlwZW9mICQoc2VhcmNoSXRlbXNbaV0pLmF0dHIoJ2h0LXF1ZXJ5JykgIT0gJ3VuZGVmaW5lZCcpIHsKICAgICAgICAgICAgICAgICAgb3BlcmF0aW9uID0gJChzZWFyY2hJdGVtc1tpXSkuYXR0cigndHlwZScpOwogICAgICAgICAgICAgICAgICBvcGVyYXRpb25NYXBbJChzZWFyY2hJdGVtc1tpXSkuYXR0cignaHQtcXVlcnknKV0gPSB0eXBlb2Ygb3BlcmF0aW9uVHlwZVtvcGVyYXRpb25dICE9ICd1bmRlZmluZWQnID8gb3BlcmF0aW9uVHlwZVtvcGVyYXRpb25dIDogb3BlcmF0aW9uOwogICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0eXBlb2YgJChzZWFyY2hJdGVtc1tpXSkuY2hpbGRyZW4oKS5hdHRyKCdodC1xdWVyeScpICE9ICd1bmRlZmluZWQnKSB7CiAgICAgICAgICAgICAgICAgIG9wZXJhdGlvbiA9ICQoc2VhcmNoSXRlbXNbaV0pLmNoaWxkcmVuKCkuYXR0cigndHlwZScpOwogICAgICAgICAgICAgICAgICBvcGVyYXRpb25NYXBbJChzZWFyY2hJdGVtc1tpXSkuY2hpbGRyZW4oKS5hdHRyKCdodC1xdWVyeScpXSA9IHR5cGVvZiBvcGVyYXRpb25UeXBlW29wZXJhdGlvbl0gIT0gJ3VuZGVmaW5lZCcgPyBvcGVyYXRpb25UeXBlW29wZXJhdGlvbl0gOiBvcGVyYXRpb247CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBvcGVyYXRpb25NYXA7CiAgICAgICAgICB9LAogICAgICAgICAgLy/ojrflj5bnibnmrormn6Xor6Lmg4XlhrXvvIjoh6rlrprkuYnlr7nor53moYbvvIkKICAgICAgICAgIGdldFNwZWNpYWxNYXA6IGZ1bmN0aW9uIGdldFNwZWNpYWxNYXAoKSB7CiAgICAgICAgICAgIHZhciBzZWFyY2hJdGVtcyA9ICQoJy5zZWFyY2gtaXRlbScpOwogICAgICAgICAgICB2YXIgZmllbGRRdWVyeU1hcCA9IHt9OyAvL+afpeivouadoeS7tuWtl+autQoKICAgICAgICAgICAgaWYgKHNlYXJjaEl0ZW1zKSB7CiAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzZWFyY2hJdGVtcy5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgICAgaWYgKHR5cGVvZiAkKHNlYXJjaEl0ZW1zW2ldKS5hdHRyKCdodC1xdWVyeScpICE9ICd1bmRlZmluZWQnKSB7CiAgICAgICAgICAgICAgICAgIC8v5p+l6K+i5p2h5Lu25a2X5q61CiAgICAgICAgICAgICAgICAgIGZpZWxkUXVlcnlNYXBbJChzZWFyY2hJdGVtc1tpXSkuYXR0cignaHQtcXVlcnknKV0gPSB0eXBlb2YgJChzZWFyY2hJdGVtc1tpXSkuYXR0cignc3BlY2lhbC1xdWVyeScpICE9ICd1bmRlZmluZWQnID8gdHJ1ZSA6IGZhbHNlOwogICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0eXBlb2YgJChzZWFyY2hJdGVtc1tpXSkuY2hpbGRyZW4oKS5hdHRyKCdodC1xdWVyeScpICE9ICd1bmRlZmluZWQnKSB7CiAgICAgICAgICAgICAgICAgIC8v5p+l6K+i5p2h5Lu25a2X5q61CiAgICAgICAgICAgICAgICAgIGZpZWxkUXVlcnlNYXBbJChzZWFyY2hJdGVtc1tpXSkuY2hpbGRyZW4oKS5hdHRyKCdodC1xdWVyeScpXSA9IHR5cGVvZiAkKHNlYXJjaEl0ZW1zW2ldKS5jaGlsZHJlbigpLmF0dHIoJ3NwZWNpYWwtcXVlcnknKSAhPSAndW5kZWZpbmVkJyA/IHRydWUgOiBmYWxzZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIGZpZWxkUXVlcnlNYXA7CiAgICAgICAgICB9LAogICAgICAgICAgZ2V0Q29uZGl0aW9uUXVlcnk6IGZ1bmN0aW9uIGdldENvbmRpdGlvblF1ZXJ5KCkgewogICAgICAgICAgICB2YXIgX3RoaXM4ID0gdGhpczsKICAgICAgICAgICAgdmFyIHNlYXJjaEFsbCA9ICQoJy5zZWFyY2gtcXVlcnknKTsKICAgICAgICAgICAgdmFyIHZhbHVlcyA9ICcnOwogICAgICAgICAgICB2YXIgcXVlcnlzID0gW107IC8v5p+l6K+i5p2h5Lu2CiAgICAgICAgICAgIHZhciBxdWVyeUZpbHRlciA9IHt9OwogICAgICAgICAgICB2YXIgcGFnZUJlYW4gPSB7CiAgICAgICAgICAgICAgcGFnZUJlYW46IHRoaXMucGFnaW5hdGlvbgogICAgICAgICAgICB9OwogICAgICAgICAgICB2YXIgcGFyYW1zID0gewogICAgICAgICAgICAgIHRlbXBsYXRlSWQ6IHRoaXMudGVtcGxhdGVJbmZvLmlkCiAgICAgICAgICAgIH07CiAgICAgICAgICAgIHBhcmFtcy5wYWdpbmF0aW9uID0gcGFnZUJlYW47CgogICAgICAgICAgICAvLyDlsIbov4fmu6TmnaHku7bmt7vliqDmn6Xor6Llj4LmlbDmlbDnu4TkuK0KICAgICAgICAgICAgaWYgKHRoaXMuZmlsdGVycyAmJiBPYmplY3Qua2V5cyh0aGlzLmZpbHRlcnMpLmxlbmd0aCA+IDApIHsKICAgICAgICAgICAgICB2YXIgcHJlZml4ID0gdGhpcy50ZW1wbGF0ZUluZm8uaXNFeHRlcm5hbCA9PT0gMSA/ICcnIDogJ0ZfJzsKICAgICAgICAgICAgICBPYmplY3Qua2V5cyh0aGlzLmZpbHRlcnMpLmZvckVhY2goZnVuY3Rpb24gKGspIHsKICAgICAgICAgICAgICAgIHZhciBmaWx0ZXIgPSBfdGhpczguZmlsdGVyc1trXTsKICAgICAgICAgICAgICAgIHZhciBxdWVyeSA9IHsKICAgICAgICAgICAgICAgICAgcHJvcGVydHk6IHByZWZpeCArIGssCiAgICAgICAgICAgICAgICAgIHZhbHVlOiBmaWx0ZXJbMF0sCiAgICAgICAgICAgICAgICAgIGdyb3VwOiAnZmlsdGVyJywKICAgICAgICAgICAgICAgICAgcmVsYXRpb246ICdBTkQnCiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgaWYgKGZpbHRlci5sZW5ndGggPT0gMSkgewogICAgICAgICAgICAgICAgICBxdWVyeS5vcGVyYXRpb24gPSAnRVFVQUwnOwogICAgICAgICAgICAgICAgICBxdWVyeXMucHVzaChxdWVyeSk7CiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGZpbHRlci5sZW5ndGggPiAxKSB7CiAgICAgICAgICAgICAgICAgIHF1ZXJ5Lm9wZXJhdGlvbiA9ICdJTic7CiAgICAgICAgICAgICAgICAgIHF1ZXJ5LnZhbHVlID0gZmlsdGVyOwogICAgICAgICAgICAgICAgICBxdWVyeXMucHVzaChxdWVyeSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKHRoaXMucXVlcnlGb3JtLnF1ZXJ5RGF0YSA9PSAnJykgewogICAgICAgICAgICAgIHF1ZXJ5RmlsdGVyID0gewogICAgICAgICAgICAgICAgcGFnZUJlYW46IHRoaXMucGFnaW5hdGlvbiwKICAgICAgICAgICAgICAgIHF1ZXJ5czogcXVlcnlzCiAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICBwYXJhbXMucGFnaW5hdGlvbiA9IHF1ZXJ5RmlsdGVyOwogICAgICAgICAgICAgIHJldHVybiBwYXJhbXM7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgaWYgKHR5cGVvZiAkKCQoc2VhcmNoQWxsWzBdKS5jaGlsZHJlbigpWzBdKS5hdHRyKCdodC1xdWljay1zZWFyY2gnKSAhPSAndW5kZWZpbmVkJykgewogICAgICAgICAgICAgICAgdmFsdWVzID0gJCgkKHNlYXJjaEFsbFswXSkuY2hpbGRyZW4oKVswXSkuYXR0cignaHQtcXVpY2stc2VhcmNoJyk7CiAgICAgICAgICAgICAgICB2YXIgYXJyID0gdmFsdWVzLnNwbGl0KCcsJyk7CiAgICAgICAgICAgICAgICB2YXIgX2l0ZXJhdG9yID0gX2NyZWF0ZUZvck9mSXRlcmF0b3JIZWxwZXIoYXJyKSwKICAgICAgICAgICAgICAgICAgX3N0ZXA7CiAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICBmb3IgKF9pdGVyYXRvci5zKCk7ICEoX3N0ZXAgPSBfaXRlcmF0b3IubigpKS5kb25lOykgewogICAgICAgICAgICAgICAgICAgIHZhciB2YWx1ZSA9IF9zdGVwLnZhbHVlOwogICAgICAgICAgICAgICAgICAgIHF1ZXJ5cy5wdXNoKHsKICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnR5OiB2YWx1ZSwKICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiB0aGlzLnF1ZXJ5Rm9ybS5xdWVyeURhdGEsCiAgICAgICAgICAgICAgICAgICAgICBncm91cDogJ21haW4nLAogICAgICAgICAgICAgICAgICAgICAgb3BlcmF0aW9uOiAnTElLRScsCiAgICAgICAgICAgICAgICAgICAgICByZWxhdGlvbjogJ09SJwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9IGNhdGNoIChlcnIpIHsKICAgICAgICAgICAgICAgICAgX2l0ZXJhdG9yLmUoZXJyKTsKICAgICAgICAgICAgICAgIH0gZmluYWxseSB7CiAgICAgICAgICAgICAgICAgIF9pdGVyYXRvci5mKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIHF1ZXJ5RmlsdGVyID0gewogICAgICAgICAgICAgIHBhZ2VCZWFuOiB0aGlzLnBhZ2luYXRpb24sCiAgICAgICAgICAgICAgcXVlcnlzOiBxdWVyeXMKICAgICAgICAgICAgfTsKICAgICAgICAgICAgcGFyYW1zLnBhZ2luYXRpb24gPSBxdWVyeUZpbHRlcjsKICAgICAgICAgICAgcmV0dXJuIHBhcmFtczsKICAgICAgICAgIH0sCiAgICAgICAgICAvL+aJk+W8gOmrmOe6p+ajgOe0ogogICAgICAgICAgYWR2YW5jZWQ6IGZ1bmN0aW9uIGFkdmFuY2VkKCkgewogICAgICAgICAgICB0aGlzLmZvcm1UeXBlID0gIXRoaXMuZm9ybVR5cGU7CiAgICAgICAgICAgIGlmICh0aGlzLmZvcm1UeXBlKSB7CiAgICAgICAgICAgICAgdGhpcy5pbmNvbnMgPSAnZWwtaWNvbi1hcnJvdy11cCc7CiAgICAgICAgICAgICAgdGhpcy5xdWVyeUZvcm0ucXVlcnlEYXRhID0gJyc7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgdGhpcy5pbmNvbnMgPSAnZWwtaWNvbi1hcnJvdy1kb3duJzsKICAgICAgICAgICAgICB0aGlzLnNlYXJjaEZvcm0gPSB7fTsKICAgICAgICAgICAgfQogICAgICAgICAgfSwKICAgICAgICAgIC8v5Zue6L2m5p+l6K+iCiAgICAgICAgICBzZWFyY2hFbnRlckZ1bjogZnVuY3Rpb24gc2VhcmNoRW50ZXJGdW4oZSkgewogICAgICAgICAgICB2YXIga2V5Q29kZSA9IHdpbmRvdy5ldmVudCA/IGUua2V5Q29kZSA6IGUud2hpY2g7CiAgICAgICAgICAgIGlmIChrZXlDb2RlID09IDEzKSB7CiAgICAgICAgICAgICAgdGhpcy5zZWFyY2goJ2ZpbmQnKTsKICAgICAgICAgICAgfQogICAgICAgICAgfSwKICAgICAgICAgIHJlc2V0OiBmdW5jdGlvbiByZXNldChmbGFnKSB7CiAgICAgICAgICAgIHRoaXMucXVlcnlGb3JtLnF1ZXJ5RGF0YSA9ICcnOwogICAgICAgICAgICBpZiAodGhpcy50ZW1wbGF0ZUluZm8uY29uZGl0aW9uRmllbGQpIHsKICAgICAgICAgICAgICB2YXIgY29uZGl0aW9uRmllbGQgPSB1dGlscy5wYXJzZVRvSnNvbih0aGlzLnRlbXBsYXRlSW5mby5jb25kaXRpb25GaWVsZCk7CiAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjb25kaXRpb25GaWVsZC5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgICAgdmFyIGZpZWxkTmFtZSA9ICdGXycgKyBjb25kaXRpb25GaWVsZFtpXS5uYW1lOwogICAgICAgICAgICAgICAgdGhpcy4kc2V0KHRoaXMuc2VhcmNoRm9ybSwgZmllbGROYW1lLCAnJyk7CiAgICAgICAgICAgICAgICB0aGlzLiRzZXQodGhpcy5zZWFyY2hGb3JtLCBjb25kaXRpb25GaWVsZFtpXS5uYW1lLCAnJyk7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIHRoaXMuZmlsdGVycyA9IHt9OwogICAgICAgICAgICB0aGlzLiRyZWZzLm11bHRpcGxlVGVtcGxhdGVUYWJsZS5jbGVhckZpbHRlcigpOwogICAgICAgICAgICBpZiAoIWZsYWcpIHsKICAgICAgICAgICAgICB0aGlzLnNlYXJjaCgnZmluZCcpOwogICAgICAgICAgICB9CiAgICAgICAgICB9LAogICAgICAgICAgaGFuZGxlU2VsZWN0aW9uQ2hhbmdlOiBmdW5jdGlvbiBoYW5kbGVTZWxlY3Rpb25DaGFuZ2UodmFsKSB7CiAgICAgICAgICAgIHRoaXMudGFibGVEYXRhLnNlbGVjdFJvd3MgPSB2YWw7CiAgICAgICAgICB9LAogICAgICAgICAgZGVsZXRlZDogZnVuY3Rpb24gZGVsZXRlZCgpIHsKICAgICAgICAgICAgdmFyIF90aGlzOSA9IHRoaXM7CiAgICAgICAgICAgIGlmICh0aGlzLnRhYmxlRGF0YS5zZWxlY3RSb3dzID09IG51bGwgfHwgdGhpcy50YWJsZURhdGEuc2VsZWN0Um93cy5sZW5ndGggPT0gMCkgewogICAgICAgICAgICAgIHRoaXMuJG1lc3NhZ2Uud2FybmluZygn6K+36YCJ5oup5paH5Lu25Yig6ZmkIScpOwogICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgfQogICAgICAgICAgICB0aGlzLiRjb25maXJtKCfmraTmk43kvZzlsIbliKDpmaTor6Xmlofku7YsIOaYr+WQpue7p+e7rT8nLCAn5o+Q56S6JywgewogICAgICAgICAgICAgIGNvbmZpcm1CdXR0b25UZXh0OiAn56Gu5a6aJywKICAgICAgICAgICAgICBjYW5jZWxCdXR0b25UZXh0OiAn5Y+W5raIJywKICAgICAgICAgICAgICB0eXBlOiAnd2FybmluZycKICAgICAgICAgICAgfSkudGhlbihmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgdmFyIHMgPSBbXTsKICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IF90aGlzOS50YWJsZURhdGEuc2VsZWN0Um93cy5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgICAgcy5wdXNoKF90aGlzOS50YWJsZURhdGEuc2VsZWN0Um93c1tpXVtfdGhpczkudGVtcGxhdGVJbmZvLnBrRmllbGRdKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgdmFyIGRhdGEgPSB7CiAgICAgICAgICAgICAgICBpZHM6IHMuam9pbignLCcpLAogICAgICAgICAgICAgICAgYm9BbGlhczogX3RoaXM5LnRlbXBsYXRlSW5mby5ib0RlZkFsaWFzCiAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICBfdGhpczkuJHN0b3JlLmRpc3BhdGNoKCdmb3JtL2RlbGV0ZVRlbXBsYXRlRGF0YUJ5SWQnLCBkYXRhKS50aGVuKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIF90aGlzOS5wYWdpbmF0aW9uLnBhZ2UgPSAxOwogICAgICAgICAgICAgICAgX3RoaXM5LnNlYXJjaCgpOwogICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9KS5jYXRjaChmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgX3RoaXM5LiRtZXNzYWdlKHsKICAgICAgICAgICAgICAgIHR5cGU6ICdpbmZvJywKICAgICAgICAgICAgICAgIG1lc3NhZ2U6ICflt7Llj5bmtojliKDpmaQnCiAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0pOwogICAgICAgICAgfSwKICAgICAgICAgIGRlbDogZnVuY3Rpb24gZGVsKGlkKSB7CiAgICAgICAgICAgIHZhciBfdGhpczEwID0gdGhpczsKICAgICAgICAgICAgdGhpcy4kY29uZmlybSgn5q2k5pON5L2c5bCG5Yig6Zmk6K+l5pWw5o2uLCDmmK/lkKbnu6fnu60/JywgJ+aPkOekuicsIHsKICAgICAgICAgICAgICBjb25maXJtQnV0dG9uVGV4dDogJ+ehruWumicsCiAgICAgICAgICAgICAgY2FuY2VsQnV0dG9uVGV4dDogJ+WPlua2iCcsCiAgICAgICAgICAgICAgdHlwZTogJ3dhcm5pbmcnCiAgICAgICAgICAgIH0pLnRoZW4oZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgIHZhciBkYXRhID0gewogICAgICAgICAgICAgICAgaWRzOiBpZCwKICAgICAgICAgICAgICAgIGJvQWxpYXM6IF90aGlzMTAudGVtcGxhdGVJbmZvLmJvRGVmQWxpYXMKICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgIF90aGlzMTAuJHN0b3JlLmRpc3BhdGNoKCdmb3JtL2RlbGV0ZVRlbXBsYXRlRGF0YUJ5SWQnLCBkYXRhKS50aGVuKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIF90aGlzMTAucGFnaW5hdGlvbi5wYWdlID0gMTsKICAgICAgICAgICAgICAgIF90aGlzMTAuc2VhcmNoKCk7CiAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0pLmNhdGNoKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICBfdGhpczEwLiRtZXNzYWdlKHsKICAgICAgICAgICAgICAgIHR5cGU6ICdpbmZvJywKICAgICAgICAgICAgICAgIG1lc3NhZ2U6ICflt7Llj5bmtojliKDpmaQnCiAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0pOwogICAgICAgICAgfSwKICAgICAgICAgIG9wZXJhdGluZzogZnVuY3Rpb24gb3BlcmF0aW5nKHRlbXBsYXRlSWQsIGlkLCBhY3Rpb24sIGRlZklkLCBpc1N0YXJ0Rmxvdywgb3BlblR5cGUpIHsKICAgICAgICAgICAgLy9pc1N0YXJ0RmxvdyDvvIhmYWxzZe+8muWPr+S7peWPkei1t+a1geeoi++8jHRydWXvvJrkuI3lj6/ku6Xlj5HotbfmtYHnqIvvvIkKICAgICAgICAgICAgaWYgKHRoaXMudGVtcGxhdGVJbmZvLm1hbmFnZUZpZWxkICYmICFpc1N0YXJ0RmxvdykgewogICAgICAgICAgICAgIC8v5YWI6YWN572u5LiN6IO95Y+R6LW35rWB56iLCiAgICAgICAgICAgICAgaWYgKGFjdGlvbiA9PSAnYWRkJyAmJiBpc1N0YXJ0RmxvdyA9PSAnJykgewogICAgICAgICAgICAgICAgaXNTdGFydEZsb3cgPSB0cnVlOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBpZiAoYWN0aW9uID09ICdlZGl0JyAmJiBpc1N0YXJ0RmxvdyA9PT0gZmFsc2UpIHsKICAgICAgICAgICAgICAgIGlzU3RhcnRGbG93ID0gdHJ1ZTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgLy/lho3liKTmlq3mmK/lkKblj6/ku6Xlj5HotbfmtYHnqIsKICAgICAgICAgICAgICB2YXIgbWFuYWdlRmllbGQgPSBKU09OLnBhcnNlKHRoaXMudGVtcGxhdGVJbmZvLm1hbmFnZUZpZWxkKTsKICAgICAgICAgICAgICAvL+WIpOaWreaYr+WQpumFjee9ruS6huWPkei1t+a1geeoi+aMiemSrgogICAgICAgICAgICAgIGZvciAodmFyIGsgPSAwOyBrIDwgbWFuYWdlRmllbGQubGVuZ3RoOyBrKyspIHsKICAgICAgICAgICAgICAgIGlmIChhY3Rpb24gPT0gJ2FkZCcgJiYgbWFuYWdlRmllbGRba10ubmFtZSA9PSAnc3RhcnRGbG93JykgewogICAgICAgICAgICAgICAgICBpc1N0YXJ0RmxvdyA9IGZhbHNlOwogICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoYWN0aW9uID09ICdlZGl0JyAmJiBtYW5hZ2VGaWVsZFtrXS5uYW1lID09ICdzdGFydEZsb3cnKSB7CiAgICAgICAgICAgICAgICAgIGlzU3RhcnRGbG93ID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoIXRlbXBsYXRlSWQpIHsKICAgICAgICAgICAgICB0ZW1wbGF0ZUlkID0gdGhpcy50ZW1wbGF0ZUluZm8uaWQ7CiAgICAgICAgICAgICAgYWN0aW9uID0gYWN0aW9uID09ICdzZWxlY3QnID8gJ2dldCcgOiAnYWRkJzsKICAgICAgICAgICAgfQogICAgICAgICAgICAvL+aVsOaNruinhuWbvumaj+acuua3u+WKoOWIsOWFtuS7luiPnOWNleS4i+mdouaXtuiOt+WPluW9k+WJjeiPnOWNleeahOWIq+WQjSAg5bm25LiU5b2T5YmN5pWw5o2u6KeG5Zu+5LiN5piv6KGo5Y2V6YeM55qE5pWw5o2u6KeG5Zu+ICBkYXRhVmlldwogICAgICAgICAgICBpZiAoc2Vzc2lvblN0b3JhZ2UubWVudV9hbGlhcyAmJiAhdGhpcy5kYXRhVmlldyAmJiAhdGhpcy5pZ25vcmVkQWxpYXMuaW5jbHVkZXMoc2Vzc2lvblN0b3JhZ2UubWVudV9hbGlhcykpIHsKICAgICAgICAgICAgICB0aGlzLmFsaWFzX25ldyA9IHNlc3Npb25TdG9yYWdlLm1lbnVfYWxpYXM7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdmFyIHVybCA9ICcvJyArIHRoaXMuYWxpYXNfbmV3ICsgJy90ZW1wbGF0ZS9mb3JtLycgKyB0aGlzLnRlbXBsYXRlS2V5ICsgJy8nICsgYWN0aW9uOwogICAgICAgICAgICBpZiAodGhpcy5pc0pvaW5GbG93KSB7CiAgICAgICAgICAgICAgdGhpcy5hbGlhc19uZXcgPSAnc3RhdGVtZW50JzsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAodGhpcy5zaW5nbGUgPT0gJ3RydWUnKSB7CiAgICAgICAgICAgICAgdXJsID0gJy8nICsgdGhpcy5hbGlhc19uZXcgKyAnL3RlbXBsYXRlL2Zvcm0vJyArIHRoaXMudGVtcGxhdGVLZXkgKyAnLycgKyBhY3Rpb24gKyAnL3RydWUnOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8v5Yik5pat5pWw5o2u6KeG5Zu+5o6n5Lu2CiAgICAgICAgICAgIHZhciBpc0RhdGFWaWV3ID0gZmFsc2U7CiAgICAgICAgICAgIGlmICh0aGlzLmRhdGFWaWV3KSB7CiAgICAgICAgICAgICAgaWYgKHRoaXMuZGF0YVZpZXcuYm9EZWZBbGlhcyAmJiB0aGlzLmRhdGFWaWV3LmJvRGVmQWxpYXMgIT0gJycpIHsKICAgICAgICAgICAgICAgIGlzRGF0YVZpZXcgPSB0cnVlOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAob3BlblR5cGUgPT0gJ25ldycgfHwgdGhpcy5pc0pvaW5GbG93IHx8IGlzRGF0YVZpZXcpIHsKICAgICAgICAgICAgICB1cmwgKz0gJy9uZXcnOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChpZCkgewogICAgICAgICAgICAgIHVybCA9IHVybCArICc/aWQ9JyArIGlkICsgJyYnOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgIHVybCArPSAnPyc7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdmFyIHN0YXJ0Rmxvd1N0ciA9ICdzdGFydEZsb3c9ZmFsc2UnOwogICAgICAgICAgICBpZiAoYWN0aW9uID09ICdhZGQnICYmIGRlZklkICYmIGlzU3RhcnRGbG93ID09PSBmYWxzZSkgewogICAgICAgICAgICAgIHN0YXJ0Rmxvd1N0ciA9ICdzdGFydEZsb3c9dHJ1ZSc7CiAgICAgICAgICAgIH0gZWxzZSBpZiAoaWQgJiYgaXNTdGFydEZsb3cgPT09IGZhbHNlICYmIGRlZklkKSB7CiAgICAgICAgICAgICAgc3RhcnRGbG93U3RyID0gJ3N0YXJ0Rmxvdz10cnVlJzsKICAgICAgICAgICAgfQogICAgICAgICAgICB2YXIgZGF0YVVybCA9ICcnOwogICAgICAgICAgICBpZiAodGhpcy5kYXRhVmlldykgewogICAgICAgICAgICAgIGlmICh0aGlzLmRhdGFWaWV3LmJpbmRMaXN0ICYmIHRoaXMuZGF0YVZpZXcuYmluZExpc3QubGVuZ3RoID4gMCkgewogICAgICAgICAgICAgICAgdmFyIGJpbmRMaXN0ID0gW107CiAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuZGF0YVZpZXcuYmluZExpc3QubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgICAgdmFyIGl0ZW0gPSB7CiAgICAgICAgICAgICAgICAgICAga2V5OiB0aGlzLmRhdGFWaWV3LmJpbmRMaXN0W2ldLmJpbmRGaWxsZCwKICAgICAgICAgICAgICAgICAgICB2YWx1ZTogdGhpcy5kYXRhVmlldy5iaW5kTGlzdFtpXS5maWxsVmFsdWUKICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgYmluZExpc3QucHVzaChpdGVtKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGRhdGFVcmwgPSAnJmJpbmRMaXN0PScgKyBlbmNvZGVVUklDb21wb25lbnQoQmFzZTY0LmVuY29kZShKU09OLnN0cmluZ2lmeShiaW5kTGlzdCkpKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdmFyIHBhdGggPSB1cmwgKyBzdGFydEZsb3dTdHI7CiAgICAgICAgICAgIGlmIChkYXRhVXJsICE9ICcnKSB7CiAgICAgICAgICAgICAgcGF0aCA9IHVybCArIHN0YXJ0Rmxvd1N0ciArIGRhdGFVcmw7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZGVidWdnZXI7CiAgICAgICAgICAgIC8vVE9ETyDlpoLmnpzmmK/mqKHlnZflvIDlj5Eg5YWo6YOo5bey5paw56qX5Y+j5omT5byACiAgICAgICAgICAgIGlmIChvcGVuVHlwZSA9PSAnbmV3JyB8fCB0aGlzLmlzSm9pbkZsb3cgfHwgaXNEYXRhVmlldykgewogICAgICAgICAgICAgIHdpbmRvdy5vcGVuKHRoaXMuJHJvdXRlci5yZXNvbHZlKHBhdGgucmVwbGFjZSh0aGlzLmFsaWFzX25ldywgJ3N0YXRlbWVudCcpICsgJyZpc05ld1BhZ2U9dHJ1ZScpLmhyZWYsICdfYmxhbmsnKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICBpZiAocGF0aC5pbmRleE9mKCdvdGhlcm1lbnUnKSAhPSAtMSkgewogICAgICAgICAgICAgICAgcGF0aCA9IHBhdGgucmVwbGFjZSgnL290aGVybWVudScsICcvc3RhdGVtZW50Jyk7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIHRoaXMuJHJvdXRlci5wdXNoKHBhdGgpOwogICAgICAgICAgICB9CiAgICAgICAgICB9LAogICAgICAgICAgb3BlblVybDogZnVuY3Rpb24gb3BlblVybCh1cmwsIHR5cGUsIHJvdywgZmllbGROYW1lKSB7CiAgICAgICAgICAgIGlmIChyb3cgJiYgZmllbGROYW1lKSB7CiAgICAgICAgICAgICAgdXJsID0gdGhpcy5oYW5kbGVkVXJsUGFyYW1zKHVybCwgcm93LCBmaWVsZE5hbWUpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICh0eXBlID09ICduZXcnKSB7CiAgICAgICAgICAgICAgd2luZG93Lm9wZW4odXJsLCAnX2JsYW5rJyk7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgd2luZG93LmxvY2F0aW9uLmhyZWYgPSB1cmw7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0sCiAgICAgICAgICBoYW5kbGVkVXJsUGFyYW1zOiBmdW5jdGlvbiBoYW5kbGVkVXJsUGFyYW1zKHVybCwgcm93LCBmaWVsZE5hbWUpIHsKICAgICAgICAgICAgaWYgKHRoaXMudGVtcGxhdGVJbmZvLmRpc3BsYXlGaWVsZCkgewogICAgICAgICAgICAgIHZhciBkaXNwbGF5RmllbGRzID0gSlNPTi5wYXJzZSh0aGlzLnRlbXBsYXRlSW5mby5kaXNwbGF5RmllbGQpOwogICAgICAgICAgICAgIGRpc3BsYXlGaWVsZHMuZm9yRWFjaChmdW5jdGlvbiAoZGlzcGxheSkgewogICAgICAgICAgICAgICAgaWYgKGRpc3BsYXkubmFtZSA9PSBmaWVsZE5hbWUpIHsKICAgICAgICAgICAgICAgICAgaWYgKGRpc3BsYXkudXJsUGFyYW1zICYmIGRpc3BsYXkudXJsUGFyYW1zLmxlbmd0aCA+IDApIHsKICAgICAgICAgICAgICAgICAgICB2YXIgdXJsUGFyYW1zID0gZGlzcGxheS51cmxQYXJhbXM7CiAgICAgICAgICAgICAgICAgICAgdmFyIHN1ZmZpeCA9ICcnOwogICAgICAgICAgICAgICAgICAgIHVybFBhcmFtcy5mb3JFYWNoKGZ1bmN0aW9uIChwYXJhbSkgewogICAgICAgICAgICAgICAgICAgICAgaWYgKHN1ZmZpeCkgewogICAgICAgICAgICAgICAgICAgICAgICBzdWZmaXggKz0gJyYnOwogICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgc3VmZml4ID0gc3VmZml4ICsgcGFyYW0ubmFtZSArICc9JyArIHJvd1twYXJhbS5maWVsZF07CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgaWYgKHN1ZmZpeCkgewogICAgICAgICAgICAgICAgICAgICAgaWYgKHVybC5pbmRleE9mKCc/JykgIT0gLTEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdXJsID0gdXJsICsgJyYnICsgc3VmZml4OwogICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgdXJsID0gdXJsICsgJz8nICsgc3VmZml4OwogICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHVybDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgcmV0dXJuIHVybDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gdXJsOwogICAgICAgICAgfSwKICAgICAgICAgIHZpZXdSZXBvcnQ6IGZ1bmN0aW9uIHZpZXdSZXBvcnQoZGF0YSwganNvblN0ciwgb3BlblR5cGUpIHsKICAgICAgICAgICAgdmFyIGl0ZW0gPSBKU09OLnBhcnNlKEJhc2U2NC5kZWNvZGUoanNvblN0cikpOwogICAgICAgICAgICB2YXIgY29uZGl0aW9uRmllbGQgPSBpdGVtLmNvbmRpdGlvbkZpZWxkOwogICAgICAgICAgICB2YXIgcXVlcnlzID0gW107CiAgICAgICAgICAgIGlmIChjb25kaXRpb25GaWVsZCAmJiBjb25kaXRpb25GaWVsZC5sZW5ndGggPiAwKSB7CiAgICAgICAgICAgICAgY29uZGl0aW9uRmllbGQuZm9yRWFjaChmdW5jdGlvbiAob2JqKSB7CiAgICAgICAgICAgICAgICBpZiAob2JqLnBhcmFtZXRlcikgewogICAgICAgICAgICAgICAgICBxdWVyeXMucHVzaCh7CiAgICAgICAgICAgICAgICAgICAgcHJvcGVydHk6IG9iai5rZXksCiAgICAgICAgICAgICAgICAgICAgdmFsdWU6IGRhdGFbb2JqLnBhcmFtZXRlcl0sCiAgICAgICAgICAgICAgICAgICAgZ3JvdXA6ICdtYWluJywKICAgICAgICAgICAgICAgICAgICBvcGVyYXRpb246IG9iai5xdCwKICAgICAgICAgICAgICAgICAgICByZWxhdGlvbjogJ0FORCcKICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy/mlbDmja7pmo/mnLrmt7vliqDliLDlhbbku5boj5zljZXkuIvpnaLml7bojrflj5blvZPliY3oj5zljZXnmoTliKvlkI0KICAgICAgICAgICAgaWYgKHNlc3Npb25TdG9yYWdlLm1lbnVfYWxpYXMpIHsKICAgICAgICAgICAgICB0aGlzLmFsaWFzX25ldyA9IHNlc3Npb25TdG9yYWdlLm1lbnVfYWxpYXM7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdmFyIHVybCA9ICcvJyArIHRoaXMuYWxpYXNfbmV3ICsgJy90ZW1wbGF0ZS9wcmV2aWV3LycgKyBpdGVtLmFsaWFzICsgJy9mYWxzZS8nICsgZW5jb2RlVVJJQ29tcG9uZW50KEJhc2U2NC5lbmNvZGUoSlNPTi5zdHJpbmdpZnkocXVlcnlzKSkpOwogICAgICAgICAgICAvL3VybCDovaznoIHpmLLmraLmnInmlpzmnaAg5a+86Ie06Lev55Sx6Lez6L2s5LiN5a+5CiAgICAgICAgICAgIGlmIChvcGVuVHlwZSA9PSAnbmV3JykgewogICAgICAgICAgICAgIHdpbmRvdy5vcGVuKHRoaXMuJHJvdXRlci5yZXNvbHZlKHVybCkuaHJlZiwgJ19ibGFuaycpOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgIHRoaXMuJHJvdXRlci5wdXNoKHVybCk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0sCiAgICAgICAgICBzdGFydEZsb3c6IGZ1bmN0aW9uIHN0YXJ0RmxvdyhpZCkgewogICAgICAgICAgICB2YXIgX3RoaXMxMSA9IHRoaXM7CiAgICAgICAgICAgIHZhciBkYXRhID0gewogICAgICAgICAgICAgIGRlZktleTogdGhpcy50ZW1wbGF0ZUluZm8uZGVmSWQsCiAgICAgICAgICAgICAgYnVzaW5lc3NLZXk6IGlkLAogICAgICAgICAgICAgIGJvQWxpYXM6IHRoaXMudGVtcGxhdGVJbmZvLmJvRGVmQWxpYXMKICAgICAgICAgICAgfTsKICAgICAgICAgICAgdmFyIGxvYWRpbmdJbnN0YW5jZSA9IExvYWRpbmcuc2VydmljZSh7CiAgICAgICAgICAgICAgZnVsbHNjcmVlbjogdHJ1ZQogICAgICAgICAgICB9KTsgLy/lvIDlp4sKICAgICAgICAgICAgdGhpcy4kc3RvcmUuZGlzcGF0Y2goJ3N0b3JlUHJvY2Vzcy9zdGFydEZvcm0nLCBkYXRhKS50aGVuKGZ1bmN0aW9uIChyZXN1bHQpIHsKICAgICAgICAgICAgICBsb2FkaW5nSW5zdGFuY2UuY2xvc2UoKTsgLy8g57uT5p2fCiAgICAgICAgICAgICAgaWYgKHJlc3VsdC5zdGF0ZSkgewogICAgICAgICAgICAgICAgX3RoaXMxMS4kbWVzc2FnZS5zdWNjZXNzKHJlc3VsdC5tZXNzYWdlKTsKICAgICAgICAgICAgICAgIF90aGlzMTEuc2VhcmNoKCk7CiAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIF90aGlzMTEuZGlzYWJsZWQgPSBmYWxzZTsKICAgICAgICAgICAgICAgIF90aGlzMTEuJG1lc3NhZ2UuZXJyb3IocmVzdWx0Lm1lc3NhZ2UpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgICB9LAogICAgICAgICAgLy/ngrnlh7vlr7zlh7rmjInpkq4KICAgICAgICAgIGV4cG9ydHM6IGZ1bmN0aW9uIGV4cG9ydHMoZXhwb3J0U2V0dGluZ0ZpZWxkcykgewogICAgICAgICAgICB2YXIgX3RoaXMxMiA9IHRoaXM7CiAgICAgICAgICAgIHZhciBkaXNwbGF5RmllbGRzID0gW107CiAgICAgICAgICAgIGlmIChleHBvcnRTZXR0aW5nRmllbGRzKSB7CiAgICAgICAgICAgICAgZGlzcGxheUZpZWxkcyA9IEpTT04ucGFyc2UoQmFzZTY0LmRlY29kZShleHBvcnRTZXR0aW5nRmllbGRzKSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKGRpc3BsYXlGaWVsZHMubGVuZ3RoID09IDAgJiYgdGhpcy50ZW1wbGF0ZUluZm8uZGlzcGxheUZpZWxkKSB7CiAgICAgICAgICAgICAgZGlzcGxheUZpZWxkcyA9IEpTT04ucGFyc2UodGhpcy50ZW1wbGF0ZUluZm8uZGlzcGxheUZpZWxkKTsKICAgICAgICAgICAgfQogICAgICAgICAgICB0aGlzLmV4cG9ydFR5cGUgPSAnbWFpbic7CiAgICAgICAgICAgIHRoaXMuZGlzcGxheUZpZWxkcyA9IFtdOwogICAgICAgICAgICBkaXNwbGF5RmllbGRzLmZvckVhY2goZnVuY3Rpb24gKGl0ZW0pIHsKICAgICAgICAgICAgICBpZiAoaXRlbS50eXBlKSB7CiAgICAgICAgICAgICAgICBfdGhpczEyLmRpc3BsYXlGaWVsZHMucHVzaChpdGVtKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICB0aGlzLmRpYWxvZ0V4cG9ydFZpc2libGUgPSB0cnVlOwogICAgICAgICAgfSwKICAgICAgICAgIGltcG9ydENvbW1hbmQ6IGZ1bmN0aW9uIGltcG9ydENvbW1hbmQocGFyYW1zKSB7CiAgICAgICAgICAgIHN3aXRjaCAocGFyYW1zLmNvbW1hbmQpIHsKICAgICAgICAgICAgICBjYXNlICdkb3dubG9hZFRlbXBGaWxlJzoKICAgICAgICAgICAgICAgIHRoaXMuZG93bmxvYWRNYWluVGVtcEZpbGUoKTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgIGNhc2UgJ2ltcG9ydE1haW4nOgogICAgICAgICAgICAgICAgdGhpcy5pbXBvcnRNYWluKCk7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICBjYXNlICdsb2cnOgogICAgICAgICAgICAgICAgdGhpcy5vcGVuTG9nKCk7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0sCiAgICAgICAgICBvcGVuTG9nOiBmdW5jdGlvbiBvcGVuTG9nKCkgewogICAgICAgICAgICB0aGlzLmRpYWxvZ1Zpc2libGUgPSB0cnVlOwogICAgICAgICAgfSwKICAgICAgICAgIGRvd25sb2FkTWFpblRlbXBGaWxlOiBmdW5jdGlvbiBkb3dubG9hZE1haW5UZW1wRmlsZSgpIHsKICAgICAgICAgICAgdmFyIGN1c3RvbVRlbXBsYXRlSWQgPSAnJzsKICAgICAgICAgICAgaWYgKHRoaXMudGVtcGxhdGVJbmZvICYmIHRoaXMudGVtcGxhdGVJbmZvLm1hbmFnZUZpZWxkKSB7CiAgICAgICAgICAgICAgdmFyIG1hbmFnZUZpZWxkTGlzdCA9IEpTT04ucGFyc2UodGhpcy50ZW1wbGF0ZUluZm8ubWFuYWdlRmllbGQpOwogICAgICAgICAgICAgIGZvciAodmFyIGluZGV4ID0gMDsgaW5kZXggPCBtYW5hZ2VGaWVsZExpc3QubGVuZ3RoOyBpbmRleCsrKSB7CiAgICAgICAgICAgICAgICB2YXIgbWFuYWdlID0gbWFuYWdlRmllbGRMaXN0W2luZGV4XTsKICAgICAgICAgICAgICAgIGlmIChtYW5hZ2UubmFtZSA9PSAnaW1wb3J0JykgewogICAgICAgICAgICAgICAgICBpZiAobWFuYWdlLmltcG9ydFRlbXBsYXRlICYmIG1hbmFnZS5pbXBvcnRUZW1wbGF0ZS5sZW5ndGggPiAwKSB7CiAgICAgICAgICAgICAgICAgICAgY3VzdG9tVGVtcGxhdGVJZCA9IG1hbmFnZS5pbXBvcnRUZW1wbGF0ZVswXS5pZDsKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKGN1c3RvbVRlbXBsYXRlSWQpIHsKICAgICAgICAgICAgICB0aGlzLiRzdG9yZS5kaXNwYXRjaCgnbWVudS9kb3dubG9hZEZpbGUnLCBjdXN0b21UZW1wbGF0ZUlkKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICB2YXIgbG9hZGluZ0luc3RhbmNlID0gTG9hZGluZy5zZXJ2aWNlKHsKICAgICAgICAgICAgICAgIGZ1bGxzY3JlZW46IHRydWUKICAgICAgICAgICAgICB9KTsgLy/lvIDlp4sKICAgICAgICAgICAgICB0aGlzLiRzdG9yZS5kaXNwYXRjaCgnZm9ybS9kb3dubG9hZE1haW5UZW1wRmlsZScsIHRoaXMudGVtcGxhdGVJbmZvLmFsaWFzKS50aGVuKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIGxvYWRpbmdJbnN0YW5jZS5jbG9zZSgpOyAvLyDnu5PmnZ8KICAgICAgICAgICAgICB9KS5jYXRjaChmdW5jdGlvbiAoYykgewogICAgICAgICAgICAgICAgbG9hZGluZ0luc3RhbmNlLmNsb3NlKCk7CiAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0sCiAgICAgICAgICBpbXBvcnRNYWluOiBmdW5jdGlvbiBpbXBvcnRNYWluKHBhcmFtKSB7CiAgICAgICAgICAgIHZhciBfdGhpczEzID0gdGhpczsKICAgICAgICAgICAgdmFyIGZvcm1EYXRhID0gbmV3IEZvcm1EYXRhKCk7CiAgICAgICAgICAgIGZvcm1EYXRhLmFwcGVuZCgnZmlsZScsIHBhcmFtLmZpbGUpOwogICAgICAgICAgICB2YXIgcGFyYW1zID0gewogICAgICAgICAgICAgIGRhdGE6IGZvcm1EYXRhLAogICAgICAgICAgICAgIGFsaWFzOiB0aGlzLnRlbXBsYXRlSW5mby5hbGlhcwogICAgICAgICAgICB9OwogICAgICAgICAgICBpZiAodGhpcy5kYXRhVmlldykgewogICAgICAgICAgICAgIHRoaXMuaGFuZGVsQmluZEZpbGVkVmFsdWEoKTsKICAgICAgICAgICAgICBwYXJhbXMuYmluZEZpbGxkID0gdGhpcy5kYXRhVmlldy5iaW5kRmlsbGQgfHwgJyc7CiAgICAgICAgICAgICAgcGFyYW1zLmZpbGxWYWx1ZSA9IHRoaXMuZGF0YVZpZXcuZmlsbFZhbHVlIHx8ICcnOwogICAgICAgICAgICAgIHBhcmFtcy5yZWZJZFZhbHVlID0gdGhpcy5kYXRhVmlldy5yZWZJZFZhbHVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHZhciBsb2FkaW5nSW5zdGFuY2UgPSBMb2FkaW5nLnNlcnZpY2UoewogICAgICAgICAgICAgIGZ1bGxzY3JlZW46IHRydWUKICAgICAgICAgICAgfSk7IC8v5byA5aeLCiAgICAgICAgICAgIGZvcm0ubWFpbkltcG9ydChwYXJhbXMsIGZ1bmN0aW9uIChkYXRhKSB7CiAgICAgICAgICAgICAgbG9hZGluZ0luc3RhbmNlLmNsb3NlKCk7IC8vIOe7k+adnwogICAgICAgICAgICAgIGlmIChkYXRhLnN0YXRlKSB7CiAgICAgICAgICAgICAgICAvL+WvvOWFpeaIkOWKn+S5i+WQjumHjeaWsOa4suafk+W9k+WJjee7hOS7tgogICAgICAgICAgICAgICAgX3RoaXMxMy4kcGFyZW50LnJlZnJlc2hUaW1lID0gbmV3IERhdGUoKS5nZXRUaW1lKCk7CiAgICAgICAgICAgICAgICBfdGhpczEzLiRtZXNzYWdlKHsKICAgICAgICAgICAgICAgICAgdHlwZTogJ3N1Y2Nlc3MnLAogICAgICAgICAgICAgICAgICBtZXNzYWdlOiBkYXRhLm1lc3NhZ2UKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgcGFyYW0ub25TdWNjZXNzKCk7CiAgICAgICAgICAgICAgICBpZiAoc2Vzc2lvblN0b3JhZ2UuZ2V0SXRlbSgnZm9ybUltcG9ydFRlbXBSZWZJZCcpKSB7CiAgICAgICAgICAgICAgICAgIHZhciBqc29uID0gSlNPTi5wYXJzZShkYXRhLnZhbHVlKTsKICAgICAgICAgICAgICAgICAganNvbi5ib0FsaWFzID0gX3RoaXMxMy5kYXRhVmlldy5ib0RlZkFsaWFzOwogICAgICAgICAgICAgICAgICB2YXIgb2xkQ29uZiA9IHNlc3Npb25TdG9yYWdlLmdldEl0ZW0oJ2Zvcm1JbXBvcnRUZW1wSnNvbicpOwogICAgICAgICAgICAgICAgICBpZiAoIW9sZENvbmYpIHsKICAgICAgICAgICAgICAgICAgICBzZXNzaW9uU3RvcmFnZS5zZXRJdGVtKCdmb3JtSW1wb3J0VGVtcEpzb24nLCBKU09OLnN0cmluZ2lmeShbanNvbl0pKTsKICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICB2YXIgb2xkSm9zbiA9IEpTT04ucGFyc2Uob2xkQ29uZik7CiAgICAgICAgICAgICAgICAgICAgdmFyIGlzSW5PbGRKb3NuID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaW5kZXggPSAwOyBpbmRleCA8IG9sZEpvc24ubGVuZ3RoOyBpbmRleCsrKSB7CiAgICAgICAgICAgICAgICAgICAgICB2YXIgb2xkID0gb2xkSm9zbltpbmRleF07CiAgICAgICAgICAgICAgICAgICAgICBpZiAob2xkLnRhYk5hbWUgPT0ganNvbi50YWJOYW1lICYmIG9sZC5iaW5kRmlsbGQgPT0ganNvbi5iaW5kRmlsbGQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaXNJbk9sZEpvc24gPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYgKCFpc0luT2xkSm9zbikgewogICAgICAgICAgICAgICAgICAgICAgb2xkSm9zbi5wdXNoKGpzb24pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBzZXNzaW9uU3RvcmFnZS5zZXRJdGVtKCdmb3JtSW1wb3J0VGVtcEpzb24nLCBKU09OLnN0cmluZ2lmeShvbGRKb3NuKSk7CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIF90aGlzMTMuc2VhcmNoKCk7CiAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIHBhcmFtLm9uRXJyb3IoKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgICAgfSwKICAgICAgICAgIC8v5pi+56S65a2Q6KGo5a+56K+d5qGGCiAgICAgICAgICBzaG93U3ViTGlzdDogZnVuY3Rpb24gc2hvd1N1Ykxpc3QocmVmSWQpIHsKICAgICAgICAgICAgdGhpcy5yZWZJZCA9IHJlZklkOwogICAgICAgICAgICB0aGlzLmdldFN1YkVudHNCeUZvcm1LZXkocmVmSWQpOwogICAgICAgICAgfSwKICAgICAgICAgIC8v5pi+56S65L+u5pS56K6w5b2VCiAgICAgICAgICBvcGVuUmVjb3JkTGlzdDogZnVuY3Rpb24gb3BlblJlY29yZExpc3QocmVmSWQpIHsKICAgICAgICAgICAgdmFyIF90aGlzMTQgPSB0aGlzOwogICAgICAgICAgICB0aGlzLmRpYWxvZ1JlY29yZFZpc2libGUgPSB0cnVlOwogICAgICAgICAgICB0aGlzLnJlY29yZFJlZklkID0gcmVmSWQ7CiAgICAgICAgICAgIHZhciBwYXJhbSA9IHsKICAgICAgICAgICAgICBwYWdlQmVhbjogewogICAgICAgICAgICAgICAgcGFnZTogMSwKICAgICAgICAgICAgICAgIHBhZ2VTaXplOiAyMCwKICAgICAgICAgICAgICAgIHNob3dUb3RhbDogdHJ1ZQogICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgc29ydGVyOiBbewogICAgICAgICAgICAgICAgZGlyZWN0aW9uOiAnQVNDJywKICAgICAgICAgICAgICAgIHByb3BlcnR5OiAnbW9kaWZ5VGltZScKICAgICAgICAgICAgICB9XSwKICAgICAgICAgICAgICBxdWVyeXM6IFt7CiAgICAgICAgICAgICAgICBwcm9wZXJ0eTogJ3JlZl9pZF8nLAogICAgICAgICAgICAgICAgdmFsdWU6IHRoaXMucmVjb3JkUmVmSWQsCiAgICAgICAgICAgICAgICBncm91cDogJ21haW4nLAogICAgICAgICAgICAgICAgb3BlcmF0aW9uOiAnRVFVQUwnLAogICAgICAgICAgICAgICAgcmVsYXRpb246ICdBTkQnCiAgICAgICAgICAgICAgfV0KICAgICAgICAgICAgfTsKICAgICAgICAgICAgdGhpcy5yZWNvcmRUYWJsZUxvYWRpbmcgPSB0cnVlOwogICAgICAgICAgICB2YXIgdXJsID0gJyR7YnBtUnVuVGltZX0vYnBtL2JvRGF0YU1vZGlmeVJlY29yZC92MS9saXN0SnNvbic7CiAgICAgICAgICAgIHJlcS5wb3N0KHVybCwgcGFyYW0pLnRoZW4oZnVuY3Rpb24gKHJlc3ApIHsKICAgICAgICAgICAgICBfdGhpczE0LnJlY29yZFRhYmxlTG9hZGluZyA9IGZhbHNlOwogICAgICAgICAgICAgIF90aGlzMTQucmVjb3JkTGlzdCA9IHJlc3AuZGF0YS5yb3dzOwogICAgICAgICAgICAgIF90aGlzMTQubW9kaWZ5UmVjb3JkLnBhZ2luYXRpb24ucGFnZUJlYW4gPSB7CiAgICAgICAgICAgICAgICBwYWdlU2l6ZTogcmVzcC5kYXRhLnBhZ2VTaXplLAogICAgICAgICAgICAgICAgcGFnZTogcmVzcC5kYXRhLnBhZ2UsCiAgICAgICAgICAgICAgICB0b3RhbDogcmVzcC5kYXRhLnRvdGFsCiAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfSk7CiAgICAgICAgICB9LAogICAgICAgICAgaGFuZGxlUmVjb3JkQ3VycmVudENoYW5nZTogZnVuY3Rpb24gaGFuZGxlUmVjb3JkQ3VycmVudENoYW5nZShpbmRleCwgbW9kaWZ5UmVjb3JkKSB7CiAgICAgICAgICAgIHZhciBfdGhpczE1ID0gdGhpczsKICAgICAgICAgICAgbW9kaWZ5UmVjb3JkLnBhZ2luYXRpb24ucGFnZUJlYW4ucGFnZSA9IGluZGV4OwogICAgICAgICAgICB2YXIgcGFyYW0gPSB7CiAgICAgICAgICAgICAgcGFnZUJlYW46IG1vZGlmeVJlY29yZC5wYWdpbmF0aW9uLnBhZ2VCZWFuLAogICAgICAgICAgICAgIHNvcnRlcjogW3sKICAgICAgICAgICAgICAgIGRpcmVjdGlvbjogJ0FTQycsCiAgICAgICAgICAgICAgICBwcm9wZXJ0eTogJ21vZGlmeVRpbWUnCiAgICAgICAgICAgICAgfV0sCiAgICAgICAgICAgICAgcXVlcnlzOiBbewogICAgICAgICAgICAgICAgcHJvcGVydHk6ICdyZWZfaWRfJywKICAgICAgICAgICAgICAgIHZhbHVlOiB0aGlzLnJlY29yZFJlZklkLAogICAgICAgICAgICAgICAgZ3JvdXA6ICdtYWluJywKICAgICAgICAgICAgICAgIG9wZXJhdGlvbjogJ0VRVUFMJywKICAgICAgICAgICAgICAgIHJlbGF0aW9uOiAnQU5EJwogICAgICAgICAgICAgIH1dCiAgICAgICAgICAgIH07CiAgICAgICAgICAgIHRoaXMucmVjb3JkVGFibGVMb2FkaW5nID0gdHJ1ZTsKICAgICAgICAgICAgdmFyIHVybCA9ICcke2JwbVJ1blRpbWV9L2JwbS9ib0RhdGFNb2RpZnlSZWNvcmQvdjEvbGlzdEpzb24nOwogICAgICAgICAgICByZXEucG9zdCh1cmwsIHBhcmFtKS50aGVuKGZ1bmN0aW9uIChyZXNwKSB7CiAgICAgICAgICAgICAgX3RoaXMxNS5yZWNvcmRUYWJsZUxvYWRpbmcgPSBmYWxzZTsKICAgICAgICAgICAgICBfdGhpczE1LnJlY29yZExpc3QgPSByZXNwLmRhdGEucm93czsKICAgICAgICAgICAgICBfdGhpczE1Lm1vZGlmeVJlY29yZC5wYWdpbmF0aW9uLnBhZ2VCZWFuID0gewogICAgICAgICAgICAgICAgcGFnZVNpemU6IHJlc3AuZGF0YS5wYWdlU2l6ZSwKICAgICAgICAgICAgICAgIHBhZ2U6IHJlc3AuZGF0YS5wYWdlLAogICAgICAgICAgICAgICAgdG90YWw6IHJlc3AuZGF0YS50b3RhbAogICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0pOwogICAgICAgICAgfSwKICAgICAgICAgIC8v5Y+W5raI5L+u5pS56K6w5b2V5a+56K+d5qGGCiAgICAgICAgICByZWNvcmRDYW5jZWw6IGZ1bmN0aW9uIHJlY29yZENhbmNlbCgpIHsKICAgICAgICAgICAgdGhpcy5kaWFsb2dSZWNvcmRWaXNpYmxlID0gZmFsc2U7CiAgICAgICAgICAgIHRoaXMucmVjb3JkTGlzdCA9IFtdOwogICAgICAgICAgICB0aGlzLnJlY29yZFJlZklkID0gJyc7CiAgICAgICAgICAgIHRoaXMubW9kaWZ5UmVjb3JkID0gewogICAgICAgICAgICAgIHBhZ2luYXRpb246IHsKICAgICAgICAgICAgICAgIHBhZ2VCZWFuOiB7CiAgICAgICAgICAgICAgICAgIHBhZ2U6IDEsCiAgICAgICAgICAgICAgICAgIHBhZ2VTaXplOiAyMCwKICAgICAgICAgICAgICAgICAgdG90YWw6IDAKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH07CiAgICAgICAgICB9LAogICAgICAgICAgLy8KICAgICAgICAgIG9wZW5Nb2RpZnlEZXRhaWw6IGZ1bmN0aW9uIG9wZW5Nb2RpZnlEZXRhaWwocm93KSB7CiAgICAgICAgICAgIHRoaXMuY3VycmVudE1vZGlmeSA9IHJvdzsKICAgICAgICAgICAgdGhpcy5tb2RpZnlEZXRhaWxEaWFsb2dWaXNpYmxlID0gdHJ1ZTsKICAgICAgICAgIH0sCiAgICAgICAgICAvL+afpeeci+S/ruaUueiusOW9leivpuaDhQogICAgICAgICAgc2hvd01vZGlmeVJlY29yZDogZnVuY3Rpb24gc2hvd01vZGlmeVJlY29yZChpZCwgcmVmSWQpIHsKICAgICAgICAgICAgdmFyIHVybCA9ICcvc3RhdGVtZW50L3RlbXBsYXRlL2Zvcm0vJyArIHRoaXMudGVtcGxhdGVLZXkgKyAnL2dldC90cnVlJyArICc/aWQ9JyArIHJlZklkICsgJyZzdGFydEZsb3c9ZmFsc2UmcmVjb3JkSWQ9JyArIGlkICsgJyZpc05ld1BhZ2U9dHJ1ZSc7CiAgICAgICAgICAgIHdpbmRvdy5vcGVuKHRoaXMuJHJvdXRlci5yZXNvbHZlKHVybCkuaHJlZiwgJ19ibGFuaycpOwogICAgICAgICAgfSwKICAgICAgICAgIC8v56Gu5a6a5a+85Ye6CiAgICAgICAgICBzdWJtaXRFeHBvcnQ6IGZ1bmN0aW9uIHN1Ym1pdEV4cG9ydCgpIHsKICAgICAgICAgICAgaWYgKCF0aGlzLmV4cG9ydERhdGEgfHwgdGhpcy5leHBvcnREYXRhLmV4cEZpZWxkLmxlbmd0aCA8IDEpIHsKICAgICAgICAgICAgICB0aGlzLiRtZXNzYWdlKHsKICAgICAgICAgICAgICAgIHR5cGU6ICdpbmZvJywKICAgICAgICAgICAgICAgIG1lc3NhZ2U6ICfor7fpgInmi6nopoHlr7zlh7rnmoTlrZfmrrXvvIEnCiAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICh0aGlzLmV4cG9ydFR5cGUgPT09ICdtYWluJykgdGhpcy5leHBvcnRNYWluKCk7ZWxzZSB0aGlzLmV4cG9ydFN1YkRhdGEodGhpcy5leHBvcnREYXRhLmV4cEZpZWxkLCB0aGlzLnJlZklkLCB0aGlzLmN1cnJlbnRUYWIuZW50TmFtZSk7CiAgICAgICAgICB9LAogICAgICAgICAgZXhwb3J0TWFpbjogZnVuY3Rpb24gZXhwb3J0TWFpbigpIHsKICAgICAgICAgICAgdmFyIF90aGlzMTYgPSB0aGlzOwogICAgICAgICAgICB2YXIgZXhwRmllbGQgPSAnJzsKICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmV4cG9ydERhdGEuZXhwRmllbGQubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICBpZiAoaSA+IDApIHsKICAgICAgICAgICAgICAgIGV4cEZpZWxkICs9ICcsJzsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgZXhwRmllbGQgKz0gdGhpcy5leHBvcnREYXRhLmV4cEZpZWxkW2ldLm5hbWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZXhwRmllbGQgPSBCYXNlNjQuZW5jb2RlKGV4cEZpZWxkKTsKICAgICAgICAgICAgdmFyIGRhdGEgPSB7CiAgICAgICAgICAgICAgYm9BbGlhczogdGhpcy50ZW1wbGF0ZUluZm8uYWxpYXMsCiAgICAgICAgICAgICAgZ2V0VHlwZTogdGhpcy5leHBvcnREYXRhLmdldFR5cGUsCiAgICAgICAgICAgICAgZXhwRmllbGQ6IGV4cEZpZWxkLAogICAgICAgICAgICAgIGZpbHRlcktleTogJycKICAgICAgICAgICAgfTsKICAgICAgICAgICAgZGF0YS5xdWVyeSA9IHRoaXMuZ2V0UXVlcnlGaWx0ZXIoKS5wYWdpbmF0aW9uOwogICAgICAgICAgICBpZiAodGhpcy5kYXRhVmlldyAmJiB0aGlzLmRhdGFWaWV3LmJpbmRTZWxlY3RkKSB7CiAgICAgICAgICAgICAgZGF0YS5xdWVyeS5xdWVyeXMucHVzaCh7CiAgICAgICAgICAgICAgICB2YWx1ZTogdGhpcy5kYXRhVmlldy5zZWxlY3RWYWx1ZSwKICAgICAgICAgICAgICAgIG9wZXJhdGlvbjogJ0VRVUFMJywKICAgICAgICAgICAgICAgIHByb3BlcnR5OiAnRl8nICsgdGhpcy5kYXRhVmlldy5iaW5kU2VsZWN0ZAogICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHZhciBsb2FkaW5nSW5zdGFuY2UgPSBMb2FkaW5nLnNlcnZpY2UoewogICAgICAgICAgICAgIGZ1bGxzY3JlZW46IHRydWUKICAgICAgICAgICAgfSk7IC8v5byA5aeLCiAgICAgICAgICAgIHRoaXMuJHN0b3JlLmRpc3BhdGNoKCdmb3JtL3RlbXBsYXRlRXhwb3J0JywgZGF0YSkudGhlbihmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgbG9hZGluZ0luc3RhbmNlLmNsb3NlKCk7IC8vIOe7k+adnwogICAgICAgICAgICAgIF90aGlzMTYuZGlhbG9nRXhwb3J0VmlzaWJsZSA9IGZhbHNlOwogICAgICAgICAgICB9KTsKICAgICAgICAgICAgZm9yICh2YXIgX2kgPSAwOyBfaSA8IHRoaXMuc3ViRGlzcGxheUZpZWxkc0xpc3QubGVuZ3RoOyBfaSsrKSB7CiAgICAgICAgICAgICAgdGhpcy5leHBvcnRTdWJEYXRhKHRoaXMuJHJlZnNbJ3N1YkV4cG9ydFRhYmxlJ11bX2ldLnNlbGVjdGlvbiwgJycsIHRoaXMuc3ViRGlzcGxheUZpZWxkc0xpc3RbX2ldLm5hbWUpOwogICAgICAgICAgICAgIHRoaXMuJHNldCh0aGlzLiRyZWZzWydzdWJFeHBvcnRUYWJsZSddW19pXSwgJ3NlbGVjdGlvbicsIFtdKTsKICAgICAgICAgICAgfQogICAgICAgICAgfSwKICAgICAgICAgIGV4cG9ydFN1YkRhdGE6IGZ1bmN0aW9uIGV4cG9ydFN1YkRhdGEoZXhwRmllbGRzLCByZWZJZCwgYWxpYXMpIHsKICAgICAgICAgICAgdmFyIF90aGlzMTcgPSB0aGlzOwogICAgICAgICAgICB2YXIgZXhwRmllbGQgPSBbXTsKICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBleHBGaWVsZHMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICBleHBGaWVsZC5wdXNoKHsKICAgICAgICAgICAgICAgIGtleTogZXhwRmllbGRzW2ldLm5hbWUsCiAgICAgICAgICAgICAgICB2YWx1ZTogZXhwRmllbGRzW2ldLmRlc2MKICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQogICAgICAgICAgICB2YXIgZGF0YSA9IHsKICAgICAgICAgICAgICBhbGlhczogYWxpYXMsCiAgICAgICAgICAgICAgcmVmSWQ6IHJlZklkLAogICAgICAgICAgICAgIHR5cGU6IHRoaXMuZXhwb3J0RGF0YS5nZXRUeXBlLAogICAgICAgICAgICAgIGV4cEZpZWxkOiBKU09OLnN0cmluZ2lmeShleHBGaWVsZCksCiAgICAgICAgICAgICAgZmlsdGVyS2V5OiAnJwogICAgICAgICAgICB9OwogICAgICAgICAgICBkYXRhLnF1ZXJ5RmlsdGVyID0gdGhpcy5jdXJyZW50VGFiLnBhZ2luYXRpb247CiAgICAgICAgICAgIHZhciBsb2FkaW5nSW5zdGFuY2UgPSBMb2FkaW5nLnNlcnZpY2UoewogICAgICAgICAgICAgIGZ1bGxzY3JlZW46IHRydWUKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIGZvcm0uc3ViRXhwb3J0KGRhdGEsIGZ1bmN0aW9uIChyZXNwKSB7CiAgICAgICAgICAgICAgbG9hZGluZ0luc3RhbmNlLmNsb3NlKCk7CiAgICAgICAgICAgICAgX3RoaXMxNy5kaWFsb2dFeHBvcnRWaXNpYmxlID0gZmFsc2U7CiAgICAgICAgICAgIH0pOwogICAgICAgICAgfSwKICAgICAgICAgIC8v5Y+W5raI5a+85Ye6CiAgICAgICAgICBleHBvcnRDYW5jZWw6IGZ1bmN0aW9uIGV4cG9ydENhbmNlbCgpIHsKICAgICAgICAgICAgdGhpcy5kaWFsb2dFeHBvcnRWaXNpYmxlID0gZmFsc2U7CiAgICAgICAgICAgIHRoaXMuZXhwb3J0RGF0YS5leHBGaWVsZCA9IFtdOwogICAgICAgICAgfSwKICAgICAgICAgIC8v5Y+W5raI5a2Q6KGo5a+56K+d5qGGCiAgICAgICAgICBzdWJDYW5jZWw6IGZ1bmN0aW9uIHN1YkNhbmNlbCgpIHsKICAgICAgICAgICAgdGhpcy5kaWFsb2dTdWJWaXNpYmxlID0gZmFsc2U7CiAgICAgICAgICAgIHRoaXMudGFicyA9IFtdOwogICAgICAgICAgICB0aGlzLmVudHMgPSBbXTsKICAgICAgICAgIH0sCiAgICAgICAgICBzdW5DYW5jZWw6IGZ1bmN0aW9uIHN1bkNhbmNlbCgpIHsKICAgICAgICAgICAgdGhpcy5kaWFsb2dTdW5WaXNpYmxlID0gZmFsc2U7CiAgICAgICAgICAgIHRoaXMuc3VuVGFicyA9IFtdOwogICAgICAgICAgfSwKICAgICAgICAgIGhhbmRsZUV4cG9ydFNlbGVjdGlvbkNoYW5nZTogZnVuY3Rpb24gaGFuZGxlRXhwb3J0U2VsZWN0aW9uQ2hhbmdlKHZhbCkgewogICAgICAgICAgICB0aGlzLmV4cG9ydERhdGEuZXhwRmllbGQgPSBbXTsKICAgICAgICAgICAgaWYgKHZhbCkgewogICAgICAgICAgICAgIHRoaXMuZXhwb3J0RGF0YS5leHBGaWVsZCA9IHZhbDsKICAgICAgICAgICAgfQogICAgICAgICAgfSwKICAgICAgICAgIC8v5YWo6YCJCiAgICAgICAgICBoYW5kbGVFeHBvcnRTZWxlY3RBbGw6IGZ1bmN0aW9uIGhhbmRsZUV4cG9ydFNlbGVjdEFsbCgpIHsKICAgICAgICAgICAgdGhpcy5leHBvcnREYXRhLmV4cEZpZWxkID0gdGhpcy5kaXNwbGF5RmllbGRzOwogICAgICAgICAgfSwKICAgICAgICAgIC8v5o6S5bqPCiAgICAgICAgICBzb3J0OiBmdW5jdGlvbiBzb3J0KGluZGV4LCB0eXBlKSB7CiAgICAgICAgICAgIGlmICgndXAnID09IHR5cGUpIHsKICAgICAgICAgICAgICBpZiAoaW5kZXggPT09IDApIHsKICAgICAgICAgICAgICAgIHRoaXMuJG1lc3NhZ2UoewogICAgICAgICAgICAgICAgICBtZXNzYWdlOiAn5bey57uP5piv5YiX6KGo5Lit56ys5LiA5L2NJywKICAgICAgICAgICAgICAgICAgdHlwZTogJ3dhcm5pbmcnCiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgdmFyIHRlbXAgPSB0aGlzLmRpc3BsYXlGaWVsZHNbaW5kZXggLSAxXTsKICAgICAgICAgICAgICAgIHRoaXMuJHNldCh0aGlzLmRpc3BsYXlGaWVsZHMsIGluZGV4IC0gMSwgdGhpcy5kaXNwbGF5RmllbGRzW2luZGV4XSk7CiAgICAgICAgICAgICAgICB0aGlzLiRzZXQodGhpcy5kaXNwbGF5RmllbGRzLCBpbmRleCwgdGVtcCk7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgIGlmIChpbmRleCA9PT0gdGhpcy5kaXNwbGF5RmllbGRzLmxlbmd0aCAtIDEpIHsKICAgICAgICAgICAgICAgIHRoaXMuJG1lc3NhZ2UoewogICAgICAgICAgICAgICAgICBtZXNzYWdlOiAn5bey57uP5piv5YiX6KGo5Lit5pyA5ZCO5LiA5L2NJywKICAgICAgICAgICAgICAgICAgdHlwZTogJ3dhcm5pbmcnCiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgdGhpcy5pc1RyYW5zaXRpb24gPSB0cnVlOwogICAgICAgICAgICAgICAgdmFyIGkgPSB0aGlzLmRpc3BsYXlGaWVsZHNbaW5kZXggKyAxXTsKICAgICAgICAgICAgICAgIHRoaXMuJHNldCh0aGlzLmRpc3BsYXlGaWVsZHMsIGluZGV4ICsgMSwgdGhpcy5kaXNwbGF5RmllbGRzW2luZGV4XSk7CiAgICAgICAgICAgICAgICB0aGlzLiRzZXQodGhpcy5kaXNwbGF5RmllbGRzLCBpbmRleCwgaSk7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICB9LAogICAgICAgICAgZ2V0U3VuRGF0YTogZnVuY3Rpb24gZ2V0U3VuRGF0YSh0YWIsIHJvdykgewogICAgICAgICAgICB2YXIgX3RoaXMxOCA9IHRoaXM7CiAgICAgICAgICAgIHJldHVybiBfYXN5bmNUb0dlbmVyYXRvcigvKiNfX1BVUkVfXyovcmVnZW5lcmF0b3JSdW50aW1lLm1hcmsoZnVuY3Rpb24gX2NhbGxlZSgpIHsKICAgICAgICAgICAgICB2YXIgZW50cywgcGssIHJlZklkLCBpLCBfdGFiOwogICAgICAgICAgICAgIHJldHVybiByZWdlbmVyYXRvclJ1bnRpbWUud3JhcChmdW5jdGlvbiBfY2FsbGVlJChfY29udGV4dCkgewogICAgICAgICAgICAgICAgd2hpbGUgKDEpIHN3aXRjaCAoX2NvbnRleHQucHJldiA9IF9jb250ZXh0Lm5leHQpIHsKICAgICAgICAgICAgICAgICAgY2FzZSAwOgogICAgICAgICAgICAgICAgICAgIGVudHMgPSB0YWIuY2hpbGRFbnRzOwogICAgICAgICAgICAgICAgICAgIHBrID0gdGFiLnBrS2V5OwogICAgICAgICAgICAgICAgICAgIHJlZklkID0gJyc7CiAgICAgICAgICAgICAgICAgICAgaWYgKHJvd1tway50b0xvY2FsZUxvd2VyQ2FzZSgpXSkgewogICAgICAgICAgICAgICAgICAgICAgcmVmSWQgPSByb3dbcGsudG9Mb2NhbGVMb3dlckNhc2UoKV07CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgIHJlZklkID0gcm93W3BrLnRvVXBwZXJDYXNlKCldOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBfdGhpczE4LnN1YlRhYmxlTG9hZGluZyA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgaWYgKCEoZW50cyAmJiBlbnRzLmxlbmd0aCA+IDApKSB7CiAgICAgICAgICAgICAgICAgICAgICBfY29udGV4dC5uZXh0ID0gMTU7CiAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaSA9IDA7CiAgICAgICAgICAgICAgICAgIGNhc2UgNzoKICAgICAgICAgICAgICAgICAgICBpZiAoIShpIDwgZW50cy5sZW5ndGgpKSB7CiAgICAgICAgICAgICAgICAgICAgICBfY29udGV4dC5uZXh0ID0gMTU7CiAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgX2NvbnRleHQubmV4dCA9IDEwOwogICAgICAgICAgICAgICAgICAgIHJldHVybiBfdGhpczE4LmdldEJvRGF0YShlbnRzW2ldLCByZWZJZCk7CiAgICAgICAgICAgICAgICAgIGNhc2UgMTA6CiAgICAgICAgICAgICAgICAgICAgX3RhYiA9IF9jb250ZXh0LnNlbnQ7CiAgICAgICAgICAgICAgICAgICAgX3RoaXMxOC5zdW5UYWJzLnB1c2goX3RhYik7CiAgICAgICAgICAgICAgICAgIGNhc2UgMTI6CiAgICAgICAgICAgICAgICAgICAgaSsrOwogICAgICAgICAgICAgICAgICAgIF9jb250ZXh0Lm5leHQgPSA3OwogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICBjYXNlIDE1OgogICAgICAgICAgICAgICAgICAgIF90aGlzMTguc3ViVGFibGVMb2FkaW5nID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgX3RoaXMxOC5kaWFsb2dTdW5WaXNpYmxlID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgY2FzZSAxNzoKICAgICAgICAgICAgICAgICAgY2FzZSAiZW5kIjoKICAgICAgICAgICAgICAgICAgICByZXR1cm4gX2NvbnRleHQuc3RvcCgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH0sIF9jYWxsZWUpOwogICAgICAgICAgICB9KSkoKTsKICAgICAgICAgIH0sCiAgICAgICAgICBnZXRCb0RhdGE6IGZ1bmN0aW9uIGdldEJvRGF0YShlbnQsIHJlZklkKSB7CiAgICAgICAgICAgIHZhciBfdGhpczE5ID0gdGhpczsKICAgICAgICAgICAgdmFyIGF0dHJpYnV0ZUxpc3QgPSBlbnQuYXR0cmlidXRlTGlzdDsKICAgICAgICAgICAgdmFyIHRhYiA9IHsKICAgICAgICAgICAgICByZWZJZDogcmVmSWQsCiAgICAgICAgICAgICAgcGtLZXk6IGVudC5wa0tleSwKICAgICAgICAgICAgICBuYW1lOiBlbnQudGFibGVOYW1lLAogICAgICAgICAgICAgIGVudE5hbWU6IGVudC5uYW1lLAogICAgICAgICAgICAgIHRpdGxlOiBlbnQuY29tbWVudCwKICAgICAgICAgICAgICBhdHRyaWJ1dGVMaXN0OiBhdHRyaWJ1dGVMaXN0LAogICAgICAgICAgICAgIGNvbW1lbnQ6IGVudC5jb21tZW50LAogICAgICAgICAgICAgIHBhZ2luYXRpb246IHsKICAgICAgICAgICAgICAgIHBhZ2VCZWFuOiB7CiAgICAgICAgICAgICAgICAgIHBhZ2VTaXplOiAyMCwKICAgICAgICAgICAgICAgICAgcGFnZTogMSwKICAgICAgICAgICAgICAgICAgdG90YWw6IDAKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH07CiAgICAgICAgICAgIHRhYi5jaGlsZEVudHMgPSBbXTsKICAgICAgICAgICAgaWYgKGVudC5jaGlsZEVudHMgJiYgZW50LmNoaWxkRW50cy5sZW5ndGggPiAwKSB7CiAgICAgICAgICAgICAgdGFiLmNoaWxkRW50cyA9IGVudC5jaGlsZEVudHM7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHsKICAgICAgICAgICAgICBfdGhpczE5LiRzdG9yZS5kaXNwYXRjaCgnZm9ybS9nZXRTdWJEYXRhUGFnaW5hdGlvbicsIHsKICAgICAgICAgICAgICAgIHBhZ2luYXRpb246IHRhYi5wYWdpbmF0aW9uLAogICAgICAgICAgICAgICAgbmFtZTogZW50Lm5hbWUsCiAgICAgICAgICAgICAgICByZWZJZDogcmVmSWQKICAgICAgICAgICAgICB9KS50aGVuKGZ1bmN0aW9uIChkYXRhKSB7CiAgICAgICAgICAgICAgICBpZiAoZGF0YSAmJiBkYXRhLnJvd3MubGVuZ3RoID4gMCkgewogICAgICAgICAgICAgICAgICB0YWIuZGF0YUxpc3QgPSBkYXRhLnJvd3M7CiAgICAgICAgICAgICAgICAgIHRhYi5wYWdpbmF0aW9uLnBhZ2VCZWFuLnBhZ2VTaXplID0gZGF0YS5wYWdlU2l6ZTsKICAgICAgICAgICAgICAgICAgdGFiLnBhZ2luYXRpb24ucGFnZUJlYW4ucGFnZSA9IGRhdGEucGFnZTsKICAgICAgICAgICAgICAgICAgdGFiLnBhZ2luYXRpb24ucGFnZUJlYW4udG90YWwgPSBkYXRhLnRvdGFsOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgdGFiLmRhdGFMaXN0ID0gW107CiAgICAgICAgICAgICAgICAgIHRhYi5wYWdpbmF0aW9uLnBhZ2VCZWFuLnBhZ2VTaXplID0gMTsKICAgICAgICAgICAgICAgICAgdGFiLnBhZ2luYXRpb24ucGFnZUJlYW4ucGFnZSA9IDE7CiAgICAgICAgICAgICAgICAgIHRhYi5wYWdpbmF0aW9uLnBhZ2VCZWFuLnRvdGFsID0gMDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHJlc29sdmUodGFiKTsKICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfSk7CiAgICAgICAgICB9LAogICAgICAgICAgZ2V0U3ViRW50c0J5Rm9ybUtleTogZnVuY3Rpb24gZ2V0U3ViRW50c0J5Rm9ybUtleShyZWZJZCkgewogICAgICAgICAgICAvKmlmICghdGhpcy5lbnRzIHx8IHRoaXMuZW50cy5sZW5ndGggPCAxKSB7DQogICAgICAgICAgICAgIGZvcm0uZ2V0U3ViRW50c0J5Rm9ybUtleSh0aGlzLnRlbXBsYXRlSW5mby5mb3JtS2V5LCAocmVzcCkgPT4gew0KICAgICAgICAgICAgICAgIC8vIOWtkOihqOS4juWtmeihqOWtl+auteWQjeiuvue9ruWwj+WGmQ0KICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcmVzcC5kYXRhLmxlbmd0aDsgaSsrKSB7DQogICAgICAgICAgICAgICAgICByZXNwLmRhdGFbaV0uYXR0cmlidXRlTGlzdC5mb3JFYWNoKGF0dHJpYnV0ZSA9PiB7DQogICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZS5maWVsZE5hbWUgPSBhdHRyaWJ1dGUuZmllbGROYW1lLnRvTG93ZXJDYXNlKCk7DQogICAgICAgICAgICAgICAgICB9KQ0KICAgICAgICAgICAgICAgICAgcmVzcC5kYXRhW2ldLmNoaWxkRW50cy5mb3JFYWNoKHNob3dDaGlsZEVudCA9PiB7DQogICAgICAgICAgICAgICAgICAgIHNob3dDaGlsZEVudC5hdHRyaWJ1dGVMaXN0LmZvckVhY2goYXR0cmlidXRlID0+IHsNCiAgICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGUuZmllbGROYW1lID0gYXR0cmlidXRlLmZpZWxkTmFtZS50b0xvd2VyQ2FzZSgpOw0KICAgICAgICAgICAgICAgICAgICB9KQ0KICAgICAgICAgICAgICAgICAgfSkNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgdGhpcy5lbnRzID0gcmVzcC5kYXRhOw0KICAgICAgICAgICAgICB9KTsNCiAgICAgICAgICAgIH0gZWxzZSB7Ki8KICAgICAgICAgICAgdGhpcy5nZXRTdWJEYXRhKHRoaXMsIHJlZklkKTsKICAgICAgICAgICAgLyogfSovCiAgICAgICAgICB9LAogICAgICAgICAgZ2V0U3ViRGF0YTogZnVuY3Rpb24gZ2V0U3ViRGF0YShfbWUsIHJlZklkKSB7CiAgICAgICAgICAgIHZhciBfdGhpczIwID0gdGhpczsKICAgICAgICAgICAgcmV0dXJuIF9hc3luY1RvR2VuZXJhdG9yKC8qI19fUFVSRV9fKi9yZWdlbmVyYXRvclJ1bnRpbWUubWFyayhmdW5jdGlvbiBfY2FsbGVlMigpIHsKICAgICAgICAgICAgICB2YXIgZW50cywgaSwgdGFiOwogICAgICAgICAgICAgIHJldHVybiByZWdlbmVyYXRvclJ1bnRpbWUud3JhcChmdW5jdGlvbiBfY2FsbGVlMiQoX2NvbnRleHQyKSB7CiAgICAgICAgICAgICAgICB3aGlsZSAoMSkgc3dpdGNoIChfY29udGV4dDIucHJldiA9IF9jb250ZXh0Mi5uZXh0KSB7CiAgICAgICAgICAgICAgICAgIGNhc2UgMDoKICAgICAgICAgICAgICAgICAgICAvL2xldCBlbnRzID0gdGhpcy5lbnRzOwogICAgICAgICAgICAgICAgICAgIGVudHMgPSBKU09OLnBhcnNlKF9tZS50ZW1wbGF0ZUluZm8uc3ViRmllbGQpOwogICAgICAgICAgICAgICAgICAgIGlmICghKGVudHMgJiYgZW50cy5sZW5ndGggPiAwKSkgewogICAgICAgICAgICAgICAgICAgICAgX2NvbnRleHQyLm5leHQgPSAxMzsKICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpID0gMDsKICAgICAgICAgICAgICAgICAgY2FzZSAzOgogICAgICAgICAgICAgICAgICAgIGlmICghKGkgPCBlbnRzLmxlbmd0aCkpIHsKICAgICAgICAgICAgICAgICAgICAgIF9jb250ZXh0Mi5uZXh0ID0gMTM7CiAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZW50c1tpXS5hdHRyaWJ1dGVMaXN0LmZvckVhY2goZnVuY3Rpb24gKGF0dHIpIHsKICAgICAgICAgICAgICAgICAgICAgIGF0dHIuZmllbGROYW1lID0gYXR0ci5maWVsZE5hbWUudG9Mb3dlckNhc2UoKTsKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICBlbnRzW2ldLmNoaWxkRW50cy5mb3JFYWNoKGZ1bmN0aW9uIChzaG93Q2hpbGRFbnQpIHsKICAgICAgICAgICAgICAgICAgICAgIHNob3dDaGlsZEVudC5hdHRyaWJ1dGVMaXN0LmZvckVhY2goZnVuY3Rpb24gKGF0dHJpYnV0ZSkgewogICAgICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGUuZmllbGROYW1lID0gYXR0cmlidXRlLmZpZWxkTmFtZS50b0xvd2VyQ2FzZSgpOwogICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgX2NvbnRleHQyLm5leHQgPSA4OwogICAgICAgICAgICAgICAgICAgIHJldHVybiBfdGhpczIwLmdldEJvRGF0YShlbnRzW2ldLCByZWZJZCk7CiAgICAgICAgICAgICAgICAgIGNhc2UgODoKICAgICAgICAgICAgICAgICAgICB0YWIgPSBfY29udGV4dDIuc2VudDsKICAgICAgICAgICAgICAgICAgICBfdGhpczIwLnRhYnMucHVzaCh0YWIpOwogICAgICAgICAgICAgICAgICBjYXNlIDEwOgogICAgICAgICAgICAgICAgICAgIGkrKzsKICAgICAgICAgICAgICAgICAgICBfY29udGV4dDIubmV4dCA9IDM7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgIGNhc2UgMTM6CiAgICAgICAgICAgICAgICAgICAgX3RoaXMyMC5kaWFsb2dTdWJWaXNpYmxlID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgY2FzZSAxNDoKICAgICAgICAgICAgICAgICAgY2FzZSAiZW5kIjoKICAgICAgICAgICAgICAgICAgICByZXR1cm4gX2NvbnRleHQyLnN0b3AoKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB9LCBfY2FsbGVlMik7CiAgICAgICAgICAgIH0pKSgpOwogICAgICAgICAgfSwKICAgICAgICAgIG5vZGVDbGljazogZnVuY3Rpb24gbm9kZUNsaWNrKG5vZGUpIHsKICAgICAgICAgICAgdmFyIGxvYWRpbmcgPSB0aGlzLiRsb2FkaW5nKHRoaXMub3B0aW9ucyk7CiAgICAgICAgICAgIC8vIHRoaXMuJHN0b3JlLmRpc3BhdGNoKCJmb3JtL3NldEJwbVRlbXBsYXRlUGFnaW5hdGlvblBhZ2VOdW0iLCAxKTsKICAgICAgICAgICAgdGhpcy5wYWdpbmF0aW9uLnBhZ2UgPSAxOwogICAgICAgICAgICAvL+avj+asoeeCueWHu+i/h+a7pOagkSzlupTor6Xmiorlj7PovrnnmoR0YWJsZSDkuI7liIbpobXlhajpg6jph43nva7kuLrliJ3lp4sKCiAgICAgICAgICAgIHZhciBwYWdlQmVhbiA9IHsKICAgICAgICAgICAgICBwYWdlQmVhbjogewogICAgICAgICAgICAgICAgcGFnZTogMSwKICAgICAgICAgICAgICAgIHBhZ2VTaXplOiB0aGlzLnBhZ2luYXRpb24ucGFnZVNpemUKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH07CiAgICAgICAgICAgIHBhZ2VCZWFuLnF1ZXJ5cyA9IFtdOwogICAgICAgICAgICBpZiAoIW5vZGUuaWQgfHwgbm9kZS5pZCAhPSAtMSkgewogICAgICAgICAgICAgIHZhciB0cmVlRmllbGQgPSBKU09OLnBhcnNlKHRoaXMudGVtcGxhdGVJbmZvLnRyZWVGaWVsZCk7CiAgICAgICAgICAgICAgdHJlZUZpZWxkLnF1ZXJ5cy5mb3JFYWNoKGZ1bmN0aW9uIChpdGVtKSB7CiAgICAgICAgICAgICAgICBpZiAoaXRlbS5rZXlfICYmIGl0ZW0udmFsdWVfKSB7CiAgICAgICAgICAgICAgICAgIHBhZ2VCZWFuLnF1ZXJ5cy5wdXNoKHsKICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eTogJyRUUkVFJCcgKyBpdGVtLmtleV8sCiAgICAgICAgICAgICAgICAgICAgdmFsdWU6IG5vZGVbaXRlbS52YWx1ZV9dLAogICAgICAgICAgICAgICAgICAgIGdyb3VwOiAnbWFpbicsCiAgICAgICAgICAgICAgICAgICAgb3BlcmF0aW9uOiAnRVFVQUwnLAogICAgICAgICAgICAgICAgICAgIHJlbGF0aW9uOiAnQU5EJwogICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQogICAgICAgICAgICAvL+aKiui/h+a7pOagkeeahOafpeivouadoeS7tuWtmOS4gOS7vei1t+adpSzlj7PovrnnmoTmkJzntKLkuI7liIbpobXmiY3og73lkIzml7bkvb/nlKgKICAgICAgICAgICAgdGhpcy50cmVlUXVlcnlzID0gcGFnZUJlYW4ucXVlcnlzOwogICAgICAgICAgICB2YXIgcGFyYW1zID0gewogICAgICAgICAgICAgIHRlbXBsYXRlSWQ6IHRoaXMudGVtcGxhdGVJbmZvLmlkLAogICAgICAgICAgICAgIHBhZ2luYXRpb246IHBhZ2VCZWFuCiAgICAgICAgICAgIH07CiAgICAgICAgICAgIHRoaXMucmVzZXQodHJ1ZSk7CiAgICAgICAgICAgIC8v5pWw5o2u6KeG5Zu+5o6n5Lu2CiAgICAgICAgICAgIGlmICh0aGlzLmRhdGFWaWV3KSB7CiAgICAgICAgICAgICAgaWYgKHRoaXMuZGF0YVZpZXcuc2VsZWN0TGlzdCAmJiB0aGlzLmRhdGFWaWV3LnNlbGVjdExpc3QubGVuZ3RoID4gMCkgewogICAgICAgICAgICAgICAgcGFyYW1zLnNlbGVjdExpc3QgPSB0aGlzLmRhdGFWaWV3LnNlbGVjdExpc3Q7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIHZhciB0aGlzXyA9IHRoaXM7CiAgICAgICAgICAgIGlmICh0aGlzXy5pc0pvaW5GbG93KSB7CiAgICAgICAgICAgICAgcGFyYW1zLmlzSm9pbkZsb3cgPSB0cnVlOwogICAgICAgICAgICAgIHBhcmFtcy50YXNrVHlwZSA9IHRoaXNfLnRhc2tUeXBlOwogICAgICAgICAgICAgIHBhcmFtcy5kZWZLZXkgPSB0aGlzXy5kZWZLZXk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdGhpcy4kc3RvcmUuZGlzcGF0Y2goJ2Zvcm0vZ2V0QnBtVGVtcGxhdGVCeVBhZ2luYXRpb24nLCBwYXJhbXMpLnRoZW4oZnVuY3Rpb24gKHJlc3BvbnNlKSB7CiAgICAgICAgICAgICAgdGhpc18ucm93cyA9IHJlc3BvbnNlLmRhdGEucm93czsKICAgICAgICAgICAgICB0aGlzXy50b3RhbCA9IHJlc3BvbnNlLmRhdGEudG90YWw7CiAgICAgICAgICAgICAgdGhpc18ucGFnaW5hdGlvbi5wYWdlID0gcmVzcG9uc2UuZGF0YS5wYWdlOwogICAgICAgICAgICAgIHRoaXNfLnBhZ2luYXRpb24ucGFnZVNpemUgPSByZXNwb25zZS5kYXRhLnBhZ2VTaXplOwogICAgICAgICAgICAgIGxvYWRpbmcuY2xvc2UoKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgICB9LAogICAgICAgICAgLy/liqDovb3moJHnmoTkv6Hmga8KICAgICAgICAgIHRvVHJlZURhdGE6IGZ1bmN0aW9uIHRvVHJlZURhdGEoZGF0YSwgaWQsIHBpZCwgbmFtZSwgcHZhbHVlKSB7CiAgICAgICAgICAgIC8vIOW7uueri+S4quagkeW9oue7k+aehCzpnIDopoHlrprkuYnkuKrmnIDpobblsYLnmoTniLboioLngrnvvIxwdmFsdWXmmK8wCiAgICAgICAgICAgIHZhciBwYXJlbnRzID0gZGF0YS5maWx0ZXIoZnVuY3Rpb24gKHZhbHVlKSB7CiAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlW2lkXSA9PSB2YWx1ZVtwaWRdIHx8IHZhbHVlW3BpZF0gPT0gbnVsbCB8fCB2YWx1ZVtwaWRdID09IHB2YWx1ZTsKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIGlmICghcGFyZW50cykgewogICAgICAgICAgICAgIHBhcmVudHMgPSBkYXRhLmZpbHRlcihmdW5jdGlvbiAodmFsdWUpIHsKICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZVtwaWRdICE9PSAndW5kZWZpbmVkJyAmJiB2YWx1ZVtwaWRdICE9IG51bGwgJiYgdmFsdWVbaWRdICE9IHZhbHVlW3BpZF07CiAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIHBhcmVudHM7CiAgICAgICAgICB9LAogICAgICAgICAgLy/liJ3lp4vljJbmoJEKICAgICAgICAgIGluaXRUcmVlOiBmdW5jdGlvbiBpbml0VHJlZSh0cmVlRmllbGQpIHsKICAgICAgICAgICAgdmFyIHRoaXNfID0gdGhpczsKICAgICAgICAgICAgZm9ybS5nZXRCeUFsaWFzKHRyZWVGaWVsZC5hbGlhcywgZnVuY3Rpb24gKHJlcykgewogICAgICAgICAgICAgIHRoaXNfLmN1c3RvbURpYWxvZyA9IHJlczsKICAgICAgICAgICAgICBkaWFsb2cuZ2V0VHJlZURhdGEoewogICAgICAgICAgICAgICAgcmVxdWVzdFR5cGU6ICdHRVQnLAogICAgICAgICAgICAgICAgdXJsOiAnJHtmb3JtfS9mb3JtL2N1c3RvbURpYWxvZy92MS9nZXRUcmVlRGF0YT9hbGlhcz0nICsgdHJlZUZpZWxkLmFsaWFzICsgJyZtYXBQYXJhbT0nCiAgICAgICAgICAgICAgfSwgZnVuY3Rpb24gKHJlc3ApIHsKICAgICAgICAgICAgICAgIGlmICh0aGlzXy5jdXN0b21EaWFsb2cuZGlzcGxheWZpZWxkKSB7CiAgICAgICAgICAgICAgICAgIHZhciBkaXNwbGF5ZmllbGQgPSBKU09OLnBhcnNlKHRoaXNfLmN1c3RvbURpYWxvZy5kaXNwbGF5ZmllbGQpOwogICAgICAgICAgICAgICAgICB0aGlzXy5kaXNwbGF5RmllbGQgPSBkaXNwbGF5ZmllbGQ7CiAgICAgICAgICAgICAgICAgIHRoaXNfLnRyZWVMaXN0ID0gcmVzcC5kYXRhOwogICAgICAgICAgICAgICAgICB2YXIgaGVhZCA9IHt9OwogICAgICAgICAgICAgICAgICBoZWFkW2Rpc3BsYXlmaWVsZC5kaXNwbGF5TmFtZV0gPSAn5YWo6YOoJzsKICAgICAgICAgICAgICAgICAgaGVhZC5pZCA9IC0xOwogICAgICAgICAgICAgICAgICB0aGlzXy50cmVlLnB1c2goaGVhZCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0pOwogICAgICAgICAgfSwKICAgICAgICAgIGxvYWRUcmVlOiBmdW5jdGlvbiBsb2FkVHJlZShub2RlLCByZXNvbHZlKSB7CiAgICAgICAgICAgIHZhciBfdGhpczIxID0gdGhpczsKICAgICAgICAgICAgaWYgKG5vZGUpIHsKICAgICAgICAgICAgICBpZiAobm9kZS5kYXRhLmlkID09PSAtMSkgewogICAgICAgICAgICAgICAgdmFyIHRyZWUgPSB0aGlzLnRvVHJlZURhdGEodGhpcy50cmVlTGlzdCwgdGhpcy5kaXNwbGF5RmllbGQuaWQsIHRoaXMuZGlzcGxheUZpZWxkLnBpZCwgdGhpcy5kaXNwbGF5RmllbGQuZGlzcGxheU5hbWUsIHRoaXMuZGlzcGxheUZpZWxkLnB2YWx1ZSA/IHRoaXMuZGlzcGxheUZpZWxkLnB2YWx1ZSA6ICcwJyk7CiAgICAgICAgICAgICAgICByZXNvbHZlKHRyZWUpOwogICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICByZXNvbHZlKHRoaXMudHJlZUxpc3QuZmlsdGVyKGZ1bmN0aW9uICh2YWx1ZSkgewogICAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWVbX3RoaXMyMS5kaXNwbGF5RmllbGQucGlkXSA9PT0gbm9kZS5kYXRhW190aGlzMjEuZGlzcGxheUZpZWxkLmlkXTsKICAgICAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgcmVzb2x2ZShbXSk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0sCiAgICAgICAgICBoYW5kbGVTdWJDdXJyZW50Q2hhbmdlOiBmdW5jdGlvbiBoYW5kbGVTdWJDdXJyZW50Q2hhbmdlKGluZGV4LCB0YWIpIHsKICAgICAgICAgICAgdmFyIF90aGlzMjIgPSB0aGlzOwogICAgICAgICAgICB0YWIucGFnaW5hdGlvbi5wYWdlQmVhbi5wYWdlID0gaW5kZXg7CiAgICAgICAgICAgIHRoaXMuc3ViVGFibGVMb2FkaW5nID0gdHJ1ZTsKICAgICAgICAgICAgdGhpcy4kc3RvcmUuZGlzcGF0Y2goJ2Zvcm0vZ2V0U3ViRGF0YVBhZ2luYXRpb24nLCB7CiAgICAgICAgICAgICAgcGFnaW5hdGlvbjogdGFiLnBhZ2luYXRpb24sCiAgICAgICAgICAgICAgbmFtZTogdGFiLmVudE5hbWUsCiAgICAgICAgICAgICAgcmVmSWQ6IHRhYi5yZWZJZCA/IHRhYi5yZWZJZCA6IHRoaXMucmVmSWQKICAgICAgICAgICAgfSkudGhlbihmdW5jdGlvbiAocmVzcCkgewogICAgICAgICAgICAgIHRhYi5wYWdpbmF0aW9uLnBhZ2VCZWFuID0gewogICAgICAgICAgICAgICAgcGFnZVNpemU6IHJlc3AucGFnZVNpemUsCiAgICAgICAgICAgICAgICBwYWdlOiByZXNwLnBhZ2UsCiAgICAgICAgICAgICAgICB0b3RhbDogcmVzcC50b3RhbAogICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgdGFiLmRhdGFMaXN0ID0gcmVzcC5yb3dzOwogICAgICAgICAgICB9KS5maW5hbGx5KGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICBfdGhpczIyLnN1YlRhYmxlTG9hZGluZyA9IGZhbHNlOwogICAgICAgICAgICB9KTsKICAgICAgICAgIH0sCiAgICAgICAgICBxdWVyeVN1YlRhYmxlOiBmdW5jdGlvbiBxdWVyeVN1YlRhYmxlKHRhYikgewogICAgICAgICAgICB2YXIgX3RoaXMyMyA9IHRoaXM7CiAgICAgICAgICAgIHRhYi5wYWdpbmF0aW9uLnF1ZXJ5cyA9IFtdOwogICAgICAgICAgICBpZiAodGhpcy5xdWVyeVN1YlZhbHVlKSB7CiAgICAgICAgICAgICAgdGFiLmF0dHJpYnV0ZUxpc3QuZm9yRWFjaChmdW5jdGlvbiAoaXRlbSkgewogICAgICAgICAgICAgICAgLy9wZ1NxbOS9v+eUqOaooeeziuafpeivou+8jOexu+Wei+S4jeWMuemFjeaXtuS8muaKpemUme+8jOatpOWkhOWPquS/neeVmXZhcmNoYXLnsbvlnosKICAgICAgICAgICAgICAgIC8vIGlmIChpdGVtLmRhdGFUeXBlID09ICd2YXJjaGFyJykgewogICAgICAgICAgICAgICAgdGFiLnBhZ2luYXRpb24ucXVlcnlzLnB1c2goewogICAgICAgICAgICAgICAgICBwcm9wZXJ0eTogaXRlbS5maWVsZE5hbWUsCiAgICAgICAgICAgICAgICAgIHZhbHVlOiBfdGhpczIzLnF1ZXJ5U3ViVmFsdWUsCiAgICAgICAgICAgICAgICAgIGdyb3VwOiAnb3RoZXInLAogICAgICAgICAgICAgICAgICBvcGVyYXRpb246ICdMSUtFJywKICAgICAgICAgICAgICAgICAgcmVsYXRpb246ICdPUicKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgLy8gfQogICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMucXVlcnlTdW5WYWx1ZSkgewogICAgICAgICAgICAgIHRhYi5hdHRyaWJ1dGVMaXN0LmZvckVhY2goZnVuY3Rpb24gKGl0ZW0pIHsKICAgICAgICAgICAgICAgIC8vIGlmIChpdGVtLmRhdGFUeXBlID09ICd2YXJjaGFyJykgewogICAgICAgICAgICAgICAgdGFiLnBhZ2luYXRpb24ucXVlcnlzLnB1c2goewogICAgICAgICAgICAgICAgICBwcm9wZXJ0eTogaXRlbS5maWVsZE5hbWUsCiAgICAgICAgICAgICAgICAgIHZhbHVlOiBfdGhpczIzLnF1ZXJ5U3VuVmFsdWUsCiAgICAgICAgICAgICAgICAgIGdyb3VwOiAnb3RoZXInLAogICAgICAgICAgICAgICAgICBvcGVyYXRpb246ICdMSUtFJywKICAgICAgICAgICAgICAgICAgcmVsYXRpb246ICdPUicKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgLy8gfQogICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHRoaXMuaGFuZGxlU3ViQ3VycmVudENoYW5nZSgxLCB0YWIpOwogICAgICAgICAgfSwKICAgICAgICAgIGltcG9ydFN1YjogZnVuY3Rpb24gaW1wb3J0U3ViKHBhcmFtKSB7CiAgICAgICAgICAgIHZhciBfdGhpczI0ID0gdGhpczsKICAgICAgICAgICAgdmFyIGZvcm1EYXRhID0gbmV3IEZvcm1EYXRhKCk7CiAgICAgICAgICAgIGZvcm1EYXRhLmFwcGVuZCgnZmlsZScsIHBhcmFtLmZpbGUpOwogICAgICAgICAgICB2YXIgcGFyYW1zID0gewogICAgICAgICAgICAgIGRhdGE6IGZvcm1EYXRhLAogICAgICAgICAgICAgIGFsaWFzOiB0aGlzLmN1cnJlbnRUYWIuZW50TmFtZSwKICAgICAgICAgICAgICByZWZJZDogdGhpcy5yZWZJZAogICAgICAgICAgICB9OwogICAgICAgICAgICBmb3JtLnN1YkltcG9ydChwYXJhbXMsIGZ1bmN0aW9uIChkYXRhKSB7CiAgICAgICAgICAgICAgaWYgKGRhdGEuc3RhdGUpIHsKICAgICAgICAgICAgICAgIF90aGlzMjQuJG1lc3NhZ2UoewogICAgICAgICAgICAgICAgICB0eXBlOiAnc3VjY2VzcycsCiAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGRhdGEubWVzc2FnZQogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICBwYXJhbS5vblN1Y2Nlc3MoKTsKICAgICAgICAgICAgICAgIF90aGlzMjQuaGFuZGxlU3ViQ3VycmVudENoYW5nZSgxLCBfdGhpczI0LmN1cnJlbnRUYWIpOwogICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBfdGhpczI0LiRtZXNzYWdlLmVycm9yKGRhdGEubWVzc2FnZSk7CiAgICAgICAgICAgICAgICBwYXJhbS5vbkVycm9yKCk7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICAgIH0sCiAgICAgICAgICBleHBvcnRTdWI6IGZ1bmN0aW9uIGV4cG9ydFN1Yih0YWIpIHsKICAgICAgICAgICAgdmFyIF90aGlzMjUgPSB0aGlzOwogICAgICAgICAgICB0aGlzLmV4cG9ydFR5cGUgPSAnc3ViJzsKICAgICAgICAgICAgdGhpcy5jdXJyZW50VGFiID0gdGFiOwogICAgICAgICAgICB0aGlzLmRpc3BsYXlGaWVsZHMgPSBbXTsKICAgICAgICAgICAgdGhpcy5zdWJEaXNwbGF5RmllbGRzTGlzdCA9IFtdOwogICAgICAgICAgICB0YWIuYXR0cmlidXRlTGlzdC5mb3JFYWNoKGZ1bmN0aW9uIChpdGVtKSB7CiAgICAgICAgICAgICAgX3RoaXMyNS5kaXNwbGF5RmllbGRzLnB1c2goewogICAgICAgICAgICAgICAgZGVzYzogaXRlbS5jb21tZW50LAogICAgICAgICAgICAgICAgbmFtZTogaXRlbS5maWVsZE5hbWUsCiAgICAgICAgICAgICAgICB0eXBlOiBpdGVtLmNvbHVtblR5cGUKICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIHRoaXMuZGlhbG9nRXhwb3J0VmlzaWJsZSA9IHRydWU7CiAgICAgICAgICB9LAogICAgICAgICAgaW1wb3J0QnV0dG9uOiBmdW5jdGlvbiBpbXBvcnRCdXR0b24odGFiKSB7CiAgICAgICAgICAgIHRoaXMuY3VycmVudFRhYiA9IHRhYjsKICAgICAgICAgIH0sCiAgICAgICAgICBteURyYWZ0TGlzdDogZnVuY3Rpb24gbXlEcmFmdExpc3QoKSB7CiAgICAgICAgICAgIC8v5pWw5o2u6KeG5Zu+6ZqP5py65re75Yqg5Yiw5YW25LuW6I+c5Y2V5LiL6Z2i5pe26I635Y+W5b2T5YmN6I+c5Y2V55qE5Yir5ZCNICDlubbkuJTlvZPliY3mlbDmja7op4blm77kuI3mmK/ooajljZXph4znmoTmlbDmja7op4blm74gIGRhdGFWaWV3CiAgICAgICAgICAgIGlmIChzZXNzaW9uU3RvcmFnZS5tZW51X2FsaWFzICYmICF0aGlzLmRhdGFWaWV3ICYmICF0aGlzLmlnbm9yZWRBbGlhcy5pbmNsdWRlcyhzZXNzaW9uU3RvcmFnZS5tZW51X2FsaWFzKSkgewogICAgICAgICAgICAgIHRoaXMuYWxpYXNfbmV3ID0gc2Vzc2lvblN0b3JhZ2UubWVudV9hbGlhczsKICAgICAgICAgICAgfQogICAgICAgICAgICB2YXIgZGF0YVZpZXdGbGFnID0gZmFsc2U7CiAgICAgICAgICAgIC8v5Yik5pat5b2T5YmN5pWw5o2u6KeG5Zu+5piv5LiN5piv6KGo5Y2V6YeM55qE5pWw5o2u6KeG5Zu+CiAgICAgICAgICAgIGlmICh0aGlzLmRhdGFWaWV3KSB7CiAgICAgICAgICAgICAgaWYgKHRoaXMuZGF0YVZpZXcuYm9EZWZBbGlhcyAmJiB0aGlzLmRhdGFWaWV3LmJvRGVmQWxpYXMgIT0gJycpIHsKICAgICAgICAgICAgICAgIGRhdGFWaWV3RmxhZyA9IHRydWU7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIHZhciBwYXRoID0gJy8nICsgdGhpcy5hbGlhc19uZXcgKyAnL2RyYWZ0TGlzdC8nICsgdGhpcy50ZW1wbGF0ZUluZm8uYWxpYXMgKyAnLycgKyBkYXRhVmlld0ZsYWc7CiAgICAgICAgICAgIGlmICh0aGlzLm9wZW5UeXBlID09ICduZXcnIHx8IGRhdGFWaWV3RmxhZykgewogICAgICAgICAgICAgIHBhdGggKz0gJz9pc05ldz10cnVlJzsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoZGF0YVZpZXdGbGFnKSB7CiAgICAgICAgICAgICAgd2luZG93Lm9wZW4ocGF0aCwgJ19ibGFuaycpOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgIHRoaXMuJHJvdXRlci5wdXNoKHBhdGgpOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBsZXQgdXJsID0KICAgICAgICAgICAgLy8gICAiL3N0YXRlbWVudC9kcmFmdExpc3Q/dGVtcEFsaWFzPSIgKyA7CiAgICAgICAgICAgIC8vIGNvbnN0IHsgaHJlZiB9ID0gdGhpcy4kcm91dGVyLnB1c2goewogICAgICAgICAgICAvLyAgIHBhdGg6IHVybCwKICAgICAgICAgICAgLy8gfSk7CiAgICAgICAgICAgIC8vIHdpbmRvdy5vcGVuKGhyZWYsICJfYmxhbmsiKTsKICAgICAgICAgIH0sCiAgICAgICAgICBpbml0U3dpdGNoU3RhdHVzOiBmdW5jdGlvbiBpbml0U3dpdGNoU3RhdHVzKCkgewogICAgICAgICAgICAvL+WIneWni+WMluW8gOWFs+eKtuaAgQogICAgICAgICAgICB2YXIgbWFuYWdlcyA9IHV0aWxzLnBhcnNlVG9Kc29uKHRoaXMudGVtcGxhdGVJbmZvLm1hbmFnZUZpZWxkKTsKICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBtYW5hZ2VzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgaWYgKG1hbmFnZXNbaV0ubmFtZSA9PT0gJ3N3aXRjaCcpIHsKICAgICAgICAgICAgICAgIHZhciBmaWVsZE5hbWUgPSBtYW5hZ2VzW2ldLmJpbmQ7CiAgICAgICAgICAgICAgICB0aGlzLiRzZXQodGhpcy5zd2l0Y2hNYXAsIGZpZWxkTmFtZSwge30pOwogICAgICAgICAgICAgICAgdGhpcy5zd2l0Y2hNYXBbZmllbGROYW1lXS5vbiA9IG1hbmFnZXNbaV0uc3dpdGNoT247CiAgICAgICAgICAgICAgICB0aGlzLnN3aXRjaE1hcFtmaWVsZE5hbWVdLm9mZiA9IG1hbmFnZXNbaV0uc3dpdGNoT2ZmOwogICAgICAgICAgICAgICAgdGhpcy5zd2l0Y2hNYXBbZmllbGROYW1lXS5vbkxhYmVsID0gbWFuYWdlc1tpXS5zd2l0Y2hPbkxhYmVsOwogICAgICAgICAgICAgICAgdGhpcy5zd2l0Y2hNYXBbZmllbGROYW1lXS5vZmZMYWJlbCA9IG1hbmFnZXNbaV0uc3dpdGNoT2ZmTGFiZWw7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICB9LAogICAgICAgICAgc3dpdGNoQ2hhbmdlOiBmdW5jdGlvbiBzd2l0Y2hDaGFuZ2UocGtWYWwsIG9uLCBvZmYsIGZpZWxkTmFtZSwgcm93LCBkZWZhdWx0VHJ1ZSkgewogICAgICAgICAgICB2YXIgdGhpc18gPSB0aGlzOwogICAgICAgICAgICB2YXIgdmFsID0gcm93W2ZpZWxkTmFtZV07CiAgICAgICAgICAgIGlmICh2YWwgIT0gb24gJiYgdmFsICE9IG9mZikgewogICAgICAgICAgICAgIGlmIChkZWZhdWx0VHJ1ZSA9PSAndHJ1ZScpIHsKICAgICAgICAgICAgICAgIHRoaXMuJHNldChyb3csIGZpZWxkTmFtZSwgb2ZmKTsKICAgICAgICAgICAgICAgIHZhbCA9IG9mZjsKICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgdGhpcy4kc2V0KHJvdywgZmllbGROYW1lLCBvbik7CiAgICAgICAgICAgICAgICB2YWwgPSBvbjsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdGhpc18uJGNvbmZpcm0oJ+WwhuS8muS/ruaUueivpeaVsOaNru+8jOaYr+WQpue7p+e7rT8nLCB7CiAgICAgICAgICAgICAgY29uZmlybUJ1dHRvblRleHQ6ICfnoa7lrponLAogICAgICAgICAgICAgIGNhbmNlbEJ1dHRvblRleHQ6ICflj5bmtognLAogICAgICAgICAgICAgIHR5cGU6ICd3YXJuaW5nJwogICAgICAgICAgICB9KS50aGVuKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICB2YXIgZm9ybSA9IHdpbmRvdy5jb250ZXh0LmZvcm07CiAgICAgICAgICAgICAgdmFyIGZvcm1BbGlhcyA9IHRoaXNfLnRlbXBsYXRlSW5mby5mb3JtS2V5OyAvL+ihqOWNleWIq+WQjQogICAgICAgICAgICAgIHZhciBkYXRhRGVmQWxpYXMgPSB0aGlzXy50ZW1wbGF0ZUluZm8uYm9EZWZBbGlhczsgLy/mlbDmja7lu7rmqKHliKvlkI0KICAgICAgICAgICAgICByZXEuZ2V0KGZvcm0gKyAnL2Zvcm0vZGF0YVRlbXBsYXRlL3YxL2dldEZvcm0vJyArIGZvcm1BbGlhcyArICcvJyArIGRhdGFEZWZBbGlhcyArICc/aWQ9JyArIHBrVmFsICsgJyZhY3Rpb249Z2V0JnJlY29yZElkPScpLnRoZW4oZnVuY3Rpb24gKHJlc3ApIHsKICAgICAgICAgICAgICAgIHZhciBib0RhdGEgPSByZXNwLmRhdGEuZGF0YTsKICAgICAgICAgICAgICAgIGJvRGF0YVtkYXRhRGVmQWxpYXNdW2ZpZWxkTmFtZV0gPSB2YWw7CiAgICAgICAgICAgICAgICB2YXIgc2F2ZURhdGEgPSB7CiAgICAgICAgICAgICAgICAgIGJvQWxpYXM6IHRoaXNfLnRlbXBsYXRlSW5mby5ib0RlZkFsaWFzLAogICAgICAgICAgICAgICAgICBib0RhdGE6IHJlc3AuZGF0YS5kYXRhCiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgdGhpc18uJHN0b3JlLmRpc3BhdGNoKCdmb3JtL2JvU2F2ZScsIHNhdmVEYXRhKS50aGVuKGZ1bmN0aW9uIChyZXN1bHQpIHsKICAgICAgICAgICAgICAgICAgaWYgKHJlc3VsdC5zdGF0ZSkgewogICAgICAgICAgICAgICAgICAgIHRoaXNfLiRtZXNzYWdlKHsKICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICdzdWNjZXNzJywKICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6ICfkv53lrZjmiJDlip8nCiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgdGhpc18uJG1lc3NhZ2UoewogICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ2Vycm9yJywKICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6ICfkv53lrZjlpLHotKUnCiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9KS5jYXRjaChmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgdmFyIGZvcm0gPSB3aW5kb3cuY29udGV4dC5mb3JtOwogICAgICAgICAgICAgIHZhciBmb3JtQWxpYXMgPSB0aGlzXy50ZW1wbGF0ZUluZm8uZm9ybUtleTsgLy/ooajljZXliKvlkI0KICAgICAgICAgICAgICB2YXIgZGF0YURlZkFsaWFzID0gdGhpc18udGVtcGxhdGVJbmZvLmJvRGVmQWxpYXM7IC8v5pWw5o2u5bu65qih5Yir5ZCNCiAgICAgICAgICAgICAgcmVxLmdldChmb3JtICsgJy9mb3JtL2RhdGFUZW1wbGF0ZS92MS9nZXRGb3JtLycgKyBmb3JtQWxpYXMgKyAnLycgKyBkYXRhRGVmQWxpYXMgKyAnP2lkPScgKyBwa1ZhbCArICcmYWN0aW9uPWdldCZyZWNvcmRJZD0nKS50aGVuKGZ1bmN0aW9uIChyZXNwKSB7CiAgICAgICAgICAgICAgICB0aGlzXy4kc2V0KHJvdywgZmllbGROYW1lLCByZXNwLmRhdGEuZGF0YVtkYXRhRGVmQWxpYXNdW2ZpZWxkTmFtZV0pOwogICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9KTsKICAgICAgICAgIH0sCiAgICAgICAgICBkaXNwbGF5OiBmdW5jdGlvbiBkaXNwbGF5KG1wRGlzcGxheSkgewogICAgICAgICAgICAvL3Bj56uv55qE5pWw5o2u5oql6KGo5LiN6ZyA6KaB5YGa5pys5pa55rOV55qE5aSE55CG77yM55u05o6l6L+U5ZuedHJ1ZeWNs+WPr+OAggogICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgIH0sCiAgICAgICAgICBnZXRGaXhlZDogZnVuY3Rpb24gZ2V0Rml4ZWQoZml4ZWQpIHsKICAgICAgICAgICAgcmV0dXJuIGZpeGVkOwogICAgICAgICAgfSwKICAgICAgICAgIHN1bW1hcnk6IGZ1bmN0aW9uIHN1bW1hcnkobWV0aG9kLCBmaWVsZCwgZGVjaW1hbCkgewogICAgICAgICAgICB2YXIgbGlzdCA9IHRoaXMucm93cy5maWx0ZXIoZnVuY3Rpb24gKGl0ZW0pIHsKICAgICAgICAgICAgICByZXR1cm4gaXRlbVtmaWVsZF0gIT09IHVuZGVmaW5lZCAmJiBpdGVtW2ZpZWxkXSAhPT0gJyc7CiAgICAgICAgICAgIH0pLm1hcChmdW5jdGlvbiAoaXRlbSkgewogICAgICAgICAgICAgIHJldHVybiBuZXcgTnVtYmVyKGl0ZW1bZmllbGRdKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIGlmICghbGlzdCB8fCBsaXN0Lmxlbmd0aCA9PSAwKSB7CiAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChtZXRob2QgPT09ICdjb3VudCcpIHsKICAgICAgICAgICAgICByZXR1cm4gbGlzdC5sZW5ndGg7CiAgICAgICAgICAgIH0gZWxzZSBpZiAobWV0aG9kID09PSAnc3VtJykgewogICAgICAgICAgICAgIHJldHVybiBsaXN0LnJlZHVjZShmdW5jdGlvbiAoYSwgYikgewogICAgICAgICAgICAgICAgcmV0dXJuIGEgKyBiOwogICAgICAgICAgICAgIH0pLnRvRml4ZWQoZGVjaW1hbCk7CiAgICAgICAgICAgIH0gZWxzZSBpZiAobWV0aG9kID09PSAnbWluJykgewogICAgICAgICAgICAgIHJldHVybiBNYXRoLm1pbi5hcHBseShNYXRoLCBfdG9Db25zdW1hYmxlQXJyYXkobGlzdCkpLnRvRml4ZWQoZGVjaW1hbCk7CiAgICAgICAgICAgIH0gZWxzZSBpZiAobWV0aG9kID09PSAnbWF4JykgewogICAgICAgICAgICAgIHJldHVybiBNYXRoLm1heC5hcHBseShNYXRoLCBfdG9Db25zdW1hYmxlQXJyYXkobGlzdCkpLnRvRml4ZWQoZGVjaW1hbCk7CiAgICAgICAgICAgIH0gZWxzZSBpZiAobWV0aG9kID09PSAnYXZnJykgewogICAgICAgICAgICAgIHJldHVybiAobGlzdC5yZWR1Y2UoZnVuY3Rpb24gKGEsIGIpIHsKICAgICAgICAgICAgICAgIHJldHVybiBhICsgYjsKICAgICAgICAgICAgICB9KSAvIGxpc3QubGVuZ3RoKS50b0ZpeGVkKGRlY2ltYWwpOwogICAgICAgICAgICB9CiAgICAgICAgICB9LAogICAgICAgICAgZ2V0Q29sb3I6IGZ1bmN0aW9uIGdldENvbG9yKGRhdGEsIHJvdykgewogICAgICAgICAgICB2YXIgcmVzdUNvbG9yID0gJ2NvbG9yOmJsYWNrJzsKICAgICAgICAgICAgdmFyIGRlY29kZSA9IEJhc2U2NC5kZWNvZGUoZGF0YSk7CiAgICAgICAgICAgIHZhciBjb2xvclJ1bGUgPSBKU09OLnBhcnNlKGRlY29kZSk7CiAgICAgICAgICAgIGlmIChjb2xvclJ1bGUgJiYgY29sb3JSdWxlIGluc3RhbmNlb2YgQXJyYXkpIHsKICAgICAgICAgICAgICBjb2xvclJ1bGUuZm9yRWFjaChmdW5jdGlvbiAocnVsZSkgewogICAgICAgICAgICAgICAgdmFyIEZuID0gRnVuY3Rpb24oJ2RhdGEnLCBydWxlLnByb1J1bGUpOwogICAgICAgICAgICAgICAgaWYgKEZuKHJvdykpIHsKICAgICAgICAgICAgICAgICAgcmVzdUNvbG9yID0gJ2NvbG9yOicgKyBydWxlLnByb0NvbG9yOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiByZXN1Q29sb3I7CiAgICAgICAgICB9LAogICAgICAgICAgZ2V0UHJvVmFsdWU6IGZ1bmN0aW9uIGdldFByb1ZhbHVlKHZhbHVlLCBydWxlKSB7CiAgICAgICAgICAgIHJldHVybiBNYXRoLnJvdW5kKHZhbHVlIC8gcnVsZSAqIDEwMDAwKSAvIDEwMDsgLy8g5bCP5pWw54K55ZCO5Lik5L2N55m+5YiG5q+UCiAgICAgICAgICB9LAogICAgICAgICAgZ2V0UHJvQ29sb3I6IGZ1bmN0aW9uIGdldFByb0NvbG9yKGRhdGEsIHJvdykgewogICAgICAgICAgICB2YXIgcmVzdUNvbG9yID0gJyM0MDllZmYnOwogICAgICAgICAgICB2YXIgZGVjb2RlID0gQmFzZTY0LmRlY29kZShkYXRhKTsKICAgICAgICAgICAgLypkZWNvZGU9ZGVjb2RlLnJlcGxhY2UoL1xzKiEvZywiIik7Ki8KICAgICAgICAgICAgdmFyIGNvbG9yUnVsZSA9IEpTT04ucGFyc2UoZGVjb2RlKTsKICAgICAgICAgICAgaWYgKGNvbG9yUnVsZSAmJiBjb2xvclJ1bGUgaW5zdGFuY2VvZiBBcnJheSkgewogICAgICAgICAgICAgIGNvbG9yUnVsZS5mb3JFYWNoKGZ1bmN0aW9uIChydWxlKSB7CiAgICAgICAgICAgICAgICB2YXIgRm4gPSBGdW5jdGlvbignZGF0YScsIHJ1bGUucHJvUnVsZSk7CiAgICAgICAgICAgICAgICBpZiAoRm4ocm93KSkgewogICAgICAgICAgICAgICAgICByZXN1Q29sb3IgPSBydWxlLnByb0NvbG9yOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiByZXN1Q29sb3I7CiAgICAgICAgICB9LAogICAgICAgICAgaXNTb3J0YWJsZTogZnVuY3Rpb24gaXNTb3J0YWJsZShmaWVsZCkgewogICAgICAgICAgICB2YXIgaXNDbG9iID0gZmFsc2U7CiAgICAgICAgICAgIHRoaXMuZGlzcGxheUZpZWxkcy5mb3JFYWNoKGZ1bmN0aW9uIChpdGVtKSB7CiAgICAgICAgICAgICAgaWYgKGl0ZW0ubmFtZSA9PT0gZmllbGQgJiYgaXRlbS50eXBlID09PSAnY2xvYicpIHsKICAgICAgICAgICAgICAgIGlzQ2xvYiA9IHRydWU7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICAgICAgcmV0dXJuICF0aGlzLm5vdFNvcnRhYmxlRmllbGRzLmluY2x1ZGVzKGZpZWxkKSAmJiAhaXNDbG9iOwogICAgICAgICAgfSwKICAgICAgICAgIGN1c3RvbUV2aWxKUzogZnVuY3Rpb24gY3VzdG9tRXZpbEpTKHJvdywgaHRTY3JpcHQpIHsKICAgICAgICAgICAgdmFyIEZuID0gRnVuY3Rpb24oJ19yZXEnLCAncm93JywgJ190aGlzJywgQmFzZTY0LmRlY29kZShodFNjcmlwdCkpOyAvL+S4gOS4quWPmOmHj+aMh+WQkUZ1bmN0aW9u77yM6Ziy5q2i5pyJ5Lqb5YmN56uv57yW6K+R5bel5YW35oql6ZSZCiAgICAgICAgICAgIHZhciByZXN1bHQgPSBGbihyZXEsIHJvdywgdGhpcyk7CiAgICAgICAgICB9LAogICAgICAgICAgYmF0Y2hVcGRhdGU6IGZ1bmN0aW9uIGJhdGNoVXBkYXRlKHRpdGxlLCBiYXNlNjRKc29uLCBiYXNlNjRGaWxlZHMpIHsKICAgICAgICAgICAgaWYgKHRoaXMudGFibGVEYXRhLnNlbGVjdFJvd3MgPT0gbnVsbCB8fCB0aGlzLnRhYmxlRGF0YS5zZWxlY3RSb3dzLmxlbmd0aCA9PSAwKSB7CiAgICAgICAgICAgICAgdGhpcy4kbWVzc2FnZS53YXJuaW5nKCfor7fpgInmi6nmlbDmja4nKTsKICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdmFyIGRlZmF1bHRWYWx1ZUxpc3QgPSBbXTsKICAgICAgICAgICAgdmFyIG91dEZvcm0gPSBbXTsKICAgICAgICAgICAgaWYgKGJhc2U2NEpzb24pIHsKICAgICAgICAgICAgICAvL+aYr+WQpuacieeUqOaIt+iHquW3sei+k+WFpeeahOWtl+autQogICAgICAgICAgICAgIHZhciByZXMgPSB0cnVlOwogICAgICAgICAgICAgIHZhciBiYXRjaFVwZGF0ZURhdGEgPSBKU09OLnBhcnNlKEJhc2U2NC5kZWNvZGUoYmFzZTY0SnNvbikpOwogICAgICAgICAgICAgIHZhciBmaWxlZHNPYmogPSBKU09OLnBhcnNlKEJhc2U2NC5kZWNvZGUoYmFzZTY0RmlsZWRzKSk7CiAgICAgICAgICAgICAgYmF0Y2hVcGRhdGVEYXRhLmZvckVhY2goZnVuY3Rpb24gKGl0ZW0pIHsKICAgICAgICAgICAgICAgIGlmIChpdGVtLnZhbHVlVHlwZSA9PSAxKSB7CiAgICAgICAgICAgICAgICAgIHZhciBpc1JlcXVpcmVkID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgIGlmIChpdGVtLmlzUmVxdWlyZWQpIHsKICAgICAgICAgICAgICAgICAgICBpc1JlcXVpcmVkID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICB2YXIgb2JqID0gewogICAgICAgICAgICAgICAgICAgIG5hbWU6IGl0ZW0ubmFtZSwKICAgICAgICAgICAgICAgICAgICBkZXNjOiBmaWxlZHNPYmpbaXRlbS5uYW1lXSwKICAgICAgICAgICAgICAgICAgICBvdXRUeXBlOiBpdGVtLm91dFZhbHVlVHlwZSwKICAgICAgICAgICAgICAgICAgICBzaW5nbGU6IGZhbHNlLAogICAgICAgICAgICAgICAgICAgIHNlbGVjdEN1cnJlbnQ6IGZhbHNlLAogICAgICAgICAgICAgICAgICAgIGlzUmVxdWlyZWQ6IGlzUmVxdWlyZWQKICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgaWYgKGl0ZW0ub3V0VmFsdWVUeXBlID09ICdzZWxlY3QnKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHNlbGVjdENvbmZpZyA9IEpTT04ucGFyc2UoaXRlbS5vdXRDb25maWcpOwogICAgICAgICAgICAgICAgICAgIG9iai5nYW5nZWQgPSB7CiAgICAgICAgICAgICAgICAgICAgICBhbGlhczogJycsCiAgICAgICAgICAgICAgICAgICAgICB2YWx1ZUJpbmQ6ICcnLAogICAgICAgICAgICAgICAgICAgICAgbm9Jbml0OiAnJywKICAgICAgICAgICAgICAgICAgICAgIGxhYmVsQmluZDogJycsCiAgICAgICAgICAgICAgICAgICAgICBiaW5kOiB7fQogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGVjdENvbmZpZy5jdXN0b21RdWVyeSkgewogICAgICAgICAgICAgICAgICAgICAgdmFyIGdhbmdlZCA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgYWxpYXM6IHNlbGVjdENvbmZpZy5jdXN0b21RdWVyeS5hbGlhcywKICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVCaW5kOiBzZWxlY3RDb25maWcuY3VzdG9tUXVlcnkudmFsdWVCaW5kLAogICAgICAgICAgICAgICAgICAgICAgICBub0luaXQ6ICcnLAogICAgICAgICAgICAgICAgICAgICAgICBsYWJlbEJpbmQ6IHNlbGVjdENvbmZpZy5jdXN0b21RdWVyeS5sYWJlbEJpbmQsCiAgICAgICAgICAgICAgICAgICAgICAgIGJpbmQ6IHt9CiAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgb2JqLmdhbmdlZCA9IGdhbmdlZDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgb2JqLnNlbGVjdERhdGEgPSBzZWxlY3RDb25maWcuc2VsZWN0RGF0YTsKICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChpdGVtLm91dFZhbHVlVHlwZSA9PSAnZGlhbG9nJykgewogICAgICAgICAgICAgICAgICAgIHZhciBfc2VsZWN0Q29uZmlnID0gSlNPTi5wYXJzZShpdGVtLm91dENvbmZpZyk7CiAgICAgICAgICAgICAgICAgICAgdmFyIGRpYWxvZ0NvbmZpZyA9IF9zZWxlY3RDb25maWcuZGlhbG9nQ29uZmlnOwogICAgICAgICAgICAgICAgICAgIHZhciBtYXBwaW5nQ29uZiA9IFtdOwogICAgICAgICAgICAgICAgICAgIHZhciBwYXJhbWV0ZXIgPSBfc2VsZWN0Q29uZmlnLnBhcmFtZXRlcjsKICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBrZXkgaW4gcGFyYW1ldGVyKSB7CiAgICAgICAgICAgICAgICAgICAgICB2YXIgdmFsdWUgPSBwYXJhbWV0ZXJba2V5XSB8fCAnJzsKICAgICAgICAgICAgICAgICAgICAgIG1hcHBpbmdDb25mLnB1c2goewogICAgICAgICAgICAgICAgICAgICAgICBmcm9tOiBrZXksCiAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldDogW3ZhbHVlXSwKICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0U3ViOiBbdmFsdWVdCiAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgdmFyIGN1c3RkaWFsb2cgPSB7CiAgICAgICAgICAgICAgICAgICAgICBzZWxlY3ROdW06IGRpYWxvZ0NvbmZpZy5zZWxlY3ROdW0sCiAgICAgICAgICAgICAgICAgICAgICBjb25kaXRpb25zOiBbXSwKICAgICAgICAgICAgICAgICAgICAgIG1hcHBpbmdDb25mOiBtYXBwaW5nQ29uZiwKICAgICAgICAgICAgICAgICAgICAgIGN1c3RRdWVyeUpzb246IFtdLAogICAgICAgICAgICAgICAgICAgICAgYWxpYXM6IGRpYWxvZ0NvbmZpZy5hbGlhcywKICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IGRpYWxvZ0NvbmZpZy5jdXN0RGlhbG9nCiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICBvYmouY3VzdGRpYWxvZyA9IHsKICAgICAgICAgICAgICAgICAgICAgIG5hbWU6ICfor7fpgInmi6knLAogICAgICAgICAgICAgICAgICAgICAgY3VzdERpYWxvZzogY3VzdGRpYWxvZywKICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdEZpZWxkOiBkaWFsb2dDb25maWcucmVzdWx0RmllbGQKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGl0ZW0ub3V0Q29uZmlnICYmIChpdGVtLm91dFZhbHVlVHlwZSAhPSAnaW5wdXQnIHx8IGl0ZW0ub3V0VmFsdWVUeXBlICE9ICdkYXRhJyB8fCBpdGVtLm91dFZhbHVlVHlwZSAhPSAnbnVtYmVyJykpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgb3V0Q29uZmlnID0gSlNPTi5wYXJzZShpdGVtLm91dENvbmZpZyk7CiAgICAgICAgICAgICAgICAgICAgdmFyIF9wYXJhbWV0ZXIgPSBvdXRDb25maWcucGFyYW1ldGVyOwogICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGtleSBpbiBfcGFyYW1ldGVyKSB7CiAgICAgICAgICAgICAgICAgICAgICBpZiAoIV9wYXJhbWV0ZXJba2V5XSkgewogICAgICAgICAgICAgICAgICAgICAgICBkZWxldGUgX3BhcmFtZXRlcltrZXldOwogICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgX3BhcmFtZXRlcltrZXldID0gJ2RhdGEuJyArIF9wYXJhbWV0ZXJba2V5XTsKICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYgKG91dENvbmZpZy5zZWxlY3RDdXJyZW50KSB7CiAgICAgICAgICAgICAgICAgICAgICBvYmouc2VsZWN0Q3VycmVudCA9IG91dENvbmZpZy5zZWxlY3RDdXJyZW50OwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpZiAob3V0Q29uZmlnLmlzU2luZ2xlKSB7CiAgICAgICAgICAgICAgICAgICAgICBvYmouc2luZ2xlID0gb3V0Q29uZmlnLmlzU2luZ2xlOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBvYmouYmluZENvbmZpZyA9IF9wYXJhbWV0ZXI7CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgb3V0Rm9ybS5wdXNoKG9iaik7CiAgICAgICAgICAgICAgICAgIHJlcyA9IGZhbHNlOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgZGVmYXVsdFZhbHVlTGlzdC5wdXNoKHsKICAgICAgICAgICAgICAgICAgICBrZXk6IGl0ZW0ubmFtZSwKICAgICAgICAgICAgICAgICAgICB2YWx1ZTogaXRlbS5kZWZhdWx0VmFsdWUKICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgaWYgKHJlcykgewogICAgICAgICAgICAgICAgdGhpcy51cGRhdGVCbyhkZWZhdWx0VmFsdWVMaXN0KTsKICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgdGhpcy5kZWZhdWx0VmFsdWVMaXN0ID0gZGVmYXVsdFZhbHVlTGlzdDsKICAgICAgICAgICAgICAgIHRoaXMuJHJlZnMudGVtcGxhdGVCYXRjaFVwZGF0ZURpYWxvZy5zaG93RGlhbG9nKHRpdGxlLCBvdXRGb3JtKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgdGhpcy4kbWVzc2FnZSh7CiAgICAgICAgICAgICAgICB0eXBlOiAnaW5mbycsCiAgICAgICAgICAgICAgICBtZXNzYWdlOiAn5pyq6K6+572u5pu05paw5YaF5a65JwogICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CiAgICAgICAgICB9LAogICAgICAgICAgb25Db25maXJtOiBmdW5jdGlvbiBvbkNvbmZpcm0oZGF0YSkgewogICAgICAgICAgICB2YXIgZGVmYXVsdFZhbHVlTGlzdCA9IFtdOwogICAgICAgICAgICBmb3IgKHZhciBrZXkgaW4gZGF0YSkgewogICAgICAgICAgICAgIGRlZmF1bHRWYWx1ZUxpc3QucHVzaCh7CiAgICAgICAgICAgICAgICBrZXk6IGtleSwKICAgICAgICAgICAgICAgIHZhbHVlOiBkYXRhW2tleV0KICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQogICAgICAgICAgICB2YXIgYm9EYXRhID0gdGhpcy5kZWZhdWx0VmFsdWVMaXN0ID8gdGhpcy5kZWZhdWx0VmFsdWVMaXN0LmNvbmNhdChkZWZhdWx0VmFsdWVMaXN0KSA6IHRoaXMuZGVmYXVsdFZhbHVlOwogICAgICAgICAgICB0aGlzLnVwZGF0ZUJvKGJvRGF0YSk7CiAgICAgICAgICB9LAogICAgICAgICAgdXBkYXRlQm86IGZ1bmN0aW9uIHVwZGF0ZUJvKGRlZmF1bHRWYWx1ZUxpc3QpIHsKICAgICAgICAgICAgdmFyIF90aGlzMjYgPSB0aGlzOwogICAgICAgICAgICB0aGlzLiRjb25maXJtKCfmraTmk43kvZzlsIbmibnph4/mm7TmlrDmlbDmja4sIOaYr+WQpue7p+e7rT8nLCAn5o+Q56S6JywgewogICAgICAgICAgICAgIGNvbmZpcm1CdXR0b25UZXh0OiAn56Gu5a6aJywKICAgICAgICAgICAgICBjYW5jZWxCdXR0b25UZXh0OiAn5Y+W5raIJywKICAgICAgICAgICAgICB0eXBlOiAnd2FybmluZycKICAgICAgICAgICAgfSkudGhlbihmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgdmFyIHNlbGVjdFJvd3MgPSBfdGhpczI2LnRhYmxlRGF0YS5zZWxlY3RSb3dzOwogICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc2VsZWN0Um93cy5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgICAgc2VsZWN0Um93c1tpXS5mb3JtS2V5ID0gX3RoaXMyNi50ZW1wbGF0ZUluZm8uZm9ybUtleTsKICAgICAgICAgICAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgZGVmYXVsdFZhbHVlTGlzdC5sZW5ndGg7IGorKykgewogICAgICAgICAgICAgICAgICBzZWxlY3RSb3dzW2ldW2RlZmF1bHRWYWx1ZUxpc3Rbal0ua2V5XSA9IGRlZmF1bHRWYWx1ZUxpc3Rbal0udmFsdWU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIHZhciBkYXRhID0gewogICAgICAgICAgICAgICAgYm9EYXRhOiBzZWxlY3RSb3dzLAogICAgICAgICAgICAgICAgYm9BbGlhczogX3RoaXMyNi50ZW1wbGF0ZUluZm8uYm9EZWZBbGlhcwogICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgX3RoaXMyNi4kc3RvcmUuZGlzcGF0Y2goJ2Zvcm0vYmF0Y2hVcGRhdGVUZW1wbGF0ZURhdGEnLCBkYXRhKS50aGVuKGZ1bmN0aW9uIChkYXRhKSB7CiAgICAgICAgICAgICAgICBpZiAoZGF0YS5zdGF0ZSkgewogICAgICAgICAgICAgICAgICBfdGhpczI2LiRtZXNzYWdlKHsKICAgICAgICAgICAgICAgICAgICB0eXBlOiAnc3VjY2VzcycsCiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogZGF0YS5tZXNzYWdlCiAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICBfdGhpczI2LnNlYXJjaCgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9KS5jYXRjaChmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgX3RoaXMyNi4kbWVzc2FnZSh7CiAgICAgICAgICAgICAgICB0eXBlOiAnaW5mbycsCiAgICAgICAgICAgICAgICBtZXNzYWdlOiAn5bey5Y+W5raI5pu05pawJwogICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9KTsKICAgICAgICAgIH0sCiAgICAgICAgICBhZGRDb21tYW5kOiBmdW5jdGlvbiBhZGRDb21tYW5kKGNvbW1hbmQpIHsKICAgICAgICAgICAgaWYgKGNvbW1hbmQgPT0gJ25vdExvZ2luJyB8fCBjb21tYW5kID09ICdsb2dpbicpIHsKICAgICAgICAgICAgICB0aGlzLmdldEFkZFFSQ29kZShjb21tYW5kKTsKICAgICAgICAgICAgfQogICAgICAgICAgfSwKICAgICAgICAgIGdldEFkZFFSQ29kZTogZnVuY3Rpb24gZ2V0QWRkUVJDb2RlKGNvbW1hbmQpIHsKICAgICAgICAgICAgdGhpcy5RUkNvZGVQYXR0ZXJuID0gY29tbWFuZCA9PSAnbm90TG9naW4nID8gdHJ1ZSA6IGZhbHNlOwogICAgICAgICAgICB0aGlzLlFSQ29kZURlc2MgPSBbXTsKICAgICAgICAgICAgdGhpcy5RUkNvZGVUeXBlID0gJ2FkZCc7CiAgICAgICAgICAgIHRoaXMuUVJDb2RlU2hvdyA9IGZhbHNlOwogICAgICAgICAgICB0aGlzLlFSQ29kZURpYWxvZyA9IHRydWU7CiAgICAgICAgICB9LAogICAgICAgICAgc2hvd1NlYXJjaFBhbmU6IGZ1bmN0aW9uIHNob3dTZWFyY2hQYW5lKCkgewogICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgIH0sCiAgICAgICAgICBidWlsZERlZmF1bHRRdWVyeXM6IGZ1bmN0aW9uIGJ1aWxkRGVmYXVsdFF1ZXJ5cygpIHsKICAgICAgICAgICAgdmFyIHRoaXNfID0gdGhpczsKICAgICAgICAgICAgdmFyIHF1ZXJ5cyA9IFtdOwogICAgICAgICAgICB2YXIgY29uZGl0aW9ucyA9IEpTT04ucGFyc2UodGhpc18udGVtcGxhdGVJbmZvLmNvbmRpdGlvbkZpZWxkKTsKICAgICAgICAgICAgdmFyIHByZWZpeCA9IHRoaXMudGVtcGxhdGVJbmZvLmlzRXh0ZXJuYWwgPT0gMSA/ICcnIDogJ0ZfJzsKICAgICAgICAgICAgLy/mnaHku7blrZfmrrXpu5jorqTlgLzliKTmlq0KICAgICAgICAgICAgY29uZGl0aW9ucy5mb3JFYWNoKGZ1bmN0aW9uIChjb25kaXRpb24pIHsKICAgICAgICAgICAgICBpZiAoY29uZGl0aW9uLmRlZmF1bHRWYWx1ZSkgewogICAgICAgICAgICAgICAgdmFyIGZpZWxkID0gY29uZGl0aW9uLmNvbFByZWZpeCArIGNvbmRpdGlvbi5uYTsKICAgICAgICAgICAgICAgIHRoaXNfLiRzZXQodGhpc18uc2VhcmNoRm9ybSwgZmllbGQsIGNvbmRpdGlvbi5kZWZhdWx0VmFsdWUpOwogICAgICAgICAgICAgICAgdmFyIHZhbHVlID0gY29uZGl0aW9uLmRlZmF1bHRWYWx1ZTsKICAgICAgICAgICAgICAgIGlmIChjb25kaXRpb24udHkgPT0gJ251bWJlcicpIHsKICAgICAgICAgICAgICAgICAgdmFsdWUgPSBwYXJzZUZsb2F0KHZhbHVlKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHF1ZXJ5cy5wdXNoKHsKICAgICAgICAgICAgICAgICAgcHJvcGVydHk6IGZpZWxkLAogICAgICAgICAgICAgICAgICB2YWx1ZTogdmFsdWUsCiAgICAgICAgICAgICAgICAgIGdyb3VwOiAnbWFpbicsCiAgICAgICAgICAgICAgICAgIG9wZXJhdGlvbjogY29uZGl0aW9uLnF0LnRvVXBwZXJDYXNlKCksCiAgICAgICAgICAgICAgICAgIHJlbGF0aW9uOiAnQU5EJwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICAgICAgLy/nrZvpgInlrZfmrrXpu5jorqTlgLzliKTmlq0KCiAgICAgICAgICAgIHZhciBmaWx0ZXJzID0gSlNPTi5wYXJzZSh0aGlzXy50ZW1wbGF0ZUluZm8uZmlsdGVyaW5nRmllbGQpOwogICAgICAgICAgICBmaWx0ZXJzLmZvckVhY2goZnVuY3Rpb24gKGZpbHRlcikgewogICAgICAgICAgICAgIGlmIChmaWx0ZXIuZGVmYXVsdFZhbHVlICYmIGZpbHRlci5kZWZhdWx0VmFsdWUubGVuZ3RoID4gMCkgewogICAgICAgICAgICAgICAgdGhpc18uZmlsdGVyTWFwW2ZpbHRlci5uYW1lXSA9IGZpbHRlci5kZWZhdWx0VmFsdWU7CiAgICAgICAgICAgICAgICBmaWx0ZXIuZGVmYXVsdFZhbHVlLmZvckVhY2goZnVuY3Rpb24gKHZhbCkgewogICAgICAgICAgICAgICAgICBxdWVyeXMucHVzaCh7CiAgICAgICAgICAgICAgICAgICAgcHJvcGVydHk6IHByZWZpeCArIGZpbHRlci5uYW1lLAogICAgICAgICAgICAgICAgICAgIHZhbHVlOiB2YWwsCiAgICAgICAgICAgICAgICAgICAgZ3JvdXA6ICdkZWZWYWxfJyArIGZpbHRlci5uYW1lLAogICAgICAgICAgICAgICAgICAgIG9wZXJhdGlvbjogJ0VRVUFMJywKICAgICAgICAgICAgICAgICAgICByZWxhdGlvbjogJ09SJwogICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIHRoaXNfLiRvbignYWZ0ZXJNb3VudGVkJywgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgIHZhciBoZWFkZXJDb2x1bW5zID0gdGhpc18uJHJlZnMubXVsdGlwbGVUZW1wbGF0ZVRhYmxlLiRyZWZzLnRhYmxlSGVhZGVyLmNvbHVtbnM7CiAgICAgICAgICAgICAgaGVhZGVyQ29sdW1ucy5mb3JFYWNoKGZ1bmN0aW9uIChjb2x1bW4pIHsKICAgICAgICAgICAgICAgIGlmICh0aGlzXy5maWx0ZXJNYXAuaGFzT3duUHJvcGVydHkoY29sdW1uLnByb3BlcnR5KSkgewogICAgICAgICAgICAgICAgICB0aGlzXy5maWx0ZXJNYXBbY29sdW1uLnByb3BlcnR5XS5mb3JFYWNoKGZ1bmN0aW9uICh2YWwpIHsKICAgICAgICAgICAgICAgICAgICBjb2x1bW4uZmlsdGVyZWRWYWx1ZS5wdXNoKHZhbCk7CiAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9KTsKICAgICAgICAgICAgcmV0dXJuIHF1ZXJ5czsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0pOwogICAgfQogIH0KfTs="},null]}