{"remainingRequest":"/data/jenkins/workspace/badp-bcxin-web-5.x-vuechat/node_modules/vue-loader/lib/index.js??vue-loader-options!/data/jenkins/workspace/badp-bcxin-web-5.x-vuechat/src/ui/main/conversation/MessageInputView.vue?vue&type=script&lang=js&","dependencies":[{"path":"/data/jenkins/workspace/badp-bcxin-web-5.x-vuechat/src/ui/main/conversation/MessageInputView.vue","mtime":1702016964385},{"path":"/data/jenkins/workspace/badp-bcxin-web-5.x-vuechat/node_modules/babel-loader/lib/index.js","mtime":1702017034360},{"path":"/data/jenkins/workspace/badp-bcxin-web-5.x-vuechat/node_modules/cache-loader/dist/cjs.js","mtime":1702017034107},{"path":"/data/jenkins/workspace/badp-bcxin-web-5.x-vuechat/node_modules/vue-loader/lib/index.js","mtime":1702017029242}],"contextDependencies":[],"result":[{"type":"Buffer","data":"base64:Ly8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KCmltcG9ydCB3ZmMgZnJvbSAiLi4vLi4vLi4vd2ZjL2NsaWVudC93ZmMiOwppbXBvcnQgVGV4dE1lc3NhZ2VDb250ZW50IGZyb20gIi4uLy4uLy4uL3dmYy9tZXNzYWdlcy90ZXh0TWVzc2FnZUNvbnRlbnQiOwppbXBvcnQgc3RvcmUgZnJvbSAiLi4vLi4vLi4vc3RvcmUiOwppbXBvcnQge2NhdGVnb3JpZXNEZWZhdWx0LCBlbW9qaXNEZWZhdWx0LCBWRW1vamlQaWNrZXJ9IGZyb20gIkBpbW5keC92LWVtb2ppLXBpY2tlciIKaW1wb3J0IENsaWNrT3V0c2lkZSBmcm9tICJ2dWUtY2xpY2stb3V0c2lkZSI7CmltcG9ydCBUcmlidXRlIGZyb20gInRyaWJ1dGVqcyI7CmltcG9ydCAnLi4vLi4vLi4vdHJpYnV0ZS5jc3MnCmltcG9ydCBDb252ZXJzYXRpb25UeXBlIGZyb20gIi4uLy4uLy4uL3dmYy9tb2RlbC9jb252ZXJzYXRpb25UeXBlIjsKaW1wb3J0IENvbnZlcnNhdGlvbkluZm8gZnJvbSAiLi4vLi4vLi4vd2ZjL21vZGVsL2NvbnZlcnNhdGlvbkluZm8iOwppbXBvcnQgR3JvdXBJbmZvIGZyb20gIi4uLy4uLy4uL3dmYy9tb2RlbC9ncm91cEluZm8iOwppbXBvcnQgR3JvdXBNZW1iZXJUeXBlIGZyb20gIi4uLy4uLy4uL3dmYy9tb2RlbC9ncm91cE1lbWJlclR5cGUiOwppbXBvcnQgUXVvdGVJbmZvIGZyb20gIi4uLy4uLy4uL3dmYy9tb2RlbC9xdW90ZUluZm8iOwppbXBvcnQgRHJhZnQgZnJvbSAiLi4vLi4vdXRpbC9kcmFmdCI7CmltcG9ydCBNZW50aW9uIGZyb20gIi4uLy4uLy4uL3dmYy9tb2RlbC9tZW50aW9uIjsKaW1wb3J0IHtwYXJzZXIgYXMgZW1vamlQYXJzZX0gZnJvbSAnLi4vLi4vdXRpbC9lbW9qaSc7CmltcG9ydCBRdW90ZU1lc3NhZ2VWaWV3IGZyb20gIi4uLy4uL21haW4vY29udmVyc2F0aW9uL21lc3NhZ2UvUXVvdGVNZXNzYWdlVmlldyI7CmltcG9ydCB7ZmlsZUZyb21EYXRhVXJpfSBmcm9tICIuLi8uLi91dGlsL2ltYWdlVXRpbCI7CmltcG9ydCBTdGlja2VyTWVzc2FnZUNvbnRlbnQgZnJvbSAiLi4vLi4vLi4vd2ZjL21lc3NhZ2VzL3N0aWNrZXJNZXNzYWdlQ29udGVudCI7CmltcG9ydCB7Y29uZmlnIGFzIGVtb2ppQ29uZmlnfSBmcm9tICIuLi8uLi9tYWluL2NvbnZlcnNhdGlvbi9FbW9qaUFuZFN0aWNrZXJDb25maWciOwppbXBvcnQge2lwY1JlbmRlcmVyLCBpc0VsZWN0cm9ufSBmcm9tICIuLi8uLi8uLi9wbGF0Zm9ybSI7CmltcG9ydCB7Y29weVRleHR9IGZyb20gIi4uLy4uL3V0aWwvY2xpcGJvYXJkIjsKaW1wb3J0IEV2ZW50VHlwZSBmcm9tICIuLi8uLi8uLi93ZmMvY2xpZW50L3dmY0V2ZW50IjsKaW1wb3J0IElwY0V2ZW50VHlwZSBmcm9tICIuLi8uLi8uLi9pcGNFdmVudFR5cGUiOwppbXBvcnQgQ2hhbm5lbE1lbnVWaWV3IGZyb20gIi4vQ2hhbm5lbE1lbnVWaWV3IjsKaW1wb3J0IElwY1N1YiBmcm9tICIuLi8uLi8uLi9pcGMvaXBjU3ViIjsKaW1wb3J0IHB0dENsaWVudCBmcm9tICIuLi8uLi8uLi93ZmMvcHR0L2NsaWVudC9wdHRDbGllbnQiOwppbXBvcnQgVGFsa2luZ0NhbGxiYWNrIGZyb20gIi4uLy4uLy4uL3dmYy9wdHQvY2xpZW50L3RhbGtpbmdDYWxsYmFjayI7CmltcG9ydCBDb25maWcgZnJvbSAiLi4vLi4vLi4vY29uZmlnIjsKaW1wb3J0IFNvdW5kTWVzc2FnZUNvbnRlbnQgZnJvbSAiLi4vLi4vLi4vd2ZjL21lc3NhZ2VzL3NvdW5kTWVzc2FnZUNvbnRlbnQiOwppbXBvcnQgQmVuekFNUlJlY29yZGVyIGZyb20gImJlbnotYW1yLXJlY29yZGVyIjsKaW1wb3J0IFR5cGluZ01lc3NhZ2VDb250ZW50IGZyb20gIi4uLy4uLy4uL3dmYy9tZXNzYWdlcy90eXBpbmdNZXNzYWdlQ29udGVudCI7CmltcG9ydCB7Y3VycmVudFdpbmRvdywgZnN9IGZyb20gIi4uLy4uLy4uL3BsYXRmb3JtIjsKCmV4cG9ydCBkZWZhdWx0IHsKICAgIG5hbWU6ICJNZXNzYWdlSW5wdXRWaWV3IiwKICAgIHByb3BzOiB7CiAgICAgICAgY29udmVyc2F0aW9uSW5mbzogewogICAgICAgICAgICB0eXBlOiBDb252ZXJzYXRpb25JbmZvLAogICAgICAgICAgICByZXF1aXJlZDogdHJ1ZSwKICAgICAgICAgICAgZGVmYXVsdDogbnVsbCwKICAgICAgICB9LAogICAgICAgIGlucHV0T3B0aW9uczogewogICAgICAgICAgICB0eXBlOiBPYmplY3QsCiAgICAgICAgICAgIHJlcXVpcmVkOiBmYWxzZSwKICAgICAgICAgICAgZGVmYXVsdDogKCkgPT4gKHt9KSwKICAgICAgICB9LAogICAgICAgIG11dGVkOiB7CiAgICAgICAgICAgIHR5cGU6IEJvb2xlYW4sCiAgICAgICAgICAgIHJlcXVpcmVkOiB0cnVlLAogICAgICAgICAgICBkZWZhdWx0OiBmYWxzZSwKICAgICAgICB9CiAgICB9LAogICAgZGF0YSgpIHsKICAgICAgICByZXR1cm4gewogICAgICAgICAgICBzaGFyZWRDb252ZXJzYXRpb25TdGF0ZTogc3RvcmUuc3RhdGUuY29udmVyc2F0aW9uLAogICAgICAgICAgICBzaGFyZWRDb250YWN0U3RhdGU6IHN0b3JlLnN0YXRlLmNvbnRhY3QsCiAgICAgICAgICAgIHNoYXJlZE1pc2NTdGF0ZTogc3RvcmUuc3RhdGUubWlzYywKICAgICAgICAgICAgc2hvd0Vtb2ppRGlhbG9nOiBmYWxzZSwKICAgICAgICAgICAgdHJpYnV0ZTogbnVsbCwKICAgICAgICAgICAgbWVudGlvbnM6IFtdLAogICAgICAgICAgICBlbW9qaUNhdGVnb3JpZXM6IGNhdGVnb3JpZXNEZWZhdWx0LAogICAgICAgICAgICBlbW9qaXM6IGVtb2ppc0RlZmF1bHQsCiAgICAgICAgICAgIGxhc3RDb252ZXJzYXRpb25JbmZvOiBudWxsLAogICAgICAgICAgICBzdG9yZURyYWZ0SW50ZXJ2YWxJZDogMCwKICAgICAgICAgICAgdHJpYnV0ZVJlcGxhY2VkOiBmYWxzZSwKICAgICAgICAgICAgZW5hYmxlUHR0OiB3ZmMuaXNDb21tZXJjaWFsU2VydmVyKCkgJiYgQ29uZmlnLkVOQUJMRV9QVFQsCiAgICAgICAgICAgIGFtclJlY29yZGVyOiBudWxsLAogICAgICAgICAgICBsYXN0VHlwaW5nTWVzc2FnZVRpbWVzdGFtcDogMCwKCiAgICAgICAgICAgIGlzUHR0VGFsa2luZzogZmFsc2UsCiAgICAgICAgICAgIGlzUmVjb3JkaW5nOiBmYWxzZSwKICAgICAgICB9CiAgICB9LAogICAgbWV0aG9kczogewogICAgICAgIG9uVHJpYnV0ZVJlcGxhY2VkKGUpIHsKICAgICAgICAgICAgLy8g5q2j5bi45LiL6Z2i6L+Z5Lik6KGM5bqU5b2T5bCx55Sf5pWI5LqG77yM5LiN55+l6YGT5Li65ZWl5LiN55Sf5pWI77yM5omA5Lul6YeH55So5LqG5ZCO6Z2i55qEIHRyaWNrCiAgICAgICAgICAgIGUuZGV0YWlsLmV2ZW50LnByZXZlbnREZWZhdWx0KCk7CiAgICAgICAgICAgIGUuZGV0YWlsLmV2ZW50LnN0b3BQcm9wYWdhdGlvbigpOwoKICAgICAgICAgICAgdGhpcy50cmlidXRlUmVwbGFjZWQgPSB0cnVlOwogICAgICAgIH0sCiAgICAgICAgY2FuaXNlbmQoKSB7CiAgICAgICAgICAgIGxldCB0YXJnZXQgPSB0aGlzLmNvbnZlcnNhdGlvbkluZm8uY29udmVyc2F0aW9uLl90YXJnZXQ7CiAgICAgICAgICAgIGlmICh0YXJnZXQgaW5zdGFuY2VvZiBHcm91cEluZm8pIHsKICAgICAgICAgICAgICAgIGxldCBncm91cEluZm8gPSB0YXJnZXQ7CiAgICAgICAgICAgICAgICBsZXQgZ3JvdXBNZW1iZXIgPSB3ZmMuZ2V0R3JvdXBNZW1iZXIoZ3JvdXBJbmZvLnRhcmdldCwgd2ZjLmdldFVzZXJJZCgpKTsKICAgICAgICAgICAgICAgIGlmIChncm91cEluZm8ubXV0ZSA9PT0gMSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBbR3JvdXBNZW1iZXJUeXBlLk93bmVyLCBHcm91cE1lbWJlclR5cGUuTWFuYWdlciwgR3JvdXBNZW1iZXJUeXBlLkFsbG93ZWRdLmluZGV4T2YoZ3JvdXBNZW1iZXIudHlwZSkgPj0gMAogICAgICAgICAgICAgICAgICAgICAgICB8fCBncm91cE1lbWJlci50eXBlID09PSBHcm91cE1lbWJlclR5cGUuQWxsb3dlZDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgfSwKCiAgICAgICAgY2FuY2VsUXVvdGVNZXNzYWdlKCkgewogICAgICAgICAgICB0aGlzLmNvbnZlcnNhdGlvbkluZm8uX3F1b3RlZE1lc3NhZ2UgPSBudWxsOwogICAgICAgICAgICBzdG9yZS5xdW90ZU1lc3NhZ2UobnVsbCkKICAgICAgICB9LAoKICAgICAgICBvbklucHV0KGUpIHsKICAgICAgICAgICAgdGhpcy5ub3RpZnlUeXBpbmcoVHlwaW5nTWVzc2FnZUNvbnRlbnQuVFlQSU5HX1RFWFQpOwogICAgICAgIH0sCgogICAgICAgIG5vdGlmeVR5cGluZyh0eXBlKSB7CiAgICAgICAgICAgIGlmIChbQ29udmVyc2F0aW9uVHlwZS5TaW5nbGUsIENvbnZlcnNhdGlvblR5cGUuR3JvdXBdLmluZGV4T2YodGhpcy5jb252ZXJzYXRpb25JbmZvLmNvbnZlcnNhdGlvbi50eXBlKSA+PSAwKSB7CiAgICAgICAgICAgICAgICBsZXQgbm93ID0gbmV3IERhdGUoKS5nZXRUaW1lKCk7CiAgICAgICAgICAgICAgICBpZiAobm93IC0gdGhpcy5sYXN0VHlwaW5nTWVzc2FnZVRpbWVzdGFtcCA+IDEwICogMTAwMCkgewogICAgICAgICAgICAgICAgICAgIGxldCB0eXBpbmcgPSBuZXcgVHlwaW5nTWVzc2FnZUNvbnRlbnQodHlwZSk7CiAgICAgICAgICAgICAgICAgICAgd2ZjLnNlbmRDb252ZXJzYXRpb25NZXNzYWdlKHRoaXMuY29udmVyc2F0aW9uSW5mby5jb252ZXJzYXRpb24sIHR5cGluZykKICAgICAgICAgICAgICAgICAgICB0aGlzLmxhc3RUeXBpbmdNZXNzYWdlVGltZXN0YW1wID0gbm93OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfSwKICAgICAgICBhc3luYyBoYW5kbGVQYXN0ZShlLCBzb3VyY2UpIHsKICAgICAgICAgICAgbGV0IHRleHQ7CiAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTsKCiAgICAgICAgICAgIGlmICgoZS5vcmlnaW5hbEV2ZW50IHx8IGUpLmNsaXBib2FyZERhdGEpIHsKICAgICAgICAgICAgICAgIHRleHQgPSAoZS5vcmlnaW5hbEV2ZW50IHx8IGUpLmNsaXBib2FyZERhdGEuZ2V0RGF0YSgndGV4dC9wbGFpbicpOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgdGV4dCA9IGF3YWl0IG5hdmlnYXRvci5jbGlwYm9hcmQucmVhZFRleHQoKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBjb25zb2xlLmxvZygnaGFuZGxlUGFzdGUnLCBlLCBzb3VyY2UpOwogICAgICAgICAgICBpZiAoaXNFbGVjdHJvbigpICYmIGZhbHNlKSB7CiAgICAgICAgICAgICAgICBsZXQgYXJncyA9IGlwY1JlbmRlcmVyLnNlbmRTeW5jKElwY0V2ZW50VHlwZS5GSUxFX1BBU1RFKTsKICAgICAgICAgICAgICAgIGlmIChhcmdzLmhhc0ltYWdlKSB7CiAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnQuZXhlY0NvbW1hbmQoJ2luc2VydFRleHQnLCBmYWxzZSwgJyAnKTsKICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5leGVjQ29tbWFuZCgnaW5zZXJ0SW1hZ2UnLCBmYWxzZSwgJ2xvY2FsLXJlc291cmNlOi8vJyArIGFyZ3MuZmlsZW5hbWUpOwogICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoYXJncy5oYXNGaWxlKSB7CiAgICAgICAgICAgICAgICAgICAgYXJncy5maWxlcy5mb3JFYWNoKGZpbGUgPT4gewogICAgICAgICAgICAgICAgICAgICAgICBzdG9yZS5zZW5kRmlsZSh0aGlzLmNvbnZlcnNhdGlvbkluZm8uY29udmVyc2F0aW9uLCBmaWxlKQogICAgICAgICAgICAgICAgICAgIH0pCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgY29uc3QgZFQgPSBlLmNsaXBib2FyZERhdGEgfHwgd2luZG93LmNsaXBib2FyZERhdGE7CiAgICAgICAgICAgICAgICBpZiAoZFQpIHsKICAgICAgICAgICAgICAgICAgICBsZXQgZmlsZUxpc3QgPSBkVC5maWxlczsKICAgICAgICAgICAgICAgICAgICBpZiAoZmlsZUxpc3QubGVuZ3RoID4gMCkgewogICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGZpbGVMaXN0Lmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgZmlsZSA9IGZpbGVMaXN0Lml0ZW0oaSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnaGFuZGxlIHBhc3RlIGZpbGUnLCBmaWxlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmaWxlLnR5cGUuaW5kZXhPZignaW1hZ2UnKSAhPT0gLTEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpbWFnZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmV4ZWNDb21tYW5kKCdpbnNlcnRJbWFnZScsIGZhbHNlLCBVUkwuY3JlYXRlT2JqZWN0VVJMKGZpbGUpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnN0eWxlSW1hZ2VJbkVkaXRvcigpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBmaWxlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlzRWxlY3Ryb24oKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZnMubHN0YXRTeW5jKGZpbGUucGF0aCkuaXNEaXJlY3RvcnkoKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy4kbm90aWZ5KHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aXRsZTogJ+S4jeaUr+aMgScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dDogdGhpcy4kdCgnY29udmVyc2F0aW9uLm5vdF9zdXBwb3J0X3NlbmRfZm9sZGVyJyksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ3dhcm4nCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVE9ETyDmtY/op4jlmajnq6/vvIzkuI3og73liKTmlq3mmK/lkKbmmK/mlofku7blpLkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZpbGUuc2l6ZSA8IDEwMjQgJiYgZmlsZS50eXBlID09PSAnJykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy4kbm90aWZ5KHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aXRsZTogJ+S4jeaUr+aMgScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dDogdGhpcy4kdCgnY29udmVyc2F0aW9uLm5vdF9zdXBwb3J0X3NlbmRfc3VjaF9maWxlJyksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ3dhcm4nCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0b3JlLnNlbmRGaWxlKHRoaXMuY29udmVyc2F0aW9uSW5mby5jb252ZXJzYXRpb24sIGZpbGUpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgY29uc3QgY2xpcGJvYXJkQ29udGVudHMgPSBhd2FpdCBuYXZpZ2F0b3IuY2xpcGJvYXJkLnJlYWQoKTsKICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgY2xpcGJvYXJkQ29udGVudHMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ2NsaXBib2FyZCBpdGVtJywgaXRlbS50eXBlcywgaXRlbSkKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGl0ZW0udHlwZXMuaW5jbHVkZXMoImltYWdlL3BuZyIpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBibG9iID0gYXdhaXQgaXRlbS5nZXRUeXBlKCJpbWFnZS9wbmciKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmV4ZWNDb21tYW5kKCdpbnNlcnRJbWFnZScsIGZhbHNlLCBVUkwuY3JlYXRlT2JqZWN0VVJMKGJsb2IpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc3R5bGVJbWFnZUluRWRpdG9yKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICh0ZXh0ICYmIHRleHQudHJpbSgpKSB7CiAgICAgICAgICAgICAgICBkb2N1bWVudC5leGVjQ29tbWFuZCgnaW5zZXJ0VGV4dCcsIGZhbHNlLCB0ZXh0KTsKICAgICAgICAgICAgICAgIC8vIFNhZmFyaSDmtY/op4jlmaggZXhlY0NvbW1hbmQg5aSx5pWI77yM5Y+v5Lul6YeH55So5LiL6Z2i6L+Z56eN5pa55byP5aSE55CG57KY6LS0CiAgICAgICAgICAgICAgICAvLyB0aGlzLiRyZWZzLmlucHV0LmlubmVyVGV4dCArPSB0ZXh0OwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgc3R5bGVJbWFnZUluRWRpdG9yKCkgewogICAgICAgICAgICBsZXQgaW1ncyA9IHRoaXMuJHJlZnMuaW5wdXQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ2ltZycpCiAgICAgICAgICAgIGZvciAobGV0IGltZyBvZiBpbWdzKSB7CiAgICAgICAgICAgICAgICBpbWcuc3R5bGUubWF4V2lkdGggPSAnMTAwcHgnOwogICAgICAgICAgICAgICAgaW1nLnN0eWxlLm1heEhlaWdodCA9ICcxMDBweCc7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICBtZW50aW9uKGdyb3VwSWQsIG1lbWJlcklkKSB7CiAgICAgICAgICAgIGxldCBkaXNwbGF5TmFtZSA9IHdmYy5nZXRHcm91cE1lbWJlckRpc3BsYXlOYW1lKGdyb3VwSWQsIG1lbWJlcklkKTsKICAgICAgICAgICAgdGhpcy5tZW50aW9ucy5wdXNoKHsKICAgICAgICAgICAgICAgIGtleTogZGlzcGxheU5hbWUsCiAgICAgICAgICAgICAgICB2YWx1ZTogJ0AnICsgbWVtYmVySWQsCiAgICAgICAgICAgIH0pCiAgICAgICAgICAgIGxldCB0ZXh0ID0gdGhpcy4kcmVmcy5pbnB1dC5pbm5lclRleHQ7CiAgICAgICAgICAgIGxldCBtZW50aW9uVmFsdWU7CiAgICAgICAgICAgIGlmICh0ZXh0LmVuZHNXaXRoKCcgJykpIHsKICAgICAgICAgICAgICAgIG1lbnRpb25WYWx1ZSA9ICdAJyArIGRpc3BsYXlOYW1lICsgJyAnOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgbWVudGlvblZhbHVlID0gJyBAJyArIGRpc3BsYXlOYW1lICsgJyAnOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGRvY3VtZW50LmV4ZWNDb21tYW5kKCdpbnNlcnRUZXh0JywgZmFsc2UsIG1lbnRpb25WYWx1ZSk7CiAgICAgICAgfSwKCiAgICAgICAgaW5zZXJ0VGV4dCh0ZXh0KSB7CiAgICAgICAgICAgIC8vIHRoaXMuJHJlZnNbJ2lucHV0J10uaW5uZXJUZXh0ID0gdGV4dDsKICAgICAgICAgICAgdGhpcy4kcmVmcy5pbnB1dC5mb2N1cygpOwogICAgICAgICAgICBkb2N1bWVudC5leGVjQ29tbWFuZCgnaW5zZXJ0VGV4dCcsIGZhbHNlLCB0ZXh0KTsKICAgICAgICB9LAoKICAgICAgICBjb3B5KCkgewogICAgICAgICAgICBsZXQgdGV4dCA9IHRoaXMuJHJlZnNbJ2lucHV0J10uaW5uZXJUZXh0OwogICAgICAgICAgICBpZiAodGV4dCkgewogICAgICAgICAgICAgICAgY29weVRleHQodGV4dCkKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIGN1dCgpIHsKICAgICAgICAgICAgdGhpcy5jb3B5KCk7CiAgICAgICAgICAgIHRoaXMuJHJlZnNbJ2lucHV0J10uaW5uZXJIVE1MID0gJyc7CiAgICAgICAgfSwKCiAgICAgICAgYXN5bmMgc2VuZChlKSB7CiAgICAgICAgICAgIGlmICh0aGlzLnRyaWJ1dGUgJiYgdGhpcy50cmlidXRlLmlzQWN0aXZlKSB7CiAgICAgICAgICAgICAgICB0aGlzLnRyaWJ1dGVSZXBsYWNlZCA9IGZhbHNlOwogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBsZXQgdGV4dCA9IHRoaXMuJHJlZnNbJ2lucHV0J10udGV4dENvbnRlbnQ7CiAgICAgICAgICAgIC8vIGlmICghdGV4dC50cmltKCkpIHsKICAgICAgICAgICAgLy8gICByZXR1cm47CiAgICAgICAgICAgIC8vIH0KICAgICAgICAgICAgLy8gdGhpcy4kcmVmc1snaW5wdXQnXS50ZXh0Q29udGVudCA9ICcnOwogICAgICAgICAgICAvLyAvLyDlj5HpgIHmtojmga/ml7bvvIzkvJror53mtojmga/liJfooajpnIDopoHmu5rliqjliLDmnIDlkI4KICAgICAgICAgICAgLy8gc3RvcmUuc2V0U2hvdWxkQXV0b1Njcm9sbFRvQm90dG9tKHRydWUpCiAgICAgICAgICAgIC8vCiAgICAgICAgICAgIC8vIGxldCB0ZXh0TWVzc2FnZUNvbnRlbnQgPSB0aGlzLmhhbmRsZU1lbnRpb24odGV4dCkKICAgICAgICAgICAgLy8gbGV0IGNvbnZlcnNhdGlvbiA9IHRoaXMuY29udmVyc2F0aW9uSW5mby5jb252ZXJzYXRpb247CiAgICAgICAgICAgIC8vIHdmYy5zZW5kQ29udmVyc2F0aW9uTWVzc2FnZShjb252ZXJzYXRpb24sIHRleHRNZXNzYWdlQ29udGVudCk7CiAgICAgICAgICAgIC8vCgogICAgICAgICAgICBsZXQgaW5wdXQgPSB0aGlzLiRyZWZzWydpbnB1dCddOwogICAgICAgICAgICBsZXQgbWVzc2FnZSA9IGlucHV0LmlubmVySFRNTC50cmltKCk7CiAgICAgICAgICAgIGxldCBjb252ZXJzYXRpb24gPSB0aGlzLmNvbnZlcnNhdGlvbkluZm8uY29udmVyc2F0aW9uOwoKICAgICAgICAgICAgaWYgKAogICAgICAgICAgICAgICAgIWNvbnZlcnNhdGlvbgogICAgICAgICAgICAgICAgfHwgIXRoaXMuY2FuaXNlbmQoKQogICAgICAgICAgICAgICAgfHwgIW1lc3NhZ2UKICAgICAgICAgICAgKSByZXR1cm47CgogICAgICAgICAgICBpZiAoZS5jdHJsS2V5KSB7CiAgICAgICAgICAgICAgICAvLyBlLnByZXZlbnREZWZhdWx0KCk7CiAgICAgICAgICAgICAgICAvLyB0aGlzLnJlZnMuaW5wdXQuaW5uZXJIVE1MID0gdGhpcy5yZWZzLmlucHV0LmlubmVySFRNTCsgIjxkaXY+PGJyPjwvZGl2PiI7CiAgICAgICAgICAgICAgICBpZiAod2luZG93LmdldFNlbGVjdGlvbikgewogICAgICAgICAgICAgICAgICAgIGxldCBuZXh0Q2hhciA9IHdpbmRvdy5nZXRTZWxlY3Rpb24oKS5mb2N1c05vZGUudGV4dENvbnRlbnQuY2hhckF0KHdpbmRvdy5nZXRTZWxlY3Rpb24oKS5mb2N1c09mZnNldCkKICAgICAgICAgICAgICAgICAgICBpZiAoIW5leHRDaGFyKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmV4ZWNDb21tYW5kKCdJbnNlcnRIVE1MJywgdHJ1ZSwgJzxicj4nKTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIGxldCBzZWxlY3Rpb24gPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKCksCiAgICAgICAgICAgICAgICAgICAgICAgIHJhbmdlID0gc2VsZWN0aW9uLmdldFJhbmdlQXQoMCksCiAgICAgICAgICAgICAgICAgICAgICAgIGJyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiYnIiKTsKICAgICAgICAgICAgICAgICAgICByYW5nZS5kZWxldGVDb250ZW50cygpOwogICAgICAgICAgICAgICAgICAgIHJhbmdlLmluc2VydE5vZGUoYnIpOwogICAgICAgICAgICAgICAgICAgIHJhbmdlLnNldFN0YXJ0QWZ0ZXIoYnIpOwogICAgICAgICAgICAgICAgICAgIHJhbmdlLnNldEVuZEFmdGVyKGJyKTsKICAgICAgICAgICAgICAgICAgICAvLyByYW5nZS5jb2xsYXBzZShmYWxzZSk7CiAgICAgICAgICAgICAgICAgICAgc2VsZWN0aW9uLnJlbW92ZUFsbFJhbmdlcygpOwogICAgICAgICAgICAgICAgICAgIHNlbGVjdGlvbi5hZGRSYW5nZShyYW5nZSk7CiAgICAgICAgICAgICAgICAgICAgLy8gcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBpZighbWVzc2FnZS5zdGFydHNXaXRoKCc8JykpewogICAgICAgICAgICAvLyAgICAgbWVzc2FnZSA9IG1lc3NhZ2UucmVwbGFjZSgvPGJyPi9nLCAnXG4nKS50cmltKCkKICAgICAgICAgICAgLy8gfQoKICAgICAgICAgICAgbGV0IGltZ3MgPSBbLi4uaW5wdXQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ2ltZycpXTsKICAgICAgICAgICAgaWYgKGltZ3MpIHsKICAgICAgICAgICAgICAgIGZvciAoY29uc3QgaW1nIG9mIGltZ3MpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoaW1nLmNsYXNzTmFtZS5pbmRleE9mKCdlbW9qaScpID49IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGxldCBzcmMgPSBpbWcuc3JjOwogICAgICAgICAgICAgICAgICAgIGxldCBmaWxlOwogICAgICAgICAgICAgICAgICAgIC8vIOaIquWbvgogICAgICAgICAgICAgICAgICAgIGlmIChpc0VsZWN0cm9uKCkgJiYgc3JjLnN0YXJ0c1dpdGgoJ2xvY2FsLXJlc291cmNlJykpIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gJ2xvY2FsLXJlc291cmNlOi8vJyArIOe7neWvuei3r+W+hAogICAgICAgICAgICAgICAgICAgICAgICBmaWxlID0gZGVjb2RlVVJJKHNyYy5zdWJzdHJpbmcoMTcsIHNyYy5sZW5ndGgpKTsKICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3JjLnN0YXJ0c1dpdGgoJ2Jsb2I6JykpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBibG9iID0gYXdhaXQgZmV0Y2goc3JjKS50aGVuKHIgPT4gci5ibG9iKCkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZSA9IG5ldyBGaWxlKFtibG9iXSwgbmV3IERhdGUoKS5nZXRUaW1lKCkgKyAnLnBuZycpOwogICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZSA9IGZpbGVGcm9tRGF0YVVyaShzcmMsIG5ldyBEYXRlKCkuZ2V0VGltZSgpICsgJy5wbmcnKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB0aGlzLiRldmVudEJ1cy4kZW1pdCgndXBsb2FkRmlsZScsIGZpbGUpCiAgICAgICAgICAgICAgICAgICAgc3RvcmUuc2V0U2hvdWxkQXV0b1Njcm9sbFRvQm90dG9tKHRydWUpOwogICAgICAgICAgICAgICAgICAgIHN0b3JlLnNlbmRGaWxlKHRoaXMuY29udmVyc2F0aW9uSW5mby5jb252ZXJzYXRpb24sIGZpbGUpCiAgICAgICAgICAgICAgICAgICAgLy8g5Lya5b2x5ZONIGlucHV0LmdldEVsZW1lbnRzQnlUYWdOYW1lIOi/lOWbnueahOaVsOe7hO+8jOaJgOS7peS4iumdouaLt+i0neS6huS4gOS4iwogICAgICAgICAgICAgICAgICAgIGltZy5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGltZyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgbWVzc2FnZSA9IGlucHV0LmlubmVySFRNTC50cmltKCk7CiAgICAgICAgICAgIG1lc3NhZ2UgPSBtZXNzYWdlCiAgICAgICAgICAgICAgICAucmVwbGFjZSgvPGRpdj48YnI+PFwvZGl2Pi9nLCAnXG4nKQogICAgICAgICAgICAgICAgLnJlcGxhY2UoLzxicj4vZywgJ1xuJykKICAgICAgICAgICAgICAgIC5yZXBsYWNlKC88ZGl2Pi9nLCAnXG4nKQogICAgICAgICAgICAgICAgLnJlcGxhY2UoLzxcL2Rpdj4vZywgJycpCiAgICAgICAgICAgICAgICAucmVwbGFjZSgvPGI+L2csICcnKQogICAgICAgICAgICAgICAgLnJlcGxhY2UoLzxcL2I+L2csICcnKQogICAgICAgICAgICAgICAgLnJlcGxhY2UoLyZsdDsvZywgJzwnKQogICAgICAgICAgICAgICAgLnJlcGxhY2UoLyZndDsvZywgJz4nKQogICAgICAgICAgICAgICAgLnJlcGxhY2UoLyZuYnNwOy9nLCAnICcpCiAgICAgICAgICAgICAgICAucmVwbGFjZSgvJmFtcDsvZywgJyYnKQoKCiAgICAgICAgICAgIC8vICDoh6rooYzpg6jnvbLooajmg4Xml7bvvIzpnIDopoHmiYvliqjmm7/mjaLkuIvpnaLnmoTmraPliJkKICAgICAgICAgICAgLy8gVE9ETyDlnKjmraPliJnkuK3kvb/nlKjlj5jph4/vvIzpgb/lhY3miYvliqjmm7/mjaIKICAgICAgICAgICAgbGV0IHAgPSBgIiBzcmM9IiR7Q29uZmlnLmVtb2ppQmFzZVVybCgpfTcyeDcyXFwvWzAtOWEtei1dK1xcLnBuZyI+YAogICAgICAgICAgICBsZXQgcmUgPSBuZXcgUmVnRXhwKHAsICdnJyk7CiAgICAgICAgICAgIG1lc3NhZ2UgPSBtZXNzYWdlLnJlcGxhY2UoLzxpbWcgY2xhc3M9ImVtb2ppIiBkcmFnZ2FibGU9ImZhbHNlIiBhbHQ9Ii9nLCAnJykKICAgICAgICAgICAgICAgIC5yZXBsYWNlKHJlLCAnJykKCiAgICAgICAgICAgIGlmIChtZXNzYWdlICYmIG1lc3NhZ2UudHJpbSgpKSB7CiAgICAgICAgICAgICAgICBsZXQgdGV4dE1lc3NhZ2VDb250ZW50ID0gdGhpcy5oYW5kbGVNZW50aW9uKG1lc3NhZ2UpOwogICAgICAgICAgICAgICAgbGV0IHF1b3RlZE1lc3NhZ2UgPSB0aGlzLnNoYXJlZENvbnZlcnNhdGlvblN0YXRlLnF1b3RlZE1lc3NhZ2U7CiAgICAgICAgICAgICAgICBpZiAocXVvdGVkTWVzc2FnZSkgewogICAgICAgICAgICAgICAgICAgIGxldCBxdW90ZUluZm8gPSBRdW90ZUluZm8uaW5pdFdpdGhNZXNzYWdlKHF1b3RlZE1lc3NhZ2UpOwogICAgICAgICAgICAgICAgICAgIHRleHRNZXNzYWdlQ29udGVudC5zZXRRdW90ZUluZm8ocXVvdGVJbmZvKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHN0b3JlLnNldFNob3VsZEF1dG9TY3JvbGxUb0JvdHRvbSh0cnVlKTsKICAgICAgICAgICAgICAgIHdmYy5zZW5kQ29udmVyc2F0aW9uTWVzc2FnZShjb252ZXJzYXRpb24sIHRleHRNZXNzYWdlQ29udGVudCk7CiAgICAgICAgICAgICAgICB0aGlzLiRyZWZzWydpbnB1dCddLmlubmVySFRNTCA9ICcnOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpbnB1dC5pbm5lckhUTUwgPSAnJzsKICAgICAgICAgICAgc3RvcmUucXVvdGVNZXNzYWdlKG51bGwpOwogICAgICAgICAgICB0aGlzLmNvbnZlcnNhdGlvbkluZm8uX3F1b3RlZE1lc3NhZ2UgPSBudWxsOwogICAgICAgICAgICBEcmFmdC5zZXRDb252ZXJzYXRpb25EcmFmdChjb252ZXJzYXRpb24sICcnLCBudWxsLCBudWxsKTsKICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpOwogICAgICAgIH0sCgogICAgICAgIHRvZ2dsZUVtb2ppVmlldygpIHsKICAgICAgICAgICAgdGhpcy5zaG93RW1vamlEaWFsb2cgPSAhdGhpcy5zaG93RW1vamlEaWFsb2c7CiAgICAgICAgICAgIHRoaXMuZm9jdXNJbnB1dCgpOwogICAgICAgIH0sCgogICAgICAgIHNjcmVlblNob3QoaGlkZUN1cnJlbnRXaW5kb3cgPSBmYWxzZSkgewogICAgICAgICAgICBpZiAoaGlkZUN1cnJlbnRXaW5kb3cpIHsKICAgICAgICAgICAgICAgIGN1cnJlbnRXaW5kb3cuaGlkZSgpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdzY3JlZW5TaG90JywgaGlkZUN1cnJlbnRXaW5kb3cpOwogICAgICAgICAgICBpcGNSZW5kZXJlci5zZW5kKElwY0V2ZW50VHlwZS5TVEFSVF9TQ1JFRU5fU0hPVCwge30pOwogICAgICAgIH0sCiAgICAgICAgc2hvd01lc3NhZ2VIaXN0b3J5KCkgewogICAgICAgICAgICBsZXQgaGFzaCA9IHdpbmRvdy5sb2NhdGlvbi5oYXNoOwogICAgICAgICAgICBsZXQgdXJsID0gd2luZG93LmxvY2F0aW9uLm9yaWdpbjsKICAgICAgICAgICAgaWYgKGhhc2gpIHsKICAgICAgICAgICAgICAgIHVybCA9IHdpbmRvdy5sb2NhdGlvbi5ocmVmLnJlcGxhY2UoaGFzaCwgJyMvY29udmVyc2F0aW9uLW1lc3NhZ2UtaGlzdG9yeScpOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgdXJsICs9ICIvY29udmVyc2F0aW9uLW1lc3NhZ2UtaGlzdG9yeSIKICAgICAgICAgICAgfQogICAgICAgICAgICBsZXQgY29udmVyc2F0aW9uID0gdGhpcy5jb252ZXJzYXRpb25JbmZvLmNvbnZlcnNhdGlvbjsKICAgICAgICAgICAgaXBjUmVuZGVyZXIuc2VuZChJcGNFdmVudFR5cGUuc2hvd0NvbnZlcnNhdGlvbk1lc3NhZ2VIaXN0b3J5UGFnZSwgewogICAgICAgICAgICAgICAgdXJsOiB1cmwsCiAgICAgICAgICAgICAgICB0eXBlOiBjb252ZXJzYXRpb24udHlwZSwKICAgICAgICAgICAgICAgIHRhcmdldDogY29udmVyc2F0aW9uLnRhcmdldCwKICAgICAgICAgICAgICAgIGxpbmU6IGNvbnZlcnNhdGlvbi5saW5lLAogICAgICAgICAgICB9KTsKICAgICAgICAgICAgY29uc29sZS5sb2coSXBjRXZlbnRUeXBlLnNob3dDb252ZXJzYXRpb25NZXNzYWdlSGlzdG9yeVBhZ2UsIHVybCkKICAgICAgICB9LAoKICAgICAgICBoaWRlRW1vamlWaWV3KGUpIHsKICAgICAgICAgICAgaWYgKGUudGFyZ2V0LmlkICE9PSAnc2hvd0Vtb2ppJykgewogICAgICAgICAgICAgICAgdGhpcy5zaG93RW1vamlEaWFsb2cgPSBmYWxzZTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIG9uU2VsZWN0RW1vamkoZW1vamkpIHsKICAgICAgICAgICAgdGhpcy5zaG93RW1vamlEaWFsb2cgPSBmYWxzZTsKICAgICAgICAgICAgaWYgKGVtb2ppLmRhdGEuaW5kZXhPZignaHR0cCcpID49IDApIHsKICAgICAgICAgICAgICAgIGxldCBzdGlja2VyID0gbmV3IFN0aWNrZXJNZXNzYWdlQ29udGVudCgnJywgZW1vamkuZGF0YSwgMjAwLCAyMDApCiAgICAgICAgICAgICAgICB3ZmMuc2VuZENvbnZlcnNhdGlvbk1lc3NhZ2UodGhpcy5jb252ZXJzYXRpb25JbmZvLmNvbnZlcnNhdGlvbiwgc3RpY2tlcik7CgogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CgogICAgICAgICAgICB0aGlzLiRyZWZzLmlucHV0LmZvY3VzKCk7CiAgICAgICAgICAgIHRoaXMuaW5zZXJ0SFRNTChlbW9qaVBhcnNlKGVtb2ppLmRhdGEpKTsKICAgICAgICAgICAgdGhpcy5mb2N1c0lucHV0KCk7CiAgICAgICAgfSwKCiAgICAgICAgY3JlYXRlRWxlbWVudEZyb21IVE1MKGh0bWxTdHJpbmcpIHsKICAgICAgICAgICAgbGV0IGRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpOwogICAgICAgICAgICBkaXYuaW5uZXJIVE1MID0gaHRtbFN0cmluZy50cmltKCk7CgogICAgICAgICAgICAvLyBDaGFuZ2UgdGhpcyB0byBkaXYuY2hpbGROb2RlcyB0byBzdXBwb3J0IG11bHRpcGxlIHRvcC1sZXZlbCBub2RlcwogICAgICAgICAgICByZXR1cm4gZGl2LmZpcnN0Q2hpbGQ7CiAgICAgICAgfSwKCgogICAgICAgIGluc2VydEhUTUwoaHRtbCkgewogICAgICAgICAgICBsZXQgc2VsLCByYW5nZTsKCiAgICAgICAgICAgIGlmICh3aW5kb3cuZ2V0U2VsZWN0aW9uICYmIChzZWwgPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKCkpKSB7CiAgICAgICAgICAgICAgICByYW5nZSA9IHNlbC5nZXRSYW5nZUF0KDApOwogICAgICAgICAgICAgICAgcmFuZ2UuY29sbGFwc2UodHJ1ZSk7CiAgICAgICAgICAgICAgICBsZXQgaW1nRW1vamkgPSB0aGlzLmNyZWF0ZUVsZW1lbnRGcm9tSFRNTChodG1sKTsKICAgICAgICAgICAgICAgIHJhbmdlLmluc2VydE5vZGUoaW1nRW1vamkpOwoKICAgICAgICAgICAgICAgIC8vIE1vdmUgdGhlIGNhcmV0IGltbWVkaWF0ZWx5IGFmdGVyIHRoZSBpbnNlcnRlZCBzcGFuCiAgICAgICAgICAgICAgICByYW5nZS5zZXRTdGFydEFmdGVyKGltZ0Vtb2ppKTsKICAgICAgICAgICAgICAgIHJhbmdlLmNvbGxhcHNlKHRydWUpOwogICAgICAgICAgICAgICAgc2VsLnJlbW92ZUFsbFJhbmdlcygpOwogICAgICAgICAgICAgICAgc2VsLmFkZFJhbmdlKHJhbmdlKTsKICAgICAgICAgICAgfSBlbHNlIGlmIChkb2N1bWVudC5zZWxlY3Rpb24gJiYgZG9jdW1lbnQuc2VsZWN0aW9uLmNyZWF0ZVJhbmdlKSB7CiAgICAgICAgICAgICAgICBkb2N1bWVudC5zZWxlY3Rpb24uY3JlYXRlUmFuZ2UoKS50ZXh0ID0gaHRtbDsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIHBpY2tGaWxlKCkgewogICAgICAgICAgICB0aGlzLiRyZWZzWydmaWxlSW5wdXQnXS5jbGljaygpOwogICAgICAgICAgICB0aGlzLm5vdGlmeVR5cGluZyhUeXBpbmdNZXNzYWdlQ29udGVudC5UWVBJTkdfRklMRSk7CiAgICAgICAgfSwKCiAgICAgICAgc3RhcnRBdWRpb0NhbGwoKSB7CiAgICAgICAgICAgIGNvbnNvbGUubG9nKGBzdGFydEF1ZGlvQ2FsbCBmcm9tIG1haW5XaW5kb3cgJHt0aGlzLnNoYXJlZE1pc2NTdGF0ZS5pc01haW5XaW5kb3d9YCk7CiAgICAgICAgICAgIGxldCBjb252ZXJzYXRpb24gPSB0aGlzLmNvbnZlcnNhdGlvbkluZm8uY29udmVyc2F0aW9uOwogICAgICAgICAgICB0aGlzLiRzdGFydFZvaXBDYWxsKHthdWRpb09ubHk6IHRydWUsIGNvbnZlcnNhdGlvbjogY29udmVyc2F0aW9ufSk7CiAgICAgICAgfSwKCiAgICAgICAgc3RhcnRWaWRlb0NhbGwoKSB7CiAgICAgICAgICAgIGNvbnNvbGUubG9nKGBzdGFydFZpZGVvQ2FsbCBmcm9tIG1haW5XaW5kb3cgJHt0aGlzLnNoYXJlZE1pc2NTdGF0ZS5pc01haW5XaW5kb3d9YCk7CiAgICAgICAgICAgIGxldCBjb252ZXJzYXRpb24gPSB0aGlzLmNvbnZlcnNhdGlvbkluZm8uY29udmVyc2F0aW9uOwogICAgICAgICAgICB0aGlzLiRzdGFydFZvaXBDYWxsKHthdWRpb09ubHk6IGZhbHNlLCBjb252ZXJzYXRpb246IGNvbnZlcnNhdGlvbn0pOwogICAgICAgIH0sCgogICAgICAgIHRvZ2dsZUNoYW5uZWxNZW51KHRvZ2dsZSA9IHRydWUpIHsKICAgICAgICAgICAgaWYgKHRvZ2dsZSkgewogICAgICAgICAgICAgICAgdGhpcy4kcGFyZW50LiRyZWZzWydjb252ZXJzYXRpb25NZXNzYWdlTGlzdCddLnN0eWxlLmZsZXhHcm93ID0gMTsKICAgICAgICAgICAgICAgIHRoaXMuc3RvcmVEcmFmdCh0aGlzLmxhc3RDb252ZXJzYXRpb25JbmZvKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIGlmICh0aGlzLiRwYXJlbnQubWVzc2FnZUlucHV0Vmlld1Jlc2l6ZWQpIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLiRwYXJlbnQuJHJlZnNbJ2NvbnZlcnNhdGlvbk1lc3NhZ2VMaXN0J10uc3R5bGUuZmxleEdyb3cgPSAwOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIHN0b3JlLnRvZ2dsZUNoYW5uZWxNZW51KHRvZ2dsZSk7CiAgICAgICAgfSwKCiAgICAgICAgb25QaWNrRmlsZShldmVudCkgewogICAgICAgICAgICAvLyB0aGlzLmJhdGNoUHJvY2VzcyhlLnRhcmdldC5maWxlc1swXSk7CiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdvblBpY2tGaWxlJywgZXZlbnQudGFyZ2V0LmZpbGVzWzBdKTsKICAgICAgICAgICAgbGV0IGZpbGUgPSBldmVudC50YXJnZXQuZmlsZXNbMF07CiAgICAgICAgICAgIGV2ZW50LnRhcmdldC52YWx1ZSA9ICcnOwoKICAgICAgICAgICAgLy8gVE9ETwogICAgICAgICAgICAvLyB2YXIgc2hvd01lc3NhZ2UgPSBzbmFja2Jhci5zaG93TWVzc2FnZTsKICAgICAgICAgICAgLy8KICAgICAgICAgICAgLy8gaWYgKCFmaWxlIHx8IGZpbGUuc2l6ZSA9PT0gMCkgewogICAgICAgICAgICAvLyAgIHNob3dNZXNzYWdlKCdZb3UgY2FuXCd0IHNlbmQgYW4gZW1wdHkgZmlsZS4nKTsKICAgICAgICAgICAgLy8gICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgIC8vIH0KICAgICAgICAgICAgLy8KICAgICAgICAgICAgLy8gaWYgKCFmaWxlCiAgICAgICAgICAgIC8vICAgICB8fCBmaWxlLnNpemUgPj0gMTAwICogMTAyNCAqIDEwMjQpIHsKICAgICAgICAgICAgLy8gICBzaG93TWVzc2FnZSgnU2VuZCBmaWxlIG5vdCBhbGxvd2VkIHRvIGV4Y2VlZCAxMDBNLicpOwogICAgICAgICAgICAvLyAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgLy8gfQogICAgICAgICAgICBpZiAoaXNFbGVjdHJvbigpKSB7CiAgICAgICAgICAgICAgICBpZiAobmV3IERhdGUoKS5nZXRUaW1lKCkgLSBmaWxlLmxhc3RNb2RpZmllZCA8IDMwICogMTAwMCAmJiBmaWxlLnBhdGguaW5kZXhPZignL3Zhci9mb2xkZXJzJykgPT09IDApIHsKICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnbm90IHN1cHBvcnQgZmlsZScsIGZpbGUpCiAgICAgICAgICAgICAgICAgICAgdGhpcy4kbm90aWZ5KHsKICAgICAgICAgICAgICAgICAgICAgICAgdGV4dDogJyDkuI3mlK/mjIHnmoTmlofku7bnsbvlnosnLAogICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAnd2FybicKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdGhpcy4kZXZlbnRCdXMuJGVtaXQoJ3VwbG9hZEZpbGUnLCBmaWxlKQogICAgICAgICAgICBzdG9yZS5zZW5kRmlsZSh0aGlzLmNvbnZlcnNhdGlvbkluZm8uY29udmVyc2F0aW9uLCBmaWxlKTsKICAgICAgICB9LAoKICAgICAgICBpbml0RW1vamlQaWNrZXIoKSB7CiAgICAgICAgICAgIHdpbmRvdy5fX3R3ZW1vamlfYmFzZV91cmxfXyA9IENvbmZpZy5lbW9qaUJhc2VVcmwoKTsKICAgICAgICAgICAgbGV0IGNvbmZpZyA9IGVtb2ppQ29uZmlnKCk7CiAgICAgICAgICAgIGlmICh0aGlzLmNvbnZlcnNhdGlvbkluZm8uY29udmVyc2F0aW9uLnR5cGUgPT09IENvbnZlcnNhdGlvblR5cGUuU2VjcmV0Q2hhdCkgewogICAgICAgICAgICAgICAgdGhpcy5lbW9qaUNhdGVnb3JpZXMgPSBjb25maWcuZW1vamlDYXRlZ29yaWVzLmZpbHRlcihjID0+ICFjLm5hbWUuc3RhcnRzV2l0aCgnU3RpY2tlcicpKTsKICAgICAgICAgICAgICAgIHRoaXMuZW1vamlzID0gY29uZmlnLmVtb2ppcy5maWx0ZXIoYyA9PiAhYy5jYXRlZ29yeS5zdGFydHNXaXRoKCdTdGlja2VyJykpOwogICAgICAgICAgICAgICAgdGhpcy4kcmVmcy5lbW9qaVBpY2tlci5jaGFuZ2VDYXRlZ29yeSh7bmFtZTogJ1Blb3BsZXMnfSk7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICB0aGlzLmVtb2ppQ2F0ZWdvcmllcyA9IGNvbmZpZy5lbW9qaUNhdGVnb3JpZXM7CiAgICAgICAgICAgICAgICB0aGlzLmVtb2ppcyA9IGNvbmZpZy5lbW9qaXM7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICBpbml0TWVudGlvbihjb252ZXJzYXRpb24pIHsKICAgICAgICAgICAgLy8gVE9ETyBncm91cCwgY2hhbm5lbAoKICAgICAgICAgICAgaWYgKHRoaXMudHJpYnV0ZSkgewogICAgICAgICAgICAgICAgdGhpcy50cmlidXRlLmRldGFjaCh0aGlzLiRyZWZzWydpbnB1dCddKTsKICAgICAgICAgICAgICAgIHRoaXMudHJpYnV0ZSA9IG51bGw7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgbGV0IHR5cGUgPSBjb252ZXJzYXRpb24uY29udmVyc2F0aW9uVHlwZTsKICAgICAgICAgICAgaWYgKHR5cGUgPT09IENvbnZlcnNhdGlvblR5cGUuU2luZ2xlCiAgICAgICAgICAgICAgICB8fCB0eXBlID09PSBDb252ZXJzYXRpb25UeXBlLkNoYXRSb29tIHx8IHR5cGUgPT09IENvbnZlcnNhdGlvblR5cGUuQ2hhbm5lbCkgewogICAgICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGxldCBtZW50aW9uTWVudUl0ZW1zID0gW107CiAgICAgICAgICAgIGxldCBncm91cEluZm8gPSB3ZmMuZ2V0R3JvdXBJbmZvKGNvbnZlcnNhdGlvbi50YXJnZXQpOwogICAgICAgICAgICBtZW50aW9uTWVudUl0ZW1zLnB1c2goewogICAgICAgICAgICAgICAga2V5OiB0aGlzLiR0KCdjb252ZXJzYXRpb24uYWxsX3Blb3BsZScpLAogICAgICAgICAgICAgICAgdmFsdWU6ICdAJyArIGNvbnZlcnNhdGlvbi50YXJnZXQsCiAgICAgICAgICAgICAgICBhdmF0YXI6IGdyb3VwSW5mby5wb3J0cmFpdCA/IGdyb3VwSW5mby5wb3J0cmFpdCA6IENvbmZpZy5ERUZBVUxUX0dST1VQX1BPUlRSQUlUX1VSTCwKICAgICAgICAgICAgICAgIC8vc2VhcmNoS2V5OiAn5omA5pyJ5Lq6JyArIHBpbnlpbi5sZXR0ZXIoJ+aJgOacieS6uicsICcnLCBudWxsKQogICAgICAgICAgICAgICAgc2VhcmNoS2V5OiB0aGlzLiR0KCdjb252ZXJzYXRpb24uYWxsX3Blb3BsZScpICsgJ3N1b3lvdXJlbicgKyAnc3lyJwogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIGxldCBncm91cE1lbWJlclVzZXJJbmZvcyA9IHN0b3JlLmdldEdyb3VwTWVtYmVyVXNlckluZm9zKGNvbnZlcnNhdGlvbi50YXJnZXQsIGZhbHNlKTsKICAgICAgICAgICAgZ3JvdXBNZW1iZXJVc2VySW5mb3MuZm9yRWFjaCgoZSkgPT4gewogICAgICAgICAgICAgICAgbWVudGlvbk1lbnVJdGVtcy5wdXNoKHsKICAgICAgICAgICAgICAgICAgICBrZXk6IGUuX2Rpc3BsYXlOYW1lLAogICAgICAgICAgICAgICAgICAgIHZhbHVlOiAnQCcgKyBlLnVpZCwKICAgICAgICAgICAgICAgICAgICBhdmF0YXI6IGUucG9ydHJhaXQsCiAgICAgICAgICAgICAgICAgICAgc2VhcmNoS2V5OiBlLl9kaXNwbGF5TmFtZSArIGUuX3BpbnlpbiArIGUuX2ZpcnN0TGV0dGVycywKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIHRoaXMudHJpYnV0ZSA9IG5ldyBUcmlidXRlKHsKICAgICAgICAgICAgICAgIHZhbHVlczogbWVudGlvbk1lbnVJdGVtcywKICAgICAgICAgICAgICAgIHNlbGVjdFRlbXBsYXRlOiAoaXRlbSkgPT4gewogICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgaXRlbSA9PT0gJ3VuZGVmaW5lZCcpIHJldHVybiBudWxsOwogICAgICAgICAgICAgICAgICAgIC8vIGlmICh0aGlzLnJhbmdlLmlzQ29udGVudEVkaXRhYmxlKHRoaXMuY3VycmVudC5lbGVtZW50KSkgewogICAgICAgICAgICAgICAgICAgIC8vICAgICByZXR1cm4gJzxzcGFuIGNvbnRlbnRlZGl0YWJsZT0iZmFsc2UiPjxhIGhyZWY9Imh0dHA6Ly96dXJiLmNvbSIgdGFyZ2V0PSJfYmxhbmsiIHRpdGxlPSInICsgaXRlbS5vcmlnaW5hbC5lbWFpbCArICciPicgKyBpdGVtLm9yaWdpbmFsLnZhbHVlICsgJzwvYT48L3NwYW4+JzsKICAgICAgICAgICAgICAgICAgICAvLyB9CiAgICAgICAgICAgICAgICAgICAgdGhpcy5tZW50aW9ucy5wdXNoKHtrZXk6IGl0ZW0ub3JpZ2luYWwua2V5LCB2YWx1ZTogaXRlbS5vcmlnaW5hbC52YWx1ZX0pOwoKICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ0AnICsgaXRlbS5vcmlnaW5hbC5rZXk7CiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgbWVudUl0ZW1UZW1wbGF0ZTogZnVuY3Rpb24gKGl0ZW0pIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gJzxpbWcgd2lkdGg9IjI0IiBoZWlnaHQ9IjI0IiBzcmM9IicgKyBpdGVtLm9yaWdpbmFsLmF2YXRhciArICcgIj4gJyArIGl0ZW0ub3JpZ2luYWwua2V5OwogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIG5vTWF0Y2hUZW1wbGF0ZTogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiAnPHNwYW4gc3R5bGU6InZpc2liaWxpdHk6IGhpZGRlbjsiPjwvc3Bhbj4nOwogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIGxvb2t1cDogKGl0ZW0pID0+IHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gaXRlbS5zZWFyY2hLZXk7CiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgbWVudUNvbnRhaW5lcjogZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NvbnZlcnNhdGlvbi1jb250ZW50JyksCiAgICAgICAgICAgIH0pOwogICAgICAgICAgICB0aGlzLnRyaWJ1dGUuYXR0YWNoKHRoaXMuJHJlZnNbJ2lucHV0J10pOwogICAgICAgIH0sCgogICAgICAgIGhhbmRsZU1lbnRpb24odGV4dCkgewogICAgICAgICAgICBsZXQgdGV4dE1lc3NhZ2VDb250ZW50ID0gbmV3IFRleHRNZXNzYWdlQ29udGVudCgpOwogICAgICAgICAgICB0ZXh0TWVzc2FnZUNvbnRlbnQuY29udGVudCA9IHRleHQudHJpbSgpOwogICAgICAgICAgICB0aGlzLm1lbnRpb25zLmZvckVhY2goZSA9PiB7CiAgICAgICAgICAgICAgICBpZiAodGV4dC5pbmRleE9mKGUua2V5KSA+IC0xKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKGUudmFsdWUgPT09ICdAJyArIHRoaXMuY29udmVyc2F0aW9uSW5mby5jb252ZXJzYXRpb24udGFyZ2V0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRleHRNZXNzYWdlQ29udGVudC5tZW50aW9uZWRUeXBlID0gMjsKICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAodGV4dE1lc3NhZ2VDb250ZW50Lm1lbnRpb25lZFR5cGUgIT09IDIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHRNZXNzYWdlQ29udGVudC5tZW50aW9uZWRUeXBlID0gMTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHRNZXNzYWdlQ29udGVudC5tZW50aW9uZWRUYXJnZXRzLnB1c2goZS52YWx1ZS5zdWJzdHJpbmcoMSkpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIHRoaXMubWVudGlvbnMubGVuZ3RoID0gMDsKICAgICAgICAgICAgcmV0dXJuIHRleHRNZXNzYWdlQ29udGVudDsKICAgICAgICB9LAoKICAgICAgICBmb2N1c0lucHV0KCkgewogICAgICAgICAgICB0aGlzLiRuZXh0VGljaygoKSA9PiB7CiAgICAgICAgICAgICAgICBpZiAodGhpcy4kcmVmc1snaW5wdXQnXSkgewogICAgICAgICAgICAgICAgICAgIHRoaXMuJHJlZnNbJ2lucHV0J10uZm9jdXMoKTsKICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnZm9jdXMgZW5kJykKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSkKICAgICAgICB9LAoKICAgICAgICBtb3ZlQ3Vyc29yVG9FbmQoY29udGVudEVkaXRhYmxlRGl2KSB7CgogICAgICAgICAgICBsZXQgcmFuZ2UgPSBkb2N1bWVudC5jcmVhdGVSYW5nZSgpOwogICAgICAgICAgICByYW5nZS5zZWxlY3ROb2RlQ29udGVudHMoY29udGVudEVkaXRhYmxlRGl2KTsKICAgICAgICAgICAgcmFuZ2UuY29sbGFwc2UoZmFsc2UpOwogICAgICAgICAgICBsZXQgc2VsID0gd2luZG93LmdldFNlbGVjdGlvbigpOwogICAgICAgICAgICBzZWwucmVtb3ZlQWxsUmFuZ2VzKCk7CiAgICAgICAgICAgIHNlbC5hZGRSYW5nZShyYW5nZSk7CiAgICAgICAgfSwKCiAgICAgICAgcmVzdG9yZURyYWZ0KCkgewogICAgICAgICAgICBsZXQgZHJhZnQgPSBEcmFmdC5nZXRDb252ZXJzYXRpb25EcmFmdEV4KHRoaXMuY29udmVyc2F0aW9uSW5mbyk7CiAgICAgICAgICAgIGlmICghZHJhZnQpIHsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQogICAgICAgICAgICBjb25zb2xlLmxvZygncmVzdG9yZSBkcmFmdCcsIHRoaXMuY29udmVyc2F0aW9uSW5mbywgZHJhZnQpOwogICAgICAgICAgICBzdG9yZS5xdW90ZU1lc3NhZ2UoZHJhZnQucXVvdGVkTWVzc2FnZSk7CiAgICAgICAgICAgIGxldCBpbnB1dCA9IHRoaXMuJHJlZnNbJ2lucHV0J107CiAgICAgICAgICAgIGlmIChpbnB1dC5pbm5lckhUTUwudHJpbSgpKSB7CiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnaW5wdXR0aW5nLCBpZ25vcmUnLCBkcmFmdC50ZXh0KQogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgaW5wdXQuaW5uZXJIVE1MID0gZHJhZnQudGV4dC5yZXBsYWNlKC8gL2csICcmbmJzcCcpLnJlcGxhY2UoL1xuL2csICc8YnI+Jyk7CiAgICAgICAgICAgICAgICB0aGlzLm1vdmVDdXJzb3JUb0VuZChpbnB1dCk7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICBzdG9yZURyYWZ0KGNvbnZlcnNhdGlvbkluZm8pIHsKICAgICAgICAgICAgaWYgKCF0aGlzLiRyZWZzWydpbnB1dCddKSB7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KICAgICAgICAgICAgbGV0IGRyYWZ0VGV4dCA9IHRoaXMuJHJlZnNbJ2lucHV0J10uaW5uZXJIVE1MLnRyaW0oKTsKICAgICAgICAgICAgbGV0IHAgPSBgIiBzcmM9IiR7Q29uZmlnLmVtb2ppQmFzZVVybCgpfTcyeDcyXFwvWzAtOWEtei1dK1xcLnBuZyI+YAogICAgICAgICAgICBsZXQgcmUgPSBuZXcgUmVnRXhwKHAsICdnJyk7CiAgICAgICAgICAgIGRyYWZ0VGV4dCA9IGRyYWZ0VGV4dAogICAgICAgICAgICAgICAgLnJlcGxhY2UoLzxicj4vZywgJ1xuJykKICAgICAgICAgICAgICAgIC5yZXBsYWNlKC88ZGl2Pi9nLCAnXG4nKQogICAgICAgICAgICAgICAgLnJlcGxhY2UoLzxcL2Rpdj4vZywgJycpCiAgICAgICAgICAgICAgICAucmVwbGFjZSgvPGRpdj48XC9kaXY+L2csICcgJykKICAgICAgICAgICAgICAgIC5yZXBsYWNlKC8mbmJzcDsvZywgJyAnKQogICAgICAgICAgICAgICAgLnJlcGxhY2UoLzxpbWcgY2xhc3M9ImVtb2ppIiBkcmFnZ2FibGU9ImZhbHNlIiBhbHQ9Ii9nLCAnJykKICAgICAgICAgICAgICAgIC5yZXBsYWNlKHJlLCAnJykKICAgICAgICAgICAgICAgIC5yZXBsYWNlKC88aW1nIHNyYz0ibG9jYWwtcmVzb3VyY2U6LioiPi9nLCAnJykKICAgICAgICAgICAgICAgIC50cmltU3RhcnQoKQogICAgICAgICAgICAgICAgLnJlcGxhY2UoL1xzKyQvZywgJyAnKTsKCiAgICAgICAgICAgIGxldCBtZW50aW9ucyA9IFtdOwogICAgICAgICAgICB0aGlzLm1lbnRpb25zLmZvckVhY2goZSA9PiB7CiAgICAgICAgICAgICAgICBsZXQgbWVudGlvbjsKICAgICAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgICAgICogIGUua2V5OiAiMTM4NjY2NjY2NjYiCiAgICAgICAgICAgICAgICAgKiAgZS52YWx1ZTogIkBxMEg3cTdNTSIKICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgbGV0IHN0YXJ0ID0gZHJhZnRUZXh0LmluZGV4T2YoJ0AnICsgZS5rZXkpOwogICAgICAgICAgICAgICAgbGV0IGVuZCA9IHN0YXJ0ICsgMSArIGUua2V5Lmxlbmd0aDsKICAgICAgICAgICAgICAgIGlmIChzdGFydCA+IC0xKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKGUudmFsdWUgPT09ICdAJyArIHRoaXMuY29udmVyc2F0aW9uSW5mby5jb252ZXJzYXRpb24udGFyZ2V0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG1lbnRpb24gPSBuZXcgTWVudGlvbihzdGFydCwgZW5kLCB0aGlzLmNvbnZlcnNhdGlvbkluZm8uY29udmVyc2F0aW9uLnRhcmdldCwgdHJ1ZSkKICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICBtZW50aW9uID0gbmV3IE1lbnRpb24oc3RhcnQsIGVuZCwgZS52YWx1ZS5zdWJzdHJpbmcoMSksIGZhbHNlKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBtZW50aW9ucy5wdXNoKG1lbnRpb24pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIGxldCBtZW50aW9uQ291bnQgPSB0aGlzLm1lbnRpb25zID8gdGhpcy5tZW50aW9ucy5sZW5ndGggOiAwOwogICAgICAgICAgICBpZiAobWVudGlvbkNvdW50ID4gMAogICAgICAgICAgICAgICAgJiYgZHJhZnRUZXh0LmVuZHNXaXRoKCdAJyArIHRoaXMubWVudGlvbnNbbWVudGlvbkNvdW50IC0gMV0ua2V5ICsgJyAnKSkgewogICAgICAgICAgICAgICAgLy8gQOeahOacgOWQjuS4gOS4quepuuagvOS4jeiDveWIoOmZpAogICAgICAgICAgICAgICAgLy8gZG8gbm90aGluZwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgZHJhZnRUZXh0ID0gZHJhZnRUZXh0LnRyaW1FbmQoKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgbGV0IHF1b3RlSW5mbyA9IG51bGw7CiAgICAgICAgICAgIGlmIChjb252ZXJzYXRpb25JbmZvLl9xdW90ZWRNZXNzYWdlKSB7CiAgICAgICAgICAgICAgICBxdW90ZUluZm8gPSBRdW90ZUluZm8uaW5pdFdpdGhNZXNzYWdlKGNvbnZlcnNhdGlvbkluZm8uX3F1b3RlZE1lc3NhZ2UpOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoZHJhZnRUZXh0Lmxlbmd0aCA9PT0gMCAmJiAhcXVvdGVJbmZvKSB7CiAgICAgICAgICAgICAgICBpZiAoY29udmVyc2F0aW9uSW5mby5kcmFmdCAhPT0gJycpIHsKICAgICAgICAgICAgICAgICAgICBEcmFmdC5zZXRDb252ZXJzYXRpb25EcmFmdChjb252ZXJzYXRpb25JbmZvLmNvbnZlcnNhdGlvbiwgZHJhZnRUZXh0LCBxdW90ZUluZm8sIG1lbnRpb25zKQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgaWYgKGRyYWZ0VGV4dCAhPT0gY29udmVyc2F0aW9uSW5mby5kcmFmdCB8fCAoIWNvbnZlcnNhdGlvbkluZm8uZHJhZnQgJiYgcXVvdGVJbmZvKSkgewogICAgICAgICAgICAgICAgICAgIERyYWZ0LnNldENvbnZlcnNhdGlvbkRyYWZ0KGNvbnZlcnNhdGlvbkluZm8uY29udmVyc2F0aW9uLCBkcmFmdFRleHQsIHF1b3RlSW5mbywgbWVudGlvbnMpCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICBvbkdyb3VwTWVtYmVyc1VwZGF0ZShncm91cElkLCBncm91cE1lbWJlcnMpIHsKICAgICAgICAgICAgY29uc29sZS5sb2coJ21lc3NhZ2VJbnB1dCBvbkdyb3VwTWVtYmVyc1VwZGF0ZScsIGdyb3VwSWQpCiAgICAgICAgICAgIGlmICh0aGlzLmNvbnZlcnNhdGlvbkluZm8KICAgICAgICAgICAgICAgICYmIHRoaXMuY29udmVyc2F0aW9uSW5mby5jb252ZXJzYXRpb24udHlwZSA9PT0gQ29udmVyc2F0aW9uVHlwZS5Hcm91cAogICAgICAgICAgICAgICAgJiYgdGhpcy5jb252ZXJzYXRpb25JbmZvLmNvbnZlcnNhdGlvbi50YXJnZXQgPT09IGdyb3VwSWQpIHsKICAgICAgICAgICAgICAgIHRoaXMuaW5pdE1lbnRpb24odGhpcy5jb252ZXJzYXRpb25JbmZvLmNvbnZlcnNhdGlvbik7CiAgICAgICAgICAgICAgICBsZXQgZ3JvdXBNZW1iZXIgPSB3ZmMuZ2V0R3JvdXBNZW1iZXIoZ3JvdXBJZCwgd2ZjLmdldFVzZXJJZCgpKTsKICAgICAgICAgICAgICAgIGlmIChncm91cE1lbWJlciAmJiBncm91cE1lbWJlci50eXBlID09PSBHcm91cE1lbWJlclR5cGUuTXV0ZWQpIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLm11dGVkID0gdHJ1ZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIHJlcXVlc3RQdHRUYWxrKHJlcXVlc3QpIHsKICAgICAgICAgICAgaWYgKHJlcXVlc3QpIHsKICAgICAgICAgICAgICAgIGxldCB0YWxraW5nQ2FsbGJhY2sgPSBuZXcgVGFsa2luZ0NhbGxiYWNrKCk7CiAgICAgICAgICAgICAgICB0YWxraW5nQ2FsbGJhY2sub25TdGFydFRhbGtpbmcgPSAoY29udmVyc2F0aW9uKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5pc1B0dFRhbGtpbmcgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdvblN0YXJ0VGFsa2luZycsIGNvbnZlcnNhdGlvbikKICAgICAgICAgICAgICAgICAgICB0aGlzLiRub3RpZnkoewogICAgICAgICAgICAgICAgICAgICAgICB0ZXh0OiAn6K+35byA5aeL6K+06K+dJywKICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ2luZm8nCiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgdGFsa2luZ0NhbGxiYWNrLm9uUmVxdWVzdEZhaWwgPSAoY29udmVyc2F0aW9uLCByZWFzb24pID0+IHsKICAgICAgICAgICAgICAgICAgICB0aGlzLiRub3RpZnkoewogICAgICAgICAgICAgICAgICAgICAgICB0ZXh0OiAn5a+56K6y6K+35rGC5aSx6LSlOiAnICsgcmVhc29uLAogICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAnZXJyb3InCiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB0YWxraW5nQ2FsbGJhY2sub25UYWxraW5nRW5kID0gKGNvbnZlcnNhdGlvbiwgcmVhc29uKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgaWYgKGNvbnZlcnNhdGlvbi5lcXVhbCh0aGlzLmNvbnZlcnNhdGlvbkluZm8uY29udmVyc2F0aW9uKSkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmlzUHR0VGFsa2luZyA9IGZhbHNlOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHB0dENsaWVudC5yZXF1ZXN0VGFsayh0aGlzLmNvbnZlcnNhdGlvbkluZm8uY29udmVyc2F0aW9uLCB0YWxraW5nQ2FsbGJhY2spCiAgICAgICAgICAgICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignbW91c2V1cCcsIHRoaXMuaGFuZGxlTW91c2VVcCkKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIHRoaXMuaXNQdHRUYWxraW5nID0gZmFsc2U7CiAgICAgICAgICAgICAgICBwdHRDbGllbnQucmVsZWFzZVRhbGsodGhpcy5jb252ZXJzYXRpb25JbmZvLmNvbnZlcnNhdGlvbik7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICByZWNvcmRBdWRpbyhzdGFydCkgewogICAgICAgICAgICB0aGlzLm5vdGlmeVR5cGluZyhUeXBpbmdNZXNzYWdlQ29udGVudC5UWVBJTkdfVk9JQ0UpOwogICAgICAgICAgICBpZiAoc3RhcnQpIHsKICAgICAgICAgICAgICAgIGlmICghdGhpcy5hbXJSZWNvcmRlcikgewogICAgICAgICAgICAgICAgICAgIHRoaXMuYW1yUmVjb3JkZXIgPSBuZXcgQmVuekFNUlJlY29yZGVyKCk7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5hbXJSZWNvcmRlci5pbml0V2l0aFJlY29yZCgpLnRoZW4oKCkgPT4gewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmlzUmVjb3JkaW5nID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5hbXJSZWNvcmRlci5zdGFydFJlY29yZCgpOwogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLiRub3RpZnkoewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dDogJ+ivt+W8gOWni+ivtOivnScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAnaW5mbycKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfSkuY2F0Y2goKGUpID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy4kbm90aWZ5KHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHQ6ICflvZXpn7PlpLHotKUnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ2Vycm9yJwogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ+W9lemfs+Wksei0pScsIGUpOwogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmFtclJlY29yZGVyID0gbnVsbDsKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdtb3VzZXVwJywgdGhpcy5oYW5kbGVNb3VzZVVwKQogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgdGhpcy5pc1JlY29yZGluZyA9IGZhbHNlOwogICAgICAgICAgICAgICAgaWYgKHRoaXMuYW1yUmVjb3JkZXIpIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLmFtclJlY29yZGVyLmZpbmlzaFJlY29yZCgpLnRoZW4oKCkgPT4gewogICAgICAgICAgICAgICAgICAgICAgICBsZXQgZHVyYXRpb24gPSB0aGlzLmFtclJlY29yZGVyLmdldER1cmF0aW9uKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkdXJhdGlvbiA+IDEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBibG9iID0gdGhpcy5hbXJSZWNvcmRlci5nZXRCbG9iKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgZmlsZSA9IG5ldyBGaWxlKFtibG9iXSwgbmV3IERhdGUoKS5nZXRUaW1lKCkgKyAnLmFtcicpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGNvbnRlbnQgPSBuZXcgU291bmRNZXNzYWdlQ29udGVudChmaWxlLCBudWxsLCBNYXRoLmNlaWwoZHVyYXRpb24pKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdmYy5zZW5kQ29udmVyc2F0aW9uTWVzc2FnZSh0aGlzLmNvbnZlcnNhdGlvbkluZm8uY29udmVyc2F0aW9uLCBjb250ZW50KTsKICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuJG5vdGlmeSh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dDogJ+W9lemfs+aXtumXtOWkquefrScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ3dhcm4nCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmFtclJlY29yZGVyID0gbnVsbDsKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0sCiAgICAgICAgaGFuZGxlTW91c2VVcCgpIHsKICAgICAgICAgICAgaWYgKHRoaXMuaXNQdHRUYWxraW5nKSB7CiAgICAgICAgICAgICAgICB0aGlzLnJlcXVlc3RQdHRUYWxrKGZhbHNlKTsKICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLmlzUmVjb3JkaW5nKSB7CiAgICAgICAgICAgICAgICB0aGlzLnJlY29yZEF1ZGlvKGZhbHNlKTsKICAgICAgICAgICAgfQogICAgICAgICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2V1cCcsIHRoaXMuaGFuZGxlTW91c2VVcCkKICAgICAgICB9LAoKICAgICAgICBzZXR1cENvbnZlcnNhdGlvbklucHV0KCkgewogICAgICAgICAgICB0aGlzLiRyZWZzLmlucHV0LmlubmVySFRNTCA9ICcnOwogICAgICAgICAgICB0aGlzLnJlc3RvcmVEcmFmdCgpOwogICAgICAgICAgICB0aGlzLmluaXRNZW50aW9uKHRoaXMuY29udmVyc2F0aW9uSW5mby5jb252ZXJzYXRpb24pCiAgICAgICAgICAgIHRoaXMuZm9jdXNJbnB1dCgpOwogICAgICAgICAgICB0aGlzLmluaXRFbW9qaVBpY2tlcigpCiAgICAgICAgfQogICAgfSwKCiAgICBhY3RpdmF0ZWQoKSB7CiAgICAgICAgaWYgKCF0aGlzLnNoYXJlZENvbnZlcnNhdGlvblN0YXRlLnNob3dDaGFubmVsTWVudSkgewogICAgICAgICAgICB0aGlzLnJlc3RvcmVEcmFmdCgpOwogICAgICAgICAgICB0aGlzLmZvY3VzSW5wdXQoKTsKICAgICAgICB9CiAgICB9LAoKICAgIGRlYWN0aXZhdGVkKCkgewogICAgICAgIGlmICghdGhpcy5zaGFyZWRDb252ZXJzYXRpb25TdGF0ZS5zaG93Q2hhbm5lbE1lbnUpIHsKICAgICAgICAgICAgdGhpcy5zdG9yZURyYWZ0KHRoaXMubGFzdENvbnZlcnNhdGlvbkluZm8pOwogICAgICAgICAgICB0aGlzLiRyZWZzWydpbnB1dCddLmlubmVySFRNTCA9ICcnOwogICAgICAgIH0KICAgIH0sCgogICAgbW91bnRlZCgpIHsKICAgICAgICBpZiAoIXRoaXMuc2hhcmVkQ29udmVyc2F0aW9uU3RhdGUuc2hvd0NoYW5uZWxNZW51KSB7CiAgICAgICAgICAgIGlmICh0aGlzLmNvbnZlcnNhdGlvbkluZm8pIHsKICAgICAgICAgICAgICAgIHRoaXMuaW5pdE1lbnRpb24odGhpcy5jb252ZXJzYXRpb25JbmZvLmNvbnZlcnNhdGlvbikKICAgICAgICAgICAgICAgIHRoaXMuaW5pdEVtb2ppUGlja2VyKCkKICAgICAgICAgICAgICAgIHRoaXMucmVzdG9yZURyYWZ0KCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdGhpcy5mb2N1c0lucHV0KCk7CiAgICAgICAgfQogICAgICAgIHRoaXMubGFzdENvbnZlcnNhdGlvbkluZm8gPSB0aGlzLmNvbnZlcnNhdGlvbkluZm87CgogICAgICAgIGlmIChpc0VsZWN0cm9uKCkpIHsKICAgICAgICAgICAgaXBjUmVuZGVyZXIub24oJ3NjcmVlbnNob3RzLW9rJywgKGV2ZW50LCBhcmdzKSA9PiB7CiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnc2NyZWVuc2hvdHMtb2snLCBhcmdzKQogICAgICAgICAgICAgICAgaWYgKGFyZ3MuZmlsZVBhdGgpIHsKICAgICAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnQuZXhlY0NvbW1hbmQoJ2luc2VydEltYWdlJywgZmFsc2UsICdsb2NhbC1yZXNvdXJjZTovLycgKyBhcmdzLmZpbGVQYXRoKTsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zdHlsZUltYWdlSW5FZGl0b3IoKTsKICAgICAgICAgICAgICAgICAgICB9LCAxMDApCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgIH0KICAgICAgICB0aGlzLnN0b3JlRHJhZnRJbnRlcnZhbElkID0gc2V0SW50ZXJ2YWwoKCkgPT4gewogICAgICAgICAgICB0aGlzLnN0b3JlRHJhZnQodGhpcy5jb252ZXJzYXRpb25JbmZvKTsKICAgICAgICB9LCA1ICogMTAwMCkKICAgIH0sCgogICAgY3JlYXRlZCgpIHsKICAgICAgICB3ZmMuZXZlbnRFbWl0dGVyLm9uKEV2ZW50VHlwZS5Hcm91cE1lbWJlcnNVcGRhdGUsIHRoaXMub25Hcm91cE1lbWJlcnNVcGRhdGUpCiAgICB9LAoKICAgIGRlc3Ryb3llZCgpIHsKICAgICAgICBpZiAoaXNFbGVjdHJvbigpKSB7CiAgICAgICAgICAgIGlwY1JlbmRlcmVyLnJlbW92ZUFsbExpc3RlbmVycygnc2NyZWVuc2hvdHMtb2snKTsKICAgICAgICB9CiAgICAgICAgaWYgKHRoaXMuc3RvcmVEcmFmdEludGVydmFsSWQpIHsKICAgICAgICAgICAgY2xlYXJJbnRlcnZhbCh0aGlzLnN0b3JlRHJhZnRJbnRlcnZhbElkKQogICAgICAgIH0KICAgICAgICB3ZmMuZXZlbnRFbWl0dGVyLnJlbW92ZUxpc3RlbmVyKEV2ZW50VHlwZS5Hcm91cE1lbWJlcnNVcGRhdGUsIHRoaXMub25Hcm91cE1lbWJlcnNVcGRhdGUpCiAgICB9LAoKICAgIHdhdGNoOiB7CiAgICAgICAgY29udmVyc2F0aW9uSW5mbygpIHsKICAgICAgICAgICAgaWYgKHRoaXMubGFzdENvbnZlcnNhdGlvbkluZm8gJiYgIXRoaXMuY29udmVyc2F0aW9uSW5mby5jb252ZXJzYXRpb24uZXF1YWwodGhpcy5sYXN0Q29udmVyc2F0aW9uSW5mby5jb252ZXJzYXRpb24pKSB7CiAgICAgICAgICAgICAgICB0aGlzLiRuZXh0VGljaygoKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuc2hhcmVkQ29udmVyc2F0aW9uU3RhdGUuc2hvd0NoYW5uZWxNZW51KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuJHBhcmVudC4kcmVmc1snY29udmVyc2F0aW9uTWVzc2FnZUxpc3QnXS5zdHlsZS5mbGV4R3JvdyA9IDE7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy4kcGFyZW50Lm1lc3NhZ2VJbnB1dFZpZXdSZXNpemVkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuJHBhcmVudC4kcmVmc1snY29udmVyc2F0aW9uTWVzc2FnZUxpc3QnXS5zdHlsZS5mbGV4R3JvdyA9IDA7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmxhc3RDb252ZXJzYXRpb25JbmZvICYmICF0aGlzLmNvbnZlcnNhdGlvbkluZm8uY29udmVyc2F0aW9uLmVxdWFsKHRoaXMubGFzdENvbnZlcnNhdGlvbkluZm8uY29udmVyc2F0aW9uKSkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnN0b3JlRHJhZnQodGhpcy5sYXN0Q29udmVyc2F0aW9uSW5mbyk7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICBpZiAoIXRoaXMubXV0ZWQgJiYgdGhpcy5jb252ZXJzYXRpb25JbmZvICYmICghdGhpcy5sYXN0Q29udmVyc2F0aW9uSW5mbyB8fCAhdGhpcy5jb252ZXJzYXRpb25JbmZvLmNvbnZlcnNhdGlvbi5lcXVhbCh0aGlzLmxhc3RDb252ZXJzYXRpb25JbmZvLmNvbnZlcnNhdGlvbikpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0dXBDb252ZXJzYXRpb25JbnB1dCgpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB0aGlzLmxhc3RDb252ZXJzYXRpb25JbmZvID0gdGhpcy5jb252ZXJzYXRpb25JbmZvOwogICAgICAgICAgICAgICAgfSkKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIC8vIOWFtuS7luerr+abtOaWsOS6huiNieeovwogICAgICAgICAgICAgICAgLy8gZml4bWUKICAgICAgICAgICAgICAgIC8vIHRoaXMucmVzdG9yZURyYWZ0KCk7CiAgICAgICAgICAgICAgICB0aGlzLmxhc3RDb252ZXJzYXRpb25JbmZvID0gdGhpcy5jb252ZXJzYXRpb25JbmZvOwogICAgICAgICAgICB9CiAgICAgICAgfSwKICAgICAgICAnbXV0ZWQnOiB7CiAgICAgICAgICAgIGhhbmRsZXIobmV3VmFsdWUpIHsKICAgICAgICAgICAgICAgIGlmICghbmV3VmFsdWUpIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLiRuZXh0VGljaygoKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0dXBDb252ZXJzYXRpb25JbnB1dCgpOwogICAgICAgICAgICAgICAgICAgIH0pCiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIHRoaXMuJHBhcmVudC4kcmVmc1snY29udmVyc2F0aW9uTWVzc2FnZUxpc3QnXS5zdHlsZS5mbGV4R3JvdyA9IDE7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9LAoKICAgIGNvbXB1dGVkOiB7CiAgICAgICAgcXVvdGVkTWVzc2FnZSgpIHsKICAgICAgICAgICAgLy8gc2lkZSBhZmZlY3QKICAgICAgICAgICAgdGhpcy4kcmVmcy5pbnB1dCAmJiB0aGlzLiRyZWZzLmlucHV0LmZvY3VzKCk7CiAgICAgICAgICAgIHJldHVybiB0aGlzLnNoYXJlZENvbnZlcnNhdGlvblN0YXRlLnF1b3RlZE1lc3NhZ2U7CiAgICAgICAgfSwKCiAgICAgICAgaGFzSW5wdXRUZXh0T3JJbWFnZSgpIHsKICAgICAgICAgICAgLy8gVE9ETyDnm5HlkKxpbnB1dOeahOi+k+WFpeaDheWGtQogICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9CiAgICB9LAoKICAgIGNvbXBvbmVudHM6IHsKICAgICAgICBDaGFubmVsTWVudVZpZXcsCiAgICAgICAgUXVvdGVNZXNzYWdlVmlldywKICAgICAgICBWRW1vamlQaWNrZXIKICAgIH0sCiAgICBkaXJlY3RpdmVzOiB7CiAgICAgICAgQ2xpY2tPdXRzaWRlLAogICAgICAgIGZvY3VzLAogICAgfQp9Owo="},null]}