sonamu 0.9.20 → 0.10.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/_virtual/_rolldown/runtime.js +36 -0
- package/dist/ai/agents/agent.js +5 -7
- package/dist/ai/agents/index.js +1 -2
- package/dist/ai/agents/types.js +1 -1
- package/dist/ai/index.js +1 -2
- package/dist/ai/providers/rtzr/api.js +2 -3
- package/dist/ai/providers/rtzr/error.js +14 -29
- package/dist/ai/providers/rtzr/index.js +1 -2
- package/dist/ai/providers/rtzr/model.js +13 -20
- package/dist/ai/providers/rtzr/options.js +2 -3
- package/dist/ai/providers/rtzr/provider.js +2 -3
- package/dist/ai/providers/rtzr/utils.js +12 -21
- package/dist/api/base-frame.js +4 -4
- package/dist/api/caster.js +21 -38
- package/dist/api/code-converters.js +41 -98
- package/dist/api/config.d.ts +1 -10
- package/dist/api/config.d.ts.map +1 -1
- package/dist/api/config.js +9 -8
- package/dist/api/context.js +2 -3
- package/dist/api/decorators.js +80 -116
- package/dist/api/index.js +2 -3
- package/dist/api/secret.js +6 -10
- package/dist/api/sonamu.d.ts.map +1 -1
- package/dist/api/sonamu.js +200 -387
- package/dist/api/validator.js +5 -8
- package/dist/api/websocket-helpers.js +21 -32
- package/dist/auth/audit-log/builders.js +2 -3
- package/dist/auth/audit-log/events.js +2 -2
- package/dist/auth/audit-log/plugin.js +30 -61
- package/dist/auth/audit-log-ingestor.js +19 -41
- package/dist/auth/auth-generator.js +16 -41
- package/dist/auth/better-auth-entities.js +3 -4
- package/dist/auth/index.js +2 -3
- package/dist/auth/knex-adapter.js +18 -45
- package/dist/auth/plugins/entity-definitions/admin.js +2 -2
- package/dist/auth/plugins/entity-definitions/anonymous.js +2 -2
- package/dist/auth/plugins/entity-definitions/api-key.js +2 -2
- package/dist/auth/plugins/entity-definitions/audit-log.js +2 -2
- package/dist/auth/plugins/entity-definitions/index.js +2 -3
- package/dist/auth/plugins/entity-definitions/jwt.js +2 -2
- package/dist/auth/plugins/entity-definitions/organization.js +2 -2
- package/dist/auth/plugins/entity-definitions/passkey.js +2 -2
- package/dist/auth/plugins/entity-definitions/phone-number.js +2 -2
- package/dist/auth/plugins/entity-definitions/sso.js +2 -2
- package/dist/auth/plugins/entity-definitions/two-factor.js +2 -2
- package/dist/auth/plugins/entity-definitions/types.js +1 -1
- package/dist/auth/plugins/entity-definitions/username.js +2 -2
- package/dist/auth/plugins/index.js +1 -2
- package/dist/auth/plugins/wrappers/admin.js +2 -3
- package/dist/auth/plugins/wrappers/anonymous.js +2 -3
- package/dist/auth/plugins/wrappers/api-key.js +2 -3
- package/dist/auth/plugins/wrappers/index.js +1 -2
- package/dist/auth/plugins/wrappers/jwt.js +2 -3
- package/dist/auth/plugins/wrappers/organization.js +2 -3
- package/dist/auth/plugins/wrappers/passkey.js +2 -3
- package/dist/auth/plugins/wrappers/phone-number.js +2 -3
- package/dist/auth/plugins/wrappers/sso.js +2 -3
- package/dist/auth/plugins/wrappers/two-factor.js +2 -3
- package/dist/auth/plugins/wrappers/username.js +2 -3
- package/dist/bin/build-config.js +2 -2
- package/dist/bin/cli.js +151 -258
- package/dist/bin/fixture.d.ts.map +1 -1
- package/dist/bin/fixture.js +55 -97
- package/dist/bin/hmr-hook-register.js +3 -3
- package/dist/bin/migrate-targets.d.ts +3 -0
- package/dist/bin/migrate-targets.d.ts.map +1 -0
- package/dist/bin/migrate-targets.js +11 -0
- package/dist/bin/test-command.js +25 -55
- package/dist/bin/ts-loader-register.js +5 -6
- package/dist/bin/ts-loader-registration.js +6 -13
- package/dist/cache/cache-manager.js +3 -4
- package/dist/cache/decorator.js +11 -21
- package/dist/cache/drivers.js +2 -3
- package/dist/cache/index.js +2 -3
- package/dist/cache/types.js +1 -1
- package/dist/cache-control/cache-control.js +21 -34
- package/dist/cache-control/types.js +1 -1
- package/dist/compress/compress.js +10 -10
- package/dist/compress/index.js +1 -2
- package/dist/compress/types.js +1 -1
- package/dist/cone/cone-generator.js +25 -63
- package/dist/database/_batch_update.js +26 -46
- package/dist/database/base-model.js +44 -97
- package/dist/database/base-model.types.js +1 -1
- package/dist/database/db.d.ts +8 -14
- package/dist/database/db.d.ts.map +1 -1
- package/dist/database/db.js +127 -72
- package/dist/database/knex.js +5 -8
- package/dist/database/puri-subset.types.js +1 -1
- package/dist/database/puri-wrapper.js +11 -15
- package/dist/database/puri.js +117 -234
- package/dist/database/puri.types.js +3 -4
- package/dist/database/transaction-context.js +4 -5
- package/dist/database/upsert-builder.js +109 -176
- package/dist/dict/en.d.ts +1 -0
- package/dist/dict/en.d.ts.map +1 -1
- package/dist/dict/en.js +4 -4
- package/dist/dict/index.js +2 -3
- package/dist/dict/ko.d.ts +1 -0
- package/dist/dict/ko.d.ts.map +1 -1
- package/dist/dict/ko.js +4 -4
- package/dist/dict/rc-keys.js +3 -4
- package/dist/dict/sd.js +8 -19
- package/dist/dict/sonamu-dictionary.js +141 -284
- package/dist/dict/types.js +1 -1
- package/dist/dict/utils.js +4 -5
- package/dist/entity/entity-manager.d.ts +2 -2
- package/dist/entity/entity-manager.js +34 -82
- package/dist/entity/entity-template-cone.js +33 -66
- package/dist/entity/entity.js +156 -310
- package/dist/env.d.ts +14 -0
- package/dist/env.d.ts.map +1 -0
- package/dist/env.js +75 -0
- package/dist/exceptions/error-handler.js +2 -3
- package/dist/exceptions/so-exceptions.js +7 -5
- package/dist/filter/index.js +1 -2
- package/dist/filter/types.js +3 -4
- package/dist/filter/utils.js +21 -54
- package/dist/index.js +8 -7
- package/dist/logger/category.js +6 -12
- package/dist/logger/configure.js +23 -34
- package/dist/migration/code-generation.js +146 -314
- package/dist/migration/index-where-predicate.js +52 -144
- package/dist/migration/migration-set.js +19 -33
- package/dist/migration/migrator.d.ts +2 -0
- package/dist/migration/migrator.d.ts.map +1 -1
- package/dist/migration/migrator.js +69 -53
- package/dist/migration/postgresql-schema-reader.js +126 -225
- package/dist/migration/slack-confirm.d.ts +1 -0
- package/dist/migration/slack-confirm.d.ts.map +1 -1
- package/dist/migration/slack-confirm.js +28 -38
- package/dist/migration/types.js +1 -1
- package/dist/naite/messaging-types.js +1 -1
- package/dist/naite/naite-reporter.js +15 -32
- package/dist/naite/naite.js +43 -76
- package/dist/ssr/index.js +6 -9
- package/dist/ssr/registry.js +10 -18
- package/dist/ssr/renderer.js +10 -21
- package/dist/ssr/types.js +1 -1
- package/dist/storage/base-file.js +5 -10
- package/dist/storage/buffered-file.js +3 -4
- package/dist/storage/drivers.js +2 -3
- package/dist/storage/index.js +2 -3
- package/dist/storage/s3-driver.js +5 -9
- package/dist/storage/storage-manager.js +5 -5
- package/dist/storage/types.js +1 -1
- package/dist/storage/uploaded-file.js +4 -6
- package/dist/stream/index.js +1 -2
- package/dist/stream/sse.js +8 -13
- package/dist/stream/ws-audience-resolver.js +5 -5
- package/dist/stream/ws-audience.js +3 -4
- package/dist/stream/ws-cluster-bus.js +3 -4
- package/dist/stream/ws-core.js +1 -1
- package/dist/stream/ws-delivery.js +11 -25
- package/dist/stream/ws-local-connection-store.js +9 -18
- package/dist/stream/ws-presence-store.js +43 -97
- package/dist/stream/ws-registry.js +17 -22
- package/dist/stream/ws-telemetry-memory.js +38 -45
- package/dist/stream/ws-telemetry-trace.js +4 -6
- package/dist/stream/ws-telemetry.js +82 -135
- package/dist/stream/ws.js +47 -91
- package/dist/syncer/api-parser.js +81 -147
- package/dist/syncer/checksum.js +9 -20
- package/dist/syncer/code-generator.js +29 -47
- package/dist/syncer/entity-operations.js +17 -27
- package/dist/syncer/event-batcher.js +8 -15
- package/dist/syncer/file-patterns.js +3 -4
- package/dist/syncer/file-tracking.js +6 -10
- package/dist/syncer/index.js +1 -2
- package/dist/syncer/module-loader.js +10 -26
- package/dist/syncer/syncer-actions.js +19 -37
- package/dist/syncer/syncer.js +46 -98
- package/dist/syncer/watcher.js +12 -26
- package/dist/tasks/decorator.js +7 -11
- package/dist/tasks/step-wrapper.js +7 -8
- package/dist/tasks/workflow-manager.js +18 -25
- package/dist/template/entity-converter.js +40 -64
- package/dist/template/helpers.js +32 -63
- package/dist/template/implementations/entity.template.js +7 -11
- package/dist/template/implementations/entry-server.template.js +2 -3
- package/dist/template/implementations/generated.template.js +25 -51
- package/dist/template/implementations/generated_http.template.js +31 -58
- package/dist/template/implementations/generated_sso.template.js +45 -85
- package/dist/template/implementations/init_types.template.js +4 -7
- package/dist/template/implementations/model.template.js +5 -10
- package/dist/template/implementations/model_test.template.js +2 -3
- package/dist/template/implementations/queries.template.js +4 -7
- package/dist/template/implementations/sd.template.js +17 -35
- package/dist/template/implementations/services.template.js +18 -30
- package/dist/template/implementations/view_form.template.js +72 -125
- package/dist/template/implementations/view_id_all_select.template.js +2 -3
- package/dist/template/implementations/view_list.template.js +86 -143
- package/dist/template/implementations/view_search_input.template.js +2 -3
- package/dist/template/index.js +5 -8
- package/dist/template/template-manager.js +13 -26
- package/dist/template/template-types.js +2 -3
- package/dist/template/template.js +7 -11
- package/dist/template/zod-converter.js +173 -348
- package/dist/testing/_relation-graph.js +18 -37
- package/dist/testing/bootstrap.js +5 -8
- package/dist/testing/data-explorer.js +34 -78
- package/dist/testing/dev-test-routes.js +54 -60
- package/dist/testing/dev-vitest-manager.js +33 -84
- package/dist/testing/faker-mappings.js +3 -4
- package/dist/testing/fixture-generator.d.ts +2 -1
- package/dist/testing/fixture-generator.d.ts.map +1 -1
- package/dist/testing/fixture-generator.js +159 -321
- package/dist/testing/fixture-loader.js +2 -2
- package/dist/testing/fixture-manager.d.ts.map +1 -1
- package/dist/testing/fixture-manager.js +124 -227
- package/dist/testing/global-setup.d.ts.map +1 -1
- package/dist/testing/global-setup.js +29 -17
- package/dist/testing/index.js +1 -2
- package/dist/testing/naite-vitest-reporter.js +2 -3
- package/dist/testing/parallel-db-manager.js +5 -3
- package/dist/testing/vitest-helpers.d.ts.map +1 -1
- package/dist/testing/vitest-helpers.js +15 -12
- package/dist/types/types.d.ts +14 -14
- package/dist/types/types.js +27 -50
- package/dist/ui/ai-api.js +6 -11
- package/dist/ui/ai-client.js +86 -134
- package/dist/ui/api.js +99 -195
- package/dist/ui/cdd-service.js +78 -130
- package/dist/ui/cdd-types.js +1 -1
- package/dist/ui-web/assets/{index-Df8q-fhb.js → index-DFStGyd0.js} +49 -49
- package/dist/ui-web/assets/index-Dx4ap5i4.css +1 -0
- package/dist/ui-web/index.html +2 -2
- package/dist/utils/async-utils.js +13 -25
- package/dist/utils/class-name.js +3 -4
- package/dist/utils/console-util.js +11 -26
- package/dist/utils/controller.d.ts.map +1 -1
- package/dist/utils/controller.js +14 -12
- package/dist/utils/esm-utils.js +5 -8
- package/dist/utils/formatter.js +10 -22
- package/dist/utils/fs-utils.js +14 -25
- package/dist/utils/lodash-able.js +3 -4
- package/dist/utils/model.js +7 -14
- package/dist/utils/object-utils.js +41 -73
- package/dist/utils/path-utils.js +5 -9
- package/dist/utils/process-utils.js +4 -7
- package/dist/utils/sql-parser.js +6 -13
- package/dist/utils/type-utils.js +16 -26
- package/dist/utils/utils.js +18 -40
- package/dist/utils/zod-error.js +9 -16
- package/dist/vector/chunking.js +24 -37
- package/dist/vector/config.js +2 -2
- package/dist/vector/embedding.js +8 -19
- package/dist/vector/index.js +1 -2
- package/dist/vector/types.js +1 -1
- package/package.json +6 -6
- package/src/__tests__/env.test.ts +127 -0
- package/src/api/__tests__/config.test.ts +10 -1
- package/src/api/config.ts +4 -12
- package/src/api/sonamu.ts +14 -4
- package/src/bin/__tests__/migrate-targets.test.ts +28 -0
- package/src/bin/__tests__/test-command.test.ts +82 -1
- package/src/bin/cli.ts +9 -18
- package/src/bin/fixture.ts +5 -4
- package/src/bin/migrate-targets.ts +7 -0
- package/src/bin/test-command.ts +2 -2
- package/src/database/__tests__/db.test.ts +175 -0
- package/src/database/db.ts +193 -71
- package/src/dict/en.ts +2 -0
- package/src/dict/ko.ts +2 -0
- package/src/env.ts +123 -0
- package/src/migration/__tests__/migrator.test.ts +149 -0
- package/src/migration/migrator.ts +74 -17
- package/src/migration/slack-confirm.ts +21 -0
- package/src/skills/sonamu/database.md +1 -1
- package/src/skills/sonamu/testing-devrunner.md +1 -1
- package/src/stream/ws-telemetry-memory.ts +2 -2
- package/src/testing/fixture-generator.ts +2 -1
- package/src/testing/fixture-manager.ts +3 -4
- package/src/testing/global-setup.ts +42 -18
- package/src/testing/vitest-helpers.ts +14 -0
- package/src/utils/controller.ts +14 -7
- package/tsdown.api.config.ts +6 -0
- package/dist/_virtual/rolldown_runtime.js +0 -39
- package/dist/ui-web/assets/index-D4rYm-Xz.css +0 -1
package/dist/syncer/syncer.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { __esmMin } from "../_virtual/
|
|
1
|
+
import { __esmMin } from "../_virtual/_rolldown/runtime.js";
|
|
2
2
|
import { centerText, init_console_util } from "../utils/console-util.js";
|
|
3
3
|
import { init_controller, isTest } from "../utils/controller.js";
|
|
4
4
|
import { init_async_utils, mapAsync, reduceAsync } from "../utils/async-utils.js";
|
|
@@ -18,13 +18,12 @@ import { init_module_loader, loadApis, loadModels, loadTypes, loadWorkflows } fr
|
|
|
18
18
|
import { actionCopySharedToTargetsIfNotExists, actionGenerateHttps, actionGenerateInitialTypes, actionGenerateSchemas, actionGenerateServices, actionGenerateSsrEntryServerIfNotExists, actionGenerateSsrQueries, actionSyncConfig, actionSyncFilesToTargets, actionSyncSonamuDictionary, init_syncer_actions } from "./syncer-actions.js";
|
|
19
19
|
import { group, unique } from "radashi";
|
|
20
20
|
import assert from "assert";
|
|
21
|
-
import { unlink } from "fs/promises";
|
|
22
21
|
import path from "path";
|
|
22
|
+
import { unlink } from "fs/promises";
|
|
23
23
|
import chalk from "chalk";
|
|
24
24
|
import { minimatch } from "minimatch";
|
|
25
25
|
import { EventEmitter } from "events";
|
|
26
26
|
import { hot } from "@sonamu-kit/hmr-hook";
|
|
27
|
-
|
|
28
27
|
//#region src/syncer/syncer.ts
|
|
29
28
|
var Syncer;
|
|
30
29
|
var init_syncer = __esmMin((() => {
|
|
@@ -49,7 +48,7 @@ var init_syncer = __esmMin((() => {
|
|
|
49
48
|
apis = [];
|
|
50
49
|
types = {};
|
|
51
50
|
models = {};
|
|
52
|
-
workflows = new Map();
|
|
51
|
+
workflows = /* @__PURE__ */ new Map();
|
|
53
52
|
eventEmitter = new EventEmitter();
|
|
54
53
|
/**
|
|
55
54
|
* 체크섬이 변경된 부분에 대해 싱크를 진행합니다.
|
|
@@ -81,9 +80,7 @@ var init_syncer = __esmMin((() => {
|
|
|
81
80
|
*/
|
|
82
81
|
async forceSync() {
|
|
83
82
|
const lockPath = path.join(Sonamu.apiRootPath, "sonamu.lock");
|
|
84
|
-
if (await exists(lockPath))
|
|
85
|
-
await unlink(lockPath);
|
|
86
|
-
}
|
|
83
|
+
if (await exists(lockPath)) await unlink(lockPath);
|
|
87
84
|
await this.sync();
|
|
88
85
|
}
|
|
89
86
|
/**
|
|
@@ -103,9 +100,7 @@ var init_syncer = __esmMin((() => {
|
|
|
103
100
|
const hmrActionRequiredEvents = this.extractHmrActionRequiredFileEvents(fileEvents);
|
|
104
101
|
const syncTriggeringPaths = await this.extractSyncTriggeringFileEventPaths(fileEvents);
|
|
105
102
|
await this.invalidateDependentsAffectedByFileEvents(hmrActionRequiredEvents);
|
|
106
|
-
if (syncTriggeringPaths.length > 0)
|
|
107
|
-
await this.doSyncActions(syncTriggeringPaths);
|
|
108
|
-
}
|
|
103
|
+
if (syncTriggeringPaths.length > 0) await this.doSyncActions(syncTriggeringPaths);
|
|
109
104
|
await this.autoloadTypes();
|
|
110
105
|
await this.autoloadModels();
|
|
111
106
|
await this.autoloadApis();
|
|
@@ -115,11 +110,9 @@ var init_syncer = __esmMin((() => {
|
|
|
115
110
|
}
|
|
116
111
|
extractHmrActionRequiredFileEvents(fileEvents) {
|
|
117
112
|
const apiSrc = path.join(Sonamu.apiRootPath, "src");
|
|
118
|
-
const result = new Map();
|
|
113
|
+
const result = /* @__PURE__ */ new Map();
|
|
119
114
|
for (const [filePath, event] of fileEvents) {
|
|
120
|
-
if (!filePath.startsWith(apiSrc))
|
|
121
|
-
continue;
|
|
122
|
-
}
|
|
115
|
+
if (!filePath.startsWith(apiSrc)) continue;
|
|
123
116
|
result.set(filePath, event);
|
|
124
117
|
}
|
|
125
118
|
return result;
|
|
@@ -128,10 +121,7 @@ var init_syncer = __esmMin((() => {
|
|
|
128
121
|
const checkPatternGroup = getChecksumPatternGroupInAbsolutePath();
|
|
129
122
|
const syncTriggeringPaths = [];
|
|
130
123
|
for (const [diffFilePath] of fileEvents) {
|
|
131
|
-
|
|
132
|
-
if (!isInCheckPatternGroup) {
|
|
133
|
-
continue;
|
|
134
|
-
}
|
|
124
|
+
if (!Object.values(checkPatternGroup).some((pattern) => minimatch(diffFilePath, pattern))) continue;
|
|
135
125
|
syncTriggeringPaths.push(diffFilePath);
|
|
136
126
|
}
|
|
137
127
|
return syncTriggeringPaths;
|
|
@@ -142,18 +132,13 @@ var init_syncer = __esmMin((() => {
|
|
|
142
132
|
const invalidatedPaths = await hot.invalidateFile(diffFilePath, event);
|
|
143
133
|
if (invalidatedPaths.length > 0) {
|
|
144
134
|
console.log(chalk.bold(`🔄 Invalidated:`));
|
|
145
|
-
for (const invalidatedPath of invalidatedPaths) {
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
}
|
|
153
|
-
} catch (e) {
|
|
154
|
-
console.error(e);
|
|
155
|
-
console.error(chalk.red(`Failed to remove invalidated registered APIs for ${invalidatedPath}`));
|
|
156
|
-
}
|
|
135
|
+
for (const invalidatedPath of invalidatedPaths) try {
|
|
136
|
+
const removedApis = this.removeInvalidatedRegisteredApis(invalidatedPath);
|
|
137
|
+
if (removedApis.length > 0) console.log(chalk.blue(`- ${path.relative(Sonamu.apiRootPath, invalidatedPath)}`), chalk.gray(`(with ${removedApis.length} APIs)`));
|
|
138
|
+
else console.log(chalk.blue(`- ${path.relative(Sonamu.apiRootPath, invalidatedPath)}`));
|
|
139
|
+
} catch (e) {
|
|
140
|
+
console.error(e);
|
|
141
|
+
console.error(chalk.red(`Failed to remove invalidated registered APIs for ${invalidatedPath}`));
|
|
157
142
|
}
|
|
158
143
|
}
|
|
159
144
|
}
|
|
@@ -166,17 +151,12 @@ var init_syncer = __esmMin((() => {
|
|
|
166
151
|
removeInvalidatedRegisteredApis(invalidatedPath) {
|
|
167
152
|
const isModel = invalidatedPath.endsWith(".model.ts");
|
|
168
153
|
const isFrame = invalidatedPath.endsWith(".frame.ts");
|
|
169
|
-
if (!isModel && !isFrame)
|
|
170
|
-
|
|
171
|
-
}
|
|
172
|
-
const entityId = EntityManager.getEntityIdFromPath(invalidatedPath);
|
|
173
|
-
const targetModelName = `${entityId}${isModel ? "Model" : "Frame"}`;
|
|
154
|
+
if (!isModel && !isFrame) return [];
|
|
155
|
+
const targetModelName = `${EntityManager.getEntityIdFromPath(invalidatedPath)}${isModel ? "Model" : "Frame"}`;
|
|
174
156
|
const toRemove = registeredApis.filter((api) => api.modelName === targetModelName);
|
|
175
157
|
for (const api of toRemove) {
|
|
176
158
|
const idx = registeredApis.indexOf(api);
|
|
177
|
-
if (idx !== -1)
|
|
178
|
-
registeredApis.splice(idx, 1);
|
|
179
|
-
}
|
|
159
|
+
if (idx !== -1) registeredApis.splice(idx, 1);
|
|
180
160
|
}
|
|
181
161
|
return toRemove;
|
|
182
162
|
}
|
|
@@ -197,19 +177,15 @@ var init_syncer = __esmMin((() => {
|
|
|
197
177
|
const ssrConfigPath = path.join(Sonamu.apiRootPath, "src/ssr");
|
|
198
178
|
const { clearSSRRoutes } = await import("../ssr/index.js");
|
|
199
179
|
clearSSRRoutes();
|
|
200
|
-
if (!await exists(ssrConfigPath))
|
|
201
|
-
return;
|
|
202
|
-
}
|
|
180
|
+
if (!await exists(ssrConfigPath)) return;
|
|
203
181
|
const { globAsync } = await import("../utils/async-utils.js");
|
|
204
182
|
const { importMembers } = await import("../utils/esm-utils.js");
|
|
205
183
|
const { runtimePath } = await import("../utils/path-utils.js");
|
|
206
184
|
const files = await globAsync(path.join(ssrConfigPath, runtimePath("**/*.ts")));
|
|
207
|
-
for (const file of files) {
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
}
|
|
211
|
-
console.error(`Failed to load SSR route: ${file}`, e);
|
|
212
|
-
}
|
|
185
|
+
for (const file of files) try {
|
|
186
|
+
await importMembers(file);
|
|
187
|
+
} catch (e) {
|
|
188
|
+
console.error(`Failed to load SSR route: ${file}`, e);
|
|
213
189
|
}
|
|
214
190
|
}
|
|
215
191
|
/**
|
|
@@ -223,24 +199,12 @@ var init_syncer = __esmMin((() => {
|
|
|
223
199
|
const diffGroups = this.calculateDiffGroups(diffFilePaths);
|
|
224
200
|
const diffTypes = Object.keys(diffGroups);
|
|
225
201
|
const { changeMatches, nothingMatches, unhandledPaths } = this.changeMatcher(diffTypes, diffGroups);
|
|
226
|
-
if (changeMatches("entity", "types"))
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
if (changeMatches("
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
if (changeMatches("types", "functions")) {
|
|
233
|
-
await this.handleAuxiliarySymbolChanges(diffGroups);
|
|
234
|
-
}
|
|
235
|
-
if (changeMatches("config")) {
|
|
236
|
-
await this.handleConfigChanges(diffGroups);
|
|
237
|
-
}
|
|
238
|
-
if (changeMatches("i18n", "entity", "config")) {
|
|
239
|
-
await this.handleSonamuDictionaryRelatedChanges(diffGroups);
|
|
240
|
-
}
|
|
241
|
-
if (nothingMatches()) {
|
|
242
|
-
await this.handleDrifts(unhandledPaths());
|
|
243
|
-
}
|
|
202
|
+
if (changeMatches("entity", "types")) await this.handleTruthSourceChanges(diffGroups);
|
|
203
|
+
if (changeMatches("model", "frame")) await this.handleImplementationChanges(diffGroups);
|
|
204
|
+
if (changeMatches("types", "functions")) await this.handleAuxiliarySymbolChanges(diffGroups);
|
|
205
|
+
if (changeMatches("config")) await this.handleConfigChanges(diffGroups);
|
|
206
|
+
if (changeMatches("i18n", "entity", "config")) await this.handleSonamuDictionaryRelatedChanges(diffGroups);
|
|
207
|
+
if (nothingMatches()) await this.handleDrifts(unhandledPaths());
|
|
244
208
|
return { diffTypes };
|
|
245
209
|
}
|
|
246
210
|
calculateDiffGroups(diffFiles) {
|
|
@@ -249,16 +213,12 @@ var init_syncer = __esmMin((() => {
|
|
|
249
213
|
return group(diffFiles, (filePath) => {
|
|
250
214
|
const relativePath = path.relative(Sonamu.appRootPath, filePath);
|
|
251
215
|
if (relativePath.startsWith("..")) return "unknown";
|
|
252
|
-
for (const fileType of fileTypes)
|
|
253
|
-
if (minimatch(relativePath, patternGroup[fileType])) {
|
|
254
|
-
return fileType;
|
|
255
|
-
}
|
|
256
|
-
}
|
|
216
|
+
for (const fileType of fileTypes) if (minimatch(relativePath, patternGroup[fileType])) return fileType;
|
|
257
217
|
return "unknown";
|
|
258
218
|
});
|
|
259
219
|
}
|
|
260
220
|
changeMatcher(diffTypes, diffGroups) {
|
|
261
|
-
const handled = new Set();
|
|
221
|
+
const handled = /* @__PURE__ */ new Set();
|
|
262
222
|
/**
|
|
263
223
|
* 변경 사항이 인자로 받은 FileType들 중 하나 이상을 포함하는지 확인합니다.
|
|
264
224
|
* 가령 ["entity"]가 변경된 호출에서 changeMatches("entity")는 trye를 반환하며,
|
|
@@ -289,18 +249,13 @@ var init_syncer = __esmMin((() => {
|
|
|
289
249
|
Naite.t("handleTruthSourceChanges", { diffGroups });
|
|
290
250
|
await EntityManager.reload();
|
|
291
251
|
const entityPath = diffGroups.entity?.at(0);
|
|
292
|
-
if (entityPath !==
|
|
252
|
+
if (entityPath !== void 0) {
|
|
293
253
|
const entityId = EntityManager.getEntityIdFromPath(entityPath);
|
|
294
254
|
const entity = EntityManager.get(entityId);
|
|
295
255
|
const typeFilePath = path.join(Sonamu.apiRootPath, `src/application/${entity.names.fs}/${entity.names.fs}.types.ts`);
|
|
296
|
-
if (entity.parentId ===
|
|
297
|
-
const types = await actionGenerateInitialTypes(entityId);
|
|
298
|
-
await actionSyncFilesToTargets(types);
|
|
299
|
-
}
|
|
256
|
+
if (entity.parentId === void 0 && !await exists(typeFilePath)) await actionSyncFilesToTargets(await actionGenerateInitialTypes(entityId));
|
|
300
257
|
}
|
|
301
|
-
|
|
302
|
-
const distributable = generated.filter((p) => !p.endsWith(".sso.ts"));
|
|
303
|
-
await actionSyncFilesToTargets(distributable);
|
|
258
|
+
await actionSyncFilesToTargets((await actionGenerateSchemas()).filter((p) => !p.endsWith(".sso.ts")));
|
|
304
259
|
}
|
|
305
260
|
async handleImplementationChanges(diffGroups) {
|
|
306
261
|
Naite.t("handleImplementationChanges", { diffGroups });
|
|
@@ -308,22 +263,20 @@ var init_syncer = __esmMin((() => {
|
|
|
308
263
|
await this.autoloadModels();
|
|
309
264
|
await this.autoloadTypes();
|
|
310
265
|
await this.autoloadApis();
|
|
311
|
-
|
|
266
|
+
await actionGenerateServices(mergedGroup.map((modelPath) => {
|
|
312
267
|
if (modelPath.endsWith(".model.ts") || modelPath.endsWith(".frame.ts")) {
|
|
313
268
|
const entityId = EntityManager.getEntityIdFromPath(modelPath);
|
|
314
269
|
assert(entityId);
|
|
315
270
|
return { namesRecord: EntityManager.getNamesFromId(entityId) };
|
|
316
271
|
}
|
|
317
272
|
throw new Error("not reachable");
|
|
318
|
-
});
|
|
319
|
-
await actionGenerateServices(params);
|
|
273
|
+
}));
|
|
320
274
|
await actionGenerateHttps();
|
|
321
275
|
await actionGenerateSsrQueries();
|
|
322
276
|
}
|
|
323
277
|
async handleAuxiliarySymbolChanges(diffGroups) {
|
|
324
278
|
Naite.t("handleAuxiliarySymbolChanges", { diffGroups });
|
|
325
|
-
|
|
326
|
-
await actionSyncFilesToTargets(tsPaths);
|
|
279
|
+
await actionSyncFilesToTargets(unique([...diffGroups.types ?? [], ...diffGroups.functions ?? []]));
|
|
327
280
|
}
|
|
328
281
|
async handleConfigChanges(_) {
|
|
329
282
|
await actionSyncConfig();
|
|
@@ -334,9 +287,7 @@ var init_syncer = __esmMin((() => {
|
|
|
334
287
|
async handleDrifts(drifts) {
|
|
335
288
|
if (drifts.length > 0) {
|
|
336
289
|
console.warn(chalk.yellow("⚠️ Sonamu가 자동 생성한 파일에 대한 변경이 감지되었습니다. 파일이 Sonamu watcher 외부에서 변경된 것으로 추정됩니다."));
|
|
337
|
-
for (const p of drifts) {
|
|
338
|
-
console.warn(chalk.yellow(` - ${path.relative(Sonamu.appRootPath, p)}`));
|
|
339
|
-
}
|
|
290
|
+
for (const p of drifts) console.warn(chalk.yellow(` - ${path.relative(Sonamu.appRootPath, p)}`));
|
|
340
291
|
console.warn(chalk.dim(" → `pnpm sonamu sync --force`를 권장합니다."));
|
|
341
292
|
}
|
|
342
293
|
}
|
|
@@ -371,20 +322,17 @@ var init_syncer = __esmMin((() => {
|
|
|
371
322
|
const tpl = TemplateManager.get(key);
|
|
372
323
|
if (key.startsWith("view_enums")) {
|
|
373
324
|
await mapAsync(enumsKeys, async (componentId) => {
|
|
374
|
-
const { target
|
|
375
|
-
result[`${key}__${componentId}`] = await exists(path.join(Sonamu.appRootPath, target
|
|
325
|
+
const { target, path: p } = tpl.getTargetAndPath(names, componentId);
|
|
326
|
+
result[`${key}__${componentId}`] = await exists(path.join(Sonamu.appRootPath, target, p));
|
|
376
327
|
});
|
|
377
328
|
return result;
|
|
378
329
|
}
|
|
379
330
|
const { target, path: p } = tpl.getTargetAndPath(names);
|
|
380
331
|
const { targets } = Sonamu.config.sync;
|
|
381
|
-
if (target.includes(":target")) {
|
|
382
|
-
await
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
} else {
|
|
386
|
-
result[key] = await exists(path.join(Sonamu.appRootPath, target, p));
|
|
387
|
-
}
|
|
332
|
+
if (target.includes(":target")) await mapAsync(targets, async (t) => {
|
|
333
|
+
result[`${key}__${t}`] = await exists(path.join(Sonamu.appRootPath, target.replace(":target", t), p));
|
|
334
|
+
});
|
|
335
|
+
else result[key] = await exists(path.join(Sonamu.appRootPath, target, p));
|
|
388
336
|
return result;
|
|
389
337
|
}, {});
|
|
390
338
|
}
|
|
@@ -420,8 +368,8 @@ var init_syncer = __esmMin((() => {
|
|
|
420
368
|
}
|
|
421
369
|
};
|
|
422
370
|
}));
|
|
423
|
-
|
|
424
371
|
//#endregion
|
|
425
372
|
init_syncer();
|
|
426
373
|
export { Syncer, init_syncer };
|
|
427
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3luY2VyLmpzIiwibmFtZXMiOlsiU3luY2VyQWN0aW9ucy5hY3Rpb25Db3B5U2hhcmVkVG9UYXJnZXRzSWZOb3RFeGlzdHMiLCJTeW5jZXJBY3Rpb25zLmFjdGlvbkdlbmVyYXRlU3NyRW50cnlTZXJ2ZXJJZk5vdEV4aXN0cyIsInN5bmNUcmlnZ2VyaW5nUGF0aHM6IEFic29sdXRlUGF0aFtdIiwiU3luY2VyQWN0aW9ucy5hY3Rpb25HZW5lcmF0ZUluaXRpYWxUeXBlcyIsIlN5bmNlckFjdGlvbnMuYWN0aW9uU3luY0ZpbGVzVG9UYXJnZXRzIiwiU3luY2VyQWN0aW9ucy5hY3Rpb25HZW5lcmF0ZVNjaGVtYXMiLCJwYXJhbXM6IHtcbiAgICAgIG5hbWVzUmVjb3JkOiBFbnRpdHlOYW1lc1JlY29yZDtcbiAgICB9W10iLCJTeW5jZXJBY3Rpb25zLmFjdGlvbkdlbmVyYXRlU2VydmljZXMiLCJTeW5jZXJBY3Rpb25zLmFjdGlvbkdlbmVyYXRlSHR0cHMiLCJTeW5jZXJBY3Rpb25zLmFjdGlvbkdlbmVyYXRlU3NyUXVlcmllcyIsIlN5bmNlckFjdGlvbnMuYWN0aW9uU3luY0NvbmZpZyIsIlN5bmNlckFjdGlvbnMuYWN0aW9uU3luY1NvbmFtdURpY3Rpb25hcnkiLCJrZXlzOiBUZW1wbGF0ZUtleVtdIiwicCIsInRhcmdldCJdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zeW5jZXIvc3luY2VyLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBhc3NlcnQgZnJvbSBcImFzc2VydFwiO1xuaW1wb3J0IHsgRXZlbnRFbWl0dGVyIH0gZnJvbSBcImV2ZW50c1wiO1xuaW1wb3J0IHsgdW5saW5rIH0gZnJvbSBcImZzL3Byb21pc2VzXCI7XG5pbXBvcnQgcGF0aCBmcm9tIFwicGF0aFwiO1xuXG5pbXBvcnQgeyBob3QgfSBmcm9tIFwiQHNvbmFtdS1raXQvaG1yLWhvb2tcIjtcbmltcG9ydCBjaGFsayBmcm9tIFwiY2hhbGtcIjtcbmltcG9ydCB7IG1pbmltYXRjaCB9IGZyb20gXCJtaW5pbWF0Y2hcIjtcbmltcG9ydCB7IGdyb3VwLCB1bmlxdWUgfSBmcm9tIFwicmFkYXNoaVwiO1xuaW1wb3J0IHsgdHlwZSB6IH0gZnJvbSBcInpvZFwiO1xuXG5pbXBvcnQgeyByZWdpc3RlcmVkQXBpcyB9IGZyb20gXCIuLi9hcGkvZGVjb3JhdG9yc1wiO1xuaW1wb3J0IHsgU29uYW11IH0gZnJvbSBcIi4uL2FwaS9zb25hbXVcIjtcbmltcG9ydCB7IEVudGl0eU1hbmFnZXIgfSBmcm9tIFwiLi4vZW50aXR5L2VudGl0eS1tYW5hZ2VyXCI7XG5pbXBvcnQgeyB0eXBlIEVudGl0eU5hbWVzUmVjb3JkIH0gZnJvbSBcIi4uL2VudGl0eS9lbnRpdHktbWFuYWdlclwiO1xuaW1wb3J0IHsgTmFpdGUgfSBmcm9tIFwiLi4vbmFpdGUvbmFpdGVcIjtcbmltcG9ydCB7IHR5cGUgV29ya2Zsb3dNZXRhZGF0YSB9IGZyb20gXCIuLi90YXNrcy9kZWNvcmF0b3JcIjtcbmltcG9ydCB7IFRlbXBsYXRlTWFuYWdlciB9IGZyb20gXCIuLi90ZW1wbGF0ZS90ZW1wbGF0ZS1tYW5hZ2VyXCI7XG5pbXBvcnQgeyB0eXBlIEdlbmVyYXRlT3B0aW9ucywgdHlwZSBQYXRoQW5kQ29kZSB9IGZyb20gXCIuLi90eXBlcy90eXBlc1wiO1xuaW1wb3J0IHsgVGVtcGxhdGVLZXkgfSBmcm9tIFwiLi4vdHlwZXMvdHlwZXNcIjtcbmltcG9ydCB7IHR5cGUgVGVtcGxhdGVPcHRpb25zIH0gZnJvbSBcIi4uL3R5cGVzL3R5cGVzXCI7XG5pbXBvcnQgeyBtYXBBc3luYywgcmVkdWNlQXN5bmMgfSBmcm9tIFwiLi4vdXRpbHMvYXN5bmMtdXRpbHNcIjtcbmltcG9ydCB7IGNlbnRlclRleHQgfSBmcm9tIFwiLi4vdXRpbHMvY29uc29sZS11dGlsXCI7XG5pbXBvcnQgeyBpc1Rlc3QgfSBmcm9tIFwiLi4vdXRpbHMvY29udHJvbGxlclwiO1xuaW1wb3J0IHsgZXhpc3RzIH0gZnJvbSBcIi4uL3V0aWxzL2ZzLXV0aWxzXCI7XG5pbXBvcnQgeyB0eXBlIEFic29sdXRlUGF0aCB9IGZyb20gXCIuLi91dGlscy9wYXRoLXV0aWxzXCI7XG5pbXBvcnQgeyBydW5XaXRoR3JhY2VmdWxTaHV0ZG93biB9IGZyb20gXCIuLi91dGlscy9wcm9jZXNzLXV0aWxzXCI7XG5pbXBvcnQgeyBmaW5kQ2hhbmdlZEZpbGVzVXNpbmdDaGVja3N1bXMsIHJlbmV3Q2hlY2tzdW1zIH0gZnJvbSBcIi4vY2hlY2tzdW1cIjtcbmltcG9ydCB7IGdlbmVyYXRlVGVtcGxhdGUsIHJlbmRlclRlbXBsYXRlIH0gZnJvbSBcIi4vY29kZS1nZW5lcmF0b3JcIjtcbmltcG9ydCB7IGNyZWF0ZUVudGl0eSwgZGVsRW50aXR5IH0gZnJvbSBcIi4vZW50aXR5LW9wZXJhdGlvbnNcIjtcbmltcG9ydCB7IGdldENoZWNrc3VtUGF0dGVybkdyb3VwLCBnZXRDaGVja3N1bVBhdHRlcm5Hcm91cEluQWJzb2x1dGVQYXRoIH0gZnJvbSBcIi4vZmlsZS1wYXR0ZXJuc1wiO1xuaW1wb3J0IHsgdHlwZSBGaWxlVHlwZSB9IGZyb20gXCIuL2ZpbGUtcGF0dGVybnNcIjtcbmltcG9ydCB7IGxvYWRBcGlzLCBsb2FkTW9kZWxzLCBsb2FkVHlwZXMsIGxvYWRXb3JrZmxvd3MgfSBmcm9tIFwiLi9tb2R1bGUtbG9hZGVyXCI7XG5pbXBvcnQgeyB0eXBlIExvYWRlZEFwaXMsIHR5cGUgTG9hZGVkTW9kZWxzLCB0eXBlIExvYWRlZFR5cGVzIH0gZnJvbSBcIi4vbW9kdWxlLWxvYWRlclwiO1xuaW1wb3J0ICogYXMgU3luY2VyQWN0aW9ucyBmcm9tIFwiLi9zeW5jZXItYWN0aW9uc1wiO1xuXG50eXBlIERpZmZHcm91cHMgPSB7XG4gIFtrZXkgaW4gRmlsZVR5cGVdOiBBYnNvbHV0ZVBhdGhbXTtcbn07XG5cbmV4cG9ydCBjbGFzcyBTeW5jZXIge1xuICBhcGlzOiBMb2FkZWRBcGlzID0gW107XG4gIHR5cGVzOiBMb2FkZWRUeXBlcyA9IHt9O1xuICBtb2RlbHM6IExvYWRlZE1vZGVscyA9IHt9O1xuICB3b3JrZmxvd3M6IE1hcDxzdHJpbmcsIFdvcmtmbG93TWV0YWRhdGFbXT4gPSBuZXcgTWFwKCk7XG4gIGV2ZW50RW1pdHRlcjogRXZlbnRFbWl0dGVyID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuXG4gIC8qKlxuICAgKiDssrTtgazshKzsnbQg67OA6rK965CcIOu2gOu2hOyXkCDrjIDtlbQg7Iux7YGs66W8IOynhO2Wie2VqeuLiOuLpC5cbiAgICogZGV2IOyEnOuyhOqwgCDsspjsnYwg65a07J2EIOuVjCwgc29uYW11IHN5bmMg7ZWgIOuVjCDsi6TtlonrkKnri4jri6QuIOydtO2bhOyXkOuKlCBobXJBbmRTeW5jIOqyveuhnOulvCDtg4DsmpQuXG4gICAqIEByZXR1cm5zXG4gICAqL1xuICBhc3luYyBzeW5jKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIC8vIOy0iOq4sCDrtoDtirjsiqTtirjrnqkhIOyWmOuEpOuTpOydgCBpZGVtcG90ZW507ZWY6rOgIOqwgOuzjeq4sCDrlYzrrLjsl5Ag66y07KeA7ISxIOyLpO2Wie2VtOuPhCDrkKnri4jri6QuXG4gICAgLy8g7JaY64Sk65Ok7J2AIHNvbmFtdS5sb2Nr7JeQIOuTpOyWtOqwgOyngOuPhCDslYrqs6Ag65Sw65287IScIEhNUiDqsr3roZzrpbwg7YOA7KeA64+EIOyViuuKlCDsuZzqtazrk6TsnoXri4jri6QuXG4gICAgLy8g6re4656Y7IScIOyVhOustCDrlYzrgpgg6re464OlIOuPjOugpOyjvOuptCDrkJjripTrjbAsIGhtckFuZFN5bmPsl5DshJwg66ek67KIIO2VmOuKlCDqsoPsnYAg64Kt67mE7J2064uIIOyXrOq4sOyEnCDtlZwg67KI66eMIO2VqeuLiOuLpC5cbiAgICBhd2FpdCBTeW5jZXJBY3Rpb25zLmFjdGlvbkNvcHlTaGFyZWRUb1RhcmdldHNJZk5vdEV4aXN0cygpO1xuICAgIGF3YWl0IFN5bmNlckFjdGlvbnMuYWN0aW9uR2VuZXJhdGVTc3JFbnRyeVNlcnZlcklmTm90RXhpc3RzKCk7XG5cbiAgICAvLyDrsJTrgJAg6rKD7J20IOyXhuycvOuptCDqt7jrg6Ug64SY7Ja06rCA7JqULlxuICAgIGNvbnN0IGNoYW5nZWRGaWxlcyA9IGF3YWl0IGZpbmRDaGFuZ2VkRmlsZXNVc2luZ0NoZWNrc3VtcygpO1xuICAgIGlmIChjaGFuZ2VkRmlsZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICBjb25zb2xlLmxvZyhjaGFsay5ibGFjay5iZ0dyZWVuKGNlbnRlclRleHQoXCJBbGwgZmlsZXMgYXJlIHN5bmNlZCFcIikpKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyDsl6zquLDshJwg7Iuk7KCcIOyLse2BrCDrj5nsnpHsnYQg7IiY7ZaJ7ZWp64uI64ukLlxuICAgIC8vIOuLpOunjCDsi7Htgawg7KSR7JeQIO2UhOuhnOyEuOyKpOqwgCDso73snLzrqbQg6rys7Jes67KE66as6riwIOuVjOusuOyXkCxcbiAgICAvLyDsi5zqt7jrhJDsl5Drj4Qg7J6g7IucIOuyhO2LuCDsiJgg7J6I64qUIO2ZmOqyvSDsho3sl5DshJwg7Iux7YGs66W8IOyLpO2Wie2VqeuLiOuLpC5cbiAgICBhd2FpdCBydW5XaXRoR3JhY2VmdWxTaHV0ZG93bihcbiAgICAgIGFzeW5jICgpID0+IHtcbiAgICAgICAgLy8g7JaY6rCAIOyLse2BrCDsnpHsl4Ug7IiY7ZaJ7ZWY64qUIOuzuOyytOyeheuLiOuLpC5cbiAgICAgICAgYXdhaXQgdGhpcy5kb1N5bmNBY3Rpb25zKGNoYW5nZWRGaWxlcyk7XG5cbiAgICAgICAgLy8g7Iux7YGsIOyVoeyFmOydtCDrgZ3rgpjrqbQg7ZWt7IOBIOyytO2BrOyErOydhCDri6Tsi5wg6rCx7Iug7ZWp64uI64ukLlxuICAgICAgICBhd2FpdCByZW5ld0NoZWNrc3VtcygpO1xuICAgICAgfSxcbiAgICAgIHsgd2hlblRoaXNIYXBwZW5zOiBcIlNJR1VTUjJcIiwgd2FpdEZvclVwVG86IDIwMDAwIH0sXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDqsJXsoJwg7ZKALeyLse2BrDogbG9ja+ydhCDrrLTsi5ztlZjqs6Ag7LKY7J2M67aA7YSwIOuLpOyLnCDsi7Htgaztlanri4jri6QuXG4gICAqXG4gICAqICoq7IKs7Jqp7LKYKio6IGdpdCBwb3N0LW1lcmdlIGhvb2ssIENJLCBkZXYg7ISc67KE7J2YIGBmYCDtlavtgqQuXG4gICAqICoq7Iuk7YyoIOyViOyghOyEsSoqOiDrj4TspJHsl5Ag7ZSE66Gc7IS47Iqk6rCAIOyjveyWtCBsb2NrIOyXhuuKlCDsg4Htg5zroZwg64Ko7JWE64+EIOustO2VtCDigJQg64uk7J2MIHN5bmPsl5DshJxcbiAgICogbG9jayDsl4bsnLzrqbQg7J6Q7Jew7Iqk65+96rKMIO2SgC3si7HtgazqsIAg7Yq466as6rGw65CY7Ja0IOyDiCBsb2Nr7J20IOyekeyEseuQqC5cbiAgICovXG4gIGFzeW5jIGZvcmNlU3luYygpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBsb2NrUGF0aCA9IHBhdGguam9pbihTb25hbXUuYXBpUm9vdFBhdGgsIFwic29uYW11LmxvY2tcIik7XG4gICAgaWYgKGF3YWl0IGV4aXN0cyhsb2NrUGF0aCkpIHtcbiAgICAgIGF3YWl0IHVubGluayhsb2NrUGF0aCk7XG4gICAgfVxuICAgIGF3YWl0IHRoaXMuc3luYygpO1xuICB9XG5cbiAgLyoqXG4gICAqIFdhdGNoZXLqsIAgYmF0Y2jroZwg66qo7J2AIOuzgOqyvSDtjIzsnbzrk6Tsl5Ag64yA7ZW0IO2VnCDrsojsnZggSE1SL3N5bmMg7IKs7J207YG07J2EIOuPleuLiOuLpC5cbiAgICpcbiAgICogSE1S7J2AIGFwaS9zcmMg7JWI7JeQ7IScIOydvOyWtOuCmOuKlCDrqqjrk6Ag7YyM7J2865Ok7JeQIOuMgO2VtOyEnCDsiJjtlontlanri4jri6QuXG4gICAqIGNoZWNrc3VtUGF0dGVybkdyb3VwIOunpOy5rSDsl6zrtoDsmYAg66y06rSA7ZWY6rKMIGFwaS9zcmMg7KCE7LK0IOuMgOyDgeyeheuLiOuLpC5cbiAgICog6rCA66C5IGFwaS9zcmMvdXRpbHMvc3Vic2V0LWxvYWRlcnMudHMg6rCZ7J2AIO2MjOydvOuPhCDrs4Dqsr3rkJjrqbQgSE1S7J2AIO2VtOykjeuLiOuLpC5cbiAgICpcbiAgICogU3luY+uKlCBjaGVja3N1bVBhdHRlcm5Hcm91cOycvOuhnCDrp6Tsua3rkJjripQg7YyM7J2865Ok7JeQIOuMgO2VtOyEnOunjCDsiJjtlontlanri4jri6QuXG4gICAqIOyXrOq4sOyXkOuKlCB3ZWIvc3Jj64KYIGFwcC9zcmMg6rCZ7J2AIOuLpOuluCB0YXJnZXTsnZgg7YyM7J287J20IO2PrO2VqOuQoCDsiJgg7J6I7Iq164uI64ukLlxuICAgKiDsnbTrn7Agbm9uLWFwaSDqsr3roZzsnZgg7YyM7J2865Ok7J2AIEhNUuqzvOuKlCDslYTrrLQg7IOB6rSA7J20IOyXhuycvOuvgOuhnCwgaW52YWxpZGF0ZeydhCDtlZjsp4Ag7JWK7Iq164uI64ukLlxuICAgKlxuICAgKiBAcGFyYW0gZmlsZUV2ZW50cyAtIHBhdGgg4oaSIGV2ZW50IOuntS4gZXZlbnTripQgXCJjaGFuZ2VcIiB8IFwiYWRkXCIuXG4gICAqL1xuICBhc3luYyBobXJBbmRTeW5jKGZpbGVFdmVudHM6IE1hcDxBYnNvbHV0ZVBhdGgsIFwiY2hhbmdlXCIgfCBcImFkZFwiPik6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGhtckFjdGlvblJlcXVpcmVkRXZlbnRzID0gdGhpcy5leHRyYWN0SG1yQWN0aW9uUmVxdWlyZWRGaWxlRXZlbnRzKGZpbGVFdmVudHMpO1xuICAgIGNvbnN0IHN5bmNUcmlnZ2VyaW5nUGF0aHMgPSBhd2FpdCB0aGlzLmV4dHJhY3RTeW5jVHJpZ2dlcmluZ0ZpbGVFdmVudFBhdGhzKGZpbGVFdmVudHMpO1xuXG4gICAgLy8gSE1SIOyYgeyXrTog7YyM7J28IOydtOuypO2KuCDspJEgYXBp7J2YIOuqqOuTiCDqt7jrnpjtlITsl5Ag7J6I64qUIO2MjOydvOuTpOyXkCDrjIDtlZwg67OA64+Z7J2AIGhtckFjdGlvblJlcXVpcmVkRXZlbnRz66GcIOyeoe2emeuLiOuLpC5cbiAgICAvLyDsnbQg7Lmc6rWs65Ok7J2AIGludmFsaWRhdGUg7LKY66as7ZW07KSN64uI64ukLlxuICAgIC8vIOydtCDtmLjstpzsnYAg7JWE656YIHN5bmPrs7Tri6Qg66y07KGw6rG0IOuovOyggCDsnbzslrTrgpjslbwg7ZWp64uI64ukIVxuICAgIC8vIOyZnOuDkO2VmOuptCBzeW5j7JeQ7ISc64qUIOuzgOqyveuQnCBtb2RlbCDsvZTrk5zrpbwg7IOI66GcIGltcG9ydO2VtOyEnCDsspjrpqztlbTslbwg7ZWY64qUIOqyveyasOuPhCDsnojquLAg65WM66y47J6F64uI64ukLlxuICAgIGF3YWl0IHRoaXMuaW52YWxpZGF0ZURlcGVuZGVudHNBZmZlY3RlZEJ5RmlsZUV2ZW50cyhobXJBY3Rpb25SZXF1aXJlZEV2ZW50cyk7XG5cbiAgICAvLyBTeW5jIOyYgeyXrTogY2hlY2tzdW1QYXR0ZXJuR3JvdXDsl5Ag66qF7Iuc65CcIO2MjOydvOuTpOyXkCDrjIDtlZwg67OA64+Z7J2AIHN5bmNUcmlnZ2VyaW5nUGF0aHProZwg7J6h7Z6Z64uI64ukLlxuICAgIC8vIOydtCDsuZzqtazrk6TsnYAg7KCB7KCI7ZWcIHN5bmMg7J6R7JeF7Jy866GcIOuMgOydke2VqeuLiOuLpC5cbiAgICBpZiAoc3luY1RyaWdnZXJpbmdQYXRocy5sZW5ndGggPiAwKSB7XG4gICAgICBhd2FpdCB0aGlzLmRvU3luY0FjdGlvbnMoc3luY1RyaWdnZXJpbmdQYXRocyk7XG4gICAgfVxuXG4gICAgLy8g7Iux7YGsIOyekeyXheydtCDrgZ3rgqzsnLzrqbQg66y07KeA7ISxIOuhnOuTnOulvCDsiJjtlontlanri4jri6QuXG4gICAgLy8g7Iux7YGs66W8IOyViCDtlZwg6rK97Jqw7JeQ64+EIOuhnOuTnOuKlCDtlbTslbwg7ZW07JqULiDsnITsl5DshJwg6rSA66Co7J6I64qUIOy5nOq1rOuTpOydgCDri6QgaW52YWxpZGF0ZSDrkJjsl4jqsbDrk6DsmpQhXG4gICAgLy9cbiAgICAvLyDrs4Dqsr3rkJwg7YyM7J2865Ok7JeQIOuMgO2VtOyEnCDsg4jroa3qsowg64u56rKo7Jik64qUKGxvYWQpIO2WieychOuKlCBkb1N5bmNBY3Rpb25z7JeQ7IScIO2VmOyngCDslYrsirXri4jri6QuXG4gICAgLy8gZG9TeW5jQWN0aW9uc+yXkOyEnOuKlCDtjIzsnbzsnYQg7J296rOgIOunjOuTnOuKlCDsi7Htgawg7ZaJ7JyE66eMIO2VqeuLiOuLpC5cbiAgICAvLyDqsbDquLDshJwg65SxIOuzgOqyveuQnCDrtoDrtoTsl5Ag7JiB7Zal67Cb64qUIGF1dG9sb2Fk66eMIOyEoOuzhO2VtOyEnCDsiJjtlontlZjroKTrqbQg64SI66y0IOyngOyggOu2hO2VmOqzoCDrs7XsnqHtlbTsp5Hri4jri6QuXG4gICAgLy9cbiAgICAvLyDtjbztj6zrqLzsiqQg7JiB7Zal7J2AIOustOyLnO2VtOuPhCDsoovsirXri4jri6QuXG4gICAgLy8g7Ja07LCo7ZS8IGhtci1ob29r7JeQIOydmO2VtCBpbnZhbGlkYXRl65CcIOu2gOu2hOuTpOydtCDslYTri4jrnbzrqbQg7LqQ7IucIOq3uOuMgOuhnCDsnKDsp4Dtlanri4jri6QuXG4gICAgYXdhaXQgdGhpcy5hdXRvbG9hZFR5cGVzKCk7XG4gICAgYXdhaXQgdGhpcy5hdXRvbG9hZE1vZGVscygpO1xuICAgIGF3YWl0IHRoaXMuYXV0b2xvYWRBcGlzKCk7XG4gICAgYXdhaXQgdGhpcy5hdXRvbG9hZFdvcmtmbG93cygpO1xuICAgIGF3YWl0IHRoaXMuYXV0b2xvYWRTc3JSb3V0ZXMoKTtcblxuICAgIHRoaXMuZXZlbnRFbWl0dGVyLmVtaXQoXCJvbkhNUkNvbXBsZXRlZFwiKTtcbiAgfVxuXG4gIHByaXZhdGUgZXh0cmFjdEhtckFjdGlvblJlcXVpcmVkRmlsZUV2ZW50cyhcbiAgICBmaWxlRXZlbnRzOiBNYXA8QWJzb2x1dGVQYXRoLCBcImNoYW5nZVwiIHwgXCJhZGRcIj4sXG4gICk6IE1hcDxBYnNvbHV0ZVBhdGgsIFwiY2hhbmdlXCIgfCBcImFkZFwiPiB7XG4gICAgY29uc3QgYXBpU3JjID0gcGF0aC5qb2luKFNvbmFtdS5hcGlSb290UGF0aCwgXCJzcmNcIik7XG4gICAgY29uc3QgcmVzdWx0ID0gbmV3IE1hcDxBYnNvbHV0ZVBhdGgsIFwiY2hhbmdlXCIgfCBcImFkZFwiPigpO1xuICAgIGZvciAoY29uc3QgW2ZpbGVQYXRoLCBldmVudF0gb2YgZmlsZUV2ZW50cykge1xuICAgICAgaWYgKCFmaWxlUGF0aC5zdGFydHNXaXRoKGFwaVNyYykpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICByZXN1bHQuc2V0KGZpbGVQYXRoLCBldmVudCk7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGV4dHJhY3RTeW5jVHJpZ2dlcmluZ0ZpbGVFdmVudFBhdGhzKFxuICAgIGZpbGVFdmVudHM6IE1hcDxBYnNvbHV0ZVBhdGgsIFwiY2hhbmdlXCIgfCBcImFkZFwiPixcbiAgKTogUHJvbWlzZTxBYnNvbHV0ZVBhdGhbXT4ge1xuICAgIGNvbnN0IGNoZWNrUGF0dGVybkdyb3VwID0gZ2V0Q2hlY2tzdW1QYXR0ZXJuR3JvdXBJbkFic29sdXRlUGF0aCgpO1xuICAgIGNvbnN0IHN5bmNUcmlnZ2VyaW5nUGF0aHM6IEFic29sdXRlUGF0aFtdID0gW107XG4gICAgZm9yIChjb25zdCBbZGlmZkZpbGVQYXRoXSBvZiBmaWxlRXZlbnRzKSB7XG4gICAgICBjb25zdCBpc0luQ2hlY2tQYXR0ZXJuR3JvdXAgPSBPYmplY3QudmFsdWVzKGNoZWNrUGF0dGVybkdyb3VwKS5zb21lKChwYXR0ZXJuKSA9PlxuICAgICAgICBtaW5pbWF0Y2goZGlmZkZpbGVQYXRoLCBwYXR0ZXJuKSxcbiAgICAgICk7XG4gICAgICBpZiAoIWlzSW5DaGVja1BhdHRlcm5Hcm91cCkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIHN5bmNUcmlnZ2VyaW5nUGF0aHMucHVzaChkaWZmRmlsZVBhdGgpO1xuICAgIH1cblxuICAgIHJldHVybiBzeW5jVHJpZ2dlcmluZ1BhdGhzO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBpbnZhbGlkYXRlRGVwZW5kZW50c0FmZmVjdGVkQnlGaWxlRXZlbnRzKFxuICAgIGZpbGVFdmVudHM6IE1hcDxBYnNvbHV0ZVBhdGgsIFwiY2hhbmdlXCIgfCBcImFkZFwiPixcbiAgKSB7XG4gICAgZm9yIChjb25zdCBbZGlmZkZpbGVQYXRoLCBldmVudF0gb2YgZmlsZUV2ZW50cykge1xuICAgICAgLy8g67OA6rK965CcIO2MjOydvOqzvCBkZXBlbmRlbnQg7YyM7J2865Ok7J2EIGludmFsaWRhdGUg7ZWp64uI64ukLlxuICAgICAgLy8g7ZWcIOuyiCDsnbTsg4EgaW1wb3J065CcIOy5nOq1rOuTpOyXkCDrjIDtlbTshJzrp4wg7Iuk7KCcIOyekeyXheydtCDsnbzslrTrgqnri4jri6QuXG4gICAgICAvLyDqt7jrn6zri4gg7JWI7Ius7ZWY6rOgIGludmFsaWRhdGUg7ZW064+EIOuQqeuLiOuLpC5cbiAgICAgIC8vIO2FjOyKpO2KuCDtmZjqsr3sl5DshJzripQgaG90LmludmFsaWRhdGVGaWxl7IucIOy0iOq4sCDsl5Drn6zqsIAg67Cc7IOd7ZWY6riwIOuVjOusuOyXkCBpbnZhbGlkYXRlIO2VmOyngCDslYrsirXri4jri6QuXG4gICAgICBpZiAoIWlzVGVzdCgpKSB7XG4gICAgICAgIGNvbnN0IGludmFsaWRhdGVkUGF0aHMgPSAoYXdhaXQgaG90LmludmFsaWRhdGVGaWxlKGRpZmZGaWxlUGF0aCwgZXZlbnQpKSBhcyBBYnNvbHV0ZVBhdGhbXTtcblxuICAgICAgICBpZiAoaW52YWxpZGF0ZWRQYXRocy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgY29uc29sZS5sb2coY2hhbGsuYm9sZChg8J+UhCBJbnZhbGlkYXRlZDpgKSk7XG5cbiAgICAgICAgICBmb3IgKGNvbnN0IGludmFsaWRhdGVkUGF0aCBvZiBpbnZhbGlkYXRlZFBhdGhzKSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAvLyDrp4zslb0gbW9kZWwudHMg7YyM7J287J20IOuzgOqyvShpbnZhbGlkYXRlKeuQmOyXiOuLpD8g6re465+s66m0IHJlZ2lzdGVyZWRBcGlzIOykkeyXkOyEnCDsnbQg66qo64247JeQIO2VtOuLue2VmOuKlCBhcGnrk6TsnYAg7KeA7JuM7KSY7JqULlxuICAgICAgICAgICAgICAvLyByZWdpc3RlcmVkQXBpc+uKlCDthrXsnLzroZwg64ukIOuCoOugpOuyhOumtCDsiJgg7JeG7Iq164uI64ukLiByZWdpc3RlcmVkQXBpc+yXkCDsmKzrnbzsmKTripQg7Lmc6rWs65Ok7J2AIOy0iOq4sCDroZzrk5zsi5wg65iQ64qUIEhNUuyLnOyXkOunjCDrk7HroZ3rkJjquLAg65WM66y47J6F64uI64ukLlxuICAgICAgICAgICAgICAvLyDrlLDrnbzshJwgbW9kZWwudHMg7YyM7J287J2YIOuzgOqyveycvOuhnCDri6TsnYzrsogg7IOI66Gc7Jq0IGV2YWzsnbQg7JiI7IOB65CY64qUIOydtCDsi5zsoJDsl5DshJzrp4wsIOydtCDrqqjrjbjsl5DshJwg64KY7JioIHJlZ2lzdGVyZWRBcGlz65Ok7J2EIOyngOybjOykhCDsiJgg7J6I7Iq164uI64ukLlxuICAgICAgICAgICAgICBjb25zdCByZW1vdmVkQXBpcyA9IHRoaXMucmVtb3ZlSW52YWxpZGF0ZWRSZWdpc3RlcmVkQXBpcyhpbnZhbGlkYXRlZFBhdGgpO1xuICAgICAgICAgICAgICBpZiAocmVtb3ZlZEFwaXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICAgICAgICAgICAgY2hhbGsuYmx1ZShgLSAke3BhdGgucmVsYXRpdmUoU29uYW11LmFwaVJvb3RQYXRoLCBpbnZhbGlkYXRlZFBhdGgpfWApLFxuICAgICAgICAgICAgICAgICAgY2hhbGsuZ3JheShgKHdpdGggJHtyZW1vdmVkQXBpcy5sZW5ndGh9IEFQSXMpYCksXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhjaGFsay5ibHVlKGAtICR7cGF0aC5yZWxhdGl2ZShTb25hbXUuYXBpUm9vdFBhdGgsIGludmFsaWRhdGVkUGF0aCl9YCkpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZSk7XG4gICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgICAgICAgICAgY2hhbGsucmVkKGBGYWlsZWQgdG8gcmVtb3ZlIGludmFsaWRhdGVkIHJlZ2lzdGVyZWQgQVBJcyBmb3IgJHtpbnZhbGlkYXRlZFBhdGh9YCksXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIGRldlJ1bm5lciDtmZzshLHtmZQg7IucLCDrs4Dqsr3rkJwg7IaM7IqkIO2MjOydvOydhCBWaXRlc3Qg66qo65OIIOq3uOuemO2UhOyXkOyEnOuPhCDrrLTtmqjtmZTtlanri4jri6QuXG4gICAgICAvLyBWaXRl7J2YIG1vZHVsZUdyYXBoLmludmFsaWRhdGVNb2R1bGUoKeydtCBpbXBvcnRlciDrsKntlqXsnLzroZwg7J6s6reA7KCBIGNhc2NhZGXtlZjrr4DroZwsXG4gICAgICAvLyDshozsiqQg7YyM7J28IO2VmOuCmOunjCDrrLTtmqjtmZTtlZjrqbQg7J2066W8IGltcG9ydO2VmOuKlCDthYzsiqTtirgg7YyM7J2864+EIOyekOuPmeycvOuhnCDrrLTtmqjtmZTrkKnri4jri6QuXG4gICAgICBpZiAoIWlzVGVzdCgpICYmIFNvbmFtdS5jb25maWcudGVzdD8uZGV2UnVubmVyPy5lbmFibGVkICYmIFNvbmFtdS5kZXZWaXRlc3RNYW5hZ2VyKSB7XG4gICAgICAgIFNvbmFtdS5kZXZWaXRlc3RNYW5hZ2VyLmludmFsaWRhdGVGaWxlcyhbZGlmZkZpbGVQYXRoXSk7XG4gICAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICAgIGNoYWxrLmRpbShgVGVzdCBpbnZhbGlkYXRlZDogJHtwYXRoLnJlbGF0aXZlKFNvbmFtdS5hcGlSb290UGF0aCwgZGlmZkZpbGVQYXRoKX1gKSxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZW1vdmVJbnZhbGlkYXRlZFJlZ2lzdGVyZWRBcGlzKFxuICAgIGludmFsaWRhdGVkUGF0aDogQWJzb2x1dGVQYXRoLFxuICApOiAodHlwZW9mIHJlZ2lzdGVyZWRBcGlzKVtudW1iZXJdW10ge1xuICAgIC8vIOyGjOyKpCDsvZTrk5zrpbwg64uk66Oo64qUIOyDge2ZqeydtOuLiCAudHMg6rK966Gc66GcIOu0heuLiOuLpC5cbiAgICBjb25zdCBpc01vZGVsID0gaW52YWxpZGF0ZWRQYXRoLmVuZHNXaXRoKFwiLm1vZGVsLnRzXCIpO1xuICAgIGNvbnN0IGlzRnJhbWUgPSBpbnZhbGlkYXRlZFBhdGguZW5kc1dpdGgoXCIuZnJhbWUudHNcIik7XG4gICAgaWYgKCFpc01vZGVsICYmICFpc0ZyYW1lKSB7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuXG4gICAgY29uc3QgZW50aXR5SWQgPSBFbnRpdHlNYW5hZ2VyLmdldEVudGl0eUlkRnJvbVBhdGgoaW52YWxpZGF0ZWRQYXRoKTtcbiAgICBjb25zdCB0YXJnZXRNb2RlbE5hbWUgPSBgJHtlbnRpdHlJZH0ke2lzTW9kZWwgPyBcIk1vZGVsXCIgOiBcIkZyYW1lXCJ9YDtcbiAgICBjb25zdCB0b1JlbW92ZSA9IHJlZ2lzdGVyZWRBcGlzLmZpbHRlcigoYXBpKSA9PiBhcGkubW9kZWxOYW1lID09PSB0YXJnZXRNb2RlbE5hbWUpO1xuICAgIGZvciAoY29uc3QgYXBpIG9mIHRvUmVtb3ZlKSB7XG4gICAgICBjb25zdCBpZHggPSByZWdpc3RlcmVkQXBpcy5pbmRleE9mKGFwaSk7XG4gICAgICBpZiAoaWR4ICE9PSAtMSkge1xuICAgICAgICByZWdpc3RlcmVkQXBpcy5zcGxpY2UoaWR4LCAxKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdG9SZW1vdmU7XG4gIH1cblxuICBhc3luYyBhdXRvbG9hZFR5cGVzKCkge1xuICAgIHRoaXMudHlwZXMgPSBhd2FpdCBsb2FkVHlwZXMoKTtcbiAgfVxuXG4gIGFzeW5jIGF1dG9sb2FkTW9kZWxzKCkge1xuICAgIHRoaXMubW9kZWxzID0gYXdhaXQgbG9hZE1vZGVscygpO1xuICB9XG5cbiAgYXN5bmMgYXV0b2xvYWRBcGlzKCkge1xuICAgIHRoaXMuYXBpcyA9IGF3YWl0IGxvYWRBcGlzKCk7XG4gIH1cblxuICBhc3luYyBhdXRvbG9hZFdvcmtmbG93cygpIHtcbiAgICB0aGlzLndvcmtmbG93cyA9IGF3YWl0IGxvYWRXb3JrZmxvd3MoKTtcbiAgICBhd2FpdCBTb25hbXUud29ya2Zsb3dzLnN5bmNocm9uaXplKHRoaXMud29ya2Zsb3dzKTtcbiAgfVxuXG4gIGFzeW5jIGF1dG9sb2FkU3NyUm91dGVzKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHNzckNvbmZpZ1BhdGggPSBwYXRoLmpvaW4oU29uYW11LmFwaVJvb3RQYXRoLCBcInNyYy9zc3JcIik7XG5cbiAgICAvLyDquLDsobQgcm91dGVzIOy0iOq4sO2ZlFxuICAgIGNvbnN0IHsgY2xlYXJTU1JSb3V0ZXMgfSA9IGF3YWl0IGltcG9ydChcIi4uL3NzclwiKTtcbiAgICBjbGVhclNTUlJvdXRlcygpO1xuXG4gICAgLy8gc3NyIO2PtOuNlCDsl4bsnLzrqbQg7Iqk7YK1XG4gICAgaWYgKCEoYXdhaXQgZXhpc3RzKHNzckNvbmZpZ1BhdGgpKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIHNzciDtj7TrjZQg7JWI7J2YIOuqqOuToCAudHMg7YyM7J28IOuhnOuTnFxuICAgIGNvbnN0IHsgZ2xvYkFzeW5jIH0gPSBhd2FpdCBpbXBvcnQoXCIuLi91dGlscy9hc3luYy11dGlsc1wiKTtcbiAgICBjb25zdCB7IGltcG9ydE1lbWJlcnMgfSA9IGF3YWl0IGltcG9ydChcIi4uL3V0aWxzL2VzbS11dGlsc1wiKTtcbiAgICBjb25zdCB7IHJ1bnRpbWVQYXRoIH0gPSBhd2FpdCBpbXBvcnQoXCIuLi91dGlscy9wYXRoLXV0aWxzXCIpO1xuXG4gICAgLy8gcnVudGltZVBhdGjrpbwg7IKs7Jqp7ZWY7JesIOqwnOuwnC/tlITroZzrjZXshZgg7ZmY6rK97JeQIOunnuuKlCDtmZXsnqXsnpAg7LKY66asXG4gICAgY29uc3QgZmlsZXMgPSBhd2FpdCBnbG9iQXN5bmMocGF0aC5qb2luKHNzckNvbmZpZ1BhdGgsIHJ1bnRpbWVQYXRoKFwiKiovKi50c1wiKSkpO1xuXG4gICAgZm9yIChjb25zdCBmaWxlIG9mIGZpbGVzKSB7XG4gICAgICB0cnkge1xuICAgICAgICAvLyBpbXBvcnRNZW1iZXJz66W8IOyCrOyaqe2VmOuptCDtjIzsnbzsnZggc2lkZSBlZmZlY3QocmVnaXN0ZXJTU1Ig7Zi47LacKeqwgCDsi6TtlonrkKhcbiAgICAgICAgYXdhaXQgaW1wb3J0TWVtYmVycyhmaWxlKTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihgRmFpbGVkIHRvIGxvYWQgU1NSIHJvdXRlOiAke2ZpbGV9YCwgZSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIOyLpOygnCDsi7Htgazrpbwg7IiY7ZaJ7ZWY64qUIOuzuOyytOyeheuLiOuLpC5cbiAgICog67OA6rK965CcIO2MjOydvOuTpOydhCDtg4DsnoXrs4TroZwg67aE66WY7ZWY6rOgIOqwgSDtg4DsnoXsl5Ag66ee64qUIOyVoeyFmOydhCDsi6Ttlontlanri4jri6QuXG4gICAqXG4gICAqIEBwYXJhbSBkaWZmRmlsZVBhdGhzIC0g67OA6rK965CcIO2MjOydvOuTpOydmCDsoIjrjIAg6rK966GcIOuqqeuhnVxuICAgKiBAcmV0dXJucyBkaWZmVHlwZXMgLSDrs4Dqsr3rkJwg7YyM7J287J2YIO2DgOyehSDrqqnroZ0gKGVudGl0eSwgdHlwZXMsIG1vZGVsIOuTsSlcbiAgICovXG4gIGFzeW5jIGRvU3luY0FjdGlvbnMoZGlmZkZpbGVQYXRoczogQWJzb2x1dGVQYXRoW10pOiBQcm9taXNlPHsgZGlmZlR5cGVzOiBGaWxlVHlwZVtdIH0+IHtcbiAgICBjb25zdCBkaWZmR3JvdXBzID0gdGhpcy5jYWxjdWxhdGVEaWZmR3JvdXBzKGRpZmZGaWxlUGF0aHMpO1xuICAgIGNvbnN0IGRpZmZUeXBlcyA9IE9iamVjdC5rZXlzKGRpZmZHcm91cHMpIGFzIEZpbGVUeXBlW107XG5cbiAgICAvLyDsl6zquLDripQg67OE66GcIOykkeyalO2VnCDtjIztirjripQg7JWE64uZ64uI64ukLlxuICAgIC8vIOyVhOuemOydmCBpZiDsoITqsJzrpbwg6rmU64GU7ZWY6rKMIO2VmOugpOqzoCDrp4zrk6AgRFNMIOqwmeydgCDqsbDrnbzshJwsIOustOyLnO2VmOyFlOuPhCDrkKnri4jri6QuXG4gICAgY29uc3QgeyBjaGFuZ2VNYXRjaGVzLCBub3RoaW5nTWF0Y2hlcywgdW5oYW5kbGVkUGF0aHMgfSA9IHRoaXMuY2hhbmdlTWF0Y2hlcihcbiAgICAgIGRpZmZUeXBlcyxcbiAgICAgIGRpZmZHcm91cHMsXG4gICAgKTtcblxuICAgIGlmIChjaGFuZ2VNYXRjaGVzKFwiZW50aXR5XCIsIFwidHlwZXNcIikpIHtcbiAgICAgIGF3YWl0IHRoaXMuaGFuZGxlVHJ1dGhTb3VyY2VDaGFuZ2VzKGRpZmZHcm91cHMpO1xuICAgIH1cblxuICAgIGlmIChjaGFuZ2VNYXRjaGVzKFwibW9kZWxcIiwgXCJmcmFtZVwiKSkge1xuICAgICAgYXdhaXQgdGhpcy5oYW5kbGVJbXBsZW1lbnRhdGlvbkNoYW5nZXMoZGlmZkdyb3Vwcyk7XG4gICAgfVxuXG4gICAgaWYgKGNoYW5nZU1hdGNoZXMoXCJ0eXBlc1wiLCBcImZ1bmN0aW9uc1wiKSkge1xuICAgICAgYXdhaXQgdGhpcy5oYW5kbGVBdXhpbGlhcnlTeW1ib2xDaGFuZ2VzKGRpZmZHcm91cHMpO1xuICAgIH1cblxuICAgIGlmIChjaGFuZ2VNYXRjaGVzKFwiY29uZmlnXCIpKSB7XG4gICAgICBhd2FpdCB0aGlzLmhhbmRsZUNvbmZpZ0NoYW5nZXMoZGlmZkdyb3Vwcyk7XG4gICAgfVxuXG4gICAgaWYgKGNoYW5nZU1hdGNoZXMoXCJpMThuXCIsIFwiZW50aXR5XCIgLyrroIjsnbTruJQqLywgXCJjb25maWdcIiAvKmRlZmF1bHRMb2NhbGXrk7EqLykpIHtcbiAgICAgIGF3YWl0IHRoaXMuaGFuZGxlU29uYW11RGljdGlvbmFyeVJlbGF0ZWRDaGFuZ2VzKGRpZmZHcm91cHMpO1xuICAgIH1cblxuICAgIGlmIChub3RoaW5nTWF0Y2hlcygpKSB7XG4gICAgICAvLyDtjIzsnbwg67OA6rK97J2AIOqwkOyngOuQmOyXiOycvOuCmCDsoIAg7JyEIOyWtOuKkCBjaGFuZ2VNYXRjaGVz7JeQ64+EIOqxuOumrOyngCDslYrsnYAg7YyM7J2865Ok7J20IGRyaWZ0c+yeheuLiOuLpC5cbiAgICAgIC8vIHN5bmNlcuuKlCDshozsiqTsnZgg67OA6rK97JeQ64qUIOuwmOydke2VmOyngOunjCDsgrDstpzrrLzsnZgg67OA6rK9KGRyaWZ0KeyXkOuKlCDsp4HsoJHsoIHsnLzroZwg67CY7J2R7ZWY7KeAIOyViuyKteuLiOuLpC5cbiAgICAgIC8vIOuMgOyLoCDsnbQgZHJpZnTsl5Ag64yA7ZW0IOqyveqzoCDsoJXrj4Trp4wg7Lac66Cl7ZW07KSN64uI64ukLlxuICAgICAgYXdhaXQgdGhpcy5oYW5kbGVEcmlmdHModW5oYW5kbGVkUGF0aHMoKSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIGRpZmZUeXBlcyxcbiAgICB9O1xuICB9XG5cbiAgY2FsY3VsYXRlRGlmZkdyb3VwcyhkaWZmRmlsZXM6IEFic29sdXRlUGF0aFtdKTogRGlmZkdyb3VwcyB7XG4gICAgY29uc3QgcGF0dGVybkdyb3VwID0gZ2V0Q2hlY2tzdW1QYXR0ZXJuR3JvdXAoKTtcbiAgICBjb25zdCBmaWxlVHlwZXMgPSBPYmplY3Qua2V5cyhwYXR0ZXJuR3JvdXApIGFzIEZpbGVUeXBlW107XG5cbiAgICByZXR1cm4gZ3JvdXAoZGlmZkZpbGVzLCAoZmlsZVBhdGgpID0+IHtcbiAgICAgIC8vIOygiOuMgCDqsr3roZwg4oaSIGFwcFJvb3Qg6riw7KSAIOyDgeuMgCDqsr3roZwgKOyYiDogXCJhcGkvc3JjLy4uLlwiLCBcIndlYi9zcmMvLi4uXCIpXG4gICAgICBjb25zdCByZWxhdGl2ZVBhdGggPSBwYXRoLnJlbGF0aXZlKFNvbmFtdS5hcHBSb290UGF0aCwgZmlsZVBhdGgpO1xuICAgICAgaWYgKHJlbGF0aXZlUGF0aC5zdGFydHNXaXRoKFwiLi5cIikpIHJldHVybiBcInVua25vd25cIjtcblxuICAgICAgZm9yIChjb25zdCBmaWxlVHlwZSBvZiBmaWxlVHlwZXMpIHtcbiAgICAgICAgaWYgKG1pbmltYXRjaChyZWxhdGl2ZVBhdGgsIHBhdHRlcm5Hcm91cFtmaWxlVHlwZV0pKSB7XG4gICAgICAgICAgcmV0dXJuIGZpbGVUeXBlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gXCJ1bmtub3duXCI7XG4gICAgfSkgYXMgdW5rbm93biBhcyBEaWZmR3JvdXBzO1xuICB9XG5cbiAgcHJpdmF0ZSBjaGFuZ2VNYXRjaGVyKGRpZmZUeXBlczogRmlsZVR5cGVbXSwgZGlmZkdyb3VwczogRGlmZkdyb3Vwcykge1xuICAgIGNvbnN0IGhhbmRsZWQgPSBuZXcgU2V0PEZpbGVUeXBlPigpO1xuXG4gICAgLyoqXG4gICAgICog67OA6rK9IOyCrO2VreydtCDsnbjsnpDroZwg67Cb7J2AIEZpbGVUeXBl65OkIOykkSDtlZjrgpgg7J207IOB7J2EIO2PrO2VqO2VmOuKlOyngCDtmZXsnbjtlanri4jri6QuXG4gICAgICog6rCA66C5IFtcImVudGl0eVwiXeqwgCDrs4Dqsr3rkJwg7Zi47Lac7JeQ7IScIGNoYW5nZU1hdGNoZXMoXCJlbnRpdHlcIinripQgdHJ5ZeulvCDrsJjtmZjtlZjrqbAsXG4gICAgICogW1widHlwZXNcIiwgXCJpMThuXCJd7J20IOuzgOqyveuQnCDtmLjstpzsl5DshJwgY2hhbmdlTWF0Y2hlcyhcInR5cGVzXCIsIFwiZnVuY3Rpb25zXCIp64+EIHRydWXrpbwg67CY7ZmY7ZWY7KeA66eMLFxuICAgICAqIFtcImZ1bmN0aW9uc1wiXeqwgCDrs4Dqsr3rkJwg7Zi47Lac7JeQ7IScIGNoYW5nZU1hdGNoZXMoXCJmcmFtZVwiKeydgCBmYWxzZeulvCDrsJjtmZjtlanri4jri6QuXG4gICAgICogQHBhcmFtIHR5cGVzXG4gICAgICovXG4gICAgY29uc3QgY2hhbmdlTWF0Y2hlcyA9ICguLi50eXBlczogRmlsZVR5cGVbXSkgPT4ge1xuICAgICAgY29uc3QgbWF0Y2hpbmcgPSB0eXBlcy5maWx0ZXIoKHQpID0+IGRpZmZUeXBlcy5pbmNsdWRlcyh0KSk7XG4gICAgICBtYXRjaGluZy5mb3JFYWNoKCh0KSA9PiBoYW5kbGVkLmFkZCh0KSk7XG4gICAgICByZXR1cm4gbWF0Y2hpbmcubGVuZ3RoID4gMDtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogY2hhbmdlTWF0Y2hlc+uhnCDrp6Tsua3rkJwg6rKD7J20IO2VmOuCmOuPhCDsl4bripTsp4Ag7Jes67aA66W8IOqwgOyguOyYteuLiOuLpC5cbiAgICAgKi9cbiAgICBjb25zdCBub3RoaW5nTWF0Y2hlcyA9ICgpID0+IGhhbmRsZWQuc2l6ZSA9PT0gMDtcblxuICAgIC8qKlxuICAgICAqIOyWtOuWpCBjaGFuZ2VNYXRjaGVzIO2YuOy2nOyXkOuPhCDqsbjrpqzsp4Ag7JWK7J2AIEZpbGVUeXBl65Ok7J2YIOyLpOygnCDtjIzsnbwg6rK966Gc66W8IOuqqOyVhOyEnCDrsJjtmZjtlanri4jri6QuXG4gICAgICovXG4gICAgY29uc3QgdW5oYW5kbGVkUGF0aHMgPSAoKTogQWJzb2x1dGVQYXRoW10gPT5cbiAgICAgIGRpZmZUeXBlcy5maWx0ZXIoKHQpID0+ICFoYW5kbGVkLmhhcyh0KSkuZmxhdE1hcCgodCkgPT4gZGlmZkdyb3Vwc1t0XSA/PyBbXSk7XG5cbiAgICByZXR1cm4geyBjaGFuZ2VNYXRjaGVzLCBub3RoaW5nTWF0Y2hlcywgdW5oYW5kbGVkUGF0aHMgfTtcbiAgfVxuXG4gIGFzeW5jIGhhbmRsZVRydXRoU291cmNlQ2hhbmdlcyhkaWZmR3JvdXBzOiBEaWZmR3JvdXBzKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgTmFpdGUudChcImhhbmRsZVRydXRoU291cmNlQ2hhbmdlc1wiLCB7IGRpZmZHcm91cHMgfSk7XG5cbiAgICBhd2FpdCBFbnRpdHlNYW5hZ2VyLnJlbG9hZCgpO1xuXG4gICAgLy8gdHlwZXMg7IOd7ISxKGVudGl0eSDsg4jroZwg7LaU6rCA65CcIOqyveyasClcbiAgICAvLyBwYXJlbnRJZOqwgCDsl4bqs6AsIHR5cGVz6rCAIOyXhuuKlCDqsr3smrDsl5Drp4wg7IOd7ISxXG4gICAgY29uc3QgZW50aXR5UGF0aCA9IGRpZmZHcm91cHMuZW50aXR5Py5hdCgwKTtcbiAgICBpZiAoZW50aXR5UGF0aCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb25zdCBlbnRpdHlJZCA9IEVudGl0eU1hbmFnZXIuZ2V0RW50aXR5SWRGcm9tUGF0aChlbnRpdHlQYXRoKTtcbiAgICAgIGNvbnN0IGVudGl0eSA9IEVudGl0eU1hbmFnZXIuZ2V0KGVudGl0eUlkKTtcblxuICAgICAgLy8g7ZSE66Gc7KCd7Yq47JeQIOyDneyEseuQmOyWtOyVvCDtlZjripQgLnRzIO2MjOydvOydmCDqsr3roZzsnoXri4jri6QuXG4gICAgICBjb25zdCB0eXBlRmlsZVBhdGggPSBwYXRoLmpvaW4oXG4gICAgICAgIFNvbmFtdS5hcGlSb290UGF0aCxcbiAgICAgICAgYHNyYy9hcHBsaWNhdGlvbi8ke2VudGl0eS5uYW1lcy5mc30vJHtlbnRpdHkubmFtZXMuZnN9LnR5cGVzLnRzYCxcbiAgICAgICkgYXMgQWJzb2x1dGVQYXRoO1xuXG4gICAgICBpZiAoZW50aXR5LnBhcmVudElkID09PSB1bmRlZmluZWQgJiYgIShhd2FpdCBleGlzdHModHlwZUZpbGVQYXRoKSkpIHtcbiAgICAgICAgLy8gKi50eXBlcy50c+qwgCDrp4zrk6TslrTsp5Hri4jri6QuXG4gICAgICAgIGNvbnN0IHR5cGVzID0gYXdhaXQgU3luY2VyQWN0aW9ucy5hY3Rpb25HZW5lcmF0ZUluaXRpYWxUeXBlcyhlbnRpdHlJZCk7XG5cbiAgICAgICAgLy8g6re46rG4IO2DgOqyn+yXkCDqsJbri6TrkazsmpQuXG4gICAgICAgIGF3YWl0IFN5bmNlckFjdGlvbnMuYWN0aW9uU3luY0ZpbGVzVG9UYXJnZXRzKHR5cGVzKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBzb25hbXUuZ2VuZXJhdGVkLnRz7JmAIHNvbmFtdS5nZW5lcmF0ZWQuc3NvLnRz6rCAIOunjOuTpOyWtOynkeuLiOuLpC5cbiAgICBjb25zdCBnZW5lcmF0ZWQgPSBhd2FpdCBTeW5jZXJBY3Rpb25zLmFjdGlvbkdlbmVyYXRlU2NoZW1hcygpO1xuXG4gICAgLy8g66qo65OgIOqyg+uTpOydhCB0YXJnZXTsl5Ag67O064K07KeA64qUIOyViuyKteuLiOuLpC5cbiAgICAvLyBzb25hbXUuZ2VuZXJhdGVkLnNzby50c+uKlCBzZXJ2aWNlLXNpZGUtb25seeuLiOq5jCDrsLDsoJztlanri4jri6QuXG4gICAgLy8gVE9ETyjrs5HspIApOiDsnbQg7ZWY65Oc7L2U65Oc66W8IOuIhOqwgCDtlbTqsrAg7KKAIO2VtOyjvOyEuOyalC4g7J2864uo7J2AIOqwkOuLuSDqsIDriqXtlZjri4gg64aU65GQ6rKg7Iq164uI64ukLi4uXG4gICAgY29uc3QgZGlzdHJpYnV0YWJsZSA9IGdlbmVyYXRlZC5maWx0ZXIoKHApID0+ICFwLmVuZHNXaXRoKFwiLnNzby50c1wiKSk7XG5cbiAgICAvLyDsnbTsoJwg67O064K8IOqyg+uTpOunjCB0YXJnZXTsl5Ag67O064K07JqULlxuICAgIGF3YWl0IFN5bmNlckFjdGlvbnMuYWN0aW9uU3luY0ZpbGVzVG9UYXJnZXRzKGRpc3RyaWJ1dGFibGUpO1xuICB9XG5cbiAgYXN5bmMgaGFuZGxlSW1wbGVtZW50YXRpb25DaGFuZ2VzKGRpZmZHcm91cHM6IERpZmZHcm91cHMpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBOYWl0ZS50KFwiaGFuZGxlSW1wbGVtZW50YXRpb25DaGFuZ2VzXCIsIHsgZGlmZkdyb3VwcyB9KTtcbiAgICBjb25zdCBtZXJnZWRHcm91cCA9IFsuLi4oZGlmZkdyb3Vwcy5tb2RlbCA/PyBbXSksIC4uLihkaWZmR3JvdXBzLmZyYW1lID8/IFtdKV07XG5cbiAgICAvLyBnZW5lcmF0ZWRfaHR0cC50ZW1wbGF0ZS50c+yXkOyEnCBzeW5jZXIudHlwZXPrpbwg7JSB64uI64ukLlxuICAgIC8vIHNlcnZpY2UudGVtcGxhdGUudHPsl5DshJwgc3luY2VyLmFwaXPrpbwg7JSB64uI64ukLlxuICAgIGF3YWl0IHRoaXMuYXV0b2xvYWRNb2RlbHMoKTtcbiAgICBhd2FpdCB0aGlzLmF1dG9sb2FkVHlwZXMoKTtcbiAgICBhd2FpdCB0aGlzLmF1dG9sb2FkQXBpcygpO1xuXG4gICAgY29uc3QgcGFyYW1zOiB7XG4gICAgICBuYW1lc1JlY29yZDogRW50aXR5TmFtZXNSZWNvcmQ7XG4gICAgfVtdID0gbWVyZ2VkR3JvdXAubWFwKChtb2RlbFBhdGgpID0+IHtcbiAgICAgIGlmIChtb2RlbFBhdGguZW5kc1dpdGgoXCIubW9kZWwudHNcIikgfHwgbW9kZWxQYXRoLmVuZHNXaXRoKFwiLmZyYW1lLnRzXCIpKSB7XG4gICAgICAgIGNvbnN0IGVudGl0eUlkID0gRW50aXR5TWFuYWdlci5nZXRFbnRpdHlJZEZyb21QYXRoKG1vZGVsUGF0aCk7XG4gICAgICAgIGFzc2VydChlbnRpdHlJZCk7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgbmFtZXNSZWNvcmQ6IEVudGl0eU1hbmFnZXIuZ2V0TmFtZXNGcm9tSWQoZW50aXR5SWQpLFxuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgdGhyb3cgbmV3IEVycm9yKFwibm90IHJlYWNoYWJsZVwiKTtcbiAgICB9KTtcblxuICAgIGF3YWl0IFN5bmNlckFjdGlvbnMuYWN0aW9uR2VuZXJhdGVTZXJ2aWNlcyhwYXJhbXMpO1xuICAgIGF3YWl0IFN5bmNlckFjdGlvbnMuYWN0aW9uR2VuZXJhdGVIdHRwcygpO1xuICAgIGF3YWl0IFN5bmNlckFjdGlvbnMuYWN0aW9uR2VuZXJhdGVTc3JRdWVyaWVzKCk7XG4gIH1cblxuICBhc3luYyBoYW5kbGVBdXhpbGlhcnlTeW1ib2xDaGFuZ2VzKGRpZmZHcm91cHM6IERpZmZHcm91cHMpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBOYWl0ZS50KFwiaGFuZGxlQXV4aWxpYXJ5U3ltYm9sQ2hhbmdlc1wiLCB7IGRpZmZHcm91cHMgfSk7XG4gICAgY29uc3QgdHNQYXRocyA9IHVuaXF1ZShbLi4uKGRpZmZHcm91cHMudHlwZXMgPz8gW10pLCAuLi4oZGlmZkdyb3Vwcy5mdW5jdGlvbnMgPz8gW10pXSk7XG4gICAgYXdhaXQgU3luY2VyQWN0aW9ucy5hY3Rpb25TeW5jRmlsZXNUb1RhcmdldHModHNQYXRocyk7XG4gIH1cblxuICBhc3luYyBoYW5kbGVDb25maWdDaGFuZ2VzKF86IERpZmZHcm91cHMpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhd2FpdCBTeW5jZXJBY3Rpb25zLmFjdGlvblN5bmNDb25maWcoKTtcbiAgfVxuXG4gIGFzeW5jIGhhbmRsZVNvbmFtdURpY3Rpb25hcnlSZWxhdGVkQ2hhbmdlcyhfOiBEaWZmR3JvdXBzKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgU3luY2VyQWN0aW9ucy5hY3Rpb25TeW5jU29uYW11RGljdGlvbmFyeSgpO1xuICB9XG5cbiAgYXN5bmMgaGFuZGxlRHJpZnRzKGRyaWZ0czogQWJzb2x1dGVQYXRoW10pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAoZHJpZnRzLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgY2hhbGsueWVsbG93KFxuICAgICAgICAgIFwi4pqg77iPIFNvbmFtdeqwgCDsnpDrj5kg7IOd7ISx7ZWcIO2MjOydvOyXkCDrjIDtlZwg67OA6rK97J20IOqwkOyngOuQmOyXiOyKteuLiOuLpC4g7YyM7J287J20IFNvbmFtdSB3YXRjaGVyIOyZuOu2gOyXkOyEnCDrs4Dqsr3rkJwg6rKD7Jy866GcIOy2lOygleuQqeuLiOuLpC5cIixcbiAgICAgICAgKSxcbiAgICAgICk7XG4gICAgICBmb3IgKGNvbnN0IHAgb2YgZHJpZnRzKSB7XG4gICAgICAgIGNvbnNvbGUud2FybihjaGFsay55ZWxsb3coYCAgLSAke3BhdGgucmVsYXRpdmUoU29uYW11LmFwcFJvb3RQYXRoLCBwKX1gKSk7XG4gICAgICB9XG4gICAgICBjb25zb2xlLndhcm4oY2hhbGsuZGltKFwiICDihpIgYHBucG0gc29uYW11IHN5bmMgLS1mb3JjZWDrpbwg6raM7J6l7ZWp64uI64ukLlwiKSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIOyjvOyWtOynhCDsl5Tti7Dti7DsmYAg7YWc7ZSM66a/IO2CpOyXkCDrjIDtlbQsIOyDneyEseuQnCDsvZTrk5zqsIAg7KG07J6s7ZWY64qU7KeAIO2ZleyduO2VqeuLiOuLpC5cbiAgICogQHBhcmFtIGVudGl0eUlkIOyXlO2LsO2LsCBJRFxuICAgKiBAcGFyYW0gdGVtcGxhdGVLZXkg7YWc7ZSM66a/IO2CpFxuICAgKiBAcGFyYW0gZW51bUlkIOyXtOqxsO2YlSBJRFxuICAgKiBAcmV0dXJucyDsg53shLHrkJwg7L2U65Oc6rCAIOyhtOyerO2VmOuKlOyngCDsl6zrtoBcbiAgICovXG4gIGFzeW5jIGNoZWNrRXhpc3RzR2VuQ29kZShcbiAgICBlbnRpdHlJZDogc3RyaW5nLFxuICAgIHRlbXBsYXRlS2V5OiBUZW1wbGF0ZUtleSxcbiAgICBlbnVtSWQ/OiBzdHJpbmcsXG4gICk6IFByb21pc2U8eyBzdWJQYXRoOiBzdHJpbmc7IGZ1bGxQYXRoOiBzdHJpbmc7IGlzRXhpc3RzOiBib29sZWFuIH0+IHtcbiAgICBjb25zdCB7IHRhcmdldCwgcGF0aDogZ2VuUGF0aCB9ID0gVGVtcGxhdGVNYW5hZ2VyLmdldCh0ZW1wbGF0ZUtleSkuZ2V0VGFyZ2V0QW5kUGF0aChcbiAgICAgIEVudGl0eU1hbmFnZXIuZ2V0TmFtZXNGcm9tSWQoZW50aXR5SWQpLFxuICAgICAgZW51bUlkLFxuICAgICk7XG5cbiAgICBjb25zdCBzdWJQYXRoID0gcGF0aC5qb2luKHRhcmdldCwgZ2VuUGF0aCk7XG4gICAgY29uc3QgZnVsbFBhdGggPSBwYXRoLmpvaW4oU29uYW11LmFwcFJvb3RQYXRoLCBzdWJQYXRoKTtcbiAgICByZXR1cm4ge1xuICAgICAgc3ViUGF0aCxcbiAgICAgIGZ1bGxQYXRoLFxuICAgICAgaXNFeGlzdHM6IGF3YWl0IGV4aXN0cyhmdWxsUGF0aCksXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiDso7zslrTsp4Qg7JeU7Yuw7Yuw7JmAIOyXtOqxsO2YleyXkCDrjIDtlbQsIOyDneyEseuQnCDsvZTrk5zqsIAg7KG07J6s7ZWY64qU7KeAIO2ZleyduO2VqeuLiOuLpC5cbiAgICogQHBhcmFtIGVudGl0eUlkIOyXlO2LsO2LsCBJRFxuICAgKiBAcGFyYW0gZW51bXMg7Je06rGw7ZiVIOugiOydtOu4lFxuICAgKiBAcmV0dXJucyDsg53shLHrkJwg7L2U65Oc6rCAIOyhtOyerO2VmOuKlOyngCDsl6zrtoBcbiAgICovXG4gIGFzeW5jIGNoZWNrRXhpc3RzKFxuICAgIGVudGl0eUlkOiBzdHJpbmcsXG4gICAgZW51bXM6IHtcbiAgICAgIFtuYW1lOiBzdHJpbmddOiB6LlpvZEVudW07XG4gICAgfSxcbiAgKTogUHJvbWlzZTxSZWNvcmQ8YCR7VGVtcGxhdGVLZXl9JHtzdHJpbmd9YCwgYm9vbGVhbj4+IHtcbiAgICBjb25zdCBrZXlzOiBUZW1wbGF0ZUtleVtdID0gVGVtcGxhdGVLZXkub3B0aW9ucztcbiAgICBjb25zdCBuYW1lcyA9IEVudGl0eU1hbmFnZXIuZ2V0TmFtZXNGcm9tSWQoZW50aXR5SWQpO1xuICAgIGNvbnN0IGVudW1zS2V5cyA9IE9iamVjdC5rZXlzKGVudW1zKS5maWx0ZXIoKG5hbWUpID0+IG5hbWUgIT09IG5hbWVzLmNvbnN0YW50KTtcblxuICAgIHJldHVybiBhd2FpdCByZWR1Y2VBc3luYyhcbiAgICAgIGtleXMsXG4gICAgICBhc3luYyAocmVzdWx0LCBrZXkpID0+IHtcbiAgICAgICAgY29uc3QgdHBsID0gVGVtcGxhdGVNYW5hZ2VyLmdldChrZXkpO1xuICAgICAgICBpZiAoa2V5LnN0YXJ0c1dpdGgoXCJ2aWV3X2VudW1zXCIpKSB7XG4gICAgICAgICAgYXdhaXQgbWFwQXN5bmMoZW51bXNLZXlzLCBhc3luYyAoY29tcG9uZW50SWQpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHsgdGFyZ2V0LCBwYXRoOiBwIH0gPSB0cGwuZ2V0VGFyZ2V0QW5kUGF0aChuYW1lcywgY29tcG9uZW50SWQpO1xuICAgICAgICAgICAgcmVzdWx0W2Ake2tleX1fXyR7Y29tcG9uZW50SWR9YF0gPSBhd2FpdCBleGlzdHMoXG4gICAgICAgICAgICAgIHBhdGguam9pbihTb25hbXUuYXBwUm9vdFBhdGgsIHRhcmdldCwgcCksXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH0pO1xuICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB7IHRhcmdldCwgcGF0aDogcCB9ID0gdHBsLmdldFRhcmdldEFuZFBhdGgobmFtZXMpO1xuICAgICAgICBjb25zdCB7IHRhcmdldHMgfSA9IFNvbmFtdS5jb25maWcuc3luYztcbiAgICAgICAgaWYgKHRhcmdldC5pbmNsdWRlcyhcIjp0YXJnZXRcIikpIHtcbiAgICAgICAgICBhd2FpdCBtYXBBc3luYyh0YXJnZXRzLCBhc3luYyAodCkgPT4ge1xuICAgICAgICAgICAgcmVzdWx0W2Ake2tleX1fXyR7dH1gXSA9IGF3YWl0IGV4aXN0cyhcbiAgICAgICAgICAgICAgcGF0aC5qb2luKFNvbmFtdS5hcHBSb290UGF0aCwgdGFyZ2V0LnJlcGxhY2UoXCI6dGFyZ2V0XCIsIHQpLCBwKSxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmVzdWx0W2tleV0gPSBhd2FpdCBleGlzdHMocGF0aC5qb2luKFNvbmFtdS5hcHBSb290UGF0aCwgdGFyZ2V0LCBwKSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgfSxcbiAgICAgIHt9IGFzIFJlY29yZDxgJHtUZW1wbGF0ZUtleX0ke3N0cmluZ31gLCBib29sZWFuPixcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIO2VmOychO2YuO2ZmOyaqSDtlITroZ3si5wg66mU7IaM65Oc7J6F64uI64ukLlxuICAgKi9cbiAgYXN5bmMgY3JlYXRlRW50aXR5KGZvcm06IFRlbXBsYXRlT3B0aW9uc1tcImVudGl0eVwiXSkge1xuICAgIHJldHVybiBhd2FpdCBjcmVhdGVFbnRpdHkoZm9ybSk7XG4gIH1cblxuICAvKipcbiAgICog7ZWY7JyE7Zi47ZmY7JqpIO2UhOuhneyLnCDrqZTshozrk5zsnoXri4jri6QuXG4gICAqL1xuICBhc3luYyBkZWxFbnRpdHkoZW50aXR5SWQ6IHN0cmluZyk6IFByb21pc2U8eyBkZWxQYXRoczogc3RyaW5nW10gfT4ge1xuICAgIHJldHVybiBhd2FpdCBkZWxFbnRpdHkoZW50aXR5SWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIO2VmOychO2YuO2ZmOyaqSDtlITroZ3si5wg66mU7IaM65Oc7J6F64uI64ukLlxuICAgKi9cbiAgYXN5bmMgZ2VuZXJhdGVUZW1wbGF0ZTxUIGV4dGVuZHMgVGVtcGxhdGVLZXk+KFxuICAgIGtleTogVCxcbiAgICB0ZW1wbGF0ZU9wdGlvbnM6IFRlbXBsYXRlT3B0aW9uc1tUXSxcbiAgICBfZ2VuZXJhdGVPcHRpb25zPzogR2VuZXJhdGVPcHRpb25zLFxuICApOiBQcm9taXNlPEFic29sdXRlUGF0aFtdPiB7XG4gICAgcmV0dXJuIGF3YWl0IGdlbmVyYXRlVGVtcGxhdGUoa2V5LCB0ZW1wbGF0ZU9wdGlvbnMsIF9nZW5lcmF0ZU9wdGlvbnMpO1xuICB9XG5cbiAgLyoqXG4gICAqIO2VmOychO2YuO2ZmOyaqSDtlITroZ3si5wg66mU7IaM65Oc7J6F64uI64ukLlxuICAgKi9cbiAgYXN5bmMgcmVuZGVyVGVtcGxhdGU8VCBleHRlbmRzIGtleW9mIFRlbXBsYXRlT3B0aW9ucz4oXG4gICAga2V5OiBULFxuICAgIHRlbXBsYXRlT3B0aW9uczogVGVtcGxhdGVPcHRpb25zW1RdLFxuICApOiBQcm9taXNlPFBhdGhBbmRDb2RlW10+IHtcbiAgICByZXR1cm4gYXdhaXQgcmVuZGVyVGVtcGxhdGUoa2V5LCB0ZW1wbGF0ZU9wdGlvbnMpO1xuICB9XG5cbiAgLyoqXG4gICAqIO2VmOychO2YuO2ZmOyaqSDtlITroZ3si5wg66mU7IaM65Oc7J6F64uI64ukLlxuICAgKi9cbiAgYXN5bmMgcmVuZXdDaGVja3N1bXMoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgcmV0dXJuIGF3YWl0IHJlbmV3Q2hlY2tzdW1zKCk7XG4gIH1cbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O2tCQVdtRDtjQUNaO3NCQUNrQjthQUVsQjt3QkFFd0I7YUFFbEI7bUJBRWdCO29CQUNWO2tCQUNOO2dCQUNGO3FCQUVzQjtnQkFDVztzQkFDUjt5QkFDTjtxQkFDbUM7cUJBRWhCO3NCQUUvQjtDQU1yQyxTQUFiLE1BQW9CO0VBQ2xCLE9BQW1CLEVBQUU7RUFDckIsUUFBcUIsRUFBRTtFQUN2QixTQUF1QixFQUFFO0VBQ3pCLFlBQTZDLElBQUksS0FBSztFQUN0RCxlQUE2QixJQUFJLGNBQWM7Ozs7OztFQU8vQyxNQUFNLE9BQXNCO0FBSTFCLFNBQU1BLHNDQUFvRDtBQUMxRCxTQUFNQyx5Q0FBdUQ7R0FHN0QsTUFBTSxlQUFlLE1BQU0sZ0NBQWdDO0FBQzNELE9BQUksYUFBYSxXQUFXLEdBQUc7QUFDN0IsWUFBUSxJQUFJLE1BQU0sTUFBTSxRQUFRLFdBQVcsd0JBQXdCLENBQUMsQ0FBQztBQUNyRTs7QUFNRixTQUFNLHdCQUNKLFlBQVk7QUFFVixVQUFNLEtBQUssY0FBYyxhQUFhO0FBR3RDLFVBQU0sZ0JBQWdCO01BRXhCO0lBQUUsaUJBQWlCO0lBQVcsYUFBYTtJQUFPLENBQ25EOzs7Ozs7Ozs7RUFVSCxNQUFNLFlBQTJCO0dBQy9CLE1BQU0sV0FBVyxLQUFL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
|
|
374
|
+
|
|
375
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3luY2VyLmpzIiwibmFtZXMiOlsiU3luY2VyQWN0aW9ucy5hY3Rpb25Db3B5U2hhcmVkVG9UYXJnZXRzSWZOb3RFeGlzdHMiLCJTeW5jZXJBY3Rpb25zLmFjdGlvbkdlbmVyYXRlU3NyRW50cnlTZXJ2ZXJJZk5vdEV4aXN0cyIsIlN5bmNlckFjdGlvbnMuYWN0aW9uR2VuZXJhdGVJbml0aWFsVHlwZXMiLCJTeW5jZXJBY3Rpb25zLmFjdGlvblN5bmNGaWxlc1RvVGFyZ2V0cyIsIlN5bmNlckFjdGlvbnMuYWN0aW9uR2VuZXJhdGVTY2hlbWFzIiwiU3luY2VyQWN0aW9ucy5hY3Rpb25HZW5lcmF0ZVNlcnZpY2VzIiwiU3luY2VyQWN0aW9ucy5hY3Rpb25HZW5lcmF0ZUh0dHBzIiwiU3luY2VyQWN0aW9ucy5hY3Rpb25HZW5lcmF0ZVNzclF1ZXJpZXMiLCJTeW5jZXJBY3Rpb25zLmFjdGlvblN5bmNDb25maWciLCJTeW5jZXJBY3Rpb25zLmFjdGlvblN5bmNTb25hbXVEaWN0aW9uYXJ5Il0sInNvdXJjZXMiOlsiLi4vLi4vc3JjL3N5bmNlci9zeW5jZXIudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGFzc2VydCBmcm9tIFwiYXNzZXJ0XCI7XG5pbXBvcnQgeyBFdmVudEVtaXR0ZXIgfSBmcm9tIFwiZXZlbnRzXCI7XG5pbXBvcnQgeyB1bmxpbmsgfSBmcm9tIFwiZnMvcHJvbWlzZXNcIjtcbmltcG9ydCBwYXRoIGZyb20gXCJwYXRoXCI7XG5cbmltcG9ydCB7IGhvdCB9IGZyb20gXCJAc29uYW11LWtpdC9obXItaG9va1wiO1xuaW1wb3J0IGNoYWxrIGZyb20gXCJjaGFsa1wiO1xuaW1wb3J0IHsgbWluaW1hdGNoIH0gZnJvbSBcIm1pbmltYXRjaFwiO1xuaW1wb3J0IHsgZ3JvdXAsIHVuaXF1ZSB9IGZyb20gXCJyYWRhc2hpXCI7XG5pbXBvcnQgeyB0eXBlIHogfSBmcm9tIFwiem9kXCI7XG5cbmltcG9ydCB7IHJlZ2lzdGVyZWRBcGlzIH0gZnJvbSBcIi4uL2FwaS9kZWNvcmF0b3JzXCI7XG5pbXBvcnQgeyBTb25hbXUgfSBmcm9tIFwiLi4vYXBpL3NvbmFtdVwiO1xuaW1wb3J0IHsgRW50aXR5TWFuYWdlciB9IGZyb20gXCIuLi9lbnRpdHkvZW50aXR5LW1hbmFnZXJcIjtcbmltcG9ydCB7IHR5cGUgRW50aXR5TmFtZXNSZWNvcmQgfSBmcm9tIFwiLi4vZW50aXR5L2VudGl0eS1tYW5hZ2VyXCI7XG5pbXBvcnQgeyBOYWl0ZSB9IGZyb20gXCIuLi9uYWl0ZS9uYWl0ZVwiO1xuaW1wb3J0IHsgdHlwZSBXb3JrZmxvd01ldGFkYXRhIH0gZnJvbSBcIi4uL3Rhc2tzL2RlY29yYXRvclwiO1xuaW1wb3J0IHsgVGVtcGxhdGVNYW5hZ2VyIH0gZnJvbSBcIi4uL3RlbXBsYXRlL3RlbXBsYXRlLW1hbmFnZXJcIjtcbmltcG9ydCB7IHR5cGUgR2VuZXJhdGVPcHRpb25zLCB0eXBlIFBhdGhBbmRDb2RlIH0gZnJvbSBcIi4uL3R5cGVzL3R5cGVzXCI7XG5pbXBvcnQgeyBUZW1wbGF0ZUtleSB9IGZyb20gXCIuLi90eXBlcy90eXBlc1wiO1xuaW1wb3J0IHsgdHlwZSBUZW1wbGF0ZU9wdGlvbnMgfSBmcm9tIFwiLi4vdHlwZXMvdHlwZXNcIjtcbmltcG9ydCB7IG1hcEFzeW5jLCByZWR1Y2VBc3luYyB9IGZyb20gXCIuLi91dGlscy9hc3luYy11dGlsc1wiO1xuaW1wb3J0IHsgY2VudGVyVGV4dCB9IGZyb20gXCIuLi91dGlscy9jb25zb2xlLXV0aWxcIjtcbmltcG9ydCB7IGlzVGVzdCB9IGZyb20gXCIuLi91dGlscy9jb250cm9sbGVyXCI7XG5pbXBvcnQgeyBleGlzdHMgfSBmcm9tIFwiLi4vdXRpbHMvZnMtdXRpbHNcIjtcbmltcG9ydCB7IHR5cGUgQWJzb2x1dGVQYXRoIH0gZnJvbSBcIi4uL3V0aWxzL3BhdGgtdXRpbHNcIjtcbmltcG9ydCB7IHJ1bldpdGhHcmFjZWZ1bFNodXRkb3duIH0gZnJvbSBcIi4uL3V0aWxzL3Byb2Nlc3MtdXRpbHNcIjtcbmltcG9ydCB7IGZpbmRDaGFuZ2VkRmlsZXNVc2luZ0NoZWNrc3VtcywgcmVuZXdDaGVja3N1bXMgfSBmcm9tIFwiLi9jaGVja3N1bVwiO1xuaW1wb3J0IHsgZ2VuZXJhdGVUZW1wbGF0ZSwgcmVuZGVyVGVtcGxhdGUgfSBmcm9tIFwiLi9jb2RlLWdlbmVyYXRvclwiO1xuaW1wb3J0IHsgY3JlYXRlRW50aXR5LCBkZWxFbnRpdHkgfSBmcm9tIFwiLi9lbnRpdHktb3BlcmF0aW9uc1wiO1xuaW1wb3J0IHsgZ2V0Q2hlY2tzdW1QYXR0ZXJuR3JvdXAsIGdldENoZWNrc3VtUGF0dGVybkdyb3VwSW5BYnNvbHV0ZVBhdGggfSBmcm9tIFwiLi9maWxlLXBhdHRlcm5zXCI7XG5pbXBvcnQgeyB0eXBlIEZpbGVUeXBlIH0gZnJvbSBcIi4vZmlsZS1wYXR0ZXJuc1wiO1xuaW1wb3J0IHsgbG9hZEFwaXMsIGxvYWRNb2RlbHMsIGxvYWRUeXBlcywgbG9hZFdvcmtmbG93cyB9IGZyb20gXCIuL21vZHVsZS1sb2FkZXJcIjtcbmltcG9ydCB7IHR5cGUgTG9hZGVkQXBpcywgdHlwZSBMb2FkZWRNb2RlbHMsIHR5cGUgTG9hZGVkVHlwZXMgfSBmcm9tIFwiLi9tb2R1bGUtbG9hZGVyXCI7XG5pbXBvcnQgKiBhcyBTeW5jZXJBY3Rpb25zIGZyb20gXCIuL3N5bmNlci1hY3Rpb25zXCI7XG5cbnR5cGUgRGlmZkdyb3VwcyA9IHtcbiAgW2tleSBpbiBGaWxlVHlwZV06IEFic29sdXRlUGF0aFtdO1xufTtcblxuZXhwb3J0IGNsYXNzIFN5bmNlciB7XG4gIGFwaXM6IExvYWRlZEFwaXMgPSBbXTtcbiAgdHlwZXM6IExvYWRlZFR5cGVzID0ge307XG4gIG1vZGVsczogTG9hZGVkTW9kZWxzID0ge307XG4gIHdvcmtmbG93czogTWFwPHN0cmluZywgV29ya2Zsb3dNZXRhZGF0YVtdPiA9IG5ldyBNYXAoKTtcbiAgZXZlbnRFbWl0dGVyOiBFdmVudEVtaXR0ZXIgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG5cbiAgLyoqXG4gICAqIOyytO2BrOyErOydtCDrs4Dqsr3rkJwg67aA67aE7JeQIOuMgO2VtCDsi7Htgazrpbwg7KeE7ZaJ7ZWp64uI64ukLlxuICAgKiBkZXYg7ISc67KE6rCAIOyymOydjCDrlrTsnYQg65WMLCBzb25hbXUgc3luYyDtlaAg65WMIOyLpO2WieuQqeuLiOuLpC4g7J207ZuE7JeQ64qUIGhtckFuZFN5bmMg6rK966Gc66W8IO2DgOyalC5cbiAgICogQHJldHVybnNcbiAgICovXG4gIGFzeW5jIHN5bmMoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgLy8g7LSI6riwIOu2gO2KuOyKpO2KuOueqSEg7JaY64Sk65Ok7J2AIGlkZW1wb3RlbnTtlZjqs6Ag6rCA67ON6riwIOuVjOusuOyXkCDrrLTsp4DshLEg7Iuk7ZaJ7ZW064+EIOuQqeuLiOuLpC5cbiAgICAvLyDslpjrhKTrk6TsnYAgc29uYW11LmxvY2vsl5Ag65Ok7Ja06rCA7KeA64+EIOyViuqzoCDrlLDrnbzshJwgSE1SIOqyveuhnOulvCDtg4Dsp4Drj4Qg7JWK64qUIOy5nOq1rOuTpOyeheuLiOuLpC5cbiAgICAvLyDqt7jrnpjshJwg7JWE66y0IOuVjOuCmCDqt7jrg6Ug64+M66Ck7KO866m0IOuQmOuKlOuNsCwgaG1yQW5kU3luY+yXkOyEnCDrp6Trsogg7ZWY64qUIOqyg+ydgCDrgq3ruYTsnbTri4gg7Jes6riw7IScIO2VnCDrsojrp4wg7ZWp64uI64ukLlxuICAgIGF3YWl0IFN5bmNlckFjdGlvbnMuYWN0aW9uQ29weVNoYXJlZFRvVGFyZ2V0c0lmTm90RXhpc3RzKCk7XG4gICAgYXdhaXQgU3luY2VyQWN0aW9ucy5hY3Rpb25HZW5lcmF0ZVNzckVudHJ5U2VydmVySWZOb3RFeGlzdHMoKTtcblxuICAgIC8vIOuwlOuAkCDqsoPsnbQg7JeG7Jy866m0IOq3uOuDpSDrhJjslrTqsIDsmpQuXG4gICAgY29uc3QgY2hhbmdlZEZpbGVzID0gYXdhaXQgZmluZENoYW5nZWRGaWxlc1VzaW5nQ2hlY2tzdW1zKCk7XG4gICAgaWYgKGNoYW5nZWRGaWxlcy5sZW5ndGggPT09IDApIHtcbiAgICAgIGNvbnNvbGUubG9nKGNoYWxrLmJsYWNrLmJnR3JlZW4oY2VudGVyVGV4dChcIkFsbCBmaWxlcyBhcmUgc3luY2VkIVwiKSkpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIOyXrOq4sOyEnCDsi6TsoJwg7Iux7YGsIOuPmeyekeydhCDsiJjtlontlanri4jri6QuXG4gICAgLy8g64uk66eMIOyLse2BrCDspJHsl5Ag7ZSE66Gc7IS47Iqk6rCAIOyjveycvOuptCDqvKzsl6zrsoTrpqzquLAg65WM66y47JeQLFxuICAgIC8vIOyLnOq3uOuEkOyXkOuPhCDsnqDsi5wg67KE7Yu4IOyImCDsnojripQg7ZmY6rK9IOyGjeyXkOyEnCDsi7Htgazrpbwg7Iuk7ZaJ7ZWp64uI64ukLlxuICAgIGF3YWl0IHJ1bldpdGhHcmFjZWZ1bFNodXRkb3duKFxuICAgICAgYXN5bmMgKCkgPT4ge1xuICAgICAgICAvLyDslpjqsIAg7Iux7YGsIOyekeyXhSDsiJjtlontlZjripQg67O47LK07J6F64uI64ukLlxuICAgICAgICBhd2FpdCB0aGlzLmRvU3luY0FjdGlvbnMoY2hhbmdlZEZpbGVzKTtcblxuICAgICAgICAvLyDsi7Htgawg7JWh7IWY7J20IOuBneuCmOuptCDtla3sg4Eg7LK07YGs7ISs7J2EIOuLpOyLnCDqsLHsi6Dtlanri4jri6QuXG4gICAgICAgIGF3YWl0IHJlbmV3Q2hlY2tzdW1zKCk7XG4gICAgICB9LFxuICAgICAgeyB3aGVuVGhpc0hhcHBlbnM6IFwiU0lHVVNSMlwiLCB3YWl0Rm9yVXBUbzogMjAwMDAgfSxcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIOqwleygnCDtkoAt7Iux7YGsOiBsb2Nr7J2EIOustOyLnO2VmOqzoCDsspjsnYzrtoDthLAg64uk7IucIOyLse2BrO2VqeuLiOuLpC5cbiAgICpcbiAgICogKirsgqzsmqnsspgqKjogZ2l0IHBvc3QtbWVyZ2UgaG9vaywgQ0ksIGRldiDshJzrsoTsnZggYGZgIO2Vq+2CpC5cbiAgICogKirsi6TtjKgg7JWI7KCE7ISxKio6IOuPhOykkeyXkCDtlITroZzshLjsiqTqsIAg7KO97Ja0IGxvY2sg7JeG64qUIOyDge2DnOuhnCDrgqjslYTrj4Qg66y07ZW0IOKAlCDri6TsnYwgc3luY+yXkOyEnFxuICAgKiBsb2NrIOyXhuycvOuptCDsnpDsl7DsiqTrn73qsowg7ZKALeyLse2BrOqwgCDtirjrpqzqsbDrkJjslrQg7IOIIGxvY2vsnbQg7J6R7ISx65CoLlxuICAgKi9cbiAgYXN5bmMgZm9yY2VTeW5jKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGxvY2tQYXRoID0gcGF0aC5qb2luKFNvbmFtdS5hcGlSb290UGF0aCwgXCJzb25hbXUubG9ja1wiKTtcbiAgICBpZiAoYXdhaXQgZXhpc3RzKGxvY2tQYXRoKSkge1xuICAgICAgYXdhaXQgdW5saW5rKGxvY2tQYXRoKTtcbiAgICB9XG4gICAgYXdhaXQgdGhpcy5zeW5jKCk7XG4gIH1cblxuICAvKipcbiAgICogV2F0Y2hlcuqwgCBiYXRjaOuhnCDrqqjsnYAg67OA6rK9IO2MjOydvOuTpOyXkCDrjIDtlbQg7ZWcIOuyiOydmCBITVIvc3luYyDsgqzsnbTtgbTsnYQg64+V64uI64ukLlxuICAgKlxuICAgKiBITVLsnYAgYXBpL3NyYyDslYjsl5DshJwg7J287Ja064KY64qUIOuqqOuToCDtjIzsnbzrk6Tsl5Ag64yA7ZW07IScIOyImO2Wie2VqeuLiOuLpC5cbiAgICogY2hlY2tzdW1QYXR0ZXJuR3JvdXAg66ek7LmtIOyXrOu2gOyZgCDrrLTqtIDtlZjqsowgYXBpL3NyYyDsoITssrQg64yA7IOB7J6F64uI64ukLlxuICAgKiDqsIDroLkgYXBpL3NyYy91dGlscy9zdWJzZXQtbG9hZGVycy50cyDqsJnsnYAg7YyM7J2864+EIOuzgOqyveuQmOuptCBITVLsnYAg7ZW07KSN64uI64ukLlxuICAgKlxuICAgKiBTeW5j64qUIGNoZWNrc3VtUGF0dGVybkdyb3Vw7Jy866GcIOunpOy5reuQmOuKlCDtjIzsnbzrk6Tsl5Ag64yA7ZW07ISc66eMIOyImO2Wie2VqeuLiOuLpC5cbiAgICog7Jes6riw7JeQ64qUIHdlYi9zcmPrgpggYXBwL3NyYyDqsJnsnYAg64uk66W4IHRhcmdldOydmCDtjIzsnbzsnbQg7Y+s7ZWo65CgIOyImCDsnojsirXri4jri6QuXG4gICAqIOydtOufsCBub24tYXBpIOqyveuhnOydmCDtjIzsnbzrk6TsnYAgSE1S6rO864qUIOyVhOustCDsg4HqtIDsnbQg7JeG7Jy866+A66GcLCBpbnZhbGlkYXRl7J2EIO2VmOyngCDslYrsirXri4jri6QuXG4gICAqXG4gICAqIEBwYXJhbSBmaWxlRXZlbnRzIC0gcGF0aCDihpIgZXZlbnQg66e1LiBldmVudOuKlCBcImNoYW5nZVwiIHwgXCJhZGRcIi5cbiAgICovXG4gIGFzeW5jIGhtckFuZFN5bmMoZmlsZUV2ZW50czogTWFwPEFic29sdXRlUGF0aCwgXCJjaGFuZ2VcIiB8IFwiYWRkXCI+KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgaG1yQWN0aW9uUmVxdWlyZWRFdmVudHMgPSB0aGlzLmV4dHJhY3RIbXJBY3Rpb25SZXF1aXJlZEZpbGVFdmVudHMoZmlsZUV2ZW50cyk7XG4gICAgY29uc3Qgc3luY1RyaWdnZXJpbmdQYXRocyA9IGF3YWl0IHRoaXMuZXh0cmFjdFN5bmNUcmlnZ2VyaW5nRmlsZUV2ZW50UGF0aHMoZmlsZUV2ZW50cyk7XG5cbiAgICAvLyBITVIg7JiB7JetOiDtjIzsnbwg7J2067Kk7Yq4IOykkSBhcGnsnZgg66qo65OIIOq3uOuemO2UhOyXkCDsnojripQg7YyM7J2865Ok7JeQIOuMgO2VnCDrs4Drj5nsnYAgaG1yQWN0aW9uUmVxdWlyZWRFdmVudHProZwg7J6h7Z6Z64uI64ukLlxuICAgIC8vIOydtCDsuZzqtazrk6TsnYAgaW52YWxpZGF0ZSDsspjrpqztlbTspI3ri4jri6QuXG4gICAgLy8g7J20IO2YuOy2nOydgCDslYTrnpggc3luY+uztOuLpCDrrLTsobDqsbQg66i87KCAIOydvOyWtOuCmOyVvCDtlanri4jri6QhXG4gICAgLy8g7Jmc64OQ7ZWY66m0IHN5bmPsl5DshJzripQg67OA6rK965CcIG1vZGVsIOy9lOuTnOulvCDsg4jroZwgaW1wb3J07ZW07IScIOyymOumrO2VtOyVvCDtlZjripQg6rK97Jqw64+EIOyeiOq4sCDrlYzrrLjsnoXri4jri6QuXG4gICAgYXdhaXQgdGhpcy5pbnZhbGlkYXRlRGVwZW5kZW50c0FmZmVjdGVkQnlGaWxlRXZlbnRzKGhtckFjdGlvblJlcXVpcmVkRXZlbnRzKTtcblxuICAgIC8vIFN5bmMg7JiB7JetOiBjaGVja3N1bVBhdHRlcm5Hcm91cOyXkCDrqoXsi5zrkJwg7YyM7J2865Ok7JeQIOuMgO2VnCDrs4Drj5nsnYAgc3luY1RyaWdnZXJpbmdQYXRoc+uhnCDsnqHtnpnri4jri6QuXG4gICAgLy8g7J20IOy5nOq1rOuTpOydgCDsoIHsoIjtlZwgc3luYyDsnpHsl4XsnLzroZwg64yA7J2R7ZWp64uI64ukLlxuICAgIGlmIChzeW5jVHJpZ2dlcmluZ1BhdGhzLmxlbmd0aCA+IDApIHtcbiAgICAgIGF3YWl0IHRoaXMuZG9TeW5jQWN0aW9ucyhzeW5jVHJpZ2dlcmluZ1BhdGhzKTtcbiAgICB9XG5cbiAgICAvLyDsi7Htgawg7J6R7JeF7J20IOuBneuCrOycvOuptCDrrLTsp4DshLEg66Gc65Oc66W8IOyImO2Wie2VqeuLiOuLpC5cbiAgICAvLyDsi7Htgazrpbwg7JWIIO2VnCDqsr3smrDsl5Drj4Qg66Gc65Oc64qUIO2VtOyVvCDtlbTsmpQuIOychOyXkOyEnCDqtIDroKjsnojripQg7Lmc6rWs65Ok7J2AIOuLpCBpbnZhbGlkYXRlIOuQmOyXiOqxsOuToOyalCFcbiAgICAvL1xuICAgIC8vIOuzgOqyveuQnCDtjIzsnbzrk6Tsl5Ag64yA7ZW07IScIOyDiOuhreqyjCDri7nqsqjsmKTripQobG9hZCkg7ZaJ7JyE64qUIGRvU3luY0FjdGlvbnPsl5DshJwg7ZWY7KeAIOyViuyKteuLiOuLpC5cbiAgICAvLyBkb1N5bmNBY3Rpb25z7JeQ7ISc64qUIO2MjOydvOydhCDsnb3qs6Ag66eM65Oc64qUIOyLse2BrCDtlonsnITrp4wg7ZWp64uI64ukLlxuICAgIC8vIOqxsOq4sOyEnCDrlLEg67OA6rK965CcIOu2gOu2hOyXkCDsmIHtlqXrsJvripQgYXV0b2xvYWTrp4wg7ISg67OE7ZW07IScIOyImO2Wie2VmOugpOuptCDrhIjrrLQg7KeA7KCA67aE7ZWY6rOgIOuzteyeoe2VtOynkeuLiOuLpC5cbiAgICAvL1xuICAgIC8vIO2NvO2PrOuovOyKpCDsmIHtlqXsnYAg66y07Iuc7ZW064+EIOyii+yKteuLiOuLpC5cbiAgICAvLyDslrTssKjtlLwgaG1yLWhvb2vsl5Ag7J2Y7ZW0IGludmFsaWRhdGXrkJwg67aA67aE65Ok7J20IOyVhOuLiOudvOuptCDsupDsi5wg6re464yA66GcIOycoOyngO2VqeuLiOuLpC5cbiAgICBhd2FpdCB0aGlzLmF1dG9sb2FkVHlwZXMoKTtcbiAgICBhd2FpdCB0aGlzLmF1dG9sb2FkTW9kZWxzKCk7XG4gICAgYXdhaXQgdGhpcy5hdXRvbG9hZEFwaXMoKTtcbiAgICBhd2FpdCB0aGlzLmF1dG9sb2FkV29ya2Zsb3dzKCk7XG4gICAgYXdhaXQgdGhpcy5hdXRvbG9hZFNzclJvdXRlcygpO1xuXG4gICAgdGhpcy5ldmVudEVtaXR0ZXIuZW1pdChcIm9uSE1SQ29tcGxldGVkXCIpO1xuICB9XG5cbiAgcHJpdmF0ZSBleHRyYWN0SG1yQWN0aW9uUmVxdWlyZWRGaWxlRXZlbnRzKFxuICAgIGZpbGVFdmVudHM6IE1hcDxBYnNvbHV0ZVBhdGgsIFwiY2hhbmdlXCIgfCBcImFkZFwiPixcbiAgKTogTWFwPEFic29sdXRlUGF0aCwgXCJjaGFuZ2VcIiB8IFwiYWRkXCI+IHtcbiAgICBjb25zdCBhcGlTcmMgPSBwYXRoLmpvaW4oU29uYW11LmFwaVJvb3RQYXRoLCBcInNyY1wiKTtcbiAgICBjb25zdCByZXN1bHQgPSBuZXcgTWFwPEFic29sdXRlUGF0aCwgXCJjaGFuZ2VcIiB8IFwiYWRkXCI+KCk7XG4gICAgZm9yIChjb25zdCBbZmlsZVBhdGgsIGV2ZW50XSBvZiBmaWxlRXZlbnRzKSB7XG4gICAgICBpZiAoIWZpbGVQYXRoLnN0YXJ0c1dpdGgoYXBpU3JjKSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIHJlc3VsdC5zZXQoZmlsZVBhdGgsIGV2ZW50KTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgZXh0cmFjdFN5bmNUcmlnZ2VyaW5nRmlsZUV2ZW50UGF0aHMoXG4gICAgZmlsZUV2ZW50czogTWFwPEFic29sdXRlUGF0aCwgXCJjaGFuZ2VcIiB8IFwiYWRkXCI+LFxuICApOiBQcm9taXNlPEFic29sdXRlUGF0aFtdPiB7XG4gICAgY29uc3QgY2hlY2tQYXR0ZXJuR3JvdXAgPSBnZXRDaGVja3N1bVBhdHRlcm5Hcm91cEluQWJzb2x1dGVQYXRoKCk7XG4gICAgY29uc3Qgc3luY1RyaWdnZXJpbmdQYXRoczogQWJzb2x1dGVQYXRoW10gPSBbXTtcbiAgICBmb3IgKGNvbnN0IFtkaWZmRmlsZVBhdGhdIG9mIGZpbGVFdmVudHMpIHtcbiAgICAgIGNvbnN0IGlzSW5DaGVja1BhdHRlcm5Hcm91cCA9IE9iamVjdC52YWx1ZXMoY2hlY2tQYXR0ZXJuR3JvdXApLnNvbWUoKHBhdHRlcm4pID0+XG4gICAgICAgIG1pbmltYXRjaChkaWZmRmlsZVBhdGgsIHBhdHRlcm4pLFxuICAgICAgKTtcbiAgICAgIGlmICghaXNJbkNoZWNrUGF0dGVybkdyb3VwKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgc3luY1RyaWdnZXJpbmdQYXRocy5wdXNoKGRpZmZGaWxlUGF0aCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHN5bmNUcmlnZ2VyaW5nUGF0aHM7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGludmFsaWRhdGVEZXBlbmRlbnRzQWZmZWN0ZWRCeUZpbGVFdmVudHMoXG4gICAgZmlsZUV2ZW50czogTWFwPEFic29sdXRlUGF0aCwgXCJjaGFuZ2VcIiB8IFwiYWRkXCI+LFxuICApIHtcbiAgICBmb3IgKGNvbnN0IFtkaWZmRmlsZVBhdGgsIGV2ZW50XSBvZiBmaWxlRXZlbnRzKSB7XG4gICAgICAvLyDrs4Dqsr3rkJwg7YyM7J286rO8IGRlcGVuZGVudCDtjIzsnbzrk6TsnYQgaW52YWxpZGF0ZSDtlanri4jri6QuXG4gICAgICAvLyDtlZwg67KIIOydtOyDgSBpbXBvcnTrkJwg7Lmc6rWs65Ok7JeQIOuMgO2VtOyEnOunjCDsi6TsoJwg7J6R7JeF7J20IOydvOyWtOuCqeuLiOuLpC5cbiAgICAgIC8vIOq3uOufrOuLiCDslYjsi6ztlZjqs6AgaW52YWxpZGF0ZSDtlbTrj4Qg65Cp64uI64ukLlxuICAgICAgLy8g7YWM7Iqk7Yq4IO2ZmOqyveyXkOyEnOuKlCBob3QuaW52YWxpZGF0ZUZpbGXsi5wg7LSI6riwIOyXkOufrOqwgCDrsJzsg53tlZjquLAg65WM66y47JeQIGludmFsaWRhdGUg7ZWY7KeAIOyViuyKteuLiOuLpC5cbiAgICAgIGlmICghaXNUZXN0KCkpIHtcbiAgICAgICAgY29uc3QgaW52YWxpZGF0ZWRQYXRocyA9IChhd2FpdCBob3QuaW52YWxpZGF0ZUZpbGUoZGlmZkZpbGVQYXRoLCBldmVudCkpIGFzIEFic29sdXRlUGF0aFtdO1xuXG4gICAgICAgIGlmIChpbnZhbGlkYXRlZFBhdGhzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBjb25zb2xlLmxvZyhjaGFsay5ib2xkKGDwn5SEIEludmFsaWRhdGVkOmApKTtcblxuICAgICAgICAgIGZvciAoY29uc3QgaW52YWxpZGF0ZWRQYXRoIG9mIGludmFsaWRhdGVkUGF0aHMpIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgIC8vIOunjOyVvSBtb2RlbC50cyDtjIzsnbzsnbQg67OA6rK9KGludmFsaWRhdGUp65CY7JeI64ukPyDqt7jrn6zrqbQgcmVnaXN0ZXJlZEFwaXMg7KSR7JeQ7IScIOydtCDrqqjrjbjsl5Ag7ZW064u57ZWY64qUIGFwaeuTpOydgCDsp4Dsm4zspJjsmpQuXG4gICAgICAgICAgICAgIC8vIHJlZ2lzdGVyZWRBcGlz64qUIO2GteycvOuhnCDri6Qg64Kg66Ck67KE66a0IOyImCDsl4bsirXri4jri6QuIHJlZ2lzdGVyZWRBcGlz7JeQIOyYrOudvOyYpOuKlCDsuZzqtazrk6TsnYAg7LSI6riwIOuhnOuTnOyLnCDrmJDripQgSE1S7Iuc7JeQ66eMIOuTseuhneuQmOq4sCDrlYzrrLjsnoXri4jri6QuXG4gICAgICAgICAgICAgIC8vIOuUsOudvOyEnCBtb2RlbC50cyDtjIzsnbzsnZgg67OA6rK97Jy866GcIOuLpOydjOuyiCDsg4jroZzsmrQgZXZhbOydtCDsmIjsg4HrkJjripQg7J20IOyLnOygkOyXkOyEnOunjCwg7J20IOuqqOuNuOyXkOyEnCDrgpjsmKggcmVnaXN0ZXJlZEFwaXPrk6TsnYQg7KeA7JuM7KSEIOyImCDsnojsirXri4jri6QuXG4gICAgICAgICAgICAgIGNvbnN0IHJlbW92ZWRBcGlzID0gdGhpcy5yZW1vdmVJbnZhbGlkYXRlZFJlZ2lzdGVyZWRBcGlzKGludmFsaWRhdGVkUGF0aCk7XG4gICAgICAgICAgICAgIGlmIChyZW1vdmVkQXBpcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coXG4gICAgICAgICAgICAgICAgICBjaGFsay5ibHVlKGAtICR7cGF0aC5yZWxhdGl2ZShTb25hbXUuYXBpUm9vdFBhdGgsIGludmFsaWRhdGVkUGF0aCl9YCksXG4gICAgICAgICAgICAgICAgICBjaGFsay5ncmF5KGAod2l0aCAke3JlbW92ZWRBcGlzLmxlbmd0aH0gQVBJcylgKSxcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGNoYWxrLmJsdWUoYC0gJHtwYXRoLnJlbGF0aXZlKFNvbmFtdS5hcGlSb290UGF0aCwgaW52YWxpZGF0ZWRQYXRoKX1gKSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihlKTtcbiAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgICAgICAgICBjaGFsay5yZWQoYEZhaWxlZCB0byByZW1vdmUgaW52YWxpZGF0ZWQgcmVnaXN0ZXJlZCBBUElzIGZvciAke2ludmFsaWRhdGVkUGF0aH1gKSxcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gZGV2UnVubmVyIO2ZnOyEse2ZlCDsi5wsIOuzgOqyveuQnCDshozsiqQg7YyM7J287J2EIFZpdGVzdCDrqqjrk4gg6re4656Y7ZSE7JeQ7ISc64+EIOustO2aqO2ZlO2VqeuLiOuLpC5cbiAgICAgIC8vIFZpdGXsnZggbW9kdWxlR3JhcGguaW52YWxpZGF0ZU1vZHVsZSgp7J20IGltcG9ydGVyIOuwqe2WpeycvOuhnCDsnqzqt4DsoIEgY2FzY2FkZe2VmOuvgOuhnCxcbiAgICAgIC8vIOyGjOyKpCDtjIzsnbwg7ZWY64KY66eMIOustO2aqO2ZlO2VmOuptCDsnbTrpbwgaW1wb3J07ZWY64qUIO2FjOyKpO2KuCDtjIzsnbzrj4Qg7J6Q64+Z7Jy866GcIOustO2aqO2ZlOuQqeuLiOuLpC5cbiAgICAgIGlmICghaXNUZXN0KCkgJiYgU29uYW11LmNvbmZpZy50ZXN0Py5kZXZSdW5uZXI/LmVuYWJsZWQgJiYgU29uYW11LmRldlZpdGVzdE1hbmFnZXIpIHtcbiAgICAgICAgU29uYW11LmRldlZpdGVzdE1hbmFnZXIuaW52YWxpZGF0ZUZpbGVzKFtkaWZmRmlsZVBhdGhdKTtcbiAgICAgICAgY29uc29sZS5sb2coXG4gICAgICAgICAgY2hhbGsuZGltKGBUZXN0IGludmFsaWRhdGVkOiAke3BhdGgucmVsYXRpdmUoU29uYW11LmFwaVJvb3RQYXRoLCBkaWZmRmlsZVBhdGgpfWApLFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJlbW92ZUludmFsaWRhdGVkUmVnaXN0ZXJlZEFwaXMoXG4gICAgaW52YWxpZGF0ZWRQYXRoOiBBYnNvbHV0ZVBhdGgsXG4gICk6ICh0eXBlb2YgcmVnaXN0ZXJlZEFwaXMpW251bWJlcl1bXSB7XG4gICAgLy8g7IaM7IqkIOy9lOuTnOulvCDri6Tro6jripQg7IOB7Zmp7J2064uIIC50cyDqsr3roZzroZwg67SF64uI64ukLlxuICAgIGNvbnN0IGlzTW9kZWwgPSBpbnZhbGlkYXRlZFBhdGguZW5kc1dpdGgoXCIubW9kZWwudHNcIik7XG4gICAgY29uc3QgaXNGcmFtZSA9IGludmFsaWRhdGVkUGF0aC5lbmRzV2l0aChcIi5mcmFtZS50c1wiKTtcbiAgICBpZiAoIWlzTW9kZWwgJiYgIWlzRnJhbWUpIHtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG5cbiAgICBjb25zdCBlbnRpdHlJZCA9IEVudGl0eU1hbmFnZXIuZ2V0RW50aXR5SWRGcm9tUGF0aChpbnZhbGlkYXRlZFBhdGgpO1xuICAgIGNvbnN0IHRhcmdldE1vZGVsTmFtZSA9IGAke2VudGl0eUlkfSR7aXNNb2RlbCA/IFwiTW9kZWxcIiA6IFwiRnJhbWVcIn1gO1xuICAgIGNvbnN0IHRvUmVtb3ZlID0gcmVnaXN0ZXJlZEFwaXMuZmlsdGVyKChhcGkpID0+IGFwaS5tb2RlbE5hbWUgPT09IHRhcmdldE1vZGVsTmFtZSk7XG4gICAgZm9yIChjb25zdCBhcGkgb2YgdG9SZW1vdmUpIHtcbiAgICAgIGNvbnN0IGlkeCA9IHJlZ2lzdGVyZWRBcGlzLmluZGV4T2YoYXBpKTtcbiAgICAgIGlmIChpZHggIT09IC0xKSB7XG4gICAgICAgIHJlZ2lzdGVyZWRBcGlzLnNwbGljZShpZHgsIDEpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB0b1JlbW92ZTtcbiAgfVxuXG4gIGFzeW5jIGF1dG9sb2FkVHlwZXMoKSB7XG4gICAgdGhpcy50eXBlcyA9IGF3YWl0IGxvYWRUeXBlcygpO1xuICB9XG5cbiAgYXN5bmMgYXV0b2xvYWRNb2RlbHMoKSB7XG4gICAgdGhpcy5tb2RlbHMgPSBhd2FpdCBsb2FkTW9kZWxzKCk7XG4gIH1cblxuICBhc3luYyBhdXRvbG9hZEFwaXMoKSB7XG4gICAgdGhpcy5hcGlzID0gYXdhaXQgbG9hZEFwaXMoKTtcbiAgfVxuXG4gIGFzeW5jIGF1dG9sb2FkV29ya2Zsb3dzKCkge1xuICAgIHRoaXMud29ya2Zsb3dzID0gYXdhaXQgbG9hZFdvcmtmbG93cygpO1xuICAgIGF3YWl0IFNvbmFtdS53b3JrZmxvd3Muc3luY2hyb25pemUodGhpcy53b3JrZmxvd3MpO1xuICB9XG5cbiAgYXN5bmMgYXV0b2xvYWRTc3JSb3V0ZXMoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3Qgc3NyQ29uZmlnUGF0aCA9IHBhdGguam9pbihTb25hbXUuYXBpUm9vdFBhdGgsIFwic3JjL3NzclwiKTtcblxuICAgIC8vIOq4sOyhtCByb3V0ZXMg7LSI6riw7ZmUXG4gICAgY29uc3QgeyBjbGVhclNTUlJvdXRlcyB9ID0gYXdhaXQgaW1wb3J0KFwiLi4vc3NyXCIpO1xuICAgIGNsZWFyU1NSUm91dGVzKCk7XG5cbiAgICAvLyBzc3Ig7Y+0642UIOyXhuycvOuptCDsiqTtgrVcbiAgICBpZiAoIShhd2FpdCBleGlzdHMoc3NyQ29uZmlnUGF0aCkpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gc3NyIO2PtOuNlCDslYjsnZgg66qo65OgIC50cyDtjIzsnbwg66Gc65OcXG4gICAgY29uc3QgeyBnbG9iQXN5bmMgfSA9IGF3YWl0IGltcG9ydChcIi4uL3V0aWxzL2FzeW5jLXV0aWxzXCIpO1xuICAgIGNvbnN0IHsgaW1wb3J0TWVtYmVycyB9ID0gYXdhaXQgaW1wb3J0KFwiLi4vdXRpbHMvZXNtLXV0aWxzXCIpO1xuICAgIGNvbnN0IHsgcnVudGltZVBhdGggfSA9IGF3YWl0IGltcG9ydChcIi4uL3V0aWxzL3BhdGgtdXRpbHNcIik7XG5cbiAgICAvLyBydW50aW1lUGF0aOulvCDsgqzsmqntlZjsl6wg6rCc67CcL+2UhOuhnOuNleyFmCDtmZjqsr3sl5Ag66ee64qUIO2ZleyepeyekCDsspjrpqxcbiAgICBjb25zdCBmaWxlcyA9IGF3YWl0IGdsb2JBc3luYyhwYXRoLmpvaW4oc3NyQ29uZmlnUGF0aCwgcnVudGltZVBhdGgoXCIqKi8qLnRzXCIpKSk7XG5cbiAgICBmb3IgKGNvbnN0IGZpbGUgb2YgZmlsZXMpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIC8vIGltcG9ydE1lbWJlcnPrpbwg7IKs7Jqp7ZWY66m0IO2MjOydvOydmCBzaWRlIGVmZmVjdChyZWdpc3RlclNTUiDtmLjstpwp6rCAIOyLpO2WieuQqFxuICAgICAgICBhd2FpdCBpbXBvcnRNZW1iZXJzKGZpbGUpO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBjb25zb2xlLmVycm9yKGBGYWlsZWQgdG8gbG9hZCBTU1Igcm91dGU6ICR7ZmlsZX1gLCBlKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICog7Iuk7KCcIOyLse2BrOulvCDsiJjtlontlZjripQg67O47LK07J6F64uI64ukLlxuICAgKiDrs4Dqsr3rkJwg7YyM7J2865Ok7J2EIO2DgOyeheuzhOuhnCDrtoTrpZjtlZjqs6Ag6rCBIO2DgOyeheyXkCDrp57ripQg7JWh7IWY7J2EIOyLpO2Wie2VqeuLiOuLpC5cbiAgICpcbiAgICogQHBhcmFtIGRpZmZGaWxlUGF0aHMgLSDrs4Dqsr3rkJwg7YyM7J2865Ok7J2YIOygiOuMgCDqsr3roZwg66qp66GdXG4gICAqIEByZXR1cm5zIGRpZmZUeXBlcyAtIOuzgOqyveuQnCDtjIzsnbzsnZgg7YOA7J6FIOuqqeuhnSAoZW50aXR5LCB0eXBlcywgbW9kZWwg65OxKVxuICAgKi9cbiAgYXN5bmMgZG9TeW5jQWN0aW9ucyhkaWZmRmlsZVBhdGhzOiBBYnNvbHV0ZVBhdGhbXSk6IFByb21pc2U8eyBkaWZmVHlwZXM6IEZpbGVUeXBlW10gfT4ge1xuICAgIGNvbnN0IGRpZmZHcm91cHMgPSB0aGlzLmNhbGN1bGF0ZURpZmZHcm91cHMoZGlmZkZpbGVQYXRocyk7XG4gICAgY29uc3QgZGlmZlR5cGVzID0gT2JqZWN0LmtleXMoZGlmZkdyb3VwcykgYXMgRmlsZVR5cGVbXTtcblxuICAgIC8vIOyXrOq4sOuKlCDrs4TroZwg7KSR7JqU7ZWcIO2MjO2KuOuKlCDslYTri5nri4jri6QuXG4gICAgLy8g7JWE656Y7J2YIGlmIOyghOqwnOulvCDquZTrgZTtlZjqsowg7ZWY66Ck6rOgIOunjOuToCBEU0wg6rCZ7J2AIOqxsOudvOyEnCwg66y07Iuc7ZWY7IWU64+EIOuQqeuLiOuLpC5cbiAgICBjb25zdCB7IGNoYW5nZU1hdGNoZXMsIG5vdGhpbmdNYXRjaGVzLCB1bmhhbmRsZWRQYXRocyB9ID0gdGhpcy5jaGFuZ2VNYXRjaGVyKFxuICAgICAgZGlmZlR5cGVzLFxuICAgICAgZGlmZkdyb3VwcyxcbiAgICApO1xuXG4gICAgaWYgKGNoYW5nZU1hdGNoZXMoXCJlbnRpdHlcIiwgXCJ0eXBlc1wiKSkge1xuICAgICAgYXdhaXQgdGhpcy5oYW5kbGVUcnV0aFNvdXJjZUNoYW5nZXMoZGlmZkdyb3Vwcyk7XG4gICAgfVxuXG4gICAgaWYgKGNoYW5nZU1hdGNoZXMoXCJtb2RlbFwiLCBcImZyYW1lXCIpKSB7XG4gICAgICBhd2FpdCB0aGlzLmhhbmRsZUltcGxlbWVudGF0aW9uQ2hhbmdlcyhkaWZmR3JvdXBzKTtcbiAgICB9XG5cbiAgICBpZiAoY2hhbmdlTWF0Y2hlcyhcInR5cGVzXCIsIFwiZnVuY3Rpb25zXCIpKSB7XG4gICAgICBhd2FpdCB0aGlzLmhhbmRsZUF1eGlsaWFyeVN5bWJvbENoYW5nZXMoZGlmZkdyb3Vwcyk7XG4gICAgfVxuXG4gICAgaWYgKGNoYW5nZU1hdGNoZXMoXCJjb25maWdcIikpIHtcbiAgICAgIGF3YWl0IHRoaXMuaGFuZGxlQ29uZmlnQ2hhbmdlcyhkaWZmR3JvdXBzKTtcbiAgICB9XG5cbiAgICBpZiAoY2hhbmdlTWF0Y2hlcyhcImkxOG5cIiwgXCJlbnRpdHlcIiAvKuugiOydtOu4lCovLCBcImNvbmZpZ1wiIC8qZGVmYXVsdExvY2FsZeuTsSovKSkge1xuICAgICAgYXdhaXQgdGhpcy5oYW5kbGVTb25hbXVEaWN0aW9uYXJ5UmVsYXRlZENoYW5nZXMoZGlmZkdyb3Vwcyk7XG4gICAgfVxuXG4gICAgaWYgKG5vdGhpbmdNYXRjaGVzKCkpIHtcbiAgICAgIC8vIO2MjOydvCDrs4Dqsr3snYAg6rCQ7KeA65CY7JeI7Jy864KYIOyggCDsnIQg7Ja064qQIGNoYW5nZU1hdGNoZXPsl5Drj4Qg6rG466as7KeAIOyViuydgCDtjIzsnbzrk6TsnbQgZHJpZnRz7J6F64uI64ukLlxuICAgICAgLy8gc3luY2Vy64qUIOyGjOyKpOydmCDrs4Dqsr3sl5DripQg67CY7J2R7ZWY7KeA66eMIOyCsOy2nOusvOydmCDrs4Dqsr0oZHJpZnQp7JeQ64qUIOyngeygkeyggeycvOuhnCDrsJjsnZHtlZjsp4Ag7JWK7Iq164uI64ukLlxuICAgICAgLy8g64yA7IugIOydtCBkcmlmdOyXkCDrjIDtlbQg6rK96rOgIOygleuPhOunjCDstpzroKXtlbTspI3ri4jri6QuXG4gICAgICBhd2FpdCB0aGlzLmhhbmRsZURyaWZ0cyh1bmhhbmRsZWRQYXRocygpKTtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgZGlmZlR5cGVzLFxuICAgIH07XG4gIH1cblxuICBjYWxjdWxhdGVEaWZmR3JvdXBzKGRpZmZGaWxlczogQWJzb2x1dGVQYXRoW10pOiBEaWZmR3JvdXBzIHtcbiAgICBjb25zdCBwYXR0ZXJuR3JvdXAgPSBnZXRDaGVja3N1bVBhdHRlcm5Hcm91cCgpO1xuICAgIGNvbnN0IGZpbGVUeXBlcyA9IE9iamVjdC5rZXlzKHBhdHRlcm5Hcm91cCkgYXMgRmlsZVR5cGVbXTtcblxuICAgIHJldHVybiBncm91cChkaWZmRmlsZXMsIChmaWxlUGF0aCkgPT4ge1xuICAgICAgLy8g7KCI64yAIOqyveuhnCDihpIgYXBwUm9vdCDquLDspIAg7IOB64yAIOqyveuhnCAo7JiIOiBcImFwaS9zcmMvLi4uXCIsIFwid2ViL3NyYy8uLi5cIilcbiAgICAgIGNvbnN0IHJlbGF0aXZlUGF0aCA9IHBhdGgucmVsYXRpdmUoU29uYW11LmFwcFJvb3RQYXRoLCBmaWxlUGF0aCk7XG4gICAgICBpZiAocmVsYXRpdmVQYXRoLnN0YXJ0c1dpdGgoXCIuLlwiKSkgcmV0dXJuIFwidW5rbm93blwiO1xuXG4gICAgICBmb3IgKGNvbnN0IGZpbGVUeXBlIG9mIGZpbGVUeXBlcykge1xuICAgICAgICBpZiAobWluaW1hdGNoKHJlbGF0aXZlUGF0aCwgcGF0dGVybkdyb3VwW2ZpbGVUeXBlXSkpIHtcbiAgICAgICAgICByZXR1cm4gZmlsZVR5cGU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBcInVua25vd25cIjtcbiAgICB9KSBhcyB1bmtub3duIGFzIERpZmZHcm91cHM7XG4gIH1cblxuICBwcml2YXRlIGNoYW5nZU1hdGNoZXIoZGlmZlR5cGVzOiBGaWxlVHlwZVtdLCBkaWZmR3JvdXBzOiBEaWZmR3JvdXBzKSB7XG4gICAgY29uc3QgaGFuZGxlZCA9IG5ldyBTZXQ8RmlsZVR5cGU+KCk7XG5cbiAgICAvKipcbiAgICAgKiDrs4Dqsr0g7IKs7ZWt7J20IOyduOyekOuhnCDrsJvsnYAgRmlsZVR5cGXrk6Qg7KSRIO2VmOuCmCDsnbTsg4HsnYQg7Y+s7ZWo7ZWY64qU7KeAIO2ZleyduO2VqeuLiOuLpC5cbiAgICAgKiDqsIDroLkgW1wiZW50aXR5XCJd6rCAIOuzgOqyveuQnCDtmLjstpzsl5DshJwgY2hhbmdlTWF0Y2hlcyhcImVudGl0eVwiKeuKlCB0cnll66W8IOuwmO2ZmO2VmOupsCxcbiAgICAgKiBbXCJ0eXBlc1wiLCBcImkxOG5cIl3snbQg67OA6rK965CcIO2YuOy2nOyXkOyEnCBjaGFuZ2VNYXRjaGVzKFwidHlwZXNcIiwgXCJmdW5jdGlvbnNcIinrj4QgdHJ1ZeulvCDrsJjtmZjtlZjsp4Drp4wsXG4gICAgICogW1wiZnVuY3Rpb25zXCJd6rCAIOuzgOqyveuQnCDtmLjstpzsl5DshJwgY2hhbmdlTWF0Y2hlcyhcImZyYW1lXCIp7J2AIGZhbHNl66W8IOuwmO2ZmO2VqeuLiOuLpC5cbiAgICAgKiBAcGFyYW0gdHlwZXNcbiAgICAgKi9cbiAgICBjb25zdCBjaGFuZ2VNYXRjaGVzID0gKC4uLnR5cGVzOiBGaWxlVHlwZVtdKSA9PiB7XG4gICAgICBjb25zdCBtYXRjaGluZyA9IHR5cGVzLmZpbHRlcigodCkgPT4gZGlmZlR5cGVzLmluY2x1ZGVzKHQpKTtcbiAgICAgIG1hdGNoaW5nLmZvckVhY2goKHQpID0+IGhhbmRsZWQuYWRkKHQpKTtcbiAgICAgIHJldHVybiBtYXRjaGluZy5sZW5ndGggPiAwO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBjaGFuZ2VNYXRjaGVz66GcIOunpOy5reuQnCDqsoPsnbQg7ZWY64KY64+EIOyXhuuKlOyngCDsl6zrtoDrpbwg6rCA7KC47Ji164uI64ukLlxuICAgICAqL1xuICAgIGNvbnN0IG5vdGhpbmdNYXRjaGVzID0gKCkgPT4gaGFuZGxlZC5zaXplID09PSAwO1xuXG4gICAgLyoqXG4gICAgICog7Ja065akIGNoYW5nZU1hdGNoZXMg7Zi47Lac7JeQ64+EIOqxuOumrOyngCDslYrsnYAgRmlsZVR5cGXrk6TsnZgg7Iuk7KCcIO2MjOydvCDqsr3roZzrpbwg66qo7JWE7IScIOuwmO2ZmO2VqeuLiOuLpC5cbiAgICAgKi9cbiAgICBjb25zdCB1bmhhbmRsZWRQYXRocyA9ICgpOiBBYnNvbHV0ZVBhdGhbXSA9PlxuICAgICAgZGlmZlR5cGVzLmZpbHRlcigodCkgPT4gIWhhbmRsZWQuaGFzKHQpKS5mbGF0TWFwKCh0KSA9PiBkaWZmR3JvdXBzW3RdID8/IFtdKTtcblxuICAgIHJldHVybiB7IGNoYW5nZU1hdGNoZXMsIG5vdGhpbmdNYXRjaGVzLCB1bmhhbmRsZWRQYXRocyB9O1xuICB9XG5cbiAgYXN5bmMgaGFuZGxlVHJ1dGhTb3VyY2VDaGFuZ2VzKGRpZmZHcm91cHM6IERpZmZHcm91cHMpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBOYWl0ZS50KFwiaGFuZGxlVHJ1dGhTb3VyY2VDaGFuZ2VzXCIsIHsgZGlmZkdyb3VwcyB9KTtcblxuICAgIGF3YWl0IEVudGl0eU1hbmFnZXIucmVsb2FkKCk7XG5cbiAgICAvLyB0eXBlcyDsg53shLEoZW50aXR5IOyDiOuhnCDstpTqsIDrkJwg6rK97JqwKVxuICAgIC8vIHBhcmVudElk6rCAIOyXhuqzoCwgdHlwZXPqsIAg7JeG64qUIOqyveyasOyXkOunjCDsg53shLFcbiAgICBjb25zdCBlbnRpdHlQYXRoID0gZGlmZkdyb3Vwcy5lbnRpdHk/LmF0KDApO1xuICAgIGlmIChlbnRpdHlQYXRoICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbnN0IGVudGl0eUlkID0gRW50aXR5TWFuYWdlci5nZXRFbnRpdHlJZEZyb21QYXRoKGVudGl0eVBhdGgpO1xuICAgICAgY29uc3QgZW50aXR5ID0gRW50aXR5TWFuYWdlci5nZXQoZW50aXR5SWQpO1xuXG4gICAgICAvLyDtlITroZzsoJ3tirjsl5Ag7IOd7ISx65CY7Ja07JW8IO2VmOuKlCAudHMg7YyM7J287J2YIOqyveuhnOyeheuLiOuLpC5cbiAgICAgIGNvbnN0IHR5cGVGaWxlUGF0aCA9IHBhdGguam9pbihcbiAgICAgICAgU29uYW11LmFwaVJvb3RQYXRoLFxuICAgICAgICBgc3JjL2FwcGxpY2F0aW9uLyR7ZW50aXR5Lm5hbWVzLmZzfS8ke2VudGl0eS5uYW1lcy5mc30udHlwZXMudHNgLFxuICAgICAgKSBhcyBBYnNvbHV0ZVBhdGg7XG5cbiAgICAgIGlmIChlbnRpdHkucGFyZW50SWQgPT09IHVuZGVmaW5lZCAmJiAhKGF3YWl0IGV4aXN0cyh0eXBlRmlsZVBhdGgpKSkge1xuICAgICAgICAvLyAqLnR5cGVzLnRz6rCAIOunjOuTpOyWtOynkeuLiOuLpC5cbiAgICAgICAgY29uc3QgdHlwZXMgPSBhd2FpdCBTeW5jZXJBY3Rpb25zLmFjdGlvbkdlbmVyYXRlSW5pdGlhbFR5cGVzKGVudGl0eUlkKTtcblxuICAgICAgICAvLyDqt7jqsbgg7YOA6rKf7JeQIOqwluuLpOuRrOyalC5cbiAgICAgICAgYXdhaXQgU3luY2VyQWN0aW9ucy5hY3Rpb25TeW5jRmlsZXNUb1RhcmdldHModHlwZXMpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIHNvbmFtdS5nZW5lcmF0ZWQudHPsmYAgc29uYW11LmdlbmVyYXRlZC5zc28udHPqsIAg66eM65Ok7Ja07KeR64uI64ukLlxuICAgIGNvbnN0IGdlbmVyYXRlZCA9IGF3YWl0IFN5bmNlckFjdGlvbnMuYWN0aW9uR2VuZXJhdGVTY2hlbWFzKCk7XG5cbiAgICAvLyDrqqjrk6Ag6rKD65Ok7J2EIHRhcmdldOyXkCDrs7TrgrTsp4DripQg7JWK7Iq164uI64ukLlxuICAgIC8vIHNvbmFtdS5nZW5lcmF0ZWQuc3NvLnRz64qUIHNlcnZpY2Utc2lkZS1vbmx564uI6rmMIOuwsOygnO2VqeuLiOuLpC5cbiAgICAvLyBUT0RPKOuzkeykgCk6IOydtCDtlZjrk5zsvZTrk5zrpbwg64iE6rCAIO2VtOqysCDsooAg7ZW07KO87IS47JqULiDsnbzri6jsnYAg6rCQ64u5IOqwgOuKpe2VmOuLiCDrhpTrkZDqsqDsirXri4jri6QuLi5cbiAgICBjb25zdCBkaXN0cmlidXRhYmxlID0gZ2VuZXJhdGVkLmZpbHRlcigocCkgPT4gIXAuZW5kc1dpdGgoXCIuc3NvLnRzXCIpKTtcblxuICAgIC8vIOydtOygnCDrs7Trgrwg6rKD65Ok66eMIHRhcmdldOyXkCDrs7TrgrTsmpQuXG4gICAgYXdhaXQgU3luY2VyQWN0aW9ucy5hY3Rpb25TeW5jRmlsZXNUb1RhcmdldHMoZGlzdHJpYnV0YWJsZSk7XG4gIH1cblxuICBhc3luYyBoYW5kbGVJbXBsZW1lbnRhdGlvbkNoYW5nZXMoZGlmZkdyb3VwczogRGlmZkdyb3Vwcyk6IFByb21pc2U8dm9pZD4ge1xuICAgIE5haXRlLnQoXCJoYW5kbGVJbXBsZW1lbnRhdGlvbkNoYW5nZXNcIiwgeyBkaWZmR3JvdXBzIH0pO1xuICAgIGNvbnN0IG1lcmdlZEdyb3VwID0gWy4uLihkaWZmR3JvdXBzLm1vZGVsID8/IFtdKSwgLi4uKGRpZmZHcm91cHMuZnJhbWUgPz8gW10pXTtcblxuICAgIC8vIGdlbmVyYXRlZF9odHRwLnRlbXBsYXRlLnRz7JeQ7IScIHN5bmNlci50eXBlc+ulvCDslIHri4jri6QuXG4gICAgLy8gc2VydmljZS50ZW1wbGF0ZS50c+yXkOyEnCBzeW5jZXIuYXBpc+ulvCDslIHri4jri6QuXG4gICAgYXdhaXQgdGhpcy5hdXRvbG9hZE1vZGVscygpO1xuICAgIGF3YWl0IHRoaXMuYXV0b2xvYWRUeXBlcygpO1xuICAgIGF3YWl0IHRoaXMuYXV0b2xvYWRBcGlzKCk7XG5cbiAgICBjb25zdCBwYXJhbXM6IHtcbiAgICAgIG5hbWVzUmVjb3JkOiBFbnRpdHlOYW1lc1JlY29yZDtcbiAgICB9W10gPSBtZXJnZWRHcm91cC5tYXAoKG1vZGVsUGF0aCkgPT4ge1xuICAgICAgaWYgKG1vZGVsUGF0aC5lbmRzV2l0aChcIi5tb2RlbC50c1wiKSB8fCBtb2RlbFBhdGguZW5kc1dpdGgoXCIuZnJhbWUudHNcIikpIHtcbiAgICAgICAgY29uc3QgZW50aXR5SWQgPSBFbnRpdHlNYW5hZ2VyLmdldEVudGl0eUlkRnJvbVBhdGgobW9kZWxQYXRoKTtcbiAgICAgICAgYXNzZXJ0KGVudGl0eUlkKTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBuYW1lc1JlY29yZDogRW50aXR5TWFuYWdlci5nZXROYW1lc0Zyb21JZChlbnRpdHlJZCksXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJub3QgcmVhY2hhYmxlXCIpO1xuICAgIH0pO1xuXG4gICAgYXdhaXQgU3luY2VyQWN0aW9ucy5hY3Rpb25HZW5lcmF0ZVNlcnZpY2VzKHBhcmFtcyk7XG4gICAgYXdhaXQgU3luY2VyQWN0aW9ucy5hY3Rpb25HZW5lcmF0ZUh0dHBzKCk7XG4gICAgYXdhaXQgU3luY2VyQWN0aW9ucy5hY3Rpb25HZW5lcmF0ZVNzclF1ZXJpZXMoKTtcbiAgfVxuXG4gIGFzeW5jIGhhbmRsZUF1eGlsaWFyeVN5bWJvbENoYW5nZXMoZGlmZkdyb3VwczogRGlmZkdyb3Vwcyk6IFByb21pc2U8dm9pZD4ge1xuICAgIE5haXRlLnQoXCJoYW5kbGVBdXhpbGlhcnlTeW1ib2xDaGFuZ2VzXCIsIHsgZGlmZkdyb3VwcyB9KTtcbiAgICBjb25zdCB0c1BhdGhzID0gdW5pcXVlKFsuLi4oZGlmZkdyb3Vwcy50eXBlcyA/PyBbXSksIC4uLihkaWZmR3JvdXBzLmZ1bmN0aW9ucyA/PyBbXSldKTtcbiAgICBhd2FpdCBTeW5jZXJBY3Rpb25zLmFjdGlvblN5bmNGaWxlc1RvVGFyZ2V0cyh0c1BhdGhzKTtcbiAgfVxuXG4gIGFzeW5jIGhhbmRsZUNvbmZpZ0NoYW5nZXMoXzogRGlmZkdyb3Vwcyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGF3YWl0IFN5bmNlckFjdGlvbnMuYWN0aW9uU3luY0NvbmZpZygpO1xuICB9XG5cbiAgYXN5bmMgaGFuZGxlU29uYW11RGljdGlvbmFyeVJlbGF0ZWRDaGFuZ2VzKF86IERpZmZHcm91cHMpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhd2FpdCBTeW5jZXJBY3Rpb25zLmFjdGlvblN5bmNTb25hbXVEaWN0aW9uYXJ5KCk7XG4gIH1cblxuICBhc3luYyBoYW5kbGVEcmlmdHMoZHJpZnRzOiBBYnNvbHV0ZVBhdGhbXSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmIChkcmlmdHMubGVuZ3RoID4gMCkge1xuICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICBjaGFsay55ZWxsb3coXG4gICAgICAgICAgXCLimqDvuI8gU29uYW116rCAIOyekOuPmSDsg53shLHtlZwg7YyM7J287JeQIOuMgO2VnCDrs4Dqsr3snbQg6rCQ7KeA65CY7JeI7Iq164uI64ukLiDtjIzsnbzsnbQgU29uYW11IHdhdGNoZXIg7Jm467aA7JeQ7IScIOuzgOqyveuQnCDqsoPsnLzroZwg7LaU7KCV65Cp64uI64ukLlwiLFxuICAgICAgICApLFxuICAgICAgKTtcbiAgICAgIGZvciAoY29uc3QgcCBvZiBkcmlmdHMpIHtcbiAgICAgICAgY29uc29sZS53YXJuKGNoYWxrLnllbGxvdyhgICAtICR7cGF0aC5yZWxhdGl2ZShTb25hbXUuYXBwUm9vdFBhdGgsIHApfWApKTtcbiAgICAgIH1cbiAgICAgIGNvbnNvbGUud2FybihjaGFsay5kaW0oXCIgIOKGkiBgcG5wbSBzb25hbXUgc3luYyAtLWZvcmNlYOulvCDqtozsnqXtlanri4jri6QuXCIpKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICog7KO87Ja07KeEIOyXlO2LsO2LsOyZgCDthZztlIzrpr8g7YKk7JeQIOuMgO2VtCwg7IOd7ISx65CcIOy9lOuTnOqwgCDsobTsnqztlZjripTsp4Ag7ZmV7J247ZWp64uI64ukLlxuICAgKiBAcGFyYW0gZW50aXR5SWQg7JeU7Yuw7YuwIElEXG4gICAqIEBwYXJhbSB0ZW1wbGF0ZUtleSDthZztlIzrpr8g7YKkXG4gICAqIEBwYXJhbSBlbnVtSWQg7Je06rGw7ZiVIElEXG4gICAqIEByZXR1cm5zIOyDneyEseuQnCDsvZTrk5zqsIAg7KG07J6s7ZWY64qU7KeAIOyXrOu2gFxuICAgKi9cbiAgYXN5bmMgY2hlY2tFeGlzdHNHZW5Db2RlKFxuICAgIGVudGl0eUlkOiBzdHJpbmcsXG4gICAgdGVtcGxhdGVLZXk6IFRlbXBsYXRlS2V5LFxuICAgIGVudW1JZD86IHN0cmluZyxcbiAgKTogUHJvbWlzZTx7IHN1YlBhdGg6IHN0cmluZzsgZnVsbFBhdGg6IHN0cmluZzsgaXNFeGlzdHM6IGJvb2xlYW4gfT4ge1xuICAgIGNvbnN0IHsgdGFyZ2V0LCBwYXRoOiBnZW5QYXRoIH0gPSBUZW1wbGF0ZU1hbmFnZXIuZ2V0KHRlbXBsYXRlS2V5KS5nZXRUYXJnZXRBbmRQYXRoKFxuICAgICAgRW50aXR5TWFuYWdlci5nZXROYW1lc0Zyb21JZChlbnRpdHlJZCksXG4gICAgICBlbnVtSWQsXG4gICAgKTtcblxuICAgIGNvbnN0IHN1YlBhdGggPSBwYXRoLmpvaW4odGFyZ2V0LCBnZW5QYXRoKTtcbiAgICBjb25zdCBmdWxsUGF0aCA9IHBhdGguam9pbihTb25hbXUuYXBwUm9vdFBhdGgsIHN1YlBhdGgpO1xuICAgIHJldHVybiB7XG4gICAgICBzdWJQYXRoLFxuICAgICAgZnVsbFBhdGgsXG4gICAgICBpc0V4aXN0czogYXdhaXQgZXhpc3RzKGZ1bGxQYXRoKSxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIOyjvOyWtOynhCDsl5Tti7Dti7DsmYAg7Je06rGw7ZiV7JeQIOuMgO2VtCwg7IOd7ISx65CcIOy9lOuTnOqwgCDsobTsnqztlZjripTsp4Ag7ZmV7J247ZWp64uI64ukLlxuICAgKiBAcGFyYW0gZW50aXR5SWQg7JeU7Yuw7YuwIElEXG4gICAqIEBwYXJhbSBlbnVtcyDsl7TqsbDtmJUg66CI7J2067iUXG4gICAqIEByZXR1cm5zIOyDneyEseuQnCDsvZTrk5zqsIAg7KG07J6s7ZWY64qU7KeAIOyXrOu2gFxuICAgKi9cbiAgYXN5bmMgY2hlY2tFeGlzdHMoXG4gICAgZW50aXR5SWQ6IHN0cmluZyxcbiAgICBlbnVtczoge1xuICAgICAgW25hbWU6IHN0cmluZ106IHouWm9kRW51bTtcbiAgICB9LFxuICApOiBQcm9taXNlPFJlY29yZDxgJHtUZW1wbGF0ZUtleX0ke3N0cmluZ31gLCBib29sZWFuPj4ge1xuICAgIGNvbnN0IGtleXM6IFRlbXBsYXRlS2V5W10gPSBUZW1wbGF0ZUtleS5vcHRpb25zO1xuICAgIGNvbnN0IG5hbWVzID0gRW50aXR5TWFuYWdlci5nZXROYW1lc0Zyb21JZChlbnRpdHlJZCk7XG4gICAgY29uc3QgZW51bXNLZXlzID0gT2JqZWN0LmtleXMoZW51bXMpLmZpbHRlcigobmFtZSkgPT4gbmFtZSAhPT0gbmFtZXMuY29uc3RhbnQpO1xuXG4gICAgcmV0dXJuIGF3YWl0IHJlZHVjZUFzeW5jKFxuICAgICAga2V5cyxcbiAgICAgIGFzeW5jIChyZXN1bHQsIGtleSkgPT4ge1xuICAgICAgICBjb25zdCB0cGwgPSBUZW1wbGF0ZU1hbmFnZXIuZ2V0KGtleSk7XG4gICAgICAgIGlmIChrZXkuc3RhcnRzV2l0aChcInZpZXdfZW51bXNcIikpIHtcbiAgICAgICAgICBhd2FpdCBtYXBBc3luYyhlbnVtc0tleXMsIGFzeW5jIChjb21wb25lbnRJZCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgeyB0YXJnZXQsIHBhdGg6IHAgfSA9IHRwbC5nZXRUYXJnZXRBbmRQYXRoKG5hbWVzLCBjb21wb25lbnRJZCk7XG4gICAgICAgICAgICByZXN1bHRbYCR7a2V5fV9fJHtjb21wb25lbnRJZH1gXSA9IGF3YWl0IGV4aXN0cyhcbiAgICAgICAgICAgICAgcGF0aC5qb2luKFNvbmFtdS5hcHBSb290UGF0aCwgdGFyZ2V0LCBwKSxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHsgdGFyZ2V0LCBwYXRoOiBwIH0gPSB0cGwuZ2V0VGFyZ2V0QW5kUGF0aChuYW1lcyk7XG4gICAgICAgIGNvbnN0IHsgdGFyZ2V0cyB9ID0gU29uYW11LmNvbmZpZy5zeW5jO1xuICAgICAgICBpZiAodGFyZ2V0LmluY2x1ZGVzKFwiOnRhcmdldFwiKSkge1xuICAgICAgICAgIGF3YWl0IG1hcEFzeW5jKHRhcmdldHMsIGFzeW5jICh0KSA9PiB7XG4gICAgICAgICAgICByZXN1bHRbYCR7a2V5fV9fJHt0fWBdID0gYXdhaXQgZXhpc3RzKFxuICAgICAgICAgICAgICBwYXRoLmpvaW4oU29uYW11LmFwcFJvb3RQYXRoLCB0YXJnZXQucmVwbGFjZShcIjp0YXJnZXRcIiwgdCksIHApLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXN1bHRba2V5XSA9IGF3YWl0IGV4aXN0cyhwYXRoLmpvaW4oU29uYW11LmFwcFJvb3RQYXRoLCB0YXJnZXQsIHApKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICB9LFxuICAgICAge30gYXMgUmVjb3JkPGAke1RlbXBsYXRlS2V5fSR7c3RyaW5nfWAsIGJvb2xlYW4+LFxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICog7ZWY7JyE7Zi47ZmY7JqpIO2UhOuhneyLnCDrqZTshozrk5zsnoXri4jri6QuXG4gICAqL1xuICBhc3luYyBjcmVhdGVFbnRpdHkoZm9ybTogVGVtcGxhdGVPcHRpb25zW1wiZW50aXR5XCJdKSB7XG4gICAgcmV0dXJuIGF3YWl0IGNyZWF0ZUVudGl0eShmb3JtKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDtlZjsnITtmLjtmZjsmqkg7ZSE66Gd7IucIOuplOyGjOuTnOyeheuLiOuLpC5cbiAgICovXG4gIGFzeW5jIGRlbEVudGl0eShlbnRpdHlJZDogc3RyaW5nKTogUHJvbWlzZTx7IGRlbFBhdGhzOiBzdHJpbmdbXSB9PiB7XG4gICAgcmV0dXJuIGF3YWl0IGRlbEVudGl0eShlbnRpdHlJZCk7XG4gIH1cblxuICAvKipcbiAgICog7ZWY7JyE7Zi47ZmY7JqpIO2UhOuhneyLnCDrqZTshozrk5zsnoXri4jri6QuXG4gICAqL1xuICBhc3luYyBnZW5lcmF0ZVRlbXBsYXRlPFQgZXh0ZW5kcyBUZW1wbGF0ZUtleT4oXG4gICAga2V5OiBULFxuICAgIHRlbXBsYXRlT3B0aW9uczogVGVtcGxhdGVPcHRpb25zW1RdLFxuICAgIF9nZW5lcmF0ZU9wdGlvbnM/OiBHZW5lcmF0ZU9wdGlvbnMsXG4gICk6IFByb21pc2U8QWJzb2x1dGVQYXRoW10+IHtcbiAgICByZXR1cm4gYXdhaXQgZ2VuZXJhdGVUZW1wbGF0ZShrZXksIHRlbXBsYXRlT3B0aW9ucywgX2dlbmVyYXRlT3B0aW9ucyk7XG4gIH1cblxuICAvKipcbiAgICog7ZWY7JyE7Zi47ZmY7JqpIO2UhOuhneyLnCDrqZTshozrk5zsnoXri4jri6QuXG4gICAqL1xuICBhc3luYyByZW5kZXJUZW1wbGF0ZTxUIGV4dGVuZHMga2V5b2YgVGVtcGxhdGVPcHRpb25zPihcbiAgICBrZXk6IFQsXG4gICAgdGVtcGxhdGVPcHRpb25zOiBUZW1wbGF0ZU9wdGlvbnNbVF0sXG4gICk6IFByb21pc2U8UGF0aEFuZENvZGVbXT4ge1xuICAgIHJldHVybiBhd2FpdCByZW5kZXJUZW1wbGF0ZShrZXksIHRlbXBsYXRlT3B0aW9ucyk7XG4gIH1cblxuICAvKipcbiAgICog7ZWY7JyE7Zi47ZmY7JqpIO2UhOuhneyLnCDrqZTshozrk5zsnoXri4jri6QuXG4gICAqL1xuICBhc3luYyByZW5ld0NoZWNrc3VtcygpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICByZXR1cm4gYXdhaXQgcmVuZXdDaGVja3N1bXMoKTtcbiAgfVxufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztpQkFXa0Q7YUFDWjtxQkFDa0I7WUFFbEI7dUJBRXdCO1lBRWxCO2tCQUVnQjttQkFDVjtpQkFDTjtlQUNGO29CQUVzQjtlQUNXO3FCQUNSO3dCQUNOO29CQUNtQztvQkFFaEI7cUJBRS9CO0NBTXBDLFNBQWIsTUFBb0I7RUFDbEIsT0FBbUIsQ0FBQztFQUNwQixRQUFxQixDQUFDO0VBQ3RCLFNBQXVCLENBQUM7RUFDeEIsNEJBQTZDLElBQUksSUFBSTtFQUNyRCxlQUE2QixJQUFJLGFBQWE7Ozs7OztFQU85QyxNQUFNLE9BQXNCO0dBSTFCLE1BQU1BLHFDQUFtRDtHQUN6RCxNQUFNQyx3Q0FBc0Q7R0FHNUQsTUFBTSxlQUFlLE1BQU0sK0JBQStCO0dBQzFELElBQUksYUFBYSxXQUFXLEdBQUc7SUFDN0IsUUFBUSxJQUFJLE1BQU0sTUFBTSxRQUFRLFdBQVcsdUJBQXVCLENBQUMsQ0FBQztJQUNwRTtHQUNGO0dBS0EsTUFBTSx3QkFDSixZQUFZO0lBRVYsTUFBTSxLQUFLLGNBQWMsWUFBWTtJQUdyQyxNQUFNLGVBQWU7R0FDdkIsR0FDQTtJQUFFLGlCQUFpQjtJQUFXLGFBQWE7R0FBTSxDQUNuRDtFQUNGOzs7Ozs7OztFQVNBLE1BQU0sWUFBMkI7R0FDL0IsTUFBTSxXQUFXLEtBQUssS0FBSyxPQUFPLGFBQWEsYUFBYTtHQUM1RCxJQUFJLE1BQU0sT0FBTyxRQUFRLEdBQ3ZCLE1BQU0sT0FBTyxRQUFRO0dBRXZCLE1BQU0sS0FBSyxLQUFLO0VBQ2xCOzs7Ozs7Ozs7Ozs7OztFQWVBLE1BQU0sV0FBVyxZ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
|
package/dist/syncer/watcher.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { __esmMin } from "../_virtual/
|
|
1
|
+
import { __esmMin } from "../_virtual/_rolldown/runtime.js";
|
|
2
2
|
import { Sonamu } from "../api/sonamu.js";
|
|
3
3
|
import { init_api } from "../api/index.js";
|
|
4
4
|
import { getChecksumPatternGroupInAbsolutePath, init_file_patterns } from "./file-patterns.js";
|
|
@@ -9,7 +9,6 @@ import path from "path";
|
|
|
9
9
|
import chalk from "chalk";
|
|
10
10
|
import { minimatch } from "minimatch";
|
|
11
11
|
import chokidar from "chokidar";
|
|
12
|
-
|
|
13
12
|
//#region src/syncer/watcher.ts
|
|
14
13
|
/**
|
|
15
14
|
* Watcher를 설정합니다.
|
|
@@ -24,30 +23,20 @@ async function setupWatcher(onFileEvents) {
|
|
|
24
23
|
const pushFileEvent = createFileEventBatcher({
|
|
25
24
|
delayMs: 100,
|
|
26
25
|
onFlush: async (fileEvents) => {
|
|
27
|
-
const realChanges = new Map();
|
|
28
|
-
for (const [p, e] of fileEvents)
|
|
29
|
-
|
|
30
|
-
realChanges.set(p, e);
|
|
31
|
-
}
|
|
32
|
-
}
|
|
33
|
-
if (realChanges.size > 0) {
|
|
34
|
-
await onFileEvents(realChanges);
|
|
35
|
-
}
|
|
26
|
+
const realChanges = /* @__PURE__ */ new Map();
|
|
27
|
+
for (const [p, e] of fileEvents) if (!await isLastChangedByMe(p)) realChanges.set(p, e);
|
|
28
|
+
if (realChanges.size > 0) await onFileEvents(realChanges);
|
|
36
29
|
}
|
|
37
30
|
});
|
|
38
31
|
watcher.on("all", (event, filePath) => {
|
|
39
32
|
const absolutePath = filePath;
|
|
40
33
|
strict(absolutePath.startsWith(Sonamu.appRootPath), "File path is not within the app root path");
|
|
41
|
-
if (!isWantedEvent(event))
|
|
42
|
-
return;
|
|
43
|
-
}
|
|
34
|
+
if (!isWantedEvent(event)) return;
|
|
44
35
|
if (isConfigChange(absolutePath)) {
|
|
45
36
|
triggerSelfRestart(event, filePath);
|
|
46
37
|
return;
|
|
47
38
|
}
|
|
48
|
-
if (isOutOfScope(absolutePath))
|
|
49
|
-
return;
|
|
50
|
-
}
|
|
39
|
+
if (isOutOfScope(absolutePath)) return;
|
|
51
40
|
pushFileEvent(absolutePath, event);
|
|
52
41
|
});
|
|
53
42
|
return watcher;
|
|
@@ -86,20 +75,17 @@ function triggerSelfRestart(event, filePath) {
|
|
|
86
75
|
*/
|
|
87
76
|
function isOutOfScope(filePath) {
|
|
88
77
|
const apiSrc = path.join(Sonamu.apiRootPath, "src");
|
|
89
|
-
if (filePath.startsWith(apiSrc))
|
|
90
|
-
return false;
|
|
91
|
-
}
|
|
78
|
+
if (filePath.startsWith(apiSrc)) return false;
|
|
92
79
|
const checkPatternGroup = getChecksumPatternGroupInAbsolutePath();
|
|
93
80
|
return !Object.values(checkPatternGroup).some((pattern) => minimatch(filePath, pattern));
|
|
94
81
|
}
|
|
95
|
-
|
|
82
|
+
//#endregion
|
|
83
|
+
__esmMin((() => {
|
|
96
84
|
init_api();
|
|
97
85
|
init_event_batcher();
|
|
98
86
|
init_file_patterns();
|
|
99
87
|
init_file_tracking();
|
|
100
|
-
}));
|
|
101
|
-
|
|
102
|
-
//#endregion
|
|
103
|
-
init_watcher();
|
|
88
|
+
}))();
|
|
104
89
|
export { setupWatcher };
|
|
105
|
-
|
|
90
|
+
|
|
91
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2F0Y2hlci5qcyIsIm5hbWVzIjpbXSwic291cmNlcyI6WyIuLi8uLi9zcmMvc3luY2VyL3dhdGNoZXIudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgc3RyaWN0IGFzIGFzc2VydCB9IGZyb20gXCJhc3NlcnRcIjtcbmltcG9ydCB7IHR5cGUgU3RhdHMgfSBmcm9tIFwibm9kZTpmc1wiO1xuaW1wb3J0IHBhdGggZnJvbSBcInBhdGhcIjtcblxuaW1wb3J0IGNoYWxrIGZyb20gXCJjaGFsa1wiO1xuaW1wb3J0IGNob2tpZGFyLCB7IHR5cGUgRlNXYXRjaGVyIH0gZnJvbSBcImNob2tpZGFyXCI7XG5pbXBvcnQgeyBtaW5pbWF0Y2ggfSBmcm9tIFwibWluaW1hdGNoXCI7XG5cbmltcG9ydCB7IFNvbmFtdSB9IGZyb20gXCIuLi9hcGlcIjtcbmltcG9ydCB7IHR5cGUgQWJzb2x1dGVQYXRoIH0gZnJvbSBcIi4uL3V0aWxzL3BhdGgtdXRpbHNcIjtcbmltcG9ydCB7IGNyZWF0ZUZpbGVFdmVudEJhdGNoZXIgfSBmcm9tIFwiLi9ldmVudC1iYXRjaGVyXCI7XG5pbXBvcnQgeyBnZXRDaGVja3N1bVBhdHRlcm5Hcm91cEluQWJzb2x1dGVQYXRoIH0gZnJvbSBcIi4vZmlsZS1wYXR0ZXJuc1wiO1xuaW1wb3J0IHsgaXNMYXN0Q2hhbmdlZEJ5TWUgfSBmcm9tIFwiLi9maWxlLXRyYWNraW5nXCI7XG5cbi8qKlxuICogV2F0Y2hlcuulvCDshKTsoJXtlanri4jri6QuXG4gKiDsnbQg7Lmc6rWs64qUIOynhOynnOuhnCBzeW5jZXLqsIAg67Cb7JWE7JW8IO2VoCDrs4Dqsr0g7J2067Kk7Yq465Ok66eMIOy2lOugpOyEnCBiYXRjaOuhnCDsoITri6ztlbTspI3ri4jri6QuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzZXR1cFdhdGNoZXIoXG4gIG9uRmlsZUV2ZW50czogKGZpbGVFdmVudHM6IE1hcDxBYnNvbHV0ZVBhdGgsIFwiY2hhbmdlXCIgfCBcImFkZFwiPikgPT4gUHJvbWlzZTx2b2lkPixcbik6IFByb21pc2U8RlNXYXRjaGVyPiB7XG4gIC8vIGFwaSDrs7jsnbjrv5Ag7JWE64uI6528IHN5bmMgdGFyZ2V065Ok7J2YIHNyY+uPhCDrtIXri4jri6QuXG4gIC8vIHRhcmdldCDsgrDstpzrrLwoc29uYW11LmdlbmVyYXRlZCwgc2VydmljZXMuZ2VuZXJhdGVkLCBpMThuIGNvcHkg65OxKeydtCDsmbjrtoDsl5DshJxcbiAgLy8g67OA6rK965CY64qUIOqyveyasOulvCBkcmlmdOuhnCDsnqHslYQg7JuM64ud7J2EIOudhOyasOq4sCDsnITtlajsnoXri4jri6QuXG4gIGNvbnN0IHdhdGNoZXIgPSBjaG9raWRhci53YXRjaChhcGlBbmRUYXJnZXRzU3JjUGF0aHMoKSwge1xuICAgIGlnbm9yZWQ6IGlnbm9yZUlmRXh0ZW5zaW9uSXNOb3RPbmVPZihcIi50c1wiLCBcIi5qc29uXCIsIFwiLmh0dHBcIiksXG4gICAgcGVyc2lzdGVudDogdHJ1ZSxcbiAgICBpZ25vcmVJbml0aWFsOiB0cnVlLFxuICB9KTtcblxuICAvLyAxMDBtcyDslYjsl5Ag65Ok7Ja07JioIOuzgOqyveuTpOydhCDtlZwgYmF0Y2jroZwg66qo7JWEIO2VnCDsgqzsnbTtgbTroZwg7LKY66as7ZWp64uI64ukLlxuICBjb25zdCBwdXNoRmlsZUV2ZW50ID0gY3JlYXRlRmlsZUV2ZW50QmF0Y2hlcjxcImNoYW5nZVwiIHwgXCJhZGRcIj4oe1xuICAgIGRlbGF5TXM6IDEwMCxcbiAgICBvbkZsdXNoOiBhc3luYyAoZmlsZUV2ZW50cykgPT4ge1xuICAgICAgY29uc3QgcmVhbENoYW5nZXMgPSBuZXcgTWFwPEFic29sdXRlUGF0aCwgXCJjaGFuZ2VcIiB8IFwiYWRkXCI+KCk7XG4gICAgICBmb3IgKGNvbnN0IFtwLCBlXSBvZiBmaWxlRXZlbnRzKSB7XG4gICAgICAgIC8vIHNlbGYtd3JpdGUgZWNob+uKlCBmbHVzaCDsi5zsoJDsl5Ag6rGw66aF64uI64ukLlxuICAgICAgICAvLyB3YXRjaGVyLm9u7JeQ7IScIOymieyLnCDqsbDrpbTrqbQg64SI66y0IOydtOumheuLiOuLpC5cbiAgICAgICAgLy8g7Jes6riw7JeQ7ISc64qUIO2MjOydvOydtCDrlJTsiqTtgazsl5Ag7JOw7J206rOgIOuCmOyEnCDslb3qsITsnZgg65Sc66CI7J206rCAIOyeiOq4sCDrlYzrrLjsl5BcbiAgICAgICAgLy8gXCLrlJTsiqTtgazsl5Ag7I287KeA66eMIOyVhOyngSB0cmFja1dyaXR0ZW7snbQg7JmE66OM65CY6riwIOyghCDsg4Htg5xcIiDqsJnsnYAg66y47KCc6rCAIOyCrOudvOynkeuLiOuLpC5cbiAgICAgICAgaWYgKCEoYXdhaXQgaXNMYXN0Q2hhbmdlZEJ5TWUocCkpKSB7XG4gICAgICAgICAgcmVhbENoYW5nZXMuc2V0KHAsIGUpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAocmVhbENoYW5nZXMuc2l6ZSA+IDApIHtcbiAgICAgICAgYXdhaXQgb25GaWxlRXZlbnRzKHJlYWxDaGFuZ2VzKTtcbiAgICAgIH1cbiAgICB9LFxuICB9KTtcblxuICB3YXRjaGVyLm9uKFwiYWxsXCIsIChldmVudDogc3RyaW5nLCBmaWxlUGF0aDogc3RyaW5nKSA9PiB7XG4gICAgY29uc3QgYWJzb2x1dGVQYXRoID0gZmlsZVBhdGggYXMgQWJzb2x1dGVQYXRoO1xuICAgIGFzc2VydChcbiAgICAgIGFic29sdXRlUGF0aC5zdGFydHNXaXRoKFNvbmFtdS5hcHBSb290UGF0aCksXG4gICAgICBcIkZpbGUgcGF0aCBpcyBub3Qgd2l0aGluIHRoZSBhcHAgcm9vdCBwYXRoXCIsXG4gICAgKTtcblxuICAgIGlmICghaXNXYW50ZWRFdmVudChldmVudCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoaXNDb25maWdDaGFuZ2UoYWJzb2x1dGVQYXRoKSkge1xuICAgICAgdHJpZ2dlclNlbGZSZXN0YXJ0KGV2ZW50LCBmaWxlUGF0aCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKGlzT3V0T2ZTY29wZShhYnNvbHV0ZVBhdGgpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8g7Jes6riw6rmM7KeAIOyZlOuLpOuptCBzeW5jZXLqsIAg7KeE7Kec66GcIOyymOumrO2VtOyVvCDtlaAg67OA6rK97IKs7ZWt7J2065286rOgIOuztOuptCDrkKnri4jri6QuXG4gICAgLy8g7J20IO2YuOy2nOydgCDsnbTrsqTtirjrpbwgYmF0Y2hlcuyXkCDsjJPsirXri4jri6QuXG4gICAgLy8g7J207ZuEIOuVjOqwgCDrkJjrqbQg7J2066CH6rKMIOyMk+yduCDsnbTrsqTtirjrpbwg65Ok6rOgIG9uRmlsZUV2ZW50cyDsvZzrsLHsnbQg7Zi47Lac65Cp64uI64ukLlxuICAgIHB1c2hGaWxlRXZlbnQoYWJzb2x1dGVQYXRoLCBldmVudCk7XG4gIH0pO1xuXG4gIHJldHVybiB3YXRjaGVyO1xufVxuXG5mdW5jdGlvbiBhcGlBbmRUYXJnZXRzU3JjUGF0aHMoKSB7XG4gIHJldHVybiBbXG4gICAgcGF0aC5qb2luKFNvbmFtdS5hcGlSb290UGF0aCwgXCJzcmNcIiksXG4gICAgLi4uU29uYW11LmNvbmZpZy5zeW5jLnRhcmdldHMubWFwKCh0KSA9PiBwYXRoLmpvaW4oU29uYW11LmFwcFJvb3RQYXRoLCB0LCBcInNyY1wiKSksXG4gIF07XG59XG5cbi8qKlxuICogY2hva2lkYXLsnZggYGlnbm9yZWRgIOyYteyFmOyXkCDrsJXripQg7Zes7Y28LlxuICog7KO87Ja07KeEIO2ZleyepeyekOqwgCAq7JWE64uMKiDtjIzsnbzsnYAg66y07Iuc7ZWp64uI64ukIOKAlCDspokg7KO87Ja07KeEIO2ZleyepeyekOunjCB3YXRjaCDrjIDsg4EuXG4gKlxuICogY2hva2lkYXIgYGlnbm9yZWRg64qUIGB0cnVlYOulvCDrsJjtmZjtlZjrqbQg7ZW064u5IOqyveuhnOulvCDrrLTsi5ztlanri4jri6QuXG4gKiDrlLDrnbzshJwgXCLsnbQg7ZmV7J6l7J6Q66eMIO2XiOyaqVwi7J2EIO2RnO2YhO2VmOugpOuptCAq64uk66W4IO2ZleyepeyekOyXkCDrjIDtlbQgdHJ1ZSrrpbwg67CY7ZmY7ZW07JW8IO2VqeuLiOuLpC5cbiAqL1xuZnVuY3Rpb24gaWdub3JlSWZFeHRlbnNpb25Jc05vdE9uZU9mKC4uLmFsbG93ZWRFeHRlbnNpb25zOiBgLiR7c3RyaW5nfWBbXSkge1xuICBjb25zdCBpc0FsbG93ZWQgPSAoZXh0OiBzdHJpbmcpID0+IChhbGxvd2VkRXh0ZW5zaW9ucyBhcyBzdHJpbmdbXSkuaW5jbHVkZXMoZXh0KTtcblxuICByZXR1cm4gKHA6IHN0cmluZywgc3RhdHM/OiBTdGF0cykgPT4gISFzdGF0cz8uaXNGaWxlKCkgJiYgIWlzQWxsb3dlZChwYXRoLmV4dG5hbWUocCkpO1xufVxuXG5mdW5jdGlvbiBpc1dhbnRlZEV2ZW50KGV2ZW50OiBzdHJpbmcpOiBldmVudCBpcyBcImNoYW5nZVwiIHwgXCJhZGRcIiB7XG4gIHJldHVybiBldmVudCA9PT0gXCJjaGFuZ2VcIiB8fCBldmVudCA9PT0gXCJhZGRcIjtcbn1cblxuZnVuY3Rpb24gaXNDb25maWdDaGFuZ2UoZmlsZVBhdGg6IEFic29sdXRlUGF0aCk6IGJvb2xlYW4ge1xuICByZXR1cm4gZmlsZVBhdGggPT09IHBhdGguam9pbihTb25hbXUuYXBpUm9vdFBhdGgsIFwic3JjXCIsIFwic29uYW11LmNvbmZpZy50c1wiKTtcbn1cblxuZnVuY3Rpb24gdHJpZ2dlclNlbGZSZXN0YXJ0KGV2ZW50OiBzdHJpbmcsIGZpbGVQYXRoOiBzdHJpbmcpOiB2b2lkIHtcbiAgY29uc3QgcmVsYXRpdmVQYXRoID0gZmlsZVBhdGgucmVwbGFjZShTb25hbXUuYXBpUm9vdFBhdGgsIFwiYXBpXCIpO1xuICBjb25zb2xlLmxvZyhjaGFsay5ib2xkKGBEZXRlY3RlZCgke2V2ZW50fSk6ICR7Y2hhbGsuYmx1ZShyZWxhdGl2ZVBhdGgpfSAtIFJlc3RhcnRpbmcuLi5gKSk7XG4gIHByb2Nlc3Mua2lsbChwcm9jZXNzLnBpZCwgXCJTSUdVU1IyXCIpO1xufVxuXG4vKipcbiAqIOyKpOy9lO2UhCDsoJXsnZg6XG4gKiAtIGFwaS9zcmMg7JWI7J2YIOuqqOuToCDrs4Dqsr3snYAg7Iqk7L2U7ZSEIOyViCAoSE1SIOuMgOyDgeydtCDrkKAg7IiYIOyeiOycvOuvgOuhnClcbiAqIC0gYXBpL3NyYyDrsJbsnbTrnbzrqbQgY2hlY2tzdW1QYXR0ZXJuR3JvdXAg7Yyo7YS07JeQIOunpOy5reuQmOuKlCDqsr3roZzrp4wg7Iqk7L2U7ZSEIOyViFxuICpcbiAqIOq3uCDsmbgo7JiIOiB3ZWIvc3JjL0FwcC50c3gg6rCZ7J2AIHRhcmdldOydmCDruYTstpTsoIEg7YyM7J28KeuKlCDsiqTsvZTtlIQg67CW7J206528IOustOyLnO2VqeuLiOuLpC5cbiAqL1xuZnVuY3Rpb24gaXNPdXRPZlNjb3BlKGZpbGVQYXRoOiBBYnNvbHV0ZVBhdGgpOiBib29sZWFuIHtcbiAgY29uc3QgYXBpU3JjID0gcGF0aC5qb2luKFNvbmFtdS5hcGlSb290UGF0aCwgXCJzcmNcIik7XG4gIGlmIChmaWxlUGF0aC5zdGFydHNXaXRoKGFwaVNyYykpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgY29uc3QgY2hlY2tQYXR0ZXJuR3JvdXAgPSBnZXRDaGVja3N1bVBhdHRlcm5Hcm91cEluQWJzb2x1dGVQYXRoKCk7XG4gIHJldHVybiAhT2JqZWN0LnZhbHVlcyhjaGVja1BhdHRlcm5Hcm91cCkuc29tZSgocGF0dGVybikgPT4gbWluaW1hdGNoKGZpbGVQYXRoLCBwYXR0ZXJuKSk7XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7QUFrQkEsZUFBc0IsYUFDcEIsY0FDb0I7Q0FJcEIsTUFBTSxVQUFVLFNBQVMsTUFBTSxzQkFBc0IsR0FBRztFQUN0RCxTQUFTLDRCQUE0QixPQUFPLFNBQVMsT0FBTztFQUM1RCxZQUFZO0VBQ1osZUFBZTtDQUNqQixDQUFDO0NBR0QsTUFBTSxnQkFBZ0IsdUJBQXlDO0VBQzdELFNBQVM7RUFDVCxTQUFTLE9BQU8sZUFBZTtHQUM3QixNQUFNLDhCQUFjLElBQUksSUFBb0M7R0FDNUQsS0FBSyxNQUFNLENBQUMsR0FBRyxNQUFNLFlBS25CLElBQUksQ0FBRSxNQUFNLGtCQUFrQixDQUFDLEdBQzdCLFlBQVksSUFBSSxHQUFHLENBQUM7R0FHeEIsSUFBSSxZQUFZLE9BQU8sR0FDckIsTUFBTSxhQUFhLFdBQVc7RUFFbEM7Q0FDRixDQUFDO0NBRUQsUUFBUSxHQUFHLFFBQVEsT0FBZSxhQUFxQjtFQUNyRCxNQUFNLGVBQWU7RUFDckIsT0FDRSxhQUFhLFdBQVcsT0FBTyxXQUFXLEdBQzFDLDJDQUNGO0VBRUEsSUFBSSxDQUFDLGNBQWMsS0FBSyxHQUN0QjtFQUdGLElBQUksZUFBZSxZQUFZLEdBQUc7R0FDaEMsbUJBQW1CLE9BQU8sUUFBUTtHQUNsQztFQUNGO0VBRUEsSUFBSSxhQUFhLFlBQVksR0FDM0I7RUFNRixjQUFjLGNBQWMsS0FBSztDQUNuQyxDQUFDO0NBRUQsT0FBTztBQUNUO0FBRUEsU0FBUyx3QkFBd0I7Q0FDL0IsT0FBTyxDQUNMLEtBQUssS0FBSyxPQUFPLGFBQWEsS0FBSyxHQUNuQyxHQUFHLE9BQU8sT0FBTyxLQUFLLFFBQVEsS0FBSyxNQUFNLEtBQUssS0FBSyxPQUFPLGFBQWEsR0FBRyxLQUFLLENBQUMsQ0FDbEY7QUFDRjs7Ozs7Ozs7QUFTQSxTQUFTLDRCQUE0QixHQUFHLG1CQUFtQztDQUN6RSxNQUFNLGFBQWEsUUFBaUIsa0JBQStCLFNBQVMsR0FBRztDQUUvRSxRQUFRLEdBQVcsVUFBa0IsQ0FBQyxDQUFDLE9BQU8sT0FBTyxLQUFLLENBQUMsVUFBVSxLQUFLLFFBQVEsQ0FBQyxDQUFDO0FBQ3RGO0FBRUEsU0FBUyxjQUFjLE9BQTBDO0NBQy9ELE9BQU8sVUFBVSxZQUFZLFVBQVU7QUFDekM7QUFFQSxTQUFTLGVBQWUsVUFBaUM7Q0FDdkQsT0FBTyxhQUFhLEtBQUssS0FBSyxPQUFPLGFBQWEsT0FBTyxrQkFBa0I7QUFDN0U7QUFFQSxTQUFTLG1CQUFtQixPQUFlLFVBQXdCO0NBQ2pFLE1BQU0sZUFBZSxTQUFTLFFBQVEsT0FBTyxhQUFhLEtBQUs7Q0FDL0QsUUFBUSxJQUFJLE1BQU0sS0FBSyxZQUFZLE1BQU0sS0FBSyxNQUFNLEtBQUssWUFBWSxFQUFFLGlCQUFpQixDQUFDO0NBQ3pGLFFBQVEsS0FBSyxRQUFRLEtBQUssU0FBUztBQUNyQzs7Ozs7Ozs7QUFTQSxTQUFTLGFBQWEsVUFBaUM7Q0FDckQsTUFBTSxTQUFTLEtBQUssS0FBSyxPQUFPLGFBQWEsS0FBSztDQUNsRCxJQUFJLFNBQVMsV0FBVyxNQUFNLEdBQzVCLE9BQU87Q0FFVCxNQUFNLG9CQUFvQixzQ0FBc0M7Q0FDaEUsT0FBTyxDQUFDLE9BQU8sT0FBTyxpQkFBaUIsQ0FBQyxDQUFDLE1BQU0sWUFBWSxVQUFVLFVBQVUsT0FBTyxDQUFDO0FBQ3pGOzs7VUF2SCtCO29CQUV5QjtvQkFDZTtvQkFDcEIifQ==
|