projen 0.104.18 → 0.104.20

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (171) hide show
  1. package/.jsii +188 -148
  2. package/lib/ai-instructions.js +2 -2
  3. package/lib/awscdk/auto-discover.js +6 -6
  4. package/lib/awscdk/awscdk-app-java.js +1 -1
  5. package/lib/awscdk/awscdk-app-py.js +1 -1
  6. package/lib/awscdk/awscdk-app-ts.js +1 -1
  7. package/lib/awscdk/awscdk-construct.js +1 -1
  8. package/lib/awscdk/awscdk-deps-java.js +1 -1
  9. package/lib/awscdk/awscdk-deps-js.js +1 -1
  10. package/lib/awscdk/awscdk-deps-py.js +1 -1
  11. package/lib/awscdk/awscdk-deps.js +1 -1
  12. package/lib/awscdk/cdk-config.js +3 -3
  13. package/lib/awscdk/cdk-tasks.js +1 -1
  14. package/lib/awscdk/integration-test.js +1 -1
  15. package/lib/awscdk/lambda-extension.js +1 -1
  16. package/lib/awscdk/lambda-function.js +2 -2
  17. package/lib/awscdk/private/feature-flags-v2.const.d.ts +1 -1
  18. package/lib/awscdk/private/feature-flags-v2.const.js +2 -2
  19. package/lib/build/build-workflow.js +1 -1
  20. package/lib/cdk/auto-discover-base.js +2 -2
  21. package/lib/cdk/construct-lib.js +1 -1
  22. package/lib/cdk/integration-test-base.js +1 -1
  23. package/lib/cdk/jsii-build.d.ts +4 -0
  24. package/lib/cdk/jsii-build.js +5 -2
  25. package/lib/cdk/jsii-docgen.js +1 -1
  26. package/lib/cdk/jsii-project.d.ts +17 -0
  27. package/lib/cdk/jsii-project.js +2 -2
  28. package/lib/cdk8s/auto-discover.js +2 -2
  29. package/lib/cdk8s/cdk8s-app-py.js +1 -1
  30. package/lib/cdk8s/cdk8s-app-ts.js +1 -1
  31. package/lib/cdk8s/cdk8s-construct.js +1 -1
  32. package/lib/cdk8s/cdk8s-deps-py.js +1 -1
  33. package/lib/cdk8s/cdk8s-deps.js +1 -1
  34. package/lib/cdk8s/integration-test.js +1 -1
  35. package/lib/cdktf/cdktf-construct.js +1 -1
  36. package/lib/cdktn/cdktn-app-ts.js +1 -1
  37. package/lib/cdktn/cdktn-config.js +1 -1
  38. package/lib/cdktn/cdktn-construct.js +1 -1
  39. package/lib/cdktn/cdktn-deps.js +1 -1
  40. package/lib/cdktn/cdktn-tasks.js +1 -1
  41. package/lib/circleci/circleci.js +1 -1
  42. package/lib/component.js +2 -2
  43. package/lib/dependencies.js +1 -1
  44. package/lib/dev-env.js +1 -1
  45. package/lib/docker-compose/docker-compose-service.js +1 -1
  46. package/lib/docker-compose/docker-compose.js +1 -1
  47. package/lib/file.js +1 -1
  48. package/lib/gitattributes.js +1 -1
  49. package/lib/github/actions-provider.js +1 -1
  50. package/lib/github/actions.const.js +1 -1
  51. package/lib/github/auto-approve.js +1 -1
  52. package/lib/github/auto-merge.js +1 -1
  53. package/lib/github/auto-queue.js +1 -1
  54. package/lib/github/dependabot.js +1 -1
  55. package/lib/github/dependency-review.js +1 -1
  56. package/lib/github/github-credentials.js +1 -1
  57. package/lib/github/github-project.js +1 -1
  58. package/lib/github/github.js +1 -1
  59. package/lib/github/merge-queue.js +1 -1
  60. package/lib/github/mergify.js +1 -1
  61. package/lib/github/pr-template.js +1 -1
  62. package/lib/github/pull-request-backport.js +1 -1
  63. package/lib/github/pull-request-lint.js +1 -1
  64. package/lib/github/pull-request-source.js +1 -1
  65. package/lib/github/stale.js +1 -1
  66. package/lib/github/task-workflow-job.js +1 -1
  67. package/lib/github/task-workflow.js +1 -1
  68. package/lib/github/workflow-actions.js +1 -1
  69. package/lib/github/workflow-jobs.js +1 -1
  70. package/lib/github/workflow-steps.js +1 -1
  71. package/lib/github/workflows.js +1 -1
  72. package/lib/gitlab/configuration.js +1 -1
  73. package/lib/gitlab/gitlab-configuration.js +1 -1
  74. package/lib/gitlab/nested-configuration.js +1 -1
  75. package/lib/gitpod.js +1 -1
  76. package/lib/ignore-file.js +1 -1
  77. package/lib/ini.js +1 -1
  78. package/lib/java/java-project.js +1 -1
  79. package/lib/java/junit.js +1 -1
  80. package/lib/java/maven-compile.js +1 -1
  81. package/lib/java/maven-packaging.js +1 -1
  82. package/lib/java/maven-sample.js +1 -1
  83. package/lib/java/pom.js +2 -2
  84. package/lib/java/projenrc.js +1 -1
  85. package/lib/javascript/biome/biome-config.d.ts +4 -0
  86. package/lib/javascript/biome/biome-config.js +2 -1
  87. package/lib/javascript/biome/biome.js +1 -1
  88. package/lib/javascript/bundler.js +1 -1
  89. package/lib/javascript/eslint.js +1 -1
  90. package/lib/javascript/jest.js +4 -4
  91. package/lib/javascript/license-checker.js +1 -1
  92. package/lib/javascript/node-config-file.js +1 -1
  93. package/lib/javascript/node-native-test-runner.js +2 -2
  94. package/lib/javascript/node-package.js +1 -1
  95. package/lib/javascript/node-project.js +1 -1
  96. package/lib/javascript/npm-config.js +1 -1
  97. package/lib/javascript/pnpm-workspace-config.js +2 -2
  98. package/lib/javascript/pnpm-workspace.js +1 -1
  99. package/lib/javascript/prettier.js +1 -1
  100. package/lib/javascript/projenrc.js +1 -1
  101. package/lib/javascript/typescript-config.js +2 -2
  102. package/lib/javascript/upgrade-dependencies.js +2 -2
  103. package/lib/javascript/yarnrc.js +1 -1
  104. package/lib/json-patch.js +1 -1
  105. package/lib/json.js +1 -1
  106. package/lib/license.js +1 -1
  107. package/lib/logger.js +1 -1
  108. package/lib/makefile.js +1 -1
  109. package/lib/object-file.js +1 -1
  110. package/lib/polaris/coverity-go.js +1 -1
  111. package/lib/polaris/coverity-java.js +1 -1
  112. package/lib/polaris/coverity-javascript.js +1 -1
  113. package/lib/polaris/coverity.js +1 -1
  114. package/lib/project-build.js +1 -1
  115. package/lib/project-tree.js +1 -1
  116. package/lib/project.js +1 -1
  117. package/lib/projects.js +1 -1
  118. package/lib/projenrc-json.js +1 -1
  119. package/lib/projenrc.js +1 -1
  120. package/lib/properties-file.js +1 -1
  121. package/lib/python/pip.js +1 -1
  122. package/lib/python/poetry.js +2 -2
  123. package/lib/python/projenrc.js +1 -1
  124. package/lib/python/pyproject-toml-file.js +1 -1
  125. package/lib/python/pytest-sample.js +1 -1
  126. package/lib/python/pytest.js +1 -1
  127. package/lib/python/python-project.js +1 -1
  128. package/lib/python/python-sample.js +1 -1
  129. package/lib/python/requirements-file.js +1 -1
  130. package/lib/python/setuppy.js +1 -1
  131. package/lib/python/setuptools.js +1 -1
  132. package/lib/python/uv-config.js +1 -1
  133. package/lib/python/uv.js +1 -1
  134. package/lib/python/venv.js +1 -1
  135. package/lib/readme.js +1 -1
  136. package/lib/release/publisher.js +1 -1
  137. package/lib/release/release-trigger.js +1 -1
  138. package/lib/release/release.js +1 -1
  139. package/lib/renovatebot.js +1 -1
  140. package/lib/run-task.cjs +2 -2
  141. package/lib/sample-file.js +2 -2
  142. package/lib/script-runner.js +1 -1
  143. package/lib/sonarqube/javascript.js +1 -1
  144. package/lib/sonarqube/rust.js +1 -1
  145. package/lib/sonarqube/sonarqube.js +1 -1
  146. package/lib/sonarqube/typescript.js +1 -1
  147. package/lib/source-code.js +1 -1
  148. package/lib/task-shell.js +1 -1
  149. package/lib/task.js +1 -1
  150. package/lib/tasks.js +1 -1
  151. package/lib/testing.js +1 -1
  152. package/lib/textfile.js +1 -1
  153. package/lib/toml.js +1 -1
  154. package/lib/typescript/projenrc-ts.js +1 -1
  155. package/lib/typescript/projenrc.js +1 -1
  156. package/lib/typescript/typescript-runner.js +1 -1
  157. package/lib/typescript/typescript-typedoc.js +1 -1
  158. package/lib/typescript/typescript.js +5 -5
  159. package/lib/version.js +2 -2
  160. package/lib/vscode/devcontainer.js +1 -1
  161. package/lib/vscode/extensions.js +1 -1
  162. package/lib/vscode/launch-config.js +1 -1
  163. package/lib/vscode/settings.js +1 -1
  164. package/lib/vscode/vscode.js +1 -1
  165. package/lib/web/next.js +3 -3
  166. package/lib/web/postcss.js +1 -1
  167. package/lib/web/react.js +3 -3
  168. package/lib/web/tailwind.js +1 -1
  169. package/lib/xmlfile.js +1 -1
  170. package/lib/yaml.js +1 -1
  171. package/package.json +2 -2
@@ -893,6 +893,7 @@ function toJson_RuleDomains(obj) {
893
893
  'solid': obj.solid,
894
894
  'svelte': obj.svelte,
895
895
  'tailwind': obj.tailwind,
896
+ 'tanstackQuery': obj.tanstackQuery,
896
897
  'test': obj.test,
897
898
  'turborepo': obj.turborepo,
898
899
  'types': obj.types,
@@ -1310,4 +1311,4 @@ var ProseWrap;
1310
1311
  /** Remove line breaks from paragraphs so that each paragraph is on one line. (never) */
1311
1312
  ProseWrap["NEVER"] = "never";
1312
1313
  })(ProseWrap || (exports.ProseWrap = ProseWrap = {}));
1313
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmlvbWUtY29uZmlnLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2phdmFzY3JpcHQvYmlvbWUvYmlvbWUtY29uZmlnLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQWdLQSw4REF5QkM7QUFxQ0QsZ0VBU0M7QUFxREQsMERBV0M7QUE0REQsOERBVUM7QUE0SkQsc0VBb0JDO0FBdUNELGtFQVNDO0FBdUNELDREQVNDO0FBaUVELDREQVdDO0FBdUZELHdEQWNDO0FBOENELDREQVVDO0FBK0NELGdFQVVDO0FBNkNELG9FQVVDO0FBZ0hELHdEQW9CQztBQWdHRCxvRUFVQztBQW1FRCwwREFXQztBQTJCRCw0REFRQztBQXdDRCx3Q0FTQztBQXNCRCxzRUFPQztBQW1GRCw0RUFjQztBQXNCRCxzRUFPQztBQTRDRCxzRUFTQztBQXdFRCw4RUFPQztBQTZFRCxvRkFjQztBQXNCRCw4RUFPQztBQXNCRCx3RUFPQztBQTJERCw4RUFZQztBQXNCRCx3RUFPQztBQXNCRCx3RUFPQztBQThHRCw4RUFpQkM7QUFzQkQsd0VBT0M7QUFxQ0Qsd0VBUUM7QUFzQkQsb0VBT0M7QUFzTEQsMEVBd0JDO0FBMkNELG9FQU9DO0FBaUNELG9FQVFDO0FBNkNELHdFQU9DO0FBc0JELHdFQU9DO0FBb0dELDhFQWdCQztBQXNCRCx3RUFPQztBQWlDRCx3RUFRQztBQXdGRCxnREFxQkM7QUEyRUQsb0NBZ0JDO0FBNEZELHNGQWNDO0FBc0JELGdGQU9DO0FBNERELGdGQVNDO0FBMkJELGdGQVFDO0FBb0JELDhFQU9DO0FBdUlELHNGQW9CQztBQWtDRCxnRkFTQztBQTBGRCw4RUFhQztBQXNCRCx3RUFPQztBQXVKRCxzQ0FxQkM7QUFsK0dEOzs7R0FHRztBQUNILHFGQUFxRjtBQUNyRixTQUFnQix5QkFBeUIsQ0FBQyxHQUFtQztJQUMzRSxJQUFJLEdBQUcsS0FBSyxTQUFTLEVBQUUsQ0FBQztRQUFDLE9BQU8sU0FBUyxDQUFDO0lBQUMsQ0FBQztJQUM1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LElBQVksZUFPWDtBQVBELFdBQVksZUFBZTtJQUN6Qiw2Q0FBNkM7SUFDN0MsOEJBQVcsQ0FBQTtJQUNYLGtDQUFrQztJQUNsQyxnQ0FBYSxDQUFBO0lBQ2Isd0VBQXdFO0lBQ3hFLDhDQUEyQixDQUFBO0FBQzdCLENBQUMsRUFQVyxlQUFlLCtCQUFmLGVBQWUsUUFPMUI7QUFFRDs7Ozs7OztHQU9HO0FBQ0gsSUFBWSxTQU9YO0FBUEQsV0FBWSxTQUFTO0lBQ25CLHNGQUFzRjtJQUN0RixrQ0FBcUIsQ0FBQTtJQUNyQixrRUFBa0U7SUFDbEUsOEJBQWlCLENBQUE7SUFDakIsd0ZBQXdGO0lBQ3hGLDRCQUFlLENBQUE7QUFDakIsQ0FBQyxFQVBXLFNBQVMseUJBQVQsU0FBUyxRQU9wQiIsInNvdXJjZXNDb250ZW50IjpbIi8vIH5+IEdlbmVyYXRlZCBieSBwcm9qZW4uIFRvIG1vZGlmeSwgZWRpdCAucHJvamVucmMudHMgYW5kIHJ1biBcIm5vZGUgLi9wcm9qZW4uanNcIi5cbi8qKlxuICogVGhlIGNvbmZpZ3VyYXRpb24gY29udGFpbmVkIGluIGBiaW9tZS5qc29uYCBvciBgYmlvbWUuanNvbmNgLlxuICpcbiAqIEBzY2hlbWEgQmlvbWVDb25maWd1cmF0aW9uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQmlvbWVDb25maWd1cmF0aW9uIHtcbiAgLyoqXG4gICAqIFRoZSBKU09OIFNjaGVtYSB1c2VkIHRvIHZhbGlkYXRlIHRoZSBjb25maWd1cmF0aW9uIGFuZCBwcm92aWRlIGVkaXRvciBjb21wbGV0aW9uLiBCaW9tZVxuICAgKiBlbWl0cyBhIGRpYWdub3N0aWMgd2hlbiBhIGBiaW9tZWpzLmRldmAgc2NoZW1hIFVSTCBzcGVjaWZpZXMgYSB2ZXJzaW9uIHRoYXQgZGlmZmVycyBmcm9tIHRoZVxuICAgKiBydW5uaW5nIENMSSB2ZXJzaW9uLlxuICAgKlxuICAgKiBAc2NoZW1hIEJpb21lQ29uZmlndXJhdGlvbiMkc2NoZW1hXG4gICAqL1xuICByZWFkb25seSBzY2hlbWE/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBhc3Npc3QgY29uZmlndXJhdGlvbi5cbiAgICpcbiAgICogQHNjaGVtYSBCaW9tZUNvbmZpZ3VyYXRpb24jYXNzaXN0XG4gICAqL1xuICByZWFkb25seSBhc3Npc3Q/OiBBc3Npc3RDb25maWd1cmF0aW9uO1xuXG4gIC8qKlxuICAgKiBDb25maWd1cmF0aW9uIHNwZWNpZmljIHRvIENTUy5cbiAgICpcbiAgICogQHNjaGVtYSBCaW9tZUNvbmZpZ3VyYXRpb24jY3NzXG4gICAqL1xuICByZWFkb25seSBjc3M/OiBDc3NDb25maWd1cmF0aW9uO1xuXG4gIC8qKlxuICAgKiBFeHRlbmRzIHRoZSBjdXJyZW50IGNvbmZpZ3VyYXRpb24gd2l0aCBzZXR0aW5ncyBmcm9tIG9uZSBvciBtb3JlIG90aGVyIEJpb21lIGNvbmZpZ3VyYXRpb25zLlxuICAgKiBVc2UgYFwiLy9cImAgaW4gYSBuZXN0ZWQgY29uZmlndXJhdGlvbiB0byBleHRlbmQgdGhlIHJvb3QgY29uZmlndXJhdGlvbiBhdCBhbnkgbmVzdGluZyBkZXB0aC5cbiAgICogVXNlIGFuIGFycmF5IHRvIGV4dGVuZCBjb25maWd1cmF0aW9ucyBieSByZWxhdGl2ZSBwYXRoIG9yIGluc3RhbGxlZCBwYWNrYWdlIHNwZWNpZmllci5cbiAgICpcbiAgICogQmlvbWUgbWVyZ2VzIGNvbmZpZ3VyYXRpb25zIGZyb20gbGVmdCB0byByaWdodC4gTGF0ZXIgY29uZmlndXJhdGlvbnMgdGFrZSBwcmVjZWRlbmNlIGZvclxuICAgKiBzaW5nbGUtdmFsdWUgb3B0aW9ucywgbGlzdCBlbnRyaWVzIGFyZSBjb21iaW5lZCwgYW5kIHRoZSBjdXJyZW50IGZpbGUgaXMgYXBwbGllZCBsYXN0LlxuICAgKlxuICAgKiBAc2NoZW1hIEJpb21lQ29uZmlndXJhdGlvbiNleHRlbmRzXG4gICAqL1xuICByZWFkb25seSBleHRlbmRzPzogYW55O1xuXG4gIC8qKlxuICAgKiBDb25maWd1cmVzIHdoaWNoIGZpbGVzIEJpb21lIGNhbiBkaXNjb3ZlciBhbmQgcHJvY2Vzcy5cbiAgICpcbiAgICogQHNjaGVtYSBCaW9tZUNvbmZpZ3VyYXRpb24jZmlsZXNcbiAgICovXG4gIHJlYWRvbmx5IGZpbGVzPzogRmlsZXNDb25maWd1cmF0aW9uO1xuXG4gIC8qKlxuICAgKiBDb25maWd1cmVzIGZvcm1hdHRpbmcgZm9yIHNlbGVjdGVkIGZpbGVzLlxuICAgKlxuICAgKiBAc2NoZW1hIEJpb21lQ29uZmlndXJhdGlvbiNmb3JtYXR0ZXJcbiAgICovXG4gIHJlYWRvbmx5IGZvcm1hdHRlcj86IEZvcm1hdHRlckNvbmZpZ3VyYXRpb247XG5cbiAgLyoqXG4gICAqIENvbmZpZ3VyYXRpb24gc3BlY2lmaWMgdG8gR3JhcGhRTC5cbiAgICpcbiAgICogQHNjaGVtYSBCaW9tZUNvbmZpZ3VyYXRpb24jZ3JhcGhxbFxuICAgKi9cbiAgcmVhZG9ubHkgZ3JhcGhxbD86IEdyYXBocWxDb25maWd1cmF0aW9uO1xuXG4gIC8qKlxuICAgKiBDb25maWd1cmF0aW9uIHNwZWNpZmljIHRvIEdyaXRRTC5cbiAgICpcbiAgICogQHNjaGVtYSBCaW9tZUNvbmZpZ3VyYXRpb24jZ3JpdFxuICAgKi9cbiAgcmVhZG9ubHkgZ3JpdD86IEdyaXRDb25maWd1cmF0aW9uO1xuXG4gIC8qKlxuICAgKiBDb25maWd1cmF0aW9uIHNwZWNpZmljIHRvIEhUTUwuXG4gICAqXG4gICAqIEBzY2hlbWEgQmlvbWVDb25maWd1cmF0aW9uI2h0bWxcbiAgICovXG4gIHJlYWRvbmx5IGh0bWw/OiBIdG1sQ29uZmlndXJhdGlvbjtcblxuICAvKipcbiAgICogQ29uZmlndXJhdGlvbiBzcGVjaWZpYyB0byBKYXZhU2NyaXB0LlxuICAgKlxuICAgKiBAc2NoZW1hIEJpb21lQ29uZmlndXJhdGlvbiNqYXZhc2NyaXB0XG4gICAqL1xuICByZWFkb25seSBqYXZhc2NyaXB0PzogSnNDb25maWd1cmF0aW9uO1xuXG4gIC8qKlxuICAgKiBDb25maWd1cmF0aW9uIHNwZWNpZmljIHRvIEpTT04uXG4gICAqXG4gICAqIEBzY2hlbWEgQmlvbWVDb25maWd1cmF0aW9uI2pzb25cbiAgICovXG4gIHJlYWRvbmx5IGpzb24/OiBKc29uQ29uZmlndXJhdGlvbjtcblxuICAvKipcbiAgICogVGhlIGxpbnRlciBjb25maWd1cmF0aW9uLlxuICAgKlxuICAgKiBAc2NoZW1hIEJpb21lQ29uZmlndXJhdGlvbiNsaW50ZXJcbiAgICovXG4gIHJlYWRvbmx5IGxpbnRlcj86IExpbnRlckNvbmZpZ3VyYXRpb247XG5cbiAgLyoqXG4gICAqIENvbmZpZ3VyYXRpb24gc3BlY2lmaWMgdG8gTWFya2Rvd24uXG4gICAqXG4gICAqIEBzY2hlbWEgQmlvbWVDb25maWd1cmF0aW9uI21hcmtkb3duXG4gICAqL1xuICByZWFkb25seSBtYXJrZG93bj86IE1hcmtkb3duQ29uZmlndXJhdGlvbjtcblxuICAvKipcbiAgICogQ29uZmlndXJlcyBzZXR0aW5ncyBmb3IgZmlsZXMgc2VsZWN0ZWQgYnkgZWFjaCBvdmVycmlkZS4gV2hlbiBtdWx0aXBsZSBvdmVycmlkZXMgY29uZmlndXJlXG4gICAqIHRoZSBzYW1lIHNpbmdsZS12YWx1ZSBzZXR0aW5nLCB0aGUgbGFzdCBtYXRjaGluZyBvdmVycmlkZSB0YWtlcyBwcmVjZWRlbmNlLlxuICAgKlxuICAgKiBAc2NoZW1hIEJpb21lQ29uZmlndXJhdGlvbiNvdmVycmlkZXNcbiAgICovXG4gIHJlYWRvbmx5IG92ZXJyaWRlcz86IE92ZXJyaWRlUGF0dGVybltdO1xuXG4gIC8qKlxuICAgKiBBIGxpc3Qgb2YgR3JpdFFMIHBsdWdpbnMgdG8gbG9hZC5cbiAgICpcbiAgICogQHNjaGVtYSBCaW9tZUNvbmZpZ3VyYXRpb24jcGx1Z2luc1xuICAgKi9cbiAgcmVhZG9ubHkgcGx1Z2lucz86IGFueVtdO1xuXG4gIC8qKlxuICAgKiBNYXJrcyB3aGV0aGVyIHRoaXMgZmlsZSBpcyB0aGUgcm9vdCBjb25maWd1cmF0aW9uIGZvciBhIEJpb21lIHByb2plY3QuIFRoZSByb290IGNvbmZpZ3VyYXRpb25cbiAgICogZXN0YWJsaXNoZXMgdGhlIHByb2plY3QncyBiYXNlIHNldHRpbmdzLCB3aGlsZSBgZmFsc2VgIG1hcmtzIGEgY29uZmlndXJhdGlvbiBmb3VuZCBpbnNpZGUgdGhlXG4gICAqIHByb2plY3QgYXMgbmVzdGVkIHJhdGhlciB0aGFuIGEgc2Vjb25kIHByb2plY3Qgcm9vdC5cbiAgICpcbiAgICogRGVmYXVsdHMgdG8gYHRydWVgLiBCaW9tZSBpbXBsaWNpdGx5IHRyZWF0cyBgcm9vdGAgYXMgYGZhbHNlYCB3aGVuIGEgbmVzdGVkIGNvbmZpZ3VyYXRpb24gdXNlc1xuICAgKiBgXCJleHRlbmRzXCI6IFwiLy9cImAuIEFsbCBvdGhlciBuZXN0ZWQgY29uZmlndXJhdGlvbnMgbXVzdCBleHBsaWNpdGx5IHNldCBgcm9vdGAgdG8gYGZhbHNlYC5cbiAgICpcbiAgICogQGRlZmF1bHQgdHJ1ZWAuIEJpb21lIGltcGxpY2l0bHkgdHJlYXRzIGByb290YCBhcyBgZmFsc2VgIHdoZW4gYSBuZXN0ZWQgY29uZmlndXJhdGlvbiB1c2VzXG4gICAqIEBzY2hlbWEgQmlvbWVDb25maWd1cmF0aW9uI3Jvb3RcbiAgICovXG4gIHJlYWRvbmx5IHJvb3Q/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBDb25maWd1cmVzIGhvdyBCaW9tZSByZWNvZ25pemVzIFRhaWx3aW5kIGNsYXNzIHN0cmluZ3MuXG4gICAqXG4gICAqIEBzY2hlbWEgQmlvbWVDb25maWd1cmF0aW9uI3RhaWx3aW5kXG4gICAqL1xuICByZWFkb25seSB0YWlsd2luZD86IFRhaWx3aW5kQ29uZmlndXJhdGlvbjtcblxuICAvKipcbiAgICogVGhlIHZlcnNpb24gY29udHJvbCBpbnRlZ3JhdGlvbiBjb25maWd1cmF0aW9uLlxuICAgKlxuICAgKiBAc2NoZW1hIEJpb21lQ29uZmlndXJhdGlvbiN2Y3NcbiAgICovXG4gIHJlYWRvbmx5IHZjcz86IFZjc0NvbmZpZ3VyYXRpb247XG5cbiAgLyoqXG4gICAqIENvbmZpZ3VyYXRpb24gc3BlY2lmaWMgdG8gWUFNTC5cbiAgICpcbiAgICogQHNjaGVtYSBCaW9tZUNvbmZpZ3VyYXRpb24jeWFtbFxuICAgKi9cbiAgcmVhZG9ubHkgeWFtbD86IFlhbWxDb25maWd1cmF0aW9uO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGFuIG9iamVjdCBvZiB0eXBlICdCaW9tZUNvbmZpZ3VyYXRpb24nIHRvIEpTT04gcmVwcmVzZW50YXRpb24uXG4gKiBAaW50ZXJuYWxcbiAqL1xuLyogZXNsaW50LWRpc2FibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvSnNvbl9CaW9tZUNvbmZpZ3VyYXRpb24ob2JqOiBCaW9tZUNvbmZpZ3VyYXRpb24gfCB1bmRlZmluZWQpOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgdW5kZWZpbmVkIHtcbiAgaWYgKG9iaiA9PT0gdW5kZWZpbmVkKSB7IHJldHVybiB1bmRlZmluZWQ7IH1cbiAgY29uc3QgcmVzdWx0ID0ge1xuICAgICckc2NoZW1hJzogb2JqLnNjaGVtYSxcbiAgICAnYXNzaXN0JzogdG9Kc29uX0Fzc2lzdENvbmZpZ3VyYXRpb24ob2JqLmFzc2lzdCksXG4gICAgJ2Nzcyc6IHRvSnNvbl9Dc3NDb25maWd1cmF0aW9uKG9iai5jc3MpLFxuICAgICdleHRlbmRzJzogb2JqLmV4dGVuZHMsXG4gICAgJ2ZpbGVzJzogdG9Kc29uX0ZpbGVzQ29uZmlndXJhdGlvbihvYmouZmlsZXMpLFxuICAgICdmb3JtYXR0ZXInOiB0b0pzb25fRm9ybWF0dGVyQ29uZmlndXJhdGlvbihvYmouZm9ybWF0dGVyKSxcbiAgICAnZ3JhcGhxbCc6IHRvSnNvbl9HcmFwaHFsQ29uZmlndXJhdGlvbihvYmouZ3JhcGhxbCksXG4gICAgJ2dyaXQnOiB0b0pzb25fR3JpdENvbmZpZ3VyYXRpb24ob2JqLmdyaXQpLFxuICAgICdodG1sJzogdG9Kc29uX0h0bWxDb25maWd1cmF0aW9uKG9iai5odG1sKSxcbiAgICAnamF2YXNjcmlwdCc6IHRvSnNvbl9Kc0NvbmZpZ3VyYXRpb24ob2JqLmphdmFzY3JpcHQpLFxuICAgICdqc29uJzogdG9Kc29uX0pzb25Db25maWd1cmF0aW9uKG9iai5qc29uKSxcbiAgICAnbGludGVyJzogdG9Kc29uX0xpbnRlckNvbmZpZ3VyYXRpb24ob2JqLmxpbnRlciksXG4gICAgJ21hcmtkb3duJzogdG9Kc29uX01hcmtkb3duQ29uZmlndXJhdGlvbihvYmoubWFya2Rvd24pLFxuICAgICdvdmVycmlkZXMnOiBvYmoub3ZlcnJpZGVzPy5tYXAoeSA9PiB0b0pzb25fT3ZlcnJpZGVQYXR0ZXJuKHkpKSxcbiAgICAncGx1Z2lucyc6IG9iai5wbHVnaW5zPy5tYXAoeSA9PiB5KSxcbiAgICAncm9vdCc6IG9iai5yb290LFxuICAgICd0YWlsd2luZCc6IHRvSnNvbl9UYWlsd2luZENvbmZpZ3VyYXRpb24ob2JqLnRhaWx3aW5kKSxcbiAgICAndmNzJzogdG9Kc29uX1Zjc0NvbmZpZ3VyYXRpb24ob2JqLnZjcyksXG4gICAgJ3lhbWwnOiB0b0pzb25fWWFtbENvbmZpZ3VyYXRpb24ob2JqLnlhbWwpLFxuICB9O1xuICAvLyBmaWx0ZXIgdW5kZWZpbmVkIHZhbHVlc1xuICByZXR1cm4gT2JqZWN0LmVudHJpZXMocmVzdWx0KS5yZWR1Y2UoKHIsIGkpID0+IChpWzFdID09PSB1bmRlZmluZWQpID8gciA6ICh7IC4uLnIsIFtpWzBdXTogaVsxXSB9KSwge30pO1xufVxuLyogZXNsaW50LWVuYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5cbi8qKlxuICogQHNjaGVtYSBBc3Npc3RDb25maWd1cmF0aW9uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQXNzaXN0Q29uZmlndXJhdGlvbiB7XG4gIC8qKlxuICAgKiBUaGUgYXNzaXN0LWFjdGlvbiBjb25maWd1cmF0aW9uLlxuICAgKlxuICAgKiBAc2NoZW1hIEFzc2lzdENvbmZpZ3VyYXRpb24jYWN0aW9uc1xuICAgKi9cbiAgcmVhZG9ubHkgYWN0aW9ucz86IEFjdGlvbnM7XG5cbiAgLyoqXG4gICAqIEVuYWJsZXMgY29uZmlndXJlZCBhc3Npc3QgYWN0aW9ucyBpbiB0aGUgQ0xJIGFuZCBlZGl0b3IgaW50ZWdyYXRpb25zLiBEZWZhdWx0cyB0byBgdHJ1ZWAuXG4gICAqXG4gICAqIEBkZWZhdWx0IHRydWVgLlxuICAgKiBAc2NoZW1hIEFzc2lzdENvbmZpZ3VyYXRpb24jZW5hYmxlZFxuICAgKi9cbiAgcmVhZG9ubHkgZW5hYmxlZD86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEEgbGlzdCBvZiBnbG9iIHBhdHRlcm5zIHNlbGVjdGluZyBmaWxlcyBvbiB3aGljaCBhc3Npc3QgYWN0aW9ucyBjYW4gcnVuLiBJZiBvbWl0dGVkLCBhbGwgZmlsZXNcbiAgICogc2VsZWN0ZWQgYnkgYGZpbGVzLmluY2x1ZGVzYCByZW1haW4gZWxpZ2libGUgZm9yIGFzc2lzdCBhY3Rpb25zLiBBbiBlbXB0eSBsaXN0IHNlbGVjdHMgbm9cbiAgICogZmlsZXMuIFRoaXMgb3B0aW9uIGNhbiBvbmx5IG5hcnJvdyB0aGUgZmlsZXMgc2VsZWN0ZWQgYnkgYGZpbGVzLmluY2x1ZGVzYC5cbiAgICpcbiAgICogQHNjaGVtYSBBc3Npc3RDb25maWd1cmF0aW9uI2luY2x1ZGVzXG4gICAqL1xuICByZWFkb25seSBpbmNsdWRlcz86IHN0cmluZ1tdO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGFuIG9iamVjdCBvZiB0eXBlICdBc3Npc3RDb25maWd1cmF0aW9uJyB0byBKU09OIHJlcHJlc2VudGF0aW9uLlxuICogQGludGVybmFsXG4gKi9cbi8qIGVzbGludC1kaXNhYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0pzb25fQXNzaXN0Q29uZmlndXJhdGlvbihvYmo6IEFzc2lzdENvbmZpZ3VyYXRpb24gfCB1bmRlZmluZWQpOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgdW5kZWZpbmVkIHtcbiAgaWYgKG9iaiA9PT0gdW5kZWZpbmVkKSB7IHJldHVybiB1bmRlZmluZWQ7IH1cbiAgY29uc3QgcmVzdWx0ID0ge1xuICAgICdhY3Rpb25zJzogdG9Kc29uX0FjdGlvbnMob2JqLmFjdGlvbnMpLFxuICAgICdlbmFibGVkJzogb2JqLmVuYWJsZWQsXG4gICAgJ2luY2x1ZGVzJzogb2JqLmluY2x1ZGVzPy5tYXAoeSA9PiB5KSxcbiAgfTtcbiAgLy8gZmlsdGVyIHVuZGVmaW5lZCB2YWx1ZXNcbiAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKHJlc3VsdCkucmVkdWNlKChyLCBpKSA9PiAoaVsxXSA9PT0gdW5kZWZpbmVkKSA/IHIgOiAoeyAuLi5yLCBbaVswXV06IGlbMV0gfSksIHt9KTtcbn1cbi8qIGVzbGludC1lbmFibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuXG4vKipcbiAqIE9wdGlvbnMgYXBwbGllZCB0byBDU1MgYW5kIGxhbmd1YWdlcyB0aGF0IGV4dGVuZCBpdC5cbiAqXG4gKiBMYW5ndWFnZS1zcGVjaWZpYyBzZXR0aW5ncyB0YWtlIHByZWNlZGVuY2Ugb3ZlciBjb3JyZXNwb25kaW5nIGdsb2JhbCBzZXR0aW5ncy4gR2xvYmFsIHNldHRpbmdzXG4gKiBhcHBseSB3aGVuIHRoZWlyIGxhbmd1YWdlLXNwZWNpZmljIGNvdW50ZXJwYXJ0cyBhcmUgb21pdHRlZCwgdW5sZXNzIHN0YXRlZCBvdGhlcndpc2UuXG4gKlxuICogQHNjaGVtYSBDc3NDb25maWd1cmF0aW9uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3NzQ29uZmlndXJhdGlvbiB7XG4gIC8qKlxuICAgKiBDU1MgYXNzaXN0IG9wdGlvbnMuXG4gICAqXG4gICAqIEBzY2hlbWEgQ3NzQ29uZmlndXJhdGlvbiNhc3Npc3RcbiAgICovXG4gIHJlYWRvbmx5IGFzc2lzdD86IENzc0Fzc2lzdENvbmZpZ3VyYXRpb247XG5cbiAgLyoqXG4gICAqIENTUyBmb3JtYXR0ZXIgb3B0aW9ucy5cbiAgICpcbiAgICogQHNjaGVtYSBDc3NDb25maWd1cmF0aW9uI2Zvcm1hdHRlclxuICAgKi9cbiAgcmVhZG9ubHkgZm9ybWF0dGVyPzogQ3NzRm9ybWF0dGVyQ29uZmlndXJhdGlvbjtcblxuICAvKipcbiAgICogUmVzZXJ2ZWQgZm9yIGZ1dHVyZSBDU1MgYW5hbHl6ZXIgc3VwcG9ydC4gVGhpcyBvcHRpb24gY3VycmVudGx5IGhhcyBubyBlZmZlY3QuXG4gICAqXG4gICAqIEBzY2hlbWEgQ3NzQ29uZmlndXJhdGlvbiNnbG9iYWxzXG4gICAqL1xuICByZWFkb25seSBnbG9iYWxzPzogc3RyaW5nW107XG5cbiAgLyoqXG4gICAqIENTUyBsaW50ZXIgb3B0aW9ucy5cbiAgICpcbiAgICogQHNjaGVtYSBDc3NDb25maWd1cmF0aW9uI2xpbnRlclxuICAgKi9cbiAgcmVhZG9ubHkgbGludGVyPzogQ3NzTGludGVyQ29uZmlndXJhdGlvbjtcblxuICAvKipcbiAgICogQ1NTIHBhcnNpbmcgb3B0aW9ucy5cbiAgICpcbiAgICogQHNjaGVtYSBDc3NDb25maWd1cmF0aW9uI3BhcnNlclxuICAgKi9cbiAgcmVhZG9ubHkgcGFyc2VyPzogQ3NzUGFyc2VyQ29uZmlndXJhdGlvbjtcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhbiBvYmplY3Qgb2YgdHlwZSAnQ3NzQ29uZmlndXJhdGlvbicgdG8gSlNPTiByZXByZXNlbnRhdGlvbi5cbiAqIEBpbnRlcm5hbFxuICovXG4vKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5leHBvcnQgZnVuY3Rpb24gdG9Kc29uX0Nzc0NvbmZpZ3VyYXRpb24ob2JqOiBDc3NDb25maWd1cmF0aW9uIHwgdW5kZWZpbmVkKTogUmVjb3JkPHN0cmluZywgYW55PiB8IHVuZGVmaW5lZCB7XG4gIGlmIChvYmogPT09IHVuZGVmaW5lZCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9XG4gIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAnYXNzaXN0JzogdG9Kc29uX0Nzc0Fzc2lzdENvbmZpZ3VyYXRpb24ob2JqLmFzc2lzdCksXG4gICAgJ2Zvcm1hdHRlcic6IHRvSnNvbl9Dc3NGb3JtYXR0ZXJDb25maWd1cmF0aW9uKG9iai5mb3JtYXR0ZXIpLFxuICAgICdnbG9iYWxzJzogb2JqLmdsb2JhbHM/Lm1hcCh5ID0+IHkpLFxuICAgICdsaW50ZXInOiB0b0pzb25fQ3NzTGludGVyQ29uZmlndXJhdGlvbihvYmoubGludGVyKSxcbiAgICAncGFyc2VyJzogdG9Kc29uX0Nzc1BhcnNlckNvbmZpZ3VyYXRpb24ob2JqLnBhcnNlciksXG4gIH07XG4gIC8vIGZpbHRlciB1bmRlZmluZWQgdmFsdWVzXG4gIHJldHVybiBPYmplY3QuZW50cmllcyhyZXN1bHQpLnJlZHVjZSgociwgaSkgPT4gKGlbMV0gPT09IHVuZGVmaW5lZCkgPyByIDogKHsgLi4uciwgW2lbMF1dOiBpWzFdIH0pLCB7fSk7XG59XG4vKiBlc2xpbnQtZW5hYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cblxuLyoqXG4gKiBUaGUgZmlsZSBoYW5kbGluZyBjb25maWd1cmF0aW9uLlxuICpcbiAqIEBzY2hlbWEgRmlsZXNDb25maWd1cmF0aW9uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRmlsZXNDb25maWd1cmF0aW9uIHtcbiAgLyoqXG4gICAqICoqRGVwcmVjYXRlZDoqKiBQbGVhc2UgdXNlIF9mb3JjZS1pZ25vcmUgc3ludGF4XyBpbiBgZmlsZXMuaW5jbHVkZXNgXG4gICAqIGluc3RlYWQ6IDxodHRwczovL2Jpb21lanMuZGV2L3JlZmVyZW5jZS9jb25maWd1cmF0aW9uLyNmaWxlc2luY2x1ZGVzPlxuICAgKlxuICAgKiBGaWxlIG9yIGRpcmVjdG9yeSBuYW1lcyB0aGF0IHRoZSBzY2FubmVyIGlnbm9yZXMgdW5jb25kaXRpb25hbGx5IHdoaWxlIGNyYXdsaW5nLiBFYWNoIHZhbHVlXG4gICAqIG1hdGNoZXMgYSBjb21wbGV0ZSBwYXRoIGNvbXBvbmVudCwgbm90IGEgZ2xvYi4gSWdub3JlZCBmaWxlcyBhcmUgbm90IGFkZGVkIHRvIHRoZSBtb2R1bGUgZ3JhcGgsXG4gICAqIHNvIHR5cGVzIGFyZSBub3QgaW5mZXJyZWQgZnJvbSB0aGVtLlxuICAgKlxuICAgKiBAc2NoZW1hIEZpbGVzQ29uZmlndXJhdGlvbiNleHBlcmltZW50YWxTY2FubmVySWdub3Jlc1xuICAgKi9cbiAgcmVhZG9ubHkgZXhwZXJpbWVudGFsU2Nhbm5lcklnbm9yZXM/OiBzdHJpbmdbXTtcblxuICAvKipcbiAgICogUHJldmVudHMgQmlvbWUgZnJvbSBlbWl0dGluZyBkaWFnbm9zdGljcyBmb3IgdW5yZWNvZ25pemVkIGZpbGUgdHlwZXMuIERlZmF1bHRzIHRvIGBmYWxzZWAuXG4gICAqXG4gICAqIEBkZWZhdWx0IGZhbHNlYC5cbiAgICogQHNjaGVtYSBGaWxlc0NvbmZpZ3VyYXRpb24jaWdub3JlVW5rbm93blxuICAgKi9cbiAgcmVhZG9ubHkgaWdub3JlVW5rbm93bj86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEEgbGlzdCBvZiBnbG9iIHBhdHRlcm5zIHNlbGVjdGluZyB3aGljaCBmaWxlcyBhbmQgZGlyZWN0b3JpZXMgQmlvbWUgY2FuIHByb2Nlc3MuIElmIG9taXR0ZWQsXG4gICAqIHRoaXMgb3B0aW9uIGRvZXMgbm90IGZ1cnRoZXIgcmVzdHJpY3QgdGhlIHN1cHBvcnRlZCBmaWxlcyBCaW9tZSBjYW4gcHJvY2Vzcy4gQW4gZW1wdHkgbGlzdFxuICAgKiBzZWxlY3RzIG5vIGZpbGVzLiBCaW9tZSBpZ25vcmVzIGZpbGVzIHVuZGVyIGBub2RlX21vZHVsZXNgIGV2ZW4gd2hlbiB0aGV5IG1hdGNoIGEgcGF0dGVybi5cbiAgICpcbiAgICogVGhlIHNjYW5uZXIgdXNlcyB0aGVzZSBwYXR0ZXJucyBhbmQsIHdoZW4gZW5hYmxlZCwgVkNTIGlnbm9yZSBmaWxlcyB3aGlsZSBkaXNjb3ZlcmluZyBuZXN0ZWRcbiAgICogY29uZmlndXJhdGlvbiBhbmQgaWdub3JlIGZpbGVzLiBXaGVuIGVuYWJsZWQgcnVsZXMgdXNlIHRoZSBgcHJvamVjdGAgb3IgYHR5cGVzYCBkb21haW5zLCBpdFxuICAgKiBhbHNvIGluZGV4ZXMgc291cmNlIGZpbGVzIGFuZCBwcm9qZWN0IGRlcGVuZGVuY2llcy4gSXQgbWF5IHN0aWxsIGRpc2NvdmVyIHJlcXVpcmVkIG1ldGFkYXRhIG9yXG4gICAqIGluZGV4IGV4Y2x1ZGVkIHNvdXJjZSBmaWxlcyBuZWVkZWQgZm9yIGFuYWx5c2lzLiBBIHBhdHRlcm4gYmVnaW5uaW5nIHdpdGggYCEhYCBwcmV2ZW50cyB0aGVcbiAgICogc2Nhbm5lciBmcm9tIGluZGV4aW5nIG1hdGNoaW5nIHBhdGhzLiBQYXR0ZXJucyBhcmUgZXZhbHVhdGVkIGluIG9yZGVyLCBhbmQgYSBwYXR0ZXJuIGJlZ2lubmluZ1xuICAgKiB3aXRoIGAhYCBleGNsdWRlcyBtYXRjaGVzLlxuICAgKlxuICAgKiBAc2NoZW1hIEZpbGVzQ29uZmlndXJhdGlvbiNpbmNsdWRlc1xuICAgKi9cbiAgcmVhZG9ubHkgaW5jbHVkZXM/OiBzdHJpbmdbXTtcblxuICAvKipcbiAgICogVGhlIG1heGltdW0gc291cmNlLWZpbGUgc2l6ZSBpbiBieXRlcy4gQmlvbWUgc2tpcHMgbGFyZ2VyIGZpbGVzIGFuZCBlbWl0cyBhIHdhcm5pbmdcbiAgICogZGlhZ25vc3RpYy4gRGVmYXVsdHMgdG8gYDEgTWlCYC5cbiAgICpcbiAgICogQGRlZmF1bHQgMSBNaUJgLlxuICAgKiBAc2NoZW1hIEZpbGVzQ29uZmlndXJhdGlvbiNtYXhTaXplXG4gICAqL1xuICByZWFkb25seSBtYXhTaXplPzogbnVtYmVyO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGFuIG9iamVjdCBvZiB0eXBlICdGaWxlc0NvbmZpZ3VyYXRpb24nIHRvIEpTT04gcmVwcmVzZW50YXRpb24uXG4gKiBAaW50ZXJuYWxcbiAqL1xuLyogZXNsaW50LWRpc2FibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvSnNvbl9GaWxlc0NvbmZpZ3VyYXRpb24ob2JqOiBGaWxlc0NvbmZpZ3VyYXRpb24gfCB1bmRlZmluZWQpOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgdW5kZWZpbmVkIHtcbiAgaWYgKG9iaiA9PT0gdW5kZWZpbmVkKSB7IHJldHVybiB1bmRlZmluZWQ7IH1cbiAgY29uc3QgcmVzdWx0ID0ge1xuICAgICdleHBlcmltZW50YWxTY2FubmVySWdub3Jlcyc6IG9iai5leHBlcmltZW50YWxTY2FubmVySWdub3Jlcz8ubWFwKHkgPT4geSksXG4gICAgJ2lnbm9yZVVua25vd24nOiBvYmouaWdub3JlVW5rbm93bixcbiAgICAnaW5jbHVkZXMnOiBvYmouaW5jbHVkZXM/Lm1hcCh5ID0+IHkpLFxuICAgICdtYXhTaXplJzogb2JqLm1heFNpemUsXG4gIH07XG4gIC8vIGZpbHRlciB1bmRlZmluZWQgdmFsdWVzXG4gIHJldHVybiBPYmplY3QuZW50cmllcyhyZXN1bHQpLnJlZHVjZSgociwgaSkgPT4gKGlbMV0gPT09IHVuZGVmaW5lZCkgPyByIDogKHsgLi4uciwgW2lbMF1dOiBpWzFdIH0pLCB7fSk7XG59XG4vKiBlc2xpbnQtZW5hYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cblxuLyoqXG4gKiBDb25maWd1cmVzIGZvcm1hdHRpbmcgZm9yIHNlbGVjdGVkIGZpbGVzLlxuICpcbiAqIEBzY2hlbWEgRm9ybWF0dGVyQ29uZmlndXJhdGlvblxuICovXG5leHBvcnQgaW50ZXJmYWNlIEZvcm1hdHRlckNvbmZpZ3VyYXRpb24ge1xuICAvKipcbiAgICogVGhlIGF0dHJpYnV0ZSBwb3NpdGlvbiBzdHlsZSBpbiBIVE1MLWxpa2UgbGFuZ3VhZ2VzLiBEZWZhdWx0cyB0byBgYXV0b2AuXG4gICAqXG4gICAqIEBkZWZhdWx0IGF1dG9gLlxuICAgKiBAc2NoZW1hIEZvcm1hdHRlckNvbmZpZ3VyYXRpb24jYXR0cmlidXRlUG9zaXRpb25cbiAgICovXG4gIHJlYWRvbmx5IGF0dHJpYnV0ZVBvc2l0aW9uPzogQXR0cmlidXRlUG9zaXRpb247XG5cbiAgLyoqXG4gICAqIENvbnRyb2xzIHRoZSBwbGFjZW1lbnQgb2YgdGhlIGNsb3NpbmcgYnJhY2tldCBmb3IgbXVsdGlsaW5lIEhUTUwgYW5kIEpTWCBvcGVuaW5nIHRhZ3MuIEJpb21lXG4gICAqIHBsYWNlcyB0aGUgYnJhY2tldCBhdCB0aGUgZW5kIG9mIHRoZSBsYXN0IGF0dHJpYnV0ZSBsaW5lIHdoZW4gZW5hYmxlZCBhbmQgb24gaXRzIG93biBsaW5lIHdoZW5cbiAgICogZGlzYWJsZWQuIFRoaXMgYWxzbyBhZmZlY3RzIHNlbGYtY2xvc2luZyBIVE1MIGVsZW1lbnRzLCBidXQgc2VsZi1jbG9zaW5nIEpTWCBlbGVtZW50cyBhcmVcbiAgICogdW5hZmZlY3RlZC4gRGVmYXVsdHMgdG8gYGZhbHNlYC5cbiAgICpcbiAgICogQGRlZmF1bHQgZmFsc2VgLlxuICAgKiBAc2NoZW1hIEZvcm1hdHRlckNvbmZpZ3VyYXRpb24jYnJhY2tldFNhbWVMaW5lXG4gICAqL1xuICByZWFkb25seSBicmFja2V0U2FtZUxpbmU/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBDb250cm9scyBzcGFjZXMgaW5zaWRlIGJyYWNlcyBpbiBzdXBwb3J0ZWQgc2luZ2xlLWxpbmUgc3RydWN0dXJlcy4gVGhlIGFmZmVjdGVkIHN0cnVjdHVyZXNcbiAgICogdmFyeSBieSBsYW5ndWFnZS4gRGVmYXVsdHMgdG8gYHRydWVgLlxuICAgKlxuICAgKiBAZGVmYXVsdCB0cnVlYC5cbiAgICogQHNjaGVtYSBGb3JtYXR0ZXJDb25maWd1cmF0aW9uI2JyYWNrZXRTcGFjaW5nXG4gICAqL1xuICByZWFkb25seSBicmFja2V0U3BhY2luZz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIENvbnRyb2xzIHNwYWNlcyBpbW1lZGlhdGVseSBpbnNpZGUgc3VwcG9ydGVkIGRlbGltaXRlcnMgd2hlbiB0aGVpciBjb250ZW50IGZpdHMgb24gb25lIGxpbmUuXG4gICAqIEl0IGRvZXNuJ3QgYWRkIHNwYWNlcyBiZWZvcmUgb3BlbmluZyBkZWxpbWl0ZXJzIG9yIGluc2lkZSBlbXB0eSBkZWxpbWl0ZXJzLlxuICAgKlxuICAgKiBUaGUgYWZmZWN0ZWQgZGVsaW1pdGVycyB2YXJ5IGJ5IGxhbmd1YWdlLiBEZWZhdWx0cyB0byBgZmFsc2VgLlxuICAgKlxuICAgKiBAZGVmYXVsdCBmYWxzZWAuXG4gICAqIEBzY2hlbWEgRm9ybWF0dGVyQ29uZmlndXJhdGlvbiNkZWxpbWl0ZXJTcGFjaW5nXG4gICAqL1xuICByZWFkb25seSBkZWxpbWl0ZXJTcGFjaW5nPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogRW5hYmxlcyBvciBkaXNhYmxlcyB0aGUgZm9ybWF0dGVyLiBEZWZhdWx0cyB0byBgdHJ1ZWAuXG4gICAqXG4gICAqIEBkZWZhdWx0IHRydWVgLlxuICAgKiBAc2NoZW1hIEZvcm1hdHRlckNvbmZpZ3VyYXRpb24jZW5hYmxlZFxuICAgKi9cbiAgcmVhZG9ubHkgZW5hYmxlZD86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIENvbnRyb2xzIHdoZXRoZXIgYXJyYXlzIGFuZCBvYmplY3RzIGFyZSBmb3JtYXR0ZWQgb24gb25lIGxpbmUgb3IgbXVsdGlwbGUgbGluZXMuXG4gICAqXG4gICAqIGBhdXRvYCBmb3JtYXRzIG9iamVjdHMgb24gbXVsdGlwbGUgbGluZXMgaWYgdGhlIGZpcnN0IHByb3BlcnR5IGhhcyBhIG5ld2xpbmUsIGFuZCBhcnJheXMgb25cbiAgICogb25lIGxpbmUgaWYgdGhleSBmaXQuXG4gICAqXG4gICAqIGBhbHdheXNgIGZvcm1hdHMgYXJyYXlzIGFuZCBvYmplY3RzIG9uIG11bHRpcGxlIGxpbmVzLlxuICAgKlxuICAgKiBgbmV2ZXJgIGZvcm1hdHMgYXJyYXlzIGFuZCBvYmplY3RzIG9uIG9uZSBsaW5lIGlmIHRoZXkgZml0LlxuICAgKlxuICAgKiBEZWZhdWx0cyB0byBgYXV0b2AuXG4gICAqXG4gICAqIFdoZW4gZm9ybWF0dGluZyBgcGFja2FnZS5qc29uYCwgQmlvbWUgdXNlcyBgYWx3YXlzYCB1bmxlc3MgY29uZmlndXJlZCBvdGhlcndpc2UuXG4gICAqXG4gICAqIEBkZWZhdWx0IGF1dG9gLlxuICAgKiBAc2NoZW1hIEZvcm1hdHRlckNvbmZpZ3VyYXRpb24jZXhwYW5kXG4gICAqL1xuICByZWFkb25seSBleHBhbmQ/OiBFeHBhbmQ7XG5cbiAgLyoqXG4gICAqIEFsbG93cyBmb3JtYXR0aW5nIGZpbGVzIHRoYXQgY29udGFpbiBzeW50YXggZXJyb3JzIHdoZW4gc2V0IHRvIGB0cnVlYC4gRGVmYXVsdHMgdG8gYGZhbHNlYC5cbiAgICpcbiAgICogQGRlZmF1bHQgZmFsc2VgLlxuICAgKiBAc2NoZW1hIEZvcm1hdHRlckNvbmZpZ3VyYXRpb24jZm9ybWF0V2l0aEVycm9yc1xuICAgKi9cbiAgcmVhZG9ubHkgZm9ybWF0V2l0aEVycm9ycz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEEgbGlzdCBvZiBnbG9iIHBhdHRlcm5zIHNlbGVjdGluZyBmaWxlcyB0byBmb3JtYXQuIElmIG9taXR0ZWQsIGFsbCBmaWxlcyBzZWxlY3RlZCBieVxuICAgKiBgZmlsZXMuaW5jbHVkZXNgIHJlbWFpbiBlbGlnaWJsZSBmb3IgZm9ybWF0dGluZy4gQW4gZW1wdHkgbGlzdCBzZWxlY3RzIG5vIGZpbGVzLiBUaGlzIG9wdGlvblxuICAgKiBjYW4gb25seSBuYXJyb3cgdGhlIGZpbGVzIHNlbGVjdGVkIGJ5IGBmaWxlcy5pbmNsdWRlc2AuXG4gICAqXG4gICAqIEBzY2hlbWEgRm9ybWF0dGVyQ29uZmlndXJhdGlvbiNpbmNsdWRlc1xuICAgKi9cbiAgcmVhZG9ubHkgaW5jbHVkZXM/OiBzdHJpbmdbXTtcblxuICAvKipcbiAgICogVXNlcyB0YWJzIG9yIHNwYWNlcyBmb3IgaW5kZW50YXRpb24uIERlZmF1bHRzIHRvIGB0YWJgLlxuICAgKlxuICAgKiBAZGVmYXVsdCB0YWJgLlxuICAgKiBAc2NoZW1hIEZvcm1hdHRlckNvbmZpZ3VyYXRpb24jaW5kZW50U3R5bGVcbiAgICovXG4gIHJlYWRvbmx5IGluZGVudFN0eWxlPzogSW5kZW50U3R5bGU7XG5cbiAgLyoqXG4gICAqIFNldHMgdGhlIGluZGVudGF0aW9uIHdpZHRoLiBXaXRoIHNwYWNlIGluZGVudGF0aW9uLCB0aGlzIGlzIHRoZSBudW1iZXIgb2Ygc3BhY2VzIGVtaXR0ZWQgcGVyXG4gICAqIGluZGVudGF0aW9uIGxldmVsLiBXaXRoIHRhYiBpbmRlbnRhdGlvbiwgQmlvbWUgZW1pdHMgb25lIHRhYiBwZXIgbGV2ZWwgYW5kIHVzZXMgdGhpcyB2YWx1ZSBhc1xuICAgKiB0aGUgdGFiJ3MgZGlzcGxheSB3aWR0aCB3aGVuIGNhbGN1bGF0aW5nIGxpbmUgbGVuZ3RoLiBBY2NlcHRlZCB2YWx1ZXMgYXJlIGAwYCB0aHJvdWdoIGAyNGAuXG4gICAqIERlZmF1bHRzIHRvIGAyYC5cbiAgICpcbiAgICogQGRlZmF1bHQgMmAuXG4gICAqIEBzY2hlbWEgRm9ybWF0dGVyQ29uZmlndXJhdGlvbiNpbmRlbnRXaWR0aFxuICAgKi9cbiAgcmVhZG9ubHkgaW5kZW50V2lkdGg/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFNlbGVjdHMgdGhlIGxpbmUgZW5kaW5nLiBgYXV0b2AgdXNlcyB0aGUgcGxhdGZvcm0gY29udmVudGlvbi4gRGVmYXVsdHMgdG8gYGxmYC5cbiAgICpcbiAgICogQGRlZmF1bHQgbGZgLlxuICAgKiBAc2NoZW1hIEZvcm1hdHRlckNvbmZpZ3VyYXRpb24jbGluZUVuZGluZ1xuICAgKi9cbiAgcmVhZG9ubHkgbGluZUVuZGluZz86IExpbmVFbmRpbmc7XG5cbiAgLyoqXG4gICAqIFNldHMgdGhlIHByZWZlcnJlZCBtYXhpbXVtIGxpbmUgd2lkdGggdXNlZCB3aGVuIGRlY2lkaW5nIHdoZXJlIHRvIHdyYXAgY29kZS4gU29tZSBjb250ZW50LFxuICAgKiBzdWNoIGFzIGxvbmcgdW5icmVha2FibGUgc3RyaW5ncywgbWF5IHN0aWxsIGV4Y2VlZCB0aGlzIHdpZHRoLiBBY2NlcHRlZCB2YWx1ZXMgYXJlIGAxYCB0aHJvdWdoXG4gICAqIGAzMjBgLiBEZWZhdWx0cyB0byBgODBgLlxuICAgKlxuICAgKiBAZGVmYXVsdCA4MGAuXG4gICAqIEBzY2hlbWEgRm9ybWF0dGVyQ29uZmlndXJhdGlvbiNsaW5lV2lkdGhcbiAgICovXG4gIHJlYWRvbmx5IGxpbmVXaWR0aD86IG51bWJlcjtcblxuICAvKipcbiAgICogV2hldGhlciB0byBhZGQgYSB0cmFpbGluZyBuZXdsaW5lIGF0IHRoZSBlbmQgb2YgdGhlIGZpbGUuIERlZmF1bHRzIHRvIGB0cnVlYC4gRGlzYWJsaW5nXG4gICAqIHRoaXMgb3B0aW9uIGNhbiBjYXVzZSBjb21wYXRpYmlsaXR5IHByb2JsZW1zIHdpdGggb3RoZXIgdG9vbHMuXG4gICAqXG4gICAqIEBkZWZhdWx0IHRydWVgLiBEaXNhYmxpbmdcbiAgICogQHNjaGVtYSBGb3JtYXR0ZXJDb25maWd1cmF0aW9uI3RyYWlsaW5nTmV3bGluZVxuICAgKi9cbiAgcmVhZG9ubHkgdHJhaWxpbmdOZXdsaW5lPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogQ29udHJvbHMgd2hldGhlciBCaW9tZSBsb2FkcyBmb3JtYXR0ZXIgc2V0dGluZ3MgZnJvbSBhbiBgLmVkaXRvcmNvbmZpZ2AgZmlsZS4gQmlvbWUgcmVhZHNcbiAgICogYGluZGVudF9zdHlsZWAsIGBpbmRlbnRfc2l6ZWAsIGBlbmRfb2ZfbGluZWAsIGFuZCBgaW5zZXJ0X2ZpbmFsX25ld2xpbmVgLiBTZXR0aW5ncyBpblxuICAgKiBgYmlvbWUuanNvbmAgb3IgYGJpb21lLmpzb25jYCB0YWtlIHByZWNlZGVuY2UuIEJpb21lIGxvYWRzIG9ubHkgb25lIGAuZWRpdG9yY29uZmlnYC4gTmVzdGVkXG4gICAqIGNhc2NhZGluZyBjb25maWd1cmF0aW9ucyBhbmQgdGhlIEVkaXRvckNvbmZpZyBgcm9vdGAgcHJvcGVydHkgYXJlIG5vdCBzdXBwb3J0ZWQuIERlZmF1bHRzIHRvXG4gICAqIGBmYWxzZWAuXG4gICAqXG4gICAqIEBkZWZhdWx0IGZhbHNlYC5cbiAgICogQHNjaGVtYSBGb3JtYXR0ZXJDb25maWd1cmF0aW9uI3VzZUVkaXRvcmNvbmZpZ1xuICAgKi9cbiAgcmVhZG9ubHkgdXNlRWRpdG9yY29uZmlnPzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhbiBvYmplY3Qgb2YgdHlwZSAnRm9ybWF0dGVyQ29uZmlndXJhdGlvbicgdG8gSlNPTiByZXByZXNlbnRhdGlvbi5cbiAqIEBpbnRlcm5hbFxuICovXG4vKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5leHBvcnQgZnVuY3Rpb24gdG9Kc29uX0Zvcm1hdHRlckNvbmZpZ3VyYXRpb24ob2JqOiBGb3JtYXR0ZXJDb25maWd1cmF0aW9uIHwgdW5kZWZpbmVkKTogUmVjb3JkPHN0cmluZywgYW55PiB8IHVuZGVmaW5lZCB7XG4gIGlmIChvYmogPT09IHVuZGVmaW5lZCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9XG4gIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAnYXR0cmlidXRlUG9zaXRpb24nOiBvYmouYXR0cmlidXRlUG9zaXRpb24sXG4gICAgJ2JyYWNrZXRTYW1lTGluZSc6IG9iai5icmFja2V0U2FtZUxpbmUsXG4gICAgJ2JyYWNrZXRTcGFjaW5nJzogb2JqLmJyYWNrZXRTcGFjaW5nLFxuICAgICdkZWxpbWl0ZXJTcGFjaW5nJzogb2JqLmRlbGltaXRlclNwYWNpbmcsXG4gICAgJ2VuYWJsZWQnOiBvYmouZW5hYmxlZCxcbiAgICAnZXhwYW5kJzogb2JqLmV4cGFuZCxcbiAgICAnZm9ybWF0V2l0aEVycm9ycyc6IG9iai5mb3JtYXRXaXRoRXJyb3JzLFxuICAgICdpbmNsdWRlcyc6IG9iai5pbmNsdWRlcz8ubWFwKHkgPT4geSksXG4gICAgJ2luZGVudFN0eWxlJzogb2JqLmluZGVudFN0eWxlLFxuICAgICdpbmRlbnRXaWR0aCc6IG9iai5pbmRlbnRXaWR0aCxcbiAgICAnbGluZUVuZGluZyc6IG9iai5saW5lRW5kaW5nLFxuICAgICdsaW5lV2lkdGgnOiBvYmoubGluZVdpZHRoLFxuICAgICd0cmFpbGluZ05ld2xpbmUnOiBvYmoudHJhaWxpbmdOZXdsaW5lLFxuICAgICd1c2VFZGl0b3Jjb25maWcnOiBvYmoudXNlRWRpdG9yY29uZmlnLFxuICB9O1xuICAvLyBmaWx0ZXIgdW5kZWZpbmVkIHZhbHVlc1xuICByZXR1cm4gT2JqZWN0LmVudHJpZXMocmVzdWx0KS5yZWR1Y2UoKHIsIGkpID0+IChpWzFdID09PSB1bmRlZmluZWQpID8gciA6ICh7IC4uLnIsIFtpWzBdXTogaVsxXSB9KSwge30pO1xufVxuLyogZXNsaW50LWVuYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5cbi8qKlxuICogT3B0aW9ucyBhcHBsaWVkIHRvIEdyYXBoUUwgZmlsZXMuXG4gKlxuICogTGFuZ3VhZ2Utc3BlY2lmaWMgc2V0dGluZ3MgdGFrZSBwcmVjZWRlbmNlIG92ZXIgY29ycmVzcG9uZGluZyBnbG9iYWwgc2V0dGluZ3MuIEdsb2JhbCBzZXR0aW5nc1xuICogYXBwbHkgd2hlbiB0aGVpciBsYW5ndWFnZS1zcGVjaWZpYyBjb3VudGVycGFydHMgYXJlIG9taXR0ZWQsIHVubGVzcyBzdGF0ZWQgb3RoZXJ3aXNlLlxuICpcbiAqIEBzY2hlbWEgR3JhcGhxbENvbmZpZ3VyYXRpb25cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBHcmFwaHFsQ29uZmlndXJhdGlvbiB7XG4gIC8qKlxuICAgKiBHcmFwaFFMIGFzc2lzdCBvcHRpb25zLlxuICAgKlxuICAgKiBAc2NoZW1hIEdyYXBocWxDb25maWd1cmF0aW9uI2Fzc2lzdFxuICAgKi9cbiAgcmVhZG9ubHkgYXNzaXN0PzogR3JhcGhxbEFzc2lzdENvbmZpZ3VyYXRpb247XG5cbiAgLyoqXG4gICAqIEdyYXBoUUwgZm9ybWF0dGVyIG9wdGlvbnMuXG4gICAqXG4gICAqIEBzY2hlbWEgR3JhcGhxbENvbmZpZ3VyYXRpb24jZm9ybWF0dGVyXG4gICAqL1xuICByZWFkb25seSBmb3JtYXR0ZXI/OiBHcmFwaHFsRm9ybWF0dGVyQ29uZmlndXJhdGlvbjtcblxuICAvKipcbiAgICogR3JhcGhRTCBsaW50ZXIgb3B0aW9ucy5cbiAgICpcbiAgICogQHNjaGVtYSBHcmFwaHFsQ29uZmlndXJhdGlvbiNsaW50ZXJcbiAgICovXG4gIHJlYWRvbmx5IGxpbnRlcj86IEdyYXBocWxMaW50ZXJDb25maWd1cmF0aW9uO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGFuIG9iamVjdCBvZiB0eXBlICdHcmFwaHFsQ29uZmlndXJhdGlvbicgdG8gSlNPTiByZXByZXNlbnRhdGlvbi5cbiAqIEBpbnRlcm5hbFxuICovXG4vKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5leHBvcnQgZnVuY3Rpb24gdG9Kc29uX0dyYXBocWxDb25maWd1cmF0aW9uKG9iajogR3JhcGhxbENvbmZpZ3VyYXRpb24gfCB1bmRlZmluZWQpOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgdW5kZWZpbmVkIHtcbiAgaWYgKG9iaiA9PT0gdW5kZWZpbmVkKSB7IHJldHVybiB1bmRlZmluZWQ7IH1cbiAgY29uc3QgcmVzdWx0ID0ge1xuICAgICdhc3Npc3QnOiB0b0pzb25fR3JhcGhxbEFzc2lzdENvbmZpZ3VyYXRpb24ob2JqLmFzc2lzdCksXG4gICAgJ2Zvcm1hdHRlcic6IHRvSnNvbl9HcmFwaHFsRm9ybWF0dGVyQ29uZmlndXJhdGlvbihvYmouZm9ybWF0dGVyKSxcbiAgICAnbGludGVyJzogdG9Kc29uX0dyYXBocWxMaW50ZXJDb25maWd1cmF0aW9uKG9iai5saW50ZXIpLFxuICB9O1xuICAvLyBmaWx0ZXIgdW5kZWZpbmVkIHZhbHVlc1xuICByZXR1cm4gT2JqZWN0LmVudHJpZXMocmVzdWx0KS5yZWR1Y2UoKHIsIGkpID0+IChpWzFdID09PSB1bmRlZmluZWQpID8gciA6ICh7IC4uLnIsIFtpWzBdXTogaVsxXSB9KSwge30pO1xufVxuLyogZXNsaW50LWVuYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5cbi8qKlxuICogT3B0aW9ucyBhcHBsaWVkIHRvIEdyaXRRTCBmaWxlcy5cbiAqXG4gKiBMYW5ndWFnZS1zcGVjaWZpYyBzZXR0aW5ncyB0YWtlIHByZWNlZGVuY2Ugb3ZlciBjb3JyZXNwb25kaW5nIGdsb2JhbCBzZXR0aW5ncy4gR2xvYmFsIHNldHRpbmdzXG4gKiBhcHBseSB3aGVuIHRoZWlyIGxhbmd1YWdlLXNwZWNpZmljIGNvdW50ZXJwYXJ0cyBhcmUgb21pdHRlZCwgdW5sZXNzIHN0YXRlZCBvdGhlcndpc2UuXG4gKlxuICogQHNjaGVtYSBHcml0Q29uZmlndXJhdGlvblxuICovXG5leHBvcnQgaW50ZXJmYWNlIEdyaXRDb25maWd1cmF0aW9uIHtcbiAgLyoqXG4gICAqIEdyaXRRTCBhc3Npc3Qgb3B0aW9ucy5cbiAgICpcbiAgICogQHNjaGVtYSBHcml0Q29uZmlndXJhdGlvbiNhc3Npc3RcbiAgICovXG4gIHJlYWRvbmx5IGFzc2lzdD86IEdyaXRBc3Npc3RDb25maWd1cmF0aW9uO1xuXG4gIC8qKlxuICAgKiBHcml0UUwgZm9ybWF0dGVyIG9wdGlvbnMuXG4gICAqXG4gICAqIEBzY2hlbWEgR3JpdENvbmZpZ3VyYXRpb24jZm9ybWF0dGVyXG4gICAqL1xuICByZWFkb25seSBmb3JtYXR0ZXI/OiBHcml0Rm9ybWF0dGVyQ29uZmlndXJhdGlvbjtcblxuICAvKipcbiAgICogR3JpdFFMIGxpbnRlciBvcHRpb25zLlxuICAgKlxuICAgKiBAc2NoZW1hIEdyaXRDb25maWd1cmF0aW9uI2xpbnRlclxuICAgKi9cbiAgcmVhZG9ubHkgbGludGVyPzogR3JpdExpbnRlckNvbmZpZ3VyYXRpb247XG59XG5cbi8qKlxuICogQ29udmVydHMgYW4gb2JqZWN0IG9mIHR5cGUgJ0dyaXRDb25maWd1cmF0aW9uJyB0byBKU09OIHJlcHJlc2VudGF0aW9uLlxuICogQGludGVybmFsXG4gKi9cbi8qIGVzbGludC1kaXNhYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0pzb25fR3JpdENvbmZpZ3VyYXRpb24ob2JqOiBHcml0Q29uZmlndXJhdGlvbiB8IHVuZGVmaW5lZCk6IFJlY29yZDxzdHJpbmcsIGFueT4gfCB1bmRlZmluZWQge1xuICBpZiAob2JqID09PSB1bmRlZmluZWQpIHsgcmV0dXJuIHVuZGVmaW5lZDsgfVxuICBjb25zdCByZXN1bHQgPSB7XG4gICAgJ2Fzc2lzdCc6IHRvSnNvbl9Hcml0QXNzaXN0Q29uZmlndXJhdGlvbihvYmouYXNzaXN0KSxcbiAgICAnZm9ybWF0dGVyJzogdG9Kc29uX0dyaXRGb3JtYXR0ZXJDb25maWd1cmF0aW9uKG9iai5mb3JtYXR0ZXIpLFxuICAgICdsaW50ZXInOiB0b0pzb25fR3JpdExpbnRlckNvbmZpZ3VyYXRpb24ob2JqLmxpbnRlciksXG4gIH07XG4gIC8vIGZpbHRlciB1bmRlZmluZWQgdmFsdWVzXG4gIHJldHVybiBPYmplY3QuZW50cmllcyhyZXN1bHQpLnJlZHVjZSgociwgaSkgPT4gKGlbMV0gPT09IHVuZGVmaW5lZCkgPyByIDogKHsgLi4uciwgW2lbMF1dOiBpWzFdIH0pLCB7fSk7XG59XG4vKiBlc2xpbnQtZW5hYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cblxuLyoqXG4gKiBPcHRpb25zIGFwcGxpZWQgdG8gSFRNTCBhbmQgbGFuZ3VhZ2VzIHRoYXQgZXh0ZW5kIGl0LlxuICpcbiAqIEZ1bGwgSFRNTCBzdXBwb3J0IGFuZCB0aGUgSFRNTCBmb3JtYXR0ZXIgYXJlIGV4cGVyaW1lbnRhbC4gQmlvbWUgYWltcyB0byBtaW5pbWl6ZSBicmVha2luZ1xuICogY2hhbmdlcywgYnV0IGJ1ZyBmaXhlcyBhbmQgbmV3IGZlYXR1cmVzIG1heSBjaGFuZ2UgZm9ybWF0dGluZyBvdXRwdXQgb3IgZGlhZ25vc3RpY3MuXG4gKlxuICogTGFuZ3VhZ2Utc3BlY2lmaWMgc2V0dGluZ3MgdGFrZSBwcmVjZWRlbmNlIG92ZXIgY29ycmVzcG9uZGluZyBnbG9iYWwgc2V0dGluZ3MuIEdsb2JhbCBzZXR0aW5nc1xuICogYXBwbHkgd2hlbiB0aGVpciBsYW5ndWFnZS1zcGVjaWZpYyBjb3VudGVycGFydHMgYXJlIG9taXR0ZWQsIHVubGVzcyBzdGF0ZWQgb3RoZXJ3aXNlLlxuICpcbiAqIEBzY2hlbWEgSHRtbENvbmZpZ3VyYXRpb25cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBIdG1sQ29uZmlndXJhdGlvbiB7XG4gIC8qKlxuICAgKiBIVE1MIGFzc2lzdCBvcHRpb25zLlxuICAgKlxuICAgKiBAc2NoZW1hIEh0bWxDb25maWd1cmF0aW9uI2Fzc2lzdFxuICAgKi9cbiAgcmVhZG9ubHkgYXNzaXN0PzogSHRtbEFzc2lzdENvbmZpZ3VyYXRpb247XG5cbiAgLyoqXG4gICAqIEVuYWJsZXMgQmlvbWUncyBleHBlcmltZW50YWwgZnVsbCBzdXBwb3J0IGZvciBgLmh0bWxgLCBgLnZ1ZWAsIGAuc3ZlbHRlYCwgYW5kIGAuYXN0cm9gIGZpbGVzLlxuICAgKiBJbiB0aGlzIG1vZGUsIEJpb21lIHBhcnNlcyB0aGUgY29tcGxldGUgZG9jdW1lbnQgYW5kIGNhbiBhbmFseXplIG9yIGZvcm1hdCBpdHMgbWFya3VwIGFuZFxuICAgKiBzdXBwb3J0ZWQgZW1iZWRkZWQgbGFuZ3VhZ2VzLlxuICAgKlxuICAgKiBXaGVuIGRpc2FibGVkLCBgLnZ1ZWAsIGAuc3ZlbHRlYCwgYW5kIGAuYXN0cm9gIGZpbGVzIHVzZSBsZWdhY3kgaGFuZGxpbmcsIHdoaWNoIGV4dHJhY3RzIHRoZWlyXG4gICAqIEphdmFTY3JpcHQgb3IgVHlwZVNjcmlwdCBwb3J0aW9ucyBhbmQgbGVhdmVzIHRoZSByZXN0IHVuY2hhbmdlZC4gVGhpcyBvcHRpb24gc2VsZWN0cyBob3dcbiAgICogdGhlc2UgZmlsZXMgYXJlIHByb2Nlc3NlZC4gSXQgZG9lcyBub3QgZW5hYmxlIHRoZSBIVE1MIGZvcm1hdHRlci4gU2V0XG4gICAqIGBodG1sLmZvcm1hdHRlci5lbmFibGVkYCB0byBgdHJ1ZWAgdG8gZm9ybWF0IGNvbXBsZXRlIEhUTUwsIFZ1ZSwgU3ZlbHRlLCBhbmQgQXN0cm8gZmlsZXMuXG4gICAqIERlZmF1bHRzIHRvIGBmYWxzZWAuXG4gICAqXG4gICAqIEBkZWZhdWx0IGZhbHNlYC5cbiAgICogQHNjaGVtYSBIdG1sQ29uZmlndXJhdGlvbiNleHBlcmltZW50YWxGdWxsU3VwcG9ydEVuYWJsZWRcbiAgICovXG4gIHJlYWRvbmx5IGV4cGVyaW1lbnRhbEZ1bGxTdXBwb3J0RW5hYmxlZD86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEhUTUwgZm9ybWF0dGVyIG9wdGlvbnMuXG4gICAqXG4gICAqIEBzY2hlbWEgSHRtbENvbmZpZ3VyYXRpb24jZm9ybWF0dGVyXG4gICAqL1xuICByZWFkb25seSBmb3JtYXR0ZXI/OiBIdG1sRm9ybWF0dGVyQ29uZmlndXJhdGlvbjtcblxuICAvKipcbiAgICogSFRNTCBsaW50ZXIgb3B0aW9ucy5cbiAgICpcbiAgICogQHNjaGVtYSBIdG1sQ29uZmlndXJhdGlvbiNsaW50ZXJcbiAgICovXG4gIHJlYWRvbmx5IGxpbnRlcj86IEh0bWxMaW50ZXJDb25maWd1cmF0aW9uO1xuXG4gIC8qKlxuICAgKiBIVE1MIHBhcnNpbmcgb3B0aW9ucy5cbiAgICpcbiAgICogQHNjaGVtYSBIdG1sQ29uZmlndXJhdGlvbiNwYXJzZXJcbiAgICovXG4gIHJlYWRvbmx5IHBhcnNlcj86IEh0bWxQYXJzZXJDb25maWd1cmF0aW9uO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGFuIG9iamVjdCBvZiB0eXBlICdIdG1sQ29uZmlndXJhdGlvbicgdG8gSlNPTiByZXByZXNlbnRhdGlvbi5cbiAqIEBpbnRlcm5hbFxuICovXG4vKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5leHBvcnQgZnVuY3Rpb24gdG9Kc29uX0h0bWxDb25maWd1cmF0aW9uKG9iajogSHRtbENvbmZpZ3VyYXRpb24gfCB1bmRlZmluZWQpOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgdW5kZWZpbmVkIHtcbiAgaWYgKG9iaiA9PT0gdW5kZWZpbmVkKSB7IHJldHVybiB1bmRlZmluZWQ7IH1cbiAgY29uc3QgcmVzdWx0ID0ge1xuICAgICdhc3Npc3QnOiB0b0pzb25fSHRtbEFzc2lzdENvbmZpZ3VyYXRpb24ob2JqLmFzc2lzdCksXG4gICAgJ2V4cGVyaW1lbnRhbEZ1bGxTdXBwb3J0RW5hYmxlZCc6IG9iai5leHBlcmltZW50YWxGdWxsU3VwcG9ydEVuYWJsZWQsXG4gICAgJ2Zvcm1hdHRlcic6IHRvSnNvbl9IdG1sRm9ybWF0dGVyQ29uZmlndXJhdGlvbihvYmouZm9ybWF0dGVyKSxcbiAgICAnbGludGVyJzogdG9Kc29uX0h0bWxMaW50ZXJDb25maWd1cmF0aW9uKG9iai5saW50ZXIpLFxuICAgICdwYXJzZXInOiB0b0pzb25fSHRtbFBhcnNlckNvbmZpZ3VyYXRpb24ob2JqLnBhcnNlciksXG4gIH07XG4gIC8vIGZpbHRlciB1bmRlZmluZWQgdmFsdWVzXG4gIHJldHVybiBPYmplY3QuZW50cmllcyhyZXN1bHQpLnJlZHVjZSgociwgaSkgPT4gKGlbMV0gPT09IHVuZGVmaW5lZCkgPyByIDogKHsgLi4uciwgW2lbMF1dOiBpWzFdIH0pLCB7fSk7XG59XG4vKiBlc2xpbnQtZW5hYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cblxuLyoqXG4gKiBPcHRpb25zIGFwcGxpZWQgdG8gSmF2YVNjcmlwdCwgVHlwZVNjcmlwdCwgSlNYLCBUU1gsIGFuZCBzdXBwb3J0ZWQgbGFuZ3VhZ2VzIHRoYXQgZW1iZWRcbiAqIEphdmFTY3JpcHQuXG4gKlxuICogTGFuZ3VhZ2Utc3BlY2lmaWMgc2V0dGluZ3MgdGFrZSBwcmVjZWRlbmNlIG92ZXIgY29ycmVzcG9uZGluZyBnbG9iYWwgc2V0dGluZ3MuIEdsb2JhbCBzZXR0aW5nc1xuICogYXBwbHkgd2hlbiB0aGVpciBsYW5ndWFnZS1zcGVjaWZpYyBjb3VudGVycGFydHMgYXJlIG9taXR0ZWQsIHVubGVzcyBzdGF0ZWQgb3RoZXJ3aXNlLlxuICpcbiAqIEBzY2hlbWEgSnNDb25maWd1cmF0aW9uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSnNDb25maWd1cmF0aW9uIHtcbiAgLyoqXG4gICAqIEphdmFTY3JpcHQgYXNzaXN0IG9wdGlvbnMuXG4gICAqXG4gICAqIEBzY2hlbWEgSnNDb25maWd1cmF0aW9uI2Fzc2lzdFxuICAgKi9cbiAgcmVhZG9ubHkgYXNzaXN0PzogSnNBc3Npc3RDb25maWd1cmF0aW9uO1xuXG4gIC8qKlxuICAgKiBFbmFibGVzIGV4cGVyaW1lbnRhbCBwYXJzaW5nLCBmb3JtYXR0aW5nLCBsaW50aW5nLCBkaWFnbm9zdGljcywgYW5kIGZpeGVzIGZvciBDU1MgYW5kXG4gICAqIEdyYXBoUUwgc25pcHBldHMgZW1iZWRkZWQgaW4gSmF2YVNjcmlwdCBhbmQgVHlwZVNjcmlwdCB0ZW1wbGF0ZSBsaXRlcmFscy5cbiAgICpcbiAgICogQmlvbWUgcmVjb2duaXplcyBDU1MgaW4gYGNzc2AgYW5kIGBzdHlsZWRgIHRlbXBsYXRlcyBhbmQgR3JhcGhRTCBpbiBgZ3FsYCBhbmQgYGdyYXBocWxgXG4gICAqIHRlbXBsYXRlcyBvciBjYWxscy4gVGVtcGxhdGVzIGNvbnRhaW5pbmcgaW50ZXJwb2xhdGlvbnMgYXJlIG5vdCBjdXJyZW50bHkgc3VwcG9ydGVkLlxuICAgKiBEZWZhdWx0cyB0byBgZmFsc2VgLlxuICAgKlxuICAgKiBAZGVmYXVsdCBmYWxzZWAuXG4gICAqIEBzY2hlbWEgSnNDb25maWd1cmF0aW9uI2V4cGVyaW1lbnRhbEVtYmVkZGVkU25pcHBldHNFbmFibGVkXG4gICAqL1xuICByZWFkb25seSBleHBlcmltZW50YWxFbWJlZGRlZFNuaXBwZXRzRW5hYmxlZD86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEphdmFTY3JpcHQgZm9ybWF0dGVyIG9wdGlvbnMuXG4gICAqXG4gICAqIEBzY2hlbWEgSnNDb25maWd1cmF0aW9uI2Zvcm1hdHRlclxuICAgKi9cbiAgcmVhZG9ubHkgZm9ybWF0dGVyPzogSnNGb3JtYXR0ZXJDb25maWd1cmF0aW9uO1xuXG4gIC8qKlxuICAgKiBBIGxpc3Qgb2YgYWRkaXRpb25hbCBuYW1lcyB0aGF0IEJpb21lJ3MgSmF2YVNjcmlwdCBsaW50ZXIgdHJlYXRzIGFzIHByZWRlZmluZWQgZ2xvYmFsXG4gICAqIGJpbmRpbmdzLlxuICAgKlxuICAgKiBVc2UgdGhpcyBmb3IgZ2xvYmFscyBzdXBwbGllZCBieSBhIHJ1bnRpbWUsIGZyYW1ld29yaywgb3IgZXh0ZXJuYWwgc2NyaXB0IHRoYXQgYXJlIG5vdFxuICAgKiBkZWNsYXJlZCBpbiB0aGUgc291cmNlIGZpbGUuXG4gICAqXG4gICAqIEBzY2hlbWEgSnNDb25maWd1cmF0aW9uI2dsb2JhbHNcbiAgICovXG4gIHJlYWRvbmx5IGdsb2JhbHM/OiBzdHJpbmdbXTtcblxuICAvKipcbiAgICogQ29uZmlndXJlcyBob3cgdGhlIGFuYWx5emVyIGFjY291bnRzIGZvciBpbXBvcnRzIHVzZWQgYnkgSlNYLiBUaGlzIG9wdGlvbiBkb2VzIG5vdCB0cmFuc2Zvcm1cbiAgICogSlNYIG9yIHNlbGVjdCBhIHJ1bnRpbWUgZm9yIGEgYnVpbGQgdG9vbC4gRGVmYXVsdHMgdG8gYHRyYW5zcGFyZW50YC5cbiAgICpcbiAgICogQGRlZmF1bHQgdHJhbnNwYXJlbnRgLlxuICAgKiBAc2NoZW1hIEpzQ29uZmlndXJhdGlvbiNqc3hSdW50aW1lXG4gICAqL1xuICByZWFkb25seSBqc3hSdW50aW1lPzogSnN4UnVudGltZTtcblxuICAvKipcbiAgICogSmF2YVNjcmlwdCBsaW50ZXIgb3B0aW9ucy5cbiAgICpcbiAgICogQHNjaGVtYSBKc0NvbmZpZ3VyYXRpb24jbGludGVyXG4gICAqL1xuICByZWFkb25seSBsaW50ZXI/OiBKc0xpbnRlckNvbmZpZ3VyYXRpb247XG5cbiAgLyoqXG4gICAqIEphdmFTY3JpcHQgcGFyc2VyIG9wdGlvbnMuXG4gICAqXG4gICAqIEBzY2hlbWEgSnNDb25maWd1cmF0aW9uI3BhcnNlclxuICAgKi9cbiAgcmVhZG9ubHkgcGFyc2VyPzogSnNQYXJzZXJDb25maWd1cmF0aW9uO1xuXG4gIC8qKlxuICAgKiBKYXZhU2NyaXB0IG1vZHVsZSBhbmQgZGVwZW5kZW5jeSByZXNvbHZlciBvcHRpb25zLlxuICAgKlxuICAgKiBAc2NoZW1hIEpzQ29uZmlndXJhdGlvbiNyZXNvbHZlclxuICAgKi9cbiAgcmVhZG9ubHkgcmVzb2x2ZXI/OiBKc1Jlc29sdmVyQ29uZmlndXJhdGlvbjtcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhbiBvYmplY3Qgb2YgdHlwZSAnSnNDb25maWd1cmF0aW9uJyB0byBKU09OIHJlcHJlc2VudGF0aW9uLlxuICogQGludGVybmFsXG4gKi9cbi8qIGVzbGludC1kaXNhYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0pzb25fSnNDb25maWd1cmF0aW9uKG9iajogSnNDb25maWd1cmF0aW9uIHwgdW5kZWZpbmVkKTogUmVjb3JkPHN0cmluZywgYW55PiB8IHVuZGVmaW5lZCB7XG4gIGlmIChvYmogPT09IHVuZGVmaW5lZCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9XG4gIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAnYXNzaXN0JzogdG9Kc29uX0pzQXNzaXN0Q29uZmlndXJhdGlvbihvYmouYXNzaXN0KSxcbiAgICAnZXhwZXJpbWVudGFsRW1iZWRkZWRTbmlwcGV0c0VuYWJsZWQnOiBvYmouZXhwZXJpbWVudGFsRW1iZWRkZWRTbmlwcGV0c0VuYWJsZWQsXG4gICAgJ2Zvcm1hdHRlcic6IHRvSnNvbl9Kc0Zvcm1hdHRlckNvbmZpZ3VyYXRpb24ob2JqLmZvcm1hdHRlciksXG4gICAgJ2dsb2JhbHMnOiBvYmouZ2xvYmFscz8ubWFwKHkgPT4geSksXG4gICAgJ2pzeFJ1bnRpbWUnOiBvYmouanN4UnVudGltZSxcbiAgICAnbGludGVyJzogdG9Kc29uX0pzTGludGVyQ29uZmlndXJhdGlvbihvYmoubGludGVyKSxcbiAgICAncGFyc2VyJzogdG9Kc29uX0pzUGFyc2VyQ29uZmlndXJhdGlvbihvYmoucGFyc2VyKSxcbiAgICAncmVzb2x2ZXInOiB0b0pzb25fSnNSZXNvbHZlckNvbmZpZ3VyYXRpb24ob2JqLnJlc29sdmVyKSxcbiAgfTtcbiAgLy8gZmlsdGVyIHVuZGVmaW5lZCB2YWx1ZXNcbiAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKHJlc3VsdCkucmVkdWNlKChyLCBpKSA9PiAoaVsxXSA9PT0gdW5kZWZpbmVkKSA/IHIgOiAoeyAuLi5yLCBbaVswXV06IGlbMV0gfSksIHt9KTtcbn1cbi8qIGVzbGludC1lbmFibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuXG4vKipcbiAqIE9wdGlvbnMgYXBwbGllZCB0byBKU09OLCBKU09OQywgYW5kIHJlY29nbml6ZWQgSlNPTi1iYXNlZCBjb25maWd1cmF0aW9uIGZpbGVzLlxuICpcbiAqIExhbmd1YWdlLXNwZWNpZmljIHNldHRpbmdzIHRha2UgcHJlY2VkZW5jZSBvdmVyIGNvcnJlc3BvbmRpbmcgZ2xvYmFsIHNldHRpbmdzLiBHbG9iYWwgc2V0dGluZ3NcbiAqIGFwcGx5IHdoZW4gdGhlaXIgbGFuZ3VhZ2Utc3BlY2lmaWMgY291bnRlcnBhcnRzIGFyZSBvbWl0dGVkLCB1bmxlc3Mgc3RhdGVkIG90aGVyd2lzZS5cbiAqXG4gKiBAc2NoZW1hIEpzb25Db25maWd1cmF0aW9uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSnNvbkNvbmZpZ3VyYXRpb24ge1xuICAvKipcbiAgICogQXNzaXN0IG9wdGlvbnNcbiAgICpcbiAgICogQHNjaGVtYSBKc29uQ29uZmlndXJhdGlvbiNhc3Npc3RcbiAgICovXG4gIHJlYWRvbmx5IGFzc2lzdD86IEpzb25Bc3Npc3RDb25maWd1cmF0aW9uO1xuXG4gIC8qKlxuICAgKiBGb3JtYXR0aW5nIG9wdGlvbnNcbiAgICpcbiAgICogQHNjaGVtYSBKc29uQ29uZmlndXJhdGlvbiNmb3JtYXR0ZXJcbiAgICovXG4gIHJlYWRvbmx5IGZvcm1hdHRlcj86IEpzb25Gb3JtYXR0ZXJDb25maWd1cmF0aW9uO1xuXG4gIC8qKlxuICAgKiBMaW50aW5nIG9wdGlvbnNcbiAgICpcbiAgICogQHNjaGVtYSBKc29uQ29uZmlndXJhdGlvbiNsaW50ZXJcbiAgICovXG4gIHJlYWRvbmx5IGxpbnRlcj86IEpzb25MaW50ZXJDb25maWd1cmF0aW9uO1xuXG4gIC8qKlxuICAgKiBQYXJzaW5nIG9wdGlvbnNcbiAgICpcbiAgICogQHNjaGVtYSBKc29uQ29uZmlndXJhdGlvbiNwYXJzZXJcbiAgICovXG4gIHJlYWRvbmx5IHBhcnNlcj86IEpzb25QYXJzZXJDb25maWd1cmF0aW9uO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGFuIG9iamVjdCBvZiB0eXBlICdKc29uQ29uZmlndXJhdGlvbicgdG8gSlNPTiByZXByZXNlbnRhdGlvbi5cbiAqIEBpbnRlcm5hbFxuICovXG4vKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5leHBvcnQgZnVuY3Rpb24gdG9Kc29uX0pzb25Db25maWd1cmF0aW9uKG9iajogSnNvbkNvbmZpZ3VyYXRpb24gfCB1bmRlZmluZWQpOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgdW5kZWZpbmVkIHtcbiAgaWYgKG9iaiA9PT0gdW5kZWZpbmVkKSB7IHJldHVybiB1bmRlZmluZWQ7IH1cbiAgY29uc3QgcmVzdWx0ID0ge1xuICAgICdhc3Npc3QnOiB0b0pzb25fSnNvbkFzc2lzdENvbmZpZ3VyYXRpb24ob2JqLmFzc2lzdCksXG4gICAgJ2Zvcm1hdHRlcic6IHRvSnNvbl9Kc29uRm9ybWF0dGVyQ29uZmlndXJhdGlvbihvYmouZm9ybWF0dGVyKSxcbiAgICAnbGludGVyJzogdG9Kc29uX0pzb25MaW50ZXJDb25maWd1cmF0aW9uKG9iai5saW50ZXIpLFxuICAgICdwYXJzZXInOiB0b0pzb25fSnNvblBhcnNlckNvbmZpZ3VyYXRpb24ob2JqLnBhcnNlciksXG4gIH07XG4gIC8vIGZpbHRlciB1bmRlZmluZWQgdmFsdWVzXG4gIHJldHVybiBPYmplY3QuZW50cmllcyhyZXN1bHQpLnJlZHVjZSgociwgaSkgPT4gKGlbMV0gPT09IHVuZGVmaW5lZCkgPyByIDogKHsgLi4uciwgW2lbMF1dOiBpWzFdIH0pLCB7fSk7XG59XG4vKiBlc2xpbnQtZW5hYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cblxuLyoqXG4gKiBAc2NoZW1hIExpbnRlckNvbmZpZ3VyYXRpb25cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBMaW50ZXJDb25maWd1cmF0aW9uIHtcbiAgLyoqXG4gICAqIENvbmZpZ3VyZXMgcnVsZXMgYXNzb2NpYXRlZCB3aXRoIGEgZnJhbWV3b3JrLCBsaWJyYXJ5LCBwcm9qZWN0LXdpZGUgYW5hbHlzaXMsIG9yIHR5cGVcbiAgICogYW5hbHlzaXMuIEtleXMgYXJlIGRvbWFpbiBuYW1lcyBhbmQgdmFsdWVzIGFyZSBgYWxsYCwgYHJlY29tbWVuZGVkYCwgb3IgYG5vbmVgLlxuICAgKiBFbmFibGluZyBydWxlcyBmcm9tIHRoZSBgcHJvamVjdGAgb3IgYHR5cGVzYCBkb21haW5zIGFjdGl2YXRlcyBwcm9qZWN0IGFuZCBkZXBlbmRlbmN5XG4gICAqIHNjYW5uaW5nLiBUaGUgYHR5cGVzYCBkb21haW4gYWxzbyBlbmFibGVzIHR5cGUtYXdhcmUgcmVzb2x1dGlvbi5cbiAgICpcbiAgICogQHNjaGVtYSBMaW50ZXJDb25maWd1cmF0aW9uI2RvbWFpbnNcbiAgICovXG4gIHJlYWRvbmx5IGRvbWFpbnM/OiBSdWxlRG9tYWlucztcblxuICAvKipcbiAgICogRW5hYmxlcyBvciBkaXNhYmxlcyB0aGUgbGludGVyLiBEZWZhdWx0cyB0byBgdHJ1ZWAuXG4gICAqXG4gICAqIEBkZWZhdWx0IHRydWVgLlxuICAgKiBAc2NoZW1hIExpbnRlckNvbmZpZ3VyYXRpb24jZW5hYmxlZFxuICAgKi9cbiAgcmVhZG9ubHkgZW5hYmxlZD86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEEgbGlzdCBvZiBnbG9iIHBhdHRlcm5zIHNlbGVjdGluZyBmaWxlcyB0byBsaW50LiBJZiBvbWl0dGVkLCBhbGwgZmlsZXMgc2VsZWN0ZWQgYnlcbiAgICogYGZpbGVzLmluY2x1ZGVzYCByZW1haW4gZWxpZ2libGUgZm9yIGxpbnRpbmcuIEFuIGVtcHR5IGxpc3Qgc2VsZWN0cyBubyBmaWxlcy4gVGhpcyBvcHRpb24gY2FuXG4gICAqIG9ubHkgbmFycm93IHRoZSBmaWxlcyBzZWxlY3RlZCBieSBgZmlsZXMuaW5jbHVkZXNgLlxuICAgKlxuICAgKiBAc2NoZW1hIExpbnRlckNvbmZpZ3VyYXRpb24jaW5jbHVkZXNcbiAgICovXG4gIHJlYWRvbmx5IGluY2x1ZGVzPzogc3RyaW5nW107XG5cbiAgLyoqXG4gICAqIFRoZSBsaW50LXJ1bGUgY29uZmlndXJhdGlvbi5cbiAgICpcbiAgICogQHNjaGVtYSBMaW50ZXJDb25maWd1cmF0aW9uI3J1bGVzXG4gICAqL1xuICByZWFkb25seSBydWxlcz86IFJ1bGVzO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGFuIG9iamVjdCBvZiB0eXBlICdMaW50ZXJDb25maWd1cmF0aW9uJyB0byBKU09OIHJlcHJlc2VudGF0aW9uLlxuICogQGludGVybmFsXG4gKi9cbi8qIGVzbGludC1kaXNhYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0pzb25fTGludGVyQ29uZmlndXJhdGlvbihvYmo6IExpbnRlckNvbmZpZ3VyYXRpb24gfCB1bmRlZmluZWQpOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgdW5kZWZpbmVkIHtcbiAgaWYgKG9iaiA9PT0gdW5kZWZpbmVkKSB7IHJldHVybiB1bmRlZmluZWQ7IH1cbiAgY29uc3QgcmVzdWx0ID0ge1xuICAgICdkb21haW5zJzogdG9Kc29uX1J1bGVEb21haW5zKG9iai5kb21haW5zKSxcbiAgICAnZW5hYmxlZCc6IG9iai5lbmFibGVkLFxuICAgICdpbmNsdWRlcyc6IG9iai5pbmNsdWRlcz8ubWFwKHkgPT4geSksXG4gICAgJ3J1bGVzJzogdG9Kc29uX1J1bGVzKG9iai5ydWxlcyksXG4gIH07XG4gIC8vIGZpbHRlciB1bmRlZmluZWQgdmFsdWVzXG4gIHJldHVybiBPYmplY3QuZW50cmllcyhyZXN1bHQpLnJlZHVjZSgociwgaSkgPT4gKGlbMV0gPT09IHVuZGVmaW5lZCkgPyByIDogKHsgLi4uciwgW2lbMF1dOiBpWzFdIH0pLCB7fSk7XG59XG4vKiBlc2xpbnQtZW5hYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cblxuLyoqXG4gKiBPcHRpb25zIGFwcGxpZWQgdG8gTWFya2Rvd24gZmlsZXNcbiAqXG4gKiBAc2NoZW1hIE1hcmtkb3duQ29uZmlndXJhdGlvblxuICovXG5leHBvcnQgaW50ZXJmYWNlIE1hcmtkb3duQ29uZmlndXJhdGlvbiB7XG4gIC8qKlxuICAgKiBSdW5zIHRoZSBsaW50ZXIgYW5kIGFzc2lzdCBhY3Rpb25zIG9uIHRoZSBjb2RlIGluc2lkZSBmZW5jZWQgY29kZSBibG9ja3MsIGZyb250bWF0dGVyLCBhbmRcbiAgICogSFRNTCBibG9ja3MsIHdpdGggdGhlIHJ1bGVzIGFuZCBhY3Rpb25zIG9mIHRoZSBjb2RlJ3MgbGFuZ3VhZ2UuIERlZmF1bHRzIHRvIGBmYWxzZWAuXG4gICAqXG4gICAqIEBkZWZhdWx0IGZhbHNlYC5cbiAgICogQHNjaGVtYSBNYXJrZG93bkNvbmZpZ3VyYXRpb24jYW5hbHl6ZUVtYmVkc1xuICAgKi9cbiAgcmVhZG9ubHkgYW5hbHl6ZUVtYmVkcz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEZvcm1hdHRlciBvcHRpb25zXG4gICAqXG4gICAqIEBzY2hlbWEgTWFya2Rvd25Db25maWd1cmF0aW9uI2Zvcm1hdHRlclxuICAgKi9cbiAgcmVhZG9ubHkgZm9ybWF0dGVyPzogTWFya2Rvd25Gb3JtYXR0ZXJDb25maWd1cmF0aW9uO1xuXG4gIC8qKlxuICAgKiBMaW50ZXIgb3B0aW9uc1xuICAgKlxuICAgKiBAc2NoZW1hIE1hcmtkb3duQ29uZmlndXJhdGlvbiNsaW50ZXJcbiAgICovXG4gIHJlYWRvbmx5IGxpbnRlcj86IE1hcmtkb3duTGludGVyQ29uZmlndXJhdGlvbjtcblxuICAvKipcbiAgICogUGFyc2luZyBvcHRpb25zXG4gICAqXG4gICAqIEBzY2hlbWEgTWFya2Rvd25Db25maWd1cmF0aW9uI3BhcnNlclxuICAgKi9cbiAgcmVhZG9ubHkgcGFyc2VyPzogTWFya2Rvd25QYXJzZXJDb25maWd1cmF0aW9uO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGFuIG9iamVjdCBvZiB0eXBlICdNYXJrZG93bkNvbmZpZ3VyYXRpb24nIHRvIEpTT04gcmVwcmVzZW50YXRpb24uXG4gKiBAaW50ZXJuYWxcbiAqL1xuLyogZXNsaW50LWRpc2FibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvSnNvbl9NYXJrZG93bkNvbmZpZ3VyYXRpb24ob2JqOiBNYXJrZG93bkNvbmZpZ3VyYXRpb24gfCB1bmRlZmluZWQpOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgdW5kZWZpbmVkIHtcbiAgaWYgKG9iaiA9PT0gdW5kZWZpbmVkKSB7IHJldHVybiB1bmRlZmluZWQ7IH1cbiAgY29uc3QgcmVzdWx0ID0ge1xuICAgICdhbmFseXplRW1iZWRzJzogb2JqLmFuYWx5emVFbWJlZHMsXG4gICAgJ2Zvcm1hdHRlcic6IHRvSnNvbl9NYXJrZG93bkZvcm1hdHRlckNvbmZpZ3VyYXRpb24ob2JqLmZvcm1hdHRlciksXG4gICAgJ2xpbnRlcic6IHRvSnNvbl9NYXJrZG93bkxpbnRlckNvbmZpZ3VyYXRpb24ob2JqLmxpbnRlciksXG4gICAgJ3BhcnNlcic6IHRvSnNvbl9NYXJrZG93blBhcnNlckNvbmZpZ3VyYXRpb24ob2JqLnBhcnNlciksXG4gIH07XG4gIC8vIGZpbHRlciB1bmRlZmluZWQgdmFsdWVzXG4gIHJldHVybiBPYmplY3QuZW50cmllcyhyZXN1bHQpLnJlZHVjZSgociwgaSkgPT4gKGlbMV0gPT09IHVuZGVmaW5lZCkgPyByIDogKHsgLi4uciwgW2lbMF1dOiBpWzFdIH0pLCB7fSk7XG59XG4vKiBlc2xpbnQtZW5hYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cblxuLyoqXG4gKiBAc2NoZW1hIE92ZXJyaWRlUGF0dGVyblxuICovXG5leHBvcnQgaW50ZXJmYWNlIE92ZXJyaWRlUGF0dGVybiB7XG4gIC8qKlxuICAgKiBBc3Npc3Qgc2V0dGluZ3MgZm9yIG1hdGNoZWQgZmlsZXMuXG4gICAqXG4gICAqIEBzY2hlbWEgT3ZlcnJpZGVQYXR0ZXJuI2Fzc2lzdFxuICAgKi9cbiAgcmVhZG9ubHkgYXNzaXN0PzogT3ZlcnJpZGVBc3Npc3RDb25maWd1cmF0aW9uO1xuXG4gIC8qKlxuICAgKiBDU1Mtc3BlY2lmaWMgc2V0dGluZ3MgZm9yIG1hdGNoZWQgZmlsZXMuXG4gICAqXG4gICAqIEBzY2hlbWEgT3ZlcnJpZGVQYXR0ZXJuI2Nzc1xuICAgKi9cbiAgcmVhZG9ubHkgY3NzPzogQ3NzQ29uZmlndXJhdGlvbjtcblxuICAvKipcbiAgICogRmlsZS1oYW5kbGluZyBzZXR0aW5ncyBmb3IgbWF0Y2hlZCBmaWxlcy5cbiAgICpcbiAgICogQHNjaGVtYSBPdmVycmlkZVBhdHRlcm4jZmlsZXNcbiAgICovXG4gIHJlYWRvbmx5IGZpbGVzPzogT3ZlcnJpZGVGaWxlc0NvbmZpZ3VyYXRpb247XG5cbiAgLyoqXG4gICAqIEZvcm1hdHRlciBzZXR0aW5ncyBmb3IgbWF0Y2hlZCBmaWxlcy5cbiAgICpcbiAgICogQHNjaGVtYSBPdmVycmlkZVBhdHRlcm4jZm9ybWF0dGVyXG4gICAqL1xuICByZWFkb25seSBmb3JtYXR0ZXI/OiBPdmVycmlkZUZvcm1hdHRlckNvbmZpZ3VyYXRpb247XG5cbiAgLyoqXG4gICAqIEdyYXBoUUwtc3BlY2lmaWMgc2V0dGluZ3MgZm9yIG1hdGNoZWQgZmlsZXMuXG4gICAqXG4gICAqIEBzY2hlbWEgT3ZlcnJpZGVQYXR0ZXJuI2dyYXBocWxcbiAgICovXG4gIHJlYWRvbmx5IGdyYXBocWw/OiBHcmFwaHFsQ29uZmlndXJhdGlvbjtcblxuICAvKipcbiAgICogR3JpdFFMLXNwZWNpZmljIHNldHRpbmdzIGZvciBtYXRjaGVkIGZpbGVzLlxuICAgKlxuICAgKiBAc2NoZW1hIE92ZXJyaWRlUGF0dGVybiNncml0XG4gICAqL1xuICByZWFkb25seSBncml0PzogR3JpdENvbmZpZ3VyYXRpb247XG5cbiAgLyoqXG4gICAqIEhUTUwtc3BlY2lmaWMgc2V0dGluZ3MgZm9yIG1hdGNoZWQgZmlsZXMuXG4gICAqXG4gICAqIEBzY2hlbWEgT3ZlcnJpZGVQYXR0ZXJuI2h0bWxcbiAgICovXG4gIHJlYWRvbmx5IGh0bWw/OiBIdG1sQ29uZmlndXJhdGlvbjtcblxuICAvKipcbiAgICogQSBsaXN0IG9mIGdsb2IgcGF0dGVybnMgc2VsZWN0aW5nIHRoZSBmaWxlcyB0byB3aGljaCB0aGlzIG92ZXJyaWRlIGFwcGxpZXMuIElmIG9taXR0ZWQsIHRoZVxuICAgKiBvdmVycmlkZSBhcHBsaWVzIHRvIGV2ZXJ5IGZpbGUuIEFuIGVtcHR5IGxpc3QgYXBwbGllcyB0byBubyBmaWxlcy5cbiAgICpcbiAgICogQHNjaGVtYSBPdmVycmlkZVBhdHRlcm4jaW5jbHVkZXNcbiAgICovXG4gIHJlYWRvbmx5IGluY2x1ZGVzPzogc3RyaW5nW107XG5cbiAgLyoqXG4gICAqIEphdmFTY3JpcHQtc3BlY2lmaWMgc2V0dGluZ3MgZm9yIG1hdGNoZWQgZmlsZXMuXG4gICAqXG4gICAqIEBzY2hlbWEgT3ZlcnJpZGVQYXR0ZXJuI2phdmFzY3JpcHRcbiAgICovXG4gIHJlYWRvbmx5IGphdmFzY3JpcHQ/OiBKc0NvbmZpZ3VyYXRpb247XG5cbiAgLyoqXG4gICAqIEpTT04tc3BlY2lmaWMgc2V0dGluZ3MgZm9yIG1hdGNoZWQgZmlsZXMuXG4gICAqXG4gICAqIEBzY2hlbWEgT3ZlcnJpZGVQYXR0ZXJuI2pzb25cbiAgICovXG4gIHJlYWRvbmx5IGpzb24/OiBKc29uQ29uZmlndXJhdGlvbjtcblxuICAvKipcbiAgICogTGludGVyIHNldHRpbmdzIGZvciBtYXRjaGVkIGZpbGVzLlxuICAgKlxuICAgKiBAc2NoZW1hIE92ZXJyaWRlUGF0dGVybiNsaW50ZXJcbiAgICovXG4gIHJlYWRvbmx5IGxpbnRlcj86IE92ZXJyaWRlTGludGVyQ29uZmlndXJhdGlvbjtcblxuICAvKipcbiAgICogU3BlY2lmaWMgY29uZmlndXJhdGlvbiBmb3IgdGhlIE1hcmtkb3duIGxhbmd1YWdlXG4gICAqXG4gICAqIEBzY2hlbWEgT3ZlcnJpZGVQYXR0ZXJuI21hcmtkb3duXG4gICAqL1xuICByZWFkb25seSBtYXJrZG93bj86IE1hcmtkb3duQ29uZmlndXJhdGlvbjtcblxuICAvKipcbiAgICogQWRkaXRpb25hbCBwbHVnaW5zIGZvciBtYXRjaGVkIGZpbGVzLlxuICAgKlxuICAgKiBAc2NoZW1hIE92ZXJyaWRlUGF0dGVybiNwbHVnaW5zXG4gICAqL1xuICByZWFkb25seSBwbHVnaW5zPzogYW55W107XG5cbiAgLyoqXG4gICAqIFNwZWNpZmljIGNvbmZpZ3VyYXRpb24gZm9yIHRoZSBZQU1MIGxhbmd1YWdlXG4gICAqXG4gICAqIEBzY2hlbWEgT3ZlcnJpZGVQYXR0ZXJuI3lhbWxcbiAgICovXG4gIHJlYWRvbmx5IHlhbWw/OiBZYW1sQ29uZmlndXJhdGlvbjtcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhbiBvYmplY3Qgb2YgdHlwZSAnT3ZlcnJpZGVQYXR0ZXJuJyB0byBKU09OIHJlcHJlc2VudGF0aW9uLlxuICogQGludGVybmFsXG4gKi9cbi8qIGVzbGludC1kaXNhYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0pzb25fT3ZlcnJpZGVQYXR0ZXJuKG9iajogT3ZlcnJpZGVQYXR0ZXJuIHwgdW5kZWZpbmVkKTogUmVjb3JkPHN0cmluZywgYW55PiB8IHVuZGVmaW5lZCB7XG4gIGlmIChvYmogPT09IHVuZGVmaW5lZCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9XG4gIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAnYXNzaXN0JzogdG9Kc29uX092ZXJyaWRlQXNzaXN0Q29uZmlndXJhdGlvbihvYmouYXNzaXN0KSxcbiAgICAnY3NzJzogdG9Kc29uX0Nzc0NvbmZpZ3VyYXRpb24ob2JqLmNzcyksXG4gICAgJ2ZpbGVzJzogdG9Kc29uX092ZXJyaWRlRmlsZXNDb25maWd1cmF0aW9uKG9iai5maWxlcyksXG4gICAgJ2Zvcm1hdHRlcic6IHRvSnNvbl9PdmVycmlkZUZvcm1hdHRlckNvbmZpZ3VyYXRpb24ob2JqLmZvcm1hdHRlciksXG4gICAgJ2dyYXBocWwnOiB0b0pzb25fR3JhcGhxbENvbmZpZ3VyYXRpb24ob2JqLmdyYXBocWwpLFxuICAgICdncml0JzogdG9Kc29uX0dyaXRDb25maWd1cmF0aW9uKG9iai5ncml0KSxcbiAgICAnaHRtbCc6IHRvSnNvbl9IdG1sQ29uZmlndXJhdGlvbihvYmouaHRtbCksXG4gICAgJ2luY2x1ZGVzJzogb2JqLmluY2x1ZGVzPy5tYXAoeSA9PiB5KSxcbiAgICAnamF2YXNjcmlwdCc6IHRvSnNvbl9Kc0NvbmZpZ3VyYXRpb24ob2JqLmphdmFzY3JpcHQpLFxuICAgICdqc29uJzogdG9Kc29uX0pzb25Db25maWd1cmF0aW9uKG9iai5qc29uKSxcbiAgICAnbGludGVyJzogdG9Kc29uX092ZXJyaWRlTGludGVyQ29uZmlndXJhdGlvbihvYmoubGludGVyKSxcbiAgICAnbWFya2Rvd24nOiB0b0pzb25fTWFya2Rvd25Db25maWd1cmF0aW9uKG9iai5tYXJrZG93biksXG4gICAgJ3BsdWdpbnMnOiBvYmoucGx1Z2lucz8ubWFwKHkgPT4geSksXG4gICAgJ3lhbWwnOiB0b0pzb25fWWFtbENvbmZpZ3VyYXRpb24ob2JqLnlhbWwpLFxuICB9O1xuICAvLyBmaWx0ZXIgdW5kZWZpbmVkIHZhbHVlc1xuICByZXR1cm4gT2JqZWN0LmVudHJpZXMocmVzdWx0KS5yZWR1Y2UoKHIsIGkpID0+IChpWzFdID09PSB1bmRlZmluZWQpID8gciA6ICh7IC4uLnIsIFtpWzBdXTogaVsxXSB9KSwge30pO1xufVxuLyogZXNsaW50LWVuYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5cbi8qKlxuICogVGVsbHMgQmlvbWUgd2hlcmUgeW91ciBjb2RlIGxpc3RzIFRhaWx3aW5kIENTUyBjbGFzc2VzLCBzbyB0aGUgVGFpbHdpbmRcbiAqIGxpbnQgcnVsZXMga25vdyB3aGljaCBzdHJpbmdzIHRvIGNoZWNrLlxuICpcbiAqIEBzY2hlbWEgVGFpbHdpbmRDb25maWd1cmF0aW9uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVGFpbHdpbmRDb25maWd1cmF0aW9uIHtcbiAgLyoqXG4gICAqIEF0dHJpYnV0ZXMgd2hvc2UgdmFsdWVzIGFyZSBUYWlsd2luZCBjbGFzc2VzLCBzdWNoIGFzIGBjbGFzc2AgaW5cbiAgICogYDxkaXYgY2xhc3M9XCJweC0yIHB5LTJcIj5gLlxuICAgKlxuICAgKiBEZWZhdWx0cyB0byBgY2xhc3NgIGFuZCBgY2xhc3NOYW1lYC4gSW4gSFRNTCwgdGhleSBhcmUgY2FzZS1pbnNlbnNpdGl2ZS5cbiAgICpcbiAgICogQGRlZmF1bHQgY2xhc3NgIGFuZCBgY2xhc3NOYW1lYC4gSW4gSFRNTCwgdGhleSBhcmUgY2FzZS1pbnNlbnNpdGl2ZS5cbiAgICogQHNjaGVtYSBUYWlsd2luZENvbmZpZ3VyYXRpb24jYXR0cmlidXRlc1xuICAgKi9cbiAgcmVhZG9ubHkgYXR0cmlidXRlcz86IHN0cmluZ1tdO1xuXG4gIC8qKlxuICAgKiBGdW5jdGlvbnMgdGhhdCBjb21iaW5lIFRhaWx3aW5kIGNsYXNzZXMsIHN1Y2ggYXMgYGNsc3hgIGFuZCBgY25gLlxuICAgKlxuICAgKiBCaW9tZSBjaGVja3MgZXZlcnkgc3RyaW5nIHBhc3NlZCB0byB0aGVzZSBmdW5jdGlvbnMsIGxpa2UgYm90aCBzdHJpbmdzXG4gICAqIGluIGBjbihcInB4LTJcIiwgXCJweS0yXCIpYC4gV2hlbiBhbiBvYmplY3QgaXMgcGFzc2VkLCBCaW9tZSBjaGVja3MgaXRzXG4gICAqIGtleXM6IGluIGBjbih7IFwicHgtMlwiOiBpc0FjdGl2ZSB9KWAsIGl0IGNoZWNrcyBgXCJweC0yXCJgLlxuICAgKlxuICAgKiBQcm9wZXJ0aWVzIG9mIHRoZXNlIGZ1bmN0aW9ucyBhcmUgY2hlY2tlZCB0b28sIHNvIGxpc3RpbmcgYHR3YCBhbHNvXG4gICAqIGNvdmVycyBgYCB0dy5kaXZgcHgtMmAgYGAgYW5kIGB0dy5kaXYoXCJweC0yXCIpYC5cbiAgICpcbiAgICogRGVmYXVsdHMgdG8gYGNsc3hgLCBgdHdgLCBgdHdNZXJnZWAsIGB0d0pvaW5gLCBgY25gLCBgY2NgLCBgY25iYCwgYW5kXG4gICAqIGBjdGxgLlxuICAgKlxuICAgKiBAZGVmYXVsdCBjbHN4YCwgYHR3YCwgYHR3TWVyZ2VgLCBgdHdKb2luYCwgYGNuYCwgYGNjYCwgYGNuYmAsIGFuZFxuICAgKiBAc2NoZW1hIFRhaWx3aW5kQ29uZmlndXJhdGlvbiNtZXJnZUZ1bmN0aW9uc1xuICAgKi9cbiAgcmVhZG9ubHkgbWVyZ2VGdW5jdGlvbnM/OiBzdHJpbmdbXTtcblxuICAvKipcbiAgICogVGhlIENTUyBmaWxlIHRoYXQgaG9sZHMgeW91ciBUYWlsd2luZCBDU1MgY29uZmlndXJhdGlvbiwgc3VjaCBhc1xuICAgKiBgXCIuL3NyYy9hcHAuY3NzXCJgLiBBIHJlbGF0aXZlIHBhdGggc3RhcnRzIGZyb20gdGhlIGZvbGRlciBvZiB0aGUgQmlvbWVcbiAgICogY29uZmlndXJhdGlvbiBmaWxlLlxuICAgKlxuICAgKiBCaW9tZSByZWFkcyB0aGUgYEB0aGVtZWAsIGBAdXRpbGl0eWAsIGFuZCBgQGN1c3RvbS12YXJpYW50YCBydWxlcyBpblxuICAgKiB0aGlzIGZpbGUgYW5kIGluIHRoZSBmaWxlcyBpdCBpbXBvcnRzIHdpdGggYEBpbXBvcnRgLCBzbyB0aGF0IHRoZVxuICAgKiBUYWlsd2luZCBydWxlcyBrbm93IHlvdXIgdGhlbWUgdmFsdWVzLCB1dGlsaXRpZXMsIGFuZCB2YXJpYW50cy5cbiAgICpcbiAgICogVG8gcmVhZCB0aGUgZmlsZSwgQmlvbWUgc2NhbnMgeW91ciBwcm9qZWN0IHdoZW4gYSBUYWlsd2luZCBydWxlIGlzXG4gICAqIGVuYWJsZWQuIFNldHRpbmcgdGhpcyBvcHRpb24gYWxzbyB0dXJucyBvbiBgY3NzLnBhcnNlci50YWlsd2luZERpcmVjdGl2ZXNgLFxuICAgKiB1bmxlc3MgeW91IHNldCB0aGF0IG9wdGlvbiB5b3Vyc2VsZi5cbiAgICpcbiAgICogQHNjaGVtYSBUYWlsd2luZENvbmZpZ3VyYXRpb24jc3R5bGVzaGVldFxuICAgKi9cbiAgcmVhZG9ubHkgc3R5bGVzaGVldD86IHN0cmluZztcblxuICAvKipcbiAgICogRnVuY3Rpb25zIHRoYXQgZGVzY3JpYmUgYSBjb21wb25lbnQncyBzdHlsZXMgd2l0aCBhbiBvYmplY3QsIHN1Y2ggYXNcbiAgICogYGN2YWAgYW5kIGB0dmAuXG4gICAqXG4gICAqIEJpb21lIGNoZWNrcyBldmVyeSBzdHJpbmcgcGFzc2VkIGRpcmVjdGx5IHRvIHRoZXNlIGZ1bmN0aW9ucy4gSW4gYW5cbiAgICogb2JqZWN0IHBhc3NlZCB0byB0aGVtLCBCaW9tZSBjaGVja3MgdGhlIGNsYXNzZXMgdW5kZXIgdGhlc2UgcHJvcGVydGllczpcbiAgICpcbiAgICogLSBgYmFzZWAsIGBjbGFzc2AsIGFuZCBgY2xhc3NOYW1lYDogY2xhc3NlcyB0aGF0IGFsd2F5cyBhcHBseS5cbiAgICogLSBgdmFyaWFudHNgOiBjbGFzc2VzIGZvciBlYWNoIHZlcnNpb24gb2YgdGhlIGNvbXBvbmVudCwgc3VjaCBhcyBlYWNoXG4gICAqIGJ1dHRvbiBzaXplLlxuICAgKiAtIGBzbG90c2A6IGNsYXNzZXMgZm9yIGVhY2ggcGFydCBvZiB0aGUgY29tcG9uZW50LCBzdWNoIGFzIGl0cyBpY29uLlxuICAgKiAtIGBjb21wb3VuZFZhcmlhbnRzYCBhbmQgYGNvbXBvdW5kU2xvdHNgOiBvbmx5IHRoZSBgY2xhc3NgIGFuZFxuICAgKiBgY2xhc3NOYW1lYCBvZiBlYWNoIGVudHJ5LlxuICAgKlxuICAgKiBPdGhlciBwcm9wZXJ0aWVzLCBzdWNoIGFzIGBkZWZhdWx0VmFyaWFudHNgLCBob2xkIG5hbWVzIHJhdGhlciB0aGFuXG4gICAqIGNsYXNzZXMsIHNvIEJpb21lIHNraXBzIHRoZW0uIEZvciBleGFtcGxlLCBCaW9tZSBjaGVja3MgYFwicm91bmRlZFwiYCxcbiAgICogYFwicHgtMlwiYCwgYW5kIGBcInB4LTRcImAgaGVyZSwgYnV0IG5vdCBgXCJzbWFsbFwiYDpcbiAgICpcbiAgICogYGBganNcbiAgICogY3ZhKFwicm91bmRlZFwiLCB7XG4gICAqIHZhcmlhbnRzOiB7XG4gICAqIHNpemU6IHsgc21hbGw6IFwicHgtMlwiLCBsYXJnZTogXCJweC00XCIgfSxcbiAgICogfSxcbiAgICogZGVmYXVsdFZhcmlhbnRzOiB7IHNpemU6IFwic21hbGxcIiB9LFxuICAgKiB9KTtcbiAgICogYGBgXG4gICAqXG4gICAqIERlZmF1bHRzIHRvIGBjdmFgIGFuZCBgdHZgLlxuICAgKlxuICAgKiBAZGVmYXVsdCBjdmFgIGFuZCBgdHZgLlxuICAgKiBAc2NoZW1hIFRhaWx3aW5kQ29uZmlndXJhdGlvbiN2YXJpYW50RnVuY3Rpb25zXG4gICAqL1xuICByZWFkb25seSB2YXJpYW50RnVuY3Rpb25zPzogc3RyaW5nW107XG59XG5cbi8qKlxuICogQ29udmVydHMgYW4gb2JqZWN0IG9mIHR5cGUgJ1RhaWx3aW5kQ29uZmlndXJhdGlvbicgdG8gSlNPTiByZXByZXNlbnRhdGlvbi5cbiAqIEBpbnRlcm5hbFxuICovXG4vKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5leHBvcnQgZnVuY3Rpb24gdG9Kc29uX1RhaWx3aW5kQ29uZmlndXJhdGlvbihvYmo6IFRhaWx3aW5kQ29uZmlndXJhdGlvbiB8IHVuZGVmaW5lZCk6IFJlY29yZDxzdHJpbmcsIGFueT4gfCB1bmRlZmluZWQge1xuICBpZiAob2JqID09PSB1bmRlZmluZWQpIHsgcmV0dXJuIHVuZGVmaW5lZDsgfVxuICBjb25zdCByZXN1bHQgPSB7XG4gICAgJ2F0dHJpYnV0ZXMnOiBvYmouYXR0cmlidXRlcz8ubWFwKHkgPT4geSksXG4gICAgJ21lcmdlRnVuY3Rpb25zJzogb2JqLm1lcmdlRnVuY3Rpb25zPy5tYXAoeSA9PiB5KSxcbiAgICAnc3R5bGVzaGVldCc6IG9iai5zdHlsZXNoZWV0LFxuICAgICd2YXJpYW50RnVuY3Rpb25zJzogb2JqLnZhcmlhbnRGdW5jdGlvbnM/Lm1hcCh5ID0+IHkpLFxuICB9O1xuICAvLyBmaWx0ZXIgdW5kZWZpbmVkIHZhbHVlc1xuICByZXR1cm4gT2JqZWN0LmVudHJpZXMocmVzdWx0KS5yZWR1Y2UoKHIsIGkpID0+IChpWzFdID09PSB1bmRlZmluZWQpID8gciA6ICh7IC4uLnIsIFtpWzBdXTogaVsxXSB9KSwge30pO1xufVxuLyogZXNsaW50LWVuYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5cbi8qKlxuICogQ29uZmlndXJlcyBob3cgQmlvbWUgaW50ZWdyYXRlcyB3aXRoIGEgdmVyc2lvbiBjb250cm9sIHN5c3RlbS5cbiAqXG4gKiBAc2NoZW1hIFZjc0NvbmZpZ3VyYXRpb25cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBWY3NDb25maWd1cmF0aW9uIHtcbiAgLyoqXG4gICAqIFNlbGVjdHMgdGhlIHZlcnNpb24tY29udHJvbCBjbGllbnQuIEN1cnJlbnRseSwgb25seSBgZ2l0YCBpcyBzdXBwb3J0ZWQuXG4gICAqXG4gICAqIEBzY2hlbWEgVmNzQ29uZmlndXJhdGlvbiNjbGllbnRLaW5kXG4gICAqL1xuICByZWFkb25seSBjbGllbnRLaW5kPzogVmNzQ2xpZW50S2luZDtcblxuICAvKipcbiAgICogU2V0cyB0aGUgYmFzZSBicmFuY2ggdXNlZCBieSBgLS1jaGFuZ2VkYCB3aGVuIGAtLXNpbmNlYCBpcyBub3QgcHJvdmlkZWQuIElmIG5laXRoZXIgdGhpcyBvcHRpb25cbiAgICogbm9yIGAtLXNpbmNlYCBpcyBzZXQsIGNvbW1hbmRzIHVzaW5nIGAtLWNoYW5nZWRgIGZhaWwgYmVjYXVzZSBCaW9tZSBjYW5ub3QgZGV0ZXJtaW5lIHRoZVxuICAgKiBjb21wYXJpc29uIGJhc2UuXG4gICAqXG4gICAqIEBzY2hlbWEgVmNzQ29uZmlndXJhdGlvbiNkZWZhdWx0QnJhbmNoXG4gICAqL1xuICByZWFkb25seSBkZWZhdWx0QnJhbmNoPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBFbmFibGVzIG9yIGRpc2FibGVzIHZlcnNpb24tY29udHJvbCBpbnRlZ3JhdGlvbi4gRGVmYXVsdHMgdG8gYGZhbHNlYC4gRW5hYmxpbmcgaW50ZWdyYXRpb25cbiAgICogcmVxdWlyZXMgYHZjcy5jbGllbnRLaW5kYCB0byBiZSBzZXQuXG4gICAqXG4gICAqIEBkZWZhdWx0IGZhbHNlYC4gRW5hYmxpbmcgaW50ZWdyYXRpb25cbiAgICogQHNjaGVtYSBWY3NDb25maWd1cmF0aW9uI2VuYWJsZWRcbiAgICovXG4gIHJlYWRvbmx5IGVuYWJsZWQ/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBTZXRzIHRoZSBkaXJlY3Rvcnkgd2hlcmUgQmlvbWUgbG9va3MgZm9yIHZlcnNpb24tY29udHJvbCBmaWxlcy4gQSByZWxhdGl2ZSB2YWx1ZSBpcyByZXNvbHZlZFxuICAgKiBmcm9tIHRoZSBkaXJlY3RvcnkgY29udGFpbmluZyB0aGUgY3VycmVudCBjb25maWd1cmF0aW9uIGZpbGUsIHdoaWxlIGFuIGFic29sdXRlIHBhdGggaXMgdXNlZFxuICAgKiBkaXJlY3RseS5cbiAgICpcbiAgICogRGVmYXVsdHMgdG8gdGhlIGRpcmVjdG9yeSBjb250YWluaW5nIGBiaW9tZS5qc29uYCBvciBgYmlvbWUuanNvbmNgLiBJZiBubyBjb25maWd1cmF0aW9uIGlzXG4gICAqIGZvdW5kLCBCaW9tZSB1c2VzIHRoZSBjdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5LlxuICAgKlxuICAgKiBJZiBuZWl0aGVyIGRpcmVjdG9yeSBpcyBhdmFpbGFibGUsIEJpb21lIGRpc2FibGVzIHZlcnNpb24gY29udHJvbCBpbnRlZ3JhdGlvbiBhbmQgZW1pdHMgYVxuICAgKiBkaWFnbm9zdGljLlxuICAgKlxuICAgKiBAZGVmYXVsdCB0aGUgZGlyZWN0b3J5IGNvbnRhaW5pbmcgYGJpb21lLmpzb25gIG9yIGBiaW9tZS5qc29uY2AuIElmIG5vIGNvbmZpZ3VyYXRpb24gaXNcbiAgICogQHNjaGVtYSBWY3NDb25maWd1cmF0aW9uI3Jvb3RcbiAgICovXG4gIHJlYWRvbmx5IHJvb3Q/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIENvbnRyb2xzIHdoZXRoZXIgQmlvbWUgYXBwbGllcyBwYXR0ZXJucyBmcm9tIGAuZ2l0aWdub3JlYCwgR2l0J3MgbG9jYWwgYC5naXQvaW5mby9leGNsdWRlYCxcbiAgICogYW5kIHN1cHBvcnRlZCBgLmlnbm9yZWAgZmlsZXMsIGluY2x1ZGluZyBuZXN0ZWQgaWdub3JlIGZpbGVzLiBQYXR0ZXJucyBpbiB0aGUgcm9vdCBpZ25vcmUgZmlsZVxuICAgKiBhcmUgcmVzb2x2ZWQgZnJvbSBgdmNzLnJvb3RgLiBQYXR0ZXJucyBpbiBuZXN0ZWQgaWdub3JlIGZpbGVzIGFyZSByZXNvbHZlZCBmcm9tIHRoZSBkaXJlY3RvcnlcbiAgICogY29udGFpbmluZyB0aGF0IGZpbGUuIERlZmF1bHRzIHRvIGBmYWxzZWAuXG4gICAqXG4gICAqIEBkZWZhdWx0IGZhbHNlYC5cbiAgICogQHNjaGVtYSBWY3NDb25maWd1cmF0aW9uI3VzZUlnbm9yZUZpbGVcbiAgICovXG4gIHJlYWRvbmx5IHVzZUlnbm9yZUZpbGU/OiBib29sZWFuO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGFuIG9iamVjdCBvZiB0eXBlICdWY3NDb25maWd1cmF0aW9uJyB0byBKU09OIHJlcHJlc2VudGF0aW9uLlxuICogQGludGVybmFsXG4gKi9cbi8qIGVzbGludC1kaXNhYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0pzb25fVmNzQ29uZmlndXJhdGlvbihvYmo6IFZjc0NvbmZpZ3VyYXRpb24gfCB1bmRlZmluZWQpOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgdW5kZWZpbmVkIHtcbiAgaWYgKG9iaiA9PT0gdW5kZWZpbmVkKSB7IHJldHVybiB1bmRlZmluZWQ7IH1cbiAgY29uc3QgcmVzdWx0ID0ge1xuICAgICdjbGllbnRLaW5kJzogb2JqLmNsaWVudEtpbmQsXG4gICAgJ2RlZmF1bHRCcmFuY2gnOiBvYmouZGVmYXVsdEJyYW5jaCxcbiAgICAnZW5hYmxlZCc6IG9iai5lbmFibGVkLFxuICAgICdyb290Jzogb2JqLnJvb3QsXG4gICAgJ3VzZUlnbm9yZUZpbGUnOiBvYmoudXNlSWdub3JlRmlsZSxcbiAgfTtcbiAgLy8gZmlsdGVyIHVuZGVmaW5lZCB2YWx1ZXNcbiAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKHJlc3VsdCkucmVkdWNlKChyLCBpKSA9PiAoaVsxXSA9PT0gdW5kZWZpbmVkKSA/IHIgOiAoeyAuLi5yLCBbaVswXV06IGlbMV0gfSksIHt9KTtcbn1cbi8qIGVzbGludC1lbmFibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuXG4vKipcbiAqIE9wdGlvbnMgYXBwbGllZCB0byBZYW1sIGZpbGVzXG4gKlxuICogQHNjaGVtYSBZYW1sQ29uZmlndXJhdGlvblxuICovXG5leHBvcnQgaW50ZXJmYWNlIFlhbWxDb25maWd1cmF0aW9uIHtcbiAgLyoqXG4gICAqIEZvcm1hdHRlciBvcHRpb25zXG4gICAqXG4gICAqIEBzY2hlbWEgWWFtbENvbmZpZ3VyYXRpb24jZm9ybWF0dGVyXG4gICAqL1xuICByZWFkb25seSBmb3JtYXR0ZXI/OiBZYW1sRm9ybWF0dGVyQ29uZmlndXJhdGlvbjtcblxuICAvKipcbiAgICogQHNjaGVtYSBZYW1sQ29uZmlndXJhdGlvbiNsaW50ZXJcbiAgICovXG4gIHJlYWRvbmx5IGxpbnRlcj86IFlhbWxMaW50ZXJDb25maWd1cmF0aW9uO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGFuIG9iamVjdCBvZiB0eXBlICdZYW1sQ29uZmlndXJhdGlvbicgdG8gSlNPTiByZXByZXNlbnRhdGlvbi5cbiAqIEBpbnRlcm5hbFxuICovXG4vKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5leHBvcnQgZnVuY3Rpb24gdG9Kc29uX1lhbWxDb25maWd1cmF0aW9uKG9iajogWWFtbENvbmZpZ3VyYXRpb24gfCB1bmRlZmluZWQpOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgdW5kZWZpbmVkIHtcbiAgaWYgKG9iaiA9PT0gdW5kZWZpbmVkKSB7IHJldHVybiB1bmRlZmluZWQ7IH1cbiAgY29uc3QgcmVzdWx0ID0ge1xuICAgICdmb3JtYXR0ZXInOiB0b0pzb25fWWFtbEZvcm1hdHRlckNvbmZpZ3VyYXRpb24ob2JqLmZvcm1hdHRlciksXG4gICAgJ2xpbnRlcic6IHRvSnNvbl9ZYW1sTGludGVyQ29uZmlndXJhdGlvbihvYmoubGludGVyKSxcbiAgfTtcbiAgLy8gZmlsdGVyIHVuZGVmaW5lZCB2YWx1ZXNcbiAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKHJlc3VsdCkucmVkdWNlKChyLCBpKSA9PiAoaVsxXSA9PT0gdW5kZWZpbmVkKSA/IHIgOiAoeyAuLi5yLCBbaVswXV06IGlbMV0gfSksIHt9KTtcbn1cbi8qIGVzbGludC1lbmFibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuXG4vKipcbiAqIEBzY2hlbWEgQWN0aW9uc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIEFjdGlvbnMge1xuICAvKipcbiAgICogU2VsZWN0cyB0aGUgYmFzZWxpbmUgc2V0IG9mIGFzc2lzdCBhY3Rpb25zLiBgcmVjb21tZW5kZWRgIGVuYWJsZXMgQmlvbWUnc1xuICAgKiByZWNvbW1lbmRlZCBhY3Rpb25zLCBgYWxsYCBlbmFibGVzIGFsbCBhY3Rpb25zLCBhbmQgYG5vbmVgIHN0YXJ0cyB3aXRoIG5vIGFjdGlvbnNcbiAgICogZW5hYmxlZC4gR3JvdXAgcHJlc2V0cyBhbmQgZXhwbGljaXQgYWN0aW9uIHNldHRpbmdzIG92ZXJyaWRlIHRoaXMgcHJlc2V0LlxuICAgKiBEZWZhdWx0cyB0byBgcmVjb21tZW5kZWRgLlxuICAgKlxuICAgKiBAZGVmYXVsdCByZWNvbW1lbmRlZGAuXG4gICAqIEBzY2hlbWEgQWN0aW9ucyNwcmVzZXRcbiAgICovXG4gIHJlYWRvbmx5IHByZXNldD86IFByZXNldENvbmZpZztcblxuICAvKipcbiAgICogRW5hYmxlcyBvciBkaXNhYmxlcyBCaW9tZSdzIHJlY29tbWVuZGVkIGFzc2lzdCBhY3Rpb25zIGFjcm9zcyBhbGwgYWN0aW9uIGdyb3Vwcy5cbiAgICogRGVmYXVsdHMgdG8gYHRydWVgLlxuICAgKlxuICAgKiBAZGVmYXVsdCB0cnVlYC5cbiAgICogQHNjaGVtYSBBY3Rpb25zI3JlY29tbWVuZGVkXG4gICAqL1xuICByZWFkb25seSByZWNvbW1lbmRlZD86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIENvbmZpZ3VyZXMgc291cmNlLWxldmVsIGFjdGlvbnMgc3VjaCBhcyBvcmdhbml6aW5nIGltcG9ydHMgYW5kIHNvcnRpbmcgZGVjbGFyYXRpb25zLiBUaGVzZSBhY3Rpb25zIGFyZSBleHBvc2VkIHRocm91Z2ggZWRpdG9yIHNvdXJjZSBhY3Rpb25zIGFuZCB0aHJvdWdoIENMSSBjaGVja2luZyBhbmQgYXBwbGljYXRpb24uXG4gICAqXG4gICAqIEBzY2hlbWEgQWN0aW9ucyNzb3VyY2VcbiAgICovXG4gIHJlYWRvbmx5IHNvdXJjZT86IFNvdXJjZTtcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhbiBvYmplY3Qgb2YgdHlwZSAnQWN0aW9ucycgdG8gSlNPTiByZXByZXNlbnRhdGlvbi5cbiAqIEBpbnRlcm5hbFxuICovXG4vKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5leHBvcnQgZnVuY3Rpb24gdG9Kc29uX0FjdGlvbnMob2JqOiBBY3Rpb25zIHwgdW5kZWZpbmVkKTogUmVjb3JkPHN0cmluZywgYW55PiB8IHVuZGVmaW5lZCB7XG4gIGlmIChvYmogPT09IHVuZGVmaW5lZCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9XG4gIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAncHJlc2V0Jzogb2JqLnByZXNldCxcbiAgICAncmVjb21tZW5kZWQnOiBvYmoucmVjb21tZW5kZWQsXG4gICAgJ3NvdXJjZSc6IHRvSnNvbl9Tb3VyY2Uob2JqLnNvdXJjZSksXG4gIH07XG4gIC8vIGZpbHRlciB1bmRlZmluZWQgdmFsdWVzXG4gIHJldHVybiBPYmplY3QuZW50cmllcyhyZXN1bHQpLnJlZHVjZSgociwgaSkgPT4gKGlbMV0gPT09IHVuZGVmaW5lZCkgPyByIDogKHsgLi4uciwgW2lbMF1dOiBpWzFdIH0pLCB7fSk7XG59XG4vKiBlc2xpbnQtZW5hYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cblxuLyoqXG4gKiBPcHRpb25zIHRoYXQgY2hhbmdlIGhvdyBDU1MgYXNzaXN0IGJlaGF2ZXMuXG4gKlxuICogQHNjaGVtYSBDc3NBc3Npc3RDb25maWd1cmF0aW9uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3NzQXNzaXN0Q29uZmlndXJhdGlvbiB7XG4gIC8qKlxuICAgKiBFbmFibGVzIG9yIGRpc2FibGVzIGFzc2lzdCBhY3Rpb25zIGZvciBDU1MuXG4gICAqXG4gICAqIEBzY2hlbWEgQ3NzQXNzaXN0Q29uZmlndXJhdGlvbiNlbmFibGVkXG4gICAqL1xuICByZWFkb25seSBlbmFibGVkPzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhbiBvYmplY3Qgb2YgdHlwZSAnQ3NzQXNzaXN0Q29uZmlndXJhdGlvbicgdG8gSlNPTiByZXByZXNlbnRhdGlvbi5cbiAqIEBpbnRlcm5hbFxuICovXG4vKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5leHBvcnQgZnVuY3Rpb24gdG9Kc29uX0Nzc0Fzc2lzdENvbmZpZ3VyYXRpb24ob2JqOiBDc3NBc3Npc3RDb25maWd1cmF0aW9uIHwgdW5kZWZpbmVkKTogUmVjb3JkPHN0cmluZywgYW55PiB8IHVuZGVmaW5lZCB7XG4gIGlmIChvYmogPT09IHVuZGVmaW5lZCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9XG4gIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAnZW5hYmxlZCc6IG9iai5lbmFibGVkLFxuICB9O1xuICAvLyBmaWx0ZXIgdW5kZWZpbmVkIHZhbHVlc1xuICByZXR1cm4gT2JqZWN0LmVudHJpZXMocmVzdWx0KS5yZWR1Y2UoKHIsIGkpID0+IChpWzFdID09PSB1bmRlZmluZWQpID8gciA6ICh7IC4uLnIsIFtpWzBdXTogaVsxXSB9KSwge30pO1xufVxuLyogZXNsaW50LWVuYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5cbi8qKlxuICogT3B0aW9ucyB0aGF0IGNoYW5nZSBob3cgdGhlIENTUyBmb3JtYXR0ZXIgYmVoYXZlcy5cbiAqXG4gKiBAc2NoZW1hIENzc0Zvcm1hdHRlckNvbmZpZ3VyYXRpb25cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDc3NGb3JtYXR0ZXJDb25maWd1cmF0aW9uIHtcbiAgLyoqXG4gICAqIENvbnRyb2xzIHNwYWNlcyBpbnNpZGUgQ1NTIHBhcmVudGhlc2VzIGFuZCBzcXVhcmUgYnJhY2tldHMgd2hlbiB0aGVpciBjb250ZW50IGZpdHMgb24gb25lXG4gICAqIGxpbmUuIFdoZW4gZW5hYmxlZCwgYHJnYigwLCAwLCAwKWAgYmVjb21lcyBgcmdiKCAwLCAwLCAwIClgIGFuZCBgW2RhdGEtYXR0cl1gIGJlY29tZXNcbiAgICogYFsgZGF0YS1hdHRyIF1gLiBFbXB0eSBkZWxpbWl0ZXJzIGFyZSB1bmNoYW5nZWQuXG4gICAqXG4gICAqIElmIHVuc2V0LCBpbmhlcml0cyB0aGUgZ2xvYmFsIGRlbGltaXRlciBzcGFjaW5nIHNldHRpbmcuXG4gICAqXG4gICAqIEBzY2hlbWEgQ3NzRm9ybWF0dGVyQ29uZmlndXJhdGlvbiNkZWxpbWl0ZXJTcGFjaW5nXG4gICAqL1xuICByZWFkb25seSBkZWxpbWl0ZXJTcGFjaW5nPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogRW5hYmxlcyBvciBkaXNhYmxlcyB0aGUgZm9ybWF0dGVyIGZvciBDU1MgYW5kIGxhbmd1YWdlcyB0aGF0IGV4dGVuZCBpdC5cbiAgICpcbiAgICogQHNjaGVtYSBDc3NGb3JtYXR0ZXJDb25maWd1cmF0aW9uI2VuYWJsZWRcbiAgICovXG4gIHJlYWRvbmx5IGVuYWJsZWQ/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBUaGUgaW5kZW50IHN0eWxlIGFwcGxpZWQgdG8gQ1NTIGFuZCBsYW5ndWFnZXMgdGhhdCBleHRlbmQgaXQuIElmIHVuc2V0LCBpbmhlcml0cyB0aGUgZ2xvYmFsXG4gICAqIGluZGVudGF0aW9uIHN0eWxlLlxuICAgKlxuICAgKiBAc2NoZW1hIENzc0Zvcm1hdHRlckNvbmZpZ3VyYXRpb24jaW5kZW50U3R5bGVcbiAgICovXG4gIHJlYWRvbmx5IGluZGVudFN0eWxlPzogSW5kZW50U3R5bGU7XG5cbiAgLyoqXG4gICAqIFRoZSBpbmRlbnRhdGlvbiB3aWR0aCBhcHBsaWVkIHRvIENTUyBhbmQgbGFuZ3VhZ2VzIHRoYXQgZXh0ZW5kIGl0LiBJZiB1bnNldCwgaW5oZXJpdHMgdGhlXG4gICAqIGdsb2JhbCBpbmRlbnRhdGlvbiB3aWR0aC5cbiAgICpcbiAgICogQHNjaGVtYSBDc3NGb3JtYXR0ZXJDb25maWd1cmF0aW9uI2luZGVudFdpZHRoXG4gICAqL1xuICByZWFkb25seSBpbmRlbnRXaWR0aD86IG51bWJlcjtcblxuICAvKipcbiAgICogVGhlIGxpbmUgZW5kaW5nIGFwcGxpZWQgdG8gQ1NTIGFuZCBsYW5ndWFnZXMgdGhhdCBleHRlbmQgaXQuIElmIHVuc2V0LCBpbmhlcml0cyB0aGUgZ2xvYmFsXG4gICAqIGxpbmUgZW5kaW5nLlxuICAgKlxuICAgKiBAc2NoZW1hIENzc0Zvcm1hdHRlckNvbmZpZ3VyYXRpb24jbGluZUVuZGluZ1xuICAgKi9cbiAgcmVhZG9ubHkgbGluZUVuZGluZz86IExpbmVFbmRpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBwcmVmZXJyZWQgbWF4aW11bSBsaW5lIHdpZHRoIGZvciBDU1MgYW5kIGxhbmd1YWdlcyB0aGF0IGV4dGVuZCBpdC4gSWYgdW5zZXQsIGluaGVyaXRzXG4gICAqIHRoZSBnbG9iYWwgbGluZSB3aWR0aC5cbiAgICpcbiAgICogQHNjaGVtYSBDc3NGb3JtYXR0ZXJDb25maWd1cmF0aW9uI2xpbmVXaWR0aFxuICAgKi9cbiAgcmVhZG9ubHkgbGluZVdpZHRoPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBTZWxlY3RzIHRoZSBwcmVmZXJyZWQgcXVvdGUgc3R5bGUgZm9yIENTUyBzdHJpbmdzLiBCaW9tZSBtYXkgdXNlIHRoZSBhbHRlcm5hdGUgcXVvdGUgd2hlblxuICAgKiB0aGF0IGF2b2lkcyBhZGRpdGlvbmFsIGVzY2FwaW5nLiBRdW90ZXMgaW4gYEBjaGFyc2V0YCBydWxlcyBhcmUgY3VycmVudGx5IHByZXNlcnZlZC5cbiAgICogRGVmYXVsdHMgdG8gYGRvdWJsZWAuXG4gICAqXG4gICAqIEBkZWZhdWx0IGRvdWJsZWAuXG4gICAqIEBzY2hlbWEgQ3NzRm9ybWF0dGVyQ29uZmlndXJhdGlvbiNxdW90ZVN0eWxlXG4gICAqL1xuICByZWFkb25seSBxdW90ZVN0eWxlPzogUXVvdGVTdHlsZTtcblxuICAvKipcbiAgICogV2hldGhlciB0byBhZGQgYSB0cmFpbGluZyBuZXdsaW5lIGF0IHRoZSBlbmQgb2YgdGhlIGZpbGUuIElmIHVuc2V0LCBpbmhlcml0cyB0aGUgZ2xvYmFsXG4gICAqIHRyYWlsaW5nIG5ld2xpbmUgc2V0dGluZy5cbiAgICpcbiAgICogQHNjaGVtYSBDc3NGb3JtYXR0ZXJDb25maWd1cmF0aW9uI3RyYWlsaW5nTmV3bGluZVxuICAgKi9cbiAgcmVhZG9ubHkgdHJhaWxpbmdOZXdsaW5lPzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhbiBvYmplY3Qgb2YgdHlwZSAnQ3NzRm9ybWF0dGVyQ29uZmlndXJhdGlvbicgdG8gSlNPTiByZXByZXNlbnRhdGlvbi5cbiAqIEBpbnRlcm5hbFxuICovXG4vKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5leHBvcnQgZnVuY3Rpb24gdG9Kc29uX0Nzc0Zvcm1hdHRlckNvbmZpZ3VyYXRpb24ob2JqOiBDc3NGb3JtYXR0ZXJDb25maWd1cmF0aW9uIHwgdW5kZWZpbmVkKTogUmVjb3JkPHN0cmluZywgYW55PiB8IHVuZGVmaW5lZCB7XG4gIGlmIChvYmogPT09IHVuZGVmaW5lZCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9XG4gIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAnZGVsaW1pdGVyU3BhY2luZyc6IG9iai5kZWxpbWl0ZXJTcGFjaW5nLFxuICAgICdlbmFibGVkJzogb2JqLmVuYWJsZWQsXG4gICAgJ2luZGVudFN0eWxlJzogb2JqLmluZGVudFN0eWxlLFxuICAgICdpbmRlbnRXaWR0aCc6IG9iai5pbmRlbnRXaWR0aCxcbiAgICAnbGluZUVuZGluZyc6IG9iai5saW5lRW5kaW5nLFxuICAgICdsaW5lV2lkdGgnOiBvYmoubGluZVdpZHRoLFxuICAgICdxdW90ZVN0eWxlJzogb2JqLnF1b3RlU3R5bGUsXG4gICAgJ3RyYWlsaW5nTmV3bGluZSc6IG9iai50cmFpbGluZ05ld2xpbmUsXG4gIH07XG4gIC8vIGZpbHRlciB1bmRlZmluZWQgdmFsdWVzXG4gIHJldHVybiBPYmplY3QuZW50cmllcyhyZXN1bHQpLnJlZHVjZSgociwgaSkgPT4gKGlbMV0gPT09IHVuZGVmaW5lZCkgPyByIDogKHsgLi4uciwgW2lbMF1dOiBpWzFdIH0pLCB7fSk7XG59XG4vKiBlc2xpbnQtZW5hYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cblxuLyoqXG4gKiBPcHRpb25zIHRoYXQgY2hhbmdlIGhvdyB0aGUgQ1NTIGxpbnRlciBiZWhhdmVzLlxuICpcbiAqIEBzY2hlbWEgQ3NzTGludGVyQ29uZmlndXJhdGlvblxuICovXG5leHBvcnQgaW50ZXJmYWNlIENzc0xpbnRlckNvbmZpZ3VyYXRpb24ge1xuICAvKipcbiAgICogRW5hYmxlcyBvciBkaXNhYmxlcyB0aGUgbGludGVyIGZvciBDU1MuXG4gICAqXG4gICAqIEBzY2hlbWEgQ3NzTGludGVyQ29uZmlndXJhdGlvbiNlbmFibGVkXG4gICAqL1xuICByZWFkb25seSBlbmFibGVkPzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhbiBvYmplY3Qgb2YgdHlwZSAnQ3NzTGludGVyQ29uZmlndXJhdGlvbicgdG8gSlNPTiByZXByZXNlbnRhdGlvbi5cbiAqIEBpbnRlcm5hbFxuICovXG4vKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5leHBvcnQgZnVuY3Rpb24gdG9Kc29uX0Nzc0xpbnRlckNvbmZpZ3VyYXRpb24ob2JqOiBDc3NMaW50ZXJDb25maWd1cmF0aW9uIHwgdW5kZWZpbmVkKTogUmVjb3JkPHN0cmluZywgYW55PiB8IHVuZGVmaW5lZCB7XG4gIGlmIChvYmogPT09IHVuZGVmaW5lZCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9XG4gIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAnZW5hYmxlZCc6IG9iai5lbmFibGVkLFxuICB9O1xuICAvLyBmaWx0ZXIgdW5kZWZpbmVkIHZhbHVlc1xuICByZXR1cm4gT2JqZWN0LmVudHJpZXMocmVzdWx0KS5yZWR1Y2UoKHIsIGkpID0+IChpWzFdID09PSB1bmRlZmluZWQpID8gciA6ICh7IC4uLnIsIFtpWzBdXTogaVsxXSB9KSwge30pO1xufVxuLyogZXNsaW50LWVuYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5cbi8qKlxuICogT3B0aW9ucyB0aGF0IGNoYW5nZSBob3cgdGhlIENTUyBwYXJzZXIgYmVoYXZlcy5cbiAqXG4gKiBAc2NoZW1hIENzc1BhcnNlckNvbmZpZ3VyYXRpb25cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDc3NQYXJzZXJDb25maWd1cmF0aW9uIHtcbiAgLyoqXG4gICAqIEVuYWJsZXMgYC8vYCBsaW5lIGNvbW1lbnRzIGluIHBsYWluIENTUy4gU3RhbmRhcmQgQ1NTIHRyZWF0cyBgLy9gIGFzIGRlbGltaXRlciBjaGFyYWN0ZXJzXG4gICAqIHJhdGhlciB0aGFuIGFzIGEgY29tbWVudCwgYW5kIFNDU1MgYWNjZXB0cyBgLy9gIGNvbW1lbnRzIGluZGVwZW5kZW50bHkgb2YgdGhpcyBvcHRpb24uXG4gICAqIERlZmF1bHRzIHRvIGBmYWxzZWAuXG4gICAqXG4gICAqIEBkZWZhdWx0IGZhbHNlYC5cbiAgICogQHNjaGVtYSBDc3NQYXJzZXJDb25maWd1cmF0aW9uI2FsbG93V3JvbmdMaW5lQ29tbWVudHNcbiAgICovXG4gIHJlYWRvbmx5IGFsbG93V3JvbmdMaW5lQ29tbWVudHM/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBFbmFibGVzIENTUyBNb2R1bGVzLXNwZWNpZmljIHN5bnRheCBzdWNoIGFzIGA6bG9jYWxgLCBgOmdsb2JhbGAsIGBjb21wb3Nlc2AsIGFuZCBgQHZhbHVlYC5cbiAgICogV2hlbiB1bnNldCwgQmlvbWUgZW5hYmxlcyB0aGlzIHN5bnRheCBhdXRvbWF0aWNhbGx5IGZvciBmaWxlcyB3aG9zZSBuYW1lcyBlbmQgaW5cbiAgICogYC5tb2R1bGUuY3NzYCBvciBgLm1vZHVsZS5zY3NzOyBvdGhlcndpc2UsIGl0IGRlZmF1bHRzIHRvIGBmYWxzZWAuIEVuYWJsZSBpdCBleHBsaWNpdGx5IHdoZW4gQ1NTIE1vZHVsZSBmaWxlc1xuICAgKiB1c2UgYW5vdGhlciBuYW1pbmcgY29udmVudGlvbi5cbiAgICpcbiAgICogQHNjaGVtYSBDc3NQYXJzZXJDb25maWd1cmF0aW9uI2Nzc01vZHVsZXNcbiAgICovXG4gIHJlYWRvbmx5IGNzc01vZHVsZXM/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBFbmFibGVzIHBhcnNpbmcgVGFpbHdpbmQgQ1NTIDQuMCBkaXJlY3RpdmVzIGFuZCBmdW5jdGlvbnMsIGluY2x1ZGluZyBgQHRoZW1lYCwgYEB1dGlsaXR5YCxcbiAgICogYEB2YXJpYW50YCwgYEBzb3VyY2VgLCBhbmQgYEBhcHBseWAuIERlZmF1bHRzIHRvIGBmYWxzZWAuXG4gICAqXG4gICAqIEBkZWZhdWx0IGZhbHNlYC5cbiAgICogQHNjaGVtYSBDc3NQYXJzZXJDb25maWd1cmF0aW9uI3RhaWx3aW5kRGlyZWN0aXZlc1xuICAgKi9cbiAgcmVhZG9ubHkgdGFpbHdpbmREaXJlY3RpdmVzPzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhbiBvYmplY3Qgb2YgdHlwZSAnQ3NzUGFyc2VyQ29uZmlndXJhdGlvbicgdG8gSlNPTiByZXByZXNlbnRhdGlvbi5cbiAqIEBpbnRlcm5hbFxuICovXG4vKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5leHBvcnQgZnVuY3Rpb24gdG9Kc29uX0Nzc1BhcnNlckNvbmZpZ3VyYXRpb24ob2JqOiBDc3NQYXJzZXJDb25maWd1cmF0aW9uIHwgdW5kZWZpbmVkKTogUmVjb3JkPHN0cmluZywgYW55PiB8IHVuZGVmaW5lZCB7XG4gIGlmIChvYmogPT09IHVuZGVmaW5lZCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9XG4gIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAnYWxsb3dXcm9uZ0xpbmVDb21tZW50cyc6IG9iai5hbGxvd1dyb25nTGluZUNvbW1lbnRzLFxuICAgICdjc3NNb2R1bGVzJzogb2JqLmNzc01vZHVsZXMsXG4gICAgJ3RhaWx3aW5kRGlyZWN0aXZlcyc6IG9iai50YWlsd2luZERpcmVjdGl2ZXMsXG4gIH07XG4gIC8vIGZpbHRlciB1bmRlZmluZWQgdmFsdWVzXG4gIHJldHVybiBPYmplY3QuZW50cmllcyhyZXN1bHQpLnJlZHVjZSgociwgaSkgPT4gKGlbMV0gPT09IHVuZGVmaW5lZCkgPyByIDogKHsgLi4uciwgW2lbMF1dOiBpWzFdIH0pLCB7fSk7XG59XG4vKiBlc2xpbnQtZW5hYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cblxuLyoqXG4gKiBDb250cm9scyBhdHRyaWJ1dGUgcGxhY2VtZW50IGluIEhUTUwtbGlrZSBsYW5ndWFnZXMuXG4gKlxuICogQHNjaGVtYSBBdHRyaWJ1dGVQb3NpdGlvblxuICovXG5leHBvcnQgZW51bSBBdHRyaWJ1dGVQb3NpdGlvbiB7XG4gIC8qKiBQbGFjZXMgYXR0cmlidXRlcyBhdXRvbWF0aWNhbGx5IGFuZCB3cmFwcyB0aGVtIHdoZW4gbmVlZGVkLiAoYXV0bykgKi9cbiAgQVVUTyA9IFwiYXV0b1wiLFxuICAvKiogUGxhY2VzIGVhY2ggYXR0cmlidXRlIG9uIGl0cyBvd24gbGluZSB3aGVuIGFuIGVsZW1lbnQgaGFzIG11bHRpcGxlIGF0dHJpYnV0ZXMuIChtdWx0aWxpbmUpICovXG4gIE1VTFRJTElORSA9IFwibXVsdGlsaW5lXCIsXG59XG5cbi8qKlxuICogQHNjaGVtYSBFeHBhbmRcbiAqL1xuZXhwb3J0IGVudW0gRXhwYW5kIHtcbiAgLyoqIE9iamVjdHMgYXJlIGV4cGFuZGVkIHdoZW4gdGhlIGZpcnN0IHByb3BlcnR5IGhhcyBhIGxlYWRpbmcgbmV3bGluZS4gQXJyYXlzIHJlbWFpbiBvbiBvbmVcbmxpbmUgaWYgdGhleSBmaXQuIChhdXRvKSAqL1xuICBBVVRPID0gXCJhdXRvXCIsXG4gIC8qKiBPYmplY3RzIGFuZCBhcnJheXMgYXJlIGFsd2F5cyBleHBhbmRlZC4gKGFsd2F5cykgKi9cbiAgQUxXQVlTID0gXCJhbHdheXNcIixcbiAgLyoqIE9iamVjdHMgYW5kIGFycmF5cyByZW1haW4gb24gb25lIGxpbmUgaWYgdGhleSBmaXQuIChuZXZlcikgKi9cbiAgTkVWRVIgPSBcIm5ldmVyXCIsXG59XG5cbi8qKlxuICogQHNjaGVtYSBJbmRlbnRTdHlsZVxuICovXG5leHBvcnQgZW51bSBJbmRlbnRTdHlsZSB7XG4gIC8qKiBVc2VzIHRhYnMgZm9yIGluZGVudGF0aW9uLiAodGFiKSAqL1xuICBUQUIgPSBcInRhYlwiLFxuICAvKiogVXNlcyBzcGFjZXMgZm9yIGluZGVudGF0aW9uLiAoc3BhY2UpICovXG4gIFNQQUNFID0gXCJzcGFjZVwiLFxufVxuXG4vKipcbiAqIEBzY2hlbWEgTGluZUVuZGluZ1xuICovXG5leHBvcnQgZW51bSBMaW5lRW5kaW5nIHtcbiAgLyoqIExpbmUgRmVlZCBvbmx5IChcXG4pLCBjb21tb24gb24gTGludXggYW5kIG1hY09TIGFzIHdlbGwgYXMgaW5zaWRlIGdpdCByZXBvcyAobGYpICovXG4gIExGID0gXCJsZlwiLFxuICAvKiogQ2FycmlhZ2UgUmV0dXJuICsgTGluZSBGZWVkIGNoYXJhY3RlcnMgKFxcclxcbiksIGNvbW1vbiBvbiBXaW5kb3dzIChjcmxmKSAqL1xuICBDUkxGID0gXCJjcmxmXCIsXG4gIC8qKiBDYXJyaWFnZSBSZXR1cm4gY2hhcmFjdGVyIG9ubHkgKFxcciksIHVzZWQgdmVyeSByYXJlbHkgKGNyKSAqL1xuICBDUiA9IFwiY3JcIixcbiAgLyoqIEF1dG9tYXRpY2FsbHkgdXNlIENSTEYgb24gV2luZG93cyBhbmQgTEYgb24gb3RoZXIgcGxhdGZvcm1zIChhdXRvKSAqL1xuICBBVVRPID0gXCJhdXRvXCIsXG59XG5cbi8qKlxuICogT3B0aW9ucyB0aGF0IGNoYW5nZSBob3cgR3JhcGhRTCBhc3Npc3QgYmVoYXZlcy5cbiAqXG4gKiBAc2NoZW1hIEdyYXBocWxBc3Npc3RDb25maWd1cmF0aW9uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgR3JhcGhxbEFzc2lzdENvbmZpZ3VyYXRpb24ge1xuICAvKipcbiAgICogRW5hYmxlcyBvciBkaXNhYmxlcyBhc3Npc3QgYWN0aW9ucyBmb3IgR3JhcGhRTC4gRGVmYXVsdHMgdG8gYGZhbHNlYC5cbiAgICpcbiAgICogQGRlZmF1bHQgZmFsc2VgLlxuICAgKiBAc2NoZW1hIEdyYXBocWxBc3Npc3RDb25maWd1cmF0aW9uI2VuYWJsZWRcbiAgICovXG4gIHJlYWRvbmx5IGVuYWJsZWQ/OiBib29sZWFuO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGFuIG9iamVjdCBvZiB0eXBlICdHcmFwaHFsQXNzaXN0Q29uZmlndXJhdGlvbicgdG8gSlNPTiByZXByZXNlbnRhdGlvbi5cbiAqIEBpbnRlcm5hbFxuICovXG4vKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5leHBvcnQgZnVuY3Rpb24gdG9Kc29uX0dyYXBocWxBc3Npc3RDb25maWd1cmF0aW9uKG9iajogR3JhcGhxbEFzc2lzdENvbmZpZ3VyYXRpb24gfCB1bmRlZmluZWQpOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgdW5kZWZpbmVkIHtcbiAgaWYgKG9iaiA9PT0gdW5kZWZpbmVkKSB7IHJldHVybiB1bmRlZmluZWQ7IH1cbiAgY29uc3QgcmVzdWx0ID0ge1xuICAgICdlbmFibGVkJzogb2JqLmVuYWJsZWQsXG4gIH07XG4gIC8vIGZpbHRlciB1bmRlZmluZWQgdmFsdWVzXG4gIHJldHVybiBPYmplY3QuZW50cmllcyhyZXN1bHQpLnJlZHVjZSgociwgaSkgPT4gKGlbMV0gPT09IHVuZGVmaW5lZCkgPyByIDogKHsgLi4uciwgW2lbMF1dOiBpWzFdIH0pLCB7fSk7XG59XG4vKiBlc2xpbnQtZW5hYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cblxuLyoqXG4gKiBPcHRpb25zIHRoYXQgY2hhbmdlIGhvdyB0aGUgR3JhcGhRTCBmb3JtYXR0ZXIgYmVoYXZlcy5cbiAqXG4gKiBAc2NoZW1hIEdyYXBocWxGb3JtYXR0ZXJDb25maWd1cmF0aW9uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgR3JhcGhxbEZvcm1hdHRlckNvbmZpZ3VyYXRpb24ge1xuICAvKipcbiAgICogQ29udHJvbHMgc3BhY2VzIGluc2lkZSB0aGUgYnJhY2VzIG9mIHNpbmdsZS1saW5lIEdyYXBoUUwgb2JqZWN0IHZhbHVlcy4gQmlvbWUgZm9ybWF0c1xuICAgKiBge25hbWU6IFwiQmlvbWVcIn1gIHdoZW4gZGlzYWJsZWQgYW5kIGB7IG5hbWU6IFwiQmlvbWVcIiB9YCB3aGVuIGVuYWJsZWQuIElmIHVuc2V0LCBpbmhlcml0cyB0aGVcbiAgICogZ2xvYmFsIGJyYWNrZXQgc3BhY2luZyBzZXR0aW5nLlxuICAgKlxuICAgKiBAc2NoZW1hIEdyYXBocWxGb3JtYXR0ZXJDb25maWd1cmF0aW9uI2JyYWNrZXRTcGFjaW5nXG4gICAqL1xuICByZWFkb25seSBicmFja2V0U3BhY2luZz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEVuYWJsZXMgb3IgZGlzYWJsZXMgdGhlIGZvcm1hdHRlciBmb3IgR3JhcGhRTC5cbiAgICpcbiAgICogQHNjaGVtYSBHcmFwaHFsRm9ybWF0dGVyQ29uZmlndXJhdGlvbiNlbmFibGVkXG4gICAqL1xuICByZWFkb25seSBlbmFibGVkPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogVGhlIGluZGVudCBzdHlsZSBhcHBsaWVkIHRvIEdyYXBoUUwgZmlsZXMuIElmIHVuc2V0LCBpbmhlcml0cyB0aGUgZ2xvYmFsIGluZGVudGF0aW9uIHN0eWxlLlxuICAgKlxuICAgKiBAc2NoZW1hIEdyYXBocWxGb3JtYXR0ZXJDb25maWd1cmF0aW9uI2luZGVudFN0eWxlXG4gICAqL1xuICByZWFkb25seSBpbmRlbnRTdHlsZT86IEluZGVudFN0eWxlO1xuXG4gIC8qKlxuICAgKiBUaGUgaW5kZW50YXRpb24gd2lkdGggYXBwbGllZCB0byBHcmFwaFFMIGZpbGVzLiBJZiB1bnNldCwgaW5oZXJpdHMgdGhlIGdsb2JhbCBpbmRlbnRhdGlvblxuICAgKiB3aWR0aC5cbiAgICpcbiAgICogQHNjaGVtYSBHcmFwaHFsRm9ybWF0dGVyQ29uZmlndXJhdGlvbiNpbmRlbnRXaWR0aFxuICAgKi9cbiAgcmVhZG9ubHkgaW5kZW50V2lkdGg/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFRoZSBsaW5lIGVuZGluZyBhcHBsaWVkIHRvIEdyYXBoUUwgZmlsZXMuIElmIHVuc2V0LCBpbmhlcml0cyB0aGUgZ2xvYmFsIGxpbmUgZW5kaW5nLlxuICAgKlxuICAgKiBAc2NoZW1hIEdyYXBocWxGb3JtYXR0ZXJDb25maWd1cmF0aW9uI2xpbmVFbmRpbmdcbiAgICovXG4gIHJlYWRvbmx5IGxpbmVFbmRpbmc/OiBMaW5lRW5kaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgcHJlZmVycmVkIG1heGltdW0gbGluZSB3aWR0aCBmb3IgR3JhcGhRTCBmaWxlcy4gSWYgdW5zZXQsIGluaGVyaXRzIHRoZSBnbG9iYWwgbGluZVxuICAgKiB3aWR0aC5cbiAgICpcbiAgICogQHNjaGVtYSBHcmFwaHFsRm9ybWF0dGVyQ29uZmlndXJhdGlvbiNsaW5lV2lkdGhcbiAgICovXG4gIHJlYWRvbmx5IGxpbmVXaWR0aD86IG51bWJlcjtcblxuICAvKipcbiAgICogUmVzZXJ2ZWQgZm9yIGZ1dHVyZSBmb3JtYXR0ZXIgc3VwcG9ydC4gVGhlIGN1cnJlbnQgZm9ybWF0dGVyIHByZXNlcnZlcyBzdGFuZGFyZFxuICAgKiBkb3VibGUtcXVvdGVkIEdyYXBoUUwgc3RyaW5ncyBhbmQgZG9lcyBub3QgdXNlIHRoaXMgc2V0dGluZy5cbiAgICpcbiAgICogQHNjaGVtYSBHcmFwaHFsRm9ybWF0dGVyQ29uZmlndXJhdGlvbiNxdW90ZVN0eWxlXG4gICAqL1xuICByZWFkb25seSBxdW90ZVN0eWxlPzogUXVvdGVTdHlsZTtcblxuICAvKipcbiAgICogV2hldGhlciB0byBhZGQgYSB0cmFpbGluZyBuZXdsaW5lIGF0IHRoZSBlbmQgb2YgdGhlIGZpbGUuIElmIHVuc2V0LCBpbmhlcml0cyB0aGUgZ2xvYmFsXG4gICAqIHRyYWlsaW5nIG5ld2xpbmUgc2V0dGluZy5cbiAgICpcbiAgICogQHNjaGVtYSBHcmFwaHFsRm9ybWF0dGVyQ29uZmlndXJhdGlvbiN0cmFpbGluZ05ld2xpbmVcbiAgICovXG4gIHJlYWRvbmx5IHRyYWlsaW5nTmV3bGluZT86IGJvb2xlYW47XG59XG5cbi8qKlxuICogQ29udmVydHMgYW4gb2JqZWN0IG9mIHR5cGUgJ0dyYXBocWxGb3JtYXR0ZXJDb25maWd1cmF0aW9uJyB0byBKU09OIHJlcHJlc2VudGF0aW9uLlxuICogQGludGVybmFsXG4gKi9cbi8qIGVzbGludC1kaXNhYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0pzb25fR3JhcGhxbEZvcm1hdHRlckNvbmZpZ3VyYXRpb24ob2JqOiBHcmFwaHFsRm9ybWF0dGVyQ29uZmlndXJhdGlvbiB8IHVuZGVmaW5lZCk6IFJlY29yZDxzdHJpbmcsIGFueT4gfCB1bmRlZmluZWQge1xuICBpZiAob2JqID09PSB1bmRlZmluZWQpIHsgcmV0dXJuIHVuZGVmaW5lZDsgfVxuICBjb25zdCByZXN1bHQgPSB7XG4gICAgJ2JyYWNrZXRTcGFjaW5nJzogb2JqLmJyYWNrZXRTcGFjaW5nLFxuICAgICdlbmFibGVkJzogb2JqLmVuYWJsZWQsXG4gICAgJ2luZGVudFN0eWxlJzogb2JqLmluZGVudFN0eWxlLFxuICAgICdpbmRlbnRXaWR0aCc6IG9iai5pbmRlbnRXaWR0aCxcbiAgICAnbGluZUVuZGluZyc6IG9iai5saW5lRW5kaW5nLFxuICAgICdsaW5lV2lkdGgnOiBvYmoubGluZVdpZHRoLFxuICAgICdxdW90ZVN0eWxlJzogb2JqLnF1b3RlU3R5bGUsXG4gICAgJ3RyYWlsaW5nTmV3bGluZSc6IG9iai50cmFpbGluZ05ld2xpbmUsXG4gIH07XG4gIC8vIGZpbHRlciB1bmRlZmluZWQgdmFsdWVzXG4gIHJldHVybiBPYmplY3QuZW50cmllcyhyZXN1bHQpLnJlZHVjZSgociwgaSkgPT4gKGlbMV0gPT09IHVuZGVmaW5lZCkgPyByIDogKHsgLi4uciwgW2lbMF1dOiBpWzFdIH0pLCB7fSk7XG59XG4vKiBlc2xpbnQtZW5hYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cblxuLyoqXG4gKiBPcHRpb25zIHRoYXQgY2hhbmdlIGhvdyB0aGUgR3JhcGhRTCBsaW50ZXIgYmVoYXZlcy5cbiAqXG4gKiBAc2NoZW1hIEdyYXBocWxMaW50ZXJDb25maWd1cmF0aW9uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgR3JhcGhxbExpbnRlckNvbmZpZ3VyYXRpb24ge1xuICAvKipcbiAgICogRW5hYmxlcyBvciBkaXNhYmxlcyB0aGUgbGludGVyIGZvciBHcmFwaFFMLlxuICAgKlxuICAgKiBAc2NoZW1hIEdyYXBocWxMaW50ZXJDb25maWd1cmF0aW9uI2VuYWJsZWRcbiAgICovXG4gIHJlYWRvbmx5IGVuYWJsZWQ/OiBib29sZWFuO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGFuIG9iamVjdCBvZiB0eXBlICdHcmFwaHFsTGludGVyQ29uZmlndXJhdGlvbicgdG8gSlNPTiByZXByZXNlbnRhdGlvbi5cbiAqIEBpbnRlcm5hbFxuICovXG4vKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5leHBvcnQgZnVuY3Rpb24gdG9Kc29uX0dyYXBocWxMaW50ZXJDb25maWd1cmF0aW9uKG9iajogR3JhcGhxbExpbnRlckNvbmZpZ3VyYXRpb24gfCB1bmRlZmluZWQpOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgdW5kZWZpbmVkIHtcbiAgaWYgKG9iaiA9PT0gdW5kZWZpbmVkKSB7IHJldHVybiB1bmRlZmluZWQ7IH1cbiAgY29uc3QgcmVzdWx0ID0ge1xuICAgICdlbmFibGVkJzogb2JqLmVuYWJsZWQsXG4gIH07XG4gIC8vIGZpbHRlciB1bmRlZmluZWQgdmFsdWVzXG4gIHJldHVybiBPYmplY3QuZW50cmllcyhyZXN1bHQpLnJlZHVjZSgociwgaSkgPT4gKGlbMV0gPT09IHVuZGVmaW5lZCkgPyByIDogKHsgLi4uciwgW2lbMF1dOiBpWzFdIH0pLCB7fSk7XG59XG4vKiBlc2xpbnQtZW5hYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cblxuLyoqXG4gKiBPcHRpb25zIHRoYXQgY2hhbmdlIGhvdyBHcml0UUwgYXNzaXN0IGJlaGF2ZXMuXG4gKlxuICogQHNjaGVtYSBHcml0QXNzaXN0Q29uZmlndXJhdGlvblxuICovXG5leHBvcnQgaW50ZXJmYWNlIEdyaXRBc3Npc3RDb25maWd1cmF0aW9uIHtcbiAgLyoqXG4gICAqIEVuYWJsZXMgb3IgZGlzYWJsZXMgYXNzaXN0IGFjdGlvbnMgZm9yIEdyaXRRTC5cbiAgICpcbiAgICogQHNjaGVtYSBHcml0QXNzaXN0Q29uZmlndXJhdGlvbiNlbmFibGVkXG4gICAqL1xuICByZWFkb25seSBlbmFibGVkPzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhbiBvYmplY3Qgb2YgdHlwZSAnR3JpdEFzc2lzdENvbmZpZ3VyYXRpb24nIHRvIEpTT04gcmVwcmVzZW50YXRpb24uXG4gKiBAaW50ZXJuYWxcbiAqL1xuLyogZXNsaW50LWRpc2FibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvSnNvbl9Hcml0QXNzaXN0Q29uZmlndXJhdGlvbihvYmo6IEdyaXRBc3Npc3RDb25maWd1cmF0aW9uIHwgdW5kZWZpbmVkKTogUmVjb3JkPHN0cmluZywgYW55PiB8IHVuZGVmaW5lZCB7XG4gIGlmIChvYmogPT09IHVuZGVmaW5lZCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9XG4gIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAnZW5hYmxlZCc6IG9iai5lbmFibGVkLFxuICB9O1xuICAvLyBmaWx0ZXIgdW5kZWZpbmVkIHZhbHVlc1xuICByZXR1cm4gT2JqZWN0LmVudHJpZXMocmVzdWx0KS5yZWR1Y2UoKHIsIGkpID0+IChpWzFdID09PSB1bmRlZmluZWQpID8gciA6ICh7IC4uLnIsIFtpWzBdXTogaVsxXSB9KSwge30pO1xufVxuLyogZXNsaW50LWVuYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5cbi8qKlxuICogT3B0aW9ucyB0aGF0IGNoYW5nZSBob3cgdGhlIEdyaXRRTCBmb3JtYXR0ZXIgYmVoYXZlcy5cbiAqXG4gKiBAc2NoZW1hIEdyaXRGb3JtYXR0ZXJDb25maWd1cmF0aW9uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgR3JpdEZvcm1hdHRlckNvbmZpZ3VyYXRpb24ge1xuICAvKipcbiAgICogRW5hYmxlcyBvciBkaXNhYmxlcyB0aGUgZm9ybWF0dGVyIGZvciBHcml0UUwuXG4gICAqXG4gICAqIEBzY2hlbWEgR3JpdEZvcm1hdHRlckNvbmZpZ3VyYXRpb24jZW5hYmxlZFxuICAgKi9cbiAgcmVhZG9ubHkgZW5hYmxlZD86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFRoZSBpbmRlbnQgc3R5bGUgYXBwbGllZCB0byBHcml0UUwgZmlsZXMuIElmIHVuc2V0LCBpbmhlcml0cyB0aGUgZ2xvYmFsIGluZGVudGF0aW9uIHN0eWxlLlxuICAgKlxuICAgKiBAc2NoZW1hIEdyaXRGb3JtYXR0ZXJDb25maWd1cmF0aW9uI2luZGVudFN0eWxlXG4gICAqL1xuICByZWFkb25seSBpbmRlbnRTdHlsZT86IEluZGVudFN0eWxlO1xuXG4gIC8qKlxuICAgKiBUaGUgaW5kZW50YXRpb24gd2lkdGggYXBwbGllZCB0byBHcml0UUwgZmlsZXMuIElmIHVuc2V0LCBpbmhlcml0cyB0aGUgZ2xvYmFsIGluZGVudGF0aW9uXG4gICAqIHdpZHRoLlxuICAgKlxuICAgKiBAc2NoZW1hIEdyaXRGb3JtYXR0ZXJDb25maWd1cmF0aW9uI2luZGVudFdpZHRoXG4gICAqL1xuICByZWFkb25seSBpbmRlbnRXaWR0aD86IG51bWJlcjtcblxuICAvKipcbiAgICogVGhlIGxpbmUgZW5kaW5nIGFwcGxpZWQgdG8gR3JpdFFMIGZpbGVzLiBJZiB1bnNldCwgaW5oZXJpdHMgdGhlIGdsb2JhbCBsaW5lIGVuZGluZy5cbiAgICpcbiAgICogQHNjaGVtYSBHcml0Rm9ybWF0dGVyQ29uZmlndXJhdGlvbiNsaW5lRW5kaW5nXG4gICAqL1xuICByZWFkb25seSBsaW5lRW5kaW5nPzogTGluZUVuZGluZztcblxuICAvKipcbiAgICogVGhlIHByZWZlcnJlZCBtYXhpbXVtIGxpbmUgd2lkdGggZm9yIEdyaXRRTCBmaWxlcy4gSWYgdW5zZXQsIGluaGVyaXRzIHRoZSBnbG9iYWwgbGluZSB3aWR0aC5cbiAgICpcbiAgICogQHNjaGVtYSBHcml0Rm9ybWF0dGVyQ29uZmlndXJhdGlvbiNsaW5lV2lkdGhcbiAgICovXG4gIHJlYWRvbmx5IGxpbmVXaWR0aD86IG51bWJlcjtcblxuICAvKipcbiAgICogV2hldGhlciB0byBhZGQgYSB0cmFpbGluZyBuZXdsaW5lIGF0IHRoZSBlbmQgb2YgdGhlIGZpbGUuIElmIHVuc2V0LCBpbmhlcml0cyB0aGUgZ2xvYmFsXG4gICAqIHRyYWlsaW5nIG5ld2xpbmUgc2V0dGluZy5cbiAgICpcbiAgICogQHNjaGVtYSBHcml0Rm9ybWF0dGVyQ29uZmlndXJhdGlvbiN0cmFpbGluZ05ld2xpbmVcbiAgICovXG4gIHJlYWRvbmx5IHRyYWlsaW5nTmV3bGluZT86IGJvb2xlYW47XG59XG5cbi8qKlxuICogQ29udmVydHMgYW4gb2JqZWN0IG9mIHR5cGUgJ0dyaXRGb3JtYXR0ZXJDb25maWd1cmF0aW9uJyB0byBKU09OIHJlcHJlc2VudGF0aW9uLlxuICogQGludGVybmFsXG4gKi9cbi8qIGVzbGludC1kaXNhYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0pzb25fR3JpdEZvcm1hdHRlckNvbmZpZ3VyYXRpb24ob2JqOiBHcml0Rm9ybWF0dGVyQ29uZmlndXJhdGlvbiB8IHVuZGVmaW5lZCk6IFJlY29yZDxzdHJpbmcsIGFueT4gfCB1bmRlZmluZWQge1xuICBpZiAob2JqID09PSB1bmRlZmluZWQpIHsgcmV0dXJuIHVuZGVmaW5lZDsgfVxuICBjb25zdCByZXN1bHQgPSB7XG4gICAgJ2VuYWJsZWQnOiBvYmouZW5hYmxlZCxcbiAgICAnaW5kZW50U3R5bGUnOiBvYmouaW5kZW50U3R5bGUsXG4gICAgJ2luZGVudFdpZHRoJzogb2JqLmluZGVudFdpZHRoLFxuICAgICdsaW5lRW5kaW5nJzogb2JqLmxpbmVFbmRpbmcsXG4gICAgJ2xpbmVXaWR0aCc6IG9iai5saW5lV2lkdGgsXG4gICAgJ3RyYWlsaW5nTmV3bGluZSc6IG9iai50cmFpbGluZ05ld2xpbmUsXG4gIH07XG4gIC8vIGZpbHRlciB1bmRlZmluZWQgdmFsdWVzXG4gIHJldHVybiBPYmplY3QuZW50cmllcyhyZXN1bHQpLnJlZHVjZSgociwgaSkgPT4gKGlbMV0gPT09IHVuZGVmaW5lZCkgPyByIDogKHsgLi4uciwgW2lbMF1dOiBpWzFdIH0pLCB7fSk7XG59XG4vKiBlc2xpbnQtZW5hYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cblxuLyoqXG4gKiBPcHRpb25zIHRoYXQgY2hhbmdlIGhvdyB0aGUgR3JpdFFMIGxpbnRlciBiZWhhdmVzLlxuICpcbiAqIEBzY2hlbWEgR3JpdExpbnRlckNvbmZpZ3VyYXRpb25cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBHcml0TGludGVyQ29uZmlndXJhdGlvbiB7XG4gIC8qKlxuICAgKiBFbmFibGVzIG9yIGRpc2FibGVzIHRoZSBsaW50ZXIgZm9yIEdyaXRRTC5cbiAgICpcbiAgICogQHNjaGVtYSBHcml0TGludGVyQ29uZmlndXJhdGlvbiNlbmFibGVkXG4gICAqL1xuICByZWFkb25seSBlbmFibGVkPzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhbiBvYmplY3Qgb2YgdHlwZSAnR3JpdExpbnRlckNvbmZpZ3VyYXRpb24nIHRvIEpTT04gcmVwcmVzZW50YXRpb24uXG4gKiBAaW50ZXJuYWxcbiAqL1xuLyogZXNsaW50LWRpc2FibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvSnNvbl9Hcml0TGludGVyQ29uZmlndXJhdGlvbihvYmo6IEdyaXRMaW50ZXJDb25maWd1cmF0aW9uIHwgdW5kZWZpbmVkKTogUmVjb3JkPHN0cmluZywgYW55PiB8IHVuZGVmaW5lZCB7XG4gIGlmIChvYmogPT09IHVuZGVmaW5lZCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9XG4gIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAnZW5hYmxlZCc6IG9iai5lbmFibGVkLFxuICB9O1xuICAvLyBmaWx0ZXIgdW5kZWZpbmVkIHZhbHVlc1xuICByZXR1cm4gT2JqZWN0LmVudHJpZXMocmVzdWx0KS5yZWR1Y2UoKHIsIGkpID0+IChpWzFdID09PSB1bmRlZmluZWQpID8gciA6ICh7IC4uLnIsIFtpWzBdXTogaVsxXSB9KSwge30pO1xufVxuLyogZXNsaW50LWVuYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5cbi8qKlxuICogT3B0aW9ucyB0aGF0IGNoYW5nZSBob3cgSFRNTCBhc3Npc3QgYmVoYXZlcy5cbiAqXG4gKiBAc2NoZW1hIEh0bWxBc3Npc3RDb25maWd1cmF0aW9uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSHRtbEFzc2lzdENvbmZpZ3VyYXRpb24ge1xuICAvKipcbiAgICogRW5hYmxlcyBvciBkaXNhYmxlcyBhc3Npc3QgYWN0aW9ucyBmb3IgSFRNTCBhbmQgbGFuZ3VhZ2VzIHRoYXQgZXh0ZW5kIGl0LlxuICAgKlxuICAgKiBAc2NoZW1hIEh0bWxBc3Npc3RDb25maWd1cmF0aW9uI2VuYWJsZWRcbiAgICovXG4gIHJlYWRvbmx5IGVuYWJsZWQ/OiBib29sZWFuO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGFuIG9iamVjdCBvZiB0eXBlICdIdG1sQXNzaXN0Q29uZmlndXJhdGlvbicgdG8gSlNPTiByZXByZXNlbnRhdGlvbi5cbiAqIEBpbnRlcm5hbFxuICovXG4vKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5leHBvcnQgZnVuY3Rpb24gdG9Kc29uX0h0bWxBc3Npc3RDb25maWd1cmF0aW9uKG9iajogSHRtbEFzc2lzdENvbmZpZ3VyYXRpb24gfCB1bmRlZmluZWQpOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgdW5kZWZpbmVkIHtcbiAgaWYgKG9iaiA9PT0gdW5kZWZpbmVkKSB7IHJldHVybiB1bmRlZmluZWQ7IH1cbiAgY29uc3QgcmVzdWx0ID0ge1xuICAgICdlbmFibGVkJzogb2JqLmVuYWJsZWQsXG4gIH07XG4gIC8vIGZpbHRlciB1bmRlZmluZWQgdmFsdWVzXG4gIHJldHVybiBPYmplY3QuZW50cmllcyhyZXN1bHQpLnJlZHVjZSgociwgaSkgPT4gKGlbMV0gPT09IHVuZGVmaW5lZCkgPyByIDogKHsgLi4uciwgW2lbMF1dOiBpWzFdIH0pLCB7fSk7XG59XG4vKiBlc2xpbnQtZW5hYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cblxuLyoqXG4gKiBPcHRpb25zIHRoYXQgY2hhbmdlIGhvdyB0aGUgSFRNTCBmb3JtYXR0ZXIgYmVoYXZlcy5cbiAqXG4gKiBAc2NoZW1hIEh0bWxGb3JtYXR0ZXJDb25maWd1cmF0aW9uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSHRtbEZvcm1hdHRlckNvbmZpZ3VyYXRpb24ge1xuICAvKipcbiAgICogVGhlIGF0dHJpYnV0ZSBwb3NpdGlvbiBzdHlsZSBpbiBIVE1MIGVsZW1lbnRzLiBJZiB1bnNldCwgaW5oZXJpdHMgdGhlIGdsb2JhbCBhdHRyaWJ1dGVcbiAgICogcG9zaXRpb24gc2V0dGluZy5cbiAgICpcbiAgICogQHNjaGVtYSBIdG1sRm9ybWF0dGVyQ29uZmlndXJhdGlvbiNhdHRyaWJ1dGVQb3NpdGlvblxuICAgKi9cbiAgcmVhZG9ubHkgYXR0cmlidXRlUG9zaXRpb24/OiBBdHRyaWJ1dGVQb3NpdGlvbjtcblxuICAvKipcbiAgICogQ29udHJvbHMgdGhlIHBsYWNlbWVudCBvZiB0aGUgY2xvc2luZyBicmFja2V0IGZvciBtdWx0aWxpbmUgSFRNTCBvcGVuaW5nIHRhZ3MuIEJpb21lIHBsYWNlc1xuICAgKiB0aGUgYnJhY2tldCBhdCB0aGUgZW5kIG9mIHRoZSBsYXN0IGF0dHJpYnV0ZSBsaW5lIHdoZW4gZW5hYmxlZCBhbmQgb24gaXRzIG93biBsaW5lIGFmdGVyIHRoZVxuICAgKiBsYXN0IGF0dHJpYnV0ZSB3aGVuIGRpc2FibGVkLiBUaGlzIG9wdGlvbiBhbHNvIGFmZmVjdHMgc2VsZi1jbG9zaW5nIEhUTUwgZWxlbWVudHMuIElmIHVuc2V0LFxuICAgKiBpbmhlcml0cyB0aGUgZ2xvYmFsIGBicmFja2V0U2FtZUxpbmVgIHNldHRpbmcuXG4gICAqXG4gICAqIEBzY2hlbWEgSHRtbEZvcm1hdHRlckNvbmZpZ3VyYXRpb24jYnJhY2tldFNhbWVMaW5lXG4gICAqL1xuICByZWFkb25seSBicmFja2V0U2FtZUxpbmU/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBFbmFibGVzIG9yIGRpc2FibGVzIHRoZSBmb3JtYXR0ZXIgZm9yIEhUTUwgYW5kIGxhbmd1YWdlcyB0aGF0IGV4dGVuZCBpdC4gVGhlIGZvcm1hdHRlciBpc1xuICAgKiBleHBlcmltZW50YWwgYW5kIGRpc2FibGVkIGJ5IGRlZmF1bHQuIEZvcm1hdHRpbmcgY29tcGxldGUgSFRNTCwgVnVlLCBTdmVsdGUsIGFuZCBBc3RybyBmaWxlc1xuICAgKiByZXF1aXJlcyBgaHRtbC5leHBlcmltZW50YWxGdWxsU3VwcG9ydEVuYWJsZWRgIHRvIGJlIGB0cnVlYC5cbiAgICpcbiAgICogQHNjaGVtYSBIdG1sRm9ybWF0dGVyQ29uZmlndXJhdGlvbiNlbmFibGVkXG4gICAqL1xuICByZWFkb25seSBlbmFibGVkPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogQ29udHJvbHMgd2hldGhlciB0aGUgY29udGVudCBvZiBgPHNjcmlwdD5gIGFuZCBgPHN0eWxlPmAgdGFncyBpcyBpbmRlbnRlZCBieSBvbmUgbGV2ZWwgaW5cbiAgICogSFRNTCwgVnVlLCBTdmVsdGUsIGFuZCBBc3RybyBmaWxlcy4gRGVmYXVsdHMgdG8gYGZhbHNlYC5cbiAgICpcbiAgICogQGRlZmF1bHQgZmFsc2VgLlxuICAgKiBAc2NoZW1hIEh0bWxGb3JtYXR0ZXJDb25maWd1cmF0aW9uI2luZGVudFNjcmlwdEFuZFN0eWxlXG4gICAqL1xuICByZWFkb25seSBpbmRlbnRTY3JpcHRBbmRTdHlsZT86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFRoZSBpbmRlbnQgc3R5bGUgYXBwbGllZCB0byBIVE1MIGFuZCBsYW5ndWFnZXMgdGhhdCBleHRlbmQgaXQuIElmIHVuc2V0LCBpbmhlcml0cyB0aGUgZ2xvYmFsXG4gICAqIGluZGVudGF0aW9uIHN0eWxlLlxuICAgKlxuICAgKiBAc2NoZW1hIEh0bWxGb3JtYXR0ZXJDb25maWd1cmF0aW9uI2luZGVudFN0eWxlXG4gICAqL1xuICByZWFkb25seSBpbmRlbnRTdHlsZT86IEluZGVudFN0eWxlO1xuXG4gIC8qKlxuICAgKiBUaGUgaW5kZW50YXRpb24gd2lkdGggYXBwbGllZCB0byBIVE1MIGFuZCBsYW5ndWFnZXMgdGhhdCBleHRlbmQgaXQuIElmIHVuc2V0LCBpbmhlcml0cyB0aGVcbiAgICogZ2xvYmFsIGluZGVudGF0aW9uIHdpZHRoLlxuICAgKlxuICAgKiBAc2NoZW1hIEh0bWxGb3JtYXR0ZXJDb25maWd1cmF0aW9uI2luZGVudFdpZHRoXG4gICAqL1xuICByZWFkb25seSBpbmRlbnRXaWR0aD86IG51bWJlcjtcblxuICAvKipcbiAgICogVGhlIGxpbmUgZW5kaW5nIGFwcGxpZWQgdG8gSFRNTCBhbmQgbGFuZ3VhZ2VzIHRoYXQgZXh0ZW5kIGl0LiBJZiB1bnNldCwgaW5oZXJpdHMgdGhlIGdsb2JhbFxuICAgKiBsaW5lIGVuZGluZy5cbiAgICpcbiAgICogQHNjaGVtYSBIdG1sRm9ybWF0dGVyQ29uZmlndXJhdGlvbiNsaW5lRW5kaW5nXG4gICAqL1xuICByZWFkb25seSBsaW5lRW5kaW5nPzogTGluZUVuZGluZztcblxuICAvKipcbiAgICogVGhlIHByZWZlcnJlZCBtYXhpbXVtIGxpbmUgd2lkdGggZm9yIEhUTUwgYW5kIGxhbmd1YWdlcyB0aGF0IGV4dGVuZCBpdC4gSWYgdW5zZXQsIGluaGVyaXRzXG4gICAqIHRoZSBnbG9iYWwgbGluZSB3aWR0aC5cbiAgICpcbiAgICogQHNjaGVtYSBIdG1sRm9ybWF0dGVyQ29uZmlndXJhdGlvbiNsaW5lV2lkdGhcbiAgICovXG4gIHJlYWRvbmx5IGxpbmVXaWR0aD86IG51bWJlcjtcblxuICAvKipcbiAgICogQ29udHJvbHMgd2hldGhlciB2b2lkIGVsZW1lbnRzIGFyZSBzZWxmLWNsb3NlZC4gRGVmYXVsdHMgdG8gYG5ldmVyYC5cbiAgICpcbiAgICogQGRlZmF1bHQgbmV2ZXJgLlxuICAgKiBAc2NoZW1hIEh0bWxGb3JtYXR0ZXJDb25maWd1cmF0aW9uI3NlbGZDbG9zZVZvaWRFbGVtZW50c1xuICAgKi9cbiAgcmVhZG9ubHkgc2VsZkNsb3NlVm9pZEVsZW1lbnRzPzogU2VsZkNsb3NlVm9pZEVsZW1lbnRzO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIGFkZCBhIHRyYWlsaW5nIG5ld2xpbmUgYXQgdGhlIGVuZCBvZiB0aGUgZmlsZS4gVW5saWtlIG90aGVyIGxhbmd1YWdlLXNwZWNpZmljXG4gICAqIHRyYWlsaW5nIG5ld2xpbmUgc2V0dGluZ3MsIHRoaXMgb3B0aW9uIGRlZmF1bHRzIHRvIGB0cnVlYCBpbnN0ZWFkIG9mIGluaGVyaXRpbmcgdGhlIGdsb2JhbFxuICAgKiBzZXR0aW5nLlxuICAgKlxuICAgKiBAc2NoZW1hIEh0bWxGb3JtYXR0ZXJDb25maWd1cmF0aW9uI3RyYWlsaW5nTmV3bGluZVxuICAgKi9cbiAgcmVhZG9ubHkgdHJhaWxpbmdOZXdsaW5lPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogQ29udHJvbHMgaG93IHRoZSBmb3JtYXR0ZXIgdHJlYXRzIHdoaXRlc3BhY2UgYXJvdW5kIHRleHQgYW5kIGNoaWxkIGVsZW1lbnRzIGluIEhUTUwsIFZ1ZSxcbiAgICogU3ZlbHRlLCBhbmQgQXN0cm8gbWFya3VwLiBUaGUgYGlnbm9yZWAgc2V0dGluZyBzaG91bGQgYmUgdXNlZCBvbmx5IHdoZW4gd2hpdGVzcGFjZSBjYW5ub3RcbiAgICogYWZmZWN0IHJlbmRlcmVkIG91dHB1dC4gRGVmYXVsdHMgdG8gYGNzc2AuXG4gICAqXG4gICAqIEBkZWZhdWx0IGNzc2AuXG4gICAqIEBzY2hlbWEgSHRtbEZvcm1hdHRlckNvbmZpZ3VyYXRpb24jd2hpdGVzcGFjZVNlbnNpdGl2aXR5XG4gICAqL1xuICByZWFkb25seSB3aGl0ZXNwYWNlU2Vuc2l0aXZpdHk/OiBXaGl0ZXNwYWNlU2Vuc2l0aXZpdHk7XG59XG5cbi8qKlxuICogQ29udmVydHMgYW4gb2JqZWN0IG9mIHR5cGUgJ0h0bWxGb3JtYXR0ZXJDb25maWd1cmF0aW9uJyB0byBKU09OIHJlcHJlc2VudGF0aW9uLlxuICogQGludGVybmFsXG4gKi9cbi8qIGVzbGludC1kaXNhYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0pzb25fSHRtbEZvcm1hdHRlckNvbmZpZ3VyYXRpb24ob2JqOiBIdG1sRm9ybWF0dGVyQ29uZmlndXJhdGlvbiB8IHVuZGVmaW5lZCk6IFJlY29yZDxzdHJpbmcsIGFueT4gfCB1bmRlZmluZWQge1xuICBpZiAob2JqID09PSB1bmRlZmluZWQpIHsgcmV0dXJuIHVuZGVmaW5lZDsgfVxuICBjb25zdCByZXN1bHQgPSB7XG4gICAgJ2F0dHJpYnV0ZVBvc2l0aW9uJzogb2JqLmF0dHJpYnV0ZVBvc2l0aW9uLFxuICAgICdicmFja2V0U2FtZUxpbmUnOiBvYmouYnJhY2tldFNhbWVMaW5lLFxuICAgICdlbmFibGVkJzogb2JqLmVuYWJsZWQsXG4gICAgJ2luZGVudFNjcmlwdEFuZFN0eWxlJzogb2JqLmluZGVudFNjcmlwdEFuZFN0eWxlLFxuICAgICdpbmRlbnRTdHlsZSc6IG9iai5pbmRlbnRTdHlsZSxcbiAgICAnaW5kZW50V2lkdGgnOiBvYmouaW5kZW50V2lkdGgsXG4gICAgJ2xpbmVFbmRpbmcnOiBvYmoubGluZUVuZGluZyxcbiAgICAnbGluZVdpZHRoJzogb2JqLmxpbmVXaWR0aCxcbiAgICAnc2VsZkNsb3NlVm9pZEVsZW1lbnRzJzogb2JqLnNlbGZDbG9zZVZvaWRFbGVtZW50cyxcbiAgICAndHJhaWxpbmdOZXdsaW5lJzogb2JqLnRyYWlsaW5nTmV3bGluZSxcbiAgICAnd2hpdGVzcGFjZVNlbnNpdGl2aXR5Jzogb2JqLndoaXRlc3BhY2VTZW5zaXRpdml0eSxcbiAgfTtcbiAgLy8gZmlsdGVyIHVuZGVmaW5lZCB2YWx1ZXNcbiAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKHJlc3VsdCkucmVkdWNlKChyLCBpKSA9PiAoaVsxXSA9PT0gdW5kZWZpbmVkKSA/IHIgOiAoeyAuLi5yLCBbaVswXV06IGlbMV0gfSksIHt9KTtcbn1cbi8qIGVzbGludC1lbmFibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuXG4vKipcbiAqIE9wdGlvbnMgdGhhdCBjaGFuZ2UgaG93IHRoZSBIVE1MIGxpbnRlciBiZWhhdmVzLlxuICpcbiAqIEBzY2hlbWEgSHRtbExpbnRlckNvbmZpZ3VyYXRpb25cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBIdG1sTGludGVyQ29uZmlndXJhdGlvbiB7XG4gIC8qKlxuICAgKiBFbmFibGVzIG9yIGRpc2FibGVzIHRoZSBsaW50ZXIgZm9yIEhUTUwgYW5kIGxhbmd1YWdlcyB0aGF0IGV4dGVuZCBpdC5cbiAgICpcbiAgICogQHNjaGVtYSBIdG1sTGludGVyQ29uZmlndXJhdGlvbiNlbmFibGVkXG4gICAqL1xuICByZWFkb25seSBlbmFibGVkPzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhbiBvYmplY3Qgb2YgdHlwZSAnSHRtbExpbnRlckNvbmZpZ3VyYXRpb24nIHRvIEpTT04gcmVwcmVzZW50YXRpb24uXG4gKiBAaW50ZXJuYWxcbiAqL1xuLyogZXNsaW50LWRpc2FibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvSnNvbl9IdG1sTGludGVyQ29uZmlndXJhdGlvbihvYmo6IEh0bWxMaW50ZXJDb25maWd1cmF0aW9uIHwgdW5kZWZpbmVkKTogUmVjb3JkPHN0cmluZywgYW55PiB8IHVuZGVmaW5lZCB7XG4gIGlmIChvYmogPT09IHVuZGVmaW5lZCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9XG4gIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAnZW5hYmxlZCc6IG9iai5lbmFibGVkLFxuICB9O1xuICAvLyBmaWx0ZXIgdW5kZWZpbmVkIHZhbHVlc1xuICByZXR1cm4gT2JqZWN0LmVudHJpZXMocmVzdWx0KS5yZWR1Y2UoKHIsIGkpID0+IChpWzFdID09PSB1bmRlZmluZWQpID8gciA6ICh7IC4uLnIsIFtpWzBdXTogaVsxXSB9KSwge30pO1xufVxuLyogZXNsaW50LWVuYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5cbi8qKlxuICogT3B0aW9ucyB0aGF0IGNoYW5nZSBob3cgdGhlIEhUTUwgcGFyc2VyIGJlaGF2ZXMuXG4gKlxuICogQHNjaGVtYSBIdG1sUGFyc2VyQ29uZmlndXJhdGlvblxuICovXG5leHBvcnQgaW50ZXJmYWNlIEh0bWxQYXJzZXJDb25maWd1cmF0aW9uIHtcbiAgLyoqXG4gICAqIEVuYWJsZXMgZG91YmxlLWN1cmx5IGludGVycG9sYXRpb24gZXhwcmVzc2lvbnMgc3VjaCBhcyBge3sgZXhwcmVzc2lvbiB9fWAgaW4gYC5odG1sYCBmaWxlcy5cbiAgICogRGVmYXVsdHMgdG8gYGZhbHNlYC5cbiAgICpcbiAgICogQGRlZmF1bHQgZmFsc2VgLlxuICAgKiBAc2NoZW1hIEh0bWxQYXJzZXJDb25maWd1cmF0aW9uI2ludGVycG9sYXRpb25cbiAgICovXG4gIHJlYWRvbmx5IGludGVycG9sYXRpb24/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBFbmFibGVzIHBhcnNpbmcgVnVlIHN5bnRheCAoYHYtaWZgLCBgdi1iaW5kYCwgZXRjLikgaW4gYC5odG1sYCBmaWxlcy4gRW5hYmxpbmcgdGhpcyBvcHRpb25cbiAgICogYWxzbyBlbmFibGVzIGBpbnRlcnBvbGF0aW9uYCBpbXBsaWNpdGx5LlxuICAgKlxuICAgKiBCaW9tZSB3aWxsIGFscmVhZHkgYXV0b21hdGljYWxseSBlbmFibGUgVnVlIHBhcnNpbmcgaW4gYC52dWVgIGZpbGVzLCBzbyB5b3UgcHJvYmFibHkgZG9uJ3QgbmVlZFxuICAgKiB0byBlbmFibGUgdGhpcyBvcHRpb24uIFRoaXMgb25seSBhZmZlY3RzIGAuaHRtbGAgZmlsZXMsIGFuZCBkb2VzIG5vdCBjaGFuZ2UgaG93IGAudnVlYCwgYC5zdmVsdGVgLFxuICAgKiBvciBgLmFzdHJvYCBmaWxlcyBhcmUgcGFyc2VkLiBEZWZhdWx0cyB0byBgZmFsc2VgLlxuICAgKlxuICAgKiBAZGVmYXVsdCBmYWxzZWAuXG4gICAqIEBzY2hlbWEgSHRtbFBhcnNlckNvbmZpZ3VyYXRpb24jdnVlXG4gICAqL1xuICByZWFkb25seSB2dWU/OiBib29sZWFuO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGFuIG9iamVjdCBvZiB0eXBlICdIdG1sUGFyc2VyQ29uZmlndXJhdGlvbicgdG8gSlNPTiByZXByZXNlbnRhdGlvbi5cbiAqIEBpbnRlcm5hbFxuICovXG4vKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5leHBvcnQgZnVuY3Rpb24gdG9Kc29uX0h0bWxQYXJzZXJDb25maWd1cmF0aW9uKG9iajogSHRtbFBhcnNlckNvbmZpZ3VyYXRpb24gfCB1bmRlZmluZWQpOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgdW5kZWZpbmVkIHtcbiAgaWYgKG9iaiA9PT0gdW5kZWZpbmVkKSB7IHJldHVybiB1bmRlZmluZWQ7IH1cbiAgY29uc3QgcmVzdWx0ID0ge1xuICAgICdpbnRlcnBvbGF0aW9uJzogb2JqLmludGVycG9sYXRpb24sXG4gICAgJ3Z1ZSc6IG9iai52dWUsXG4gIH07XG4gIC8vIGZpbHRlciB1bmRlZmluZWQgdmFsdWVzXG4gIHJldHVybiBPYmplY3QuZW50cmllcyhyZXN1bHQpLnJlZHVjZSgociwgaSkgPT4gKGlbMV0gPT09IHVuZGVmaW5lZCkgPyByIDogKHsgLi4uciwgW2lbMF1dOiBpWzFdIH0pLCB7fSk7XG59XG4vKiBlc2xpbnQtZW5hYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cblxuLyoqXG4gKiBBc3Npc3Qgb3B0aW9ucyBzcGVjaWZpYyB0byB0aGUgSmF2YVNjcmlwdCBhc3Npc3RcbiAqXG4gKiBAc2NoZW1hIEpzQXNzaXN0Q29uZmlndXJhdGlvblxuICovXG5leHBvcnQgaW50ZXJmYWNlIEpzQXNzaXN0Q29uZmlndXJhdGlvbiB7XG4gIC8qKlxuICAgKiBFbmFibGVzIG9yIGRpc2FibGVzIGFzc2lzdCBhY3Rpb25zIGZvciBKYXZhU2NyaXB0IGFuZCBsYW5ndWFnZXMgdGhhdCBleHRlbmQgaXQuXG4gICAqXG4gICAqIEBzY2hlbWEgSnNBc3Npc3RDb25maWd1cmF0aW9uI2VuYWJsZWRcbiAgICovXG4gIHJlYWRvbmx5IGVuYWJsZWQ/OiBib29sZWFuO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGFuIG9iamVjdCBvZiB0eXBlICdKc0Fzc2lzdENvbmZpZ3VyYXRpb24nIHRvIEpTT04gcmVwcmVzZW50YXRpb24uXG4gKiBAaW50ZXJuYWxcbiAqL1xuLyogZXNsaW50LWRpc2FibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvSnNvbl9Kc0Fzc2lzdENvbmZpZ3VyYXRpb24ob2JqOiBKc0Fzc2lzdENvbmZpZ3VyYXRpb24gfCB1bmRlZmluZWQpOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgdW5kZWZpbmVkIHtcbiAgaWYgKG9iaiA9PT0gdW5kZWZpbmVkKSB7IHJldHVybiB1bmRlZmluZWQ7IH1cbiAgY29uc3QgcmVzdWx0ID0ge1xuICAgICdlbmFibGVkJzogb2JqLmVuYWJsZWQsXG4gIH07XG4gIC8vIGZpbHRlciB1bmRlZmluZWQgdmFsdWVzXG4gIHJldHVybiBPYmplY3QuZW50cmllcyhyZXN1bHQpLnJlZHVjZSgociwgaSkgPT4gKGlbMV0gPT09IHVuZGVmaW5lZCkgPyByIDogKHsgLi4uciwgW2lbMF1dOiBpWzFdIH0pLCB7fSk7XG59XG4vKiBlc2xpbnQtZW5hYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cblxuLyoqXG4gKiBGb3JtYXR0aW5nIG9wdGlvbnMgc3BlY2lmaWMgdG8gSmF2YVNjcmlwdCBhbmQgbGFuZ3VhZ2VzIHRoYXQgZXh0ZW5kIGl0LlxuICpcbiAqIEBzY2hlbWEgSnNGb3JtYXR0ZXJDb25maWd1cmF0aW9uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSnNGb3JtYXR0ZXJDb25maWd1cmF0aW9uIHtcbiAgLyoqXG4gICAqIENvbnRyb2xzIHBhcmVudGhlc2VzIGFyb3VuZCBhcnJvdy1mdW5jdGlvbiBwYXJhbWV0ZXJzLiBgYWx3YXlzYCBhbHdheXMgcHJpbnRzIHBhcmVudGhlc2VzLFxuICAgKiB3aGlsZSBgYXNOZWVkZWRgIG9taXRzIHRoZW0gd2hlbiBhbiBhcnJvdyBmdW5jdGlvbiBoYXMgb25lIHBhcmFtZXRlciBhbmQgdGhlIHN5bnRheCBwZXJtaXRzXG4gICAqIGl0LiBEZWZhdWx0cyB0byBgYWx3YXlzYC5cbiAgICpcbiAgICogQGRlZmF1bHQgYWx3YXlzYC5cbiAgICogQHNjaGVtYSBKc0Zvcm1hdHRlckNvbmZpZ3VyYXRpb24jYXJyb3dQYXJlbnRoZXNlc1xuICAgKi9cbiAgcmVhZG9ubHkgYXJyb3dQYXJlbnRoZXNlcz86IEFycm93UGFyZW50aGVzZXM7XG5cbiAgLyoqXG4gICAqIFRoZSBhdHRyaWJ1dGUgcG9zaXRpb24gc3R5bGUgaW4gSlNYIGVsZW1lbnRzLiBJZiB1bnNldCwgaW5oZXJpdHMgdGhlIGdsb2JhbCBhdHRyaWJ1dGVcbiAgICogcG9zaXRpb24gc2V0dGluZy5cbiAgICpcbiAgICogQHNjaGVtYSBKc0Zvcm1hdHRlckNvbmZpZ3VyYXRpb24jYXR0cmlidXRlUG9zaXRpb25cbiAgICovXG4gIHJlYWRvbmx5IGF0dHJpYnV0ZVBvc2l0aW9uPzogQXR0cmlidXRlUG9zaXRpb247XG5cbiAgLyoqXG4gICAqIENvbnRyb2xzIHRoZSBwbGFjZW1lbnQgb2YgdGhlIGNsb3NpbmcgYnJhY2tldCBmb3IgbXVsdGlsaW5lIEpTWCBvcGVuaW5nIHRhZ3MuIEJpb21lIHBsYWNlc1xuICAgKiB0aGUgYnJhY2tldCBhdCB0aGUgZW5kIG9mIHRoZSBsYXN0IGF0dHJpYnV0ZSBsaW5lIHdoZW4gZW5hYmxlZCBhbmQgb24gaXRzIG93biBsaW5lIGFmdGVyIHRoZVxuICAgKiBsYXN0IGF0dHJpYnV0ZSB3aGVuIGRpc2FibGVkLiBTZWxmLWNsb3NpbmcgSlNYIGVsZW1lbnRzIGFyZSB1bmFmZmVjdGVkLiBJZiB1bnNldCwgaW5oZXJpdHNcbiAgICogdGhlIGdsb2JhbCBicmFja2V0IHBsYWNlbWVudCBzZXR0aW5nLlxuICAgKlxuICAgKiBAc2NoZW1hIEpzRm9ybWF0dGVyQ29uZmlndXJhdGlvbiNicmFja2V0U2FtZUxpbmVcbiAgICovXG4gIHJlYWRvbmx5IGJyYWNrZXRTYW1lTGluZT86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIENvbnRyb2xzIHNwYWNlcyBpbnNpZGUgdGhlIGJyYWNlcyBvZiBzaW5nbGUtbGluZSBvYmplY3QgbGl0ZXJhbHMuIEJpb21lIGZvcm1hdHMgYHt2YWx1ZTogMX1gXG4gICAqIHdoZW4gZGlzYWJsZWQgYW5kIGB7IHZhbHVlOiAxIH1gIHdoZW4gZW5hYmxlZC4gSWYgdW5zZXQsIGluaGVyaXRzIHRoZSBnbG9iYWwgYnJhY2tldCBzcGFjaW5nXG4gICAqIHNldHRpbmcuXG4gICAqXG4gICAqIEBzY2hlbWEgSnNGb3JtYXR0ZXJDb25maWd1cmF0aW9uI2JyYWNrZXRTcGFjaW5nXG4gICAqL1xuICByZWFkb25seSBicmFja2V0U3BhY2luZz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIENvbnRyb2xzIHNwYWNlcyBpbW1lZGlhdGVseSBpbnNpZGUgc3VwcG9ydGVkIEphdmFTY3JpcHQgYW5kIFR5cGVTY3JpcHQgZGVsaW1pdGVycyB3aGVuIHRoZWlyXG4gICAqIGNvbnRlbnQgZml0cyBvbiBvbmUgbGluZS4gVGhpcyBhZmZlY3RzIHBhcmVudGhlc2VzLCBzcXVhcmUgYnJhY2tldHMsIHRlbXBsYXRlXG4gICAqIGludGVycG9sYXRpb25zLCBUeXBlU2NyaXB0IGFuZ2xlIGJyYWNrZXRzLCBhbmQgSlNYIGV4cHJlc3Npb24gYnJhY2VzLiBFbXB0eSBkZWxpbWl0ZXJzIGFyZVxuICAgKiB1bmNoYW5nZWQuXG4gICAqXG4gICAqIEl0IGFsc28gY29udHJvbHMgc3BhY2luZyBhZnRlciBsb2dpY2FsIE5PVCBvcGVyYXRvcnMuIEluIGEgY2hhaW4gb2YgbG9naWNhbCBOT1Qgb3BlcmF0b3JzLFxuICAgKiBvbmx5IHRoZSBmaW5hbCBvcGVyYXRvciByZWNlaXZlcyBhIGZvbGxvd2luZyBzcGFjZS4gQmlvbWUgZG9lc24ndCBhZGQgc3BhY2VzIGJlZm9yZSBvcGVuaW5nXG4gICAqIGRlbGltaXRlcnMuXG4gICAqXG4gICAqIElmIHVuc2V0LCBpbmhlcml0cyB0aGUgZ2xvYmFsIGRlbGltaXRlciBzcGFjaW5nIHNldHRpbmcuXG4gICAqXG4gICAqIEBzY2hlbWEgSnNGb3JtYXR0ZXJDb25maWd1cmF0aW9uI2RlbGltaXRlclNwYWNpbmdcbiAgICovXG4gIHJlYWRvbmx5IGRlbGltaXRlclNwYWNpbmc/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBFbmFibGVzIG9yIGRpc2FibGVzIHRoZSBmb3JtYXR0ZXIgZm9yIEphdmFTY3JpcHQgYW5kIGxhbmd1YWdlcyB0aGF0IGV4dGVuZCBpdC5cbiAgICpcbiAgICogQHNjaGVtYSBKc0Zvcm1hdHRlckNvbmZpZ3VyYXRpb24jZW5hYmxlZFxuICAgKi9cbiAgcmVhZG9ubHkgZW5hYmxlZD86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFVzZXMgdGhlIHNhbWUgYGF1dG9gLCBgYWx3YXlzYCwgYW5kIGBuZXZlcmAgYmVoYXZpb3IgYXMgdGhlIGdsb2JhbCBleHBhbnNpb24gc2V0dGluZy5cbiAgICpcbiAgICogSWYgdW5zZXQsIGluaGVyaXRzIHRoZSBnbG9iYWwgZXhwYW5zaW9uIHNldHRpbmcuXG4gICAqXG4gICAqIEBzY2hlbWEgSnNGb3JtYXR0ZXJDb25maWd1cmF0aW9uI2V4cGFuZFxuICAgKi9cbiAgcmVhZG9ubHkgZXhwYW5kPzogRXhwYW5kO1xuXG4gIC8qKlxuICAgKiBUaGUgaW5kZW50IHN0eWxlIGFwcGxpZWQgdG8gSmF2YVNjcmlwdCBhbmQgbGFuZ3VhZ2VzIHRoYXQgZXh0ZW5kIGl0LiBJZiB1bnNldCwgaW5oZXJpdHMgdGhlXG4gICAqIGdsb2JhbCBpbmRlbnRhdGlvbiBzdHlsZS5cbiAgICpcbiAgICogQHNjaGVtYSBKc0Zvcm1hdHRlckNvbmZpZ3VyYXRpb24jaW5kZW50U3R5bGVcbiAgICovXG4gIHJlYWRvbmx5IGluZGVudFN0eWxlPzogSW5kZW50U3R5bGU7XG5cbiAgLyoqXG4gICAqIFRoZSBpbmRlbnRhdGlvbiB3aWR0aCBhcHBsaWVkIHRvIEphdmFTY3JpcHQgYW5kIGxhbmd1YWdlcyB0aGF0IGV4dGVuZCBpdC4gSWYgdW5zZXQsXG4gICAqIGluaGVyaXRzIHRoZSBnbG9iYWwgaW5kZW50YXRpb24gd2lkdGguXG4gICAqXG4gICAqIEBzY2hlbWEgSnNGb3JtYXR0ZXJDb25maWd1cmF0aW9uI2luZGVudFdpZHRoXG4gICAqL1xuICByZWFkb25seSBpbmRlbnRXaWR0aD86IG51bWJlcjtcblxuICAvKipcbiAgICogU2VsZWN0cyB0aGUgcHJlZmVycmVkIHF1b3RlIHN0eWxlIGZvciBKU1ggYXR0cmlidXRlIHZhbHVlcy4gRGVmYXVsdHMgdG8gYGRvdWJsZWAuXG4gICAqXG4gICAqIEBkZWZhdWx0IGRvdWJsZWAuXG4gICAqIEBzY2hlbWEgSnNGb3JtYXR0ZXJDb25maWd1cmF0aW9uI2pzeFF1b3RlU3R5bGVcbiAgICovXG4gIHJlYWRvbmx5IGpzeFF1b3RlU3R5bGU/OiBRdW90ZVN0eWxlO1xuXG4gIC8qKlxuICAgKiBUaGUgbGluZSBlbmRpbmcgYXBwbGllZCB0byBKYXZhU2NyaXB0IGFuZCBsYW5ndWFnZXMgdGhhdCBleHRlbmQgaXQuIElmIHVuc2V0LCBpbmhlcml0cyB0aGVcbiAgICogZ2xvYmFsIGxpbmUgZW5kaW5nLlxuICAgKlxuICAgKiBAc2NoZW1hIEpzRm9ybWF0dGVyQ29uZmlndXJhdGlvbiNsaW5lRW5kaW5nXG4gICAqL1xuICByZWFkb25seSBsaW5lRW5kaW5nPzogTGluZUVuZGluZztcblxuICAvKipcbiAgICogVGhlIHByZWZlcnJlZCBtYXhpbXVtIGxpbmUgd2lkdGggYXBwbGllZCB0byBKYXZhU2NyaXB0IGFuZCBsYW5ndWFnZXMgdGhhdCBleHRlbmQgaXQuIElmXG4gICAqIHVuc2V0LCBpbmhlcml0cyB0aGUgZ2xvYmFsIGxpbmUgd2lkdGguXG4gICAqXG4gICAqIEBzY2hlbWEgSnNGb3JtYXR0ZXJDb25maWd1cmF0aW9uI2xpbmVXaWR0aFxuICAgKi9cbiAgcmVhZG9ubHkgbGluZVdpZHRoPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBXaGVuIGJyZWFraW5nIGJpbmFyeSBleHByZXNzaW9ucyBpbnRvIG11bHRpcGxlIGxpbmVzLCB3aGV0aGVyIHRvIGJyZWFrIHRoZW0gYmVmb3JlIG9yIGFmdGVyXG4gICAqIHRoZSBiaW5hcnkgb3BlcmF0b3IuIERlZmF1bHRzIHRvIGBhZnRlcmAuXG4gICAqXG4gICAqIEBkZWZhdWx0IGFmdGVyYC5cbiAgICogQHNjaGVtYSBKc0Zvcm1hdHRlckNvbmZpZ3VyYXRpb24jb3BlcmF0b3JMaW5lYnJlYWtcbiAgICovXG4gIHJlYWRvbmx5IG9wZXJhdG9yTGluZWJyZWFrPzogT3BlcmF0b3JMaW5lYnJlYWs7XG5cbiAgLyoqXG4gICAqIENvbnRyb2xzIHdoZXRoZXIgcXVvdGVzIGFyb3VuZCBvYmplY3QgcHJvcGVydHkgbmFtZXMgYXJlIHByZXNlcnZlZC4gYGFzTmVlZGVkYCByZW1vdmVzXG4gICAqIHF1b3RlcyB3aGVuIHRoZSBwcm9wZXJ0eSBuYW1lIGlzIHZhbGlkIHdpdGhvdXQgdGhlbSwgd2hpbGUgYHByZXNlcnZlYCBrZWVwcyBxdW90ZXMgYXJvdW5kXG4gICAqIHByb3BlcnR5IG5hbWVzIHRoYXQgd2VyZSBxdW90ZWQgaW4gdGhlIGlucHV0LiBEZWZhdWx0cyB0byBgYXNOZWVkZWRgIGluIGNvbmZpZ3VyYXRpb25cbiAgICogKGBhcy1uZWVkZWRgIG9uIHRoZSBDTEkpLlxuICAgKlxuICAgKiBAZGVmYXVsdCBhc05lZWRlZGAgaW4gY29uZmlndXJhdGlvblxuICAgKiBAc2NoZW1hIEpzRm9ybWF0dGVyQ29uZmlndXJhdGlvbiNxdW90ZVByb3BlcnRpZXNcbiAgICovXG4gIHJlYWRvbmx5IHF1b3RlUHJvcGVydGllcz86IFF1b3RlUHJvcGVydGllcztcblxuICAvKipcbiAgICogU2VsZWN0cyB0aGUgcHJlZmVycmVkIHF1b3RlIHN0eWxlIGZvciBKYXZhU2NyaXB0IGFuZCBUeXBlU2NyaXB0IHN0cmluZyBsaXRlcmFscy4gQmlvbWUgbWF5XG4gICAqIHVzZSB0aGUgYWx0ZXJuYXRlIHF1b3RlIHdoZW4gdGhhdCBhdm9pZHMgYWRkaXRpb25hbCBlc2NhcGluZy4gRGVmYXVsdHMgdG8gYGRvdWJsZWAuXG4gICAqXG4gICAqIEBkZWZhdWx0IGRvdWJsZWAuXG4gICAqIEBzY2hlbWEgSnNGb3JtYXR0ZXJDb25maWd1cmF0aW9uI3F1b3RlU3R5bGVcbiAgICovXG4gIHJlYWRvbmx5IHF1b3RlU3R5bGU/OiBRdW90ZVN0eWxlO1xuXG4gIC8qKlxuICAgKiBQcmludHMgc2VtaWNvbG9ucyBhZnRlciBldmVyeSBzdGF0ZW1lbnQgb3Igb25seSB3aGVyZSBuZWVkZWQgdG8gYXZvaWQgYXV0b21hdGljIHNlbWljb2xvblxuICAgKiBpbnNlcnRpb24gaGF6YXJkcy4gRGVmYXVsdHMgdG8gYGFsd2F5c2AuXG4gICAqXG4gICAqIEBkZWZhdWx0IGFsd2F5c2AuXG4gICAqIEBzY2hlbWEgSnNGb3JtYXR0ZXJDb25maWd1cmF0aW9uI3NlbWljb2xvbnNcbiAgICovXG4gIHJlYWRvbmx5IHNlbWljb2xvbnM/OiBTZW1pY29sb25zO1xuXG4gIC8qKlxuICAgKiBDb250cm9scyB0cmFpbGluZyBjb21tYXMgaW4gbXVsdGlsaW5lIGNvbW1hLXNlcGFyYXRlZCBzdHJ1Y3R1cmVzLiBgYWxsYCBhZGRzIHRyYWlsaW5nIGNvbW1hc1xuICAgKiB3aGVyZXZlciBzeW50YXggcGVybWl0cywgaW5jbHVkaW5nIGZ1bmN0aW9uIHBhcmFtZXRlcnMgYW5kIGNhbGxzLiBgZXM1YCBhZGRzIHRoZW0gb25seSBpblxuICAgKiBjb25zdHJ1Y3RzIHN1cHBvcnRlZCBieSBFUzUsIHN1Y2ggYXMgYXJyYXkgYW5kIG9iamVjdCBsaXRlcmFscywgYW5kIGV4Y2x1ZGVzIGZ1bmN0aW9uXG4gICAqIHBhcmFtZXRlcnMsIGZ1bmN0aW9uIGNhbGxzLCBhbmQgVHlwZVNjcmlwdCB0eXBlIHBhcmFtZXRlcnMuIGBub25lYCByZW1vdmVzIHRyYWlsaW5nIGNvbW1hcy5cbiAgICogRGVmYXVsdHMgdG8gYGFsbGAuXG4gICAqXG4gICAqIEBkZWZhdWx0IGFsbGAuXG4gICAqIEBzY2hlbWEgSnNGb3JtYXR0ZXJDb25maWd1cmF0aW9uI3RyYWlsaW5nQ29tbWFzXG4gICAqL1xuICByZWFkb25seSB0cmFpbGluZ0NvbW1hcz86IEpzVHJhaWxpbmdDb21tYXM7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gYWRkIGEgdHJhaWxpbmcgbmV3bGluZSBhdCB0aGUgZW5kIG9mIHRoZSBmaWxlLiBJZiB1bnNldCwgaW5oZXJpdHMgdGhlIGdsb2JhbFxuICAgKiB0cmFpbGluZyBuZXdsaW5lIHNldHRpbmcuXG4gICAqXG4gICAqIEBzY2hlbWEgSnNGb3JtYXR0ZXJDb25maWd1cmF0aW9uI3RyYWlsaW5nTmV3bGluZVxuICAgKi9cbiAgcmVhZG9ubHkgdHJhaWxpbmdOZXdsaW5lPzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhbiBvYmplY3Qgb2YgdHlwZSAnSnNGb3JtYXR0ZXJDb25maWd1cmF0aW9uJyB0byBKU09OIHJlcHJlc2VudGF0aW9uLlxuICogQGludGVybmFsXG4gKi9cbi8qIGVzbGludC1kaXNhYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0pzb25fSnNGb3JtYXR0ZXJDb25maWd1cmF0aW9uKG9iajogSnNGb3JtYXR0ZXJDb25maWd1cmF0aW9uIHwgdW5kZWZpbmVkKTogUmVjb3JkPHN0cmluZywgYW55PiB8IHVuZGVmaW5lZCB7XG4gIGlmIChvYmogPT09IHVuZGVmaW5lZCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9XG4gIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAnYXJyb3dQYXJlbnRoZXNlcyc6IG9iai5hcnJvd1BhcmVudGhlc2VzLFxuICAgICdhdHRyaWJ1dGVQb3NpdGlvbic6IG9iai5hdHRyaWJ1dGVQb3NpdGlvbixcbiAgICAnYnJhY2tldFNhbWVMaW5lJzogb2JqLmJyYWNrZXRTYW1lTGluZSxcbiAgICAnYnJhY2tldFNwYWNpbmcnOiBvYmouYnJhY2tldFNwYWNpbmcsXG4gICAgJ2RlbGltaXRlclNwYWNpbmcnOiBvYmouZGVsaW1pdGVyU3BhY2luZyxcbiAgICAnZW5hYmxlZCc6IG9iai5lbmFibGVkLFxuICAgICdleHBhbmQnOiBvYmouZXhwYW5kLFxuICAgICdpbmRlbnRTdHlsZSc6IG9iai5pbmRlbnRTdHlsZSxcbiAgICAnaW5kZW50V2lkdGgnOiBvYmouaW5kZW50V2lkdGgsXG4gICAgJ2pzeFF1b3RlU3R5bGUnOiBvYmouanN4UXVvdGVTdHlsZSxcbiAgICAnbGluZUVuZGluZyc6IG9iai5saW5lRW5kaW5nLFxuICAgICdsaW5lV2lkdGgnOiBvYmoubGluZVdpZHRoLFxuICAgICdvcGVyYXRvckxpbmVicmVhayc6IG9iai5vcGVyYXRvckxpbmVicmVhayxcbiAgICAncXVvdGVQcm9wZXJ0aWVzJzogb2JqLnF1b3RlUHJvcGVydGllcyxcbiAgICAncXVvdGVTdHlsZSc6IG9iai5xdW90ZVN0eWxlLFxuICAgICdzZW1pY29sb25zJzogb2JqLnNlbWljb2xvbnMsXG4gICAgJ3RyYWlsaW5nQ29tbWFzJzogb2JqLnRyYWlsaW5nQ29tbWFzLFxuICAgICd0cmFpbGluZ05ld2xpbmUnOiBvYmoudHJhaWxpbmdOZXdsaW5lLFxuICB9O1xuICAvLyBmaWx0ZXIgdW5kZWZpbmVkIHZhbHVlc1xuICByZXR1cm4gT2JqZWN0LmVudHJpZXMocmVzdWx0KS5yZWR1Y2UoKHIsIGkpID0+IChpWzFdID09PSB1bmRlZmluZWQpID8gciA6ICh7IC4uLnIsIFtpWzBdXTogaVsxXSB9KSwge30pO1xufVxuLyogZXNsaW50LWVuYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5cbi8qKlxuICogSG93IEJpb21lJ3MgYW5hbHl6ZXIgYWNjb3VudHMgZm9yIGltcG9ydHMgdXNlZCBieSBKU1guXG4gKlxuICogQHNjaGVtYSBKc3hSdW50aW1lXG4gKi9cbmV4cG9ydCBlbnVtIEpzeFJ1bnRpbWUge1xuICAvKiogQW4gYXV0b21hdGljIG9yIG5hdGl2ZSBKU1ggZW52aXJvbm1lbnQgdGhhdCBkb2Vzbid0IHJlcXVpcmUgYW4gaW4tc2NvcGUgZmFjdG9yeSBpbXBvcnQuICh0cmFuc3BhcmVudCkgKi9cbiAgVFJBTlNQQVJFTlQgPSBcInRyYW5zcGFyZW50XCIsXG4gIC8qKiBBIGNsYXNzaWMgUmVhY3QgZW52aXJvbm1lbnQgdGhhdCByZXF1aXJlcyB0aGUgUmVhY3QgaW1wb3J0LCBvciBjdXN0b20gSlNYIGZhY3RvcnkgaW1wb3J0c1xuY29uZmlndXJlZCBpbiBgdHNjb25maWcuanNvbmAuXG5cbkNvcnJlc3BvbmRzIHRvIHRoZSBgcmVhY3RgIHZhbHVlIGZvciB0aGUgYGpzeGAgb3B0aW9uIGluIFR5cGVTY3JpcHQnc1xuYHRzY29uZmlnLmpzb25gLlxuXG5UaGlzIG9wdGlvbiBzaG91bGQgb25seSBiZSBuZWNlc3NhcnkgaWYgeW91IGNhbm5vdCB1cGdyYWRlIHRvIGEgUmVhY3RcbnZlcnNpb24gdGhhdCBzdXBwb3J0cyB0aGUgbmV3IEpTWCBydW50aW1lLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBhYm91dFxudGhlIG9sZCB2cy4gbmV3IEpTWCBydW50aW1lLCBwbGVhc2Ugc2VlOlxuPGh0dHBzOi8vbGVnYWN5LnJlYWN0anMub3JnL2Jsb2cvMjAyMC8wOS8yMi9pbnRyb2R1Y2luZy10aGUtbmV3LWpzeC10cmFuc2Zvcm0uaHRtbD4gKHJlYWN0Q2xhc3NpYykgKi9cbiAgUkVBQ1RfQ0xBU1NJQyA9IFwicmVhY3RDbGFzc2ljXCIsXG59XG5cbi8qKlxuICogTGludGVyIG9wdGlvbnMgc3BlY2lmaWMgdG8gdGhlIEphdmFTY3JpcHQgbGludGVyXG4gKlxuICogQHNjaGVtYSBKc0xpbnRlckNvbmZpZ3VyYXRpb25cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBKc0xpbnRlckNvbmZpZ3VyYXRpb24ge1xuICAvKipcbiAgICogRW5hYmxlcyBvciBkaXNhYmxlcyB0aGUgbGludGVyIGZvciBKYXZhU2NyaXB0IGFuZCBsYW5ndWFnZXMgdGhhdCBleHRlbmQgaXQuXG4gICAqXG4gICAqIEBzY2hlbWEgSnNMaW50ZXJDb25maWd1cmF0aW9uI2VuYWJsZWRcbiAgICovXG4gIHJlYWRvbmx5IGVuYWJsZWQ/OiBib29sZWFuO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGFuIG9iamVjdCBvZiB0eXBlICdKc0xpbnRlckNvbmZpZ3VyYXRpb24nIHRvIEpTT04gcmVwcmVzZW50YXRpb24uXG4gKiBAaW50ZXJuYWxcbiAqL1xuLyogZXNsaW50LWRpc2FibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvSnNvbl9Kc0xpbnRlckNvbmZpZ3VyYXRpb24ob2JqOiBKc0xpbnRlckNvbmZpZ3VyYXRpb24gfCB1bmRlZmluZWQpOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgdW5kZWZpbmVkIHtcbiAgaWYgKG9iaiA9PT0gdW5kZWZpbmVkKSB7IHJldHVybiB1bmRlZmluZWQ7IH1cbiAgY29uc3QgcmVzdWx0ID0ge1xuICAgICdlbmFibGVkJzogb2JqLmVuYWJsZWQsXG4gIH07XG4gIC8vIGZpbHRlciB1bmRlZmluZWQgdmFsdWVzXG4gIHJldHVybiBPYmplY3QuZW50cmllcyhyZXN1bHQpLnJlZHVjZSgociwgaSkgPT4gKGlbMV0gPT09IHVuZGVmaW5lZCkgPyByIDogKHsgLi4uciwgW2lbMF1dOiBpWzFdIH0pLCB7fSk7XG59XG4vKiBlc2xpbnQtZW5hYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cblxuLyoqXG4gKiBPcHRpb25zIHRoYXQgY2hhbmdlIGhvdyB0aGUgSmF2YVNjcmlwdCBwYXJzZXIgYmVoYXZlcy5cbiAqXG4gKiBAc2NoZW1hIEpzUGFyc2VyQ29uZmlndXJhdGlvblxuICovXG5leHBvcnQgaW50ZXJmYWNlIEpzUGFyc2VyQ29uZmlndXJhdGlvbiB7XG4gIC8qKlxuICAgKiBDb250cm9scyB3aGV0aGVyIGAuanNgLCBgLm1qc2AsIGFuZCBgLmNqc2AgZmlsZXMgbWF5IGNvbnRhaW4gSlNYIHN5bnRheC4gRGlzYWJsaW5nIHRoaXNcbiAgICogb3B0aW9uIGNhdXNlcyBKU1ggaW4gdGhvc2UgZmlsZXMgdG8gcmFpc2UgYSBkaWFnbm9zdGljLiBEZWZhdWx0cyB0byBgdHJ1ZWAuXG4gICAqXG4gICAqIEBkZWZhdWx0IHRydWVgLlxuICAgKiBAc2NoZW1hIEpzUGFyc2VyQ29uZmlndXJhdGlvbiNqc3hFdmVyeXdoZXJlXG4gICAqL1xuICByZWFkb25seSBqc3hFdmVyeXdoZXJlPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogRW5hYmxlcyBwYXJzaW5nIGRlY29yYXRvcnMgb24gY2xhc3MgcGFyYW1ldGVycy4gVGhpcyBzeW50YXggYmVsb25ncyB0byBhbiBvbGQgZXhwZXJpbWVudGFsXG4gICAqIHByb3Bvc2FsIGFuZCBtYXkgY2hhbmdlLiBEZWZhdWx0cyB0byBgZmFsc2VgLlxuICAgKlxuICAgKiBAZGVmYXVsdCBmYWxzZWAuXG4gICAqIEBzY2hlbWEgSnNQYXJzZXJDb25maWd1cmF0aW9uI3Vuc2FmZVBhcmFtZXRlckRlY29yYXRvcnNFbmFibGVkXG4gICAqL1xuICByZWFkb25seSB1bnNhZmVQYXJhbWV0ZXJEZWNvcmF0b3JzRW5hYmxlZD86IGJvb2xlYW47XG59XG5cbi8qKlxuICogQ29udmVydHMgYW4gb2JqZWN0IG9mIHR5cGUgJ0pzUGFyc2VyQ29uZmlndXJhdGlvbicgdG8gSlNPTiByZXByZXNlbnRhdGlvbi5cbiAqIEBpbnRlcm5hbFxuICovXG4vKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5leHBvcnQgZnVuY3Rpb24gdG9Kc29uX0pzUGFyc2VyQ29uZmlndXJhdGlvbihvYmo6IEpzUGFyc2VyQ29uZmlndXJhdGlvbiB8IHVuZGVmaW5lZCk6IFJlY29yZDxzdHJpbmcsIGFueT4gfCB1bmRlZmluZWQge1xuICBpZiAob2JqID09PSB1bmRlZmluZWQpIHsgcmV0dXJuIHVuZGVmaW5lZDsgfVxuICBjb25zdCByZXN1bHQgPSB7XG4gICAgJ2pzeEV2ZXJ5d2hlcmUnOiBvYmouanN4RXZlcnl3aGVyZSxcbiAgICAndW5zYWZlUGFyYW1ldGVyRGVjb3JhdG9yc0VuYWJsZWQnOiBvYmoudW5zYWZlUGFyYW1ldGVyRGVjb3JhdG9yc0VuYWJsZWQsXG4gIH07XG4gIC8vIGZpbHRlciB1bmRlZmluZWQgdmFsdWVzXG4gIHJldHVybiBPYmplY3QuZW50cmllcyhyZXN1bHQpLnJlZHVjZSgociwgaSkgPT4gKGlbMV0gPT09IHVuZGVmaW5lZCkgPyByIDogKHsgLi4uciwgW2lbMF1dOiBpWzFdIH0pLCB7fSk7XG59XG4vKiBlc2xpbnQtZW5hYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cblxuLyoqXG4gKiBSZXNvbHZlciBvcHRpb25zIHNwZWNpZmljIHRvIEphdmFTY3JpcHQgZmlsZXNcbiAqXG4gKiBAc2NoZW1hIEpzUmVzb2x2ZXJDb25maWd1cmF0aW9uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSnNSZXNvbHZlckNvbmZpZ3VyYXRpb24ge1xuICAvKipcbiAgICogRW5hYmxlcyBwbnBtIHdvcmtzcGFjZSBjYXRhbG9nIHJlc29sdXRpb24gZm9yIEphdmFTY3JpcHQgcGFja2FnZSBtYW5pZmVzdHMuXG4gICAqXG4gICAqIE9wdC1pbjpcbiAgICogLSBTZXQgYGphdmFzY3JpcHQucmVzb2x2ZXIuZXhwZXJpbWVudGFsUG5wbUNhdGFsb2dzYCB0byBgdHJ1ZWAuXG4gICAqXG4gICAqIFNjb3BlOlxuICAgKiAtIFJlc29sdmVzIGBjYXRhbG9nOmAgYW5kIGBjYXRhbG9nOjxuYW1lPmAgZGVwZW5kZW5jeSB2ZXJzaW9ucyBmcm9tXG4gICAqIGBwYWNrYWdlLmpzb25gLlxuICAgKiAtIEFwcGxpZXMgdG8gYGRlcGVuZGVuY2llc2AsIGBkZXZEZXBlbmRlbmNpZXNgLCBhbmQgYHBlZXJEZXBlbmRlbmNpZXNgLlxuICAgKlxuICAgKiBGYWlsLXNhZmUgYmVoYXZpb3I6XG4gICAqIC0gSWYgYHBucG0td29ya3NwYWNlLnlhbWxgIGlzIG1pc3NpbmcsIHVucmVhZGFibGUsIG9yIGNhbm5vdCBiZSBwYXJzZWQsXG4gICAqIEJpb21lIHNpbGVudGx5IGZhbGxzIGJhY2sgdG8gdGhlIGRlZmF1bHQgYmVoYXZpb3IgKGFzIGlmIHRoaXMgb3B0aW9uXG4gICAqIHdlcmUgZGlzYWJsZWQpLlxuICAgKiAtIFVua25vd24ga2V5cyBhbmQgdW5zdXBwb3J0ZWQgdmFsdWUgc2hhcGVzIGluIGBwbnBtLXdvcmtzcGFjZS55YW1sYCBhcmVcbiAgICogaWdub3JlZC5cbiAgICpcbiAgICogTGltaXRhdGlvbnM6XG4gICAqIC0gT25seSBgcG5wbS13b3Jrc3BhY2UueWFtbGAgaXMgcmVhZC5cbiAgICogLSBCaW9tZSBvbmx5IHJlYWRzIHRvcC1sZXZlbCBgY2F0YWxvZ2AgLyBgY2F0YWxvZ3NgIG1hcHBpbmdzIGFuZCBzY2FsYXJcbiAgICogc3RyaW5nIGVudHJpZXMuXG4gICAqXG4gICAqIERlZmF1bHRzIHRvIGBmYWxzZWAuXG4gICAqXG4gICAqIEBkZWZhdWx0IGZhbHNlYC5cbiAgICogQHNjaGVtYSBKc1Jlc29sdmVyQ29uZmlndXJhdGlvbiNleHBlcmltZW50YWxQbnBtQ2F0YWxvZ3NcbiAgICovXG4gIHJlYWRvbmx5IGV4cGVyaW1lbnRhbFBucG1DYXRhbG9ncz86IGJvb2xlYW47XG59XG5cbi8qKlxuICogQ29udmVydHMgYW4gb2JqZWN0IG9mIHR5cGUgJ0pzUmVzb2x2ZXJDb25maWd1cmF0aW9uJyB0byBKU09OIHJlcHJlc2VudGF0aW9uLlxuICogQGludGVybmFsXG4gKi9cbi8qIGVzbGludC1kaXNhYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0pzb25fSnNSZXNvbHZlckNvbmZpZ3VyYXRpb24ob2JqOiBKc1Jlc29sdmVyQ29uZmlndXJhdGlvbiB8IHVuZGVmaW5lZCk6IFJlY29yZDxzdHJpbmcsIGFueT4gfCB1bmRlZmluZWQge1xuICBpZiAob2JqID09PSB1bmRlZmluZWQpIHsgcmV0dXJuIHVuZGVmaW5lZDsgfVxuICBjb25zdCByZXN1bHQgPSB7XG4gICAgJ2V4cGVyaW1lbnRhbFBucG1DYXRhbG9ncyc6IG9iai5leHBlcmltZW50YWxQbnBtQ2F0YWxvZ3MsXG4gIH07XG4gIC8vIGZpbHRlciB1bmRlZmluZWQgdmFsdWVzXG4gIHJldHVybiBPYmplY3QuZW50cmllcyhyZXN1bHQpLnJlZHVjZSgociwgaSkgPT4gKGlbMV0gPT09IHVuZGVmaW5lZCkgPyByIDogKHsgLi4uciwgW2lbMF1dOiBpWzFdIH0pLCB7fSk7XG59XG4vKiBlc2xpbnQtZW5hYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cblxuLyoqXG4gKiBBc3Npc3Qgb3B0aW9ucyBzcGVjaWZpYyB0byB0aGUgSlNPTiBsaW50ZXJcbiAqXG4gKiBAc2NoZW1hIEpzb25Bc3Npc3RDb25maWd1cmF0aW9uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSnNvbkFzc2lzdENvbmZpZ3VyYXRpb24ge1xuICAvKipcbiAgICogRW5hYmxlcyBvciBkaXNhYmxlcyBhc3Npc3QgYWN0aW9ucyBmb3IgSlNPTiBhbmQgbGFuZ3VhZ2VzIHRoYXQgZXh0ZW5kIGl0LlxuICAgKlxuICAgKiBAc2NoZW1hIEpzb25Bc3Npc3RDb25maWd1cmF0aW9uI2VuYWJsZWRcbiAgICovXG4gIHJlYWRvbmx5IGVuYWJsZWQ/OiBib29sZWFuO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGFuIG9iamVjdCBvZiB0eXBlICdKc29uQXNzaXN0Q29uZmlndXJhdGlvbicgdG8gSlNPTiByZXByZXNlbnRhdGlvbi5cbiAqIEBpbnRlcm5hbFxuICovXG4vKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5leHBvcnQgZnVuY3Rpb24gdG9Kc29uX0pzb25Bc3Npc3RDb25maWd1cmF0aW9uKG9iajogSnNvbkFzc2lzdENvbmZpZ3VyYXRpb24gfCB1bmRlZmluZWQpOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgdW5kZWZpbmVkIHtcbiAgaWYgKG9iaiA9PT0gdW5kZWZpbmVkKSB7IHJldHVybiB1bmRlZmluZWQ7IH1cbiAgY29uc3QgcmVzdWx0ID0ge1xuICAgICdlbmFibGVkJzogb2JqLmVuYWJsZWQsXG4gIH07XG4gIC8vIGZpbHRlciB1bmRlZmluZWQgdmFsdWVzXG4gIHJldHVybiBPYmplY3QuZW50cmllcyhyZXN1bHQpLnJlZHVjZSgociwgaSkgPT4gKGlbMV0gPT09IHVuZGVmaW5lZCkgPyByIDogKHsgLi4uciwgW2lbMF1dOiBpWzFdIH0pLCB7fSk7XG59XG4vKiBlc2xpbnQtZW5hYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cblxuLyoqXG4gKiBAc2NoZW1hIEpzb25Gb3JtYXR0ZXJDb25maWd1cmF0aW9uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSnNvbkZvcm1hdHRlckNvbmZpZ3VyYXRpb24ge1xuICAvKipcbiAgICogV2hldGhlciB0byBpbnNlcnQgc3BhY2VzIGluc2lkZSBicmFjZXMgaW4gb2JqZWN0IGxpdGVyYWxzLiBJZiB1bnNldCwgaW5oZXJpdHMgdGhlIGdsb2JhbFxuICAgKiBicmFja2V0IHNwYWNpbmcgc2V0dGluZy5cbiAgICpcbiAgICogQHNjaGVtYSBKc29uRm9ybWF0dGVyQ29uZmlndXJhdGlvbiNicmFja2V0U3BhY2luZ1xuICAgKi9cbiAgcmVhZG9ubHkgYnJhY2tldFNwYWNpbmc/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBDb250cm9scyBzcGFjZXMgaW5zaWRlIEpTT04gc3F1YXJlIGJyYWNrZXRzIHdoZW4gdGhlaXIgY29udGVudCBmaXRzIG9uIG9uZSBsaW5lLiBXaGVuXG4gICAqIGVuYWJsZWQsIGBbMSwgMiwgM11gIGJlY29tZXMgYFsgMSwgMiwgMyBdYC4gRW1wdHkgYnJhY2tldHMgYXJlIHVuY2hhbmdlZC5cbiAgICpcbiAgICogSWYgdW5zZXQsIGluaGVyaXRzIHRoZSBnbG9iYWwgZGVsaW1pdGVyIHNwYWNpbmcgc2V0dGluZy5cbiAgICpcbiAgICogQHNjaGVtYSBKc29uRm9ybWF0dGVyQ29uZmlndXJhdGlvbiNkZWxpbWl0ZXJTcGFjaW5nXG4gICAqL1xuICByZWFkb25seSBkZWxpbWl0ZXJTcGFjaW5nPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogRW5hYmxlcyBvciBkaXNhYmxlcyB0aGUgZm9ybWF0dGVyIGZvciBKU09OIGFuZCBsYW5ndWFnZXMgdGhhdCBleHRlbmQgaXQuXG4gICAqXG4gICAqIEBzY2hlbWEgSnNvbkZvcm1hdHRlckNvbmZpZ3VyYXRpb24jZW5hYmxlZFxuICAgKi9cbiAgcmVhZG9ubHkgZW5hYmxlZD86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFVzZXMgdGhlIHNhbWUgYGF1dG9gLCBgYWx3YXlzYCwgYW5kIGBuZXZlcmAgYmVoYXZpb3IgYXMgdGhlIGdsb2JhbCBleHBhbnNpb24gc2V0dGluZy5cbiAgICpcbiAgICogSWYgdW5zZXQsIGluaGVyaXRzIHRoZSBnbG9iYWwgZXhwYW5zaW9uIHNldHRpbmcuXG4gICAqXG4gICAqIFdoZW4gZm9ybWF0dGluZyBgcGFja2FnZS5qc29uYCwgQmlvbWUgdXNlcyBgYWx3YXlzYCB1bmxlc3MgY29uZmlndXJlZCBvdGhlcndpc2UuXG4gICAqXG4gICAqIEBzY2hlbWEgSnNvbkZvcm1hdHRlckNvbmZpZ3VyYXRpb24jZXhwYW5kXG4gICAqL1xuICByZWFkb25seSBleHBhbmQ/OiBFeHBhbmQ7XG5cbiAgLyoqXG4gICAqIFRoZSBpbmRlbnQgc3R5bGUgYXBwbGllZCB0byBKU09OIGFuZCBsYW5ndWFnZXMgdGhhdCBleHRlbmQgaXQuIElmIHVuc2V0LCBpbmhlcml0cyB0aGUgZ2xvYmFsXG4gICAqIGluZGVudGF0aW9uIHN0eWxlLlxuICAgKlxuICAgKiBAc2NoZW1hIEpzb25Gb3JtYXR0ZXJDb25maWd1cmF0aW9uI2luZGVudFN0eWxlXG4gICAqL1xuICByZWFkb25seSBpbmRlbnRTdHlsZT86IEluZGVudFN0eWxlO1xuXG4gIC8qKlxuICAgKiBUaGUgaW5kZW50YXRpb24gd2lkdGggYXBwbGllZCB0byBKU09OIGFuZCBsYW5ndWFnZXMgdGhhdCBleHRlbmQgaXQuIElmIHVuc2V0LCBpbmhlcml0cyB0aGVcbiAgICogZ2xvYmFsIGluZGVudGF0aW9uIHdpZHRoLlxuICAgKlxuICAgKiBAc2NoZW1hIEpzb25Gb3JtYXR0ZXJDb25maWd1cmF0aW9uI2luZGVudFdpZHRoXG4gICAqL1xuICByZWFkb25seSBpbmRlbnRXaWR0aD86IG51bWJlcjtcblxuICAvKipcbiAgICogVGhlIGxpbmUgZW5kaW5nIGFwcGxpZWQgdG8gSlNPTiBhbmQgbGFuZ3VhZ2VzIHRoYXQgZXh0ZW5kIGl0LiBJZiB1bnNldCwgaW5oZXJpdHMgdGhlIGdsb2JhbFxuICAgKiBsaW5lIGVuZGluZy5cbiAgICpcbiAgICogQHNjaGVtYSBKc29uRm9ybWF0dGVyQ29uZmlndXJhdGlvbiNsaW5lRW5kaW5nXG4gICAqL1xuICByZWFkb25seSBsaW5lRW5kaW5nPzogTGluZUVuZGluZztcblxuICAvKipcbiAgICogVGhlIHByZWZlcnJlZCBtYXhpbXVtIGxpbmUgd2lkdGggYXBwbGllZCB0byBKU09OIGFuZCBsYW5ndWFnZXMgdGhhdCBleHRlbmQgaXQuIElmIHVuc2V0LFxuICAgKiBpbmhlcml0cyB0aGUgZ2xvYmFsIGxpbmUgd2lkdGguXG4gICAqXG4gICAqIEBzY2hlbWEgSnNvbkZvcm1hdHRlckNvbmZpZ3VyYXRpb24jbGluZVdpZHRoXG4gICAqL1xuICByZWFkb25seSBsaW5lV2lkdGg/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIENvbnRyb2xzIHRyYWlsaW5nIGNvbW1hcyBpbiBtdWx0aWxpbmUgSlNPTiBhcnJheXMgYW5kIG9iamVjdHMuIGBub25lYCByZW1vdmVzIHRyYWlsaW5nXG4gICAqIGNvbW1hcywgd2hpbGUgYGFsbGAgYWRkcyB0aGVtIHdoZXJldmVyIHRoZSBKU09OIGZvcm1hdHRlciBzdXBwb3J0cyB0aGVtLiBVc2UgYGFsbGAgb25seSBmb3JcbiAgICogSlNPTiB2YXJpYW50cyB0aGF0IGFsbG93IHRyYWlsaW5nIGNvbW1hcywgYW5kIGVuc3VyZSBganNvbi5wYXJzZXIuYWxsb3dUcmFpbGluZ0NvbW1hc2AgaXNcbiAgICogZW5hYmxlZCBvciBhdXRvbWF0aWNhbGx5IGRldGVjdGVkIGZvciB0aG9zZSBmaWxlcy4gRGVmYXVsdHMgdG8gYG5vbmVgLlxuICAgKlxuICAgKiBAZGVmYXVsdCBub25lYC5cbiAgICogQHNjaGVtYSBKc29uRm9ybWF0dGVyQ29uZmlndXJhdGlvbiN0cmFpbGluZ0NvbW1hc1xuICAgKi9cbiAgcmVhZG9ubHkgdHJhaWxpbmdDb21tYXM/OiBKc29uVHJhaWxpbmdDb21tYXM7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gYWRkIGEgdHJhaWxpbmcgbmV3bGluZSBhdCB0aGUgZW5kIG9mIHRoZSBmaWxlLiBJZiB1bnNldCwgaW5oZXJpdHMgdGhlIGdsb2JhbFxuICAgKiB0cmFpbGluZyBuZXdsaW5lIHNldHRpbmcuXG4gICAqXG4gICAqIEBzY2hlbWEgSnNvbkZvcm1hdHRlckNvbmZpZ3VyYXRpb24jdHJhaWxpbmdOZXdsaW5lXG4gICAqL1xuICByZWFkb25seSB0cmFpbGluZ05ld2xpbmU/OiBib29sZWFuO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGFuIG9iamVjdCBvZiB0eXBlICdKc29uRm9ybWF0dGVyQ29uZmlndXJhdGlvbicgdG8gSlNPTiByZXByZXNlbnRhdGlvbi5cbiAqIEBpbnRlcm5hbFxuICovXG4vKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5leHBvcnQgZnVuY3Rpb24gdG9Kc29uX0pzb25Gb3JtYXR0ZXJDb25maWd1cmF0aW9uKG9iajogSnNvbkZvcm1hdHRlckNvbmZpZ3VyYXRpb24gfCB1bmRlZmluZWQpOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgdW5kZWZpbmVkIHtcbiAgaWYgKG9iaiA9PT0gdW5kZWZpbmVkKSB7IHJldHVybiB1bmRlZmluZWQ7IH1cbiAgY29uc3QgcmVzdWx0ID0ge1xuICAgICdicmFja2V0U3BhY2luZyc6IG9iai5icmFja2V0U3BhY2luZyxcbiAgICAnZGVsaW1pdGVyU3BhY2luZyc6IG9iai5kZWxpbWl0ZXJTcGFjaW5nLFxuICAgICdlbmFibGVkJzogb2JqLmVuYWJsZWQsXG4gICAgJ2V4cGFuZCc6IG9iai5leHBhbmQsXG4gICAgJ2luZGVudFN0eWxlJzogb2JqLmluZGVudFN0eWxlLFxuICAgICdpbmRlbnRXaWR0aCc6IG9iai5pbmRlbnRXaWR0aCxcbiAgICAnbGluZUVuZGluZyc6IG9iai5saW5lRW5kaW5nLFxuICAgICdsaW5lV2lkdGgnOiBvYmoubGluZVdpZHRoLFxuICAgICd0cmFpbGluZ0NvbW1hcyc6IG9iai50cmFpbGluZ0NvbW1hcyxcbiAgICAndHJhaWxpbmdOZXdsaW5lJzogb2JqLnRyYWlsaW5nTmV3bGluZSxcbiAgfTtcbiAgLy8gZmlsdGVyIHVuZGVmaW5lZCB2YWx1ZXNcbiAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKHJlc3VsdCkucmVkdWNlKChyLCBpKSA9PiAoaVsxXSA9PT0gdW5kZWZpbmVkKSA/IHIgOiAoeyAuLi5yLCBbaVswXV06IGlbMV0gfSksIHt9KTtcbn1cbi8qIGVzbGludC1lbmFibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuXG4vKipcbiAqIExpbnRlciBvcHRpb25zIHNwZWNpZmljIHRvIHRoZSBKU09OIGxpbnRlclxuICpcbiAqIEBzY2hlbWEgSnNvbkxpbnRlckNvbmZpZ3VyYXRpb25cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBKc29uTGludGVyQ29uZmlndXJhdGlvbiB7XG4gIC8qKlxuICAgKiBFbmFibGVzIG9yIGRpc2FibGVzIHRoZSBsaW50ZXIgZm9yIEpTT04gYW5kIGxhbmd1YWdlcyB0aGF0IGV4dGVuZCBpdC5cbiAgICpcbiAgICogQHNjaGVtYSBKc29uTGludGVyQ29uZmlndXJhdGlvbiNlbmFibGVkXG4gICAqL1xuICByZWFkb25seSBlbmFibGVkPzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhbiBvYmplY3Qgb2YgdHlwZSAnSnNvbkxpbnRlckNvbmZpZ3VyYXRpb24nIHRvIEpTT04gcmVwcmVzZW50YXRpb24uXG4gKiBAaW50ZXJuYWxcbiAqL1xuLyogZXNsaW50LWRpc2FibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvSnNvbl9Kc29uTGludGVyQ29uZmlndXJhdGlvbihvYmo6IEpzb25MaW50ZXJDb25maWd1cmF0aW9uIHwgdW5kZWZpbmVkKTogUmVjb3JkPHN0cmluZywgYW55PiB8IHVuZGVmaW5lZCB7XG4gIGlmIChvYmogPT09IHVuZGVmaW5lZCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9XG4gIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAnZW5hYmxlZCc6IG9iai5lbmFibGVkLFxuICB9O1xuICAvLyBmaWx0ZXIgdW5kZWZpbmVkIHZhbHVlc1xuICByZXR1cm4gT2JqZWN0LmVudHJpZXMocmVzdWx0KS5yZWR1Y2UoKHIsIGkpID0+IChpWzFdID09PSB1bmRlZmluZWQpID8gciA6ICh7IC4uLnIsIFtpWzBdXTogaVsxXSB9KSwge30pO1xufVxuLyogZXNsaW50LWVuYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5cbi8qKlxuICogT3B0aW9ucyB0aGF0IGNoYW5nZSBob3cgdGhlIEpTT04gcGFyc2VyIGJlaGF2ZXMuXG4gKlxuICogQHNjaGVtYSBKc29uUGFyc2VyQ29uZmlndXJhdGlvblxuICovXG5leHBvcnQgaW50ZXJmYWNlIEpzb25QYXJzZXJDb25maWd1cmF0aW9uIHtcbiAgLyoqXG4gICAqIENvbnRyb2xzIHdoZXRoZXIgY29tbWVudHMgYXJlIGFsbG93ZWQgaW4gZmlsZXMgcGFyc2VkIGFzIEpTT04uIFdoZW4gdW5zZXQsIEJpb21lIGZvbGxvd3MgdGhlXG4gICAqIGZpbGUgdHlwZSdzIGRlZmF1bHQgYmVoYXZpb3IuIEFuIGV4cGxpY2l0IHZhbHVlIG92ZXJyaWRlcyB0aGF0IGJlaGF2aW9yLCBleGNlcHQgdGhhdFxuICAgKiBgYmlvbWUuanNvbmNgIGFsd2F5cyBhbGxvd3MgY29tbWVudHMuXG4gICAqXG4gICAqIEBzY2hlbWEgSnNvblBhcnNlckNvbmZpZ3VyYXRpb24jYWxsb3dDb21tZW50c1xuICAgKi9cbiAgcmVhZG9ubHkgYWxsb3dDb21tZW50cz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIENvbnRyb2xzIHdoZXRoZXIgdHJhaWxpbmcgY29tbWFzIGFyZSBhbGxvd2VkIGluIGZpbGVzIHBhcnNlZCBhcyBKU09OLiBXaGVuIHVuc2V0LCBCaW9tZVxuICAgKiBmb2xsb3dzIHRoZSBmaWxlIHR5cGUncyBkZWZhdWx0IGJlaGF2aW9yLiBBbiBleHBsaWNpdCB2YWx1ZSBvdmVycmlkZXMgdGhhdCBiZWhhdmlvciwgZXhjZXB0XG4gICAqIHRoYXQgYGJpb21lLmpzb25jYCBhbHdheXMgYWxsb3dzIHRyYWlsaW5nIGNvbW1hcy5cbiAgICpcbiAgICogQHNjaGVtYSBKc29uUGFyc2VyQ29uZmlndXJhdGlvbiNhbGxvd1RyYWlsaW5nQ29tbWFzXG4gICAqL1xuICByZWFkb25seSBhbGxvd1RyYWlsaW5nQ29tbWFzPzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhbiBvYmplY3Qgb2YgdHlwZSAnSnNvblBhcnNlckNvbmZpZ3VyYXRpb24nIHRvIEpTT04gcmVwcmVzZW50YXRpb24uXG4gKiBAaW50ZXJuYWxcbiAqL1xuLyogZXNsaW50LWRpc2FibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvSnNvbl9Kc29uUGFyc2VyQ29uZmlndXJhdGlvbihvYmo6IEpzb25QYXJzZXJDb25maWd1cmF0aW9uIHwgdW5kZWZpbmVkKTogUmVjb3JkPHN0cmluZywgYW55PiB8IHVuZGVmaW5lZCB7XG4gIGlmIChvYmogPT09IHVuZGVmaW5lZCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9XG4gIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAnYWxsb3dDb21tZW50cyc6IG9iai5hbGxvd0NvbW1lbnRzLFxuICAgICdhbGxvd1RyYWlsaW5nQ29tbWFzJzogb2JqLmFsbG93VHJhaWxpbmdDb21tYXMsXG4gIH07XG4gIC8vIGZpbHRlciB1bmRlZmluZWQgdmFsdWVzXG4gIHJldHVybiBPYmplY3QuZW50cmllcyhyZXN1bHQpLnJlZHVjZSgociwgaSkgPT4gKGlbMV0gPT09IHVuZGVmaW5lZCkgPyByIDogKHsgLi4uciwgW2lbMF1dOiBpWzFdIH0pLCB7fSk7XG59XG4vKiBlc2xpbnQtZW5hYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cblxuLyoqXG4gKiBAc2NoZW1hIFJ1bGVEb21haW5zXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUnVsZURvbWFpbnMge1xuICAvKipcbiAgICogQHNjaGVtYSBSdWxlRG9tYWlucyNhc3Ryb1xuICAgKi9cbiAgcmVhZG9ubHkgYXN0cm8/OiBSdWxlRG9tYWluVmFsdWU7XG5cbiAgLyoqXG4gICAqIEBzY2hlbWEgUnVsZURvbWFpbnMjZHJpenpsZVxuICAgKi9cbiAgcmVhZG9ubHkgZHJpenpsZT86IFJ1bGVEb21haW5WYWx1ZTtcblxuICAvKipcbiAgICogQHNjaGVtYSBSdWxlRG9tYWlucyNuZXh0XG4gICAqL1xuICByZWFkb25seSBuZXh0PzogUnVsZURvbWFpblZhbHVlO1xuXG4gIC8qKlxuICAgKiBAc2NoZW1hIFJ1bGVEb21haW5zI3BsYXl3cmlnaHRcbiAgICovXG4gIHJlYWRvbmx5IHBsYXl3cmlnaHQ/OiBSdWxlRG9tYWluVmFsdWU7XG5cbiAgLyoqXG4gICAqIEBzY2hlbWEgUnVsZURvbWFpbnMjcHJvamVjdFxuICAgKi9cbiAgcmVhZG9ubHkgcHJvamVjdD86IFJ1bGVEb21haW5WYWx1ZTtcblxuICAvKipcbiAgICogQHNjaGVtYSBSdWxlRG9tYWlucyNxd2lrXG4gICAqL1xuICByZWFkb25seSBxd2lrPzogUnVsZURvbWFpblZhbHVlO1xuXG4gIC8qKlxuICAgKiBAc2NoZW1hIFJ1bGVEb21haW5zI3JlYWN0XG4gICAqL1xuICByZWFkb25seSByZWFjdD86IFJ1bGVEb21haW5WYWx1ZTtcblxuICAvKipcbiAgICogQHNjaGVtYSBSdWxlRG9tYWlucyNyZWFjdE5hdGl2ZVxuICAgKi9cbiAgcmVhZG9ubHkgcmVhY3ROYXRpdmU/OiBSdWxlRG9tYWluVmFsdWU7XG5cbiAgLyoqXG4gICAqIEBzY2hlbWEgUnVsZURvbWFpbnMjc29saWRcbiAgICovXG4gIHJlYWRvbmx5IHNvbGlkPzogUnVsZURvbWFpblZhbHVlO1xuXG4gIC8qKlxuICAgKiBAc2NoZW1hIFJ1bGVEb21haW5zI3N2ZWx0ZVxuICAgKi9cbiAgcmVhZG9ubHkgc3ZlbHRlPzogUnVsZURvbWFpblZhbHVlO1xuXG4gIC8qKlxuICAgKiBAc2NoZW1hIFJ1bGVEb21haW5zI3RhaWx3aW5kXG4gICAqL1xuICByZWFkb25seSB0YWlsd2luZD86IFJ1bGVEb21haW5WYWx1ZTtcblxuICAvKipcbiAgICogQHNjaGVtYSBSdWxlRG9tYWlucyN0ZXN0XG4gICAqL1xuICByZWFkb25seSB0ZXN0PzogUnVsZURvbWFpblZhbHVlO1xuXG4gIC8qKlxuICAgKiBAc2NoZW1hIFJ1bGVEb21haW5zI3R1cmJvcmVwb1xuICAgKi9cbiAgcmVhZG9ubHkgdHVyYm9yZXBvPzogUnVsZURvbWFpblZhbHVlO1xuXG4gIC8qKlxuICAgKiBAc2NoZW1hIFJ1bGVEb21haW5zI3R5cGVzXG4gICAqL1xuICByZWFkb25seSB0eXBlcz86IFJ1bGVEb21haW5WYWx1ZTtcblxuICAvKipcbiAgICogQHNjaGVtYSBSdWxlRG9tYWlucyN2dWVcbiAgICovXG4gIHJlYWRvbmx5IHZ1ZT86IFJ1bGVEb21haW5WYWx1ZTtcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhbiBvYmplY3Qgb2YgdHlwZSAnUnVsZURvbWFpbnMnIHRvIEpTT04gcmVwcmVzZW50YXRpb24uXG4gKiBAaW50ZXJuYWxcbiAqL1xuLyogZXNsaW50LWRpc2FibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvSnNvbl9SdWxlRG9tYWlucyhvYmo6IFJ1bGVEb21haW5zIHwgdW5kZWZpbmVkKTogUmVjb3JkPHN0cmluZywgYW55PiB8IHVuZGVmaW5lZCB7XG4gIGlmIChvYmogPT09IHVuZGVmaW5lZCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9XG4gIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAnYXN0cm8nOiBvYmouYXN0cm8sXG4gICAgJ2RyaXp6bGUnOiBvYmouZHJpenpsZSxcbiAgICAnbmV4dCc6IG9iai5uZXh0LFxuICAgICdwbGF5d3JpZ2h0Jzogb2JqLnBsYXl3cmlnaHQsXG4gICAgJ3Byb2plY3QnOiBvYmoucHJvamVjdCxcbiAgICAncXdpayc6IG9iai5xd2lrLFxuICAgICdyZWFjdCc6IG9iai5yZWFjdCxcbiAgICAncmVhY3ROYXRpdmUnOiBvYmoucmVhY3ROYXRpdmUsXG4gICAgJ3NvbGlkJzogb2JqLnNvbGlkLFxuICAgICdzdmVsdGUnOiBvYmouc3ZlbHRlLFxuICAgICd0YWlsd2luZCc6IG9iai50YWlsd2luZCxcbiAgICAndGVzdCc6IG9iai50ZXN0LFxuICAgICd0dXJib3JlcG8nOiBvYmoudHVyYm9yZXBvLFxuICAgICd0eXBlcyc6IG9iai50eXBlcyxcbiAgICAndnVlJzogb2JqLnZ1ZSxcbiAgfTtcbiAgLy8gZmlsdGVyIHVuZGVmaW5lZCB2YWx1ZXNcbiAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKHJlc3VsdCkucmVkdWNlKChyLCBpKSA9PiAoaVsxXSA9PT0gdW5kZWZpbmVkKSA/IHIgOiAoeyAuLi5yLCBbaVswXV06IGlbMV0gfSksIHt9KTtcbn1cbi8qIGVzbGludC1lbmFibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuXG4vKipcbiAqIEBzY2hlbWEgUnVsZXNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBSdWxlcyB7XG4gIC8qKlxuICAgKiBAc2NoZW1hIFJ1bGVzI2ExMXlcbiAgICovXG4gIHJlYWRvbmx5IGExMVk/OiBhbnk7XG5cbiAgLyoqXG4gICAqIEBzY2hlbWEgUnVsZXMjY29tcGxleGl0eVxuICAgKi9cbiAgcmVhZG9ubHkgY29tcGxleGl0eT86IGFueTtcblxuICAvKipcbiAgICogQHNjaGVtYSBSdWxlcyNjb3JyZWN0bmVzc1xuICAgKi9cbiAgcmVhZG9ubHkgY29ycmVjdG5lc3M/OiBhbnk7XG5cbiAgLyoqXG4gICAqIEBzY2hlbWEgUnVsZXMjbnVyc2VyeVxuICAgKi9cbiAgcmVhZG9ubHkgbnVyc2VyeT86IGFueTtcblxuICAvKipcbiAgICogQHNjaGVtYSBSdWxlcyNwZXJmb3JtYW5jZVxuICAgKi9cbiAgcmVhZG9ubHkgcGVyZm9ybWFuY2U/OiBhbnk7XG5cbiAgLyoqXG4gICAqIFNlbGVjdHMgdGhlIGJhc2VsaW5lIHNldCBvZiBsaW50IHJ1bGVzLiBgcmVjb21tZW5kZWRgIGVuYWJsZXMgQmlvbWUncyByZWNvbW1lbmRlZFxuICAgKiBub24tbnVyc2VyeSBydWxlcywgYGFsbGAgZW5hYmxlcyBhbGwgbm9uLW51cnNlcnkgcnVsZXMsIGFuZCBgbm9uZWAgc3RhcnRzIHdpdGggbm9cbiAgICogcnVsZXMgZW5hYmxlZC4gR3JvdXAtbGV2ZWwgc2V0dGluZ3MgYW5kIGV4cGxpY2l0IHJ1bGUgc2V0dGluZ3Mgb3ZlcnJpZGUgdGhpc1xuICAgKiBwcmVzZXQuIERlZmF1bHRzIHRvIGByZWNvbW1lbmRlZGAuXG4gICAqXG4gICAqIEBkZWZhdWx0IHJlY29tbWVuZGVkYC5cbiAgICogQHNjaGVtYSBSdWxlcyNwcmVzZXRcbiAgICovXG4gIHJlYWRvbmx5IHByZXNldD86IFByZXNldENvbmZpZztcblxuICAvKipcbiAgICogRW5hYmxlcyBvciBkaXNhYmxlcyBCaW9tZSdzIHJlY29tbWVuZGVkIG5vbi1udXJzZXJ5IHJ1bGVzLiBEZWZhdWx0cyB0byBgdHJ1ZWAuXG4gICAqXG4gICAqICoqRGVwcmVjYXRlZDoqKiBUaGlzIG9wdGlvbiB3aWxsIGJlIHJlbW92ZWQgaW4gdGhlIG5leHQgbWFqb3IgdmVyc2lvbi4gVXNlXG4gICAqIGBsaW50ZXIucnVsZXMucHJlc2V0YCBpbnN0ZWFkLCBvciBydW4gYGJpb21lIG1pZ3JhdGVgIHRvIHVwZGF0ZSB0aGUgY29uZmlndXJhdGlvbi5cbiAgICpcbiAgICogQGRlZmF1bHQgdHJ1ZWAuXG4gICAqIEBzY2hlbWEgUnVsZXMjcmVjb21tZW5kZWRcbiAgICovXG4gIHJlYWRvbmx5IHJlY29tbWVuZGVkPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogQHNjaGVtYSBSdWxlcyNzZWN1cml0eVxuICAgKi9cbiAgcmVhZG9ubHkgc2VjdXJpdHk/OiBhbnk7XG5cbiAgLyoqXG4gICAqIEBzY2hlbWEgUnVsZXMjc3R5bGVcbiAgICovXG4gIHJlYWRvbmx5IHN0eWxlPzogYW55O1xuXG4gIC8qKlxuICAgKiBAc2NoZW1hIFJ1bGVzI3N1c3BpY2lvdXNcbiAgICovXG4gIHJlYWRvbmx5IHN1c3BpY2lvdXM/OiBhbnk7XG59XG5cbi8qKlxuICogQ29udmVydHMgYW4gb2JqZWN0IG9mIHR5cGUgJ1J1bGVzJyB0byBKU09OIHJlcHJlc2VudGF0aW9uLlxuICogQGludGVybmFsXG4gKi9cbi8qIGVzbGludC1kaXNhYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0pzb25fUnVsZXMob2JqOiBSdWxlcyB8IHVuZGVmaW5lZCk6IFJlY29yZDxzdHJpbmcsIGFueT4gfCB1bmRlZmluZWQge1xuICBpZiAob2JqID09PSB1bmRlZmluZWQpIHsgcmV0dXJuIHVuZGVmaW5lZDsgfVxuICBjb25zdCByZXN1bHQgPSB7XG4gICAgJ2ExMXknOiBvYmouYTExWSxcbiAgICAnY29tcGxleGl0eSc6IG9iai5jb21wbGV4aXR5LFxuICAgICdjb3JyZWN0bmVzcyc6IG9iai5jb3JyZWN0bmVzcyxcbiAgICAnbnVyc2VyeSc6IG9iai5udXJzZXJ5LFxuICAgICdwZXJmb3JtYW5jZSc6IG9iai5wZXJmb3JtYW5jZSxcbiAgICAncHJlc2V0Jzogb2JqLnByZXNldCxcbiAgICAncmVjb21tZW5kZWQnOiBvYmoucmVjb21tZW5kZWQsXG4gICAgJ3NlY3VyaXR5Jzogb2JqLnNlY3VyaXR5LFxuICAgICdzdHlsZSc6IG9iai5zdHlsZSxcbiAgICAnc3VzcGljaW91cyc6IG9iai5zdXNwaWNpb3VzLFxuICB9O1xuICAvLyBmaWx0ZXIgdW5kZWZpbmVkIHZhbHVlc1xuICByZXR1cm4gT2JqZWN0LmVudHJpZXMocmVzdWx0KS5yZWR1Y2UoKHIsIGkpID0+IChpWzFdID09PSB1bmRlZmluZWQpID8gciA6ICh7IC4uLnIsIFtpWzBdXTogaVsxXSB9KSwge30pO1xufVxuLyogZXNsaW50LWVuYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5cbi8qKlxuICogT3B0aW9ucyB0aGF0IGNoYW5nZSBob3cgdGhlIE1hcmtkb3duIGZvcm1hdHRlciBiZWhhdmVzXG4gKlxuICogQHNjaGVtYSBNYXJrZG93bkZvcm1hdHRlckNvbmZpZ3VyYXRpb25cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBNYXJrZG93bkZvcm1hdHRlckNvbmZpZ3VyYXRpb24ge1xuICAvKipcbiAgICogQ29udHJvbCB0aGUgZm9ybWF0dGVyIGZvciBNYXJrZG93biAoYW5kIGl0cyBzdXBlciBsYW5ndWFnZXMpIGZpbGVzLlxuICAgKlxuICAgKiBAc2NoZW1hIE1hcmtkb3duRm9ybWF0dGVyQ29uZmlndXJhdGlvbiNlbmFibGVkXG4gICAqL1xuICByZWFkb25seSBlbmFibGVkPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogRm9ybWF0cyB0aGUgY29kZSBpbnNpZGUgZmVuY2VkIGNvZGUgYmxvY2tzLCBmcm9udG1hdHRlciwgYW5kIEhUTUwgYmxvY2tzIHdpdGggdGhlIGZvcm1hdHRlclxuICAgKiBvZiB0aGUgY29kZSdzIGxhbmd1YWdlLiBEZWZhdWx0cyB0byBgdHJ1ZWAuXG4gICAqXG4gICAqIEEgYmxvY2sgd2l0aCBhIHN5bnRheCBlcnJvciBzdGF5cyBhcyB3cml0dGVuLCBhbmQgQmlvbWUgc3RpbGwgZm9ybWF0cyB0aGUgcmVzdCBvZiB0aGUgZmlsZS5cbiAgICpcbiAgICogV2hlbiB0aGlzIG9wdGlvbiBpcyBgZmFsc2VgLCBCaW9tZSBrZWVwcyBldmVyeSBibG9jayBhcyB3cml0dGVuLlxuICAgKlxuICAgKiBAZGVmYXVsdCB0cnVlYC5cbiAgICogQHNjaGVtYSBNYXJrZG93bkZvcm1hdHRlckNvbmZpZ3VyYXRpb24jZm9ybWF0RW1iZWRzXG4gICAqL1xuICByZWFkb25seSBmb3JtYXRFbWJlZHM/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBUaGUgaW5kZW50IHN0eWxlIGFwcGxpZWQgdG8gTWFya2Rvd24gZmlsZXMuXG4gICAqXG4gICAqIEBzY2hlbWEgTWFya2Rvd25Gb3JtYXR0ZXJDb25maWd1cmF0aW9uI2luZGVudFN0eWxlXG4gICAqL1xuICByZWFkb25seSBpbmRlbnRTdHlsZT86IEluZGVudFN0eWxlO1xuXG4gIC8qKlxuICAgKiBUaGUgc2l6ZSBvZiB0aGUgaW5kZW50YXRpb24gYXBwbGllZCB0byBNYXJrZG93biBmaWxlcy4gRGVmYXVsdHMgdG8gMi5cbiAgICpcbiAgICogQGRlZmF1bHQgMi5cbiAgICogQHNjaGVtYSBNYXJrZG93bkZvcm1hdHRlckNvbmZpZ3VyYXRpb24jaW5kZW50V2lkdGhcbiAgICovXG4gIHJlYWRvbmx5IGluZGVudFdpZHRoPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBUaGUgdHlwZSBvZiBsaW5lIGVuZGluZyBhcHBsaWVkIHRvIE1hcmtkb3duIChhbmQgaXRzIHN1cGVyIGxhbmd1YWdlcykgZmlsZXMuIGBhdXRvYCB1c2VzIENSTEYgb24gV2luZG93cyBhbmQgTEYgb24gb3RoZXIgcGxhdGZvcm1zLlxuICAgKlxuICAgKiBAc2NoZW1hIE1hcmtkb3duRm9ybWF0dGVyQ29uZmlndXJhdGlvbiNsaW5lRW5kaW5nXG4gICAqL1xuICByZWFkb25seSBsaW5lRW5kaW5nPzogTGluZUVuZGluZztcblxuICAvKipcbiAgICogV2hhdCdzIHRoZSBtYXggd2lkdGggb2YgYSBsaW5lIGFwcGxpZWQgdG8gTWFya2Rvd24gZmlsZXMuIERlZmF1bHRzIHRvIDgwLlxuICAgKlxuICAgKiBAZGVmYXVsdCA4MC5cbiAgICogQHNjaGVtYSBNYXJrZG93bkZvcm1hdHRlckNvbmZpZ3VyYXRpb24jbGluZVdpZHRoXG4gICAqL1xuICByZWFkb25seSBsaW5lV2lkdGg/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIENvbnRyb2xzIHdoZXRoZXIgQmlvbWUga2VlcHMsIGFkZHMsIG9yIHJlbW92ZXMgbGluZSBicmVha3MgaW4gTWFya2Rvd24gcGFyYWdyYXBocy5cbiAgICpcbiAgICogTWFudWFsIGxpbmUgYnJlYWtzIGFyZSBhbHdheXMga2VwdC4gSW4gTWFya2Rvd24sIGEgbWFudWFsIGxpbmUgYnJlYWsgaXMgY3JlYXRlZCBieSBlbmRpbmcgYVxuICAgKiBsaW5lIHdpdGggdHdvIHNwYWNlcyBvciBhIGJhY2tzbGFzaC5cbiAgICpcbiAgICogQHNjaGVtYSBNYXJrZG93bkZvcm1hdHRlckNvbmZpZ3VyYXRpb24jcHJvc2VXcmFwXG4gICAqL1xuICByZWFkb25seSBwcm9zZVdyYXA/OiBQcm9zZVdyYXA7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gYWRkIGEgdHJhaWxpbmcgbmV3bGluZSBhdCB0aGUgZW5kIG9mIHRoZSBmaWxlLlxuICAgKlxuICAgKiBTZXR0aW5nIHRoaXMgb3B0aW9uIHRvIGBmYWxzZWAgaXMgKipoaWdobHkgZGlzY291cmFnZWQqKiBiZWNhdXNlIGl0IGNvdWxkIGNhdXNlIG1hbnkgcHJvYmxlbXMgd2l0aCBvdGhlciB0b29sczpcbiAgICogLSBodHRwczovL3Rob3VnaHRib3QuY29tL2Jsb2cvbm8tbmV3bGluZS1hdC1lbmQtb2YtZmlsZVxuICAgKiAtIGh0dHBzOi8vY2FsbG1lcnlhbi5tZWRpdW0uY29tL25vLW5ld2xpbmUtYXQtZW5kLW9mLWZpbGUtbmF2aWdhdGluZy1naXRzLXdhcm5pbmctZm9yLWFuZHJvaWQtZGV2ZWxvcGVycy1hZjE0ZTczZGQ4MDRcbiAgICogLSBodHRwczovL3VuaXguc3RhY2tleGNoYW5nZS5jb20vcXVlc3Rpb25zLzM0NTU0OC9ob3ctdG8tY2F0LWZpbGVzLXRvZ2V0aGVyLWFkZGluZy1taXNzaW5nLW5ld2xpbmVzLWF0LWVuZC1vZi1zb21lLWZpbGVzXG4gICAqXG4gICAqIERpc2FibGUgdGhlIG9wdGlvbiBhdCB5b3VyIG93biByaXNrLlxuICAgKlxuICAgKiBEZWZhdWx0cyB0byB0cnVlLlxuICAgKlxuICAgKiBAZGVmYXVsdCB0cnVlLlxuICAgKiBAc2NoZW1hIE1hcmtkb3duRm9ybWF0dGVyQ29uZmlndXJhdGlvbiN0cmFpbGluZ05ld2xpbmVcbiAgICovXG4gIHJlYWRvbmx5IHRyYWlsaW5nTmV3bGluZT86IGJvb2xlYW47XG59XG5cbi8qKlxuICogQ29udmVydHMgYW4gb2JqZWN0IG9mIHR5cGUgJ01hcmtkb3duRm9ybWF0dGVyQ29uZmlndXJhdGlvbicgdG8gSlNPTiByZXByZXNlbnRhdGlvbi5cbiAqIEBpbnRlcm5hbFxuICovXG4vKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5leHBvcnQgZnVuY3Rpb24gdG9Kc29uX01hcmtkb3duRm9ybWF0dGVyQ29uZmlndXJhdGlvbihvYmo6IE1hcmtkb3duRm9ybWF0dGVyQ29uZmlndXJhdGlvbiB8IHVuZGVmaW5lZCk6IFJlY29yZDxzdHJpbmcsIGFueT4gfCB1bmRlZmluZWQge1xuICBpZiAob2JqID09PSB1bmRlZmluZWQpIHsgcmV0dXJuIHVuZGVmaW5lZDsgfVxuICBjb25zdCByZXN1bHQgPSB7XG4gICAgJ2VuYWJsZWQnOiBvYmouZW5hYmxlZCxcbiAgICAnZm9ybWF0RW1iZWRzJzogb2JqLmZvcm1hdEVtYmVkcyxcbiAgICAnaW5kZW50U3R5bGUnOiBvYmouaW5kZW50U3R5bGUsXG4gICAgJ2luZGVudFdpZHRoJzogb2JqLmluZGVudFdpZHRoLFxuICAgICdsaW5lRW5kaW5nJzogb2JqLmxpbmVFbmRpbmcsXG4gICAgJ2xpbmVXaWR0aCc6IG9iai5saW5lV2lkdGgsXG4gICAgJ3Byb3NlV3JhcCc6IG9iai5wcm9zZVdyYXAsXG4gICAgJ3RyYWlsaW5nTmV3bGluZSc6IG9iai50cmFpbGluZ05ld2xpbmUsXG4gIH07XG4gIC8vIGZpbHRlciB1bmRlZmluZWQgdmFsdWVzXG4gIHJldHVybiBPYmplY3QuZW50cmllcyhyZXN1bHQpLnJlZHVjZSgociwgaSkgPT4gKGlbMV0gPT09IHVuZGVmaW5lZCkgPyByIDogKHsgLi4uciwgW2lbMF1dOiBpWzFdIH0pLCB7fSk7XG59XG4vKiBlc2xpbnQtZW5hYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cblxuLyoqXG4gKiBPcHRpb25zIHRoYXQgY2hhbmdlIGhvdyB0aGUgTWFya2Rvd24gbGludGVyIGJlaGF2ZXNcbiAqXG4gKiBAc2NoZW1hIE1hcmtkb3duTGludGVyQ29uZmlndXJhdGlvblxuICovXG5leHBvcnQgaW50ZXJmYWNlIE1hcmtkb3duTGludGVyQ29uZmlndXJhdGlvbiB7XG4gIC8qKlxuICAgKiBDb250cm9sIHRoZSBsaW50ZXIgZm9yIE1hcmtkb3duIGZpbGVzLlxuICAgKlxuICAgKiBAc2NoZW1hIE1hcmtkb3duTGludGVyQ29uZmlndXJhdGlvbiNlbmFibGVkXG4gICAqL1xuICByZWFkb25seSBlbmFibGVkPzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhbiBvYmplY3Qgb2YgdHlwZSAnTWFya2Rvd25MaW50ZXJDb25maWd1cmF0aW9uJyB0byBKU09OIHJlcHJlc2VudGF0aW9uLlxuICogQGludGVybmFsXG4gKi9cbi8qIGVzbGludC1kaXNhYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0pzb25fTWFya2Rvd25MaW50ZXJDb25maWd1cmF0aW9uKG9iajogTWFya2Rvd25MaW50ZXJDb25maWd1cmF0aW9uIHwgdW5kZWZpbmVkKTogUmVjb3JkPHN0cmluZywgYW55PiB8IHVuZGVmaW5lZCB7XG4gIGlmIChvYmogPT09IHVuZGVmaW5lZCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9XG4gIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAnZW5hYmxlZCc6IG9iai5lbmFibGVkLFxuICB9O1xuICAvLyBmaWx0ZXIgdW5kZWZpbmVkIHZhbHVlc1xuICByZXR1cm4gT2JqZWN0LmVudHJpZXMocmVzdWx0KS5yZWR1Y2UoKHIsIGkpID0+IChpWzFdID09PSB1bmRlZmluZWQpID8gciA6ICh7IC4uLnIsIFtpWzBdXTogaVsxXSB9KSwge30pO1xufVxuLyogZXNsaW50LWVuYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5cbi8qKlxuICogT3B0aW9ucyB0aGF0IGNoYW5nZSBob3cgdGhlIE1hcmtkb3duIHBhcnNlciBiZWhhdmVzXG4gKlxuICogQHNjaGVtYSBNYXJrZG93blBhcnNlckNvbmZpZ3VyYXRpb25cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBNYXJrZG93blBhcnNlckNvbmZpZ3VyYXRpb24ge1xuICAvKipcbiAgICogUmVjb2duaXplcyBib2xkLCBpdGFsaWMsIGFuZCBzdHJpa2V0aHJvdWdoIG1hcmtlcnMgcGxhY2VkIGRpcmVjdGx5IG5leHQgdG8gQ2hpbmVzZSwgSmFwYW5lc2UsIG9yIEtvcmVhbiB0ZXh0LiBEZWZhdWx0cyB0byBgZmFsc2VgLlxuICAgKlxuICAgKiBTdGFuZGFyZCBNYXJrZG93biBkb2Vzbid0IHRyZWF0IGAqKuODhuOCueODiOOAgioq44OG44K544OIYCBhcyBib2xkIHRleHQsIGJlY2F1c2UgdGhlIGNsb3NpbmcgYCoqYFxuICAgKiBpcyBiZXR3ZWVuIGEgcHVuY3R1YXRpb24gbWFyayBhbmQgYSBsZXR0ZXIgd2l0aCBubyBzcGFjZSBhcm91bmQgaXQuIExhbmd1YWdlcyB0aGF0IGRvbid0XG4gICAqIHB1dCBzcGFjZXMgYmV0d2VlbiB3b3JkcyBydW4gaW50byB0aGlzIG9mdGVuLiBXaGVuIGVuYWJsZWQsIEJpb21lIGZvbGxvd3MgdGhlXG4gICAqIFtDb21tb25NYXJrIENKSy1mcmllbmRseSBhbWVuZG1lbnRzXShodHRwczovL2dpdGh1Yi5jb20vdGF0cy11L21hcmtkb3duLWNqay1mcmllbmRseS9ibG9iL21haW4vc3BlY2lmaWNhdGlvbi5tZClcbiAgICogYW5kIHRyZWF0cyBzdWNoIHRleHQgYXMgYm9sZCBvciBpdGFsaWMuIFRoZSBvcHRpb24gYXBwbGllcyB0byBgKmAsIGBfYCwgYW5kIGB+fmAgbWFya2Vycy5cbiAgICogQWZ0ZXIgYSB2YXJpYXRpb24gc2VsZWN0b3IgKGFuIGludmlzaWJsZSBjaGFyYWN0ZXIgdGhhdCBwaWNrcyBhIGdseXBoIHN0eWxlIGZvciB0aGVcbiAgICogY2hhcmFjdGVyIGJlZm9yZSBpdCksIEJpb21lIGNsYXNzaWZpZXMgYSBtYXJrZXIgYnkgdGhlIGNoYXJhY3RlciBiZWZvcmUgdGhlIHNlbGVjdG9yLlxuICAgKlxuICAgKiBUaGUgb3B0aW9uIGNhbiBhbHNvIGNoYW5nZSBtYXJrZXJzIHRoYXQgYXJlbid0IG5leHQgdG8gQ2hpbmVzZSwgSmFwYW5lc2UsIG9yIEtvcmVhbiB0ZXh0LFxuICAgKiBiZWNhdXNlIGEgbWFya2VyIHRoYXQgY2FuIG5vdyBvcGVuIG9yIGNsb3NlIGZvcm1hdHRpbmcgY2FuIHRha2UgYW5vdGhlciBtYXJrZXIncyBwYXJ0bmVyXG4gICAqIGluIHRoZSBzYW1lIHBhcmFncmFwaCwgaGVhZGluZywgb3IgdGFibGUgY2VsbC4gRm9yIGV4YW1wbGUsIHN0YW5kYXJkIE1hcmtkb3duIHNob3dzXG4gICAqIGAqKuODhuOCueODiOOAgioq44OG44K544OIIGEqKmAgd2l0aCBg44OG44K544OIIGFgIGluIGJvbGQuIFdpdGggdGhlIG9wdGlvbiBlbmFibGVkLCBg44OG44K544OI44CCYCBpcyBib2xkXG4gICAqIGFuZCB0aGUgbGFzdCBgKipgIGlzIHNob3duIGFzIHdyaXR0ZW4uXG4gICAqXG4gICAqIFRoZSBmb3JtYXR0ZXIgYW5kIHRoZSBsaW50ZXIgYm90aCB1c2UgdGhpcyByZWFkaW5nIG9mIHRoZSBkb2N1bWVudC4gRW5hYmxlIHRoZSBvcHRpb24gb25seVxuICAgKiB3aGVuIHRoZSB0b29sIHRoYXQgcmVuZGVycyB5b3VyIE1hcmtkb3duIGFsc28gc3VwcG9ydHMgdGhlc2UgYW1lbmRtZW50cy4gT3RoZXJ3aXNlLCBCaW9tZVxuICAgKiB0cmVhdHMgYXMgYm9sZCBzb21lIHRleHQgdGhhdCB5b3VyIHJlbmRlcmVyIHNob3dzIHdpdGggbGl0ZXJhbCBgKipgLCBhbmQgZm9ybWF0dGluZyBjYW5cbiAgICogY2hhbmdlIHdoYXQgeW91ciByZW5kZXJlciBzaG93cy4gRm9yIGV4YW1wbGUsIHRoZSBvcHRpb24gbWFrZXMgYF9fYCBhZnRlciBhIHZhcmlhdGlvblxuICAgKiBzZWxlY3RvciBhIGJvbGQgbWFya2VyLCBhbmQgdGhlIGZvcm1hdHRlciByZXdyaXRlcyBpdCBhcyBgKipgLCB3aGljaCBzdGFuZGFyZCBNYXJrZG93blxuICAgKiBzaG93cyBhcyBib2xkIGV2ZW4gd2hlcmUgaXQgc2hvd2VkIHRoZSBvcmlnaW5hbCBgX19gIGFzIHdyaXR0ZW4uXG4gICAqXG4gICAqIEBkZWZhdWx0IGZhbHNlYC5cbiAgICogQHNjaGVtYSBNYXJrZG93blBhcnNlckNvbmZpZ3VyYXRpb24jY2prRnJpZW5kbHlFbXBoYXNpc1xuICAgKi9cbiAgcmVhZG9ubHkgY2prRnJpZW5kbHlFbXBoYXNpcz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEVuYWJsZXMgcGFyc2luZyBmcm9udG1hdHRlciBhdCB0aGUgc3RhcnQgb2YgdGhlIGZpbGUuIERlZmF1bHRzIHRvIGBmYWxzZWAuXG4gICAqXG4gICAqIEBkZWZhdWx0IGZhbHNlYC5cbiAgICogQHNjaGVtYSBNYXJrZG93blBhcnNlckNvbmZpZ3VyYXRpb24jZnJvbnRtYXR0ZXJcbiAgICovXG4gIHJlYWRvbmx5IGZyb250bWF0dGVyPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogRW5hYmxlcyBHaXRIdWIgRmxhdm9yZWQgTWFya2Rvd24gZXh0ZW5zaW9ucy4gRGVmYXVsdHMgdG8gYHRydWVgLlxuICAgKlxuICAgKiBAZGVmYXVsdCB0cnVlYC5cbiAgICogQHNjaGVtYSBNYXJrZG93blBhcnNlckNvbmZpZ3VyYXRpb24jZ2ZtXG4gICAqL1xuICByZWFkb25seSBnZm0/OiBib29sZWFuO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGFuIG9iamVjdCBvZiB0eXBlICdNYXJrZG93blBhcnNlckNvbmZpZ3VyYXRpb24nIHRvIEpTT04gcmVwcmVzZW50YXRpb24uXG4gKiBAaW50ZXJuYWxcbiAqL1xuLyogZXNsaW50LWRpc2FibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvSnNvbl9NYXJrZG93blBhcnNlckNvbmZpZ3VyYXRpb24ob2JqOiBNYXJrZG93blBhcnNlckNvbmZpZ3VyYXRpb24gfCB1bmRlZmluZWQpOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgdW5kZWZpbmVkIHtcbiAgaWYgKG9iaiA9PT0gdW5kZWZpbmVkKSB7IHJldHVybiB1bmRlZmluZWQ7IH1cbiAgY29uc3QgcmVzdWx0ID0ge1xuICAgICdjamtGcmllbmRseUVtcGhhc2lzJzogb2JqLmNqa0ZyaWVuZGx5RW1waGFzaXMsXG4gICAgJ2Zyb250bWF0dGVyJzogb2JqLmZyb250bWF0dGVyLFxuICAgICdnZm0nOiBvYmouZ2ZtLFxuICB9O1xuICAvLyBmaWx0ZXIgdW5kZWZpbmVkIHZhbHVlc1xuICByZXR1cm4gT2JqZWN0LmVudHJpZXMocmVzdWx0KS5yZWR1Y2UoKHIsIGkpID0+IChpWzFdID09PSB1bmRlZmluZWQpID8gciA6ICh7IC4uLnIsIFtpWzBdXTogaVsxXSB9KSwge30pO1xufVxuLyogZXNsaW50LWVuYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5cbi8qKlxuICogQHNjaGVtYSBPdmVycmlkZUFzc2lzdENvbmZpZ3VyYXRpb25cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBPdmVycmlkZUFzc2lzdENvbmZpZ3VyYXRpb24ge1xuICAvKipcbiAgICogVGhlIGFzc2lzdC1hY3Rpb24gY29uZmlndXJhdGlvbiBmb3IgbWF0Y2hlZCBmaWxlcy5cbiAgICpcbiAgICogQHNjaGVtYSBPdmVycmlkZUFzc2lzdENvbmZpZ3VyYXRpb24jYWN0aW9uc1xuICAgKi9cbiAgcmVhZG9ubHkgYWN0aW9ucz86IEFjdGlvbnM7XG5cbiAgLyoqXG4gICAqIEVuYWJsZXMgb3IgZGlzYWJsZXMgYXNzaXN0IGFjdGlvbnMgZm9yIG1hdGNoZWQgZmlsZXMuXG4gICAqXG4gICAqIEBzY2hlbWEgT3ZlcnJpZGVBc3Npc3RDb25maWd1cmF0aW9uI2VuYWJsZWRcbiAgICovXG4gIHJlYWRvbmx5IGVuYWJsZWQ/OiBib29sZWFuO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGFuIG9iamVjdCBvZiB0eXBlICdPdmVycmlkZUFzc2lzdENvbmZpZ3VyYXRpb24nIHRvIEpTT04gcmVwcmVzZW50YXRpb24uXG4gKiBAaW50ZXJuYWxcbiAqL1xuLyogZXNsaW50LWRpc2FibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvSnNvbl9PdmVycmlkZUFzc2lzdENvbmZpZ3VyYXRpb24ob2JqOiBPdmVycmlkZUFzc2lzdENvbmZpZ3VyYXRpb24gfCB1bmRlZmluZWQpOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgdW5kZWZpbmVkIHtcbiAgaWYgKG9iaiA9PT0gdW5kZWZpbmVkKSB7IHJldHVybiB1bmRlZmluZWQ7IH1cbiAgY29uc3QgcmVzdWx0ID0ge1xuICAgICdhY3Rpb25zJzogdG9Kc29uX0FjdGlvbnMob2JqLmFjdGlvbnMpLFxuICAgICdlbmFibGVkJzogb2JqLmVuYWJsZWQsXG4gIH07XG4gIC8vIGZpbHRlciB1bmRlZmluZWQgdmFsdWVzXG4gIHJldHVybiBPYmplY3QuZW50cmllcyhyZXN1bHQpLnJlZHVjZSgociwgaSkgPT4gKGlbMV0gPT09IHVuZGVmaW5lZCkgPyByIDogKHsgLi4uciwgW2lbMF1dOiBpWzFdIH0pLCB7fSk7XG59XG4vKiBlc2xpbnQtZW5hYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cblxuLyoqXG4gKiBAc2NoZW1hIE92ZXJyaWRlRmlsZXNDb25maWd1cmF0aW9uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgT3ZlcnJpZGVGaWxlc0NvbmZpZ3VyYXRpb24ge1xuICAvKipcbiAgICogVGhlIG1heGltdW0gc291cmNlLWZpbGUgc2l6ZSBpbiBieXRlcyBmb3IgbWF0Y2hlZCBmaWxlcy5cbiAgICpcbiAgICogQHNjaGVtYSBPdmVycmlkZUZpbGVzQ29uZmlndXJhdGlvbiNtYXhTaXplXG4gICAqL1xuICByZWFkb25seSBtYXhTaXplPzogbnVtYmVyO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGFuIG9iamVjdCBvZiB0eXBlICdPdmVycmlkZUZpbGVzQ29uZmlndXJhdGlvbicgdG8gSlNPTiByZXByZXNlbnRhdGlvbi5cbiAqIEBpbnRlcm5hbFxuICovXG4vKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5leHBvcnQgZnVuY3Rpb24gdG9Kc29uX092ZXJyaWRlRmlsZXNDb25maWd1cmF0aW9uKG9iajogT3ZlcnJpZGVGaWxlc0NvbmZpZ3VyYXRpb24gfCB1bmRlZmluZWQpOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgdW5kZWZpbmVkIHtcbiAgaWYgKG9iaiA9PT0gdW5kZWZpbmVkKSB7IHJldHVybiB1bmRlZmluZWQ7IH1cbiAgY29uc3QgcmVzdWx0ID0ge1xuICAgICdtYXhTaXplJzogb2JqLm1heFNpemUsXG4gIH07XG4gIC8vIGZpbHRlciB1bmRlZmluZWQgdmFsdWVzXG4gIHJldHVybiBPYmplY3QuZW50cmllcyhyZXN1bHQpLnJlZHVjZSgociwgaSkgPT4gKGlbMV0gPT09IHVuZGVmaW5lZCkgPyByIDogKHsgLi4uciwgW2lbMF1dOiBpWzFdIH0pLCB7fSk7XG59XG4vKiBlc2xpbnQtZW5hYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cblxuLyoqXG4gKiBAc2NoZW1hIE92ZXJyaWRlRm9ybWF0dGVyQ29uZmlndXJhdGlvblxuICovXG5leHBvcnQgaW50ZXJmYWNlIE92ZXJyaWRlRm9ybWF0dGVyQ29uZmlndXJhdGlvbiB7XG4gIC8qKlxuICAgKiBUaGUgYXR0cmlidXRlIHBvc2l0aW9uIHN0eWxlIGluIEhUTUwtbGlrZSBsYW5ndWFnZXMuXG4gICAqXG4gICAqIEBzY2hlbWEgT3ZlcnJpZGVGb3JtYXR0ZXJDb25maWd1cmF0aW9uI2F0dHJpYnV0ZVBvc2l0aW9uXG4gICAqL1xuICByZWFkb25seSBhdHRyaWJ1dGVQb3NpdGlvbj86IEF0dHJpYnV0ZVBvc2l0aW9uO1xuXG4gIC8qKlxuICAgKiBDb250cm9scyB0aGUgcGxhY2VtZW50IG9mIHRoZSBjbG9zaW5nIGJyYWNrZXQgZm9yIG11bHRpbGluZSBIVE1MIGFuZCBKU1ggb3BlbmluZyB0YWdzLiBCaW9tZVxuICAgKiBwbGFjZXMgdGhlIGJyYWNrZXQgYXQgdGhlIGVuZCBvZiB0aGUgbGFzdCBhdHRyaWJ1dGUgbGluZSB3aGVuIGVuYWJsZWQgYW5kIG9uIGl0cyBvd24gbGluZSB3aGVuXG4gICAqIGRpc2FibGVkLiBUaGlzIGFsc28gYWZmZWN0cyBzZWxmLWNsb3NpbmcgSFRNTCBlbGVtZW50cywgYnV0IHNlbGYtY2xvc2luZyBKU1ggZWxlbWVudHMgYXJlXG4gICAqIHVuYWZmZWN0ZWQuXG4gICAqXG4gICAqIEBzY2hlbWEgT3ZlcnJpZGVGb3JtYXR0ZXJDb25maWd1cmF0aW9uI2JyYWNrZXRTYW1lTGluZVxuICAgKi9cbiAgcmVhZG9ubHkgYnJhY2tldFNhbWVMaW5lPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogQ29udHJvbHMgc3BhY2VzIGluc2lkZSBicmFjZXMgaW4gc3VwcG9ydGVkIHNpbmdsZS1saW5lIHN0cnVjdHVyZXMuIFRoZSBhZmZlY3RlZCBzdHJ1Y3R1cmVzXG4gICAqIHZhcnkgYnkgbGFuZ3VhZ2UuXG4gICAqXG4gICAqIEBzY2hlbWEgT3ZlcnJpZGVGb3JtYXR0ZXJDb25maWd1cmF0aW9uI2JyYWNrZXRTcGFjaW5nXG4gICAqL1xuICByZWFkb25seSBicmFja2V0U3BhY2luZz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIENvbnRyb2xzIHNwYWNlcyBpbW1lZGlhdGVseSBpbnNpZGUgc3VwcG9ydGVkIGRlbGltaXRlcnMgd2hlbiB0aGVpciBjb250ZW50IGZpdHMgb24gb25lIGxpbmUuXG4gICAqIEl0IGRvZXNuJ3QgYWRkIHNwYWNlcyBiZWZvcmUgb3BlbmluZyBkZWxpbWl0ZXJzIG9yIGluc2lkZSBlbXB0eSBkZWxpbWl0ZXJzLlxuICAgKlxuICAgKiBUaGUgYWZmZWN0ZWQgZGVsaW1pdGVycyB2YXJ5IGJ5IGxhbmd1YWdlLiBJZiB1bnNldCwgdXNlcyB0aGUgY29uZmlndXJlZCBmb3JtYXR0ZXIgc2V0dGluZy5cbiAgICpcbiAgICogQHNjaGVtYSBPdmVycmlkZUZvcm1hdHRlckNvbmZpZ3VyYXRpb24jZGVsaW1pdGVyU3BhY2luZ1xuICAgKi9cbiAgcmVhZG9ubHkgZGVsaW1pdGVyU3BhY2luZz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEVuYWJsZXMgb3IgZGlzYWJsZXMgdGhlIGZvcm1hdHRlciBmb3IgbWF0Y2hlZCBmaWxlcy5cbiAgICpcbiAgICogQHNjaGVtYSBPdmVycmlkZUZvcm1hdHRlckNvbmZpZ3VyYXRpb24jZW5hYmxlZFxuICAgKi9cbiAgcmVhZG9ubHkgZW5hYmxlZD86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIENvbnRyb2xzIHdoZXRoZXIgYXJyYXlzIGFuZCBvYmplY3RzIGFyZSBmb3JtYXR0ZWQgb24gb25lIGxpbmUgb3IgbXVsdGlwbGUgbGluZXMuXG4gICAqXG4gICAqIGBhdXRvYCBmb3JtYXRzIG9iamVjdHMgb24gbXVsdGlwbGUgbGluZXMgaWYgdGhlIGZpcnN0IHByb3BlcnR5IGhhcyBhIG5ld2xpbmUsIGFuZCBhcnJheXMgb25cbiAgICogb25lIGxpbmUgaWYgdGhleSBmaXQuXG4gICAqXG4gICAqIGBhbHdheXNgIGZvcm1hdHMgYXJyYXlzIGFuZCBvYmplY3RzIG9uIG11bHRpcGxlIGxpbmVzLlxuICAgKlxuICAgKiBgbmV2ZXJgIGZvcm1hdHMgYXJyYXlzIGFuZCBvYmplY3RzIG9uIG9uZSBsaW5lIGlmIHRoZXkgZml0LlxuICAgKlxuICAgKiBJZiB1bnNldCwgdXNlcyB0aGUgY29uZmlndXJlZCBmb3JtYXR0ZXIgc2V0dGluZy5cbiAgICpcbiAgICogV2hlbiBmb3JtYXR0aW5nIGBwYWNrYWdlLmpzb25gLCBCaW9tZSB1c2VzIGBhbHdheXNgIHVubGVzcyBjb25maWd1cmVkIG90aGVyd2lzZS5cbiAgICpcbiAgICogQHNjaGVtYSBPdmVycmlkZUZvcm1hdHRlckNvbmZpZ3VyYXRpb24jZXhwYW5kXG4gICAqL1xuICByZWFkb25seSBleHBhbmQ/OiBFeHBhbmQ7XG5cbiAgLyoqXG4gICAqIEFsbG93cyBmb3JtYXR0aW5nIG1hdGNoZWQgZmlsZXMgdGhhdCBjb250YWluIHN5bnRheCBlcnJvcnMuXG4gICAqXG4gICAqIEBzY2hlbWEgT3ZlcnJpZGVGb3JtYXR0ZXJDb25maWd1cmF0aW9uI2Zvcm1hdFdpdGhFcnJvcnNcbiAgICovXG4gIHJlYWRvbmx5IGZvcm1hdFdpdGhFcnJvcnM/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBUaGUgaW5kZW50YXRpb24gd2lkdGguIERlcHJlY2F0ZWQsIHVzZSBgaW5kZW50V2lkdGhgIGluc3RlYWQuXG4gICAqXG4gICAqIEBzY2hlbWEgT3ZlcnJpZGVGb3JtYXR0ZXJDb25maWd1cmF0aW9uI2luZGVudFNpemVcbiAgICovXG4gIHJlYWRvbmx5IGluZGVudFNpemU/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFVzZXMgdGFicyBvciBzcGFjZXMgZm9yIGluZGVudGF0aW9uLlxuICAgKlxuICAgKiBAc2NoZW1hIE92ZXJyaWRlRm9ybWF0dGVyQ29uZmlndXJhdGlvbiNpbmRlbnRTdHlsZVxuICAgKi9cbiAgcmVhZG9ubHkgaW5kZW50U3R5bGU/OiBJbmRlbnRTdHlsZTtcblxuICAvKipcbiAgICogU2V0cyB0aGUgaW5kZW50YXRpb24gd2lkdGguIFdpdGggc3BhY2UgaW5kZW50YXRpb24sIHRoaXMgaXMgdGhlIG51bWJlciBvZiBzcGFjZXMgZW1pdHRlZCBwZXJcbiAgICogaW5kZW50YXRpb24gbGV2ZWwuIFdpdGggdGFiIGluZGVudGF0aW9uLCBCaW9tZSBlbWl0cyBvbmUgdGFiIHBlciBsZXZlbCBhbmQgdXNlcyB0aGlzIHZhbHVlIGFzXG4gICAqIHRoZSB0YWIncyBkaXNwbGF5IHdpZHRoIHdoZW4gY2FsY3VsYXRpbmcgbGluZSBsZW5ndGguIEFjY2VwdGVkIHZhbHVlcyBhcmUgYDBgIHRocm91Z2ggYDI0YC5cbiAgICpcbiAgICogQHNjaGVtYSBPdmVycmlkZUZvcm1hdHRlckNvbmZpZ3VyYXRpb24jaW5kZW50V2lkdGhcbiAgICovXG4gIHJlYWRvbmx5IGluZGVudFdpZHRoPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBUaGUgbGluZSBlbmRpbmcuXG4gICAqXG4gICAqIEBzY2hlbWEgT3ZlcnJpZGVGb3JtYXR0ZXJDb25maWd1cmF0aW9uI2xpbmVFbmRpbmdcbiAgICovXG4gIHJlYWRvbmx5IGxpbmVFbmRpbmc/OiBMaW5lRW5kaW5nO1xuXG4gIC8qKlxuICAgKiBTZXRzIHRoZSBwcmVmZXJyZWQgbWF4aW11bSBsaW5lIHdpZHRoIHVzZWQgd2hlbiBkZWNpZGluZyB3aGVyZSB0byB3cmFwIGNvZGUuIFNvbWUgY29udGVudCxcbiAgICogc3VjaCBhcyBsb25nIHVuYnJlYWthYmxlIHN0cmluZ3MsIG1heSBzdGlsbCBleGNlZWQgdGhpcyB3aWR0aC4gQWNjZXB0ZWQgdmFsdWVzIGFyZSBgMWAgdGhyb3VnaFxuICAgKiBgMzIwYC5cbiAgICpcbiAgICogQHNjaGVtYSBPdmVycmlkZUZvcm1hdHRlckNvbmZpZ3VyYXRpb24jbGluZVdpZHRoXG4gICAqL1xuICByZWFkb25seSBsaW5lV2lkdGg/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFByaW50cyB0cmFpbGluZyBjb21tYXMgd2hlcmV2ZXIgcG9zc2libGUgaW4gbXVsdGlsaW5lIGNvbW1hLXNlcGFyYXRlZCBzdHJ1Y3R1cmVzLiBUaGlzIGlzIGFcbiAgICogbGVnYWN5IG92ZXJyaWRlIG9wdGlvbi4gUHJlZmVyIGBqYXZhc2NyaXB0LmZvcm1hdHRlci50cmFpbGluZ0NvbW1hc2AuXG4gICAqXG4gICAqIEBzY2hlbWEgT3ZlcnJpZGVGb3JtYXR0ZXJDb25maWd1cmF0aW9uI3RyYWlsaW5nQ29tbWFzXG4gICAqL1xuICByZWFkb25seSB0cmFpbGluZ0NvbW1hcz86IEpzVHJhaWxpbmdDb21tYXM7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gYWRkIGEgdHJhaWxpbmcgbmV3bGluZSBhdCB0aGUgZW5kIG9mIG1hdGNoZWQgZmlsZXMuIERpc2FibGluZyB0aGlzIG9wdGlvbiBjYW5cbiAgICogY2F1c2UgY29tcGF0aWJpbGl0eSBwcm9ibGVtcyB3aXRoIG90aGVyIHRvb2xzLlxuICAgKlxuICAgKiBAc2NoZW1hIE92ZXJyaWRlRm9ybWF0dGVyQ29uZmlndXJhdGlvbiN0cmFpbGluZ05ld2xpbmVcbiAgICovXG4gIHJlYWRvbmx5IHRyYWlsaW5nTmV3bGluZT86IGJvb2xlYW47XG59XG5cbi8qKlxuICogQ29udmVydHMgYW4gb2JqZWN0IG9mIHR5cGUgJ092ZXJyaWRlRm9ybWF0dGVyQ29uZmlndXJhdGlvbicgdG8gSlNPTiByZXByZXNlbnRhdGlvbi5cbiAqIEBpbnRlcm5hbFxuICovXG4vKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5leHBvcnQgZnVuY3Rpb24gdG9Kc29uX092ZXJyaWRlRm9ybWF0dGVyQ29uZmlndXJhdGlvbihvYmo6IE92ZXJyaWRlRm9ybWF0dGVyQ29uZmlndXJhdGlvbiB8IHVuZGVmaW5lZCk6IFJlY29yZDxzdHJpbmcsIGFueT4gfCB1bmRlZmluZWQge1xuICBpZiAob2JqID09PSB1bmRlZmluZWQpIHsgcmV0dXJuIHVuZGVmaW5lZDsgfVxuICBjb25zdCByZXN1bHQgPSB7XG4gICAgJ2F0dHJpYnV0ZVBvc2l0aW9uJzogb2JqLmF0dHJpYnV0ZVBvc2l0aW9uLFxuICAgICdicmFja2V0U2FtZUxpbmUnOiBvYmouYnJhY2tldFNhbWVMaW5lLFxuICAgICdicmFja2V0U3BhY2luZyc6IG9iai5icmFja2V0U3BhY2luZyxcbiAgICAnZGVsaW1pdGVyU3BhY2luZyc6IG9iai5kZWxpbWl0ZXJTcGFjaW5nLFxuICAgICdlbmFibGVkJzogb2JqLmVuYWJsZWQsXG4gICAgJ2V4cGFuZCc6IG9iai5leHBhbmQsXG4gICAgJ2Zvcm1hdFdpdGhFcnJvcnMnOiBvYmouZm9ybWF0V2l0aEVycm9ycyxcbiAgICAnaW5kZW50U2l6ZSc6IG9iai5pbmRlbnRTaXplLFxuICAgICdpbmRlbnRTdHlsZSc6IG9iai5pbmRlbnRTdHlsZSxcbiAgICAnaW5kZW50V2lkdGgnOiBvYmouaW5kZW50V2lkdGgsXG4gICAgJ2xpbmVFbmRpbmcnOiBvYmoubGluZUVuZGluZyxcbiAgICAnbGluZVdpZHRoJzogb2JqLmxpbmVXaWR0aCxcbiAgICAndHJhaWxpbmdDb21tYXMnOiBvYmoudHJhaWxpbmdDb21tYXMsXG4gICAgJ3RyYWlsaW5nTmV3bGluZSc6IG9iai50cmFpbGluZ05ld2xpbmUsXG4gIH07XG4gIC8vIGZpbHRlciB1bmRlZmluZWQgdmFsdWVzXG4gIHJldHVybiBPYmplY3QuZW50cmllcyhyZXN1bHQpLnJlZHVjZSgociwgaSkgPT4gKGlbMV0gPT09IHVuZGVmaW5lZCkgPyByIDogKHsgLi4uciwgW2lbMF1dOiBpWzFdIH0pLCB7fSk7XG59XG4vKiBlc2xpbnQtZW5hYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cblxuLyoqXG4gKiBAc2NoZW1hIE92ZXJyaWRlTGludGVyQ29uZmlndXJhdGlvblxuICovXG5leHBvcnQgaW50ZXJmYWNlIE92ZXJyaWRlTGludGVyQ29uZmlndXJhdGlvbiB7XG4gIC8qKlxuICAgKiBUaGUgbGludC1kb21haW4gY29uZmlndXJhdGlvbiBmb3IgbWF0Y2hlZCBmaWxlcy5cbiAgICpcbiAgICogQHNjaGVtYSBPdmVycmlkZUxpbnRlckNvbmZpZ3VyYXRpb24jZG9tYWluc1xuICAgKi9cbiAgcmVhZG9ubHkgZG9tYWlucz86IFJ1bGVEb21haW5zO1xuXG4gIC8qKlxuICAgKiBFbmFibGVzIG9yIGRpc2FibGVzIHRoZSBsaW50ZXIgZm9yIG1hdGNoZWQgZmlsZXMuXG4gICAqXG4gICAqIEBzY2hlbWEgT3ZlcnJpZGVMaW50ZXJDb25maWd1cmF0aW9uI2VuYWJsZWRcbiAgICovXG4gIHJlYWRvbmx5IGVuYWJsZWQ/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBUaGUgbGludC1ydWxlIGNvbmZpZ3VyYXRpb24gZm9yIG1hdGNoZWQgZmlsZXMuXG4gICAqXG4gICAqIEBzY2hlbWEgT3ZlcnJpZGVMaW50ZXJDb25maWd1cmF0aW9uI3J1bGVzXG4gICAqL1xuICByZWFkb25seSBydWxlcz86IFJ1bGVzO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGFuIG9iamVjdCBvZiB0eXBlICdPdmVycmlkZUxpbnRlckNvbmZpZ3VyYXRpb24nIHRvIEpTT04gcmVwcmVzZW50YXRpb24uXG4gKiBAaW50ZXJuYWxcbiAqL1xuLyogZXNsaW50LWRpc2FibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvSnNvbl9PdmVycmlkZUxpbnRlckNvbmZpZ3VyYXRpb24ob2JqOiBPdmVycmlkZUxpbnRlckNvbmZpZ3VyYXRpb24gfCB1bmRlZmluZWQpOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgdW5kZWZpbmVkIHtcbiAgaWYgKG9iaiA9PT0gdW5kZWZpbmVkKSB7IHJldHVybiB1bmRlZmluZWQ7IH1cbiAgY29uc3QgcmVzdWx0ID0ge1xuICAgICdkb21haW5zJzogdG9Kc29uX1J1bGVEb21haW5zKG9iai5kb21haW5zKSxcbiAgICAnZW5hYmxlZCc6IG9iai5lbmFibGVkLFxuICAgICdydWxlcyc6IHRvSnNvbl9SdWxlcyhvYmoucnVsZXMpLFxuICB9O1xuICAvLyBmaWx0ZXIgdW5kZWZpbmVkIHZhbHVlc1xuICByZXR1cm4gT2JqZWN0LmVudHJpZXMocmVzdWx0KS5yZWR1Y2UoKHIsIGkpID0+IChpWzFdID09PSB1bmRlZmluZWQpID8gciA6ICh7IC4uLnIsIFtpWzBdXTogaVsxXSB9KSwge30pO1xufVxuLyogZXNsaW50LWVuYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5cbi8qKlxuICogSW50ZWdyYXRpb24gd2l0aCBHaXQgYXMgdGhlIHZlcnNpb24gY29udHJvbCBjbGllbnQuXG4gKlxuICogQHNjaGVtYSBWY3NDbGllbnRLaW5kXG4gKi9cbmV4cG9ydCBlbnVtIFZjc0NsaWVudEtpbmQge1xuICAvKiogZ2l0ICovXG4gIEdJVCA9IFwiZ2l0XCIsXG59XG5cbi8qKlxuICogT3B0aW9ucyB0aGF0IGNoYW5nZSBob3cgdGhlIFlhbWwgZm9ybWF0dGVyIGJlaGF2ZXNcbiAqXG4gKiBAc2NoZW1hIFlhbWxGb3JtYXR0ZXJDb25maWd1cmF0aW9uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgWWFtbEZvcm1hdHRlckNvbmZpZ3VyYXRpb24ge1xuICAvKipcbiAgICogV2hldGhlciB0byBpbnNlcnQgc3BhY2VzIGluc2lkZSBub24tZW1wdHkgZmxvdyBtYXBwaW5ncyAoYHsga2V5OiB2YWx1ZSB9YClcbiAgICogYW5kIHNlcXVlbmNlcyAoYFsgaXRlbSBdYCkgdGhhdCBmaXQgb24gb25lIGxpbmUuIElmIHVuc2V0LCBpbmhlcml0cyB0aGVcbiAgICogZ2xvYmFsIGJyYWNrZXQgc3BhY2luZyBzZXR0aW5nLiBXaGVuIG5laXRoZXIgaXMgc2V0LCBtYXBwaW5ncyBoYXZlIHNwYWNlc1xuICAgKiBhbmQgc2VxdWVuY2VzIGRvIG5vdC5cbiAgICpcbiAgICogQHNjaGVtYSBZYW1sRm9ybWF0dGVyQ29uZmlndXJhdGlvbiNicmFja2V0U3BhY2luZ1xuICAgKi9cbiAgcmVhZG9ubHkgYnJhY2tldFNwYWNpbmc/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBDb250cm9sIHRoZSBmb3JtYXR0ZXIgZm9yIFlhbWwgKGFuZCBpdHMgc3VwZXIgbGFuZ3VhZ2VzKSBmaWxlcy5cbiAgICpcbiAgICogQHNjaGVtYSBZYW1sRm9ybWF0dGVyQ29uZmlndXJhdGlvbiNlbmFibGVkXG4gICAqL1xuICByZWFkb25seSBlbmFibGVkPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogVGhlIHNpemUgb2YgdGhlIGluZGVudGF0aW9uIGFwcGxpZWQgdG8gWWFtbCBmaWxlcy4gRGVmYXVsdHMgdG8gMi5cbiAgICpcbiAgICogQGRlZmF1bHQgMi5cbiAgICogQHNjaGVtYSBZYW1sRm9ybWF0dGVyQ29uZmlndXJhdGlvbiNpbmRlbnRXaWR0aFxuICAgKi9cbiAgcmVhZG9ubHkgaW5kZW50V2lkdGg/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFRoZSB0eXBlIG9mIGxpbmUgZW5kaW5nIGFwcGxpZWQgdG8gWWFtbCAoYW5kIGl0cyBzdXBlciBsYW5ndWFnZXMpIGZpbGVzLiBgYXV0b2AgdXNlcyBDUkxGIG9uIFdpbmRvd3MgYW5kIExGIG9uIG90aGVyIHBsYXRmb3Jtcy5cbiAgICpcbiAgICogQHNjaGVtYSBZYW1sRm9ybWF0dGVyQ29uZmlndXJhdGlvbiNsaW5lRW5kaW5nXG4gICAqL1xuICByZWFkb25seSBsaW5lRW5kaW5nPzogTGluZUVuZGluZztcblxuICAvKipcbiAgICogV2hhdCdzIHRoZSBtYXggd2lkdGggb2YgYSBsaW5lIGFwcGxpZWQgdG8gWWFtbCBmaWxlcy4gRGVmYXVsdHMgdG8gODAuXG4gICAqXG4gICAqIEBkZWZhdWx0IDgwLlxuICAgKiBAc2NoZW1hIFlhbWxGb3JtYXR0ZXJDb25maWd1cmF0aW9uI2xpbmVXaWR0aFxuICAgKi9cbiAgcmVhZG9ubHkgbGluZVdpZHRoPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBUaGUgdHlwZSBvZiBxdW90ZXMgdXNlZCBpbiBZQU1MIGNvZGUuIERlZmF1bHRzIHRvIGBkb3VibGVgLlxuICAgKlxuICAgKiBAZGVmYXVsdCBkb3VibGVgLlxuICAgKiBAc2NoZW1hIFlhbWxGb3JtYXR0ZXJDb25maWd1cmF0aW9uI3F1b3RlU3R5bGVcbiAgICovXG4gIHJlYWRvbmx5IHF1b3RlU3R5bGU/OiBRdW90ZVN0eWxlO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIGFkZCBhIHRyYWlsaW5nIG5ld2xpbmUgYXQgdGhlIGVuZCBvZiB0aGUgZmlsZS5cbiAgICpcbiAgICogU2V0dGluZyB0aGlzIG9wdGlvbiB0byBgZmFsc2VgIGlzICoqaGlnaGx5IGRpc2NvdXJhZ2VkKiogYmVjYXVzZSBpdCBjb3VsZCBjYXVzZSBtYW55IHByb2JsZW1zIHdpdGggb3RoZXIgdG9vbHM6XG4gICAqIC0gaHR0cHM6Ly90aG91Z2h0Ym90LmNvbS9ibG9nL25vLW5ld2xpbmUtYXQtZW5kLW9mLWZpbGVcbiAgICogLSBodHRwczovL2NhbGxtZXJ5YW4ubWVkaXVtLmNvbS9uby1uZXdsaW5lLWF0LWVuZC1vZi1maWxlLW5hdmlnYXRpbmctZ2l0cy13YXJuaW5nLWZvci1hbmRyb2lkLWRldmVsb3BlcnMtYWYxNGU3M2RkODA0XG4gICAqIC0gaHR0cHM6Ly91bml4LnN0YWNrZXhjaGFuZ2UuY29tL3F1ZXN0aW9ucy8zNDU1NDgvaG93LXRvLWNhdC1maWxlcy10b2dldGhlci1hZGRpbmctbWlzc2luZy1uZXdsaW5lcy1hdC1lbmQtb2Ytc29tZS1maWxlc1xuICAgKlxuICAgKiBEaXNhYmxlIHRoZSBvcHRpb24gYXQgeW91ciBvd24gcmlzay5cbiAgICpcbiAgICogRGVmYXVsdHMgdG8gdHJ1ZS5cbiAgICpcbiAgICogQGRlZmF1bHQgdHJ1ZS5cbiAgICogQHNjaGVtYSBZYW1sRm9ybWF0dGVyQ29uZmlndXJhdGlvbiN0cmFpbGluZ05ld2xpbmVcbiAgICovXG4gIHJlYWRvbmx5IHRyYWlsaW5nTmV3bGluZT86IGJvb2xlYW47XG59XG5cbi8qKlxuICogQ29udmVydHMgYW4gb2JqZWN0IG9mIHR5cGUgJ1lhbWxGb3JtYXR0ZXJDb25maWd1cmF0aW9uJyB0byBKU09OIHJlcHJlc2VudGF0aW9uLlxuICogQGludGVybmFsXG4gKi9cbi8qIGVzbGludC1kaXNhYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0pzb25fWWFtbEZvcm1hdHRlckNvbmZpZ3VyYXRpb24ob2JqOiBZYW1sRm9ybWF0dGVyQ29uZmlndXJhdGlvbiB8IHVuZGVmaW5lZCk6IFJlY29yZDxzdHJpbmcsIGFueT4gfCB1bmRlZmluZWQge1xuICBpZiAob2JqID09PSB1bmRlZmluZWQpIHsgcmV0dXJuIHVuZGVmaW5lZDsgfVxuICBjb25zdCByZXN1bHQgPSB7XG4gICAgJ2JyYWNrZXRTcGFjaW5nJzogb2JqLmJyYWNrZXRTcGFjaW5nLFxuICAgICdlbmFibGVkJzogb2JqLmVuYWJsZWQsXG4gICAgJ2luZGVudFdpZHRoJzogb2JqLmluZGVudFdpZHRoLFxuICAgICdsaW5lRW5kaW5nJzogb2JqLmxpbmVFbmRpbmcsXG4gICAgJ2xpbmVXaWR0aCc6IG9iai5saW5lV2lkdGgsXG4gICAgJ3F1b3RlU3R5bGUnOiBvYmoucXVvdGVTdHlsZSxcbiAgICAndHJhaWxpbmdOZXdsaW5lJzogb2JqLnRyYWlsaW5nTmV3bGluZSxcbiAgfTtcbiAgLy8gZmlsdGVyIHVuZGVmaW5lZCB2YWx1ZXNcbiAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKHJlc3VsdCkucmVkdWNlKChyLCBpKSA9PiAoaVsxXSA9PT0gdW5kZWZpbmVkKSA/IHIgOiAoeyAuLi5yLCBbaVswXV06IGlbMV0gfSksIHt9KTtcbn1cbi8qIGVzbGludC1lbmFibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuXG4vKipcbiAqIE9wdGlvbnMgdGhhdCBjaGFuZ2UgaG93IHRoZSBZYW1sIGxpbnRlciBiZWhhdmVzXG4gKlxuICogQHNjaGVtYSBZYW1sTGludGVyQ29uZmlndXJhdGlvblxuICovXG5leHBvcnQgaW50ZXJmYWNlIFlhbWxMaW50ZXJDb25maWd1cmF0aW9uIHtcbiAgLyoqXG4gICAqIENvbnRyb2wgdGhlIGxpbnRlciBmb3IgWWFtbCBmaWxlcy5cbiAgICpcbiAgICogQHNjaGVtYSBZYW1sTGludGVyQ29uZmlndXJhdGlvbiNlbmFibGVkXG4gICAqL1xuICByZWFkb25seSBlbmFibGVkPzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhbiBvYmplY3Qgb2YgdHlwZSAnWWFtbExpbnRlckNvbmZpZ3VyYXRpb24nIHRvIEpTT04gcmVwcmVzZW50YXRpb24uXG4gKiBAaW50ZXJuYWxcbiAqL1xuLyogZXNsaW50LWRpc2FibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvSnNvbl9ZYW1sTGludGVyQ29uZmlndXJhdGlvbihvYmo6IFlhbWxMaW50ZXJDb25maWd1cmF0aW9uIHwgdW5kZWZpbmVkKTogUmVjb3JkPHN0cmluZywgYW55PiB8IHVuZGVmaW5lZCB7XG4gIGlmIChvYmogPT09IHVuZGVmaW5lZCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9XG4gIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAnZW5hYmxlZCc6IG9iai5lbmFibGVkLFxuICB9O1xuICAvLyBmaWx0ZXIgdW5kZWZpbmVkIHZhbHVlc1xuICByZXR1cm4gT2JqZWN0LmVudHJpZXMocmVzdWx0KS5yZWR1Y2UoKHIsIGkpID0+IChpWzFdID09PSB1bmRlZmluZWQpID8gciA6ICh7IC4uLnIsIFtpWzBdXTogaVsxXSB9KSwge30pO1xufVxuLyogZXNsaW50LWVuYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5cbi8qKlxuICogQSBwcmVzZXQgY29uZmlndXJhdGlvbiBmb3IgZW5hYmxpbmcgYSBzZXQgb2YgcnVsZXMuXG4gKlxuICogQHNjaGVtYSBQcmVzZXRDb25maWdcbiAqL1xuZXhwb3J0IGVudW0gUHJlc2V0Q29uZmlnIHtcbiAgLyoqIHJlY29tbWVuZGVkICovXG4gIFJFQ09NTUVOREVEID0gXCJyZWNvbW1lbmRlZFwiLFxuICAvKiogYWxsICovXG4gIEFMTCA9IFwiYWxsXCIsXG4gIC8qKiBub25lICovXG4gIE5PTkUgPSBcIm5vbmVcIixcbn1cblxuLyoqXG4gKiBDb25maWd1cmVzIG9uZSBncm91cCBvZiBhc3Npc3QgYWN0aW9ucy5cbiAqXG4gKiBAc2NoZW1hIFNvdXJjZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNvdXJjZSB7XG4gIC8qKlxuICAgKiBSZW1vdmUgcmVwZWF0ZWQgQ1NTIGNsYXNzIG5hbWVzIGZyb20gSFRNTCBjbGFzcyBhdHRyaWJ1dGVzLlxuICAgKiBTZWUgaHR0cHM6Ly9iaW9tZWpzLmRldi9hc3Npc3QvYWN0aW9ucy9uby1kdXBsaWNhdGUtY2xhc3Nlc1xuICAgKlxuICAgKiBAc2NoZW1hIFNvdXJjZSNub0R1cGxpY2F0ZUNsYXNzZXNcbiAgICovXG4gIHJlYWRvbmx5IG5vRHVwbGljYXRlQ2xhc3Nlcz86IGFueTtcblxuICAvKipcbiAgICogT3JnYW5pemUgaW1wb3J0cyBhbmQgZXhwb3J0cyBpbiBKYXZhU2NyaXB0IGFuZCBUeXBlU2NyaXB0IGZpbGVzLlxuICAgKiBTZWUgaHR0cHM6Ly9iaW9tZWpzLmRldi9hc3Npc3QvYWN0aW9ucy9vcmdhbml6ZS1pbXBvcnRzXG4gICAqXG4gICAqIEBzY2hlbWEgU291cmNlI29yZ2FuaXplSW1wb3J0c1xuICAgKi9cbiAgcmVhZG9ubHkgb3JnYW5pemVJbXBvcnRzPzogYW55O1xuXG4gIC8qKlxuICAgKiBTZWxlY3RzIHRoZSBiYXNlbGluZSBzZXQgb2YgYXNzaXN0IGFjdGlvbnMgZm9yIHRoaXMgZ3JvdXAuIGByZWNvbW1lbmRlZGAgZW5hYmxlc1xuICAgKiB0aGUgZ3JvdXAncyByZWNvbW1lbmRlZCBhY3Rpb25zLCBgYWxsYCBlbmFibGVzIGFsbCBhY3Rpb25zIGluIHRoZSBncm91cCwgYW5kXG4gICAqIGBub25lYCBzdGFydHMgd2l0aCBubyBhY3Rpb25zIGVuYWJsZWQgaW4gdGhlIGdyb3VwLiBFeHBsaWNpdCBhY3Rpb24gc2V0dGluZ3NcbiAgICogb3ZlcnJpZGUgdGhpcyBncm91cCBwcmVzZXQsIHdoaWNoIG92ZXJyaWRlcyBgYXNzaXN0LmFjdGlvbnMucHJlc2V0YCBmb3IgdGhlIGdyb3VwLlxuICAgKlxuICAgKiBAc2NoZW1hIFNvdXJjZSNwcmVzZXRcbiAgICovXG4gIHJlYWRvbmx5IHByZXNldD86IFByZXNldENvbmZpZztcblxuICAvKipcbiAgICogRW5hYmxlcyBvciBkaXNhYmxlcyB0aGUgcmVjb21tZW5kZWQgYWN0aW9ucyBpbiB0aGlzIGdyb3VwLiBUaGUgZ3JvdXAncyBgcHJlc2V0YFxuICAgKiBzZXR0aW5nIHRha2VzIHByZWNlZGVuY2Ugd2hlbiBib3RoIG9wdGlvbnMgYXJlIHNldC5cbiAgICpcbiAgICogQHNjaGVtYSBTb3VyY2UjcmVjb21tZW5kZWRcbiAgICovXG4gIHJlYWRvbmx5IHJlY29tbWVuZGVkPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogU29ydCB0aGUgYXJndW1lbnRzIG9mIEdyYXBoUUwgZmllbGRzIGFuZCBkaXJlY3RpdmVzIGluIG5hdHVyYWwgb3JkZXIuXG4gICAqIFNlZSBodHRwczovL2Jpb21lanMuZGV2L2Fzc2lzdC9hY3Rpb25zL3VzZS1ncmFwaHFsLXNvcnRlZC1hcmd1bWVudHNcbiAgICpcbiAgICogQHNjaGVtYSBTb3VyY2UjdXNlR3JhcGhxbFNvcnRlZEFyZ3VtZW50c1xuICAgKi9cbiAgcmVhZG9ubHkgdXNlR3JhcGhxbFNvcnRlZEFyZ3VtZW50cz86IGFueTtcblxuICAvKipcbiAgICogU29ydCB0aGUgbmFtZWQgZGVmaW5pdGlvbnMgaW4gYSBHcmFwaFFMIGRvY3VtZW50LlxuICAgKiBTZWUgaHR0cHM6Ly9iaW9tZWpzLmRldi9hc3Npc3QvYWN0aW9ucy91c2UtZ3JhcGhxbC1zb3J0ZWQtZGVmaW5pdGlvbnNcbiAgICpcbiAgICogQHNjaGVtYSBTb3VyY2UjdXNlR3JhcGhxbFNvcnRlZERlZmluaXRpb25zXG4gICAqL1xuICByZWFkb25seSB1c2VHcmFwaHFsU29ydGVkRGVmaW5pdGlvbnM/OiBhbnk7XG5cbiAgLyoqXG4gICAqIFNvcnQgdGhlIHZhcmlhYmxlIGRlZmluaXRpb25zIG9mIEdyYXBoUUwgb3BlcmF0aW9ucyBpbiBuYXR1cmFsIG9yZGVyLlxuICAgKiBTZWUgaHR0cHM6Ly9iaW9tZWpzLmRldi9hc3Npc3QvYWN0aW9ucy91c2UtZ3JhcGhxbC1zb3J0ZWQtdmFyaWFibGVzXG4gICAqXG4gICAqIEBzY2hlbWEgU291cmNlI3VzZUdyYXBocWxTb3J0ZWRWYXJpYWJsZXNcbiAgICovXG4gIHJlYWRvbmx5IHVzZUdyYXBocWxTb3J0ZWRWYXJpYWJsZXM/OiBhbnk7XG5cbiAgLyoqXG4gICAqIFNvcnQgSFRNTCBhdHRyaWJ1dGVzIGFuZCBmcmFtZXdvcmsgZGlyZWN0aXZlcyBpbnRvIGEgY29uc2lzdGVudCBvcmRlci5cbiAgICogU2VlIGh0dHBzOi8vYmlvbWVqcy5kZXYvYXNzaXN0L2FjdGlvbnMvdXNlLXNvcnRlZC1hdHRyaWJ1dGVzXG4gICAqXG4gICAqIEBzY2hlbWEgU291cmNlI3VzZVNvcnRlZEF0dHJpYnV0ZXNcbiAgICovXG4gIHJlYWRvbmx5IHVzZVNvcnRlZEF0dHJpYnV0ZXM/OiBhbnk7XG5cbiAgLyoqXG4gICAqIFNvcnQgR3JhcGhRTCBlbnVtIHZhbHVlcyBpbiBuYXR1cmFsIG9yZGVyLlxuICAgKiBTZWUgaHR0cHM6Ly9iaW9tZWpzLmRldi9hc3Npc3QvYWN0aW9ucy91c2Utc29ydGVkLWVudW0tbWVtYmVyc1xuICAgKlxuICAgKiBAc2NoZW1hIFNvdXJjZSN1c2VTb3J0ZWRFbnVtTWVtYmVyc1xuICAgKi9cbiAgcmVhZG9ubHkgdXNlU29ydGVkRW51bU1lbWJlcnM/OiBhbnk7XG5cbiAgLyoqXG4gICAqIFNvcnQgbmFtZWQgbWVtYmVycyBvZiBhIFR5cGVTY3JpcHQgaW50ZXJmYWNlLlxuICAgKiBTZWUgaHR0cHM6Ly9iaW9tZWpzLmRldi9hc3Npc3QvYWN0aW9ucy91c2Utc29ydGVkLWludGVyZmFjZS1tZW1iZXJzXG4gICAqXG4gICAqIEBzY2hlbWEgU291cmNlI3VzZVNvcnRlZEludGVyZmFjZU1lbWJlcnNcbiAgICovXG4gIHJlYWRvbmx5IHVzZVNvcnRlZEludGVyZmFjZU1lbWJlcnM/OiBhbnk7XG5cbiAgLyoqXG4gICAqIFNvcnQga2V5cyBpbiBhIEpTT04gb2JqZWN0LlxuICAgKiBTZWUgaHR0cHM6Ly9iaW9tZWpzLmRldi9hc3Npc3QvYWN0aW9ucy91c2Utc29ydGVkLWtleXNcbiAgICpcbiAgICogQHNjaGVtYSBTb3VyY2UjdXNlU29ydGVkS2V5c1xuICAgKi9cbiAgcmVhZG9ubHkgdXNlU29ydGVkS2V5cz86IGFueTtcblxuICAvKipcbiAgICogT3JnYW5pemUgcGFja2FnZS5qc29uIGZpZWxkcyBhY2NvcmRpbmcgdG8gZXN0YWJsaXNoZWQgY29udmVudGlvbnMuXG4gICAqIFNlZSBodHRwczovL2Jpb21lanMuZGV2L2Fzc2lzdC9hY3Rpb25zL3VzZS1zb3J0ZWQtcGFja2FnZS1qc29uXG4gICAqXG4gICAqIEBzY2hlbWEgU291cmNlI3VzZVNvcnRlZFBhY2thZ2VKc29uXG4gICAqL1xuICByZWFkb25seSB1c2VTb3J0ZWRQYWNrYWdlSnNvbj86IGFueTtcblxuICAvKipcbiAgICogU29ydCBDU1MgcHJvcGVydGllcyBhbmQgbmVzdGVkIHJ1bGVzIGludG8gYSBjb25zaXN0ZW50IG9yZGVyLlxuICAgKiBTZWUgaHR0cHM6Ly9iaW9tZWpzLmRldi9hc3Npc3QvYWN0aW9ucy91c2Utc29ydGVkLXByb3BlcnRpZXNcbiAgICpcbiAgICogQHNjaGVtYSBTb3VyY2UjdXNlU29ydGVkUHJvcGVydGllc1xuICAgKi9cbiAgcmVhZG9ubHkgdXNlU29ydGVkUHJvcGVydGllcz86IGFueTtcblxuICAvKipcbiAgICogU29ydCBzZWxlY3Rpb25zIGluc2lkZSBHcmFwaFFMIG9wZXJhdGlvbnMgYW5kIGZyYWdtZW50cy5cbiAgICogU2VlIGh0dHBzOi8vYmlvbWVqcy5kZXYvYXNzaXN0L2FjdGlvbnMvdXNlLXNvcnRlZC1zZWxlY3Rpb24tc2V0XG4gICAqXG4gICAqIEBzY2hlbWEgU291cmNlI3VzZVNvcnRlZFNlbGVjdGlvblNldFxuICAgKi9cbiAgcmVhZG9ubHkgdXNlU29ydGVkU2VsZWN0aW9uU2V0PzogYW55O1xuXG4gIC8qKlxuICAgKiBTb3J0IGZpZWxkcyBpbiBHcmFwaFFMIHR5cGUgZGVmaW5pdGlvbnMgYnkgbmFtZS5cbiAgICogU2VlIGh0dHBzOi8vYmlvbWVqcy5kZXYvYXNzaXN0L2FjdGlvbnMvdXNlLXNvcnRlZC10eXBlLWZpZWxkc1xuICAgKlxuICAgKiBAc2NoZW1hIFNvdXJjZSN1c2VTb3J0ZWRUeXBlRmllbGRzXG4gICAqL1xuICByZWFkb25seSB1c2VTb3J0ZWRUeXBlRmllbGRzPzogYW55O1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGFuIG9iamVjdCBvZiB0eXBlICdTb3VyY2UnIHRvIEpTT04gcmVwcmVzZW50YXRpb24uXG4gKiBAaW50ZXJuYWxcbiAqL1xuLyogZXNsaW50LWRpc2FibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvSnNvbl9Tb3VyY2Uob2JqOiBTb3VyY2UgfCB1bmRlZmluZWQpOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgdW5kZWZpbmVkIHtcbiAgaWYgKG9iaiA9PT0gdW5kZWZpbmVkKSB7IHJldHVybiB1bmRlZmluZWQ7IH1cbiAgY29uc3QgcmVzdWx0ID0ge1xuICAgICdub0R1cGxpY2F0ZUNsYXNzZXMnOiBvYmoubm9EdXBsaWNhdGVDbGFzc2VzLFxuICAgICdvcmdhbml6ZUltcG9ydHMnOiBvYmoub3JnYW5pemVJbXBvcnRzLFxuICAgICdwcmVzZXQnOiBvYmoucHJlc2V0LFxuICAgICdyZWNvbW1lbmRlZCc6IG9iai5yZWNvbW1lbmRlZCxcbiAgICAndXNlR3JhcGhxbFNvcnRlZEFyZ3VtZW50cyc6IG9iai51c2VHcmFwaHFsU29ydGVkQXJndW1lbnRzLFxuICAgICd1c2VHcmFwaHFsU29ydGVkRGVmaW5pdGlvbnMnOiBvYmoudXNlR3JhcGhxbFNvcnRlZERlZmluaXRpb25zLFxuICAgICd1c2VHcmFwaHFsU29ydGVkVmFyaWFibGVzJzogb2JqLnVzZUdyYXBocWxTb3J0ZWRWYXJpYWJsZXMsXG4gICAgJ3VzZVNvcnRlZEF0dHJpYnV0ZXMnOiBvYmoudXNlU29ydGVkQXR0cmlidXRlcyxcbiAgICAndXNlU29ydGVkRW51bU1lbWJlcnMnOiBvYmoudXNlU29ydGVkRW51bU1lbWJlcnMsXG4gICAgJ3VzZVNvcnRlZEludGVyZmFjZU1lbWJlcnMnOiBvYmoudXNlU29ydGVkSW50ZXJmYWNlTWVtYmVycyxcbiAgICAndXNlU29ydGVkS2V5cyc6IG9iai51c2VTb3J0ZWRLZXlzLFxuICAgICd1c2VTb3J0ZWRQYWNrYWdlSnNvbic6IG9iai51c2VTb3J0ZWRQYWNrYWdlSnNvbixcbiAgICAndXNlU29ydGVkUHJvcGVydGllcyc6IG9iai51c2VTb3J0ZWRQcm9wZXJ0aWVzLFxuICAgICd1c2VTb3J0ZWRTZWxlY3Rpb25TZXQnOiBvYmoudXNlU29ydGVkU2VsZWN0aW9uU2V0LFxuICAgICd1c2VTb3J0ZWRUeXBlRmllbGRzJzogb2JqLnVzZVNvcnRlZFR5cGVGaWVsZHMsXG4gIH07XG4gIC8vIGZpbHRlciB1bmRlZmluZWQgdmFsdWVzXG4gIHJldHVybiBPYmplY3QuZW50cmllcyhyZXN1bHQpLnJlZHVjZSgociwgaSkgPT4gKGlbMV0gPT09IHVuZGVmaW5lZCkgPyByIDogKHsgLi4uciwgW2lbMF1dOiBpWzFdIH0pLCB7fSk7XG59XG4vKiBlc2xpbnQtZW5hYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cblxuLyoqXG4gKiBAc2NoZW1hIFF1b3RlU3R5bGVcbiAqL1xuZXhwb3J0IGVudW0gUXVvdGVTdHlsZSB7XG4gIC8qKiBkb3VibGUgKi9cbiAgRE9VQkxFID0gXCJkb3VibGVcIixcbiAgLyoqIHNpbmdsZSAqL1xuICBTSU5HTEUgPSBcInNpbmdsZVwiLFxufVxuXG4vKipcbiAqIENvbnRyb2xzIHdoZXRoZXIgSFRNTCB2b2lkIGVsZW1lbnRzIHN1Y2ggYXMgYDxpbWc+YCBhbmQgYDxpbnB1dD5gIGluY2x1ZGUgYSBzbGFzaCBiZWZvcmUgYD5gLlxuICpcbiAqIEBzY2hlbWEgU2VsZkNsb3NlVm9pZEVsZW1lbnRzXG4gKi9cbmV4cG9ydCBlbnVtIFNlbGZDbG9zZVZvaWRFbGVtZW50cyB7XG4gIC8qKiBSZW1vdmVzIHRoZSBzbGFzaCwgZm9yIGV4YW1wbGUgYDxpbWcgc3JjPVwiaW1hZ2UucG5nXCI+YC4gKG5ldmVyKSAqL1xuICBORVZFUiA9IFwibmV2ZXJcIixcbiAgLyoqIEFkZHMgdGhlIHNsYXNoLCBmb3IgZXhhbXBsZSBgPGltZyBzcmM9XCJpbWFnZS5wbmdcIiAvPmAuIChhbHdheXMpICovXG4gIEFMV0FZUyA9IFwiYWx3YXlzXCIsXG59XG5cbi8qKlxuICogQ29udHJvbHMgaG93IHRoZSBmb3JtYXR0ZXIgdHJlYXRzIHdoaXRlc3BhY2UgYXJvdW5kIHRleHQgYW5kIGNoaWxkIGVsZW1lbnRzIGluIEhUTUwsIFZ1ZSxcbiAqIFN2ZWx0ZSwgYW5kIEFzdHJvIG1hcmt1cC5cbiAqXG4gKiBUaGUgZm9sbG93aW5nIHR3byBjYXNlcyB3b24ndCBwcm9kdWNlIHRoZSBzYW1lIG91dHB1dDpcbiAqXG4gKiB8ICAgICAgICAgICAgICAgIHwgICAgICBodG1sICAgICAgfCAgICBvdXRwdXQgICAgfFxuICogfCAtLS0tLS0tLS0tLS0tLSB8IDotLS0tLS0tLS0tLS06IHwgOi0tLS0tLS0tLS06IHxcbiAqIHwgd2l0aCBzcGFjZXMgICAgfCBgMTxiPiAyIDwvYj4zYCB8IDE8Yj4gMiA8L2I+MyB8XG4gKiB8IHdpdGhvdXQgc3BhY2VzIHwgIGAxPGI+MjwvYj4zYCAgfCAgMTxiPjI8L2I+MyAgfFxuICpcbiAqIFRoaXMgaGFwcGVucyBiZWNhdXNlIHdoaXRlc3BhY2UgaXMgc2lnbmlmaWNhbnQgaW4gaW5saW5lIGVsZW1lbnRzLlxuICpcbiAqIEFzIGEgY29uc2VxdWVuY2Ugb2YgdGhpcywgdGhlIGZvcm1hdHRlciBtdXN0IGZvcm1hdCBibG9ja3MgdGhhdCBsb29rIGxpa2UgdGhpcyAoYXNzdW1lIGEgc21hbGwgbGluZSB3aWR0aCwgPDIwKTpcbiAqIGBgYGh0bWxcbiAqIDxzcGFuPnJlYWxseSBsb25nIGNvbnRlbnQ8L3NwYW4+XG4gKiBgYGBcbiAqIGFzIHRoaXMsIHdoZXJlIHRoZSBjb250ZW50IGh1Z3MgdGhlIHRhZ3M6XG4gKiBgYGBodG1sXG4gKiA8c3BhblxuICogPnJlYWxseSBsb25nIGNvbnRlbnQ8L3NwYW5cbiAqID5cbiAqIGBgYFxuICpcbiAqIE5vdGUgdGhhdCB0aGlzIGlzIG9ubHkgbmVjZXNzYXJ5IGZvciBpbmxpbmUgZWxlbWVudHMuIEJsb2NrIGVsZW1lbnRzIGRvIG5vdCBoYXZlIHRoaXMgcmVzdHJpY3Rpb24uXG4gKlxuICogQHNjaGVtYSBXaGl0ZXNwYWNlU2Vuc2l0aXZpdHlcbiAqL1xuZXhwb3J0IGVudW0gV2hpdGVzcGFjZVNlbnNpdGl2aXR5IHtcbiAgLyoqIFRyZWF0cyB3aGl0ZXNwYWNlIGFzIHNpZ25pZmljYW50IGZvciBlbGVtZW50cyB0aGF0IGJyb3dzZXJzIGRpc3BsYXkgaW5saW5lIGJ5IGRlZmF1bHQuIChjc3MpICovXG4gIENTUyA9IFwiY3NzXCIsXG4gIC8qKiBUcmVhdHMgbGVhZGluZyBhbmQgdHJhaWxpbmcgd2hpdGVzcGFjZSBhcyBzaWduaWZpY2FudCBmb3IgZXZlcnkgZWxlbWVudC4gRXhpc3Rpbmcgd2hpdGVzcGFjZVxuaXMgcHJlc2VydmVkIGFzIGF0IGxlYXN0IG9uZSBjaGFyYWN0ZXIgYW5kIGFic2VudCB3aGl0ZXNwYWNlIGlzIG5vdCBhZGRlZC5cblxuRXhhbXBsZSBvZiB0ZXh0IGh1Z2dpbmcgdGhlIHRhZ3M6XG5gYGBodG1sXG48YlxuICAgID5jb250ZW50PC9iXG4+XG5gYGAgKHN0cmljdCkgKi9cbiAgU1RSSUNUID0gXCJzdHJpY3RcIixcbiAgLyoqIFRyZWF0cyB3aGl0ZXNwYWNlIGFzIGluc2lnbmlmaWNhbnQsIGFsbG93aW5nIHRoZSBmb3JtYXR0ZXIgdG8gYWRkIG9yIHJlbW92ZSBpdC4gVXNlIHRoaXMgb25seVxud2hlbiB3aGl0ZXNwYWNlIGNhbm5vdCBhZmZlY3QgcmVuZGVyZWQgb3V0cHV0LiAoaWdub3JlKSAqL1xuICBJR05PUkUgPSBcImlnbm9yZVwiLFxufVxuXG4vKipcbiAqIEBzY2hlbWEgQXJyb3dQYXJlbnRoZXNlc1xuICovXG5leHBvcnQgZW51bSBBcnJvd1BhcmVudGhlc2VzIHtcbiAgLyoqIEFsd2F5cyBwcmludHMgcGFyZW50aGVzZXMgYXJvdW5kIGFycm93LWZ1bmN0aW9uIHBhcmFtZXRlcnMuIChhbHdheXMpICovXG4gIEFMV0FZUyA9IFwiYWx3YXlzXCIsXG4gIC8qKiBPbWl0cyBwYXJlbnRoZXNlcyB3aGVuIGFuIGFycm93IGZ1bmN0aW9uIGhhcyBvbmUgcGFyYW1ldGVyIGFuZCB0aGUgc3ludGF4IHBlcm1pdHMgaXQuIChhc05lZWRlZCkgKi9cbiAgQVNfTkVFREVEID0gXCJhc05lZWRlZFwiLFxufVxuXG4vKipcbiAqIEBzY2hlbWEgT3BlcmF0b3JMaW5lYnJlYWtcbiAqL1xuZXhwb3J0IGVudW0gT3BlcmF0b3JMaW5lYnJlYWsge1xuICAvKiogVGhlIG9wZXJhdG9yIGlzIHBsYWNlZCBhZnRlciB0aGUgZXhwcmVzc2lvbiAoYWZ0ZXIpICovXG4gIEFGVEVSID0gXCJhZnRlclwiLFxuICAvKiogVGhlIG9wZXJhdG9yIGlzIHBsYWNlZCBiZWZvcmUgdGhlIGV4cHJlc3Npb24gKGJlZm9yZSkgKi9cbiAgQkVGT1JFID0gXCJiZWZvcmVcIixcbn1cblxuLyoqXG4gKiBAc2NoZW1hIFF1b3RlUHJvcGVydGllc1xuICovXG5leHBvcnQgZW51bSBRdW90ZVByb3BlcnRpZXMge1xuICAvKiogUmVtb3ZlcyBxdW90ZXMgd2hlbiB0aGUgcHJvcGVydHkgbmFtZSBpcyB2YWxpZCB3aXRob3V0IHRoZW0uIChhc05lZWRlZCkgKi9cbiAgQVNfTkVFREVEID0gXCJhc05lZWRlZFwiLFxuICAvKiogUHJlc2VydmVzIHF1b3RlcyBhcm91bmQgcHJvcGVydHkgbmFtZXMgdGhhdCB3ZXJlIHF1b3RlZCBpbiB0aGUgaW5wdXQuIChwcmVzZXJ2ZSkgKi9cbiAgUFJFU0VSVkUgPSBcInByZXNlcnZlXCIsXG59XG5cbi8qKlxuICogQHNjaGVtYSBTZW1pY29sb25zXG4gKi9cbmV4cG9ydCBlbnVtIFNlbWljb2xvbnMge1xuICAvKiogYWx3YXlzICovXG4gIEFMV0FZUyA9IFwiYWx3YXlzXCIsXG4gIC8qKiBhc05lZWRlZCAqL1xuICBBU19ORUVERUQgPSBcImFzTmVlZGVkXCIsXG59XG5cbi8qKlxuICogUHJpbnQgdHJhaWxpbmcgY29tbWFzIHdoZXJldmVyIHBvc3NpYmxlIGluIG11bHRpLWxpbmUgY29tbWEtc2VwYXJhdGVkIHN5bnRhY3RpYyBzdHJ1Y3R1cmVzIGZvciBKYXZhU2NyaXB0L1R5cGVTY3JpcHQgZmlsZXMuXG4gKlxuICogQHNjaGVtYSBKc1RyYWlsaW5nQ29tbWFzXG4gKi9cbmV4cG9ydCBlbnVtIEpzVHJhaWxpbmdDb21tYXMge1xuICAvKiogYWxsICovXG4gIEFMTCA9IFwiYWxsXCIsXG4gIC8qKiBlczUgKi9cbiAgRVM1ID0gXCJlczVcIixcbiAgLyoqIG5vbmUgKi9cbiAgTk9ORSA9IFwibm9uZVwiLFxufVxuXG4vKipcbiAqIENvbnRyb2xzIHRyYWlsaW5nIGNvbW1hcyBpbiBtdWx0aWxpbmUgSlNPTiBhcnJheXMgYW5kIG9iamVjdHMuIFVzZSBgYWxsYCBvbmx5IGZvciBKU09OIHZhcmlhbnRzIHRoYXQgYWxsb3cgdHJhaWxpbmcgY29tbWFzLCBhbmQgZW5zdXJlIGBqc29uLnBhcnNlci5hbGxvd1RyYWlsaW5nQ29tbWFzYCBpcyBlbmFibGVkIG9yIGF1dG9tYXRpY2FsbHkgZGV0ZWN0ZWQgZm9yIHRob3NlIGZpbGVzLlxuICpcbiAqIEBzY2hlbWEgSnNvblRyYWlsaW5nQ29tbWFzXG4gKi9cbmV4cG9ydCBlbnVtIEpzb25UcmFpbGluZ0NvbW1hcyB7XG4gIC8qKiBub25lICovXG4gIE5PTkUgPSBcIm5vbmVcIixcbiAgLyoqIGFsbCAqL1xuICBBTEwgPSBcImFsbFwiLFxufVxuXG4vKipcbiAqIEBzY2hlbWEgUnVsZURvbWFpblZhbHVlXG4gKi9cbmV4cG9ydCBlbnVtIFJ1bGVEb21haW5WYWx1ZSB7XG4gIC8qKiBFbmFibGVzIGFsbCBydWxlcyBpbiB0aGUgZG9tYWluLiAoYWxsKSAqL1xuICBBTEwgPSBcImFsbFwiLFxuICAvKiogRGlzYWJsZXMgdGhlIGRvbWFpbi4gKG5vbmUpICovXG4gIE5PTkUgPSBcIm5vbmVcIixcbiAgLyoqIEVuYWJsZXMgdGhlIGRvbWFpbidzIHJlY29tbWVuZGVkIG5vbi1udXJzZXJ5IHJ1bGVzLiAocmVjb21tZW5kZWQpICovXG4gIFJFQ09NTUVOREVEID0gXCJyZWNvbW1lbmRlZFwiLFxufVxuXG4vKipcbiAqIENvbnRyb2xzIHdoZXRoZXIgQmlvbWUga2VlcHMsIGFkZHMsIG9yIHJlbW92ZXMgbGluZSBicmVha3MgaW4gTWFya2Rvd24gcGFyYWdyYXBocy5cbiAqXG4gKiBNYW51YWwgbGluZSBicmVha3MgYXJlIGFsd2F5cyBrZXB0LiBJbiBNYXJrZG93biwgYSBtYW51YWwgbGluZSBicmVhayBpcyBjcmVhdGVkIGJ5IGVuZGluZyBhXG4gKiBsaW5lIHdpdGggdHdvIHNwYWNlcyBvciBhIGJhY2tzbGFzaC5cbiAqXG4gKiBAc2NoZW1hIFByb3NlV3JhcFxuICovXG5leHBvcnQgZW51bSBQcm9zZVdyYXAge1xuICAvKiogS2VlcCBsaW5lIGJyZWFrcyBhcyB3cml0dGVuIGluIHRoZSBzb3VyY2UgZmlsZS4gVGhpcyBpcyB0aGUgZGVmYXVsdC4gKHByZXNlcnZlKSAqL1xuICBQUkVTRVJWRSA9IFwicHJlc2VydmVcIixcbiAgLyoqIFdyYXAgcGFyYWdyYXBocyB0byBmaXQgdGhlIGNvbmZpZ3VyZWQgYGxpbmVXaWR0aGAuIChhbHdheXMpICovXG4gIEFMV0FZUyA9IFwiYWx3YXlzXCIsXG4gIC8qKiBSZW1vdmUgbGluZSBicmVha3MgZnJvbSBwYXJhZ3JhcGhzIHNvIHRoYXQgZWFjaCBwYXJhZ3JhcGggaXMgb24gb25lIGxpbmUuIChuZXZlcikgKi9cbiAgTkVWRVIgPSBcIm5ldmVyXCIsXG59XG4iXX0=
1314
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmlvbWUtY29uZmlnLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2phdmFzY3JpcHQvYmlvbWUvYmlvbWUtY29uZmlnLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQWdLQSw4REF5QkM7QUFxQ0QsZ0VBU0M7QUFxREQsMERBV0M7QUE0REQsOERBVUM7QUE0SkQsc0VBb0JDO0FBdUNELGtFQVNDO0FBdUNELDREQVNDO0FBaUVELDREQVdDO0FBdUZELHdEQWNDO0FBOENELDREQVVDO0FBK0NELGdFQVVDO0FBNkNELG9FQVVDO0FBZ0hELHdEQW9CQztBQWdHRCxvRUFVQztBQW1FRCwwREFXQztBQTJCRCw0REFRQztBQXdDRCx3Q0FTQztBQXNCRCxzRUFPQztBQW1GRCw0RUFjQztBQXNCRCxzRUFPQztBQTRDRCxzRUFTQztBQXdFRCw4RUFPQztBQTZFRCxvRkFjQztBQXNCRCw4RUFPQztBQXNCRCx3RUFPQztBQTJERCw4RUFZQztBQXNCRCx3RUFPQztBQXNCRCx3RUFPQztBQThHRCw4RUFpQkM7QUFzQkQsd0VBT0M7QUFxQ0Qsd0VBUUM7QUFzQkQsb0VBT0M7QUFzTEQsMEVBd0JDO0FBMkNELG9FQU9DO0FBaUNELG9FQVFDO0FBNkNELHdFQU9DO0FBc0JELHdFQU9DO0FBb0dELDhFQWdCQztBQXNCRCx3RUFPQztBQWlDRCx3RUFRQztBQTZGRCxnREFzQkM7QUEyRUQsb0NBZ0JDO0FBNEZELHNGQWNDO0FBc0JELGdGQU9DO0FBNERELGdGQVNDO0FBMkJELGdGQVFDO0FBb0JELDhFQU9DO0FBdUlELHNGQW9CQztBQWtDRCxnRkFTQztBQTBGRCw4RUFhQztBQXNCRCx3RUFPQztBQXVKRCxzQ0FxQkM7QUF4K0dEOzs7R0FHRztBQUNILHFGQUFxRjtBQUNyRixTQUFnQix5QkFBeUIsQ0FBQyxHQUFtQztJQUMzRSxJQUFJLEdBQUcsS0FBSyxTQUFTLEVBQUUsQ0FBQztRQUFDLE9BQU8sU0FBUyxDQUFDO0lBQUMsQ0FBQztJQUM1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bEIsa0JBQWtCLFFBSzdCO0FBRUQ7O0dBRUc7QUFDSCxJQUFZLGVBT1g7QUFQRCxXQUFZLGVBQWU7SUFDekIsNkNBQTZDO0lBQzdDLDhCQUFXLENBQUE7SUFDWCxrQ0FBa0M7SUFDbEMsZ0NBQWEsQ0FBQTtJQUNiLHdFQUF3RTtJQUN4RSw4Q0FBMkIsQ0FBQTtBQUM3QixDQUFDLEVBUFcsZUFBZSwrQkFBZixlQUFlLFFBTzFCO0FBRUQ7Ozs7Ozs7R0FPRztBQUNILElBQVksU0FPWDtBQVBELFdBQVksU0FBUztJQUNuQixzRkFBc0Y7SUFDdEYsa0NBQXFCLENBQUE7SUFDckIsa0VBQWtFO0lBQ2xFLDhCQUFpQixDQUFBO0lBQ2pCLHdGQUF3RjtJQUN4Riw0QkFBZSxDQUFBO0FBQ2pCLENBQUMsRUFQVyxTQUFTLHlCQUFULFNBQVMsUUFPcEIiLCJzb3VyY2VzQ29udGVudCI6WyIvLyB+fiBHZW5lcmF0ZWQgYnkgcHJvamVuLiBUbyBtb2RpZnksIGVkaXQgLnByb2plbnJjLnRzIGFuZCBydW4gXCJub2RlIC4vcHJvamVuLmpzXCIuXG4vKipcbiAqIFRoZSBjb25maWd1cmF0aW9uIGNvbnRhaW5lZCBpbiBgYmlvbWUuanNvbmAgb3IgYGJpb21lLmpzb25jYC5cbiAqXG4gKiBAc2NoZW1hIEJpb21lQ29uZmlndXJhdGlvblxuICovXG5leHBvcnQgaW50ZXJmYWNlIEJpb21lQ29uZmlndXJhdGlvbiB7XG4gIC8qKlxuICAgKiBUaGUgSlNPTiBTY2hlbWEgdXNlZCB0byB2YWxpZGF0ZSB0aGUgY29uZmlndXJhdGlvbiBhbmQgcHJvdmlkZSBlZGl0b3IgY29tcGxldGlvbi4gQmlvbWVcbiAgICogZW1pdHMgYSBkaWFnbm9zdGljIHdoZW4gYSBgYmlvbWVqcy5kZXZgIHNjaGVtYSBVUkwgc3BlY2lmaWVzIGEgdmVyc2lvbiB0aGF0IGRpZmZlcnMgZnJvbSB0aGVcbiAgICogcnVubmluZyBDTEkgdmVyc2lvbi5cbiAgICpcbiAgICogQHNjaGVtYSBCaW9tZUNvbmZpZ3VyYXRpb24jJHNjaGVtYVxuICAgKi9cbiAgcmVhZG9ubHkgc2NoZW1hPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgYXNzaXN0IGNvbmZpZ3VyYXRpb24uXG4gICAqXG4gICAqIEBzY2hlbWEgQmlvbWVDb25maWd1cmF0aW9uI2Fzc2lzdFxuICAgKi9cbiAgcmVhZG9ubHkgYXNzaXN0PzogQXNzaXN0Q29uZmlndXJhdGlvbjtcblxuICAvKipcbiAgICogQ29uZmlndXJhdGlvbiBzcGVjaWZpYyB0byBDU1MuXG4gICAqXG4gICAqIEBzY2hlbWEgQmlvbWVDb25maWd1cmF0aW9uI2Nzc1xuICAgKi9cbiAgcmVhZG9ubHkgY3NzPzogQ3NzQ29uZmlndXJhdGlvbjtcblxuICAvKipcbiAgICogRXh0ZW5kcyB0aGUgY3VycmVudCBjb25maWd1cmF0aW9uIHdpdGggc2V0dGluZ3MgZnJvbSBvbmUgb3IgbW9yZSBvdGhlciBCaW9tZSBjb25maWd1cmF0aW9ucy5cbiAgICogVXNlIGBcIi8vXCJgIGluIGEgbmVzdGVkIGNvbmZpZ3VyYXRpb24gdG8gZXh0ZW5kIHRoZSByb290IGNvbmZpZ3VyYXRpb24gYXQgYW55IG5lc3RpbmcgZGVwdGguXG4gICAqIFVzZSBhbiBhcnJheSB0byBleHRlbmQgY29uZmlndXJhdGlvbnMgYnkgcmVsYXRpdmUgcGF0aCBvciBpbnN0YWxsZWQgcGFja2FnZSBzcGVjaWZpZXIuXG4gICAqXG4gICAqIEJpb21lIG1lcmdlcyBjb25maWd1cmF0aW9ucyBmcm9tIGxlZnQgdG8gcmlnaHQuIExhdGVyIGNvbmZpZ3VyYXRpb25zIHRha2UgcHJlY2VkZW5jZSBmb3JcbiAgICogc2luZ2xlLXZhbHVlIG9wdGlvbnMsIGxpc3QgZW50cmllcyBhcmUgY29tYmluZWQsIGFuZCB0aGUgY3VycmVudCBmaWxlIGlzIGFwcGxpZWQgbGFzdC5cbiAgICpcbiAgICogQHNjaGVtYSBCaW9tZUNvbmZpZ3VyYXRpb24jZXh0ZW5kc1xuICAgKi9cbiAgcmVhZG9ubHkgZXh0ZW5kcz86IGFueTtcblxuICAvKipcbiAgICogQ29uZmlndXJlcyB3aGljaCBmaWxlcyBCaW9tZSBjYW4gZGlzY292ZXIgYW5kIHByb2Nlc3MuXG4gICAqXG4gICAqIEBzY2hlbWEgQmlvbWVDb25maWd1cmF0aW9uI2ZpbGVzXG4gICAqL1xuICByZWFkb25seSBmaWxlcz86IEZpbGVzQ29uZmlndXJhdGlvbjtcblxuICAvKipcbiAgICogQ29uZmlndXJlcyBmb3JtYXR0aW5nIGZvciBzZWxlY3RlZCBmaWxlcy5cbiAgICpcbiAgICogQHNjaGVtYSBCaW9tZUNvbmZpZ3VyYXRpb24jZm9ybWF0dGVyXG4gICAqL1xuICByZWFkb25seSBmb3JtYXR0ZXI/OiBGb3JtYXR0ZXJDb25maWd1cmF0aW9uO1xuXG4gIC8qKlxuICAgKiBDb25maWd1cmF0aW9uIHNwZWNpZmljIHRvIEdyYXBoUUwuXG4gICAqXG4gICAqIEBzY2hlbWEgQmlvbWVDb25maWd1cmF0aW9uI2dyYXBocWxcbiAgICovXG4gIHJlYWRvbmx5IGdyYXBocWw/OiBHcmFwaHFsQ29uZmlndXJhdGlvbjtcblxuICAvKipcbiAgICogQ29uZmlndXJhdGlvbiBzcGVjaWZpYyB0byBHcml0UUwuXG4gICAqXG4gICAqIEBzY2hlbWEgQmlvbWVDb25maWd1cmF0aW9uI2dyaXRcbiAgICovXG4gIHJlYWRvbmx5IGdyaXQ/OiBHcml0Q29uZmlndXJhdGlvbjtcblxuICAvKipcbiAgICogQ29uZmlndXJhdGlvbiBzcGVjaWZpYyB0byBIVE1MLlxuICAgKlxuICAgKiBAc2NoZW1hIEJpb21lQ29uZmlndXJhdGlvbiNodG1sXG4gICAqL1xuICByZWFkb25seSBodG1sPzogSHRtbENvbmZpZ3VyYXRpb247XG5cbiAgLyoqXG4gICAqIENvbmZpZ3VyYXRpb24gc3BlY2lmaWMgdG8gSmF2YVNjcmlwdC5cbiAgICpcbiAgICogQHNjaGVtYSBCaW9tZUNvbmZpZ3VyYXRpb24jamF2YXNjcmlwdFxuICAgKi9cbiAgcmVhZG9ubHkgamF2YXNjcmlwdD86IEpzQ29uZmlndXJhdGlvbjtcblxuICAvKipcbiAgICogQ29uZmlndXJhdGlvbiBzcGVjaWZpYyB0byBKU09OLlxuICAgKlxuICAgKiBAc2NoZW1hIEJpb21lQ29uZmlndXJhdGlvbiNqc29uXG4gICAqL1xuICByZWFkb25seSBqc29uPzogSnNvbkNvbmZpZ3VyYXRpb247XG5cbiAgLyoqXG4gICAqIFRoZSBsaW50ZXIgY29uZmlndXJhdGlvbi5cbiAgICpcbiAgICogQHNjaGVtYSBCaW9tZUNvbmZpZ3VyYXRpb24jbGludGVyXG4gICAqL1xuICByZWFkb25seSBsaW50ZXI/OiBMaW50ZXJDb25maWd1cmF0aW9uO1xuXG4gIC8qKlxuICAgKiBDb25maWd1cmF0aW9uIHNwZWNpZmljIHRvIE1hcmtkb3duLlxuICAgKlxuICAgKiBAc2NoZW1hIEJpb21lQ29uZmlndXJhdGlvbiNtYXJrZG93blxuICAgKi9cbiAgcmVhZG9ubHkgbWFya2Rvd24/OiBNYXJrZG93bkNvbmZpZ3VyYXRpb247XG5cbiAgLyoqXG4gICAqIENvbmZpZ3VyZXMgc2V0dGluZ3MgZm9yIGZpbGVzIHNlbGVjdGVkIGJ5IGVhY2ggb3ZlcnJpZGUuIFdoZW4gbXVsdGlwbGUgb3ZlcnJpZGVzIGNvbmZpZ3VyZVxuICAgKiB0aGUgc2FtZSBzaW5nbGUtdmFsdWUgc2V0dGluZywgdGhlIGxhc3QgbWF0Y2hpbmcgb3ZlcnJpZGUgdGFrZXMgcHJlY2VkZW5jZS5cbiAgICpcbiAgICogQHNjaGVtYSBCaW9tZUNvbmZpZ3VyYXRpb24jb3ZlcnJpZGVzXG4gICAqL1xuICByZWFkb25seSBvdmVycmlkZXM/OiBPdmVycmlkZVBhdHRlcm5bXTtcblxuICAvKipcbiAgICogQSBsaXN0IG9mIEdyaXRRTCBwbHVnaW5zIHRvIGxvYWQuXG4gICAqXG4gICAqIEBzY2hlbWEgQmlvbWVDb25maWd1cmF0aW9uI3BsdWdpbnNcbiAgICovXG4gIHJlYWRvbmx5IHBsdWdpbnM/OiBhbnlbXTtcblxuICAvKipcbiAgICogTWFya3Mgd2hldGhlciB0aGlzIGZpbGUgaXMgdGhlIHJvb3QgY29uZmlndXJhdGlvbiBmb3IgYSBCaW9tZSBwcm9qZWN0LiBUaGUgcm9vdCBjb25maWd1cmF0aW9uXG4gICAqIGVzdGFibGlzaGVzIHRoZSBwcm9qZWN0J3MgYmFzZSBzZXR0aW5ncywgd2hpbGUgYGZhbHNlYCBtYXJrcyBhIGNvbmZpZ3VyYXRpb24gZm91bmQgaW5zaWRlIHRoZVxuICAgKiBwcm9qZWN0IGFzIG5lc3RlZCByYXRoZXIgdGhhbiBhIHNlY29uZCBwcm9qZWN0IHJvb3QuXG4gICAqXG4gICAqIERlZmF1bHRzIHRvIGB0cnVlYC4gQmlvbWUgaW1wbGljaXRseSB0cmVhdHMgYHJvb3RgIGFzIGBmYWxzZWAgd2hlbiBhIG5lc3RlZCBjb25maWd1cmF0aW9uIHVzZXNcbiAgICogYFwiZXh0ZW5kc1wiOiBcIi8vXCJgLiBBbGwgb3RoZXIgbmVzdGVkIGNvbmZpZ3VyYXRpb25zIG11c3QgZXhwbGljaXRseSBzZXQgYHJvb3RgIHRvIGBmYWxzZWAuXG4gICAqXG4gICAqIEBkZWZhdWx0IHRydWVgLiBCaW9tZSBpbXBsaWNpdGx5IHRyZWF0cyBgcm9vdGAgYXMgYGZhbHNlYCB3aGVuIGEgbmVzdGVkIGNvbmZpZ3VyYXRpb24gdXNlc1xuICAgKiBAc2NoZW1hIEJpb21lQ29uZmlndXJhdGlvbiNyb290XG4gICAqL1xuICByZWFkb25seSByb290PzogYm9vbGVhbjtcblxuICAvKipcbiAgICogQ29uZmlndXJlcyBob3cgQmlvbWUgcmVjb2duaXplcyBUYWlsd2luZCBjbGFzcyBzdHJpbmdzLlxuICAgKlxuICAgKiBAc2NoZW1hIEJpb21lQ29uZmlndXJhdGlvbiN0YWlsd2luZFxuICAgKi9cbiAgcmVhZG9ubHkgdGFpbHdpbmQ/OiBUYWlsd2luZENvbmZpZ3VyYXRpb247XG5cbiAgLyoqXG4gICAqIFRoZSB2ZXJzaW9uIGNvbnRyb2wgaW50ZWdyYXRpb24gY29uZmlndXJhdGlvbi5cbiAgICpcbiAgICogQHNjaGVtYSBCaW9tZUNvbmZpZ3VyYXRpb24jdmNzXG4gICAqL1xuICByZWFkb25seSB2Y3M/OiBWY3NDb25maWd1cmF0aW9uO1xuXG4gIC8qKlxuICAgKiBDb25maWd1cmF0aW9uIHNwZWNpZmljIHRvIFlBTUwuXG4gICAqXG4gICAqIEBzY2hlbWEgQmlvbWVDb25maWd1cmF0aW9uI3lhbWxcbiAgICovXG4gIHJlYWRvbmx5IHlhbWw/OiBZYW1sQ29uZmlndXJhdGlvbjtcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhbiBvYmplY3Qgb2YgdHlwZSAnQmlvbWVDb25maWd1cmF0aW9uJyB0byBKU09OIHJlcHJlc2VudGF0aW9uLlxuICogQGludGVybmFsXG4gKi9cbi8qIGVzbGludC1kaXNhYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0pzb25fQmlvbWVDb25maWd1cmF0aW9uKG9iajogQmlvbWVDb25maWd1cmF0aW9uIHwgdW5kZWZpbmVkKTogUmVjb3JkPHN0cmluZywgYW55PiB8IHVuZGVmaW5lZCB7XG4gIGlmIChvYmogPT09IHVuZGVmaW5lZCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9XG4gIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAnJHNjaGVtYSc6IG9iai5zY2hlbWEsXG4gICAgJ2Fzc2lzdCc6IHRvSnNvbl9Bc3Npc3RDb25maWd1cmF0aW9uKG9iai5hc3Npc3QpLFxuICAgICdjc3MnOiB0b0pzb25fQ3NzQ29uZmlndXJhdGlvbihvYmouY3NzKSxcbiAgICAnZXh0ZW5kcyc6IG9iai5leHRlbmRzLFxuICAgICdmaWxlcyc6IHRvSnNvbl9GaWxlc0NvbmZpZ3VyYXRpb24ob2JqLmZpbGVzKSxcbiAgICAnZm9ybWF0dGVyJzogdG9Kc29uX0Zvcm1hdHRlckNvbmZpZ3VyYXRpb24ob2JqLmZvcm1hdHRlciksXG4gICAgJ2dyYXBocWwnOiB0b0pzb25fR3JhcGhxbENvbmZpZ3VyYXRpb24ob2JqLmdyYXBocWwpLFxuICAgICdncml0JzogdG9Kc29uX0dyaXRDb25maWd1cmF0aW9uKG9iai5ncml0KSxcbiAgICAnaHRtbCc6IHRvSnNvbl9IdG1sQ29uZmlndXJhdGlvbihvYmouaHRtbCksXG4gICAgJ2phdmFzY3JpcHQnOiB0b0pzb25fSnNDb25maWd1cmF0aW9uKG9iai5qYXZhc2NyaXB0KSxcbiAgICAnanNvbic6IHRvSnNvbl9Kc29uQ29uZmlndXJhdGlvbihvYmouanNvbiksXG4gICAgJ2xpbnRlcic6IHRvSnNvbl9MaW50ZXJDb25maWd1cmF0aW9uKG9iai5saW50ZXIpLFxuICAgICdtYXJrZG93bic6IHRvSnNvbl9NYXJrZG93bkNvbmZpZ3VyYXRpb24ob2JqLm1hcmtkb3duKSxcbiAgICAnb3ZlcnJpZGVzJzogb2JqLm92ZXJyaWRlcz8ubWFwKHkgPT4gdG9Kc29uX092ZXJyaWRlUGF0dGVybih5KSksXG4gICAgJ3BsdWdpbnMnOiBvYmoucGx1Z2lucz8ubWFwKHkgPT4geSksXG4gICAgJ3Jvb3QnOiBvYmoucm9vdCxcbiAgICAndGFpbHdpbmQnOiB0b0pzb25fVGFpbHdpbmRDb25maWd1cmF0aW9uKG9iai50YWlsd2luZCksXG4gICAgJ3Zjcyc6IHRvSnNvbl9WY3NDb25maWd1cmF0aW9uKG9iai52Y3MpLFxuICAgICd5YW1sJzogdG9Kc29uX1lhbWxDb25maWd1cmF0aW9uKG9iai55YW1sKSxcbiAgfTtcbiAgLy8gZmlsdGVyIHVuZGVmaW5lZCB2YWx1ZXNcbiAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKHJlc3VsdCkucmVkdWNlKChyLCBpKSA9PiAoaVsxXSA9PT0gdW5kZWZpbmVkKSA/IHIgOiAoeyAuLi5yLCBbaVswXV06IGlbMV0gfSksIHt9KTtcbn1cbi8qIGVzbGludC1lbmFibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuXG4vKipcbiAqIEBzY2hlbWEgQXNzaXN0Q29uZmlndXJhdGlvblxuICovXG5leHBvcnQgaW50ZXJmYWNlIEFzc2lzdENvbmZpZ3VyYXRpb24ge1xuICAvKipcbiAgICogVGhlIGFzc2lzdC1hY3Rpb24gY29uZmlndXJhdGlvbi5cbiAgICpcbiAgICogQHNjaGVtYSBBc3Npc3RDb25maWd1cmF0aW9uI2FjdGlvbnNcbiAgICovXG4gIHJlYWRvbmx5IGFjdGlvbnM/OiBBY3Rpb25zO1xuXG4gIC8qKlxuICAgKiBFbmFibGVzIGNvbmZpZ3VyZWQgYXNzaXN0IGFjdGlvbnMgaW4gdGhlIENMSSBhbmQgZWRpdG9yIGludGVncmF0aW9ucy4gRGVmYXVsdHMgdG8gYHRydWVgLlxuICAgKlxuICAgKiBAZGVmYXVsdCB0cnVlYC5cbiAgICogQHNjaGVtYSBBc3Npc3RDb25maWd1cmF0aW9uI2VuYWJsZWRcbiAgICovXG4gIHJlYWRvbmx5IGVuYWJsZWQ/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBBIGxpc3Qgb2YgZ2xvYiBwYXR0ZXJucyBzZWxlY3RpbmcgZmlsZXMgb24gd2hpY2ggYXNzaXN0IGFjdGlvbnMgY2FuIHJ1bi4gSWYgb21pdHRlZCwgYWxsIGZpbGVzXG4gICAqIHNlbGVjdGVkIGJ5IGBmaWxlcy5pbmNsdWRlc2AgcmVtYWluIGVsaWdpYmxlIGZvciBhc3Npc3QgYWN0aW9ucy4gQW4gZW1wdHkgbGlzdCBzZWxlY3RzIG5vXG4gICAqIGZpbGVzLiBUaGlzIG9wdGlvbiBjYW4gb25seSBuYXJyb3cgdGhlIGZpbGVzIHNlbGVjdGVkIGJ5IGBmaWxlcy5pbmNsdWRlc2AuXG4gICAqXG4gICAqIEBzY2hlbWEgQXNzaXN0Q29uZmlndXJhdGlvbiNpbmNsdWRlc1xuICAgKi9cbiAgcmVhZG9ubHkgaW5jbHVkZXM/OiBzdHJpbmdbXTtcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhbiBvYmplY3Qgb2YgdHlwZSAnQXNzaXN0Q29uZmlndXJhdGlvbicgdG8gSlNPTiByZXByZXNlbnRhdGlvbi5cbiAqIEBpbnRlcm5hbFxuICovXG4vKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5leHBvcnQgZnVuY3Rpb24gdG9Kc29uX0Fzc2lzdENvbmZpZ3VyYXRpb24ob2JqOiBBc3Npc3RDb25maWd1cmF0aW9uIHwgdW5kZWZpbmVkKTogUmVjb3JkPHN0cmluZywgYW55PiB8IHVuZGVmaW5lZCB7XG4gIGlmIChvYmogPT09IHVuZGVmaW5lZCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9XG4gIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAnYWN0aW9ucyc6IHRvSnNvbl9BY3Rpb25zKG9iai5hY3Rpb25zKSxcbiAgICAnZW5hYmxlZCc6IG9iai5lbmFibGVkLFxuICAgICdpbmNsdWRlcyc6IG9iai5pbmNsdWRlcz8ubWFwKHkgPT4geSksXG4gIH07XG4gIC8vIGZpbHRlciB1bmRlZmluZWQgdmFsdWVzXG4gIHJldHVybiBPYmplY3QuZW50cmllcyhyZXN1bHQpLnJlZHVjZSgociwgaSkgPT4gKGlbMV0gPT09IHVuZGVmaW5lZCkgPyByIDogKHsgLi4uciwgW2lbMF1dOiBpWzFdIH0pLCB7fSk7XG59XG4vKiBlc2xpbnQtZW5hYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cblxuLyoqXG4gKiBPcHRpb25zIGFwcGxpZWQgdG8gQ1NTIGFuZCBsYW5ndWFnZXMgdGhhdCBleHRlbmQgaXQuXG4gKlxuICogTGFuZ3VhZ2Utc3BlY2lmaWMgc2V0dGluZ3MgdGFrZSBwcmVjZWRlbmNlIG92ZXIgY29ycmVzcG9uZGluZyBnbG9iYWwgc2V0dGluZ3MuIEdsb2JhbCBzZXR0aW5nc1xuICogYXBwbHkgd2hlbiB0aGVpciBsYW5ndWFnZS1zcGVjaWZpYyBjb3VudGVycGFydHMgYXJlIG9taXR0ZWQsIHVubGVzcyBzdGF0ZWQgb3RoZXJ3aXNlLlxuICpcbiAqIEBzY2hlbWEgQ3NzQ29uZmlndXJhdGlvblxuICovXG5leHBvcnQgaW50ZXJmYWNlIENzc0NvbmZpZ3VyYXRpb24ge1xuICAvKipcbiAgICogQ1NTIGFzc2lzdCBvcHRpb25zLlxuICAgKlxuICAgKiBAc2NoZW1hIENzc0NvbmZpZ3VyYXRpb24jYXNzaXN0XG4gICAqL1xuICByZWFkb25seSBhc3Npc3Q/OiBDc3NBc3Npc3RDb25maWd1cmF0aW9uO1xuXG4gIC8qKlxuICAgKiBDU1MgZm9ybWF0dGVyIG9wdGlvbnMuXG4gICAqXG4gICAqIEBzY2hlbWEgQ3NzQ29uZmlndXJhdGlvbiNmb3JtYXR0ZXJcbiAgICovXG4gIHJlYWRvbmx5IGZvcm1hdHRlcj86IENzc0Zvcm1hdHRlckNvbmZpZ3VyYXRpb247XG5cbiAgLyoqXG4gICAqIFJlc2VydmVkIGZvciBmdXR1cmUgQ1NTIGFuYWx5emVyIHN1cHBvcnQuIFRoaXMgb3B0aW9uIGN1cnJlbnRseSBoYXMgbm8gZWZmZWN0LlxuICAgKlxuICAgKiBAc2NoZW1hIENzc0NvbmZpZ3VyYXRpb24jZ2xvYmFsc1xuICAgKi9cbiAgcmVhZG9ubHkgZ2xvYmFscz86IHN0cmluZ1tdO1xuXG4gIC8qKlxuICAgKiBDU1MgbGludGVyIG9wdGlvbnMuXG4gICAqXG4gICAqIEBzY2hlbWEgQ3NzQ29uZmlndXJhdGlvbiNsaW50ZXJcbiAgICovXG4gIHJlYWRvbmx5IGxpbnRlcj86IENzc0xpbnRlckNvbmZpZ3VyYXRpb247XG5cbiAgLyoqXG4gICAqIENTUyBwYXJzaW5nIG9wdGlvbnMuXG4gICAqXG4gICAqIEBzY2hlbWEgQ3NzQ29uZmlndXJhdGlvbiNwYXJzZXJcbiAgICovXG4gIHJlYWRvbmx5IHBhcnNlcj86IENzc1BhcnNlckNvbmZpZ3VyYXRpb247XG59XG5cbi8qKlxuICogQ29udmVydHMgYW4gb2JqZWN0IG9mIHR5cGUgJ0Nzc0NvbmZpZ3VyYXRpb24nIHRvIEpTT04gcmVwcmVzZW50YXRpb24uXG4gKiBAaW50ZXJuYWxcbiAqL1xuLyogZXNsaW50LWRpc2FibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvSnNvbl9Dc3NDb25maWd1cmF0aW9uKG9iajogQ3NzQ29uZmlndXJhdGlvbiB8IHVuZGVmaW5lZCk6IFJlY29yZDxzdHJpbmcsIGFueT4gfCB1bmRlZmluZWQge1xuICBpZiAob2JqID09PSB1bmRlZmluZWQpIHsgcmV0dXJuIHVuZGVmaW5lZDsgfVxuICBjb25zdCByZXN1bHQgPSB7XG4gICAgJ2Fzc2lzdCc6IHRvSnNvbl9Dc3NBc3Npc3RDb25maWd1cmF0aW9uKG9iai5hc3Npc3QpLFxuICAgICdmb3JtYXR0ZXInOiB0b0pzb25fQ3NzRm9ybWF0dGVyQ29uZmlndXJhdGlvbihvYmouZm9ybWF0dGVyKSxcbiAgICAnZ2xvYmFscyc6IG9iai5nbG9iYWxzPy5tYXAoeSA9PiB5KSxcbiAgICAnbGludGVyJzogdG9Kc29uX0Nzc0xpbnRlckNvbmZpZ3VyYXRpb24ob2JqLmxpbnRlciksXG4gICAgJ3BhcnNlcic6IHRvSnNvbl9Dc3NQYXJzZXJDb25maWd1cmF0aW9uKG9iai5wYXJzZXIpLFxuICB9O1xuICAvLyBmaWx0ZXIgdW5kZWZpbmVkIHZhbHVlc1xuICByZXR1cm4gT2JqZWN0LmVudHJpZXMocmVzdWx0KS5yZWR1Y2UoKHIsIGkpID0+IChpWzFdID09PSB1bmRlZmluZWQpID8gciA6ICh7IC4uLnIsIFtpWzBdXTogaVsxXSB9KSwge30pO1xufVxuLyogZXNsaW50LWVuYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5cbi8qKlxuICogVGhlIGZpbGUgaGFuZGxpbmcgY29uZmlndXJhdGlvbi5cbiAqXG4gKiBAc2NoZW1hIEZpbGVzQ29uZmlndXJhdGlvblxuICovXG5leHBvcnQgaW50ZXJmYWNlIEZpbGVzQ29uZmlndXJhdGlvbiB7XG4gIC8qKlxuICAgKiAqKkRlcHJlY2F0ZWQ6KiogUGxlYXNlIHVzZSBfZm9yY2UtaWdub3JlIHN5bnRheF8gaW4gYGZpbGVzLmluY2x1ZGVzYFxuICAgKiBpbnN0ZWFkOiA8aHR0cHM6Ly9iaW9tZWpzLmRldi9yZWZlcmVuY2UvY29uZmlndXJhdGlvbi8jZmlsZXNpbmNsdWRlcz5cbiAgICpcbiAgICogRmlsZSBvciBkaXJlY3RvcnkgbmFtZXMgdGhhdCB0aGUgc2Nhbm5lciBpZ25vcmVzIHVuY29uZGl0aW9uYWxseSB3aGlsZSBjcmF3bGluZy4gRWFjaCB2YWx1ZVxuICAgKiBtYXRjaGVzIGEgY29tcGxldGUgcGF0aCBjb21wb25lbnQsIG5vdCBhIGdsb2IuIElnbm9yZWQgZmlsZXMgYXJlIG5vdCBhZGRlZCB0byB0aGUgbW9kdWxlIGdyYXBoLFxuICAgKiBzbyB0eXBlcyBhcmUgbm90IGluZmVycmVkIGZyb20gdGhlbS5cbiAgICpcbiAgICogQHNjaGVtYSBGaWxlc0NvbmZpZ3VyYXRpb24jZXhwZXJpbWVudGFsU2Nhbm5lcklnbm9yZXNcbiAgICovXG4gIHJlYWRvbmx5IGV4cGVyaW1lbnRhbFNjYW5uZXJJZ25vcmVzPzogc3RyaW5nW107XG5cbiAgLyoqXG4gICAqIFByZXZlbnRzIEJpb21lIGZyb20gZW1pdHRpbmcgZGlhZ25vc3RpY3MgZm9yIHVucmVjb2duaXplZCBmaWxlIHR5cGVzLiBEZWZhdWx0cyB0byBgZmFsc2VgLlxuICAgKlxuICAgKiBAZGVmYXVsdCBmYWxzZWAuXG4gICAqIEBzY2hlbWEgRmlsZXNDb25maWd1cmF0aW9uI2lnbm9yZVVua25vd25cbiAgICovXG4gIHJlYWRvbmx5IGlnbm9yZVVua25vd24/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBBIGxpc3Qgb2YgZ2xvYiBwYXR0ZXJucyBzZWxlY3Rpbmcgd2hpY2ggZmlsZXMgYW5kIGRpcmVjdG9yaWVzIEJpb21lIGNhbiBwcm9jZXNzLiBJZiBvbWl0dGVkLFxuICAgKiB0aGlzIG9wdGlvbiBkb2VzIG5vdCBmdXJ0aGVyIHJlc3RyaWN0IHRoZSBzdXBwb3J0ZWQgZmlsZXMgQmlvbWUgY2FuIHByb2Nlc3MuIEFuIGVtcHR5IGxpc3RcbiAgICogc2VsZWN0cyBubyBmaWxlcy4gQmlvbWUgaWdub3JlcyBmaWxlcyB1bmRlciBgbm9kZV9tb2R1bGVzYCBldmVuIHdoZW4gdGhleSBtYXRjaCBhIHBhdHRlcm4uXG4gICAqXG4gICAqIFRoZSBzY2FubmVyIHVzZXMgdGhlc2UgcGF0dGVybnMgYW5kLCB3aGVuIGVuYWJsZWQsIFZDUyBpZ25vcmUgZmlsZXMgd2hpbGUgZGlzY292ZXJpbmcgbmVzdGVkXG4gICAqIGNvbmZpZ3VyYXRpb24gYW5kIGlnbm9yZSBmaWxlcy4gV2hlbiBlbmFibGVkIHJ1bGVzIHVzZSB0aGUgYHByb2plY3RgIG9yIGB0eXBlc2AgZG9tYWlucywgaXRcbiAgICogYWxzbyBpbmRleGVzIHNvdXJjZSBmaWxlcyBhbmQgcHJvamVjdCBkZXBlbmRlbmNpZXMuIEl0IG1heSBzdGlsbCBkaXNjb3ZlciByZXF1aXJlZCBtZXRhZGF0YSBvclxuICAgKiBpbmRleCBleGNsdWRlZCBzb3VyY2UgZmlsZXMgbmVlZGVkIGZvciBhbmFseXNpcy4gQSBwYXR0ZXJuIGJlZ2lubmluZyB3aXRoIGAhIWAgcHJldmVudHMgdGhlXG4gICAqIHNjYW5uZXIgZnJvbSBpbmRleGluZyBtYXRjaGluZyBwYXRocy4gUGF0dGVybnMgYXJlIGV2YWx1YXRlZCBpbiBvcmRlciwgYW5kIGEgcGF0dGVybiBiZWdpbm5pbmdcbiAgICogd2l0aCBgIWAgZXhjbHVkZXMgbWF0Y2hlcy5cbiAgICpcbiAgICogQHNjaGVtYSBGaWxlc0NvbmZpZ3VyYXRpb24jaW5jbHVkZXNcbiAgICovXG4gIHJlYWRvbmx5IGluY2x1ZGVzPzogc3RyaW5nW107XG5cbiAgLyoqXG4gICAqIFRoZSBtYXhpbXVtIHNvdXJjZS1maWxlIHNpemUgaW4gYnl0ZXMuIEJpb21lIHNraXBzIGxhcmdlciBmaWxlcyBhbmQgZW1pdHMgYSB3YXJuaW5nXG4gICAqIGRpYWdub3N0aWMuIERlZmF1bHRzIHRvIGAxIE1pQmAuXG4gICAqXG4gICAqIEBkZWZhdWx0IDEgTWlCYC5cbiAgICogQHNjaGVtYSBGaWxlc0NvbmZpZ3VyYXRpb24jbWF4U2l6ZVxuICAgKi9cbiAgcmVhZG9ubHkgbWF4U2l6ZT86IG51bWJlcjtcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhbiBvYmplY3Qgb2YgdHlwZSAnRmlsZXNDb25maWd1cmF0aW9uJyB0byBKU09OIHJlcHJlc2VudGF0aW9uLlxuICogQGludGVybmFsXG4gKi9cbi8qIGVzbGludC1kaXNhYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0pzb25fRmlsZXNDb25maWd1cmF0aW9uKG9iajogRmlsZXNDb25maWd1cmF0aW9uIHwgdW5kZWZpbmVkKTogUmVjb3JkPHN0cmluZywgYW55PiB8IHVuZGVmaW5lZCB7XG4gIGlmIChvYmogPT09IHVuZGVmaW5lZCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9XG4gIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAnZXhwZXJpbWVudGFsU2Nhbm5lcklnbm9yZXMnOiBvYmouZXhwZXJpbWVudGFsU2Nhbm5lcklnbm9yZXM/Lm1hcCh5ID0+IHkpLFxuICAgICdpZ25vcmVVbmtub3duJzogb2JqLmlnbm9yZVVua25vd24sXG4gICAgJ2luY2x1ZGVzJzogb2JqLmluY2x1ZGVzPy5tYXAoeSA9PiB5KSxcbiAgICAnbWF4U2l6ZSc6IG9iai5tYXhTaXplLFxuICB9O1xuICAvLyBmaWx0ZXIgdW5kZWZpbmVkIHZhbHVlc1xuICByZXR1cm4gT2JqZWN0LmVudHJpZXMocmVzdWx0KS5yZWR1Y2UoKHIsIGkpID0+IChpWzFdID09PSB1bmRlZmluZWQpID8gciA6ICh7IC4uLnIsIFtpWzBdXTogaVsxXSB9KSwge30pO1xufVxuLyogZXNsaW50LWVuYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5cbi8qKlxuICogQ29uZmlndXJlcyBmb3JtYXR0aW5nIGZvciBzZWxlY3RlZCBmaWxlcy5cbiAqXG4gKiBAc2NoZW1hIEZvcm1hdHRlckNvbmZpZ3VyYXRpb25cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBGb3JtYXR0ZXJDb25maWd1cmF0aW9uIHtcbiAgLyoqXG4gICAqIFRoZSBhdHRyaWJ1dGUgcG9zaXRpb24gc3R5bGUgaW4gSFRNTC1saWtlIGxhbmd1YWdlcy4gRGVmYXVsdHMgdG8gYGF1dG9gLlxuICAgKlxuICAgKiBAZGVmYXVsdCBhdXRvYC5cbiAgICogQHNjaGVtYSBGb3JtYXR0ZXJDb25maWd1cmF0aW9uI2F0dHJpYnV0ZVBvc2l0aW9uXG4gICAqL1xuICByZWFkb25seSBhdHRyaWJ1dGVQb3NpdGlvbj86IEF0dHJpYnV0ZVBvc2l0aW9uO1xuXG4gIC8qKlxuICAgKiBDb250cm9scyB0aGUgcGxhY2VtZW50IG9mIHRoZSBjbG9zaW5nIGJyYWNrZXQgZm9yIG11bHRpbGluZSBIVE1MIGFuZCBKU1ggb3BlbmluZyB0YWdzLiBCaW9tZVxuICAgKiBwbGFjZXMgdGhlIGJyYWNrZXQgYXQgdGhlIGVuZCBvZiB0aGUgbGFzdCBhdHRyaWJ1dGUgbGluZSB3aGVuIGVuYWJsZWQgYW5kIG9uIGl0cyBvd24gbGluZSB3aGVuXG4gICAqIGRpc2FibGVkLiBUaGlzIGFsc28gYWZmZWN0cyBzZWxmLWNsb3NpbmcgSFRNTCBlbGVtZW50cywgYnV0IHNlbGYtY2xvc2luZyBKU1ggZWxlbWVudHMgYXJlXG4gICAqIHVuYWZmZWN0ZWQuIERlZmF1bHRzIHRvIGBmYWxzZWAuXG4gICAqXG4gICAqIEBkZWZhdWx0IGZhbHNlYC5cbiAgICogQHNjaGVtYSBGb3JtYXR0ZXJDb25maWd1cmF0aW9uI2JyYWNrZXRTYW1lTGluZVxuICAgKi9cbiAgcmVhZG9ubHkgYnJhY2tldFNhbWVMaW5lPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogQ29udHJvbHMgc3BhY2VzIGluc2lkZSBicmFjZXMgaW4gc3VwcG9ydGVkIHNpbmdsZS1saW5lIHN0cnVjdHVyZXMuIFRoZSBhZmZlY3RlZCBzdHJ1Y3R1cmVzXG4gICAqIHZhcnkgYnkgbGFuZ3VhZ2UuIERlZmF1bHRzIHRvIGB0cnVlYC5cbiAgICpcbiAgICogQGRlZmF1bHQgdHJ1ZWAuXG4gICAqIEBzY2hlbWEgRm9ybWF0dGVyQ29uZmlndXJhdGlvbiNicmFja2V0U3BhY2luZ1xuICAgKi9cbiAgcmVhZG9ubHkgYnJhY2tldFNwYWNpbmc/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBDb250cm9scyBzcGFjZXMgaW1tZWRpYXRlbHkgaW5zaWRlIHN1cHBvcnRlZCBkZWxpbWl0ZXJzIHdoZW4gdGhlaXIgY29udGVudCBmaXRzIG9uIG9uZSBsaW5lLlxuICAgKiBJdCBkb2Vzbid0IGFkZCBzcGFjZXMgYmVmb3JlIG9wZW5pbmcgZGVsaW1pdGVycyBvciBpbnNpZGUgZW1wdHkgZGVsaW1pdGVycy5cbiAgICpcbiAgICogVGhlIGFmZmVjdGVkIGRlbGltaXRlcnMgdmFyeSBieSBsYW5ndWFnZS4gRGVmYXVsdHMgdG8gYGZhbHNlYC5cbiAgICpcbiAgICogQGRlZmF1bHQgZmFsc2VgLlxuICAgKiBAc2NoZW1hIEZvcm1hdHRlckNvbmZpZ3VyYXRpb24jZGVsaW1pdGVyU3BhY2luZ1xuICAgKi9cbiAgcmVhZG9ubHkgZGVsaW1pdGVyU3BhY2luZz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEVuYWJsZXMgb3IgZGlzYWJsZXMgdGhlIGZvcm1hdHRlci4gRGVmYXVsdHMgdG8gYHRydWVgLlxuICAgKlxuICAgKiBAZGVmYXVsdCB0cnVlYC5cbiAgICogQHNjaGVtYSBGb3JtYXR0ZXJDb25maWd1cmF0aW9uI2VuYWJsZWRcbiAgICovXG4gIHJlYWRvbmx5IGVuYWJsZWQ/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBDb250cm9scyB3aGV0aGVyIGFycmF5cyBhbmQgb2JqZWN0cyBhcmUgZm9ybWF0dGVkIG9uIG9uZSBsaW5lIG9yIG11bHRpcGxlIGxpbmVzLlxuICAgKlxuICAgKiBgYXV0b2AgZm9ybWF0cyBvYmplY3RzIG9uIG11bHRpcGxlIGxpbmVzIGlmIHRoZSBmaXJzdCBwcm9wZXJ0eSBoYXMgYSBuZXdsaW5lLCBhbmQgYXJyYXlzIG9uXG4gICAqIG9uZSBsaW5lIGlmIHRoZXkgZml0LlxuICAgKlxuICAgKiBgYWx3YXlzYCBmb3JtYXRzIGFycmF5cyBhbmQgb2JqZWN0cyBvbiBtdWx0aXBsZSBsaW5lcy5cbiAgICpcbiAgICogYG5ldmVyYCBmb3JtYXRzIGFycmF5cyBhbmQgb2JqZWN0cyBvbiBvbmUgbGluZSBpZiB0aGV5IGZpdC5cbiAgICpcbiAgICogRGVmYXVsdHMgdG8gYGF1dG9gLlxuICAgKlxuICAgKiBXaGVuIGZvcm1hdHRpbmcgYHBhY2thZ2UuanNvbmAsIEJpb21lIHVzZXMgYGFsd2F5c2AgdW5sZXNzIGNvbmZpZ3VyZWQgb3RoZXJ3aXNlLlxuICAgKlxuICAgKiBAZGVmYXVsdCBhdXRvYC5cbiAgICogQHNjaGVtYSBGb3JtYXR0ZXJDb25maWd1cmF0aW9uI2V4cGFuZFxuICAgKi9cbiAgcmVhZG9ubHkgZXhwYW5kPzogRXhwYW5kO1xuXG4gIC8qKlxuICAgKiBBbGxvd3MgZm9ybWF0dGluZyBmaWxlcyB0aGF0IGNvbnRhaW4gc3ludGF4IGVycm9ycyB3aGVuIHNldCB0byBgdHJ1ZWAuIERlZmF1bHRzIHRvIGBmYWxzZWAuXG4gICAqXG4gICAqIEBkZWZhdWx0IGZhbHNlYC5cbiAgICogQHNjaGVtYSBGb3JtYXR0ZXJDb25maWd1cmF0aW9uI2Zvcm1hdFdpdGhFcnJvcnNcbiAgICovXG4gIHJlYWRvbmx5IGZvcm1hdFdpdGhFcnJvcnM/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBBIGxpc3Qgb2YgZ2xvYiBwYXR0ZXJucyBzZWxlY3RpbmcgZmlsZXMgdG8gZm9ybWF0LiBJZiBvbWl0dGVkLCBhbGwgZmlsZXMgc2VsZWN0ZWQgYnlcbiAgICogYGZpbGVzLmluY2x1ZGVzYCByZW1haW4gZWxpZ2libGUgZm9yIGZvcm1hdHRpbmcuIEFuIGVtcHR5IGxpc3Qgc2VsZWN0cyBubyBmaWxlcy4gVGhpcyBvcHRpb25cbiAgICogY2FuIG9ubHkgbmFycm93IHRoZSBmaWxlcyBzZWxlY3RlZCBieSBgZmlsZXMuaW5jbHVkZXNgLlxuICAgKlxuICAgKiBAc2NoZW1hIEZvcm1hdHRlckNvbmZpZ3VyYXRpb24jaW5jbHVkZXNcbiAgICovXG4gIHJlYWRvbmx5IGluY2x1ZGVzPzogc3RyaW5nW107XG5cbiAgLyoqXG4gICAqIFVzZXMgdGFicyBvciBzcGFjZXMgZm9yIGluZGVudGF0aW9uLiBEZWZhdWx0cyB0byBgdGFiYC5cbiAgICpcbiAgICogQGRlZmF1bHQgdGFiYC5cbiAgICogQHNjaGVtYSBGb3JtYXR0ZXJDb25maWd1cmF0aW9uI2luZGVudFN0eWxlXG4gICAqL1xuICByZWFkb25seSBpbmRlbnRTdHlsZT86IEluZGVudFN0eWxlO1xuXG4gIC8qKlxuICAgKiBTZXRzIHRoZSBpbmRlbnRhdGlvbiB3aWR0aC4gV2l0aCBzcGFjZSBpbmRlbnRhdGlvbiwgdGhpcyBpcyB0aGUgbnVtYmVyIG9mIHNwYWNlcyBlbWl0dGVkIHBlclxuICAgKiBpbmRlbnRhdGlvbiBsZXZlbC4gV2l0aCB0YWIgaW5kZW50YXRpb24sIEJpb21lIGVtaXRzIG9uZSB0YWIgcGVyIGxldmVsIGFuZCB1c2VzIHRoaXMgdmFsdWUgYXNcbiAgICogdGhlIHRhYidzIGRpc3BsYXkgd2lkdGggd2hlbiBjYWxjdWxhdGluZyBsaW5lIGxlbmd0aC4gQWNjZXB0ZWQgdmFsdWVzIGFyZSBgMGAgdGhyb3VnaCBgMjRgLlxuICAgKiBEZWZhdWx0cyB0byBgMmAuXG4gICAqXG4gICAqIEBkZWZhdWx0IDJgLlxuICAgKiBAc2NoZW1hIEZvcm1hdHRlckNvbmZpZ3VyYXRpb24jaW5kZW50V2lkdGhcbiAgICovXG4gIHJlYWRvbmx5IGluZGVudFdpZHRoPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBTZWxlY3RzIHRoZSBsaW5lIGVuZGluZy4gYGF1dG9gIHVzZXMgdGhlIHBsYXRmb3JtIGNvbnZlbnRpb24uIERlZmF1bHRzIHRvIGBsZmAuXG4gICAqXG4gICAqIEBkZWZhdWx0IGxmYC5cbiAgICogQHNjaGVtYSBGb3JtYXR0ZXJDb25maWd1cmF0aW9uI2xpbmVFbmRpbmdcbiAgICovXG4gIHJlYWRvbmx5IGxpbmVFbmRpbmc/OiBMaW5lRW5kaW5nO1xuXG4gIC8qKlxuICAgKiBTZXRzIHRoZSBwcmVmZXJyZWQgbWF4aW11bSBsaW5lIHdpZHRoIHVzZWQgd2hlbiBkZWNpZGluZyB3aGVyZSB0byB3cmFwIGNvZGUuIFNvbWUgY29udGVudCxcbiAgICogc3VjaCBhcyBsb25nIHVuYnJlYWthYmxlIHN0cmluZ3MsIG1heSBzdGlsbCBleGNlZWQgdGhpcyB3aWR0aC4gQWNjZXB0ZWQgdmFsdWVzIGFyZSBgMWAgdGhyb3VnaFxuICAgKiBgMzIwYC4gRGVmYXVsdHMgdG8gYDgwYC5cbiAgICpcbiAgICogQGRlZmF1bHQgODBgLlxuICAgKiBAc2NoZW1hIEZvcm1hdHRlckNvbmZpZ3VyYXRpb24jbGluZVdpZHRoXG4gICAqL1xuICByZWFkb25seSBsaW5lV2lkdGg/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gYWRkIGEgdHJhaWxpbmcgbmV3bGluZSBhdCB0aGUgZW5kIG9mIHRoZSBmaWxlLiBEZWZhdWx0cyB0byBgdHJ1ZWAuIERpc2FibGluZ1xuICAgKiB0aGlzIG9wdGlvbiBjYW4gY2F1c2UgY29tcGF0aWJpbGl0eSBwcm9ibGVtcyB3aXRoIG90aGVyIHRvb2xzLlxuICAgKlxuICAgKiBAZGVmYXVsdCB0cnVlYC4gRGlzYWJsaW5nXG4gICAqIEBzY2hlbWEgRm9ybWF0dGVyQ29uZmlndXJhdGlvbiN0cmFpbGluZ05ld2xpbmVcbiAgICovXG4gIHJlYWRvbmx5IHRyYWlsaW5nTmV3bGluZT86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIENvbnRyb2xzIHdoZXRoZXIgQmlvbWUgbG9hZHMgZm9ybWF0dGVyIHNldHRpbmdzIGZyb20gYW4gYC5lZGl0b3Jjb25maWdgIGZpbGUuIEJpb21lIHJlYWRzXG4gICAqIGBpbmRlbnRfc3R5bGVgLCBgaW5kZW50X3NpemVgLCBgZW5kX29mX2xpbmVgLCBhbmQgYGluc2VydF9maW5hbF9uZXdsaW5lYC4gU2V0dGluZ3MgaW5cbiAgICogYGJpb21lLmpzb25gIG9yIGBiaW9tZS5qc29uY2AgdGFrZSBwcmVjZWRlbmNlLiBCaW9tZSBsb2FkcyBvbmx5IG9uZSBgLmVkaXRvcmNvbmZpZ2AuIE5lc3RlZFxuICAgKiBjYXNjYWRpbmcgY29uZmlndXJhdGlvbnMgYW5kIHRoZSBFZGl0b3JDb25maWcgYHJvb3RgIHByb3BlcnR5IGFyZSBub3Qgc3VwcG9ydGVkLiBEZWZhdWx0cyB0b1xuICAgKiBgZmFsc2VgLlxuICAgKlxuICAgKiBAZGVmYXVsdCBmYWxzZWAuXG4gICAqIEBzY2hlbWEgRm9ybWF0dGVyQ29uZmlndXJhdGlvbiN1c2VFZGl0b3Jjb25maWdcbiAgICovXG4gIHJlYWRvbmx5IHVzZUVkaXRvcmNvbmZpZz86IGJvb2xlYW47XG59XG5cbi8qKlxuICogQ29udmVydHMgYW4gb2JqZWN0IG9mIHR5cGUgJ0Zvcm1hdHRlckNvbmZpZ3VyYXRpb24nIHRvIEpTT04gcmVwcmVzZW50YXRpb24uXG4gKiBAaW50ZXJuYWxcbiAqL1xuLyogZXNsaW50LWRpc2FibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvSnNvbl9Gb3JtYXR0ZXJDb25maWd1cmF0aW9uKG9iajogRm9ybWF0dGVyQ29uZmlndXJhdGlvbiB8IHVuZGVmaW5lZCk6IFJlY29yZDxzdHJpbmcsIGFueT4gfCB1bmRlZmluZWQge1xuICBpZiAob2JqID09PSB1bmRlZmluZWQpIHsgcmV0dXJuIHVuZGVmaW5lZDsgfVxuICBjb25zdCByZXN1bHQgPSB7XG4gICAgJ2F0dHJpYnV0ZVBvc2l0aW9uJzogb2JqLmF0dHJpYnV0ZVBvc2l0aW9uLFxuICAgICdicmFja2V0U2FtZUxpbmUnOiBvYmouYnJhY2tldFNhbWVMaW5lLFxuICAgICdicmFja2V0U3BhY2luZyc6IG9iai5icmFja2V0U3BhY2luZyxcbiAgICAnZGVsaW1pdGVyU3BhY2luZyc6IG9iai5kZWxpbWl0ZXJTcGFjaW5nLFxuICAgICdlbmFibGVkJzogb2JqLmVuYWJsZWQsXG4gICAgJ2V4cGFuZCc6IG9iai5leHBhbmQsXG4gICAgJ2Zvcm1hdFdpdGhFcnJvcnMnOiBvYmouZm9ybWF0V2l0aEVycm9ycyxcbiAgICAnaW5jbHVkZXMnOiBvYmouaW5jbHVkZXM/Lm1hcCh5ID0+IHkpLFxuICAgICdpbmRlbnRTdHlsZSc6IG9iai5pbmRlbnRTdHlsZSxcbiAgICAnaW5kZW50V2lkdGgnOiBvYmouaW5kZW50V2lkdGgsXG4gICAgJ2xpbmVFbmRpbmcnOiBvYmoubGluZUVuZGluZyxcbiAgICAnbGluZVdpZHRoJzogb2JqLmxpbmVXaWR0aCxcbiAgICAndHJhaWxpbmdOZXdsaW5lJzogb2JqLnRyYWlsaW5nTmV3bGluZSxcbiAgICAndXNlRWRpdG9yY29uZmlnJzogb2JqLnVzZUVkaXRvcmNvbmZpZyxcbiAgfTtcbiAgLy8gZmlsdGVyIHVuZGVmaW5lZCB2YWx1ZXNcbiAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKHJlc3VsdCkucmVkdWNlKChyLCBpKSA9PiAoaVsxXSA9PT0gdW5kZWZpbmVkKSA/IHIgOiAoeyAuLi5yLCBbaVswXV06IGlbMV0gfSksIHt9KTtcbn1cbi8qIGVzbGludC1lbmFibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuXG4vKipcbiAqIE9wdGlvbnMgYXBwbGllZCB0byBHcmFwaFFMIGZpbGVzLlxuICpcbiAqIExhbmd1YWdlLXNwZWNpZmljIHNldHRpbmdzIHRha2UgcHJlY2VkZW5jZSBvdmVyIGNvcnJlc3BvbmRpbmcgZ2xvYmFsIHNldHRpbmdzLiBHbG9iYWwgc2V0dGluZ3NcbiAqIGFwcGx5IHdoZW4gdGhlaXIgbGFuZ3VhZ2Utc3BlY2lmaWMgY291bnRlcnBhcnRzIGFyZSBvbWl0dGVkLCB1bmxlc3Mgc3RhdGVkIG90aGVyd2lzZS5cbiAqXG4gKiBAc2NoZW1hIEdyYXBocWxDb25maWd1cmF0aW9uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgR3JhcGhxbENvbmZpZ3VyYXRpb24ge1xuICAvKipcbiAgICogR3JhcGhRTCBhc3Npc3Qgb3B0aW9ucy5cbiAgICpcbiAgICogQHNjaGVtYSBHcmFwaHFsQ29uZmlndXJhdGlvbiNhc3Npc3RcbiAgICovXG4gIHJlYWRvbmx5IGFzc2lzdD86IEdyYXBocWxBc3Npc3RDb25maWd1cmF0aW9uO1xuXG4gIC8qKlxuICAgKiBHcmFwaFFMIGZvcm1hdHRlciBvcHRpb25zLlxuICAgKlxuICAgKiBAc2NoZW1hIEdyYXBocWxDb25maWd1cmF0aW9uI2Zvcm1hdHRlclxuICAgKi9cbiAgcmVhZG9ubHkgZm9ybWF0dGVyPzogR3JhcGhxbEZvcm1hdHRlckNvbmZpZ3VyYXRpb247XG5cbiAgLyoqXG4gICAqIEdyYXBoUUwgbGludGVyIG9wdGlvbnMuXG4gICAqXG4gICAqIEBzY2hlbWEgR3JhcGhxbENvbmZpZ3VyYXRpb24jbGludGVyXG4gICAqL1xuICByZWFkb25seSBsaW50ZXI/OiBHcmFwaHFsTGludGVyQ29uZmlndXJhdGlvbjtcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhbiBvYmplY3Qgb2YgdHlwZSAnR3JhcGhxbENvbmZpZ3VyYXRpb24nIHRvIEpTT04gcmVwcmVzZW50YXRpb24uXG4gKiBAaW50ZXJuYWxcbiAqL1xuLyogZXNsaW50LWRpc2FibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvSnNvbl9HcmFwaHFsQ29uZmlndXJhdGlvbihvYmo6IEdyYXBocWxDb25maWd1cmF0aW9uIHwgdW5kZWZpbmVkKTogUmVjb3JkPHN0cmluZywgYW55PiB8IHVuZGVmaW5lZCB7XG4gIGlmIChvYmogPT09IHVuZGVmaW5lZCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9XG4gIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAnYXNzaXN0JzogdG9Kc29uX0dyYXBocWxBc3Npc3RDb25maWd1cmF0aW9uKG9iai5hc3Npc3QpLFxuICAgICdmb3JtYXR0ZXInOiB0b0pzb25fR3JhcGhxbEZvcm1hdHRlckNvbmZpZ3VyYXRpb24ob2JqLmZvcm1hdHRlciksXG4gICAgJ2xpbnRlcic6IHRvSnNvbl9HcmFwaHFsTGludGVyQ29uZmlndXJhdGlvbihvYmoubGludGVyKSxcbiAgfTtcbiAgLy8gZmlsdGVyIHVuZGVmaW5lZCB2YWx1ZXNcbiAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKHJlc3VsdCkucmVkdWNlKChyLCBpKSA9PiAoaVsxXSA9PT0gdW5kZWZpbmVkKSA/IHIgOiAoeyAuLi5yLCBbaVswXV06IGlbMV0gfSksIHt9KTtcbn1cbi8qIGVzbGludC1lbmFibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuXG4vKipcbiAqIE9wdGlvbnMgYXBwbGllZCB0byBHcml0UUwgZmlsZXMuXG4gKlxuICogTGFuZ3VhZ2Utc3BlY2lmaWMgc2V0dGluZ3MgdGFrZSBwcmVjZWRlbmNlIG92ZXIgY29ycmVzcG9uZGluZyBnbG9iYWwgc2V0dGluZ3MuIEdsb2JhbCBzZXR0aW5nc1xuICogYXBwbHkgd2hlbiB0aGVpciBsYW5ndWFnZS1zcGVjaWZpYyBjb3VudGVycGFydHMgYXJlIG9taXR0ZWQsIHVubGVzcyBzdGF0ZWQgb3RoZXJ3aXNlLlxuICpcbiAqIEBzY2hlbWEgR3JpdENvbmZpZ3VyYXRpb25cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBHcml0Q29uZmlndXJhdGlvbiB7XG4gIC8qKlxuICAgKiBHcml0UUwgYXNzaXN0IG9wdGlvbnMuXG4gICAqXG4gICAqIEBzY2hlbWEgR3JpdENvbmZpZ3VyYXRpb24jYXNzaXN0XG4gICAqL1xuICByZWFkb25seSBhc3Npc3Q/OiBHcml0QXNzaXN0Q29uZmlndXJhdGlvbjtcblxuICAvKipcbiAgICogR3JpdFFMIGZvcm1hdHRlciBvcHRpb25zLlxuICAgKlxuICAgKiBAc2NoZW1hIEdyaXRDb25maWd1cmF0aW9uI2Zvcm1hdHRlclxuICAgKi9cbiAgcmVhZG9ubHkgZm9ybWF0dGVyPzogR3JpdEZvcm1hdHRlckNvbmZpZ3VyYXRpb247XG5cbiAgLyoqXG4gICAqIEdyaXRRTCBsaW50ZXIgb3B0aW9ucy5cbiAgICpcbiAgICogQHNjaGVtYSBHcml0Q29uZmlndXJhdGlvbiNsaW50ZXJcbiAgICovXG4gIHJlYWRvbmx5IGxpbnRlcj86IEdyaXRMaW50ZXJDb25maWd1cmF0aW9uO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGFuIG9iamVjdCBvZiB0eXBlICdHcml0Q29uZmlndXJhdGlvbicgdG8gSlNPTiByZXByZXNlbnRhdGlvbi5cbiAqIEBpbnRlcm5hbFxuICovXG4vKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5leHBvcnQgZnVuY3Rpb24gdG9Kc29uX0dyaXRDb25maWd1cmF0aW9uKG9iajogR3JpdENvbmZpZ3VyYXRpb24gfCB1bmRlZmluZWQpOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgdW5kZWZpbmVkIHtcbiAgaWYgKG9iaiA9PT0gdW5kZWZpbmVkKSB7IHJldHVybiB1bmRlZmluZWQ7IH1cbiAgY29uc3QgcmVzdWx0ID0ge1xuICAgICdhc3Npc3QnOiB0b0pzb25fR3JpdEFzc2lzdENvbmZpZ3VyYXRpb24ob2JqLmFzc2lzdCksXG4gICAgJ2Zvcm1hdHRlcic6IHRvSnNvbl9Hcml0Rm9ybWF0dGVyQ29uZmlndXJhdGlvbihvYmouZm9ybWF0dGVyKSxcbiAgICAnbGludGVyJzogdG9Kc29uX0dyaXRMaW50ZXJDb25maWd1cmF0aW9uKG9iai5saW50ZXIpLFxuICB9O1xuICAvLyBmaWx0ZXIgdW5kZWZpbmVkIHZhbHVlc1xuICByZXR1cm4gT2JqZWN0LmVudHJpZXMocmVzdWx0KS5yZWR1Y2UoKHIsIGkpID0+IChpWzFdID09PSB1bmRlZmluZWQpID8gciA6ICh7IC4uLnIsIFtpWzBdXTogaVsxXSB9KSwge30pO1xufVxuLyogZXNsaW50LWVuYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5cbi8qKlxuICogT3B0aW9ucyBhcHBsaWVkIHRvIEhUTUwgYW5kIGxhbmd1YWdlcyB0aGF0IGV4dGVuZCBpdC5cbiAqXG4gKiBGdWxsIEhUTUwgc3VwcG9ydCBhbmQgdGhlIEhUTUwgZm9ybWF0dGVyIGFyZSBleHBlcmltZW50YWwuIEJpb21lIGFpbXMgdG8gbWluaW1pemUgYnJlYWtpbmdcbiAqIGNoYW5nZXMsIGJ1dCBidWcgZml4ZXMgYW5kIG5ldyBmZWF0dXJlcyBtYXkgY2hhbmdlIGZvcm1hdHRpbmcgb3V0cHV0IG9yIGRpYWdub3N0aWNzLlxuICpcbiAqIExhbmd1YWdlLXNwZWNpZmljIHNldHRpbmdzIHRha2UgcHJlY2VkZW5jZSBvdmVyIGNvcnJlc3BvbmRpbmcgZ2xvYmFsIHNldHRpbmdzLiBHbG9iYWwgc2V0dGluZ3NcbiAqIGFwcGx5IHdoZW4gdGhlaXIgbGFuZ3VhZ2Utc3BlY2lmaWMgY291bnRlcnBhcnRzIGFyZSBvbWl0dGVkLCB1bmxlc3Mgc3RhdGVkIG90aGVyd2lzZS5cbiAqXG4gKiBAc2NoZW1hIEh0bWxDb25maWd1cmF0aW9uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSHRtbENvbmZpZ3VyYXRpb24ge1xuICAvKipcbiAgICogSFRNTCBhc3Npc3Qgb3B0aW9ucy5cbiAgICpcbiAgICogQHNjaGVtYSBIdG1sQ29uZmlndXJhdGlvbiNhc3Npc3RcbiAgICovXG4gIHJlYWRvbmx5IGFzc2lzdD86IEh0bWxBc3Npc3RDb25maWd1cmF0aW9uO1xuXG4gIC8qKlxuICAgKiBFbmFibGVzIEJpb21lJ3MgZXhwZXJpbWVudGFsIGZ1bGwgc3VwcG9ydCBmb3IgYC5odG1sYCwgYC52dWVgLCBgLnN2ZWx0ZWAsIGFuZCBgLmFzdHJvYCBmaWxlcy5cbiAgICogSW4gdGhpcyBtb2RlLCBCaW9tZSBwYXJzZXMgdGhlIGNvbXBsZXRlIGRvY3VtZW50IGFuZCBjYW4gYW5hbHl6ZSBvciBmb3JtYXQgaXRzIG1hcmt1cCBhbmRcbiAgICogc3VwcG9ydGVkIGVtYmVkZGVkIGxhbmd1YWdlcy5cbiAgICpcbiAgICogV2hlbiBkaXNhYmxlZCwgYC52dWVgLCBgLnN2ZWx0ZWAsIGFuZCBgLmFzdHJvYCBmaWxlcyB1c2UgbGVnYWN5IGhhbmRsaW5nLCB3aGljaCBleHRyYWN0cyB0aGVpclxuICAgKiBKYXZhU2NyaXB0IG9yIFR5cGVTY3JpcHQgcG9ydGlvbnMgYW5kIGxlYXZlcyB0aGUgcmVzdCB1bmNoYW5nZWQuIFRoaXMgb3B0aW9uIHNlbGVjdHMgaG93XG4gICAqIHRoZXNlIGZpbGVzIGFyZSBwcm9jZXNzZWQuIEl0IGRvZXMgbm90IGVuYWJsZSB0aGUgSFRNTCBmb3JtYXR0ZXIuIFNldFxuICAgKiBgaHRtbC5mb3JtYXR0ZXIuZW5hYmxlZGAgdG8gYHRydWVgIHRvIGZvcm1hdCBjb21wbGV0ZSBIVE1MLCBWdWUsIFN2ZWx0ZSwgYW5kIEFzdHJvIGZpbGVzLlxuICAgKiBEZWZhdWx0cyB0byBgZmFsc2VgLlxuICAgKlxuICAgKiBAZGVmYXVsdCBmYWxzZWAuXG4gICAqIEBzY2hlbWEgSHRtbENvbmZpZ3VyYXRpb24jZXhwZXJpbWVudGFsRnVsbFN1cHBvcnRFbmFibGVkXG4gICAqL1xuICByZWFkb25seSBleHBlcmltZW50YWxGdWxsU3VwcG9ydEVuYWJsZWQ/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBIVE1MIGZvcm1hdHRlciBvcHRpb25zLlxuICAgKlxuICAgKiBAc2NoZW1hIEh0bWxDb25maWd1cmF0aW9uI2Zvcm1hdHRlclxuICAgKi9cbiAgcmVhZG9ubHkgZm9ybWF0dGVyPzogSHRtbEZvcm1hdHRlckNvbmZpZ3VyYXRpb247XG5cbiAgLyoqXG4gICAqIEhUTUwgbGludGVyIG9wdGlvbnMuXG4gICAqXG4gICAqIEBzY2hlbWEgSHRtbENvbmZpZ3VyYXRpb24jbGludGVyXG4gICAqL1xuICByZWFkb25seSBsaW50ZXI/OiBIdG1sTGludGVyQ29uZmlndXJhdGlvbjtcblxuICAvKipcbiAgICogSFRNTCBwYXJzaW5nIG9wdGlvbnMuXG4gICAqXG4gICAqIEBzY2hlbWEgSHRtbENvbmZpZ3VyYXRpb24jcGFyc2VyXG4gICAqL1xuICByZWFkb25seSBwYXJzZXI/OiBIdG1sUGFyc2VyQ29uZmlndXJhdGlvbjtcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhbiBvYmplY3Qgb2YgdHlwZSAnSHRtbENvbmZpZ3VyYXRpb24nIHRvIEpTT04gcmVwcmVzZW50YXRpb24uXG4gKiBAaW50ZXJuYWxcbiAqL1xuLyogZXNsaW50LWRpc2FibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvSnNvbl9IdG1sQ29uZmlndXJhdGlvbihvYmo6IEh0bWxDb25maWd1cmF0aW9uIHwgdW5kZWZpbmVkKTogUmVjb3JkPHN0cmluZywgYW55PiB8IHVuZGVmaW5lZCB7XG4gIGlmIChvYmogPT09IHVuZGVmaW5lZCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9XG4gIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAnYXNzaXN0JzogdG9Kc29uX0h0bWxBc3Npc3RDb25maWd1cmF0aW9uKG9iai5hc3Npc3QpLFxuICAgICdleHBlcmltZW50YWxGdWxsU3VwcG9ydEVuYWJsZWQnOiBvYmouZXhwZXJpbWVudGFsRnVsbFN1cHBvcnRFbmFibGVkLFxuICAgICdmb3JtYXR0ZXInOiB0b0pzb25fSHRtbEZvcm1hdHRlckNvbmZpZ3VyYXRpb24ob2JqLmZvcm1hdHRlciksXG4gICAgJ2xpbnRlcic6IHRvSnNvbl9IdG1sTGludGVyQ29uZmlndXJhdGlvbihvYmoubGludGVyKSxcbiAgICAncGFyc2VyJzogdG9Kc29uX0h0bWxQYXJzZXJDb25maWd1cmF0aW9uKG9iai5wYXJzZXIpLFxuICB9O1xuICAvLyBmaWx0ZXIgdW5kZWZpbmVkIHZhbHVlc1xuICByZXR1cm4gT2JqZWN0LmVudHJpZXMocmVzdWx0KS5yZWR1Y2UoKHIsIGkpID0+IChpWzFdID09PSB1bmRlZmluZWQpID8gciA6ICh7IC4uLnIsIFtpWzBdXTogaVsxXSB9KSwge30pO1xufVxuLyogZXNsaW50LWVuYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5cbi8qKlxuICogT3B0aW9ucyBhcHBsaWVkIHRvIEphdmFTY3JpcHQsIFR5cGVTY3JpcHQsIEpTWCwgVFNYLCBhbmQgc3VwcG9ydGVkIGxhbmd1YWdlcyB0aGF0IGVtYmVkXG4gKiBKYXZhU2NyaXB0LlxuICpcbiAqIExhbmd1YWdlLXNwZWNpZmljIHNldHRpbmdzIHRha2UgcHJlY2VkZW5jZSBvdmVyIGNvcnJlc3BvbmRpbmcgZ2xvYmFsIHNldHRpbmdzLiBHbG9iYWwgc2V0dGluZ3NcbiAqIGFwcGx5IHdoZW4gdGhlaXIgbGFuZ3VhZ2Utc3BlY2lmaWMgY291bnRlcnBhcnRzIGFyZSBvbWl0dGVkLCB1bmxlc3Mgc3RhdGVkIG90aGVyd2lzZS5cbiAqXG4gKiBAc2NoZW1hIEpzQ29uZmlndXJhdGlvblxuICovXG5leHBvcnQgaW50ZXJmYWNlIEpzQ29uZmlndXJhdGlvbiB7XG4gIC8qKlxuICAgKiBKYXZhU2NyaXB0IGFzc2lzdCBvcHRpb25zLlxuICAgKlxuICAgKiBAc2NoZW1hIEpzQ29uZmlndXJhdGlvbiNhc3Npc3RcbiAgICovXG4gIHJlYWRvbmx5IGFzc2lzdD86IEpzQXNzaXN0Q29uZmlndXJhdGlvbjtcblxuICAvKipcbiAgICogRW5hYmxlcyBleHBlcmltZW50YWwgcGFyc2luZywgZm9ybWF0dGluZywgbGludGluZywgZGlhZ25vc3RpY3MsIGFuZCBmaXhlcyBmb3IgQ1NTIGFuZFxuICAgKiBHcmFwaFFMIHNuaXBwZXRzIGVtYmVkZGVkIGluIEphdmFTY3JpcHQgYW5kIFR5cGVTY3JpcHQgdGVtcGxhdGUgbGl0ZXJhbHMuXG4gICAqXG4gICAqIEJpb21lIHJlY29nbml6ZXMgQ1NTIGluIGBjc3NgIGFuZCBgc3R5bGVkYCB0ZW1wbGF0ZXMgYW5kIEdyYXBoUUwgaW4gYGdxbGAgYW5kIGBncmFwaHFsYFxuICAgKiB0ZW1wbGF0ZXMgb3IgY2FsbHMuIFRlbXBsYXRlcyBjb250YWluaW5nIGludGVycG9sYXRpb25zIGFyZSBub3QgY3VycmVudGx5IHN1cHBvcnRlZC5cbiAgICogRGVmYXVsdHMgdG8gYGZhbHNlYC5cbiAgICpcbiAgICogQGRlZmF1bHQgZmFsc2VgLlxuICAgKiBAc2NoZW1hIEpzQ29uZmlndXJhdGlvbiNleHBlcmltZW50YWxFbWJlZGRlZFNuaXBwZXRzRW5hYmxlZFxuICAgKi9cbiAgcmVhZG9ubHkgZXhwZXJpbWVudGFsRW1iZWRkZWRTbmlwcGV0c0VuYWJsZWQ/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBKYXZhU2NyaXB0IGZvcm1hdHRlciBvcHRpb25zLlxuICAgKlxuICAgKiBAc2NoZW1hIEpzQ29uZmlndXJhdGlvbiNmb3JtYXR0ZXJcbiAgICovXG4gIHJlYWRvbmx5IGZvcm1hdHRlcj86IEpzRm9ybWF0dGVyQ29uZmlndXJhdGlvbjtcblxuICAvKipcbiAgICogQSBsaXN0IG9mIGFkZGl0aW9uYWwgbmFtZXMgdGhhdCBCaW9tZSdzIEphdmFTY3JpcHQgbGludGVyIHRyZWF0cyBhcyBwcmVkZWZpbmVkIGdsb2JhbFxuICAgKiBiaW5kaW5ncy5cbiAgICpcbiAgICogVXNlIHRoaXMgZm9yIGdsb2JhbHMgc3VwcGxpZWQgYnkgYSBydW50aW1lLCBmcmFtZXdvcmssIG9yIGV4dGVybmFsIHNjcmlwdCB0aGF0IGFyZSBub3RcbiAgICogZGVjbGFyZWQgaW4gdGhlIHNvdXJjZSBmaWxlLlxuICAgKlxuICAgKiBAc2NoZW1hIEpzQ29uZmlndXJhdGlvbiNnbG9iYWxzXG4gICAqL1xuICByZWFkb25seSBnbG9iYWxzPzogc3RyaW5nW107XG5cbiAgLyoqXG4gICAqIENvbmZpZ3VyZXMgaG93IHRoZSBhbmFseXplciBhY2NvdW50cyBmb3IgaW1wb3J0cyB1c2VkIGJ5IEpTWC4gVGhpcyBvcHRpb24gZG9lcyBub3QgdHJhbnNmb3JtXG4gICAqIEpTWCBvciBzZWxlY3QgYSBydW50aW1lIGZvciBhIGJ1aWxkIHRvb2wuIERlZmF1bHRzIHRvIGB0cmFuc3BhcmVudGAuXG4gICAqXG4gICAqIEBkZWZhdWx0IHRyYW5zcGFyZW50YC5cbiAgICogQHNjaGVtYSBKc0NvbmZpZ3VyYXRpb24janN4UnVudGltZVxuICAgKi9cbiAgcmVhZG9ubHkganN4UnVudGltZT86IEpzeFJ1bnRpbWU7XG5cbiAgLyoqXG4gICAqIEphdmFTY3JpcHQgbGludGVyIG9wdGlvbnMuXG4gICAqXG4gICAqIEBzY2hlbWEgSnNDb25maWd1cmF0aW9uI2xpbnRlclxuICAgKi9cbiAgcmVhZG9ubHkgbGludGVyPzogSnNMaW50ZXJDb25maWd1cmF0aW9uO1xuXG4gIC8qKlxuICAgKiBKYXZhU2NyaXB0IHBhcnNlciBvcHRpb25zLlxuICAgKlxuICAgKiBAc2NoZW1hIEpzQ29uZmlndXJhdGlvbiNwYXJzZXJcbiAgICovXG4gIHJlYWRvbmx5IHBhcnNlcj86IEpzUGFyc2VyQ29uZmlndXJhdGlvbjtcblxuICAvKipcbiAgICogSmF2YVNjcmlwdCBtb2R1bGUgYW5kIGRlcGVuZGVuY3kgcmVzb2x2ZXIgb3B0aW9ucy5cbiAgICpcbiAgICogQHNjaGVtYSBKc0NvbmZpZ3VyYXRpb24jcmVzb2x2ZXJcbiAgICovXG4gIHJlYWRvbmx5IHJlc29sdmVyPzogSnNSZXNvbHZlckNvbmZpZ3VyYXRpb247XG59XG5cbi8qKlxuICogQ29udmVydHMgYW4gb2JqZWN0IG9mIHR5cGUgJ0pzQ29uZmlndXJhdGlvbicgdG8gSlNPTiByZXByZXNlbnRhdGlvbi5cbiAqIEBpbnRlcm5hbFxuICovXG4vKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5leHBvcnQgZnVuY3Rpb24gdG9Kc29uX0pzQ29uZmlndXJhdGlvbihvYmo6IEpzQ29uZmlndXJhdGlvbiB8IHVuZGVmaW5lZCk6IFJlY29yZDxzdHJpbmcsIGFueT4gfCB1bmRlZmluZWQge1xuICBpZiAob2JqID09PSB1bmRlZmluZWQpIHsgcmV0dXJuIHVuZGVmaW5lZDsgfVxuICBjb25zdCByZXN1bHQgPSB7XG4gICAgJ2Fzc2lzdCc6IHRvSnNvbl9Kc0Fzc2lzdENvbmZpZ3VyYXRpb24ob2JqLmFzc2lzdCksXG4gICAgJ2V4cGVyaW1lbnRhbEVtYmVkZGVkU25pcHBldHNFbmFibGVkJzogb2JqLmV4cGVyaW1lbnRhbEVtYmVkZGVkU25pcHBldHNFbmFibGVkLFxuICAgICdmb3JtYXR0ZXInOiB0b0pzb25fSnNGb3JtYXR0ZXJDb25maWd1cmF0aW9uKG9iai5mb3JtYXR0ZXIpLFxuICAgICdnbG9iYWxzJzogb2JqLmdsb2JhbHM/Lm1hcCh5ID0+IHkpLFxuICAgICdqc3hSdW50aW1lJzogb2JqLmpzeFJ1bnRpbWUsXG4gICAgJ2xpbnRlcic6IHRvSnNvbl9Kc0xpbnRlckNvbmZpZ3VyYXRpb24ob2JqLmxpbnRlciksXG4gICAgJ3BhcnNlcic6IHRvSnNvbl9Kc1BhcnNlckNvbmZpZ3VyYXRpb24ob2JqLnBhcnNlciksXG4gICAgJ3Jlc29sdmVyJzogdG9Kc29uX0pzUmVzb2x2ZXJDb25maWd1cmF0aW9uKG9iai5yZXNvbHZlciksXG4gIH07XG4gIC8vIGZpbHRlciB1bmRlZmluZWQgdmFsdWVzXG4gIHJldHVybiBPYmplY3QuZW50cmllcyhyZXN1bHQpLnJlZHVjZSgociwgaSkgPT4gKGlbMV0gPT09IHVuZGVmaW5lZCkgPyByIDogKHsgLi4uciwgW2lbMF1dOiBpWzFdIH0pLCB7fSk7XG59XG4vKiBlc2xpbnQtZW5hYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cblxuLyoqXG4gKiBPcHRpb25zIGFwcGxpZWQgdG8gSlNPTiwgSlNPTkMsIGFuZCByZWNvZ25pemVkIEpTT04tYmFzZWQgY29uZmlndXJhdGlvbiBmaWxlcy5cbiAqXG4gKiBMYW5ndWFnZS1zcGVjaWZpYyBzZXR0aW5ncyB0YWtlIHByZWNlZGVuY2Ugb3ZlciBjb3JyZXNwb25kaW5nIGdsb2JhbCBzZXR0aW5ncy4gR2xvYmFsIHNldHRpbmdzXG4gKiBhcHBseSB3aGVuIHRoZWlyIGxhbmd1YWdlLXNwZWNpZmljIGNvdW50ZXJwYXJ0cyBhcmUgb21pdHRlZCwgdW5sZXNzIHN0YXRlZCBvdGhlcndpc2UuXG4gKlxuICogQHNjaGVtYSBKc29uQ29uZmlndXJhdGlvblxuICovXG5leHBvcnQgaW50ZXJmYWNlIEpzb25Db25maWd1cmF0aW9uIHtcbiAgLyoqXG4gICAqIEFzc2lzdCBvcHRpb25zXG4gICAqXG4gICAqIEBzY2hlbWEgSnNvbkNvbmZpZ3VyYXRpb24jYXNzaXN0XG4gICAqL1xuICByZWFkb25seSBhc3Npc3Q/OiBKc29uQXNzaXN0Q29uZmlndXJhdGlvbjtcblxuICAvKipcbiAgICogRm9ybWF0dGluZyBvcHRpb25zXG4gICAqXG4gICAqIEBzY2hlbWEgSnNvbkNvbmZpZ3VyYXRpb24jZm9ybWF0dGVyXG4gICAqL1xuICByZWFkb25seSBmb3JtYXR0ZXI/OiBKc29uRm9ybWF0dGVyQ29uZmlndXJhdGlvbjtcblxuICAvKipcbiAgICogTGludGluZyBvcHRpb25zXG4gICAqXG4gICAqIEBzY2hlbWEgSnNvbkNvbmZpZ3VyYXRpb24jbGludGVyXG4gICAqL1xuICByZWFkb25seSBsaW50ZXI/OiBKc29uTGludGVyQ29uZmlndXJhdGlvbjtcblxuICAvKipcbiAgICogUGFyc2luZyBvcHRpb25zXG4gICAqXG4gICAqIEBzY2hlbWEgSnNvbkNvbmZpZ3VyYXRpb24jcGFyc2VyXG4gICAqL1xuICByZWFkb25seSBwYXJzZXI/OiBKc29uUGFyc2VyQ29uZmlndXJhdGlvbjtcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhbiBvYmplY3Qgb2YgdHlwZSAnSnNvbkNvbmZpZ3VyYXRpb24nIHRvIEpTT04gcmVwcmVzZW50YXRpb24uXG4gKiBAaW50ZXJuYWxcbiAqL1xuLyogZXNsaW50LWRpc2FibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvSnNvbl9Kc29uQ29uZmlndXJhdGlvbihvYmo6IEpzb25Db25maWd1cmF0aW9uIHwgdW5kZWZpbmVkKTogUmVjb3JkPHN0cmluZywgYW55PiB8IHVuZGVmaW5lZCB7XG4gIGlmIChvYmogPT09IHVuZGVmaW5lZCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9XG4gIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAnYXNzaXN0JzogdG9Kc29uX0pzb25Bc3Npc3RDb25maWd1cmF0aW9uKG9iai5hc3Npc3QpLFxuICAgICdmb3JtYXR0ZXInOiB0b0pzb25fSnNvbkZvcm1hdHRlckNvbmZpZ3VyYXRpb24ob2JqLmZvcm1hdHRlciksXG4gICAgJ2xpbnRlcic6IHRvSnNvbl9Kc29uTGludGVyQ29uZmlndXJhdGlvbihvYmoubGludGVyKSxcbiAgICAncGFyc2VyJzogdG9Kc29uX0pzb25QYXJzZXJDb25maWd1cmF0aW9uKG9iai5wYXJzZXIpLFxuICB9O1xuICAvLyBmaWx0ZXIgdW5kZWZpbmVkIHZhbHVlc1xuICByZXR1cm4gT2JqZWN0LmVudHJpZXMocmVzdWx0KS5yZWR1Y2UoKHIsIGkpID0+IChpWzFdID09PSB1bmRlZmluZWQpID8gciA6ICh7IC4uLnIsIFtpWzBdXTogaVsxXSB9KSwge30pO1xufVxuLyogZXNsaW50LWVuYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5cbi8qKlxuICogQHNjaGVtYSBMaW50ZXJDb25maWd1cmF0aW9uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTGludGVyQ29uZmlndXJhdGlvbiB7XG4gIC8qKlxuICAgKiBDb25maWd1cmVzIHJ1bGVzIGFzc29jaWF0ZWQgd2l0aCBhIGZyYW1ld29yaywgbGlicmFyeSwgcHJvamVjdC13aWRlIGFuYWx5c2lzLCBvciB0eXBlXG4gICAqIGFuYWx5c2lzLiBLZXlzIGFyZSBkb21haW4gbmFtZXMgYW5kIHZhbHVlcyBhcmUgYGFsbGAsIGByZWNvbW1lbmRlZGAsIG9yIGBub25lYC5cbiAgICogRW5hYmxpbmcgcnVsZXMgZnJvbSB0aGUgYHByb2plY3RgIG9yIGB0eXBlc2AgZG9tYWlucyBhY3RpdmF0ZXMgcHJvamVjdCBhbmQgZGVwZW5kZW5jeVxuICAgKiBzY2FubmluZy4gVGhlIGB0eXBlc2AgZG9tYWluIGFsc28gZW5hYmxlcyB0eXBlLWF3YXJlIHJlc29sdXRpb24uXG4gICAqXG4gICAqIEBzY2hlbWEgTGludGVyQ29uZmlndXJhdGlvbiNkb21haW5zXG4gICAqL1xuICByZWFkb25seSBkb21haW5zPzogUnVsZURvbWFpbnM7XG5cbiAgLyoqXG4gICAqIEVuYWJsZXMgb3IgZGlzYWJsZXMgdGhlIGxpbnRlci4gRGVmYXVsdHMgdG8gYHRydWVgLlxuICAgKlxuICAgKiBAZGVmYXVsdCB0cnVlYC5cbiAgICogQHNjaGVtYSBMaW50ZXJDb25maWd1cmF0aW9uI2VuYWJsZWRcbiAgICovXG4gIHJlYWRvbmx5IGVuYWJsZWQ/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBBIGxpc3Qgb2YgZ2xvYiBwYXR0ZXJucyBzZWxlY3RpbmcgZmlsZXMgdG8gbGludC4gSWYgb21pdHRlZCwgYWxsIGZpbGVzIHNlbGVjdGVkIGJ5XG4gICAqIGBmaWxlcy5pbmNsdWRlc2AgcmVtYWluIGVsaWdpYmxlIGZvciBsaW50aW5nLiBBbiBlbXB0eSBsaXN0IHNlbGVjdHMgbm8gZmlsZXMuIFRoaXMgb3B0aW9uIGNhblxuICAgKiBvbmx5IG5hcnJvdyB0aGUgZmlsZXMgc2VsZWN0ZWQgYnkgYGZpbGVzLmluY2x1ZGVzYC5cbiAgICpcbiAgICogQHNjaGVtYSBMaW50ZXJDb25maWd1cmF0aW9uI2luY2x1ZGVzXG4gICAqL1xuICByZWFkb25seSBpbmNsdWRlcz86IHN0cmluZ1tdO1xuXG4gIC8qKlxuICAgKiBUaGUgbGludC1ydWxlIGNvbmZpZ3VyYXRpb24uXG4gICAqXG4gICAqIEBzY2hlbWEgTGludGVyQ29uZmlndXJhdGlvbiNydWxlc1xuICAgKi9cbiAgcmVhZG9ubHkgcnVsZXM/OiBSdWxlcztcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhbiBvYmplY3Qgb2YgdHlwZSAnTGludGVyQ29uZmlndXJhdGlvbicgdG8gSlNPTiByZXByZXNlbnRhdGlvbi5cbiAqIEBpbnRlcm5hbFxuICovXG4vKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5leHBvcnQgZnVuY3Rpb24gdG9Kc29uX0xpbnRlckNvbmZpZ3VyYXRpb24ob2JqOiBMaW50ZXJDb25maWd1cmF0aW9uIHwgdW5kZWZpbmVkKTogUmVjb3JkPHN0cmluZywgYW55PiB8IHVuZGVmaW5lZCB7XG4gIGlmIChvYmogPT09IHVuZGVmaW5lZCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9XG4gIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAnZG9tYWlucyc6IHRvSnNvbl9SdWxlRG9tYWlucyhvYmouZG9tYWlucyksXG4gICAgJ2VuYWJsZWQnOiBvYmouZW5hYmxlZCxcbiAgICAnaW5jbHVkZXMnOiBvYmouaW5jbHVkZXM/Lm1hcCh5ID0+IHkpLFxuICAgICdydWxlcyc6IHRvSnNvbl9SdWxlcyhvYmoucnVsZXMpLFxuICB9O1xuICAvLyBmaWx0ZXIgdW5kZWZpbmVkIHZhbHVlc1xuICByZXR1cm4gT2JqZWN0LmVudHJpZXMocmVzdWx0KS5yZWR1Y2UoKHIsIGkpID0+IChpWzFdID09PSB1bmRlZmluZWQpID8gciA6ICh7IC4uLnIsIFtpWzBdXTogaVsxXSB9KSwge30pO1xufVxuLyogZXNsaW50LWVuYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5cbi8qKlxuICogT3B0aW9ucyBhcHBsaWVkIHRvIE1hcmtkb3duIGZpbGVzXG4gKlxuICogQHNjaGVtYSBNYXJrZG93bkNvbmZpZ3VyYXRpb25cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBNYXJrZG93bkNvbmZpZ3VyYXRpb24ge1xuICAvKipcbiAgICogUnVucyB0aGUgbGludGVyIGFuZCBhc3Npc3QgYWN0aW9ucyBvbiB0aGUgY29kZSBpbnNpZGUgZmVuY2VkIGNvZGUgYmxvY2tzLCBmcm9udG1hdHRlciwgYW5kXG4gICAqIEhUTUwgYmxvY2tzLCB3aXRoIHRoZSBydWxlcyBhbmQgYWN0aW9ucyBvZiB0aGUgY29kZSdzIGxhbmd1YWdlLiBEZWZhdWx0cyB0byBgZmFsc2VgLlxuICAgKlxuICAgKiBAZGVmYXVsdCBmYWxzZWAuXG4gICAqIEBzY2hlbWEgTWFya2Rvd25Db25maWd1cmF0aW9uI2FuYWx5emVFbWJlZHNcbiAgICovXG4gIHJlYWRvbmx5IGFuYWx5emVFbWJlZHM/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBGb3JtYXR0ZXIgb3B0aW9uc1xuICAgKlxuICAgKiBAc2NoZW1hIE1hcmtkb3duQ29uZmlndXJhdGlvbiNmb3JtYXR0ZXJcbiAgICovXG4gIHJlYWRvbmx5IGZvcm1hdHRlcj86IE1hcmtkb3duRm9ybWF0dGVyQ29uZmlndXJhdGlvbjtcblxuICAvKipcbiAgICogTGludGVyIG9wdGlvbnNcbiAgICpcbiAgICogQHNjaGVtYSBNYXJrZG93bkNvbmZpZ3VyYXRpb24jbGludGVyXG4gICAqL1xuICByZWFkb25seSBsaW50ZXI/OiBNYXJrZG93bkxpbnRlckNvbmZpZ3VyYXRpb247XG5cbiAgLyoqXG4gICAqIFBhcnNpbmcgb3B0aW9uc1xuICAgKlxuICAgKiBAc2NoZW1hIE1hcmtkb3duQ29uZmlndXJhdGlvbiNwYXJzZXJcbiAgICovXG4gIHJlYWRvbmx5IHBhcnNlcj86IE1hcmtkb3duUGFyc2VyQ29uZmlndXJhdGlvbjtcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhbiBvYmplY3Qgb2YgdHlwZSAnTWFya2Rvd25Db25maWd1cmF0aW9uJyB0byBKU09OIHJlcHJlc2VudGF0aW9uLlxuICogQGludGVybmFsXG4gKi9cbi8qIGVzbGludC1kaXNhYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0pzb25fTWFya2Rvd25Db25maWd1cmF0aW9uKG9iajogTWFya2Rvd25Db25maWd1cmF0aW9uIHwgdW5kZWZpbmVkKTogUmVjb3JkPHN0cmluZywgYW55PiB8IHVuZGVmaW5lZCB7XG4gIGlmIChvYmogPT09IHVuZGVmaW5lZCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9XG4gIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAnYW5hbHl6ZUVtYmVkcyc6IG9iai5hbmFseXplRW1iZWRzLFxuICAgICdmb3JtYXR0ZXInOiB0b0pzb25fTWFya2Rvd25Gb3JtYXR0ZXJDb25maWd1cmF0aW9uKG9iai5mb3JtYXR0ZXIpLFxuICAgICdsaW50ZXInOiB0b0pzb25fTWFya2Rvd25MaW50ZXJDb25maWd1cmF0aW9uKG9iai5saW50ZXIpLFxuICAgICdwYXJzZXInOiB0b0pzb25fTWFya2Rvd25QYXJzZXJDb25maWd1cmF0aW9uKG9iai5wYXJzZXIpLFxuICB9O1xuICAvLyBmaWx0ZXIgdW5kZWZpbmVkIHZhbHVlc1xuICByZXR1cm4gT2JqZWN0LmVudHJpZXMocmVzdWx0KS5yZWR1Y2UoKHIsIGkpID0+IChpWzFdID09PSB1bmRlZmluZWQpID8gciA6ICh7IC4uLnIsIFtpWzBdXTogaVsxXSB9KSwge30pO1xufVxuLyogZXNsaW50LWVuYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5cbi8qKlxuICogQHNjaGVtYSBPdmVycmlkZVBhdHRlcm5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBPdmVycmlkZVBhdHRlcm4ge1xuICAvKipcbiAgICogQXNzaXN0IHNldHRpbmdzIGZvciBtYXRjaGVkIGZpbGVzLlxuICAgKlxuICAgKiBAc2NoZW1hIE92ZXJyaWRlUGF0dGVybiNhc3Npc3RcbiAgICovXG4gIHJlYWRvbmx5IGFzc2lzdD86IE92ZXJyaWRlQXNzaXN0Q29uZmlndXJhdGlvbjtcblxuICAvKipcbiAgICogQ1NTLXNwZWNpZmljIHNldHRpbmdzIGZvciBtYXRjaGVkIGZpbGVzLlxuICAgKlxuICAgKiBAc2NoZW1hIE92ZXJyaWRlUGF0dGVybiNjc3NcbiAgICovXG4gIHJlYWRvbmx5IGNzcz86IENzc0NvbmZpZ3VyYXRpb247XG5cbiAgLyoqXG4gICAqIEZpbGUtaGFuZGxpbmcgc2V0dGluZ3MgZm9yIG1hdGNoZWQgZmlsZXMuXG4gICAqXG4gICAqIEBzY2hlbWEgT3ZlcnJpZGVQYXR0ZXJuI2ZpbGVzXG4gICAqL1xuICByZWFkb25seSBmaWxlcz86IE92ZXJyaWRlRmlsZXNDb25maWd1cmF0aW9uO1xuXG4gIC8qKlxuICAgKiBGb3JtYXR0ZXIgc2V0dGluZ3MgZm9yIG1hdGNoZWQgZmlsZXMuXG4gICAqXG4gICAqIEBzY2hlbWEgT3ZlcnJpZGVQYXR0ZXJuI2Zvcm1hdHRlclxuICAgKi9cbiAgcmVhZG9ubHkgZm9ybWF0dGVyPzogT3ZlcnJpZGVGb3JtYXR0ZXJDb25maWd1cmF0aW9uO1xuXG4gIC8qKlxuICAgKiBHcmFwaFFMLXNwZWNpZmljIHNldHRpbmdzIGZvciBtYXRjaGVkIGZpbGVzLlxuICAgKlxuICAgKiBAc2NoZW1hIE92ZXJyaWRlUGF0dGVybiNncmFwaHFsXG4gICAqL1xuICByZWFkb25seSBncmFwaHFsPzogR3JhcGhxbENvbmZpZ3VyYXRpb247XG5cbiAgLyoqXG4gICAqIEdyaXRRTC1zcGVjaWZpYyBzZXR0aW5ncyBmb3IgbWF0Y2hlZCBmaWxlcy5cbiAgICpcbiAgICogQHNjaGVtYSBPdmVycmlkZVBhdHRlcm4jZ3JpdFxuICAgKi9cbiAgcmVhZG9ubHkgZ3JpdD86IEdyaXRDb25maWd1cmF0aW9uO1xuXG4gIC8qKlxuICAgKiBIVE1MLXNwZWNpZmljIHNldHRpbmdzIGZvciBtYXRjaGVkIGZpbGVzLlxuICAgKlxuICAgKiBAc2NoZW1hIE92ZXJyaWRlUGF0dGVybiNodG1sXG4gICAqL1xuICByZWFkb25seSBodG1sPzogSHRtbENvbmZpZ3VyYXRpb247XG5cbiAgLyoqXG4gICAqIEEgbGlzdCBvZiBnbG9iIHBhdHRlcm5zIHNlbGVjdGluZyB0aGUgZmlsZXMgdG8gd2hpY2ggdGhpcyBvdmVycmlkZSBhcHBsaWVzLiBJZiBvbWl0dGVkLCB0aGVcbiAgICogb3ZlcnJpZGUgYXBwbGllcyB0byBldmVyeSBmaWxlLiBBbiBlbXB0eSBsaXN0IGFwcGxpZXMgdG8gbm8gZmlsZXMuXG4gICAqXG4gICAqIEBzY2hlbWEgT3ZlcnJpZGVQYXR0ZXJuI2luY2x1ZGVzXG4gICAqL1xuICByZWFkb25seSBpbmNsdWRlcz86IHN0cmluZ1tdO1xuXG4gIC8qKlxuICAgKiBKYXZhU2NyaXB0LXNwZWNpZmljIHNldHRpbmdzIGZvciBtYXRjaGVkIGZpbGVzLlxuICAgKlxuICAgKiBAc2NoZW1hIE92ZXJyaWRlUGF0dGVybiNqYXZhc2NyaXB0XG4gICAqL1xuICByZWFkb25seSBqYXZhc2NyaXB0PzogSnNDb25maWd1cmF0aW9uO1xuXG4gIC8qKlxuICAgKiBKU09OLXNwZWNpZmljIHNldHRpbmdzIGZvciBtYXRjaGVkIGZpbGVzLlxuICAgKlxuICAgKiBAc2NoZW1hIE92ZXJyaWRlUGF0dGVybiNqc29uXG4gICAqL1xuICByZWFkb25seSBqc29uPzogSnNvbkNvbmZpZ3VyYXRpb247XG5cbiAgLyoqXG4gICAqIExpbnRlciBzZXR0aW5ncyBmb3IgbWF0Y2hlZCBmaWxlcy5cbiAgICpcbiAgICogQHNjaGVtYSBPdmVycmlkZVBhdHRlcm4jbGludGVyXG4gICAqL1xuICByZWFkb25seSBsaW50ZXI/OiBPdmVycmlkZUxpbnRlckNvbmZpZ3VyYXRpb247XG5cbiAgLyoqXG4gICAqIFNwZWNpZmljIGNvbmZpZ3VyYXRpb24gZm9yIHRoZSBNYXJrZG93biBsYW5ndWFnZVxuICAgKlxuICAgKiBAc2NoZW1hIE92ZXJyaWRlUGF0dGVybiNtYXJrZG93blxuICAgKi9cbiAgcmVhZG9ubHkgbWFya2Rvd24/OiBNYXJrZG93bkNvbmZpZ3VyYXRpb247XG5cbiAgLyoqXG4gICAqIEFkZGl0aW9uYWwgcGx1Z2lucyBmb3IgbWF0Y2hlZCBmaWxlcy5cbiAgICpcbiAgICogQHNjaGVtYSBPdmVycmlkZVBhdHRlcm4jcGx1Z2luc1xuICAgKi9cbiAgcmVhZG9ubHkgcGx1Z2lucz86IGFueVtdO1xuXG4gIC8qKlxuICAgKiBTcGVjaWZpYyBjb25maWd1cmF0aW9uIGZvciB0aGUgWUFNTCBsYW5ndWFnZVxuICAgKlxuICAgKiBAc2NoZW1hIE92ZXJyaWRlUGF0dGVybiN5YW1sXG4gICAqL1xuICByZWFkb25seSB5YW1sPzogWWFtbENvbmZpZ3VyYXRpb247XG59XG5cbi8qKlxuICogQ29udmVydHMgYW4gb2JqZWN0IG9mIHR5cGUgJ092ZXJyaWRlUGF0dGVybicgdG8gSlNPTiByZXByZXNlbnRhdGlvbi5cbiAqIEBpbnRlcm5hbFxuICovXG4vKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5leHBvcnQgZnVuY3Rpb24gdG9Kc29uX092ZXJyaWRlUGF0dGVybihvYmo6IE92ZXJyaWRlUGF0dGVybiB8IHVuZGVmaW5lZCk6IFJlY29yZDxzdHJpbmcsIGFueT4gfCB1bmRlZmluZWQge1xuICBpZiAob2JqID09PSB1bmRlZmluZWQpIHsgcmV0dXJuIHVuZGVmaW5lZDsgfVxuICBjb25zdCByZXN1bHQgPSB7XG4gICAgJ2Fzc2lzdCc6IHRvSnNvbl9PdmVycmlkZUFzc2lzdENvbmZpZ3VyYXRpb24ob2JqLmFzc2lzdCksXG4gICAgJ2Nzcyc6IHRvSnNvbl9Dc3NDb25maWd1cmF0aW9uKG9iai5jc3MpLFxuICAgICdmaWxlcyc6IHRvSnNvbl9PdmVycmlkZUZpbGVzQ29uZmlndXJhdGlvbihvYmouZmlsZXMpLFxuICAgICdmb3JtYXR0ZXInOiB0b0pzb25fT3ZlcnJpZGVGb3JtYXR0ZXJDb25maWd1cmF0aW9uKG9iai5mb3JtYXR0ZXIpLFxuICAgICdncmFwaHFsJzogdG9Kc29uX0dyYXBocWxDb25maWd1cmF0aW9uKG9iai5ncmFwaHFsKSxcbiAgICAnZ3JpdCc6IHRvSnNvbl9Hcml0Q29uZmlndXJhdGlvbihvYmouZ3JpdCksXG4gICAgJ2h0bWwnOiB0b0pzb25fSHRtbENvbmZpZ3VyYXRpb24ob2JqLmh0bWwpLFxuICAgICdpbmNsdWRlcyc6IG9iai5pbmNsdWRlcz8ubWFwKHkgPT4geSksXG4gICAgJ2phdmFzY3JpcHQnOiB0b0pzb25fSnNDb25maWd1cmF0aW9uKG9iai5qYXZhc2NyaXB0KSxcbiAgICAnanNvbic6IHRvSnNvbl9Kc29uQ29uZmlndXJhdGlvbihvYmouanNvbiksXG4gICAgJ2xpbnRlcic6IHRvSnNvbl9PdmVycmlkZUxpbnRlckNvbmZpZ3VyYXRpb24ob2JqLmxpbnRlciksXG4gICAgJ21hcmtkb3duJzogdG9Kc29uX01hcmtkb3duQ29uZmlndXJhdGlvbihvYmoubWFya2Rvd24pLFxuICAgICdwbHVnaW5zJzogb2JqLnBsdWdpbnM/Lm1hcCh5ID0+IHkpLFxuICAgICd5YW1sJzogdG9Kc29uX1lhbWxDb25maWd1cmF0aW9uKG9iai55YW1sKSxcbiAgfTtcbiAgLy8gZmlsdGVyIHVuZGVmaW5lZCB2YWx1ZXNcbiAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKHJlc3VsdCkucmVkdWNlKChyLCBpKSA9PiAoaVsxXSA9PT0gdW5kZWZpbmVkKSA/IHIgOiAoeyAuLi5yLCBbaVswXV06IGlbMV0gfSksIHt9KTtcbn1cbi8qIGVzbGludC1lbmFibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuXG4vKipcbiAqIFRlbGxzIEJpb21lIHdoZXJlIHlvdXIgY29kZSBsaXN0cyBUYWlsd2luZCBDU1MgY2xhc3Nlcywgc28gdGhlIFRhaWx3aW5kXG4gKiBsaW50IHJ1bGVzIGtub3cgd2hpY2ggc3RyaW5ncyB0byBjaGVjay5cbiAqXG4gKiBAc2NoZW1hIFRhaWx3aW5kQ29uZmlndXJhdGlvblxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRhaWx3aW5kQ29uZmlndXJhdGlvbiB7XG4gIC8qKlxuICAgKiBBdHRyaWJ1dGVzIHdob3NlIHZhbHVlcyBhcmUgVGFpbHdpbmQgY2xhc3Nlcywgc3VjaCBhcyBgY2xhc3NgIGluXG4gICAqIGA8ZGl2IGNsYXNzPVwicHgtMiBweS0yXCI+YC5cbiAgICpcbiAgICogRGVmYXVsdHMgdG8gYGNsYXNzYCBhbmQgYGNsYXNzTmFtZWAuIEluIEhUTUwsIHRoZXkgYXJlIGNhc2UtaW5zZW5zaXRpdmUuXG4gICAqXG4gICAqIEBkZWZhdWx0IGNsYXNzYCBhbmQgYGNsYXNzTmFtZWAuIEluIEhUTUwsIHRoZXkgYXJlIGNhc2UtaW5zZW5zaXRpdmUuXG4gICAqIEBzY2hlbWEgVGFpbHdpbmRDb25maWd1cmF0aW9uI2F0dHJpYnV0ZXNcbiAgICovXG4gIHJlYWRvbmx5IGF0dHJpYnV0ZXM/OiBzdHJpbmdbXTtcblxuICAvKipcbiAgICogRnVuY3Rpb25zIHRoYXQgY29tYmluZSBUYWlsd2luZCBjbGFzc2VzLCBzdWNoIGFzIGBjbHN4YCBhbmQgYGNuYC5cbiAgICpcbiAgICogQmlvbWUgY2hlY2tzIGV2ZXJ5IHN0cmluZyBwYXNzZWQgdG8gdGhlc2UgZnVuY3Rpb25zLCBsaWtlIGJvdGggc3RyaW5nc1xuICAgKiBpbiBgY24oXCJweC0yXCIsIFwicHktMlwiKWAuIFdoZW4gYW4gb2JqZWN0IGlzIHBhc3NlZCwgQmlvbWUgY2hlY2tzIGl0c1xuICAgKiBrZXlzOiBpbiBgY24oeyBcInB4LTJcIjogaXNBY3RpdmUgfSlgLCBpdCBjaGVja3MgYFwicHgtMlwiYC5cbiAgICpcbiAgICogUHJvcGVydGllcyBvZiB0aGVzZSBmdW5jdGlvbnMgYXJlIGNoZWNrZWQgdG9vLCBzbyBsaXN0aW5nIGB0d2AgYWxzb1xuICAgKiBjb3ZlcnMgYGAgdHcuZGl2YHB4LTJgIGBgIGFuZCBgdHcuZGl2KFwicHgtMlwiKWAuXG4gICAqXG4gICAqIERlZmF1bHRzIHRvIGBjbHN4YCwgYHR3YCwgYHR3TWVyZ2VgLCBgdHdKb2luYCwgYGNuYCwgYGNjYCwgYGNuYmAsIGFuZFxuICAgKiBgY3RsYC5cbiAgICpcbiAgICogQGRlZmF1bHQgY2xzeGAsIGB0d2AsIGB0d01lcmdlYCwgYHR3Sm9pbmAsIGBjbmAsIGBjY2AsIGBjbmJgLCBhbmRcbiAgICogQHNjaGVtYSBUYWlsd2luZENvbmZpZ3VyYXRpb24jbWVyZ2VGdW5jdGlvbnNcbiAgICovXG4gIHJlYWRvbmx5IG1lcmdlRnVuY3Rpb25zPzogc3RyaW5nW107XG5cbiAgLyoqXG4gICAqIFRoZSBDU1MgZmlsZSB0aGF0IGhvbGRzIHlvdXIgVGFpbHdpbmQgQ1NTIGNvbmZpZ3VyYXRpb24sIHN1Y2ggYXNcbiAgICogYFwiLi9zcmMvYXBwLmNzc1wiYC4gQSByZWxhdGl2ZSBwYXRoIHN0YXJ0cyBmcm9tIHRoZSBmb2xkZXIgb2YgdGhlIEJpb21lXG4gICAqIGNvbmZpZ3VyYXRpb24gZmlsZS5cbiAgICpcbiAgICogQmlvbWUgcmVhZHMgdGhlIGBAdGhlbWVgLCBgQHV0aWxpdHlgLCBhbmQgYEBjdXN0b20tdmFyaWFudGAgcnVsZXMgaW5cbiAgICogdGhpcyBmaWxlIGFuZCBpbiB0aGUgZmlsZXMgaXQgaW1wb3J0cyB3aXRoIGBAaW1wb3J0YCwgc28gdGhhdCB0aGVcbiAgICogVGFpbHdpbmQgcnVsZXMga25vdyB5b3VyIHRoZW1lIHZhbHVlcywgdXRpbGl0aWVzLCBhbmQgdmFyaWFudHMuXG4gICAqXG4gICAqIFRvIHJlYWQgdGhlIGZpbGUsIEJpb21lIHNjYW5zIHlvdXIgcHJvamVjdCB3aGVuIGEgVGFpbHdpbmQgcnVsZSBpc1xuICAgKiBlbmFibGVkLiBTZXR0aW5nIHRoaXMgb3B0aW9uIGFsc28gdHVybnMgb24gYGNzcy5wYXJzZXIudGFpbHdpbmREaXJlY3RpdmVzYCxcbiAgICogdW5sZXNzIHlvdSBzZXQgdGhhdCBvcHRpb24geW91cnNlbGYuXG4gICAqXG4gICAqIEBzY2hlbWEgVGFpbHdpbmRDb25maWd1cmF0aW9uI3N0eWxlc2hlZXRcbiAgICovXG4gIHJlYWRvbmx5IHN0eWxlc2hlZXQ/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEZ1bmN0aW9ucyB0aGF0IGRlc2NyaWJlIGEgY29tcG9uZW50J3Mgc3R5bGVzIHdpdGggYW4gb2JqZWN0LCBzdWNoIGFzXG4gICAqIGBjdmFgIGFuZCBgdHZgLlxuICAgKlxuICAgKiBCaW9tZSBjaGVja3MgZXZlcnkgc3RyaW5nIHBhc3NlZCBkaXJlY3RseSB0byB0aGVzZSBmdW5jdGlvbnMuIEluIGFuXG4gICAqIG9iamVjdCBwYXNzZWQgdG8gdGhlbSwgQmlvbWUgY2hlY2tzIHRoZSBjbGFzc2VzIHVuZGVyIHRoZXNlIHByb3BlcnRpZXM6XG4gICAqXG4gICAqIC0gYGJhc2VgLCBgY2xhc3NgLCBhbmQgYGNsYXNzTmFtZWA6IGNsYXNzZXMgdGhhdCBhbHdheXMgYXBwbHkuXG4gICAqIC0gYHZhcmlhbnRzYDogY2xhc3NlcyBmb3IgZWFjaCB2ZXJzaW9uIG9mIHRoZSBjb21wb25lbnQsIHN1Y2ggYXMgZWFjaFxuICAgKiBidXR0b24gc2l6ZS5cbiAgICogLSBgc2xvdHNgOiBjbGFzc2VzIGZvciBlYWNoIHBhcnQgb2YgdGhlIGNvbXBvbmVudCwgc3VjaCBhcyBpdHMgaWNvbi5cbiAgICogLSBgY29tcG91bmRWYXJpYW50c2AgYW5kIGBjb21wb3VuZFNsb3RzYDogb25seSB0aGUgYGNsYXNzYCBhbmRcbiAgICogYGNsYXNzTmFtZWAgb2YgZWFjaCBlbnRyeS5cbiAgICpcbiAgICogT3RoZXIgcHJvcGVydGllcywgc3VjaCBhcyBgZGVmYXVsdFZhcmlhbnRzYCwgaG9sZCBuYW1lcyByYXRoZXIgdGhhblxuICAgKiBjbGFzc2VzLCBzbyBCaW9tZSBza2lwcyB0aGVtLiBGb3IgZXhhbXBsZSwgQmlvbWUgY2hlY2tzIGBcInJvdW5kZWRcImAsXG4gICAqIGBcInB4LTJcImAsIGFuZCBgXCJweC00XCJgIGhlcmUsIGJ1dCBub3QgYFwic21hbGxcImA6XG4gICAqXG4gICAqIGBgYGpzXG4gICAqIGN2YShcInJvdW5kZWRcIiwge1xuICAgKiB2YXJpYW50czoge1xuICAgKiBzaXplOiB7IHNtYWxsOiBcInB4LTJcIiwgbGFyZ2U6IFwicHgtNFwiIH0sXG4gICAqIH0sXG4gICAqIGRlZmF1bHRWYXJpYW50czogeyBzaXplOiBcInNtYWxsXCIgfSxcbiAgICogfSk7XG4gICAqIGBgYFxuICAgKlxuICAgKiBEZWZhdWx0cyB0byBgY3ZhYCBhbmQgYHR2YC5cbiAgICpcbiAgICogQGRlZmF1bHQgY3ZhYCBhbmQgYHR2YC5cbiAgICogQHNjaGVtYSBUYWlsd2luZENvbmZpZ3VyYXRpb24jdmFyaWFudEZ1bmN0aW9uc1xuICAgKi9cbiAgcmVhZG9ubHkgdmFyaWFudEZ1bmN0aW9ucz86IHN0cmluZ1tdO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGFuIG9iamVjdCBvZiB0eXBlICdUYWlsd2luZENvbmZpZ3VyYXRpb24nIHRvIEpTT04gcmVwcmVzZW50YXRpb24uXG4gKiBAaW50ZXJuYWxcbiAqL1xuLyogZXNsaW50LWRpc2FibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvSnNvbl9UYWlsd2luZENvbmZpZ3VyYXRpb24ob2JqOiBUYWlsd2luZENvbmZpZ3VyYXRpb24gfCB1bmRlZmluZWQpOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgdW5kZWZpbmVkIHtcbiAgaWYgKG9iaiA9PT0gdW5kZWZpbmVkKSB7IHJldHVybiB1bmRlZmluZWQ7IH1cbiAgY29uc3QgcmVzdWx0ID0ge1xuICAgICdhdHRyaWJ1dGVzJzogb2JqLmF0dHJpYnV0ZXM/Lm1hcCh5ID0+IHkpLFxuICAgICdtZXJnZUZ1bmN0aW9ucyc6IG9iai5tZXJnZUZ1bmN0aW9ucz8ubWFwKHkgPT4geSksXG4gICAgJ3N0eWxlc2hlZXQnOiBvYmouc3R5bGVzaGVldCxcbiAgICAndmFyaWFudEZ1bmN0aW9ucyc6IG9iai52YXJpYW50RnVuY3Rpb25zPy5tYXAoeSA9PiB5KSxcbiAgfTtcbiAgLy8gZmlsdGVyIHVuZGVmaW5lZCB2YWx1ZXNcbiAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKHJlc3VsdCkucmVkdWNlKChyLCBpKSA9PiAoaVsxXSA9PT0gdW5kZWZpbmVkKSA/IHIgOiAoeyAuLi5yLCBbaVswXV06IGlbMV0gfSksIHt9KTtcbn1cbi8qIGVzbGludC1lbmFibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuXG4vKipcbiAqIENvbmZpZ3VyZXMgaG93IEJpb21lIGludGVncmF0ZXMgd2l0aCBhIHZlcnNpb24gY29udHJvbCBzeXN0ZW0uXG4gKlxuICogQHNjaGVtYSBWY3NDb25maWd1cmF0aW9uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVmNzQ29uZmlndXJhdGlvbiB7XG4gIC8qKlxuICAgKiBTZWxlY3RzIHRoZSB2ZXJzaW9uLWNvbnRyb2wgY2xpZW50LiBDdXJyZW50bHksIG9ubHkgYGdpdGAgaXMgc3VwcG9ydGVkLlxuICAgKlxuICAgKiBAc2NoZW1hIFZjc0NvbmZpZ3VyYXRpb24jY2xpZW50S2luZFxuICAgKi9cbiAgcmVhZG9ubHkgY2xpZW50S2luZD86IFZjc0NsaWVudEtpbmQ7XG5cbiAgLyoqXG4gICAqIFNldHMgdGhlIGJhc2UgYnJhbmNoIHVzZWQgYnkgYC0tY2hhbmdlZGAgd2hlbiBgLS1zaW5jZWAgaXMgbm90IHByb3ZpZGVkLiBJZiBuZWl0aGVyIHRoaXMgb3B0aW9uXG4gICAqIG5vciBgLS1zaW5jZWAgaXMgc2V0LCBjb21tYW5kcyB1c2luZyBgLS1jaGFuZ2VkYCBmYWlsIGJlY2F1c2UgQmlvbWUgY2Fubm90IGRldGVybWluZSB0aGVcbiAgICogY29tcGFyaXNvbiBiYXNlLlxuICAgKlxuICAgKiBAc2NoZW1hIFZjc0NvbmZpZ3VyYXRpb24jZGVmYXVsdEJyYW5jaFxuICAgKi9cbiAgcmVhZG9ubHkgZGVmYXVsdEJyYW5jaD86IHN0cmluZztcblxuICAvKipcbiAgICogRW5hYmxlcyBvciBkaXNhYmxlcyB2ZXJzaW9uLWNvbnRyb2wgaW50ZWdyYXRpb24uIERlZmF1bHRzIHRvIGBmYWxzZWAuIEVuYWJsaW5nIGludGVncmF0aW9uXG4gICAqIHJlcXVpcmVzIGB2Y3MuY2xpZW50S2luZGAgdG8gYmUgc2V0LlxuICAgKlxuICAgKiBAZGVmYXVsdCBmYWxzZWAuIEVuYWJsaW5nIGludGVncmF0aW9uXG4gICAqIEBzY2hlbWEgVmNzQ29uZmlndXJhdGlvbiNlbmFibGVkXG4gICAqL1xuICByZWFkb25seSBlbmFibGVkPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogU2V0cyB0aGUgZGlyZWN0b3J5IHdoZXJlIEJpb21lIGxvb2tzIGZvciB2ZXJzaW9uLWNvbnRyb2wgZmlsZXMuIEEgcmVsYXRpdmUgdmFsdWUgaXMgcmVzb2x2ZWRcbiAgICogZnJvbSB0aGUgZGlyZWN0b3J5IGNvbnRhaW5pbmcgdGhlIGN1cnJlbnQgY29uZmlndXJhdGlvbiBmaWxlLCB3aGlsZSBhbiBhYnNvbHV0ZSBwYXRoIGlzIHVzZWRcbiAgICogZGlyZWN0bHkuXG4gICAqXG4gICAqIERlZmF1bHRzIHRvIHRoZSBkaXJlY3RvcnkgY29udGFpbmluZyBgYmlvbWUuanNvbmAgb3IgYGJpb21lLmpzb25jYC4gSWYgbm8gY29uZmlndXJhdGlvbiBpc1xuICAgKiBmb3VuZCwgQmlvbWUgdXNlcyB0aGUgY3VycmVudCB3b3JraW5nIGRpcmVjdG9yeS5cbiAgICpcbiAgICogSWYgbmVpdGhlciBkaXJlY3RvcnkgaXMgYXZhaWxhYmxlLCBCaW9tZSBkaXNhYmxlcyB2ZXJzaW9uIGNvbnRyb2wgaW50ZWdyYXRpb24gYW5kIGVtaXRzIGFcbiAgICogZGlhZ25vc3RpYy5cbiAgICpcbiAgICogQGRlZmF1bHQgdGhlIGRpcmVjdG9yeSBjb250YWluaW5nIGBiaW9tZS5qc29uYCBvciBgYmlvbWUuanNvbmNgLiBJZiBubyBjb25maWd1cmF0aW9uIGlzXG4gICAqIEBzY2hlbWEgVmNzQ29uZmlndXJhdGlvbiNyb290XG4gICAqL1xuICByZWFkb25seSByb290Pzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBDb250cm9scyB3aGV0aGVyIEJpb21lIGFwcGxpZXMgcGF0dGVybnMgZnJvbSBgLmdpdGlnbm9yZWAsIEdpdCdzIGxvY2FsIGAuZ2l0L2luZm8vZXhjbHVkZWAsXG4gICAqIGFuZCBzdXBwb3J0ZWQgYC5pZ25vcmVgIGZpbGVzLCBpbmNsdWRpbmcgbmVzdGVkIGlnbm9yZSBmaWxlcy4gUGF0dGVybnMgaW4gdGhlIHJvb3QgaWdub3JlIGZpbGVcbiAgICogYXJlIHJlc29sdmVkIGZyb20gYHZjcy5yb290YC4gUGF0dGVybnMgaW4gbmVzdGVkIGlnbm9yZSBmaWxlcyBhcmUgcmVzb2x2ZWQgZnJvbSB0aGUgZGlyZWN0b3J5XG4gICAqIGNvbnRhaW5pbmcgdGhhdCBmaWxlLiBEZWZhdWx0cyB0byBgZmFsc2VgLlxuICAgKlxuICAgKiBAZGVmYXVsdCBmYWxzZWAuXG4gICAqIEBzY2hlbWEgVmNzQ29uZmlndXJhdGlvbiN1c2VJZ25vcmVGaWxlXG4gICAqL1xuICByZWFkb25seSB1c2VJZ25vcmVGaWxlPzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhbiBvYmplY3Qgb2YgdHlwZSAnVmNzQ29uZmlndXJhdGlvbicgdG8gSlNPTiByZXByZXNlbnRhdGlvbi5cbiAqIEBpbnRlcm5hbFxuICovXG4vKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5leHBvcnQgZnVuY3Rpb24gdG9Kc29uX1Zjc0NvbmZpZ3VyYXRpb24ob2JqOiBWY3NDb25maWd1cmF0aW9uIHwgdW5kZWZpbmVkKTogUmVjb3JkPHN0cmluZywgYW55PiB8IHVuZGVmaW5lZCB7XG4gIGlmIChvYmogPT09IHVuZGVmaW5lZCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9XG4gIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAnY2xpZW50S2luZCc6IG9iai5jbGllbnRLaW5kLFxuICAgICdkZWZhdWx0QnJhbmNoJzogb2JqLmRlZmF1bHRCcmFuY2gsXG4gICAgJ2VuYWJsZWQnOiBvYmouZW5hYmxlZCxcbiAgICAncm9vdCc6IG9iai5yb290LFxuICAgICd1c2VJZ25vcmVGaWxlJzogb2JqLnVzZUlnbm9yZUZpbGUsXG4gIH07XG4gIC8vIGZpbHRlciB1bmRlZmluZWQgdmFsdWVzXG4gIHJldHVybiBPYmplY3QuZW50cmllcyhyZXN1bHQpLnJlZHVjZSgociwgaSkgPT4gKGlbMV0gPT09IHVuZGVmaW5lZCkgPyByIDogKHsgLi4uciwgW2lbMF1dOiBpWzFdIH0pLCB7fSk7XG59XG4vKiBlc2xpbnQtZW5hYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cblxuLyoqXG4gKiBPcHRpb25zIGFwcGxpZWQgdG8gWWFtbCBmaWxlc1xuICpcbiAqIEBzY2hlbWEgWWFtbENvbmZpZ3VyYXRpb25cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBZYW1sQ29uZmlndXJhdGlvbiB7XG4gIC8qKlxuICAgKiBGb3JtYXR0ZXIgb3B0aW9uc1xuICAgKlxuICAgKiBAc2NoZW1hIFlhbWxDb25maWd1cmF0aW9uI2Zvcm1hdHRlclxuICAgKi9cbiAgcmVhZG9ubHkgZm9ybWF0dGVyPzogWWFtbEZvcm1hdHRlckNvbmZpZ3VyYXRpb247XG5cbiAgLyoqXG4gICAqIEBzY2hlbWEgWWFtbENvbmZpZ3VyYXRpb24jbGludGVyXG4gICAqL1xuICByZWFkb25seSBsaW50ZXI/OiBZYW1sTGludGVyQ29uZmlndXJhdGlvbjtcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhbiBvYmplY3Qgb2YgdHlwZSAnWWFtbENvbmZpZ3VyYXRpb24nIHRvIEpTT04gcmVwcmVzZW50YXRpb24uXG4gKiBAaW50ZXJuYWxcbiAqL1xuLyogZXNsaW50LWRpc2FibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvSnNvbl9ZYW1sQ29uZmlndXJhdGlvbihvYmo6IFlhbWxDb25maWd1cmF0aW9uIHwgdW5kZWZpbmVkKTogUmVjb3JkPHN0cmluZywgYW55PiB8IHVuZGVmaW5lZCB7XG4gIGlmIChvYmogPT09IHVuZGVmaW5lZCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9XG4gIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAnZm9ybWF0dGVyJzogdG9Kc29uX1lhbWxGb3JtYXR0ZXJDb25maWd1cmF0aW9uKG9iai5mb3JtYXR0ZXIpLFxuICAgICdsaW50ZXInOiB0b0pzb25fWWFtbExpbnRlckNvbmZpZ3VyYXRpb24ob2JqLmxpbnRlciksXG4gIH07XG4gIC8vIGZpbHRlciB1bmRlZmluZWQgdmFsdWVzXG4gIHJldHVybiBPYmplY3QuZW50cmllcyhyZXN1bHQpLnJlZHVjZSgociwgaSkgPT4gKGlbMV0gPT09IHVuZGVmaW5lZCkgPyByIDogKHsgLi4uciwgW2lbMF1dOiBpWzFdIH0pLCB7fSk7XG59XG4vKiBlc2xpbnQtZW5hYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cblxuLyoqXG4gKiBAc2NoZW1hIEFjdGlvbnNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBY3Rpb25zIHtcbiAgLyoqXG4gICAqIFNlbGVjdHMgdGhlIGJhc2VsaW5lIHNldCBvZiBhc3Npc3QgYWN0aW9ucy4gYHJlY29tbWVuZGVkYCBlbmFibGVzIEJpb21lJ3NcbiAgICogcmVjb21tZW5kZWQgYWN0aW9ucywgYGFsbGAgZW5hYmxlcyBhbGwgYWN0aW9ucywgYW5kIGBub25lYCBzdGFydHMgd2l0aCBubyBhY3Rpb25zXG4gICAqIGVuYWJsZWQuIEdyb3VwIHByZXNldHMgYW5kIGV4cGxpY2l0IGFjdGlvbiBzZXR0aW5ncyBvdmVycmlkZSB0aGlzIHByZXNldC5cbiAgICogRGVmYXVsdHMgdG8gYHJlY29tbWVuZGVkYC5cbiAgICpcbiAgICogQGRlZmF1bHQgcmVjb21tZW5kZWRgLlxuICAgKiBAc2NoZW1hIEFjdGlvbnMjcHJlc2V0XG4gICAqL1xuICByZWFkb25seSBwcmVzZXQ/OiBQcmVzZXRDb25maWc7XG5cbiAgLyoqXG4gICAqIEVuYWJsZXMgb3IgZGlzYWJsZXMgQmlvbWUncyByZWNvbW1lbmRlZCBhc3Npc3QgYWN0aW9ucyBhY3Jvc3MgYWxsIGFjdGlvbiBncm91cHMuXG4gICAqIERlZmF1bHRzIHRvIGB0cnVlYC5cbiAgICpcbiAgICogQGRlZmF1bHQgdHJ1ZWAuXG4gICAqIEBzY2hlbWEgQWN0aW9ucyNyZWNvbW1lbmRlZFxuICAgKi9cbiAgcmVhZG9ubHkgcmVjb21tZW5kZWQ/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBDb25maWd1cmVzIHNvdXJjZS1sZXZlbCBhY3Rpb25zIHN1Y2ggYXMgb3JnYW5pemluZyBpbXBvcnRzIGFuZCBzb3J0aW5nIGRlY2xhcmF0aW9ucy4gVGhlc2UgYWN0aW9ucyBhcmUgZXhwb3NlZCB0aHJvdWdoIGVkaXRvciBzb3VyY2UgYWN0aW9ucyBhbmQgdGhyb3VnaCBDTEkgY2hlY2tpbmcgYW5kIGFwcGxpY2F0aW9uLlxuICAgKlxuICAgKiBAc2NoZW1hIEFjdGlvbnMjc291cmNlXG4gICAqL1xuICByZWFkb25seSBzb3VyY2U/OiBTb3VyY2U7XG59XG5cbi8qKlxuICogQ29udmVydHMgYW4gb2JqZWN0IG9mIHR5cGUgJ0FjdGlvbnMnIHRvIEpTT04gcmVwcmVzZW50YXRpb24uXG4gKiBAaW50ZXJuYWxcbiAqL1xuLyogZXNsaW50LWRpc2FibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvSnNvbl9BY3Rpb25zKG9iajogQWN0aW9ucyB8IHVuZGVmaW5lZCk6IFJlY29yZDxzdHJpbmcsIGFueT4gfCB1bmRlZmluZWQge1xuICBpZiAob2JqID09PSB1bmRlZmluZWQpIHsgcmV0dXJuIHVuZGVmaW5lZDsgfVxuICBjb25zdCByZXN1bHQgPSB7XG4gICAgJ3ByZXNldCc6IG9iai5wcmVzZXQsXG4gICAgJ3JlY29tbWVuZGVkJzogb2JqLnJlY29tbWVuZGVkLFxuICAgICdzb3VyY2UnOiB0b0pzb25fU291cmNlKG9iai5zb3VyY2UpLFxuICB9O1xuICAvLyBmaWx0ZXIgdW5kZWZpbmVkIHZhbHVlc1xuICByZXR1cm4gT2JqZWN0LmVudHJpZXMocmVzdWx0KS5yZWR1Y2UoKHIsIGkpID0+IChpWzFdID09PSB1bmRlZmluZWQpID8gciA6ICh7IC4uLnIsIFtpWzBdXTogaVsxXSB9KSwge30pO1xufVxuLyogZXNsaW50LWVuYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5cbi8qKlxuICogT3B0aW9ucyB0aGF0IGNoYW5nZSBob3cgQ1NTIGFzc2lzdCBiZWhhdmVzLlxuICpcbiAqIEBzY2hlbWEgQ3NzQXNzaXN0Q29uZmlndXJhdGlvblxuICovXG5leHBvcnQgaW50ZXJmYWNlIENzc0Fzc2lzdENvbmZpZ3VyYXRpb24ge1xuICAvKipcbiAgICogRW5hYmxlcyBvciBkaXNhYmxlcyBhc3Npc3QgYWN0aW9ucyBmb3IgQ1NTLlxuICAgKlxuICAgKiBAc2NoZW1hIENzc0Fzc2lzdENvbmZpZ3VyYXRpb24jZW5hYmxlZFxuICAgKi9cbiAgcmVhZG9ubHkgZW5hYmxlZD86IGJvb2xlYW47XG59XG5cbi8qKlxuICogQ29udmVydHMgYW4gb2JqZWN0IG9mIHR5cGUgJ0Nzc0Fzc2lzdENvbmZpZ3VyYXRpb24nIHRvIEpTT04gcmVwcmVzZW50YXRpb24uXG4gKiBAaW50ZXJuYWxcbiAqL1xuLyogZXNsaW50LWRpc2FibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvSnNvbl9Dc3NBc3Npc3RDb25maWd1cmF0aW9uKG9iajogQ3NzQXNzaXN0Q29uZmlndXJhdGlvbiB8IHVuZGVmaW5lZCk6IFJlY29yZDxzdHJpbmcsIGFueT4gfCB1bmRlZmluZWQge1xuICBpZiAob2JqID09PSB1bmRlZmluZWQpIHsgcmV0dXJuIHVuZGVmaW5lZDsgfVxuICBjb25zdCByZXN1bHQgPSB7XG4gICAgJ2VuYWJsZWQnOiBvYmouZW5hYmxlZCxcbiAgfTtcbiAgLy8gZmlsdGVyIHVuZGVmaW5lZCB2YWx1ZXNcbiAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKHJlc3VsdCkucmVkdWNlKChyLCBpKSA9PiAoaVsxXSA9PT0gdW5kZWZpbmVkKSA/IHIgOiAoeyAuLi5yLCBbaVswXV06IGlbMV0gfSksIHt9KTtcbn1cbi8qIGVzbGludC1lbmFibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuXG4vKipcbiAqIE9wdGlvbnMgdGhhdCBjaGFuZ2UgaG93IHRoZSBDU1MgZm9ybWF0dGVyIGJlaGF2ZXMuXG4gKlxuICogQHNjaGVtYSBDc3NGb3JtYXR0ZXJDb25maWd1cmF0aW9uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3NzRm9ybWF0dGVyQ29uZmlndXJhdGlvbiB7XG4gIC8qKlxuICAgKiBDb250cm9scyBzcGFjZXMgaW5zaWRlIENTUyBwYXJlbnRoZXNlcyBhbmQgc3F1YXJlIGJyYWNrZXRzIHdoZW4gdGhlaXIgY29udGVudCBmaXRzIG9uIG9uZVxuICAgKiBsaW5lLiBXaGVuIGVuYWJsZWQsIGByZ2IoMCwgMCwgMClgIGJlY29tZXMgYHJnYiggMCwgMCwgMCApYCBhbmQgYFtkYXRhLWF0dHJdYCBiZWNvbWVzXG4gICAqIGBbIGRhdGEtYXR0ciBdYC4gRW1wdHkgZGVsaW1pdGVycyBhcmUgdW5jaGFuZ2VkLlxuICAgKlxuICAgKiBJZiB1bnNldCwgaW5oZXJpdHMgdGhlIGdsb2JhbCBkZWxpbWl0ZXIgc3BhY2luZyBzZXR0aW5nLlxuICAgKlxuICAgKiBAc2NoZW1hIENzc0Zvcm1hdHRlckNvbmZpZ3VyYXRpb24jZGVsaW1pdGVyU3BhY2luZ1xuICAgKi9cbiAgcmVhZG9ubHkgZGVsaW1pdGVyU3BhY2luZz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEVuYWJsZXMgb3IgZGlzYWJsZXMgdGhlIGZvcm1hdHRlciBmb3IgQ1NTIGFuZCBsYW5ndWFnZXMgdGhhdCBleHRlbmQgaXQuXG4gICAqXG4gICAqIEBzY2hlbWEgQ3NzRm9ybWF0dGVyQ29uZmlndXJhdGlvbiNlbmFibGVkXG4gICAqL1xuICByZWFkb25seSBlbmFibGVkPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogVGhlIGluZGVudCBzdHlsZSBhcHBsaWVkIHRvIENTUyBhbmQgbGFuZ3VhZ2VzIHRoYXQgZXh0ZW5kIGl0LiBJZiB1bnNldCwgaW5oZXJpdHMgdGhlIGdsb2JhbFxuICAgKiBpbmRlbnRhdGlvbiBzdHlsZS5cbiAgICpcbiAgICogQHNjaGVtYSBDc3NGb3JtYXR0ZXJDb25maWd1cmF0aW9uI2luZGVudFN0eWxlXG4gICAqL1xuICByZWFkb25seSBpbmRlbnRTdHlsZT86IEluZGVudFN0eWxlO1xuXG4gIC8qKlxuICAgKiBUaGUgaW5kZW50YXRpb24gd2lkdGggYXBwbGllZCB0byBDU1MgYW5kIGxhbmd1YWdlcyB0aGF0IGV4dGVuZCBpdC4gSWYgdW5zZXQsIGluaGVyaXRzIHRoZVxuICAgKiBnbG9iYWwgaW5kZW50YXRpb24gd2lkdGguXG4gICAqXG4gICAqIEBzY2hlbWEgQ3NzRm9ybWF0dGVyQ29uZmlndXJhdGlvbiNpbmRlbnRXaWR0aFxuICAgKi9cbiAgcmVhZG9ubHkgaW5kZW50V2lkdGg/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFRoZSBsaW5lIGVuZGluZyBhcHBsaWVkIHRvIENTUyBhbmQgbGFuZ3VhZ2VzIHRoYXQgZXh0ZW5kIGl0LiBJZiB1bnNldCwgaW5oZXJpdHMgdGhlIGdsb2JhbFxuICAgKiBsaW5lIGVuZGluZy5cbiAgICpcbiAgICogQHNjaGVtYSBDc3NGb3JtYXR0ZXJDb25maWd1cmF0aW9uI2xpbmVFbmRpbmdcbiAgICovXG4gIHJlYWRvbmx5IGxpbmVFbmRpbmc/OiBMaW5lRW5kaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgcHJlZmVycmVkIG1heGltdW0gbGluZSB3aWR0aCBmb3IgQ1NTIGFuZCBsYW5ndWFnZXMgdGhhdCBleHRlbmQgaXQuIElmIHVuc2V0LCBpbmhlcml0c1xuICAgKiB0aGUgZ2xvYmFsIGxpbmUgd2lkdGguXG4gICAqXG4gICAqIEBzY2hlbWEgQ3NzRm9ybWF0dGVyQ29uZmlndXJhdGlvbiNsaW5lV2lkdGhcbiAgICovXG4gIHJlYWRvbmx5IGxpbmVXaWR0aD86IG51bWJlcjtcblxuICAvKipcbiAgICogU2VsZWN0cyB0aGUgcHJlZmVycmVkIHF1b3RlIHN0eWxlIGZvciBDU1Mgc3RyaW5ncy4gQmlvbWUgbWF5IHVzZSB0aGUgYWx0ZXJuYXRlIHF1b3RlIHdoZW5cbiAgICogdGhhdCBhdm9pZHMgYWRkaXRpb25hbCBlc2NhcGluZy4gUXVvdGVzIGluIGBAY2hhcnNldGAgcnVsZXMgYXJlIGN1cnJlbnRseSBwcmVzZXJ2ZWQuXG4gICAqIERlZmF1bHRzIHRvIGBkb3VibGVgLlxuICAgKlxuICAgKiBAZGVmYXVsdCBkb3VibGVgLlxuICAgKiBAc2NoZW1hIENzc0Zvcm1hdHRlckNvbmZpZ3VyYXRpb24jcXVvdGVTdHlsZVxuICAgKi9cbiAgcmVhZG9ubHkgcXVvdGVTdHlsZT86IFF1b3RlU3R5bGU7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gYWRkIGEgdHJhaWxpbmcgbmV3bGluZSBhdCB0aGUgZW5kIG9mIHRoZSBmaWxlLiBJZiB1bnNldCwgaW5oZXJpdHMgdGhlIGdsb2JhbFxuICAgKiB0cmFpbGluZyBuZXdsaW5lIHNldHRpbmcuXG4gICAqXG4gICAqIEBzY2hlbWEgQ3NzRm9ybWF0dGVyQ29uZmlndXJhdGlvbiN0cmFpbGluZ05ld2xpbmVcbiAgICovXG4gIHJlYWRvbmx5IHRyYWlsaW5nTmV3bGluZT86IGJvb2xlYW47XG59XG5cbi8qKlxuICogQ29udmVydHMgYW4gb2JqZWN0IG9mIHR5cGUgJ0Nzc0Zvcm1hdHRlckNvbmZpZ3VyYXRpb24nIHRvIEpTT04gcmVwcmVzZW50YXRpb24uXG4gKiBAaW50ZXJuYWxcbiAqL1xuLyogZXNsaW50LWRpc2FibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvSnNvbl9Dc3NGb3JtYXR0ZXJDb25maWd1cmF0aW9uKG9iajogQ3NzRm9ybWF0dGVyQ29uZmlndXJhdGlvbiB8IHVuZGVmaW5lZCk6IFJlY29yZDxzdHJpbmcsIGFueT4gfCB1bmRlZmluZWQge1xuICBpZiAob2JqID09PSB1bmRlZmluZWQpIHsgcmV0dXJuIHVuZGVmaW5lZDsgfVxuICBjb25zdCByZXN1bHQgPSB7XG4gICAgJ2RlbGltaXRlclNwYWNpbmcnOiBvYmouZGVsaW1pdGVyU3BhY2luZyxcbiAgICAnZW5hYmxlZCc6IG9iai5lbmFibGVkLFxuICAgICdpbmRlbnRTdHlsZSc6IG9iai5pbmRlbnRTdHlsZSxcbiAgICAnaW5kZW50V2lkdGgnOiBvYmouaW5kZW50V2lkdGgsXG4gICAgJ2xpbmVFbmRpbmcnOiBvYmoubGluZUVuZGluZyxcbiAgICAnbGluZVdpZHRoJzogb2JqLmxpbmVXaWR0aCxcbiAgICAncXVvdGVTdHlsZSc6IG9iai5xdW90ZVN0eWxlLFxuICAgICd0cmFpbGluZ05ld2xpbmUnOiBvYmoudHJhaWxpbmdOZXdsaW5lLFxuICB9O1xuICAvLyBmaWx0ZXIgdW5kZWZpbmVkIHZhbHVlc1xuICByZXR1cm4gT2JqZWN0LmVudHJpZXMocmVzdWx0KS5yZWR1Y2UoKHIsIGkpID0+IChpWzFdID09PSB1bmRlZmluZWQpID8gciA6ICh7IC4uLnIsIFtpWzBdXTogaVsxXSB9KSwge30pO1xufVxuLyogZXNsaW50LWVuYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5cbi8qKlxuICogT3B0aW9ucyB0aGF0IGNoYW5nZSBob3cgdGhlIENTUyBsaW50ZXIgYmVoYXZlcy5cbiAqXG4gKiBAc2NoZW1hIENzc0xpbnRlckNvbmZpZ3VyYXRpb25cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDc3NMaW50ZXJDb25maWd1cmF0aW9uIHtcbiAgLyoqXG4gICAqIEVuYWJsZXMgb3IgZGlzYWJsZXMgdGhlIGxpbnRlciBmb3IgQ1NTLlxuICAgKlxuICAgKiBAc2NoZW1hIENzc0xpbnRlckNvbmZpZ3VyYXRpb24jZW5hYmxlZFxuICAgKi9cbiAgcmVhZG9ubHkgZW5hYmxlZD86IGJvb2xlYW47XG59XG5cbi8qKlxuICogQ29udmVydHMgYW4gb2JqZWN0IG9mIHR5cGUgJ0Nzc0xpbnRlckNvbmZpZ3VyYXRpb24nIHRvIEpTT04gcmVwcmVzZW50YXRpb24uXG4gKiBAaW50ZXJuYWxcbiAqL1xuLyogZXNsaW50LWRpc2FibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvSnNvbl9Dc3NMaW50ZXJDb25maWd1cmF0aW9uKG9iajogQ3NzTGludGVyQ29uZmlndXJhdGlvbiB8IHVuZGVmaW5lZCk6IFJlY29yZDxzdHJpbmcsIGFueT4gfCB1bmRlZmluZWQge1xuICBpZiAob2JqID09PSB1bmRlZmluZWQpIHsgcmV0dXJuIHVuZGVmaW5lZDsgfVxuICBjb25zdCByZXN1bHQgPSB7XG4gICAgJ2VuYWJsZWQnOiBvYmouZW5hYmxlZCxcbiAgfTtcbiAgLy8gZmlsdGVyIHVuZGVmaW5lZCB2YWx1ZXNcbiAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKHJlc3VsdCkucmVkdWNlKChyLCBpKSA9PiAoaVsxXSA9PT0gdW5kZWZpbmVkKSA/IHIgOiAoeyAuLi5yLCBbaVswXV06IGlbMV0gfSksIHt9KTtcbn1cbi8qIGVzbGludC1lbmFibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuXG4vKipcbiAqIE9wdGlvbnMgdGhhdCBjaGFuZ2UgaG93IHRoZSBDU1MgcGFyc2VyIGJlaGF2ZXMuXG4gKlxuICogQHNjaGVtYSBDc3NQYXJzZXJDb25maWd1cmF0aW9uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3NzUGFyc2VyQ29uZmlndXJhdGlvbiB7XG4gIC8qKlxuICAgKiBFbmFibGVzIGAvL2AgbGluZSBjb21tZW50cyBpbiBwbGFpbiBDU1MuIFN0YW5kYXJkIENTUyB0cmVhdHMgYC8vYCBhcyBkZWxpbWl0ZXIgY2hhcmFjdGVyc1xuICAgKiByYXRoZXIgdGhhbiBhcyBhIGNvbW1lbnQsIGFuZCBTQ1NTIGFjY2VwdHMgYC8vYCBjb21tZW50cyBpbmRlcGVuZGVudGx5IG9mIHRoaXMgb3B0aW9uLlxuICAgKiBEZWZhdWx0cyB0byBgZmFsc2VgLlxuICAgKlxuICAgKiBAZGVmYXVsdCBmYWxzZWAuXG4gICAqIEBzY2hlbWEgQ3NzUGFyc2VyQ29uZmlndXJhdGlvbiNhbGxvd1dyb25nTGluZUNvbW1lbnRzXG4gICAqL1xuICByZWFkb25seSBhbGxvd1dyb25nTGluZUNvbW1lbnRzPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogRW5hYmxlcyBDU1MgTW9kdWxlcy1zcGVjaWZpYyBzeW50YXggc3VjaCBhcyBgOmxvY2FsYCwgYDpnbG9iYWxgLCBgY29tcG9zZXNgLCBhbmQgYEB2YWx1ZWAuXG4gICAqIFdoZW4gdW5zZXQsIEJpb21lIGVuYWJsZXMgdGhpcyBzeW50YXggYXV0b21hdGljYWxseSBmb3IgZmlsZXMgd2hvc2UgbmFtZXMgZW5kIGluXG4gICAqIGAubW9kdWxlLmNzc2Agb3IgYC5tb2R1bGUuc2Nzczsgb3RoZXJ3aXNlLCBpdCBkZWZhdWx0cyB0byBgZmFsc2VgLiBFbmFibGUgaXQgZXhwbGljaXRseSB3aGVuIENTUyBNb2R1bGUgZmlsZXNcbiAgICogdXNlIGFub3RoZXIgbmFtaW5nIGNvbnZlbnRpb24uXG4gICAqXG4gICAqIEBzY2hlbWEgQ3NzUGFyc2VyQ29uZmlndXJhdGlvbiNjc3NNb2R1bGVzXG4gICAqL1xuICByZWFkb25seSBjc3NNb2R1bGVzPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogRW5hYmxlcyBwYXJzaW5nIFRhaWx3aW5kIENTUyA0LjAgZGlyZWN0aXZlcyBhbmQgZnVuY3Rpb25zLCBpbmNsdWRpbmcgYEB0aGVtZWAsIGBAdXRpbGl0eWAsXG4gICAqIGBAdmFyaWFudGAsIGBAc291cmNlYCwgYW5kIGBAYXBwbHlgLiBEZWZhdWx0cyB0byBgZmFsc2VgLlxuICAgKlxuICAgKiBAZGVmYXVsdCBmYWxzZWAuXG4gICAqIEBzY2hlbWEgQ3NzUGFyc2VyQ29uZmlndXJhdGlvbiN0YWlsd2luZERpcmVjdGl2ZXNcbiAgICovXG4gIHJlYWRvbmx5IHRhaWx3aW5kRGlyZWN0aXZlcz86IGJvb2xlYW47XG59XG5cbi8qKlxuICogQ29udmVydHMgYW4gb2JqZWN0IG9mIHR5cGUgJ0Nzc1BhcnNlckNvbmZpZ3VyYXRpb24nIHRvIEpTT04gcmVwcmVzZW50YXRpb24uXG4gKiBAaW50ZXJuYWxcbiAqL1xuLyogZXNsaW50LWRpc2FibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvSnNvbl9Dc3NQYXJzZXJDb25maWd1cmF0aW9uKG9iajogQ3NzUGFyc2VyQ29uZmlndXJhdGlvbiB8IHVuZGVmaW5lZCk6IFJlY29yZDxzdHJpbmcsIGFueT4gfCB1bmRlZmluZWQge1xuICBpZiAob2JqID09PSB1bmRlZmluZWQpIHsgcmV0dXJuIHVuZGVmaW5lZDsgfVxuICBjb25zdCByZXN1bHQgPSB7XG4gICAgJ2FsbG93V3JvbmdMaW5lQ29tbWVudHMnOiBvYmouYWxsb3dXcm9uZ0xpbmVDb21tZW50cyxcbiAgICAnY3NzTW9kdWxlcyc6IG9iai5jc3NNb2R1bGVzLFxuICAgICd0YWlsd2luZERpcmVjdGl2ZXMnOiBvYmoudGFpbHdpbmREaXJlY3RpdmVzLFxuICB9O1xuICAvLyBmaWx0ZXIgdW5kZWZpbmVkIHZhbHVlc1xuICByZXR1cm4gT2JqZWN0LmVudHJpZXMocmVzdWx0KS5yZWR1Y2UoKHIsIGkpID0+IChpWzFdID09PSB1bmRlZmluZWQpID8gciA6ICh7IC4uLnIsIFtpWzBdXTogaVsxXSB9KSwge30pO1xufVxuLyogZXNsaW50LWVuYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5cbi8qKlxuICogQ29udHJvbHMgYXR0cmlidXRlIHBsYWNlbWVudCBpbiBIVE1MLWxpa2UgbGFuZ3VhZ2VzLlxuICpcbiAqIEBzY2hlbWEgQXR0cmlidXRlUG9zaXRpb25cbiAqL1xuZXhwb3J0IGVudW0gQXR0cmlidXRlUG9zaXRpb24ge1xuICAvKiogUGxhY2VzIGF0dHJpYnV0ZXMgYXV0b21hdGljYWxseSBhbmQgd3JhcHMgdGhlbSB3aGVuIG5lZWRlZC4gKGF1dG8pICovXG4gIEFVVE8gPSBcImF1dG9cIixcbiAgLyoqIFBsYWNlcyBlYWNoIGF0dHJpYnV0ZSBvbiBpdHMgb3duIGxpbmUgd2hlbiBhbiBlbGVtZW50IGhhcyBtdWx0aXBsZSBhdHRyaWJ1dGVzLiAobXVsdGlsaW5lKSAqL1xuICBNVUxUSUxJTkUgPSBcIm11bHRpbGluZVwiLFxufVxuXG4vKipcbiAqIEBzY2hlbWEgRXhwYW5kXG4gKi9cbmV4cG9ydCBlbnVtIEV4cGFuZCB7XG4gIC8qKiBPYmplY3RzIGFyZSBleHBhbmRlZCB3aGVuIHRoZSBmaXJzdCBwcm9wZXJ0eSBoYXMgYSBsZWFkaW5nIG5ld2xpbmUuIEFycmF5cyByZW1haW4gb24gb25lXG5saW5lIGlmIHRoZXkgZml0LiAoYXV0bykgKi9cbiAgQVVUTyA9IFwiYXV0b1wiLFxuICAvKiogT2JqZWN0cyBhbmQgYXJyYXlzIGFyZSBhbHdheXMgZXhwYW5kZWQuIChhbHdheXMpICovXG4gIEFMV0FZUyA9IFwiYWx3YXlzXCIsXG4gIC8qKiBPYmplY3RzIGFuZCBhcnJheXMgcmVtYWluIG9uIG9uZSBsaW5lIGlmIHRoZXkgZml0LiAobmV2ZXIpICovXG4gIE5FVkVSID0gXCJuZXZlclwiLFxufVxuXG4vKipcbiAqIEBzY2hlbWEgSW5kZW50U3R5bGVcbiAqL1xuZXhwb3J0IGVudW0gSW5kZW50U3R5bGUge1xuICAvKiogVXNlcyB0YWJzIGZvciBpbmRlbnRhdGlvbi4gKHRhYikgKi9cbiAgVEFCID0gXCJ0YWJcIixcbiAgLyoqIFVzZXMgc3BhY2VzIGZvciBpbmRlbnRhdGlvbi4gKHNwYWNlKSAqL1xuICBTUEFDRSA9IFwic3BhY2VcIixcbn1cblxuLyoqXG4gKiBAc2NoZW1hIExpbmVFbmRpbmdcbiAqL1xuZXhwb3J0IGVudW0gTGluZUVuZGluZyB7XG4gIC8qKiBMaW5lIEZlZWQgb25seSAoXFxuKSwgY29tbW9uIG9uIExpbnV4IGFuZCBtYWNPUyBhcyB3ZWxsIGFzIGluc2lkZSBnaXQgcmVwb3MgKGxmKSAqL1xuICBMRiA9IFwibGZcIixcbiAgLyoqIENhcnJpYWdlIFJldHVybiArIExpbmUgRmVlZCBjaGFyYWN0ZXJzIChcXHJcXG4pLCBjb21tb24gb24gV2luZG93cyAoY3JsZikgKi9cbiAgQ1JMRiA9IFwiY3JsZlwiLFxuICAvKiogQ2FycmlhZ2UgUmV0dXJuIGNoYXJhY3RlciBvbmx5IChcXHIpLCB1c2VkIHZlcnkgcmFyZWx5IChjcikgKi9cbiAgQ1IgPSBcImNyXCIsXG4gIC8qKiBBdXRvbWF0aWNhbGx5IHVzZSBDUkxGIG9uIFdpbmRvd3MgYW5kIExGIG9uIG90aGVyIHBsYXRmb3JtcyAoYXV0bykgKi9cbiAgQVVUTyA9IFwiYXV0b1wiLFxufVxuXG4vKipcbiAqIE9wdGlvbnMgdGhhdCBjaGFuZ2UgaG93IEdyYXBoUUwgYXNzaXN0IGJlaGF2ZXMuXG4gKlxuICogQHNjaGVtYSBHcmFwaHFsQXNzaXN0Q29uZmlndXJhdGlvblxuICovXG5leHBvcnQgaW50ZXJmYWNlIEdyYXBocWxBc3Npc3RDb25maWd1cmF0aW9uIHtcbiAgLyoqXG4gICAqIEVuYWJsZXMgb3IgZGlzYWJsZXMgYXNzaXN0IGFjdGlvbnMgZm9yIEdyYXBoUUwuIERlZmF1bHRzIHRvIGBmYWxzZWAuXG4gICAqXG4gICAqIEBkZWZhdWx0IGZhbHNlYC5cbiAgICogQHNjaGVtYSBHcmFwaHFsQXNzaXN0Q29uZmlndXJhdGlvbiNlbmFibGVkXG4gICAqL1xuICByZWFkb25seSBlbmFibGVkPzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhbiBvYmplY3Qgb2YgdHlwZSAnR3JhcGhxbEFzc2lzdENvbmZpZ3VyYXRpb24nIHRvIEpTT04gcmVwcmVzZW50YXRpb24uXG4gKiBAaW50ZXJuYWxcbiAqL1xuLyogZXNsaW50LWRpc2FibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvSnNvbl9HcmFwaHFsQXNzaXN0Q29uZmlndXJhdGlvbihvYmo6IEdyYXBocWxBc3Npc3RDb25maWd1cmF0aW9uIHwgdW5kZWZpbmVkKTogUmVjb3JkPHN0cmluZywgYW55PiB8IHVuZGVmaW5lZCB7XG4gIGlmIChvYmogPT09IHVuZGVmaW5lZCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9XG4gIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAnZW5hYmxlZCc6IG9iai5lbmFibGVkLFxuICB9O1xuICAvLyBmaWx0ZXIgdW5kZWZpbmVkIHZhbHVlc1xuICByZXR1cm4gT2JqZWN0LmVudHJpZXMocmVzdWx0KS5yZWR1Y2UoKHIsIGkpID0+IChpWzFdID09PSB1bmRlZmluZWQpID8gciA6ICh7IC4uLnIsIFtpWzBdXTogaVsxXSB9KSwge30pO1xufVxuLyogZXNsaW50LWVuYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5cbi8qKlxuICogT3B0aW9ucyB0aGF0IGNoYW5nZSBob3cgdGhlIEdyYXBoUUwgZm9ybWF0dGVyIGJlaGF2ZXMuXG4gKlxuICogQHNjaGVtYSBHcmFwaHFsRm9ybWF0dGVyQ29uZmlndXJhdGlvblxuICovXG5leHBvcnQgaW50ZXJmYWNlIEdyYXBocWxGb3JtYXR0ZXJDb25maWd1cmF0aW9uIHtcbiAgLyoqXG4gICAqIENvbnRyb2xzIHNwYWNlcyBpbnNpZGUgdGhlIGJyYWNlcyBvZiBzaW5nbGUtbGluZSBHcmFwaFFMIG9iamVjdCB2YWx1ZXMuIEJpb21lIGZvcm1hdHNcbiAgICogYHtuYW1lOiBcIkJpb21lXCJ9YCB3aGVuIGRpc2FibGVkIGFuZCBgeyBuYW1lOiBcIkJpb21lXCIgfWAgd2hlbiBlbmFibGVkLiBJZiB1bnNldCwgaW5oZXJpdHMgdGhlXG4gICAqIGdsb2JhbCBicmFja2V0IHNwYWNpbmcgc2V0dGluZy5cbiAgICpcbiAgICogQHNjaGVtYSBHcmFwaHFsRm9ybWF0dGVyQ29uZmlndXJhdGlvbiNicmFja2V0U3BhY2luZ1xuICAgKi9cbiAgcmVhZG9ubHkgYnJhY2tldFNwYWNpbmc/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBFbmFibGVzIG9yIGRpc2FibGVzIHRoZSBmb3JtYXR0ZXIgZm9yIEdyYXBoUUwuXG4gICAqXG4gICAqIEBzY2hlbWEgR3JhcGhxbEZvcm1hdHRlckNvbmZpZ3VyYXRpb24jZW5hYmxlZFxuICAgKi9cbiAgcmVhZG9ubHkgZW5hYmxlZD86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFRoZSBpbmRlbnQgc3R5bGUgYXBwbGllZCB0byBHcmFwaFFMIGZpbGVzLiBJZiB1bnNldCwgaW5oZXJpdHMgdGhlIGdsb2JhbCBpbmRlbnRhdGlvbiBzdHlsZS5cbiAgICpcbiAgICogQHNjaGVtYSBHcmFwaHFsRm9ybWF0dGVyQ29uZmlndXJhdGlvbiNpbmRlbnRTdHlsZVxuICAgKi9cbiAgcmVhZG9ubHkgaW5kZW50U3R5bGU/OiBJbmRlbnRTdHlsZTtcblxuICAvKipcbiAgICogVGhlIGluZGVudGF0aW9uIHdpZHRoIGFwcGxpZWQgdG8gR3JhcGhRTCBmaWxlcy4gSWYgdW5zZXQsIGluaGVyaXRzIHRoZSBnbG9iYWwgaW5kZW50YXRpb25cbiAgICogd2lkdGguXG4gICAqXG4gICAqIEBzY2hlbWEgR3JhcGhxbEZvcm1hdHRlckNvbmZpZ3VyYXRpb24jaW5kZW50V2lkdGhcbiAgICovXG4gIHJlYWRvbmx5IGluZGVudFdpZHRoPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBUaGUgbGluZSBlbmRpbmcgYXBwbGllZCB0byBHcmFwaFFMIGZpbGVzLiBJZiB1bnNldCwgaW5oZXJpdHMgdGhlIGdsb2JhbCBsaW5lIGVuZGluZy5cbiAgICpcbiAgICogQHNjaGVtYSBHcmFwaHFsRm9ybWF0dGVyQ29uZmlndXJhdGlvbiNsaW5lRW5kaW5nXG4gICAqL1xuICByZWFkb25seSBsaW5lRW5kaW5nPzogTGluZUVuZGluZztcblxuICAvKipcbiAgICogVGhlIHByZWZlcnJlZCBtYXhpbXVtIGxpbmUgd2lkdGggZm9yIEdyYXBoUUwgZmlsZXMuIElmIHVuc2V0LCBpbmhlcml0cyB0aGUgZ2xvYmFsIGxpbmVcbiAgICogd2lkdGguXG4gICAqXG4gICAqIEBzY2hlbWEgR3JhcGhxbEZvcm1hdHRlckNvbmZpZ3VyYXRpb24jbGluZVdpZHRoXG4gICAqL1xuICByZWFkb25seSBsaW5lV2lkdGg/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFJlc2VydmVkIGZvciBmdXR1cmUgZm9ybWF0dGVyIHN1cHBvcnQuIFRoZSBjdXJyZW50IGZvcm1hdHRlciBwcmVzZXJ2ZXMgc3RhbmRhcmRcbiAgICogZG91YmxlLXF1b3RlZCBHcmFwaFFMIHN0cmluZ3MgYW5kIGRvZXMgbm90IHVzZSB0aGlzIHNldHRpbmcuXG4gICAqXG4gICAqIEBzY2hlbWEgR3JhcGhxbEZvcm1hdHRlckNvbmZpZ3VyYXRpb24jcXVvdGVTdHlsZVxuICAgKi9cbiAgcmVhZG9ubHkgcXVvdGVTdHlsZT86IFF1b3RlU3R5bGU7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gYWRkIGEgdHJhaWxpbmcgbmV3bGluZSBhdCB0aGUgZW5kIG9mIHRoZSBmaWxlLiBJZiB1bnNldCwgaW5oZXJpdHMgdGhlIGdsb2JhbFxuICAgKiB0cmFpbGluZyBuZXdsaW5lIHNldHRpbmcuXG4gICAqXG4gICAqIEBzY2hlbWEgR3JhcGhxbEZvcm1hdHRlckNvbmZpZ3VyYXRpb24jdHJhaWxpbmdOZXdsaW5lXG4gICAqL1xuICByZWFkb25seSB0cmFpbGluZ05ld2xpbmU/OiBib29sZWFuO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGFuIG9iamVjdCBvZiB0eXBlICdHcmFwaHFsRm9ybWF0dGVyQ29uZmlndXJhdGlvbicgdG8gSlNPTiByZXByZXNlbnRhdGlvbi5cbiAqIEBpbnRlcm5hbFxuICovXG4vKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5leHBvcnQgZnVuY3Rpb24gdG9Kc29uX0dyYXBocWxGb3JtYXR0ZXJDb25maWd1cmF0aW9uKG9iajogR3JhcGhxbEZvcm1hdHRlckNvbmZpZ3VyYXRpb24gfCB1bmRlZmluZWQpOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgdW5kZWZpbmVkIHtcbiAgaWYgKG9iaiA9PT0gdW5kZWZpbmVkKSB7IHJldHVybiB1bmRlZmluZWQ7IH1cbiAgY29uc3QgcmVzdWx0ID0ge1xuICAgICdicmFja2V0U3BhY2luZyc6IG9iai5icmFja2V0U3BhY2luZyxcbiAgICAnZW5hYmxlZCc6IG9iai5lbmFibGVkLFxuICAgICdpbmRlbnRTdHlsZSc6IG9iai5pbmRlbnRTdHlsZSxcbiAgICAnaW5kZW50V2lkdGgnOiBvYmouaW5kZW50V2lkdGgsXG4gICAgJ2xpbmVFbmRpbmcnOiBvYmoubGluZUVuZGluZyxcbiAgICAnbGluZVdpZHRoJzogb2JqLmxpbmVXaWR0aCxcbiAgICAncXVvdGVTdHlsZSc6IG9iai5xdW90ZVN0eWxlLFxuICAgICd0cmFpbGluZ05ld2xpbmUnOiBvYmoudHJhaWxpbmdOZXdsaW5lLFxuICB9O1xuICAvLyBmaWx0ZXIgdW5kZWZpbmVkIHZhbHVlc1xuICByZXR1cm4gT2JqZWN0LmVudHJpZXMocmVzdWx0KS5yZWR1Y2UoKHIsIGkpID0+IChpWzFdID09PSB1bmRlZmluZWQpID8gciA6ICh7IC4uLnIsIFtpWzBdXTogaVsxXSB9KSwge30pO1xufVxuLyogZXNsaW50LWVuYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5cbi8qKlxuICogT3B0aW9ucyB0aGF0IGNoYW5nZSBob3cgdGhlIEdyYXBoUUwgbGludGVyIGJlaGF2ZXMuXG4gKlxuICogQHNjaGVtYSBHcmFwaHFsTGludGVyQ29uZmlndXJhdGlvblxuICovXG5leHBvcnQgaW50ZXJmYWNlIEdyYXBocWxMaW50ZXJDb25maWd1cmF0aW9uIHtcbiAgLyoqXG4gICAqIEVuYWJsZXMgb3IgZGlzYWJsZXMgdGhlIGxpbnRlciBmb3IgR3JhcGhRTC5cbiAgICpcbiAgICogQHNjaGVtYSBHcmFwaHFsTGludGVyQ29uZmlndXJhdGlvbiNlbmFibGVkXG4gICAqL1xuICByZWFkb25seSBlbmFibGVkPzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhbiBvYmplY3Qgb2YgdHlwZSAnR3JhcGhxbExpbnRlckNvbmZpZ3VyYXRpb24nIHRvIEpTT04gcmVwcmVzZW50YXRpb24uXG4gKiBAaW50ZXJuYWxcbiAqL1xuLyogZXNsaW50LWRpc2FibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvSnNvbl9HcmFwaHFsTGludGVyQ29uZmlndXJhdGlvbihvYmo6IEdyYXBocWxMaW50ZXJDb25maWd1cmF0aW9uIHwgdW5kZWZpbmVkKTogUmVjb3JkPHN0cmluZywgYW55PiB8IHVuZGVmaW5lZCB7XG4gIGlmIChvYmogPT09IHVuZGVmaW5lZCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9XG4gIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAnZW5hYmxlZCc6IG9iai5lbmFibGVkLFxuICB9O1xuICAvLyBmaWx0ZXIgdW5kZWZpbmVkIHZhbHVlc1xuICByZXR1cm4gT2JqZWN0LmVudHJpZXMocmVzdWx0KS5yZWR1Y2UoKHIsIGkpID0+IChpWzFdID09PSB1bmRlZmluZWQpID8gciA6ICh7IC4uLnIsIFtpWzBdXTogaVsxXSB9KSwge30pO1xufVxuLyogZXNsaW50LWVuYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5cbi8qKlxuICogT3B0aW9ucyB0aGF0IGNoYW5nZSBob3cgR3JpdFFMIGFzc2lzdCBiZWhhdmVzLlxuICpcbiAqIEBzY2hlbWEgR3JpdEFzc2lzdENvbmZpZ3VyYXRpb25cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBHcml0QXNzaXN0Q29uZmlndXJhdGlvbiB7XG4gIC8qKlxuICAgKiBFbmFibGVzIG9yIGRpc2FibGVzIGFzc2lzdCBhY3Rpb25zIGZvciBHcml0UUwuXG4gICAqXG4gICAqIEBzY2hlbWEgR3JpdEFzc2lzdENvbmZpZ3VyYXRpb24jZW5hYmxlZFxuICAgKi9cbiAgcmVhZG9ubHkgZW5hYmxlZD86IGJvb2xlYW47XG59XG5cbi8qKlxuICogQ29udmVydHMgYW4gb2JqZWN0IG9mIHR5cGUgJ0dyaXRBc3Npc3RDb25maWd1cmF0aW9uJyB0byBKU09OIHJlcHJlc2VudGF0aW9uLlxuICogQGludGVybmFsXG4gKi9cbi8qIGVzbGludC1kaXNhYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0pzb25fR3JpdEFzc2lzdENvbmZpZ3VyYXRpb24ob2JqOiBHcml0QXNzaXN0Q29uZmlndXJhdGlvbiB8IHVuZGVmaW5lZCk6IFJlY29yZDxzdHJpbmcsIGFueT4gfCB1bmRlZmluZWQge1xuICBpZiAob2JqID09PSB1bmRlZmluZWQpIHsgcmV0dXJuIHVuZGVmaW5lZDsgfVxuICBjb25zdCByZXN1bHQgPSB7XG4gICAgJ2VuYWJsZWQnOiBvYmouZW5hYmxlZCxcbiAgfTtcbiAgLy8gZmlsdGVyIHVuZGVmaW5lZCB2YWx1ZXNcbiAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKHJlc3VsdCkucmVkdWNlKChyLCBpKSA9PiAoaVsxXSA9PT0gdW5kZWZpbmVkKSA/IHIgOiAoeyAuLi5yLCBbaVswXV06IGlbMV0gfSksIHt9KTtcbn1cbi8qIGVzbGludC1lbmFibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuXG4vKipcbiAqIE9wdGlvbnMgdGhhdCBjaGFuZ2UgaG93IHRoZSBHcml0UUwgZm9ybWF0dGVyIGJlaGF2ZXMuXG4gKlxuICogQHNjaGVtYSBHcml0Rm9ybWF0dGVyQ29uZmlndXJhdGlvblxuICovXG5leHBvcnQgaW50ZXJmYWNlIEdyaXRGb3JtYXR0ZXJDb25maWd1cmF0aW9uIHtcbiAgLyoqXG4gICAqIEVuYWJsZXMgb3IgZGlzYWJsZXMgdGhlIGZvcm1hdHRlciBmb3IgR3JpdFFMLlxuICAgKlxuICAgKiBAc2NoZW1hIEdyaXRGb3JtYXR0ZXJDb25maWd1cmF0aW9uI2VuYWJsZWRcbiAgICovXG4gIHJlYWRvbmx5IGVuYWJsZWQ/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBUaGUgaW5kZW50IHN0eWxlIGFwcGxpZWQgdG8gR3JpdFFMIGZpbGVzLiBJZiB1bnNldCwgaW5oZXJpdHMgdGhlIGdsb2JhbCBpbmRlbnRhdGlvbiBzdHlsZS5cbiAgICpcbiAgICogQHNjaGVtYSBHcml0Rm9ybWF0dGVyQ29uZmlndXJhdGlvbiNpbmRlbnRTdHlsZVxuICAgKi9cbiAgcmVhZG9ubHkgaW5kZW50U3R5bGU/OiBJbmRlbnRTdHlsZTtcblxuICAvKipcbiAgICogVGhlIGluZGVudGF0aW9uIHdpZHRoIGFwcGxpZWQgdG8gR3JpdFFMIGZpbGVzLiBJZiB1bnNldCwgaW5oZXJpdHMgdGhlIGdsb2JhbCBpbmRlbnRhdGlvblxuICAgKiB3aWR0aC5cbiAgICpcbiAgICogQHNjaGVtYSBHcml0Rm9ybWF0dGVyQ29uZmlndXJhdGlvbiNpbmRlbnRXaWR0aFxuICAgKi9cbiAgcmVhZG9ubHkgaW5kZW50V2lkdGg/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFRoZSBsaW5lIGVuZGluZyBhcHBsaWVkIHRvIEdyaXRRTCBmaWxlcy4gSWYgdW5zZXQsIGluaGVyaXRzIHRoZSBnbG9iYWwgbGluZSBlbmRpbmcuXG4gICAqXG4gICAqIEBzY2hlbWEgR3JpdEZvcm1hdHRlckNvbmZpZ3VyYXRpb24jbGluZUVuZGluZ1xuICAgKi9cbiAgcmVhZG9ubHkgbGluZUVuZGluZz86IExpbmVFbmRpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBwcmVmZXJyZWQgbWF4aW11bSBsaW5lIHdpZHRoIGZvciBHcml0UUwgZmlsZXMuIElmIHVuc2V0LCBpbmhlcml0cyB0aGUgZ2xvYmFsIGxpbmUgd2lkdGguXG4gICAqXG4gICAqIEBzY2hlbWEgR3JpdEZvcm1hdHRlckNvbmZpZ3VyYXRpb24jbGluZVdpZHRoXG4gICAqL1xuICByZWFkb25seSBsaW5lV2lkdGg/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gYWRkIGEgdHJhaWxpbmcgbmV3bGluZSBhdCB0aGUgZW5kIG9mIHRoZSBmaWxlLiBJZiB1bnNldCwgaW5oZXJpdHMgdGhlIGdsb2JhbFxuICAgKiB0cmFpbGluZyBuZXdsaW5lIHNldHRpbmcuXG4gICAqXG4gICAqIEBzY2hlbWEgR3JpdEZvcm1hdHRlckNvbmZpZ3VyYXRpb24jdHJhaWxpbmdOZXdsaW5lXG4gICAqL1xuICByZWFkb25seSB0cmFpbGluZ05ld2xpbmU/OiBib29sZWFuO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGFuIG9iamVjdCBvZiB0eXBlICdHcml0Rm9ybWF0dGVyQ29uZmlndXJhdGlvbicgdG8gSlNPTiByZXByZXNlbnRhdGlvbi5cbiAqIEBpbnRlcm5hbFxuICovXG4vKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5leHBvcnQgZnVuY3Rpb24gdG9Kc29uX0dyaXRGb3JtYXR0ZXJDb25maWd1cmF0aW9uKG9iajogR3JpdEZvcm1hdHRlckNvbmZpZ3VyYXRpb24gfCB1bmRlZmluZWQpOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgdW5kZWZpbmVkIHtcbiAgaWYgKG9iaiA9PT0gdW5kZWZpbmVkKSB7IHJldHVybiB1bmRlZmluZWQ7IH1cbiAgY29uc3QgcmVzdWx0ID0ge1xuICAgICdlbmFibGVkJzogb2JqLmVuYWJsZWQsXG4gICAgJ2luZGVudFN0eWxlJzogb2JqLmluZGVudFN0eWxlLFxuICAgICdpbmRlbnRXaWR0aCc6IG9iai5pbmRlbnRXaWR0aCxcbiAgICAnbGluZUVuZGluZyc6IG9iai5saW5lRW5kaW5nLFxuICAgICdsaW5lV2lkdGgnOiBvYmoubGluZVdpZHRoLFxuICAgICd0cmFpbGluZ05ld2xpbmUnOiBvYmoudHJhaWxpbmdOZXdsaW5lLFxuICB9O1xuICAvLyBmaWx0ZXIgdW5kZWZpbmVkIHZhbHVlc1xuICByZXR1cm4gT2JqZWN0LmVudHJpZXMocmVzdWx0KS5yZWR1Y2UoKHIsIGkpID0+IChpWzFdID09PSB1bmRlZmluZWQpID8gciA6ICh7IC4uLnIsIFtpWzBdXTogaVsxXSB9KSwge30pO1xufVxuLyogZXNsaW50LWVuYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5cbi8qKlxuICogT3B0aW9ucyB0aGF0IGNoYW5nZSBob3cgdGhlIEdyaXRRTCBsaW50ZXIgYmVoYXZlcy5cbiAqXG4gKiBAc2NoZW1hIEdyaXRMaW50ZXJDb25maWd1cmF0aW9uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgR3JpdExpbnRlckNvbmZpZ3VyYXRpb24ge1xuICAvKipcbiAgICogRW5hYmxlcyBvciBkaXNhYmxlcyB0aGUgbGludGVyIGZvciBHcml0UUwuXG4gICAqXG4gICAqIEBzY2hlbWEgR3JpdExpbnRlckNvbmZpZ3VyYXRpb24jZW5hYmxlZFxuICAgKi9cbiAgcmVhZG9ubHkgZW5hYmxlZD86IGJvb2xlYW47XG59XG5cbi8qKlxuICogQ29udmVydHMgYW4gb2JqZWN0IG9mIHR5cGUgJ0dyaXRMaW50ZXJDb25maWd1cmF0aW9uJyB0byBKU09OIHJlcHJlc2VudGF0aW9uLlxuICogQGludGVybmFsXG4gKi9cbi8qIGVzbGludC1kaXNhYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0pzb25fR3JpdExpbnRlckNvbmZpZ3VyYXRpb24ob2JqOiBHcml0TGludGVyQ29uZmlndXJhdGlvbiB8IHVuZGVmaW5lZCk6IFJlY29yZDxzdHJpbmcsIGFueT4gfCB1bmRlZmluZWQge1xuICBpZiAob2JqID09PSB1bmRlZmluZWQpIHsgcmV0dXJuIHVuZGVmaW5lZDsgfVxuICBjb25zdCByZXN1bHQgPSB7XG4gICAgJ2VuYWJsZWQnOiBvYmouZW5hYmxlZCxcbiAgfTtcbiAgLy8gZmlsdGVyIHVuZGVmaW5lZCB2YWx1ZXNcbiAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKHJlc3VsdCkucmVkdWNlKChyLCBpKSA9PiAoaVsxXSA9PT0gdW5kZWZpbmVkKSA/IHIgOiAoeyAuLi5yLCBbaVswXV06IGlbMV0gfSksIHt9KTtcbn1cbi8qIGVzbGludC1lbmFibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuXG4vKipcbiAqIE9wdGlvbnMgdGhhdCBjaGFuZ2UgaG93IEhUTUwgYXNzaXN0IGJlaGF2ZXMuXG4gKlxuICogQHNjaGVtYSBIdG1sQXNzaXN0Q29uZmlndXJhdGlvblxuICovXG5leHBvcnQgaW50ZXJmYWNlIEh0bWxBc3Npc3RDb25maWd1cmF0aW9uIHtcbiAgLyoqXG4gICAqIEVuYWJsZXMgb3IgZGlzYWJsZXMgYXNzaXN0IGFjdGlvbnMgZm9yIEhUTUwgYW5kIGxhbmd1YWdlcyB0aGF0IGV4dGVuZCBpdC5cbiAgICpcbiAgICogQHNjaGVtYSBIdG1sQXNzaXN0Q29uZmlndXJhdGlvbiNlbmFibGVkXG4gICAqL1xuICByZWFkb25seSBlbmFibGVkPzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhbiBvYmplY3Qgb2YgdHlwZSAnSHRtbEFzc2lzdENvbmZpZ3VyYXRpb24nIHRvIEpTT04gcmVwcmVzZW50YXRpb24uXG4gKiBAaW50ZXJuYWxcbiAqL1xuLyogZXNsaW50LWRpc2FibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvSnNvbl9IdG1sQXNzaXN0Q29uZmlndXJhdGlvbihvYmo6IEh0bWxBc3Npc3RDb25maWd1cmF0aW9uIHwgdW5kZWZpbmVkKTogUmVjb3JkPHN0cmluZywgYW55PiB8IHVuZGVmaW5lZCB7XG4gIGlmIChvYmogPT09IHVuZGVmaW5lZCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9XG4gIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAnZW5hYmxlZCc6IG9iai5lbmFibGVkLFxuICB9O1xuICAvLyBmaWx0ZXIgdW5kZWZpbmVkIHZhbHVlc1xuICByZXR1cm4gT2JqZWN0LmVudHJpZXMocmVzdWx0KS5yZWR1Y2UoKHIsIGkpID0+IChpWzFdID09PSB1bmRlZmluZWQpID8gciA6ICh7IC4uLnIsIFtpWzBdXTogaVsxXSB9KSwge30pO1xufVxuLyogZXNsaW50LWVuYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5cbi8qKlxuICogT3B0aW9ucyB0aGF0IGNoYW5nZSBob3cgdGhlIEhUTUwgZm9ybWF0dGVyIGJlaGF2ZXMuXG4gKlxuICogQHNjaGVtYSBIdG1sRm9ybWF0dGVyQ29uZmlndXJhdGlvblxuICovXG5leHBvcnQgaW50ZXJmYWNlIEh0bWxGb3JtYXR0ZXJDb25maWd1cmF0aW9uIHtcbiAgLyoqXG4gICAqIFRoZSBhdHRyaWJ1dGUgcG9zaXRpb24gc3R5bGUgaW4gSFRNTCBlbGVtZW50cy4gSWYgdW5zZXQsIGluaGVyaXRzIHRoZSBnbG9iYWwgYXR0cmlidXRlXG4gICAqIHBvc2l0aW9uIHNldHRpbmcuXG4gICAqXG4gICAqIEBzY2hlbWEgSHRtbEZvcm1hdHRlckNvbmZpZ3VyYXRpb24jYXR0cmlidXRlUG9zaXRpb25cbiAgICovXG4gIHJlYWRvbmx5IGF0dHJpYnV0ZVBvc2l0aW9uPzogQXR0cmlidXRlUG9zaXRpb247XG5cbiAgLyoqXG4gICAqIENvbnRyb2xzIHRoZSBwbGFjZW1lbnQgb2YgdGhlIGNsb3NpbmcgYnJhY2tldCBmb3IgbXVsdGlsaW5lIEhUTUwgb3BlbmluZyB0YWdzLiBCaW9tZSBwbGFjZXNcbiAgICogdGhlIGJyYWNrZXQgYXQgdGhlIGVuZCBvZiB0aGUgbGFzdCBhdHRyaWJ1dGUgbGluZSB3aGVuIGVuYWJsZWQgYW5kIG9uIGl0cyBvd24gbGluZSBhZnRlciB0aGVcbiAgICogbGFzdCBhdHRyaWJ1dGUgd2hlbiBkaXNhYmxlZC4gVGhpcyBvcHRpb24gYWxzbyBhZmZlY3RzIHNlbGYtY2xvc2luZyBIVE1MIGVsZW1lbnRzLiBJZiB1bnNldCxcbiAgICogaW5oZXJpdHMgdGhlIGdsb2JhbCBgYnJhY2tldFNhbWVMaW5lYCBzZXR0aW5nLlxuICAgKlxuICAgKiBAc2NoZW1hIEh0bWxGb3JtYXR0ZXJDb25maWd1cmF0aW9uI2JyYWNrZXRTYW1lTGluZVxuICAgKi9cbiAgcmVhZG9ubHkgYnJhY2tldFNhbWVMaW5lPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogRW5hYmxlcyBvciBkaXNhYmxlcyB0aGUgZm9ybWF0dGVyIGZvciBIVE1MIGFuZCBsYW5ndWFnZXMgdGhhdCBleHRlbmQgaXQuIFRoZSBmb3JtYXR0ZXIgaXNcbiAgICogZXhwZXJpbWVudGFsIGFuZCBkaXNhYmxlZCBieSBkZWZhdWx0LiBGb3JtYXR0aW5nIGNvbXBsZXRlIEhUTUwsIFZ1ZSwgU3ZlbHRlLCBhbmQgQXN0cm8gZmlsZXNcbiAgICogcmVxdWlyZXMgYGh0bWwuZXhwZXJpbWVudGFsRnVsbFN1cHBvcnRFbmFibGVkYCB0byBiZSBgdHJ1ZWAuXG4gICAqXG4gICAqIEBzY2hlbWEgSHRtbEZvcm1hdHRlckNvbmZpZ3VyYXRpb24jZW5hYmxlZFxuICAgKi9cbiAgcmVhZG9ubHkgZW5hYmxlZD86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIENvbnRyb2xzIHdoZXRoZXIgdGhlIGNvbnRlbnQgb2YgYDxzY3JpcHQ+YCBhbmQgYDxzdHlsZT5gIHRhZ3MgaXMgaW5kZW50ZWQgYnkgb25lIGxldmVsIGluXG4gICAqIEhUTUwsIFZ1ZSwgU3ZlbHRlLCBhbmQgQXN0cm8gZmlsZXMuIERlZmF1bHRzIHRvIGBmYWxzZWAuXG4gICAqXG4gICAqIEBkZWZhdWx0IGZhbHNlYC5cbiAgICogQHNjaGVtYSBIdG1sRm9ybWF0dGVyQ29uZmlndXJhdGlvbiNpbmRlbnRTY3JpcHRBbmRTdHlsZVxuICAgKi9cbiAgcmVhZG9ubHkgaW5kZW50U2NyaXB0QW5kU3R5bGU/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBUaGUgaW5kZW50IHN0eWxlIGFwcGxpZWQgdG8gSFRNTCBhbmQgbGFuZ3VhZ2VzIHRoYXQgZXh0ZW5kIGl0LiBJZiB1bnNldCwgaW5oZXJpdHMgdGhlIGdsb2JhbFxuICAgKiBpbmRlbnRhdGlvbiBzdHlsZS5cbiAgICpcbiAgICogQHNjaGVtYSBIdG1sRm9ybWF0dGVyQ29uZmlndXJhdGlvbiNpbmRlbnRTdHlsZVxuICAgKi9cbiAgcmVhZG9ubHkgaW5kZW50U3R5bGU/OiBJbmRlbnRTdHlsZTtcblxuICAvKipcbiAgICogVGhlIGluZGVudGF0aW9uIHdpZHRoIGFwcGxpZWQgdG8gSFRNTCBhbmQgbGFuZ3VhZ2VzIHRoYXQgZXh0ZW5kIGl0LiBJZiB1bnNldCwgaW5oZXJpdHMgdGhlXG4gICAqIGdsb2JhbCBpbmRlbnRhdGlvbiB3aWR0aC5cbiAgICpcbiAgICogQHNjaGVtYSBIdG1sRm9ybWF0dGVyQ29uZmlndXJhdGlvbiNpbmRlbnRXaWR0aFxuICAgKi9cbiAgcmVhZG9ubHkgaW5kZW50V2lkdGg/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFRoZSBsaW5lIGVuZGluZyBhcHBsaWVkIHRvIEhUTUwgYW5kIGxhbmd1YWdlcyB0aGF0IGV4dGVuZCBpdC4gSWYgdW5zZXQsIGluaGVyaXRzIHRoZSBnbG9iYWxcbiAgICogbGluZSBlbmRpbmcuXG4gICAqXG4gICAqIEBzY2hlbWEgSHRtbEZvcm1hdHRlckNvbmZpZ3VyYXRpb24jbGluZUVuZGluZ1xuICAgKi9cbiAgcmVhZG9ubHkgbGluZUVuZGluZz86IExpbmVFbmRpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBwcmVmZXJyZWQgbWF4aW11bSBsaW5lIHdpZHRoIGZvciBIVE1MIGFuZCBsYW5ndWFnZXMgdGhhdCBleHRlbmQgaXQuIElmIHVuc2V0LCBpbmhlcml0c1xuICAgKiB0aGUgZ2xvYmFsIGxpbmUgd2lkdGguXG4gICAqXG4gICAqIEBzY2hlbWEgSHRtbEZvcm1hdHRlckNvbmZpZ3VyYXRpb24jbGluZVdpZHRoXG4gICAqL1xuICByZWFkb25seSBsaW5lV2lkdGg/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIENvbnRyb2xzIHdoZXRoZXIgdm9pZCBlbGVtZW50cyBhcmUgc2VsZi1jbG9zZWQuIERlZmF1bHRzIHRvIGBuZXZlcmAuXG4gICAqXG4gICAqIEBkZWZhdWx0IG5ldmVyYC5cbiAgICogQHNjaGVtYSBIdG1sRm9ybWF0dGVyQ29uZmlndXJhdGlvbiNzZWxmQ2xvc2VWb2lkRWxlbWVudHNcbiAgICovXG4gIHJlYWRvbmx5IHNlbGZDbG9zZVZvaWRFbGVtZW50cz86IFNlbGZDbG9zZVZvaWRFbGVtZW50cztcblxuICAvKipcbiAgICogV2hldGhlciB0byBhZGQgYSB0cmFpbGluZyBuZXdsaW5lIGF0IHRoZSBlbmQgb2YgdGhlIGZpbGUuIFVubGlrZSBvdGhlciBsYW5ndWFnZS1zcGVjaWZpY1xuICAgKiB0cmFpbGluZyBuZXdsaW5lIHNldHRpbmdzLCB0aGlzIG9wdGlvbiBkZWZhdWx0cyB0byBgdHJ1ZWAgaW5zdGVhZCBvZiBpbmhlcml0aW5nIHRoZSBnbG9iYWxcbiAgICogc2V0dGluZy5cbiAgICpcbiAgICogQHNjaGVtYSBIdG1sRm9ybWF0dGVyQ29uZmlndXJhdGlvbiN0cmFpbGluZ05ld2xpbmVcbiAgICovXG4gIHJlYWRvbmx5IHRyYWlsaW5nTmV3bGluZT86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIENvbnRyb2xzIGhvdyB0aGUgZm9ybWF0dGVyIHRyZWF0cyB3aGl0ZXNwYWNlIGFyb3VuZCB0ZXh0IGFuZCBjaGlsZCBlbGVtZW50cyBpbiBIVE1MLCBWdWUsXG4gICAqIFN2ZWx0ZSwgYW5kIEFzdHJvIG1hcmt1cC4gVGhlIGBpZ25vcmVgIHNldHRpbmcgc2hvdWxkIGJlIHVzZWQgb25seSB3aGVuIHdoaXRlc3BhY2UgY2Fubm90XG4gICAqIGFmZmVjdCByZW5kZXJlZCBvdXRwdXQuIERlZmF1bHRzIHRvIGBjc3NgLlxuICAgKlxuICAgKiBAZGVmYXVsdCBjc3NgLlxuICAgKiBAc2NoZW1hIEh0bWxGb3JtYXR0ZXJDb25maWd1cmF0aW9uI3doaXRlc3BhY2VTZW5zaXRpdml0eVxuICAgKi9cbiAgcmVhZG9ubHkgd2hpdGVzcGFjZVNlbnNpdGl2aXR5PzogV2hpdGVzcGFjZVNlbnNpdGl2aXR5O1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGFuIG9iamVjdCBvZiB0eXBlICdIdG1sRm9ybWF0dGVyQ29uZmlndXJhdGlvbicgdG8gSlNPTiByZXByZXNlbnRhdGlvbi5cbiAqIEBpbnRlcm5hbFxuICovXG4vKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5leHBvcnQgZnVuY3Rpb24gdG9Kc29uX0h0bWxGb3JtYXR0ZXJDb25maWd1cmF0aW9uKG9iajogSHRtbEZvcm1hdHRlckNvbmZpZ3VyYXRpb24gfCB1bmRlZmluZWQpOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgdW5kZWZpbmVkIHtcbiAgaWYgKG9iaiA9PT0gdW5kZWZpbmVkKSB7IHJldHVybiB1bmRlZmluZWQ7IH1cbiAgY29uc3QgcmVzdWx0ID0ge1xuICAgICdhdHRyaWJ1dGVQb3NpdGlvbic6IG9iai5hdHRyaWJ1dGVQb3NpdGlvbixcbiAgICAnYnJhY2tldFNhbWVMaW5lJzogb2JqLmJyYWNrZXRTYW1lTGluZSxcbiAgICAnZW5hYmxlZCc6IG9iai5lbmFibGVkLFxuICAgICdpbmRlbnRTY3JpcHRBbmRTdHlsZSc6IG9iai5pbmRlbnRTY3JpcHRBbmRTdHlsZSxcbiAgICAnaW5kZW50U3R5bGUnOiBvYmouaW5kZW50U3R5bGUsXG4gICAgJ2luZGVudFdpZHRoJzogb2JqLmluZGVudFdpZHRoLFxuICAgICdsaW5lRW5kaW5nJzogb2JqLmxpbmVFbmRpbmcsXG4gICAgJ2xpbmVXaWR0aCc6IG9iai5saW5lV2lkdGgsXG4gICAgJ3NlbGZDbG9zZVZvaWRFbGVtZW50cyc6IG9iai5zZWxmQ2xvc2VWb2lkRWxlbWVudHMsXG4gICAgJ3RyYWlsaW5nTmV3bGluZSc6IG9iai50cmFpbGluZ05ld2xpbmUsXG4gICAgJ3doaXRlc3BhY2VTZW5zaXRpdml0eSc6IG9iai53aGl0ZXNwYWNlU2Vuc2l0aXZpdHksXG4gIH07XG4gIC8vIGZpbHRlciB1bmRlZmluZWQgdmFsdWVzXG4gIHJldHVybiBPYmplY3QuZW50cmllcyhyZXN1bHQpLnJlZHVjZSgociwgaSkgPT4gKGlbMV0gPT09IHVuZGVmaW5lZCkgPyByIDogKHsgLi4uciwgW2lbMF1dOiBpWzFdIH0pLCB7fSk7XG59XG4vKiBlc2xpbnQtZW5hYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cblxuLyoqXG4gKiBPcHRpb25zIHRoYXQgY2hhbmdlIGhvdyB0aGUgSFRNTCBsaW50ZXIgYmVoYXZlcy5cbiAqXG4gKiBAc2NoZW1hIEh0bWxMaW50ZXJDb25maWd1cmF0aW9uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSHRtbExpbnRlckNvbmZpZ3VyYXRpb24ge1xuICAvKipcbiAgICogRW5hYmxlcyBvciBkaXNhYmxlcyB0aGUgbGludGVyIGZvciBIVE1MIGFuZCBsYW5ndWFnZXMgdGhhdCBleHRlbmQgaXQuXG4gICAqXG4gICAqIEBzY2hlbWEgSHRtbExpbnRlckNvbmZpZ3VyYXRpb24jZW5hYmxlZFxuICAgKi9cbiAgcmVhZG9ubHkgZW5hYmxlZD86IGJvb2xlYW47XG59XG5cbi8qKlxuICogQ29udmVydHMgYW4gb2JqZWN0IG9mIHR5cGUgJ0h0bWxMaW50ZXJDb25maWd1cmF0aW9uJyB0byBKU09OIHJlcHJlc2VudGF0aW9uLlxuICogQGludGVybmFsXG4gKi9cbi8qIGVzbGludC1kaXNhYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0pzb25fSHRtbExpbnRlckNvbmZpZ3VyYXRpb24ob2JqOiBIdG1sTGludGVyQ29uZmlndXJhdGlvbiB8IHVuZGVmaW5lZCk6IFJlY29yZDxzdHJpbmcsIGFueT4gfCB1bmRlZmluZWQge1xuICBpZiAob2JqID09PSB1bmRlZmluZWQpIHsgcmV0dXJuIHVuZGVmaW5lZDsgfVxuICBjb25zdCByZXN1bHQgPSB7XG4gICAgJ2VuYWJsZWQnOiBvYmouZW5hYmxlZCxcbiAgfTtcbiAgLy8gZmlsdGVyIHVuZGVmaW5lZCB2YWx1ZXNcbiAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKHJlc3VsdCkucmVkdWNlKChyLCBpKSA9PiAoaVsxXSA9PT0gdW5kZWZpbmVkKSA/IHIgOiAoeyAuLi5yLCBbaVswXV06IGlbMV0gfSksIHt9KTtcbn1cbi8qIGVzbGludC1lbmFibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuXG4vKipcbiAqIE9wdGlvbnMgdGhhdCBjaGFuZ2UgaG93IHRoZSBIVE1MIHBhcnNlciBiZWhhdmVzLlxuICpcbiAqIEBzY2hlbWEgSHRtbFBhcnNlckNvbmZpZ3VyYXRpb25cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBIdG1sUGFyc2VyQ29uZmlndXJhdGlvbiB7XG4gIC8qKlxuICAgKiBFbmFibGVzIGRvdWJsZS1jdXJseSBpbnRlcnBvbGF0aW9uIGV4cHJlc3Npb25zIHN1Y2ggYXMgYHt7IGV4cHJlc3Npb24gfX1gIGluIGAuaHRtbGAgZmlsZXMuXG4gICAqIERlZmF1bHRzIHRvIGBmYWxzZWAuXG4gICAqXG4gICAqIEBkZWZhdWx0IGZhbHNlYC5cbiAgICogQHNjaGVtYSBIdG1sUGFyc2VyQ29uZmlndXJhdGlvbiNpbnRlcnBvbGF0aW9uXG4gICAqL1xuICByZWFkb25seSBpbnRlcnBvbGF0aW9uPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogRW5hYmxlcyBwYXJzaW5nIFZ1ZSBzeW50YXggKGB2LWlmYCwgYHYtYmluZGAsIGV0Yy4pIGluIGAuaHRtbGAgZmlsZXMuIEVuYWJsaW5nIHRoaXMgb3B0aW9uXG4gICAqIGFsc28gZW5hYmxlcyBgaW50ZXJwb2xhdGlvbmAgaW1wbGljaXRseS5cbiAgICpcbiAgICogQmlvbWUgd2lsbCBhbHJlYWR5IGF1dG9tYXRpY2FsbHkgZW5hYmxlIFZ1ZSBwYXJzaW5nIGluIGAudnVlYCBmaWxlcywgc28geW91IHByb2JhYmx5IGRvbid0IG5lZWRcbiAgICogdG8gZW5hYmxlIHRoaXMgb3B0aW9uLiBUaGlzIG9ubHkgYWZmZWN0cyBgLmh0bWxgIGZpbGVzLCBhbmQgZG9lcyBub3QgY2hhbmdlIGhvdyBgLnZ1ZWAsIGAuc3ZlbHRlYCxcbiAgICogb3IgYC5hc3Ryb2AgZmlsZXMgYXJlIHBhcnNlZC4gRGVmYXVsdHMgdG8gYGZhbHNlYC5cbiAgICpcbiAgICogQGRlZmF1bHQgZmFsc2VgLlxuICAgKiBAc2NoZW1hIEh0bWxQYXJzZXJDb25maWd1cmF0aW9uI3Z1ZVxuICAgKi9cbiAgcmVhZG9ubHkgdnVlPzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhbiBvYmplY3Qgb2YgdHlwZSAnSHRtbFBhcnNlckNvbmZpZ3VyYXRpb24nIHRvIEpTT04gcmVwcmVzZW50YXRpb24uXG4gKiBAaW50ZXJuYWxcbiAqL1xuLyogZXNsaW50LWRpc2FibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvSnNvbl9IdG1sUGFyc2VyQ29uZmlndXJhdGlvbihvYmo6IEh0bWxQYXJzZXJDb25maWd1cmF0aW9uIHwgdW5kZWZpbmVkKTogUmVjb3JkPHN0cmluZywgYW55PiB8IHVuZGVmaW5lZCB7XG4gIGlmIChvYmogPT09IHVuZGVmaW5lZCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9XG4gIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAnaW50ZXJwb2xhdGlvbic6IG9iai5pbnRlcnBvbGF0aW9uLFxuICAgICd2dWUnOiBvYmoudnVlLFxuICB9O1xuICAvLyBmaWx0ZXIgdW5kZWZpbmVkIHZhbHVlc1xuICByZXR1cm4gT2JqZWN0LmVudHJpZXMocmVzdWx0KS5yZWR1Y2UoKHIsIGkpID0+IChpWzFdID09PSB1bmRlZmluZWQpID8gciA6ICh7IC4uLnIsIFtpWzBdXTogaVsxXSB9KSwge30pO1xufVxuLyogZXNsaW50LWVuYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5cbi8qKlxuICogQXNzaXN0IG9wdGlvbnMgc3BlY2lmaWMgdG8gdGhlIEphdmFTY3JpcHQgYXNzaXN0XG4gKlxuICogQHNjaGVtYSBKc0Fzc2lzdENvbmZpZ3VyYXRpb25cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBKc0Fzc2lzdENvbmZpZ3VyYXRpb24ge1xuICAvKipcbiAgICogRW5hYmxlcyBvciBkaXNhYmxlcyBhc3Npc3QgYWN0aW9ucyBmb3IgSmF2YVNjcmlwdCBhbmQgbGFuZ3VhZ2VzIHRoYXQgZXh0ZW5kIGl0LlxuICAgKlxuICAgKiBAc2NoZW1hIEpzQXNzaXN0Q29uZmlndXJhdGlvbiNlbmFibGVkXG4gICAqL1xuICByZWFkb25seSBlbmFibGVkPzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhbiBvYmplY3Qgb2YgdHlwZSAnSnNBc3Npc3RDb25maWd1cmF0aW9uJyB0byBKU09OIHJlcHJlc2VudGF0aW9uLlxuICogQGludGVybmFsXG4gKi9cbi8qIGVzbGludC1kaXNhYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0pzb25fSnNBc3Npc3RDb25maWd1cmF0aW9uKG9iajogSnNBc3Npc3RDb25maWd1cmF0aW9uIHwgdW5kZWZpbmVkKTogUmVjb3JkPHN0cmluZywgYW55PiB8IHVuZGVmaW5lZCB7XG4gIGlmIChvYmogPT09IHVuZGVmaW5lZCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9XG4gIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAnZW5hYmxlZCc6IG9iai5lbmFibGVkLFxuICB9O1xuICAvLyBmaWx0ZXIgdW5kZWZpbmVkIHZhbHVlc1xuICByZXR1cm4gT2JqZWN0LmVudHJpZXMocmVzdWx0KS5yZWR1Y2UoKHIsIGkpID0+IChpWzFdID09PSB1bmRlZmluZWQpID8gciA6ICh7IC4uLnIsIFtpWzBdXTogaVsxXSB9KSwge30pO1xufVxuLyogZXNsaW50LWVuYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5cbi8qKlxuICogRm9ybWF0dGluZyBvcHRpb25zIHNwZWNpZmljIHRvIEphdmFTY3JpcHQgYW5kIGxhbmd1YWdlcyB0aGF0IGV4dGVuZCBpdC5cbiAqXG4gKiBAc2NoZW1hIEpzRm9ybWF0dGVyQ29uZmlndXJhdGlvblxuICovXG5leHBvcnQgaW50ZXJmYWNlIEpzRm9ybWF0dGVyQ29uZmlndXJhdGlvbiB7XG4gIC8qKlxuICAgKiBDb250cm9scyBwYXJlbnRoZXNlcyBhcm91bmQgYXJyb3ctZnVuY3Rpb24gcGFyYW1ldGVycy4gYGFsd2F5c2AgYWx3YXlzIHByaW50cyBwYXJlbnRoZXNlcyxcbiAgICogd2hpbGUgYGFzTmVlZGVkYCBvbWl0cyB0aGVtIHdoZW4gYW4gYXJyb3cgZnVuY3Rpb24gaGFzIG9uZSBwYXJhbWV0ZXIgYW5kIHRoZSBzeW50YXggcGVybWl0c1xuICAgKiBpdC4gRGVmYXVsdHMgdG8gYGFsd2F5c2AuXG4gICAqXG4gICAqIEBkZWZhdWx0IGFsd2F5c2AuXG4gICAqIEBzY2hlbWEgSnNGb3JtYXR0ZXJDb25maWd1cmF0aW9uI2Fycm93UGFyZW50aGVzZXNcbiAgICovXG4gIHJlYWRvbmx5IGFycm93UGFyZW50aGVzZXM/OiBBcnJvd1BhcmVudGhlc2VzO1xuXG4gIC8qKlxuICAgKiBUaGUgYXR0cmlidXRlIHBvc2l0aW9uIHN0eWxlIGluIEpTWCBlbGVtZW50cy4gSWYgdW5zZXQsIGluaGVyaXRzIHRoZSBnbG9iYWwgYXR0cmlidXRlXG4gICAqIHBvc2l0aW9uIHNldHRpbmcuXG4gICAqXG4gICAqIEBzY2hlbWEgSnNGb3JtYXR0ZXJDb25maWd1cmF0aW9uI2F0dHJpYnV0ZVBvc2l0aW9uXG4gICAqL1xuICByZWFkb25seSBhdHRyaWJ1dGVQb3NpdGlvbj86IEF0dHJpYnV0ZVBvc2l0aW9uO1xuXG4gIC8qKlxuICAgKiBDb250cm9scyB0aGUgcGxhY2VtZW50IG9mIHRoZSBjbG9zaW5nIGJyYWNrZXQgZm9yIG11bHRpbGluZSBKU1ggb3BlbmluZyB0YWdzLiBCaW9tZSBwbGFjZXNcbiAgICogdGhlIGJyYWNrZXQgYXQgdGhlIGVuZCBvZiB0aGUgbGFzdCBhdHRyaWJ1dGUgbGluZSB3aGVuIGVuYWJsZWQgYW5kIG9uIGl0cyBvd24gbGluZSBhZnRlciB0aGVcbiAgICogbGFzdCBhdHRyaWJ1dGUgd2hlbiBkaXNhYmxlZC4gU2VsZi1jbG9zaW5nIEpTWCBlbGVtZW50cyBhcmUgdW5hZmZlY3RlZC4gSWYgdW5zZXQsIGluaGVyaXRzXG4gICAqIHRoZSBnbG9iYWwgYnJhY2tldCBwbGFjZW1lbnQgc2V0dGluZy5cbiAgICpcbiAgICogQHNjaGVtYSBKc0Zvcm1hdHRlckNvbmZpZ3VyYXRpb24jYnJhY2tldFNhbWVMaW5lXG4gICAqL1xuICByZWFkb25seSBicmFja2V0U2FtZUxpbmU/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBDb250cm9scyBzcGFjZXMgaW5zaWRlIHRoZSBicmFjZXMgb2Ygc2luZ2xlLWxpbmUgb2JqZWN0IGxpdGVyYWxzLiBCaW9tZSBmb3JtYXRzIGB7dmFsdWU6IDF9YFxuICAgKiB3aGVuIGRpc2FibGVkIGFuZCBgeyB2YWx1ZTogMSB9YCB3aGVuIGVuYWJsZWQuIElmIHVuc2V0LCBpbmhlcml0cyB0aGUgZ2xvYmFsIGJyYWNrZXQgc3BhY2luZ1xuICAgKiBzZXR0aW5nLlxuICAgKlxuICAgKiBAc2NoZW1hIEpzRm9ybWF0dGVyQ29uZmlndXJhdGlvbiNicmFja2V0U3BhY2luZ1xuICAgKi9cbiAgcmVhZG9ubHkgYnJhY2tldFNwYWNpbmc/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBDb250cm9scyBzcGFjZXMgaW1tZWRpYXRlbHkgaW5zaWRlIHN1cHBvcnRlZCBKYXZhU2NyaXB0IGFuZCBUeXBlU2NyaXB0IGRlbGltaXRlcnMgd2hlbiB0aGVpclxuICAgKiBjb250ZW50IGZpdHMgb24gb25lIGxpbmUuIFRoaXMgYWZmZWN0cyBwYXJlbnRoZXNlcywgc3F1YXJlIGJyYWNrZXRzLCB0ZW1wbGF0ZVxuICAgKiBpbnRlcnBvbGF0aW9ucywgVHlwZVNjcmlwdCBhbmdsZSBicmFja2V0cywgYW5kIEpTWCBleHByZXNzaW9uIGJyYWNlcy4gRW1wdHkgZGVsaW1pdGVycyBhcmVcbiAgICogdW5jaGFuZ2VkLlxuICAgKlxuICAgKiBJdCBhbHNvIGNvbnRyb2xzIHNwYWNpbmcgYWZ0ZXIgbG9naWNhbCBOT1Qgb3BlcmF0b3JzLiBJbiBhIGNoYWluIG9mIGxvZ2ljYWwgTk9UIG9wZXJhdG9ycyxcbiAgICogb25seSB0aGUgZmluYWwgb3BlcmF0b3IgcmVjZWl2ZXMgYSBmb2xsb3dpbmcgc3BhY2UuIEJpb21lIGRvZXNuJ3QgYWRkIHNwYWNlcyBiZWZvcmUgb3BlbmluZ1xuICAgKiBkZWxpbWl0ZXJzLlxuICAgKlxuICAgKiBJZiB1bnNldCwgaW5oZXJpdHMgdGhlIGdsb2JhbCBkZWxpbWl0ZXIgc3BhY2luZyBzZXR0aW5nLlxuICAgKlxuICAgKiBAc2NoZW1hIEpzRm9ybWF0dGVyQ29uZmlndXJhdGlvbiNkZWxpbWl0ZXJTcGFjaW5nXG4gICAqL1xuICByZWFkb25seSBkZWxpbWl0ZXJTcGFjaW5nPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogRW5hYmxlcyBvciBkaXNhYmxlcyB0aGUgZm9ybWF0dGVyIGZvciBKYXZhU2NyaXB0IGFuZCBsYW5ndWFnZXMgdGhhdCBleHRlbmQgaXQuXG4gICAqXG4gICAqIEBzY2hlbWEgSnNGb3JtYXR0ZXJDb25maWd1cmF0aW9uI2VuYWJsZWRcbiAgICovXG4gIHJlYWRvbmx5IGVuYWJsZWQ/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBVc2VzIHRoZSBzYW1lIGBhdXRvYCwgYGFsd2F5c2AsIGFuZCBgbmV2ZXJgIGJlaGF2aW9yIGFzIHRoZSBnbG9iYWwgZXhwYW5zaW9uIHNldHRpbmcuXG4gICAqXG4gICAqIElmIHVuc2V0LCBpbmhlcml0cyB0aGUgZ2xvYmFsIGV4cGFuc2lvbiBzZXR0aW5nLlxuICAgKlxuICAgKiBAc2NoZW1hIEpzRm9ybWF0dGVyQ29uZmlndXJhdGlvbiNleHBhbmRcbiAgICovXG4gIHJlYWRvbmx5IGV4cGFuZD86IEV4cGFuZDtcblxuICAvKipcbiAgICogVGhlIGluZGVudCBzdHlsZSBhcHBsaWVkIHRvIEphdmFTY3JpcHQgYW5kIGxhbmd1YWdlcyB0aGF0IGV4dGVuZCBpdC4gSWYgdW5zZXQsIGluaGVyaXRzIHRoZVxuICAgKiBnbG9iYWwgaW5kZW50YXRpb24gc3R5bGUuXG4gICAqXG4gICAqIEBzY2hlbWEgSnNGb3JtYXR0ZXJDb25maWd1cmF0aW9uI2luZGVudFN0eWxlXG4gICAqL1xuICByZWFkb25seSBpbmRlbnRTdHlsZT86IEluZGVudFN0eWxlO1xuXG4gIC8qKlxuICAgKiBUaGUgaW5kZW50YXRpb24gd2lkdGggYXBwbGllZCB0byBKYXZhU2NyaXB0IGFuZCBsYW5ndWFnZXMgdGhhdCBleHRlbmQgaXQuIElmIHVuc2V0LFxuICAgKiBpbmhlcml0cyB0aGUgZ2xvYmFsIGluZGVudGF0aW9uIHdpZHRoLlxuICAgKlxuICAgKiBAc2NoZW1hIEpzRm9ybWF0dGVyQ29uZmlndXJhdGlvbiNpbmRlbnRXaWR0aFxuICAgKi9cbiAgcmVhZG9ubHkgaW5kZW50V2lkdGg/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFNlbGVjdHMgdGhlIHByZWZlcnJlZCBxdW90ZSBzdHlsZSBmb3IgSlNYIGF0dHJpYnV0ZSB2YWx1ZXMuIERlZmF1bHRzIHRvIGBkb3VibGVgLlxuICAgKlxuICAgKiBAZGVmYXVsdCBkb3VibGVgLlxuICAgKiBAc2NoZW1hIEpzRm9ybWF0dGVyQ29uZmlndXJhdGlvbiNqc3hRdW90ZVN0eWxlXG4gICAqL1xuICByZWFkb25seSBqc3hRdW90ZVN0eWxlPzogUXVvdGVTdHlsZTtcblxuICAvKipcbiAgICogVGhlIGxpbmUgZW5kaW5nIGFwcGxpZWQgdG8gSmF2YVNjcmlwdCBhbmQgbGFuZ3VhZ2VzIHRoYXQgZXh0ZW5kIGl0LiBJZiB1bnNldCwgaW5oZXJpdHMgdGhlXG4gICAqIGdsb2JhbCBsaW5lIGVuZGluZy5cbiAgICpcbiAgICogQHNjaGVtYSBKc0Zvcm1hdHRlckNvbmZpZ3VyYXRpb24jbGluZUVuZGluZ1xuICAgKi9cbiAgcmVhZG9ubHkgbGluZUVuZGluZz86IExpbmVFbmRpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBwcmVmZXJyZWQgbWF4aW11bSBsaW5lIHdpZHRoIGFwcGxpZWQgdG8gSmF2YVNjcmlwdCBhbmQgbGFuZ3VhZ2VzIHRoYXQgZXh0ZW5kIGl0LiBJZlxuICAgKiB1bnNldCwgaW5oZXJpdHMgdGhlIGdsb2JhbCBsaW5lIHdpZHRoLlxuICAgKlxuICAgKiBAc2NoZW1hIEpzRm9ybWF0dGVyQ29uZmlndXJhdGlvbiNsaW5lV2lkdGhcbiAgICovXG4gIHJlYWRvbmx5IGxpbmVXaWR0aD86IG51bWJlcjtcblxuICAvKipcbiAgICogV2hlbiBicmVha2luZyBiaW5hcnkgZXhwcmVzc2lvbnMgaW50byBtdWx0aXBsZSBsaW5lcywgd2hldGhlciB0byBicmVhayB0aGVtIGJlZm9yZSBvciBhZnRlclxuICAgKiB0aGUgYmluYXJ5IG9wZXJhdG9yLiBEZWZhdWx0cyB0byBgYWZ0ZXJgLlxuICAgKlxuICAgKiBAZGVmYXVsdCBhZnRlcmAuXG4gICAqIEBzY2hlbWEgSnNGb3JtYXR0ZXJDb25maWd1cmF0aW9uI29wZXJhdG9yTGluZWJyZWFrXG4gICAqL1xuICByZWFkb25seSBvcGVyYXRvckxpbmVicmVhaz86IE9wZXJhdG9yTGluZWJyZWFrO1xuXG4gIC8qKlxuICAgKiBDb250cm9scyB3aGV0aGVyIHF1b3RlcyBhcm91bmQgb2JqZWN0IHByb3BlcnR5IG5hbWVzIGFyZSBwcmVzZXJ2ZWQuIGBhc05lZWRlZGAgcmVtb3Zlc1xuICAgKiBxdW90ZXMgd2hlbiB0aGUgcHJvcGVydHkgbmFtZSBpcyB2YWxpZCB3aXRob3V0IHRoZW0sIHdoaWxlIGBwcmVzZXJ2ZWAga2VlcHMgcXVvdGVzIGFyb3VuZFxuICAgKiBwcm9wZXJ0eSBuYW1lcyB0aGF0IHdlcmUgcXVvdGVkIGluIHRoZSBpbnB1dC4gRGVmYXVsdHMgdG8gYGFzTmVlZGVkYCBpbiBjb25maWd1cmF0aW9uXG4gICAqIChgYXMtbmVlZGVkYCBvbiB0aGUgQ0xJKS5cbiAgICpcbiAgICogQGRlZmF1bHQgYXNOZWVkZWRgIGluIGNvbmZpZ3VyYXRpb25cbiAgICogQHNjaGVtYSBKc0Zvcm1hdHRlckNvbmZpZ3VyYXRpb24jcXVvdGVQcm9wZXJ0aWVzXG4gICAqL1xuICByZWFkb25seSBxdW90ZVByb3BlcnRpZXM/OiBRdW90ZVByb3BlcnRpZXM7XG5cbiAgLyoqXG4gICAqIFNlbGVjdHMgdGhlIHByZWZlcnJlZCBxdW90ZSBzdHlsZSBmb3IgSmF2YVNjcmlwdCBhbmQgVHlwZVNjcmlwdCBzdHJpbmcgbGl0ZXJhbHMuIEJpb21lIG1heVxuICAgKiB1c2UgdGhlIGFsdGVybmF0ZSBxdW90ZSB3aGVuIHRoYXQgYXZvaWRzIGFkZGl0aW9uYWwgZXNjYXBpbmcuIERlZmF1bHRzIHRvIGBkb3VibGVgLlxuICAgKlxuICAgKiBAZGVmYXVsdCBkb3VibGVgLlxuICAgKiBAc2NoZW1hIEpzRm9ybWF0dGVyQ29uZmlndXJhdGlvbiNxdW90ZVN0eWxlXG4gICAqL1xuICByZWFkb25seSBxdW90ZVN0eWxlPzogUXVvdGVTdHlsZTtcblxuICAvKipcbiAgICogUHJpbnRzIHNlbWljb2xvbnMgYWZ0ZXIgZXZlcnkgc3RhdGVtZW50IG9yIG9ubHkgd2hlcmUgbmVlZGVkIHRvIGF2b2lkIGF1dG9tYXRpYyBzZW1pY29sb25cbiAgICogaW5zZXJ0aW9uIGhhemFyZHMuIERlZmF1bHRzIHRvIGBhbHdheXNgLlxuICAgKlxuICAgKiBAZGVmYXVsdCBhbHdheXNgLlxuICAgKiBAc2NoZW1hIEpzRm9ybWF0dGVyQ29uZmlndXJhdGlvbiNzZW1pY29sb25zXG4gICAqL1xuICByZWFkb25seSBzZW1pY29sb25zPzogU2VtaWNvbG9ucztcblxuICAvKipcbiAgICogQ29udHJvbHMgdHJhaWxpbmcgY29tbWFzIGluIG11bHRpbGluZSBjb21tYS1zZXBhcmF0ZWQgc3RydWN0dXJlcy4gYGFsbGAgYWRkcyB0cmFpbGluZyBjb21tYXNcbiAgICogd2hlcmV2ZXIgc3ludGF4IHBlcm1pdHMsIGluY2x1ZGluZyBmdW5jdGlvbiBwYXJhbWV0ZXJzIGFuZCBjYWxscy4gYGVzNWAgYWRkcyB0aGVtIG9ubHkgaW5cbiAgICogY29uc3RydWN0cyBzdXBwb3J0ZWQgYnkgRVM1LCBzdWNoIGFzIGFycmF5IGFuZCBvYmplY3QgbGl0ZXJhbHMsIGFuZCBleGNsdWRlcyBmdW5jdGlvblxuICAgKiBwYXJhbWV0ZXJzLCBmdW5jdGlvbiBjYWxscywgYW5kIFR5cGVTY3JpcHQgdHlwZSBwYXJhbWV0ZXJzLiBgbm9uZWAgcmVtb3ZlcyB0cmFpbGluZyBjb21tYXMuXG4gICAqIERlZmF1bHRzIHRvIGBhbGxgLlxuICAgKlxuICAgKiBAZGVmYXVsdCBhbGxgLlxuICAgKiBAc2NoZW1hIEpzRm9ybWF0dGVyQ29uZmlndXJhdGlvbiN0cmFpbGluZ0NvbW1hc1xuICAgKi9cbiAgcmVhZG9ubHkgdHJhaWxpbmdDb21tYXM/OiBKc1RyYWlsaW5nQ29tbWFzO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIGFkZCBhIHRyYWlsaW5nIG5ld2xpbmUgYXQgdGhlIGVuZCBvZiB0aGUgZmlsZS4gSWYgdW5zZXQsIGluaGVyaXRzIHRoZSBnbG9iYWxcbiAgICogdHJhaWxpbmcgbmV3bGluZSBzZXR0aW5nLlxuICAgKlxuICAgKiBAc2NoZW1hIEpzRm9ybWF0dGVyQ29uZmlndXJhdGlvbiN0cmFpbGluZ05ld2xpbmVcbiAgICovXG4gIHJlYWRvbmx5IHRyYWlsaW5nTmV3bGluZT86IGJvb2xlYW47XG59XG5cbi8qKlxuICogQ29udmVydHMgYW4gb2JqZWN0IG9mIHR5cGUgJ0pzRm9ybWF0dGVyQ29uZmlndXJhdGlvbicgdG8gSlNPTiByZXByZXNlbnRhdGlvbi5cbiAqIEBpbnRlcm5hbFxuICovXG4vKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5leHBvcnQgZnVuY3Rpb24gdG9Kc29uX0pzRm9ybWF0dGVyQ29uZmlndXJhdGlvbihvYmo6IEpzRm9ybWF0dGVyQ29uZmlndXJhdGlvbiB8IHVuZGVmaW5lZCk6IFJlY29yZDxzdHJpbmcsIGFueT4gfCB1bmRlZmluZWQge1xuICBpZiAob2JqID09PSB1bmRlZmluZWQpIHsgcmV0dXJuIHVuZGVmaW5lZDsgfVxuICBjb25zdCByZXN1bHQgPSB7XG4gICAgJ2Fycm93UGFyZW50aGVzZXMnOiBvYmouYXJyb3dQYXJlbnRoZXNlcyxcbiAgICAnYXR0cmlidXRlUG9zaXRpb24nOiBvYmouYXR0cmlidXRlUG9zaXRpb24sXG4gICAgJ2JyYWNrZXRTYW1lTGluZSc6IG9iai5icmFja2V0U2FtZUxpbmUsXG4gICAgJ2JyYWNrZXRTcGFjaW5nJzogb2JqLmJyYWNrZXRTcGFjaW5nLFxuICAgICdkZWxpbWl0ZXJTcGFjaW5nJzogb2JqLmRlbGltaXRlclNwYWNpbmcsXG4gICAgJ2VuYWJsZWQnOiBvYmouZW5hYmxlZCxcbiAgICAnZXhwYW5kJzogb2JqLmV4cGFuZCxcbiAgICAnaW5kZW50U3R5bGUnOiBvYmouaW5kZW50U3R5bGUsXG4gICAgJ2luZGVudFdpZHRoJzogb2JqLmluZGVudFdpZHRoLFxuICAgICdqc3hRdW90ZVN0eWxlJzogb2JqLmpzeFF1b3RlU3R5bGUsXG4gICAgJ2xpbmVFbmRpbmcnOiBvYmoubGluZUVuZGluZyxcbiAgICAnbGluZVdpZHRoJzogb2JqLmxpbmVXaWR0aCxcbiAgICAnb3BlcmF0b3JMaW5lYnJlYWsnOiBvYmoub3BlcmF0b3JMaW5lYnJlYWssXG4gICAgJ3F1b3RlUHJvcGVydGllcyc6IG9iai5xdW90ZVByb3BlcnRpZXMsXG4gICAgJ3F1b3RlU3R5bGUnOiBvYmoucXVvdGVTdHlsZSxcbiAgICAnc2VtaWNvbG9ucyc6IG9iai5zZW1pY29sb25zLFxuICAgICd0cmFpbGluZ0NvbW1hcyc6IG9iai50cmFpbGluZ0NvbW1hcyxcbiAgICAndHJhaWxpbmdOZXdsaW5lJzogb2JqLnRyYWlsaW5nTmV3bGluZSxcbiAgfTtcbiAgLy8gZmlsdGVyIHVuZGVmaW5lZCB2YWx1ZXNcbiAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKHJlc3VsdCkucmVkdWNlKChyLCBpKSA9PiAoaVsxXSA9PT0gdW5kZWZpbmVkKSA/IHIgOiAoeyAuLi5yLCBbaVswXV06IGlbMV0gfSksIHt9KTtcbn1cbi8qIGVzbGludC1lbmFibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuXG4vKipcbiAqIEhvdyBCaW9tZSdzIGFuYWx5emVyIGFjY291bnRzIGZvciBpbXBvcnRzIHVzZWQgYnkgSlNYLlxuICpcbiAqIEBzY2hlbWEgSnN4UnVudGltZVxuICovXG5leHBvcnQgZW51bSBKc3hSdW50aW1lIHtcbiAgLyoqIEFuIGF1dG9tYXRpYyBvciBuYXRpdmUgSlNYIGVudmlyb25tZW50IHRoYXQgZG9lc24ndCByZXF1aXJlIGFuIGluLXNjb3BlIGZhY3RvcnkgaW1wb3J0LiAodHJhbnNwYXJlbnQpICovXG4gIFRSQU5TUEFSRU5UID0gXCJ0cmFuc3BhcmVudFwiLFxuICAvKiogQSBjbGFzc2ljIFJlYWN0IGVudmlyb25tZW50IHRoYXQgcmVxdWlyZXMgdGhlIFJlYWN0IGltcG9ydCwgb3IgY3VzdG9tIEpTWCBmYWN0b3J5IGltcG9ydHNcbmNvbmZpZ3VyZWQgaW4gYHRzY29uZmlnLmpzb25gLlxuXG5Db3JyZXNwb25kcyB0byB0aGUgYHJlYWN0YCB2YWx1ZSBmb3IgdGhlIGBqc3hgIG9wdGlvbiBpbiBUeXBlU2NyaXB0J3NcbmB0c2NvbmZpZy5qc29uYC5cblxuVGhpcyBvcHRpb24gc2hvdWxkIG9ubHkgYmUgbmVjZXNzYXJ5IGlmIHlvdSBjYW5ub3QgdXBncmFkZSB0byBhIFJlYWN0XG52ZXJzaW9uIHRoYXQgc3VwcG9ydHMgdGhlIG5ldyBKU1ggcnVudGltZS4gRm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXRcbnRoZSBvbGQgdnMuIG5ldyBKU1ggcnVudGltZSwgcGxlYXNlIHNlZTpcbjxodHRwczovL2xlZ2FjeS5yZWFjdGpzLm9yZy9ibG9nLzIwMjAvMDkvMjIvaW50cm9kdWNpbmctdGhlLW5ldy1qc3gtdHJhbnNmb3JtLmh0bWw+IChyZWFjdENsYXNzaWMpICovXG4gIFJFQUNUX0NMQVNTSUMgPSBcInJlYWN0Q2xhc3NpY1wiLFxufVxuXG4vKipcbiAqIExpbnRlciBvcHRpb25zIHNwZWNpZmljIHRvIHRoZSBKYXZhU2NyaXB0IGxpbnRlclxuICpcbiAqIEBzY2hlbWEgSnNMaW50ZXJDb25maWd1cmF0aW9uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSnNMaW50ZXJDb25maWd1cmF0aW9uIHtcbiAgLyoqXG4gICAqIEVuYWJsZXMgb3IgZGlzYWJsZXMgdGhlIGxpbnRlciBmb3IgSmF2YVNjcmlwdCBhbmQgbGFuZ3VhZ2VzIHRoYXQgZXh0ZW5kIGl0LlxuICAgKlxuICAgKiBAc2NoZW1hIEpzTGludGVyQ29uZmlndXJhdGlvbiNlbmFibGVkXG4gICAqL1xuICByZWFkb25seSBlbmFibGVkPzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhbiBvYmplY3Qgb2YgdHlwZSAnSnNMaW50ZXJDb25maWd1cmF0aW9uJyB0byBKU09OIHJlcHJlc2VudGF0aW9uLlxuICogQGludGVybmFsXG4gKi9cbi8qIGVzbGludC1kaXNhYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0pzb25fSnNMaW50ZXJDb25maWd1cmF0aW9uKG9iajogSnNMaW50ZXJDb25maWd1cmF0aW9uIHwgdW5kZWZpbmVkKTogUmVjb3JkPHN0cmluZywgYW55PiB8IHVuZGVmaW5lZCB7XG4gIGlmIChvYmogPT09IHVuZGVmaW5lZCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9XG4gIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAnZW5hYmxlZCc6IG9iai5lbmFibGVkLFxuICB9O1xuICAvLyBmaWx0ZXIgdW5kZWZpbmVkIHZhbHVlc1xuICByZXR1cm4gT2JqZWN0LmVudHJpZXMocmVzdWx0KS5yZWR1Y2UoKHIsIGkpID0+IChpWzFdID09PSB1bmRlZmluZWQpID8gciA6ICh7IC4uLnIsIFtpWzBdXTogaVsxXSB9KSwge30pO1xufVxuLyogZXNsaW50LWVuYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5cbi8qKlxuICogT3B0aW9ucyB0aGF0IGNoYW5nZSBob3cgdGhlIEphdmFTY3JpcHQgcGFyc2VyIGJlaGF2ZXMuXG4gKlxuICogQHNjaGVtYSBKc1BhcnNlckNvbmZpZ3VyYXRpb25cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBKc1BhcnNlckNvbmZpZ3VyYXRpb24ge1xuICAvKipcbiAgICogQ29udHJvbHMgd2hldGhlciBgLmpzYCwgYC5tanNgLCBhbmQgYC5janNgIGZpbGVzIG1heSBjb250YWluIEpTWCBzeW50YXguIERpc2FibGluZyB0aGlzXG4gICAqIG9wdGlvbiBjYXVzZXMgSlNYIGluIHRob3NlIGZpbGVzIHRvIHJhaXNlIGEgZGlhZ25vc3RpYy4gRGVmYXVsdHMgdG8gYHRydWVgLlxuICAgKlxuICAgKiBAZGVmYXVsdCB0cnVlYC5cbiAgICogQHNjaGVtYSBKc1BhcnNlckNvbmZpZ3VyYXRpb24janN4RXZlcnl3aGVyZVxuICAgKi9cbiAgcmVhZG9ubHkganN4RXZlcnl3aGVyZT86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEVuYWJsZXMgcGFyc2luZyBkZWNvcmF0b3JzIG9uIGNsYXNzIHBhcmFtZXRlcnMuIFRoaXMgc3ludGF4IGJlbG9uZ3MgdG8gYW4gb2xkIGV4cGVyaW1lbnRhbFxuICAgKiBwcm9wb3NhbCBhbmQgbWF5IGNoYW5nZS4gRGVmYXVsdHMgdG8gYGZhbHNlYC5cbiAgICpcbiAgICogQGRlZmF1bHQgZmFsc2VgLlxuICAgKiBAc2NoZW1hIEpzUGFyc2VyQ29uZmlndXJhdGlvbiN1bnNhZmVQYXJhbWV0ZXJEZWNvcmF0b3JzRW5hYmxlZFxuICAgKi9cbiAgcmVhZG9ubHkgdW5zYWZlUGFyYW1ldGVyRGVjb3JhdG9yc0VuYWJsZWQ/OiBib29sZWFuO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGFuIG9iamVjdCBvZiB0eXBlICdKc1BhcnNlckNvbmZpZ3VyYXRpb24nIHRvIEpTT04gcmVwcmVzZW50YXRpb24uXG4gKiBAaW50ZXJuYWxcbiAqL1xuLyogZXNsaW50LWRpc2FibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvSnNvbl9Kc1BhcnNlckNvbmZpZ3VyYXRpb24ob2JqOiBKc1BhcnNlckNvbmZpZ3VyYXRpb24gfCB1bmRlZmluZWQpOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgdW5kZWZpbmVkIHtcbiAgaWYgKG9iaiA9PT0gdW5kZWZpbmVkKSB7IHJldHVybiB1bmRlZmluZWQ7IH1cbiAgY29uc3QgcmVzdWx0ID0ge1xuICAgICdqc3hFdmVyeXdoZXJlJzogb2JqLmpzeEV2ZXJ5d2hlcmUsXG4gICAgJ3Vuc2FmZVBhcmFtZXRlckRlY29yYXRvcnNFbmFibGVkJzogb2JqLnVuc2FmZVBhcmFtZXRlckRlY29yYXRvcnNFbmFibGVkLFxuICB9O1xuICAvLyBmaWx0ZXIgdW5kZWZpbmVkIHZhbHVlc1xuICByZXR1cm4gT2JqZWN0LmVudHJpZXMocmVzdWx0KS5yZWR1Y2UoKHIsIGkpID0+IChpWzFdID09PSB1bmRlZmluZWQpID8gciA6ICh7IC4uLnIsIFtpWzBdXTogaVsxXSB9KSwge30pO1xufVxuLyogZXNsaW50LWVuYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5cbi8qKlxuICogUmVzb2x2ZXIgb3B0aW9ucyBzcGVjaWZpYyB0byBKYXZhU2NyaXB0IGZpbGVzXG4gKlxuICogQHNjaGVtYSBKc1Jlc29sdmVyQ29uZmlndXJhdGlvblxuICovXG5leHBvcnQgaW50ZXJmYWNlIEpzUmVzb2x2ZXJDb25maWd1cmF0aW9uIHtcbiAgLyoqXG4gICAqIEVuYWJsZXMgcG5wbSB3b3Jrc3BhY2UgY2F0YWxvZyByZXNvbHV0aW9uIGZvciBKYXZhU2NyaXB0IHBhY2thZ2UgbWFuaWZlc3RzLlxuICAgKlxuICAgKiBPcHQtaW46XG4gICAqIC0gU2V0IGBqYXZhc2NyaXB0LnJlc29sdmVyLmV4cGVyaW1lbnRhbFBucG1DYXRhbG9nc2AgdG8gYHRydWVgLlxuICAgKlxuICAgKiBTY29wZTpcbiAgICogLSBSZXNvbHZlcyBgY2F0YWxvZzpgIGFuZCBgY2F0YWxvZzo8bmFtZT5gIGRlcGVuZGVuY3kgdmVyc2lvbnMgZnJvbVxuICAgKiBgcGFja2FnZS5qc29uYC5cbiAgICogLSBBcHBsaWVzIHRvIGBkZXBlbmRlbmNpZXNgLCBgZGV2RGVwZW5kZW5jaWVzYCwgYW5kIGBwZWVyRGVwZW5kZW5jaWVzYC5cbiAgICpcbiAgICogRmFpbC1zYWZlIGJlaGF2aW9yOlxuICAgKiAtIElmIGBwbnBtLXdvcmtzcGFjZS55YW1sYCBpcyBtaXNzaW5nLCB1bnJlYWRhYmxlLCBvciBjYW5ub3QgYmUgcGFyc2VkLFxuICAgKiBCaW9tZSBzaWxlbnRseSBmYWxscyBiYWNrIHRvIHRoZSBkZWZhdWx0IGJlaGF2aW9yIChhcyBpZiB0aGlzIG9wdGlvblxuICAgKiB3ZXJlIGRpc2FibGVkKS5cbiAgICogLSBVbmtub3duIGtleXMgYW5kIHVuc3VwcG9ydGVkIHZhbHVlIHNoYXBlcyBpbiBgcG5wbS13b3Jrc3BhY2UueWFtbGAgYXJlXG4gICAqIGlnbm9yZWQuXG4gICAqXG4gICAqIExpbWl0YXRpb25zOlxuICAgKiAtIE9ubHkgYHBucG0td29ya3NwYWNlLnlhbWxgIGlzIHJlYWQuXG4gICAqIC0gQmlvbWUgb25seSByZWFkcyB0b3AtbGV2ZWwgYGNhdGFsb2dgIC8gYGNhdGFsb2dzYCBtYXBwaW5ncyBhbmQgc2NhbGFyXG4gICAqIHN0cmluZyBlbnRyaWVzLlxuICAgKlxuICAgKiBEZWZhdWx0cyB0byBgZmFsc2VgLlxuICAgKlxuICAgKiBAZGVmYXVsdCBmYWxzZWAuXG4gICAqIEBzY2hlbWEgSnNSZXNvbHZlckNvbmZpZ3VyYXRpb24jZXhwZXJpbWVudGFsUG5wbUNhdGFsb2dzXG4gICAqL1xuICByZWFkb25seSBleHBlcmltZW50YWxQbnBtQ2F0YWxvZ3M/OiBib29sZWFuO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGFuIG9iamVjdCBvZiB0eXBlICdKc1Jlc29sdmVyQ29uZmlndXJhdGlvbicgdG8gSlNPTiByZXByZXNlbnRhdGlvbi5cbiAqIEBpbnRlcm5hbFxuICovXG4vKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5leHBvcnQgZnVuY3Rpb24gdG9Kc29uX0pzUmVzb2x2ZXJDb25maWd1cmF0aW9uKG9iajogSnNSZXNvbHZlckNvbmZpZ3VyYXRpb24gfCB1bmRlZmluZWQpOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgdW5kZWZpbmVkIHtcbiAgaWYgKG9iaiA9PT0gdW5kZWZpbmVkKSB7IHJldHVybiB1bmRlZmluZWQ7IH1cbiAgY29uc3QgcmVzdWx0ID0ge1xuICAgICdleHBlcmltZW50YWxQbnBtQ2F0YWxvZ3MnOiBvYmouZXhwZXJpbWVudGFsUG5wbUNhdGFsb2dzLFxuICB9O1xuICAvLyBmaWx0ZXIgdW5kZWZpbmVkIHZhbHVlc1xuICByZXR1cm4gT2JqZWN0LmVudHJpZXMocmVzdWx0KS5yZWR1Y2UoKHIsIGkpID0+IChpWzFdID09PSB1bmRlZmluZWQpID8gciA6ICh7IC4uLnIsIFtpWzBdXTogaVsxXSB9KSwge30pO1xufVxuLyogZXNsaW50LWVuYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5cbi8qKlxuICogQXNzaXN0IG9wdGlvbnMgc3BlY2lmaWMgdG8gdGhlIEpTT04gbGludGVyXG4gKlxuICogQHNjaGVtYSBKc29uQXNzaXN0Q29uZmlndXJhdGlvblxuICovXG5leHBvcnQgaW50ZXJmYWNlIEpzb25Bc3Npc3RDb25maWd1cmF0aW9uIHtcbiAgLyoqXG4gICAqIEVuYWJsZXMgb3IgZGlzYWJsZXMgYXNzaXN0IGFjdGlvbnMgZm9yIEpTT04gYW5kIGxhbmd1YWdlcyB0aGF0IGV4dGVuZCBpdC5cbiAgICpcbiAgICogQHNjaGVtYSBKc29uQXNzaXN0Q29uZmlndXJhdGlvbiNlbmFibGVkXG4gICAqL1xuICByZWFkb25seSBlbmFibGVkPzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhbiBvYmplY3Qgb2YgdHlwZSAnSnNvbkFzc2lzdENvbmZpZ3VyYXRpb24nIHRvIEpTT04gcmVwcmVzZW50YXRpb24uXG4gKiBAaW50ZXJuYWxcbiAqL1xuLyogZXNsaW50LWRpc2FibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvSnNvbl9Kc29uQXNzaXN0Q29uZmlndXJhdGlvbihvYmo6IEpzb25Bc3Npc3RDb25maWd1cmF0aW9uIHwgdW5kZWZpbmVkKTogUmVjb3JkPHN0cmluZywgYW55PiB8IHVuZGVmaW5lZCB7XG4gIGlmIChvYmogPT09IHVuZGVmaW5lZCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9XG4gIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAnZW5hYmxlZCc6IG9iai5lbmFibGVkLFxuICB9O1xuICAvLyBmaWx0ZXIgdW5kZWZpbmVkIHZhbHVlc1xuICByZXR1cm4gT2JqZWN0LmVudHJpZXMocmVzdWx0KS5yZWR1Y2UoKHIsIGkpID0+IChpWzFdID09PSB1bmRlZmluZWQpID8gciA6ICh7IC4uLnIsIFtpWzBdXTogaVsxXSB9KSwge30pO1xufVxuLyogZXNsaW50LWVuYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5cbi8qKlxuICogQHNjaGVtYSBKc29uRm9ybWF0dGVyQ29uZmlndXJhdGlvblxuICovXG5leHBvcnQgaW50ZXJmYWNlIEpzb25Gb3JtYXR0ZXJDb25maWd1cmF0aW9uIHtcbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gaW5zZXJ0IHNwYWNlcyBpbnNpZGUgYnJhY2VzIGluIG9iamVjdCBsaXRlcmFscy4gSWYgdW5zZXQsIGluaGVyaXRzIHRoZSBnbG9iYWxcbiAgICogYnJhY2tldCBzcGFjaW5nIHNldHRpbmcuXG4gICAqXG4gICAqIEBzY2hlbWEgSnNvbkZvcm1hdHRlckNvbmZpZ3VyYXRpb24jYnJhY2tldFNwYWNpbmdcbiAgICovXG4gIHJlYWRvbmx5IGJyYWNrZXRTcGFjaW5nPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogQ29udHJvbHMgc3BhY2VzIGluc2lkZSBKU09OIHNxdWFyZSBicmFja2V0cyB3aGVuIHRoZWlyIGNvbnRlbnQgZml0cyBvbiBvbmUgbGluZS4gV2hlblxuICAgKiBlbmFibGVkLCBgWzEsIDIsIDNdYCBiZWNvbWVzIGBbIDEsIDIsIDMgXWAuIEVtcHR5IGJyYWNrZXRzIGFyZSB1bmNoYW5nZWQuXG4gICAqXG4gICAqIElmIHVuc2V0LCBpbmhlcml0cyB0aGUgZ2xvYmFsIGRlbGltaXRlciBzcGFjaW5nIHNldHRpbmcuXG4gICAqXG4gICAqIEBzY2hlbWEgSnNvbkZvcm1hdHRlckNvbmZpZ3VyYXRpb24jZGVsaW1pdGVyU3BhY2luZ1xuICAgKi9cbiAgcmVhZG9ubHkgZGVsaW1pdGVyU3BhY2luZz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEVuYWJsZXMgb3IgZGlzYWJsZXMgdGhlIGZvcm1hdHRlciBmb3IgSlNPTiBhbmQgbGFuZ3VhZ2VzIHRoYXQgZXh0ZW5kIGl0LlxuICAgKlxuICAgKiBAc2NoZW1hIEpzb25Gb3JtYXR0ZXJDb25maWd1cmF0aW9uI2VuYWJsZWRcbiAgICovXG4gIHJlYWRvbmx5IGVuYWJsZWQ/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBVc2VzIHRoZSBzYW1lIGBhdXRvYCwgYGFsd2F5c2AsIGFuZCBgbmV2ZXJgIGJlaGF2aW9yIGFzIHRoZSBnbG9iYWwgZXhwYW5zaW9uIHNldHRpbmcuXG4gICAqXG4gICAqIElmIHVuc2V0LCBpbmhlcml0cyB0aGUgZ2xvYmFsIGV4cGFuc2lvbiBzZXR0aW5nLlxuICAgKlxuICAgKiBXaGVuIGZvcm1hdHRpbmcgYHBhY2thZ2UuanNvbmAsIEJpb21lIHVzZXMgYGFsd2F5c2AgdW5sZXNzIGNvbmZpZ3VyZWQgb3RoZXJ3aXNlLlxuICAgKlxuICAgKiBAc2NoZW1hIEpzb25Gb3JtYXR0ZXJDb25maWd1cmF0aW9uI2V4cGFuZFxuICAgKi9cbiAgcmVhZG9ubHkgZXhwYW5kPzogRXhwYW5kO1xuXG4gIC8qKlxuICAgKiBUaGUgaW5kZW50IHN0eWxlIGFwcGxpZWQgdG8gSlNPTiBhbmQgbGFuZ3VhZ2VzIHRoYXQgZXh0ZW5kIGl0LiBJZiB1bnNldCwgaW5oZXJpdHMgdGhlIGdsb2JhbFxuICAgKiBpbmRlbnRhdGlvbiBzdHlsZS5cbiAgICpcbiAgICogQHNjaGVtYSBKc29uRm9ybWF0dGVyQ29uZmlndXJhdGlvbiNpbmRlbnRTdHlsZVxuICAgKi9cbiAgcmVhZG9ubHkgaW5kZW50U3R5bGU/OiBJbmRlbnRTdHlsZTtcblxuICAvKipcbiAgICogVGhlIGluZGVudGF0aW9uIHdpZHRoIGFwcGxpZWQgdG8gSlNPTiBhbmQgbGFuZ3VhZ2VzIHRoYXQgZXh0ZW5kIGl0LiBJZiB1bnNldCwgaW5oZXJpdHMgdGhlXG4gICAqIGdsb2JhbCBpbmRlbnRhdGlvbiB3aWR0aC5cbiAgICpcbiAgICogQHNjaGVtYSBKc29uRm9ybWF0dGVyQ29uZmlndXJhdGlvbiNpbmRlbnRXaWR0aFxuICAgKi9cbiAgcmVhZG9ubHkgaW5kZW50V2lkdGg/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFRoZSBsaW5lIGVuZGluZyBhcHBsaWVkIHRvIEpTT04gYW5kIGxhbmd1YWdlcyB0aGF0IGV4dGVuZCBpdC4gSWYgdW5zZXQsIGluaGVyaXRzIHRoZSBnbG9iYWxcbiAgICogbGluZSBlbmRpbmcuXG4gICAqXG4gICAqIEBzY2hlbWEgSnNvbkZvcm1hdHRlckNvbmZpZ3VyYXRpb24jbGluZUVuZGluZ1xuICAgKi9cbiAgcmVhZG9ubHkgbGluZUVuZGluZz86IExpbmVFbmRpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBwcmVmZXJyZWQgbWF4aW11bSBsaW5lIHdpZHRoIGFwcGxpZWQgdG8gSlNPTiBhbmQgbGFuZ3VhZ2VzIHRoYXQgZXh0ZW5kIGl0LiBJZiB1bnNldCxcbiAgICogaW5oZXJpdHMgdGhlIGdsb2JhbCBsaW5lIHdpZHRoLlxuICAgKlxuICAgKiBAc2NoZW1hIEpzb25Gb3JtYXR0ZXJDb25maWd1cmF0aW9uI2xpbmVXaWR0aFxuICAgKi9cbiAgcmVhZG9ubHkgbGluZVdpZHRoPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBDb250cm9scyB0cmFpbGluZyBjb21tYXMgaW4gbXVsdGlsaW5lIEpTT04gYXJyYXlzIGFuZCBvYmplY3RzLiBgbm9uZWAgcmVtb3ZlcyB0cmFpbGluZ1xuICAgKiBjb21tYXMsIHdoaWxlIGBhbGxgIGFkZHMgdGhlbSB3aGVyZXZlciB0aGUgSlNPTiBmb3JtYXR0ZXIgc3VwcG9ydHMgdGhlbS4gVXNlIGBhbGxgIG9ubHkgZm9yXG4gICAqIEpTT04gdmFyaWFudHMgdGhhdCBhbGxvdyB0cmFpbGluZyBjb21tYXMsIGFuZCBlbnN1cmUgYGpzb24ucGFyc2VyLmFsbG93VHJhaWxpbmdDb21tYXNgIGlzXG4gICAqIGVuYWJsZWQgb3IgYXV0b21hdGljYWxseSBkZXRlY3RlZCBmb3IgdGhvc2UgZmlsZXMuIERlZmF1bHRzIHRvIGBub25lYC5cbiAgICpcbiAgICogQGRlZmF1bHQgbm9uZWAuXG4gICAqIEBzY2hlbWEgSnNvbkZvcm1hdHRlckNvbmZpZ3VyYXRpb24jdHJhaWxpbmdDb21tYXNcbiAgICovXG4gIHJlYWRvbmx5IHRyYWlsaW5nQ29tbWFzPzogSnNvblRyYWlsaW5nQ29tbWFzO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIGFkZCBhIHRyYWlsaW5nIG5ld2xpbmUgYXQgdGhlIGVuZCBvZiB0aGUgZmlsZS4gSWYgdW5zZXQsIGluaGVyaXRzIHRoZSBnbG9iYWxcbiAgICogdHJhaWxpbmcgbmV3bGluZSBzZXR0aW5nLlxuICAgKlxuICAgKiBAc2NoZW1hIEpzb25Gb3JtYXR0ZXJDb25maWd1cmF0aW9uI3RyYWlsaW5nTmV3bGluZVxuICAgKi9cbiAgcmVhZG9ubHkgdHJhaWxpbmdOZXdsaW5lPzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhbiBvYmplY3Qgb2YgdHlwZSAnSnNvbkZvcm1hdHRlckNvbmZpZ3VyYXRpb24nIHRvIEpTT04gcmVwcmVzZW50YXRpb24uXG4gKiBAaW50ZXJuYWxcbiAqL1xuLyogZXNsaW50LWRpc2FibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvSnNvbl9Kc29uRm9ybWF0dGVyQ29uZmlndXJhdGlvbihvYmo6IEpzb25Gb3JtYXR0ZXJDb25maWd1cmF0aW9uIHwgdW5kZWZpbmVkKTogUmVjb3JkPHN0cmluZywgYW55PiB8IHVuZGVmaW5lZCB7XG4gIGlmIChvYmogPT09IHVuZGVmaW5lZCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9XG4gIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAnYnJhY2tldFNwYWNpbmcnOiBvYmouYnJhY2tldFNwYWNpbmcsXG4gICAgJ2RlbGltaXRlclNwYWNpbmcnOiBvYmouZGVsaW1pdGVyU3BhY2luZyxcbiAgICAnZW5hYmxlZCc6IG9iai5lbmFibGVkLFxuICAgICdleHBhbmQnOiBvYmouZXhwYW5kLFxuICAgICdpbmRlbnRTdHlsZSc6IG9iai5pbmRlbnRTdHlsZSxcbiAgICAnaW5kZW50V2lkdGgnOiBvYmouaW5kZW50V2lkdGgsXG4gICAgJ2xpbmVFbmRpbmcnOiBvYmoubGluZUVuZGluZyxcbiAgICAnbGluZVdpZHRoJzogb2JqLmxpbmVXaWR0aCxcbiAgICAndHJhaWxpbmdDb21tYXMnOiBvYmoudHJhaWxpbmdDb21tYXMsXG4gICAgJ3RyYWlsaW5nTmV3bGluZSc6IG9iai50cmFpbGluZ05ld2xpbmUsXG4gIH07XG4gIC8vIGZpbHRlciB1bmRlZmluZWQgdmFsdWVzXG4gIHJldHVybiBPYmplY3QuZW50cmllcyhyZXN1bHQpLnJlZHVjZSgociwgaSkgPT4gKGlbMV0gPT09IHVuZGVmaW5lZCkgPyByIDogKHsgLi4uciwgW2lbMF1dOiBpWzFdIH0pLCB7fSk7XG59XG4vKiBlc2xpbnQtZW5hYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cblxuLyoqXG4gKiBMaW50ZXIgb3B0aW9ucyBzcGVjaWZpYyB0byB0aGUgSlNPTiBsaW50ZXJcbiAqXG4gKiBAc2NoZW1hIEpzb25MaW50ZXJDb25maWd1cmF0aW9uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSnNvbkxpbnRlckNvbmZpZ3VyYXRpb24ge1xuICAvKipcbiAgICogRW5hYmxlcyBvciBkaXNhYmxlcyB0aGUgbGludGVyIGZvciBKU09OIGFuZCBsYW5ndWFnZXMgdGhhdCBleHRlbmQgaXQuXG4gICAqXG4gICAqIEBzY2hlbWEgSnNvbkxpbnRlckNvbmZpZ3VyYXRpb24jZW5hYmxlZFxuICAgKi9cbiAgcmVhZG9ubHkgZW5hYmxlZD86IGJvb2xlYW47XG59XG5cbi8qKlxuICogQ29udmVydHMgYW4gb2JqZWN0IG9mIHR5cGUgJ0pzb25MaW50ZXJDb25maWd1cmF0aW9uJyB0byBKU09OIHJlcHJlc2VudGF0aW9uLlxuICogQGludGVybmFsXG4gKi9cbi8qIGVzbGludC1kaXNhYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0pzb25fSnNvbkxpbnRlckNvbmZpZ3VyYXRpb24ob2JqOiBKc29uTGludGVyQ29uZmlndXJhdGlvbiB8IHVuZGVmaW5lZCk6IFJlY29yZDxzdHJpbmcsIGFueT4gfCB1bmRlZmluZWQge1xuICBpZiAob2JqID09PSB1bmRlZmluZWQpIHsgcmV0dXJuIHVuZGVmaW5lZDsgfVxuICBjb25zdCByZXN1bHQgPSB7XG4gICAgJ2VuYWJsZWQnOiBvYmouZW5hYmxlZCxcbiAgfTtcbiAgLy8gZmlsdGVyIHVuZGVmaW5lZCB2YWx1ZXNcbiAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKHJlc3VsdCkucmVkdWNlKChyLCBpKSA9PiAoaVsxXSA9PT0gdW5kZWZpbmVkKSA/IHIgOiAoeyAuLi5yLCBbaVswXV06IGlbMV0gfSksIHt9KTtcbn1cbi8qIGVzbGludC1lbmFibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuXG4vKipcbiAqIE9wdGlvbnMgdGhhdCBjaGFuZ2UgaG93IHRoZSBKU09OIHBhcnNlciBiZWhhdmVzLlxuICpcbiAqIEBzY2hlbWEgSnNvblBhcnNlckNvbmZpZ3VyYXRpb25cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBKc29uUGFyc2VyQ29uZmlndXJhdGlvbiB7XG4gIC8qKlxuICAgKiBDb250cm9scyB3aGV0aGVyIGNvbW1lbnRzIGFyZSBhbGxvd2VkIGluIGZpbGVzIHBhcnNlZCBhcyBKU09OLiBXaGVuIHVuc2V0LCBCaW9tZSBmb2xsb3dzIHRoZVxuICAgKiBmaWxlIHR5cGUncyBkZWZhdWx0IGJlaGF2aW9yLiBBbiBleHBsaWNpdCB2YWx1ZSBvdmVycmlkZXMgdGhhdCBiZWhhdmlvciwgZXhjZXB0IHRoYXRcbiAgICogYGJpb21lLmpzb25jYCBhbHdheXMgYWxsb3dzIGNvbW1lbnRzLlxuICAgKlxuICAgKiBAc2NoZW1hIEpzb25QYXJzZXJDb25maWd1cmF0aW9uI2FsbG93Q29tbWVudHNcbiAgICovXG4gIHJlYWRvbmx5IGFsbG93Q29tbWVudHM/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBDb250cm9scyB3aGV0aGVyIHRyYWlsaW5nIGNvbW1hcyBhcmUgYWxsb3dlZCBpbiBmaWxlcyBwYXJzZWQgYXMgSlNPTi4gV2hlbiB1bnNldCwgQmlvbWVcbiAgICogZm9sbG93cyB0aGUgZmlsZSB0eXBlJ3MgZGVmYXVsdCBiZWhhdmlvci4gQW4gZXhwbGljaXQgdmFsdWUgb3ZlcnJpZGVzIHRoYXQgYmVoYXZpb3IsIGV4Y2VwdFxuICAgKiB0aGF0IGBiaW9tZS5qc29uY2AgYWx3YXlzIGFsbG93cyB0cmFpbGluZyBjb21tYXMuXG4gICAqXG4gICAqIEBzY2hlbWEgSnNvblBhcnNlckNvbmZpZ3VyYXRpb24jYWxsb3dUcmFpbGluZ0NvbW1hc1xuICAgKi9cbiAgcmVhZG9ubHkgYWxsb3dUcmFpbGluZ0NvbW1hcz86IGJvb2xlYW47XG59XG5cbi8qKlxuICogQ29udmVydHMgYW4gb2JqZWN0IG9mIHR5cGUgJ0pzb25QYXJzZXJDb25maWd1cmF0aW9uJyB0byBKU09OIHJlcHJlc2VudGF0aW9uLlxuICogQGludGVybmFsXG4gKi9cbi8qIGVzbGludC1kaXNhYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0pzb25fSnNvblBhcnNlckNvbmZpZ3VyYXRpb24ob2JqOiBKc29uUGFyc2VyQ29uZmlndXJhdGlvbiB8IHVuZGVmaW5lZCk6IFJlY29yZDxzdHJpbmcsIGFueT4gfCB1bmRlZmluZWQge1xuICBpZiAob2JqID09PSB1bmRlZmluZWQpIHsgcmV0dXJuIHVuZGVmaW5lZDsgfVxuICBjb25zdCByZXN1bHQgPSB7XG4gICAgJ2FsbG93Q29tbWVudHMnOiBvYmouYWxsb3dDb21tZW50cyxcbiAgICAnYWxsb3dUcmFpbGluZ0NvbW1hcyc6IG9iai5hbGxvd1RyYWlsaW5nQ29tbWFzLFxuICB9O1xuICAvLyBmaWx0ZXIgdW5kZWZpbmVkIHZhbHVlc1xuICByZXR1cm4gT2JqZWN0LmVudHJpZXMocmVzdWx0KS5yZWR1Y2UoKHIsIGkpID0+IChpWzFdID09PSB1bmRlZmluZWQpID8gciA6ICh7IC4uLnIsIFtpWzBdXTogaVsxXSB9KSwge30pO1xufVxuLyogZXNsaW50LWVuYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5cbi8qKlxuICogQHNjaGVtYSBSdWxlRG9tYWluc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFJ1bGVEb21haW5zIHtcbiAgLyoqXG4gICAqIEBzY2hlbWEgUnVsZURvbWFpbnMjYXN0cm9cbiAgICovXG4gIHJlYWRvbmx5IGFzdHJvPzogUnVsZURvbWFpblZhbHVlO1xuXG4gIC8qKlxuICAgKiBAc2NoZW1hIFJ1bGVEb21haW5zI2RyaXp6bGVcbiAgICovXG4gIHJlYWRvbmx5IGRyaXp6bGU/OiBSdWxlRG9tYWluVmFsdWU7XG5cbiAgLyoqXG4gICAqIEBzY2hlbWEgUnVsZURvbWFpbnMjbmV4dFxuICAgKi9cbiAgcmVhZG9ubHkgbmV4dD86IFJ1bGVEb21haW5WYWx1ZTtcblxuICAvKipcbiAgICogQHNjaGVtYSBSdWxlRG9tYWlucyNwbGF5d3JpZ2h0XG4gICAqL1xuICByZWFkb25seSBwbGF5d3JpZ2h0PzogUnVsZURvbWFpblZhbHVlO1xuXG4gIC8qKlxuICAgKiBAc2NoZW1hIFJ1bGVEb21haW5zI3Byb2plY3RcbiAgICovXG4gIHJlYWRvbmx5IHByb2plY3Q/OiBSdWxlRG9tYWluVmFsdWU7XG5cbiAgLyoqXG4gICAqIEBzY2hlbWEgUnVsZURvbWFpbnMjcXdpa1xuICAgKi9cbiAgcmVhZG9ubHkgcXdpaz86IFJ1bGVEb21haW5WYWx1ZTtcblxuICAvKipcbiAgICogQHNjaGVtYSBSdWxlRG9tYWlucyNyZWFjdFxuICAgKi9cbiAgcmVhZG9ubHkgcmVhY3Q/OiBSdWxlRG9tYWluVmFsdWU7XG5cbiAgLyoqXG4gICAqIEBzY2hlbWEgUnVsZURvbWFpbnMjcmVhY3ROYXRpdmVcbiAgICovXG4gIHJlYWRvbmx5IHJlYWN0TmF0aXZlPzogUnVsZURvbWFpblZhbHVlO1xuXG4gIC8qKlxuICAgKiBAc2NoZW1hIFJ1bGVEb21haW5zI3NvbGlkXG4gICAqL1xuICByZWFkb25seSBzb2xpZD86IFJ1bGVEb21haW5WYWx1ZTtcblxuICAvKipcbiAgICogQHNjaGVtYSBSdWxlRG9tYWlucyNzdmVsdGVcbiAgICovXG4gIHJlYWRvbmx5IHN2ZWx0ZT86IFJ1bGVEb21haW5WYWx1ZTtcblxuICAvKipcbiAgICogQHNjaGVtYSBSdWxlRG9tYWlucyN0YWlsd2luZFxuICAgKi9cbiAgcmVhZG9ubHkgdGFpbHdpbmQ/OiBSdWxlRG9tYWluVmFsdWU7XG5cbiAgLyoqXG4gICAqIEBzY2hlbWEgUnVsZURvbWFpbnMjdGFuc3RhY2tRdWVyeVxuICAgKi9cbiAgcmVhZG9ubHkgdGFuc3RhY2tRdWVyeT86IFJ1bGVEb21haW5WYWx1ZTtcblxuICAvKipcbiAgICogQHNjaGVtYSBSdWxlRG9tYWlucyN0ZXN0XG4gICAqL1xuICByZWFkb25seSB0ZXN0PzogUnVsZURvbWFpblZhbHVlO1xuXG4gIC8qKlxuICAgKiBAc2NoZW1hIFJ1bGVEb21haW5zI3R1cmJvcmVwb1xuICAgKi9cbiAgcmVhZG9ubHkgdHVyYm9yZXBvPzogUnVsZURvbWFpblZhbHVlO1xuXG4gIC8qKlxuICAgKiBAc2NoZW1hIFJ1bGVEb21haW5zI3R5cGVzXG4gICAqL1xuICByZWFkb25seSB0eXBlcz86IFJ1bGVEb21haW5WYWx1ZTtcblxuICAvKipcbiAgICogQHNjaGVtYSBSdWxlRG9tYWlucyN2dWVcbiAgICovXG4gIHJlYWRvbmx5IHZ1ZT86IFJ1bGVEb21haW5WYWx1ZTtcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhbiBvYmplY3Qgb2YgdHlwZSAnUnVsZURvbWFpbnMnIHRvIEpTT04gcmVwcmVzZW50YXRpb24uXG4gKiBAaW50ZXJuYWxcbiAqL1xuLyogZXNsaW50LWRpc2FibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvSnNvbl9SdWxlRG9tYWlucyhvYmo6IFJ1bGVEb21haW5zIHwgdW5kZWZpbmVkKTogUmVjb3JkPHN0cmluZywgYW55PiB8IHVuZGVmaW5lZCB7XG4gIGlmIChvYmogPT09IHVuZGVmaW5lZCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9XG4gIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAnYXN0cm8nOiBvYmouYXN0cm8sXG4gICAgJ2RyaXp6bGUnOiBvYmouZHJpenpsZSxcbiAgICAnbmV4dCc6IG9iai5uZXh0LFxuICAgICdwbGF5d3JpZ2h0Jzogb2JqLnBsYXl3cmlnaHQsXG4gICAgJ3Byb2plY3QnOiBvYmoucHJvamVjdCxcbiAgICAncXdpayc6IG9iai5xd2lrLFxuICAgICdyZWFjdCc6IG9iai5yZWFjdCxcbiAgICAncmVhY3ROYXRpdmUnOiBvYmoucmVhY3ROYXRpdmUsXG4gICAgJ3NvbGlkJzogb2JqLnNvbGlkLFxuICAgICdzdmVsdGUnOiBvYmouc3ZlbHRlLFxuICAgICd0YWlsd2luZCc6IG9iai50YWlsd2luZCxcbiAgICAndGFuc3RhY2tRdWVyeSc6IG9iai50YW5zdGFja1F1ZXJ5LFxuICAgICd0ZXN0Jzogb2JqLnRlc3QsXG4gICAgJ3R1cmJvcmVwbyc6IG9iai50dXJib3JlcG8sXG4gICAgJ3R5cGVzJzogb2JqLnR5cGVzLFxuICAgICd2dWUnOiBvYmoudnVlLFxuICB9O1xuICAvLyBmaWx0ZXIgdW5kZWZpbmVkIHZhbHVlc1xuICByZXR1cm4gT2JqZWN0LmVudHJpZXMocmVzdWx0KS5yZWR1Y2UoKHIsIGkpID0+IChpWzFdID09PSB1bmRlZmluZWQpID8gciA6ICh7IC4uLnIsIFtpWzBdXTogaVsxXSB9KSwge30pO1xufVxuLyogZXNsaW50LWVuYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5cbi8qKlxuICogQHNjaGVtYSBSdWxlc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFJ1bGVzIHtcbiAgLyoqXG4gICAqIEBzY2hlbWEgUnVsZXMjYTExeVxuICAgKi9cbiAgcmVhZG9ubHkgYTExWT86IGFueTtcblxuICAvKipcbiAgICogQHNjaGVtYSBSdWxlcyNjb21wbGV4aXR5XG4gICAqL1xuICByZWFkb25seSBjb21wbGV4aXR5PzogYW55O1xuXG4gIC8qKlxuICAgKiBAc2NoZW1hIFJ1bGVzI2NvcnJlY3RuZXNzXG4gICAqL1xuICByZWFkb25seSBjb3JyZWN0bmVzcz86IGFueTtcblxuICAvKipcbiAgICogQHNjaGVtYSBSdWxlcyNudXJzZXJ5XG4gICAqL1xuICByZWFkb25seSBudXJzZXJ5PzogYW55O1xuXG4gIC8qKlxuICAgKiBAc2NoZW1hIFJ1bGVzI3BlcmZvcm1hbmNlXG4gICAqL1xuICByZWFkb25seSBwZXJmb3JtYW5jZT86IGFueTtcblxuICAvKipcbiAgICogU2VsZWN0cyB0aGUgYmFzZWxpbmUgc2V0IG9mIGxpbnQgcnVsZXMuIGByZWNvbW1lbmRlZGAgZW5hYmxlcyBCaW9tZSdzIHJlY29tbWVuZGVkXG4gICAqIG5vbi1udXJzZXJ5IHJ1bGVzLCBgYWxsYCBlbmFibGVzIGFsbCBub24tbnVyc2VyeSBydWxlcywgYW5kIGBub25lYCBzdGFydHMgd2l0aCBub1xuICAgKiBydWxlcyBlbmFibGVkLiBHcm91cC1sZXZlbCBzZXR0aW5ncyBhbmQgZXhwbGljaXQgcnVsZSBzZXR0aW5ncyBvdmVycmlkZSB0aGlzXG4gICAqIHByZXNldC4gRGVmYXVsdHMgdG8gYHJlY29tbWVuZGVkYC5cbiAgICpcbiAgICogQGRlZmF1bHQgcmVjb21tZW5kZWRgLlxuICAgKiBAc2NoZW1hIFJ1bGVzI3ByZXNldFxuICAgKi9cbiAgcmVhZG9ubHkgcHJlc2V0PzogUHJlc2V0Q29uZmlnO1xuXG4gIC8qKlxuICAgKiBFbmFibGVzIG9yIGRpc2FibGVzIEJpb21lJ3MgcmVjb21tZW5kZWQgbm9uLW51cnNlcnkgcnVsZXMuIERlZmF1bHRzIHRvIGB0cnVlYC5cbiAgICpcbiAgICogKipEZXByZWNhdGVkOioqIFRoaXMgb3B0aW9uIHdpbGwgYmUgcmVtb3ZlZCBpbiB0aGUgbmV4dCBtYWpvciB2ZXJzaW9uLiBVc2VcbiAgICogYGxpbnRlci5ydWxlcy5wcmVzZXRgIGluc3RlYWQsIG9yIHJ1biBgYmlvbWUgbWlncmF0ZWAgdG8gdXBkYXRlIHRoZSBjb25maWd1cmF0aW9uLlxuICAgKlxuICAgKiBAZGVmYXVsdCB0cnVlYC5cbiAgICogQHNjaGVtYSBSdWxlcyNyZWNvbW1lbmRlZFxuICAgKi9cbiAgcmVhZG9ubHkgcmVjb21tZW5kZWQ/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBAc2NoZW1hIFJ1bGVzI3NlY3VyaXR5XG4gICAqL1xuICByZWFkb25seSBzZWN1cml0eT86IGFueTtcblxuICAvKipcbiAgICogQHNjaGVtYSBSdWxlcyNzdHlsZVxuICAgKi9cbiAgcmVhZG9ubHkgc3R5bGU/OiBhbnk7XG5cbiAgLyoqXG4gICAqIEBzY2hlbWEgUnVsZXMjc3VzcGljaW91c1xuICAgKi9cbiAgcmVhZG9ubHkgc3VzcGljaW91cz86IGFueTtcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhbiBvYmplY3Qgb2YgdHlwZSAnUnVsZXMnIHRvIEpTT04gcmVwcmVzZW50YXRpb24uXG4gKiBAaW50ZXJuYWxcbiAqL1xuLyogZXNsaW50LWRpc2FibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvSnNvbl9SdWxlcyhvYmo6IFJ1bGVzIHwgdW5kZWZpbmVkKTogUmVjb3JkPHN0cmluZywgYW55PiB8IHVuZGVmaW5lZCB7XG4gIGlmIChvYmogPT09IHVuZGVmaW5lZCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9XG4gIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAnYTExeSc6IG9iai5hMTFZLFxuICAgICdjb21wbGV4aXR5Jzogb2JqLmNvbXBsZXhpdHksXG4gICAgJ2NvcnJlY3RuZXNzJzogb2JqLmNvcnJlY3RuZXNzLFxuICAgICdudXJzZXJ5Jzogb2JqLm51cnNlcnksXG4gICAgJ3BlcmZvcm1hbmNlJzogb2JqLnBlcmZvcm1hbmNlLFxuICAgICdwcmVzZXQnOiBvYmoucHJlc2V0LFxuICAgICdyZWNvbW1lbmRlZCc6IG9iai5yZWNvbW1lbmRlZCxcbiAgICAnc2VjdXJpdHknOiBvYmouc2VjdXJpdHksXG4gICAgJ3N0eWxlJzogb2JqLnN0eWxlLFxuICAgICdzdXNwaWNpb3VzJzogb2JqLnN1c3BpY2lvdXMsXG4gIH07XG4gIC8vIGZpbHRlciB1bmRlZmluZWQgdmFsdWVzXG4gIHJldHVybiBPYmplY3QuZW50cmllcyhyZXN1bHQpLnJlZHVjZSgociwgaSkgPT4gKGlbMV0gPT09IHVuZGVmaW5lZCkgPyByIDogKHsgLi4uciwgW2lbMF1dOiBpWzFdIH0pLCB7fSk7XG59XG4vKiBlc2xpbnQtZW5hYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cblxuLyoqXG4gKiBPcHRpb25zIHRoYXQgY2hhbmdlIGhvdyB0aGUgTWFya2Rvd24gZm9ybWF0dGVyIGJlaGF2ZXNcbiAqXG4gKiBAc2NoZW1hIE1hcmtkb3duRm9ybWF0dGVyQ29uZmlndXJhdGlvblxuICovXG5leHBvcnQgaW50ZXJmYWNlIE1hcmtkb3duRm9ybWF0dGVyQ29uZmlndXJhdGlvbiB7XG4gIC8qKlxuICAgKiBDb250cm9sIHRoZSBmb3JtYXR0ZXIgZm9yIE1hcmtkb3duIChhbmQgaXRzIHN1cGVyIGxhbmd1YWdlcykgZmlsZXMuXG4gICAqXG4gICAqIEBzY2hlbWEgTWFya2Rvd25Gb3JtYXR0ZXJDb25maWd1cmF0aW9uI2VuYWJsZWRcbiAgICovXG4gIHJlYWRvbmx5IGVuYWJsZWQ/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBGb3JtYXRzIHRoZSBjb2RlIGluc2lkZSBmZW5jZWQgY29kZSBibG9ja3MsIGZyb250bWF0dGVyLCBhbmQgSFRNTCBibG9ja3Mgd2l0aCB0aGUgZm9ybWF0dGVyXG4gICAqIG9mIHRoZSBjb2RlJ3MgbGFuZ3VhZ2UuIERlZmF1bHRzIHRvIGB0cnVlYC5cbiAgICpcbiAgICogQSBibG9jayB3aXRoIGEgc3ludGF4IGVycm9yIHN0YXlzIGFzIHdyaXR0ZW4sIGFuZCBCaW9tZSBzdGlsbCBmb3JtYXRzIHRoZSByZXN0IG9mIHRoZSBmaWxlLlxuICAgKlxuICAgKiBXaGVuIHRoaXMgb3B0aW9uIGlzIGBmYWxzZWAsIEJpb21lIGtlZXBzIGV2ZXJ5IGJsb2NrIGFzIHdyaXR0ZW4uXG4gICAqXG4gICAqIEBkZWZhdWx0IHRydWVgLlxuICAgKiBAc2NoZW1hIE1hcmtkb3duRm9ybWF0dGVyQ29uZmlndXJhdGlvbiNmb3JtYXRFbWJlZHNcbiAgICovXG4gIHJlYWRvbmx5IGZvcm1hdEVtYmVkcz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFRoZSBpbmRlbnQgc3R5bGUgYXBwbGllZCB0byBNYXJrZG93biBmaWxlcy5cbiAgICpcbiAgICogQHNjaGVtYSBNYXJrZG93bkZvcm1hdHRlckNvbmZpZ3VyYXRpb24jaW5kZW50U3R5bGVcbiAgICovXG4gIHJlYWRvbmx5IGluZGVudFN0eWxlPzogSW5kZW50U3R5bGU7XG5cbiAgLyoqXG4gICAqIFRoZSBzaXplIG9mIHRoZSBpbmRlbnRhdGlvbiBhcHBsaWVkIHRvIE1hcmtkb3duIGZpbGVzLiBEZWZhdWx0cyB0byAyLlxuICAgKlxuICAgKiBAZGVmYXVsdCAyLlxuICAgKiBAc2NoZW1hIE1hcmtkb3duRm9ybWF0dGVyQ29uZmlndXJhdGlvbiNpbmRlbnRXaWR0aFxuICAgKi9cbiAgcmVhZG9ubHkgaW5kZW50V2lkdGg/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFRoZSB0eXBlIG9mIGxpbmUgZW5kaW5nIGFwcGxpZWQgdG8gTWFya2Rvd24gKGFuZCBpdHMgc3VwZXIgbGFuZ3VhZ2VzKSBmaWxlcy4gYGF1dG9gIHVzZXMgQ1JMRiBvbiBXaW5kb3dzIGFuZCBMRiBvbiBvdGhlciBwbGF0Zm9ybXMuXG4gICAqXG4gICAqIEBzY2hlbWEgTWFya2Rvd25Gb3JtYXR0ZXJDb25maWd1cmF0aW9uI2xpbmVFbmRpbmdcbiAgICovXG4gIHJlYWRvbmx5IGxpbmVFbmRpbmc/OiBMaW5lRW5kaW5nO1xuXG4gIC8qKlxuICAgKiBXaGF0J3MgdGhlIG1heCB3aWR0aCBvZiBhIGxpbmUgYXBwbGllZCB0byBNYXJrZG93biBmaWxlcy4gRGVmYXVsdHMgdG8gODAuXG4gICAqXG4gICAqIEBkZWZhdWx0IDgwLlxuICAgKiBAc2NoZW1hIE1hcmtkb3duRm9ybWF0dGVyQ29uZmlndXJhdGlvbiNsaW5lV2lkdGhcbiAgICovXG4gIHJlYWRvbmx5IGxpbmVXaWR0aD86IG51bWJlcjtcblxuICAvKipcbiAgICogQ29udHJvbHMgd2hldGhlciBCaW9tZSBrZWVwcywgYWRkcywgb3IgcmVtb3ZlcyBsaW5lIGJyZWFrcyBpbiBNYXJrZG93biBwYXJhZ3JhcGhzLlxuICAgKlxuICAgKiBNYW51YWwgbGluZSBicmVha3MgYXJlIGFsd2F5cyBrZXB0LiBJbiBNYXJrZG93biwgYSBtYW51YWwgbGluZSBicmVhayBpcyBjcmVhdGVkIGJ5IGVuZGluZyBhXG4gICAqIGxpbmUgd2l0aCB0d28gc3BhY2VzIG9yIGEgYmFja3NsYXNoLlxuICAgKlxuICAgKiBAc2NoZW1hIE1hcmtkb3duRm9ybWF0dGVyQ29uZmlndXJhdGlvbiNwcm9zZVdyYXBcbiAgICovXG4gIHJlYWRvbmx5IHByb3NlV3JhcD86IFByb3NlV3JhcDtcblxuICAvKipcbiAgICogV2hldGhlciB0byBhZGQgYSB0cmFpbGluZyBuZXdsaW5lIGF0IHRoZSBlbmQgb2YgdGhlIGZpbGUuXG4gICAqXG4gICAqIFNldHRpbmcgdGhpcyBvcHRpb24gdG8gYGZhbHNlYCBpcyAqKmhpZ2hseSBkaXNjb3VyYWdlZCoqIGJlY2F1c2UgaXQgY291bGQgY2F1c2UgbWFueSBwcm9ibGVtcyB3aXRoIG90aGVyIHRvb2xzOlxuICAgKiAtIGh0dHBzOi8vdGhvdWdodGJvdC5jb20vYmxvZy9uby1uZXdsaW5lLWF0LWVuZC1vZi1maWxlXG4gICAqIC0gaHR0cHM6Ly9jYWxsbWVyeWFuLm1lZGl1bS5jb20vbm8tbmV3bGluZS1hdC1lbmQtb2YtZmlsZS1uYXZpZ2F0aW5nLWdpdHMtd2FybmluZy1mb3ItYW5kcm9pZC1kZXZlbG9wZXJzLWFmMTRlNzNkZDgwNFxuICAgKiAtIGh0dHBzOi8vdW5peC5zdGFja2V4Y2hhbmdlLmNvbS9xdWVzdGlvbnMvMzQ1NTQ4L2hvdy10by1jYXQtZmlsZXMtdG9nZXRoZXItYWRkaW5nLW1pc3NpbmctbmV3bGluZXMtYXQtZW5kLW9mLXNvbWUtZmlsZXNcbiAgICpcbiAgICogRGlzYWJsZSB0aGUgb3B0aW9uIGF0IHlvdXIgb3duIHJpc2suXG4gICAqXG4gICAqIERlZmF1bHRzIHRvIHRydWUuXG4gICAqXG4gICAqIEBkZWZhdWx0IHRydWUuXG4gICAqIEBzY2hlbWEgTWFya2Rvd25Gb3JtYXR0ZXJDb25maWd1cmF0aW9uI3RyYWlsaW5nTmV3bGluZVxuICAgKi9cbiAgcmVhZG9ubHkgdHJhaWxpbmdOZXdsaW5lPzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhbiBvYmplY3Qgb2YgdHlwZSAnTWFya2Rvd25Gb3JtYXR0ZXJDb25maWd1cmF0aW9uJyB0byBKU09OIHJlcHJlc2VudGF0aW9uLlxuICogQGludGVybmFsXG4gKi9cbi8qIGVzbGludC1kaXNhYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0pzb25fTWFya2Rvd25Gb3JtYXR0ZXJDb25maWd1cmF0aW9uKG9iajogTWFya2Rvd25Gb3JtYXR0ZXJDb25maWd1cmF0aW9uIHwgdW5kZWZpbmVkKTogUmVjb3JkPHN0cmluZywgYW55PiB8IHVuZGVmaW5lZCB7XG4gIGlmIChvYmogPT09IHVuZGVmaW5lZCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9XG4gIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAnZW5hYmxlZCc6IG9iai5lbmFibGVkLFxuICAgICdmb3JtYXRFbWJlZHMnOiBvYmouZm9ybWF0RW1iZWRzLFxuICAgICdpbmRlbnRTdHlsZSc6IG9iai5pbmRlbnRTdHlsZSxcbiAgICAnaW5kZW50V2lkdGgnOiBvYmouaW5kZW50V2lkdGgsXG4gICAgJ2xpbmVFbmRpbmcnOiBvYmoubGluZUVuZGluZyxcbiAgICAnbGluZVdpZHRoJzogb2JqLmxpbmVXaWR0aCxcbiAgICAncHJvc2VXcmFwJzogb2JqLnByb3NlV3JhcCxcbiAgICAndHJhaWxpbmdOZXdsaW5lJzogb2JqLnRyYWlsaW5nTmV3bGluZSxcbiAgfTtcbiAgLy8gZmlsdGVyIHVuZGVmaW5lZCB2YWx1ZXNcbiAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKHJlc3VsdCkucmVkdWNlKChyLCBpKSA9PiAoaVsxXSA9PT0gdW5kZWZpbmVkKSA/IHIgOiAoeyAuLi5yLCBbaVswXV06IGlbMV0gfSksIHt9KTtcbn1cbi8qIGVzbGludC1lbmFibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuXG4vKipcbiAqIE9wdGlvbnMgdGhhdCBjaGFuZ2UgaG93IHRoZSBNYXJrZG93biBsaW50ZXIgYmVoYXZlc1xuICpcbiAqIEBzY2hlbWEgTWFya2Rvd25MaW50ZXJDb25maWd1cmF0aW9uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTWFya2Rvd25MaW50ZXJDb25maWd1cmF0aW9uIHtcbiAgLyoqXG4gICAqIENvbnRyb2wgdGhlIGxpbnRlciBmb3IgTWFya2Rvd24gZmlsZXMuXG4gICAqXG4gICAqIEBzY2hlbWEgTWFya2Rvd25MaW50ZXJDb25maWd1cmF0aW9uI2VuYWJsZWRcbiAgICovXG4gIHJlYWRvbmx5IGVuYWJsZWQ/OiBib29sZWFuO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGFuIG9iamVjdCBvZiB0eXBlICdNYXJrZG93bkxpbnRlckNvbmZpZ3VyYXRpb24nIHRvIEpTT04gcmVwcmVzZW50YXRpb24uXG4gKiBAaW50ZXJuYWxcbiAqL1xuLyogZXNsaW50LWRpc2FibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvSnNvbl9NYXJrZG93bkxpbnRlckNvbmZpZ3VyYXRpb24ob2JqOiBNYXJrZG93bkxpbnRlckNvbmZpZ3VyYXRpb24gfCB1bmRlZmluZWQpOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgdW5kZWZpbmVkIHtcbiAgaWYgKG9iaiA9PT0gdW5kZWZpbmVkKSB7IHJldHVybiB1bmRlZmluZWQ7IH1cbiAgY29uc3QgcmVzdWx0ID0ge1xuICAgICdlbmFibGVkJzogb2JqLmVuYWJsZWQsXG4gIH07XG4gIC8vIGZpbHRlciB1bmRlZmluZWQgdmFsdWVzXG4gIHJldHVybiBPYmplY3QuZW50cmllcyhyZXN1bHQpLnJlZHVjZSgociwgaSkgPT4gKGlbMV0gPT09IHVuZGVmaW5lZCkgPyByIDogKHsgLi4uciwgW2lbMF1dOiBpWzFdIH0pLCB7fSk7XG59XG4vKiBlc2xpbnQtZW5hYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cblxuLyoqXG4gKiBPcHRpb25zIHRoYXQgY2hhbmdlIGhvdyB0aGUgTWFya2Rvd24gcGFyc2VyIGJlaGF2ZXNcbiAqXG4gKiBAc2NoZW1hIE1hcmtkb3duUGFyc2VyQ29uZmlndXJhdGlvblxuICovXG5leHBvcnQgaW50ZXJmYWNlIE1hcmtkb3duUGFyc2VyQ29uZmlndXJhdGlvbiB7XG4gIC8qKlxuICAgKiBSZWNvZ25pemVzIGJvbGQsIGl0YWxpYywgYW5kIHN0cmlrZXRocm91Z2ggbWFya2VycyBwbGFjZWQgZGlyZWN0bHkgbmV4dCB0byBDaGluZXNlLCBKYXBhbmVzZSwgb3IgS29yZWFuIHRleHQuIERlZmF1bHRzIHRvIGBmYWxzZWAuXG4gICAqXG4gICAqIFN0YW5kYXJkIE1hcmtkb3duIGRvZXNuJ3QgdHJlYXQgYCoq44OG44K544OI44CCKirjg4bjgrnjg4hgIGFzIGJvbGQgdGV4dCwgYmVjYXVzZSB0aGUgY2xvc2luZyBgKipgXG4gICAqIGlzIGJldHdlZW4gYSBwdW5jdHVhdGlvbiBtYXJrIGFuZCBhIGxldHRlciB3aXRoIG5vIHNwYWNlIGFyb3VuZCBpdC4gTGFuZ3VhZ2VzIHRoYXQgZG9uJ3RcbiAgICogcHV0IHNwYWNlcyBiZXR3ZWVuIHdvcmRzIHJ1biBpbnRvIHRoaXMgb2Z0ZW4uIFdoZW4gZW5hYmxlZCwgQmlvbWUgZm9sbG93cyB0aGVcbiAgICogW0NvbW1vbk1hcmsgQ0pLLWZyaWVuZGx5IGFtZW5kbWVudHNdKGh0dHBzOi8vZ2l0aHViLmNvbS90YXRzLXUvbWFya2Rvd24tY2prLWZyaWVuZGx5L2Jsb2IvbWFpbi9zcGVjaWZpY2F0aW9uLm1kKVxuICAgKiBhbmQgdHJlYXRzIHN1Y2ggdGV4dCBhcyBib2xkIG9yIGl0YWxpYy4gVGhlIG9wdGlvbiBhcHBsaWVzIHRvIGAqYCwgYF9gLCBhbmQgYH5+YCBtYXJrZXJzLlxuICAgKiBBZnRlciBhIHZhcmlhdGlvbiBzZWxlY3RvciAoYW4gaW52aXNpYmxlIGNoYXJhY3RlciB0aGF0IHBpY2tzIGEgZ2x5cGggc3R5bGUgZm9yIHRoZVxuICAgKiBjaGFyYWN0ZXIgYmVmb3JlIGl0KSwgQmlvbWUgY2xhc3NpZmllcyBhIG1hcmtlciBieSB0aGUgY2hhcmFjdGVyIGJlZm9yZSB0aGUgc2VsZWN0b3IuXG4gICAqXG4gICAqIFRoZSBvcHRpb24gY2FuIGFsc28gY2hhbmdlIG1hcmtlcnMgdGhhdCBhcmVuJ3QgbmV4dCB0byBDaGluZXNlLCBKYXBhbmVzZSwgb3IgS29yZWFuIHRleHQsXG4gICAqIGJlY2F1c2UgYSBtYXJrZXIgdGhhdCBjYW4gbm93IG9wZW4gb3IgY2xvc2UgZm9ybWF0dGluZyBjYW4gdGFrZSBhbm90aGVyIG1hcmtlcidzIHBhcnRuZXJcbiAgICogaW4gdGhlIHNhbWUgcGFyYWdyYXBoLCBoZWFkaW5nLCBvciB0YWJsZSBjZWxsLiBGb3IgZXhhbXBsZSwgc3RhbmRhcmQgTWFya2Rvd24gc2hvd3NcbiAgICogYCoq44OG44K544OI44CCKirjg4bjgrnjg4ggYSoqYCB3aXRoIGDjg4bjgrnjg4ggYWAgaW4gYm9sZC4gV2l0aCB0aGUgb3B0aW9uIGVuYWJsZWQsIGDjg4bjgrnjg4jjgIJgIGlzIGJvbGRcbiAgICogYW5kIHRoZSBsYXN0IGAqKmAgaXMgc2hvd24gYXMgd3JpdHRlbi5cbiAgICpcbiAgICogVGhlIGZvcm1hdHRlciBhbmQgdGhlIGxpbnRlciBib3RoIHVzZSB0aGlzIHJlYWRpbmcgb2YgdGhlIGRvY3VtZW50LiBFbmFibGUgdGhlIG9wdGlvbiBvbmx5XG4gICAqIHdoZW4gdGhlIHRvb2wgdGhhdCByZW5kZXJzIHlvdXIgTWFya2Rvd24gYWxzbyBzdXBwb3J0cyB0aGVzZSBhbWVuZG1lbnRzLiBPdGhlcndpc2UsIEJpb21lXG4gICAqIHRyZWF0cyBhcyBib2xkIHNvbWUgdGV4dCB0aGF0IHlvdXIgcmVuZGVyZXIgc2hvd3Mgd2l0aCBsaXRlcmFsIGAqKmAsIGFuZCBmb3JtYXR0aW5nIGNhblxuICAgKiBjaGFuZ2Ugd2hhdCB5b3VyIHJlbmRlcmVyIHNob3dzLiBGb3IgZXhhbXBsZSwgdGhlIG9wdGlvbiBtYWtlcyBgX19gIGFmdGVyIGEgdmFyaWF0aW9uXG4gICAqIHNlbGVjdG9yIGEgYm9sZCBtYXJrZXIsIGFuZCB0aGUgZm9ybWF0dGVyIHJld3JpdGVzIGl0IGFzIGAqKmAsIHdoaWNoIHN0YW5kYXJkIE1hcmtkb3duXG4gICAqIHNob3dzIGFzIGJvbGQgZXZlbiB3aGVyZSBpdCBzaG93ZWQgdGhlIG9yaWdpbmFsIGBfX2AgYXMgd3JpdHRlbi5cbiAgICpcbiAgICogQGRlZmF1bHQgZmFsc2VgLlxuICAgKiBAc2NoZW1hIE1hcmtkb3duUGFyc2VyQ29uZmlndXJhdGlvbiNjamtGcmllbmRseUVtcGhhc2lzXG4gICAqL1xuICByZWFkb25seSBjamtGcmllbmRseUVtcGhhc2lzPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogRW5hYmxlcyBwYXJzaW5nIGZyb250bWF0dGVyIGF0IHRoZSBzdGFydCBvZiB0aGUgZmlsZS4gRGVmYXVsdHMgdG8gYGZhbHNlYC5cbiAgICpcbiAgICogQGRlZmF1bHQgZmFsc2VgLlxuICAgKiBAc2NoZW1hIE1hcmtkb3duUGFyc2VyQ29uZmlndXJhdGlvbiNmcm9udG1hdHRlclxuICAgKi9cbiAgcmVhZG9ubHkgZnJvbnRtYXR0ZXI/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBFbmFibGVzIEdpdEh1YiBGbGF2b3JlZCBNYXJrZG93biBleHRlbnNpb25zLiBEZWZhdWx0cyB0byBgdHJ1ZWAuXG4gICAqXG4gICAqIEBkZWZhdWx0IHRydWVgLlxuICAgKiBAc2NoZW1hIE1hcmtkb3duUGFyc2VyQ29uZmlndXJhdGlvbiNnZm1cbiAgICovXG4gIHJlYWRvbmx5IGdmbT86IGJvb2xlYW47XG59XG5cbi8qKlxuICogQ29udmVydHMgYW4gb2JqZWN0IG9mIHR5cGUgJ01hcmtkb3duUGFyc2VyQ29uZmlndXJhdGlvbicgdG8gSlNPTiByZXByZXNlbnRhdGlvbi5cbiAqIEBpbnRlcm5hbFxuICovXG4vKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5leHBvcnQgZnVuY3Rpb24gdG9Kc29uX01hcmtkb3duUGFyc2VyQ29uZmlndXJhdGlvbihvYmo6IE1hcmtkb3duUGFyc2VyQ29uZmlndXJhdGlvbiB8IHVuZGVmaW5lZCk6IFJlY29yZDxzdHJpbmcsIGFueT4gfCB1bmRlZmluZWQge1xuICBpZiAob2JqID09PSB1bmRlZmluZWQpIHsgcmV0dXJuIHVuZGVmaW5lZDsgfVxuICBjb25zdCByZXN1bHQgPSB7XG4gICAgJ2Nqa0ZyaWVuZGx5RW1waGFzaXMnOiBvYmouY2prRnJpZW5kbHlFbXBoYXNpcyxcbiAgICAnZnJvbnRtYXR0ZXInOiBvYmouZnJvbnRtYXR0ZXIsXG4gICAgJ2dmbSc6IG9iai5nZm0sXG4gIH07XG4gIC8vIGZpbHRlciB1bmRlZmluZWQgdmFsdWVzXG4gIHJldHVybiBPYmplY3QuZW50cmllcyhyZXN1bHQpLnJlZHVjZSgociwgaSkgPT4gKGlbMV0gPT09IHVuZGVmaW5lZCkgPyByIDogKHsgLi4uciwgW2lbMF1dOiBpWzFdIH0pLCB7fSk7XG59XG4vKiBlc2xpbnQtZW5hYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cblxuLyoqXG4gKiBAc2NoZW1hIE92ZXJyaWRlQXNzaXN0Q29uZmlndXJhdGlvblxuICovXG5leHBvcnQgaW50ZXJmYWNlIE92ZXJyaWRlQXNzaXN0Q29uZmlndXJhdGlvbiB7XG4gIC8qKlxuICAgKiBUaGUgYXNzaXN0LWFjdGlvbiBjb25maWd1cmF0aW9uIGZvciBtYXRjaGVkIGZpbGVzLlxuICAgKlxuICAgKiBAc2NoZW1hIE92ZXJyaWRlQXNzaXN0Q29uZmlndXJhdGlvbiNhY3Rpb25zXG4gICAqL1xuICByZWFkb25seSBhY3Rpb25zPzogQWN0aW9ucztcblxuICAvKipcbiAgICogRW5hYmxlcyBvciBkaXNhYmxlcyBhc3Npc3QgYWN0aW9ucyBmb3IgbWF0Y2hlZCBmaWxlcy5cbiAgICpcbiAgICogQHNjaGVtYSBPdmVycmlkZUFzc2lzdENvbmZpZ3VyYXRpb24jZW5hYmxlZFxuICAgKi9cbiAgcmVhZG9ubHkgZW5hYmxlZD86IGJvb2xlYW47XG59XG5cbi8qKlxuICogQ29udmVydHMgYW4gb2JqZWN0IG9mIHR5cGUgJ092ZXJyaWRlQXNzaXN0Q29uZmlndXJhdGlvbicgdG8gSlNPTiByZXByZXNlbnRhdGlvbi5cbiAqIEBpbnRlcm5hbFxuICovXG4vKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5leHBvcnQgZnVuY3Rpb24gdG9Kc29uX092ZXJyaWRlQXNzaXN0Q29uZmlndXJhdGlvbihvYmo6IE92ZXJyaWRlQXNzaXN0Q29uZmlndXJhdGlvbiB8IHVuZGVmaW5lZCk6IFJlY29yZDxzdHJpbmcsIGFueT4gfCB1bmRlZmluZWQge1xuICBpZiAob2JqID09PSB1bmRlZmluZWQpIHsgcmV0dXJuIHVuZGVmaW5lZDsgfVxuICBjb25zdCByZXN1bHQgPSB7XG4gICAgJ2FjdGlvbnMnOiB0b0pzb25fQWN0aW9ucyhvYmouYWN0aW9ucyksXG4gICAgJ2VuYWJsZWQnOiBvYmouZW5hYmxlZCxcbiAgfTtcbiAgLy8gZmlsdGVyIHVuZGVmaW5lZCB2YWx1ZXNcbiAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKHJlc3VsdCkucmVkdWNlKChyLCBpKSA9PiAoaVsxXSA9PT0gdW5kZWZpbmVkKSA/IHIgOiAoeyAuLi5yLCBbaVswXV06IGlbMV0gfSksIHt9KTtcbn1cbi8qIGVzbGludC1lbmFibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuXG4vKipcbiAqIEBzY2hlbWEgT3ZlcnJpZGVGaWxlc0NvbmZpZ3VyYXRpb25cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBPdmVycmlkZUZpbGVzQ29uZmlndXJhdGlvbiB7XG4gIC8qKlxuICAgKiBUaGUgbWF4aW11bSBzb3VyY2UtZmlsZSBzaXplIGluIGJ5dGVzIGZvciBtYXRjaGVkIGZpbGVzLlxuICAgKlxuICAgKiBAc2NoZW1hIE92ZXJyaWRlRmlsZXNDb25maWd1cmF0aW9uI21heFNpemVcbiAgICovXG4gIHJlYWRvbmx5IG1heFNpemU/OiBudW1iZXI7XG59XG5cbi8qKlxuICogQ29udmVydHMgYW4gb2JqZWN0IG9mIHR5cGUgJ092ZXJyaWRlRmlsZXNDb25maWd1cmF0aW9uJyB0byBKU09OIHJlcHJlc2VudGF0aW9uLlxuICogQGludGVybmFsXG4gKi9cbi8qIGVzbGludC1kaXNhYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0pzb25fT3ZlcnJpZGVGaWxlc0NvbmZpZ3VyYXRpb24ob2JqOiBPdmVycmlkZUZpbGVzQ29uZmlndXJhdGlvbiB8IHVuZGVmaW5lZCk6IFJlY29yZDxzdHJpbmcsIGFueT4gfCB1bmRlZmluZWQge1xuICBpZiAob2JqID09PSB1bmRlZmluZWQpIHsgcmV0dXJuIHVuZGVmaW5lZDsgfVxuICBjb25zdCByZXN1bHQgPSB7XG4gICAgJ21heFNpemUnOiBvYmoubWF4U2l6ZSxcbiAgfTtcbiAgLy8gZmlsdGVyIHVuZGVmaW5lZCB2YWx1ZXNcbiAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKHJlc3VsdCkucmVkdWNlKChyLCBpKSA9PiAoaVsxXSA9PT0gdW5kZWZpbmVkKSA/IHIgOiAoeyAuLi5yLCBbaVswXV06IGlbMV0gfSksIHt9KTtcbn1cbi8qIGVzbGludC1lbmFibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuXG4vKipcbiAqIEBzY2hlbWEgT3ZlcnJpZGVGb3JtYXR0ZXJDb25maWd1cmF0aW9uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgT3ZlcnJpZGVGb3JtYXR0ZXJDb25maWd1cmF0aW9uIHtcbiAgLyoqXG4gICAqIFRoZSBhdHRyaWJ1dGUgcG9zaXRpb24gc3R5bGUgaW4gSFRNTC1saWtlIGxhbmd1YWdlcy5cbiAgICpcbiAgICogQHNjaGVtYSBPdmVycmlkZUZvcm1hdHRlckNvbmZpZ3VyYXRpb24jYXR0cmlidXRlUG9zaXRpb25cbiAgICovXG4gIHJlYWRvbmx5IGF0dHJpYnV0ZVBvc2l0aW9uPzogQXR0cmlidXRlUG9zaXRpb247XG5cbiAgLyoqXG4gICAqIENvbnRyb2xzIHRoZSBwbGFjZW1lbnQgb2YgdGhlIGNsb3NpbmcgYnJhY2tldCBmb3IgbXVsdGlsaW5lIEhUTUwgYW5kIEpTWCBvcGVuaW5nIHRhZ3MuIEJpb21lXG4gICAqIHBsYWNlcyB0aGUgYnJhY2tldCBhdCB0aGUgZW5kIG9mIHRoZSBsYXN0IGF0dHJpYnV0ZSBsaW5lIHdoZW4gZW5hYmxlZCBhbmQgb24gaXRzIG93biBsaW5lIHdoZW5cbiAgICogZGlzYWJsZWQuIFRoaXMgYWxzbyBhZmZlY3RzIHNlbGYtY2xvc2luZyBIVE1MIGVsZW1lbnRzLCBidXQgc2VsZi1jbG9zaW5nIEpTWCBlbGVtZW50cyBhcmVcbiAgICogdW5hZmZlY3RlZC5cbiAgICpcbiAgICogQHNjaGVtYSBPdmVycmlkZUZvcm1hdHRlckNvbmZpZ3VyYXRpb24jYnJhY2tldFNhbWVMaW5lXG4gICAqL1xuICByZWFkb25seSBicmFja2V0U2FtZUxpbmU/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBDb250cm9scyBzcGFjZXMgaW5zaWRlIGJyYWNlcyBpbiBzdXBwb3J0ZWQgc2luZ2xlLWxpbmUgc3RydWN0dXJlcy4gVGhlIGFmZmVjdGVkIHN0cnVjdHVyZXNcbiAgICogdmFyeSBieSBsYW5ndWFnZS5cbiAgICpcbiAgICogQHNjaGVtYSBPdmVycmlkZUZvcm1hdHRlckNvbmZpZ3VyYXRpb24jYnJhY2tldFNwYWNpbmdcbiAgICovXG4gIHJlYWRvbmx5IGJyYWNrZXRTcGFjaW5nPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogQ29udHJvbHMgc3BhY2VzIGltbWVkaWF0ZWx5IGluc2lkZSBzdXBwb3J0ZWQgZGVsaW1pdGVycyB3aGVuIHRoZWlyIGNvbnRlbnQgZml0cyBvbiBvbmUgbGluZS5cbiAgICogSXQgZG9lc24ndCBhZGQgc3BhY2VzIGJlZm9yZSBvcGVuaW5nIGRlbGltaXRlcnMgb3IgaW5zaWRlIGVtcHR5IGRlbGltaXRlcnMuXG4gICAqXG4gICAqIFRoZSBhZmZlY3RlZCBkZWxpbWl0ZXJzIHZhcnkgYnkgbGFuZ3VhZ2UuIElmIHVuc2V0LCB1c2VzIHRoZSBjb25maWd1cmVkIGZvcm1hdHRlciBzZXR0aW5nLlxuICAgKlxuICAgKiBAc2NoZW1hIE92ZXJyaWRlRm9ybWF0dGVyQ29uZmlndXJhdGlvbiNkZWxpbWl0ZXJTcGFjaW5nXG4gICAqL1xuICByZWFkb25seSBkZWxpbWl0ZXJTcGFjaW5nPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogRW5hYmxlcyBvciBkaXNhYmxlcyB0aGUgZm9ybWF0dGVyIGZvciBtYXRjaGVkIGZpbGVzLlxuICAgKlxuICAgKiBAc2NoZW1hIE92ZXJyaWRlRm9ybWF0dGVyQ29uZmlndXJhdGlvbiNlbmFibGVkXG4gICAqL1xuICByZWFkb25seSBlbmFibGVkPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogQ29udHJvbHMgd2hldGhlciBhcnJheXMgYW5kIG9iamVjdHMgYXJlIGZvcm1hdHRlZCBvbiBvbmUgbGluZSBvciBtdWx0aXBsZSBsaW5lcy5cbiAgICpcbiAgICogYGF1dG9gIGZvcm1hdHMgb2JqZWN0cyBvbiBtdWx0aXBsZSBsaW5lcyBpZiB0aGUgZmlyc3QgcHJvcGVydHkgaGFzIGEgbmV3bGluZSwgYW5kIGFycmF5cyBvblxuICAgKiBvbmUgbGluZSBpZiB0aGV5IGZpdC5cbiAgICpcbiAgICogYGFsd2F5c2AgZm9ybWF0cyBhcnJheXMgYW5kIG9iamVjdHMgb24gbXVsdGlwbGUgbGluZXMuXG4gICAqXG4gICAqIGBuZXZlcmAgZm9ybWF0cyBhcnJheXMgYW5kIG9iamVjdHMgb24gb25lIGxpbmUgaWYgdGhleSBmaXQuXG4gICAqXG4gICAqIElmIHVuc2V0LCB1c2VzIHRoZSBjb25maWd1cmVkIGZvcm1hdHRlciBzZXR0aW5nLlxuICAgKlxuICAgKiBXaGVuIGZvcm1hdHRpbmcgYHBhY2thZ2UuanNvbmAsIEJpb21lIHVzZXMgYGFsd2F5c2AgdW5sZXNzIGNvbmZpZ3VyZWQgb3RoZXJ3aXNlLlxuICAgKlxuICAgKiBAc2NoZW1hIE92ZXJyaWRlRm9ybWF0dGVyQ29uZmlndXJhdGlvbiNleHBhbmRcbiAgICovXG4gIHJlYWRvbmx5IGV4cGFuZD86IEV4cGFuZDtcblxuICAvKipcbiAgICogQWxsb3dzIGZvcm1hdHRpbmcgbWF0Y2hlZCBmaWxlcyB0aGF0IGNvbnRhaW4gc3ludGF4IGVycm9ycy5cbiAgICpcbiAgICogQHNjaGVtYSBPdmVycmlkZUZvcm1hdHRlckNvbmZpZ3VyYXRpb24jZm9ybWF0V2l0aEVycm9yc1xuICAgKi9cbiAgcmVhZG9ubHkgZm9ybWF0V2l0aEVycm9ycz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFRoZSBpbmRlbnRhdGlvbiB3aWR0aC4gRGVwcmVjYXRlZCwgdXNlIGBpbmRlbnRXaWR0aGAgaW5zdGVhZC5cbiAgICpcbiAgICogQHNjaGVtYSBPdmVycmlkZUZvcm1hdHRlckNvbmZpZ3VyYXRpb24jaW5kZW50U2l6ZVxuICAgKi9cbiAgcmVhZG9ubHkgaW5kZW50U2l6ZT86IG51bWJlcjtcblxuICAvKipcbiAgICogVXNlcyB0YWJzIG9yIHNwYWNlcyBmb3IgaW5kZW50YXRpb24uXG4gICAqXG4gICAqIEBzY2hlbWEgT3ZlcnJpZGVGb3JtYXR0ZXJDb25maWd1cmF0aW9uI2luZGVudFN0eWxlXG4gICAqL1xuICByZWFkb25seSBpbmRlbnRTdHlsZT86IEluZGVudFN0eWxlO1xuXG4gIC8qKlxuICAgKiBTZXRzIHRoZSBpbmRlbnRhdGlvbiB3aWR0aC4gV2l0aCBzcGFjZSBpbmRlbnRhdGlvbiwgdGhpcyBpcyB0aGUgbnVtYmVyIG9mIHNwYWNlcyBlbWl0dGVkIHBlclxuICAgKiBpbmRlbnRhdGlvbiBsZXZlbC4gV2l0aCB0YWIgaW5kZW50YXRpb24sIEJpb21lIGVtaXRzIG9uZSB0YWIgcGVyIGxldmVsIGFuZCB1c2VzIHRoaXMgdmFsdWUgYXNcbiAgICogdGhlIHRhYidzIGRpc3BsYXkgd2lkdGggd2hlbiBjYWxjdWxhdGluZyBsaW5lIGxlbmd0aC4gQWNjZXB0ZWQgdmFsdWVzIGFyZSBgMGAgdGhyb3VnaCBgMjRgLlxuICAgKlxuICAgKiBAc2NoZW1hIE92ZXJyaWRlRm9ybWF0dGVyQ29uZmlndXJhdGlvbiNpbmRlbnRXaWR0aFxuICAgKi9cbiAgcmVhZG9ubHkgaW5kZW50V2lkdGg/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFRoZSBsaW5lIGVuZGluZy5cbiAgICpcbiAgICogQHNjaGVtYSBPdmVycmlkZUZvcm1hdHRlckNvbmZpZ3VyYXRpb24jbGluZUVuZGluZ1xuICAgKi9cbiAgcmVhZG9ubHkgbGluZUVuZGluZz86IExpbmVFbmRpbmc7XG5cbiAgLyoqXG4gICAqIFNldHMgdGhlIHByZWZlcnJlZCBtYXhpbXVtIGxpbmUgd2lkdGggdXNlZCB3aGVuIGRlY2lkaW5nIHdoZXJlIHRvIHdyYXAgY29kZS4gU29tZSBjb250ZW50LFxuICAgKiBzdWNoIGFzIGxvbmcgdW5icmVha2FibGUgc3RyaW5ncywgbWF5IHN0aWxsIGV4Y2VlZCB0aGlzIHdpZHRoLiBBY2NlcHRlZCB2YWx1ZXMgYXJlIGAxYCB0aHJvdWdoXG4gICAqIGAzMjBgLlxuICAgKlxuICAgKiBAc2NoZW1hIE92ZXJyaWRlRm9ybWF0dGVyQ29uZmlndXJhdGlvbiNsaW5lV2lkdGhcbiAgICovXG4gIHJlYWRvbmx5IGxpbmVXaWR0aD86IG51bWJlcjtcblxuICAvKipcbiAgICogUHJpbnRzIHRyYWlsaW5nIGNvbW1hcyB3aGVyZXZlciBwb3NzaWJsZSBpbiBtdWx0aWxpbmUgY29tbWEtc2VwYXJhdGVkIHN0cnVjdHVyZXMuIFRoaXMgaXMgYVxuICAgKiBsZWdhY3kgb3ZlcnJpZGUgb3B0aW9uLiBQcmVmZXIgYGphdmFzY3JpcHQuZm9ybWF0dGVyLnRyYWlsaW5nQ29tbWFzYC5cbiAgICpcbiAgICogQHNjaGVtYSBPdmVycmlkZUZvcm1hdHRlckNvbmZpZ3VyYXRpb24jdHJhaWxpbmdDb21tYXNcbiAgICovXG4gIHJlYWRvbmx5IHRyYWlsaW5nQ29tbWFzPzogSnNUcmFpbGluZ0NvbW1hcztcblxuICAvKipcbiAgICogV2hldGhlciB0byBhZGQgYSB0cmFpbGluZyBuZXdsaW5lIGF0IHRoZSBlbmQgb2YgbWF0Y2hlZCBmaWxlcy4gRGlzYWJsaW5nIHRoaXMgb3B0aW9uIGNhblxuICAgKiBjYXVzZSBjb21wYXRpYmlsaXR5IHByb2JsZW1zIHdpdGggb3RoZXIgdG9vbHMuXG4gICAqXG4gICAqIEBzY2hlbWEgT3ZlcnJpZGVGb3JtYXR0ZXJDb25maWd1cmF0aW9uI3RyYWlsaW5nTmV3bGluZVxuICAgKi9cbiAgcmVhZG9ubHkgdHJhaWxpbmdOZXdsaW5lPzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhbiBvYmplY3Qgb2YgdHlwZSAnT3ZlcnJpZGVGb3JtYXR0ZXJDb25maWd1cmF0aW9uJyB0byBKU09OIHJlcHJlc2VudGF0aW9uLlxuICogQGludGVybmFsXG4gKi9cbi8qIGVzbGludC1kaXNhYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0pzb25fT3ZlcnJpZGVGb3JtYXR0ZXJDb25maWd1cmF0aW9uKG9iajogT3ZlcnJpZGVGb3JtYXR0ZXJDb25maWd1cmF0aW9uIHwgdW5kZWZpbmVkKTogUmVjb3JkPHN0cmluZywgYW55PiB8IHVuZGVmaW5lZCB7XG4gIGlmIChvYmogPT09IHVuZGVmaW5lZCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9XG4gIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAnYXR0cmlidXRlUG9zaXRpb24nOiBvYmouYXR0cmlidXRlUG9zaXRpb24sXG4gICAgJ2JyYWNrZXRTYW1lTGluZSc6IG9iai5icmFja2V0U2FtZUxpbmUsXG4gICAgJ2JyYWNrZXRTcGFjaW5nJzogb2JqLmJyYWNrZXRTcGFjaW5nLFxuICAgICdkZWxpbWl0ZXJTcGFjaW5nJzogb2JqLmRlbGltaXRlclNwYWNpbmcsXG4gICAgJ2VuYWJsZWQnOiBvYmouZW5hYmxlZCxcbiAgICAnZXhwYW5kJzogb2JqLmV4cGFuZCxcbiAgICAnZm9ybWF0V2l0aEVycm9ycyc6IG9iai5mb3JtYXRXaXRoRXJyb3JzLFxuICAgICdpbmRlbnRTaXplJzogb2JqLmluZGVudFNpemUsXG4gICAgJ2luZGVudFN0eWxlJzogb2JqLmluZGVudFN0eWxlLFxuICAgICdpbmRlbnRXaWR0aCc6IG9iai5pbmRlbnRXaWR0aCxcbiAgICAnbGluZUVuZGluZyc6IG9iai5saW5lRW5kaW5nLFxuICAgICdsaW5lV2lkdGgnOiBvYmoubGluZVdpZHRoLFxuICAgICd0cmFpbGluZ0NvbW1hcyc6IG9iai50cmFpbGluZ0NvbW1hcyxcbiAgICAndHJhaWxpbmdOZXdsaW5lJzogb2JqLnRyYWlsaW5nTmV3bGluZSxcbiAgfTtcbiAgLy8gZmlsdGVyIHVuZGVmaW5lZCB2YWx1ZXNcbiAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKHJlc3VsdCkucmVkdWNlKChyLCBpKSA9PiAoaVsxXSA9PT0gdW5kZWZpbmVkKSA/IHIgOiAoeyAuLi5yLCBbaVswXV06IGlbMV0gfSksIHt9KTtcbn1cbi8qIGVzbGludC1lbmFibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuXG4vKipcbiAqIEBzY2hlbWEgT3ZlcnJpZGVMaW50ZXJDb25maWd1cmF0aW9uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgT3ZlcnJpZGVMaW50ZXJDb25maWd1cmF0aW9uIHtcbiAgLyoqXG4gICAqIFRoZSBsaW50LWRvbWFpbiBjb25maWd1cmF0aW9uIGZvciBtYXRjaGVkIGZpbGVzLlxuICAgKlxuICAgKiBAc2NoZW1hIE92ZXJyaWRlTGludGVyQ29uZmlndXJhdGlvbiNkb21haW5zXG4gICAqL1xuICByZWFkb25seSBkb21haW5zPzogUnVsZURvbWFpbnM7XG5cbiAgLyoqXG4gICAqIEVuYWJsZXMgb3IgZGlzYWJsZXMgdGhlIGxpbnRlciBmb3IgbWF0Y2hlZCBmaWxlcy5cbiAgICpcbiAgICogQHNjaGVtYSBPdmVycmlkZUxpbnRlckNvbmZpZ3VyYXRpb24jZW5hYmxlZFxuICAgKi9cbiAgcmVhZG9ubHkgZW5hYmxlZD86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFRoZSBsaW50LXJ1bGUgY29uZmlndXJhdGlvbiBmb3IgbWF0Y2hlZCBmaWxlcy5cbiAgICpcbiAgICogQHNjaGVtYSBPdmVycmlkZUxpbnRlckNvbmZpZ3VyYXRpb24jcnVsZXNcbiAgICovXG4gIHJlYWRvbmx5IHJ1bGVzPzogUnVsZXM7XG59XG5cbi8qKlxuICogQ29udmVydHMgYW4gb2JqZWN0IG9mIHR5cGUgJ092ZXJyaWRlTGludGVyQ29uZmlndXJhdGlvbicgdG8gSlNPTiByZXByZXNlbnRhdGlvbi5cbiAqIEBpbnRlcm5hbFxuICovXG4vKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5leHBvcnQgZnVuY3Rpb24gdG9Kc29uX092ZXJyaWRlTGludGVyQ29uZmlndXJhdGlvbihvYmo6IE92ZXJyaWRlTGludGVyQ29uZmlndXJhdGlvbiB8IHVuZGVmaW5lZCk6IFJlY29yZDxzdHJpbmcsIGFueT4gfCB1bmRlZmluZWQge1xuICBpZiAob2JqID09PSB1bmRlZmluZWQpIHsgcmV0dXJuIHVuZGVmaW5lZDsgfVxuICBjb25zdCByZXN1bHQgPSB7XG4gICAgJ2RvbWFpbnMnOiB0b0pzb25fUnVsZURvbWFpbnMob2JqLmRvbWFpbnMpLFxuICAgICdlbmFibGVkJzogb2JqLmVuYWJsZWQsXG4gICAgJ3J1bGVzJzogdG9Kc29uX1J1bGVzKG9iai5ydWxlcyksXG4gIH07XG4gIC8vIGZpbHRlciB1bmRlZmluZWQgdmFsdWVzXG4gIHJldHVybiBPYmplY3QuZW50cmllcyhyZXN1bHQpLnJlZHVjZSgociwgaSkgPT4gKGlbMV0gPT09IHVuZGVmaW5lZCkgPyByIDogKHsgLi4uciwgW2lbMF1dOiBpWzFdIH0pLCB7fSk7XG59XG4vKiBlc2xpbnQtZW5hYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cblxuLyoqXG4gKiBJbnRlZ3JhdGlvbiB3aXRoIEdpdCBhcyB0aGUgdmVyc2lvbiBjb250cm9sIGNsaWVudC5cbiAqXG4gKiBAc2NoZW1hIFZjc0NsaWVudEtpbmRcbiAqL1xuZXhwb3J0IGVudW0gVmNzQ2xpZW50S2luZCB7XG4gIC8qKiBnaXQgKi9cbiAgR0lUID0gXCJnaXRcIixcbn1cblxuLyoqXG4gKiBPcHRpb25zIHRoYXQgY2hhbmdlIGhvdyB0aGUgWWFtbCBmb3JtYXR0ZXIgYmVoYXZlc1xuICpcbiAqIEBzY2hlbWEgWWFtbEZvcm1hdHRlckNvbmZpZ3VyYXRpb25cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBZYW1sRm9ybWF0dGVyQ29uZmlndXJhdGlvbiB7XG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIGluc2VydCBzcGFjZXMgaW5zaWRlIG5vbi1lbXB0eSBmbG93IG1hcHBpbmdzIChgeyBrZXk6IHZhbHVlIH1gKVxuICAgKiBhbmQgc2VxdWVuY2VzIChgWyBpdGVtIF1gKSB0aGF0IGZpdCBvbiBvbmUgbGluZS4gSWYgdW5zZXQsIGluaGVyaXRzIHRoZVxuICAgKiBnbG9iYWwgYnJhY2tldCBzcGFjaW5nIHNldHRpbmcuIFdoZW4gbmVpdGhlciBpcyBzZXQsIG1hcHBpbmdzIGhhdmUgc3BhY2VzXG4gICAqIGFuZCBzZXF1ZW5jZXMgZG8gbm90LlxuICAgKlxuICAgKiBAc2NoZW1hIFlhbWxGb3JtYXR0ZXJDb25maWd1cmF0aW9uI2JyYWNrZXRTcGFjaW5nXG4gICAqL1xuICByZWFkb25seSBicmFja2V0U3BhY2luZz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIENvbnRyb2wgdGhlIGZvcm1hdHRlciBmb3IgWWFtbCAoYW5kIGl0cyBzdXBlciBsYW5ndWFnZXMpIGZpbGVzLlxuICAgKlxuICAgKiBAc2NoZW1hIFlhbWxGb3JtYXR0ZXJDb25maWd1cmF0aW9uI2VuYWJsZWRcbiAgICovXG4gIHJlYWRvbmx5IGVuYWJsZWQ/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBUaGUgc2l6ZSBvZiB0aGUgaW5kZW50YXRpb24gYXBwbGllZCB0byBZYW1sIGZpbGVzLiBEZWZhdWx0cyB0byAyLlxuICAgKlxuICAgKiBAZGVmYXVsdCAyLlxuICAgKiBAc2NoZW1hIFlhbWxGb3JtYXR0ZXJDb25maWd1cmF0aW9uI2luZGVudFdpZHRoXG4gICAqL1xuICByZWFkb25seSBpbmRlbnRXaWR0aD86IG51bWJlcjtcblxuICAvKipcbiAgICogVGhlIHR5cGUgb2YgbGluZSBlbmRpbmcgYXBwbGllZCB0byBZYW1sIChhbmQgaXRzIHN1cGVyIGxhbmd1YWdlcykgZmlsZXMuIGBhdXRvYCB1c2VzIENSTEYgb24gV2luZG93cyBhbmQgTEYgb24gb3RoZXIgcGxhdGZvcm1zLlxuICAgKlxuICAgKiBAc2NoZW1hIFlhbWxGb3JtYXR0ZXJDb25maWd1cmF0aW9uI2xpbmVFbmRpbmdcbiAgICovXG4gIHJlYWRvbmx5IGxpbmVFbmRpbmc/OiBMaW5lRW5kaW5nO1xuXG4gIC8qKlxuICAgKiBXaGF0J3MgdGhlIG1heCB3aWR0aCBvZiBhIGxpbmUgYXBwbGllZCB0byBZYW1sIGZpbGVzLiBEZWZhdWx0cyB0byA4MC5cbiAgICpcbiAgICogQGRlZmF1bHQgODAuXG4gICAqIEBzY2hlbWEgWWFtbEZvcm1hdHRlckNvbmZpZ3VyYXRpb24jbGluZVdpZHRoXG4gICAqL1xuICByZWFkb25seSBsaW5lV2lkdGg/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFRoZSB0eXBlIG9mIHF1b3RlcyB1c2VkIGluIFlBTUwgY29kZS4gRGVmYXVsdHMgdG8gYGRvdWJsZWAuXG4gICAqXG4gICAqIEBkZWZhdWx0IGRvdWJsZWAuXG4gICAqIEBzY2hlbWEgWWFtbEZvcm1hdHRlckNvbmZpZ3VyYXRpb24jcXVvdGVTdHlsZVxuICAgKi9cbiAgcmVhZG9ubHkgcXVvdGVTdHlsZT86IFF1b3RlU3R5bGU7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gYWRkIGEgdHJhaWxpbmcgbmV3bGluZSBhdCB0aGUgZW5kIG9mIHRoZSBmaWxlLlxuICAgKlxuICAgKiBTZXR0aW5nIHRoaXMgb3B0aW9uIHRvIGBmYWxzZWAgaXMgKipoaWdobHkgZGlzY291cmFnZWQqKiBiZWNhdXNlIGl0IGNvdWxkIGNhdXNlIG1hbnkgcHJvYmxlbXMgd2l0aCBvdGhlciB0b29sczpcbiAgICogLSBodHRwczovL3Rob3VnaHRib3QuY29tL2Jsb2cvbm8tbmV3bGluZS1hdC1lbmQtb2YtZmlsZVxuICAgKiAtIGh0dHBzOi8vY2FsbG1lcnlhbi5tZWRpdW0uY29tL25vLW5ld2xpbmUtYXQtZW5kLW9mLWZpbGUtbmF2aWdhdGluZy1naXRzLXdhcm5pbmctZm9yLWFuZHJvaWQtZGV2ZWxvcGVycy1hZjE0ZTczZGQ4MDRcbiAgICogLSBodHRwczovL3VuaXguc3RhY2tleGNoYW5nZS5jb20vcXVlc3Rpb25zLzM0NTU0OC9ob3ctdG8tY2F0LWZpbGVzLXRvZ2V0aGVyLWFkZGluZy1taXNzaW5nLW5ld2xpbmVzLWF0LWVuZC1vZi1zb21lLWZpbGVzXG4gICAqXG4gICAqIERpc2FibGUgdGhlIG9wdGlvbiBhdCB5b3VyIG93biByaXNrLlxuICAgKlxuICAgKiBEZWZhdWx0cyB0byB0cnVlLlxuICAgKlxuICAgKiBAZGVmYXVsdCB0cnVlLlxuICAgKiBAc2NoZW1hIFlhbWxGb3JtYXR0ZXJDb25maWd1cmF0aW9uI3RyYWlsaW5nTmV3bGluZVxuICAgKi9cbiAgcmVhZG9ubHkgdHJhaWxpbmdOZXdsaW5lPzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhbiBvYmplY3Qgb2YgdHlwZSAnWWFtbEZvcm1hdHRlckNvbmZpZ3VyYXRpb24nIHRvIEpTT04gcmVwcmVzZW50YXRpb24uXG4gKiBAaW50ZXJuYWxcbiAqL1xuLyogZXNsaW50LWRpc2FibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvSnNvbl9ZYW1sRm9ybWF0dGVyQ29uZmlndXJhdGlvbihvYmo6IFlhbWxGb3JtYXR0ZXJDb25maWd1cmF0aW9uIHwgdW5kZWZpbmVkKTogUmVjb3JkPHN0cmluZywgYW55PiB8IHVuZGVmaW5lZCB7XG4gIGlmIChvYmogPT09IHVuZGVmaW5lZCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9XG4gIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAnYnJhY2tldFNwYWNpbmcnOiBvYmouYnJhY2tldFNwYWNpbmcsXG4gICAgJ2VuYWJsZWQnOiBvYmouZW5hYmxlZCxcbiAgICAnaW5kZW50V2lkdGgnOiBvYmouaW5kZW50V2lkdGgsXG4gICAgJ2xpbmVFbmRpbmcnOiBvYmoubGluZUVuZGluZyxcbiAgICAnbGluZVdpZHRoJzogb2JqLmxpbmVXaWR0aCxcbiAgICAncXVvdGVTdHlsZSc6IG9iai5xdW90ZVN0eWxlLFxuICAgICd0cmFpbGluZ05ld2xpbmUnOiBvYmoudHJhaWxpbmdOZXdsaW5lLFxuICB9O1xuICAvLyBmaWx0ZXIgdW5kZWZpbmVkIHZhbHVlc1xuICByZXR1cm4gT2JqZWN0LmVudHJpZXMocmVzdWx0KS5yZWR1Y2UoKHIsIGkpID0+IChpWzFdID09PSB1bmRlZmluZWQpID8gciA6ICh7IC4uLnIsIFtpWzBdXTogaVsxXSB9KSwge30pO1xufVxuLyogZXNsaW50LWVuYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5cbi8qKlxuICogT3B0aW9ucyB0aGF0IGNoYW5nZSBob3cgdGhlIFlhbWwgbGludGVyIGJlaGF2ZXNcbiAqXG4gKiBAc2NoZW1hIFlhbWxMaW50ZXJDb25maWd1cmF0aW9uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgWWFtbExpbnRlckNvbmZpZ3VyYXRpb24ge1xuICAvKipcbiAgICogQ29udHJvbCB0aGUgbGludGVyIGZvciBZYW1sIGZpbGVzLlxuICAgKlxuICAgKiBAc2NoZW1hIFlhbWxMaW50ZXJDb25maWd1cmF0aW9uI2VuYWJsZWRcbiAgICovXG4gIHJlYWRvbmx5IGVuYWJsZWQ/OiBib29sZWFuO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGFuIG9iamVjdCBvZiB0eXBlICdZYW1sTGludGVyQ29uZmlndXJhdGlvbicgdG8gSlNPTiByZXByZXNlbnRhdGlvbi5cbiAqIEBpbnRlcm5hbFxuICovXG4vKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5leHBvcnQgZnVuY3Rpb24gdG9Kc29uX1lhbWxMaW50ZXJDb25maWd1cmF0aW9uKG9iajogWWFtbExpbnRlckNvbmZpZ3VyYXRpb24gfCB1bmRlZmluZWQpOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgdW5kZWZpbmVkIHtcbiAgaWYgKG9iaiA9PT0gdW5kZWZpbmVkKSB7IHJldHVybiB1bmRlZmluZWQ7IH1cbiAgY29uc3QgcmVzdWx0ID0ge1xuICAgICdlbmFibGVkJzogb2JqLmVuYWJsZWQsXG4gIH07XG4gIC8vIGZpbHRlciB1bmRlZmluZWQgdmFsdWVzXG4gIHJldHVybiBPYmplY3QuZW50cmllcyhyZXN1bHQpLnJlZHVjZSgociwgaSkgPT4gKGlbMV0gPT09IHVuZGVmaW5lZCkgPyByIDogKHsgLi4uciwgW2lbMF1dOiBpWzFdIH0pLCB7fSk7XG59XG4vKiBlc2xpbnQtZW5hYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cblxuLyoqXG4gKiBBIHByZXNldCBjb25maWd1cmF0aW9uIGZvciBlbmFibGluZyBhIHNldCBvZiBydWxlcy5cbiAqXG4gKiBAc2NoZW1hIFByZXNldENvbmZpZ1xuICovXG5leHBvcnQgZW51bSBQcmVzZXRDb25maWcge1xuICAvKiogcmVjb21tZW5kZWQgKi9cbiAgUkVDT01NRU5ERUQgPSBcInJlY29tbWVuZGVkXCIsXG4gIC8qKiBhbGwgKi9cbiAgQUxMID0gXCJhbGxcIixcbiAgLyoqIG5vbmUgKi9cbiAgTk9ORSA9IFwibm9uZVwiLFxufVxuXG4vKipcbiAqIENvbmZpZ3VyZXMgb25lIGdyb3VwIG9mIGFzc2lzdCBhY3Rpb25zLlxuICpcbiAqIEBzY2hlbWEgU291cmNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU291cmNlIHtcbiAgLyoqXG4gICAqIFJlbW92ZSByZXBlYXRlZCBDU1MgY2xhc3MgbmFtZXMgZnJvbSBIVE1MIGNsYXNzIGF0dHJpYnV0ZXMuXG4gICAqIFNlZSBodHRwczovL2Jpb21lanMuZGV2L2Fzc2lzdC9hY3Rpb25zL25vLWR1cGxpY2F0ZS1jbGFzc2VzXG4gICAqXG4gICAqIEBzY2hlbWEgU291cmNlI25vRHVwbGljYXRlQ2xhc3Nlc1xuICAgKi9cbiAgcmVhZG9ubHkgbm9EdXBsaWNhdGVDbGFzc2VzPzogYW55O1xuXG4gIC8qKlxuICAgKiBPcmdhbml6ZSBpbXBvcnRzIGFuZCBleHBvcnRzIGluIEphdmFTY3JpcHQgYW5kIFR5cGVTY3JpcHQgZmlsZXMuXG4gICAqIFNlZSBodHRwczovL2Jpb21lanMuZGV2L2Fzc2lzdC9hY3Rpb25zL29yZ2FuaXplLWltcG9ydHNcbiAgICpcbiAgICogQHNjaGVtYSBTb3VyY2Ujb3JnYW5pemVJbXBvcnRzXG4gICAqL1xuICByZWFkb25seSBvcmdhbml6ZUltcG9ydHM/OiBhbnk7XG5cbiAgLyoqXG4gICAqIFNlbGVjdHMgdGhlIGJhc2VsaW5lIHNldCBvZiBhc3Npc3QgYWN0aW9ucyBmb3IgdGhpcyBncm91cC4gYHJlY29tbWVuZGVkYCBlbmFibGVzXG4gICAqIHRoZSBncm91cCdzIHJlY29tbWVuZGVkIGFjdGlvbnMsIGBhbGxgIGVuYWJsZXMgYWxsIGFjdGlvbnMgaW4gdGhlIGdyb3VwLCBhbmRcbiAgICogYG5vbmVgIHN0YXJ0cyB3aXRoIG5vIGFjdGlvbnMgZW5hYmxlZCBpbiB0aGUgZ3JvdXAuIEV4cGxpY2l0IGFjdGlvbiBzZXR0aW5nc1xuICAgKiBvdmVycmlkZSB0aGlzIGdyb3VwIHByZXNldCwgd2hpY2ggb3ZlcnJpZGVzIGBhc3Npc3QuYWN0aW9ucy5wcmVzZXRgIGZvciB0aGUgZ3JvdXAuXG4gICAqXG4gICAqIEBzY2hlbWEgU291cmNlI3ByZXNldFxuICAgKi9cbiAgcmVhZG9ubHkgcHJlc2V0PzogUHJlc2V0Q29uZmlnO1xuXG4gIC8qKlxuICAgKiBFbmFibGVzIG9yIGRpc2FibGVzIHRoZSByZWNvbW1lbmRlZCBhY3Rpb25zIGluIHRoaXMgZ3JvdXAuIFRoZSBncm91cCdzIGBwcmVzZXRgXG4gICAqIHNldHRpbmcgdGFrZXMgcHJlY2VkZW5jZSB3aGVuIGJvdGggb3B0aW9ucyBhcmUgc2V0LlxuICAgKlxuICAgKiBAc2NoZW1hIFNvdXJjZSNyZWNvbW1lbmRlZFxuICAgKi9cbiAgcmVhZG9ubHkgcmVjb21tZW5kZWQ/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBTb3J0IHRoZSBhcmd1bWVudHMgb2YgR3JhcGhRTCBmaWVsZHMgYW5kIGRpcmVjdGl2ZXMgaW4gbmF0dXJhbCBvcmRlci5cbiAgICogU2VlIGh0dHBzOi8vYmlvbWVqcy5kZXYvYXNzaXN0L2FjdGlvbnMvdXNlLWdyYXBocWwtc29ydGVkLWFyZ3VtZW50c1xuICAgKlxuICAgKiBAc2NoZW1hIFNvdXJjZSN1c2VHcmFwaHFsU29ydGVkQXJndW1lbnRzXG4gICAqL1xuICByZWFkb25seSB1c2VHcmFwaHFsU29ydGVkQXJndW1lbnRzPzogYW55O1xuXG4gIC8qKlxuICAgKiBTb3J0IHRoZSBuYW1lZCBkZWZpbml0aW9ucyBpbiBhIEdyYXBoUUwgZG9jdW1lbnQuXG4gICAqIFNlZSBodHRwczovL2Jpb21lanMuZGV2L2Fzc2lzdC9hY3Rpb25zL3VzZS1ncmFwaHFsLXNvcnRlZC1kZWZpbml0aW9uc1xuICAgKlxuICAgKiBAc2NoZW1hIFNvdXJjZSN1c2VHcmFwaHFsU29ydGVkRGVmaW5pdGlvbnNcbiAgICovXG4gIHJlYWRvbmx5IHVzZUdyYXBocWxTb3J0ZWREZWZpbml0aW9ucz86IGFueTtcblxuICAvKipcbiAgICogU29ydCB0aGUgdmFyaWFibGUgZGVmaW5pdGlvbnMgb2YgR3JhcGhRTCBvcGVyYXRpb25zIGluIG5hdHVyYWwgb3JkZXIuXG4gICAqIFNlZSBodHRwczovL2Jpb21lanMuZGV2L2Fzc2lzdC9hY3Rpb25zL3VzZS1ncmFwaHFsLXNvcnRlZC12YXJpYWJsZXNcbiAgICpcbiAgICogQHNjaGVtYSBTb3VyY2UjdXNlR3JhcGhxbFNvcnRlZFZhcmlhYmxlc1xuICAgKi9cbiAgcmVhZG9ubHkgdXNlR3JhcGhxbFNvcnRlZFZhcmlhYmxlcz86IGFueTtcblxuICAvKipcbiAgICogU29ydCBIVE1MIGF0dHJpYnV0ZXMgYW5kIGZyYW1ld29yayBkaXJlY3RpdmVzIGludG8gYSBjb25zaXN0ZW50IG9yZGVyLlxuICAgKiBTZWUgaHR0cHM6Ly9iaW9tZWpzLmRldi9hc3Npc3QvYWN0aW9ucy91c2Utc29ydGVkLWF0dHJpYnV0ZXNcbiAgICpcbiAgICogQHNjaGVtYSBTb3VyY2UjdXNlU29ydGVkQXR0cmlidXRlc1xuICAgKi9cbiAgcmVhZG9ubHkgdXNlU29ydGVkQXR0cmlidXRlcz86IGFueTtcblxuICAvKipcbiAgICogU29ydCBHcmFwaFFMIGVudW0gdmFsdWVzIGluIG5hdHVyYWwgb3JkZXIuXG4gICAqIFNlZSBodHRwczovL2Jpb21lanMuZGV2L2Fzc2lzdC9hY3Rpb25zL3VzZS1zb3J0ZWQtZW51bS1tZW1iZXJzXG4gICAqXG4gICAqIEBzY2hlbWEgU291cmNlI3VzZVNvcnRlZEVudW1NZW1iZXJzXG4gICAqL1xuICByZWFkb25seSB1c2VTb3J0ZWRFbnVtTWVtYmVycz86IGFueTtcblxuICAvKipcbiAgICogU29ydCBuYW1lZCBtZW1iZXJzIG9mIGEgVHlwZVNjcmlwdCBpbnRlcmZhY2UuXG4gICAqIFNlZSBodHRwczovL2Jpb21lanMuZGV2L2Fzc2lzdC9hY3Rpb25zL3VzZS1zb3J0ZWQtaW50ZXJmYWNlLW1lbWJlcnNcbiAgICpcbiAgICogQHNjaGVtYSBTb3VyY2UjdXNlU29ydGVkSW50ZXJmYWNlTWVtYmVyc1xuICAgKi9cbiAgcmVhZG9ubHkgdXNlU29ydGVkSW50ZXJmYWNlTWVtYmVycz86IGFueTtcblxuICAvKipcbiAgICogU29ydCBrZXlzIGluIGEgSlNPTiBvYmplY3QuXG4gICAqIFNlZSBodHRwczovL2Jpb21lanMuZGV2L2Fzc2lzdC9hY3Rpb25zL3VzZS1zb3J0ZWQta2V5c1xuICAgKlxuICAgKiBAc2NoZW1hIFNvdXJjZSN1c2VTb3J0ZWRLZXlzXG4gICAqL1xuICByZWFkb25seSB1c2VTb3J0ZWRLZXlzPzogYW55O1xuXG4gIC8qKlxuICAgKiBPcmdhbml6ZSBwYWNrYWdlLmpzb24gZmllbGRzIGFjY29yZGluZyB0byBlc3RhYmxpc2hlZCBjb252ZW50aW9ucy5cbiAgICogU2VlIGh0dHBzOi8vYmlvbWVqcy5kZXYvYXNzaXN0L2FjdGlvbnMvdXNlLXNvcnRlZC1wYWNrYWdlLWpzb25cbiAgICpcbiAgICogQHNjaGVtYSBTb3VyY2UjdXNlU29ydGVkUGFja2FnZUpzb25cbiAgICovXG4gIHJlYWRvbmx5IHVzZVNvcnRlZFBhY2thZ2VKc29uPzogYW55O1xuXG4gIC8qKlxuICAgKiBTb3J0IENTUyBwcm9wZXJ0aWVzIGFuZCBuZXN0ZWQgcnVsZXMgaW50byBhIGNvbnNpc3RlbnQgb3JkZXIuXG4gICAqIFNlZSBodHRwczovL2Jpb21lanMuZGV2L2Fzc2lzdC9hY3Rpb25zL3VzZS1zb3J0ZWQtcHJvcGVydGllc1xuICAgKlxuICAgKiBAc2NoZW1hIFNvdXJjZSN1c2VTb3J0ZWRQcm9wZXJ0aWVzXG4gICAqL1xuICByZWFkb25seSB1c2VTb3J0ZWRQcm9wZXJ0aWVzPzogYW55O1xuXG4gIC8qKlxuICAgKiBTb3J0IHNlbGVjdGlvbnMgaW5zaWRlIEdyYXBoUUwgb3BlcmF0aW9ucyBhbmQgZnJhZ21lbnRzLlxuICAgKiBTZWUgaHR0cHM6Ly9iaW9tZWpzLmRldi9hc3Npc3QvYWN0aW9ucy91c2Utc29ydGVkLXNlbGVjdGlvbi1zZXRcbiAgICpcbiAgICogQHNjaGVtYSBTb3VyY2UjdXNlU29ydGVkU2VsZWN0aW9uU2V0XG4gICAqL1xuICByZWFkb25seSB1c2VTb3J0ZWRTZWxlY3Rpb25TZXQ/OiBhbnk7XG5cbiAgLyoqXG4gICAqIFNvcnQgZmllbGRzIGluIEdyYXBoUUwgdHlwZSBkZWZpbml0aW9ucyBieSBuYW1lLlxuICAgKiBTZWUgaHR0cHM6Ly9iaW9tZWpzLmRldi9hc3Npc3QvYWN0aW9ucy91c2Utc29ydGVkLXR5cGUtZmllbGRzXG4gICAqXG4gICAqIEBzY2hlbWEgU291cmNlI3VzZVNvcnRlZFR5cGVGaWVsZHNcbiAgICovXG4gIHJlYWRvbmx5IHVzZVNvcnRlZFR5cGVGaWVsZHM/OiBhbnk7XG59XG5cbi8qKlxuICogQ29udmVydHMgYW4gb2JqZWN0IG9mIHR5cGUgJ1NvdXJjZScgdG8gSlNPTiByZXByZXNlbnRhdGlvbi5cbiAqIEBpbnRlcm5hbFxuICovXG4vKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5leHBvcnQgZnVuY3Rpb24gdG9Kc29uX1NvdXJjZShvYmo6IFNvdXJjZSB8IHVuZGVmaW5lZCk6IFJlY29yZDxzdHJpbmcsIGFueT4gfCB1bmRlZmluZWQge1xuICBpZiAob2JqID09PSB1bmRlZmluZWQpIHsgcmV0dXJuIHVuZGVmaW5lZDsgfVxuICBjb25zdCByZXN1bHQgPSB7XG4gICAgJ25vRHVwbGljYXRlQ2xhc3Nlcyc6IG9iai5ub0R1cGxpY2F0ZUNsYXNzZXMsXG4gICAgJ29yZ2FuaXplSW1wb3J0cyc6IG9iai5vcmdhbml6ZUltcG9ydHMsXG4gICAgJ3ByZXNldCc6IG9iai5wcmVzZXQsXG4gICAgJ3JlY29tbWVuZGVkJzogb2JqLnJlY29tbWVuZGVkLFxuICAgICd1c2VHcmFwaHFsU29ydGVkQXJndW1lbnRzJzogb2JqLnVzZUdyYXBocWxTb3J0ZWRBcmd1bWVudHMsXG4gICAgJ3VzZUdyYXBocWxTb3J0ZWREZWZpbml0aW9ucyc6IG9iai51c2VHcmFwaHFsU29ydGVkRGVmaW5pdGlvbnMsXG4gICAgJ3VzZUdyYXBocWxTb3J0ZWRWYXJpYWJsZXMnOiBvYmoudXNlR3JhcGhxbFNvcnRlZFZhcmlhYmxlcyxcbiAgICAndXNlU29ydGVkQXR0cmlidXRlcyc6IG9iai51c2VTb3J0ZWRBdHRyaWJ1dGVzLFxuICAgICd1c2VTb3J0ZWRFbnVtTWVtYmVycyc6IG9iai51c2VTb3J0ZWRFbnVtTWVtYmVycyxcbiAgICAndXNlU29ydGVkSW50ZXJmYWNlTWVtYmVycyc6IG9iai51c2VTb3J0ZWRJbnRlcmZhY2VNZW1iZXJzLFxuICAgICd1c2VTb3J0ZWRLZXlzJzogb2JqLnVzZVNvcnRlZEtleXMsXG4gICAgJ3VzZVNvcnRlZFBhY2thZ2VKc29uJzogb2JqLnVzZVNvcnRlZFBhY2thZ2VKc29uLFxuICAgICd1c2VTb3J0ZWRQcm9wZXJ0aWVzJzogb2JqLnVzZVNvcnRlZFByb3BlcnRpZXMsXG4gICAgJ3VzZVNvcnRlZFNlbGVjdGlvblNldCc6IG9iai51c2VTb3J0ZWRTZWxlY3Rpb25TZXQsXG4gICAgJ3VzZVNvcnRlZFR5cGVGaWVsZHMnOiBvYmoudXNlU29ydGVkVHlwZUZpZWxkcyxcbiAgfTtcbiAgLy8gZmlsdGVyIHVuZGVmaW5lZCB2YWx1ZXNcbiAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKHJlc3VsdCkucmVkdWNlKChyLCBpKSA9PiAoaVsxXSA9PT0gdW5kZWZpbmVkKSA/IHIgOiAoeyAuLi5yLCBbaVswXV06IGlbMV0gfSksIHt9KTtcbn1cbi8qIGVzbGludC1lbmFibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuXG4vKipcbiAqIEBzY2hlbWEgUXVvdGVTdHlsZVxuICovXG5leHBvcnQgZW51bSBRdW90ZVN0eWxlIHtcbiAgLyoqIGRvdWJsZSAqL1xuICBET1VCTEUgPSBcImRvdWJsZVwiLFxuICAvKiogc2luZ2xlICovXG4gIFNJTkdMRSA9IFwic2luZ2xlXCIsXG59XG5cbi8qKlxuICogQ29udHJvbHMgd2hldGhlciBIVE1MIHZvaWQgZWxlbWVudHMgc3VjaCBhcyBgPGltZz5gIGFuZCBgPGlucHV0PmAgaW5jbHVkZSBhIHNsYXNoIGJlZm9yZSBgPmAuXG4gKlxuICogQHNjaGVtYSBTZWxmQ2xvc2VWb2lkRWxlbWVudHNcbiAqL1xuZXhwb3J0IGVudW0gU2VsZkNsb3NlVm9pZEVsZW1lbnRzIHtcbiAgLyoqIFJlbW92ZXMgdGhlIHNsYXNoLCBmb3IgZXhhbXBsZSBgPGltZyBzcmM9XCJpbWFnZS5wbmdcIj5gLiAobmV2ZXIpICovXG4gIE5FVkVSID0gXCJuZXZlclwiLFxuICAvKiogQWRkcyB0aGUgc2xhc2gsIGZvciBleGFtcGxlIGA8aW1nIHNyYz1cImltYWdlLnBuZ1wiIC8+YC4gKGFsd2F5cykgKi9cbiAgQUxXQVlTID0gXCJhbHdheXNcIixcbn1cblxuLyoqXG4gKiBDb250cm9scyBob3cgdGhlIGZvcm1hdHRlciB0cmVhdHMgd2hpdGVzcGFjZSBhcm91bmQgdGV4dCBhbmQgY2hpbGQgZWxlbWVudHMgaW4gSFRNTCwgVnVlLFxuICogU3ZlbHRlLCBhbmQgQXN0cm8gbWFya3VwLlxuICpcbiAqIFRoZSBmb2xsb3dpbmcgdHdvIGNhc2VzIHdvbid0IHByb2R1Y2UgdGhlIHNhbWUgb3V0cHV0OlxuICpcbiAqIHwgICAgICAgICAgICAgICAgfCAgICAgIGh0bWwgICAgICB8ICAgIG91dHB1dCAgICB8XG4gKiB8IC0tLS0tLS0tLS0tLS0tIHwgOi0tLS0tLS0tLS0tLTogfCA6LS0tLS0tLS0tLTogfFxuICogfCB3aXRoIHNwYWNlcyAgICB8IGAxPGI+IDIgPC9iPjNgIHwgMTxiPiAyIDwvYj4zIHxcbiAqIHwgd2l0aG91dCBzcGFjZXMgfCAgYDE8Yj4yPC9iPjNgICB8ICAxPGI+MjwvYj4zICB8XG4gKlxuICogVGhpcyBoYXBwZW5zIGJlY2F1c2Ugd2hpdGVzcGFjZSBpcyBzaWduaWZpY2FudCBpbiBpbmxpbmUgZWxlbWVudHMuXG4gKlxuICogQXMgYSBjb25zZXF1ZW5jZSBvZiB0aGlzLCB0aGUgZm9ybWF0dGVyIG11c3QgZm9ybWF0IGJsb2NrcyB0aGF0IGxvb2sgbGlrZSB0aGlzIChhc3N1bWUgYSBzbWFsbCBsaW5lIHdpZHRoLCA8MjApOlxuICogYGBgaHRtbFxuICogPHNwYW4+cmVhbGx5IGxvbmcgY29udGVudDwvc3Bhbj5cbiAqIGBgYFxuICogYXMgdGhpcywgd2hlcmUgdGhlIGNvbnRlbnQgaHVncyB0aGUgdGFnczpcbiAqIGBgYGh0bWxcbiAqIDxzcGFuXG4gKiA+cmVhbGx5IGxvbmcgY29udGVudDwvc3BhblxuICogPlxuICogYGBgXG4gKlxuICogTm90ZSB0aGF0IHRoaXMgaXMgb25seSBuZWNlc3NhcnkgZm9yIGlubGluZSBlbGVtZW50cy4gQmxvY2sgZWxlbWVudHMgZG8gbm90IGhhdmUgdGhpcyByZXN0cmljdGlvbi5cbiAqXG4gKiBAc2NoZW1hIFdoaXRlc3BhY2VTZW5zaXRpdml0eVxuICovXG5leHBvcnQgZW51bSBXaGl0ZXNwYWNlU2Vuc2l0aXZpdHkge1xuICAvKiogVHJlYXRzIHdoaXRlc3BhY2UgYXMgc2lnbmlmaWNhbnQgZm9yIGVsZW1lbnRzIHRoYXQgYnJvd3NlcnMgZGlzcGxheSBpbmxpbmUgYnkgZGVmYXVsdC4gKGNzcykgKi9cbiAgQ1NTID0gXCJjc3NcIixcbiAgLyoqIFRyZWF0cyBsZWFkaW5nIGFuZCB0cmFpbGluZyB3aGl0ZXNwYWNlIGFzIHNpZ25pZmljYW50IGZvciBldmVyeSBlbGVtZW50LiBFeGlzdGluZyB3aGl0ZXNwYWNlXG5pcyBwcmVzZXJ2ZWQgYXMgYXQgbGVhc3Qgb25lIGNoYXJhY3RlciBhbmQgYWJzZW50IHdoaXRlc3BhY2UgaXMgbm90IGFkZGVkLlxuXG5FeGFtcGxlIG9mIHRleHQgaHVnZ2luZyB0aGUgdGFnczpcbmBgYGh0bWxcbjxiXG4gICAgPmNvbnRlbnQ8L2Jcbj5cbmBgYCAoc3RyaWN0KSAqL1xuICBTVFJJQ1QgPSBcInN0cmljdFwiLFxuICAvKiogVHJlYXRzIHdoaXRlc3BhY2UgYXMgaW5zaWduaWZpY2FudCwgYWxsb3dpbmcgdGhlIGZvcm1hdHRlciB0byBhZGQgb3IgcmVtb3ZlIGl0LiBVc2UgdGhpcyBvbmx5XG53aGVuIHdoaXRlc3BhY2UgY2Fubm90IGFmZmVjdCByZW5kZXJlZCBvdXRwdXQuIChpZ25vcmUpICovXG4gIElHTk9SRSA9IFwiaWdub3JlXCIsXG59XG5cbi8qKlxuICogQHNjaGVtYSBBcnJvd1BhcmVudGhlc2VzXG4gKi9cbmV4cG9ydCBlbnVtIEFycm93UGFyZW50aGVzZXMge1xuICAvKiogQWx3YXlzIHByaW50cyBwYXJlbnRoZXNlcyBhcm91bmQgYXJyb3ctZnVuY3Rpb24gcGFyYW1ldGVycy4gKGFsd2F5cykgKi9cbiAgQUxXQVlTID0gXCJhbHdheXNcIixcbiAgLyoqIE9taXRzIHBhcmVudGhlc2VzIHdoZW4gYW4gYXJyb3cgZnVuY3Rpb24gaGFzIG9uZSBwYXJhbWV0ZXIgYW5kIHRoZSBzeW50YXggcGVybWl0cyBpdC4gKGFzTmVlZGVkKSAqL1xuICBBU19ORUVERUQgPSBcImFzTmVlZGVkXCIsXG59XG5cbi8qKlxuICogQHNjaGVtYSBPcGVyYXRvckxpbmVicmVha1xuICovXG5leHBvcnQgZW51bSBPcGVyYXRvckxpbmVicmVhayB7XG4gIC8qKiBUaGUgb3BlcmF0b3IgaXMgcGxhY2VkIGFmdGVyIHRoZSBleHByZXNzaW9uIChhZnRlcikgKi9cbiAgQUZURVIgPSBcImFmdGVyXCIsXG4gIC8qKiBUaGUgb3BlcmF0b3IgaXMgcGxhY2VkIGJlZm9yZSB0aGUgZXhwcmVzc2lvbiAoYmVmb3JlKSAqL1xuICBCRUZPUkUgPSBcImJlZm9yZVwiLFxufVxuXG4vKipcbiAqIEBzY2hlbWEgUXVvdGVQcm9wZXJ0aWVzXG4gKi9cbmV4cG9ydCBlbnVtIFF1b3RlUHJvcGVydGllcyB7XG4gIC8qKiBSZW1vdmVzIHF1b3RlcyB3aGVuIHRoZSBwcm9wZXJ0eSBuYW1lIGlzIHZhbGlkIHdpdGhvdXQgdGhlbS4gKGFzTmVlZGVkKSAqL1xuICBBU19ORUVERUQgPSBcImFzTmVlZGVkXCIsXG4gIC8qKiBQcmVzZXJ2ZXMgcXVvdGVzIGFyb3VuZCBwcm9wZXJ0eSBuYW1lcyB0aGF0IHdlcmUgcXVvdGVkIGluIHRoZSBpbnB1dC4gKHByZXNlcnZlKSAqL1xuICBQUkVTRVJWRSA9IFwicHJlc2VydmVcIixcbn1cblxuLyoqXG4gKiBAc2NoZW1hIFNlbWljb2xvbnNcbiAqL1xuZXhwb3J0IGVudW0gU2VtaWNvbG9ucyB7XG4gIC8qKiBhbHdheXMgKi9cbiAgQUxXQVlTID0gXCJhbHdheXNcIixcbiAgLyoqIGFzTmVlZGVkICovXG4gIEFTX05FRURFRCA9IFwiYXNOZWVkZWRcIixcbn1cblxuLyoqXG4gKiBQcmludCB0cmFpbGluZyBjb21tYXMgd2hlcmV2ZXIgcG9zc2libGUgaW4gbXVsdGktbGluZSBjb21tYS1zZXBhcmF0ZWQgc3ludGFjdGljIHN0cnVjdHVyZXMgZm9yIEphdmFTY3JpcHQvVHlwZVNjcmlwdCBmaWxlcy5cbiAqXG4gKiBAc2NoZW1hIEpzVHJhaWxpbmdDb21tYXNcbiAqL1xuZXhwb3J0IGVudW0gSnNUcmFpbGluZ0NvbW1hcyB7XG4gIC8qKiBhbGwgKi9cbiAgQUxMID0gXCJhbGxcIixcbiAgLyoqIGVzNSAqL1xuICBFUzUgPSBcImVzNVwiLFxuICAvKiogbm9uZSAqL1xuICBOT05FID0gXCJub25lXCIsXG59XG5cbi8qKlxuICogQ29udHJvbHMgdHJhaWxpbmcgY29tbWFzIGluIG11bHRpbGluZSBKU09OIGFycmF5cyBhbmQgb2JqZWN0cy4gVXNlIGBhbGxgIG9ubHkgZm9yIEpTT04gdmFyaWFudHMgdGhhdCBhbGxvdyB0cmFpbGluZyBjb21tYXMsIGFuZCBlbnN1cmUgYGpzb24ucGFyc2VyLmFsbG93VHJhaWxpbmdDb21tYXNgIGlzIGVuYWJsZWQgb3IgYXV0b21hdGljYWxseSBkZXRlY3RlZCBmb3IgdGhvc2UgZmlsZXMuXG4gKlxuICogQHNjaGVtYSBKc29uVHJhaWxpbmdDb21tYXNcbiAqL1xuZXhwb3J0IGVudW0gSnNvblRyYWlsaW5nQ29tbWFzIHtcbiAgLyoqIG5vbmUgKi9cbiAgTk9ORSA9IFwibm9uZVwiLFxuICAvKiogYWxsICovXG4gIEFMTCA9IFwiYWxsXCIsXG59XG5cbi8qKlxuICogQHNjaGVtYSBSdWxlRG9tYWluVmFsdWVcbiAqL1xuZXhwb3J0IGVudW0gUnVsZURvbWFpblZhbHVlIHtcbiAgLyoqIEVuYWJsZXMgYWxsIHJ1bGVzIGluIHRoZSBkb21haW4uIChhbGwpICovXG4gIEFMTCA9IFwiYWxsXCIsXG4gIC8qKiBEaXNhYmxlcyB0aGUgZG9tYWluLiAobm9uZSkgKi9cbiAgTk9ORSA9IFwibm9uZVwiLFxuICAvKiogRW5hYmxlcyB0aGUgZG9tYWluJ3MgcmVjb21tZW5kZWQgbm9uLW51cnNlcnkgcnVsZXMuIChyZWNvbW1lbmRlZCkgKi9cbiAgUkVDT01NRU5ERUQgPSBcInJlY29tbWVuZGVkXCIsXG59XG5cbi8qKlxuICogQ29udHJvbHMgd2hldGhlciBCaW9tZSBrZWVwcywgYWRkcywgb3IgcmVtb3ZlcyBsaW5lIGJyZWFrcyBpbiBNYXJrZG93biBwYXJhZ3JhcGhzLlxuICpcbiAqIE1hbnVhbCBsaW5lIGJyZWFrcyBhcmUgYWx3YXlzIGtlcHQuIEluIE1hcmtkb3duLCBhIG1hbnVhbCBsaW5lIGJyZWFrIGlzIGNyZWF0ZWQgYnkgZW5kaW5nIGFcbiAqIGxpbmUgd2l0aCB0d28gc3BhY2VzIG9yIGEgYmFja3NsYXNoLlxuICpcbiAqIEBzY2hlbWEgUHJvc2VXcmFwXG4gKi9cbmV4cG9ydCBlbnVtIFByb3NlV3JhcCB7XG4gIC8qKiBLZWVwIGxpbmUgYnJlYWtzIGFzIHdyaXR0ZW4gaW4gdGhlIHNvdXJjZSBmaWxlLiBUaGlzIGlzIHRoZSBkZWZhdWx0LiAocHJlc2VydmUpICovXG4gIFBSRVNFUlZFID0gXCJwcmVzZXJ2ZVwiLFxuICAvKiogV3JhcCBwYXJhZ3JhcGhzIHRvIGZpdCB0aGUgY29uZmlndXJlZCBgbGluZVdpZHRoYC4gKGFsd2F5cykgKi9cbiAgQUxXQVlTID0gXCJhbHdheXNcIixcbiAgLyoqIFJlbW92ZSBsaW5lIGJyZWFrcyBmcm9tIHBhcmFncmFwaHMgc28gdGhhdCBlYWNoIHBhcmFncmFwaCBpcyBvbiBvbmUgbGluZS4gKG5ldmVyKSAqL1xuICBORVZFUiA9IFwibmV2ZXJcIixcbn1cbiJdfQ==