sonamu 0.11.16 → 0.13.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 (322) hide show
  1. package/dist/_virtual/_rolldown/runtime.js +1 -2
  2. package/dist/ai/agents/agent.js +2 -3
  3. package/dist/ai/agents/index.js +1 -2
  4. package/dist/ai/index.js +1 -2
  5. package/dist/ai/providers/rtzr/api.js +1 -2
  6. package/dist/ai/providers/rtzr/error.js +2 -3
  7. package/dist/ai/providers/rtzr/model.js +1 -2
  8. package/dist/ai/providers/rtzr/options.js +1 -2
  9. package/dist/ai/providers/rtzr/provider.js +1 -2
  10. package/dist/ai/providers/rtzr/utils.js +1 -2
  11. package/dist/api/base-frame.js +4 -4
  12. package/dist/api/caster.d.ts +1 -1
  13. package/dist/api/caster.d.ts.map +1 -1
  14. package/dist/api/caster.js +9 -9
  15. package/dist/api/code-converters.js +6 -5
  16. package/dist/api/config.d.ts +1 -1
  17. package/dist/api/config.d.ts.map +1 -1
  18. package/dist/api/config.js +2 -3
  19. package/dist/api/context.d.ts +2 -3
  20. package/dist/api/context.d.ts.map +1 -1
  21. package/dist/api/context.js +2 -3
  22. package/dist/api/decorators.js +2 -3
  23. package/dist/api/http-validator.js +2 -3
  24. package/dist/api/index.js +8 -3
  25. package/dist/api/secret.js +1 -2
  26. package/dist/api/sonamu.d.ts +3 -5
  27. package/dist/api/sonamu.d.ts.map +1 -1
  28. package/dist/api/sonamu.js +30 -24
  29. package/dist/api/validator.js +1 -2
  30. package/dist/api/websocket-helpers.js +2 -3
  31. package/dist/auth/audit-log/builders.js +1 -2
  32. package/dist/auth/audit-log/client-ip.js +2 -3
  33. package/dist/auth/audit-log/events.js +1 -2
  34. package/dist/auth/audit-log/plugin.d.ts.map +1 -1
  35. package/dist/auth/audit-log/plugin.js +2 -3
  36. package/dist/auth/audit-log-ingestor.js +2 -3
  37. package/dist/auth/auth-generator.js +2 -3
  38. package/dist/auth/better-auth-entities.js +1 -2
  39. package/dist/auth/better-auth-request.js +2 -3
  40. package/dist/auth/index.js +2 -3
  41. package/dist/auth/knex-adapter.js +2 -3
  42. package/dist/auth/plugins/entity-definitions/admin.js +1 -2
  43. package/dist/auth/plugins/entity-definitions/anonymous.js +1 -2
  44. package/dist/auth/plugins/entity-definitions/api-key.js +1 -2
  45. package/dist/auth/plugins/entity-definitions/audit-log.js +1 -2
  46. package/dist/auth/plugins/entity-definitions/index.js +1 -2
  47. package/dist/auth/plugins/entity-definitions/jwt.js +1 -2
  48. package/dist/auth/plugins/entity-definitions/organization.js +1 -2
  49. package/dist/auth/plugins/entity-definitions/passkey.js +1 -2
  50. package/dist/auth/plugins/entity-definitions/phone-number.js +1 -2
  51. package/dist/auth/plugins/entity-definitions/sso.js +1 -2
  52. package/dist/auth/plugins/entity-definitions/two-factor.js +1 -2
  53. package/dist/auth/plugins/entity-definitions/username.js +1 -2
  54. package/dist/auth/plugins/wrappers/admin.d.ts +33 -32
  55. package/dist/auth/plugins/wrappers/admin.d.ts.map +1 -1
  56. package/dist/auth/plugins/wrappers/admin.js +2 -3
  57. package/dist/auth/plugins/wrappers/anonymous.js +2 -3
  58. package/dist/auth/plugins/wrappers/api-key.js +2 -3
  59. package/dist/auth/plugins/wrappers/jwt.js +2 -3
  60. package/dist/auth/plugins/wrappers/organization.js +2 -3
  61. package/dist/auth/plugins/wrappers/passkey.js +2 -3
  62. package/dist/auth/plugins/wrappers/phone-number.d.ts +43 -1
  63. package/dist/auth/plugins/wrappers/phone-number.d.ts.map +1 -1
  64. package/dist/auth/plugins/wrappers/phone-number.js +2 -3
  65. package/dist/auth/plugins/wrappers/sso.d.ts +138 -187
  66. package/dist/auth/plugins/wrappers/sso.d.ts.map +1 -1
  67. package/dist/auth/plugins/wrappers/sso.js +1 -2
  68. package/dist/auth/plugins/wrappers/two-factor.d.ts +51 -10
  69. package/dist/auth/plugins/wrappers/two-factor.d.ts.map +1 -1
  70. package/dist/auth/plugins/wrappers/two-factor.js +2 -3
  71. package/dist/auth/plugins/wrappers/username.d.ts +39 -5
  72. package/dist/auth/plugins/wrappers/username.d.ts.map +1 -1
  73. package/dist/auth/plugins/wrappers/username.js +2 -3
  74. package/dist/bin/build-config.js +5 -5
  75. package/dist/bin/compiler-policy.js +2 -3
  76. package/dist/bin/fixture.js +7 -5
  77. package/dist/bin/hmr-hook-register.js +1 -2
  78. package/dist/bin/migrate-targets.js +2 -3
  79. package/dist/bin/test-command.js +2 -3
  80. package/dist/bin/ts-loader-register.js +2 -3
  81. package/dist/bin/ts-loader-registration.js +2 -3
  82. package/dist/bin/typecheck-web.js +2 -3
  83. package/dist/cache/cache-manager.js +1 -2
  84. package/dist/cache/decorator.js +2 -3
  85. package/dist/cache/drivers.js +1 -2
  86. package/dist/cache/index.js +2 -3
  87. package/dist/cache-control/cache-control.js +1 -2
  88. package/dist/code-formatting/index.js +2 -3
  89. package/dist/code-formatting/oxfmt.js +2 -3
  90. package/dist/code-formatting/oxlint.js +2 -3
  91. package/dist/compress/compress.js +1 -2
  92. package/dist/compress/index.js +2 -2
  93. package/dist/compress/types.d.ts +1 -1
  94. package/dist/compress/types.d.ts.map +1 -1
  95. package/dist/cone/cone-generator.js +2 -3
  96. package/dist/database/_batch_update.js +1 -2
  97. package/dist/database/base-model.js +4 -4
  98. package/dist/database/db.js +4 -4
  99. package/dist/database/knex.js +2 -3
  100. package/dist/database/puri-wrapper.js +2 -3
  101. package/dist/database/puri.js +23 -22
  102. package/dist/database/puri.types.js +1 -2
  103. package/dist/database/transaction-context.js +1 -2
  104. package/dist/database/upsert-builder.js +2 -3
  105. package/dist/dict/en.js +2 -3
  106. package/dist/dict/index.js +3 -3
  107. package/dist/dict/ko.js +2 -3
  108. package/dist/dict/rc-keys.js +1 -2
  109. package/dist/dict/sd.js +2 -3
  110. package/dist/dict/sonamu-dictionary.js +7 -6
  111. package/dist/dict/utils.js +2 -3
  112. package/dist/entity/entity-manager.d.ts +66 -66
  113. package/dist/entity/entity-manager.js +4 -4
  114. package/dist/entity/entity-template-cone.js +2 -3
  115. package/dist/entity/entity.js +21 -18
  116. package/dist/env.js +1 -2
  117. package/dist/exceptions/error-handler.d.ts.map +1 -1
  118. package/dist/exceptions/error-handler.js +2 -3
  119. package/dist/exceptions/so-exceptions.js +2 -3
  120. package/dist/filter/index.js +3 -2
  121. package/dist/filter/types.js +1 -2
  122. package/dist/filter/utils.js +7 -6
  123. package/dist/index.d.ts +1 -0
  124. package/dist/index.d.ts.map +1 -1
  125. package/dist/index.js +42 -6
  126. package/dist/logger/category.js +2 -3
  127. package/dist/logger/configure.js +5 -5
  128. package/dist/migration/code-generation.js +23 -16
  129. package/dist/migration/index-where-predicate.js +2 -3
  130. package/dist/migration/migration-set.js +2 -3
  131. package/dist/migration/migrator.js +2 -3
  132. package/dist/migration/postgresql-schema-reader.js +6 -9
  133. package/dist/migration/slack-confirm.js +2 -3
  134. package/dist/naite/naite-reporter.js +2 -3
  135. package/dist/naite/naite.js +10 -8
  136. package/dist/runtime-type.js +2 -3
  137. package/dist/ssr/hmr-opt-out.js +1 -2
  138. package/dist/ssr/index.js +7 -4
  139. package/dist/ssr/registry.js +1 -2
  140. package/dist/ssr/renderer.js +2 -3
  141. package/dist/storage/base-file.js +1 -2
  142. package/dist/storage/buffered-file.js +2 -3
  143. package/dist/storage/drivers.js +1 -2
  144. package/dist/storage/index.js +2 -3
  145. package/dist/storage/s3-driver.js +1 -2
  146. package/dist/storage/storage-manager.js +2 -3
  147. package/dist/storage/uploaded-file.js +2 -3
  148. package/dist/stream/__tests__/ws-test-helpers.d.ts +108 -0
  149. package/dist/stream/__tests__/ws-test-helpers.d.ts.map +1 -0
  150. package/dist/stream/__tests__/ws-test-helpers.js +259 -0
  151. package/dist/stream/index.d.ts +1 -0
  152. package/dist/stream/index.d.ts.map +1 -1
  153. package/dist/stream/index.js +15 -4
  154. package/dist/stream/sse.js +1 -2
  155. package/dist/stream/ws-audience-resolver.d.ts +8 -5
  156. package/dist/stream/ws-audience-resolver.d.ts.map +1 -1
  157. package/dist/stream/ws-audience-resolver.js +17 -15
  158. package/dist/stream/ws-audience.js +1 -2
  159. package/dist/stream/ws-cluster-bus.d.ts +9 -4
  160. package/dist/stream/ws-cluster-bus.d.ts.map +1 -1
  161. package/dist/stream/ws-cluster-bus.js +2 -3
  162. package/dist/stream/ws-core.d.ts +10 -0
  163. package/dist/stream/ws-core.d.ts.map +1 -1
  164. package/dist/stream/ws-delivery.d.ts +30 -4
  165. package/dist/stream/ws-delivery.d.ts.map +1 -1
  166. package/dist/stream/ws-delivery.js +200 -54
  167. package/dist/stream/ws-frame.d.ts +15 -0
  168. package/dist/stream/ws-frame.d.ts.map +1 -0
  169. package/dist/stream/ws-frame.js +28 -0
  170. package/dist/stream/ws-local-connection-store.d.ts +4 -4
  171. package/dist/stream/ws-local-connection-store.d.ts.map +1 -1
  172. package/dist/stream/ws-local-connection-store.js +3 -4
  173. package/dist/stream/ws-presence-index.d.ts +36 -0
  174. package/dist/stream/ws-presence-index.d.ts.map +1 -0
  175. package/dist/stream/ws-presence-index.js +176 -0
  176. package/dist/stream/ws-presence-store.d.ts +39 -39
  177. package/dist/stream/ws-presence-store.d.ts.map +1 -1
  178. package/dist/stream/ws-presence-store.js +23 -154
  179. package/dist/stream/ws-registry.d.ts +45 -17
  180. package/dist/stream/ws-registry.d.ts.map +1 -1
  181. package/dist/stream/ws-registry.js +170 -62
  182. package/dist/stream/ws-session-id.d.ts +14 -0
  183. package/dist/stream/ws-session-id.d.ts.map +1 -0
  184. package/dist/stream/ws-session-id.js +36 -0
  185. package/dist/stream/ws-telemetry-memory.js +3 -4
  186. package/dist/stream/ws-telemetry-trace.js +1 -2
  187. package/dist/stream/ws-telemetry.js +2 -3
  188. package/dist/stream/ws.d.ts +20 -10
  189. package/dist/stream/ws.d.ts.map +1 -1
  190. package/dist/stream/ws.js +60 -38
  191. package/dist/syncer/api-parser.js +2 -3
  192. package/dist/syncer/checksum.js +4 -4
  193. package/dist/syncer/code-generator.js +4 -4
  194. package/dist/syncer/entity-operations.js +2 -3
  195. package/dist/syncer/event-batcher.js +1 -2
  196. package/dist/syncer/file-copy.js +2 -3
  197. package/dist/syncer/file-patterns.js +2 -3
  198. package/dist/syncer/file-tracking.js +2 -3
  199. package/dist/syncer/filesystem-dependencies.js +1 -2
  200. package/dist/syncer/index.js +8 -2
  201. package/dist/syncer/module-loader.js +8 -6
  202. package/dist/syncer/syncer-actions.js +8 -7
  203. package/dist/syncer/syncer.js +13 -8
  204. package/dist/syncer/watcher.js +2 -3
  205. package/dist/tasks/decorator.js +1 -2
  206. package/dist/tasks/step-wrapper.js +2 -3
  207. package/dist/tasks/workflow-manager.js +2 -3
  208. package/dist/template/entity-converter.js +17 -16
  209. package/dist/template/helpers.js +2 -3
  210. package/dist/template/implementations/entity.template.js +2 -3
  211. package/dist/template/implementations/entry-server.template.js +2 -3
  212. package/dist/template/implementations/generated.template.js +2 -3
  213. package/dist/template/implementations/generated_http.template.js +6 -6
  214. package/dist/template/implementations/generated_sso.template.js +2 -3
  215. package/dist/template/implementations/http_validators.template.js +2 -3
  216. package/dist/template/implementations/init_types.template.js +2 -3
  217. package/dist/template/implementations/model.template.js +4 -4
  218. package/dist/template/implementations/model_test.template.js +2 -3
  219. package/dist/template/implementations/queries.template.js +2 -3
  220. package/dist/template/implementations/sd.template.js +2 -3
  221. package/dist/template/implementations/services.template.js +2 -3
  222. package/dist/template/implementations/view_form.template.js +12 -9
  223. package/dist/template/implementations/view_id_all_select.template.js +2 -3
  224. package/dist/template/implementations/view_list.template.d.ts.map +1 -1
  225. package/dist/template/implementations/view_list.template.js +19 -17
  226. package/dist/template/implementations/view_search_input.template.js +2 -3
  227. package/dist/template/index.js +9 -3
  228. package/dist/template/template-manager.js +2 -3
  229. package/dist/template/template-types.js +1 -2
  230. package/dist/template/template.js +2 -3
  231. package/dist/template/zod-converter.js +54 -47
  232. package/dist/testing/_relation-graph.js +2 -3
  233. package/dist/testing/bootstrap.js +2 -3
  234. package/dist/testing/data-explorer.js +2 -3
  235. package/dist/testing/dev-test-routes.js +2 -3
  236. package/dist/testing/dev-vitest-manager.js +15 -12
  237. package/dist/testing/faker-mappings.js +1 -2
  238. package/dist/testing/filesystem.js +2 -3
  239. package/dist/testing/fixture-generator.js +2 -3
  240. package/dist/testing/fixture-loader.js +1 -2
  241. package/dist/testing/fixture-manager.js +12 -9
  242. package/dist/testing/global-setup.js +5 -5
  243. package/dist/testing/index.js +6 -3
  244. package/dist/testing/naite-vitest-reporter.js +1 -2
  245. package/dist/testing/parallel-db-manager.js +2 -3
  246. package/dist/testing/vitest-helpers.js +2 -3
  247. package/dist/tooling/__tests__/helpers/sonamu-test-root.js +2 -3
  248. package/dist/tooling/cdd-service.js +1 -2
  249. package/dist/tooling/cli-tooling.js +1 -2
  250. package/dist/tooling/fixture-service.js +1 -2
  251. package/dist/tooling/index.js +1 -2
  252. package/dist/tooling/test-run-client.js +2 -3
  253. package/dist/tsdown.api.config.js +1 -2
  254. package/dist/types/types.js +2 -3
  255. package/dist/ui/ai-api.d.ts.map +1 -1
  256. package/dist/ui/ai-api.js +4 -5
  257. package/dist/ui/ai-client.d.ts +2 -2
  258. package/dist/ui/ai-client.d.ts.map +1 -1
  259. package/dist/ui/ai-client.js +9 -8
  260. package/dist/ui/api.d.ts.map +1 -1
  261. package/dist/ui/api.js +11 -8
  262. package/dist/ui/async-route.js +1 -2
  263. package/dist/ui/cdd-service.js +22 -21
  264. package/dist/ui/migrations-api.js +6 -5
  265. package/dist/ui-web/assets/index-QDMyy31K.js +180 -0
  266. package/dist/ui-web/assets/index-dV7akMFB.css +1 -0
  267. package/dist/ui-web/index.html +2 -2
  268. package/dist/utils/async-utils.js +1 -2
  269. package/dist/utils/class-name.js +1 -2
  270. package/dist/utils/console-util.js +1 -2
  271. package/dist/utils/controller.js +2 -3
  272. package/dist/utils/esm-utils.js +1 -2
  273. package/dist/utils/fs-utils.js +2 -3
  274. package/dist/utils/lodash-able.js +1 -2
  275. package/dist/utils/model.js +1 -2
  276. package/dist/utils/object-utils.js +2 -3
  277. package/dist/utils/path-utils.js +2 -3
  278. package/dist/utils/process-utils.js +2 -3
  279. package/dist/utils/runtime-value.js +1 -2
  280. package/dist/utils/sql-parser.js +2 -3
  281. package/dist/utils/type-utils.js +8 -8
  282. package/dist/utils/utils.js +2 -3
  283. package/dist/utils/zod-error.js +2 -3
  284. package/dist/vector/chunking.js +1 -2
  285. package/dist/vector/config.js +1 -2
  286. package/dist/vector/embedding.js +4 -4
  287. package/package.json +63 -63
  288. package/src/ai/agents/agent.ts +1 -1
  289. package/src/api/__tests__/sonamu.plugins.test.ts +11 -1
  290. package/src/api/__tests__/sonamu.websocket-routes.test.ts +234 -0
  291. package/src/api/__tests__/sonamu.websocket.test.ts +241 -24
  292. package/src/api/config.ts +1 -1
  293. package/src/api/context.ts +2 -8
  294. package/src/api/sonamu.ts +46 -28
  295. package/src/auth/audit-log/plugin.ts +2 -0
  296. package/src/compress/types.ts +1 -1
  297. package/src/exceptions/error-handler.ts +3 -2
  298. package/src/index.ts +1 -0
  299. package/src/stream/__tests__/ws-contracts.test.ts +483 -265
  300. package/src/stream/__tests__/ws-multinode.test.ts +326 -0
  301. package/src/stream/__tests__/ws-registry-async.test.ts +855 -0
  302. package/src/stream/__tests__/ws-test-helpers.ts +360 -0
  303. package/src/stream/__tests__/ws.test.ts +342 -145
  304. package/src/stream/index.ts +1 -0
  305. package/src/stream/ws-audience-resolver.ts +21 -19
  306. package/src/stream/ws-cluster-bus.ts +12 -4
  307. package/src/stream/ws-core.ts +14 -0
  308. package/src/stream/ws-delivery.ts +321 -97
  309. package/src/stream/ws-frame.ts +39 -0
  310. package/src/stream/ws-local-connection-store.ts +10 -9
  311. package/src/stream/ws-presence-index.ts +273 -0
  312. package/src/stream/ws-presence-store.ts +64 -284
  313. package/src/stream/ws-registry.ts +272 -85
  314. package/src/stream/ws-session-id.ts +39 -0
  315. package/src/stream/ws.ts +91 -50
  316. package/src/template/implementations/model.template.ts +3 -3
  317. package/src/template/implementations/view_list.template.ts +12 -13
  318. package/src/ui/ai-api.ts +4 -2
  319. package/src/ui/ai-client.ts +2 -2
  320. package/src/ui/api.ts +58 -62
  321. package/dist/ui-web/assets/index-BMdIyKXS.css +0 -1
  322. package/dist/ui-web/assets/index-LpE8u19O.js +0 -178
@@ -6,7 +6,7 @@ import { FUZZY_OPERATORS, init_puri_types } from "./puri.types.js";
6
6
  import inflection from "inflection";
7
7
  import assert from "assert";
8
8
  import chalk from "chalk";
9
- //#region src/database/puri.ts
9
+ // src/database/puri.ts
10
10
  function parseFuzzyOperator(operator) {
11
11
  const normalized = operator?.trim() ?? "<%";
12
12
  const fuzzyOperator = FUZZY_OPERATORS.find((candidate) => candidate === normalized);
@@ -452,25 +452,27 @@ var init_puri = __esmMin((() => {
452
452
  if (entries.length !== 1) throw new Error("Table spec must have exactly one entry");
453
453
  assert(entries[0]);
454
454
  const [[alias, spec]] = entries;
455
- if (isStringValue(spec)) if (args.length === 1 && isFunctionValue(args[0])) {
456
- const callback = args[0];
457
- this.knexQuery[joinType]({ [alias]: spec }, (joinClause) => {
458
- callback(new JoinClauseGroup(joinClause));
459
- });
460
- } else {
461
- const [left, right] = args;
462
- this.knexQuery[joinType]({ [alias]: spec }, left, right);
463
- }
464
- else if (spec instanceof Puri) if (args.length === 1 && isFunctionValue(args[0])) {
465
- const callback = args[0];
466
- this.knexQuery[joinType](spec.rawQuery().as(alias), (joinClause) => {
467
- callback(new JoinClauseGroup(joinClause));
468
- });
469
- } else {
470
- const [left, right] = args;
471
- this.knexQuery[joinType](spec.rawQuery().as(alias), left, right);
472
- }
473
- else throw new Error("Invalid table specification");
455
+ if (isStringValue(spec)) {
456
+ if (args.length === 1 && isFunctionValue(args[0])) {
457
+ const callback = args[0];
458
+ this.knexQuery[joinType]({ [alias]: spec }, (joinClause) => {
459
+ callback(new JoinClauseGroup(joinClause));
460
+ });
461
+ } else {
462
+ const [left, right] = args;
463
+ this.knexQuery[joinType]({ [alias]: spec }, left, right);
464
+ }
465
+ } else if (spec instanceof Puri) {
466
+ if (args.length === 1 && isFunctionValue(args[0])) {
467
+ const callback = args[0];
468
+ this.knexQuery[joinType](spec.rawQuery().as(alias), (joinClause) => {
469
+ callback(new JoinClauseGroup(joinClause));
470
+ });
471
+ } else {
472
+ const [left, right] = args;
473
+ this.knexQuery[joinType](spec.rawQuery().as(alias), left, right);
474
+ }
475
+ } else throw new Error("Invalid table specification");
474
476
  } else throw new Error("Invalid arguments");
475
477
  this.correlationRegistry.set(registration.alias, registration);
476
478
  return this;
@@ -1142,8 +1144,7 @@ var init_puri = __esmMin((() => {
1142
1144
  }
1143
1145
  };
1144
1146
  }));
1145
- //#endregion
1146
1147
  init_puri();
1147
1148
  export { JoinClauseGroup, Puri, ResolvedPuri, WhereGroup, init_puri, parseFuzzyOperator };
1148
1149
 
1149
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHVyaS5qcyIsIm5hbWVzIjpbXSwic291cmNlcyI6WyIuLi8uLi9zcmMvZGF0YWJhc2UvcHVyaS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKiBveGxpbnQtZGlzYWJsZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55ICovIC8vIFB1cmnripQg64uk7JaR7ZWcIO2DgOyeheydhCDsgqzsmqntlZjqs6Ag7J6I7Iq164uI64ukLlxuXG5pbXBvcnQgYXNzZXJ0IGZyb20gXCJhc3NlcnRcIjtcblxuaW1wb3J0IGNoYWxrIGZyb20gXCJjaGFsa1wiO1xuaW1wb3J0IGluZmxlY3Rpb24gZnJvbSBcImluZmxlY3Rpb25cIjtcbmltcG9ydCB7IHR5cGUgS25leCB9IGZyb20gXCJrbmV4XCI7XG5cbmltcG9ydCB7IEVudGl0eU1hbmFnZXIgfSBmcm9tIFwiLi4vZW50aXR5L2VudGl0eS1tYW5hZ2VyXCI7XG5pbXBvcnQgeyB0eXBlIFRhYmxlU3BlYyB9IGZyb20gXCIuLi9lbnRpdHkvZW50aXR5LW1hbmFnZXJcIjtcbmltcG9ydCB7IE5haXRlIH0gZnJvbSBcIi4uL25haXRlL25haXRlXCI7XG5pbXBvcnQge1xuICBpc0Z1bmN0aW9uVmFsdWUsXG4gIGlzTnVtYmVyVmFsdWUsXG4gIGlzT2JqZWN0VmFsdWUsXG4gIGlzU3RyaW5nVmFsdWUsXG59IGZyb20gXCIuLi91dGlscy9ydW50aW1lLXZhbHVlXCI7XG5pbXBvcnQgeyB0eXBlIENsZWFyU3RhdGVtZW50cyB9IGZyb20gXCIuL3B1cmktc3Vic2V0LnR5cGVzXCI7XG5pbXBvcnQge1xuICB0eXBlIEF2YWlsYWJsZUNvbHVtbnMsXG4gIHR5cGUgQ29sdW1uS2V5cyxcbiAgdHlwZSBDb21wYXJpc29uT3BlcmF0b3IsXG4gIHR5cGUgRXhwYW5kLFxuICB0eXBlIEV4dHJhY3RDb2x1bW5UeXBlLFxuICB0eXBlIEZ1bGx0ZXh0Q29sdW1ucyxcbiAgdHlwZSBGdXp6eU9wZXJhdG9yLFxuICB0eXBlIEluc2VydERhdGEsXG4gIHR5cGUgSW5zZXJ0UmVzdWx0LFxuICB0eXBlIEpzb25Db2x1bW5zLFxuICB0eXBlIEpzb25TdXBlcnNldFZhbHVlLFxuICB0eXBlIExlZnRKb2luZWRNYXJrZXIsXG4gIHR5cGUgTGVmdEpvaW5NYXJrZXJGb3IsXG4gIHR5cGUgTnVtZXJpY0NvbHVtbnMsXG4gIHR5cGUgT25Db25mbGljdEFjdGlvbixcbiAgdHlwZSBQYXJzZVNlbGVjdE9iamVjdCxcbiAgdHlwZSBSZXN1bHRBdmFpbGFibGVDb2x1bW5zLFxuICB0eXBlIFNlbGVjdEFsbFJlc3VsdCxcbiAgdHlwZSBTZWxlY3RPYmplY3QsXG4gIHR5cGUgU2VsZWN0VmFsdWUsXG4gIHR5cGUgU2luZ2xlVGFibGVWYWx1ZSxcbiAgdHlwZSBTcWxFeHByZXNzaW9uLFxuICB0eXBlIFRzSGlnaGxpZ2h0T3B0aW9ucyxcbiAgdHlwZSBUc1F1ZXJ5Q29uZmlnLFxuICB0eXBlIFRzUXVlcnlPcHRpb25zLFxuICB0eXBlIFRzUmFua09wdGlvbnMsXG4gIHR5cGUgVmVjdG9yQ29sdW1ucyxcbiAgdHlwZSBXaGVyZUNvbmRpdGlvbixcbiAgdHlwZSBXaGVyZU9wZXJhdG9yLFxufSBmcm9tIFwiLi9wdXJpLnR5cGVzXCI7XG5pbXBvcnQgeyBGVVpaWV9PUEVSQVRPUlMgfSBmcm9tIFwiLi9wdXJpLnR5cGVzXCI7XG5cbnR5cGUgUHVyaU9yZGVyQnlEaXJlY3Rpb24gPSBcImFzY1wiIHwgXCJkZXNjXCI7XG50eXBlIFB1cmlPcmRlckJ5TnVsbHMgPSBcImZpcnN0XCIgfCBcImxhc3RcIjtcbnR5cGUgQW55U3FsRXhwcmVzc2lvbiA9IFNxbEV4cHJlc3Npb248XG4gIFwic3RyaW5nXCIgfCBcIm51bWJlclwiIHwgXCJib29sZWFuXCIgfCBcImRhdGVcIiB8IFwic3RyaW5nW11cIiB8IFwidHN2ZWN0b3JcIixcbiAgYm9vbGVhblxuPjtcbnR5cGUgU3RyaW5nU3FsRXhwcmVzc2lvbjxUTnVsbGFibGUgZXh0ZW5kcyBib29sZWFuID0gYm9vbGVhbj4gPSBTcWxFeHByZXNzaW9uPFwic3RyaW5nXCIsIFROdWxsYWJsZT47XG50eXBlIFB1cmlPcmRlckJ5RXhwcmVzc2lvbiA9IFNxbEV4cHJlc3Npb248XCJudW1iZXJcIiB8IFwic3RyaW5nXCIsIGJvb2xlYW4+O1xudHlwZSBTdHJpbmdFeHByZXNzaW9uU2VsZWN0ID0gUmVjb3JkPHN0cmluZywgU3RyaW5nU3FsRXhwcmVzc2lvbj47XG50eXBlIFN0cmluZ0V4cHJlc3Npb25TZWxlY3RSZXN1bHQ8VFNlbGVjdCBleHRlbmRzIFN0cmluZ0V4cHJlc3Npb25TZWxlY3Q+ID0ge1xuICBbSyBpbiBrZXlvZiBUU2VsZWN0XTogVFNlbGVjdFtLXSBleHRlbmRzIFNxbEV4cHJlc3Npb248XCJzdHJpbmdcIiwgaW5mZXIgVE51bGxhYmxlPlxuICAgID8gdHJ1ZSBleHRlbmRzIFROdWxsYWJsZVxuICAgICAgPyBzdHJpbmcgfCBudWxsXG4gICAgICA6IHN0cmluZ1xuICAgIDogbmV2ZXI7XG59O1xudHlwZSBQdXJpT3JkZXJCeUl0ZW08VENvbHVtbiBleHRlbmRzIHN0cmluZz4gPSB7XG4gIGNvbHVtbjogVENvbHVtbiB8IFB1cmlPcmRlckJ5RXhwcmVzc2lvbjtcbiAgb3JkZXI/OiBQdXJpT3JkZXJCeURpcmVjdGlvbjtcbiAgbnVsbHM/OiBQdXJpT3JkZXJCeU51bGxzO1xufTtcbnR5cGUgUHVyaU9yZGVyQnlFbnRyeTxUQ29sdW1uIGV4dGVuZHMgc3RyaW5nPiA9XG4gIHwgVENvbHVtblxuICB8IFB1cmlPcmRlckJ5RXhwcmVzc2lvblxuICB8IFB1cmlPcmRlckJ5SXRlbTxUQ29sdW1uPjtcbnR5cGUgUHVyaU9yZGVyQnlSdW50aW1lSXRlbSA9IHtcbiAgY29sdW1uOiBzdHJpbmcgfCBQdXJpT3JkZXJCeUV4cHJlc3Npb247XG4gIG9yZGVyPzogUHVyaU9yZGVyQnlEaXJlY3Rpb247XG4gIG51bGxzPzogUHVyaU9yZGVyQnlOdWxscztcbn07XG50eXBlIFB1cmlPcmRlckJ5UnVudGltZUVudHJ5ID0gc3RyaW5nIHwgUHVyaU9yZGVyQnlFeHByZXNzaW9uIHwgUHVyaU9yZGVyQnlSdW50aW1lSXRlbTtcblxudHlwZSBGcm9tUmVnaXN0cmF0aW9uID0ge1xuICBraW5kOiBcImZyb21cIjtcbiAgYWxpYXM6IHN0cmluZztcbiAgdGFibGU6IHN0cmluZyB8IG51bGw7XG59O1xuXG50eXBlIEpvaW5SZWdpc3RyYXRpb24gPSB7XG4gIGtpbmQ6IFwiam9pblwiO1xuICBhbGlhczogc3RyaW5nO1xuICB0YWJsZTogc3RyaW5nIHwgbnVsbDtcbiAgam9pblR5cGU6IFwiam9pblwiIHwgXCJsZWZ0Sm9pblwiO1xuICBsZWZ0OiBzdHJpbmcgfCBudWxsO1xuICByaWdodDogc3RyaW5nIHwgbnVsbDtcbiAgcmV1c2FibGU6IGJvb2xlYW47XG59O1xuXG50eXBlIENvcnJlbGF0aW9uUmVnaXN0cmF0aW9uID0gRnJvbVJlZ2lzdHJhdGlvbiB8IEpvaW5SZWdpc3RyYXRpb247XG5cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZUZ1enp5T3BlcmF0b3Iob3BlcmF0b3I/OiBzdHJpbmcpOiBGdXp6eU9wZXJhdG9yIHtcbiAgY29uc3Qgbm9ybWFsaXplZCA9IG9wZXJhdG9yPy50cmltKCkgPz8gXCI8JVwiO1xuICBjb25zdCBmdXp6eU9wZXJhdG9yID0gRlVaWllfT1BFUkFUT1JTLmZpbmQoKGNhbmRpZGF0ZSkgPT4gY2FuZGlkYXRlID09PSBub3JtYWxpemVkKTtcblxuICBpZiAoIWZ1enp5T3BlcmF0b3IpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgZnV6enkgb3BlcmF0b3I6ICR7b3BlcmF0b3IgPz8gXCJcIn1gKTtcbiAgfVxuXG4gIHJldHVybiBmdXp6eU9wZXJhdG9yO1xufVxuXG5mdW5jdGlvbiBzZXJpYWxpemVKc29uU3VwZXJzZXRWYWx1ZTxWYWx1ZT4odmFsdWU6IFZhbHVlKTogc3RyaW5nIHtcbiAgY29uc3Qgc2VyaWFsaXplZCA9IEpTT04uc3RyaW5naWZ5KHZhbHVlKTtcblxuICBpZiAoc2VyaWFsaXplZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcbiAgICAgIFwiUHVyaSBKU09OQiBjb250YWlubWVudCB2YWx1ZSBtdXN0IGJlIEpTT04tc2VyaWFsaXphYmxlOyBKU09OLnN0cmluZ2lmeSByZXR1cm5lZCB1bmRlZmluZWQuXCIsXG4gICAgKTtcbiAgfVxuXG4gIHJldHVybiBzZXJpYWxpemVkO1xufVxuXG5mdW5jdGlvbiBzZXJpYWxpemVKc29uQ29sdW1uVmFsdWU8VmFsdWU+KFxuICB0YWJsZVNwZWM6IFRhYmxlU3BlYyB8IG51bGwsXG4gIGNvbHVtbjogc3RyaW5nLFxuICB2YWx1ZTogVmFsdWUsXG4pOiBWYWx1ZSB8IHN0cmluZyB7XG4gIGlmICghdGFibGVTcGVjPy5qc29uQ29sdW1ucy5pbmNsdWRlcyhjb2x1bW4pIHx8IHZhbHVlID09PSB1bmRlZmluZWQgfHwgdmFsdWUgPT09IG51bGwpIHtcbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cblxuICByZXR1cm4gSlNPTi5zdHJpbmdpZnkodmFsdWUpO1xufVxuXG5mdW5jdGlvbiBub3JtYWxpemVPcmRlckJ5RGlyZWN0aW9uKGRpcmVjdGlvbjogUHVyaU9yZGVyQnlEaXJlY3Rpb24gPSBcImFzY1wiKTogUHVyaU9yZGVyQnlEaXJlY3Rpb24ge1xuICBpZiAoZGlyZWN0aW9uICE9PSBcImFzY1wiICYmIGRpcmVjdGlvbiAhPT0gXCJkZXNjXCIpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgb3JkZXIgZGlyZWN0aW9uOiAke2RpcmVjdGlvbn1gKTtcbiAgfVxuXG4gIHJldHVybiBkaXJlY3Rpb247XG59XG5cbmZ1bmN0aW9uIG5vcm1hbGl6ZU9yZGVyQnlOdWxscyhudWxscz86IFB1cmlPcmRlckJ5TnVsbHMpOiBQdXJpT3JkZXJCeU51bGxzIHwgdW5kZWZpbmVkIHtcbiAgaWYgKG51bGxzID09PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgaWYgKG51bGxzICE9PSBcImZpcnN0XCIgJiYgbnVsbHMgIT09IFwibGFzdFwiKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIG9yZGVyIG51bGxzOiAke251bGxzfWApO1xuICB9XG5cbiAgcmV0dXJuIG51bGxzO1xufVxuXG5mdW5jdGlvbiBmb3JtYXROdWxsc1N1ZmZpeChudWxscz86IFB1cmlPcmRlckJ5TnVsbHMpOiBzdHJpbmcge1xuICBpZiAoIW51bGxzKSB7XG4gICAgcmV0dXJuIFwiXCI7XG4gIH1cblxuICByZXR1cm4gYCBOVUxMUyAke251bGxzLnRvVXBwZXJDYXNlKCl9YDtcbn1cblxuZnVuY3Rpb24gaXNPcmRlckJ5RW50cmllczxWYWx1ZT4oXG4gIHZhbHVlOiBWYWx1ZSxcbik6IHZhbHVlIGlzIFZhbHVlICYgcmVhZG9ubHkgUHVyaU9yZGVyQnlSdW50aW1lRW50cnlbXSB7XG4gIHJldHVybiBBcnJheS5pc0FycmF5KHZhbHVlKTtcbn1cblxuZnVuY3Rpb24gaXNTcWxFeHByZXNzaW9uPFZhbHVlPih2YWx1ZTogVmFsdWUpOiB2YWx1ZSBpcyBWYWx1ZSAmIEFueVNxbEV4cHJlc3Npb24ge1xuICByZXR1cm4gaXNPYmplY3RWYWx1ZSh2YWx1ZSkgJiYgXCJfdHlwZVwiIGluIHZhbHVlICYmIHZhbHVlW1wiX3R5cGVcIl0gPT09IFwic3FsX2V4cHJlc3Npb25cIjtcbn1cblxuZnVuY3Rpb24gaXNPcmRlckJ5RXhwcmVzc2lvbjxWYWx1ZT4odmFsdWU6IFZhbHVlKTogdmFsdWUgaXMgVmFsdWUgJiBQdXJpT3JkZXJCeUV4cHJlc3Npb24ge1xuICByZXR1cm4gaXNTcWxFeHByZXNzaW9uKHZhbHVlKTtcbn1cblxuZnVuY3Rpb24gaXNOZXN0ZWRTZWxlY3RPYmplY3Q8VFRhYmxlcyBleHRlbmRzIG9iamVjdD4oXG4gIHZhbHVlOiBTZWxlY3RWYWx1ZTxUVGFibGVzPiB8IFNlbGVjdE9iamVjdDxUVGFibGVzPixcbik6IHZhbHVlIGlzIFNlbGVjdE9iamVjdDxUVGFibGVzPiB7XG4gIHJldHVybiBpc09iamVjdFZhbHVlKHZhbHVlKSAmJiAhKFwiX3R5cGVcIiBpbiB2YWx1ZSk7XG59XG5cbmV4cG9ydCBjbGFzcyBQdXJpPFRTY2hlbWEsIFRUYWJsZXMgZXh0ZW5kcyBvYmplY3QsIFRSZXN1bHQ+IHtcbiAgcHJpdmF0ZSBrbmV4UXVlcnk6IEtuZXguUXVlcnlCdWlsZGVyO1xuICBwcml2YXRlIHRhYmxlU3BlYzogVGFibGVTcGVjIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgY29ycmVsYXRpb25SZWdpc3RyeSA9IG5ldyBNYXA8c3RyaW5nLCBDb3JyZWxhdGlvblJlZ2lzdHJhdGlvbj4oKTtcblxuICAvLyDsg53shLHsnpAg7Iuc6re464uI7LKY65OkXG4gIGNvbnN0cnVjdG9yKGtuZXg6IEtuZXgsIHRhYmxlTmFtZTogc3RyaW5nKTtcbiAgY29uc3RydWN0b3Ioa25leDogS25leCwgdGFibGVTb3VyY2U6IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IFB1cmk8VFNjaGVtYSwgYW55LCBhbnk+Pik7XG4gIGNvbnN0cnVjdG9yKFxuICAgIHB1YmxpYyBrbmV4OiBLbmV4LFxuICAgIHRhYmxlTmFtZU9yU291cmNlOiBhbnksXG4gICkge1xuICAgIGlmIChpc1N0cmluZ1ZhbHVlKHRhYmxlTmFtZU9yU291cmNlKSkge1xuICAgICAgLy8gQ2FzZTogbmV3IFB1cmkoa25leCwgXCJ1c2Vyc1wiKVxuICAgICAgdGhpcy5rbmV4UXVlcnkgPSB0aGlzLmtuZXgodGFibGVOYW1lT3JTb3VyY2UpLmZyb20odGFibGVOYW1lT3JTb3VyY2UpO1xuICAgICAgdGhpcy50YWJsZVNwZWMgPSB0aGlzLnNhZmVHZXRUYWJsZVNwZWModGFibGVOYW1lT3JTb3VyY2UpO1xuICAgICAgdGhpcy5jb3JyZWxhdGlvblJlZ2lzdHJ5LnNldCh0YWJsZU5hbWVPclNvdXJjZSwge1xuICAgICAgICBraW5kOiBcImZyb21cIixcbiAgICAgICAgYWxpYXM6IHRhYmxlTmFtZU9yU291cmNlLFxuICAgICAgICB0YWJsZTogdGFibGVOYW1lT3JTb3VyY2UsXG4gICAgICB9KTtcbiAgICB9IGVsc2UgaWYgKGlzT2JqZWN0VmFsdWUodGFibGVOYW1lT3JTb3VyY2UpKSB7XG4gICAgICBjb25zdCBlbnRyaWVzID0gT2JqZWN0LmVudHJpZXModGFibGVOYW1lT3JTb3VyY2UpO1xuICAgICAgaWYgKGVudHJpZXMubGVuZ3RoICE9PSAxKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIlRhYmxlIHNwZWMgbXVzdCBoYXZlIGV4YWN0bHkgb25lIGVudHJ5XCIpO1xuICAgICAgfVxuICAgICAgYXNzZXJ0KGVudHJpZXNbMF0pO1xuICAgICAgY29uc3QgW2FsaWFzLCBzb3VyY2VdID0gZW50cmllc1swXTtcbiAgICAgIGlmIChpc1N0cmluZ1ZhbHVlKHNvdXJjZSkpIHtcbiAgICAgICAgdGhpcy5rbmV4UXVlcnkgPSB0aGlzLmtuZXgoc291cmNlKS5mcm9tKHsgW2FsaWFzXTogc291cmNlIH0pO1xuICAgICAgICB0aGlzLnRhYmxlU3BlYyA9IHRoaXMuc2FmZUdldFRhYmxlU3BlYyhzb3VyY2UpO1xuICAgICAgICB0aGlzLmNvcnJlbGF0aW9uUmVnaXN0cnkuc2V0KGFsaWFzLCB7IGtpbmQ6IFwiZnJvbVwiLCBhbGlhcywgdGFibGU6IHNvdXJjZSB9KTtcbiAgICAgIH0gZWxzZSBpZiAoc291cmNlIGluc3RhbmNlb2YgUHVyaSkge1xuICAgICAgICBjb25zdCBzdWJxdWVyeUJ1aWxkZXIgPSBzb3VyY2UucmF3UXVlcnkoKTtcbiAgICAgICAgdGhpcy5rbmV4UXVlcnkgPSB0aGlzLmtuZXguZnJvbShzdWJxdWVyeUJ1aWxkZXIuYXMoYWxpYXMpKTtcbiAgICAgICAgdGhpcy5jb3JyZWxhdGlvblJlZ2lzdHJ5LnNldChhbGlhcywgeyBraW5kOiBcImZyb21cIiwgYWxpYXMsIHRhYmxlOiBudWxsIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiSW52YWxpZCB0YWJsZSBzcGVjaWZpY2F0aW9uXCIpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIHRhYmxlIHNwZWNpZmljYXRpb25cIik7XG4gICAgfVxuICB9XG5cbiAgc2FmZUdldFRhYmxlU3BlYyh0YWJsZU5hbWU6IHN0cmluZyk6IFRhYmxlU3BlYyB8IG51bGwge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gRW50aXR5TWFuYWdlci5nZXRUYWJsZVNwZWModGFibGVOYW1lKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgfVxuXG4gIC8vIFN0YXRpYyBTUUwgaGVscGVyIGZ1bmN0aW9ucyBmb3IgU0VMRUNUXG4gIHN0YXRpYyBjb3VudChjb2x1bW46IHN0cmluZyA9IFwiKlwiKTogU3FsRXhwcmVzc2lvbjxcIm51bWJlclwiPiB7XG4gICAgcmV0dXJuIHtcbiAgICAgIF90eXBlOiBcInNxbF9leHByZXNzaW9uXCIsXG4gICAgICBfcmV0dXJuOiBcIm51bWJlclwiLFxuICAgICAgX3NxbDogYENPVU5UKD8/KTo6aW50ZWdlcmAsXG4gICAgICBfcGFyYW1zOiBbY29sdW1uXSxcbiAgICB9O1xuICB9XG4gIHN0YXRpYyBzdW0oY29sdW1uOiBzdHJpbmcpOiBTcWxFeHByZXNzaW9uPFwibnVtYmVyXCI+IHtcbiAgICByZXR1cm4ge1xuICAgICAgX3R5cGU6IFwic3FsX2V4cHJlc3Npb25cIixcbiAgICAgIF9yZXR1cm46IFwibnVtYmVyXCIsXG4gICAgICBfc3FsOiBgU1VNKD8/KWAsXG4gICAgICBfcGFyYW1zOiBbY29sdW1uXSxcbiAgICB9O1xuICB9XG4gIHN0YXRpYyBhdmcoY29sdW1uOiBzdHJpbmcpOiBTcWxFeHByZXNzaW9uPFwibnVtYmVyXCI+IHtcbiAgICByZXR1cm4ge1xuICAgICAgX3R5cGU6IFwic3FsX2V4cHJlc3Npb25cIixcbiAgICAgIF9yZXR1cm46IFwibnVtYmVyXCIsXG4gICAgICBfc3FsOiBgQVZHKD8/KWAsXG4gICAgICBfcGFyYW1zOiBbY29sdW1uXSxcbiAgICB9O1xuICB9XG4gIHN0YXRpYyBtYXgoY29sdW1uOiBzdHJpbmcpOiBTcWxFeHByZXNzaW9uPFwibnVtYmVyXCI+IHtcbiAgICByZXR1cm4ge1xuICAgICAgX3R5cGU6IFwic3FsX2V4cHJlc3Npb25cIixcbiAgICAgIF9yZXR1cm46IFwibnVtYmVyXCIsXG4gICAgICBfc3FsOiBgTUFYKD8/KWAsXG4gICAgICBfcGFyYW1zOiBbY29sdW1uXSxcbiAgICB9O1xuICB9XG4gIHN0YXRpYyBtaW4oY29sdW1uOiBzdHJpbmcpOiBTcWxFeHByZXNzaW9uPFwibnVtYmVyXCI+IHtcbiAgICByZXR1cm4ge1xuICAgICAgX3R5cGU6IFwic3FsX2V4cHJlc3Npb25cIixcbiAgICAgIF9yZXR1cm46IFwibnVtYmVyXCIsXG4gICAgICBfc3FsOiBgTUlOKD8/KWAsXG4gICAgICBfcGFyYW1zOiBbY29sdW1uXSxcbiAgICB9O1xuICB9XG4gIHN0YXRpYyBjb25jYXQoLi4uYXJnczogc3RyaW5nW10pOiBTcWxFeHByZXNzaW9uPFwic3RyaW5nXCI+IHtcbiAgICByZXR1cm4ge1xuICAgICAgX3R5cGU6IFwic3FsX2V4cHJlc3Npb25cIixcbiAgICAgIF9yZXR1cm46IFwic3RyaW5nXCIsXG4gICAgICBfc3FsOiBgQ09OQ0FUKCR7YXJncy5tYXAoKCkgPT4gXCI/XCIpLmpvaW4oXCIsIFwiKX0pYCxcbiAgICAgIF9wYXJhbXM6IGFyZ3MsXG4gICAgfTtcbiAgfVxuICBzdGF0aWMgY29hbGVzY2UoZXhwcmVzc2lvbjogU3RyaW5nU3FsRXhwcmVzc2lvbiwgZmFsbGJhY2s6IHN0cmluZyk6IFNxbEV4cHJlc3Npb248XCJzdHJpbmdcIj4ge1xuICAgIHJldHVybiB7XG4gICAgICBfdHlwZTogXCJzcWxfZXhwcmVzc2lvblwiLFxuICAgICAgX3JldHVybjogXCJzdHJpbmdcIixcbiAgICAgIF9zcWw6IGBDT0FMRVNDRSgke2V4cHJlc3Npb24uX3NxbH0sID8pYCxcbiAgICAgIF9wYXJhbXM6IFsuLi5leHByZXNzaW9uLl9wYXJhbXMsIGZhbGxiYWNrXSxcbiAgICB9O1xuICB9XG4gIHN0YXRpYyBjb25jYXRFeHByZXNzaW9ucyguLi5hcmdzOiAoc3RyaW5nIHwgU3RyaW5nU3FsRXhwcmVzc2lvbilbXSk6IFNxbEV4cHJlc3Npb248XCJzdHJpbmdcIj4ge1xuICAgIHJldHVybiB7XG4gICAgICBfdHlwZTogXCJzcWxfZXhwcmVzc2lvblwiLFxuICAgICAgX3JldHVybjogXCJzdHJpbmdcIixcbiAgICAgIF9zcWw6IGBDT05DQVQoJHthcmdzLm1hcCgoYXJnKSA9PiAoaXNTdHJpbmdWYWx1ZShhcmcpID8gXCI/Ojp0ZXh0XCIgOiBhcmcuX3NxbCkpLmpvaW4oXCIsIFwiKX0pYCxcbiAgICAgIF9wYXJhbXM6IGFyZ3MuZmxhdE1hcCgoYXJnKSA9PiAoaXNTdHJpbmdWYWx1ZShhcmcpID8gW2FyZ10gOiBhcmcuX3BhcmFtcykpLFxuICAgIH07XG4gIH1cbiAgc3RhdGljIHVwcGVyKGNvbHVtbjogc3RyaW5nKTogU3FsRXhwcmVzc2lvbjxcInN0cmluZ1wiPiB7XG4gICAgcmV0dXJuIHtcbiAgICAgIF90eXBlOiBcInNxbF9leHByZXNzaW9uXCIsXG4gICAgICBfcmV0dXJuOiBcInN0cmluZ1wiLFxuICAgICAgX3NxbDogXCJVUFBFUig/PylcIixcbiAgICAgIF9wYXJhbXM6IFtjb2x1bW5dLFxuICAgIH07XG4gIH1cbiAgc3RhdGljIGxvd2VyKGNvbHVtbjogc3RyaW5nKTogU3FsRXhwcmVzc2lvbjxcInN0cmluZ1wiPiB7XG4gICAgcmV0dXJuIHtcbiAgICAgIF90eXBlOiBcInNxbF9leHByZXNzaW9uXCIsXG4gICAgICBfcmV0dXJuOiBcInN0cmluZ1wiLFxuICAgICAgX3NxbDogXCJMT1dFUig/PylcIixcbiAgICAgIF9wYXJhbXM6IFtjb2x1bW5dLFxuICAgIH07XG4gIH1cblxuICBzdGF0aWMgd29yZFNpbWlsYXJpdHkoY29sdW1uOiBzdHJpbmcsIHF1ZXJ5OiBzdHJpbmcpOiBTcWxFeHByZXNzaW9uPFwibnVtYmVyXCI+O1xuICBzdGF0aWMgd29yZFNpbWlsYXJpdHk8VE51bGxhYmxlIGV4dGVuZHMgYm9vbGVhbj4oXG4gICAgY29sdW1uOiBTdHJpbmdTcWxFeHByZXNzaW9uPFROdWxsYWJsZT4sXG4gICAgcXVlcnk6IHN0cmluZyxcbiAgKTogU3FsRXhwcmVzc2lvbjxcIm51bWJlclwiLCBUTnVsbGFibGU+O1xuICBzdGF0aWMgd29yZFNpbWlsYXJpdHkoXG4gICAgY29sdW1uOiBzdHJpbmcgfCBTdHJpbmdTcWxFeHByZXNzaW9uLFxuICAgIHF1ZXJ5OiBzdHJpbmcsXG4gICk6IFNxbEV4cHJlc3Npb248XCJudW1iZXJcIiwgYm9vbGVhbj4ge1xuICAgIGlmIChpc1N0cmluZ1ZhbHVlKGNvbHVtbikpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIF90eXBlOiBcInNxbF9leHByZXNzaW9uXCIsXG4gICAgICAgIF9yZXR1cm46IFwibnVtYmVyXCIsXG4gICAgICAgIF9zcWw6IFwid29yZF9zaW1pbGFyaXR5KD8sID8/KVwiLFxuICAgICAgICBfcGFyYW1zOiBbcXVlcnksIGNvbHVtbl0sXG4gICAgICB9O1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBfdHlwZTogXCJzcWxfZXhwcmVzc2lvblwiLFxuICAgICAgX3JldHVybjogXCJudW1iZXJcIixcbiAgICAgIF9zcWw6IGB3b3JkX3NpbWlsYXJpdHkoPywgJHtjb2x1bW5bXCJfc3FsXCJdfSlgLFxuICAgICAgX3BhcmFtczogW3F1ZXJ5LCAuLi5jb2x1bW5bXCJfcGFyYW1zXCJdXSxcbiAgICB9O1xuICB9XG5cbiAgc3RhdGljIHNpbWlsYXJpdHkoY29sdW1uOiBzdHJpbmcsIHF1ZXJ5OiBzdHJpbmcpOiBTcWxFeHByZXNzaW9uPFwibnVtYmVyXCI+O1xuICBzdGF0aWMgc2ltaWxhcml0eTxUTnVsbGFibGUgZXh0ZW5kcyBib29sZWFuPihcbiAgICBjb2x1bW46IFN0cmluZ1NxbEV4cHJlc3Npb248VE51bGxhYmxlPixcbiAgICBxdWVyeTogc3RyaW5nLFxuICApOiBTcWxFeHByZXNzaW9uPFwibnVtYmVyXCIsIFROdWxsYWJsZT47XG4gIHN0YXRpYyBzaW1pbGFyaXR5KFxuICAgIGNvbHVtbjogc3RyaW5nIHwgU3RyaW5nU3FsRXhwcmVzc2lvbixcbiAgICBxdWVyeTogc3RyaW5nLFxuICApOiBTcWxFeHByZXNzaW9uPFwibnVtYmVyXCIsIGJvb2xlYW4+IHtcbiAgICBpZiAoaXNTdHJpbmdWYWx1ZShjb2x1bW4pKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBfdHlwZTogXCJzcWxfZXhwcmVzc2lvblwiLFxuICAgICAgICBfcmV0dXJuOiBcIm51bWJlclwiLFxuICAgICAgICBfc3FsOiBcInNpbWlsYXJpdHkoPz8sID8pXCIsXG4gICAgICAgIF9wYXJhbXM6IFtjb2x1bW4sIHF1ZXJ5XSxcbiAgICAgIH07XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIF90eXBlOiBcInNxbF9leHByZXNzaW9uXCIsXG4gICAgICBfcmV0dXJuOiBcIm51bWJlclwiLFxuICAgICAgX3NxbDogYHNpbWlsYXJpdHkoJHtjb2x1bW5bXCJfc3FsXCJdfSwgPylgLFxuICAgICAgX3BhcmFtczogWy4uLmNvbHVtbltcIl9wYXJhbXNcIl0sIHF1ZXJ5XSxcbiAgICB9O1xuICB9XG5cbiAgc3RhdGljIHN0cmljdFdvcmRTaW1pbGFyaXR5KGNvbHVtbjogc3RyaW5nLCBxdWVyeTogc3RyaW5nKTogU3FsRXhwcmVzc2lvbjxcIm51bWJlclwiPjtcbiAgc3RhdGljIHN0cmljdFdvcmRTaW1pbGFyaXR5PFROdWxsYWJsZSBleHRlbmRzIGJvb2xlYW4+KFxuICAgIGNvbHVtbjogU3RyaW5nU3FsRXhwcmVzc2lvbjxUTnVsbGFibGU+LFxuICAgIHF1ZXJ5OiBzdHJpbmcsXG4gICk6IFNxbEV4cHJlc3Npb248XCJudW1iZXJcIiwgVE51bGxhYmxlPjtcbiAgc3RhdGljIHN0cmljdFdvcmRTaW1pbGFyaXR5KFxuICAgIGNvbHVtbjogc3RyaW5nIHwgU3RyaW5nU3FsRXhwcmVzc2lvbixcbiAgICBxdWVyeTogc3RyaW5nLFxuICApOiBTcWxFeHByZXNzaW9uPFwibnVtYmVyXCIsIGJvb2xlYW4+IHtcbiAgICBpZiAoaXNTdHJpbmdWYWx1ZShjb2x1bW4pKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBfdHlwZTogXCJzcWxfZXhwcmVzc2lvblwiLFxuICAgICAgICBfcmV0dXJuOiBcIm51bWJlclwiLFxuICAgICAgICBfc3FsOiBgc3RyaWN0X3dvcmRfc2ltaWxhcml0eSg/LCA/PylgLFxuICAgICAgICBfcGFyYW1zOiBbcXVlcnksIGNvbHVtbl0sXG4gICAgICB9O1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBfdHlwZTogXCJzcWxfZXhwcmVzc2lvblwiLFxuICAgICAgX3JldHVybjogXCJudW1iZXJcIixcbiAgICAgIF9zcWw6IGBzdHJpY3Rfd29yZF9zaW1pbGFyaXR5KD8sICR7Y29sdW1uW1wiX3NxbFwiXX0pYCxcbiAgICAgIF9wYXJhbXM6IFtxdWVyeSwgLi4uY29sdW1uW1wiX3BhcmFtc1wiXV0sXG4gICAgfTtcbiAgfVxuXG4gIC8vIFJhdyBmdW5jdGlvbnMgZm9yIFNFTEVDVFxuICBzdGF0aWMgcmF3U3RyaW5nKHNxbDogc3RyaW5nLCBwYXJhbXM6IEtuZXguUmF3QmluZGluZ1tdID0gW10pOiBTcWxFeHByZXNzaW9uPFwic3RyaW5nXCI+IHtcbiAgICByZXR1cm4geyBfdHlwZTogXCJzcWxfZXhwcmVzc2lvblwiLCBfcmV0dXJuOiBcInN0cmluZ1wiLCBfc3FsOiBzcWwsIF9wYXJhbXM6IHBhcmFtcyB9O1xuICB9XG5cbiAgc3RhdGljIHJhd1N0cmluZ0FycmF5KHNxbDogc3RyaW5nLCBwYXJhbXM6IEtuZXguUmF3QmluZGluZ1tdID0gW10pOiBTcWxFeHByZXNzaW9uPFwic3RyaW5nW11cIj4ge1xuICAgIHJldHVybiB7IF90eXBlOiBcInNxbF9leHByZXNzaW9uXCIsIF9yZXR1cm46IFwic3RyaW5nW11cIiwgX3NxbDogc3FsLCBfcGFyYW1zOiBwYXJhbXMgfTtcbiAgfVxuXG4gIHN0YXRpYyByYXdOdW1iZXIoc3FsOiBzdHJpbmcsIHBhcmFtczogS25leC5SYXdCaW5kaW5nW10gPSBbXSk6IFNxbEV4cHJlc3Npb248XCJudW1iZXJcIj4ge1xuICAgIHJldHVybiB7IF90eXBlOiBcInNxbF9leHByZXNzaW9uXCIsIF9yZXR1cm46IFwibnVtYmVyXCIsIF9zcWw6IHNxbCwgX3BhcmFtczogcGFyYW1zIH07XG4gIH1cblxuICBzdGF0aWMgcmF3Qm9vbGVhbihzcWw6IHN0cmluZywgcGFyYW1zOiBLbmV4LlJhd0JpbmRpbmdbXSA9IFtdKTogU3FsRXhwcmVzc2lvbjxcImJvb2xlYW5cIj4ge1xuICAgIHJldHVybiB7IF90eXBlOiBcInNxbF9leHByZXNzaW9uXCIsIF9yZXR1cm46IFwiYm9vbGVhblwiLCBfc3FsOiBzcWwsIF9wYXJhbXM6IHBhcmFtcyB9O1xuICB9XG5cbiAgc3RhdGljIHJhd0RhdGUoc3FsOiBzdHJpbmcsIHBhcmFtczogS25leC5SYXdCaW5kaW5nW10gPSBbXSk6IFNxbEV4cHJlc3Npb248XCJkYXRlXCI+IHtcbiAgICByZXR1cm4geyBfdHlwZTogXCJzcWxfZXhwcmVzc2lvblwiLCBfcmV0dXJuOiBcImRhdGVcIiwgX3NxbDogc3FsLCBfcGFyYW1zOiBwYXJhbXMgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGVFMg6rKA7IOJ7Ja0IO2VmOydtOudvOydtO2MhVxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiAuc2VsZWN0KHtcbiAgICogICB0aXRsZTogUHVyaS5oaWdobGlnaHQoXCJwb3N0cy50aXRsZVwiLCBzZWFyY2gpLFxuICAgKiAgIGNvbnRlbnQ6IFB1cmkuaGlnaGxpZ2h0KFwicG9zdHMuY29udGVudFwiLCBzZWFyY2gsIHtcbiAgICogICAgIHN0YXJ0U2VsOiBcIjxtYXJrPlwiLFxuICAgKiAgICAgc3RvcFNlbDogXCI8L21hcms+XCIsXG4gICAqICAgICBtYXhGcmFnbWVudHM6IDMsXG4gICAqICAgfSksXG4gICAqIH0pXG4gICAqL1xuICBzdGF0aWMgdHNIaWdobGlnaHQoXG4gICAgY29sdW1uOiBzdHJpbmcsXG4gICAgcXVlcnk6IHN0cmluZyxcbiAgICBfb3B0aW9ucz86IFRzSGlnaGxpZ2h0T3B0aW9ucyxcbiAgKTogU3FsRXhwcmVzc2lvbjxcInN0cmluZ1wiPiB7XG4gICAgY29uc3QgeyBwYXJzZXIgPSBcIndlYnNlYXJjaF90b190c3F1ZXJ5XCIsIGNvbmZpZyA9IFwic2ltcGxlXCIsIC4uLm9wdGlvbnMgfSA9IF9vcHRpb25zID8/IHt9O1xuXG4gICAgY29uc3QgaGxPcHRpb25QYXJ0cyA9IE9iamVjdC5lbnRyaWVzKG9wdGlvbnMpLm1hcCgoW2tleSwgdmFsdWVdKSA9PiB7XG4gICAgICByZXR1cm4gYCR7aW5mbGVjdGlvbi5jYW1lbGl6ZShrZXkpfT0ke3ZhbHVlfWA7XG4gICAgfSk7XG5cbiAgICBjb25zdCBobE9wdGlvbnMgPSBobE9wdGlvblBhcnRzLmxlbmd0aCA+IDAgPyBgLCAnJHtobE9wdGlvblBhcnRzLmpvaW4oXCIsIFwiKX0nYCA6IFwiXCI7XG5cbiAgICByZXR1cm4ge1xuICAgICAgX3R5cGU6IFwic3FsX2V4cHJlc3Npb25cIixcbiAgICAgIF9yZXR1cm46IFwic3RyaW5nXCIsXG4gICAgICBfc3FsOiBgdHNfaGVhZGxpbmUoPywgPz8sICR7cGFyc2VyfSg/LCA/KSR7aGxPcHRpb25zfSlgLFxuICAgICAgX3BhcmFtczogW2NvbmZpZywgY29sdW1uLCBjb25maWcsIHF1ZXJ5XSxcbiAgICB9O1xuICB9XG5cbiAgLy8gdHNfcmFua1xuICBzdGF0aWMgdHNSYW5rKFxuICAgIGNvbHVtbjogc3RyaW5nIHwgU3FsRXhwcmVzc2lvbjxcInRzdmVjdG9yXCI+LFxuICAgIHF1ZXJ5OiBzdHJpbmcsXG4gICAgb3B0aW9ucz86IFRzUmFua09wdGlvbnMsXG4gICk6IFNxbEV4cHJlc3Npb248XCJudW1iZXJcIj4ge1xuICAgIHJldHVybiBQdXJpW1wiX3RzUmFua1wiXShcInRzX3JhbmtcIiwgY29sdW1uLCBxdWVyeSwgb3B0aW9ucyk7XG4gIH1cblxuICAvLyB0c19yYW5rX2NkXG4gIHN0YXRpYyB0c1JhbmtDZChcbiAgICBjb2x1bW46IHN0cmluZyB8IFNxbEV4cHJlc3Npb248XCJ0c3ZlY3RvclwiPixcbiAgICBxdWVyeTogc3RyaW5nLFxuICAgIG9wdGlvbnM/OiBUc1JhbmtPcHRpb25zLFxuICApOiBTcWxFeHByZXNzaW9uPFwibnVtYmVyXCI+IHtcbiAgICByZXR1cm4gUHVyaVtcIl90c1JhbmtcIl0oXCJ0c19yYW5rX2NkXCIsIGNvbHVtbiwgcXVlcnksIG9wdGlvbnMpO1xuICB9XG5cbiAgc3RhdGljIHRvVHNWZWN0b3IoY29sdW1uOiBzdHJpbmcsIGNvbmZpZzogc3RyaW5nID0gXCJzaW1wbGVcIik6IFNxbEV4cHJlc3Npb248XCJ0c3ZlY3RvclwiPiB7XG4gICAgcmV0dXJuIHtcbiAgICAgIF90eXBlOiBcInNxbF9leHByZXNzaW9uXCIsXG4gICAgICBfcmV0dXJuOiBcInRzdmVjdG9yXCIsXG4gICAgICBfc3FsOiBgdG9fdHN2ZWN0b3IoPywgPz8pYCxcbiAgICAgIF9wYXJhbXM6IFtjb25maWcsIGNvbHVtbl0sXG4gICAgfTtcbiAgfVxuXG4gIHN0YXRpYyBfdHNSYW5rKFxuICAgIHR5cGU6IFwidHNfcmFua1wiIHwgXCJ0c19yYW5rX2NkXCIsXG4gICAgY29sdW1uOiBzdHJpbmcgfCBTcWxFeHByZXNzaW9uPFwidHN2ZWN0b3JcIj4sXG4gICAgcXVlcnk6IHN0cmluZyxcbiAgICBvcHRpb25zPzogVHNSYW5rT3B0aW9ucyxcbiAgKTogU3FsRXhwcmVzc2lvbjxcIm51bWJlclwiPiB7XG4gICAgY29uc3Qge1xuICAgICAgcGFyc2VyID0gXCJ3ZWJzZWFyY2hfdG9fdHNxdWVyeVwiLFxuICAgICAgY29uZmlnID0gXCJzaW1wbGVcIixcbiAgICAgIG5vcm1hbGl6YXRpb24sXG4gICAgICB3ZWlnaHRzLFxuICAgIH0gPSBvcHRpb25zID8/IHt9O1xuXG4gICAgY29uc3QgcGFyYW1zID0gW107XG4gICAgbGV0IHNxbFRlbXBsYXRlID0gYCR7dHlwZX0oYDtcblxuICAgIGlmICh3ZWlnaHRzKSB7XG4gICAgICBzcWxUZW1wbGF0ZSArPSBgQVJSQVlbJHt3ZWlnaHRzLm1hcCgoKSA9PiBcIj9cIikuam9pbihcIiwgXCIpfV06OmZsb2F0NFtdLCBgO1xuICAgICAgcGFyYW1zLnB1c2goLi4ud2VpZ2h0cyk7XG4gICAgfVxuXG4gICAgaWYgKGlzU3RyaW5nVmFsdWUoY29sdW1uKSkge1xuICAgICAgc3FsVGVtcGxhdGUgKz0gYD8/LCAke3BhcnNlcn0oPywgPylgO1xuICAgICAgcGFyYW1zLnB1c2goY29sdW1uLCBjb25maWcsIHF1ZXJ5KTtcbiAgICB9IGVsc2Uge1xuICAgICAgc3FsVGVtcGxhdGUgKz0gYCR7Y29sdW1uW1wiX3NxbFwiXX0sICR7cGFyc2VyfSg/LCA/KWA7XG4gICAgICBwYXJhbXMucHVzaCguLi5jb2x1bW5bXCJfcGFyYW1zXCJdLCBjb25maWcsIHF1ZXJ5KTtcbiAgICB9XG5cbiAgICBpZiAobm9ybWFsaXphdGlvbikge1xuICAgICAgc3FsVGVtcGxhdGUgKz0gXCIsID9cIjtcbiAgICAgIHBhcmFtcy5wdXNoKG5vcm1hbGl6YXRpb24pO1xuICAgIH1cblxuICAgIHNxbFRlbXBsYXRlICs9IFwiKVwiO1xuXG4gICAgcmV0dXJuIHsgX3R5cGU6IFwic3FsX2V4cHJlc3Npb25cIiwgX3JldHVybjogXCJudW1iZXJcIiwgX3NxbDogc3FsVGVtcGxhdGUsIF9wYXJhbXM6IHBhcmFtcyB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFBHcm9vbmdhIEZ1bGxUZXh0IOyduOuNseyKpCDqsoDsg4kg7KCQ7IiYXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIC5zZWxlY3Qoe1xuICAgKiAgIHNjb3JlOiBQdXJpLnNjb3JlKCksXG4gICAqIH0pXG4gICAqL1xuICBzdGF0aWMgc2NvcmUoKTogU3FsRXhwcmVzc2lvbjxcIm51bWJlclwiPiB7XG4gICAgcmV0dXJuIFB1cmkucmF3TnVtYmVyKFwicGdyb29uZ2Ffc2NvcmUodGFibGVvaWQsIGN0aWQpXCIpO1xuICB9XG5cbiAgLyoqXG4gICAqIFBHcm9vbmdhIEZ1bGxUZXh0IOyduOuNseyKpCDqsoDsg4kg7ZWY7J2065287J207YyFXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIC5zZWxlY3Qoe1xuICAgKiAgIHRpdGxlOiBQdXJpLmhpZ2hsaWdodChcInBvc3RzLnRpdGxlXCIsIHNlYXJjaCksXG4gICAqIH0pXG4gICAqL1xuICBzdGF0aWMgaGlnaGxpZ2h0KGNvbHVtbjogc3RyaW5nLCBxdWVyeTogc3RyaW5nIHwgc3RyaW5nW10pOiBTcWxFeHByZXNzaW9uPFwic3RyaW5nXCI+O1xuICBzdGF0aWMgaGlnaGxpZ2h0KGNvbHVtbnM6IHN0cmluZ1tdLCBxdWVyeTogc3RyaW5nIHwgc3RyaW5nW10pOiBTcWxFeHByZXNzaW9uPFwic3RyaW5nW11cIj47XG5cbiAgc3RhdGljIGhpZ2hsaWdodChcbiAgICBjb2x1bW5PckNvbHVtbnM6IHN0cmluZyB8IHN0cmluZ1tdLFxuICAgIHF1ZXJ5OiBzdHJpbmcgfCBzdHJpbmdbXSxcbiAgKTogU3FsRXhwcmVzc2lvbjxcInN0cmluZ1wiPiB8IFNxbEV4cHJlc3Npb248XCJzdHJpbmdbXVwiPiB7XG4gICAgY29uc3QgcXVlcnlBcnIgPSBBcnJheS5pc0FycmF5KHF1ZXJ5KSA/IHF1ZXJ5IDogW3F1ZXJ5XTtcbiAgICBjb25zdCBxdWVyeUNsYXVzZSA9IGBBUlJBWVske3F1ZXJ5QXJyLm1hcCgoKSA9PiBcIj9cIikuam9pbihcIiwgXCIpfV1gO1xuXG4gICAgLy8g64uo7J28IOy7rOufvOyduCDqsr3smrBcbiAgICBpZiAoaXNTdHJpbmdWYWx1ZShjb2x1bW5PckNvbHVtbnMpKSB7XG4gICAgICByZXR1cm4gUHVyaS5yYXdTdHJpbmcoYHBncm9vbmdhX2hpZ2hsaWdodF9odG1sKD8/LCAke3F1ZXJ5Q2xhdXNlfSlgLCBbXG4gICAgICAgIGNvbHVtbk9yQ29sdW1ucyxcbiAgICAgICAgLi4ucXVlcnlBcnIsXG4gICAgICBdKTtcbiAgICB9XG5cbiAgICAvLyDsu6zrn7wg67Cw7Je07J24IOqyveyasFxuICAgIHJldHVybiBQdXJpLnJhd1N0cmluZ0FycmF5KFxuICAgICAgYHBncm9vbmdhX2hpZ2hsaWdodF9odG1sKEFSUkFZWyR7Y29sdW1uT3JDb2x1bW5zLm1hcCgoKSA9PiBcIj8/XCIpLmpvaW4oXCIsIFwiKX1dLCAke3F1ZXJ5Q2xhdXNlfSlgLFxuICAgICAgWy4uLmNvbHVtbk9yQ29sdW1ucywgLi4ucXVlcnlBcnJdLFxuICAgICk7XG4gIH1cblxuICBqc29uVGV4dChcbiAgICBjb2x1bW46IEpzb25Db2x1bW5zPFRUYWJsZXM+LFxuICAgIC4uLnBhdGg6IFtzdHJpbmcsIC4uLnN0cmluZ1tdXVxuICApOiBTcWxFeHByZXNzaW9uPFwic3RyaW5nXCIsIHRydWU+IHtcbiAgICByZXR1cm4ge1xuICAgICAgX3R5cGU6IFwic3FsX2V4cHJlc3Npb25cIixcbiAgICAgIF9yZXR1cm46IFwic3RyaW5nXCIsXG4gICAgICBfc3FsOiBgPz8gIz4+IEFSUkFZWyR7cGF0aC5tYXAoKCkgPT4gXCI/XCIpLmpvaW4oXCIsIFwiKX1dYCxcbiAgICAgIF9wYXJhbXM6IFtjb2x1bW4sIC4uLnBhdGhdLFxuICAgIH07XG4gIH1cblxuICAvLyBTRUxFQ1QgKG92ZXJ3cml0ZSlcbiAgc2VsZWN0PFRTZWxlY3QgZXh0ZW5kcyBTdHJpbmdFeHByZXNzaW9uU2VsZWN0PihcbiAgICBzZWxlY3RPYmo6IFRTZWxlY3QsXG4gICk6IFB1cmk8VFNjaGVtYSwgVFRhYmxlcywgU3RyaW5nRXhwcmVzc2lvblNlbGVjdFJlc3VsdDxUU2VsZWN0Pj47XG4gIHNlbGVjdDxUU2VsZWN0IGV4dGVuZHMgU2VsZWN0T2JqZWN0PFRUYWJsZXM+PihcbiAgICBzZWxlY3RPYmo6IFRTZWxlY3QsXG4gICk6IFB1cmk8VFNjaGVtYSwgVFRhYmxlcywgUGFyc2VTZWxlY3RPYmplY3Q8VFRhYmxlcywgVFNlbGVjdD4+O1xuICBzZWxlY3Qoc2VsZWN0T2JqOiBTZWxlY3RPYmplY3Q8VFRhYmxlcz4pOiBQdXJpPFRTY2hlbWEsIFRUYWJsZXMsIGFueT4ge1xuICAgIC8vIOykkeyyqSDqsJ3ssrTrpbwgZmxhdO2VmOqyjCDrs4DtmZhcbiAgICBjb25zdCBmbGF0U2VsZWN0ID0gdGhpcy5mbGF0dGVuU2VsZWN0KHNlbGVjdE9iaik7XG5cbiAgICBjb25zdCBzZWxlY3RDbGF1c2VzOiAoc3RyaW5nIHwgS25leC5SYXcpW10gPSBbXTtcblxuICAgIGZvciAoY29uc3QgW2FsaWFzLCBjb2x1bW5PckZ1bmN0aW9uXSBvZiBPYmplY3QuZW50cmllcyhmbGF0U2VsZWN0KSkge1xuICAgICAgaWYgKGlzU3FsRXhwcmVzc2lvbihjb2x1bW5PckZ1bmN0aW9uKSkge1xuICAgICAgICAvLyBTUUwg7ZWo7IiY7J24IOqyveyasFxuICAgICAgICBzZWxlY3RDbGF1c2VzLnB1c2goXG4gICAgICAgICAgdGhpcy5rbmV4LnJhdyhgJHtjb2x1bW5PckZ1bmN0aW9uW1wiX3NxbFwiXX0gQVMgXCIke2FsaWFzfVwiYCwgY29sdW1uT3JGdW5jdGlvbltcIl9wYXJhbXNcIl0pLFxuICAgICAgICApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8g7J2867CYIOy7rOufvOyduCDqsr3smrBcbiAgICAgICAgLy8gU0FGRVRZOiDsv7zrpqwg67mM642U7J2YIOygnOuEpOumrSDqs4Tslb3qs7wg7ISg7ZaJIOqygOymneydtCDsnbQg7YOA7J6F7J2EIOuztOyepe2VqeuLiOuLpC5cbiAgICAgICAgY29uc3QgY29sdW1uUGF0aCA9IGNvbHVtbk9yRnVuY3Rpb24gYXMgc3RyaW5nO1xuICAgICAgICBpZiAoYWxpYXMgPT09IGNvbHVtblBhdGgpIHtcbiAgICAgICAgICAvLyBhbGlhc+yZgCDsu6zrn7zrqoXsnbQg6rCZ7Jy866m0IGFsaWFzIOyDneuetVxuICAgICAgICAgIHNlbGVjdENsYXVzZXMucHVzaChjb2x1bW5QYXRoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBhbGlhcyDsp4DsoJVcbiAgICAgICAgICBzZWxlY3RDbGF1c2VzLnB1c2goYCR7Y29sdW1uUGF0aH0gQVMgJHthbGlhc31gKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMua25leFF1ZXJ5LnNlbGVjdChzZWxlY3RDbGF1c2VzKTtcbiAgICAvLyBTQUZFVFk6IOy/vOumrCDruYzrjZTsnZgg7KCc64Sk66atIOqzhOyVveqzvCDshKDtlokg6rKA7Kad7J20IOydtCDtg4DsnoXsnYQg67O07J6l7ZWp64uI64ukLlxuICAgIHJldHVybiB0aGlzIGFzIGFueTtcbiAgfVxuXG4gIC8qKlxuICAgKiDspJHssqkg6rCd7LK066W8IGZsYXQg6rCd7LK066GcIOuzgO2ZmFxuICAgKiDsmIg6IHsgcGFyZW50OiB7IGlkOiBcInBhcmVudC5pZFwiLCBuYW1lOiBcInBhcmVudC5uYW1lXCIgfSB9XG4gICAqICAg4oaSIHsgcGFyZW50X19pZDogXCJwYXJlbnQuaWRcIiwgcGFyZW50X19uYW1lOiBcInBhcmVudC5uYW1lXCIgfVxuICAgKi9cbiAgcHJpdmF0ZSAqZmxhdHRlblNlbGVjdEVudHJpZXMoXG4gICAgc2VsZWN0T2JqOiBTZWxlY3RPYmplY3Q8VFRhYmxlcz4sXG4gICAgcHJlZml4ID0gXCJcIixcbiAgKTogR2VuZXJhdG9yPFtzdHJpbmcsIFNlbGVjdFZhbHVlPFRUYWJsZXM+XSwgdm9pZD4ge1xuICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKHNlbGVjdE9iaikpIHtcbiAgICAgIGNvbnN0IGZ1bGxLZXkgPSBwcmVmaXggPyBgJHtwcmVmaXh9X18ke2tleX1gIDoga2V5O1xuXG4gICAgICBpZiAoaXNOZXN0ZWRTZWxlY3RPYmplY3QodmFsdWUpKSB7XG4gICAgICAgIHlpZWxkKiB0aGlzLmZsYXR0ZW5TZWxlY3RFbnRyaWVzKHZhbHVlLCBmdWxsS2V5KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHlpZWxkIFtmdWxsS2V5LCB2YWx1ZV07XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBmbGF0dGVuU2VsZWN0KHNlbGVjdE9iajogU2VsZWN0T2JqZWN0PFRUYWJsZXM+LCBwcmVmaXggPSBcIlwiKSB7XG4gICAgcmV0dXJuIE9iamVjdC5mcm9tRW50cmllcyh0aGlzLmZsYXR0ZW5TZWxlY3RFbnRyaWVzKHNlbGVjdE9iaiwgcHJlZml4KSk7XG4gIH1cblxuICAvLyBTRUxFQ1QgKHNlbGVjdOuKlCBvdmVyd3JpdGUsIGFwcGVuZFNlbGVjdOuKlCBhcHBlbmQpXG4gIGFwcGVuZFNlbGVjdDxUU2VsZWN0IGV4dGVuZHMgU2VsZWN0T2JqZWN0PFRUYWJsZXM+PihcbiAgICBzZWxlY3RPYmo6IFRTZWxlY3QsXG4gICk6IFB1cmk8VFNjaGVtYSwgVFRhYmxlcywgVFJlc3VsdCAmIFBhcnNlU2VsZWN0T2JqZWN0PFRUYWJsZXMsIFRTZWxlY3Q+PiB7XG4gICAgLy8g7KSR7LKpIOqwneyytOulvCBmbGF07ZWY6rKMIOuzgO2ZmFxuICAgIGNvbnN0IGZsYXRTZWxlY3QgPSB0aGlzLmZsYXR0ZW5TZWxlY3Qoc2VsZWN0T2JqKTtcblxuICAgIGNvbnN0IHNlbGVjdENsYXVzZXM6IChzdHJpbmcgfCBLbmV4LlJhdylbXSA9IFtdO1xuXG4gICAgZm9yIChjb25zdCBbYWxpYXMsIGNvbHVtbk9yRnVuY3Rpb25dIG9mIE9iamVjdC5lbnRyaWVzKGZsYXRTZWxlY3QpKSB7XG4gICAgICBpZiAoaXNTcWxFeHByZXNzaW9uKGNvbHVtbk9yRnVuY3Rpb24pKSB7XG4gICAgICAgIHNlbGVjdENsYXVzZXMucHVzaChcbiAgICAgICAgICB0aGlzLmtuZXgucmF3KGAke2NvbHVtbk9yRnVuY3Rpb25bXCJfc3FsXCJdfSBBUyAke2FsaWFzfWAsIGNvbHVtbk9yRnVuY3Rpb25bXCJfcGFyYW1zXCJdKSxcbiAgICAgICAgKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIFNBRkVUWTog7L+866asIOu5jOuNlOydmCDsoJzrhKTrpq0g6rOE7JW96rO8IOyEoO2WiSDqsoDspp3snbQg7J20IO2DgOyeheydhCDrs7TsnqXtlanri4jri6QuXG4gICAgICAgIGNvbnN0IGNvbHVtblBhdGggPSBjb2x1bW5PckZ1bmN0aW9uIGFzIHN0cmluZztcbiAgICAgICAgaWYgKGFsaWFzID09PSBjb2x1bW5QYXRoKSB7XG4gICAgICAgICAgc2VsZWN0Q2xhdXNlcy5wdXNoKGNvbHVtblBhdGgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHNlbGVjdENsYXVzZXMucHVzaCh0aGlzLmtuZXgucmVmKGNvbHVtblBhdGgpLmFzKGFsaWFzKSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLmtuZXhRdWVyeS5zZWxlY3Qoc2VsZWN0Q2xhdXNlcyk7XG4gICAgLy8gU0FGRVRZOiDsv7zrpqwg67mM642U7J2YIOygnOuEpOumrSDqs4Tslb3qs7wg7ISg7ZaJIOqygOymneydtCDsnbQg7YOA7J6F7J2EIOuztOyepe2VqeuLiOuLpC5cbiAgICByZXR1cm4gdGhpcyBhcyBhbnk7XG4gIH1cblxuICAvLyBTRUxFQ1QgKlxuICBzZWxlY3RBbGwoKTogUHVyaTxUU2NoZW1hLCBUVGFibGVzLCBTZWxlY3RBbGxSZXN1bHQ8VFRhYmxlcz4+IHtcbiAgICB0aGlzLmtuZXhRdWVyeS5zZWxlY3QoXCIqXCIpO1xuICAgIC8vIFNBRkVUWTog7L+866asIOu5jOuNlOydmCDsoJzrhKTrpq0g6rOE7JW96rO8IOyEoO2WiSDqsoDspp3snbQg7J20IO2DgOyeheydhCDrs7TsnqXtlanri4jri6QuXG4gICAgcmV0dXJuIHRoaXMgYXMgYW55O1xuICB9XG5cbiAgLy8gRElTVElOQ1RcbiAgZGlzdGluY3Q8VENvbHVtbnMgZXh0ZW5kcyBBdmFpbGFibGVDb2x1bW5zPFRUYWJsZXM+PiguLi5jb2x1bW5zOiBUQ29sdW1uc1tdKTogdGhpcztcbiAgZGlzdGluY3QoLi4uY29sdW1uczogc3RyaW5nW10pOiB0aGlzIHtcbiAgICB0aGlzLmtuZXhRdWVyeS5kaXN0aW5jdCguLi5jb2x1bW5zKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8vIENMRUFSXG4gIGNsZWFyKHN0YXRlbWVudDogQ2xlYXJTdGF0ZW1lbnRzKTogdGhpcyB7XG4gICAgdGhpcy5rbmV4UXVlcnkuY2xlYXIoc3RhdGVtZW50KTtcbiAgICBpZiAoc3RhdGVtZW50ID09PSBcImpvaW5cIikge1xuICAgICAgdGhpcy5jbGVhckpvaW5SZWdpc3RyYXRpb25zKCk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLy8ga25leOyXkCDsl4bslrTshJwg7KeB7KCRIOq1rO2YhO2VqFxuICBjbGVhckpvaW4oYWxpYXM6IHN0cmluZyk6IHRoaXMge1xuICAgIGxldCByZW1vdmVkID0gZmFsc2U7XG4gICAgLy8gU0FGRVRZOiDsv7zrpqwg67mM642U7J2YIOygnOuEpOumrSDqs4Tslb3qs7wg7ISg7ZaJIOqygOymneydtCDsnbQg7YOA7J6F7J2EIOuztOyepe2VqeuLiOuLpC5cbiAgICAodGhpcy5rbmV4UXVlcnkgYXMgYW55KVtcIl9zdGF0ZW1lbnRzXCJdID0gKHRoaXMua25leFF1ZXJ5IGFzIGFueSlbXCJfc3RhdGVtZW50c1wiXS5maWx0ZXIoXG4gICAgICAoczogYW55KSA9PiB7XG4gICAgICAgIGlmIChcImpvaW5UeXBlXCIgaW4gcykge1xuICAgICAgICAgIGNvbnN0IHNob3VsZFJlbW92ZSA9IHRoaXMuZ2V0S25leEpvaW5BbGlhcyhzLnRhYmxlKSA9PT0gYWxpYXM7XG4gICAgICAgICAgcmVtb3ZlZCB8fD0gc2hvdWxkUmVtb3ZlO1xuICAgICAgICAgIHJldHVybiAhc2hvdWxkUmVtb3ZlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICk7XG4gICAgaWYgKHJlbW92ZWQgJiYgdGhpcy5jb3JyZWxhdGlvblJlZ2lzdHJ5LmdldChhbGlhcyk/LmtpbmQgPT09IFwiam9pblwiKSB7XG4gICAgICB0aGlzLmNvcnJlbGF0aW9uUmVnaXN0cnkuZGVsZXRlKGFsaWFzKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvLyBKT0lOOiDshJzruIzsv7zrpqwgKyBBbGlhc1xuICBqb2luPFRKb2luQWxpYXMgZXh0ZW5kcyBzdHJpbmcsIFRTdWJSZXN1bHQ+KFxuICAgIHRhYmxlU3BlYzogeyBbSyBpbiBUSm9pbkFsaWFzXTogUHVyaTxUU2NoZW1hLCBhbnksIFRTdWJSZXN1bHQ+IH0sXG4gICAgbGVmdDogQXZhaWxhYmxlQ29sdW1uczxUVGFibGVzPixcbiAgICByaWdodDogYCR7VEpvaW5BbGlhc30uJHtDb2x1bW5LZXlzPFRTdWJSZXN1bHQ+fWAsXG4gICk6IFB1cmk8XG4gICAgVFNjaGVtYSxcbiAgICBUVGFibGVzICYgUmVjb3JkPFRKb2luQWxpYXMsIFRTdWJSZXN1bHQ+LCAvLyDshJzruIzsv7zrpqzsnZggVFJlc3VsdFxuICAgIFRSZXN1bHRcbiAgPjtcbiAgLy8gSk9JTjog7YWM7J2067iUICsgQWxpYXNcbiAgam9pbjxUSm9pblRhYmxlIGV4dGVuZHMga2V5b2YgVFNjaGVtYSwgVEpvaW5BbGlhcyBleHRlbmRzIHN0cmluZz4oXG4gICAgdGFibGVTcGVjOiB7IFtLIGluIFRKb2luQWxpYXNdOiBUSm9pblRhYmxlIH0sXG4gICAgbGVmdDogQXZhaWxhYmxlQ29sdW1uczxUVGFibGVzPixcbiAgICByaWdodDogYCR7VEpvaW5BbGlhc30uJHtDb2x1bW5LZXlzPFRTY2hlbWFbVEpvaW5UYWJsZV0+fWAsXG4gICk6IFB1cmk8XG4gICAgVFNjaGVtYSxcbiAgICBUVGFibGVzICYgUmVjb3JkPFRKb2luQWxpYXMsIFRTY2hlbWFbVEpvaW5UYWJsZV0+LCAvLyBUVGFibGVzIO2ZleyepSFcbiAgICBUUmVzdWx0XG4gID47XG4gIC8vIEpPSU46IO2FjOydtOu4lOuqhVxuICBqb2luPFRKb2luVGFibGUgZXh0ZW5kcyBrZXlvZiBUU2NoZW1hPihcbiAgICB0YWJsZU5hbWU6IFRKb2luVGFibGUsXG4gICAgbGVmdDogQXZhaWxhYmxlQ29sdW1uczxUVGFibGVzPixcbiAgICByaWdodDogYCR7VEpvaW5UYWJsZSAmIHN0cmluZ30uJHtDb2x1bW5LZXlzPFRTY2hlbWFbVEpvaW5UYWJsZV0+fWAsXG4gICk6IFB1cmk8XG4gICAgVFNjaGVtYSxcbiAgICBUVGFibGVzICYgUmVjb3JkPFRKb2luVGFibGUsIFRTY2hlbWFbVEpvaW5UYWJsZV0+LCAvLyDthYzsnbTruJTrqoXsnbQg7YKkXG4gICAgVFJlc3VsdFxuICA+O1xuICAvLyBKT0lOOiDshJzruIzsv7zrpqwgKyBBbGlhcyArIOy9nOuwsVxuICBqb2luPFRKb2luQWxpYXMgZXh0ZW5kcyBzdHJpbmcsIFRTdWJSZXN1bHQ+KFxuICAgIHRhYmxlU3BlYzogeyBbSyBpbiBUSm9pbkFsaWFzXTogUHVyaTxUU2NoZW1hLCBhbnksIFRTdWJSZXN1bHQ+IH0sXG4gICAgY2FsbGJhY2s6IChqOiBKb2luQ2xhdXNlR3JvdXA8VFRhYmxlcywgUmVjb3JkPFRKb2luQWxpYXMsIFRTdWJSZXN1bHQ+PikgPT4gdm9pZCxcbiAgKTogUHVyaTxUU2NoZW1hLCBUVGFibGVzICYgUmVjb3JkPFRKb2luQWxpYXMsIFRTdWJSZXN1bHQ+LCBUUmVzdWx0PjtcbiAgLy8gSk9JTjog7YWM7J2067iUICsgQWxpYXMgKyDsvZzrsLFcbiAgam9pbjxUSm9pblRhYmxlIGV4dGVuZHMga2V5b2YgVFNjaGVtYSwgVEpvaW5BbGlhcyBleHRlbmRzIHN0cmluZz4oXG4gICAgdGFibGVTcGVjOiB7IFtLIGluIFRKb2luQWxpYXNdOiBUSm9pblRhYmxlIH0sXG4gICAgY2FsbGJhY2s6IChqOiBKb2luQ2xhdXNlR3JvdXA8VFRhYmxlcywgUmVjb3JkPFRKb2luQWxpYXMsIFRTY2hlbWFbVEpvaW5UYWJsZV0+PikgPT4gdm9pZCxcbiAgKTogUHVyaTxUU2NoZW1hLCBUVGFibGVzICYgUmVjb3JkPFRKb2luQWxpYXMsIFRTY2hlbWFbVEpvaW5UYWJsZV0+LCBUUmVzdWx0PjtcbiAgLy8gSk9JTjog7YWM7J2067iU66qFICsg7L2c67CxXG4gIGpvaW48VEpvaW5UYWJsZSBleHRlbmRzIGtleW9mIFRTY2hlbWE+KFxuICAgIHRhYmxlTmFtZTogVEpvaW5UYWJsZSxcbiAgICBjYWxsYmFjazogKGo6IEpvaW5DbGF1c2VHcm91cDxUVGFibGVzLCBSZWNvcmQ8VEpvaW5UYWJsZSwgVFNjaGVtYVtUSm9pblRhYmxlXT4+KSA9PiB2b2lkLFxuICApOiBQdXJpPFRTY2hlbWEsIFRUYWJsZXMgJiBSZWNvcmQ8VEpvaW5UYWJsZSwgVFNjaGVtYVtUSm9pblRhYmxlXT4sIFRSZXN1bHQ+O1xuICAvLyBKT0lOIOyLpOygnCDqtaztmIRcbiAgam9pbih0YWJsZU5hbWVPclNwZWM6IGFueSwgLi4uYXJnczogYW55W10pOiBhbnkge1xuICAgIHJldHVybiB0aGlzW1wiX19jb21tb25Kb2luXCJdKFwiam9pblwiLCB0YWJsZU5hbWVPclNwZWMsIC4uLmFyZ3MpO1xuICB9XG5cbiAgLy8gRU5TVVJFIEpPSU46IO2FjOydtOu4lCArIEFsaWFzXG4gIGVuc3VyZUpvaW48VEpvaW5UYWJsZSBleHRlbmRzIGtleW9mIFRTY2hlbWEsIFRKb2luQWxpYXMgZXh0ZW5kcyBzdHJpbmc+KFxuICAgIHRhYmxlU3BlYzogeyBbSyBpbiBUSm9pbkFsaWFzXTogVEpvaW5UYWJsZSB9LFxuICAgIGxlZnQ6IEF2YWlsYWJsZUNvbHVtbnM8VFRhYmxlcz4sXG4gICAgcmlnaHQ6IGAke1RKb2luQWxpYXN9LiR7Q29sdW1uS2V5czxUU2NoZW1hW1RKb2luVGFibGVdPn1gLFxuICApOiBQdXJpPFRTY2hlbWEsIFRUYWJsZXMgJiBSZWNvcmQ8VEpvaW5BbGlhcywgVFNjaGVtYVtUSm9pblRhYmxlXT4sIFRSZXN1bHQ+O1xuICAvLyBFTlNVUkUgSk9JTjog7YWM7J2067iU66qFXG4gIGVuc3VyZUpvaW48VEpvaW5UYWJsZSBleHRlbmRzIGtleW9mIFRTY2hlbWE+KFxuICAgIHRhYmxlTmFtZTogVEpvaW5UYWJsZSxcbiAgICBsZWZ0OiBBdmFpbGFibGVDb2x1bW5zPFRUYWJsZXM+LFxuICAgIHJpZ2h0OiBgJHtUSm9pblRhYmxlICYgc3RyaW5nfS4ke0NvbHVtbktleXM8VFNjaGVtYVtUSm9pblRhYmxlXT59YCxcbiAgKTogUHVyaTxUU2NoZW1hLCBUVGFibGVzICYgUmVjb3JkPFRKb2luVGFibGUsIFRTY2hlbWFbVEpvaW5UYWJsZV0+LCBUUmVzdWx0PjtcbiAgZW5zdXJlSm9pbih0YWJsZU5hbWVPclNwZWM6IGFueSwgbGVmdDogc3RyaW5nLCByaWdodDogc3RyaW5nKTogYW55IHtcbiAgICByZXR1cm4gdGhpc1tcIl9fZW5zdXJlSm9pblwiXShcImpvaW5cIiwgdGFibGVOYW1lT3JTcGVjLCBsZWZ0LCByaWdodCk7XG4gIH1cblxuICAvLyBMRUZUIEpPSU46IOyEnOu4jOy/vOumrCArIEFsaWFzXG4gIGxlZnRKb2luPFRKb2luQWxpYXMgZXh0ZW5kcyBzdHJpbmcsIFRTdWJSZXN1bHQ+KFxuICAgIHRhYmxlU3BlYzogeyBbSyBpbiBUSm9pbkFsaWFzXTogUHVyaTxUU2NoZW1hLCBhbnksIFRTdWJSZXN1bHQ+IH0sXG4gICAgbGVmdDogQXZhaWxhYmxlQ29sdW1uczxUVGFibGVzPixcbiAgICByaWdodDogYCR7VEpvaW5BbGlhc30uJHtDb2x1bW5LZXlzPFRTdWJSZXN1bHQ+fWAsXG4gICk6IFB1cmk8VFNjaGVtYSwgVFRhYmxlcyAmIFJlY29yZDxUSm9pbkFsaWFzLCBUU3ViUmVzdWx0ICYgTGVmdEpvaW5lZE1hcmtlcj4sIFRSZXN1bHQ+OyAvLyDshJzruIzsv7zrpqzsnZggVFJlc3VsdFxuICAvLyBMRUZUIEpPSU46IO2FjOydtOu4lCArIEFsaWFzXG4gIC8vIEZLIG51bGxhYmxlIOyXrOu2gOyXkCDrlLDrnbwg7J6Q64+Z7Jy866GcIExlZnRKb2luZWRNYXJrZXIg6rKw7KCVXG4gIGxlZnRKb2luPFxuICAgIFRKb2luVGFibGUgZXh0ZW5kcyBrZXlvZiBUU2NoZW1hLFxuICAgIFRKb2luQWxpYXMgZXh0ZW5kcyBzdHJpbmcsXG4gICAgVExlZnQgZXh0ZW5kcyBBdmFpbGFibGVDb2x1bW5zPFRUYWJsZXM+LFxuICA+KFxuICAgIHRhYmxlU3BlYzogeyBbSyBpbiBUSm9pbkFsaWFzXTogVEpvaW5UYWJsZSB9LFxuICAgIGxlZnQ6IFRMZWZ0LFxuICAgIHJpZ2h0OiBgJHtUSm9pbkFsaWFzfS4ke0NvbHVtbktleXM8VFNjaGVtYVtUSm9pblRhYmxlXT59YCxcbiAgKTogUHVyaTxcbiAgICBUU2NoZW1hLFxuICAgIFRUYWJsZXMgJiBSZWNvcmQ8VEpvaW5BbGlhcywgVFNjaGVtYVtUSm9pblRhYmxlXSAmIExlZnRKb2luTWFya2VyRm9yPFRUYWJsZXMsIFRMZWZ0Pj4sXG4gICAgVFJlc3VsdFxuICA+O1xuICAvLyBMRUZUIEpPSU46IO2FjOydtOu4lOuqhVxuICBsZWZ0Sm9pbjxUSm9pblRhYmxlIGV4dGVuZHMga2V5b2YgVFNjaGVtYSwgVExlZnQgZXh0ZW5kcyBBdmFpbGFibGVDb2x1bW5zPFRUYWJsZXM+PihcbiAgICB0YWJsZU5hbWU6IFRKb2luVGFibGUsXG4gICAgbGVmdDogVExlZnQsXG4gICAgcmlnaHQ6IGAke1RKb2luVGFibGUgJiBzdHJpbmd9LiR7Q29sdW1uS2V5czxUU2NoZW1hW1RKb2luVGFibGVdPn1gLFxuICApOiBQdXJpPFxuICAgIFRTY2hlbWEsXG4gICAgVFRhYmxlcyAmIFJlY29yZDxUSm9pblRhYmxlLCBUU2NoZW1hW1RKb2luVGFibGVdICYgTGVmdEpvaW5NYXJrZXJGb3I8VFRhYmxlcywgVExlZnQ+PixcbiAgICBUUmVzdWx0XG4gID47XG4gIC8vIExFRlQgSk9JTjog7ISc67iM7L+866asICsgQWxpYXMgKyDsvZzrsLFcbiAgbGVmdEpvaW48VEpvaW5BbGlhcyBleHRlbmRzIHN0cmluZywgVFN1YlJlc3VsdD4oXG4gICAgdGFibGVTcGVjOiB7IFtLIGluIFRKb2luQWxpYXNdOiBQdXJpPFRTY2hlbWEsIGFueSwgVFN1YlJlc3VsdD4gfSxcbiAgICBjYWxsYmFjazogKGo6IEpvaW5DbGF1c2VHcm91cDxUVGFibGVzLCBSZWNvcmQ8VEpvaW5BbGlhcywgVFN1YlJlc3VsdD4+KSA9PiB2b2lkLFxuICApOiBQdXJpPFRTY2hlbWEsIFRUYWJsZXMgJiBSZWNvcmQ8VEpvaW5BbGlhcywgVFN1YlJlc3VsdCAmIExlZnRKb2luZWRNYXJrZXI+LCBUUmVzdWx0PjtcbiAgLy8gTEVGVCBKT0lOOiDthYzsnbTruJQgKyBBbGlhcyArIOy9nOuwsVxuICBsZWZ0Sm9pbjxUSm9pblRhYmxlIGV4dGVuZHMga2V5b2YgVFNjaGVtYSwgVEpvaW5BbGlhcyBleHRlbmRzIHN0cmluZz4oXG4gICAgdGFibGVTcGVjOiB7IFtLIGluIFRKb2luQWxpYXNdOiBUSm9pblRhYmxlIH0sXG4gICAgY2FsbGJhY2s6IChqOiBKb2luQ2xhdXNlR3JvdXA8VFRhYmxlcywgUmVjb3JkPFRKb2luQWxpYXMsIFRTY2hlbWFbVEpvaW5UYWJsZV0+PikgPT4gdm9pZCxcbiAgKTogUHVyaTxUU2NoZW1hLCBUVGFibGVzICYgUmVjb3JkPFRKb2luQWxpYXMsIFRTY2hlbWFbVEpvaW5UYWJsZV0gJiBMZWZ0Sm9pbmVkTWFya2VyPiwgVFJlc3VsdD47XG4gIC8vIExFRlQgSk9JTjog7YWM7J2067iU66qFICsg7L2c67CxXG4gIGxlZnRKb2luPFRKb2luVGFibGUgZXh0ZW5kcyBrZXlvZiBUU2NoZW1hPihcbiAgICB0YWJsZU5hbWU6IFRKb2luVGFibGUsXG4gICAgY2FsbGJhY2s6IChqOiBKb2luQ2xhdXNlR3JvdXA8VFRhYmxlcywgUmVjb3JkPFRKb2luVGFibGUsIFRTY2hlbWFbVEpvaW5UYWJsZV0+PikgPT4gdm9pZCxcbiAgKTogUHVyaTxUU2NoZW1hLCBUVGFibGVzICYgUmVjb3JkPFRKb2luVGFibGUsIFRTY2hlbWFbVEpvaW5UYWJsZV0gJiBMZWZ0Sm9pbmVkTWFya2VyPiwgVFJlc3VsdD47XG4gIC8vIExFRlQgSk9JTiDsi6TsoJwg6rWs7ZiEXG4gIGxlZnRKb2luKHRhYmxlTmFtZU9yU3BlYzogYW55LCAuLi5hcmdzOiBhbnlbXSk6IGFueSB7XG4gICAgcmV0dXJuIHRoaXNbXCJfX2NvbW1vbkpvaW5cIl0oXCJsZWZ0Sm9pblwiLCB0YWJsZU5hbWVPclNwZWMsIC4uLmFyZ3MpO1xuICB9XG5cbiAgLy8gRU5TVVJFIExFRlQgSk9JTjog7YWM7J2067iUICsgQWxpYXNcbiAgZW5zdXJlTGVmdEpvaW48XG4gICAgVEpvaW5UYWJsZSBleHRlbmRzIGtleW9mIFRTY2hlbWEsXG4gICAgVEpvaW5BbGlhcyBleHRlbmRzIHN0cmluZyxcbiAgICBUTGVmdCBleHRlbmRzIEF2YWlsYWJsZUNvbHVtbnM8VFRhYmxlcz4sXG4gID4oXG4gICAgdGFibGVTcGVjOiB7IFtLIGluIFRKb2luQWxpYXNdOiBUSm9pblRhYmxlIH0sXG4gICAgbGVmdDogVExlZnQsXG4gICAgcmlnaHQ6IGAke1RKb2luQWxpYXN9LiR7Q29sdW1uS2V5czxUU2NoZW1hW1RKb2luVGFibGVdPn1gLFxuICApOiBQdXJpPFxuICAgIFRTY2hlbWEsXG4gICAgVFRhYmxlcyAmIFJlY29yZDxUSm9pbkFsaWFzLCBUU2NoZW1hW1RKb2luVGFibGVdICYgTGVmdEpvaW5NYXJrZXJGb3I8VFRhYmxlcywgVExlZnQ+PixcbiAgICBUUmVzdWx0XG4gID47XG4gIC8vIEVOU1VSRSBMRUZUIEpPSU46IO2FjOydtOu4lOuqhVxuICBlbnN1cmVMZWZ0Sm9pbjxUSm9pblRhYmxlIGV4dGVuZHMga2V5b2YgVFNjaGVtYSwgVExlZnQgZXh0ZW5kcyBBdmFpbGFibGVDb2x1bW5zPFRUYWJsZXM+PihcbiAgICB0YWJsZU5hbWU6IFRKb2luVGFibGUsXG4gICAgbGVmdDogVExlZnQsXG4gICAgcmlnaHQ6IGAke1RKb2luVGFibGUgJiBzdHJpbmd9LiR7Q29sdW1uS2V5czxUU2NoZW1hW1RKb2luVGFibGVdPn1gLFxuICApOiBQdXJpPFxuICAgIFRTY2hlbWEsXG4gICAgVFRhYmxlcyAmIFJlY29yZDxUSm9pblRhYmxlLCBUU2NoZW1hW1RKb2luVGFibGVdICYgTGVmdEpvaW5NYXJrZXJGb3I8VFRhYmxlcywgVExlZnQ+PixcbiAgICBUUmVzdWx0XG4gID47XG4gIGVuc3VyZUxlZnRKb2luKHRhYmxlTmFtZU9yU3BlYzogYW55LCBsZWZ0OiBzdHJpbmcsIHJpZ2h0OiBzdHJpbmcpOiBhbnkge1xuICAgIHJldHVybiB0aGlzW1wiX19lbnN1cmVKb2luXCJdKFwibGVmdEpvaW5cIiwgdGFibGVOYW1lT3JTcGVjLCBsZWZ0LCByaWdodCk7XG4gIH1cblxuICBfX2NvbW1vbkpvaW4oam9pblR5cGU6IFwiam9pblwiIHwgXCJsZWZ0Sm9pblwiLCB0YWJsZU5hbWVPclNwZWM6IGFueSwgLi4uYXJnczogYW55W10pOiB0aGlzIHtcbiAgICBjb25zdCByZWdpc3RyYXRpb24gPSB0aGlzLmNyZWF0ZUpvaW5SZWdpc3RyYXRpb24oam9pblR5cGUsIHRhYmxlTmFtZU9yU3BlYywgYXJncyk7XG4gICAgdGhpcy5hc3NlcnRDb3JyZWxhdGlvbkF2YWlsYWJsZShyZWdpc3RyYXRpb24pO1xuXG4gICAgaWYgKGlzU3RyaW5nVmFsdWUodGFibGVOYW1lT3JTcGVjKSkge1xuICAgICAgLy8gQ2FzZSAxOiBqb2luKFwicG9zdHNcIiwgLi4uKVxuICAgICAgY29uc3QgdGFibGVOYW1lID0gdGFibGVOYW1lT3JTcGVjO1xuXG4gICAgICBpZiAoYXJncy5sZW5ndGggPT09IDEgJiYgaXNGdW5jdGlvblZhbHVlKGFyZ3NbMF0pKSB7XG4gICAgICAgIC8vIGpvaW4oXCJwb3N0c1wiLCBjYWxsYmFjaylcbiAgICAgICAgY29uc3QgY2FsbGJhY2sgPSBhcmdzWzBdO1xuICAgICAgICB0aGlzLmtuZXhRdWVyeVtqb2luVHlwZV0odGFibGVOYW1lLCAoam9pbkNsYXVzZSkgPT4ge1xuICAgICAgICAgIGNhbGxiYWNrKG5ldyBKb2luQ2xhdXNlR3JvdXAoam9pbkNsYXVzZSkpO1xuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIGpvaW4oXCJwb3N0c1wiLCBsZWZ0LCByaWdodClcbiAgICAgICAgY29uc3QgW2xlZnQsIHJpZ2h0XSA9IGFyZ3M7XG4gICAgICAgIHRoaXMua25leFF1ZXJ5W2pvaW5UeXBlXSh0YWJsZU5hbWUsIGxlZnQsIHJpZ2h0KTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGlzT2JqZWN0VmFsdWUodGFibGVOYW1lT3JTcGVjKSkge1xuICAgICAgLy8gQ2FzZSAyOiBqb2luKHsgYWxpYXM6IFwidGFibGVcIiB9LCAuLi4pIG9yIGpvaW4oeyBhbGlhczogc3VicXVlcnkgfSwgLi4uKVxuICAgICAgY29uc3QgZW50cmllcyA9IE9iamVjdC5lbnRyaWVzKHRhYmxlTmFtZU9yU3BlYyk7XG4gICAgICBpZiAoZW50cmllcy5sZW5ndGggIT09IDEpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVGFibGUgc3BlYyBtdXN0IGhhdmUgZXhhY3RseSBvbmUgZW50cnlcIik7XG4gICAgICB9XG4gICAgICBhc3NlcnQoZW50cmllc1swXSk7XG4gICAgICBjb25zdCBbW2FsaWFzLCBzcGVjXV0gPSBlbnRyaWVzO1xuXG4gICAgICBpZiAoaXNTdHJpbmdWYWx1ZShzcGVjKSkge1xuICAgICAgICAvLyDthYzsnbTruJQ6IGpvaW4oeyBwOiBcInBvc3RzXCIgfSwgLi4uKVxuICAgICAgICBpZiAoYXJncy5sZW5ndGggPT09IDEgJiYgaXNGdW5jdGlvblZhbHVlKGFyZ3NbMF0pKSB7XG4gICAgICAgICAgLy8gQ2FsbGJhY2tcbiAgICAgICAgICBjb25zdCBjYWxsYmFjayA9IGFyZ3NbMF07XG4gICAgICAgICAgdGhpcy5rbmV4UXVlcnlbam9pblR5cGVdKHsgW2FsaWFzXTogc3BlYyB9LCAoam9pbkNsYXVzZSkgPT4ge1xuICAgICAgICAgICAgY2FsbGJhY2sobmV3IEpvaW5DbGF1c2VHcm91cChqb2luQ2xhdXNlKSk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gU2ltcGxlXG4gICAgICAgICAgY29uc3QgW2xlZnQsIHJpZ2h0XSA9IGFyZ3M7XG4gICAgICAgICAgdGhpcy5rbmV4UXVlcnlbam9pblR5cGVdKHsgW2FsaWFzXTogc3BlYyB9LCBsZWZ0LCByaWdodCk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoc3BlYyBpbnN0YW5jZW9mIFB1cmkpIHtcbiAgICAgICAgLy8g7ISc67iM7L+866asOiBqb2luKHsgc3E6IHN1YnF1ZXJ5IH0sIC4uLilcbiAgICAgICAgaWYgKGFyZ3MubGVuZ3RoID09PSAxICYmIGlzRnVuY3Rpb25WYWx1ZShhcmdzWzBdKSkge1xuICAgICAgICAgIC8vIENhbGxiYWNrXG4gICAgICAgICAgY29uc3QgY2FsbGJhY2sgPSBhcmdzWzBdO1xuICAgICAgICAgIHRoaXMua25leFF1ZXJ5W2pvaW5UeXBlXShzcGVjLnJhd1F1ZXJ5KCkuYXMoYWxpYXMpLCAoam9pbkNsYXVzZSkgPT4ge1xuICAgICAgICAgICAgY2FsbGJhY2sobmV3IEpvaW5DbGF1c2VHcm91cChqb2luQ2xhdXNlKSk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gU2ltcGxlXG4gICAgICAgICAgY29uc3QgW2xlZnQsIHJpZ2h0XSA9IGFyZ3M7XG4gICAgICAgICAgdGhpcy5rbmV4UXVlcnlbam9pblR5cGVdKHNwZWMucmF3UXVlcnkoKS5hcyhhbGlhcyksIGxlZnQsIHJpZ2h0KTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiSW52YWxpZCB0YWJsZSBzcGVjaWZpY2F0aW9uXCIpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIGFyZ3VtZW50c1wiKTtcbiAgICB9XG5cbiAgICB0aGlzLmNvcnJlbGF0aW9uUmVnaXN0cnkuc2V0KHJlZ2lzdHJhdGlvbi5hbGlhcywgcmVnaXN0cmF0aW9uKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIHByaXZhdGUgX19lbnN1cmVKb2luKFxuICAgIGpvaW5UeXBlOiBcImpvaW5cIiB8IFwibGVmdEpvaW5cIixcbiAgICB0YWJsZU5hbWVPclNwZWM6IHN0cmluZyB8IFJlY29yZDxzdHJpbmcsIHN0cmluZz4sXG4gICAgbGVmdDogc3RyaW5nLFxuICAgIHJpZ2h0OiBzdHJpbmcsXG4gICk6IHRoaXMge1xuICAgIGNvbnN0IHJlcXVlc3RlZCA9IHRoaXMuY3JlYXRlSm9pblJlZ2lzdHJhdGlvbihqb2luVHlwZSwgdGFibGVOYW1lT3JTcGVjLCBbbGVmdCwgcmlnaHRdKTtcbiAgICBpZiAoIXJlcXVlc3RlZC5yZXVzYWJsZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgJHtqb2luVHlwZSA9PT0gXCJqb2luXCIgPyBcImVuc3VyZUpvaW5cIiA6IFwiZW5zdXJlTGVmdEpvaW5cIn0gb25seSBzdXBwb3J0cyBwaHlzaWNhbCB0YWJsZXMgd2l0aCBzaW1wbGUgY29sdW1uIGVxdWFsaXR5IGNvbmRpdGlvbnMuYCxcbiAgICAgICk7XG4gICAgfVxuICAgIGNvbnN0IGV4aXN0aW5nID0gdGhpcy5jb3JyZWxhdGlvblJlZ2lzdHJ5LmdldChyZXF1ZXN0ZWQuYWxpYXMpO1xuXG4gICAgaWYgKCFleGlzdGluZykge1xuICAgICAgcmV0dXJuIHRoaXNbXCJfX2NvbW1vbkpvaW5cIl0oam9pblR5cGUsIHRhYmxlTmFtZU9yU3BlYywgbGVmdCwgcmlnaHQpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmlzU2FtZUpvaW5SZWdpc3RyYXRpb24oZXhpc3RpbmcsIHJlcXVlc3RlZCkpIHtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHRocm93IHRoaXMuY3JlYXRlSm9pbkNvbmZsaWN0RXJyb3IoZXhpc3RpbmcsIHJlcXVlc3RlZCk7XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZUpvaW5SZWdpc3RyYXRpb24oXG4gICAgam9pblR5cGU6IFwiam9pblwiIHwgXCJsZWZ0Sm9pblwiLFxuICAgIHRhYmxlTmFtZU9yU3BlYzogYW55LFxuICAgIGFyZ3M6IGFueVtdLFxuICApOiBKb2luUmVnaXN0cmF0aW9uIHtcbiAgICBsZXQgYWxpYXM6IHN0cmluZztcbiAgICBsZXQgdGFibGU6IHN0cmluZyB8IG51bGw7XG5cbiAgICBpZiAoaXNTdHJpbmdWYWx1ZSh0YWJsZU5hbWVPclNwZWMpKSB7XG4gICAgICBhbGlhcyA9IHRhYmxlTmFtZU9yU3BlYztcbiAgICAgIHRhYmxlID0gdGFibGVOYW1lT3JTcGVjO1xuICAgIH0gZWxzZSBpZiAoaXNPYmplY3RWYWx1ZSh0YWJsZU5hbWVPclNwZWMpKSB7XG4gICAgICBjb25zdCBlbnRyaWVzID0gT2JqZWN0LmVudHJpZXModGFibGVOYW1lT3JTcGVjKTtcbiAgICAgIGlmIChlbnRyaWVzLmxlbmd0aCAhPT0gMSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJUYWJsZSBzcGVjIG11c3QgaGF2ZSBleGFjdGx5IG9uZSBlbnRyeVwiKTtcbiAgICAgIH1cbiAgICAgIGFzc2VydChlbnRyaWVzWzBdKTtcbiAgICAgIGNvbnN0IFtbam9pbkFsaWFzLCBzcGVjXV0gPSBlbnRyaWVzO1xuICAgICAgYWxpYXMgPSBqb2luQWxpYXM7XG4gICAgICB0YWJsZSA9IGlzU3RyaW5nVmFsdWUoc3BlYykgPyBzcGVjIDogbnVsbDtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiSW52YWxpZCBhcmd1bWVudHNcIik7XG4gICAgfVxuXG4gICAgY29uc3QgW2xlZnQsIHJpZ2h0XSA9IGFyZ3M7XG4gICAgY29uc3QgcmV1c2FibGUgPVxuICAgICAgdGFibGUgIT09IG51bGwgJiYgYXJncy5sZW5ndGggPT09IDIgJiYgaXNTdHJpbmdWYWx1ZShsZWZ0KSAmJiBpc1N0cmluZ1ZhbHVlKHJpZ2h0KTtcblxuICAgIHJldHVybiB7XG4gICAgICBraW5kOiBcImpvaW5cIixcbiAgICAgIGFsaWFzLFxuICAgICAgdGFibGUsXG4gICAgICBqb2luVHlwZSxcbiAgICAgIGxlZnQ6IHJldXNhYmxlID8gbGVmdCA6IG51bGwsXG4gICAgICByaWdodDogcmV1c2FibGUgPyByaWdodCA6IG51bGwsXG4gICAgICByZXVzYWJsZSxcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBhc3NlcnRDb3JyZWxhdGlvbkF2YWlsYWJsZShyZXF1ZXN0ZWQ6IEpvaW5SZWdpc3RyYXRpb24pOiB2b2lkIHtcbiAgICBjb25zdCBleGlzdGluZyA9IHRoaXMuY29ycmVsYXRpb25SZWdpc3RyeS5nZXQocmVxdWVzdGVkLmFsaWFzKTtcbiAgICBpZiAoZXhpc3RpbmcpIHtcbiAgICAgIGlmICh0aGlzLmlzU2FtZUpvaW5SZWdpc3RyYXRpb24oZXhpc3RpbmcsIHJlcXVlc3RlZCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIGBKb2luIGFsaWFzIFwiJHtyZXF1ZXN0ZWQuYWxpYXN9XCIgaXMgYWxyZWFkeSByZWdpc3RlcmVkLiBVc2UgZW5zdXJlSm9pbigpIG9yIGVuc3VyZUxlZnRKb2luKCkgdG8gcmV1c2UgYW4gaWRlbnRpY2FsIGpvaW4uYCxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIHRocm93IHRoaXMuY3JlYXRlSm9pbkNvbmZsaWN0RXJyb3IoZXhpc3RpbmcsIHJlcXVlc3RlZCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBpc1NhbWVKb2luUmVnaXN0cmF0aW9uKFxuICAgIGV4aXN0aW5nOiBDb3JyZWxhdGlvblJlZ2lzdHJhdGlvbixcbiAgICByZXF1ZXN0ZWQ6IEpvaW5SZWdpc3RyYXRpb24sXG4gICk6IGV4aXN0aW5nIGlzIEpvaW5SZWdpc3RyYXRpb24ge1xuICAgIHJldHVybiAoXG4gICAgICBleGlzdGluZy5raW5kID09PSBcImpvaW5cIiAmJlxuICAgICAgZXhpc3RpbmcucmV1c2FibGUgJiZcbiAgICAgIHJlcXVlc3RlZC5yZXVzYWJsZSAmJlxuICAgICAgZXhpc3RpbmcudGFibGUgPT09IHJlcXVlc3RlZC50YWJsZSAmJlxuICAgICAgZXhpc3Rpbmcuam9pblR5cGUgPT09IHJlcXVlc3RlZC5qb2luVHlwZSAmJlxuICAgICAgZXhpc3RpbmcubGVmdCA9PT0gcmVxdWVzdGVkLmxlZnQgJiZcbiAgICAgIGV4aXN0aW5nLnJpZ2h0ID09PSByZXF1ZXN0ZWQucmlnaHRcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVKb2luQ29uZmxpY3RFcnJvcihcbiAgICBleGlzdGluZzogQ29ycmVsYXRpb25SZWdpc3RyYXRpb24sXG4gICAgcmVxdWVzdGVkOiBKb2luUmVnaXN0cmF0aW9uLFxuICApOiBFcnJvciB7XG4gICAgcmV0dXJuIG5ldyBFcnJvcihcbiAgICAgIFtcbiAgICAgICAgYEpvaW4gYWxpYXMgXCIke3JlcXVlc3RlZC5hbGlhc31cIiBpcyBhbHJlYWR5IHJlZ2lzdGVyZWQgd2l0aCBhIGRpZmZlcmVudCBkZWZpbml0aW9uLmAsXG4gICAgICAgIGBFeGlzdGluZzogJHt0aGlzLmZvcm1hdENvcnJlbGF0aW9uUmVnaXN0cmF0aW9uKGV4aXN0aW5nKX1gLFxuICAgICAgICBgUmVxdWVzdGVkOiAke3RoaXMuZm9ybWF0Q29ycmVsYXRpb25SZWdpc3RyYXRpb24ocmVxdWVzdGVkKX1gLFxuICAgICAgXS5qb2luKFwiXFxuXCIpLFxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIGZvcm1hdENvcnJlbGF0aW9uUmVnaXN0cmF0aW9uKHJlZ2lzdHJhdGlvbjogQ29ycmVsYXRpb25SZWdpc3RyYXRpb24pOiBzdHJpbmcge1xuICAgIGlmIChyZWdpc3RyYXRpb24ua2luZCA9PT0gXCJmcm9tXCIpIHtcbiAgICAgIHJldHVybiBgRlJPTSAke3JlZ2lzdHJhdGlvbi50YWJsZSA/PyBcInN1YnF1ZXJ5XCJ9IEFTICR7cmVnaXN0cmF0aW9uLmFsaWFzfWA7XG4gICAgfVxuXG4gICAgY29uc3Qgam9pbktleXdvcmQgPSByZWdpc3RyYXRpb24uam9pblR5cGUgPT09IFwiam9pblwiID8gXCJKT0lOXCIgOiBcIkxFRlQgSk9JTlwiO1xuICAgIGNvbnN0IHNvdXJjZSA9IHJlZ2lzdHJhdGlvbi50YWJsZSA/PyBcIm9wYXF1ZSBzb3VyY2VcIjtcbiAgICBjb25zdCBjb25kaXRpb24gPSByZWdpc3RyYXRpb24ucmV1c2FibGVcbiAgICAgID8gYCBPTiAke3JlZ2lzdHJhdGlvbi5sZWZ0fSA9ICR7cmVnaXN0cmF0aW9uLnJpZ2h0fWBcbiAgICAgIDogXCIgd2l0aCBvcGFxdWUgY29uZGl0aW9uXCI7XG4gICAgcmV0dXJuIGAke2pvaW5LZXl3b3JkfSAke3NvdXJjZX0gQVMgJHtyZWdpc3RyYXRpb24uYWxpYXN9JHtjb25kaXRpb259YDtcbiAgfVxuXG4gIHByaXZhdGUgY2xlYXJKb2luUmVnaXN0cmF0aW9ucygpOiB2b2lkIHtcbiAgICBmb3IgKGNvbnN0IFthbGlhcywgcmVnaXN0cmF0aW9uXSBvZiB0aGlzLmNvcnJlbGF0aW9uUmVnaXN0cnkpIHtcbiAgICAgIGlmIChyZWdpc3RyYXRpb24ua2luZCA9PT0gXCJqb2luXCIpIHtcbiAgICAgICAgdGhpcy5jb3JyZWxhdGlvblJlZ2lzdHJ5LmRlbGV0ZShhbGlhcyk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBnZXRLbmV4Sm9pbkFsaWFzPFZhbHVlPih0YWJsZTogVmFsdWUpOiBzdHJpbmcgfCBudWxsIHtcbiAgICBpZiAoaXNTdHJpbmdWYWx1ZSh0YWJsZSkpIHtcbiAgICAgIHJldHVybiB0YWJsZTtcbiAgICB9XG4gICAgaWYgKGlzT2JqZWN0VmFsdWUodGFibGUpICYmIHRhYmxlICE9PSBudWxsKSB7XG4gICAgICBpZiAoXG4gICAgICAgIFwiX3NpbmdsZVwiIGluIHRhYmxlICYmXG4gICAgICAgIGlzT2JqZWN0VmFsdWUodGFibGVbXCJfc2luZ2xlXCJdKSAmJlxuICAgICAgICB0YWJsZVtcIl9zaW5nbGVcIl0gIT09IG51bGwgJiZcbiAgICAgICAgXCJhc1wiIGluIHRhYmxlW1wiX3NpbmdsZVwiXSAmJlxuICAgICAgICBpc1N0cmluZ1ZhbHVlKHRhYmxlW1wiX3NpbmdsZVwiXS5hcylcbiAgICAgICkge1xuICAgICAgICByZXR1cm4gdGFibGVbXCJfc2luZ2xlXCJdLmFzO1xuICAgICAgfVxuICAgICAgcmV0dXJuIE9iamVjdC5rZXlzKHRhYmxlKVswXSA/PyBudWxsO1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIC8vIFdIRVJFOiDqsJ3ssrQgLSDsgqzsmqk6IC53aGVyZSh7IFwidS5pZFwiOiAxLCBcInUuc3RhdHVzXCI6IFwiYWN0aXZlXCIgfSlcbiAgd2hlcmUoY29uZGl0aW9uczogV2hlcmVDb25kaXRpb248VFRhYmxlcz4pOiB0aGlzO1xuICAvLyBXSEVSRTog7Lus65+8IC0g7IKs7JqpOiAud2hlcmUoXCJ1LmlkXCIsIDEpLCAud2hlcmUoXCJ1LmlkXCIsIG51bGwpXG4gIHdoZXJlPFRDb2x1bW4gZXh0ZW5kcyBBdmFpbGFibGVDb2x1bW5zPFRUYWJsZXM+PihcbiAgICBjb2x1bW46IFRDb2x1bW4sXG4gICAgdmFsdWU6IEV4dHJhY3RDb2x1bW5UeXBlPFRUYWJsZXMsIFRDb2x1bW4gJiBzdHJpbmc+LFxuICApOiB0aGlzO1xuICAvLyBXSEVSRTog7Lus65+8IC0g7IKs7JqpOiAud2hlcmUoXCJ1LmlkXCIsIFwiPlwiLCAxMCksIC53aGVyZShcInUuaWRcIiwgXCIhPVwiLCBudWxsKVxuICB3aGVyZTxUQ29sdW1uIGV4dGVuZHMgQXZhaWxhYmxlQ29sdW1uczxUVGFibGVzPj4oXG4gICAgY29sdW1uOiBUQ29sdW1uLFxuICAgIG9wZXJhdG9yOiBXaGVyZU9wZXJhdG9yLFxuICAgIHZhbHVlOiBFeHRyYWN0Q29sdW1uVHlwZTxUVGFibGVzLCBUQ29sdW1uICYgc3RyaW5nPixcbiAgKTogdGhpcztcbiAgLy8gV0hFUkU6IFNRTCDtkZztmITsi50gLSDsgqzsmqk6IC53aGVyZShwdXJpLnJhdyhcIkNPTkNBVCh1Lm5hbWUsIHUuZW1haWwpXCIpLCBcImxpa2VcIiwgXCIldGVzdCVcIilcbiAgd2hlcmU8VENvbHVtbiBleHRlbmRzIEtuZXguUmF3Pihjb2x1bW46IFRDb2x1bW4sIG9wZXJhdG9yOiBXaGVyZU9wZXJhdG9yLCB2YWx1ZTogYW55KTogdGhpcztcbiAgLy8gV0hFUkU6IOy7rOufvCAtIOyCrOyaqTogLndoZXJlKFwidS5pZFwiLCBcImxpa2VcIiwgXCIldGVzdCVcIilcbiAgd2hlcmUoLi4uYXJnczogW2NvbHVtbk9yQ29uZGl0aW9uczogYW55LCBvcGVyYXRvck9yVmFsdWU/OiBhbnksIHZhbHVlPzogYW55XSk6IHRoaXMge1xuICAgIGNvbnN0IFtjb2x1bW5PckNvbmRpdGlvbnMsIG9wZXJhdG9yT3JWYWx1ZSwgdmFsdWVdID0gYXJncztcbiAgICBpZiAoaXNPYmplY3RWYWx1ZShjb2x1bW5PckNvbmRpdGlvbnMpKSB7XG4gICAgICB0aGlzLmtuZXhRdWVyeS53aGVyZShjb2x1bW5PckNvbmRpdGlvbnMpO1xuICAgIH0gZWxzZSBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgaWYgKG9wZXJhdG9yT3JWYWx1ZSA9PT0gbnVsbCkge1xuICAgICAgICB0aGlzLmtuZXhRdWVyeS53aGVyZU51bGwoY29sdW1uT3JDb25kaXRpb25zKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICB9XG4gICAgICB0aGlzLmtuZXhRdWVyeS53aGVyZShjb2x1bW5PckNvbmRpdGlvbnMsIG9wZXJhdG9yT3JWYWx1ZSk7XG4gICAgfSBlbHNlIGlmICh2YWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBpZiAodmFsdWUgPT09IG51bGwpIHtcbiAgICAgICAgaWYgKG9wZXJhdG9yT3JWYWx1ZSA9PT0gXCIhPVwiKSB7XG4gICAgICAgICAgdGhpcy5rbmV4UXVlcnkud2hlcmVOb3ROdWxsKGNvbHVtbk9yQ29uZGl0aW9ucyk7XG4gICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgIH0gZWxzZSBpZiAob3BlcmF0b3JPclZhbHVlID09PSBcIj1cIikge1xuICAgICAgICAgIHRoaXMua25leFF1ZXJ5LndoZXJlTnVsbChjb2x1bW5PckNvbmRpdGlvbnMpO1xuICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICB0aGlzLmtuZXhRdWVyeS53aGVyZShjb2x1bW5PckNvbmRpdGlvbnMsIG9wZXJhdG9yT3JWYWx1ZSwgdmFsdWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmtuZXhRdWVyeS53aGVyZShjb2x1bW5PckNvbmRpdGlvbnMpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8vIFdIRVJFIElOXG4gIHdoZXJlSW48VENvbHVtbiBleHRlbmRzIEF2YWlsYWJsZUNvbHVtbnM8VFRhYmxlcz4+KFxuICAgIGNvbHVtbjogVENvbHVtbixcbiAgICB2YWx1ZXM6IChFeHRyYWN0Q29sdW1uVHlwZTxUVGFibGVzLCBUQ29sdW1uICYgc3RyaW5nPiAmIEtuZXguVmFsdWUpW10sXG4gICk6IFB1cmk8VFNjaGVtYSwgVFRhYmxlcywgVFJlc3VsdD4ge1xuICAgIC8vIEtuZXjsnZgg67mE7Ja0IOyeiOuKlCBJTiDrsLDsl7Qg7LKY66as7JmAIOuPmeydvO2VmOqyjCDtla3sg4Eg6rGw7KeT7J24IOyhsOqxtOydhCDsg53shLHtlanri4jri6QuXG4gICAgaWYgKHZhbHVlcy5sZW5ndGggPT09IDApIHtcbiAgICAgIHRoaXMua25leFF1ZXJ5LndoZXJlUmF3KFwiMSA9IDBcIik7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IHBsYWNlaG9sZGVycyA9IHZhbHVlcy5tYXAoKCkgPT4gXCI/XCIpLmpvaW4oXCIsIFwiKTtcbiAgICAgIHRoaXMua25leFF1ZXJ5LndoZXJlUmF3KGA/PyBpbiAoJHtwbGFjZWhvbGRlcnN9KWAsIFtTdHJpbmcoY29sdW1uKSwgLi4udmFsdWVzXSk7XG4gICAgfVxuICAgIC8vIFNBRkVUWTog7L+866asIOu5jOuNlOydmCDsoJzrhKTrpq0g6rOE7JW96rO8IOyEoO2WiSDqsoDspp3snbQg7J20IO2DgOyeheydhCDrs7TsnqXtlanri4jri6QuXG4gICAgcmV0dXJuIHRoaXMgYXMgYW55O1xuICB9XG5cbiAgLy8gV0hFUkUgTk9UIElOXG4gIHdoZXJlTm90SW48VENvbHVtbiBleHRlbmRzIEF2YWlsYWJsZUNvbHVtbnM8VFRhYmxlcz4+KFxuICAgIGNvbHVtbjogVENvbHVtbixcbiAgICB2YWx1ZXM6IChFeHRyYWN0Q29sdW1uVHlwZTxUVGFibGVzLCBUQ29sdW1uICYgc3RyaW5nPiAmIEtuZXguVmFsdWUpW10sXG4gICk6IFB1cmk8VFNjaGVtYSwgVFRhYmxlcywgVFJlc3VsdD4ge1xuICAgIC8vIEtuZXjsnZgg67mE7Ja0IOyeiOuKlCBOT1QgSU4g67Cw7Je0IOyymOumrOyZgCDrj5nsnbztlZjqsowg7ZWt7IOBIOywuOyduCDsobDqsbTsnYQg7IOd7ISx7ZWp64uI64ukLlxuICAgIGlmICh2YWx1ZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aGlzLmtuZXhRdWVyeS53aGVyZVJhdyhcIjEgPSAxXCIpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBwbGFjZWhvbGRlcnMgPSB2YWx1ZXMubWFwKCgpID0+IFwiP1wiKS5qb2luKFwiLCBcIik7XG4gICAgICB0aGlzLmtuZXhRdWVyeS53aGVyZVJhdyhgPz8gbm90IGluICgke3BsYWNlaG9sZGVyc30pYCwgW1N0cmluZyhjb2x1bW4pLCAuLi52YWx1ZXNdKTtcbiAgICB9XG4gICAgLy8gU0FGRVRZOiDsv7zrpqwg67mM642U7J2YIOygnOuEpOumrSDqs4Tslb3qs7wg7ISg7ZaJIOqygOymneydtCDsnbQg7YOA7J6F7J2EIOuztOyepe2VqeuLiOuLpC5cbiAgICByZXR1cm4gdGhpcyBhcyBhbnk7XG4gIH1cblxuICAvLyBXSEVSRSBKU09OQiBTVVBFUlNFVCAoQD4pXG4gIHdoZXJlSnNvblN1cGVyc2V0T2Y8VENvbHVtbiBleHRlbmRzIEpzb25Db2x1bW5zPFRUYWJsZXM+PihcbiAgICBjb2x1bW46IFRDb2x1bW4sXG4gICAgdmFsdWU6IEpzb25TdXBlcnNldFZhbHVlPEV4dHJhY3RDb2x1bW5UeXBlPFRUYWJsZXMsIFRDb2x1bW4+PixcbiAgKTogdGhpcyB7XG4gICAgdGhpcy5rbmV4UXVlcnkud2hlcmVKc29uU3VwZXJzZXRPZihjb2x1bW4sIHNlcmlhbGl6ZUpzb25TdXBlcnNldFZhbHVlKHZhbHVlKSk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICB3aGVyZUpzb25LZXlFeGlzdHMoY29sdW1uOiBKc29uQ29sdW1uczxUVGFibGVzPiwga2V5OiBzdHJpbmcpOiB0aGlzIHtcbiAgICB0aGlzLmtuZXhRdWVyeS53aGVyZVJhdyhcIj8/IFxcXFw/ID9cIiwgW2NvbHVtbiwga2V5XSk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvLyBXSEVSRSBNQVRDSFxuICB3aGVyZU1hdGNoPFRDb2x1bW4gZXh0ZW5kcyBGdWxsdGV4dENvbHVtbnM8VFRhYmxlcz4+KGNvbHVtbjogVENvbHVtbiwgdmFsdWU6IHN0cmluZyk6IHRoaXMge1xuICAgIHRoaXMua25leFF1ZXJ5LndoZXJlUmF3KGBNQVRDSCAoJHtTdHJpbmcoY29sdW1uKX0pIEFHQUlOU1QgKD8pYCwgW3ZhbHVlXSk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogUEdyb29uZ2EgRnVsbFRleHQg7J24642x7IqkIOqygOyDiVxuICAgKiAtIOyCrOyaqe2VoCBQR3Jvb25nYSDsnbjrjbHsiqTsmYAg64+Z7J287ZWcIOy7rOufvCDqtazshLHsnLzroZwg6rKA7IOJ7ZW07JW8IOyduOuNseyKpOqwgCDsgqzsmqnrkKnri4jri6QuXG4gICAqXG4gICAqIOuLqOydvCDsu6zrn7wg6rKA7IOJOlxuICAgKiBgYGBzcWxcbiAgICogV0hFUkUgbmFtZSAmQH4gJ3NlYXJjaCdcbiAgICogYGBgXG4gICAqXG4gICAqIOuzte2VqSDsu6zrn7wg6rKA7IOJOlxuICAgKiBgYGBzcWxcbiAgICogV0hFUkUgQVJSQVlbbmFtZTo6dGV4dCwgZGVzY3JpcHRpb246OnRleHRdICZAfiAnc2VhcmNoJ1xuICAgKiBgYGBcbiAgICovXG4gIHdoZXJlU2VhcmNoPFRDb2x1bW4gZXh0ZW5kcyBBdmFpbGFibGVDb2x1bW5zPFRUYWJsZXM+PihcbiAgICBjb2x1bW46IFRDb2x1bW4gfCBUQ29sdW1uW10sXG4gICAgdmFsdWU6IHN0cmluZyxcbiAgICBvcHRpb25zPzoge1xuICAgICAgd2VpZ2h0cz86IG51bWJlcltdOyAvLyDsoJXsiJgg67Cw7Je0XG4gICAgfSxcbiAgKTogdGhpcyB7XG4gICAgY29uc3QgeyB3ZWlnaHRzIH0gPSBvcHRpb25zID8/IHt9O1xuICAgIGNvbnN0IGNvbHVtbkV4cHIgPSBBcnJheS5pc0FycmF5KGNvbHVtbilcbiAgICAgID8gYEFSUkFZWyR7Y29sdW1uLm1hcCgoYykgPT4gYCR7Y306OnRleHRgKS5qb2luKFwiLFwiKX1dYFxuICAgICAgOiBjb2x1bW47XG4gICAgY29uc3QgcGdyb29uZ2FDb25kaXRpb24gPSBgcGdyb29uZ2FfY29uZGl0aW9uKD8ke3dlaWdodHM/Lmxlbmd0aCA/IGAsIHdlaWdodHMgPT4gQVJSQVlbJHt3ZWlnaHRzLmpvaW4oXCIsXCIpfV1gIDogXCJcIn0pYDtcblxuICAgIHRoaXMua25leFF1ZXJ5LndoZXJlUmF3KGAke2NvbHVtbkV4cHJ9ICZAfiAke3Bncm9vbmdhQ29uZGl0aW9ufWAsIFt2YWx1ZV0pO1xuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvLyBXSEVSRSBGVUxMVEVYVFxuICB3aGVyZVRzU2VhcmNoPFRDb2x1bW4gZXh0ZW5kcyBBdmFpbGFibGVDb2x1bW5zPFRUYWJsZXM+IHwgU3RyaW5nU3FsRXhwcmVzc2lvbj4oXG4gICAgY29sdW1uOiBUQ29sdW1uLFxuICAgIHZhbHVlOiBzdHJpbmcsXG4gICAgb3B0aW9ucz86IFRzUXVlcnlPcHRpb25zIHwgVHNRdWVyeUNvbmZpZyxcbiAgKTogdGhpcyB7XG4gICAgY29uc3Qgb3B0cyA9XG4gICAgICAvLyBTQUZFVFk6IOy/vOumrCDruYzrjZTsnZgg7KCc64Sk66atIOqzhOyVveqzvCDshKDtlokg6rKA7Kad7J20IOydtCDtg4DsnoXsnYQg67O07J6l7ZWp64uI64ukLlxuICAgICAgaXNTdHJpbmdWYWx1ZShvcHRpb25zKSA/ICh7IGNvbmZpZzogb3B0aW9ucyB9IGFzIFRzUXVlcnlPcHRpb25zKSA6IChvcHRpb25zID8/IHt9KTtcblxuICAgIGNvbnN0IHBhcnNlciA9IG9wdHMucGFyc2VyID8/IFwid2Vic2VhcmNoX3RvX3RzcXVlcnlcIjtcbiAgICBjb25zdCBjb25maWcgPSBvcHRzLmNvbmZpZyA/PyBcInNpbXBsZVwiO1xuICAgIGNvbnN0IGNvbHVtbkV4cHIgPSBpc1NxbEV4cHJlc3Npb24oY29sdW1uKSA/IGNvbHVtbltcIl9zcWxcIl0gOiBTdHJpbmcoY29sdW1uKTtcbiAgICBjb25zdCBwYXJhbXMgPSBpc1NxbEV4cHJlc3Npb24oY29sdW1uKVxuICAgICAgPyBbLi4uY29sdW1uW1wiX3BhcmFtc1wiXSwgY29uZmlnLCB2YWx1ZV1cbiAgICAgIDogW2NvbmZpZywgdmFsdWVdO1xuXG4gICAgdGhpcy5rbmV4UXVlcnkud2hlcmVSYXcoYCR7Y29sdW1uRXhwcn0gQEAgJHtwYXJzZXJ9KD8sID8pYCwgcGFyYW1zKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIHdoZXJlRnV6enk8VENvbHVtbiBleHRlbmRzIEF2YWlsYWJsZUNvbHVtbnM8VFRhYmxlcz4gfCBTdHJpbmdTcWxFeHByZXNzaW9uPihcbiAgICBjb2x1bW46IFRDb2x1bW4sXG4gICAgdmFsdWU6IHN0cmluZyxcbiAgICBvcHRpb25zPzoge1xuICAgICAgb3BlcmF0b3I/OiBGdXp6eU9wZXJhdG9yO1xuICAgIH0sXG4gICk6IHRoaXMge1xuICAgIGNvbnN0IG9wZXJhdG9yID0gcGFyc2VGdXp6eU9wZXJhdG9yKG9wdGlvbnM/Lm9wZXJhdG9yKTtcblxuICAgIGlmIChvcGVyYXRvciA9PT0gXCIlXCIpIHtcbiAgICAgIGlmIChpc1NxbEV4cHJlc3Npb24oY29sdW1uKSkge1xuICAgICAgICB0aGlzLmtuZXhRdWVyeS53aGVyZVJhdyhgJHtjb2x1bW5bXCJfc3FsXCJdfSAke29wZXJhdG9yfSA/YCwgWy4uLmNvbHVtbltcIl9wYXJhbXNcIl0sIHZhbHVlXSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmtuZXhRdWVyeS53aGVyZVJhdyhgPz8gJHtvcGVyYXRvcn0gP2AsIFtjb2x1bW4sIHZhbHVlXSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBpZiAoaXNTcWxFeHByZXNzaW9uKGNvbHVtbikpIHtcbiAgICAgIHRoaXMua25leFF1ZXJ5LndoZXJlUmF3KGA/ICR7b3BlcmF0b3J9ICR7Y29sdW1uW1wiX3NxbFwiXX1gLCBbdmFsdWUsIC4uLmNvbHVtbltcIl9wYXJhbXNcIl1dKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5rbmV4UXVlcnkud2hlcmVSYXcoYD8gJHtvcGVyYXRvcn0gPz9gLCBbdmFsdWUsIGNvbHVtbl0pO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8vIFdIRVJFIFJBV1xuICB3aGVyZVJhdyhzcWw6IHN0cmluZywgYmluZGluZ3M/OiByZWFkb25seSBLbmV4LlJhd0JpbmRpbmdbXSk6IHRoaXMge1xuICAgIHRoaXMua25leFF1ZXJ5LndoZXJlUmF3KHNxbCwgYmluZGluZ3MpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLy8gV0hFUkUg6rSE7Zi4IOq3uOujue2VkVxuICB3aGVyZUdyb3VwKGNhbGxiYWNrOiAoZzogV2hlcmVHcm91cDxUVGFibGVzPikgPT4gdm9pZCk6IHRoaXMge1xuICAgIHRoaXMua25leFF1ZXJ5LndoZXJlKChidWlsZGVyKSA9PiB7XG4gICAgICBjb25zdCBncm91cCA9IG5ldyBXaGVyZUdyb3VwPFRUYWJsZXM+KGJ1aWxkZXIpO1xuICAgICAgY2FsbGJhY2soZ3JvdXApO1xuICAgIH0pO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG4gIG9yV2hlcmVHcm91cChjYWxsYmFjazogKGc6IFdoZXJlR3JvdXA8VFRhYmxlcz4pID0+IHZvaWQpOiB0aGlzIHtcbiAgICB0aGlzLmtuZXhRdWVyeS5vcldoZXJlKChidWlsZGVyKSA9PiB7XG4gICAgICBjb25zdCBncm91cCA9IG5ldyBXaGVyZUdyb3VwPFRUYWJsZXM+KGJ1aWxkZXIpO1xuICAgICAgY2FsbGJhY2soZ3JvdXApO1xuICAgIH0pO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLy8gT1JERVIgQlkgKFNxbEV4cHJlc3Npb27snLzroZzrj4Qg7ZWgIOyImCDsnojslrTslbwg7ZWoKVxuICBvcmRlckJ5PFRDb2x1bW4gZXh0ZW5kcyBSZXN1bHRBdmFpbGFibGVDb2x1bW5zPFRUYWJsZXMsIFRSZXN1bHQ+PihcbiAgICBjb2x1bW46IFRDb2x1bW4gfCBQdXJpT3JkZXJCeUV4cHJlc3Npb24sXG4gICAgZGlyZWN0aW9uPzogUHVyaU9yZGVyQnlEaXJlY3Rpb24sXG4gICAgbnVsbHM/OiBQdXJpT3JkZXJCeU51bGxzLFxuICApOiB0aGlzO1xuICBvcmRlckJ5PFRDb2x1bW4gZXh0ZW5kcyBSZXN1bHRBdmFpbGFibGVDb2x1bW5zPFRUYWJsZXMsIFRSZXN1bHQ+PihcbiAgICBjb2x1bW5zOiByZWFkb25seSBQdXJpT3JkZXJCeUVudHJ5PFRDb2x1bW4+W10sXG4gICk6IHRoaXM7XG4gIG9yZGVyQnkoXG4gICAgY29sdW1uT3JDb2x1bW5zOiBzdHJpbmcgfCBQdXJpT3JkZXJCeUV4cHJlc3Npb24gfCByZWFkb25seSBQdXJpT3JkZXJCeVJ1bnRpbWVFbnRyeVtdLFxuICAgIGRpcmVjdGlvbjogUHVyaU9yZGVyQnlEaXJlY3Rpb24gPSBcImFzY1wiLFxuICAgIG51bGxzPzogUHVyaU9yZGVyQnlOdWxscyxcbiAgKTogdGhpcyB7XG4gICAgaWYgKGlzT3JkZXJCeUVudHJpZXMoY29sdW1uT3JDb2x1bW5zKSkge1xuICAgICAgZm9yIChjb25zdCBlbnRyeSBvZiBjb2x1bW5PckNvbHVtbnMpIHtcbiAgICAgICAgaWYgKGlzU3RyaW5nVmFsdWUoZW50cnkpIHx8IGlzT3JkZXJCeUV4cHJlc3Npb24oZW50cnkpKSB7XG4gICAgICAgICAgdGhpcy5hcHBseU9yZGVyQnkoZW50cnkpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMuYXBwbHlPcmRlckJ5KGVudHJ5LmNvbHVtbiwgZW50cnkub3JkZXIsIGVudHJ5Lm51bGxzKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgdGhpcy5hcHBseU9yZGVyQnkoY29sdW1uT3JDb2x1bW5zLCBkaXJlY3Rpb24sIG51bGxzKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIHByaXZhdGUgYXBwbHlPcmRlckJ5KFxuICAgIGNvbHVtbjogc3RyaW5nIHwgUHVyaU9yZGVyQnlFeHByZXNzaW9uLFxuICAgIGRpcmVjdGlvbj86IFB1cmlPcmRlckJ5RGlyZWN0aW9uLFxuICAgIG51bGxzPzogUHVyaU9yZGVyQnlOdWxscyxcbiAgKTogdm9pZCB7XG4gICAgY29uc3Qgbm9ybWFsaXplZERpcmVjdGlvbiA9IG5vcm1hbGl6ZU9yZGVyQnlEaXJlY3Rpb24oZGlyZWN0aW9uKTtcbiAgICBjb25zdCBub3JtYWxpemVkTnVsbHMgPSBub3JtYWxpemVPcmRlckJ5TnVsbHMobnVsbHMpO1xuXG4gICAgaWYgKGlzT3JkZXJCeUV4cHJlc3Npb24oY29sdW1uKSkge1xuICAgICAgdGhpcy5rbmV4UXVlcnkub3JkZXJCeVJhdyhcbiAgICAgICAgYCR7Y29sdW1uW1wiX3NxbFwiXX0gJHtub3JtYWxpemVkRGlyZWN0aW9ufSR7Zm9ybWF0TnVsbHNTdWZmaXgobm9ybWFsaXplZE51bGxzKX1gLFxuICAgICAgICBjb2x1bW5bXCJfcGFyYW1zXCJdLFxuICAgICAgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5rbmV4UXVlcnkub3JkZXJCeShjb2x1bW4sIG5vcm1hbGl6ZWREaXJlY3Rpb24sIG5vcm1hbGl6ZWROdWxscyk7XG4gICAgfVxuICB9XG5cbiAgZm9yVXBkYXRlKCk6IHRoaXMge1xuICAgIHRoaXMua25leFF1ZXJ5LmZvclVwZGF0ZSgpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgZm9yU2hhcmUoKTogdGhpcyB7XG4gICAgdGhpcy5rbmV4UXVlcnkuZm9yU2hhcmUoKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiDrsqHthLAg7Jyg7IKs64+EIOqygOyDiSDshKTsoJVcbiAgICpcbiAgICogLSBTRUxFQ1Tsl5Agc2ltaWxhcml0eSDsu6zrn7wg7LaU6rCAXG4gICAqIC0gV0hFUkUgY29sIElTIE5PVCBOVUxMIOy2lOqwgFxuICAgKiAtIHRocmVzaG9sZOqwgCDsnojsnLzrqbQgV0hFUkUg7KGw6rG0IOy2lOqwgFxuICAgKiAtIOq4sOyhtCBPUkRFUiBCWeulvCBjbGVhcu2VmOqzoCDsm5Dsi5wg7Jew7IKw7J6Q66GcIOygleugrCAoSE5TVyDsnbjrjbHsiqQg7LWc7KCB7ZmUKVxuICAgKlxuICAgKiBAcGFyYW0gY29sdW1uIOuyoe2EsCDsu6zrn7wg6rK966GcXG4gICAqIEBwYXJhbSBlbWJlZGRpbmcg7L+866asIOyehOuyoOuUqSDrsqHthLBcbiAgICogQHBhcmFtIG9wdGlvbnMgbWV0aG9kLCB0aHJlc2hvbGQsIGFzIOuTsSDsmLXshZhcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiAvLyBjb3NpbmUgc2ltaWxhcml0eSAo6riw67O46rCSKVxuICAgKiBxYi52ZWN0b3JTaW1pbGFyaXR5KFwiY29sdW1uTmFtZVwiLCBxdWVyeVZlY3Rvciwge1xuICAgKiAgIG1ldGhvZDogXCJjb3NpbmVcIixcbiAgICogICB0aHJlc2hvbGQ6IDAuNVxuICAgKiB9KTtcbiAgICpcbiAgICogLy8gTDIgZGlzdGFuY2VcbiAgICogcWIudmVjdG9yU2ltaWxhcml0eShcImNvbHVtbk5hbWVcIiwgcXVlcnlWZWN0b3IsIHtcbiAgICogICBtZXRob2Q6IFwibDJcIixcbiAgICogICB0aHJlc2hvbGQ6IDEuNSAgLy8g6rGw66as6rCAIDEuNSDsnbTtlZjsnbgg6rKw6rO866eMXG4gICAqIH0pO1xuICAgKlxuICAgKiAvLyBJbm5lciBwcm9kdWN0XG4gICAqIHFiLnZlY3RvclNpbWlsYXJpdHkoXCJjb2x1bW5OYW1lXCIsIHF1ZXJ5VmVjdG9yLCB7XG4gICAqICAgbWV0aG9kOiBcImlubmVyX3Byb2R1Y3RcIixcbiAgICogICB0aHJlc2hvbGQ6IDAuN1xuICAgKiB9KTtcbiAgICogYGBgXG4gICAqL1xuICB2ZWN0b3JTaW1pbGFyaXR5KFxuICAgIGNvbHVtbjogVmVjdG9yQ29sdW1uczxUVGFibGVzPixcbiAgICBlbWJlZGRpbmc6IG51bWJlcltdLFxuICAgIG9wdGlvbnM6IHtcbiAgICAgIG1ldGhvZD86IFwiY29zaW5lXCIgfCBcImwyXCIgfCBcImlubmVyX3Byb2R1Y3RcIjtcbiAgICAgIHRocmVzaG9sZD86IG51bWJlcjtcbiAgICAgIGRpc3RpbmN0T24/OiBBdmFpbGFibGVDb2x1bW5zPFRUYWJsZXM+O1xuICAgIH0gPSB7fSxcbiAgKTogUHVyaTxUU2NoZW1hLCBUVGFibGVzLCBUUmVzdWx0ICYgeyBzaW1pbGFyaXR5OiBudW1iZXIgfT4ge1xuICAgIGNvbnN0IHsgbWV0aG9kID0gXCJjb3NpbmVcIiwgdGhyZXNob2xkLCBkaXN0aW5jdE9uIH0gPSBvcHRpb25zO1xuXG4gICAgaWYgKFxuICAgICAgIUFycmF5LmlzQXJyYXkoZW1iZWRkaW5nKSB8fFxuICAgICAgZW1iZWRkaW5nLmxlbmd0aCA9PT0gMCB8fFxuICAgICAgZW1iZWRkaW5nLnNvbWUoKHYpID0+ICFOdW1iZXIuaXNGaW5pdGUodikpXG4gICAgKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIGVtYmVkZGluZyB2ZWN0b3I6IGV4cGVjdGVkIGEgbm9uLWVtcHR5IGFycmF5IG9mIGZpbml0ZSBudW1iZXJzXCIpO1xuICAgIH1cblxuICAgIGNvbnN0IHZlY3RvckxpdGVyYWwgPSBKU09OLnN0cmluZ2lmeShlbWJlZGRpbmcubWFwKCh2KSA9PiBOdW1iZXIodikpKTtcbiAgICBjb25zdCBvcGVyYXRvciA9IHsgY29zaW5lOiBcIjw9PlwiLCBsMjogXCI8LT5cIiwgaW5uZXJfcHJvZHVjdDogXCI8Iz5cIiB9W21ldGhvZF07XG5cbiAgICAvLyBtZXRob2Trs4Qg7Jew7IKw7J6QIOuwjyBzaW1pbGFyaXR5IOqzhOyCsOyLnVxuICAgIC8vIC0gY29zaW5lOiA8PT4gKGNvc2luZSBkaXN0YW5jZSwgMH4yKSwgc2ltaWxhcml0eSA9IDEgLSBkaXN0YW5jZVxuICAgIC8vIC0gbDI6IDwtPiAoZXVjbGlkZWFuIGRpc3RhbmNlKSwgc2ltaWxhcml0eSA9IGRpc3RhbmNlICjrgq7snYTsiJjroZ0g7Jyg7IKsKVxuICAgIC8vIC0gaW5uZXJfcHJvZHVjdDogPCM+IChuZWdhdGl2ZSBpbm5lciBwcm9kdWN0KSwgc2ltaWxhcml0eSA9IC1kaXN0YW5jZSAo64aS7J2E7IiY66GdIOycoOyCrClcbiAgICBjb25zdCBzaW1pbGFyaXR5RXhwciA9XG4gICAgICBtZXRob2QgPT09IFwiY29zaW5lXCJcbiAgICAgICAgPyB0aGlzLmtuZXgucmF3KGAxIC0gKD8/ICR7b3BlcmF0b3J9ID86OnZlY3RvcikgYXMgc2ltaWxhcml0eWAsIFtjb2x1bW4sIHZlY3RvckxpdGVyYWxdKVxuICAgICAgICA6IG1ldGhvZCA9PT0gXCJsMlwiXG4gICAgICAgICAgPyB0aGlzLmtuZXgucmF3KGA/PyAke29wZXJhdG9yfSA/Ojp2ZWN0b3IgYXMgc2ltaWxhcml0eWAsIFtjb2x1bW4sIHZlY3RvckxpdGVyYWxdKVxuICAgICAgICAgIDogdGhpcy5rbmV4LnJhdyhgLSg/PyAke29wZXJhdG9yfSA/Ojp2ZWN0b3IpIGFzIHNpbWlsYXJpdHlgLCBbY29sdW1uLCB2ZWN0b3JMaXRlcmFsXSk7XG5cbiAgICAvLyBXSEVSRSBOT1QgTlVMTFxuICAgIHRoaXMua25leFF1ZXJ5LndoZXJlTm90TnVsbChjb2x1bW4pO1xuXG4gICAgLy8g6riw7KG0IE9SREVSIEJZIGNsZWFyXG4gICAgdGhpcy5rbmV4UXVlcnkuY2xlYXIoXCJvcmRlclwiKTtcbiAgICBpZiAoZGlzdGluY3RPbikge1xuICAgICAgLy8gRElTVElOQ1QgT07snYAgU0VMRUNUIOygiOydmCDrp6gg7JWe7JeQIOyZgOyVvCDtlZjrr4DroZwsIOq4sOyhtCBzZWxlY3Qoc3Vic2V0IO2VhOuTnOuTpCnrpbwg67O07KG0IO2bhCBjbGVhcu2VmOqzoCDri6Tsi5wg7LaU6rCAXG4gICAgICAvLyBTQUZFVFk6IOy/vOumrCDruYzrjZTsnZgg7KCc64Sk66atIOqzhOyVveqzvCDshKDtlokg6rKA7Kad7J20IOydtCDtg4DsnoXsnYQg67O07J6l7ZWp64uI64ukLlxuICAgICAgY29uc3QgZXhpc3RpbmdTdWJzZXRDb2xzID0gKHRoaXMua25leFF1ZXJ5IGFzIGFueSlbXCJfc3RhdGVtZW50c1wiXVxuICAgICAgICAuZmlsdGVyKChzOiBhbnkpID0+IHMuZ3JvdXBpbmcgPT09IFwiY29sdW1uc1wiKVxuICAgICAgICAuZmxhdE1hcCgoczogYW55KSA9PiBzLnZhbHVlKTtcbiAgICAgIHRoaXMua25leFF1ZXJ5LmNsZWFyKFwic2VsZWN0XCIpO1xuICAgICAgdGhpcy5rbmV4UXVlcnkuc2VsZWN0KHRoaXMua25leC5yYXcoYERJU1RJTkNUIE9OICg/PykgPz9gLCBbZGlzdGluY3RPbiwgZGlzdGluY3RPbl0pKTtcbiAgICAgIGV4aXN0aW5nU3Vic2V0Q29scy5tYXAoKGNvbDogYW55KSA9PiB0aGlzLmtuZXhRdWVyeS5zZWxlY3QoY29sKSk7XG4gICAgICB0aGlzLmtuZXhRdWVyeS5zZWxlY3Qoc2ltaWxhcml0eUV4cHIpO1xuICAgICAgdGhpcy5rbmV4UXVlcnkub3JkZXJCeVJhdyhgPz8sID8/ICR7b3BlcmF0b3J9ID86OnZlY3RvcmAsIFtcbiAgICAgICAgZGlzdGluY3RPbixcbiAgICAgICAgY29sdW1uLFxuICAgICAgICB2ZWN0b3JMaXRlcmFsLFxuICAgICAgXSk7XG5cbiAgICAgIHRoaXMua25leFF1ZXJ5ID0gdGhpcy5rbmV4XG4gICAgICAgIC5mcm9tKHRoaXMua25leFF1ZXJ5LmFzKFwiZGlzdGluY3RfdmVjdG9yc1wiKSlcbiAgICAgICAgLnNlbGVjdChcIipcIilcbiAgICAgICAgLm9yZGVyQnkoXCJzaW1pbGFyaXR5XCIsIFwiZGVzY1wiKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5rbmV4UXVlcnkuc2VsZWN0KHNpbWlsYXJpdHlFeHByKTtcbiAgICAgIHRoaXMua25leFF1ZXJ5Lm9yZGVyQnlSYXcoYD8/ICR7b3BlcmF0b3J9ID86OnZlY3RvcmAsIFtjb2x1bW4sIHZlY3RvckxpdGVyYWxdKTtcbiAgICB9XG5cbiAgICAvLyB0aHJlc2hvbGRcbiAgICBpZiAoaXNOdW1iZXJWYWx1ZSh0aHJlc2hvbGQpKSB7XG4gICAgICBpZiAoIU51bWJlci5pc0Zpbml0ZSh0aHJlc2hvbGQpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCB2ZWN0b3JTaW1pbGFyaXR5IHRocmVzaG9sZDogJHt0aHJlc2hvbGR9YCk7XG4gICAgICB9XG5cbiAgICAgIGlmIChkaXN0aW5jdE9uKSB7XG4gICAgICAgIGNvbnN0IHRocmVzaG9sZE9wID0gbWV0aG9kID09PSBcImwyXCIgPyBcIjw9XCIgOiBcIj49XCI7XG4gICAgICAgIHRoaXMua25leFF1ZXJ5LndoZXJlKFwic2ltaWxhcml0eVwiLCB0aHJlc2hvbGRPcCwgdGhyZXNob2xkKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IHRocmVzaG9sZFZhbHVlID1cbiAgICAgICAgICBtZXRob2QgPT09IFwiY29zaW5lXCIgPyAxIC0gdGhyZXNob2xkIDogbWV0aG9kID09PSBcImlubmVyX3Byb2R1Y3RcIiA/IC10aHJlc2hvbGQgOiB0aHJlc2hvbGQ7XG4gICAgICAgIHRoaXMua25leFF1ZXJ5LndoZXJlUmF3KGA/PyAke29wZXJhdG9yfSA/Ojp2ZWN0b3IgPD0gP2AsIFtcbiAgICAgICAgICBjb2x1bW4sXG4gICAgICAgICAgdmVjdG9yTGl0ZXJhbCxcbiAgICAgICAgICB0aHJlc2hvbGRWYWx1ZSxcbiAgICAgICAgXSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gU0FGRVRZOiDsv7zrpqwg67mM642U7J2YIOygnOuEpOumrSDqs4Tslb3qs7wg7ISg7ZaJIOqygOymneydtCDsnbQg7YOA7J6F7J2EIOuztOyepe2VqeuLiOuLpC5cbiAgICByZXR1cm4gdGhpcyBhcyBhbnk7XG4gIH1cblxuICAvLyDquLDrs7gg7L+866asIOuplOyEnOuTnOuTpFxuICBsaW1pdChjb3VudDogbnVtYmVyKTogdGhpcyB7XG4gICAgaWYgKGNvdW50IDwgMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiSW52YWxpZCBsaW1pdDogbXVzdCBiZSA+PSAwXCIpO1xuICAgIH1cbiAgICB0aGlzLmtuZXhRdWVyeS5saW1pdChjb3VudCk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBvZmZzZXQoY291bnQ6IG51bWJlcik6IHRoaXMge1xuICAgIGlmIChjb3VudCA8IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIkludmFsaWQgb2Zmc2V0OiBtdXN0IGJlID49IDBcIik7XG4gICAgfVxuICAgIHRoaXMua25leFF1ZXJ5Lm9mZnNldChjb3VudCk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvLyBHUk9VUCBCWVxuICBncm91cEJ5PFRDb2x1bW5zIGV4dGVuZHMgUmVzdWx0QXZhaWxhYmxlQ29sdW1uczxUVGFibGVzLCBUUmVzdWx0Pj4oLi4uY29sdW1uczogVENvbHVtbnNbXSk6IHRoaXM7XG4gIGdyb3VwQnkoLi4uY29sdW1uczogc3RyaW5nW10pOiB0aGlzIHtcbiAgICB0aGlzLmtuZXhRdWVyeS5ncm91cEJ5KC4uLmNvbHVtbnMpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLy8gSEFWSU5HXG4gIGhhdmluZyhjb25kaXRpb246IHN0cmluZyk6IHRoaXM7XG4gIGhhdmluZzxUQ29sdW1uIGV4dGVuZHMgUmVzdWx0QXZhaWxhYmxlQ29sdW1uczxUVGFibGVzLCBUUmVzdWx0Pj4oXG4gICAgY29sdW1uOiBUQ29sdW1uLFxuICAgIG9wZXJhdG9yOiBDb21wYXJpc29uT3BlcmF0b3IsXG4gICAgdmFsdWU6IGFueSxcbiAgKTogdGhpcztcbiAgLy8gSEFWSU5HIOq1rO2YhFxuICBoYXZpbmcoLi4uY29uZGl0aW9uczogYW55W10pOiB0aGlzIHtcbiAgICBpZiAoY29uZGl0aW9ucy5sZW5ndGggPT09IDEpIHtcbiAgICAgIC8vIGhhdmluZyhcIkNPVU5UKCopID4gMTBcIilcbiAgICAgIHRoaXMua25leFF1ZXJ5LmhhdmluZyh0aGlzLmtuZXgucmF3KGNvbmRpdGlvbnNbMF0pKTtcbiAgICB9IGVsc2UgaWYgKGNvbmRpdGlvbnMubGVuZ3RoID09PSAzKSB7XG4gICAgICAvLyBoYXZpbmcoXCJjb3VudFwiLCBcIj5cIiwgMTApXG4gICAgICB0aGlzLmtuZXhRdWVyeS5oYXZpbmcoXG4gICAgICAgIHRoaXMua25leC5yYXcoY29uZGl0aW9uc1swXSksXG4gICAgICAgIGNvbmRpdGlvbnNbMV0sXG4gICAgICAgIHRoaXMua25leC5yYXcoY29uZGl0aW9uc1syXSksXG4gICAgICApO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIGhhdmluZyBhcmd1bWVudHNcIik7XG4gICAgfVxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLy8g7Iuk7ZaJIOuplOyEnOuTnOuTpCAtIHRoZW5hYmxlIOq1rO2YhFxuICB0aGVuPFRSZXN1bHQxID0gRXhwYW5kPFRSZXN1bHQ+W10sIFRSZXN1bHQyID0gbmV2ZXI+KFxuICAgIG9uZnVsZmlsbGVkPzogKCh2YWx1ZTogRXhwYW5kPFRSZXN1bHQ+W10pID0+IFRSZXN1bHQxIHwgUHJvbWlzZUxpa2U8VFJlc3VsdDE+KSB8IG51bGwsXG4gICAgb25yZWplY3RlZD86ICgocmVhc29uOiBhbnkpID0+IFRSZXN1bHQyIHwgUHJvbWlzZUxpa2U8VFJlc3VsdDI+KSB8IG51bGwsXG4gICk6IFByb21pc2U8VFJlc3VsdDEgfCBUUmVzdWx0Mj4ge1xuICAgIE5haXRlLnQoXCJwdXJpOmV4ZWN1dGVkLXF1ZXJ5XCIsIHRoaXMudG9RdWVyeSgpKTtcbiAgICAvLyBTQUZFVFk6IOy/vOumrCDruYzrjZTsnZgg7KCc64Sk66atIOqzhOyVveqzvCDshKDtlokg6rKA7Kad7J20IOydtCDtg4DsnoXsnYQg67O07J6l7ZWp64uI64ukLlxuICAgIHJldHVybiB0aGlzLmtuZXhRdWVyeS50aGVuKG9uZnVsZmlsbGVkIGFzIGFueSwgb25yZWplY3RlZCk7XG4gIH1cbiAgY2F0Y2g8VFJlc3VsdDIgPSBuZXZlcj4oXG4gICAgb25yZWplY3RlZD86ICgocmVhc29uOiBhbnkpID0+IFRSZXN1bHQyIHwgUHJvbWlzZUxpa2U8VFJlc3VsdDI+KSB8IG51bGwsXG4gICk6IFByb21pc2U8VFJlc3VsdCB8IFRSZXN1bHQyPiB7XG4gICAgcmV0dXJuIHRoaXMua25leFF1ZXJ5LmNhdGNoKG9ucmVqZWN0ZWQpO1xuICB9XG4gIGZpbmFsbHkob25maW5hbGx5PzogKCgpID0+IHZvaWQpIHwgbnVsbCk6IFByb21pc2U8VFJlc3VsdD4ge1xuICAgIHJldHVybiB0aGlzLmtuZXhRdWVyeS5maW5hbGx5KG9uZmluYWxseSk7XG4gIH1cblxuICAvLyDtlZjrgpjrp4wg7L+866asXG4gIGZpcnN0KCk6IFJlc29sdmVkUHVyaTxFeHBhbmQ8VFJlc3VsdD4sIG5ldmVyPiB7XG4gICAgdGhpcy5rbmV4UXVlcnkuZmlyc3QoKTtcbiAgICByZXR1cm4gbmV3IFJlc29sdmVkUHVyaSh0aGlzLmtuZXhRdWVyeSwgdGhpcy5rbmV4LCB0aGlzLnRhYmxlU3BlYyk7XG4gIH1cblxuICAvLyDsv7zrpqztlZwg66CI7L2U65Oc7JeQ7IScIO2KueyglSDsu6zrn7zrp4wg7LaU7Lac7ZWcIOuwsOyXtCDrpqzthLRcbiAgcGx1Y2s8VENvbHVtbiBleHRlbmRzIGtleW9mIFRSZXN1bHQgfCBSZXN1bHRBdmFpbGFibGVDb2x1bW5zPFRUYWJsZXMsIFRSZXN1bHQ+PihcbiAgICBjb2x1bW46IFRDb2x1bW4sXG4gICk6IFJlc29sdmVkUHVyaTxcbiAgICBUQ29sdW1uIGV4dGVuZHMga2V5b2YgVFJlc3VsdFxuICAgICAgPyBUUmVzdWx0W1RDb2x1bW5dW11cbiAgICAgIDogRXh0cmFjdENvbHVtblR5cGU8VFRhYmxlcywgVENvbHVtbiAmIHN0cmluZz5bXSxcbiAgICBuZXZlclxuICA+IHtcbiAgICAvLyBTQUZFVFk6IOy/vOumrCDruYzrjZTsnZgg7KCc64Sk66atIOqzhOyVveqzvCDshKDtlokg6rKA7Kad7J20IOydtCDtg4DsnoXsnYQg67O07J6l7ZWp64uI64ukLlxuICAgIHRoaXMua25leFF1ZXJ5LnBsdWNrKGNvbHVtbiBhcyBzdHJpbmcpO1xuICAgIHJldHVybiBuZXcgUmVzb2x2ZWRQdXJpKHRoaXMua25leFF1ZXJ5LCB0aGlzLmtuZXgsIHRoaXMudGFibGVTcGVjKTtcbiAgfVxuXG4gIC8vIElOU0VSVCA6IOuLqOydvCDqsJ3ssrRcbiAgaW5zZXJ0KFxuICAgIGRhdGE6IEluc2VydERhdGE8U2luZ2xlVGFibGVWYWx1ZTxUVGFibGVzPj4sXG4gICk6IFJlc29sdmVkUHVyaTxJbnNlcnRSZXN1bHQsIFNpbmdsZVRhYmxlVmFsdWU8VFRhYmxlcz4+O1xuICAvLyBJTlNFUlQ6IOuwsOyXtFxuICBpbnNlcnQoXG4gICAgZGF0YTogSW5zZXJ0RGF0YTxTaW5nbGVUYWJsZVZhbHVlPFRUYWJsZXM+PltdLFxuICApOiBSZXNvbHZlZFB1cmk8SW5zZXJ0UmVzdWx0LCBTaW5nbGVUYWJsZVZhbHVlPFRUYWJsZXM+PjtcbiAgLy8gSU5TRVJUIOyLpOygnCDqtaztmIRcbiAgaW5zZXJ0KFxuICAgIHJhd0RhdGE6IEluc2VydERhdGE8U2luZ2xlVGFibGVWYWx1ZTxUVGFibGVzPj4gfCBJbnNlcnREYXRhPFNpbmdsZVRhYmxlVmFsdWU8VFRhYmxlcz4+W10sXG4gICk6IFJlc29sdmVkUHVyaTxJbnNlcnRSZXN1bHQsIFNpbmdsZVRhYmxlVmFsdWU8VFRhYmxlcz4+IHtcbiAgICAvLyBKU09OIOy7rOufvCBzdHJpbmdpZnkg66Gc7KeB7J2EIOuplOyEnOuTnOuhnCDrtoTrpqztlZjsl6wg7KSR67O1IOygnOqxsFxuICAgIGNvbnN0IHJlZmluZWREYXRhID0gdGhpcy5yZWZpbmVKc29uQ29sdW1ucyhyYXdEYXRhKTtcbiAgICB0aGlzLmtuZXhRdWVyeS5pbnNlcnQocmVmaW5lZERhdGEpO1xuICAgIHJldHVybiBuZXcgUmVzb2x2ZWRQdXJpKHRoaXMua25leFF1ZXJ5LCB0aGlzLmtuZXgsIHRoaXMudGFibGVTcGVjKTtcbiAgfVxuXG4gIC8vIFVQREFURVxuICB1cGRhdGUocmF3RGF0YTogV2hlcmVDb25kaXRpb248VFRhYmxlcz4pOiBSZXNvbHZlZFB1cmk8bnVtYmVyLCBTaW5nbGVUYWJsZVZhbHVlPFRUYWJsZXM+PiB7XG4gICAgLy8gSlNPTiDsu6zrn7wgc3RyaW5naWZ5IOuhnOyngeydhCDrqZTshJzrk5zroZwg67aE66as7ZWY7JesIOykkeuztSDsoJzqsbBcbiAgICBjb25zdCByZWZpbmVkRGF0YSA9IHRoaXMucmVmaW5lSnNvbkNvbHVtbnMocmF3RGF0YSk7XG4gICAgdGhpcy5rbmV4UXVlcnkudXBkYXRlKHJlZmluZWREYXRhKTtcbiAgICByZXR1cm4gbmV3IFJlc29sdmVkUHVyaSh0aGlzLmtuZXhRdWVyeSwgdGhpcy5rbmV4LCB0aGlzLnRhYmxlU3BlYyk7XG4gIH1cblxuICAvKipcbiAgICogSlNPTiDsu6zrn7zsl5Ag64yA7ZW0IHN0cmluZ2lmeSDsspjrpqzrpbwg7IiY7ZaJ7ZWY64qUIOuCtOu2gCDrqZTshJzrk5zsnoXri4jri6QuXG4gICAqIG9iamVjdCDrmJDripQgb2JqZWN0IOuwsOyXtOydhCDrsJvqs6AsIEpTT04g7Lus65+87J20IOyeiOycvOuptCDsp4HroKztmZTtlZjsl6wg67CY7ZmY7ZWp64uI64ukLlxuICAgKiDsp4HsoJEg6rCS7J2EIOuzgOqyve2VmOuvgOuhnCBzaWRlIGVmZmVjdOqwgCDsnojsirXri4jri6QuXG4gICAqL1xuICBwcml2YXRlIHJlZmluZUpzb25Db2x1bW5zPFJvdyBleHRlbmRzIG9iamVjdD4oZGF0YTogUm93IHwgUm93W10pOiB0eXBlb2YgZGF0YSB7XG4gICAgLy8gdGFibGVTcGVj7J2064KYIGpzb25Db2x1bW5zIOyXhuuKlCDqsr3smrAg67CU66GcIOuwmO2ZmFxuICAgIGlmICghdGhpcy50YWJsZVNwZWMgfHwgIXRoaXMudGFibGVTcGVjLmpzb25Db2x1bW5zLmxlbmd0aCkge1xuICAgICAgcmV0dXJuIGRhdGE7XG4gICAgfVxuXG4gICAgLy8g65Ox66Gd65CcIFRhYmxlU3BlY+ydhCDthrXtlbQgSlNPTuy7rOufvCDrqqnroZ3snYQg6rCA7KC47JmAIEpTT04uc3RyaW5naWZ5IOyymOumrFxuICAgIGNvbnN0IGpzb25Db2x1bW5zID0gdGhpcy50YWJsZVNwZWMuanNvbkNvbHVtbnM7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkoZGF0YSkpIHtcbiAgICAgIGZvciAoY29uc3QgaXRlbSBvZiBkYXRhKSB7XG4gICAgICAgIGZvciAoY29uc3QgY29sdW1uIG9mIGpzb25Db2x1bW5zKSB7XG4gICAgICAgICAgY29uc3QgdmFsdWUgPSBPYmplY3QuZW50cmllcyhpdGVtKS5maW5kKChba2V5XSkgPT4ga2V5ID09PSBjb2x1bW4pPy5bMV07XG4gICAgICAgICAgaWYgKHZhbHVlICE9PSB1bmRlZmluZWQgJiYgdmFsdWUgIT09IG51bGwpIHtcbiAgICAgICAgICAgIE9iamVjdC5hc3NpZ24oaXRlbSwge1xuICAgICAgICAgICAgICBbY29sdW1uXTogc2VyaWFsaXplSnNvbkNvbHVtblZhbHVlKHRoaXMudGFibGVTcGVjLCBjb2x1bW4sIHZhbHVlKSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBmb3IgKGNvbnN0IGNvbHVtbiBvZiBqc29uQ29sdW1ucykge1xuICAgICAgICBjb25zdCB2YWx1ZSA9IE9iamVjdC5lbnRyaWVzKGRhdGEpLmZpbmQoKFtrZXldKSA9PiBrZXkgPT09IGNvbHVtbik/LlsxXTtcbiAgICAgICAgaWYgKHZhbHVlICE9PSB1bmRlZmluZWQgJiYgdmFsdWUgIT09IG51bGwpIHtcbiAgICAgICAgICBPYmplY3QuYXNzaWduKGRhdGEsIHtcbiAgICAgICAgICAgIFtjb2x1bW5dOiBzZXJpYWxpemVKc29uQ29sdW1uVmFsdWUodGhpcy50YWJsZVNwZWMsIGNvbHVtbiwgdmFsdWUpLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBkYXRhO1xuICB9XG5cbiAgLy8gSW5jcmVtZW50XG4gIGluY3JlbWVudDxUQ29sdW1uIGV4dGVuZHMgTnVtZXJpY0NvbHVtbnM8VFRhYmxlcz4+KFxuICAgIGNvbHVtbjogVENvbHVtbixcbiAgICB2YWx1ZTogbnVtYmVyLFxuICApOiBSZXNvbHZlZFB1cmk8bnVtYmVyLCBTaW5nbGVUYWJsZVZhbHVlPFRUYWJsZXM+PiB7XG4gICAgaWYgKHZhbHVlIDw9IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIkluY3JlbWVudCB2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAwXCIpO1xuICAgIH1cbiAgICB0aGlzLmtuZXhRdWVyeS5pbmNyZW1lbnQoY29sdW1uLCB2YWx1ZSk7XG4gICAgcmV0dXJuIG5ldyBSZXNvbHZlZFB1cmkodGhpcy5rbmV4UXVlcnksIHRoaXMua25leCwgdGhpcy50YWJsZVNwZWMpO1xuICB9XG4gIC8vIERlY3JlbWVudFxuICBkZWNyZW1lbnQ8VENvbHVtbiBleHRlbmRzIE51bWVyaWNDb2x1bW5zPFRUYWJsZXM+PihcbiAgICBjb2x1bW46IFRDb2x1bW4sXG4gICAgdmFsdWU6IG51bWJlcixcbiAgKTogUmVzb2x2ZWRQdXJpPG51bWJlciwgU2luZ2xlVGFibGVWYWx1ZTxUVGFibGVzPj4ge1xuICAgIGlmICh2YWx1ZSA8PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJEZWNyZW1lbnQgdmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gMFwiKTtcbiAgICB9XG4gICAgdGhpcy5rbmV4UXVlcnkuZGVjcmVtZW50KGNvbHVtbiwgdmFsdWUpO1xuICAgIHJldHVybiBuZXcgUmVzb2x2ZWRQdXJpKHRoaXMua25leFF1ZXJ5LCB0aGlzLmtuZXgsIHRoaXMudGFibGVTcGVjKTtcbiAgfVxuXG4gIC8vIERFTEVURVxuICBkZWxldGUoKTogUmVzb2x2ZWRQdXJpPG51bWJlciwgU2luZ2xlVGFibGVWYWx1ZTxUVGFibGVzPj4ge1xuICAgIHRoaXMua25leFF1ZXJ5LmRlbGV0ZSgpO1xuICAgIHJldHVybiBuZXcgUmVzb2x2ZWRQdXJpKHRoaXMua25leFF1ZXJ5LCB0aGlzLmtuZXgsIHRoaXMudGFibGVTcGVjKTtcbiAgfVxuXG4gIC8vIO2ZleyduCDsv7zrpqwg66as7YS0XG4gIHRvUXVlcnkoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5rbmV4UXVlcnkudG9RdWVyeSgpO1xuICB9XG5cbiAgLy8g7L+866asIOuUlOuyhOq5hSDroZzqt7gg7Lac66ClXG4gIGRlYnVnKCk6IHRoaXMge1xuICAgIGNvbnNvbGUubG9nKGAke2NoYWxrLmN5YW4oXCJbUHVyaSBEZWJ1Z11cIil9ICR7Y2hhbGsueWVsbG93KHRoaXMudG9RdWVyeSgpKX1gKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIGNsb25lKCk6IFB1cmk8VFNjaGVtYSwgVFRhYmxlcywgVFJlc3VsdD4ge1xuICAgIC8vICdkdWFsJ+ydgCDrjZTrr7gg7YWM7J2067iU7J2066mwLCDrsJTroZwg7JWE656YIOykhOyXkOyEnCBrbmV4UXVlcnnqsIAg642u7Ja07JSM7JuM7KeR64uI64ukLlxuICAgIGNvbnN0IG5ld1B1cmkgPSBuZXcgUHVyaTxUU2NoZW1hLCBUVGFibGVzLCBUUmVzdWx0Pih0aGlzLmtuZXgsIFwiZHVhbFwiKTtcbiAgICBuZXdQdXJpLmtuZXhRdWVyeSA9IHRoaXMua25leFF1ZXJ5LmNsb25lKCk7XG4gICAgbmV3UHVyaS50YWJsZVNwZWMgPSB0aGlzLnRhYmxlU3BlYztcbiAgICBuZXdQdXJpLmNvcnJlbGF0aW9uUmVnaXN0cnkgPSBuZXcgTWFwKHRoaXMuY29ycmVsYXRpb25SZWdpc3RyeSk7XG4gICAgcmV0dXJuIG5ld1B1cmk7XG4gIH1cblxuICBmb3JtYXRTUUwodW5mb3JtYXR0ZWQ6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgLy8gU1FMIOyYiOyVveyWtCDrqqnroZ1cbiAgICBjb25zdCBrZXl3b3JkcyA9IFtcbiAgICAgIFwiU0VMRUNUXCIsXG4gICAgICBcIkZST01cIixcbiAgICAgIFwiV0hFUkVcIixcbiAgICAgIFwiSU5TRVJUXCIsXG4gICAgICBcIklOVE9cIixcbiAgICAgIFwiVkFMVUVTXCIsXG4gICAgICBcIlVQREFURVwiLFxuICAgICAgXCJERUxFVEVcIixcbiAgICAgIFwiQ1JFQVRFXCIsXG4gICAgICBcIlRBQkxFXCIsXG4gICAgICBcIkFMVEVSXCIsXG4gICAgICBcIkRST1BcIixcbiAgICAgIFwiSk9JTlwiLFxuICAgICAgXCJPTlwiLFxuICAgICAgXCJJTk5FUlwiLFxuICAgICAgXCJMRUZUXCIsXG4gICAgICBcIlJJR0hUXCIsXG4gICAgICBcIkZVTExcIixcbiAgICAgIFwiT1VURVJcIixcbiAgICAgIFwiR1JPVVBcIixcbiAgICAgIFwiQllcIixcbiAgICAgIFwiT1JERVJcIixcbiAgICAgIFwiSEFWSU5HXCIsXG4gICAgICBcIkRJU1RJTkNUXCIsXG4gICAgICBcIkxJTUlUXCIsXG4gICAgICBcIk9GRlNFVFwiLFxuICAgICAgXCJBU1wiLFxuICAgICAgXCJBTkRcIixcbiAgICAgIFwiT1JcIixcbiAgICAgIFwiTk9UXCIsXG4gICAgICBcIklOXCIsXG4gICAgICBcIkxJS0VcIixcbiAgICAgIFwiSVNcIixcbiAgICAgIFwiTlVMTFwiLFxuICAgICAgXCJDQVNFXCIsXG4gICAgICBcIldIRU5cIixcbiAgICAgIFwiVEhFTlwiLFxuICAgICAgXCJFTFNFXCIsXG4gICAgICBcIkVORFwiLFxuICAgICAgXCJVTklPTlwiLFxuICAgICAgXCJBTExcIixcbiAgICAgIFwiRVhJU1RTXCIsXG4gICAgICBcIkJFVFdFRU5cIixcbiAgICBdO1xuXG4gICAgbGV0IGZvcm1hdHRlZCA9IHVuZm9ybWF0dGVkO1xuXG4gICAgLy8g7JiI7JW97Ja066W8IOuMgOusuOyekOuhnCDrs4DtmZhcbiAgICBrZXl3b3Jkcy5mb3JFYWNoKChrZXl3b3JkKSA9PiB7XG4gICAgICBjb25zdCByZWdleCA9IG5ldyBSZWdFeHAoYFxcXFxiJHtrZXl3b3JkfVxcXFxiYCwgXCJnaVwiKTtcbiAgICAgIGZvcm1hdHRlZCA9IGZvcm1hdHRlZC5yZXBsYWNlKHJlZ2V4LCBrZXl3b3JkLnRvVXBwZXJDYXNlKCkpO1xuICAgIH0pO1xuXG4gICAgLy8g7KO87JqUIOygiCDslZ7sl5Ag7KSE67CU6r+IIOy2lOqwgFxuICAgIGNvbnN0IG1ham9yQ2xhdXNlcyA9IFtcbiAgICAgIFwiU0VMRUNUXCIsXG4gICAgICBcIkZST01cIixcbiAgICAgIFwiV0hFUkVcIixcbiAgICAgIFwiR1JPVVAgQllcIixcbiAgICAgIFwiT1JERVIgQllcIixcbiAgICAgIFwiSEFWSU5HXCIsXG4gICAgICBcIkxJTUlUXCIsXG4gICAgICBcIlVOSU9OXCIsXG4gICAgXTtcbiAgICBtYWpvckNsYXVzZXMuZm9yRWFjaCgoY2xhdXNlKSA9PiB7XG4gICAgICBjb25zdCByZWdleCA9IG5ldyBSZWdFeHAoYFxcXFxzKygke2NsYXVzZX0pXFxcXHMrYCwgXCJnaVwiKTtcbiAgICAgIGZvcm1hdHRlZCA9IGZvcm1hdHRlZC5yZXBsYWNlKHJlZ2V4LCBgXFxuJHtjbGF1c2UudG9VcHBlckNhc2UoKX0gYCk7XG4gICAgfSk7XG5cbiAgICAvLyBKT0lOIOygiCDsspjrpqxcbiAgICBmb3JtYXR0ZWQgPSBmb3JtYXR0ZWQucmVwbGFjZSgvXFxzKygoPzpJTk5FUnxMRUZUfFJJR0hUfEZVTEwgT1VURVIpXFxzKyk/Sk9JTlxccysvZ2ksIFwiXFxuJDFKT0lOIFwiKTtcblxuICAgIC8vIEFORCwgT1Ig7KGw6rG0IOyymOumrFxuICAgIGZvcm1hdHRlZCA9IGZvcm1hdHRlZC5yZXBsYWNlKC9cXHMrKEFORHxPUilcXHMrL2dpLCBcIlxcbiAgJDEgXCIpO1xuXG4gICAgLy8g6rSE7Zi4IOyymOumrCDrsI8g65Ok7Jes7JOw6riwXG4gICAgY29uc3QgbGluZXMgPSBmb3JtYXR0ZWQuc3BsaXQoXCJcXG5cIik7XG4gICAgY29uc3QgaW5kZW50ZWRMaW5lcyA9IFtdO1xuICAgIGxldCBpbmRlbnRMZXZlbCA9IDA7XG5cbiAgICBmb3IgKGNvbnN0IGxpbmUgb2YgbGluZXMpIHtcbiAgICAgIGNvbnN0IHRyaW1tZWRMaW5lID0gbGluZS50cmltKCk7XG4gICAgICBpZiAoIXRyaW1tZWRMaW5lKSBjb250aW51ZTtcblxuICAgICAgLy8g64ur64qUIOq0hO2YuOqwgCDsnojsnLzrqbQg65Ok7Jes7JOw6riwIOugiOuyqCDqsJDshoxcbiAgICAgIGNvbnN0IGNsb3NpbmdQYXJlbnMgPSAodHJpbW1lZExpbmUubWF0Y2goL1xcKS9nKSB8fCBbXSkubGVuZ3RoO1xuICAgICAgY29uc3Qgb3BlbmluZ1BhcmVucyA9ICh0cmltbWVkTGluZS5tYXRjaCgvXFwoL2cpIHx8IFtdKS5sZW5ndGg7XG5cbiAgICAgIGlmIChjbG9zaW5nUGFyZW5zID4gMCAmJiBvcGVuaW5nUGFyZW5zID09PSAwKSB7XG4gICAgICAgIGluZGVudExldmVsID0gTWF0aC5tYXgoMCwgaW5kZW50TGV2ZWwgLSBjbG9zaW5nUGFyZW5zKTtcbiAgICAgIH1cblxuICAgICAgLy8g7ZiE7J6sIOuTpOyXrOyTsOq4sCDsoIHsmqlcbiAgICAgIGNvbnN0IGluZGVudCA9IFwiICBcIi5yZXBlYXQoaW5kZW50TGV2ZWwpO1xuICAgICAgaW5kZW50ZWRMaW5lcy5wdXNoKGluZGVudCArIHRyaW1tZWRMaW5lKTtcblxuICAgICAgLy8g7Jes64qUIOq0hO2YuOqwgCDsnojsnLzrqbQg65Ok7Jes7JOw6riwIOugiOuyqCDspp3qsIBcbiAgICAgIGlmIChvcGVuaW5nUGFyZW5zID4gY2xvc2luZ1BhcmVucykge1xuICAgICAgICBpbmRlbnRMZXZlbCArPSBvcGVuaW5nUGFyZW5zIC0gY2xvc2luZ1BhcmVucztcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gaW5kZW50ZWRMaW5lcy5qb2luKFwiXFxuXCIpLnRyaW0oKTtcbiAgfVxuXG4gIHJhdyhzcWw6IHN0cmluZyk6IEtuZXguUmF3IHtcbiAgICByZXR1cm4gdGhpcy5rbmV4LnJhdyhzcWwpO1xuICB9XG5cbiAgLy8gS25leCDsv7zrpqwg67mM642UIOyngeygkSDsoJHqt7xcbiAgcmF3UXVlcnkoKTogS25leC5RdWVyeUJ1aWxkZXIge1xuICAgIHJldHVybiB0aGlzLmtuZXhRdWVyeTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgV2hlcmVHcm91cDxUVGFibGVzIGV4dGVuZHMgb2JqZWN0PiB7XG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgYnVpbGRlcjogS25leC5RdWVyeUJ1aWxkZXIpIHt9XG5cbiAgLy8gd2hlcmUg66mU7ISc65Oc65OkXG4gIHdoZXJlKGNvbmRpdGlvbnM6IFdoZXJlQ29uZGl0aW9uPFRUYWJsZXM+KTogdGhpcztcbiAgd2hlcmU8VENvbHVtbiBleHRlbmRzIEF2YWlsYWJsZUNvbHVtbnM8VFRhYmxlcz4+KFxuICAgIGNvbHVtbjogVENvbHVtbixcbiAgICB2YWx1ZTogRXh0cmFjdENvbHVtblR5cGU8VFRhYmxlcywgVENvbHVtbiAmIHN0cmluZz4sXG4gICk6IHRoaXM7XG4gIHdoZXJlPFRDb2x1bW4gZXh0ZW5kcyBBdmFpbGFibGVDb2x1bW5zPFRUYWJsZXM+PihcbiAgICBjb2x1bW46IFRDb2x1bW4sXG4gICAgb3BlcmF0b3I6IFdoZXJlT3BlcmF0b3IsXG4gICAgdmFsdWU6IEV4dHJhY3RDb2x1bW5UeXBlPFRUYWJsZXMsIFRDb2x1bW4gJiBzdHJpbmc+LFxuICApOiB0aGlzO1xuICB3aGVyZSguLi5hcmdzOiBhbnlbXSk6IFdoZXJlR3JvdXA8VFRhYmxlcz4ge1xuICAgIHRoaXMuYnVpbGRlci53aGVyZShhcmdzWzBdLCAuLi5hcmdzLnNsaWNlKDEpKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8vIHdoZXJlSW4gLyB3aGVyZU5vdEluIOuplOyEnOuTnOuTpFxuICB3aGVyZUluPFRDb2x1bW4gZXh0ZW5kcyBBdmFpbGFibGVDb2x1bW5zPFRUYWJsZXM+PihcbiAgICBjb2x1bW46IFRDb2x1bW4sXG4gICAgdmFsdWVzOiAoRXh0cmFjdENvbHVtblR5cGU8VFRhYmxlcywgVENvbHVtbiAmIHN0cmluZz4gJiBLbmV4LlZhbHVlKVtdLFxuICApOiB0aGlzO1xuICB3aGVyZUluKC4uLmFyZ3M6IGFueVtdKTogV2hlcmVHcm91cDxUVGFibGVzPiB7XG4gICAgdGhpcy5idWlsZGVyLndoZXJlSW4oYXJnc1swXSwgYXJnc1sxXSk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICB3aGVyZU5vdEluPFRDb2x1bW4gZXh0ZW5kcyBBdmFpbGFibGVDb2x1bW5zPFRUYWJsZXM+PihcbiAgICBjb2x1bW46IFRDb2x1bW4sXG4gICAgdmFsdWVzOiAoRXh0cmFjdENvbHVtblR5cGU8VFRhYmxlcywgVENvbHVtbiAmIHN0cmluZz4gJiBLbmV4LlZhbHVlKVtdLFxuICApOiB0aGlzO1xuICB3aGVyZU5vdEluKC4uLmFyZ3M6IGFueVtdKTogV2hlcmVHcm91cDxUVGFibGVzPiB7XG4gICAgdGhpcy5idWlsZGVyLndoZXJlTm90SW4oYXJnc1swXSwgYXJnc1sxXSk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvLyBvcldoZXJlIOuplOyEnOuTnOuTpFxuICBvcldoZXJlKGNvbmRpdGlvbnM6IFdoZXJlQ29uZGl0aW9uPFRUYWJsZXM+KTogdGhpcztcbiAgb3JXaGVyZTxUQ29sdW1uIGV4dGVuZHMgQXZhaWxhYmxlQ29sdW1uczxUVGFibGVzPj4oXG4gICAgY29sdW1uOiBUQ29sdW1uLFxuICAgIHZhbHVlOiBFeHRyYWN0Q29sdW1uVHlwZTxUVGFibGVzLCBUQ29sdW1uICYgc3RyaW5nPixcbiAgKTogdGhpcztcbiAgb3JXaGVyZTxUQ29sdW1uIGV4dGVuZHMgQXZhaWxhYmxlQ29sdW1uczxUVGFibGVzPj4oXG4gICAgY29sdW1uOiBUQ29sdW1uLFxuICAgIG9wZXJhdG9yOiBXaGVyZU9wZXJhdG9yLFxuICAgIHZhbHVlOiBFeHRyYWN0Q29sdW1uVHlwZTxUVGFibGVzLCBUQ29sdW1uICYgc3RyaW5nPixcbiAgKTogdGhpcztcbiAgb3JXaGVyZSguLi5hcmdzOiBhbnlbXSk6IFdoZXJlR3JvdXA8VFRhYmxlcz4ge1xuICAgIHRoaXMuYnVpbGRlci5vcldoZXJlKGFyZ3NbMF0sIC4uLmFyZ3Muc2xpY2UoMSkpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLy8gb3JXaGVyZUluIC8gb3JXaGVyZU5vdEluIOuplOyEnOuTnOuTpFxuICBvcldoZXJlSW48VENvbHVtbiBleHRlbmRzIEF2YWlsYWJsZUNvbHVtbnM8VFRhYmxlcz4+KFxuICAgIGNvbHVtbjogVENvbHVtbixcbiAgICB2YWx1ZXM6IChFeHRyYWN0Q29sdW1uVHlwZTxUVGFibGVzLCBUQ29sdW1uICYgc3RyaW5nPiAmIEtuZXguVmFsdWUpW10sXG4gICk6IHRoaXM7XG4gIG9yV2hlcmVJbiguLi5hcmdzOiBhbnlbXSk6IFdoZXJlR3JvdXA8VFRhYmxlcz4ge1xuICAgIHRoaXMuYnVpbGRlci5vcldoZXJlSW4oYXJnc1swXSwgYXJnc1sxXSk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBvcldoZXJlTm90SW48VENvbHVtbiBleHRlbmRzIEF2YWlsYWJsZUNvbHVtbnM8VFRhYmxlcz4+KFxuICAgIGNvbHVtbjogVENvbHVtbixcbiAgICB2YWx1ZXM6IChFeHRyYWN0Q29sdW1uVHlwZTxUVGFibGVzLCBUQ29sdW1uICYgc3RyaW5nPiAmIEtuZXguVmFsdWUpW10sXG4gICk6IHRoaXM7XG4gIG9yV2hlcmVOb3RJbiguLi5hcmdzOiBhbnlbXSk6IFdoZXJlR3JvdXA8VFRhYmxlcz4ge1xuICAgIHRoaXMuYnVpbGRlci5vcldoZXJlTm90SW4oYXJnc1swXSwgYXJnc1sxXSk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvLyBXSEVSRSBKU09OQiBTVVBFUlNFVCAoQD4pXG4gIHdoZXJlSnNvblN1cGVyc2V0T2Y8VENvbHVtbiBleHRlbmRzIEpzb25Db2x1bW5zPFRUYWJsZXM+PihcbiAgICBjb2x1bW46IFRDb2x1bW4sXG4gICAgdmFsdWU6IEpzb25TdXBlcnNldFZhbHVlPEV4dHJhY3RDb2x1bW5UeXBlPFRUYWJsZXMsIFRDb2x1bW4+PixcbiAgKTogdGhpcyB7XG4gICAgdGhpcy5idWlsZGVyLndoZXJlSnNvblN1cGVyc2V0T2YoY29sdW1uLCBzZXJpYWxpemVKc29uU3VwZXJzZXRWYWx1ZSh2YWx1ZSkpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgb3JXaGVyZUpzb25TdXBlcnNldE9mPFRDb2x1bW4gZXh0ZW5kcyBKc29uQ29sdW1uczxUVGFibGVzPj4oXG4gICAgY29sdW1uOiBUQ29sdW1uLFxuICAgIHZhbHVlOiBKc29uU3VwZXJzZXRWYWx1ZTxFeHRyYWN0Q29sdW1uVHlwZTxUVGFibGVzLCBUQ29sdW1uPj4sXG4gICk6IHRoaXMge1xuICAgIHRoaXMuYnVpbGRlci5vcldoZXJlSnNvblN1cGVyc2V0T2YoY29sdW1uLCBzZXJpYWxpemVKc29uU3VwZXJzZXRWYWx1ZSh2YWx1ZSkpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgd2hlcmVKc29uS2V5RXhpc3RzKGNvbHVtbjogSnNvbkNvbHVtbnM8VFRhYmxlcz4sIGtleTogc3RyaW5nKTogdGhpcyB7XG4gICAgdGhpcy5idWlsZGVyLndoZXJlUmF3KFwiPz8gXFxcXD8gP1wiLCBbY29sdW1uLCBrZXldKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIG9yV2hlcmVKc29uS2V5RXhpc3RzKGNvbHVtbjogSnNvbkNvbHVtbnM8VFRhYmxlcz4sIGtleTogc3RyaW5nKTogdGhpcyB7XG4gICAgdGhpcy5idWlsZGVyLm9yV2hlcmVSYXcoXCI/PyBcXFxcPyA/XCIsIFtjb2x1bW4sIGtleV0pO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLy8gV0hFUkUgTUFUQ0hcbiAgd2hlcmVNYXRjaDxUQ29sdW1uIGV4dGVuZHMgRnVsbHRleHRDb2x1bW5zPFRUYWJsZXM+Pihjb2x1bW46IFRDb2x1bW4sIHZhbHVlOiBzdHJpbmcpOiB0aGlzO1xuICB3aGVyZU1hdGNoKC4uLmFyZ3M6IGFueVtdKTogdGhpcyB7XG4gICAgdGhpcy5idWlsZGVyLndoZXJlUmF3KGBNQVRDSCAoJHtTdHJpbmcoYXJnc1swXSl9KSBBR0FJTlNUICg/KWAsIFthcmdzWzFdXSk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBvcldoZXJlTWF0Y2g8VENvbHVtbiBleHRlbmRzIEZ1bGx0ZXh0Q29sdW1uczxUVGFibGVzPj4oY29sdW1uOiBUQ29sdW1uLCB2YWx1ZTogc3RyaW5nKTogdGhpcztcbiAgb3JXaGVyZU1hdGNoKC4uLmFyZ3M6IGFueVtdKTogdGhpcyB7XG4gICAgdGhpcy5idWlsZGVyLm9yV2hlcmVSYXcoYE1BVENIICgke1N0cmluZyhhcmdzWzBdKX0pIEFHQUlOU1QgKD8pYCwgW2FyZ3NbMV1dKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8vIFdIRVJFIFNFQVJDSFxuICB3aGVyZVNlYXJjaDxUQ29sdW1uIGV4dGVuZHMgQXZhaWxhYmxlQ29sdW1uczxUVGFibGVzPj4oXG4gICAgY29sdW1uOiBUQ29sdW1uIHwgVENvbHVtbltdLFxuICAgIHZhbHVlOiBzdHJpbmcsXG4gICAgb3B0aW9ucz86IHtcbiAgICAgIHdlaWdodHM/OiBudW1iZXJbXTsgLy8g7KCV7IiYIOuwsOyXtFxuICAgIH0sXG4gICk6IHRoaXM7XG4gIHdoZXJlU2VhcmNoKC4uLmFyZ3M6IGFueVtdKTogdGhpcyB7XG4gICAgY29uc3QgeyB3ZWlnaHRzIH0gPSBhcmdzWzJdID8/IHt9O1xuICAgIGNvbnN0IGNvbHVtbkV4cHIgPSBBcnJheS5pc0FycmF5KGFyZ3NbMF0pXG4gICAgICA/IGBBUlJBWVske2FyZ3NbMF0ubWFwKChjKSA9PiBgJHtjfTo6dGV4dGApLmpvaW4oXCIsXCIpfV1gXG4gICAgICA6IGFyZ3NbMF07XG4gICAgY29uc3QgcGdyb29uZ2FDb25kaXRpb24gPSBgcGdyb29uZ2FfY29uZGl0aW9uKD8ke3dlaWdodHM/Lmxlbmd0aCA/IGAsIHdlaWdodHMgPT4gQVJSQVlbJHt3ZWlnaHRzLmpvaW4oXCIsXCIpfV1gIDogXCJcIn0pYDtcbiAgICB0aGlzLmJ1aWxkZXIud2hlcmVSYXcoYCR7Y29sdW1uRXhwcn0gJkB+ICR7cGdyb29uZ2FDb25kaXRpb259YCwgW2FyZ3NbMV1dKTtcblxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgb3JXaGVyZVNlYXJjaDxUQ29sdW1uIGV4dGVuZHMgQXZhaWxhYmxlQ29sdW1uczxUVGFibGVzPj4oXG4gICAgY29sdW1uOiBUQ29sdW1uIHwgVENvbHVtbltdLFxuICAgIHZhbHVlOiBzdHJpbmcsXG4gICAgb3B0aW9ucz86IHtcbiAgICAgIHdlaWdodHM/OiBudW1iZXJbXTsgLy8g7KCV7IiYIOuwsOyXtFxuICAgIH0sXG4gICk6IHRoaXM7XG4gIG9yV2hlcmVTZWFyY2goLi4uYXJnczogYW55W10pOiB0aGlzIHtcbiAgICBjb25zdCB7IHdlaWdodHMgfSA9IGFyZ3NbMl0gPz8ge307XG4gICAgY29uc3QgY29sdW1uRXhwciA9IEFycmF5LmlzQXJyYXkoYXJnc1swXSlcbiAgICAgID8gYEFSUkFZWyR7YXJnc1swXS5tYXAoKGMpID0+IGAke2N9Ojp0ZXh0YCkuam9pbihcIixcIil9XWBcbiAgICAgIDogYXJnc1swXTtcbiAgICBjb25zdCBwZ3Jvb25nYUNvbmRpdGlvbiA9IGBwZ3Jvb25nYV9jb25kaXRpb24oPyR7d2VpZ2h0cz8ubGVuZ3RoID8gYCwgd2VpZ2h0cyA9PiBBUlJBWVske3dlaWdodHMuam9pbihcIixcIil9XWAgOiBcIlwifSlgO1xuICAgIHRoaXMuYnVpbGRlci5vcldoZXJlUmF3KGAke2NvbHVtbkV4cHJ9ICZAfiAke3Bncm9vbmdhQ29uZGl0aW9ufWAsIFthcmdzWzFdXSk7XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8vIFdIRVJFIEZVTExURVhUXG4gIHdoZXJlVHNTZWFyY2g8VENvbHVtbiBleHRlbmRzIEF2YWlsYWJsZUNvbHVtbnM8VFRhYmxlcz4gfCBTdHJpbmdTcWxFeHByZXNzaW9uPihcbiAgICBjb2x1bW46IFRDb2x1bW4sXG4gICAgdmFsdWU6IHN0cmluZyxcbiAgICBvcHRpb25zPzogVHNRdWVyeU9wdGlvbnMgfCBUc1F1ZXJ5Q29uZmlnLFxuICApOiB0aGlzO1xuICB3aGVyZVRzU2VhcmNoKC4uLmFyZ3M6IGFueVtdKTogdGhpcyB7XG4gICAgY29uc3Qgb3B0cyA9XG4gICAgICAvLyBTQUZFVFk6IOy/vOumrCDruYzrjZTsnZgg7KCc64Sk66atIOqzhOyVveqzvCDshKDtlokg6rKA7Kad7J20IOydtCDtg4DsnoXsnYQg67O07J6l7ZWp64uI64ukLlxuICAgICAgaXNTdHJpbmdWYWx1ZShhcmdzWzJdKSA/ICh7IGNvbmZpZzogYXJnc1syXSB9IGFzIFRzUXVlcnlPcHRpb25zKSA6IChhcmdzWzJdID8/IHt9KTtcblxuICAgIGNvbnN0IHBhcnNlciA9IG9wdHMucGFyc2VyID8/IFwid2Vic2VhcmNoX3RvX3RzcXVlcnlcIjtcbiAgICBjb25zdCBjb25maWcgPSBvcHRzLmNvbmZpZyA/PyBcInNpbXBsZVwiO1xuICAgIGNvbnN0IGNvbHVtbkV4cHIgPSBpc1NxbEV4cHJlc3Npb24oYXJnc1swXSkgPyBhcmdzWzBdW1wiX3NxbFwiXSA6IFN0cmluZyhhcmdzWzBdKTtcbiAgICBjb25zdCBwYXJhbXMgPSBpc1NxbEV4cHJlc3Npb24oYXJnc1swXSlcbiAgICAgID8gWy4uLmFyZ3NbMF1bXCJfcGFyYW1zXCJdLCBjb25maWcsIGFyZ3NbMV1dXG4gICAgICA6IFtjb25maWcsIGFyZ3NbMV1dO1xuXG4gICAgdGhpcy5idWlsZGVyLndoZXJlUmF3KGAke2NvbHVtbkV4cHJ9IEBAICR7cGFyc2VyfSg/LCA/KWAsIHBhcmFtcyk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBvcldoZXJlVHNTZWFyY2g8VENvbHVtbiBleHRlbmRzIEF2YWlsYWJsZUNvbHVtbnM8VFRhYmxlcz4gfCBTdHJpbmdTcWxFeHByZXNzaW9uPihcbiAgICBjb2x1bW46IFRDb2x1bW4sXG4gICAgdmFsdWU6IHN0cmluZyxcbiAgICBvcHRpb25zPzogVHNRdWVyeU9wdGlvbnMgfCBUc1F1ZXJ5Q29uZmlnLFxuICApOiB0aGlzO1xuICBvcldoZXJlVHNTZWFyY2goLi4uYXJnczogYW55W10pOiB0aGlzIHtcbiAgICBjb25zdCBvcHRzID1cbiAgICAgIC8vIFNBRkVUWTog7L+866asIOu5jOuNlOydmCDsoJzrhKTrpq0g6rOE7JW96rO8IOyEoO2WiSDqsoDspp3snbQg7J20IO2DgOyeheydhCDrs7TsnqXtlanri4jri6QuXG4gICAgICBpc1N0cmluZ1ZhbHVlKGFyZ3NbMl0pID8gKHsgY29uZmlnOiBhcmdzWzJdIH0gYXMgVHNRdWVyeU9wdGlvbnMpIDogKGFyZ3NbMl0gPz8ge30pO1xuXG4gICAgY29uc3QgcGFyc2VyID0gb3B0cy5wYXJzZXIgPz8gXCJ3ZWJzZWFyY2hfdG9fdHNxdWVyeVwiO1xuICAgIGNvbnN0IGNvbmZpZyA9IG9wdHMuY29uZmlnID8/IFwic2ltcGxlXCI7XG4gICAgY29uc3QgY29sdW1uRXhwciA9IGlzU3FsRXhwcmVzc2lvbihhcmdzWzBdKSA/IGFyZ3NbMF1bXCJfc3FsXCJdIDogU3RyaW5nKGFyZ3NbMF0pO1xuICAgIGNvbnN0IHBhcmFtcyA9IGlzU3FsRXhwcmVzc2lvbihhcmdzWzBdKVxuICAgICAgPyBbLi4uYXJnc1swXVtcIl9wYXJhbXNcIl0sIGNvbmZpZywgYXJnc1sxXV1cbiAgICAgIDogW2NvbmZpZywgYXJnc1sxXV07XG5cbiAgICB0aGlzLmJ1aWxkZXIub3JXaGVyZVJhdyhgJHtjb2x1bW5FeHByfSBAQCAke3BhcnNlcn0oPywgPylgLCBwYXJhbXMpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgd2hlcmVGdXp6eTxUQ29sdW1uIGV4dGVuZHMgQXZhaWxhYmxlQ29sdW1uczxUVGFibGVzPiB8IFN0cmluZ1NxbEV4cHJlc3Npb24+KFxuICAgIGNvbHVtbjogVENvbHVtbixcbiAgICB2YWx1ZTogc3RyaW5nLFxuICAgIG9wdGlvbnM/OiB7XG4gICAgICBvcGVyYXRvcj86IEZ1enp5T3BlcmF0b3I7XG4gICAgfSxcbiAgKTogdGhpcztcbiAgd2hlcmVGdXp6eSguLi5hcmdzOiBhbnlbXSk6IHRoaXMge1xuICAgIGNvbnN0IG9wZXJhdG9yID0gcGFyc2VGdXp6eU9wZXJhdG9yKGFyZ3NbMl0/Lm9wZXJhdG9yKTtcblxuICAgIGlmIChvcGVyYXRvciA9PT0gXCIlXCIpIHtcbiAgICAgIGlmIChpc1NxbEV4cHJlc3Npb24oYXJnc1swXSkpIHtcbiAgICAgICAgdGhpcy5idWlsZGVyLndoZXJlUmF3KGAke2FyZ3NbMF1bXCJfc3FsXCJdfSAke29wZXJhdG9yfSA/YCwgWy4uLmFyZ3NbMF1bXCJfcGFyYW1zXCJdLCBhcmdzWzFdXSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmJ1aWxkZXIud2hlcmVSYXcoYD8/ICR7b3BlcmF0b3J9ID9gLCBbYXJnc1swXSwgYXJnc1sxXV0pO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgaWYgKGlzU3FsRXhwcmVzc2lvbihhcmdzWzBdKSkge1xuICAgICAgdGhpcy5idWlsZGVyLndoZXJlUmF3KGA/ICR7b3BlcmF0b3J9ICR7YXJnc1swXVtcIl9zcWxcIl19YCwgW2FyZ3NbMV0sIC4uLmFyZ3NbMF1bXCJfcGFyYW1zXCJdXSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuYnVpbGRlci53aGVyZVJhdyhgPyAke29wZXJhdG9yfSA/P2AsIFthcmdzWzFdLCBhcmdzWzBdXSk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgb3JXaGVyZUZ1enp5PFRDb2x1bW4gZXh0ZW5kcyBBdmFpbGFibGVDb2x1bW5zPFRUYWJsZXM+IHwgU3RyaW5nU3FsRXhwcmVzc2lvbj4oXG4gICAgY29sdW1uOiBUQ29sdW1uLFxuICAgIHZhbHVlOiBzdHJpbmcsXG4gICAgb3B0aW9ucz86IHtcbiAgICAgIG9wZXJhdG9yPzogRnV6enlPcGVyYXRvcjtcbiAgICB9LFxuICApOiB0aGlzO1xuICBvcldoZXJlRnV6enkoLi4uYXJnczogYW55W10pOiB0aGlzIHtcbiAgICBjb25zdCBvcGVyYXRvciA9IHBhcnNlRnV6enlPcGVyYXRvcihhcmdzWzJdPy5vcGVyYXRvcik7XG5cbiAgICBpZiAob3BlcmF0b3IgPT09IFwiJVwiKSB7XG4gICAgICBpZiAoaXNTcWxFeHByZXNzaW9uKGFyZ3NbMF0pKSB7XG4gICAgICAgIHRoaXMuYnVpbGRlci5vcldoZXJlUmF3KGAke2FyZ3NbMF1bXCJfc3FsXCJdfSAke29wZXJhdG9yfSA/YCwgW1xuICAgICAgICAgIC4uLmFyZ3NbMF1bXCJfcGFyYW1zXCJdLFxuICAgICAgICAgIGFyZ3NbMV0sXG4gICAgICAgIF0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5idWlsZGVyLm9yV2hlcmVSYXcoYD8/ICR7b3BlcmF0b3J9ID9gLCBbYXJnc1swXSwgYXJnc1sxXV0pO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgaWYgKGlzU3FsRXhwcmVzc2lvbihhcmdzWzBdKSkge1xuICAgICAgdGhpcy5idWlsZGVyLm9yV2hlcmVSYXcoYD8gJHtvcGVyYXRvcn0gJHthcmdzWzBdW1wiX3NxbFwiXX1gLCBbYXJnc1sxXSwgLi4uYXJnc1swXVtcIl9wYXJhbXNcIl1dKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5idWlsZGVyLm9yV2hlcmVSYXcoYD8gJHtvcGVyYXRvcn0gPz9gLCBbYXJnc1sxXSwgYXJnc1swXV0pO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8vIOykkeyyqSDqt7jro7lcbiAgd2hlcmVHcm91cChjYWxsYmFjazogKGc6IFdoZXJlR3JvdXA8VFRhYmxlcz4pID0+IHZvaWQpOiB0aGlzO1xuICB3aGVyZUdyb3VwKGNhbGxiYWNrOiAoZzogV2hlcmVHcm91cDxUVGFibGVzPikgPT4gdm9pZCk6IFdoZXJlR3JvdXA8VFRhYmxlcz4ge1xuICAgIHRoaXMuYnVpbGRlci53aGVyZSgoc3ViQnVpbGRlcikgPT4ge1xuICAgICAgY29uc3Qgc3ViR3JvdXAgPSBuZXcgV2hlcmVHcm91cDxUVGFibGVzPihzdWJCdWlsZGVyKTtcbiAgICAgIGNhbGxiYWNrKHN1Ykdyb3VwKTtcbiAgICB9KTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuICBvcldoZXJlR3JvdXAoY2FsbGJhY2s6IChnOiBXaGVyZUdyb3VwPFRUYWJsZXM+KSA9PiB2b2lkKTogdGhpcztcbiAgb3JXaGVyZUdyb3VwKGNhbGxiYWNrOiAoZzogV2hlcmVHcm91cDxUVGFibGVzPikgPT4gdm9pZCk6IFdoZXJlR3JvdXA8VFRhYmxlcz4ge1xuICAgIHRoaXMuYnVpbGRlci5vcldoZXJlKChzdWJCdWlsZGVyKSA9PiB7XG4gICAgICBjb25zdCBzdWJHcm91cCA9IG5ldyBXaGVyZUdyb3VwPFRUYWJsZXM+KHN1YkJ1aWxkZXIpO1xuICAgICAgY2FsbGJhY2soc3ViR3JvdXApO1xuICAgIH0pO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG59XG5cbi8vIEpPSU4g7KCIIOq3uOujueyXkOuKlCBMZWZ07JmAIFJpZ2h07JeQIOuMgO2VnCDsiJzshJzqsIAg7ZWE7JqU7ZWY7KeAIOyViuycvOuvgOuhnCwg66qo65OgIOqyveyasOydmCDsiJjrpbwg6rOE7IKw7ZW07JW87ZWoLlxuZXhwb3J0IGNsYXNzIEpvaW5DbGF1c2VHcm91cDxUTGVmdCBleHRlbmRzIG9iamVjdCwgVFJpZ2h0IGV4dGVuZHMgb2JqZWN0PiB7XG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgY2FsbGJhY2s6IEtuZXguSm9pbkNsYXVzZSkge31cblxuICAvLyBPTihBTkQpOiDsu6zrn7wgPSDsu6zrn7xcbiAgb24obGVmdDogQXZhaWxhYmxlQ29sdW1uczxUTGVmdD4sIHJpZ2h0OiBBdmFpbGFibGVDb2x1bW5zPFRSaWdodD4pOiB0aGlzO1xuICBvbihsZWZ0OiBBdmFpbGFibGVDb2x1bW5zPFRSaWdodD4sIHJpZ2h0OiBBdmFpbGFibGVDb2x1bW5zPFRMZWZ0Pik6IHRoaXM7XG4gIC8vIE9OKEFORCk6IOy7rOufvCA9IOqwklxuICBvbihcbiAgICBsZWZ0OiBBdmFpbGFibGVDb2x1bW5zPFRMZWZ0PixcbiAgICByaWdodDogRXh0cmFjdENvbHVtblR5cGU8VExlZnQsIEF2YWlsYWJsZUNvbHVtbnM8VExlZnQ+ICYgc3RyaW5nPixcbiAgKTogdGhpcztcbiAgb24oXG4gICAgbGVmdDogQXZhaWxhYmxlQ29sdW1uczxUUmlnaHQ+LFxuICAgIHJpZ2h0OiBFeHRyYWN0Q29sdW1uVHlwZTxUUmlnaHQsIEF2YWlsYWJsZUNvbHVtbnM8VFJpZ2h0PiAmIHN0cmluZz4sXG4gICk6IHRoaXM7XG4gIC8vIE9OKEFORCk6IOy7rOufvCAo7Jew7IKw7J6QKSDsu6zrn7xcbiAgb24oXG4gICAgbGVmdDogQXZhaWxhYmxlQ29sdW1uczxUTGVmdD4sXG4gICAgb3BlcmF0b3I6IENvbXBhcmlzb25PcGVyYXRvcixcbiAgICByaWdodDogQXZhaWxhYmxlQ29sdW1uczxUUmlnaHQ+LFxuICApOiB0aGlzO1xuICBvbihcbiAgICBsZWZ0OiBBdmFpbGFibGVDb2x1bW5zPFRSaWdodD4sXG4gICAgb3BlcmF0b3I6IENvbXBhcmlzb25PcGVyYXRvcixcbiAgICByaWdodDogQXZhaWxhYmxlQ29sdW1uczxUTGVmdD4sXG4gICk6IHRoaXM7XG4gIC8vIE9OKEFORCk6IOy7rOufvCAo7Jew7IKw7J6QKSDqsJJcbiAgb24oXG4gICAgbGVmdDogQXZhaWxhYmxlQ29sdW1uczxUTGVmdD4sXG4gICAgb3BlcmF0b3I6IENvbXBhcmlzb25PcGVyYXRvcixcbiAgICByaWdodDogRXh0cmFjdENvbHVtblR5cGU8VExlZnQsIEF2YWlsYWJsZUNvbHVtbnM8VExlZnQ+ICYgc3RyaW5nPixcbiAgKTogdGhpcztcbiAgb24oXG4gICAgbGVmdDogQXZhaWxhYmxlQ29sdW1uczxUUmlnaHQ+LFxuICAgIG9wZXJhdG9yOiBDb21wYXJpc29uT3BlcmF0b3IsXG4gICAgcmlnaHQ6IEV4dHJhY3RDb2x1bW5UeXBlPFRSaWdodCwgQXZhaWxhYmxlQ29sdW1uczxUUmlnaHQ+ICYgc3RyaW5nPixcbiAgKTogdGhpcztcbiAgLy8gT04oQU5EKTog7L2c67CxXG4gIG9uKGNhbGxiYWNrOiAobmVzdGVkOiBKb2luQ2xhdXNlR3JvdXA8VExlZnQsIFRSaWdodD4pID0+IHZvaWQpOiB0aGlzO1xuICBvbihjYWxsYmFjazogKG5lc3RlZDogSm9pbkNsYXVzZUdyb3VwPFRSaWdodCwgVExlZnQ+KSA9PiB2b2lkKTogdGhpcztcbiAgLy8gT04oQU5EKSDqtaztmIRcbiAgb24oLi4uYXJnczogYW55W10pOiB0aGlzIHtcbiAgICAvLyBTQUZFVFk6IOy/vOumrCDruYzrjZTsnZgg7KCc64Sk66atIOqzhOyVveqzvCDshKDtlokg6rKA7Kad7J20IOydtCDtg4DsnoXsnYQg67O07J6l7ZWp64uI64ukLlxuICAgIHRoaXMuY2FsbGJhY2sub24oLi4uKGFyZ3MgYXMgW3N0cmluZywgc3RyaW5nXSkpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLy8gT04oT1IpOiDsu6zrn7wgPSDsu6zrn7xcbiAgb3JPbihsZWZ0OiBBdmFpbGFibGVDb2x1bW5zPFRMZWZ0PiwgcmlnaHQ6IEF2YWlsYWJsZUNvbHVtbnM8VFJpZ2h0Pik6IHRoaXM7XG4gIG9yT24obGVmdDogQXZhaWxhYmxlQ29sdW1uczxUUmlnaHQ+LCByaWdodDogQXZhaWxhYmxlQ29sdW1uczxUTGVmdD4pOiB0aGlzO1xuICAvLyBPTihPUik6IOy7rOufvCA9IOqwklxuICBvck9uKFxuICAgIGxlZnQ6IEF2YWlsYWJsZUNvbHVtbnM8VExlZnQ+LFxuICAgIHJpZ2h0OiBFeHRyYWN0Q29sdW1uVHlwZTxUTGVmdCwgQXZhaWxhYmxlQ29sdW1uczxUTGVmdD4gJiBzdHJpbmc+LFxuICApOiB0aGlzO1xuICBvck9uKFxuICAgIGxlZnQ6IEF2YWlsYWJsZUNvbHVtbnM8VFJpZ2h0PixcbiAgICByaWdodDogRXh0cmFjdENvbHVtblR5cGU8VFJpZ2h0LCBBdmFpbGFibGVDb2x1bW5zPFRSaWdodD4gJiBzdHJpbmc+LFxuICApOiB0aGlzO1xuICAvLyBPTihPUik6IOy7rOufvCAo7Jew7IKw7J6QKSDsu6zrn7xcbiAgb3JPbihcbiAgICBsZWZ0OiBBdmFpbGFibGVDb2x1bW5zPFRMZWZ0PixcbiAgICBvcGVyYXRvcjogQ29tcGFyaXNvbk9wZXJhdG9yLFxuICAgIHJpZ2h0OiBBdmFpbGFibGVDb2x1bW5zPFRSaWdodD4sXG4gICk6IHRoaXM7XG4gIG9yT24oXG4gICAgbGVmdDogQXZhaWxhYmxlQ29sdW1uczxUUmlnaHQ+LFxuICAgIG9wZXJhdG9yOiBDb21wYXJpc29uT3BlcmF0b3IsXG4gICAgcmlnaHQ6IEF2YWlsYWJsZUNvbHVtbnM8VExlZnQ+LFxuICApOiB0aGlzO1xuICAvLyBPTihPUik6IOy7rOufvCAo7Jew7IKw7J6QKSDqsJJcbiAgb3JPbihcbiAgICBsZWZ0OiBBdmFpbGFibGVDb2x1bW5zPFRMZWZ0PixcbiAgICBvcGVyYXRvcjogQ29tcGFyaXNvbk9wZXJhdG9yLFxuICAgIHJpZ2h0OiBFeHRyYWN0Q29sdW1uVHlwZTxUTGVmdCwgQXZhaWxhYmxlQ29sdW1uczxUTGVmdD4gJiBzdHJpbmc+LFxuICApOiB0aGlzO1xuICBvck9uKFxuICAgIGxlZnQ6IEF2YWlsYWJsZUNvbHVtbnM8VFJpZ2h0PixcbiAgICBvcGVyYXRvcjogQ29tcGFyaXNvbk9wZXJhdG9yLFxuICAgIHJpZ2h0OiBFeHRyYWN0Q29sdW1uVHlwZTxUUmlnaHQsIEF2YWlsYWJsZUNvbHVtbnM8VFJpZ2h0PiAmIHN0cmluZz4sXG4gICk6IHRoaXM7XG4gIC8vIE9OKE9SKTog7L2c67CxXG4gIG9yT24oY2FsbGJhY2s6IChuZXN0ZWQ6IEpvaW5DbGF1c2VHcm91cDxUTGVmdCwgVFJpZ2h0PikgPT4gdm9pZCk6IHRoaXM7XG4gIG9yT24oY2FsbGJhY2s6IChuZXN0ZWQ6IEpvaW5DbGF1c2VHcm91cDxUUmlnaHQsIFRMZWZ0PikgPT4gdm9pZCk6IHRoaXM7XG4gIC8vIE9OKE9SKSDqtaztmIRcbiAgb3JPbiguLi5hcmdzOiBhbnlbXSk6IHRoaXMge1xuICAgIC8vIFNBRkVUWTog7L+866asIOu5jOuNlOydmCDsoJzrhKTrpq0g6rOE7JW96rO8IOyEoO2WiSDqsoDspp3snbQg7J20IO2DgOyeheydhCDrs7TsnqXtlanri4jri6QuXG4gICAgdGhpcy5jYWxsYmFjay5vck9uKC4uLihhcmdzIGFzIFtzdHJpbmcsIHN0cmluZ10pKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8vIE9OIFZBTChBTkQpOiDsu6zrn7wgPSDqsJIgKOqwkuydhCDsu6zrn7wg7LC47KGw6rCAIOyVhOuLjCDtjIzrnbzrr7jthLDroZwg67CU7J2465SpKVxuICBvblZhbChjb2x1bW46IEF2YWlsYWJsZUNvbHVtbnM8VExlZnQ+LCB2YWx1ZTogYW55KTogdGhpcztcbiAgb25WYWwoY29sdW1uOiBBdmFpbGFibGVDb2x1bW5zPFRSaWdodD4sIHZhbHVlOiBhbnkpOiB0aGlzO1xuICBvblZhbChjb2x1bW46IEF2YWlsYWJsZUNvbHVtbnM8VExlZnQ+LCBvcGVyYXRvcjogQ29tcGFyaXNvbk9wZXJhdG9yLCB2YWx1ZTogYW55KTogdGhpcztcbiAgb25WYWwoY29sdW1uOiBBdmFpbGFibGVDb2x1bW5zPFRSaWdodD4sIG9wZXJhdG9yOiBDb21wYXJpc29uT3BlcmF0b3IsIHZhbHVlOiBhbnkpOiB0aGlzO1xuICBvblZhbCguLi5hcmdzOiBhbnlbXSk6IHRoaXMge1xuICAgIC8vIFNBRkVUWTog7L+866asIOu5jOuNlOydmCDsoJzrhKTrpq0g6rOE7JW96rO8IOyEoO2WiSDqsoDspp3snbQg7J20IO2DgOyeheydhCDrs7TsnqXtlanri4jri6QuXG4gICAgKHRoaXMuY2FsbGJhY2sgYXMgYW55KS5vblZhbCguLi5hcmdzKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8vIEFORCBPTiBWQUw6IG9uVmFs7J2YIOuqheyLnOyggSBhbGlhcyAoS25leCDtmLjtmZgpXG4gIGFuZE9uVmFsKGNvbHVtbjogQXZhaWxhYmxlQ29sdW1uczxUTGVmdD4sIHZhbHVlOiBhbnkpOiB0aGlzO1xuICBhbmRPblZhbChjb2x1bW46IEF2YWlsYWJsZUNvbHVtbnM8VFJpZ2h0PiwgdmFsdWU6IGFueSk6IHRoaXM7XG4gIGFuZE9uVmFsKGNvbHVtbjogQXZhaWxhYmxlQ29sdW1uczxUTGVmdD4sIG9wZXJhdG9yOiBDb21wYXJpc29uT3BlcmF0b3IsIHZhbHVlOiBhbnkpOiB0aGlzO1xuICBhbmRPblZhbChjb2x1bW46IEF2YWlsYWJsZUNvbHVtbnM8VFJpZ2h0Piwgb3BlcmF0b3I6IENvbXBhcmlzb25PcGVyYXRvciwgdmFsdWU6IGFueSk6IHRoaXM7XG4gIGFuZE9uVmFsKC4uLmFyZ3M6IGFueVtdKTogdGhpcyB7XG4gICAgLy8gU0FGRVRZOiDsv7zrpqwg67mM642U7J2YIOygnOuEpOumrSDqs4Tslb3qs7wg7ISg7ZaJIOqygOymneydtCDsnbQg7YOA7J6F7J2EIOuztOyepe2VqeuLiOuLpC5cbiAgICAodGhpcy5jYWxsYmFjayBhcyBhbnkpLmFuZE9uVmFsKC4uLmFyZ3MpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLy8gT1IgT04gVkFMOiBPUiDsobDqsbTsnLzroZwg6rCSIOuwlOyduOuUqVxuICBvck9uVmFsKGNvbHVtbjogQXZhaWxhYmxlQ29sdW1uczxUTGVmdD4sIHZhbHVlOiBhbnkpOiB0aGlzO1xuICBvck9uVmFsKGNvbHVtbjogQXZhaWxhYmxlQ29sdW1uczxUUmlnaHQ+LCB2YWx1ZTogYW55KTogdGhpcztcbiAgb3JPblZhbChjb2x1bW46IEF2YWlsYWJsZUNvbHVtbnM8VExlZnQ+LCBvcGVyYXRvcjogQ29tcGFyaXNvbk9wZXJhdG9yLCB2YWx1ZTogYW55KTogdGhpcztcbiAgb3JPblZhbChjb2x1bW46IEF2YWlsYWJsZUNvbHVtbnM8VFJpZ2h0Piwgb3BlcmF0b3I6IENvbXBhcmlzb25PcGVyYXRvciwgdmFsdWU6IGFueSk6IHRoaXM7XG4gIG9yT25WYWwoLi4uYXJnczogYW55W10pOiB0aGlzIHtcbiAgICAvLyBTQUZFVFk6IOy/vOumrCDruYzrjZTsnZgg7KCc64Sk66atIOqzhOyVveqzvCDshKDtlokg6rKA7Kad7J20IOydtCDtg4DsnoXsnYQg67O07J6l7ZWp64uI64ukLlxuICAgICh0aGlzLmNhbGxiYWNrIGFzIGFueSkub3JPblZhbCguLi5hcmdzKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxufVxuXG4vKlxuICBUUmVzb2x2ZWQ6IOy/vOumrCDsi6Ttlokg7ZuEIOuwmO2ZmOuQoCDqsrDqs7wg7YOA7J6FXG4gIFRSZXR1cm5pbmc6IFJFVFVSTklORyDsoIjsl5Ag7IKs7Jqp65CgIO2DgOyehVxuKi9cbmV4cG9ydCBjbGFzcyBSZXNvbHZlZFB1cmk8VFJlc29sdmVkLCBUUmV0dXJuaW5nPiBpbXBsZW1lbnRzIFByb21pc2U8VFJlc29sdmVkPiB7XG4gIGNvbnN0cnVjdG9yKFxuICAgIHB1YmxpYyBrbmV4UXVlcnk6IEtuZXguUXVlcnlCdWlsZGVyLFxuICAgIHByaXZhdGUga25leDogS25leCxcbiAgICBwcml2YXRlIHRhYmxlU3BlYzogVGFibGVTcGVjIHwgbnVsbCA9IG51bGwsXG4gICkge31cblxuICBbU3ltYm9sLnRvU3RyaW5nVGFnXTogc3RyaW5nID0gXCJQcm9taXNlXCI7XG5cbiAgdG9RdWVyeSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmtuZXhRdWVyeS50b1F1ZXJ5KCk7XG4gIH1cblxuICBkZWJ1ZygpOiB0aGlzIHtcbiAgICBjb25zb2xlLmxvZyhgJHtjaGFsay5jeWFuKFwiW1B1cmkgRGVidWddXCIpfSAke2NoYWxrLnllbGxvdyh0aGlzLnRvUXVlcnkoKSl9YCk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICB0aGVuPFRSZXN1bHQxID0gVFJlc29sdmVkLCBUUmVzdWx0MiA9IG5ldmVyPihcbiAgICBvbmZ1bGZpbGxlZD86ICgodmFsdWU6IFRSZXNvbHZlZCkgPT4gVFJlc3VsdDEgfCBQcm9taXNlTGlrZTxUUmVzdWx0MT4pIHwgbnVsbCxcbiAgICBvbnJlamVjdGVkPzogKChyZWFzb246IGFueSkgPT4gVFJlc3VsdDIgfCBQcm9taXNlTGlrZTxUUmVzdWx0Mj4pIHwgbnVsbCxcbiAgKTogUHJvbWlzZTxUUmVzdWx0MSB8IFRSZXN1bHQyPiB7XG4gICAgTmFpdGUudChcInB1cmk6ZXhlY3V0ZWQtcXVlcnlcIiwgdGhpcy50b1F1ZXJ5KCkpO1xuICAgIC8vIFNBRkVUWTog7L+866asIOu5jOuNlOydmCDsoJzrhKTrpq0g6rOE7JW96rO8IOyEoO2WiSDqsoDspp3snbQg7J20IO2DgOyeheydhCDrs7TsnqXtlanri4jri6QuXG4gICAgcmV0dXJuIHRoaXMua25leFF1ZXJ5LnRoZW4ob25mdWxmaWxsZWQgYXMgYW55LCBvbnJlamVjdGVkKTtcbiAgfVxuXG4gIGNhdGNoPFRSZXN1bHQyID0gbmV2ZXI+KFxuICAgIG9ucmVqZWN0ZWQ/OiAoKHJlYXNvbjogYW55KSA9PiBUUmVzdWx0MiB8IFByb21pc2VMaWtlPFRSZXN1bHQyPikgfCBudWxsLFxuICApOiBQcm9taXNlPFRSZXNvbHZlZCB8IFRSZXN1bHQyPiB7XG4gICAgcmV0dXJuIHRoaXMua25leFF1ZXJ5LmNhdGNoKG9ucmVqZWN0ZWQpO1xuICB9XG5cbiAgZmluYWxseShvbmZpbmFsbHk/OiAoKCkgPT4gdm9pZCkgfCBudWxsKTogUHJvbWlzZTxUUmVzb2x2ZWQ+IHtcbiAgICByZXR1cm4gdGhpcy5rbmV4UXVlcnkuZmluYWxseShvbmZpbmFsbHkpO1xuICB9XG5cbiAgLy8gT04gQ09ORkxJQ1QgLSDsu6zrn7wg6riw67CYXG4gIG9uQ29uZmxpY3Q8VFRhYmxlcyBleHRlbmRzIFJlY29yZDxzdHJpbmcsIFRSZXR1cm5pbmc+PihcbiAgICBjb2x1bW5zOiBzdHJpbmcgfCBzdHJpbmdbXSxcbiAgICBhY3Rpb24/OiBPbkNvbmZsaWN0QWN0aW9uPFRUYWJsZXM+LFxuICApOiB0aGlzIHtcbiAgICBjb25zdCB0YXJnZXQgPSBBcnJheS5pc0FycmF5KGNvbHVtbnMpID8gY29sdW1ucyA6IFtjb2x1bW5zXTtcblxuICAgIGlmICghYWN0aW9uIHx8IGFjdGlvbiA9PT0gXCJub3RoaW5nXCIpIHtcbiAgICAgIC8vIERPIE5PVEhJTkdcbiAgICAgIHRoaXMua25leFF1ZXJ5Lm9uQ29uZmxpY3QodGFyZ2V0KS5pZ25vcmUoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gRE8gVVBEQVRFXG4gICAgICBjb25zdCB7IHVwZGF0ZSB9ID0gYWN0aW9uO1xuXG4gICAgICAvLyBhY3Rpb24udXBkYXRlIOuwsOyXtCDtmJXtg5wgOiBbXCJuYW1lXCIsIFwiZW1haWxcIl1cbiAgICAgIGlmIChBcnJheS5pc0FycmF5KHVwZGF0ZSkpIHtcbiAgICAgICAgdGhpcy5rbmV4UXVlcnkub25Db25mbGljdCh0YXJnZXQpLm1lcmdlKHVwZGF0ZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBhY3Rpb24udXBkYXRlIOqwneyytCDtmJXtg5w6IHsgbmFtZTogXCJKb2huXCIsIGNvdW50OiByYXcoLi4uKSB9XG4gICAgICAgIGNvbnN0IG1lcmdlT2JqID0ge307XG5cbiAgICAgICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXModXBkYXRlKSkge1xuICAgICAgICAgIGNvbnN0IG1lcmdlZFZhbHVlID0gaXNTcWxFeHByZXNzaW9uKHZhbHVlKVxuICAgICAgICAgICAgPyB0aGlzLmtuZXgucmF3KHZhbHVlW1wiX3NxbFwiXSlcbiAgICAgICAgICAgIDogc2VyaWFsaXplSnNvbkNvbHVtblZhbHVlKHRoaXMudGFibGVTcGVjLCBrZXksIHZhbHVlKTtcbiAgICAgICAgICBPYmplY3QuYXNzaWduKG1lcmdlT2JqLCB7IFtrZXldOiBtZXJnZWRWYWx1ZSB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMua25leFF1ZXJ5Lm9uQ29uZmxpY3QodGFyZ2V0KS5tZXJnZShtZXJnZU9iaik7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvLyBSRVRVUk5JTkc6IFwiKlwiIC0g7KCE7LK0IOy7rOufvFxuICByZXR1cm5pbmcoY29sdW1uOiBcIipcIik6IFJlc29sdmVkUHVyaTxUUmV0dXJuaW5nW10sIG5ldmVyPjtcbiAgLy8gUkVUVVJOSU5HOiDri6jsnbwg7Lus65+8XG4gIHJldHVybmluZzxUQ29sdW1uIGV4dGVuZHMgQ29sdW1uS2V5czxUUmV0dXJuaW5nPj4oXG4gICAgY29sdW1uOiBUQ29sdW1uLFxuICApOiBSZXNvbHZlZFB1cmk8UGljazxUUmV0dXJuaW5nLCBUQ29sdW1uPltdLCBuZXZlcj47XG4gIC8vIFJFVFVSTklORzog67O17IiYIOy7rOufvCAo67Cw7Je0KVxuICByZXR1cm5pbmc8VENvbHVtbiBleHRlbmRzIENvbHVtbktleXM8VFJldHVybmluZz4+KFxuICAgIGNvbHVtbnM6IFRDb2x1bW5bXSxcbiAgKTogUmVzb2x2ZWRQdXJpPFBpY2s8VFJldHVybmluZywgVENvbHVtbj5bXSwgbmV2ZXI+O1xuICAvLyBSRVRVUk5JTkcg6rWs7ZiEXG4gIHJldHVybmluZyhjb2x1bW5PckNvbHVtbnM6IHN0cmluZyB8IHN0cmluZ1tdKTogUmVzb2x2ZWRQdXJpPGFueVtdLCBuZXZlcj4ge1xuICAgIHRoaXMua25leFF1ZXJ5LnJldHVybmluZyhjb2x1bW5PckNvbHVtbnMpO1xuICAgIHJldHVybiBuZXcgUmVzb2x2ZWRQdXJpKHRoaXMua25leFF1ZXJ5LCB0aGlzLmtuZXgsIHRoaXMudGFibGVTcGVjKTtcbiAgfVxufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7QUFxR0EsU0FBZ0IsbUJBQW1CLFVBQWtDO0NBQ25FLE1BQU0sYUFBYSxVQUFVLEtBQUssS0FBSztDQUN2QyxNQUFNLGdCQUFnQixnQkFBZ0IsTUFBTSxjQUFjLGNBQWMsVUFBVTtDQUVsRixJQUFJLENBQUMsZUFDSCxNQUFNLElBQUksTUFBTSwyQkFBMkIsWUFBWSxJQUFJO0NBRzdELE9BQU87QUFDVDtBQUVBLFNBQVMsMkJBQWtDLE9B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
1150
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHVyaS5qcyIsIm5hbWVzIjpbXSwic291cmNlcyI6WyIuLi8uLi9zcmMvZGF0YWJhc2UvcHVyaS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKiBveGxpbnQtZGlzYWJsZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55ICovIC8vIFB1cmnripQg64uk7JaR7ZWcIO2DgOyeheydhCDsgqzsmqntlZjqs6Ag7J6I7Iq164uI64ukLlxuXG5pbXBvcnQgYXNzZXJ0IGZyb20gXCJhc3NlcnRcIjtcblxuaW1wb3J0IGNoYWxrIGZyb20gXCJjaGFsa1wiO1xuaW1wb3J0IGluZmxlY3Rpb24gZnJvbSBcImluZmxlY3Rpb25cIjtcbmltcG9ydCB7IHR5cGUgS25leCB9IGZyb20gXCJrbmV4XCI7XG5cbmltcG9ydCB7IEVudGl0eU1hbmFnZXIgfSBmcm9tIFwiLi4vZW50aXR5L2VudGl0eS1tYW5hZ2VyXCI7XG5pbXBvcnQgeyB0eXBlIFRhYmxlU3BlYyB9IGZyb20gXCIuLi9lbnRpdHkvZW50aXR5LW1hbmFnZXJcIjtcbmltcG9ydCB7IE5haXRlIH0gZnJvbSBcIi4uL25haXRlL25haXRlXCI7XG5pbXBvcnQge1xuICBpc0Z1bmN0aW9uVmFsdWUsXG4gIGlzTnVtYmVyVmFsdWUsXG4gIGlzT2JqZWN0VmFsdWUsXG4gIGlzU3RyaW5nVmFsdWUsXG59IGZyb20gXCIuLi91dGlscy9ydW50aW1lLXZhbHVlXCI7XG5pbXBvcnQgeyB0eXBlIENsZWFyU3RhdGVtZW50cyB9IGZyb20gXCIuL3B1cmktc3Vic2V0LnR5cGVzXCI7XG5pbXBvcnQge1xuICB0eXBlIEF2YWlsYWJsZUNvbHVtbnMsXG4gIHR5cGUgQ29sdW1uS2V5cyxcbiAgdHlwZSBDb21wYXJpc29uT3BlcmF0b3IsXG4gIHR5cGUgRXhwYW5kLFxuICB0eXBlIEV4dHJhY3RDb2x1bW5UeXBlLFxuICB0eXBlIEZ1bGx0ZXh0Q29sdW1ucyxcbiAgdHlwZSBGdXp6eU9wZXJhdG9yLFxuICB0eXBlIEluc2VydERhdGEsXG4gIHR5cGUgSW5zZXJ0UmVzdWx0LFxuICB0eXBlIEpzb25Db2x1bW5zLFxuICB0eXBlIEpzb25TdXBlcnNldFZhbHVlLFxuICB0eXBlIExlZnRKb2luZWRNYXJrZXIsXG4gIHR5cGUgTGVmdEpvaW5NYXJrZXJGb3IsXG4gIHR5cGUgTnVtZXJpY0NvbHVtbnMsXG4gIHR5cGUgT25Db25mbGljdEFjdGlvbixcbiAgdHlwZSBQYXJzZVNlbGVjdE9iamVjdCxcbiAgdHlwZSBSZXN1bHRBdmFpbGFibGVDb2x1bW5zLFxuICB0eXBlIFNlbGVjdEFsbFJlc3VsdCxcbiAgdHlwZSBTZWxlY3RPYmplY3QsXG4gIHR5cGUgU2VsZWN0VmFsdWUsXG4gIHR5cGUgU2luZ2xlVGFibGVWYWx1ZSxcbiAgdHlwZSBTcWxFeHByZXNzaW9uLFxuICB0eXBlIFRzSGlnaGxpZ2h0T3B0aW9ucyxcbiAgdHlwZSBUc1F1ZXJ5Q29uZmlnLFxuICB0eXBlIFRzUXVlcnlPcHRpb25zLFxuICB0eXBlIFRzUmFua09wdGlvbnMsXG4gIHR5cGUgVmVjdG9yQ29sdW1ucyxcbiAgdHlwZSBXaGVyZUNvbmRpdGlvbixcbiAgdHlwZSBXaGVyZU9wZXJhdG9yLFxufSBmcm9tIFwiLi9wdXJpLnR5cGVzXCI7XG5pbXBvcnQgeyBGVVpaWV9PUEVSQVRPUlMgfSBmcm9tIFwiLi9wdXJpLnR5cGVzXCI7XG5cbnR5cGUgUHVyaU9yZGVyQnlEaXJlY3Rpb24gPSBcImFzY1wiIHwgXCJkZXNjXCI7XG50eXBlIFB1cmlPcmRlckJ5TnVsbHMgPSBcImZpcnN0XCIgfCBcImxhc3RcIjtcbnR5cGUgQW55U3FsRXhwcmVzc2lvbiA9IFNxbEV4cHJlc3Npb248XG4gIFwic3RyaW5nXCIgfCBcIm51bWJlclwiIHwgXCJib29sZWFuXCIgfCBcImRhdGVcIiB8IFwic3RyaW5nW11cIiB8IFwidHN2ZWN0b3JcIixcbiAgYm9vbGVhblxuPjtcbnR5cGUgU3RyaW5nU3FsRXhwcmVzc2lvbjxUTnVsbGFibGUgZXh0ZW5kcyBib29sZWFuID0gYm9vbGVhbj4gPSBTcWxFeHByZXNzaW9uPFwic3RyaW5nXCIsIFROdWxsYWJsZT47XG50eXBlIFB1cmlPcmRlckJ5RXhwcmVzc2lvbiA9IFNxbEV4cHJlc3Npb248XCJudW1iZXJcIiB8IFwic3RyaW5nXCIsIGJvb2xlYW4+O1xudHlwZSBTdHJpbmdFeHByZXNzaW9uU2VsZWN0ID0gUmVjb3JkPHN0cmluZywgU3RyaW5nU3FsRXhwcmVzc2lvbj47XG50eXBlIFN0cmluZ0V4cHJlc3Npb25TZWxlY3RSZXN1bHQ8VFNlbGVjdCBleHRlbmRzIFN0cmluZ0V4cHJlc3Npb25TZWxlY3Q+ID0ge1xuICBbSyBpbiBrZXlvZiBUU2VsZWN0XTogVFNlbGVjdFtLXSBleHRlbmRzIFNxbEV4cHJlc3Npb248XCJzdHJpbmdcIiwgaW5mZXIgVE51bGxhYmxlPlxuICAgID8gdHJ1ZSBleHRlbmRzIFROdWxsYWJsZVxuICAgICAgPyBzdHJpbmcgfCBudWxsXG4gICAgICA6IHN0cmluZ1xuICAgIDogbmV2ZXI7XG59O1xudHlwZSBQdXJpT3JkZXJCeUl0ZW08VENvbHVtbiBleHRlbmRzIHN0cmluZz4gPSB7XG4gIGNvbHVtbjogVENvbHVtbiB8IFB1cmlPcmRlckJ5RXhwcmVzc2lvbjtcbiAgb3JkZXI/OiBQdXJpT3JkZXJCeURpcmVjdGlvbjtcbiAgbnVsbHM/OiBQdXJpT3JkZXJCeU51bGxzO1xufTtcbnR5cGUgUHVyaU9yZGVyQnlFbnRyeTxUQ29sdW1uIGV4dGVuZHMgc3RyaW5nPiA9XG4gIHwgVENvbHVtblxuICB8IFB1cmlPcmRlckJ5RXhwcmVzc2lvblxuICB8IFB1cmlPcmRlckJ5SXRlbTxUQ29sdW1uPjtcbnR5cGUgUHVyaU9yZGVyQnlSdW50aW1lSXRlbSA9IHtcbiAgY29sdW1uOiBzdHJpbmcgfCBQdXJpT3JkZXJCeUV4cHJlc3Npb247XG4gIG9yZGVyPzogUHVyaU9yZGVyQnlEaXJlY3Rpb247XG4gIG51bGxzPzogUHVyaU9yZGVyQnlOdWxscztcbn07XG50eXBlIFB1cmlPcmRlckJ5UnVudGltZUVudHJ5ID0gc3RyaW5nIHwgUHVyaU9yZGVyQnlFeHByZXNzaW9uIHwgUHVyaU9yZGVyQnlSdW50aW1lSXRlbTtcblxudHlwZSBGcm9tUmVnaXN0cmF0aW9uID0ge1xuICBraW5kOiBcImZyb21cIjtcbiAgYWxpYXM6IHN0cmluZztcbiAgdGFibGU6IHN0cmluZyB8IG51bGw7XG59O1xuXG50eXBlIEpvaW5SZWdpc3RyYXRpb24gPSB7XG4gIGtpbmQ6IFwiam9pblwiO1xuICBhbGlhczogc3RyaW5nO1xuICB0YWJsZTogc3RyaW5nIHwgbnVsbDtcbiAgam9pblR5cGU6IFwiam9pblwiIHwgXCJsZWZ0Sm9pblwiO1xuICBsZWZ0OiBzdHJpbmcgfCBudWxsO1xuICByaWdodDogc3RyaW5nIHwgbnVsbDtcbiAgcmV1c2FibGU6IGJvb2xlYW47XG59O1xuXG50eXBlIENvcnJlbGF0aW9uUmVnaXN0cmF0aW9uID0gRnJvbVJlZ2lzdHJhdGlvbiB8IEpvaW5SZWdpc3RyYXRpb247XG5cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZUZ1enp5T3BlcmF0b3Iob3BlcmF0b3I/OiBzdHJpbmcpOiBGdXp6eU9wZXJhdG9yIHtcbiAgY29uc3Qgbm9ybWFsaXplZCA9IG9wZXJhdG9yPy50cmltKCkgPz8gXCI8JVwiO1xuICBjb25zdCBmdXp6eU9wZXJhdG9yID0gRlVaWllfT1BFUkFUT1JTLmZpbmQoKGNhbmRpZGF0ZSkgPT4gY2FuZGlkYXRlID09PSBub3JtYWxpemVkKTtcblxuICBpZiAoIWZ1enp5T3BlcmF0b3IpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgZnV6enkgb3BlcmF0b3I6ICR7b3BlcmF0b3IgPz8gXCJcIn1gKTtcbiAgfVxuXG4gIHJldHVybiBmdXp6eU9wZXJhdG9yO1xufVxuXG5mdW5jdGlvbiBzZXJpYWxpemVKc29uU3VwZXJzZXRWYWx1ZTxWYWx1ZT4odmFsdWU6IFZhbHVlKTogc3RyaW5nIHtcbiAgY29uc3Qgc2VyaWFsaXplZCA9IEpTT04uc3RyaW5naWZ5KHZhbHVlKTtcblxuICBpZiAoc2VyaWFsaXplZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcbiAgICAgIFwiUHVyaSBKU09OQiBjb250YWlubWVudCB2YWx1ZSBtdXN0IGJlIEpTT04tc2VyaWFsaXphYmxlOyBKU09OLnN0cmluZ2lmeSByZXR1cm5lZCB1bmRlZmluZWQuXCIsXG4gICAgKTtcbiAgfVxuXG4gIHJldHVybiBzZXJpYWxpemVkO1xufVxuXG5mdW5jdGlvbiBzZXJpYWxpemVKc29uQ29sdW1uVmFsdWU8VmFsdWU+KFxuICB0YWJsZVNwZWM6IFRhYmxlU3BlYyB8IG51bGwsXG4gIGNvbHVtbjogc3RyaW5nLFxuICB2YWx1ZTogVmFsdWUsXG4pOiBWYWx1ZSB8IHN0cmluZyB7XG4gIGlmICghdGFibGVTcGVjPy5qc29uQ29sdW1ucy5pbmNsdWRlcyhjb2x1bW4pIHx8IHZhbHVlID09PSB1bmRlZmluZWQgfHwgdmFsdWUgPT09IG51bGwpIHtcbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cblxuICByZXR1cm4gSlNPTi5zdHJpbmdpZnkodmFsdWUpO1xufVxuXG5mdW5jdGlvbiBub3JtYWxpemVPcmRlckJ5RGlyZWN0aW9uKGRpcmVjdGlvbjogUHVyaU9yZGVyQnlEaXJlY3Rpb24gPSBcImFzY1wiKTogUHVyaU9yZGVyQnlEaXJlY3Rpb24ge1xuICBpZiAoZGlyZWN0aW9uICE9PSBcImFzY1wiICYmIGRpcmVjdGlvbiAhPT0gXCJkZXNjXCIpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgb3JkZXIgZGlyZWN0aW9uOiAke2RpcmVjdGlvbn1gKTtcbiAgfVxuXG4gIHJldHVybiBkaXJlY3Rpb247XG59XG5cbmZ1bmN0aW9uIG5vcm1hbGl6ZU9yZGVyQnlOdWxscyhudWxscz86IFB1cmlPcmRlckJ5TnVsbHMpOiBQdXJpT3JkZXJCeU51bGxzIHwgdW5kZWZpbmVkIHtcbiAgaWYgKG51bGxzID09PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgaWYgKG51bGxzICE9PSBcImZpcnN0XCIgJiYgbnVsbHMgIT09IFwibGFzdFwiKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIG9yZGVyIG51bGxzOiAke251bGxzfWApO1xuICB9XG5cbiAgcmV0dXJuIG51bGxzO1xufVxuXG5mdW5jdGlvbiBmb3JtYXROdWxsc1N1ZmZpeChudWxscz86IFB1cmlPcmRlckJ5TnVsbHMpOiBzdHJpbmcge1xuICBpZiAoIW51bGxzKSB7XG4gICAgcmV0dXJuIFwiXCI7XG4gIH1cblxuICByZXR1cm4gYCBOVUxMUyAke251bGxzLnRvVXBwZXJDYXNlKCl9YDtcbn1cblxuZnVuY3Rpb24gaXNPcmRlckJ5RW50cmllczxWYWx1ZT4oXG4gIHZhbHVlOiBWYWx1ZSxcbik6IHZhbHVlIGlzIFZhbHVlICYgcmVhZG9ubHkgUHVyaU9yZGVyQnlSdW50aW1lRW50cnlbXSB7XG4gIHJldHVybiBBcnJheS5pc0FycmF5KHZhbHVlKTtcbn1cblxuZnVuY3Rpb24gaXNTcWxFeHByZXNzaW9uPFZhbHVlPih2YWx1ZTogVmFsdWUpOiB2YWx1ZSBpcyBWYWx1ZSAmIEFueVNxbEV4cHJlc3Npb24ge1xuICByZXR1cm4gaXNPYmplY3RWYWx1ZSh2YWx1ZSkgJiYgXCJfdHlwZVwiIGluIHZhbHVlICYmIHZhbHVlW1wiX3R5cGVcIl0gPT09IFwic3FsX2V4cHJlc3Npb25cIjtcbn1cblxuZnVuY3Rpb24gaXNPcmRlckJ5RXhwcmVzc2lvbjxWYWx1ZT4odmFsdWU6IFZhbHVlKTogdmFsdWUgaXMgVmFsdWUgJiBQdXJpT3JkZXJCeUV4cHJlc3Npb24ge1xuICByZXR1cm4gaXNTcWxFeHByZXNzaW9uKHZhbHVlKTtcbn1cblxuZnVuY3Rpb24gaXNOZXN0ZWRTZWxlY3RPYmplY3Q8VFRhYmxlcyBleHRlbmRzIG9iamVjdD4oXG4gIHZhbHVlOiBTZWxlY3RWYWx1ZTxUVGFibGVzPiB8IFNlbGVjdE9iamVjdDxUVGFibGVzPixcbik6IHZhbHVlIGlzIFNlbGVjdE9iamVjdDxUVGFibGVzPiB7XG4gIHJldHVybiBpc09iamVjdFZhbHVlKHZhbHVlKSAmJiAhKFwiX3R5cGVcIiBpbiB2YWx1ZSk7XG59XG5cbmV4cG9ydCBjbGFzcyBQdXJpPFRTY2hlbWEsIFRUYWJsZXMgZXh0ZW5kcyBvYmplY3QsIFRSZXN1bHQ+IHtcbiAgcHJpdmF0ZSBrbmV4UXVlcnk6IEtuZXguUXVlcnlCdWlsZGVyO1xuICBwcml2YXRlIHRhYmxlU3BlYzogVGFibGVTcGVjIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgY29ycmVsYXRpb25SZWdpc3RyeSA9IG5ldyBNYXA8c3RyaW5nLCBDb3JyZWxhdGlvblJlZ2lzdHJhdGlvbj4oKTtcblxuICAvLyDsg53shLHsnpAg7Iuc6re464uI7LKY65OkXG4gIGNvbnN0cnVjdG9yKGtuZXg6IEtuZXgsIHRhYmxlTmFtZTogc3RyaW5nKTtcbiAgY29uc3RydWN0b3Ioa25leDogS25leCwgdGFibGVTb3VyY2U6IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IFB1cmk8VFNjaGVtYSwgYW55LCBhbnk+Pik7XG4gIGNvbnN0cnVjdG9yKFxuICAgIHB1YmxpYyBrbmV4OiBLbmV4LFxuICAgIHRhYmxlTmFtZU9yU291cmNlOiBhbnksXG4gICkge1xuICAgIGlmIChpc1N0cmluZ1ZhbHVlKHRhYmxlTmFtZU9yU291cmNlKSkge1xuICAgICAgLy8gQ2FzZTogbmV3IFB1cmkoa25leCwgXCJ1c2Vyc1wiKVxuICAgICAgdGhpcy5rbmV4UXVlcnkgPSB0aGlzLmtuZXgodGFibGVOYW1lT3JTb3VyY2UpLmZyb20odGFibGVOYW1lT3JTb3VyY2UpO1xuICAgICAgdGhpcy50YWJsZVNwZWMgPSB0aGlzLnNhZmVHZXRUYWJsZVNwZWModGFibGVOYW1lT3JTb3VyY2UpO1xuICAgICAgdGhpcy5jb3JyZWxhdGlvblJlZ2lzdHJ5LnNldCh0YWJsZU5hbWVPclNvdXJjZSwge1xuICAgICAgICBraW5kOiBcImZyb21cIixcbiAgICAgICAgYWxpYXM6IHRhYmxlTmFtZU9yU291cmNlLFxuICAgICAgICB0YWJsZTogdGFibGVOYW1lT3JTb3VyY2UsXG4gICAgICB9KTtcbiAgICB9IGVsc2UgaWYgKGlzT2JqZWN0VmFsdWUodGFibGVOYW1lT3JTb3VyY2UpKSB7XG4gICAgICBjb25zdCBlbnRyaWVzID0gT2JqZWN0LmVudHJpZXModGFibGVOYW1lT3JTb3VyY2UpO1xuICAgICAgaWYgKGVudHJpZXMubGVuZ3RoICE9PSAxKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIlRhYmxlIHNwZWMgbXVzdCBoYXZlIGV4YWN0bHkgb25lIGVudHJ5XCIpO1xuICAgICAgfVxuICAgICAgYXNzZXJ0KGVudHJpZXNbMF0pO1xuICAgICAgY29uc3QgW2FsaWFzLCBzb3VyY2VdID0gZW50cmllc1swXTtcbiAgICAgIGlmIChpc1N0cmluZ1ZhbHVlKHNvdXJjZSkpIHtcbiAgICAgICAgdGhpcy5rbmV4UXVlcnkgPSB0aGlzLmtuZXgoc291cmNlKS5mcm9tKHsgW2FsaWFzXTogc291cmNlIH0pO1xuICAgICAgICB0aGlzLnRhYmxlU3BlYyA9IHRoaXMuc2FmZUdldFRhYmxlU3BlYyhzb3VyY2UpO1xuICAgICAgICB0aGlzLmNvcnJlbGF0aW9uUmVnaXN0cnkuc2V0KGFsaWFzLCB7IGtpbmQ6IFwiZnJvbVwiLCBhbGlhcywgdGFibGU6IHNvdXJjZSB9KTtcbiAgICAgIH0gZWxzZSBpZiAoc291cmNlIGluc3RhbmNlb2YgUHVyaSkge1xuICAgICAgICBjb25zdCBzdWJxdWVyeUJ1aWxkZXIgPSBzb3VyY2UucmF3UXVlcnkoKTtcbiAgICAgICAgdGhpcy5rbmV4UXVlcnkgPSB0aGlzLmtuZXguZnJvbShzdWJxdWVyeUJ1aWxkZXIuYXMoYWxpYXMpKTtcbiAgICAgICAgdGhpcy5jb3JyZWxhdGlvblJlZ2lzdHJ5LnNldChhbGlhcywgeyBraW5kOiBcImZyb21cIiwgYWxpYXMsIHRhYmxlOiBudWxsIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiSW52YWxpZCB0YWJsZSBzcGVjaWZpY2F0aW9uXCIpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIHRhYmxlIHNwZWNpZmljYXRpb25cIik7XG4gICAgfVxuICB9XG5cbiAgc2FmZUdldFRhYmxlU3BlYyh0YWJsZU5hbWU6IHN0cmluZyk6IFRhYmxlU3BlYyB8IG51bGwge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gRW50aXR5TWFuYWdlci5nZXRUYWJsZVNwZWModGFibGVOYW1lKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgfVxuXG4gIC8vIFN0YXRpYyBTUUwgaGVscGVyIGZ1bmN0aW9ucyBmb3IgU0VMRUNUXG4gIHN0YXRpYyBjb3VudChjb2x1bW46IHN0cmluZyA9IFwiKlwiKTogU3FsRXhwcmVzc2lvbjxcIm51bWJlclwiPiB7XG4gICAgcmV0dXJuIHtcbiAgICAgIF90eXBlOiBcInNxbF9leHByZXNzaW9uXCIsXG4gICAgICBfcmV0dXJuOiBcIm51bWJlclwiLFxuICAgICAgX3NxbDogYENPVU5UKD8/KTo6aW50ZWdlcmAsXG4gICAgICBfcGFyYW1zOiBbY29sdW1uXSxcbiAgICB9O1xuICB9XG4gIHN0YXRpYyBzdW0oY29sdW1uOiBzdHJpbmcpOiBTcWxFeHByZXNzaW9uPFwibnVtYmVyXCI+IHtcbiAgICByZXR1cm4ge1xuICAgICAgX3R5cGU6IFwic3FsX2V4cHJlc3Npb25cIixcbiAgICAgIF9yZXR1cm46IFwibnVtYmVyXCIsXG4gICAgICBfc3FsOiBgU1VNKD8/KWAsXG4gICAgICBfcGFyYW1zOiBbY29sdW1uXSxcbiAgICB9O1xuICB9XG4gIHN0YXRpYyBhdmcoY29sdW1uOiBzdHJpbmcpOiBTcWxFeHByZXNzaW9uPFwibnVtYmVyXCI+IHtcbiAgICByZXR1cm4ge1xuICAgICAgX3R5cGU6IFwic3FsX2V4cHJlc3Npb25cIixcbiAgICAgIF9yZXR1cm46IFwibnVtYmVyXCIsXG4gICAgICBfc3FsOiBgQVZHKD8/KWAsXG4gICAgICBfcGFyYW1zOiBbY29sdW1uXSxcbiAgICB9O1xuICB9XG4gIHN0YXRpYyBtYXgoY29sdW1uOiBzdHJpbmcpOiBTcWxFeHByZXNzaW9uPFwibnVtYmVyXCI+IHtcbiAgICByZXR1cm4ge1xuICAgICAgX3R5cGU6IFwic3FsX2V4cHJlc3Npb25cIixcbiAgICAgIF9yZXR1cm46IFwibnVtYmVyXCIsXG4gICAgICBfc3FsOiBgTUFYKD8/KWAsXG4gICAgICBfcGFyYW1zOiBbY29sdW1uXSxcbiAgICB9O1xuICB9XG4gIHN0YXRpYyBtaW4oY29sdW1uOiBzdHJpbmcpOiBTcWxFeHByZXNzaW9uPFwibnVtYmVyXCI+IHtcbiAgICByZXR1cm4ge1xuICAgICAgX3R5cGU6IFwic3FsX2V4cHJlc3Npb25cIixcbiAgICAgIF9yZXR1cm46IFwibnVtYmVyXCIsXG4gICAgICBfc3FsOiBgTUlOKD8/KWAsXG4gICAgICBfcGFyYW1zOiBbY29sdW1uXSxcbiAgICB9O1xuICB9XG4gIHN0YXRpYyBjb25jYXQoLi4uYXJnczogc3RyaW5nW10pOiBTcWxFeHByZXNzaW9uPFwic3RyaW5nXCI+IHtcbiAgICByZXR1cm4ge1xuICAgICAgX3R5cGU6IFwic3FsX2V4cHJlc3Npb25cIixcbiAgICAgIF9yZXR1cm46IFwic3RyaW5nXCIsXG4gICAgICBfc3FsOiBgQ09OQ0FUKCR7YXJncy5tYXAoKCkgPT4gXCI/XCIpLmpvaW4oXCIsIFwiKX0pYCxcbiAgICAgIF9wYXJhbXM6IGFyZ3MsXG4gICAgfTtcbiAgfVxuICBzdGF0aWMgY29hbGVzY2UoZXhwcmVzc2lvbjogU3RyaW5nU3FsRXhwcmVzc2lvbiwgZmFsbGJhY2s6IHN0cmluZyk6IFNxbEV4cHJlc3Npb248XCJzdHJpbmdcIj4ge1xuICAgIHJldHVybiB7XG4gICAgICBfdHlwZTogXCJzcWxfZXhwcmVzc2lvblwiLFxuICAgICAgX3JldHVybjogXCJzdHJpbmdcIixcbiAgICAgIF9zcWw6IGBDT0FMRVNDRSgke2V4cHJlc3Npb24uX3NxbH0sID8pYCxcbiAgICAgIF9wYXJhbXM6IFsuLi5leHByZXNzaW9uLl9wYXJhbXMsIGZhbGxiYWNrXSxcbiAgICB9O1xuICB9XG4gIHN0YXRpYyBjb25jYXRFeHByZXNzaW9ucyguLi5hcmdzOiAoc3RyaW5nIHwgU3RyaW5nU3FsRXhwcmVzc2lvbilbXSk6IFNxbEV4cHJlc3Npb248XCJzdHJpbmdcIj4ge1xuICAgIHJldHVybiB7XG4gICAgICBfdHlwZTogXCJzcWxfZXhwcmVzc2lvblwiLFxuICAgICAgX3JldHVybjogXCJzdHJpbmdcIixcbiAgICAgIF9zcWw6IGBDT05DQVQoJHthcmdzLm1hcCgoYXJnKSA9PiAoaXNTdHJpbmdWYWx1ZShhcmcpID8gXCI/Ojp0ZXh0XCIgOiBhcmcuX3NxbCkpLmpvaW4oXCIsIFwiKX0pYCxcbiAgICAgIF9wYXJhbXM6IGFyZ3MuZmxhdE1hcCgoYXJnKSA9PiAoaXNTdHJpbmdWYWx1ZShhcmcpID8gW2FyZ10gOiBhcmcuX3BhcmFtcykpLFxuICAgIH07XG4gIH1cbiAgc3RhdGljIHVwcGVyKGNvbHVtbjogc3RyaW5nKTogU3FsRXhwcmVzc2lvbjxcInN0cmluZ1wiPiB7XG4gICAgcmV0dXJuIHtcbiAgICAgIF90eXBlOiBcInNxbF9leHByZXNzaW9uXCIsXG4gICAgICBfcmV0dXJuOiBcInN0cmluZ1wiLFxuICAgICAgX3NxbDogXCJVUFBFUig/PylcIixcbiAgICAgIF9wYXJhbXM6IFtjb2x1bW5dLFxuICAgIH07XG4gIH1cbiAgc3RhdGljIGxvd2VyKGNvbHVtbjogc3RyaW5nKTogU3FsRXhwcmVzc2lvbjxcInN0cmluZ1wiPiB7XG4gICAgcmV0dXJuIHtcbiAgICAgIF90eXBlOiBcInNxbF9leHByZXNzaW9uXCIsXG4gICAgICBfcmV0dXJuOiBcInN0cmluZ1wiLFxuICAgICAgX3NxbDogXCJMT1dFUig/PylcIixcbiAgICAgIF9wYXJhbXM6IFtjb2x1bW5dLFxuICAgIH07XG4gIH1cblxuICBzdGF0aWMgd29yZFNpbWlsYXJpdHkoY29sdW1uOiBzdHJpbmcsIHF1ZXJ5OiBzdHJpbmcpOiBTcWxFeHByZXNzaW9uPFwibnVtYmVyXCI+O1xuICBzdGF0aWMgd29yZFNpbWlsYXJpdHk8VE51bGxhYmxlIGV4dGVuZHMgYm9vbGVhbj4oXG4gICAgY29sdW1uOiBTdHJpbmdTcWxFeHByZXNzaW9uPFROdWxsYWJsZT4sXG4gICAgcXVlcnk6IHN0cmluZyxcbiAgKTogU3FsRXhwcmVzc2lvbjxcIm51bWJlclwiLCBUTnVsbGFibGU+O1xuICBzdGF0aWMgd29yZFNpbWlsYXJpdHkoXG4gICAgY29sdW1uOiBzdHJpbmcgfCBTdHJpbmdTcWxFeHByZXNzaW9uLFxuICAgIHF1ZXJ5OiBzdHJpbmcsXG4gICk6IFNxbEV4cHJlc3Npb248XCJudW1iZXJcIiwgYm9vbGVhbj4ge1xuICAgIGlmIChpc1N0cmluZ1ZhbHVlKGNvbHVtbikpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIF90eXBlOiBcInNxbF9leHByZXNzaW9uXCIsXG4gICAgICAgIF9yZXR1cm46IFwibnVtYmVyXCIsXG4gICAgICAgIF9zcWw6IFwid29yZF9zaW1pbGFyaXR5KD8sID8/KVwiLFxuICAgICAgICBfcGFyYW1zOiBbcXVlcnksIGNvbHVtbl0sXG4gICAgICB9O1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBfdHlwZTogXCJzcWxfZXhwcmVzc2lvblwiLFxuICAgICAgX3JldHVybjogXCJudW1iZXJcIixcbiAgICAgIF9zcWw6IGB3b3JkX3NpbWlsYXJpdHkoPywgJHtjb2x1bW5bXCJfc3FsXCJdfSlgLFxuICAgICAgX3BhcmFtczogW3F1ZXJ5LCAuLi5jb2x1bW5bXCJfcGFyYW1zXCJdXSxcbiAgICB9O1xuICB9XG5cbiAgc3RhdGljIHNpbWlsYXJpdHkoY29sdW1uOiBzdHJpbmcsIHF1ZXJ5OiBzdHJpbmcpOiBTcWxFeHByZXNzaW9uPFwibnVtYmVyXCI+O1xuICBzdGF0aWMgc2ltaWxhcml0eTxUTnVsbGFibGUgZXh0ZW5kcyBib29sZWFuPihcbiAgICBjb2x1bW46IFN0cmluZ1NxbEV4cHJlc3Npb248VE51bGxhYmxlPixcbiAgICBxdWVyeTogc3RyaW5nLFxuICApOiBTcWxFeHByZXNzaW9uPFwibnVtYmVyXCIsIFROdWxsYWJsZT47XG4gIHN0YXRpYyBzaW1pbGFyaXR5KFxuICAgIGNvbHVtbjogc3RyaW5nIHwgU3RyaW5nU3FsRXhwcmVzc2lvbixcbiAgICBxdWVyeTogc3RyaW5nLFxuICApOiBTcWxFeHByZXNzaW9uPFwibnVtYmVyXCIsIGJvb2xlYW4+IHtcbiAgICBpZiAoaXNTdHJpbmdWYWx1ZShjb2x1bW4pKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBfdHlwZTogXCJzcWxfZXhwcmVzc2lvblwiLFxuICAgICAgICBfcmV0dXJuOiBcIm51bWJlclwiLFxuICAgICAgICBfc3FsOiBcInNpbWlsYXJpdHkoPz8sID8pXCIsXG4gICAgICAgIF9wYXJhbXM6IFtjb2x1bW4sIHF1ZXJ5XSxcbiAgICAgIH07XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIF90eXBlOiBcInNxbF9leHByZXNzaW9uXCIsXG4gICAgICBfcmV0dXJuOiBcIm51bWJlclwiLFxuICAgICAgX3NxbDogYHNpbWlsYXJpdHkoJHtjb2x1bW5bXCJfc3FsXCJdfSwgPylgLFxuICAgICAgX3BhcmFtczogWy4uLmNvbHVtbltcIl9wYXJhbXNcIl0sIHF1ZXJ5XSxcbiAgICB9O1xuICB9XG5cbiAgc3RhdGljIHN0cmljdFdvcmRTaW1pbGFyaXR5KGNvbHVtbjogc3RyaW5nLCBxdWVyeTogc3RyaW5nKTogU3FsRXhwcmVzc2lvbjxcIm51bWJlclwiPjtcbiAgc3RhdGljIHN0cmljdFdvcmRTaW1pbGFyaXR5PFROdWxsYWJsZSBleHRlbmRzIGJvb2xlYW4+KFxuICAgIGNvbHVtbjogU3RyaW5nU3FsRXhwcmVzc2lvbjxUTnVsbGFibGU+LFxuICAgIHF1ZXJ5OiBzdHJpbmcsXG4gICk6IFNxbEV4cHJlc3Npb248XCJudW1iZXJcIiwgVE51bGxhYmxlPjtcbiAgc3RhdGljIHN0cmljdFdvcmRTaW1pbGFyaXR5KFxuICAgIGNvbHVtbjogc3RyaW5nIHwgU3RyaW5nU3FsRXhwcmVzc2lvbixcbiAgICBxdWVyeTogc3RyaW5nLFxuICApOiBTcWxFeHByZXNzaW9uPFwibnVtYmVyXCIsIGJvb2xlYW4+IHtcbiAgICBpZiAoaXNTdHJpbmdWYWx1ZShjb2x1bW4pKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBfdHlwZTogXCJzcWxfZXhwcmVzc2lvblwiLFxuICAgICAgICBfcmV0dXJuOiBcIm51bWJlclwiLFxuICAgICAgICBfc3FsOiBgc3RyaWN0X3dvcmRfc2ltaWxhcml0eSg/LCA/PylgLFxuICAgICAgICBfcGFyYW1zOiBbcXVlcnksIGNvbHVtbl0sXG4gICAgICB9O1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBfdHlwZTogXCJzcWxfZXhwcmVzc2lvblwiLFxuICAgICAgX3JldHVybjogXCJudW1iZXJcIixcbiAgICAgIF9zcWw6IGBzdHJpY3Rfd29yZF9zaW1pbGFyaXR5KD8sICR7Y29sdW1uW1wiX3NxbFwiXX0pYCxcbiAgICAgIF9wYXJhbXM6IFtxdWVyeSwgLi4uY29sdW1uW1wiX3BhcmFtc1wiXV0sXG4gICAgfTtcbiAgfVxuXG4gIC8vIFJhdyBmdW5jdGlvbnMgZm9yIFNFTEVDVFxuICBzdGF0aWMgcmF3U3RyaW5nKHNxbDogc3RyaW5nLCBwYXJhbXM6IEtuZXguUmF3QmluZGluZ1tdID0gW10pOiBTcWxFeHByZXNzaW9uPFwic3RyaW5nXCI+IHtcbiAgICByZXR1cm4geyBfdHlwZTogXCJzcWxfZXhwcmVzc2lvblwiLCBfcmV0dXJuOiBcInN0cmluZ1wiLCBfc3FsOiBzcWwsIF9wYXJhbXM6IHBhcmFtcyB9O1xuICB9XG5cbiAgc3RhdGljIHJhd1N0cmluZ0FycmF5KHNxbDogc3RyaW5nLCBwYXJhbXM6IEtuZXguUmF3QmluZGluZ1tdID0gW10pOiBTcWxFeHByZXNzaW9uPFwic3RyaW5nW11cIj4ge1xuICAgIHJldHVybiB7IF90eXBlOiBcInNxbF9leHByZXNzaW9uXCIsIF9yZXR1cm46IFwic3RyaW5nW11cIiwgX3NxbDogc3FsLCBfcGFyYW1zOiBwYXJhbXMgfTtcbiAgfVxuXG4gIHN0YXRpYyByYXdOdW1iZXIoc3FsOiBzdHJpbmcsIHBhcmFtczogS25leC5SYXdCaW5kaW5nW10gPSBbXSk6IFNxbEV4cHJlc3Npb248XCJudW1iZXJcIj4ge1xuICAgIHJldHVybiB7IF90eXBlOiBcInNxbF9leHByZXNzaW9uXCIsIF9yZXR1cm46IFwibnVtYmVyXCIsIF9zcWw6IHNxbCwgX3BhcmFtczogcGFyYW1zIH07XG4gIH1cblxuICBzdGF0aWMgcmF3Qm9vbGVhbihzcWw6IHN0cmluZywgcGFyYW1zOiBLbmV4LlJhd0JpbmRpbmdbXSA9IFtdKTogU3FsRXhwcmVzc2lvbjxcImJvb2xlYW5cIj4ge1xuICAgIHJldHVybiB7IF90eXBlOiBcInNxbF9leHByZXNzaW9uXCIsIF9yZXR1cm46IFwiYm9vbGVhblwiLCBfc3FsOiBzcWwsIF9wYXJhbXM6IHBhcmFtcyB9O1xuICB9XG5cbiAgc3RhdGljIHJhd0RhdGUoc3FsOiBzdHJpbmcsIHBhcmFtczogS25leC5SYXdCaW5kaW5nW10gPSBbXSk6IFNxbEV4cHJlc3Npb248XCJkYXRlXCI+IHtcbiAgICByZXR1cm4geyBfdHlwZTogXCJzcWxfZXhwcmVzc2lvblwiLCBfcmV0dXJuOiBcImRhdGVcIiwgX3NxbDogc3FsLCBfcGFyYW1zOiBwYXJhbXMgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGVFMg6rKA7IOJ7Ja0IO2VmOydtOudvOydtO2MhVxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiAuc2VsZWN0KHtcbiAgICogICB0aXRsZTogUHVyaS5oaWdobGlnaHQoXCJwb3N0cy50aXRsZVwiLCBzZWFyY2gpLFxuICAgKiAgIGNvbnRlbnQ6IFB1cmkuaGlnaGxpZ2h0KFwicG9zdHMuY29udGVudFwiLCBzZWFyY2gsIHtcbiAgICogICAgIHN0YXJ0U2VsOiBcIjxtYXJrPlwiLFxuICAgKiAgICAgc3RvcFNlbDogXCI8L21hcms+XCIsXG4gICAqICAgICBtYXhGcmFnbWVudHM6IDMsXG4gICAqICAgfSksXG4gICAqIH0pXG4gICAqL1xuICBzdGF0aWMgdHNIaWdobGlnaHQoXG4gICAgY29sdW1uOiBzdHJpbmcsXG4gICAgcXVlcnk6IHN0cmluZyxcbiAgICBfb3B0aW9ucz86IFRzSGlnaGxpZ2h0T3B0aW9ucyxcbiAgKTogU3FsRXhwcmVzc2lvbjxcInN0cmluZ1wiPiB7XG4gICAgY29uc3QgeyBwYXJzZXIgPSBcIndlYnNlYXJjaF90b190c3F1ZXJ5XCIsIGNvbmZpZyA9IFwic2ltcGxlXCIsIC4uLm9wdGlvbnMgfSA9IF9vcHRpb25zID8/IHt9O1xuXG4gICAgY29uc3QgaGxPcHRpb25QYXJ0cyA9IE9iamVjdC5lbnRyaWVzKG9wdGlvbnMpLm1hcCgoW2tleSwgdmFsdWVdKSA9PiB7XG4gICAgICByZXR1cm4gYCR7aW5mbGVjdGlvbi5jYW1lbGl6ZShrZXkpfT0ke3ZhbHVlfWA7XG4gICAgfSk7XG5cbiAgICBjb25zdCBobE9wdGlvbnMgPSBobE9wdGlvblBhcnRzLmxlbmd0aCA+IDAgPyBgLCAnJHtobE9wdGlvblBhcnRzLmpvaW4oXCIsIFwiKX0nYCA6IFwiXCI7XG5cbiAgICByZXR1cm4ge1xuICAgICAgX3R5cGU6IFwic3FsX2V4cHJlc3Npb25cIixcbiAgICAgIF9yZXR1cm46IFwic3RyaW5nXCIsXG4gICAgICBfc3FsOiBgdHNfaGVhZGxpbmUoPywgPz8sICR7cGFyc2VyfSg/LCA/KSR7aGxPcHRpb25zfSlgLFxuICAgICAgX3BhcmFtczogW2NvbmZpZywgY29sdW1uLCBjb25maWcsIHF1ZXJ5XSxcbiAgICB9O1xuICB9XG5cbiAgLy8gdHNfcmFua1xuICBzdGF0aWMgdHNSYW5rKFxuICAgIGNvbHVtbjogc3RyaW5nIHwgU3FsRXhwcmVzc2lvbjxcInRzdmVjdG9yXCI+LFxuICAgIHF1ZXJ5OiBzdHJpbmcsXG4gICAgb3B0aW9ucz86IFRzUmFua09wdGlvbnMsXG4gICk6IFNxbEV4cHJlc3Npb248XCJudW1iZXJcIj4ge1xuICAgIHJldHVybiBQdXJpW1wiX3RzUmFua1wiXShcInRzX3JhbmtcIiwgY29sdW1uLCBxdWVyeSwgb3B0aW9ucyk7XG4gIH1cblxuICAvLyB0c19yYW5rX2NkXG4gIHN0YXRpYyB0c1JhbmtDZChcbiAgICBjb2x1bW46IHN0cmluZyB8IFNxbEV4cHJlc3Npb248XCJ0c3ZlY3RvclwiPixcbiAgICBxdWVyeTogc3RyaW5nLFxuICAgIG9wdGlvbnM/OiBUc1JhbmtPcHRpb25zLFxuICApOiBTcWxFeHByZXNzaW9uPFwibnVtYmVyXCI+IHtcbiAgICByZXR1cm4gUHVyaVtcIl90c1JhbmtcIl0oXCJ0c19yYW5rX2NkXCIsIGNvbHVtbiwgcXVlcnksIG9wdGlvbnMpO1xuICB9XG5cbiAgc3RhdGljIHRvVHNWZWN0b3IoY29sdW1uOiBzdHJpbmcsIGNvbmZpZzogc3RyaW5nID0gXCJzaW1wbGVcIik6IFNxbEV4cHJlc3Npb248XCJ0c3ZlY3RvclwiPiB7XG4gICAgcmV0dXJuIHtcbiAgICAgIF90eXBlOiBcInNxbF9leHByZXNzaW9uXCIsXG4gICAgICBfcmV0dXJuOiBcInRzdmVjdG9yXCIsXG4gICAgICBfc3FsOiBgdG9fdHN2ZWN0b3IoPywgPz8pYCxcbiAgICAgIF9wYXJhbXM6IFtjb25maWcsIGNvbHVtbl0sXG4gICAgfTtcbiAgfVxuXG4gIHN0YXRpYyBfdHNSYW5rKFxuICAgIHR5cGU6IFwidHNfcmFua1wiIHwgXCJ0c19yYW5rX2NkXCIsXG4gICAgY29sdW1uOiBzdHJpbmcgfCBTcWxFeHByZXNzaW9uPFwidHN2ZWN0b3JcIj4sXG4gICAgcXVlcnk6IHN0cmluZyxcbiAgICBvcHRpb25zPzogVHNSYW5rT3B0aW9ucyxcbiAgKTogU3FsRXhwcmVzc2lvbjxcIm51bWJlclwiPiB7XG4gICAgY29uc3Qge1xuICAgICAgcGFyc2VyID0gXCJ3ZWJzZWFyY2hfdG9fdHNxdWVyeVwiLFxuICAgICAgY29uZmlnID0gXCJzaW1wbGVcIixcbiAgICAgIG5vcm1hbGl6YXRpb24sXG4gICAgICB3ZWlnaHRzLFxuICAgIH0gPSBvcHRpb25zID8/IHt9O1xuXG4gICAgY29uc3QgcGFyYW1zID0gW107XG4gICAgbGV0IHNxbFRlbXBsYXRlID0gYCR7dHlwZX0oYDtcblxuICAgIGlmICh3ZWlnaHRzKSB7XG4gICAgICBzcWxUZW1wbGF0ZSArPSBgQVJSQVlbJHt3ZWlnaHRzLm1hcCgoKSA9PiBcIj9cIikuam9pbihcIiwgXCIpfV06OmZsb2F0NFtdLCBgO1xuICAgICAgcGFyYW1zLnB1c2goLi4ud2VpZ2h0cyk7XG4gICAgfVxuXG4gICAgaWYgKGlzU3RyaW5nVmFsdWUoY29sdW1uKSkge1xuICAgICAgc3FsVGVtcGxhdGUgKz0gYD8/LCAke3BhcnNlcn0oPywgPylgO1xuICAgICAgcGFyYW1zLnB1c2goY29sdW1uLCBjb25maWcsIHF1ZXJ5KTtcbiAgICB9IGVsc2Uge1xuICAgICAgc3FsVGVtcGxhdGUgKz0gYCR7Y29sdW1uW1wiX3NxbFwiXX0sICR7cGFyc2VyfSg/LCA/KWA7XG4gICAgICBwYXJhbXMucHVzaCguLi5jb2x1bW5bXCJfcGFyYW1zXCJdLCBjb25maWcsIHF1ZXJ5KTtcbiAgICB9XG5cbiAgICBpZiAobm9ybWFsaXphdGlvbikge1xuICAgICAgc3FsVGVtcGxhdGUgKz0gXCIsID9cIjtcbiAgICAgIHBhcmFtcy5wdXNoKG5vcm1hbGl6YXRpb24pO1xuICAgIH1cblxuICAgIHNxbFRlbXBsYXRlICs9IFwiKVwiO1xuXG4gICAgcmV0dXJuIHsgX3R5cGU6IFwic3FsX2V4cHJlc3Npb25cIiwgX3JldHVybjogXCJudW1iZXJcIiwgX3NxbDogc3FsVGVtcGxhdGUsIF9wYXJhbXM6IHBhcmFtcyB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFBHcm9vbmdhIEZ1bGxUZXh0IOyduOuNseyKpCDqsoDsg4kg7KCQ7IiYXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIC5zZWxlY3Qoe1xuICAgKiAgIHNjb3JlOiBQdXJpLnNjb3JlKCksXG4gICAqIH0pXG4gICAqL1xuICBzdGF0aWMgc2NvcmUoKTogU3FsRXhwcmVzc2lvbjxcIm51bWJlclwiPiB7XG4gICAgcmV0dXJuIFB1cmkucmF3TnVtYmVyKFwicGdyb29uZ2Ffc2NvcmUodGFibGVvaWQsIGN0aWQpXCIpO1xuICB9XG5cbiAgLyoqXG4gICAqIFBHcm9vbmdhIEZ1bGxUZXh0IOyduOuNseyKpCDqsoDsg4kg7ZWY7J2065287J207YyFXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIC5zZWxlY3Qoe1xuICAgKiAgIHRpdGxlOiBQdXJpLmhpZ2hsaWdodChcInBvc3RzLnRpdGxlXCIsIHNlYXJjaCksXG4gICAqIH0pXG4gICAqL1xuICBzdGF0aWMgaGlnaGxpZ2h0KGNvbHVtbjogc3RyaW5nLCBxdWVyeTogc3RyaW5nIHwgc3RyaW5nW10pOiBTcWxFeHByZXNzaW9uPFwic3RyaW5nXCI+O1xuICBzdGF0aWMgaGlnaGxpZ2h0KGNvbHVtbnM6IHN0cmluZ1tdLCBxdWVyeTogc3RyaW5nIHwgc3RyaW5nW10pOiBTcWxFeHByZXNzaW9uPFwic3RyaW5nW11cIj47XG5cbiAgc3RhdGljIGhpZ2hsaWdodChcbiAgICBjb2x1bW5PckNvbHVtbnM6IHN0cmluZyB8IHN0cmluZ1tdLFxuICAgIHF1ZXJ5OiBzdHJpbmcgfCBzdHJpbmdbXSxcbiAgKTogU3FsRXhwcmVzc2lvbjxcInN0cmluZ1wiPiB8IFNxbEV4cHJlc3Npb248XCJzdHJpbmdbXVwiPiB7XG4gICAgY29uc3QgcXVlcnlBcnIgPSBBcnJheS5pc0FycmF5KHF1ZXJ5KSA/IHF1ZXJ5IDogW3F1ZXJ5XTtcbiAgICBjb25zdCBxdWVyeUNsYXVzZSA9IGBBUlJBWVske3F1ZXJ5QXJyLm1hcCgoKSA9PiBcIj9cIikuam9pbihcIiwgXCIpfV1gO1xuXG4gICAgLy8g64uo7J28IOy7rOufvOyduCDqsr3smrBcbiAgICBpZiAoaXNTdHJpbmdWYWx1ZShjb2x1bW5PckNvbHVtbnMpKSB7XG4gICAgICByZXR1cm4gUHVyaS5yYXdTdHJpbmcoYHBncm9vbmdhX2hpZ2hsaWdodF9odG1sKD8/LCAke3F1ZXJ5Q2xhdXNlfSlgLCBbXG4gICAgICAgIGNvbHVtbk9yQ29sdW1ucyxcbiAgICAgICAgLi4ucXVlcnlBcnIsXG4gICAgICBdKTtcbiAgICB9XG5cbiAgICAvLyDsu6zrn7wg67Cw7Je07J24IOqyveyasFxuICAgIHJldHVybiBQdXJpLnJhd1N0cmluZ0FycmF5KFxuICAgICAgYHBncm9vbmdhX2hpZ2hsaWdodF9odG1sKEFSUkFZWyR7Y29sdW1uT3JDb2x1bW5zLm1hcCgoKSA9PiBcIj8/XCIpLmpvaW4oXCIsIFwiKX1dLCAke3F1ZXJ5Q2xhdXNlfSlgLFxuICAgICAgWy4uLmNvbHVtbk9yQ29sdW1ucywgLi4ucXVlcnlBcnJdLFxuICAgICk7XG4gIH1cblxuICBqc29uVGV4dChcbiAgICBjb2x1bW46IEpzb25Db2x1bW5zPFRUYWJsZXM+LFxuICAgIC4uLnBhdGg6IFtzdHJpbmcsIC4uLnN0cmluZ1tdXVxuICApOiBTcWxFeHByZXNzaW9uPFwic3RyaW5nXCIsIHRydWU+IHtcbiAgICByZXR1cm4ge1xuICAgICAgX3R5cGU6IFwic3FsX2V4cHJlc3Npb25cIixcbiAgICAgIF9yZXR1cm46IFwic3RyaW5nXCIsXG4gICAgICBfc3FsOiBgPz8gIz4+IEFSUkFZWyR7cGF0aC5tYXAoKCkgPT4gXCI/XCIpLmpvaW4oXCIsIFwiKX1dYCxcbiAgICAgIF9wYXJhbXM6IFtjb2x1bW4sIC4uLnBhdGhdLFxuICAgIH07XG4gIH1cblxuICAvLyBTRUxFQ1QgKG92ZXJ3cml0ZSlcbiAgc2VsZWN0PFRTZWxlY3QgZXh0ZW5kcyBTdHJpbmdFeHByZXNzaW9uU2VsZWN0PihcbiAgICBzZWxlY3RPYmo6IFRTZWxlY3QsXG4gICk6IFB1cmk8VFNjaGVtYSwgVFRhYmxlcywgU3RyaW5nRXhwcmVzc2lvblNlbGVjdFJlc3VsdDxUU2VsZWN0Pj47XG4gIHNlbGVjdDxUU2VsZWN0IGV4dGVuZHMgU2VsZWN0T2JqZWN0PFRUYWJsZXM+PihcbiAgICBzZWxlY3RPYmo6IFRTZWxlY3QsXG4gICk6IFB1cmk8VFNjaGVtYSwgVFRhYmxlcywgUGFyc2VTZWxlY3RPYmplY3Q8VFRhYmxlcywgVFNlbGVjdD4+O1xuICBzZWxlY3Qoc2VsZWN0T2JqOiBTZWxlY3RPYmplY3Q8VFRhYmxlcz4pOiBQdXJpPFRTY2hlbWEsIFRUYWJsZXMsIGFueT4ge1xuICAgIC8vIOykkeyyqSDqsJ3ssrTrpbwgZmxhdO2VmOqyjCDrs4DtmZhcbiAgICBjb25zdCBmbGF0U2VsZWN0ID0gdGhpcy5mbGF0dGVuU2VsZWN0KHNlbGVjdE9iaik7XG5cbiAgICBjb25zdCBzZWxlY3RDbGF1c2VzOiAoc3RyaW5nIHwgS25leC5SYXcpW10gPSBbXTtcblxuICAgIGZvciAoY29uc3QgW2FsaWFzLCBjb2x1bW5PckZ1bmN0aW9uXSBvZiBPYmplY3QuZW50cmllcyhmbGF0U2VsZWN0KSkge1xuICAgICAgaWYgKGlzU3FsRXhwcmVzc2lvbihjb2x1bW5PckZ1bmN0aW9uKSkge1xuICAgICAgICAvLyBTUUwg7ZWo7IiY7J24IOqyveyasFxuICAgICAgICBzZWxlY3RDbGF1c2VzLnB1c2goXG4gICAgICAgICAgdGhpcy5rbmV4LnJhdyhgJHtjb2x1bW5PckZ1bmN0aW9uW1wiX3NxbFwiXX0gQVMgXCIke2FsaWFzfVwiYCwgY29sdW1uT3JGdW5jdGlvbltcIl9wYXJhbXNcIl0pLFxuICAgICAgICApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8g7J2867CYIOy7rOufvOyduCDqsr3smrBcbiAgICAgICAgLy8gU0FGRVRZOiDsv7zrpqwg67mM642U7J2YIOygnOuEpOumrSDqs4Tslb3qs7wg7ISg7ZaJIOqygOymneydtCDsnbQg7YOA7J6F7J2EIOuztOyepe2VqeuLiOuLpC5cbiAgICAgICAgY29uc3QgY29sdW1uUGF0aCA9IGNvbHVtbk9yRnVuY3Rpb24gYXMgc3RyaW5nO1xuICAgICAgICBpZiAoYWxpYXMgPT09IGNvbHVtblBhdGgpIHtcbiAgICAgICAgICAvLyBhbGlhc+yZgCDsu6zrn7zrqoXsnbQg6rCZ7Jy866m0IGFsaWFzIOyDneuetVxuICAgICAgICAgIHNlbGVjdENsYXVzZXMucHVzaChjb2x1bW5QYXRoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBhbGlhcyDsp4DsoJVcbiAgICAgICAgICBzZWxlY3RDbGF1c2VzLnB1c2goYCR7Y29sdW1uUGF0aH0gQVMgJHthbGlhc31gKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMua25leFF1ZXJ5LnNlbGVjdChzZWxlY3RDbGF1c2VzKTtcbiAgICAvLyBTQUZFVFk6IOy/vOumrCDruYzrjZTsnZgg7KCc64Sk66atIOqzhOyVveqzvCDshKDtlokg6rKA7Kad7J20IOydtCDtg4DsnoXsnYQg67O07J6l7ZWp64uI64ukLlxuICAgIHJldHVybiB0aGlzIGFzIGFueTtcbiAgfVxuXG4gIC8qKlxuICAgKiDspJHssqkg6rCd7LK066W8IGZsYXQg6rCd7LK066GcIOuzgO2ZmFxuICAgKiDsmIg6IHsgcGFyZW50OiB7IGlkOiBcInBhcmVudC5pZFwiLCBuYW1lOiBcInBhcmVudC5uYW1lXCIgfSB9XG4gICAqICAg4oaSIHsgcGFyZW50X19pZDogXCJwYXJlbnQuaWRcIiwgcGFyZW50X19uYW1lOiBcInBhcmVudC5uYW1lXCIgfVxuICAgKi9cbiAgcHJpdmF0ZSAqZmxhdHRlblNlbGVjdEVudHJpZXMoXG4gICAgc2VsZWN0T2JqOiBTZWxlY3RPYmplY3Q8VFRhYmxlcz4sXG4gICAgcHJlZml4ID0gXCJcIixcbiAgKTogR2VuZXJhdG9yPFtzdHJpbmcsIFNlbGVjdFZhbHVlPFRUYWJsZXM+XSwgdm9pZD4ge1xuICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKHNlbGVjdE9iaikpIHtcbiAgICAgIGNvbnN0IGZ1bGxLZXkgPSBwcmVmaXggPyBgJHtwcmVmaXh9X18ke2tleX1gIDoga2V5O1xuXG4gICAgICBpZiAoaXNOZXN0ZWRTZWxlY3RPYmplY3QodmFsdWUpKSB7XG4gICAgICAgIHlpZWxkKiB0aGlzLmZsYXR0ZW5TZWxlY3RFbnRyaWVzKHZhbHVlLCBmdWxsS2V5KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHlpZWxkIFtmdWxsS2V5LCB2YWx1ZV07XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBmbGF0dGVuU2VsZWN0KHNlbGVjdE9iajogU2VsZWN0T2JqZWN0PFRUYWJsZXM+LCBwcmVmaXggPSBcIlwiKSB7XG4gICAgcmV0dXJuIE9iamVjdC5mcm9tRW50cmllcyh0aGlzLmZsYXR0ZW5TZWxlY3RFbnRyaWVzKHNlbGVjdE9iaiwgcHJlZml4KSk7XG4gIH1cblxuICAvLyBTRUxFQ1QgKHNlbGVjdOuKlCBvdmVyd3JpdGUsIGFwcGVuZFNlbGVjdOuKlCBhcHBlbmQpXG4gIGFwcGVuZFNlbGVjdDxUU2VsZWN0IGV4dGVuZHMgU2VsZWN0T2JqZWN0PFRUYWJsZXM+PihcbiAgICBzZWxlY3RPYmo6IFRTZWxlY3QsXG4gICk6IFB1cmk8VFNjaGVtYSwgVFRhYmxlcywgVFJlc3VsdCAmIFBhcnNlU2VsZWN0T2JqZWN0PFRUYWJsZXMsIFRTZWxlY3Q+PiB7XG4gICAgLy8g7KSR7LKpIOqwneyytOulvCBmbGF07ZWY6rKMIOuzgO2ZmFxuICAgIGNvbnN0IGZsYXRTZWxlY3QgPSB0aGlzLmZsYXR0ZW5TZWxlY3Qoc2VsZWN0T2JqKTtcblxuICAgIGNvbnN0IHNlbGVjdENsYXVzZXM6IChzdHJpbmcgfCBLbmV4LlJhdylbXSA9IFtdO1xuXG4gICAgZm9yIChjb25zdCBbYWxpYXMsIGNvbHVtbk9yRnVuY3Rpb25dIG9mIE9iamVjdC5lbnRyaWVzKGZsYXRTZWxlY3QpKSB7XG4gICAgICBpZiAoaXNTcWxFeHByZXNzaW9uKGNvbHVtbk9yRnVuY3Rpb24pKSB7XG4gICAgICAgIHNlbGVjdENsYXVzZXMucHVzaChcbiAgICAgICAgICB0aGlzLmtuZXgucmF3KGAke2NvbHVtbk9yRnVuY3Rpb25bXCJfc3FsXCJdfSBBUyAke2FsaWFzfWAsIGNvbHVtbk9yRnVuY3Rpb25bXCJfcGFyYW1zXCJdKSxcbiAgICAgICAgKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIFNBRkVUWTog7L+866asIOu5jOuNlOydmCDsoJzrhKTrpq0g6rOE7JW96rO8IOyEoO2WiSDqsoDspp3snbQg7J20IO2DgOyeheydhCDrs7TsnqXtlanri4jri6QuXG4gICAgICAgIGNvbnN0IGNvbHVtblBhdGggPSBjb2x1bW5PckZ1bmN0aW9uIGFzIHN0cmluZztcbiAgICAgICAgaWYgKGFsaWFzID09PSBjb2x1bW5QYXRoKSB7XG4gICAgICAgICAgc2VsZWN0Q2xhdXNlcy5wdXNoKGNvbHVtblBhdGgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHNlbGVjdENsYXVzZXMucHVzaCh0aGlzLmtuZXgucmVmKGNvbHVtblBhdGgpLmFzKGFsaWFzKSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLmtuZXhRdWVyeS5zZWxlY3Qoc2VsZWN0Q2xhdXNlcyk7XG4gICAgLy8gU0FGRVRZOiDsv7zrpqwg67mM642U7J2YIOygnOuEpOumrSDqs4Tslb3qs7wg7ISg7ZaJIOqygOymneydtCDsnbQg7YOA7J6F7J2EIOuztOyepe2VqeuLiOuLpC5cbiAgICByZXR1cm4gdGhpcyBhcyBhbnk7XG4gIH1cblxuICAvLyBTRUxFQ1QgKlxuICBzZWxlY3RBbGwoKTogUHVyaTxUU2NoZW1hLCBUVGFibGVzLCBTZWxlY3RBbGxSZXN1bHQ8VFRhYmxlcz4+IHtcbiAgICB0aGlzLmtuZXhRdWVyeS5zZWxlY3QoXCIqXCIpO1xuICAgIC8vIFNBRkVUWTog7L+866asIOu5jOuNlOydmCDsoJzrhKTrpq0g6rOE7JW96rO8IOyEoO2WiSDqsoDspp3snbQg7J20IO2DgOyeheydhCDrs7TsnqXtlanri4jri6QuXG4gICAgcmV0dXJuIHRoaXMgYXMgYW55O1xuICB9XG5cbiAgLy8gRElTVElOQ1RcbiAgZGlzdGluY3Q8VENvbHVtbnMgZXh0ZW5kcyBBdmFpbGFibGVDb2x1bW5zPFRUYWJsZXM+PiguLi5jb2x1bW5zOiBUQ29sdW1uc1tdKTogdGhpcztcbiAgZGlzdGluY3QoLi4uY29sdW1uczogc3RyaW5nW10pOiB0aGlzIHtcbiAgICB0aGlzLmtuZXhRdWVyeS5kaXN0aW5jdCguLi5jb2x1bW5zKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8vIENMRUFSXG4gIGNsZWFyKHN0YXRlbWVudDogQ2xlYXJTdGF0ZW1lbnRzKTogdGhpcyB7XG4gICAgdGhpcy5rbmV4UXVlcnkuY2xlYXIoc3RhdGVtZW50KTtcbiAgICBpZiAoc3RhdGVtZW50ID09PSBcImpvaW5cIikge1xuICAgICAgdGhpcy5jbGVhckpvaW5SZWdpc3RyYXRpb25zKCk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLy8ga25leOyXkCDsl4bslrTshJwg7KeB7KCRIOq1rO2YhO2VqFxuICBjbGVhckpvaW4oYWxpYXM6IHN0cmluZyk6IHRoaXMge1xuICAgIGxldCByZW1vdmVkID0gZmFsc2U7XG4gICAgLy8gU0FGRVRZOiDsv7zrpqwg67mM642U7J2YIOygnOuEpOumrSDqs4Tslb3qs7wg7ISg7ZaJIOqygOymneydtCDsnbQg7YOA7J6F7J2EIOuztOyepe2VqeuLiOuLpC5cbiAgICAodGhpcy5rbmV4UXVlcnkgYXMgYW55KVtcIl9zdGF0ZW1lbnRzXCJdID0gKHRoaXMua25leFF1ZXJ5IGFzIGFueSlbXCJfc3RhdGVtZW50c1wiXS5maWx0ZXIoXG4gICAgICAoczogYW55KSA9PiB7XG4gICAgICAgIGlmIChcImpvaW5UeXBlXCIgaW4gcykge1xuICAgICAgICAgIGNvbnN0IHNob3VsZFJlbW92ZSA9IHRoaXMuZ2V0S25leEpvaW5BbGlhcyhzLnRhYmxlKSA9PT0gYWxpYXM7XG4gICAgICAgICAgcmVtb3ZlZCB8fD0gc2hvdWxkUmVtb3ZlO1xuICAgICAgICAgIHJldHVybiAhc2hvdWxkUmVtb3ZlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICk7XG4gICAgaWYgKHJlbW92ZWQgJiYgdGhpcy5jb3JyZWxhdGlvblJlZ2lzdHJ5LmdldChhbGlhcyk/LmtpbmQgPT09IFwiam9pblwiKSB7XG4gICAgICB0aGlzLmNvcnJlbGF0aW9uUmVnaXN0cnkuZGVsZXRlKGFsaWFzKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvLyBKT0lOOiDshJzruIzsv7zrpqwgKyBBbGlhc1xuICBqb2luPFRKb2luQWxpYXMgZXh0ZW5kcyBzdHJpbmcsIFRTdWJSZXN1bHQ+KFxuICAgIHRhYmxlU3BlYzogeyBbSyBpbiBUSm9pbkFsaWFzXTogUHVyaTxUU2NoZW1hLCBhbnksIFRTdWJSZXN1bHQ+IH0sXG4gICAgbGVmdDogQXZhaWxhYmxlQ29sdW1uczxUVGFibGVzPixcbiAgICByaWdodDogYCR7VEpvaW5BbGlhc30uJHtDb2x1bW5LZXlzPFRTdWJSZXN1bHQ+fWAsXG4gICk6IFB1cmk8XG4gICAgVFNjaGVtYSxcbiAgICBUVGFibGVzICYgUmVjb3JkPFRKb2luQWxpYXMsIFRTdWJSZXN1bHQ+LCAvLyDshJzruIzsv7zrpqzsnZggVFJlc3VsdFxuICAgIFRSZXN1bHRcbiAgPjtcbiAgLy8gSk9JTjog7YWM7J2067iUICsgQWxpYXNcbiAgam9pbjxUSm9pblRhYmxlIGV4dGVuZHMga2V5b2YgVFNjaGVtYSwgVEpvaW5BbGlhcyBleHRlbmRzIHN0cmluZz4oXG4gICAgdGFibGVTcGVjOiB7IFtLIGluIFRKb2luQWxpYXNdOiBUSm9pblRhYmxlIH0sXG4gICAgbGVmdDogQXZhaWxhYmxlQ29sdW1uczxUVGFibGVzPixcbiAgICByaWdodDogYCR7VEpvaW5BbGlhc30uJHtDb2x1bW5LZXlzPFRTY2hlbWFbVEpvaW5UYWJsZV0+fWAsXG4gICk6IFB1cmk8XG4gICAgVFNjaGVtYSxcbiAgICBUVGFibGVzICYgUmVjb3JkPFRKb2luQWxpYXMsIFRTY2hlbWFbVEpvaW5UYWJsZV0+LCAvLyBUVGFibGVzIO2ZleyepSFcbiAgICBUUmVzdWx0XG4gID47XG4gIC8vIEpPSU46IO2FjOydtOu4lOuqhVxuICBqb2luPFRKb2luVGFibGUgZXh0ZW5kcyBrZXlvZiBUU2NoZW1hPihcbiAgICB0YWJsZU5hbWU6IFRKb2luVGFibGUsXG4gICAgbGVmdDogQXZhaWxhYmxlQ29sdW1uczxUVGFibGVzPixcbiAgICByaWdodDogYCR7VEpvaW5UYWJsZSAmIHN0cmluZ30uJHtDb2x1bW5LZXlzPFRTY2hlbWFbVEpvaW5UYWJsZV0+fWAsXG4gICk6IFB1cmk8XG4gICAgVFNjaGVtYSxcbiAgICBUVGFibGVzICYgUmVjb3JkPFRKb2luVGFibGUsIFRTY2hlbWFbVEpvaW5UYWJsZV0+LCAvLyDthYzsnbTruJTrqoXsnbQg7YKkXG4gICAgVFJlc3VsdFxuICA+O1xuICAvLyBKT0lOOiDshJzruIzsv7zrpqwgKyBBbGlhcyArIOy9nOuwsVxuICBqb2luPFRKb2luQWxpYXMgZXh0ZW5kcyBzdHJpbmcsIFRTdWJSZXN1bHQ+KFxuICAgIHRhYmxlU3BlYzogeyBbSyBpbiBUSm9pbkFsaWFzXTogUHVyaTxUU2NoZW1hLCBhbnksIFRTdWJSZXN1bHQ+IH0sXG4gICAgY2FsbGJhY2s6IChqOiBKb2luQ2xhdXNlR3JvdXA8VFRhYmxlcywgUmVjb3JkPFRKb2luQWxpYXMsIFRTdWJSZXN1bHQ+PikgPT4gdm9pZCxcbiAgKTogUHVyaTxUU2NoZW1hLCBUVGFibGVzICYgUmVjb3JkPFRKb2luQWxpYXMsIFRTdWJSZXN1bHQ+LCBUUmVzdWx0PjtcbiAgLy8gSk9JTjog7YWM7J2067iUICsgQWxpYXMgKyDsvZzrsLFcbiAgam9pbjxUSm9pblRhYmxlIGV4dGVuZHMga2V5b2YgVFNjaGVtYSwgVEpvaW5BbGlhcyBleHRlbmRzIHN0cmluZz4oXG4gICAgdGFibGVTcGVjOiB7IFtLIGluIFRKb2luQWxpYXNdOiBUSm9pblRhYmxlIH0sXG4gICAgY2FsbGJhY2s6IChqOiBKb2luQ2xhdXNlR3JvdXA8VFRhYmxlcywgUmVjb3JkPFRKb2luQWxpYXMsIFRTY2hlbWFbVEpvaW5UYWJsZV0+PikgPT4gdm9pZCxcbiAgKTogUHVyaTxUU2NoZW1hLCBUVGFibGVzICYgUmVjb3JkPFRKb2luQWxpYXMsIFRTY2hlbWFbVEpvaW5UYWJsZV0+LCBUUmVzdWx0PjtcbiAgLy8gSk9JTjog7YWM7J2067iU66qFICsg7L2c67CxXG4gIGpvaW48VEpvaW5UYWJsZSBleHRlbmRzIGtleW9mIFRTY2hlbWE+KFxuICAgIHRhYmxlTmFtZTogVEpvaW5UYWJsZSxcbiAgICBjYWxsYmFjazogKGo6IEpvaW5DbGF1c2VHcm91cDxUVGFibGVzLCBSZWNvcmQ8VEpvaW5UYWJsZSwgVFNjaGVtYVtUSm9pblRhYmxlXT4+KSA9PiB2b2lkLFxuICApOiBQdXJpPFRTY2hlbWEsIFRUYWJsZXMgJiBSZWNvcmQ8VEpvaW5UYWJsZSwgVFNjaGVtYVtUSm9pblRhYmxlXT4sIFRSZXN1bHQ+O1xuICAvLyBKT0lOIOyLpOygnCDqtaztmIRcbiAgam9pbih0YWJsZU5hbWVPclNwZWM6IGFueSwgLi4uYXJnczogYW55W10pOiBhbnkge1xuICAgIHJldHVybiB0aGlzW1wiX19jb21tb25Kb2luXCJdKFwiam9pblwiLCB0YWJsZU5hbWVPclNwZWMsIC4uLmFyZ3MpO1xuICB9XG5cbiAgLy8gRU5TVVJFIEpPSU46IO2FjOydtOu4lCArIEFsaWFzXG4gIGVuc3VyZUpvaW48VEpvaW5UYWJsZSBleHRlbmRzIGtleW9mIFRTY2hlbWEsIFRKb2luQWxpYXMgZXh0ZW5kcyBzdHJpbmc+KFxuICAgIHRhYmxlU3BlYzogeyBbSyBpbiBUSm9pbkFsaWFzXTogVEpvaW5UYWJsZSB9LFxuICAgIGxlZnQ6IEF2YWlsYWJsZUNvbHVtbnM8VFRhYmxlcz4sXG4gICAgcmlnaHQ6IGAke1RKb2luQWxpYXN9LiR7Q29sdW1uS2V5czxUU2NoZW1hW1RKb2luVGFibGVdPn1gLFxuICApOiBQdXJpPFRTY2hlbWEsIFRUYWJsZXMgJiBSZWNvcmQ8VEpvaW5BbGlhcywgVFNjaGVtYVtUSm9pblRhYmxlXT4sIFRSZXN1bHQ+O1xuICAvLyBFTlNVUkUgSk9JTjog7YWM7J2067iU66qFXG4gIGVuc3VyZUpvaW48VEpvaW5UYWJsZSBleHRlbmRzIGtleW9mIFRTY2hlbWE+KFxuICAgIHRhYmxlTmFtZTogVEpvaW5UYWJsZSxcbiAgICBsZWZ0OiBBdmFpbGFibGVDb2x1bW5zPFRUYWJsZXM+LFxuICAgIHJpZ2h0OiBgJHtUSm9pblRhYmxlICYgc3RyaW5nfS4ke0NvbHVtbktleXM8VFNjaGVtYVtUSm9pblRhYmxlXT59YCxcbiAgKTogUHVyaTxUU2NoZW1hLCBUVGFibGVzICYgUmVjb3JkPFRKb2luVGFibGUsIFRTY2hlbWFbVEpvaW5UYWJsZV0+LCBUUmVzdWx0PjtcbiAgZW5zdXJlSm9pbih0YWJsZU5hbWVPclNwZWM6IGFueSwgbGVmdDogc3RyaW5nLCByaWdodDogc3RyaW5nKTogYW55IHtcbiAgICByZXR1cm4gdGhpc1tcIl9fZW5zdXJlSm9pblwiXShcImpvaW5cIiwgdGFibGVOYW1lT3JTcGVjLCBsZWZ0LCByaWdodCk7XG4gIH1cblxuICAvLyBMRUZUIEpPSU46IOyEnOu4jOy/vOumrCArIEFsaWFzXG4gIGxlZnRKb2luPFRKb2luQWxpYXMgZXh0ZW5kcyBzdHJpbmcsIFRTdWJSZXN1bHQ+KFxuICAgIHRhYmxlU3BlYzogeyBbSyBpbiBUSm9pbkFsaWFzXTogUHVyaTxUU2NoZW1hLCBhbnksIFRTdWJSZXN1bHQ+IH0sXG4gICAgbGVmdDogQXZhaWxhYmxlQ29sdW1uczxUVGFibGVzPixcbiAgICByaWdodDogYCR7VEpvaW5BbGlhc30uJHtDb2x1bW5LZXlzPFRTdWJSZXN1bHQ+fWAsXG4gICk6IFB1cmk8VFNjaGVtYSwgVFRhYmxlcyAmIFJlY29yZDxUSm9pbkFsaWFzLCBUU3ViUmVzdWx0ICYgTGVmdEpvaW5lZE1hcmtlcj4sIFRSZXN1bHQ+OyAvLyDshJzruIzsv7zrpqzsnZggVFJlc3VsdFxuICAvLyBMRUZUIEpPSU46IO2FjOydtOu4lCArIEFsaWFzXG4gIC8vIEZLIG51bGxhYmxlIOyXrOu2gOyXkCDrlLDrnbwg7J6Q64+Z7Jy866GcIExlZnRKb2luZWRNYXJrZXIg6rKw7KCVXG4gIGxlZnRKb2luPFxuICAgIFRKb2luVGFibGUgZXh0ZW5kcyBrZXlvZiBUU2NoZW1hLFxuICAgIFRKb2luQWxpYXMgZXh0ZW5kcyBzdHJpbmcsXG4gICAgVExlZnQgZXh0ZW5kcyBBdmFpbGFibGVDb2x1bW5zPFRUYWJsZXM+LFxuICA+KFxuICAgIHRhYmxlU3BlYzogeyBbSyBpbiBUSm9pbkFsaWFzXTogVEpvaW5UYWJsZSB9LFxuICAgIGxlZnQ6IFRMZWZ0LFxuICAgIHJpZ2h0OiBgJHtUSm9pbkFsaWFzfS4ke0NvbHVtbktleXM8VFNjaGVtYVtUSm9pblRhYmxlXT59YCxcbiAgKTogUHVyaTxcbiAgICBUU2NoZW1hLFxuICAgIFRUYWJsZXMgJiBSZWNvcmQ8VEpvaW5BbGlhcywgVFNjaGVtYVtUSm9pblRhYmxlXSAmIExlZnRKb2luTWFya2VyRm9yPFRUYWJsZXMsIFRMZWZ0Pj4sXG4gICAgVFJlc3VsdFxuICA+O1xuICAvLyBMRUZUIEpPSU46IO2FjOydtOu4lOuqhVxuICBsZWZ0Sm9pbjxUSm9pblRhYmxlIGV4dGVuZHMga2V5b2YgVFNjaGVtYSwgVExlZnQgZXh0ZW5kcyBBdmFpbGFibGVDb2x1bW5zPFRUYWJsZXM+PihcbiAgICB0YWJsZU5hbWU6IFRKb2luVGFibGUsXG4gICAgbGVmdDogVExlZnQsXG4gICAgcmlnaHQ6IGAke1RKb2luVGFibGUgJiBzdHJpbmd9LiR7Q29sdW1uS2V5czxUU2NoZW1hW1RKb2luVGFibGVdPn1gLFxuICApOiBQdXJpPFxuICAgIFRTY2hlbWEsXG4gICAgVFRhYmxlcyAmIFJlY29yZDxUSm9pblRhYmxlLCBUU2NoZW1hW1RKb2luVGFibGVdICYgTGVmdEpvaW5NYXJrZXJGb3I8VFRhYmxlcywgVExlZnQ+PixcbiAgICBUUmVzdWx0XG4gID47XG4gIC8vIExFRlQgSk9JTjog7ISc67iM7L+866asICsgQWxpYXMgKyDsvZzrsLFcbiAgbGVmdEpvaW48VEpvaW5BbGlhcyBleHRlbmRzIHN0cmluZywgVFN1YlJlc3VsdD4oXG4gICAgdGFibGVTcGVjOiB7IFtLIGluIFRKb2luQWxpYXNdOiBQdXJpPFRTY2hlbWEsIGFueSwgVFN1YlJlc3VsdD4gfSxcbiAgICBjYWxsYmFjazogKGo6IEpvaW5DbGF1c2VHcm91cDxUVGFibGVzLCBSZWNvcmQ8VEpvaW5BbGlhcywgVFN1YlJlc3VsdD4+KSA9PiB2b2lkLFxuICApOiBQdXJpPFRTY2hlbWEsIFRUYWJsZXMgJiBSZWNvcmQ8VEpvaW5BbGlhcywgVFN1YlJlc3VsdCAmIExlZnRKb2luZWRNYXJrZXI+LCBUUmVzdWx0PjtcbiAgLy8gTEVGVCBKT0lOOiDthYzsnbTruJQgKyBBbGlhcyArIOy9nOuwsVxuICBsZWZ0Sm9pbjxUSm9pblRhYmxlIGV4dGVuZHMga2V5b2YgVFNjaGVtYSwgVEpvaW5BbGlhcyBleHRlbmRzIHN0cmluZz4oXG4gICAgdGFibGVTcGVjOiB7IFtLIGluIFRKb2luQWxpYXNdOiBUSm9pblRhYmxlIH0sXG4gICAgY2FsbGJhY2s6IChqOiBKb2luQ2xhdXNlR3JvdXA8VFRhYmxlcywgUmVjb3JkPFRKb2luQWxpYXMsIFRTY2hlbWFbVEpvaW5UYWJsZV0+PikgPT4gdm9pZCxcbiAgKTogUHVyaTxUU2NoZW1hLCBUVGFibGVzICYgUmVjb3JkPFRKb2luQWxpYXMsIFRTY2hlbWFbVEpvaW5UYWJsZV0gJiBMZWZ0Sm9pbmVkTWFya2VyPiwgVFJlc3VsdD47XG4gIC8vIExFRlQgSk9JTjog7YWM7J2067iU66qFICsg7L2c67CxXG4gIGxlZnRKb2luPFRKb2luVGFibGUgZXh0ZW5kcyBrZXlvZiBUU2NoZW1hPihcbiAgICB0YWJsZU5hbWU6IFRKb2luVGFibGUsXG4gICAgY2FsbGJhY2s6IChqOiBKb2luQ2xhdXNlR3JvdXA8VFRhYmxlcywgUmVjb3JkPFRKb2luVGFibGUsIFRTY2hlbWFbVEpvaW5UYWJsZV0+PikgPT4gdm9pZCxcbiAgKTogUHVyaTxUU2NoZW1hLCBUVGFibGVzICYgUmVjb3JkPFRKb2luVGFibGUsIFRTY2hlbWFbVEpvaW5UYWJsZV0gJiBMZWZ0Sm9pbmVkTWFya2VyPiwgVFJlc3VsdD47XG4gIC8vIExFRlQgSk9JTiDsi6TsoJwg6rWs7ZiEXG4gIGxlZnRKb2luKHRhYmxlTmFtZU9yU3BlYzogYW55LCAuLi5hcmdzOiBhbnlbXSk6IGFueSB7XG4gICAgcmV0dXJuIHRoaXNbXCJfX2NvbW1vbkpvaW5cIl0oXCJsZWZ0Sm9pblwiLCB0YWJsZU5hbWVPclNwZWMsIC4uLmFyZ3MpO1xuICB9XG5cbiAgLy8gRU5TVVJFIExFRlQgSk9JTjog7YWM7J2067iUICsgQWxpYXNcbiAgZW5zdXJlTGVmdEpvaW48XG4gICAgVEpvaW5UYWJsZSBleHRlbmRzIGtleW9mIFRTY2hlbWEsXG4gICAgVEpvaW5BbGlhcyBleHRlbmRzIHN0cmluZyxcbiAgICBUTGVmdCBleHRlbmRzIEF2YWlsYWJsZUNvbHVtbnM8VFRhYmxlcz4sXG4gID4oXG4gICAgdGFibGVTcGVjOiB7IFtLIGluIFRKb2luQWxpYXNdOiBUSm9pblRhYmxlIH0sXG4gICAgbGVmdDogVExlZnQsXG4gICAgcmlnaHQ6IGAke1RKb2luQWxpYXN9LiR7Q29sdW1uS2V5czxUU2NoZW1hW1RKb2luVGFibGVdPn1gLFxuICApOiBQdXJpPFxuICAgIFRTY2hlbWEsXG4gICAgVFRhYmxlcyAmIFJlY29yZDxUSm9pbkFsaWFzLCBUU2NoZW1hW1RKb2luVGFibGVdICYgTGVmdEpvaW5NYXJrZXJGb3I8VFRhYmxlcywgVExlZnQ+PixcbiAgICBUUmVzdWx0XG4gID47XG4gIC8vIEVOU1VSRSBMRUZUIEpPSU46IO2FjOydtOu4lOuqhVxuICBlbnN1cmVMZWZ0Sm9pbjxUSm9pblRhYmxlIGV4dGVuZHMga2V5b2YgVFNjaGVtYSwgVExlZnQgZXh0ZW5kcyBBdmFpbGFibGVDb2x1bW5zPFRUYWJsZXM+PihcbiAgICB0YWJsZU5hbWU6IFRKb2luVGFibGUsXG4gICAgbGVmdDogVExlZnQsXG4gICAgcmlnaHQ6IGAke1RKb2luVGFibGUgJiBzdHJpbmd9LiR7Q29sdW1uS2V5czxUU2NoZW1hW1RKb2luVGFibGVdPn1gLFxuICApOiBQdXJpPFxuICAgIFRTY2hlbWEsXG4gICAgVFRhYmxlcyAmIFJlY29yZDxUSm9pblRhYmxlLCBUU2NoZW1hW1RKb2luVGFibGVdICYgTGVmdEpvaW5NYXJrZXJGb3I8VFRhYmxlcywgVExlZnQ+PixcbiAgICBUUmVzdWx0XG4gID47XG4gIGVuc3VyZUxlZnRKb2luKHRhYmxlTmFtZU9yU3BlYzogYW55LCBsZWZ0OiBzdHJpbmcsIHJpZ2h0OiBzdHJpbmcpOiBhbnkge1xuICAgIHJldHVybiB0aGlzW1wiX19lbnN1cmVKb2luXCJdKFwibGVmdEpvaW5cIiwgdGFibGVOYW1lT3JTcGVjLCBsZWZ0LCByaWdodCk7XG4gIH1cblxuICBfX2NvbW1vbkpvaW4oam9pblR5cGU6IFwiam9pblwiIHwgXCJsZWZ0Sm9pblwiLCB0YWJsZU5hbWVPclNwZWM6IGFueSwgLi4uYXJnczogYW55W10pOiB0aGlzIHtcbiAgICBjb25zdCByZWdpc3RyYXRpb24gPSB0aGlzLmNyZWF0ZUpvaW5SZWdpc3RyYXRpb24oam9pblR5cGUsIHRhYmxlTmFtZU9yU3BlYywgYXJncyk7XG4gICAgdGhpcy5hc3NlcnRDb3JyZWxhdGlvbkF2YWlsYWJsZShyZWdpc3RyYXRpb24pO1xuXG4gICAgaWYgKGlzU3RyaW5nVmFsdWUodGFibGVOYW1lT3JTcGVjKSkge1xuICAgICAgLy8gQ2FzZSAxOiBqb2luKFwicG9zdHNcIiwgLi4uKVxuICAgICAgY29uc3QgdGFibGVOYW1lID0gdGFibGVOYW1lT3JTcGVjO1xuXG4gICAgICBpZiAoYXJncy5sZW5ndGggPT09IDEgJiYgaXNGdW5jdGlvblZhbHVlKGFyZ3NbMF0pKSB7XG4gICAgICAgIC8vIGpvaW4oXCJwb3N0c1wiLCBjYWxsYmFjaylcbiAgICAgICAgY29uc3QgY2FsbGJhY2sgPSBhcmdzWzBdO1xuICAgICAgICB0aGlzLmtuZXhRdWVyeVtqb2luVHlwZV0odGFibGVOYW1lLCAoam9pbkNsYXVzZSkgPT4ge1xuICAgICAgICAgIGNhbGxiYWNrKG5ldyBKb2luQ2xhdXNlR3JvdXAoam9pbkNsYXVzZSkpO1xuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIGpvaW4oXCJwb3N0c1wiLCBsZWZ0LCByaWdodClcbiAgICAgICAgY29uc3QgW2xlZnQsIHJpZ2h0XSA9IGFyZ3M7XG4gICAgICAgIHRoaXMua25leFF1ZXJ5W2pvaW5UeXBlXSh0YWJsZU5hbWUsIGxlZnQsIHJpZ2h0KTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGlzT2JqZWN0VmFsdWUodGFibGVOYW1lT3JTcGVjKSkge1xuICAgICAgLy8gQ2FzZSAyOiBqb2luKHsgYWxpYXM6IFwidGFibGVcIiB9LCAuLi4pIG9yIGpvaW4oeyBhbGlhczogc3VicXVlcnkgfSwgLi4uKVxuICAgICAgY29uc3QgZW50cmllcyA9IE9iamVjdC5lbnRyaWVzKHRhYmxlTmFtZU9yU3BlYyk7XG4gICAgICBpZiAoZW50cmllcy5sZW5ndGggIT09IDEpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVGFibGUgc3BlYyBtdXN0IGhhdmUgZXhhY3RseSBvbmUgZW50cnlcIik7XG4gICAgICB9XG4gICAgICBhc3NlcnQoZW50cmllc1swXSk7XG4gICAgICBjb25zdCBbW2FsaWFzLCBzcGVjXV0gPSBlbnRyaWVzO1xuXG4gICAgICBpZiAoaXNTdHJpbmdWYWx1ZShzcGVjKSkge1xuICAgICAgICAvLyDthYzsnbTruJQ6IGpvaW4oeyBwOiBcInBvc3RzXCIgfSwgLi4uKVxuICAgICAgICBpZiAoYXJncy5sZW5ndGggPT09IDEgJiYgaXNGdW5jdGlvblZhbHVlKGFyZ3NbMF0pKSB7XG4gICAgICAgICAgLy8gQ2FsbGJhY2tcbiAgICAgICAgICBjb25zdCBjYWxsYmFjayA9IGFyZ3NbMF07XG4gICAgICAgICAgdGhpcy5rbmV4UXVlcnlbam9pblR5cGVdKHsgW2FsaWFzXTogc3BlYyB9LCAoam9pbkNsYXVzZSkgPT4ge1xuICAgICAgICAgICAgY2FsbGJhY2sobmV3IEpvaW5DbGF1c2VHcm91cChqb2luQ2xhdXNlKSk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gU2ltcGxlXG4gICAgICAgICAgY29uc3QgW2xlZnQsIHJpZ2h0XSA9IGFyZ3M7XG4gICAgICAgICAgdGhpcy5rbmV4UXVlcnlbam9pblR5cGVdKHsgW2FsaWFzXTogc3BlYyB9LCBsZWZ0LCByaWdodCk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoc3BlYyBpbnN0YW5jZW9mIFB1cmkpIHtcbiAgICAgICAgLy8g7ISc67iM7L+866asOiBqb2luKHsgc3E6IHN1YnF1ZXJ5IH0sIC4uLilcbiAgICAgICAgaWYgKGFyZ3MubGVuZ3RoID09PSAxICYmIGlzRnVuY3Rpb25WYWx1ZShhcmdzWzBdKSkge1xuICAgICAgICAgIC8vIENhbGxiYWNrXG4gICAgICAgICAgY29uc3QgY2FsbGJhY2sgPSBhcmdzWzBdO1xuICAgICAgICAgIHRoaXMua25leFF1ZXJ5W2pvaW5UeXBlXShzcGVjLnJhd1F1ZXJ5KCkuYXMoYWxpYXMpLCAoam9pbkNsYXVzZSkgPT4ge1xuICAgICAgICAgICAgY2FsbGJhY2sobmV3IEpvaW5DbGF1c2VHcm91cChqb2luQ2xhdXNlKSk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gU2ltcGxlXG4gICAgICAgICAgY29uc3QgW2xlZnQsIHJpZ2h0XSA9IGFyZ3M7XG4gICAgICAgICAgdGhpcy5rbmV4UXVlcnlbam9pblR5cGVdKHNwZWMucmF3UXVlcnkoKS5hcyhhbGlhcyksIGxlZnQsIHJpZ2h0KTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiSW52YWxpZCB0YWJsZSBzcGVjaWZpY2F0aW9uXCIpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIGFyZ3VtZW50c1wiKTtcbiAgICB9XG5cbiAgICB0aGlzLmNvcnJlbGF0aW9uUmVnaXN0cnkuc2V0KHJlZ2lzdHJhdGlvbi5hbGlhcywgcmVnaXN0cmF0aW9uKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIHByaXZhdGUgX19lbnN1cmVKb2luKFxuICAgIGpvaW5UeXBlOiBcImpvaW5cIiB8IFwibGVmdEpvaW5cIixcbiAgICB0YWJsZU5hbWVPclNwZWM6IHN0cmluZyB8IFJlY29yZDxzdHJpbmcsIHN0cmluZz4sXG4gICAgbGVmdDogc3RyaW5nLFxuICAgIHJpZ2h0OiBzdHJpbmcsXG4gICk6IHRoaXMge1xuICAgIGNvbnN0IHJlcXVlc3RlZCA9IHRoaXMuY3JlYXRlSm9pblJlZ2lzdHJhdGlvbihqb2luVHlwZSwgdGFibGVOYW1lT3JTcGVjLCBbbGVmdCwgcmlnaHRdKTtcbiAgICBpZiAoIXJlcXVlc3RlZC5yZXVzYWJsZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgJHtqb2luVHlwZSA9PT0gXCJqb2luXCIgPyBcImVuc3VyZUpvaW5cIiA6IFwiZW5zdXJlTGVmdEpvaW5cIn0gb25seSBzdXBwb3J0cyBwaHlzaWNhbCB0YWJsZXMgd2l0aCBzaW1wbGUgY29sdW1uIGVxdWFsaXR5IGNvbmRpdGlvbnMuYCxcbiAgICAgICk7XG4gICAgfVxuICAgIGNvbnN0IGV4aXN0aW5nID0gdGhpcy5jb3JyZWxhdGlvblJlZ2lzdHJ5LmdldChyZXF1ZXN0ZWQuYWxpYXMpO1xuXG4gICAgaWYgKCFleGlzdGluZykge1xuICAgICAgcmV0dXJuIHRoaXNbXCJfX2NvbW1vbkpvaW5cIl0oam9pblR5cGUsIHRhYmxlTmFtZU9yU3BlYywgbGVmdCwgcmlnaHQpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmlzU2FtZUpvaW5SZWdpc3RyYXRpb24oZXhpc3RpbmcsIHJlcXVlc3RlZCkpIHtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHRocm93IHRoaXMuY3JlYXRlSm9pbkNvbmZsaWN0RXJyb3IoZXhpc3RpbmcsIHJlcXVlc3RlZCk7XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZUpvaW5SZWdpc3RyYXRpb24oXG4gICAgam9pblR5cGU6IFwiam9pblwiIHwgXCJsZWZ0Sm9pblwiLFxuICAgIHRhYmxlTmFtZU9yU3BlYzogYW55LFxuICAgIGFyZ3M6IGFueVtdLFxuICApOiBKb2luUmVnaXN0cmF0aW9uIHtcbiAgICBsZXQgYWxpYXM6IHN0cmluZztcbiAgICBsZXQgdGFibGU6IHN0cmluZyB8IG51bGw7XG5cbiAgICBpZiAoaXNTdHJpbmdWYWx1ZSh0YWJsZU5hbWVPclNwZWMpKSB7XG4gICAgICBhbGlhcyA9IHRhYmxlTmFtZU9yU3BlYztcbiAgICAgIHRhYmxlID0gdGFibGVOYW1lT3JTcGVjO1xuICAgIH0gZWxzZSBpZiAoaXNPYmplY3RWYWx1ZSh0YWJsZU5hbWVPclNwZWMpKSB7XG4gICAgICBjb25zdCBlbnRyaWVzID0gT2JqZWN0LmVudHJpZXModGFibGVOYW1lT3JTcGVjKTtcbiAgICAgIGlmIChlbnRyaWVzLmxlbmd0aCAhPT0gMSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJUYWJsZSBzcGVjIG11c3QgaGF2ZSBleGFjdGx5IG9uZSBlbnRyeVwiKTtcbiAgICAgIH1cbiAgICAgIGFzc2VydChlbnRyaWVzWzBdKTtcbiAgICAgIGNvbnN0IFtbam9pbkFsaWFzLCBzcGVjXV0gPSBlbnRyaWVzO1xuICAgICAgYWxpYXMgPSBqb2luQWxpYXM7XG4gICAgICB0YWJsZSA9IGlzU3RyaW5nVmFsdWUoc3BlYykgPyBzcGVjIDogbnVsbDtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiSW52YWxpZCBhcmd1bWVudHNcIik7XG4gICAgfVxuXG4gICAgY29uc3QgW2xlZnQsIHJpZ2h0XSA9IGFyZ3M7XG4gICAgY29uc3QgcmV1c2FibGUgPVxuICAgICAgdGFibGUgIT09IG51bGwgJiYgYXJncy5sZW5ndGggPT09IDIgJiYgaXNTdHJpbmdWYWx1ZShsZWZ0KSAmJiBpc1N0cmluZ1ZhbHVlKHJpZ2h0KTtcblxuICAgIHJldHVybiB7XG4gICAgICBraW5kOiBcImpvaW5cIixcbiAgICAgIGFsaWFzLFxuICAgICAgdGFibGUsXG4gICAgICBqb2luVHlwZSxcbiAgICAgIGxlZnQ6IHJldXNhYmxlID8gbGVmdCA6IG51bGwsXG4gICAgICByaWdodDogcmV1c2FibGUgPyByaWdodCA6IG51bGwsXG4gICAgICByZXVzYWJsZSxcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBhc3NlcnRDb3JyZWxhdGlvbkF2YWlsYWJsZShyZXF1ZXN0ZWQ6IEpvaW5SZWdpc3RyYXRpb24pOiB2b2lkIHtcbiAgICBjb25zdCBleGlzdGluZyA9IHRoaXMuY29ycmVsYXRpb25SZWdpc3RyeS5nZXQocmVxdWVzdGVkLmFsaWFzKTtcbiAgICBpZiAoZXhpc3RpbmcpIHtcbiAgICAgIGlmICh0aGlzLmlzU2FtZUpvaW5SZWdpc3RyYXRpb24oZXhpc3RpbmcsIHJlcXVlc3RlZCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIGBKb2luIGFsaWFzIFwiJHtyZXF1ZXN0ZWQuYWxpYXN9XCIgaXMgYWxyZWFkeSByZWdpc3RlcmVkLiBVc2UgZW5zdXJlSm9pbigpIG9yIGVuc3VyZUxlZnRKb2luKCkgdG8gcmV1c2UgYW4gaWRlbnRpY2FsIGpvaW4uYCxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIHRocm93IHRoaXMuY3JlYXRlSm9pbkNvbmZsaWN0RXJyb3IoZXhpc3RpbmcsIHJlcXVlc3RlZCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBpc1NhbWVKb2luUmVnaXN0cmF0aW9uKFxuICAgIGV4aXN0aW5nOiBDb3JyZWxhdGlvblJlZ2lzdHJhdGlvbixcbiAgICByZXF1ZXN0ZWQ6IEpvaW5SZWdpc3RyYXRpb24sXG4gICk6IGV4aXN0aW5nIGlzIEpvaW5SZWdpc3RyYXRpb24ge1xuICAgIHJldHVybiAoXG4gICAgICBleGlzdGluZy5raW5kID09PSBcImpvaW5cIiAmJlxuICAgICAgZXhpc3RpbmcucmV1c2FibGUgJiZcbiAgICAgIHJlcXVlc3RlZC5yZXVzYWJsZSAmJlxuICAgICAgZXhpc3RpbmcudGFibGUgPT09IHJlcXVlc3RlZC50YWJsZSAmJlxuICAgICAgZXhpc3Rpbmcuam9pblR5cGUgPT09IHJlcXVlc3RlZC5qb2luVHlwZSAmJlxuICAgICAgZXhpc3RpbmcubGVmdCA9PT0gcmVxdWVzdGVkLmxlZnQgJiZcbiAgICAgIGV4aXN0aW5nLnJpZ2h0ID09PSByZXF1ZXN0ZWQucmlnaHRcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVKb2luQ29uZmxpY3RFcnJvcihcbiAgICBleGlzdGluZzogQ29ycmVsYXRpb25SZWdpc3RyYXRpb24sXG4gICAgcmVxdWVzdGVkOiBKb2luUmVnaXN0cmF0aW9uLFxuICApOiBFcnJvciB7XG4gICAgcmV0dXJuIG5ldyBFcnJvcihcbiAgICAgIFtcbiAgICAgICAgYEpvaW4gYWxpYXMgXCIke3JlcXVlc3RlZC5hbGlhc31cIiBpcyBhbHJlYWR5IHJlZ2lzdGVyZWQgd2l0aCBhIGRpZmZlcmVudCBkZWZpbml0aW9uLmAsXG4gICAgICAgIGBFeGlzdGluZzogJHt0aGlzLmZvcm1hdENvcnJlbGF0aW9uUmVnaXN0cmF0aW9uKGV4aXN0aW5nKX1gLFxuICAgICAgICBgUmVxdWVzdGVkOiAke3RoaXMuZm9ybWF0Q29ycmVsYXRpb25SZWdpc3RyYXRpb24ocmVxdWVzdGVkKX1gLFxuICAgICAgXS5qb2luKFwiXFxuXCIpLFxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIGZvcm1hdENvcnJlbGF0aW9uUmVnaXN0cmF0aW9uKHJlZ2lzdHJhdGlvbjogQ29ycmVsYXRpb25SZWdpc3RyYXRpb24pOiBzdHJpbmcge1xuICAgIGlmIChyZWdpc3RyYXRpb24ua2luZCA9PT0gXCJmcm9tXCIpIHtcbiAgICAgIHJldHVybiBgRlJPTSAke3JlZ2lzdHJhdGlvbi50YWJsZSA/PyBcInN1YnF1ZXJ5XCJ9IEFTICR7cmVnaXN0cmF0aW9uLmFsaWFzfWA7XG4gICAgfVxuXG4gICAgY29uc3Qgam9pbktleXdvcmQgPSByZWdpc3RyYXRpb24uam9pblR5cGUgPT09IFwiam9pblwiID8gXCJKT0lOXCIgOiBcIkxFRlQgSk9JTlwiO1xuICAgIGNvbnN0IHNvdXJjZSA9IHJlZ2lzdHJhdGlvbi50YWJsZSA/PyBcIm9wYXF1ZSBzb3VyY2VcIjtcbiAgICBjb25zdCBjb25kaXRpb24gPSByZWdpc3RyYXRpb24ucmV1c2FibGVcbiAgICAgID8gYCBPTiAke3JlZ2lzdHJhdGlvbi5sZWZ0fSA9ICR7cmVnaXN0cmF0aW9uLnJpZ2h0fWBcbiAgICAgIDogXCIgd2l0aCBvcGFxdWUgY29uZGl0aW9uXCI7XG4gICAgcmV0dXJuIGAke2pvaW5LZXl3b3JkfSAke3NvdXJjZX0gQVMgJHtyZWdpc3RyYXRpb24uYWxpYXN9JHtjb25kaXRpb259YDtcbiAgfVxuXG4gIHByaXZhdGUgY2xlYXJKb2luUmVnaXN0cmF0aW9ucygpOiB2b2lkIHtcbiAgICBmb3IgKGNvbnN0IFthbGlhcywgcmVnaXN0cmF0aW9uXSBvZiB0aGlzLmNvcnJlbGF0aW9uUmVnaXN0cnkpIHtcbiAgICAgIGlmIChyZWdpc3RyYXRpb24ua2luZCA9PT0gXCJqb2luXCIpIHtcbiAgICAgICAgdGhpcy5jb3JyZWxhdGlvblJlZ2lzdHJ5LmRlbGV0ZShhbGlhcyk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBnZXRLbmV4Sm9pbkFsaWFzPFZhbHVlPih0YWJsZTogVmFsdWUpOiBzdHJpbmcgfCBudWxsIHtcbiAgICBpZiAoaXNTdHJpbmdWYWx1ZSh0YWJsZSkpIHtcbiAgICAgIHJldHVybiB0YWJsZTtcbiAgICB9XG4gICAgaWYgKGlzT2JqZWN0VmFsdWUodGFibGUpICYmIHRhYmxlICE9PSBudWxsKSB7XG4gICAgICBpZiAoXG4gICAgICAgIFwiX3NpbmdsZVwiIGluIHRhYmxlICYmXG4gICAgICAgIGlzT2JqZWN0VmFsdWUodGFibGVbXCJfc2luZ2xlXCJdKSAmJlxuICAgICAgICB0YWJsZVtcIl9zaW5nbGVcIl0gIT09IG51bGwgJiZcbiAgICAgICAgXCJhc1wiIGluIHRhYmxlW1wiX3NpbmdsZVwiXSAmJlxuICAgICAgICBpc1N0cmluZ1ZhbHVlKHRhYmxlW1wiX3NpbmdsZVwiXS5hcylcbiAgICAgICkge1xuICAgICAgICByZXR1cm4gdGFibGVbXCJfc2luZ2xlXCJdLmFzO1xuICAgICAgfVxuICAgICAgcmV0dXJuIE9iamVjdC5rZXlzKHRhYmxlKVswXSA/PyBudWxsO1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIC8vIFdIRVJFOiDqsJ3ssrQgLSDsgqzsmqk6IC53aGVyZSh7IFwidS5pZFwiOiAxLCBcInUuc3RhdHVzXCI6IFwiYWN0aXZlXCIgfSlcbiAgd2hlcmUoY29uZGl0aW9uczogV2hlcmVDb25kaXRpb248VFRhYmxlcz4pOiB0aGlzO1xuICAvLyBXSEVSRTog7Lus65+8IC0g7IKs7JqpOiAud2hlcmUoXCJ1LmlkXCIsIDEpLCAud2hlcmUoXCJ1LmlkXCIsIG51bGwpXG4gIHdoZXJlPFRDb2x1bW4gZXh0ZW5kcyBBdmFpbGFibGVDb2x1bW5zPFRUYWJsZXM+PihcbiAgICBjb2x1bW46IFRDb2x1bW4sXG4gICAgdmFsdWU6IEV4dHJhY3RDb2x1bW5UeXBlPFRUYWJsZXMsIFRDb2x1bW4gJiBzdHJpbmc+LFxuICApOiB0aGlzO1xuICAvLyBXSEVSRTog7Lus65+8IC0g7IKs7JqpOiAud2hlcmUoXCJ1LmlkXCIsIFwiPlwiLCAxMCksIC53aGVyZShcInUuaWRcIiwgXCIhPVwiLCBudWxsKVxuICB3aGVyZTxUQ29sdW1uIGV4dGVuZHMgQXZhaWxhYmxlQ29sdW1uczxUVGFibGVzPj4oXG4gICAgY29sdW1uOiBUQ29sdW1uLFxuICAgIG9wZXJhdG9yOiBXaGVyZU9wZXJhdG9yLFxuICAgIHZhbHVlOiBFeHRyYWN0Q29sdW1uVHlwZTxUVGFibGVzLCBUQ29sdW1uICYgc3RyaW5nPixcbiAgKTogdGhpcztcbiAgLy8gV0hFUkU6IFNRTCDtkZztmITsi50gLSDsgqzsmqk6IC53aGVyZShwdXJpLnJhdyhcIkNPTkNBVCh1Lm5hbWUsIHUuZW1haWwpXCIpLCBcImxpa2VcIiwgXCIldGVzdCVcIilcbiAgd2hlcmU8VENvbHVtbiBleHRlbmRzIEtuZXguUmF3Pihjb2x1bW46IFRDb2x1bW4sIG9wZXJhdG9yOiBXaGVyZU9wZXJhdG9yLCB2YWx1ZTogYW55KTogdGhpcztcbiAgLy8gV0hFUkU6IOy7rOufvCAtIOyCrOyaqTogLndoZXJlKFwidS5pZFwiLCBcImxpa2VcIiwgXCIldGVzdCVcIilcbiAgd2hlcmUoLi4uYXJnczogW2NvbHVtbk9yQ29uZGl0aW9uczogYW55LCBvcGVyYXRvck9yVmFsdWU/OiBhbnksIHZhbHVlPzogYW55XSk6IHRoaXMge1xuICAgIGNvbnN0IFtjb2x1bW5PckNvbmRpdGlvbnMsIG9wZXJhdG9yT3JWYWx1ZSwgdmFsdWVdID0gYXJncztcbiAgICBpZiAoaXNPYmplY3RWYWx1ZShjb2x1bW5PckNvbmRpdGlvbnMpKSB7XG4gICAgICB0aGlzLmtuZXhRdWVyeS53aGVyZShjb2x1bW5PckNvbmRpdGlvbnMpO1xuICAgIH0gZWxzZSBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgaWYgKG9wZXJhdG9yT3JWYWx1ZSA9PT0gbnVsbCkge1xuICAgICAgICB0aGlzLmtuZXhRdWVyeS53aGVyZU51bGwoY29sdW1uT3JDb25kaXRpb25zKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICB9XG4gICAgICB0aGlzLmtuZXhRdWVyeS53aGVyZShjb2x1bW5PckNvbmRpdGlvbnMsIG9wZXJhdG9yT3JWYWx1ZSk7XG4gICAgfSBlbHNlIGlmICh2YWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBpZiAodmFsdWUgPT09IG51bGwpIHtcbiAgICAgICAgaWYgKG9wZXJhdG9yT3JWYWx1ZSA9PT0gXCIhPVwiKSB7XG4gICAgICAgICAgdGhpcy5rbmV4UXVlcnkud2hlcmVOb3ROdWxsKGNvbHVtbk9yQ29uZGl0aW9ucyk7XG4gICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgIH0gZWxzZSBpZiAob3BlcmF0b3JPclZhbHVlID09PSBcIj1cIikge1xuICAgICAgICAgIHRoaXMua25leFF1ZXJ5LndoZXJlTnVsbChjb2x1bW5PckNvbmRpdGlvbnMpO1xuICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICB0aGlzLmtuZXhRdWVyeS53aGVyZShjb2x1bW5PckNvbmRpdGlvbnMsIG9wZXJhdG9yT3JWYWx1ZSwgdmFsdWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmtuZXhRdWVyeS53aGVyZShjb2x1bW5PckNvbmRpdGlvbnMpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8vIFdIRVJFIElOXG4gIHdoZXJlSW48VENvbHVtbiBleHRlbmRzIEF2YWlsYWJsZUNvbHVtbnM8VFRhYmxlcz4+KFxuICAgIGNvbHVtbjogVENvbHVtbixcbiAgICB2YWx1ZXM6IChFeHRyYWN0Q29sdW1uVHlwZTxUVGFibGVzLCBUQ29sdW1uICYgc3RyaW5nPiAmIEtuZXguVmFsdWUpW10sXG4gICk6IFB1cmk8VFNjaGVtYSwgVFRhYmxlcywgVFJlc3VsdD4ge1xuICAgIC8vIEtuZXjsnZgg67mE7Ja0IOyeiOuKlCBJTiDrsLDsl7Qg7LKY66as7JmAIOuPmeydvO2VmOqyjCDtla3sg4Eg6rGw7KeT7J24IOyhsOqxtOydhCDsg53shLHtlanri4jri6QuXG4gICAgaWYgKHZhbHVlcy5sZW5ndGggPT09IDApIHtcbiAgICAgIHRoaXMua25leFF1ZXJ5LndoZXJlUmF3KFwiMSA9IDBcIik7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IHBsYWNlaG9sZGVycyA9IHZhbHVlcy5tYXAoKCkgPT4gXCI/XCIpLmpvaW4oXCIsIFwiKTtcbiAgICAgIHRoaXMua25leFF1ZXJ5LndoZXJlUmF3KGA/PyBpbiAoJHtwbGFjZWhvbGRlcnN9KWAsIFtTdHJpbmcoY29sdW1uKSwgLi4udmFsdWVzXSk7XG4gICAgfVxuICAgIC8vIFNBRkVUWTog7L+866asIOu5jOuNlOydmCDsoJzrhKTrpq0g6rOE7JW96rO8IOyEoO2WiSDqsoDspp3snbQg7J20IO2DgOyeheydhCDrs7TsnqXtlanri4jri6QuXG4gICAgcmV0dXJuIHRoaXMgYXMgYW55O1xuICB9XG5cbiAgLy8gV0hFUkUgTk9UIElOXG4gIHdoZXJlTm90SW48VENvbHVtbiBleHRlbmRzIEF2YWlsYWJsZUNvbHVtbnM8VFRhYmxlcz4+KFxuICAgIGNvbHVtbjogVENvbHVtbixcbiAgICB2YWx1ZXM6IChFeHRyYWN0Q29sdW1uVHlwZTxUVGFibGVzLCBUQ29sdW1uICYgc3RyaW5nPiAmIEtuZXguVmFsdWUpW10sXG4gICk6IFB1cmk8VFNjaGVtYSwgVFRhYmxlcywgVFJlc3VsdD4ge1xuICAgIC8vIEtuZXjsnZgg67mE7Ja0IOyeiOuKlCBOT1QgSU4g67Cw7Je0IOyymOumrOyZgCDrj5nsnbztlZjqsowg7ZWt7IOBIOywuOyduCDsobDqsbTsnYQg7IOd7ISx7ZWp64uI64ukLlxuICAgIGlmICh2YWx1ZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aGlzLmtuZXhRdWVyeS53aGVyZVJhdyhcIjEgPSAxXCIpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBwbGFjZWhvbGRlcnMgPSB2YWx1ZXMubWFwKCgpID0+IFwiP1wiKS5qb2luKFwiLCBcIik7XG4gICAgICB0aGlzLmtuZXhRdWVyeS53aGVyZVJhdyhgPz8gbm90IGluICgke3BsYWNlaG9sZGVyc30pYCwgW1N0cmluZyhjb2x1bW4pLCAuLi52YWx1ZXNdKTtcbiAgICB9XG4gICAgLy8gU0FGRVRZOiDsv7zrpqwg67mM642U7J2YIOygnOuEpOumrSDqs4Tslb3qs7wg7ISg7ZaJIOqygOymneydtCDsnbQg7YOA7J6F7J2EIOuztOyepe2VqeuLiOuLpC5cbiAgICByZXR1cm4gdGhpcyBhcyBhbnk7XG4gIH1cblxuICAvLyBXSEVSRSBKU09OQiBTVVBFUlNFVCAoQD4pXG4gIHdoZXJlSnNvblN1cGVyc2V0T2Y8VENvbHVtbiBleHRlbmRzIEpzb25Db2x1bW5zPFRUYWJsZXM+PihcbiAgICBjb2x1bW46IFRDb2x1bW4sXG4gICAgdmFsdWU6IEpzb25TdXBlcnNldFZhbHVlPEV4dHJhY3RDb2x1bW5UeXBlPFRUYWJsZXMsIFRDb2x1bW4+PixcbiAgKTogdGhpcyB7XG4gICAgdGhpcy5rbmV4UXVlcnkud2hlcmVKc29uU3VwZXJzZXRPZihjb2x1bW4sIHNlcmlhbGl6ZUpzb25TdXBlcnNldFZhbHVlKHZhbHVlKSk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICB3aGVyZUpzb25LZXlFeGlzdHMoY29sdW1uOiBKc29uQ29sdW1uczxUVGFibGVzPiwga2V5OiBzdHJpbmcpOiB0aGlzIHtcbiAgICB0aGlzLmtuZXhRdWVyeS53aGVyZVJhdyhcIj8/IFxcXFw/ID9cIiwgW2NvbHVtbiwga2V5XSk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvLyBXSEVSRSBNQVRDSFxuICB3aGVyZU1hdGNoPFRDb2x1bW4gZXh0ZW5kcyBGdWxsdGV4dENvbHVtbnM8VFRhYmxlcz4+KGNvbHVtbjogVENvbHVtbiwgdmFsdWU6IHN0cmluZyk6IHRoaXMge1xuICAgIHRoaXMua25leFF1ZXJ5LndoZXJlUmF3KGBNQVRDSCAoJHtTdHJpbmcoY29sdW1uKX0pIEFHQUlOU1QgKD8pYCwgW3ZhbHVlXSk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogUEdyb29uZ2EgRnVsbFRleHQg7J24642x7IqkIOqygOyDiVxuICAgKiAtIOyCrOyaqe2VoCBQR3Jvb25nYSDsnbjrjbHsiqTsmYAg64+Z7J287ZWcIOy7rOufvCDqtazshLHsnLzroZwg6rKA7IOJ7ZW07JW8IOyduOuNseyKpOqwgCDsgqzsmqnrkKnri4jri6QuXG4gICAqXG4gICAqIOuLqOydvCDsu6zrn7wg6rKA7IOJOlxuICAgKiBgYGBzcWxcbiAgICogV0hFUkUgbmFtZSAmQH4gJ3NlYXJjaCdcbiAgICogYGBgXG4gICAqXG4gICAqIOuzte2VqSDsu6zrn7wg6rKA7IOJOlxuICAgKiBgYGBzcWxcbiAgICogV0hFUkUgQVJSQVlbbmFtZTo6dGV4dCwgZGVzY3JpcHRpb246OnRleHRdICZAfiAnc2VhcmNoJ1xuICAgKiBgYGBcbiAgICovXG4gIHdoZXJlU2VhcmNoPFRDb2x1bW4gZXh0ZW5kcyBBdmFpbGFibGVDb2x1bW5zPFRUYWJsZXM+PihcbiAgICBjb2x1bW46IFRDb2x1bW4gfCBUQ29sdW1uW10sXG4gICAgdmFsdWU6IHN0cmluZyxcbiAgICBvcHRpb25zPzoge1xuICAgICAgd2VpZ2h0cz86IG51bWJlcltdOyAvLyDsoJXsiJgg67Cw7Je0XG4gICAgfSxcbiAgKTogdGhpcyB7XG4gICAgY29uc3QgeyB3ZWlnaHRzIH0gPSBvcHRpb25zID8/IHt9O1xuICAgIGNvbnN0IGNvbHVtbkV4cHIgPSBBcnJheS5pc0FycmF5KGNvbHVtbilcbiAgICAgID8gYEFSUkFZWyR7Y29sdW1uLm1hcCgoYykgPT4gYCR7Y306OnRleHRgKS5qb2luKFwiLFwiKX1dYFxuICAgICAgOiBjb2x1bW47XG4gICAgY29uc3QgcGdyb29uZ2FDb25kaXRpb24gPSBgcGdyb29uZ2FfY29uZGl0aW9uKD8ke3dlaWdodHM/Lmxlbmd0aCA/IGAsIHdlaWdodHMgPT4gQVJSQVlbJHt3ZWlnaHRzLmpvaW4oXCIsXCIpfV1gIDogXCJcIn0pYDtcblxuICAgIHRoaXMua25leFF1ZXJ5LndoZXJlUmF3KGAke2NvbHVtbkV4cHJ9ICZAfiAke3Bncm9vbmdhQ29uZGl0aW9ufWAsIFt2YWx1ZV0pO1xuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvLyBXSEVSRSBGVUxMVEVYVFxuICB3aGVyZVRzU2VhcmNoPFRDb2x1bW4gZXh0ZW5kcyBBdmFpbGFibGVDb2x1bW5zPFRUYWJsZXM+IHwgU3RyaW5nU3FsRXhwcmVzc2lvbj4oXG4gICAgY29sdW1uOiBUQ29sdW1uLFxuICAgIHZhbHVlOiBzdHJpbmcsXG4gICAgb3B0aW9ucz86IFRzUXVlcnlPcHRpb25zIHwgVHNRdWVyeUNvbmZpZyxcbiAgKTogdGhpcyB7XG4gICAgY29uc3Qgb3B0cyA9XG4gICAgICAvLyBTQUZFVFk6IOy/vOumrCDruYzrjZTsnZgg7KCc64Sk66atIOqzhOyVveqzvCDshKDtlokg6rKA7Kad7J20IOydtCDtg4DsnoXsnYQg67O07J6l7ZWp64uI64ukLlxuICAgICAgaXNTdHJpbmdWYWx1ZShvcHRpb25zKSA/ICh7IGNvbmZpZzogb3B0aW9ucyB9IGFzIFRzUXVlcnlPcHRpb25zKSA6IChvcHRpb25zID8/IHt9KTtcblxuICAgIGNvbnN0IHBhcnNlciA9IG9wdHMucGFyc2VyID8/IFwid2Vic2VhcmNoX3RvX3RzcXVlcnlcIjtcbiAgICBjb25zdCBjb25maWcgPSBvcHRzLmNvbmZpZyA/PyBcInNpbXBsZVwiO1xuICAgIGNvbnN0IGNvbHVtbkV4cHIgPSBpc1NxbEV4cHJlc3Npb24oY29sdW1uKSA/IGNvbHVtbltcIl9zcWxcIl0gOiBTdHJpbmcoY29sdW1uKTtcbiAgICBjb25zdCBwYXJhbXMgPSBpc1NxbEV4cHJlc3Npb24oY29sdW1uKVxuICAgICAgPyBbLi4uY29sdW1uW1wiX3BhcmFtc1wiXSwgY29uZmlnLCB2YWx1ZV1cbiAgICAgIDogW2NvbmZpZywgdmFsdWVdO1xuXG4gICAgdGhpcy5rbmV4UXVlcnkud2hlcmVSYXcoYCR7Y29sdW1uRXhwcn0gQEAgJHtwYXJzZXJ9KD8sID8pYCwgcGFyYW1zKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIHdoZXJlRnV6enk8VENvbHVtbiBleHRlbmRzIEF2YWlsYWJsZUNvbHVtbnM8VFRhYmxlcz4gfCBTdHJpbmdTcWxFeHByZXNzaW9uPihcbiAgICBjb2x1bW46IFRDb2x1bW4sXG4gICAgdmFsdWU6IHN0cmluZyxcbiAgICBvcHRpb25zPzoge1xuICAgICAgb3BlcmF0b3I/OiBGdXp6eU9wZXJhdG9yO1xuICAgIH0sXG4gICk6IHRoaXMge1xuICAgIGNvbnN0IG9wZXJhdG9yID0gcGFyc2VGdXp6eU9wZXJhdG9yKG9wdGlvbnM/Lm9wZXJhdG9yKTtcblxuICAgIGlmIChvcGVyYXRvciA9PT0gXCIlXCIpIHtcbiAgICAgIGlmIChpc1NxbEV4cHJlc3Npb24oY29sdW1uKSkge1xuICAgICAgICB0aGlzLmtuZXhRdWVyeS53aGVyZVJhdyhgJHtjb2x1bW5bXCJfc3FsXCJdfSAke29wZXJhdG9yfSA/YCwgWy4uLmNvbHVtbltcIl9wYXJhbXNcIl0sIHZhbHVlXSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmtuZXhRdWVyeS53aGVyZVJhdyhgPz8gJHtvcGVyYXRvcn0gP2AsIFtjb2x1bW4sIHZhbHVlXSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBpZiAoaXNTcWxFeHByZXNzaW9uKGNvbHVtbikpIHtcbiAgICAgIHRoaXMua25leFF1ZXJ5LndoZXJlUmF3KGA/ICR7b3BlcmF0b3J9ICR7Y29sdW1uW1wiX3NxbFwiXX1gLCBbdmFsdWUsIC4uLmNvbHVtbltcIl9wYXJhbXNcIl1dKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5rbmV4UXVlcnkud2hlcmVSYXcoYD8gJHtvcGVyYXRvcn0gPz9gLCBbdmFsdWUsIGNvbHVtbl0pO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8vIFdIRVJFIFJBV1xuICB3aGVyZVJhdyhzcWw6IHN0cmluZywgYmluZGluZ3M/OiByZWFkb25seSBLbmV4LlJhd0JpbmRpbmdbXSk6IHRoaXMge1xuICAgIHRoaXMua25leFF1ZXJ5LndoZXJlUmF3KHNxbCwgYmluZGluZ3MpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLy8gV0hFUkUg6rSE7Zi4IOq3uOujue2VkVxuICB3aGVyZUdyb3VwKGNhbGxiYWNrOiAoZzogV2hlcmVHcm91cDxUVGFibGVzPikgPT4gdm9pZCk6IHRoaXMge1xuICAgIHRoaXMua25leFF1ZXJ5LndoZXJlKChidWlsZGVyKSA9PiB7XG4gICAgICBjb25zdCBncm91cCA9IG5ldyBXaGVyZUdyb3VwPFRUYWJsZXM+KGJ1aWxkZXIpO1xuICAgICAgY2FsbGJhY2soZ3JvdXApO1xuICAgIH0pO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG4gIG9yV2hlcmVHcm91cChjYWxsYmFjazogKGc6IFdoZXJlR3JvdXA8VFRhYmxlcz4pID0+IHZvaWQpOiB0aGlzIHtcbiAgICB0aGlzLmtuZXhRdWVyeS5vcldoZXJlKChidWlsZGVyKSA9PiB7XG4gICAgICBjb25zdCBncm91cCA9IG5ldyBXaGVyZUdyb3VwPFRUYWJsZXM+KGJ1aWxkZXIpO1xuICAgICAgY2FsbGJhY2soZ3JvdXApO1xuICAgIH0pO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLy8gT1JERVIgQlkgKFNxbEV4cHJlc3Npb27snLzroZzrj4Qg7ZWgIOyImCDsnojslrTslbwg7ZWoKVxuICBvcmRlckJ5PFRDb2x1bW4gZXh0ZW5kcyBSZXN1bHRBdmFpbGFibGVDb2x1bW5zPFRUYWJsZXMsIFRSZXN1bHQ+PihcbiAgICBjb2x1bW46IFRDb2x1bW4gfCBQdXJpT3JkZXJCeUV4cHJlc3Npb24sXG4gICAgZGlyZWN0aW9uPzogUHVyaU9yZGVyQnlEaXJlY3Rpb24sXG4gICAgbnVsbHM/OiBQdXJpT3JkZXJCeU51bGxzLFxuICApOiB0aGlzO1xuICBvcmRlckJ5PFRDb2x1bW4gZXh0ZW5kcyBSZXN1bHRBdmFpbGFibGVDb2x1bW5zPFRUYWJsZXMsIFRSZXN1bHQ+PihcbiAgICBjb2x1bW5zOiByZWFkb25seSBQdXJpT3JkZXJCeUVudHJ5PFRDb2x1bW4+W10sXG4gICk6IHRoaXM7XG4gIG9yZGVyQnkoXG4gICAgY29sdW1uT3JDb2x1bW5zOiBzdHJpbmcgfCBQdXJpT3JkZXJCeUV4cHJlc3Npb24gfCByZWFkb25seSBQdXJpT3JkZXJCeVJ1bnRpbWVFbnRyeVtdLFxuICAgIGRpcmVjdGlvbjogUHVyaU9yZGVyQnlEaXJlY3Rpb24gPSBcImFzY1wiLFxuICAgIG51bGxzPzogUHVyaU9yZGVyQnlOdWxscyxcbiAgKTogdGhpcyB7XG4gICAgaWYgKGlzT3JkZXJCeUVudHJpZXMoY29sdW1uT3JDb2x1bW5zKSkge1xuICAgICAgZm9yIChjb25zdCBlbnRyeSBvZiBjb2x1bW5PckNvbHVtbnMpIHtcbiAgICAgICAgaWYgKGlzU3RyaW5nVmFsdWUoZW50cnkpIHx8IGlzT3JkZXJCeUV4cHJlc3Npb24oZW50cnkpKSB7XG4gICAgICAgICAgdGhpcy5hcHBseU9yZGVyQnkoZW50cnkpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMuYXBwbHlPcmRlckJ5KGVudHJ5LmNvbHVtbiwgZW50cnkub3JkZXIsIGVudHJ5Lm51bGxzKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgdGhpcy5hcHBseU9yZGVyQnkoY29sdW1uT3JDb2x1bW5zLCBkaXJlY3Rpb24sIG51bGxzKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIHByaXZhdGUgYXBwbHlPcmRlckJ5KFxuICAgIGNvbHVtbjogc3RyaW5nIHwgUHVyaU9yZGVyQnlFeHByZXNzaW9uLFxuICAgIGRpcmVjdGlvbj86IFB1cmlPcmRlckJ5RGlyZWN0aW9uLFxuICAgIG51bGxzPzogUHVyaU9yZGVyQnlOdWxscyxcbiAgKTogdm9pZCB7XG4gICAgY29uc3Qgbm9ybWFsaXplZERpcmVjdGlvbiA9IG5vcm1hbGl6ZU9yZGVyQnlEaXJlY3Rpb24oZGlyZWN0aW9uKTtcbiAgICBjb25zdCBub3JtYWxpemVkTnVsbHMgPSBub3JtYWxpemVPcmRlckJ5TnVsbHMobnVsbHMpO1xuXG4gICAgaWYgKGlzT3JkZXJCeUV4cHJlc3Npb24oY29sdW1uKSkge1xuICAgICAgdGhpcy5rbmV4UXVlcnkub3JkZXJCeVJhdyhcbiAgICAgICAgYCR7Y29sdW1uW1wiX3NxbFwiXX0gJHtub3JtYWxpemVkRGlyZWN0aW9ufSR7Zm9ybWF0TnVsbHNTdWZmaXgobm9ybWFsaXplZE51bGxzKX1gLFxuICAgICAgICBjb2x1bW5bXCJfcGFyYW1zXCJdLFxuICAgICAgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5rbmV4UXVlcnkub3JkZXJCeShjb2x1bW4sIG5vcm1hbGl6ZWREaXJlY3Rpb24sIG5vcm1hbGl6ZWROdWxscyk7XG4gICAgfVxuICB9XG5cbiAgZm9yVXBkYXRlKCk6IHRoaXMge1xuICAgIHRoaXMua25leFF1ZXJ5LmZvclVwZGF0ZSgpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgZm9yU2hhcmUoKTogdGhpcyB7XG4gICAgdGhpcy5rbmV4UXVlcnkuZm9yU2hhcmUoKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiDrsqHthLAg7Jyg7IKs64+EIOqygOyDiSDshKTsoJVcbiAgICpcbiAgICogLSBTRUxFQ1Tsl5Agc2ltaWxhcml0eSDsu6zrn7wg7LaU6rCAXG4gICAqIC0gV0hFUkUgY29sIElTIE5PVCBOVUxMIOy2lOqwgFxuICAgKiAtIHRocmVzaG9sZOqwgCDsnojsnLzrqbQgV0hFUkUg7KGw6rG0IOy2lOqwgFxuICAgKiAtIOq4sOyhtCBPUkRFUiBCWeulvCBjbGVhcu2VmOqzoCDsm5Dsi5wg7Jew7IKw7J6Q66GcIOygleugrCAoSE5TVyDsnbjrjbHsiqQg7LWc7KCB7ZmUKVxuICAgKlxuICAgKiBAcGFyYW0gY29sdW1uIOuyoe2EsCDsu6zrn7wg6rK966GcXG4gICAqIEBwYXJhbSBlbWJlZGRpbmcg7L+866asIOyehOuyoOuUqSDrsqHthLBcbiAgICogQHBhcmFtIG9wdGlvbnMgbWV0aG9kLCB0aHJlc2hvbGQsIGFzIOuTsSDsmLXshZhcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiAvLyBjb3NpbmUgc2ltaWxhcml0eSAo6riw67O46rCSKVxuICAgKiBxYi52ZWN0b3JTaW1pbGFyaXR5KFwiY29sdW1uTmFtZVwiLCBxdWVyeVZlY3Rvciwge1xuICAgKiAgIG1ldGhvZDogXCJjb3NpbmVcIixcbiAgICogICB0aHJlc2hvbGQ6IDAuNVxuICAgKiB9KTtcbiAgICpcbiAgICogLy8gTDIgZGlzdGFuY2VcbiAgICogcWIudmVjdG9yU2ltaWxhcml0eShcImNvbHVtbk5hbWVcIiwgcXVlcnlWZWN0b3IsIHtcbiAgICogICBtZXRob2Q6IFwibDJcIixcbiAgICogICB0aHJlc2hvbGQ6IDEuNSAgLy8g6rGw66as6rCAIDEuNSDsnbTtlZjsnbgg6rKw6rO866eMXG4gICAqIH0pO1xuICAgKlxuICAgKiAvLyBJbm5lciBwcm9kdWN0XG4gICAqIHFiLnZlY3RvclNpbWlsYXJpdHkoXCJjb2x1bW5OYW1lXCIsIHF1ZXJ5VmVjdG9yLCB7XG4gICAqICAgbWV0aG9kOiBcImlubmVyX3Byb2R1Y3RcIixcbiAgICogICB0aHJlc2hvbGQ6IDAuN1xuICAgKiB9KTtcbiAgICogYGBgXG4gICAqL1xuICB2ZWN0b3JTaW1pbGFyaXR5KFxuICAgIGNvbHVtbjogVmVjdG9yQ29sdW1uczxUVGFibGVzPixcbiAgICBlbWJlZGRpbmc6IG51bWJlcltdLFxuICAgIG9wdGlvbnM6IHtcbiAgICAgIG1ldGhvZD86IFwiY29zaW5lXCIgfCBcImwyXCIgfCBcImlubmVyX3Byb2R1Y3RcIjtcbiAgICAgIHRocmVzaG9sZD86IG51bWJlcjtcbiAgICAgIGRpc3RpbmN0T24/OiBBdmFpbGFibGVDb2x1bW5zPFRUYWJsZXM+O1xuICAgIH0gPSB7fSxcbiAgKTogUHVyaTxUU2NoZW1hLCBUVGFibGVzLCBUUmVzdWx0ICYgeyBzaW1pbGFyaXR5OiBudW1iZXIgfT4ge1xuICAgIGNvbnN0IHsgbWV0aG9kID0gXCJjb3NpbmVcIiwgdGhyZXNob2xkLCBkaXN0aW5jdE9uIH0gPSBvcHRpb25zO1xuXG4gICAgaWYgKFxuICAgICAgIUFycmF5LmlzQXJyYXkoZW1iZWRkaW5nKSB8fFxuICAgICAgZW1iZWRkaW5nLmxlbmd0aCA9PT0gMCB8fFxuICAgICAgZW1iZWRkaW5nLnNvbWUoKHYpID0+ICFOdW1iZXIuaXNGaW5pdGUodikpXG4gICAgKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIGVtYmVkZGluZyB2ZWN0b3I6IGV4cGVjdGVkIGEgbm9uLWVtcHR5IGFycmF5IG9mIGZpbml0ZSBudW1iZXJzXCIpO1xuICAgIH1cblxuICAgIGNvbnN0IHZlY3RvckxpdGVyYWwgPSBKU09OLnN0cmluZ2lmeShlbWJlZGRpbmcubWFwKCh2KSA9PiBOdW1iZXIodikpKTtcbiAgICBjb25zdCBvcGVyYXRvciA9IHsgY29zaW5lOiBcIjw9PlwiLCBsMjogXCI8LT5cIiwgaW5uZXJfcHJvZHVjdDogXCI8Iz5cIiB9W21ldGhvZF07XG5cbiAgICAvLyBtZXRob2Trs4Qg7Jew7IKw7J6QIOuwjyBzaW1pbGFyaXR5IOqzhOyCsOyLnVxuICAgIC8vIC0gY29zaW5lOiA8PT4gKGNvc2luZSBkaXN0YW5jZSwgMH4yKSwgc2ltaWxhcml0eSA9IDEgLSBkaXN0YW5jZVxuICAgIC8vIC0gbDI6IDwtPiAoZXVjbGlkZWFuIGRpc3RhbmNlKSwgc2ltaWxhcml0eSA9IGRpc3RhbmNlICjrgq7snYTsiJjroZ0g7Jyg7IKsKVxuICAgIC8vIC0gaW5uZXJfcHJvZHVjdDogPCM+IChuZWdhdGl2ZSBpbm5lciBwcm9kdWN0KSwgc2ltaWxhcml0eSA9IC1kaXN0YW5jZSAo64aS7J2E7IiY66GdIOycoOyCrClcbiAgICBjb25zdCBzaW1pbGFyaXR5RXhwciA9XG4gICAgICBtZXRob2QgPT09IFwiY29zaW5lXCJcbiAgICAgICAgPyB0aGlzLmtuZXgucmF3KGAxIC0gKD8/ICR7b3BlcmF0b3J9ID86OnZlY3RvcikgYXMgc2ltaWxhcml0eWAsIFtjb2x1bW4sIHZlY3RvckxpdGVyYWxdKVxuICAgICAgICA6IG1ldGhvZCA9PT0gXCJsMlwiXG4gICAgICAgICAgPyB0aGlzLmtuZXgucmF3KGA/PyAke29wZXJhdG9yfSA/Ojp2ZWN0b3IgYXMgc2ltaWxhcml0eWAsIFtjb2x1bW4sIHZlY3RvckxpdGVyYWxdKVxuICAgICAgICAgIDogdGhpcy5rbmV4LnJhdyhgLSg/PyAke29wZXJhdG9yfSA/Ojp2ZWN0b3IpIGFzIHNpbWlsYXJpdHlgLCBbY29sdW1uLCB2ZWN0b3JMaXRlcmFsXSk7XG5cbiAgICAvLyBXSEVSRSBOT1QgTlVMTFxuICAgIHRoaXMua25leFF1ZXJ5LndoZXJlTm90TnVsbChjb2x1bW4pO1xuXG4gICAgLy8g6riw7KG0IE9SREVSIEJZIGNsZWFyXG4gICAgdGhpcy5rbmV4UXVlcnkuY2xlYXIoXCJvcmRlclwiKTtcbiAgICBpZiAoZGlzdGluY3RPbikge1xuICAgICAgLy8gRElTVElOQ1QgT07snYAgU0VMRUNUIOygiOydmCDrp6gg7JWe7JeQIOyZgOyVvCDtlZjrr4DroZwsIOq4sOyhtCBzZWxlY3Qoc3Vic2V0IO2VhOuTnOuTpCnrpbwg67O07KG0IO2bhCBjbGVhcu2VmOqzoCDri6Tsi5wg7LaU6rCAXG4gICAgICAvLyBTQUZFVFk6IOy/vOumrCDruYzrjZTsnZgg7KCc64Sk66atIOqzhOyVveqzvCDshKDtlokg6rKA7Kad7J20IOydtCDtg4DsnoXsnYQg67O07J6l7ZWp64uI64ukLlxuICAgICAgY29uc3QgZXhpc3RpbmdTdWJzZXRDb2xzID0gKHRoaXMua25leFF1ZXJ5IGFzIGFueSlbXCJfc3RhdGVtZW50c1wiXVxuICAgICAgICAuZmlsdGVyKChzOiBhbnkpID0+IHMuZ3JvdXBpbmcgPT09IFwiY29sdW1uc1wiKVxuICAgICAgICAuZmxhdE1hcCgoczogYW55KSA9PiBzLnZhbHVlKTtcbiAgICAgIHRoaXMua25leFF1ZXJ5LmNsZWFyKFwic2VsZWN0XCIpO1xuICAgICAgdGhpcy5rbmV4UXVlcnkuc2VsZWN0KHRoaXMua25leC5yYXcoYERJU1RJTkNUIE9OICg/PykgPz9gLCBbZGlzdGluY3RPbiwgZGlzdGluY3RPbl0pKTtcbiAgICAgIGV4aXN0aW5nU3Vic2V0Q29scy5tYXAoKGNvbDogYW55KSA9PiB0aGlzLmtuZXhRdWVyeS5zZWxlY3QoY29sKSk7XG4gICAgICB0aGlzLmtuZXhRdWVyeS5zZWxlY3Qoc2ltaWxhcml0eUV4cHIpO1xuICAgICAgdGhpcy5rbmV4UXVlcnkub3JkZXJCeVJhdyhgPz8sID8/ICR7b3BlcmF0b3J9ID86OnZlY3RvcmAsIFtcbiAgICAgICAgZGlzdGluY3RPbixcbiAgICAgICAgY29sdW1uLFxuICAgICAgICB2ZWN0b3JMaXRlcmFsLFxuICAgICAgXSk7XG5cbiAgICAgIHRoaXMua25leFF1ZXJ5ID0gdGhpcy5rbmV4XG4gICAgICAgIC5mcm9tKHRoaXMua25leFF1ZXJ5LmFzKFwiZGlzdGluY3RfdmVjdG9yc1wiKSlcbiAgICAgICAgLnNlbGVjdChcIipcIilcbiAgICAgICAgLm9yZGVyQnkoXCJzaW1pbGFyaXR5XCIsIFwiZGVzY1wiKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5rbmV4UXVlcnkuc2VsZWN0KHNpbWlsYXJpdHlFeHByKTtcbiAgICAgIHRoaXMua25leFF1ZXJ5Lm9yZGVyQnlSYXcoYD8/ICR7b3BlcmF0b3J9ID86OnZlY3RvcmAsIFtjb2x1bW4sIHZlY3RvckxpdGVyYWxdKTtcbiAgICB9XG5cbiAgICAvLyB0aHJlc2hvbGRcbiAgICBpZiAoaXNOdW1iZXJWYWx1ZSh0aHJlc2hvbGQpKSB7XG4gICAgICBpZiAoIU51bWJlci5pc0Zpbml0ZSh0aHJlc2hvbGQpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCB2ZWN0b3JTaW1pbGFyaXR5IHRocmVzaG9sZDogJHt0aHJlc2hvbGR9YCk7XG4gICAgICB9XG5cbiAgICAgIGlmIChkaXN0aW5jdE9uKSB7XG4gICAgICAgIGNvbnN0IHRocmVzaG9sZE9wID0gbWV0aG9kID09PSBcImwyXCIgPyBcIjw9XCIgOiBcIj49XCI7XG4gICAgICAgIHRoaXMua25leFF1ZXJ5LndoZXJlKFwic2ltaWxhcml0eVwiLCB0aHJlc2hvbGRPcCwgdGhyZXNob2xkKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IHRocmVzaG9sZFZhbHVlID1cbiAgICAgICAgICBtZXRob2QgPT09IFwiY29zaW5lXCIgPyAxIC0gdGhyZXNob2xkIDogbWV0aG9kID09PSBcImlubmVyX3Byb2R1Y3RcIiA/IC10aHJlc2hvbGQgOiB0aHJlc2hvbGQ7XG4gICAgICAgIHRoaXMua25leFF1ZXJ5LndoZXJlUmF3KGA/PyAke29wZXJhdG9yfSA/Ojp2ZWN0b3IgPD0gP2AsIFtcbiAgICAgICAgICBjb2x1bW4sXG4gICAgICAgICAgdmVjdG9yTGl0ZXJhbCxcbiAgICAgICAgICB0aHJlc2hvbGRWYWx1ZSxcbiAgICAgICAgXSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gU0FGRVRZOiDsv7zrpqwg67mM642U7J2YIOygnOuEpOumrSDqs4Tslb3qs7wg7ISg7ZaJIOqygOymneydtCDsnbQg7YOA7J6F7J2EIOuztOyepe2VqeuLiOuLpC5cbiAgICByZXR1cm4gdGhpcyBhcyBhbnk7XG4gIH1cblxuICAvLyDquLDrs7gg7L+866asIOuplOyEnOuTnOuTpFxuICBsaW1pdChjb3VudDogbnVtYmVyKTogdGhpcyB7XG4gICAgaWYgKGNvdW50IDwgMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiSW52YWxpZCBsaW1pdDogbXVzdCBiZSA+PSAwXCIpO1xuICAgIH1cbiAgICB0aGlzLmtuZXhRdWVyeS5saW1pdChjb3VudCk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBvZmZzZXQoY291bnQ6IG51bWJlcik6IHRoaXMge1xuICAgIGlmIChjb3VudCA8IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIkludmFsaWQgb2Zmc2V0OiBtdXN0IGJlID49IDBcIik7XG4gICAgfVxuICAgIHRoaXMua25leFF1ZXJ5Lm9mZnNldChjb3VudCk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvLyBHUk9VUCBCWVxuICBncm91cEJ5PFRDb2x1bW5zIGV4dGVuZHMgUmVzdWx0QXZhaWxhYmxlQ29sdW1uczxUVGFibGVzLCBUUmVzdWx0Pj4oLi4uY29sdW1uczogVENvbHVtbnNbXSk6IHRoaXM7XG4gIGdyb3VwQnkoLi4uY29sdW1uczogc3RyaW5nW10pOiB0aGlzIHtcbiAgICB0aGlzLmtuZXhRdWVyeS5ncm91cEJ5KC4uLmNvbHVtbnMpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLy8gSEFWSU5HXG4gIGhhdmluZyhjb25kaXRpb246IHN0cmluZyk6IHRoaXM7XG4gIGhhdmluZzxUQ29sdW1uIGV4dGVuZHMgUmVzdWx0QXZhaWxhYmxlQ29sdW1uczxUVGFibGVzLCBUUmVzdWx0Pj4oXG4gICAgY29sdW1uOiBUQ29sdW1uLFxuICAgIG9wZXJhdG9yOiBDb21wYXJpc29uT3BlcmF0b3IsXG4gICAgdmFsdWU6IGFueSxcbiAgKTogdGhpcztcbiAgLy8gSEFWSU5HIOq1rO2YhFxuICBoYXZpbmcoLi4uY29uZGl0aW9uczogYW55W10pOiB0aGlzIHtcbiAgICBpZiAoY29uZGl0aW9ucy5sZW5ndGggPT09IDEpIHtcbiAgICAgIC8vIGhhdmluZyhcIkNPVU5UKCopID4gMTBcIilcbiAgICAgIHRoaXMua25leFF1ZXJ5LmhhdmluZyh0aGlzLmtuZXgucmF3KGNvbmRpdGlvbnNbMF0pKTtcbiAgICB9IGVsc2UgaWYgKGNvbmRpdGlvbnMubGVuZ3RoID09PSAzKSB7XG4gICAgICAvLyBoYXZpbmcoXCJjb3VudFwiLCBcIj5cIiwgMTApXG4gICAgICB0aGlzLmtuZXhRdWVyeS5oYXZpbmcoXG4gICAgICAgIHRoaXMua25leC5yYXcoY29uZGl0aW9uc1swXSksXG4gICAgICAgIGNvbmRpdGlvbnNbMV0sXG4gICAgICAgIHRoaXMua25leC5yYXcoY29uZGl0aW9uc1syXSksXG4gICAgICApO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIGhhdmluZyBhcmd1bWVudHNcIik7XG4gICAgfVxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLy8g7Iuk7ZaJIOuplOyEnOuTnOuTpCAtIHRoZW5hYmxlIOq1rO2YhFxuICB0aGVuPFRSZXN1bHQxID0gRXhwYW5kPFRSZXN1bHQ+W10sIFRSZXN1bHQyID0gbmV2ZXI+KFxuICAgIG9uZnVsZmlsbGVkPzogKCh2YWx1ZTogRXhwYW5kPFRSZXN1bHQ+W10pID0+IFRSZXN1bHQxIHwgUHJvbWlzZUxpa2U8VFJlc3VsdDE+KSB8IG51bGwsXG4gICAgb25yZWplY3RlZD86ICgocmVhc29uOiBhbnkpID0+IFRSZXN1bHQyIHwgUHJvbWlzZUxpa2U8VFJlc3VsdDI+KSB8IG51bGwsXG4gICk6IFByb21pc2U8VFJlc3VsdDEgfCBUUmVzdWx0Mj4ge1xuICAgIE5haXRlLnQoXCJwdXJpOmV4ZWN1dGVkLXF1ZXJ5XCIsIHRoaXMudG9RdWVyeSgpKTtcbiAgICAvLyBTQUZFVFk6IOy/vOumrCDruYzrjZTsnZgg7KCc64Sk66atIOqzhOyVveqzvCDshKDtlokg6rKA7Kad7J20IOydtCDtg4DsnoXsnYQg67O07J6l7ZWp64uI64ukLlxuICAgIHJldHVybiB0aGlzLmtuZXhRdWVyeS50aGVuKG9uZnVsZmlsbGVkIGFzIGFueSwgb25yZWplY3RlZCk7XG4gIH1cbiAgY2F0Y2g8VFJlc3VsdDIgPSBuZXZlcj4oXG4gICAgb25yZWplY3RlZD86ICgocmVhc29uOiBhbnkpID0+IFRSZXN1bHQyIHwgUHJvbWlzZUxpa2U8VFJlc3VsdDI+KSB8IG51bGwsXG4gICk6IFByb21pc2U8VFJlc3VsdCB8IFRSZXN1bHQyPiB7XG4gICAgcmV0dXJuIHRoaXMua25leFF1ZXJ5LmNhdGNoKG9ucmVqZWN0ZWQpO1xuICB9XG4gIGZpbmFsbHkob25maW5hbGx5PzogKCgpID0+IHZvaWQpIHwgbnVsbCk6IFByb21pc2U8VFJlc3VsdD4ge1xuICAgIHJldHVybiB0aGlzLmtuZXhRdWVyeS5maW5hbGx5KG9uZmluYWxseSk7XG4gIH1cblxuICAvLyDtlZjrgpjrp4wg7L+866asXG4gIGZpcnN0KCk6IFJlc29sdmVkUHVyaTxFeHBhbmQ8VFJlc3VsdD4sIG5ldmVyPiB7XG4gICAgdGhpcy5rbmV4UXVlcnkuZmlyc3QoKTtcbiAgICByZXR1cm4gbmV3IFJlc29sdmVkUHVyaSh0aGlzLmtuZXhRdWVyeSwgdGhpcy5rbmV4LCB0aGlzLnRhYmxlU3BlYyk7XG4gIH1cblxuICAvLyDsv7zrpqztlZwg66CI7L2U65Oc7JeQ7IScIO2KueyglSDsu6zrn7zrp4wg7LaU7Lac7ZWcIOuwsOyXtCDrpqzthLRcbiAgcGx1Y2s8VENvbHVtbiBleHRlbmRzIGtleW9mIFRSZXN1bHQgfCBSZXN1bHRBdmFpbGFibGVDb2x1bW5zPFRUYWJsZXMsIFRSZXN1bHQ+PihcbiAgICBjb2x1bW46IFRDb2x1bW4sXG4gICk6IFJlc29sdmVkUHVyaTxcbiAgICBUQ29sdW1uIGV4dGVuZHMga2V5b2YgVFJlc3VsdFxuICAgICAgPyBUUmVzdWx0W1RDb2x1bW5dW11cbiAgICAgIDogRXh0cmFjdENvbHVtblR5cGU8VFRhYmxlcywgVENvbHVtbiAmIHN0cmluZz5bXSxcbiAgICBuZXZlclxuICA+IHtcbiAgICAvLyBTQUZFVFk6IOy/vOumrCDruYzrjZTsnZgg7KCc64Sk66atIOqzhOyVveqzvCDshKDtlokg6rKA7Kad7J20IOydtCDtg4DsnoXsnYQg67O07J6l7ZWp64uI64ukLlxuICAgIHRoaXMua25leFF1ZXJ5LnBsdWNrKGNvbHVtbiBhcyBzdHJpbmcpO1xuICAgIHJldHVybiBuZXcgUmVzb2x2ZWRQdXJpKHRoaXMua25leFF1ZXJ5LCB0aGlzLmtuZXgsIHRoaXMudGFibGVTcGVjKTtcbiAgfVxuXG4gIC8vIElOU0VSVCA6IOuLqOydvCDqsJ3ssrRcbiAgaW5zZXJ0KFxuICAgIGRhdGE6IEluc2VydERhdGE8U2luZ2xlVGFibGVWYWx1ZTxUVGFibGVzPj4sXG4gICk6IFJlc29sdmVkUHVyaTxJbnNlcnRSZXN1bHQsIFNpbmdsZVRhYmxlVmFsdWU8VFRhYmxlcz4+O1xuICAvLyBJTlNFUlQ6IOuwsOyXtFxuICBpbnNlcnQoXG4gICAgZGF0YTogSW5zZXJ0RGF0YTxTaW5nbGVUYWJsZVZhbHVlPFRUYWJsZXM+PltdLFxuICApOiBSZXNvbHZlZFB1cmk8SW5zZXJ0UmVzdWx0LCBTaW5nbGVUYWJsZVZhbHVlPFRUYWJsZXM+PjtcbiAgLy8gSU5TRVJUIOyLpOygnCDqtaztmIRcbiAgaW5zZXJ0KFxuICAgIHJhd0RhdGE6IEluc2VydERhdGE8U2luZ2xlVGFibGVWYWx1ZTxUVGFibGVzPj4gfCBJbnNlcnREYXRhPFNpbmdsZVRhYmxlVmFsdWU8VFRhYmxlcz4+W10sXG4gICk6IFJlc29sdmVkUHVyaTxJbnNlcnRSZXN1bHQsIFNpbmdsZVRhYmxlVmFsdWU8VFRhYmxlcz4+IHtcbiAgICAvLyBKU09OIOy7rOufvCBzdHJpbmdpZnkg66Gc7KeB7J2EIOuplOyEnOuTnOuhnCDrtoTrpqztlZjsl6wg7KSR67O1IOygnOqxsFxuICAgIGNvbnN0IHJlZmluZWREYXRhID0gdGhpcy5yZWZpbmVKc29uQ29sdW1ucyhyYXdEYXRhKTtcbiAgICB0aGlzLmtuZXhRdWVyeS5pbnNlcnQocmVmaW5lZERhdGEpO1xuICAgIHJldHVybiBuZXcgUmVzb2x2ZWRQdXJpKHRoaXMua25leFF1ZXJ5LCB0aGlzLmtuZXgsIHRoaXMudGFibGVTcGVjKTtcbiAgfVxuXG4gIC8vIFVQREFURVxuICB1cGRhdGUocmF3RGF0YTogV2hlcmVDb25kaXRpb248VFRhYmxlcz4pOiBSZXNvbHZlZFB1cmk8bnVtYmVyLCBTaW5nbGVUYWJsZVZhbHVlPFRUYWJsZXM+PiB7XG4gICAgLy8gSlNPTiDsu6zrn7wgc3RyaW5naWZ5IOuhnOyngeydhCDrqZTshJzrk5zroZwg67aE66as7ZWY7JesIOykkeuztSDsoJzqsbBcbiAgICBjb25zdCByZWZpbmVkRGF0YSA9IHRoaXMucmVmaW5lSnNvbkNvbHVtbnMocmF3RGF0YSk7XG4gICAgdGhpcy5rbmV4UXVlcnkudXBkYXRlKHJlZmluZWREYXRhKTtcbiAgICByZXR1cm4gbmV3IFJlc29sdmVkUHVyaSh0aGlzLmtuZXhRdWVyeSwgdGhpcy5rbmV4LCB0aGlzLnRhYmxlU3BlYyk7XG4gIH1cblxuICAvKipcbiAgICogSlNPTiDsu6zrn7zsl5Ag64yA7ZW0IHN0cmluZ2lmeSDsspjrpqzrpbwg7IiY7ZaJ7ZWY64qUIOuCtOu2gCDrqZTshJzrk5zsnoXri4jri6QuXG4gICAqIG9iamVjdCDrmJDripQgb2JqZWN0IOuwsOyXtOydhCDrsJvqs6AsIEpTT04g7Lus65+87J20IOyeiOycvOuptCDsp4HroKztmZTtlZjsl6wg67CY7ZmY7ZWp64uI64ukLlxuICAgKiDsp4HsoJEg6rCS7J2EIOuzgOqyve2VmOuvgOuhnCBzaWRlIGVmZmVjdOqwgCDsnojsirXri4jri6QuXG4gICAqL1xuICBwcml2YXRlIHJlZmluZUpzb25Db2x1bW5zPFJvdyBleHRlbmRzIG9iamVjdD4oZGF0YTogUm93IHwgUm93W10pOiB0eXBlb2YgZGF0YSB7XG4gICAgLy8gdGFibGVTcGVj7J2064KYIGpzb25Db2x1bW5zIOyXhuuKlCDqsr3smrAg67CU66GcIOuwmO2ZmFxuICAgIGlmICghdGhpcy50YWJsZVNwZWMgfHwgIXRoaXMudGFibGVTcGVjLmpzb25Db2x1bW5zLmxlbmd0aCkge1xuICAgICAgcmV0dXJuIGRhdGE7XG4gICAgfVxuXG4gICAgLy8g65Ox66Gd65CcIFRhYmxlU3BlY+ydhCDthrXtlbQgSlNPTuy7rOufvCDrqqnroZ3snYQg6rCA7KC47JmAIEpTT04uc3RyaW5naWZ5IOyymOumrFxuICAgIGNvbnN0IGpzb25Db2x1bW5zID0gdGhpcy50YWJsZVNwZWMuanNvbkNvbHVtbnM7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkoZGF0YSkpIHtcbiAgICAgIGZvciAoY29uc3QgaXRlbSBvZiBkYXRhKSB7XG4gICAgICAgIGZvciAoY29uc3QgY29sdW1uIG9mIGpzb25Db2x1bW5zKSB7XG4gICAgICAgICAgY29uc3QgdmFsdWUgPSBPYmplY3QuZW50cmllcyhpdGVtKS5maW5kKChba2V5XSkgPT4ga2V5ID09PSBjb2x1bW4pPy5bMV07XG4gICAgICAgICAgaWYgKHZhbHVlICE9PSB1bmRlZmluZWQgJiYgdmFsdWUgIT09IG51bGwpIHtcbiAgICAgICAgICAgIE9iamVjdC5hc3NpZ24oaXRlbSwge1xuICAgICAgICAgICAgICBbY29sdW1uXTogc2VyaWFsaXplSnNvbkNvbHVtblZhbHVlKHRoaXMudGFibGVTcGVjLCBjb2x1bW4sIHZhbHVlKSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBmb3IgKGNvbnN0IGNvbHVtbiBvZiBqc29uQ29sdW1ucykge1xuICAgICAgICBjb25zdCB2YWx1ZSA9IE9iamVjdC5lbnRyaWVzKGRhdGEpLmZpbmQoKFtrZXldKSA9PiBrZXkgPT09IGNvbHVtbik/LlsxXTtcbiAgICAgICAgaWYgKHZhbHVlICE9PSB1bmRlZmluZWQgJiYgdmFsdWUgIT09IG51bGwpIHtcbiAgICAgICAgICBPYmplY3QuYXNzaWduKGRhdGEsIHtcbiAgICAgICAgICAgIFtjb2x1bW5dOiBzZXJpYWxpemVKc29uQ29sdW1uVmFsdWUodGhpcy50YWJsZVNwZWMsIGNvbHVtbiwgdmFsdWUpLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBkYXRhO1xuICB9XG5cbiAgLy8gSW5jcmVtZW50XG4gIGluY3JlbWVudDxUQ29sdW1uIGV4dGVuZHMgTnVtZXJpY0NvbHVtbnM8VFRhYmxlcz4+KFxuICAgIGNvbHVtbjogVENvbHVtbixcbiAgICB2YWx1ZTogbnVtYmVyLFxuICApOiBSZXNvbHZlZFB1cmk8bnVtYmVyLCBTaW5nbGVUYWJsZVZhbHVlPFRUYWJsZXM+PiB7XG4gICAgaWYgKHZhbHVlIDw9IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIkluY3JlbWVudCB2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAwXCIpO1xuICAgIH1cbiAgICB0aGlzLmtuZXhRdWVyeS5pbmNyZW1lbnQoY29sdW1uLCB2YWx1ZSk7XG4gICAgcmV0dXJuIG5ldyBSZXNvbHZlZFB1cmkodGhpcy5rbmV4UXVlcnksIHRoaXMua25leCwgdGhpcy50YWJsZVNwZWMpO1xuICB9XG4gIC8vIERlY3JlbWVudFxuICBkZWNyZW1lbnQ8VENvbHVtbiBleHRlbmRzIE51bWVyaWNDb2x1bW5zPFRUYWJsZXM+PihcbiAgICBjb2x1bW46IFRDb2x1bW4sXG4gICAgdmFsdWU6IG51bWJlcixcbiAgKTogUmVzb2x2ZWRQdXJpPG51bWJlciwgU2luZ2xlVGFibGVWYWx1ZTxUVGFibGVzPj4ge1xuICAgIGlmICh2YWx1ZSA8PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJEZWNyZW1lbnQgdmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gMFwiKTtcbiAgICB9XG4gICAgdGhpcy5rbmV4UXVlcnkuZGVjcmVtZW50KGNvbHVtbiwgdmFsdWUpO1xuICAgIHJldHVybiBuZXcgUmVzb2x2ZWRQdXJpKHRoaXMua25leFF1ZXJ5LCB0aGlzLmtuZXgsIHRoaXMudGFibGVTcGVjKTtcbiAgfVxuXG4gIC8vIERFTEVURVxuICBkZWxldGUoKTogUmVzb2x2ZWRQdXJpPG51bWJlciwgU2luZ2xlVGFibGVWYWx1ZTxUVGFibGVzPj4ge1xuICAgIHRoaXMua25leFF1ZXJ5LmRlbGV0ZSgpO1xuICAgIHJldHVybiBuZXcgUmVzb2x2ZWRQdXJpKHRoaXMua25leFF1ZXJ5LCB0aGlzLmtuZXgsIHRoaXMudGFibGVTcGVjKTtcbiAgfVxuXG4gIC8vIO2ZleyduCDsv7zrpqwg66as7YS0XG4gIHRvUXVlcnkoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5rbmV4UXVlcnkudG9RdWVyeSgpO1xuICB9XG5cbiAgLy8g7L+866asIOuUlOuyhOq5hSDroZzqt7gg7Lac66ClXG4gIGRlYnVnKCk6IHRoaXMge1xuICAgIGNvbnNvbGUubG9nKGAke2NoYWxrLmN5YW4oXCJbUHVyaSBEZWJ1Z11cIil9ICR7Y2hhbGsueWVsbG93KHRoaXMudG9RdWVyeSgpKX1gKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIGNsb25lKCk6IFB1cmk8VFNjaGVtYSwgVFRhYmxlcywgVFJlc3VsdD4ge1xuICAgIC8vICdkdWFsJ+ydgCDrjZTrr7gg7YWM7J2067iU7J2066mwLCDrsJTroZwg7JWE656YIOykhOyXkOyEnCBrbmV4UXVlcnnqsIAg642u7Ja07JSM7JuM7KeR64uI64ukLlxuICAgIGNvbnN0IG5ld1B1cmkgPSBuZXcgUHVyaTxUU2NoZW1hLCBUVGFibGVzLCBUUmVzdWx0Pih0aGlzLmtuZXgsIFwiZHVhbFwiKTtcbiAgICBuZXdQdXJpLmtuZXhRdWVyeSA9IHRoaXMua25leFF1ZXJ5LmNsb25lKCk7XG4gICAgbmV3UHVyaS50YWJsZVNwZWMgPSB0aGlzLnRhYmxlU3BlYztcbiAgICBuZXdQdXJpLmNvcnJlbGF0aW9uUmVnaXN0cnkgPSBuZXcgTWFwKHRoaXMuY29ycmVsYXRpb25SZWdpc3RyeSk7XG4gICAgcmV0dXJuIG5ld1B1cmk7XG4gIH1cblxuICBmb3JtYXRTUUwodW5mb3JtYXR0ZWQ6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgLy8gU1FMIOyYiOyVveyWtCDrqqnroZ1cbiAgICBjb25zdCBrZXl3b3JkcyA9IFtcbiAgICAgIFwiU0VMRUNUXCIsXG4gICAgICBcIkZST01cIixcbiAgICAgIFwiV0hFUkVcIixcbiAgICAgIFwiSU5TRVJUXCIsXG4gICAgICBcIklOVE9cIixcbiAgICAgIFwiVkFMVUVTXCIsXG4gICAgICBcIlVQREFURVwiLFxuICAgICAgXCJERUxFVEVcIixcbiAgICAgIFwiQ1JFQVRFXCIsXG4gICAgICBcIlRBQkxFXCIsXG4gICAgICBcIkFMVEVSXCIsXG4gICAgICBcIkRST1BcIixcbiAgICAgIFwiSk9JTlwiLFxuICAgICAgXCJPTlwiLFxuICAgICAgXCJJTk5FUlwiLFxuICAgICAgXCJMRUZUXCIsXG4gICAgICBcIlJJR0hUXCIsXG4gICAgICBcIkZVTExcIixcbiAgICAgIFwiT1VURVJcIixcbiAgICAgIFwiR1JPVVBcIixcbiAgICAgIFwiQllcIixcbiAgICAgIFwiT1JERVJcIixcbiAgICAgIFwiSEFWSU5HXCIsXG4gICAgICBcIkRJU1RJTkNUXCIsXG4gICAgICBcIkxJTUlUXCIsXG4gICAgICBcIk9GRlNFVFwiLFxuICAgICAgXCJBU1wiLFxuICAgICAgXCJBTkRcIixcbiAgICAgIFwiT1JcIixcbiAgICAgIFwiTk9UXCIsXG4gICAgICBcIklOXCIsXG4gICAgICBcIkxJS0VcIixcbiAgICAgIFwiSVNcIixcbiAgICAgIFwiTlVMTFwiLFxuICAgICAgXCJDQVNFXCIsXG4gICAgICBcIldIRU5cIixcbiAgICAgIFwiVEhFTlwiLFxuICAgICAgXCJFTFNFXCIsXG4gICAgICBcIkVORFwiLFxuICAgICAgXCJVTklPTlwiLFxuICAgICAgXCJBTExcIixcbiAgICAgIFwiRVhJU1RTXCIsXG4gICAgICBcIkJFVFdFRU5cIixcbiAgICBdO1xuXG4gICAgbGV0IGZvcm1hdHRlZCA9IHVuZm9ybWF0dGVkO1xuXG4gICAgLy8g7JiI7JW97Ja066W8IOuMgOusuOyekOuhnCDrs4DtmZhcbiAgICBrZXl3b3Jkcy5mb3JFYWNoKChrZXl3b3JkKSA9PiB7XG4gICAgICBjb25zdCByZWdleCA9IG5ldyBSZWdFeHAoYFxcXFxiJHtrZXl3b3JkfVxcXFxiYCwgXCJnaVwiKTtcbiAgICAgIGZvcm1hdHRlZCA9IGZvcm1hdHRlZC5yZXBsYWNlKHJlZ2V4LCBrZXl3b3JkLnRvVXBwZXJDYXNlKCkpO1xuICAgIH0pO1xuXG4gICAgLy8g7KO87JqUIOygiCDslZ7sl5Ag7KSE67CU6r+IIOy2lOqwgFxuICAgIGNvbnN0IG1ham9yQ2xhdXNlcyA9IFtcbiAgICAgIFwiU0VMRUNUXCIsXG4gICAgICBcIkZST01cIixcbiAgICAgIFwiV0hFUkVcIixcbiAgICAgIFwiR1JPVVAgQllcIixcbiAgICAgIFwiT1JERVIgQllcIixcbiAgICAgIFwiSEFWSU5HXCIsXG4gICAgICBcIkxJTUlUXCIsXG4gICAgICBcIlVOSU9OXCIsXG4gICAgXTtcbiAgICBtYWpvckNsYXVzZXMuZm9yRWFjaCgoY2xhdXNlKSA9PiB7XG4gICAgICBjb25zdCByZWdleCA9IG5ldyBSZWdFeHAoYFxcXFxzKygke2NsYXVzZX0pXFxcXHMrYCwgXCJnaVwiKTtcbiAgICAgIGZvcm1hdHRlZCA9IGZvcm1hdHRlZC5yZXBsYWNlKHJlZ2V4LCBgXFxuJHtjbGF1c2UudG9VcHBlckNhc2UoKX0gYCk7XG4gICAgfSk7XG5cbiAgICAvLyBKT0lOIOygiCDsspjrpqxcbiAgICBmb3JtYXR0ZWQgPSBmb3JtYXR0ZWQucmVwbGFjZSgvXFxzKygoPzpJTk5FUnxMRUZUfFJJR0hUfEZVTEwgT1VURVIpXFxzKyk/Sk9JTlxccysvZ2ksIFwiXFxuJDFKT0lOIFwiKTtcblxuICAgIC8vIEFORCwgT1Ig7KGw6rG0IOyymOumrFxuICAgIGZvcm1hdHRlZCA9IGZvcm1hdHRlZC5yZXBsYWNlKC9cXHMrKEFORHxPUilcXHMrL2dpLCBcIlxcbiAgJDEgXCIpO1xuXG4gICAgLy8g6rSE7Zi4IOyymOumrCDrsI8g65Ok7Jes7JOw6riwXG4gICAgY29uc3QgbGluZXMgPSBmb3JtYXR0ZWQuc3BsaXQoXCJcXG5cIik7XG4gICAgY29uc3QgaW5kZW50ZWRMaW5lcyA9IFtdO1xuICAgIGxldCBpbmRlbnRMZXZlbCA9IDA7XG5cbiAgICBmb3IgKGNvbnN0IGxpbmUgb2YgbGluZXMpIHtcbiAgICAgIGNvbnN0IHRyaW1tZWRMaW5lID0gbGluZS50cmltKCk7XG4gICAgICBpZiAoIXRyaW1tZWRMaW5lKSBjb250aW51ZTtcblxuICAgICAgLy8g64ur64qUIOq0hO2YuOqwgCDsnojsnLzrqbQg65Ok7Jes7JOw6riwIOugiOuyqCDqsJDshoxcbiAgICAgIGNvbnN0IGNsb3NpbmdQYXJlbnMgPSAodHJpbW1lZExpbmUubWF0Y2goL1xcKS9nKSB8fCBbXSkubGVuZ3RoO1xuICAgICAgY29uc3Qgb3BlbmluZ1BhcmVucyA9ICh0cmltbWVkTGluZS5tYXRjaCgvXFwoL2cpIHx8IFtdKS5sZW5ndGg7XG5cbiAgICAgIGlmIChjbG9zaW5nUGFyZW5zID4gMCAmJiBvcGVuaW5nUGFyZW5zID09PSAwKSB7XG4gICAgICAgIGluZGVudExldmVsID0gTWF0aC5tYXgoMCwgaW5kZW50TGV2ZWwgLSBjbG9zaW5nUGFyZW5zKTtcbiAgICAgIH1cblxuICAgICAgLy8g7ZiE7J6sIOuTpOyXrOyTsOq4sCDsoIHsmqlcbiAgICAgIGNvbnN0IGluZGVudCA9IFwiICBcIi5yZXBlYXQoaW5kZW50TGV2ZWwpO1xuICAgICAgaW5kZW50ZWRMaW5lcy5wdXNoKGluZGVudCArIHRyaW1tZWRMaW5lKTtcblxuICAgICAgLy8g7Jes64qUIOq0hO2YuOqwgCDsnojsnLzrqbQg65Ok7Jes7JOw6riwIOugiOuyqCDspp3qsIBcbiAgICAgIGlmIChvcGVuaW5nUGFyZW5zID4gY2xvc2luZ1BhcmVucykge1xuICAgICAgICBpbmRlbnRMZXZlbCArPSBvcGVuaW5nUGFyZW5zIC0gY2xvc2luZ1BhcmVucztcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gaW5kZW50ZWRMaW5lcy5qb2luKFwiXFxuXCIpLnRyaW0oKTtcbiAgfVxuXG4gIHJhdyhzcWw6IHN0cmluZyk6IEtuZXguUmF3IHtcbiAgICByZXR1cm4gdGhpcy5rbmV4LnJhdyhzcWwpO1xuICB9XG5cbiAgLy8gS25leCDsv7zrpqwg67mM642UIOyngeygkSDsoJHqt7xcbiAgcmF3UXVlcnkoKTogS25leC5RdWVyeUJ1aWxkZXIge1xuICAgIHJldHVybiB0aGlzLmtuZXhRdWVyeTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgV2hlcmVHcm91cDxUVGFibGVzIGV4dGVuZHMgb2JqZWN0PiB7XG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgYnVpbGRlcjogS25leC5RdWVyeUJ1aWxkZXIpIHt9XG5cbiAgLy8gd2hlcmUg66mU7ISc65Oc65OkXG4gIHdoZXJlKGNvbmRpdGlvbnM6IFdoZXJlQ29uZGl0aW9uPFRUYWJsZXM+KTogdGhpcztcbiAgd2hlcmU8VENvbHVtbiBleHRlbmRzIEF2YWlsYWJsZUNvbHVtbnM8VFRhYmxlcz4+KFxuICAgIGNvbHVtbjogVENvbHVtbixcbiAgICB2YWx1ZTogRXh0cmFjdENvbHVtblR5cGU8VFRhYmxlcywgVENvbHVtbiAmIHN0cmluZz4sXG4gICk6IHRoaXM7XG4gIHdoZXJlPFRDb2x1bW4gZXh0ZW5kcyBBdmFpbGFibGVDb2x1bW5zPFRUYWJsZXM+PihcbiAgICBjb2x1bW46IFRDb2x1bW4sXG4gICAgb3BlcmF0b3I6IFdoZXJlT3BlcmF0b3IsXG4gICAgdmFsdWU6IEV4dHJhY3RDb2x1bW5UeXBlPFRUYWJsZXMsIFRDb2x1bW4gJiBzdHJpbmc+LFxuICApOiB0aGlzO1xuICB3aGVyZSguLi5hcmdzOiBhbnlbXSk6IFdoZXJlR3JvdXA8VFRhYmxlcz4ge1xuICAgIHRoaXMuYnVpbGRlci53aGVyZShhcmdzWzBdLCAuLi5hcmdzLnNsaWNlKDEpKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8vIHdoZXJlSW4gLyB3aGVyZU5vdEluIOuplOyEnOuTnOuTpFxuICB3aGVyZUluPFRDb2x1bW4gZXh0ZW5kcyBBdmFpbGFibGVDb2x1bW5zPFRUYWJsZXM+PihcbiAgICBjb2x1bW46IFRDb2x1bW4sXG4gICAgdmFsdWVzOiAoRXh0cmFjdENvbHVtblR5cGU8VFRhYmxlcywgVENvbHVtbiAmIHN0cmluZz4gJiBLbmV4LlZhbHVlKVtdLFxuICApOiB0aGlzO1xuICB3aGVyZUluKC4uLmFyZ3M6IGFueVtdKTogV2hlcmVHcm91cDxUVGFibGVzPiB7XG4gICAgdGhpcy5idWlsZGVyLndoZXJlSW4oYXJnc1swXSwgYXJnc1sxXSk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICB3aGVyZU5vdEluPFRDb2x1bW4gZXh0ZW5kcyBBdmFpbGFibGVDb2x1bW5zPFRUYWJsZXM+PihcbiAgICBjb2x1bW46IFRDb2x1bW4sXG4gICAgdmFsdWVzOiAoRXh0cmFjdENvbHVtblR5cGU8VFRhYmxlcywgVENvbHVtbiAmIHN0cmluZz4gJiBLbmV4LlZhbHVlKVtdLFxuICApOiB0aGlzO1xuICB3aGVyZU5vdEluKC4uLmFyZ3M6IGFueVtdKTogV2hlcmVHcm91cDxUVGFibGVzPiB7XG4gICAgdGhpcy5idWlsZGVyLndoZXJlTm90SW4oYXJnc1swXSwgYXJnc1sxXSk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvLyBvcldoZXJlIOuplOyEnOuTnOuTpFxuICBvcldoZXJlKGNvbmRpdGlvbnM6IFdoZXJlQ29uZGl0aW9uPFRUYWJsZXM+KTogdGhpcztcbiAgb3JXaGVyZTxUQ29sdW1uIGV4dGVuZHMgQXZhaWxhYmxlQ29sdW1uczxUVGFibGVzPj4oXG4gICAgY29sdW1uOiBUQ29sdW1uLFxuICAgIHZhbHVlOiBFeHRyYWN0Q29sdW1uVHlwZTxUVGFibGVzLCBUQ29sdW1uICYgc3RyaW5nPixcbiAgKTogdGhpcztcbiAgb3JXaGVyZTxUQ29sdW1uIGV4dGVuZHMgQXZhaWxhYmxlQ29sdW1uczxUVGFibGVzPj4oXG4gICAgY29sdW1uOiBUQ29sdW1uLFxuICAgIG9wZXJhdG9yOiBXaGVyZU9wZXJhdG9yLFxuICAgIHZhbHVlOiBFeHRyYWN0Q29sdW1uVHlwZTxUVGFibGVzLCBUQ29sdW1uICYgc3RyaW5nPixcbiAgKTogdGhpcztcbiAgb3JXaGVyZSguLi5hcmdzOiBhbnlbXSk6IFdoZXJlR3JvdXA8VFRhYmxlcz4ge1xuICAgIHRoaXMuYnVpbGRlci5vcldoZXJlKGFyZ3NbMF0sIC4uLmFyZ3Muc2xpY2UoMSkpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLy8gb3JXaGVyZUluIC8gb3JXaGVyZU5vdEluIOuplOyEnOuTnOuTpFxuICBvcldoZXJlSW48VENvbHVtbiBleHRlbmRzIEF2YWlsYWJsZUNvbHVtbnM8VFRhYmxlcz4+KFxuICAgIGNvbHVtbjogVENvbHVtbixcbiAgICB2YWx1ZXM6IChFeHRyYWN0Q29sdW1uVHlwZTxUVGFibGVzLCBUQ29sdW1uICYgc3RyaW5nPiAmIEtuZXguVmFsdWUpW10sXG4gICk6IHRoaXM7XG4gIG9yV2hlcmVJbiguLi5hcmdzOiBhbnlbXSk6IFdoZXJlR3JvdXA8VFRhYmxlcz4ge1xuICAgIHRoaXMuYnVpbGRlci5vcldoZXJlSW4oYXJnc1swXSwgYXJnc1sxXSk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBvcldoZXJlTm90SW48VENvbHVtbiBleHRlbmRzIEF2YWlsYWJsZUNvbHVtbnM8VFRhYmxlcz4+KFxuICAgIGNvbHVtbjogVENvbHVtbixcbiAgICB2YWx1ZXM6IChFeHRyYWN0Q29sdW1uVHlwZTxUVGFibGVzLCBUQ29sdW1uICYgc3RyaW5nPiAmIEtuZXguVmFsdWUpW10sXG4gICk6IHRoaXM7XG4gIG9yV2hlcmVOb3RJbiguLi5hcmdzOiBhbnlbXSk6IFdoZXJlR3JvdXA8VFRhYmxlcz4ge1xuICAgIHRoaXMuYnVpbGRlci5vcldoZXJlTm90SW4oYXJnc1swXSwgYXJnc1sxXSk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvLyBXSEVSRSBKU09OQiBTVVBFUlNFVCAoQD4pXG4gIHdoZXJlSnNvblN1cGVyc2V0T2Y8VENvbHVtbiBleHRlbmRzIEpzb25Db2x1bW5zPFRUYWJsZXM+PihcbiAgICBjb2x1bW46IFRDb2x1bW4sXG4gICAgdmFsdWU6IEpzb25TdXBlcnNldFZhbHVlPEV4dHJhY3RDb2x1bW5UeXBlPFRUYWJsZXMsIFRDb2x1bW4+PixcbiAgKTogdGhpcyB7XG4gICAgdGhpcy5idWlsZGVyLndoZXJlSnNvblN1cGVyc2V0T2YoY29sdW1uLCBzZXJpYWxpemVKc29uU3VwZXJzZXRWYWx1ZSh2YWx1ZSkpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgb3JXaGVyZUpzb25TdXBlcnNldE9mPFRDb2x1bW4gZXh0ZW5kcyBKc29uQ29sdW1uczxUVGFibGVzPj4oXG4gICAgY29sdW1uOiBUQ29sdW1uLFxuICAgIHZhbHVlOiBKc29uU3VwZXJzZXRWYWx1ZTxFeHRyYWN0Q29sdW1uVHlwZTxUVGFibGVzLCBUQ29sdW1uPj4sXG4gICk6IHRoaXMge1xuICAgIHRoaXMuYnVpbGRlci5vcldoZXJlSnNvblN1cGVyc2V0T2YoY29sdW1uLCBzZXJpYWxpemVKc29uU3VwZXJzZXRWYWx1ZSh2YWx1ZSkpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgd2hlcmVKc29uS2V5RXhpc3RzKGNvbHVtbjogSnNvbkNvbHVtbnM8VFRhYmxlcz4sIGtleTogc3RyaW5nKTogdGhpcyB7XG4gICAgdGhpcy5idWlsZGVyLndoZXJlUmF3KFwiPz8gXFxcXD8gP1wiLCBbY29sdW1uLCBrZXldKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIG9yV2hlcmVKc29uS2V5RXhpc3RzKGNvbHVtbjogSnNvbkNvbHVtbnM8VFRhYmxlcz4sIGtleTogc3RyaW5nKTogdGhpcyB7XG4gICAgdGhpcy5idWlsZGVyLm9yV2hlcmVSYXcoXCI/PyBcXFxcPyA/XCIsIFtjb2x1bW4sIGtleV0pO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLy8gV0hFUkUgTUFUQ0hcbiAgd2hlcmVNYXRjaDxUQ29sdW1uIGV4dGVuZHMgRnVsbHRleHRDb2x1bW5zPFRUYWJsZXM+Pihjb2x1bW46IFRDb2x1bW4sIHZhbHVlOiBzdHJpbmcpOiB0aGlzO1xuICB3aGVyZU1hdGNoKC4uLmFyZ3M6IGFueVtdKTogdGhpcyB7XG4gICAgdGhpcy5idWlsZGVyLndoZXJlUmF3KGBNQVRDSCAoJHtTdHJpbmcoYXJnc1swXSl9KSBBR0FJTlNUICg/KWAsIFthcmdzWzFdXSk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBvcldoZXJlTWF0Y2g8VENvbHVtbiBleHRlbmRzIEZ1bGx0ZXh0Q29sdW1uczxUVGFibGVzPj4oY29sdW1uOiBUQ29sdW1uLCB2YWx1ZTogc3RyaW5nKTogdGhpcztcbiAgb3JXaGVyZU1hdGNoKC4uLmFyZ3M6IGFueVtdKTogdGhpcyB7XG4gICAgdGhpcy5idWlsZGVyLm9yV2hlcmVSYXcoYE1BVENIICgke1N0cmluZyhhcmdzWzBdKX0pIEFHQUlOU1QgKD8pYCwgW2FyZ3NbMV1dKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8vIFdIRVJFIFNFQVJDSFxuICB3aGVyZVNlYXJjaDxUQ29sdW1uIGV4dGVuZHMgQXZhaWxhYmxlQ29sdW1uczxUVGFibGVzPj4oXG4gICAgY29sdW1uOiBUQ29sdW1uIHwgVENvbHVtbltdLFxuICAgIHZhbHVlOiBzdHJpbmcsXG4gICAgb3B0aW9ucz86IHtcbiAgICAgIHdlaWdodHM/OiBudW1iZXJbXTsgLy8g7KCV7IiYIOuwsOyXtFxuICAgIH0sXG4gICk6IHRoaXM7XG4gIHdoZXJlU2VhcmNoKC4uLmFyZ3M6IGFueVtdKTogdGhpcyB7XG4gICAgY29uc3QgeyB3ZWlnaHRzIH0gPSBhcmdzWzJdID8/IHt9O1xuICAgIGNvbnN0IGNvbHVtbkV4cHIgPSBBcnJheS5pc0FycmF5KGFyZ3NbMF0pXG4gICAgICA/IGBBUlJBWVske2FyZ3NbMF0ubWFwKChjKSA9PiBgJHtjfTo6dGV4dGApLmpvaW4oXCIsXCIpfV1gXG4gICAgICA6IGFyZ3NbMF07XG4gICAgY29uc3QgcGdyb29uZ2FDb25kaXRpb24gPSBgcGdyb29uZ2FfY29uZGl0aW9uKD8ke3dlaWdodHM/Lmxlbmd0aCA/IGAsIHdlaWdodHMgPT4gQVJSQVlbJHt3ZWlnaHRzLmpvaW4oXCIsXCIpfV1gIDogXCJcIn0pYDtcbiAgICB0aGlzLmJ1aWxkZXIud2hlcmVSYXcoYCR7Y29sdW1uRXhwcn0gJkB+ICR7cGdyb29uZ2FDb25kaXRpb259YCwgW2FyZ3NbMV1dKTtcblxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgb3JXaGVyZVNlYXJjaDxUQ29sdW1uIGV4dGVuZHMgQXZhaWxhYmxlQ29sdW1uczxUVGFibGVzPj4oXG4gICAgY29sdW1uOiBUQ29sdW1uIHwgVENvbHVtbltdLFxuICAgIHZhbHVlOiBzdHJpbmcsXG4gICAgb3B0aW9ucz86IHtcbiAgICAgIHdlaWdodHM/OiBudW1iZXJbXTsgLy8g7KCV7IiYIOuwsOyXtFxuICAgIH0sXG4gICk6IHRoaXM7XG4gIG9yV2hlcmVTZWFyY2goLi4uYXJnczogYW55W10pOiB0aGlzIHtcbiAgICBjb25zdCB7IHdlaWdodHMgfSA9IGFyZ3NbMl0gPz8ge307XG4gICAgY29uc3QgY29sdW1uRXhwciA9IEFycmF5LmlzQXJyYXkoYXJnc1swXSlcbiAgICAgID8gYEFSUkFZWyR7YXJnc1swXS5tYXAoKGMpID0+IGAke2N9Ojp0ZXh0YCkuam9pbihcIixcIil9XWBcbiAgICAgIDogYXJnc1swXTtcbiAgICBjb25zdCBwZ3Jvb25nYUNvbmRpdGlvbiA9IGBwZ3Jvb25nYV9jb25kaXRpb24oPyR7d2VpZ2h0cz8ubGVuZ3RoID8gYCwgd2VpZ2h0cyA9PiBBUlJBWVske3dlaWdodHMuam9pbihcIixcIil9XWAgOiBcIlwifSlgO1xuICAgIHRoaXMuYnVpbGRlci5vcldoZXJlUmF3KGAke2NvbHVtbkV4cHJ9ICZAfiAke3Bncm9vbmdhQ29uZGl0aW9ufWAsIFthcmdzWzFdXSk7XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8vIFdIRVJFIEZVTExURVhUXG4gIHdoZXJlVHNTZWFyY2g8VENvbHVtbiBleHRlbmRzIEF2YWlsYWJsZUNvbHVtbnM8VFRhYmxlcz4gfCBTdHJpbmdTcWxFeHByZXNzaW9uPihcbiAgICBjb2x1bW46IFRDb2x1bW4sXG4gICAgdmFsdWU6IHN0cmluZyxcbiAgICBvcHRpb25zPzogVHNRdWVyeU9wdGlvbnMgfCBUc1F1ZXJ5Q29uZmlnLFxuICApOiB0aGlzO1xuICB3aGVyZVRzU2VhcmNoKC4uLmFyZ3M6IGFueVtdKTogdGhpcyB7XG4gICAgY29uc3Qgb3B0cyA9XG4gICAgICAvLyBTQUZFVFk6IOy/vOumrCDruYzrjZTsnZgg7KCc64Sk66atIOqzhOyVveqzvCDshKDtlokg6rKA7Kad7J20IOydtCDtg4DsnoXsnYQg67O07J6l7ZWp64uI64ukLlxuICAgICAgaXNTdHJpbmdWYWx1ZShhcmdzWzJdKSA/ICh7IGNvbmZpZzogYXJnc1syXSB9IGFzIFRzUXVlcnlPcHRpb25zKSA6IChhcmdzWzJdID8/IHt9KTtcblxuICAgIGNvbnN0IHBhcnNlciA9IG9wdHMucGFyc2VyID8/IFwid2Vic2VhcmNoX3RvX3RzcXVlcnlcIjtcbiAgICBjb25zdCBjb25maWcgPSBvcHRzLmNvbmZpZyA/PyBcInNpbXBsZVwiO1xuICAgIGNvbnN0IGNvbHVtbkV4cHIgPSBpc1NxbEV4cHJlc3Npb24oYXJnc1swXSkgPyBhcmdzWzBdW1wiX3NxbFwiXSA6IFN0cmluZyhhcmdzWzBdKTtcbiAgICBjb25zdCBwYXJhbXMgPSBpc1NxbEV4cHJlc3Npb24oYXJnc1swXSlcbiAgICAgID8gWy4uLmFyZ3NbMF1bXCJfcGFyYW1zXCJdLCBjb25maWcsIGFyZ3NbMV1dXG4gICAgICA6IFtjb25maWcsIGFyZ3NbMV1dO1xuXG4gICAgdGhpcy5idWlsZGVyLndoZXJlUmF3KGAke2NvbHVtbkV4cHJ9IEBAICR7cGFyc2VyfSg/LCA/KWAsIHBhcmFtcyk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBvcldoZXJlVHNTZWFyY2g8VENvbHVtbiBleHRlbmRzIEF2YWlsYWJsZUNvbHVtbnM8VFRhYmxlcz4gfCBTdHJpbmdTcWxFeHByZXNzaW9uPihcbiAgICBjb2x1bW46IFRDb2x1bW4sXG4gICAgdmFsdWU6IHN0cmluZyxcbiAgICBvcHRpb25zPzogVHNRdWVyeU9wdGlvbnMgfCBUc1F1ZXJ5Q29uZmlnLFxuICApOiB0aGlzO1xuICBvcldoZXJlVHNTZWFyY2goLi4uYXJnczogYW55W10pOiB0aGlzIHtcbiAgICBjb25zdCBvcHRzID1cbiAgICAgIC8vIFNBRkVUWTog7L+866asIOu5jOuNlOydmCDsoJzrhKTrpq0g6rOE7JW96rO8IOyEoO2WiSDqsoDspp3snbQg7J20IO2DgOyeheydhCDrs7TsnqXtlanri4jri6QuXG4gICAgICBpc1N0cmluZ1ZhbHVlKGFyZ3NbMl0pID8gKHsgY29uZmlnOiBhcmdzWzJdIH0gYXMgVHNRdWVyeU9wdGlvbnMpIDogKGFyZ3NbMl0gPz8ge30pO1xuXG4gICAgY29uc3QgcGFyc2VyID0gb3B0cy5wYXJzZXIgPz8gXCJ3ZWJzZWFyY2hfdG9fdHNxdWVyeVwiO1xuICAgIGNvbnN0IGNvbmZpZyA9IG9wdHMuY29uZmlnID8/IFwic2ltcGxlXCI7XG4gICAgY29uc3QgY29sdW1uRXhwciA9IGlzU3FsRXhwcmVzc2lvbihhcmdzWzBdKSA/IGFyZ3NbMF1bXCJfc3FsXCJdIDogU3RyaW5nKGFyZ3NbMF0pO1xuICAgIGNvbnN0IHBhcmFtcyA9IGlzU3FsRXhwcmVzc2lvbihhcmdzWzBdKVxuICAgICAgPyBbLi4uYXJnc1swXVtcIl9wYXJhbXNcIl0sIGNvbmZpZywgYXJnc1sxXV1cbiAgICAgIDogW2NvbmZpZywgYXJnc1sxXV07XG5cbiAgICB0aGlzLmJ1aWxkZXIub3JXaGVyZVJhdyhgJHtjb2x1bW5FeHByfSBAQCAke3BhcnNlcn0oPywgPylgLCBwYXJhbXMpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgd2hlcmVGdXp6eTxUQ29sdW1uIGV4dGVuZHMgQXZhaWxhYmxlQ29sdW1uczxUVGFibGVzPiB8IFN0cmluZ1NxbEV4cHJlc3Npb24+KFxuICAgIGNvbHVtbjogVENvbHVtbixcbiAgICB2YWx1ZTogc3RyaW5nLFxuICAgIG9wdGlvbnM/OiB7XG4gICAgICBvcGVyYXRvcj86IEZ1enp5T3BlcmF0b3I7XG4gICAgfSxcbiAgKTogdGhpcztcbiAgd2hlcmVGdXp6eSguLi5hcmdzOiBhbnlbXSk6IHRoaXMge1xuICAgIGNvbnN0IG9wZXJhdG9yID0gcGFyc2VGdXp6eU9wZXJhdG9yKGFyZ3NbMl0/Lm9wZXJhdG9yKTtcblxuICAgIGlmIChvcGVyYXRvciA9PT0gXCIlXCIpIHtcbiAgICAgIGlmIChpc1NxbEV4cHJlc3Npb24oYXJnc1swXSkpIHtcbiAgICAgICAgdGhpcy5idWlsZGVyLndoZXJlUmF3KGAke2FyZ3NbMF1bXCJfc3FsXCJdfSAke29wZXJhdG9yfSA/YCwgWy4uLmFyZ3NbMF1bXCJfcGFyYW1zXCJdLCBhcmdzWzFdXSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmJ1aWxkZXIud2hlcmVSYXcoYD8/ICR7b3BlcmF0b3J9ID9gLCBbYXJnc1swXSwgYXJnc1sxXV0pO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgaWYgKGlzU3FsRXhwcmVzc2lvbihhcmdzWzBdKSkge1xuICAgICAgdGhpcy5idWlsZGVyLndoZXJlUmF3KGA/ICR7b3BlcmF0b3J9ICR7YXJnc1swXVtcIl9zcWxcIl19YCwgW2FyZ3NbMV0sIC4uLmFyZ3NbMF1bXCJfcGFyYW1zXCJdXSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuYnVpbGRlci53aGVyZVJhdyhgPyAke29wZXJhdG9yfSA/P2AsIFthcmdzWzFdLCBhcmdzWzBdXSk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgb3JXaGVyZUZ1enp5PFRDb2x1bW4gZXh0ZW5kcyBBdmFpbGFibGVDb2x1bW5zPFRUYWJsZXM+IHwgU3RyaW5nU3FsRXhwcmVzc2lvbj4oXG4gICAgY29sdW1uOiBUQ29sdW1uLFxuICAgIHZhbHVlOiBzdHJpbmcsXG4gICAgb3B0aW9ucz86IHtcbiAgICAgIG9wZXJhdG9yPzogRnV6enlPcGVyYXRvcjtcbiAgICB9LFxuICApOiB0aGlzO1xuICBvcldoZXJlRnV6enkoLi4uYXJnczogYW55W10pOiB0aGlzIHtcbiAgICBjb25zdCBvcGVyYXRvciA9IHBhcnNlRnV6enlPcGVyYXRvcihhcmdzWzJdPy5vcGVyYXRvcik7XG5cbiAgICBpZiAob3BlcmF0b3IgPT09IFwiJVwiKSB7XG4gICAgICBpZiAoaXNTcWxFeHByZXNzaW9uKGFyZ3NbMF0pKSB7XG4gICAgICAgIHRoaXMuYnVpbGRlci5vcldoZXJlUmF3KGAke2FyZ3NbMF1bXCJfc3FsXCJdfSAke29wZXJhdG9yfSA/YCwgW1xuICAgICAgICAgIC4uLmFyZ3NbMF1bXCJfcGFyYW1zXCJdLFxuICAgICAgICAgIGFyZ3NbMV0sXG4gICAgICAgIF0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5idWlsZGVyLm9yV2hlcmVSYXcoYD8/ICR7b3BlcmF0b3J9ID9gLCBbYXJnc1swXSwgYXJnc1sxXV0pO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgaWYgKGlzU3FsRXhwcmVzc2lvbihhcmdzWzBdKSkge1xuICAgICAgdGhpcy5idWlsZGVyLm9yV2hlcmVSYXcoYD8gJHtvcGVyYXRvcn0gJHthcmdzWzBdW1wiX3NxbFwiXX1gLCBbYXJnc1sxXSwgLi4uYXJnc1swXVtcIl9wYXJhbXNcIl1dKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5idWlsZGVyLm9yV2hlcmVSYXcoYD8gJHtvcGVyYXRvcn0gPz9gLCBbYXJnc1sxXSwgYXJnc1swXV0pO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8vIOykkeyyqSDqt7jro7lcbiAgd2hlcmVHcm91cChjYWxsYmFjazogKGc6IFdoZXJlR3JvdXA8VFRhYmxlcz4pID0+IHZvaWQpOiB0aGlzO1xuICB3aGVyZUdyb3VwKGNhbGxiYWNrOiAoZzogV2hlcmVHcm91cDxUVGFibGVzPikgPT4gdm9pZCk6IFdoZXJlR3JvdXA8VFRhYmxlcz4ge1xuICAgIHRoaXMuYnVpbGRlci53aGVyZSgoc3ViQnVpbGRlcikgPT4ge1xuICAgICAgY29uc3Qgc3ViR3JvdXAgPSBuZXcgV2hlcmVHcm91cDxUVGFibGVzPihzdWJCdWlsZGVyKTtcbiAgICAgIGNhbGxiYWNrKHN1Ykdyb3VwKTtcbiAgICB9KTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuICBvcldoZXJlR3JvdXAoY2FsbGJhY2s6IChnOiBXaGVyZUdyb3VwPFRUYWJsZXM+KSA9PiB2b2lkKTogdGhpcztcbiAgb3JXaGVyZUdyb3VwKGNhbGxiYWNrOiAoZzogV2hlcmVHcm91cDxUVGFibGVzPikgPT4gdm9pZCk6IFdoZXJlR3JvdXA8VFRhYmxlcz4ge1xuICAgIHRoaXMuYnVpbGRlci5vcldoZXJlKChzdWJCdWlsZGVyKSA9PiB7XG4gICAgICBjb25zdCBzdWJHcm91cCA9IG5ldyBXaGVyZUdyb3VwPFRUYWJsZXM+KHN1YkJ1aWxkZXIpO1xuICAgICAgY2FsbGJhY2soc3ViR3JvdXApO1xuICAgIH0pO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG59XG5cbi8vIEpPSU4g7KCIIOq3uOujueyXkOuKlCBMZWZ07JmAIFJpZ2h07JeQIOuMgO2VnCDsiJzshJzqsIAg7ZWE7JqU7ZWY7KeAIOyViuycvOuvgOuhnCwg66qo65OgIOqyveyasOydmCDsiJjrpbwg6rOE7IKw7ZW07JW87ZWoLlxuZXhwb3J0IGNsYXNzIEpvaW5DbGF1c2VHcm91cDxUTGVmdCBleHRlbmRzIG9iamVjdCwgVFJpZ2h0IGV4dGVuZHMgb2JqZWN0PiB7XG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgY2FsbGJhY2s6IEtuZXguSm9pbkNsYXVzZSkge31cblxuICAvLyBPTihBTkQpOiDsu6zrn7wgPSDsu6zrn7xcbiAgb24obGVmdDogQXZhaWxhYmxlQ29sdW1uczxUTGVmdD4sIHJpZ2h0OiBBdmFpbGFibGVDb2x1bW5zPFRSaWdodD4pOiB0aGlzO1xuICBvbihsZWZ0OiBBdmFpbGFibGVDb2x1bW5zPFRSaWdodD4sIHJpZ2h0OiBBdmFpbGFibGVDb2x1bW5zPFRMZWZ0Pik6IHRoaXM7XG4gIC8vIE9OKEFORCk6IOy7rOufvCA9IOqwklxuICBvbihcbiAgICBsZWZ0OiBBdmFpbGFibGVDb2x1bW5zPFRMZWZ0PixcbiAgICByaWdodDogRXh0cmFjdENvbHVtblR5cGU8VExlZnQsIEF2YWlsYWJsZUNvbHVtbnM8VExlZnQ+ICYgc3RyaW5nPixcbiAgKTogdGhpcztcbiAgb24oXG4gICAgbGVmdDogQXZhaWxhYmxlQ29sdW1uczxUUmlnaHQ+LFxuICAgIHJpZ2h0OiBFeHRyYWN0Q29sdW1uVHlwZTxUUmlnaHQsIEF2YWlsYWJsZUNvbHVtbnM8VFJpZ2h0PiAmIHN0cmluZz4sXG4gICk6IHRoaXM7XG4gIC8vIE9OKEFORCk6IOy7rOufvCAo7Jew7IKw7J6QKSDsu6zrn7xcbiAgb24oXG4gICAgbGVmdDogQXZhaWxhYmxlQ29sdW1uczxUTGVmdD4sXG4gICAgb3BlcmF0b3I6IENvbXBhcmlzb25PcGVyYXRvcixcbiAgICByaWdodDogQXZhaWxhYmxlQ29sdW1uczxUUmlnaHQ+LFxuICApOiB0aGlzO1xuICBvbihcbiAgICBsZWZ0OiBBdmFpbGFibGVDb2x1bW5zPFRSaWdodD4sXG4gICAgb3BlcmF0b3I6IENvbXBhcmlzb25PcGVyYXRvcixcbiAgICByaWdodDogQXZhaWxhYmxlQ29sdW1uczxUTGVmdD4sXG4gICk6IHRoaXM7XG4gIC8vIE9OKEFORCk6IOy7rOufvCAo7Jew7IKw7J6QKSDqsJJcbiAgb24oXG4gICAgbGVmdDogQXZhaWxhYmxlQ29sdW1uczxUTGVmdD4sXG4gICAgb3BlcmF0b3I6IENvbXBhcmlzb25PcGVyYXRvcixcbiAgICByaWdodDogRXh0cmFjdENvbHVtblR5cGU8VExlZnQsIEF2YWlsYWJsZUNvbHVtbnM8VExlZnQ+ICYgc3RyaW5nPixcbiAgKTogdGhpcztcbiAgb24oXG4gICAgbGVmdDogQXZhaWxhYmxlQ29sdW1uczxUUmlnaHQ+LFxuICAgIG9wZXJhdG9yOiBDb21wYXJpc29uT3BlcmF0b3IsXG4gICAgcmlnaHQ6IEV4dHJhY3RDb2x1bW5UeXBlPFRSaWdodCwgQXZhaWxhYmxlQ29sdW1uczxUUmlnaHQ+ICYgc3RyaW5nPixcbiAgKTogdGhpcztcbiAgLy8gT04oQU5EKTog7L2c67CxXG4gIG9uKGNhbGxiYWNrOiAobmVzdGVkOiBKb2luQ2xhdXNlR3JvdXA8VExlZnQsIFRSaWdodD4pID0+IHZvaWQpOiB0aGlzO1xuICBvbihjYWxsYmFjazogKG5lc3RlZDogSm9pbkNsYXVzZUdyb3VwPFRSaWdodCwgVExlZnQ+KSA9PiB2b2lkKTogdGhpcztcbiAgLy8gT04oQU5EKSDqtaztmIRcbiAgb24oLi4uYXJnczogYW55W10pOiB0aGlzIHtcbiAgICAvLyBTQUZFVFk6IOy/vOumrCDruYzrjZTsnZgg7KCc64Sk66atIOqzhOyVveqzvCDshKDtlokg6rKA7Kad7J20IOydtCDtg4DsnoXsnYQg67O07J6l7ZWp64uI64ukLlxuICAgIHRoaXMuY2FsbGJhY2sub24oLi4uKGFyZ3MgYXMgW3N0cmluZywgc3RyaW5nXSkpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLy8gT04oT1IpOiDsu6zrn7wgPSDsu6zrn7xcbiAgb3JPbihsZWZ0OiBBdmFpbGFibGVDb2x1bW5zPFRMZWZ0PiwgcmlnaHQ6IEF2YWlsYWJsZUNvbHVtbnM8VFJpZ2h0Pik6IHRoaXM7XG4gIG9yT24obGVmdDogQXZhaWxhYmxlQ29sdW1uczxUUmlnaHQ+LCByaWdodDogQXZhaWxhYmxlQ29sdW1uczxUTGVmdD4pOiB0aGlzO1xuICAvLyBPTihPUik6IOy7rOufvCA9IOqwklxuICBvck9uKFxuICAgIGxlZnQ6IEF2YWlsYWJsZUNvbHVtbnM8VExlZnQ+LFxuICAgIHJpZ2h0OiBFeHRyYWN0Q29sdW1uVHlwZTxUTGVmdCwgQXZhaWxhYmxlQ29sdW1uczxUTGVmdD4gJiBzdHJpbmc+LFxuICApOiB0aGlzO1xuICBvck9uKFxuICAgIGxlZnQ6IEF2YWlsYWJsZUNvbHVtbnM8VFJpZ2h0PixcbiAgICByaWdodDogRXh0cmFjdENvbHVtblR5cGU8VFJpZ2h0LCBBdmFpbGFibGVDb2x1bW5zPFRSaWdodD4gJiBzdHJpbmc+LFxuICApOiB0aGlzO1xuICAvLyBPTihPUik6IOy7rOufvCAo7Jew7IKw7J6QKSDsu6zrn7xcbiAgb3JPbihcbiAgICBsZWZ0OiBBdmFpbGFibGVDb2x1bW5zPFRMZWZ0PixcbiAgICBvcGVyYXRvcjogQ29tcGFyaXNvbk9wZXJhdG9yLFxuICAgIHJpZ2h0OiBBdmFpbGFibGVDb2x1bW5zPFRSaWdodD4sXG4gICk6IHRoaXM7XG4gIG9yT24oXG4gICAgbGVmdDogQXZhaWxhYmxlQ29sdW1uczxUUmlnaHQ+LFxuICAgIG9wZXJhdG9yOiBDb21wYXJpc29uT3BlcmF0b3IsXG4gICAgcmlnaHQ6IEF2YWlsYWJsZUNvbHVtbnM8VExlZnQ+LFxuICApOiB0aGlzO1xuICAvLyBPTihPUik6IOy7rOufvCAo7Jew7IKw7J6QKSDqsJJcbiAgb3JPbihcbiAgICBsZWZ0OiBBdmFpbGFibGVDb2x1bW5zPFRMZWZ0PixcbiAgICBvcGVyYXRvcjogQ29tcGFyaXNvbk9wZXJhdG9yLFxuICAgIHJpZ2h0OiBFeHRyYWN0Q29sdW1uVHlwZTxUTGVmdCwgQXZhaWxhYmxlQ29sdW1uczxUTGVmdD4gJiBzdHJpbmc+LFxuICApOiB0aGlzO1xuICBvck9uKFxuICAgIGxlZnQ6IEF2YWlsYWJsZUNvbHVtbnM8VFJpZ2h0PixcbiAgICBvcGVyYXRvcjogQ29tcGFyaXNvbk9wZXJhdG9yLFxuICAgIHJpZ2h0OiBFeHRyYWN0Q29sdW1uVHlwZTxUUmlnaHQsIEF2YWlsYWJsZUNvbHVtbnM8VFJpZ2h0PiAmIHN0cmluZz4sXG4gICk6IHRoaXM7XG4gIC8vIE9OKE9SKTog7L2c67CxXG4gIG9yT24oY2FsbGJhY2s6IChuZXN0ZWQ6IEpvaW5DbGF1c2VHcm91cDxUTGVmdCwgVFJpZ2h0PikgPT4gdm9pZCk6IHRoaXM7XG4gIG9yT24oY2FsbGJhY2s6IChuZXN0ZWQ6IEpvaW5DbGF1c2VHcm91cDxUUmlnaHQsIFRMZWZ0PikgPT4gdm9pZCk6IHRoaXM7XG4gIC8vIE9OKE9SKSDqtaztmIRcbiAgb3JPbiguLi5hcmdzOiBhbnlbXSk6IHRoaXMge1xuICAgIC8vIFNBRkVUWTog7L+866asIOu5jOuNlOydmCDsoJzrhKTrpq0g6rOE7JW96rO8IOyEoO2WiSDqsoDspp3snbQg7J20IO2DgOyeheydhCDrs7TsnqXtlanri4jri6QuXG4gICAgdGhpcy5jYWxsYmFjay5vck9uKC4uLihhcmdzIGFzIFtzdHJpbmcsIHN0cmluZ10pKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8vIE9OIFZBTChBTkQpOiDsu6zrn7wgPSDqsJIgKOqwkuydhCDsu6zrn7wg7LC47KGw6rCAIOyVhOuLjCDtjIzrnbzrr7jthLDroZwg67CU7J2465SpKVxuICBvblZhbChjb2x1bW46IEF2YWlsYWJsZUNvbHVtbnM8VExlZnQ+LCB2YWx1ZTogYW55KTogdGhpcztcbiAgb25WYWwoY29sdW1uOiBBdmFpbGFibGVDb2x1bW5zPFRSaWdodD4sIHZhbHVlOiBhbnkpOiB0aGlzO1xuICBvblZhbChjb2x1bW46IEF2YWlsYWJsZUNvbHVtbnM8VExlZnQ+LCBvcGVyYXRvcjogQ29tcGFyaXNvbk9wZXJhdG9yLCB2YWx1ZTogYW55KTogdGhpcztcbiAgb25WYWwoY29sdW1uOiBBdmFpbGFibGVDb2x1bW5zPFRSaWdodD4sIG9wZXJhdG9yOiBDb21wYXJpc29uT3BlcmF0b3IsIHZhbHVlOiBhbnkpOiB0aGlzO1xuICBvblZhbCguLi5hcmdzOiBhbnlbXSk6IHRoaXMge1xuICAgIC8vIFNBRkVUWTog7L+866asIOu5jOuNlOydmCDsoJzrhKTrpq0g6rOE7JW96rO8IOyEoO2WiSDqsoDspp3snbQg7J20IO2DgOyeheydhCDrs7TsnqXtlanri4jri6QuXG4gICAgKHRoaXMuY2FsbGJhY2sgYXMgYW55KS5vblZhbCguLi5hcmdzKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8vIEFORCBPTiBWQUw6IG9uVmFs7J2YIOuqheyLnOyggSBhbGlhcyAoS25leCDtmLjtmZgpXG4gIGFuZE9uVmFsKGNvbHVtbjogQXZhaWxhYmxlQ29sdW1uczxUTGVmdD4sIHZhbHVlOiBhbnkpOiB0aGlzO1xuICBhbmRPblZhbChjb2x1bW46IEF2YWlsYWJsZUNvbHVtbnM8VFJpZ2h0PiwgdmFsdWU6IGFueSk6IHRoaXM7XG4gIGFuZE9uVmFsKGNvbHVtbjogQXZhaWxhYmxlQ29sdW1uczxUTGVmdD4sIG9wZXJhdG9yOiBDb21wYXJpc29uT3BlcmF0b3IsIHZhbHVlOiBhbnkpOiB0aGlzO1xuICBhbmRPblZhbChjb2x1bW46IEF2YWlsYWJsZUNvbHVtbnM8VFJpZ2h0Piwgb3BlcmF0b3I6IENvbXBhcmlzb25PcGVyYXRvciwgdmFsdWU6IGFueSk6IHRoaXM7XG4gIGFuZE9uVmFsKC4uLmFyZ3M6IGFueVtdKTogdGhpcyB7XG4gICAgLy8gU0FGRVRZOiDsv7zrpqwg67mM642U7J2YIOygnOuEpOumrSDqs4Tslb3qs7wg7ISg7ZaJIOqygOymneydtCDsnbQg7YOA7J6F7J2EIOuztOyepe2VqeuLiOuLpC5cbiAgICAodGhpcy5jYWxsYmFjayBhcyBhbnkpLmFuZE9uVmFsKC4uLmFyZ3MpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLy8gT1IgT04gVkFMOiBPUiDsobDqsbTsnLzroZwg6rCSIOuwlOyduOuUqVxuICBvck9uVmFsKGNvbHVtbjogQXZhaWxhYmxlQ29sdW1uczxUTGVmdD4sIHZhbHVlOiBhbnkpOiB0aGlzO1xuICBvck9uVmFsKGNvbHVtbjogQXZhaWxhYmxlQ29sdW1uczxUUmlnaHQ+LCB2YWx1ZTogYW55KTogdGhpcztcbiAgb3JPblZhbChjb2x1bW46IEF2YWlsYWJsZUNvbHVtbnM8VExlZnQ+LCBvcGVyYXRvcjogQ29tcGFyaXNvbk9wZXJhdG9yLCB2YWx1ZTogYW55KTogdGhpcztcbiAgb3JPblZhbChjb2x1bW46IEF2YWlsYWJsZUNvbHVtbnM8VFJpZ2h0Piwgb3BlcmF0b3I6IENvbXBhcmlzb25PcGVyYXRvciwgdmFsdWU6IGFueSk6IHRoaXM7XG4gIG9yT25WYWwoLi4uYXJnczogYW55W10pOiB0aGlzIHtcbiAgICAvLyBTQUZFVFk6IOy/vOumrCDruYzrjZTsnZgg7KCc64Sk66atIOqzhOyVveqzvCDshKDtlokg6rKA7Kad7J20IOydtCDtg4DsnoXsnYQg67O07J6l7ZWp64uI64ukLlxuICAgICh0aGlzLmNhbGxiYWNrIGFzIGFueSkub3JPblZhbCguLi5hcmdzKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxufVxuXG4vKlxuICBUUmVzb2x2ZWQ6IOy/vOumrCDsi6Ttlokg7ZuEIOuwmO2ZmOuQoCDqsrDqs7wg7YOA7J6FXG4gIFRSZXR1cm5pbmc6IFJFVFVSTklORyDsoIjsl5Ag7IKs7Jqp65CgIO2DgOyehVxuKi9cbmV4cG9ydCBjbGFzcyBSZXNvbHZlZFB1cmk8VFJlc29sdmVkLCBUUmV0dXJuaW5nPiBpbXBsZW1lbnRzIFByb21pc2U8VFJlc29sdmVkPiB7XG4gIGNvbnN0cnVjdG9yKFxuICAgIHB1YmxpYyBrbmV4UXVlcnk6IEtuZXguUXVlcnlCdWlsZGVyLFxuICAgIHByaXZhdGUga25leDogS25leCxcbiAgICBwcml2YXRlIHRhYmxlU3BlYzogVGFibGVTcGVjIHwgbnVsbCA9IG51bGwsXG4gICkge31cblxuICBbU3ltYm9sLnRvU3RyaW5nVGFnXTogc3RyaW5nID0gXCJQcm9taXNlXCI7XG5cbiAgdG9RdWVyeSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmtuZXhRdWVyeS50b1F1ZXJ5KCk7XG4gIH1cblxuICBkZWJ1ZygpOiB0aGlzIHtcbiAgICBjb25zb2xlLmxvZyhgJHtjaGFsay5jeWFuKFwiW1B1cmkgRGVidWddXCIpfSAke2NoYWxrLnllbGxvdyh0aGlzLnRvUXVlcnkoKSl9YCk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICB0aGVuPFRSZXN1bHQxID0gVFJlc29sdmVkLCBUUmVzdWx0MiA9IG5ldmVyPihcbiAgICBvbmZ1bGZpbGxlZD86ICgodmFsdWU6IFRSZXNvbHZlZCkgPT4gVFJlc3VsdDEgfCBQcm9taXNlTGlrZTxUUmVzdWx0MT4pIHwgbnVsbCxcbiAgICBvbnJlamVjdGVkPzogKChyZWFzb246IGFueSkgPT4gVFJlc3VsdDIgfCBQcm9taXNlTGlrZTxUUmVzdWx0Mj4pIHwgbnVsbCxcbiAgKTogUHJvbWlzZTxUUmVzdWx0MSB8IFRSZXN1bHQyPiB7XG4gICAgTmFpdGUudChcInB1cmk6ZXhlY3V0ZWQtcXVlcnlcIiwgdGhpcy50b1F1ZXJ5KCkpO1xuICAgIC8vIFNBRkVUWTog7L+866asIOu5jOuNlOydmCDsoJzrhKTrpq0g6rOE7JW96rO8IOyEoO2WiSDqsoDspp3snbQg7J20IO2DgOyeheydhCDrs7TsnqXtlanri4jri6QuXG4gICAgcmV0dXJuIHRoaXMua25leFF1ZXJ5LnRoZW4ob25mdWxmaWxsZWQgYXMgYW55LCBvbnJlamVjdGVkKTtcbiAgfVxuXG4gIGNhdGNoPFRSZXN1bHQyID0gbmV2ZXI+KFxuICAgIG9ucmVqZWN0ZWQ/OiAoKHJlYXNvbjogYW55KSA9PiBUUmVzdWx0MiB8IFByb21pc2VMaWtlPFRSZXN1bHQyPikgfCBudWxsLFxuICApOiBQcm9taXNlPFRSZXNvbHZlZCB8IFRSZXN1bHQyPiB7XG4gICAgcmV0dXJuIHRoaXMua25leFF1ZXJ5LmNhdGNoKG9ucmVqZWN0ZWQpO1xuICB9XG5cbiAgZmluYWxseShvbmZpbmFsbHk/OiAoKCkgPT4gdm9pZCkgfCBudWxsKTogUHJvbWlzZTxUUmVzb2x2ZWQ+IHtcbiAgICByZXR1cm4gdGhpcy5rbmV4UXVlcnkuZmluYWxseShvbmZpbmFsbHkpO1xuICB9XG5cbiAgLy8gT04gQ09ORkxJQ1QgLSDsu6zrn7wg6riw67CYXG4gIG9uQ29uZmxpY3Q8VFRhYmxlcyBleHRlbmRzIFJlY29yZDxzdHJpbmcsIFRSZXR1cm5pbmc+PihcbiAgICBjb2x1bW5zOiBzdHJpbmcgfCBzdHJpbmdbXSxcbiAgICBhY3Rpb24/OiBPbkNvbmZsaWN0QWN0aW9uPFRUYWJsZXM+LFxuICApOiB0aGlzIHtcbiAgICBjb25zdCB0YXJnZXQgPSBBcnJheS5pc0FycmF5KGNvbHVtbnMpID8gY29sdW1ucyA6IFtjb2x1bW5zXTtcblxuICAgIGlmICghYWN0aW9uIHx8IGFjdGlvbiA9PT0gXCJub3RoaW5nXCIpIHtcbiAgICAgIC8vIERPIE5PVEhJTkdcbiAgICAgIHRoaXMua25leFF1ZXJ5Lm9uQ29uZmxpY3QodGFyZ2V0KS5pZ25vcmUoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gRE8gVVBEQVRFXG4gICAgICBjb25zdCB7IHVwZGF0ZSB9ID0gYWN0aW9uO1xuXG4gICAgICAvLyBhY3Rpb24udXBkYXRlIOuwsOyXtCDtmJXtg5wgOiBbXCJuYW1lXCIsIFwiZW1haWxcIl1cbiAgICAgIGlmIChBcnJheS5pc0FycmF5KHVwZGF0ZSkpIHtcbiAgICAgICAgdGhpcy5rbmV4UXVlcnkub25Db25mbGljdCh0YXJnZXQpLm1lcmdlKHVwZGF0ZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBhY3Rpb24udXBkYXRlIOqwneyytCDtmJXtg5w6IHsgbmFtZTogXCJKb2huXCIsIGNvdW50OiByYXcoLi4uKSB9XG4gICAgICAgIGNvbnN0IG1lcmdlT2JqID0ge307XG5cbiAgICAgICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXModXBkYXRlKSkge1xuICAgICAgICAgIGNvbnN0IG1lcmdlZFZhbHVlID0gaXNTcWxFeHByZXNzaW9uKHZhbHVlKVxuICAgICAgICAgICAgPyB0aGlzLmtuZXgucmF3KHZhbHVlW1wiX3NxbFwiXSlcbiAgICAgICAgICAgIDogc2VyaWFsaXplSnNvbkNvbHVtblZhbHVlKHRoaXMudGFibGVTcGVjLCBrZXksIHZhbHVlKTtcbiAgICAgICAgICBPYmplY3QuYXNzaWduKG1lcmdlT2JqLCB7IFtrZXldOiBtZXJnZWRWYWx1ZSB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMua25leFF1ZXJ5Lm9uQ29uZmxpY3QodGFyZ2V0KS5tZXJnZShtZXJnZU9iaik7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvLyBSRVRVUk5JTkc6IFwiKlwiIC0g7KCE7LK0IOy7rOufvFxuICByZXR1cm5pbmcoY29sdW1uOiBcIipcIik6IFJlc29sdmVkUHVyaTxUUmV0dXJuaW5nW10sIG5ldmVyPjtcbiAgLy8gUkVUVVJOSU5HOiDri6jsnbwg7Lus65+8XG4gIHJldHVybmluZzxUQ29sdW1uIGV4dGVuZHMgQ29sdW1uS2V5czxUUmV0dXJuaW5nPj4oXG4gICAgY29sdW1uOiBUQ29sdW1uLFxuICApOiBSZXNvbHZlZFB1cmk8UGljazxUUmV0dXJuaW5nLCBUQ29sdW1uPltdLCBuZXZlcj47XG4gIC8vIFJFVFVSTklORzog67O17IiYIOy7rOufvCAo67Cw7Je0KVxuICByZXR1cm5pbmc8VENvbHVtbiBleHRlbmRzIENvbHVtbktleXM8VFJldHVybmluZz4+KFxuICAgIGNvbHVtbnM6IFRDb2x1bW5bXSxcbiAgKTogUmVzb2x2ZWRQdXJpPFBpY2s8VFJldHVybmluZywgVENvbHVtbj5bXSwgbmV2ZXI+O1xuICAvLyBSRVRVUk5JTkcg6rWs7ZiEXG4gIHJldHVybmluZyhjb2x1bW5PckNvbHVtbnM6IHN0cmluZyB8IHN0cmluZ1tdKTogUmVzb2x2ZWRQdXJpPGFueVtdLCBuZXZlcj4ge1xuICAgIHRoaXMua25leFF1ZXJ5LnJldHVybmluZyhjb2x1bW5PckNvbHVtbnMpO1xuICAgIHJldHVybiBuZXcgUmVzb2x2ZWRQdXJpKHRoaXMua25leFF1ZXJ5LCB0aGlzLmtuZXgsIHRoaXMudGFibGVTcGVjKTtcbiAgfVxufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7QUFxR0EsU0FBZ0IsbUJBQW1CLFVBQWtDO0NBQ25FLE1BQU0sYUFBYSxVQUFVLEtBQUssS0FBSztDQUN2QyxNQUFNLGdCQUFnQixnQkFBZ0IsTUFBTSxjQUFjLGNBQWMsVUFBVTtDQUVsRixJQUFJLENBQUMsZUFDSCxNQUFNLElBQUksTUFBTSwyQkFBMkIsWUFBWSxJQUFJO0NBRzdELE9BQU87QUFDVDtBQUVBLFNBQVMsMkJBQWtDLE9B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