sonamu 0.9.4 → 0.9.6
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.
- package/dist/ai/providers/rtzr/utils.js +2 -2
- package/dist/api/config.d.ts +13 -2
- package/dist/api/config.d.ts.map +1 -1
- package/dist/api/config.js +1 -1
- package/dist/api/context.d.ts +17 -7
- package/dist/api/context.d.ts.map +1 -1
- package/dist/api/context.js +1 -1
- package/dist/api/decorators.d.ts +18 -0
- package/dist/api/decorators.d.ts.map +1 -1
- package/dist/api/decorators.js +54 -3
- package/dist/api/index.js +8 -3
- package/dist/api/sonamu.d.ts +24 -9
- package/dist/api/sonamu.d.ts.map +1 -1
- package/dist/api/sonamu.js +365 -79
- package/dist/api/websocket-helpers.d.ts +24 -0
- package/dist/api/websocket-helpers.d.ts.map +1 -0
- package/dist/api/websocket-helpers.js +77 -0
- package/dist/bin/cli.js +12 -4
- package/dist/database/upsert-builder.js +4 -4
- package/dist/dict/sonamu-dictionary.js +6 -6
- package/dist/entity/entity-manager.js +1 -1
- package/dist/entity/entity.js +3 -3
- package/dist/index.d.ts +6 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +16 -4
- package/dist/migration/code-generation.d.ts.map +1 -1
- package/dist/migration/code-generation.js +8 -9
- package/dist/stream/index.d.ts +6 -0
- package/dist/stream/index.d.ts.map +1 -1
- package/dist/stream/index.js +13 -2
- package/dist/stream/ws-audience-resolver.d.ts +15 -0
- package/dist/stream/ws-audience-resolver.d.ts.map +1 -0
- package/dist/stream/ws-audience-resolver.js +31 -0
- package/dist/stream/ws-audience.d.ts +28 -0
- package/dist/stream/ws-audience.d.ts.map +1 -0
- package/dist/stream/ws-audience.js +46 -0
- package/dist/stream/ws-cluster-bus.d.ts +23 -0
- package/dist/stream/ws-cluster-bus.d.ts.map +1 -0
- package/dist/stream/ws-cluster-bus.js +18 -0
- package/dist/stream/ws-core.d.ts +15 -0
- package/dist/stream/ws-core.d.ts.map +1 -0
- package/dist/stream/ws-core.js +1 -0
- package/dist/stream/ws-delivery.d.ts +24 -0
- package/dist/stream/ws-delivery.d.ts.map +1 -0
- package/dist/stream/ws-delivery.js +103 -0
- package/dist/stream/ws-local-connection-store.d.ts +10 -0
- package/dist/stream/ws-local-connection-store.d.ts.map +1 -0
- package/dist/stream/ws-local-connection-store.js +44 -0
- package/dist/stream/ws-presence-store.d.ts +61 -0
- package/dist/stream/ws-presence-store.d.ts.map +1 -0
- package/dist/stream/ws-presence-store.js +236 -0
- package/dist/stream/ws-registry.d.ts +42 -0
- package/dist/stream/ws-registry.d.ts.map +1 -0
- package/dist/stream/ws-registry.js +108 -0
- package/dist/stream/ws.d.ts +52 -0
- package/dist/stream/ws.d.ts.map +1 -0
- package/dist/stream/ws.js +397 -0
- package/dist/syncer/api-parser.d.ts.map +1 -1
- package/dist/syncer/api-parser.js +72 -2
- package/dist/syncer/checksum.d.ts.map +1 -1
- package/dist/syncer/checksum.js +13 -12
- package/dist/syncer/code-generator.d.ts.map +1 -1
- package/dist/syncer/code-generator.js +7 -4
- package/dist/syncer/event-batcher.d.ts +27 -0
- package/dist/syncer/event-batcher.d.ts.map +1 -0
- package/dist/syncer/event-batcher.js +69 -0
- package/dist/syncer/file-patterns.d.ts +48 -26
- package/dist/syncer/file-patterns.d.ts.map +1 -1
- package/dist/syncer/file-patterns.js +71 -23
- package/dist/syncer/file-tracking.d.ts +13 -0
- package/dist/syncer/file-tracking.d.ts.map +1 -0
- package/dist/syncer/file-tracking.js +33 -0
- package/dist/syncer/index.js +2 -2
- package/dist/syncer/module-loader.d.ts +2 -11
- package/dist/syncer/module-loader.d.ts.map +1 -1
- package/dist/syncer/module-loader.js +3 -3
- package/dist/syncer/syncer-actions.d.ts +39 -6
- package/dist/syncer/syncer-actions.d.ts.map +1 -1
- package/dist/syncer/syncer-actions.js +125 -10
- package/dist/syncer/syncer.d.ts +33 -19
- package/dist/syncer/syncer.d.ts.map +1 -1
- package/dist/syncer/syncer.js +168 -168
- package/dist/syncer/watcher.d.ts +8 -0
- package/dist/syncer/watcher.d.ts.map +1 -0
- package/dist/syncer/watcher.js +105 -0
- package/dist/tasks/workflow-manager.d.ts.map +1 -1
- package/dist/tasks/workflow-manager.js +2 -1
- package/dist/template/implementations/services.template.d.ts.map +1 -1
- package/dist/template/implementations/services.template.js +36 -1
- package/dist/testing/bootstrap.d.ts.map +1 -1
- package/dist/testing/bootstrap.js +8 -1
- package/dist/testing/data-explorer.d.ts.map +1 -1
- package/dist/testing/data-explorer.js +5 -3
- package/dist/testing/fixture-manager.js +1 -1
- package/dist/types/types.d.ts +2 -1
- package/dist/types/types.d.ts.map +1 -1
- package/dist/types/types.js +2 -2
- package/dist/ui/api.d.ts.map +1 -1
- package/dist/ui/api.js +4 -3
- package/dist/ui/cdd-service.js +1 -1
- package/dist/ui-web/assets/{index-C5KUjXm0.js → index-BmThfg-s.js} +39 -39
- package/dist/ui-web/assets/index-D4rYm-Xz.css +1 -0
- package/dist/ui-web/index.html +2 -2
- package/dist/utils/async-utils.d.ts +27 -3
- package/dist/utils/async-utils.d.ts.map +1 -1
- package/dist/utils/async-utils.js +56 -6
- package/dist/utils/formatter.d.ts +7 -1
- package/dist/utils/formatter.d.ts.map +1 -1
- package/dist/utils/formatter.js +95 -60
- package/dist/utils/fs-utils.d.ts +2 -0
- package/dist/utils/fs-utils.d.ts.map +1 -1
- package/dist/utils/fs-utils.js +10 -2
- package/dist/utils/process-utils.d.ts +6 -0
- package/dist/utils/process-utils.d.ts.map +1 -1
- package/dist/utils/process-utils.js +16 -3
- package/dist/utils/utils.d.ts +1 -0
- package/dist/utils/utils.d.ts.map +1 -1
- package/dist/utils/utils.js +2 -2
- package/package.json +7 -5
- package/src/ai/providers/rtzr/utils.ts +1 -1
- package/src/api/__tests__/sonamu.websocket.test.ts +64 -0
- package/src/api/__tests__/websocket-context.types.test.ts +58 -0
- package/src/api/config.ts +28 -2
- package/src/api/context.ts +21 -7
- package/src/api/decorators.ts +101 -1
- package/src/api/sonamu.ts +529 -127
- package/src/api/websocket-helpers.ts +122 -0
- package/src/bin/cli.ts +10 -2
- package/src/database/upsert-builder.ts +3 -3
- package/src/dict/sonamu-dictionary.ts +3 -3
- package/src/entity/entity.ts +1 -1
- package/src/index.ts +6 -0
- package/src/migration/code-generation.ts +6 -11
- package/src/shared/app.shared.ts.txt +312 -4
- package/src/shared/web.shared.ts.txt +340 -4
- package/src/stream/__tests__/ws-contracts.test.ts +381 -0
- package/src/stream/__tests__/ws.test.ts +449 -0
- package/src/stream/index.ts +6 -0
- package/src/stream/ws-audience-resolver.ts +35 -0
- package/src/stream/ws-audience.ts +62 -0
- package/src/stream/ws-cluster-bus.ts +32 -0
- package/src/stream/ws-core.ts +16 -0
- package/src/stream/ws-delivery.ts +138 -0
- package/src/stream/ws-local-connection-store.ts +44 -0
- package/src/stream/ws-presence-store.ts +326 -0
- package/src/stream/ws-registry.ts +138 -0
- package/src/stream/ws.ts +591 -0
- package/src/syncer/__tests__/api-parser.websocket-type-ref.test.ts +78 -0
- package/src/syncer/api-parser.ts +112 -1
- package/src/syncer/checksum.ts +23 -29
- package/src/syncer/code-generator.ts +4 -1
- package/src/syncer/event-batcher.ts +72 -0
- package/src/syncer/file-patterns.ts +98 -30
- package/src/syncer/file-tracking.ts +27 -0
- package/src/syncer/module-loader.ts +5 -12
- package/src/syncer/syncer-actions.ts +179 -17
- package/src/syncer/syncer.ts +250 -287
- package/src/syncer/watcher.ts +128 -0
- package/src/tasks/workflow-manager.ts +1 -0
- package/src/template/__tests__/services.template.websocket.test.ts +79 -0
- package/src/template/implementations/services.template.ts +69 -0
- package/src/testing/bootstrap.ts +8 -1
- package/src/testing/data-explorer.ts +3 -2
- package/src/types/types.ts +20 -2
- package/src/ui/api.ts +10 -1
- package/src/utils/async-utils.ts +71 -4
- package/src/utils/formatter.ts +114 -75
- package/src/utils/fs-utils.ts +9 -0
- package/src/utils/process-utils.ts +17 -0
- package/src/utils/utils.ts +1 -1
- package/dist/ui-web/assets/index-Dr8pRJC_.css +0 -1
package/dist/entity/entity.js
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { __esmMin } from "../_virtual/rolldown_runtime.js";
|
|
2
|
+
import { formatCode, init_formatter } from "../utils/formatter.js";
|
|
2
3
|
import { exists, init_fs_utils } from "../utils/fs-utils.js";
|
|
3
4
|
import { assertDefined, init_utils, nonNullable } from "../utils/utils.js";
|
|
4
5
|
import { Sonamu, init_sonamu } from "../api/sonamu.js";
|
|
@@ -6,7 +7,6 @@ import { getEnumDefValues, getSubsetFields, init_types, isBelongsToOneRelationPr
|
|
|
6
7
|
import { importMembers, init_esm_utils } from "../utils/esm-utils.js";
|
|
7
8
|
import { init_path_utils, runtimePath } from "../utils/path-utils.js";
|
|
8
9
|
import { EntityManager, init_entity_manager } from "./entity-manager.js";
|
|
9
|
-
import { formatCode, init_formatter } from "../utils/formatter.js";
|
|
10
10
|
import inflection from "inflection";
|
|
11
11
|
import { z as z$1 } from "zod";
|
|
12
12
|
import { group, unique } from "radashi";
|
|
@@ -626,7 +626,7 @@ var init_entity = __esmMin((() => {
|
|
|
626
626
|
}));
|
|
627
627
|
const jsonPath = path.join(Sonamu.apiRootPath, `src/application/${this.names.parentFs}/${this.names.fs}.entity.json`);
|
|
628
628
|
const json = this.toJson();
|
|
629
|
-
await writeFile(jsonPath, await formatCode(JSON.stringify(json),
|
|
629
|
+
await writeFile(jsonPath, await formatCode(JSON.stringify(json), jsonPath));
|
|
630
630
|
await EntityManager.register(json);
|
|
631
631
|
}
|
|
632
632
|
/**
|
|
@@ -952,4 +952,4 @@ var init_entity = __esmMin((() => {
|
|
|
952
952
|
//#endregion
|
|
953
953
|
init_entity();
|
|
954
954
|
export { Entity, init_entity };
|
|
955
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW50aXR5LmpzIiwibmFtZXMiOlsieiIsImxpbmVzOiBzdHJpbmdbXSIsImpvaW4iLCJyZXN1bHQ6IFJldHVyblR5cGU8dHlwZW9mIHRoaXMuYnVpbGROZXN0ZWRTZWxlY3RPYmplY3Q+IiwibG9hZGVyTGluZXM6IHN0cmluZ1tdIiwibG9hZGVycyIsInJlc3VsdDogU3Vic2V0UXVlcnkiLCJmaWVsZHMiLCJqb2luQ2xhdXNlOlxuICAgICAgICAgICAgfCB7XG4gICAgICAgICAgICAgICAgZnJvbTogc3RyaW5nO1xuICAgICAgICAgICAgICAgIHRvOiBzdHJpbmc7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHwge1xuICAgICAgICAgICAgICAgIGN1c3RvbTogc3RyaW5nO1xuICAgICAgICAgICAgICB9IiwiZnJvbTogc3RyaW5nIiwidG86IHN0cmluZyIsIm1hbnlKb2luOiBTdWJzZXRRdWVyeVtcImxvYWRlcnNcIl1bbnVtYmVyXVtcIm1hbnlKb2luXCJdIiwia2V5OiBzdHJpbmciLCJ2YWx1ZTogc3RyaW5nIiwiZWxzZUV4cHI6IHN0cmluZ1tdIiwiZ3JvdXAiLCJwcm9wIiwic3Vic2V0czogeyBba2V5OiBzdHJpbmddOiBpbXBvcnQoXCIuLi90eXBlcy90eXBlc1wiKS5TdWJzZXREZWYgfSIsIm5vcm1hbEZpZWxkczogU3Vic2V0RmllbGRbXSIsImludGVybmFsRmllbGRzOiBTdWJzZXRGaWVsZFtdIiwiZW51bXM6IHsgW2tleTogc3RyaW5nXTogaW1wb3J0KFwiLi4vdHlwZXMvdHlwZXNcIikuRW51bURlZiB9IiwiY29udGV4dDogaW1wb3J0KFwiLi4vY29uZS9jb25lLWdlbmVyYXRvclwiKS5Db25lR2VuZXJhdGlvbkNvbnRleHQiLCJjb25lczogUmVjb3JkPHN0cmluZywgQ29uZT4iLCJyZXN1bHQ6IHtcbiAgICAgIGVudGl0eUlkOiBzdHJpbmc7XG4gICAgICBwcm9wTmFtZTogc3RyaW5nO1xuICAgIH1bXSIsImVudGl0aWVzOiBFbnRpdHlbXSJdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9lbnRpdHkvZW50aXR5LnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBhc3NlcnQgZnJvbSBcImFzc2VydFwiO1xuaW1wb3J0IHsgd3JpdGVGaWxlIH0gZnJvbSBcImZzL3Byb21pc2VzXCI7XG5pbXBvcnQgcGF0aCBmcm9tIFwicGF0aFwiO1xuXG5pbXBvcnQgaW5mbGVjdGlvbiBmcm9tIFwiaW5mbGVjdGlvblwiO1xuaW1wb3J0IHsgZ3JvdXAsIHVuaXF1ZSB9IGZyb20gXCJyYWRhc2hpXCI7XG5pbXBvcnQgeyB6IH0gZnJvbSBcInpvZFwiO1xuXG5pbXBvcnQgeyBTb25hbXUgfSBmcm9tIFwiLi4vYXBpL3NvbmFtdVwiO1xuaW1wb3J0IHtcbiAgZ2V0RW51bURlZlZhbHVlcyxcbiAgZ2V0U3Vic2V0RmllbGRzLFxuICBpc0JlbG9uZ3NUb09uZVJlbGF0aW9uUHJvcCxcbiAgaXNFbnVtUHJvcCxcbiAgaXNIYXNNYW55UmVsYXRpb25Qcm9wLFxuICBpc0ludGVybmFsU3Vic2V0RmllbGQsXG4gIGlzTWFueVRvTWFueVJlbGF0aW9uUHJvcCxcbiAgaXNPbmVUb09uZVJlbGF0aW9uUHJvcCxcbiAgaXNSZWxhdGlvblByb3AsXG4gIGlzVmlydHVhbENvZGVQcm9wLFxuICBpc1ZpcnR1YWxQcm9wLFxuICBub3JtYWxpemVTdWJzZXRGaWVsZCxcbn0gZnJvbSBcIi4uL3R5cGVzL3R5cGVzXCI7XG5pbXBvcnQge1xuICB0eXBlIENvbmUsXG4gIHR5cGUgRW50aXR5SW5kZXgsXG4gIHR5cGUgRW50aXR5SnNvbixcbiAgdHlwZSBFbnRpdHlQcm9wLFxuICB0eXBlIEVudGl0eVByb3BOb2RlLFxuICB0eXBlIEVudGl0eVN1YnNldFJvdyxcbiAgdHlwZSBSZWxhdGlvblByb3AsXG4gIHR5cGUgU3Vic2V0RmllbGQsXG4gIHR5cGUgU3Vic2V0UXVlcnksXG59IGZyb20gXCIuLi90eXBlcy90eXBlc1wiO1xuaW1wb3J0IHsgaW1wb3J0TWVtYmVycyB9IGZyb20gXCIuLi91dGlscy9lc20tdXRpbHNcIjtcbmltcG9ydCB7IGZvcm1hdENvZGUgfSBmcm9tIFwiLi4vdXRpbHMvZm9ybWF0dGVyXCI7XG5pbXBvcnQgeyBleGlzdHMgfSBmcm9tIFwiLi4vdXRpbHMvZnMtdXRpbHNcIjtcbmltcG9ydCB7IHJ1bnRpbWVQYXRoIH0gZnJvbSBcIi4uL3V0aWxzL3BhdGgtdXRpbHNcIjtcbmltcG9ydCB7IGFzc2VydERlZmluZWQsIG5vbk51bGxhYmxlIH0gZnJvbSBcIi4uL3V0aWxzL3V0aWxzXCI7XG5pbXBvcnQgeyBFbnRpdHlNYW5hZ2VyIH0gZnJvbSBcIi4vZW50aXR5LW1hbmFnZXJcIjtcblxuZXhwb3J0IGNsYXNzIEVudGl0eSB7XG4gIGlkOiBzdHJpbmc7XG4gIHBhcmVudElkPzogc3RyaW5nO1xuICB0YWJsZTogc3RyaW5nO1xuICB0aXRsZTogc3RyaW5nO1xuICBjb25lPzogQ29uZTtcbiAgbmFtZXM6IHtcbiAgICBwYXJlbnRGczogc3RyaW5nO1xuICAgIGZzOiBzdHJpbmc7XG4gICAgbW9kdWxlOiBzdHJpbmc7XG4gIH07XG4gIHByb3BzOiBFbnRpdHlQcm9wW107XG4gIHByb3BzRGljdDoge1xuICAgIFtrZXk6IHN0cmluZ106IEVudGl0eVByb3A7XG4gIH07XG4gIHJlbGF0aW9uczoge1xuICAgIFtrZXk6IHN0cmluZ106IFJlbGF0aW9uUHJvcDtcbiAgfTtcbiAgaW5kZXhlczogRW50aXR5SW5kZXhbXTtcbiAgc3Vic2V0czoge1xuICAgIFtrZXk6IHN0cmluZ106IHN0cmluZ1tdO1xuICB9O1xuICBzdWJzZXRzSW50ZXJuYWw6IHtcbiAgICBba2V5OiBzdHJpbmddOiBzdHJpbmdbXTtcbiAgfTtcbiAgdHlwZXM6IHtcbiAgICBbbmFtZTogc3RyaW5nXTogei5ab2RUeXBlQW55O1xuICB9ID0ge307XG4gIGVudW1zOiB7XG4gICAgW2VudW1JZDogc3RyaW5nXTogei5ab2RFbnVtPFJlYWRvbmx5PFJlY29yZDxzdHJpbmcsIHN0cmluZz4+PjtcbiAgfSA9IHt9O1xuICBlbnVtTGFiZWxzOiB7XG4gICAgW2VudW1JZDogc3RyaW5nXToge1xuICAgICAgW2tleTogc3RyaW5nXTogc3RyaW5nO1xuICAgIH07XG4gIH0gPSB7fTtcbiAgZW51bUNvbmVzOiB7XG4gICAgW2VudW1JZDogc3RyaW5nXTogQ29uZTtcbiAgfSA9IHt9O1xuICBzdWJzZXRDb25lczoge1xuICAgIFtzdWJzZXRLZXk6IHN0cmluZ106IENvbmU7XG4gIH0gPSB7fTtcblxuICBjb25zdHJ1Y3Rvcih7IGlkLCBwYXJlbnRJZCwgdGFibGUsIHRpdGxlLCBjb25lLCBwcm9wcywgaW5kZXhlcywgc3Vic2V0cywgZW51bXMgfTogRW50aXR5SnNvbikge1xuICAgIC8vIGlkXG4gICAgdGhpcy5pZCA9IGlkO1xuICAgIHRoaXMucGFyZW50SWQgPSBwYXJlbnRJZDtcbiAgICB0aGlzLnRpdGxlID0gdGl0bGUgPz8gdGhpcy5pZDtcbiAgICB0aGlzLnRhYmxlID0gdGFibGUgPz8gaW5mbGVjdGlvbi51bmRlcnNjb3JlKGluZmxlY3Rpb24ucGx1cmFsaXplKGlkKSk7XG4gICAgdGhpcy5jb25lID0gY29uZTtcblxuICAgIC8vIHByb3BzXG4gICAgaWYgKHByb3BzKSB7XG4gICAgICB0aGlzLnByb3BzID0gcHJvcHMubWFwKChwcm9wKSA9PiB7XG4gICAgICAgIGlmIChpc0VudW1Qcm9wKHByb3ApKSB7XG4gICAgICAgICAgaWYgKHByb3AuaWQuaW5jbHVkZXMoXCIkTW9kZWxcIikpIHtcbiAgICAgICAgICAgIHByb3AuaWQgPSBwcm9wLmlkLnJlcGxhY2UoXCIkTW9kZWxcIiwgaWQpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcHJvcDtcbiAgICAgIH0pO1xuICAgICAgdGhpcy5wcm9wc0RpY3QgPSBPYmplY3QuZnJvbUVudHJpZXMoXG4gICAgICAgIHByb3BzLm1hcCgocHJvcCkgPT4ge1xuICAgICAgICAgIHJldHVybiBbcHJvcC5uYW1lLCBwcm9wXTtcbiAgICAgICAgfSksXG4gICAgICApO1xuXG4gICAgICAvLyByZWxhdGlvbnNcbiAgICAgIHRoaXMucmVsYXRpb25zID0gT2JqZWN0LmZyb21FbnRyaWVzKFxuICAgICAgICBwcm9wcy5maWx0ZXIoKHByb3ApID0+IGlzUmVsYXRpb25Qcm9wKHByb3ApKS5tYXAoKHByb3ApID0+IFtwcm9wLm5hbWUsIHByb3BdKSxcbiAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMucHJvcHMgPSBbXTtcbiAgICAgIHRoaXMucHJvcHNEaWN0ID0ge307XG4gICAgICB0aGlzLnJlbGF0aW9ucyA9IHt9O1xuICAgIH1cblxuICAgIC8vIGluZGV4ZXNcbiAgICB0aGlzLmluZGV4ZXMgPSBpbmRleGVzID8/IFtdO1xuXG4gICAgLy8gc3Vic2V0czogU3Vic2V0RGVm7JeQ7IScIFN1YnNldEZpZWxkW13rpbwg7LaU7Lac7ZWY7JesIHN1YnNldHMo7J2867CYKeyZgCBzdWJzZXRzSW50ZXJuYWwoaW50ZXJuYWwp66GcIOu2hOumrFxuICAgIHRoaXMuc3Vic2V0cyA9IHt9O1xuICAgIHRoaXMuc3Vic2V0c0ludGVybmFsID0ge307XG4gICAgZm9yIChjb25zdCBba2V5LCBzdWJzZXREZWZdIG9mIE9iamVjdC5lbnRyaWVzKHN1YnNldHMgPz8ge30pKSB7XG4gICAgICBjb25zdCBmaWVsZHMgPSBnZXRTdWJzZXRGaWVsZHMoc3Vic2V0RGVmKTtcbiAgICAgIHRoaXMuc3Vic2V0c1trZXldID0gZmllbGRzLmZpbHRlcigoZikgPT4gIWlzSW50ZXJuYWxTdWJzZXRGaWVsZChmKSkubWFwKG5vcm1hbGl6ZVN1YnNldEZpZWxkKTtcbiAgICAgIHRoaXMuc3Vic2V0c0ludGVybmFsW2tleV0gPSBmaWVsZHMuZmlsdGVyKGlzSW50ZXJuYWxTdWJzZXRGaWVsZCkubWFwKG5vcm1hbGl6ZVN1YnNldEZpZWxkKTtcblxuICAgICAgLy8gY29uZSDstpTstpxcbiAgICAgIGlmICghQXJyYXkuaXNBcnJheShzdWJzZXREZWYpICYmIFwiY29uZVwiIGluIHN1YnNldERlZiAmJiBzdWJzZXREZWYuY29uZSkge1xuICAgICAgICB0aGlzLnN1YnNldENvbmVzW2tleV0gPSBzdWJzZXREZWYuY29uZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBlbnVtczogRW51bURlZuyXkOyEnCB2YWx1ZXPsmYAgY29uZeulvCDstpTstpztlZjsl6wg7LKY66asXG4gICAgdGhpcy5lbnVtTGFiZWxzID0gT2JqZWN0LmZyb21FbnRyaWVzKFxuICAgICAgT2JqZWN0LmVudHJpZXMoZW51bXMgPz8ge30pLm1hcCgoW2tleSwgZW51bURlZl0pID0+IHtcbiAgICAgICAgLy8gY29uZSDstpTstpxcbiAgICAgICAgaWYgKFwidmFsdWVzXCIgaW4gZW51bURlZiAmJiBcImNvbmVcIiBpbiBlbnVtRGVmICYmIGVudW1EZWYuY29uZSkge1xuICAgICAgICAgIHRoaXMuZW51bUNvbmVzW2tleV0gPSBlbnVtRGVmLmNvbmUgYXMgQ29uZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gW2tleSwgZ2V0RW51bURlZlZhbHVlcyhlbnVtRGVmKV07XG4gICAgICB9KSxcbiAgICApO1xuICAgIHRoaXMuZW51bXMgPSBPYmplY3QuZnJvbUVudHJpZXMoXG4gICAgICBPYmplY3QuZW50cmllcyh0aGlzLmVudW1MYWJlbHMpLm1hcCgoW2tleSwgZW51bUxhYmVsXSkgPT4ge1xuICAgICAgICByZXR1cm4gW2tleSwgei5lbnVtKE9iamVjdC5rZXlzKGVudW1MYWJlbCkgYXMgdW5rbm93biBhcyByZWFkb25seSBbc3RyaW5nLCAuLi5zdHJpbmdbXV0pXTtcbiAgICAgIH0pLFxuICAgICk7XG5cbiAgICAvLyBuYW1lc1xuICAgIHRoaXMubmFtZXMgPSB7XG4gICAgICBwYXJlbnRGczogaW5mbGVjdGlvbi5kYXNoZXJpemUoaW5mbGVjdGlvbi51bmRlcnNjb3JlKHBhcmVudElkID8/IGlkKSkudG9Mb3dlckNhc2UoKSxcbiAgICAgIGZzOiBpbmZsZWN0aW9uLmRhc2hlcml6ZShpbmZsZWN0aW9uLnVuZGVyc2NvcmUoaWQpKS50b0xvd2VyQ2FzZSgpLFxuICAgICAgbW9kdWxlOiBpZCxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIOy/vOumrOyaqSDshJzruIzshYsg7ZWE65Oc66W8IOuwmO2ZmO2VqeuLiOuLpCAoc3Vic2V0cyArIHN1YnNldHNJbnRlcm5hbCDtlansuagpXG4gICAqL1xuICBnZXRTdWJzZXRGaWVsZHNGb3JRdWVyeShzdWJzZXRLZXk6IHN0cmluZyk6IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gWy4uLih0aGlzLnN1YnNldHNbc3Vic2V0S2V5XSA/PyBbXSksIC4uLih0aGlzLnN1YnNldHNJbnRlcm5hbFtzdWJzZXRLZXldID8/IFtdKV07XG4gIH1cblxuICAvKipcbiAgICog7KO87Ja07KeEIOydtOumhChzdWJzZXRLZXkp7J2YIHN1YnNldOydhCDsi6TsoJzroZwg6rCA7KC47Jik64qUIFB1cmkg7L2U65OcIOq1rO2YhOyytCBzdHJpbmfsnYQg67CY7ZmY7ZWp64uI64ukLlxuICAgKi9cbiAgZ2V0UHVyaVN1YnNldFF1ZXJ5KHN1YnNldEtleTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBjb25zdCBzdWJzZXQgPSB0aGlzLmdldFN1YnNldEZpZWxkc0ZvclF1ZXJ5KHN1YnNldEtleSk7XG4gICAgY29uc3Qgc3Vic2V0UXVlcnkgPSB0aGlzLnJlc29sdmVTdWJzZXRRdWVyeShcIlwiLCBzdWJzZXQpO1xuXG4gICAgY29uc3QgbGluZXM6IHN0cmluZ1tdID0gW107XG5cbiAgICAvLyBmcm9tXG4gICAgbGluZXMucHVzaChgcmV0dXJuIHFiV3JhcHBlcmApO1xuICAgIGxpbmVzLnB1c2goYC5mcm9tKFwiJHt0aGlzLnRhYmxlfVwiKWApO1xuXG4gICAgLy8gam9pblxuICAgIGZvciAoY29uc3Qgam9pbiBvZiBzdWJzZXRRdWVyeS5qb2lucykge1xuICAgICAgLy8gam9pbiDrqZTshJzrk5wg6rKw7KCVOiBpbm5lciDihpIgam9pbiwgb3V0ZXIg4oaSIGxlZnRKb2luXG4gICAgICAvLyBGSyBudWxsYWJsZSDsl6zrtoDripQgbGVmdEpvaW4g7YOA7J6FIOyLnOq3uOuLiOyymOyXkOyEnCDsnpDrj5nsnLzroZwg7YyQ64uo65CoXG4gICAgICBjb25zdCBqb2luTWV0aG9kID0gam9pbi5qb2luID09PSBcImlubmVyXCIgPyBcImpvaW5cIiA6IFwibGVmdEpvaW5cIjtcblxuICAgICAgaWYgKFwiY3VzdG9tXCIgaW4gam9pbikge1xuICAgICAgICAvLyBjdXN0b20gam9pbiBjbGF1c2XripQgcmF3IOyCrOyaqVxuICAgICAgICBsaW5lcy5wdXNoKFxuICAgICAgICAgIGAuJHtqb2luTWV0aG9kfSh7ICR7am9pbi5hc306IFwiJHtqb2luLnRhYmxlfVwiIH0sIHFiV3JhcHBlci5rbmV4LnJhdyhcXGAke2pvaW4uY3VzdG9tfVxcYCkpYCxcbiAgICAgICAgKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGxpbmVzLnB1c2goYC4ke2pvaW5NZXRob2R9KHsgJHtqb2luLmFzfTogXCIke2pvaW4udGFibGV9XCIgfSwgXCIke2pvaW4uZnJvbX1cIiwgXCIke2pvaW4udG99XCIpYCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gc2VsZWN0IC0g7J6F7LK07KCBIOq1rOyhsOuhnCDsg53shLFcbiAgICBjb25zdCBzZWxlY3RPYmogPSB0aGlzLmJ1aWxkTmVzdGVkU2VsZWN0T2JqZWN0KHN1YnNldFF1ZXJ5LnNlbGVjdCk7XG4gICAgbGluZXMucHVzaChgLnNlbGVjdCgke3RoaXMuc3RyaW5naWZ5TmVzdGVkU2VsZWN0T2JqZWN0KHNlbGVjdE9iail9KTtgKTtcblxuICAgIHJldHVybiBsaW5lcy5qb2luKFwiXFxuXCIpO1xuICB9XG5cbiAgLyoqXG4gICAqICouZW50aXR5Lmpzb27snZggc3Vic2V07JeQIOuTpOyWtOyeiOuKlCDtlYTrk5wg67Cw7Je07J2EIOuwm+yVhOyEnCxcbiAgICogUHVyaeydmCBTZWxlY3RPYmplY3Qg7YOA7J6F7Jy866GcIOuzgO2ZmO2VqeuLiOuLpC5cbiAgICpcbiAgICog7JiIOiBbXCJ1c2Vycy5pZFwiLCBcInBhcmVudC5pZFwiLCBcInBhcmVudC5uYW1lXCJdXG4gICAqICAg4oaSIHsgaWQ6IFwidXNlcnMuaWRcIiwgcGFyZW50OiB7IGlkOiBcInBhcmVudC5pZFwiLCBuYW1lOiBcInBhcmVudC5uYW1lXCIgfSB9XG4gICAqXG4gICAqIOyWuOuNlOuwlOqwgCDslYTri4wg7KSR7LKpIOqwneyytOuhnCDrs4DtmZjtlajsl5Ag7Jyg7J2Y7ZWY7IS47JqULlxuICAgKiDsnbTroIfqsowg7KSR7LKpIOqwneyytOuhnCDrs4DtmZjtlZjsl6wgc2VsZWN07JeQIOuEmOqyqOyjvOuptCBQYXJzZVNlbGVjdE9iamVjdCDtg4DsnoXsnbQgam9pbuuQnCDqsJ3ssrTsnZgg7YOA7J6F7J2EIOyemCDsnqHslYTspIQg7IiYIOyeiOyKteuLiOuLpC5cbiAgICog7KaJLCBlbmhhbmNlcuyXkOyEnCByb3frpbwg67Cb7JWY7J2EIOuVjCBoeWRyYXRl65CcIOqwneyytCDsnpDssrTsnZggbnVsbGl0eeyZgCDqt7gg7JWI7Kq9IO2VhOuTnOydmCBudWxsaXR56rCAIGZrIG51bGxhYmxlIOyXrOu2gOyXkCDrlLDrnbwg7J6YIOy2lOuhoOuQqeuLiOuLpC5cbiAgICovXG4gIHByaXZhdGUgYnVpbGROZXN0ZWRTZWxlY3RPYmplY3QoXG4gICAgc2VsZWN0SXRlbXM6IHN0cmluZ1tdLFxuICAgIC8vIG94bGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55IC0tIOuwmO2ZmCDsmKTruIzsoJ3tirjsnZgg6rCS7J2AIHN0cmluZ+ydvCDsiJjrj4Qg7J6I6rOgIOuYkOuLpOuluCDsmKTruIzsoJ3tirjsnbwg7IiY64+EIOyeiOuKlOuNsCwg7J2066W8IOyerOq3gCDtg4DsnoXsnLzroZwg64KY7YOA64K8IOyImCDsl4bslrQgYW5566GcIOyymOumrO2VqeuLiOuLpC5cbiAgKTogUmVjb3JkPHN0cmluZywgYW55PiB7XG4gICAgY29uc3QgcmVzdWx0OiBSZXR1cm5UeXBlPHR5cGVvZiB0aGlzLmJ1aWxkTmVzdGVkU2VsZWN0T2JqZWN0PiA9IHt9O1xuXG4gICAgZm9yIChjb25zdCBzZWxlY3RJdGVtIG9mIHNlbGVjdEl0ZW1zKSB7XG4gICAgICAvLyBcInVzZXJzLmlkXCIg65iQ64qUIFwidXNlcnMuaWQgYXMgdXNlcl9faWRcIiDtmJXtg5wg7YyM7IuxXG4gICAgICBjb25zdCBtYXRjaCA9IHNlbGVjdEl0ZW0ubWF0Y2goL14oLis/KSg/OiBhcyAoLispKT8kLyk7XG4gICAgICBpZiAoIW1hdGNoKSBjb250aW51ZTtcblxuICAgICAgY29uc3QgWywgY29sdW1uLCBhbGlhc10gPSBtYXRjaDtcbiAgICAgIGNvbnN0IGNvbHVtblZhbHVlID0gYFwiJHtjb2x1bW4udHJpbSgpfVwiYDtcblxuICAgICAgaWYgKCFhbGlhcyB8fCAhYWxpYXMuaW5jbHVkZXMoXCJfX1wiKSkge1xuICAgICAgICAvLyBhbGlhc+qwgCDsl4bqsbDrgpggX1/rpbwg7Y+s7ZWo7ZWY7KeAIOyViuycvOuptCDstZzsg4HsnIQg7ZWE65OcXG4gICAgICAgIGNvbnN0IGtleSA9IGFsaWFzID8/IGFzc2VydERlZmluZWQoY29sdW1uLnNwbGl0KFwiLlwiKS5wb3AoKSk7XG4gICAgICAgIHJlc3VsdFtrZXldID0gY29sdW1uVmFsdWU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBhbGlhc+qwgCBfX+ulvCDtj6ztlajtlZjrqbQg7J6F7LK0IOq1rOyhsOuhnCDqt7jro7ntmZRcbiAgICAgICAgY29uc3QgcGFydHMgPSBhbGlhcy5zcGxpdChcIl9fXCIpO1xuICAgICAgICBsZXQgY3VycmVudCA9IHJlc3VsdDtcblxuICAgICAgICAvLyDrp4jsp4Drp4kg7YyM7Yq4IOyghOq5jOyngCDspJHssqkg6rCd7LK0IOyDneyEsVxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBhcnRzLmxlbmd0aCAtIDE7IGkrKykge1xuICAgICAgICAgIGNvbnN0IHBhcnQgPSBwYXJ0c1tpXTtcbiAgICAgICAgICBpZiAocGFydCBpbiBjdXJyZW50KSB7XG4gICAgICAgICAgICBpZiAodHlwZW9mIGN1cnJlbnRbcGFydF0gPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICAgICAgLy8g7J6F66Cl7J20IFtcInVzZXJcIiwgXCJ1c2VyX19pZFwiXSDqsJnsnYAg6rK97JqwIVxuICAgICAgICAgICAgICAvLyDslaDstIjsl5Ag66eQ64+EIOyViCDrkJjsp4Drp4wg7JWI7KCE7ZWY6rKMIOyYiOyZuOulvCDrjZjsp5Hri4jri6QuXG4gICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgICAgICBgQ29uZmxpY3QgZGV0ZWN0ZWQgaW4gc2VsZWN0IGl0ZW1zOiBwYXJlbnQgcGF0aCBcIiR7cGFydHMuc2xpY2UoMCwgaSArIDEpLmpvaW4oXCJfX1wiKX1cIiBpcyBhbHJlYWR5IHNldCBhcyBhIGZpZWxkLCBjYW5ub3QgbmVzdCBcIiR7YWxpYXN9XCIgdW5kZXIgaXQuYCxcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY3VycmVudFtwYXJ0XSA9IHt9O1xuICAgICAgICAgIH1cbiAgICAgICAgICBjdXJyZW50ID0gY3VycmVudFtwYXJ0XTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIOuniOyngOuniSDtjIztirjsl5Ag6rCSIOyEpOyglVxuICAgICAgICBjb25zdCBsYXN0UGFydCA9IHBhcnRzW3BhcnRzLmxlbmd0aCAtIDFdO1xuICAgICAgICBjdXJyZW50W2xhc3RQYXJ0XSA9IGNvbHVtblZhbHVlO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICAvKipcbiAgICogSlNPTi5zdHJpbmdpZnnsmYAg7Jyg7IKs7ZWcIOydvOydhCDtlanri4jri6QuXG4gICAqIOuLpOunjCDso7zslrTsp4Qg6rCd7LK066W8IEpTT07snbQg7JWE64uMIFR5cGVTY3JpcHQg6rCd7LK0IOumrO2EsOuftCDsiqTtirjrp4HsnLzroZwg66eM65Ok7Ja07KSN64uI64ukLlxuICAgKiBrZXnsl5Ag65Sw7Ji07ZGc6rCAIOyXhuyWtOyalC5cbiAgICog7Lac66ClIOyYiOyLnDpcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiB7XG4gICAqICAgaWQ6IFwidXNlcnMuaWRcIixcbiAgICogICBwYXJlbnQ6IHtcbiAgICogICAgIGlkOiBcInBhcmVudC5pZFwiLFxuICAgKiAgICAgbmFtZTogXCJwYXJlbnQubmFtZVwiLFxuICAgKiAgIH0sXG4gICAqIH1cbiAgICogYGBgXG4gICAqIEBwYXJhbSBvYmog67OA7ZmY7ZWgIOqwneyytFxuICAgKiBAcGFyYW0gaW5kZW50IOuTpOyXrOyTsOq4sCDroIjrsqhcbiAgICogQHBhcmFtIHdpdGhCcmFjZXMgdHJ1ZeuptCDspJHqtITtmLgg7Y+s7ZWoLCBmYWxzZeuptCDrgrTsmqnrp4wg67CY7ZmYXG4gICAqL1xuICBwcml2YXRlIHN0cmluZ2lmeU5lc3RlZFNlbGVjdE9iamVjdChcbiAgICAvLyBveGxpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueSAtLSDspJHssqkg7Jik67iM7KCd7Yq47J2YIOqwkuydgCBzdHJpbmfsnbwg7IiY64+EIOyeiOqzoCDrmJDri6Trpbgg7Jik67iM7KCd7Yq47J28IOyImOuPhCDsnojripTrjbAsIOydtOulvCDsnqzqt4Ag7YOA7J6F7Jy866GcIOuCmO2DgOuCvCDsiJgg7JeG7Ja0IGFueeuhnCDsspjrpqztlanri4jri6QuXG4gICAgb2JqOiBSZWNvcmQ8c3RyaW5nLCBhbnk+LFxuICAgIGluZGVudDogbnVtYmVyID0gMCxcbiAgICB3aXRoQnJhY2VzOiBib29sZWFuID0gdHJ1ZSxcbiAgKTogc3RyaW5nIHtcbiAgICBjb25zdCBzcGFjZXMgPSBcIiAgXCIucmVwZWF0KGluZGVudCk7XG4gICAgY29uc3QgaW5uZXJTcGFjZXMgPSBcIiAgXCIucmVwZWF0KGluZGVudCArIDEpO1xuXG4gICAgY29uc3QgZW50cmllcyA9IE9iamVjdC5lbnRyaWVzKG9iaik7XG4gICAgaWYgKGVudHJpZXMubGVuZ3RoID09PSAwKSByZXR1cm4gd2l0aEJyYWNlcyA/IFwie31cIiA6IFwiXCI7XG5cbiAgICBjb25zdCBsaW5lcyA9IGVudHJpZXMubWFwKChba2V5LCB2YWx1ZV0pID0+IHtcbiAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgLy8g7Lus65+8IOqyveuhnCAo7J2066+4IOuUsOyYtO2RnCDtj6ztlagpXG4gICAgICAgIHJldHVybiBgJHtpbm5lclNwYWNlc30ke2tleX06ICR7dmFsdWV9LGA7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyDspJHssqkg6rCd7LK0ICjtla3sg4Eg7KSR6rSE7Zi4IO2PrO2VqClcbiAgICAgICAgcmV0dXJuIGAke2lubmVyU3BhY2VzfSR7a2V5fTogJHt0aGlzLnN0cmluZ2lmeU5lc3RlZFNlbGVjdE9iamVjdCh2YWx1ZSwgaW5kZW50ICsgMSwgdHJ1ZSl9LGA7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBpZiAod2l0aEJyYWNlcykge1xuICAgICAgcmV0dXJuIGB7XFxuJHtsaW5lcy5qb2luKFwiXFxuXCIpfVxcbiR7c3BhY2VzfX1gO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyDspJHqtITtmLgg7JeG7J20IOuCtOyaqeunjCDrsJjtmZggKOyVnuuSpCDqsJztlokg7KCc7Jm4KVxuICAgICAgcmV0dXJuIGxpbmVzLmpvaW4oXCJcXG5cIik7XG4gICAgfVxuICB9XG5cbiAgZ2V0UHVyaUxvYWRlclF1ZXJ5KHN1YnNldEtleTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBjb25zdCBzdWJzZXQgPSB0aGlzLmdldFN1YnNldEZpZWxkc0ZvclF1ZXJ5KHN1YnNldEtleSk7XG4gICAgY29uc3QgeyBsb2FkZXJzIH0gPSB0aGlzLnJlc29sdmVTdWJzZXRRdWVyeShcIlwiLCBzdWJzZXQpO1xuXG4gICAgY29uc3QgbGluZXM6IHN0cmluZ1tdID0gW2BbYF07XG5cbiAgICAvLyDsnqzqt4DsoIHsnLzroZwgbG9hZGVyIOyDneyEse2VmOuKlCDtl6ztjbwg7ZWo7IiYXG4gICAgY29uc3QgZ2VuZXJhdGVMb2FkZXJDb2RlID0gKGxvYWRlcnM6IFN1YnNldFF1ZXJ5W1wibG9hZGVyc1wiXSk6IHN0cmluZ1tdID0+IHtcbiAgICAgIGNvbnN0IGxvYWRlckxpbmVzOiBzdHJpbmdbXSA9IFtdO1xuXG4gICAgICBmb3IgKGNvbnN0IGxvYWRlciBvZiBsb2FkZXJzKSB7XG4gICAgICAgIGNvbnN0IHsgdG9UYWJsZSwgdG9Db2wsIHRocm91Z2gsIGZyb21UYWJsZSB9ID0gbG9hZGVyLm1hbnlKb2luO1xuXG4gICAgICAgIC8vIGZyb21UYWJsZeydmCBFbnRpdHnrpbwg6rCA7KC47JmA7IScIFBLIO2DgOyehSDtmZXsnbhcbiAgICAgICAgY29uc3QgZnJvbUVudGl0eSA9IEVudGl0eU1hbmFnZXIuZ2V0QnlUYWJsZShmcm9tVGFibGUpO1xuICAgICAgICBjb25zdCBmcm9tSWRzVHlwZSA9IGZyb21FbnRpdHkuZ2V0UGtBcnJheVR5cGUoKTtcblxuICAgICAgICBsb2FkZXJMaW5lcy5wdXNoKFxuICAgICAgICAgIFwie1wiLFxuICAgICAgICAgIGBhczogXCIke2xvYWRlci5hc31cIixgLFxuICAgICAgICAgIGByZWZJZDogXCIke2xvYWRlci5tYW55Sm9pbi5pZEZpZWxkfVwiLGAsXG4gICAgICAgICAgYHFiOiAocWJXcmFwcGVyOiBQdXJpV3JhcHBlcjxEYXRhYmFzZVNjaGVtYUV4dGVuZD4sIGZyb21JZHM6IG51bWJlcltdIHwgc3RyaW5nW10pID0+IHtgLFxuICAgICAgICApO1xuXG4gICAgICAgIGlmICh0aHJvdWdoID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAvLyBIYXNNYW55XG4gICAgICAgICAgbG9hZGVyTGluZXMucHVzaChcbiAgICAgICAgICAgIC8vXG4gICAgICAgICAgICBcInJldHVybiBxYldyYXBwZXJcIixcbiAgICAgICAgICAgIGAuZnJvbShcIiR7dG9UYWJsZX1cIilgLFxuICAgICAgICAgICk7XG5cbiAgICAgICAgICBsb2FkZXIub25lSm9pbnMuZm9yRWFjaCgoam9pbjogU3Vic2V0UXVlcnlbXCJqb2luc1wiXVtudW1iZXJdKSA9PiB7XG4gICAgICAgICAgICAvLyBGSyBudWxsYWJsZSDsl6zrtoDripQgbGVmdEpvaW4g7YOA7J6FIOyLnOq3uOuLiOyymOyXkOyEnCDsnpDrj5nsnLzroZwg7YyQ64uo65CoXG4gICAgICAgICAgICBjb25zdCBqb2luTWV0aG9kID0gam9pbi5qb2luID09PSBcImlubmVyXCIgPyBcImpvaW5cIiA6IFwibGVmdEpvaW5cIjtcbiAgICAgICAgICAgIGlmIChcImN1c3RvbVwiIGluIGpvaW4pIHtcbiAgICAgICAgICAgICAgLy8gY3VzdG9tIGpvaW4gY2xhdXNl64qUIGNhbGxiYWNrIO2Yle2DnOydmCBvbiDrqZTshJzrk5zroZwg7LKY66as7ZWp64uI64ukLlxuICAgICAgICAgICAgICBsb2FkZXJMaW5lcy5wdXNoKFxuICAgICAgICAgICAgICAgIGAuJHtqb2luTWV0aG9kfSh7ICR7am9pbi5hc306IFwiJHtqb2luLnRhYmxlfVwiIH0sIChqKSA9PiB7YCxcbiAgICAgICAgICAgICAgICBgai5vbihQdXJpLnJhd1N0cmluZyhcIiR7am9pbi5jdXN0b219XCIpKTtgLFxuICAgICAgICAgICAgICAgIFwifSlcIixcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGxvYWRlckxpbmVzLnB1c2goXG4gICAgICAgICAgICAgICAgYC4ke2pvaW5NZXRob2R9KHsgJHtqb2luLmFzfTogXCIke2pvaW4udGFibGV9XCIgfSwgXCIke2pvaW4uZnJvbX1cIiwgXCIke2pvaW4udG99XCIpYCxcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIC8vIOyeheyytOyggSBzZWxlY3Qg6rWs7KGwIOyDneyEsSAocmVmSWQg7Y+s7ZWoKVxuICAgICAgICAgIGNvbnN0IHNlbGVjdE9iaiA9IHRoaXMuYnVpbGROZXN0ZWRTZWxlY3RPYmplY3QobG9hZGVyLnNlbGVjdCk7XG4gICAgICAgICAgc2VsZWN0T2JqLnJlZklkID0gYFwiJHt0b1RhYmxlfS4ke3RvQ29sfVwiYDtcbiAgICAgICAgICBsb2FkZXJMaW5lcy5wdXNoKFxuICAgICAgICAgICAgYC53aGVyZUluKFwiJHt0b1RhYmxlfS4ke3RvQ29sfVwiLCBmcm9tSWRzIGFzICR7ZnJvbUlkc1R5cGV9KWAsXG4gICAgICAgICAgICBgLnNlbGVjdCgke3RoaXMuc3RyaW5naWZ5TmVzdGVkU2VsZWN0T2JqZWN0KHNlbGVjdE9iail9KTtgLFxuICAgICAgICAgICk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gTWFueVRvTWFueVxuICAgICAgICAgIGxvYWRlckxpbmVzLnB1c2goXG4gICAgICAgICAgICBcInJldHVybiBxYldyYXBwZXJcIixcbiAgICAgICAgICAgIGAuZnJvbShcIiR7dGhyb3VnaC50YWJsZX1cIilgLFxuICAgICAgICAgICAgYC5qb2luKFwiJHt0b1RhYmxlfVwiLCBcIiR7dGhyb3VnaC50YWJsZX0uJHt0aHJvdWdoLnRvQ29sfVwiLCBcIiR7dG9UYWJsZX0uJHt0b0NvbH1cIilgLFxuICAgICAgICAgICk7XG5cbiAgICAgICAgICBsb2FkZXIub25lSm9pbnMuZm9yRWFjaCgoam9pbjogU3Vic2V0UXVlcnlbXCJqb2luc1wiXVtudW1iZXJdKSA9PiB7XG4gICAgICAgICAgICAvLyBGSyBudWxsYWJsZSDsl6zrtoDripQgbGVmdEpvaW4g7YOA7J6FIOyLnOq3uOuLiOyymOyXkOyEnCDsnpDrj5nsnLzroZwg7YyQ64uo65CoXG4gICAgICAgICAgICBjb25zdCBqb2luTWV0aG9kID0gam9pbi5qb2luID09PSBcImlubmVyXCIgPyBcImpvaW5cIiA6IFwibGVmdEpvaW5cIjtcbiAgICAgICAgICAgIGlmIChcImN1c3RvbVwiIGluIGpvaW4pIHtcbiAgICAgICAgICAgICAgLy8gY3VzdG9tIGpvaW4gY2xhdXNl64qUIGNhbGxiYWNrIO2Yle2DnOydmCBvbiDrqZTshJzrk5zroZwg7LKY66as7ZWp64uI64ukLlxuICAgICAgICAgICAgICBsb2FkZXJMaW5lcy5wdXNoKFxuICAgICAgICAgICAgICAgIGAuJHtqb2luTWV0aG9kfSh7ICR7am9pbi5hc306IFwiJHtqb2luLnRhYmxlfVwiIH0sIChqKSA9PiB7YCxcbiAgICAgICAgICAgICAgICBgai5vbihQdXJpLnJhd1N0cmluZyhcIiR7am9pbi5jdXN0b219XCIpKTtgLFxuICAgICAgICAgICAgICAgIFwifSlcIixcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGxvYWRlckxpbmVzLnB1c2goXG4gICAgICAgICAgICAgICAgYC4ke2pvaW5NZXRob2R9KHsgJHtqb2luLmFzfTogXCIke2pvaW4udGFibGV9XCIgfSwgXCIke2pvaW4uZnJvbX1cIiwgXCIke2pvaW4udG99XCIpYCxcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIC8vIOyeheyytOyggSBzZWxlY3Qg6rWs7KGwIOyDneyEsSAocmVmSWQg7Y+s7ZWoKVxuICAgICAgICAgIGNvbnN0IHNlbGVjdE9iaiA9IHRoaXMuYnVpbGROZXN0ZWRTZWxlY3RPYmplY3QobG9hZGVyLnNlbGVjdCk7XG4gICAgICAgICAgc2VsZWN0T2JqLnJlZklkID0gYFwiJHt0aHJvdWdoLnRhYmxlfS4ke3Rocm91Z2guZnJvbUNvbH1cImA7XG4gICAgICAgICAgbG9hZGVyTGluZXMucHVzaChcbiAgICAgICAgICAgIGAud2hlcmVJbihcIiR7dGhyb3VnaC50YWJsZX0uJHt0aHJvdWdoLmZyb21Db2x9XCIsIGZyb21JZHMgYXMgJHtmcm9tSWRzVHlwZX0pYCxcbiAgICAgICAgICAgIGAuc2VsZWN0KCR7dGhpcy5zdHJpbmdpZnlOZXN0ZWRTZWxlY3RPYmplY3Qoc2VsZWN0T2JqKX0pO2AsXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxvYWRlckxpbmVzLnB1c2goYH0sYCk7XG5cbiAgICAgICAgLy8g7KSR7LKpIGxvYWRlcnMg7LKY66asXG4gICAgICAgIGlmIChsb2FkZXIubG9hZGVycyAmJiBsb2FkZXIubG9hZGVycy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgbG9hZGVyTGluZXMucHVzaChcImxvYWRlcnM6IFtcIiwgLi4uZ2VuZXJhdGVMb2FkZXJDb2RlKGxvYWRlci5sb2FkZXJzKSwgXCJdLFwiKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxvYWRlckxpbmVzLnB1c2goXCJ9LFwiKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGxvYWRlckxpbmVzO1xuICAgIH07XG5cbiAgICBsaW5lcy5wdXNoKC4uLmdlbmVyYXRlTG9hZGVyQ29kZShsb2FkZXJzKSk7XG4gICAgbGluZXMucHVzaChgXWApO1xuXG4gICAgcmV0dXJuIGxpbmVzLmpvaW4oXCJcXG5cIik7XG4gIH1cblxuICAvKlxuICAgIHN1YnNldCBTRUxFQ1QvSk9JTi9MT0FERVIg6rKw6rO8IOumrO2EtFxuICAqL1xuICBnZXRTdWJzZXRRdWVyeShzdWJzZXRLZXk6IHN0cmluZyk6IFN1YnNldFF1ZXJ5IHtcbiAgICBjb25zdCBzdWJzZXQgPSB0aGlzLmdldFN1YnNldEZpZWxkc0ZvclF1ZXJ5KHN1YnNldEtleSk7XG5cbiAgICBjb25zdCByZXN1bHQ6IFN1YnNldFF1ZXJ5ID0gdGhpcy5yZXNvbHZlU3Vic2V0UXVlcnkoXCJcIiwgc3Vic2V0KTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgLypcbiAgICovXG4gIHJlc29sdmVTdWJzZXRRdWVyeShcbiAgICBwcmVmaXg6IHN0cmluZyxcbiAgICBmaWVsZHM6IHN0cmluZ1tdLFxuICAgIGlzQWxyZWFkeU91dGVySm9pbmVkOiBib29sZWFuID0gZmFsc2UsXG4gICk6IFN1YnNldFF1ZXJ5IHtcbiAgICAvLyBwcmVmaXgg7LmY7ZmYIChwcmVmaXjripQgVG9PbmVSZWxhdGlvbuydtCDrs7XsiJjroZwg67aZ7J2AIOqyveyasCDrqqjrkZAgX1/roZwg67OA6rK965CoKVxuICAgIHByZWZpeCA9IHByZWZpeC5yZXBsYWNlKC9cXC4vZywgXCJfX1wiKTtcblxuICAgIC8vIOyEnOu4jOyFi+ydhCAx646B7Iqk66eMIOu2hOumrO2VmOyXrCDqt7jro7ntlZFcbiAgICBjb25zdCBzdWJzZXRHcm91cCA9IGdyb3VwKGZpZWxkcywgKGZpZWxkKSA9PiB7XG4gICAgICBpZiAoZmllbGQuaW5jbHVkZXMoXCIuXCIpKSB7XG4gICAgICAgIGNvbnN0IFtyZWxdID0gZmllbGQuc3BsaXQoXCIuXCIpO1xuICAgICAgICByZXR1cm4gcmVsO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIFwiXCI7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBjb25zdCByZXN1bHQgPSBPYmplY3Qua2V5cyhzdWJzZXRHcm91cCkucmVkdWNlKFxuICAgICAgKHIsIGdyb3VwS2V5KSA9PiB7XG4gICAgICAgIGNvbnN0IGZpZWxkcyA9IHN1YnNldEdyb3VwW2dyb3VwS2V5XTtcbiAgICAgICAgYXNzZXJ0KGZpZWxkcyAhPT0gdW5kZWZpbmVkLCBcImZpZWxkcyBpcyB1bmRlZmluZWRcIik7XG5cbiAgICAgICAgLy8g7ZiE7J6sIO2FjOydtOu4lCDtlYTrk5zshYvsnYAgc2VsZWN0LCB2aXJ0dWFs7JeQIOy2lOqwgO2VmOqzoCDrpqzthLRcbiAgICAgICAgaWYgKGdyb3VwS2V5ID09PSBcIlwiKSB7XG4gICAgICAgICAgY29uc3QgcmVhbEZpZWxkcyA9IGZpZWxkcy5maWx0ZXIoKGZpZWxkKSA9PiAhaXNWaXJ0dWFsUHJvcCh0aGlzLnByb3BzRGljdFtmaWVsZF0pKTtcbiAgICAgICAgICAvLyB2aXJ0dWFsVHlwZTogXCJjb2RlXCIgKOuYkOuKlCB1bmRlZmluZWQp7J24IHZpcnR1YWwgcHJvcOunjCByLnZpcnR1YWzsl5Ag7LaU6rCAXG4gICAgICAgICAgLy8gdmlydHVhbFR5cGU6IFwicXVlcnlcIuyduCDqsr3smrAg7IKs7Jqp7J6Q6rCAIGFwcGVuZFNlbGVjdOuhnCDsp4HsoJEg7LaU6rCA7ZWY66+A66GcIOygnOyZuFxuICAgICAgICAgIGNvbnN0IHZpcnR1YWxDb2RlRmllbGRzID0gZmllbGRzLmZpbHRlcigoZmllbGQpID0+XG4gICAgICAgICAgICBpc1ZpcnR1YWxDb2RlUHJvcCh0aGlzLnByb3BzRGljdFtmaWVsZF0pLFxuICAgICAgICAgICk7XG5cbiAgICAgICAgICBpZiAocHJlZml4ID09PSBcIlwiKSB7XG4gICAgICAgICAgICAvLyDtmITsnqwg7YWM7J2067iU7J24IOqyveyasFxuICAgICAgICAgICAgci5zZWxlY3QgPSByLnNlbGVjdC5jb25jYXQocmVhbEZpZWxkcy5tYXAoKGZpZWxkKSA9PiB0aGlzLmdldEZ1bGxGaWVsZE5hbWUoZmllbGQpKSk7XG4gICAgICAgICAgICByLnZpcnR1YWwgPSByLnZpcnR1YWwuY29uY2F0KHZpcnR1YWxDb2RlRmllbGRzKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8g64SY7Ja07JioIO2FjOydtOu4lOyduCDqsr3smrBcbiAgICAgICAgICAgIHIuc2VsZWN0ID0gci5zZWxlY3QuY29uY2F0KFxuICAgICAgICAgICAgICByZWFsRmllbGRzLm1hcCgoZmllbGQpID0+IGAke3ByZWZpeH0uJHtmaWVsZH0gYXMgJHtwcmVmaXh9X18ke2ZpZWxkfWApLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4gcjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHJlbGF0aW9uID0gdGhpcy5yZWxhdGlvbnNbZ3JvdXBLZXldO1xuICAgICAgICBpZiAocmVsYXRpb24gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihg7KG07J6s7ZWY7KeAIOyViuuKlCByZWxhdGlvbiDssLjsobAgJHtncm91cEtleX1gKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCByZWxFbnRpdHkgPSBFbnRpdHlNYW5hZ2VyLmdldChyZWxhdGlvbi53aXRoKTtcblxuICAgICAgICBpZiAoaXNPbmVUb09uZVJlbGF0aW9uUHJvcChyZWxhdGlvbikgfHwgaXNCZWxvbmdzVG9PbmVSZWxhdGlvblByb3AocmVsYXRpb24pKSB7XG4gICAgICAgICAgLy8gLU9uZSBSZWxhdGlvbjogSk9JTiDsnLzroZwg7LKY66asXG4gICAgICAgICAgY29uc3QgcmVsRmllbGRzID0gZmllbGRzLm1hcCgoZmllbGQpID0+IGZpZWxkLnNwbGl0KFwiLlwiKS5zbGljZSgxKS5qb2luKFwiLlwiKSk7XG5cbiAgICAgICAgICAvLyAtT25lIFJlbGF0aW9u7JeQ7IScIGlkIO2VhOuTnOunjCDssLjsobDtlZjripQg6rK97JqwIOumtOugiOydtOyFmCDrhJjquLDsp4Ag7JWK6rOgIOumrO2EtFxuICAgICAgICAgIGlmIChyZWxGaWVsZHMubGVuZ3RoID09PSAxICYmIHJlbEZpZWxkc1swXSA9PT0gXCJpZFwiKSB7XG4gICAgICAgICAgICBpZiAocHJlZml4ID09PSBcIlwiKSB7XG4gICAgICAgICAgICAgIHIuc2VsZWN0ID0gci5zZWxlY3QuY29uY2F0KGAke3RoaXMudGFibGV9LiR7Z3JvdXBLZXl9X2lkYCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICByLnNlbGVjdCA9IHIuc2VsZWN0LmNvbmNhdChgJHtwcmVmaXh9LiR7Z3JvdXBLZXl9X2lkIGFzICR7cHJlZml4fV9fJHtncm91cEtleX1faWRgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiByO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIGlubmVyT3JPdXRlclxuICAgICAgICAgIGNvbnN0IGlubmVyT3JPdXRlciA9ICgoKSA9PiB7XG4gICAgICAgICAgICBpZiAoaXNBbHJlYWR5T3V0ZXJKb2luZWQpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIFwib3V0ZXJcIjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGlzT25lVG9PbmVSZWxhdGlvblByb3AocmVsYXRpb24pKSB7XG4gICAgICAgICAgICAgIGlmIChyZWxhdGlvbi5oYXNKb2luQ29sdW1uICYmICEocmVsYXRpb24ubnVsbGFibGUgPz8gZmFsc2UpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFwiaW5uZXJcIjtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gXCJvdXRlclwiO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBpZiAocmVsYXRpb24ubnVsbGFibGUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gXCJvdXRlclwiO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiBcImlubmVyXCI7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KSgpO1xuICAgICAgICAgIGNvbnN0IHJlbFN1YnNldFF1ZXJ5ID0gcmVsRW50aXR5LnJlc29sdmVTdWJzZXRRdWVyeShcbiAgICAgICAgICAgIGAke3ByZWZpeCAhPT0gXCJcIiA/IGAke3ByZWZpeH0uYCA6IFwiXCJ9JHtncm91cEtleX1gLFxuICAgICAgICAgICAgcmVsRmllbGRzLFxuICAgICAgICAgICAgaW5uZXJPck91dGVyID09PSBcIm91dGVyXCIsXG4gICAgICAgICAgKTtcbiAgICAgICAgICByLnNlbGVjdCA9IHIuc2VsZWN0LmNvbmNhdChyZWxTdWJzZXRRdWVyeS5zZWxlY3QpO1xuICAgICAgICAgIHIudmlydHVhbCA9IHIudmlydHVhbC5jb25jYXQocmVsU3Vic2V0UXVlcnkudmlydHVhbCk7XG5cbiAgICAgICAgICBjb25zdCBqb2luQXMgPSBwcmVmaXggPT09IFwiXCIgPyBncm91cEtleSA6IGAke3ByZWZpeH1fXyR7Z3JvdXBLZXl9YDtcbiAgICAgICAgICBjb25zdCBmcm9tVGFibGUgPSBwcmVmaXggPT09IFwiXCIgPyB0aGlzLnRhYmxlIDogcHJlZml4O1xuXG4gICAgICAgICAgbGV0IGpvaW5DbGF1c2U6XG4gICAgICAgICAgICB8IHtcbiAgICAgICAgICAgICAgICBmcm9tOiBzdHJpbmc7XG4gICAgICAgICAgICAgICAgdG86IHN0cmluZztcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfCB7XG4gICAgICAgICAgICAgICAgY3VzdG9tOiBzdHJpbmc7XG4gICAgICAgICAgICAgIH07XG4gICAgICAgICAgaWYgKHJlbGF0aW9uLmN1c3RvbUpvaW5DbGF1c2UpIHtcbiAgICAgICAgICAgIGpvaW5DbGF1c2UgPSB7XG4gICAgICAgICAgICAgIGN1c3RvbTogcmVsYXRpb24uY3VzdG9tSm9pbkNsYXVzZSxcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGxldCBmcm9tOiBzdHJpbmcsIHRvOiBzdHJpbmc7XG4gICAgICAgICAgICBpZiAoaXNPbmVUb09uZVJlbGF0aW9uUHJvcChyZWxhdGlvbikpIHtcbiAgICAgICAgICAgICAgaWYgKHJlbGF0aW9uLmhhc0pvaW5Db2x1bW4pIHtcbiAgICAgICAgICAgICAgICBmcm9tID0gYCR7ZnJvbVRhYmxlfS4ke3JlbGF0aW9uLm5hbWV9X2lkYDtcbiAgICAgICAgICAgICAgICB0byA9IGAke2pvaW5Bc30uaWRgO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGZyb20gPSBgJHtmcm9tVGFibGV9LmlkYDtcbiAgICAgICAgICAgICAgICB0byA9IGAke2pvaW5Bc30uJHtpbmZsZWN0aW9uLnVuZGVyc2NvcmUodGhpcy5uYW1lcy5mcy5yZXBsYWNlKC8tL2csIFwiX1wiKSl9X2lkYDtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgZnJvbSA9IGAke2Zyb21UYWJsZX0uJHtyZWxhdGlvbi5uYW1lfV9pZGA7XG4gICAgICAgICAgICAgIHRvID0gYCR7am9pbkFzfS5pZGA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBqb2luQ2xhdXNlID0ge1xuICAgICAgICAgICAgICBmcm9tLFxuICAgICAgICAgICAgICB0byxcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgci5qb2lucy5wdXNoKHtcbiAgICAgICAgICAgIGFzOiBqb2luQXMsXG4gICAgICAgICAgICBqb2luOiBpbm5lck9yT3V0ZXIsXG4gICAgICAgICAgICB0YWJsZTogcmVsRW50aXR5LnRhYmxlLFxuICAgICAgICAgICAgLi4uam9pbkNsYXVzZSxcbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIC8vIEJlbG9uZ3NUb09uZSDrsJHsl5AgSGFzTWFueeqwgCDrtpnsnYAg6rK97JqwXG4gICAgICAgICAgaWYgKHJlbFN1YnNldFF1ZXJ5LmxvYWRlcnMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgY29uc3QgY29udmVydGVkTG9hZGVycyA9IHJlbFN1YnNldFF1ZXJ5LmxvYWRlcnMubWFwKChsb2FkZXIpID0+IHtcbiAgICAgICAgICAgICAgY29uc3QgbmV3QXMgPSBbZ3JvdXBLZXksIGxvYWRlci5hc10uam9pbihcIl9fXCIpO1xuICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIGFzOiBuZXdBcyxcbiAgICAgICAgICAgICAgICB0YWJsZTogbG9hZGVyLnRhYmxlLFxuICAgICAgICAgICAgICAgIG1hbnlKb2luOiBsb2FkZXIubWFueUpvaW4sXG4gICAgICAgICAgICAgICAgb25lSm9pbnM6IGxvYWRlci5vbmVKb2lucyxcbiAgICAgICAgICAgICAgICBzZWxlY3Q6IGxvYWRlci5zZWxlY3QsXG4gICAgICAgICAgICAgICAgbG9hZGVyczogbG9hZGVyLmxvYWRlcnMsXG4gICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgci5sb2FkZXJzID0gWy4uLnIubG9hZGVycywgLi4uY29udmVydGVkTG9hZGVyc107XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgci5qb2lucyA9IHIuam9pbnMuY29uY2F0KHJlbFN1YnNldFF1ZXJ5LmpvaW5zKTtcbiAgICAgICAgfSBlbHNlIGlmIChpc0hhc01hbnlSZWxhdGlvblByb3AocmVsYXRpb24pIHx8IGlzTWFueVRvTWFueVJlbGF0aW9uUHJvcChyZWxhdGlvbikpIHtcbiAgICAgICAgICAvLyAtTWFueSBSZWxhdGlvbjogTG9hZGVyIOuhnCDsspjrpqxcbiAgICAgICAgICBjb25zdCByZWxGaWVsZHMgPSBmaWVsZHMubWFwKChmaWVsZCkgPT4gZmllbGQuc3BsaXQoXCIuXCIpLnNsaWNlKDEpLmpvaW4oXCIuXCIpKTtcbiAgICAgICAgICBjb25zdCByZWxTdWJzZXRRdWVyeSA9IHJlbEVudGl0eS5yZXNvbHZlU3Vic2V0UXVlcnkoXCJcIiwgcmVsRmllbGRzKTtcblxuICAgICAgICAgIGxldCBtYW55Sm9pbjogU3Vic2V0UXVlcnlbXCJsb2FkZXJzXCJdW251bWJlcl1bXCJtYW55Sm9pblwiXTtcbiAgICAgICAgICBpZiAoaXNIYXNNYW55UmVsYXRpb25Qcm9wKHJlbGF0aW9uKSkge1xuICAgICAgICAgICAgY29uc3QgZnJvbUNvbCA9IHJlbGF0aW9uPy5mcm9tQ29sdW1uID8/IFwiaWRcIjtcbiAgICAgICAgICAgIG1hbnlKb2luID0ge1xuICAgICAgICAgICAgICBmcm9tVGFibGU6IHRoaXMudGFibGUsXG4gICAgICAgICAgICAgIGZyb21Db2wsXG4gICAgICAgICAgICAgIGlkRmllbGQ6IHByZWZpeCA9PT0gXCJcIiA/IGAke2Zyb21Db2x9YCA6IGAke3ByZWZpeH1fXyR7ZnJvbUNvbH1gLFxuICAgICAgICAgICAgICB0b1RhYmxlOiByZWxFbnRpdHkudGFibGUsXG4gICAgICAgICAgICAgIHRvQ29sOiByZWxhdGlvbi5qb2luQ29sdW1uLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICB9IGVsc2UgaWYgKGlzTWFueVRvTWFueVJlbGF0aW9uUHJvcChyZWxhdGlvbikpIHtcbiAgICAgICAgICAgIG1hbnlKb2luID0ge1xuICAgICAgICAgICAgICBmcm9tVGFibGU6IHRoaXMudGFibGUsXG4gICAgICAgICAgICAgIGZyb21Db2w6IFwiaWRcIixcbiAgICAgICAgICAgICAgaWRGaWVsZDogcHJlZml4ID09PSBcIlwiID8gYGlkYCA6IGAke3ByZWZpeH1fX2lkYCxcbiAgICAgICAgICAgICAgdGhyb3VnaDoge1xuICAgICAgICAgICAgICAgIHRhYmxlOiByZWxhdGlvbi5qb2luVGFibGUsXG4gICAgICAgICAgICAgICAgZnJvbUNvbDogYCR7aW5mbGVjdGlvbi5zaW5ndWxhcml6ZSh0aGlzLnRhYmxlKX1faWRgLFxuICAgICAgICAgICAgICAgIHRvQ29sOiBgJHtpbmZsZWN0aW9uLnNpbmd1bGFyaXplKHJlbEVudGl0eS50YWJsZSl9X2lkYCxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgdG9UYWJsZTogcmVsRW50aXR5LnRhYmxlLFxuICAgICAgICAgICAgICB0b0NvbDogXCJpZFwiLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgci5sb2FkZXJzLnB1c2goe1xuICAgICAgICAgICAgYXM6IGdyb3VwS2V5LFxuICAgICAgICAgICAgdGFibGU6IHJlbEVudGl0eS50YWJsZSxcbiAgICAgICAgICAgIG1hbnlKb2luLFxuICAgICAgICAgICAgb25lSm9pbnM6IHJlbFN1YnNldFF1ZXJ5LmpvaW5zLFxuICAgICAgICAgICAgc2VsZWN0OiByZWxTdWJzZXRRdWVyeS5zZWxlY3QsXG4gICAgICAgICAgICBsb2FkZXJzOiByZWxTdWJzZXRRdWVyeS5sb2FkZXJzLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHI7XG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBzZWxlY3Q6IFtdLFxuICAgICAgICB2aXJ0dWFsOiBbXSxcbiAgICAgICAgam9pbnM6IFtdLFxuICAgICAgICBsb2FkZXJzOiBbXSxcbiAgICAgIH0gYXMgU3Vic2V0UXVlcnksXG4gICAgKTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgLypcbiAgICBGaWVsZEV4cHJbXSDsnYQgRW50aXR5UHJvcE5vZGVbXSDroZwg67OA7ZmYXG4gICovXG4gIGZpZWxkRXhwcnNUb1Byb3BOb2RlcyhmaWVsZEV4cHJzOiBzdHJpbmdbXSwgZW50aXR5OiBFbnRpdHkgPSB0aGlzKTogRW50aXR5UHJvcE5vZGVbXSB7XG4gICAgY29uc3QgZ3JvdXBzID0gZmllbGRFeHBycy5yZWR1Y2UoXG4gICAgICAocmVzdWx0LCBmaWVsZEV4cHIpID0+IHtcbiAgICAgICAgbGV0IGtleTogc3RyaW5nLCB2YWx1ZTogc3RyaW5nLCBlbHNlRXhwcjogc3RyaW5nW107XG4gICAgICAgIGlmIChmaWVsZEV4cHIuaW5jbHVkZXMoXCIuXCIpKSB7XG4gICAgICAgICAgW2tleSwgLi4uZWxzZUV4cHJdID0gZmllbGRFeHByLnNwbGl0KFwiLlwiKTtcbiAgICAgICAgICB2YWx1ZSA9IGVsc2VFeHByLmpvaW4oXCIuXCIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGtleSA9IFwiXCI7XG4gICAgICAgICAgdmFsdWUgPSBmaWVsZEV4cHI7XG4gICAgICAgIH1cbiAgICAgICAgcmVzdWx0W2tleV0gPSAocmVzdWx0W2tleV0gPz8gW10pLmNvbmNhdCh2YWx1ZSk7XG5cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgIH0sXG4gICAgICB7fSBhcyB7XG4gICAgICAgIFtrOiBzdHJpbmddOiBzdHJpbmdbXTtcbiAgICAgIH0sXG4gICAgKTtcblxuICAgIHJldHVybiBPYmplY3Qua2V5cyhncm91cHMpLmZsYXRNYXA8RW50aXR5UHJvcE5vZGUsIEVudGl0eVByb3BOb2RlW10+KChrZXkpID0+IHtcbiAgICAgIGNvbnN0IGdyb3VwID0gZ3JvdXBzW2tleV07XG5cbiAgICAgIC8vIOydvOuwmCBwcm9wIOyymOumrFxuICAgICAgaWYgKGtleSA9PT0gXCJcIikge1xuICAgICAgICByZXR1cm4gZ3JvdXAubWFwKChwcm9wTmFtZSkgPT4ge1xuICAgICAgICAgIGNvbnN0IHByb3AgPSBlbnRpdHkucHJvcHMuZmluZCgocCkgPT4gcC5uYW1lID09PSBwcm9wTmFtZSk7XG4gICAgICAgICAgaWYgKHByb3AgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgICBgJHtlbnRpdHkuaWR9IC0tIOyemOuqu+uQnCBGaWVsZEV4cHIgJyR7cHJvcE5hbWV9JyAo7IKs7JqpIOqwgOuKpe2VnCBwcm9wczogJHtlbnRpdHkucHJvcHMubWFwKChwKSA9PiBwLm5hbWUpLmpvaW4oXCIsIFwiKX0pYCxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBub2RlVHlwZTogXCJwbGFpblwiIGFzIGNvbnN0LFxuICAgICAgICAgICAgcHJvcCxcbiAgICAgICAgICB9O1xuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgLy8gcmVsYXRpb24gcHJvcCDsspjrpqxcbiAgICAgIGNvbnN0IHByb3AgPSBlbnRpdHkucHJvcHNEaWN0W2tleV07XG4gICAgICBpZiAoIWlzUmVsYXRpb25Qcm9wKHByb3ApKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihg7J6Y66q765CcIEZpZWxkRXhwciAke2tleX0uJHtncm91cFswXX1gKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHJlbEVudGl0eSA9IEVudGl0eU1hbmFnZXIuZ2V0KHByb3Aud2l0aCk7XG5cbiAgICAgIC8vIHJlbGF0aW9uIC1PbmUg7JeQIGlkIO2VhOuTnCDtlZjrgpjsnbgg6rK97JqwXG4gICAgICBpZiAoaXNCZWxvbmdzVG9PbmVSZWxhdGlvblByb3AocHJvcCkgfHwgaXNPbmVUb09uZVJlbGF0aW9uUHJvcChwcm9wKSkge1xuICAgICAgICBpZiAoZ3JvdXAubGVuZ3RoID09PSAxICYmIChncm91cFswXSA9PT0gXCJpZFwiIHx8IGdyb3VwWzBdID09PSBcImlkP1wiKSkge1xuICAgICAgICAgIC8vIGlkIO2VmOuCmOunjCDsnojripTsp4Ag7LK07YGs7ZW07IScLCDtlZjrgpjrp4wg7J6I7Jy866m0IOyDgeychCBwcm9w7Jy866GcIGlk66W8IOumrO2EtFxuICAgICAgICAgIGNvbnN0IGlkUHJvcCA9IHJlbEVudGl0eS5wcm9wc0RpY3QuaWQ7XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIG5vZGVUeXBlOiBcInBsYWluXCIgYXMgY29uc3QsXG4gICAgICAgICAgICBwcm9wOiB7XG4gICAgICAgICAgICAgIC4uLmlkUHJvcCxcbiAgICAgICAgICAgICAgbmFtZTogYCR7a2V5fV9pZGAsXG4gICAgICAgICAgICAgIG51bGxhYmxlOiBwcm9wLm51bGxhYmxlLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIC1PbmUg6re47Jm47J2YIOqyveyasCBvYmplY3TroZwg66as7YS0XG4gICAgICAvLyAtTWFueeydmCDqsr3smrAgYXJyYXnroZwg66as7YS0XG4gICAgICAvLyBSZWN1cnNpdmUg66GcIOuOgeyKpCDsspjrpqxcbiAgICAgIGNvbnN0IGNoaWxkcmVuID0gdGhpcy5maWVsZEV4cHJzVG9Qcm9wTm9kZXMoZ3JvdXAsIHJlbEVudGl0eSk7XG4gICAgICBjb25zdCBub2RlVHlwZSA9XG4gICAgICAgIGlzQmVsb25nc1RvT25lUmVsYXRpb25Qcm9wKHByb3ApIHx8IGlzT25lVG9PbmVSZWxhdGlvblByb3AocHJvcClcbiAgICAgICAgICA/IChcIm9iamVjdFwiIGFzIGNvbnN0KVxuICAgICAgICAgIDogKFwiYXJyYXlcIiBhcyBjb25zdCk7XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIG5vZGVUeXBlLFxuICAgICAgICBwcm9wLFxuICAgICAgICBjaGlsZHJlbixcbiAgICAgIH07XG4gICAgfSk7XG4gIH1cblxuICBnZXRGaWVsZEV4cHJzKHByZWZpeCA9IFwiXCIsIG1heERlcHRoOiBudW1iZXIgPSAzLCBmcm9tczogc3RyaW5nW10gPSBbXSk6IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gdGhpcy5wcm9wc1xuICAgICAgLmZsYXRNYXAoKHByb3ApID0+IHtcbiAgICAgICAgY29uc3QgcHJvcE5hbWUgPSBbcHJlZml4LCBwcm9wLm5hbWVdLmZpbHRlcigodikgPT4gdiAhPT0gXCJcIikuam9pbihcIi5cIik7XG4gICAgICAgIGlmIChwcm9wTmFtZSA9PT0gcHJlZml4KSB7XG4gICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGlzUmVsYXRpb25Qcm9wKHByb3ApKSB7XG4gICAgICAgICAgaWYgKG1heERlcHRoIDwgMCkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChmcm9tcy5pbmNsdWRlcyhwcm9wLndpdGgpKSB7XG4gICAgICAgICAgICAvLyDsl63rsKntlqUgcmVsYXRpb27snbgg6rK97JqwIOygnOyZuFxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgfVxuICAgICAgICAgIC8vIOygleuwqe2WpSByZWxhdGlvbuyduCDqsr3smrAgcmVjdXJzaXZlIOy9nFxuICAgICAgICAgIGNvbnN0IHJlbE1kID0gRW50aXR5TWFuYWdlci5nZXQocHJvcC53aXRoKTtcbiAgICAgICAgICByZXR1cm4gcmVsTWQuZ2V0RmllbGRFeHBycyhwcm9wTmFtZSwgbWF4RGVwdGggLSAxLCBbLi4uZnJvbXMsIHRoaXMuaWRdKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcHJvcE5hbWU7XG4gICAgICB9KVxuICAgICAgLmZpbHRlcigoZikgPT4gZiAhPT0gbnVsbCk7XG4gIH1cblxuICAvKipcbiAgICogUmVsYXRpb24gcHJvcOydtCDtmITsnqwg7YWM7J2067iU7JeQIEZLIOy7rOufvOydhCDsg53shLHtlZjripTsp4Ag7ZmV7J24XG4gICAqKEJlbG9uZ3NUb09uZSDrmJDripQgT25lVG9PbmUoaGFzSm9pbkNvbHVtbj10cnVlKeyduCDqsr3smrAgRksg7IOd7ISxKVxuICAgKi9cbiAgcHJpdmF0ZSBoYXNGb3JlaWduS2V5KHByb3A6IFJlbGF0aW9uUHJvcCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAoXG4gICAgICBwcm9wLnJlbGF0aW9uVHlwZSA9PT0gXCJCZWxvbmdzVG9PbmVcIiB8fFxuICAgICAgKHByb3AucmVsYXRpb25UeXBlID09PSBcIk9uZVRvT25lXCIgJiYgcHJvcC5oYXNKb2luQ29sdW1uKVxuICAgICk7XG4gIH1cblxuICBnZXRUYWJsZUNvbHVtbnMoKTogeyBuYW1lOiBzdHJpbmc7IHR5cGU6IHN0cmluZyB9W10ge1xuICAgIHJldHVybiB0aGlzLnByb3BzXG4gICAgICAubWFwKChwcm9wKSA9PiB7XG4gICAgICAgIGlmIChwcm9wLnR5cGUgPT09IFwicmVsYXRpb25cIikge1xuICAgICAgICAgIGlmICh0aGlzLmhhc0ZvcmVpZ25LZXkocHJvcCkpIHtcbiAgICAgICAgICAgIHJldHVybiB7IG5hbWU6IGAke3Byb3AubmFtZX1faWRgLCB0eXBlOiBcImludF91bnNpZ25lZFwiIH07XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4geyBuYW1lOiBwcm9wLm5hbWUsIHR5cGU6IHByb3AudHlwZSB9O1xuICAgICAgfSlcbiAgICAgIC5maWx0ZXIobm9uTnVsbGFibGUpO1xuICB9XG5cbiAgLyoqXG4gICAqIEVudGl0eeyXkCDsoJXsnZjrkJwg66qo65OgIHZlY3RvciDtg4DsnoUg7Lus65+8IOuwmO2ZmFxuICAgKi9cbiAgZ2V0VmVjdG9yQ29sdW1ucygpOiBFbnRpdHlQcm9wW10ge1xuICAgIHJldHVybiB0aGlzLnByb3BzLmZpbHRlcigocCkgPT4gcC50eXBlID09PSBcInZlY3RvclwiKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDtirnsoJUgdmVjdG9yIOy7rOufvCDrsJjtmZhcbiAgICogQHBhcmFtIGNvbHVtbk5hbWUgLSDsu6zrn7zrqoUgKOyDneuetSDsi5wg7LKrIOuyiOynuCB2ZWN0b3Ig7Lus65+8KVxuICAgKi9cbiAgZ2V0VmVjdG9yQ29sdW1uKGNvbHVtbk5hbWU/OiBzdHJpbmcpOiBFbnRpdHlQcm9wIHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCB2ZWN0b3JQcm9wcyA9IHRoaXMuZ2V0VmVjdG9yQ29sdW1ucygpO1xuICAgIGlmIChjb2x1bW5OYW1lKSB7XG4gICAgICByZXR1cm4gdmVjdG9yUHJvcHMuZmluZCgocCkgPT4gcC5uYW1lID09PSBjb2x1bW5OYW1lKTtcbiAgICB9XG4gICAgcmV0dXJuIHZlY3RvclByb3BzWzBdO1xuICB9XG5cbiAgLyoqXG4gICAqIO2VhO2EsOungSDqsIDriqXtlZwgcHJvcHMg67CY7ZmYXG4gICAqXG4gICAqIC0g7J2867CYIHByb3BcbiAgICogLSBGS+ulvCDsg53shLHtlZjripQgcmVsYXRpb24gKEJlbG9uZ3NUb09uZSwgT25lVG9PbmUgd2l0aCBoYXNKb2luQ29sdW1uKVxuICAgKiAgIOKGkiB7bmFtZX1faWQg7ZiV7YOc7J2YIOqwgOyDgSBpbnRlZ2VyIHByb3DsnLzroZwg67OA7ZmYXG4gICAqL1xuICBnZXRGaWx0ZXJhYmxlUHJvcHMoKTogRW50aXR5UHJvcFtdIHtcbiAgICByZXR1cm4gdGhpcy5wcm9wcy5mbGF0TWFwKChwcm9wKTogRW50aXR5UHJvcCB8IEVudGl0eVByb3BbXSA9PiB7XG4gICAgICAvLyBWaXJ0dWFsIHByb3Ag7KCc7Jm4XG4gICAgICBpZiAoaXNWaXJ0dWFsUHJvcChwcm9wKSkge1xuICAgICAgICByZXR1cm4gW107XG4gICAgICB9XG5cbiAgICAgIC8vIFJlbGF0aW9uIHByb3Ag7LKY66asXG4gICAgICBpZiAoaXNSZWxhdGlvblByb3AocHJvcCkpIHtcbiAgICAgICAgLy8gRkvrpbwg7IOd7ISx7ZWY64qUIHJlbGF0aW9u66eMIO2PrO2VqFxuICAgICAgICBpZiAodGhpcy5oYXNGb3JlaWduS2V5KHByb3ApKSB7XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIG5hbWU6IGAke3Byb3AubmFtZX1faWRgLFxuICAgICAgICAgICAgdHlwZTogXCJpbnRlZ2VyXCIsXG4gICAgICAgICAgICBudWxsYWJsZTogcHJvcC5udWxsYWJsZSxcbiAgICAgICAgICB9IGFzIEVudGl0eVByb3A7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgfVxuXG4gICAgICAvLyDsnbzrsJggcHJvcCDsspjrpqxcbiAgICAgIHJldHVybiBwcm9wO1xuICAgIH0pO1xuICB9XG5cbiAgYXN5bmMgcmVnaXN0ZXJNb2R1bGVQYXRocygpIHtcbiAgICBjb25zdCBiYXNlUGF0aCA9IGAke3RoaXMubmFtZXMucGFyZW50RnN9YDtcblxuICAgIC8vIGJhc2Utc2NoZW1lXG4gICAgRW50aXR5TWFuYWdlci5zZXRNb2R1bGVQYXRoKGAke3RoaXMuaWR9QmFzZVNjaGVtYWAsIGBzb25hbXUuZ2VuZXJhdGVkYCk7XG5cbiAgICAvLyBzdWJzZXRcbiAgICBpZiAoT2JqZWN0LmtleXModGhpcy5zdWJzZXRzKS5sZW5ndGggPiAwKSB7XG4gICAgICBFbnRpdHlNYW5hZ2VyLnNldE1vZHVsZVBhdGgoYCR7dGhpcy5pZH1TdWJzZXRLZXlgLCBgc29uYW11LmdlbmVyYXRlZGApO1xuICAgICAgRW50aXR5TWFuYWdlci5zZXRNb2R1bGVQYXRoKGAke3RoaXMuaWR9U3Vic2V0TWFwcGluZ2AsIGBzb25hbXUuZ2VuZXJhdGVkYCk7XG4gICAgICBmb3IgKGNvbnN0IHN1YnNldEtleSBvZiBPYmplY3Qua2V5cyh0aGlzLnN1YnNldHMpKSB7XG4gICAgICAgIEVudGl0eU1hbmFnZXIuc2V0TW9kdWxlUGF0aChcbiAgICAgICAgICBgJHt0aGlzLmlkfVN1YnNldCR7c3Vic2V0S2V5LnRvVXBwZXJDYXNlKCl9YCxcbiAgICAgICAgICBgc29uYW11LmdlbmVyYXRlZGAsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gZW51bXNcbiAgICBmb3IgKGNvbnN0IGVudW1JZCBvZiBPYmplY3Qua2V5cyh0aGlzLmVudW1MYWJlbHMpKSB7XG4gICAgICBFbnRpdHlNYW5hZ2VyLnNldE1vZHVsZVBhdGgoZW51bUlkLCBgc29uYW11LmdlbmVyYXRlZGApO1xuICAgIH1cblxuICAgIC8vIHR5cGVzXG4gICAgY29uc3QgdHlwZXNNb2R1bGVQYXRoID0gYCR7YmFzZVBhdGh9LyR7dGhpcy5uYW1lcy5wYXJlbnRGc30udHlwZXNgO1xuICAgIGNvbnN0IHR5cGVzRmlsZVBhdGggPSBwYXRoLmpvaW4oXG4gICAgICBTb25hbXUuYXBpUm9vdFBhdGgsXG4gICAgICBydW50aW1lUGF0aChgZGlzdC9hcHBsaWNhdGlvbi8ke3R5cGVzTW9kdWxlUGF0aH0uanNgKSxcbiAgICApO1xuXG4gICAgaWYgKGF3YWl0IGV4aXN0cyh0eXBlc0ZpbGVQYXRoKSkge1xuICAgICAgY29uc3QgaW1wb3J0ZWRNZW1iZXJzID0gYXdhaXQgaW1wb3J0TWVtYmVyczx6LlpvZFR5cGVBbnk+KHR5cGVzRmlsZVBhdGgpO1xuICAgICAgdGhpcy50eXBlcyA9IE9iamVjdC5mcm9tRW50cmllcyhcbiAgICAgICAgaW1wb3J0ZWRNZW1iZXJzLm1hcCgoeyBuYW1lLCB2YWx1ZSB9KSA9PiB7XG4gICAgICAgICAgRW50aXR5TWFuYWdlci5zZXRNb2R1bGVQYXRoKG5hbWUsIHR5cGVzTW9kdWxlUGF0aCk7XG4gICAgICAgICAgcmV0dXJuIFtuYW1lLCB2YWx1ZV07XG4gICAgICAgIH0pLFxuICAgICAgKSBhcyB7IFtuYW1lOiBzdHJpbmddOiB6LlpvZFR5cGVBbnkgfTtcbiAgICB9XG4gIH1cblxuICByZWdpc3RlclRhYmxlU3BlY3MoKTogdm9pZCB7XG4gICAgLy8g7KGw7J24IO2FjOydtOu4lCDsnbjrjbHsiqQg7KCc7Jm4ICjsu6zrn7wg7J2066aE7JeQICcuJ+ydtCDtj6ztlajrkJwg6rK97JqwKVxuICAgIGNvbnN0IHVuaXF1ZUluZGV4ZXMgPSB0aGlzLmluZGV4ZXNcbiAgICAgIC5maWx0ZXIoKGlkeCkgPT4gaWR4LnR5cGUgPT09IFwidW5pcXVlXCIpXG4gICAgICAuZmlsdGVyKChpZHgpID0+IGlkeC5jb2x1bW5zLmV2ZXJ5KChjb2wpID0+ICFjb2wubmFtZS5pbmNsdWRlcyhcIi5cIikpKTtcblxuICAgIEVudGl0eU1hbmFnZXIuc2V0VGFibGVTcGVjKHtcbiAgICAgIG5hbWU6IHRoaXMudGFibGUsXG4gICAgICB1bmlxdWVJbmRleGVzLFxuICAgICAganNvbkNvbHVtbnM6IHRoaXMucHJvcHMuZmlsdGVyKChwKSA9PiBwLnR5cGUgPT09IFwianNvblwiKS5tYXAoKHApID0+IHAubmFtZSksXG4gICAgfSk7XG4gIH1cblxuICB0b0pzb24oKTogRW50aXR5SnNvbiB7XG4gICAgLy8gc3Vic2V0c+yZgCBzdWJzZXRzSW50ZXJuYWzsnYQgU3Vic2V0RGVmIO2Yle2DnOuhnCDrs7Xsm5AgKGNvbmUg7Y+s7ZWoKVxuICAgIGNvbnN0IHN1YnNldHM6IHsgW2tleTogc3RyaW5nXTogaW1wb3J0KFwiLi4vdHlwZXMvdHlwZXNcIikuU3Vic2V0RGVmIH0gPSB7fTtcbiAgICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyh0aGlzLnN1YnNldHMpKSB7XG4gICAgICBjb25zdCBub3JtYWxGaWVsZHM6IFN1YnNldEZpZWxkW10gPSB0aGlzLnN1YnNldHNba2V5XTtcbiAgICAgIGNvbnN0IGludGVybmFsRmllbGRzOiBTdWJzZXRGaWVsZFtdID0gKHRoaXMuc3Vic2V0c0ludGVybmFsW2tleV0gPz8gW10pLm1hcCgoZmllbGQpID0+ICh7XG4gICAgICAgIGZpZWxkLFxuICAgICAgICBpbnRlcm5hbDogdHJ1ZSxcbiAgICAgIH0pKTtcbiAgICAgIGNvbnN0IGZpZWxkcyA9IFsuLi5ub3JtYWxGaWVsZHMsIC4uLmludGVybmFsRmllbGRzXTtcblxuICAgICAgLy8gY29uZeydtCDsnojsnLzrqbQg7IOI66Gc7Jq0IOqwneyytCDtmJXtg5zroZwsIOyXhuycvOuptCDrsLDsl7Qg7ZiV7YOc66GcXG4gICAgICBpZiAodGhpcy5zdWJzZXRDb25lc1trZXldKSB7XG4gICAgICAgIHN1YnNldHNba2V5XSA9IHtcbiAgICAgICAgICBmaWVsZHMsXG4gICAgICAgICAgY29uZTogdGhpcy5zdWJzZXRDb25lc1trZXldLFxuICAgICAgICB9O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc3Vic2V0c1trZXldID0gZmllbGRzO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIGVudW1z66W8IEVudW1EZWYg7ZiV7YOc66GcIOuzteybkCAoY29uZSDtj6ztlagpXG4gICAgY29uc3QgZW51bXM6IHsgW2tleTogc3RyaW5nXTogaW1wb3J0KFwiLi4vdHlwZXMvdHlwZXNcIikuRW51bURlZiB9ID0ge307XG4gICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZXNdIG9mIE9iamVjdC5lbnRyaWVzKHRoaXMuZW51bUxhYmVscykpIHtcbiAgICAgIC8vIGNvbmXsnbQg7J6I7Jy866m0IOyDiOuhnOyatCDqsJ3ssrQg7ZiV7YOc66GcLCDsl4bsnLzrqbQgUmVjb3JkIO2Yle2DnOuhnFxuICAgICAgaWYgKHRoaXMuZW51bUNvbmVzW2tleV0pIHtcbiAgICAgICAgZW51bXNba2V5XSA9IHtcbiAgICAgICAgICB2YWx1ZXMsXG4gICAgICAgICAgY29uZTogdGhpcy5lbnVtQ29uZXNba2V5XSxcbiAgICAgICAgfTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGVudW1zW2tleV0gPSB2YWx1ZXM7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIGlkOiB0aGlzLmlkLFxuICAgICAgcGFyZW50SWQ6IHRoaXMucGFyZW50SWQsXG4gICAgICB0YWJsZTogdGhpcy50YWJsZSxcbiAgICAgIHRpdGxlOiB0aGlzLnRpdGxlLFxuICAgICAgY29uZTogdGhpcy5jb25lLFxuICAgICAgcHJvcHM6IHRoaXMucHJvcHMsXG4gICAgICBpbmRleGVzOiB0aGlzLmluZGV4ZXMsXG4gICAgICBzdWJzZXRzLFxuICAgICAgZW51bXMsXG4gICAgfTtcbiAgfVxuXG4gIGFzeW5jIHNhdmUoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgLy8gc29ydDogc3Vic2V0c1xuICAgIGNvbnN0IHN1YnNldFJvd3MgPSB0aGlzLmdldFN1YnNldFJvd3MoKTtcbiAgICB0aGlzLnN1YnNldHMgPSBPYmplY3QuZnJvbUVudHJpZXMoXG4gICAgICBPYmplY3QuZW50cmllcyh0aGlzLnN1YnNldHMpLm1hcCgoW3N1YnNldEtleV0pID0+IHtcbiAgICAgICAgcmV0dXJuIFtzdWJzZXRLZXksIHRoaXMuc3Vic2V0Um93c1RvU3Vic2V0RmllbGRzKHN1YnNldFJvd3MsIHN1YnNldEtleSwgZmFsc2UpXTtcbiAgICAgIH0pLFxuICAgICk7XG4gICAgdGhpcy5zdWJzZXRzSW50ZXJuYWwgPSBPYmplY3QuZnJvbUVudHJpZXMoXG4gICAgICBPYmplY3QuZW50cmllcyh0aGlzLnN1YnNldHNJbnRlcm5hbCkubWFwKChbc3Vic2V0S2V5XSkgPT4ge1xuICAgICAgICByZXR1cm4gW3N1YnNldEtleSwgdGhpcy5zdWJzZXRSb3dzVG9TdWJzZXRGaWVsZHMoc3Vic2V0Um93cywgc3Vic2V0S2V5LCB0cnVlKV07XG4gICAgICB9KSxcbiAgICApO1xuXG4gICAgLy8gc2F2ZVxuICAgIGNvbnN0IGpzb25QYXRoID0gcGF0aC5qb2luKFxuICAgICAgU29uYW11LmFwaVJvb3RQYXRoLFxuICAgICAgYHNyYy9hcHBsaWNhdGlvbi8ke3RoaXMubmFtZXMucGFyZW50RnN9LyR7dGhpcy5uYW1lcy5mc30uZW50aXR5Lmpzb25gLFxuICAgICk7XG4gICAgY29uc3QganNvbiA9IHRoaXMudG9Kc29uKCk7XG4gICAgYXdhaXQgd3JpdGVGaWxlKGpzb25QYXRoLCBhd2FpdCBmb3JtYXRDb2RlKEpTT04uc3RyaW5naWZ5KGpzb24pLCBcImpzb25cIiwganNvblBhdGgpKTtcblxuICAgIC8vIHJlbG9hZFxuICAgIGF3YWl0IEVudGl0eU1hbmFnZXIucmVnaXN0ZXIoanNvbik7XG4gIH1cblxuICAvKipcbiAgICog7YWc7ZSM66a/IGNvbmUg66mU7YOA642w7J207YSw66W8IOyDneyEse2VqeuLiOuLpC5cbiAgICpcbiAgICogTExN7J2EIOyCrOyaqe2VmOyngCDslYrqs6AgZmFrZXItbWFwcGluZ3MudHPrpbwg7Zmc7Jqp7ZWY7JesIOq4sOuzuCBjb25l7J2EIOyDneyEse2VqeuLiOuLpC5cbiAgICogc3R1YiBlbnRpdHkg7IOd7ISxIOyLnCDsnpDrj5nsnLzroZwg7Zi47Lac65CY7Ja0IOy1nOyGjO2VnOydmCBjb25lIOuplO2DgOuNsOydtO2EsOulvCDsoJzqs7Xtlanri4jri6QuXG4gICAqXG4gICAqIEBwYXJhbSBsb2NhbGUgLSDsg53shLEg7IucIOyCrOyaqe2VoCBsb2NhbGUgKOq4sOuzuOqwkjogU29uYW11LmNvbmZpZy5pMThuLmRlZmF1bHRMb2NhbGUg65iQ64qUIFwia29cIilcbiAgICovXG4gIGFzeW5jIGdlbmVyYXRlVGVtcGxhdGVDb25lcyhsb2NhbGU/OiBcImtvXCIgfCBcImVuXCIgfCBcImphXCIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCB7IGdlbmVyYXRlVGVtcGxhdGVDb25lcyB9ID0gYXdhaXQgaW1wb3J0KFwiLi9lbnRpdHktdGVtcGxhdGUtY29uZVwiKTtcbiAgICBjb25zdCBjb25maWdMb2NhbGUgPSBTb25hbXUuY29uZmlnLmkxOG4/LmRlZmF1bHRMb2NhbGU7XG4gICAgY29uc3QgZWZmZWN0aXZlTG9jYWxlID1cbiAgICAgIGxvY2FsZSB8fFxuICAgICAgKGNvbmZpZ0xvY2FsZSA9PT0gXCJrb1wiIHx8IGNvbmZpZ0xvY2FsZSA9PT0gXCJlblwiIHx8IGNvbmZpZ0xvY2FsZSA9PT0gXCJqYVwiXG4gICAgICAgID8gY29uZmlnTG9jYWxlXG4gICAgICAgIDogXCJrb1wiKTtcbiAgICBjb25zdCByZXN1bHQgPSBnZW5lcmF0ZVRlbXBsYXRlQ29uZXModGhpcy50b0pzb24oKSwgZWZmZWN0aXZlTG9jYWxlKTtcblxuICAgIC8vIOqysOqzvOulvCBFbnRpdHnsl5Ag7KCB7JqpIChhcHBseUNvbmVz7JmAIOuPmeydvO2VnCDrsKnsi50pXG4gICAgaWYgKHJlc3VsdC5lbnRpdHlDb25lKSB7XG4gICAgICB0aGlzLmNvbmUgPSByZXN1bHQuZW50aXR5Q29uZTtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IFtwcm9wTmFtZSwgY29uZV0gb2YgT2JqZWN0LmVudHJpZXMocmVzdWx0LnByb3BDb25lcykpIHtcbiAgICAgIGNvbnN0IHByb3AgPSB0aGlzLnByb3BzLmZpbmQoKHApID0+IHAubmFtZSA9PT0gcHJvcE5hbWUpO1xuICAgICAgaWYgKHByb3ApIHtcbiAgICAgICAgKHByb3AgYXMgeyBjb25lPzogQ29uZSB9KS5jb25lID0gY29uZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLmVudW1Db25lcyA9IHsgLi4udGhpcy5lbnVtQ29uZXMsIC4uLnJlc3VsdC5lbnVtQ29uZXMgfTtcbiAgICB0aGlzLnN1YnNldENvbmVzID0geyAuLi50aGlzLnN1YnNldENvbmVzLCAuLi5yZXN1bHQuc3Vic2V0Q29uZXMgfTtcblxuICAgIGF3YWl0IHRoaXMuc2F2ZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIExMTeydhCDsgqzsmqntlZjsl6wgY29uZSDrqZTtg4DrjbDsnbTthLDrpbwg7IOd7ISx7ZWp64uI64ukLlxuICAgKlxuICAgKiBAcGFyYW0gb3B0aW9ucy5wcmVzZXJ2ZUV4aXN0aW5nIC0g6riw7KG0IGNvbmUg67O07KG0IOyXrOu2gCAo6riw67O46rCSOiB0cnVlKVxuICAgKiBAcGFyYW0gb3B0aW9ucy5vbmx5RW1wdHkgLSBmaXh0dXJlSGludOqwgCDsl4bripQgY29uZeunjCDsg53shLEgKOq4sOuzuOqwkjogZmFsc2UpXG4gICAqIEBwYXJhbSBvcHRpb25zLmxvY2FsZSAtIOyDneyEsSDsi5wg7IKs7Jqp7ZWgIGxvY2FsZSAo6riw67O46rCSOiBcImtvXCIpXG4gICAqL1xuICBhc3luYyBnZW5lcmF0ZUNvbmVzKG9wdGlvbnM/OiB7XG4gICAgcHJlc2VydmVFeGlzdGluZz86IGJvb2xlYW47XG4gICAgb25seUVtcHR5PzogYm9vbGVhbjtcbiAgICBsb2NhbGU/OiBcImtvXCIgfCBcImVuXCIgfCBcImphXCI7XG4gIH0pOiBQcm9taXNlPGltcG9ydChcIi4uL2NvbmUvY29uZS1nZW5lcmF0b3JcIikuQ29uZUdlbmVyYXRpb25SZXN1bHQ+IHtcbiAgICBjb25zdCB7IGdlbmVyYXRlQ29uZXMgfSA9IGF3YWl0IGltcG9ydChcIi4uL2NvbmUvY29uZS1nZW5lcmF0b3JcIik7XG4gICAgY29uc3QgY29udGV4dDogaW1wb3J0KFwiLi4vY29uZS9jb25lLWdlbmVyYXRvclwiKS5Db25lR2VuZXJhdGlvbkNvbnRleHQgPSB7XG4gICAgICBlbnRpdHk6IHRoaXMudG9Kc29uKCksXG4gICAgICBsb2NhbGU6IG9wdGlvbnM/LmxvY2FsZSB8fCBcImtvXCIsXG4gICAgICBleGlzdGluZ0NvbmVzOiBvcHRpb25zPy5wcmVzZXJ2ZUV4aXN0aW5nICE9PSBmYWxzZSA/IHRoaXMuY29sbGVjdEV4aXN0aW5nQ29uZXMoKSA6IHVuZGVmaW5lZCxcbiAgICAgIG9ubHlFbXB0eTogb3B0aW9ucz8ub25seUVtcHR5ID8/IGZhbHNlLFxuICAgIH07XG5cbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBnZW5lcmF0ZUNvbmVzKGNvbnRleHQpO1xuICAgIHRoaXMuYXBwbHlDb25lcyhyZXN1bHQpO1xuICAgIGF3YWl0IHRoaXMuc2F2ZSgpO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICAvKipcbiAgICog6riw7KG0IGNvbmXrk6TsnYQg7IiY7KeR7ZWp64uI64ukIChlbnRpdHksIHByb3BzLCBlbnVtcywgc3Vic2V0cykuXG4gICAqXG4gICAqIEByZXR1cm5zIO2CpOqwgCBcImVudGl0eTppZFwiLCBcInByb3A6bmFtZVwiLCBcImVudW06ZW51bUlkXCIsIFwic3Vic2V0OmtleVwiIO2YleyLneyduCBjb25lIOuntVxuICAgKi9cbiAgcHJpdmF0ZSBjb2xsZWN0RXhpc3RpbmdDb25lcygpOiBSZWNvcmQ8c3RyaW5nLCBDb25lPiB7XG4gICAgY29uc3QgY29uZXM6IFJlY29yZDxzdHJpbmcsIENvbmU+ID0ge307XG5cbiAgICBpZiAodGhpcy5jb25lKSB7XG4gICAgICBjb25lc1tgZW50aXR5OiR7dGhpcy5pZH1gXSA9IHRoaXMuY29uZTtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IHByb3Agb2YgdGhpcy5wcm9wcykge1xuICAgICAgaWYgKHByb3AuY29uZSkge1xuICAgICAgICBjb25lc1tgcHJvcDoke3Byb3AubmFtZX1gXSA9IHByb3AuY29uZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IFtlbnVtSWQsIGNvbmVdIG9mIE9iamVjdC5lbnRyaWVzKHRoaXMuZW51bUNvbmVzKSkge1xuICAgICAgY29uZXNbYGVudW06JHtlbnVtSWR9YF0gPSBjb25lO1xuICAgIH1cblxuICAgIGZvciAoY29uc3QgW3N1YnNldEtleSwgY29uZV0gb2YgT2JqZWN0LmVudHJpZXModGhpcy5zdWJzZXRDb25lcykpIHtcbiAgICAgIGNvbmVzW2BzdWJzZXQ6JHtzdWJzZXRLZXl9YF0gPSBjb25lO1xuICAgIH1cblxuICAgIHJldHVybiBjb25lcztcbiAgfVxuXG4gIC8qKlxuICAgKiDsg53shLHrkJwgY29uZeuTpOydhCBFbnRpdHnsl5Ag7KCB7Jqp7ZWp64uI64ukLlxuICAgKlxuICAgKiBAcGFyYW0gcmVzdWx0IC0gTExN7Jy866GcIOyDneyEseuQnCBjb25lIOqysOqzvFxuICAgKi9cbiAgcHJpdmF0ZSBhcHBseUNvbmVzKHJlc3VsdDogaW1wb3J0KFwiLi4vY29uZS9jb25lLWdlbmVyYXRvclwiKS5Db25lR2VuZXJhdGlvblJlc3VsdCk6IHZvaWQge1xuICAgIGlmIChyZXN1bHQuZW50aXR5Q29uZSkge1xuICAgICAgdGhpcy5jb25lID0gcmVzdWx0LmVudGl0eUNvbmU7XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBbcHJvcE5hbWUsIGNvbmVdIG9mIE9iamVjdC5lbnRyaWVzKHJlc3VsdC5wcm9wQ29uZXMpKSB7XG4gICAgICBjb25zdCBwcm9wID0gdGhpcy5wcm9wcy5maW5kKChwKSA9PiBwLm5hbWUgPT09IHByb3BOYW1lKTtcbiAgICAgIGlmIChwcm9wKSB7XG4gICAgICAgIChwcm9wIGFzIHsgY29uZT86IENvbmUgfSkuY29uZSA9IGNvbmU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5lbnVtQ29uZXMgPSB7IC4uLnRoaXMuZW51bUNvbmVzLCAuLi5yZXN1bHQuZW51bUNvbmVzIH07XG4gICAgdGhpcy5zdWJzZXRDb25lcyA9IHsgLi4udGhpcy5zdWJzZXRDb25lcywgLi4ucmVzdWx0LnN1YnNldENvbmVzIH07XG4gIH1cblxuICBnZXRTdWJzZXRSb3dzKFxuICAgIF9zdWJzZXRzPzogeyBba2V5OiBzdHJpbmddOiBzdHJpbmdbXSB9LFxuICAgIF9zdWJzZXRzSW50ZXJuYWw/OiB7IFtrZXk6IHN0cmluZ106IHN0cmluZ1tdIH0sXG4gICAgcHJlZml4ZXM6IHN0cmluZ1tdID0gW10sXG4gICk6IEVudGl0eVN1YnNldFJvd1tdIHtcbiAgICBpZiAocHJlZml4ZXMubGVuZ3RoID4gMTApIHtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG5cbiAgICBjb25zdCBzdWJzZXRzID0gX3N1YnNldHMgPz8gdGhpcy5zdWJzZXRzO1xuICAgIGNvbnN0IHN1YnNldHNJbnRlcm5hbCA9IF9zdWJzZXRzSW50ZXJuYWwgPz8gdGhpcy5zdWJzZXRzSW50ZXJuYWw7XG4gICAgY29uc3Qgc3Vic2V0S2V5cyA9IE9iamVjdC5rZXlzKHN1YnNldHMpO1xuICAgIGNvbnN0IGFsbEZpZWxkcyA9IHVuaXF1ZShzdWJzZXRLZXlzLmZsYXRNYXAoKGtleSkgPT4gc3Vic2V0c1trZXldKSk7XG4gICAgLy8gaW50ZXJuYWwg7ZWE65Oc64+EIGFsbEZpZWxkc+yXkCDtj6ztlaggKHJlbGF0aW9uIO2DkOyDieyaqSlcbiAgICBjb25zdCBhbGxJbnRlcm5hbEZpZWxkcyA9IHVuaXF1ZShzdWJzZXRLZXlzLmZsYXRNYXAoKGtleSkgPT4gc3Vic2V0c0ludGVybmFsW2tleV0gPz8gW10pKTtcbiAgICBjb25zdCBjb21iaW5lZEZpZWxkcyA9IHVuaXF1ZShbLi4uYWxsRmllbGRzLCAuLi5hbGxJbnRlcm5hbEZpZWxkc10pO1xuXG4gICAgcmV0dXJuIHRoaXMucHJvcHMubWFwKChwcm9wKSA9PiB7XG4gICAgICBpZiAoXG4gICAgICAgIHByb3AudHlwZSA9PT0gXCJyZWxhdGlvblwiICYmXG4gICAgICAgIGNvbWJpbmVkRmllbGRzLmZpbmQoKGYpID0+IGYuc3RhcnRzV2l0aChgJHtbLi4ucHJlZml4ZXMsIHByb3AubmFtZV0uam9pbihcIi5cIil9LmApKVxuICAgICAgKSB7XG4gICAgICAgIGNvbnN0IHJlbEVudGl0eSA9IEVudGl0eU1hbmFnZXIuZ2V0KHByb3Aud2l0aCk7XG4gICAgICAgIGNvbnN0IGNoaWxkcmVuID0gcmVsRW50aXR5LmdldFN1YnNldFJvd3Moc3Vic2V0cywgc3Vic2V0c0ludGVybmFsLCBbXG4gICAgICAgICAgLi4ucHJlZml4ZXMsXG4gICAgICAgICAgYCR7cHJvcC5uYW1lfWAsXG4gICAgICAgIF0pO1xuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgZmllbGQ6IHByb3AubmFtZSxcbiAgICAgICAgICBjaGlsZHJlbixcbiAgICAgICAgICByZWxhdGlvbkVudGl0eTogcHJvcC53aXRoLFxuICAgICAgICAgIHByZWZpeGVzLFxuICAgICAgICAgIGlzT3BlbjogY2hpbGRyZW4ubGVuZ3RoID4gMCxcbiAgICAgICAgICBoYXM6IE9iamVjdC5mcm9tRW50cmllcyhcbiAgICAgICAgICAgIHN1YnNldEtleXMubWFwKChzdWJzZXRLZXkpID0+IHtcbiAgICAgICAgICAgICAgcmV0dXJuIFtzdWJzZXRLZXksIGNoaWxkcmVuLmV2ZXJ5KChjaGlsZCkgPT4gY2hpbGQuaGFzW3N1YnNldEtleV0pXTtcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgICksXG4gICAgICAgICAgaXNJbnRlcm5hbDogT2JqZWN0LmZyb21FbnRyaWVzKFxuICAgICAgICAgICAgc3Vic2V0S2V5cy5tYXAoKHN1YnNldEtleSkgPT4ge1xuICAgICAgICAgICAgICByZXR1cm4gW3N1YnNldEtleSwgY2hpbGRyZW4uZXZlcnkoKGNoaWxkKSA9PiBjaGlsZC5pc0ludGVybmFsW3N1YnNldEtleV0pXTtcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgICksXG4gICAgICAgIH07XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGZpZWxkID0gWy4uLnByZWZpeGVzLCBwcm9wLm5hbWVdLmpvaW4oXCIuXCIpO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgZmllbGQ6IHByb3AubmFtZSxcbiAgICAgICAgY2hpbGRyZW46IFtdLFxuICAgICAgICByZWxhdGlvbkVudGl0eTogcHJvcC50eXBlID09PSBcInJlbGF0aW9uXCIgPyBwcm9wLndpdGggOiB1bmRlZmluZWQsXG4gICAgICAgIHByZWZpeGVzLFxuICAgICAgICBoYXM6IE9iamVjdC5mcm9tRW50cmllcyhcbiAgICAgICAgICBzdWJzZXRLZXlzLm1hcCgoc3Vic2V0S2V5KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBzdWJzZXRGaWVsZHMgPSBzdWJzZXRzW3N1YnNldEtleV07XG4gICAgICAgICAgICBjb25zdCBoYXMgPSBzdWJzZXRGaWVsZHMuc29tZSgoZikgPT4ge1xuICAgICAgICAgICAgICByZXR1cm4gZiA9PT0gZmllbGQgfHwgZi5zdGFydHNXaXRoKGAke2ZpZWxkfS5gKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmV0dXJuIFtzdWJzZXRLZXksIGhhc107XG4gICAgICAgICAgfSksXG4gICAgICAgICksXG4gICAgICAgIGlzSW50ZXJuYWw6IE9iamVjdC5mcm9tRW50cmllcyhcbiAgICAgICAgICBzdWJzZXRLZXlzLm1hcCgoc3Vic2V0S2V5KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBpbnRlcm5hbEZpZWxkcyA9IHN1YnNldHNJbnRlcm5hbFtzdWJzZXRLZXldID8/IFtdO1xuICAgICAgICAgICAgY29uc3QgaXNJbnRlcm5hbCA9IGludGVybmFsRmllbGRzLnNvbWUoKGYpID0+IHtcbiAgICAgICAgICAgICAgcmV0dXJuIGYgPT09IGZpZWxkIHx8IGYuc3RhcnRzV2l0aChgJHtmaWVsZH0uYCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHVybiBbc3Vic2V0S2V5LCBpc0ludGVybmFsXTtcbiAgICAgICAgICB9KSxcbiAgICAgICAgKSxcbiAgICAgIH07XG4gICAgfSk7XG4gIH1cblxuICBzdWJzZXRSb3dzVG9TdWJzZXRGaWVsZHMoXG4gICAgc3Vic2V0Um93czogRW50aXR5U3Vic2V0Um93W10sXG4gICAgc3Vic2V0S2V5OiBzdHJpbmcsXG4gICAgaW50ZXJuYWw6IGJvb2xlYW4gPSBmYWxzZSxcbiAgKTogc3RyaW5nW10ge1xuICAgIGNvbnN0IGhhc0tleSA9IGludGVybmFsID8gXCJpc0ludGVybmFsXCIgOiBcImhhc1wiO1xuICAgIHJldHVybiBzdWJzZXRSb3dzXG4gICAgICAubWFwKChzdWJzZXRSb3cpID0+IHtcbiAgICAgICAgaWYgKHN1YnNldFJvdy5jaGlsZHJlbi5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuc3Vic2V0Um93c1RvU3Vic2V0RmllbGRzKHN1YnNldFJvdy5jaGlsZHJlbiwgc3Vic2V0S2V5LCBpbnRlcm5hbCk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3Vic2V0Um93W2hhc0tleV1bc3Vic2V0S2V5XSkge1xuICAgICAgICAgIHJldHVybiBzdWJzZXRSb3cucHJlZml4ZXMuY29uY2F0KHN1YnNldFJvdy5maWVsZCkuam9pbihcIi5cIik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgICAuZmlsdGVyKG5vbk51bGxhYmxlKVxuICAgICAgLmZsYXQoKTtcbiAgfVxuXG4gIGFzeW5jIGNyZWF0ZVByb3AocHJvcDogRW50aXR5UHJvcCwgYXQ/OiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAoIWF0KSB7XG4gICAgICB0aGlzLnByb3BzLnB1c2gocHJvcCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMucHJvcHMuc3BsaWNlKGF0LCAwLCBwcm9wKTtcbiAgICB9XG4gICAgYXdhaXQgdGhpcy5zYXZlKCk7XG4gIH1cblxuICBhbmFseXplU3Vic2V0RmllbGQoc3Vic2V0RmllbGQ6IHN0cmluZyk6IHtcbiAgICBlbnRpdHlJZDogc3RyaW5nO1xuICAgIHByb3BOYW1lOiBzdHJpbmc7XG4gIH1bXSB7XG4gICAgY29uc3QgYXJyID0gc3Vic2V0RmllbGQuc3BsaXQoXCIuXCIpO1xuXG4gICAgbGV0IGVudGl0eUlkID0gdGhpcy5pZDtcbiAgICBjb25zdCByZXN1bHQ6IHtcbiAgICAgIGVudGl0eUlkOiBzdHJpbmc7XG4gICAgICBwcm9wTmFtZTogc3RyaW5nO1xuICAgIH1bXSA9IFtdO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYXJyLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBwcm9wTmFtZSA9IGFycltpXTtcbiAgICAgIHJlc3VsdC5wdXNoKHtcbiAgICAgICAgZW50aXR5SWQsXG4gICAgICAgIHByb3BOYW1lLFxuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IHByb3AgPSBFbnRpdHlNYW5hZ2VyLmdldChlbnRpdHlJZCkucHJvcHMuZmluZCgocCkgPT4gcC5uYW1lID09PSBwcm9wTmFtZSk7XG4gICAgICBpZiAoIXByb3ApIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGAke2VudGl0eUlkfeydmCDsnpjrqrvrkJwg7ISc67iM7IWL7YKkICR7c3Vic2V0RmllbGR9YCk7XG4gICAgICB9XG4gICAgICBpZiAoaXNSZWxhdGlvblByb3AocHJvcCkpIHtcbiAgICAgICAgZW50aXR5SWQgPSBwcm9wLndpdGg7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICBhc3luYyBtb2RpZnlQcm9wKG5ld1Byb3A6IEVudGl0eVByb3AsIGF0OiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAvLyDsnbTsoIQg7ZSE66GtIOydtOumhCDsoIDsnqVcbiAgICBjb25zdCBvbGROYW1lID0gdGhpcy5wcm9wc1thdF0ubmFtZTtcblxuICAgIC8vIOyggOyepe2VoCDsl5Tti7Dti7BcbiAgICBjb25zdCBlbnRpdGllczogRW50aXR5W10gPSBbdGhpc107XG5cbiAgICAvLyDsnbTrpoTsnbQg67CU64CQIOqyveyasFxuICAgIGlmIChvbGROYW1lICE9PSBuZXdQcm9wLm5hbWUpIHtcbiAgICAgIC8vIOyghOyytCDsl5Tti7Dti7Dsl5DshJwg7ZiE7J6sIOyImOygleuQnCDtlITroa3snYQg7LC47KGw7ZWY6rOgIOyeiOuKlCDrqqjrk6Ag7ISc67iM7IWL7ZWE65OcIOywvuyVhOyEnCDsiJjsoJVcbiAgICAgIGNvbnN0IGFsbEVudGl0eUlkcyA9IEVudGl0eU1hbmFnZXIuZ2V0QWxsSWRzKCk7XG4gICAgICBmb3IgKGNvbnN0IHJlbEVudGl0eUlkIG9mIGFsbEVudGl0eUlkcykge1xuICAgICAgICBjb25zdCByZWxFbnRpdHkgPSBFbnRpdHlNYW5hZ2VyLmdldChyZWxFbnRpdHlJZCk7XG4gICAgICAgIGNvbnN0IHJlbEVudGl0eVN1YnNldEtleXMgPSBPYmplY3Qua2V5cyhyZWxFbnRpdHkuc3Vic2V0cyk7XG4gICAgICAgIGZvciAoY29uc3Qgc3Vic2V0S2V5IG9mIHJlbEVudGl0eVN1YnNldEtleXMpIHtcbiAgICAgICAgICBjb25zdCBzdWJzZXQgPSByZWxFbnRpdHkuc3Vic2V0c1tzdWJzZXRLZXldO1xuXG4gICAgICAgICAgLy8g7ISc67iM7IWLIO2VhOuTnOulvCDsiJztmoztlZjrqbAsIOyXlO2LsO2LsC3tlITroa0g64uo7JyE66GcIOu2hOyEne2VnCDtm4Qg7ZiE7J6sIOyXlO2LsO2LsC3tlITroa3qs7wg7J287LmY7ZWY64qUIOqyveyasCDsiJjsoJUg7LKY66asXG4gICAgICAgICAgY29uc3QgbW9kaWZpZWRTdWJzZXRGaWVsZHMgPSBzdWJzZXQubWFwKChzdWJzZXRGaWVsZCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgYW5hbHl6ZWQgPSByZWxFbnRpdHkuYW5hbHl6ZVN1YnNldEZpZWxkKHN1YnNldEZpZWxkKTtcbiAgICAgICAgICAgIGNvbnN0IG1vZGlmaWVkID0gYW5hbHl6ZWQubWFwKChhKSA9PlxuICAgICAgICAgICAgICBhLnByb3BOYW1lID09PSBvbGROYW1lICYmIGEuZW50aXR5SWQgPT09IHRoaXMuaWRcbiAgICAgICAgICAgICAgICA/IHtcbiAgICAgICAgICAgICAgICAgICAgLi4uYSxcbiAgICAgICAgICAgICAgICAgICAgcHJvcE5hbWU6IG5ld1Byb3AubmFtZSxcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICA6IGEsXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgLy8g67aE7ISd7ZWcIO2VhOuTnOulvCDri6Tsi5wg7ISc67iM7IWLIO2VhOuTnOuhnCDrs7XqtaxcbiAgICAgICAgICAgIHJldHVybiBtb2RpZmllZC5tYXAoKGEpID0+IGEucHJvcE5hbWUpLmpvaW4oXCIuXCIpO1xuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgaWYgKHN1YnNldC5qb2luKFwiLFwiKSAhPT0gbW9kaWZpZWRTdWJzZXRGaWVsZHMuam9pbihcIixcIikpIHtcbiAgICAgICAgICAgIHJlbEVudGl0eS5zdWJzZXRzW3N1YnNldEtleV0gPSBtb2RpZmllZFN1YnNldEZpZWxkcztcbiAgICAgICAgICAgIGVudGl0aWVzLnB1c2gocmVsRW50aXR5KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyDtlITroa0g7IiY7KCVXG4gICAgdGhpcy5wcm9wc1thdF0gPSBuZXdQcm9wO1xuXG4gICAgYXdhaXQgUHJvbWlzZS5hbGwoZW50aXRpZXMubWFwKGFzeW5jIChlbnRpdHkpID0+IGVudGl0eS5zYXZlKCkpKTtcbiAgfVxuXG4gIGFzeW5jIGRlbFByb3AoYXQ6IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xuICAgIC8vIOydtOyghCDtlITroa0g7J2066aEIOyggOyepVxuICAgIGNvbnN0IG9sZE5hbWUgPSB0aGlzLnByb3BzW2F0XS5uYW1lO1xuXG4gICAgLy8g7KCA7J6l7ZWgIOyXlO2LsO2LsFxuICAgIGNvbnN0IGVudGl0aWVzOiBFbnRpdHlbXSA9IFt0aGlzXTtcblxuICAgIC8vIOyghOyytCDsl5Tti7Dti7Dsl5DshJwg7ZiE7J6sIOyCreygnOuQnCDtlITroa3snYQg7LC47KGw7ZWY6rOgIOyeiOuKlCDrqqjrk6Ag7ISc67iM7IWL7ZWE65OcIOywvuyVhOyEnCDsoJzsmbhcbiAgICBjb25zdCBhbGxFbnRpdHlJZHMgPSBFbnRpdHlNYW5hZ2VyLmdldEFsbElkcygpO1xuICAgIGZvciAoY29uc3QgcmVsRW50aXR5SWQgb2YgYWxsRW50aXR5SWRzKSB7XG4gICAgICBjb25zdCByZWxFbnRpdHkgPSBFbnRpdHlNYW5hZ2VyLmdldChyZWxFbnRpdHlJZCk7XG4gICAgICBjb25zdCByZWxFbnRpdHlTdWJzZXRLZXlzID0gT2JqZWN0LmtleXMocmVsRW50aXR5LnN1YnNldHMpO1xuICAgICAgZm9yIChjb25zdCBzdWJzZXRLZXkgb2YgcmVsRW50aXR5U3Vic2V0S2V5cykge1xuICAgICAgICBjb25zdCBzdWJzZXQgPSByZWxFbnRpdHkuc3Vic2V0c1tzdWJzZXRLZXldO1xuICAgICAgICAvLyDshJzruIzshYsg7ZWE65Oc66W8IOyInO2ajO2VmOupsCwg7JeU7Yuw7YuwLe2UhOuhrSDri6jsnITroZwg67aE7ISd7ZWcIO2bhCDtmITsnqwg7JeU7Yuw7YuwLe2UhOuhreqzvCDsnbzsuZjtlZjripQg6rK97JqwIOydtO2bhOydmCDtlYTrk5zrpbwg7KCc7Jm4XG4gICAgICAgIGNvbnN0IG1vZGlmaWVkU3Vic2V0RmllbGRzID0gc3Vic2V0XG4gICAgICAgICAgLm1hcCgoc3Vic2V0RmllbGQpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGFuYWx5emVkID0gcmVsRW50aXR5LmFuYWx5emVTdWJzZXRGaWVsZChzdWJzZXRGaWVsZCk7XG4gICAgICAgICAgICBpZiAoYW5hbHl6ZWQuZmluZCgoYSkgPT4gYS5wcm9wTmFtZSA9PT0gb2xkTmFtZSAmJiBhLmVudGl0eUlkID09PSB0aGlzLmlkKSkge1xuICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHJldHVybiBzdWJzZXRGaWVsZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KVxuICAgICAgICAgIC5maWx0ZXIobm9uTnVsbGFibGUpO1xuXG4gICAgICAgIGlmIChzdWJzZXQuam9pbihcIixcIikgIT09IG1vZGlmaWVkU3Vic2V0RmllbGRzLmpvaW4oXCIsXCIpKSB7XG4gICAgICAgICAgcmVsRW50aXR5LnN1YnNldHNbc3Vic2V0S2V5XSA9IG1vZGlmaWVkU3Vic2V0RmllbGRzO1xuICAgICAgICAgIGVudGl0aWVzLnB1c2gocmVsRW50aXR5KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIO2YhOyerCDsl5Tti7Dti7DsnZgg7J24642x7Iqk7JeQ7IScIOygnOyZuFxuICAgIGZvciAoY29uc3QgaW5kZXggb2YgRW50aXR5TWFuYWdlci5nZXQodGhpcy5pZCkuaW5kZXhlcykge1xuICAgICAgaW5kZXguY29sdW1ucyA9IGluZGV4LmNvbHVtbnMuZmlsdGVyKChjb2wpID0+IGNvbC5uYW1lICE9PSBvbGROYW1lKTtcbiAgICB9XG5cbiAgICAvLyDtlITroa0g7IKt7KCcXG4gICAgdGhpcy5wcm9wcy5zcGxpY2UoYXQsIDEpO1xuXG4gICAgYXdhaXQgUHJvbWlzZS5hbGwoZW50aXRpZXMubWFwKGFzeW5jIChlbnRpdHkpID0+IGVudGl0eS5zYXZlKCkpKTtcbiAgfVxuXG4gIGdldEVudGl0eUlkRnJvbVN1YnNldEZpZWxkKHN1YnNldEZpZWxkOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGlmICghc3Vic2V0RmllbGQuaW5jbHVkZXMoXCIuXCIpKSB7XG4gICAgICByZXR1cm4gdGhpcy5pZDtcbiAgICB9XG5cbiAgICAvLyDshJzruIzshYsg7ZWE65Oc7J2YIOuniOyngOunieydgCDtlITroa3snbTrr4DroZwg7KCc7Jm4XG4gICAgY29uc3QgYXJyID0gc3Vic2V0RmllbGQuc3BsaXQoXCIuXCIpLnNsaWNlKDAsIC0xKTtcblxuICAgIC8vIOyEnOu4jOyFiyDtlYTrk5zrpbwg64K066Ck6rCA66m07IScIOuniOyngOunieycvOuhnCByZWxhdGlvbuuQnCDsl5Tti7Dti7Drpbwg7LC+7J2MXG4gICAgY29uc3QgbGFzdEVudGl0eUlkID0gYXJyLnJlZHVjZSgoZW50aXR5SWQsIGZpZWxkKSA9PiB7XG4gICAgICBjb25zdCByZWxQcm9wID0gRW50aXR5TWFuYWdlci5nZXQoZW50aXR5SWQpLnByb3BzLmZpbmQoKHApID0+IHAubmFtZSA9PT0gZmllbGQpO1xuICAgICAgaWYgKCFyZWxQcm9wIHx8IHJlbFByb3AudHlwZSAhPT0gXCJyZWxhdGlvblwiKSB7XG4gICAgICAgIGNvbnNvbGUuZGVidWcoeyBhcnIsIHRoaXNJZDogdGhpcy5pZCwgZW50aXR5SWQsIGZpZWxkIH0pO1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYOyemOuqu+uQnCDshJzruIzshYvtgqQgJHtzdWJzZXRGaWVsZH1gKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiByZWxQcm9wLndpdGg7XG4gICAgfSwgdGhpcy5pZCk7XG4gICAgcmV0dXJuIGxhc3RFbnRpdHlJZDtcbiAgfVxuXG4gIGFzeW5jIG1vdmVQcm9wKGF0OiBudW1iZXIsIHRvOiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBwcm9wID0gdGhpcy5wcm9wc1thdF07XG4gICAgY29uc3QgbmV3UHJvcHMgPSBbLi4udGhpcy5wcm9wc107XG4gICAgbmV3UHJvcHMuc3BsaWNlKHRvLCAwLCBwcm9wKTtcbiAgICBuZXdQcm9wcy5zcGxpY2UoYXQgPCB0byA/IGF0IDogYXQgKyAxLCAxKTtcbiAgICB0aGlzLnByb3BzID0gbmV3UHJvcHM7XG5cbiAgICBhd2FpdCB0aGlzLnNhdmUoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDtlYTrk5zrqoXsnYQgXCLthYzsnbTruJTrqoUu7ZWE65Oc66qFXCIg7ZiV7Iud7Jy866GcIOuzgO2ZmFxuICAgKi9cbiAgZ2V0RnVsbEZpZWxkTmFtZShmaWVsZDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBpZiAoZmllbGQuaW5jbHVkZXMoXCIuXCIpKSB7XG4gICAgICByZXR1cm4gZmllbGQ7XG4gICAgfVxuICAgIHJldHVybiBgJHt0aGlzLnRhYmxlfS4ke2ZpZWxkfWA7XG4gIH1cblxuICAvKipcbiAgICog7JeU7Yuw7Yuw7J2YIFBLIO2DgOyeheydhCDrsJjtmZjtlanri4jri6QuXG4gICAqIGlkIO2VhOuTnOydmCDtg4DsnoXsnYQg6riw7KSA7Jy866GcIFwiaW50ZWdlclwiIHwgXCJzdHJpbmdcIiB8IFwidXVpZFwi66W8IOuwmO2ZmO2VqeuLiOuLpC5cbiAgICovXG4gIGdldFBrVHlwZSgpOiBcImludGVnZXJcIiB8IFwic3RyaW5nXCIgfCBcInV1aWRcIiB7XG4gICAgY29uc3QgaWRQcm9wID0gdGhpcy5wcm9wc0RpY3QuaWQ7XG4gICAgaWYgKCFpZFByb3ApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgRW50aXR5ICR7dGhpcy5pZH3sl5AgaWQg7ZWE65Oc6rCAIOyXhuyKteuLiOuLpGApO1xuICAgIH1cbiAgICBpZiAoaWRQcm9wLnR5cGUgPT09IFwic3RyaW5nXCIgfHwgaWRQcm9wLnR5cGUgPT09IFwidXVpZFwiKSB7XG4gICAgICByZXR1cm4gaWRQcm9wLnR5cGU7XG4gICAgfVxuICAgIHJldHVybiBcImludGVnZXJcIjtcbiAgfVxuXG4gIC8qKlxuICAgKiDsl5Tti7Dti7DsnZggUEsgcHJvcOydhCDrsJjtmZjtlanri4jri6QuXG4gICAqIGxlbmd0aCDrk7Eg7IS467aAIOygleuztOyXkCDsoJHqt7ztlaAg65WMIOyCrOyaqe2VqeuLiOuLpC5cbiAgICovXG4gIGdldFBrUHJvcCgpOiBFbnRpdHlQcm9wIHtcbiAgICBjb25zdCBpZFByb3AgPSB0aGlzLnByb3BzRGljdC5pZDtcbiAgICBpZiAoIWlkUHJvcCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBFbnRpdHkgJHt0aGlzLmlkfeyXkCBpZCDtlYTrk5zqsIAg7JeG7Iq164uI64ukYCk7XG4gICAgfVxuICAgIHJldHVybiBpZFByb3A7XG4gIH1cblxuICAvKipcbiAgICog7JeU7Yuw7Yuw7J2YIFBLIOuwsOyXtCDtg4DsnoXsnYQg67CY7ZmY7ZWp64uI64ukLlxuICAgKiBMb2FkZXJRdWVyeeydmCBmcm9tSWRzIO2DgOyeheycvOuhnCDsgqzsmqnrkKnri4jri6QuXG4gICAqL1xuICBnZXRQa0FycmF5VHlwZSgpOiBzdHJpbmcge1xuICAgIGNvbnN0IHBrVHlwZSA9IHRoaXMuZ2V0UGtUeXBlKCk7XG4gICAgcmV0dXJuIHBrVHlwZSA9PT0gXCJpbnRlZ2VyXCIgPyBcIm51bWJlcltdXCIgOiBcInN0cmluZ1tdXCI7XG4gIH1cbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7OztjQVF1QzthQWNmO2lCQVkyQjtpQkFDSDtnQkFDTDtrQkFDTzthQUNVO3NCQUNYO0NBRXBDLFNBQWIsTUFBb0I7RUFDbEI7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBS0E7RUFDQTtFQUdBO0VBR0E7RUFDQTtFQUdBO0VBR0EsUUFFSSxFQUFFO0VBQ04sUUFFSSxFQUFF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
|
|
955
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW50aXR5LmpzIiwibmFtZXMiOlsieiIsImxpbmVzOiBzdHJpbmdbXSIsImpvaW4iLCJyZXN1bHQ6IFJldHVyblR5cGU8dHlwZW9mIHRoaXMuYnVpbGROZXN0ZWRTZWxlY3RPYmplY3Q+IiwibG9hZGVyTGluZXM6IHN0cmluZ1tdIiwibG9hZGVycyIsInJlc3VsdDogU3Vic2V0UXVlcnkiLCJmaWVsZHMiLCJqb2luQ2xhdXNlOlxuICAgICAgICAgICAgfCB7XG4gICAgICAgICAgICAgICAgZnJvbTogc3RyaW5nO1xuICAgICAgICAgICAgICAgIHRvOiBzdHJpbmc7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHwge1xuICAgICAgICAgICAgICAgIGN1c3RvbTogc3RyaW5nO1xuICAgICAgICAgICAgICB9IiwiZnJvbTogc3RyaW5nIiwidG86IHN0cmluZyIsIm1hbnlKb2luOiBTdWJzZXRRdWVyeVtcImxvYWRlcnNcIl1bbnVtYmVyXVtcIm1hbnlKb2luXCJdIiwia2V5OiBzdHJpbmciLCJ2YWx1ZTogc3RyaW5nIiwiZWxzZUV4cHI6IHN0cmluZ1tdIiwiZ3JvdXAiLCJwcm9wIiwic3Vic2V0czogeyBba2V5OiBzdHJpbmddOiBpbXBvcnQoXCIuLi90eXBlcy90eXBlc1wiKS5TdWJzZXREZWYgfSIsIm5vcm1hbEZpZWxkczogU3Vic2V0RmllbGRbXSIsImludGVybmFsRmllbGRzOiBTdWJzZXRGaWVsZFtdIiwiZW51bXM6IHsgW2tleTogc3RyaW5nXTogaW1wb3J0KFwiLi4vdHlwZXMvdHlwZXNcIikuRW51bURlZiB9IiwiY29udGV4dDogaW1wb3J0KFwiLi4vY29uZS9jb25lLWdlbmVyYXRvclwiKS5Db25lR2VuZXJhdGlvbkNvbnRleHQiLCJjb25lczogUmVjb3JkPHN0cmluZywgQ29uZT4iLCJyZXN1bHQ6IHtcbiAgICAgIGVudGl0eUlkOiBzdHJpbmc7XG4gICAgICBwcm9wTmFtZTogc3RyaW5nO1xuICAgIH1bXSIsImVudGl0aWVzOiBFbnRpdHlbXSJdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9lbnRpdHkvZW50aXR5LnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBhc3NlcnQgZnJvbSBcImFzc2VydFwiO1xuaW1wb3J0IHsgd3JpdGVGaWxlIH0gZnJvbSBcImZzL3Byb21pc2VzXCI7XG5pbXBvcnQgcGF0aCBmcm9tIFwicGF0aFwiO1xuXG5pbXBvcnQgaW5mbGVjdGlvbiBmcm9tIFwiaW5mbGVjdGlvblwiO1xuaW1wb3J0IHsgZ3JvdXAsIHVuaXF1ZSB9IGZyb20gXCJyYWRhc2hpXCI7XG5pbXBvcnQgeyB6IH0gZnJvbSBcInpvZFwiO1xuXG5pbXBvcnQgeyBTb25hbXUgfSBmcm9tIFwiLi4vYXBpL3NvbmFtdVwiO1xuaW1wb3J0IHtcbiAgZ2V0RW51bURlZlZhbHVlcyxcbiAgZ2V0U3Vic2V0RmllbGRzLFxuICBpc0JlbG9uZ3NUb09uZVJlbGF0aW9uUHJvcCxcbiAgaXNFbnVtUHJvcCxcbiAgaXNIYXNNYW55UmVsYXRpb25Qcm9wLFxuICBpc0ludGVybmFsU3Vic2V0RmllbGQsXG4gIGlzTWFueVRvTWFueVJlbGF0aW9uUHJvcCxcbiAgaXNPbmVUb09uZVJlbGF0aW9uUHJvcCxcbiAgaXNSZWxhdGlvblByb3AsXG4gIGlzVmlydHVhbENvZGVQcm9wLFxuICBpc1ZpcnR1YWxQcm9wLFxuICBub3JtYWxpemVTdWJzZXRGaWVsZCxcbn0gZnJvbSBcIi4uL3R5cGVzL3R5cGVzXCI7XG5pbXBvcnQge1xuICB0eXBlIENvbmUsXG4gIHR5cGUgRW50aXR5SW5kZXgsXG4gIHR5cGUgRW50aXR5SnNvbixcbiAgdHlwZSBFbnRpdHlQcm9wLFxuICB0eXBlIEVudGl0eVByb3BOb2RlLFxuICB0eXBlIEVudGl0eVN1YnNldFJvdyxcbiAgdHlwZSBSZWxhdGlvblByb3AsXG4gIHR5cGUgU3Vic2V0RmllbGQsXG4gIHR5cGUgU3Vic2V0UXVlcnksXG59IGZyb20gXCIuLi90eXBlcy90eXBlc1wiO1xuaW1wb3J0IHsgaW1wb3J0TWVtYmVycyB9IGZyb20gXCIuLi91dGlscy9lc20tdXRpbHNcIjtcbmltcG9ydCB7IGZvcm1hdENvZGUgfSBmcm9tIFwiLi4vdXRpbHMvZm9ybWF0dGVyXCI7XG5pbXBvcnQgeyBleGlzdHMgfSBmcm9tIFwiLi4vdXRpbHMvZnMtdXRpbHNcIjtcbmltcG9ydCB7IHJ1bnRpbWVQYXRoIH0gZnJvbSBcIi4uL3V0aWxzL3BhdGgtdXRpbHNcIjtcbmltcG9ydCB7IGFzc2VydERlZmluZWQsIG5vbk51bGxhYmxlIH0gZnJvbSBcIi4uL3V0aWxzL3V0aWxzXCI7XG5pbXBvcnQgeyBFbnRpdHlNYW5hZ2VyIH0gZnJvbSBcIi4vZW50aXR5LW1hbmFnZXJcIjtcblxuZXhwb3J0IGNsYXNzIEVudGl0eSB7XG4gIGlkOiBzdHJpbmc7XG4gIHBhcmVudElkPzogc3RyaW5nO1xuICB0YWJsZTogc3RyaW5nO1xuICB0aXRsZTogc3RyaW5nO1xuICBjb25lPzogQ29uZTtcbiAgbmFtZXM6IHtcbiAgICBwYXJlbnRGczogc3RyaW5nO1xuICAgIGZzOiBzdHJpbmc7XG4gICAgbW9kdWxlOiBzdHJpbmc7XG4gIH07XG4gIHByb3BzOiBFbnRpdHlQcm9wW107XG4gIHByb3BzRGljdDoge1xuICAgIFtrZXk6IHN0cmluZ106IEVudGl0eVByb3A7XG4gIH07XG4gIHJlbGF0aW9uczoge1xuICAgIFtrZXk6IHN0cmluZ106IFJlbGF0aW9uUHJvcDtcbiAgfTtcbiAgaW5kZXhlczogRW50aXR5SW5kZXhbXTtcbiAgc3Vic2V0czoge1xuICAgIFtrZXk6IHN0cmluZ106IHN0cmluZ1tdO1xuICB9O1xuICBzdWJzZXRzSW50ZXJuYWw6IHtcbiAgICBba2V5OiBzdHJpbmddOiBzdHJpbmdbXTtcbiAgfTtcbiAgdHlwZXM6IHtcbiAgICBbbmFtZTogc3RyaW5nXTogei5ab2RUeXBlQW55O1xuICB9ID0ge307XG4gIGVudW1zOiB7XG4gICAgW2VudW1JZDogc3RyaW5nXTogei5ab2RFbnVtPFJlYWRvbmx5PFJlY29yZDxzdHJpbmcsIHN0cmluZz4+PjtcbiAgfSA9IHt9O1xuICBlbnVtTGFiZWxzOiB7XG4gICAgW2VudW1JZDogc3RyaW5nXToge1xuICAgICAgW2tleTogc3RyaW5nXTogc3RyaW5nO1xuICAgIH07XG4gIH0gPSB7fTtcbiAgZW51bUNvbmVzOiB7XG4gICAgW2VudW1JZDogc3RyaW5nXTogQ29uZTtcbiAgfSA9IHt9O1xuICBzdWJzZXRDb25lczoge1xuICAgIFtzdWJzZXRLZXk6IHN0cmluZ106IENvbmU7XG4gIH0gPSB7fTtcblxuICBjb25zdHJ1Y3Rvcih7IGlkLCBwYXJlbnRJZCwgdGFibGUsIHRpdGxlLCBjb25lLCBwcm9wcywgaW5kZXhlcywgc3Vic2V0cywgZW51bXMgfTogRW50aXR5SnNvbikge1xuICAgIC8vIGlkXG4gICAgdGhpcy5pZCA9IGlkO1xuICAgIHRoaXMucGFyZW50SWQgPSBwYXJlbnRJZDtcbiAgICB0aGlzLnRpdGxlID0gdGl0bGUgPz8gdGhpcy5pZDtcbiAgICB0aGlzLnRhYmxlID0gdGFibGUgPz8gaW5mbGVjdGlvbi51bmRlcnNjb3JlKGluZmxlY3Rpb24ucGx1cmFsaXplKGlkKSk7XG4gICAgdGhpcy5jb25lID0gY29uZTtcblxuICAgIC8vIHByb3BzXG4gICAgaWYgKHByb3BzKSB7XG4gICAgICB0aGlzLnByb3BzID0gcHJvcHMubWFwKChwcm9wKSA9PiB7XG4gICAgICAgIGlmIChpc0VudW1Qcm9wKHByb3ApKSB7XG4gICAgICAgICAgaWYgKHByb3AuaWQuaW5jbHVkZXMoXCIkTW9kZWxcIikpIHtcbiAgICAgICAgICAgIHByb3AuaWQgPSBwcm9wLmlkLnJlcGxhY2UoXCIkTW9kZWxcIiwgaWQpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcHJvcDtcbiAgICAgIH0pO1xuICAgICAgdGhpcy5wcm9wc0RpY3QgPSBPYmplY3QuZnJvbUVudHJpZXMoXG4gICAgICAgIHByb3BzLm1hcCgocHJvcCkgPT4ge1xuICAgICAgICAgIHJldHVybiBbcHJvcC5uYW1lLCBwcm9wXTtcbiAgICAgICAgfSksXG4gICAgICApO1xuXG4gICAgICAvLyByZWxhdGlvbnNcbiAgICAgIHRoaXMucmVsYXRpb25zID0gT2JqZWN0LmZyb21FbnRyaWVzKFxuICAgICAgICBwcm9wcy5maWx0ZXIoKHByb3ApID0+IGlzUmVsYXRpb25Qcm9wKHByb3ApKS5tYXAoKHByb3ApID0+IFtwcm9wLm5hbWUsIHByb3BdKSxcbiAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMucHJvcHMgPSBbXTtcbiAgICAgIHRoaXMucHJvcHNEaWN0ID0ge307XG4gICAgICB0aGlzLnJlbGF0aW9ucyA9IHt9O1xuICAgIH1cblxuICAgIC8vIGluZGV4ZXNcbiAgICB0aGlzLmluZGV4ZXMgPSBpbmRleGVzID8/IFtdO1xuXG4gICAgLy8gc3Vic2V0czogU3Vic2V0RGVm7JeQ7IScIFN1YnNldEZpZWxkW13rpbwg7LaU7Lac7ZWY7JesIHN1YnNldHMo7J2867CYKeyZgCBzdWJzZXRzSW50ZXJuYWwoaW50ZXJuYWwp66GcIOu2hOumrFxuICAgIHRoaXMuc3Vic2V0cyA9IHt9O1xuICAgIHRoaXMuc3Vic2V0c0ludGVybmFsID0ge307XG4gICAgZm9yIChjb25zdCBba2V5LCBzdWJzZXREZWZdIG9mIE9iamVjdC5lbnRyaWVzKHN1YnNldHMgPz8ge30pKSB7XG4gICAgICBjb25zdCBmaWVsZHMgPSBnZXRTdWJzZXRGaWVsZHMoc3Vic2V0RGVmKTtcbiAgICAgIHRoaXMuc3Vic2V0c1trZXldID0gZmllbGRzLmZpbHRlcigoZikgPT4gIWlzSW50ZXJuYWxTdWJzZXRGaWVsZChmKSkubWFwKG5vcm1hbGl6ZVN1YnNldEZpZWxkKTtcbiAgICAgIHRoaXMuc3Vic2V0c0ludGVybmFsW2tleV0gPSBmaWVsZHMuZmlsdGVyKGlzSW50ZXJuYWxTdWJzZXRGaWVsZCkubWFwKG5vcm1hbGl6ZVN1YnNldEZpZWxkKTtcblxuICAgICAgLy8gY29uZSDstpTstpxcbiAgICAgIGlmICghQXJyYXkuaXNBcnJheShzdWJzZXREZWYpICYmIFwiY29uZVwiIGluIHN1YnNldERlZiAmJiBzdWJzZXREZWYuY29uZSkge1xuICAgICAgICB0aGlzLnN1YnNldENvbmVzW2tleV0gPSBzdWJzZXREZWYuY29uZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBlbnVtczogRW51bURlZuyXkOyEnCB2YWx1ZXPsmYAgY29uZeulvCDstpTstpztlZjsl6wg7LKY66asXG4gICAgdGhpcy5lbnVtTGFiZWxzID0gT2JqZWN0LmZyb21FbnRyaWVzKFxuICAgICAgT2JqZWN0LmVudHJpZXMoZW51bXMgPz8ge30pLm1hcCgoW2tleSwgZW51bURlZl0pID0+IHtcbiAgICAgICAgLy8gY29uZSDstpTstpxcbiAgICAgICAgaWYgKFwidmFsdWVzXCIgaW4gZW51bURlZiAmJiBcImNvbmVcIiBpbiBlbnVtRGVmICYmIGVudW1EZWYuY29uZSkge1xuICAgICAgICAgIHRoaXMuZW51bUNvbmVzW2tleV0gPSBlbnVtRGVmLmNvbmUgYXMgQ29uZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gW2tleSwgZ2V0RW51bURlZlZhbHVlcyhlbnVtRGVmKV07XG4gICAgICB9KSxcbiAgICApO1xuICAgIHRoaXMuZW51bXMgPSBPYmplY3QuZnJvbUVudHJpZXMoXG4gICAgICBPYmplY3QuZW50cmllcyh0aGlzLmVudW1MYWJlbHMpLm1hcCgoW2tleSwgZW51bUxhYmVsXSkgPT4ge1xuICAgICAgICByZXR1cm4gW2tleSwgei5lbnVtKE9iamVjdC5rZXlzKGVudW1MYWJlbCkgYXMgdW5rbm93biBhcyByZWFkb25seSBbc3RyaW5nLCAuLi5zdHJpbmdbXV0pXTtcbiAgICAgIH0pLFxuICAgICk7XG5cbiAgICAvLyBuYW1lc1xuICAgIHRoaXMubmFtZXMgPSB7XG4gICAgICBwYXJlbnRGczogaW5mbGVjdGlvbi5kYXNoZXJpemUoaW5mbGVjdGlvbi51bmRlcnNjb3JlKHBhcmVudElkID8/IGlkKSkudG9Mb3dlckNhc2UoKSxcbiAgICAgIGZzOiBpbmZsZWN0aW9uLmRhc2hlcml6ZShpbmZsZWN0aW9uLnVuZGVyc2NvcmUoaWQpKS50b0xvd2VyQ2FzZSgpLFxuICAgICAgbW9kdWxlOiBpZCxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIOy/vOumrOyaqSDshJzruIzshYsg7ZWE65Oc66W8IOuwmO2ZmO2VqeuLiOuLpCAoc3Vic2V0cyArIHN1YnNldHNJbnRlcm5hbCDtlansuagpXG4gICAqL1xuICBnZXRTdWJzZXRGaWVsZHNGb3JRdWVyeShzdWJzZXRLZXk6IHN0cmluZyk6IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gWy4uLih0aGlzLnN1YnNldHNbc3Vic2V0S2V5XSA/PyBbXSksIC4uLih0aGlzLnN1YnNldHNJbnRlcm5hbFtzdWJzZXRLZXldID8/IFtdKV07XG4gIH1cblxuICAvKipcbiAgICog7KO87Ja07KeEIOydtOumhChzdWJzZXRLZXkp7J2YIHN1YnNldOydhCDsi6TsoJzroZwg6rCA7KC47Jik64qUIFB1cmkg7L2U65OcIOq1rO2YhOyytCBzdHJpbmfsnYQg67CY7ZmY7ZWp64uI64ukLlxuICAgKi9cbiAgZ2V0UHVyaVN1YnNldFF1ZXJ5KHN1YnNldEtleTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBjb25zdCBzdWJzZXQgPSB0aGlzLmdldFN1YnNldEZpZWxkc0ZvclF1ZXJ5KHN1YnNldEtleSk7XG4gICAgY29uc3Qgc3Vic2V0UXVlcnkgPSB0aGlzLnJlc29sdmVTdWJzZXRRdWVyeShcIlwiLCBzdWJzZXQpO1xuXG4gICAgY29uc3QgbGluZXM6IHN0cmluZ1tdID0gW107XG5cbiAgICAvLyBmcm9tXG4gICAgbGluZXMucHVzaChgcmV0dXJuIHFiV3JhcHBlcmApO1xuICAgIGxpbmVzLnB1c2goYC5mcm9tKFwiJHt0aGlzLnRhYmxlfVwiKWApO1xuXG4gICAgLy8gam9pblxuICAgIGZvciAoY29uc3Qgam9pbiBvZiBzdWJzZXRRdWVyeS5qb2lucykge1xuICAgICAgLy8gam9pbiDrqZTshJzrk5wg6rKw7KCVOiBpbm5lciDihpIgam9pbiwgb3V0ZXIg4oaSIGxlZnRKb2luXG4gICAgICAvLyBGSyBudWxsYWJsZSDsl6zrtoDripQgbGVmdEpvaW4g7YOA7J6FIOyLnOq3uOuLiOyymOyXkOyEnCDsnpDrj5nsnLzroZwg7YyQ64uo65CoXG4gICAgICBjb25zdCBqb2luTWV0aG9kID0gam9pbi5qb2luID09PSBcImlubmVyXCIgPyBcImpvaW5cIiA6IFwibGVmdEpvaW5cIjtcblxuICAgICAgaWYgKFwiY3VzdG9tXCIgaW4gam9pbikge1xuICAgICAgICAvLyBjdXN0b20gam9pbiBjbGF1c2XripQgcmF3IOyCrOyaqVxuICAgICAgICBsaW5lcy5wdXNoKFxuICAgICAgICAgIGAuJHtqb2luTWV0aG9kfSh7ICR7am9pbi5hc306IFwiJHtqb2luLnRhYmxlfVwiIH0sIHFiV3JhcHBlci5rbmV4LnJhdyhcXGAke2pvaW4uY3VzdG9tfVxcYCkpYCxcbiAgICAgICAgKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGxpbmVzLnB1c2goYC4ke2pvaW5NZXRob2R9KHsgJHtqb2luLmFzfTogXCIke2pvaW4udGFibGV9XCIgfSwgXCIke2pvaW4uZnJvbX1cIiwgXCIke2pvaW4udG99XCIpYCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gc2VsZWN0IC0g7J6F7LK07KCBIOq1rOyhsOuhnCDsg53shLFcbiAgICBjb25zdCBzZWxlY3RPYmogPSB0aGlzLmJ1aWxkTmVzdGVkU2VsZWN0T2JqZWN0KHN1YnNldFF1ZXJ5LnNlbGVjdCk7XG4gICAgbGluZXMucHVzaChgLnNlbGVjdCgke3RoaXMuc3RyaW5naWZ5TmVzdGVkU2VsZWN0T2JqZWN0KHNlbGVjdE9iail9KTtgKTtcblxuICAgIHJldHVybiBsaW5lcy5qb2luKFwiXFxuXCIpO1xuICB9XG5cbiAgLyoqXG4gICAqICouZW50aXR5Lmpzb27snZggc3Vic2V07JeQIOuTpOyWtOyeiOuKlCDtlYTrk5wg67Cw7Je07J2EIOuwm+yVhOyEnCxcbiAgICogUHVyaeydmCBTZWxlY3RPYmplY3Qg7YOA7J6F7Jy866GcIOuzgO2ZmO2VqeuLiOuLpC5cbiAgICpcbiAgICog7JiIOiBbXCJ1c2Vycy5pZFwiLCBcInBhcmVudC5pZFwiLCBcInBhcmVudC5uYW1lXCJdXG4gICAqICAg4oaSIHsgaWQ6IFwidXNlcnMuaWRcIiwgcGFyZW50OiB7IGlkOiBcInBhcmVudC5pZFwiLCBuYW1lOiBcInBhcmVudC5uYW1lXCIgfSB9XG4gICAqXG4gICAqIOyWuOuNlOuwlOqwgCDslYTri4wg7KSR7LKpIOqwneyytOuhnCDrs4DtmZjtlajsl5Ag7Jyg7J2Y7ZWY7IS47JqULlxuICAgKiDsnbTroIfqsowg7KSR7LKpIOqwneyytOuhnCDrs4DtmZjtlZjsl6wgc2VsZWN07JeQIOuEmOqyqOyjvOuptCBQYXJzZVNlbGVjdE9iamVjdCDtg4DsnoXsnbQgam9pbuuQnCDqsJ3ssrTsnZgg7YOA7J6F7J2EIOyemCDsnqHslYTspIQg7IiYIOyeiOyKteuLiOuLpC5cbiAgICog7KaJLCBlbmhhbmNlcuyXkOyEnCByb3frpbwg67Cb7JWY7J2EIOuVjCBoeWRyYXRl65CcIOqwneyytCDsnpDssrTsnZggbnVsbGl0eeyZgCDqt7gg7JWI7Kq9IO2VhOuTnOydmCBudWxsaXR56rCAIGZrIG51bGxhYmxlIOyXrOu2gOyXkCDrlLDrnbwg7J6YIOy2lOuhoOuQqeuLiOuLpC5cbiAgICovXG4gIHByaXZhdGUgYnVpbGROZXN0ZWRTZWxlY3RPYmplY3QoXG4gICAgc2VsZWN0SXRlbXM6IHN0cmluZ1tdLFxuICAgIC8vIG94bGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55IC0tIOuwmO2ZmCDsmKTruIzsoJ3tirjsnZgg6rCS7J2AIHN0cmluZ+ydvCDsiJjrj4Qg7J6I6rOgIOuYkOuLpOuluCDsmKTruIzsoJ3tirjsnbwg7IiY64+EIOyeiOuKlOuNsCwg7J2066W8IOyerOq3gCDtg4DsnoXsnLzroZwg64KY7YOA64K8IOyImCDsl4bslrQgYW5566GcIOyymOumrO2VqeuLiOuLpC5cbiAgKTogUmVjb3JkPHN0cmluZywgYW55PiB7XG4gICAgY29uc3QgcmVzdWx0OiBSZXR1cm5UeXBlPHR5cGVvZiB0aGlzLmJ1aWxkTmVzdGVkU2VsZWN0T2JqZWN0PiA9IHt9O1xuXG4gICAgZm9yIChjb25zdCBzZWxlY3RJdGVtIG9mIHNlbGVjdEl0ZW1zKSB7XG4gICAgICAvLyBcInVzZXJzLmlkXCIg65iQ64qUIFwidXNlcnMuaWQgYXMgdXNlcl9faWRcIiDtmJXtg5wg7YyM7IuxXG4gICAgICBjb25zdCBtYXRjaCA9IHNlbGVjdEl0ZW0ubWF0Y2goL14oLis/KSg/OiBhcyAoLispKT8kLyk7XG4gICAgICBpZiAoIW1hdGNoKSBjb250aW51ZTtcblxuICAgICAgY29uc3QgWywgY29sdW1uLCBhbGlhc10gPSBtYXRjaDtcbiAgICAgIGNvbnN0IGNvbHVtblZhbHVlID0gYFwiJHtjb2x1bW4udHJpbSgpfVwiYDtcblxuICAgICAgaWYgKCFhbGlhcyB8fCAhYWxpYXMuaW5jbHVkZXMoXCJfX1wiKSkge1xuICAgICAgICAvLyBhbGlhc+qwgCDsl4bqsbDrgpggX1/rpbwg7Y+s7ZWo7ZWY7KeAIOyViuycvOuptCDstZzsg4HsnIQg7ZWE65OcXG4gICAgICAgIGNvbnN0IGtleSA9IGFsaWFzID8/IGFzc2VydERlZmluZWQoY29sdW1uLnNwbGl0KFwiLlwiKS5wb3AoKSk7XG4gICAgICAgIHJlc3VsdFtrZXldID0gY29sdW1uVmFsdWU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBhbGlhc+qwgCBfX+ulvCDtj6ztlajtlZjrqbQg7J6F7LK0IOq1rOyhsOuhnCDqt7jro7ntmZRcbiAgICAgICAgY29uc3QgcGFydHMgPSBhbGlhcy5zcGxpdChcIl9fXCIpO1xuICAgICAgICBsZXQgY3VycmVudCA9IHJlc3VsdDtcblxuICAgICAgICAvLyDrp4jsp4Drp4kg7YyM7Yq4IOyghOq5jOyngCDspJHssqkg6rCd7LK0IOyDneyEsVxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBhcnRzLmxlbmd0aCAtIDE7IGkrKykge1xuICAgICAgICAgIGNvbnN0IHBhcnQgPSBwYXJ0c1tpXTtcbiAgICAgICAgICBpZiAocGFydCBpbiBjdXJyZW50KSB7XG4gICAgICAgICAgICBpZiAodHlwZW9mIGN1cnJlbnRbcGFydF0gPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICAgICAgLy8g7J6F66Cl7J20IFtcInVzZXJcIiwgXCJ1c2VyX19pZFwiXSDqsJnsnYAg6rK97JqwIVxuICAgICAgICAgICAgICAvLyDslaDstIjsl5Ag66eQ64+EIOyViCDrkJjsp4Drp4wg7JWI7KCE7ZWY6rKMIOyYiOyZuOulvCDrjZjsp5Hri4jri6QuXG4gICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgICAgICBgQ29uZmxpY3QgZGV0ZWN0ZWQgaW4gc2VsZWN0IGl0ZW1zOiBwYXJlbnQgcGF0aCBcIiR7cGFydHMuc2xpY2UoMCwgaSArIDEpLmpvaW4oXCJfX1wiKX1cIiBpcyBhbHJlYWR5IHNldCBhcyBhIGZpZWxkLCBjYW5ub3QgbmVzdCBcIiR7YWxpYXN9XCIgdW5kZXIgaXQuYCxcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY3VycmVudFtwYXJ0XSA9IHt9O1xuICAgICAgICAgIH1cbiAgICAgICAgICBjdXJyZW50ID0gY3VycmVudFtwYXJ0XTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIOuniOyngOuniSDtjIztirjsl5Ag6rCSIOyEpOyglVxuICAgICAgICBjb25zdCBsYXN0UGFydCA9IHBhcnRzW3BhcnRzLmxlbmd0aCAtIDFdO1xuICAgICAgICBjdXJyZW50W2xhc3RQYXJ0XSA9IGNvbHVtblZhbHVlO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICAvKipcbiAgICogSlNPTi5zdHJpbmdpZnnsmYAg7Jyg7IKs7ZWcIOydvOydhCDtlanri4jri6QuXG4gICAqIOuLpOunjCDso7zslrTsp4Qg6rCd7LK066W8IEpTT07snbQg7JWE64uMIFR5cGVTY3JpcHQg6rCd7LK0IOumrO2EsOuftCDsiqTtirjrp4HsnLzroZwg66eM65Ok7Ja07KSN64uI64ukLlxuICAgKiBrZXnsl5Ag65Sw7Ji07ZGc6rCAIOyXhuyWtOyalC5cbiAgICog7Lac66ClIOyYiOyLnDpcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiB7XG4gICAqICAgaWQ6IFwidXNlcnMuaWRcIixcbiAgICogICBwYXJlbnQ6IHtcbiAgICogICAgIGlkOiBcInBhcmVudC5pZFwiLFxuICAgKiAgICAgbmFtZTogXCJwYXJlbnQubmFtZVwiLFxuICAgKiAgIH0sXG4gICAqIH1cbiAgICogYGBgXG4gICAqIEBwYXJhbSBvYmog67OA7ZmY7ZWgIOqwneyytFxuICAgKiBAcGFyYW0gaW5kZW50IOuTpOyXrOyTsOq4sCDroIjrsqhcbiAgICogQHBhcmFtIHdpdGhCcmFjZXMgdHJ1ZeuptCDspJHqtITtmLgg7Y+s7ZWoLCBmYWxzZeuptCDrgrTsmqnrp4wg67CY7ZmYXG4gICAqL1xuICBwcml2YXRlIHN0cmluZ2lmeU5lc3RlZFNlbGVjdE9iamVjdChcbiAgICAvLyBveGxpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueSAtLSDspJHssqkg7Jik67iM7KCd7Yq47J2YIOqwkuydgCBzdHJpbmfsnbwg7IiY64+EIOyeiOqzoCDrmJDri6Trpbgg7Jik67iM7KCd7Yq47J28IOyImOuPhCDsnojripTrjbAsIOydtOulvCDsnqzqt4Ag7YOA7J6F7Jy866GcIOuCmO2DgOuCvCDsiJgg7JeG7Ja0IGFueeuhnCDsspjrpqztlanri4jri6QuXG4gICAgb2JqOiBSZWNvcmQ8c3RyaW5nLCBhbnk+LFxuICAgIGluZGVudDogbnVtYmVyID0gMCxcbiAgICB3aXRoQnJhY2VzOiBib29sZWFuID0gdHJ1ZSxcbiAgKTogc3RyaW5nIHtcbiAgICBjb25zdCBzcGFjZXMgPSBcIiAgXCIucmVwZWF0KGluZGVudCk7XG4gICAgY29uc3QgaW5uZXJTcGFjZXMgPSBcIiAgXCIucmVwZWF0KGluZGVudCArIDEpO1xuXG4gICAgY29uc3QgZW50cmllcyA9IE9iamVjdC5lbnRyaWVzKG9iaik7XG4gICAgaWYgKGVudHJpZXMubGVuZ3RoID09PSAwKSByZXR1cm4gd2l0aEJyYWNlcyA/IFwie31cIiA6IFwiXCI7XG5cbiAgICBjb25zdCBsaW5lcyA9IGVudHJpZXMubWFwKChba2V5LCB2YWx1ZV0pID0+IHtcbiAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgLy8g7Lus65+8IOqyveuhnCAo7J2066+4IOuUsOyYtO2RnCDtj6ztlagpXG4gICAgICAgIHJldHVybiBgJHtpbm5lclNwYWNlc30ke2tleX06ICR7dmFsdWV9LGA7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyDspJHssqkg6rCd7LK0ICjtla3sg4Eg7KSR6rSE7Zi4IO2PrO2VqClcbiAgICAgICAgcmV0dXJuIGAke2lubmVyU3BhY2VzfSR7a2V5fTogJHt0aGlzLnN0cmluZ2lmeU5lc3RlZFNlbGVjdE9iamVjdCh2YWx1ZSwgaW5kZW50ICsgMSwgdHJ1ZSl9LGA7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBpZiAod2l0aEJyYWNlcykge1xuICAgICAgcmV0dXJuIGB7XFxuJHtsaW5lcy5qb2luKFwiXFxuXCIpfVxcbiR7c3BhY2VzfX1gO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyDspJHqtITtmLgg7JeG7J20IOuCtOyaqeunjCDrsJjtmZggKOyVnuuSpCDqsJztlokg7KCc7Jm4KVxuICAgICAgcmV0dXJuIGxpbmVzLmpvaW4oXCJcXG5cIik7XG4gICAgfVxuICB9XG5cbiAgZ2V0UHVyaUxvYWRlclF1ZXJ5KHN1YnNldEtleTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBjb25zdCBzdWJzZXQgPSB0aGlzLmdldFN1YnNldEZpZWxkc0ZvclF1ZXJ5KHN1YnNldEtleSk7XG4gICAgY29uc3QgeyBsb2FkZXJzIH0gPSB0aGlzLnJlc29sdmVTdWJzZXRRdWVyeShcIlwiLCBzdWJzZXQpO1xuXG4gICAgY29uc3QgbGluZXM6IHN0cmluZ1tdID0gW2BbYF07XG5cbiAgICAvLyDsnqzqt4DsoIHsnLzroZwgbG9hZGVyIOyDneyEse2VmOuKlCDtl6ztjbwg7ZWo7IiYXG4gICAgY29uc3QgZ2VuZXJhdGVMb2FkZXJDb2RlID0gKGxvYWRlcnM6IFN1YnNldFF1ZXJ5W1wibG9hZGVyc1wiXSk6IHN0cmluZ1tdID0+IHtcbiAgICAgIGNvbnN0IGxvYWRlckxpbmVzOiBzdHJpbmdbXSA9IFtdO1xuXG4gICAgICBmb3IgKGNvbnN0IGxvYWRlciBvZiBsb2FkZXJzKSB7XG4gICAgICAgIGNvbnN0IHsgdG9UYWJsZSwgdG9Db2wsIHRocm91Z2gsIGZyb21UYWJsZSB9ID0gbG9hZGVyLm1hbnlKb2luO1xuXG4gICAgICAgIC8vIGZyb21UYWJsZeydmCBFbnRpdHnrpbwg6rCA7KC47JmA7IScIFBLIO2DgOyehSDtmZXsnbhcbiAgICAgICAgY29uc3QgZnJvbUVudGl0eSA9IEVudGl0eU1hbmFnZXIuZ2V0QnlUYWJsZShmcm9tVGFibGUpO1xuICAgICAgICBjb25zdCBmcm9tSWRzVHlwZSA9IGZyb21FbnRpdHkuZ2V0UGtBcnJheVR5cGUoKTtcblxuICAgICAgICBsb2FkZXJMaW5lcy5wdXNoKFxuICAgICAgICAgIFwie1wiLFxuICAgICAgICAgIGBhczogXCIke2xvYWRlci5hc31cIixgLFxuICAgICAgICAgIGByZWZJZDogXCIke2xvYWRlci5tYW55Sm9pbi5pZEZpZWxkfVwiLGAsXG4gICAgICAgICAgYHFiOiAocWJXcmFwcGVyOiBQdXJpV3JhcHBlcjxEYXRhYmFzZVNjaGVtYUV4dGVuZD4sIGZyb21JZHM6IG51bWJlcltdIHwgc3RyaW5nW10pID0+IHtgLFxuICAgICAgICApO1xuXG4gICAgICAgIGlmICh0aHJvdWdoID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAvLyBIYXNNYW55XG4gICAgICAgICAgbG9hZGVyTGluZXMucHVzaChcbiAgICAgICAgICAgIC8vXG4gICAgICAgICAgICBcInJldHVybiBxYldyYXBwZXJcIixcbiAgICAgICAgICAgIGAuZnJvbShcIiR7dG9UYWJsZX1cIilgLFxuICAgICAgICAgICk7XG5cbiAgICAgICAgICBsb2FkZXIub25lSm9pbnMuZm9yRWFjaCgoam9pbjogU3Vic2V0UXVlcnlbXCJqb2luc1wiXVtudW1iZXJdKSA9PiB7XG4gICAgICAgICAgICAvLyBGSyBudWxsYWJsZSDsl6zrtoDripQgbGVmdEpvaW4g7YOA7J6FIOyLnOq3uOuLiOyymOyXkOyEnCDsnpDrj5nsnLzroZwg7YyQ64uo65CoXG4gICAgICAgICAgICBjb25zdCBqb2luTWV0aG9kID0gam9pbi5qb2luID09PSBcImlubmVyXCIgPyBcImpvaW5cIiA6IFwibGVmdEpvaW5cIjtcbiAgICAgICAgICAgIGlmIChcImN1c3RvbVwiIGluIGpvaW4pIHtcbiAgICAgICAgICAgICAgLy8gY3VzdG9tIGpvaW4gY2xhdXNl64qUIGNhbGxiYWNrIO2Yle2DnOydmCBvbiDrqZTshJzrk5zroZwg7LKY66as7ZWp64uI64ukLlxuICAgICAgICAgICAgICBsb2FkZXJMaW5lcy5wdXNoKFxuICAgICAgICAgICAgICAgIGAuJHtqb2luTWV0aG9kfSh7ICR7am9pbi5hc306IFwiJHtqb2luLnRhYmxlfVwiIH0sIChqKSA9PiB7YCxcbiAgICAgICAgICAgICAgICBgai5vbihQdXJpLnJhd1N0cmluZyhcIiR7am9pbi5jdXN0b219XCIpKTtgLFxuICAgICAgICAgICAgICAgIFwifSlcIixcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGxvYWRlckxpbmVzLnB1c2goXG4gICAgICAgICAgICAgICAgYC4ke2pvaW5NZXRob2R9KHsgJHtqb2luLmFzfTogXCIke2pvaW4udGFibGV9XCIgfSwgXCIke2pvaW4uZnJvbX1cIiwgXCIke2pvaW4udG99XCIpYCxcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIC8vIOyeheyytOyggSBzZWxlY3Qg6rWs7KGwIOyDneyEsSAocmVmSWQg7Y+s7ZWoKVxuICAgICAgICAgIGNvbnN0IHNlbGVjdE9iaiA9IHRoaXMuYnVpbGROZXN0ZWRTZWxlY3RPYmplY3QobG9hZGVyLnNlbGVjdCk7XG4gICAgICAgICAgc2VsZWN0T2JqLnJlZklkID0gYFwiJHt0b1RhYmxlfS4ke3RvQ29sfVwiYDtcbiAgICAgICAgICBsb2FkZXJMaW5lcy5wdXNoKFxuICAgICAgICAgICAgYC53aGVyZUluKFwiJHt0b1RhYmxlfS4ke3RvQ29sfVwiLCBmcm9tSWRzIGFzICR7ZnJvbUlkc1R5cGV9KWAsXG4gICAgICAgICAgICBgLnNlbGVjdCgke3RoaXMuc3RyaW5naWZ5TmVzdGVkU2VsZWN0T2JqZWN0KHNlbGVjdE9iail9KTtgLFxuICAgICAgICAgICk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gTWFueVRvTWFueVxuICAgICAgICAgIGxvYWRlckxpbmVzLnB1c2goXG4gICAgICAgICAgICBcInJldHVybiBxYldyYXBwZXJcIixcbiAgICAgICAgICAgIGAuZnJvbShcIiR7dGhyb3VnaC50YWJsZX1cIilgLFxuICAgICAgICAgICAgYC5qb2luKFwiJHt0b1RhYmxlfVwiLCBcIiR7dGhyb3VnaC50YWJsZX0uJHt0aHJvdWdoLnRvQ29sfVwiLCBcIiR7dG9UYWJsZX0uJHt0b0NvbH1cIilgLFxuICAgICAgICAgICk7XG5cbiAgICAgICAgICBsb2FkZXIub25lSm9pbnMuZm9yRWFjaCgoam9pbjogU3Vic2V0UXVlcnlbXCJqb2luc1wiXVtudW1iZXJdKSA9PiB7XG4gICAgICAgICAgICAvLyBGSyBudWxsYWJsZSDsl6zrtoDripQgbGVmdEpvaW4g7YOA7J6FIOyLnOq3uOuLiOyymOyXkOyEnCDsnpDrj5nsnLzroZwg7YyQ64uo65CoXG4gICAgICAgICAgICBjb25zdCBqb2luTWV0aG9kID0gam9pbi5qb2luID09PSBcImlubmVyXCIgPyBcImpvaW5cIiA6IFwibGVmdEpvaW5cIjtcbiAgICAgICAgICAgIGlmIChcImN1c3RvbVwiIGluIGpvaW4pIHtcbiAgICAgICAgICAgICAgLy8gY3VzdG9tIGpvaW4gY2xhdXNl64qUIGNhbGxiYWNrIO2Yle2DnOydmCBvbiDrqZTshJzrk5zroZwg7LKY66as7ZWp64uI64ukLlxuICAgICAgICAgICAgICBsb2FkZXJMaW5lcy5wdXNoKFxuICAgICAgICAgICAgICAgIGAuJHtqb2luTWV0aG9kfSh7ICR7am9pbi5hc306IFwiJHtqb2luLnRhYmxlfVwiIH0sIChqKSA9PiB7YCxcbiAgICAgICAgICAgICAgICBgai5vbihQdXJpLnJhd1N0cmluZyhcIiR7am9pbi5jdXN0b219XCIpKTtgLFxuICAgICAgICAgICAgICAgIFwifSlcIixcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGxvYWRlckxpbmVzLnB1c2goXG4gICAgICAgICAgICAgICAgYC4ke2pvaW5NZXRob2R9KHsgJHtqb2luLmFzfTogXCIke2pvaW4udGFibGV9XCIgfSwgXCIke2pvaW4uZnJvbX1cIiwgXCIke2pvaW4udG99XCIpYCxcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIC8vIOyeheyytOyggSBzZWxlY3Qg6rWs7KGwIOyDneyEsSAocmVmSWQg7Y+s7ZWoKVxuICAgICAgICAgIGNvbnN0IHNlbGVjdE9iaiA9IHRoaXMuYnVpbGROZXN0ZWRTZWxlY3RPYmplY3QobG9hZGVyLnNlbGVjdCk7XG4gICAgICAgICAgc2VsZWN0T2JqLnJlZklkID0gYFwiJHt0aHJvdWdoLnRhYmxlfS4ke3Rocm91Z2guZnJvbUNvbH1cImA7XG4gICAgICAgICAgbG9hZGVyTGluZXMucHVzaChcbiAgICAgICAgICAgIGAud2hlcmVJbihcIiR7dGhyb3VnaC50YWJsZX0uJHt0aHJvdWdoLmZyb21Db2x9XCIsIGZyb21JZHMgYXMgJHtmcm9tSWRzVHlwZX0pYCxcbiAgICAgICAgICAgIGAuc2VsZWN0KCR7dGhpcy5zdHJpbmdpZnlOZXN0ZWRTZWxlY3RPYmplY3Qoc2VsZWN0T2JqKX0pO2AsXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxvYWRlckxpbmVzLnB1c2goYH0sYCk7XG5cbiAgICAgICAgLy8g7KSR7LKpIGxvYWRlcnMg7LKY66asXG4gICAgICAgIGlmIChsb2FkZXIubG9hZGVycyAmJiBsb2FkZXIubG9hZGVycy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgbG9hZGVyTGluZXMucHVzaChcImxvYWRlcnM6IFtcIiwgLi4uZ2VuZXJhdGVMb2FkZXJDb2RlKGxvYWRlci5sb2FkZXJzKSwgXCJdLFwiKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxvYWRlckxpbmVzLnB1c2goXCJ9LFwiKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGxvYWRlckxpbmVzO1xuICAgIH07XG5cbiAgICBsaW5lcy5wdXNoKC4uLmdlbmVyYXRlTG9hZGVyQ29kZShsb2FkZXJzKSk7XG4gICAgbGluZXMucHVzaChgXWApO1xuXG4gICAgcmV0dXJuIGxpbmVzLmpvaW4oXCJcXG5cIik7XG4gIH1cblxuICAvKlxuICAgIHN1YnNldCBTRUxFQ1QvSk9JTi9MT0FERVIg6rKw6rO8IOumrO2EtFxuICAqL1xuICBnZXRTdWJzZXRRdWVyeShzdWJzZXRLZXk6IHN0cmluZyk6IFN1YnNldFF1ZXJ5IHtcbiAgICBjb25zdCBzdWJzZXQgPSB0aGlzLmdldFN1YnNldEZpZWxkc0ZvclF1ZXJ5KHN1YnNldEtleSk7XG5cbiAgICBjb25zdCByZXN1bHQ6IFN1YnNldFF1ZXJ5ID0gdGhpcy5yZXNvbHZlU3Vic2V0UXVlcnkoXCJcIiwgc3Vic2V0KTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgLypcbiAgICovXG4gIHJlc29sdmVTdWJzZXRRdWVyeShcbiAgICBwcmVmaXg6IHN0cmluZyxcbiAgICBmaWVsZHM6IHN0cmluZ1tdLFxuICAgIGlzQWxyZWFkeU91dGVySm9pbmVkOiBib29sZWFuID0gZmFsc2UsXG4gICk6IFN1YnNldFF1ZXJ5IHtcbiAgICAvLyBwcmVmaXgg7LmY7ZmYIChwcmVmaXjripQgVG9PbmVSZWxhdGlvbuydtCDrs7XsiJjroZwg67aZ7J2AIOqyveyasCDrqqjrkZAgX1/roZwg67OA6rK965CoKVxuICAgIHByZWZpeCA9IHByZWZpeC5yZXBsYWNlKC9cXC4vZywgXCJfX1wiKTtcblxuICAgIC8vIOyEnOu4jOyFi+ydhCAx646B7Iqk66eMIOu2hOumrO2VmOyXrCDqt7jro7ntlZFcbiAgICBjb25zdCBzdWJzZXRHcm91cCA9IGdyb3VwKGZpZWxkcywgKGZpZWxkKSA9PiB7XG4gICAgICBpZiAoZmllbGQuaW5jbHVkZXMoXCIuXCIpKSB7XG4gICAgICAgIGNvbnN0IFtyZWxdID0gZmllbGQuc3BsaXQoXCIuXCIpO1xuICAgICAgICByZXR1cm4gcmVsO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIFwiXCI7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBjb25zdCByZXN1bHQgPSBPYmplY3Qua2V5cyhzdWJzZXRHcm91cCkucmVkdWNlKFxuICAgICAgKHIsIGdyb3VwS2V5KSA9PiB7XG4gICAgICAgIGNvbnN0IGZpZWxkcyA9IHN1YnNldEdyb3VwW2dyb3VwS2V5XTtcbiAgICAgICAgYXNzZXJ0KGZpZWxkcyAhPT0gdW5kZWZpbmVkLCBcImZpZWxkcyBpcyB1bmRlZmluZWRcIik7XG5cbiAgICAgICAgLy8g7ZiE7J6sIO2FjOydtOu4lCDtlYTrk5zshYvsnYAgc2VsZWN0LCB2aXJ0dWFs7JeQIOy2lOqwgO2VmOqzoCDrpqzthLRcbiAgICAgICAgaWYgKGdyb3VwS2V5ID09PSBcIlwiKSB7XG4gICAgICAgICAgY29uc3QgcmVhbEZpZWxkcyA9IGZpZWxkcy5maWx0ZXIoKGZpZWxkKSA9PiAhaXNWaXJ0dWFsUHJvcCh0aGlzLnByb3BzRGljdFtmaWVsZF0pKTtcbiAgICAgICAgICAvLyB2aXJ0dWFsVHlwZTogXCJjb2RlXCIgKOuYkOuKlCB1bmRlZmluZWQp7J24IHZpcnR1YWwgcHJvcOunjCByLnZpcnR1YWzsl5Ag7LaU6rCAXG4gICAgICAgICAgLy8gdmlydHVhbFR5cGU6IFwicXVlcnlcIuyduCDqsr3smrAg7IKs7Jqp7J6Q6rCAIGFwcGVuZFNlbGVjdOuhnCDsp4HsoJEg7LaU6rCA7ZWY66+A66GcIOygnOyZuFxuICAgICAgICAgIGNvbnN0IHZpcnR1YWxDb2RlRmllbGRzID0gZmllbGRzLmZpbHRlcigoZmllbGQpID0+XG4gICAgICAgICAgICBpc1ZpcnR1YWxDb2RlUHJvcCh0aGlzLnByb3BzRGljdFtmaWVsZF0pLFxuICAgICAgICAgICk7XG5cbiAgICAgICAgICBpZiAocHJlZml4ID09PSBcIlwiKSB7XG4gICAgICAgICAgICAvLyDtmITsnqwg7YWM7J2067iU7J24IOqyveyasFxuICAgICAgICAgICAgci5zZWxlY3QgPSByLnNlbGVjdC5jb25jYXQocmVhbEZpZWxkcy5tYXAoKGZpZWxkKSA9PiB0aGlzLmdldEZ1bGxGaWVsZE5hbWUoZmllbGQpKSk7XG4gICAgICAgICAgICByLnZpcnR1YWwgPSByLnZpcnR1YWwuY29uY2F0KHZpcnR1YWxDb2RlRmllbGRzKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8g64SY7Ja07JioIO2FjOydtOu4lOyduCDqsr3smrBcbiAgICAgICAgICAgIHIuc2VsZWN0ID0gci5zZWxlY3QuY29uY2F0KFxuICAgICAgICAgICAgICByZWFsRmllbGRzLm1hcCgoZmllbGQpID0+IGAke3ByZWZpeH0uJHtmaWVsZH0gYXMgJHtwcmVmaXh9X18ke2ZpZWxkfWApLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4gcjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHJlbGF0aW9uID0gdGhpcy5yZWxhdGlvbnNbZ3JvdXBLZXldO1xuICAgICAgICBpZiAocmVsYXRpb24gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihg7KG07J6s7ZWY7KeAIOyViuuKlCByZWxhdGlvbiDssLjsobAgJHtncm91cEtleX1gKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCByZWxFbnRpdHkgPSBFbnRpdHlNYW5hZ2VyLmdldChyZWxhdGlvbi53aXRoKTtcblxuICAgICAgICBpZiAoaXNPbmVUb09uZVJlbGF0aW9uUHJvcChyZWxhdGlvbikgfHwgaXNCZWxvbmdzVG9PbmVSZWxhdGlvblByb3AocmVsYXRpb24pKSB7XG4gICAgICAgICAgLy8gLU9uZSBSZWxhdGlvbjogSk9JTiDsnLzroZwg7LKY66asXG4gICAgICAgICAgY29uc3QgcmVsRmllbGRzID0gZmllbGRzLm1hcCgoZmllbGQpID0+IGZpZWxkLnNwbGl0KFwiLlwiKS5zbGljZSgxKS5qb2luKFwiLlwiKSk7XG5cbiAgICAgICAgICAvLyAtT25lIFJlbGF0aW9u7JeQ7IScIGlkIO2VhOuTnOunjCDssLjsobDtlZjripQg6rK97JqwIOumtOugiOydtOyFmCDrhJjquLDsp4Ag7JWK6rOgIOumrO2EtFxuICAgICAgICAgIGlmIChyZWxGaWVsZHMubGVuZ3RoID09PSAxICYmIHJlbEZpZWxkc1swXSA9PT0gXCJpZFwiKSB7XG4gICAgICAgICAgICBpZiAocHJlZml4ID09PSBcIlwiKSB7XG4gICAgICAgICAgICAgIHIuc2VsZWN0ID0gci5zZWxlY3QuY29uY2F0KGAke3RoaXMudGFibGV9LiR7Z3JvdXBLZXl9X2lkYCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICByLnNlbGVjdCA9IHIuc2VsZWN0LmNvbmNhdChgJHtwcmVmaXh9LiR7Z3JvdXBLZXl9X2lkIGFzICR7cHJlZml4fV9fJHtncm91cEtleX1faWRgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiByO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIGlubmVyT3JPdXRlclxuICAgICAgICAgIGNvbnN0IGlubmVyT3JPdXRlciA9ICgoKSA9PiB7XG4gICAgICAgICAgICBpZiAoaXNBbHJlYWR5T3V0ZXJKb2luZWQpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIFwib3V0ZXJcIjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGlzT25lVG9PbmVSZWxhdGlvblByb3AocmVsYXRpb24pKSB7XG4gICAgICAgICAgICAgIGlmIChyZWxhdGlvbi5oYXNKb2luQ29sdW1uICYmICEocmVsYXRpb24ubnVsbGFibGUgPz8gZmFsc2UpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFwiaW5uZXJcIjtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gXCJvdXRlclwiO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBpZiAocmVsYXRpb24ubnVsbGFibGUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gXCJvdXRlclwiO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiBcImlubmVyXCI7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KSgpO1xuICAgICAgICAgIGNvbnN0IHJlbFN1YnNldFF1ZXJ5ID0gcmVsRW50aXR5LnJlc29sdmVTdWJzZXRRdWVyeShcbiAgICAgICAgICAgIGAke3ByZWZpeCAhPT0gXCJcIiA/IGAke3ByZWZpeH0uYCA6IFwiXCJ9JHtncm91cEtleX1gLFxuICAgICAgICAgICAgcmVsRmllbGRzLFxuICAgICAgICAgICAgaW5uZXJPck91dGVyID09PSBcIm91dGVyXCIsXG4gICAgICAgICAgKTtcbiAgICAgICAgICByLnNlbGVjdCA9IHIuc2VsZWN0LmNvbmNhdChyZWxTdWJzZXRRdWVyeS5zZWxlY3QpO1xuICAgICAgICAgIHIudmlydHVhbCA9IHIudmlydHVhbC5jb25jYXQocmVsU3Vic2V0UXVlcnkudmlydHVhbCk7XG5cbiAgICAgICAgICBjb25zdCBqb2luQXMgPSBwcmVmaXggPT09IFwiXCIgPyBncm91cEtleSA6IGAke3ByZWZpeH1fXyR7Z3JvdXBLZXl9YDtcbiAgICAgICAgICBjb25zdCBmcm9tVGFibGUgPSBwcmVmaXggPT09IFwiXCIgPyB0aGlzLnRhYmxlIDogcHJlZml4O1xuXG4gICAgICAgICAgbGV0IGpvaW5DbGF1c2U6XG4gICAgICAgICAgICB8IHtcbiAgICAgICAgICAgICAgICBmcm9tOiBzdHJpbmc7XG4gICAgICAgICAgICAgICAgdG86IHN0cmluZztcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfCB7XG4gICAgICAgICAgICAgICAgY3VzdG9tOiBzdHJpbmc7XG4gICAgICAgICAgICAgIH07XG4gICAgICAgICAgaWYgKHJlbGF0aW9uLmN1c3RvbUpvaW5DbGF1c2UpIHtcbiAgICAgICAgICAgIGpvaW5DbGF1c2UgPSB7XG4gICAgICAgICAgICAgIGN1c3RvbTogcmVsYXRpb24uY3VzdG9tSm9pbkNsYXVzZSxcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGxldCBmcm9tOiBzdHJpbmcsIHRvOiBzdHJpbmc7XG4gICAgICAgICAgICBpZiAoaXNPbmVUb09uZVJlbGF0aW9uUHJvcChyZWxhdGlvbikpIHtcbiAgICAgICAgICAgICAgaWYgKHJlbGF0aW9uLmhhc0pvaW5Db2x1bW4pIHtcbiAgICAgICAgICAgICAgICBmcm9tID0gYCR7ZnJvbVRhYmxlfS4ke3JlbGF0aW9uLm5hbWV9X2lkYDtcbiAgICAgICAgICAgICAgICB0byA9IGAke2pvaW5Bc30uaWRgO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGZyb20gPSBgJHtmcm9tVGFibGV9LmlkYDtcbiAgICAgICAgICAgICAgICB0byA9IGAke2pvaW5Bc30uJHtpbmZsZWN0aW9uLnVuZGVyc2NvcmUodGhpcy5uYW1lcy5mcy5yZXBsYWNlKC8tL2csIFwiX1wiKSl9X2lkYDtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgZnJvbSA9IGAke2Zyb21UYWJsZX0uJHtyZWxhdGlvbi5uYW1lfV9pZGA7XG4gICAgICAgICAgICAgIHRvID0gYCR7am9pbkFzfS5pZGA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBqb2luQ2xhdXNlID0ge1xuICAgICAgICAgICAgICBmcm9tLFxuICAgICAgICAgICAgICB0byxcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgci5qb2lucy5wdXNoKHtcbiAgICAgICAgICAgIGFzOiBqb2luQXMsXG4gICAgICAgICAgICBqb2luOiBpbm5lck9yT3V0ZXIsXG4gICAgICAgICAgICB0YWJsZTogcmVsRW50aXR5LnRhYmxlLFxuICAgICAgICAgICAgLi4uam9pbkNsYXVzZSxcbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIC8vIEJlbG9uZ3NUb09uZSDrsJHsl5AgSGFzTWFueeqwgCDrtpnsnYAg6rK97JqwXG4gICAgICAgICAgaWYgKHJlbFN1YnNldFF1ZXJ5LmxvYWRlcnMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgY29uc3QgY29udmVydGVkTG9hZGVycyA9IHJlbFN1YnNldFF1ZXJ5LmxvYWRlcnMubWFwKChsb2FkZXIpID0+IHtcbiAgICAgICAgICAgICAgY29uc3QgbmV3QXMgPSBbZ3JvdXBLZXksIGxvYWRlci5hc10uam9pbihcIl9fXCIpO1xuICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIGFzOiBuZXdBcyxcbiAgICAgICAgICAgICAgICB0YWJsZTogbG9hZGVyLnRhYmxlLFxuICAgICAgICAgICAgICAgIG1hbnlKb2luOiBsb2FkZXIubWFueUpvaW4sXG4gICAgICAgICAgICAgICAgb25lSm9pbnM6IGxvYWRlci5vbmVKb2lucyxcbiAgICAgICAgICAgICAgICBzZWxlY3Q6IGxvYWRlci5zZWxlY3QsXG4gICAgICAgICAgICAgICAgbG9hZGVyczogbG9hZGVyLmxvYWRlcnMsXG4gICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgci5sb2FkZXJzID0gWy4uLnIubG9hZGVycywgLi4uY29udmVydGVkTG9hZGVyc107XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgci5qb2lucyA9IHIuam9pbnMuY29uY2F0KHJlbFN1YnNldFF1ZXJ5LmpvaW5zKTtcbiAgICAgICAgfSBlbHNlIGlmIChpc0hhc01hbnlSZWxhdGlvblByb3AocmVsYXRpb24pIHx8IGlzTWFueVRvTWFueVJlbGF0aW9uUHJvcChyZWxhdGlvbikpIHtcbiAgICAgICAgICAvLyAtTWFueSBSZWxhdGlvbjogTG9hZGVyIOuhnCDsspjrpqxcbiAgICAgICAgICBjb25zdCByZWxGaWVsZHMgPSBmaWVsZHMubWFwKChmaWVsZCkgPT4gZmllbGQuc3BsaXQoXCIuXCIpLnNsaWNlKDEpLmpvaW4oXCIuXCIpKTtcbiAgICAgICAgICBjb25zdCByZWxTdWJzZXRRdWVyeSA9IHJlbEVudGl0eS5yZXNvbHZlU3Vic2V0UXVlcnkoXCJcIiwgcmVsRmllbGRzKTtcblxuICAgICAgICAgIGxldCBtYW55Sm9pbjogU3Vic2V0UXVlcnlbXCJsb2FkZXJzXCJdW251bWJlcl1bXCJtYW55Sm9pblwiXTtcbiAgICAgICAgICBpZiAoaXNIYXNNYW55UmVsYXRpb25Qcm9wKHJlbGF0aW9uKSkge1xuICAgICAgICAgICAgY29uc3QgZnJvbUNvbCA9IHJlbGF0aW9uPy5mcm9tQ29sdW1uID8/IFwiaWRcIjtcbiAgICAgICAgICAgIG1hbnlKb2luID0ge1xuICAgICAgICAgICAgICBmcm9tVGFibGU6IHRoaXMudGFibGUsXG4gICAgICAgICAgICAgIGZyb21Db2wsXG4gICAgICAgICAgICAgIGlkRmllbGQ6IHByZWZpeCA9PT0gXCJcIiA/IGAke2Zyb21Db2x9YCA6IGAke3ByZWZpeH1fXyR7ZnJvbUNvbH1gLFxuICAgICAgICAgICAgICB0b1RhYmxlOiByZWxFbnRpdHkudGFibGUsXG4gICAgICAgICAgICAgIHRvQ29sOiByZWxhdGlvbi5qb2luQ29sdW1uLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICB9IGVsc2UgaWYgKGlzTWFueVRvTWFueVJlbGF0aW9uUHJvcChyZWxhdGlvbikpIHtcbiAgICAgICAgICAgIG1hbnlKb2luID0ge1xuICAgICAgICAgICAgICBmcm9tVGFibGU6IHRoaXMudGFibGUsXG4gICAgICAgICAgICAgIGZyb21Db2w6IFwiaWRcIixcbiAgICAgICAgICAgICAgaWRGaWVsZDogcHJlZml4ID09PSBcIlwiID8gYGlkYCA6IGAke3ByZWZpeH1fX2lkYCxcbiAgICAgICAgICAgICAgdGhyb3VnaDoge1xuICAgICAgICAgICAgICAgIHRhYmxlOiByZWxhdGlvbi5qb2luVGFibGUsXG4gICAgICAgICAgICAgICAgZnJvbUNvbDogYCR7aW5mbGVjdGlvbi5zaW5ndWxhcml6ZSh0aGlzLnRhYmxlKX1faWRgLFxuICAgICAgICAgICAgICAgIHRvQ29sOiBgJHtpbmZsZWN0aW9uLnNpbmd1bGFyaXplKHJlbEVudGl0eS50YWJsZSl9X2lkYCxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgdG9UYWJsZTogcmVsRW50aXR5LnRhYmxlLFxuICAgICAgICAgICAgICB0b0NvbDogXCJpZFwiLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgci5sb2FkZXJzLnB1c2goe1xuICAgICAgICAgICAgYXM6IGdyb3VwS2V5LFxuICAgICAgICAgICAgdGFibGU6IHJlbEVudGl0eS50YWJsZSxcbiAgICAgICAgICAgIG1hbnlKb2luLFxuICAgICAgICAgICAgb25lSm9pbnM6IHJlbFN1YnNldFF1ZXJ5LmpvaW5zLFxuICAgICAgICAgICAgc2VsZWN0OiByZWxTdWJzZXRRdWVyeS5zZWxlY3QsXG4gICAgICAgICAgICBsb2FkZXJzOiByZWxTdWJzZXRRdWVyeS5sb2FkZXJzLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHI7XG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBzZWxlY3Q6IFtdLFxuICAgICAgICB2aXJ0dWFsOiBbXSxcbiAgICAgICAgam9pbnM6IFtdLFxuICAgICAgICBsb2FkZXJzOiBbXSxcbiAgICAgIH0gYXMgU3Vic2V0UXVlcnksXG4gICAgKTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgLypcbiAgICBGaWVsZEV4cHJbXSDsnYQgRW50aXR5UHJvcE5vZGVbXSDroZwg67OA7ZmYXG4gICovXG4gIGZpZWxkRXhwcnNUb1Byb3BOb2RlcyhmaWVsZEV4cHJzOiBzdHJpbmdbXSwgZW50aXR5OiBFbnRpdHkgPSB0aGlzKTogRW50aXR5UHJvcE5vZGVbXSB7XG4gICAgY29uc3QgZ3JvdXBzID0gZmllbGRFeHBycy5yZWR1Y2UoXG4gICAgICAocmVzdWx0LCBmaWVsZEV4cHIpID0+IHtcbiAgICAgICAgbGV0IGtleTogc3RyaW5nLCB2YWx1ZTogc3RyaW5nLCBlbHNlRXhwcjogc3RyaW5nW107XG4gICAgICAgIGlmIChmaWVsZEV4cHIuaW5jbHVkZXMoXCIuXCIpKSB7XG4gICAgICAgICAgW2tleSwgLi4uZWxzZUV4cHJdID0gZmllbGRFeHByLnNwbGl0KFwiLlwiKTtcbiAgICAgICAgICB2YWx1ZSA9IGVsc2VFeHByLmpvaW4oXCIuXCIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGtleSA9IFwiXCI7XG4gICAgICAgICAgdmFsdWUgPSBmaWVsZEV4cHI7XG4gICAgICAgIH1cbiAgICAgICAgcmVzdWx0W2tleV0gPSAocmVzdWx0W2tleV0gPz8gW10pLmNvbmNhdCh2YWx1ZSk7XG5cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgIH0sXG4gICAgICB7fSBhcyB7XG4gICAgICAgIFtrOiBzdHJpbmddOiBzdHJpbmdbXTtcbiAgICAgIH0sXG4gICAgKTtcblxuICAgIHJldHVybiBPYmplY3Qua2V5cyhncm91cHMpLmZsYXRNYXA8RW50aXR5UHJvcE5vZGUsIEVudGl0eVByb3BOb2RlW10+KChrZXkpID0+IHtcbiAgICAgIGNvbnN0IGdyb3VwID0gZ3JvdXBzW2tleV07XG5cbiAgICAgIC8vIOydvOuwmCBwcm9wIOyymOumrFxuICAgICAgaWYgKGtleSA9PT0gXCJcIikge1xuICAgICAgICByZXR1cm4gZ3JvdXAubWFwKChwcm9wTmFtZSkgPT4ge1xuICAgICAgICAgIGNvbnN0IHByb3AgPSBlbnRpdHkucHJvcHMuZmluZCgocCkgPT4gcC5uYW1lID09PSBwcm9wTmFtZSk7XG4gICAgICAgICAgaWYgKHByb3AgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgICBgJHtlbnRpdHkuaWR9IC0tIOyemOuqu+uQnCBGaWVsZEV4cHIgJyR7cHJvcE5hbWV9JyAo7IKs7JqpIOqwgOuKpe2VnCBwcm9wczogJHtlbnRpdHkucHJvcHMubWFwKChwKSA9PiBwLm5hbWUpLmpvaW4oXCIsIFwiKX0pYCxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBub2RlVHlwZTogXCJwbGFpblwiIGFzIGNvbnN0LFxuICAgICAgICAgICAgcHJvcCxcbiAgICAgICAgICB9O1xuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgLy8gcmVsYXRpb24gcHJvcCDsspjrpqxcbiAgICAgIGNvbnN0IHByb3AgPSBlbnRpdHkucHJvcHNEaWN0W2tleV07XG4gICAgICBpZiAoIWlzUmVsYXRpb25Qcm9wKHByb3ApKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihg7J6Y66q765CcIEZpZWxkRXhwciAke2tleX0uJHtncm91cFswXX1gKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHJlbEVudGl0eSA9IEVudGl0eU1hbmFnZXIuZ2V0KHByb3Aud2l0aCk7XG5cbiAgICAgIC8vIHJlbGF0aW9uIC1PbmUg7JeQIGlkIO2VhOuTnCDtlZjrgpjsnbgg6rK97JqwXG4gICAgICBpZiAoaXNCZWxvbmdzVG9PbmVSZWxhdGlvblByb3AocHJvcCkgfHwgaXNPbmVUb09uZVJlbGF0aW9uUHJvcChwcm9wKSkge1xuICAgICAgICBpZiAoZ3JvdXAubGVuZ3RoID09PSAxICYmIChncm91cFswXSA9PT0gXCJpZFwiIHx8IGdyb3VwWzBdID09PSBcImlkP1wiKSkge1xuICAgICAgICAgIC8vIGlkIO2VmOuCmOunjCDsnojripTsp4Ag7LK07YGs7ZW07IScLCDtlZjrgpjrp4wg7J6I7Jy866m0IOyDgeychCBwcm9w7Jy866GcIGlk66W8IOumrO2EtFxuICAgICAgICAgIGNvbnN0IGlkUHJvcCA9IHJlbEVudGl0eS5wcm9wc0RpY3QuaWQ7XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIG5vZGVUeXBlOiBcInBsYWluXCIgYXMgY29uc3QsXG4gICAgICAgICAgICBwcm9wOiB7XG4gICAgICAgICAgICAgIC4uLmlkUHJvcCxcbiAgICAgICAgICAgICAgbmFtZTogYCR7a2V5fV9pZGAsXG4gICAgICAgICAgICAgIG51bGxhYmxlOiBwcm9wLm51bGxhYmxlLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIC1PbmUg6re47Jm47J2YIOqyveyasCBvYmplY3TroZwg66as7YS0XG4gICAgICAvLyAtTWFueeydmCDqsr3smrAgYXJyYXnroZwg66as7YS0XG4gICAgICAvLyBSZWN1cnNpdmUg66GcIOuOgeyKpCDsspjrpqxcbiAgICAgIGNvbnN0IGNoaWxkcmVuID0gdGhpcy5maWVsZEV4cHJzVG9Qcm9wTm9kZXMoZ3JvdXAsIHJlbEVudGl0eSk7XG4gICAgICBjb25zdCBub2RlVHlwZSA9XG4gICAgICAgIGlzQmVsb25nc1RvT25lUmVsYXRpb25Qcm9wKHByb3ApIHx8IGlzT25lVG9PbmVSZWxhdGlvblByb3AocHJvcClcbiAgICAgICAgICA/IChcIm9iamVjdFwiIGFzIGNvbnN0KVxuICAgICAgICAgIDogKFwiYXJyYXlcIiBhcyBjb25zdCk7XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIG5vZGVUeXBlLFxuICAgICAgICBwcm9wLFxuICAgICAgICBjaGlsZHJlbixcbiAgICAgIH07XG4gICAgfSk7XG4gIH1cblxuICBnZXRGaWVsZEV4cHJzKHByZWZpeCA9IFwiXCIsIG1heERlcHRoOiBudW1iZXIgPSAzLCBmcm9tczogc3RyaW5nW10gPSBbXSk6IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gdGhpcy5wcm9wc1xuICAgICAgLmZsYXRNYXAoKHByb3ApID0+IHtcbiAgICAgICAgY29uc3QgcHJvcE5hbWUgPSBbcHJlZml4LCBwcm9wLm5hbWVdLmZpbHRlcigodikgPT4gdiAhPT0gXCJcIikuam9pbihcIi5cIik7XG4gICAgICAgIGlmIChwcm9wTmFtZSA9PT0gcHJlZml4KSB7XG4gICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGlzUmVsYXRpb25Qcm9wKHByb3ApKSB7XG4gICAgICAgICAgaWYgKG1heERlcHRoIDwgMCkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChmcm9tcy5pbmNsdWRlcyhwcm9wLndpdGgpKSB7XG4gICAgICAgICAgICAvLyDsl63rsKntlqUgcmVsYXRpb27snbgg6rK97JqwIOygnOyZuFxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgfVxuICAgICAgICAgIC8vIOygleuwqe2WpSByZWxhdGlvbuyduCDqsr3smrAgcmVjdXJzaXZlIOy9nFxuICAgICAgICAgIGNvbnN0IHJlbE1kID0gRW50aXR5TWFuYWdlci5nZXQocHJvcC53aXRoKTtcbiAgICAgICAgICByZXR1cm4gcmVsTWQuZ2V0RmllbGRFeHBycyhwcm9wTmFtZSwgbWF4RGVwdGggLSAxLCBbLi4uZnJvbXMsIHRoaXMuaWRdKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcHJvcE5hbWU7XG4gICAgICB9KVxuICAgICAgLmZpbHRlcigoZikgPT4gZiAhPT0gbnVsbCk7XG4gIH1cblxuICAvKipcbiAgICogUmVsYXRpb24gcHJvcOydtCDtmITsnqwg7YWM7J2067iU7JeQIEZLIOy7rOufvOydhCDsg53shLHtlZjripTsp4Ag7ZmV7J24XG4gICAqKEJlbG9uZ3NUb09uZSDrmJDripQgT25lVG9PbmUoaGFzSm9pbkNvbHVtbj10cnVlKeyduCDqsr3smrAgRksg7IOd7ISxKVxuICAgKi9cbiAgcHJpdmF0ZSBoYXNGb3JlaWduS2V5KHByb3A6IFJlbGF0aW9uUHJvcCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAoXG4gICAgICBwcm9wLnJlbGF0aW9uVHlwZSA9PT0gXCJCZWxvbmdzVG9PbmVcIiB8fFxuICAgICAgKHByb3AucmVsYXRpb25UeXBlID09PSBcIk9uZVRvT25lXCIgJiYgcHJvcC5oYXNKb2luQ29sdW1uKVxuICAgICk7XG4gIH1cblxuICBnZXRUYWJsZUNvbHVtbnMoKTogeyBuYW1lOiBzdHJpbmc7IHR5cGU6IHN0cmluZyB9W10ge1xuICAgIHJldHVybiB0aGlzLnByb3BzXG4gICAgICAubWFwKChwcm9wKSA9PiB7XG4gICAgICAgIGlmIChwcm9wLnR5cGUgPT09IFwicmVsYXRpb25cIikge1xuICAgICAgICAgIGlmICh0aGlzLmhhc0ZvcmVpZ25LZXkocHJvcCkpIHtcbiAgICAgICAgICAgIHJldHVybiB7IG5hbWU6IGAke3Byb3AubmFtZX1faWRgLCB0eXBlOiBcImludF91bnNpZ25lZFwiIH07XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4geyBuYW1lOiBwcm9wLm5hbWUsIHR5cGU6IHByb3AudHlwZSB9O1xuICAgICAgfSlcbiAgICAgIC5maWx0ZXIobm9uTnVsbGFibGUpO1xuICB9XG5cbiAgLyoqXG4gICAqIEVudGl0eeyXkCDsoJXsnZjrkJwg66qo65OgIHZlY3RvciDtg4DsnoUg7Lus65+8IOuwmO2ZmFxuICAgKi9cbiAgZ2V0VmVjdG9yQ29sdW1ucygpOiBFbnRpdHlQcm9wW10ge1xuICAgIHJldHVybiB0aGlzLnByb3BzLmZpbHRlcigocCkgPT4gcC50eXBlID09PSBcInZlY3RvclwiKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDtirnsoJUgdmVjdG9yIOy7rOufvCDrsJjtmZhcbiAgICogQHBhcmFtIGNvbHVtbk5hbWUgLSDsu6zrn7zrqoUgKOyDneuetSDsi5wg7LKrIOuyiOynuCB2ZWN0b3Ig7Lus65+8KVxuICAgKi9cbiAgZ2V0VmVjdG9yQ29sdW1uKGNvbHVtbk5hbWU/OiBzdHJpbmcpOiBFbnRpdHlQcm9wIHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCB2ZWN0b3JQcm9wcyA9IHRoaXMuZ2V0VmVjdG9yQ29sdW1ucygpO1xuICAgIGlmIChjb2x1bW5OYW1lKSB7XG4gICAgICByZXR1cm4gdmVjdG9yUHJvcHMuZmluZCgocCkgPT4gcC5uYW1lID09PSBjb2x1bW5OYW1lKTtcbiAgICB9XG4gICAgcmV0dXJuIHZlY3RvclByb3BzWzBdO1xuICB9XG5cbiAgLyoqXG4gICAqIO2VhO2EsOungSDqsIDriqXtlZwgcHJvcHMg67CY7ZmYXG4gICAqXG4gICAqIC0g7J2867CYIHByb3BcbiAgICogLSBGS+ulvCDsg53shLHtlZjripQgcmVsYXRpb24gKEJlbG9uZ3NUb09uZSwgT25lVG9PbmUgd2l0aCBoYXNKb2luQ29sdW1uKVxuICAgKiAgIOKGkiB7bmFtZX1faWQg7ZiV7YOc7J2YIOqwgOyDgSBpbnRlZ2VyIHByb3DsnLzroZwg67OA7ZmYXG4gICAqL1xuICBnZXRGaWx0ZXJhYmxlUHJvcHMoKTogRW50aXR5UHJvcFtdIHtcbiAgICByZXR1cm4gdGhpcy5wcm9wcy5mbGF0TWFwKChwcm9wKTogRW50aXR5UHJvcCB8IEVudGl0eVByb3BbXSA9PiB7XG4gICAgICAvLyBWaXJ0dWFsIHByb3Ag7KCc7Jm4XG4gICAgICBpZiAoaXNWaXJ0dWFsUHJvcChwcm9wKSkge1xuICAgICAgICByZXR1cm4gW107XG4gICAgICB9XG5cbiAgICAgIC8vIFJlbGF0aW9uIHByb3Ag7LKY66asXG4gICAgICBpZiAoaXNSZWxhdGlvblByb3AocHJvcCkpIHtcbiAgICAgICAgLy8gRkvrpbwg7IOd7ISx7ZWY64qUIHJlbGF0aW9u66eMIO2PrO2VqFxuICAgICAgICBpZiAodGhpcy5oYXNGb3JlaWduS2V5KHByb3ApKSB7XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIG5hbWU6IGAke3Byb3AubmFtZX1faWRgLFxuICAgICAgICAgICAgdHlwZTogXCJpbnRlZ2VyXCIsXG4gICAgICAgICAgICBudWxsYWJsZTogcHJvcC5udWxsYWJsZSxcbiAgICAgICAgICB9IGFzIEVudGl0eVByb3A7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgfVxuXG4gICAgICAvLyDsnbzrsJggcHJvcCDsspjrpqxcbiAgICAgIHJldHVybiBwcm9wO1xuICAgIH0pO1xuICB9XG5cbiAgYXN5bmMgcmVnaXN0ZXJNb2R1bGVQYXRocygpIHtcbiAgICBjb25zdCBiYXNlUGF0aCA9IGAke3RoaXMubmFtZXMucGFyZW50RnN9YDtcblxuICAgIC8vIGJhc2Utc2NoZW1lXG4gICAgRW50aXR5TWFuYWdlci5zZXRNb2R1bGVQYXRoKGAke3RoaXMuaWR9QmFzZVNjaGVtYWAsIGBzb25hbXUuZ2VuZXJhdGVkYCk7XG5cbiAgICAvLyBzdWJzZXRcbiAgICBpZiAoT2JqZWN0LmtleXModGhpcy5zdWJzZXRzKS5sZW5ndGggPiAwKSB7XG4gICAgICBFbnRpdHlNYW5hZ2VyLnNldE1vZHVsZVBhdGgoYCR7dGhpcy5pZH1TdWJzZXRLZXlgLCBgc29uYW11LmdlbmVyYXRlZGApO1xuICAgICAgRW50aXR5TWFuYWdlci5zZXRNb2R1bGVQYXRoKGAke3RoaXMuaWR9U3Vic2V0TWFwcGluZ2AsIGBzb25hbXUuZ2VuZXJhdGVkYCk7XG4gICAgICBmb3IgKGNvbnN0IHN1YnNldEtleSBvZiBPYmplY3Qua2V5cyh0aGlzLnN1YnNldHMpKSB7XG4gICAgICAgIEVudGl0eU1hbmFnZXIuc2V0TW9kdWxlUGF0aChcbiAgICAgICAgICBgJHt0aGlzLmlkfVN1YnNldCR7c3Vic2V0S2V5LnRvVXBwZXJDYXNlKCl9YCxcbiAgICAgICAgICBgc29uYW11LmdlbmVyYXRlZGAsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gZW51bXNcbiAgICBmb3IgKGNvbnN0IGVudW1JZCBvZiBPYmplY3Qua2V5cyh0aGlzLmVudW1MYWJlbHMpKSB7XG4gICAgICBFbnRpdHlNYW5hZ2VyLnNldE1vZHVsZVBhdGgoZW51bUlkLCBgc29uYW11LmdlbmVyYXRlZGApO1xuICAgIH1cblxuICAgIC8vIHR5cGVzXG4gICAgY29uc3QgdHlwZXNNb2R1bGVQYXRoID0gYCR7YmFzZVBhdGh9LyR7dGhpcy5uYW1lcy5wYXJlbnRGc30udHlwZXNgO1xuICAgIGNvbnN0IHR5cGVzRmlsZVBhdGggPSBwYXRoLmpvaW4oXG4gICAgICBTb25hbXUuYXBpUm9vdFBhdGgsXG4gICAgICBydW50aW1lUGF0aChgZGlzdC9hcHBsaWNhdGlvbi8ke3R5cGVzTW9kdWxlUGF0aH0uanNgKSxcbiAgICApO1xuXG4gICAgaWYgKGF3YWl0IGV4aXN0cyh0eXBlc0ZpbGVQYXRoKSkge1xuICAgICAgY29uc3QgaW1wb3J0ZWRNZW1iZXJzID0gYXdhaXQgaW1wb3J0TWVtYmVyczx6LlpvZFR5cGVBbnk+KHR5cGVzRmlsZVBhdGgpO1xuICAgICAgdGhpcy50eXBlcyA9IE9iamVjdC5mcm9tRW50cmllcyhcbiAgICAgICAgaW1wb3J0ZWRNZW1iZXJzLm1hcCgoeyBuYW1lLCB2YWx1ZSB9KSA9PiB7XG4gICAgICAgICAgRW50aXR5TWFuYWdlci5zZXRNb2R1bGVQYXRoKG5hbWUsIHR5cGVzTW9kdWxlUGF0aCk7XG4gICAgICAgICAgcmV0dXJuIFtuYW1lLCB2YWx1ZV07XG4gICAgICAgIH0pLFxuICAgICAgKSBhcyB7IFtuYW1lOiBzdHJpbmddOiB6LlpvZFR5cGVBbnkgfTtcbiAgICB9XG4gIH1cblxuICByZWdpc3RlclRhYmxlU3BlY3MoKTogdm9pZCB7XG4gICAgLy8g7KGw7J24IO2FjOydtOu4lCDsnbjrjbHsiqQg7KCc7Jm4ICjsu6zrn7wg7J2066aE7JeQICcuJ+ydtCDtj6ztlajrkJwg6rK97JqwKVxuICAgIGNvbnN0IHVuaXF1ZUluZGV4ZXMgPSB0aGlzLmluZGV4ZXNcbiAgICAgIC5maWx0ZXIoKGlkeCkgPT4gaWR4LnR5cGUgPT09IFwidW5pcXVlXCIpXG4gICAgICAuZmlsdGVyKChpZHgpID0+IGlkeC5jb2x1bW5zLmV2ZXJ5KChjb2wpID0+ICFjb2wubmFtZS5pbmNsdWRlcyhcIi5cIikpKTtcblxuICAgIEVudGl0eU1hbmFnZXIuc2V0VGFibGVTcGVjKHtcbiAgICAgIG5hbWU6IHRoaXMudGFibGUsXG4gICAgICB1bmlxdWVJbmRleGVzLFxuICAgICAganNvbkNvbHVtbnM6IHRoaXMucHJvcHMuZmlsdGVyKChwKSA9PiBwLnR5cGUgPT09IFwianNvblwiKS5tYXAoKHApID0+IHAubmFtZSksXG4gICAgfSk7XG4gIH1cblxuICB0b0pzb24oKTogRW50aXR5SnNvbiB7XG4gICAgLy8gc3Vic2V0c+yZgCBzdWJzZXRzSW50ZXJuYWzsnYQgU3Vic2V0RGVmIO2Yle2DnOuhnCDrs7Xsm5AgKGNvbmUg7Y+s7ZWoKVxuICAgIGNvbnN0IHN1YnNldHM6IHsgW2tleTogc3RyaW5nXTogaW1wb3J0KFwiLi4vdHlwZXMvdHlwZXNcIikuU3Vic2V0RGVmIH0gPSB7fTtcbiAgICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyh0aGlzLnN1YnNldHMpKSB7XG4gICAgICBjb25zdCBub3JtYWxGaWVsZHM6IFN1YnNldEZpZWxkW10gPSB0aGlzLnN1YnNldHNba2V5XTtcbiAgICAgIGNvbnN0IGludGVybmFsRmllbGRzOiBTdWJzZXRGaWVsZFtdID0gKHRoaXMuc3Vic2V0c0ludGVybmFsW2tleV0gPz8gW10pLm1hcCgoZmllbGQpID0+ICh7XG4gICAgICAgIGZpZWxkLFxuICAgICAgICBpbnRlcm5hbDogdHJ1ZSxcbiAgICAgIH0pKTtcbiAgICAgIGNvbnN0IGZpZWxkcyA9IFsuLi5ub3JtYWxGaWVsZHMsIC4uLmludGVybmFsRmllbGRzXTtcblxuICAgICAgLy8gY29uZeydtCDsnojsnLzrqbQg7IOI66Gc7Jq0IOqwneyytCDtmJXtg5zroZwsIOyXhuycvOuptCDrsLDsl7Qg7ZiV7YOc66GcXG4gICAgICBpZiAodGhpcy5zdWJzZXRDb25lc1trZXldKSB7XG4gICAgICAgIHN1YnNldHNba2V5XSA9IHtcbiAgICAgICAgICBmaWVsZHMsXG4gICAgICAgICAgY29uZTogdGhpcy5zdWJzZXRDb25lc1trZXldLFxuICAgICAgICB9O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc3Vic2V0c1trZXldID0gZmllbGRzO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIGVudW1z66W8IEVudW1EZWYg7ZiV7YOc66GcIOuzteybkCAoY29uZSDtj6ztlagpXG4gICAgY29uc3QgZW51bXM6IHsgW2tleTogc3RyaW5nXTogaW1wb3J0KFwiLi4vdHlwZXMvdHlwZXNcIikuRW51bURlZiB9ID0ge307XG4gICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZXNdIG9mIE9iamVjdC5lbnRyaWVzKHRoaXMuZW51bUxhYmVscykpIHtcbiAgICAgIC8vIGNvbmXsnbQg7J6I7Jy866m0IOyDiOuhnOyatCDqsJ3ssrQg7ZiV7YOc66GcLCDsl4bsnLzrqbQgUmVjb3JkIO2Yle2DnOuhnFxuICAgICAgaWYgKHRoaXMuZW51bUNvbmVzW2tleV0pIHtcbiAgICAgICAgZW51bXNba2V5XSA9IHtcbiAgICAgICAgICB2YWx1ZXMsXG4gICAgICAgICAgY29uZTogdGhpcy5lbnVtQ29uZXNba2V5XSxcbiAgICAgICAgfTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGVudW1zW2tleV0gPSB2YWx1ZXM7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIGlkOiB0aGlzLmlkLFxuICAgICAgcGFyZW50SWQ6IHRoaXMucGFyZW50SWQsXG4gICAgICB0YWJsZTogdGhpcy50YWJsZSxcbiAgICAgIHRpdGxlOiB0aGlzLnRpdGxlLFxuICAgICAgY29uZTogdGhpcy5jb25lLFxuICAgICAgcHJvcHM6IHRoaXMucHJvcHMsXG4gICAgICBpbmRleGVzOiB0aGlzLmluZGV4ZXMsXG4gICAgICBzdWJzZXRzLFxuICAgICAgZW51bXMsXG4gICAgfTtcbiAgfVxuXG4gIGFzeW5jIHNhdmUoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgLy8gc29ydDogc3Vic2V0c1xuICAgIGNvbnN0IHN1YnNldFJvd3MgPSB0aGlzLmdldFN1YnNldFJvd3MoKTtcbiAgICB0aGlzLnN1YnNldHMgPSBPYmplY3QuZnJvbUVudHJpZXMoXG4gICAgICBPYmplY3QuZW50cmllcyh0aGlzLnN1YnNldHMpLm1hcCgoW3N1YnNldEtleV0pID0+IHtcbiAgICAgICAgcmV0dXJuIFtzdWJzZXRLZXksIHRoaXMuc3Vic2V0Um93c1RvU3Vic2V0RmllbGRzKHN1YnNldFJvd3MsIHN1YnNldEtleSwgZmFsc2UpXTtcbiAgICAgIH0pLFxuICAgICk7XG4gICAgdGhpcy5zdWJzZXRzSW50ZXJuYWwgPSBPYmplY3QuZnJvbUVudHJpZXMoXG4gICAgICBPYmplY3QuZW50cmllcyh0aGlzLnN1YnNldHNJbnRlcm5hbCkubWFwKChbc3Vic2V0S2V5XSkgPT4ge1xuICAgICAgICByZXR1cm4gW3N1YnNldEtleSwgdGhpcy5zdWJzZXRSb3dzVG9TdWJzZXRGaWVsZHMoc3Vic2V0Um93cywgc3Vic2V0S2V5LCB0cnVlKV07XG4gICAgICB9KSxcbiAgICApO1xuXG4gICAgLy8gc2F2ZVxuICAgIGNvbnN0IGpzb25QYXRoID0gcGF0aC5qb2luKFxuICAgICAgU29uYW11LmFwaVJvb3RQYXRoLFxuICAgICAgYHNyYy9hcHBsaWNhdGlvbi8ke3RoaXMubmFtZXMucGFyZW50RnN9LyR7dGhpcy5uYW1lcy5mc30uZW50aXR5Lmpzb25gLFxuICAgICk7XG4gICAgY29uc3QganNvbiA9IHRoaXMudG9Kc29uKCk7XG4gICAgYXdhaXQgd3JpdGVGaWxlKGpzb25QYXRoLCBhd2FpdCBmb3JtYXRDb2RlKEpTT04uc3RyaW5naWZ5KGpzb24pLCBqc29uUGF0aCkpO1xuXG4gICAgLy8gcmVsb2FkXG4gICAgYXdhaXQgRW50aXR5TWFuYWdlci5yZWdpc3Rlcihqc29uKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDthZztlIzrpr8gY29uZSDrqZTtg4DrjbDsnbTthLDrpbwg7IOd7ISx7ZWp64uI64ukLlxuICAgKlxuICAgKiBMTE3snYQg7IKs7Jqp7ZWY7KeAIOyViuqzoCBmYWtlci1tYXBwaW5ncy50c+ulvCDtmZzsmqntlZjsl6wg6riw67O4IGNvbmXsnYQg7IOd7ISx7ZWp64uI64ukLlxuICAgKiBzdHViIGVudGl0eSDsg53shLEg7IucIOyekOuPmeycvOuhnCDtmLjstpzrkJjslrQg7LWc7IaM7ZWc7J2YIGNvbmUg66mU7YOA642w7J207YSw66W8IOygnOqzte2VqeuLiOuLpC5cbiAgICpcbiAgICogQHBhcmFtIGxvY2FsZSAtIOyDneyEsSDsi5wg7IKs7Jqp7ZWgIGxvY2FsZSAo6riw67O46rCSOiBTb25hbXUuY29uZmlnLmkxOG4uZGVmYXVsdExvY2FsZSDrmJDripQgXCJrb1wiKVxuICAgKi9cbiAgYXN5bmMgZ2VuZXJhdGVUZW1wbGF0ZUNvbmVzKGxvY2FsZT86IFwia29cIiB8IFwiZW5cIiB8IFwiamFcIik6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHsgZ2VuZXJhdGVUZW1wbGF0ZUNvbmVzIH0gPSBhd2FpdCBpbXBvcnQoXCIuL2VudGl0eS10ZW1wbGF0ZS1jb25lXCIpO1xuICAgIGNvbnN0IGNvbmZpZ0xvY2FsZSA9IFNvbmFtdS5jb25maWcuaTE4bj8uZGVmYXVsdExvY2FsZTtcbiAgICBjb25zdCBlZmZlY3RpdmVMb2NhbGUgPVxuICAgICAgbG9jYWxlIHx8XG4gICAgICAoY29uZmlnTG9jYWxlID09PSBcImtvXCIgfHwgY29uZmlnTG9jYWxlID09PSBcImVuXCIgfHwgY29uZmlnTG9jYWxlID09PSBcImphXCJcbiAgICAgICAgPyBjb25maWdMb2NhbGVcbiAgICAgICAgOiBcImtvXCIpO1xuICAgIGNvbnN0IHJlc3VsdCA9IGdlbmVyYXRlVGVtcGxhdGVDb25lcyh0aGlzLnRvSnNvbigpLCBlZmZlY3RpdmVMb2NhbGUpO1xuXG4gICAgLy8g6rKw6rO866W8IEVudGl0eeyXkCDsoIHsmqkgKGFwcGx5Q29uZXPsmYAg64+Z7J287ZWcIOuwqeyLnSlcbiAgICBpZiAocmVzdWx0LmVudGl0eUNvbmUpIHtcbiAgICAgIHRoaXMuY29uZSA9IHJlc3VsdC5lbnRpdHlDb25lO1xuICAgIH1cblxuICAgIGZvciAoY29uc3QgW3Byb3BOYW1lLCBjb25lXSBvZiBPYmplY3QuZW50cmllcyhyZXN1bHQucHJvcENvbmVzKSkge1xuICAgICAgY29uc3QgcHJvcCA9IHRoaXMucHJvcHMuZmluZCgocCkgPT4gcC5uYW1lID09PSBwcm9wTmFtZSk7XG4gICAgICBpZiAocHJvcCkge1xuICAgICAgICAocHJvcCBhcyB7IGNvbmU/OiBDb25lIH0pLmNvbmUgPSBjb25lO1xuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMuZW51bUNvbmVzID0geyAuLi50aGlzLmVudW1Db25lcywgLi4ucmVzdWx0LmVudW1Db25lcyB9O1xuICAgIHRoaXMuc3Vic2V0Q29uZXMgPSB7IC4uLnRoaXMuc3Vic2V0Q29uZXMsIC4uLnJlc3VsdC5zdWJzZXRDb25lcyB9O1xuXG4gICAgYXdhaXQgdGhpcy5zYXZlKCk7XG4gIH1cblxuICAvKipcbiAgICogTExN7J2EIOyCrOyaqe2VmOyXrCBjb25lIOuplO2DgOuNsOydtO2EsOulvCDsg53shLHtlanri4jri6QuXG4gICAqXG4gICAqIEBwYXJhbSBvcHRpb25zLnByZXNlcnZlRXhpc3RpbmcgLSDquLDsobQgY29uZSDrs7TsobQg7Jes67aAICjquLDrs7jqsJI6IHRydWUpXG4gICAqIEBwYXJhbSBvcHRpb25zLm9ubHlFbXB0eSAtIGZpeHR1cmVIaW506rCAIOyXhuuKlCBjb25l66eMIOyDneyEsSAo6riw67O46rCSOiBmYWxzZSlcbiAgICogQHBhcmFtIG9wdGlvbnMubG9jYWxlIC0g7IOd7ISxIOyLnCDsgqzsmqntlaAgbG9jYWxlICjquLDrs7jqsJI6IFwia29cIilcbiAgICovXG4gIGFzeW5jIGdlbmVyYXRlQ29uZXMob3B0aW9ucz86IHtcbiAgICBwcmVzZXJ2ZUV4aXN0aW5nPzogYm9vbGVhbjtcbiAgICBvbmx5RW1wdHk/OiBib29sZWFuO1xuICAgIGxvY2FsZT86IFwia29cIiB8IFwiZW5cIiB8IFwiamFcIjtcbiAgfSk6IFByb21pc2U8aW1wb3J0KFwiLi4vY29uZS9jb25lLWdlbmVyYXRvclwiKS5Db25lR2VuZXJhdGlvblJlc3VsdD4ge1xuICAgIGNvbnN0IHsgZ2VuZXJhdGVDb25lcyB9ID0gYXdhaXQgaW1wb3J0KFwiLi4vY29uZS9jb25lLWdlbmVyYXRvclwiKTtcbiAgICBjb25zdCBjb250ZXh0OiBpbXBvcnQoXCIuLi9jb25lL2NvbmUtZ2VuZXJhdG9yXCIpLkNvbmVHZW5lcmF0aW9uQ29udGV4dCA9IHtcbiAgICAgIGVudGl0eTogdGhpcy50b0pzb24oKSxcbiAgICAgIGxvY2FsZTogb3B0aW9ucz8ubG9jYWxlIHx8IFwia29cIixcbiAgICAgIGV4aXN0aW5nQ29uZXM6IG9wdGlvbnM/LnByZXNlcnZlRXhpc3RpbmcgIT09IGZhbHNlID8gdGhpcy5jb2xsZWN0RXhpc3RpbmdDb25lcygpIDogdW5kZWZpbmVkLFxuICAgICAgb25seUVtcHR5OiBvcHRpb25zPy5vbmx5RW1wdHkgPz8gZmFsc2UsXG4gICAgfTtcblxuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGdlbmVyYXRlQ29uZXMoY29udGV4dCk7XG4gICAgdGhpcy5hcHBseUNvbmVzKHJlc3VsdCk7XG4gICAgYXdhaXQgdGhpcy5zYXZlKCk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIC8qKlxuICAgKiDquLDsobQgY29uZeuTpOydhCDsiJjsp5Htlanri4jri6QgKGVudGl0eSwgcHJvcHMsIGVudW1zLCBzdWJzZXRzKS5cbiAgICpcbiAgICogQHJldHVybnMg7YKk6rCAIFwiZW50aXR5OmlkXCIsIFwicHJvcDpuYW1lXCIsIFwiZW51bTplbnVtSWRcIiwgXCJzdWJzZXQ6a2V5XCIg7ZiV7Iud7J24IGNvbmUg66e1XG4gICAqL1xuICBwcml2YXRlIGNvbGxlY3RFeGlzdGluZ0NvbmVzKCk6IFJlY29yZDxzdHJpbmcsIENvbmU+IHtcbiAgICBjb25zdCBjb25lczogUmVjb3JkPHN0cmluZywgQ29uZT4gPSB7fTtcblxuICAgIGlmICh0aGlzLmNvbmUpIHtcbiAgICAgIGNvbmVzW2BlbnRpdHk6JHt0aGlzLmlkfWBdID0gdGhpcy5jb25lO1xuICAgIH1cblxuICAgIGZvciAoY29uc3QgcHJvcCBvZiB0aGlzLnByb3BzKSB7XG4gICAgICBpZiAocHJvcC5jb25lKSB7XG4gICAgICAgIGNvbmVzW2Bwcm9wOiR7cHJvcC5uYW1lfWBdID0gcHJvcC5jb25lO1xuICAgICAgfVxuICAgIH1cblxuICAgIGZvciAoY29uc3QgW2VudW1JZCwgY29uZV0gb2YgT2JqZWN0LmVudHJpZXModGhpcy5lbnVtQ29uZXMpKSB7XG4gICAgICBjb25lc1tgZW51bToke2VudW1JZH1gXSA9IGNvbmU7XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBbc3Vic2V0S2V5LCBjb25lXSBvZiBPYmplY3QuZW50cmllcyh0aGlzLnN1YnNldENvbmVzKSkge1xuICAgICAgY29uZXNbYHN1YnNldDoke3N1YnNldEtleX1gXSA9IGNvbmU7XG4gICAgfVxuXG4gICAgcmV0dXJuIGNvbmVzO1xuICB9XG5cbiAgLyoqXG4gICAqIOyDneyEseuQnCBjb25l65Ok7J2EIEVudGl0eeyXkCDsoIHsmqntlanri4jri6QuXG4gICAqXG4gICAqIEBwYXJhbSByZXN1bHQgLSBMTE3snLzroZwg7IOd7ISx65CcIGNvbmUg6rKw6rO8XG4gICAqL1xuICBwcml2YXRlIGFwcGx5Q29uZXMocmVzdWx0OiBpbXBvcnQoXCIuLi9jb25lL2NvbmUtZ2VuZXJhdG9yXCIpLkNvbmVHZW5lcmF0aW9uUmVzdWx0KTogdm9pZCB7XG4gICAgaWYgKHJlc3VsdC5lbnRpdHlDb25lKSB7XG4gICAgICB0aGlzLmNvbmUgPSByZXN1bHQuZW50aXR5Q29uZTtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IFtwcm9wTmFtZSwgY29uZV0gb2YgT2JqZWN0LmVudHJpZXMocmVzdWx0LnByb3BDb25lcykpIHtcbiAgICAgIGNvbnN0IHByb3AgPSB0aGlzLnByb3BzLmZpbmQoKHApID0+IHAubmFtZSA9PT0gcHJvcE5hbWUpO1xuICAgICAgaWYgKHByb3ApIHtcbiAgICAgICAgKHByb3AgYXMgeyBjb25lPzogQ29uZSB9KS5jb25lID0gY29uZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLmVudW1Db25lcyA9IHsgLi4udGhpcy5lbnVtQ29uZXMsIC4uLnJlc3VsdC5lbnVtQ29uZXMgfTtcbiAgICB0aGlzLnN1YnNldENvbmVzID0geyAuLi50aGlzLnN1YnNldENvbmVzLCAuLi5yZXN1bHQuc3Vic2V0Q29uZXMgfTtcbiAgfVxuXG4gIGdldFN1YnNldFJvd3MoXG4gICAgX3N1YnNldHM/OiB7IFtrZXk6IHN0cmluZ106IHN0cmluZ1tdIH0sXG4gICAgX3N1YnNldHNJbnRlcm5hbD86IHsgW2tleTogc3RyaW5nXTogc3RyaW5nW10gfSxcbiAgICBwcmVmaXhlczogc3RyaW5nW10gPSBbXSxcbiAgKTogRW50aXR5U3Vic2V0Um93W10ge1xuICAgIGlmIChwcmVmaXhlcy5sZW5ndGggPiAxMCkge1xuICAgICAgcmV0dXJuIFtdO1xuICAgIH1cblxuICAgIGNvbnN0IHN1YnNldHMgPSBfc3Vic2V0cyA/PyB0aGlzLnN1YnNldHM7XG4gICAgY29uc3Qgc3Vic2V0c0ludGVybmFsID0gX3N1YnNldHNJbnRlcm5hbCA/PyB0aGlzLnN1YnNldHNJbnRlcm5hbDtcbiAgICBjb25zdCBzdWJzZXRLZXlzID0gT2JqZWN0LmtleXMoc3Vic2V0cyk7XG4gICAgY29uc3QgYWxsRmllbGRzID0gdW5pcXVlKHN1YnNldEtleXMuZmxhdE1hcCgoa2V5KSA9PiBzdWJzZXRzW2tleV0pKTtcbiAgICAvLyBpbnRlcm5hbCDtlYTrk5zrj4QgYWxsRmllbGRz7JeQIO2PrO2VqCAocmVsYXRpb24g7YOQ7IOJ7JqpKVxuICAgIGNvbnN0IGFsbEludGVybmFsRmllbGRzID0gdW5pcXVlKHN1YnNldEtleXMuZmxhdE1hcCgoa2V5KSA9PiBzdWJzZXRzSW50ZXJuYWxba2V5XSA/PyBbXSkpO1xuICAgIGNvbnN0IGNvbWJpbmVkRmllbGRzID0gdW5pcXVlKFsuLi5hbGxGaWVsZHMsIC4uLmFsbEludGVybmFsRmllbGRzXSk7XG5cbiAgICByZXR1cm4gdGhpcy5wcm9wcy5tYXAoKHByb3ApID0+IHtcbiAgICAgIGlmIChcbiAgICAgICAgcHJvcC50eXBlID09PSBcInJlbGF0aW9uXCIgJiZcbiAgICAgICAgY29tYmluZWRGaWVsZHMuZmluZCgoZikgPT4gZi5zdGFydHNXaXRoKGAke1suLi5wcmVmaXhlcywgcHJvcC5uYW1lXS5qb2luKFwiLlwiKX0uYCkpXG4gICAgICApIHtcbiAgICAgICAgY29uc3QgcmVsRW50aXR5ID0gRW50aXR5TWFuYWdlci5nZXQocHJvcC53aXRoKTtcbiAgICAgICAgY29uc3QgY2hpbGRyZW4gPSByZWxFbnRpdHkuZ2V0U3Vic2V0Um93cyhzdWJzZXRzLCBzdWJzZXRzSW50ZXJuYWwsIFtcbiAgICAgICAgICAuLi5wcmVmaXhlcyxcbiAgICAgICAgICBgJHtwcm9wLm5hbWV9YCxcbiAgICAgICAgXSk7XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBmaWVsZDogcHJvcC5uYW1lLFxuICAgICAgICAgIGNoaWxkcmVuLFxuICAgICAgICAgIHJlbGF0aW9uRW50aXR5OiBwcm9wLndpdGgsXG4gICAgICAgICAgcHJlZml4ZXMsXG4gICAgICAgICAgaXNPcGVuOiBjaGlsZHJlbi5sZW5ndGggPiAwLFxuICAgICAgICAgIGhhczogT2JqZWN0LmZyb21FbnRyaWVzKFxuICAgICAgICAgICAgc3Vic2V0S2V5cy5tYXAoKHN1YnNldEtleSkgPT4ge1xuICAgICAgICAgICAgICByZXR1cm4gW3N1YnNldEtleSwgY2hpbGRyZW4uZXZlcnkoKGNoaWxkKSA9PiBjaGlsZC5oYXNbc3Vic2V0S2V5XSldO1xuICAgICAgICAgICAgfSksXG4gICAgICAgICAgKSxcbiAgICAgICAgICBpc0ludGVybmFsOiBPYmplY3QuZnJvbUVudHJpZXMoXG4gICAgICAgICAgICBzdWJzZXRLZXlzLm1hcCgoc3Vic2V0S2V5KSA9PiB7XG4gICAgICAgICAgICAgIHJldHVybiBbc3Vic2V0S2V5LCBjaGlsZHJlbi5ldmVyeSgoY2hpbGQpID0+IGNoaWxkLmlzSW50ZXJuYWxbc3Vic2V0S2V5XSldO1xuICAgICAgICAgICAgfSksXG4gICAgICAgICAgKSxcbiAgICAgICAgfTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgZmllbGQgPSBbLi4ucHJlZml4ZXMsIHByb3AubmFtZV0uam9pbihcIi5cIik7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBmaWVsZDogcHJvcC5uYW1lLFxuICAgICAgICBjaGlsZHJlbjogW10sXG4gICAgICAgIHJlbGF0aW9uRW50aXR5OiBwcm9wLnR5cGUgPT09IFwicmVsYXRpb25cIiA/IHByb3Aud2l0aCA6IHVuZGVmaW5lZCxcbiAgICAgICAgcHJlZml4ZXMsXG4gICAgICAgIGhhczogT2JqZWN0LmZyb21FbnRyaWVzKFxuICAgICAgICAgIHN1YnNldEtleXMubWFwKChzdWJzZXRLZXkpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHN1YnNldEZpZWxkcyA9IHN1YnNldHNbc3Vic2V0S2V5XTtcbiAgICAgICAgICAgIGNvbnN0IGhhcyA9IHN1YnNldEZpZWxkcy5zb21lKChmKSA9PiB7XG4gICAgICAgICAgICAgIHJldHVybiBmID09PSBmaWVsZCB8fCBmLnN0YXJ0c1dpdGgoYCR7ZmllbGR9LmApO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm4gW3N1YnNldEtleSwgaGFzXTtcbiAgICAgICAgICB9KSxcbiAgICAgICAgKSxcbiAgICAgICAgaXNJbnRlcm5hbDogT2JqZWN0LmZyb21FbnRyaWVzKFxuICAgICAgICAgIHN1YnNldEtleXMubWFwKChzdWJzZXRLZXkpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGludGVybmFsRmllbGRzID0gc3Vic2V0c0ludGVybmFsW3N1YnNldEtleV0gPz8gW107XG4gICAgICAgICAgICBjb25zdCBpc0ludGVybmFsID0gaW50ZXJuYWxGaWVsZHMuc29tZSgoZikgPT4ge1xuICAgICAgICAgICAgICByZXR1cm4gZiA9PT0gZmllbGQgfHwgZi5zdGFydHNXaXRoKGAke2ZpZWxkfS5gKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmV0dXJuIFtzdWJzZXRLZXksIGlzSW50ZXJuYWxdO1xuICAgICAgICAgIH0pLFxuICAgICAgICApLFxuICAgICAgfTtcbiAgICB9KTtcbiAgfVxuXG4gIHN1YnNldFJvd3NUb1N1YnNldEZpZWxkcyhcbiAgICBzdWJzZXRSb3dzOiBFbnRpdHlTdWJzZXRSb3dbXSxcbiAgICBzdWJzZXRLZXk6IHN0cmluZyxcbiAgICBpbnRlcm5hbDogYm9vbGVhbiA9IGZhbHNlLFxuICApOiBzdHJpbmdbXSB7XG4gICAgY29uc3QgaGFzS2V5ID0gaW50ZXJuYWwgPyBcImlzSW50ZXJuYWxcIiA6IFwiaGFzXCI7XG4gICAgcmV0dXJuIHN1YnNldFJvd3NcbiAgICAgIC5tYXAoKHN1YnNldFJvdykgPT4ge1xuICAgICAgICBpZiAoc3Vic2V0Um93LmNoaWxkcmVuLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5zdWJzZXRSb3dzVG9TdWJzZXRGaWVsZHMoc3Vic2V0Um93LmNoaWxkcmVuLCBzdWJzZXRLZXksIGludGVybmFsKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdWJzZXRSb3dbaGFzS2V5XVtzdWJzZXRLZXldKSB7XG4gICAgICAgICAgcmV0dXJuIHN1YnNldFJvdy5wcmVmaXhlcy5jb25jYXQoc3Vic2V0Um93LmZpZWxkKS5qb2luKFwiLlwiKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICAgIC5maWx0ZXIobm9uTnVsbGFibGUpXG4gICAgICAuZmxhdCgpO1xuICB9XG5cbiAgYXN5bmMgY3JlYXRlUHJvcChwcm9wOiBFbnRpdHlQcm9wLCBhdD86IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICghYXQpIHtcbiAgICAgIHRoaXMucHJvcHMucHVzaChwcm9wKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5wcm9wcy5zcGxpY2UoYXQsIDAsIHByb3ApO1xuICAgIH1cbiAgICBhd2FpdCB0aGlzLnNhdmUoKTtcbiAgfVxuXG4gIGFuYWx5emVTdWJzZXRGaWVsZChzdWJzZXRGaWVsZDogc3RyaW5nKToge1xuICAgIGVudGl0eUlkOiBzdHJpbmc7XG4gICAgcHJvcE5hbWU6IHN0cmluZztcbiAgfVtdIHtcbiAgICBjb25zdCBhcnIgPSBzdWJzZXRGaWVsZC5zcGxpdChcIi5cIik7XG5cbiAgICBsZXQgZW50aXR5SWQgPSB0aGlzLmlkO1xuICAgIGNvbnN0IHJlc3VsdDoge1xuICAgICAgZW50aXR5SWQ6IHN0cmluZztcbiAgICAgIHByb3BOYW1lOiBzdHJpbmc7XG4gICAgfVtdID0gW107XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhcnIubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IHByb3BOYW1lID0gYXJyW2ldO1xuICAgICAgcmVzdWx0LnB1c2goe1xuICAgICAgICBlbnRpdHlJZCxcbiAgICAgICAgcHJvcE5hbWUsXG4gICAgICB9KTtcblxuICAgICAgY29uc3QgcHJvcCA9IEVudGl0eU1hbmFnZXIuZ2V0KGVudGl0eUlkKS5wcm9wcy5maW5kKChwKSA9PiBwLm5hbWUgPT09IHByb3BOYW1lKTtcbiAgICAgIGlmICghcHJvcCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7ZW50aXR5SWR97J2YIOyemOuqu+uQnCDshJzruIzshYvtgqQgJHtzdWJzZXRGaWVsZH1gKTtcbiAgICAgIH1cbiAgICAgIGlmIChpc1JlbGF0aW9uUHJvcChwcm9wKSkge1xuICAgICAgICBlbnRpdHlJZCA9IHByb3Aud2l0aDtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIGFzeW5jIG1vZGlmeVByb3AobmV3UHJvcDogRW50aXR5UHJvcCwgYXQ6IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xuICAgIC8vIOydtOyghCDtlITroa0g7J2066aEIOyggOyepVxuICAgIGNvbnN0IG9sZE5hbWUgPSB0aGlzLnByb3BzW2F0XS5uYW1lO1xuXG4gICAgLy8g7KCA7J6l7ZWgIOyXlO2LsO2LsFxuICAgIGNvbnN0IGVudGl0aWVzOiBFbnRpdHlbXSA9IFt0aGlzXTtcblxuICAgIC8vIOydtOumhOydtCDrsJTrgJAg6rK97JqwXG4gICAgaWYgKG9sZE5hbWUgIT09IG5ld1Byb3AubmFtZSkge1xuICAgICAgLy8g7KCE7LK0IOyXlO2LsO2LsOyXkOyEnCDtmITsnqwg7IiY7KCV65CcIO2UhOuhreydhCDssLjsobDtlZjqs6Ag7J6I64qUIOuqqOuToCDshJzruIzshYvtlYTrk5wg7LC+7JWE7IScIOyImOyglVxuICAgICAgY29uc3QgYWxsRW50aXR5SWRzID0gRW50aXR5TWFuYWdlci5nZXRBbGxJZHMoKTtcbiAgICAgIGZvciAoY29uc3QgcmVsRW50aXR5SWQgb2YgYWxsRW50aXR5SWRzKSB7XG4gICAgICAgIGNvbnN0IHJlbEVudGl0eSA9IEVudGl0eU1hbmFnZXIuZ2V0KHJlbEVudGl0eUlkKTtcbiAgICAgICAgY29uc3QgcmVsRW50aXR5U3Vic2V0S2V5cyA9IE9iamVjdC5rZXlzKHJlbEVudGl0eS5zdWJzZXRzKTtcbiAgICAgICAgZm9yIChjb25zdCBzdWJzZXRLZXkgb2YgcmVsRW50aXR5U3Vic2V0S2V5cykge1xuICAgICAgICAgIGNvbnN0IHN1YnNldCA9IHJlbEVudGl0eS5zdWJzZXRzW3N1YnNldEtleV07XG5cbiAgICAgICAgICAvLyDshJzruIzshYsg7ZWE65Oc66W8IOyInO2ajO2VmOupsCwg7JeU7Yuw7YuwLe2UhOuhrSDri6jsnITroZwg67aE7ISd7ZWcIO2bhCDtmITsnqwg7JeU7Yuw7YuwLe2UhOuhreqzvCDsnbzsuZjtlZjripQg6rK97JqwIOyImOyglSDsspjrpqxcbiAgICAgICAgICBjb25zdCBtb2RpZmllZFN1YnNldEZpZWxkcyA9IHN1YnNldC5tYXAoKHN1YnNldEZpZWxkKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBhbmFseXplZCA9IHJlbEVudGl0eS5hbmFseXplU3Vic2V0RmllbGQoc3Vic2V0RmllbGQpO1xuICAgICAgICAgICAgY29uc3QgbW9kaWZpZWQgPSBhbmFseXplZC5tYXAoKGEpID0+XG4gICAgICAgICAgICAgIGEucHJvcE5hbWUgPT09IG9sZE5hbWUgJiYgYS5lbnRpdHlJZCA9PT0gdGhpcy5pZFxuICAgICAgICAgICAgICAgID8ge1xuICAgICAgICAgICAgICAgICAgICAuLi5hLFxuICAgICAgICAgICAgICAgICAgICBwcm9wTmFtZTogbmV3UHJvcC5uYW1lLFxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIDogYSxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICAvLyDrtoTshJ3tlZwg7ZWE65Oc66W8IOuLpOyLnCDshJzruIzshYsg7ZWE65Oc66GcIOuzteq1rFxuICAgICAgICAgICAgcmV0dXJuIG1vZGlmaWVkLm1hcCgoYSkgPT4gYS5wcm9wTmFtZSkuam9pbihcIi5cIik7XG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICBpZiAoc3Vic2V0LmpvaW4oXCIsXCIpICE9PSBtb2RpZmllZFN1YnNldEZpZWxkcy5qb2luKFwiLFwiKSkge1xuICAgICAgICAgICAgcmVsRW50aXR5LnN1YnNldHNbc3Vic2V0S2V5XSA9IG1vZGlmaWVkU3Vic2V0RmllbGRzO1xuICAgICAgICAgICAgZW50aXRpZXMucHVzaChyZWxFbnRpdHkpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIO2UhOuhrSDsiJjsoJVcbiAgICB0aGlzLnByb3BzW2F0XSA9IG5ld1Byb3A7XG5cbiAgICBhd2FpdCBQcm9taXNlLmFsbChlbnRpdGllcy5tYXAoYXN5bmMgKGVudGl0eSkgPT4gZW50aXR5LnNhdmUoKSkpO1xuICB9XG5cbiAgYXN5bmMgZGVsUHJvcChhdDogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgLy8g7J207KCEIO2UhOuhrSDsnbTrpoQg7KCA7J6lXG4gICAgY29uc3Qgb2xkTmFtZSA9IHRoaXMucHJvcHNbYXRdLm5hbWU7XG5cbiAgICAvLyDsoIDsnqXtlaAg7JeU7Yuw7YuwXG4gICAgY29uc3QgZW50aXRpZXM6IEVudGl0eVtdID0gW3RoaXNdO1xuXG4gICAgLy8g7KCE7LK0IOyXlO2LsO2LsOyXkOyEnCDtmITsnqwg7IKt7KCc65CcIO2UhOuhreydhCDssLjsobDtlZjqs6Ag7J6I64qUIOuqqOuToCDshJzruIzshYvtlYTrk5wg7LC+7JWE7IScIOygnOyZuFxuICAgIGNvbnN0IGFsbEVudGl0eUlkcyA9IEVudGl0eU1hbmFnZXIuZ2V0QWxsSWRzKCk7XG4gICAgZm9yIChjb25zdCByZWxFbnRpdHlJZCBvZiBhbGxFbnRpdHlJZHMpIHtcbiAgICAgIGNvbnN0IHJlbEVudGl0eSA9IEVudGl0eU1hbmFnZXIuZ2V0KHJlbEVudGl0eUlkKTtcbiAgICAgIGNvbnN0IHJlbEVudGl0eVN1YnNldEtleXMgPSBPYmplY3Qua2V5cyhyZWxFbnRpdHkuc3Vic2V0cyk7XG4gICAgICBmb3IgKGNvbnN0IHN1YnNldEtleSBvZiByZWxFbnRpdHlTdWJzZXRLZXlzKSB7XG4gICAgICAgIGNvbnN0IHN1YnNldCA9IHJlbEVudGl0eS5zdWJzZXRzW3N1YnNldEtleV07XG4gICAgICAgIC8vIOyEnOu4jOyFiyDtlYTrk5zrpbwg7Iic7ZqM7ZWY66mwLCDsl5Tti7Dti7At7ZSE66GtIOuLqOychOuhnCDrtoTshJ3tlZwg7ZuEIO2YhOyerCDsl5Tti7Dti7At7ZSE66Gt6rO8IOydvOy5mO2VmOuKlCDqsr3smrAg7J207ZuE7J2YIO2VhOuTnOulvCDsoJzsmbhcbiAgICAgICAgY29uc3QgbW9kaWZpZWRTdWJzZXRGaWVsZHMgPSBzdWJzZXRcbiAgICAgICAgICAubWFwKChzdWJzZXRGaWVsZCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgYW5hbHl6ZWQgPSByZWxFbnRpdHkuYW5hbHl6ZVN1YnNldEZpZWxkKHN1YnNldEZpZWxkKTtcbiAgICAgICAgICAgIGlmIChhbmFseXplZC5maW5kKChhKSA9PiBhLnByb3BOYW1lID09PSBvbGROYW1lICYmIGEuZW50aXR5SWQgPT09IHRoaXMuaWQpKSB7XG4gICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHN1YnNldEZpZWxkO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pXG4gICAgICAgICAgLmZpbHRlcihub25OdWxsYWJsZSk7XG5cbiAgICAgICAgaWYgKHN1YnNldC5qb2luKFwiLFwiKSAhPT0gbW9kaWZpZWRTdWJzZXRGaWVsZHMuam9pbihcIixcIikpIHtcbiAgICAgICAgICByZWxFbnRpdHkuc3Vic2V0c1tzdWJzZXRLZXldID0gbW9kaWZpZWRTdWJzZXRGaWVsZHM7XG4gICAgICAgICAgZW50aXRpZXMucHVzaChyZWxFbnRpdHkpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8g7ZiE7J6sIOyXlO2LsO2LsOydmCDsnbjrjbHsiqTsl5DshJwg7KCc7Jm4XG4gICAgZm9yIChjb25zdCBpbmRleCBvZiBFbnRpdHlNYW5hZ2VyLmdldCh0aGlzLmlkKS5pbmRleGVzKSB7XG4gICAgICBpbmRleC5jb2x1bW5zID0gaW5kZXguY29sdW1ucy5maWx0ZXIoKGNvbCkgPT4gY29sLm5hbWUgIT09IG9sZE5hbWUpO1xuICAgIH1cblxuICAgIC8vIO2UhOuhrSDsgq3soJxcbiAgICB0aGlzLnByb3BzLnNwbGljZShhdCwgMSk7XG5cbiAgICBhd2FpdCBQcm9taXNlLmFsbChlbnRpdGllcy5tYXAoYXN5bmMgKGVudGl0eSkgPT4gZW50aXR5LnNhdmUoKSkpO1xuICB9XG5cbiAgZ2V0RW50aXR5SWRGcm9tU3Vic2V0RmllbGQoc3Vic2V0RmllbGQ6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgaWYgKCFzdWJzZXRGaWVsZC5pbmNsdWRlcyhcIi5cIikpIHtcbiAgICAgIHJldHVybiB0aGlzLmlkO1xuICAgIH1cblxuICAgIC8vIOyEnOu4jOyFiyDtlYTrk5zsnZgg66eI7KeA66eJ7J2AIO2UhOuhreydtOuvgOuhnCDsoJzsmbhcbiAgICBjb25zdCBhcnIgPSBzdWJzZXRGaWVsZC5zcGxpdChcIi5cIikuc2xpY2UoMCwgLTEpO1xuXG4gICAgLy8g7ISc67iM7IWLIO2VhOuTnOulvCDrgrTroKTqsIDrqbTshJwg66eI7KeA66eJ7Jy866GcIHJlbGF0aW9u65CcIOyXlO2LsO2LsOulvCDssL7snYxcbiAgICBjb25zdCBsYXN0RW50aXR5SWQgPSBhcnIucmVkdWNlKChlbnRpdHlJZCwgZmllbGQpID0+IHtcbiAgICAgIGNvbnN0IHJlbFByb3AgPSBFbnRpdHlNYW5hZ2VyLmdldChlbnRpdHlJZCkucHJvcHMuZmluZCgocCkgPT4gcC5uYW1lID09PSBmaWVsZCk7XG4gICAgICBpZiAoIXJlbFByb3AgfHwgcmVsUHJvcC50eXBlICE9PSBcInJlbGF0aW9uXCIpIHtcbiAgICAgICAgY29uc29sZS5kZWJ1Zyh7IGFyciwgdGhpc0lkOiB0aGlzLmlkLCBlbnRpdHlJZCwgZmllbGQgfSk7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihg7J6Y66q765CcIOyEnOu4jOyFi+2CpCAke3N1YnNldEZpZWxkfWApO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJlbFByb3Aud2l0aDtcbiAgICB9LCB0aGlzLmlkKTtcbiAgICByZXR1cm4gbGFzdEVudGl0eUlkO1xuICB9XG5cbiAgYXN5bmMgbW92ZVByb3AoYXQ6IG51bWJlciwgdG86IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHByb3AgPSB0aGlzLnByb3BzW2F0XTtcbiAgICBjb25zdCBuZXdQcm9wcyA9IFsuLi50aGlzLnByb3BzXTtcbiAgICBuZXdQcm9wcy5zcGxpY2UodG8sIDAsIHByb3ApO1xuICAgIG5ld1Byb3BzLnNwbGljZShhdCA8IHRvID8gYXQgOiBhdCArIDEsIDEpO1xuICAgIHRoaXMucHJvcHMgPSBuZXdQcm9wcztcblxuICAgIGF3YWl0IHRoaXMuc2F2ZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIO2VhOuTnOuqheydhCBcIu2FjOydtOu4lOuqhS7tlYTrk5zrqoVcIiDtmJXsi53snLzroZwg67OA7ZmYXG4gICAqL1xuICBnZXRGdWxsRmllbGROYW1lKGZpZWxkOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGlmIChmaWVsZC5pbmNsdWRlcyhcIi5cIikpIHtcbiAgICAgIHJldHVybiBmaWVsZDtcbiAgICB9XG4gICAgcmV0dXJuIGAke3RoaXMudGFibGV9LiR7ZmllbGR9YDtcbiAgfVxuXG4gIC8qKlxuICAgKiDsl5Tti7Dti7DsnZggUEsg7YOA7J6F7J2EIOuwmO2ZmO2VqeuLiOuLpC5cbiAgICogaWQg7ZWE65Oc7J2YIO2DgOyeheydhCDquLDspIDsnLzroZwgXCJpbnRlZ2VyXCIgfCBcInN0cmluZ1wiIHwgXCJ1dWlkXCLrpbwg67CY7ZmY7ZWp64uI64ukLlxuICAgKi9cbiAgZ2V0UGtUeXBlKCk6IFwiaW50ZWdlclwiIHwgXCJzdHJpbmdcIiB8IFwidXVpZFwiIHtcbiAgICBjb25zdCBpZFByb3AgPSB0aGlzLnByb3BzRGljdC5pZDtcbiAgICBpZiAoIWlkUHJvcCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBFbnRpdHkgJHt0aGlzLmlkfeyXkCBpZCDtlYTrk5zqsIAg7JeG7Iq164uI64ukYCk7XG4gICAgfVxuICAgIGlmIChpZFByb3AudHlwZSA9PT0gXCJzdHJpbmdcIiB8fCBpZFByb3AudHlwZSA9PT0gXCJ1dWlkXCIpIHtcbiAgICAgIHJldHVybiBpZFByb3AudHlwZTtcbiAgICB9XG4gICAgcmV0dXJuIFwiaW50ZWdlclwiO1xuICB9XG5cbiAgLyoqXG4gICAqIOyXlO2LsO2LsOydmCBQSyBwcm9w7J2EIOuwmO2ZmO2VqeuLiOuLpC5cbiAgICogbGVuZ3RoIOuTsSDshLjrtoAg7KCV67O07JeQIOygkeq3vO2VoCDrlYwg7IKs7Jqp7ZWp64uI64ukLlxuICAgKi9cbiAgZ2V0UGtQcm9wKCk6IEVudGl0eVByb3Age1xuICAgIGNvbnN0IGlkUHJvcCA9IHRoaXMucHJvcHNEaWN0LmlkO1xuICAgIGlmICghaWRQcm9wKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEVudGl0eSAke3RoaXMuaWR97JeQIGlkIO2VhOuTnOqwgCDsl4bsirXri4jri6RgKTtcbiAgICB9XG4gICAgcmV0dXJuIGlkUHJvcDtcbiAgfVxuXG4gIC8qKlxuICAgKiDsl5Tti7Dti7DsnZggUEsg67Cw7Je0IO2DgOyeheydhCDrsJjtmZjtlanri4jri6QuXG4gICAqIExvYWRlclF1ZXJ57J2YIGZyb21JZHMg7YOA7J6F7Jy866GcIOyCrOyaqeuQqeuLiOuLpC5cbiAgICovXG4gIGdldFBrQXJyYXlUeXBlKCk6IHN0cmluZyB7XG4gICAgY29uc3QgcGtUeXBlID0gdGhpcy5nZXRQa1R5cGUoKTtcbiAgICByZXR1cm4gcGtUeXBlID09PSBcImludGVnZXJcIiA/IFwibnVtYmVyW11cIiA6IFwic3RyaW5nW11cIjtcbiAgfVxufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7O2NBUXVDO2FBY2Y7aUJBWTJCO2lCQUNIO2dCQUNMO2tCQUNPO2FBQ1U7c0JBQ1g7Q0FFcEMsU0FBYixNQUFvQjtFQUNsQjtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFLQTtFQUNBO0VBR0E7RUFHQTtFQUNBO0VBR0E7RUFHQSxRQUVJLEVBQUU7RUFDTixRQUVJLEVBQUU7RUFDTixhQUlJ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
|
package/dist/index.d.ts
CHANGED
|
@@ -31,6 +31,12 @@ export * from "./migration/types";
|
|
|
31
31
|
export * from "./naite/naite";
|
|
32
32
|
export * from "./naite/naite-reporter";
|
|
33
33
|
export * from "./stream/sse";
|
|
34
|
+
export * from "./stream/ws-audience";
|
|
35
|
+
export * from "./stream/ws-cluster-bus";
|
|
36
|
+
export * from "./stream/ws-core";
|
|
37
|
+
export * from "./stream/ws-presence-store";
|
|
38
|
+
export * from "./stream/ws";
|
|
39
|
+
export * from "./stream/ws-registry";
|
|
34
40
|
export * from "./tasks/decorator";
|
|
35
41
|
export * from "./template/template";
|
|
36
42
|
export * from "./template/template-manager";
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,kBAAkB,CAAC;AACjC,cAAc,cAAc,CAAC;AAC7B,mBAAmB,eAAe,CAAC;AACnC,cAAc,kBAAkB,CAAC;AACjC,cAAc,cAAc,CAAC;AAC7B,cAAc,QAAQ,CAAC;AACvB,OAAO,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AAC1C,YAAY,EAAE,qBAAqB,EAAE,MAAM,eAAe,CAAC;AAC3D,cAAc,+BAA+B,CAAC;AAC9C,mBAAmB,uBAAuB,CAAC;AAC3C,cAAc,qBAAqB,CAAC;AACpC,mBAAmB,kBAAkB,CAAC;AACtC,cAAc,uBAAuB,CAAC;AACtC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,eAAe,CAAC;AAC9B,cAAc,iBAAiB,CAAC;AAChC,cAAc,uBAAuB,CAAC;AACtC,cAAc,8BAA8B,CAAC;AAC7C,cAAc,yBAAyB,CAAC;AACxC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,iBAAiB,CAAC;AAChC,cAAc,yBAAyB,CAAC;AACxC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,4BAA4B,CAAC;AAC3C,cAAc,UAAU,CAAC;AACzB,cAAc,6BAA6B,CAAC;AAC5C,cAAc,2BAA2B,CAAC;AAC1C,cAAc,sBAAsB,CAAC;AACrC,cAAc,sCAAsC,CAAC;AACrD,cAAc,mBAAmB,CAAC;AAClC,cAAc,eAAe,CAAC;AAC9B,cAAc,wBAAwB,CAAC;AACvC,cAAc,cAAc,CAAC;AAC7B,cAAc,mBAAmB,CAAC;AAClC,cAAc,qBAAqB,CAAC;AACpC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,2BAA2B,CAAC;AAC1C,cAAc,eAAe,CAAC;AAC9B,cAAc,oBAAoB,CAAC;AACnC,cAAc,eAAe,CAAC;AAC9B,cAAc,oBAAoB,CAAC;AACnC,cAAc,eAAe,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,kBAAkB,CAAC;AACjC,cAAc,cAAc,CAAC;AAC7B,mBAAmB,eAAe,CAAC;AACnC,cAAc,kBAAkB,CAAC;AACjC,cAAc,cAAc,CAAC;AAC7B,cAAc,QAAQ,CAAC;AACvB,OAAO,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AAC1C,YAAY,EAAE,qBAAqB,EAAE,MAAM,eAAe,CAAC;AAC3D,cAAc,+BAA+B,CAAC;AAC9C,mBAAmB,uBAAuB,CAAC;AAC3C,cAAc,qBAAqB,CAAC;AACpC,mBAAmB,kBAAkB,CAAC;AACtC,cAAc,uBAAuB,CAAC;AACtC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,eAAe,CAAC;AAC9B,cAAc,iBAAiB,CAAC;AAChC,cAAc,uBAAuB,CAAC;AACtC,cAAc,8BAA8B,CAAC;AAC7C,cAAc,yBAAyB,CAAC;AACxC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,iBAAiB,CAAC;AAChC,cAAc,yBAAyB,CAAC;AACxC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,4BAA4B,CAAC;AAC3C,cAAc,UAAU,CAAC;AACzB,cAAc,6BAA6B,CAAC;AAC5C,cAAc,2BAA2B,CAAC;AAC1C,cAAc,sBAAsB,CAAC;AACrC,cAAc,sCAAsC,CAAC;AACrD,cAAc,mBAAmB,CAAC;AAClC,cAAc,eAAe,CAAC;AAC9B,cAAc,wBAAwB,CAAC;AACvC,cAAc,cAAc,CAAC;AAC7B,cAAc,sBAAsB,CAAC;AACrC,cAAc,yBAAyB,CAAC;AACxC,cAAc,kBAAkB,CAAC;AACjC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,aAAa,CAAC;AAC5B,cAAc,sBAAsB,CAAC;AACrC,cAAc,mBAAmB,CAAC;AAClC,cAAc,qBAAqB,CAAC;AACpC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,2BAA2B,CAAC;AAC1C,cAAc,eAAe,CAAC;AAC9B,cAAc,oBAAoB,CAAC;AACnC,cAAc,eAAe,CAAC;AAC9B,cAAc,oBAAoB,CAAC;AACnC,cAAc,eAAe,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -5,8 +5,14 @@ import { CachePresets, applyCacheHeaders, buildCacheControl, init_cache_control
|
|
|
5
5
|
import { CompressPresets, init_compress, isCompressDisabled, toFastifyCompressOption } from "./compress/compress.js";
|
|
6
6
|
import { AlreadyProcessedException, BadRequestException, DuplicateRowException, InternalServerErrorException, NotFoundException, ServiceUnavailableException, SoException, TargetNotFoundException, UnauthorizedException, init_so_exceptions, isSoException } from "./exceptions/so-exceptions.js";
|
|
7
7
|
import { createMockSSEFactory, createSSEFactory, init_sse } from "./stream/sse.js";
|
|
8
|
+
import { WebSocketAudience, init_ws_audience } from "./stream/ws-audience.js";
|
|
9
|
+
import { NoopWebSocketClusterBus, init_ws_cluster_bus } from "./stream/ws-cluster-bus.js";
|
|
10
|
+
import { InMemoryWebSocketPresenceStore, init_ws_presence_store } from "./stream/ws-presence-store.js";
|
|
11
|
+
import { WebSocketRegistry, init_ws_registry } from "./stream/ws-registry.js";
|
|
12
|
+
import { WebSocketRuntime, createWebSocketRuntime, init_ws } from "./stream/ws.js";
|
|
8
13
|
import { init_controller, isDaemonServer, isDevelopment, isHotReloadServer, isInDocker, isLocal, isProduction, isRemote, isStaging, isTest } from "./utils/controller.js";
|
|
9
|
-
import { assertDefined, assertExists, assertNotNull, convertFastifyHeadersToStandard, differenceWith, exhaustive, findApiRootPath, findAppRootPath, init_utils, intersectionBy, merge, nonNullable } from "./utils/utils.js";
|
|
14
|
+
import { assertDefined, assertExists, assertNotNull, convertFastifyHeadersToStandard, differenceWith, exhaustive, findApiRootPath, findAppRootPath, init_utils, intersectionBy, isPlainObject, merge, nonNullable } from "./utils/utils.js";
|
|
15
|
+
import { createWebSocketReplyStub, resolveWebSocketCloseDescriptor, resolveWebSocketPluginOptions } from "./api/websocket-helpers.js";
|
|
10
16
|
import { Sonamu, init_sonamu } from "./api/sonamu.js";
|
|
11
17
|
import { ApiParamType, BUILT_IN_TYPE_IDS, EntityJsonSchema, GenerateOptions, KnownOpclassValues, NormalPropSchema, PathAndCode, RelationPropSchema, RenderingNode, SonamuFileArraySchema, SonamuFileSchema, SonamuQueryMode, SonamuSemanticParams, TemplateKey, TemplateOptions, ZodStringFormat, getDescription, getEnumDefValues, getSubsetFields, init_types, isBelongsToOneRelationProp, isBigIntegerArrayProp, isBigIntegerProp, isBigIntegerSingleProp, isBooleanArrayProp, isBooleanProp, isBooleanSingleProp, isCustomJoinClause, isDateArrayProp, isDateProp, isDateSingleProp, isEnumArrayProp, isEnumDefWithCone, isEnumProp, isEnumSingleProp, isHasManyRelationProp, isIntegerArrayProp, isIntegerProp, isIntegerSingleProp, isInternalSubsetField, isJsonProp, isKnexError, isManyToManyRelationProp, isNumberArrayProp, isNumberProp, isNumberSingleProp, isNumericArrayProp, isNumericProp, isNumericSingleProp, isOneToOneRelationProp, isRelationProp, isSearchTextJsonSourceZodType, isSearchTextProp, isStringArrayProp, isStringProp, isStringSingleProp, isSubsetDefWithCone, isTsVectorProp, isUuidArrayProp, isUuidProp, isUuidSingleProp, isVectorArrayProp, isVectorProp, isVectorSingleProp, isVirtualCodeProp, isVirtualProp, isVirtualQueryProp, normalizeSubsetField, zArrayable } from "./types/types.js";
|
|
12
18
|
import { EntityManager, init_entity_manager } from "./entity/entity-manager.js";
|
|
@@ -20,7 +26,7 @@ import { FUZZY_OPERATORS, init_puri_types } from "./database/puri.types.js";
|
|
|
20
26
|
import { JoinClauseGroup, Puri, ResolvedPuri, WhereGroup, init_puri } from "./database/puri.js";
|
|
21
27
|
import { PuriTransactionWrapper, PuriWrapper, init_puri_wrapper } from "./database/puri-wrapper.js";
|
|
22
28
|
import { BaseModel, BaseModelClass, init_base_model } from "./database/base-model.js";
|
|
23
|
-
import { api, init_decorators, registeredApis, stream, transactional, upload } from "./api/decorators.js";
|
|
29
|
+
import { api, init_decorators, registeredApis, stream, transactional, upload, websocket } from "./api/decorators.js";
|
|
24
30
|
import { ingestAuditEvent } from "./auth/audit-log-ingestor.js";
|
|
25
31
|
import { sonamuAuditLog } from "./auth/audit-log/plugin.js";
|
|
26
32
|
import { generateBetterAuthEntities } from "./auth/auth-generator.js";
|
|
@@ -49,6 +55,7 @@ import { setupErrorHandler } from "./exceptions/error-handler.js";
|
|
|
49
55
|
import "./filter/index.js";
|
|
50
56
|
import "./migration/types.js";
|
|
51
57
|
import { NaiteReporter } from "./naite/naite-reporter.js";
|
|
58
|
+
import "./stream/ws-core.js";
|
|
52
59
|
import { workflow } from "./tasks/decorator.js";
|
|
53
60
|
import { Template, init_template } from "./template/template.js";
|
|
54
61
|
import { TemplateManager, TemplateManagerClass, init_template_manager } from "./template/template-manager.js";
|
|
@@ -77,6 +84,11 @@ init_migrator();
|
|
|
77
84
|
init_postgresql_schema_reader();
|
|
78
85
|
init_naite();
|
|
79
86
|
init_sse();
|
|
87
|
+
init_ws_audience();
|
|
88
|
+
init_ws_cluster_bus();
|
|
89
|
+
init_ws_presence_store();
|
|
90
|
+
init_ws();
|
|
91
|
+
init_ws_registry();
|
|
80
92
|
init_template();
|
|
81
93
|
init_template_manager();
|
|
82
94
|
init_fixture_manager();
|
|
@@ -86,5 +98,5 @@ init_model();
|
|
|
86
98
|
init_utils();
|
|
87
99
|
|
|
88
100
|
//#endregion
|
|
89
|
-
export { ADMIN_SCHEMA, ANONYMOUS_SCHEMA, API_KEY_SCHEMA, AlreadyProcessedException, ApiParamType, BASE_FIELD_MAPPINGS, BUILT_IN_TYPE_IDS, BadRequestException, BaseFrameClass, BaseModel, BaseModelClass, CachePresets, CompressPresets, DB, DBClass, DuplicateRowException, Entity, EntityJsonSchema, EntityManager, FUZZY_OPERATORS, FixtureManager, FixtureManagerClass, GenerateOptions, InternalServerErrorException, JWT_SCHEMA, JoinClauseGroup, KnownOpclassValues, Migrator, Naite, NaiteClass, NaiteQuery, NaiteReporter, NormalPropSchema, NotFoundException, ORGANIZATION_SCHEMA, PASSKEY_SCHEMA, PHONE_NUMBER_SCHEMA, PathAndCode, PostgreSQLSchemaReader, Puri, PuriTransactionWrapper, PuriWrapper, RelationPropSchema, RenderingNode, ResolvedPuri, SSO_SCHEMA, ServiceUnavailableException, SoException, Sonamu, SonamuFileArraySchema, SonamuFileSchema, SonamuQueryMode, SonamuSemanticParams, TWO_FACTOR_SCHEMA, TargetNotFoundException, Template, TemplateKey, TemplateManager, TemplateManagerClass, TemplateOptions, USERNAME_SCHEMA, UnauthorizedException, UpsertBuilder, WhereGroup, ZodStringFormat, admin, anonymous, api, apiKey, applyCacheHeaders, asArray, assertDefined, assertExists, assertNotNull, betterAuthV1, buildCacheControl, cache, convertFastifyHeadersToStandard, createMockSSEFactory, createSSEFactory, defaultOperatorByPropType, defineConfig, differenceWith, exhaustive, findApiRootPath, findAppRootPath, generateAlterCode, generateBetterAuthEntities, generateCreateCode, getAlterIndexesTo, getDescription, getEnumDefValues, getEnumValues, getMigrationSetFromEntity, getSubsetFields, ingestAuditEvent, intersectionBy, isBelongsToOneRelationProp, isBigIntegerArrayProp, isBigIntegerProp, isBigIntegerSingleProp, isBooleanArrayProp, isBooleanProp, isBooleanSingleProp, isCompressDisabled, isCustomJoinClause, isDaemonServer, isDateArrayProp, isDateProp, isDateSingleProp, isDevelopment, isEnumArrayProp, isEnumDefWithCone, isEnumProp, isEnumSingleProp, isHasManyRelationProp, isHotReloadServer, isInDocker, isIntegerArrayProp, isIntegerProp, isIntegerSingleProp, isInternalSubsetField, isJsonProp, isKnexError, isLocal, isManyToManyRelationProp, isNumberArrayProp, isNumberProp, isNumberSingleProp, isNumericArrayProp, isNumericProp, isNumericSingleProp, isOneToOneRelationProp, isProduction, isRefField, isRelationProp, isRemote, isSearchTextJsonSourceZodType, isSearchTextProp, isSoException, isStaging, isStringArrayProp, isStringProp, isStringSingleProp, isSubsetDefWithCone, isTest, isTsVectorProp, isUuidArrayProp, isUuidProp, isUuidSingleProp, isVectorArrayProp, isVectorProp, isVectorSingleProp, isVirtualCodeProp, isVirtualProp, isVirtualQueryProp, jwt, loadConfig, merge, nonNullable, normalizeFilterQuery, normalizeSubsetField, objToMap, operatorsByPropType, organization, passkey, phoneNumber, registeredApis, setMigrationIndexDefaults, setupErrorHandler, sonamuAuditLog, sonamuKnexAdapter, sso, stream, toFastifyCompressOption, transactional, twoFactor, upload, username, validateSonamuFilters, withProp, withProps, workflow, zArrayable };
|
|
90
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,
|
|
101
|
+
export { ADMIN_SCHEMA, ANONYMOUS_SCHEMA, API_KEY_SCHEMA, AlreadyProcessedException, ApiParamType, BASE_FIELD_MAPPINGS, BUILT_IN_TYPE_IDS, BadRequestException, BaseFrameClass, BaseModel, BaseModelClass, CachePresets, CompressPresets, DB, DBClass, DuplicateRowException, Entity, EntityJsonSchema, EntityManager, FUZZY_OPERATORS, FixtureManager, FixtureManagerClass, GenerateOptions, InMemoryWebSocketPresenceStore, InternalServerErrorException, JWT_SCHEMA, JoinClauseGroup, KnownOpclassValues, Migrator, Naite, NaiteClass, NaiteQuery, NaiteReporter, NoopWebSocketClusterBus, NormalPropSchema, NotFoundException, ORGANIZATION_SCHEMA, PASSKEY_SCHEMA, PHONE_NUMBER_SCHEMA, PathAndCode, PostgreSQLSchemaReader, Puri, PuriTransactionWrapper, PuriWrapper, RelationPropSchema, RenderingNode, ResolvedPuri, SSO_SCHEMA, ServiceUnavailableException, SoException, Sonamu, SonamuFileArraySchema, SonamuFileSchema, SonamuQueryMode, SonamuSemanticParams, TWO_FACTOR_SCHEMA, TargetNotFoundException, Template, TemplateKey, TemplateManager, TemplateManagerClass, TemplateOptions, USERNAME_SCHEMA, UnauthorizedException, UpsertBuilder, WebSocketAudience, WebSocketRegistry, WebSocketRuntime, WhereGroup, ZodStringFormat, admin, anonymous, api, apiKey, applyCacheHeaders, asArray, assertDefined, assertExists, assertNotNull, betterAuthV1, buildCacheControl, cache, convertFastifyHeadersToStandard, createMockSSEFactory, createSSEFactory, createWebSocketReplyStub, createWebSocketRuntime, defaultOperatorByPropType, defineConfig, differenceWith, exhaustive, findApiRootPath, findAppRootPath, generateAlterCode, generateBetterAuthEntities, generateCreateCode, getAlterIndexesTo, getDescription, getEnumDefValues, getEnumValues, getMigrationSetFromEntity, getSubsetFields, ingestAuditEvent, intersectionBy, isBelongsToOneRelationProp, isBigIntegerArrayProp, isBigIntegerProp, isBigIntegerSingleProp, isBooleanArrayProp, isBooleanProp, isBooleanSingleProp, isCompressDisabled, isCustomJoinClause, isDaemonServer, isDateArrayProp, isDateProp, isDateSingleProp, isDevelopment, isEnumArrayProp, isEnumDefWithCone, isEnumProp, isEnumSingleProp, isHasManyRelationProp, isHotReloadServer, isInDocker, isIntegerArrayProp, isIntegerProp, isIntegerSingleProp, isInternalSubsetField, isJsonProp, isKnexError, isLocal, isManyToManyRelationProp, isNumberArrayProp, isNumberProp, isNumberSingleProp, isNumericArrayProp, isNumericProp, isNumericSingleProp, isOneToOneRelationProp, isPlainObject, isProduction, isRefField, isRelationProp, isRemote, isSearchTextJsonSourceZodType, isSearchTextProp, isSoException, isStaging, isStringArrayProp, isStringProp, isStringSingleProp, isSubsetDefWithCone, isTest, isTsVectorProp, isUuidArrayProp, isUuidProp, isUuidSingleProp, isVectorArrayProp, isVectorProp, isVectorSingleProp, isVirtualCodeProp, isVirtualProp, isVirtualQueryProp, jwt, loadConfig, merge, nonNullable, normalizeFilterQuery, normalizeSubsetField, objToMap, operatorsByPropType, organization, passkey, phoneNumber, registeredApis, resolveWebSocketCloseDescriptor, resolveWebSocketPluginOptions, setMigrationIndexDefaults, setupErrorHandler, sonamuAuditLog, sonamuKnexAdapter, sso, stream, toFastifyCompressOption, transactional, twoFactor, upload, username, validateSonamuFilters, websocket, withProp, withProps, workflow, zArrayable };
|
|
102
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vc3JjL2luZGV4LnRzIl0sInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCAqIGZyb20gXCIuL2FwaS9iYXNlLWZyYW1lXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9hcGkvY29uZmlnXCI7XG5leHBvcnQgdHlwZSAqIGZyb20gXCIuL2FwaS9jb250ZXh0XCI7XG5leHBvcnQgKiBmcm9tIFwiLi9hcGkvZGVjb3JhdG9yc1wiO1xuZXhwb3J0ICogZnJvbSBcIi4vYXBpL3NvbmFtdVwiO1xuZXhwb3J0ICogZnJvbSBcIi4vYXV0aFwiO1xuZXhwb3J0IHsgY2FjaGUgfSBmcm9tIFwiLi9jYWNoZS9kZWNvcmF0b3JcIjtcbmV4cG9ydCB0eXBlIHsgQ2FjaGVEZWNvcmF0b3JPcHRpb25zIH0gZnJvbSBcIi4vY2FjaGUvdHlwZXNcIjtcbmV4cG9ydCAqIGZyb20gXCIuL2NhY2hlLWNvbnRyb2wvY2FjaGUtY29udHJvbFwiO1xuZXhwb3J0IHR5cGUgKiBmcm9tIFwiLi9jYWNoZS1jb250cm9sL3R5cGVzXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9jb21wcmVzcy9jb21wcmVzc1wiO1xuZXhwb3J0IHR5cGUgKiBmcm9tIFwiLi9jb21wcmVzcy90eXBlc1wiO1xuZXhwb3J0ICogZnJvbSBcIi4vZGF0YWJhc2UvYmFzZS1tb2RlbFwiO1xuZXhwb3J0ICogZnJvbSBcIi4vZGF0YWJhc2UvYmFzZS1tb2RlbC50eXBlc1wiO1xuZXhwb3J0ICogZnJvbSBcIi4vZGF0YWJhc2UvZGJcIjtcbmV4cG9ydCAqIGZyb20gXCIuL2RhdGFiYXNlL3B1cmlcIjtcbmV4cG9ydCAqIGZyb20gXCIuL2RhdGFiYXNlL3B1cmkudHlwZXNcIjtcbmV4cG9ydCAqIGZyb20gXCIuL2RhdGFiYXNlL3B1cmktc3Vic2V0LnR5cGVzXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9kYXRhYmFzZS9wdXJpLXdyYXBwZXJcIjtcbmV4cG9ydCAqIGZyb20gXCIuL2RhdGFiYXNlL3Vwc2VydC1idWlsZGVyXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9lbnRpdHkvZW50aXR5XCI7XG5leHBvcnQgKiBmcm9tIFwiLi9lbnRpdHkvZW50aXR5LW1hbmFnZXJcIjtcbmV4cG9ydCAqIGZyb20gXCIuL2V4Y2VwdGlvbnMvZXJyb3ItaGFuZGxlclwiO1xuZXhwb3J0ICogZnJvbSBcIi4vZXhjZXB0aW9ucy9zby1leGNlcHRpb25zXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9maWx0ZXJcIjtcbmV4cG9ydCAqIGZyb20gXCIuL21pZ3JhdGlvbi9jb2RlLWdlbmVyYXRpb25cIjtcbmV4cG9ydCAqIGZyb20gXCIuL21pZ3JhdGlvbi9taWdyYXRpb24tc2V0XCI7XG5leHBvcnQgKiBmcm9tIFwiLi9taWdyYXRpb24vbWlncmF0b3JcIjtcbmV4cG9ydCAqIGZyb20gXCIuL21pZ3JhdGlvbi9wb3N0Z3Jlc3FsLXNjaGVtYS1yZWFkZXJcIjtcbmV4cG9ydCAqIGZyb20gXCIuL21pZ3JhdGlvbi90eXBlc1wiO1xuZXhwb3J0ICogZnJvbSBcIi4vbmFpdGUvbmFpdGVcIjtcbmV4cG9ydCAqIGZyb20gXCIuL25haXRlL25haXRlLXJlcG9ydGVyXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9zdHJlYW0vc3NlXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9zdHJlYW0vd3MtYXVkaWVuY2VcIjtcbmV4cG9ydCAqIGZyb20gXCIuL3N0cmVhbS93cy1jbHVzdGVyLWJ1c1wiO1xuZXhwb3J0ICogZnJvbSBcIi4vc3RyZWFtL3dzLWNvcmVcIjtcbmV4cG9ydCAqIGZyb20gXCIuL3N0cmVhbS93cy1wcmVzZW5jZS1zdG9yZVwiO1xuZXhwb3J0ICogZnJvbSBcIi4vc3RyZWFtL3dzXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9zdHJlYW0vd3MtcmVnaXN0cnlcIjtcbmV4cG9ydCAqIGZyb20gXCIuL3Rhc2tzL2RlY29yYXRvclwiO1xuZXhwb3J0ICogZnJvbSBcIi4vdGVtcGxhdGUvdGVtcGxhdGVcIjtcbmV4cG9ydCAqIGZyb20gXCIuL3RlbXBsYXRlL3RlbXBsYXRlLW1hbmFnZXJcIjtcbmV4cG9ydCAqIGZyb20gXCIuL3Rlc3RpbmcvZml4dHVyZS1tYW5hZ2VyXCI7XG5leHBvcnQgKiBmcm9tIFwiLi90eXBlcy90eXBlc1wiO1xuZXhwb3J0ICogZnJvbSBcIi4vdXRpbHMvY29udHJvbGxlclwiO1xuZXhwb3J0ICogZnJvbSBcIi4vdXRpbHMvbW9kZWxcIjtcbmV4cG9ydCAqIGZyb20gXCIuL3V0aWxzL3R5cGUtdXRpbHNcIjtcbmV4cG9ydCAqIGZyb20gXCIuL3V0aWxzL3V0aWxzXCI7XG5cbi8vIGV4cG9ydCAqIGZyb20gXCIuL2FwaS9jb2RlLWNvbnZlcnRlcnNcIjtcbi8vIGV4cG9ydCAqIGZyb20gXCIuL3N5bmNlci9zeW5jZXJcIjtcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Z0JBTTBDIn0=
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"code-generation.d.ts","sourceRoot":"","sources":["../../src/migration/code-generation.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,IAAI,EAAE,MAAM,MAAM,CAAC;AAKjC,OAAO,EAEL,KAAK,gBAAgB,EAGrB,KAAK,cAAc,EACnB,KAAK,YAAY,EAClB,MAAM,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"code-generation.d.ts","sourceRoot":"","sources":["../../src/migration/code-generation.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,IAAI,EAAE,MAAM,MAAM,CAAC;AAKjC,OAAO,EAEL,KAAK,gBAAgB,EAGrB,KAAK,cAAc,EACnB,KAAK,YAAY,EAClB,MAAM,gBAAgB,CAAC;AAqhDxB;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,aAAa,EAAE,cAAc,EAAE,EAAE,SAAS,EAAE,cAAc,EAAE;SAG/E,cAAc,EAAE;UACf,cAAc,EAAE;EAuC/B;AAWD;;GAEG;AACH,wBAAgB,yBAAyB,CAAC,KAAK,EAAE,cAAc,GAAG,cAAc,CAoB/E;AAuHD;;;;GAIG;AACH,wBAAsB,kBAAkB,CAAC,SAAS,EAAE,YAAY,GAAG,OAAO,CAAC,gBAAgB,EAAE,CAAC,CAS7F;AAED;;;;;;GAMG;AACH,wBAAsB,iBAAiB,CACrC,SAAS,EAAE,YAAY,EACvB,KAAK,EAAE,YAAY,EACnB,SAAS,CAAC,EAAE,IAAI,GACf,OAAO,CAAC,gBAAgB,EAAE,CAAC,CA0G7B"}
|