sonamu 0.12.0 → 0.13.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/_virtual/_rolldown/runtime.js +1 -2
- package/dist/ai/agents/agent.js +2 -3
- package/dist/ai/agents/index.js +1 -2
- package/dist/ai/index.js +1 -2
- package/dist/ai/providers/rtzr/api.js +1 -2
- package/dist/ai/providers/rtzr/error.js +2 -3
- package/dist/ai/providers/rtzr/model.js +1 -2
- package/dist/ai/providers/rtzr/options.js +1 -2
- package/dist/ai/providers/rtzr/provider.js +1 -2
- package/dist/ai/providers/rtzr/utils.js +1 -2
- package/dist/api/base-frame.js +4 -4
- package/dist/api/caster.d.ts +1 -1
- package/dist/api/caster.d.ts.map +1 -1
- package/dist/api/caster.js +9 -9
- package/dist/api/code-converters.js +6 -5
- package/dist/api/config.d.ts +1 -1
- package/dist/api/config.d.ts.map +1 -1
- package/dist/api/config.js +2 -3
- package/dist/api/context.d.ts +2 -3
- package/dist/api/context.d.ts.map +1 -1
- package/dist/api/context.js +2 -3
- package/dist/api/decorators.js +2 -3
- package/dist/api/http-validator.js +2 -3
- package/dist/api/index.js +8 -3
- package/dist/api/secret.js +1 -2
- package/dist/api/sonamu.d.ts +3 -5
- package/dist/api/sonamu.d.ts.map +1 -1
- package/dist/api/sonamu.js +19 -18
- package/dist/api/validator.js +1 -2
- package/dist/api/websocket-helpers.js +2 -3
- package/dist/auth/audit-log/builders.js +1 -2
- package/dist/auth/audit-log/client-ip.js +2 -3
- package/dist/auth/audit-log/events.js +1 -2
- package/dist/auth/audit-log/plugin.d.ts.map +1 -1
- package/dist/auth/audit-log/plugin.js +2 -3
- package/dist/auth/audit-log-ingestor.js +2 -3
- package/dist/auth/auth-generator.js +2 -3
- package/dist/auth/better-auth-entities.js +1 -2
- package/dist/auth/better-auth-request.js +2 -3
- package/dist/auth/index.js +2 -3
- package/dist/auth/knex-adapter.js +2 -3
- package/dist/auth/plugins/entity-definitions/admin.js +1 -2
- package/dist/auth/plugins/entity-definitions/anonymous.js +1 -2
- package/dist/auth/plugins/entity-definitions/api-key.js +1 -2
- package/dist/auth/plugins/entity-definitions/audit-log.js +1 -2
- package/dist/auth/plugins/entity-definitions/index.js +1 -2
- package/dist/auth/plugins/entity-definitions/jwt.js +1 -2
- package/dist/auth/plugins/entity-definitions/organization.js +1 -2
- package/dist/auth/plugins/entity-definitions/passkey.js +1 -2
- package/dist/auth/plugins/entity-definitions/phone-number.js +1 -2
- package/dist/auth/plugins/entity-definitions/sso.js +1 -2
- package/dist/auth/plugins/entity-definitions/two-factor.js +1 -2
- package/dist/auth/plugins/entity-definitions/username.js +1 -2
- package/dist/auth/plugins/wrappers/admin.d.ts +33 -32
- package/dist/auth/plugins/wrappers/admin.d.ts.map +1 -1
- 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/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.d.ts +43 -1
- package/dist/auth/plugins/wrappers/phone-number.d.ts.map +1 -1
- package/dist/auth/plugins/wrappers/phone-number.js +2 -3
- package/dist/auth/plugins/wrappers/sso.d.ts +138 -187
- package/dist/auth/plugins/wrappers/sso.d.ts.map +1 -1
- package/dist/auth/plugins/wrappers/sso.js +1 -2
- package/dist/auth/plugins/wrappers/two-factor.d.ts +51 -10
- package/dist/auth/plugins/wrappers/two-factor.d.ts.map +1 -1
- package/dist/auth/plugins/wrappers/two-factor.js +2 -3
- package/dist/auth/plugins/wrappers/username.d.ts +39 -5
- package/dist/auth/plugins/wrappers/username.d.ts.map +1 -1
- package/dist/auth/plugins/wrappers/username.js +2 -3
- package/dist/bin/build-config.js +5 -5
- package/dist/bin/compiler-policy.js +2 -3
- package/dist/bin/fixture.js +7 -5
- package/dist/bin/hmr-hook-register.js +1 -2
- package/dist/bin/migrate-targets.js +2 -3
- package/dist/bin/test-command.js +2 -3
- package/dist/bin/ts-loader-register.js +2 -3
- package/dist/bin/ts-loader-registration.js +2 -3
- package/dist/bin/typecheck-web.js +2 -3
- package/dist/cache/cache-manager.js +1 -2
- package/dist/cache/decorator.js +2 -3
- package/dist/cache/drivers.js +1 -2
- package/dist/cache/index.js +2 -3
- package/dist/cache-control/cache-control.js +1 -2
- package/dist/code-formatting/index.js +2 -3
- package/dist/code-formatting/oxfmt.js +2 -3
- package/dist/code-formatting/oxlint.js +2 -3
- package/dist/compress/compress.js +1 -2
- package/dist/compress/index.js +2 -2
- package/dist/compress/types.d.ts +1 -1
- package/dist/compress/types.d.ts.map +1 -1
- package/dist/cone/cone-generator.js +2 -3
- package/dist/database/_batch_update.js +1 -2
- package/dist/database/base-model.js +4 -4
- package/dist/database/db.js +4 -4
- package/dist/database/knex.js +2 -3
- package/dist/database/puri-wrapper.js +2 -3
- package/dist/database/puri.js +23 -22
- package/dist/database/puri.types.js +1 -2
- package/dist/database/transaction-context.js +1 -2
- package/dist/database/upsert-builder.js +2 -3
- package/dist/dict/en.js +2 -3
- package/dist/dict/index.js +3 -3
- package/dist/dict/ko.js +2 -3
- package/dist/dict/rc-keys.js +1 -2
- package/dist/dict/sd.js +2 -3
- package/dist/dict/sonamu-dictionary.js +7 -6
- package/dist/dict/utils.js +2 -3
- package/dist/entity/entity-manager.d.ts +66 -66
- package/dist/entity/entity-manager.js +4 -4
- package/dist/entity/entity-template-cone.js +2 -3
- package/dist/entity/entity.js +21 -18
- package/dist/env.js +1 -2
- package/dist/exceptions/error-handler.d.ts.map +1 -1
- package/dist/exceptions/error-handler.js +2 -3
- package/dist/exceptions/so-exceptions.js +2 -3
- package/dist/filter/index.js +3 -2
- package/dist/filter/types.js +1 -2
- package/dist/filter/utils.js +7 -6
- package/dist/index.js +39 -5
- package/dist/logger/category.js +2 -3
- package/dist/logger/configure.js +5 -5
- package/dist/migration/code-generation.js +23 -16
- package/dist/migration/index-where-predicate.js +2 -3
- package/dist/migration/migration-set.js +2 -3
- package/dist/migration/migrator.js +2 -3
- package/dist/migration/postgresql-schema-reader.js +6 -9
- package/dist/migration/slack-confirm.js +2 -3
- package/dist/naite/naite-reporter.js +2 -3
- package/dist/naite/naite.js +10 -8
- package/dist/runtime-type.js +2 -3
- package/dist/ssr/hmr-opt-out.js +1 -2
- package/dist/ssr/index.js +7 -4
- package/dist/ssr/registry.js +1 -2
- package/dist/ssr/renderer.js +2 -3
- package/dist/storage/base-file.js +1 -2
- package/dist/storage/buffered-file.js +2 -3
- package/dist/storage/drivers.js +1 -2
- package/dist/storage/index.js +2 -3
- package/dist/storage/s3-driver.js +1 -2
- package/dist/storage/storage-manager.js +2 -3
- package/dist/storage/uploaded-file.js +2 -3
- package/dist/stream/__tests__/ws-test-helpers.js +2 -3
- package/dist/stream/index.js +11 -2
- package/dist/stream/sse.js +1 -2
- package/dist/stream/ws-audience-resolver.js +2 -3
- package/dist/stream/ws-audience.js +1 -2
- package/dist/stream/ws-cluster-bus.js +1 -2
- package/dist/stream/ws-delivery.js +2 -3
- package/dist/stream/ws-frame.js +1 -2
- package/dist/stream/ws-local-connection-store.js +2 -3
- package/dist/stream/ws-presence-index.js +1 -2
- package/dist/stream/ws-presence-store.js +2 -3
- package/dist/stream/ws-registry.js +2 -3
- package/dist/stream/ws-session-id.js +1 -2
- package/dist/stream/ws-telemetry-memory.js +3 -4
- package/dist/stream/ws-telemetry-trace.js +1 -2
- package/dist/stream/ws-telemetry.js +2 -3
- package/dist/stream/ws.js +2 -3
- package/dist/syncer/api-parser.js +2 -3
- package/dist/syncer/checksum.js +4 -4
- package/dist/syncer/code-generator.js +4 -4
- package/dist/syncer/entity-operations.js +2 -3
- package/dist/syncer/event-batcher.js +1 -2
- package/dist/syncer/file-copy.js +2 -3
- package/dist/syncer/file-patterns.js +2 -3
- package/dist/syncer/file-tracking.js +2 -3
- package/dist/syncer/filesystem-dependencies.js +1 -2
- package/dist/syncer/index.js +8 -2
- package/dist/syncer/module-loader.js +8 -6
- package/dist/syncer/syncer-actions.js +8 -7
- package/dist/syncer/syncer.js +13 -8
- package/dist/syncer/watcher.js +2 -3
- package/dist/tasks/decorator.js +1 -2
- package/dist/tasks/step-wrapper.js +2 -3
- package/dist/tasks/workflow-manager.js +2 -3
- package/dist/template/entity-converter.js +17 -16
- package/dist/template/helpers.js +2 -3
- package/dist/template/implementations/entity.template.js +2 -3
- package/dist/template/implementations/entry-server.template.js +2 -3
- package/dist/template/implementations/generated.template.js +2 -3
- package/dist/template/implementations/generated_http.template.js +6 -6
- package/dist/template/implementations/generated_sso.template.js +2 -3
- package/dist/template/implementations/http_validators.template.js +2 -3
- package/dist/template/implementations/init_types.template.js +2 -3
- package/dist/template/implementations/model.template.js +4 -4
- package/dist/template/implementations/model_test.template.js +2 -3
- package/dist/template/implementations/queries.template.js +2 -3
- package/dist/template/implementations/sd.template.js +2 -3
- package/dist/template/implementations/services.template.js +2 -3
- package/dist/template/implementations/view_form.template.js +12 -9
- package/dist/template/implementations/view_id_all_select.template.js +2 -3
- package/dist/template/implementations/view_list.template.d.ts.map +1 -1
- package/dist/template/implementations/view_list.template.js +19 -17
- package/dist/template/implementations/view_search_input.template.js +2 -3
- package/dist/template/index.js +9 -3
- package/dist/template/template-manager.js +2 -3
- package/dist/template/template-types.js +1 -2
- package/dist/template/template.js +2 -3
- package/dist/template/zod-converter.js +54 -47
- package/dist/testing/_relation-graph.js +2 -3
- package/dist/testing/bootstrap.js +2 -3
- package/dist/testing/data-explorer.js +2 -3
- package/dist/testing/dev-test-routes.js +2 -3
- package/dist/testing/dev-vitest-manager.js +15 -12
- package/dist/testing/faker-mappings.js +1 -2
- package/dist/testing/filesystem.js +2 -3
- package/dist/testing/fixture-generator.js +2 -3
- package/dist/testing/fixture-loader.js +1 -2
- package/dist/testing/fixture-manager.js +12 -9
- package/dist/testing/global-setup.js +5 -5
- package/dist/testing/index.js +6 -3
- package/dist/testing/naite-vitest-reporter.js +1 -2
- package/dist/testing/parallel-db-manager.js +2 -3
- package/dist/testing/vitest-helpers.js +2 -3
- package/dist/tooling/__tests__/helpers/sonamu-test-root.js +2 -3
- package/dist/tooling/cdd-service.js +1 -2
- package/dist/tooling/cli-tooling.js +1 -2
- package/dist/tooling/fixture-service.js +1 -2
- package/dist/tooling/index.js +1 -2
- package/dist/tooling/test-run-client.js +2 -3
- package/dist/tsdown.api.config.js +1 -2
- package/dist/types/types.js +2 -3
- package/dist/ui/ai-api.d.ts.map +1 -1
- package/dist/ui/ai-api.js +4 -5
- package/dist/ui/ai-client.d.ts +2 -2
- package/dist/ui/ai-client.d.ts.map +1 -1
- package/dist/ui/ai-client.js +9 -8
- package/dist/ui/api.d.ts.map +1 -1
- package/dist/ui/api.js +11 -8
- package/dist/ui/async-route.js +1 -2
- package/dist/ui/cdd-service.js +22 -21
- package/dist/ui/migrations-api.js +6 -5
- package/dist/ui-web/assets/index-QDMyy31K.js +180 -0
- package/dist/ui-web/assets/index-dV7akMFB.css +1 -0
- package/dist/ui-web/index.html +2 -2
- package/dist/utils/async-utils.js +1 -2
- package/dist/utils/class-name.js +1 -2
- package/dist/utils/console-util.js +1 -2
- package/dist/utils/controller.js +2 -3
- package/dist/utils/esm-utils.js +1 -2
- package/dist/utils/fs-utils.js +2 -3
- package/dist/utils/lodash-able.js +1 -2
- package/dist/utils/model.js +1 -2
- package/dist/utils/object-utils.js +2 -3
- package/dist/utils/path-utils.js +2 -3
- package/dist/utils/process-utils.js +2 -3
- package/dist/utils/runtime-value.js +1 -2
- package/dist/utils/sql-parser.js +2 -3
- package/dist/utils/type-utils.js +8 -8
- package/dist/utils/utils.js +2 -3
- package/dist/utils/zod-error.js +2 -3
- package/dist/vector/chunking.js +1 -2
- package/dist/vector/config.js +1 -2
- package/dist/vector/embedding.js +4 -4
- package/package.json +63 -63
- package/src/ai/agents/agent.ts +1 -1
- package/src/api/__tests__/sonamu.plugins.test.ts +11 -1
- package/src/api/__tests__/sonamu.websocket.test.ts +6 -10
- package/src/api/config.ts +1 -1
- package/src/api/context.ts +2 -8
- package/src/api/sonamu.ts +26 -21
- package/src/auth/audit-log/plugin.ts +2 -0
- package/src/compress/types.ts +1 -1
- package/src/exceptions/error-handler.ts +3 -2
- package/src/template/implementations/model.template.ts +3 -3
- package/src/template/implementations/view_list.template.ts +12 -13
- package/src/ui/ai-api.ts +4 -2
- package/src/ui/ai-client.ts +2 -2
- package/src/ui/api.ts +58 -62
- package/dist/ui-web/assets/index-BMdIyKXS.css +0 -1
- package/dist/ui-web/assets/index-LpE8u19O.js +0 -178
|
@@ -9,7 +9,7 @@ import path from "path";
|
|
|
9
9
|
import { execSync } from "child_process";
|
|
10
10
|
import ts from "@typescript/typescript6";
|
|
11
11
|
import { Workbook } from "@sheetkit/node";
|
|
12
|
-
|
|
12
|
+
// src/dict/sonamu-dictionary.ts
|
|
13
13
|
/**
|
|
14
14
|
* 0-based 컬럼 인덱스를 엑셀 컬럼 문자로 변환 (0 -> "A", 25 -> "Z", 26 -> "AA")
|
|
15
15
|
*/
|
|
@@ -188,7 +188,8 @@ var init_sonamu_dictionary = __esmMin((() => {
|
|
|
188
188
|
async appendEntriesToDictFile(filePath, entries, locale, isDefaultLocale) {
|
|
189
189
|
const existingEntries = this.parseDictFile(filePath);
|
|
190
190
|
for (const entry of entries) existingEntries.push(entry);
|
|
191
|
-
const
|
|
191
|
+
const content = this.generateProjectDict(locale, existingEntries, isDefaultLocale);
|
|
192
|
+
const formatted = await formatCode(content, filePath);
|
|
192
193
|
fs.writeFileSync(filePath, formatted, "utf-8");
|
|
193
194
|
}
|
|
194
195
|
/**
|
|
@@ -255,7 +256,8 @@ var init_sonamu_dictionary = __esmMin((() => {
|
|
|
255
256
|
async saveDictFile(locale, entries, isDefaultLocale) {
|
|
256
257
|
const i18nDir = this.ensureI18nDir();
|
|
257
258
|
const dictPath = path.join(i18nDir, `${locale}.ts`);
|
|
258
|
-
const
|
|
259
|
+
const content = this.generateProjectDict(locale, entries, isDefaultLocale);
|
|
260
|
+
const formatted = await formatCode(content, dictPath);
|
|
259
261
|
fs.writeFileSync(dictPath, formatted, "utf-8");
|
|
260
262
|
}
|
|
261
263
|
/**
|
|
@@ -715,7 +717,7 @@ var init_sonamu_dictionary = __esmMin((() => {
|
|
|
715
717
|
for (const searchPath of searchPaths) for (const pattern of patterns) try {
|
|
716
718
|
const result = execSync(`${sgPath} --pattern '${pattern}' --json ${searchPath}`, {
|
|
717
719
|
encoding: "utf-8",
|
|
718
|
-
maxBuffer:
|
|
720
|
+
maxBuffer: 52428800
|
|
719
721
|
});
|
|
720
722
|
if (result.trim()) {
|
|
721
723
|
const matches = JSON.parse(result);
|
|
@@ -742,8 +744,7 @@ var init_sonamu_dictionary = __esmMin((() => {
|
|
|
742
744
|
};
|
|
743
745
|
sonamuDictionary = new SonamuDictionary();
|
|
744
746
|
}));
|
|
745
|
-
//#endregion
|
|
746
747
|
init_sonamu_dictionary();
|
|
747
748
|
export { SonamuDictionary, init_sonamu_dictionary, sonamuDictionary };
|
|
748
749
|
|
|
749
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic29uYW11LWRpY3Rpb25hcnkuanMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vLi4vc3JjL2RpY3Qvc29uYW11LWRpY3Rpb25hcnkudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgZXhlY1N5bmMgfSBmcm9tIFwiY2hpbGRfcHJvY2Vzc1wiO1xuaW1wb3J0IGZzIGZyb20gXCJmc1wiO1xuaW1wb3J0IHBhdGggZnJvbSBcInBhdGhcIjtcblxuaW1wb3J0IHsgV29ya2Jvb2sgfSBmcm9tIFwiQHNoZWV0a2l0L25vZGVcIjtcbmltcG9ydCB0cyBmcm9tIFwiQHR5cGVzY3JpcHQvdHlwZXNjcmlwdDZcIjtcblxuaW1wb3J0IHsgU29uYW11IH0gZnJvbSBcIi4uL2FwaS9zb25hbXVcIjtcbmltcG9ydCB7IGZvcm1hdENvZGUgfSBmcm9tIFwiLi4vY29kZS1mb3JtYXR0aW5nXCI7XG5pbXBvcnQgeyBFbnRpdHlNYW5hZ2VyIH0gZnJvbSBcIi4uL2VudGl0eS9lbnRpdHktbWFuYWdlclwiO1xuaW1wb3J0IHsgQmFkUmVxdWVzdEV4Y2VwdGlvbiB9IGZyb20gXCIuLi9leGNlcHRpb25zL3NvLWV4Y2VwdGlvbnNcIjtcbmltcG9ydCB7IFNEIH0gZnJvbSBcIi4vc2RcIjtcbmltcG9ydCB7XG4gIHR5cGUgRGljdEVudHJ5LFxuICB0eXBlIERpY3Rpb25hcnlSZXN1bHQsXG4gIHR5cGUgRGljdGlvbmFyeVJvdyxcbiAgdHlwZSBFbnRpdHlLZXlJbmZvLFxuICB0eXBlIEkxOG5Db25maWcsXG4gIHR5cGUgSW1wb3J0UmVzdWx0LFxuICB0eXBlIFVzYWdlUmVzdWx0LFxufSBmcm9tIFwiLi90eXBlc1wiO1xuXG4vKipcbiAqIDAtYmFzZWQg7Lus65+8IOyduOuNseyKpOulvCDsl5HshYAg7Lus65+8IOusuOyekOuhnCDrs4DtmZggKDAgLT4gXCJBXCIsIDI1IC0+IFwiWlwiLCAyNiAtPiBcIkFBXCIpXG4gKi9cbmZ1bmN0aW9uIGNvbExldHRlcihpbmRleDogbnVtYmVyKTogc3RyaW5nIHtcbiAgbGV0IHJlc3VsdCA9IFwiXCI7XG4gIGxldCBuID0gaW5kZXg7XG4gIHdoaWxlIChuID49IDApIHtcbiAgICByZXN1bHQgPSBTdHJpbmcuZnJvbUNoYXJDb2RlKDY1ICsgKG4gJSAyNikpICsgcmVzdWx0O1xuICAgIG4gPSBNYXRoLmZsb29yKG4gLyAyNikgLSAxO1xuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbi8qKlxuICogU29uYW11IERpY3Rpb25hcnkg6rSA66asIO2BtOuemOyKpFxuICogaTE4biDrlJXshZTrhIjrpqzsnZggQ1JVRCDrsI8gRXhjZWwgaW1wb3J0L2V4cG9ydOulvCDri7Tri7ntlanri4jri6QuXG4gKi9cbmV4cG9ydCBjbGFzcyBTb25hbXVEaWN0aW9uYXJ5IHtcbiAgLyoqXG4gICAqIFR5cGVTY3JpcHQgQ29tcGlsZXIgQVBJ66W8IOyCrOyaqe2VmOyXrCBkaWN0IO2MjOydvCDtjIzsi7FcbiAgICpcbiAgICog7KeA7JuQIO2MqO2EtDpcbiAgICogLSBleHBvcnQgZGVmYXVsdCB7IC4uLiB9IGFzIGNvbnN0O1xuICAgKiAtIGV4cG9ydCBkZWZhdWx0IGRlZmluZUxvY2FsZSh7IC4uLiB9KTtcbiAgICogLSDrrLjsnpDsl7Qg6rCSOiBcImtleVwiOiBcInZhbHVlXCIg65iQ64qUIGtleTogYHZhbHVlYFxuICAgKiAtIO2VqOyImCDqsJI6IFwia2V5XCI6IChwYXJhbTogVHlwZSkgPT4gYHRlbXBsYXRlYFxuICAgKi9cbiAgcGFyc2VEaWN0RmlsZShmaWxlUGF0aDogc3RyaW5nKTogRGljdEVudHJ5W10ge1xuICAgIGNvbnN0IGNvbnRlbnQgPSBmcy5yZWFkRmlsZVN5bmMoZmlsZVBhdGgsIFwidXRmLThcIik7XG4gICAgY29uc3Qgc291cmNlRmlsZSA9IHRzLmNyZWF0ZVNvdXJjZUZpbGUoZmlsZVBhdGgsIGNvbnRlbnQsIHRzLlNjcmlwdFRhcmdldC5MYXRlc3QsIHRydWUpO1xuXG4gICAgY29uc3QgZW50cmllczogRGljdEVudHJ5W10gPSBbXTtcblxuICAgIHRzLmZvckVhY2hDaGlsZChzb3VyY2VGaWxlLCAobm9kZSkgPT4ge1xuICAgICAgaWYgKHRzLmlzRXhwb3J0QXNzaWdubWVudChub2RlKSkge1xuICAgICAgICBjb25zdCBvYmplY3RMaXRlcmFsID0gdGhpcy51bndyYXBUb09iamVjdExpdGVyYWwobm9kZS5leHByZXNzaW9uKTtcbiAgICAgICAgaWYgKG9iamVjdExpdGVyYWwpIHtcbiAgICAgICAgICB0aGlzLmV4dHJhY3RFbnRyaWVzRnJvbU9iamVjdChvYmplY3RMaXRlcmFsLCBzb3VyY2VGaWxlLCBlbnRyaWVzKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuXG4gICAgcmV0dXJuIGVudHJpZXM7XG4gIH1cblxuICAvKipcbiAgICog7YyM7J287JeQ7IScIO2KueyglSDsnbTrpoTsnZggY29uc3Qg7ISg7Ja47J2EIOywvuyVhCBPYmplY3RMaXRlcmFsIO2MjOyLsVxuICAgKiDsmIg6IGNvbnN0IGVudGl0eUxhYmVscyA9IHsgLi4uIH0gYXMgY29uc3Q7XG4gICAqL1xuICBwYXJzZUNvbnN0T2JqZWN0RGVjbGFyYXRpb24oZmlsZVBhdGg6IHN0cmluZywgdmFyTmFtZTogc3RyaW5nKTogRGljdEVudHJ5W10ge1xuICAgIGNvbnN0IGNvbnRlbnQgPSBmcy5yZWFkRmlsZVN5bmMoZmlsZVBhdGgsIFwidXRmLThcIik7XG4gICAgY29uc3Qgc291cmNlRmlsZSA9IHRzLmNyZWF0ZVNvdXJjZUZpbGUoZmlsZVBhdGgsIGNvbnRlbnQsIHRzLlNjcmlwdFRhcmdldC5MYXRlc3QsIHRydWUpO1xuXG4gICAgY29uc3QgZW50cmllczogRGljdEVudHJ5W10gPSBbXTtcblxuICAgIHRzLmZvckVhY2hDaGlsZChzb3VyY2VGaWxlLCAobm9kZSkgPT4ge1xuICAgICAgaWYgKHRzLmlzVmFyaWFibGVTdGF0ZW1lbnQobm9kZSkpIHtcbiAgICAgICAgZm9yIChjb25zdCBkZWNsIG9mIG5vZGUuZGVjbGFyYXRpb25MaXN0LmRlY2xhcmF0aW9ucykge1xuICAgICAgICAgIGlmICh0cy5pc0lkZW50aWZpZXIoZGVjbC5uYW1lKSAmJiBkZWNsLm5hbWUudGV4dCA9PT0gdmFyTmFtZSAmJiBkZWNsLmluaXRpYWxpemVyKSB7XG4gICAgICAgICAgICBjb25zdCBvYmplY3RMaXRlcmFsID0gdGhpcy51bndyYXBUb09iamVjdExpdGVyYWwoZGVjbC5pbml0aWFsaXplcik7XG4gICAgICAgICAgICBpZiAob2JqZWN0TGl0ZXJhbCkge1xuICAgICAgICAgICAgICB0aGlzLmV4dHJhY3RFbnRyaWVzRnJvbU9iamVjdChvYmplY3RMaXRlcmFsLCBzb3VyY2VGaWxlLCBlbnRyaWVzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHJldHVybiBlbnRyaWVzO1xuICB9XG5cbiAgLyoqXG4gICAqIOusuOyekOyXtOydtCDtmZTsgrTtkZwg7ZWo7IiYIOuYkOuKlCDtlajsiJgg7ZGc7ZiE7Iud7J247KeAIO2MkOuzhFxuICAgKi9cbiAgaXNFeHByZXNzaW9uRnVuY3Rpb24oY29kZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgLy8g67mIIOusuOyekOyXtOydtOuCmCDqs7XrsLHrp4wg7J6I64qUIOqyveyasFxuICAgIGlmICghY29kZS50cmltKCkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBjb25zdCBBUlJPV19GVU5DVElPTl9QQVRURVJOID0gL15cXHMqXFwoW14pXSpcXClcXHMqPT4vO1xuXG4gICAgcmV0dXJuIEFSUk9XX0ZVTkNUSU9OX1BBVFRFUk4udGVzdChjb2RlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBleHBvcnQgZGVmYXVsdCDtkZztmITsi53sl5DshJwgT2JqZWN0TGl0ZXJhbEV4cHJlc3Npb24g7LaU7LacXG4gICAqIC0gYXMgY29uc3Qg7LKY66asXG4gICAqIC0gZGVmaW5lTG9jYWxlKHsgLi4uIH0pIO2YuOy2nCDsspjrpqxcbiAgICovXG4gIHByaXZhdGUgdW53cmFwVG9PYmplY3RMaXRlcmFsKGV4cHI6IHRzLkV4cHJlc3Npb24pOiB0cy5PYmplY3RMaXRlcmFsRXhwcmVzc2lvbiB8IG51bGwge1xuICAgIC8vIGFzIGNvbnN0IOyymOumrFxuICAgIGlmICh0cy5pc0FzRXhwcmVzc2lvbihleHByKSkge1xuICAgICAgcmV0dXJuIHRoaXMudW53cmFwVG9PYmplY3RMaXRlcmFsKGV4cHIuZXhwcmVzc2lvbik7XG4gICAgfVxuICAgIC8vIOyngeygkSDqsJ3ssrQg66as7YSw65+0XG4gICAgaWYgKHRzLmlzT2JqZWN0TGl0ZXJhbEV4cHJlc3Npb24oZXhwcikpIHtcbiAgICAgIHJldHVybiBleHByO1xuICAgIH1cbiAgICAvLyBkZWZpbmVMb2NhbGUoeyAuLi4gfSkg7Zi47LacXG4gICAgaWYgKHRzLmlzQ2FsbEV4cHJlc3Npb24oZXhwcikpIHtcbiAgICAgIGNvbnN0IGZpcnN0QXJnID0gZXhwci5hcmd1bWVudHNbMF07XG4gICAgICBpZiAoZmlyc3RBcmcgJiYgdHMuaXNPYmplY3RMaXRlcmFsRXhwcmVzc2lvbihmaXJzdEFyZykpIHtcbiAgICAgICAgcmV0dXJuIGZpcnN0QXJnO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBPYmplY3RMaXRlcmFsRXhwcmVzc2lvbuyXkOyEnCBEaWN0RW50cnkg7LaU7LacXG4gICAqL1xuICBwcml2YXRlIGV4dHJhY3RFbnRyaWVzRnJvbU9iamVjdChcbiAgICBvYmplY3RMaXRlcmFsOiB0cy5PYmplY3RMaXRlcmFsRXhwcmVzc2lvbixcbiAgICBzb3VyY2VGaWxlOiB0cy5Tb3VyY2VGaWxlLFxuICAgIGVudHJpZXM6IERpY3RFbnRyeVtdLFxuICApOiB2b2lkIHtcbiAgICBmb3IgKGNvbnN0IHByb3Agb2Ygb2JqZWN0TGl0ZXJhbC5wcm9wZXJ0aWVzKSB7XG4gICAgICBjb25zdCBlbnRyeSA9IHRoaXMuZXh0cmFjdERpY3RFbnRyeShwcm9wLCBzb3VyY2VGaWxlKTtcbiAgICAgIGlmIChlbnRyeSkge1xuICAgICAgICBlbnRyaWVzLnB1c2goZW50cnkpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBQcm9wZXJ0eU5hbWXsl5DshJwg7YKkIOusuOyekOyXtCDstpTstpxcbiAgICogLSDrrLjsnpDsl7Qg66as7YSw65+0OiBcImtleVwiXG4gICAqIC0g7Iud67OE7J6QOiBrZXkgKHVucXVvdGVkKVxuICAgKi9cbiAgcHJpdmF0ZSBnZXRQcm9wZXJ0eUtleShuYW1lOiB0cy5Qcm9wZXJ0eU5hbWUpOiBzdHJpbmcgfCBudWxsIHtcbiAgICBpZiAodHMuaXNTdHJpbmdMaXRlcmFsKG5hbWUpKSB7XG4gICAgICByZXR1cm4gbmFtZS50ZXh0O1xuICAgIH1cbiAgICBpZiAodHMuaXNJZGVudGlmaWVyKG5hbWUpKSB7XG4gICAgICByZXR1cm4gbmFtZS50ZXh0O1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiDtlITroZztjbzti7Dsl5DshJwgRGljdEVudHJ5IOy2lOy2nFxuICAgKiAtIOusuOyekOyXtDog7Iuk7KCcIOusuOyekOyXtCDqsJJcbiAgICogLSDtlajsiJg6IOybkOuzuCDshozsiqQgKOyXrOufrCDspITsnYAg7ZWcIOykhOuhnCDsoJXqt5ztmZQpXG4gICAqL1xuICBwcml2YXRlIGV4dHJhY3REaWN0RW50cnkoXG4gICAgcHJvcDogdHMuT2JqZWN0TGl0ZXJhbEVsZW1lbnRMaWtlLFxuICAgIHNvdXJjZUZpbGU6IHRzLlNvdXJjZUZpbGUsXG4gICk6IERpY3RFbnRyeSB8IG51bGwge1xuICAgIGlmICghdHMuaXNQcm9wZXJ0eUFzc2lnbm1lbnQocHJvcCkpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGNvbnN0IGtleSA9IHRoaXMuZ2V0UHJvcGVydHlLZXkocHJvcC5uYW1lKTtcbiAgICBpZiAoIWtleSkgcmV0dXJuIG51bGw7XG5cbiAgICBjb25zdCBpbml0ID0gcHJvcC5pbml0aWFsaXplcjtcblxuICAgIC8vIO2ZlOyCtO2RnCDtlajsiJhcbiAgICBpZiAodHMuaXNBcnJvd0Z1bmN0aW9uKGluaXQpKSB7XG4gICAgICBjb25zdCBmdW5jVGV4dCA9IGluaXQuZ2V0VGV4dChzb3VyY2VGaWxlKTtcbiAgICAgIGNvbnN0IG5vcm1hbGl6ZWQgPSBmdW5jVGV4dC5yZXBsYWNlKC9cXHMqXFxuXFxzKi9nLCBcIiBcIikudHJpbSgpO1xuICAgICAgcmV0dXJuIHsga2V5LCB2YWx1ZTogbm9ybWFsaXplZCwgaXNGdW5jdGlvbjogdHJ1ZSB9O1xuICAgIH1cblxuICAgIC8vIOusuOyekOyXtCDrpqzthLDrn7RcbiAgICBpZiAodHMuaXNTdHJpbmdMaXRlcmFsKGluaXQpKSB7XG4gICAgICByZXR1cm4geyBrZXksIHZhbHVlOiBpbml0LnRleHQsIGlzRnVuY3Rpb246IGZhbHNlIH07XG4gICAgfVxuXG4gICAgLy8g7YWc7ZSM66a/IOumrO2EsOuftCAo67OA7IiYIOyXhuydjClcbiAgICBpZiAodHMuaXNOb1N1YnN0aXR1dGlvblRlbXBsYXRlTGl0ZXJhbChpbml0KSkge1xuICAgICAgcmV0dXJuIHsga2V5LCB2YWx1ZTogaW5pdC50ZXh0LCBpc0Z1bmN0aW9uOiBmYWxzZSB9O1xuICAgIH1cblxuICAgIC8vIOq4sO2DgCAo7JiIOiDtlajsiJgg7ZGc7ZiE7IudKVxuICAgIHJldHVybiB7XG4gICAgICBrZXksXG4gICAgICB2YWx1ZTogaW5pdC5nZXRUZXh0KHNvdXJjZUZpbGUpLFxuICAgICAgaXNGdW5jdGlvbjogdHMuaXNGdW5jdGlvbkV4cHJlc3Npb24oaW5pdCksXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiDtlITroZzsoJ3tirjsnZggaTE4biBkaWN0IO2MjOydvCDqsr3roZzrpbwg67CY7ZmY7ZWp64uI64ukLlxuICAgKiBAcGFyYW0gbG9jYWxlIC0g66Gc7LyA7J28IChrbywgZW4g65OxKVxuICAgKiBAcGFyYW0gdGFyZ2V0IC0g7YOA6rKfIOuUlOugie2GoOumrCAoYXBpLCB3ZWIsIGFwcClcbiAgICovXG4gIGdldFByb2plY3REaWN0UGF0aChsb2NhbGU6IHN0cmluZywgdGFyZ2V0OiBcImFwaVwiIHwgXCJ3ZWJcIiB8IFwiYXBwXCIgPSBcImFwaVwiKTogc3RyaW5nIHtcbiAgICBjb25zdCBkaXIgPSB0YXJnZXQgPT09IFwiYXBpXCIgPyBTb25hbXUuY29uZmlnLmFwaS5kaXIgOiB0YXJnZXQ7XG4gICAgcmV0dXJuIHBhdGguam9pbihTb25hbXUuYXBwUm9vdFBhdGgsIGRpciwgXCJzcmNcIiwgXCJpMThuXCIsIGAke2xvY2FsZX0udHNgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBzb25hbXUg64K07J6lIGRpY3Qg7YyM7J28IOqyveuhnOulvCDrsJjtmZjtlanri4jri6QuXG4gICAqL1xuICBwcml2YXRlIGdldFNvbmFtdURpY3RQYXRoKGxvY2FsZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBjb25zdCBwYWNrYWdlUm9vdCA9IHBhdGgucmVzb2x2ZShpbXBvcnQubWV0YS5kaXJuYW1lLCBcIi4uXCIsIFwiLi5cIik7XG4gICAgcmV0dXJuIHBhdGguam9pbihwYWNrYWdlUm9vdCwgXCJzcmNcIiwgXCJkaWN0XCIsIGAke2xvY2FsZX0udHNgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDtlYTsmpTtlZwgZGljdCDtgqTqsIAg7ZSE66Gc7KCd7Yq47JeQIOyhtOyerO2VmOuKlOyngCDtmZXsnbjtlZjqs6AsIOyXhuycvOuptCDstpTqsIDtlanri4jri6QuXG4gICAqIGRlZmF1bHRMb2NhbGXsl5Drp4wg7LaU6rCA7ZWY66mwLCDri6TrpbggbG9jYWxl7J2AIOyCrOyaqeyekOqwgCDsp4HsoJEg67KI7Jet7ZW07JW8IO2VqeuLiOuLpC5cbiAgICpcbiAgICogQHBhcmFtIHJlcXVpcmVkS2V5cyAtIO2VhOyalO2VnCDtgqQg66qp66GdXG4gICAqIEBwYXJhbSB0YXJnZXQgLSDtg4Dqsp8g65SU66CJ7Yag66asIChhcGksIHdlYiwgYXBwKVxuICAgKiBAcmV0dXJucyDstpTqsIDrkJwg7YKkIOuqqeuhnVxuICAgKi9cbiAgYXN5bmMgZW5zdXJlRGljdEtleXMoXG4gICAgcmVxdWlyZWRLZXlzOiBzdHJpbmdbXSxcbiAgICB0YXJnZXQ6IFwiYXBpXCIgfCBcIndlYlwiIHwgXCJhcHBcIiA9IFwiYXBpXCIsXG4gICk6IFByb21pc2U8c3RyaW5nW10+IHtcbiAgICBjb25zdCB7IGRlZmF1bHRMb2NhbGUgfSA9IFNvbmFtdS5jb25maWcuaTE4bjtcbiAgICBjb25zdCBwcm9qZWN0RGljdFBhdGggPSB0aGlzLmdldFByb2plY3REaWN0UGF0aChkZWZhdWx0TG9jYWxlLCB0YXJnZXQpO1xuXG4gICAgLy8g7ZSE66Gc7KCd7Yq4IGRpY3Qg7YyM7J287J20IOyXhuycvOuptCDslYTrrLTqsoPrj4Qg7ZWY7KeAIOyViuydjFxuICAgIGlmICghZnMuZXhpc3RzU3luYyhwcm9qZWN0RGljdFBhdGgpKSB7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuXG4gICAgLy8g7ZSE66Gc7KCd7Yq4IGRpY3Tsl5DshJwg6riw7KG0IO2CpCDtjIzsi7FcbiAgICBjb25zdCBwcm9qZWN0RW50cmllcyA9IHRoaXMucGFyc2VEaWN0RmlsZShwcm9qZWN0RGljdFBhdGgpO1xuICAgIGNvbnN0IGV4aXN0aW5nS2V5cyA9IG5ldyBTZXQocHJvamVjdEVudHJpZXMubWFwKChlKSA9PiBlLmtleSkpO1xuXG4gICAgLy8g64iE652965CcIO2CpCDssL7quLBcbiAgICBjb25zdCBtaXNzaW5nS2V5cyA9IHJlcXVpcmVkS2V5cy5maWx0ZXIoKGtleSkgPT4gIWV4aXN0aW5nS2V5cy5oYXMoa2V5KSk7XG5cbiAgICBpZiAobWlzc2luZ0tleXMubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuXG4gICAgLy8gc29uYW11IGRpY3Tsl5DshJwg6riw67O46rCSIOqwgOyguOyYpOq4sFxuICAgIGNvbnN0IHNvbmFtdURpY3RQYXRoID0gdGhpcy5nZXRTb25hbXVEaWN0UGF0aChkZWZhdWx0TG9jYWxlKTtcbiAgICBpZiAoIWZzLmV4aXN0c1N5bmMoc29uYW11RGljdFBhdGgpKSB7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuXG4gICAgY29uc3Qgc29uYW11RW50cmllcyA9IHRoaXMucGFyc2VEaWN0RmlsZShzb25hbXVEaWN0UGF0aCk7XG4gICAgY29uc3Qgc29uYW11RGljdCA9IG5ldyBNYXAoc29uYW11RW50cmllcy5tYXAoKGUpID0+IFtlLmtleSwgZV0pKTtcblxuICAgIC8vIOy2lOqwgO2VoCDsl5Ttirjrpqwg7IOd7ISxXG4gICAgY29uc3QgZW50cmllc1RvQWRkID0gbWlzc2luZ0tleXNcbiAgICAgIC5tYXAoKGtleSkgPT4gc29uYW11RGljdC5nZXQoa2V5KSlcbiAgICAgIC5maWx0ZXIoKGVudHJ5KTogZW50cnkgaXMgTm9uTnVsbGFibGU8dHlwZW9mIGVudHJ5PiA9PiBlbnRyeSAhPT0gdW5kZWZpbmVkKTtcblxuICAgIGlmIChlbnRyaWVzVG9BZGQubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuXG4gICAgLy8g7ZSE66Gc7KCd7Yq4IGRpY3Qg7YyM7J287JeQIOy2lOqwgFxuICAgIGF3YWl0IHRoaXMuYXBwZW5kRW50cmllc1RvRGljdEZpbGUocHJvamVjdERpY3RQYXRoLCBlbnRyaWVzVG9BZGQsIGRlZmF1bHRMb2NhbGUsIHRydWUpO1xuXG4gICAgcmV0dXJuIGVudHJpZXNUb0FkZC5tYXAoKGUpID0+IGUua2V5KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBkaWN0IO2MjOydvOyXkCDsl5Ttirjrpqzrpbwg7LaU6rCA7ZWp64uI64ukLlxuICAgKiDquLDsobQg7YyM7J287J2EIO2MjOyLse2VmOqzoCwg7IOIIOyXlO2KuOumrOulvCDstpTqsIDtlZwg65KkLCDsoITssrQg7YyM7J287J2EIOyerOyDneyEse2VqeuLiOuLpC5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgYXBwZW5kRW50cmllc1RvRGljdEZpbGUoXG4gICAgZmlsZVBhdGg6IHN0cmluZyxcbiAgICBlbnRyaWVzOiBEaWN0RW50cnlbXSxcbiAgICBsb2NhbGU6IHN0cmluZyxcbiAgICBpc0RlZmF1bHRMb2NhbGU6IGJvb2xlYW4sXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIC8vIOq4sOyhtCBlbnRyaWVzIO2MjOyLsVxuICAgIGNvbnN0IGV4aXN0aW5nRW50cmllcyA9IHRoaXMucGFyc2VEaWN0RmlsZShmaWxlUGF0aCk7XG5cbiAgICAvLyDsg4ggZW50cmllcyDstpTqsIBcbiAgICBmb3IgKGNvbnN0IGVudHJ5IG9mIGVudHJpZXMpIHtcbiAgICAgIGV4aXN0aW5nRW50cmllcy5wdXNoKGVudHJ5KTtcbiAgICB9XG5cbiAgICAvLyDtjIzsnbwg7J6s7IOd7ISxXG4gICAgY29uc3QgY29udGVudCA9IHRoaXMuZ2VuZXJhdGVQcm9qZWN0RGljdChsb2NhbGUsIGV4aXN0aW5nRW50cmllcywgaXNEZWZhdWx0TG9jYWxlKTtcbiAgICBjb25zdCBmb3JtYXR0ZWQgPSBhd2FpdCBmb3JtYXRDb2RlKGNvbnRlbnQsIGZpbGVQYXRoKTtcbiAgICBmcy53cml0ZUZpbGVTeW5jKGZpbGVQYXRoLCBmb3JtYXR0ZWQsIFwidXRmLThcIik7XG4gIH1cblxuICAvKipcbiAgICog7ZWo7IiYIOqwkuuTpOyXkOyEnCDsgqzsmqnrkJjripQg7Zes7Y28IO2VqOyImOulvCDqsJDsp4Dtlanri4jri6QuXG4gICAqL1xuICBwcml2YXRlIGRldGVjdFVzZWRIZWxwZXJzKGVudHJpZXM6IERpY3RFbnRyeVtdKSB7XG4gICAgY29uc3QgZnVuY3Rpb25FbnRyaWVzID0gZW50cmllcy5maWx0ZXIoKGUpID0+IGUuaXNGdW5jdGlvbik7XG4gICAgY29uc3QgaGVscGVyczogc3RyaW5nW10gPSBbXTtcblxuICAgIGZvciAoY29uc3QgaGVscGVyIG9mIFtcInBsdXJhbFwiLCBcImpvc2FcIl0pIHtcbiAgICAgIC8vIO2VqOyImOuqheydtCDri6jslrQg6rK96rOE66GcIOyCrOyaqeuQmOuKlOyngCDtmZXsnbggKOyYiDogcGx1cmFsKCDrmJDripQgcGx1cmFsLClcbiAgICAgIGNvbnN0IHBhdHRlcm4gPSBuZXcgUmVnRXhwKGBcXFxcYiR7aGVscGVyfVxcXFxzKlxcXFwoYCk7XG4gICAgICBpZiAoZnVuY3Rpb25FbnRyaWVzLnNvbWUoKGUpID0+IHBhdHRlcm4udGVzdChlLnZhbHVlKSkpIHtcbiAgICAgICAgaGVscGVycy5wdXNoKGhlbHBlcik7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gZm9ybWF0IOyCrOyaqSDsl6zrtoAg67OE64+EIOqwkOyngCAoZm9ybWF0Lm51bWJlciguLi4pLCBmb3JtYXQuZGF0ZSguLi4pIOuTsSlcbiAgICBjb25zdCBmb3JtYXRQYXR0ZXJuID0gL1xcYmZvcm1hdFxcLlxcdytcXHMqXFwoLztcbiAgICBjb25zdCB1c2VzRm9ybWF0ID0gZnVuY3Rpb25FbnRyaWVzLnNvbWUoKGUpID0+IGZvcm1hdFBhdHRlcm4udGVzdChlLnZhbHVlKSk7XG5cbiAgICByZXR1cm4geyBoZWxwZXJzLCB1c2VzRm9ybWF0IH07XG4gIH1cblxuICAvKipcbiAgICogUHJvamVjdCBkaWN0IO2MjOydvCDsg53shLFcbiAgICovXG4gIGdlbmVyYXRlUHJvamVjdERpY3QobG9jYWxlOiBzdHJpbmcsIGVudHJpZXM6IERpY3RFbnRyeVtdLCBpc0RlZmF1bHRMb2NhbGU6IGJvb2xlYW4pOiBzdHJpbmcge1xuICAgIC8vIGtleSDslYztjIzrsrMg7IicIOygleugrFxuICAgIGNvbnN0IHNvcnRlZCA9IFsuLi5lbnRyaWVzXS50b1NvcnRlZCgoYSwgYikgPT4gYS5rZXkubG9jYWxlQ29tcGFyZShiLmtleSkpO1xuXG4gICAgY29uc3QgbGluZXM6IHN0cmluZ1tdID0gW107XG5cbiAgICAvLyDtlajsiJgg6rCS7JeQ7IScIOyCrOyaqeuQmOuKlCDtl6ztjbwg7ZWo7IiYIOqwkOyngFxuICAgIGNvbnN0IHsgaGVscGVycywgdXNlc0Zvcm1hdCB9ID0gdGhpcy5kZXRlY3RVc2VkSGVscGVycyhlbnRyaWVzKTtcblxuICAgIC8vIO2XrO2NvCDtlajsiJggaW1wb3J0IOy2lOqwgFxuICAgIGNvbnN0IGltcG9ydHMgPSBbLi4uaGVscGVyc107XG4gICAgaWYgKHVzZXNGb3JtYXQpIHtcbiAgICAgIGltcG9ydHMucHVzaChcImNyZWF0ZUZvcm1hdFwiKTtcbiAgICB9XG4gICAgaWYgKGltcG9ydHMubGVuZ3RoID4gMCkge1xuICAgICAgbGluZXMucHVzaChgaW1wb3J0IHsgJHtpbXBvcnRzLmpvaW4oXCIsIFwiKX0gfSBmcm9tIFwic29uYW11L2RpY3RcIjtgKTtcbiAgICB9XG5cbiAgICBpZiAoIWlzRGVmYXVsdExvY2FsZSkge1xuICAgICAgbGluZXMucHVzaCgnaW1wb3J0IHsgZGVmaW5lTG9jYWxlIH0gZnJvbSBcIi4vc2QuZ2VuZXJhdGVkXCI7Jyk7XG4gICAgfVxuXG4gICAgaWYgKGltcG9ydHMubGVuZ3RoID4gMCB8fCAhaXNEZWZhdWx0TG9jYWxlKSB7XG4gICAgICBsaW5lcy5wdXNoKFwiXCIpO1xuICAgIH1cblxuICAgIC8vIGZvcm1hdCDsgqzsmqkg7IucIGNyZWF0ZUZvcm1hdCDtmLjstpwg7LaU6rCAXG4gICAgaWYgKHVzZXNGb3JtYXQpIHtcbiAgICAgIGxpbmVzLnB1c2goYGNvbnN0IGZvcm1hdCA9IGNyZWF0ZUZvcm1hdChcIiR7bG9jYWxlfVwiKTtgKTtcbiAgICAgIGxpbmVzLnB1c2goXCJcIik7XG4gICAgfVxuXG4gICAgbGluZXMucHVzaChcIi8qKlwiKTtcbiAgICBsaW5lcy5wdXNoKGAgKiBQcm9qZWN0ICR7bG9jYWxlLnRvVXBwZXJDYXNlKCl9IERpY3Rpb25hcnlgKTtcbiAgICBsaW5lcy5wdXNoKFwiICovXCIpO1xuXG4gICAgaWYgKGlzRGVmYXVsdExvY2FsZSkge1xuICAgICAgbGluZXMucHVzaChcImV4cG9ydCBkZWZhdWx0IHtcIik7XG4gICAgfSBlbHNlIHtcbiAgICAgIGxpbmVzLnB1c2goXCJleHBvcnQgZGVmYXVsdCBkZWZpbmVMb2NhbGUoe1wiKTtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IGVudHJ5IG9mIHNvcnRlZCkge1xuICAgICAgaWYgKGVudHJ5LmlzRnVuY3Rpb24pIHtcbiAgICAgICAgLy8g7ZWo7IiY7J24IOqyveyasDog7JuQ7ZiVIOq3uOuMgOuhnCDstpzroKVcbiAgICAgICAgbGluZXMucHVzaChgICBcIiR7ZW50cnkua2V5fVwiOiAke2VudHJ5LnZhbHVlfSxgKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGxpbmVzLnB1c2goYCAgXCIke2VudHJ5LmtleX1cIjogJHtKU09OLnN0cmluZ2lmeShlbnRyeS52YWx1ZSl9LGApO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChpc0RlZmF1bHRMb2NhbGUpIHtcbiAgICAgIGxpbmVzLnB1c2goXCJ9IGFzIGNvbnN0O1wiKTtcbiAgICB9IGVsc2Uge1xuICAgICAgbGluZXMucHVzaChcIn0pO1wiKTtcbiAgICB9XG4gICAgbGluZXMucHVzaChcIlwiKTtcblxuICAgIHJldHVybiBsaW5lcy5qb2luKFwiXFxuXCIpO1xuICB9XG5cbiAgLyoqXG4gICAqIGkxOG4g7ISk7KCV7J2EIOqwgOyguOyYteuLiOuLpC5cbiAgICovXG4gIHByaXZhdGUgZ2V0STE4bkNvbmZpZygpOiBJMThuQ29uZmlnIHtcbiAgICByZXR1cm4gU29uYW11LmNvbmZpZy5pMThuO1xuICB9XG5cbiAgLyoqXG4gICAqIGkxOG4g65SU66CJ7Yag66asIOqyveuhnOulvCDrsJjtmZjtlZjqs6AsIOyXhuycvOuptCDsg53shLHtlanri4jri6QuXG4gICAqL1xuICBwcml2YXRlIGVuc3VyZUkxOG5EaXIoKTogc3RyaW5nIHtcbiAgICBjb25zdCBpMThuRGlyID0gcGF0aC5qb2luKFNvbmFtdS5hcGlSb290UGF0aCwgXCJzcmNcIiwgXCJpMThuXCIpO1xuICAgIGlmICghZnMuZXhpc3RzU3luYyhpMThuRGlyKSkge1xuICAgICAgZnMubWtkaXJTeW5jKGkxOG5EaXIsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgIH1cbiAgICByZXR1cm4gaTE4bkRpcjtcbiAgfVxuXG4gIC8qKlxuICAgKiBkaWN0IO2MjOydvOydhCDsoIDsnqXtlanri4jri6QuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHNhdmVEaWN0RmlsZShcbiAgICBsb2NhbGU6IHN0cmluZyxcbiAgICBlbnRyaWVzOiBEaWN0RW50cnlbXSxcbiAgICBpc0RlZmF1bHRMb2NhbGU6IGJvb2xlYW4sXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGkxOG5EaXIgPSB0aGlzLmVuc3VyZUkxOG5EaXIoKTtcbiAgICBjb25zdCBkaWN0UGF0aCA9IHBhdGguam9pbihpMThuRGlyLCBgJHtsb2NhbGV9LnRzYCk7XG4gICAgY29uc3QgY29udGVudCA9IHRoaXMuZ2VuZXJhdGVQcm9qZWN0RGljdChsb2NhbGUsIGVudHJpZXMsIGlzRGVmYXVsdExvY2FsZSk7XG4gICAgY29uc3QgZm9ybWF0dGVkID0gYXdhaXQgZm9ybWF0Q29kZShjb250ZW50LCBkaWN0UGF0aCk7XG4gICAgZnMud3JpdGVGaWxlU3luYyhkaWN0UGF0aCwgZm9ybWF0dGVkLCBcInV0Zi04XCIpO1xuICB9XG5cbiAgLyoqXG4gICAqIGkxOG4ga2V566W8IO2MjOyLse2VmOyXrCBlbnRpdHkg6rSA66CoIOygleuztCDstpTstpxcbiAgICovXG4gIHBhcnNlRW50aXR5S2V5KGtleTogc3RyaW5nKTogRW50aXR5S2V5SW5mbyB7XG4gICAgLy8gZW50aXR5LntFbnRpdHlJZH0gKGxpc3QsIGNyZWF0ZSwgZWRpdCDsoJzsmbgpXG4gICAgY29uc3QgZW50aXR5VGl0bGVNYXRjaCA9IGtleS5tYXRjaCgvXmVudGl0eVxcLihbQS1aXVthLXpBLVowLTldKikkLyk7XG4gICAgaWYgKFxuICAgICAgZW50aXR5VGl0bGVNYXRjaCAmJlxuICAgICAgIWtleS5pbmNsdWRlcyhcIi5saXN0XCIpICYmXG4gICAgICAha2V5LmluY2x1ZGVzKFwiLmNyZWF0ZVwiKSAmJlxuICAgICAgIWtleS5pbmNsdWRlcyhcIi5lZGl0XCIpXG4gICAgKSB7XG4gICAgICByZXR1cm4geyB0eXBlOiBcImVudGl0eVRpdGxlXCIsIGVudGl0eUlkOiBlbnRpdHlUaXRsZU1hdGNoWzFdIH07XG4gICAgfVxuXG4gICAgLy8gZW50aXR5LntFbnRpdHlJZH0ue3Byb3BOYW1lfVxuICAgIGNvbnN0IHByb3BEZXNjTWF0Y2ggPSBrZXkubWF0Y2goL15lbnRpdHlcXC4oW0EtWl1bYS16QS1aMC05XSopXFwuKFthLXpfXVthLXowLTlfXSopJC8pO1xuICAgIGlmIChwcm9wRGVzY01hdGNoKSB7XG4gICAgICByZXR1cm4geyB0eXBlOiBcInByb3BEZXNjXCIsIGVudGl0eUlkOiBwcm9wRGVzY01hdGNoWzFdLCBwcm9wTmFtZTogcHJvcERlc2NNYXRjaFsyXSB9O1xuICAgIH1cblxuICAgIC8vIGVudW0ue0VudW1JZH0ue3ZhbHVlfVxuICAgIGNvbnN0IGVudW1MYWJlbE1hdGNoID0ga2V5Lm1hdGNoKC9eZW51bVxcLihbQS1aXVthLXpBLVowLTldKilcXC4oLispJC8pO1xuICAgIGlmIChlbnVtTGFiZWxNYXRjaCkge1xuICAgICAgcmV0dXJuIHsgdHlwZTogXCJlbnVtTGFiZWxcIiwgZW51bUlkOiBlbnVtTGFiZWxNYXRjaFsxXSwgZW51bVZhbHVlOiBlbnVtTGFiZWxNYXRjaFsyXSB9O1xuICAgIH1cblxuICAgIHJldHVybiB7IHR5cGU6IFwib3RoZXJcIiB9O1xuICB9XG5cbiAgLyoqXG4gICAqIGVudGl0eSBrZXnsl5Ag64yA7ZW0IGVudGl0eS5qc29uIOyXheuNsOydtO2KuCDsiJjtlolcbiAgICogQHJldHVybnMg7JeF642w7J207Yq4IOyXrOu2gFxuICAgKi9cbiAgYXN5bmMgdXBkYXRlRW50aXR5QnlLZXkoa2V5OiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBjb25zdCBrZXlJbmZvID0gdGhpcy5wYXJzZUVudGl0eUtleShrZXkpO1xuXG4gICAgc3dpdGNoIChrZXlJbmZvLnR5cGUpIHtcbiAgICAgIGNhc2UgXCJlbnRpdHlUaXRsZVwiOiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgZW50aXR5ID0gRW50aXR5TWFuYWdlci5nZXQoa2V5SW5mby5lbnRpdHlJZCk7XG4gICAgICAgICAgaWYgKGVudGl0eS50aXRsZSAhPT0gdmFsdWUpIHtcbiAgICAgICAgICAgIGVudGl0eS50aXRsZSA9IHZhbHVlO1xuICAgICAgICAgICAgYXdhaXQgZW50aXR5LnNhdmUoKTtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgLy8gZW50aXR5IG5vdCBmb3VuZFxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cblxuICAgICAgY2FzZSBcInByb3BEZXNjXCI6IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCBlbnRpdHkgPSBFbnRpdHlNYW5hZ2VyLmdldChrZXlJbmZvLmVudGl0eUlkKTtcbiAgICAgICAgICBjb25zdCBwcm9wSW5kZXggPSBlbnRpdHkucHJvcHMuZmluZEluZGV4KChwKSA9PiBwLm5hbWUgPT09IGtleUluZm8ucHJvcE5hbWUpO1xuICAgICAgICAgIGlmIChwcm9wSW5kZXggIT09IC0xICYmIGVudGl0eS5wcm9wc1twcm9wSW5kZXhdLmRlc2MgIT09IHZhbHVlKSB7XG4gICAgICAgICAgICBlbnRpdHkucHJvcHNbcHJvcEluZGV4XS5kZXNjID0gdmFsdWU7XG4gICAgICAgICAgICBhd2FpdCBlbnRpdHkuc2F2ZSgpO1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgfVxuICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAvLyBlbnRpdHkgbm90IGZvdW5kXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuXG4gICAgICBjYXNlIFwiZW51bUxhYmVsXCI6IHtcbiAgICAgICAgZm9yIChjb25zdCBlbnRpdHlJZCBvZiBFbnRpdHlNYW5hZ2VyLmdldEFsbElkcygpKSB7XG4gICAgICAgICAgY29uc3QgZW50aXR5ID0gRW50aXR5TWFuYWdlci5nZXQoZW50aXR5SWQpO1xuICAgICAgICAgIGlmIChlbnRpdHkuZW51bUxhYmVsc1trZXlJbmZvLmVudW1JZF0pIHtcbiAgICAgICAgICAgIGlmIChlbnRpdHkuZW51bUxhYmVsc1trZXlJbmZvLmVudW1JZF1ba2V5SW5mby5lbnVtVmFsdWVdICE9PSB2YWx1ZSkge1xuICAgICAgICAgICAgICBlbnRpdHkuZW51bUxhYmVsc1trZXlJbmZvLmVudW1JZF1ba2V5SW5mby5lbnVtVmFsdWVdID0gdmFsdWU7XG4gICAgICAgICAgICAgIGF3YWl0IGVudGl0eS5zYXZlKCk7XG4gICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cblxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBzZC5nZW5lcmF0ZWQudHPsl5DshJwgZW50aXR5IGxhYmVscyDstpTstpxcbiAgICogZW50aXR5Lmpzb27sl5DshJwg6rSA66as65CY64qUIOqwkuunjCDtj6ztlaggKC5saXN0LCAuY3JlYXRlLCAuZWRpdCDsoJzsmbgpXG4gICAqL1xuICBleHRyYWN0RW50aXR5TGFiZWxzKCk6IERpY3RFbnRyeVtdIHtcbiAgICBjb25zdCBzZFBhdGggPSBwYXRoLmpvaW4oU29uYW11LmFwaVJvb3RQYXRoLCBcInNyY1wiLCBcImkxOG5cIiwgXCJzZC5nZW5lcmF0ZWQudHNcIik7XG4gICAgaWYgKCFmcy5leGlzdHNTeW5jKHNkUGF0aCkpIHtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5wYXJzZUNvbnN0T2JqZWN0RGVjbGFyYXRpb24oc2RQYXRoLCBcImVudGl0eUxhYmVsc1wiKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBzZC5nZW5lcmF0ZWQudHPsl5DshJwgcmMta2V5cyDstpTstpxcbiAgICogcmVhY3QtY29tcG9uZW50c+yXkOyEnCDqtIDrpqzrkJjripQgaTE4biDtgqTrk6RcbiAgICogQHBhcmFtIGxvY2FsZSAtIOuhnOy8gOydvCAoa28sIGVuIOuTsSlcbiAgICovXG4gIGV4dHJhY3RSQ0tleXMobG9jYWxlOiBzdHJpbmcpOiBEaWN0RW50cnlbXSB7XG4gICAgY29uc3Qgc2RQYXRoID0gcGF0aC5qb2luKFNvbmFtdS5hcGlSb290UGF0aCwgXCJzcmNcIiwgXCJpMThuXCIsIFwic2QuZ2VuZXJhdGVkLnRzXCIpO1xuICAgIGlmICghZnMuZXhpc3RzU3luYyhzZFBhdGgpKSB7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuXG4gICAgLy8gbG9jYWxl67OEIOuzgOyImOuqhSDrp6TtlZEgKHNkLnRlbXBsYXRlLnRz7J2YIGdldFJDS2V5c1Zhck5hbWXqs7wg64+Z7J28KVxuICAgIGNvbnN0IHZhck5hbWUgPSAoKCkgPT4ge1xuICAgICAgaWYgKGxvY2FsZSA9PT0gXCJrb1wiKSByZXR1cm4gXCJyY0tleXNLb1wiO1xuICAgICAgaWYgKGxvY2FsZSA9PT0gXCJlblwiKSByZXR1cm4gXCJyY0tleXNFblwiO1xuICAgICAgLy8g64uk66W4IGxvY2FsZeydgCBlbuydhCBmYWxsYmFja+ycvOuhnCDsgqzsmqlcbiAgICAgIHJldHVybiBcInJjS2V5c0VuXCI7XG4gICAgfSkoKTtcblxuICAgIHJldHVybiB0aGlzLnBhcnNlQ29uc3RPYmplY3REZWNsYXJhdGlvbihzZFBhdGgsIHZhck5hbWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIFByb2plY3QgZGljdCDtjIzsnbwoW2xvY2FsZV0udHMp7JeQ7IScIOuUleyFlOuEiOumrCDroZzrk5xcbiAgICovXG4gIGxvYWRQcm9qZWN0RGljdChsb2NhbGU6IHN0cmluZykge1xuICAgIGNvbnN0IGRpY3RQYXRoID0gcGF0aC5qb2luKFNvbmFtdS5hcGlSb290UGF0aCwgXCJzcmNcIiwgXCJpMThuXCIsIGAke2xvY2FsZX0udHNgKTtcbiAgICBpZiAoIWZzLmV4aXN0c1N5bmMoZGljdFBhdGgpKSB7XG4gICAgICByZXR1cm4geyBlbnRyaWVzOiBbXSB9O1xuICAgIH1cbiAgICByZXR1cm4geyBlbnRyaWVzOiB0aGlzLnBhcnNlRGljdEZpbGUoZGljdFBhdGgpIH07XG4gIH1cblxuICAvKipcbiAgICog65SV7IWU64SI66asIOuNsOydtO2EsCDsiJjsp5EgKHNvbmFtdSArIGVudGl0eSArIHByb2plY3QpXG4gICAqL1xuICBhc3luYyBjb2xsZWN0RGljdGlvbmFyeSgpOiBQcm9taXNlPERpY3Rpb25hcnlSZXN1bHQ+IHtcbiAgICBjb25zdCB7IGRlZmF1bHRMb2NhbGUsIHN1cHBvcnRlZExvY2FsZXMgfSA9IHRoaXMuZ2V0STE4bkNvbmZpZygpO1xuICAgIGNvbnN0IGxvY2FsZXMgPSBzdXBwb3J0ZWRMb2NhbGVzO1xuXG4gICAgY29uc3Qgcm93czogRGljdGlvbmFyeVJvd1tdID0gW107XG4gICAgY29uc3Qgcm93TWFwID0gbmV3IE1hcDxzdHJpbmcsIERpY3Rpb25hcnlSb3c+KCk7XG5cbiAgICAvLyAxLiBSQyBLZXlzIChzb25hbXUgc291cmNlLCDqsIEgbG9jYWxl67OEKVxuICAgIGZvciAoY29uc3QgbG9jYWxlIG9mIGxvY2FsZXMpIHtcbiAgICAgIGNvbnN0IHJjS2V5cyA9IHRoaXMuZXh0cmFjdFJDS2V5cyhsb2NhbGUpO1xuICAgICAgZm9yIChjb25zdCByY0tleSBvZiByY0tleXMpIHtcbiAgICAgICAgbGV0IHJvdyA9IHJvd01hcC5nZXQocmNLZXkua2V5KTtcbiAgICAgICAgaWYgKCFyb3cpIHtcbiAgICAgICAgICByb3cgPSB7XG4gICAgICAgICAgICBrZXk6IHJjS2V5LmtleSxcbiAgICAgICAgICAgIHNvdXJjZTogXCJzb25hbXVcIixcbiAgICAgICAgICAgIGlzRnVuY3Rpb246IHJjS2V5LmlzRnVuY3Rpb24gPz8gZmFsc2UsXG4gICAgICAgICAgfTtcbiAgICAgICAgICByb3dNYXAuc2V0KHJjS2V5LmtleSwgcm93KTtcbiAgICAgICAgfVxuICAgICAgICByb3dbbG9jYWxlXSA9IHJjS2V5LnZhbHVlO1xuICAgICAgICBpZiAocmNLZXkuaXNGdW5jdGlvbikge1xuICAgICAgICAgIHJvdy5pc0Z1bmN0aW9uID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIDIuIEVudGl0eSBsYWJlbHMgKGRlZmF1bHQgbG9jYWxlIOq4sOykgClcbiAgICBjb25zdCBlbnRpdHlMYWJlbHMgPSB0aGlzLmV4dHJhY3RFbnRpdHlMYWJlbHMoKTtcbiAgICBmb3IgKGNvbnN0IGxhYmVsIG9mIGVudGl0eUxhYmVscykge1xuICAgICAgY29uc3Qgcm93OiBEaWN0aW9uYXJ5Um93ID0ge1xuICAgICAgICBrZXk6IGxhYmVsLmtleSxcbiAgICAgICAgc291cmNlOiBcImVudGl0eVwiLFxuICAgICAgICBpc0Z1bmN0aW9uOiBsYWJlbC5pc0Z1bmN0aW9uID8/IGZhbHNlLFxuICAgICAgICBbZGVmYXVsdExvY2FsZV06IGxhYmVsLnZhbHVlLFxuICAgICAgfTtcbiAgICAgIHJvd01hcC5zZXQobGFiZWwua2V5LCByb3cpO1xuICAgIH1cblxuICAgIC8vIDMuIFByb2plY3QgZGljdCAo6rCBIGxvY2FsZeuzhClcbiAgICBmb3IgKGNvbnN0IGxvY2FsZSBvZiBsb2NhbGVzKSB7XG4gICAgICBjb25zdCB7IGVudHJpZXMgfSA9IHRoaXMubG9hZFByb2plY3REaWN0KGxvY2FsZSk7XG4gICAgICBmb3IgKGNvbnN0IGVudHJ5IG9mIGVudHJpZXMpIHtcbiAgICAgICAgY29uc3QgZXhpc3RpbmcgPSByb3dNYXAuZ2V0KGVudHJ5LmtleSk7XG4gICAgICAgIGlmIChleGlzdGluZykge1xuICAgICAgICAgIC8vIHNvbmFtdSwgZW50aXR5IHNvdXJjZeqwgCDsnojsnLzrqbQg7ZW064u5IGxvY2FsZSDqsJLrp4wg7LaU6rCAXG4gICAgICAgICAgZXhpc3RpbmdbbG9jYWxlXSA9IGVudHJ5LnZhbHVlO1xuICAgICAgICAgIGlmIChlbnRyeS5pc0Z1bmN0aW9uKSB7XG4gICAgICAgICAgICBleGlzdGluZy5pc0Z1bmN0aW9uID0gdHJ1ZTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gcHJvamVjdCBzb3VyY2XroZwg7IOI66GcIOy2lOqwgFxuICAgICAgICAgIGxldCByb3cgPSByb3dNYXAuZ2V0KGVudHJ5LmtleSk7XG4gICAgICAgICAgaWYgKCFyb3cpIHtcbiAgICAgICAgICAgIHJvdyA9IHtcbiAgICAgICAgICAgICAga2V5OiBlbnRyeS5rZXksXG4gICAgICAgICAgICAgIHNvdXJjZTogXCJwcm9qZWN0XCIsXG4gICAgICAgICAgICAgIGlzRnVuY3Rpb246IGVudHJ5LmlzRnVuY3Rpb24sXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgcm93TWFwLnNldChlbnRyeS5rZXksIHJvdyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJvd1tsb2NhbGVdID0gZW50cnkudmFsdWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICByb3dzLnB1c2goLi4ucm93TWFwLnZhbHVlcygpKTtcbiAgICByb3dzLnNvcnQoKGEsIGIpID0+IGEua2V5LmxvY2FsZUNvbXBhcmUoYi5rZXkpKTtcblxuICAgIC8vIO2GteqzhCDqs4TsgrA6IGxvY2FsZeuzhCAo7LGE7JuM7KeEIOqwkiAvIOyghOyytCDtgqQg7IiYKVxuICAgIGNvbnN0IHN0YXRzOiBSZWNvcmQ8c3RyaW5nLCB7IHRvdGFsOiBudW1iZXI7IGZpbGxlZDogbnVtYmVyOyBwZXJjZW50OiBudW1iZXIgfT4gPSB7fTtcbiAgICBjb25zdCB0b3RhbCA9IHJvd3MubGVuZ3RoO1xuICAgIGZvciAoY29uc3QgbG9jYWxlIG9mIGxvY2FsZXMpIHtcbiAgICAgIGNvbnN0IGZpbGxlZCA9IHJvd3MuZmlsdGVyKChyb3cpID0+ICEhcm93W2xvY2FsZV0pLmxlbmd0aDtcbiAgICAgIGNvbnN0IHBlcmNlbnQgPSB0b3RhbCA+IDAgPyBNYXRoLnJvdW5kKChmaWxsZWQgLyB0b3RhbCkgKiAxMDApIDogMDtcbiAgICAgIHN0YXRzW2xvY2FsZV0gPSB7IHRvdGFsLCBmaWxsZWQsIHBlcmNlbnQgfTtcbiAgICB9XG5cbiAgICByZXR1cm4geyByb3dzLCBsb2NhbGVzLCBkZWZhdWx0TG9jYWxlLCBzdGF0cyB9O1xuICB9XG5cbiAgLyoqXG4gICAqIOuUleyFlOuEiOumrCDsobDtmoxcbiAgICovXG4gIGFzeW5jIGdldERpY3Rpb25hcnkoKTogUHJvbWlzZTxEaWN0aW9uYXJ5UmVzdWx0PiB7XG4gICAgcmV0dXJuIHRoaXMuY29sbGVjdERpY3Rpb25hcnkoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFeGNlbOuhnCDrgrTrs7TrgrTquLBcbiAgICovXG4gIGFzeW5jIGV4cG9ydFRvRXhjZWwoKTogUHJvbWlzZTx7IGZpbGVuYW1lOiBzdHJpbmc7IGJ1ZmZlcjogQnVmZmVyIH0+IHtcbiAgICBjb25zdCB7IHJvd3MsIGxvY2FsZXMgfSA9IGF3YWl0IHRoaXMuY29sbGVjdERpY3Rpb25hcnkoKTtcblxuICAgIGNvbnN0IHdiID0gbmV3IFdvcmtib29rKCk7XG4gICAgY29uc3Qgc2hlZXQgPSBcImkxOG5cIjtcbiAgICB3Yi5zZXRTaGVldE5hbWUoXCJTaGVldDFcIiwgc2hlZXQpO1xuXG4gICAgY29uc3QgcHJvamVjdE5hbWUgPSBgJHtTb25hbXUuY29uZmlnLnByb2plY3ROYW1lID8/IFwiU29uYW11XCJ9IERpY3Rpb25hcnlgO1xuICAgIGNvbnN0IGhlYWRlcnMgPSBbXCJrZXlcIiwgXCJzb3VyY2VcIiwgLi4ubG9jYWxlc107XG5cbiAgICAvLyDsiqTtg4Dsnbwg7KCV7J2YXG4gICAgY29uc3QgdGl0bGVTdHlsZUlkID0gd2IuYWRkU3R5bGUoe1xuICAgICAgZm9udDogeyBzaXplOiAyMyB9LFxuICAgICAgYWxpZ25tZW50OiB7IHZlcnRpY2FsOiBcImNlbnRlclwiLCBob3Jpem9udGFsOiBcImxlZnRcIiB9LFxuICAgIH0pO1xuICAgIGNvbnN0IGhlYWRlclN0eWxlSWQgPSB3Yi5hZGRTdHlsZSh7XG4gICAgICBmb250OiB7IGJvbGQ6IHRydWUsIHNpemU6IDExIH0sXG4gICAgICBhbGlnbm1lbnQ6IHsgaG9yaXpvbnRhbDogXCJjZW50ZXJcIiwgdmVydGljYWw6IFwiY2VudGVyXCIgfSxcbiAgICAgIGZpbGw6IHsgcGF0dGVybjogXCJzb2xpZFwiLCBmZ0NvbG9yOiBcIkYxRjFGMVwiIH0sXG4gICAgICBib3JkZXI6IHtcbiAgICAgICAgdG9wOiB7IHN0eWxlOiBcInRoaW5cIiwgY29sb3I6IFwiRDBEMEQwXCIgfSxcbiAgICAgICAgbGVmdDogeyBzdHlsZTogXCJ0aGluXCIsIGNvbG9yOiBcIkQwRDBEMFwiIH0sXG4gICAgICAgIGJvdHRvbTogeyBzdHlsZTogXCJ0aGluXCIsIGNvbG9yOiBcIkQwRDBEMFwiIH0sXG4gICAgICAgIHJpZ2h0OiB7IHN0eWxlOiBcInRoaW5cIiwgY29sb3I6IFwiRDBEMEQwXCIgfSxcbiAgICAgIH0sXG4gICAgfSk7XG4gICAgY29uc3QgZGF0YVN0eWxlSWQgPSB3Yi5hZGRTdHlsZSh7XG4gICAgICBmb250OiB7IHNpemU6IDExIH0sXG4gICAgICBhbGlnbm1lbnQ6IHsgdmVydGljYWw6IFwiY2VudGVyXCIsIGhvcml6b250YWw6IFwibGVmdFwiIH0sXG4gICAgfSk7XG5cbiAgICAvLyDtlokgMTog7ZSE66Gc7KCd7Yq466qFXG4gICAgd2Iuc2V0Q2VsbFZhbHVlKHNoZWV0LCBcIkExXCIsIHByb2plY3ROYW1lKTtcbiAgICB3Yi5zZXRDZWxsU3R5bGUoc2hlZXQsIFwiQTFcIiwgdGl0bGVTdHlsZUlkKTtcbiAgICB3Yi5zZXRSb3dIZWlnaHQoc2hlZXQsIDEsIDI4KTtcblxuICAgIC8vIO2WiSAyOiDruYgg7ZaJICjquLDrs7jqsJIpXG5cbiAgICAvLyDtlokgMzog7Zek642UXG4gICAgd2Iuc2V0Um93VmFsdWVzKHNoZWV0LCAzLCBcIkFcIiwgaGVhZGVycyk7XG4gICAgd2Iuc2V0Um93SGVpZ2h0KHNoZWV0LCAzLCAyNik7XG4gICAgZm9yIChsZXQgY29sID0gMDsgY29sIDwgaGVhZGVycy5sZW5ndGg7IGNvbCsrKSB7XG4gICAgICB3Yi5zZXRDZWxsU3R5bGUoc2hlZXQsIGAke2NvbExldHRlcihjb2wpfTNgLCBoZWFkZXJTdHlsZUlkKTtcbiAgICB9XG5cbiAgICAvLyDtlokgNCDsnbTtm4Q6IOuNsOydtO2EsFxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcm93cy5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3Qgcm93ID0gcm93c1tpXTtcbiAgICAgIGNvbnN0IHZhbHVlcyA9IFtyb3cua2V5LCByb3cuc291cmNlLCAuLi5sb2NhbGVzLm1hcCgobG9jYWxlKSA9PiByb3dbbG9jYWxlXSA/PyBcIlwiKV07XG4gICAgICBjb25zdCByb3dOdW0gPSBpICsgNDtcbiAgICAgIHdiLnNldFJvd1ZhbHVlcyhzaGVldCwgcm93TnVtLCBcIkFcIiwgdmFsdWVzKTtcbiAgICAgIHdiLnNldFJvd0hlaWdodChzaGVldCwgcm93TnVtLCAyNCk7XG4gICAgICBmb3IgKGxldCBjb2wgPSAwOyBjb2wgPCB2YWx1ZXMubGVuZ3RoOyBjb2wrKykge1xuICAgICAgICB3Yi5zZXRDZWxsU3R5bGUoc2hlZXQsIGAke2NvbExldHRlcihjb2wpfSR7cm93TnVtfWAsIGRhdGFTdHlsZUlkKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyDsu6zrn7wg64SI67mEIOqzhOyCsFxuICAgIGNvbnN0IE1BWF9XSURUSCA9IDUwO1xuICAgIGNvbnN0IE1JTl9XSURUSCA9IDEwO1xuICAgIGNvbnN0IGNvbHVtbldpZHRoczogbnVtYmVyW10gPSBoZWFkZXJzLm1hcCgoaGVhZGVyKSA9PiBNYXRoLm1heChoZWFkZXIubGVuZ3RoLCBNSU5fV0lEVEgpKTtcblxuICAgIGZvciAoY29uc3Qgcm93IG9mIHJvd3MpIHtcbiAgICAgIGNvbnN0IHZhbHVlcyA9IFtyb3cua2V5LCByb3cuc291cmNlLCAuLi5sb2NhbGVzLm1hcCgobG9jYWxlKSA9PiByb3dbbG9jYWxlXSA/PyBcIlwiKV07XG4gICAgICB2YWx1ZXMuZm9yRWFjaCgodmFsdWUsIGlkeCkgPT4ge1xuICAgICAgICBjb25zdCB0ZXh0TGVuZ3RoID0gU3RyaW5nKHZhbHVlKS5sZW5ndGg7XG4gICAgICAgIGNvbHVtbldpZHRoc1tpZHhdID0gTWF0aC5taW4oTWF0aC5tYXgoY29sdW1uV2lkdGhzW2lkeF0sIHRleHRMZW5ndGgpLCBNQVhfV0lEVEgpO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8g7Lus65+8IOuEiOu5hCDsoIHsmqlcbiAgICBmb3IgKGxldCBjb2wgPSAwOyBjb2wgPCBjb2x1bW5XaWR0aHMubGVuZ3RoOyBjb2wrKykge1xuICAgICAgd2Iuc2V0Q29sV2lkdGgoc2hlZXQsIGNvbExldHRlcihjb2wpLCBjb2x1bW5XaWR0aHNbY29sXSArIDIpO1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBmaWxlbmFtZTogYCR7cHJvamVjdE5hbWV9LSR7bmV3IERhdGUoKS50b0lTT1N0cmluZygpLnNwbGl0KFwiVFwiKVswXX0ueGxzeGAsXG4gICAgICBidWZmZXI6IHdiLndyaXRlQnVmZmVyU3luYygpLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogRXhjZWzsl5DshJwg6rCA7KC47Jik6riwXG4gICAqXG4gICAqIO2YleyLnTpcbiAgICogLSAx7ZaJOiDtlITroZzsoJ3tirjrqoVcbiAgICogLSAy7ZaJOiDruYgg7ZaJXG4gICAqIC0gM+2WiTog7Zek642UIChrZXksIHNvdXJjZSwgbG9jYWxlcy4uLilcbiAgICogLSA07ZaJIOydtO2bhDog642w7J207YSwXG4gICAqL1xuICBhc3luYyBpbXBvcnRGcm9tRXhjZWwoYnVmZmVyOiBCdWZmZXIpOiBQcm9taXNlPEltcG9ydFJlc3VsdD4ge1xuICAgIGNvbnN0IHdiID0gV29ya2Jvb2sub3BlbkJ1ZmZlclN5bmMoYnVmZmVyKTtcbiAgICBjb25zdCBzaGVldCA9IHdiLnNoZWV0TmFtZXNbMF07XG4gICAgY29uc3QgYWxsUm93cyA9IHdiLmdldFJvd3Moc2hlZXQpO1xuXG4gICAgY29uc3QgeyBkZWZhdWx0TG9jYWxlLCBzdXBwb3J0ZWRMb2NhbGVzIH0gPSB0aGlzLmdldEkxOG5Db25maWcoKTtcbiAgICBjb25zdCBsb2NhbGVzID0gc3VwcG9ydGVkTG9jYWxlcztcblxuICAgIGxldCB1cGRhdGVkRW50aXRpZXMgPSAwO1xuICAgIGxldCB1cGRhdGVkTG9jYWxlcyA9IDA7XG5cbiAgICAvLyBsb2NhbGXrs4QgcHJvamVjdCBkaWN0IGVudHJpZXNcbiAgICBjb25zdCBwcm9qZWN0RGljdEVudHJpZXM6IFJlY29yZDxzdHJpbmcsIERpY3RFbnRyeVtdPiA9IHt9O1xuICAgIGZvciAoY29uc3QgbG9jYWxlIG9mIGxvY2FsZXMpIHtcbiAgICAgIHByb2plY3REaWN0RW50cmllc1tsb2NhbGVdID0gW107XG4gICAgfVxuXG4gICAgLy8g7Zek642UIO2WiSDssL7quLA6IOyyqyDrsojsp7gg7Lus65+8KEEp7J20IFwia2V5XCLsnbgg7ZaJXG4gICAgbGV0IGhlYWRlclJvd051bSA9IDA7XG4gICAgZm9yIChjb25zdCByb3dEYXRhIG9mIGFsbFJvd3MpIHtcbiAgICAgIGNvbnN0IGZpcnN0Q2VsbCA9IHJvd0RhdGEuY2VsbHMuZmluZCgoYykgPT4gYy5jb2x1bW4gPT09IFwiQVwiKTtcbiAgICAgIGNvbnN0IGZpcnN0Q2VsbFZhbHVlID0gU3RyaW5nKGZpcnN0Q2VsbD8udmFsdWUgPz8gXCJcIilcbiAgICAgICAgLnRyaW0oKVxuICAgICAgICAudG9Mb3dlckNhc2UoKTtcbiAgICAgIGlmIChmaXJzdENlbGxWYWx1ZSA9PT0gXCJrZXlcIikge1xuICAgICAgICBoZWFkZXJSb3dOdW0gPSByb3dEYXRhLnJvdztcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGhlYWRlclJvd051bSA9PT0gMCkge1xuICAgICAgdGhyb3cgbmV3IEJhZFJlcXVlc3RFeGNlcHRpb24oU0QoXCJzb25hbXUuZXJyb3IuaGVhZGVyUm93Tm90Rm91bmRcIikpO1xuICAgIH1cblxuICAgIC8vIO2XpOuNlCDtlonsl5DshJwg7Lus65+8IOunpO2VkSDqtazshLFcbiAgICBjb25zdCBoZWFkZXJSb3dEYXRhID0gYWxsUm93cy5maW5kKChyKSA9PiByLnJvdyA9PT0gaGVhZGVyUm93TnVtKTtcbiAgICBjb25zdCBjb2xUb0hlYWRlcjogTWFwPHN0cmluZywgc3RyaW5nPiA9IG5ldyBNYXAoKTtcbiAgICBpZiAoaGVhZGVyUm93RGF0YSkge1xuICAgICAgZm9yIChjb25zdCBjZWxsIG9mIGhlYWRlclJvd0RhdGEuY2VsbHMpIHtcbiAgICAgICAgY29sVG9IZWFkZXIuc2V0KGNlbGwuY29sdW1uLCBTdHJpbmcoY2VsbC52YWx1ZSA/PyBcIlwiKSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8g642w7J207YSwIO2WiSDsnb3quLAgKO2XpOuNlCDri6TsnYwg7ZaJ67aA7YSwKVxuICAgIGZvciAoY29uc3Qgcm93RGF0YSBvZiBhbGxSb3dzKSB7XG4gICAgICBpZiAocm93RGF0YS5yb3cgPD0gaGVhZGVyUm93TnVtKSBjb250aW51ZTtcblxuICAgICAgY29uc3Qgcm93VmFsdWVzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge307XG4gICAgICBmb3IgKGNvbnN0IGNlbGwgb2Ygcm93RGF0YS5jZWxscykge1xuICAgICAgICBjb25zdCBoZWFkZXJOYW1lID0gY29sVG9IZWFkZXIuZ2V0KGNlbGwuY29sdW1uKTtcbiAgICAgICAgaWYgKGhlYWRlck5hbWUpIHtcbiAgICAgICAgICByb3dWYWx1ZXNbaGVhZGVyTmFtZV0gPSBTdHJpbmcoY2VsbC52YWx1ZSA/PyBcIlwiKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBjb25zdCBrZXkgPSByb3dWYWx1ZXMua2V5O1xuICAgICAgY29uc3Qgc291cmNlID1cbiAgICAgICAgLyogU0FGRVRZOiDrj5nquLDtmZTrkJwg7IKs7KCEIO2CpOyZgCDqsJIg6rOE7JW97J20IOydtCDqsJLsnZgg7YOA7J6F7J2EIOuztOyepe2VnOuLpC4gKi8gcm93VmFsdWVzLnNvdXJjZSBhc1xuICAgICAgICAgIHwgXCJlbnRpdHlcIlxuICAgICAgICAgIHwgXCJwcm9qZWN0XCI7XG5cbiAgICAgIGlmICgha2V5IHx8ICFzb3VyY2UpIGNvbnRpbnVlO1xuXG4gICAgICBpZiAoc291cmNlID09PSBcImVudGl0eVwiKSB7XG4gICAgICAgIC8vIGVudGl0eSBzb3VyY2U6IGRlZmF1bHQgbG9jYWxl66eMIGVudGl0eS5qc29u7JeQIOyggOyepVxuICAgICAgICBjb25zdCBkZWZhdWx0VmFsdWUgPSByb3dWYWx1ZXNbZGVmYXVsdExvY2FsZV07XG4gICAgICAgIGlmIChkZWZhdWx0VmFsdWUpIHtcbiAgICAgICAgICBjb25zdCB1cGRhdGVkID0gYXdhaXQgdGhpcy51cGRhdGVFbnRpdHlCeUtleShrZXksIGRlZmF1bHRWYWx1ZSk7XG4gICAgICAgICAgaWYgKHVwZGF0ZWQpIHtcbiAgICAgICAgICAgIHVwZGF0ZWRFbnRpdGllcysrO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIG5vbi1kZWZhdWx0IGxvY2FsZeydgCBwcm9qZWN0IGRpY3Tsl5Ag7KCA7J6lXG4gICAgICAgIGZvciAoY29uc3QgbG9jYWxlIG9mIGxvY2FsZXMpIHtcbiAgICAgICAgICBpZiAobG9jYWxlID09PSBkZWZhdWx0TG9jYWxlKSBjb250aW51ZTtcbiAgICAgICAgICBjb25zdCBjZWxsVmFsdWUgPSByb3dWYWx1ZXNbbG9jYWxlXT8udHJpbSgpO1xuICAgICAgICAgIGlmIChjZWxsVmFsdWUpIHtcbiAgICAgICAgICAgIHByb2plY3REaWN0RW50cmllc1tsb2NhbGVdLnB1c2goe1xuICAgICAgICAgICAgICBrZXksXG4gICAgICAgICAgICAgIHZhbHVlOiBjZWxsVmFsdWUsXG4gICAgICAgICAgICAgIGlzRnVuY3Rpb246IHRoaXMuaXNFeHByZXNzaW9uRnVuY3Rpb24oY2VsbFZhbHVlKSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChzb3VyY2UgPT09IFwicHJvamVjdFwiKSB7XG4gICAgICAgIC8vIHByb2plY3Qgc291cmNlOiDrqqjrk6AgbG9jYWxl7J2EIHByb2plY3QgZGljdOyXkCDsoIDsnqVcbiAgICAgICAgZm9yIChjb25zdCBsb2NhbGUgb2YgbG9jYWxlcykge1xuICAgICAgICAgIGNvbnN0IGNlbGxWYWx1ZSA9IHJvd1ZhbHVlc1tsb2NhbGVdPy50cmltKCk7XG4gICAgICAgICAgaWYgKGNlbGxWYWx1ZSkge1xuICAgICAgICAgICAgcHJvamVjdERpY3RFbnRyaWVzW2xvY2FsZV0ucHVzaCh7XG4gICAgICAgICAgICAgIGtleSxcbiAgICAgICAgICAgICAgdmFsdWU6IGNlbGxWYWx1ZSxcbiAgICAgICAgICAgICAgaXNGdW5jdGlvbjogdGhpcy5pc0V4cHJlc3Npb25GdW5jdGlvbihjZWxsVmFsdWUpLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gUHJvamVjdCBkaWN0IO2MjOydvCDsg53shLFcbiAgICBmb3IgKGNvbnN0IGxvY2FsZSBvZiBsb2NhbGVzKSB7XG4gICAgICBjb25zdCBlbnRyaWVzID0gcHJvamVjdERpY3RFbnRyaWVzW2xvY2FsZV07XG4gICAgICBpZiAoZW50cmllcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIGF3YWl0IHRoaXMuc2F2ZURpY3RGaWxlKGxvY2FsZSwgZW50cmllcywgbG9jYWxlID09PSBkZWZhdWx0TG9jYWxlKTtcbiAgICAgICAgdXBkYXRlZExvY2FsZXMrKztcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgc3VjY2VzczogdHJ1ZSxcbiAgICAgIHVwZGF0ZWRFbnRpdGllcyxcbiAgICAgIHVwZGF0ZWRMb2NhbGVzLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICog65SV7IWU64SI66asIO2VreuqqSDsiJjsoJVcbiAgICovXG4gIGFzeW5jIHVwZGF0ZUVudHJ5KHBhcmFtczoge1xuICAgIG9sZEtleTogc3RyaW5nO1xuICAgIG5ld0tleTogc3RyaW5nO1xuICAgIHNvdXJjZTogXCJlbnRpdHlcIiB8IFwicHJvamVjdFwiIHwgXCJzb25hbXVcIjtcbiAgICB2YWx1ZXM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG4gIH0pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCB7IG9sZEtleSwgbmV3S2V5LCBzb3VyY2UsIHZhbHVlcyB9ID0gcGFyYW1zO1xuXG4gICAgY29uc3QgeyBkZWZhdWx0TG9jYWxlLCBzdXBwb3J0ZWRMb2NhbGVzIH0gPSB0aGlzLmdldEkxOG5Db25maWcoKTtcbiAgICBjb25zdCBsb2NhbGVzID0gc3VwcG9ydGVkTG9jYWxlcztcblxuICAgIC8vIGVudGl0eSBzb3VyY2XsnZggZGVmYXVsdCBsb2NhbGUg7LKY66asXG4gICAgaWYgKHNvdXJjZSA9PT0gXCJlbnRpdHlcIiAmJiB2YWx1ZXNbZGVmYXVsdExvY2FsZV0pIHtcbiAgICAgIGF3YWl0IHRoaXMudXBkYXRlRW50aXR5QnlLZXkobmV3S2V5LCB2YWx1ZXNbZGVmYXVsdExvY2FsZV0pO1xuICAgIH1cblxuICAgIC8vIHByb2plY3QgZGljdCDsl4XrjbDsnbTtirhcbiAgICAvLyAtIGVudGl0eeydmCBub24tZGVmYXVsdCBsb2NhbGVcbiAgICAvLyAtIHByb2plY3Qgc291cmNl7J2YIOuqqOuToCBsb2NhbGVcbiAgICAvLyAtIHNvbmFtdSBzb3VyY2XsnZgg66qo65OgIGxvY2FsZSAob3ZlcnJpZGUpXG4gICAgZm9yIChjb25zdCBsb2NhbGUgb2YgbG9jYWxlcykge1xuICAgICAgLy8gZW50aXR5IHNvdXJjZeydmCBkZWZhdWx0IGxvY2FsZeydgCBlbnRpdHkuanNvbuyXkOyEnCDsspjrpqztlojsnLzrr4DroZwg7Iqk7YK1XG4gICAgICBpZiAoc291cmNlID09PSBcImVudGl0eVwiICYmIGxvY2FsZSA9PT0gZGVmYXVsdExvY2FsZSkgY29udGludWU7XG5cbiAgICAgIGNvbnN0IGNlbGxWYWx1ZSA9IHZhbHVlc1tsb2NhbGVdPy50cmltKCk7XG4gICAgICBpZiAoIWNlbGxWYWx1ZSkgY29udGludWU7XG5cbiAgICAgIC8vIOq4sOyhtCBkaWN0IOuhnOuTnFxuICAgICAgY29uc3QgeyBlbnRyaWVzIH0gPSB0aGlzLmxvYWRQcm9qZWN0RGljdChsb2NhbGUpO1xuXG4gICAgICAvLyBrZXkg67OA6rK9IOyLnCDquLDsobQga2V5IOygnOqxsFxuICAgICAgaWYgKG9sZEtleSAhPT0gbmV3S2V5KSB7XG4gICAgICAgIGNvbnN0IG9sZEluZGV4ID0gZW50cmllcy5maW5kSW5kZXgoKGUpID0+IGUua2V5ID09PSBvbGRLZXkpO1xuICAgICAgICBpZiAob2xkSW5kZXggIT09IC0xKSB7XG4gICAgICAgICAgZW50cmllcy5zcGxpY2Uob2xkSW5kZXgsIDEpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIOyDiCDqsJIg7JeF642w7J207Yq4IOuYkOuKlCDstpTqsIBcbiAgICAgIGNvbnN0IGV4aXN0aW5nSW5kZXggPSBlbnRyaWVzLmZpbmRJbmRleCgoZSkgPT4gZS5rZXkgPT09IG5ld0tleSk7XG4gICAgICBjb25zdCBuZXdFbnRyeTogRGljdEVudHJ5ID0ge1xuICAgICAgICBrZXk6IG5ld0tleSxcbiAgICAgICAgdmFsdWU6IGNlbGxWYWx1ZSxcbiAgICAgICAgaXNGdW5jdGlvbjogdGhpcy5pc0V4cHJlc3Npb25GdW5jdGlvbihjZWxsVmFsdWUpLFxuICAgICAgfTtcblxuICAgICAgaWYgKGV4aXN0aW5nSW5kZXggIT09IC0xKSB7XG4gICAgICAgIGVudHJpZXNbZXhpc3RpbmdJbmRleF0gPSBuZXdFbnRyeTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGVudHJpZXMucHVzaChuZXdFbnRyeSk7XG4gICAgICB9XG5cbiAgICAgIC8vIGRpY3Qg7YyM7J28IOyggOyepVxuICAgICAgYXdhaXQgdGhpcy5zYXZlRGljdEZpbGUobG9jYWxlLCBlbnRyaWVzLCBsb2NhbGUgPT09IGRlZmF1bHRMb2NhbGUpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiDrlJXshZTrhIjrpqwg7ZWt66qpIOy2lOqwgFxuICAgKi9cbiAgYXN5bmMgY3JlYXRlRW50cnkocGFyYW1zOiB7IGtleTogc3RyaW5nOyB2YWx1ZXM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gfSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHsga2V5LCB2YWx1ZXMgfSA9IHBhcmFtcztcblxuICAgIGlmICgha2V5Py50cmltKCkpIHtcbiAgICAgIHRocm93IG5ldyBCYWRSZXF1ZXN0RXhjZXB0aW9uKFNEKFwic29uYW11LmVycm9yLmtleVJlcXVpcmVkXCIpKTtcbiAgICB9XG5cbiAgICBjb25zdCB7IGRlZmF1bHRMb2NhbGUsIHN1cHBvcnRlZExvY2FsZXMgfSA9IHRoaXMuZ2V0STE4bkNvbmZpZygpO1xuICAgIGNvbnN0IGxvY2FsZXMgPSBzdXBwb3J0ZWRMb2NhbGVzO1xuXG4gICAgLy8g7KSR67O1IO2CpCDssrTtgaxcbiAgICBmb3IgKGNvbnN0IGxvY2FsZSBvZiBsb2NhbGVzKSB7XG4gICAgICBjb25zdCB7IGVudHJpZXMgfSA9IHRoaXMubG9hZFByb2plY3REaWN0KGxvY2FsZSk7XG4gICAgICBpZiAoZW50cmllcy5zb21lKChlKSA9PiBlLmtleSA9PT0ga2V5KSkge1xuICAgICAgICB0aHJvdyBuZXcgQmFkUmVxdWVzdEV4Y2VwdGlvbihTRChcInNvbmFtdS5lcnJvci5rZXlBbHJlYWR5RXhpc3RzXCIpKGtleSkpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIOqwgSBsb2NhbGXsl5Ag7IOIIO2CpCDstpTqsIBcbiAgICBmb3IgKGNvbnN0IGxvY2FsZSBvZiBsb2NhbGVzKSB7XG4gICAgICBjb25zdCBjZWxsVmFsdWUgPSB2YWx1ZXNbbG9jYWxlXT8udHJpbSgpO1xuICAgICAgaWYgKCFjZWxsVmFsdWUpIGNvbnRpbnVlO1xuXG4gICAgICBjb25zdCB7IGVudHJpZXMgfSA9IHRoaXMubG9hZFByb2plY3REaWN0KGxvY2FsZSk7XG4gICAgICBlbnRyaWVzLnB1c2goe1xuICAgICAgICBrZXksXG4gICAgICAgIHZhbHVlOiBjZWxsVmFsdWUsXG4gICAgICAgIGlzRnVuY3Rpb246IHRoaXMuaXNFeHByZXNzaW9uRnVuY3Rpb24oY2VsbFZhbHVlKSxcbiAgICAgIH0pO1xuXG4gICAgICBhd2FpdCB0aGlzLnNhdmVEaWN0RmlsZShsb2NhbGUsIGVudHJpZXMsIGxvY2FsZSA9PT0gZGVmYXVsdExvY2FsZSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIOuUleyFlOuEiOumrCDtla3rqqkg7IKt7KCcXG4gICAqL1xuICBhc3luYyBkZWxldGVFbnRyeShrZXk6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICgha2V5KSB7XG4gICAgICB0aHJvdyBuZXcgQmFkUmVxdWVzdEV4Y2VwdGlvbihTRChcInNvbmFtdS5lcnJvci5rZXlSZXF1aXJlZFwiKSk7XG4gICAgfVxuXG4gICAgY29uc3QgeyBkZWZhdWx0TG9jYWxlLCBzdXBwb3J0ZWRMb2NhbGVzIH0gPSB0aGlzLmdldEkxOG5Db25maWcoKTtcbiAgICBjb25zdCBsb2NhbGVzID0gc3VwcG9ydGVkTG9jYWxlcztcblxuICAgIGxldCBkZWxldGVkID0gZmFsc2U7XG4gICAgZm9yIChjb25zdCBsb2NhbGUgb2YgbG9jYWxlcykge1xuICAgICAgY29uc3QgeyBlbnRyaWVzIH0gPSB0aGlzLmxvYWRQcm9qZWN0RGljdChsb2NhbGUpO1xuICAgICAgY29uc3QgaW5kZXggPSBlbnRyaWVzLmZpbmRJbmRleCgoZSkgPT4gZS5rZXkgPT09IGtleSk7XG4gICAgICBpZiAoaW5kZXggIT09IC0xKSB7XG4gICAgICAgIGVudHJpZXMuc3BsaWNlKGluZGV4LCAxKTtcbiAgICAgICAgZGVsZXRlZCA9IHRydWU7XG5cbiAgICAgICAgYXdhaXQgdGhpcy5zYXZlRGljdEZpbGUobG9jYWxlLCBlbnRyaWVzLCBsb2NhbGUgPT09IGRlZmF1bHRMb2NhbGUpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICghZGVsZXRlZCkge1xuICAgICAgdGhyb3cgbmV3IEJhZFJlcXVlc3RFeGNlcHRpb24oU0QoXCJzb25hbXUuZXJyb3Iua2V5Tm90Rm91bmRcIikoa2V5KSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIOuvuOyCrOyaqSDtgqQg6rKA7IKsIChhc3QtZ3JlcCDsgqzsmqkpXG4gICAqL1xuICBhc3luYyBjaGVja1VzYWdlKGtleXM6IHN0cmluZ1tdKTogUHJvbWlzZTxVc2FnZVJlc3VsdD4ge1xuICAgIC8vIGFzdC1ncmVwIOyEpOy5mCDtmZXsnbhcbiAgICBsZXQgc2dQYXRoOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcbiAgICB0cnkge1xuICAgICAgc2dQYXRoID0gZXhlY1N5bmMoXCJ3aGljaCBzZ1wiLCB7IGVuY29kaW5nOiBcInV0Zi04XCIgfSkudHJpbSgpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgdHJ5IHtcbiAgICAgICAgc2dQYXRoID0gZXhlY1N5bmMoXCJ3aGljaCBhc3QtZ3JlcFwiLCB7IGVuY29kaW5nOiBcInV0Zi04XCIgfSkudHJpbSgpO1xuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIC8vIGFzdC1ncmVwIG5vdCBpbnN0YWxsZWRcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoIXNnUGF0aCkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgZXJyb3I6XG4gICAgICAgICAgXCJhc3QtZ3JlcOydtCDshKTsuZjrkJjslrQg7J6I7KeAIOyViuyKteuLiOuLpC4gYnJldyBpbnN0YWxsIGFzdC1ncmVwIOuYkOuKlCBucG0gaW5zdGFsbCAtZyBAYXN0LWdyZXAvY2xp66GcIOyEpOy5mO2VtOyjvOyEuOyalC5cIixcbiAgICAgICAgdW51c2VkS2V5czogW10sXG4gICAgICB9O1xuICAgIH1cblxuICAgIGNvbnN0IHNlYXJjaFBhdGhzOiBzdHJpbmdbXSA9IFtdO1xuICAgIGZvciAoY29uc3QgZW50cnkgb2YgW1wiYXBpXCIsIFwid2ViXCIsIFwiYXBwXCJdKSB7XG4gICAgICBjb25zdCBzcmNQYXRoID0gcGF0aC5qb2luKFNvbmFtdS5hcHBSb290UGF0aCwgZW50cnksIFwic3JjXCIpO1xuICAgICAgaWYgKGZzLmV4aXN0c1N5bmMoc3JjUGF0aCkpIHtcbiAgICAgICAgc2VhcmNoUGF0aHMucHVzaChzcmNQYXRoKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoc2VhcmNoUGF0aHMubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBlcnJvcjogXCLqsoDsg4ntlaAgc3JjIOuUlOugie2GoOumrOulvCDssL7snYQg7IiYIOyXhuyKteuLiOuLpC5cIixcbiAgICAgICAgdW51c2VkS2V5czogW10sXG4gICAgICB9O1xuICAgIH1cblxuICAgIGNvbnN0IHVzZWRLZXlzID0gbmV3IFNldDxzdHJpbmc+KCk7XG5cbiAgICB0cnkge1xuICAgICAgLy8gYXN0LWdyZXDsnLzroZwgU0QoXCIuLi5cIikg7Yyo7YS0IOqygOyDiVxuICAgICAgLy8g7Yyo7YS0OiBTRChcIktFWVwiKSDrmJDripQgU0QoJ0tFWScpIO2Yle2DnFxuICAgICAgY29uc3QgcGF0dGVybnMgPSBbJ1NEKFwiJEtFWVwiKScsIFwiU0QoJyRLRVknKVwiXTtcblxuICAgICAgZm9yIChjb25zdCBzZWFyY2hQYXRoIG9mIHNlYXJjaFBhdGhzKSB7XG4gICAgICAgIGZvciAoY29uc3QgcGF0dGVybiBvZiBwYXR0ZXJucykge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSBleGVjU3luYyhgJHtzZ1BhdGh9IC0tcGF0dGVybiAnJHtwYXR0ZXJufScgLS1qc29uICR7c2VhcmNoUGF0aH1gLCB7XG4gICAgICAgICAgICAgIGVuY29kaW5nOiBcInV0Zi04XCIsXG4gICAgICAgICAgICAgIG1heEJ1ZmZlcjogNTAgKiAxMDI0ICogMTAyNCwgLy8gNTBNQlxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIGlmIChyZXN1bHQudHJpbSgpKSB7XG4gICAgICAgICAgICAgIGNvbnN0IG1hdGNoZXMgPSBKU09OLnBhcnNlKHJlc3VsdCk7XG4gICAgICAgICAgICAgIGZvciAoY29uc3QgbWF0Y2ggb2YgbWF0Y2hlcykge1xuICAgICAgICAgICAgICAgIC8vIG1ldGFWYXJpYWJsZXMuc2luZ2xlLktFWS50ZXh07JeQ7IScIO2CpCDstpTstpxcbiAgICAgICAgICAgICAgICBjb25zdCBrZXlUZXh0ID0gbWF0Y2gubWV0YVZhcmlhYmxlcz8uc2luZ2xlPy5LRVk/LnRleHQ7XG4gICAgICAgICAgICAgICAgaWYgKGtleVRleHQpIHtcbiAgICAgICAgICAgICAgICAgIC8vIOuUsOyYtO2RnCDsoJzqsbBcbiAgICAgICAgICAgICAgICAgIGNvbnN0IGNsZWFuS2V5ID0ga2V5VGV4dC5yZXBsYWNlKC9eW1wiJ118W1wiJ10kL2csIFwiXCIpO1xuICAgICAgICAgICAgICAgICAgdXNlZEtleXMuYWRkKGNsZWFuS2V5KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAgIC8vIO2MqO2EtCDrp6TsuZgg7JeG7Jy866m0IOyXkOufrCAo66y07IucKVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBrZXlzIOykkeyXkOyEnCB1c2VkS2V5c+yXkCDsl4bripQg6rKD65Ok7J20IOuvuOyCrOyaqSDtgqRcbiAgICAgIGNvbnN0IHVudXNlZEtleXMgPSBrZXlzLmZpbHRlcigoaykgPT4gIXVzZWRLZXlzLmhhcyhrKSk7XG5cbiAgICAgIHJldHVybiB7IHVudXNlZEtleXMsIHVzZWRLZXlzQ291bnQ6IHVzZWRLZXlzLnNpemUgfTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBlcnJvcjogYOqygOyDiSDspJEg7Jik66WYIOuwnOyDnTogJHtlIGluc3RhbmNlb2YgRXJyb3IgPyBlLm1lc3NhZ2UgOiBTdHJpbmcoZSl9YCxcbiAgICAgICAgdW51c2VkS2V5czogW10sXG4gICAgICB9O1xuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgY29uc3Qgc29uYW11RGljdGlvbmFyeSA9IG5ldyBTb25hbXVEaWN0aW9uYXJ5KCk7XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7OztBQXlCQSxTQUFTLFVBQVUsT0FBdUI7Q0FDeEMsSUFBSSxTQUFTO0NBQ2IsSUFBSSxJQUFJO0NBQ1IsT0FBTyxLQUFLLEdBQUc7RUFDYixTQUFTLE9BQU8sYUFBYSxLQUFNLElBQUksRUFBRyxJQUFJO0VBQzlDLElBQUksS0FBSyxNQUFNLElBQUksRUFBRSxJQUFJO0NBQzNCO0NBQ0EsT0FBTztBQUNUOzs7YUExQnNDO3NCQUNTO3FCQUNTO29CQUNTO1NBQ3hDO0NBNEJaLG1CQUFiLE1BQThCOzs7Ozs7Ozs7O0VBVTVCLGNBQWMsVUFBK0I7R0FDM0MsTUFBTSxVQUFVLEdBQUcsYUFBYSxVQUFVLE9BQU87R0FDakQsTUFBTSxhQUFhLEdBQUcsaUJBQWlCLFVBQVUsU0FBUyxHQUFHLGFBQWEsUUFBUSxJQUFJO0dBRXRGLE1BQU0sVUFBdUIsQ0FBQztHQUU5QixHQUFHLGFBQWEsYUFBYSxTQUFTO0lBQ3BDLElBQUksR0FBRyxtQkFBbUIsSUFBSSxHQUFHO0tBQy9CLE1BQU0sZ0JBQWdCLEtBQUssc0JBQXNCLEtBQUssVUFBVTtLQUNoRSxJQUFJLGVBQ0YsS0FBSyx5QkFBeUIsZUFBZSxZQUFZLE9BQU87SUFFcEU7R0FDRixDQUFDO0dBRUQsT0FBTztFQUNUOzs7OztFQU1BLDRCQUE0QixVQUFrQixTQUE4QjtHQUMxRSxNQUFNLFVBQVUsR0FBRyxhQUFhLFVBQVUsT0FBTztHQUNqRCxNQUFNLGFBQWEsR0FBRyxpQkFBaUIsVUFBVSxTQUFTLEdBQUcsYUFBYSxRQUFRLElBQUk7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
|
|
750
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic29uYW11LWRpY3Rpb25hcnkuanMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vLi4vc3JjL2RpY3Qvc29uYW11LWRpY3Rpb25hcnkudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgZXhlY1N5bmMgfSBmcm9tIFwiY2hpbGRfcHJvY2Vzc1wiO1xuaW1wb3J0IGZzIGZyb20gXCJmc1wiO1xuaW1wb3J0IHBhdGggZnJvbSBcInBhdGhcIjtcblxuaW1wb3J0IHsgV29ya2Jvb2sgfSBmcm9tIFwiQHNoZWV0a2l0L25vZGVcIjtcbmltcG9ydCB0cyBmcm9tIFwiQHR5cGVzY3JpcHQvdHlwZXNjcmlwdDZcIjtcblxuaW1wb3J0IHsgU29uYW11IH0gZnJvbSBcIi4uL2FwaS9zb25hbXVcIjtcbmltcG9ydCB7IGZvcm1hdENvZGUgfSBmcm9tIFwiLi4vY29kZS1mb3JtYXR0aW5nXCI7XG5pbXBvcnQgeyBFbnRpdHlNYW5hZ2VyIH0gZnJvbSBcIi4uL2VudGl0eS9lbnRpdHktbWFuYWdlclwiO1xuaW1wb3J0IHsgQmFkUmVxdWVzdEV4Y2VwdGlvbiB9IGZyb20gXCIuLi9leGNlcHRpb25zL3NvLWV4Y2VwdGlvbnNcIjtcbmltcG9ydCB7IFNEIH0gZnJvbSBcIi4vc2RcIjtcbmltcG9ydCB7XG4gIHR5cGUgRGljdEVudHJ5LFxuICB0eXBlIERpY3Rpb25hcnlSZXN1bHQsXG4gIHR5cGUgRGljdGlvbmFyeVJvdyxcbiAgdHlwZSBFbnRpdHlLZXlJbmZvLFxuICB0eXBlIEkxOG5Db25maWcsXG4gIHR5cGUgSW1wb3J0UmVzdWx0LFxuICB0eXBlIFVzYWdlUmVzdWx0LFxufSBmcm9tIFwiLi90eXBlc1wiO1xuXG4vKipcbiAqIDAtYmFzZWQg7Lus65+8IOyduOuNseyKpOulvCDsl5HshYAg7Lus65+8IOusuOyekOuhnCDrs4DtmZggKDAgLT4gXCJBXCIsIDI1IC0+IFwiWlwiLCAyNiAtPiBcIkFBXCIpXG4gKi9cbmZ1bmN0aW9uIGNvbExldHRlcihpbmRleDogbnVtYmVyKTogc3RyaW5nIHtcbiAgbGV0IHJlc3VsdCA9IFwiXCI7XG4gIGxldCBuID0gaW5kZXg7XG4gIHdoaWxlIChuID49IDApIHtcbiAgICByZXN1bHQgPSBTdHJpbmcuZnJvbUNoYXJDb2RlKDY1ICsgKG4gJSAyNikpICsgcmVzdWx0O1xuICAgIG4gPSBNYXRoLmZsb29yKG4gLyAyNikgLSAxO1xuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbi8qKlxuICogU29uYW11IERpY3Rpb25hcnkg6rSA66asIO2BtOuemOyKpFxuICogaTE4biDrlJXshZTrhIjrpqzsnZggQ1JVRCDrsI8gRXhjZWwgaW1wb3J0L2V4cG9ydOulvCDri7Tri7ntlanri4jri6QuXG4gKi9cbmV4cG9ydCBjbGFzcyBTb25hbXVEaWN0aW9uYXJ5IHtcbiAgLyoqXG4gICAqIFR5cGVTY3JpcHQgQ29tcGlsZXIgQVBJ66W8IOyCrOyaqe2VmOyXrCBkaWN0IO2MjOydvCDtjIzsi7FcbiAgICpcbiAgICog7KeA7JuQIO2MqO2EtDpcbiAgICogLSBleHBvcnQgZGVmYXVsdCB7IC4uLiB9IGFzIGNvbnN0O1xuICAgKiAtIGV4cG9ydCBkZWZhdWx0IGRlZmluZUxvY2FsZSh7IC4uLiB9KTtcbiAgICogLSDrrLjsnpDsl7Qg6rCSOiBcImtleVwiOiBcInZhbHVlXCIg65iQ64qUIGtleTogYHZhbHVlYFxuICAgKiAtIO2VqOyImCDqsJI6IFwia2V5XCI6IChwYXJhbTogVHlwZSkgPT4gYHRlbXBsYXRlYFxuICAgKi9cbiAgcGFyc2VEaWN0RmlsZShmaWxlUGF0aDogc3RyaW5nKTogRGljdEVudHJ5W10ge1xuICAgIGNvbnN0IGNvbnRlbnQgPSBmcy5yZWFkRmlsZVN5bmMoZmlsZVBhdGgsIFwidXRmLThcIik7XG4gICAgY29uc3Qgc291cmNlRmlsZSA9IHRzLmNyZWF0ZVNvdXJjZUZpbGUoZmlsZVBhdGgsIGNvbnRlbnQsIHRzLlNjcmlwdFRhcmdldC5MYXRlc3QsIHRydWUpO1xuXG4gICAgY29uc3QgZW50cmllczogRGljdEVudHJ5W10gPSBbXTtcblxuICAgIHRzLmZvckVhY2hDaGlsZChzb3VyY2VGaWxlLCAobm9kZSkgPT4ge1xuICAgICAgaWYgKHRzLmlzRXhwb3J0QXNzaWdubWVudChub2RlKSkge1xuICAgICAgICBjb25zdCBvYmplY3RMaXRlcmFsID0gdGhpcy51bndyYXBUb09iamVjdExpdGVyYWwobm9kZS5leHByZXNzaW9uKTtcbiAgICAgICAgaWYgKG9iamVjdExpdGVyYWwpIHtcbiAgICAgICAgICB0aGlzLmV4dHJhY3RFbnRyaWVzRnJvbU9iamVjdChvYmplY3RMaXRlcmFsLCBzb3VyY2VGaWxlLCBlbnRyaWVzKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuXG4gICAgcmV0dXJuIGVudHJpZXM7XG4gIH1cblxuICAvKipcbiAgICog7YyM7J287JeQ7IScIO2KueyglSDsnbTrpoTsnZggY29uc3Qg7ISg7Ja47J2EIOywvuyVhCBPYmplY3RMaXRlcmFsIO2MjOyLsVxuICAgKiDsmIg6IGNvbnN0IGVudGl0eUxhYmVscyA9IHsgLi4uIH0gYXMgY29uc3Q7XG4gICAqL1xuICBwYXJzZUNvbnN0T2JqZWN0RGVjbGFyYXRpb24oZmlsZVBhdGg6IHN0cmluZywgdmFyTmFtZTogc3RyaW5nKTogRGljdEVudHJ5W10ge1xuICAgIGNvbnN0IGNvbnRlbnQgPSBmcy5yZWFkRmlsZVN5bmMoZmlsZVBhdGgsIFwidXRmLThcIik7XG4gICAgY29uc3Qgc291cmNlRmlsZSA9IHRzLmNyZWF0ZVNvdXJjZUZpbGUoZmlsZVBhdGgsIGNvbnRlbnQsIHRzLlNjcmlwdFRhcmdldC5MYXRlc3QsIHRydWUpO1xuXG4gICAgY29uc3QgZW50cmllczogRGljdEVudHJ5W10gPSBbXTtcblxuICAgIHRzLmZvckVhY2hDaGlsZChzb3VyY2VGaWxlLCAobm9kZSkgPT4ge1xuICAgICAgaWYgKHRzLmlzVmFyaWFibGVTdGF0ZW1lbnQobm9kZSkpIHtcbiAgICAgICAgZm9yIChjb25zdCBkZWNsIG9mIG5vZGUuZGVjbGFyYXRpb25MaXN0LmRlY2xhcmF0aW9ucykge1xuICAgICAgICAgIGlmICh0cy5pc0lkZW50aWZpZXIoZGVjbC5uYW1lKSAmJiBkZWNsLm5hbWUudGV4dCA9PT0gdmFyTmFtZSAmJiBkZWNsLmluaXRpYWxpemVyKSB7XG4gICAgICAgICAgICBjb25zdCBvYmplY3RMaXRlcmFsID0gdGhpcy51bndyYXBUb09iamVjdExpdGVyYWwoZGVjbC5pbml0aWFsaXplcik7XG4gICAgICAgICAgICBpZiAob2JqZWN0TGl0ZXJhbCkge1xuICAgICAgICAgICAgICB0aGlzLmV4dHJhY3RFbnRyaWVzRnJvbU9iamVjdChvYmplY3RMaXRlcmFsLCBzb3VyY2VGaWxlLCBlbnRyaWVzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHJldHVybiBlbnRyaWVzO1xuICB9XG5cbiAgLyoqXG4gICAqIOusuOyekOyXtOydtCDtmZTsgrTtkZwg7ZWo7IiYIOuYkOuKlCDtlajsiJgg7ZGc7ZiE7Iud7J247KeAIO2MkOuzhFxuICAgKi9cbiAgaXNFeHByZXNzaW9uRnVuY3Rpb24oY29kZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgLy8g67mIIOusuOyekOyXtOydtOuCmCDqs7XrsLHrp4wg7J6I64qUIOqyveyasFxuICAgIGlmICghY29kZS50cmltKCkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBjb25zdCBBUlJPV19GVU5DVElPTl9QQVRURVJOID0gL15cXHMqXFwoW14pXSpcXClcXHMqPT4vO1xuXG4gICAgcmV0dXJuIEFSUk9XX0ZVTkNUSU9OX1BBVFRFUk4udGVzdChjb2RlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBleHBvcnQgZGVmYXVsdCDtkZztmITsi53sl5DshJwgT2JqZWN0TGl0ZXJhbEV4cHJlc3Npb24g7LaU7LacXG4gICAqIC0gYXMgY29uc3Qg7LKY66asXG4gICAqIC0gZGVmaW5lTG9jYWxlKHsgLi4uIH0pIO2YuOy2nCDsspjrpqxcbiAgICovXG4gIHByaXZhdGUgdW53cmFwVG9PYmplY3RMaXRlcmFsKGV4cHI6IHRzLkV4cHJlc3Npb24pOiB0cy5PYmplY3RMaXRlcmFsRXhwcmVzc2lvbiB8IG51bGwge1xuICAgIC8vIGFzIGNvbnN0IOyymOumrFxuICAgIGlmICh0cy5pc0FzRXhwcmVzc2lvbihleHByKSkge1xuICAgICAgcmV0dXJuIHRoaXMudW53cmFwVG9PYmplY3RMaXRlcmFsKGV4cHIuZXhwcmVzc2lvbik7XG4gICAgfVxuICAgIC8vIOyngeygkSDqsJ3ssrQg66as7YSw65+0XG4gICAgaWYgKHRzLmlzT2JqZWN0TGl0ZXJhbEV4cHJlc3Npb24oZXhwcikpIHtcbiAgICAgIHJldHVybiBleHByO1xuICAgIH1cbiAgICAvLyBkZWZpbmVMb2NhbGUoeyAuLi4gfSkg7Zi47LacXG4gICAgaWYgKHRzLmlzQ2FsbEV4cHJlc3Npb24oZXhwcikpIHtcbiAgICAgIGNvbnN0IGZpcnN0QXJnID0gZXhwci5hcmd1bWVudHNbMF07XG4gICAgICBpZiAoZmlyc3RBcmcgJiYgdHMuaXNPYmplY3RMaXRlcmFsRXhwcmVzc2lvbihmaXJzdEFyZykpIHtcbiAgICAgICAgcmV0dXJuIGZpcnN0QXJnO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBPYmplY3RMaXRlcmFsRXhwcmVzc2lvbuyXkOyEnCBEaWN0RW50cnkg7LaU7LacXG4gICAqL1xuICBwcml2YXRlIGV4dHJhY3RFbnRyaWVzRnJvbU9iamVjdChcbiAgICBvYmplY3RMaXRlcmFsOiB0cy5PYmplY3RMaXRlcmFsRXhwcmVzc2lvbixcbiAgICBzb3VyY2VGaWxlOiB0cy5Tb3VyY2VGaWxlLFxuICAgIGVudHJpZXM6IERpY3RFbnRyeVtdLFxuICApOiB2b2lkIHtcbiAgICBmb3IgKGNvbnN0IHByb3Agb2Ygb2JqZWN0TGl0ZXJhbC5wcm9wZXJ0aWVzKSB7XG4gICAgICBjb25zdCBlbnRyeSA9IHRoaXMuZXh0cmFjdERpY3RFbnRyeShwcm9wLCBzb3VyY2VGaWxlKTtcbiAgICAgIGlmIChlbnRyeSkge1xuICAgICAgICBlbnRyaWVzLnB1c2goZW50cnkpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBQcm9wZXJ0eU5hbWXsl5DshJwg7YKkIOusuOyekOyXtCDstpTstpxcbiAgICogLSDrrLjsnpDsl7Qg66as7YSw65+0OiBcImtleVwiXG4gICAqIC0g7Iud67OE7J6QOiBrZXkgKHVucXVvdGVkKVxuICAgKi9cbiAgcHJpdmF0ZSBnZXRQcm9wZXJ0eUtleShuYW1lOiB0cy5Qcm9wZXJ0eU5hbWUpOiBzdHJpbmcgfCBudWxsIHtcbiAgICBpZiAodHMuaXNTdHJpbmdMaXRlcmFsKG5hbWUpKSB7XG4gICAgICByZXR1cm4gbmFtZS50ZXh0O1xuICAgIH1cbiAgICBpZiAodHMuaXNJZGVudGlmaWVyKG5hbWUpKSB7XG4gICAgICByZXR1cm4gbmFtZS50ZXh0O1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiDtlITroZztjbzti7Dsl5DshJwgRGljdEVudHJ5IOy2lOy2nFxuICAgKiAtIOusuOyekOyXtDog7Iuk7KCcIOusuOyekOyXtCDqsJJcbiAgICogLSDtlajsiJg6IOybkOuzuCDshozsiqQgKOyXrOufrCDspITsnYAg7ZWcIOykhOuhnCDsoJXqt5ztmZQpXG4gICAqL1xuICBwcml2YXRlIGV4dHJhY3REaWN0RW50cnkoXG4gICAgcHJvcDogdHMuT2JqZWN0TGl0ZXJhbEVsZW1lbnRMaWtlLFxuICAgIHNvdXJjZUZpbGU6IHRzLlNvdXJjZUZpbGUsXG4gICk6IERpY3RFbnRyeSB8IG51bGwge1xuICAgIGlmICghdHMuaXNQcm9wZXJ0eUFzc2lnbm1lbnQocHJvcCkpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGNvbnN0IGtleSA9IHRoaXMuZ2V0UHJvcGVydHlLZXkocHJvcC5uYW1lKTtcbiAgICBpZiAoIWtleSkgcmV0dXJuIG51bGw7XG5cbiAgICBjb25zdCBpbml0ID0gcHJvcC5pbml0aWFsaXplcjtcblxuICAgIC8vIO2ZlOyCtO2RnCDtlajsiJhcbiAgICBpZiAodHMuaXNBcnJvd0Z1bmN0aW9uKGluaXQpKSB7XG4gICAgICBjb25zdCBmdW5jVGV4dCA9IGluaXQuZ2V0VGV4dChzb3VyY2VGaWxlKTtcbiAgICAgIGNvbnN0IG5vcm1hbGl6ZWQgPSBmdW5jVGV4dC5yZXBsYWNlKC9cXHMqXFxuXFxzKi9nLCBcIiBcIikudHJpbSgpO1xuICAgICAgcmV0dXJuIHsga2V5LCB2YWx1ZTogbm9ybWFsaXplZCwgaXNGdW5jdGlvbjogdHJ1ZSB9O1xuICAgIH1cblxuICAgIC8vIOusuOyekOyXtCDrpqzthLDrn7RcbiAgICBpZiAodHMuaXNTdHJpbmdMaXRlcmFsKGluaXQpKSB7XG4gICAgICByZXR1cm4geyBrZXksIHZhbHVlOiBpbml0LnRleHQsIGlzRnVuY3Rpb246IGZhbHNlIH07XG4gICAgfVxuXG4gICAgLy8g7YWc7ZSM66a/IOumrO2EsOuftCAo67OA7IiYIOyXhuydjClcbiAgICBpZiAodHMuaXNOb1N1YnN0aXR1dGlvblRlbXBsYXRlTGl0ZXJhbChpbml0KSkge1xuICAgICAgcmV0dXJuIHsga2V5LCB2YWx1ZTogaW5pdC50ZXh0LCBpc0Z1bmN0aW9uOiBmYWxzZSB9O1xuICAgIH1cblxuICAgIC8vIOq4sO2DgCAo7JiIOiDtlajsiJgg7ZGc7ZiE7IudKVxuICAgIHJldHVybiB7XG4gICAgICBrZXksXG4gICAgICB2YWx1ZTogaW5pdC5nZXRUZXh0KHNvdXJjZUZpbGUpLFxuICAgICAgaXNGdW5jdGlvbjogdHMuaXNGdW5jdGlvbkV4cHJlc3Npb24oaW5pdCksXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiDtlITroZzsoJ3tirjsnZggaTE4biBkaWN0IO2MjOydvCDqsr3roZzrpbwg67CY7ZmY7ZWp64uI64ukLlxuICAgKiBAcGFyYW0gbG9jYWxlIC0g66Gc7LyA7J28IChrbywgZW4g65OxKVxuICAgKiBAcGFyYW0gdGFyZ2V0IC0g7YOA6rKfIOuUlOugie2GoOumrCAoYXBpLCB3ZWIsIGFwcClcbiAgICovXG4gIGdldFByb2plY3REaWN0UGF0aChsb2NhbGU6IHN0cmluZywgdGFyZ2V0OiBcImFwaVwiIHwgXCJ3ZWJcIiB8IFwiYXBwXCIgPSBcImFwaVwiKTogc3RyaW5nIHtcbiAgICBjb25zdCBkaXIgPSB0YXJnZXQgPT09IFwiYXBpXCIgPyBTb25hbXUuY29uZmlnLmFwaS5kaXIgOiB0YXJnZXQ7XG4gICAgcmV0dXJuIHBhdGguam9pbihTb25hbXUuYXBwUm9vdFBhdGgsIGRpciwgXCJzcmNcIiwgXCJpMThuXCIsIGAke2xvY2FsZX0udHNgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBzb25hbXUg64K07J6lIGRpY3Qg7YyM7J28IOqyveuhnOulvCDrsJjtmZjtlanri4jri6QuXG4gICAqL1xuICBwcml2YXRlIGdldFNvbmFtdURpY3RQYXRoKGxvY2FsZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBjb25zdCBwYWNrYWdlUm9vdCA9IHBhdGgucmVzb2x2ZShpbXBvcnQubWV0YS5kaXJuYW1lLCBcIi4uXCIsIFwiLi5cIik7XG4gICAgcmV0dXJuIHBhdGguam9pbihwYWNrYWdlUm9vdCwgXCJzcmNcIiwgXCJkaWN0XCIsIGAke2xvY2FsZX0udHNgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDtlYTsmpTtlZwgZGljdCDtgqTqsIAg7ZSE66Gc7KCd7Yq47JeQIOyhtOyerO2VmOuKlOyngCDtmZXsnbjtlZjqs6AsIOyXhuycvOuptCDstpTqsIDtlanri4jri6QuXG4gICAqIGRlZmF1bHRMb2NhbGXsl5Drp4wg7LaU6rCA7ZWY66mwLCDri6TrpbggbG9jYWxl7J2AIOyCrOyaqeyekOqwgCDsp4HsoJEg67KI7Jet7ZW07JW8IO2VqeuLiOuLpC5cbiAgICpcbiAgICogQHBhcmFtIHJlcXVpcmVkS2V5cyAtIO2VhOyalO2VnCDtgqQg66qp66GdXG4gICAqIEBwYXJhbSB0YXJnZXQgLSDtg4Dqsp8g65SU66CJ7Yag66asIChhcGksIHdlYiwgYXBwKVxuICAgKiBAcmV0dXJucyDstpTqsIDrkJwg7YKkIOuqqeuhnVxuICAgKi9cbiAgYXN5bmMgZW5zdXJlRGljdEtleXMoXG4gICAgcmVxdWlyZWRLZXlzOiBzdHJpbmdbXSxcbiAgICB0YXJnZXQ6IFwiYXBpXCIgfCBcIndlYlwiIHwgXCJhcHBcIiA9IFwiYXBpXCIsXG4gICk6IFByb21pc2U8c3RyaW5nW10+IHtcbiAgICBjb25zdCB7IGRlZmF1bHRMb2NhbGUgfSA9IFNvbmFtdS5jb25maWcuaTE4bjtcbiAgICBjb25zdCBwcm9qZWN0RGljdFBhdGggPSB0aGlzLmdldFByb2plY3REaWN0UGF0aChkZWZhdWx0TG9jYWxlLCB0YXJnZXQpO1xuXG4gICAgLy8g7ZSE66Gc7KCd7Yq4IGRpY3Qg7YyM7J287J20IOyXhuycvOuptCDslYTrrLTqsoPrj4Qg7ZWY7KeAIOyViuydjFxuICAgIGlmICghZnMuZXhpc3RzU3luYyhwcm9qZWN0RGljdFBhdGgpKSB7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuXG4gICAgLy8g7ZSE66Gc7KCd7Yq4IGRpY3Tsl5DshJwg6riw7KG0IO2CpCDtjIzsi7FcbiAgICBjb25zdCBwcm9qZWN0RW50cmllcyA9IHRoaXMucGFyc2VEaWN0RmlsZShwcm9qZWN0RGljdFBhdGgpO1xuICAgIGNvbnN0IGV4aXN0aW5nS2V5cyA9IG5ldyBTZXQocHJvamVjdEVudHJpZXMubWFwKChlKSA9PiBlLmtleSkpO1xuXG4gICAgLy8g64iE652965CcIO2CpCDssL7quLBcbiAgICBjb25zdCBtaXNzaW5nS2V5cyA9IHJlcXVpcmVkS2V5cy5maWx0ZXIoKGtleSkgPT4gIWV4aXN0aW5nS2V5cy5oYXMoa2V5KSk7XG5cbiAgICBpZiAobWlzc2luZ0tleXMubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuXG4gICAgLy8gc29uYW11IGRpY3Tsl5DshJwg6riw67O46rCSIOqwgOyguOyYpOq4sFxuICAgIGNvbnN0IHNvbmFtdURpY3RQYXRoID0gdGhpcy5nZXRTb25hbXVEaWN0UGF0aChkZWZhdWx0TG9jYWxlKTtcbiAgICBpZiAoIWZzLmV4aXN0c1N5bmMoc29uYW11RGljdFBhdGgpKSB7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuXG4gICAgY29uc3Qgc29uYW11RW50cmllcyA9IHRoaXMucGFyc2VEaWN0RmlsZShzb25hbXVEaWN0UGF0aCk7XG4gICAgY29uc3Qgc29uYW11RGljdCA9IG5ldyBNYXAoc29uYW11RW50cmllcy5tYXAoKGUpID0+IFtlLmtleSwgZV0pKTtcblxuICAgIC8vIOy2lOqwgO2VoCDsl5Ttirjrpqwg7IOd7ISxXG4gICAgY29uc3QgZW50cmllc1RvQWRkID0gbWlzc2luZ0tleXNcbiAgICAgIC5tYXAoKGtleSkgPT4gc29uYW11RGljdC5nZXQoa2V5KSlcbiAgICAgIC5maWx0ZXIoKGVudHJ5KTogZW50cnkgaXMgTm9uTnVsbGFibGU8dHlwZW9mIGVudHJ5PiA9PiBlbnRyeSAhPT0gdW5kZWZpbmVkKTtcblxuICAgIGlmIChlbnRyaWVzVG9BZGQubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuXG4gICAgLy8g7ZSE66Gc7KCd7Yq4IGRpY3Qg7YyM7J287JeQIOy2lOqwgFxuICAgIGF3YWl0IHRoaXMuYXBwZW5kRW50cmllc1RvRGljdEZpbGUocHJvamVjdERpY3RQYXRoLCBlbnRyaWVzVG9BZGQsIGRlZmF1bHRMb2NhbGUsIHRydWUpO1xuXG4gICAgcmV0dXJuIGVudHJpZXNUb0FkZC5tYXAoKGUpID0+IGUua2V5KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBkaWN0IO2MjOydvOyXkCDsl5Ttirjrpqzrpbwg7LaU6rCA7ZWp64uI64ukLlxuICAgKiDquLDsobQg7YyM7J287J2EIO2MjOyLse2VmOqzoCwg7IOIIOyXlO2KuOumrOulvCDstpTqsIDtlZwg65KkLCDsoITssrQg7YyM7J287J2EIOyerOyDneyEse2VqeuLiOuLpC5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgYXBwZW5kRW50cmllc1RvRGljdEZpbGUoXG4gICAgZmlsZVBhdGg6IHN0cmluZyxcbiAgICBlbnRyaWVzOiBEaWN0RW50cnlbXSxcbiAgICBsb2NhbGU6IHN0cmluZyxcbiAgICBpc0RlZmF1bHRMb2NhbGU6IGJvb2xlYW4sXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIC8vIOq4sOyhtCBlbnRyaWVzIO2MjOyLsVxuICAgIGNvbnN0IGV4aXN0aW5nRW50cmllcyA9IHRoaXMucGFyc2VEaWN0RmlsZShmaWxlUGF0aCk7XG5cbiAgICAvLyDsg4ggZW50cmllcyDstpTqsIBcbiAgICBmb3IgKGNvbnN0IGVudHJ5IG9mIGVudHJpZXMpIHtcbiAgICAgIGV4aXN0aW5nRW50cmllcy5wdXNoKGVudHJ5KTtcbiAgICB9XG5cbiAgICAvLyDtjIzsnbwg7J6s7IOd7ISxXG4gICAgY29uc3QgY29udGVudCA9IHRoaXMuZ2VuZXJhdGVQcm9qZWN0RGljdChsb2NhbGUsIGV4aXN0aW5nRW50cmllcywgaXNEZWZhdWx0TG9jYWxlKTtcbiAgICBjb25zdCBmb3JtYXR0ZWQgPSBhd2FpdCBmb3JtYXRDb2RlKGNvbnRlbnQsIGZpbGVQYXRoKTtcbiAgICBmcy53cml0ZUZpbGVTeW5jKGZpbGVQYXRoLCBmb3JtYXR0ZWQsIFwidXRmLThcIik7XG4gIH1cblxuICAvKipcbiAgICog7ZWo7IiYIOqwkuuTpOyXkOyEnCDsgqzsmqnrkJjripQg7Zes7Y28IO2VqOyImOulvCDqsJDsp4Dtlanri4jri6QuXG4gICAqL1xuICBwcml2YXRlIGRldGVjdFVzZWRIZWxwZXJzKGVudHJpZXM6IERpY3RFbnRyeVtdKSB7XG4gICAgY29uc3QgZnVuY3Rpb25FbnRyaWVzID0gZW50cmllcy5maWx0ZXIoKGUpID0+IGUuaXNGdW5jdGlvbik7XG4gICAgY29uc3QgaGVscGVyczogc3RyaW5nW10gPSBbXTtcblxuICAgIGZvciAoY29uc3QgaGVscGVyIG9mIFtcInBsdXJhbFwiLCBcImpvc2FcIl0pIHtcbiAgICAgIC8vIO2VqOyImOuqheydtCDri6jslrQg6rK96rOE66GcIOyCrOyaqeuQmOuKlOyngCDtmZXsnbggKOyYiDogcGx1cmFsKCDrmJDripQgcGx1cmFsLClcbiAgICAgIGNvbnN0IHBhdHRlcm4gPSBuZXcgUmVnRXhwKGBcXFxcYiR7aGVscGVyfVxcXFxzKlxcXFwoYCk7XG4gICAgICBpZiAoZnVuY3Rpb25FbnRyaWVzLnNvbWUoKGUpID0+IHBhdHRlcm4udGVzdChlLnZhbHVlKSkpIHtcbiAgICAgICAgaGVscGVycy5wdXNoKGhlbHBlcik7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gZm9ybWF0IOyCrOyaqSDsl6zrtoAg67OE64+EIOqwkOyngCAoZm9ybWF0Lm51bWJlciguLi4pLCBmb3JtYXQuZGF0ZSguLi4pIOuTsSlcbiAgICBjb25zdCBmb3JtYXRQYXR0ZXJuID0gL1xcYmZvcm1hdFxcLlxcdytcXHMqXFwoLztcbiAgICBjb25zdCB1c2VzRm9ybWF0ID0gZnVuY3Rpb25FbnRyaWVzLnNvbWUoKGUpID0+IGZvcm1hdFBhdHRlcm4udGVzdChlLnZhbHVlKSk7XG5cbiAgICByZXR1cm4geyBoZWxwZXJzLCB1c2VzRm9ybWF0IH07XG4gIH1cblxuICAvKipcbiAgICogUHJvamVjdCBkaWN0IO2MjOydvCDsg53shLFcbiAgICovXG4gIGdlbmVyYXRlUHJvamVjdERpY3QobG9jYWxlOiBzdHJpbmcsIGVudHJpZXM6IERpY3RFbnRyeVtdLCBpc0RlZmF1bHRMb2NhbGU6IGJvb2xlYW4pOiBzdHJpbmcge1xuICAgIC8vIGtleSDslYztjIzrsrMg7IicIOygleugrFxuICAgIGNvbnN0IHNvcnRlZCA9IFsuLi5lbnRyaWVzXS50b1NvcnRlZCgoYSwgYikgPT4gYS5rZXkubG9jYWxlQ29tcGFyZShiLmtleSkpO1xuXG4gICAgY29uc3QgbGluZXM6IHN0cmluZ1tdID0gW107XG5cbiAgICAvLyDtlajsiJgg6rCS7JeQ7IScIOyCrOyaqeuQmOuKlCDtl6ztjbwg7ZWo7IiYIOqwkOyngFxuICAgIGNvbnN0IHsgaGVscGVycywgdXNlc0Zvcm1hdCB9ID0gdGhpcy5kZXRlY3RVc2VkSGVscGVycyhlbnRyaWVzKTtcblxuICAgIC8vIO2XrO2NvCDtlajsiJggaW1wb3J0IOy2lOqwgFxuICAgIGNvbnN0IGltcG9ydHMgPSBbLi4uaGVscGVyc107XG4gICAgaWYgKHVzZXNGb3JtYXQpIHtcbiAgICAgIGltcG9ydHMucHVzaChcImNyZWF0ZUZvcm1hdFwiKTtcbiAgICB9XG4gICAgaWYgKGltcG9ydHMubGVuZ3RoID4gMCkge1xuICAgICAgbGluZXMucHVzaChgaW1wb3J0IHsgJHtpbXBvcnRzLmpvaW4oXCIsIFwiKX0gfSBmcm9tIFwic29uYW11L2RpY3RcIjtgKTtcbiAgICB9XG5cbiAgICBpZiAoIWlzRGVmYXVsdExvY2FsZSkge1xuICAgICAgbGluZXMucHVzaCgnaW1wb3J0IHsgZGVmaW5lTG9jYWxlIH0gZnJvbSBcIi4vc2QuZ2VuZXJhdGVkXCI7Jyk7XG4gICAgfVxuXG4gICAgaWYgKGltcG9ydHMubGVuZ3RoID4gMCB8fCAhaXNEZWZhdWx0TG9jYWxlKSB7XG4gICAgICBsaW5lcy5wdXNoKFwiXCIpO1xuICAgIH1cblxuICAgIC8vIGZvcm1hdCDsgqzsmqkg7IucIGNyZWF0ZUZvcm1hdCDtmLjstpwg7LaU6rCAXG4gICAgaWYgKHVzZXNGb3JtYXQpIHtcbiAgICAgIGxpbmVzLnB1c2goYGNvbnN0IGZvcm1hdCA9IGNyZWF0ZUZvcm1hdChcIiR7bG9jYWxlfVwiKTtgKTtcbiAgICAgIGxpbmVzLnB1c2goXCJcIik7XG4gICAgfVxuXG4gICAgbGluZXMucHVzaChcIi8qKlwiKTtcbiAgICBsaW5lcy5wdXNoKGAgKiBQcm9qZWN0ICR7bG9jYWxlLnRvVXBwZXJDYXNlKCl9IERpY3Rpb25hcnlgKTtcbiAgICBsaW5lcy5wdXNoKFwiICovXCIpO1xuXG4gICAgaWYgKGlzRGVmYXVsdExvY2FsZSkge1xuICAgICAgbGluZXMucHVzaChcImV4cG9ydCBkZWZhdWx0IHtcIik7XG4gICAgfSBlbHNlIHtcbiAgICAgIGxpbmVzLnB1c2goXCJleHBvcnQgZGVmYXVsdCBkZWZpbmVMb2NhbGUoe1wiKTtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IGVudHJ5IG9mIHNvcnRlZCkge1xuICAgICAgaWYgKGVudHJ5LmlzRnVuY3Rpb24pIHtcbiAgICAgICAgLy8g7ZWo7IiY7J24IOqyveyasDog7JuQ7ZiVIOq3uOuMgOuhnCDstpzroKVcbiAgICAgICAgbGluZXMucHVzaChgICBcIiR7ZW50cnkua2V5fVwiOiAke2VudHJ5LnZhbHVlfSxgKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGxpbmVzLnB1c2goYCAgXCIke2VudHJ5LmtleX1cIjogJHtKU09OLnN0cmluZ2lmeShlbnRyeS52YWx1ZSl9LGApO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChpc0RlZmF1bHRMb2NhbGUpIHtcbiAgICAgIGxpbmVzLnB1c2goXCJ9IGFzIGNvbnN0O1wiKTtcbiAgICB9IGVsc2Uge1xuICAgICAgbGluZXMucHVzaChcIn0pO1wiKTtcbiAgICB9XG4gICAgbGluZXMucHVzaChcIlwiKTtcblxuICAgIHJldHVybiBsaW5lcy5qb2luKFwiXFxuXCIpO1xuICB9XG5cbiAgLyoqXG4gICAqIGkxOG4g7ISk7KCV7J2EIOqwgOyguOyYteuLiOuLpC5cbiAgICovXG4gIHByaXZhdGUgZ2V0STE4bkNvbmZpZygpOiBJMThuQ29uZmlnIHtcbiAgICByZXR1cm4gU29uYW11LmNvbmZpZy5pMThuO1xuICB9XG5cbiAgLyoqXG4gICAqIGkxOG4g65SU66CJ7Yag66asIOqyveuhnOulvCDrsJjtmZjtlZjqs6AsIOyXhuycvOuptCDsg53shLHtlanri4jri6QuXG4gICAqL1xuICBwcml2YXRlIGVuc3VyZUkxOG5EaXIoKTogc3RyaW5nIHtcbiAgICBjb25zdCBpMThuRGlyID0gcGF0aC5qb2luKFNvbmFtdS5hcGlSb290UGF0aCwgXCJzcmNcIiwgXCJpMThuXCIpO1xuICAgIGlmICghZnMuZXhpc3RzU3luYyhpMThuRGlyKSkge1xuICAgICAgZnMubWtkaXJTeW5jKGkxOG5EaXIsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgIH1cbiAgICByZXR1cm4gaTE4bkRpcjtcbiAgfVxuXG4gIC8qKlxuICAgKiBkaWN0IO2MjOydvOydhCDsoIDsnqXtlanri4jri6QuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHNhdmVEaWN0RmlsZShcbiAgICBsb2NhbGU6IHN0cmluZyxcbiAgICBlbnRyaWVzOiBEaWN0RW50cnlbXSxcbiAgICBpc0RlZmF1bHRMb2NhbGU6IGJvb2xlYW4sXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGkxOG5EaXIgPSB0aGlzLmVuc3VyZUkxOG5EaXIoKTtcbiAgICBjb25zdCBkaWN0UGF0aCA9IHBhdGguam9pbihpMThuRGlyLCBgJHtsb2NhbGV9LnRzYCk7XG4gICAgY29uc3QgY29udGVudCA9IHRoaXMuZ2VuZXJhdGVQcm9qZWN0RGljdChsb2NhbGUsIGVudHJpZXMsIGlzRGVmYXVsdExvY2FsZSk7XG4gICAgY29uc3QgZm9ybWF0dGVkID0gYXdhaXQgZm9ybWF0Q29kZShjb250ZW50LCBkaWN0UGF0aCk7XG4gICAgZnMud3JpdGVGaWxlU3luYyhkaWN0UGF0aCwgZm9ybWF0dGVkLCBcInV0Zi04XCIpO1xuICB9XG5cbiAgLyoqXG4gICAqIGkxOG4ga2V566W8IO2MjOyLse2VmOyXrCBlbnRpdHkg6rSA66CoIOygleuztCDstpTstpxcbiAgICovXG4gIHBhcnNlRW50aXR5S2V5KGtleTogc3RyaW5nKTogRW50aXR5S2V5SW5mbyB7XG4gICAgLy8gZW50aXR5LntFbnRpdHlJZH0gKGxpc3QsIGNyZWF0ZSwgZWRpdCDsoJzsmbgpXG4gICAgY29uc3QgZW50aXR5VGl0bGVNYXRjaCA9IGtleS5tYXRjaCgvXmVudGl0eVxcLihbQS1aXVthLXpBLVowLTldKikkLyk7XG4gICAgaWYgKFxuICAgICAgZW50aXR5VGl0bGVNYXRjaCAmJlxuICAgICAgIWtleS5pbmNsdWRlcyhcIi5saXN0XCIpICYmXG4gICAgICAha2V5LmluY2x1ZGVzKFwiLmNyZWF0ZVwiKSAmJlxuICAgICAgIWtleS5pbmNsdWRlcyhcIi5lZGl0XCIpXG4gICAgKSB7XG4gICAgICByZXR1cm4geyB0eXBlOiBcImVudGl0eVRpdGxlXCIsIGVudGl0eUlkOiBlbnRpdHlUaXRsZU1hdGNoWzFdIH07XG4gICAgfVxuXG4gICAgLy8gZW50aXR5LntFbnRpdHlJZH0ue3Byb3BOYW1lfVxuICAgIGNvbnN0IHByb3BEZXNjTWF0Y2ggPSBrZXkubWF0Y2goL15lbnRpdHlcXC4oW0EtWl1bYS16QS1aMC05XSopXFwuKFthLXpfXVthLXowLTlfXSopJC8pO1xuICAgIGlmIChwcm9wRGVzY01hdGNoKSB7XG4gICAgICByZXR1cm4geyB0eXBlOiBcInByb3BEZXNjXCIsIGVudGl0eUlkOiBwcm9wRGVzY01hdGNoWzFdLCBwcm9wTmFtZTogcHJvcERlc2NNYXRjaFsyXSB9O1xuICAgIH1cblxuICAgIC8vIGVudW0ue0VudW1JZH0ue3ZhbHVlfVxuICAgIGNvbnN0IGVudW1MYWJlbE1hdGNoID0ga2V5Lm1hdGNoKC9eZW51bVxcLihbQS1aXVthLXpBLVowLTldKilcXC4oLispJC8pO1xuICAgIGlmIChlbnVtTGFiZWxNYXRjaCkge1xuICAgICAgcmV0dXJuIHsgdHlwZTogXCJlbnVtTGFiZWxcIiwgZW51bUlkOiBlbnVtTGFiZWxNYXRjaFsxXSwgZW51bVZhbHVlOiBlbnVtTGFiZWxNYXRjaFsyXSB9O1xuICAgIH1cblxuICAgIHJldHVybiB7IHR5cGU6IFwib3RoZXJcIiB9O1xuICB9XG5cbiAgLyoqXG4gICAqIGVudGl0eSBrZXnsl5Ag64yA7ZW0IGVudGl0eS5qc29uIOyXheuNsOydtO2KuCDsiJjtlolcbiAgICogQHJldHVybnMg7JeF642w7J207Yq4IOyXrOu2gFxuICAgKi9cbiAgYXN5bmMgdXBkYXRlRW50aXR5QnlLZXkoa2V5OiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBjb25zdCBrZXlJbmZvID0gdGhpcy5wYXJzZUVudGl0eUtleShrZXkpO1xuXG4gICAgc3dpdGNoIChrZXlJbmZvLnR5cGUpIHtcbiAgICAgIGNhc2UgXCJlbnRpdHlUaXRsZVwiOiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgZW50aXR5ID0gRW50aXR5TWFuYWdlci5nZXQoa2V5SW5mby5lbnRpdHlJZCk7XG4gICAgICAgICAgaWYgKGVudGl0eS50aXRsZSAhPT0gdmFsdWUpIHtcbiAgICAgICAgICAgIGVudGl0eS50aXRsZSA9IHZhbHVlO1xuICAgICAgICAgICAgYXdhaXQgZW50aXR5LnNhdmUoKTtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgLy8gZW50aXR5IG5vdCBmb3VuZFxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cblxuICAgICAgY2FzZSBcInByb3BEZXNjXCI6IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCBlbnRpdHkgPSBFbnRpdHlNYW5hZ2VyLmdldChrZXlJbmZvLmVudGl0eUlkKTtcbiAgICAgICAgICBjb25zdCBwcm9wSW5kZXggPSBlbnRpdHkucHJvcHMuZmluZEluZGV4KChwKSA9PiBwLm5hbWUgPT09IGtleUluZm8ucHJvcE5hbWUpO1xuICAgICAgICAgIGlmIChwcm9wSW5kZXggIT09IC0xICYmIGVudGl0eS5wcm9wc1twcm9wSW5kZXhdLmRlc2MgIT09IHZhbHVlKSB7XG4gICAgICAgICAgICBlbnRpdHkucHJvcHNbcHJvcEluZGV4XS5kZXNjID0gdmFsdWU7XG4gICAgICAgICAgICBhd2FpdCBlbnRpdHkuc2F2ZSgpO1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgfVxuICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAvLyBlbnRpdHkgbm90IGZvdW5kXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuXG4gICAgICBjYXNlIFwiZW51bUxhYmVsXCI6IHtcbiAgICAgICAgZm9yIChjb25zdCBlbnRpdHlJZCBvZiBFbnRpdHlNYW5hZ2VyLmdldEFsbElkcygpKSB7XG4gICAgICAgICAgY29uc3QgZW50aXR5ID0gRW50aXR5TWFuYWdlci5nZXQoZW50aXR5SWQpO1xuICAgICAgICAgIGlmIChlbnRpdHkuZW51bUxhYmVsc1trZXlJbmZvLmVudW1JZF0pIHtcbiAgICAgICAgICAgIGlmIChlbnRpdHkuZW51bUxhYmVsc1trZXlJbmZvLmVudW1JZF1ba2V5SW5mby5lbnVtVmFsdWVdICE9PSB2YWx1ZSkge1xuICAgICAgICAgICAgICBlbnRpdHkuZW51bUxhYmVsc1trZXlJbmZvLmVudW1JZF1ba2V5SW5mby5lbnVtVmFsdWVdID0gdmFsdWU7XG4gICAgICAgICAgICAgIGF3YWl0IGVudGl0eS5zYXZlKCk7XG4gICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cblxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBzZC5nZW5lcmF0ZWQudHPsl5DshJwgZW50aXR5IGxhYmVscyDstpTstpxcbiAgICogZW50aXR5Lmpzb27sl5DshJwg6rSA66as65CY64qUIOqwkuunjCDtj6ztlaggKC5saXN0LCAuY3JlYXRlLCAuZWRpdCDsoJzsmbgpXG4gICAqL1xuICBleHRyYWN0RW50aXR5TGFiZWxzKCk6IERpY3RFbnRyeVtdIHtcbiAgICBjb25zdCBzZFBhdGggPSBwYXRoLmpvaW4oU29uYW11LmFwaVJvb3RQYXRoLCBcInNyY1wiLCBcImkxOG5cIiwgXCJzZC5nZW5lcmF0ZWQudHNcIik7XG4gICAgaWYgKCFmcy5leGlzdHNTeW5jKHNkUGF0aCkpIHtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5wYXJzZUNvbnN0T2JqZWN0RGVjbGFyYXRpb24oc2RQYXRoLCBcImVudGl0eUxhYmVsc1wiKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBzZC5nZW5lcmF0ZWQudHPsl5DshJwgcmMta2V5cyDstpTstpxcbiAgICogcmVhY3QtY29tcG9uZW50c+yXkOyEnCDqtIDrpqzrkJjripQgaTE4biDtgqTrk6RcbiAgICogQHBhcmFtIGxvY2FsZSAtIOuhnOy8gOydvCAoa28sIGVuIOuTsSlcbiAgICovXG4gIGV4dHJhY3RSQ0tleXMobG9jYWxlOiBzdHJpbmcpOiBEaWN0RW50cnlbXSB7XG4gICAgY29uc3Qgc2RQYXRoID0gcGF0aC5qb2luKFNvbmFtdS5hcGlSb290UGF0aCwgXCJzcmNcIiwgXCJpMThuXCIsIFwic2QuZ2VuZXJhdGVkLnRzXCIpO1xuICAgIGlmICghZnMuZXhpc3RzU3luYyhzZFBhdGgpKSB7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuXG4gICAgLy8gbG9jYWxl67OEIOuzgOyImOuqhSDrp6TtlZEgKHNkLnRlbXBsYXRlLnRz7J2YIGdldFJDS2V5c1Zhck5hbWXqs7wg64+Z7J28KVxuICAgIGNvbnN0IHZhck5hbWUgPSAoKCkgPT4ge1xuICAgICAgaWYgKGxvY2FsZSA9PT0gXCJrb1wiKSByZXR1cm4gXCJyY0tleXNLb1wiO1xuICAgICAgaWYgKGxvY2FsZSA9PT0gXCJlblwiKSByZXR1cm4gXCJyY0tleXNFblwiO1xuICAgICAgLy8g64uk66W4IGxvY2FsZeydgCBlbuydhCBmYWxsYmFja+ycvOuhnCDsgqzsmqlcbiAgICAgIHJldHVybiBcInJjS2V5c0VuXCI7XG4gICAgfSkoKTtcblxuICAgIHJldHVybiB0aGlzLnBhcnNlQ29uc3RPYmplY3REZWNsYXJhdGlvbihzZFBhdGgsIHZhck5hbWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIFByb2plY3QgZGljdCDtjIzsnbwoW2xvY2FsZV0udHMp7JeQ7IScIOuUleyFlOuEiOumrCDroZzrk5xcbiAgICovXG4gIGxvYWRQcm9qZWN0RGljdChsb2NhbGU6IHN0cmluZykge1xuICAgIGNvbnN0IGRpY3RQYXRoID0gcGF0aC5qb2luKFNvbmFtdS5hcGlSb290UGF0aCwgXCJzcmNcIiwgXCJpMThuXCIsIGAke2xvY2FsZX0udHNgKTtcbiAgICBpZiAoIWZzLmV4aXN0c1N5bmMoZGljdFBhdGgpKSB7XG4gICAgICByZXR1cm4geyBlbnRyaWVzOiBbXSB9O1xuICAgIH1cbiAgICByZXR1cm4geyBlbnRyaWVzOiB0aGlzLnBhcnNlRGljdEZpbGUoZGljdFBhdGgpIH07XG4gIH1cblxuICAvKipcbiAgICog65SV7IWU64SI66asIOuNsOydtO2EsCDsiJjsp5EgKHNvbmFtdSArIGVudGl0eSArIHByb2plY3QpXG4gICAqL1xuICBhc3luYyBjb2xsZWN0RGljdGlvbmFyeSgpOiBQcm9taXNlPERpY3Rpb25hcnlSZXN1bHQ+IHtcbiAgICBjb25zdCB7IGRlZmF1bHRMb2NhbGUsIHN1cHBvcnRlZExvY2FsZXMgfSA9IHRoaXMuZ2V0STE4bkNvbmZpZygpO1xuICAgIGNvbnN0IGxvY2FsZXMgPSBzdXBwb3J0ZWRMb2NhbGVzO1xuXG4gICAgY29uc3Qgcm93czogRGljdGlvbmFyeVJvd1tdID0gW107XG4gICAgY29uc3Qgcm93TWFwID0gbmV3IE1hcDxzdHJpbmcsIERpY3Rpb25hcnlSb3c+KCk7XG5cbiAgICAvLyAxLiBSQyBLZXlzIChzb25hbXUgc291cmNlLCDqsIEgbG9jYWxl67OEKVxuICAgIGZvciAoY29uc3QgbG9jYWxlIG9mIGxvY2FsZXMpIHtcbiAgICAgIGNvbnN0IHJjS2V5cyA9IHRoaXMuZXh0cmFjdFJDS2V5cyhsb2NhbGUpO1xuICAgICAgZm9yIChjb25zdCByY0tleSBvZiByY0tleXMpIHtcbiAgICAgICAgbGV0IHJvdyA9IHJvd01hcC5nZXQocmNLZXkua2V5KTtcbiAgICAgICAgaWYgKCFyb3cpIHtcbiAgICAgICAgICByb3cgPSB7XG4gICAgICAgICAgICBrZXk6IHJjS2V5LmtleSxcbiAgICAgICAgICAgIHNvdXJjZTogXCJzb25hbXVcIixcbiAgICAgICAgICAgIGlzRnVuY3Rpb246IHJjS2V5LmlzRnVuY3Rpb24gPz8gZmFsc2UsXG4gICAgICAgICAgfTtcbiAgICAgICAgICByb3dNYXAuc2V0KHJjS2V5LmtleSwgcm93KTtcbiAgICAgICAgfVxuICAgICAgICByb3dbbG9jYWxlXSA9IHJjS2V5LnZhbHVlO1xuICAgICAgICBpZiAocmNLZXkuaXNGdW5jdGlvbikge1xuICAgICAgICAgIHJvdy5pc0Z1bmN0aW9uID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIDIuIEVudGl0eSBsYWJlbHMgKGRlZmF1bHQgbG9jYWxlIOq4sOykgClcbiAgICBjb25zdCBlbnRpdHlMYWJlbHMgPSB0aGlzLmV4dHJhY3RFbnRpdHlMYWJlbHMoKTtcbiAgICBmb3IgKGNvbnN0IGxhYmVsIG9mIGVudGl0eUxhYmVscykge1xuICAgICAgY29uc3Qgcm93OiBEaWN0aW9uYXJ5Um93ID0ge1xuICAgICAgICBrZXk6IGxhYmVsLmtleSxcbiAgICAgICAgc291cmNlOiBcImVudGl0eVwiLFxuICAgICAgICBpc0Z1bmN0aW9uOiBsYWJlbC5pc0Z1bmN0aW9uID8/IGZhbHNlLFxuICAgICAgICBbZGVmYXVsdExvY2FsZV06IGxhYmVsLnZhbHVlLFxuICAgICAgfTtcbiAgICAgIHJvd01hcC5zZXQobGFiZWwua2V5LCByb3cpO1xuICAgIH1cblxuICAgIC8vIDMuIFByb2plY3QgZGljdCAo6rCBIGxvY2FsZeuzhClcbiAgICBmb3IgKGNvbnN0IGxvY2FsZSBvZiBsb2NhbGVzKSB7XG4gICAgICBjb25zdCB7IGVudHJpZXMgfSA9IHRoaXMubG9hZFByb2plY3REaWN0KGxvY2FsZSk7XG4gICAgICBmb3IgKGNvbnN0IGVudHJ5IG9mIGVudHJpZXMpIHtcbiAgICAgICAgY29uc3QgZXhpc3RpbmcgPSByb3dNYXAuZ2V0KGVudHJ5LmtleSk7XG4gICAgICAgIGlmIChleGlzdGluZykge1xuICAgICAgICAgIC8vIHNvbmFtdSwgZW50aXR5IHNvdXJjZeqwgCDsnojsnLzrqbQg7ZW064u5IGxvY2FsZSDqsJLrp4wg7LaU6rCAXG4gICAgICAgICAgZXhpc3RpbmdbbG9jYWxlXSA9IGVudHJ5LnZhbHVlO1xuICAgICAgICAgIGlmIChlbnRyeS5pc0Z1bmN0aW9uKSB7XG4gICAgICAgICAgICBleGlzdGluZy5pc0Z1bmN0aW9uID0gdHJ1ZTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gcHJvamVjdCBzb3VyY2XroZwg7IOI66GcIOy2lOqwgFxuICAgICAgICAgIGxldCByb3cgPSByb3dNYXAuZ2V0KGVudHJ5LmtleSk7XG4gICAgICAgICAgaWYgKCFyb3cpIHtcbiAgICAgICAgICAgIHJvdyA9IHtcbiAgICAgICAgICAgICAga2V5OiBlbnRyeS5rZXksXG4gICAgICAgICAgICAgIHNvdXJjZTogXCJwcm9qZWN0XCIsXG4gICAgICAgICAgICAgIGlzRnVuY3Rpb246IGVudHJ5LmlzRnVuY3Rpb24sXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgcm93TWFwLnNldChlbnRyeS5rZXksIHJvdyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJvd1tsb2NhbGVdID0gZW50cnkudmFsdWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICByb3dzLnB1c2goLi4ucm93TWFwLnZhbHVlcygpKTtcbiAgICByb3dzLnNvcnQoKGEsIGIpID0+IGEua2V5LmxvY2FsZUNvbXBhcmUoYi5rZXkpKTtcblxuICAgIC8vIO2GteqzhCDqs4TsgrA6IGxvY2FsZeuzhCAo7LGE7JuM7KeEIOqwkiAvIOyghOyytCDtgqQg7IiYKVxuICAgIGNvbnN0IHN0YXRzOiBSZWNvcmQ8c3RyaW5nLCB7IHRvdGFsOiBudW1iZXI7IGZpbGxlZDogbnVtYmVyOyBwZXJjZW50OiBudW1iZXIgfT4gPSB7fTtcbiAgICBjb25zdCB0b3RhbCA9IHJvd3MubGVuZ3RoO1xuICAgIGZvciAoY29uc3QgbG9jYWxlIG9mIGxvY2FsZXMpIHtcbiAgICAgIGNvbnN0IGZpbGxlZCA9IHJvd3MuZmlsdGVyKChyb3cpID0+ICEhcm93W2xvY2FsZV0pLmxlbmd0aDtcbiAgICAgIGNvbnN0IHBlcmNlbnQgPSB0b3RhbCA+IDAgPyBNYXRoLnJvdW5kKChmaWxsZWQgLyB0b3RhbCkgKiAxMDApIDogMDtcbiAgICAgIHN0YXRzW2xvY2FsZV0gPSB7IHRvdGFsLCBmaWxsZWQsIHBlcmNlbnQgfTtcbiAgICB9XG5cbiAgICByZXR1cm4geyByb3dzLCBsb2NhbGVzLCBkZWZhdWx0TG9jYWxlLCBzdGF0cyB9O1xuICB9XG5cbiAgLyoqXG4gICAqIOuUleyFlOuEiOumrCDsobDtmoxcbiAgICovXG4gIGFzeW5jIGdldERpY3Rpb25hcnkoKTogUHJvbWlzZTxEaWN0aW9uYXJ5UmVzdWx0PiB7XG4gICAgcmV0dXJuIHRoaXMuY29sbGVjdERpY3Rpb25hcnkoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFeGNlbOuhnCDrgrTrs7TrgrTquLBcbiAgICovXG4gIGFzeW5jIGV4cG9ydFRvRXhjZWwoKTogUHJvbWlzZTx7IGZpbGVuYW1lOiBzdHJpbmc7IGJ1ZmZlcjogQnVmZmVyIH0+IHtcbiAgICBjb25zdCB7IHJvd3MsIGxvY2FsZXMgfSA9IGF3YWl0IHRoaXMuY29sbGVjdERpY3Rpb25hcnkoKTtcblxuICAgIGNvbnN0IHdiID0gbmV3IFdvcmtib29rKCk7XG4gICAgY29uc3Qgc2hlZXQgPSBcImkxOG5cIjtcbiAgICB3Yi5zZXRTaGVldE5hbWUoXCJTaGVldDFcIiwgc2hlZXQpO1xuXG4gICAgY29uc3QgcHJvamVjdE5hbWUgPSBgJHtTb25hbXUuY29uZmlnLnByb2plY3ROYW1lID8/IFwiU29uYW11XCJ9IERpY3Rpb25hcnlgO1xuICAgIGNvbnN0IGhlYWRlcnMgPSBbXCJrZXlcIiwgXCJzb3VyY2VcIiwgLi4ubG9jYWxlc107XG5cbiAgICAvLyDsiqTtg4Dsnbwg7KCV7J2YXG4gICAgY29uc3QgdGl0bGVTdHlsZUlkID0gd2IuYWRkU3R5bGUoe1xuICAgICAgZm9udDogeyBzaXplOiAyMyB9LFxuICAgICAgYWxpZ25tZW50OiB7IHZlcnRpY2FsOiBcImNlbnRlclwiLCBob3Jpem9udGFsOiBcImxlZnRcIiB9LFxuICAgIH0pO1xuICAgIGNvbnN0IGhlYWRlclN0eWxlSWQgPSB3Yi5hZGRTdHlsZSh7XG4gICAgICBmb250OiB7IGJvbGQ6IHRydWUsIHNpemU6IDExIH0sXG4gICAgICBhbGlnbm1lbnQ6IHsgaG9yaXpvbnRhbDogXCJjZW50ZXJcIiwgdmVydGljYWw6IFwiY2VudGVyXCIgfSxcbiAgICAgIGZpbGw6IHsgcGF0dGVybjogXCJzb2xpZFwiLCBmZ0NvbG9yOiBcIkYxRjFGMVwiIH0sXG4gICAgICBib3JkZXI6IHtcbiAgICAgICAgdG9wOiB7IHN0eWxlOiBcInRoaW5cIiwgY29sb3I6IFwiRDBEMEQwXCIgfSxcbiAgICAgICAgbGVmdDogeyBzdHlsZTogXCJ0aGluXCIsIGNvbG9yOiBcIkQwRDBEMFwiIH0sXG4gICAgICAgIGJvdHRvbTogeyBzdHlsZTogXCJ0aGluXCIsIGNvbG9yOiBcIkQwRDBEMFwiIH0sXG4gICAgICAgIHJpZ2h0OiB7IHN0eWxlOiBcInRoaW5cIiwgY29sb3I6IFwiRDBEMEQwXCIgfSxcbiAgICAgIH0sXG4gICAgfSk7XG4gICAgY29uc3QgZGF0YVN0eWxlSWQgPSB3Yi5hZGRTdHlsZSh7XG4gICAgICBmb250OiB7IHNpemU6IDExIH0sXG4gICAgICBhbGlnbm1lbnQ6IHsgdmVydGljYWw6IFwiY2VudGVyXCIsIGhvcml6b250YWw6IFwibGVmdFwiIH0sXG4gICAgfSk7XG5cbiAgICAvLyDtlokgMTog7ZSE66Gc7KCd7Yq466qFXG4gICAgd2Iuc2V0Q2VsbFZhbHVlKHNoZWV0LCBcIkExXCIsIHByb2plY3ROYW1lKTtcbiAgICB3Yi5zZXRDZWxsU3R5bGUoc2hlZXQsIFwiQTFcIiwgdGl0bGVTdHlsZUlkKTtcbiAgICB3Yi5zZXRSb3dIZWlnaHQoc2hlZXQsIDEsIDI4KTtcblxuICAgIC8vIO2WiSAyOiDruYgg7ZaJICjquLDrs7jqsJIpXG5cbiAgICAvLyDtlokgMzog7Zek642UXG4gICAgd2Iuc2V0Um93VmFsdWVzKHNoZWV0LCAzLCBcIkFcIiwgaGVhZGVycyk7XG4gICAgd2Iuc2V0Um93SGVpZ2h0KHNoZWV0LCAzLCAyNik7XG4gICAgZm9yIChsZXQgY29sID0gMDsgY29sIDwgaGVhZGVycy5sZW5ndGg7IGNvbCsrKSB7XG4gICAgICB3Yi5zZXRDZWxsU3R5bGUoc2hlZXQsIGAke2NvbExldHRlcihjb2wpfTNgLCBoZWFkZXJTdHlsZUlkKTtcbiAgICB9XG5cbiAgICAvLyDtlokgNCDsnbTtm4Q6IOuNsOydtO2EsFxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcm93cy5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3Qgcm93ID0gcm93c1tpXTtcbiAgICAgIGNvbnN0IHZhbHVlcyA9IFtyb3cua2V5LCByb3cuc291cmNlLCAuLi5sb2NhbGVzLm1hcCgobG9jYWxlKSA9PiByb3dbbG9jYWxlXSA/PyBcIlwiKV07XG4gICAgICBjb25zdCByb3dOdW0gPSBpICsgNDtcbiAgICAgIHdiLnNldFJvd1ZhbHVlcyhzaGVldCwgcm93TnVtLCBcIkFcIiwgdmFsdWVzKTtcbiAgICAgIHdiLnNldFJvd0hlaWdodChzaGVldCwgcm93TnVtLCAyNCk7XG4gICAgICBmb3IgKGxldCBjb2wgPSAwOyBjb2wgPCB2YWx1ZXMubGVuZ3RoOyBjb2wrKykge1xuICAgICAgICB3Yi5zZXRDZWxsU3R5bGUoc2hlZXQsIGAke2NvbExldHRlcihjb2wpfSR7cm93TnVtfWAsIGRhdGFTdHlsZUlkKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyDsu6zrn7wg64SI67mEIOqzhOyCsFxuICAgIGNvbnN0IE1BWF9XSURUSCA9IDUwO1xuICAgIGNvbnN0IE1JTl9XSURUSCA9IDEwO1xuICAgIGNvbnN0IGNvbHVtbldpZHRoczogbnVtYmVyW10gPSBoZWFkZXJzLm1hcCgoaGVhZGVyKSA9PiBNYXRoLm1heChoZWFkZXIubGVuZ3RoLCBNSU5fV0lEVEgpKTtcblxuICAgIGZvciAoY29uc3Qgcm93IG9mIHJvd3MpIHtcbiAgICAgIGNvbnN0IHZhbHVlcyA9IFtyb3cua2V5LCByb3cuc291cmNlLCAuLi5sb2NhbGVzLm1hcCgobG9jYWxlKSA9PiByb3dbbG9jYWxlXSA/PyBcIlwiKV07XG4gICAgICB2YWx1ZXMuZm9yRWFjaCgodmFsdWUsIGlkeCkgPT4ge1xuICAgICAgICBjb25zdCB0ZXh0TGVuZ3RoID0gU3RyaW5nKHZhbHVlKS5sZW5ndGg7XG4gICAgICAgIGNvbHVtbldpZHRoc1tpZHhdID0gTWF0aC5taW4oTWF0aC5tYXgoY29sdW1uV2lkdGhzW2lkeF0sIHRleHRMZW5ndGgpLCBNQVhfV0lEVEgpO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8g7Lus65+8IOuEiOu5hCDsoIHsmqlcbiAgICBmb3IgKGxldCBjb2wgPSAwOyBjb2wgPCBjb2x1bW5XaWR0aHMubGVuZ3RoOyBjb2wrKykge1xuICAgICAgd2Iuc2V0Q29sV2lkdGgoc2hlZXQsIGNvbExldHRlcihjb2wpLCBjb2x1bW5XaWR0aHNbY29sXSArIDIpO1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBmaWxlbmFtZTogYCR7cHJvamVjdE5hbWV9LSR7bmV3IERhdGUoKS50b0lTT1N0cmluZygpLnNwbGl0KFwiVFwiKVswXX0ueGxzeGAsXG4gICAgICBidWZmZXI6IHdiLndyaXRlQnVmZmVyU3luYygpLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogRXhjZWzsl5DshJwg6rCA7KC47Jik6riwXG4gICAqXG4gICAqIO2YleyLnTpcbiAgICogLSAx7ZaJOiDtlITroZzsoJ3tirjrqoVcbiAgICogLSAy7ZaJOiDruYgg7ZaJXG4gICAqIC0gM+2WiTog7Zek642UIChrZXksIHNvdXJjZSwgbG9jYWxlcy4uLilcbiAgICogLSA07ZaJIOydtO2bhDog642w7J207YSwXG4gICAqL1xuICBhc3luYyBpbXBvcnRGcm9tRXhjZWwoYnVmZmVyOiBCdWZmZXIpOiBQcm9taXNlPEltcG9ydFJlc3VsdD4ge1xuICAgIGNvbnN0IHdiID0gV29ya2Jvb2sub3BlbkJ1ZmZlclN5bmMoYnVmZmVyKTtcbiAgICBjb25zdCBzaGVldCA9IHdiLnNoZWV0TmFtZXNbMF07XG4gICAgY29uc3QgYWxsUm93cyA9IHdiLmdldFJvd3Moc2hlZXQpO1xuXG4gICAgY29uc3QgeyBkZWZhdWx0TG9jYWxlLCBzdXBwb3J0ZWRMb2NhbGVzIH0gPSB0aGlzLmdldEkxOG5Db25maWcoKTtcbiAgICBjb25zdCBsb2NhbGVzID0gc3VwcG9ydGVkTG9jYWxlcztcblxuICAgIGxldCB1cGRhdGVkRW50aXRpZXMgPSAwO1xuICAgIGxldCB1cGRhdGVkTG9jYWxlcyA9IDA7XG5cbiAgICAvLyBsb2NhbGXrs4QgcHJvamVjdCBkaWN0IGVudHJpZXNcbiAgICBjb25zdCBwcm9qZWN0RGljdEVudHJpZXM6IFJlY29yZDxzdHJpbmcsIERpY3RFbnRyeVtdPiA9IHt9O1xuICAgIGZvciAoY29uc3QgbG9jYWxlIG9mIGxvY2FsZXMpIHtcbiAgICAgIHByb2plY3REaWN0RW50cmllc1tsb2NhbGVdID0gW107XG4gICAgfVxuXG4gICAgLy8g7Zek642UIO2WiSDssL7quLA6IOyyqyDrsojsp7gg7Lus65+8KEEp7J20IFwia2V5XCLsnbgg7ZaJXG4gICAgbGV0IGhlYWRlclJvd051bSA9IDA7XG4gICAgZm9yIChjb25zdCByb3dEYXRhIG9mIGFsbFJvd3MpIHtcbiAgICAgIGNvbnN0IGZpcnN0Q2VsbCA9IHJvd0RhdGEuY2VsbHMuZmluZCgoYykgPT4gYy5jb2x1bW4gPT09IFwiQVwiKTtcbiAgICAgIGNvbnN0IGZpcnN0Q2VsbFZhbHVlID0gU3RyaW5nKGZpcnN0Q2VsbD8udmFsdWUgPz8gXCJcIilcbiAgICAgICAgLnRyaW0oKVxuICAgICAgICAudG9Mb3dlckNhc2UoKTtcbiAgICAgIGlmIChmaXJzdENlbGxWYWx1ZSA9PT0gXCJrZXlcIikge1xuICAgICAgICBoZWFkZXJSb3dOdW0gPSByb3dEYXRhLnJvdztcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGhlYWRlclJvd051bSA9PT0gMCkge1xuICAgICAgdGhyb3cgbmV3IEJhZFJlcXVlc3RFeGNlcHRpb24oU0QoXCJzb25hbXUuZXJyb3IuaGVhZGVyUm93Tm90Rm91bmRcIikpO1xuICAgIH1cblxuICAgIC8vIO2XpOuNlCDtlonsl5DshJwg7Lus65+8IOunpO2VkSDqtazshLFcbiAgICBjb25zdCBoZWFkZXJSb3dEYXRhID0gYWxsUm93cy5maW5kKChyKSA9PiByLnJvdyA9PT0gaGVhZGVyUm93TnVtKTtcbiAgICBjb25zdCBjb2xUb0hlYWRlcjogTWFwPHN0cmluZywgc3RyaW5nPiA9IG5ldyBNYXAoKTtcbiAgICBpZiAoaGVhZGVyUm93RGF0YSkge1xuICAgICAgZm9yIChjb25zdCBjZWxsIG9mIGhlYWRlclJvd0RhdGEuY2VsbHMpIHtcbiAgICAgICAgY29sVG9IZWFkZXIuc2V0KGNlbGwuY29sdW1uLCBTdHJpbmcoY2VsbC52YWx1ZSA/PyBcIlwiKSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8g642w7J207YSwIO2WiSDsnb3quLAgKO2XpOuNlCDri6TsnYwg7ZaJ67aA7YSwKVxuICAgIGZvciAoY29uc3Qgcm93RGF0YSBvZiBhbGxSb3dzKSB7XG4gICAgICBpZiAocm93RGF0YS5yb3cgPD0gaGVhZGVyUm93TnVtKSBjb250aW51ZTtcblxuICAgICAgY29uc3Qgcm93VmFsdWVzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge307XG4gICAgICBmb3IgKGNvbnN0IGNlbGwgb2Ygcm93RGF0YS5jZWxscykge1xuICAgICAgICBjb25zdCBoZWFkZXJOYW1lID0gY29sVG9IZWFkZXIuZ2V0KGNlbGwuY29sdW1uKTtcbiAgICAgICAgaWYgKGhlYWRlck5hbWUpIHtcbiAgICAgICAgICByb3dWYWx1ZXNbaGVhZGVyTmFtZV0gPSBTdHJpbmcoY2VsbC52YWx1ZSA/PyBcIlwiKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBjb25zdCBrZXkgPSByb3dWYWx1ZXMua2V5O1xuICAgICAgY29uc3Qgc291cmNlID1cbiAgICAgICAgLyogU0FGRVRZOiDrj5nquLDtmZTrkJwg7IKs7KCEIO2CpOyZgCDqsJIg6rOE7JW97J20IOydtCDqsJLsnZgg7YOA7J6F7J2EIOuztOyepe2VnOuLpC4gKi8gcm93VmFsdWVzLnNvdXJjZSBhc1xuICAgICAgICAgIHwgXCJlbnRpdHlcIlxuICAgICAgICAgIHwgXCJwcm9qZWN0XCI7XG5cbiAgICAgIGlmICgha2V5IHx8ICFzb3VyY2UpIGNvbnRpbnVlO1xuXG4gICAgICBpZiAoc291cmNlID09PSBcImVudGl0eVwiKSB7XG4gICAgICAgIC8vIGVudGl0eSBzb3VyY2U6IGRlZmF1bHQgbG9jYWxl66eMIGVudGl0eS5qc29u7JeQIOyggOyepVxuICAgICAgICBjb25zdCBkZWZhdWx0VmFsdWUgPSByb3dWYWx1ZXNbZGVmYXVsdExvY2FsZV07XG4gICAgICAgIGlmIChkZWZhdWx0VmFsdWUpIHtcbiAgICAgICAgICBjb25zdCB1cGRhdGVkID0gYXdhaXQgdGhpcy51cGRhdGVFbnRpdHlCeUtleShrZXksIGRlZmF1bHRWYWx1ZSk7XG4gICAgICAgICAgaWYgKHVwZGF0ZWQpIHtcbiAgICAgICAgICAgIHVwZGF0ZWRFbnRpdGllcysrO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIG5vbi1kZWZhdWx0IGxvY2FsZeydgCBwcm9qZWN0IGRpY3Tsl5Ag7KCA7J6lXG4gICAgICAgIGZvciAoY29uc3QgbG9jYWxlIG9mIGxvY2FsZXMpIHtcbiAgICAgICAgICBpZiAobG9jYWxlID09PSBkZWZhdWx0TG9jYWxlKSBjb250aW51ZTtcbiAgICAgICAgICBjb25zdCBjZWxsVmFsdWUgPSByb3dWYWx1ZXNbbG9jYWxlXT8udHJpbSgpO1xuICAgICAgICAgIGlmIChjZWxsVmFsdWUpIHtcbiAgICAgICAgICAgIHByb2plY3REaWN0RW50cmllc1tsb2NhbGVdLnB1c2goe1xuICAgICAgICAgICAgICBrZXksXG4gICAgICAgICAgICAgIHZhbHVlOiBjZWxsVmFsdWUsXG4gICAgICAgICAgICAgIGlzRnVuY3Rpb246IHRoaXMuaXNFeHByZXNzaW9uRnVuY3Rpb24oY2VsbFZhbHVlKSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChzb3VyY2UgPT09IFwicHJvamVjdFwiKSB7XG4gICAgICAgIC8vIHByb2plY3Qgc291cmNlOiDrqqjrk6AgbG9jYWxl7J2EIHByb2plY3QgZGljdOyXkCDsoIDsnqVcbiAgICAgICAgZm9yIChjb25zdCBsb2NhbGUgb2YgbG9jYWxlcykge1xuICAgICAgICAgIGNvbnN0IGNlbGxWYWx1ZSA9IHJvd1ZhbHVlc1tsb2NhbGVdPy50cmltKCk7XG4gICAgICAgICAgaWYgKGNlbGxWYWx1ZSkge1xuICAgICAgICAgICAgcHJvamVjdERpY3RFbnRyaWVzW2xvY2FsZV0ucHVzaCh7XG4gICAgICAgICAgICAgIGtleSxcbiAgICAgICAgICAgICAgdmFsdWU6IGNlbGxWYWx1ZSxcbiAgICAgICAgICAgICAgaXNGdW5jdGlvbjogdGhpcy5pc0V4cHJlc3Npb25GdW5jdGlvbihjZWxsVmFsdWUpLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gUHJvamVjdCBkaWN0IO2MjOydvCDsg53shLFcbiAgICBmb3IgKGNvbnN0IGxvY2FsZSBvZiBsb2NhbGVzKSB7XG4gICAgICBjb25zdCBlbnRyaWVzID0gcHJvamVjdERpY3RFbnRyaWVzW2xvY2FsZV07XG4gICAgICBpZiAoZW50cmllcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIGF3YWl0IHRoaXMuc2F2ZURpY3RGaWxlKGxvY2FsZSwgZW50cmllcywgbG9jYWxlID09PSBkZWZhdWx0TG9jYWxlKTtcbiAgICAgICAgdXBkYXRlZExvY2FsZXMrKztcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgc3VjY2VzczogdHJ1ZSxcbiAgICAgIHVwZGF0ZWRFbnRpdGllcyxcbiAgICAgIHVwZGF0ZWRMb2NhbGVzLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICog65SV7IWU64SI66asIO2VreuqqSDsiJjsoJVcbiAgICovXG4gIGFzeW5jIHVwZGF0ZUVudHJ5KHBhcmFtczoge1xuICAgIG9sZEtleTogc3RyaW5nO1xuICAgIG5ld0tleTogc3RyaW5nO1xuICAgIHNvdXJjZTogXCJlbnRpdHlcIiB8IFwicHJvamVjdFwiIHwgXCJzb25hbXVcIjtcbiAgICB2YWx1ZXM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG4gIH0pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCB7IG9sZEtleSwgbmV3S2V5LCBzb3VyY2UsIHZhbHVlcyB9ID0gcGFyYW1zO1xuXG4gICAgY29uc3QgeyBkZWZhdWx0TG9jYWxlLCBzdXBwb3J0ZWRMb2NhbGVzIH0gPSB0aGlzLmdldEkxOG5Db25maWcoKTtcbiAgICBjb25zdCBsb2NhbGVzID0gc3VwcG9ydGVkTG9jYWxlcztcblxuICAgIC8vIGVudGl0eSBzb3VyY2XsnZggZGVmYXVsdCBsb2NhbGUg7LKY66asXG4gICAgaWYgKHNvdXJjZSA9PT0gXCJlbnRpdHlcIiAmJiB2YWx1ZXNbZGVmYXVsdExvY2FsZV0pIHtcbiAgICAgIGF3YWl0IHRoaXMudXBkYXRlRW50aXR5QnlLZXkobmV3S2V5LCB2YWx1ZXNbZGVmYXVsdExvY2FsZV0pO1xuICAgIH1cblxuICAgIC8vIHByb2plY3QgZGljdCDsl4XrjbDsnbTtirhcbiAgICAvLyAtIGVudGl0eeydmCBub24tZGVmYXVsdCBsb2NhbGVcbiAgICAvLyAtIHByb2plY3Qgc291cmNl7J2YIOuqqOuToCBsb2NhbGVcbiAgICAvLyAtIHNvbmFtdSBzb3VyY2XsnZgg66qo65OgIGxvY2FsZSAob3ZlcnJpZGUpXG4gICAgZm9yIChjb25zdCBsb2NhbGUgb2YgbG9jYWxlcykge1xuICAgICAgLy8gZW50aXR5IHNvdXJjZeydmCBkZWZhdWx0IGxvY2FsZeydgCBlbnRpdHkuanNvbuyXkOyEnCDsspjrpqztlojsnLzrr4DroZwg7Iqk7YK1XG4gICAgICBpZiAoc291cmNlID09PSBcImVudGl0eVwiICYmIGxvY2FsZSA9PT0gZGVmYXVsdExvY2FsZSkgY29udGludWU7XG5cbiAgICAgIGNvbnN0IGNlbGxWYWx1ZSA9IHZhbHVlc1tsb2NhbGVdPy50cmltKCk7XG4gICAgICBpZiAoIWNlbGxWYWx1ZSkgY29udGludWU7XG5cbiAgICAgIC8vIOq4sOyhtCBkaWN0IOuhnOuTnFxuICAgICAgY29uc3QgeyBlbnRyaWVzIH0gPSB0aGlzLmxvYWRQcm9qZWN0RGljdChsb2NhbGUpO1xuXG4gICAgICAvLyBrZXkg67OA6rK9IOyLnCDquLDsobQga2V5IOygnOqxsFxuICAgICAgaWYgKG9sZEtleSAhPT0gbmV3S2V5KSB7XG4gICAgICAgIGNvbnN0IG9sZEluZGV4ID0gZW50cmllcy5maW5kSW5kZXgoKGUpID0+IGUua2V5ID09PSBvbGRLZXkpO1xuICAgICAgICBpZiAob2xkSW5kZXggIT09IC0xKSB7XG4gICAgICAgICAgZW50cmllcy5zcGxpY2Uob2xkSW5kZXgsIDEpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIOyDiCDqsJIg7JeF642w7J207Yq4IOuYkOuKlCDstpTqsIBcbiAgICAgIGNvbnN0IGV4aXN0aW5nSW5kZXggPSBlbnRyaWVzLmZpbmRJbmRleCgoZSkgPT4gZS5rZXkgPT09IG5ld0tleSk7XG4gICAgICBjb25zdCBuZXdFbnRyeTogRGljdEVudHJ5ID0ge1xuICAgICAgICBrZXk6IG5ld0tleSxcbiAgICAgICAgdmFsdWU6IGNlbGxWYWx1ZSxcbiAgICAgICAgaXNGdW5jdGlvbjogdGhpcy5pc0V4cHJlc3Npb25GdW5jdGlvbihjZWxsVmFsdWUpLFxuICAgICAgfTtcblxuICAgICAgaWYgKGV4aXN0aW5nSW5kZXggIT09IC0xKSB7XG4gICAgICAgIGVudHJpZXNbZXhpc3RpbmdJbmRleF0gPSBuZXdFbnRyeTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGVudHJpZXMucHVzaChuZXdFbnRyeSk7XG4gICAgICB9XG5cbiAgICAgIC8vIGRpY3Qg7YyM7J28IOyggOyepVxuICAgICAgYXdhaXQgdGhpcy5zYXZlRGljdEZpbGUobG9jYWxlLCBlbnRyaWVzLCBsb2NhbGUgPT09IGRlZmF1bHRMb2NhbGUpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiDrlJXshZTrhIjrpqwg7ZWt66qpIOy2lOqwgFxuICAgKi9cbiAgYXN5bmMgY3JlYXRlRW50cnkocGFyYW1zOiB7IGtleTogc3RyaW5nOyB2YWx1ZXM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gfSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHsga2V5LCB2YWx1ZXMgfSA9IHBhcmFtcztcblxuICAgIGlmICgha2V5Py50cmltKCkpIHtcbiAgICAgIHRocm93IG5ldyBCYWRSZXF1ZXN0RXhjZXB0aW9uKFNEKFwic29uYW11LmVycm9yLmtleVJlcXVpcmVkXCIpKTtcbiAgICB9XG5cbiAgICBjb25zdCB7IGRlZmF1bHRMb2NhbGUsIHN1cHBvcnRlZExvY2FsZXMgfSA9IHRoaXMuZ2V0STE4bkNvbmZpZygpO1xuICAgIGNvbnN0IGxvY2FsZXMgPSBzdXBwb3J0ZWRMb2NhbGVzO1xuXG4gICAgLy8g7KSR67O1IO2CpCDssrTtgaxcbiAgICBmb3IgKGNvbnN0IGxvY2FsZSBvZiBsb2NhbGVzKSB7XG4gICAgICBjb25zdCB7IGVudHJpZXMgfSA9IHRoaXMubG9hZFByb2plY3REaWN0KGxvY2FsZSk7XG4gICAgICBpZiAoZW50cmllcy5zb21lKChlKSA9PiBlLmtleSA9PT0ga2V5KSkge1xuICAgICAgICB0aHJvdyBuZXcgQmFkUmVxdWVzdEV4Y2VwdGlvbihTRChcInNvbmFtdS5lcnJvci5rZXlBbHJlYWR5RXhpc3RzXCIpKGtleSkpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIOqwgSBsb2NhbGXsl5Ag7IOIIO2CpCDstpTqsIBcbiAgICBmb3IgKGNvbnN0IGxvY2FsZSBvZiBsb2NhbGVzKSB7XG4gICAgICBjb25zdCBjZWxsVmFsdWUgPSB2YWx1ZXNbbG9jYWxlXT8udHJpbSgpO1xuICAgICAgaWYgKCFjZWxsVmFsdWUpIGNvbnRpbnVlO1xuXG4gICAgICBjb25zdCB7IGVudHJpZXMgfSA9IHRoaXMubG9hZFByb2plY3REaWN0KGxvY2FsZSk7XG4gICAgICBlbnRyaWVzLnB1c2goe1xuICAgICAgICBrZXksXG4gICAgICAgIHZhbHVlOiBjZWxsVmFsdWUsXG4gICAgICAgIGlzRnVuY3Rpb246IHRoaXMuaXNFeHByZXNzaW9uRnVuY3Rpb24oY2VsbFZhbHVlKSxcbiAgICAgIH0pO1xuXG4gICAgICBhd2FpdCB0aGlzLnNhdmVEaWN0RmlsZShsb2NhbGUsIGVudHJpZXMsIGxvY2FsZSA9PT0gZGVmYXVsdExvY2FsZSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIOuUleyFlOuEiOumrCDtla3rqqkg7IKt7KCcXG4gICAqL1xuICBhc3luYyBkZWxldGVFbnRyeShrZXk6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICgha2V5KSB7XG4gICAgICB0aHJvdyBuZXcgQmFkUmVxdWVzdEV4Y2VwdGlvbihTRChcInNvbmFtdS5lcnJvci5rZXlSZXF1aXJlZFwiKSk7XG4gICAgfVxuXG4gICAgY29uc3QgeyBkZWZhdWx0TG9jYWxlLCBzdXBwb3J0ZWRMb2NhbGVzIH0gPSB0aGlzLmdldEkxOG5Db25maWcoKTtcbiAgICBjb25zdCBsb2NhbGVzID0gc3VwcG9ydGVkTG9jYWxlcztcblxuICAgIGxldCBkZWxldGVkID0gZmFsc2U7XG4gICAgZm9yIChjb25zdCBsb2NhbGUgb2YgbG9jYWxlcykge1xuICAgICAgY29uc3QgeyBlbnRyaWVzIH0gPSB0aGlzLmxvYWRQcm9qZWN0RGljdChsb2NhbGUpO1xuICAgICAgY29uc3QgaW5kZXggPSBlbnRyaWVzLmZpbmRJbmRleCgoZSkgPT4gZS5rZXkgPT09IGtleSk7XG4gICAgICBpZiAoaW5kZXggIT09IC0xKSB7XG4gICAgICAgIGVudHJpZXMuc3BsaWNlKGluZGV4LCAxKTtcbiAgICAgICAgZGVsZXRlZCA9IHRydWU7XG5cbiAgICAgICAgYXdhaXQgdGhpcy5zYXZlRGljdEZpbGUobG9jYWxlLCBlbnRyaWVzLCBsb2NhbGUgPT09IGRlZmF1bHRMb2NhbGUpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICghZGVsZXRlZCkge1xuICAgICAgdGhyb3cgbmV3IEJhZFJlcXVlc3RFeGNlcHRpb24oU0QoXCJzb25hbXUuZXJyb3Iua2V5Tm90Rm91bmRcIikoa2V5KSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIOuvuOyCrOyaqSDtgqQg6rKA7IKsIChhc3QtZ3JlcCDsgqzsmqkpXG4gICAqL1xuICBhc3luYyBjaGVja1VzYWdlKGtleXM6IHN0cmluZ1tdKTogUHJvbWlzZTxVc2FnZVJlc3VsdD4ge1xuICAgIC8vIGFzdC1ncmVwIOyEpOy5mCDtmZXsnbhcbiAgICBsZXQgc2dQYXRoOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcbiAgICB0cnkge1xuICAgICAgc2dQYXRoID0gZXhlY1N5bmMoXCJ3aGljaCBzZ1wiLCB7IGVuY29kaW5nOiBcInV0Zi04XCIgfSkudHJpbSgpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgdHJ5IHtcbiAgICAgICAgc2dQYXRoID0gZXhlY1N5bmMoXCJ3aGljaCBhc3QtZ3JlcFwiLCB7IGVuY29kaW5nOiBcInV0Zi04XCIgfSkudHJpbSgpO1xuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIC8vIGFzdC1ncmVwIG5vdCBpbnN0YWxsZWRcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoIXNnUGF0aCkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgZXJyb3I6XG4gICAgICAgICAgXCJhc3QtZ3JlcOydtCDshKTsuZjrkJjslrQg7J6I7KeAIOyViuyKteuLiOuLpC4gYnJldyBpbnN0YWxsIGFzdC1ncmVwIOuYkOuKlCBucG0gaW5zdGFsbCAtZyBAYXN0LWdyZXAvY2xp66GcIOyEpOy5mO2VtOyjvOyEuOyalC5cIixcbiAgICAgICAgdW51c2VkS2V5czogW10sXG4gICAgICB9O1xuICAgIH1cblxuICAgIGNvbnN0IHNlYXJjaFBhdGhzOiBzdHJpbmdbXSA9IFtdO1xuICAgIGZvciAoY29uc3QgZW50cnkgb2YgW1wiYXBpXCIsIFwid2ViXCIsIFwiYXBwXCJdKSB7XG4gICAgICBjb25zdCBzcmNQYXRoID0gcGF0aC5qb2luKFNvbmFtdS5hcHBSb290UGF0aCwgZW50cnksIFwic3JjXCIpO1xuICAgICAgaWYgKGZzLmV4aXN0c1N5bmMoc3JjUGF0aCkpIHtcbiAgICAgICAgc2VhcmNoUGF0aHMucHVzaChzcmNQYXRoKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoc2VhcmNoUGF0aHMubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBlcnJvcjogXCLqsoDsg4ntlaAgc3JjIOuUlOugie2GoOumrOulvCDssL7snYQg7IiYIOyXhuyKteuLiOuLpC5cIixcbiAgICAgICAgdW51c2VkS2V5czogW10sXG4gICAgICB9O1xuICAgIH1cblxuICAgIGNvbnN0IHVzZWRLZXlzID0gbmV3IFNldDxzdHJpbmc+KCk7XG5cbiAgICB0cnkge1xuICAgICAgLy8gYXN0LWdyZXDsnLzroZwgU0QoXCIuLi5cIikg7Yyo7YS0IOqygOyDiVxuICAgICAgLy8g7Yyo7YS0OiBTRChcIktFWVwiKSDrmJDripQgU0QoJ0tFWScpIO2Yle2DnFxuICAgICAgY29uc3QgcGF0dGVybnMgPSBbJ1NEKFwiJEtFWVwiKScsIFwiU0QoJyRLRVknKVwiXTtcblxuICAgICAgZm9yIChjb25zdCBzZWFyY2hQYXRoIG9mIHNlYXJjaFBhdGhzKSB7XG4gICAgICAgIGZvciAoY29uc3QgcGF0dGVybiBvZiBwYXR0ZXJucykge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSBleGVjU3luYyhgJHtzZ1BhdGh9IC0tcGF0dGVybiAnJHtwYXR0ZXJufScgLS1qc29uICR7c2VhcmNoUGF0aH1gLCB7XG4gICAgICAgICAgICAgIGVuY29kaW5nOiBcInV0Zi04XCIsXG4gICAgICAgICAgICAgIG1heEJ1ZmZlcjogNTAgKiAxMDI0ICogMTAyNCwgLy8gNTBNQlxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIGlmIChyZXN1bHQudHJpbSgpKSB7XG4gICAgICAgICAgICAgIGNvbnN0IG1hdGNoZXMgPSBKU09OLnBhcnNlKHJlc3VsdCk7XG4gICAgICAgICAgICAgIGZvciAoY29uc3QgbWF0Y2ggb2YgbWF0Y2hlcykge1xuICAgICAgICAgICAgICAgIC8vIG1ldGFWYXJpYWJsZXMuc2luZ2xlLktFWS50ZXh07JeQ7IScIO2CpCDstpTstpxcbiAgICAgICAgICAgICAgICBjb25zdCBrZXlUZXh0ID0gbWF0Y2gubWV0YVZhcmlhYmxlcz8uc2luZ2xlPy5LRVk/LnRleHQ7XG4gICAgICAgICAgICAgICAgaWYgKGtleVRleHQpIHtcbiAgICAgICAgICAgICAgICAgIC8vIOuUsOyYtO2RnCDsoJzqsbBcbiAgICAgICAgICAgICAgICAgIGNvbnN0IGNsZWFuS2V5ID0ga2V5VGV4dC5yZXBsYWNlKC9eW1wiJ118W1wiJ10kL2csIFwiXCIpO1xuICAgICAgICAgICAgICAgICAgdXNlZEtleXMuYWRkKGNsZWFuS2V5KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAgIC8vIO2MqO2EtCDrp6TsuZgg7JeG7Jy866m0IOyXkOufrCAo66y07IucKVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBrZXlzIOykkeyXkOyEnCB1c2VkS2V5c+yXkCDsl4bripQg6rKD65Ok7J20IOuvuOyCrOyaqSDtgqRcbiAgICAgIGNvbnN0IHVudXNlZEtleXMgPSBrZXlzLmZpbHRlcigoaykgPT4gIXVzZWRLZXlzLmhhcyhrKSk7XG5cbiAgICAgIHJldHVybiB7IHVudXNlZEtleXMsIHVzZWRLZXlzQ291bnQ6IHVzZWRLZXlzLnNpemUgfTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBlcnJvcjogYOqygOyDiSDspJEg7Jik66WYIOuwnOyDnTogJHtlIGluc3RhbmNlb2YgRXJyb3IgPyBlLm1lc3NhZ2UgOiBTdHJpbmcoZSl9YCxcbiAgICAgICAgdW51c2VkS2V5czogW10sXG4gICAgICB9O1xuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgY29uc3Qgc29uYW11RGljdGlvbmFyeSA9IG5ldyBTb25hbXVEaWN0aW9uYXJ5KCk7XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7OztBQXlCQSxTQUFTLFVBQVUsT0FBdUI7Q0FDeEMsSUFBSSxTQUFTO0NBQ2IsSUFBSSxJQUFJO0NBQ1IsT0FBTyxLQUFLLEdBQUc7RUFDYixTQUFTLE9BQU8sYUFBYSxLQUFNLElBQUksRUFBRyxJQUFJO0VBQzlDLElBQUksS0FBSyxNQUFNLElBQUksRUFBRSxJQUFJO0NBQzNCO0NBQ0EsT0FBTztBQUNUOzs7Q0ExQnNDLFlBQUE7Q0FDUyxxQkFBQTtDQUNTLG9CQUFBO0NBQ1MsbUJBQUE7Q0FDeEMsUUFBQTtDQTRCWixtQkFBYixNQUE4Qjs7Ozs7Ozs7OztFQVU1QixjQUFjLFVBQStCO0dBQzNDLE1BQU0sVUFBVSxHQUFHLGFBQWEsVUFBVSxPQUFPO0dBQ2pELE1BQU0sYUFBYSxHQUFHLGlCQUFpQixVQUFVLFNBQVMsR0FBRyxhQUFhLFFBQVEsSUFBSTtHQUV0RixNQUFNLFVBQXVCLENBQUM7R0FFOUIsR0FBRyxhQUFhLGFBQWEsU0FBUztJQUNwQyxJQUFJLEdBQUcsbUJBQW1CLElBQUksR0FBRztLQUMvQixNQUFNLGdCQUFnQixLQUFLLHNCQUFzQixLQUFLLFVBQVU7S0FDaEUsSUFBSSxlQUNGLEtBQUsseUJBQXlCLGVBQWUsWUFBWSxPQUFPO0lBRXBFO0dBQ0YsQ0FBQztHQUVELE9BQU87RUFDVDs7Ozs7RUFNQSw0QkFBNEIsVUFBa0IsU0FBOEI7R0FDMUUsTUFBTSxVQUFVLEdBQUcsYUFBYSxVQUFVLE9BQU87R0FDakQsTUFBTSxhQUFhLEdBQUcsaUJBQWlCLFVBQVUs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
|
package/dist/dict/utils.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { init_runtime_value, isFunctionValue } from "../utils/runtime-value.js";
|
|
2
|
-
|
|
2
|
+
// src/dict/utils.ts
|
|
3
3
|
init_runtime_value();
|
|
4
4
|
function isPluralResolver(form) {
|
|
5
5
|
return isFunctionValue(form);
|
|
@@ -28,7 +28,6 @@ function josa(word, type) {
|
|
|
28
28
|
으로: has받침 ? "으로" : "로"
|
|
29
29
|
}[type];
|
|
30
30
|
}
|
|
31
|
-
//#endregion
|
|
32
31
|
export { createFormat, josa, plural };
|
|
33
32
|
|
|
34
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuanMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vLi4vc3JjL2RpY3QvdXRpbHMudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgaXNGdW5jdGlvblZhbHVlIH0gZnJvbSBcIi4uL3V0aWxzL3J1bnRpbWUtdmFsdWVcIjtcblxuZXhwb3J0IHR5cGUgUGx1cmFsRm9ybXMgPSB7XG4gIHplcm8/OiBzdHJpbmcgfCAoKG46IG51bWJlcikgPT4gc3RyaW5nKTtcbiAgb25lPzogc3RyaW5nIHwgKChuOiBudW1iZXIpID0+IHN0cmluZyk7XG4gIG90aGVyPzogc3RyaW5nIHwgKChuOiBudW1iZXIpID0+IHN0cmluZyk7XG59O1xuXG50eXBlIFBsdXJhbFJlc29sdmVyID0gKG46IG51bWJlcikgPT4gc3RyaW5nO1xuXG5mdW5jdGlvbiBpc1BsdXJhbFJlc29sdmVyKGZvcm06IFBsdXJhbEZvcm1zW2tleW9mIFBsdXJhbEZvcm1zXSk6IGZvcm0gaXMgUGx1cmFsUmVzb2x2ZXIge1xuICByZXR1cm4gaXNGdW5jdGlvblZhbHVlKGZvcm0pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcGx1cmFsKG46IG51bWJlciwgZm9ybXM6IFBsdXJhbEZvcm1zKTogc3RyaW5nIHtcbiAgY29uc3QgZm9ybSA9IChuID09PSAwICYmIGZvcm1zLnplcm8pIHx8IChuID09PSAxICYmIGZvcm1zLm9uZSkgfHwgZm9ybXMub3RoZXI7XG4gIHJldHVybiBpc1BsdXJhbFJlc29sdmVyKGZvcm0pID8gZm9ybShuKSA6IChmb3JtID8/IG4udG9TdHJpbmcoKSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVGb3JtYXQobG9jYWxlOiBzdHJpbmcpIHtcbiAgcmV0dXJuIHtcbiAgICBudW1iZXI6IChuOiBudW1iZXIpID0+IG4udG9Mb2NhbGVTdHJpbmcobG9jYWxlKSxcbiAgICBkYXRlOiAoZDogRGF0ZSkgPT4gZC50b0xvY2FsZURhdGVTdHJpbmcobG9jYWxlKSxcbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGpvc2Eod29yZDogc3RyaW5nLCB0eXBlOiBcIuydgOuKlFwiIHwgXCLsnbTqsIBcIiB8IFwi7J2E66W8XCIgfCBcIuqzvOyZgFwiIHwgXCLsnLzroZxcIikge1xuICBjb25zdCBoYXPrsJvsuaggPSAoKCkgPT4ge1xuICAgIGNvbnN0IGxhc3RDaGFyID0gd29yZC5jaGFyQ29kZUF0KHdvcmQubGVuZ3RoIC0gMSk7XG4gICAgaWYgKGxhc3RDaGFyIDwgMHhhYzAwIHx8IGxhc3RDaGFyID4gMHhkN2EzKVxuICAgICAgLy8g7ZWc6riAIOycoOuLiOy9lOuTnCDrspTsnIQ6IDB4QUMwMCB+IDB4RDdBM1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIHJldHVybiAobGFzdENoYXIgLSAweGFjMDApICUgMjggIT09IDA7XG4gIH0pKCk7XG5cbiAgY29uc3QgbWFwID0ge1xuICAgIOydgOuKlDogaGFz67Cb7LmoID8gXCLsnYBcIiA6IFwi64qUXCIsXG4gICAg7J206rCAOiBoYXPrsJvsuaggPyBcIuydtFwiIDogXCLqsIBcIixcbiAgICDsnYTrpbw6IGhhc+uwm+y5qCA/
|
|
33
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuanMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vLi4vc3JjL2RpY3QvdXRpbHMudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgaXNGdW5jdGlvblZhbHVlIH0gZnJvbSBcIi4uL3V0aWxzL3J1bnRpbWUtdmFsdWVcIjtcblxuZXhwb3J0IHR5cGUgUGx1cmFsRm9ybXMgPSB7XG4gIHplcm8/OiBzdHJpbmcgfCAoKG46IG51bWJlcikgPT4gc3RyaW5nKTtcbiAgb25lPzogc3RyaW5nIHwgKChuOiBudW1iZXIpID0+IHN0cmluZyk7XG4gIG90aGVyPzogc3RyaW5nIHwgKChuOiBudW1iZXIpID0+IHN0cmluZyk7XG59O1xuXG50eXBlIFBsdXJhbFJlc29sdmVyID0gKG46IG51bWJlcikgPT4gc3RyaW5nO1xuXG5mdW5jdGlvbiBpc1BsdXJhbFJlc29sdmVyKGZvcm06IFBsdXJhbEZvcm1zW2tleW9mIFBsdXJhbEZvcm1zXSk6IGZvcm0gaXMgUGx1cmFsUmVzb2x2ZXIge1xuICByZXR1cm4gaXNGdW5jdGlvblZhbHVlKGZvcm0pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcGx1cmFsKG46IG51bWJlciwgZm9ybXM6IFBsdXJhbEZvcm1zKTogc3RyaW5nIHtcbiAgY29uc3QgZm9ybSA9IChuID09PSAwICYmIGZvcm1zLnplcm8pIHx8IChuID09PSAxICYmIGZvcm1zLm9uZSkgfHwgZm9ybXMub3RoZXI7XG4gIHJldHVybiBpc1BsdXJhbFJlc29sdmVyKGZvcm0pID8gZm9ybShuKSA6IChmb3JtID8/IG4udG9TdHJpbmcoKSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVGb3JtYXQobG9jYWxlOiBzdHJpbmcpIHtcbiAgcmV0dXJuIHtcbiAgICBudW1iZXI6IChuOiBudW1iZXIpID0+IG4udG9Mb2NhbGVTdHJpbmcobG9jYWxlKSxcbiAgICBkYXRlOiAoZDogRGF0ZSkgPT4gZC50b0xvY2FsZURhdGVTdHJpbmcobG9jYWxlKSxcbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGpvc2Eod29yZDogc3RyaW5nLCB0eXBlOiBcIuydgOuKlFwiIHwgXCLsnbTqsIBcIiB8IFwi7J2E66W8XCIgfCBcIuqzvOyZgFwiIHwgXCLsnLzroZxcIikge1xuICBjb25zdCBoYXPrsJvsuaggPSAoKCkgPT4ge1xuICAgIGNvbnN0IGxhc3RDaGFyID0gd29yZC5jaGFyQ29kZUF0KHdvcmQubGVuZ3RoIC0gMSk7XG4gICAgaWYgKGxhc3RDaGFyIDwgMHhhYzAwIHx8IGxhc3RDaGFyID4gMHhkN2EzKVxuICAgICAgLy8g7ZWc6riAIOycoOuLiOy9lOuTnCDrspTsnIQ6IDB4QUMwMCB+IDB4RDdBM1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIHJldHVybiAobGFzdENoYXIgLSAweGFjMDApICUgMjggIT09IDA7XG4gIH0pKCk7XG5cbiAgY29uc3QgbWFwID0ge1xuICAgIOydgOuKlDogaGFz67Cb7LmoID8gXCLsnYBcIiA6IFwi64qUXCIsXG4gICAg7J206rCAOiBoYXPrsJvsuaggPyBcIuydtFwiIDogXCLqsIBcIixcbiAgICDsnYTrpbw6IGhhc+uwm+y5qCA/IFwi7J2EXCIgOiBcIuulvFwiLFxuICAgIOqzvOyZgDogaGFz67Cb7LmoID8gXCLqs7xcIiA6IFwi7JmAXCIsXG4gICAg7Jy866GcOiBoYXPrsJvsuaggPyBcIuycvOuhnFwiIDogXCLroZxcIixcbiAgfTtcblxuICByZXR1cm4gd29yZCArIG1hcFt0eXBlXTtcbn1cbiJdLCJtYXBwaW5ncyI6Ijs7QUFBd0QsbUJBQUE7QUFVeEQsU0FBUyxpQkFBaUIsTUFBOEQ7Q0FDdEYsT0FBTyxnQkFBZ0IsSUFBSTtBQUM3QjtBQUVBLFNBQWdCLE9BQU8sR0FBVyxPQUE0QjtDQUM1RCxNQUFNLE9BQVEsTUFBTSxLQUFLLE1BQU0sUUFBVSxNQUFNLEtBQUssTUFBTSxPQUFRLE1BQU07Q0FDeEUsT0FBTyxpQkFBaUIsSUFBSSxJQUFJLEtBQUssQ0FBQyxJQUFLLFFBQVEsRUFBRSxTQUFTO0FBQ2hFO0FBRUEsU0FBZ0IsYUFBYSxRQUFnQjtDQUMzQyxPQUFPO0VBQ0wsU0FBUyxNQUFjLEVBQUUsZUFBZSxNQUFNO0VBQzlDLE9BQU8sTUFBWSxFQUFFLG1CQUFtQixNQUFNO0NBQ2hEO0FBQ0Y7QUFFQSxTQUFnQixLQUFLLE1BQWMsTUFBd0M7Q0FDekUsTUFBTSxlQUFlO0VBQ25CLE1BQU0sV0FBVyxLQUFLLFdBQVcsS0FBSyxTQUFTLENBQUM7RUFDaEQsSUFBSSxXQUFXLFNBQVUsV0FBVyxPQUVsQyxPQUFPO0VBQ1QsUUFBUSxXQUFXLFNBQVUsT0FBTztDQUN0QyxFQUFBLENBQUc7Q0FVSCxPQUFPLE9BQU87RUFQWixJQUFJLFFBQVEsTUFBTTtFQUNsQixJQUFJLFFBQVEsTUFBTTtFQUNsQixJQUFJLFFBQVEsTUFBTTtFQUNsQixJQUFJLFFBQVEsTUFBTTtFQUNsQixJQUFJLFFBQVEsT0FBTztDQUdQLEVBQUk7QUFDcEIifQ==
|