sonamu 0.10.13 → 0.11.0

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 (230) hide show
  1. package/dist/ai/agents/agent.d.ts.map +1 -1
  2. package/dist/ai/providers/rtzr/error.d.ts.map +1 -1
  3. package/dist/ai/providers/rtzr/model.d.ts.map +1 -1
  4. package/dist/ai/providers/rtzr/utils.d.ts.map +1 -1
  5. package/dist/api/base-frame.d.ts.map +1 -1
  6. package/dist/api/decorators.d.ts.map +1 -1
  7. package/dist/api/sonamu.d.ts.map +1 -1
  8. package/dist/api/sonamu.js +3 -2
  9. package/dist/api/validator.d.ts.map +1 -1
  10. package/dist/auth/audit-log/events.d.ts.map +1 -1
  11. package/dist/auth/index.d.ts +1 -1
  12. package/dist/auth/index.d.ts.map +1 -1
  13. package/dist/auth/index.js +3 -3
  14. package/dist/auth/knex-adapter.d.ts.map +1 -1
  15. package/dist/auth/plugins/wrappers/admin.d.ts +4 -4
  16. package/dist/auth/plugins/wrappers/admin.d.ts.map +1 -1
  17. package/dist/auth/plugins/wrappers/anonymous.d.ts.map +1 -1
  18. package/dist/auth/plugins/wrappers/api-key.d.ts.map +1 -1
  19. package/dist/auth/plugins/wrappers/jwt.d.ts.map +1 -1
  20. package/dist/auth/plugins/wrappers/organization.d.ts.map +1 -1
  21. package/dist/auth/plugins/wrappers/passkey.d.ts.map +1 -1
  22. package/dist/auth/plugins/wrappers/phone-number.d.ts.map +1 -1
  23. package/dist/auth/plugins/wrappers/sso.d.ts.map +1 -1
  24. package/dist/auth/plugins/wrappers/two-factor.d.ts.map +1 -1
  25. package/dist/auth/plugins/wrappers/username.d.ts.map +1 -1
  26. package/dist/bin/build-config.d.ts +10 -0
  27. package/dist/bin/build-config.d.ts.map +1 -1
  28. package/dist/bin/build-config.js +130 -6
  29. package/dist/bin/fixture.d.ts +7 -4
  30. package/dist/bin/fixture.d.ts.map +1 -1
  31. package/dist/bin/fixture.js +161 -13
  32. package/dist/bin/test-command.d.ts +7 -0
  33. package/dist/bin/test-command.d.ts.map +1 -1
  34. package/dist/bin/test-command.js +18 -4
  35. package/dist/bin/typecheck-web.d.ts +2 -0
  36. package/dist/bin/typecheck-web.d.ts.map +1 -0
  37. package/dist/bin/typecheck-web.js +36 -0
  38. package/dist/cache/decorator.d.ts.map +1 -1
  39. package/dist/cache/drivers.d.ts.map +1 -1
  40. package/dist/cache-control/cache-control.d.ts.map +1 -1
  41. package/dist/compress/compress.d.ts.map +1 -1
  42. package/dist/cone/cone-generator.js +1 -1
  43. package/dist/database/base-model.d.ts.map +1 -1
  44. package/dist/database/base-model.types.d.ts +0 -1
  45. package/dist/database/base-model.types.d.ts.map +1 -1
  46. package/dist/database/db.d.ts.map +1 -1
  47. package/dist/database/puri-subset.types.d.ts +0 -1
  48. package/dist/database/puri-subset.types.d.ts.map +1 -1
  49. package/dist/database/puri-wrapper.d.ts +0 -1
  50. package/dist/database/puri-wrapper.d.ts.map +1 -1
  51. package/dist/database/puri.d.ts +0 -1
  52. package/dist/database/puri.d.ts.map +1 -1
  53. package/dist/database/puri.types.d.ts +0 -1
  54. package/dist/database/puri.types.d.ts.map +1 -1
  55. package/dist/database/transaction-context.d.ts.map +1 -1
  56. package/dist/database/upsert-builder.d.ts.map +1 -1
  57. package/dist/dict/en.d.ts +58 -58
  58. package/dist/dict/en.d.ts.map +1 -1
  59. package/dist/dict/ko.d.ts +58 -58
  60. package/dist/dict/ko.d.ts.map +1 -1
  61. package/dist/dict/rc-keys.d.ts.map +1 -1
  62. package/dist/dict/sonamu-dictionary.d.ts.map +1 -1
  63. package/dist/dict/sonamu-dictionary.js +2 -2
  64. package/dist/dict/utils.d.ts.map +1 -1
  65. package/dist/entity/entity-manager.d.ts +115 -113
  66. package/dist/entity/entity-manager.d.ts.map +1 -1
  67. package/dist/entity/entity-manager.js +25 -19
  68. package/dist/entity/entity-template-cone.d.ts +4 -4
  69. package/dist/entity/entity.d.ts +6 -1
  70. package/dist/entity/entity.d.ts.map +1 -1
  71. package/dist/entity/entity.js +8 -3
  72. package/dist/env.d.ts.map +1 -1
  73. package/dist/exceptions/so-exceptions.d.ts.map +1 -1
  74. package/dist/filter/types.d.ts.map +1 -1
  75. package/dist/index.js +6 -6
  76. package/dist/logger/configure.d.ts +10 -1
  77. package/dist/logger/configure.d.ts.map +1 -1
  78. package/dist/logger/configure.js +30 -5
  79. package/dist/migration/migrator.d.ts +12 -1
  80. package/dist/migration/migrator.d.ts.map +1 -1
  81. package/dist/migration/migrator.js +77 -30
  82. package/dist/migration/postgresql-schema-reader.d.ts.map +1 -1
  83. package/dist/migration/slack-confirm.d.ts.map +1 -1
  84. package/dist/naite/messaging-types.d.ts +0 -1
  85. package/dist/naite/messaging-types.d.ts.map +1 -1
  86. package/dist/naite/naite-reporter.d.ts +0 -1
  87. package/dist/naite/naite-reporter.d.ts.map +1 -1
  88. package/dist/naite/naite.d.ts.map +1 -1
  89. package/dist/storage/base-file.d.ts.map +1 -1
  90. package/dist/storage/buffered-file.d.ts.map +1 -1
  91. package/dist/storage/drivers.d.ts.map +1 -1
  92. package/dist/storage/s3-driver.d.ts.map +1 -1
  93. package/dist/storage/storage-manager.d.ts.map +1 -1
  94. package/dist/storage/uploaded-file.d.ts.map +1 -1
  95. package/dist/stream/ws-audience-resolver.d.ts.map +1 -1
  96. package/dist/stream/ws-audience.d.ts.map +1 -1
  97. package/dist/stream/ws-cluster-bus.d.ts.map +1 -1
  98. package/dist/stream/ws-delivery.d.ts.map +1 -1
  99. package/dist/stream/ws-local-connection-store.d.ts.map +1 -1
  100. package/dist/stream/ws-presence-store.d.ts.map +1 -1
  101. package/dist/stream/ws-registry.d.ts.map +1 -1
  102. package/dist/stream/ws-telemetry-memory.d.ts.map +1 -1
  103. package/dist/stream/ws-telemetry.d.ts.map +1 -1
  104. package/dist/stream/ws.d.ts.map +1 -1
  105. package/dist/syncer/api-parser.js +2 -2
  106. package/dist/syncer/file-patterns.d.ts +17 -17
  107. package/dist/syncer/filesystem-dependencies.js +1 -1
  108. package/dist/syncer/syncer.d.ts.map +1 -1
  109. package/dist/tasks/step-wrapper.d.ts.map +1 -1
  110. package/dist/tasks/workflow-manager.d.ts.map +1 -1
  111. package/dist/template/implementations/entity.template.d.ts +2 -2
  112. package/dist/template/implementations/entity.template.d.ts.map +1 -1
  113. package/dist/template/implementations/entry-server.template.d.ts +2 -2
  114. package/dist/template/implementations/entry-server.template.d.ts.map +1 -1
  115. package/dist/template/implementations/generated.template.d.ts +2 -2
  116. package/dist/template/implementations/generated.template.d.ts.map +1 -1
  117. package/dist/template/implementations/generated_http.template.d.ts +2 -2
  118. package/dist/template/implementations/generated_http.template.d.ts.map +1 -1
  119. package/dist/template/implementations/generated_sso.template.d.ts +2 -2
  120. package/dist/template/implementations/generated_sso.template.d.ts.map +1 -1
  121. package/dist/template/implementations/http_validators.template.d.ts +2 -2
  122. package/dist/template/implementations/http_validators.template.d.ts.map +1 -1
  123. package/dist/template/implementations/init_types.template.d.ts +2 -2
  124. package/dist/template/implementations/init_types.template.d.ts.map +1 -1
  125. package/dist/template/implementations/model.template.d.ts +2 -2
  126. package/dist/template/implementations/model.template.d.ts.map +1 -1
  127. package/dist/template/implementations/model_test.template.d.ts +2 -2
  128. package/dist/template/implementations/model_test.template.d.ts.map +1 -1
  129. package/dist/template/implementations/queries.template.d.ts +2 -2
  130. package/dist/template/implementations/queries.template.d.ts.map +1 -1
  131. package/dist/template/implementations/sd.template.d.ts +2 -2
  132. package/dist/template/implementations/sd.template.d.ts.map +1 -1
  133. package/dist/template/implementations/sd.template.js +1 -1
  134. package/dist/template/implementations/services.template.d.ts +2 -2
  135. package/dist/template/implementations/services.template.d.ts.map +1 -1
  136. package/dist/template/implementations/view_form.template.d.ts +3 -3
  137. package/dist/template/implementations/view_form.template.d.ts.map +1 -1
  138. package/dist/template/implementations/view_id_all_select.template.d.ts +2 -2
  139. package/dist/template/implementations/view_id_all_select.template.d.ts.map +1 -1
  140. package/dist/template/implementations/view_list.template.d.ts +2 -2
  141. package/dist/template/implementations/view_list.template.d.ts.map +1 -1
  142. package/dist/template/implementations/view_search_input.template.d.ts +2 -2
  143. package/dist/template/implementations/view_search_input.template.d.ts.map +1 -1
  144. package/dist/template/template-manager.d.ts.map +1 -1
  145. package/dist/template/template.d.ts.map +1 -1
  146. package/dist/template/zod-converter.d.ts.map +1 -1
  147. package/dist/testing/_relation-graph.d.ts.map +1 -1
  148. package/dist/testing/data-explorer.d.ts +2 -2
  149. package/dist/testing/data-explorer.d.ts.map +1 -1
  150. package/dist/testing/dev-vitest-manager.d.ts.map +1 -1
  151. package/dist/testing/faker-mappings.d.ts.map +1 -1
  152. package/dist/testing/fixture-generator.d.ts.map +1 -1
  153. package/dist/testing/fixture-generator.js +1 -1
  154. package/dist/testing/fixture-loader.d.ts.map +1 -1
  155. package/dist/testing/fixture-manager.d.ts +4 -0
  156. package/dist/testing/fixture-manager.d.ts.map +1 -1
  157. package/dist/testing/fixture-manager.js +99 -25
  158. package/dist/testing/naite-vitest-reporter.d.ts.map +1 -1
  159. package/dist/testing/parallel-db-manager.d.ts.map +1 -1
  160. package/dist/tooling/__tests__/helpers/sonamu-test-root.d.ts +10 -0
  161. package/dist/tooling/__tests__/helpers/sonamu-test-root.d.ts.map +1 -0
  162. package/dist/tooling/__tests__/helpers/sonamu-test-root.js +42 -0
  163. package/dist/tooling/cdd-service.d.ts +87 -0
  164. package/dist/tooling/cdd-service.d.ts.map +1 -0
  165. package/dist/tooling/cdd-service.js +215 -0
  166. package/dist/tooling/cli-tooling.d.ts +11 -0
  167. package/dist/tooling/cli-tooling.d.ts.map +1 -0
  168. package/dist/tooling/cli-tooling.js +901 -0
  169. package/dist/tooling/fixture-service.d.ts +29 -0
  170. package/dist/tooling/fixture-service.d.ts.map +1 -0
  171. package/dist/tooling/fixture-service.js +53 -0
  172. package/dist/tooling/index.d.ts +2 -0
  173. package/dist/tooling/index.d.ts.map +1 -0
  174. package/dist/tooling/index.js +2 -0
  175. package/dist/tooling/test-run-client.d.ts +27 -0
  176. package/dist/tooling/test-run-client.d.ts.map +1 -0
  177. package/dist/tooling/test-run-client.js +120 -0
  178. package/dist/tsdown.api.config.js +48 -0
  179. package/dist/types/types.d.ts +527 -527
  180. package/dist/types/types.d.ts.map +1 -1
  181. package/dist/ui/ai-client.d.ts.map +1 -1
  182. package/dist/utils/formatter.d.ts +6 -0
  183. package/dist/utils/formatter.d.ts.map +1 -1
  184. package/dist/utils/formatter.js +42 -11
  185. package/dist/utils/model.d.ts +1 -1
  186. package/dist/vector/chunking.d.ts.map +1 -1
  187. package/dist/vector/embedding.d.ts.map +1 -1
  188. package/package.json +13 -12
  189. package/src/api/sonamu.ts +2 -1
  190. package/src/auth/index.ts +1 -1
  191. package/src/bin/__tests__/zod-compiler-build.test.ts +67 -0
  192. package/src/bin/build-config.ts +151 -5
  193. package/src/bin/fixture.ts +204 -21
  194. package/src/bin/test-command.ts +27 -4
  195. package/src/bin/typecheck-web.ts +56 -0
  196. package/src/dict/sonamu-dictionary.ts +1 -1
  197. package/src/entity/__tests__/entity-manager-autoload.contract.test.ts +55 -0
  198. package/src/entity/__tests__/entity-manager-explicit-root-registration.contract.test.ts +107 -0
  199. package/src/entity/entity-manager.ts +31 -19
  200. package/src/entity/entity.ts +7 -2
  201. package/src/logger/__tests__/configure.test.ts +33 -0
  202. package/src/logger/configure.ts +45 -3
  203. package/src/migration/__tests__/migrator.test.ts +51 -0
  204. package/src/migration/migrator.ts +103 -34
  205. package/src/syncer/api-parser.ts +1 -1
  206. package/src/testing/fixture-manager.ts +124 -32
  207. package/src/tooling/__tests__/cdd-rule-bootstrap.contract.test.ts +118 -0
  208. package/src/tooling/__tests__/cli-tooling-auth.contract.test.ts +72 -0
  209. package/src/tooling/__tests__/cli-tooling-cone-locale.contract.test.ts +150 -0
  210. package/src/tooling/__tests__/cli-tooling-entity-patch.contract.test.ts +131 -0
  211. package/src/tooling/__tests__/cli-tooling-fixture-transfer.contract.test.ts +255 -0
  212. package/src/tooling/__tests__/cli-tooling-i18n-update.contract.test.ts +104 -0
  213. package/src/tooling/__tests__/cli-tooling-scaffold.contract.test.ts +86 -0
  214. package/src/tooling/__tests__/cli-tooling-stub-practice.contract.test.ts +147 -0
  215. package/src/tooling/__tests__/default-cdd-adapter.contract.test.ts +73 -0
  216. package/src/tooling/__tests__/helpers/sonamu-test-root.ts +42 -0
  217. package/src/tooling/__tests__/test-run-client-config.contract.test.ts +154 -0
  218. package/src/tooling/cdd-service.ts +256 -0
  219. package/src/tooling/cli-tooling.ts +937 -0
  220. package/src/tooling/fixture-service.ts +72 -0
  221. package/src/tooling/index.ts +1 -0
  222. package/src/tooling/test-run-client.ts +196 -0
  223. package/src/utils/__tests__/formatter-bin.test.ts +99 -0
  224. package/src/utils/formatter.ts +74 -10
  225. package/tsdown.api.config.ts +8 -10
  226. package/bin/cli.js +0 -75
  227. package/dist/bin/cli.d.ts +0 -2
  228. package/dist/bin/cli.d.ts.map +0 -1
  229. package/dist/bin/cli.js +0 -956
  230. package/src/bin/cli.ts +0 -1166
@@ -1382,6 +1382,7 @@ var init_sonamu = __esmMin((() => {
1382
1382
  });
1383
1383
  }
1384
1384
  async destroy() {
1385
+ const { hasExternalLogTapeConfiguration } = await import("../logger/configure.js");
1385
1386
  const { BaseModel } = await import("../database/base-model.js");
1386
1387
  await BaseModel.destroy();
1387
1388
  if (this.websocketRuntimeValue) await this.websocketRuntimeValue.shutdown();
@@ -1392,7 +1393,7 @@ var init_sonamu = __esmMin((() => {
1392
1393
  this.devVitestManagerValue?.shutdown() ?? Promise.resolve(),
1393
1394
  this.watcher?.close() ?? Promise.resolve()
1394
1395
  ]);
1395
- await dispose();
1396
+ if (!hasExternalLogTapeConfiguration()) await dispose();
1396
1397
  }
1397
1398
  };
1398
1399
  Sonamu = new SonamuClass();
@@ -1407,4 +1408,4 @@ var init_sonamu = __esmMin((() => {
1407
1408
  init_sonamu();
1408
1409
  export { Sonamu, createWebSocketReplyStub, defaultSonamuHttpValidatorDependencies, init_sonamu, resolveWebSocketCloseDescriptor, resolveWebSocketPluginOptions };
1409
1410
 
1410
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic29uYW11LmpzIiwibmFtZXMiOlsibWltZUxvb2t1cCIsImxvZ3RhcGVEaXNwb3NlIl0sInNvdXJjZXMiOlsiLi4vLi4vc3JjL2FwaS9zb25hbXUudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQXN5bmNMb2NhbFN0b3JhZ2UgfSBmcm9tIFwiYXN5bmNfaG9va3NcIjtcbmltcG9ydCBmcyBmcm9tIFwiZnMvcHJvbWlzZXNcIjtcbmltcG9ydCB7IHR5cGUgSW5jb21pbmdNZXNzYWdlLCB0eXBlIFNlcnZlciwgdHlwZSBTZXJ2ZXJSZXNwb25zZSB9IGZyb20gXCJodHRwXCI7XG5pbXBvcnQgb3MgZnJvbSBcIm9zXCI7XG5pbXBvcnQgcGF0aCBmcm9tIFwicGF0aFwiO1xuXG5pbXBvcnQgXCJAZmFzdGlmeS93ZWJzb2NrZXRcIjtcbmltcG9ydCB7IGRpc3Bvc2UgYXMgbG9ndGFwZURpc3Bvc2UgfSBmcm9tIFwiQGxvZ3RhcGUvbG9ndGFwZVwiO1xuaW1wb3J0IHsgdHlwZSBBdXRoLCB0eXBlIEJldHRlckF1dGhPcHRpb25zIH0gZnJvbSBcImJldHRlci1hdXRoXCI7XG5pbXBvcnQgY2hhbGsgZnJvbSBcImNoYWxrXCI7XG5pbXBvcnQgeyB0eXBlIEZTV2F0Y2hlciB9IGZyb20gXCJjaG9raWRhclwiO1xuaW1wb3J0IHsgdHlwZSBGYXN0aWZ5SW5zdGFuY2UsIHR5cGUgRmFzdGlmeVJlcGx5LCB0eXBlIEZhc3RpZnlSZXF1ZXN0IH0gZnJvbSBcImZhc3RpZnlcIjtcbmltcG9ydCBtaW1lLCB7IGxvb2t1cCBhcyBtaW1lTG9va3VwIH0gZnJvbSBcIm1pbWUtdHlwZXNcIjtcbmltcG9ydCB7IHR5cGUgV2ViU29ja2V0IH0gZnJvbSBcIndzXCI7XG5pbXBvcnQgeyB0eXBlIFpvZE9iamVjdCB9IGZyb20gXCJ6b2RcIjtcblxuaW1wb3J0IHsgQkFTRV9GSUVMRF9NQVBQSU5HUyB9IGZyb20gXCIuLi9hdXRoL2JldHRlci1hdXRoLWVudGl0aWVzXCI7XG5pbXBvcnQgeyBjcmVhdGVCZXR0ZXJBdXRoUmVxdWVzdCB9IGZyb20gXCIuLi9hdXRoL2JldHRlci1hdXRoLXJlcXVlc3RcIjtcbmltcG9ydCB7IGFwcGx5Q2FjaGVIZWFkZXJzLCBDYWNoZVByZXNldHMgfSBmcm9tIFwiLi4vY2FjaGUtY29udHJvbC9jYWNoZS1jb250cm9sXCI7XG5pbXBvcnQgeyB0eXBlIENhY2hlQ29udHJvbENvbmZpZywgdHlwZSBDYWNoZUNvbnRyb2xSZXF1ZXN0IH0gZnJvbSBcIi4uL2NhY2hlLWNvbnRyb2wvdHlwZXNcIjtcbmltcG9ydCB7IHR5cGUgQ2FjaGVDb25maWcsIHR5cGUgQ2FjaGVNYW5hZ2VyIH0gZnJvbSBcIi4uL2NhY2hlL3R5cGVzXCI7XG5pbXBvcnQgeyB0b0Zhc3RpZnlDb21wcmVzc09wdGlvbiB9IGZyb20gXCIuLi9jb21wcmVzcy9jb21wcmVzc1wiO1xuaW1wb3J0IHsgdHlwZSBDb21wcmVzc09wdGlvbnMgfSBmcm9tIFwiLi4vY29tcHJlc3MvdHlwZXNcIjtcbmltcG9ydCB7IERCIH0gZnJvbSBcIi4uL2RhdGFiYXNlL2RiXCI7XG5pbXBvcnQgeyB0eXBlIFNvbmFtdURCQ29uZmlnIH0gZnJvbSBcIi4uL2RhdGFiYXNlL2RiXCI7XG5pbXBvcnQgeyBTRCwgc2V0U0RDb25maWcgfSBmcm9tIFwiLi4vZGljdC9zZFwiO1xuaW1wb3J0IHsgdHlwZSBMb2NhbGl6ZWRTdHJpbmcgfSBmcm9tIFwiLi4vZGljdC90eXBlc1wiO1xuaW1wb3J0IHsgZ2V0U29uYW11RW52aXJvbm1lbnQsIHJlYWRBbGxFbnZpcm9ubWVudFNuYXBzaG90cyB9IGZyb20gXCIuLi9lbnZcIjtcbmltcG9ydCB7IE5vdEZvdW5kRXhjZXB0aW9uIH0gZnJvbSBcIi4uL2V4Y2VwdGlvbnMvc28tZXhjZXB0aW9uc1wiO1xuaW1wb3J0IHsgcnVudGltZVR5cGVPZiB9IGZyb20gXCIuLi9ydW50aW1lLXR5cGVcIjtcbmltcG9ydCB7IEJ1ZmZlcmVkRmlsZSB9IGZyb20gXCIuLi9zdG9yYWdlL2J1ZmZlcmVkLWZpbGVcIjtcbmltcG9ydCB7IHR5cGUgU3RvcmFnZU1hbmFnZXIgfSBmcm9tIFwiLi4vc3RvcmFnZS9zdG9yYWdlLW1hbmFnZXJcIjtcbmltcG9ydCB7IHR5cGUgS2V5R2VuZXJhdG9yIH0gZnJvbSBcIi4uL3N0b3JhZ2UvdHlwZXNcIjtcbmltcG9ydCB7IFVwbG9hZGVkRmlsZSB9IGZyb20gXCIuLi9zdG9yYWdlL3VwbG9hZGVkLWZpbGVcIjtcbmltcG9ydCB7IGNyZWF0ZU1vY2tTU0VGYWN0b3J5IH0gZnJvbSBcIi4uL3N0cmVhbS9zc2VcIjtcbmltcG9ydCB7XG4gIHR5cGUgQW55V2ViU29ja2V0Q29ubmVjdGlvbixcbiAgV2ViU29ja2V0UnVudGltZSxcbiAgdHlwZSBXZWJTb2NrZXRDb25uZWN0aW9uLFxufSBmcm9tIFwiLi4vc3RyZWFtL3dzXCI7XG5pbXBvcnQge1xuICB0eXBlIFRlbGVtZXRyeUNvbnRleHRQcm92aWRlcixcbiAgdHlwZSBXZWJTb2NrZXRUZWxlbWV0cnlDb25uZWN0aW9uQ29udGV4dCxcbn0gZnJvbSBcIi4uL3N0cmVhbS93cy10ZWxlbWV0cnlcIjtcbmltcG9ydCB7IHR5cGUgTG9hZGVkTW9kZWxzIH0gZnJvbSBcIi4uL3N5bmNlci9tb2R1bGUtbG9hZGVyXCI7XG5pbXBvcnQgeyB0eXBlIFN5bmNlciB9IGZyb20gXCIuLi9zeW5jZXIvc3luY2VyXCI7XG5pbXBvcnQgeyB0eXBlIFdvcmtmbG93TWFuYWdlciB9IGZyb20gXCIuLi90YXNrcy93b3JrZmxvdy1tYW5hZ2VyXCI7XG5pbXBvcnQgeyB0eXBlIERldlZpdGVzdE1hbmFnZXIgfSBmcm9tIFwiLi4vdGVzdGluZy9kZXYtdml0ZXN0LW1hbmFnZXJcIjtcbmltcG9ydCB7IHR5cGUgU29uYW11RmFzdGlmeUNvbmZpZyB9IGZyb20gXCIuLi90eXBlcy90eXBlc1wiO1xuaW1wb3J0IHsgY2VudGVyVGV4dCB9IGZyb20gXCIuLi91dGlscy9jb25zb2xlLXV0aWxcIjtcbmltcG9ydCB7IGlzRGFlbW9uU2VydmVyIH0gZnJvbSBcIi4uL3V0aWxzL2NvbnRyb2xsZXJcIjtcbmltcG9ydCB7IGV4aXN0cywgZmlsZUV4aXN0cyB9IGZyb20gXCIuLi91dGlscy9mcy11dGlsc1wiO1xuaW1wb3J0IHsgdHlwZSBBYnNvbHV0ZVBhdGggfSBmcm9tIFwiLi4vdXRpbHMvcGF0aC11dGlsc1wiO1xuaW1wb3J0IHtcbiAgaXNCaWdJbnRWYWx1ZSxcbiAgaXNGdW5jdGlvblZhbHVlLFxuICBpc051bWJlclZhbHVlLFxuICBpc09iamVjdFZhbHVlLFxuICBpc1N0cmluZ1ZhbHVlLFxuICBpc1N5bWJvbFZhbHVlLFxufSBmcm9tIFwiLi4vdXRpbHMvcnVudGltZS12YWx1ZVwiO1xuaW1wb3J0IHsgY29udmVydEZhc3RpZnlIZWFkZXJzVG9TdGFuZGFyZCwgbWVyZ2UgfSBmcm9tIFwiLi4vdXRpbHMvdXRpbHNcIjtcbmltcG9ydCB7XG4gIG5vcm1hbGl6ZVpvZENvbXBpbGVyUG9saWN5LFxuICB0eXBlIFNvbmFtdUNvbmZpZyxcbiAgdHlwZSBTb25hbXVTZXJ2ZXJPcHRpb25zLFxuICB0eXBlIFNvbmFtdVRhc2tPcHRpb25zLFxufSBmcm9tIFwiLi9jb25maWdcIjtcbmltcG9ydCB7IHR5cGUgQ29udGV4dCwgdHlwZSBSdW50aW1lQ29udGV4dCwgdHlwZSBXZWJTb2NrZXRDb250ZXh0IH0gZnJvbSBcIi4vY29udGV4dFwiO1xuaW1wb3J0IHsgdHlwZSBFeHRlbmRlZEFwaSB9IGZyb20gXCIuL2RlY29yYXRvcnNcIjtcbmltcG9ydCB7XG4gIGFzc2VydEh0dHBWYWxpZGF0b3JSZWdpc3RyeSxcbiAgY3JlYXRlSHR0cFZhbGlkYXRvcixcbiAgZ2V0SHR0cFZhbGlkYXRvclJvdXRlS2V5LFxuICB0eXBlIEh0dHBWYWxpZGF0b3IsXG4gIHR5cGUgSHR0cFZhbGlkYXRvclJlZ2lzdHJ5LFxufSBmcm9tIFwiLi9odHRwLXZhbGlkYXRvclwiO1xuaW1wb3J0IHsgZ2V0U2VjcmV0cyB9IGZyb20gXCIuL3NlY3JldFwiO1xuaW1wb3J0IHsgdHlwZSBTb25hbXVTZWNyZXRzIH0gZnJvbSBcIi4vc2VjcmV0XCI7XG5pbXBvcnQge1xuICBjcmVhdGVXZWJTb2NrZXRSZXBseVN0dWIsXG4gIHJlc29sdmVXZWJTb2NrZXRDbG9zZURlc2NyaXB0b3IsXG4gIHJlc29sdmVXZWJTb2NrZXRQbHVnaW5PcHRpb25zLFxuICByZXNvbHZlSW50ZWdyYXRlZFZpdGVIbXJPcHRpb25zLFxufSBmcm9tIFwiLi93ZWJzb2NrZXQtaGVscGVyc1wiO1xuXG5leHBvcnQge1xuICBjcmVhdGVXZWJTb2NrZXRSZXBseVN0dWIsXG4gIHJlc29sdmVXZWJTb2NrZXRDbG9zZURlc2NyaXB0b3IsXG4gIHJlc29sdmVXZWJTb2NrZXRQbHVnaW5PcHRpb25zLFxufSBmcm9tIFwiLi93ZWJzb2NrZXQtaGVscGVyc1wiO1xuXG5pbnRlcmZhY2UgVXBsb2FkZWRSZXF1ZXN0RmlsZXMge1xuICBidWZmZXJlZEZpbGVzOiBCdWZmZXJlZEZpbGVbXTtcbiAgdXBsb2FkZWRGaWxlczogVXBsb2FkZWRGaWxlW107XG59XG5cbnR5cGUgQXBpQXJndW1lbnQgPVxuICB8IHN0cmluZ1xuICB8IG51bWJlclxuICB8IGJvb2xlYW5cbiAgfCBiaWdpbnRcbiAgfCBzeW1ib2xcbiAgfCBDYWxsYWJsZUZ1bmN0aW9uXG4gIHwgb2JqZWN0XG4gIHwgbnVsbFxuICB8IHVuZGVmaW5lZDtcbnR5cGUgQXBpTWV0aG9kUmVzdWx0ID0gQXBpQXJndW1lbnQgfCB2b2lkO1xuXG5mdW5jdGlvbiB0b0FwaUFyZ3VtZW50PFZhbHVlPih2YWx1ZTogVmFsdWUpOiBBcGlBcmd1bWVudCB7XG4gIGlmICh2YWx1ZSA9PT0gbnVsbCkgcmV0dXJuIG51bGw7XG4gIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSByZXR1cm4gdW5kZWZpbmVkO1xuICBpZiAodmFsdWUgPT09IHRydWUpIHJldHVybiB0cnVlO1xuICBpZiAodmFsdWUgPT09IGZhbHNlKSByZXR1cm4gZmFsc2U7XG4gIGlmIChpc1N0cmluZ1ZhbHVlKHZhbHVlKSkgcmV0dXJuIHZhbHVlO1xuICBpZiAoaXNOdW1iZXJWYWx1ZSh2YWx1ZSkpIHJldHVybiB2YWx1ZTtcbiAgaWYgKGlzQmlnSW50VmFsdWUodmFsdWUpKSByZXR1cm4gdmFsdWU7XG4gIGlmIChpc1N5bWJvbFZhbHVlKHZhbHVlKSkgcmV0dXJuIHZhbHVlO1xuICBpZiAoaXNGdW5jdGlvblZhbHVlKHZhbHVlKSkgcmV0dXJuIHZhbHVlO1xuICBpZiAoaXNPYmplY3RWYWx1ZSh2YWx1ZSkpIHtcbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cbiAgdGhyb3cgbmV3IEVycm9yKFwi7KeA7JuQ7ZWY7KeAIOyViuuKlCBBUEkg7J247IiYIO2DgOyeheyeheuLiOuLpC5cIik7XG59XG5cbmZ1bmN0aW9uIHRvQXBpQXJndW1lbnRNYXA8VmFsdWUgZXh0ZW5kcyBvYmplY3Q+KHZhbHVlOiBWYWx1ZSk6IE1hcDxzdHJpbmcsIEFwaUFyZ3VtZW50PiB7XG4gIHJldHVybiBuZXcgTWFwKE9iamVjdC5lbnRyaWVzKHZhbHVlKS5tYXAoKFtrZXksIGl0ZW1dKSA9PiBba2V5LCB0b0FwaUFyZ3VtZW50KGl0ZW0pXSkpO1xufVxuXG5mdW5jdGlvbiBjcmVhdGVVbmF2YWlsYWJsZVNTRTxUIGV4dGVuZHMgWm9kT2JqZWN0PihfZXZlbnRzOiBUKTogbmV2ZXIge1xuICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgXCJjcmVhdGVTU0UgaXMgbm90IGF2YWlsYWJsZSBpbiB3ZWJzb2NrZXQgY29udGV4dC4gRGVmaW5lIHdlYnNvY2tldENvbnRleHRQcm92aWRlciBpZiB5b3VyIGNvbnRleHQgc2V0dXAgZGVwZW5kcyBvbiBTU0UgaGVscGVycy5cIixcbiAgKTtcbn1cblxuZnVuY3Rpb24gcHJpbnREaW1TdW1tYXJ5KG1lc3NhZ2U6IHN0cmluZyk6IHZvaWQge1xuICBjb25zb2xlLmxvZyhjaGFsay5kaW0oYOKckyAke21lc3NhZ2V9YCkpO1xufVxuXG5mdW5jdGlvbiBwcmludEdyZWVuU3VtbWFyeShtZXNzYWdlOiBzdHJpbmcpOiB2b2lkIHtcbiAgY29uc29sZS5sb2coY2hhbGsuZ3JlZW4oYOKckyAke21lc3NhZ2V9YCkpO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFNvbmFtdVRlc3RpbmdTbmFwc2hvdCB7XG4gIGFwaVJvb3RQYXRoOiBBYnNvbHV0ZVBhdGggfCBudWxsO1xuICBjb25maWc6IFNvbmFtdUNvbmZpZyB8IG51bGw7XG4gIHN5bmNlcjogU3luY2VyIHwgbnVsbDtcbiAgaHR0cFZhbGlkYXRvcnM6IFdlYWtNYXA8RXh0ZW5kZWRBcGksIEh0dHBWYWxpZGF0b3I+O1xuICBwZW5kaW5nSHR0cFZhbGlkYXRvcnM6IFdlYWtNYXA8RXh0ZW5kZWRBcGksIFByb21pc2U8SHR0cFZhbGlkYXRvcj4+O1xuICBhb3RIdHRwVmFsaWRhdG9yUmVnaXN0cnk6IEh0dHBWYWxpZGF0b3JSZWdpc3RyeSB8IHVuZGVmaW5lZDtcbiAgcHJlcGFyZWRBcGlzOiByZWFkb25seSBFeHRlbmRlZEFwaVtdO1xuICBwcmVwYXJlZE1vZGVsczogTG9hZGVkTW9kZWxzO1xuICB3ZWJzb2NrZXRSdW50aW1lOiBXZWJTb2NrZXRSdW50aW1lIHwgbnVsbDtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBTb25hbXVIdHRwVmFsaWRhdG9yRGVwZW5kZW5jaWVzIHtcbiAgY3JlYXRlVmFsaWRhdG9yOiB0eXBlb2YgY3JlYXRlSHR0cFZhbGlkYXRvcjtcbiAgYXNzZXJ0UmVnaXN0cnk6IHR5cGVvZiBhc3NlcnRIdHRwVmFsaWRhdG9yUmVnaXN0cnk7XG59XG5cbmV4cG9ydCBjb25zdCBkZWZhdWx0U29uYW11SHR0cFZhbGlkYXRvckRlcGVuZGVuY2llczogU29uYW11SHR0cFZhbGlkYXRvckRlcGVuZGVuY2llcyA9IHtcbiAgY3JlYXRlVmFsaWRhdG9yOiBjcmVhdGVIdHRwVmFsaWRhdG9yLFxuICBhc3NlcnRSZWdpc3RyeTogYXNzZXJ0SHR0cFZhbGlkYXRvclJlZ2lzdHJ5LFxufTtcblxuY2xhc3MgU29uYW11Q2xhc3Mge1xuICBwdWJsaWMgaXNJbml0aWFsaXplZDogYm9vbGVhbiA9IGZhbHNlO1xuICBwdWJsaWMgZm9yVGVzdGluZzogYm9vbGVhbiA9IGZhbHNlO1xuICBwdWJsaWMgYXN5bmNMb2NhbFN0b3JhZ2U6IEFzeW5jTG9jYWxTdG9yYWdlPHtcbiAgICBjb250ZXh0OiBSdW50aW1lQ29udGV4dDtcbiAgfT4gPSBuZXcgQXN5bmNMb2NhbFN0b3JhZ2UoKTtcbiAgcHJpdmF0ZSBodHRwVmFsaWRhdG9yczogV2Vha01hcDxFeHRlbmRlZEFwaSwgSHR0cFZhbGlkYXRvcj4gPSBuZXcgV2Vha01hcCgpO1xuICBwcml2YXRlIHBlbmRpbmdIdHRwVmFsaWRhdG9yczogV2Vha01hcDxFeHRlbmRlZEFwaSwgUHJvbWlzZTxIdHRwVmFsaWRhdG9yPj4gPSBuZXcgV2Vha01hcCgpO1xuICBwcml2YXRlIGFvdEh0dHBWYWxpZGF0b3JSZWdpc3RyeTogSHR0cFZhbGlkYXRvclJlZ2lzdHJ5IHwgdW5kZWZpbmVkO1xuICBwcml2YXRlIHByZXBhcmVkQXBpczogcmVhZG9ubHkgRXh0ZW5kZWRBcGlbXSA9IFtdO1xuICBwcml2YXRlIHByZXBhcmVkTW9kZWxzOiBMb2FkZWRNb2RlbHMgPSB7fTtcblxuICBwdWJsaWMgZ2V0Q29udGV4dDxUIGV4dGVuZHMgUnVudGltZUNvbnRleHQgPSBDb250ZXh0PigpOiBUIHtcbiAgICBjb25zdCBzdG9yZSA9IHRoaXMuYXN5bmNMb2NhbFN0b3JhZ2UuZ2V0U3RvcmUoKTtcbiAgICBpZiAoc3RvcmU/LmNvbnRleHQpIHtcbiAgICAgIHJldHVybiAvKiBTQUZFVFk6IEFQSSDrjbDsvZTroIjsnbTthLDsmYAgWm9kIOqygOymneq4sCDrk7HroZ0g6rOE7JW97J20IOydtCDqsJLsnZgg7YOA7J6F7J2EIOuztOyepe2VnOuLpC4gKi8gc3RvcmUuY29udGV4dCBhcyBUO1xuICAgIH1cblxuICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gXCJ0ZXN0XCIpIHtcbiAgICAgIC8vIO2FjOyKpO2MhSDtmZjqsr3sl5DshJwg7Luo7YWN7Iqk7Yq46rCAIOyjvOyeheuQmOyngCDslYrsnYAg6rK97JqwIOu5iCDsu6jthY3siqTtirgg66as7YS0XG4gICAgICBjb25zdCBtb2NrQ29udGV4dCA9IHtcbiAgICAgICAgdHJhbnNwb3J0OiBcImh0dHBcIixcbiAgICAgICAgcmVxdWVzdDogbnVsbCxcbiAgICAgICAgcmVwbHk6IG51bGwsXG4gICAgICAgIGhlYWRlcnM6IHt9LFxuICAgICAgICBjcmVhdGVTU0U6IChzY2hlbWE6IFpvZE9iamVjdCkgPT4gY3JlYXRlTW9ja1NTRUZhY3Rvcnkoc2NoZW1hKSxcbiAgICAgICAgbG9jYWxlOiBcIlwiLFxuICAgICAgICB1c2VyOiBudWxsLFxuICAgICAgICBzZXNzaW9uOiBudWxsLFxuICAgICAgICBuYWl0ZVN0b3JlOiBuZXcgTWFwPHN0cmluZywgYW55PigpLFxuICAgICAgfTtcbiAgICAgIC8vIFNBRkVUWTog7YWM7Iqk7Yq4IOq4sOuzuCDsu6jthY3siqTtirjripQgSFRUUCBDb250ZXh07J2066mwIOq4sOuzuCDsoJzrhKTrpq3qs7wg7J287LmY7ZWc64ukLlxuICAgICAgcmV0dXJuIC8qIFNBRkVUWTog7YWM7Iqk7Yq4IOq4sOuzuCDsu6jthY3siqTtirjripQg7JqU7LKtIOuylOychOqwgCDsl4bripQgSFRUUCDsu6jthY3siqTtirgg64yA7LK06rCS7J6F64uI64ukLiAqLyBtb2NrQ29udGV4dCBhcyBUICZcbiAgICAgICAgdHlwZW9mIG1vY2tDb250ZXh0O1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJTb25hbXUgY2Fubm90IGZpbmQgY29udGV4dFwiKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGFwaVJvb3RQYXRoVmFsdWU6IEFic29sdXRlUGF0aCB8IG51bGwgPSBudWxsO1xuICBzZXQgYXBpUm9vdFBhdGgoYXBpUm9vdFBhdGg6IEFic29sdXRlUGF0aCkge1xuICAgIHRoaXMuYXBpUm9vdFBhdGhWYWx1ZSA9IGFwaVJvb3RQYXRoO1xuICB9XG4gIGdldCBhcGlSb290UGF0aCgpOiBBYnNvbHV0ZVBhdGgge1xuICAgIGlmICh0aGlzLmFwaVJvb3RQYXRoVmFsdWUgPT09IG51bGwpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIlNvbmFtdSBoYXMgbm90IGJlZW4gaW5pdGlhbGl6ZWRcIik7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmFwaVJvb3RQYXRoVmFsdWU7XG4gIH1cbiAgZ2V0IGFwcFJvb3RQYXRoKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuYXBpUm9vdFBhdGguc3BsaXQocGF0aC5zZXApLnNsaWNlKDAsIC0xKS5qb2luKHBhdGguc2VwKTtcbiAgfVxuXG4gIHByaXZhdGUgZGJDb25maWdWYWx1ZTogU29uYW11REJDb25maWcgfCBudWxsID0gbnVsbDtcbiAgc2V0IGRiQ29uZmlnKGRiQ29uZmlnOiBTb25hbXVEQkNvbmZpZykge1xuICAgIHRoaXMuZGJDb25maWdWYWx1ZSA9IGRiQ29uZmlnO1xuICB9XG4gIGdldCBkYkNvbmZpZygpOiBTb25hbXVEQkNvbmZpZyB7XG4gICAgaWYgKHRoaXMuZGJDb25maWdWYWx1ZSA9PT0gbnVsbCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiU29uYW11IGhhcyBub3QgYmVlbiBpbml0aWFsaXplZFwiKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuZGJDb25maWdWYWx1ZTtcbiAgfVxuXG4gIHByaXZhdGUgc3luY2VyVmFsdWU6IFN5bmNlciB8IG51bGwgPSBudWxsO1xuICBzZXQgc3luY2VyKHN5bmNlcjogU3luY2VyKSB7XG4gICAgdGhpcy5zeW5jZXJWYWx1ZSA9IHN5bmNlcjtcbiAgfVxuICBnZXQgc3luY2VyKCk6IFN5bmNlciB7XG4gICAgaWYgKHRoaXMuc3luY2VyVmFsdWUgPT09IG51bGwpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIlNvbmFtdSBoYXMgbm90IGJlZW4gaW5pdGlhbGl6ZWRcIik7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLnN5bmNlclZhbHVlO1xuICB9XG5cbiAgcHJpdmF0ZSBjb25maWdWYWx1ZTogU29uYW11Q29uZmlnIHwgbnVsbCA9IG51bGw7XG4gIHNldCBjb25maWcoY29uZmlnOiBTb25hbXVDb25maWcpIHtcbiAgICB0aGlzLmNvbmZpZ1ZhbHVlID0gY29uZmlnO1xuICB9XG4gIGdldCBjb25maWcoKTogU29uYW11Q29uZmlnIHtcbiAgICBpZiAodGhpcy5jb25maWdWYWx1ZSA9PT0gbnVsbCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiU29uYW11IGhhcyBub3QgYmVlbiBpbml0aWFsaXplZFwiKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuY29uZmlnVmFsdWU7XG4gIH1cblxuICBwdWJsaWMgcmVhZG9ubHkgc2VjcmV0czogU29uYW11U2VjcmV0cyA9IGdldFNlY3JldHMoKTtcblxuICBwcml2YXRlIHN0b3JhZ2VWYWx1ZTogU3RvcmFnZU1hbmFnZXIgfCBudWxsID0gbnVsbDtcbiAgLyoqXG4gICAqIFN0b3JhZ2VNYW5hZ2VyIOyduOyKpO2EtOyKpFxuICAgKi9cbiAgZ2V0IHN0b3JhZ2UoKTogU3RvcmFnZU1hbmFnZXIge1xuICAgIGlmICghdGhpcy5zdG9yYWdlVmFsdWUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIlN0b3JhZ2UgaGFzIG5vdCBiZWVuIGluaXRpYWxpemVkLiBDaGVjayBzdG9yYWdlIGNvbmZpZy5cIik7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLnN0b3JhZ2VWYWx1ZTtcbiAgfVxuXG4gIHByaXZhdGUgY2FjaGVWYWx1ZTogQ2FjaGVNYW5hZ2VyIHwgbnVsbCA9IG51bGw7XG4gIC8qKlxuICAgKiBDYWNoZU1hbmFnZXIg7J247Iqk7YS07IqkIChCZW50b0NhY2hlKVxuICAgKi9cbiAgZ2V0IGNhY2hlKCk6IENhY2hlTWFuYWdlciB7XG4gICAgaWYgKCF0aGlzLmNhY2hlVmFsdWUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIkNhY2hlIGhhcyBub3QgYmVlbiBpbml0aWFsaXplZC4gQ2hlY2sgY2FjaGUgY29uZmlnIGluIHNvbmFtdS5jb25maWcudHMuXCIpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5jYWNoZVZhbHVlO1xuICB9XG5cbiAgcHJpdmF0ZSB3b3JrZmxvd3NWYWx1ZTogV29ya2Zsb3dNYW5hZ2VyIHwgbnVsbCA9IG51bGw7XG4gIGdldCB3b3JrZmxvd3MoKTogV29ya2Zsb3dNYW5hZ2VyIHtcbiAgICBpZiAodGhpcy53b3JrZmxvd3NWYWx1ZSA9PT0gbnVsbCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiU29uYW11IGhhcyBub3QgYmVlbiBpbml0aWFsaXplZFwiKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy53b3JrZmxvd3NWYWx1ZTtcbiAgfVxuXG4gIHByaXZhdGUgYXV0aFZhbHVlOiBBdXRoPEJldHRlckF1dGhPcHRpb25zPiB8IG51bGwgPSBudWxsO1xuICBnZXQgYXV0aCgpOiBBdXRoPEJldHRlckF1dGhPcHRpb25zPiB7XG4gICAgaWYgKCF0aGlzLmF1dGhWYWx1ZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQXV0aCBoYXMgbm90IGJlZW4gaW5pdGlhbGl6ZWQuIENoZWNrIGF1dGggY29uZmlnIGluIHNvbmFtdS5jb25maWcudHMuXCIpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5hdXRoVmFsdWU7XG4gIH1cblxuICBwcml2YXRlIGRldlZpdGVzdE1hbmFnZXJWYWx1ZTogRGV2Vml0ZXN0TWFuYWdlciB8IG51bGwgPSBudWxsO1xuICBnZXQgZGV2Vml0ZXN0TWFuYWdlcigpOiBEZXZWaXRlc3RNYW5hZ2VyIHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMuZGV2Vml0ZXN0TWFuYWdlclZhbHVlO1xuICB9XG4gIHNldCBkZXZWaXRlc3RNYW5hZ2VyKG1hbmFnZXI6IERldlZpdGVzdE1hbmFnZXIgfCBudWxsKSB7XG4gICAgdGhpcy5kZXZWaXRlc3RNYW5hZ2VyVmFsdWUgPSBtYW5hZ2VyO1xuICB9XG5cbiAgLy8gU29uYW116rCAIHJ1bnRpbWXsnYQg7KeB7KCRIOyGjOycoO2VtCByZWdpc3RyeS9jb25uZWN0aW9uIGxpZmVjeWNsZeydhCDslaDtlIzrpqzsvIDsnbTshZgg7IiY66qF7KO86riw7JmAIOuPmeq4sO2ZlO2VqFxuICBwcml2YXRlIHdlYnNvY2tldFJ1bnRpbWVWYWx1ZTogV2ViU29ja2V0UnVudGltZSB8IG51bGwgPSBudWxsO1xuICAvLyDqsJnsnYAgRmFzdGlmeSDsnbjsiqTthLTsiqTsl5AgQGZhc3RpZnkvd2Vic29ja2V07J2EIOykkeuztSDrk7HroZ3tlZjripQg6rKD7J2EIFdlYWtTZXTsnLzroZwg7LCo64uo7ZWoXG4gIHByaXZhdGUgcmVhZG9ubHkgd2Vic29ja2V0UGx1Z2luU2VydmVycyA9IG5ldyBXZWFrU2V0PFxuICAgIEZhc3RpZnlJbnN0YW5jZTxTZXJ2ZXIsIEluY29taW5nTWVzc2FnZSwgU2VydmVyUmVzcG9uc2U+XG4gID4oKTtcbiAgZ2V0IHdlYnNvY2tldFJ1bnRpbWUoKTogV2ViU29ja2V0UnVudGltZSB7XG4gICAgaWYgKCF0aGlzLndlYnNvY2tldFJ1bnRpbWVWYWx1ZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiV2ViU29ja2V0IHJ1bnRpbWUgaGFzIG5vdCBiZWVuIGluaXRpYWxpemVkLlwiKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMud2Vic29ja2V0UnVudGltZVZhbHVlO1xuICB9XG4gIHNldCB3ZWJzb2NrZXRSdW50aW1lKHJ1bnRpbWU6IFdlYlNvY2tldFJ1bnRpbWUgfCBudWxsKSB7XG4gICAgdGhpcy53ZWJzb2NrZXRSdW50aW1lVmFsdWUgPSBydW50aW1lO1xuICB9XG5cbiAgY2FwdHVyZVRlc3RpbmdTbmFwc2hvdCgpOiBTb25hbXVUZXN0aW5nU25hcHNob3Qge1xuICAgIHJldHVybiB7XG4gICAgICBhcGlSb290UGF0aDogdGhpcy5hcGlSb290UGF0aFZhbHVlLFxuICAgICAgY29uZmlnOiB0aGlzLmNvbmZpZ1ZhbHVlLFxuICAgICAgc3luY2VyOiB0aGlzLnN5bmNlclZhbHVlLFxuICAgICAgaHR0cFZhbGlkYXRvcnM6IHRoaXMuaHR0cFZhbGlkYXRvcnMsXG4gICAgICBwZW5kaW5nSHR0cFZhbGlkYXRvcnM6IHRoaXMucGVuZGluZ0h0dHBWYWxpZGF0b3JzLFxuICAgICAgYW90SHR0cFZhbGlkYXRvclJlZ2lzdHJ5OiB0aGlzLmFvdEh0dHBWYWxpZGF0b3JSZWdpc3RyeSxcbiAgICAgIHByZXBhcmVkQXBpczogdGhpcy5wcmVwYXJlZEFwaXMsXG4gICAgICBwcmVwYXJlZE1vZGVsczogdGhpcy5wcmVwYXJlZE1vZGVscyxcbiAgICAgIHdlYnNvY2tldFJ1bnRpbWU6IHRoaXMud2Vic29ja2V0UnVudGltZVZhbHVlLFxuICAgIH07XG4gIH1cblxuICByZXN0b3JlVGVzdGluZ1NuYXBzaG90KHNuYXBzaG90OiBTb25hbXVUZXN0aW5nU25hcHNob3QpOiB2b2lkIHtcbiAgICB0aGlzLmFwaVJvb3RQYXRoVmFsdWUgPSBzbmFwc2hvdC5hcGlSb290UGF0aDtcbiAgICB0aGlzLmNvbmZpZ1ZhbHVlID0gc25hcHNob3QuY29uZmlnO1xuICAgIHRoaXMuc3luY2VyVmFsdWUgPSBzbmFwc2hvdC5zeW5jZXI7XG4gICAgdGhpcy5odHRwVmFsaWRhdG9ycyA9IHNuYXBzaG90Lmh0dHBWYWxpZGF0b3JzO1xuICAgIHRoaXMucGVuZGluZ0h0dHBWYWxpZGF0b3JzID0gc25hcHNob3QucGVuZGluZ0h0dHBWYWxpZGF0b3JzO1xuICAgIHRoaXMuYW90SHR0cFZhbGlkYXRvclJlZ2lzdHJ5ID0gc25hcHNob3QuYW90SHR0cFZhbGlkYXRvclJlZ2lzdHJ5O1xuICAgIHRoaXMucHJlcGFyZWRBcGlzID0gc25hcHNob3QucHJlcGFyZWRBcGlzO1xuICAgIHRoaXMucHJlcGFyZWRNb2RlbHMgPSBzbmFwc2hvdC5wcmVwYXJlZE1vZGVscztcbiAgICB0aGlzLndlYnNvY2tldFJ1bnRpbWVWYWx1ZSA9IHNuYXBzaG90LndlYnNvY2tldFJ1bnRpbWU7XG4gIH1cblxuICAvLyBITVIg7LKY66asOiDtjIzsnbwg7Iuc7Iqk7YWcIOqwkOyLnCArIEhNUi9zeW5jIOyCrOydtO2BtCDsi6TtlonsnYAgd2F0Y2hlciDrqqjrk4jroZwg7JyE7J6E7ZWp64uI64ukLlxuICBwdWJsaWMgd2F0Y2hlcjogRlNXYXRjaGVyIHwgbnVsbCA9IG51bGw7XG5cbiAgcHVibGljIHNlcnZlcjogRmFzdGlmeUluc3RhbmNlIHwgbnVsbCA9IG51bGw7XG5cbiAgYXN5bmMgaW5pdEZvclRlc3RpbmcoKSB7XG4gICAgYXdhaXQgdGhpcy5pbml0KHRydWUsIGZhbHNlLCB1bmRlZmluZWQsIHRydWUpO1xuICB9XG5cbiAgYXN5bmMgaW5pdChcbiAgICBkb1NpbGVudDogYm9vbGVhbiA9IGZhbHNlLFxuICAgIGVuYWJsZVN5bmM6IGJvb2xlYW4gPSB0cnVlLFxuICAgIGFwaVJvb3RQYXRoPzogQWJzb2x1dGVQYXRoLFxuICAgIGZvclRlc3Rpbmc6IGJvb2xlYW4gPSBmYWxzZSxcbiAgKSB7XG4gICAgdGhpcy5mb3JUZXN0aW5nID0gZm9yVGVzdGluZztcblxuICAgIGlmICh0aGlzLmlzSW5pdGlhbGl6ZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBpbml0U3RhcnQgPSBwZXJmb3JtYW5jZS5ub3coKTtcblxuICAgIC8vIEFQSSDro6jtirgg7Yyo7IqkXG4gICAgY29uc3QgeyBmaW5kQXBpUm9vdFBhdGggfSA9IGF3YWl0IGltcG9ydChcIi4uL3V0aWxzL3V0aWxzXCIpO1xuICAgIHRoaXMuYXBpUm9vdFBhdGggPSBhcGlSb290UGF0aCA/PyBmaW5kQXBpUm9vdFBhdGgoKTtcbiAgICBjb25zdCBiYXNlRW52QmVmb3JlQ29uZmlnTG9hZCA9IHsgLi4ucHJvY2Vzcy5lbnYgfTtcblxuICAgIC8vIOyEpOygleydhCDroZzrlKntlZjripQg6rKD67aA7YSwIOyLnOyekVxuICAgIGNvbnN0IGNvbmZpZ1N0YXJ0ID0gcGVyZm9ybWFuY2Uubm93KCk7XG4gICAgY29uc3QgeyBsb2FkQ29uZmlnIH0gPSBhd2FpdCBpbXBvcnQoXCIuL2NvbmZpZ1wiKTtcbiAgICB0aGlzLmNvbmZpZyA9IGF3YWl0IGxvYWRDb25maWcodGhpcy5hcGlSb290UGF0aCk7XG4gICAgY29uc3QgY29uZmlnVGltZSA9IHBlcmZvcm1hbmNlLm5vdygpIC0gY29uZmlnU3RhcnQ7XG4gICAgc2V0U0RDb25maWcodGhpcy5jb25maWcuaTE4bik7XG4gICAgLy8gc29uYW11LmNvbmZpZy50cyDquLDrs7jqsJIg7ISk7KCVXG4gICAgdGhpcy5jb25maWcuZGF0YWJhc2UuZGF0YWJhc2UgPSB0aGlzLmNvbmZpZy5kYXRhYmFzZS5kYXRhYmFzZSA/PyBcInBnXCI7XG4gICAgdGhpcy5jb25maWcuZGF0YWJhc2UuZGVmYXVsdE9wdGlvbnMgPSB0aGlzLmNvbmZpZy5kYXRhYmFzZS5kZWZhdWx0T3B0aW9ucyA/PyB7fTtcbiAgICB0aGlzLmNvbmZpZy5kYXRhYmFzZS5kZWZhdWx0T3B0aW9ucy5jbGllbnQgPSB0aGlzLmNvbmZpZy5kYXRhYmFzZS5kYXRhYmFzZSA/PyBcInBnXCI7XG5cbiAgICAvLyDroZzquYUg7ISk7KCVXG4gICAgY29uc3QgeyBjb25maWd1cmVMb2dUYXBlIH0gPSBhd2FpdCBpbXBvcnQoXCIuLi9sb2dnZXIvY29uZmlndXJlXCIpO1xuICAgIGlmICh0aGlzLmNvbmZpZy5sb2dnaW5nICE9PSBmYWxzZSkge1xuICAgICAgYXdhaXQgY29uZmlndXJlTG9nVGFwZSh7XG4gICAgICAgIC4uLnRoaXMuY29uZmlnLmxvZ2dpbmcsXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyBEQiDroZzrk5xcbiAgICBjb25zdCB7IERCOiBSdW50aW1lREIgfSA9IGF3YWl0IGltcG9ydChcIi4uL2RhdGFiYXNlL2RiXCIpO1xuICAgIGNvbnN0IHsgaXNMb2NhbDogaXNMb2NhbEVudmlyb25tZW50IH0gPSBhd2FpdCBpbXBvcnQoXCIuLi91dGlscy9jb250cm9sbGVyXCIpO1xuICAgIGNvbnN0IGVudmlyb25tZW50U25hcHNob3RzID0gaXNMb2NhbEVudmlyb25tZW50KClcbiAgICAgID8gcmVhZEFsbEVudmlyb25tZW50U25hcHNob3RzKHRoaXMuYXBpUm9vdFBhdGgsIGJhc2VFbnZCZWZvcmVDb25maWdMb2FkKVxuICAgICAgOiB1bmRlZmluZWQ7XG4gICAgdGhpcy5kYkNvbmZpZyA9IFJ1bnRpbWVEQi5nZW5lcmF0ZURCQ29uZmlnKFxuICAgICAgdGhpcy5jb25maWcuZGF0YWJhc2UsXG4gICAgICB0aGlzLmNvbmZpZy5wcm9qZWN0TmFtZSxcbiAgICAgIGVudmlyb25tZW50U25hcHNob3RzLFxuICAgICk7XG4gICAgUnVudGltZURCLnNldENvbmZpZyh0aGlzLmRiQ29uZmlnKTtcblxuICAgIC8vIEVudGl0eSDroZzrk5xcbiAgICAvLyDthYzsiqTtirjsl5DshJzrj4QgRW50aXR5IOygleuztOuKlCDtlYTsmpTtlanri4jri6QuXG4gICAgLy8gdXBzZXJ06rCAIOygnOuMgOuhnCDsnpHrj5ntlZjroKTrqbQgZW50aXR57J2YIHVuaXF1ZSBpbmRleCDsoJXrs7TqsIAg7ZWE7JqU7ZWY6riwIOuVjOusuOyeheuLiOuLpC5cbiAgICBjb25zdCB7IEVudGl0eU1hbmFnZXIgfSA9IGF3YWl0IGltcG9ydChcIi4uL2VudGl0eS9lbnRpdHktbWFuYWdlclwiKTtcbiAgICBhd2FpdCBFbnRpdHlNYW5hZ2VyLmF1dG9sb2FkKGRvU2lsZW50KTtcblxuICAgIC8vIENhY2hlIOy0iOq4sO2ZlFxuICAgIGF3YWl0IHRoaXMuaW5pdGlhbGl6ZUNhY2hlKHRoaXMuY29uZmlnLnNlcnZlci5jYWNoZSwgZm9yVGVzdGluZyk7XG5cbiAgICAvLyBCZXR0ZXJBdXRoIOy0iOq4sO2ZlFxuICAgIGNvbnN0IGF1dGhDb25maWcgPSB0aGlzLmNvbmZpZy5zZXJ2ZXIuYXV0aDtcbiAgICBpZiAoYXV0aENvbmZpZykge1xuICAgICAgLy8g7IKs7Jqp7J6QIOyEpOygleqzvCDquLDrs7jqsJLsnYQgbWVyZ2VcbiAgICAgIGNvbnN0IG1lcmdlZEZpZWxkTWFwcGluZ3MgPSBtZXJnZShCQVNFX0ZJRUxEX01BUFBJTkdTLCBhdXRoQ29uZmlnKTtcblxuICAgICAgLy8gYmV0dGVyLWF1dGgg7J247Iqk7YS07IqkIOyDneyEsVxuICAgICAgY29uc3QgeyBiZXR0ZXJBdXRoIH0gPSBhd2FpdCBpbXBvcnQoXCJiZXR0ZXItYXV0aFwiKTtcbiAgICAgIGNvbnN0IHsgc29uYW11S25leEFkYXB0ZXIgfSA9IGF3YWl0IGltcG9ydChcIi4uL2F1dGgva25leC1hZGFwdGVyXCIpO1xuXG4gICAgICBjb25zdCBhdXRoT3B0aW9uczogQmV0dGVyQXV0aE9wdGlvbnMgPSB7XG4gICAgICAgIGRhdGFiYXNlOiBzb25hbXVLbmV4QWRhcHRlcigpLFxuICAgICAgICAuLi5tZXJnZWRGaWVsZE1hcHBpbmdzLFxuICAgICAgfTtcbiAgICAgIHRoaXMuYXV0aFZhbHVlID0gYmV0dGVyQXV0aChhdXRoT3B0aW9ucyk7XG4gICAgfVxuXG4gICAgLy8g7YWM7Iqk7YyF7J24IOqyveyasCDsi7Htgawg7JeG7J20IOykkeuLqFxuICAgIGlmIChmb3JUZXN0aW5nKSB7XG4gICAgICB0aGlzLmlzSW5pdGlhbGl6ZWQgPSB0cnVlO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIFRhc2sg65Ox66GdXG4gICAgYXdhaXQgdGhpcy5pbml0aWFsaXplV29ya2Zsb3dzKHRoaXMuY29uZmlnLnRhc2tzKTtcblxuICAgIC8vIFN5bmNlclxuICAgIGNvbnN0IHsgU3luY2VyIH0gPSBhd2FpdCBpbXBvcnQoXCIuLi9zeW5jZXIvc3luY2VyXCIpO1xuICAgIHRoaXMuc3luY2VyID0gbmV3IFN5bmNlcigpO1xuXG4gICAgLy8gQXV0b2xvYWQ6IE1vZGVscyAvIFR5cGVzIC8gQVBJcyAvIFdvcmtmbG93cyAvIFRlbXBsYXRlcyAvIFNTUiBSb3V0ZXNcbiAgICBhd2FpdCB0aGlzLnN5bmNlci5hdXRvbG9hZFR5cGVzKCk7XG4gICAgYXdhaXQgdGhpcy5zeW5jZXIuYXV0b2xvYWRNb2RlbHMoKTtcbiAgICBhd2FpdCB0aGlzLnN5bmNlci5hdXRvbG9hZEFwaXMoKTtcbiAgICBhd2FpdCB0aGlzLnN5bmNlci5hdXRvbG9hZFdvcmtmbG93cygpO1xuICAgIGNvbnN0IHsgVGVtcGxhdGVNYW5hZ2VyIH0gPSBhd2FpdCBpbXBvcnQoXCIuLi90ZW1wbGF0ZVwiKTtcbiAgICBhd2FpdCBUZW1wbGF0ZU1hbmFnZXIuYXV0b2xvYWQoKTtcbiAgICBhd2FpdCB0aGlzLnN5bmNlci5hdXRvbG9hZFNzclJvdXRlcygpO1xuXG4gICAgY29uc3QgeyBpc0xvY2FsLCBpc1Rlc3QsIGlzSG90UmVsb2FkU2VydmVyIH0gPSBhd2FpdCBpbXBvcnQoXCIuLi91dGlscy9jb250cm9sbGVyXCIpO1xuICAgIGlmIChpc0xvY2FsKCkgJiYgIWlzVGVzdCgpICYmIGlzSG90UmVsb2FkU2VydmVyKCkgJiYgZW5hYmxlU3luYykge1xuICAgICAgYXdhaXQgdGhpcy5zeW5jZXIuc3luYygpO1xuICAgICAgYXdhaXQgdGhpcy5zdGFydFdhdGNoZXIoKTtcbiAgICB9XG5cbiAgICB0aGlzLmlzSW5pdGlhbGl6ZWQgPSB0cnVlO1xuICAgIHRoaXMuaW5pdEVsYXBzZWQgPSBwZXJmb3JtYW5jZS5ub3coKSAtIGluaXRTdGFydDtcbiAgICB0aGlzLmNvbmZpZ0VsYXBzZWQgPSBjb25maWdUaW1lO1xuICB9XG5cbiAgcHJpdmF0ZSBpbml0RWxhcHNlZCA9IDA7XG4gIHByaXZhdGUgY29uZmlnRWxhcHNlZCA9IDA7XG5cbiAgYXN5bmMgY3JlYXRlU2VydmVyKGluaXRPcHRpb25zPzogeyBlbmFibGVTeW5jPzogYm9vbGVhbjsgZG9TaWxlbnQ/OiBib29sZWFuIH0pIHtcbiAgICBpZiAoIXRoaXMuaXNJbml0aWFsaXplZCkge1xuICAgICAgYXdhaXQgdGhpcy5pbml0KGluaXRPcHRpb25zPy5kb1NpbGVudCwgaW5pdE9wdGlvbnM/LmVuYWJsZVN5bmMpO1xuICAgIH1cblxuICAgIGNvbnN0IG9wdGlvbnMgPSB0aGlzLmNvbmZpZy5zZXJ2ZXI7XG4gICAgY29uc3QgeyBkZWZhdWx0OiBmYXN0aWZ5IH0gPSBhd2FpdCBpbXBvcnQoXCJmYXN0aWZ5XCIpO1xuICAgIGNvbnN0IHsgZ2V0TG9nVGFwZUZhc3RpZnlMb2dnZXIgfSA9IGF3YWl0IGltcG9ydChcIkBsb2d0YXBlL2Zhc3RpZnlcIik7XG4gICAgY29uc3Qgc2VydmVyID0gZmFzdGlmeSh7XG4gICAgICAuLi5vcHRpb25zLmZhc3RpZnksXG4gICAgICBsb2dnZXI6XG4gICAgICAgIHRoaXMuY29uZmlnLmxvZ2dpbmcgIT09IGZhbHNlXG4gICAgICAgICAgPyBnZXRMb2dUYXBlRmFzdGlmeUxvZ2dlcih7XG4gICAgICAgICAgICAgIGNhdGVnb3J5OiB0aGlzLmNvbmZpZy5sb2dnaW5nPy5mYXN0aWZ5Q2F0ZWdvcnkgPz8gW1wiZmFzdGlmeVwiXSxcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgOiB1bmRlZmluZWQsXG4gICAgfSk7XG4gICAgdGhpcy5zZXJ2ZXIgPSBzZXJ2ZXI7XG4gICAgdGhpcy53ZWJzb2NrZXRSdW50aW1lID0gbmV3IFdlYlNvY2tldFJ1bnRpbWUob3B0aW9ucy53ZWJzb2NrZXQpO1xuXG4gICAgLy8gU3RvcmFnZSDshKTsoJUg4oaSIFN0b3JhZ2VNYW5hZ2VyIOyDneyEsVxuICAgIGlmIChvcHRpb25zLnN0b3JhZ2UpIHtcbiAgICAgIGNvbnN0IHsgU3RvcmFnZU1hbmFnZXIgfSA9IGF3YWl0IGltcG9ydChcIi4uL3N0b3JhZ2Uvc3RvcmFnZS1tYW5hZ2VyXCIpO1xuICAgICAgdGhpcy5zdG9yYWdlVmFsdWUgPSBuZXcgU3RvcmFnZU1hbmFnZXIob3B0aW9ucy5zdG9yYWdlKTtcbiAgICB9XG5cbiAgICAvLyDtlIzrn6zqt7jsnbgg65Ox66GdXG4gICAgaWYgKG9wdGlvbnMucGx1Z2lucykge1xuICAgICAgYXdhaXQgdGhpcy5yZWdpc3RlclBsdWdpbnMoc2VydmVyLCBvcHRpb25zLnBsdWdpbnMpO1xuICAgIH1cblxuICAgIGlmIChvcHRpb25zLmF1dGgpIHtcbiAgICAgIGF3YWl0IHRoaXMucmVnaXN0ZXJCZXR0ZXJBdXRoKHNlcnZlciwgb3B0aW9ucy5hdXRoKTtcbiAgICB9XG5cbiAgICAvLyBBUEkg65287Jqw7YyFIOyEpOyglVxuICAgIGF3YWl0IHRoaXMud2l0aEZhc3RpZnkoc2VydmVyLCBvcHRpb25zLmFwaUNvbmZpZywge1xuICAgICAgZW5hYmxlU3luYzogaW5pdE9wdGlvbnM/LmVuYWJsZVN5bmMsXG4gICAgICBkb1NpbGVudDogaW5pdE9wdGlvbnM/LmRvU2lsZW50LFxuICAgIH0pO1xuXG4gICAgLy8g7ISc67KEIOyLnOyekVxuICAgIGF3YWl0IHRoaXMuYm9vdChzZXJ2ZXIsIG9wdGlvbnMpO1xuXG4gICAgaWYgKCFpbml0T3B0aW9ucz8uZG9TaWxlbnQpIHtcbiAgICAgIHRoaXMucHJpbnRTdGFydHVwU3VtbWFyeSgpO1xuICAgIH1cblxuICAgIHJldHVybiBzZXJ2ZXI7XG4gIH1cblxuICBhc3luYyB3aXRoRmFzdGlmeShcbiAgICBzZXJ2ZXI6IEZhc3RpZnlJbnN0YW5jZTxTZXJ2ZXIsIEluY29taW5nTWVzc2FnZSwgU2VydmVyUmVzcG9uc2U+LFxuICAgIGNvbmZpZzogU29uYW11RmFzdGlmeUNvbmZpZyxcbiAgICBvcHRpb25zPzoge1xuICAgICAgZW5hYmxlU3luYz86IGJvb2xlYW47XG4gICAgICBkb1NpbGVudD86IGJvb2xlYW47XG4gICAgfSxcbiAgKSB7XG4gICAgaWYgKCF0aGlzLmlzSW5pdGlhbGl6ZWQpIHtcbiAgICAgIGF3YWl0IHRoaXMuaW5pdChvcHRpb25zPy5kb1NpbGVudCwgb3B0aW9ucz8uZW5hYmxlU3luYyk7XG4gICAgfVxuXG4gICAgdGhpcy5zZXJ2ZXIgPSBzZXJ2ZXI7XG4gICAgdGhpcy53ZWJzb2NrZXRSdW50aW1lID8/PSBuZXcgV2ViU29ja2V0UnVudGltZSh0aGlzLmNvbmZpZy5zZXJ2ZXIud2Vic29ja2V0KTtcbiAgICBhd2FpdCB0aGlzLnJlZnJlc2hIdHRwVmFsaWRhdG9ycygpO1xuXG4gICAgLy8gdGltZXpvbmUg7ISk7KCVXG4gICAgY29uc3QgdGltZXpvbmUgPSB0aGlzLmNvbmZpZy5hcGkudGltZXpvbmU7XG4gICAgaWYgKHRpbWV6b25lKSB7XG4gICAgICAvLyDtg4DsnoTsobTsl5Ag66ee6rKMIOydkeuLtSDrgqDsp5wg7Iqk7Yq466eB7J2EIOuzgO2ZmO2VtOyjvOyWtOyVvCDtlanri4jri6QuXG4gICAgICAvLyDqsIDroLkgdGltZXpvbmXsnbQgXCJBc2lhL1Nlb3VsXCIg7J2066m0XG4gICAgICAvLyBcIjIwMjUtMTEtMjFUMDA6MDA6MDAuMDAwWlwiIOulvCBcIjIwMjUtMTEtMjFUMDk6MDA6MDArMDk6MDBcIiDsnLzroZwg67OA7ZmY7ZW07KO87Ja07JW8IO2VqeuLiOuLpC5cbiAgICAgIGNvbnN0IHsgZm9ybWF0SW5UaW1lWm9uZSB9ID0gYXdhaXQgaW1wb3J0KFwiZGF0ZS1mbnMtdHpcIik7XG5cbiAgICAgIC8vIElTTyA4NjAxIOuCoOynnCDtmJXsi50g7KCV6rec7IudICjsmIg6IDIwMjQtMDEtMTVUMDk6MzA6MDAuMDAwWilcbiAgICAgIGNvbnN0IElTT19EQVRFX1JFR0VYID0gL15cXGR7NH0tXFxkezJ9LVxcZHsyfVRcXGR7Mn06XFxkezJ9OlxcZHsyfShcXC5cXGR7M30pP1okLztcblxuICAgICAgLy8gVOulvCDrkZjrn6zsi7wg7J6R7J2A65Sw7Ji07ZGc6rCAIOyXhuuLpOuptCBcIjIwMjUtMTEtMTkxNzYzNTQ2MTg5MDAwMTg6NTY6MjkrMDk6MDBcIuyZgCDqsJnsnYAg6rKw6rO86rCAIOuCmOyYteuLiOuLpC5cbiAgICAgIC8vIOydtOuKlCBkYXRlLWZucyDtirnsnoXri4jri6QuXG4gICAgICAvLyDsnbTroIfqsowg7ZW064+EIOq0nOywruyKteuLiOuLpC4gXCIyMDI1LTExLTE5VDE4OjU2OjI5KzA5OjAwXCIg66qo7JaR7Jy866GcIOyemCDrgpjsmLXri4jri6QuXG4gICAgICBjb25zdCBEQVRFX0ZPUk1BVCA9IFwieXl5eS1NTS1kZCdUJ0hIOm1tOnNzWFhYXCI7XG5cbiAgICAgIHNlcnZlci5zZXRSZXBseVNlcmlhbGl6ZXIoKHBheWxvYWQpID0+IHtcbiAgICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHBheWxvYWQsIChfa2V5LCB2YWx1ZSkgPT4ge1xuICAgICAgICAgIGlmIChpc1N0cmluZ1ZhbHVlKHZhbHVlKSAmJiBJU09fREFURV9SRUdFWC50ZXN0KHZhbHVlKSkge1xuICAgICAgICAgICAgcmV0dXJuIGZvcm1hdEluVGltZVpvbmUoXG4gICAgICAgICAgICAgIG5ldyBEYXRlKHZhbHVlKSxcbiAgICAgICAgICAgICAgLyogU0FGRVRZOiBBUEkg642w7L2U66CI7J207YSw7JmAIFpvZCDqsoDspp3quLAg65Ox66GdIOqzhOyVveydtCDsnbQg6rCS7J2YIO2DgOyeheydhCDrs7TsnqXtlZzri6QuICovIHRpbWV6b25lIGFzIGAke3N0cmluZ30vJHtzdHJpbmd9YCxcbiAgICAgICAgICAgICAgREFURV9GT1JNQVQsXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgICAvLyBUaW1lem9uZSDroZzqt7jripQgcHJpbnRTdGFydHVwU3VtbWFyeeyXkOyEnCDthrXtlakg7Lac66ClXG4gICAgfVxuXG4gICAgLy8g7KCE7LK0IOudvOyasO2MhSDrpqzsiqTtirhcbiAgICBzZXJ2ZXIuZ2V0KFxuICAgICAgYCR7dGhpcy5jb25maWcuYXBpLnJvdXRlLnByZWZpeH0vcm91dGVzYCxcbiAgICAgIGFzeW5jIChfcmVxdWVzdCwgX3JlcGx5KTogUHJvbWlzZTx0eXBlb2YgdGhpcy5zeW5jZXIuYXBpcz4gPT4ge1xuICAgICAgICByZXR1cm4gdGhpcy5zeW5jZXIuYXBpcztcbiAgICAgIH0sXG4gICAgKTtcblxuICAgIC8vIEhlYWx0aGNoZWNrIEFQSVxuICAgIHNlcnZlci5nZXQoXG4gICAgICBgJHt0aGlzLmNvbmZpZy5hcGkucm91dGUucHJlZml4fS9oZWFsdGhjaGVja2AsXG4gICAgICBhc3luYyAoX3JlcXVlc3QsIF9yZXBseSk6IFByb21pc2U8c3RyaW5nPiA9PiB7XG4gICAgICAgIHJldHVybiBcIm9rXCI7XG4gICAgICB9LFxuICAgICk7XG5cbiAgICAvLyBTb25hbXUgVUkgQVBJICjroZzsu6wg7ZmY6rK97JeQ7ISc66eMKVxuICAgIGNvbnN0IHsgaXNMb2NhbCB9ID0gYXdhaXQgaW1wb3J0KFwiLi4vdXRpbHMvY29udHJvbGxlclwiKTtcbiAgICBpZiAoaXNMb2NhbCgpKSB7XG4gICAgICBjb25zdCB7IHNvbmFtdVVJQXBpUGx1Z2luIH0gPSBhd2FpdCBpbXBvcnQoXCIuLi91aS9hcGlcIik7XG4gICAgICBzZXJ2ZXIucmVnaXN0ZXIoc29uYW11VUlBcGlQbHVnaW4pO1xuICAgIH1cblxuICAgIC8vIERldlJ1bm5lciDthYzsiqTtirgg7JeU65Oc7Y+s7J247Yq4ICjroZzsu6wg7ZmY6rK9ICsgZGV2UnVubmVyIO2ZnOyEse2ZlCDsi5wpXG4gICAgaWYgKGlzTG9jYWwoKSAmJiB0aGlzLmNvbmZpZy50ZXN0Py5kZXZSdW5uZXI/LmVuYWJsZWQpIHtcbiAgICAgIGNvbnN0IHsgcmVnaXN0ZXJEZXZUZXN0Um91dGVzIH0gPSBhd2FpdCBpbXBvcnQoXCIuLi90ZXN0aW5nL2Rldi10ZXN0LXJvdXRlc1wiKTtcbiAgICAgIGF3YWl0IHJlZ2lzdGVyRGV2VGVzdFJvdXRlcyhzZXJ2ZXIsIHRoaXMuY29uZmlnLnRlc3QuZGV2UnVubmVyKTtcbiAgICB9XG5cbiAgICBjb25zdCB3ZWJQYXRoID0gcGF0aC5qb2luKHRoaXMuYXBwUm9vdFBhdGgsIFwid2ViXCIpO1xuICAgIGNvbnN0IGhhc1dlYiA9IGF3YWl0IGV4aXN0cyh3ZWJQYXRoKTtcblxuICAgIC8vIOyghOyXrSBjb21wcmVzcyDsmLXshZgg6rOE7IKwIChyb3V0ZS5jb21wcmVzczogdHJ1ZeydvCDrlYwg7IKs7JqpKVxuICAgIGNvbnN0IHBsdWdpbkNvbXByZXNzID0gdGhpcy5jb25maWcuc2VydmVyLnBsdWdpbnM/LmNvbXByZXNzO1xuICAgIGNvbnN0IGdsb2JhbENvbXByZXNzT3B0aW9uczogQ29tcHJlc3NPcHRpb25zIHwgdW5kZWZpbmVkID0gcGx1Z2luQ29tcHJlc3NcbiAgICAgID8gcGx1Z2luQ29tcHJlc3MgPT09IHRydWVcbiAgICAgICAgPyB7IHRocmVzaG9sZDogMTAyNCwgZW5jb2RpbmdzOiBbXCJiclwiLCBcImd6aXBcIiwgXCJkZWZsYXRlXCJdIH1cbiAgICAgICAgOiB7XG4gICAgICAgICAgICB0aHJlc2hvbGQ6IHBsdWdpbkNvbXByZXNzLnRocmVzaG9sZCxcbiAgICAgICAgICAgIGVuY29kaW5nczogcGx1Z2luQ29tcHJlc3MuZW5jb2RpbmdzLFxuICAgICAgICAgICAgY3VzdG9tVHlwZXM6IHBsdWdpbkNvbXByZXNzLmN1c3RvbVR5cGVzLFxuICAgICAgICAgIH1cbiAgICAgIDogdW5kZWZpbmVkO1xuXG4gICAgaWYgKGlzTG9jYWwoKSkge1xuICAgICAgLy8g66Gc7LusIOqwnOuwnCDtmZjqsr06IGNhdGNoLWFsbOuhnCBBUEnrpbwg64+Z7KCBIOunpOy5re2VmOyXrCBITVLsnYQg7KeA7JuQ7ZWp64uI64ukLlxuICAgICAgLy8gU09OQU1VX0RJU0FCTEVfSU5URUdSQVRFRF9XRUI9eWVz66GcIOyEpOygle2VmOuptCBkZXZfYXBpIOuqqOuTnOyXkOyEnCBWaXRlIO2Gte2VqeydhCDruYTtmZzshLHtmZTtlaAg7IiYIOyeiOyKteuLiOuLpC5cbiAgICAgIGNvbnN0IGRpc2FibGVJbnRlZ3JhdGVkV2ViID0gcHJvY2Vzcy5lbnYuU09OQU1VX0RJU0FCTEVfSU5URUdSQVRFRF9XRUIgPT09IFwieWVzXCI7XG4gICAgICBpZiAoaGFzV2ViICYmICFkaXNhYmxlSW50ZWdyYXRlZFdlYikge1xuICAgICAgICBhd2FpdCB0aGlzLnNldHVwRGV2U2VydmVyV2l0aFZpdGUoc2VydmVyLCB3ZWJQYXRoLCBjb25maWcpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5zZXR1cERldlNlcnZlcihzZXJ2ZXIsIGNvbmZpZyk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIO2UhOuhnOuNleyFmCDtmZjqsr06IOqwnOuzhCBBUEkg65287Jqw7Yq4ICsg7KCV7KCBIO2MjOydvCDshJzruZlcbiAgICAgIGZvciAoY29uc3QgYXBpIG9mIHRoaXMuc3luY2VyLmFwaXMpIHtcbiAgICAgICAgaWYgKHRoaXMuc3luY2VyLm1vZGVsc1thcGkubW9kZWxOYW1lXSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGDsoJXsnZjrkJjsp4Ag7JWK7J2AIOuqqOuNuOyXkCDsoJHqt7wgJHthcGkubW9kZWxOYW1lfWApO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQHdlYnNvY2tldCByb3V0ZeuKlCB3c0hhbmRsZXLroZwg65Ox66Gd7ZWY6rOgLCDqsJnsnYAgcGF0aOydmCDsnbzrsJggSFRUUCBHRVTsnYAgNDI2IOydkeuLteycvOuhnCB1cGdyYWRl66W8IOqwleygnO2VqFxuICAgICAgICBpZiAoYXBpLndlYnNvY2tldE9wdGlvbnMpIHtcbiAgICAgICAgICBzZXJ2ZXIucm91dGUoe1xuICAgICAgICAgICAgbWV0aG9kOiBcIkdFVFwiLFxuICAgICAgICAgICAgdXJsOiB0aGlzLmNvbmZpZy5hcGkucm91dGUucHJlZml4ICsgYXBpLnBhdGgsXG4gICAgICAgICAgICBoYW5kbGVyOiB0aGlzLmNyZWF0ZVdlYlNvY2tldFVwZ3JhZGVSZXF1aXJlZEhhbmRsZXIoKSxcbiAgICAgICAgICAgIHdzSGFuZGxlcjogdGhpcy5jcmVhdGVXZWJTb2NrZXRIYW5kbGVyKGFwaSwgY29uZmlnKSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHNlcnZlci5yb3V0ZSh7XG4gICAgICAgICAgbWV0aG9kOiBhcGkub3B0aW9ucy5odHRwTWV0aG9kID8/IFwiR0VUXCIsXG4gICAgICAgICAgdXJsOiB0aGlzLmNvbmZpZy5hcGkucm91dGUucHJlZml4ICsgYXBpLnBhdGgsXG4gICAgICAgICAgaGFuZGxlcjogYXdhaXQgdGhpcy5jcmVhdGVBcGlIYW5kbGVyKGFwaSwgY29uZmlnKSxcbiAgICAgICAgICBjb21wcmVzczogdG9GYXN0aWZ5Q29tcHJlc3NPcHRpb24oYXBpLm9wdGlvbnMuY29tcHJlc3MsIGdsb2JhbENvbXByZXNzT3B0aW9ucyksXG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICAvLyDtlITroZzrjZXshZjsl5DshJzripQgd2ViIOyGjOyKpChhcHBSb290L3dlYikg7Jyg66y07JmAIOustOq0gO2VmOqyjCxcbiAgICAgIC8vIGFwaS93ZWItZGlzdCDsobTsnqwg7Jes67aA66W8IHNldHVwU3RhdGljV2ViU2VydmVyIOuCtOu2gOyXkOyEnCDtjJDri6jtlanri4jri6QuXG4gICAgICBhd2FpdCB0aGlzLnNldHVwU3RhdGljV2ViU2VydmVyKHNlcnZlciwgY29uZmlnLCBnbG9iYWxDb21wcmVzc09wdGlvbnMpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBkZXYg66qo65OcIOqzte2GtTogY2F0Y2gtYWxs7JeQ7IScIOuniOyngOuniSDspIDruYQg7JmE66OMIEFQSSBzbmFwc2hvdOydhCDtg5Dsg4ntlZjsl6wg7JqU7LKt7J2EIOyymOumrO2VqeuLiOuLpC5cbiAgICogc2VydmVyLnJvdXRlKCnroZwg6rCc67OEIOuTseuhne2VmOuptCBoYW5kbGVy6rCAIOqzoOygleuQmOyWtCBITVLsnbQg64+Z7J6R7ZWY7KeAIOyViuycvOuvgOuhnCxcbiAgICogcmVmcmVzaCDshLHqs7Ug7IucIOq1kOyytOuQmOuKlCBzbmFwc2hvdOydhCDrp6Qg7JqU7LKtIOyhsO2ajO2VqeuLiOuLpC5cbiAgICpcbiAgICog7JqU7LKt7J20IC9hcGko7KCV7ZmV7Z6I64qUIHRoaXMuY29uZmlnLmFwaS5yb3V0ZS5wcmVmaXgp66GcIOyLnOyeke2VmOyngCDslYrripQg6rK97Jqw652866m0IG51bGzsnYQg67CY7ZmY7ZWY66mwIOuBneuDheuLiOuLpC5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgaGFuZGxlRGV2QXBpUmVxdWVzdChcbiAgICByZXF1ZXN0OiBGYXN0aWZ5UmVxdWVzdCxcbiAgICBjb25maWc6IFNvbmFtdUZhc3RpZnlDb25maWcsXG4gICk6IFByb21pc2U8KChyZXF1ZXN0OiBGYXN0aWZ5UmVxdWVzdCwgcmVwbHk6IEZhc3RpZnlSZXBseSkgPT4gUHJvbWlzZTxBcGlNZXRob2RSZXN1bHQ+KSB8IG51bGw+IHtcbiAgICBjb25zdCBtYXRjaGVkQXBpID0gdGhpcy5maW5kTWF0Y2hlZEFwaShyZXF1ZXN0LCB0aGlzLnByZXBhcmVkQXBpcywgdGhpcy5wcmVwYXJlZE1vZGVscyk7XG5cbiAgICBpZiAoIW1hdGNoZWRBcGkpIHtcbiAgICAgIHRocm93IG5ldyBOb3RGb3VuZEV4Y2VwdGlvbihTRChcImVycm9yLmFwaS5ub3RGb3VuZFwiKSk7XG4gICAgfVxuXG4gICAgLy8gd2Vic29ja2V0IHJvdXRl66W8IOydvOuwmCBIVFRQ66GcIOyngeygkSDtmLjstpztlZwg6rK97JqwIDQyNuydhCDrj4zroKTspJggdXBncmFkZSDsl4bsnbQg7KCR6re87ZWY64qUIOqyg+ydhCDssKjri6jtlahcbiAgICBpZiAobWF0Y2hlZEFwaS53ZWJzb2NrZXRPcHRpb25zKSB7XG4gICAgICByZXR1cm4gdGhpcy5jcmVhdGVXZWJTb2NrZXRVcGdyYWRlUmVxdWlyZWRIYW5kbGVyKCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuY3JlYXRlQXBpSGFuZGxlcihtYXRjaGVkQXBpLCBjb25maWcsIHRoaXMucHJlcGFyZWRNb2RlbHMpO1xuICB9XG5cbiAgcHJpdmF0ZSBmaW5kTWF0Y2hlZEFwaShcbiAgICByZXF1ZXN0OiBGYXN0aWZ5UmVxdWVzdCxcbiAgICBhcGlzOiByZWFkb25seSBFeHRlbmRlZEFwaVtdLFxuICAgIG1vZGVsczogTG9hZGVkTW9kZWxzLFxuICApOiBFeHRlbmRlZEFwaSB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgdXJsID0gdGhpcy5nZXRQYXRobmFtZUZyb21VcmwocmVxdWVzdC51cmwpO1xuICAgIGNvbnN0IG1ldGhvZCA9IHJlcXVlc3QubWV0aG9kO1xuXG4gICAgaWYgKCF1cmwuc3RhcnRzV2l0aCh0aGlzLmNvbmZpZy5hcGkucm91dGUucHJlZml4KSkge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICByZXR1cm4gYXBpcy5maW5kKChhcGkpID0+IHtcbiAgICAgIGlmIChtb2RlbHNbYXBpLm1vZGVsTmFtZV0gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICBjb25zdCBhcGlNZXRob2QgPSBhcGkub3B0aW9ucy5odHRwTWV0aG9kID8/IFwiR0VUXCI7XG4gICAgICBpZiAoYXBpTWV0aG9kICE9PSBtZXRob2QpIHJldHVybiBmYWxzZTtcblxuICAgICAgY29uc3QgZnVsbFBhdGggPSB0aGlzLmNvbmZpZy5hcGkucm91dGUucHJlZml4ICsgYXBpLnBhdGg7XG4gICAgICByZXR1cm4gdGhpcy5pc1BhdGhQYXR0ZXJuTWF0Y2goZnVsbFBhdGgsIHVybCk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogZGV2IGFwaSDrqqjrk5w6IFZpdGUg7JeG7J20IEFQSSDrj5nsoIEg65287Jqw7YyF66eMIOygnOqzte2VqeuLiOuLpC5cbiAgICogSE1S7J2EIOychO2VtCBjYXRjaC1hbGzsl5DshJwg66ekIOyalOyyreuniOuLpCDspIDruYQg7JmE66OMIEFQSSBzbmFwc2hvdOydhCDsobDtmoztlanri4jri6QuXG4gICAqL1xuICBwcml2YXRlIHNldHVwRGV2U2VydmVyKFxuICAgIHNlcnZlcjogRmFzdGlmeUluc3RhbmNlPFNlcnZlciwgSW5jb21pbmdNZXNzYWdlLCBTZXJ2ZXJSZXNwb25zZT4sXG4gICAgY29uZmlnOiBTb25hbXVGYXN0aWZ5Q29uZmlnLFxuICApOiB2b2lkIHtcbiAgICAvLyB1cGdyYWRl64qUIOyLpOyniOyggeycvOuhnCBHRVTsl5DshJzrp4wg7ISx66a97ZWY66+A66GcIEdFVCArIHdzSGFuZGxlciDsmYAg6re4IOyZuCBtZXRob2Trpbwg67OE64+EIHJvdXRl66GcIOu2hOumrO2VqFxuICAgIHNlcnZlci5yb3V0ZSh7XG4gICAgICBtZXRob2Q6IFwiR0VUXCIsXG4gICAgICB1cmw6IGAke3RoaXMuY29uZmlnLmFwaS5yb3V0ZS5wcmVmaXh9LypgLFxuICAgICAgaGFuZGxlcjogYXN5bmMgKHJlcXVlc3QsIHJlcGx5KSA9PiB7XG4gICAgICAgIGNvbnN0IGhhbmRsZXIgPSBhd2FpdCB0aGlzLmhhbmRsZURldkFwaVJlcXVlc3QocmVxdWVzdCwgY29uZmlnKTtcbiAgICAgICAgaWYgKGhhbmRsZXIpIHtcbiAgICAgICAgICByZXR1cm4gaGFuZGxlcihyZXF1ZXN0LCByZXBseSk7XG4gICAgICAgIH1cbiAgICAgICAgLy8g65Ox66Gd65CcIEFQSeyZgCDsnbzsuZjtlZjsp4Ag7JWK64qUIOyalOyyreyXkCDrjIDtlZwgZmFsbGJhY2vsnoXri4jri6QuXG4gICAgICAgIHRocm93IG5ldyBOb3RGb3VuZEV4Y2VwdGlvbihTRChcImVycm9yLmFwaS5ub3RGb3VuZFwiKSk7XG4gICAgICB9LFxuICAgICAgd3NIYW5kbGVyOiBhc3luYyAoY29ubmVjdGlvbiwgcmVxdWVzdCkgPT4ge1xuICAgICAgICBhd2FpdCB0aGlzLmhhbmRsZURldldlYlNvY2tldFJlcXVlc3QoY29ubmVjdGlvbi5zb2NrZXQsIHJlcXVlc3QsIGNvbmZpZyk7XG4gICAgICB9LFxuICAgIH0pO1xuXG4gICAgc2VydmVyLnJvdXRlKHtcbiAgICAgIG1ldGhvZDogW1wiSEVBRFwiLCBcIlBPU1RcIiwgXCJQVVRcIiwgXCJERUxFVEVcIiwgXCJQQVRDSFwiXSxcbiAgICAgIHVybDogYCR7dGhpcy5jb25maWcuYXBpLnJvdXRlLnByZWZpeH0vKmAsXG4gICAgICBoYW5kbGVyOiBhc3luYyAocmVxdWVzdCwgcmVwbHkpID0+IHtcbiAgICAgICAgY29uc3QgaGFuZGxlciA9IGF3YWl0IHRoaXMuaGFuZGxlRGV2QXBpUmVxdWVzdChyZXF1ZXN0LCBjb25maWcpO1xuICAgICAgICBpZiAoaGFuZGxlcikge1xuICAgICAgICAgIHJldHVybiBoYW5kbGVyKHJlcXVlc3QsIHJlcGx5KTtcbiAgICAgICAgfVxuICAgICAgICB0aHJvdyBuZXcgTm90Rm91bmRFeGNlcHRpb24oU0QoXCJlcnJvci5hcGkubm90Rm91bmRcIikpO1xuICAgICAgfSxcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgdml0ZVNlcnZlcjogYW55ID0gbnVsbDtcblxuICAvKipcbiAgICogZGV2IGFsbCDrqqjrk5w6IFZpdGUgRGV2IFNlcnZlcuulvCDthrXtlantlZjsl6wgQVBJICsgU1NSICsgQ1NS7J2EIOuqqOuRkCDsoJzqs7Xtlanri4jri6QuXG4gICAqIEFQSSDrj5nsoIEg66ek7Lmt7J2AIGhhbmRsZURldkFwaVJlcXVlc3Trpbwg6rO17Jyg7ZWp64uI64ukLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBzZXR1cERldlNlcnZlcldpdGhWaXRlKFxuICAgIHNlcnZlcjogRmFzdGlmeUluc3RhbmNlPFNlcnZlciwgSW5jb21pbmdNZXNzYWdlLCBTZXJ2ZXJSZXNwb25zZT4sXG4gICAgd2ViUGF0aDogc3RyaW5nLFxuICAgIGNvbmZpZzogU29uYW11RmFzdGlmeUNvbmZpZyxcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgLy8gQGZhc3RpZnkvbWlkZGllIOuTseuhnSAoQ29ubmVjdC1zdHlsZSBtaWRkbGV3YXJlIOyngOybkClcbiAgICBhd2FpdCBzZXJ2ZXIucmVnaXN0ZXIoKGF3YWl0IGltcG9ydChcIkBmYXN0aWZ5L21pZGRpZVwiKSkuZGVmYXVsdCk7XG5cbiAgICBjb25zdCB2aXRlID0gYXdhaXQgaW1wb3J0KFwidml0ZVwiKTtcbiAgICAvLyBAZmFzdGlmeS93ZWJzb2NrZXQg7ZSM65+s6re47J247J20IO2ZnOyEse2ZlOuQmOuptCBITVIgd2Vic29ja2V06rO8IHNlcnZlciBzb2NrZXTsnbQg7Lap64+M7ZWY66+A66GcIGRlZGljYXRlZCDtj6ztirjroZwg67aE66as7ZWoXG4gICAgY29uc3QgcmVxdWlyZXNEZWRpY2F0ZWRIbXJTZXJ2ZXIgPSBCb29sZWFuKHRoaXMuY29uZmlnLnNlcnZlci5wbHVnaW5zPy53cyk7XG4gICAgY29uc3QgaG1yID0gcmVzb2x2ZUludGVncmF0ZWRWaXRlSG1yT3B0aW9ucyh7XG4gICAgICBodHRwU2VydmVyOiBzZXJ2ZXIuc2VydmVyLFxuICAgICAgcmVxdWlyZXNEZWRpY2F0ZWRXZWJTb2NrZXRTZXJ2ZXI6IHJlcXVpcmVzRGVkaWNhdGVkSG1yU2VydmVyLFxuICAgIH0pO1xuXG4gICAgdGhpcy52aXRlU2VydmVyID0gYXdhaXQgdml0ZS5jcmVhdGVTZXJ2ZXIoe1xuICAgICAgcm9vdDogd2ViUGF0aCxcbiAgICAgIHNlcnZlcjoge1xuICAgICAgICBtaWRkbGV3YXJlTW9kZTogdHJ1ZSxcbiAgICAgICAgaG1yLFxuICAgICAgfSxcbiAgICAgIGFwcFR5cGU6IFwiY3VzdG9tXCIsXG4gICAgfSk7XG5cbiAgICAvLyBWaXRlIG1pZGRsZXdhcmUg65Ox66GdIChWaXRlIOyXkOyFiyDsspjrpqwpXG4gICAgc2VydmVyLnVzZSgocmVxLCByZXMsIG5leHQpID0+IHtcbiAgICAgIC8vIEFQSeyZgCBTb25hbXUgVUnripQgRmFzdGlmeSDrnbzsmrDtirjqsIAg7LKY66as7ZWY64+E66GdIHNraXBcbiAgICAgIGlmIChyZXEudXJsPy5zdGFydHNXaXRoKHRoaXMuY29uZmlnLmFwaS5yb3V0ZS5wcmVmaXgpIHx8IHJlcS51cmw/LnN0YXJ0c1dpdGgoXCIvc29uYW11LXVpXCIpKSB7XG4gICAgICAgIHJldHVybiBuZXh0KCk7XG4gICAgICB9XG4gICAgICAvLyDrgpjrqLjsp4DripQgVml0ZSBtaWRkbGV3YXJl66GcIOyghOuLrFxuICAgICAgcmV0dXJuIHRoaXMudml0ZVNlcnZlci5taWRkbGV3YXJlcyhyZXEsIHJlcywgbmV4dCk7XG4gICAgfSk7XG5cbiAgICAvLyBXUyB1cGdyYWRlIOqyveuhnChHRVQp7JmAIOydvOuwmCBIVFRQIOuplOyEnOuTnOulvCDrs4Trj4Qgcm91dGXroZwg67aE66as7ZW0IHdlYnNvY2tldCByb3V0ZeqwgCBIVE1MIGZhbGxiYWNr7JeQIOuoue2eiOyngCDslYrrj4TroZ0g7ZWoXG4gICAgc2VydmVyLnJvdXRlKHtcbiAgICAgIG1ldGhvZDogXCJHRVRcIixcbiAgICAgIHVybDogYCR7dGhpcy5jb25maWcuYXBpLnJvdXRlLnByZWZpeH0vKmAsXG4gICAgICBoYW5kbGVyOiBhc3luYyAocmVxdWVzdCwgcmVwbHkpID0+IHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5oYW5kbGVEZXZBcGlSZXF1ZXN0KHJlcXVlc3QsIGNvbmZpZyk7XG4gICAgICAgIGlmIChyZXN1bHQpIHtcbiAgICAgICAgICByZXR1cm4gcmVzdWx0KHJlcXVlc3QsIHJlcGx5KTtcbiAgICAgICAgfVxuICAgICAgICB0aHJvdyBuZXcgTm90Rm91bmRFeGNlcHRpb24oU0QoXCJlcnJvci5hcGkubm90Rm91bmRcIikpO1xuICAgICAgfSxcbiAgICAgIHdzSGFuZGxlcjogYXN5bmMgKGNvbm5lY3Rpb24sIHJlcXVlc3QpID0+IHtcbiAgICAgICAgYXdhaXQgdGhpcy5oYW5kbGVEZXZXZWJTb2NrZXRSZXF1ZXN0KGNvbm5lY3Rpb24uc29ja2V0LCByZXF1ZXN0LCBjb25maWcpO1xuICAgICAgfSxcbiAgICB9KTtcblxuICAgIHNlcnZlci5yb3V0ZSh7XG4gICAgICBtZXRob2Q6IFtcIkhFQURcIiwgXCJQT1NUXCIsIFwiUFVUXCIsIFwiREVMRVRFXCIsIFwiUEFUQ0hcIl0sXG4gICAgICB1cmw6IGAke3RoaXMuY29uZmlnLmFwaS5yb3V0ZS5wcmVmaXh9LypgLFxuICAgICAgaGFuZGxlcjogYXN5bmMgKHJlcXVlc3QsIHJlcGx5KSA9PiB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuaGFuZGxlRGV2QXBpUmVxdWVzdChyZXF1ZXN0LCBjb25maWcpO1xuICAgICAgICBpZiAocmVzdWx0KSB7XG4gICAgICAgICAgcmV0dXJuIHJlc3VsdChyZXF1ZXN0LCByZXBseSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhyb3cgbmV3IE5vdEZvdW5kRXhjZXB0aW9uKFNEKFwiZXJyb3IuYXBpLm5vdEZvdW5kXCIpKTtcbiAgICAgIH0sXG4gICAgfSk7XG5cbiAgICAvLyBjYXRjaC1hbGwg65287Jqw7Yq47JeQ7IScIFNTUi9DU1Ig7LKY66asXG4gICAgLy8g6rCc67CcIO2ZmOqyveyXkOyEnOuKlCDrnbzsmrDtirjrs4QgY29tcHJlc3Mg7Ji17IWY7J2EIO2PrOq4sO2VmOqzoCBITVIg7J207KCQ7J2EIOy3qO2VqeuLiOuLpC5cbiAgICBzZXJ2ZXIucm91dGUoe1xuICAgICAgbWV0aG9kOiBbXCJHRVRcIiwgXCJIRUFEXCJdLFxuICAgICAgdXJsOiBcIi8qXCIsXG4gICAgICBoYW5kbGVyOiBhc3luYyAocmVxdWVzdCwgcmVwbHkpID0+IHtcbiAgICAgICAgY29uc3QgdXJsID0gcmVxdWVzdC51cmw7XG5cbiAgICAgICAgLy8gMS4gU1NSIOudvOyasO2KuCDsspjrpqxcbiAgICAgICAgY29uc3QgeyBtYXRjaFNTUlJvdXRlLCByZW5kZXJTU1IgfSA9IGF3YWl0IGltcG9ydChcIi4uL3NzclwiKTtcbiAgICAgICAgY29uc3Qgc3NyTWF0Y2ggPSBtYXRjaFNTUlJvdXRlKHVybCk7XG4gICAgICAgIGlmIChzc3JNYXRjaCkge1xuICAgICAgICAgIGNvbnNvbGUubG9nKGBbU1NSXSBNYXRjaGVkIHJvdXRlOiAke3Nzck1hdGNoLnJvdXRlLnBhdGh9YCk7XG4gICAgICAgICAgY29uc3QgaHRtbCA9IGF3YWl0IHJlbmRlclNTUihcbiAgICAgICAgICAgIHVybCxcbiAgICAgICAgICAgIHNzck1hdGNoLnJvdXRlLFxuICAgICAgICAgICAgc3NyTWF0Y2gucGFyYW1zLFxuICAgICAgICAgICAgcmVxdWVzdCxcbiAgICAgICAgICAgIHJlcGx5LFxuICAgICAgICAgICAgY29uZmlnLFxuICAgICAgICAgICAgdGhpcy52aXRlU2VydmVyLFxuICAgICAgICAgICk7XG4gICAgICAgICAgcmVwbHkudHlwZShcInRleHQvaHRtbFwiKTtcbiAgICAgICAgICByZXR1cm4gaHRtbDtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIDIuIENTUiBmYWxsYmFja1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGxldCB0ZW1wbGF0ZSA9IGF3YWl0IGZzLnJlYWRGaWxlKFxuICAgICAgICAgICAgcGF0aC5qb2luKHRoaXMudml0ZVNlcnZlci5jb25maWcucm9vdCwgXCJpbmRleC5odG1sXCIpLFxuICAgICAgICAgICAgXCJ1dGYtOFwiLFxuICAgICAgICAgICk7XG4gICAgICAgICAgdGVtcGxhdGUgPSBhd2FpdCB0aGlzLnZpdGVTZXJ2ZXIudHJhbnNmb3JtSW5kZXhIdG1sKHVybCwgdGVtcGxhdGUpO1xuXG4gICAgICAgICAgLy8gP2htcj1mYWxzZeuhnCDsl7Ag7Y6Y7J207KeA64qUIEhNUiDsm7nshozsvJPrp4wg64GK7Ja0IOyDiOuhnOqzoOy5qOuQmOyngCDslYrqsowg7ZWc64ukLlxuICAgICAgICAgIGNvbnN0IHsgSE1SX09QVF9PVVRfU0NSSVBULCBpc0htckRpc2FibGVkQnlRdWVyeSB9ID0gYXdhaXQgaW1wb3J0KFwiLi4vc3NyL2htci1vcHQtb3V0XCIpO1xuICAgICAgICAgIGlmIChpc0htckRpc2FibGVkQnlRdWVyeSh1cmwpKSB7XG4gICAgICAgICAgICB0ZW1wbGF0ZSA9IHRlbXBsYXRlLnJlcGxhY2UoXCI8aGVhZD5cIiwgYDxoZWFkPlxcbiR7SE1SX09QVF9PVVRfU0NSSVBUfWApO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJlcGx5LnR5cGUoXCJ0ZXh0L2h0bWxcIik7XG4gICAgICAgICAgcmV0dXJuIHRlbXBsYXRlO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgdGhpcy52aXRlU2VydmVyLnNzckZpeFN0YWNrdHJhY2UoXG4gICAgICAgICAgICAvKiBTQUZFVFk6IEFQSSDrjbDsvZTroIjsnbTthLDsmYAgWm9kIOqygOymneq4sCDrk7HroZ0g6rOE7JW97J20IOydtCDqsJLsnZgg7YOA7J6F7J2EIOuztOyepe2VnOuLpC4gKi8gZSBhcyBFcnJvcixcbiAgICAgICAgICApO1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZSk7XG4gICAgICAgICAgcmVwbHkuc3RhdHVzKDUwMCk7XG4gICAgICAgICAgcmV0dXJuIC8qIFNBRkVUWTogQVBJIOuNsOy9lOugiOydtO2EsOyZgCBab2Qg6rKA7Kad6riwIOuTseuhnSDqs4Tslb3snbQg7J20IOqwkuydmCDtg4DsnoXsnYQg67O07J6l7ZWc64ukLiAqLyAoXG4gICAgICAgICAgICBlIGFzIEVycm9yXG4gICAgICAgICAgKS5tZXNzYWdlO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgIH0pO1xuXG4gICAgLy8g7ISc67KEIOyiheujjCDsi5wgVml0ZeuPhCDsooXro4xcbiAgICBzZXJ2ZXIuYWRkSG9vayhcIm9uQ2xvc2VcIiwgYXN5bmMgKCkgPT4ge1xuICAgICAgYXdhaXQgdGhpcy52aXRlU2VydmVyLmNsb3NlKCk7XG4gICAgfSk7XG5cbiAgICBpZiAoXCJwb3J0XCIgaW4gaG1yKSB7XG4gICAgICBjb25zb2xlLmxvZyhcbiAgICAgICAgY2hhbGsuZGltKFxuICAgICAgICAgIGDinJMgVml0ZSBITVIgdXNpbmcgZGVkaWNhdGVkIHdlYnNvY2tldCBwb3J0ICR7aG1yLnBvcnR9IHRvIGF2b2lkIEZhc3RpZnkgd2Vic29ja2V0IGNvbmZsaWN0c2AsXG4gICAgICAgICksXG4gICAgICApO1xuICAgIH1cbiAgICBjb25zb2xlLmxvZyhjaGFsay5kaW0oXCLinJMgVml0ZSBkZXYgc2VydmVyIGludGVncmF0ZWRcIikpO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBzZXR1cFN0YXRpY1dlYlNlcnZlcihcbiAgICBzZXJ2ZXI6IEZhc3RpZnlJbnN0YW5jZTxTZXJ2ZXIsIEluY29taW5nTWVzc2FnZSwgU2VydmVyUmVzcG9uc2U+LFxuICAgIGNvbmZpZzogU29uYW11RmFzdGlmeUNvbmZpZyxcbiAgICBnbG9iYWxDb21wcmVzc09wdGlvbnM6IENvbXByZXNzT3B0aW9ucyB8IHVuZGVmaW5lZCxcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgLy8g6rK966GcIOuqhe2Zle2ZlDogYXBpL3dlYi1kaXN0L2NsaWVudCAo7KCV7KCBIO2MjOydvCksIGFwaS93ZWItZGlzdC9zZXJ2ZXIgKFNTUiBlbnRyeSksIGFwaS9kaXN0L3NzciAoU1NSIHJvdXRlcyAtIEFQSSDshozsnKApXG4gICAgY29uc3Qgd2ViRGlzdFBhdGggPSBwYXRoLmpvaW4odGhpcy5hcGlSb290UGF0aCwgXCJ3ZWItZGlzdFwiLCBcImNsaWVudFwiKTtcbiAgICBjb25zdCBzc3JQYXRoID0gcGF0aC5qb2luKHRoaXMuYXBpUm9vdFBhdGgsIFwid2ViLWRpc3RcIiwgXCJzZXJ2ZXJcIik7XG4gICAgY29uc3Qgc3NyRW50cnlQYXRoID0gcGF0aC5qb2luKHNzclBhdGgsIFwiZW50cnktc2VydmVyLmdlbmVyYXRlZC5qc1wiKTtcbiAgICBjb25zdCBzc3JSb3V0ZXNQYXRoID0gcGF0aC5qb2luKHRoaXMuYXBpUm9vdFBhdGgsIFwiZGlzdFwiLCBcInNzclwiLCBcInJvdXRlcy5qc1wiKTtcblxuICAgIGlmICghKGF3YWl0IGV4aXN0cyh3ZWJEaXN0UGF0aCkpKSB7XG4gICAgICBjb25zb2xlLndhcm4oYOKaoCBXZWIgZGlzdCBub3QgZm91bmQ6ICR7d2ViRGlzdFBhdGh9YCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gU1NSIGVudHJ5IOyhtOyerCDsl6zrtoAg7ZmV7J24XG4gICAgY29uc3Qgc3NyQXZhaWxhYmxlID0gYXdhaXQgZXhpc3RzKHNzckVudHJ5UGF0aCk7XG5cbiAgICBpZiAoIXNzckF2YWlsYWJsZSkge1xuICAgICAgY29uc29sZS53YXJuKGDimqAgU1NSIGVudHJ5IG5vdCBmb3VuZDogJHtzc3JFbnRyeVBhdGh9YCk7XG4gICAgICBjb25zb2xlLndhcm4oXCIgIFNTUiB3aWxsIGJlIGRpc2FibGVkLiBPbmx5IENTUiB3aWxsIHdvcmsuXCIpO1xuICAgIH1cblxuICAgIC8vIFNTUiDrnbzsmrDtirgg66Gc65OcIChwcm9kdWN0aW9u7JeQ7ISc66eMLCDsgqzsmqnsnpAg7ZSE66Gc7KCd7Yq47J2YIHNzci9yb3V0ZXMudHMpXG4gICAgaWYgKHNzckF2YWlsYWJsZSkge1xuICAgICAgaWYgKGF3YWl0IGV4aXN0cyhzc3JSb3V0ZXNQYXRoKSkge1xuICAgICAgICAvLyB0cy1sb2FkZXLrnbzrqbQgXCJmaWxlOi8vXCLroZwg7Iuc7J6R7ZWY64qUIGZ1bGx5LXJlc29sdmVkIHBhdGjrp4wg67Cb6riw7JeQIOydtOulvCDsspjrpqztlbTso7zripQgaW1wb3J0TWVtYmVyc+ulvCDsgqzsmqntlbTslbwg7ZaI6rKg7KeA66eMLFxuICAgICAgICAvLyDsl6zquLDripQg7ZSE66Gc642V7IWYIO2ZmOqyveyXkOyEnCBsb2FkZXIg7JeG7J20IOuPjOyVhOqwgOq4sCDrlYzrrLjsl5AgXCLsp4Tsp5wganMg7YyM7J28XCLsnZggXCLqt7jrg6VcIiDsoIjrjIDqsr3roZzrpbwg67CU66GcIGltcG9ydO2VtOuPhCDrkKnri4jri6QuXG4gICAgICAgIC8vIOydtCDrgrTsmqnsnYAg7J20IO2VqOyImCDrgrTsl5DshJwg7JWE656Y7JeQIOuCmOyYrCDri6TrpbggaW1wb3J0IO2YuOy2nOyXkOuPhCDrj5nsnbztlZjqsowg7KCB7Jqp65Cp64uI64ukLlxuICAgICAgICBhd2FpdCBpbXBvcnQoc3NyUm91dGVzUGF0aCk7XG4gICAgICAgIGNvbnNvbGUubG9nKFwi4pyTIFNTUiByb3V0ZXMgbG9hZGVkXCIpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc29sZS53YXJuKGDimqAgU1NSIHJvdXRlcyBub3QgZm91bmQ6ICR7c3NyUm91dGVzUGF0aH1gKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyDroaTrp4Eg7JeF642w7J207Yq4IOuMgOydkTogYXNzZXQgaGFzaCDrtojsnbzsuZgg7IucIO2YhOyerCDrsoTsoIQg7KeB7KCRIOyEnOu5mVxuICAgIHNlcnZlci5nZXQoXCIvYXNzZXRzLzpmaWxlbmFtZVwiLCBhc3luYyAocmVxdWVzdCwgcmVwbHkpID0+IHtcbiAgICAgIGNvbnN0IHJlcXVlc3RlZEZpbGUgPVxuICAgICAgICAvKiBTQUZFVFk6IEFQSSDrjbDsvZTroIjsnbTthLDsmYAgWm9kIOqygOymneq4sCDrk7HroZ0g6rOE7JW97J20IOydtCDqsJLsnZgg7YOA7J6F7J2EIOuztOyepe2VnOuLpC4gKi8gKFxuICAgICAgICAgIHJlcXVlc3QucGFyYW1zIGFzIHsgZmlsZW5hbWU6IHN0cmluZyB9XG4gICAgICAgICkuZmlsZW5hbWU7XG4gICAgICBjb25zdCBhc3NldHNEaXIgPSBwYXRoLmpvaW4od2ViRGlzdFBhdGgsIFwiYXNzZXRzXCIpO1xuICAgICAgY29uc3Qgc2FmZUZpbGVQYXRoID0gdGhpcy5yZXNvbHZlUGF0aFdpdGhpbkJhc2VEaXIoYXNzZXRzRGlyLCByZXF1ZXN0ZWRGaWxlKTtcbiAgICAgIGlmIChzYWZlRmlsZVBhdGggPT09IG51bGwpIHtcbiAgICAgICAgcmVwbHkuc3RhdHVzKDQwMykuc2VuZCgpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBjb25zdCBub3JtYWxpemVkUmVxdWVzdGVkRmlsZSA9IHBhdGgucmVsYXRpdmUoYXNzZXRzRGlyLCBzYWZlRmlsZVBhdGgpLnJlcGxhY2UoL1xcXFwvZywgXCIvXCIpO1xuXG4gICAgICBjb25zdCBhc3NldFBhdGggPSBgL2Fzc2V0cy8ke25vcm1hbGl6ZWRSZXF1ZXN0ZWRGaWxlfWA7XG5cbiAgICAgIC8vIENhY2hlLUNvbnRyb2wg7Zek642UIOqysOyglVxuICAgICAgY29uc3QgZ2V0Q2FjaGVDb250cm9sRm9yQXNzZXQgPSAoKTogQ2FjaGVDb250cm9sQ29uZmlnID0+IHtcbiAgICAgICAgY29uc3QgY2FjaGVSZXE6IENhY2hlQ29udHJvbFJlcXVlc3QgPSB7XG4gICAgICAgICAgdHlwZTogXCJhc3NldHNcIixcbiAgICAgICAgICB1cmw6IHJlcXVlc3QudXJsLFxuICAgICAgICAgIHBhdGg6IGFzc2V0UGF0aCxcbiAgICAgICAgICBtZXRob2Q6IHJlcXVlc3QubWV0aG9kLFxuICAgICAgICB9O1xuXG4gICAgICAgIC8vIOyCrOyaqeyekCDsoJXsnZgg7ZW465Ok65+sIOyasOyEoFxuICAgICAgICBpZiAoY29uZmlnLmNhY2hlQ29udHJvbEhhbmRsZXIpIHtcbiAgICAgICAgICBjb25zdCByZXN1bHQgPSBjb25maWcuY2FjaGVDb250cm9sSGFuZGxlcihjYWNoZVJlcSk7XG4gICAgICAgICAgaWYgKHJlc3VsdCkgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIOq4sOuzuOqwkjogaW1tdXRhYmxlXG4gICAgICAgIHJldHVybiBDYWNoZVByZXNldHMuaW1tdXRhYmxlO1xuICAgICAgfTtcblxuICAgICAgLy8gaW5kZXgtKi5qcyDrmJDripQgaW5kZXgtKi5jc3Mg7JqU7LKt7J24IOqyveyasFxuICAgICAgaWYgKC9eaW5kZXgtW2EtZjAtOV0rXFwuKGpzfGNzcykkLy50ZXN0KG5vcm1hbGl6ZWRSZXF1ZXN0ZWRGaWxlKSkge1xuICAgICAgICBjb25zdCBleHQgPSBub3JtYWxpemVkUmVxdWVzdGVkRmlsZS5zcGxpdChcIi5cIikucG9wKCk7XG4gICAgICAgIGNvbnN0IGZpbGVzID0gYXdhaXQgZnMucmVhZGRpcihhc3NldHNEaXIpO1xuICAgICAgICBjb25zdCBjdXJyZW50RmlsZSA9IGZpbGVzLmZpbmQoKGYpID0+IGYuc3RhcnRzV2l0aChcImluZGV4LVwiKSAmJiBmLmVuZHNXaXRoKGAuJHtleHR9YCkpO1xuXG4gICAgICAgIGlmIChjdXJyZW50RmlsZSkge1xuICAgICAgICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5qb2luKGFzc2V0c0RpciwgY3VycmVudEZpbGUpO1xuICAgICAgICAgIGNvbnN0IGNvbnRlbnQgPSBhd2FpdCBmcy5yZWFkRmlsZShmaWxlUGF0aCk7XG4gICAgICAgICAgcmVwbHkudHlwZShleHQgPT09IFwianNcIiA/IFwiYXBwbGljYXRpb24vamF2YXNjcmlwdFwiIDogXCJ0ZXh0L2Nzc1wiKTtcbiAgICAgICAgICBhcHBseUNhY2hlSGVhZGVycyhyZXBseSwgZ2V0Q2FjaGVDb250cm9sRm9yQXNzZXQoKSk7XG4gICAgICAgICAgcmV0dXJuIHJlcGx5LnNlbmQoY29udGVudCk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8g7J2867CYIO2MjOydvCDshJzruZlcbiAgICAgIGNvbnN0IGZpbGVQYXRoID0gc2FmZUZpbGVQYXRoO1xuICAgICAgaWYgKGF3YWl0IGV4aXN0cyhmaWxlUGF0aCkpIHtcbiAgICAgICAgY29uc3QgY29udGVudCA9IGF3YWl0IGZzLnJlYWRGaWxlKGZpbGVQYXRoKTtcbiAgICAgICAgY29uc3QgZXh0ID0gbm9ybWFsaXplZFJlcXVlc3RlZEZpbGUuc3BsaXQoXCIuXCIpLnBvcCgpO1xuICAgICAgICByZXBseS50eXBlKGV4dCA9PT0gXCJqc1wiID8gXCJhcHBsaWNhdGlvbi9qYXZhc2NyaXB0XCIgOiBleHQgPT09IFwiY3NzXCIgPyBcInRleHQvY3NzXCIgOiBcIlwiKTtcbiAgICAgICAgaWYgKG5vcm1hbGl6ZWRSZXF1ZXN0ZWRGaWxlLmluY2x1ZGVzKFwiLVwiKSkge1xuICAgICAgICAgIGFwcGx5Q2FjaGVIZWFkZXJzKHJlcGx5LCBnZXRDYWNoZUNvbnRyb2xGb3JBc3NldCgpKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVwbHkuc2VuZChjb250ZW50KTtcbiAgICAgIH1cblxuICAgICAgcmVwbHkuc3RhdHVzKDQwNCkuc2VuZCgpO1xuICAgIH0pO1xuXG4gICAgLy8gU1NSIOudvOyasO2KuCDqsJzrs4Qg65Ox66GdIChjb21wcmVzcyDsmLXshZjsnbQg65287Jqw7Yq467OE66GcIOyggeyaqeuQmOuPhOuhnSlcbiAgICBpZiAoc3NyQXZhaWxhYmxlKSB7XG4gICAgICBjb25zdCB7IGdldFNTUlJvdXRlcyB9ID0gYXdhaXQgaW1wb3J0KFwiLi4vc3NyXCIpO1xuICAgICAgY29uc3QgeyByZW5kZXJTU1IgfSA9IGF3YWl0IGltcG9ydChcIi4uL3Nzci9yZW5kZXJlclwiKTtcbiAgICAgIGNvbnN0IHNzclJvdXRlcyA9IGdldFNTUlJvdXRlcygpO1xuXG4gICAgICBmb3IgKGNvbnN0IHJvdXRlIG9mIHNzclJvdXRlcykge1xuICAgICAgICBzZXJ2ZXIucm91dGUoe1xuICAgICAgICAgIG1ldGhvZDogW1wiR0VUXCIsIFwiSEVBRFwiXSxcbiAgICAgICAgICB1cmw6IHJvdXRlLnBhdGgsXG4gICAgICAgICAgY29tcHJlc3M6IHRvRmFzdGlmeUNvbXByZXNzT3B0aW9uKHJvdXRlLmNvbXByZXNzID8/IHRydWUsIGdsb2JhbENvbXByZXNzT3B0aW9ucyksXG4gICAgICAgICAgaGFuZGxlcjogYXN5bmMgKHJlcXVlc3QsIHJlcGx5KSA9PiB7XG4gICAgICAgICAgICBjb25zdCB1cmwgPSByZXF1ZXN0LnVybDtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGBbU1NSXSBNYXRjaGVkIHJvdXRlOiAke3JvdXRlLnBhdGh9YCk7XG5cbiAgICAgICAgICAgIGNvbnN0IHBhcmFtcyA9IHRoaXMuZXh0cmFjdFBhdGhQYXJhbXMocm91dGUucGF0aCwgdXJsKTtcbiAgICAgICAgICAgIGNvbnN0IGh0bWwgPSBhd2FpdCByZW5kZXJTU1IodXJsLCByb3V0ZSwgcGFyYW1zLCByZXF1ZXN0LCByZXBseSwgY29uZmlnKTtcblxuICAgICAgICAgICAgcmVwbHkudHlwZShcInRleHQvaHRtbFwiKTtcbiAgICAgICAgICAgIHJldHVybiBodG1sO1xuICAgICAgICAgIH0sXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIENTUiBvciBTdGF0aWMgRmlsZSBGYWxsYmFjayAoU1NSIOudvOyasO2KuOyXkCDrp6Tsua3rkJjsp4Ag7JWK64qUIOuqqOuToCDsmpTssq0pXG4gICAgc2VydmVyLnJvdXRlKHtcbiAgICAgIG1ldGhvZDogW1wiR0VUXCIsIFwiSEVBRFwiXSxcbiAgICAgIHVybDogXCIqXCIsXG4gICAgICBoYW5kbGVyOiBhc3luYyAocmVxdWVzdCwgcmVwbHkpID0+IHtcbiAgICAgICAgLy8gL2FwaSwgL3NvbmFtdS11aeuKlCA0MDQg6re464yA66GcXG4gICAgICAgIGlmIChyZXF1ZXN0LnVybC5zdGFydHNXaXRoKFwiL2FwaVwiKSB8fCByZXF1ZXN0LnVybC5zdGFydHNXaXRoKFwiL3NvbmFtdS11aVwiKSkge1xuICAgICAgICAgIHJlcGx5LnN0YXR1cyg0MDQpLnNlbmQoKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICAvLyBDU1LsmqkgQ2FjaGUtQ29udHJvbCDtl6TrjZQg7ISk7KCVXG4gICAgICAgIGlmIChjb25maWcuY2FjaGVDb250cm9sSGFuZGxlcikge1xuICAgICAgICAgIGNvbnN0IGNzckNhY2hlUmVxOiBDYWNoZUNvbnRyb2xSZXF1ZXN0ID0ge1xuICAgICAgICAgICAgdHlwZTogXCJjc3JcIixcbiAgICAgICAgICAgIHVybDogcmVxdWVzdC51cmwsXG4gICAgICAgICAgICBwYXRoOiByZXF1ZXN0LnVybC5zcGxpdChcIj9cIilbMF0sXG4gICAgICAgICAgICBtZXRob2Q6IHJlcXVlc3QubWV0aG9kLFxuICAgICAgICAgIH07XG4gICAgICAgICAgY29uc3QgY3NyQ2FjaGVDb25maWcgPSBjb25maWcuY2FjaGVDb250cm9sSGFuZGxlcihjc3JDYWNoZVJlcSk7XG5cbiAgICAgICAgICBpZiAoY3NyQ2FjaGVDb25maWcpIHtcbiAgICAgICAgICAgIGFwcGx5Q2FjaGVIZWFkZXJzKHJlcGx5LCBjc3JDYWNoZUNvbmZpZyk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8g7KCV7KCBIO2MjOydvOydtCDsobTsnqztlaAg6rK97JqwLCDsoJXsoIEg7YyM7J287J2EIOuovOyggCDshJzruZntlbTslbztlahcbiAgICAgICAgY29uc3QgcmVxdWVzdFBhdGggPSB0aGlzLmdldFBhdGhuYW1lRnJvbVVybChyZXF1ZXN0LnVybCk7XG4gICAgICAgIGNvbnN0IHNhZmVGaWxlUGF0aCA9IHRoaXMucmVzb2x2ZVBhdGhXaXRoaW5CYXNlRGlyKHdlYkRpc3RQYXRoLCByZXF1ZXN0UGF0aCk7XG4gICAgICAgIGlmIChzYWZlRmlsZVBhdGggPT09IG51bGwpIHtcbiAgICAgICAgICByZXBseS5zdGF0dXMoNDAzKS5zZW5kKCk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmIChhd2FpdCBmaWxlRXhpc3RzKHNhZmVGaWxlUGF0aCkpIHtcbiAgICAgICAgICBjb25zdCBjb250ZW50ID0gYXdhaXQgZnMucmVhZEZpbGUoc2FmZUZpbGVQYXRoKTtcbiAgICAgICAgICByZXR1cm4gcmVwbHkudHlwZShtaW1lTG9va3VwKHNhZmVGaWxlUGF0aCkgfHwgXCJhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW1cIikuc2VuZChjb250ZW50KTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIENTUiBmYWxsYmFjazogaW5kZXguaHRtbCDshJzruZlcbiAgICAgICAgY29uc3QgaW5kZXhQYXRoID0gcGF0aC5qb2luKHdlYkRpc3RQYXRoLCBcImluZGV4Lmh0bWxcIik7XG4gICAgICAgIHJldHVybiByZXBseS50eXBlKFwidGV4dC9odG1sXCIpLnNlbmQoYXdhaXQgZnMucmVhZEZpbGUoaW5kZXhQYXRoLCBcInV0Zi04XCIpKTtcbiAgICAgIH0sXG4gICAgfSk7XG5cbiAgICBjb25zb2xlLmxvZyhg4pyTIFN0YXRpYyB3ZWIgc2VydmVyIGNvbmZpZ3VyZWQgd2l0aCAke3NzckF2YWlsYWJsZSA/IFwiU1NSXCIgOiBcIkNTUiBvbmx5XCJ9IHN1cHBvcnRgKTtcbiAgfVxuXG4gIGNyZWF0ZUFwaUhhbmRsZXIoXG4gICAgYXBpOiBFeHRlbmRlZEFwaSxcbiAgICBjb25maWc6IFNvbmFtdUZhc3RpZnlDb25maWcsXG4gICAgbW9kZWxzOiBMb2FkZWRNb2RlbHMgPSB0aGlzLnN5bmNlci5tb2RlbHMsXG4gICAgZGVwZW5kZW5jaWVzOiBTb25hbXVIdHRwVmFsaWRhdG9yRGVwZW5kZW5jaWVzID0gZGVmYXVsdFNvbmFtdUh0dHBWYWxpZGF0b3JEZXBlbmRlbmNpZXMsXG4gICk6IChyZXF1ZXN0OiBGYXN0aWZ5UmVxdWVzdCwgcmVwbHk6IEZhc3RpZnlSZXBseSkgPT4gUHJvbWlzZTxBcGlNZXRob2RSZXN1bHQ+IHtcbiAgICBjb25zdCBwcmVwYXJlZFZhbGlkYXRvciA9IHRoaXMuZ2V0T3JDcmVhdGVIdHRwVmFsaWRhdG9yKGFwaSwgZGVwZW5kZW5jaWVzKTtcblxuICAgIHJldHVybiBhc3luYyAocmVxdWVzdDogRmFzdGlmeVJlcXVlc3QsIHJlcGx5OiBGYXN0aWZ5UmVwbHkpOiBQcm9taXNlPEFwaU1ldGhvZFJlc3VsdD4gPT4ge1xuICAgICAgY29uc3QgdmFsaWRhdG9yID1cbiAgICAgICAgcHJlcGFyZWRWYWxpZGF0b3IgaW5zdGFuY2VvZiBQcm9taXNlID8gYXdhaXQgcHJlcGFyZWRWYWxpZGF0b3IgOiBwcmVwYXJlZFZhbGlkYXRvcjtcbiAgICAgIC8vIENvbnRleHQg7IOd7ISxXG4gICAgICBjb25zdCBjb250ZXh0OiBDb250ZXh0ID0gYXdhaXQgdGhpcy5jcmVhdGVDb250ZXh0KGNvbmZpZywgcmVxdWVzdCwgcmVwbHkpO1xuXG4gICAgICByZXR1cm4gdGhpcy5hc3luY0xvY2FsU3RvcmFnZS5ydW4oeyBjb250ZXh0IH0sIGFzeW5jICgpID0+IHtcbiAgICAgICAgLy8gZ3VhcmRzIOyymOumrFxuICAgICAgICBydW5HdWFyZHMoe1xuICAgICAgICAgIGd1YXJkczogYXBpLm9wdGlvbnMuZ3VhcmRzLFxuICAgICAgICAgIGNvbmZpZyxcbiAgICAgICAgICByZXF1ZXN0LFxuICAgICAgICAgIGFwaSxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gcmVxdWVzdCDtjIzsi7FcbiAgICAgICAgY29uc3Qgd2hpY2ggPSBhcGkub3B0aW9ucy5odHRwTWV0aG9kID09PSBcIkdFVFwiID8gXCJxdWVyeVwiIDogXCJib2R5XCI7XG4gICAgICAgIGxldCByZXFCb2R5ID0gbmV3IE1hcDxzdHJpbmcsIEFwaUFyZ3VtZW50PigpO1xuICAgICAgICAvLyDtjIzsnbwg7JeF66Gc65OcIOyeiOuKlCDqsr3smrAg7J6E7IucIOuNsOydtO2EsFxuICAgICAgICBjb25zdCBmaWxlczogVXBsb2FkZWRSZXF1ZXN0RmlsZXMgPSB7XG4gICAgICAgICAgYnVmZmVyZWRGaWxlczogW10sXG4gICAgICAgICAgdXBsb2FkZWRGaWxlczogW10sXG4gICAgICAgIH07XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCBib2R5ID0gcmVxdWVzdFt3aGljaF0gPz8ge307XG4gICAgICAgICAgaWYgKGFwaS51cGxvYWRPcHRpb25zKSB7XG4gICAgICAgICAgICBjb25zdCBwYXJ0cyA9IHJlcXVlc3QucGFydHMoe1xuICAgICAgICAgICAgICBsaW1pdHM6IGFwaS51cGxvYWRPcHRpb25zLmxpbWl0cyxcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAvLyBGb3JtRGF0YeydmCBmaWVsZOuTpOydhCDsnoTsi5zroZwg7KCA7J6lXG4gICAgICAgICAgICBjb25zdCBmaWVsZHM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fTtcblxuICAgICAgICAgICAgaWYgKGFwaS51cGxvYWRPcHRpb25zLmNvbnN1bWUgPT09IFwiYnVmZmVyXCIgfHwgIWFwaS51cGxvYWRPcHRpb25zLmNvbnN1bWUpIHtcbiAgICAgICAgICAgICAgLy8gQnVmZmVyIOuqqOuTnDog66mU66qo66as7JeQIOuhnOuTnFxuICAgICAgICAgICAgICBmb3IgYXdhaXQgKGNvbnN0IHBhcnQgb2YgcGFydHMpIHtcbiAgICAgICAgICAgICAgICBpZiAocGFydC50eXBlID09PSBcImZpbGVcIikge1xuICAgICAgICAgICAgICAgICAgLy8gQ1JJVElDQUw6IO2MjOydvCDsiqTtirjrprzsnYQg7KaJ7IucIGNvbnN1bWXtlbTslbwg64uk7J2MIHBhcnTroZwg64SY7Ja06rCIIOyImCDsnojsnYxcbiAgICAgICAgICAgICAgICAgIC8vIOydtCDtmLjstpzsnbQg7JeG7Jy866m0IOyiheyihSBtdWx0aXBhcnQg7YyM7Iux7J20IHBlbmRpbmcg7IOB7YOc66GcIO2DgOyehOyVhOybgyDrsJzsg51cbiAgICAgICAgICAgICAgICAgIGNvbnN0IGJ1ZmZlciA9IGF3YWl0IHBhcnQudG9CdWZmZXIoKTtcbiAgICAgICAgICAgICAgICAgIGZpbGVzLmJ1ZmZlcmVkRmlsZXMucHVzaChuZXcgQnVmZmVyZWRGaWxlKHBhcnQsIGJ1ZmZlcikpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocGFydC50eXBlID09PSBcImZpZWxkXCIpIHtcbiAgICAgICAgICAgICAgICAgIGZpZWxkc1twYXJ0LmZpZWxkbmFtZV0gPSBTdHJpbmcocGFydC52YWx1ZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGFwaS51cGxvYWRPcHRpb25zLmNvbnN1bWUgPT09IFwic3RyZWFtXCIpIHtcbiAgICAgICAgICAgICAgLy8gU3RyZWFtIOuqqOuTnDog7KaJ7IucIOyggOyepeyGjOuhnCDsiqTtirjrpqzrsI1cbiAgICAgICAgICAgICAgY29uc3QgZGlza05hbWUgPSBhcGkudXBsb2FkT3B0aW9ucy5kZXN0aW5hdGlvbjtcbiAgICAgICAgICAgICAgY29uc3QgZGlzayA9IHRoaXMuc3RvcmFnZS51c2UoZGlza05hbWUpO1xuXG4gICAgICAgICAgICAgIC8vIOyasOyEoOyInOychDog642w7L2U66CI7J207YSwID4g7KCE7JetIOyEpOyglSA+IOq4sOuzuOqwklxuICAgICAgICAgICAgICBjb25zdCBrZXlHZW5lcmF0b3I6IEtleUdlbmVyYXRvciA9XG4gICAgICAgICAgICAgICAgYXBpLnVwbG9hZE9wdGlvbnMua2V5R2VuZXJhdG9yID8/XG4gICAgICAgICAgICAgICAgdGhpcy5jb25maWcuc2VydmVyLnN0b3JhZ2U/LmtleUdlbmVyYXRvciA/P1xuICAgICAgICAgICAgICAgIGRlZmF1bHRLZXlHZW5lcmF0b3I7XG5cbiAgICAgICAgICAgICAgZm9yIGF3YWl0IChjb25zdCBwYXJ0IG9mIHBhcnRzKSB7XG4gICAgICAgICAgICAgICAgaWYgKHBhcnQudHlwZSA9PT0gXCJmaWxlXCIpIHtcbiAgICAgICAgICAgICAgICAgIGNvbnN0IGtleSA9IGF3YWl0IGtleUdlbmVyYXRvcih7XG4gICAgICAgICAgICAgICAgICAgIGZpbGVuYW1lOiBwYXJ0LmZpbGVuYW1lLFxuICAgICAgICAgICAgICAgICAgICBtaW1ldHlwZTogcGFydC5taW1ldHlwZSxcbiAgICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgICBhd2FpdCBkaXNrLnB1dFN0cmVhbShrZXksIHBhcnQuZmlsZSwge1xuICAgICAgICAgICAgICAgICAgICBjb250ZW50VHlwZTogcGFydC5taW1ldHlwZSxcbiAgICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgICBjb25zdCB1cmwgPSBhd2FpdCBkaXNrLmdldFVybChrZXkpO1xuICAgICAgICAgICAgICAgICAgY29uc3Qgc2lnbmVkVXJsID0gYXdhaXQgZGlzay5nZXRTaWduZWRVcmwoa2V5KTtcblxuICAgICAgICAgICAgICAgICAgZmlsZXMudXBsb2FkZWRGaWxlcy5wdXNoKFxuICAgICAgICAgICAgICAgICAgICBuZXcgVXBsb2FkZWRGaWxlKHtcbiAgICAgICAgICAgICAgICAgICAgICBmaWxlbmFtZTogcGFydC5maWxlbmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICBtaW1ldHlwZTogcGFydC5taW1ldHlwZSxcbiAgICAgICAgICAgICAgICAgICAgICBzaXplOiBwYXJ0LmZpbGUuYnl0ZXNSZWFkLFxuICAgICAgICAgICAgICAgICAgICAgIHVybCxcbiAgICAgICAgICAgICAgICAgICAgICBzaWduZWRVcmwsXG4gICAgICAgICAgICAgICAgICAgICAga2V5LFxuICAgICAgICAgICAgICAgICAgICAgIGRpc2tOYW1lLFxuICAgICAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChwYXJ0LnR5cGUgPT09IFwiZmllbGRcIikge1xuICAgICAgICAgICAgICAgICAgZmllbGRzW3BhcnQuZmllbGRuYW1lXSA9IFN0cmluZyhwYXJ0LnZhbHVlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gcXProZwg7KSR7LKpIOq1rOyhsCDtjIzsi7E6IHBhcmFtc1tjYXRlZ29yeV0g4oaSIHsgcGFyYW1zOiB7IGNhdGVnb3J5OiBcInRlc3RcIiB9IH1cbiAgICAgICAgICAgIGNvbnN0IHFzID0gYXdhaXQgaW1wb3J0KFwicXNcIik7XG4gICAgICAgICAgICBjb25zdCBwYXJzZWQgPSBxcy5kZWZhdWx0LnBhcnNlKGZpZWxkcyk7XG4gICAgICAgICAgICBPYmplY3QuYXNzaWduKGJvZHksIHBhcnNlZCk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmVxQm9keSA9IHRvQXBpQXJndW1lbnRNYXAodmFsaWRhdG9yLnBhcnNlKGJvZHkpKTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIGNvbnN0IHsgWm9kRXJyb3IgfSA9IGF3YWl0IGltcG9ydChcInpvZFwiKTtcbiAgICAgICAgICBpZiAoZSBpbnN0YW5jZW9mIFpvZEVycm9yKSB7XG4gICAgICAgICAgICBjb25zdCB7IGh1bWFuaXplWm9kRXJyb3IgfSA9IGF3YWl0IGltcG9ydChcIi4uL3V0aWxzL3pvZC1lcnJvclwiKTtcbiAgICAgICAgICAgIGNvbnN0IG1lc3NhZ2VzID0gaHVtYW5pemVab2RFcnJvcihlKVxuICAgICAgICAgICAgICAubWFwKChpc3N1ZSkgPT4gaXNzdWUubWVzc2FnZSlcbiAgICAgICAgICAgICAgLmpvaW4oXCIgXCIpO1xuICAgICAgICAgICAgY29uc3QgeyBCYWRSZXF1ZXN0RXhjZXB0aW9uIH0gPSBhd2FpdCBpbXBvcnQoXCIuLi9leGNlcHRpb25zL3NvLWV4Y2VwdGlvbnNcIik7XG4gICAgICAgICAgICB0aHJvdyBuZXcgQmFkUmVxdWVzdEV4Y2VwdGlvbihcbiAgICAgICAgICAgICAgLyogU0FGRVRZOiBBUEkg642w7L2U66CI7J207YSw7JmAIFpvZCDqsoDspp3quLAg65Ox66GdIOqzhOyVveydtCDsnbQg6rCS7J2YIO2DgOyeheydhCDrs7TsnqXtlZzri6QuICovIG1lc3NhZ2VzIGFzIExvY2FsaXplZFN0cmluZyxcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHpvZEVycm9yOiBlLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhyb3cgZTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBDb250ZW50LVR5cGVcbiAgICAgICAgcmVwbHkudHlwZShhcGkub3B0aW9ucy5jb250ZW50VHlwZSA/PyBcImFwcGxpY2F0aW9uL2pzb25cIik7XG5cbiAgICAgICAgLy8gQ2FjaGUtQ29udHJvbCDtl6TrjZQg7ISk7KCVXG4gICAgICAgIGNvbnN0IGFwaUNhY2hlQ29uZmlnID0gdGhpcy5nZXRBcGlDYWNoZUNvbnRyb2woYXBpLCByZXF1ZXN0LCBjb25maWcpO1xuICAgICAgICBpZiAoYXBpQ2FjaGVDb25maWcpIHtcbiAgICAgICAgICBhcHBseUNhY2hlSGVhZGVycyhyZXBseSwgYXBpQ2FjaGVDb25maWcpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8g7JeF66Gc65OcIOyYteyFmOydtCDsnojripQg6rK97JqwIO2MjOydvCDrjbDsnbTthLDrpbwgQ29udGV4dOyXkCDstpTqsIBcbiAgICAgICAgaWYgKGFwaS51cGxvYWRPcHRpb25zKSB7XG4gICAgICAgICAgY29uc3QgY29uc3VtZSA9IGFwaS51cGxvYWRPcHRpb25zLmNvbnN1bWUgPz8gXCJidWZmZXJcIjtcbiAgICAgICAgICBpZiAoY29uc3VtZSA9PT0gXCJidWZmZXJcIikge1xuICAgICAgICAgICAgY29udGV4dC5idWZmZXJlZEZpbGVzID0gZmlsZXMuYnVmZmVyZWRGaWxlcztcbiAgICAgICAgICB9IGVsc2UgaWYgKGNvbnN1bWUgPT09IFwic3RyZWFtXCIpIHtcbiAgICAgICAgICAgIGNvbnRleHQudXBsb2FkZWRGaWxlcyA9IGZpbGVzLnVwbG9hZGVkRmlsZXM7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8g66qo6424IOuplOyGjOuTnCBhcmdzIOyDneyEse2VmOyXrCDtmLjstpxcbiAgICAgICAgY29uc3QgeyBBcGlQYXJhbVR5cGUgfSA9IGF3YWl0IGltcG9ydChcIi4uL3R5cGVzL3R5cGVzXCIpO1xuICAgICAgICBjb25zdCBhcmdzID0gYXBpLnBhcmFtZXRlcnMubWFwKChwYXJhbSkgPT4ge1xuICAgICAgICAgIC8vIENvbnRleHQg7J247KCd7IWYXG4gICAgICAgICAgaWYgKEFwaVBhcmFtVHlwZS5pc0NvbnRleHQocGFyYW0udHlwZSkpIHtcbiAgICAgICAgICAgIHJldHVybiBjb250ZXh0O1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gcmVxQm9keS5nZXQocGFyYW0ubmFtZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gdGhpcy5pbnZva2VNb2RlbE1ldGhvZChhcGksIGFyZ3MsIHJlcGx5LCBtb2RlbHMpO1xuICAgICAgfSk7XG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0T3JDcmVhdGVIdHRwVmFsaWRhdG9yKFxuICAgIGFwaTogRXh0ZW5kZWRBcGksXG4gICAgZGVwZW5kZW5jaWVzOiBTb25hbXVIdHRwVmFsaWRhdG9yRGVwZW5kZW5jaWVzLFxuICApOiBIdHRwVmFsaWRhdG9yIHwgUHJvbWlzZTxIdHRwVmFsaWRhdG9yPiB7XG4gICAgY29uc3QgY2FjaGVkID0gdGhpcy5odHRwVmFsaWRhdG9ycy5nZXQoYXBpKTtcbiAgICBpZiAoY2FjaGVkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiBjYWNoZWQ7XG4gICAgfVxuICAgIGNvbnN0IGV4aXN0aW5nID0gdGhpcy5wZW5kaW5nSHR0cFZhbGlkYXRvcnMuZ2V0KGFwaSk7XG4gICAgaWYgKGV4aXN0aW5nICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiBleGlzdGluZztcbiAgICB9XG4gICAgY29uc3QgcGVuZGluZyA9IHRoaXMuYnVpbGRIdHRwVmFsaWRhdG9yKGFwaSwgZGVwZW5kZW5jaWVzKTtcbiAgICB0aGlzLnBlbmRpbmdIdHRwVmFsaWRhdG9ycy5zZXQoYXBpLCBwZW5kaW5nKTtcbiAgICB2b2lkIHBlbmRpbmcudGhlbihcbiAgICAgICh2YWxpZGF0b3IpID0+IHtcbiAgICAgICAgdGhpcy5odHRwVmFsaWRhdG9ycy5zZXQoYXBpLCB2YWxpZGF0b3IpO1xuICAgICAgICB0aGlzLnBlbmRpbmdIdHRwVmFsaWRhdG9ycy5kZWxldGUoYXBpKTtcbiAgICAgIH0sXG4gICAgICAoKSA9PiB7XG4gICAgICAgIHRoaXMucGVuZGluZ0h0dHBWYWxpZGF0b3JzLmRlbGV0ZShhcGkpO1xuICAgICAgfSxcbiAgICApO1xuICAgIHJldHVybiBwZW5kaW5nO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBidWlsZEh0dHBWYWxpZGF0b3IoXG4gICAgYXBpOiBFeHRlbmRlZEFwaSxcbiAgICBkZXBlbmRlbmNpZXM6IFNvbmFtdUh0dHBWYWxpZGF0b3JEZXBlbmRlbmNpZXMsXG4gICk6IFByb21pc2U8SHR0cFZhbGlkYXRvcj4ge1xuICAgIGNvbnN0IHBvbGljeSA9IG5vcm1hbGl6ZVpvZENvbXBpbGVyUG9saWN5KHRoaXMuY29uZmlnLnZhbGlkYXRpb24/LnpvZENvbXBpbGVyKTtcbiAgICBjb25zdCBzb3VyY2VBb3QgPSBwcm9jZXNzLmVudi5IT1QgPT09IFwieWVzXCIgfHwgcHJvY2Vzcy5lbnYuVklURVNUID09PSBcInRydWVcIjtcbiAgICBpZiAocG9saWN5LmFwaSA9PT0gXCJhb3RcIiAmJiAhc291cmNlQW90KSB7XG4gICAgICBjb25zdCByZWdpc3RyeSA9IHRoaXMuYW90SHR0cFZhbGlkYXRvclJlZ2lzdHJ5ID8/IChhd2FpdCB0aGlzLmxvYWRBb3RIdHRwVmFsaWRhdG9yUmVnaXN0cnkoKSk7XG4gICAgICByZXR1cm4gdGhpcy5nZXRBb3RIdHRwVmFsaWRhdG9yKGFwaSwgcmVnaXN0cnkpO1xuICAgIH1cblxuICAgIHJldHVybiBhd2FpdCBkZXBlbmRlbmNpZXMuY3JlYXRlVmFsaWRhdG9yKHtcbiAgICAgIGFwaSxcbiAgICAgIHBvbGljeSxcbiAgICAgIHR5cGVzOiB0aGlzLnN5bmNlci50eXBlcyxcbiAgICAgIGFsbG93QW90U291cmNlRmFsbGJhY2s6IHNvdXJjZUFvdCxcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0QW90SHR0cFZhbGlkYXRvcihhcGk6IEV4dGVuZGVkQXBpLCByZWdpc3RyeTogSHR0cFZhbGlkYXRvclJlZ2lzdHJ5KTogSHR0cFZhbGlkYXRvciB7XG4gICAgY29uc3Qgcm91dGVLZXkgPSBnZXRIdHRwVmFsaWRhdG9yUm91dGVLZXkoYXBpKTtcbiAgICBjb25zdCB2YWxpZGF0b3IgPSByZWdpc3RyeS52YWxpZGF0b3JzLmdldChyb3V0ZUtleSk7XG4gICAgaWYgKHZhbGlkYXRvciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEhUVFAgdmFsaWRhdG9yIHJlZ2lzdHJ5IGlzIG1pc3NpbmcgJHtyb3V0ZUtleX1gKTtcbiAgICB9XG4gICAgcmV0dXJuIHZhbGlkYXRvcjtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgbG9hZEFvdEh0dHBWYWxpZGF0b3JSZWdpc3RyeShcbiAgICBhcGlzOiByZWFkb25seSBFeHRlbmRlZEFwaVtdID0gdGhpcy5zeW5jZXIuYXBpcyxcbiAgICBkZXBlbmRlbmNpZXM6IFNvbmFtdUh0dHBWYWxpZGF0b3JEZXBlbmRlbmNpZXMgPSBkZWZhdWx0U29uYW11SHR0cFZhbGlkYXRvckRlcGVuZGVuY2llcyxcbiAgKTogUHJvbWlzZTxIdHRwVmFsaWRhdG9yUmVnaXN0cnk+IHtcbiAgICBjb25zdCB7IHBhdGhUb0ZpbGVVUkwgfSA9IGF3YWl0IGltcG9ydChcIm5vZGU6dXJsXCIpO1xuICAgIGNvbnN0IHJlZ2lzdHJ5UGF0aCA9IHBhdGguam9pbihcbiAgICAgIHRoaXMuYXBpUm9vdFBhdGgsXG4gICAgICBcImRpc3QvYXBwbGljYXRpb24vc29uYW11LnZhbGlkYXRvcnMuZ2VuZXJhdGVkLmpzXCIsXG4gICAgKTtcbiAgICBpZiAoIShhd2FpdCBleGlzdHMocmVnaXN0cnlQYXRoKSkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgR2VuZXJhdGVkIEhUVFAgdmFsaWRhdG9yIHJlZ2lzdHJ5IG5vdCBmb3VuZDogJHtyZWdpc3RyeVBhdGh9YCk7XG4gICAgfVxuXG4gICAgY29uc3QgaW1wb3J0ZWQgPVxuICAgICAgLyogU0FGRVRZOiBBUEkg642w7L2U66CI7J207YSw7JmAIFpvZCDqsoDspp3quLAg65Ox66GdIOqzhOyVveydtCDsnbQg6rCS7J2YIO2DgOyeheydhCDrs7TsnqXtlZzri6QuICovIChhd2FpdCBpbXBvcnQoXG4gICAgICAgIHBhdGhUb0ZpbGVVUkwocmVnaXN0cnlQYXRoKS5ocmVmXG4gICAgICApKSBhcyB7XG4gICAgICAgIGZpbmdlcnByaW50PzogdW5rbm93bjtcbiAgICAgICAgdmFsaWRhdG9ycz86IHVua25vd247XG4gICAgICB9O1xuICAgIGlmICghaXNTdHJpbmdWYWx1ZShpbXBvcnRlZC5maW5nZXJwcmludCkgfHwgIShpbXBvcnRlZC52YWxpZGF0b3JzIGluc3RhbmNlb2YgTWFwKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIGdlbmVyYXRlZCBIVFRQIHZhbGlkYXRvciByZWdpc3RyeTogJHtyZWdpc3RyeVBhdGh9YCk7XG4gICAgfVxuICAgIGZvciAoY29uc3QgW2tleSwgdmFsaWRhdG9yXSBvZiBpbXBvcnRlZC52YWxpZGF0b3JzKSB7XG4gICAgICBpZiAoXG4gICAgICAgICFpc1N0cmluZ1ZhbHVlKGtleSkgfHxcbiAgICAgICAgIWlzT2JqZWN0VmFsdWUodmFsaWRhdG9yKSB8fFxuICAgICAgICB2YWxpZGF0b3IgPT09IG51bGwgfHxcbiAgICAgICAgIShcInBhcnNlXCIgaW4gdmFsaWRhdG9yKSB8fFxuICAgICAgICAhaXNGdW5jdGlvblZhbHVlKHZhbGlkYXRvci5wYXJzZSlcbiAgICAgICkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgSFRUUCB2YWxpZGF0b3IgcmVnaXN0cnkgZW50cnk6ICR7U3RyaW5nKGtleSl9YCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgcmVnaXN0cnk6IEh0dHBWYWxpZGF0b3JSZWdpc3RyeSA9IHtcbiAgICAgIGZpbmdlcnByaW50OiBpbXBvcnRlZC5maW5nZXJwcmludCxcbiAgICAgIHZhbGlkYXRvcnM6IGltcG9ydGVkLnZhbGlkYXRvcnMsXG4gICAgfTtcbiAgICBkZXBlbmRlbmNpZXMuYXNzZXJ0UmVnaXN0cnkoYXBpcywgcmVnaXN0cnkpO1xuICAgIHJldHVybiByZWdpc3RyeTtcbiAgfVxuXG4gIGFzeW5jIHJlZnJlc2hIdHRwVmFsaWRhdG9ycyhcbiAgICBkZXBlbmRlbmNpZXM6IFNvbmFtdUh0dHBWYWxpZGF0b3JEZXBlbmRlbmNpZXMgPSBkZWZhdWx0U29uYW11SHR0cFZhbGlkYXRvckRlcGVuZGVuY2llcyxcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgcG9saWN5ID0gbm9ybWFsaXplWm9kQ29tcGlsZXJQb2xpY3kodGhpcy5jb25maWcudmFsaWRhdGlvbj8uem9kQ29tcGlsZXIpO1xuICAgIGNvbnN0IHNvdXJjZUFvdCA9IHByb2Nlc3MuZW52LkhPVCA9PT0gXCJ5ZXNcIiB8fCBwcm9jZXNzLmVudi5WSVRFU1QgPT09IFwidHJ1ZVwiO1xuICAgIGNvbnN0IG5leHRBcGlzID0gWy4uLnRoaXMuc3luY2VyLmFwaXNdO1xuICAgIGNvbnN0IG5leHRNb2RlbHMgPSB7IC4uLnRoaXMuc3luY2VyLm1vZGVscyB9O1xuICAgIGNvbnN0IHJlc3RBcGlzID0gbmV4dEFwaXMuZmlsdGVyKChhcGkpID0+IGFwaS53ZWJzb2NrZXRPcHRpb25zID09PSB1bmRlZmluZWQpO1xuICAgIGNvbnN0IG5leHQgPSBuZXcgV2Vha01hcDxFeHRlbmRlZEFwaSwgSHR0cFZhbGlkYXRvcj4oKTtcbiAgICBsZXQgbmV4dEFvdFJlZ2lzdHJ5OiBIdHRwVmFsaWRhdG9yUmVnaXN0cnkgfCB1bmRlZmluZWQ7XG5cbiAgICBpZiAocG9saWN5LmFwaSA9PT0gXCJhb3RcIiAmJiAhc291cmNlQW90KSB7XG4gICAgICBjb25zdCByZWdpc3RyeSA9IGF3YWl0IHRoaXMubG9hZEFvdEh0dHBWYWxpZGF0b3JSZWdpc3RyeShuZXh0QXBpcywgZGVwZW5kZW5jaWVzKTtcbiAgICAgIGZvciAoY29uc3QgYXBpIG9mIHJlc3RBcGlzKSB7XG4gICAgICAgIG5leHQuc2V0KGFwaSwgdGhpcy5nZXRBb3RIdHRwVmFsaWRhdG9yKGFwaSwgcmVnaXN0cnkpKTtcbiAgICAgIH1cbiAgICAgIG5leHRBb3RSZWdpc3RyeSA9IHJlZ2lzdHJ5O1xuICAgIH0gZWxzZSB7XG4gICAgICBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgICAgcmVzdEFwaXMubWFwKGFzeW5jIChhcGkpID0+IHtcbiAgICAgICAgICBjb25zdCB2YWxpZGF0b3IgPSBhd2FpdCB0aGlzLmJ1aWxkSHR0cFZhbGlkYXRvcihhcGksIGRlcGVuZGVuY2llcyk7XG4gICAgICAgICAgbmV4dC5zZXQoYXBpLCB2YWxpZGF0b3IpO1xuICAgICAgICB9KSxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gdmFsaWRhdG9y7JmAIOqwmeydgCByZXZpc2lvbuydmCBBUEkvbW9kZWwgc25hcHNob3TsnYQg7ZWo6ruYIOqzteqwnO2VtCBITVIg7KSR6rCEIOyDge2DnOulvCDsiKjquYHri4jri6QuXG4gICAgdGhpcy5odHRwVmFsaWRhdG9ycyA9IG5leHQ7XG4gICAgdGhpcy5wZW5kaW5nSHR0cFZhbGlkYXRvcnMgPSBuZXcgV2Vha01hcCgpO1xuICAgIHRoaXMuYW90SHR0cFZhbGlkYXRvclJlZ2lzdHJ5ID0gbmV4dEFvdFJlZ2lzdHJ5O1xuICAgIHRoaXMucHJlcGFyZWRBcGlzID0gbmV4dEFwaXM7XG4gICAgdGhpcy5wcmVwYXJlZE1vZGVscyA9IG5leHRNb2RlbHM7XG4gIH1cblxuICAvLyBXUyBwYXRo66W8IOydvOuwmCBIVFRQIEdFVOycvOuhnCDtmLjstpztlZwg6rK97JqwIDQyNiArIFVwZ3JhZGUg7Zek642U66GcIOuqheyLnOyggeycvOuhnCB3ZWJzb2NrZXQg7KCR7IaN7J2EIOycoOuPhO2VqFxuICBwcml2YXRlIGNyZWF0ZVdlYlNvY2tldFVwZ3JhZGVSZXF1aXJlZEhhbmRsZXIoKSB7XG4gICAgcmV0dXJuIGFzeW5jIChfcmVxdWVzdDogRmFzdGlmeVJlcXVlc3QsIHJlcGx5OiBGYXN0aWZ5UmVwbHkpOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgICAgIHJlcGx5LmhlYWRlcihcImNvbm5lY3Rpb25cIiwgXCJVcGdyYWRlXCIpLmhlYWRlcihcInVwZ3JhZGVcIiwgXCJ3ZWJzb2NrZXRcIikuc3RhdHVzKDQyNikuc2VuZCh7XG4gICAgICAgIG1lc3NhZ2U6IFwiV2ViU29ja2V0IHVwZ3JhZGUgcmVxdWlyZWRcIixcbiAgICAgIH0pO1xuICAgIH07XG4gIH1cblxuICAvLyBkZXYg66qo65Oc7J2YIGNhdGNoLWFsbCB3c0hhbmRsZXLsl5DshJwg7Iuk7KCcIFdTIEFQSeuhnCDrlJTsiqTtjKjsuZjtlaguIOunpOy5reuQmOuKlCByb3V0ZeqwgCDsl4bsnLzrqbQgMTAwOOuhnCDri6vsnYxcbiAgcHJpdmF0ZSBhc3luYyBoYW5kbGVEZXZXZWJTb2NrZXRSZXF1ZXN0KFxuICAgIHNvY2tldDogV2ViU29ja2V0LFxuICAgIHJlcXVlc3Q6IEZhc3RpZnlSZXF1ZXN0LFxuICAgIGNvbmZpZzogU29uYW11RmFzdGlmeUNvbmZpZyxcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgbWF0Y2hlZEFwaSA9IHRoaXMuZmluZE1hdGNoZWRBcGkocmVxdWVzdCwgdGhpcy5zeW5jZXIuYXBpcywgdGhpcy5zeW5jZXIubW9kZWxzKTtcbiAgICBpZiAoIW1hdGNoZWRBcGk/LndlYnNvY2tldE9wdGlvbnMpIHtcbiAgICAgIGNvbnN0IHRyYWNlQ29udGV4dCA9IHRoaXMud2Vic29ja2V0UnVudGltZS50ZWxlbWV0cnlDb250cm9sbGVyLmNyZWF0ZUNvbm5lY3Rpb25Db250ZXh0KHtcbiAgICAgICAgaGVhZGVyczogcmVxdWVzdC5oZWFkZXJzLFxuICAgICAgfSk7XG4gICAgICB0aGlzLndlYnNvY2tldFJ1bnRpbWUudGVsZW1ldHJ5Q29udHJvbGxlci5lbWl0KHtcbiAgICAgICAgbmFtZTogXCJ3cy5jb25uZWN0aW9uLnJlamVjdGVkXCIsXG4gICAgICAgIGxldmVsOiBcIndhcm5cIixcbiAgICAgICAgZGV0YWlsOiB7XG4gICAgICAgICAgcmVhc29uOiBcInJvdXRlTm90Rm91bmRcIixcbiAgICAgICAgICBwYXRoOiByZXF1ZXN0LnVybCxcbiAgICAgICAgfSxcbiAgICAgICAgdHJhY2VJZDogdHJhY2VDb250ZXh0LnRyYWNlSWQsXG4gICAgICAgIHNwYW5JZDogdHJhY2VDb250ZXh0LnNwYW5JZCxcbiAgICAgICAgcGFyZW50U3BhbklkOiB0cmFjZUNvbnRleHQucGFyZW50U3BhbklkLFxuICAgICAgICBzYW1wbGVkOiB0cmFjZUNvbnRleHQuc2FtcGxlZCxcbiAgICAgIH0pO1xuICAgICAgc29ja2V0LmNsb3NlKDEwMDgsIFwiV2ViU29ja2V0IHJvdXRlIG5vdCBmb3VuZFwiKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBoYW5kbGVyID0gdGhpcy5jcmVhdGVXZWJTb2NrZXRIYW5kbGVyKG1hdGNoZWRBcGksIGNvbmZpZyk7XG4gICAgYXdhaXQgaGFuZGxlcih7IHNvY2tldCB9LCByZXF1ZXN0KTtcbiAgfVxuXG4gIC8vIFdTIHJvdXRlIO2VuOuTpOufrOydmCDsi6Ttlokg7Iic7ISc66W8IOqzoOygle2VqDpcbiAgLy8gMSkgcXVlcnkgcGFyYW0g7YyM7Iux7J2EIGFjdGl2YXRpb24g7KCE7JeQIOuBneuCtCBoYW5kc2hha2Ug7Iuk7Yyo6rCAIHJlZ2lzdHJ57JeQIOuFuOy2nOuQmOyngCDslYrqsowg7ZWoXG4gIC8vIDIpIGBhY3RpdmU6IGZhbHNlYOuhnCDrqLzsoIAg65Ox66Gd7ZWcIOuSpCBjb250ZXh0IOyViOyXkOyEnCBndWFyZOulvCDsi6TtlontlbQg7J247KadIOygleuztOulvCDssLjsobDtlaAg7IiYIOyeiOqyjCDtlahcbiAgLy8gMykgY29udGV4dC9ndWFyZCDspIDruYTqsIAg64Gd64KcIOuSpCBgYWN0aXZhdGUoKWDtlbQg67iM66Gc65Oc7LqQ7Iqk7Yq46rCAIOy0iOq4sO2ZlCDspJHqsIQg7IOB7YOc66W8IOuztOyngCDrqrvtlZjqsowg7ZWoXG4gIC8vIOyXkOufrCDrsJzsg50g7Iuc7JeQ64qUIHJlc29sdmVXZWJTb2NrZXRDbG9zZURlc2NyaXB0b3Ig7KCV7LGF7JeQIOuUsOudvCBjbG9zZSBjb2Rl66W8IOunpO2Vke2VqFxuICBjcmVhdGVXZWJTb2NrZXRIYW5kbGVyRm9yVGVzdGluZyhhcGk6IEV4dGVuZGVkQXBpLCBjb25maWc6IFNvbmFtdUZhc3RpZnlDb25maWcpIHtcbiAgICByZXR1cm4gdGhpcy5jcmVhdGVXZWJTb2NrZXRIYW5kbGVyKGFwaSwgY29uZmlnKTtcbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlV2ViU29ja2V0SGFuZGxlcihhcGk6IEV4dGVuZGVkQXBpLCBjb25maWc6IFNvbmFtdUZhc3RpZnlDb25maWcpIHtcbiAgICByZXR1cm4gYXN5bmMgKFxuICAgICAgY29ubmVjdGlvbjoge1xuICAgICAgICBzb2NrZXQ6IFdlYlNvY2tldDtcbiAgICAgIH0sXG4gICAgICByZXF1ZXN0OiBGYXN0aWZ5UmVxdWVzdCxcbiAgICApOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgICAgIGNvbnN0IHNvY2tldCA9IGNvbm5lY3Rpb24uc29ja2V0O1xuICAgICAgbGV0IHdzQ29udGV4dDogV2ViU29ja2V0Q29udGV4dDxvYmplY3QsIG9iamVjdD4gfCBudWxsID0gbnVsbDtcbiAgICAgIGxldCByYXdXczogUmV0dXJuVHlwZTxXZWJTb2NrZXRSdW50aW1lW1wicmVnaXN0ZXJDb25uZWN0aW9uXCJdPiB8IG51bGwgPSBudWxsO1xuICAgICAgbGV0IHByZVJlZ2lzdGVyUGhhc2U6IFwiZ3VhcmRcIiB8IFwicXVlcnlcIiB8IFwicmVnaXN0ZXJcIiB8IFwiaGFuZGxlclwiID0gXCJndWFyZFwiO1xuICAgICAgbGV0IHRyYWNlQ29udGV4dDogV2ViU29ja2V0VGVsZW1ldHJ5Q29ubmVjdGlvbkNvbnRleHQgPSB7fTtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgdHJhY2VDb250ZXh0ID0gdGhpcy53ZWJzb2NrZXRSdW50aW1lLnRlbGVtZXRyeUNvbnRyb2xsZXIuY3JlYXRlQ29ubmVjdGlvbkNvbnRleHQoe1xuICAgICAgICAgIGhlYWRlcnM6IHJlcXVlc3QuaGVhZGVycyxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgcHJlUmVnaXN0ZXJQaGFzZSA9IFwicXVlcnlcIjtcbiAgICAgICAgY29uc3QgcmVxQm9keSA9IGF3YWl0IHRoaXMucGFyc2VXZWJTb2NrZXRSZXF1ZXN0UGFyYW1zKGFwaSwgcmVxdWVzdCk7XG4gICAgICAgIHByZVJlZ2lzdGVyUGhhc2UgPSBcInJlZ2lzdGVyXCI7XG4gICAgICAgIHJhd1dzID0gdGhpcy53ZWJzb2NrZXRSdW50aW1lLnJlZ2lzdGVyQ29ubmVjdGlvbihzb2NrZXQsIHtcbiAgICAgICAgICBvdXRFdmVudHM6IGFwaS53ZWJzb2NrZXRPcHRpb25zIS5vdXRFdmVudHMsXG4gICAgICAgICAgaW5FdmVudHM6IGFwaS53ZWJzb2NrZXRPcHRpb25zIS5pbkV2ZW50cyxcbiAgICAgICAgICBuYW1lc3BhY2U6IGFwaS53ZWJzb2NrZXRPcHRpb25zIS5uYW1lc3BhY2UsXG4gICAgICAgICAgaGVhcnRiZWF0OiBhcGkud2Vic29ja2V0T3B0aW9ucyEuaGVhcnRiZWF0LFxuICAgICAgICAgIGFjdGl2ZTogZmFsc2UsXG4gICAgICAgICAgdHJhY2VJZDogdHJhY2VDb250ZXh0LnRyYWNlSWQsXG4gICAgICAgICAgc3BhbklkOiB0cmFjZUNvbnRleHQuc3BhbklkLFxuICAgICAgICAgIHBhcmVudFNwYW5JZDogdHJhY2VDb250ZXh0LnBhcmVudFNwYW5JZCxcbiAgICAgICAgICBzYW1wbGVkOiB0cmFjZUNvbnRleHQuc2FtcGxlZCxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgY29uc3Qgc2NvcGVkV3MgPSB0aGlzLmNyZWF0ZVNjb3BlZFdlYlNvY2tldENvbm5lY3Rpb24ocmF3V3MsICgpID0+IHdzQ29udGV4dCk7XG4gICAgICAgIHdzQ29udGV4dCA9IGF3YWl0IHRoaXMuY3JlYXRlV2ViU29ja2V0Q29udGV4dChjb25maWcsIHJlcXVlc3QsIHNjb3BlZFdzKTtcblxuICAgICAgICBhd2FpdCB0aGlzLmFzeW5jTG9jYWxTdG9yYWdlLnJ1bih7IGNvbnRleHQ6IHdzQ29udGV4dCB9LCBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgcnVuR3VhcmRzKHtcbiAgICAgICAgICAgIGd1YXJkczogYXBpLm9wdGlvbnMuZ3VhcmRzLFxuICAgICAgICAgICAgY29uZmlnLFxuICAgICAgICAgICAgcmVxdWVzdCxcbiAgICAgICAgICAgIGFwaSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy53ZWJzb2NrZXRSdW50aW1lLmFjdGl2YXRlQ29ubmVjdGlvbihyYXdXcy5pZCk7XG4gICAgICAgIHByZVJlZ2lzdGVyUGhhc2UgPSBcImhhbmRsZXJcIjtcblxuICAgICAgICBjb25zdCB7IEFwaVBhcmFtVHlwZSB9ID0gYXdhaXQgaW1wb3J0KFwiLi4vdHlwZXMvdHlwZXNcIik7XG4gICAgICAgIGNvbnN0IGFyZ3MgPSBhcGkucGFyYW1ldGVycy5tYXAoKHBhcmFtKSA9PiB7XG4gICAgICAgICAgaWYgKEFwaVBhcmFtVHlwZS5pc0NvbnRleHQocGFyYW0udHlwZSkpIHtcbiAgICAgICAgICAgIHJldHVybiB3c0NvbnRleHQ7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuIHJlcUJvZHkuZ2V0KHBhcmFtLm5hbWUpO1xuICAgICAgICB9KTtcblxuICAgICAgICBhd2FpdCB0aGlzLmFzeW5jTG9jYWxTdG9yYWdlLnJ1bih7IGNvbnRleHQ6IHdzQ29udGV4dCB9LCBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgYXdhaXQgdGhpcy5pbnZva2VNb2RlbE1ldGhvZChhcGksIGFyZ3MpO1xuICAgICAgICB9KTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGNvbnN0IGNsb3NlRGVzY3JpcHRvciA9IHJlc29sdmVXZWJTb2NrZXRDbG9zZURlc2NyaXB0b3IoZXJyb3IpO1xuICAgICAgICBpZiAoIXJhd1dzKSB7XG4gICAgICAgICAgdGhpcy53ZWJzb2NrZXRSdW50aW1lLnRlbGVtZXRyeUNvbnRyb2xsZXIuZW1pdCh7XG4gICAgICAgICAgICBuYW1lOiBcIndzLmNvbm5lY3Rpb24ucmVqZWN0ZWRcIixcbiAgICAgICAgICAgIGxldmVsOiBjbG9zZURlc2NyaXB0b3IubG9nTGV2ZWwgPT09IFwid2FyblwiID8gXCJ3YXJuXCIgOiBcImVycm9yXCIsXG4gICAgICAgICAgICBkZXRhaWw6IHtcbiAgICAgICAgICAgICAgcmVhc29uOiBwcmVSZWdpc3RlclBoYXNlLFxuICAgICAgICAgICAgICBjb2RlOiBjbG9zZURlc2NyaXB0b3IuY29kZSxcbiAgICAgICAgICAgICAgcGF0aDogYXBpLnBhdGgsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgdHJhY2VJZDogdHJhY2VDb250ZXh0LnRyYWNlSWQsXG4gICAgICAgICAgICBzcGFuSWQ6IHRyYWNlQ29udGV4dC5zcGFuSWQsXG4gICAgICAgICAgICBwYXJlbnRTcGFuSWQ6IHRyYWNlQ29udGV4dC5wYXJlbnRTcGFuSWQsXG4gICAgICAgICAgICBzYW1wbGVkOiB0cmFjZUNvbnRleHQuc2FtcGxlZCxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChyYXdXcykge1xuICAgICAgICAgIHJhd1dzLmNsb3NlKGNsb3NlRGVzY3JpcHRvci5jb2RlLCBjbG9zZURlc2NyaXB0b3IucmVhc29uKTtcbiAgICAgICAgfSBlbHNlIGlmIChzb2NrZXQucmVhZHlTdGF0ZSA8IDIpIHtcbiAgICAgICAgICBzb2NrZXQuY2xvc2UoY2xvc2VEZXNjcmlwdG9yLmNvZGUsIGNsb3NlRGVzY3JpcHRvci5yZWFzb24pO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuc2VydmVyPy5sb2cpIHtcbiAgICAgICAgICBjb25zdCBwYXlsb2FkID0ge1xuICAgICAgICAgICAgZXJyOiBlcnJvcixcbiAgICAgICAgICAgIG1vZGVsTmFtZTogYXBpLm1vZGVsTmFtZSxcbiAgICAgICAgICAgIG1ldGhvZE5hbWU6IGFwaS5tZXRob2ROYW1lLFxuICAgICAgICAgICAgcGF0aDogYXBpLnBhdGgsXG4gICAgICAgICAgfTtcbiAgICAgICAgICBpZiAoY2xvc2VEZXNjcmlwdG9yLmxvZ0xldmVsID09PSBcIndhcm5cIikge1xuICAgICAgICAgICAgdGhpcy5zZXJ2ZXIubG9nLndhcm4ocGF5bG9hZCwgY2xvc2VEZXNjcmlwdG9yLnJlYXNvbik7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuc2VydmVyLmxvZy5lcnJvcihwYXlsb2FkLCBjbG9zZURlc2NyaXB0b3IucmVhc29uKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaWYgKGNsb3NlRGVzY3JpcHRvci5sb2dMZXZlbCA9PT0gXCJ3YXJuXCIpIHtcbiAgICAgICAgICAgIGNvbnNvbGUud2FybihjbG9zZURlc2NyaXB0b3IucmVhc29uLCBlcnJvcik7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoY2xvc2VEZXNjcmlwdG9yLnJlYXNvbiwgZXJyb3IpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH07XG4gIH1cblxuICAvLyBvbk1lc3NhZ2Uvb25DbG9zZeyymOufvCDri6TrpbggdGlja+yXkOyEnCDsi6TtlonrkJjripQgY2FsbGJhY2vsnYAgQUxTIGNvbnRleHTqsIAg64GK6riw66+A66GcIHdyYXBwZXLsl5DshJwgYGFzeW5jTG9jYWxTdG9yYWdlLnJ1bmDsnLzroZwg64uk7IucIOqwkOyLuCDrs7Xsm5DtlahcbiAgLy8gcHVibGlzaC9qb2luL2xlYXZlL3NldFVzZXJJZCDqsJnsnYAg7KaJ7IucIOyLpO2WiSBBUEnripQg64uo7IicIOychOyehOunjCDtlZjqs6AsIGRlZmVycmVkIGNhbGxiYWNr7JeQ66eMIGNvbnRleHQg67O17JuQ7J2EIOyggeyaqe2VqFxuICBwcml2YXRlIGNyZWF0ZVNjb3BlZFdlYlNvY2tldENvbm5lY3Rpb248VE91dCBleHRlbmRzIG9iamVjdCwgVEluIGV4dGVuZHMgb2JqZWN0PihcbiAgICB3czogV2ViU29ja2V0Q29ubmVjdGlvbjxUT3V0LCBUSW4+LFxuICAgIGdldENvbnRleHQ6ICgpID0+IFdlYlNvY2tldENvbnRleHQgfCBudWxsLFxuICApOiBXZWJTb2NrZXRDb25uZWN0aW9uPFRPdXQsIFRJbj4ge1xuICAgIGNvbnN0IHRlbGVtZXRyeUNvbnRyb2xsZXIgPSB0aGlzLndlYnNvY2tldFJ1bnRpbWVWYWx1ZT8udGVsZW1ldHJ5Q29udHJvbGxlcjtcbiAgICBjb25zdCBydW5JbkNvbnRleHQgPSA8VD4oY2FsbGJhY2s6ICgpID0+IFQpOiBUID0+IHtcbiAgICAgIGNvbnN0IGNvbnRleHQgPSBnZXRDb250ZXh0KCk7XG4gICAgICBpZiAoIWNvbnRleHQpIHtcbiAgICAgICAgcmV0dXJuIGNhbGxiYWNrKCk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0aGlzLmFzeW5jTG9jYWxTdG9yYWdlLnJ1bih7IGNvbnRleHQgfSwgY2FsbGJhY2spO1xuICAgIH07XG5cbiAgICByZXR1cm4ge1xuICAgICAgZ2V0IGlkKCkge1xuICAgICAgICByZXR1cm4gd3MuaWQ7XG4gICAgICB9LFxuICAgICAgZ2V0IG5hbWVzcGFjZSgpIHtcbiAgICAgICAgcmV0dXJuIHdzLm5hbWVzcGFjZTtcbiAgICAgIH0sXG4gICAgICBnZXQgY2xvc2VkKCkge1xuICAgICAgICByZXR1cm4gd3MuY2xvc2VkO1xuICAgICAgfSxcbiAgICAgIGdldCB1c2VySWQoKSB7XG4gICAgICAgIHJldHVybiB3cy51c2VySWQ7XG4gICAgICB9LFxuICAgICAgdHJhbnNwb3J0OiBcIndzXCIsXG4gICAgICBwdWJsaXNoVW50eXBlZChldmVudCwgZGF0YSkge1xuICAgICAgICB3cy5wdWJsaXNoVW50eXBlZChldmVudCwgZGF0YSk7XG4gICAgICB9LFxuICAgICAgY2xvc2UoY29kZSwgcmVhc29uKSB7XG4gICAgICAgIHdzLmNsb3NlKGNvZGUsIHJlYXNvbik7XG4gICAgICB9LFxuICAgICAgb25DbG9zZShjYWxsYmFjaykge1xuICAgICAgICB3cy5vbkNsb3NlKCgpID0+IHJ1bkluQ29udGV4dChjYWxsYmFjaykpO1xuICAgICAgfSxcbiAgICAgIG9uTWVzc2FnZShldmVudCwgaGFuZGxlcikge1xuICAgICAgICB3cy5vbk1lc3NhZ2UoZXZlbnQsIChkYXRhLCBtZXNzYWdlVHJhY2VDb250ZXh0KSA9PlxuICAgICAgICAgIHJ1bkluQ29udGV4dChhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBldmVudE5hbWUgPSBTdHJpbmcoZXZlbnQpO1xuICAgICAgICAgICAgY29uc3QgdHJhY2VDb250ZXh0ID0gbWVzc2FnZVRyYWNlQ29udGV4dCA/PyBnZXRXZWJTb2NrZXRUZWxlbWV0cnlDb250ZXh0KHdzKTtcbiAgICAgICAgICAgIGNvbnN0IHN0YXJ0ZWRBdCA9IHBlcmZvcm1hbmNlLm5vdygpO1xuXG4gICAgICAgICAgICB0ZWxlbWV0cnlDb250cm9sbGVyPy5lbWl0KHtcbiAgICAgICAgICAgICAgbmFtZTogXCJ3cy5oYW5kbGVyLnN0YXJ0ZWRcIixcbiAgICAgICAgICAgICAgbGV2ZWw6IFwiZGVidWdcIixcbiAgICAgICAgICAgICAgY29ubmVjdGlvbklkOiB3cy5pZCxcbiAgICAgICAgICAgICAgbmFtZXNwYWNlOiB3cy5uYW1lc3BhY2UsXG4gICAgICAgICAgICAgIHVzZXJJZDogd3MudXNlcklkLFxuICAgICAgICAgICAgICBkZXRhaWw6IHsgZXZlbnQ6IGV2ZW50TmFtZSB9LFxuICAgICAgICAgICAgICAuLi50cmFjZUNvbnRleHQsXG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgaGFuZGxlcihkYXRhLCBtZXNzYWdlVHJhY2VDb250ZXh0KTtcbiAgICAgICAgICAgICAgY29uc3QgZHVyYXRpb25NcyA9IHBlcmZvcm1hbmNlLm5vdygpIC0gc3RhcnRlZEF0O1xuICAgICAgICAgICAgICB0ZWxlbWV0cnlDb250cm9sbGVyPy5lbWl0KHtcbiAgICAgICAgICAgICAgICBuYW1lOiBcIndzLmhhbmRsZXIuY29tcGxldGVkXCIsXG4gICAgICAgICAgICAgICAgbGV2ZWw6IFwiZGVidWdcIixcbiAgICAgICAgICAgICAgICBjb25uZWN0aW9uSWQ6IHdzLmlkLFxuICAgICAgICAgICAgICAgIG5hbWVzcGFjZTogd3MubmFtZXNwYWNlLFxuICAgICAgICAgICAgICAgIHVzZXJJZDogd3MudXNlcklkLFxuICAgICAgICAgICAgICAgIGRldGFpbDogeyBldmVudDogZXZlbnROYW1lIH0sXG4gICAgICAgICAgICAgICAgLi4udHJhY2VDb250ZXh0LFxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgdGVsZW1ldHJ5Q29udHJvbGxlcj8ucmVjb3JkU3Bhbih7XG4gICAgICAgICAgICAgICAgb3BlcmF0aW9uTmFtZTogXCJ3cy5tZXNzYWdlLnByb2Nlc3NcIixcbiAgICAgICAgICAgICAgICBraW5kOiBcImludGVybmFsXCIsXG4gICAgICAgICAgICAgICAgZHVyYXRpb25NcyxcbiAgICAgICAgICAgICAgICBzdGF0dXM6IFwidW5zZXRcIixcbiAgICAgICAgICAgICAgICBjb25uZWN0aW9uSWQ6IHdzLmlkLFxuICAgICAgICAgICAgICAgIG5hbWVzcGFjZTogd3MubmFtZXNwYWNlLFxuICAgICAgICAgICAgICAgIHVzZXJJZDogd3MudXNlcklkLFxuICAgICAgICAgICAgICAgIGF0dHJpYnV0ZXM6IHsgZXZlbnQ6IGV2ZW50TmFtZSB9LFxuICAgICAgICAgICAgICAgIC4uLnRyYWNlQ29udGV4dCxcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICBjb25zdCBkdXJhdGlvbk1zID0gcGVyZm9ybWFuY2Uubm93KCkgLSBzdGFydGVkQXQ7XG4gICAgICAgICAgICAgIHRlbGVtZXRyeUNvbnRyb2xsZXI/LmVtaXQoe1xuICAgICAgICAgICAgICAgIG5hbWU6IFwid3MuaGFuZGxlci5mYWlsZWRcIixcbiAgICAgICAgICAgICAgICBsZXZlbDogXCJlcnJvclwiLFxuICAgICAgICAgICAgICAgIGNvbm5lY3Rpb25JZDogd3MuaWQsXG4gICAgICAgICAgICAgICAgbmFtZXNwYWNlOiB3cy5uYW1lc3BhY2UsXG4gICAgICAgICAgICAgICAgdXNlcklkOiB3cy51c2VySWQsXG4gICAgICAgICAgICAgICAgZGV0YWlsOiB7IGV2ZW50OiBldmVudE5hbWUgfSxcbiAgICAgICAgICAgICAgICAuLi50cmFjZUNvbnRleHQsXG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICB0ZWxlbWV0cnlDb250cm9sbGVyPy5yZWNvcmRTcGFuKHtcbiAgICAgICAgICAgICAgICBvcGVyYXRpb25OYW1lOiBcIndzLm1lc3NhZ2UucHJvY2Vzc1wiLFxuICAgICAgICAgICAgICAgIGtpbmQ6IFwiaW50ZXJuYWxcIixcbiAgICAgICAgICAgICAgICBkdXJhdGlvbk1zLFxuICAgICAgICAgICAgICAgIHN0YXR1czogXCJlcnJvclwiLFxuICAgICAgICAgICAgICAgIGNvbm5lY3Rpb25JZDogd3MuaWQsXG4gICAgICAgICAgICAgICAgbmFtZXNwYWNlOiB3cy5uYW1lc3BhY2UsXG4gICAgICAgICAgICAgICAgdXNlcklkOiB3cy51c2VySWQsXG4gICAgICAgICAgICAgICAgYXR0cmlidXRlczogeyBldmVudDogZXZlbnROYW1lIH0sXG4gICAgICAgICAgICAgICAgZXJyb3JUeXBlOiBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubmFtZSA6IHJ1bnRpbWVUeXBlT2YoZXJyb3IpLFxuICAgICAgICAgICAgICAgIC4uLnRyYWNlQ29udGV4dCxcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pLFxuICAgICAgICApO1xuICAgICAgfSxcbiAgICAgIHB1Ymxpc2goZXZlbnQsIGRhdGEpIHtcbiAgICAgICAgd3MucHVibGlzaChldmVudCwgZGF0YSk7XG4gICAgICB9LFxuICAgICAgd2FpdEZvckNsb3NlKCkge1xuICAgICAgICByZXR1cm4gd3Mud2FpdEZvckNsb3NlKCk7XG4gICAgICB9LFxuICAgICAgam9pbihyb29tSWQpIHtcbiAgICAgICAgd3Muam9pbihyb29tSWQpO1xuICAgICAgfSxcbiAgICAgIGxlYXZlKHJvb21JZCkge1xuICAgICAgICB3cy5sZWF2ZShyb29tSWQpO1xuICAgICAgfSxcbiAgICAgIHNldFVzZXJJZCh1c2VySWQpIHtcbiAgICAgICAgd3Muc2V0VXNlcklkKHVzZXJJZCk7XG4gICAgICB9LFxuICAgICAgY2xlYXJVc2VySWQoKSB7XG4gICAgICAgIHdzLmNsZWFyVXNlcklkKCk7XG4gICAgICB9LFxuICAgIH07XG4gIH1cblxuICBjcmVhdGVTY29wZWRXZWJTb2NrZXRDb25uZWN0aW9uRm9yVGVzdGluZzxUT3V0IGV4dGVuZHMgb2JqZWN0LCBUSW4gZXh0ZW5kcyBvYmplY3Q+KFxuICAgIHdzOiBXZWJTb2NrZXRDb25uZWN0aW9uPFRPdXQsIFRJbj4sXG4gICAgZ2V0Q29udGV4dDogKCkgPT4gV2ViU29ja2V0Q29udGV4dCB8IG51bGwsXG4gICk6IFdlYlNvY2tldENvbm5lY3Rpb248VE91dCwgVEluPiB7XG4gICAgcmV0dXJuIHRoaXMuY3JlYXRlU2NvcGVkV2ViU29ja2V0Q29ubmVjdGlvbih3cywgZ2V0Q29udGV4dCk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHBhcnNlV2ViU29ja2V0UmVxdWVzdFBhcmFtcyhcbiAgICBhcGk6IEV4dGVuZGVkQXBpLFxuICAgIHJlcXVlc3Q6IEZhc3RpZnlSZXF1ZXN0LFxuICApOiBQcm9taXNlPE1hcDxzdHJpbmcsIEFwaUFyZ3VtZW50Pj4ge1xuICAgIGNvbnN0IHsgZ2V0Wm9kT2JqZWN0RnJvbUFwaSB9ID0gYXdhaXQgaW1wb3J0KFwiLi9jb2RlLWNvbnZlcnRlcnNcIik7XG4gICAgY29uc3QgUmVxVHlwZSA9IGdldFpvZE9iamVjdEZyb21BcGkoYXBpLCB0aGlzLnN5bmNlci50eXBlcyk7XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgeyBmYXN0aWZ5Q2FzdGVyIH0gPSBhd2FpdCBpbXBvcnQoXCIuL2Nhc3RlclwiKTtcbiAgICAgIHJldHVybiB0b0FwaUFyZ3VtZW50TWFwKGZhc3RpZnlDYXN0ZXIoUmVxVHlwZSkucGFyc2UocmVxdWVzdC5xdWVyeSA/PyB7fSkpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGNvbnN0IHsgWm9kRXJyb3IgfSA9IGF3YWl0IGltcG9ydChcInpvZFwiKTtcbiAgICAgIGlmIChlIGluc3RhbmNlb2YgWm9kRXJyb3IpIHtcbiAgICAgICAgY29uc3QgeyBodW1hbml6ZVpvZEVycm9yIH0gPSBhd2FpdCBpbXBvcnQoXCIuLi91dGlscy96b2QtZXJyb3JcIik7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2VzID0gaHVtYW5pemVab2RFcnJvcihlKVxuICAgICAgICAgIC5tYXAoKGlzc3VlKSA9PiBpc3N1ZS5tZXNzYWdlKVxuICAgICAgICAgIC5qb2luKFwiIFwiKTtcbiAgICAgICAgY29uc3QgeyBCYWRSZXF1ZXN0RXhjZXB0aW9uIH0gPSBhd2FpdCBpbXBvcnQoXCIuLi9leGNlcHRpb25zL3NvLWV4Y2VwdGlvbnNcIik7XG4gICAgICAgIHRocm93IG5ldyBCYWRSZXF1ZXN0RXhjZXB0aW9uKFxuICAgICAgICAgIC8qIFNBRkVUWTogQVBJIOuNsOy9lOugiOydtO2EsOyZgCBab2Qg6rKA7Kad6riwIOuTseuhnSDqs4Tslb3snbQg7J20IOqwkuydmCDtg4DsnoXsnYQg67O07J6l7ZWc64ukLiAqLyBtZXNzYWdlcyBhcyBMb2NhbGl6ZWRTdHJpbmcsXG4gICAgICAgICAge1xuICAgICAgICAgICAgem9kRXJyb3I6IGUsXG4gICAgICAgICAgfSxcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgdGhyb3cgZTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVVJM7JeQ7IScIHBhdGggcGFyYW1z66W8IOy2lOy2nO2VqeuLiOuLpC5cbiAgICog7JiIOiBwYXR0ZXJuPVwiL2FkbWluL2NvbXBhbmllcy86Y29tcGFueUlkXCIsIHVybD1cIi9hZG1pbi9jb21wYW5pZXMvMTIzXCIg4oaSIHsgY29tcGFueUlkOiBcIjEyM1wiIH1cbiAgICovXG4gIHByaXZhdGUgZXh0cmFjdFBhdGhQYXJhbXMocGF0dGVybjogc3RyaW5nLCB1cmw6IHN0cmluZykge1xuICAgIGNvbnN0IHBhdHRlcm5QYXJ0cyA9IHBhdHRlcm4uc3BsaXQoXCIvXCIpLmZpbHRlcihCb29sZWFuKTtcbiAgICBjb25zdCB1cmxQYXJ0cyA9IHRoaXMuZ2V0UGF0aG5hbWVGcm9tVXJsKHVybCkuc3BsaXQoXCIvXCIpLmZpbHRlcihCb29sZWFuKTtcbiAgICBjb25zdCBwYXJhbXM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fTtcblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcGF0dGVyblBhcnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAocGF0dGVyblBhcnRzW2ldLnN0YXJ0c1dpdGgoXCI6XCIpKSB7XG4gICAgICAgIHBhcmFtc1twYXR0ZXJuUGFydHNbaV0uc2xpY2UoMSldID0gdXJsUGFydHNbaV07XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBwYXJhbXM7XG4gIH1cblxuICBwcml2YXRlIGlzUGF0aFBhdHRlcm5NYXRjaChwYXR0ZXJuOiBzdHJpbmcsIHVybDogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgY29uc3QgcGF0dGVyblBhcnRzID0gcGF0dGVybi5zcGxpdChcIi9cIikuZmlsdGVyKEJvb2xlYW4pO1xuICAgIGNvbnN0IHVybFBhcnRzID0gdGhpcy5nZXRQYXRobmFtZUZyb21VcmwodXJsKS5zcGxpdChcIi9cIikuZmlsdGVyKEJvb2xlYW4pO1xuXG4gICAgaWYgKHBhdHRlcm5QYXJ0cy5sZW5ndGggIT09IHVybFBhcnRzLmxlbmd0aCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcGF0dGVyblBhcnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBwYXR0ZXJuUGFydCA9IHBhdHRlcm5QYXJ0c1tpXTtcbiAgICAgIGNvbnN0IHVybFBhcnQgPSB1cmxQYXJ0c1tpXTtcbiAgICAgIGlmIChwYXR0ZXJuUGFydC5zdGFydHNXaXRoKFwiOlwiKSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGlmIChwYXR0ZXJuUGFydCAhPT0gdXJsUGFydCkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBwcml2YXRlIGdldFBhdGhuYW1lRnJvbVVybCh1cmw6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHVybC5zcGxpdChcIj9cIilbMF07XG4gIH1cblxuICBwcml2YXRlIHJlc29sdmVQYXRoV2l0aGluQmFzZURpcihiYXNlRGlyOiBzdHJpbmcsIGlucHV0UGF0aDogc3RyaW5nKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGRlY29kZWQgPSBkZWNvZGVVUklDb21wb25lbnQoaW5wdXRQYXRoKS5yZXBsYWNlKC9cXFxcL2csIFwiL1wiKTtcbiAgICAgIGlmIChkZWNvZGVkLmluY2x1ZGVzKFwiXFwwXCIpKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuICAgICAgY29uc3QgcmVsYXRpdmVQYXRoID0gZGVjb2RlZC5yZXBsYWNlKC9eXFwvKy8sIFwiXCIpO1xuICAgICAgY29uc3QgcmVzb2x2ZWRQYXRoID0gcGF0aC5yZXNvbHZlKGJhc2VEaXIsIHJlbGF0aXZlUGF0aCk7XG4gICAgICBjb25zdCByZWxhdGl2ZUZyb21CYXNlID0gcGF0aC5yZWxhdGl2ZShiYXNlRGlyLCByZXNvbHZlZFBhdGgpO1xuICAgICAgaWYgKHJlbGF0aXZlRnJvbUJhc2Uuc3RhcnRzV2l0aChcIi4uXCIpIHx8IHBhdGguaXNBYnNvbHV0ZShyZWxhdGl2ZUZyb21CYXNlKSkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cbiAgICAgIHJldHVybiByZXNvbHZlZFBhdGg7XG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQVBJIOydkeuLteyXkCDsoIHsmqntlaAgQ2FjaGUtQ29udHJvbCDshKTsoJXsnYQg6rKw7KCV7ZWp64uI64ukLlxuICAgKiDsmrDshKDsiJzsnIQ6IOqwnOuzhCDsp4DsoJUgPiBjYWNoZUNvbnRyb2xIYW5kbGVyXG4gICAqL1xuICBwcml2YXRlIGdldEFwaUNhY2hlQ29udHJvbChcbiAgICBhcGk6IEV4dGVuZGVkQXBpLFxuICAgIHJlcXVlc3Q6IEZhc3RpZnlSZXF1ZXN0LFxuICAgIGNvbmZpZzogU29uYW11RmFzdGlmeUNvbmZpZyxcbiAgKSB7XG4gICAgLy8g642w7L2U66CI7J207YSwIOyEpOyglSDsmrDshKBcbiAgICBpZiAoYXBpLm9wdGlvbnMuY2FjaGVDb250cm9sKSB7XG4gICAgICByZXR1cm4gYXBpLm9wdGlvbnMuY2FjaGVDb250cm9sO1xuICAgIH1cblxuICAgIC8vIOyghOyXrSDtlbjrk6Trn6xcbiAgICBpZiAoY29uZmlnLmNhY2hlQ29udHJvbEhhbmRsZXIpIHtcbiAgICAgIGNvbnN0IGNhY2hlUmVxOiBDYWNoZUNvbnRyb2xSZXF1ZXN0ID0ge1xuICAgICAgICB0eXBlOiBcImFwaVwiLFxuICAgICAgICB1cmw6IHJlcXVlc3QudXJsLFxuICAgICAgICBwYXRoOiByZXF1ZXN0LnJvdXRlT3B0aW9ucz8udXJsID8/IHJlcXVlc3QudXJsLnNwbGl0KFwiP1wiKVswXSxcbiAgICAgICAgbWV0aG9kOiByZXF1ZXN0Lm1ldGhvZCxcbiAgICAgICAgYXBpLFxuICAgICAgfTtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGNvbmZpZy5jYWNoZUNvbnRyb2xIYW5kbGVyKGNhY2hlUmVxKTtcbiAgICAgIGlmIChyZXN1bHQpIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICAvKipcbiAgICogU1NS7JqpIEFQSSDtmLjstpwgKEhUVFAg7Jik67KE7Zek65OcIOyXhuydtCDsp4HsoJEg7Zi47LacKVxuICAgKiBjcmVhdGVBcGlIYW5kbGVy7J2YIOuhnOyngeydhCDsnqzsgqzsmqntlZjrkJgsIHJlcXVlc3Qg7YyM7IuxIOuMgOyLoCBwYXJhbXMg7KeB7KCRIOyCrOyaqVxuICAgKi9cbiAgYXN5bmMgaW52b2tlQXBpRm9yU1NSKFxuICAgIGFwaTogRXh0ZW5kZWRBcGksXG4gICAgcGFyYW1zOiBhbnlbXSxcbiAgICBjb25maWc6IFNvbmFtdUZhc3RpZnlDb25maWcsXG4gICAgcmVxdWVzdDogRmFzdGlmeVJlcXVlc3QsXG4gICAgcmVwbHk6IEZhc3RpZnlSZXBseSxcbiAgKTogUHJvbWlzZTxBcGlNZXRob2RSZXN1bHQ+IHtcbiAgICAvLyBDb250ZXh0IOyDneyEsSAo6riw7KG0IOuplOyGjOuTnCDsnqzsgqzsmqkpXG4gICAgY29uc3QgY29udGV4dCA9IGF3YWl0IHRoaXMuY3JlYXRlQ29udGV4dChjb25maWcsIHJlcXVlc3QsIHJlcGx5KTtcblxuICAgIHJldHVybiB0aGlzLmFzeW5jTG9jYWxTdG9yYWdlLnJ1bih7IGNvbnRleHQgfSwgYXN5bmMgKCkgPT4ge1xuICAgICAgLy8gYXJncyDsg53shLE6IENvbnRleHQg7YyM652866+47YSw64qUIOyjvOyehSwg64KY66i47KeA64qUIHBhcmFtc+yXkOyEnCDqsIDsoLjsmKTquLBcbiAgICAgIGNvbnN0IHsgQXBpUGFyYW1UeXBlIH0gPSBhd2FpdCBpbXBvcnQoXCIuLi90eXBlcy90eXBlc1wiKTtcbiAgICAgIGxldCBwYXJhbXNJbmRleCA9IDA7XG4gICAgICBjb25zdCBhcmdzID0gYXBpLnBhcmFtZXRlcnMubWFwKChwYXJhbSkgPT4ge1xuICAgICAgICBpZiAoQXBpUGFyYW1UeXBlLmlzQ29udGV4dChwYXJhbS50eXBlKSkge1xuICAgICAgICAgIHJldHVybiBjb250ZXh0O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBwYXJhbXNbcGFyYW1zSW5kZXgrK107XG4gICAgICB9KTtcblxuICAgICAgLy8g66qo6424IOuplOyEnOuTnCDtmLjstpwgKOq4sOyhtCDrqZTshJzrk5wg7J6s7IKs7JqpKVxuICAgICAgcmV0dXJuIHRoaXMuaW52b2tlTW9kZWxNZXRob2QoYXBpLCBhcmdzLCByZXBseSk7XG4gICAgfSk7XG4gIH1cblxuICBhc3luYyBoYW5kbGVEZXZBcGlSZXF1ZXN0Rm9yVGVzdGluZyhyZXF1ZXN0OiBGYXN0aWZ5UmVxdWVzdCwgY29uZmlnOiBTb25hbXVGYXN0aWZ5Q29uZmlnKSB7XG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuaGFuZGxlRGV2QXBpUmVxdWVzdChyZXF1ZXN0LCBjb25maWcpO1xuICB9XG5cbiAgLy8gV1Mg6rK966Gc7JeQ7ISc64qUIEhUVFAgcmVwbHnqsIAg7JeG7Jy866+A66GcIHJlcGx566W8IG9wdGlvbmFs66GcIOuwm+yVhCDqs7XthrUg7Zi47LacIOqyveuhnOulvCDsnKDsp4DtlahcbiAgYXN5bmMgaW52b2tlTW9kZWxNZXRob2QoXG4gICAgYXBpOiBFeHRlbmRlZEFwaSxcbiAgICBhcmdzOiB1bmtub3duW10sXG4gICAgcmVwbHk/OiBGYXN0aWZ5UmVwbHksXG4gICAgbW9kZWxzOiBMb2FkZWRNb2RlbHMgPSB0aGlzLnN5bmNlci5tb2RlbHMsXG4gICk6IFByb21pc2U8QXBpTWV0aG9kUmVzdWx0PiB7XG4gICAgY29uc3QgbW9kZWwgPSBtb2RlbHNbYXBpLm1vZGVsTmFtZV07XG4gICAgaWYgKG1vZGVsID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgTW9kZWwgbm90IGZvdW5kOiAke2FwaS5tb2RlbE5hbWV9YCk7XG4gICAgfVxuICAgIGNvbnN0IG1ldGhvZCA9XG4gICAgICBtb2RlbFtcbiAgICAgICAgLyogU0FGRVRZOiDrj5nquLDtmZTquLDqsIAg66qo6424IO2BtOuemOyKpOyXkOyEnCDsiJjsp5HtlZwgQVBJIOuplOyEnOuTnCDsnbTrpoTrp4wg7KCE64us7ZWc64ukLiAqLyBhcGkubWV0aG9kTmFtZSBhcyBrZXlvZiB0eXBlb2YgbW9kZWxcbiAgICAgIF07XG4gICAgaWYgKCFpc0Z1bmN0aW9uVmFsdWUobWV0aG9kKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBNb2RlbCBtZXRob2Qgbm90IGZvdW5kOiAke2FwaS5tb2RlbE5hbWV9LiR7YXBpLm1ldGhvZE5hbWV9YCk7XG4gICAgfVxuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IEZ1bmN0aW9uLnByb3RvdHlwZS5hcHBseS5jYWxsKG1ldGhvZCwgbW9kZWwsIGFyZ3MpO1xuICAgIHJlcGx5Py50eXBlKGFwaS5vcHRpb25zLmNvbnRlbnRUeXBlID8/IFwiYXBwbGljYXRpb24vanNvblwiKTtcblxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICBhc3luYyBjcmVhdGVDb250ZXh0KFxuICAgIGNvbmZpZzogU29uYW11RmFzdGlmeUNvbmZpZyxcbiAgICByZXF1ZXN0OiBGYXN0aWZ5UmVxdWVzdCxcbiAgICByZXBseTogRmFzdGlmeVJlcGx5LFxuICApOiBQcm9taXNlPENvbnRleHQ+IHtcbiAgICAvLyBjcmVhdGVTU0VGYWN0b3J5IO2VqOyImOyXkCDrr7jrpqwgcmVxdWVzdOydmCBzb2NrZXTqs7wgcmVwbHnrpbwg67CU7J2465SpLlxuICAgIGNvbnN0IHsgY3JlYXRlU1NFRmFjdG9yeSB9ID0gYXdhaXQgaW1wb3J0KFwiLi4vc3RyZWFtL3NzZVwiKTtcbiAgICBjb25zdCBjcmVhdGVTU0UgPSAoPFQgZXh0ZW5kcyBab2RPYmplY3Q+KFxuICAgICAgX3JlcXVlc3Q6IEZhc3RpZnlSZXF1ZXN0LFxuICAgICAgX3JlcGx5OiBGYXN0aWZ5UmVwbHksXG4gICAgICBfZXZlbnRzOiBULFxuICAgICkgPT4gY3JlYXRlU1NFRmFjdG9yeShfcmVxdWVzdC5zb2NrZXQsIF9yZXBseSwgX2V2ZW50cykpLmJpbmQobnVsbCwgcmVxdWVzdCwgcmVwbHkpO1xuXG4gICAgLy8gbG9jYWxlIOqwkOyngFxuICAgIGNvbnN0IGxvY2FsZSA9XG4gICAgICB0aGlzLmRldGVjdExvY2FsZShyZXF1ZXN0LmhlYWRlcnNbXCJhY2NlcHQtbGFuZ3VhZ2VcIl0sIHRoaXMuY29uZmlnLmkxOG4uc3VwcG9ydGVkTG9jYWxlcykgPz9cbiAgICAgIHRoaXMuY29uZmlnLmkxOG4uZGVmYXVsdExvY2FsZTtcblxuICAgIC8vIGF1dGggY29udGV4dCDstpTqsIBcbiAgICBjb25zdCBoZWFkZXJzID0gY29udmVydEZhc3RpZnlIZWFkZXJzVG9TdGFuZGFyZChyZXF1ZXN0LmhlYWRlcnMpO1xuICAgIGNvbnN0IHNlc3Npb24gPSAoYXdhaXQgdGhpcy5hdXRoVmFsdWU/LmFwaS5nZXRTZXNzaW9uKHsgaGVhZGVycyB9KSkgPz8gbnVsbDtcblxuICAgIGNvbnN0IGNvbnRleHQ6IENvbnRleHQgPSBhd2FpdCBQcm9taXNlLnJlc29sdmUoXG4gICAgICBjb25maWcuY29udGV4dFByb3ZpZGVyKFxuICAgICAgICB7XG4gICAgICAgICAgdHJhbnNwb3J0OiBcImh0dHBcIixcbiAgICAgICAgICByZXF1ZXN0LFxuICAgICAgICAgIHJlcGx5LFxuICAgICAgICAgIGhlYWRlcnM6IHJlcXVlc3QuaGVhZGVycyxcbiAgICAgICAgICBjcmVhdGVTU0UsXG4gICAgICAgICAgbmFpdGVTdG9yZTogbmV3IE1hcCgpLFxuICAgICAgICAgIGxvY2FsZSxcbiAgICAgICAgICAvLyBhdXRoXG4gICAgICAgICAgdXNlcjogc2Vzc2lvbj8udXNlciA/PyBudWxsLFxuICAgICAgICAgIHNlc3Npb246IHNlc3Npb24/LnNlc3Npb24gPz8gbnVsbCxcbiAgICAgICAgfSxcbiAgICAgICAgcmVxdWVzdCxcbiAgICAgICAgcmVwbHksXG4gICAgICApLFxuICAgICk7XG4gICAgcmV0dXJuIGNvbnRleHQ7XG4gIH1cblxuICAvLyBzZXNzaW9uL2xvY2FsZS9zdG9yZSDqsJnsnYAg6rO17Ya1IHN0YXRl64qUIEhUVFAgY29udGV4dOyZgCDqs7XsnKDtlZjrkJgsIHJlcGx5L2NyZWF0ZVNTRSDqsJnsnYAgSFRUUCDsoITsmqkgaGVscGVy64qUIOuFuOy2nO2VmOyngCDslYrsnYxcbiAgLy8g7IKs7Jqp7J6Q6rCAIHdlYnNvY2tldENvbnRleHRQcm92aWRlcuulvCDso7zrqbQg6re464yA66GcIOychOyehO2VmOqzoCwg7JeG7Jy866m0IOq4sOyhtCBjb250ZXh0UHJvdmlkZXLrpbwgcmVwbHkvU1NFIHN0dWLqs7wg7ZWo6ruYIOyerO2ZnOyaqe2VqFxuICBhc3luYyBjcmVhdGVXZWJTb2NrZXRDb250ZXh0KFxuICAgIGNvbmZpZzogU29uYW11RmFzdGlmeUNvbmZpZyxcbiAgICByZXF1ZXN0OiBGYXN0aWZ5UmVxdWVzdCxcbiAgICB3czogQW55V2ViU29ja2V0Q29ubmVjdGlvbixcbiAgKTogUHJvbWlzZTxXZWJTb2NrZXRDb250ZXh0PiB7XG4gICAgY29uc3QgbG9jYWxlID1cbiAgICAgIHRoaXMuZGV0ZWN0TG9jYWxlKHJlcXVlc3QuaGVhZGVyc1tcImFjY2VwdC1sYW5ndWFnZVwiXSwgdGhpcy5jb25maWcuaTE4bi5zdXBwb3J0ZWRMb2NhbGVzKSA/P1xuICAgICAgdGhpcy5jb25maWcuaTE4bi5kZWZhdWx0TG9jYWxlO1xuXG4gICAgY29uc3QgaGVhZGVycyA9IGNvbnZlcnRGYXN0aWZ5SGVhZGVyc1RvU3RhbmRhcmQocmVxdWVzdC5oZWFkZXJzKTtcbiAgICBjb25zdCBzZXNzaW9uID0gKGF3YWl0IHRoaXMuYXV0aFZhbHVlPy5hcGkuZ2V0U2Vzc2lvbih7IGhlYWRlcnMgfSkpID8/IG51bGw7XG5cbiAgICBjb25zdCBkZWZhdWx0Q29udGV4dCA9IHtcbiAgICAgIHRyYW5zcG9ydDogXCJ3c1wiIGFzIGNvbnN0LFxuICAgICAgcmVxdWVzdCxcbiAgICAgIGhlYWRlcnM6IHJlcXVlc3QuaGVhZGVycyxcbiAgICAgIHdzLFxuICAgICAgbmFpdGVTdG9yZTogbmV3IE1hcCgpLFxuICAgICAgbG9jYWxlLFxuICAgICAgdXNlcjogc2Vzc2lvbj8udXNlciA/PyBudWxsLFxuICAgICAgc2Vzc2lvbjogc2Vzc2lvbj8uc2Vzc2lvbiA/PyBudWxsLFxuICAgIH07XG5cbiAgICBpZiAoY29uZmlnLndlYnNvY2tldENvbnRleHRQcm92aWRlcikge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgLi4uKGF3YWl0IFByb21pc2UucmVzb2x2ZShjb25maWcud2Vic29ja2V0Q29udGV4dFByb3ZpZGVyKGRlZmF1bHRDb250ZXh0LCByZXF1ZXN0KSkpLFxuICAgICAgfTtcbiAgICB9XG5cbiAgICAvLyByZXBseS9jcmVhdGVTU0Xsl5Ag7J2Y7KG07ZWY64qUIGNvbnRleHRQcm92aWRlcuqwgCDsnojsnLzrqbQg7KaJ7IucIOyXkOufrOulvCDrjZjsoLggdHJhbnNwb3J0IG1pc3VzZeulvCDruajrpqwg65Oc65+s64OEXG4gICAgY29uc3QgcmVwbHlTdHViID0gY3JlYXRlV2ViU29ja2V0UmVwbHlTdHViKCk7XG4gICAgY29uc3QgaHR0cExpa2VDb250ZXh0ID0gYXdhaXQgUHJvbWlzZS5yZXNvbHZlKFxuICAgICAgY29uZmlnLmNvbnRleHRQcm92aWRlcihcbiAgICAgICAge1xuICAgICAgICAgIHRyYW5zcG9ydDogXCJodHRwXCIsXG4gICAgICAgICAgcmVxdWVzdCxcbiAgICAgICAgICByZXBseTogcmVwbHlTdHViLFxuICAgICAgICAgIGhlYWRlcnM6IHJlcXVlc3QuaGVhZGVycyxcbiAgICAgICAgICBjcmVhdGVTU0U6IGNyZWF0ZVVuYXZhaWxhYmxlU1NFLFxuICAgICAgICAgIG5haXRlU3RvcmU6IGRlZmF1bHRDb250ZXh0Lm5haXRlU3RvcmUsXG4gICAgICAgICAgbG9jYWxlLFxuICAgICAgICAgIHVzZXI6IGRlZmF1bHRDb250ZXh0LnVzZXIsXG4gICAgICAgICAgc2Vzc2lvbjogZGVmYXVsdENvbnRleHQuc2Vzc2lvbixcbiAgICAgICAgfSxcbiAgICAgICAgcmVxdWVzdCxcbiAgICAgICAgcmVwbHlTdHViLFxuICAgICAgKSxcbiAgICApO1xuXG4gICAgY29uc3Qge1xuICAgICAgdHJhbnNwb3J0OiBfdHJhbnNwb3J0LFxuICAgICAgcmVwbHk6IF9yZXBseSxcbiAgICAgIGNyZWF0ZVNTRTogX2NyZWF0ZVNTRSxcbiAgICAgIGJ1ZmZlcmVkRmlsZXM6IF9idWZmZXJlZEZpbGVzLFxuICAgICAgdXBsb2FkZWRGaWxlczogX3VwbG9hZGVkRmlsZXMsXG4gICAgICAuLi5yZXN0XG4gICAgfSA9IGh0dHBMaWtlQ29udGV4dDtcblxuICAgIHJldHVybiB7XG4gICAgICAuLi5yZXN0LFxuICAgICAgdHJhbnNwb3J0OiBcIndzXCIsXG4gICAgICByZXF1ZXN0LFxuICAgICAgaGVhZGVyczogcmVxdWVzdC5oZWFkZXJzLFxuICAgICAgd3MsXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBY2NlcHQtTGFuZ3VhZ2Ug7Zek642U7JeQ7IScIOyngOybkO2VmOuKlCBsb2NhbGXsnYQg7LC+7Iq164uI64ukLlxuICAgKiBAZXhhbXBsZSBcImtvLUtSLGtvO3E9MC45LGVuO3E9MC44XCIg4oaSIFwia29cIlxuICAgKi9cbiAgcHJpdmF0ZSBkZXRlY3RMb2NhbGUoXG4gICAgYWNjZXB0TGFuZ3VhZ2U6IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgICBzdXBwb3J0ZWQ6IHN0cmluZ1tdLFxuICApOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIGlmICghYWNjZXB0TGFuZ3VhZ2UpIHJldHVybiB1bmRlZmluZWQ7XG5cbiAgICAvLyBBY2NlcHQtTGFuZ3VhZ2U6IGtvLUtSLGtvO3E9MC45LGVuO3E9MC44XG4gICAgY29uc3QgbGFuZ3MgPSBhY2NlcHRMYW5ndWFnZS5zcGxpdChcIixcIikubWFwKChsYW5nKSA9PiB7XG4gICAgICBjb25zdCBbY29kZV0gPSBsYW5nLnNwbGl0KFwiO1wiKTtcbiAgICAgIHJldHVybiBjb2RlLnRyaW0oKS5zcGxpdChcIi1cIilbMF07IC8vIGtvLUtSIOKGkiBrb1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIGxhbmdzLmZpbmQoKGxhbmcpID0+IHN1cHBvcnRlZC5pbmNsdWRlcyhsYW5nKSk7XG4gIH1cblxuICBhc3luYyBzdGFydFdhdGNoZXIoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgLy8gd2F0Y2hlciDrqqjrk4jsnYAgZmlsZS1wYXR0ZXJucyDihpIgU29uYW11IOyInO2ZmOydhCDtlLztlZjquLAg7JyE7ZW0IGR5bmFtaWMgaW1wb3J0IO2VqeuLiOuLpC5cbiAgICBjb25zdCB7IHNldHVwV2F0Y2hlciB9ID0gYXdhaXQgaW1wb3J0KFwiLi4vc3luY2VyL3dhdGNoZXJcIik7XG4gICAgdGhpcy53YXRjaGVyID0gYXdhaXQgc2V0dXBXYXRjaGVyKChmaWxlRXZlbnRzKSA9PiB0aGlzLnJ1bkhtclN5bmNDeWNsZShmaWxlRXZlbnRzKSk7XG4gIH1cblxuICAvKipcbiAgICogV2F0Y2hlcuqwgCAxMDBtcyBiYXRjaOuhnCDrqqjsnYAgZmlsZUV2ZW50cyDtlZjrgpjsl5Ag64yA7ZW0IO2VnCDrsojsnZggSE1SL3N5bmMg7IKs7J207YG07J2EIOuPleuLiOuLpC5cbiAgICogYmF0Y2gg7YGQ7J6JIOuNleyXkCDtlZwg7Iuc7KCQ7JeQIO2VmOuCmOunjCDsi6TtlonrkKjsnbQg67O07J6l65Cp64uI64ukIChldmVudC1iYXRjaGVy6rCAIOyngeugrO2ZlCkuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHJ1bkhtclN5bmNDeWNsZShmaWxlRXZlbnRzOiBNYXA8QWJzb2x1dGVQYXRoLCBcImNoYW5nZVwiIHwgXCJhZGRcIj4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBzdGFydGVkQXQgPSBEYXRlLm5vdygpO1xuXG4gICAgZm9yIChjb25zdCBbZmlsZVBhdGgsIGV2ZW50XSBvZiBmaWxlRXZlbnRzKSB7XG4gICAgICBjb25zdCByZWxhdGl2ZVBhdGggPSBwYXRoLnJlbGF0aXZlKHRoaXMuYXBwUm9vdFBhdGgsIGZpbGVQYXRoKTtcbiAgICAgIGNvbnNvbGUubG9nKGNoYWxrLmJvbGQoYERldGVjdGVkKCR7ZXZlbnR9KTogJHtjaGFsay5ibHVlKHJlbGF0aXZlUGF0aCl9YCkpO1xuICAgIH1cblxuICAgIC8vIOuzuOyytDog67OA6rK9IO2doeyImCArIOyytO2BrOyErCDqsLHsi6AuXG4gICAgYXdhaXQgdGhpcy5zeW5jZXIuaG1yQW5kU3luYyhmaWxlRXZlbnRzKTtcbiAgICBhd2FpdCB0aGlzLnN5bmNlci5yZW5ld0NoZWNrc3VtcygpO1xuXG4gICAgY29uc3QgdG90YWxUaW1lID0gRGF0ZS5ub3coKSAtIHN0YXJ0ZWRBdDtcbiAgICBjb25zdCBtc2cgPSBgSE1SIERvbmUhICR7Y2hhbGsuYm9sZC53aGl0ZShgJHt0b3RhbFRpbWV9bXNgKX1gO1xuICAgIGNvbnNvbGUubG9nKGNoYWxrLmJsYWNrLmJnR3JlZW4oY2VudGVyVGV4dChtc2cpKSk7XG4gIH1cblxuICAvKlxuICAgICBBIGZ1bmN0aW9uIHRoYXQgYXV0b21hdGljYWxseSBoYW5kbGVzIGluaXQgYW5kIGRlc3Ryb3kgd2hlbiB1c2luZyBTb25hbXUgdmlhIHNjcmlwdHMuXG4gICovXG4gIGFzeW5jIHJ1blNjcmlwdChmbjogKCkgPT4gUHJvbWlzZTx2b2lkPikge1xuICAgIGF3YWl0IHRoaXMuaW5pdCh0cnVlLCBmYWxzZSwgdW5kZWZpbmVkLCBmYWxzZSk7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IGZuKCk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGF3YWl0IHRoaXMuZGVzdHJveSgpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgcmVnaXN0ZXJQbHVnaW5zKHNlcnZlcjogRmFzdGlmeUluc3RhbmNlLCBwbHVnaW5zOiBTb25hbXVTZXJ2ZXJPcHRpb25zW1wicGx1Z2luc1wiXSkge1xuICAgIGlmICghcGx1Z2lucykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIGNvbXByZXNzIO2UjOufrOq3uOyduOydgCDri6Trpbgg7ZSM65+s6re47J2467O064ukIOuovOyggCDrk7HroZ3rkJjslrTslbwg7ZWp64uI64ukLlxuICAgIGlmIChwbHVnaW5zLmNvbXByZXNzKSB7XG4gICAgICBjb25zdCBjb21wcmVzc1BsdWdpbiA9IChhd2FpdCBpbXBvcnQoXCJAZmFzdGlmeS9jb21wcmVzc1wiKSkuZGVmYXVsdDtcbiAgICAgIGNvbnN0IGRlZmF1bHRPcHRpb25zID0ge1xuICAgICAgICB0aHJlc2hvbGQ6IDEwMjQsXG4gICAgICAgIGVuY29kaW5nczogLyogU0FGRVRZOiBBUEkg642w7L2U66CI7J207YSw7JmAIFpvZCDqsoDspp3quLAg65Ox66GdIOqzhOyVveydtCDsnbQg6rCS7J2YIO2DgOyeheydhCDrs7TsnqXtlZzri6QuICovIFtcbiAgICAgICAgICBcImJyXCIsXG4gICAgICAgICAgXCJnemlwXCIsXG4gICAgICAgICAgXCJkZWZsYXRlXCIsXG4gICAgICAgIF0gYXMgKFwiYnJcIiB8IFwiZ3ppcFwiIHwgXCJkZWZsYXRlXCIpW10sXG4gICAgICB9O1xuXG4gICAgICBpZiAocGx1Z2lucy5jb21wcmVzcyA9PT0gdHJ1ZSkge1xuICAgICAgICBzZXJ2ZXIucmVnaXN0ZXIoY29tcHJlc3NQbHVnaW4sIGRlZmF1bHRPcHRpb25zKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHNlcnZlci5yZWdpc3Rlcihjb21wcmVzc1BsdWdpbiwge1xuICAgICAgICAgIC4uLmRlZmF1bHRPcHRpb25zLFxuICAgICAgICAgIC4uLnBsdWdpbnMuY29tcHJlc3MsXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IHBsdWdpbnNNb2R1bGVzID0ge1xuICAgICAgY29yczogXCJAZmFzdGlmeS9jb3JzXCIsXG4gICAgICBmb3JtYm9keTogXCJAZmFzdGlmeS9mb3JtYm9keVwiLFxuICAgICAgbXVsdGlwYXJ0OiBcIkBmYXN0aWZ5L211bHRpcGFydFwiLFxuICAgICAgcXM6IFwiZmFzdGlmeS1xc1wiLFxuICAgICAgc3NlOiBcImZhc3RpZnktc3NlLXYyXCIsXG4gICAgICBzdGF0aWM6IFwiQGZhc3RpZnkvc3RhdGljXCIsXG4gICAgfSBhcyBjb25zdDtcblxuICAgIGNvbnN0IHJlZ2lzdGVyUGx1Z2luID0gYXN5bmMgPEsgZXh0ZW5kcyBrZXlvZiBOb25OdWxsYWJsZTx0eXBlb2YgcGx1Z2lucz4+KFxuICAgICAga2V5OiBLLFxuICAgICAgcGx1Z2luTmFtZTogc3RyaW5nLFxuICAgICkgPT4ge1xuICAgICAgY29uc3Qgb3B0aW9uID0gcGx1Z2luc1trZXldO1xuICAgICAgaWYgKCFvcHRpb24pIHJldHVybjtcblxuICAgICAgaWYgKG9wdGlvbiA9PT0gdHJ1ZSkge1xuICAgICAgICBzZXJ2ZXIucmVnaXN0ZXIoKGF3YWl0IGltcG9ydChwbHVnaW5OYW1lKSkuZGVmYXVsdCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzZXJ2ZXIucmVnaXN0ZXIoKGF3YWl0IGltcG9ydChwbHVnaW5OYW1lKSkuZGVmYXVsdCwgb3B0aW9uKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgZm9yIChjb25zdCBba2V5LCBwbHVnaW5OYW1lXSBvZiBPYmplY3QuZW50cmllcyhwbHVnaW5zTW9kdWxlcykpIHtcbiAgICAgIGF3YWl0IHJlZ2lzdGVyUGx1Z2luKFxuICAgICAgICAvKiBTQUZFVFk6IEFQSSDrjbDsvZTroIjsnbTthLDsmYAgWm9kIOqygOymneq4sCDrk7HroZ0g6rOE7JW97J20IOydtCDqsJLsnZgg7YOA7J6F7J2EIOuztOyepe2VnOuLpC4gKi8ga2V5IGFzIGtleW9mIHR5cGVvZiBwbHVnaW5zLFxuICAgICAgICBwbHVnaW5OYW1lLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAocGx1Z2lucy53cykge1xuICAgICAgYXdhaXQgdGhpcy5lbnN1cmVXZWJTb2NrZXRQbHVnaW4oc2VydmVyKTtcbiAgICB9XG5cbiAgICBpZiAocGx1Z2lucy5jdXN0b20pIHtcbiAgICAgIHBsdWdpbnMuY3VzdG9tKHNlcnZlcik7XG4gICAgfVxuICB9XG5cbiAgLy8gQGZhc3RpZnkvd2Vic29ja2V07J2AIHBsdWdpbnMud3PqsIAg7ISk7KCV65CcIOqyveyasOyXkOunjCDrk7HroZ3tlZjqs6AsIOqwmeydgCBzZXJ2ZXLsl5Ag7KSR67O1IOuTseuhneuQmOyngCDslYrrj4TroZ0gV2Vha1NldOycvOuhnCDquLDroZ3tlahcbiAgcHJpdmF0ZSBhc3luYyBlbnN1cmVXZWJTb2NrZXRQbHVnaW4oXG4gICAgc2VydmVyOiBGYXN0aWZ5SW5zdGFuY2U8U2VydmVyLCBJbmNvbWluZ01lc3NhZ2UsIFNlcnZlclJlc3BvbnNlPixcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKHRoaXMud2Vic29ja2V0UGx1Z2luU2VydmVycy5oYXMoc2VydmVyKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHBsdWdpbk9wdGlvbiA9IHRoaXMuY29uZmlnLnNlcnZlci5wbHVnaW5zPy53cztcbiAgICBpZiAoIXBsdWdpbk9wdGlvbikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHdlYnNvY2tldFBsdWdpbiA9IChhd2FpdCBpbXBvcnQoXCJAZmFzdGlmeS93ZWJzb2NrZXRcIikpLmRlZmF1bHQ7XG4gICAgY29uc3QgcmVzb2x2ZWRQbHVnaW5PcHRpb25zID0gcmVzb2x2ZVdlYlNvY2tldFBsdWdpbk9wdGlvbnMoe1xuICAgICAgcmF3UGx1Z2luT3B0aW9uOiBwbHVnaW5PcHRpb24sXG4gICAgfSk7XG4gICAgaWYgKHJlc29sdmVkUGx1Z2luT3B0aW9ucykge1xuICAgICAgYXdhaXQgc2VydmVyLnJlZ2lzdGVyKHdlYnNvY2tldFBsdWdpbiwgcmVzb2x2ZWRQbHVnaW5PcHRpb25zKTtcbiAgICB9IGVsc2Uge1xuICAgICAgYXdhaXQgc2VydmVyLnJlZ2lzdGVyKHdlYnNvY2tldFBsdWdpbik7XG4gICAgfVxuXG4gICAgdGhpcy53ZWJzb2NrZXRQbHVnaW5TZXJ2ZXJzLmFkZChzZXJ2ZXIpO1xuICAgIHRoaXMud2Fybk9uUG90ZW50aWFsV2ViU29ja2V0VGltZW91dENvbmZsaWN0cyhzZXJ2ZXIpO1xuICB9XG5cbiAgLy8gaGVhcnRiZWF0IGludGVydmFs7J20IEZhc3RpZnkga2VlcEFsaXZlVGltZW91dCDsnbTsg4HsnbTrqbQg7J247ZSE65286rCAIOuovOyggCBpZGxlIOyXsOqysOydhCDrgYrsnYQg7IiYIOyeiOyWtCDqsr3qs6Drp4wg64Ko6riw6rOgIOuEmOyWtOqwkFxuICBwcml2YXRlIHdhcm5PblBvdGVudGlhbFdlYlNvY2tldFRpbWVvdXRDb25mbGljdHMoXG4gICAgc2VydmVyOiBGYXN0aWZ5SW5zdGFuY2U8U2VydmVyLCBJbmNvbWluZ01lc3NhZ2UsIFNlcnZlclJlc3BvbnNlPixcbiAgKTogdm9pZCB7XG4gICAgY29uc3QgaGVhcnRiZWF0cyA9IHRoaXMuc3luY2VyLmFwaXNcbiAgICAgIC5tYXAoKGFwaSkgPT4gYXBpLndlYnNvY2tldE9wdGlvbnM/LmhlYXJ0YmVhdCA/PyAzMDAwMClcbiAgICAgIC5maWx0ZXIoKGhlYXJ0YmVhdCkgPT4gaGVhcnRiZWF0ID4gMCk7XG5cbiAgICBpZiAoaGVhcnRiZWF0cy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBrZWVwQWxpdmVUaW1lb3V0ID0gdGhpcy5jb25maWcuc2VydmVyLmZhc3RpZnk/LmtlZXBBbGl2ZVRpbWVvdXQ7XG4gICAgaWYgKCFrZWVwQWxpdmVUaW1lb3V0IHx8IGtlZXBBbGl2ZVRpbWVvdXQgPD0gMCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGxhcmdlc3RIZWFydGJlYXQgPSBNYXRoLm1heCguLi5oZWFydGJlYXRzKTtcbiAgICBpZiAobGFyZ2VzdEhlYXJ0YmVhdCA+PSBrZWVwQWxpdmVUaW1lb3V0KSB7XG4gICAgICBzZXJ2ZXIubG9nLndhcm4oXG4gICAgICAgIHtcbiAgICAgICAgICBrZWVwQWxpdmVUaW1lb3V0LFxuICAgICAgICAgIGxhcmdlc3RIZWFydGJlYXQsXG4gICAgICAgIH0sXG4gICAgICAgIFwiV2ViU29ja2V0IGhlYXJ0YmVhdCBpcyBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8ga2VlcEFsaXZlVGltZW91dDsgYWxpZ24gaW5mcmFzdHJ1Y3R1cmUgaWRsZSB0aW1lb3V0cyB0byBhdm9pZCB1bmV4cGVjdGVkIGRpc2Nvbm5lY3RzLlwiLFxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogYmV0dGVyLWF1dGgg65287Jqw7Yq466W8IOuTseuhne2VqeuLiOuLpC5cbiAgICogL2FwaS9hdXRoLyog6rK966Gc66GcIOyduOymnSBBUEnqsIAg7J6Q64+ZIOuTseuhneuQqeuLiOuLpC5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgcmVnaXN0ZXJCZXR0ZXJBdXRoKFxuICAgIHNlcnZlcjogRmFzdGlmeUluc3RhbmNlLFxuICAgIG9wdGlvbnM6IE5vbk51bGxhYmxlPFNvbmFtdVNlcnZlck9wdGlvbnNbXCJhdXRoXCJdPixcbiAgKSB7XG4gICAgaWYgKCFvcHRpb25zKSByZXR1cm47XG5cbiAgICBjb25zdCBiYXNlUGF0aCA9IG9wdGlvbnMuYmFzZVBhdGggPz8gXCIvYXBpL2F1dGhcIjtcblxuICAgIC8vIGJldHRlci1hdXRoIOudvOyasO2KuCDrk7HroZ1cbiAgICBzZXJ2ZXIucm91dGUoe1xuICAgICAgbWV0aG9kOiBbXCJHRVRcIiwgXCJQT1NUXCJdLFxuICAgICAgdXJsOiBgJHtiYXNlUGF0aH0vKmAsXG4gICAgICBoYW5kbGVyOiBhc3luYyAocmVxdWVzdCwgcmVwbHkpID0+IHtcbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLmF1dGguaGFuZGxlcihcbiAgICAgICAgICBjcmVhdGVCZXR0ZXJBdXRoUmVxdWVzdChyZXF1ZXN0LCBvcHRpb25zLmFkdmFuY2VkPy5pcEFkZHJlc3M/LmlwQWRkcmVzc0hlYWRlcnMpLFxuICAgICAgICApO1xuXG4gICAgICAgIHJlcGx5LnN0YXR1cyhyZXNwb25zZS5zdGF0dXMpO1xuICAgICAgICByZXNwb25zZS5oZWFkZXJzLmZvckVhY2goKHZhbHVlOiBzdHJpbmcsIGtleTogc3RyaW5nKSA9PiB7XG4gICAgICAgICAgcmVwbHkuaGVhZGVyKGtleSwgdmFsdWUpO1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHJlcGx5LnNlbmQocmVzcG9uc2UuYm9keSA/IGF3YWl0IHJlc3BvbnNlLnRleHQoKSA6IG51bGwpO1xuICAgICAgfSxcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgcHJpbnRTdGFydHVwU3VtbWFyeSgpIHtcbiAgICBjb25zdCBhY3RpdmVQcmVzZXQgPSBnZXRTb25hbXVFbnZpcm9ubWVudCgpO1xuXG4gICAgcHJpbnREaW1TdW1tYXJ5KGBDb25maWcgbG9hZGVkJHtmb3JtYXRUaW1lKHRoaXMuY29uZmlnRWxhcHNlZCl9YCk7XG5cbiAgICAvLyBEQiBwcmVzZXQg66qp66GdXG4gICAgcHJpbnRHcmVlblN1bW1hcnkoXCJEQlwiKTtcbiAgICBjb25zdCB7IGlzTG9jYWwgfSA9IGF3YWl0IGltcG9ydChcIi4uL3V0aWxzL2NvbnRyb2xsZXJcIik7XG4gICAgY29uc3QgcHJlc2V0TmFtZXMgPVxuICAgICAgLyogU0FGRVRZOiBBUEkg642w7L2U66CI7J207YSw7JmAIFpvZCDqsoDspp3quLAg65Ox66GdIOqzhOyVveydtCDsnbQg6rCS7J2YIO2DgOyeheydhCDrs7TsnqXtlZzri6QuICovIE9iamVjdC5rZXlzKFxuICAgICAgICB0aGlzLmRiQ29uZmlnLFxuICAgICAgKSBhcyAoa2V5b2YgU29uYW11REJDb25maWcpW107XG4gICAgY29uc3QgbWF4TGVuID0gTWF0aC5tYXgoLi4ucHJlc2V0TmFtZXMubWFwKChuKSA9PiBuLmxlbmd0aCkpO1xuICAgIGZvciAoY29uc3QgbmFtZSBvZiBwcmVzZXROYW1lcykge1xuICAgICAgY29uc3QgY29ubiA9XG4gICAgICAgIC8qIFNBRkVUWTogQVBJIOuNsOy9lOugiOydtO2EsOyZgCBab2Qg6rKA7Kad6riwIOuTseuhnSDqs4Tslb3snbQg7J20IOqwkuydmCDtg4DsnoXsnYQg67O07J6l7ZWc64ukLiAqLyB0aGlzXG4gICAgICAgICAgLmRiQ29uZmlnW25hbWVdLmNvbm5lY3Rpb24gYXNcbiAgICAgICAgICB8IHsgaG9zdD86IHN0cmluZzsgcG9ydD86IG51bWJlcjsgZGF0YWJhc2U/OiBzdHJpbmcgfVxuICAgICAgICAgIHwgdW5kZWZpbmVkO1xuICAgICAgY29uc3QgaG9zdCA9IGNvbm4/Lmhvc3QgPz8gXCJsb2NhbGhvc3RcIjtcbiAgICAgIGNvbnN0IGFkZHIgPSBgQCAke2hvc3R9OiR7Y29ubj8ucG9ydCA/PyA1NDMyfS8ke2Nvbm4/LmRhdGFiYXNlID8/IFwiKHVua25vd24pXCJ9YDtcbiAgICAgIGNvbnN0IHBhZGRlZCA9IG5hbWUucGFkRW5kKG1heExlbik7XG4gICAgICBjb25zdCByZW1vdGVUYWcgPSBpc0xvY2FsKCkgJiYgIWlzTG9jYWxIb3N0KGhvc3QpID8gY2hhbGsueWVsbG93KGAgXFx1MjZhMCByZW1vdGVgKSA6IFwiXCI7XG5cbiAgICAgIGlmIChuYW1lID09PSBhY3RpdmVQcmVzZXQpIHtcbiAgICAgICAgY29uc29sZS5sb2coY2hhbGsuZ3JlZW4oYCAgXFx1MjViOCAke3BhZGRlZH0gJHthZGRyfWApICsgcmVtb3RlVGFnKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnNvbGUubG9nKGNoYWxrLmRpbShgICAgICR7cGFkZGVkfSAke2FkZHJ9YCkgKyByZW1vdGVUYWcpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh0aGlzLmNvbmZpZy5zZXJ2ZXIuYXV0aCkge1xuICAgICAgY29uc3QgYmFzZVBhdGggPSB0aGlzLmNvbmZpZy5zZXJ2ZXIuYXV0aC5iYXNlUGF0aCA/PyBcIi9hcGkvYXV0aFwiO1xuICAgICAgcHJpbnREaW1TdW1tYXJ5KGBBdXRoOiBiZXR0ZXItYXV0aCBhdCAke2Jhc2VQYXRofS8qYCk7XG4gICAgfVxuICAgIGlmICh0aGlzLmNvbmZpZy5hcGkudGltZXpvbmUpIHtcbiAgICAgIHByaW50RGltU3VtbWFyeShgVGltZXpvbmU6ICR7dGhpcy5jb25maWcuYXBpLnRpbWV6b25lfWApO1xuICAgIH1cbiAgICBwcmludEdyZWVuU3VtbWFyeShgU29uYW11IHJlYWR5JHtmb3JtYXRUaW1lKHRoaXMuaW5pdEVsYXBzZWQpfWApO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBpbml0aWFsaXplQ2FjaGUoY29uZmlnOiBDYWNoZUNvbmZpZyB8IHVuZGVmaW5lZCwgZm9yVGVzdGluZzogYm9vbGVhbikge1xuICAgIGNvbnN0IHsgc2V0Q2FjaGVNYW5hZ2VyUmVmIH0gPSBhd2FpdCBpbXBvcnQoXCIuLi9jYWNoZS9kZWNvcmF0b3JcIik7XG5cbiAgICAvLyDthYzsiqTtirgg7ZmY6rK97JeQ7IScIOuplOuqqOumrCDrk5zrnbzsnbTrsoQg7J6Q64+ZIOyCrOyaqVxuICAgIGlmIChmb3JUZXN0aW5nKSB7XG4gICAgICBjb25zdCB7IGNyZWF0ZVRlc3RDYWNoZU1hbmFnZXIgfSA9IGF3YWl0IGltcG9ydChcIi4uL2NhY2hlL2NhY2hlLW1hbmFnZXJcIik7XG4gICAgICB0aGlzLmNhY2hlVmFsdWUgPSBjcmVhdGVUZXN0Q2FjaGVNYW5hZ2VyKCk7XG4gICAgICBzZXRDYWNoZU1hbmFnZXJSZWYodGhpcy5jYWNoZVZhbHVlKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyDshKTsoJXsnbQg7JeG7Jy866m0IOy6kOyLnCDruYTtmZzshLHtmZRcbiAgICBpZiAoIWNvbmZpZykge1xuICAgICAgc2V0Q2FjaGVNYW5hZ2VyUmVmKG51bGwpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIOyEpOygleyXkCDrlLDrnbwgQ2FjaGVNYW5hZ2VyIOyDneyEsVxuICAgIGNvbnN0IHsgY3JlYXRlQ2FjaGVNYW5hZ2VyIH0gPSBhd2FpdCBpbXBvcnQoXCIuLi9jYWNoZS9jYWNoZS1tYW5hZ2VyXCIpO1xuICAgIHRoaXMuY2FjaGVWYWx1ZSA9IGNyZWF0ZUNhY2hlTWFuYWdlcihjb25maWcpO1xuICAgIHNldENhY2hlTWFuYWdlclJlZih0aGlzLmNhY2hlVmFsdWUpO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBpbml0aWFsaXplV29ya2Zsb3dzKG9wdGlvbnM6IFNvbmFtdVRhc2tPcHRpb25zIHwgdW5kZWZpbmVkKSB7XG4gICAgY29uc3QgeyBXb3JrZmxvd01hbmFnZXIgfSA9IGF3YWl0IGltcG9ydChcIi4uL3Rhc2tzL3dvcmtmbG93LW1hbmFnZXJcIik7XG4gICAgLy8gTk9URTogQHNvbmFtdS1raXQvdGFza3Mg7JWI7JeQ7ISgIGtuZXggY29uZmln66W8IOyImOygle2VmOq4sCDrlYzrrLjsl5AgY29ubmVjdGlvbuydtCDslYTri4wgY29uZmlnIOynuOuhnCDrs7Trg4Xri4jri6QuXG4gICAgdGhpcy53b3JrZmxvd3NWYWx1ZSA9IG5ldyBXb3JrZmxvd01hbmFnZXIoREIuZ2V0REJDb25maWcoXCJ3XCIpKTtcbiAgICBpZiAoIW9wdGlvbnMpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBlbmFibGVXb3JrZXIgPSBvcHRpb25zLmVuYWJsZVdvcmtlciA/PyBpc0RhZW1vblNlcnZlcigpO1xuICAgIGNvbnN0IGRlZmF1bHRXb3JrZXJPcHRpb25zID0ge1xuICAgICAgY29uY3VycmVuY3k6IG9zLmNwdXMoKS5sZW5ndGggLSAxLFxuICAgICAgdXNlUHViU3ViOiB0cnVlLFxuICAgICAgbGlzdGVuRGVsYXk6IDUwMCxcbiAgICB9O1xuXG4gICAgaWYgKGVuYWJsZVdvcmtlcikge1xuICAgICAgdGhpcy53b3JrZmxvd3Muc2V0dXBXb3JrZXIoe1xuICAgICAgICAuLi5kZWZhdWx0V29ya2VyT3B0aW9ucyxcbiAgICAgICAgLi4ub3B0aW9ucy53b3JrZXJPcHRpb25zLFxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBib290KHNlcnZlcjogRmFzdGlmeUluc3RhbmNlLCBvcHRpb25zOiBTb25hbXVTZXJ2ZXJPcHRpb25zKSB7XG4gICAgY29uc3QgcG9ydCA9IG9wdGlvbnMubGlzdGVuPy5wb3J0ID8/IDMwMDA7XG4gICAgY29uc3QgaG9zdCA9IG9wdGlvbnMubGlzdGVuPy5ob3N0ID8/IFwibG9jYWxob3N0XCI7XG5cbiAgICBzZXJ2ZXIuYWRkSG9vayhcIm9uQ2xvc2VcIiwgYXN5bmMgKCkgPT4ge1xuICAgICAgYXdhaXQgb3B0aW9ucy5saWZlY3ljbGU/Lm9uU2h1dGRvd24/LihzZXJ2ZXIpO1xuICAgICAgYXdhaXQgdGhpcy53b3JrZmxvd3MuZGVzdHJveSgpO1xuICAgICAgYXdhaXQgdGhpcy5kZXN0cm95KCk7XG4gICAgfSk7XG5cbiAgICBjb25zdCBzaHV0ZG93biA9IGFzeW5jICgpID0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IHNlcnZlci5jbG9zZSgpO1xuICAgICAgICBwcm9jZXNzLmV4aXQoMCk7XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihcIkVycm9yIGR1cmluZyBzaHV0ZG93bjpcIiwgZXJyKTtcbiAgICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBwcm9jZXNzLm9uKFwiU0lHSU5UXCIsIHNodXRkb3duKTtcbiAgICBwcm9jZXNzLm9uKFwiU0lHVEVSTVwiLCBzaHV0ZG93bik7XG5cbiAgICBpZiAob3B0aW9ucy5saWZlY3ljbGU/Lm9uRXJyb3IpIHtcbiAgICAgIHNlcnZlci5zZXRFcnJvckhhbmRsZXIob3B0aW9ucy5saWZlY3ljbGU/Lm9uRXJyb3IpO1xuICAgIH1cblxuICAgIHNlcnZlclxuICAgICAgLmxpc3Rlbih7IHBvcnQsIGhvc3QgfSlcbiAgICAgIC50aGVuKGFzeW5jICgpID0+IHtcbiAgICAgICAgYXdhaXQgdGhpcy53b3JrZmxvd3Muc3RhcnRXb3JrZXIoKTtcbiAgICAgICAgYXdhaXQgb3B0aW9ucy5saWZlY3ljbGU/Lm9uU3RhcnQ/LihzZXJ2ZXIpO1xuICAgICAgfSlcbiAgICAgIC5jYXRjaChhc3luYyAoZXJyKSA9PiB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKFwiRmFpbGVkIHRvIHN0YXJ0IHNlcnZlcjpcIiwgZXJyKSk7XG4gICAgICAgIGF3YWl0IHNodXRkb3duKCk7XG4gICAgICB9KTtcbiAgfVxuXG4gIGFzeW5jIGRlc3Ryb3koKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgeyBCYXNlTW9kZWwgfSA9IGF3YWl0IGltcG9ydChcIi4uL2RhdGFiYXNlL2Jhc2UtbW9kZWxcIik7XG4gICAgLy8g66i87KCAIOyymOumrO2VtOyVvO2VqC5cbiAgICBhd2FpdCBCYXNlTW9kZWwuZGVzdHJveSgpO1xuICAgIC8vIFdlYlNvY2tldCBzaHV0ZG93biBmaXJzdCB0byBmbHVzaCB0ZWxlbWV0cnlcbiAgICBpZiAodGhpcy53ZWJzb2NrZXRSdW50aW1lVmFsdWUpIHtcbiAgICAgIGF3YWl0IHRoaXMud2Vic29ja2V0UnVudGltZVZhbHVlLnNodXRkb3duKCk7XG4gICAgfVxuICAgIHRoaXMud2Vic29ja2V0UnVudGltZVZhbHVlID0gbnVsbDtcbiAgICAvLyBUaGVuIHNodXQgZG93biByZW1haW5pbmcgcmVzb3VyY2VzIGluIHBhcmFsbGVsXG4gICAgYXdhaXQgUHJvbWlzZS5hbGxTZXR0bGVkKFtcbiAgICAgIHRoaXMud29ya2Zsb3dzVmFsdWU/LmRlc3Ryb3koKSA/PyBQcm9taXNlLnJlc29sdmUoKSxcbiAgICAgIHRoaXMuY2FjaGVWYWx1ZT8uZGlzY29ubmVjdCgpID8/IFByb21pc2UucmVzb2x2ZSgpLFxuICAgICAgdGhpcy5kZXZWaXRlc3RNYW5hZ2VyVmFsdWU/LnNodXRkb3duKCkgPz8gUHJvbWlzZS5yZXNvbHZlKCksXG4gICAgICB0aGlzLndhdGNoZXI/LmNsb3NlKCkgPz8gUHJvbWlzZS5yZXNvbHZlKCksXG4gICAgXSk7XG4gICAgLy8gTG9nVGFwZSBkaXNwb3NlIGFmdGVyIFdTIHNodXRkb3duIHNvIHRlbGVtZXRyeSByZWNvcmRzIGFyZSBmbHVzaGVkIGZpcnN0XG4gICAgYXdhaXQgbG9ndGFwZURpc3Bvc2UoKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBnZXRXZWJTb2NrZXRUZWxlbWV0cnlDb250ZXh0KFxuICB3czogQW55V2ViU29ja2V0Q29ubmVjdGlvbixcbik6IFdlYlNvY2tldFRlbGVtZXRyeUNvbm5lY3Rpb25Db250ZXh0IHtcbiAgaWYgKCFpc1RlbGVtZXRyeUNvbnRleHRQcm92aWRlcih3cykpIHtcbiAgICByZXR1cm4ge307XG4gIH1cblxuICByZXR1cm4gd3MuZ2V0VGVsZW1ldHJ5Q29udGV4dCgpO1xufVxuXG5mdW5jdGlvbiBpc1RlbGVtZXRyeUNvbnRleHRQcm92aWRlcihcbiAgd3M6IEFueVdlYlNvY2tldENvbm5lY3Rpb24sXG4pOiB3cyBpcyBBbnlXZWJTb2NrZXRDb25uZWN0aW9uICYgVGVsZW1ldHJ5Q29udGV4dFByb3ZpZGVyIHtcbiAgcmV0dXJuIFwiZ2V0VGVsZW1ldHJ5Q29udGV4dFwiIGluIHdzICYmIGlzRnVuY3Rpb25WYWx1ZSh3cy5nZXRUZWxlbWV0cnlDb250ZXh0KTtcbn1cblxuZXhwb3J0IGNvbnN0IFNvbmFtdSA9IG5ldyBTb25hbXVDbGFzcygpO1xuXG4vKipcbiAqIHN0cmVhbSDrqqjrk5zsl5DshJwg7YKkIOyDneyEsSDtlajsiJjqsIAg7KeA7KCV65CY7KeAIOyViuyVmOydhCDrlYwg7IKs7Jqp7ZWY64qUIOq4sOuzuCDtlajsiJjsnoXri4jri6QuXG4gKi9cbmZ1bmN0aW9uIGRlZmF1bHRLZXlHZW5lcmF0b3IoZmlsZTogeyBmaWxlbmFtZTogc3RyaW5nOyBtaW1ldHlwZTogc3RyaW5nIH0pOiBzdHJpbmcge1xuICBjb25zdCBleHQgPSBtaW1lLmV4dGVuc2lvbihmaWxlLm1pbWV0eXBlKSB8fCBcImJpblwiO1xuICBjb25zdCB0aW1lc3RhbXAgPSBEYXRlLm5vdygpO1xuICBjb25zdCByYW5kb20gPSBNYXRoLnJhbmRvbSgpLnRvU3RyaW5nKDM2KS5zbGljZSgyLCA4KTtcbiAgcmV0dXJuIGB1cGxvYWRzLyR7dGltZXN0YW1wfS0ke3JhbmRvbX0uJHtleHR9YDtcbn1cblxuZnVuY3Rpb24gZm9ybWF0VGltZShtczogbnVtYmVyKTogc3RyaW5nIHtcbiAgY29uc3QgZm9ybWF0dGVkID0gbXMgPj0gMTAwMCA/IGAkeyhtcyAvIDEwMDApLnRvRml4ZWQoMil9c2AgOiBgJHtNYXRoLnJvdW5kKG1zKX1tc2A7XG4gIHJldHVybiBgICgke2Zvcm1hdHRlZH0pYDtcbn1cblxuY29uc3QgTE9DQUxfSE9TVFMgPSBuZXcgU2V0KFtcImxvY2FsaG9zdFwiLCBcIjEyNy4wLjAuMVwiLCBcIjAuMC4wLjBcIiwgXCI6OjFcIl0pO1xuZnVuY3Rpb24gaXNMb2NhbEhvc3QoaG9zdDogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiBMT0NBTF9IT1NUUy5oYXMoaG9zdCkgfHwgaG9zdC5lbmRzV2l0aChcIi5sb2NhbFwiKTtcbn1cblxuLy8gYC5ldmVyeSgpYOqwgCDssqsgZ3VhcmQg7J207ZuEIOyInO2ajOulvCDrqYjstpTripQg66y47KCc6rCAIOyeiOyWtCBgZm9yLi4ub2Zg66GcIOuqqOuToCBndWFyZOulvCDsiJzshJzrjIDroZwg7Iuk7ZaJ7ZWY64+E66GdIOqzoOygle2VqFxuZnVuY3Rpb24gcnVuR3VhcmRzKHtcbiAgZ3VhcmRzLFxuICBjb25maWcsXG4gIHJlcXVlc3QsXG4gIGFwaSxcbn06IHtcbiAgZ3VhcmRzOiBFeHRlbmRlZEFwaVtcIm9wdGlvbnNcIl1bXCJndWFyZHNcIl0gfCB1bmRlZmluZWQ7XG4gIGNvbmZpZzogUGljazxTb25hbXVGYXN0aWZ5Q29uZmlnLCBcImd1YXJkSGFuZGxlclwiPjtcbiAgcmVxdWVzdDogRmFzdGlmeVJlcXVlc3Q7XG4gIGFwaTogRXh0ZW5kZWRBcGk7XG59KTogdm9pZCB7XG4gIGZvciAoY29uc3QgZ3VhcmQgb2YgZ3VhcmRzID8/IFtdKSB7XG4gICAgY29uZmlnLmd1YXJkSGFuZGxlcihndWFyZCwgcmVxdWVzdCwgYXBpKTtcbiAgfVxufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQTZHQSxTQUFTLGNBQXFCLE9BQTJCO0NBQ3ZELElBQUksVUFBVSxNQUFNLE9BQU87Q0FDM0IsSUFBSSxVQUFVLFFBQVcsT0FBTztDQUNoQyxJQUFJLFVBQVUsTUFBTSxPQUFPO0NBQzNCLElBQUksVUFBVSxPQUFPLE9BQU87Q0FDNUIsSUFBSSxjQUFjLEtBQUssR0FBRyxPQUFPO0NBQ2pDLElBQUksY0FBYyxLQUFLLEdBQUcsT0FBTztDQUNqQyxJQUFJLGNBQWMsS0FBSyxHQUFHLE9BQU87Q0FDakMsSUFBSSxjQUFjLEtBQUssR0FBRyxPQUFPO0NBQ2pDLElBQUksZ0JBQWdCLEtBQUssR0FBRyxPQUFPO0NBQ25DLElBQUksY0FBYyxL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
1411
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic29uYW11LmpzIiwibmFtZXMiOlsibWltZUxvb2t1cCIsImxvZ3RhcGVEaXNwb3NlIl0sInNvdXJjZXMiOlsiLi4vLi4vc3JjL2FwaS9zb25hbXUudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQXN5bmNMb2NhbFN0b3JhZ2UgfSBmcm9tIFwiYXN5bmNfaG9va3NcIjtcbmltcG9ydCBmcyBmcm9tIFwiZnMvcHJvbWlzZXNcIjtcbmltcG9ydCB7IHR5cGUgSW5jb21pbmdNZXNzYWdlLCB0eXBlIFNlcnZlciwgdHlwZSBTZXJ2ZXJSZXNwb25zZSB9IGZyb20gXCJodHRwXCI7XG5pbXBvcnQgb3MgZnJvbSBcIm9zXCI7XG5pbXBvcnQgcGF0aCBmcm9tIFwicGF0aFwiO1xuXG5pbXBvcnQgXCJAZmFzdGlmeS93ZWJzb2NrZXRcIjtcbmltcG9ydCB7IGRpc3Bvc2UgYXMgbG9ndGFwZURpc3Bvc2UgfSBmcm9tIFwiQGxvZ3RhcGUvbG9ndGFwZVwiO1xuaW1wb3J0IHsgdHlwZSBBdXRoLCB0eXBlIEJldHRlckF1dGhPcHRpb25zIH0gZnJvbSBcImJldHRlci1hdXRoXCI7XG5pbXBvcnQgY2hhbGsgZnJvbSBcImNoYWxrXCI7XG5pbXBvcnQgeyB0eXBlIEZTV2F0Y2hlciB9IGZyb20gXCJjaG9raWRhclwiO1xuaW1wb3J0IHsgdHlwZSBGYXN0aWZ5SW5zdGFuY2UsIHR5cGUgRmFzdGlmeVJlcGx5LCB0eXBlIEZhc3RpZnlSZXF1ZXN0IH0gZnJvbSBcImZhc3RpZnlcIjtcbmltcG9ydCBtaW1lLCB7IGxvb2t1cCBhcyBtaW1lTG9va3VwIH0gZnJvbSBcIm1pbWUtdHlwZXNcIjtcbmltcG9ydCB7IHR5cGUgV2ViU29ja2V0IH0gZnJvbSBcIndzXCI7XG5pbXBvcnQgeyB0eXBlIFpvZE9iamVjdCB9IGZyb20gXCJ6b2RcIjtcblxuaW1wb3J0IHsgQkFTRV9GSUVMRF9NQVBQSU5HUyB9IGZyb20gXCIuLi9hdXRoL2JldHRlci1hdXRoLWVudGl0aWVzXCI7XG5pbXBvcnQgeyBjcmVhdGVCZXR0ZXJBdXRoUmVxdWVzdCB9IGZyb20gXCIuLi9hdXRoL2JldHRlci1hdXRoLXJlcXVlc3RcIjtcbmltcG9ydCB7IGFwcGx5Q2FjaGVIZWFkZXJzLCBDYWNoZVByZXNldHMgfSBmcm9tIFwiLi4vY2FjaGUtY29udHJvbC9jYWNoZS1jb250cm9sXCI7XG5pbXBvcnQgeyB0eXBlIENhY2hlQ29udHJvbENvbmZpZywgdHlwZSBDYWNoZUNvbnRyb2xSZXF1ZXN0IH0gZnJvbSBcIi4uL2NhY2hlLWNvbnRyb2wvdHlwZXNcIjtcbmltcG9ydCB7IHR5cGUgQ2FjaGVDb25maWcsIHR5cGUgQ2FjaGVNYW5hZ2VyIH0gZnJvbSBcIi4uL2NhY2hlL3R5cGVzXCI7XG5pbXBvcnQgeyB0b0Zhc3RpZnlDb21wcmVzc09wdGlvbiB9IGZyb20gXCIuLi9jb21wcmVzcy9jb21wcmVzc1wiO1xuaW1wb3J0IHsgdHlwZSBDb21wcmVzc09wdGlvbnMgfSBmcm9tIFwiLi4vY29tcHJlc3MvdHlwZXNcIjtcbmltcG9ydCB7IERCIH0gZnJvbSBcIi4uL2RhdGFiYXNlL2RiXCI7XG5pbXBvcnQgeyB0eXBlIFNvbmFtdURCQ29uZmlnIH0gZnJvbSBcIi4uL2RhdGFiYXNlL2RiXCI7XG5pbXBvcnQgeyBTRCwgc2V0U0RDb25maWcgfSBmcm9tIFwiLi4vZGljdC9zZFwiO1xuaW1wb3J0IHsgdHlwZSBMb2NhbGl6ZWRTdHJpbmcgfSBmcm9tIFwiLi4vZGljdC90eXBlc1wiO1xuaW1wb3J0IHsgZ2V0U29uYW11RW52aXJvbm1lbnQsIHJlYWRBbGxFbnZpcm9ubWVudFNuYXBzaG90cyB9IGZyb20gXCIuLi9lbnZcIjtcbmltcG9ydCB7IE5vdEZvdW5kRXhjZXB0aW9uIH0gZnJvbSBcIi4uL2V4Y2VwdGlvbnMvc28tZXhjZXB0aW9uc1wiO1xuaW1wb3J0IHsgcnVudGltZVR5cGVPZiB9IGZyb20gXCIuLi9ydW50aW1lLXR5cGVcIjtcbmltcG9ydCB7IEJ1ZmZlcmVkRmlsZSB9IGZyb20gXCIuLi9zdG9yYWdlL2J1ZmZlcmVkLWZpbGVcIjtcbmltcG9ydCB7IHR5cGUgU3RvcmFnZU1hbmFnZXIgfSBmcm9tIFwiLi4vc3RvcmFnZS9zdG9yYWdlLW1hbmFnZXJcIjtcbmltcG9ydCB7IHR5cGUgS2V5R2VuZXJhdG9yIH0gZnJvbSBcIi4uL3N0b3JhZ2UvdHlwZXNcIjtcbmltcG9ydCB7IFVwbG9hZGVkRmlsZSB9IGZyb20gXCIuLi9zdG9yYWdlL3VwbG9hZGVkLWZpbGVcIjtcbmltcG9ydCB7IGNyZWF0ZU1vY2tTU0VGYWN0b3J5IH0gZnJvbSBcIi4uL3N0cmVhbS9zc2VcIjtcbmltcG9ydCB7XG4gIHR5cGUgQW55V2ViU29ja2V0Q29ubmVjdGlvbixcbiAgV2ViU29ja2V0UnVudGltZSxcbiAgdHlwZSBXZWJTb2NrZXRDb25uZWN0aW9uLFxufSBmcm9tIFwiLi4vc3RyZWFtL3dzXCI7XG5pbXBvcnQge1xuICB0eXBlIFRlbGVtZXRyeUNvbnRleHRQcm92aWRlcixcbiAgdHlwZSBXZWJTb2NrZXRUZWxlbWV0cnlDb25uZWN0aW9uQ29udGV4dCxcbn0gZnJvbSBcIi4uL3N0cmVhbS93cy10ZWxlbWV0cnlcIjtcbmltcG9ydCB7IHR5cGUgTG9hZGVkTW9kZWxzIH0gZnJvbSBcIi4uL3N5bmNlci9tb2R1bGUtbG9hZGVyXCI7XG5pbXBvcnQgeyB0eXBlIFN5bmNlciB9IGZyb20gXCIuLi9zeW5jZXIvc3luY2VyXCI7XG5pbXBvcnQgeyB0eXBlIFdvcmtmbG93TWFuYWdlciB9IGZyb20gXCIuLi90YXNrcy93b3JrZmxvdy1tYW5hZ2VyXCI7XG5pbXBvcnQgeyB0eXBlIERldlZpdGVzdE1hbmFnZXIgfSBmcm9tIFwiLi4vdGVzdGluZy9kZXYtdml0ZXN0LW1hbmFnZXJcIjtcbmltcG9ydCB7IHR5cGUgU29uYW11RmFzdGlmeUNvbmZpZyB9IGZyb20gXCIuLi90eXBlcy90eXBlc1wiO1xuaW1wb3J0IHsgY2VudGVyVGV4dCB9IGZyb20gXCIuLi91dGlscy9jb25zb2xlLXV0aWxcIjtcbmltcG9ydCB7IGlzRGFlbW9uU2VydmVyIH0gZnJvbSBcIi4uL3V0aWxzL2NvbnRyb2xsZXJcIjtcbmltcG9ydCB7IGV4aXN0cywgZmlsZUV4aXN0cyB9IGZyb20gXCIuLi91dGlscy9mcy11dGlsc1wiO1xuaW1wb3J0IHsgdHlwZSBBYnNvbHV0ZVBhdGggfSBmcm9tIFwiLi4vdXRpbHMvcGF0aC11dGlsc1wiO1xuaW1wb3J0IHtcbiAgaXNCaWdJbnRWYWx1ZSxcbiAgaXNGdW5jdGlvblZhbHVlLFxuICBpc051bWJlclZhbHVlLFxuICBpc09iamVjdFZhbHVlLFxuICBpc1N0cmluZ1ZhbHVlLFxuICBpc1N5bWJvbFZhbHVlLFxufSBmcm9tIFwiLi4vdXRpbHMvcnVudGltZS12YWx1ZVwiO1xuaW1wb3J0IHsgY29udmVydEZhc3RpZnlIZWFkZXJzVG9TdGFuZGFyZCwgbWVyZ2UgfSBmcm9tIFwiLi4vdXRpbHMvdXRpbHNcIjtcbmltcG9ydCB7XG4gIG5vcm1hbGl6ZVpvZENvbXBpbGVyUG9saWN5LFxuICB0eXBlIFNvbmFtdUNvbmZpZyxcbiAgdHlwZSBTb25hbXVTZXJ2ZXJPcHRpb25zLFxuICB0eXBlIFNvbmFtdVRhc2tPcHRpb25zLFxufSBmcm9tIFwiLi9jb25maWdcIjtcbmltcG9ydCB7IHR5cGUgQ29udGV4dCwgdHlwZSBSdW50aW1lQ29udGV4dCwgdHlwZSBXZWJTb2NrZXRDb250ZXh0IH0gZnJvbSBcIi4vY29udGV4dFwiO1xuaW1wb3J0IHsgdHlwZSBFeHRlbmRlZEFwaSB9IGZyb20gXCIuL2RlY29yYXRvcnNcIjtcbmltcG9ydCB7XG4gIGFzc2VydEh0dHBWYWxpZGF0b3JSZWdpc3RyeSxcbiAgY3JlYXRlSHR0cFZhbGlkYXRvcixcbiAgZ2V0SHR0cFZhbGlkYXRvclJvdXRlS2V5LFxuICB0eXBlIEh0dHBWYWxpZGF0b3IsXG4gIHR5cGUgSHR0cFZhbGlkYXRvclJlZ2lzdHJ5LFxufSBmcm9tIFwiLi9odHRwLXZhbGlkYXRvclwiO1xuaW1wb3J0IHsgZ2V0U2VjcmV0cyB9IGZyb20gXCIuL3NlY3JldFwiO1xuaW1wb3J0IHsgdHlwZSBTb25hbXVTZWNyZXRzIH0gZnJvbSBcIi4vc2VjcmV0XCI7XG5pbXBvcnQge1xuICBjcmVhdGVXZWJTb2NrZXRSZXBseVN0dWIsXG4gIHJlc29sdmVXZWJTb2NrZXRDbG9zZURlc2NyaXB0b3IsXG4gIHJlc29sdmVXZWJTb2NrZXRQbHVnaW5PcHRpb25zLFxuICByZXNvbHZlSW50ZWdyYXRlZFZpdGVIbXJPcHRpb25zLFxufSBmcm9tIFwiLi93ZWJzb2NrZXQtaGVscGVyc1wiO1xuXG5leHBvcnQge1xuICBjcmVhdGVXZWJTb2NrZXRSZXBseVN0dWIsXG4gIHJlc29sdmVXZWJTb2NrZXRDbG9zZURlc2NyaXB0b3IsXG4gIHJlc29sdmVXZWJTb2NrZXRQbHVnaW5PcHRpb25zLFxufSBmcm9tIFwiLi93ZWJzb2NrZXQtaGVscGVyc1wiO1xuXG5pbnRlcmZhY2UgVXBsb2FkZWRSZXF1ZXN0RmlsZXMge1xuICBidWZmZXJlZEZpbGVzOiBCdWZmZXJlZEZpbGVbXTtcbiAgdXBsb2FkZWRGaWxlczogVXBsb2FkZWRGaWxlW107XG59XG5cbnR5cGUgQXBpQXJndW1lbnQgPVxuICB8IHN0cmluZ1xuICB8IG51bWJlclxuICB8IGJvb2xlYW5cbiAgfCBiaWdpbnRcbiAgfCBzeW1ib2xcbiAgfCBDYWxsYWJsZUZ1bmN0aW9uXG4gIHwgb2JqZWN0XG4gIHwgbnVsbFxuICB8IHVuZGVmaW5lZDtcbnR5cGUgQXBpTWV0aG9kUmVzdWx0ID0gQXBpQXJndW1lbnQgfCB2b2lkO1xuXG5mdW5jdGlvbiB0b0FwaUFyZ3VtZW50PFZhbHVlPih2YWx1ZTogVmFsdWUpOiBBcGlBcmd1bWVudCB7XG4gIGlmICh2YWx1ZSA9PT0gbnVsbCkgcmV0dXJuIG51bGw7XG4gIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSByZXR1cm4gdW5kZWZpbmVkO1xuICBpZiAodmFsdWUgPT09IHRydWUpIHJldHVybiB0cnVlO1xuICBpZiAodmFsdWUgPT09IGZhbHNlKSByZXR1cm4gZmFsc2U7XG4gIGlmIChpc1N0cmluZ1ZhbHVlKHZhbHVlKSkgcmV0dXJuIHZhbHVlO1xuICBpZiAoaXNOdW1iZXJWYWx1ZSh2YWx1ZSkpIHJldHVybiB2YWx1ZTtcbiAgaWYgKGlzQmlnSW50VmFsdWUodmFsdWUpKSByZXR1cm4gdmFsdWU7XG4gIGlmIChpc1N5bWJvbFZhbHVlKHZhbHVlKSkgcmV0dXJuIHZhbHVlO1xuICBpZiAoaXNGdW5jdGlvblZhbHVlKHZhbHVlKSkgcmV0dXJuIHZhbHVlO1xuICBpZiAoaXNPYmplY3RWYWx1ZSh2YWx1ZSkpIHtcbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cbiAgdGhyb3cgbmV3IEVycm9yKFwi7KeA7JuQ7ZWY7KeAIOyViuuKlCBBUEkg7J247IiYIO2DgOyeheyeheuLiOuLpC5cIik7XG59XG5cbmZ1bmN0aW9uIHRvQXBpQXJndW1lbnRNYXA8VmFsdWUgZXh0ZW5kcyBvYmplY3Q+KHZhbHVlOiBWYWx1ZSk6IE1hcDxzdHJpbmcsIEFwaUFyZ3VtZW50PiB7XG4gIHJldHVybiBuZXcgTWFwKE9iamVjdC5lbnRyaWVzKHZhbHVlKS5tYXAoKFtrZXksIGl0ZW1dKSA9PiBba2V5LCB0b0FwaUFyZ3VtZW50KGl0ZW0pXSkpO1xufVxuXG5mdW5jdGlvbiBjcmVhdGVVbmF2YWlsYWJsZVNTRTxUIGV4dGVuZHMgWm9kT2JqZWN0PihfZXZlbnRzOiBUKTogbmV2ZXIge1xuICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgXCJjcmVhdGVTU0UgaXMgbm90IGF2YWlsYWJsZSBpbiB3ZWJzb2NrZXQgY29udGV4dC4gRGVmaW5lIHdlYnNvY2tldENvbnRleHRQcm92aWRlciBpZiB5b3VyIGNvbnRleHQgc2V0dXAgZGVwZW5kcyBvbiBTU0UgaGVscGVycy5cIixcbiAgKTtcbn1cblxuZnVuY3Rpb24gcHJpbnREaW1TdW1tYXJ5KG1lc3NhZ2U6IHN0cmluZyk6IHZvaWQge1xuICBjb25zb2xlLmxvZyhjaGFsay5kaW0oYOKckyAke21lc3NhZ2V9YCkpO1xufVxuXG5mdW5jdGlvbiBwcmludEdyZWVuU3VtbWFyeShtZXNzYWdlOiBzdHJpbmcpOiB2b2lkIHtcbiAgY29uc29sZS5sb2coY2hhbGsuZ3JlZW4oYOKckyAke21lc3NhZ2V9YCkpO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFNvbmFtdVRlc3RpbmdTbmFwc2hvdCB7XG4gIGFwaVJvb3RQYXRoOiBBYnNvbHV0ZVBhdGggfCBudWxsO1xuICBjb25maWc6IFNvbmFtdUNvbmZpZyB8IG51bGw7XG4gIHN5bmNlcjogU3luY2VyIHwgbnVsbDtcbiAgaHR0cFZhbGlkYXRvcnM6IFdlYWtNYXA8RXh0ZW5kZWRBcGksIEh0dHBWYWxpZGF0b3I+O1xuICBwZW5kaW5nSHR0cFZhbGlkYXRvcnM6IFdlYWtNYXA8RXh0ZW5kZWRBcGksIFByb21pc2U8SHR0cFZhbGlkYXRvcj4+O1xuICBhb3RIdHRwVmFsaWRhdG9yUmVnaXN0cnk6IEh0dHBWYWxpZGF0b3JSZWdpc3RyeSB8IHVuZGVmaW5lZDtcbiAgcHJlcGFyZWRBcGlzOiByZWFkb25seSBFeHRlbmRlZEFwaVtdO1xuICBwcmVwYXJlZE1vZGVsczogTG9hZGVkTW9kZWxzO1xuICB3ZWJzb2NrZXRSdW50aW1lOiBXZWJTb2NrZXRSdW50aW1lIHwgbnVsbDtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBTb25hbXVIdHRwVmFsaWRhdG9yRGVwZW5kZW5jaWVzIHtcbiAgY3JlYXRlVmFsaWRhdG9yOiB0eXBlb2YgY3JlYXRlSHR0cFZhbGlkYXRvcjtcbiAgYXNzZXJ0UmVnaXN0cnk6IHR5cGVvZiBhc3NlcnRIdHRwVmFsaWRhdG9yUmVnaXN0cnk7XG59XG5cbmV4cG9ydCBjb25zdCBkZWZhdWx0U29uYW11SHR0cFZhbGlkYXRvckRlcGVuZGVuY2llczogU29uYW11SHR0cFZhbGlkYXRvckRlcGVuZGVuY2llcyA9IHtcbiAgY3JlYXRlVmFsaWRhdG9yOiBjcmVhdGVIdHRwVmFsaWRhdG9yLFxuICBhc3NlcnRSZWdpc3RyeTogYXNzZXJ0SHR0cFZhbGlkYXRvclJlZ2lzdHJ5LFxufTtcblxuY2xhc3MgU29uYW11Q2xhc3Mge1xuICBwdWJsaWMgaXNJbml0aWFsaXplZDogYm9vbGVhbiA9IGZhbHNlO1xuICBwdWJsaWMgZm9yVGVzdGluZzogYm9vbGVhbiA9IGZhbHNlO1xuICBwdWJsaWMgYXN5bmNMb2NhbFN0b3JhZ2U6IEFzeW5jTG9jYWxTdG9yYWdlPHtcbiAgICBjb250ZXh0OiBSdW50aW1lQ29udGV4dDtcbiAgfT4gPSBuZXcgQXN5bmNMb2NhbFN0b3JhZ2UoKTtcbiAgcHJpdmF0ZSBodHRwVmFsaWRhdG9yczogV2Vha01hcDxFeHRlbmRlZEFwaSwgSHR0cFZhbGlkYXRvcj4gPSBuZXcgV2Vha01hcCgpO1xuICBwcml2YXRlIHBlbmRpbmdIdHRwVmFsaWRhdG9yczogV2Vha01hcDxFeHRlbmRlZEFwaSwgUHJvbWlzZTxIdHRwVmFsaWRhdG9yPj4gPSBuZXcgV2Vha01hcCgpO1xuICBwcml2YXRlIGFvdEh0dHBWYWxpZGF0b3JSZWdpc3RyeTogSHR0cFZhbGlkYXRvclJlZ2lzdHJ5IHwgdW5kZWZpbmVkO1xuICBwcml2YXRlIHByZXBhcmVkQXBpczogcmVhZG9ubHkgRXh0ZW5kZWRBcGlbXSA9IFtdO1xuICBwcml2YXRlIHByZXBhcmVkTW9kZWxzOiBMb2FkZWRNb2RlbHMgPSB7fTtcblxuICBwdWJsaWMgZ2V0Q29udGV4dDxUIGV4dGVuZHMgUnVudGltZUNvbnRleHQgPSBDb250ZXh0PigpOiBUIHtcbiAgICBjb25zdCBzdG9yZSA9IHRoaXMuYXN5bmNMb2NhbFN0b3JhZ2UuZ2V0U3RvcmUoKTtcbiAgICBpZiAoc3RvcmU/LmNvbnRleHQpIHtcbiAgICAgIHJldHVybiAvKiBTQUZFVFk6IEFQSSDrjbDsvZTroIjsnbTthLDsmYAgWm9kIOqygOymneq4sCDrk7HroZ0g6rOE7JW97J20IOydtCDqsJLsnZgg7YOA7J6F7J2EIOuztOyepe2VnOuLpC4gKi8gc3RvcmUuY29udGV4dCBhcyBUO1xuICAgIH1cblxuICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gXCJ0ZXN0XCIpIHtcbiAgICAgIC8vIO2FjOyKpO2MhSDtmZjqsr3sl5DshJwg7Luo7YWN7Iqk7Yq46rCAIOyjvOyeheuQmOyngCDslYrsnYAg6rK97JqwIOu5iCDsu6jthY3siqTtirgg66as7YS0XG4gICAgICBjb25zdCBtb2NrQ29udGV4dCA9IHtcbiAgICAgICAgdHJhbnNwb3J0OiBcImh0dHBcIixcbiAgICAgICAgcmVxdWVzdDogbnVsbCxcbiAgICAgICAgcmVwbHk6IG51bGwsXG4gICAgICAgIGhlYWRlcnM6IHt9LFxuICAgICAgICBjcmVhdGVTU0U6IChzY2hlbWE6IFpvZE9iamVjdCkgPT4gY3JlYXRlTW9ja1NTRUZhY3Rvcnkoc2NoZW1hKSxcbiAgICAgICAgbG9jYWxlOiBcIlwiLFxuICAgICAgICB1c2VyOiBudWxsLFxuICAgICAgICBzZXNzaW9uOiBudWxsLFxuICAgICAgICBuYWl0ZVN0b3JlOiBuZXcgTWFwPHN0cmluZywgYW55PigpLFxuICAgICAgfTtcbiAgICAgIC8vIFNBRkVUWTog7YWM7Iqk7Yq4IOq4sOuzuCDsu6jthY3siqTtirjripQgSFRUUCBDb250ZXh07J2066mwIOq4sOuzuCDsoJzrhKTrpq3qs7wg7J287LmY7ZWc64ukLlxuICAgICAgcmV0dXJuIC8qIFNBRkVUWTog7YWM7Iqk7Yq4IOq4sOuzuCDsu6jthY3siqTtirjripQg7JqU7LKtIOuylOychOqwgCDsl4bripQgSFRUUCDsu6jthY3siqTtirgg64yA7LK06rCS7J6F64uI64ukLiAqLyBtb2NrQ29udGV4dCBhcyBUICZcbiAgICAgICAgdHlwZW9mIG1vY2tDb250ZXh0O1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJTb25hbXUgY2Fubm90IGZpbmQgY29udGV4dFwiKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGFwaVJvb3RQYXRoVmFsdWU6IEFic29sdXRlUGF0aCB8IG51bGwgPSBudWxsO1xuICBzZXQgYXBpUm9vdFBhdGgoYXBpUm9vdFBhdGg6IEFic29sdXRlUGF0aCkge1xuICAgIHRoaXMuYXBpUm9vdFBhdGhWYWx1ZSA9IGFwaVJvb3RQYXRoO1xuICB9XG4gIGdldCBhcGlSb290UGF0aCgpOiBBYnNvbHV0ZVBhdGgge1xuICAgIGlmICh0aGlzLmFwaVJvb3RQYXRoVmFsdWUgPT09IG51bGwpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIlNvbmFtdSBoYXMgbm90IGJlZW4gaW5pdGlhbGl6ZWRcIik7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmFwaVJvb3RQYXRoVmFsdWU7XG4gIH1cbiAgZ2V0IGFwcFJvb3RQYXRoKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuYXBpUm9vdFBhdGguc3BsaXQocGF0aC5zZXApLnNsaWNlKDAsIC0xKS5qb2luKHBhdGguc2VwKTtcbiAgfVxuXG4gIHByaXZhdGUgZGJDb25maWdWYWx1ZTogU29uYW11REJDb25maWcgfCBudWxsID0gbnVsbDtcbiAgc2V0IGRiQ29uZmlnKGRiQ29uZmlnOiBTb25hbXVEQkNvbmZpZykge1xuICAgIHRoaXMuZGJDb25maWdWYWx1ZSA9IGRiQ29uZmlnO1xuICB9XG4gIGdldCBkYkNvbmZpZygpOiBTb25hbXVEQkNvbmZpZyB7XG4gICAgaWYgKHRoaXMuZGJDb25maWdWYWx1ZSA9PT0gbnVsbCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiU29uYW11IGhhcyBub3QgYmVlbiBpbml0aWFsaXplZFwiKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuZGJDb25maWdWYWx1ZTtcbiAgfVxuXG4gIHByaXZhdGUgc3luY2VyVmFsdWU6IFN5bmNlciB8IG51bGwgPSBudWxsO1xuICBzZXQgc3luY2VyKHN5bmNlcjogU3luY2VyKSB7XG4gICAgdGhpcy5zeW5jZXJWYWx1ZSA9IHN5bmNlcjtcbiAgfVxuICBnZXQgc3luY2VyKCk6IFN5bmNlciB7XG4gICAgaWYgKHRoaXMuc3luY2VyVmFsdWUgPT09IG51bGwpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIlNvbmFtdSBoYXMgbm90IGJlZW4gaW5pdGlhbGl6ZWRcIik7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLnN5bmNlclZhbHVlO1xuICB9XG5cbiAgcHJpdmF0ZSBjb25maWdWYWx1ZTogU29uYW11Q29uZmlnIHwgbnVsbCA9IG51bGw7XG4gIHNldCBjb25maWcoY29uZmlnOiBTb25hbXVDb25maWcpIHtcbiAgICB0aGlzLmNvbmZpZ1ZhbHVlID0gY29uZmlnO1xuICB9XG4gIGdldCBjb25maWcoKTogU29uYW11Q29uZmlnIHtcbiAgICBpZiAodGhpcy5jb25maWdWYWx1ZSA9PT0gbnVsbCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiU29uYW11IGhhcyBub3QgYmVlbiBpbml0aWFsaXplZFwiKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuY29uZmlnVmFsdWU7XG4gIH1cblxuICBwdWJsaWMgcmVhZG9ubHkgc2VjcmV0czogU29uYW11U2VjcmV0cyA9IGdldFNlY3JldHMoKTtcblxuICBwcml2YXRlIHN0b3JhZ2VWYWx1ZTogU3RvcmFnZU1hbmFnZXIgfCBudWxsID0gbnVsbDtcbiAgLyoqXG4gICAqIFN0b3JhZ2VNYW5hZ2VyIOyduOyKpO2EtOyKpFxuICAgKi9cbiAgZ2V0IHN0b3JhZ2UoKTogU3RvcmFnZU1hbmFnZXIge1xuICAgIGlmICghdGhpcy5zdG9yYWdlVmFsdWUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIlN0b3JhZ2UgaGFzIG5vdCBiZWVuIGluaXRpYWxpemVkLiBDaGVjayBzdG9yYWdlIGNvbmZpZy5cIik7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLnN0b3JhZ2VWYWx1ZTtcbiAgfVxuXG4gIHByaXZhdGUgY2FjaGVWYWx1ZTogQ2FjaGVNYW5hZ2VyIHwgbnVsbCA9IG51bGw7XG4gIC8qKlxuICAgKiBDYWNoZU1hbmFnZXIg7J247Iqk7YS07IqkIChCZW50b0NhY2hlKVxuICAgKi9cbiAgZ2V0IGNhY2hlKCk6IENhY2hlTWFuYWdlciB7XG4gICAgaWYgKCF0aGlzLmNhY2hlVmFsdWUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIkNhY2hlIGhhcyBub3QgYmVlbiBpbml0aWFsaXplZC4gQ2hlY2sgY2FjaGUgY29uZmlnIGluIHNvbmFtdS5jb25maWcudHMuXCIpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5jYWNoZVZhbHVlO1xuICB9XG5cbiAgcHJpdmF0ZSB3b3JrZmxvd3NWYWx1ZTogV29ya2Zsb3dNYW5hZ2VyIHwgbnVsbCA9IG51bGw7XG4gIGdldCB3b3JrZmxvd3MoKTogV29ya2Zsb3dNYW5hZ2VyIHtcbiAgICBpZiAodGhpcy53b3JrZmxvd3NWYWx1ZSA9PT0gbnVsbCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiU29uYW11IGhhcyBub3QgYmVlbiBpbml0aWFsaXplZFwiKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy53b3JrZmxvd3NWYWx1ZTtcbiAgfVxuXG4gIHByaXZhdGUgYXV0aFZhbHVlOiBBdXRoPEJldHRlckF1dGhPcHRpb25zPiB8IG51bGwgPSBudWxsO1xuICBnZXQgYXV0aCgpOiBBdXRoPEJldHRlckF1dGhPcHRpb25zPiB7XG4gICAgaWYgKCF0aGlzLmF1dGhWYWx1ZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQXV0aCBoYXMgbm90IGJlZW4gaW5pdGlhbGl6ZWQuIENoZWNrIGF1dGggY29uZmlnIGluIHNvbmFtdS5jb25maWcudHMuXCIpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5hdXRoVmFsdWU7XG4gIH1cblxuICBwcml2YXRlIGRldlZpdGVzdE1hbmFnZXJWYWx1ZTogRGV2Vml0ZXN0TWFuYWdlciB8IG51bGwgPSBudWxsO1xuICBnZXQgZGV2Vml0ZXN0TWFuYWdlcigpOiBEZXZWaXRlc3RNYW5hZ2VyIHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMuZGV2Vml0ZXN0TWFuYWdlclZhbHVlO1xuICB9XG4gIHNldCBkZXZWaXRlc3RNYW5hZ2VyKG1hbmFnZXI6IERldlZpdGVzdE1hbmFnZXIgfCBudWxsKSB7XG4gICAgdGhpcy5kZXZWaXRlc3RNYW5hZ2VyVmFsdWUgPSBtYW5hZ2VyO1xuICB9XG5cbiAgLy8gU29uYW116rCAIHJ1bnRpbWXsnYQg7KeB7KCRIOyGjOycoO2VtCByZWdpc3RyeS9jb25uZWN0aW9uIGxpZmVjeWNsZeydhCDslaDtlIzrpqzsvIDsnbTshZgg7IiY66qF7KO86riw7JmAIOuPmeq4sO2ZlO2VqFxuICBwcml2YXRlIHdlYnNvY2tldFJ1bnRpbWVWYWx1ZTogV2ViU29ja2V0UnVudGltZSB8IG51bGwgPSBudWxsO1xuICAvLyDqsJnsnYAgRmFzdGlmeSDsnbjsiqTthLTsiqTsl5AgQGZhc3RpZnkvd2Vic29ja2V07J2EIOykkeuztSDrk7HroZ3tlZjripQg6rKD7J2EIFdlYWtTZXTsnLzroZwg7LCo64uo7ZWoXG4gIHByaXZhdGUgcmVhZG9ubHkgd2Vic29ja2V0UGx1Z2luU2VydmVycyA9IG5ldyBXZWFrU2V0PFxuICAgIEZhc3RpZnlJbnN0YW5jZTxTZXJ2ZXIsIEluY29taW5nTWVzc2FnZSwgU2VydmVyUmVzcG9uc2U+XG4gID4oKTtcbiAgZ2V0IHdlYnNvY2tldFJ1bnRpbWUoKTogV2ViU29ja2V0UnVudGltZSB7XG4gICAgaWYgKCF0aGlzLndlYnNvY2tldFJ1bnRpbWVWYWx1ZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiV2ViU29ja2V0IHJ1bnRpbWUgaGFzIG5vdCBiZWVuIGluaXRpYWxpemVkLlwiKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMud2Vic29ja2V0UnVudGltZVZhbHVlO1xuICB9XG4gIHNldCB3ZWJzb2NrZXRSdW50aW1lKHJ1bnRpbWU6IFdlYlNvY2tldFJ1bnRpbWUgfCBudWxsKSB7XG4gICAgdGhpcy53ZWJzb2NrZXRSdW50aW1lVmFsdWUgPSBydW50aW1lO1xuICB9XG5cbiAgY2FwdHVyZVRlc3RpbmdTbmFwc2hvdCgpOiBTb25hbXVUZXN0aW5nU25hcHNob3Qge1xuICAgIHJldHVybiB7XG4gICAgICBhcGlSb290UGF0aDogdGhpcy5hcGlSb290UGF0aFZhbHVlLFxuICAgICAgY29uZmlnOiB0aGlzLmNvbmZpZ1ZhbHVlLFxuICAgICAgc3luY2VyOiB0aGlzLnN5bmNlclZhbHVlLFxuICAgICAgaHR0cFZhbGlkYXRvcnM6IHRoaXMuaHR0cFZhbGlkYXRvcnMsXG4gICAgICBwZW5kaW5nSHR0cFZhbGlkYXRvcnM6IHRoaXMucGVuZGluZ0h0dHBWYWxpZGF0b3JzLFxuICAgICAgYW90SHR0cFZhbGlkYXRvclJlZ2lzdHJ5OiB0aGlzLmFvdEh0dHBWYWxpZGF0b3JSZWdpc3RyeSxcbiAgICAgIHByZXBhcmVkQXBpczogdGhpcy5wcmVwYXJlZEFwaXMsXG4gICAgICBwcmVwYXJlZE1vZGVsczogdGhpcy5wcmVwYXJlZE1vZGVscyxcbiAgICAgIHdlYnNvY2tldFJ1bnRpbWU6IHRoaXMud2Vic29ja2V0UnVudGltZVZhbHVlLFxuICAgIH07XG4gIH1cblxuICByZXN0b3JlVGVzdGluZ1NuYXBzaG90KHNuYXBzaG90OiBTb25hbXVUZXN0aW5nU25hcHNob3QpOiB2b2lkIHtcbiAgICB0aGlzLmFwaVJvb3RQYXRoVmFsdWUgPSBzbmFwc2hvdC5hcGlSb290UGF0aDtcbiAgICB0aGlzLmNvbmZpZ1ZhbHVlID0gc25hcHNob3QuY29uZmlnO1xuICAgIHRoaXMuc3luY2VyVmFsdWUgPSBzbmFwc2hvdC5zeW5jZXI7XG4gICAgdGhpcy5odHRwVmFsaWRhdG9ycyA9IHNuYXBzaG90Lmh0dHBWYWxpZGF0b3JzO1xuICAgIHRoaXMucGVuZGluZ0h0dHBWYWxpZGF0b3JzID0gc25hcHNob3QucGVuZGluZ0h0dHBWYWxpZGF0b3JzO1xuICAgIHRoaXMuYW90SHR0cFZhbGlkYXRvclJlZ2lzdHJ5ID0gc25hcHNob3QuYW90SHR0cFZhbGlkYXRvclJlZ2lzdHJ5O1xuICAgIHRoaXMucHJlcGFyZWRBcGlzID0gc25hcHNob3QucHJlcGFyZWRBcGlzO1xuICAgIHRoaXMucHJlcGFyZWRNb2RlbHMgPSBzbmFwc2hvdC5wcmVwYXJlZE1vZGVscztcbiAgICB0aGlzLndlYnNvY2tldFJ1bnRpbWVWYWx1ZSA9IHNuYXBzaG90LndlYnNvY2tldFJ1bnRpbWU7XG4gIH1cblxuICAvLyBITVIg7LKY66asOiDtjIzsnbwg7Iuc7Iqk7YWcIOqwkOyLnCArIEhNUi9zeW5jIOyCrOydtO2BtCDsi6TtlonsnYAgd2F0Y2hlciDrqqjrk4jroZwg7JyE7J6E7ZWp64uI64ukLlxuICBwdWJsaWMgd2F0Y2hlcjogRlNXYXRjaGVyIHwgbnVsbCA9IG51bGw7XG5cbiAgcHVibGljIHNlcnZlcjogRmFzdGlmeUluc3RhbmNlIHwgbnVsbCA9IG51bGw7XG5cbiAgYXN5bmMgaW5pdEZvclRlc3RpbmcoKSB7XG4gICAgYXdhaXQgdGhpcy5pbml0KHRydWUsIGZhbHNlLCB1bmRlZmluZWQsIHRydWUpO1xuICB9XG5cbiAgYXN5bmMgaW5pdChcbiAgICBkb1NpbGVudDogYm9vbGVhbiA9IGZhbHNlLFxuICAgIGVuYWJsZVN5bmM6IGJvb2xlYW4gPSB0cnVlLFxuICAgIGFwaVJvb3RQYXRoPzogQWJzb2x1dGVQYXRoLFxuICAgIGZvclRlc3Rpbmc6IGJvb2xlYW4gPSBmYWxzZSxcbiAgKSB7XG4gICAgdGhpcy5mb3JUZXN0aW5nID0gZm9yVGVzdGluZztcblxuICAgIGlmICh0aGlzLmlzSW5pdGlhbGl6ZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBpbml0U3RhcnQgPSBwZXJmb3JtYW5jZS5ub3coKTtcblxuICAgIC8vIEFQSSDro6jtirgg7Yyo7IqkXG4gICAgY29uc3QgeyBmaW5kQXBpUm9vdFBhdGggfSA9IGF3YWl0IGltcG9ydChcIi4uL3V0aWxzL3V0aWxzXCIpO1xuICAgIHRoaXMuYXBpUm9vdFBhdGggPSBhcGlSb290UGF0aCA/PyBmaW5kQXBpUm9vdFBhdGgoKTtcbiAgICBjb25zdCBiYXNlRW52QmVmb3JlQ29uZmlnTG9hZCA9IHsgLi4ucHJvY2Vzcy5lbnYgfTtcblxuICAgIC8vIOyEpOygleydhCDroZzrlKntlZjripQg6rKD67aA7YSwIOyLnOyekVxuICAgIGNvbnN0IGNvbmZpZ1N0YXJ0ID0gcGVyZm9ybWFuY2Uubm93KCk7XG4gICAgY29uc3QgeyBsb2FkQ29uZmlnIH0gPSBhd2FpdCBpbXBvcnQoXCIuL2NvbmZpZ1wiKTtcbiAgICB0aGlzLmNvbmZpZyA9IGF3YWl0IGxvYWRDb25maWcodGhpcy5hcGlSb290UGF0aCk7XG4gICAgY29uc3QgY29uZmlnVGltZSA9IHBlcmZvcm1hbmNlLm5vdygpIC0gY29uZmlnU3RhcnQ7XG4gICAgc2V0U0RDb25maWcodGhpcy5jb25maWcuaTE4bik7XG4gICAgLy8gc29uYW11LmNvbmZpZy50cyDquLDrs7jqsJIg7ISk7KCVXG4gICAgdGhpcy5jb25maWcuZGF0YWJhc2UuZGF0YWJhc2UgPSB0aGlzLmNvbmZpZy5kYXRhYmFzZS5kYXRhYmFzZSA/PyBcInBnXCI7XG4gICAgdGhpcy5jb25maWcuZGF0YWJhc2UuZGVmYXVsdE9wdGlvbnMgPSB0aGlzLmNvbmZpZy5kYXRhYmFzZS5kZWZhdWx0T3B0aW9ucyA/PyB7fTtcbiAgICB0aGlzLmNvbmZpZy5kYXRhYmFzZS5kZWZhdWx0T3B0aW9ucy5jbGllbnQgPSB0aGlzLmNvbmZpZy5kYXRhYmFzZS5kYXRhYmFzZSA/PyBcInBnXCI7XG5cbiAgICAvLyDroZzquYUg7ISk7KCVXG4gICAgY29uc3QgeyBjb25maWd1cmVMb2dUYXBlIH0gPSBhd2FpdCBpbXBvcnQoXCIuLi9sb2dnZXIvY29uZmlndXJlXCIpO1xuICAgIGlmICh0aGlzLmNvbmZpZy5sb2dnaW5nICE9PSBmYWxzZSkge1xuICAgICAgYXdhaXQgY29uZmlndXJlTG9nVGFwZSh7XG4gICAgICAgIC4uLnRoaXMuY29uZmlnLmxvZ2dpbmcsXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyBEQiDroZzrk5xcbiAgICBjb25zdCB7IERCOiBSdW50aW1lREIgfSA9IGF3YWl0IGltcG9ydChcIi4uL2RhdGFiYXNlL2RiXCIpO1xuICAgIGNvbnN0IHsgaXNMb2NhbDogaXNMb2NhbEVudmlyb25tZW50IH0gPSBhd2FpdCBpbXBvcnQoXCIuLi91dGlscy9jb250cm9sbGVyXCIpO1xuICAgIGNvbnN0IGVudmlyb25tZW50U25hcHNob3RzID0gaXNMb2NhbEVudmlyb25tZW50KClcbiAgICAgID8gcmVhZEFsbEVudmlyb25tZW50U25hcHNob3RzKHRoaXMuYXBpUm9vdFBhdGgsIGJhc2VFbnZCZWZvcmVDb25maWdMb2FkKVxuICAgICAgOiB1bmRlZmluZWQ7XG4gICAgdGhpcy5kYkNvbmZpZyA9IFJ1bnRpbWVEQi5nZW5lcmF0ZURCQ29uZmlnKFxuICAgICAgdGhpcy5jb25maWcuZGF0YWJhc2UsXG4gICAgICB0aGlzLmNvbmZpZy5wcm9qZWN0TmFtZSxcbiAgICAgIGVudmlyb25tZW50U25hcHNob3RzLFxuICAgICk7XG4gICAgUnVudGltZURCLnNldENvbmZpZyh0aGlzLmRiQ29uZmlnKTtcblxuICAgIC8vIEVudGl0eSDroZzrk5xcbiAgICAvLyDthYzsiqTtirjsl5DshJzrj4QgRW50aXR5IOygleuztOuKlCDtlYTsmpTtlanri4jri6QuXG4gICAgLy8gdXBzZXJ06rCAIOygnOuMgOuhnCDsnpHrj5ntlZjroKTrqbQgZW50aXR57J2YIHVuaXF1ZSBpbmRleCDsoJXrs7TqsIAg7ZWE7JqU7ZWY6riwIOuVjOusuOyeheuLiOuLpC5cbiAgICBjb25zdCB7IEVudGl0eU1hbmFnZXIgfSA9IGF3YWl0IGltcG9ydChcIi4uL2VudGl0eS9lbnRpdHktbWFuYWdlclwiKTtcbiAgICBhd2FpdCBFbnRpdHlNYW5hZ2VyLmF1dG9sb2FkKGRvU2lsZW50KTtcblxuICAgIC8vIENhY2hlIOy0iOq4sO2ZlFxuICAgIGF3YWl0IHRoaXMuaW5pdGlhbGl6ZUNhY2hlKHRoaXMuY29uZmlnLnNlcnZlci5jYWNoZSwgZm9yVGVzdGluZyk7XG5cbiAgICAvLyBCZXR0ZXJBdXRoIOy0iOq4sO2ZlFxuICAgIGNvbnN0IGF1dGhDb25maWcgPSB0aGlzLmNvbmZpZy5zZXJ2ZXIuYXV0aDtcbiAgICBpZiAoYXV0aENvbmZpZykge1xuICAgICAgLy8g7IKs7Jqp7J6QIOyEpOygleqzvCDquLDrs7jqsJLsnYQgbWVyZ2VcbiAgICAgIGNvbnN0IG1lcmdlZEZpZWxkTWFwcGluZ3MgPSBtZXJnZShCQVNFX0ZJRUxEX01BUFBJTkdTLCBhdXRoQ29uZmlnKTtcblxuICAgICAgLy8gYmV0dGVyLWF1dGgg7J247Iqk7YS07IqkIOyDneyEsVxuICAgICAgY29uc3QgeyBiZXR0ZXJBdXRoIH0gPSBhd2FpdCBpbXBvcnQoXCJiZXR0ZXItYXV0aFwiKTtcbiAgICAgIGNvbnN0IHsgc29uYW11S25leEFkYXB0ZXIgfSA9IGF3YWl0IGltcG9ydChcIi4uL2F1dGgva25leC1hZGFwdGVyXCIpO1xuXG4gICAgICBjb25zdCBhdXRoT3B0aW9uczogQmV0dGVyQXV0aE9wdGlvbnMgPSB7XG4gICAgICAgIGRhdGFiYXNlOiBzb25hbXVLbmV4QWRhcHRlcigpLFxuICAgICAgICAuLi5tZXJnZWRGaWVsZE1hcHBpbmdzLFxuICAgICAgfTtcbiAgICAgIHRoaXMuYXV0aFZhbHVlID0gYmV0dGVyQXV0aChhdXRoT3B0aW9ucyk7XG4gICAgfVxuXG4gICAgLy8g7YWM7Iqk7YyF7J24IOqyveyasCDsi7Htgawg7JeG7J20IOykkeuLqFxuICAgIGlmIChmb3JUZXN0aW5nKSB7XG4gICAgICB0aGlzLmlzSW5pdGlhbGl6ZWQgPSB0cnVlO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIFRhc2sg65Ox66GdXG4gICAgYXdhaXQgdGhpcy5pbml0aWFsaXplV29ya2Zsb3dzKHRoaXMuY29uZmlnLnRhc2tzKTtcblxuICAgIC8vIFN5bmNlclxuICAgIGNvbnN0IHsgU3luY2VyIH0gPSBhd2FpdCBpbXBvcnQoXCIuLi9zeW5jZXIvc3luY2VyXCIpO1xuICAgIHRoaXMuc3luY2VyID0gbmV3IFN5bmNlcigpO1xuXG4gICAgLy8gQXV0b2xvYWQ6IE1vZGVscyAvIFR5cGVzIC8gQVBJcyAvIFdvcmtmbG93cyAvIFRlbXBsYXRlcyAvIFNTUiBSb3V0ZXNcbiAgICBhd2FpdCB0aGlzLnN5bmNlci5hdXRvbG9hZFR5cGVzKCk7XG4gICAgYXdhaXQgdGhpcy5zeW5jZXIuYXV0b2xvYWRNb2RlbHMoKTtcbiAgICBhd2FpdCB0aGlzLnN5bmNlci5hdXRvbG9hZEFwaXMoKTtcbiAgICBhd2FpdCB0aGlzLnN5bmNlci5hdXRvbG9hZFdvcmtmbG93cygpO1xuICAgIGNvbnN0IHsgVGVtcGxhdGVNYW5hZ2VyIH0gPSBhd2FpdCBpbXBvcnQoXCIuLi90ZW1wbGF0ZVwiKTtcbiAgICBhd2FpdCBUZW1wbGF0ZU1hbmFnZXIuYXV0b2xvYWQoKTtcbiAgICBhd2FpdCB0aGlzLnN5bmNlci5hdXRvbG9hZFNzclJvdXRlcygpO1xuXG4gICAgY29uc3QgeyBpc0xvY2FsLCBpc1Rlc3QsIGlzSG90UmVsb2FkU2VydmVyIH0gPSBhd2FpdCBpbXBvcnQoXCIuLi91dGlscy9jb250cm9sbGVyXCIpO1xuICAgIGlmIChpc0xvY2FsKCkgJiYgIWlzVGVzdCgpICYmIGlzSG90UmVsb2FkU2VydmVyKCkgJiYgZW5hYmxlU3luYykge1xuICAgICAgYXdhaXQgdGhpcy5zeW5jZXIuc3luYygpO1xuICAgICAgYXdhaXQgdGhpcy5zdGFydFdhdGNoZXIoKTtcbiAgICB9XG5cbiAgICB0aGlzLmlzSW5pdGlhbGl6ZWQgPSB0cnVlO1xuICAgIHRoaXMuaW5pdEVsYXBzZWQgPSBwZXJmb3JtYW5jZS5ub3coKSAtIGluaXRTdGFydDtcbiAgICB0aGlzLmNvbmZpZ0VsYXBzZWQgPSBjb25maWdUaW1lO1xuICB9XG5cbiAgcHJpdmF0ZSBpbml0RWxhcHNlZCA9IDA7XG4gIHByaXZhdGUgY29uZmlnRWxhcHNlZCA9IDA7XG5cbiAgYXN5bmMgY3JlYXRlU2VydmVyKGluaXRPcHRpb25zPzogeyBlbmFibGVTeW5jPzogYm9vbGVhbjsgZG9TaWxlbnQ/OiBib29sZWFuIH0pIHtcbiAgICBpZiAoIXRoaXMuaXNJbml0aWFsaXplZCkge1xuICAgICAgYXdhaXQgdGhpcy5pbml0KGluaXRPcHRpb25zPy5kb1NpbGVudCwgaW5pdE9wdGlvbnM/LmVuYWJsZVN5bmMpO1xuICAgIH1cblxuICAgIGNvbnN0IG9wdGlvbnMgPSB0aGlzLmNvbmZpZy5zZXJ2ZXI7XG4gICAgY29uc3QgeyBkZWZhdWx0OiBmYXN0aWZ5IH0gPSBhd2FpdCBpbXBvcnQoXCJmYXN0aWZ5XCIpO1xuICAgIGNvbnN0IHsgZ2V0TG9nVGFwZUZhc3RpZnlMb2dnZXIgfSA9IGF3YWl0IGltcG9ydChcIkBsb2d0YXBlL2Zhc3RpZnlcIik7XG4gICAgY29uc3Qgc2VydmVyID0gZmFzdGlmeSh7XG4gICAgICAuLi5vcHRpb25zLmZhc3RpZnksXG4gICAgICBsb2dnZXI6XG4gICAgICAgIHRoaXMuY29uZmlnLmxvZ2dpbmcgIT09IGZhbHNlXG4gICAgICAgICAgPyBnZXRMb2dUYXBlRmFzdGlmeUxvZ2dlcih7XG4gICAgICAgICAgICAgIGNhdGVnb3J5OiB0aGlzLmNvbmZpZy5sb2dnaW5nPy5mYXN0aWZ5Q2F0ZWdvcnkgPz8gW1wiZmFzdGlmeVwiXSxcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgOiB1bmRlZmluZWQsXG4gICAgfSk7XG4gICAgdGhpcy5zZXJ2ZXIgPSBzZXJ2ZXI7XG4gICAgdGhpcy53ZWJzb2NrZXRSdW50aW1lID0gbmV3IFdlYlNvY2tldFJ1bnRpbWUob3B0aW9ucy53ZWJzb2NrZXQpO1xuXG4gICAgLy8gU3RvcmFnZSDshKTsoJUg4oaSIFN0b3JhZ2VNYW5hZ2VyIOyDneyEsVxuICAgIGlmIChvcHRpb25zLnN0b3JhZ2UpIHtcbiAgICAgIGNvbnN0IHsgU3RvcmFnZU1hbmFnZXIgfSA9IGF3YWl0IGltcG9ydChcIi4uL3N0b3JhZ2Uvc3RvcmFnZS1tYW5hZ2VyXCIpO1xuICAgICAgdGhpcy5zdG9yYWdlVmFsdWUgPSBuZXcgU3RvcmFnZU1hbmFnZXIob3B0aW9ucy5zdG9yYWdlKTtcbiAgICB9XG5cbiAgICAvLyDtlIzrn6zqt7jsnbgg65Ox66GdXG4gICAgaWYgKG9wdGlvbnMucGx1Z2lucykge1xuICAgICAgYXdhaXQgdGhpcy5yZWdpc3RlclBsdWdpbnMoc2VydmVyLCBvcHRpb25zLnBsdWdpbnMpO1xuICAgIH1cblxuICAgIGlmIChvcHRpb25zLmF1dGgpIHtcbiAgICAgIGF3YWl0IHRoaXMucmVnaXN0ZXJCZXR0ZXJBdXRoKHNlcnZlciwgb3B0aW9ucy5hdXRoKTtcbiAgICB9XG5cbiAgICAvLyBBUEkg65287Jqw7YyFIOyEpOyglVxuICAgIGF3YWl0IHRoaXMud2l0aEZhc3RpZnkoc2VydmVyLCBvcHRpb25zLmFwaUNvbmZpZywge1xuICAgICAgZW5hYmxlU3luYzogaW5pdE9wdGlvbnM/LmVuYWJsZVN5bmMsXG4gICAgICBkb1NpbGVudDogaW5pdE9wdGlvbnM/LmRvU2lsZW50LFxuICAgIH0pO1xuXG4gICAgLy8g7ISc67KEIOyLnOyekVxuICAgIGF3YWl0IHRoaXMuYm9vdChzZXJ2ZXIsIG9wdGlvbnMpO1xuXG4gICAgaWYgKCFpbml0T3B0aW9ucz8uZG9TaWxlbnQpIHtcbiAgICAgIHRoaXMucHJpbnRTdGFydHVwU3VtbWFyeSgpO1xuICAgIH1cblxuICAgIHJldHVybiBzZXJ2ZXI7XG4gIH1cblxuICBhc3luYyB3aXRoRmFzdGlmeShcbiAgICBzZXJ2ZXI6IEZhc3RpZnlJbnN0YW5jZTxTZXJ2ZXIsIEluY29taW5nTWVzc2FnZSwgU2VydmVyUmVzcG9uc2U+LFxuICAgIGNvbmZpZzogU29uYW11RmFzdGlmeUNvbmZpZyxcbiAgICBvcHRpb25zPzoge1xuICAgICAgZW5hYmxlU3luYz86IGJvb2xlYW47XG4gICAgICBkb1NpbGVudD86IGJvb2xlYW47XG4gICAgfSxcbiAgKSB7XG4gICAgaWYgKCF0aGlzLmlzSW5pdGlhbGl6ZWQpIHtcbiAgICAgIGF3YWl0IHRoaXMuaW5pdChvcHRpb25zPy5kb1NpbGVudCwgb3B0aW9ucz8uZW5hYmxlU3luYyk7XG4gICAgfVxuXG4gICAgdGhpcy5zZXJ2ZXIgPSBzZXJ2ZXI7XG4gICAgdGhpcy53ZWJzb2NrZXRSdW50aW1lID8/PSBuZXcgV2ViU29ja2V0UnVudGltZSh0aGlzLmNvbmZpZy5zZXJ2ZXIud2Vic29ja2V0KTtcbiAgICBhd2FpdCB0aGlzLnJlZnJlc2hIdHRwVmFsaWRhdG9ycygpO1xuXG4gICAgLy8gdGltZXpvbmUg7ISk7KCVXG4gICAgY29uc3QgdGltZXpvbmUgPSB0aGlzLmNvbmZpZy5hcGkudGltZXpvbmU7XG4gICAgaWYgKHRpbWV6b25lKSB7XG4gICAgICAvLyDtg4DsnoTsobTsl5Ag66ee6rKMIOydkeuLtSDrgqDsp5wg7Iqk7Yq466eB7J2EIOuzgO2ZmO2VtOyjvOyWtOyVvCDtlanri4jri6QuXG4gICAgICAvLyDqsIDroLkgdGltZXpvbmXsnbQgXCJBc2lhL1Nlb3VsXCIg7J2066m0XG4gICAgICAvLyBcIjIwMjUtMTEtMjFUMDA6MDA6MDAuMDAwWlwiIOulvCBcIjIwMjUtMTEtMjFUMDk6MDA6MDArMDk6MDBcIiDsnLzroZwg67OA7ZmY7ZW07KO87Ja07JW8IO2VqeuLiOuLpC5cbiAgICAgIGNvbnN0IHsgZm9ybWF0SW5UaW1lWm9uZSB9ID0gYXdhaXQgaW1wb3J0KFwiZGF0ZS1mbnMtdHpcIik7XG5cbiAgICAgIC8vIElTTyA4NjAxIOuCoOynnCDtmJXsi50g7KCV6rec7IudICjsmIg6IDIwMjQtMDEtMTVUMDk6MzA6MDAuMDAwWilcbiAgICAgIGNvbnN0IElTT19EQVRFX1JFR0VYID0gL15cXGR7NH0tXFxkezJ9LVxcZHsyfVRcXGR7Mn06XFxkezJ9OlxcZHsyfShcXC5cXGR7M30pP1okLztcblxuICAgICAgLy8gVOulvCDrkZjrn6zsi7wg7J6R7J2A65Sw7Ji07ZGc6rCAIOyXhuuLpOuptCBcIjIwMjUtMTEtMTkxNzYzNTQ2MTg5MDAwMTg6NTY6MjkrMDk6MDBcIuyZgCDqsJnsnYAg6rKw6rO86rCAIOuCmOyYteuLiOuLpC5cbiAgICAgIC8vIOydtOuKlCBkYXRlLWZucyDtirnsnoXri4jri6QuXG4gICAgICAvLyDsnbTroIfqsowg7ZW064+EIOq0nOywruyKteuLiOuLpC4gXCIyMDI1LTExLTE5VDE4OjU2OjI5KzA5OjAwXCIg66qo7JaR7Jy866GcIOyemCDrgpjsmLXri4jri6QuXG4gICAgICBjb25zdCBEQVRFX0ZPUk1BVCA9IFwieXl5eS1NTS1kZCdUJ0hIOm1tOnNzWFhYXCI7XG5cbiAgICAgIHNlcnZlci5zZXRSZXBseVNlcmlhbGl6ZXIoKHBheWxvYWQpID0+IHtcbiAgICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHBheWxvYWQsIChfa2V5LCB2YWx1ZSkgPT4ge1xuICAgICAgICAgIGlmIChpc1N0cmluZ1ZhbHVlKHZhbHVlKSAmJiBJU09fREFURV9SRUdFWC50ZXN0KHZhbHVlKSkge1xuICAgICAgICAgICAgcmV0dXJuIGZvcm1hdEluVGltZVpvbmUoXG4gICAgICAgICAgICAgIG5ldyBEYXRlKHZhbHVlKSxcbiAgICAgICAgICAgICAgLyogU0FGRVRZOiBBUEkg642w7L2U66CI7J207YSw7JmAIFpvZCDqsoDspp3quLAg65Ox66GdIOqzhOyVveydtCDsnbQg6rCS7J2YIO2DgOyeheydhCDrs7TsnqXtlZzri6QuICovIHRpbWV6b25lIGFzIGAke3N0cmluZ30vJHtzdHJpbmd9YCxcbiAgICAgICAgICAgICAgREFURV9GT1JNQVQsXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgICAvLyBUaW1lem9uZSDroZzqt7jripQgcHJpbnRTdGFydHVwU3VtbWFyeeyXkOyEnCDthrXtlakg7Lac66ClXG4gICAgfVxuXG4gICAgLy8g7KCE7LK0IOudvOyasO2MhSDrpqzsiqTtirhcbiAgICBzZXJ2ZXIuZ2V0KFxuICAgICAgYCR7dGhpcy5jb25maWcuYXBpLnJvdXRlLnByZWZpeH0vcm91dGVzYCxcbiAgICAgIGFzeW5jIChfcmVxdWVzdCwgX3JlcGx5KTogUHJvbWlzZTx0eXBlb2YgdGhpcy5zeW5jZXIuYXBpcz4gPT4ge1xuICAgICAgICByZXR1cm4gdGhpcy5zeW5jZXIuYXBpcztcbiAgICAgIH0sXG4gICAgKTtcblxuICAgIC8vIEhlYWx0aGNoZWNrIEFQSVxuICAgIHNlcnZlci5nZXQoXG4gICAgICBgJHt0aGlzLmNvbmZpZy5hcGkucm91dGUucHJlZml4fS9oZWFsdGhjaGVja2AsXG4gICAgICBhc3luYyAoX3JlcXVlc3QsIF9yZXBseSk6IFByb21pc2U8c3RyaW5nPiA9PiB7XG4gICAgICAgIHJldHVybiBcIm9rXCI7XG4gICAgICB9LFxuICAgICk7XG5cbiAgICAvLyBTb25hbXUgVUkgQVBJICjroZzsu6wg7ZmY6rK97JeQ7ISc66eMKVxuICAgIGNvbnN0IHsgaXNMb2NhbCB9ID0gYXdhaXQgaW1wb3J0KFwiLi4vdXRpbHMvY29udHJvbGxlclwiKTtcbiAgICBpZiAoaXNMb2NhbCgpKSB7XG4gICAgICBjb25zdCB7IHNvbmFtdVVJQXBpUGx1Z2luIH0gPSBhd2FpdCBpbXBvcnQoXCIuLi91aS9hcGlcIik7XG4gICAgICBzZXJ2ZXIucmVnaXN0ZXIoc29uYW11VUlBcGlQbHVnaW4pO1xuICAgIH1cblxuICAgIC8vIERldlJ1bm5lciDthYzsiqTtirgg7JeU65Oc7Y+s7J247Yq4ICjroZzsu6wg7ZmY6rK9ICsgZGV2UnVubmVyIO2ZnOyEse2ZlCDsi5wpXG4gICAgaWYgKGlzTG9jYWwoKSAmJiB0aGlzLmNvbmZpZy50ZXN0Py5kZXZSdW5uZXI/LmVuYWJsZWQpIHtcbiAgICAgIGNvbnN0IHsgcmVnaXN0ZXJEZXZUZXN0Um91dGVzIH0gPSBhd2FpdCBpbXBvcnQoXCIuLi90ZXN0aW5nL2Rldi10ZXN0LXJvdXRlc1wiKTtcbiAgICAgIGF3YWl0IHJlZ2lzdGVyRGV2VGVzdFJvdXRlcyhzZXJ2ZXIsIHRoaXMuY29uZmlnLnRlc3QuZGV2UnVubmVyKTtcbiAgICB9XG5cbiAgICBjb25zdCB3ZWJQYXRoID0gcGF0aC5qb2luKHRoaXMuYXBwUm9vdFBhdGgsIFwid2ViXCIpO1xuICAgIGNvbnN0IGhhc1dlYiA9IGF3YWl0IGV4aXN0cyh3ZWJQYXRoKTtcblxuICAgIC8vIOyghOyXrSBjb21wcmVzcyDsmLXshZgg6rOE7IKwIChyb3V0ZS5jb21wcmVzczogdHJ1ZeydvCDrlYwg7IKs7JqpKVxuICAgIGNvbnN0IHBsdWdpbkNvbXByZXNzID0gdGhpcy5jb25maWcuc2VydmVyLnBsdWdpbnM/LmNvbXByZXNzO1xuICAgIGNvbnN0IGdsb2JhbENvbXByZXNzT3B0aW9uczogQ29tcHJlc3NPcHRpb25zIHwgdW5kZWZpbmVkID0gcGx1Z2luQ29tcHJlc3NcbiAgICAgID8gcGx1Z2luQ29tcHJlc3MgPT09IHRydWVcbiAgICAgICAgPyB7IHRocmVzaG9sZDogMTAyNCwgZW5jb2RpbmdzOiBbXCJiclwiLCBcImd6aXBcIiwgXCJkZWZsYXRlXCJdIH1cbiAgICAgICAgOiB7XG4gICAgICAgICAgICB0aHJlc2hvbGQ6IHBsdWdpbkNvbXByZXNzLnRocmVzaG9sZCxcbiAgICAgICAgICAgIGVuY29kaW5nczogcGx1Z2luQ29tcHJlc3MuZW5jb2RpbmdzLFxuICAgICAgICAgICAgY3VzdG9tVHlwZXM6IHBsdWdpbkNvbXByZXNzLmN1c3RvbVR5cGVzLFxuICAgICAgICAgIH1cbiAgICAgIDogdW5kZWZpbmVkO1xuXG4gICAgaWYgKGlzTG9jYWwoKSkge1xuICAgICAgLy8g66Gc7LusIOqwnOuwnCDtmZjqsr06IGNhdGNoLWFsbOuhnCBBUEnrpbwg64+Z7KCBIOunpOy5re2VmOyXrCBITVLsnYQg7KeA7JuQ7ZWp64uI64ukLlxuICAgICAgLy8gU09OQU1VX0RJU0FCTEVfSU5URUdSQVRFRF9XRUI9eWVz66GcIOyEpOygle2VmOuptCBkZXZfYXBpIOuqqOuTnOyXkOyEnCBWaXRlIO2Gte2VqeydhCDruYTtmZzshLHtmZTtlaAg7IiYIOyeiOyKteuLiOuLpC5cbiAgICAgIGNvbnN0IGRpc2FibGVJbnRlZ3JhdGVkV2ViID0gcHJvY2Vzcy5lbnYuU09OQU1VX0RJU0FCTEVfSU5URUdSQVRFRF9XRUIgPT09IFwieWVzXCI7XG4gICAgICBpZiAoaGFzV2ViICYmICFkaXNhYmxlSW50ZWdyYXRlZFdlYikge1xuICAgICAgICBhd2FpdCB0aGlzLnNldHVwRGV2U2VydmVyV2l0aFZpdGUoc2VydmVyLCB3ZWJQYXRoLCBjb25maWcpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5zZXR1cERldlNlcnZlcihzZXJ2ZXIsIGNvbmZpZyk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIO2UhOuhnOuNleyFmCDtmZjqsr06IOqwnOuzhCBBUEkg65287Jqw7Yq4ICsg7KCV7KCBIO2MjOydvCDshJzruZlcbiAgICAgIGZvciAoY29uc3QgYXBpIG9mIHRoaXMuc3luY2VyLmFwaXMpIHtcbiAgICAgICAgaWYgKHRoaXMuc3luY2VyLm1vZGVsc1thcGkubW9kZWxOYW1lXSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGDsoJXsnZjrkJjsp4Ag7JWK7J2AIOuqqOuNuOyXkCDsoJHqt7wgJHthcGkubW9kZWxOYW1lfWApO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQHdlYnNvY2tldCByb3V0ZeuKlCB3c0hhbmRsZXLroZwg65Ox66Gd7ZWY6rOgLCDqsJnsnYAgcGF0aOydmCDsnbzrsJggSFRUUCBHRVTsnYAgNDI2IOydkeuLteycvOuhnCB1cGdyYWRl66W8IOqwleygnO2VqFxuICAgICAgICBpZiAoYXBpLndlYnNvY2tldE9wdGlvbnMpIHtcbiAgICAgICAgICBzZXJ2ZXIucm91dGUoe1xuICAgICAgICAgICAgbWV0aG9kOiBcIkdFVFwiLFxuICAgICAgICAgICAgdXJsOiB0aGlzLmNvbmZpZy5hcGkucm91dGUucHJlZml4ICsgYXBpLnBhdGgsXG4gICAgICAgICAgICBoYW5kbGVyOiB0aGlzLmNyZWF0ZVdlYlNvY2tldFVwZ3JhZGVSZXF1aXJlZEhhbmRsZXIoKSxcbiAgICAgICAgICAgIHdzSGFuZGxlcjogdGhpcy5jcmVhdGVXZWJTb2NrZXRIYW5kbGVyKGFwaSwgY29uZmlnKSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHNlcnZlci5yb3V0ZSh7XG4gICAgICAgICAgbWV0aG9kOiBhcGkub3B0aW9ucy5odHRwTWV0aG9kID8/IFwiR0VUXCIsXG4gICAgICAgICAgdXJsOiB0aGlzLmNvbmZpZy5hcGkucm91dGUucHJlZml4ICsgYXBpLnBhdGgsXG4gICAgICAgICAgaGFuZGxlcjogYXdhaXQgdGhpcy5jcmVhdGVBcGlIYW5kbGVyKGFwaSwgY29uZmlnKSxcbiAgICAgICAgICBjb21wcmVzczogdG9GYXN0aWZ5Q29tcHJlc3NPcHRpb24oYXBpLm9wdGlvbnMuY29tcHJlc3MsIGdsb2JhbENvbXByZXNzT3B0aW9ucyksXG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICAvLyDtlITroZzrjZXshZjsl5DshJzripQgd2ViIOyGjOyKpChhcHBSb290L3dlYikg7Jyg66y07JmAIOustOq0gO2VmOqyjCxcbiAgICAgIC8vIGFwaS93ZWItZGlzdCDsobTsnqwg7Jes67aA66W8IHNldHVwU3RhdGljV2ViU2VydmVyIOuCtOu2gOyXkOyEnCDtjJDri6jtlanri4jri6QuXG4gICAgICBhd2FpdCB0aGlzLnNldHVwU3RhdGljV2ViU2VydmVyKHNlcnZlciwgY29uZmlnLCBnbG9iYWxDb21wcmVzc09wdGlvbnMpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBkZXYg66qo65OcIOqzte2GtTogY2F0Y2gtYWxs7JeQ7IScIOuniOyngOuniSDspIDruYQg7JmE66OMIEFQSSBzbmFwc2hvdOydhCDtg5Dsg4ntlZjsl6wg7JqU7LKt7J2EIOyymOumrO2VqeuLiOuLpC5cbiAgICogc2VydmVyLnJvdXRlKCnroZwg6rCc67OEIOuTseuhne2VmOuptCBoYW5kbGVy6rCAIOqzoOygleuQmOyWtCBITVLsnbQg64+Z7J6R7ZWY7KeAIOyViuycvOuvgOuhnCxcbiAgICogcmVmcmVzaCDshLHqs7Ug7IucIOq1kOyytOuQmOuKlCBzbmFwc2hvdOydhCDrp6Qg7JqU7LKtIOyhsO2ajO2VqeuLiOuLpC5cbiAgICpcbiAgICog7JqU7LKt7J20IC9hcGko7KCV7ZmV7Z6I64qUIHRoaXMuY29uZmlnLmFwaS5yb3V0ZS5wcmVmaXgp66GcIOyLnOyeke2VmOyngCDslYrripQg6rK97Jqw652866m0IG51bGzsnYQg67CY7ZmY7ZWY66mwIOuBneuDheuLiOuLpC5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgaGFuZGxlRGV2QXBpUmVxdWVzdChcbiAgICByZXF1ZXN0OiBGYXN0aWZ5UmVxdWVzdCxcbiAgICBjb25maWc6IFNvbmFtdUZhc3RpZnlDb25maWcsXG4gICk6IFByb21pc2U8KChyZXF1ZXN0OiBGYXN0aWZ5UmVxdWVzdCwgcmVwbHk6IEZhc3RpZnlSZXBseSkgPT4gUHJvbWlzZTxBcGlNZXRob2RSZXN1bHQ+KSB8IG51bGw+IHtcbiAgICBjb25zdCBtYXRjaGVkQXBpID0gdGhpcy5maW5kTWF0Y2hlZEFwaShyZXF1ZXN0LCB0aGlzLnByZXBhcmVkQXBpcywgdGhpcy5wcmVwYXJlZE1vZGVscyk7XG5cbiAgICBpZiAoIW1hdGNoZWRBcGkpIHtcbiAgICAgIHRocm93IG5ldyBOb3RGb3VuZEV4Y2VwdGlvbihTRChcImVycm9yLmFwaS5ub3RGb3VuZFwiKSk7XG4gICAgfVxuXG4gICAgLy8gd2Vic29ja2V0IHJvdXRl66W8IOydvOuwmCBIVFRQ66GcIOyngeygkSDtmLjstpztlZwg6rK97JqwIDQyNuydhCDrj4zroKTspJggdXBncmFkZSDsl4bsnbQg7KCR6re87ZWY64qUIOqyg+ydhCDssKjri6jtlahcbiAgICBpZiAobWF0Y2hlZEFwaS53ZWJzb2NrZXRPcHRpb25zKSB7XG4gICAgICByZXR1cm4gdGhpcy5jcmVhdGVXZWJTb2NrZXRVcGdyYWRlUmVxdWlyZWRIYW5kbGVyKCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuY3JlYXRlQXBpSGFuZGxlcihtYXRjaGVkQXBpLCBjb25maWcsIHRoaXMucHJlcGFyZWRNb2RlbHMpO1xuICB9XG5cbiAgcHJpdmF0ZSBmaW5kTWF0Y2hlZEFwaShcbiAgICByZXF1ZXN0OiBGYXN0aWZ5UmVxdWVzdCxcbiAgICBhcGlzOiByZWFkb25seSBFeHRlbmRlZEFwaVtdLFxuICAgIG1vZGVsczogTG9hZGVkTW9kZWxzLFxuICApOiBFeHRlbmRlZEFwaSB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgdXJsID0gdGhpcy5nZXRQYXRobmFtZUZyb21VcmwocmVxdWVzdC51cmwpO1xuICAgIGNvbnN0IG1ldGhvZCA9IHJlcXVlc3QubWV0aG9kO1xuXG4gICAgaWYgKCF1cmwuc3RhcnRzV2l0aCh0aGlzLmNvbmZpZy5hcGkucm91dGUucHJlZml4KSkge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICByZXR1cm4gYXBpcy5maW5kKChhcGkpID0+IHtcbiAgICAgIGlmIChtb2RlbHNbYXBpLm1vZGVsTmFtZV0gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICBjb25zdCBhcGlNZXRob2QgPSBhcGkub3B0aW9ucy5odHRwTWV0aG9kID8/IFwiR0VUXCI7XG4gICAgICBpZiAoYXBpTWV0aG9kICE9PSBtZXRob2QpIHJldHVybiBmYWxzZTtcblxuICAgICAgY29uc3QgZnVsbFBhdGggPSB0aGlzLmNvbmZpZy5hcGkucm91dGUucHJlZml4ICsgYXBpLnBhdGg7XG4gICAgICByZXR1cm4gdGhpcy5pc1BhdGhQYXR0ZXJuTWF0Y2goZnVsbFBhdGgsIHVybCk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogZGV2IGFwaSDrqqjrk5w6IFZpdGUg7JeG7J20IEFQSSDrj5nsoIEg65287Jqw7YyF66eMIOygnOqzte2VqeuLiOuLpC5cbiAgICogSE1S7J2EIOychO2VtCBjYXRjaC1hbGzsl5DshJwg66ekIOyalOyyreuniOuLpCDspIDruYQg7JmE66OMIEFQSSBzbmFwc2hvdOydhCDsobDtmoztlanri4jri6QuXG4gICAqL1xuICBwcml2YXRlIHNldHVwRGV2U2VydmVyKFxuICAgIHNlcnZlcjogRmFzdGlmeUluc3RhbmNlPFNlcnZlciwgSW5jb21pbmdNZXNzYWdlLCBTZXJ2ZXJSZXNwb25zZT4sXG4gICAgY29uZmlnOiBTb25hbXVGYXN0aWZ5Q29uZmlnLFxuICApOiB2b2lkIHtcbiAgICAvLyB1cGdyYWRl64qUIOyLpOyniOyggeycvOuhnCBHRVTsl5DshJzrp4wg7ISx66a97ZWY66+A66GcIEdFVCArIHdzSGFuZGxlciDsmYAg6re4IOyZuCBtZXRob2Trpbwg67OE64+EIHJvdXRl66GcIOu2hOumrO2VqFxuICAgIHNlcnZlci5yb3V0ZSh7XG4gICAgICBtZXRob2Q6IFwiR0VUXCIsXG4gICAgICB1cmw6IGAke3RoaXMuY29uZmlnLmFwaS5yb3V0ZS5wcmVmaXh9LypgLFxuICAgICAgaGFuZGxlcjogYXN5bmMgKHJlcXVlc3QsIHJlcGx5KSA9PiB7XG4gICAgICAgIGNvbnN0IGhhbmRsZXIgPSBhd2FpdCB0aGlzLmhhbmRsZURldkFwaVJlcXVlc3QocmVxdWVzdCwgY29uZmlnKTtcbiAgICAgICAgaWYgKGhhbmRsZXIpIHtcbiAgICAgICAgICByZXR1cm4gaGFuZGxlcihyZXF1ZXN0LCByZXBseSk7XG4gICAgICAgIH1cbiAgICAgICAgLy8g65Ox66Gd65CcIEFQSeyZgCDsnbzsuZjtlZjsp4Ag7JWK64qUIOyalOyyreyXkCDrjIDtlZwgZmFsbGJhY2vsnoXri4jri6QuXG4gICAgICAgIHRocm93IG5ldyBOb3RGb3VuZEV4Y2VwdGlvbihTRChcImVycm9yLmFwaS5ub3RGb3VuZFwiKSk7XG4gICAgICB9LFxuICAgICAgd3NIYW5kbGVyOiBhc3luYyAoY29ubmVjdGlvbiwgcmVxdWVzdCkgPT4ge1xuICAgICAgICBhd2FpdCB0aGlzLmhhbmRsZURldldlYlNvY2tldFJlcXVlc3QoY29ubmVjdGlvbi5zb2NrZXQsIHJlcXVlc3QsIGNvbmZpZyk7XG4gICAgICB9LFxuICAgIH0pO1xuXG4gICAgc2VydmVyLnJvdXRlKHtcbiAgICAgIG1ldGhvZDogW1wiSEVBRFwiLCBcIlBPU1RcIiwgXCJQVVRcIiwgXCJERUxFVEVcIiwgXCJQQVRDSFwiXSxcbiAgICAgIHVybDogYCR7dGhpcy5jb25maWcuYXBpLnJvdXRlLnByZWZpeH0vKmAsXG4gICAgICBoYW5kbGVyOiBhc3luYyAocmVxdWVzdCwgcmVwbHkpID0+IHtcbiAgICAgICAgY29uc3QgaGFuZGxlciA9IGF3YWl0IHRoaXMuaGFuZGxlRGV2QXBpUmVxdWVzdChyZXF1ZXN0LCBjb25maWcpO1xuICAgICAgICBpZiAoaGFuZGxlcikge1xuICAgICAgICAgIHJldHVybiBoYW5kbGVyKHJlcXVlc3QsIHJlcGx5KTtcbiAgICAgICAgfVxuICAgICAgICB0aHJvdyBuZXcgTm90Rm91bmRFeGNlcHRpb24oU0QoXCJlcnJvci5hcGkubm90Rm91bmRcIikpO1xuICAgICAgfSxcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgdml0ZVNlcnZlcjogYW55ID0gbnVsbDtcblxuICAvKipcbiAgICogZGV2IGFsbCDrqqjrk5w6IFZpdGUgRGV2IFNlcnZlcuulvCDthrXtlantlZjsl6wgQVBJICsgU1NSICsgQ1NS7J2EIOuqqOuRkCDsoJzqs7Xtlanri4jri6QuXG4gICAqIEFQSSDrj5nsoIEg66ek7Lmt7J2AIGhhbmRsZURldkFwaVJlcXVlc3Trpbwg6rO17Jyg7ZWp64uI64ukLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBzZXR1cERldlNlcnZlcldpdGhWaXRlKFxuICAgIHNlcnZlcjogRmFzdGlmeUluc3RhbmNlPFNlcnZlciwgSW5jb21pbmdNZXNzYWdlLCBTZXJ2ZXJSZXNwb25zZT4sXG4gICAgd2ViUGF0aDogc3RyaW5nLFxuICAgIGNvbmZpZzogU29uYW11RmFzdGlmeUNvbmZpZyxcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgLy8gQGZhc3RpZnkvbWlkZGllIOuTseuhnSAoQ29ubmVjdC1zdHlsZSBtaWRkbGV3YXJlIOyngOybkClcbiAgICBhd2FpdCBzZXJ2ZXIucmVnaXN0ZXIoKGF3YWl0IGltcG9ydChcIkBmYXN0aWZ5L21pZGRpZVwiKSkuZGVmYXVsdCk7XG5cbiAgICBjb25zdCB2aXRlID0gYXdhaXQgaW1wb3J0KFwidml0ZVwiKTtcbiAgICAvLyBAZmFzdGlmeS93ZWJzb2NrZXQg7ZSM65+s6re47J247J20IO2ZnOyEse2ZlOuQmOuptCBITVIgd2Vic29ja2V06rO8IHNlcnZlciBzb2NrZXTsnbQg7Lap64+M7ZWY66+A66GcIGRlZGljYXRlZCDtj6ztirjroZwg67aE66as7ZWoXG4gICAgY29uc3QgcmVxdWlyZXNEZWRpY2F0ZWRIbXJTZXJ2ZXIgPSBCb29sZWFuKHRoaXMuY29uZmlnLnNlcnZlci5wbHVnaW5zPy53cyk7XG4gICAgY29uc3QgaG1yID0gcmVzb2x2ZUludGVncmF0ZWRWaXRlSG1yT3B0aW9ucyh7XG4gICAgICBodHRwU2VydmVyOiBzZXJ2ZXIuc2VydmVyLFxuICAgICAgcmVxdWlyZXNEZWRpY2F0ZWRXZWJTb2NrZXRTZXJ2ZXI6IHJlcXVpcmVzRGVkaWNhdGVkSG1yU2VydmVyLFxuICAgIH0pO1xuXG4gICAgdGhpcy52aXRlU2VydmVyID0gYXdhaXQgdml0ZS5jcmVhdGVTZXJ2ZXIoe1xuICAgICAgcm9vdDogd2ViUGF0aCxcbiAgICAgIHNlcnZlcjoge1xuICAgICAgICBtaWRkbGV3YXJlTW9kZTogdHJ1ZSxcbiAgICAgICAgaG1yLFxuICAgICAgfSxcbiAgICAgIGFwcFR5cGU6IFwiY3VzdG9tXCIsXG4gICAgfSk7XG5cbiAgICAvLyBWaXRlIG1pZGRsZXdhcmUg65Ox66GdIChWaXRlIOyXkOyFiyDsspjrpqwpXG4gICAgc2VydmVyLnVzZSgocmVxLCByZXMsIG5leHQpID0+IHtcbiAgICAgIC8vIEFQSeyZgCBTb25hbXUgVUnripQgRmFzdGlmeSDrnbzsmrDtirjqsIAg7LKY66as7ZWY64+E66GdIHNraXBcbiAgICAgIGlmIChyZXEudXJsPy5zdGFydHNXaXRoKHRoaXMuY29uZmlnLmFwaS5yb3V0ZS5wcmVmaXgpIHx8IHJlcS51cmw/LnN0YXJ0c1dpdGgoXCIvc29uYW11LXVpXCIpKSB7XG4gICAgICAgIHJldHVybiBuZXh0KCk7XG4gICAgICB9XG4gICAgICAvLyDrgpjrqLjsp4DripQgVml0ZSBtaWRkbGV3YXJl66GcIOyghOuLrFxuICAgICAgcmV0dXJuIHRoaXMudml0ZVNlcnZlci5taWRkbGV3YXJlcyhyZXEsIHJlcywgbmV4dCk7XG4gICAgfSk7XG5cbiAgICAvLyBXUyB1cGdyYWRlIOqyveuhnChHRVQp7JmAIOydvOuwmCBIVFRQIOuplOyEnOuTnOulvCDrs4Trj4Qgcm91dGXroZwg67aE66as7ZW0IHdlYnNvY2tldCByb3V0ZeqwgCBIVE1MIGZhbGxiYWNr7JeQIOuoue2eiOyngCDslYrrj4TroZ0g7ZWoXG4gICAgc2VydmVyLnJvdXRlKHtcbiAgICAgIG1ldGhvZDogXCJHRVRcIixcbiAgICAgIHVybDogYCR7dGhpcy5jb25maWcuYXBpLnJvdXRlLnByZWZpeH0vKmAsXG4gICAgICBoYW5kbGVyOiBhc3luYyAocmVxdWVzdCwgcmVwbHkpID0+IHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5oYW5kbGVEZXZBcGlSZXF1ZXN0KHJlcXVlc3QsIGNvbmZpZyk7XG4gICAgICAgIGlmIChyZXN1bHQpIHtcbiAgICAgICAgICByZXR1cm4gcmVzdWx0KHJlcXVlc3QsIHJlcGx5KTtcbiAgICAgICAgfVxuICAgICAgICB0aHJvdyBuZXcgTm90Rm91bmRFeGNlcHRpb24oU0QoXCJlcnJvci5hcGkubm90Rm91bmRcIikpO1xuICAgICAgfSxcbiAgICAgIHdzSGFuZGxlcjogYXN5bmMgKGNvbm5lY3Rpb24sIHJlcXVlc3QpID0+IHtcbiAgICAgICAgYXdhaXQgdGhpcy5oYW5kbGVEZXZXZWJTb2NrZXRSZXF1ZXN0KGNvbm5lY3Rpb24uc29ja2V0LCByZXF1ZXN0LCBjb25maWcpO1xuICAgICAgfSxcbiAgICB9KTtcblxuICAgIHNlcnZlci5yb3V0ZSh7XG4gICAgICBtZXRob2Q6IFtcIkhFQURcIiwgXCJQT1NUXCIsIFwiUFVUXCIsIFwiREVMRVRFXCIsIFwiUEFUQ0hcIl0sXG4gICAgICB1cmw6IGAke3RoaXMuY29uZmlnLmFwaS5yb3V0ZS5wcmVmaXh9LypgLFxuICAgICAgaGFuZGxlcjogYXN5bmMgKHJlcXVlc3QsIHJlcGx5KSA9PiB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuaGFuZGxlRGV2QXBpUmVxdWVzdChyZXF1ZXN0LCBjb25maWcpO1xuICAgICAgICBpZiAocmVzdWx0KSB7XG4gICAgICAgICAgcmV0dXJuIHJlc3VsdChyZXF1ZXN0LCByZXBseSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhyb3cgbmV3IE5vdEZvdW5kRXhjZXB0aW9uKFNEKFwiZXJyb3IuYXBpLm5vdEZvdW5kXCIpKTtcbiAgICAgIH0sXG4gICAgfSk7XG5cbiAgICAvLyBjYXRjaC1hbGwg65287Jqw7Yq47JeQ7IScIFNTUi9DU1Ig7LKY66asXG4gICAgLy8g6rCc67CcIO2ZmOqyveyXkOyEnOuKlCDrnbzsmrDtirjrs4QgY29tcHJlc3Mg7Ji17IWY7J2EIO2PrOq4sO2VmOqzoCBITVIg7J207KCQ7J2EIOy3qO2VqeuLiOuLpC5cbiAgICBzZXJ2ZXIucm91dGUoe1xuICAgICAgbWV0aG9kOiBbXCJHRVRcIiwgXCJIRUFEXCJdLFxuICAgICAgdXJsOiBcIi8qXCIsXG4gICAgICBoYW5kbGVyOiBhc3luYyAocmVxdWVzdCwgcmVwbHkpID0+IHtcbiAgICAgICAgY29uc3QgdXJsID0gcmVxdWVzdC51cmw7XG5cbiAgICAgICAgLy8gMS4gU1NSIOudvOyasO2KuCDsspjrpqxcbiAgICAgICAgY29uc3QgeyBtYXRjaFNTUlJvdXRlLCByZW5kZXJTU1IgfSA9IGF3YWl0IGltcG9ydChcIi4uL3NzclwiKTtcbiAgICAgICAgY29uc3Qgc3NyTWF0Y2ggPSBtYXRjaFNTUlJvdXRlKHVybCk7XG4gICAgICAgIGlmIChzc3JNYXRjaCkge1xuICAgICAgICAgIGNvbnNvbGUubG9nKGBbU1NSXSBNYXRjaGVkIHJvdXRlOiAke3Nzck1hdGNoLnJvdXRlLnBhdGh9YCk7XG4gICAgICAgICAgY29uc3QgaHRtbCA9IGF3YWl0IHJlbmRlclNTUihcbiAgICAgICAgICAgIHVybCxcbiAgICAgICAgICAgIHNzck1hdGNoLnJvdXRlLFxuICAgICAgICAgICAgc3NyTWF0Y2gucGFyYW1zLFxuICAgICAgICAgICAgcmVxdWVzdCxcbiAgICAgICAgICAgIHJlcGx5LFxuICAgICAgICAgICAgY29uZmlnLFxuICAgICAgICAgICAgdGhpcy52aXRlU2VydmVyLFxuICAgICAgICAgICk7XG4gICAgICAgICAgcmVwbHkudHlwZShcInRleHQvaHRtbFwiKTtcbiAgICAgICAgICByZXR1cm4gaHRtbDtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIDIuIENTUiBmYWxsYmFja1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGxldCB0ZW1wbGF0ZSA9IGF3YWl0IGZzLnJlYWRGaWxlKFxuICAgICAgICAgICAgcGF0aC5qb2luKHRoaXMudml0ZVNlcnZlci5jb25maWcucm9vdCwgXCJpbmRleC5odG1sXCIpLFxuICAgICAgICAgICAgXCJ1dGYtOFwiLFxuICAgICAgICAgICk7XG4gICAgICAgICAgdGVtcGxhdGUgPSBhd2FpdCB0aGlzLnZpdGVTZXJ2ZXIudHJhbnNmb3JtSW5kZXhIdG1sKHVybCwgdGVtcGxhdGUpO1xuXG4gICAgICAgICAgLy8gP2htcj1mYWxzZeuhnCDsl7Ag7Y6Y7J207KeA64qUIEhNUiDsm7nshozsvJPrp4wg64GK7Ja0IOyDiOuhnOqzoOy5qOuQmOyngCDslYrqsowg7ZWc64ukLlxuICAgICAgICAgIGNvbnN0IHsgSE1SX09QVF9PVVRfU0NSSVBULCBpc0htckRpc2FibGVkQnlRdWVyeSB9ID0gYXdhaXQgaW1wb3J0KFwiLi4vc3NyL2htci1vcHQtb3V0XCIpO1xuICAgICAgICAgIGlmIChpc0htckRpc2FibGVkQnlRdWVyeSh1cmwpKSB7XG4gICAgICAgICAgICB0ZW1wbGF0ZSA9IHRlbXBsYXRlLnJlcGxhY2UoXCI8aGVhZD5cIiwgYDxoZWFkPlxcbiR7SE1SX09QVF9PVVRfU0NSSVBUfWApO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJlcGx5LnR5cGUoXCJ0ZXh0L2h0bWxcIik7XG4gICAgICAgICAgcmV0dXJuIHRlbXBsYXRlO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgdGhpcy52aXRlU2VydmVyLnNzckZpeFN0YWNrdHJhY2UoXG4gICAgICAgICAgICAvKiBTQUZFVFk6IEFQSSDrjbDsvZTroIjsnbTthLDsmYAgWm9kIOqygOymneq4sCDrk7HroZ0g6rOE7JW97J20IOydtCDqsJLsnZgg7YOA7J6F7J2EIOuztOyepe2VnOuLpC4gKi8gZSBhcyBFcnJvcixcbiAgICAgICAgICApO1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZSk7XG4gICAgICAgICAgcmVwbHkuc3RhdHVzKDUwMCk7XG4gICAgICAgICAgcmV0dXJuIC8qIFNBRkVUWTogQVBJIOuNsOy9lOugiOydtO2EsOyZgCBab2Qg6rKA7Kad6riwIOuTseuhnSDqs4Tslb3snbQg7J20IOqwkuydmCDtg4DsnoXsnYQg67O07J6l7ZWc64ukLiAqLyAoXG4gICAgICAgICAgICBlIGFzIEVycm9yXG4gICAgICAgICAgKS5tZXNzYWdlO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgIH0pO1xuXG4gICAgLy8g7ISc67KEIOyiheujjCDsi5wgVml0ZeuPhCDsooXro4xcbiAgICBzZXJ2ZXIuYWRkSG9vayhcIm9uQ2xvc2VcIiwgYXN5bmMgKCkgPT4ge1xuICAgICAgYXdhaXQgdGhpcy52aXRlU2VydmVyLmNsb3NlKCk7XG4gICAgfSk7XG5cbiAgICBpZiAoXCJwb3J0XCIgaW4gaG1yKSB7XG4gICAgICBjb25zb2xlLmxvZyhcbiAgICAgICAgY2hhbGsuZGltKFxuICAgICAgICAgIGDinJMgVml0ZSBITVIgdXNpbmcgZGVkaWNhdGVkIHdlYnNvY2tldCBwb3J0ICR7aG1yLnBvcnR9IHRvIGF2b2lkIEZhc3RpZnkgd2Vic29ja2V0IGNvbmZsaWN0c2AsXG4gICAgICAgICksXG4gICAgICApO1xuICAgIH1cbiAgICBjb25zb2xlLmxvZyhjaGFsay5kaW0oXCLinJMgVml0ZSBkZXYgc2VydmVyIGludGVncmF0ZWRcIikpO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBzZXR1cFN0YXRpY1dlYlNlcnZlcihcbiAgICBzZXJ2ZXI6IEZhc3RpZnlJbnN0YW5jZTxTZXJ2ZXIsIEluY29taW5nTWVzc2FnZSwgU2VydmVyUmVzcG9uc2U+LFxuICAgIGNvbmZpZzogU29uYW11RmFzdGlmeUNvbmZpZyxcbiAgICBnbG9iYWxDb21wcmVzc09wdGlvbnM6IENvbXByZXNzT3B0aW9ucyB8IHVuZGVmaW5lZCxcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgLy8g6rK966GcIOuqhe2Zle2ZlDogYXBpL3dlYi1kaXN0L2NsaWVudCAo7KCV7KCBIO2MjOydvCksIGFwaS93ZWItZGlzdC9zZXJ2ZXIgKFNTUiBlbnRyeSksIGFwaS9kaXN0L3NzciAoU1NSIHJvdXRlcyAtIEFQSSDshozsnKApXG4gICAgY29uc3Qgd2ViRGlzdFBhdGggPSBwYXRoLmpvaW4odGhpcy5hcGlSb290UGF0aCwgXCJ3ZWItZGlzdFwiLCBcImNsaWVudFwiKTtcbiAgICBjb25zdCBzc3JQYXRoID0gcGF0aC5qb2luKHRoaXMuYXBpUm9vdFBhdGgsIFwid2ViLWRpc3RcIiwgXCJzZXJ2ZXJcIik7XG4gICAgY29uc3Qgc3NyRW50cnlQYXRoID0gcGF0aC5qb2luKHNzclBhdGgsIFwiZW50cnktc2VydmVyLmdlbmVyYXRlZC5qc1wiKTtcbiAgICBjb25zdCBzc3JSb3V0ZXNQYXRoID0gcGF0aC5qb2luKHRoaXMuYXBpUm9vdFBhdGgsIFwiZGlzdFwiLCBcInNzclwiLCBcInJvdXRlcy5qc1wiKTtcblxuICAgIGlmICghKGF3YWl0IGV4aXN0cyh3ZWJEaXN0UGF0aCkpKSB7XG4gICAgICBjb25zb2xlLndhcm4oYOKaoCBXZWIgZGlzdCBub3QgZm91bmQ6ICR7d2ViRGlzdFBhdGh9YCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gU1NSIGVudHJ5IOyhtOyerCDsl6zrtoAg7ZmV7J24XG4gICAgY29uc3Qgc3NyQXZhaWxhYmxlID0gYXdhaXQgZXhpc3RzKHNzckVudHJ5UGF0aCk7XG5cbiAgICBpZiAoIXNzckF2YWlsYWJsZSkge1xuICAgICAgY29uc29sZS53YXJuKGDimqAgU1NSIGVudHJ5IG5vdCBmb3VuZDogJHtzc3JFbnRyeVBhdGh9YCk7XG4gICAgICBjb25zb2xlLndhcm4oXCIgIFNTUiB3aWxsIGJlIGRpc2FibGVkLiBPbmx5IENTUiB3aWxsIHdvcmsuXCIpO1xuICAgIH1cblxuICAgIC8vIFNTUiDrnbzsmrDtirgg66Gc65OcIChwcm9kdWN0aW9u7JeQ7ISc66eMLCDsgqzsmqnsnpAg7ZSE66Gc7KCd7Yq47J2YIHNzci9yb3V0ZXMudHMpXG4gICAgaWYgKHNzckF2YWlsYWJsZSkge1xuICAgICAgaWYgKGF3YWl0IGV4aXN0cyhzc3JSb3V0ZXNQYXRoKSkge1xuICAgICAgICAvLyB0cy1sb2FkZXLrnbzrqbQgXCJmaWxlOi8vXCLroZwg7Iuc7J6R7ZWY64qUIGZ1bGx5LXJlc29sdmVkIHBhdGjrp4wg67Cb6riw7JeQIOydtOulvCDsspjrpqztlbTso7zripQgaW1wb3J0TWVtYmVyc+ulvCDsgqzsmqntlbTslbwg7ZaI6rKg7KeA66eMLFxuICAgICAgICAvLyDsl6zquLDripQg7ZSE66Gc642V7IWYIO2ZmOqyveyXkOyEnCBsb2FkZXIg7JeG7J20IOuPjOyVhOqwgOq4sCDrlYzrrLjsl5AgXCLsp4Tsp5wganMg7YyM7J28XCLsnZggXCLqt7jrg6VcIiDsoIjrjIDqsr3roZzrpbwg67CU66GcIGltcG9ydO2VtOuPhCDrkKnri4jri6QuXG4gICAgICAgIC8vIOydtCDrgrTsmqnsnYAg7J20IO2VqOyImCDrgrTsl5DshJwg7JWE656Y7JeQIOuCmOyYrCDri6TrpbggaW1wb3J0IO2YuOy2nOyXkOuPhCDrj5nsnbztlZjqsowg7KCB7Jqp65Cp64uI64ukLlxuICAgICAgICBhd2FpdCBpbXBvcnQoc3NyUm91dGVzUGF0aCk7XG4gICAgICAgIGNvbnNvbGUubG9nKFwi4pyTIFNTUiByb3V0ZXMgbG9hZGVkXCIpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc29sZS53YXJuKGDimqAgU1NSIHJvdXRlcyBub3QgZm91bmQ6ICR7c3NyUm91dGVzUGF0aH1gKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyDroaTrp4Eg7JeF642w7J207Yq4IOuMgOydkTogYXNzZXQgaGFzaCDrtojsnbzsuZgg7IucIO2YhOyerCDrsoTsoIQg7KeB7KCRIOyEnOu5mVxuICAgIHNlcnZlci5nZXQoXCIvYXNzZXRzLzpmaWxlbmFtZVwiLCBhc3luYyAocmVxdWVzdCwgcmVwbHkpID0+IHtcbiAgICAgIGNvbnN0IHJlcXVlc3RlZEZpbGUgPVxuICAgICAgICAvKiBTQUZFVFk6IEFQSSDrjbDsvZTroIjsnbTthLDsmYAgWm9kIOqygOymneq4sCDrk7HroZ0g6rOE7JW97J20IOydtCDqsJLsnZgg7YOA7J6F7J2EIOuztOyepe2VnOuLpC4gKi8gKFxuICAgICAgICAgIHJlcXVlc3QucGFyYW1zIGFzIHsgZmlsZW5hbWU6IHN0cmluZyB9XG4gICAgICAgICkuZmlsZW5hbWU7XG4gICAgICBjb25zdCBhc3NldHNEaXIgPSBwYXRoLmpvaW4od2ViRGlzdFBhdGgsIFwiYXNzZXRzXCIpO1xuICAgICAgY29uc3Qgc2FmZUZpbGVQYXRoID0gdGhpcy5yZXNvbHZlUGF0aFdpdGhpbkJhc2VEaXIoYXNzZXRzRGlyLCByZXF1ZXN0ZWRGaWxlKTtcbiAgICAgIGlmIChzYWZlRmlsZVBhdGggPT09IG51bGwpIHtcbiAgICAgICAgcmVwbHkuc3RhdHVzKDQwMykuc2VuZCgpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBjb25zdCBub3JtYWxpemVkUmVxdWVzdGVkRmlsZSA9IHBhdGgucmVsYXRpdmUoYXNzZXRzRGlyLCBzYWZlRmlsZVBhdGgpLnJlcGxhY2UoL1xcXFwvZywgXCIvXCIpO1xuXG4gICAgICBjb25zdCBhc3NldFBhdGggPSBgL2Fzc2V0cy8ke25vcm1hbGl6ZWRSZXF1ZXN0ZWRGaWxlfWA7XG5cbiAgICAgIC8vIENhY2hlLUNvbnRyb2wg7Zek642UIOqysOyglVxuICAgICAgY29uc3QgZ2V0Q2FjaGVDb250cm9sRm9yQXNzZXQgPSAoKTogQ2FjaGVDb250cm9sQ29uZmlnID0+IHtcbiAgICAgICAgY29uc3QgY2FjaGVSZXE6IENhY2hlQ29udHJvbFJlcXVlc3QgPSB7XG4gICAgICAgICAgdHlwZTogXCJhc3NldHNcIixcbiAgICAgICAgICB1cmw6IHJlcXVlc3QudXJsLFxuICAgICAgICAgIHBhdGg6IGFzc2V0UGF0aCxcbiAgICAgICAgICBtZXRob2Q6IHJlcXVlc3QubWV0aG9kLFxuICAgICAgICB9O1xuXG4gICAgICAgIC8vIOyCrOyaqeyekCDsoJXsnZgg7ZW465Ok65+sIOyasOyEoFxuICAgICAgICBpZiAoY29uZmlnLmNhY2hlQ29udHJvbEhhbmRsZXIpIHtcbiAgICAgICAgICBjb25zdCByZXN1bHQgPSBjb25maWcuY2FjaGVDb250cm9sSGFuZGxlcihjYWNoZVJlcSk7XG4gICAgICAgICAgaWYgKHJlc3VsdCkgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIOq4sOuzuOqwkjogaW1tdXRhYmxlXG4gICAgICAgIHJldHVybiBDYWNoZVByZXNldHMuaW1tdXRhYmxlO1xuICAgICAgfTtcblxuICAgICAgLy8gaW5kZXgtKi5qcyDrmJDripQgaW5kZXgtKi5jc3Mg7JqU7LKt7J24IOqyveyasFxuICAgICAgaWYgKC9eaW5kZXgtW2EtZjAtOV0rXFwuKGpzfGNzcykkLy50ZXN0KG5vcm1hbGl6ZWRSZXF1ZXN0ZWRGaWxlKSkge1xuICAgICAgICBjb25zdCBleHQgPSBub3JtYWxpemVkUmVxdWVzdGVkRmlsZS5zcGxpdChcIi5cIikucG9wKCk7XG4gICAgICAgIGNvbnN0IGZpbGVzID0gYXdhaXQgZnMucmVhZGRpcihhc3NldHNEaXIpO1xuICAgICAgICBjb25zdCBjdXJyZW50RmlsZSA9IGZpbGVzLmZpbmQoKGYpID0+IGYuc3RhcnRzV2l0aChcImluZGV4LVwiKSAmJiBmLmVuZHNXaXRoKGAuJHtleHR9YCkpO1xuXG4gICAgICAgIGlmIChjdXJyZW50RmlsZSkge1xuICAgICAgICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5qb2luKGFzc2V0c0RpciwgY3VycmVudEZpbGUpO1xuICAgICAgICAgIGNvbnN0IGNvbnRlbnQgPSBhd2FpdCBmcy5yZWFkRmlsZShmaWxlUGF0aCk7XG4gICAgICAgICAgcmVwbHkudHlwZShleHQgPT09IFwianNcIiA/IFwiYXBwbGljYXRpb24vamF2YXNjcmlwdFwiIDogXCJ0ZXh0L2Nzc1wiKTtcbiAgICAgICAgICBhcHBseUNhY2hlSGVhZGVycyhyZXBseSwgZ2V0Q2FjaGVDb250cm9sRm9yQXNzZXQoKSk7XG4gICAgICAgICAgcmV0dXJuIHJlcGx5LnNlbmQoY29udGVudCk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8g7J2867CYIO2MjOydvCDshJzruZlcbiAgICAgIGNvbnN0IGZpbGVQYXRoID0gc2FmZUZpbGVQYXRoO1xuICAgICAgaWYgKGF3YWl0IGV4aXN0cyhmaWxlUGF0aCkpIHtcbiAgICAgICAgY29uc3QgY29udGVudCA9IGF3YWl0IGZzLnJlYWRGaWxlKGZpbGVQYXRoKTtcbiAgICAgICAgY29uc3QgZXh0ID0gbm9ybWFsaXplZFJlcXVlc3RlZEZpbGUuc3BsaXQoXCIuXCIpLnBvcCgpO1xuICAgICAgICByZXBseS50eXBlKGV4dCA9PT0gXCJqc1wiID8gXCJhcHBsaWNhdGlvbi9qYXZhc2NyaXB0XCIgOiBleHQgPT09IFwiY3NzXCIgPyBcInRleHQvY3NzXCIgOiBcIlwiKTtcbiAgICAgICAgaWYgKG5vcm1hbGl6ZWRSZXF1ZXN0ZWRGaWxlLmluY2x1ZGVzKFwiLVwiKSkge1xuICAgICAgICAgIGFwcGx5Q2FjaGVIZWFkZXJzKHJlcGx5LCBnZXRDYWNoZUNvbnRyb2xGb3JBc3NldCgpKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVwbHkuc2VuZChjb250ZW50KTtcbiAgICAgIH1cblxuICAgICAgcmVwbHkuc3RhdHVzKDQwNCkuc2VuZCgpO1xuICAgIH0pO1xuXG4gICAgLy8gU1NSIOudvOyasO2KuCDqsJzrs4Qg65Ox66GdIChjb21wcmVzcyDsmLXshZjsnbQg65287Jqw7Yq467OE66GcIOyggeyaqeuQmOuPhOuhnSlcbiAgICBpZiAoc3NyQXZhaWxhYmxlKSB7XG4gICAgICBjb25zdCB7IGdldFNTUlJvdXRlcyB9ID0gYXdhaXQgaW1wb3J0KFwiLi4vc3NyXCIpO1xuICAgICAgY29uc3QgeyByZW5kZXJTU1IgfSA9IGF3YWl0IGltcG9ydChcIi4uL3Nzci9yZW5kZXJlclwiKTtcbiAgICAgIGNvbnN0IHNzclJvdXRlcyA9IGdldFNTUlJvdXRlcygpO1xuXG4gICAgICBmb3IgKGNvbnN0IHJvdXRlIG9mIHNzclJvdXRlcykge1xuICAgICAgICBzZXJ2ZXIucm91dGUoe1xuICAgICAgICAgIG1ldGhvZDogW1wiR0VUXCIsIFwiSEVBRFwiXSxcbiAgICAgICAgICB1cmw6IHJvdXRlLnBhdGgsXG4gICAgICAgICAgY29tcHJlc3M6IHRvRmFzdGlmeUNvbXByZXNzT3B0aW9uKHJvdXRlLmNvbXByZXNzID8/IHRydWUsIGdsb2JhbENvbXByZXNzT3B0aW9ucyksXG4gICAgICAgICAgaGFuZGxlcjogYXN5bmMgKHJlcXVlc3QsIHJlcGx5KSA9PiB7XG4gICAgICAgICAgICBjb25zdCB1cmwgPSByZXF1ZXN0LnVybDtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGBbU1NSXSBNYXRjaGVkIHJvdXRlOiAke3JvdXRlLnBhdGh9YCk7XG5cbiAgICAgICAgICAgIGNvbnN0IHBhcmFtcyA9IHRoaXMuZXh0cmFjdFBhdGhQYXJhbXMocm91dGUucGF0aCwgdXJsKTtcbiAgICAgICAgICAgIGNvbnN0IGh0bWwgPSBhd2FpdCByZW5kZXJTU1IodXJsLCByb3V0ZSwgcGFyYW1zLCByZXF1ZXN0LCByZXBseSwgY29uZmlnKTtcblxuICAgICAgICAgICAgcmVwbHkudHlwZShcInRleHQvaHRtbFwiKTtcbiAgICAgICAgICAgIHJldHVybiBodG1sO1xuICAgICAgICAgIH0sXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIENTUiBvciBTdGF0aWMgRmlsZSBGYWxsYmFjayAoU1NSIOudvOyasO2KuOyXkCDrp6Tsua3rkJjsp4Ag7JWK64qUIOuqqOuToCDsmpTssq0pXG4gICAgc2VydmVyLnJvdXRlKHtcbiAgICAgIG1ldGhvZDogW1wiR0VUXCIsIFwiSEVBRFwiXSxcbiAgICAgIHVybDogXCIqXCIsXG4gICAgICBoYW5kbGVyOiBhc3luYyAocmVxdWVzdCwgcmVwbHkpID0+IHtcbiAgICAgICAgLy8gL2FwaSwgL3NvbmFtdS11aeuKlCA0MDQg6re464yA66GcXG4gICAgICAgIGlmIChyZXF1ZXN0LnVybC5zdGFydHNXaXRoKFwiL2FwaVwiKSB8fCByZXF1ZXN0LnVybC5zdGFydHNXaXRoKFwiL3NvbmFtdS11aVwiKSkge1xuICAgICAgICAgIHJlcGx5LnN0YXR1cyg0MDQpLnNlbmQoKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICAvLyBDU1LsmqkgQ2FjaGUtQ29udHJvbCDtl6TrjZQg7ISk7KCVXG4gICAgICAgIGlmIChjb25maWcuY2FjaGVDb250cm9sSGFuZGxlcikge1xuICAgICAgICAgIGNvbnN0IGNzckNhY2hlUmVxOiBDYWNoZUNvbnRyb2xSZXF1ZXN0ID0ge1xuICAgICAgICAgICAgdHlwZTogXCJjc3JcIixcbiAgICAgICAgICAgIHVybDogcmVxdWVzdC51cmwsXG4gICAgICAgICAgICBwYXRoOiByZXF1ZXN0LnVybC5zcGxpdChcIj9cIilbMF0sXG4gICAgICAgICAgICBtZXRob2Q6IHJlcXVlc3QubWV0aG9kLFxuICAgICAgICAgIH07XG4gICAgICAgICAgY29uc3QgY3NyQ2FjaGVDb25maWcgPSBjb25maWcuY2FjaGVDb250cm9sSGFuZGxlcihjc3JDYWNoZVJlcSk7XG5cbiAgICAgICAgICBpZiAoY3NyQ2FjaGVDb25maWcpIHtcbiAgICAgICAgICAgIGFwcGx5Q2FjaGVIZWFkZXJzKHJlcGx5LCBjc3JDYWNoZUNvbmZpZyk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8g7KCV7KCBIO2MjOydvOydtCDsobTsnqztlaAg6rK97JqwLCDsoJXsoIEg7YyM7J287J2EIOuovOyggCDshJzruZntlbTslbztlahcbiAgICAgICAgY29uc3QgcmVxdWVzdFBhdGggPSB0aGlzLmdldFBhdGhuYW1lRnJvbVVybChyZXF1ZXN0LnVybCk7XG4gICAgICAgIGNvbnN0IHNhZmVGaWxlUGF0aCA9IHRoaXMucmVzb2x2ZVBhdGhXaXRoaW5CYXNlRGlyKHdlYkRpc3RQYXRoLCByZXF1ZXN0UGF0aCk7XG4gICAgICAgIGlmIChzYWZlRmlsZVBhdGggPT09IG51bGwpIHtcbiAgICAgICAgICByZXBseS5zdGF0dXMoNDAzKS5zZW5kKCk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmIChhd2FpdCBmaWxlRXhpc3RzKHNhZmVGaWxlUGF0aCkpIHtcbiAgICAgICAgICBjb25zdCBjb250ZW50ID0gYXdhaXQgZnMucmVhZEZpbGUoc2FmZUZpbGVQYXRoKTtcbiAgICAgICAgICByZXR1cm4gcmVwbHkudHlwZShtaW1lTG9va3VwKHNhZmVGaWxlUGF0aCkgfHwgXCJhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW1cIikuc2VuZChjb250ZW50KTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIENTUiBmYWxsYmFjazogaW5kZXguaHRtbCDshJzruZlcbiAgICAgICAgY29uc3QgaW5kZXhQYXRoID0gcGF0aC5qb2luKHdlYkRpc3RQYXRoLCBcImluZGV4Lmh0bWxcIik7XG4gICAgICAgIHJldHVybiByZXBseS50eXBlKFwidGV4dC9odG1sXCIpLnNlbmQoYXdhaXQgZnMucmVhZEZpbGUoaW5kZXhQYXRoLCBcInV0Zi04XCIpKTtcbiAgICAgIH0sXG4gICAgfSk7XG5cbiAgICBjb25zb2xlLmxvZyhg4pyTIFN0YXRpYyB3ZWIgc2VydmVyIGNvbmZpZ3VyZWQgd2l0aCAke3NzckF2YWlsYWJsZSA/IFwiU1NSXCIgOiBcIkNTUiBvbmx5XCJ9IHN1cHBvcnRgKTtcbiAgfVxuXG4gIGNyZWF0ZUFwaUhhbmRsZXIoXG4gICAgYXBpOiBFeHRlbmRlZEFwaSxcbiAgICBjb25maWc6IFNvbmFtdUZhc3RpZnlDb25maWcsXG4gICAgbW9kZWxzOiBMb2FkZWRNb2RlbHMgPSB0aGlzLnN5bmNlci5tb2RlbHMsXG4gICAgZGVwZW5kZW5jaWVzOiBTb25hbXVIdHRwVmFsaWRhdG9yRGVwZW5kZW5jaWVzID0gZGVmYXVsdFNvbmFtdUh0dHBWYWxpZGF0b3JEZXBlbmRlbmNpZXMsXG4gICk6IChyZXF1ZXN0OiBGYXN0aWZ5UmVxdWVzdCwgcmVwbHk6IEZhc3RpZnlSZXBseSkgPT4gUHJvbWlzZTxBcGlNZXRob2RSZXN1bHQ+IHtcbiAgICBjb25zdCBwcmVwYXJlZFZhbGlkYXRvciA9IHRoaXMuZ2V0T3JDcmVhdGVIdHRwVmFsaWRhdG9yKGFwaSwgZGVwZW5kZW5jaWVzKTtcblxuICAgIHJldHVybiBhc3luYyAocmVxdWVzdDogRmFzdGlmeVJlcXVlc3QsIHJlcGx5OiBGYXN0aWZ5UmVwbHkpOiBQcm9taXNlPEFwaU1ldGhvZFJlc3VsdD4gPT4ge1xuICAgICAgY29uc3QgdmFsaWRhdG9yID1cbiAgICAgICAgcHJlcGFyZWRWYWxpZGF0b3IgaW5zdGFuY2VvZiBQcm9taXNlID8gYXdhaXQgcHJlcGFyZWRWYWxpZGF0b3IgOiBwcmVwYXJlZFZhbGlkYXRvcjtcbiAgICAgIC8vIENvbnRleHQg7IOd7ISxXG4gICAgICBjb25zdCBjb250ZXh0OiBDb250ZXh0ID0gYXdhaXQgdGhpcy5jcmVhdGVDb250ZXh0KGNvbmZpZywgcmVxdWVzdCwgcmVwbHkpO1xuXG4gICAgICByZXR1cm4gdGhpcy5hc3luY0xvY2FsU3RvcmFnZS5ydW4oeyBjb250ZXh0IH0sIGFzeW5jICgpID0+IHtcbiAgICAgICAgLy8gZ3VhcmRzIOyymOumrFxuICAgICAgICBydW5HdWFyZHMoe1xuICAgICAgICAgIGd1YXJkczogYXBpLm9wdGlvbnMuZ3VhcmRzLFxuICAgICAgICAgIGNvbmZpZyxcbiAgICAgICAgICByZXF1ZXN0LFxuICAgICAgICAgIGFwaSxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gcmVxdWVzdCDtjIzsi7FcbiAgICAgICAgY29uc3Qgd2hpY2ggPSBhcGkub3B0aW9ucy5odHRwTWV0aG9kID09PSBcIkdFVFwiID8gXCJxdWVyeVwiIDogXCJib2R5XCI7XG4gICAgICAgIGxldCByZXFCb2R5ID0gbmV3IE1hcDxzdHJpbmcsIEFwaUFyZ3VtZW50PigpO1xuICAgICAgICAvLyDtjIzsnbwg7JeF66Gc65OcIOyeiOuKlCDqsr3smrAg7J6E7IucIOuNsOydtO2EsFxuICAgICAgICBjb25zdCBmaWxlczogVXBsb2FkZWRSZXF1ZXN0RmlsZXMgPSB7XG4gICAgICAgICAgYnVmZmVyZWRGaWxlczogW10sXG4gICAgICAgICAgdXBsb2FkZWRGaWxlczogW10sXG4gICAgICAgIH07XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCBib2R5ID0gcmVxdWVzdFt3aGljaF0gPz8ge307XG4gICAgICAgICAgaWYgKGFwaS51cGxvYWRPcHRpb25zKSB7XG4gICAgICAgICAgICBjb25zdCBwYXJ0cyA9IHJlcXVlc3QucGFydHMoe1xuICAgICAgICAgICAgICBsaW1pdHM6IGFwaS51cGxvYWRPcHRpb25zLmxpbWl0cyxcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAvLyBGb3JtRGF0YeydmCBmaWVsZOuTpOydhCDsnoTsi5zroZwg7KCA7J6lXG4gICAgICAgICAgICBjb25zdCBmaWVsZHM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fTtcblxuICAgICAgICAgICAgaWYgKGFwaS51cGxvYWRPcHRpb25zLmNvbnN1bWUgPT09IFwiYnVmZmVyXCIgfHwgIWFwaS51cGxvYWRPcHRpb25zLmNvbnN1bWUpIHtcbiAgICAgICAgICAgICAgLy8gQnVmZmVyIOuqqOuTnDog66mU66qo66as7JeQIOuhnOuTnFxuICAgICAgICAgICAgICBmb3IgYXdhaXQgKGNvbnN0IHBhcnQgb2YgcGFydHMpIHtcbiAgICAgICAgICAgICAgICBpZiAocGFydC50eXBlID09PSBcImZpbGVcIikge1xuICAgICAgICAgICAgICAgICAgLy8gQ1JJVElDQUw6IO2MjOydvCDsiqTtirjrprzsnYQg7KaJ7IucIGNvbnN1bWXtlbTslbwg64uk7J2MIHBhcnTroZwg64SY7Ja06rCIIOyImCDsnojsnYxcbiAgICAgICAgICAgICAgICAgIC8vIOydtCDtmLjstpzsnbQg7JeG7Jy866m0IOyiheyihSBtdWx0aXBhcnQg7YyM7Iux7J20IHBlbmRpbmcg7IOB7YOc66GcIO2DgOyehOyVhOybgyDrsJzsg51cbiAgICAgICAgICAgICAgICAgIGNvbnN0IGJ1ZmZlciA9IGF3YWl0IHBhcnQudG9CdWZmZXIoKTtcbiAgICAgICAgICAgICAgICAgIGZpbGVzLmJ1ZmZlcmVkRmlsZXMucHVzaChuZXcgQnVmZmVyZWRGaWxlKHBhcnQsIGJ1ZmZlcikpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocGFydC50eXBlID09PSBcImZpZWxkXCIpIHtcbiAgICAgICAgICAgICAgICAgIGZpZWxkc1twYXJ0LmZpZWxkbmFtZV0gPSBTdHJpbmcocGFydC52YWx1ZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGFwaS51cGxvYWRPcHRpb25zLmNvbnN1bWUgPT09IFwic3RyZWFtXCIpIHtcbiAgICAgICAgICAgICAgLy8gU3RyZWFtIOuqqOuTnDog7KaJ7IucIOyggOyepeyGjOuhnCDsiqTtirjrpqzrsI1cbiAgICAgICAgICAgICAgY29uc3QgZGlza05hbWUgPSBhcGkudXBsb2FkT3B0aW9ucy5kZXN0aW5hdGlvbjtcbiAgICAgICAgICAgICAgY29uc3QgZGlzayA9IHRoaXMuc3RvcmFnZS51c2UoZGlza05hbWUpO1xuXG4gICAgICAgICAgICAgIC8vIOyasOyEoOyInOychDog642w7L2U66CI7J207YSwID4g7KCE7JetIOyEpOyglSA+IOq4sOuzuOqwklxuICAgICAgICAgICAgICBjb25zdCBrZXlHZW5lcmF0b3I6IEtleUdlbmVyYXRvciA9XG4gICAgICAgICAgICAgICAgYXBpLnVwbG9hZE9wdGlvbnMua2V5R2VuZXJhdG9yID8/XG4gICAgICAgICAgICAgICAgdGhpcy5jb25maWcuc2VydmVyLnN0b3JhZ2U/LmtleUdlbmVyYXRvciA/P1xuICAgICAgICAgICAgICAgIGRlZmF1bHRLZXlHZW5lcmF0b3I7XG5cbiAgICAgICAgICAgICAgZm9yIGF3YWl0IChjb25zdCBwYXJ0IG9mIHBhcnRzKSB7XG4gICAgICAgICAgICAgICAgaWYgKHBhcnQudHlwZSA9PT0gXCJmaWxlXCIpIHtcbiAgICAgICAgICAgICAgICAgIGNvbnN0IGtleSA9IGF3YWl0IGtleUdlbmVyYXRvcih7XG4gICAgICAgICAgICAgICAgICAgIGZpbGVuYW1lOiBwYXJ0LmZpbGVuYW1lLFxuICAgICAgICAgICAgICAgICAgICBtaW1ldHlwZTogcGFydC5taW1ldHlwZSxcbiAgICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgICBhd2FpdCBkaXNrLnB1dFN0cmVhbShrZXksIHBhcnQuZmlsZSwge1xuICAgICAgICAgICAgICAgICAgICBjb250ZW50VHlwZTogcGFydC5taW1ldHlwZSxcbiAgICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgICBjb25zdCB1cmwgPSBhd2FpdCBkaXNrLmdldFVybChrZXkpO1xuICAgICAgICAgICAgICAgICAgY29uc3Qgc2lnbmVkVXJsID0gYXdhaXQgZGlzay5nZXRTaWduZWRVcmwoa2V5KTtcblxuICAgICAgICAgICAgICAgICAgZmlsZXMudXBsb2FkZWRGaWxlcy5wdXNoKFxuICAgICAgICAgICAgICAgICAgICBuZXcgVXBsb2FkZWRGaWxlKHtcbiAgICAgICAgICAgICAgICAgICAgICBmaWxlbmFtZTogcGFydC5maWxlbmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICBtaW1ldHlwZTogcGFydC5taW1ldHlwZSxcbiAgICAgICAgICAgICAgICAgICAgICBzaXplOiBwYXJ0LmZpbGUuYnl0ZXNSZWFkLFxuICAgICAgICAgICAgICAgICAgICAgIHVybCxcbiAgICAgICAgICAgICAgICAgICAgICBzaWduZWRVcmwsXG4gICAgICAgICAgICAgICAgICAgICAga2V5LFxuICAgICAgICAgICAgICAgICAgICAgIGRpc2tOYW1lLFxuICAgICAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChwYXJ0LnR5cGUgPT09IFwiZmllbGRcIikge1xuICAgICAgICAgICAgICAgICAgZmllbGRzW3BhcnQuZmllbGRuYW1lXSA9IFN0cmluZyhwYXJ0LnZhbHVlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gcXProZwg7KSR7LKpIOq1rOyhsCDtjIzsi7E6IHBhcmFtc1tjYXRlZ29yeV0g4oaSIHsgcGFyYW1zOiB7IGNhdGVnb3J5OiBcInRlc3RcIiB9IH1cbiAgICAgICAgICAgIGNvbnN0IHFzID0gYXdhaXQgaW1wb3J0KFwicXNcIik7XG4gICAgICAgICAgICBjb25zdCBwYXJzZWQgPSBxcy5kZWZhdWx0LnBhcnNlKGZpZWxkcyk7XG4gICAgICAgICAgICBPYmplY3QuYXNzaWduKGJvZHksIHBhcnNlZCk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmVxQm9keSA9IHRvQXBpQXJndW1lbnRNYXAodmFsaWRhdG9yLnBhcnNlKGJvZHkpKTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIGNvbnN0IHsgWm9kRXJyb3IgfSA9IGF3YWl0IGltcG9ydChcInpvZFwiKTtcbiAgICAgICAgICBpZiAoZSBpbnN0YW5jZW9mIFpvZEVycm9yKSB7XG4gICAgICAgICAgICBjb25zdCB7IGh1bWFuaXplWm9kRXJyb3IgfSA9IGF3YWl0IGltcG9ydChcIi4uL3V0aWxzL3pvZC1lcnJvclwiKTtcbiAgICAgICAgICAgIGNvbnN0IG1lc3NhZ2VzID0gaHVtYW5pemVab2RFcnJvcihlKVxuICAgICAgICAgICAgICAubWFwKChpc3N1ZSkgPT4gaXNzdWUubWVzc2FnZSlcbiAgICAgICAgICAgICAgLmpvaW4oXCIgXCIpO1xuICAgICAgICAgICAgY29uc3QgeyBCYWRSZXF1ZXN0RXhjZXB0aW9uIH0gPSBhd2FpdCBpbXBvcnQoXCIuLi9leGNlcHRpb25zL3NvLWV4Y2VwdGlvbnNcIik7XG4gICAgICAgICAgICB0aHJvdyBuZXcgQmFkUmVxdWVzdEV4Y2VwdGlvbihcbiAgICAgICAgICAgICAgLyogU0FGRVRZOiBBUEkg642w7L2U66CI7J207YSw7JmAIFpvZCDqsoDspp3quLAg65Ox66GdIOqzhOyVveydtCDsnbQg6rCS7J2YIO2DgOyeheydhCDrs7TsnqXtlZzri6QuICovIG1lc3NhZ2VzIGFzIExvY2FsaXplZFN0cmluZyxcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHpvZEVycm9yOiBlLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhyb3cgZTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBDb250ZW50LVR5cGVcbiAgICAgICAgcmVwbHkudHlwZShhcGkub3B0aW9ucy5jb250ZW50VHlwZSA/PyBcImFwcGxpY2F0aW9uL2pzb25cIik7XG5cbiAgICAgICAgLy8gQ2FjaGUtQ29udHJvbCDtl6TrjZQg7ISk7KCVXG4gICAgICAgIGNvbnN0IGFwaUNhY2hlQ29uZmlnID0gdGhpcy5nZXRBcGlDYWNoZUNvbnRyb2woYXBpLCByZXF1ZXN0LCBjb25maWcpO1xuICAgICAgICBpZiAoYXBpQ2FjaGVDb25maWcpIHtcbiAgICAgICAgICBhcHBseUNhY2hlSGVhZGVycyhyZXBseSwgYXBpQ2FjaGVDb25maWcpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8g7JeF66Gc65OcIOyYteyFmOydtCDsnojripQg6rK97JqwIO2MjOydvCDrjbDsnbTthLDrpbwgQ29udGV4dOyXkCDstpTqsIBcbiAgICAgICAgaWYgKGFwaS51cGxvYWRPcHRpb25zKSB7XG4gICAgICAgICAgY29uc3QgY29uc3VtZSA9IGFwaS51cGxvYWRPcHRpb25zLmNvbnN1bWUgPz8gXCJidWZmZXJcIjtcbiAgICAgICAgICBpZiAoY29uc3VtZSA9PT0gXCJidWZmZXJcIikge1xuICAgICAgICAgICAgY29udGV4dC5idWZmZXJlZEZpbGVzID0gZmlsZXMuYnVmZmVyZWRGaWxlcztcbiAgICAgICAgICB9IGVsc2UgaWYgKGNvbnN1bWUgPT09IFwic3RyZWFtXCIpIHtcbiAgICAgICAgICAgIGNvbnRleHQudXBsb2FkZWRGaWxlcyA9IGZpbGVzLnVwbG9hZGVkRmlsZXM7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8g66qo6424IOuplOyGjOuTnCBhcmdzIOyDneyEse2VmOyXrCDtmLjstpxcbiAgICAgICAgY29uc3QgeyBBcGlQYXJhbVR5cGUgfSA9IGF3YWl0IGltcG9ydChcIi4uL3R5cGVzL3R5cGVzXCIpO1xuICAgICAgICBjb25zdCBhcmdzID0gYXBpLnBhcmFtZXRlcnMubWFwKChwYXJhbSkgPT4ge1xuICAgICAgICAgIC8vIENvbnRleHQg7J247KCd7IWYXG4gICAgICAgICAgaWYgKEFwaVBhcmFtVHlwZS5pc0NvbnRleHQocGFyYW0udHlwZSkpIHtcbiAgICAgICAgICAgIHJldHVybiBjb250ZXh0O1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gcmVxQm9keS5nZXQocGFyYW0ubmFtZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gdGhpcy5pbnZva2VNb2RlbE1ldGhvZChhcGksIGFyZ3MsIHJlcGx5LCBtb2RlbHMpO1xuICAgICAgfSk7XG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0T3JDcmVhdGVIdHRwVmFsaWRhdG9yKFxuICAgIGFwaTogRXh0ZW5kZWRBcGksXG4gICAgZGVwZW5kZW5jaWVzOiBTb25hbXVIdHRwVmFsaWRhdG9yRGVwZW5kZW5jaWVzLFxuICApOiBIdHRwVmFsaWRhdG9yIHwgUHJvbWlzZTxIdHRwVmFsaWRhdG9yPiB7XG4gICAgY29uc3QgY2FjaGVkID0gdGhpcy5odHRwVmFsaWRhdG9ycy5nZXQoYXBpKTtcbiAgICBpZiAoY2FjaGVkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiBjYWNoZWQ7XG4gICAgfVxuICAgIGNvbnN0IGV4aXN0aW5nID0gdGhpcy5wZW5kaW5nSHR0cFZhbGlkYXRvcnMuZ2V0KGFwaSk7XG4gICAgaWYgKGV4aXN0aW5nICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiBleGlzdGluZztcbiAgICB9XG4gICAgY29uc3QgcGVuZGluZyA9IHRoaXMuYnVpbGRIdHRwVmFsaWRhdG9yKGFwaSwgZGVwZW5kZW5jaWVzKTtcbiAgICB0aGlzLnBlbmRpbmdIdHRwVmFsaWRhdG9ycy5zZXQoYXBpLCBwZW5kaW5nKTtcbiAgICB2b2lkIHBlbmRpbmcudGhlbihcbiAgICAgICh2YWxpZGF0b3IpID0+IHtcbiAgICAgICAgdGhpcy5odHRwVmFsaWRhdG9ycy5zZXQoYXBpLCB2YWxpZGF0b3IpO1xuICAgICAgICB0aGlzLnBlbmRpbmdIdHRwVmFsaWRhdG9ycy5kZWxldGUoYXBpKTtcbiAgICAgIH0sXG4gICAgICAoKSA9PiB7XG4gICAgICAgIHRoaXMucGVuZGluZ0h0dHBWYWxpZGF0b3JzLmRlbGV0ZShhcGkpO1xuICAgICAgfSxcbiAgICApO1xuICAgIHJldHVybiBwZW5kaW5nO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBidWlsZEh0dHBWYWxpZGF0b3IoXG4gICAgYXBpOiBFeHRlbmRlZEFwaSxcbiAgICBkZXBlbmRlbmNpZXM6IFNvbmFtdUh0dHBWYWxpZGF0b3JEZXBlbmRlbmNpZXMsXG4gICk6IFByb21pc2U8SHR0cFZhbGlkYXRvcj4ge1xuICAgIGNvbnN0IHBvbGljeSA9IG5vcm1hbGl6ZVpvZENvbXBpbGVyUG9saWN5KHRoaXMuY29uZmlnLnZhbGlkYXRpb24/LnpvZENvbXBpbGVyKTtcbiAgICBjb25zdCBzb3VyY2VBb3QgPSBwcm9jZXNzLmVudi5IT1QgPT09IFwieWVzXCIgfHwgcHJvY2Vzcy5lbnYuVklURVNUID09PSBcInRydWVcIjtcbiAgICBpZiAocG9saWN5LmFwaSA9PT0gXCJhb3RcIiAmJiAhc291cmNlQW90KSB7XG4gICAgICBjb25zdCByZWdpc3RyeSA9IHRoaXMuYW90SHR0cFZhbGlkYXRvclJlZ2lzdHJ5ID8/IChhd2FpdCB0aGlzLmxvYWRBb3RIdHRwVmFsaWRhdG9yUmVnaXN0cnkoKSk7XG4gICAgICByZXR1cm4gdGhpcy5nZXRBb3RIdHRwVmFsaWRhdG9yKGFwaSwgcmVnaXN0cnkpO1xuICAgIH1cblxuICAgIHJldHVybiBhd2FpdCBkZXBlbmRlbmNpZXMuY3JlYXRlVmFsaWRhdG9yKHtcbiAgICAgIGFwaSxcbiAgICAgIHBvbGljeSxcbiAgICAgIHR5cGVzOiB0aGlzLnN5bmNlci50eXBlcyxcbiAgICAgIGFsbG93QW90U291cmNlRmFsbGJhY2s6IHNvdXJjZUFvdCxcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0QW90SHR0cFZhbGlkYXRvcihhcGk6IEV4dGVuZGVkQXBpLCByZWdpc3RyeTogSHR0cFZhbGlkYXRvclJlZ2lzdHJ5KTogSHR0cFZhbGlkYXRvciB7XG4gICAgY29uc3Qgcm91dGVLZXkgPSBnZXRIdHRwVmFsaWRhdG9yUm91dGVLZXkoYXBpKTtcbiAgICBjb25zdCB2YWxpZGF0b3IgPSByZWdpc3RyeS52YWxpZGF0b3JzLmdldChyb3V0ZUtleSk7XG4gICAgaWYgKHZhbGlkYXRvciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEhUVFAgdmFsaWRhdG9yIHJlZ2lzdHJ5IGlzIG1pc3NpbmcgJHtyb3V0ZUtleX1gKTtcbiAgICB9XG4gICAgcmV0dXJuIHZhbGlkYXRvcjtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgbG9hZEFvdEh0dHBWYWxpZGF0b3JSZWdpc3RyeShcbiAgICBhcGlzOiByZWFkb25seSBFeHRlbmRlZEFwaVtdID0gdGhpcy5zeW5jZXIuYXBpcyxcbiAgICBkZXBlbmRlbmNpZXM6IFNvbmFtdUh0dHBWYWxpZGF0b3JEZXBlbmRlbmNpZXMgPSBkZWZhdWx0U29uYW11SHR0cFZhbGlkYXRvckRlcGVuZGVuY2llcyxcbiAgKTogUHJvbWlzZTxIdHRwVmFsaWRhdG9yUmVnaXN0cnk+IHtcbiAgICBjb25zdCB7IHBhdGhUb0ZpbGVVUkwgfSA9IGF3YWl0IGltcG9ydChcIm5vZGU6dXJsXCIpO1xuICAgIGNvbnN0IHJlZ2lzdHJ5UGF0aCA9IHBhdGguam9pbihcbiAgICAgIHRoaXMuYXBpUm9vdFBhdGgsXG4gICAgICBcImRpc3QvYXBwbGljYXRpb24vc29uYW11LnZhbGlkYXRvcnMuZ2VuZXJhdGVkLmpzXCIsXG4gICAgKTtcbiAgICBpZiAoIShhd2FpdCBleGlzdHMocmVnaXN0cnlQYXRoKSkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgR2VuZXJhdGVkIEhUVFAgdmFsaWRhdG9yIHJlZ2lzdHJ5IG5vdCBmb3VuZDogJHtyZWdpc3RyeVBhdGh9YCk7XG4gICAgfVxuXG4gICAgY29uc3QgaW1wb3J0ZWQgPVxuICAgICAgLyogU0FGRVRZOiBBUEkg642w7L2U66CI7J207YSw7JmAIFpvZCDqsoDspp3quLAg65Ox66GdIOqzhOyVveydtCDsnbQg6rCS7J2YIO2DgOyeheydhCDrs7TsnqXtlZzri6QuICovIChhd2FpdCBpbXBvcnQoXG4gICAgICAgIHBhdGhUb0ZpbGVVUkwocmVnaXN0cnlQYXRoKS5ocmVmXG4gICAgICApKSBhcyB7XG4gICAgICAgIGZpbmdlcnByaW50PzogdW5rbm93bjtcbiAgICAgICAgdmFsaWRhdG9ycz86IHVua25vd247XG4gICAgICB9O1xuICAgIGlmICghaXNTdHJpbmdWYWx1ZShpbXBvcnRlZC5maW5nZXJwcmludCkgfHwgIShpbXBvcnRlZC52YWxpZGF0b3JzIGluc3RhbmNlb2YgTWFwKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIGdlbmVyYXRlZCBIVFRQIHZhbGlkYXRvciByZWdpc3RyeTogJHtyZWdpc3RyeVBhdGh9YCk7XG4gICAgfVxuICAgIGZvciAoY29uc3QgW2tleSwgdmFsaWRhdG9yXSBvZiBpbXBvcnRlZC52YWxpZGF0b3JzKSB7XG4gICAgICBpZiAoXG4gICAgICAgICFpc1N0cmluZ1ZhbHVlKGtleSkgfHxcbiAgICAgICAgIWlzT2JqZWN0VmFsdWUodmFsaWRhdG9yKSB8fFxuICAgICAgICB2YWxpZGF0b3IgPT09IG51bGwgfHxcbiAgICAgICAgIShcInBhcnNlXCIgaW4gdmFsaWRhdG9yKSB8fFxuICAgICAgICAhaXNGdW5jdGlvblZhbHVlKHZhbGlkYXRvci5wYXJzZSlcbiAgICAgICkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgSFRUUCB2YWxpZGF0b3IgcmVnaXN0cnkgZW50cnk6ICR7U3RyaW5nKGtleSl9YCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgcmVnaXN0cnk6IEh0dHBWYWxpZGF0b3JSZWdpc3RyeSA9IHtcbiAgICAgIGZpbmdlcnByaW50OiBpbXBvcnRlZC5maW5nZXJwcmludCxcbiAgICAgIHZhbGlkYXRvcnM6IGltcG9ydGVkLnZhbGlkYXRvcnMsXG4gICAgfTtcbiAgICBkZXBlbmRlbmNpZXMuYXNzZXJ0UmVnaXN0cnkoYXBpcywgcmVnaXN0cnkpO1xuICAgIHJldHVybiByZWdpc3RyeTtcbiAgfVxuXG4gIGFzeW5jIHJlZnJlc2hIdHRwVmFsaWRhdG9ycyhcbiAgICBkZXBlbmRlbmNpZXM6IFNvbmFtdUh0dHBWYWxpZGF0b3JEZXBlbmRlbmNpZXMgPSBkZWZhdWx0U29uYW11SHR0cFZhbGlkYXRvckRlcGVuZGVuY2llcyxcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgcG9saWN5ID0gbm9ybWFsaXplWm9kQ29tcGlsZXJQb2xpY3kodGhpcy5jb25maWcudmFsaWRhdGlvbj8uem9kQ29tcGlsZXIpO1xuICAgIGNvbnN0IHNvdXJjZUFvdCA9IHByb2Nlc3MuZW52LkhPVCA9PT0gXCJ5ZXNcIiB8fCBwcm9jZXNzLmVudi5WSVRFU1QgPT09IFwidHJ1ZVwiO1xuICAgIGNvbnN0IG5leHRBcGlzID0gWy4uLnRoaXMuc3luY2VyLmFwaXNdO1xuICAgIGNvbnN0IG5leHRNb2RlbHMgPSB7IC4uLnRoaXMuc3luY2VyLm1vZGVscyB9O1xuICAgIGNvbnN0IHJlc3RBcGlzID0gbmV4dEFwaXMuZmlsdGVyKChhcGkpID0+IGFwaS53ZWJzb2NrZXRPcHRpb25zID09PSB1bmRlZmluZWQpO1xuICAgIGNvbnN0IG5leHQgPSBuZXcgV2Vha01hcDxFeHRlbmRlZEFwaSwgSHR0cFZhbGlkYXRvcj4oKTtcbiAgICBsZXQgbmV4dEFvdFJlZ2lzdHJ5OiBIdHRwVmFsaWRhdG9yUmVnaXN0cnkgfCB1bmRlZmluZWQ7XG5cbiAgICBpZiAocG9saWN5LmFwaSA9PT0gXCJhb3RcIiAmJiAhc291cmNlQW90KSB7XG4gICAgICBjb25zdCByZWdpc3RyeSA9IGF3YWl0IHRoaXMubG9hZEFvdEh0dHBWYWxpZGF0b3JSZWdpc3RyeShuZXh0QXBpcywgZGVwZW5kZW5jaWVzKTtcbiAgICAgIGZvciAoY29uc3QgYXBpIG9mIHJlc3RBcGlzKSB7XG4gICAgICAgIG5leHQuc2V0KGFwaSwgdGhpcy5nZXRBb3RIdHRwVmFsaWRhdG9yKGFwaSwgcmVnaXN0cnkpKTtcbiAgICAgIH1cbiAgICAgIG5leHRBb3RSZWdpc3RyeSA9IHJlZ2lzdHJ5O1xuICAgIH0gZWxzZSB7XG4gICAgICBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgICAgcmVzdEFwaXMubWFwKGFzeW5jIChhcGkpID0+IHtcbiAgICAgICAgICBjb25zdCB2YWxpZGF0b3IgPSBhd2FpdCB0aGlzLmJ1aWxkSHR0cFZhbGlkYXRvcihhcGksIGRlcGVuZGVuY2llcyk7XG4gICAgICAgICAgbmV4dC5zZXQoYXBpLCB2YWxpZGF0b3IpO1xuICAgICAgICB9KSxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gdmFsaWRhdG9y7JmAIOqwmeydgCByZXZpc2lvbuydmCBBUEkvbW9kZWwgc25hcHNob3TsnYQg7ZWo6ruYIOqzteqwnO2VtCBITVIg7KSR6rCEIOyDge2DnOulvCDsiKjquYHri4jri6QuXG4gICAgdGhpcy5odHRwVmFsaWRhdG9ycyA9IG5leHQ7XG4gICAgdGhpcy5wZW5kaW5nSHR0cFZhbGlkYXRvcnMgPSBuZXcgV2Vha01hcCgpO1xuICAgIHRoaXMuYW90SHR0cFZhbGlkYXRvclJlZ2lzdHJ5ID0gbmV4dEFvdFJlZ2lzdHJ5O1xuICAgIHRoaXMucHJlcGFyZWRBcGlzID0gbmV4dEFwaXM7XG4gICAgdGhpcy5wcmVwYXJlZE1vZGVscyA9IG5leHRNb2RlbHM7XG4gIH1cblxuICAvLyBXUyBwYXRo66W8IOydvOuwmCBIVFRQIEdFVOycvOuhnCDtmLjstpztlZwg6rK97JqwIDQyNiArIFVwZ3JhZGUg7Zek642U66GcIOuqheyLnOyggeycvOuhnCB3ZWJzb2NrZXQg7KCR7IaN7J2EIOycoOuPhO2VqFxuICBwcml2YXRlIGNyZWF0ZVdlYlNvY2tldFVwZ3JhZGVSZXF1aXJlZEhhbmRsZXIoKSB7XG4gICAgcmV0dXJuIGFzeW5jIChfcmVxdWVzdDogRmFzdGlmeVJlcXVlc3QsIHJlcGx5OiBGYXN0aWZ5UmVwbHkpOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgICAgIHJlcGx5LmhlYWRlcihcImNvbm5lY3Rpb25cIiwgXCJVcGdyYWRlXCIpLmhlYWRlcihcInVwZ3JhZGVcIiwgXCJ3ZWJzb2NrZXRcIikuc3RhdHVzKDQyNikuc2VuZCh7XG4gICAgICAgIG1lc3NhZ2U6IFwiV2ViU29ja2V0IHVwZ3JhZGUgcmVxdWlyZWRcIixcbiAgICAgIH0pO1xuICAgIH07XG4gIH1cblxuICAvLyBkZXYg66qo65Oc7J2YIGNhdGNoLWFsbCB3c0hhbmRsZXLsl5DshJwg7Iuk7KCcIFdTIEFQSeuhnCDrlJTsiqTtjKjsuZjtlaguIOunpOy5reuQmOuKlCByb3V0ZeqwgCDsl4bsnLzrqbQgMTAwOOuhnCDri6vsnYxcbiAgcHJpdmF0ZSBhc3luYyBoYW5kbGVEZXZXZWJTb2NrZXRSZXF1ZXN0KFxuICAgIHNvY2tldDogV2ViU29ja2V0LFxuICAgIHJlcXVlc3Q6IEZhc3RpZnlSZXF1ZXN0LFxuICAgIGNvbmZpZzogU29uYW11RmFzdGlmeUNvbmZpZyxcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgbWF0Y2hlZEFwaSA9IHRoaXMuZmluZE1hdGNoZWRBcGkocmVxdWVzdCwgdGhpcy5zeW5jZXIuYXBpcywgdGhpcy5zeW5jZXIubW9kZWxzKTtcbiAgICBpZiAoIW1hdGNoZWRBcGk/LndlYnNvY2tldE9wdGlvbnMpIHtcbiAgICAgIGNvbnN0IHRyYWNlQ29udGV4dCA9IHRoaXMud2Vic29ja2V0UnVudGltZS50ZWxlbWV0cnlDb250cm9sbGVyLmNyZWF0ZUNvbm5lY3Rpb25Db250ZXh0KHtcbiAgICAgICAgaGVhZGVyczogcmVxdWVzdC5oZWFkZXJzLFxuICAgICAgfSk7XG4gICAgICB0aGlzLndlYnNvY2tldFJ1bnRpbWUudGVsZW1ldHJ5Q29udHJvbGxlci5lbWl0KHtcbiAgICAgICAgbmFtZTogXCJ3cy5jb25uZWN0aW9uLnJlamVjdGVkXCIsXG4gICAgICAgIGxldmVsOiBcIndhcm5cIixcbiAgICAgICAgZGV0YWlsOiB7XG4gICAgICAgICAgcmVhc29uOiBcInJvdXRlTm90Rm91bmRcIixcbiAgICAgICAgICBwYXRoOiByZXF1ZXN0LnVybCxcbiAgICAgICAgfSxcbiAgICAgICAgdHJhY2VJZDogdHJhY2VDb250ZXh0LnRyYWNlSWQsXG4gICAgICAgIHNwYW5JZDogdHJhY2VDb250ZXh0LnNwYW5JZCxcbiAgICAgICAgcGFyZW50U3BhbklkOiB0cmFjZUNvbnRleHQucGFyZW50U3BhbklkLFxuICAgICAgICBzYW1wbGVkOiB0cmFjZUNvbnRleHQuc2FtcGxlZCxcbiAgICAgIH0pO1xuICAgICAgc29ja2V0LmNsb3NlKDEwMDgsIFwiV2ViU29ja2V0IHJvdXRlIG5vdCBmb3VuZFwiKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBoYW5kbGVyID0gdGhpcy5jcmVhdGVXZWJTb2NrZXRIYW5kbGVyKG1hdGNoZWRBcGksIGNvbmZpZyk7XG4gICAgYXdhaXQgaGFuZGxlcih7IHNvY2tldCB9LCByZXF1ZXN0KTtcbiAgfVxuXG4gIC8vIFdTIHJvdXRlIO2VuOuTpOufrOydmCDsi6Ttlokg7Iic7ISc66W8IOqzoOygle2VqDpcbiAgLy8gMSkgcXVlcnkgcGFyYW0g7YyM7Iux7J2EIGFjdGl2YXRpb24g7KCE7JeQIOuBneuCtCBoYW5kc2hha2Ug7Iuk7Yyo6rCAIHJlZ2lzdHJ57JeQIOuFuOy2nOuQmOyngCDslYrqsowg7ZWoXG4gIC8vIDIpIGBhY3RpdmU6IGZhbHNlYOuhnCDrqLzsoIAg65Ox66Gd7ZWcIOuSpCBjb250ZXh0IOyViOyXkOyEnCBndWFyZOulvCDsi6TtlontlbQg7J247KadIOygleuztOulvCDssLjsobDtlaAg7IiYIOyeiOqyjCDtlahcbiAgLy8gMykgY29udGV4dC9ndWFyZCDspIDruYTqsIAg64Gd64KcIOuSpCBgYWN0aXZhdGUoKWDtlbQg67iM66Gc65Oc7LqQ7Iqk7Yq46rCAIOy0iOq4sO2ZlCDspJHqsIQg7IOB7YOc66W8IOuztOyngCDrqrvtlZjqsowg7ZWoXG4gIC8vIOyXkOufrCDrsJzsg50g7Iuc7JeQ64qUIHJlc29sdmVXZWJTb2NrZXRDbG9zZURlc2NyaXB0b3Ig7KCV7LGF7JeQIOuUsOudvCBjbG9zZSBjb2Rl66W8IOunpO2Vke2VqFxuICBjcmVhdGVXZWJTb2NrZXRIYW5kbGVyRm9yVGVzdGluZyhhcGk6IEV4dGVuZGVkQXBpLCBjb25maWc6IFNvbmFtdUZhc3RpZnlDb25maWcpIHtcbiAgICByZXR1cm4gdGhpcy5jcmVhdGVXZWJTb2NrZXRIYW5kbGVyKGFwaSwgY29uZmlnKTtcbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlV2ViU29ja2V0SGFuZGxlcihhcGk6IEV4dGVuZGVkQXBpLCBjb25maWc6IFNvbmFtdUZhc3RpZnlDb25maWcpIHtcbiAgICByZXR1cm4gYXN5bmMgKFxuICAgICAgY29ubmVjdGlvbjoge1xuICAgICAgICBzb2NrZXQ6IFdlYlNvY2tldDtcbiAgICAgIH0sXG4gICAgICByZXF1ZXN0OiBGYXN0aWZ5UmVxdWVzdCxcbiAgICApOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgICAgIGNvbnN0IHNvY2tldCA9IGNvbm5lY3Rpb24uc29ja2V0O1xuICAgICAgbGV0IHdzQ29udGV4dDogV2ViU29ja2V0Q29udGV4dDxvYmplY3QsIG9iamVjdD4gfCBudWxsID0gbnVsbDtcbiAgICAgIGxldCByYXdXczogUmV0dXJuVHlwZTxXZWJTb2NrZXRSdW50aW1lW1wicmVnaXN0ZXJDb25uZWN0aW9uXCJdPiB8IG51bGwgPSBudWxsO1xuICAgICAgbGV0IHByZVJlZ2lzdGVyUGhhc2U6IFwiZ3VhcmRcIiB8IFwicXVlcnlcIiB8IFwicmVnaXN0ZXJcIiB8IFwiaGFuZGxlclwiID0gXCJndWFyZFwiO1xuICAgICAgbGV0IHRyYWNlQ29udGV4dDogV2ViU29ja2V0VGVsZW1ldHJ5Q29ubmVjdGlvbkNvbnRleHQgPSB7fTtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgdHJhY2VDb250ZXh0ID0gdGhpcy53ZWJzb2NrZXRSdW50aW1lLnRlbGVtZXRyeUNvbnRyb2xsZXIuY3JlYXRlQ29ubmVjdGlvbkNvbnRleHQoe1xuICAgICAgICAgIGhlYWRlcnM6IHJlcXVlc3QuaGVhZGVycyxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgcHJlUmVnaXN0ZXJQaGFzZSA9IFwicXVlcnlcIjtcbiAgICAgICAgY29uc3QgcmVxQm9keSA9IGF3YWl0IHRoaXMucGFyc2VXZWJTb2NrZXRSZXF1ZXN0UGFyYW1zKGFwaSwgcmVxdWVzdCk7XG4gICAgICAgIHByZVJlZ2lzdGVyUGhhc2UgPSBcInJlZ2lzdGVyXCI7XG4gICAgICAgIHJhd1dzID0gdGhpcy53ZWJzb2NrZXRSdW50aW1lLnJlZ2lzdGVyQ29ubmVjdGlvbihzb2NrZXQsIHtcbiAgICAgICAgICBvdXRFdmVudHM6IGFwaS53ZWJzb2NrZXRPcHRpb25zIS5vdXRFdmVudHMsXG4gICAgICAgICAgaW5FdmVudHM6IGFwaS53ZWJzb2NrZXRPcHRpb25zIS5pbkV2ZW50cyxcbiAgICAgICAgICBuYW1lc3BhY2U6IGFwaS53ZWJzb2NrZXRPcHRpb25zIS5uYW1lc3BhY2UsXG4gICAgICAgICAgaGVhcnRiZWF0OiBhcGkud2Vic29ja2V0T3B0aW9ucyEuaGVhcnRiZWF0LFxuICAgICAgICAgIGFjdGl2ZTogZmFsc2UsXG4gICAgICAgICAgdHJhY2VJZDogdHJhY2VDb250ZXh0LnRyYWNlSWQsXG4gICAgICAgICAgc3BhbklkOiB0cmFjZUNvbnRleHQuc3BhbklkLFxuICAgICAgICAgIHBhcmVudFNwYW5JZDogdHJhY2VDb250ZXh0LnBhcmVudFNwYW5JZCxcbiAgICAgICAgICBzYW1wbGVkOiB0cmFjZUNvbnRleHQuc2FtcGxlZCxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgY29uc3Qgc2NvcGVkV3MgPSB0aGlzLmNyZWF0ZVNjb3BlZFdlYlNvY2tldENvbm5lY3Rpb24ocmF3V3MsICgpID0+IHdzQ29udGV4dCk7XG4gICAgICAgIHdzQ29udGV4dCA9IGF3YWl0IHRoaXMuY3JlYXRlV2ViU29ja2V0Q29udGV4dChjb25maWcsIHJlcXVlc3QsIHNjb3BlZFdzKTtcblxuICAgICAgICBhd2FpdCB0aGlzLmFzeW5jTG9jYWxTdG9yYWdlLnJ1bih7IGNvbnRleHQ6IHdzQ29udGV4dCB9LCBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgcnVuR3VhcmRzKHtcbiAgICAgICAgICAgIGd1YXJkczogYXBpLm9wdGlvbnMuZ3VhcmRzLFxuICAgICAgICAgICAgY29uZmlnLFxuICAgICAgICAgICAgcmVxdWVzdCxcbiAgICAgICAgICAgIGFwaSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy53ZWJzb2NrZXRSdW50aW1lLmFjdGl2YXRlQ29ubmVjdGlvbihyYXdXcy5pZCk7XG4gICAgICAgIHByZVJlZ2lzdGVyUGhhc2UgPSBcImhhbmRsZXJcIjtcblxuICAgICAgICBjb25zdCB7IEFwaVBhcmFtVHlwZSB9ID0gYXdhaXQgaW1wb3J0KFwiLi4vdHlwZXMvdHlwZXNcIik7XG4gICAgICAgIGNvbnN0IGFyZ3MgPSBhcGkucGFyYW1ldGVycy5tYXAoKHBhcmFtKSA9PiB7XG4gICAgICAgICAgaWYgKEFwaVBhcmFtVHlwZS5pc0NvbnRleHQocGFyYW0udHlwZSkpIHtcbiAgICAgICAgICAgIHJldHVybiB3c0NvbnRleHQ7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuIHJlcUJvZHkuZ2V0KHBhcmFtLm5hbWUpO1xuICAgICAgICB9KTtcblxuICAgICAgICBhd2FpdCB0aGlzLmFzeW5jTG9jYWxTdG9yYWdlLnJ1bih7IGNvbnRleHQ6IHdzQ29udGV4dCB9LCBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgYXdhaXQgdGhpcy5pbnZva2VNb2RlbE1ldGhvZChhcGksIGFyZ3MpO1xuICAgICAgICB9KTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGNvbnN0IGNsb3NlRGVzY3JpcHRvciA9IHJlc29sdmVXZWJTb2NrZXRDbG9zZURlc2NyaXB0b3IoZXJyb3IpO1xuICAgICAgICBpZiAoIXJhd1dzKSB7XG4gICAgICAgICAgdGhpcy53ZWJzb2NrZXRSdW50aW1lLnRlbGVtZXRyeUNvbnRyb2xsZXIuZW1pdCh7XG4gICAgICAgICAgICBuYW1lOiBcIndzLmNvbm5lY3Rpb24ucmVqZWN0ZWRcIixcbiAgICAgICAgICAgIGxldmVsOiBjbG9zZURlc2NyaXB0b3IubG9nTGV2ZWwgPT09IFwid2FyblwiID8gXCJ3YXJuXCIgOiBcImVycm9yXCIsXG4gICAgICAgICAgICBkZXRhaWw6IHtcbiAgICAgICAgICAgICAgcmVhc29uOiBwcmVSZWdpc3RlclBoYXNlLFxuICAgICAgICAgICAgICBjb2RlOiBjbG9zZURlc2NyaXB0b3IuY29kZSxcbiAgICAgICAgICAgICAgcGF0aDogYXBpLnBhdGgsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgdHJhY2VJZDogdHJhY2VDb250ZXh0LnRyYWNlSWQsXG4gICAgICAgICAgICBzcGFuSWQ6IHRyYWNlQ29udGV4dC5zcGFuSWQsXG4gICAgICAgICAgICBwYXJlbnRTcGFuSWQ6IHRyYWNlQ29udGV4dC5wYXJlbnRTcGFuSWQsXG4gICAgICAgICAgICBzYW1wbGVkOiB0cmFjZUNvbnRleHQuc2FtcGxlZCxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChyYXdXcykge1xuICAgICAgICAgIHJhd1dzLmNsb3NlKGNsb3NlRGVzY3JpcHRvci5jb2RlLCBjbG9zZURlc2NyaXB0b3IucmVhc29uKTtcbiAgICAgICAgfSBlbHNlIGlmIChzb2NrZXQucmVhZHlTdGF0ZSA8IDIpIHtcbiAgICAgICAgICBzb2NrZXQuY2xvc2UoY2xvc2VEZXNjcmlwdG9yLmNvZGUsIGNsb3NlRGVzY3JpcHRvci5yZWFzb24pO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuc2VydmVyPy5sb2cpIHtcbiAgICAgICAgICBjb25zdCBwYXlsb2FkID0ge1xuICAgICAgICAgICAgZXJyOiBlcnJvcixcbiAgICAgICAgICAgIG1vZGVsTmFtZTogYXBpLm1vZGVsTmFtZSxcbiAgICAgICAgICAgIG1ldGhvZE5hbWU6IGFwaS5tZXRob2ROYW1lLFxuICAgICAgICAgICAgcGF0aDogYXBpLnBhdGgsXG4gICAgICAgICAgfTtcbiAgICAgICAgICBpZiAoY2xvc2VEZXNjcmlwdG9yLmxvZ0xldmVsID09PSBcIndhcm5cIikge1xuICAgICAgICAgICAgdGhpcy5zZXJ2ZXIubG9nLndhcm4ocGF5bG9hZCwgY2xvc2VEZXNjcmlwdG9yLnJlYXNvbik7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuc2VydmVyLmxvZy5lcnJvcihwYXlsb2FkLCBjbG9zZURlc2NyaXB0b3IucmVhc29uKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaWYgKGNsb3NlRGVzY3JpcHRvci5sb2dMZXZlbCA9PT0gXCJ3YXJuXCIpIHtcbiAgICAgICAgICAgIGNvbnNvbGUud2FybihjbG9zZURlc2NyaXB0b3IucmVhc29uLCBlcnJvcik7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoY2xvc2VEZXNjcmlwdG9yLnJlYXNvbiwgZXJyb3IpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH07XG4gIH1cblxuICAvLyBvbk1lc3NhZ2Uvb25DbG9zZeyymOufvCDri6TrpbggdGlja+yXkOyEnCDsi6TtlonrkJjripQgY2FsbGJhY2vsnYAgQUxTIGNvbnRleHTqsIAg64GK6riw66+A66GcIHdyYXBwZXLsl5DshJwgYGFzeW5jTG9jYWxTdG9yYWdlLnJ1bmDsnLzroZwg64uk7IucIOqwkOyLuCDrs7Xsm5DtlahcbiAgLy8gcHVibGlzaC9qb2luL2xlYXZlL3NldFVzZXJJZCDqsJnsnYAg7KaJ7IucIOyLpO2WiSBBUEnripQg64uo7IicIOychOyehOunjCDtlZjqs6AsIGRlZmVycmVkIGNhbGxiYWNr7JeQ66eMIGNvbnRleHQg67O17JuQ7J2EIOyggeyaqe2VqFxuICBwcml2YXRlIGNyZWF0ZVNjb3BlZFdlYlNvY2tldENvbm5lY3Rpb248VE91dCBleHRlbmRzIG9iamVjdCwgVEluIGV4dGVuZHMgb2JqZWN0PihcbiAgICB3czogV2ViU29ja2V0Q29ubmVjdGlvbjxUT3V0LCBUSW4+LFxuICAgIGdldENvbnRleHQ6ICgpID0+IFdlYlNvY2tldENvbnRleHQgfCBudWxsLFxuICApOiBXZWJTb2NrZXRDb25uZWN0aW9uPFRPdXQsIFRJbj4ge1xuICAgIGNvbnN0IHRlbGVtZXRyeUNvbnRyb2xsZXIgPSB0aGlzLndlYnNvY2tldFJ1bnRpbWVWYWx1ZT8udGVsZW1ldHJ5Q29udHJvbGxlcjtcbiAgICBjb25zdCBydW5JbkNvbnRleHQgPSA8VD4oY2FsbGJhY2s6ICgpID0+IFQpOiBUID0+IHtcbiAgICAgIGNvbnN0IGNvbnRleHQgPSBnZXRDb250ZXh0KCk7XG4gICAgICBpZiAoIWNvbnRleHQpIHtcbiAgICAgICAgcmV0dXJuIGNhbGxiYWNrKCk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0aGlzLmFzeW5jTG9jYWxTdG9yYWdlLnJ1bih7IGNvbnRleHQgfSwgY2FsbGJhY2spO1xuICAgIH07XG5cbiAgICByZXR1cm4ge1xuICAgICAgZ2V0IGlkKCkge1xuICAgICAgICByZXR1cm4gd3MuaWQ7XG4gICAgICB9LFxuICAgICAgZ2V0IG5hbWVzcGFjZSgpIHtcbiAgICAgICAgcmV0dXJuIHdzLm5hbWVzcGFjZTtcbiAgICAgIH0sXG4gICAgICBnZXQgY2xvc2VkKCkge1xuICAgICAgICByZXR1cm4gd3MuY2xvc2VkO1xuICAgICAgfSxcbiAgICAgIGdldCB1c2VySWQoKSB7XG4gICAgICAgIHJldHVybiB3cy51c2VySWQ7XG4gICAgICB9LFxuICAgICAgdHJhbnNwb3J0OiBcIndzXCIsXG4gICAgICBwdWJsaXNoVW50eXBlZChldmVudCwgZGF0YSkge1xuICAgICAgICB3cy5wdWJsaXNoVW50eXBlZChldmVudCwgZGF0YSk7XG4gICAgICB9LFxuICAgICAgY2xvc2UoY29kZSwgcmVhc29uKSB7XG4gICAgICAgIHdzLmNsb3NlKGNvZGUsIHJlYXNvbik7XG4gICAgICB9LFxuICAgICAgb25DbG9zZShjYWxsYmFjaykge1xuICAgICAgICB3cy5vbkNsb3NlKCgpID0+IHJ1bkluQ29udGV4dChjYWxsYmFjaykpO1xuICAgICAgfSxcbiAgICAgIG9uTWVzc2FnZShldmVudCwgaGFuZGxlcikge1xuICAgICAgICB3cy5vbk1lc3NhZ2UoZXZlbnQsIChkYXRhLCBtZXNzYWdlVHJhY2VDb250ZXh0KSA9PlxuICAgICAgICAgIHJ1bkluQ29udGV4dChhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBldmVudE5hbWUgPSBTdHJpbmcoZXZlbnQpO1xuICAgICAgICAgICAgY29uc3QgdHJhY2VDb250ZXh0ID0gbWVzc2FnZVRyYWNlQ29udGV4dCA/PyBnZXRXZWJTb2NrZXRUZWxlbWV0cnlDb250ZXh0KHdzKTtcbiAgICAgICAgICAgIGNvbnN0IHN0YXJ0ZWRBdCA9IHBlcmZvcm1hbmNlLm5vdygpO1xuXG4gICAgICAgICAgICB0ZWxlbWV0cnlDb250cm9sbGVyPy5lbWl0KHtcbiAgICAgICAgICAgICAgbmFtZTogXCJ3cy5oYW5kbGVyLnN0YXJ0ZWRcIixcbiAgICAgICAgICAgICAgbGV2ZWw6IFwiZGVidWdcIixcbiAgICAgICAgICAgICAgY29ubmVjdGlvbklkOiB3cy5pZCxcbiAgICAgICAgICAgICAgbmFtZXNwYWNlOiB3cy5uYW1lc3BhY2UsXG4gICAgICAgICAgICAgIHVzZXJJZDogd3MudXNlcklkLFxuICAgICAgICAgICAgICBkZXRhaWw6IHsgZXZlbnQ6IGV2ZW50TmFtZSB9LFxuICAgICAgICAgICAgICAuLi50cmFjZUNvbnRleHQsXG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgaGFuZGxlcihkYXRhLCBtZXNzYWdlVHJhY2VDb250ZXh0KTtcbiAgICAgICAgICAgICAgY29uc3QgZHVyYXRpb25NcyA9IHBlcmZvcm1hbmNlLm5vdygpIC0gc3RhcnRlZEF0O1xuICAgICAgICAgICAgICB0ZWxlbWV0cnlDb250cm9sbGVyPy5lbWl0KHtcbiAgICAgICAgICAgICAgICBuYW1lOiBcIndzLmhhbmRsZXIuY29tcGxldGVkXCIsXG4gICAgICAgICAgICAgICAgbGV2ZWw6IFwiZGVidWdcIixcbiAgICAgICAgICAgICAgICBjb25uZWN0aW9uSWQ6IHdzLmlkLFxuICAgICAgICAgICAgICAgIG5hbWVzcGFjZTogd3MubmFtZXNwYWNlLFxuICAgICAgICAgICAgICAgIHVzZXJJZDogd3MudXNlcklkLFxuICAgICAgICAgICAgICAgIGRldGFpbDogeyBldmVudDogZXZlbnROYW1lIH0sXG4gICAgICAgICAgICAgICAgLi4udHJhY2VDb250ZXh0LFxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgdGVsZW1ldHJ5Q29udHJvbGxlcj8ucmVjb3JkU3Bhbih7XG4gICAgICAgICAgICAgICAgb3BlcmF0aW9uTmFtZTogXCJ3cy5tZXNzYWdlLnByb2Nlc3NcIixcbiAgICAgICAgICAgICAgICBraW5kOiBcImludGVybmFsXCIsXG4gICAgICAgICAgICAgICAgZHVyYXRpb25NcyxcbiAgICAgICAgICAgICAgICBzdGF0dXM6IFwidW5zZXRcIixcbiAgICAgICAgICAgICAgICBjb25uZWN0aW9uSWQ6IHdzLmlkLFxuICAgICAgICAgICAgICAgIG5hbWVzcGFjZTogd3MubmFtZXNwYWNlLFxuICAgICAgICAgICAgICAgIHVzZXJJZDogd3MudXNlcklkLFxuICAgICAgICAgICAgICAgIGF0dHJpYnV0ZXM6IHsgZXZlbnQ6IGV2ZW50TmFtZSB9LFxuICAgICAgICAgICAgICAgIC4uLnRyYWNlQ29udGV4dCxcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICBjb25zdCBkdXJhdGlvbk1zID0gcGVyZm9ybWFuY2Uubm93KCkgLSBzdGFydGVkQXQ7XG4gICAgICAgICAgICAgIHRlbGVtZXRyeUNvbnRyb2xsZXI/LmVtaXQoe1xuICAgICAgICAgICAgICAgIG5hbWU6IFwid3MuaGFuZGxlci5mYWlsZWRcIixcbiAgICAgICAgICAgICAgICBsZXZlbDogXCJlcnJvclwiLFxuICAgICAgICAgICAgICAgIGNvbm5lY3Rpb25JZDogd3MuaWQsXG4gICAgICAgICAgICAgICAgbmFtZXNwYWNlOiB3cy5uYW1lc3BhY2UsXG4gICAgICAgICAgICAgICAgdXNlcklkOiB3cy51c2VySWQsXG4gICAgICAgICAgICAgICAgZGV0YWlsOiB7IGV2ZW50OiBldmVudE5hbWUgfSxcbiAgICAgICAgICAgICAgICAuLi50cmFjZUNvbnRleHQsXG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICB0ZWxlbWV0cnlDb250cm9sbGVyPy5yZWNvcmRTcGFuKHtcbiAgICAgICAgICAgICAgICBvcGVyYXRpb25OYW1lOiBcIndzLm1lc3NhZ2UucHJvY2Vzc1wiLFxuICAgICAgICAgICAgICAgIGtpbmQ6IFwiaW50ZXJuYWxcIixcbiAgICAgICAgICAgICAgICBkdXJhdGlvbk1zLFxuICAgICAgICAgICAgICAgIHN0YXR1czogXCJlcnJvclwiLFxuICAgICAgICAgICAgICAgIGNvbm5lY3Rpb25JZDogd3MuaWQsXG4gICAgICAgICAgICAgICAgbmFtZXNwYWNlOiB3cy5uYW1lc3BhY2UsXG4gICAgICAgICAgICAgICAgdXNlcklkOiB3cy51c2VySWQsXG4gICAgICAgICAgICAgICAgYXR0cmlidXRlczogeyBldmVudDogZXZlbnROYW1lIH0sXG4gICAgICAgICAgICAgICAgZXJyb3JUeXBlOiBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubmFtZSA6IHJ1bnRpbWVUeXBlT2YoZXJyb3IpLFxuICAgICAgICAgICAgICAgIC4uLnRyYWNlQ29udGV4dCxcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pLFxuICAgICAgICApO1xuICAgICAgfSxcbiAgICAgIHB1Ymxpc2goZXZlbnQsIGRhdGEpIHtcbiAgICAgICAgd3MucHVibGlzaChldmVudCwgZGF0YSk7XG4gICAgICB9LFxuICAgICAgd2FpdEZvckNsb3NlKCkge1xuICAgICAgICByZXR1cm4gd3Mud2FpdEZvckNsb3NlKCk7XG4gICAgICB9LFxuICAgICAgam9pbihyb29tSWQpIHtcbiAgICAgICAgd3Muam9pbihyb29tSWQpO1xuICAgICAgfSxcbiAgICAgIGxlYXZlKHJvb21JZCkge1xuICAgICAgICB3cy5sZWF2ZShyb29tSWQpO1xuICAgICAgfSxcbiAgICAgIHNldFVzZXJJZCh1c2VySWQpIHtcbiAgICAgICAgd3Muc2V0VXNlcklkKHVzZXJJZCk7XG4gICAgICB9LFxuICAgICAgY2xlYXJVc2VySWQoKSB7XG4gICAgICAgIHdzLmNsZWFyVXNlcklkKCk7XG4gICAgICB9LFxuICAgIH07XG4gIH1cblxuICBjcmVhdGVTY29wZWRXZWJTb2NrZXRDb25uZWN0aW9uRm9yVGVzdGluZzxUT3V0IGV4dGVuZHMgb2JqZWN0LCBUSW4gZXh0ZW5kcyBvYmplY3Q+KFxuICAgIHdzOiBXZWJTb2NrZXRDb25uZWN0aW9uPFRPdXQsIFRJbj4sXG4gICAgZ2V0Q29udGV4dDogKCkgPT4gV2ViU29ja2V0Q29udGV4dCB8IG51bGwsXG4gICk6IFdlYlNvY2tldENvbm5lY3Rpb248VE91dCwgVEluPiB7XG4gICAgcmV0dXJuIHRoaXMuY3JlYXRlU2NvcGVkV2ViU29ja2V0Q29ubmVjdGlvbih3cywgZ2V0Q29udGV4dCk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHBhcnNlV2ViU29ja2V0UmVxdWVzdFBhcmFtcyhcbiAgICBhcGk6IEV4dGVuZGVkQXBpLFxuICAgIHJlcXVlc3Q6IEZhc3RpZnlSZXF1ZXN0LFxuICApOiBQcm9taXNlPE1hcDxzdHJpbmcsIEFwaUFyZ3VtZW50Pj4ge1xuICAgIGNvbnN0IHsgZ2V0Wm9kT2JqZWN0RnJvbUFwaSB9ID0gYXdhaXQgaW1wb3J0KFwiLi9jb2RlLWNvbnZlcnRlcnNcIik7XG4gICAgY29uc3QgUmVxVHlwZSA9IGdldFpvZE9iamVjdEZyb21BcGkoYXBpLCB0aGlzLnN5bmNlci50eXBlcyk7XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgeyBmYXN0aWZ5Q2FzdGVyIH0gPSBhd2FpdCBpbXBvcnQoXCIuL2Nhc3RlclwiKTtcbiAgICAgIHJldHVybiB0b0FwaUFyZ3VtZW50TWFwKGZhc3RpZnlDYXN0ZXIoUmVxVHlwZSkucGFyc2UocmVxdWVzdC5xdWVyeSA/PyB7fSkpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGNvbnN0IHsgWm9kRXJyb3IgfSA9IGF3YWl0IGltcG9ydChcInpvZFwiKTtcbiAgICAgIGlmIChlIGluc3RhbmNlb2YgWm9kRXJyb3IpIHtcbiAgICAgICAgY29uc3QgeyBodW1hbml6ZVpvZEVycm9yIH0gPSBhd2FpdCBpbXBvcnQoXCIuLi91dGlscy96b2QtZXJyb3JcIik7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2VzID0gaHVtYW5pemVab2RFcnJvcihlKVxuICAgICAgICAgIC5tYXAoKGlzc3VlKSA9PiBpc3N1ZS5tZXNzYWdlKVxuICAgICAgICAgIC5qb2luKFwiIFwiKTtcbiAgICAgICAgY29uc3QgeyBCYWRSZXF1ZXN0RXhjZXB0aW9uIH0gPSBhd2FpdCBpbXBvcnQoXCIuLi9leGNlcHRpb25zL3NvLWV4Y2VwdGlvbnNcIik7XG4gICAgICAgIHRocm93IG5ldyBCYWRSZXF1ZXN0RXhjZXB0aW9uKFxuICAgICAgICAgIC8qIFNBRkVUWTogQVBJIOuNsOy9lOugiOydtO2EsOyZgCBab2Qg6rKA7Kad6riwIOuTseuhnSDqs4Tslb3snbQg7J20IOqwkuydmCDtg4DsnoXsnYQg67O07J6l7ZWc64ukLiAqLyBtZXNzYWdlcyBhcyBMb2NhbGl6ZWRTdHJpbmcsXG4gICAgICAgICAge1xuICAgICAgICAgICAgem9kRXJyb3I6IGUsXG4gICAgICAgICAgfSxcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgdGhyb3cgZTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVVJM7JeQ7IScIHBhdGggcGFyYW1z66W8IOy2lOy2nO2VqeuLiOuLpC5cbiAgICog7JiIOiBwYXR0ZXJuPVwiL2FkbWluL2NvbXBhbmllcy86Y29tcGFueUlkXCIsIHVybD1cIi9hZG1pbi9jb21wYW5pZXMvMTIzXCIg4oaSIHsgY29tcGFueUlkOiBcIjEyM1wiIH1cbiAgICovXG4gIHByaXZhdGUgZXh0cmFjdFBhdGhQYXJhbXMocGF0dGVybjogc3RyaW5nLCB1cmw6IHN0cmluZykge1xuICAgIGNvbnN0IHBhdHRlcm5QYXJ0cyA9IHBhdHRlcm4uc3BsaXQoXCIvXCIpLmZpbHRlcihCb29sZWFuKTtcbiAgICBjb25zdCB1cmxQYXJ0cyA9IHRoaXMuZ2V0UGF0aG5hbWVGcm9tVXJsKHVybCkuc3BsaXQoXCIvXCIpLmZpbHRlcihCb29sZWFuKTtcbiAgICBjb25zdCBwYXJhbXM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fTtcblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcGF0dGVyblBhcnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAocGF0dGVyblBhcnRzW2ldLnN0YXJ0c1dpdGgoXCI6XCIpKSB7XG4gICAgICAgIHBhcmFtc1twYXR0ZXJuUGFydHNbaV0uc2xpY2UoMSldID0gdXJsUGFydHNbaV07XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBwYXJhbXM7XG4gIH1cblxuICBwcml2YXRlIGlzUGF0aFBhdHRlcm5NYXRjaChwYXR0ZXJuOiBzdHJpbmcsIHVybDogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgY29uc3QgcGF0dGVyblBhcnRzID0gcGF0dGVybi5zcGxpdChcIi9cIikuZmlsdGVyKEJvb2xlYW4pO1xuICAgIGNvbnN0IHVybFBhcnRzID0gdGhpcy5nZXRQYXRobmFtZUZyb21VcmwodXJsKS5zcGxpdChcIi9cIikuZmlsdGVyKEJvb2xlYW4pO1xuXG4gICAgaWYgKHBhdHRlcm5QYXJ0cy5sZW5ndGggIT09IHVybFBhcnRzLmxlbmd0aCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcGF0dGVyblBhcnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBwYXR0ZXJuUGFydCA9IHBhdHRlcm5QYXJ0c1tpXTtcbiAgICAgIGNvbnN0IHVybFBhcnQgPSB1cmxQYXJ0c1tpXTtcbiAgICAgIGlmIChwYXR0ZXJuUGFydC5zdGFydHNXaXRoKFwiOlwiKSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGlmIChwYXR0ZXJuUGFydCAhPT0gdXJsUGFydCkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBwcml2YXRlIGdldFBhdGhuYW1lRnJvbVVybCh1cmw6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHVybC5zcGxpdChcIj9cIilbMF07XG4gIH1cblxuICBwcml2YXRlIHJlc29sdmVQYXRoV2l0aGluQmFzZURpcihiYXNlRGlyOiBzdHJpbmcsIGlucHV0UGF0aDogc3RyaW5nKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGRlY29kZWQgPSBkZWNvZGVVUklDb21wb25lbnQoaW5wdXRQYXRoKS5yZXBsYWNlKC9cXFxcL2csIFwiL1wiKTtcbiAgICAgIGlmIChkZWNvZGVkLmluY2x1ZGVzKFwiXFwwXCIpKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuICAgICAgY29uc3QgcmVsYXRpdmVQYXRoID0gZGVjb2RlZC5yZXBsYWNlKC9eXFwvKy8sIFwiXCIpO1xuICAgICAgY29uc3QgcmVzb2x2ZWRQYXRoID0gcGF0aC5yZXNvbHZlKGJhc2VEaXIsIHJlbGF0aXZlUGF0aCk7XG4gICAgICBjb25zdCByZWxhdGl2ZUZyb21CYXNlID0gcGF0aC5yZWxhdGl2ZShiYXNlRGlyLCByZXNvbHZlZFBhdGgpO1xuICAgICAgaWYgKHJlbGF0aXZlRnJvbUJhc2Uuc3RhcnRzV2l0aChcIi4uXCIpIHx8IHBhdGguaXNBYnNvbHV0ZShyZWxhdGl2ZUZyb21CYXNlKSkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cbiAgICAgIHJldHVybiByZXNvbHZlZFBhdGg7XG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQVBJIOydkeuLteyXkCDsoIHsmqntlaAgQ2FjaGUtQ29udHJvbCDshKTsoJXsnYQg6rKw7KCV7ZWp64uI64ukLlxuICAgKiDsmrDshKDsiJzsnIQ6IOqwnOuzhCDsp4DsoJUgPiBjYWNoZUNvbnRyb2xIYW5kbGVyXG4gICAqL1xuICBwcml2YXRlIGdldEFwaUNhY2hlQ29udHJvbChcbiAgICBhcGk6IEV4dGVuZGVkQXBpLFxuICAgIHJlcXVlc3Q6IEZhc3RpZnlSZXF1ZXN0LFxuICAgIGNvbmZpZzogU29uYW11RmFzdGlmeUNvbmZpZyxcbiAgKSB7XG4gICAgLy8g642w7L2U66CI7J207YSwIOyEpOyglSDsmrDshKBcbiAgICBpZiAoYXBpLm9wdGlvbnMuY2FjaGVDb250cm9sKSB7XG4gICAgICByZXR1cm4gYXBpLm9wdGlvbnMuY2FjaGVDb250cm9sO1xuICAgIH1cblxuICAgIC8vIOyghOyXrSDtlbjrk6Trn6xcbiAgICBpZiAoY29uZmlnLmNhY2hlQ29udHJvbEhhbmRsZXIpIHtcbiAgICAgIGNvbnN0IGNhY2hlUmVxOiBDYWNoZUNvbnRyb2xSZXF1ZXN0ID0ge1xuICAgICAgICB0eXBlOiBcImFwaVwiLFxuICAgICAgICB1cmw6IHJlcXVlc3QudXJsLFxuICAgICAgICBwYXRoOiByZXF1ZXN0LnJvdXRlT3B0aW9ucz8udXJsID8/IHJlcXVlc3QudXJsLnNwbGl0KFwiP1wiKVswXSxcbiAgICAgICAgbWV0aG9kOiByZXF1ZXN0Lm1ldGhvZCxcbiAgICAgICAgYXBpLFxuICAgICAgfTtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGNvbmZpZy5jYWNoZUNvbnRyb2xIYW5kbGVyKGNhY2hlUmVxKTtcbiAgICAgIGlmIChyZXN1bHQpIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICAvKipcbiAgICogU1NS7JqpIEFQSSDtmLjstpwgKEhUVFAg7Jik67KE7Zek65OcIOyXhuydtCDsp4HsoJEg7Zi47LacKVxuICAgKiBjcmVhdGVBcGlIYW5kbGVy7J2YIOuhnOyngeydhCDsnqzsgqzsmqntlZjrkJgsIHJlcXVlc3Qg7YyM7IuxIOuMgOyLoCBwYXJhbXMg7KeB7KCRIOyCrOyaqVxuICAgKi9cbiAgYXN5bmMgaW52b2tlQXBpRm9yU1NSKFxuICAgIGFwaTogRXh0ZW5kZWRBcGksXG4gICAgcGFyYW1zOiBhbnlbXSxcbiAgICBjb25maWc6IFNvbmFtdUZhc3RpZnlDb25maWcsXG4gICAgcmVxdWVzdDogRmFzdGlmeVJlcXVlc3QsXG4gICAgcmVwbHk6IEZhc3RpZnlSZXBseSxcbiAgKTogUHJvbWlzZTxBcGlNZXRob2RSZXN1bHQ+IHtcbiAgICAvLyBDb250ZXh0IOyDneyEsSAo6riw7KG0IOuplOyGjOuTnCDsnqzsgqzsmqkpXG4gICAgY29uc3QgY29udGV4dCA9IGF3YWl0IHRoaXMuY3JlYXRlQ29udGV4dChjb25maWcsIHJlcXVlc3QsIHJlcGx5KTtcblxuICAgIHJldHVybiB0aGlzLmFzeW5jTG9jYWxTdG9yYWdlLnJ1bih7IGNvbnRleHQgfSwgYXN5bmMgKCkgPT4ge1xuICAgICAgLy8gYXJncyDsg53shLE6IENvbnRleHQg7YyM652866+47YSw64qUIOyjvOyehSwg64KY66i47KeA64qUIHBhcmFtc+yXkOyEnCDqsIDsoLjsmKTquLBcbiAgICAgIGNvbnN0IHsgQXBpUGFyYW1UeXBlIH0gPSBhd2FpdCBpbXBvcnQoXCIuLi90eXBlcy90eXBlc1wiKTtcbiAgICAgIGxldCBwYXJhbXNJbmRleCA9IDA7XG4gICAgICBjb25zdCBhcmdzID0gYXBpLnBhcmFtZXRlcnMubWFwKChwYXJhbSkgPT4ge1xuICAgICAgICBpZiAoQXBpUGFyYW1UeXBlLmlzQ29udGV4dChwYXJhbS50eXBlKSkge1xuICAgICAgICAgIHJldHVybiBjb250ZXh0O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBwYXJhbXNbcGFyYW1zSW5kZXgrK107XG4gICAgICB9KTtcblxuICAgICAgLy8g66qo6424IOuplOyEnOuTnCDtmLjstpwgKOq4sOyhtCDrqZTshJzrk5wg7J6s7IKs7JqpKVxuICAgICAgcmV0dXJuIHRoaXMuaW52b2tlTW9kZWxNZXRob2QoYXBpLCBhcmdzLCByZXBseSk7XG4gICAgfSk7XG4gIH1cblxuICBhc3luYyBoYW5kbGVEZXZBcGlSZXF1ZXN0Rm9yVGVzdGluZyhyZXF1ZXN0OiBGYXN0aWZ5UmVxdWVzdCwgY29uZmlnOiBTb25hbXVGYXN0aWZ5Q29uZmlnKSB7XG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuaGFuZGxlRGV2QXBpUmVxdWVzdChyZXF1ZXN0LCBjb25maWcpO1xuICB9XG5cbiAgLy8gV1Mg6rK966Gc7JeQ7ISc64qUIEhUVFAgcmVwbHnqsIAg7JeG7Jy866+A66GcIHJlcGx566W8IG9wdGlvbmFs66GcIOuwm+yVhCDqs7XthrUg7Zi47LacIOqyveuhnOulvCDsnKDsp4DtlahcbiAgYXN5bmMgaW52b2tlTW9kZWxNZXRob2QoXG4gICAgYXBpOiBFeHRlbmRlZEFwaSxcbiAgICBhcmdzOiB1bmtub3duW10sXG4gICAgcmVwbHk/OiBGYXN0aWZ5UmVwbHksXG4gICAgbW9kZWxzOiBMb2FkZWRNb2RlbHMgPSB0aGlzLnN5bmNlci5tb2RlbHMsXG4gICk6IFByb21pc2U8QXBpTWV0aG9kUmVzdWx0PiB7XG4gICAgY29uc3QgbW9kZWwgPSBtb2RlbHNbYXBpLm1vZGVsTmFtZV07XG4gICAgaWYgKG1vZGVsID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgTW9kZWwgbm90IGZvdW5kOiAke2FwaS5tb2RlbE5hbWV9YCk7XG4gICAgfVxuICAgIGNvbnN0IG1ldGhvZCA9XG4gICAgICBtb2RlbFtcbiAgICAgICAgLyogU0FGRVRZOiDrj5nquLDtmZTquLDqsIAg66qo6424IO2BtOuemOyKpOyXkOyEnCDsiJjsp5HtlZwgQVBJIOuplOyEnOuTnCDsnbTrpoTrp4wg7KCE64us7ZWc64ukLiAqLyBhcGkubWV0aG9kTmFtZSBhcyBrZXlvZiB0eXBlb2YgbW9kZWxcbiAgICAgIF07XG4gICAgaWYgKCFpc0Z1bmN0aW9uVmFsdWUobWV0aG9kKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBNb2RlbCBtZXRob2Qgbm90IGZvdW5kOiAke2FwaS5tb2RlbE5hbWV9LiR7YXBpLm1ldGhvZE5hbWV9YCk7XG4gICAgfVxuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IEZ1bmN0aW9uLnByb3RvdHlwZS5hcHBseS5jYWxsKG1ldGhvZCwgbW9kZWwsIGFyZ3MpO1xuICAgIHJlcGx5Py50eXBlKGFwaS5vcHRpb25zLmNvbnRlbnRUeXBlID8/IFwiYXBwbGljYXRpb24vanNvblwiKTtcblxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICBhc3luYyBjcmVhdGVDb250ZXh0KFxuICAgIGNvbmZpZzogU29uYW11RmFzdGlmeUNvbmZpZyxcbiAgICByZXF1ZXN0OiBGYXN0aWZ5UmVxdWVzdCxcbiAgICByZXBseTogRmFzdGlmeVJlcGx5LFxuICApOiBQcm9taXNlPENvbnRleHQ+IHtcbiAgICAvLyBjcmVhdGVTU0VGYWN0b3J5IO2VqOyImOyXkCDrr7jrpqwgcmVxdWVzdOydmCBzb2NrZXTqs7wgcmVwbHnrpbwg67CU7J2465SpLlxuICAgIGNvbnN0IHsgY3JlYXRlU1NFRmFjdG9yeSB9ID0gYXdhaXQgaW1wb3J0KFwiLi4vc3RyZWFtL3NzZVwiKTtcbiAgICBjb25zdCBjcmVhdGVTU0UgPSAoPFQgZXh0ZW5kcyBab2RPYmplY3Q+KFxuICAgICAgX3JlcXVlc3Q6IEZhc3RpZnlSZXF1ZXN0LFxuICAgICAgX3JlcGx5OiBGYXN0aWZ5UmVwbHksXG4gICAgICBfZXZlbnRzOiBULFxuICAgICkgPT4gY3JlYXRlU1NFRmFjdG9yeShfcmVxdWVzdC5zb2NrZXQsIF9yZXBseSwgX2V2ZW50cykpLmJpbmQobnVsbCwgcmVxdWVzdCwgcmVwbHkpO1xuXG4gICAgLy8gbG9jYWxlIOqwkOyngFxuICAgIGNvbnN0IGxvY2FsZSA9XG4gICAgICB0aGlzLmRldGVjdExvY2FsZShyZXF1ZXN0LmhlYWRlcnNbXCJhY2NlcHQtbGFuZ3VhZ2VcIl0sIHRoaXMuY29uZmlnLmkxOG4uc3VwcG9ydGVkTG9jYWxlcykgPz9cbiAgICAgIHRoaXMuY29uZmlnLmkxOG4uZGVmYXVsdExvY2FsZTtcblxuICAgIC8vIGF1dGggY29udGV4dCDstpTqsIBcbiAgICBjb25zdCBoZWFkZXJzID0gY29udmVydEZhc3RpZnlIZWFkZXJzVG9TdGFuZGFyZChyZXF1ZXN0LmhlYWRlcnMpO1xuICAgIGNvbnN0IHNlc3Npb24gPSAoYXdhaXQgdGhpcy5hdXRoVmFsdWU/LmFwaS5nZXRTZXNzaW9uKHsgaGVhZGVycyB9KSkgPz8gbnVsbDtcblxuICAgIGNvbnN0IGNvbnRleHQ6IENvbnRleHQgPSBhd2FpdCBQcm9taXNlLnJlc29sdmUoXG4gICAgICBjb25maWcuY29udGV4dFByb3ZpZGVyKFxuICAgICAgICB7XG4gICAgICAgICAgdHJhbnNwb3J0OiBcImh0dHBcIixcbiAgICAgICAgICByZXF1ZXN0LFxuICAgICAgICAgIHJlcGx5LFxuICAgICAgICAgIGhlYWRlcnM6IHJlcXVlc3QuaGVhZGVycyxcbiAgICAgICAgICBjcmVhdGVTU0UsXG4gICAgICAgICAgbmFpdGVTdG9yZTogbmV3IE1hcCgpLFxuICAgICAgICAgIGxvY2FsZSxcbiAgICAgICAgICAvLyBhdXRoXG4gICAgICAgICAgdXNlcjogc2Vzc2lvbj8udXNlciA/PyBudWxsLFxuICAgICAgICAgIHNlc3Npb246IHNlc3Npb24/LnNlc3Npb24gPz8gbnVsbCxcbiAgICAgICAgfSxcbiAgICAgICAgcmVxdWVzdCxcbiAgICAgICAgcmVwbHksXG4gICAgICApLFxuICAgICk7XG4gICAgcmV0dXJuIGNvbnRleHQ7XG4gIH1cblxuICAvLyBzZXNzaW9uL2xvY2FsZS9zdG9yZSDqsJnsnYAg6rO17Ya1IHN0YXRl64qUIEhUVFAgY29udGV4dOyZgCDqs7XsnKDtlZjrkJgsIHJlcGx5L2NyZWF0ZVNTRSDqsJnsnYAgSFRUUCDsoITsmqkgaGVscGVy64qUIOuFuOy2nO2VmOyngCDslYrsnYxcbiAgLy8g7IKs7Jqp7J6Q6rCAIHdlYnNvY2tldENvbnRleHRQcm92aWRlcuulvCDso7zrqbQg6re464yA66GcIOychOyehO2VmOqzoCwg7JeG7Jy866m0IOq4sOyhtCBjb250ZXh0UHJvdmlkZXLrpbwgcmVwbHkvU1NFIHN0dWLqs7wg7ZWo6ruYIOyerO2ZnOyaqe2VqFxuICBhc3luYyBjcmVhdGVXZWJTb2NrZXRDb250ZXh0KFxuICAgIGNvbmZpZzogU29uYW11RmFzdGlmeUNvbmZpZyxcbiAgICByZXF1ZXN0OiBGYXN0aWZ5UmVxdWVzdCxcbiAgICB3czogQW55V2ViU29ja2V0Q29ubmVjdGlvbixcbiAgKTogUHJvbWlzZTxXZWJTb2NrZXRDb250ZXh0PiB7XG4gICAgY29uc3QgbG9jYWxlID1cbiAgICAgIHRoaXMuZGV0ZWN0TG9jYWxlKHJlcXVlc3QuaGVhZGVyc1tcImFjY2VwdC1sYW5ndWFnZVwiXSwgdGhpcy5jb25maWcuaTE4bi5zdXBwb3J0ZWRMb2NhbGVzKSA/P1xuICAgICAgdGhpcy5jb25maWcuaTE4bi5kZWZhdWx0TG9jYWxlO1xuXG4gICAgY29uc3QgaGVhZGVycyA9IGNvbnZlcnRGYXN0aWZ5SGVhZGVyc1RvU3RhbmRhcmQocmVxdWVzdC5oZWFkZXJzKTtcbiAgICBjb25zdCBzZXNzaW9uID0gKGF3YWl0IHRoaXMuYXV0aFZhbHVlPy5hcGkuZ2V0U2Vzc2lvbih7IGhlYWRlcnMgfSkpID8/IG51bGw7XG5cbiAgICBjb25zdCBkZWZhdWx0Q29udGV4dCA9IHtcbiAgICAgIHRyYW5zcG9ydDogXCJ3c1wiIGFzIGNvbnN0LFxuICAgICAgcmVxdWVzdCxcbiAgICAgIGhlYWRlcnM6IHJlcXVlc3QuaGVhZGVycyxcbiAgICAgIHdzLFxuICAgICAgbmFpdGVTdG9yZTogbmV3IE1hcCgpLFxuICAgICAgbG9jYWxlLFxuICAgICAgdXNlcjogc2Vzc2lvbj8udXNlciA/PyBudWxsLFxuICAgICAgc2Vzc2lvbjogc2Vzc2lvbj8uc2Vzc2lvbiA/PyBudWxsLFxuICAgIH07XG5cbiAgICBpZiAoY29uZmlnLndlYnNvY2tldENvbnRleHRQcm92aWRlcikge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgLi4uKGF3YWl0IFByb21pc2UucmVzb2x2ZShjb25maWcud2Vic29ja2V0Q29udGV4dFByb3ZpZGVyKGRlZmF1bHRDb250ZXh0LCByZXF1ZXN0KSkpLFxuICAgICAgfTtcbiAgICB9XG5cbiAgICAvLyByZXBseS9jcmVhdGVTU0Xsl5Ag7J2Y7KG07ZWY64qUIGNvbnRleHRQcm92aWRlcuqwgCDsnojsnLzrqbQg7KaJ7IucIOyXkOufrOulvCDrjZjsoLggdHJhbnNwb3J0IG1pc3VzZeulvCDruajrpqwg65Oc65+s64OEXG4gICAgY29uc3QgcmVwbHlTdHViID0gY3JlYXRlV2ViU29ja2V0UmVwbHlTdHViKCk7XG4gICAgY29uc3QgaHR0cExpa2VDb250ZXh0ID0gYXdhaXQgUHJvbWlzZS5yZXNvbHZlKFxuICAgICAgY29uZmlnLmNvbnRleHRQcm92aWRlcihcbiAgICAgICAge1xuICAgICAgICAgIHRyYW5zcG9ydDogXCJodHRwXCIsXG4gICAgICAgICAgcmVxdWVzdCxcbiAgICAgICAgICByZXBseTogcmVwbHlTdHViLFxuICAgICAgICAgIGhlYWRlcnM6IHJlcXVlc3QuaGVhZGVycyxcbiAgICAgICAgICBjcmVhdGVTU0U6IGNyZWF0ZVVuYXZhaWxhYmxlU1NFLFxuICAgICAgICAgIG5haXRlU3RvcmU6IGRlZmF1bHRDb250ZXh0Lm5haXRlU3RvcmUsXG4gICAgICAgICAgbG9jYWxlLFxuICAgICAgICAgIHVzZXI6IGRlZmF1bHRDb250ZXh0LnVzZXIsXG4gICAgICAgICAgc2Vzc2lvbjogZGVmYXVsdENvbnRleHQuc2Vzc2lvbixcbiAgICAgICAgfSxcbiAgICAgICAgcmVxdWVzdCxcbiAgICAgICAgcmVwbHlTdHViLFxuICAgICAgKSxcbiAgICApO1xuXG4gICAgY29uc3Qge1xuICAgICAgdHJhbnNwb3J0OiBfdHJhbnNwb3J0LFxuICAgICAgcmVwbHk6IF9yZXBseSxcbiAgICAgIGNyZWF0ZVNTRTogX2NyZWF0ZVNTRSxcbiAgICAgIGJ1ZmZlcmVkRmlsZXM6IF9idWZmZXJlZEZpbGVzLFxuICAgICAgdXBsb2FkZWRGaWxlczogX3VwbG9hZGVkRmlsZXMsXG4gICAgICAuLi5yZXN0XG4gICAgfSA9IGh0dHBMaWtlQ29udGV4dDtcblxuICAgIHJldHVybiB7XG4gICAgICAuLi5yZXN0LFxuICAgICAgdHJhbnNwb3J0OiBcIndzXCIsXG4gICAgICByZXF1ZXN0LFxuICAgICAgaGVhZGVyczogcmVxdWVzdC5oZWFkZXJzLFxuICAgICAgd3MsXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBY2NlcHQtTGFuZ3VhZ2Ug7Zek642U7JeQ7IScIOyngOybkO2VmOuKlCBsb2NhbGXsnYQg7LC+7Iq164uI64ukLlxuICAgKiBAZXhhbXBsZSBcImtvLUtSLGtvO3E9MC45LGVuO3E9MC44XCIg4oaSIFwia29cIlxuICAgKi9cbiAgcHJpdmF0ZSBkZXRlY3RMb2NhbGUoXG4gICAgYWNjZXB0TGFuZ3VhZ2U6IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgICBzdXBwb3J0ZWQ6IHN0cmluZ1tdLFxuICApOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIGlmICghYWNjZXB0TGFuZ3VhZ2UpIHJldHVybiB1bmRlZmluZWQ7XG5cbiAgICAvLyBBY2NlcHQtTGFuZ3VhZ2U6IGtvLUtSLGtvO3E9MC45LGVuO3E9MC44XG4gICAgY29uc3QgbGFuZ3MgPSBhY2NlcHRMYW5ndWFnZS5zcGxpdChcIixcIikubWFwKChsYW5nKSA9PiB7XG4gICAgICBjb25zdCBbY29kZV0gPSBsYW5nLnNwbGl0KFwiO1wiKTtcbiAgICAgIHJldHVybiBjb2RlLnRyaW0oKS5zcGxpdChcIi1cIilbMF07IC8vIGtvLUtSIOKGkiBrb1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIGxhbmdzLmZpbmQoKGxhbmcpID0+IHN1cHBvcnRlZC5pbmNsdWRlcyhsYW5nKSk7XG4gIH1cblxuICBhc3luYyBzdGFydFdhdGNoZXIoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgLy8gd2F0Y2hlciDrqqjrk4jsnYAgZmlsZS1wYXR0ZXJucyDihpIgU29uYW11IOyInO2ZmOydhCDtlLztlZjquLAg7JyE7ZW0IGR5bmFtaWMgaW1wb3J0IO2VqeuLiOuLpC5cbiAgICBjb25zdCB7IHNldHVwV2F0Y2hlciB9ID0gYXdhaXQgaW1wb3J0KFwiLi4vc3luY2VyL3dhdGNoZXJcIik7XG4gICAgdGhpcy53YXRjaGVyID0gYXdhaXQgc2V0dXBXYXRjaGVyKChmaWxlRXZlbnRzKSA9PiB0aGlzLnJ1bkhtclN5bmNDeWNsZShmaWxlRXZlbnRzKSk7XG4gIH1cblxuICAvKipcbiAgICogV2F0Y2hlcuqwgCAxMDBtcyBiYXRjaOuhnCDrqqjsnYAgZmlsZUV2ZW50cyDtlZjrgpjsl5Ag64yA7ZW0IO2VnCDrsojsnZggSE1SL3N5bmMg7IKs7J207YG07J2EIOuPleuLiOuLpC5cbiAgICogYmF0Y2gg7YGQ7J6JIOuNleyXkCDtlZwg7Iuc7KCQ7JeQIO2VmOuCmOunjCDsi6TtlonrkKjsnbQg67O07J6l65Cp64uI64ukIChldmVudC1iYXRjaGVy6rCAIOyngeugrO2ZlCkuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHJ1bkhtclN5bmNDeWNsZShmaWxlRXZlbnRzOiBNYXA8QWJzb2x1dGVQYXRoLCBcImNoYW5nZVwiIHwgXCJhZGRcIj4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBzdGFydGVkQXQgPSBEYXRlLm5vdygpO1xuXG4gICAgZm9yIChjb25zdCBbZmlsZVBhdGgsIGV2ZW50XSBvZiBmaWxlRXZlbnRzKSB7XG4gICAgICBjb25zdCByZWxhdGl2ZVBhdGggPSBwYXRoLnJlbGF0aXZlKHRoaXMuYXBwUm9vdFBhdGgsIGZpbGVQYXRoKTtcbiAgICAgIGNvbnNvbGUubG9nKGNoYWxrLmJvbGQoYERldGVjdGVkKCR7ZXZlbnR9KTogJHtjaGFsay5ibHVlKHJlbGF0aXZlUGF0aCl9YCkpO1xuICAgIH1cblxuICAgIC8vIOuzuOyytDog67OA6rK9IO2doeyImCArIOyytO2BrOyErCDqsLHsi6AuXG4gICAgYXdhaXQgdGhpcy5zeW5jZXIuaG1yQW5kU3luYyhmaWxlRXZlbnRzKTtcbiAgICBhd2FpdCB0aGlzLnN5bmNlci5yZW5ld0NoZWNrc3VtcygpO1xuXG4gICAgY29uc3QgdG90YWxUaW1lID0gRGF0ZS5ub3coKSAtIHN0YXJ0ZWRBdDtcbiAgICBjb25zdCBtc2cgPSBgSE1SIERvbmUhICR7Y2hhbGsuYm9sZC53aGl0ZShgJHt0b3RhbFRpbWV9bXNgKX1gO1xuICAgIGNvbnNvbGUubG9nKGNoYWxrLmJsYWNrLmJnR3JlZW4oY2VudGVyVGV4dChtc2cpKSk7XG4gIH1cblxuICAvKlxuICAgICBBIGZ1bmN0aW9uIHRoYXQgYXV0b21hdGljYWxseSBoYW5kbGVzIGluaXQgYW5kIGRlc3Ryb3kgd2hlbiB1c2luZyBTb25hbXUgdmlhIHNjcmlwdHMuXG4gICovXG4gIGFzeW5jIHJ1blNjcmlwdChmbjogKCkgPT4gUHJvbWlzZTx2b2lkPikge1xuICAgIGF3YWl0IHRoaXMuaW5pdCh0cnVlLCBmYWxzZSwgdW5kZWZpbmVkLCBmYWxzZSk7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IGZuKCk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGF3YWl0IHRoaXMuZGVzdHJveSgpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgcmVnaXN0ZXJQbHVnaW5zKHNlcnZlcjogRmFzdGlmeUluc3RhbmNlLCBwbHVnaW5zOiBTb25hbXVTZXJ2ZXJPcHRpb25zW1wicGx1Z2luc1wiXSkge1xuICAgIGlmICghcGx1Z2lucykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIGNvbXByZXNzIO2UjOufrOq3uOyduOydgCDri6Trpbgg7ZSM65+s6re47J2467O064ukIOuovOyggCDrk7HroZ3rkJjslrTslbwg7ZWp64uI64ukLlxuICAgIGlmIChwbHVnaW5zLmNvbXByZXNzKSB7XG4gICAgICBjb25zdCBjb21wcmVzc1BsdWdpbiA9IChhd2FpdCBpbXBvcnQoXCJAZmFzdGlmeS9jb21wcmVzc1wiKSkuZGVmYXVsdDtcbiAgICAgIGNvbnN0IGRlZmF1bHRPcHRpb25zID0ge1xuICAgICAgICB0aHJlc2hvbGQ6IDEwMjQsXG4gICAgICAgIGVuY29kaW5nczogLyogU0FGRVRZOiBBUEkg642w7L2U66CI7J207YSw7JmAIFpvZCDqsoDspp3quLAg65Ox66GdIOqzhOyVveydtCDsnbQg6rCS7J2YIO2DgOyeheydhCDrs7TsnqXtlZzri6QuICovIFtcbiAgICAgICAgICBcImJyXCIsXG4gICAgICAgICAgXCJnemlwXCIsXG4gICAgICAgICAgXCJkZWZsYXRlXCIsXG4gICAgICAgIF0gYXMgKFwiYnJcIiB8IFwiZ3ppcFwiIHwgXCJkZWZsYXRlXCIpW10sXG4gICAgICB9O1xuXG4gICAgICBpZiAocGx1Z2lucy5jb21wcmVzcyA9PT0gdHJ1ZSkge1xuICAgICAgICBzZXJ2ZXIucmVnaXN0ZXIoY29tcHJlc3NQbHVnaW4sIGRlZmF1bHRPcHRpb25zKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHNlcnZlci5yZWdpc3Rlcihjb21wcmVzc1BsdWdpbiwge1xuICAgICAgICAgIC4uLmRlZmF1bHRPcHRpb25zLFxuICAgICAgICAgIC4uLnBsdWdpbnMuY29tcHJlc3MsXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IHBsdWdpbnNNb2R1bGVzID0ge1xuICAgICAgY29yczogXCJAZmFzdGlmeS9jb3JzXCIsXG4gICAgICBmb3JtYm9keTogXCJAZmFzdGlmeS9mb3JtYm9keVwiLFxuICAgICAgbXVsdGlwYXJ0OiBcIkBmYXN0aWZ5L211bHRpcGFydFwiLFxuICAgICAgcXM6IFwiZmFzdGlmeS1xc1wiLFxuICAgICAgc3NlOiBcImZhc3RpZnktc3NlLXYyXCIsXG4gICAgICBzdGF0aWM6IFwiQGZhc3RpZnkvc3RhdGljXCIsXG4gICAgfSBhcyBjb25zdDtcblxuICAgIGNvbnN0IHJlZ2lzdGVyUGx1Z2luID0gYXN5bmMgPEsgZXh0ZW5kcyBrZXlvZiBOb25OdWxsYWJsZTx0eXBlb2YgcGx1Z2lucz4+KFxuICAgICAga2V5OiBLLFxuICAgICAgcGx1Z2luTmFtZTogc3RyaW5nLFxuICAgICkgPT4ge1xuICAgICAgY29uc3Qgb3B0aW9uID0gcGx1Z2luc1trZXldO1xuICAgICAgaWYgKCFvcHRpb24pIHJldHVybjtcblxuICAgICAgaWYgKG9wdGlvbiA9PT0gdHJ1ZSkge1xuICAgICAgICBzZXJ2ZXIucmVnaXN0ZXIoKGF3YWl0IGltcG9ydChwbHVnaW5OYW1lKSkuZGVmYXVsdCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzZXJ2ZXIucmVnaXN0ZXIoKGF3YWl0IGltcG9ydChwbHVnaW5OYW1lKSkuZGVmYXVsdCwgb3B0aW9uKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgZm9yIChjb25zdCBba2V5LCBwbHVnaW5OYW1lXSBvZiBPYmplY3QuZW50cmllcyhwbHVnaW5zTW9kdWxlcykpIHtcbiAgICAgIGF3YWl0IHJlZ2lzdGVyUGx1Z2luKFxuICAgICAgICAvKiBTQUZFVFk6IEFQSSDrjbDsvZTroIjsnbTthLDsmYAgWm9kIOqygOymneq4sCDrk7HroZ0g6rOE7JW97J20IOydtCDqsJLsnZgg7YOA7J6F7J2EIOuztOyepe2VnOuLpC4gKi8ga2V5IGFzIGtleW9mIHR5cGVvZiBwbHVnaW5zLFxuICAgICAgICBwbHVnaW5OYW1lLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAocGx1Z2lucy53cykge1xuICAgICAgYXdhaXQgdGhpcy5lbnN1cmVXZWJTb2NrZXRQbHVnaW4oc2VydmVyKTtcbiAgICB9XG5cbiAgICBpZiAocGx1Z2lucy5jdXN0b20pIHtcbiAgICAgIHBsdWdpbnMuY3VzdG9tKHNlcnZlcik7XG4gICAgfVxuICB9XG5cbiAgLy8gQGZhc3RpZnkvd2Vic29ja2V07J2AIHBsdWdpbnMud3PqsIAg7ISk7KCV65CcIOqyveyasOyXkOunjCDrk7HroZ3tlZjqs6AsIOqwmeydgCBzZXJ2ZXLsl5Ag7KSR67O1IOuTseuhneuQmOyngCDslYrrj4TroZ0gV2Vha1NldOycvOuhnCDquLDroZ3tlahcbiAgcHJpdmF0ZSBhc3luYyBlbnN1cmVXZWJTb2NrZXRQbHVnaW4oXG4gICAgc2VydmVyOiBGYXN0aWZ5SW5zdGFuY2U8U2VydmVyLCBJbmNvbWluZ01lc3NhZ2UsIFNlcnZlclJlc3BvbnNlPixcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKHRoaXMud2Vic29ja2V0UGx1Z2luU2VydmVycy5oYXMoc2VydmVyKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHBsdWdpbk9wdGlvbiA9IHRoaXMuY29uZmlnLnNlcnZlci5wbHVnaW5zPy53cztcbiAgICBpZiAoIXBsdWdpbk9wdGlvbikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHdlYnNvY2tldFBsdWdpbiA9IChhd2FpdCBpbXBvcnQoXCJAZmFzdGlmeS93ZWJzb2NrZXRcIikpLmRlZmF1bHQ7XG4gICAgY29uc3QgcmVzb2x2ZWRQbHVnaW5PcHRpb25zID0gcmVzb2x2ZVdlYlNvY2tldFBsdWdpbk9wdGlvbnMoe1xuICAgICAgcmF3UGx1Z2luT3B0aW9uOiBwbHVnaW5PcHRpb24sXG4gICAgfSk7XG4gICAgaWYgKHJlc29sdmVkUGx1Z2luT3B0aW9ucykge1xuICAgICAgYXdhaXQgc2VydmVyLnJlZ2lzdGVyKHdlYnNvY2tldFBsdWdpbiwgcmVzb2x2ZWRQbHVnaW5PcHRpb25zKTtcbiAgICB9IGVsc2Uge1xuICAgICAgYXdhaXQgc2VydmVyLnJlZ2lzdGVyKHdlYnNvY2tldFBsdWdpbik7XG4gICAgfVxuXG4gICAgdGhpcy53ZWJzb2NrZXRQbHVnaW5TZXJ2ZXJzLmFkZChzZXJ2ZXIpO1xuICAgIHRoaXMud2Fybk9uUG90ZW50aWFsV2ViU29ja2V0VGltZW91dENvbmZsaWN0cyhzZXJ2ZXIpO1xuICB9XG5cbiAgLy8gaGVhcnRiZWF0IGludGVydmFs7J20IEZhc3RpZnkga2VlcEFsaXZlVGltZW91dCDsnbTsg4HsnbTrqbQg7J247ZSE65286rCAIOuovOyggCBpZGxlIOyXsOqysOydhCDrgYrsnYQg7IiYIOyeiOyWtCDqsr3qs6Drp4wg64Ko6riw6rOgIOuEmOyWtOqwkFxuICBwcml2YXRlIHdhcm5PblBvdGVudGlhbFdlYlNvY2tldFRpbWVvdXRDb25mbGljdHMoXG4gICAgc2VydmVyOiBGYXN0aWZ5SW5zdGFuY2U8U2VydmVyLCBJbmNvbWluZ01lc3NhZ2UsIFNlcnZlclJlc3BvbnNlPixcbiAgKTogdm9pZCB7XG4gICAgY29uc3QgaGVhcnRiZWF0cyA9IHRoaXMuc3luY2VyLmFwaXNcbiAgICAgIC5tYXAoKGFwaSkgPT4gYXBpLndlYnNvY2tldE9wdGlvbnM/LmhlYXJ0YmVhdCA/PyAzMDAwMClcbiAgICAgIC5maWx0ZXIoKGhlYXJ0YmVhdCkgPT4gaGVhcnRiZWF0ID4gMCk7XG5cbiAgICBpZiAoaGVhcnRiZWF0cy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBrZWVwQWxpdmVUaW1lb3V0ID0gdGhpcy5jb25maWcuc2VydmVyLmZhc3RpZnk/LmtlZXBBbGl2ZVRpbWVvdXQ7XG4gICAgaWYgKCFrZWVwQWxpdmVUaW1lb3V0IHx8IGtlZXBBbGl2ZVRpbWVvdXQgPD0gMCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGxhcmdlc3RIZWFydGJlYXQgPSBNYXRoLm1heCguLi5oZWFydGJlYXRzKTtcbiAgICBpZiAobGFyZ2VzdEhlYXJ0YmVhdCA+PSBrZWVwQWxpdmVUaW1lb3V0KSB7XG4gICAgICBzZXJ2ZXIubG9nLndhcm4oXG4gICAgICAgIHtcbiAgICAgICAgICBrZWVwQWxpdmVUaW1lb3V0LFxuICAgICAgICAgIGxhcmdlc3RIZWFydGJlYXQsXG4gICAgICAgIH0sXG4gICAgICAgIFwiV2ViU29ja2V0IGhlYXJ0YmVhdCBpcyBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8ga2VlcEFsaXZlVGltZW91dDsgYWxpZ24gaW5mcmFzdHJ1Y3R1cmUgaWRsZSB0aW1lb3V0cyB0byBhdm9pZCB1bmV4cGVjdGVkIGRpc2Nvbm5lY3RzLlwiLFxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogYmV0dGVyLWF1dGgg65287Jqw7Yq466W8IOuTseuhne2VqeuLiOuLpC5cbiAgICogL2FwaS9hdXRoLyog6rK966Gc66GcIOyduOymnSBBUEnqsIAg7J6Q64+ZIOuTseuhneuQqeuLiOuLpC5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgcmVnaXN0ZXJCZXR0ZXJBdXRoKFxuICAgIHNlcnZlcjogRmFzdGlmeUluc3RhbmNlLFxuICAgIG9wdGlvbnM6IE5vbk51bGxhYmxlPFNvbmFtdVNlcnZlck9wdGlvbnNbXCJhdXRoXCJdPixcbiAgKSB7XG4gICAgaWYgKCFvcHRpb25zKSByZXR1cm47XG5cbiAgICBjb25zdCBiYXNlUGF0aCA9IG9wdGlvbnMuYmFzZVBhdGggPz8gXCIvYXBpL2F1dGhcIjtcblxuICAgIC8vIGJldHRlci1hdXRoIOudvOyasO2KuCDrk7HroZ1cbiAgICBzZXJ2ZXIucm91dGUoe1xuICAgICAgbWV0aG9kOiBbXCJHRVRcIiwgXCJQT1NUXCJdLFxuICAgICAgdXJsOiBgJHtiYXNlUGF0aH0vKmAsXG4gICAgICBoYW5kbGVyOiBhc3luYyAocmVxdWVzdCwgcmVwbHkpID0+IHtcbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLmF1dGguaGFuZGxlcihcbiAgICAgICAgICBjcmVhdGVCZXR0ZXJBdXRoUmVxdWVzdChyZXF1ZXN0LCBvcHRpb25zLmFkdmFuY2VkPy5pcEFkZHJlc3M/LmlwQWRkcmVzc0hlYWRlcnMpLFxuICAgICAgICApO1xuXG4gICAgICAgIHJlcGx5LnN0YXR1cyhyZXNwb25zZS5zdGF0dXMpO1xuICAgICAgICByZXNwb25zZS5oZWFkZXJzLmZvckVhY2goKHZhbHVlOiBzdHJpbmcsIGtleTogc3RyaW5nKSA9PiB7XG4gICAgICAgICAgcmVwbHkuaGVhZGVyKGtleSwgdmFsdWUpO1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHJlcGx5LnNlbmQocmVzcG9uc2UuYm9keSA/IGF3YWl0IHJlc3BvbnNlLnRleHQoKSA6IG51bGwpO1xuICAgICAgfSxcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgcHJpbnRTdGFydHVwU3VtbWFyeSgpIHtcbiAgICBjb25zdCBhY3RpdmVQcmVzZXQgPSBnZXRTb25hbXVFbnZpcm9ubWVudCgpO1xuXG4gICAgcHJpbnREaW1TdW1tYXJ5KGBDb25maWcgbG9hZGVkJHtmb3JtYXRUaW1lKHRoaXMuY29uZmlnRWxhcHNlZCl9YCk7XG5cbiAgICAvLyBEQiBwcmVzZXQg66qp66GdXG4gICAgcHJpbnRHcmVlblN1bW1hcnkoXCJEQlwiKTtcbiAgICBjb25zdCB7IGlzTG9jYWwgfSA9IGF3YWl0IGltcG9ydChcIi4uL3V0aWxzL2NvbnRyb2xsZXJcIik7XG4gICAgY29uc3QgcHJlc2V0TmFtZXMgPVxuICAgICAgLyogU0FGRVRZOiBBUEkg642w7L2U66CI7J207YSw7JmAIFpvZCDqsoDspp3quLAg65Ox66GdIOqzhOyVveydtCDsnbQg6rCS7J2YIO2DgOyeheydhCDrs7TsnqXtlZzri6QuICovIE9iamVjdC5rZXlzKFxuICAgICAgICB0aGlzLmRiQ29uZmlnLFxuICAgICAgKSBhcyAoa2V5b2YgU29uYW11REJDb25maWcpW107XG4gICAgY29uc3QgbWF4TGVuID0gTWF0aC5tYXgoLi4ucHJlc2V0TmFtZXMubWFwKChuKSA9PiBuLmxlbmd0aCkpO1xuICAgIGZvciAoY29uc3QgbmFtZSBvZiBwcmVzZXROYW1lcykge1xuICAgICAgY29uc3QgY29ubiA9XG4gICAgICAgIC8qIFNBRkVUWTogQVBJIOuNsOy9lOugiOydtO2EsOyZgCBab2Qg6rKA7Kad6riwIOuTseuhnSDqs4Tslb3snbQg7J20IOqwkuydmCDtg4DsnoXsnYQg67O07J6l7ZWc64ukLiAqLyB0aGlzXG4gICAgICAgICAgLmRiQ29uZmlnW25hbWVdLmNvbm5lY3Rpb24gYXNcbiAgICAgICAgICB8IHsgaG9zdD86IHN0cmluZzsgcG9ydD86IG51bWJlcjsgZGF0YWJhc2U/OiBzdHJpbmcgfVxuICAgICAgICAgIHwgdW5kZWZpbmVkO1xuICAgICAgY29uc3QgaG9zdCA9IGNvbm4/Lmhvc3QgPz8gXCJsb2NhbGhvc3RcIjtcbiAgICAgIGNvbnN0IGFkZHIgPSBgQCAke2hvc3R9OiR7Y29ubj8ucG9ydCA/PyA1NDMyfS8ke2Nvbm4/LmRhdGFiYXNlID8/IFwiKHVua25vd24pXCJ9YDtcbiAgICAgIGNvbnN0IHBhZGRlZCA9IG5hbWUucGFkRW5kKG1heExlbik7XG4gICAgICBjb25zdCByZW1vdGVUYWcgPSBpc0xvY2FsKCkgJiYgIWlzTG9jYWxIb3N0KGhvc3QpID8gY2hhbGsueWVsbG93KGAgXFx1MjZhMCByZW1vdGVgKSA6IFwiXCI7XG5cbiAgICAgIGlmIChuYW1lID09PSBhY3RpdmVQcmVzZXQpIHtcbiAgICAgICAgY29uc29sZS5sb2coY2hhbGsuZ3JlZW4oYCAgXFx1MjViOCAke3BhZGRlZH0gJHthZGRyfWApICsgcmVtb3RlVGFnKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnNvbGUubG9nKGNoYWxrLmRpbShgICAgICR7cGFkZGVkfSAke2FkZHJ9YCkgKyByZW1vdGVUYWcpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh0aGlzLmNvbmZpZy5zZXJ2ZXIuYXV0aCkge1xuICAgICAgY29uc3QgYmFzZVBhdGggPSB0aGlzLmNvbmZpZy5zZXJ2ZXIuYXV0aC5iYXNlUGF0aCA/PyBcIi9hcGkvYXV0aFwiO1xuICAgICAgcHJpbnREaW1TdW1tYXJ5KGBBdXRoOiBiZXR0ZXItYXV0aCBhdCAke2Jhc2VQYXRofS8qYCk7XG4gICAgfVxuICAgIGlmICh0aGlzLmNvbmZpZy5hcGkudGltZXpvbmUpIHtcbiAgICAgIHByaW50RGltU3VtbWFyeShgVGltZXpvbmU6ICR7dGhpcy5jb25maWcuYXBpLnRpbWV6b25lfWApO1xuICAgIH1cbiAgICBwcmludEdyZWVuU3VtbWFyeShgU29uYW11IHJlYWR5JHtmb3JtYXRUaW1lKHRoaXMuaW5pdEVsYXBzZWQpfWApO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBpbml0aWFsaXplQ2FjaGUoY29uZmlnOiBDYWNoZUNvbmZpZyB8IHVuZGVmaW5lZCwgZm9yVGVzdGluZzogYm9vbGVhbikge1xuICAgIGNvbnN0IHsgc2V0Q2FjaGVNYW5hZ2VyUmVmIH0gPSBhd2FpdCBpbXBvcnQoXCIuLi9jYWNoZS9kZWNvcmF0b3JcIik7XG5cbiAgICAvLyDthYzsiqTtirgg7ZmY6rK97JeQ7IScIOuplOuqqOumrCDrk5zrnbzsnbTrsoQg7J6Q64+ZIOyCrOyaqVxuICAgIGlmIChmb3JUZXN0aW5nKSB7XG4gICAgICBjb25zdCB7IGNyZWF0ZVRlc3RDYWNoZU1hbmFnZXIgfSA9IGF3YWl0IGltcG9ydChcIi4uL2NhY2hlL2NhY2hlLW1hbmFnZXJcIik7XG4gICAgICB0aGlzLmNhY2hlVmFsdWUgPSBjcmVhdGVUZXN0Q2FjaGVNYW5hZ2VyKCk7XG4gICAgICBzZXRDYWNoZU1hbmFnZXJSZWYodGhpcy5jYWNoZVZhbHVlKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyDshKTsoJXsnbQg7JeG7Jy866m0IOy6kOyLnCDruYTtmZzshLHtmZRcbiAgICBpZiAoIWNvbmZpZykge1xuICAgICAgc2V0Q2FjaGVNYW5hZ2VyUmVmKG51bGwpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIOyEpOygleyXkCDrlLDrnbwgQ2FjaGVNYW5hZ2VyIOyDneyEsVxuICAgIGNvbnN0IHsgY3JlYXRlQ2FjaGVNYW5hZ2VyIH0gPSBhd2FpdCBpbXBvcnQoXCIuLi9jYWNoZS9jYWNoZS1tYW5hZ2VyXCIpO1xuICAgIHRoaXMuY2FjaGVWYWx1ZSA9IGNyZWF0ZUNhY2hlTWFuYWdlcihjb25maWcpO1xuICAgIHNldENhY2hlTWFuYWdlclJlZih0aGlzLmNhY2hlVmFsdWUpO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBpbml0aWFsaXplV29ya2Zsb3dzKG9wdGlvbnM6IFNvbmFtdVRhc2tPcHRpb25zIHwgdW5kZWZpbmVkKSB7XG4gICAgY29uc3QgeyBXb3JrZmxvd01hbmFnZXIgfSA9IGF3YWl0IGltcG9ydChcIi4uL3Rhc2tzL3dvcmtmbG93LW1hbmFnZXJcIik7XG4gICAgLy8gTk9URTogQHNvbmFtdS1raXQvdGFza3Mg7JWI7JeQ7ISgIGtuZXggY29uZmln66W8IOyImOygle2VmOq4sCDrlYzrrLjsl5AgY29ubmVjdGlvbuydtCDslYTri4wgY29uZmlnIOynuOuhnCDrs7Trg4Xri4jri6QuXG4gICAgdGhpcy53b3JrZmxvd3NWYWx1ZSA9IG5ldyBXb3JrZmxvd01hbmFnZXIoREIuZ2V0REJDb25maWcoXCJ3XCIpKTtcbiAgICBpZiAoIW9wdGlvbnMpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBlbmFibGVXb3JrZXIgPSBvcHRpb25zLmVuYWJsZVdvcmtlciA/PyBpc0RhZW1vblNlcnZlcigpO1xuICAgIGNvbnN0IGRlZmF1bHRXb3JrZXJPcHRpb25zID0ge1xuICAgICAgY29uY3VycmVuY3k6IG9zLmNwdXMoKS5sZW5ndGggLSAxLFxuICAgICAgdXNlUHViU3ViOiB0cnVlLFxuICAgICAgbGlzdGVuRGVsYXk6IDUwMCxcbiAgICB9O1xuXG4gICAgaWYgKGVuYWJsZVdvcmtlcikge1xuICAgICAgdGhpcy53b3JrZmxvd3Muc2V0dXBXb3JrZXIoe1xuICAgICAgICAuLi5kZWZhdWx0V29ya2VyT3B0aW9ucyxcbiAgICAgICAgLi4ub3B0aW9ucy53b3JrZXJPcHRpb25zLFxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBib290KHNlcnZlcjogRmFzdGlmeUluc3RhbmNlLCBvcHRpb25zOiBTb25hbXVTZXJ2ZXJPcHRpb25zKSB7XG4gICAgY29uc3QgcG9ydCA9IG9wdGlvbnMubGlzdGVuPy5wb3J0ID8/IDMwMDA7XG4gICAgY29uc3QgaG9zdCA9IG9wdGlvbnMubGlzdGVuPy5ob3N0ID8/IFwibG9jYWxob3N0XCI7XG5cbiAgICBzZXJ2ZXIuYWRkSG9vayhcIm9uQ2xvc2VcIiwgYXN5bmMgKCkgPT4ge1xuICAgICAgYXdhaXQgb3B0aW9ucy5saWZlY3ljbGU/Lm9uU2h1dGRvd24/LihzZXJ2ZXIpO1xuICAgICAgYXdhaXQgdGhpcy53b3JrZmxvd3MuZGVzdHJveSgpO1xuICAgICAgYXdhaXQgdGhpcy5kZXN0cm95KCk7XG4gICAgfSk7XG5cbiAgICBjb25zdCBzaHV0ZG93biA9IGFzeW5jICgpID0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IHNlcnZlci5jbG9zZSgpO1xuICAgICAgICBwcm9jZXNzLmV4aXQoMCk7XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihcIkVycm9yIGR1cmluZyBzaHV0ZG93bjpcIiwgZXJyKTtcbiAgICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBwcm9jZXNzLm9uKFwiU0lHSU5UXCIsIHNodXRkb3duKTtcbiAgICBwcm9jZXNzLm9uKFwiU0lHVEVSTVwiLCBzaHV0ZG93bik7XG5cbiAgICBpZiAob3B0aW9ucy5saWZlY3ljbGU/Lm9uRXJyb3IpIHtcbiAgICAgIHNlcnZlci5zZXRFcnJvckhhbmRsZXIob3B0aW9ucy5saWZlY3ljbGU/Lm9uRXJyb3IpO1xuICAgIH1cblxuICAgIHNlcnZlclxuICAgICAgLmxpc3Rlbih7IHBvcnQsIGhvc3QgfSlcbiAgICAgIC50aGVuKGFzeW5jICgpID0+IHtcbiAgICAgICAgYXdhaXQgdGhpcy53b3JrZmxvd3Muc3RhcnRXb3JrZXIoKTtcbiAgICAgICAgYXdhaXQgb3B0aW9ucy5saWZlY3ljbGU/Lm9uU3RhcnQ/LihzZXJ2ZXIpO1xuICAgICAgfSlcbiAgICAgIC5jYXRjaChhc3luYyAoZXJyKSA9PiB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKFwiRmFpbGVkIHRvIHN0YXJ0IHNlcnZlcjpcIiwgZXJyKSk7XG4gICAgICAgIGF3YWl0IHNodXRkb3duKCk7XG4gICAgICB9KTtcbiAgfVxuXG4gIGFzeW5jIGRlc3Ryb3koKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgeyBoYXNFeHRlcm5hbExvZ1RhcGVDb25maWd1cmF0aW9uIH0gPSBhd2FpdCBpbXBvcnQoXCIuLi9sb2dnZXIvY29uZmlndXJlXCIpO1xuICAgIGNvbnN0IHsgQmFzZU1vZGVsIH0gPSBhd2FpdCBpbXBvcnQoXCIuLi9kYXRhYmFzZS9iYXNlLW1vZGVsXCIpO1xuICAgIC8vIOuovOyggCDsspjrpqztlbTslbztlaguXG4gICAgYXdhaXQgQmFzZU1vZGVsLmRlc3Ryb3koKTtcbiAgICAvLyBXZWJTb2NrZXQgc2h1dGRvd24gZmlyc3QgdG8gZmx1c2ggdGVsZW1ldHJ5XG4gICAgaWYgKHRoaXMud2Vic29ja2V0UnVudGltZVZhbHVlKSB7XG4gICAgICBhd2FpdCB0aGlzLndlYnNvY2tldFJ1bnRpbWVWYWx1ZS5zaHV0ZG93bigpO1xuICAgIH1cbiAgICB0aGlzLndlYnNvY2tldFJ1bnRpbWVWYWx1ZSA9IG51bGw7XG4gICAgLy8gVGhlbiBzaHV0IGRvd24gcmVtYWluaW5nIHJlc291cmNlcyBpbiBwYXJhbGxlbFxuICAgIGF3YWl0IFByb21pc2UuYWxsU2V0dGxlZChbXG4gICAgICB0aGlzLndvcmtmbG93c1ZhbHVlPy5kZXN0cm95KCkgPz8gUHJvbWlzZS5yZXNvbHZlKCksXG4gICAgICB0aGlzLmNhY2hlVmFsdWU/LmRpc2Nvbm5lY3QoKSA/PyBQcm9taXNlLnJlc29sdmUoKSxcbiAgICAgIHRoaXMuZGV2Vml0ZXN0TWFuYWdlclZhbHVlPy5zaHV0ZG93bigpID8/IFByb21pc2UucmVzb2x2ZSgpLFxuICAgICAgdGhpcy53YXRjaGVyPy5jbG9zZSgpID8/IFByb21pc2UucmVzb2x2ZSgpLFxuICAgIF0pO1xuICAgIC8vIExvZ1RhcGUgZGlzcG9zZSBhZnRlciBXUyBzaHV0ZG93biBzbyB0ZWxlbWV0cnkgcmVjb3JkcyBhcmUgZmx1c2hlZCBmaXJzdFxuICAgIGlmICghaGFzRXh0ZXJuYWxMb2dUYXBlQ29uZmlndXJhdGlvbigpKSBhd2FpdCBsb2d0YXBlRGlzcG9zZSgpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGdldFdlYlNvY2tldFRlbGVtZXRyeUNvbnRleHQoXG4gIHdzOiBBbnlXZWJTb2NrZXRDb25uZWN0aW9uLFxuKTogV2ViU29ja2V0VGVsZW1ldHJ5Q29ubmVjdGlvbkNvbnRleHQge1xuICBpZiAoIWlzVGVsZW1ldHJ5Q29udGV4dFByb3ZpZGVyKHdzKSkge1xuICAgIHJldHVybiB7fTtcbiAgfVxuXG4gIHJldHVybiB3cy5nZXRUZWxlbWV0cnlDb250ZXh0KCk7XG59XG5cbmZ1bmN0aW9uIGlzVGVsZW1ldHJ5Q29udGV4dFByb3ZpZGVyKFxuICB3czogQW55V2ViU29ja2V0Q29ubmVjdGlvbixcbik6IHdzIGlzIEFueVdlYlNvY2tldENvbm5lY3Rpb24gJiBUZWxlbWV0cnlDb250ZXh0UHJvdmlkZXIge1xuICByZXR1cm4gXCJnZXRUZWxlbWV0cnlDb250ZXh0XCIgaW4gd3MgJiYgaXNGdW5jdGlvblZhbHVlKHdzLmdldFRlbGVtZXRyeUNvbnRleHQpO1xufVxuXG5leHBvcnQgY29uc3QgU29uYW11ID0gbmV3IFNvbmFtdUNsYXNzKCk7XG5cbi8qKlxuICogc3RyZWFtIOuqqOuTnOyXkOyEnCDtgqQg7IOd7ISxIO2VqOyImOqwgCDsp4DsoJXrkJjsp4Ag7JWK7JWY7J2EIOuVjCDsgqzsmqntlZjripQg6riw67O4IO2VqOyImOyeheuLiOuLpC5cbiAqL1xuZnVuY3Rpb24gZGVmYXVsdEtleUdlbmVyYXRvcihmaWxlOiB7IGZpbGVuYW1lOiBzdHJpbmc7IG1pbWV0eXBlOiBzdHJpbmcgfSk6IHN0cmluZyB7XG4gIGNvbnN0IGV4dCA9IG1pbWUuZXh0ZW5zaW9uKGZpbGUubWltZXR5cGUpIHx8IFwiYmluXCI7XG4gIGNvbnN0IHRpbWVzdGFtcCA9IERhdGUubm93KCk7XG4gIGNvbnN0IHJhbmRvbSA9IE1hdGgucmFuZG9tKCkudG9TdHJpbmcoMzYpLnNsaWNlKDIsIDgpO1xuICByZXR1cm4gYHVwbG9hZHMvJHt0aW1lc3RhbXB9LSR7cmFuZG9tfS4ke2V4dH1gO1xufVxuXG5mdW5jdGlvbiBmb3JtYXRUaW1lKG1zOiBudW1iZXIpOiBzdHJpbmcge1xuICBjb25zdCBmb3JtYXR0ZWQgPSBtcyA+PSAxMDAwID8gYCR7KG1zIC8gMTAwMCkudG9GaXhlZCgyKX1zYCA6IGAke01hdGgucm91bmQobXMpfW1zYDtcbiAgcmV0dXJuIGAgKCR7Zm9ybWF0dGVkfSlgO1xufVxuXG5jb25zdCBMT0NBTF9IT1NUUyA9IG5ldyBTZXQoW1wibG9jYWxob3N0XCIsIFwiMTI3LjAuMC4xXCIsIFwiMC4wLjAuMFwiLCBcIjo6MVwiXSk7XG5mdW5jdGlvbiBpc0xvY2FsSG9zdChob3N0OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIExPQ0FMX0hPU1RTLmhhcyhob3N0KSB8fCBob3N0LmVuZHNXaXRoKFwiLmxvY2FsXCIpO1xufVxuXG4vLyBgLmV2ZXJ5KClg6rCAIOyyqyBndWFyZCDsnbTtm4Qg7Iic7ZqM66W8IOupiOy2lOuKlCDrrLjsoJzqsIAg7J6I7Ja0IGBmb3IuLi5vZmDroZwg66qo65OgIGd1YXJk66W8IOyInOyEnOuMgOuhnCDsi6TtlontlZjrj4TroZ0g6rOg7KCV7ZWoXG5mdW5jdGlvbiBydW5HdWFyZHMoe1xuICBndWFyZHMsXG4gIGNvbmZpZyxcbiAgcmVxdWVzdCxcbiAgYXBpLFxufToge1xuICBndWFyZHM6IEV4dGVuZGVkQXBpW1wib3B0aW9uc1wiXVtcImd1YXJkc1wiXSB8IHVuZGVmaW5lZDtcbiAgY29uZmlnOiBQaWNrPFNvbmFtdUZhc3RpZnlDb25maWcsIFwiZ3VhcmRIYW5kbGVyXCI+O1xuICByZXF1ZXN0OiBGYXN0aWZ5UmVxdWVzdDtcbiAgYXBpOiBFeHRlbmRlZEFwaTtcbn0pOiB2b2lkIHtcbiAgZm9yIChjb25zdCBndWFyZCBvZiBndWFyZHMgPz8gW10pIHtcbiAgICBjb25maWcuZ3VhcmRIYW5kbGVyKGd1YXJkLCByZXF1ZXN0LCBhcGkpO1xuICB9XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBNkdBLFNBQVMsY0FBcUIsT0FBMkI7Q0FDdkQsSUFBSSxVQUFVLE1BQU0sT0FBTztDQUMzQixJQUFJLFVBQVUsUUFBVyxPQUFPO0NBQ2hDLElBQUksVUFBVSxNQUFNLE9BQU87Q0FDM0IsSUFBSSxVQUFVLE9BQU8sT0FBTztDQUM1QixJQUFJLGNBQWMsS0FBSyxHQUFHLE9BQU87Q0FDakMsSUFBSSxjQUFj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