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
@@ -461,7 +461,12 @@ var init_entity = __esmMin((() => {
461
461
  return prop;
462
462
  });
463
463
  }
464
- async registerModulePaths() {
464
+ /**
465
+ * Entity가 노출하는 타입 이름과 모듈 경로를 EntityManager에 등록합니다.
466
+ *
467
+ * @param explicitApiRootPath - Sonamu 초기화 없이 등록할 때 사용할 API 루트 경로
468
+ */
469
+ async registerModulePaths(explicitApiRootPath) {
465
470
  const basePath = `${this.names.parentFs}`;
466
471
  EntityManager.setModulePath(`${this.id}BaseSchema`, `sonamu.generated`);
467
472
  if (Object.keys(this.subsets).length > 0) {
@@ -471,7 +476,7 @@ var init_entity = __esmMin((() => {
471
476
  }
472
477
  for (const enumId of Object.keys(this.enumLabels)) EntityManager.setModulePath(enumId, `sonamu.generated`);
473
478
  const typesModulePath = `${basePath}/${this.names.parentFs}.types`;
474
- const typesFilePath = path.join(Sonamu.apiRootPath, runtimePath(`dist/application/${typesModulePath}.js`));
479
+ const typesFilePath = path.join(explicitApiRootPath ?? Sonamu.apiRootPath, runtimePath(`dist/application/${typesModulePath}.js`));
475
480
  if (await exists(typesFilePath)) {
476
481
  const importedMembers = await importMembers(typesFilePath);
477
482
  this.types = Object.fromEntries(importedMembers.map(({ name, value }) => {
@@ -800,4 +805,4 @@ var init_entity = __esmMin((() => {
800
805
  init_entity();
801
806
  export { Entity, init_entity };
802
807
 
803
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW50aXR5LmpzIiwibmFtZXMiOltdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9lbnRpdHkvZW50aXR5LnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBhc3NlcnQgZnJvbSBcImFzc2VydFwiO1xuaW1wb3J0IHsgd3JpdGVGaWxlIH0gZnJvbSBcImZzL3Byb21pc2VzXCI7XG5pbXBvcnQgcGF0aCBmcm9tIFwicGF0aFwiO1xuXG5pbXBvcnQgaW5mbGVjdGlvbiBmcm9tIFwiaW5mbGVjdGlvblwiO1xuaW1wb3J0IHsgZ3JvdXAsIHVuaXF1ZSB9IGZyb20gXCJyYWRhc2hpXCI7XG5pbXBvcnQgeyB6IH0gZnJvbSBcInpvZFwiO1xuXG5pbXBvcnQgeyBTb25hbXUgfSBmcm9tIFwiLi4vYXBpL3NvbmFtdVwiO1xuaW1wb3J0IHtcbiAgZ2V0RW51bURlZlZhbHVlcyxcbiAgZ2V0U3Vic2V0RmllbGRzLFxuICBpc0JlbG9uZ3NUb09uZVJlbGF0aW9uUHJvcCxcbiAgaXNFbnVtUHJvcCxcbiAgaXNIYXNNYW55UmVsYXRpb25Qcm9wLFxuICBpc0ludGVybmFsU3Vic2V0RmllbGQsXG4gIGlzTWFueVRvTWFueVJlbGF0aW9uUHJvcCxcbiAgaXNPbmVUb09uZVJlbGF0aW9uUHJvcCxcbiAgaXNSZWxhdGlvblByb3AsXG4gIGlzVmlydHVhbENvZGVQcm9wLFxuICBpc1ZpcnR1YWxQcm9wLFxuICBub3JtYWxpemVTdWJzZXRGaWVsZCxcbn0gZnJvbSBcIi4uL3R5cGVzL3R5cGVzXCI7XG5pbXBvcnQge1xuICB0eXBlIENvbmUsXG4gIHR5cGUgRW50aXR5SW5kZXgsXG4gIHR5cGUgRW50aXR5SnNvbixcbiAgdHlwZSBFbnRpdHlQcm9wLFxuICB0eXBlIEVudGl0eVByb3BOb2RlLFxuICB0eXBlIEVudGl0eVN1YnNldFJvdyxcbiAgdHlwZSBSZWxhdGlvblByb3AsXG4gIHR5cGUgU3Vic2V0RmllbGQsXG4gIHR5cGUgU3Vic2V0UXVlcnksXG59IGZyb20gXCIuLi90eXBlcy90eXBlc1wiO1xuaW1wb3J0IHsgaW1wb3J0TWVtYmVycyB9IGZyb20gXCIuLi91dGlscy9lc20tdXRpbHNcIjtcbmltcG9ydCB7IGZvcm1hdENvZGUgfSBmcm9tIFwiLi4vdXRpbHMvZm9ybWF0dGVyXCI7XG5pbXBvcnQgeyBleGlzdHMgfSBmcm9tIFwiLi4vdXRpbHMvZnMtdXRpbHNcIjtcbmltcG9ydCB7IHJ1bnRpbWVQYXRoIH0gZnJvbSBcIi4uL3V0aWxzL3BhdGgtdXRpbHNcIjtcbmltcG9ydCB7IGlzU3RyaW5nVmFsdWUgfSBmcm9tIFwiLi4vdXRpbHMvcnVudGltZS12YWx1ZVwiO1xuaW1wb3J0IHsgYXNzZXJ0RGVmaW5lZCwgbm9uTnVsbGFibGUgfSBmcm9tIFwiLi4vdXRpbHMvdXRpbHNcIjtcblxudHlwZSBOZXN0ZWRTZWxlY3QgPSB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB8IE5lc3RlZFNlbGVjdCB9O1xuaW1wb3J0IHsgRW50aXR5TWFuYWdlciB9IGZyb20gXCIuL2VudGl0eS1tYW5hZ2VyXCI7XG5cbmV4cG9ydCBjbGFzcyBFbnRpdHkge1xuICBpZDogc3RyaW5nO1xuICBwYXJlbnRJZD86IHN0cmluZztcbiAgdGFibGU6IHN0cmluZztcbiAgdGl0bGU6IHN0cmluZztcbiAgY29uZT86IENvbmU7XG4gIG5hbWVzOiB7XG4gICAgcGFyZW50RnM6IHN0cmluZztcbiAgICBmczogc3RyaW5nO1xuICAgIG1vZHVsZTogc3RyaW5nO1xuICB9O1xuICBwcm9wczogRW50aXR5UHJvcFtdO1xuICBwcm9wc0RpY3Q6IHtcbiAgICBba2V5OiBzdHJpbmddOiBFbnRpdHlQcm9wO1xuICB9O1xuICByZWxhdGlvbnM6IHtcbiAgICBba2V5OiBzdHJpbmddOiBSZWxhdGlvblByb3A7XG4gIH07XG4gIGluZGV4ZXM6IEVudGl0eUluZGV4W107XG4gIHN1YnNldHM6IHtcbiAgICBba2V5OiBzdHJpbmddOiBzdHJpbmdbXTtcbiAgfTtcbiAgc3Vic2V0c0ludGVybmFsOiB7XG4gICAgW2tleTogc3RyaW5nXTogc3RyaW5nW107XG4gIH07XG4gIHR5cGVzOiB7XG4gICAgW25hbWU6IHN0cmluZ106IHouWm9kVHlwZUFueTtcbiAgfSA9IHt9O1xuICBlbnVtczoge1xuICAgIFtlbnVtSWQ6IHN0cmluZ106IHouWm9kRW51bTxSZWFkb25seTxSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+Pj47XG4gIH0gPSB7fTtcbiAgZW51bUxhYmVsczoge1xuICAgIFtlbnVtSWQ6IHN0cmluZ106IHtcbiAgICAgIFtrZXk6IHN0cmluZ106IHN0cmluZztcbiAgICB9O1xuICB9ID0ge307XG4gIGVudW1Db25lczoge1xuICAgIFtlbnVtSWQ6IHN0cmluZ106IENvbmU7XG4gIH0gPSB7fTtcbiAgc3Vic2V0Q29uZXM6IHtcbiAgICBbc3Vic2V0S2V5OiBzdHJpbmddOiBDb25lO1xuICB9ID0ge307XG5cbiAgY29uc3RydWN0b3IoeyBpZCwgcGFyZW50SWQsIHRhYmxlLCB0aXRsZSwgY29uZSwgcHJvcHMsIGluZGV4ZXMsIHN1YnNldHMsIGVudW1zIH06IEVudGl0eUpzb24pIHtcbiAgICAvLyBpZFxuICAgIHRoaXMuaWQgPSBpZDtcbiAgICB0aGlzLnBhcmVudElkID0gcGFyZW50SWQ7XG4gICAgdGhpcy50aXRsZSA9IHRpdGxlID8/IHRoaXMuaWQ7XG4gICAgdGhpcy50YWJsZSA9IHRhYmxlID8/IGluZmxlY3Rpb24udW5kZXJzY29yZShpbmZsZWN0aW9uLnBsdXJhbGl6ZShpZCkpO1xuICAgIHRoaXMuY29uZSA9IGNvbmU7XG5cbiAgICAvLyBwcm9wc1xuICAgIGlmIChwcm9wcykge1xuICAgICAgdGhpcy5wcm9wcyA9IHByb3BzLm1hcCgocHJvcCkgPT4ge1xuICAgICAgICBpZiAoaXNFbnVtUHJvcChwcm9wKSkge1xuICAgICAgICAgIGlmIChwcm9wLmlkLmluY2x1ZGVzKFwiJE1vZGVsXCIpKSB7XG4gICAgICAgICAgICBwcm9wLmlkID0gcHJvcC5pZC5yZXBsYWNlKFwiJE1vZGVsXCIsIGlkKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHByb3A7XG4gICAgICB9KTtcbiAgICAgIHRoaXMucHJvcHNEaWN0ID0gT2JqZWN0LmZyb21FbnRyaWVzKFxuICAgICAgICBwcm9wcy5tYXAoKHByb3ApID0+IHtcbiAgICAgICAgICByZXR1cm4gW3Byb3AubmFtZSwgcHJvcF07XG4gICAgICAgIH0pLFxuICAgICAgKTtcblxuICAgICAgLy8gcmVsYXRpb25zXG4gICAgICB0aGlzLnJlbGF0aW9ucyA9IE9iamVjdC5mcm9tRW50cmllcyhcbiAgICAgICAgcHJvcHMuZmlsdGVyKChwcm9wKSA9PiBpc1JlbGF0aW9uUHJvcChwcm9wKSkubWFwKChwcm9wKSA9PiBbcHJvcC5uYW1lLCBwcm9wXSksXG4gICAgICApO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnByb3BzID0gW107XG4gICAgICB0aGlzLnByb3BzRGljdCA9IHt9O1xuICAgICAgdGhpcy5yZWxhdGlvbnMgPSB7fTtcbiAgICB9XG5cbiAgICAvLyBpbmRleGVzXG4gICAgdGhpcy5pbmRleGVzID0gaW5kZXhlcyA/PyBbXTtcblxuICAgIC8vIHN1YnNldHM6IFN1YnNldERlZuyXkOyEnCBTdWJzZXRGaWVsZFtd66W8IOy2lOy2nO2VmOyXrCBzdWJzZXRzKOydvOuwmCnsmYAgc3Vic2V0c0ludGVybmFsKGludGVybmFsKeuhnCDrtoTrpqxcbiAgICB0aGlzLnN1YnNldHMgPSB7fTtcbiAgICB0aGlzLnN1YnNldHNJbnRlcm5hbCA9IHt9O1xuICAgIGZvciAoY29uc3QgW2tleSwgc3Vic2V0RGVmXSBvZiBPYmplY3QuZW50cmllcyhzdWJzZXRzID8/IHt9KSkge1xuICAgICAgY29uc3QgZmllbGRzID0gZ2V0U3Vic2V0RmllbGRzKHN1YnNldERlZik7XG4gICAgICB0aGlzLnN1YnNldHNba2V5XSA9IGZpZWxkcy5maWx0ZXIoKGYpID0+ICFpc0ludGVybmFsU3Vic2V0RmllbGQoZikpLm1hcChub3JtYWxpemVTdWJzZXRGaWVsZCk7XG4gICAgICB0aGlzLnN1YnNldHNJbnRlcm5hbFtrZXldID0gZmllbGRzLmZpbHRlcihpc0ludGVybmFsU3Vic2V0RmllbGQpLm1hcChub3JtYWxpemVTdWJzZXRGaWVsZCk7XG5cbiAgICAgIC8vIGNvbmUg7LaU7LacXG4gICAgICBpZiAoIUFycmF5LmlzQXJyYXkoc3Vic2V0RGVmKSAmJiBcImNvbmVcIiBpbiBzdWJzZXREZWYgJiYgc3Vic2V0RGVmLmNvbmUpIHtcbiAgICAgICAgdGhpcy5zdWJzZXRDb25lc1trZXldID0gc3Vic2V0RGVmLmNvbmU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gZW51bXM6IEVudW1EZWbsl5DshJwgdmFsdWVz7JmAIGNvbmXrpbwg7LaU7Lac7ZWY7JesIOyymOumrFxuICAgIHRoaXMuZW51bUxhYmVscyA9IE9iamVjdC5mcm9tRW50cmllcyhcbiAgICAgIE9iamVjdC5lbnRyaWVzKGVudW1zID8/IHt9KS5tYXAoKFtrZXksIGVudW1EZWZdKSA9PiB7XG4gICAgICAgIC8vIGNvbmUg7LaU7LacXG4gICAgICAgIGlmIChcInZhbHVlc1wiIGluIGVudW1EZWYgJiYgXCJjb25lXCIgaW4gZW51bURlZiAmJiBlbnVtRGVmLmNvbmUpIHtcbiAgICAgICAgICAvLyBTQUZFVFk6IOyKpO2CpOuniCDqsoDspp3qs7wg66mU7YOA642w7J207YSwIOqzhOyVveydtCDsnbQg7YOA7J6F7J2EIOuztOyepe2VqeuLiOuLpC5cbiAgICAgICAgICB0aGlzLmVudW1Db25lc1trZXldID0gZW51bURlZi5jb25lIGFzIENvbmU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFtrZXksIGdldEVudW1EZWZWYWx1ZXMoZW51bURlZildO1xuICAgICAgfSksXG4gICAgKTtcbiAgICB0aGlzLmVudW1zID0gT2JqZWN0LmZyb21FbnRyaWVzKFxuICAgICAgT2JqZWN0LmVudHJpZXModGhpcy5lbnVtTGFiZWxzKS5tYXAoKFtrZXksIGVudW1MYWJlbF0pID0+IHtcbiAgICAgICAgLy8gU0FGRVRZOiDsiqTtgqTrp4gg6rKA7Kad6rO8IOuplO2DgOuNsOydtO2EsCDqs4Tslb3snbQg7J20IO2DgOyeheydhCDrs7TsnqXtlanri4jri6QuXG4gICAgICAgIHJldHVybiBba2V5LCB6LmVudW0oT2JqZWN0LmtleXMoZW51bUxhYmVsKSldO1xuICAgICAgfSksXG4gICAgKTtcblxuICAgIC8vIG5hbWVzXG4gICAgdGhpcy5uYW1lcyA9IHtcbiAgICAgIHBhcmVudEZzOiBpbmZsZWN0aW9uLmRhc2hlcml6ZShpbmZsZWN0aW9uLnVuZGVyc2NvcmUocGFyZW50SWQgPz8gaWQpKS50b0xvd2VyQ2FzZSgpLFxuICAgICAgZnM6IGluZmxlY3Rpb24uZGFzaGVyaXplKGluZmxlY3Rpb24udW5kZXJzY29yZShpZCkpLnRvTG93ZXJDYXNlKCksXG4gICAgICBtb2R1bGU6IGlkLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICog7L+866as7JqpIOyEnOu4jOyFiyDtlYTrk5zrpbwg67CY7ZmY7ZWp64uI64ukIChzdWJzZXRzICsgc3Vic2V0c0ludGVybmFsIO2Vqey5qClcbiAgICovXG4gIGdldFN1YnNldEZpZWxkc0ZvclF1ZXJ5KHN1YnNldEtleTogc3RyaW5nKTogc3RyaW5nW10ge1xuICAgIHJldHVybiBbLi4uKHRoaXMuc3Vic2V0c1tzdWJzZXRLZXldID8/IFtdKSwgLi4uKHRoaXMuc3Vic2V0c0ludGVybmFsW3N1YnNldEtleV0gPz8gW10pXTtcbiAgfVxuXG4gIC8qKlxuICAgKiDso7zslrTsp4Qg7J2066aEKHN1YnNldEtleSnsnZggc3Vic2V07J2EIOyLpOygnOuhnCDqsIDsoLjsmKTripQgUHVyaSDsvZTrk5wg6rWs7ZiE7LK0IHN0cmluZ+ydhCDrsJjtmZjtlanri4jri6QuXG4gICAqL1xuICBnZXRQdXJpU3Vic2V0UXVlcnkoc3Vic2V0S2V5OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGNvbnN0IHN1YnNldCA9IHRoaXMuZ2V0U3Vic2V0RmllbGRzRm9yUXVlcnkoc3Vic2V0S2V5KTtcbiAgICBjb25zdCBzdWJzZXRRdWVyeSA9IHRoaXMucmVzb2x2ZVN1YnNldFF1ZXJ5KFwiXCIsIHN1YnNldCk7XG5cbiAgICBjb25zdCBsaW5lczogc3RyaW5nW10gPSBbXTtcblxuICAgIC8vIGZyb21cbiAgICBsaW5lcy5wdXNoKGByZXR1cm4gcWJXcmFwcGVyYCk7XG4gICAgbGluZXMucHVzaChgLmZyb20oXCIke3RoaXMudGFibGV9XCIpYCk7XG5cbiAgICAvLyBqb2luXG4gICAgZm9yIChjb25zdCBqb2luIG9mIHN1YnNldFF1ZXJ5LmpvaW5zKSB7XG4gICAgICAvLyBqb2luIOuplOyEnOuTnCDqsrDsoJU6IGlubmVyIOKGkiBqb2luLCBvdXRlciDihpIgbGVmdEpvaW5cbiAgICAgIC8vIEZLIG51bGxhYmxlIOyXrOu2gOuKlCBsZWZ0Sm9pbiDtg4DsnoUg7Iuc6re464uI7LKY7JeQ7IScIOyekOuPmeycvOuhnCDtjJDri6jrkKhcbiAgICAgIGNvbnN0IGpvaW5NZXRob2QgPSBqb2luLmpvaW4gPT09IFwiaW5uZXJcIiA/IFwiam9pblwiIDogXCJsZWZ0Sm9pblwiO1xuXG4gICAgICBpZiAoXCJjdXN0b21cIiBpbiBqb2luKSB7XG4gICAgICAgIC8vIGN1c3RvbSBqb2luIGNsYXVzZeuKlCByYXcg7IKs7JqpXG4gICAgICAgIGxpbmVzLnB1c2goXG4gICAgICAgICAgYC4ke2pvaW5NZXRob2R9KHsgJHtqb2luLmFzfTogXCIke2pvaW4udGFibGV9XCIgfSwgcWJXcmFwcGVyLmtuZXgucmF3KFxcYCR7am9pbi5jdXN0b219XFxgKSlgLFxuICAgICAgICApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbGluZXMucHVzaChgLiR7am9pbk1ldGhvZH0oeyAke2pvaW4uYXN9OiBcIiR7am9pbi50YWJsZX1cIiB9LCBcIiR7am9pbi5mcm9tfVwiLCBcIiR7am9pbi50b31cIilgKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBzZWxlY3QgLSDsnoXssrTsoIEg6rWs7KGw66GcIOyDneyEsVxuICAgIGNvbnN0IHNlbGVjdE9iaiA9IHRoaXMuYnVpbGROZXN0ZWRTZWxlY3RPYmplY3Qoc3Vic2V0UXVlcnkuc2VsZWN0KTtcbiAgICBsaW5lcy5wdXNoKGAuc2VsZWN0KCR7dGhpcy5zdHJpbmdpZnlOZXN0ZWRTZWxlY3RPYmplY3Qoc2VsZWN0T2JqKX0pO2ApO1xuXG4gICAgcmV0dXJuIGxpbmVzLmpvaW4oXCJcXG5cIik7XG4gIH1cblxuICAvKipcbiAgICogKi5lbnRpdHkuanNvbuydmCBzdWJzZXTsl5Ag65Ok7Ja07J6I64qUIO2VhOuTnCDrsLDsl7TsnYQg67Cb7JWE7IScLFxuICAgKiBQdXJp7J2YIFNlbGVjdE9iamVjdCDtg4DsnoXsnLzroZwg67OA7ZmY7ZWp64uI64ukLlxuICAgKlxuICAgKiDsmIg6IFtcInVzZXJzLmlkXCIsIFwicGFyZW50LmlkXCIsIFwicGFyZW50Lm5hbWVcIl1cbiAgICogICDihpIgeyBpZDogXCJ1c2Vycy5pZFwiLCBwYXJlbnQ6IHsgaWQ6IFwicGFyZW50LmlkXCIsIG5hbWU6IFwicGFyZW50Lm5hbWVcIiB9IH1cbiAgICpcbiAgICog7Ja4642U67CU6rCAIOyVhOuLjCDspJHssqkg6rCd7LK066GcIOuzgO2ZmO2VqOyXkCDsnKDsnZjtlZjshLjsmpQuXG4gICAqIOydtOugh+qyjCDspJHssqkg6rCd7LK066GcIOuzgO2ZmO2VmOyXrCBzZWxlY3Tsl5Ag64SY6rKo7KO866m0IFBhcnNlU2VsZWN0T2JqZWN0IO2DgOyeheydtCBqb2lu65CcIOqwneyytOydmCDtg4DsnoXsnYQg7J6YIOyeoeyVhOykhCDsiJgg7J6I7Iq164uI64ukLlxuICAgKiDspoksIGVuaGFuY2Vy7JeQ7IScIHJvd+ulvCDrsJvslZjsnYQg65WMIGh5ZHJhdGXrkJwg6rCd7LK0IOyekOyytOydmCBudWxsaXR57JmAIOq3uCDslYjsqr0g7ZWE65Oc7J2YIG51bGxpdHnqsIAgZmsgbnVsbGFibGUg7Jes67aA7JeQIOuUsOudvCDsnpgg7LaU66Gg65Cp64uI64ukLlxuICAgKi9cbiAgcHJpdmF0ZSBidWlsZE5lc3RlZFNlbGVjdE9iamVjdChzZWxlY3RJdGVtczogc3RyaW5nW10pOiBOZXN0ZWRTZWxlY3Qge1xuICAgIGNvbnN0IHJlc3VsdDogTmVzdGVkU2VsZWN0ID0ge307XG5cbiAgICBmb3IgKGNvbnN0IHNlbGVjdEl0ZW0gb2Ygc2VsZWN0SXRlbXMpIHtcbiAgICAgIC8vIFwidXNlcnMuaWRcIiDrmJDripQgXCJ1c2Vycy5pZCBhcyB1c2VyX19pZFwiIO2Yle2DnCDtjIzsi7FcbiAgICAgIGNvbnN0IG1hdGNoID0gc2VsZWN0SXRlbS5tYXRjaCgvXiguKz8pKD86IGFzICguKykpPyQvKTtcbiAgICAgIGlmICghbWF0Y2gpIGNvbnRpbnVlO1xuXG4gICAgICBjb25zdCBbLCBjb2x1bW4sIGFsaWFzXSA9IG1hdGNoO1xuICAgICAgY29uc3QgY29sdW1uVmFsdWUgPSBgXCIke2NvbHVtbi50cmltKCl9XCJgO1xuXG4gICAgICBpZiAoIWFsaWFzIHx8ICFhbGlhcy5pbmNsdWRlcyhcIl9fXCIpKSB7XG4gICAgICAgIC8vIGFsaWFz6rCAIOyXhuqxsOuCmCBfX+ulvCDtj6ztlajtlZjsp4Ag7JWK7Jy866m0IOy1nOyDgeychCDtlYTrk5xcbiAgICAgICAgY29uc3Qga2V5ID0gYWxpYXMgPz8gYXNzZXJ0RGVmaW5lZChjb2x1bW4uc3BsaXQoXCIuXCIpLnBvcCgpKTtcbiAgICAgICAgcmVzdWx0W2tleV0gPSBjb2x1bW5WYWx1ZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIGFsaWFz6rCAIF9f66W8IO2PrO2VqO2VmOuptCDsnoXssrQg6rWs7KGw66GcIOq3uOujue2ZlFxuICAgICAgICBjb25zdCBwYXJ0cyA9IGFsaWFzLnNwbGl0KFwiX19cIik7XG4gICAgICAgIGxldCBjdXJyZW50ID0gcmVzdWx0O1xuXG4gICAgICAgIC8vIOuniOyngOuniSDtjIztirgg7KCE6rmM7KeAIOykkeyyqSDqsJ3ssrQg7IOd7ISxXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcGFydHMubGVuZ3RoIC0gMTsgaSsrKSB7XG4gICAgICAgICAgY29uc3QgcGFydCA9IHBhcnRzW2ldO1xuICAgICAgICAgIGlmIChwYXJ0IGluIGN1cnJlbnQpIHtcbiAgICAgICAgICAgIGlmIChpc1N0cmluZ1ZhbHVlKGN1cnJlbnRbcGFydF0pKSB7XG4gICAgICAgICAgICAgIC8vIOyeheugpeydtCBbXCJ1c2VyXCIsIFwidXNlcl9faWRcIl0g6rCZ7J2AIOqyveyasCFcbiAgICAgICAgICAgICAgLy8g7JWg7LSI7JeQIOunkOuPhCDslYgg65CY7KeA66eMIOyViOyghO2VmOqyjCDsmIjsmbjrpbwg642Y7KeR64uI64ukLlxuICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICAgICAgYENvbmZsaWN0IGRldGVjdGVkIGluIHNlbGVjdCBpdGVtczogcGFyZW50IHBhdGggXCIke3BhcnRzLnNsaWNlKDAsIGkgKyAxKS5qb2luKFwiX19cIil9XCIgaXMgYWxyZWFkeSBzZXQgYXMgYSBmaWVsZCwgY2Fubm90IG5lc3QgXCIke2FsaWFzfVwiIHVuZGVyIGl0LmAsXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGN1cnJlbnRbcGFydF0gPSB7fTtcbiAgICAgICAgICB9XG4gICAgICAgICAgY3VycmVudCA9IGN1cnJlbnRbcGFydF07XG4gICAgICAgIH1cblxuICAgICAgICAvLyDrp4jsp4Drp4kg7YyM7Yq47JeQIOqwkiDshKTsoJVcbiAgICAgICAgY29uc3QgbGFzdFBhcnQgPSBwYXJ0c1twYXJ0cy5sZW5ndGggLSAxXTtcbiAgICAgICAgY3VycmVudFtsYXN0UGFydF0gPSBjb2x1bW5WYWx1ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gT2JqZWN0LmZyb21FbnRyaWVzKE9iamVjdC5lbnRyaWVzKHJlc3VsdCkpO1xuICB9XG5cbiAgLyoqXG4gICAqIEpTT04uc3RyaW5naWZ57JmAIOycoOyCrO2VnCDsnbzsnYQg7ZWp64uI64ukLlxuICAgKiDri6Trp4wg7KO87Ja07KeEIOqwneyytOulvCBKU09O7J20IOyVhOuLjCBUeXBlU2NyaXB0IOqwneyytCDrpqzthLDrn7Qg7Iqk7Yq466eB7Jy866GcIOunjOuTpOyWtOykjeuLiOuLpC5cbiAgICoga2V57JeQIOuUsOyYtO2RnOqwgCDsl4bslrTsmpQuXG4gICAqIOy2nOugpSDsmIjsi5w6XG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICoge1xuICAgKiAgIGlkOiBcInVzZXJzLmlkXCIsXG4gICAqICAgcGFyZW50OiB7XG4gICAqICAgICBpZDogXCJwYXJlbnQuaWRcIixcbiAgICogICAgIG5hbWU6IFwicGFyZW50Lm5hbWVcIixcbiAgICogICB9LFxuICAgKiB9XG4gICAqIGBgYFxuICAgKiBAcGFyYW0gb2JqIOuzgO2ZmO2VoCDqsJ3ssrRcbiAgICogQHBhcmFtIGluZGVudCDrk6Tsl6zsk7DquLAg66CI67KoXG4gICAqIEBwYXJhbSB3aXRoQnJhY2VzIHRydWXrqbQg7KSR6rSE7Zi4IO2PrO2VqCwgZmFsc2XrqbQg64K07Jqp66eMIOuwmO2ZmFxuICAgKi9cbiAgcHJpdmF0ZSBzdHJpbmdpZnlOZXN0ZWRTZWxlY3RPYmplY3QoXG4gICAgb2JqOiBOZXN0ZWRTZWxlY3QsXG4gICAgaW5kZW50OiBudW1iZXIgPSAwLFxuICAgIHdpdGhCcmFjZXM6IGJvb2xlYW4gPSB0cnVlLFxuICApOiBzdHJpbmcge1xuICAgIGNvbnN0IHNwYWNlcyA9IFwiICBcIi5yZXBlYXQoaW5kZW50KTtcbiAgICBjb25zdCBpbm5lclNwYWNlcyA9IFwiICBcIi5yZXBlYXQoaW5kZW50ICsgMSk7XG5cbiAgICBjb25zdCBlbnRyaWVzID0gT2JqZWN0LmVudHJpZXMob2JqKTtcbiAgICBpZiAoZW50cmllcy5sZW5ndGggPT09IDApIHJldHVybiB3aXRoQnJhY2VzID8gXCJ7fVwiIDogXCJcIjtcblxuICAgIGNvbnN0IGxpbmVzID0gZW50cmllcy5tYXAoKFtrZXksIHZhbHVlXSkgPT4ge1xuICAgICAgaWYgKGlzU3RyaW5nVmFsdWUodmFsdWUpKSB7XG4gICAgICAgIC8vIOy7rOufvCDqsr3roZwgKOydtOuvuCDrlLDsmLTtkZwg7Y+s7ZWoKVxuICAgICAgICByZXR1cm4gYCR7aW5uZXJTcGFjZXN9JHtrZXl9OiAke3ZhbHVlfSxgO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8g7KSR7LKpIOqwneyytCAo7ZWt7IOBIOykkeq0hO2YuCDtj6ztlagpXG4gICAgICAgIHJldHVybiBgJHtpbm5lclNwYWNlc30ke2tleX06ICR7dGhpcy5zdHJpbmdpZnlOZXN0ZWRTZWxlY3RPYmplY3QodmFsdWUsIGluZGVudCArIDEsIHRydWUpfSxgO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgaWYgKHdpdGhCcmFjZXMpIHtcbiAgICAgIHJldHVybiBge1xcbiR7bGluZXMuam9pbihcIlxcblwiKX1cXG4ke3NwYWNlc319YDtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8g7KSR6rSE7Zi4IOyXhuydtCDrgrTsmqnrp4wg67CY7ZmYICjslZ7rkqQg6rCc7ZaJIOygnOyZuClcbiAgICAgIHJldHVybiBsaW5lcy5qb2luKFwiXFxuXCIpO1xuICAgIH1cbiAgfVxuXG4gIGdldFB1cmlMb2FkZXJRdWVyeShzdWJzZXRLZXk6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgY29uc3Qgc3Vic2V0ID0gdGhpcy5nZXRTdWJzZXRGaWVsZHNGb3JRdWVyeShzdWJzZXRLZXkpO1xuICAgIGNvbnN0IHsgbG9hZGVycyB9ID0gdGhpcy5yZXNvbHZlU3Vic2V0UXVlcnkoXCJcIiwgc3Vic2V0KTtcblxuICAgIGNvbnN0IGxpbmVzOiBzdHJpbmdbXSA9IFtgW2BdO1xuXG4gICAgLy8g7J6s6reA7KCB7Jy866GcIGxvYWRlciDsg53shLHtlZjripQg7Zes7Y28IO2VqOyImFxuICAgIGNvbnN0IGdlbmVyYXRlTG9hZGVyQ29kZSA9IChuZXN0ZWRMb2FkZXJzOiBTdWJzZXRRdWVyeVtcImxvYWRlcnNcIl0pOiBzdHJpbmdbXSA9PiB7XG4gICAgICBjb25zdCBsb2FkZXJMaW5lczogc3RyaW5nW10gPSBbXTtcblxuICAgICAgZm9yIChjb25zdCBsb2FkZXIgb2YgbmVzdGVkTG9hZGVycykge1xuICAgICAgICBjb25zdCB7IHRvVGFibGUsIHRvQ29sLCB0aHJvdWdoLCBmcm9tVGFibGUgfSA9IGxvYWRlci5tYW55Sm9pbjtcblxuICAgICAgICAvLyBmcm9tVGFibGXsnZggRW50aXR566W8IOqwgOyguOyZgOyEnCBQSyDtg4DsnoUg7ZmV7J24XG4gICAgICAgIGNvbnN0IGZyb21FbnRpdHkgPSBFbnRpdHlNYW5hZ2VyLmdldEJ5VGFibGUoZnJvbVRhYmxlKTtcbiAgICAgICAgY29uc3QgZnJvbUlkc1R5cGUgPSBmcm9tRW50aXR5LmdldFBrQXJyYXlUeXBlKCk7XG5cbiAgICAgICAgbG9hZGVyTGluZXMucHVzaChcbiAgICAgICAgICBcIntcIixcbiAgICAgICAgICBgYXM6IFwiJHtsb2FkZXIuYXN9XCIsYCxcbiAgICAgICAgICBgcmVmSWQ6IFwiJHtsb2FkZXIubWFueUpvaW4uaWRGaWVsZH1cIixgLFxuICAgICAgICAgIGBxYjogKHFiV3JhcHBlcjogUHVyaVdyYXBwZXI8RGF0YWJhc2VTY2hlbWFFeHRlbmQ+LCBmcm9tSWRzOiBudW1iZXJbXSB8IHN0cmluZ1tdKSA9PiB7YCxcbiAgICAgICAgKTtcblxuICAgICAgICBpZiAodGhyb3VnaCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgLy8gSGFzTWFueVxuICAgICAgICAgIGxvYWRlckxpbmVzLnB1c2goXG4gICAgICAgICAgICAvL1xuICAgICAgICAgICAgXCJyZXR1cm4gcWJXcmFwcGVyXCIsXG4gICAgICAgICAgICBgLmZyb20oXCIke3RvVGFibGV9XCIpYCxcbiAgICAgICAgICApO1xuXG4gICAgICAgICAgbG9hZGVyLm9uZUpvaW5zLmZvckVhY2goKGpvaW46IFN1YnNldFF1ZXJ5W1wiam9pbnNcIl1bbnVtYmVyXSkgPT4ge1xuICAgICAgICAgICAgLy8gRksgbnVsbGFibGUg7Jes67aA64qUIGxlZnRKb2luIO2DgOyehSDsi5zqt7jri4jsspjsl5DshJwg7J6Q64+Z7Jy866GcIO2MkOuLqOuQqFxuICAgICAgICAgICAgY29uc3Qgam9pbk1ldGhvZCA9IGpvaW4uam9pbiA9PT0gXCJpbm5lclwiID8gXCJqb2luXCIgOiBcImxlZnRKb2luXCI7XG4gICAgICAgICAgICBpZiAoXCJjdXN0b21cIiBpbiBqb2luKSB7XG4gICAgICAgICAgICAgIC8vIGN1c3RvbSBqb2luIGNsYXVzZeuKlCBjYWxsYmFjayDtmJXtg5zsnZggb24g66mU7ISc65Oc66GcIOyymOumrO2VqeuLiOuLpC5cbiAgICAgICAgICAgICAgbG9hZGVyTGluZXMucHVzaChcbiAgICAgICAgICAgICAgICBgLiR7am9pbk1ldGhvZH0oeyAke2pvaW4uYXN9OiBcIiR7am9pbi50YWJsZX1cIiB9LCAoaikgPT4ge2AsXG4gICAgICAgICAgICAgICAgYGoub24oUHVyaS5yYXdTdHJpbmcoXCIke2pvaW4uY3VzdG9tfVwiKSk7YCxcbiAgICAgICAgICAgICAgICBcIn0pXCIsXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBsb2FkZXJMaW5lcy5wdXNoKFxuICAgICAgICAgICAgICAgIGAuJHtqb2luTWV0aG9kfSh7ICR7am9pbi5hc306IFwiJHtqb2luLnRhYmxlfVwiIH0sIFwiJHtqb2luLmZyb219XCIsIFwiJHtqb2luLnRvfVwiKWAsXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICAvLyDsnoXssrTsoIEgc2VsZWN0IOq1rOyhsCDsg53shLEgKHJlZklkIO2PrO2VqClcbiAgICAgICAgICBjb25zdCBzZWxlY3RPYmogPSB0aGlzLmJ1aWxkTmVzdGVkU2VsZWN0T2JqZWN0KGxvYWRlci5zZWxlY3QpO1xuICAgICAgICAgIHNlbGVjdE9iai5yZWZJZCA9IGBcIiR7dG9UYWJsZX0uJHt0b0NvbH1cImA7XG4gICAgICAgICAgbG9hZGVyTGluZXMucHVzaChcbiAgICAgICAgICAgIGAud2hlcmVJbihcIiR7dG9UYWJsZX0uJHt0b0NvbH1cIiwgZnJvbUlkcyBhcyAke2Zyb21JZHNUeXBlfSlgLFxuICAgICAgICAgICAgYC5zZWxlY3QoJHt0aGlzLnN0cmluZ2lmeU5lc3RlZFNlbGVjdE9iamVjdChzZWxlY3RPYmopfSk7YCxcbiAgICAgICAgICApO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIE1hbnlUb01hbnlcbiAgICAgICAgICBsb2FkZXJMaW5lcy5wdXNoKFxuICAgICAgICAgICAgXCJyZXR1cm4gcWJXcmFwcGVyXCIsXG4gICAgICAgICAgICBgLmZyb20oXCIke3Rocm91Z2gudGFibGV9XCIpYCxcbiAgICAgICAgICAgIGAuam9pbihcIiR7dG9UYWJsZX1cIiwgXCIke3Rocm91Z2gudGFibGV9LiR7dGhyb3VnaC50b0NvbH1cIiwgXCIke3RvVGFibGV9LiR7dG9Db2x9XCIpYCxcbiAgICAgICAgICApO1xuXG4gICAgICAgICAgbG9hZGVyLm9uZUpvaW5zLmZvckVhY2goKGpvaW46IFN1YnNldFF1ZXJ5W1wiam9pbnNcIl1bbnVtYmVyXSkgPT4ge1xuICAgICAgICAgICAgLy8gRksgbnVsbGFibGUg7Jes67aA64qUIGxlZnRKb2luIO2DgOyehSDsi5zqt7jri4jsspjsl5DshJwg7J6Q64+Z7Jy866GcIO2MkOuLqOuQqFxuICAgICAgICAgICAgY29uc3Qgam9pbk1ldGhvZCA9IGpvaW4uam9pbiA9PT0gXCJpbm5lclwiID8gXCJqb2luXCIgOiBcImxlZnRKb2luXCI7XG4gICAgICAgICAgICBpZiAoXCJjdXN0b21cIiBpbiBqb2luKSB7XG4gICAgICAgICAgICAgIC8vIGN1c3RvbSBqb2luIGNsYXVzZeuKlCBjYWxsYmFjayDtmJXtg5zsnZggb24g66mU7ISc65Oc66GcIOyymOumrO2VqeuLiOuLpC5cbiAgICAgICAgICAgICAgbG9hZGVyTGluZXMucHVzaChcbiAgICAgICAgICAgICAgICBgLiR7am9pbk1ldGhvZH0oeyAke2pvaW4uYXN9OiBcIiR7am9pbi50YWJsZX1cIiB9LCAoaikgPT4ge2AsXG4gICAgICAgICAgICAgICAgYGoub24oUHVyaS5yYXdTdHJpbmcoXCIke2pvaW4uY3VzdG9tfVwiKSk7YCxcbiAgICAgICAgICAgICAgICBcIn0pXCIsXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBsb2FkZXJMaW5lcy5wdXNoKFxuICAgICAgICAgICAgICAgIGAuJHtqb2luTWV0aG9kfSh7ICR7am9pbi5hc306IFwiJHtqb2luLnRhYmxlfVwiIH0sIFwiJHtqb2luLmZyb219XCIsIFwiJHtqb2luLnRvfVwiKWAsXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICAvLyDsnoXssrTsoIEgc2VsZWN0IOq1rOyhsCDsg53shLEgKHJlZklkIO2PrO2VqClcbiAgICAgICAgICBjb25zdCBzZWxlY3RPYmogPSB0aGlzLmJ1aWxkTmVzdGVkU2VsZWN0T2JqZWN0KGxvYWRlci5zZWxlY3QpO1xuICAgICAgICAgIHNlbGVjdE9iai5yZWZJZCA9IGBcIiR7dGhyb3VnaC50YWJsZX0uJHt0aHJvdWdoLmZyb21Db2x9XCJgO1xuICAgICAgICAgIGxvYWRlckxpbmVzLnB1c2goXG4gICAgICAgICAgICBgLndoZXJlSW4oXCIke3Rocm91Z2gudGFibGV9LiR7dGhyb3VnaC5mcm9tQ29sfVwiLCBmcm9tSWRzIGFzICR7ZnJvbUlkc1R5cGV9KWAsXG4gICAgICAgICAgICBgLnNlbGVjdCgke3RoaXMuc3RyaW5naWZ5TmVzdGVkU2VsZWN0T2JqZWN0KHNlbGVjdE9iail9KTtgLFxuICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICBsb2FkZXJMaW5lcy5wdXNoKGB9LGApO1xuXG4gICAgICAgIC8vIOykkeyyqSBsb2FkZXJzIOyymOumrFxuICAgICAgICBpZiAobG9hZGVyLmxvYWRlcnMgJiYgbG9hZGVyLmxvYWRlcnMubGVuZ3RoID4gMCkge1xuICAgICAgICAgIGxvYWRlckxpbmVzLnB1c2goXCJsb2FkZXJzOiBbXCIsIC4uLmdlbmVyYXRlTG9hZGVyQ29kZShsb2FkZXIubG9hZGVycyksIFwiXSxcIik7XG4gICAgICAgIH1cblxuICAgICAgICBsb2FkZXJMaW5lcy5wdXNoKFwifSxcIik7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBsb2FkZXJMaW5lcztcbiAgICB9O1xuXG4gICAgbGluZXMucHVzaCguLi5nZW5lcmF0ZUxvYWRlckNvZGUobG9hZGVycykpO1xuICAgIGxpbmVzLnB1c2goYF1gKTtcblxuICAgIHJldHVybiBsaW5lcy5qb2luKFwiXFxuXCIpO1xuICB9XG5cbiAgLypcbiAgICBzdWJzZXQgU0VMRUNUL0pPSU4vTE9BREVSIOqysOqzvCDrpqzthLRcbiAgKi9cbiAgZ2V0U3Vic2V0UXVlcnkoc3Vic2V0S2V5OiBzdHJpbmcpOiBTdWJzZXRRdWVyeSB7XG4gICAgY29uc3Qgc3Vic2V0ID0gdGhpcy5nZXRTdWJzZXRGaWVsZHNGb3JRdWVyeShzdWJzZXRLZXkpO1xuXG4gICAgY29uc3QgcmVzdWx0OiBTdWJzZXRRdWVyeSA9IHRoaXMucmVzb2x2ZVN1YnNldFF1ZXJ5KFwiXCIsIHN1YnNldCk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIC8qXG4gICAqL1xuICByZXNvbHZlU3Vic2V0UXVlcnkoXG4gICAgcHJlZml4OiBzdHJpbmcsXG4gICAgZmllbGRzOiBzdHJpbmdbXSxcbiAgICBpc0FscmVhZHlPdXRlckpvaW5lZDogYm9vbGVhbiA9IGZhbHNlLFxuICApOiBTdWJzZXRRdWVyeSB7XG4gICAgLy8gcHJlZml4IOy5mO2ZmCAocHJlZml464qUIFRvT25lUmVsYXRpb27snbQg67O17IiY66GcIOu2meydgCDqsr3smrAg66qo65GQIF9f66GcIOuzgOqyveuQqClcbiAgICBwcmVmaXggPSBwcmVmaXgucmVwbGFjZSgvXFwuL2csIFwiX19cIik7XG5cbiAgICAvLyDshJzruIzshYvsnYQgMeuOgeyKpOunjCDrtoTrpqztlZjsl6wg6re466O57ZWRXG4gICAgY29uc3Qgc3Vic2V0R3JvdXAgPSBncm91cChmaWVsZHMsIChmaWVsZCkgPT4ge1xuICAgICAgaWYgKGZpZWxkLmluY2x1ZGVzKFwiLlwiKSkge1xuICAgICAgICBjb25zdCBbcmVsXSA9IGZpZWxkLnNwbGl0KFwiLlwiKTtcbiAgICAgICAgcmV0dXJuIHJlbDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBcIlwiO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgY29uc3QgcmVzdWx0ID0gT2JqZWN0LmtleXMoc3Vic2V0R3JvdXApLnJlZHVjZShcbiAgICAgIChyLCBncm91cEtleSkgPT4ge1xuICAgICAgICBjb25zdCBncm91cGVkRmllbGRzID0gc3Vic2V0R3JvdXBbZ3JvdXBLZXldO1xuICAgICAgICBhc3NlcnQoZ3JvdXBlZEZpZWxkcyAhPT0gdW5kZWZpbmVkLCBcImZpZWxkcyBpcyB1bmRlZmluZWRcIik7XG5cbiAgICAgICAgLy8g7ZiE7J6sIO2FjOydtOu4lCDtlYTrk5zshYvsnYAgc2VsZWN0LCB2aXJ0dWFs7JeQIOy2lOqwgO2VmOqzoCDrpqzthLRcbiAgICAgICAgaWYgKGdyb3VwS2V5ID09PSBcIlwiKSB7XG4gICAgICAgICAgY29uc3QgcmVhbEZpZWxkcyA9IGdyb3VwZWRGaWVsZHMuZmlsdGVyKChmaWVsZCkgPT4gIWlzVmlydHVhbFByb3AodGhpcy5wcm9wc0RpY3RbZmllbGRdKSk7XG4gICAgICAgICAgLy8gdmlydHVhbFR5cGU6IFwiY29kZVwiICjrmJDripQgdW5kZWZpbmVkKeyduCB2aXJ0dWFsIHByb3Drp4wgci52aXJ0dWFs7JeQIOy2lOqwgFxuICAgICAgICAgIC8vIHZpcnR1YWxUeXBlOiBcInF1ZXJ5XCLsnbgg6rK97JqwIOyCrOyaqeyekOqwgCBhcHBlbmRTZWxlY3TroZwg7KeB7KCRIOy2lOqwgO2VmOuvgOuhnCDsoJzsmbhcbiAgICAgICAgICBjb25zdCB2aXJ0dWFsQ29kZUZpZWxkcyA9IGdyb3VwZWRGaWVsZHMuZmlsdGVyKChmaWVsZCkgPT5cbiAgICAgICAgICAgIGlzVmlydHVhbENvZGVQcm9wKHRoaXMucHJvcHNEaWN0W2ZpZWxkXSksXG4gICAgICAgICAgKTtcblxuICAgICAgICAgIGlmIChwcmVmaXggPT09IFwiXCIpIHtcbiAgICAgICAgICAgIC8vIO2YhOyerCDthYzsnbTruJTsnbgg6rK97JqwXG4gICAgICAgICAgICByLnNlbGVjdCA9IHIuc2VsZWN0LmNvbmNhdChyZWFsRmllbGRzLm1hcCgoZmllbGQpID0+IHRoaXMuZ2V0RnVsbEZpZWxkTmFtZShmaWVsZCkpKTtcbiAgICAgICAgICAgIHIudmlydHVhbCA9IHIudmlydHVhbC5jb25jYXQodmlydHVhbENvZGVGaWVsZHMpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyDrhJjslrTsmKgg7YWM7J2067iU7J24IOqyveyasFxuICAgICAgICAgICAgci5zZWxlY3QgPSByLnNlbGVjdC5jb25jYXQoXG4gICAgICAgICAgICAgIHJlYWxGaWVsZHMubWFwKChmaWVsZCkgPT4gYCR7cHJlZml4fS4ke2ZpZWxkfSBhcyAke3ByZWZpeH1fXyR7ZmllbGR9YCksXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiByO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcmVsYXRpb24gPSB0aGlzLnJlbGF0aW9uc1tncm91cEtleV07XG4gICAgICAgIGlmIChyZWxhdGlvbiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGDsobTsnqztlZjsp4Ag7JWK64qUIHJlbGF0aW9uIOywuOyhsCAke2dyb3VwS2V5fWApO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHJlbEVudGl0eSA9IEVudGl0eU1hbmFnZXIuZ2V0KHJlbGF0aW9uLndpdGgpO1xuXG4gICAgICAgIGlmIChpc09uZVRvT25lUmVsYXRpb25Qcm9wKHJlbGF0aW9uKSB8fCBpc0JlbG9uZ3NUb09uZVJlbGF0aW9uUHJvcChyZWxhdGlvbikpIHtcbiAgICAgICAgICAvLyAtT25lIFJlbGF0aW9uOiBKT0lOIOycvOuhnCDsspjrpqxcbiAgICAgICAgICBjb25zdCByZWxGaWVsZHMgPSBncm91cGVkRmllbGRzLm1hcCgoZmllbGQpID0+IGZpZWxkLnNwbGl0KFwiLlwiKS5zbGljZSgxKS5qb2luKFwiLlwiKSk7XG5cbiAgICAgICAgICAvLyAtT25lIFJlbGF0aW9u7JeQ7IScIGlkIO2VhOuTnOunjCDssLjsobDtlZjripQg6rK97JqwIOumtOugiOydtOyFmCDrhJjquLDsp4Ag7JWK6rOgIOumrO2EtFxuICAgICAgICAgIGlmIChyZWxGaWVsZHMubGVuZ3RoID09PSAxICYmIHJlbEZpZWxkc1swXSA9PT0gXCJpZFwiKSB7XG4gICAgICAgICAgICBpZiAocHJlZml4ID09PSBcIlwiKSB7XG4gICAgICAgICAgICAgIHIuc2VsZWN0ID0gci5zZWxlY3QuY29uY2F0KGAke3RoaXMudGFibGV9LiR7Z3JvdXBLZXl9X2lkYCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICByLnNlbGVjdCA9IHIuc2VsZWN0LmNvbmNhdChgJHtwcmVmaXh9LiR7Z3JvdXBLZXl9X2lkIGFzICR7cHJlZml4fV9fJHtncm91cEtleX1faWRgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiByO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIGlubmVyT3JPdXRlclxuICAgICAgICAgIGNvbnN0IGlubmVyT3JPdXRlciA9ICgoKSA9PiB7XG4gICAgICAgICAgICBpZiAoaXNBbHJlYWR5T3V0ZXJKb2luZWQpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIFwib3V0ZXJcIjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGlzT25lVG9PbmVSZWxhdGlvblByb3AocmVsYXRpb24pKSB7XG4gICAgICAgICAgICAgIGlmIChyZWxhdGlvbi5oYXNKb2luQ29sdW1uICYmICEocmVsYXRpb24ubnVsbGFibGUgPz8gZmFsc2UpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFwiaW5uZXJcIjtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gXCJvdXRlclwiO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBpZiAocmVsYXRpb24ubnVsbGFibGUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gXCJvdXRlclwiO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiBcImlubmVyXCI7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KSgpO1xuICAgICAgICAgIGNvbnN0IHJlbFN1YnNldFF1ZXJ5ID0gcmVsRW50aXR5LnJlc29sdmVTdWJzZXRRdWVyeShcbiAgICAgICAgICAgIGAke3ByZWZpeCAhPT0gXCJcIiA/IGAke3ByZWZpeH0uYCA6IFwiXCJ9JHtncm91cEtleX1gLFxuICAgICAgICAgICAgcmVsRmllbGRzLFxuICAgICAgICAgICAgaW5uZXJPck91dGVyID09PSBcIm91dGVyXCIsXG4gICAgICAgICAgKTtcbiAgICAgICAgICByLnNlbGVjdCA9IHIuc2VsZWN0LmNvbmNhdChyZWxTdWJzZXRRdWVyeS5zZWxlY3QpO1xuICAgICAgICAgIHIudmlydHVhbCA9IHIudmlydHVhbC5jb25jYXQocmVsU3Vic2V0UXVlcnkudmlydHVhbCk7XG5cbiAgICAgICAgICBjb25zdCBqb2luQXMgPSBwcmVmaXggPT09IFwiXCIgPyBncm91cEtleSA6IGAke3ByZWZpeH1fXyR7Z3JvdXBLZXl9YDtcbiAgICAgICAgICBjb25zdCBmcm9tVGFibGUgPSBwcmVmaXggPT09IFwiXCIgPyB0aGlzLnRhYmxlIDogcHJlZml4O1xuXG4gICAgICAgICAgbGV0IGpvaW5DbGF1c2U6XG4gICAgICAgICAgICB8IHtcbiAgICAgICAgICAgICAgICBmcm9tOiBzdHJpbmc7XG4gICAgICAgICAgICAgICAgdG86IHN0cmluZztcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfCB7XG4gICAgICAgICAgICAgICAgY3VzdG9tOiBzdHJpbmc7XG4gICAgICAgICAgICAgIH07XG4gICAgICAgICAgaWYgKHJlbGF0aW9uLmN1c3RvbUpvaW5DbGF1c2UpIHtcbiAgICAgICAgICAgIGpvaW5DbGF1c2UgPSB7XG4gICAgICAgICAgICAgIGN1c3RvbTogcmVsYXRpb24uY3VzdG9tSm9pbkNsYXVzZSxcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGxldCBmcm9tOiBzdHJpbmcsIHRvOiBzdHJpbmc7XG4gICAgICAgICAgICBpZiAoaXNPbmVUb09uZVJlbGF0aW9uUHJvcChyZWxhdGlvbikpIHtcbiAgICAgICAgICAgICAgaWYgKHJlbGF0aW9uLmhhc0pvaW5Db2x1bW4pIHtcbiAgICAgICAgICAgICAgICBmcm9tID0gYCR7ZnJvbVRhYmxlfS4ke3JlbGF0aW9uLm5hbWV9X2lkYDtcbiAgICAgICAgICAgICAgICB0byA9IGAke2pvaW5Bc30uaWRgO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGZyb20gPSBgJHtmcm9tVGFibGV9LmlkYDtcbiAgICAgICAgICAgICAgICB0byA9IGAke2pvaW5Bc30uJHtpbmZsZWN0aW9uLnVuZGVyc2NvcmUodGhpcy5uYW1lcy5mcy5yZXBsYWNlKC8tL2csIFwiX1wiKSl9X2lkYDtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgZnJvbSA9IGAke2Zyb21UYWJsZX0uJHtyZWxhdGlvbi5uYW1lfV9pZGA7XG4gICAgICAgICAgICAgIHRvID0gYCR7am9pbkFzfS5pZGA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBqb2luQ2xhdXNlID0ge1xuICAgICAgICAgICAgICBmcm9tLFxuICAgICAgICAgICAgICB0byxcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgci5qb2lucy5wdXNoKHtcbiAgICAgICAgICAgIGFzOiBqb2luQXMsXG4gICAgICAgICAgICBqb2luOiBpbm5lck9yT3V0ZXIsXG4gICAgICAgICAgICB0YWJsZTogcmVsRW50aXR5LnRhYmxlLFxuICAgICAgICAgICAgLi4uam9pbkNsYXVzZSxcbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIC8vIEJlbG9uZ3NUb09uZSDrsJHsl5AgSGFzTWFueeqwgCDrtpnsnYAg6rK97JqwXG4gICAgICAgICAgaWYgKHJlbFN1YnNldFF1ZXJ5LmxvYWRlcnMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgY29uc3QgY29udmVydGVkTG9hZGVycyA9IHJlbFN1YnNldFF1ZXJ5LmxvYWRlcnMubWFwKChsb2FkZXIpID0+IHtcbiAgICAgICAgICAgICAgY29uc3QgbmV3QXMgPSBbZ3JvdXBLZXksIGxvYWRlci5hc10uam9pbihcIl9fXCIpO1xuICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIGFzOiBuZXdBcyxcbiAgICAgICAgICAgICAgICB0YWJsZTogbG9hZGVyLnRhYmxlLFxuICAgICAgICAgICAgICAgIG1hbnlKb2luOiBsb2FkZXIubWFueUpvaW4sXG4gICAgICAgICAgICAgICAgb25lSm9pbnM6IGxvYWRlci5vbmVKb2lucyxcbiAgICAgICAgICAgICAgICBzZWxlY3Q6IGxvYWRlci5zZWxlY3QsXG4gICAgICAgICAgICAgICAgbG9hZGVyczogbG9hZGVyLmxvYWRlcnMsXG4gICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgci5sb2FkZXJzID0gWy4uLnIubG9hZGVycywgLi4uY29udmVydGVkTG9hZGVyc107XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgci5qb2lucyA9IHIuam9pbnMuY29uY2F0KHJlbFN1YnNldFF1ZXJ5LmpvaW5zKTtcbiAgICAgICAgfSBlbHNlIGlmIChpc0hhc01hbnlSZWxhdGlvblByb3AocmVsYXRpb24pIHx8IGlzTWFueVRvTWFueVJlbGF0aW9uUHJvcChyZWxhdGlvbikpIHtcbiAgICAgICAgICAvLyAtTWFueSBSZWxhdGlvbjogTG9hZGVyIOuhnCDsspjrpqxcbiAgICAgICAgICBjb25zdCByZWxGaWVsZHMgPSBncm91cGVkRmllbGRzLm1hcCgoZmllbGQpID0+IGZpZWxkLnNwbGl0KFwiLlwiKS5zbGljZSgxKS5qb2luKFwiLlwiKSk7XG4gICAgICAgICAgY29uc3QgcmVsU3Vic2V0UXVlcnkgPSByZWxFbnRpdHkucmVzb2x2ZVN1YnNldFF1ZXJ5KFwiXCIsIHJlbEZpZWxkcyk7XG5cbiAgICAgICAgICBsZXQgbWFueUpvaW46IFN1YnNldFF1ZXJ5W1wibG9hZGVyc1wiXVtudW1iZXJdW1wibWFueUpvaW5cIl07XG4gICAgICAgICAgaWYgKGlzSGFzTWFueVJlbGF0aW9uUHJvcChyZWxhdGlvbikpIHtcbiAgICAgICAgICAgIGNvbnN0IGZyb21Db2wgPSByZWxhdGlvbj8uZnJvbUNvbHVtbiA/PyBcImlkXCI7XG4gICAgICAgICAgICBtYW55Sm9pbiA9IHtcbiAgICAgICAgICAgICAgZnJvbVRhYmxlOiB0aGlzLnRhYmxlLFxuICAgICAgICAgICAgICBmcm9tQ29sLFxuICAgICAgICAgICAgICBpZEZpZWxkOiBwcmVmaXggPT09IFwiXCIgPyBgJHtmcm9tQ29sfWAgOiBgJHtwcmVmaXh9X18ke2Zyb21Db2x9YCxcbiAgICAgICAgICAgICAgdG9UYWJsZTogcmVsRW50aXR5LnRhYmxlLFxuICAgICAgICAgICAgICB0b0NvbDogcmVsYXRpb24uam9pbkNvbHVtbixcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfSBlbHNlIGlmIChpc01hbnlUb01hbnlSZWxhdGlvblByb3AocmVsYXRpb24pKSB7XG4gICAgICAgICAgICBtYW55Sm9pbiA9IHtcbiAgICAgICAgICAgICAgZnJvbVRhYmxlOiB0aGlzLnRhYmxlLFxuICAgICAgICAgICAgICBmcm9tQ29sOiBcImlkXCIsXG4gICAgICAgICAgICAgIGlkRmllbGQ6IHByZWZpeCA9PT0gXCJcIiA/IGBpZGAgOiBgJHtwcmVmaXh9X19pZGAsXG4gICAgICAgICAgICAgIHRocm91Z2g6IHtcbiAgICAgICAgICAgICAgICB0YWJsZTogcmVsYXRpb24uam9pblRhYmxlLFxuICAgICAgICAgICAgICAgIGZyb21Db2w6IGAke2luZmxlY3Rpb24uc2luZ3VsYXJpemUodGhpcy50YWJsZSl9X2lkYCxcbiAgICAgICAgICAgICAgICB0b0NvbDogYCR7aW5mbGVjdGlvbi5zaW5ndWxhcml6ZShyZWxFbnRpdHkudGFibGUpfV9pZGAsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIHRvVGFibGU6IHJlbEVudGl0eS50YWJsZSxcbiAgICAgICAgICAgICAgdG9Db2w6IFwiaWRcIixcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcigpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHIubG9hZGVycy5wdXNoKHtcbiAgICAgICAgICAgIGFzOiBncm91cEtleSxcbiAgICAgICAgICAgIHRhYmxlOiByZWxFbnRpdHkudGFibGUsXG4gICAgICAgICAgICBtYW55Sm9pbixcbiAgICAgICAgICAgIG9uZUpvaW5zOiByZWxTdWJzZXRRdWVyeS5qb2lucyxcbiAgICAgICAgICAgIHNlbGVjdDogcmVsU3Vic2V0UXVlcnkuc2VsZWN0LFxuICAgICAgICAgICAgbG9hZGVyczogcmVsU3Vic2V0UXVlcnkubG9hZGVycyxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiByO1xuICAgICAgfSxcbiAgICAgIC8vIFNBRkVUWTog7Iqk7YKk66eIIOqygOymneqzvCDrqZTtg4DrjbDsnbTthLAg6rOE7JW97J20IOydtCDtg4DsnoXsnYQg67O07J6l7ZWp64uI64ukLlxuICAgICAge1xuICAgICAgICBzZWxlY3Q6IFtdLFxuICAgICAgICB2aXJ0dWFsOiBbXSxcbiAgICAgICAgam9pbnM6IFtdLFxuICAgICAgICBsb2FkZXJzOiBbXSxcbiAgICAgIH0gYXMgU3Vic2V0UXVlcnksXG4gICAgKTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgLypcbiAgICBGaWVsZEV4cHJbXSDsnYQgRW50aXR5UHJvcE5vZGVbXSDroZwg67OA7ZmYXG4gICovXG4gIGZpZWxkRXhwcnNUb1Byb3BOb2RlcyhmaWVsZEV4cHJzOiBzdHJpbmdbXSwgZW50aXR5OiBFbnRpdHkgPSB0aGlzKTogRW50aXR5UHJvcE5vZGVbXSB7XG4gICAgY29uc3QgZ3JvdXBzID0gZmllbGRFeHBycy5yZWR1Y2UoXG4gICAgICAocmVzdWx0LCBmaWVsZEV4cHIpID0+IHtcbiAgICAgICAgbGV0IGtleTogc3RyaW5nLCB2YWx1ZTogc3RyaW5nLCBlbHNlRXhwcjogc3RyaW5nW107XG4gICAgICAgIGlmIChmaWVsZEV4cHIuaW5jbHVkZXMoXCIuXCIpKSB7XG4gICAgICAgICAgW2tleSwgLi4uZWxzZUV4cHJdID0gZmllbGRFeHByLnNwbGl0KFwiLlwiKTtcbiAgICAgICAgICB2YWx1ZSA9IGVsc2VFeHByLmpvaW4oXCIuXCIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGtleSA9IFwiXCI7XG4gICAgICAgICAgdmFsdWUgPSBmaWVsZEV4cHI7XG4gICAgICAgIH1cbiAgICAgICAgcmVzdWx0W2tleV0gPSAocmVzdWx0W2tleV0gPz8gW10pLmNvbmNhdCh2YWx1ZSk7XG5cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgIH0sXG4gICAgICAvLyBTQUZFVFk6IOyKpO2CpOuniCDqsoDspp3qs7wg66mU7YOA642w7J207YSwIOqzhOyVveydtCDsnbQg7YOA7J6F7J2EIOuztOyepe2VqeuLiOuLpC5cbiAgICAgIHt9IGFzIHtcbiAgICAgICAgW2s6IHN0cmluZ106IHN0cmluZ1tdO1xuICAgICAgfSxcbiAgICApO1xuXG4gICAgcmV0dXJuIE9iamVjdC5rZXlzKGdyb3VwcykuZmxhdE1hcDxFbnRpdHlQcm9wTm9kZSwgRW50aXR5UHJvcE5vZGVbXT4oKGtleSkgPT4ge1xuICAgICAgY29uc3QgZ3JvdXBlZEZpZWxkRXhwcnMgPSBncm91cHNba2V5XTtcblxuICAgICAgLy8g7J2867CYIHByb3Ag7LKY66asXG4gICAgICBpZiAoa2V5ID09PSBcIlwiKSB7XG4gICAgICAgIHJldHVybiBncm91cGVkRmllbGRFeHBycy5tYXAoKHByb3BOYW1lKSA9PiB7XG4gICAgICAgICAgY29uc3QgcHJvcCA9IGVudGl0eS5wcm9wcy5maW5kKChwKSA9PiBwLm5hbWUgPT09IHByb3BOYW1lKTtcbiAgICAgICAgICBpZiAocHJvcCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICAgIGAke2VudGl0eS5pZH0gLS0g7J6Y66q765CcIEZpZWxkRXhwciAnJHtwcm9wTmFtZX0nICjsgqzsmqkg6rCA64ql7ZWcIHByb3BzOiAke2VudGl0eS5wcm9wcy5tYXAoKHApID0+IHAubmFtZSkuam9pbihcIiwgXCIpfSlgLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIG5vZGVUeXBlOiBcInBsYWluXCIgYXMgY29uc3QsXG4gICAgICAgICAgICBwcm9wLFxuICAgICAgICAgIH07XG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICAvLyByZWxhdGlvbiBwcm9wIOyymOumrFxuICAgICAgY29uc3QgcHJvcCA9IGVudGl0eS5wcm9wc0RpY3Rba2V5XTtcbiAgICAgIGlmICghaXNSZWxhdGlvblByb3AocHJvcCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGDsnpjrqrvrkJwgRmllbGRFeHByICR7a2V5fS4ke2dyb3VwZWRGaWVsZEV4cHJzWzBdfWApO1xuICAgICAgfVxuICAgICAgY29uc3QgcmVsRW50aXR5ID0gRW50aXR5TWFuYWdlci5nZXQocHJvcC53aXRoKTtcblxuICAgICAgLy8gcmVsYXRpb24gLU9uZSDsl5AgaWQg7ZWE65OcIO2VmOuCmOyduCDqsr3smrBcbiAgICAgIGlmIChpc0JlbG9uZ3NUb09uZVJlbGF0aW9uUHJvcChwcm9wKSB8fCBpc09uZVRvT25lUmVsYXRpb25Qcm9wKHByb3ApKSB7XG4gICAgICAgIGlmIChcbiAgICAgICAgICBncm91cGVkRmllbGRFeHBycy5sZW5ndGggPT09IDEgJiZcbiAgICAgICAgICAoZ3JvdXBlZEZpZWxkRXhwcnNbMF0gPT09IFwiaWRcIiB8fCBncm91cGVkRmllbGRFeHByc1swXSA9PT0gXCJpZD9cIilcbiAgICAgICAgKSB7XG4gICAgICAgICAgLy8gaWQg7ZWY64KY66eMIOyeiOuKlOyngCDssrTtgaztlbTshJwsIO2VmOuCmOunjCDsnojsnLzrqbQg7IOB7JyEIHByb3DsnLzroZwgaWTrpbwg66as7YS0XG4gICAgICAgICAgY29uc3QgaWRQcm9wID0gcmVsRW50aXR5LnByb3BzRGljdC5pZDtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgbm9kZVR5cGU6IFwicGxhaW5cIiBhcyBjb25zdCxcbiAgICAgICAgICAgIHByb3A6IHtcbiAgICAgICAgICAgICAgLi4uaWRQcm9wLFxuICAgICAgICAgICAgICBuYW1lOiBgJHtrZXl9X2lkYCxcbiAgICAgICAgICAgICAgbnVsbGFibGU6IHByb3AubnVsbGFibGUsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gLU9uZSDqt7jsmbjsnZgg6rK97JqwIG9iamVjdOuhnCDrpqzthLRcbiAgICAgIC8vIC1NYW557J2YIOqyveyasCBhcnJheeuhnCDrpqzthLRcbiAgICAgIC8vIFJlY3Vyc2l2ZSDroZwg646B7IqkIOyymOumrFxuICAgICAgY29uc3QgY2hpbGRyZW4gPSB0aGlzLmZpZWxkRXhwcnNUb1Byb3BOb2Rlcyhncm91cGVkRmllbGRFeHBycywgcmVsRW50aXR5KTtcbiAgICAgIGNvbnN0IG5vZGVUeXBlID1cbiAgICAgICAgaXNCZWxvbmdzVG9PbmVSZWxhdGlvblByb3AocHJvcCkgfHwgaXNPbmVUb09uZVJlbGF0aW9uUHJvcChwcm9wKVxuICAgICAgICAgID8gKFwib2JqZWN0XCIgYXMgY29uc3QpXG4gICAgICAgICAgOiAoXCJhcnJheVwiIGFzIGNvbnN0KTtcblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgbm9kZVR5cGUsXG4gICAgICAgIHByb3AsXG4gICAgICAgIGNoaWxkcmVuLFxuICAgICAgfTtcbiAgICB9KTtcbiAgfVxuXG4gIGdldEZpZWxkRXhwcnMocHJlZml4ID0gXCJcIiwgbWF4RGVwdGg6IG51bWJlciA9IDMsIGZyb21zOiBzdHJpbmdbXSA9IFtdKTogc3RyaW5nW10ge1xuICAgIHJldHVybiB0aGlzLnByb3BzXG4gICAgICAuZmxhdE1hcCgocHJvcCkgPT4ge1xuICAgICAgICBjb25zdCBwcm9wTmFtZSA9IFtwcmVmaXgsIHByb3AubmFtZV0uZmlsdGVyKCh2KSA9PiB2ICE9PSBcIlwiKS5qb2luKFwiLlwiKTtcbiAgICAgICAgaWYgKHByb3BOYW1lID09PSBwcmVmaXgpIHtcbiAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaXNSZWxhdGlvblByb3AocHJvcCkpIHtcbiAgICAgICAgICBpZiAobWF4RGVwdGggPCAwKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGZyb21zLmluY2x1ZGVzKHByb3Aud2l0aCkpIHtcbiAgICAgICAgICAgIC8vIOyXreuwqe2WpSByZWxhdGlvbuyduCDqsr3smrAg7KCc7Jm4XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICB9XG4gICAgICAgICAgLy8g7KCV67Cp7ZalIHJlbGF0aW9u7J24IOqyveyasCByZWN1cnNpdmUg7L2cXG4gICAgICAgICAgY29uc3QgcmVsTWQgPSBFbnRpdHlNYW5hZ2VyLmdldChwcm9wLndpdGgpO1xuICAgICAgICAgIHJldHVybiByZWxNZC5nZXRGaWVsZEV4cHJzKHByb3BOYW1lLCBtYXhEZXB0aCAtIDEsIFsuLi5mcm9tcywgdGhpcy5pZF0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBwcm9wTmFtZTtcbiAgICAgIH0pXG4gICAgICAuZmlsdGVyKChmKSA9PiBmICE9PSBudWxsKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWxhdGlvbiBwcm9w7J20IO2YhOyerCDthYzsnbTruJTsl5AgRksg7Lus65+87J2EIOyDneyEse2VmOuKlOyngCDtmZXsnbhcbiAgICooQmVsb25nc1RvT25lIOuYkOuKlCBPbmVUb09uZShoYXNKb2luQ29sdW1uPXRydWUp7J24IOqyveyasCBGSyDsg53shLEpXG4gICAqL1xuICBwcml2YXRlIGhhc0ZvcmVpZ25LZXkocHJvcDogUmVsYXRpb25Qcm9wKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIChcbiAgICAgIHByb3AucmVsYXRpb25UeXBlID09PSBcIkJlbG9uZ3NUb09uZVwiIHx8XG4gICAgICAocHJvcC5yZWxhdGlvblR5cGUgPT09IFwiT25lVG9PbmVcIiAmJiBwcm9wLmhhc0pvaW5Db2x1bW4pXG4gICAgKTtcbiAgfVxuXG4gIGdldFRhYmxlQ29sdW1ucygpOiB7IG5hbWU6IHN0cmluZzsgdHlwZTogc3RyaW5nIH1bXSB7XG4gICAgcmV0dXJuIHRoaXMucHJvcHNcbiAgICAgIC5tYXAoKHByb3ApID0+IHtcbiAgICAgICAgaWYgKHByb3AudHlwZSA9PT0gXCJyZWxhdGlvblwiKSB7XG4gICAgICAgICAgaWYgKHRoaXMuaGFzRm9yZWlnbktleShwcm9wKSkge1xuICAgICAgICAgICAgcmV0dXJuIHsgbmFtZTogYCR7cHJvcC5uYW1lfV9pZGAsIHR5cGU6IFwiaW50X3Vuc2lnbmVkXCIgfTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7IG5hbWU6IHByb3AubmFtZSwgdHlwZTogcHJvcC50eXBlIH07XG4gICAgICB9KVxuICAgICAgLmZpbHRlcihub25OdWxsYWJsZSk7XG4gIH1cblxuICAvKipcbiAgICogRW50aXR57JeQIOygleydmOuQnCDrqqjrk6AgdmVjdG9yIO2DgOyehSDsu6zrn7wg67CY7ZmYXG4gICAqL1xuICBnZXRWZWN0b3JDb2x1bW5zKCk6IEVudGl0eVByb3BbXSB7XG4gICAgcmV0dXJuIHRoaXMucHJvcHMuZmlsdGVyKChwKSA9PiBwLnR5cGUgPT09IFwidmVjdG9yXCIpO1xuICB9XG5cbiAgLyoqXG4gICAqIO2KueyglSB2ZWN0b3Ig7Lus65+8IOuwmO2ZmFxuICAgKiBAcGFyYW0gY29sdW1uTmFtZSAtIOy7rOufvOuqhSAo7IOd6561IOyLnCDssqsg67KI7Ke4IHZlY3RvciDsu6zrn7wpXG4gICAqL1xuICBnZXRWZWN0b3JDb2x1bW4oY29sdW1uTmFtZT86IHN0cmluZyk6IEVudGl0eVByb3AgfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IHZlY3RvclByb3BzID0gdGhpcy5nZXRWZWN0b3JDb2x1bW5zKCk7XG4gICAgaWYgKGNvbHVtbk5hbWUpIHtcbiAgICAgIHJldHVybiB2ZWN0b3JQcm9wcy5maW5kKChwKSA9PiBwLm5hbWUgPT09IGNvbHVtbk5hbWUpO1xuICAgIH1cbiAgICByZXR1cm4gdmVjdG9yUHJvcHNbMF07XG4gIH1cblxuICAvKipcbiAgICog7ZWE7YSw66eBIOqwgOuKpe2VnCBwcm9wcyDrsJjtmZhcbiAgICpcbiAgICogLSDsnbzrsJggcHJvcFxuICAgKiAtIEZL66W8IOyDneyEse2VmOuKlCByZWxhdGlvbiAoQmVsb25nc1RvT25lLCBPbmVUb09uZSB3aXRoIGhhc0pvaW5Db2x1bW4pXG4gICAqICAg4oaSIHtuYW1lfV9pZCDtmJXtg5zsnZgg6rCA7IOBIGludGVnZXIgcHJvcOycvOuhnCDrs4DtmZhcbiAgICovXG4gIGdldEZpbHRlcmFibGVQcm9wcygpOiBFbnRpdHlQcm9wW10ge1xuICAgIHJldHVybiB0aGlzLnByb3BzLmZsYXRNYXAoKHByb3ApOiBFbnRpdHlQcm9wIHwgRW50aXR5UHJvcFtdID0+IHtcbiAgICAgIC8vIFZpcnR1YWwgcHJvcCDsoJzsmbhcbiAgICAgIGlmIChpc1ZpcnR1YWxQcm9wKHByb3ApKSB7XG4gICAgICAgIHJldHVybiBbXTtcbiAgICAgIH1cblxuICAgICAgLy8gUmVsYXRpb24gcHJvcCDsspjrpqxcbiAgICAgIGlmIChpc1JlbGF0aW9uUHJvcChwcm9wKSkge1xuICAgICAgICAvLyBGS+ulvCDsg53shLHtlZjripQgcmVsYXRpb27rp4wg7Y+s7ZWoXG4gICAgICAgIGlmICh0aGlzLmhhc0ZvcmVpZ25LZXkocHJvcCkpIHtcbiAgICAgICAgICAvLyBTQUZFVFk6IOyKpO2CpOuniCDqsoDspp3qs7wg66mU7YOA642w7J207YSwIOqzhOyVveydtCDsnbQg7YOA7J6F7J2EIOuztOyepe2VqeuLiOuLpC5cbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgbmFtZTogYCR7cHJvcC5uYW1lfV9pZGAsXG4gICAgICAgICAgICB0eXBlOiBcImludGVnZXJcIixcbiAgICAgICAgICAgIG51bGxhYmxlOiBwcm9wLm51bGxhYmxlLFxuICAgICAgICAgIH0gYXMgRW50aXR5UHJvcDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gW107XG4gICAgICB9XG5cbiAgICAgIC8vIOydvOuwmCBwcm9wIOyymOumrFxuICAgICAgcmV0dXJuIHByb3A7XG4gICAgfSk7XG4gIH1cblxuICBhc3luYyByZWdpc3Rlck1vZHVsZVBhdGhzKCkge1xuICAgIGNvbnN0IGJhc2VQYXRoID0gYCR7dGhpcy5uYW1lcy5wYXJlbnRGc31gO1xuXG4gICAgLy8gYmFzZS1zY2hlbWVcbiAgICBFbnRpdHlNYW5hZ2VyLnNldE1vZHVsZVBhdGgoYCR7dGhpcy5pZH1CYXNlU2NoZW1hYCwgYHNvbmFtdS5nZW5lcmF0ZWRgKTtcblxuICAgIC8vIHN1YnNldFxuICAgIGlmIChPYmplY3Qua2V5cyh0aGlzLnN1YnNldHMpLmxlbmd0aCA+IDApIHtcbiAgICAgIEVudGl0eU1hbmFnZXIuc2V0TW9kdWxlUGF0aChgJHt0aGlzLmlkfVN1YnNldEtleWAsIGBzb25hbXUuZ2VuZXJhdGVkYCk7XG4gICAgICBFbnRpdHlNYW5hZ2VyLnNldE1vZHVsZVBhdGgoYCR7dGhpcy5pZH1TdWJzZXRNYXBwaW5nYCwgYHNvbmFtdS5nZW5lcmF0ZWRgKTtcbiAgICAgIGZvciAoY29uc3Qgc3Vic2V0S2V5IG9mIE9iamVjdC5rZXlzKHRoaXMuc3Vic2V0cykpIHtcbiAgICAgICAgRW50aXR5TWFuYWdlci5zZXRNb2R1bGVQYXRoKFxuICAgICAgICAgIGAke3RoaXMuaWR9U3Vic2V0JHtzdWJzZXRLZXkudG9VcHBlckNhc2UoKX1gLFxuICAgICAgICAgIGBzb25hbXUuZ2VuZXJhdGVkYCxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBlbnVtc1xuICAgIGZvciAoY29uc3QgZW51bUlkIG9mIE9iamVjdC5rZXlzKHRoaXMuZW51bUxhYmVscykpIHtcbiAgICAgIEVudGl0eU1hbmFnZXIuc2V0TW9kdWxlUGF0aChlbnVtSWQsIGBzb25hbXUuZ2VuZXJhdGVkYCk7XG4gICAgfVxuXG4gICAgLy8gdHlwZXNcbiAgICBjb25zdCB0eXBlc01vZHVsZVBhdGggPSBgJHtiYXNlUGF0aH0vJHt0aGlzLm5hbWVzLnBhcmVudEZzfS50eXBlc2A7XG4gICAgY29uc3QgdHlwZXNGaWxlUGF0aCA9IHBhdGguam9pbihcbiAgICAgIFNvbmFtdS5hcGlSb290UGF0aCxcbiAgICAgIHJ1bnRpbWVQYXRoKGBkaXN0L2FwcGxpY2F0aW9uLyR7dHlwZXNNb2R1bGVQYXRofS5qc2ApLFxuICAgICk7XG5cbiAgICBpZiAoYXdhaXQgZXhpc3RzKHR5cGVzRmlsZVBhdGgpKSB7XG4gICAgICBjb25zdCBpbXBvcnRlZE1lbWJlcnMgPSBhd2FpdCBpbXBvcnRNZW1iZXJzPHouWm9kVHlwZUFueT4odHlwZXNGaWxlUGF0aCk7XG4gICAgICAvLyBTQUZFVFk6IOyKpO2CpOuniCDqsoDspp3qs7wg66mU7YOA642w7J207YSwIOqzhOyVveydtCDsnbQg7YOA7J6F7J2EIOuztOyepe2VqeuLiOuLpC5cbiAgICAgIHRoaXMudHlwZXMgPSBPYmplY3QuZnJvbUVudHJpZXMoXG4gICAgICAgIGltcG9ydGVkTWVtYmVycy5tYXAoKHsgbmFtZSwgdmFsdWUgfSkgPT4ge1xuICAgICAgICAgIEVudGl0eU1hbmFnZXIuc2V0TW9kdWxlUGF0aChuYW1lLCB0eXBlc01vZHVsZVBhdGgpO1xuICAgICAgICAgIHJldHVybiBbbmFtZSwgdmFsdWVdO1xuICAgICAgICB9KSxcbiAgICAgICkgYXMgeyBbbmFtZTogc3RyaW5nXTogei5ab2RUeXBlQW55IH07XG4gICAgfVxuICB9XG5cbiAgcmVnaXN0ZXJUYWJsZVNwZWNzKCk6IHZvaWQge1xuICAgIC8vIOyhsOyduCDthYzsnbTruJQg7J24642x7IqkIOygnOyZuCAo7Lus65+8IOydtOumhOyXkCAnLifsnbQg7Y+s7ZWo65CcIOqyveyasClcbiAgICBjb25zdCB1bmlxdWVJbmRleGVzID0gdGhpcy5pbmRleGVzXG4gICAgICAuZmlsdGVyKChpZHgpID0+IGlkeC50eXBlID09PSBcInVuaXF1ZVwiKVxuICAgICAgLmZpbHRlcigoaWR4KSA9PiBpZHguY29sdW1ucy5ldmVyeSgoY29sKSA9PiAhY29sLm5hbWUuaW5jbHVkZXMoXCIuXCIpKSk7XG5cbiAgICBFbnRpdHlNYW5hZ2VyLnNldFRhYmxlU3BlYyh7XG4gICAgICBuYW1lOiB0aGlzLnRhYmxlLFxuICAgICAgdW5pcXVlSW5kZXhlcyxcbiAgICAgIGpzb25Db2x1bW5zOiB0aGlzLnByb3BzLmZpbHRlcigocCkgPT4gcC50eXBlID09PSBcImpzb25cIikubWFwKChwKSA9PiBwLm5hbWUpLFxuICAgIH0pO1xuICB9XG5cbiAgdG9Kc29uKCk6IEVudGl0eUpzb24ge1xuICAgIC8vIHN1YnNldHPsmYAgc3Vic2V0c0ludGVybmFs7J2EIFN1YnNldERlZiDtmJXtg5zroZwg67O17JuQIChjb25lIO2PrO2VqClcbiAgICBjb25zdCBzdWJzZXRzOiB7IFtrZXk6IHN0cmluZ106IGltcG9ydChcIi4uL3R5cGVzL3R5cGVzXCIpLlN1YnNldERlZiB9ID0ge307XG4gICAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXModGhpcy5zdWJzZXRzKSkge1xuICAgICAgY29uc3Qgbm9ybWFsRmllbGRzOiBTdWJzZXRGaWVsZFtdID0gdGhpcy5zdWJzZXRzW2tleV07XG4gICAgICBjb25zdCBpbnRlcm5hbEZpZWxkczogU3Vic2V0RmllbGRbXSA9ICh0aGlzLnN1YnNldHNJbnRlcm5hbFtrZXldID8/IFtdKS5tYXAoKGZpZWxkKSA9PiAoe1xuICAgICAgICBmaWVsZCxcbiAgICAgICAgaW50ZXJuYWw6IHRydWUsXG4gICAgICB9KSk7XG4gICAgICBjb25zdCBmaWVsZHMgPSBbLi4ubm9ybWFsRmllbGRzLCAuLi5pbnRlcm5hbEZpZWxkc107XG5cbiAgICAgIC8vIGNvbmXsnbQg7J6I7Jy866m0IOyDiOuhnOyatCDqsJ3ssrQg7ZiV7YOc66GcLCDsl4bsnLzrqbQg67Cw7Je0IO2Yle2DnOuhnFxuICAgICAgaWYgKHRoaXMuc3Vic2V0Q29uZXNba2V5XSkge1xuICAgICAgICBzdWJzZXRzW2tleV0gPSB7XG4gICAgICAgICAgZmllbGRzLFxuICAgICAgICAgIGNvbmU6IHRoaXMuc3Vic2V0Q29uZXNba2V5XSxcbiAgICAgICAgfTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHN1YnNldHNba2V5XSA9IGZpZWxkcztcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBlbnVtc+ulvCBFbnVtRGVmIO2Yle2DnOuhnCDrs7Xsm5AgKGNvbmUg7Y+s7ZWoKVxuICAgIGNvbnN0IGVudW1zOiB7IFtrZXk6IHN0cmluZ106IGltcG9ydChcIi4uL3R5cGVzL3R5cGVzXCIpLkVudW1EZWYgfSA9IHt9O1xuICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVzXSBvZiBPYmplY3QuZW50cmllcyh0aGlzLmVudW1MYWJlbHMpKSB7XG4gICAgICAvLyBjb25l7J20IOyeiOycvOuptCDsg4jroZzsmrQg6rCd7LK0IO2Yle2DnOuhnCwg7JeG7Jy866m0IFJlY29yZCDtmJXtg5zroZxcbiAgICAgIGlmICh0aGlzLmVudW1Db25lc1trZXldKSB7XG4gICAgICAgIGVudW1zW2tleV0gPSB7XG4gICAgICAgICAgdmFsdWVzLFxuICAgICAgICAgIGNvbmU6IHRoaXMuZW51bUNvbmVzW2tleV0sXG4gICAgICAgIH07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBlbnVtc1trZXldID0gdmFsdWVzO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBpZDogdGhpcy5pZCxcbiAgICAgIHBhcmVudElkOiB0aGlzLnBhcmVudElkLFxuICAgICAgdGFibGU6IHRoaXMudGFibGUsXG4gICAgICB0aXRsZTogdGhpcy50aXRsZSxcbiAgICAgIGNvbmU6IHRoaXMuY29uZSxcbiAgICAgIHByb3BzOiB0aGlzLnByb3BzLFxuICAgICAgaW5kZXhlczogdGhpcy5pbmRleGVzLFxuICAgICAgc3Vic2V0cyxcbiAgICAgIGVudW1zLFxuICAgIH07XG4gIH1cblxuICBhc3luYyBzYXZlKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIC8vIHNvcnQ6IHN1YnNldHNcbiAgICBjb25zdCBzdWJzZXRSb3dzID0gdGhpcy5nZXRTdWJzZXRSb3dzKCk7XG4gICAgdGhpcy5zdWJzZXRzID0gT2JqZWN0LmZyb21FbnRyaWVzKFxuICAgICAgT2JqZWN0LmVudHJpZXModGhpcy5zdWJzZXRzKS5tYXAoKFtzdWJzZXRLZXldKSA9PiB7XG4gICAgICAgIHJldHVybiBbc3Vic2V0S2V5LCB0aGlzLnN1YnNldFJvd3NUb1N1YnNldEZpZWxkcyhzdWJzZXRSb3dzLCBzdWJzZXRLZXksIGZhbHNlKV07XG4gICAgICB9KSxcbiAgICApO1xuICAgIHRoaXMuc3Vic2V0c0ludGVybmFsID0gT2JqZWN0LmZyb21FbnRyaWVzKFxuICAgICAgT2JqZWN0LmVudHJpZXModGhpcy5zdWJzZXRzSW50ZXJuYWwpLm1hcCgoW3N1YnNldEtleV0pID0+IHtcbiAgICAgICAgcmV0dXJuIFtzdWJzZXRLZXksIHRoaXMuc3Vic2V0Um93c1RvU3Vic2V0RmllbGRzKHN1YnNldFJvd3MsIHN1YnNldEtleSwgdHJ1ZSldO1xuICAgICAgfSksXG4gICAgKTtcblxuICAgIC8vIHNhdmVcbiAgICBjb25zdCBqc29uUGF0aCA9IHBhdGguam9pbihcbiAgICAgIFNvbmFtdS5hcGlSb290UGF0aCxcbiAgICAgIGBzcmMvYXBwbGljYXRpb24vJHt0aGlzLm5hbWVzLnBhcmVudEZzfS8ke3RoaXMubmFtZXMuZnN9LmVudGl0eS5qc29uYCxcbiAgICApO1xuICAgIGNvbnN0IGpzb24gPSB0aGlzLnRvSnNvbigpO1xuICAgIGF3YWl0IHdyaXRlRmlsZShqc29uUGF0aCwgYXdhaXQgZm9ybWF0Q29kZShKU09OLnN0cmluZ2lmeShqc29uKSwganNvblBhdGgpKTtcblxuICAgIC8vIHJlbG9hZFxuICAgIGF3YWl0IEVudGl0eU1hbmFnZXIucmVnaXN0ZXIoanNvbik7XG4gIH1cblxuICAvKipcbiAgICog7YWc7ZSM66a/IGNvbmUg66mU7YOA642w7J207YSw66W8IOyDneyEse2VqeuLiOuLpC5cbiAgICpcbiAgICogTExN7J2EIOyCrOyaqe2VmOyngCDslYrqs6AgZmFrZXItbWFwcGluZ3MudHPrpbwg7Zmc7Jqp7ZWY7JesIOq4sOuzuCBjb25l7J2EIOyDneyEse2VqeuLiOuLpC5cbiAgICogc3R1YiBlbnRpdHkg7IOd7ISxIOyLnCDsnpDrj5nsnLzroZwg7Zi47Lac65CY7Ja0IOy1nOyGjO2VnOydmCBjb25lIOuplO2DgOuNsOydtO2EsOulvCDsoJzqs7Xtlanri4jri6QuXG4gICAqXG4gICAqIEBwYXJhbSBsb2NhbGUgLSDsg53shLEg7IucIOyCrOyaqe2VoCBsb2NhbGUgKOq4sOuzuOqwkjogU29uYW11LmNvbmZpZy5pMThuLmRlZmF1bHRMb2NhbGUg65iQ64qUIFwia29cIilcbiAgICovXG4gIGFzeW5jIGdlbmVyYXRlVGVtcGxhdGVDb25lcyhsb2NhbGU/OiBcImtvXCIgfCBcImVuXCIgfCBcImphXCIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCB7IGdlbmVyYXRlVGVtcGxhdGVDb25lcyB9ID0gYXdhaXQgaW1wb3J0KFwiLi9lbnRpdHktdGVtcGxhdGUtY29uZVwiKTtcbiAgICBjb25zdCBjb25maWdMb2NhbGUgPSBTb25hbXUuY29uZmlnLmkxOG4/LmRlZmF1bHRMb2NhbGU7XG4gICAgY29uc3QgZWZmZWN0aXZlTG9jYWxlID1cbiAgICAgIGxvY2FsZSB8fFxuICAgICAgKGNvbmZpZ0xvY2FsZSA9PT0gXCJrb1wiIHx8IGNvbmZpZ0xvY2FsZSA9PT0gXCJlblwiIHx8IGNvbmZpZ0xvY2FsZSA9PT0gXCJqYVwiXG4gICAgICAgID8gY29uZmlnTG9jYWxlXG4gICAgICAgIDogXCJrb1wiKTtcbiAgICBjb25zdCByZXN1bHQgPSBnZW5lcmF0ZVRlbXBsYXRlQ29uZXModGhpcy50b0pzb24oKSwgZWZmZWN0aXZlTG9jYWxlKTtcblxuICAgIC8vIOqysOqzvOulvCBFbnRpdHnsl5Ag7KCB7JqpIChhcHBseUNvbmVz7JmAIOuPmeydvO2VnCDrsKnsi50pXG4gICAgaWYgKHJlc3VsdC5lbnRpdHlDb25lKSB7XG4gICAgICB0aGlzLmNvbmUgPSByZXN1bHQuZW50aXR5Q29uZTtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IFtwcm9wTmFtZSwgY29uZV0gb2YgT2JqZWN0LmVudHJpZXMocmVzdWx0LnByb3BDb25lcykpIHtcbiAgICAgIGNvbnN0IHByb3AgPSB0aGlzLnByb3BzLmZpbmQoKHApID0+IHAubmFtZSA9PT0gcHJvcE5hbWUpO1xuICAgICAgaWYgKHByb3ApIHtcbiAgICAgICAgLy8gU0FGRVRZOiDsiqTtgqTrp4gg6rKA7Kad6rO8IOuplO2DgOuNsOydtO2EsCDqs4Tslb3snbQg7J20IO2DgOyeheydhCDrs7TsnqXtlanri4jri6QuXG4gICAgICAgIChwcm9wIGFzIHsgY29uZT86IENvbmUgfSkuY29uZSA9IGNvbmU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5lbnVtQ29uZXMgPSB7IC4uLnRoaXMuZW51bUNvbmVzLCAuLi5yZXN1bHQuZW51bUNvbmVzIH07XG4gICAgdGhpcy5zdWJzZXRDb25lcyA9IHsgLi4udGhpcy5zdWJzZXRDb25lcywgLi4ucmVzdWx0LnN1YnNldENvbmVzIH07XG5cbiAgICBhd2FpdCB0aGlzLnNhdmUoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBMTE3snYQg7IKs7Jqp7ZWY7JesIGNvbmUg66mU7YOA642w7J207YSw66W8IOyDneyEse2VqeuLiOuLpC5cbiAgICpcbiAgICogQHBhcmFtIG9wdGlvbnMucHJlc2VydmVFeGlzdGluZyAtIOq4sOyhtCBjb25lIOuztOyhtCDsl6zrtoAgKOq4sOuzuOqwkjogdHJ1ZSlcbiAgICogQHBhcmFtIG9wdGlvbnMub25seUVtcHR5IC0gZml4dHVyZUhpbnTqsIAg7JeG64qUIGNvbmXrp4wg7IOd7ISxICjquLDrs7jqsJI6IGZhbHNlKVxuICAgKiBAcGFyYW0gb3B0aW9ucy5sb2NhbGUgLSDsg53shLEg7IucIOyCrOyaqe2VoCBsb2NhbGUgKOq4sOuzuOqwkjogXCJrb1wiKVxuICAgKi9cbiAgYXN5bmMgZ2VuZXJhdGVDb25lcyhvcHRpb25zPzoge1xuICAgIHByZXNlcnZlRXhpc3Rpbmc/OiBib29sZWFuO1xuICAgIG9ubHlFbXB0eT86IGJvb2xlYW47XG4gICAgbG9jYWxlPzogXCJrb1wiIHwgXCJlblwiIHwgXCJqYVwiO1xuICAgIC8qKiDthYzsiqTtirjrgpgg64yA7LK0IExMTSDqs7XquInsnpDrpbwg7JyE7ZWcIO2FjeyKpO2KuCDsg53shLEg6rWs7ZiEICovXG4gICAgZ2VuZXJhdGVUZXh0PzogaW1wb3J0KFwiLi4vY29uZS9jb25lLWdlbmVyYXRvclwiKS5Db25lVGV4dEdlbmVyYXRvcjtcbiAgICAvKiogZmFsc2XsnbTrqbQg7IOd7ISxIOqysOqzvOulvCDrqZTrqqjrpqzsl5Drp4wg7KCB7Jqp7ZWY6rOgIGVudGl0eSDtjIzsnbzsnYAg7KCA7J6l7ZWY7KeAIOyViuyKteuLiOuLpC4gKi9cbiAgICBwZXJzaXN0PzogYm9vbGVhbjtcbiAgfSk6IFByb21pc2U8aW1wb3J0KFwiLi4vY29uZS9jb25lLWdlbmVyYXRvclwiKS5Db25lR2VuZXJhdGlvblJlc3VsdD4ge1xuICAgIGNvbnN0IHsgZ2VuZXJhdGVDb25lcyB9ID0gYXdhaXQgaW1wb3J0KFwiLi4vY29uZS9jb25lLWdlbmVyYXRvclwiKTtcbiAgICBjb25zdCBjb250ZXh0OiBpbXBvcnQoXCIuLi9jb25lL2NvbmUtZ2VuZXJhdG9yXCIpLkNvbmVHZW5lcmF0aW9uQ29udGV4dCA9IHtcbiAgICAgIGVudGl0eTogdGhpcy50b0pzb24oKSxcbiAgICAgIGxvY2FsZTogb3B0aW9ucz8ubG9jYWxlIHx8IFwia29cIixcbiAgICAgIGV4aXN0aW5nQ29uZXM6IG9wdGlvbnM/LnByZXNlcnZlRXhpc3RpbmcgIT09IGZhbHNlID8gdGhpcy5jb2xsZWN0RXhpc3RpbmdDb25lcygpIDogdW5kZWZpbmVkLFxuICAgICAgb25seUVtcHR5OiBvcHRpb25zPy5vbmx5RW1wdHkgPz8gZmFsc2UsXG4gICAgfTtcblxuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGdlbmVyYXRlQ29uZXMoY29udGV4dCwgeyBnZW5lcmF0ZVRleHQ6IG9wdGlvbnM/LmdlbmVyYXRlVGV4dCB9KTtcbiAgICB0aGlzLmFwcGx5Q29uZXMocmVzdWx0KTtcbiAgICBpZiAob3B0aW9ucz8ucGVyc2lzdCAhPT0gZmFsc2UpIHtcbiAgICAgIGF3YWl0IHRoaXMuc2F2ZSgpO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgLyoqXG4gICAqIOq4sOyhtCBjb25l65Ok7J2EIOyImOynke2VqeuLiOuLpCAoZW50aXR5LCBwcm9wcywgZW51bXMsIHN1YnNldHMpLlxuICAgKlxuICAgKiBAcmV0dXJucyDtgqTqsIAgXCJlbnRpdHk6aWRcIiwgXCJwcm9wOm5hbWVcIiwgXCJlbnVtOmVudW1JZFwiLCBcInN1YnNldDprZXlcIiDtmJXsi53snbggY29uZSDrp7VcbiAgICovXG4gIGNvbGxlY3RFeGlzdGluZ0NvbmVzKCk6IFJlY29yZDxzdHJpbmcsIENvbmU+IHtcbiAgICBjb25zdCBjb25lRW50cmllczogW3N0cmluZywgQ29uZV1bXSA9IFtdO1xuXG4gICAgaWYgKHRoaXMuY29uZSkge1xuICAgICAgY29uZUVudHJpZXMucHVzaChbYGVudGl0eToke3RoaXMuaWR9YCwgdGhpcy5jb25lXSk7XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBwcm9wIG9mIHRoaXMucHJvcHMpIHtcbiAgICAgIGlmIChwcm9wLmNvbmUpIHtcbiAgICAgICAgY29uZUVudHJpZXMucHVzaChbYHByb3A6JHtwcm9wLm5hbWV9YCwgcHJvcC5jb25lXSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBbZW51bUlkLCBjb25lXSBvZiBPYmplY3QuZW50cmllcyh0aGlzLmVudW1Db25lcykpIHtcbiAgICAgIGNvbmVFbnRyaWVzLnB1c2goW2BlbnVtOiR7ZW51bUlkfWAsIGNvbmVdKTtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IFtzdWJzZXRLZXksIGNvbmVdIG9mIE9iamVjdC5lbnRyaWVzKHRoaXMuc3Vic2V0Q29uZXMpKSB7XG4gICAgICBjb25lRW50cmllcy5wdXNoKFtgc3Vic2V0OiR7c3Vic2V0S2V5fWAsIGNvbmVdKTtcbiAgICB9XG5cbiAgICByZXR1cm4gT2JqZWN0LmZyb21FbnRyaWVzKGNvbmVFbnRyaWVzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDsg53shLHrkJwgY29uZeuTpOydhCBFbnRpdHnsl5Ag7KCB7Jqp7ZWp64uI64ukLlxuICAgKlxuICAgKiBAcGFyYW0gcmVzdWx0IC0gTExN7Jy866GcIOyDneyEseuQnCBjb25lIOqysOqzvFxuICAgKi9cbiAgYXBwbHlDb25lcyhyZXN1bHQ6IGltcG9ydChcIi4uL2NvbmUvY29uZS1nZW5lcmF0b3JcIikuQ29uZUdlbmVyYXRpb25SZXN1bHQpOiB2b2lkIHtcbiAgICBpZiAocmVzdWx0LmVudGl0eUNvbmUpIHtcbiAgICAgIHRoaXMuY29uZSA9IHJlc3VsdC5lbnRpdHlDb25lO1xuICAgIH1cblxuICAgIGZvciAoY29uc3QgW3Byb3BOYW1lLCBjb25lXSBvZiBPYmplY3QuZW50cmllcyhyZXN1bHQucHJvcENvbmVzKSkge1xuICAgICAgY29uc3QgcHJvcCA9IHRoaXMucHJvcHMuZmluZCgocCkgPT4gcC5uYW1lID09PSBwcm9wTmFtZSk7XG4gICAgICBpZiAocHJvcCkge1xuICAgICAgICAvLyBTQUZFVFk6IOyKpO2CpOuniCDqsoDspp3qs7wg66mU7YOA642w7J207YSwIOqzhOyVveydtCDsnbQg7YOA7J6F7J2EIOuztOyepe2VqeuLiOuLpC5cbiAgICAgICAgKHByb3AgYXMgeyBjb25lPzogQ29uZSB9KS5jb25lID0gY29uZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLmVudW1Db25lcyA9IHsgLi4udGhpcy5lbnVtQ29uZXMsIC4uLnJlc3VsdC5lbnVtQ29uZXMgfTtcbiAgICB0aGlzLnN1YnNldENvbmVzID0geyAuLi50aGlzLnN1YnNldENvbmVzLCAuLi5yZXN1bHQuc3Vic2V0Q29uZXMgfTtcbiAgfVxuXG4gIGdldFN1YnNldFJvd3MoXG4gICAgX3N1YnNldHM/OiB7IFtrZXk6IHN0cmluZ106IHN0cmluZ1tdIH0sXG4gICAgX3N1YnNldHNJbnRlcm5hbD86IHsgW2tleTogc3RyaW5nXTogc3RyaW5nW10gfSxcbiAgICBwcmVmaXhlczogc3RyaW5nW10gPSBbXSxcbiAgKTogRW50aXR5U3Vic2V0Um93W10ge1xuICAgIGlmIChwcmVmaXhlcy5sZW5ndGggPiAxMCkge1xuICAgICAgcmV0dXJuIFtdO1xuICAgIH1cblxuICAgIGNvbnN0IHN1YnNldHMgPSBfc3Vic2V0cyA/PyB0aGlzLnN1YnNldHM7XG4gICAgY29uc3Qgc3Vic2V0c0ludGVybmFsID0gX3N1YnNldHNJbnRlcm5hbCA/PyB0aGlzLnN1YnNldHNJbnRlcm5hbDtcbiAgICBjb25zdCBzdWJzZXRLZXlzID0gT2JqZWN0LmtleXMoc3Vic2V0cyk7XG4gICAgY29uc3QgYWxsRmllbGRzID0gdW5pcXVlKHN1YnNldEtleXMuZmxhdE1hcCgoa2V5KSA9PiBzdWJzZXRzW2tleV0pKTtcbiAgICAvLyBpbnRlcm5hbCDtlYTrk5zrj4QgYWxsRmllbGRz7JeQIO2PrO2VqCAocmVsYXRpb24g7YOQ7IOJ7JqpKVxuICAgIGNvbnN0IGFsbEludGVybmFsRmllbGRzID0gdW5pcXVlKHN1YnNldEtleXMuZmxhdE1hcCgoa2V5KSA9PiBzdWJzZXRzSW50ZXJuYWxba2V5XSA/PyBbXSkpO1xuICAgIGNvbnN0IGNvbWJpbmVkRmllbGRzID0gdW5pcXVlKFsuLi5hbGxGaWVsZHMsIC4uLmFsbEludGVybmFsRmllbGRzXSk7XG5cbiAgICByZXR1cm4gdGhpcy5wcm9wcy5tYXAoKHByb3ApID0+IHtcbiAgICAgIGlmIChcbiAgICAgICAgcHJvcC50eXBlID09PSBcInJlbGF0aW9uXCIgJiZcbiAgICAgICAgY29tYmluZWRGaWVsZHMuZmluZCgoZikgPT4gZi5zdGFydHNXaXRoKGAke1suLi5wcmVmaXhlcywgcHJvcC5uYW1lXS5qb2luKFwiLlwiKX0uYCkpXG4gICAgICApIHtcbiAgICAgICAgY29uc3QgcmVsRW50aXR5ID0gRW50aXR5TWFuYWdlci5nZXQocHJvcC53aXRoKTtcbiAgICAgICAgY29uc3QgY2hpbGRyZW4gPSByZWxFbnRpdHkuZ2V0U3Vic2V0Um93cyhzdWJzZXRzLCBzdWJzZXRzSW50ZXJuYWwsIFtcbiAgICAgICAgICAuLi5wcmVmaXhlcyxcbiAgICAgICAgICBgJHtwcm9wLm5hbWV9YCxcbiAgICAgICAgXSk7XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBmaWVsZDogcHJvcC5uYW1lLFxuICAgICAgICAgIGNoaWxkcmVuLFxuICAgICAgICAgIHJlbGF0aW9uRW50aXR5OiBwcm9wLndpdGgsXG4gICAgICAgICAgcHJlZml4ZXMsXG4gICAgICAgICAgaXNPcGVuOiBjaGlsZHJlbi5sZW5ndGggPiAwLFxuICAgICAgICAgIGhhczogT2JqZWN0LmZyb21FbnRyaWVzKFxuICAgICAgICAgICAgc3Vic2V0S2V5cy5tYXAoKHN1YnNldEtleSkgPT4ge1xuICAgICAgICAgICAgICByZXR1cm4gW3N1YnNldEtleSwgY2hpbGRyZW4uZXZlcnkoKGNoaWxkKSA9PiBjaGlsZC5oYXNbc3Vic2V0S2V5XSldO1xuICAgICAgICAgICAgfSksXG4gICAgICAgICAgKSxcbiAgICAgICAgICBpc0ludGVybmFsOiBPYmplY3QuZnJvbUVudHJpZXMoXG4gICAgICAgICAgICBzdWJzZXRLZXlzLm1hcCgoc3Vic2V0S2V5KSA9PiB7XG4gICAgICAgICAgICAgIHJldHVybiBbc3Vic2V0S2V5LCBjaGlsZHJlbi5ldmVyeSgoY2hpbGQpID0+IGNoaWxkLmlzSW50ZXJuYWxbc3Vic2V0S2V5XSldO1xuICAgICAgICAgICAgfSksXG4gICAgICAgICAgKSxcbiAgICAgICAgfTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgZmllbGQgPSBbLi4ucHJlZml4ZXMsIHByb3AubmFtZV0uam9pbihcIi5cIik7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBmaWVsZDogcHJvcC5uYW1lLFxuICAgICAgICBjaGlsZHJlbjogW10sXG4gICAgICAgIHJlbGF0aW9uRW50aXR5OiBwcm9wLnR5cGUgPT09IFwicmVsYXRpb25cIiA/IHByb3Aud2l0aCA6IHVuZGVmaW5lZCxcbiAgICAgICAgcHJlZml4ZXMsXG4gICAgICAgIGhhczogT2JqZWN0LmZyb21FbnRyaWVzKFxuICAgICAgICAgIHN1YnNldEtleXMubWFwKChzdWJzZXRLZXkpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHN1YnNldEZpZWxkcyA9IHN1YnNldHNbc3Vic2V0S2V5XTtcbiAgICAgICAgICAgIGNvbnN0IGhhcyA9IHN1YnNldEZpZWxkcy5zb21lKChmKSA9PiB7XG4gICAgICAgICAgICAgIHJldHVybiBmID09PSBmaWVsZCB8fCBmLnN0YXJ0c1dpdGgoYCR7ZmllbGR9LmApO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm4gW3N1YnNldEtleSwgaGFzXTtcbiAgICAgICAgICB9KSxcbiAgICAgICAgKSxcbiAgICAgICAgaXNJbnRlcm5hbDogT2JqZWN0LmZyb21FbnRyaWVzKFxuICAgICAgICAgIHN1YnNldEtleXMubWFwKChzdWJzZXRLZXkpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGludGVybmFsRmllbGRzID0gc3Vic2V0c0ludGVybmFsW3N1YnNldEtleV0gPz8gW107XG4gICAgICAgICAgICBjb25zdCBpc0ludGVybmFsID0gaW50ZXJuYWxGaWVsZHMuc29tZSgoZikgPT4ge1xuICAgICAgICAgICAgICByZXR1cm4gZiA9PT0gZmllbGQgfHwgZi5zdGFydHNXaXRoKGAke2ZpZWxkfS5gKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmV0dXJuIFtzdWJzZXRLZXksIGlzSW50ZXJuYWxdO1xuICAgICAgICAgIH0pLFxuICAgICAgICApLFxuICAgICAgfTtcbiAgICB9KTtcbiAgfVxuXG4gIHN1YnNldFJvd3NUb1N1YnNldEZpZWxkcyhcbiAgICBzdWJzZXRSb3dzOiBFbnRpdHlTdWJzZXRSb3dbXSxcbiAgICBzdWJzZXRLZXk6IHN0cmluZyxcbiAgICBpbnRlcm5hbDogYm9vbGVhbiA9IGZhbHNlLFxuICApOiBzdHJpbmdbXSB7XG4gICAgY29uc3QgaGFzS2V5ID0gaW50ZXJuYWwgPyBcImlzSW50ZXJuYWxcIiA6IFwiaGFzXCI7XG4gICAgcmV0dXJuIHN1YnNldFJvd3NcbiAgICAgIC5tYXAoKHN1YnNldFJvdykgPT4ge1xuICAgICAgICBpZiAoc3Vic2V0Um93LmNoaWxkcmVuLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5zdWJzZXRSb3dzVG9TdWJzZXRGaWVsZHMoc3Vic2V0Um93LmNoaWxkcmVuLCBzdWJzZXRLZXksIGludGVybmFsKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdWJzZXRSb3dbaGFzS2V5XVtzdWJzZXRLZXldKSB7XG4gICAgICAgICAgcmV0dXJuIHN1YnNldFJvdy5wcmVmaXhlcy5jb25jYXQoc3Vic2V0Um93LmZpZWxkKS5qb2luKFwiLlwiKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICAgIC5maWx0ZXIobm9uTnVsbGFibGUpXG4gICAgICAuZmxhdCgpO1xuICB9XG5cbiAgYXN5bmMgY3JlYXRlUHJvcChwcm9wOiBFbnRpdHlQcm9wLCBhdD86IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICghYXQpIHtcbiAgICAgIHRoaXMucHJvcHMucHVzaChwcm9wKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5wcm9wcy5zcGxpY2UoYXQsIDAsIHByb3ApO1xuICAgIH1cbiAgICBhd2FpdCB0aGlzLnNhdmUoKTtcbiAgfVxuXG4gIGFuYWx5emVTdWJzZXRGaWVsZChzdWJzZXRGaWVsZDogc3RyaW5nKToge1xuICAgIGVudGl0eUlkOiBzdHJpbmc7XG4gICAgcHJvcE5hbWU6IHN0cmluZztcbiAgfVtdIHtcbiAgICBjb25zdCBhcnIgPSBzdWJzZXRGaWVsZC5zcGxpdChcIi5cIik7XG5cbiAgICBsZXQgZW50aXR5SWQgPSB0aGlzLmlkO1xuICAgIGNvbnN0IHJlc3VsdDoge1xuICAgICAgZW50aXR5SWQ6IHN0cmluZztcbiAgICAgIHByb3BOYW1lOiBzdHJpbmc7XG4gICAgfVtdID0gW107XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhcnIubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IHByb3BOYW1lID0gYXJyW2ldO1xuICAgICAgcmVzdWx0LnB1c2goe1xuICAgICAgICBlbnRpdHlJZCxcbiAgICAgICAgcHJvcE5hbWUsXG4gICAgICB9KTtcblxuICAgICAgY29uc3QgcHJvcCA9IEVudGl0eU1hbmFnZXIuZ2V0KGVudGl0eUlkKS5wcm9wcy5maW5kKChwKSA9PiBwLm5hbWUgPT09IHByb3BOYW1lKTtcbiAgICAgIGlmICghcHJvcCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7ZW50aXR5SWR97J2YIOyemOuqu+uQnCDshJzruIzshYvtgqQgJHtzdWJzZXRGaWVsZH1gKTtcbiAgICAgIH1cbiAgICAgIGlmIChpc1JlbGF0aW9uUHJvcChwcm9wKSkge1xuICAgICAgICBlbnRpdHlJZCA9IHByb3Aud2l0aDtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIGFzeW5jIG1vZGlmeVByb3AobmV3UHJvcDogRW50aXR5UHJvcCwgYXQ6IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xuICAgIC8vIOydtOyghCDtlITroa0g7J2066aEIOyggOyepVxuICAgIGNvbnN0IG9sZE5hbWUgPSB0aGlzLnByb3BzW2F0XS5uYW1lO1xuXG4gICAgLy8g7KCA7J6l7ZWgIOyXlO2LsO2LsFxuICAgIGNvbnN0IGVudGl0aWVzOiBFbnRpdHlbXSA9IFt0aGlzXTtcblxuICAgIC8vIOydtOumhOydtCDrsJTrgJAg6rK97JqwXG4gICAgaWYgKG9sZE5hbWUgIT09IG5ld1Byb3AubmFtZSkge1xuICAgICAgLy8g7KCE7LK0IOyXlO2LsO2LsOyXkOyEnCDtmITsnqwg7IiY7KCV65CcIO2UhOuhreydhCDssLjsobDtlZjqs6Ag7J6I64qUIOuqqOuToCDshJzruIzshYvtlYTrk5wg7LC+7JWE7IScIOyImOyglVxuICAgICAgY29uc3QgYWxsRW50aXR5SWRzID0gRW50aXR5TWFuYWdlci5nZXRBbGxJZHMoKTtcbiAgICAgIGZvciAoY29uc3QgcmVsRW50aXR5SWQgb2YgYWxsRW50aXR5SWRzKSB7XG4gICAgICAgIGNvbnN0IHJlbEVudGl0eSA9IEVudGl0eU1hbmFnZXIuZ2V0KHJlbEVudGl0eUlkKTtcbiAgICAgICAgY29uc3QgcmVsRW50aXR5U3Vic2V0S2V5cyA9IE9iamVjdC5rZXlzKHJlbEVudGl0eS5zdWJzZXRzKTtcbiAgICAgICAgZm9yIChjb25zdCBzdWJzZXRLZXkgb2YgcmVsRW50aXR5U3Vic2V0S2V5cykge1xuICAgICAgICAgIGNvbnN0IHN1YnNldCA9IHJlbEVudGl0eS5zdWJzZXRzW3N1YnNldEtleV07XG5cbiAgICAgICAgICAvLyDshJzruIzshYsg7ZWE65Oc66W8IOyInO2ajO2VmOupsCwg7JeU7Yuw7YuwLe2UhOuhrSDri6jsnITroZwg67aE7ISd7ZWcIO2bhCDtmITsnqwg7JeU7Yuw7YuwLe2UhOuhreqzvCDsnbzsuZjtlZjripQg6rK97JqwIOyImOyglSDsspjrpqxcbiAgICAgICAgICBjb25zdCBtb2RpZmllZFN1YnNldEZpZWxkcyA9IHN1YnNldC5tYXAoKHN1YnNldEZpZWxkKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBhbmFseXplZCA9IHJlbEVudGl0eS5hbmFseXplU3Vic2V0RmllbGQoc3Vic2V0RmllbGQpO1xuICAgICAgICAgICAgY29uc3QgbW9kaWZpZWQgPSBhbmFseXplZC5tYXAoKGEpID0+XG4gICAgICAgICAgICAgIGEucHJvcE5hbWUgPT09IG9sZE5hbWUgJiYgYS5lbnRpdHlJZCA9PT0gdGhpcy5pZFxuICAgICAgICAgICAgICAgID8ge1xuICAgICAgICAgICAgICAgICAgICAuLi5hLFxuICAgICAgICAgICAgICAgICAgICBwcm9wTmFtZTogbmV3UHJvcC5uYW1lLFxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIDogYSxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICAvLyDrtoTshJ3tlZwg7ZWE65Oc66W8IOuLpOyLnCDshJzruIzshYsg7ZWE65Oc66GcIOuzteq1rFxuICAgICAgICAgICAgcmV0dXJuIG1vZGlmaWVkLm1hcCgoYSkgPT4gYS5wcm9wTmFtZSkuam9pbihcIi5cIik7XG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICBpZiAoc3Vic2V0LmpvaW4oXCIsXCIpICE9PSBtb2RpZmllZFN1YnNldEZpZWxkcy5qb2luKFwiLFwiKSkge1xuICAgICAgICAgICAgcmVsRW50aXR5LnN1YnNldHNbc3Vic2V0S2V5XSA9IG1vZGlmaWVkU3Vic2V0RmllbGRzO1xuICAgICAgICAgICAgZW50aXRpZXMucHVzaChyZWxFbnRpdHkpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIO2UhOuhrSDsiJjsoJVcbiAgICB0aGlzLnByb3BzW2F0XSA9IG5ld1Byb3A7XG5cbiAgICBhd2FpdCBQcm9taXNlLmFsbChlbnRpdGllcy5tYXAoYXN5bmMgKGVudGl0eSkgPT4gZW50aXR5LnNhdmUoKSkpO1xuICB9XG5cbiAgYXN5bmMgZGVsUHJvcChhdDogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgLy8g7J207KCEIO2UhOuhrSDsnbTrpoQg7KCA7J6lXG4gICAgY29uc3Qgb2xkTmFtZSA9IHRoaXMucHJvcHNbYXRdLm5hbWU7XG5cbiAgICAvLyDsoIDsnqXtlaAg7JeU7Yuw7YuwXG4gICAgY29uc3QgZW50aXRpZXM6IEVudGl0eVtdID0gW3RoaXNdO1xuXG4gICAgLy8g7KCE7LK0IOyXlO2LsO2LsOyXkOyEnCDtmITsnqwg7IKt7KCc65CcIO2UhOuhreydhCDssLjsobDtlZjqs6Ag7J6I64qUIOuqqOuToCDshJzruIzshYvtlYTrk5wg7LC+7JWE7IScIOygnOyZuFxuICAgIGNvbnN0IGFsbEVudGl0eUlkcyA9IEVudGl0eU1hbmFnZXIuZ2V0QWxsSWRzKCk7XG4gICAgZm9yIChjb25zdCByZWxFbnRpdHlJZCBvZiBhbGxFbnRpdHlJZHMpIHtcbiAgICAgIGNvbnN0IHJlbEVudGl0eSA9IEVudGl0eU1hbmFnZXIuZ2V0KHJlbEVudGl0eUlkKTtcbiAgICAgIGNvbnN0IHJlbEVudGl0eVN1YnNldEtleXMgPSBPYmplY3Qua2V5cyhyZWxFbnRpdHkuc3Vic2V0cyk7XG4gICAgICBmb3IgKGNvbnN0IHN1YnNldEtleSBvZiByZWxFbnRpdHlTdWJzZXRLZXlzKSB7XG4gICAgICAgIGNvbnN0IHN1YnNldCA9IHJlbEVudGl0eS5zdWJzZXRzW3N1YnNldEtleV07XG4gICAgICAgIC8vIOyEnOu4jOyFiyDtlYTrk5zrpbwg7Iic7ZqM7ZWY66mwLCDsl5Tti7Dti7At7ZSE66GtIOuLqOychOuhnCDrtoTshJ3tlZwg7ZuEIO2YhOyerCDsl5Tti7Dti7At7ZSE66Gt6rO8IOydvOy5mO2VmOuKlCDqsr3smrAg7J207ZuE7J2YIO2VhOuTnOulvCDsoJzsmbhcbiAgICAgICAgY29uc3QgbW9kaWZpZWRTdWJzZXRGaWVsZHMgPSBzdWJzZXRcbiAgICAgICAgICAubWFwKChzdWJzZXRGaWVsZCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgYW5hbHl6ZWQgPSByZWxFbnRpdHkuYW5hbHl6ZVN1YnNldEZpZWxkKHN1YnNldEZpZWxkKTtcbiAgICAgICAgICAgIGlmIChhbmFseXplZC5maW5kKChhKSA9PiBhLnByb3BOYW1lID09PSBvbGROYW1lICYmIGEuZW50aXR5SWQgPT09IHRoaXMuaWQpKSB7XG4gICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHN1YnNldEZpZWxkO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pXG4gICAgICAgICAgLmZpbHRlcihub25OdWxsYWJsZSk7XG5cbiAgICAgICAgaWYgKHN1YnNldC5qb2luKFwiLFwiKSAhPT0gbW9kaWZpZWRTdWJzZXRGaWVsZHMuam9pbihcIixcIikpIHtcbiAgICAgICAgICByZWxFbnRpdHkuc3Vic2V0c1tzdWJzZXRLZXldID0gbW9kaWZpZWRTdWJzZXRGaWVsZHM7XG4gICAgICAgICAgZW50aXRpZXMucHVzaChyZWxFbnRpdHkpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8g7ZiE7J6sIOyXlO2LsO2LsOydmCDsnbjrjbHsiqTsl5DshJwg7KCc7Jm4XG4gICAgZm9yIChjb25zdCBpbmRleCBvZiBFbnRpdHlNYW5hZ2VyLmdldCh0aGlzLmlkKS5pbmRleGVzKSB7XG4gICAgICBpbmRleC5jb2x1bW5zID0gaW5kZXguY29sdW1ucy5maWx0ZXIoKGNvbCkgPT4gY29sLm5hbWUgIT09IG9sZE5hbWUpO1xuICAgIH1cblxuICAgIC8vIO2UhOuhrSDsgq3soJxcbiAgICB0aGlzLnByb3BzLnNwbGljZShhdCwgMSk7XG5cbiAgICBhd2FpdCBQcm9taXNlLmFsbChlbnRpdGllcy5tYXAoYXN5bmMgKGVudGl0eSkgPT4gZW50aXR5LnNhdmUoKSkpO1xuICB9XG5cbiAgZ2V0RW50aXR5SWRGcm9tU3Vic2V0RmllbGQoc3Vic2V0RmllbGQ6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgaWYgKCFzdWJzZXRGaWVsZC5pbmNsdWRlcyhcIi5cIikpIHtcbiAgICAgIHJldHVybiB0aGlzLmlkO1xuICAgIH1cblxuICAgIC8vIOyEnOu4jOyFiyDtlYTrk5zsnZgg66eI7KeA66eJ7J2AIO2UhOuhreydtOuvgOuhnCDsoJzsmbhcbiAgICBjb25zdCBhcnIgPSBzdWJzZXRGaWVsZC5zcGxpdChcIi5cIikuc2xpY2UoMCwgLTEpO1xuXG4gICAgLy8g7ISc67iM7IWLIO2VhOuTnOulvCDrgrTroKTqsIDrqbTshJwg66eI7KeA66eJ7Jy866GcIHJlbGF0aW9u65CcIOyXlO2LsO2LsOulvCDssL7snYxcbiAgICBjb25zdCBsYXN0RW50aXR5SWQgPSBhcnIucmVkdWNlKChlbnRpdHlJZCwgZmllbGQpID0+IHtcbiAgICAgIGNvbnN0IHJlbFByb3AgPSBFbnRpdHlNYW5hZ2VyLmdldChlbnRpdHlJZCkucHJvcHMuZmluZCgocCkgPT4gcC5uYW1lID09PSBmaWVsZCk7XG4gICAgICBpZiAoIXJlbFByb3AgfHwgcmVsUHJvcC50eXBlICE9PSBcInJlbGF0aW9uXCIpIHtcbiAgICAgICAgY29uc29sZS5kZWJ1Zyh7IGFyciwgdGhpc0lkOiB0aGlzLmlkLCBlbnRpdHlJZCwgZmllbGQgfSk7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihg7J6Y66q765CcIOyEnOu4jOyFi+2CpCAke3N1YnNldEZpZWxkfWApO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJlbFByb3Aud2l0aDtcbiAgICB9LCB0aGlzLmlkKTtcbiAgICByZXR1cm4gbGFzdEVudGl0eUlkO1xuICB9XG5cbiAgYXN5bmMgbW92ZVByb3AoYXQ6IG51bWJlciwgdG86IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHByb3AgPSB0aGlzLnByb3BzW2F0XTtcbiAgICBjb25zdCBuZXdQcm9wcyA9IFsuLi50aGlzLnByb3BzXTtcbiAgICBuZXdQcm9wcy5zcGxpY2UodG8sIDAsIHByb3ApO1xuICAgIG5ld1Byb3BzLnNwbGljZShhdCA8IHRvID8gYXQgOiBhdCArIDEsIDEpO1xuICAgIHRoaXMucHJvcHMgPSBuZXdQcm9wcztcblxuICAgIGF3YWl0IHRoaXMuc2F2ZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIO2VhOuTnOuqheydhCBcIu2FjOydtOu4lOuqhS7tlYTrk5zrqoVcIiDtmJXsi53snLzroZwg67OA7ZmYXG4gICAqL1xuICBnZXRGdWxsRmllbGROYW1lKGZpZWxkOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGlmIChmaWVsZC5pbmNsdWRlcyhcIi5cIikpIHtcbiAgICAgIHJldHVybiBmaWVsZDtcbiAgICB9XG4gICAgcmV0dXJuIGAke3RoaXMudGFibGV9LiR7ZmllbGR9YDtcbiAgfVxuXG4gIC8qKlxuICAgKiDsl5Tti7Dti7DsnZggUEsg7YOA7J6F7J2EIOuwmO2ZmO2VqeuLiOuLpC5cbiAgICogaWQg7ZWE65Oc7J2YIO2DgOyeheydhCDquLDspIDsnLzroZwgXCJpbnRlZ2VyXCIgfCBcInN0cmluZ1wiIHwgXCJ1dWlkXCLrpbwg67CY7ZmY7ZWp64uI64ukLlxuICAgKi9cbiAgZ2V0UGtUeXBlKCk6IFwiaW50ZWdlclwiIHwgXCJzdHJpbmdcIiB8IFwidXVpZFwiIHtcbiAgICBjb25zdCBpZFByb3AgPSB0aGlzLnByb3BzRGljdC5pZDtcbiAgICBpZiAoIWlkUHJvcCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBFbnRpdHkgJHt0aGlzLmlkfeyXkCBpZCDtlYTrk5zqsIAg7JeG7Iq164uI64ukYCk7XG4gICAgfVxuICAgIGlmIChpZFByb3AudHlwZSA9PT0gXCJzdHJpbmdcIiB8fCBpZFByb3AudHlwZSA9PT0gXCJ1dWlkXCIpIHtcbiAgICAgIHJldHVybiBpZFByb3AudHlwZTtcbiAgICB9XG4gICAgcmV0dXJuIFwiaW50ZWdlclwiO1xuICB9XG5cbiAgLyoqXG4gICAqIOyXlO2LsO2LsOydmCBQSyBwcm9w7J2EIOuwmO2ZmO2VqeuLiOuLpC5cbiAgICogbGVuZ3RoIOuTsSDshLjrtoAg7KCV67O07JeQIOygkeq3vO2VoCDrlYwg7IKs7Jqp7ZWp64uI64ukLlxuICAgKi9cbiAgZ2V0UGtQcm9wKCk6IEVudGl0eVByb3Age1xuICAgIGNvbnN0IGlkUHJvcCA9IHRoaXMucHJvcHNEaWN0LmlkO1xuICAgIGlmICghaWRQcm9wKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEVudGl0eSAke3RoaXMuaWR97JeQIGlkIO2VhOuTnOqwgCDsl4bsirXri4jri6RgKTtcbiAgICB9XG4gICAgcmV0dXJuIGlkUHJvcDtcbiAgfVxuXG4gIC8qKlxuICAgKiDsl5Tti7Dti7DsnZggUEsg67Cw7Je0IO2DgOyeheydhCDrsJjtmZjtlanri4jri6QuXG4gICAqIExvYWRlclF1ZXJ57J2YIGZyb21JZHMg7YOA7J6F7Jy866GcIOyCrOyaqeuQqeuLiOuLpC5cbiAgICovXG4gIGdldFBrQXJyYXlUeXBlKCk6IHN0cmluZyB7XG4gICAgY29uc3QgcGtUeXBlID0gdGhpcy5nZXRQa1R5cGUoKTtcbiAgICByZXR1cm4gcGtUeXBlID09PSBcImludGVnZXJcIiA/IFwibnVtYmVyW11cIiA6IFwic3RyaW5nW11cIjtcbiAgfVxufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7O2FBUXNDO1lBY2Y7Z0JBWTJCO2dCQUNIO2VBQ0w7aUJBQ087b0JBQ0s7WUFDSztxQkFHWDtDQUVuQyxTQUFiLE1BQW9CO0VBQ2xCO0VBQ0E7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
808
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW50aXR5LmpzIiwibmFtZXMiOltdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9lbnRpdHkvZW50aXR5LnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBhc3NlcnQgZnJvbSBcImFzc2VydFwiO1xuaW1wb3J0IHsgd3JpdGVGaWxlIH0gZnJvbSBcImZzL3Byb21pc2VzXCI7XG5pbXBvcnQgcGF0aCBmcm9tIFwicGF0aFwiO1xuXG5pbXBvcnQgaW5mbGVjdGlvbiBmcm9tIFwiaW5mbGVjdGlvblwiO1xuaW1wb3J0IHsgZ3JvdXAsIHVuaXF1ZSB9IGZyb20gXCJyYWRhc2hpXCI7XG5pbXBvcnQgeyB6IH0gZnJvbSBcInpvZFwiO1xuXG5pbXBvcnQgeyBTb25hbXUgfSBmcm9tIFwiLi4vYXBpL3NvbmFtdVwiO1xuaW1wb3J0IHtcbiAgZ2V0RW51bURlZlZhbHVlcyxcbiAgZ2V0U3Vic2V0RmllbGRzLFxuICBpc0JlbG9uZ3NUb09uZVJlbGF0aW9uUHJvcCxcbiAgaXNFbnVtUHJvcCxcbiAgaXNIYXNNYW55UmVsYXRpb25Qcm9wLFxuICBpc0ludGVybmFsU3Vic2V0RmllbGQsXG4gIGlzTWFueVRvTWFueVJlbGF0aW9uUHJvcCxcbiAgaXNPbmVUb09uZVJlbGF0aW9uUHJvcCxcbiAgaXNSZWxhdGlvblByb3AsXG4gIGlzVmlydHVhbENvZGVQcm9wLFxuICBpc1ZpcnR1YWxQcm9wLFxuICBub3JtYWxpemVTdWJzZXRGaWVsZCxcbn0gZnJvbSBcIi4uL3R5cGVzL3R5cGVzXCI7XG5pbXBvcnQge1xuICB0eXBlIENvbmUsXG4gIHR5cGUgRW50aXR5SW5kZXgsXG4gIHR5cGUgRW50aXR5SnNvbixcbiAgdHlwZSBFbnRpdHlQcm9wLFxuICB0eXBlIEVudGl0eVByb3BOb2RlLFxuICB0eXBlIEVudGl0eVN1YnNldFJvdyxcbiAgdHlwZSBSZWxhdGlvblByb3AsXG4gIHR5cGUgU3Vic2V0RmllbGQsXG4gIHR5cGUgU3Vic2V0UXVlcnksXG59IGZyb20gXCIuLi90eXBlcy90eXBlc1wiO1xuaW1wb3J0IHsgaW1wb3J0TWVtYmVycyB9IGZyb20gXCIuLi91dGlscy9lc20tdXRpbHNcIjtcbmltcG9ydCB7IGZvcm1hdENvZGUgfSBmcm9tIFwiLi4vdXRpbHMvZm9ybWF0dGVyXCI7XG5pbXBvcnQgeyBleGlzdHMgfSBmcm9tIFwiLi4vdXRpbHMvZnMtdXRpbHNcIjtcbmltcG9ydCB7IHJ1bnRpbWVQYXRoIH0gZnJvbSBcIi4uL3V0aWxzL3BhdGgtdXRpbHNcIjtcbmltcG9ydCB7IGlzU3RyaW5nVmFsdWUgfSBmcm9tIFwiLi4vdXRpbHMvcnVudGltZS12YWx1ZVwiO1xuaW1wb3J0IHsgYXNzZXJ0RGVmaW5lZCwgbm9uTnVsbGFibGUgfSBmcm9tIFwiLi4vdXRpbHMvdXRpbHNcIjtcblxudHlwZSBOZXN0ZWRTZWxlY3QgPSB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB8IE5lc3RlZFNlbGVjdCB9O1xuaW1wb3J0IHsgRW50aXR5TWFuYWdlciB9IGZyb20gXCIuL2VudGl0eS1tYW5hZ2VyXCI7XG5cbmV4cG9ydCBjbGFzcyBFbnRpdHkge1xuICBpZDogc3RyaW5nO1xuICBwYXJlbnRJZD86IHN0cmluZztcbiAgdGFibGU6IHN0cmluZztcbiAgdGl0bGU6IHN0cmluZztcbiAgY29uZT86IENvbmU7XG4gIG5hbWVzOiB7XG4gICAgcGFyZW50RnM6IHN0cmluZztcbiAgICBmczogc3RyaW5nO1xuICAgIG1vZHVsZTogc3RyaW5nO1xuICB9O1xuICBwcm9wczogRW50aXR5UHJvcFtdO1xuICBwcm9wc0RpY3Q6IHtcbiAgICBba2V5OiBzdHJpbmddOiBFbnRpdHlQcm9wO1xuICB9O1xuICByZWxhdGlvbnM6IHtcbiAgICBba2V5OiBzdHJpbmddOiBSZWxhdGlvblByb3A7XG4gIH07XG4gIGluZGV4ZXM6IEVudGl0eUluZGV4W107XG4gIHN1YnNldHM6IHtcbiAgICBba2V5OiBzdHJpbmddOiBzdHJpbmdbXTtcbiAgfTtcbiAgc3Vic2V0c0ludGVybmFsOiB7XG4gICAgW2tleTogc3RyaW5nXTogc3RyaW5nW107XG4gIH07XG4gIHR5cGVzOiB7XG4gICAgW25hbWU6IHN0cmluZ106IHouWm9kVHlwZUFueTtcbiAgfSA9IHt9O1xuICBlbnVtczoge1xuICAgIFtlbnVtSWQ6IHN0cmluZ106IHouWm9kRW51bTxSZWFkb25seTxSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+Pj47XG4gIH0gPSB7fTtcbiAgZW51bUxhYmVsczoge1xuICAgIFtlbnVtSWQ6IHN0cmluZ106IHtcbiAgICAgIFtrZXk6IHN0cmluZ106IHN0cmluZztcbiAgICB9O1xuICB9ID0ge307XG4gIGVudW1Db25lczoge1xuICAgIFtlbnVtSWQ6IHN0cmluZ106IENvbmU7XG4gIH0gPSB7fTtcbiAgc3Vic2V0Q29uZXM6IHtcbiAgICBbc3Vic2V0S2V5OiBzdHJpbmddOiBDb25lO1xuICB9ID0ge307XG5cbiAgY29uc3RydWN0b3IoeyBpZCwgcGFyZW50SWQsIHRhYmxlLCB0aXRsZSwgY29uZSwgcHJvcHMsIGluZGV4ZXMsIHN1YnNldHMsIGVudW1zIH06IEVudGl0eUpzb24pIHtcbiAgICAvLyBpZFxuICAgIHRoaXMuaWQgPSBpZDtcbiAgICB0aGlzLnBhcmVudElkID0gcGFyZW50SWQ7XG4gICAgdGhpcy50aXRsZSA9IHRpdGxlID8/IHRoaXMuaWQ7XG4gICAgdGhpcy50YWJsZSA9IHRhYmxlID8/IGluZmxlY3Rpb24udW5kZXJzY29yZShpbmZsZWN0aW9uLnBsdXJhbGl6ZShpZCkpO1xuICAgIHRoaXMuY29uZSA9IGNvbmU7XG5cbiAgICAvLyBwcm9wc1xuICAgIGlmIChwcm9wcykge1xuICAgICAgdGhpcy5wcm9wcyA9IHByb3BzLm1hcCgocHJvcCkgPT4ge1xuICAgICAgICBpZiAoaXNFbnVtUHJvcChwcm9wKSkge1xuICAgICAgICAgIGlmIChwcm9wLmlkLmluY2x1ZGVzKFwiJE1vZGVsXCIpKSB7XG4gICAgICAgICAgICBwcm9wLmlkID0gcHJvcC5pZC5yZXBsYWNlKFwiJE1vZGVsXCIsIGlkKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHByb3A7XG4gICAgICB9KTtcbiAgICAgIHRoaXMucHJvcHNEaWN0ID0gT2JqZWN0LmZyb21FbnRyaWVzKFxuICAgICAgICBwcm9wcy5tYXAoKHByb3ApID0+IHtcbiAgICAgICAgICByZXR1cm4gW3Byb3AubmFtZSwgcHJvcF07XG4gICAgICAgIH0pLFxuICAgICAgKTtcblxuICAgICAgLy8gcmVsYXRpb25zXG4gICAgICB0aGlzLnJlbGF0aW9ucyA9IE9iamVjdC5mcm9tRW50cmllcyhcbiAgICAgICAgcHJvcHMuZmlsdGVyKChwcm9wKSA9PiBpc1JlbGF0aW9uUHJvcChwcm9wKSkubWFwKChwcm9wKSA9PiBbcHJvcC5uYW1lLCBwcm9wXSksXG4gICAgICApO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnByb3BzID0gW107XG4gICAgICB0aGlzLnByb3BzRGljdCA9IHt9O1xuICAgICAgdGhpcy5yZWxhdGlvbnMgPSB7fTtcbiAgICB9XG5cbiAgICAvLyBpbmRleGVzXG4gICAgdGhpcy5pbmRleGVzID0gaW5kZXhlcyA/PyBbXTtcblxuICAgIC8vIHN1YnNldHM6IFN1YnNldERlZuyXkOyEnCBTdWJzZXRGaWVsZFtd66W8IOy2lOy2nO2VmOyXrCBzdWJzZXRzKOydvOuwmCnsmYAgc3Vic2V0c0ludGVybmFsKGludGVybmFsKeuhnCDrtoTrpqxcbiAgICB0aGlzLnN1YnNldHMgPSB7fTtcbiAgICB0aGlzLnN1YnNldHNJbnRlcm5hbCA9IHt9O1xuICAgIGZvciAoY29uc3QgW2tleSwgc3Vic2V0RGVmXSBvZiBPYmplY3QuZW50cmllcyhzdWJzZXRzID8/IHt9KSkge1xuICAgICAgY29uc3QgZmllbGRzID0gZ2V0U3Vic2V0RmllbGRzKHN1YnNldERlZik7XG4gICAgICB0aGlzLnN1YnNldHNba2V5XSA9IGZpZWxkcy5maWx0ZXIoKGYpID0+ICFpc0ludGVybmFsU3Vic2V0RmllbGQoZikpLm1hcChub3JtYWxpemVTdWJzZXRGaWVsZCk7XG4gICAgICB0aGlzLnN1YnNldHNJbnRlcm5hbFtrZXldID0gZmllbGRzLmZpbHRlcihpc0ludGVybmFsU3Vic2V0RmllbGQpLm1hcChub3JtYWxpemVTdWJzZXRGaWVsZCk7XG5cbiAgICAgIC8vIGNvbmUg7LaU7LacXG4gICAgICBpZiAoIUFycmF5LmlzQXJyYXkoc3Vic2V0RGVmKSAmJiBcImNvbmVcIiBpbiBzdWJzZXREZWYgJiYgc3Vic2V0RGVmLmNvbmUpIHtcbiAgICAgICAgdGhpcy5zdWJzZXRDb25lc1trZXldID0gc3Vic2V0RGVmLmNvbmU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gZW51bXM6IEVudW1EZWbsl5DshJwgdmFsdWVz7JmAIGNvbmXrpbwg7LaU7Lac7ZWY7JesIOyymOumrFxuICAgIHRoaXMuZW51bUxhYmVscyA9IE9iamVjdC5mcm9tRW50cmllcyhcbiAgICAgIE9iamVjdC5lbnRyaWVzKGVudW1zID8/IHt9KS5tYXAoKFtrZXksIGVudW1EZWZdKSA9PiB7XG4gICAgICAgIC8vIGNvbmUg7LaU7LacXG4gICAgICAgIGlmIChcInZhbHVlc1wiIGluIGVudW1EZWYgJiYgXCJjb25lXCIgaW4gZW51bURlZiAmJiBlbnVtRGVmLmNvbmUpIHtcbiAgICAgICAgICAvLyBTQUZFVFk6IOyKpO2CpOuniCDqsoDspp3qs7wg66mU7YOA642w7J207YSwIOqzhOyVveydtCDsnbQg7YOA7J6F7J2EIOuztOyepe2VqeuLiOuLpC5cbiAgICAgICAgICB0aGlzLmVudW1Db25lc1trZXldID0gZW51bURlZi5jb25lIGFzIENvbmU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFtrZXksIGdldEVudW1EZWZWYWx1ZXMoZW51bURlZildO1xuICAgICAgfSksXG4gICAgKTtcbiAgICB0aGlzLmVudW1zID0gT2JqZWN0LmZyb21FbnRyaWVzKFxuICAgICAgT2JqZWN0LmVudHJpZXModGhpcy5lbnVtTGFiZWxzKS5tYXAoKFtrZXksIGVudW1MYWJlbF0pID0+IHtcbiAgICAgICAgLy8gU0FGRVRZOiDsiqTtgqTrp4gg6rKA7Kad6rO8IOuplO2DgOuNsOydtO2EsCDqs4Tslb3snbQg7J20IO2DgOyeheydhCDrs7TsnqXtlanri4jri6QuXG4gICAgICAgIHJldHVybiBba2V5LCB6LmVudW0oT2JqZWN0LmtleXMoZW51bUxhYmVsKSldO1xuICAgICAgfSksXG4gICAgKTtcblxuICAgIC8vIG5hbWVzXG4gICAgdGhpcy5uYW1lcyA9IHtcbiAgICAgIHBhcmVudEZzOiBpbmZsZWN0aW9uLmRhc2hlcml6ZShpbmZsZWN0aW9uLnVuZGVyc2NvcmUocGFyZW50SWQgPz8gaWQpKS50b0xvd2VyQ2FzZSgpLFxuICAgICAgZnM6IGluZmxlY3Rpb24uZGFzaGVyaXplKGluZmxlY3Rpb24udW5kZXJzY29yZShpZCkpLnRvTG93ZXJDYXNlKCksXG4gICAgICBtb2R1bGU6IGlkLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICog7L+866as7JqpIOyEnOu4jOyFiyDtlYTrk5zrpbwg67CY7ZmY7ZWp64uI64ukIChzdWJzZXRzICsgc3Vic2V0c0ludGVybmFsIO2Vqey5qClcbiAgICovXG4gIGdldFN1YnNldEZpZWxkc0ZvclF1ZXJ5KHN1YnNldEtleTogc3RyaW5nKTogc3RyaW5nW10ge1xuICAgIHJldHVybiBbLi4uKHRoaXMuc3Vic2V0c1tzdWJzZXRLZXldID8/IFtdKSwgLi4uKHRoaXMuc3Vic2V0c0ludGVybmFsW3N1YnNldEtleV0gPz8gW10pXTtcbiAgfVxuXG4gIC8qKlxuICAgKiDso7zslrTsp4Qg7J2066aEKHN1YnNldEtleSnsnZggc3Vic2V07J2EIOyLpOygnOuhnCDqsIDsoLjsmKTripQgUHVyaSDsvZTrk5wg6rWs7ZiE7LK0IHN0cmluZ+ydhCDrsJjtmZjtlanri4jri6QuXG4gICAqL1xuICBnZXRQdXJpU3Vic2V0UXVlcnkoc3Vic2V0S2V5OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGNvbnN0IHN1YnNldCA9IHRoaXMuZ2V0U3Vic2V0RmllbGRzRm9yUXVlcnkoc3Vic2V0S2V5KTtcbiAgICBjb25zdCBzdWJzZXRRdWVyeSA9IHRoaXMucmVzb2x2ZVN1YnNldFF1ZXJ5KFwiXCIsIHN1YnNldCk7XG5cbiAgICBjb25zdCBsaW5lczogc3RyaW5nW10gPSBbXTtcblxuICAgIC8vIGZyb21cbiAgICBsaW5lcy5wdXNoKGByZXR1cm4gcWJXcmFwcGVyYCk7XG4gICAgbGluZXMucHVzaChgLmZyb20oXCIke3RoaXMudGFibGV9XCIpYCk7XG5cbiAgICAvLyBqb2luXG4gICAgZm9yIChjb25zdCBqb2luIG9mIHN1YnNldFF1ZXJ5LmpvaW5zKSB7XG4gICAgICAvLyBqb2luIOuplOyEnOuTnCDqsrDsoJU6IGlubmVyIOKGkiBqb2luLCBvdXRlciDihpIgbGVmdEpvaW5cbiAgICAgIC8vIEZLIG51bGxhYmxlIOyXrOu2gOuKlCBsZWZ0Sm9pbiDtg4DsnoUg7Iuc6re464uI7LKY7JeQ7IScIOyekOuPmeycvOuhnCDtjJDri6jrkKhcbiAgICAgIGNvbnN0IGpvaW5NZXRob2QgPSBqb2luLmpvaW4gPT09IFwiaW5uZXJcIiA/IFwiam9pblwiIDogXCJsZWZ0Sm9pblwiO1xuXG4gICAgICBpZiAoXCJjdXN0b21cIiBpbiBqb2luKSB7XG4gICAgICAgIC8vIGN1c3RvbSBqb2luIGNsYXVzZeuKlCByYXcg7IKs7JqpXG4gICAgICAgIGxpbmVzLnB1c2goXG4gICAgICAgICAgYC4ke2pvaW5NZXRob2R9KHsgJHtqb2luLmFzfTogXCIke2pvaW4udGFibGV9XCIgfSwgcWJXcmFwcGVyLmtuZXgucmF3KFxcYCR7am9pbi5jdXN0b219XFxgKSlgLFxuICAgICAgICApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbGluZXMucHVzaChgLiR7am9pbk1ldGhvZH0oeyAke2pvaW4uYXN9OiBcIiR7am9pbi50YWJsZX1cIiB9LCBcIiR7am9pbi5mcm9tfVwiLCBcIiR7am9pbi50b31cIilgKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBzZWxlY3QgLSDsnoXssrTsoIEg6rWs7KGw66GcIOyDneyEsVxuICAgIGNvbnN0IHNlbGVjdE9iaiA9IHRoaXMuYnVpbGROZXN0ZWRTZWxlY3RPYmplY3Qoc3Vic2V0UXVlcnkuc2VsZWN0KTtcbiAgICBsaW5lcy5wdXNoKGAuc2VsZWN0KCR7dGhpcy5zdHJpbmdpZnlOZXN0ZWRTZWxlY3RPYmplY3Qoc2VsZWN0T2JqKX0pO2ApO1xuXG4gICAgcmV0dXJuIGxpbmVzLmpvaW4oXCJcXG5cIik7XG4gIH1cblxuICAvKipcbiAgICogKi5lbnRpdHkuanNvbuydmCBzdWJzZXTsl5Ag65Ok7Ja07J6I64qUIO2VhOuTnCDrsLDsl7TsnYQg67Cb7JWE7IScLFxuICAgKiBQdXJp7J2YIFNlbGVjdE9iamVjdCDtg4DsnoXsnLzroZwg67OA7ZmY7ZWp64uI64ukLlxuICAgKlxuICAgKiDsmIg6IFtcInVzZXJzLmlkXCIsIFwicGFyZW50LmlkXCIsIFwicGFyZW50Lm5hbWVcIl1cbiAgICogICDihpIgeyBpZDogXCJ1c2Vycy5pZFwiLCBwYXJlbnQ6IHsgaWQ6IFwicGFyZW50LmlkXCIsIG5hbWU6IFwicGFyZW50Lm5hbWVcIiB9IH1cbiAgICpcbiAgICog7Ja4642U67CU6rCAIOyVhOuLjCDspJHssqkg6rCd7LK066GcIOuzgO2ZmO2VqOyXkCDsnKDsnZjtlZjshLjsmpQuXG4gICAqIOydtOugh+qyjCDspJHssqkg6rCd7LK066GcIOuzgO2ZmO2VmOyXrCBzZWxlY3Tsl5Ag64SY6rKo7KO866m0IFBhcnNlU2VsZWN0T2JqZWN0IO2DgOyeheydtCBqb2lu65CcIOqwneyytOydmCDtg4DsnoXsnYQg7J6YIOyeoeyVhOykhCDsiJgg7J6I7Iq164uI64ukLlxuICAgKiDspoksIGVuaGFuY2Vy7JeQ7IScIHJvd+ulvCDrsJvslZjsnYQg65WMIGh5ZHJhdGXrkJwg6rCd7LK0IOyekOyytOydmCBudWxsaXR57JmAIOq3uCDslYjsqr0g7ZWE65Oc7J2YIG51bGxpdHnqsIAgZmsgbnVsbGFibGUg7Jes67aA7JeQIOuUsOudvCDsnpgg7LaU66Gg65Cp64uI64ukLlxuICAgKi9cbiAgcHJpdmF0ZSBidWlsZE5lc3RlZFNlbGVjdE9iamVjdChzZWxlY3RJdGVtczogc3RyaW5nW10pOiBOZXN0ZWRTZWxlY3Qge1xuICAgIGNvbnN0IHJlc3VsdDogTmVzdGVkU2VsZWN0ID0ge307XG5cbiAgICBmb3IgKGNvbnN0IHNlbGVjdEl0ZW0gb2Ygc2VsZWN0SXRlbXMpIHtcbiAgICAgIC8vIFwidXNlcnMuaWRcIiDrmJDripQgXCJ1c2Vycy5pZCBhcyB1c2VyX19pZFwiIO2Yle2DnCDtjIzsi7FcbiAgICAgIGNvbnN0IG1hdGNoID0gc2VsZWN0SXRlbS5tYXRjaCgvXiguKz8pKD86IGFzICguKykpPyQvKTtcbiAgICAgIGlmICghbWF0Y2gpIGNvbnRpbnVlO1xuXG4gICAgICBjb25zdCBbLCBjb2x1bW4sIGFsaWFzXSA9IG1hdGNoO1xuICAgICAgY29uc3QgY29sdW1uVmFsdWUgPSBgXCIke2NvbHVtbi50cmltKCl9XCJgO1xuXG4gICAgICBpZiAoIWFsaWFzIHx8ICFhbGlhcy5pbmNsdWRlcyhcIl9fXCIpKSB7XG4gICAgICAgIC8vIGFsaWFz6rCAIOyXhuqxsOuCmCBfX+ulvCDtj6ztlajtlZjsp4Ag7JWK7Jy866m0IOy1nOyDgeychCDtlYTrk5xcbiAgICAgICAgY29uc3Qga2V5ID0gYWxpYXMgPz8gYXNzZXJ0RGVmaW5lZChjb2x1bW4uc3BsaXQoXCIuXCIpLnBvcCgpKTtcbiAgICAgICAgcmVzdWx0W2tleV0gPSBjb2x1bW5WYWx1ZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIGFsaWFz6rCAIF9f66W8IO2PrO2VqO2VmOuptCDsnoXssrQg6rWs7KGw66GcIOq3uOujue2ZlFxuICAgICAgICBjb25zdCBwYXJ0cyA9IGFsaWFzLnNwbGl0KFwiX19cIik7XG4gICAgICAgIGxldCBjdXJyZW50ID0gcmVzdWx0O1xuXG4gICAgICAgIC8vIOuniOyngOuniSDtjIztirgg7KCE6rmM7KeAIOykkeyyqSDqsJ3ssrQg7IOd7ISxXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcGFydHMubGVuZ3RoIC0gMTsgaSsrKSB7XG4gICAgICAgICAgY29uc3QgcGFydCA9IHBhcnRzW2ldO1xuICAgICAgICAgIGlmIChwYXJ0IGluIGN1cnJlbnQpIHtcbiAgICAgICAgICAgIGlmIChpc1N0cmluZ1ZhbHVlKGN1cnJlbnRbcGFydF0pKSB7XG4gICAgICAgICAgICAgIC8vIOyeheugpeydtCBbXCJ1c2VyXCIsIFwidXNlcl9faWRcIl0g6rCZ7J2AIOqyveyasCFcbiAgICAgICAgICAgICAgLy8g7JWg7LSI7JeQIOunkOuPhCDslYgg65CY7KeA66eMIOyViOyghO2VmOqyjCDsmIjsmbjrpbwg642Y7KeR64uI64ukLlxuICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICAgICAgYENvbmZsaWN0IGRldGVjdGVkIGluIHNlbGVjdCBpdGVtczogcGFyZW50IHBhdGggXCIke3BhcnRzLnNsaWNlKDAsIGkgKyAxKS5qb2luKFwiX19cIil9XCIgaXMgYWxyZWFkeSBzZXQgYXMgYSBmaWVsZCwgY2Fubm90IG5lc3QgXCIke2FsaWFzfVwiIHVuZGVyIGl0LmAsXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGN1cnJlbnRbcGFydF0gPSB7fTtcbiAgICAgICAgICB9XG4gICAgICAgICAgY3VycmVudCA9IGN1cnJlbnRbcGFydF07XG4gICAgICAgIH1cblxuICAgICAgICAvLyDrp4jsp4Drp4kg7YyM7Yq47JeQIOqwkiDshKTsoJVcbiAgICAgICAgY29uc3QgbGFzdFBhcnQgPSBwYXJ0c1twYXJ0cy5sZW5ndGggLSAxXTtcbiAgICAgICAgY3VycmVudFtsYXN0UGFydF0gPSBjb2x1bW5WYWx1ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gT2JqZWN0LmZyb21FbnRyaWVzKE9iamVjdC5lbnRyaWVzKHJlc3VsdCkpO1xuICB9XG5cbiAgLyoqXG4gICAqIEpTT04uc3RyaW5naWZ57JmAIOycoOyCrO2VnCDsnbzsnYQg7ZWp64uI64ukLlxuICAgKiDri6Trp4wg7KO87Ja07KeEIOqwneyytOulvCBKU09O7J20IOyVhOuLjCBUeXBlU2NyaXB0IOqwneyytCDrpqzthLDrn7Qg7Iqk7Yq466eB7Jy866GcIOunjOuTpOyWtOykjeuLiOuLpC5cbiAgICoga2V57JeQIOuUsOyYtO2RnOqwgCDsl4bslrTsmpQuXG4gICAqIOy2nOugpSDsmIjsi5w6XG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICoge1xuICAgKiAgIGlkOiBcInVzZXJzLmlkXCIsXG4gICAqICAgcGFyZW50OiB7XG4gICAqICAgICBpZDogXCJwYXJlbnQuaWRcIixcbiAgICogICAgIG5hbWU6IFwicGFyZW50Lm5hbWVcIixcbiAgICogICB9LFxuICAgKiB9XG4gICAqIGBgYFxuICAgKiBAcGFyYW0gb2JqIOuzgO2ZmO2VoCDqsJ3ssrRcbiAgICogQHBhcmFtIGluZGVudCDrk6Tsl6zsk7DquLAg66CI67KoXG4gICAqIEBwYXJhbSB3aXRoQnJhY2VzIHRydWXrqbQg7KSR6rSE7Zi4IO2PrO2VqCwgZmFsc2XrqbQg64K07Jqp66eMIOuwmO2ZmFxuICAgKi9cbiAgcHJpdmF0ZSBzdHJpbmdpZnlOZXN0ZWRTZWxlY3RPYmplY3QoXG4gICAgb2JqOiBOZXN0ZWRTZWxlY3QsXG4gICAgaW5kZW50OiBudW1iZXIgPSAwLFxuICAgIHdpdGhCcmFjZXM6IGJvb2xlYW4gPSB0cnVlLFxuICApOiBzdHJpbmcge1xuICAgIGNvbnN0IHNwYWNlcyA9IFwiICBcIi5yZXBlYXQoaW5kZW50KTtcbiAgICBjb25zdCBpbm5lclNwYWNlcyA9IFwiICBcIi5yZXBlYXQoaW5kZW50ICsgMSk7XG5cbiAgICBjb25zdCBlbnRyaWVzID0gT2JqZWN0LmVudHJpZXMob2JqKTtcbiAgICBpZiAoZW50cmllcy5sZW5ndGggPT09IDApIHJldHVybiB3aXRoQnJhY2VzID8gXCJ7fVwiIDogXCJcIjtcblxuICAgIGNvbnN0IGxpbmVzID0gZW50cmllcy5tYXAoKFtrZXksIHZhbHVlXSkgPT4ge1xuICAgICAgaWYgKGlzU3RyaW5nVmFsdWUodmFsdWUpKSB7XG4gICAgICAgIC8vIOy7rOufvCDqsr3roZwgKOydtOuvuCDrlLDsmLTtkZwg7Y+s7ZWoKVxuICAgICAgICByZXR1cm4gYCR7aW5uZXJTcGFjZXN9JHtrZXl9OiAke3ZhbHVlfSxgO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8g7KSR7LKpIOqwneyytCAo7ZWt7IOBIOykkeq0hO2YuCDtj6ztlagpXG4gICAgICAgIHJldHVybiBgJHtpbm5lclNwYWNlc30ke2tleX06ICR7dGhpcy5zdHJpbmdpZnlOZXN0ZWRTZWxlY3RPYmplY3QodmFsdWUsIGluZGVudCArIDEsIHRydWUpfSxgO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgaWYgKHdpdGhCcmFjZXMpIHtcbiAgICAgIHJldHVybiBge1xcbiR7bGluZXMuam9pbihcIlxcblwiKX1cXG4ke3NwYWNlc319YDtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8g7KSR6rSE7Zi4IOyXhuydtCDrgrTsmqnrp4wg67CY7ZmYICjslZ7rkqQg6rCc7ZaJIOygnOyZuClcbiAgICAgIHJldHVybiBsaW5lcy5qb2luKFwiXFxuXCIpO1xuICAgIH1cbiAgfVxuXG4gIGdldFB1cmlMb2FkZXJRdWVyeShzdWJzZXRLZXk6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgY29uc3Qgc3Vic2V0ID0gdGhpcy5nZXRTdWJzZXRGaWVsZHNGb3JRdWVyeShzdWJzZXRLZXkpO1xuICAgIGNvbnN0IHsgbG9hZGVycyB9ID0gdGhpcy5yZXNvbHZlU3Vic2V0UXVlcnkoXCJcIiwgc3Vic2V0KTtcblxuICAgIGNvbnN0IGxpbmVzOiBzdHJpbmdbXSA9IFtgW2BdO1xuXG4gICAgLy8g7J6s6reA7KCB7Jy866GcIGxvYWRlciDsg53shLHtlZjripQg7Zes7Y28IO2VqOyImFxuICAgIGNvbnN0IGdlbmVyYXRlTG9hZGVyQ29kZSA9IChuZXN0ZWRMb2FkZXJzOiBTdWJzZXRRdWVyeVtcImxvYWRlcnNcIl0pOiBzdHJpbmdbXSA9PiB7XG4gICAgICBjb25zdCBsb2FkZXJMaW5lczogc3RyaW5nW10gPSBbXTtcblxuICAgICAgZm9yIChjb25zdCBsb2FkZXIgb2YgbmVzdGVkTG9hZGVycykge1xuICAgICAgICBjb25zdCB7IHRvVGFibGUsIHRvQ29sLCB0aHJvdWdoLCBmcm9tVGFibGUgfSA9IGxvYWRlci5tYW55Sm9pbjtcblxuICAgICAgICAvLyBmcm9tVGFibGXsnZggRW50aXR566W8IOqwgOyguOyZgOyEnCBQSyDtg4DsnoUg7ZmV7J24XG4gICAgICAgIGNvbnN0IGZyb21FbnRpdHkgPSBFbnRpdHlNYW5hZ2VyLmdldEJ5VGFibGUoZnJvbVRhYmxlKTtcbiAgICAgICAgY29uc3QgZnJvbUlkc1R5cGUgPSBmcm9tRW50aXR5LmdldFBrQXJyYXlUeXBlKCk7XG5cbiAgICAgICAgbG9hZGVyTGluZXMucHVzaChcbiAgICAgICAgICBcIntcIixcbiAgICAgICAgICBgYXM6IFwiJHtsb2FkZXIuYXN9XCIsYCxcbiAgICAgICAgICBgcmVmSWQ6IFwiJHtsb2FkZXIubWFueUpvaW4uaWRGaWVsZH1cIixgLFxuICAgICAgICAgIGBxYjogKHFiV3JhcHBlcjogUHVyaVdyYXBwZXI8RGF0YWJhc2VTY2hlbWFFeHRlbmQ+LCBmcm9tSWRzOiBudW1iZXJbXSB8IHN0cmluZ1tdKSA9PiB7YCxcbiAgICAgICAgKTtcblxuICAgICAgICBpZiAodGhyb3VnaCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgLy8gSGFzTWFueVxuICAgICAgICAgIGxvYWRlckxpbmVzLnB1c2goXG4gICAgICAgICAgICAvL1xuICAgICAgICAgICAgXCJyZXR1cm4gcWJXcmFwcGVyXCIsXG4gICAgICAgICAgICBgLmZyb20oXCIke3RvVGFibGV9XCIpYCxcbiAgICAgICAgICApO1xuXG4gICAgICAgICAgbG9hZGVyLm9uZUpvaW5zLmZvckVhY2goKGpvaW46IFN1YnNldFF1ZXJ5W1wiam9pbnNcIl1bbnVtYmVyXSkgPT4ge1xuICAgICAgICAgICAgLy8gRksgbnVsbGFibGUg7Jes67aA64qUIGxlZnRKb2luIO2DgOyehSDsi5zqt7jri4jsspjsl5DshJwg7J6Q64+Z7Jy866GcIO2MkOuLqOuQqFxuICAgICAgICAgICAgY29uc3Qgam9pbk1ldGhvZCA9IGpvaW4uam9pbiA9PT0gXCJpbm5lclwiID8gXCJqb2luXCIgOiBcImxlZnRKb2luXCI7XG4gICAgICAgICAgICBpZiAoXCJjdXN0b21cIiBpbiBqb2luKSB7XG4gICAgICAgICAgICAgIC8vIGN1c3RvbSBqb2luIGNsYXVzZeuKlCBjYWxsYmFjayDtmJXtg5zsnZggb24g66mU7ISc65Oc66GcIOyymOumrO2VqeuLiOuLpC5cbiAgICAgICAgICAgICAgbG9hZGVyTGluZXMucHVzaChcbiAgICAgICAgICAgICAgICBgLiR7am9pbk1ldGhvZH0oeyAke2pvaW4uYXN9OiBcIiR7am9pbi50YWJsZX1cIiB9LCAoaikgPT4ge2AsXG4gICAgICAgICAgICAgICAgYGoub24oUHVyaS5yYXdTdHJpbmcoXCIke2pvaW4uY3VzdG9tfVwiKSk7YCxcbiAgICAgICAgICAgICAgICBcIn0pXCIsXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBsb2FkZXJMaW5lcy5wdXNoKFxuICAgICAgICAgICAgICAgIGAuJHtqb2luTWV0aG9kfSh7ICR7am9pbi5hc306IFwiJHtqb2luLnRhYmxlfVwiIH0sIFwiJHtqb2luLmZyb219XCIsIFwiJHtqb2luLnRvfVwiKWAsXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICAvLyDsnoXssrTsoIEgc2VsZWN0IOq1rOyhsCDsg53shLEgKHJlZklkIO2PrO2VqClcbiAgICAgICAgICBjb25zdCBzZWxlY3RPYmogPSB0aGlzLmJ1aWxkTmVzdGVkU2VsZWN0T2JqZWN0KGxvYWRlci5zZWxlY3QpO1xuICAgICAgICAgIHNlbGVjdE9iai5yZWZJZCA9IGBcIiR7dG9UYWJsZX0uJHt0b0NvbH1cImA7XG4gICAgICAgICAgbG9hZGVyTGluZXMucHVzaChcbiAgICAgICAgICAgIGAud2hlcmVJbihcIiR7dG9UYWJsZX0uJHt0b0NvbH1cIiwgZnJvbUlkcyBhcyAke2Zyb21JZHNUeXBlfSlgLFxuICAgICAgICAgICAgYC5zZWxlY3QoJHt0aGlzLnN0cmluZ2lmeU5lc3RlZFNlbGVjdE9iamVjdChzZWxlY3RPYmopfSk7YCxcbiAgICAgICAgICApO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIE1hbnlUb01hbnlcbiAgICAgICAgICBsb2FkZXJMaW5lcy5wdXNoKFxuICAgICAgICAgICAgXCJyZXR1cm4gcWJXcmFwcGVyXCIsXG4gICAgICAgICAgICBgLmZyb20oXCIke3Rocm91Z2gudGFibGV9XCIpYCxcbiAgICAgICAgICAgIGAuam9pbihcIiR7dG9UYWJsZX1cIiwgXCIke3Rocm91Z2gudGFibGV9LiR7dGhyb3VnaC50b0NvbH1cIiwgXCIke3RvVGFibGV9LiR7dG9Db2x9XCIpYCxcbiAgICAgICAgICApO1xuXG4gICAgICAgICAgbG9hZGVyLm9uZUpvaW5zLmZvckVhY2goKGpvaW46IFN1YnNldFF1ZXJ5W1wiam9pbnNcIl1bbnVtYmVyXSkgPT4ge1xuICAgICAgICAgICAgLy8gRksgbnVsbGFibGUg7Jes67aA64qUIGxlZnRKb2luIO2DgOyehSDsi5zqt7jri4jsspjsl5DshJwg7J6Q64+Z7Jy866GcIO2MkOuLqOuQqFxuICAgICAgICAgICAgY29uc3Qgam9pbk1ldGhvZCA9IGpvaW4uam9pbiA9PT0gXCJpbm5lclwiID8gXCJqb2luXCIgOiBcImxlZnRKb2luXCI7XG4gICAgICAgICAgICBpZiAoXCJjdXN0b21cIiBpbiBqb2luKSB7XG4gICAgICAgICAgICAgIC8vIGN1c3RvbSBqb2luIGNsYXVzZeuKlCBjYWxsYmFjayDtmJXtg5zsnZggb24g66mU7ISc65Oc66GcIOyymOumrO2VqeuLiOuLpC5cbiAgICAgICAgICAgICAgbG9hZGVyTGluZXMucHVzaChcbiAgICAgICAgICAgICAgICBgLiR7am9pbk1ldGhvZH0oeyAke2pvaW4uYXN9OiBcIiR7am9pbi50YWJsZX1cIiB9LCAoaikgPT4ge2AsXG4gICAgICAgICAgICAgICAgYGoub24oUHVyaS5yYXdTdHJpbmcoXCIke2pvaW4uY3VzdG9tfVwiKSk7YCxcbiAgICAgICAgICAgICAgICBcIn0pXCIsXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBsb2FkZXJMaW5lcy5wdXNoKFxuICAgICAgICAgICAgICAgIGAuJHtqb2luTWV0aG9kfSh7ICR7am9pbi5hc306IFwiJHtqb2luLnRhYmxlfVwiIH0sIFwiJHtqb2luLmZyb219XCIsIFwiJHtqb2luLnRvfVwiKWAsXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICAvLyDsnoXssrTsoIEgc2VsZWN0IOq1rOyhsCDsg53shLEgKHJlZklkIO2PrO2VqClcbiAgICAgICAgICBjb25zdCBzZWxlY3RPYmogPSB0aGlzLmJ1aWxkTmVzdGVkU2VsZWN0T2JqZWN0KGxvYWRlci5zZWxlY3QpO1xuICAgICAgICAgIHNlbGVjdE9iai5yZWZJZCA9IGBcIiR7dGhyb3VnaC50YWJsZX0uJHt0aHJvdWdoLmZyb21Db2x9XCJgO1xuICAgICAgICAgIGxvYWRlckxpbmVzLnB1c2goXG4gICAgICAgICAgICBgLndoZXJlSW4oXCIke3Rocm91Z2gudGFibGV9LiR7dGhyb3VnaC5mcm9tQ29sfVwiLCBmcm9tSWRzIGFzICR7ZnJvbUlkc1R5cGV9KWAsXG4gICAgICAgICAgICBgLnNlbGVjdCgke3RoaXMuc3RyaW5naWZ5TmVzdGVkU2VsZWN0T2JqZWN0KHNlbGVjdE9iail9KTtgLFxuICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICBsb2FkZXJMaW5lcy5wdXNoKGB9LGApO1xuXG4gICAgICAgIC8vIOykkeyyqSBsb2FkZXJzIOyymOumrFxuICAgICAgICBpZiAobG9hZGVyLmxvYWRlcnMgJiYgbG9hZGVyLmxvYWRlcnMubGVuZ3RoID4gMCkge1xuICAgICAgICAgIGxvYWRlckxpbmVzLnB1c2goXCJsb2FkZXJzOiBbXCIsIC4uLmdlbmVyYXRlTG9hZGVyQ29kZShsb2FkZXIubG9hZGVycyksIFwiXSxcIik7XG4gICAgICAgIH1cblxuICAgICAgICBsb2FkZXJMaW5lcy5wdXNoKFwifSxcIik7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBsb2FkZXJMaW5lcztcbiAgICB9O1xuXG4gICAgbGluZXMucHVzaCguLi5nZW5lcmF0ZUxvYWRlckNvZGUobG9hZGVycykpO1xuICAgIGxpbmVzLnB1c2goYF1gKTtcblxuICAgIHJldHVybiBsaW5lcy5qb2luKFwiXFxuXCIpO1xuICB9XG5cbiAgLypcbiAgICBzdWJzZXQgU0VMRUNUL0pPSU4vTE9BREVSIOqysOqzvCDrpqzthLRcbiAgKi9cbiAgZ2V0U3Vic2V0UXVlcnkoc3Vic2V0S2V5OiBzdHJpbmcpOiBTdWJzZXRRdWVyeSB7XG4gICAgY29uc3Qgc3Vic2V0ID0gdGhpcy5nZXRTdWJzZXRGaWVsZHNGb3JRdWVyeShzdWJzZXRLZXkpO1xuXG4gICAgY29uc3QgcmVzdWx0OiBTdWJzZXRRdWVyeSA9IHRoaXMucmVzb2x2ZVN1YnNldFF1ZXJ5KFwiXCIsIHN1YnNldCk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIC8qXG4gICAqL1xuICByZXNvbHZlU3Vic2V0UXVlcnkoXG4gICAgcHJlZml4OiBzdHJpbmcsXG4gICAgZmllbGRzOiBzdHJpbmdbXSxcbiAgICBpc0FscmVhZHlPdXRlckpvaW5lZDogYm9vbGVhbiA9IGZhbHNlLFxuICApOiBTdWJzZXRRdWVyeSB7XG4gICAgLy8gcHJlZml4IOy5mO2ZmCAocHJlZml464qUIFRvT25lUmVsYXRpb27snbQg67O17IiY66GcIOu2meydgCDqsr3smrAg66qo65GQIF9f66GcIOuzgOqyveuQqClcbiAgICBwcmVmaXggPSBwcmVmaXgucmVwbGFjZSgvXFwuL2csIFwiX19cIik7XG5cbiAgICAvLyDshJzruIzshYvsnYQgMeuOgeyKpOunjCDrtoTrpqztlZjsl6wg6re466O57ZWRXG4gICAgY29uc3Qgc3Vic2V0R3JvdXAgPSBncm91cChmaWVsZHMsIChmaWVsZCkgPT4ge1xuICAgICAgaWYgKGZpZWxkLmluY2x1ZGVzKFwiLlwiKSkge1xuICAgICAgICBjb25zdCBbcmVsXSA9IGZpZWxkLnNwbGl0KFwiLlwiKTtcbiAgICAgICAgcmV0dXJuIHJlbDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBcIlwiO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgY29uc3QgcmVzdWx0ID0gT2JqZWN0LmtleXMoc3Vic2V0R3JvdXApLnJlZHVjZShcbiAgICAgIChyLCBncm91cEtleSkgPT4ge1xuICAgICAgICBjb25zdCBncm91cGVkRmllbGRzID0gc3Vic2V0R3JvdXBbZ3JvdXBLZXldO1xuICAgICAgICBhc3NlcnQoZ3JvdXBlZEZpZWxkcyAhPT0gdW5kZWZpbmVkLCBcImZpZWxkcyBpcyB1bmRlZmluZWRcIik7XG5cbiAgICAgICAgLy8g7ZiE7J6sIO2FjOydtOu4lCDtlYTrk5zshYvsnYAgc2VsZWN0LCB2aXJ0dWFs7JeQIOy2lOqwgO2VmOqzoCDrpqzthLRcbiAgICAgICAgaWYgKGdyb3VwS2V5ID09PSBcIlwiKSB7XG4gICAgICAgICAgY29uc3QgcmVhbEZpZWxkcyA9IGdyb3VwZWRGaWVsZHMuZmlsdGVyKChmaWVsZCkgPT4gIWlzVmlydHVhbFByb3AodGhpcy5wcm9wc0RpY3RbZmllbGRdKSk7XG4gICAgICAgICAgLy8gdmlydHVhbFR5cGU6IFwiY29kZVwiICjrmJDripQgdW5kZWZpbmVkKeyduCB2aXJ0dWFsIHByb3Drp4wgci52aXJ0dWFs7JeQIOy2lOqwgFxuICAgICAgICAgIC8vIHZpcnR1YWxUeXBlOiBcInF1ZXJ5XCLsnbgg6rK97JqwIOyCrOyaqeyekOqwgCBhcHBlbmRTZWxlY3TroZwg7KeB7KCRIOy2lOqwgO2VmOuvgOuhnCDsoJzsmbhcbiAgICAgICAgICBjb25zdCB2aXJ0dWFsQ29kZUZpZWxkcyA9IGdyb3VwZWRGaWVsZHMuZmlsdGVyKChmaWVsZCkgPT5cbiAgICAgICAgICAgIGlzVmlydHVhbENvZGVQcm9wKHRoaXMucHJvcHNEaWN0W2ZpZWxkXSksXG4gICAgICAgICAgKTtcblxuICAgICAgICAgIGlmIChwcmVmaXggPT09IFwiXCIpIHtcbiAgICAgICAgICAgIC8vIO2YhOyerCDthYzsnbTruJTsnbgg6rK97JqwXG4gICAgICAgICAgICByLnNlbGVjdCA9IHIuc2VsZWN0LmNvbmNhdChyZWFsRmllbGRzLm1hcCgoZmllbGQpID0+IHRoaXMuZ2V0RnVsbEZpZWxkTmFtZShmaWVsZCkpKTtcbiAgICAgICAgICAgIHIudmlydHVhbCA9IHIudmlydHVhbC5jb25jYXQodmlydHVhbENvZGVGaWVsZHMpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyDrhJjslrTsmKgg7YWM7J2067iU7J24IOqyveyasFxuICAgICAgICAgICAgci5zZWxlY3QgPSByLnNlbGVjdC5jb25jYXQoXG4gICAgICAgICAgICAgIHJlYWxGaWVsZHMubWFwKChmaWVsZCkgPT4gYCR7cHJlZml4fS4ke2ZpZWxkfSBhcyAke3ByZWZpeH1fXyR7ZmllbGR9YCksXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiByO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcmVsYXRpb24gPSB0aGlzLnJlbGF0aW9uc1tncm91cEtleV07XG4gICAgICAgIGlmIChyZWxhdGlvbiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGDsobTsnqztlZjsp4Ag7JWK64qUIHJlbGF0aW9uIOywuOyhsCAke2dyb3VwS2V5fWApO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHJlbEVudGl0eSA9IEVudGl0eU1hbmFnZXIuZ2V0KHJlbGF0aW9uLndpdGgpO1xuXG4gICAgICAgIGlmIChpc09uZVRvT25lUmVsYXRpb25Qcm9wKHJlbGF0aW9uKSB8fCBpc0JlbG9uZ3NUb09uZVJlbGF0aW9uUHJvcChyZWxhdGlvbikpIHtcbiAgICAgICAgICAvLyAtT25lIFJlbGF0aW9uOiBKT0lOIOycvOuhnCDsspjrpqxcbiAgICAgICAgICBjb25zdCByZWxGaWVsZHMgPSBncm91cGVkRmllbGRzLm1hcCgoZmllbGQpID0+IGZpZWxkLnNwbGl0KFwiLlwiKS5zbGljZSgxKS5qb2luKFwiLlwiKSk7XG5cbiAgICAgICAgICAvLyAtT25lIFJlbGF0aW9u7JeQ7IScIGlkIO2VhOuTnOunjCDssLjsobDtlZjripQg6rK97JqwIOumtOugiOydtOyFmCDrhJjquLDsp4Ag7JWK6rOgIOumrO2EtFxuICAgICAgICAgIGlmIChyZWxGaWVsZHMubGVuZ3RoID09PSAxICYmIHJlbEZpZWxkc1swXSA9PT0gXCJpZFwiKSB7XG4gICAgICAgICAgICBpZiAocHJlZml4ID09PSBcIlwiKSB7XG4gICAgICAgICAgICAgIHIuc2VsZWN0ID0gci5zZWxlY3QuY29uY2F0KGAke3RoaXMudGFibGV9LiR7Z3JvdXBLZXl9X2lkYCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICByLnNlbGVjdCA9IHIuc2VsZWN0LmNvbmNhdChgJHtwcmVmaXh9LiR7Z3JvdXBLZXl9X2lkIGFzICR7cHJlZml4fV9fJHtncm91cEtleX1faWRgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiByO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIGlubmVyT3JPdXRlclxuICAgICAgICAgIGNvbnN0IGlubmVyT3JPdXRlciA9ICgoKSA9PiB7XG4gICAgICAgICAgICBpZiAoaXNBbHJlYWR5T3V0ZXJKb2luZWQpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIFwib3V0ZXJcIjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGlzT25lVG9PbmVSZWxhdGlvblByb3AocmVsYXRpb24pKSB7XG4gICAgICAgICAgICAgIGlmIChyZWxhdGlvbi5oYXNKb2luQ29sdW1uICYmICEocmVsYXRpb24ubnVsbGFibGUgPz8gZmFsc2UpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFwiaW5uZXJcIjtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gXCJvdXRlclwiO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBpZiAocmVsYXRpb24ubnVsbGFibGUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gXCJvdXRlclwiO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiBcImlubmVyXCI7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KSgpO1xuICAgICAgICAgIGNvbnN0IHJlbFN1YnNldFF1ZXJ5ID0gcmVsRW50aXR5LnJlc29sdmVTdWJzZXRRdWVyeShcbiAgICAgICAgICAgIGAke3ByZWZpeCAhPT0gXCJcIiA/IGAke3ByZWZpeH0uYCA6IFwiXCJ9JHtncm91cEtleX1gLFxuICAgICAgICAgICAgcmVsRmllbGRzLFxuICAgICAgICAgICAgaW5uZXJPck91dGVyID09PSBcIm91dGVyXCIsXG4gICAgICAgICAgKTtcbiAgICAgICAgICByLnNlbGVjdCA9IHIuc2VsZWN0LmNvbmNhdChyZWxTdWJzZXRRdWVyeS5zZWxlY3QpO1xuICAgICAgICAgIHIudmlydHVhbCA9IHIudmlydHVhbC5jb25jYXQocmVsU3Vic2V0UXVlcnkudmlydHVhbCk7XG5cbiAgICAgICAgICBjb25zdCBqb2luQXMgPSBwcmVmaXggPT09IFwiXCIgPyBncm91cEtleSA6IGAke3ByZWZpeH1fXyR7Z3JvdXBLZXl9YDtcbiAgICAgICAgICBjb25zdCBmcm9tVGFibGUgPSBwcmVmaXggPT09IFwiXCIgPyB0aGlzLnRhYmxlIDogcHJlZml4O1xuXG4gICAgICAgICAgbGV0IGpvaW5DbGF1c2U6XG4gICAgICAgICAgICB8IHtcbiAgICAgICAgICAgICAgICBmcm9tOiBzdHJpbmc7XG4gICAgICAgICAgICAgICAgdG86IHN0cmluZztcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfCB7XG4gICAgICAgICAgICAgICAgY3VzdG9tOiBzdHJpbmc7XG4gICAgICAgICAgICAgIH07XG4gICAgICAgICAgaWYgKHJlbGF0aW9uLmN1c3RvbUpvaW5DbGF1c2UpIHtcbiAgICAgICAgICAgIGpvaW5DbGF1c2UgPSB7XG4gICAgICAgICAgICAgIGN1c3RvbTogcmVsYXRpb24uY3VzdG9tSm9pbkNsYXVzZSxcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGxldCBmcm9tOiBzdHJpbmcsIHRvOiBzdHJpbmc7XG4gICAgICAgICAgICBpZiAoaXNPbmVUb09uZVJlbGF0aW9uUHJvcChyZWxhdGlvbikpIHtcbiAgICAgICAgICAgICAgaWYgKHJlbGF0aW9uLmhhc0pvaW5Db2x1bW4pIHtcbiAgICAgICAgICAgICAgICBmcm9tID0gYCR7ZnJvbVRhYmxlfS4ke3JlbGF0aW9uLm5hbWV9X2lkYDtcbiAgICAgICAgICAgICAgICB0byA9IGAke2pvaW5Bc30uaWRgO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGZyb20gPSBgJHtmcm9tVGFibGV9LmlkYDtcbiAgICAgICAgICAgICAgICB0byA9IGAke2pvaW5Bc30uJHtpbmZsZWN0aW9uLnVuZGVyc2NvcmUodGhpcy5uYW1lcy5mcy5yZXBsYWNlKC8tL2csIFwiX1wiKSl9X2lkYDtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgZnJvbSA9IGAke2Zyb21UYWJsZX0uJHtyZWxhdGlvbi5uYW1lfV9pZGA7XG4gICAgICAgICAgICAgIHRvID0gYCR7am9pbkFzfS5pZGA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBqb2luQ2xhdXNlID0ge1xuICAgICAgICAgICAgICBmcm9tLFxuICAgICAgICAgICAgICB0byxcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgci5qb2lucy5wdXNoKHtcbiAgICAgICAgICAgIGFzOiBqb2luQXMsXG4gICAgICAgICAgICBqb2luOiBpbm5lck9yT3V0ZXIsXG4gICAgICAgICAgICB0YWJsZTogcmVsRW50aXR5LnRhYmxlLFxuICAgICAgICAgICAgLi4uam9pbkNsYXVzZSxcbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIC8vIEJlbG9uZ3NUb09uZSDrsJHsl5AgSGFzTWFueeqwgCDrtpnsnYAg6rK97JqwXG4gICAgICAgICAgaWYgKHJlbFN1YnNldFF1ZXJ5LmxvYWRlcnMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgY29uc3QgY29udmVydGVkTG9hZGVycyA9IHJlbFN1YnNldFF1ZXJ5LmxvYWRlcnMubWFwKChsb2FkZXIpID0+IHtcbiAgICAgICAgICAgICAgY29uc3QgbmV3QXMgPSBbZ3JvdXBLZXksIGxvYWRlci5hc10uam9pbihcIl9fXCIpO1xuICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIGFzOiBuZXdBcyxcbiAgICAgICAgICAgICAgICB0YWJsZTogbG9hZGVyLnRhYmxlLFxuICAgICAgICAgICAgICAgIG1hbnlKb2luOiBsb2FkZXIubWFueUpvaW4sXG4gICAgICAgICAgICAgICAgb25lSm9pbnM6IGxvYWRlci5vbmVKb2lucyxcbiAgICAgICAgICAgICAgICBzZWxlY3Q6IGxvYWRlci5zZWxlY3QsXG4gICAgICAgICAgICAgICAgbG9hZGVyczogbG9hZGVyLmxvYWRlcnMsXG4gICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgci5sb2FkZXJzID0gWy4uLnIubG9hZGVycywgLi4uY29udmVydGVkTG9hZGVyc107XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgci5qb2lucyA9IHIuam9pbnMuY29uY2F0KHJlbFN1YnNldFF1ZXJ5LmpvaW5zKTtcbiAgICAgICAgfSBlbHNlIGlmIChpc0hhc01hbnlSZWxhdGlvblByb3AocmVsYXRpb24pIHx8IGlzTWFueVRvTWFueVJlbGF0aW9uUHJvcChyZWxhdGlvbikpIHtcbiAgICAgICAgICAvLyAtTWFueSBSZWxhdGlvbjogTG9hZGVyIOuhnCDsspjrpqxcbiAgICAgICAgICBjb25zdCByZWxGaWVsZHMgPSBncm91cGVkRmllbGRzLm1hcCgoZmllbGQpID0+IGZpZWxkLnNwbGl0KFwiLlwiKS5zbGljZSgxKS5qb2luKFwiLlwiKSk7XG4gICAgICAgICAgY29uc3QgcmVsU3Vic2V0UXVlcnkgPSByZWxFbnRpdHkucmVzb2x2ZVN1YnNldFF1ZXJ5KFwiXCIsIHJlbEZpZWxkcyk7XG5cbiAgICAgICAgICBsZXQgbWFueUpvaW46IFN1YnNldFF1ZXJ5W1wibG9hZGVyc1wiXVtudW1iZXJdW1wibWFueUpvaW5cIl07XG4gICAgICAgICAgaWYgKGlzSGFzTWFueVJlbGF0aW9uUHJvcChyZWxhdGlvbikpIHtcbiAgICAgICAgICAgIGNvbnN0IGZyb21Db2wgPSByZWxhdGlvbj8uZnJvbUNvbHVtbiA/PyBcImlkXCI7XG4gICAgICAgICAgICBtYW55Sm9pbiA9IHtcbiAgICAgICAgICAgICAgZnJvbVRhYmxlOiB0aGlzLnRhYmxlLFxuICAgICAgICAgICAgICBmcm9tQ29sLFxuICAgICAgICAgICAgICBpZEZpZWxkOiBwcmVmaXggPT09IFwiXCIgPyBgJHtmcm9tQ29sfWAgOiBgJHtwcmVmaXh9X18ke2Zyb21Db2x9YCxcbiAgICAgICAgICAgICAgdG9UYWJsZTogcmVsRW50aXR5LnRhYmxlLFxuICAgICAgICAgICAgICB0b0NvbDogcmVsYXRpb24uam9pbkNvbHVtbixcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfSBlbHNlIGlmIChpc01hbnlUb01hbnlSZWxhdGlvblByb3AocmVsYXRpb24pKSB7XG4gICAgICAgICAgICBtYW55Sm9pbiA9IHtcbiAgICAgICAgICAgICAgZnJvbVRhYmxlOiB0aGlzLnRhYmxlLFxuICAgICAgICAgICAgICBmcm9tQ29sOiBcImlkXCIsXG4gICAgICAgICAgICAgIGlkRmllbGQ6IHByZWZpeCA9PT0gXCJcIiA/IGBpZGAgOiBgJHtwcmVmaXh9X19pZGAsXG4gICAgICAgICAgICAgIHRocm91Z2g6IHtcbiAgICAgICAgICAgICAgICB0YWJsZTogcmVsYXRpb24uam9pblRhYmxlLFxuICAgICAgICAgICAgICAgIGZyb21Db2w6IGAke2luZmxlY3Rpb24uc2luZ3VsYXJpemUodGhpcy50YWJsZSl9X2lkYCxcbiAgICAgICAgICAgICAgICB0b0NvbDogYCR7aW5mbGVjdGlvbi5zaW5ndWxhcml6ZShyZWxFbnRpdHkudGFibGUpfV9pZGAsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIHRvVGFibGU6IHJlbEVudGl0eS50YWJsZSxcbiAgICAgICAgICAgICAgdG9Db2w6IFwiaWRcIixcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcigpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHIubG9hZGVycy5wdXNoKHtcbiAgICAgICAgICAgIGFzOiBncm91cEtleSxcbiAgICAgICAgICAgIHRhYmxlOiByZWxFbnRpdHkudGFibGUsXG4gICAgICAgICAgICBtYW55Sm9pbixcbiAgICAgICAgICAgIG9uZUpvaW5zOiByZWxTdWJzZXRRdWVyeS5qb2lucyxcbiAgICAgICAgICAgIHNlbGVjdDogcmVsU3Vic2V0UXVlcnkuc2VsZWN0LFxuICAgICAgICAgICAgbG9hZGVyczogcmVsU3Vic2V0UXVlcnkubG9hZGVycyxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiByO1xuICAgICAgfSxcbiAgICAgIC8vIFNBRkVUWTog7Iqk7YKk66eIIOqygOymneqzvCDrqZTtg4DrjbDsnbTthLAg6rOE7JW97J20IOydtCDtg4DsnoXsnYQg67O07J6l7ZWp64uI64ukLlxuICAgICAge1xuICAgICAgICBzZWxlY3Q6IFtdLFxuICAgICAgICB2aXJ0dWFsOiBbXSxcbiAgICAgICAgam9pbnM6IFtdLFxuICAgICAgICBsb2FkZXJzOiBbXSxcbiAgICAgIH0gYXMgU3Vic2V0UXVlcnksXG4gICAgKTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgLypcbiAgICBGaWVsZEV4cHJbXSDsnYQgRW50aXR5UHJvcE5vZGVbXSDroZwg67OA7ZmYXG4gICovXG4gIGZpZWxkRXhwcnNUb1Byb3BOb2RlcyhmaWVsZEV4cHJzOiBzdHJpbmdbXSwgZW50aXR5OiBFbnRpdHkgPSB0aGlzKTogRW50aXR5UHJvcE5vZGVbXSB7XG4gICAgY29uc3QgZ3JvdXBzID0gZmllbGRFeHBycy5yZWR1Y2UoXG4gICAgICAocmVzdWx0LCBmaWVsZEV4cHIpID0+IHtcbiAgICAgICAgbGV0IGtleTogc3RyaW5nLCB2YWx1ZTogc3RyaW5nLCBlbHNlRXhwcjogc3RyaW5nW107XG4gICAgICAgIGlmIChmaWVsZEV4cHIuaW5jbHVkZXMoXCIuXCIpKSB7XG4gICAgICAgICAgW2tleSwgLi4uZWxzZUV4cHJdID0gZmllbGRFeHByLnNwbGl0KFwiLlwiKTtcbiAgICAgICAgICB2YWx1ZSA9IGVsc2VFeHByLmpvaW4oXCIuXCIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGtleSA9IFwiXCI7XG4gICAgICAgICAgdmFsdWUgPSBmaWVsZEV4cHI7XG4gICAgICAgIH1cbiAgICAgICAgcmVzdWx0W2tleV0gPSAocmVzdWx0W2tleV0gPz8gW10pLmNvbmNhdCh2YWx1ZSk7XG5cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgIH0sXG4gICAgICAvLyBTQUZFVFk6IOyKpO2CpOuniCDqsoDspp3qs7wg66mU7YOA642w7J207YSwIOqzhOyVveydtCDsnbQg7YOA7J6F7J2EIOuztOyepe2VqeuLiOuLpC5cbiAgICAgIHt9IGFzIHtcbiAgICAgICAgW2s6IHN0cmluZ106IHN0cmluZ1tdO1xuICAgICAgfSxcbiAgICApO1xuXG4gICAgcmV0dXJuIE9iamVjdC5rZXlzKGdyb3VwcykuZmxhdE1hcDxFbnRpdHlQcm9wTm9kZSwgRW50aXR5UHJvcE5vZGVbXT4oKGtleSkgPT4ge1xuICAgICAgY29uc3QgZ3JvdXBlZEZpZWxkRXhwcnMgPSBncm91cHNba2V5XTtcblxuICAgICAgLy8g7J2867CYIHByb3Ag7LKY66asXG4gICAgICBpZiAoa2V5ID09PSBcIlwiKSB7XG4gICAgICAgIHJldHVybiBncm91cGVkRmllbGRFeHBycy5tYXAoKHByb3BOYW1lKSA9PiB7XG4gICAgICAgICAgY29uc3QgcHJvcCA9IGVudGl0eS5wcm9wcy5maW5kKChwKSA9PiBwLm5hbWUgPT09IHByb3BOYW1lKTtcbiAgICAgICAgICBpZiAocHJvcCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICAgIGAke2VudGl0eS5pZH0gLS0g7J6Y66q765CcIEZpZWxkRXhwciAnJHtwcm9wTmFtZX0nICjsgqzsmqkg6rCA64ql7ZWcIHByb3BzOiAke2VudGl0eS5wcm9wcy5tYXAoKHApID0+IHAubmFtZSkuam9pbihcIiwgXCIpfSlgLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIG5vZGVUeXBlOiBcInBsYWluXCIgYXMgY29uc3QsXG4gICAgICAgICAgICBwcm9wLFxuICAgICAgICAgIH07XG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICAvLyByZWxhdGlvbiBwcm9wIOyymOumrFxuICAgICAgY29uc3QgcHJvcCA9IGVudGl0eS5wcm9wc0RpY3Rba2V5XTtcbiAgICAgIGlmICghaXNSZWxhdGlvblByb3AocHJvcCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGDsnpjrqrvrkJwgRmllbGRFeHByICR7a2V5fS4ke2dyb3VwZWRGaWVsZEV4cHJzWzBdfWApO1xuICAgICAgfVxuICAgICAgY29uc3QgcmVsRW50aXR5ID0gRW50aXR5TWFuYWdlci5nZXQocHJvcC53aXRoKTtcblxuICAgICAgLy8gcmVsYXRpb24gLU9uZSDsl5AgaWQg7ZWE65OcIO2VmOuCmOyduCDqsr3smrBcbiAgICAgIGlmIChpc0JlbG9uZ3NUb09uZVJlbGF0aW9uUHJvcChwcm9wKSB8fCBpc09uZVRvT25lUmVsYXRpb25Qcm9wKHByb3ApKSB7XG4gICAgICAgIGlmIChcbiAgICAgICAgICBncm91cGVkRmllbGRFeHBycy5sZW5ndGggPT09IDEgJiZcbiAgICAgICAgICAoZ3JvdXBlZEZpZWxkRXhwcnNbMF0gPT09IFwiaWRcIiB8fCBncm91cGVkRmllbGRFeHByc1swXSA9PT0gXCJpZD9cIilcbiAgICAgICAgKSB7XG4gICAgICAgICAgLy8gaWQg7ZWY64KY66eMIOyeiOuKlOyngCDssrTtgaztlbTshJwsIO2VmOuCmOunjCDsnojsnLzrqbQg7IOB7JyEIHByb3DsnLzroZwgaWTrpbwg66as7YS0XG4gICAgICAgICAgY29uc3QgaWRQcm9wID0gcmVsRW50aXR5LnByb3BzRGljdC5pZDtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgbm9kZVR5cGU6IFwicGxhaW5cIiBhcyBjb25zdCxcbiAgICAgICAgICAgIHByb3A6IHtcbiAgICAgICAgICAgICAgLi4uaWRQcm9wLFxuICAgICAgICAgICAgICBuYW1lOiBgJHtrZXl9X2lkYCxcbiAgICAgICAgICAgICAgbnVsbGFibGU6IHByb3AubnVsbGFibGUsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gLU9uZSDqt7jsmbjsnZgg6rK97JqwIG9iamVjdOuhnCDrpqzthLRcbiAgICAgIC8vIC1NYW557J2YIOqyveyasCBhcnJheeuhnCDrpqzthLRcbiAgICAgIC8vIFJlY3Vyc2l2ZSDroZwg646B7IqkIOyymOumrFxuICAgICAgY29uc3QgY2hpbGRyZW4gPSB0aGlzLmZpZWxkRXhwcnNUb1Byb3BOb2Rlcyhncm91cGVkRmllbGRFeHBycywgcmVsRW50aXR5KTtcbiAgICAgIGNvbnN0IG5vZGVUeXBlID1cbiAgICAgICAgaXNCZWxvbmdzVG9PbmVSZWxhdGlvblByb3AocHJvcCkgfHwgaXNPbmVUb09uZVJlbGF0aW9uUHJvcChwcm9wKVxuICAgICAgICAgID8gKFwib2JqZWN0XCIgYXMgY29uc3QpXG4gICAgICAgICAgOiAoXCJhcnJheVwiIGFzIGNvbnN0KTtcblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgbm9kZVR5cGUsXG4gICAgICAgIHByb3AsXG4gICAgICAgIGNoaWxkcmVuLFxuICAgICAgfTtcbiAgICB9KTtcbiAgfVxuXG4gIGdldEZpZWxkRXhwcnMocHJlZml4ID0gXCJcIiwgbWF4RGVwdGg6IG51bWJlciA9IDMsIGZyb21zOiBzdHJpbmdbXSA9IFtdKTogc3RyaW5nW10ge1xuICAgIHJldHVybiB0aGlzLnByb3BzXG4gICAgICAuZmxhdE1hcCgocHJvcCkgPT4ge1xuICAgICAgICBjb25zdCBwcm9wTmFtZSA9IFtwcmVmaXgsIHByb3AubmFtZV0uZmlsdGVyKCh2KSA9PiB2ICE9PSBcIlwiKS5qb2luKFwiLlwiKTtcbiAgICAgICAgaWYgKHByb3BOYW1lID09PSBwcmVmaXgpIHtcbiAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaXNSZWxhdGlvblByb3AocHJvcCkpIHtcbiAgICAgICAgICBpZiAobWF4RGVwdGggPCAwKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGZyb21zLmluY2x1ZGVzKHByb3Aud2l0aCkpIHtcbiAgICAgICAgICAgIC8vIOyXreuwqe2WpSByZWxhdGlvbuyduCDqsr3smrAg7KCc7Jm4XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICB9XG4gICAgICAgICAgLy8g7KCV67Cp7ZalIHJlbGF0aW9u7J24IOqyveyasCByZWN1cnNpdmUg7L2cXG4gICAgICAgICAgY29uc3QgcmVsTWQgPSBFbnRpdHlNYW5hZ2VyLmdldChwcm9wLndpdGgpO1xuICAgICAgICAgIHJldHVybiByZWxNZC5nZXRGaWVsZEV4cHJzKHByb3BOYW1lLCBtYXhEZXB0aCAtIDEsIFsuLi5mcm9tcywgdGhpcy5pZF0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBwcm9wTmFtZTtcbiAgICAgIH0pXG4gICAgICAuZmlsdGVyKChmKSA9PiBmICE9PSBudWxsKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWxhdGlvbiBwcm9w7J20IO2YhOyerCDthYzsnbTruJTsl5AgRksg7Lus65+87J2EIOyDneyEse2VmOuKlOyngCDtmZXsnbhcbiAgICooQmVsb25nc1RvT25lIOuYkOuKlCBPbmVUb09uZShoYXNKb2luQ29sdW1uPXRydWUp7J24IOqyveyasCBGSyDsg53shLEpXG4gICAqL1xuICBwcml2YXRlIGhhc0ZvcmVpZ25LZXkocHJvcDogUmVsYXRpb25Qcm9wKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIChcbiAgICAgIHByb3AucmVsYXRpb25UeXBlID09PSBcIkJlbG9uZ3NUb09uZVwiIHx8XG4gICAgICAocHJvcC5yZWxhdGlvblR5cGUgPT09IFwiT25lVG9PbmVcIiAmJiBwcm9wLmhhc0pvaW5Db2x1bW4pXG4gICAgKTtcbiAgfVxuXG4gIGdldFRhYmxlQ29sdW1ucygpOiB7IG5hbWU6IHN0cmluZzsgdHlwZTogc3RyaW5nIH1bXSB7XG4gICAgcmV0dXJuIHRoaXMucHJvcHNcbiAgICAgIC5tYXAoKHByb3ApID0+IHtcbiAgICAgICAgaWYgKHByb3AudHlwZSA9PT0gXCJyZWxhdGlvblwiKSB7XG4gICAgICAgICAgaWYgKHRoaXMuaGFzRm9yZWlnbktleShwcm9wKSkge1xuICAgICAgICAgICAgcmV0dXJuIHsgbmFtZTogYCR7cHJvcC5uYW1lfV9pZGAsIHR5cGU6IFwiaW50X3Vuc2lnbmVkXCIgfTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7IG5hbWU6IHByb3AubmFtZSwgdHlwZTogcHJvcC50eXBlIH07XG4gICAgICB9KVxuICAgICAgLmZpbHRlcihub25OdWxsYWJsZSk7XG4gIH1cblxuICAvKipcbiAgICogRW50aXR57JeQIOygleydmOuQnCDrqqjrk6AgdmVjdG9yIO2DgOyehSDsu6zrn7wg67CY7ZmYXG4gICAqL1xuICBnZXRWZWN0b3JDb2x1bW5zKCk6IEVudGl0eVByb3BbXSB7XG4gICAgcmV0dXJuIHRoaXMucHJvcHMuZmlsdGVyKChwKSA9PiBwLnR5cGUgPT09IFwidmVjdG9yXCIpO1xuICB9XG5cbiAgLyoqXG4gICAqIO2KueyglSB2ZWN0b3Ig7Lus65+8IOuwmO2ZmFxuICAgKiBAcGFyYW0gY29sdW1uTmFtZSAtIOy7rOufvOuqhSAo7IOd6561IOyLnCDssqsg67KI7Ke4IHZlY3RvciDsu6zrn7wpXG4gICAqL1xuICBnZXRWZWN0b3JDb2x1bW4oY29sdW1uTmFtZT86IHN0cmluZyk6IEVudGl0eVByb3AgfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IHZlY3RvclByb3BzID0gdGhpcy5nZXRWZWN0b3JDb2x1bW5zKCk7XG4gICAgaWYgKGNvbHVtbk5hbWUpIHtcbiAgICAgIHJldHVybiB2ZWN0b3JQcm9wcy5maW5kKChwKSA9PiBwLm5hbWUgPT09IGNvbHVtbk5hbWUpO1xuICAgIH1cbiAgICByZXR1cm4gdmVjdG9yUHJvcHNbMF07XG4gIH1cblxuICAvKipcbiAgICog7ZWE7YSw66eBIOqwgOuKpe2VnCBwcm9wcyDrsJjtmZhcbiAgICpcbiAgICogLSDsnbzrsJggcHJvcFxuICAgKiAtIEZL66W8IOyDneyEse2VmOuKlCByZWxhdGlvbiAoQmVsb25nc1RvT25lLCBPbmVUb09uZSB3aXRoIGhhc0pvaW5Db2x1bW4pXG4gICAqICAg4oaSIHtuYW1lfV9pZCDtmJXtg5zsnZgg6rCA7IOBIGludGVnZXIgcHJvcOycvOuhnCDrs4DtmZhcbiAgICovXG4gIGdldEZpbHRlcmFibGVQcm9wcygpOiBFbnRpdHlQcm9wW10ge1xuICAgIHJldHVybiB0aGlzLnByb3BzLmZsYXRNYXAoKHByb3ApOiBFbnRpdHlQcm9wIHwgRW50aXR5UHJvcFtdID0+IHtcbiAgICAgIC8vIFZpcnR1YWwgcHJvcCDsoJzsmbhcbiAgICAgIGlmIChpc1ZpcnR1YWxQcm9wKHByb3ApKSB7XG4gICAgICAgIHJldHVybiBbXTtcbiAgICAgIH1cblxuICAgICAgLy8gUmVsYXRpb24gcHJvcCDsspjrpqxcbiAgICAgIGlmIChpc1JlbGF0aW9uUHJvcChwcm9wKSkge1xuICAgICAgICAvLyBGS+ulvCDsg53shLHtlZjripQgcmVsYXRpb27rp4wg7Y+s7ZWoXG4gICAgICAgIGlmICh0aGlzLmhhc0ZvcmVpZ25LZXkocHJvcCkpIHtcbiAgICAgICAgICAvLyBTQUZFVFk6IOyKpO2CpOuniCDqsoDspp3qs7wg66mU7YOA642w7J207YSwIOqzhOyVveydtCDsnbQg7YOA7J6F7J2EIOuztOyepe2VqeuLiOuLpC5cbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgbmFtZTogYCR7cHJvcC5uYW1lfV9pZGAsXG4gICAgICAgICAgICB0eXBlOiBcImludGVnZXJcIixcbiAgICAgICAgICAgIG51bGxhYmxlOiBwcm9wLm51bGxhYmxlLFxuICAgICAgICAgIH0gYXMgRW50aXR5UHJvcDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gW107XG4gICAgICB9XG5cbiAgICAgIC8vIOydvOuwmCBwcm9wIOyymOumrFxuICAgICAgcmV0dXJuIHByb3A7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogRW50aXR56rCAIOuFuOy2nO2VmOuKlCDtg4DsnoUg7J2066aE6rO8IOuqqOuTiCDqsr3roZzrpbwgRW50aXR5TWFuYWdlcuyXkCDrk7HroZ3tlanri4jri6QuXG4gICAqXG4gICAqIEBwYXJhbSBleHBsaWNpdEFwaVJvb3RQYXRoIC0gU29uYW11IOy0iOq4sO2ZlCDsl4bsnbQg65Ox66Gd7ZWgIOuVjCDsgqzsmqntlaAgQVBJIOujqO2KuCDqsr3roZxcbiAgICovXG4gIGFzeW5jIHJlZ2lzdGVyTW9kdWxlUGF0aHMoZXhwbGljaXRBcGlSb290UGF0aD86IHN0cmluZykge1xuICAgIGNvbnN0IGJhc2VQYXRoID0gYCR7dGhpcy5uYW1lcy5wYXJlbnRGc31gO1xuXG4gICAgLy8gYmFzZS1zY2hlbWVcbiAgICBFbnRpdHlNYW5hZ2VyLnNldE1vZHVsZVBhdGgoYCR7dGhpcy5pZH1CYXNlU2NoZW1hYCwgYHNvbmFtdS5nZW5lcmF0ZWRgKTtcblxuICAgIC8vIHN1YnNldFxuICAgIGlmIChPYmplY3Qua2V5cyh0aGlzLnN1YnNldHMpLmxlbmd0aCA+IDApIHtcbiAgICAgIEVudGl0eU1hbmFnZXIuc2V0TW9kdWxlUGF0aChgJHt0aGlzLmlkfVN1YnNldEtleWAsIGBzb25hbXUuZ2VuZXJhdGVkYCk7XG4gICAgICBFbnRpdHlNYW5hZ2VyLnNldE1vZHVsZVBhdGgoYCR7dGhpcy5pZH1TdWJzZXRNYXBwaW5nYCwgYHNvbmFtdS5nZW5lcmF0ZWRgKTtcbiAgICAgIGZvciAoY29uc3Qgc3Vic2V0S2V5IG9mIE9iamVjdC5rZXlzKHRoaXMuc3Vic2V0cykpIHtcbiAgICAgICAgRW50aXR5TWFuYWdlci5zZXRNb2R1bGVQYXRoKFxuICAgICAgICAgIGAke3RoaXMuaWR9U3Vic2V0JHtzdWJzZXRLZXkudG9VcHBlckNhc2UoKX1gLFxuICAgICAgICAgIGBzb25hbXUuZ2VuZXJhdGVkYCxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBlbnVtc1xuICAgIGZvciAoY29uc3QgZW51bUlkIG9mIE9iamVjdC5rZXlzKHRoaXMuZW51bUxhYmVscykpIHtcbiAgICAgIEVudGl0eU1hbmFnZXIuc2V0TW9kdWxlUGF0aChlbnVtSWQsIGBzb25hbXUuZ2VuZXJhdGVkYCk7XG4gICAgfVxuXG4gICAgLy8gdHlwZXNcbiAgICBjb25zdCB0eXBlc01vZHVsZVBhdGggPSBgJHtiYXNlUGF0aH0vJHt0aGlzLm5hbWVzLnBhcmVudEZzfS50eXBlc2A7XG4gICAgY29uc3QgdHlwZXNGaWxlUGF0aCA9IHBhdGguam9pbihcbiAgICAgIGV4cGxpY2l0QXBpUm9vdFBhdGggPz8gU29uYW11LmFwaVJvb3RQYXRoLFxuICAgICAgcnVudGltZVBhdGgoYGRpc3QvYXBwbGljYXRpb24vJHt0eXBlc01vZHVsZVBhdGh9LmpzYCksXG4gICAgKTtcblxuICAgIGlmIChhd2FpdCBleGlzdHModHlwZXNGaWxlUGF0aCkpIHtcbiAgICAgIGNvbnN0IGltcG9ydGVkTWVtYmVycyA9IGF3YWl0IGltcG9ydE1lbWJlcnM8ei5ab2RUeXBlQW55Pih0eXBlc0ZpbGVQYXRoKTtcbiAgICAgIC8vIFNBRkVUWTog7Iqk7YKk66eIIOqygOymneqzvCDrqZTtg4DrjbDsnbTthLAg6rOE7JW97J20IOydtCDtg4DsnoXsnYQg67O07J6l7ZWp64uI64ukLlxuICAgICAgdGhpcy50eXBlcyA9IE9iamVjdC5mcm9tRW50cmllcyhcbiAgICAgICAgaW1wb3J0ZWRNZW1iZXJzLm1hcCgoeyBuYW1lLCB2YWx1ZSB9KSA9PiB7XG4gICAgICAgICAgRW50aXR5TWFuYWdlci5zZXRNb2R1bGVQYXRoKG5hbWUsIHR5cGVzTW9kdWxlUGF0aCk7XG4gICAgICAgICAgcmV0dXJuIFtuYW1lLCB2YWx1ZV07XG4gICAgICAgIH0pLFxuICAgICAgKSBhcyB7IFtuYW1lOiBzdHJpbmddOiB6LlpvZFR5cGVBbnkgfTtcbiAgICB9XG4gIH1cblxuICByZWdpc3RlclRhYmxlU3BlY3MoKTogdm9pZCB7XG4gICAgLy8g7KGw7J24IO2FjOydtOu4lCDsnbjrjbHsiqQg7KCc7Jm4ICjsu6zrn7wg7J2066aE7JeQICcuJ+ydtCDtj6ztlajrkJwg6rK97JqwKVxuICAgIGNvbnN0IHVuaXF1ZUluZGV4ZXMgPSB0aGlzLmluZGV4ZXNcbiAgICAgIC5maWx0ZXIoKGlkeCkgPT4gaWR4LnR5cGUgPT09IFwidW5pcXVlXCIpXG4gICAgICAuZmlsdGVyKChpZHgpID0+IGlkeC5jb2x1bW5zLmV2ZXJ5KChjb2wpID0+ICFjb2wubmFtZS5pbmNsdWRlcyhcIi5cIikpKTtcblxuICAgIEVudGl0eU1hbmFnZXIuc2V0VGFibGVTcGVjKHtcbiAgICAgIG5hbWU6IHRoaXMudGFibGUsXG4gICAgICB1bmlxdWVJbmRleGVzLFxuICAgICAganNvbkNvbHVtbnM6IHRoaXMucHJvcHMuZmlsdGVyKChwKSA9PiBwLnR5cGUgPT09IFwianNvblwiKS5tYXAoKHApID0+IHAubmFtZSksXG4gICAgfSk7XG4gIH1cblxuICB0b0pzb24oKTogRW50aXR5SnNvbiB7XG4gICAgLy8gc3Vic2V0c+yZgCBzdWJzZXRzSW50ZXJuYWzsnYQgU3Vic2V0RGVmIO2Yle2DnOuhnCDrs7Xsm5AgKGNvbmUg7Y+s7ZWoKVxuICAgIGNvbnN0IHN1YnNldHM6IHsgW2tleTogc3RyaW5nXTogaW1wb3J0KFwiLi4vdHlwZXMvdHlwZXNcIikuU3Vic2V0RGVmIH0gPSB7fTtcbiAgICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyh0aGlzLnN1YnNldHMpKSB7XG4gICAgICBjb25zdCBub3JtYWxGaWVsZHM6IFN1YnNldEZpZWxkW10gPSB0aGlzLnN1YnNldHNba2V5XTtcbiAgICAgIGNvbnN0IGludGVybmFsRmllbGRzOiBTdWJzZXRGaWVsZFtdID0gKHRoaXMuc3Vic2V0c0ludGVybmFsW2tleV0gPz8gW10pLm1hcCgoZmllbGQpID0+ICh7XG4gICAgICAgIGZpZWxkLFxuICAgICAgICBpbnRlcm5hbDogdHJ1ZSxcbiAgICAgIH0pKTtcbiAgICAgIGNvbnN0IGZpZWxkcyA9IFsuLi5ub3JtYWxGaWVsZHMsIC4uLmludGVybmFsRmllbGRzXTtcblxuICAgICAgLy8gY29uZeydtCDsnojsnLzrqbQg7IOI66Gc7Jq0IOqwneyytCDtmJXtg5zroZwsIOyXhuycvOuptCDrsLDsl7Qg7ZiV7YOc66GcXG4gICAgICBpZiAodGhpcy5zdWJzZXRDb25lc1trZXldKSB7XG4gICAgICAgIHN1YnNldHNba2V5XSA9IHtcbiAgICAgICAgICBmaWVsZHMsXG4gICAgICAgICAgY29uZTogdGhpcy5zdWJzZXRDb25lc1trZXldLFxuICAgICAgICB9O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc3Vic2V0c1trZXldID0gZmllbGRzO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIGVudW1z66W8IEVudW1EZWYg7ZiV7YOc66GcIOuzteybkCAoY29uZSDtj6ztlagpXG4gICAgY29uc3QgZW51bXM6IHsgW2tleTogc3RyaW5nXTogaW1wb3J0KFwiLi4vdHlwZXMvdHlwZXNcIikuRW51bURlZiB9ID0ge307XG4gICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZXNdIG9mIE9iamVjdC5lbnRyaWVzKHRoaXMuZW51bUxhYmVscykpIHtcbiAgICAgIC8vIGNvbmXsnbQg7J6I7Jy866m0IOyDiOuhnOyatCDqsJ3ssrQg7ZiV7YOc66GcLCDsl4bsnLzrqbQgUmVjb3JkIO2Yle2DnOuhnFxuICAgICAgaWYgKHRoaXMuZW51bUNvbmVzW2tleV0pIHtcbiAgICAgICAgZW51bXNba2V5XSA9IHtcbiAgICAgICAgICB2YWx1ZXMsXG4gICAgICAgICAgY29uZTogdGhpcy5lbnVtQ29uZXNba2V5XSxcbiAgICAgICAgfTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGVudW1zW2tleV0gPSB2YWx1ZXM7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIGlkOiB0aGlzLmlkLFxuICAgICAgcGFyZW50SWQ6IHRoaXMucGFyZW50SWQsXG4gICAgICB0YWJsZTogdGhpcy50YWJsZSxcbiAgICAgIHRpdGxlOiB0aGlzLnRpdGxlLFxuICAgICAgY29uZTogdGhpcy5jb25lLFxuICAgICAgcHJvcHM6IHRoaXMucHJvcHMsXG4gICAgICBpbmRleGVzOiB0aGlzLmluZGV4ZXMsXG4gICAgICBzdWJzZXRzLFxuICAgICAgZW51bXMsXG4gICAgfTtcbiAgfVxuXG4gIGFzeW5jIHNhdmUoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgLy8gc29ydDogc3Vic2V0c1xuICAgIGNvbnN0IHN1YnNldFJvd3MgPSB0aGlzLmdldFN1YnNldFJvd3MoKTtcbiAgICB0aGlzLnN1YnNldHMgPSBPYmplY3QuZnJvbUVudHJpZXMoXG4gICAgICBPYmplY3QuZW50cmllcyh0aGlzLnN1YnNldHMpLm1hcCgoW3N1YnNldEtleV0pID0+IHtcbiAgICAgICAgcmV0dXJuIFtzdWJzZXRLZXksIHRoaXMuc3Vic2V0Um93c1RvU3Vic2V0RmllbGRzKHN1YnNldFJvd3MsIHN1YnNldEtleSwgZmFsc2UpXTtcbiAgICAgIH0pLFxuICAgICk7XG4gICAgdGhpcy5zdWJzZXRzSW50ZXJuYWwgPSBPYmplY3QuZnJvbUVudHJpZXMoXG4gICAgICBPYmplY3QuZW50cmllcyh0aGlzLnN1YnNldHNJbnRlcm5hbCkubWFwKChbc3Vic2V0S2V5XSkgPT4ge1xuICAgICAgICByZXR1cm4gW3N1YnNldEtleSwgdGhpcy5zdWJzZXRSb3dzVG9TdWJzZXRGaWVsZHMoc3Vic2V0Um93cywgc3Vic2V0S2V5LCB0cnVlKV07XG4gICAgICB9KSxcbiAgICApO1xuXG4gICAgLy8gc2F2ZVxuICAgIGNvbnN0IGpzb25QYXRoID0gcGF0aC5qb2luKFxuICAgICAgU29uYW11LmFwaVJvb3RQYXRoLFxuICAgICAgYHNyYy9hcHBsaWNhdGlvbi8ke3RoaXMubmFtZXMucGFyZW50RnN9LyR7dGhpcy5uYW1lcy5mc30uZW50aXR5Lmpzb25gLFxuICAgICk7XG4gICAgY29uc3QganNvbiA9IHRoaXMudG9Kc29uKCk7XG4gICAgYXdhaXQgd3JpdGVGaWxlKGpzb25QYXRoLCBhd2FpdCBmb3JtYXRDb2RlKEpTT04uc3RyaW5naWZ5KGpzb24pLCBqc29uUGF0aCkpO1xuXG4gICAgLy8gcmVsb2FkXG4gICAgYXdhaXQgRW50aXR5TWFuYWdlci5yZWdpc3Rlcihqc29uKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDthZztlIzrpr8gY29uZSDrqZTtg4DrjbDsnbTthLDrpbwg7IOd7ISx7ZWp64uI64ukLlxuICAgKlxuICAgKiBMTE3snYQg7IKs7Jqp7ZWY7KeAIOyViuqzoCBmYWtlci1tYXBwaW5ncy50c+ulvCDtmZzsmqntlZjsl6wg6riw67O4IGNvbmXsnYQg7IOd7ISx7ZWp64uI64ukLlxuICAgKiBzdHViIGVudGl0eSDsg53shLEg7IucIOyekOuPmeycvOuhnCDtmLjstpzrkJjslrQg7LWc7IaM7ZWc7J2YIGNvbmUg66mU7YOA642w7J207YSw66W8IOygnOqzte2VqeuLiOuLpC5cbiAgICpcbiAgICogQHBhcmFtIGxvY2FsZSAtIOyDneyEsSDsi5wg7IKs7Jqp7ZWgIGxvY2FsZSAo6riw67O46rCSOiBTb25hbXUuY29uZmlnLmkxOG4uZGVmYXVsdExvY2FsZSDrmJDripQgXCJrb1wiKVxuICAgKi9cbiAgYXN5bmMgZ2VuZXJhdGVUZW1wbGF0ZUNvbmVzKGxvY2FsZT86IFwia29cIiB8IFwiZW5cIiB8IFwiamFcIik6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHsgZ2VuZXJhdGVUZW1wbGF0ZUNvbmVzIH0gPSBhd2FpdCBpbXBvcnQoXCIuL2VudGl0eS10ZW1wbGF0ZS1jb25lXCIpO1xuICAgIGNvbnN0IGNvbmZpZ0xvY2FsZSA9IFNvbmFtdS5jb25maWcuaTE4bj8uZGVmYXVsdExvY2FsZTtcbiAgICBjb25zdCBlZmZlY3RpdmVMb2NhbGUgPVxuICAgICAgbG9jYWxlIHx8XG4gICAgICAoY29uZmlnTG9jYWxlID09PSBcImtvXCIgfHwgY29uZmlnTG9jYWxlID09PSBcImVuXCIgfHwgY29uZmlnTG9jYWxlID09PSBcImphXCJcbiAgICAgICAgPyBjb25maWdMb2NhbGVcbiAgICAgICAgOiBcImtvXCIpO1xuICAgIGNvbnN0IHJlc3VsdCA9IGdlbmVyYXRlVGVtcGxhdGVDb25lcyh0aGlzLnRvSnNvbigpLCBlZmZlY3RpdmVMb2NhbGUpO1xuXG4gICAgLy8g6rKw6rO866W8IEVudGl0eeyXkCDsoIHsmqkgKGFwcGx5Q29uZXPsmYAg64+Z7J287ZWcIOuwqeyLnSlcbiAgICBpZiAocmVzdWx0LmVudGl0eUNvbmUpIHtcbiAgICAgIHRoaXMuY29uZSA9IHJlc3VsdC5lbnRpdHlDb25lO1xuICAgIH1cblxuICAgIGZvciAoY29uc3QgW3Byb3BOYW1lLCBjb25lXSBvZiBPYmplY3QuZW50cmllcyhyZXN1bHQucHJvcENvbmVzKSkge1xuICAgICAgY29uc3QgcHJvcCA9IHRoaXMucHJvcHMuZmluZCgocCkgPT4gcC5uYW1lID09PSBwcm9wTmFtZSk7XG4gICAgICBpZiAocHJvcCkge1xuICAgICAgICAvLyBTQUZFVFk6IOyKpO2CpOuniCDqsoDspp3qs7wg66mU7YOA642w7J207YSwIOqzhOyVveydtCDsnbQg7YOA7J6F7J2EIOuztOyepe2VqeuLiOuLpC5cbiAgICAgICAgKHByb3AgYXMgeyBjb25lPzogQ29uZSB9KS5jb25lID0gY29uZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLmVudW1Db25lcyA9IHsgLi4udGhpcy5lbnVtQ29uZXMsIC4uLnJlc3VsdC5lbnVtQ29uZXMgfTtcbiAgICB0aGlzLnN1YnNldENvbmVzID0geyAuLi50aGlzLnN1YnNldENvbmVzLCAuLi5yZXN1bHQuc3Vic2V0Q29uZXMgfTtcblxuICAgIGF3YWl0IHRoaXMuc2F2ZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIExMTeydhCDsgqzsmqntlZjsl6wgY29uZSDrqZTtg4DrjbDsnbTthLDrpbwg7IOd7ISx7ZWp64uI64ukLlxuICAgKlxuICAgKiBAcGFyYW0gb3B0aW9ucy5wcmVzZXJ2ZUV4aXN0aW5nIC0g6riw7KG0IGNvbmUg67O07KG0IOyXrOu2gCAo6riw67O46rCSOiB0cnVlKVxuICAgKiBAcGFyYW0gb3B0aW9ucy5vbmx5RW1wdHkgLSBmaXh0dXJlSGludOqwgCDsl4bripQgY29uZeunjCDsg53shLEgKOq4sOuzuOqwkjogZmFsc2UpXG4gICAqIEBwYXJhbSBvcHRpb25zLmxvY2FsZSAtIOyDneyEsSDsi5wg7IKs7Jqp7ZWgIGxvY2FsZSAo6riw67O46rCSOiBcImtvXCIpXG4gICAqL1xuICBhc3luYyBnZW5lcmF0ZUNvbmVzKG9wdGlvbnM/OiB7XG4gICAgcHJlc2VydmVFeGlzdGluZz86IGJvb2xlYW47XG4gICAgb25seUVtcHR5PzogYm9vbGVhbjtcbiAgICBsb2NhbGU/OiBcImtvXCIgfCBcImVuXCIgfCBcImphXCI7XG4gICAgLyoqIO2FjOyKpO2KuOuCmCDrjIDssrQgTExNIOqzteq4ieyekOulvCDsnITtlZwg7YWN7Iqk7Yq4IOyDneyEsSDqtaztmIQgKi9cbiAgICBnZW5lcmF0ZVRleHQ/OiBpbXBvcnQoXCIuLi9jb25lL2NvbmUtZ2VuZXJhdG9yXCIpLkNvbmVUZXh0R2VuZXJhdG9yO1xuICAgIC8qKiBmYWxzZeydtOuptCDsg53shLEg6rKw6rO866W8IOuplOuqqOumrOyXkOunjCDsoIHsmqntlZjqs6AgZW50aXR5IO2MjOydvOydgCDsoIDsnqXtlZjsp4Ag7JWK7Iq164uI64ukLiAqL1xuICAgIHBlcnNpc3Q/OiBib29sZWFuO1xuICB9KTogUHJvbWlzZTxpbXBvcnQoXCIuLi9jb25lL2NvbmUtZ2VuZXJhdG9yXCIpLkNvbmVHZW5lcmF0aW9uUmVzdWx0PiB7XG4gICAgY29uc3QgeyBnZW5lcmF0ZUNvbmVzIH0gPSBhd2FpdCBpbXBvcnQoXCIuLi9jb25lL2NvbmUtZ2VuZXJhdG9yXCIpO1xuICAgIGNvbnN0IGNvbnRleHQ6IGltcG9ydChcIi4uL2NvbmUvY29uZS1nZW5lcmF0b3JcIikuQ29uZUdlbmVyYXRpb25Db250ZXh0ID0ge1xuICAgICAgZW50aXR5OiB0aGlzLnRvSnNvbigpLFxuICAgICAgbG9jYWxlOiBvcHRpb25zPy5sb2NhbGUgfHwgXCJrb1wiLFxuICAgICAgZXhpc3RpbmdDb25lczogb3B0aW9ucz8ucHJlc2VydmVFeGlzdGluZyAhPT0gZmFsc2UgPyB0aGlzLmNvbGxlY3RFeGlzdGluZ0NvbmVzKCkgOiB1bmRlZmluZWQsXG4gICAgICBvbmx5RW1wdHk6IG9wdGlvbnM/Lm9ubHlFbXB0eSA/PyBmYWxzZSxcbiAgICB9O1xuXG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgZ2VuZXJhdGVDb25lcyhjb250ZXh0LCB7IGdlbmVyYXRlVGV4dDogb3B0aW9ucz8uZ2VuZXJhdGVUZXh0IH0pO1xuICAgIHRoaXMuYXBwbHlDb25lcyhyZXN1bHQpO1xuICAgIGlmIChvcHRpb25zPy5wZXJzaXN0ICE9PSBmYWxzZSkge1xuICAgICAgYXdhaXQgdGhpcy5zYXZlKCk7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICAvKipcbiAgICog6riw7KG0IGNvbmXrk6TsnYQg7IiY7KeR7ZWp64uI64ukIChlbnRpdHksIHByb3BzLCBlbnVtcywgc3Vic2V0cykuXG4gICAqXG4gICAqIEByZXR1cm5zIO2CpOqwgCBcImVudGl0eTppZFwiLCBcInByb3A6bmFtZVwiLCBcImVudW06ZW51bUlkXCIsIFwic3Vic2V0OmtleVwiIO2YleyLneyduCBjb25lIOuntVxuICAgKi9cbiAgY29sbGVjdEV4aXN0aW5nQ29uZXMoKTogUmVjb3JkPHN0cmluZywgQ29uZT4ge1xuICAgIGNvbnN0IGNvbmVFbnRyaWVzOiBbc3RyaW5nLCBDb25lXVtdID0gW107XG5cbiAgICBpZiAodGhpcy5jb25lKSB7XG4gICAgICBjb25lRW50cmllcy5wdXNoKFtgZW50aXR5OiR7dGhpcy5pZH1gLCB0aGlzLmNvbmVdKTtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IHByb3Agb2YgdGhpcy5wcm9wcykge1xuICAgICAgaWYgKHByb3AuY29uZSkge1xuICAgICAgICBjb25lRW50cmllcy5wdXNoKFtgcHJvcDoke3Byb3AubmFtZX1gLCBwcm9wLmNvbmVdKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IFtlbnVtSWQsIGNvbmVdIG9mIE9iamVjdC5lbnRyaWVzKHRoaXMuZW51bUNvbmVzKSkge1xuICAgICAgY29uZUVudHJpZXMucHVzaChbYGVudW06JHtlbnVtSWR9YCwgY29uZV0pO1xuICAgIH1cblxuICAgIGZvciAoY29uc3QgW3N1YnNldEtleSwgY29uZV0gb2YgT2JqZWN0LmVudHJpZXModGhpcy5zdWJzZXRDb25lcykpIHtcbiAgICAgIGNvbmVFbnRyaWVzLnB1c2goW2BzdWJzZXQ6JHtzdWJzZXRLZXl9YCwgY29uZV0pO1xuICAgIH1cblxuICAgIHJldHVybiBPYmplY3QuZnJvbUVudHJpZXMoY29uZUVudHJpZXMpO1xuICB9XG5cbiAgLyoqXG4gICAqIOyDneyEseuQnCBjb25l65Ok7J2EIEVudGl0eeyXkCDsoIHsmqntlanri4jri6QuXG4gICAqXG4gICAqIEBwYXJhbSByZXN1bHQgLSBMTE3snLzroZwg7IOd7ISx65CcIGNvbmUg6rKw6rO8XG4gICAqL1xuICBhcHBseUNvbmVzKHJlc3VsdDogaW1wb3J0KFwiLi4vY29uZS9jb25lLWdlbmVyYXRvclwiKS5Db25lR2VuZXJhdGlvblJlc3VsdCk6IHZvaWQge1xuICAgIGlmIChyZXN1bHQuZW50aXR5Q29uZSkge1xuICAgICAgdGhpcy5jb25lID0gcmVzdWx0LmVudGl0eUNvbmU7XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBbcHJvcE5hbWUsIGNvbmVdIG9mIE9iamVjdC5lbnRyaWVzKHJlc3VsdC5wcm9wQ29uZXMpKSB7XG4gICAgICBjb25zdCBwcm9wID0gdGhpcy5wcm9wcy5maW5kKChwKSA9PiBwLm5hbWUgPT09IHByb3BOYW1lKTtcbiAgICAgIGlmIChwcm9wKSB7XG4gICAgICAgIC8vIFNBRkVUWTog7Iqk7YKk66eIIOqygOymneqzvCDrqZTtg4DrjbDsnbTthLAg6rOE7JW97J20IOydtCDtg4DsnoXsnYQg67O07J6l7ZWp64uI64ukLlxuICAgICAgICAocHJvcCBhcyB7IGNvbmU/OiBDb25lIH0pLmNvbmUgPSBjb25lO1xuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMuZW51bUNvbmVzID0geyAuLi50aGlzLmVudW1Db25lcywgLi4ucmVzdWx0LmVudW1Db25lcyB9O1xuICAgIHRoaXMuc3Vic2V0Q29uZXMgPSB7IC4uLnRoaXMuc3Vic2V0Q29uZXMsIC4uLnJlc3VsdC5zdWJzZXRDb25lcyB9O1xuICB9XG5cbiAgZ2V0U3Vic2V0Um93cyhcbiAgICBfc3Vic2V0cz86IHsgW2tleTogc3RyaW5nXTogc3RyaW5nW10gfSxcbiAgICBfc3Vic2V0c0ludGVybmFsPzogeyBba2V5OiBzdHJpbmddOiBzdHJpbmdbXSB9LFxuICAgIHByZWZpeGVzOiBzdHJpbmdbXSA9IFtdLFxuICApOiBFbnRpdHlTdWJzZXRSb3dbXSB7XG4gICAgaWYgKHByZWZpeGVzLmxlbmd0aCA+IDEwKSB7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuXG4gICAgY29uc3Qgc3Vic2V0cyA9IF9zdWJzZXRzID8/IHRoaXMuc3Vic2V0cztcbiAgICBjb25zdCBzdWJzZXRzSW50ZXJuYWwgPSBfc3Vic2V0c0ludGVybmFsID8/IHRoaXMuc3Vic2V0c0ludGVybmFsO1xuICAgIGNvbnN0IHN1YnNldEtleXMgPSBPYmplY3Qua2V5cyhzdWJzZXRzKTtcbiAgICBjb25zdCBhbGxGaWVsZHMgPSB1bmlxdWUoc3Vic2V0S2V5cy5mbGF0TWFwKChrZXkpID0+IHN1YnNldHNba2V5XSkpO1xuICAgIC8vIGludGVybmFsIO2VhOuTnOuPhCBhbGxGaWVsZHPsl5Ag7Y+s7ZWoIChyZWxhdGlvbiDtg5Dsg4nsmqkpXG4gICAgY29uc3QgYWxsSW50ZXJuYWxGaWVsZHMgPSB1bmlxdWUoc3Vic2V0S2V5cy5mbGF0TWFwKChrZXkpID0+IHN1YnNldHNJbnRlcm5hbFtrZXldID8/IFtdKSk7XG4gICAgY29uc3QgY29tYmluZWRGaWVsZHMgPSB1bmlxdWUoWy4uLmFsbEZpZWxkcywgLi4uYWxsSW50ZXJuYWxGaWVsZHNdKTtcblxuICAgIHJldHVybiB0aGlzLnByb3BzLm1hcCgocHJvcCkgPT4ge1xuICAgICAgaWYgKFxuICAgICAgICBwcm9wLnR5cGUgPT09IFwicmVsYXRpb25cIiAmJlxuICAgICAgICBjb21iaW5lZEZpZWxkcy5maW5kKChmKSA9PiBmLnN0YXJ0c1dpdGgoYCR7Wy4uLnByZWZpeGVzLCBwcm9wLm5hbWVdLmpvaW4oXCIuXCIpfS5gKSlcbiAgICAgICkge1xuICAgICAgICBjb25zdCByZWxFbnRpdHkgPSBFbnRpdHlNYW5hZ2VyLmdldChwcm9wLndpdGgpO1xuICAgICAgICBjb25zdCBjaGlsZHJlbiA9IHJlbEVudGl0eS5nZXRTdWJzZXRSb3dzKHN1YnNldHMsIHN1YnNldHNJbnRlcm5hbCwgW1xuICAgICAgICAgIC4uLnByZWZpeGVzLFxuICAgICAgICAgIGAke3Byb3AubmFtZX1gLFxuICAgICAgICBdKTtcblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGZpZWxkOiBwcm9wLm5hbWUsXG4gICAgICAgICAgY2hpbGRyZW4sXG4gICAgICAgICAgcmVsYXRpb25FbnRpdHk6IHByb3Aud2l0aCxcbiAgICAgICAgICBwcmVmaXhlcyxcbiAgICAgICAgICBpc09wZW46IGNoaWxkcmVuLmxlbmd0aCA+IDAsXG4gICAgICAgICAgaGFzOiBPYmplY3QuZnJvbUVudHJpZXMoXG4gICAgICAgICAgICBzdWJzZXRLZXlzLm1hcCgoc3Vic2V0S2V5KSA9PiB7XG4gICAgICAgICAgICAgIHJldHVybiBbc3Vic2V0S2V5LCBjaGlsZHJlbi5ldmVyeSgoY2hpbGQpID0+IGNoaWxkLmhhc1tzdWJzZXRLZXldKV07XG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICApLFxuICAgICAgICAgIGlzSW50ZXJuYWw6IE9iamVjdC5mcm9tRW50cmllcyhcbiAgICAgICAgICAgIHN1YnNldEtleXMubWFwKChzdWJzZXRLZXkpID0+IHtcbiAgICAgICAgICAgICAgcmV0dXJuIFtzdWJzZXRLZXksIGNoaWxkcmVuLmV2ZXJ5KChjaGlsZCkgPT4gY2hpbGQuaXNJbnRlcm5hbFtzdWJzZXRLZXldKV07XG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICApLFxuICAgICAgICB9O1xuICAgICAgfVxuXG4gICAgICBjb25zdCBmaWVsZCA9IFsuLi5wcmVmaXhlcywgcHJvcC5uYW1lXS5qb2luKFwiLlwiKTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGZpZWxkOiBwcm9wLm5hbWUsXG4gICAgICAgIGNoaWxkcmVuOiBbXSxcbiAgICAgICAgcmVsYXRpb25FbnRpdHk6IHByb3AudHlwZSA9PT0gXCJyZWxhdGlvblwiID8gcHJvcC53aXRoIDogdW5kZWZpbmVkLFxuICAgICAgICBwcmVmaXhlcyxcbiAgICAgICAgaGFzOiBPYmplY3QuZnJvbUVudHJpZXMoXG4gICAgICAgICAgc3Vic2V0S2V5cy5tYXAoKHN1YnNldEtleSkgPT4ge1xuICAgICAgICAgICAgY29uc3Qgc3Vic2V0RmllbGRzID0gc3Vic2V0c1tzdWJzZXRLZXldO1xuICAgICAgICAgICAgY29uc3QgaGFzID0gc3Vic2V0RmllbGRzLnNvbWUoKGYpID0+IHtcbiAgICAgICAgICAgICAgcmV0dXJuIGYgPT09IGZpZWxkIHx8IGYuc3RhcnRzV2l0aChgJHtmaWVsZH0uYCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHVybiBbc3Vic2V0S2V5LCBoYXNdO1xuICAgICAgICAgIH0pLFxuICAgICAgICApLFxuICAgICAgICBpc0ludGVybmFsOiBPYmplY3QuZnJvbUVudHJpZXMoXG4gICAgICAgICAgc3Vic2V0S2V5cy5tYXAoKHN1YnNldEtleSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgaW50ZXJuYWxGaWVsZHMgPSBzdWJzZXRzSW50ZXJuYWxbc3Vic2V0S2V5XSA/PyBbXTtcbiAgICAgICAgICAgIGNvbnN0IGlzSW50ZXJuYWwgPSBpbnRlcm5hbEZpZWxkcy5zb21lKChmKSA9PiB7XG4gICAgICAgICAgICAgIHJldHVybiBmID09PSBmaWVsZCB8fCBmLnN0YXJ0c1dpdGgoYCR7ZmllbGR9LmApO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm4gW3N1YnNldEtleSwgaXNJbnRlcm5hbF07XG4gICAgICAgICAgfSksXG4gICAgICAgICksXG4gICAgICB9O1xuICAgIH0pO1xuICB9XG5cbiAgc3Vic2V0Um93c1RvU3Vic2V0RmllbGRzKFxuICAgIHN1YnNldFJvd3M6IEVudGl0eVN1YnNldFJvd1tdLFxuICAgIHN1YnNldEtleTogc3RyaW5nLFxuICAgIGludGVybmFsOiBib29sZWFuID0gZmFsc2UsXG4gICk6IHN0cmluZ1tdIHtcbiAgICBjb25zdCBoYXNLZXkgPSBpbnRlcm5hbCA/IFwiaXNJbnRlcm5hbFwiIDogXCJoYXNcIjtcbiAgICByZXR1cm4gc3Vic2V0Um93c1xuICAgICAgLm1hcCgoc3Vic2V0Um93KSA9PiB7XG4gICAgICAgIGlmIChzdWJzZXRSb3cuY2hpbGRyZW4ubGVuZ3RoID4gMCkge1xuICAgICAgICAgIHJldHVybiB0aGlzLnN1YnNldFJvd3NUb1N1YnNldEZpZWxkcyhzdWJzZXRSb3cuY2hpbGRyZW4sIHN1YnNldEtleSwgaW50ZXJuYWwpO1xuICAgICAgICB9IGVsc2UgaWYgKHN1YnNldFJvd1toYXNLZXldW3N1YnNldEtleV0pIHtcbiAgICAgICAgICByZXR1cm4gc3Vic2V0Um93LnByZWZpeGVzLmNvbmNhdChzdWJzZXRSb3cuZmllbGQpLmpvaW4oXCIuXCIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICB9KVxuICAgICAgLmZpbHRlcihub25OdWxsYWJsZSlcbiAgICAgIC5mbGF0KCk7XG4gIH1cblxuICBhc3luYyBjcmVhdGVQcm9wKHByb3A6IEVudGl0eVByb3AsIGF0PzogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKCFhdCkge1xuICAgICAgdGhpcy5wcm9wcy5wdXNoKHByb3ApO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnByb3BzLnNwbGljZShhdCwgMCwgcHJvcCk7XG4gICAgfVxuICAgIGF3YWl0IHRoaXMuc2F2ZSgpO1xuICB9XG5cbiAgYW5hbHl6ZVN1YnNldEZpZWxkKHN1YnNldEZpZWxkOiBzdHJpbmcpOiB7XG4gICAgZW50aXR5SWQ6IHN0cmluZztcbiAgICBwcm9wTmFtZTogc3RyaW5nO1xuICB9W10ge1xuICAgIGNvbnN0IGFyciA9IHN1YnNldEZpZWxkLnNwbGl0KFwiLlwiKTtcblxuICAgIGxldCBlbnRpdHlJZCA9IHRoaXMuaWQ7XG4gICAgY29uc3QgcmVzdWx0OiB7XG4gICAgICBlbnRpdHlJZDogc3RyaW5nO1xuICAgICAgcHJvcE5hbWU6IHN0cmluZztcbiAgICB9W10gPSBbXTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFyci5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgcHJvcE5hbWUgPSBhcnJbaV07XG4gICAgICByZXN1bHQucHVzaCh7XG4gICAgICAgIGVudGl0eUlkLFxuICAgICAgICBwcm9wTmFtZSxcbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCBwcm9wID0gRW50aXR5TWFuYWdlci5nZXQoZW50aXR5SWQpLnByb3BzLmZpbmQoKHApID0+IHAubmFtZSA9PT0gcHJvcE5hbWUpO1xuICAgICAgaWYgKCFwcm9wKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgJHtlbnRpdHlJZH3snZgg7J6Y66q765CcIOyEnOu4jOyFi+2CpCAke3N1YnNldEZpZWxkfWApO1xuICAgICAgfVxuICAgICAgaWYgKGlzUmVsYXRpb25Qcm9wKHByb3ApKSB7XG4gICAgICAgIGVudGl0eUlkID0gcHJvcC53aXRoO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgYXN5bmMgbW9kaWZ5UHJvcChuZXdQcm9wOiBFbnRpdHlQcm9wLCBhdDogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgLy8g7J207KCEIO2UhOuhrSDsnbTrpoQg7KCA7J6lXG4gICAgY29uc3Qgb2xkTmFtZSA9IHRoaXMucHJvcHNbYXRdLm5hbWU7XG5cbiAgICAvLyDsoIDsnqXtlaAg7JeU7Yuw7YuwXG4gICAgY29uc3QgZW50aXRpZXM6IEVudGl0eVtdID0gW3RoaXNdO1xuXG4gICAgLy8g7J2066aE7J20IOuwlOuAkCDqsr3smrBcbiAgICBpZiAob2xkTmFtZSAhPT0gbmV3UHJvcC5uYW1lKSB7XG4gICAgICAvLyDsoITssrQg7JeU7Yuw7Yuw7JeQ7IScIO2YhOyerCDsiJjsoJXrkJwg7ZSE66Gt7J2EIOywuOyhsO2VmOqzoCDsnojripQg66qo65OgIOyEnOu4jOyFi+2VhOuTnCDssL7slYTshJwg7IiY7KCVXG4gICAgICBjb25zdCBhbGxFbnRpdHlJZHMgPSBFbnRpdHlNYW5hZ2VyLmdldEFsbElkcygpO1xuICAgICAgZm9yIChjb25zdCByZWxFbnRpdHlJZCBvZiBhbGxFbnRpdHlJZHMpIHtcbiAgICAgICAgY29uc3QgcmVsRW50aXR5ID0gRW50aXR5TWFuYWdlci5nZXQocmVsRW50aXR5SWQpO1xuICAgICAgICBjb25zdCByZWxFbnRpdHlTdWJzZXRLZXlzID0gT2JqZWN0LmtleXMocmVsRW50aXR5LnN1YnNldHMpO1xuICAgICAgICBmb3IgKGNvbnN0IHN1YnNldEtleSBvZiByZWxFbnRpdHlTdWJzZXRLZXlzKSB7XG4gICAgICAgICAgY29uc3Qgc3Vic2V0ID0gcmVsRW50aXR5LnN1YnNldHNbc3Vic2V0S2V5XTtcblxuICAgICAgICAgIC8vIOyEnOu4jOyFiyDtlYTrk5zrpbwg7Iic7ZqM7ZWY66mwLCDsl5Tti7Dti7At7ZSE66GtIOuLqOychOuhnCDrtoTshJ3tlZwg7ZuEIO2YhOyerCDsl5Tti7Dti7At7ZSE66Gt6rO8IOydvOy5mO2VmOuKlCDqsr3smrAg7IiY7KCVIOyymOumrFxuICAgICAgICAgIGNvbnN0IG1vZGlmaWVkU3Vic2V0RmllbGRzID0gc3Vic2V0Lm1hcCgoc3Vic2V0RmllbGQpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGFuYWx5emVkID0gcmVsRW50aXR5LmFuYWx5emVTdWJzZXRGaWVsZChzdWJzZXRGaWVsZCk7XG4gICAgICAgICAgICBjb25zdCBtb2RpZmllZCA9IGFuYWx5emVkLm1hcCgoYSkgPT5cbiAgICAgICAgICAgICAgYS5wcm9wTmFtZSA9PT0gb2xkTmFtZSAmJiBhLmVudGl0eUlkID09PSB0aGlzLmlkXG4gICAgICAgICAgICAgICAgPyB7XG4gICAgICAgICAgICAgICAgICAgIC4uLmEsXG4gICAgICAgICAgICAgICAgICAgIHByb3BOYW1lOiBuZXdQcm9wLm5hbWUsXG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgOiBhLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIC8vIOu2hOyEne2VnCDtlYTrk5zrpbwg64uk7IucIOyEnOu4jOyFiyDtlYTrk5zroZwg67O16rWsXG4gICAgICAgICAgICByZXR1cm4gbW9kaWZpZWQubWFwKChhKSA9PiBhLnByb3BOYW1lKS5qb2luKFwiLlwiKTtcbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIGlmIChzdWJzZXQuam9pbihcIixcIikgIT09IG1vZGlmaWVkU3Vic2V0RmllbGRzLmpvaW4oXCIsXCIpKSB7XG4gICAgICAgICAgICByZWxFbnRpdHkuc3Vic2V0c1tzdWJzZXRLZXldID0gbW9kaWZpZWRTdWJzZXRGaWVsZHM7XG4gICAgICAgICAgICBlbnRpdGllcy5wdXNoKHJlbEVudGl0eSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8g7ZSE66GtIOyImOyglVxuICAgIHRoaXMucHJvcHNbYXRdID0gbmV3UHJvcDtcblxuICAgIGF3YWl0IFByb21pc2UuYWxsKGVudGl0aWVzLm1hcChhc3luYyAoZW50aXR5KSA9PiBlbnRpdHkuc2F2ZSgpKSk7XG4gIH1cblxuICBhc3luYyBkZWxQcm9wKGF0OiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAvLyDsnbTsoIQg7ZSE66GtIOydtOumhCDsoIDsnqVcbiAgICBjb25zdCBvbGROYW1lID0gdGhpcy5wcm9wc1thdF0ubmFtZTtcblxuICAgIC8vIOyggOyepe2VoCDsl5Tti7Dti7BcbiAgICBjb25zdCBlbnRpdGllczogRW50aXR5W10gPSBbdGhpc107XG5cbiAgICAvLyDsoITssrQg7JeU7Yuw7Yuw7JeQ7IScIO2YhOyerCDsgq3soJzrkJwg7ZSE66Gt7J2EIOywuOyhsO2VmOqzoCDsnojripQg66qo65OgIOyEnOu4jOyFi+2VhOuTnCDssL7slYTshJwg7KCc7Jm4XG4gICAgY29uc3QgYWxsRW50aXR5SWRzID0gRW50aXR5TWFuYWdlci5nZXRBbGxJZHMoKTtcbiAgICBmb3IgKGNvbnN0IHJlbEVudGl0eUlkIG9mIGFsbEVudGl0eUlkcykge1xuICAgICAgY29uc3QgcmVsRW50aXR5ID0gRW50aXR5TWFuYWdlci5nZXQocmVsRW50aXR5SWQpO1xuICAgICAgY29uc3QgcmVsRW50aXR5U3Vic2V0S2V5cyA9IE9iamVjdC5rZXlzKHJlbEVudGl0eS5zdWJzZXRzKTtcbiAgICAgIGZvciAoY29uc3Qgc3Vic2V0S2V5IG9mIHJlbEVudGl0eVN1YnNldEtleXMpIHtcbiAgICAgICAgY29uc3Qgc3Vic2V0ID0gcmVsRW50aXR5LnN1YnNldHNbc3Vic2V0S2V5XTtcbiAgICAgICAgLy8g7ISc67iM7IWLIO2VhOuTnOulvCDsiJztmoztlZjrqbAsIOyXlO2LsO2LsC3tlITroa0g64uo7JyE66GcIOu2hOyEne2VnCDtm4Qg7ZiE7J6sIOyXlO2LsO2LsC3tlITroa3qs7wg7J287LmY7ZWY64qUIOqyveyasCDsnbTtm4TsnZgg7ZWE65Oc66W8IOygnOyZuFxuICAgICAgICBjb25zdCBtb2RpZmllZFN1YnNldEZpZWxkcyA9IHN1YnNldFxuICAgICAgICAgIC5tYXAoKHN1YnNldEZpZWxkKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBhbmFseXplZCA9IHJlbEVudGl0eS5hbmFseXplU3Vic2V0RmllbGQoc3Vic2V0RmllbGQpO1xuICAgICAgICAgICAgaWYgKGFuYWx5emVkLmZpbmQoKGEpID0+IGEucHJvcE5hbWUgPT09IG9sZE5hbWUgJiYgYS5lbnRpdHlJZCA9PT0gdGhpcy5pZCkpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICByZXR1cm4gc3Vic2V0RmllbGQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSlcbiAgICAgICAgICAuZmlsdGVyKG5vbk51bGxhYmxlKTtcblxuICAgICAgICBpZiAoc3Vic2V0LmpvaW4oXCIsXCIpICE9PSBtb2RpZmllZFN1YnNldEZpZWxkcy5qb2luKFwiLFwiKSkge1xuICAgICAgICAgIHJlbEVudGl0eS5zdWJzZXRzW3N1YnNldEtleV0gPSBtb2RpZmllZFN1YnNldEZpZWxkcztcbiAgICAgICAgICBlbnRpdGllcy5wdXNoKHJlbEVudGl0eSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyDtmITsnqwg7JeU7Yuw7Yuw7J2YIOyduOuNseyKpOyXkOyEnCDsoJzsmbhcbiAgICBmb3IgKGNvbnN0IGluZGV4IG9mIEVudGl0eU1hbmFnZXIuZ2V0KHRoaXMuaWQpLmluZGV4ZXMpIHtcbiAgICAgIGluZGV4LmNvbHVtbnMgPSBpbmRleC5jb2x1bW5zLmZpbHRlcigoY29sKSA9PiBjb2wubmFtZSAhPT0gb2xkTmFtZSk7XG4gICAgfVxuXG4gICAgLy8g7ZSE66GtIOyCreygnFxuICAgIHRoaXMucHJvcHMuc3BsaWNlKGF0LCAxKTtcblxuICAgIGF3YWl0IFByb21pc2UuYWxsKGVudGl0aWVzLm1hcChhc3luYyAoZW50aXR5KSA9PiBlbnRpdHkuc2F2ZSgpKSk7XG4gIH1cblxuICBnZXRFbnRpdHlJZEZyb21TdWJzZXRGaWVsZChzdWJzZXRGaWVsZDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBpZiAoIXN1YnNldEZpZWxkLmluY2x1ZGVzKFwiLlwiKSkge1xuICAgICAgcmV0dXJuIHRoaXMuaWQ7XG4gICAgfVxuXG4gICAgLy8g7ISc67iM7IWLIO2VhOuTnOydmCDrp4jsp4Drp4nsnYAg7ZSE66Gt7J2066+A66GcIOygnOyZuFxuICAgIGNvbnN0IGFyciA9IHN1YnNldEZpZWxkLnNwbGl0KFwiLlwiKS5zbGljZSgwLCAtMSk7XG5cbiAgICAvLyDshJzruIzshYsg7ZWE65Oc66W8IOuCtOugpOqwgOuptOyEnCDrp4jsp4Drp4nsnLzroZwgcmVsYXRpb27rkJwg7JeU7Yuw7Yuw66W8IOywvuydjFxuICAgIGNvbnN0IGxhc3RFbnRpdHlJZCA9IGFyci5yZWR1Y2UoKGVudGl0eUlkLCBmaWVsZCkgPT4ge1xuICAgICAgY29uc3QgcmVsUHJvcCA9IEVudGl0eU1hbmFnZXIuZ2V0KGVudGl0eUlkKS5wcm9wcy5maW5kKChwKSA9PiBwLm5hbWUgPT09IGZpZWxkKTtcbiAgICAgIGlmICghcmVsUHJvcCB8fCByZWxQcm9wLnR5cGUgIT09IFwicmVsYXRpb25cIikge1xuICAgICAgICBjb25zb2xlLmRlYnVnKHsgYXJyLCB0aGlzSWQ6IHRoaXMuaWQsIGVudGl0eUlkLCBmaWVsZCB9KTtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGDsnpjrqrvrkJwg7ISc67iM7IWL7YKkICR7c3Vic2V0RmllbGR9YCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVsUHJvcC53aXRoO1xuICAgIH0sIHRoaXMuaWQpO1xuICAgIHJldHVybiBsYXN0RW50aXR5SWQ7XG4gIH1cblxuICBhc3luYyBtb3ZlUHJvcChhdDogbnVtYmVyLCB0bzogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgcHJvcCA9IHRoaXMucHJvcHNbYXRdO1xuICAgIGNvbnN0IG5ld1Byb3BzID0gWy4uLnRoaXMucHJvcHNdO1xuICAgIG5ld1Byb3BzLnNwbGljZSh0bywgMCwgcHJvcCk7XG4gICAgbmV3UHJvcHMuc3BsaWNlKGF0IDwgdG8gPyBhdCA6IGF0ICsgMSwgMSk7XG4gICAgdGhpcy5wcm9wcyA9IG5ld1Byb3BzO1xuXG4gICAgYXdhaXQgdGhpcy5zYXZlKCk7XG4gIH1cblxuICAvKipcbiAgICog7ZWE65Oc66qF7J2EIFwi7YWM7J2067iU66qFLu2VhOuTnOuqhVwiIO2YleyLneycvOuhnCDrs4DtmZhcbiAgICovXG4gIGdldEZ1bGxGaWVsZE5hbWUoZmllbGQ6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgaWYgKGZpZWxkLmluY2x1ZGVzKFwiLlwiKSkge1xuICAgICAgcmV0dXJuIGZpZWxkO1xuICAgIH1cbiAgICByZXR1cm4gYCR7dGhpcy50YWJsZX0uJHtmaWVsZH1gO1xuICB9XG5cbiAgLyoqXG4gICAqIOyXlO2LsO2LsOydmCBQSyDtg4DsnoXsnYQg67CY7ZmY7ZWp64uI64ukLlxuICAgKiBpZCDtlYTrk5zsnZgg7YOA7J6F7J2EIOq4sOykgOycvOuhnCBcImludGVnZXJcIiB8IFwic3RyaW5nXCIgfCBcInV1aWRcIuulvCDrsJjtmZjtlanri4jri6QuXG4gICAqL1xuICBnZXRQa1R5cGUoKTogXCJpbnRlZ2VyXCIgfCBcInN0cmluZ1wiIHwgXCJ1dWlkXCIge1xuICAgIGNvbnN0IGlkUHJvcCA9IHRoaXMucHJvcHNEaWN0LmlkO1xuICAgIGlmICghaWRQcm9wKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEVudGl0eSAke3RoaXMuaWR97JeQIGlkIO2VhOuTnOqwgCDsl4bsirXri4jri6RgKTtcbiAgICB9XG4gICAgaWYgKGlkUHJvcC50eXBlID09PSBcInN0cmluZ1wiIHx8IGlkUHJvcC50eXBlID09PSBcInV1aWRcIikge1xuICAgICAgcmV0dXJuIGlkUHJvcC50eXBlO1xuICAgIH1cbiAgICByZXR1cm4gXCJpbnRlZ2VyXCI7XG4gIH1cblxuICAvKipcbiAgICog7JeU7Yuw7Yuw7J2YIFBLIHByb3DsnYQg67CY7ZmY7ZWp64uI64ukLlxuICAgKiBsZW5ndGgg65OxIOyEuOu2gCDsoJXrs7Tsl5Ag7KCR6re87ZWgIOuVjCDsgqzsmqntlanri4jri6QuXG4gICAqL1xuICBnZXRQa1Byb3AoKTogRW50aXR5UHJvcCB7XG4gICAgY29uc3QgaWRQcm9wID0gdGhpcy5wcm9wc0RpY3QuaWQ7XG4gICAgaWYgKCFpZFByb3ApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgRW50aXR5ICR7dGhpcy5pZH3sl5AgaWQg7ZWE65Oc6rCAIOyXhuyKteuLiOuLpGApO1xuICAgIH1cbiAgICByZXR1cm4gaWRQcm9wO1xuICB9XG5cbiAgLyoqXG4gICAqIOyXlO2LsO2LsOydmCBQSyDrsLDsl7Qg7YOA7J6F7J2EIOuwmO2ZmO2VqeuLiOuLpC5cbiAgICogTG9hZGVyUXVlcnnsnZggZnJvbUlkcyDtg4DsnoXsnLzroZwg7IKs7Jqp65Cp64uI64ukLlxuICAgKi9cbiAgZ2V0UGtBcnJheVR5cGUoKTogc3RyaW5nIHtcbiAgICBjb25zdCBwa1R5cGUgPSB0aGlzLmdldFBrVHlwZSgpO1xuICAgIHJldHVybiBwa1R5cGUgPT09IFwiaW50ZWdlclwiID8gXCJudW1iZXJbXVwiIDogXCJzdHJpbmdbXVwiO1xuICB9XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7YUFRc0M7WUFjZjtnQkFZMkI7Z0JBQ0g7ZUFDTDtpQkFDTztvQkFDSztZQUNLO3FCQUdYO0NBRW5DLFNBQWIsTUFBb0I7RUFDbEI7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBS0E7RUFDQTtFQUdBO0VBR0E7RUFDQTtFQUdBO0VBR0EsUUFFSSxDQUFDO0VBQ0wsUUFFSSxDQUFDO0VBQ0wsYUFJSSxDQUFDO0VBQ0wsWUFFSSxDQUFDO0VBQ0wsY0FFSSxDQUFDO0VBRUwsWUFBWSxFQUFFLElBQUksVUFBVSxPQUFPLE9BQU8sTUFBTSxPQUFPLFNBQVMsU0FBUyxTQUFxQjtHQUU1RixLQUFLLEtBQUs7R0FDVixLQUFLLFdBQVc7R0FDaEIsS0FBSyxRQUFRLFNBQVMsS0FBSztHQUMzQixLQUFLLFFBQVEsU0FBUyxXQUFXLFdBQVcsV0FBVyxVQUFVLEVBQUUsQ0FBQztHQUNwRSxLQUFLLE9BQU87R0FHWixJQUFJLE9BQU87SUFDVCxLQUFLLFFBQVEsTUFBTSxLQUFLLFNBQVM7S0FDL0IsSUFBSSxXQUFXLElBQUksR0FDakI7VUFBSSxLQUFLLEdBQUcsU0FBUyxRQUFRLEdBQzNCLEtBQUssS0FBSyxLQUFLLEdBQUcsUUFBUSxVQUFVLEVBQUU7S0FDeEM7S0FFRixPQUFPO0lBQ1QsQ0FBQztJQUNELEtBQUssWUFBWSxPQUFPLFlBQ3RCLE1BQU0sS0FBSyxTQUFTO0tBQ2xCLE9BQU8sQ0FBQyxLQUFLLE1BQU0sSUFBSTtJQUN6QixDQUFDLENBQ0g7SUFHQSxLQUFLLFlBQVksT0FBTyxZQUN0QixNQUFNLFFBQVEsU0FBUyxlQUFlLElBQUksQ0FBQyxDQUFDLENBQUMsS0FB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
package/dist/env.d.ts.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"env.d.ts","sourceRoot":"","sources":["../src/env.ts"],"names":[],"mappings":"AAKA,eAAO,MAAM,mBAAmB,2DAA4D,CAAC;AAE7F,MAAM,MAAM,iBAAiB,GAAG,CAAC,OAAO,mBAAmB,CAAC,CAAC,MAAM,CAAC,CAAC;AACrE,MAAM,WAAW,mBAAmB;IAClC,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAAC;CACvB;AACD,MAAM,MAAM,oBAAoB,GAAG,MAAM,CAAC,iBAAiB,EAAE,mBAAmB,CAAC,CAAC;AAElF,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,KAAK,IAAI,iBAAiB,CAIzF;AAED,wBAAgB,oBAAoB,CAAC,GAAG,GAAE,MAAM,CAAC,UAAwB,GAAG,iBAAiB,CAc5F;AAqCD,wBAAgB,uBAAuB,CACrC,QAAQ,EAAE,MAAM,EAChB,WAAW,EAAE,iBAAiB,EAC9B,OAAO,GAAE,MAAM,CAAC,UAAwB,GACvC,mBAAmB,CAarB;AAED,wBAAgB,2BAA2B,CACzC,QAAQ,EAAE,MAAM,EAChB,OAAO,GAAE,MAAM,CAAC,UAAe,GAC9B,oBAAoB,CAOtB;AAED,wBAAgB,gCAAgC,CAAC,QAAQ,EAAE,MAAM,GAAG,mBAAmB,CAStF;AAED,wBAAgB,wBAAwB,IAAI,OAAO,CAElD;AAED,wBAAgB,oBAAoB,IAAI,OAAO,CAE9C;AAED,wBAAgB,uBAAuB,IAAI,OAAO,CAEjD;AAED,wBAAgB,iBAAiB,IAAI,OAAO,CAE3C"}
1
+ {"version":3,"file":"env.d.ts","sourceRoot":"","sources":["../src/env.ts"],"names":[],"mappings":"AAKA,eAAO,MAAM,mBAAmB,YAAI,MAAM,EAAE,aAAa,EAAE,SAAS,EAAE,YAAY,CAAU,CAAC;AAE7F,MAAM,MAAM,iBAAiB,GAAG,CAAC,OAAO,mBAAmB,CAAC,CAAC,MAAM,CAAC,CAAC;AACrE,MAAM,WAAW,mBAAmB;IAClC,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAAC;CACvB;AACD,MAAM,MAAM,oBAAoB,GAAG,MAAM,CAAC,iBAAiB,EAAE,mBAAmB,CAAC,CAAC;AAElF,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,KAAK,IAAI,iBAAiB,CAIzF;AAED,wBAAgB,oBAAoB,CAAC,GAAG,GAAE,MAAM,CAAC,UAAwB,GAAG,iBAAiB,CAc5F;AAqCD,wBAAgB,uBAAuB,CACrC,QAAQ,EAAE,MAAM,EAChB,WAAW,EAAE,iBAAiB,EAC9B,OAAO,GAAE,MAAM,CAAC,UAAwB,GACvC,mBAAmB,CAarB;AAED,wBAAgB,2BAA2B,CACzC,QAAQ,EAAE,MAAM,EAChB,OAAO,GAAE,MAAM,CAAC,UAAe,GAC9B,oBAAoB,CAOtB;AAED,wBAAgB,gCAAgC,CAAC,QAAQ,EAAE,MAAM,GAAG,mBAAmB,CAStF;AAED,wBAAgB,wBAAwB,IAAI,OAAO,CAElD;AAED,wBAAgB,oBAAoB,IAAI,OAAO,CAE9C;AAED,wBAAgB,uBAAuB,IAAI,OAAO,CAEjD;AAED,wBAAgB,iBAAiB,IAAI,OAAO,CAE3C"}
@@ -1 +1 @@
1
- {"version":3,"file":"so-exceptions.d.ts","sourceRoot":"","sources":["../../src/exceptions/so-exceptions.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,CAAC,MAAM,KAAK,CAAC;AAEzB,OAAO,EAAE,KAAK,eAAe,EAAE,MAAM,eAAe,CAAC;AACrD,OAAO,EAAE,KAAK,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAEhD,KAAK,gBAAgB,GAAG,SAAS,GAAG,CAAC,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC;AAGvD,8BAAsB,WAAW,CAAC,OAAO,GAAG,gBAAgB,CAAE,SAAQ,KAAK;aAEvD,UAAU,EAAE,MAAM;IAC3B,OAAO,EAAE,eAAe;IACxB,OAAO,CAAC,EAAE,OAAO;gBAFR,UAAU,EAAE,MAAM,EAC3B,OAAO,EAAE,eAAe,EACxB,OAAO,CAAC,EAAE,OAAO,YAAA;CAI3B;AAED,wBAAgB,aAAa,CAAC,KAAK,EAAE,GAAG,EAAE,KAAK,GAAG,GAAG,IAAI,KAAK,GAAG,WAAW,CAE3E;AAKD,qBAAa,mBAAmB,CAAC,OAAO,GAAG,gBAAgB,CAAE,SAAQ,WAAW,CAAC,OAAO,CAAC;gBAC3E,OAAO,EAAE,eAAe,EAAE,OAAO,CAAC,EAAE,OAAO;CAGxD;AAKD,qBAAa,qBAAqB,CAAC,OAAO,GAAG,gBAAgB,CAAE,SAAQ,WAAW,CAAC,OAAO,CAAC;gBAC7E,OAAO,EAAE,eAAe,EAAE,OAAO,CAAC,EAAE,OAAO;CAGxD;AAKD,qBAAa,iBAAiB,CAAC,OAAO,GAAG,gBAAgB,CAAE,SAAQ,WAAW,CAAC,OAAO,CAAC;gBACzE,OAAO,EAAE,eAAe,EAAE,OAAO,CAAC,EAAE,OAAO;CAGxD;AAKD,qBAAa,2BAA2B,CAAC,OAAO,GAAG,gBAAgB,CAAE,SAAQ,WAAW,CAAC,OAAO,CAAC;gBACnF,OAAO,EAAE,eAAe,EAAE,OAAO,CAAC,EAAE,OAAO;CAGxD;AAKD,qBAAa,4BAA4B,CAAC,OAAO,GAAG,gBAAgB,CAAE,SAAQ,WAAW,CAAC,OAAO,CAAC;gBACpF,OAAO,EAAE,eAAe,EAAE,OAAO,CAAC,EAAE,OAAO;CAGxD;AAKD,qBAAa,yBAAyB,CAAC,OAAO,GAAG,gBAAgB,CAAE,SAAQ,WAAW,CAAC,OAAO,CAAC;gBACjF,OAAO,EAAE,eAAe,EAAE,OAAO,CAAC,EAAE,OAAO;CAGxD;AAKD,qBAAa,qBAAqB,CAAC,OAAO,GAAG,gBAAgB,CAAE,SAAQ,WAAW,CAAC,OAAO,CAAC;gBAC7E,OAAO,EAAE,eAAe,EAAE,OAAO,CAAC,EAAE,OAAO;CAGxD;AAKD,qBAAa,uBAAuB,CAAC,OAAO,GAAG,gBAAgB,CAAE,SAAQ,WAAW,CAAC,OAAO,CAAC;gBAC/E,OAAO,EAAE,eAAe,EAAE,OAAO,CAAC,EAAE,OAAO;CAGxD"}
1
+ {"version":3,"file":"so-exceptions.d.ts","sourceRoot":"","sources":["../../src/exceptions/so-exceptions.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,CAAC,MAAM,KAAK,CAAC;AAEzB,OAAO,EAAE,KAAK,eAAe,EAAE,MAAM,eAAe,CAAC;AACrD,OAAO,EAAE,KAAK,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAEhD,KAAK,gBAAgB,GAAG,SAAS,GAAG,CAAC,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC;AAGvD,8BAAsB,WAAW,CAAC,OAAO,GAAG,gBAAgB,CAAE,SAAQ,KAAK;aAEvD,UAAU,EAAE,MAAM;IAC3B,OAAO,EAAE,eAAe;IACxB,OAAO,CAAC,EAAE,OAAO;IAH1B,YACkB,UAAU,EAAE,MAAM,EAC3B,OAAO,EAAE,eAAe,EACxB,OAAO,CAAC,EAAE,OAAO,YAAA,EAGzB;CACF;AAED,wBAAgB,aAAa,CAAC,KAAK,EAAE,GAAG,EAAE,KAAK,GAAG,GAAG,IAAI,KAAK,GAAG,WAAW,CAE3E;AAKD,qBAAa,mBAAmB,CAAC,OAAO,GAAG,gBAAgB,CAAE,SAAQ,WAAW,CAAC,OAAO,CAAC;IACvF,YAAY,OAAO,EAAE,eAAe,EAAE,OAAO,CAAC,EAAE,OAAO,EAEtD;CACF;AAKD,qBAAa,qBAAqB,CAAC,OAAO,GAAG,gBAAgB,CAAE,SAAQ,WAAW,CAAC,OAAO,CAAC;IACzF,YAAY,OAAO,EAAE,eAAe,EAAE,OAAO,CAAC,EAAE,OAAO,EAEtD;CACF;AAKD,qBAAa,iBAAiB,CAAC,OAAO,GAAG,gBAAgB,CAAE,SAAQ,WAAW,CAAC,OAAO,CAAC;IACrF,YAAY,OAAO,EAAE,eAAe,EAAE,OAAO,CAAC,EAAE,OAAO,EAEtD;CACF;AAKD,qBAAa,2BAA2B,CAAC,OAAO,GAAG,gBAAgB,CAAE,SAAQ,WAAW,CAAC,OAAO,CAAC;IAC/F,YAAY,OAAO,EAAE,eAAe,EAAE,OAAO,CAAC,EAAE,OAAO,EAEtD;CACF;AAKD,qBAAa,4BAA4B,CAAC,OAAO,GAAG,gBAAgB,CAAE,SAAQ,WAAW,CAAC,OAAO,CAAC;IAChG,YAAY,OAAO,EAAE,eAAe,EAAE,OAAO,CAAC,EAAE,OAAO,EAEtD;CACF;AAKD,qBAAa,yBAAyB,CAAC,OAAO,GAAG,gBAAgB,CAAE,SAAQ,WAAW,CAAC,OAAO,CAAC;IAC7F,YAAY,OAAO,EAAE,eAAe,EAAE,OAAO,CAAC,EAAE,OAAO,EAEtD;CACF;AAKD,qBAAa,qBAAqB,CAAC,OAAO,GAAG,gBAAgB,CAAE,SAAQ,WAAW,CAAC,OAAO,CAAC;IACzF,YAAY,OAAO,EAAE,eAAe,EAAE,OAAO,CAAC,EAAE,OAAO,EAEtD;CACF;AAKD,qBAAa,uBAAuB,CAAC,OAAO,GAAG,gBAAgB,CAAE,SAAQ,WAAW,CAAC,OAAO,CAAC;IAC3F,YAAY,OAAO,EAAE,eAAe,EAAE,OAAO,CAAC,EAAE,OAAO,EAEtD;CACF"}
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/filter/types.ts"],"names":[],"mappings":"AACA,eAAO,MAAM,mBAAmB;;;;;;;;;CAStB,CAAC;AAGX,eAAO,MAAM,yBAAyB;;;;;;;;;CAS5B,CAAC;AAGX,MAAM,MAAM,cAAc,GAAG,MAAM,OAAO,mBAAmB,CAAC;AAC9D,MAAM,MAAM,cAAc,GAAG,CAAC,OAAO,mBAAmB,CAAC,CAAC,MAAM,OAAO,mBAAmB,CAAC,CAAC,MAAM,CAAC,CAAC;AAGpG,KAAK,mBAAmB,CAAC,SAAS,SAAS,cAAc,IACvD,CAAC,OAAO,mBAAmB,CAAC,CAAC,SAAS,CAAC,CAAC,MAAM,CAAC,CAAC;AAGlD,KAAK,aAAa,CAAC,CAAC,EAAE,CAAC,SAAS,cAAc,IAAI,CAAC,SAAS,IAAI,GAAG,OAAO,GACtE,CAAC,EAAE,GACH,CAAC,SAAS,SAAS,GACjB,CAAC,CAAC,EAAE,CAAC,CAAC,GACN,CAAC,SAAS,QAAQ,GAAG,WAAW,GAC9B,OAAO,GACP,CAAC,CAAC;AAGV,KAAK,qBAAqB,CAAC,CAAC,EAAE,IAAI,SAAS,cAAc,IACrD,CAAC,GACD;KAAG,CAAC,IAAI,IAAI,CAAC,CAAC,EAAE,aAAa,CAAC,CAAC,EAAE,CAAC,CAAC;CAAE,CAAC;AAE1C;;;GAGG;AACH,MAAM,MAAM,WAAW,CAAC,OAAO,EAAE,YAAY,SAAS,MAAM,OAAO,GAAG,KAAK,IAAI;KAC5E,CAAC,IAAI,MAAM,OAAO,CAAC,CAAC,EAAE,CAAC,SAAS,YAAY,GACzC,qBAAqB,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,mBAAmB,CAAC,SAAS,CAAC,CAAC,GAC9E,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,SAAS,MAAM,GACpC,qBAAqB,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,mBAAmB,CAAC,SAAS,CAAC,CAAC,GAC9E,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,SAAS,MAAM,GACpC,qBAAqB,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,mBAAmB,CAAC,QAAQ,CAAC,CAAC,GAC7E,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,SAAS,IAAI,GAClC,qBAAqB,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,mBAAmB,CAAC,MAAM,CAAC,CAAC,GAC3E,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,SAAS,OAAO,GACrC,qBAAqB,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,mBAAmB,CAAC,SAAS,CAAC,CAAC,GAE9E,qBAAqB,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,mBAAmB,CAAC,MAAM,CAAC,CAAC;CACxF,CAAC;AAEF;;;GAGG;AACH,MAAM,MAAM,iBAAiB,CAC3B,OAAO,EACP,SAAS,SAAS,MAAM,OAAO,GAAG,KAAK,EACvC,YAAY,SAAS,OAAO,CAAC,MAAM,OAAO,EAAE,SAAS,CAAC,GAAG,KAAK,IAC5D,WAAW,CAAC,IAAI,CAAC,OAAO,EAAE,SAAS,CAAC,EAAE,YAAY,CAAC,CAAC"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/filter/types.ts"],"names":[],"mappings":"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"}
package/dist/index.js CHANGED
@@ -32,7 +32,7 @@ import { BaseModel, BaseModelClass, init_base_model } from "./database/base-mode
32
32
  import { api, init_decorators, registeredApis, stream, transactional, upload, websocket } from "./api/decorators.js";
33
33
  import { ingestAuditEvent } from "./auth/audit-log-ingestor.js";
34
34
  import { sonamuAuditLog } from "./auth/audit-log/plugin.js";
35
- import { generateBetterAuthEntities } from "./auth/auth-generator.js";
35
+ import { addCompanionsToEntities, generateBetterAuthEntities } from "./auth/auth-generator.js";
36
36
  import { init_knex_adapter, sonamuKnexAdapter } from "./auth/knex-adapter.js";
37
37
  import { ADMIN_SCHEMA, admin } from "./auth/plugins/wrappers/admin.js";
38
38
  import { ANONYMOUS_SCHEMA, anonymous } from "./auth/plugins/wrappers/anonymous.js";
@@ -45,10 +45,6 @@ import { SSO_SCHEMA, sso } from "./auth/plugins/wrappers/sso.js";
45
45
  import { TWO_FACTOR_SCHEMA, twoFactor } from "./auth/plugins/wrappers/two-factor.js";
46
46
  import { USERNAME_SCHEMA, username } from "./auth/plugins/wrappers/username.js";
47
47
  import "./auth/index.js";
48
- import { PostgreSQLSchemaReader, init_postgresql_schema_reader } from "./migration/postgresql-schema-reader.js";
49
- import { generateAlterCode, generateCreateCode, getAlterIndexesTo, init_code_generation, setMigrationIndexDefaults } from "./migration/code-generation.js";
50
- import { getMigrationSetFromEntity, init_migration_set } from "./migration/migration-set.js";
51
- import { MigrationTargetExecutionError, Migrator, init_migrator } from "./migration/migrator.js";
52
48
  import { FixtureManager, FixtureManagerClass, init_fixture_manager } from "./testing/fixture-manager.js";
53
49
  import { cache, init_decorator } from "./cache/decorator.js";
54
50
  import "./database/base-model.types.js";
@@ -56,6 +52,10 @@ import "./database/puri-subset.types.js";
56
52
  import { Entity, init_entity } from "./entity/entity.js";
57
53
  import { setupErrorHandler } from "./exceptions/error-handler.js";
58
54
  import "./filter/index.js";
55
+ import { PostgreSQLSchemaReader, init_postgresql_schema_reader } from "./migration/postgresql-schema-reader.js";
56
+ import { generateAlterCode, generateCreateCode, getAlterIndexesTo, init_code_generation, setMigrationIndexDefaults } from "./migration/code-generation.js";
57
+ import { getMigrationSetFromEntity, init_migration_set } from "./migration/migration-set.js";
58
+ import { MigrationTargetExecutionError, Migrator, init_migrator } from "./migration/migrator.js";
59
59
  import "./migration/types.js";
60
60
  import { NaiteReporter } from "./naite/naite-reporter.js";
61
61
  import "./stream/ws-core.js";
@@ -104,6 +104,6 @@ init_controller();
104
104
  init_model();
105
105
  init_utils();
106
106
  //#endregion
107
- export { ADMIN_SCHEMA, ANONYMOUS_SCHEMA, API_KEY_SCHEMA, AlreadyProcessedException, ApiParamType, BASE_FIELD_MAPPINGS, BUILT_IN_TYPE_IDS, BadRequestException, BaseFrameClass, BaseModel, BaseModelClass, CachePresets, CompressPresets, DB, DBClass, DuplicateRowException, Entity, EntityJsonSchema, EntityManager, FUZZY_OPERATORS, FixtureManager, FixtureManagerClass, GenerateOptions, InMemoryWebSocketPresenceStore, InternalServerErrorException, JWT_SCHEMA, JoinClauseGroup, KnownOpclassValues, MigrationTargetExecutionError, Migrator, Naite, NaiteClass, NaiteQuery, NaiteReporter, NoopWebSocketClusterBus, NormalPropSchema, NotFoundException, ORGANIZATION_SCHEMA, PASSKEY_SCHEMA, PHONE_NUMBER_SCHEMA, PathAndCode, PostgreSQLSchemaReader, Puri, PuriTransactionWrapper, PuriWrapper, RelationPropSchema, RenderingNode, ResolvedPuri, SSO_SCHEMA, ServiceUnavailableException, SoException, Sonamu, SonamuFileArraySchema, SonamuFileSchema, SonamuQueryMode, SonamuSemanticParams, TWO_FACTOR_SCHEMA, TargetNotFoundException, Template, TemplateKey, TemplateManager, TemplateManagerClass, TemplateOptions, USERNAME_SCHEMA, UnauthorizedException, UpsertBuilder, WebSocketAudience, WebSocketRegistry, WebSocketRuntime, WhereGroup, ZodStringFormat, admin, anonymous, api, apiKey, applyCacheHeaders, asArray, assertDefined, assertExists, assertHttpValidatorRegistry, assertNotNull, betterAuthV1, buildCacheControl, cache, convertFastifyHeadersToStandard, createHttpValidator, createMockSSEFactory, createSSEFactory, createWebSocketReplyStub, createWebSocketRuntime, defaultHttpValidatorDependencies, defaultOperatorByPropType, defaultSonamuHttpValidatorDependencies, defineConfig, differenceWith, exhaustive, fastifyCaster, findApiRootPath, findAppRootPath, generateAlterCode, generateBetterAuthEntities, generateCreateCode, getAlterIndexesTo, getDescription, getEnumDefValues, getEnumValues, getHttpValidatorFingerprint, getHttpValidatorRouteIdentifier, getHttpValidatorRouteKey, getMigrationSetFromEntity, getSubsetFields, getZodObjectFromApi, ingestAuditEvent, intersectionBy, isBelongsToOneRelationProp, isBigIntegerArrayProp, isBigIntegerProp, isBigIntegerSingleProp, isBooleanArrayProp, isBooleanProp, isBooleanSingleProp, isCompressDisabled, isCustomJoinClause, isDaemonServer, isDateArrayProp, isDateProp, isDateSingleProp, isDevelopment, isEnumArrayProp, isEnumDefWithCone, isEnumProp, isEnumSingleProp, isHasManyRelationProp, isHotReloadServer, isInDocker, isIntegerArrayProp, isIntegerProp, isIntegerSingleProp, isInternalSubsetField, isJsonProp, isKnexError, isLocal, isManyToManyRelationProp, isNumberArrayProp, isNumberProp, isNumberSingleProp, isNumericArrayProp, isNumericProp, isNumericSingleProp, isOneToOneRelationProp, isPlainObject, isProduction, isRefField, isRelationProp, isRemote, isSearchTextJsonSourceZodType, isSearchTextProp, isSoException, isStaging, isStringArrayProp, isStringProp, isStringSingleProp, isSubsetDefWithCone, isTest, isTsVectorProp, isUuidArrayProp, isUuidProp, isUuidSingleProp, isVectorArrayProp, isVectorProp, isVectorSingleProp, isVirtualCodeProp, isVirtualProp, isVirtualQueryProp, jwt, loadConfig, merge, nonNullable, normalizeFilterQuery, normalizeSubsetField, normalizeZodCompilerPolicy, objToMap, operatorsByPropType, organization, parseFuzzyOperator, passkey, phoneNumber, registeredApis, resolveWebSocketCloseDescriptor, resolveWebSocketPluginOptions, setMigrationIndexDefaults, setupErrorHandler, sonamuAuditLog, sonamuKnexAdapter, sso, stream, toFastifyCompressOption, transactional, twoFactor, upload, username, validateSonamuFilters, websocket, withProp, withProps, workflow, zArrayable };
107
+ export { ADMIN_SCHEMA, ANONYMOUS_SCHEMA, API_KEY_SCHEMA, AlreadyProcessedException, ApiParamType, BASE_FIELD_MAPPINGS, BUILT_IN_TYPE_IDS, BadRequestException, BaseFrameClass, BaseModel, BaseModelClass, CachePresets, CompressPresets, DB, DBClass, DuplicateRowException, Entity, EntityJsonSchema, EntityManager, FUZZY_OPERATORS, FixtureManager, FixtureManagerClass, GenerateOptions, InMemoryWebSocketPresenceStore, InternalServerErrorException, JWT_SCHEMA, JoinClauseGroup, KnownOpclassValues, MigrationTargetExecutionError, Migrator, Naite, NaiteClass, NaiteQuery, NaiteReporter, NoopWebSocketClusterBus, NormalPropSchema, NotFoundException, ORGANIZATION_SCHEMA, PASSKEY_SCHEMA, PHONE_NUMBER_SCHEMA, PathAndCode, PostgreSQLSchemaReader, Puri, PuriTransactionWrapper, PuriWrapper, RelationPropSchema, RenderingNode, ResolvedPuri, SSO_SCHEMA, ServiceUnavailableException, SoException, Sonamu, SonamuFileArraySchema, SonamuFileSchema, SonamuQueryMode, SonamuSemanticParams, TWO_FACTOR_SCHEMA, TargetNotFoundException, Template, TemplateKey, TemplateManager, TemplateManagerClass, TemplateOptions, USERNAME_SCHEMA, UnauthorizedException, UpsertBuilder, WebSocketAudience, WebSocketRegistry, WebSocketRuntime, WhereGroup, ZodStringFormat, addCompanionsToEntities, admin, anonymous, api, apiKey, applyCacheHeaders, asArray, assertDefined, assertExists, assertHttpValidatorRegistry, assertNotNull, betterAuthV1, buildCacheControl, cache, convertFastifyHeadersToStandard, createHttpValidator, createMockSSEFactory, createSSEFactory, createWebSocketReplyStub, createWebSocketRuntime, defaultHttpValidatorDependencies, defaultOperatorByPropType, defaultSonamuHttpValidatorDependencies, defineConfig, differenceWith, exhaustive, fastifyCaster, findApiRootPath, findAppRootPath, generateAlterCode, generateBetterAuthEntities, generateCreateCode, getAlterIndexesTo, getDescription, getEnumDefValues, getEnumValues, getHttpValidatorFingerprint, getHttpValidatorRouteIdentifier, getHttpValidatorRouteKey, getMigrationSetFromEntity, getSubsetFields, getZodObjectFromApi, ingestAuditEvent, intersectionBy, isBelongsToOneRelationProp, isBigIntegerArrayProp, isBigIntegerProp, isBigIntegerSingleProp, isBooleanArrayProp, isBooleanProp, isBooleanSingleProp, isCompressDisabled, isCustomJoinClause, isDaemonServer, isDateArrayProp, isDateProp, isDateSingleProp, isDevelopment, isEnumArrayProp, isEnumDefWithCone, isEnumProp, isEnumSingleProp, isHasManyRelationProp, isHotReloadServer, isInDocker, isIntegerArrayProp, isIntegerProp, isIntegerSingleProp, isInternalSubsetField, isJsonProp, isKnexError, isLocal, isManyToManyRelationProp, isNumberArrayProp, isNumberProp, isNumberSingleProp, isNumericArrayProp, isNumericProp, isNumericSingleProp, isOneToOneRelationProp, isPlainObject, isProduction, isRefField, isRelationProp, isRemote, isSearchTextJsonSourceZodType, isSearchTextProp, isSoException, isStaging, isStringArrayProp, isStringProp, isStringSingleProp, isSubsetDefWithCone, isTest, isTsVectorProp, isUuidArrayProp, isUuidProp, isUuidSingleProp, isVectorArrayProp, isVectorProp, isVectorSingleProp, isVirtualCodeProp, isVirtualProp, isVirtualQueryProp, jwt, loadConfig, merge, nonNullable, normalizeFilterQuery, normalizeSubsetField, normalizeZodCompilerPolicy, objToMap, operatorsByPropType, organization, parseFuzzyOperator, passkey, phoneNumber, registeredApis, resolveWebSocketCloseDescriptor, resolveWebSocketPluginOptions, setMigrationIndexDefaults, setupErrorHandler, sonamuAuditLog, sonamuKnexAdapter, sso, stream, toFastifyCompressOption, transactional, twoFactor, upload, username, validateSonamuFilters, websocket, withProp, withProps, workflow, zArrayable };
108
108
 
109
109
  //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vc3JjL2luZGV4LnRzIl0sInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCAqIGZyb20gXCIuL2FwaS9iYXNlLWZyYW1lXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9hcGkvY29uZmlnXCI7XG5leHBvcnQgdHlwZSAqIGZyb20gXCIuL2FwaS9jb250ZXh0XCI7XG5leHBvcnQgKiBmcm9tIFwiLi9hcGkvZGVjb3JhdG9yc1wiO1xuZXhwb3J0IHsgZmFzdGlmeUNhc3RlciB9IGZyb20gXCIuL2FwaS9jYXN0ZXJcIjtcbmV4cG9ydCB7IGdldFpvZE9iamVjdEZyb21BcGkgfSBmcm9tIFwiLi9hcGkvY29kZS1jb252ZXJ0ZXJzXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9hcGkvaHR0cC12YWxpZGF0b3JcIjtcbmV4cG9ydCAqIGZyb20gXCIuL2FwaS9zb25hbXVcIjtcbmV4cG9ydCAqIGZyb20gXCIuL2F1dGhcIjtcbmV4cG9ydCB7IGNhY2hlIH0gZnJvbSBcIi4vY2FjaGUvZGVjb3JhdG9yXCI7XG5leHBvcnQgdHlwZSB7IENhY2hlRGVjb3JhdG9yT3B0aW9ucyB9IGZyb20gXCIuL2NhY2hlL3R5cGVzXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9jYWNoZS1jb250cm9sL2NhY2hlLWNvbnRyb2xcIjtcbmV4cG9ydCB0eXBlICogZnJvbSBcIi4vY2FjaGUtY29udHJvbC90eXBlc1wiO1xuZXhwb3J0ICogZnJvbSBcIi4vY29tcHJlc3MvY29tcHJlc3NcIjtcbmV4cG9ydCB0eXBlICogZnJvbSBcIi4vY29tcHJlc3MvdHlwZXNcIjtcbmV4cG9ydCAqIGZyb20gXCIuL2RhdGFiYXNlL2Jhc2UtbW9kZWxcIjtcbmV4cG9ydCAqIGZyb20gXCIuL2RhdGFiYXNlL2Jhc2UtbW9kZWwudHlwZXNcIjtcbmV4cG9ydCAqIGZyb20gXCIuL2RhdGFiYXNlL2RiXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9kYXRhYmFzZS9wdXJpXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9kYXRhYmFzZS9wdXJpLnR5cGVzXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9kYXRhYmFzZS9wdXJpLXN1YnNldC50eXBlc1wiO1xuZXhwb3J0ICogZnJvbSBcIi4vZGF0YWJhc2UvcHVyaS13cmFwcGVyXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9kYXRhYmFzZS91cHNlcnQtYnVpbGRlclwiO1xuZXhwb3J0ICogZnJvbSBcIi4vZW50aXR5L2VudGl0eVwiO1xuZXhwb3J0ICogZnJvbSBcIi4vZW50aXR5L2VudGl0eS1tYW5hZ2VyXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9leGNlcHRpb25zL2Vycm9yLWhhbmRsZXJcIjtcbmV4cG9ydCAqIGZyb20gXCIuL2V4Y2VwdGlvbnMvc28tZXhjZXB0aW9uc1wiO1xuZXhwb3J0ICogZnJvbSBcIi4vZmlsdGVyXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9taWdyYXRpb24vY29kZS1nZW5lcmF0aW9uXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9taWdyYXRpb24vbWlncmF0aW9uLXNldFwiO1xuZXhwb3J0ICogZnJvbSBcIi4vbWlncmF0aW9uL21pZ3JhdG9yXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9taWdyYXRpb24vcG9zdGdyZXNxbC1zY2hlbWEtcmVhZGVyXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9taWdyYXRpb24vdHlwZXNcIjtcbmV4cG9ydCAqIGZyb20gXCIuL25haXRlL25haXRlXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9uYWl0ZS9uYWl0ZS1yZXBvcnRlclwiO1xuZXhwb3J0ICogZnJvbSBcIi4vc3RyZWFtL3NzZVwiO1xuZXhwb3J0ICogZnJvbSBcIi4vc3RyZWFtL3dzLWF1ZGllbmNlXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9zdHJlYW0vd3MtY2x1c3Rlci1idXNcIjtcbmV4cG9ydCAqIGZyb20gXCIuL3N0cmVhbS93cy1jb3JlXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9zdHJlYW0vd3MtcHJlc2VuY2Utc3RvcmVcIjtcbmV4cG9ydCAqIGZyb20gXCIuL3N0cmVhbS93c1wiO1xuZXhwb3J0ICogZnJvbSBcIi4vc3RyZWFtL3dzLXJlZ2lzdHJ5XCI7XG5leHBvcnQgKiBmcm9tIFwiLi90YXNrcy9kZWNvcmF0b3JcIjtcbmV4cG9ydCAqIGZyb20gXCIuL3RlbXBsYXRlL3RlbXBsYXRlXCI7XG5leHBvcnQgKiBmcm9tIFwiLi90ZW1wbGF0ZS90ZW1wbGF0ZS1tYW5hZ2VyXCI7XG5leHBvcnQgKiBmcm9tIFwiLi90ZXN0aW5nL2ZpeHR1cmUtbWFuYWdlclwiO1xuZXhwb3J0ICogZnJvbSBcIi4vdHlwZXMvdHlwZXNcIjtcbmV4cG9ydCAqIGZyb20gXCIuL3V0aWxzL2NvbnRyb2xsZXJcIjtcbmV4cG9ydCAqIGZyb20gXCIuL3V0aWxzL21vZGVsXCI7XG5leHBvcnQgKiBmcm9tIFwiLi91dGlscy90eXBlLXV0aWxzXCI7XG5leHBvcnQgKiBmcm9tIFwiLi91dGlscy91dGlsc1wiO1xuXG4vLyBleHBvcnQgKiBmcm9tIFwiLi9hcGkvY29kZS1jb252ZXJ0ZXJzXCI7XG4vLyBleHBvcnQgKiBmcm9tIFwiLi9zeW5jZXIvc3luY2VyXCI7XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztZQUk0QztxQkFDZTs7OztlQUlsQiJ9
@@ -1,4 +1,12 @@
1
- import { type FilterLike, type LoggerConfig, type Sink } from "@logtape/logtape";
1
+ import { type Config, type FilterLike, type LoggerConfig, type Sink } from "@logtape/logtape";
2
+ interface ExternalLogTapeConfiguration {
3
+ readonly config: Config<string, string>;
4
+ applied: boolean;
5
+ }
6
+ declare global {
7
+ var sonamuKitCliLogTapeOverride: ExternalLogTapeConfiguration | undefined;
8
+ }
9
+ export declare function hasExternalLogTapeConfiguration(): boolean;
2
10
  export type SonamuLoggingOptions<TSinkId extends string, TFilterId extends string> = {
3
11
  fastifyCategory?: readonly string[];
4
12
  sinks?: Record<TSinkId, Sink>;
@@ -6,4 +14,5 @@ export type SonamuLoggingOptions<TSinkId extends string, TFilterId extends strin
6
14
  loggers?: LoggerConfig<TSinkId, TFilterId>[];
7
15
  };
8
16
  export declare function configureLogTape<TSinkId extends string, TFilterId extends string>(options: SonamuLoggingOptions<TSinkId, TFilterId>): Promise<void>;
17
+ export {};
9
18
  //# sourceMappingURL=configure.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"configure.d.ts","sourceRoot":"","sources":["../../src/logger/configure.ts"],"names":[],"mappings":"AACA,OAAO,EAEL,KAAK,UAAU,EACf,KAAK,YAAY,EAEjB,KAAK,IAAI,EAEV,MAAM,kBAAkB,CAAC;AAM1B,MAAM,MAAM,oBAAoB,CAAC,OAAO,SAAS,MAAM,EAAE,SAAS,SAAS,MAAM,IAAI;IAGnF,eAAe,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAGpC,KAAK,CAAC,EAAE,MAAM,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;IAC9B,OAAO,CAAC,EAAE,MAAM,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC;IAGxC,OAAO,CAAC,EAAE,YAAY,CAAC,OAAO,EAAE,SAAS,CAAC,EAAE,CAAC;CAC9C,CAAC;AAiFF,wBAAsB,gBAAgB,CAAC,OAAO,SAAS,MAAM,EAAE,SAAS,SAAS,MAAM,EACrF,OAAO,EAAE,oBAAoB,CAAC,OAAO,EAAE,SAAS,CAAC,iBAgClD"}
1
+ {"version":3,"file":"configure.d.ts","sourceRoot":"","sources":["../../src/logger/configure.ts"],"names":[],"mappings":"AACA,OAAO,EACL,KAAK,MAAM,EAEX,KAAK,UAAU,EACf,KAAK,YAAY,EAEjB,KAAK,IAAI,EAEV,MAAM,kBAAkB,CAAC;AAM1B,UAAU,4BAA4B;IACpC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACxC,OAAO,EAAE,OAAO,CAAC;CAClB;AAED,OAAO,CAAC,MAAM,CAAC;IACb,IAAI,2BAA2B,EAAE,4BAA4B,GAAG,SAAS,CAAC;CAC3E;AAMD,wBAAgB,+BAA+B,IAAI,OAAO,CAEzD;AAED,MAAM,MAAM,oBAAoB,CAAC,OAAO,SAAS,MAAM,EAAE,SAAS,SAAS,MAAM,IAAI;IAGnF,eAAe,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAGpC,KAAK,CAAC,EAAE,MAAM,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;IAC9B,OAAO,CAAC,EAAE,MAAM,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC;IAGxC,OAAO,CAAC,EAAE,YAAY,CAAC,OAAO,EAAE,SAAS,CAAC,EAAE,CAAC;CAC9C,CAAC;AAiFF,wBAAsB,gBAAgB,CAAC,OAAO,SAAS,MAAM,EAAE,SAAS,SAAS,MAAM,EACrF,OAAO,EAAE,oBAAoB,CAAC,OAAO,EAAE,SAAS,CAAC,iBAwDlD"}