sonamu 0.10.12 → 0.10.13
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/ai/agents/agent.d.ts +1 -1
- package/dist/ai/agents/agent.d.ts.map +1 -1
- package/dist/ai/agents/agent.js +5 -6
- package/dist/ai/agents/types.d.ts +1 -1
- package/dist/ai/agents/types.d.ts.map +1 -1
- package/dist/ai/providers/rtzr/api.js +18 -18
- package/dist/ai/providers/rtzr/error.d.ts.map +1 -1
- package/dist/ai/providers/rtzr/error.js +17 -15
- package/dist/ai/providers/rtzr/model.d.ts.map +1 -1
- package/dist/ai/providers/rtzr/model.js +3 -2
- package/dist/ai/providers/rtzr/options.d.ts.map +1 -1
- package/dist/ai/providers/rtzr/options.js +16 -16
- package/dist/ai/providers/rtzr/provider.d.ts.map +1 -1
- package/dist/ai/providers/rtzr/provider.js +9 -9
- package/dist/ai/providers/rtzr/utils.d.ts.map +1 -1
- package/dist/ai/providers/rtzr/utils.js +1 -1
- package/dist/api/caster.d.ts.map +1 -1
- package/dist/api/caster.js +17 -17
- package/dist/api/code-converters.d.ts +4 -2
- package/dist/api/code-converters.d.ts.map +1 -1
- package/dist/api/code-converters.js +100 -19
- package/dist/api/config.d.ts +16 -1
- package/dist/api/config.d.ts.map +1 -1
- package/dist/api/config.js +28 -21
- package/dist/api/context.d.ts +2 -2
- package/dist/api/context.d.ts.map +1 -1
- package/dist/api/context.js +1 -1
- package/dist/api/decorators.d.ts.map +1 -1
- package/dist/api/decorators.js +18 -11
- package/dist/api/http-validator.d.ts +36 -0
- package/dist/api/http-validator.d.ts.map +1 -0
- package/dist/api/http-validator.js +72 -0
- package/dist/api/index.js +6 -4
- package/dist/api/sonamu.d.ts +59 -20
- package/dist/api/sonamu.d.ts.map +1 -1
- package/dist/api/sonamu.js +250 -106
- package/dist/api/websocket-helpers.d.ts +7 -5
- package/dist/api/websocket-helpers.d.ts.map +1 -1
- package/dist/api/websocket-helpers.js +6 -6
- package/dist/auth/audit-log/builders.d.ts.map +1 -1
- package/dist/auth/audit-log/builders.js +1 -1
- package/dist/auth/audit-log/client-ip.d.ts +1 -1
- package/dist/auth/audit-log/client-ip.d.ts.map +1 -1
- package/dist/auth/audit-log/client-ip.js +4 -2
- package/dist/auth/audit-log/events.d.ts +5 -1
- package/dist/auth/audit-log/events.d.ts.map +1 -1
- package/dist/auth/audit-log/events.js +1 -1
- package/dist/auth/audit-log/plugin.d.ts +0 -8
- package/dist/auth/audit-log/plugin.d.ts.map +1 -1
- package/dist/auth/audit-log/plugin.js +48 -52
- package/dist/auth/audit-log-ingestor.d.ts.map +1 -1
- package/dist/auth/audit-log-ingestor.js +16 -12
- package/dist/auth/auth-generator.d.ts.map +1 -1
- package/dist/auth/auth-generator.js +1 -1
- package/dist/auth/better-auth-request.d.ts.map +1 -1
- package/dist/auth/better-auth-request.js +6 -5
- package/dist/auth/knex-adapter.js +1 -1
- package/dist/auth/plugins/entity-definitions/index.d.ts +13 -1
- package/dist/auth/plugins/entity-definitions/index.d.ts.map +1 -1
- package/dist/auth/plugins/entity-definitions/index.js +1 -1
- package/dist/auth/plugins/wrappers/admin.d.ts +1 -1
- package/dist/bin/build-config.d.ts +25 -0
- package/dist/bin/build-config.d.ts.map +1 -1
- package/dist/bin/build-config.js +105 -2
- package/dist/bin/cli.js +131 -27
- package/dist/bin/compiler-policy.d.ts +3 -0
- package/dist/bin/compiler-policy.d.ts.map +1 -0
- package/dist/bin/compiler-policy.js +24 -0
- package/dist/bin/fixture.d.ts.map +1 -1
- package/dist/bin/fixture.js +5 -3
- package/dist/bin/test-command.d.ts +22 -1
- package/dist/bin/test-command.d.ts.map +1 -1
- package/dist/bin/test-command.js +18 -10
- package/dist/bin/ts-loader-registration.d.ts +7 -1
- package/dist/bin/ts-loader-registration.d.ts.map +1 -1
- package/dist/bin/ts-loader-registration.js +13 -4
- package/dist/cache/decorator.d.ts.map +1 -1
- package/dist/cache/decorator.js +11 -4
- package/dist/compress/compress.d.ts.map +1 -1
- package/dist/compress/compress.js +1 -1
- package/dist/cone/cone-generator.d.ts +14 -1
- package/dist/cone/cone-generator.d.ts.map +1 -1
- package/dist/cone/cone-generator.js +13 -9
- package/dist/database/_batch_update.js +1 -1
- package/dist/database/base-model.d.ts +22 -10
- package/dist/database/base-model.d.ts.map +1 -1
- package/dist/database/base-model.js +26 -16
- package/dist/database/base-model.types.d.ts +15 -3
- package/dist/database/base-model.types.d.ts.map +1 -1
- package/dist/database/db.d.ts +12 -2
- package/dist/database/db.d.ts.map +1 -1
- package/dist/database/db.js +10 -7
- package/dist/database/knex.d.ts.map +1 -1
- package/dist/database/knex.js +17 -14
- package/dist/database/puri.d.ts +11 -9
- package/dist/database/puri.d.ts.map +1 -1
- package/dist/database/puri.js +93 -79
- package/dist/database/puri.types.d.ts +21 -21
- package/dist/database/puri.types.d.ts.map +1 -1
- package/dist/database/puri.types.js +1 -1
- package/dist/database/upsert-builder.d.ts +12 -10
- package/dist/database/upsert-builder.d.ts.map +1 -1
- package/dist/database/upsert-builder.js +20 -12
- package/dist/dict/sd.d.ts.map +1 -1
- package/dist/dict/sd.js +1 -1
- package/dist/dict/sonamu-dictionary.d.ts.map +1 -1
- package/dist/dict/sonamu-dictionary.js +1 -1
- package/dist/dict/utils.d.ts.map +1 -1
- package/dist/dict/utils.js +7 -2
- package/dist/entity/entity-manager.d.ts +13 -4
- package/dist/entity/entity-manager.d.ts.map +1 -1
- package/dist/entity/entity-manager.js +19 -11
- package/dist/entity/entity-template-cone.d.ts +73 -5
- package/dist/entity/entity-template-cone.d.ts.map +1 -1
- package/dist/entity/entity-template-cone.js +4 -2
- package/dist/entity/entity.d.ts +6 -2
- package/dist/entity/entity.d.ts.map +1 -1
- package/dist/entity/entity.js +30 -28
- package/dist/env.d.ts +3 -1
- package/dist/env.d.ts.map +1 -1
- package/dist/env.js +1 -1
- package/dist/exceptions/error-handler.d.ts.map +1 -1
- package/dist/exceptions/error-handler.js +7 -2
- package/dist/exceptions/so-exceptions.d.ts +24 -20
- package/dist/exceptions/so-exceptions.d.ts.map +1 -1
- package/dist/exceptions/so-exceptions.js +4 -2
- package/dist/filter/utils.d.ts +7 -2
- package/dist/filter/utils.d.ts.map +1 -1
- package/dist/filter/utils.js +8 -6
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +12 -6
- package/dist/logger/configure.d.ts.map +1 -1
- package/dist/logger/configure.js +10 -10
- package/dist/migration/code-generation.d.ts.map +1 -1
- package/dist/migration/code-generation.js +50 -46
- package/dist/migration/index-where-predicate.d.ts.map +1 -1
- package/dist/migration/index-where-predicate.js +22 -8
- package/dist/migration/migration-set.d.ts.map +1 -1
- package/dist/migration/migration-set.js +1 -1
- package/dist/migration/migrator.d.ts +3 -2
- package/dist/migration/migrator.d.ts.map +1 -1
- package/dist/migration/migrator.js +27 -21
- package/dist/migration/postgresql-schema-reader.d.ts.map +1 -1
- package/dist/migration/postgresql-schema-reader.js +51 -36
- package/dist/migration/slack-confirm.d.ts.map +1 -1
- package/dist/migration/slack-confirm.js +1 -1
- package/dist/naite/naite-reporter.js +2 -2
- package/dist/naite/naite.d.ts +74 -15
- package/dist/naite/naite.d.ts.map +1 -1
- package/dist/naite/naite.js +5 -19
- package/dist/runtime-type.d.ts +6 -0
- package/dist/runtime-type.d.ts.map +1 -0
- package/dist/runtime-type.js +26 -0
- package/dist/ssr/hmr-opt-out.d.ts +26 -0
- package/dist/ssr/hmr-opt-out.d.ts.map +1 -0
- package/dist/ssr/hmr-opt-out.js +59 -0
- package/dist/ssr/renderer.d.ts.map +1 -1
- package/dist/ssr/renderer.js +4 -1
- package/dist/storage/base-file.js +14 -14
- package/dist/storage/buffered-file.d.ts +2 -2
- package/dist/storage/buffered-file.d.ts.map +1 -1
- package/dist/storage/buffered-file.js +12 -12
- package/dist/storage/s3-driver.d.ts.map +1 -1
- package/dist/storage/s3-driver.js +1 -1
- package/dist/storage/uploaded-file.d.ts +2 -2
- package/dist/storage/uploaded-file.d.ts.map +1 -1
- package/dist/storage/uploaded-file.js +8 -8
- package/dist/stream/sse.js +11 -11
- package/dist/stream/ws-core.d.ts +1 -1
- package/dist/stream/ws-core.d.ts.map +1 -1
- package/dist/stream/ws-delivery.d.ts +1 -1
- package/dist/stream/ws-delivery.d.ts.map +1 -1
- package/dist/stream/ws-delivery.js +6 -4
- package/dist/stream/ws-local-connection-store.d.ts.map +1 -1
- package/dist/stream/ws-local-connection-store.js +4 -2
- package/dist/stream/ws-presence-store.js +1 -1
- package/dist/stream/ws-registry.d.ts +4 -4
- package/dist/stream/ws-registry.d.ts.map +1 -1
- package/dist/stream/ws-registry.js +4 -2
- package/dist/stream/ws-telemetry.d.ts +16 -12
- package/dist/stream/ws-telemetry.d.ts.map +1 -1
- package/dist/stream/ws-telemetry.js +22 -18
- package/dist/stream/ws.d.ts +18 -12
- package/dist/stream/ws.d.ts.map +1 -1
- package/dist/stream/ws.js +26 -22
- package/dist/syncer/api-parser.js +1 -1
- package/dist/syncer/checksum.d.ts.map +1 -1
- package/dist/syncer/checksum.js +7 -8
- package/dist/syncer/code-generator.d.ts.map +1 -1
- package/dist/syncer/code-generator.js +13 -14
- package/dist/syncer/entity-operations.d.ts.map +1 -1
- package/dist/syncer/entity-operations.js +5 -6
- package/dist/syncer/file-copy.d.ts +5 -0
- package/dist/syncer/file-copy.d.ts.map +1 -0
- package/dist/syncer/file-copy.js +36 -0
- package/dist/syncer/file-patterns.d.ts +1 -0
- package/dist/syncer/file-patterns.d.ts.map +1 -1
- package/dist/syncer/file-patterns.js +5 -2
- package/dist/syncer/file-tracking.d.ts.map +1 -1
- package/dist/syncer/file-tracking.js +5 -4
- package/dist/syncer/filesystem-dependencies.d.ts +15 -0
- package/dist/syncer/filesystem-dependencies.d.ts.map +1 -0
- package/dist/syncer/filesystem-dependencies.js +53 -0
- package/dist/syncer/module-loader.d.ts +1 -1
- package/dist/syncer/module-loader.d.ts.map +1 -1
- package/dist/syncer/module-loader.js +6 -4
- package/dist/syncer/syncer-actions.d.ts +4 -0
- package/dist/syncer/syncer-actions.d.ts.map +1 -1
- package/dist/syncer/syncer-actions.js +34 -17
- package/dist/syncer/syncer.d.ts +17 -6
- package/dist/syncer/syncer.d.ts.map +1 -1
- package/dist/syncer/syncer.js +71 -29
- package/dist/syncer/watcher.d.ts.map +1 -1
- package/dist/syncer/watcher.js +3 -3
- package/dist/tasks/decorator.d.ts +6 -6
- package/dist/tasks/decorator.d.ts.map +1 -1
- package/dist/tasks/decorator.js +4 -4
- package/dist/tasks/step-wrapper.d.ts +6 -4
- package/dist/tasks/step-wrapper.d.ts.map +1 -1
- package/dist/tasks/step-wrapper.js +5 -5
- package/dist/tasks/workflow-manager.d.ts.map +1 -1
- package/dist/tasks/workflow-manager.js +13 -7
- package/dist/template/entity-converter.d.ts +1 -1
- package/dist/template/entity-converter.d.ts.map +1 -1
- package/dist/template/entity-converter.js +2 -2
- package/dist/template/helpers.d.ts +8 -6
- package/dist/template/helpers.d.ts.map +1 -1
- package/dist/template/helpers.js +1 -1
- package/dist/template/implementations/generated.template.d.ts.map +1 -1
- package/dist/template/implementations/generated.template.js +4 -4
- package/dist/template/implementations/generated_http.template.d.ts +7 -4
- package/dist/template/implementations/generated_http.template.d.ts.map +1 -1
- package/dist/template/implementations/generated_http.template.js +21 -21
- package/dist/template/implementations/generated_sso.template.d.ts.map +1 -1
- package/dist/template/implementations/generated_sso.template.js +6 -3
- package/dist/template/implementations/http_validators.template.d.ts +18 -0
- package/dist/template/implementations/http_validators.template.d.ts.map +1 -0
- package/dist/template/implementations/http_validators.template.js +127 -0
- package/dist/template/implementations/model.template.d.ts.map +1 -1
- package/dist/template/implementations/model.template.js +1 -1
- package/dist/template/implementations/queries.template.js +1 -1
- package/dist/template/implementations/sd.template.d.ts.map +1 -1
- package/dist/template/implementations/sd.template.js +79 -39
- package/dist/template/implementations/services.template.d.ts.map +1 -1
- package/dist/template/implementations/services.template.js +6 -4
- package/dist/template/implementations/view_form.template.d.ts +6 -1
- package/dist/template/implementations/view_form.template.d.ts.map +1 -1
- package/dist/template/implementations/view_form.template.js +23 -15
- package/dist/template/implementations/view_list.template.d.ts.map +1 -1
- package/dist/template/implementations/view_list.template.js +11 -6
- package/dist/template/template-manager.d.ts.map +1 -1
- package/dist/template/template-manager.js +9 -7
- package/dist/template/template-types.d.ts +12 -5
- package/dist/template/template-types.d.ts.map +1 -1
- package/dist/template/template-types.js +1 -1
- package/dist/template/template.d.ts +2 -2
- package/dist/template/template.d.ts.map +1 -1
- package/dist/template/template.js +6 -4
- package/dist/template/zod-converter.d.ts +0 -19
- package/dist/template/zod-converter.d.ts.map +1 -1
- package/dist/template/zod-converter.js +100 -84
- package/dist/testing/_relation-graph.d.ts.map +1 -1
- package/dist/testing/_relation-graph.js +2 -1
- package/dist/testing/bootstrap.d.ts.map +1 -1
- package/dist/testing/bootstrap.js +9 -6
- package/dist/testing/data-explorer.d.ts +32 -7
- package/dist/testing/data-explorer.d.ts.map +1 -1
- package/dist/testing/data-explorer.js +77 -31
- package/dist/testing/dev-test-routes.d.ts +8 -1
- package/dist/testing/dev-test-routes.d.ts.map +1 -1
- package/dist/testing/dev-test-routes.js +125 -108
- package/dist/testing/dev-vitest-manager.d.ts +54 -8
- package/dist/testing/dev-vitest-manager.d.ts.map +1 -1
- package/dist/testing/dev-vitest-manager.js +24 -9
- package/dist/testing/faker-mappings.d.ts +412 -1
- package/dist/testing/faker-mappings.d.ts.map +1 -1
- package/dist/testing/faker-mappings.js +1 -1
- package/dist/testing/filesystem.d.ts +2 -0
- package/dist/testing/filesystem.d.ts.map +1 -0
- package/dist/testing/filesystem.js +7 -0
- package/dist/testing/fixture-generator.d.ts +25 -8
- package/dist/testing/fixture-generator.d.ts.map +1 -1
- package/dist/testing/fixture-generator.js +132 -73
- package/dist/testing/fixture-loader.d.ts +3 -1
- package/dist/testing/fixture-loader.d.ts.map +1 -1
- package/dist/testing/fixture-loader.js +1 -20
- package/dist/testing/fixture-manager.d.ts +8 -7
- package/dist/testing/fixture-manager.d.ts.map +1 -1
- package/dist/testing/fixture-manager.js +91 -59
- package/dist/testing/global-setup.d.ts.map +1 -1
- package/dist/testing/global-setup.js +5 -2
- package/dist/testing/index.d.ts +2 -0
- package/dist/testing/index.d.ts.map +1 -1
- package/dist/testing/index.js +6 -3
- package/dist/types/types.d.ts +101 -99
- package/dist/types/types.d.ts.map +1 -1
- package/dist/types/types.js +234 -225
- package/dist/ui/ai-api.d.ts.map +1 -1
- package/dist/ui/ai-api.js +1 -1
- package/dist/ui/ai-client.d.ts.map +1 -1
- package/dist/ui/ai-client.js +28 -18
- package/dist/ui/api.d.ts.map +1 -1
- package/dist/ui/api.js +135 -128
- package/dist/ui/async-route.d.ts +3 -0
- package/dist/ui/async-route.d.ts.map +1 -0
- package/dist/ui/async-route.js +12 -0
- package/dist/ui/cdd-service.d.ts +9 -7
- package/dist/ui/cdd-service.d.ts.map +1 -1
- package/dist/ui/cdd-service.js +7 -5
- package/dist/ui/migrations-api.d.ts.map +1 -1
- package/dist/ui/migrations-api.js +17 -15
- package/dist/ui-web/assets/index-DV1AAq6W.js +178 -0
- package/dist/ui-web/index.html +1 -1
- package/dist/utils/formatter.d.ts.map +1 -1
- package/dist/utils/formatter.js +7 -5
- package/dist/utils/fs-utils.d.ts +3 -3
- package/dist/utils/fs-utils.d.ts.map +1 -1
- package/dist/utils/fs-utils.js +6 -6
- package/dist/utils/model.d.ts +3 -5
- package/dist/utils/model.d.ts.map +1 -1
- package/dist/utils/model.js +1 -1
- package/dist/utils/object-utils.d.ts +1 -1
- package/dist/utils/object-utils.d.ts.map +1 -1
- package/dist/utils/object-utils.js +17 -16
- package/dist/utils/process-utils.d.ts.map +1 -1
- package/dist/utils/process-utils.js +4 -2
- package/dist/utils/runtime-value.d.ts +13 -0
- package/dist/utils/runtime-value.d.ts.map +1 -0
- package/dist/utils/runtime-value.js +40 -0
- package/dist/utils/sql-parser.d.ts +8 -1
- package/dist/utils/sql-parser.d.ts.map +1 -1
- package/dist/utils/sql-parser.js +6 -3
- package/dist/utils/type-utils.d.ts.map +1 -1
- package/dist/utils/type-utils.js +10 -8
- package/dist/utils/utils.d.ts +2 -2
- package/dist/utils/utils.d.ts.map +1 -1
- package/dist/utils/utils.js +11 -8
- package/dist/utils/zod-error.d.ts.map +1 -1
- package/dist/utils/zod-error.js +7 -4
- package/dist/vector/chunking.d.ts.map +1 -1
- package/dist/vector/chunking.js +1 -1
- package/dist/vector/embedding.d.ts.map +1 -1
- package/dist/vector/embedding.js +1 -1
- package/dist/vector/types.d.ts +3 -2
- package/dist/vector/types.d.ts.map +1 -1
- package/package.json +5 -3
- package/src/ai/agents/agent.ts +5 -5
- package/src/ai/agents/types.ts +1 -1
- package/src/ai/providers/rtzr/__tests__/model.test.ts +2 -2
- package/src/ai/providers/rtzr/error.ts +5 -3
- package/src/ai/providers/rtzr/model.ts +3 -2
- package/src/ai/providers/rtzr/options.ts +10 -5
- package/src/ai/providers/rtzr/provider.ts +10 -10
- package/src/ai/providers/rtzr/utils.ts +3 -1
- package/src/api/__tests__/config.test.ts +11 -21
- package/src/api/__tests__/sonamu.http-validator.test.ts +512 -0
- package/src/api/__tests__/sonamu.websocket.test.ts +51 -41
- package/src/api/__tests__/zod-compiler-policy.test.ts +95 -0
- package/src/api/caster.ts +6 -8
- package/src/api/code-converters.ts +136 -36
- package/src/api/config.ts +62 -4
- package/src/api/context.ts +3 -3
- package/src/api/decorators.ts +28 -17
- package/src/api/http-validator.ts +149 -0
- package/src/api/sonamu.ts +459 -152
- package/src/api/websocket-helpers.ts +24 -17
- package/src/auth/audit-log/builders.ts +3 -2
- package/src/auth/audit-log/client-ip.ts +4 -2
- package/src/auth/audit-log/events.ts +15 -1
- package/src/auth/audit-log/plugin.ts +129 -200
- package/src/auth/audit-log-ingestor.ts +19 -15
- package/src/auth/auth-generator.ts +10 -5
- package/src/auth/better-auth-request.ts +4 -3
- package/src/auth/knex-adapter.ts +8 -2
- package/src/auth/plugins/entity-definitions/index.ts +6 -5
- package/src/bin/__tests__/http-validator-benchmark.test.ts +94 -0
- package/src/bin/__tests__/test-command.test.ts +9 -15
- package/src/bin/__tests__/ts-loader-register.test.ts +15 -17
- package/src/bin/__tests__/zod-compiler-build.test.ts +307 -0
- package/src/bin/build-config.ts +167 -0
- package/src/bin/cli.ts +153 -36
- package/src/bin/compiler-policy.ts +35 -0
- package/src/bin/fixture.ts +14 -3
- package/src/bin/test-command.ts +74 -29
- package/src/bin/ts-loader-registration.ts +22 -4
- package/src/cache/decorator.ts +10 -3
- package/src/compress/compress.ts +17 -4
- package/src/cone/cone-generator.ts +34 -6
- package/src/database/__tests__/db.test.ts +1 -0
- package/src/database/__tests__/puri.test.ts +16 -15
- package/src/database/__tests__/transaction-scope.test.ts +5 -0
- package/src/database/_batch_update.ts +1 -0
- package/src/database/base-model.ts +81 -50
- package/src/database/base-model.types.ts +6 -6
- package/src/database/db.ts +29 -19
- package/src/database/knex.ts +30 -17
- package/src/database/puri-subset.test-d.ts +17 -0
- package/src/database/puri.ts +181 -143
- package/src/database/puri.types.test-d.ts +31 -1
- package/src/database/puri.types.ts +23 -21
- package/src/database/upsert-builder.ts +75 -53
- package/src/dict/sd.ts +15 -5
- package/src/dict/sonamu-dictionary.ts +6 -6
- package/src/dict/utils.ts +9 -1
- package/src/entity/entity-manager.ts +26 -9
- package/src/entity/entity-template-cone.ts +5 -10
- package/src/entity/entity.ts +50 -34
- package/src/env.ts +7 -3
- package/src/exceptions/error-handler.ts +17 -2
- package/src/exceptions/so-exceptions.ts +26 -20
- package/src/filter/utils.ts +21 -11
- package/src/index.ts +3 -0
- package/src/logger/configure.ts +26 -18
- package/src/migration/__tests__/migrator.test.ts +50 -57
- package/src/migration/code-generation.ts +132 -104
- package/src/migration/index-where-predicate.ts +51 -24
- package/src/migration/migration-set.ts +11 -5
- package/src/migration/migrator.ts +68 -41
- package/src/migration/postgresql-schema-reader.ts +52 -47
- package/src/migration/slack-confirm.ts +17 -15
- package/src/naite/naite-reporter.ts +1 -1
- package/src/naite/naite.ts +97 -24
- package/src/runtime-type.ts +34 -0
- package/src/ssr/hmr-opt-out.ts +78 -0
- package/src/ssr/renderer.ts +6 -0
- package/src/storage/base-file.ts +13 -13
- package/src/storage/buffered-file.ts +11 -11
- package/src/storage/s3-driver.ts +4 -1
- package/src/storage/uploaded-file.ts +8 -8
- package/src/stream/__tests__/ws-contracts.test.ts +4 -2
- package/src/stream/__tests__/ws-telemetry.test.ts +1 -1
- package/src/stream/__tests__/ws.test.ts +30 -6
- package/src/stream/sse.ts +12 -11
- package/src/stream/ws-core.ts +1 -1
- package/src/stream/ws-delivery.ts +16 -7
- package/src/stream/ws-local-connection-store.ts +2 -3
- package/src/stream/ws-presence-store.ts +6 -1
- package/src/stream/ws-registry.ts +16 -7
- package/src/stream/ws-telemetry.ts +66 -43
- package/src/stream/ws.ts +73 -39
- package/src/syncer/__tests__/api-parser.websocket-type-ref.test.ts +3 -2
- package/src/syncer/__tests__/http-validator-registry.test.ts +137 -0
- package/src/syncer/api-parser.ts +67 -27
- package/src/syncer/checksum.ts +17 -11
- package/src/syncer/code-generator.ts +25 -17
- package/src/syncer/entity-operations.ts +3 -5
- package/src/syncer/file-copy.ts +46 -0
- package/src/syncer/file-patterns.ts +11 -8
- package/src/syncer/file-tracking.ts +3 -4
- package/src/syncer/filesystem-dependencies.ts +73 -0
- package/src/syncer/module-loader.ts +8 -4
- package/src/syncer/syncer-actions.ts +56 -18
- package/src/syncer/syncer.ts +116 -43
- package/src/syncer/watcher.ts +8 -4
- package/src/tasks/decorator.ts +20 -12
- package/src/tasks/step-wrapper.ts +19 -9
- package/src/tasks/workflow-manager.ts +15 -9
- package/src/template/__tests__/http_validators.template.test.ts +160 -0
- package/src/template/__tests__/services.template.mutation.test.ts +24 -23
- package/src/template/__tests__/services.template.websocket.test.ts +21 -25
- package/src/template/entity-converter.ts +5 -2
- package/src/template/helpers.ts +8 -9
- package/src/template/implementations/generated.template.ts +5 -4
- package/src/template/implementations/generated_http.template.ts +61 -15
- package/src/template/implementations/generated_sso.template.ts +15 -4
- package/src/template/implementations/http_validators.template.ts +175 -0
- package/src/template/implementations/model.template.ts +3 -1
- package/src/template/implementations/sd.template.ts +81 -41
- package/src/template/implementations/services.template.ts +2 -2
- package/src/template/implementations/view_form.template.ts +56 -39
- package/src/template/implementations/view_list.template.ts +31 -23
- package/src/template/template-manager.ts +15 -13
- package/src/template/template-types.ts +13 -5
- package/src/template/template.ts +4 -3
- package/src/template/zod-converter.ts +206 -91
- package/src/testing/__tests__/dev-test-routes.test.ts +85 -25
- package/src/testing/__tests__/dev-vitest-manager.test.ts +15 -15
- package/src/testing/_relation-graph.ts +4 -1
- package/src/testing/bootstrap.ts +12 -5
- package/src/testing/data-explorer.ts +102 -53
- package/src/testing/dev-test-routes.ts +87 -50
- package/src/testing/dev-vitest-manager.ts +88 -32
- package/src/testing/faker-mappings.ts +2 -2
- package/src/testing/filesystem.ts +1 -0
- package/src/testing/fixture-generator.ts +191 -131
- package/src/testing/fixture-loader.ts +5 -1
- package/src/testing/fixture-manager.ts +129 -90
- package/src/testing/global-setup.ts +7 -3
- package/src/testing/index.ts +5 -0
- package/src/types/__tests__/entity-json-schema-search-text.test.ts +9 -3
- package/src/types/types.ts +184 -158
- package/src/ui/ai-api.ts +9 -7
- package/src/ui/ai-client.ts +61 -56
- package/src/ui/api.ts +727 -616
- package/src/ui/async-route.ts +4 -0
- package/src/ui/cdd-service.ts +35 -12
- package/src/ui/migrations-api.ts +63 -51
- package/src/utils/formatter.ts +7 -3
- package/src/utils/fs-utils.ts +5 -5
- package/src/utils/model.ts +4 -5
- package/src/utils/object-utils.ts +32 -22
- package/src/utils/process-utils.ts +4 -1
- package/src/utils/runtime-value.ts +43 -0
- package/src/utils/sql-parser.ts +13 -6
- package/src/utils/type-utils.ts +9 -7
- package/src/utils/utils.ts +19 -21
- package/src/utils/zod-error.ts +4 -2
- package/src/vector/chunking.ts +6 -1
- package/src/vector/embedding.ts +2 -1
- package/src/vector/types.ts +4 -2
- package/tsdown.api.config.ts +5 -2
- package/dist/ui-web/assets/index-C0m1pk6K.js +0 -177
|
@@ -38,22 +38,23 @@ const SUPPORTED_LOCALES = ${JSON.stringify(supportedLocales)} as const;
|
|
|
38
38
|
function getCurrentLocale(): (typeof SUPPORTED_LOCALES)[number] {
|
|
39
39
|
try {
|
|
40
40
|
const ctx = Sonamu.getContext();
|
|
41
|
-
|
|
42
|
-
|
|
41
|
+
const locale = ctx.locale;
|
|
42
|
+
return SUPPORTED_LOCALES.find((supportedLocale) => supportedLocale === locale) ?? DEFAULT_LOCALE;
|
|
43
|
+
} catch {
|
|
43
44
|
return DEFAULT_LOCALE;
|
|
44
45
|
}
|
|
45
46
|
}
|
|
46
47
|
`.trim() : `
|
|
47
48
|
const DEFAULT_LOCALE = "${defaultLocale}" as const;
|
|
48
49
|
export const SUPPORTED_LOCALES = ${JSON.stringify(supportedLocales)} as const;
|
|
49
|
-
let
|
|
50
|
+
let currentLocale: (typeof SUPPORTED_LOCALES)[number] = DEFAULT_LOCALE;
|
|
50
51
|
|
|
51
52
|
export function setLocale(locale: (typeof SUPPORTED_LOCALES)[number]) {
|
|
52
|
-
|
|
53
|
+
currentLocale = locale;
|
|
53
54
|
}
|
|
54
55
|
|
|
55
56
|
export function getCurrentLocale(): (typeof SUPPORTED_LOCALES)[number] {
|
|
56
|
-
return
|
|
57
|
+
return currentLocale;
|
|
57
58
|
}
|
|
58
59
|
`.trim();
|
|
59
60
|
const localeImports = supportedLocales.map((locale) => `import ${locale} from "./${locale}";`).join("\n");
|
|
@@ -97,7 +98,10 @@ export function defineLocale(dict: Partial<MergedDictionary>) {
|
|
|
97
98
|
}
|
|
98
99
|
|
|
99
100
|
// 각 locale별로 rc-keys + entity labels + 프로젝트 dict 합침
|
|
100
|
-
|
|
101
|
+
type DictionaryRegistry = {
|
|
102
|
+
[L in (typeof SUPPORTED_LOCALES)[number]]: Partial<MergedDictionary>;
|
|
103
|
+
};
|
|
104
|
+
const dictionaries: DictionaryRegistry = {
|
|
101
105
|
${defaultLocale}: { ...${getRCKeysVarName(defaultLocale)}, ...entityLabels, ...${defaultLocale} },
|
|
102
106
|
${supportedLocales.filter((locale) => locale !== defaultLocale).map((locale) => ` ${locale}: { ...${getRCKeysVarName(locale)}, ...${locale} },`).join("\n")}
|
|
103
107
|
};
|
|
@@ -106,29 +110,33 @@ type SDReturnType<K extends DictKey> = MergedDictionary[K] extends (...args: inf
|
|
|
106
110
|
? (...args: P) => LocalizedString
|
|
107
111
|
: LocalizedString;
|
|
108
112
|
|
|
109
|
-
function getDictValue<K extends DictKey>(key: K, locale:
|
|
113
|
+
function getDictValue<K extends DictKey>(key: K, locale: (typeof SUPPORTED_LOCALES)[number]): SDReturnType<K> {
|
|
110
114
|
// 1. 지정된 locale에서 조회
|
|
111
115
|
const dict = dictionaries[locale];
|
|
112
116
|
if (dict?.[key] !== undefined) {
|
|
113
|
-
|
|
117
|
+
// SAFETY: 요청 locale의 같은 키는 MergedDictionary가 정한 반환 종류를 유지합니다.
|
|
118
|
+
return dict[key] as SDReturnType<K>;
|
|
114
119
|
}
|
|
115
120
|
|
|
116
121
|
// 2. default locale에서 조회
|
|
117
122
|
if (locale !== DEFAULT_LOCALE && dictionaries[DEFAULT_LOCALE]?.[key] !== undefined) {
|
|
118
|
-
|
|
123
|
+
// SAFETY: 기본 locale의 같은 키는 MergedDictionary가 정한 반환 종류를 유지합니다.
|
|
124
|
+
return dictionaries[DEFAULT_LOCALE][key] as SDReturnType<K>;
|
|
119
125
|
}
|
|
120
126
|
|
|
121
127
|
// 3. supported locales 순회
|
|
122
128
|
for (const supportedLocale of SUPPORTED_LOCALES) {
|
|
123
129
|
if (supportedLocale !== locale && supportedLocale !== DEFAULT_LOCALE) {
|
|
124
130
|
if (dictionaries[supportedLocale]?.[key] !== undefined) {
|
|
125
|
-
|
|
131
|
+
// SAFETY: 대체 locale의 같은 키는 MergedDictionary가 정한 반환 종류를 유지합니다.
|
|
132
|
+
return dictionaries[supportedLocale][key] as SDReturnType<K>;
|
|
126
133
|
}
|
|
127
134
|
}
|
|
128
135
|
}
|
|
129
136
|
|
|
130
|
-
//
|
|
131
|
-
|
|
137
|
+
// 모든 locale에 값이 없으면 동적으로 조합된 키를 그대로 노출합니다.
|
|
138
|
+
// SAFETY: 누락된 사전 키의 문자열 표현은 LocalizedString fallback 규약을 따릅니다.
|
|
139
|
+
return String(key) as SDReturnType<K>;
|
|
132
140
|
}
|
|
133
141
|
|
|
134
142
|
/**
|
|
@@ -194,58 +202,85 @@ type LocalizedColumnCandidate<T, K extends string> =
|
|
|
194
202
|
type LocalizedColumnReturn<T, K extends string> =
|
|
195
203
|
| LocalizedColumnValueFrom<LocalizedColumnCandidate<T, K>>
|
|
196
204
|
| undefined;
|
|
197
|
-
type LocaleValueMap =
|
|
205
|
+
type LocaleValueMap = {
|
|
206
|
+
[L in (typeof SUPPORTED_LOCALES)[number]]?: LocalizedColumnValue;
|
|
207
|
+
};
|
|
208
|
+
function isString<V>(value: V): value is V & string {
|
|
209
|
+
return Object.prototype.toString.call(value) === "[object String]";
|
|
210
|
+
}
|
|
198
211
|
|
|
199
|
-
function isLocalizedColumnValue(value:
|
|
200
|
-
return
|
|
212
|
+
function isLocalizedColumnValue<V>(value: V): value is V & LocalizedColumnValue {
|
|
213
|
+
return isString(value) || (Array.isArray(value) && value.every(isString));
|
|
201
214
|
}
|
|
202
215
|
|
|
203
|
-
function isLocalizedColumnScalarValue(value:
|
|
204
|
-
return ["
|
|
216
|
+
function isLocalizedColumnScalarValue<V>(value: V): value is V & LocalizedColumnScalarValue {
|
|
217
|
+
return ["[object String]", "[object Number]", "[object Boolean]", "[object BigInt]"].includes(
|
|
218
|
+
Object.prototype.toString.call(value),
|
|
219
|
+
);
|
|
205
220
|
}
|
|
206
221
|
|
|
207
|
-
function isEmptyLocalizedColumnValue(value:
|
|
222
|
+
function isEmptyLocalizedColumnValue<V>(value: V): value is V & (null | undefined | "") {
|
|
208
223
|
return value === null || value === undefined || value === "";
|
|
209
224
|
}
|
|
210
225
|
|
|
211
|
-
|
|
226
|
+
type PropertyValue<T, K extends PropertyKey> = K extends keyof T ? T[K] : undefined;
|
|
227
|
+
|
|
228
|
+
function getProperty<T extends object, K extends PropertyKey>(row: T, key: K): PropertyValue<T, K> {
|
|
229
|
+
if (!(key in row)) {
|
|
230
|
+
// SAFETY: 존재하지 않는 후보 키는 조건부 속성 타입에서도 undefined입니다.
|
|
231
|
+
return undefined as PropertyValue<T, K>;
|
|
232
|
+
}
|
|
233
|
+
|
|
234
|
+
// SAFETY: own/inherited 키 존재를 확인했으므로 해당 키의 조건부 속성 타입으로 좁힐 수 있습니다.
|
|
235
|
+
return (row as T & Record<K, PropertyValue<T, K>>)[key];
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
function getNestedLocaleValue<T extends object, K extends LocalizedBaseColumn<T>>(
|
|
212
239
|
row: T,
|
|
213
240
|
column: K,
|
|
214
241
|
locale: (typeof SUPPORTED_LOCALES)[number],
|
|
215
|
-
):
|
|
216
|
-
const columnValue = row
|
|
217
|
-
if (columnValue === null ||
|
|
242
|
+
): LocalizedColumnValue | undefined {
|
|
243
|
+
const columnValue = getProperty(row, column);
|
|
244
|
+
if (columnValue === null || Object.prototype.toString.call(columnValue) !== "[object Object]") {
|
|
218
245
|
return undefined;
|
|
219
246
|
}
|
|
220
247
|
|
|
248
|
+
// SAFETY: 일반 객체 검사를 통과한 값만 locale별 값 맵으로 조회합니다.
|
|
221
249
|
return (columnValue as LocaleValueMap)[locale];
|
|
222
250
|
}
|
|
223
251
|
|
|
224
|
-
|
|
252
|
+
function localizedKey<K extends string>(columnName: K, localeName: (typeof SUPPORTED_LOCALES)[number]) {
|
|
253
|
+
return \`\${columnName}_\${localeName}\`;
|
|
254
|
+
}
|
|
255
|
+
|
|
256
|
+
export function localizedColumn<T extends object, K extends LocalizedBaseColumn<T>>(
|
|
225
257
|
row: T,
|
|
226
258
|
column: K,
|
|
227
259
|
): LocalizedColumnReturn<T, K> {
|
|
228
|
-
const
|
|
229
|
-
const locale = SUPPORTED_LOCALES.includes(
|
|
230
|
-
const otherLocales = SUPPORTED_LOCALES.filter(
|
|
231
|
-
|
|
260
|
+
const requestedLocale = getCurrentLocale();
|
|
261
|
+
const locale = SUPPORTED_LOCALES.includes(requestedLocale) ? requestedLocale : DEFAULT_LOCALE;
|
|
262
|
+
const otherLocales = SUPPORTED_LOCALES.filter(
|
|
263
|
+
(candidateLocale) => candidateLocale !== locale && candidateLocale !== DEFAULT_LOCALE,
|
|
264
|
+
);
|
|
232
265
|
const values = [
|
|
233
|
-
{ value: row
|
|
266
|
+
{ value: getProperty(row, localizedKey(column, locale)), source: "direct" },
|
|
234
267
|
{ value: getNestedLocaleValue(row, column, locale), source: "nested" },
|
|
235
|
-
{ value: row
|
|
236
|
-
{ value: row
|
|
268
|
+
{ value: getProperty(row, column), source: "direct" },
|
|
269
|
+
{ value: getProperty(row, localizedKey(column, DEFAULT_LOCALE)), source: "direct" },
|
|
237
270
|
{ value: getNestedLocaleValue(row, column, DEFAULT_LOCALE), source: "nested" },
|
|
238
271
|
...otherLocales.flatMap((l) => [
|
|
239
|
-
{ value: row
|
|
272
|
+
{ value: getProperty(row, localizedKey(column, l)), source: "direct" },
|
|
240
273
|
{ value: getNestedLocaleValue(row, column, l), source: "nested" },
|
|
241
274
|
]),
|
|
242
275
|
];
|
|
243
276
|
|
|
244
277
|
for (const { value, source } of values) {
|
|
245
278
|
if (!isEmptyLocalizedColumnValue(value) && isLocalizedColumnValue(value)) {
|
|
279
|
+
// SAFETY: 값 가드가 선택한 컬럼의 문자열 또는 문자열 배열임을 확인했습니다.
|
|
246
280
|
return value as LocalizedColumnReturn<T, K>;
|
|
247
281
|
}
|
|
248
282
|
if (source === "direct" && !isEmptyLocalizedColumnValue(value) && isLocalizedColumnScalarValue(value)) {
|
|
283
|
+
// SAFETY: 직접 컬럼의 스칼라 값은 문자열로 변환해 지역화 반환 타입을 충족합니다.
|
|
249
284
|
return String(value) as LocalizedColumnReturn<T, K>;
|
|
250
285
|
}
|
|
251
286
|
}
|
|
@@ -260,14 +295,19 @@ export function localizedColumn<T extends Record<string, unknown>, K extends Loc
|
|
|
260
295
|
* @example
|
|
261
296
|
* SD.enumLabels("TagOrderBy")[key] // → 현재 locale의 라벨
|
|
262
297
|
*/
|
|
263
|
-
|
|
264
|
-
|
|
298
|
+
interface EnumLabels {
|
|
299
|
+
[key: string]: LocalizedString;
|
|
300
|
+
}
|
|
301
|
+
|
|
302
|
+
SD.enumLabels = (enumName: string): EnumLabels => {
|
|
303
|
+
return new Proxy<EnumLabels>({}, {
|
|
265
304
|
get(_, key: string | symbol) {
|
|
266
|
-
if (
|
|
305
|
+
if (Object.prototype.toString.call(key) === "[object Symbol]") {
|
|
267
306
|
return undefined;
|
|
268
307
|
}
|
|
269
308
|
|
|
270
|
-
|
|
309
|
+
// SAFETY: 생성된 enum 이름과 값의 조합은 enum 사전 키 형식을 따릅니다.
|
|
310
|
+
const dictKey = \`enum.\${enumName}.\${String(key)}\` as DictKey;
|
|
271
311
|
return getDictValue(dictKey, getCurrentLocale());
|
|
272
312
|
}
|
|
273
313
|
});
|
|
@@ -292,9 +332,9 @@ SD.enumLabels = (enumName: string): Record<string, LocalizedString> => {
|
|
|
292
332
|
*/
|
|
293
333
|
extractRCKeysSourceCode() {
|
|
294
334
|
try {
|
|
295
|
-
const
|
|
296
|
-
const
|
|
297
|
-
const basePath =
|
|
335
|
+
const currentFilename = fileURLToPath(import.meta.url);
|
|
336
|
+
const currentDirectory = path.dirname(currentFilename);
|
|
337
|
+
const basePath = currentDirectory.includes("/dist/") ? currentDirectory.replace("/dist/", "/src/") : currentDirectory;
|
|
298
338
|
const rcKeysPath = path.join(basePath, "../../dict/rc-keys.ts");
|
|
299
339
|
const sourceCode = fs.readFileSync(rcKeysPath, "utf-8");
|
|
300
340
|
const koCode = extractObjectDeclaration(sourceCode, "rcKeysKo");
|
|
@@ -355,4 +395,4 @@ ${labels.map(({ key, value }) => ` "${key}": "${this.escapeString(value)}",`).j
|
|
|
355
395
|
//#endregion
|
|
356
396
|
export { Template__sd };
|
|
357
397
|
|
|
358
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2QudGVtcGxhdGUuanMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3RlbXBsYXRlL2ltcGxlbWVudGF0aW9ucy9zZC50ZW1wbGF0ZS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgZnMgZnJvbSBcIm5vZGU6ZnNcIjtcbmltcG9ydCBwYXRoIGZyb20gXCJub2RlOnBhdGhcIjtcbmltcG9ydCB7IGZpbGVVUkxUb1BhdGggfSBmcm9tIFwibm9kZTp1cmxcIjtcblxuaW1wb3J0IHsgU29uYW11IH0gZnJvbSBcIi4uLy4uL2FwaS9zb25hbXVcIjtcbmltcG9ydCB7IEVudGl0eU1hbmFnZXIgfSBmcm9tIFwiLi4vLi4vZW50aXR5L2VudGl0eS1tYW5hZ2VyXCI7XG5pbXBvcnQgeyB0eXBlIEVudGl0eU5hbWVzUmVjb3JkIH0gZnJvbSBcIi4uLy4uL2VudGl0eS9lbnRpdHktbWFuYWdlclwiO1xuaW1wb3J0IHsgdHlwZSBUZW1wbGF0ZU9wdGlvbnMgfSBmcm9tIFwiLi4vLi4vdHlwZXMvdHlwZXNcIjtcbmltcG9ydCB7IGV4dHJhY3RPYmplY3REZWNsYXJhdGlvbiB9IGZyb20gXCIuLi9oZWxwZXJzXCI7XG5pbXBvcnQgeyBUZW1wbGF0ZSB9IGZyb20gXCIuLi90ZW1wbGF0ZVwiO1xuXG4vKipcbiAqIFNvbmFtdSBEaWN0aW9uYXJ5IChTRCkg7YWc7ZSM66a/XG4gKiBpMThu7J2EIOychO2VnCBzZC5nZW5lcmF0ZWQudHMg7YyM7J287J2EIOyDneyEse2VqeuLiOuLpC5cbiAqL1xuZXhwb3J0IGNsYXNzIFRlbXBsYXRlX19zZCBleHRlbmRzIFRlbXBsYXRlIHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoXCJzZFwiKTtcbiAgfVxuXG4gIGdldFRhcmdldEFuZFBhdGgoX25hbWVzPzogRW50aXR5TmFtZXNSZWNvcmQsIHNkVGFyZ2V0PzogXCJhcGlcIiB8IFwid2ViXCIgfCBcImFwcFwiKSB7XG4gICAgY29uc3QgdGFyZ2V0ID0gc2RUYXJnZXQgPz8gXCJhcGlcIjtcbiAgICAvLyBhcGkuZGly7J2AIOyDgeuMgCDqsr3roZwoXCJhcGlcIinsnbTrr4DroZwsIHdlYi9hcHDrj4Qg7IOB64yAIOqyveuhnOuhnCDrp57stqRcbiAgICBjb25zdCBkaXIgPSB0YXJnZXQgPT09IFwiYXBpXCIgPyBTb25hbXUuY29uZmlnLmFwaS5kaXIgOiB0YXJnZXQ7XG5cbiAgICByZXR1cm4ge1xuICAgICAgdGFyZ2V0OiBgJHtkaXJ9L3NyYy9pMThuYCxcbiAgICAgIHBhdGg6IFwic2QuZ2VuZXJhdGVkLnRzXCIsXG4gICAgfTtcbiAgfVxuXG4gIHJlbmRlcihvcHRpb25zOiBUZW1wbGF0ZU9wdGlvbnNbXCJzZFwiXSkge1xuICAgIGNvbnN0IHsgdGFyZ2V0IH0gPSBvcHRpb25zO1xuICAgIGNvbnN0IGkxOG5Db25maWcgPSBTb25hbXUuY29uZmlnLmkxOG47XG5cbiAgICBjb25zdCB7IGRlZmF1bHRMb2NhbGUsIHN1cHBvcnRlZExvY2FsZXMgfSA9IGkxOG5Db25maWc7XG5cbiAgICAvLyBlbnRpdHkuanNvbuyXkOyEnCBlbnRpdHkgbGFiZWxzIOy2lOy2nFxuICAgIGNvbnN0IGVudGl0eUxhYmVscyA9IHRoaXMuZXh0cmFjdEVudGl0eUxhYmVscygpO1xuXG4gICAgLy8gcmMta2V5cyDshozsiqQg7L2U65OcIOy2lOy2nFxuICAgIGNvbnN0IHJjS2V5c1NvdXJjZUNvZGUgPSB0aGlzLmV4dHJhY3RSQ0tleXNTb3VyY2VDb2RlKCk7XG5cbiAgICAvLyDtlIzrnqvtj7zrs4QgbG9jYWxlIOq0gOumrCDsvZTrk5xcbiAgICBjb25zdCBsb2NhbGVNYW5hZ2VtZW50Q29kZSA9XG4gICAgICB0YXJnZXQgPT09IFwiYXBpXCJcbiAgICAgICAgPyBgXG5pbXBvcnQgeyBTb25hbXUgfSBmcm9tIFwic29uYW11XCI7XG5cbmNvbnN0IERFRkFVTFRfTE9DQUxFID0gXCIke2RlZmF1bHRMb2NhbGV9XCIgYXMgY29uc3Q7XG5jb25zdCBTVVBQT1JURURfTE9DQUxFUyA9ICR7SlNPTi5zdHJpbmdpZnkoc3VwcG9ydGVkTG9jYWxlcyl9IGFzIGNvbnN0O1xuZnVuY3Rpb24gZ2V0Q3VycmVudExvY2FsZSgpOiAodHlwZW9mIFNVUFBPUlRFRF9MT0NBTEVTKVtudW1iZXJdIHtcbiAgdHJ5IHtcbiAgICBjb25zdCBjdHggPSBTb25hbXUuZ2V0Q29udGV4dCgpO1xuICAgIHJldHVybiBjdHgubG9jYWxlIGFzICh0eXBlb2YgU1VQUE9SVEVEX0xPQ0FMRVMpW251bWJlcl0gPz8gREVGQVVMVF9MT0NBTEU7XG4gIH0gY2F0Y2ggKF8pIHtcbiAgICByZXR1cm4gREVGQVVMVF9MT0NBTEU7XG4gIH1cbn1cbmAudHJpbSgpXG4gICAgICAgIDogYFxuY29uc3QgREVGQVVMVF9MT0NBTEUgPSBcIiR7ZGVmYXVsdExvY2FsZX1cIiBhcyBjb25zdDtcbmV4cG9ydCBjb25zdCBTVVBQT1JURURfTE9DQUxFUyA9ICR7SlNPTi5zdHJpbmdpZnkoc3VwcG9ydGVkTG9jYWxlcyl9IGFzIGNvbnN0O1xubGV0IF9jdXJyZW50TG9jYWxlOiAodHlwZW9mIFNVUFBPUlRFRF9MT0NBTEVTKVtudW1iZXJdID0gREVGQVVMVF9MT0NBTEU7XG5cbmV4cG9ydCBmdW5jdGlvbiBzZXRMb2NhbGUobG9jYWxlOiAodHlwZW9mIFNVUFBPUlRFRF9MT0NBTEVTKVtudW1iZXJdKSB7XG4gIF9jdXJyZW50TG9jYWxlID0gbG9jYWxlO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0Q3VycmVudExvY2FsZSgpOiAodHlwZW9mIFNVUFBPUlRFRF9MT0NBTEVTKVtudW1iZXJdIHtcbiAgcmV0dXJuIF9jdXJyZW50TG9jYWxlO1xufVxuYC50cmltKCk7XG5cbiAgICAvLyBsb2NhbGUgaW1wb3J0XG4gICAgY29uc3QgbG9jYWxlSW1wb3J0cyA9IHN1cHBvcnRlZExvY2FsZXNcbiAgICAgIC5tYXAoKGxvY2FsZSkgPT4gYGltcG9ydCAke2xvY2FsZX0gZnJvbSBcIi4vJHtsb2NhbGV9XCI7YClcbiAgICAgIC5qb2luKFwiXFxuXCIpO1xuXG4gICAgLy8gZW50aXR5TGFiZWxz66W8IOy9lOuTnOuhnCDrs4DtmZhcbiAgICBjb25zdCBlbnRpdHlMYWJlbHNDb2RlID0gdGhpcy5nZW5lcmF0ZUVudGl0eUxhYmVsc0NvZGUoZW50aXR5TGFiZWxzKTtcblxuICAgIC8vIGxvY2FsZeuzhCByY0tleXMg67OA7IiY66qFIOunpO2VkVxuICAgIGNvbnN0IGdldFJDS2V5c1Zhck5hbWUgPSAobG9jYWxlOiBzdHJpbmcpID0+IHtcbiAgICAgIC8vIHN1cHBvcnRlZExvY2FsZXPsl5Ag7Y+s7ZWo65CcIGxvY2FsZeunjCDtlbTri7kg67OA7IiYIOuwmO2ZmFxuICAgICAgaWYgKGxvY2FsZSA9PT0gXCJrb1wiICYmIHN1cHBvcnRlZExvY2FsZXMuaW5jbHVkZXMoXCJrb1wiKSkgcmV0dXJuIFwicmNLZXlzS29cIjtcbiAgICAgIGlmIChsb2NhbGUgPT09IFwiZW5cIiAmJiBzdXBwb3J0ZWRMb2NhbGVzLmluY2x1ZGVzKFwiZW5cIikpIHJldHVybiBcInJjS2V5c0VuXCI7XG4gICAgICAvLyBmYWxsYmFjazogZGVmYXVsdExvY2FsZeydmCByY0tleXNcbiAgICAgIGlmIChsb2NhbGUgIT09IGRlZmF1bHRMb2NhbGUpIHtcbiAgICAgICAgcmV0dXJuIGdldFJDS2V5c1Zhck5hbWUoZGVmYXVsdExvY2FsZSk7XG4gICAgICB9XG4gICAgICAvLyBkZWZhdWx0TG9jYWxl7KGw7LCoIOyXhuuKlCDqsr3smrAgZW7snYQgZmFsbGJhY2vsnLzroZwg7IKs7JqpXG4gICAgICByZXR1cm4gXCJyY0tleXNFblwiO1xuICAgIH07XG5cbiAgICBjb25zdCBib2R5ID0gYFxuJHtsb2NhbGVNYW5hZ2VtZW50Q29kZX1cblxuJHtsb2NhbGVJbXBvcnRzfVxuXG4vLyByZWFjdC1jb21wb25lbnRzIGkxOG4ga2V5c1xuJHtzdXBwb3J0ZWRMb2NhbGVzLmluY2x1ZGVzKFwia29cIikgPyByY0tleXNTb3VyY2VDb2RlLmtvIDogXCJcIn1cblxuJHtzdXBwb3J0ZWRMb2NhbGVzLmluY2x1ZGVzKFwiZW5cIikgPyByY0tleXNTb3VyY2VDb2RlLmVuIDogXCJcIn1cblxuLy8gZW50aXR5Lmpzb27sl5DshJwg7LaU7Lac7ZWcIGVudGl0eSBsYWJlbHMgKGRlZmF1bHRMb2NhbGUg7KCE7JqpKVxuJHtlbnRpdHlMYWJlbHNDb2RlfVxuXG4vLyBkZWZhdWx0TG9jYWxl7J2YIGRpY3Rpb25hcnnrpbwg6riw7KSA7Jy866GcIO2CpCDstpTstpxcbnR5cGUgUkNLZXlzID0gdHlwZW9mICR7Z2V0UkNLZXlzVmFyTmFtZShkZWZhdWx0TG9jYWxlKX07XG50eXBlIFByb2plY3REaWN0aW9uYXJ5ID0gdHlwZW9mICR7ZGVmYXVsdExvY2FsZX07XG50eXBlIEVudGl0eUxhYmVscyA9IHR5cGVvZiBlbnRpdHlMYWJlbHM7XG50eXBlIFJhd01lcmdlZERpY3Rpb25hcnkgPSBSQ0tleXMgJiBPbWl0PEVudGl0eUxhYmVscywga2V5b2YgKFJDS2V5cyAmIFByb2plY3REaWN0aW9uYXJ5KT4gJiBQcm9qZWN0RGljdGlvbmFyeTtcblxuLy8g7YKk64qUIOycoOyngO2VmOuQmCwg6rCSIO2DgOyeheydgCBzdHJpbmcg65iQ64qUIO2VqOyImOuhnCDsnbzrsJjtmZQgKOuLpOuluCBsb2NhbGXsnZgg66as7YSw65+0IO2DgOyehSDstqnrj4wg67Cp7KeAKVxuZXhwb3J0IHR5cGUgTWVyZ2VkRGljdGlvbmFyeSA9IHtcbiAgW0sgaW4ga2V5b2YgUmF3TWVyZ2VkRGljdGlvbmFyeV06IFJhd01lcmdlZERpY3Rpb25hcnlbS10gZXh0ZW5kcyAoLi4uYXJnczogaW5mZXIgUCkgPT4gc3RyaW5nXG4gICAgPyAoLi4uYXJnczogUCkgPT4gc3RyaW5nXG4gICAgOiBzdHJpbmc7XG59O1xuZXhwb3J0IHR5cGUgRGljdEtleSA9IGtleW9mIE1lcmdlZERpY3Rpb25hcnk7XG5leHBvcnQgdHlwZSBMb2NhbGl6ZWRTdHJpbmcgPSBzdHJpbmcgJiB7IF9fYnJhbmQ6IFwiTG9jYWxpemVkU3RyaW5nXCIgfTtcblxuZXhwb3J0IGZ1bmN0aW9uIGRlZmluZUxvY2FsZShkaWN0OiBQYXJ0aWFsPE1lcmdlZERpY3Rpb25hcnk+KSB7XG4gIHJldHVybiBkaWN0O1xufVxuXG4vLyDqsIEgbG9jYWxl67OE66GcIHJjLWtleXMgKyBlbnRpdHkgbGFiZWxzICsg7ZSE66Gc7KCd7Yq4IGRpY3Qg7ZWp7LmoXG5jb25zdCBkaWN0aW9uYXJpZXM6IFJlY29yZDxzdHJpbmcsIFBhcnRpYWw8TWVyZ2VkRGljdGlvbmFyeT4+ID0ge1xuICAke2RlZmF1bHRMb2NhbGV9OiB7IC4uLiR7Z2V0UkNLZXlzVmFyTmFtZShkZWZhdWx0TG9jYWxlKX0sIC4uLmVudGl0eUxhYmVscywgLi4uJHtkZWZhdWx0TG9jYWxlfSB9LFxuICAke3N1cHBvcnRlZExvY2FsZXNcbiAgICAuZmlsdGVyKChsb2NhbGUpID0+IGxvY2FsZSAhPT0gZGVmYXVsdExvY2FsZSlcbiAgICAubWFwKChsb2NhbGUpID0+IGAgICR7bG9jYWxlfTogeyAuLi4ke2dldFJDS2V5c1Zhck5hbWUobG9jYWxlKX0sIC4uLiR7bG9jYWxlfSB9LGApXG4gICAgLmpvaW4oXCJcXG5cIil9XG59O1xuXG50eXBlIFNEUmV0dXJuVHlwZTxLIGV4dGVuZHMgRGljdEtleT4gPSBNZXJnZWREaWN0aW9uYXJ5W0tdIGV4dGVuZHMgKC4uLmFyZ3M6IGluZmVyIFApID0+IHN0cmluZ1xuICA/ICguLi5hcmdzOiBQKSA9PiBMb2NhbGl6ZWRTdHJpbmdcbiAgOiBMb2NhbGl6ZWRTdHJpbmc7XG5cbmZ1bmN0aW9uIGdldERpY3RWYWx1ZTxLIGV4dGVuZHMgRGljdEtleT4oa2V5OiBLLCBsb2NhbGU6IHN0cmluZyk6IFNEUmV0dXJuVHlwZTxLPiB7XG4gIC8vIDEuIOyngOygleuQnCBsb2NhbGXsl5DshJwg7KGw7ZqMXG4gIGNvbnN0IGRpY3QgPSBkaWN0aW9uYXJpZXNbbG9jYWxlXTtcbiAgaWYgKGRpY3Q/LltrZXldICE9PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gZGljdFtrZXldIGFzIHVua25vd24gYXMgU0RSZXR1cm5UeXBlPEs+O1xuICB9XG5cbiAgLy8gMi4gZGVmYXVsdCBsb2NhbGXsl5DshJwg7KGw7ZqMXG4gIGlmIChsb2NhbGUgIT09IERFRkFVTFRfTE9DQUxFICYmIGRpY3Rpb25hcmllc1tERUZBVUxUX0xPQ0FMRV0/LltrZXldICE9PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gZGljdGlvbmFyaWVzW0RFRkFVTFRfTE9DQUxFXVtrZXldIGFzIHVua25vd24gYXMgU0RSZXR1cm5UeXBlPEs+O1xuICB9XG5cbiAgLy8gMy4gc3VwcG9ydGVkIGxvY2FsZXMg7Iic7ZqMXG4gIGZvciAoY29uc3Qgc3VwcG9ydGVkTG9jYWxlIG9mIFNVUFBPUlRFRF9MT0NBTEVTKSB7XG4gICAgaWYgKHN1cHBvcnRlZExvY2FsZSAhPT0gbG9jYWxlICYmIHN1cHBvcnRlZExvY2FsZSAhPT0gREVGQVVMVF9MT0NBTEUpIHtcbiAgICAgIGlmIChkaWN0aW9uYXJpZXNbc3VwcG9ydGVkTG9jYWxlXT8uW2tleV0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gZGljdGlvbmFyaWVzW3N1cHBvcnRlZExvY2FsZV1ba2V5XSBhcyB1bmtub3duIGFzIFNEUmV0dXJuVHlwZTxLPjtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvLyA0LiDrqqjrkZAg7Iuk7YyoIOyLnCBrZXkg67CY7ZmYXG4gIHJldHVybiBrZXkgYXMgdW5rbm93biBhcyBTRFJldHVyblR5cGU8Sz47XG59XG5cbi8qKlxuICogU29uYW11IERpY3Rpb25hcnkg7ZWo7IiYXG4gKiBsb2NhbGXsl5Ag66ee64qUIOuyiOyXrSDthY3siqTtirjrpbwg67CY7ZmY7ZWp64uI64ukLlxuICpcbiAqIEBleGFtcGxlXG4gKiBTRChcImNvbW1vbi5zYXZlXCIpICAvLyDihpIgXCLsoIDsnqVcIiAoTG9jYWxpemVkU3RyaW5nKVxuICogU0QoXCJ1c2VyLm5vdEZvdW5kXCIpKDEpICAvLyDihpIgXCLsobTsnqztlZjsp4Ag7JWK64qUIFVzZXIgSUQgMVwiIChMb2NhbGl6ZWRTdHJpbmcpXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBTRDxLIGV4dGVuZHMgRGljdEtleT4oa2V5OiBLKTogU0RSZXR1cm5UeXBlPEs+IHtcbiAgY29uc3QgbG9jYWxlID0gZ2V0Q3VycmVudExvY2FsZSgpO1xuICByZXR1cm4gZ2V0RGljdFZhbHVlKGtleSwgbG9jYWxlKTtcbn1cblxuLyoqXG4gKiDtirnsoJUgbG9jYWxl7J2YIOuyiOyXrSDthY3siqTtirjrpbwg67CY7ZmY7ZWY64qUIO2VqOyImOulvCDsg53shLHtlanri4jri6QuXG4gKlxuICogQGV4YW1wbGVcbiAqIGNvbnN0IEVOID0gU0QubG9jYWxlKFwiZW5cIik7XG4gKiBFTihcImNvbW1vbi5zYXZlXCIpICAvLyDihpIgXCJTYXZlXCJcbiAqL1xuU0QubG9jYWxlID0gKGxvY2FsZTogKHR5cGVvZiBTVVBQT1JURURfTE9DQUxFUylbbnVtYmVyXSkgPT4gPEsgZXh0ZW5kcyBEaWN0S2V5PihrZXk6IEspOiBTRFJldHVyblR5cGU8Sz4gPT4ge1xuICByZXR1cm4gZ2V0RGljdFZhbHVlKGtleSwgbG9jYWxlKTtcbn07XG5cbi8vIExvY2FsaXplZCDqsIDriqXtlZwgQ29sdW1uIO2DgOyehSDqs4TsgrBcbnR5cGUgTG9jYWxpemVkQmFzZUNvbHVtbjxUPiA9IHtcbiAgW0sgaW4ga2V5b2YgVCAmIHN0cmluZ106IEsgZXh0ZW5kcyBcXGBcXCR7aW5mZXIgQmFzZX1fXFwkeyh0eXBlb2YgU1VQUE9SVEVEX0xPQ0FMRVMpW251bWJlcl19XFxgID8gQmFzZSA6IEs7XG59W2tleW9mIFQgJiBzdHJpbmddO1xuXG4vKipcbiAqIGxvY2FsZeyXkCDrlLDrnbwg7KCB7KCI7ZWcIOy7rOufvCDqsJLsnYQg67CY7ZmY7ZWp64uI64ukLlxuICogRELsl5AgbmFtZSwgbmFtZV9rbywgbmFtZV9lbuyymOufvCBsb2NhbGl6ZWQgY29sdW1u7J20IOyeiOydhCDrlYwg7IKs7Jqp7ZWp64uI64ukLlxuICpcbiAqIOyasOyEoOyInOychCAo7KeA7JuQIOuhnOy8gOydvOydgCBrby9qcC9lbuydtOqzoCwg7ISc67mE7Iqk7J2YIOq4sOuzuCDroZzsvIDsnbzsnYAga28sIOyCrOyaqeyekOydmCDroZzsvIDsnbzsnYAganDsnbwg65WMKTogY29sdW1uX2pwIOKGkiBjb2x1bW4g4oaSIGNvbHVtbl9rbyDihpIgY29sdW1uX2VuXG4gKiDsmrDshKDsiJzsnIQgKOyngOybkCDroZzsvIDsnbzsnYAga28vanAvZW7snbTqs6AsIOyEnOu5hOyKpOydmCDquLDrs7gg66Gc7LyA7J287J2AIGVuLCDsgqzsmqnsnpDsnZgg66Gc7LyA7J287J2AIGtv7J28IOuVjCk6IGNvbHVtbl9rbyDihpIgY29sdW1uIOKGkiBjb2x1bW5fZW4g4oaSIGNvbHVtbl9qcFxuICpcbiAqIEBleGFtcGxlXG4gKiBsb2NhbGl6ZWRDb2x1bW4odGFnLCBcIm5hbWVcIilcbiAqL1xudHlwZSBMb2NhbGl6ZWRDb2x1bW5TY2FsYXJWYWx1ZSA9IHN0cmluZyB8IG51bWJlciB8IGJvb2xlYW4gfCBiaWdpbnQ7XG50eXBlIExvY2FsaXplZENvbHVtblZhbHVlID0gc3RyaW5nIHwgc3RyaW5nW107XG50eXBlIE5lc3RlZExvY2FsaXplZENvbHVtblZhbHVlRnJvbTxWPiA9IFYgZXh0ZW5kcyBzdHJpbmdcbiAgPyBzdHJpbmdcbiAgOiBWIGV4dGVuZHMgcmVhZG9ubHkgc3RyaW5nW11cbiAgICA/IHN0cmluZ1tdXG4gICAgOiBuZXZlcjtcbnR5cGUgTG9jYWxpemVkQ29sdW1uVmFsdWVGcm9tPFY+ID0gViBleHRlbmRzIHN0cmluZ1xuICA/IHN0cmluZ1xuICA6IFYgZXh0ZW5kcyByZWFkb25seSBzdHJpbmdbXVxuICAgID8gc3RyaW5nW11cbiAgICA6IFYgZXh0ZW5kcyBudW1iZXIgfCBib29sZWFuIHwgYmlnaW50XG4gICAgICA/IHN0cmluZ1xuICAgICAgOiBWIGV4dGVuZHMgUGFydGlhbDxSZWNvcmQ8KHR5cGVvZiBTVVBQT1JURURfTE9DQUxFUylbbnVtYmVyXSwgaW5mZXIgTFY+PlxuICAgICAgICA/IE5lc3RlZExvY2FsaXplZENvbHVtblZhbHVlRnJvbTxMVj5cbiAgICAgIDogbmV2ZXI7XG50eXBlIExvY2FsaXplZENvbHVtbkNhbmRpZGF0ZTxULCBLIGV4dGVuZHMgc3RyaW5nPiA9XG4gIHwgKEsgZXh0ZW5kcyBrZXlvZiBUID8gVFtLXSA6IG5ldmVyKVxuICB8IHtcbiAgICAgIFtMIGluICh0eXBlb2YgU1VQUE9SVEVEX0xPQ0FMRVMpW251bWJlcl1dOiBcXGBcXCR7S31fXFwke0x9XFxgIGV4dGVuZHMga2V5b2YgVCA/IFRbXFxgXFwke0t9X1xcJHtMfVxcYF0gOiBuZXZlcjtcbiAgICB9Wyh0eXBlb2YgU1VQUE9SVEVEX0xPQ0FMRVMpW251bWJlcl1dO1xudHlwZSBMb2NhbGl6ZWRDb2x1bW5SZXR1cm48VCwgSyBleHRlbmRzIHN0cmluZz4gPVxuICB8IExvY2FsaXplZENvbHVtblZhbHVlRnJvbTxMb2NhbGl6ZWRDb2x1bW5DYW5kaWRhdGU8VCwgSz4+XG4gIHwgdW5kZWZpbmVkO1xudHlwZSBMb2NhbGVWYWx1ZU1hcCA9IFBhcnRpYWw8UmVjb3JkPCh0eXBlb2YgU1VQUE9SVEVEX0xPQ0FMRVMpW251bWJlcl0sIHVua25vd24+PjtcblxuZnVuY3Rpb24gaXNMb2NhbGl6ZWRDb2x1bW5WYWx1ZSh2YWx1ZTogdW5rbm93bik6IHZhbHVlIGlzIExvY2FsaXplZENvbHVtblZhbHVlIHtcbiAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIiB8fCAoQXJyYXkuaXNBcnJheSh2YWx1ZSkgJiYgdmFsdWUuZXZlcnkoKGl0ZW0pID0+IHR5cGVvZiBpdGVtID09PSBcInN0cmluZ1wiKSk7XG59XG5cbmZ1bmN0aW9uIGlzTG9jYWxpemVkQ29sdW1uU2NhbGFyVmFsdWUodmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBMb2NhbGl6ZWRDb2x1bW5TY2FsYXJWYWx1ZSB7XG4gIHJldHVybiBbXCJzdHJpbmdcIiwgXCJudW1iZXJcIiwgXCJib29sZWFuXCIsIFwiYmlnaW50XCJdLmluY2x1ZGVzKHR5cGVvZiB2YWx1ZSk7XG59XG5cbmZ1bmN0aW9uIGlzRW1wdHlMb2NhbGl6ZWRDb2x1bW5WYWx1ZSh2YWx1ZTogdW5rbm93bik6IHZhbHVlIGlzIG51bGwgfCB1bmRlZmluZWQgfCBcIlwiIHtcbiAgcmV0dXJuIHZhbHVlID09PSBudWxsIHx8IHZhbHVlID09PSB1bmRlZmluZWQgfHwgdmFsdWUgPT09IFwiXCI7XG59XG5cbmZ1bmN0aW9uIGdldE5lc3RlZExvY2FsZVZhbHVlPFQgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiwgSyBleHRlbmRzIExvY2FsaXplZEJhc2VDb2x1bW48VD4+KFxuICByb3c6IFQsXG4gIGNvbHVtbjogSyxcbiAgbG9jYWxlOiAodHlwZW9mIFNVUFBPUlRFRF9MT0NBTEVTKVtudW1iZXJdLFxuKTogdW5rbm93biB7XG4gIGNvbnN0IGNvbHVtblZhbHVlID0gcm93W2NvbHVtbl07XG4gIGlmIChjb2x1bW5WYWx1ZSA9PT0gbnVsbCB8fCB0eXBlb2YgY29sdW1uVmFsdWUgIT09IFwib2JqZWN0XCIgfHwgQXJyYXkuaXNBcnJheShjb2x1bW5WYWx1ZSkpIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgcmV0dXJuIChjb2x1bW5WYWx1ZSBhcyBMb2NhbGVWYWx1ZU1hcClbbG9jYWxlXTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGxvY2FsaXplZENvbHVtbjxUIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4sIEsgZXh0ZW5kcyBMb2NhbGl6ZWRCYXNlQ29sdW1uPFQ+PihcbiAgcm93OiBULFxuICBjb2x1bW46IEssXG4pOiBMb2NhbGl6ZWRDb2x1bW5SZXR1cm48VCwgSz4ge1xuICBjb25zdCBjdXJyZW50TG9jYWxlID0gZ2V0Q3VycmVudExvY2FsZSgpO1xuICBjb25zdCBsb2NhbGUgPSBTVVBQT1JURURfTE9DQUxFUy5pbmNsdWRlcyhjdXJyZW50TG9jYWxlKSA/IGN1cnJlbnRMb2NhbGUgOiBERUZBVUxUX0xPQ0FMRTtcbiAgY29uc3Qgb3RoZXJMb2NhbGVzID0gU1VQUE9SVEVEX0xPQ0FMRVMuZmlsdGVyKChsOiBzdHJpbmcpID0+IGwgIT09IGxvY2FsZSAmJiBsICE9PSBERUZBVUxUX0xPQ0FMRSk7XG4gIGNvbnN0IGxvY2FsaXplZEtleSA9IChjb2x1bW46IEssIGxvY2FsZTogKHR5cGVvZiBTVVBQT1JURURfTE9DQUxFUylbbnVtYmVyXSkgPT4gXFxgXFwke2NvbHVtbn1fXFwke2xvY2FsZX1cXGA7XG4gIGNvbnN0IHZhbHVlcyA9IFtcbiAgICB7IHZhbHVlOiByb3dbbG9jYWxpemVkS2V5KGNvbHVtbiwgbG9jYWxlKV0sIHNvdXJjZTogXCJkaXJlY3RcIiB9LFxuICAgIHsgdmFsdWU6IGdldE5lc3RlZExvY2FsZVZhbHVlKHJvdywgY29sdW1uLCBsb2NhbGUpLCBzb3VyY2U6IFwibmVzdGVkXCIgfSxcbiAgICB7IHZhbHVlOiByb3dbY29sdW1uXSwgc291cmNlOiBcImRpcmVjdFwiIH0sXG4gICAgeyB2YWx1ZTogcm93W2xvY2FsaXplZEtleShjb2x1bW4sIERFRkFVTFRfTE9DQUxFKV0sIHNvdXJjZTogXCJkaXJlY3RcIiB9LFxuICAgIHsgdmFsdWU6IGdldE5lc3RlZExvY2FsZVZhbHVlKHJvdywgY29sdW1uLCBERUZBVUxUX0xPQ0FMRSksIHNvdXJjZTogXCJuZXN0ZWRcIiB9LFxuICAgIC4uLm90aGVyTG9jYWxlcy5mbGF0TWFwKChsKSA9PiBbXG4gICAgICB7IHZhbHVlOiByb3dbbG9jYWxpemVkS2V5KGNvbHVtbiwgbCldLCBzb3VyY2U6IFwiZGlyZWN0XCIgfSxcbiAgICAgIHsgdmFsdWU6IGdldE5lc3RlZExvY2FsZVZhbHVlKHJvdywgY29sdW1uLCBsKSwgc291cmNlOiBcIm5lc3RlZFwiIH0sXG4gICAgXSksXG4gIF07XG5cbiAgZm9yIChjb25zdCB7IHZhbHVlLCBzb3VyY2UgfSBvZiB2YWx1ZXMpIHtcbiAgICBpZiAoIWlzRW1wdHlMb2NhbGl6ZWRDb2x1bW5WYWx1ZSh2YWx1ZSkgJiYgaXNMb2NhbGl6ZWRDb2x1bW5WYWx1ZSh2YWx1ZSkpIHtcbiAgICAgIHJldHVybiB2YWx1ZSBhcyBMb2NhbGl6ZWRDb2x1bW5SZXR1cm48VCwgSz47XG4gICAgfVxuICAgIGlmIChzb3VyY2UgPT09IFwiZGlyZWN0XCIgJiYgIWlzRW1wdHlMb2NhbGl6ZWRDb2x1bW5WYWx1ZSh2YWx1ZSkgJiYgaXNMb2NhbGl6ZWRDb2x1bW5TY2FsYXJWYWx1ZSh2YWx1ZSkpIHtcbiAgICAgIHJldHVybiBTdHJpbmcodmFsdWUpIGFzIExvY2FsaXplZENvbHVtblJldHVybjxULCBLPjtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIEVudW3snZggbG9jYWxpemVkIGxhYmVsc+ulvCBQcm94eeuhnCDrsJjtmZjtlanri4jri6QuXG4gKiBTZWxlY3Qg7Lu07Y+s64SM7Yq4IOuTseyXkOyEnCBFbnVtTGFiZWxba2V5XSDrjIDsi6Ag7IKs7Jqp7ZWp64uI64ukLlxuICpcbiAqIEBleGFtcGxlXG4gKiBTRC5lbnVtTGFiZWxzKFwiVGFnT3JkZXJCeVwiKVtrZXldICAvLyDihpIg7ZiE7J6sIGxvY2FsZeydmCDrnbzrsqhcbiAqL1xuU0QuZW51bUxhYmVscyA9IChlbnVtTmFtZTogc3RyaW5nKTogUmVjb3JkPHN0cmluZywgTG9jYWxpemVkU3RyaW5nPiA9PiB7XG4gIHJldHVybiBuZXcgUHJveHkoe30gYXMgUmVjb3JkPHN0cmluZywgTG9jYWxpemVkU3RyaW5nPiwge1xuICAgIGdldChfLCBrZXk6IHN0cmluZyB8IHN5bWJvbCkge1xuICAgICAgaWYgKHR5cGVvZiBrZXkgPT09IFwic3ltYm9sXCIpIHtcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgIH1cblxuICAgICAgY29uc3QgZGljdEtleSA9IFxcYGVudW0uXFwke2VudW1OYW1lfS5cXCR7a2V5fVxcYCBhcyBEaWN0S2V5O1xuICAgICAgcmV0dXJuIGdldERpY3RWYWx1ZShkaWN0S2V5LCBnZXRDdXJyZW50TG9jYWxlKCkpO1xuICAgIH1cbiAgfSk7XG59O1xuYC50cmltKCk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgLi4udGhpcy5nZXRUYXJnZXRBbmRQYXRoKHVuZGVmaW5lZCwgdGFyZ2V0KSxcbiAgICAgIGJvZHksXG4gICAgICBpbXBvcnRLZXlzOiBbXSxcbiAgICAgIGN1c3RvbUhlYWRlcnM6IFtcIi8qKlwiLCBcIiAqIEBnZW5lcmF0ZWRcIiwgXCIgKiDsp4HsoJEg7IiY7KCV7ZWY7KeAIOuniOyEuOyalC5cIiwgXCIgKi9cIiwgXCJcIl0sXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiByZWFjdC1jb21wb25lbnRz7J2YIHJjLWtleXPrpbwg7LaU7Lac7ZWpXG4gICAqIHNvbmFtdS9zcmMvZGljdC9yYy1rZXlzLnRzIO2MjOydvOydmCDshozsiqQg7L2U65Oc66W8IOyngeygkSDsnb3slrTshJwg67CY7ZmYXG4gICAqL1xuICBwcml2YXRlIGV4dHJhY3RSQ0tleXNTb3VyY2VDb2RlKCk6IHsga286IHN0cmluZzsgZW46IHN0cmluZyB9IHtcbiAgICB0cnkge1xuICAgICAgLy8gcmMta2V5cy50cyDtjIzsnbwg6rK966GcXG4gICAgICBjb25zdCBfX2ZpbGVuYW1lID0gZmlsZVVSTFRvUGF0aChpbXBvcnQubWV0YS51cmwpO1xuICAgICAgY29uc3QgX19kaXJuYW1lID0gcGF0aC5kaXJuYW1lKF9fZmlsZW5hbWUpO1xuXG4gICAgICAvLyBkaXN07JeQ7IScIOyLpO2WieuQoCDrlYzripQgc3Jj66GcIOqyveuhnCDrs4Dqsr1cbiAgICAgIGNvbnN0IGJhc2VQYXRoID0gX19kaXJuYW1lLmluY2x1ZGVzKFwiL2Rpc3QvXCIpXG4gICAgICAgID8gX19kaXJuYW1lLnJlcGxhY2UoXCIvZGlzdC9cIiwgXCIvc3JjL1wiKVxuICAgICAgICA6IF9fZGlybmFtZTtcblxuICAgICAgY29uc3QgcmNLZXlzUGF0aCA9IHBhdGguam9pbihiYXNlUGF0aCwgXCIuLi8uLi9kaWN0L3JjLWtleXMudHNcIik7XG5cbiAgICAgIC8vIO2MjOydvCDsnb3quLBcbiAgICAgIGNvbnN0IHNvdXJjZUNvZGUgPSBmcy5yZWFkRmlsZVN5bmMocmNLZXlzUGF0aCwgXCJ1dGYtOFwiKTtcblxuICAgICAgLy8gcmNLZXlzS28g7LaU7LacICjspJHqtITtmLgg7Lm07Jq07YyFIOuwqeyLnSlcbiAgICAgIGNvbnN0IGtvQ29kZSA9IGV4dHJhY3RPYmplY3REZWNsYXJhdGlvbihzb3VyY2VDb2RlLCBcInJjS2V5c0tvXCIpO1xuXG4gICAgICAvLyByY0tleXNFbiDstpTstpwgKOykkeq0hO2YuCDsubTsmrTtjIUg67Cp7IudKVxuICAgICAgY29uc3QgZW5Db2RlID0gZXh0cmFjdE9iamVjdERlY2xhcmF0aW9uKHNvdXJjZUNvZGUsIFwicmNLZXlzRW5cIik7XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIGtvOiBrb0NvZGUucmVwbGFjZSgvXmV4cG9ydCAvLCBcIlwiKSxcbiAgICAgICAgZW46IGVuQ29kZS5yZXBsYWNlKC9eZXhwb3J0IC8sIFwiXCIpLnJlcGxhY2UoLyBzYXRpc2ZpZXMgUkNLZXlzLywgXCIgYXMgY29uc3RcIiksXG4gICAgICB9O1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAvLyByYy1rZXlzIO2MjOydvOydtCDsl4bripQg6rK97JqwIOu5iCDsvZTrk5wg67CY7ZmYXG4gICAgICBjb25zb2xlLndhcm4oXCJGYWlsZWQgdG8gbG9hZCByYy1rZXlzIHNvdXJjZTpcIiwgZXJyb3IpO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAga286IFwiY29uc3QgcmNLZXlzS28gPSB7fSBhcyBjb25zdDtcIixcbiAgICAgICAgZW46IFwiY29uc3QgcmNLZXlzRW4gPSB7fSBhcyBjb25zdDtcIixcbiAgICAgIH07XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIOuqqOuToCBlbnRpdHkuanNvbuyXkOyEnCBlbnRpdHkgbGFiZWxzIOy2lOy2nFxuICAgKiBlbnRpdHkuanNvbuyXkOyEnCDsp4HsoJEg6rSA66as65CY64qUIOqwkuunjCDtj6ztlaggKOyekOuPmSDsg53shLEg6rCSIOygnOyZuClcbiAgICogLSBlbnRpdHkue2VudGl0eUlkfTogZW50aXR5IHRpdGxlXG4gICAqIC0gZW50aXR5LntlbnRpdHlJZH0ue3Byb3BOYW1lfTogcHJvcCBkZXNjXG4gICAqIC0gZW51bS57RW51bUlkfS57dmFsdWV9OiBlbnVtIGxhYmVsXG4gICAqL1xuICBwcml2YXRlIGV4dHJhY3RFbnRpdHlMYWJlbHMoKTogeyBrZXk6IHN0cmluZzsgdmFsdWU6IHN0cmluZyB9W10ge1xuICAgIGNvbnN0IGxhYmVsczogeyBrZXk6IHN0cmluZzsgdmFsdWU6IHN0cmluZyB9W10gPSBbXTtcblxuICAgIGlmICghRW50aXR5TWFuYWdlci5pc0F1dG9sb2FkZWQpIHtcbiAgICAgIHJldHVybiBsYWJlbHM7XG4gICAgfVxuXG4gICAgY29uc3QgZW50aXR5SWRzID0gRW50aXR5TWFuYWdlci5nZXRBbGxJZHMoKTtcblxuICAgIGZvciAoY29uc3QgZW50aXR5SWQgb2YgZW50aXR5SWRzKSB7XG4gICAgICBjb25zdCBlbnRpdHkgPSBFbnRpdHlNYW5hZ2VyLmdldChlbnRpdHlJZCk7XG5cbiAgICAgIC8vIGVudGl0eSB0aXRsZSAoZW50aXR5Lmpzb27sl5DshJwg6rSA66asKVxuICAgICAgbGFiZWxzLnB1c2goeyBrZXk6IGBlbnRpdHkuJHtlbnRpdHlJZH1gLCB2YWx1ZTogZW50aXR5LnRpdGxlIH0pO1xuXG4gICAgICAvLyBwcm9wIGxhYmVscyAoZW50aXR5Lmpzb27sl5DshJwg6rSA66asKVxuICAgICAgZm9yIChjb25zdCBwcm9wIG9mIGVudGl0eS5wcm9wcykge1xuICAgICAgICBpZiAocHJvcC5kZXNjKSB7XG4gICAgICAgICAgbGFiZWxzLnB1c2goeyBrZXk6IGBlbnRpdHkuJHtlbnRpdHlJZH0uJHtwcm9wLm5hbWV9YCwgdmFsdWU6IHByb3AuZGVzYyB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBlbnVtIGxhYmVscyAoZW50aXR5Lmpzb27sl5DshJwg6rSA66asKVxuICAgICAgZm9yIChjb25zdCBbZW51bUlkLCBlbnVtTGFiZWxzTWFwXSBvZiBPYmplY3QuZW50cmllcyhlbnRpdHkuZW51bUxhYmVscykpIHtcbiAgICAgICAgZm9yIChjb25zdCBbdmFsdWUsIGxhYmVsXSBvZiBPYmplY3QuZW50cmllcyhlbnVtTGFiZWxzTWFwKSkge1xuICAgICAgICAgIGxhYmVscy5wdXNoKHsga2V5OiBgZW51bS4ke2VudW1JZH0uJHt2YWx1ZX1gLCB2YWx1ZTogbGFiZWwgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gbGFiZWxzO1xuICB9XG5cbiAgLyoqXG4gICAqIGVudGl0eUxhYmVsc+ulvCBUeXBlU2NyaXB0IOy9lOuTnOuhnCDrs4DtmZhcbiAgICovXG4gIHByaXZhdGUgZ2VuZXJhdGVFbnRpdHlMYWJlbHNDb2RlKGxhYmVsczogeyBrZXk6IHN0cmluZzsgdmFsdWU6IHN0cmluZyB9W10pOiBzdHJpbmcge1xuICAgIGlmIChsYWJlbHMubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gXCJjb25zdCBlbnRpdHlMYWJlbHMgPSB7fSBhcyBjb25zdDtcIjtcbiAgICB9XG5cbiAgICBjb25zdCBlbnRyaWVzID0gbGFiZWxzLm1hcCgoeyBrZXksIHZhbHVlIH0pID0+IGAgIFwiJHtrZXl9XCI6IFwiJHt0aGlzLmVzY2FwZVN0cmluZyh2YWx1ZSl9XCIsYCk7XG5cbiAgICByZXR1cm4gYGNvbnN0IGVudGl0eUxhYmVscyA9IHtcbiR7ZW50cmllcy5qb2luKFwiXFxuXCIpfVxufSBhcyBjb25zdDtgO1xuICB9XG5cbiAgcHJpdmF0ZSBlc2NhcGVTdHJpbmcoc3RyOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiBzdHIucmVwbGFjZSgvXFxcXC9nLCBcIlxcXFxcXFxcXCIpLnJlcGxhY2UoL1wiL2csICdcXFxcXCInKS5yZXBsYWNlKC9cXG4vZywgXCJcXFxcblwiKTtcbiAgfVxufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7OztZQUl5QztvQkFDa0I7YUFHTjtjQUNmOzs7OztBQU10QyxJQUFhLGVBQWIsY0FBa0MsU0FBUztDQUN6QyxjQUFjO0VBQ1osTUFBTSxJQUFJO0NBQ1o7Q0FFQSxpQkFBaUIsUUFBNEIsVUFBa0M7RUFDN0UsTUFBTSxTQUFTLFlBQVk7RUFJM0IsT0FBTztHQUNMLFFBQVEsR0FIRSxXQUFXLFFBQVEsT0FBTyxPQUFPLElBQUksTUFBTSxPQUd0QztHQUNmLE1BQU07RUFDUjtDQUNGO0NBRUEsT0FBTyxTQUFnQztFQUNyQyxNQUFNLEVBQUUsV0FBVztFQUduQixNQUFNLEVBQUUsZUFBZSxxQkFGSixPQUFPLE9BQU87RUFLakMsTUFBTSxlQUFlLEtBQUssb0JBQW9CO0VBRzlDLE1BQU0sbUJBQW1CLEtBQUssd0JBQXdCO0VBR3RELE1BQU0sdUJBQ0osV0FBVyxRQUNQOzs7MEJBR2dCLGNBQWM7NEJBQ1osS0FBSyxVQUFVLGdCQUFnQixFQUFFOzs7Ozs7Ozs7RUFTM0QsS0FBSyxJQUNHOzBCQUNnQixjQUFjO21DQUNMLEtBQUssVUFBVSxnQkFBZ0IsRUFBRTs7Ozs7Ozs7OztFQVVsRSxLQUFLO0VBR0gsTUFBTSxnQkFBZ0IsaUJBQ25CLEtBQUssV0FBVyxVQUFVLE9BQU8sV0FBVyxPQUFPLEdBQUcsQ0FBQyxDQUN2RCxLQUFLLElBQUk7RUFHWixNQUFNLG1CQUFtQixLQUFLLHlCQUF5QixZQUFZO0VBR25FLE1BQU0sb0JBQW9CLFdBQW1CO0dBRTNDLElBQUksV0FBVyxRQUFRLGlCQUFpQixTQUFTLElBQUksR0FBRyxPQUFPO0dBQy9ELElBQUksV0FBVyxRQUFRLGlCQUFpQixTQUFTLElBQUksR0FBRyxPQUFPO0dBRS9ELElBQUksV0FBVyxlQUNiLE9BQU8saUJBQWlCLGFBQWE7R0FHdkMsT0FBTztFQUNUO0VBRUEsTUFBTSxPQUFPO0VBQ2YscUJBQXFCOztFQUVyQixjQUFjOzs7RUFHZCxpQkFBaUIsU0FBUyxJQUFJLElBQUksaUJBQWlCLEtBQUssR0FBRzs7RUFFM0QsaUJBQWlCLFNBQVMsSUFBSSxJQUFJLGlCQUFpQixLQUFLLEdBQUc7OztFQUczRCxpQkFBaUI7Ozt1QkFHSSxpQkFBaUIsYUFBYSxFQUFFO2tDQUNyQixjQUFjOzs7Ozs7Ozs7Ozs7Ozs7Ozs7O0lBbUI1QyxjQUFjLFNBQVMsaUJBQWlCLGFBQWEsRUFBRSx3QkFBd0IsY0FBYztJQUM3RixpQkFDQyxRQUFRLFdBQVcsV0FBVyxhQUFhLENBQUMsQ0FDNUMsS0FBSyxXQUFXLEtBQUssT0FBTyxTQUFTLGlCQUFpQixNQUFNLEVBQUUsT0FBTyxPQUFPLElBQUksQ0FBQyxDQUNqRixLQUFLLElBQUksRUFBRTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7RUE2S2QsS0FBSztFQUVILE9BQU87R0FDTCxHQUFHLEtBQUssaUJBQWlCLFFBQVcsTUFBTTtHQUMxQztHQUNBLFlBQVksQ0FBQztHQUNiLGVBQWU7SUFBQztJQUFPO0lBQWlCO0lBQW1CO0lBQU87R0FBRTtFQUN0RTtDQUNGOzs7OztDQU1BLDBCQUE4RDtFQUM1RCxJQUFJO0dBRUYsTUFBTSxhQUFhLGNBQWMsT0FBTyxLQUFLLEdBQUc7R0FDaEQsTUFBTSxZQUFZLEtBQUssUUFBUSxVQUFVO0dBR3pDLE1BQU0sV0FBVyxVQUFVLFNBQVMsUUFBUSxJQUN4QyxVQUFVLFFBQVEsVUFBVSxPQUFPLElBQ25DO0dBRUosTUFBTSxhQUFhLEtBQUssS0FBSyxVQUFVLHVCQUF1QjtHQUc5RCxNQUFNLGFBQWEsR0FBRyxhQUFhLFlBQVksT0FBTztHQUd0RCxNQUFNLFNBQVMseUJBQXlCLFlBQVksVUFBVTtHQUc5RCxNQUFNLFNBQVMseUJBQXlCLFlBQVksVUFBVTtHQUU5RCxPQUFPO0lBQ0wsSUFBSSxPQUFPLFFBQVEsWUFBWSxFQUFFO0lBQ2pDLElBQUksT0FBTyxRQUFRLFlBQVksRUFBRSxDQUFDLENBQUMsUUFBUSxxQkFBcUIsV0FBVztHQUM3RTtFQUNGLFNBQVMsT0FBTztHQUVkLFFBQVEsS0FBSyxrQ0FBa0MsS0FBSztHQUNwRCxPQUFPO0lBQ0wsSUFBSTtJQUNKLElBQUk7R0FDTjtFQUNGO0NBQ0Y7Ozs7Ozs7O0NBU0Esc0JBQWdFO0VBQzlELE1BQU0sU0FBMkMsQ0FBQztFQUVsRCxJQUFJLENBQUMsY0FBYyxjQUNqQixPQUFPO0VBR1QsTUFBTSxZQUFZLGNBQWMsVUFBVTtFQUUxQyxLQUFLLE1BQU0sWUFBWSxXQUFXO0dBQ2hDLE1BQU0sU0FBUyxjQUFjLElBQUksUUFBUTtHQUd6QyxPQUFPLEtBQUs7SUFBRSxLQUFLLFVBQVU7SUFBWSxPQUFPLE9BQU87R0FBTSxDQUFDO0dBRzlELEtBQUssTUFBTSxRQUFRLE9BQU8sT0FDeEIsSUFBSSxLQUFLLE1BQ1AsT0FBTyxLQUFLO0lBQUUsS0FBSyxVQUFVLFNBQVMsR0FBRyxLQUFLO0lBQVEsT0FBTyxLQUFLO0dBQUssQ0FBQztHQUs1RSxLQUFLLE1BQU0sQ0FBQyxRQUFRLGtCQUFrQixPQUFPLFFBQVEsT0FBTyxVQUFVLEdBQ3BFLEtBQUssTUFBTSxDQUFDLE9BQU8sVUFBVSxPQUFPLFFBQVEsYUFBYSxHQUN2RCxPQUFPLEtBQUs7SUFBRSxLQUFLLFFBQVEsT0FBTyxHQUFHO0lBQVMsT0FBTztHQUFNLENBQUM7RUFHbEU7RUFFQSxPQUFPO0NBQ1Q7Ozs7Q0FLQSx5QkFBaUMsUUFBa0Q7RUFDakYsSUFBSSxPQUFPLFdBQVcsR0FDcEIsT0FBTztFQUtULE9BQU87RUFGUyxPQUFPLEtBQUssRUFBRSxLQUFLLFlBQVksTUFBTSxJQUFJLE1BQU0sS0FBSyxhQUFhLEtBQUssRUFBRSxHQUcxRixDQUFBLENBQVEsS0FBSyxJQUFJLEVBQUU7O0NBRW5CO0NBRUEsYUFBcUIsS0FBcUI7RUFDeEMsT0FBTyxJQUFJLFFBQVEsT0FBTyxNQUFNLENBQUMsQ0FBQyxRQUFRLE1BQU0sTUFBSyxDQUFDLENBQUMsUUFBUSxPQUFPLEtBQUs7Q0FDN0U7QUFDRiJ9
|
|
398
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2QudGVtcGxhdGUuanMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3RlbXBsYXRlL2ltcGxlbWVudGF0aW9ucy9zZC50ZW1wbGF0ZS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgZnMgZnJvbSBcIm5vZGU6ZnNcIjtcbmltcG9ydCBwYXRoIGZyb20gXCJub2RlOnBhdGhcIjtcbmltcG9ydCB7IGZpbGVVUkxUb1BhdGggfSBmcm9tIFwibm9kZTp1cmxcIjtcblxuaW1wb3J0IHsgU29uYW11IH0gZnJvbSBcIi4uLy4uL2FwaS9zb25hbXVcIjtcbmltcG9ydCB7IEVudGl0eU1hbmFnZXIgfSBmcm9tIFwiLi4vLi4vZW50aXR5L2VudGl0eS1tYW5hZ2VyXCI7XG5pbXBvcnQgeyB0eXBlIEVudGl0eU5hbWVzUmVjb3JkIH0gZnJvbSBcIi4uLy4uL2VudGl0eS9lbnRpdHktbWFuYWdlclwiO1xuaW1wb3J0IHsgdHlwZSBUZW1wbGF0ZU9wdGlvbnMgfSBmcm9tIFwiLi4vLi4vdHlwZXMvdHlwZXNcIjtcbmltcG9ydCB7IGV4dHJhY3RPYmplY3REZWNsYXJhdGlvbiB9IGZyb20gXCIuLi9oZWxwZXJzXCI7XG5pbXBvcnQgeyBUZW1wbGF0ZSB9IGZyb20gXCIuLi90ZW1wbGF0ZVwiO1xuXG4vKipcbiAqIFNvbmFtdSBEaWN0aW9uYXJ5IChTRCkg7YWc7ZSM66a/XG4gKiBpMThu7J2EIOychO2VnCBzZC5nZW5lcmF0ZWQudHMg7YyM7J287J2EIOyDneyEse2VqeuLiOuLpC5cbiAqL1xuZXhwb3J0IGNsYXNzIFRlbXBsYXRlX19zZCBleHRlbmRzIFRlbXBsYXRlIHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoXCJzZFwiKTtcbiAgfVxuXG4gIGdldFRhcmdldEFuZFBhdGgoX25hbWVzPzogRW50aXR5TmFtZXNSZWNvcmQsIHNkVGFyZ2V0PzogXCJhcGlcIiB8IFwid2ViXCIgfCBcImFwcFwiKSB7XG4gICAgY29uc3QgdGFyZ2V0ID0gc2RUYXJnZXQgPz8gXCJhcGlcIjtcbiAgICAvLyBhcGkuZGly7J2AIOyDgeuMgCDqsr3roZwoXCJhcGlcIinsnbTrr4DroZwsIHdlYi9hcHDrj4Qg7IOB64yAIOqyveuhnOuhnCDrp57stqRcbiAgICBjb25zdCBkaXIgPSB0YXJnZXQgPT09IFwiYXBpXCIgPyBTb25hbXUuY29uZmlnLmFwaS5kaXIgOiB0YXJnZXQ7XG5cbiAgICByZXR1cm4ge1xuICAgICAgdGFyZ2V0OiBgJHtkaXJ9L3NyYy9pMThuYCxcbiAgICAgIHBhdGg6IFwic2QuZ2VuZXJhdGVkLnRzXCIsXG4gICAgfTtcbiAgfVxuXG4gIHJlbmRlcihvcHRpb25zOiBUZW1wbGF0ZU9wdGlvbnNbXCJzZFwiXSkge1xuICAgIGNvbnN0IHsgdGFyZ2V0IH0gPSBvcHRpb25zO1xuICAgIGNvbnN0IGkxOG5Db25maWcgPSBTb25hbXUuY29uZmlnLmkxOG47XG5cbiAgICBjb25zdCB7IGRlZmF1bHRMb2NhbGUsIHN1cHBvcnRlZExvY2FsZXMgfSA9IGkxOG5Db25maWc7XG5cbiAgICAvLyBlbnRpdHkuanNvbuyXkOyEnCBlbnRpdHkgbGFiZWxzIOy2lOy2nFxuICAgIGNvbnN0IGVudGl0eUxhYmVscyA9IHRoaXMuZXh0cmFjdEVudGl0eUxhYmVscygpO1xuXG4gICAgLy8gcmMta2V5cyDshozsiqQg7L2U65OcIOy2lOy2nFxuICAgIGNvbnN0IHJjS2V5c1NvdXJjZUNvZGUgPSB0aGlzLmV4dHJhY3RSQ0tleXNTb3VyY2VDb2RlKCk7XG5cbiAgICAvLyDtlIzrnqvtj7zrs4QgbG9jYWxlIOq0gOumrCDsvZTrk5xcbiAgICBjb25zdCBsb2NhbGVNYW5hZ2VtZW50Q29kZSA9XG4gICAgICB0YXJnZXQgPT09IFwiYXBpXCJcbiAgICAgICAgPyBgXG5pbXBvcnQgeyBTb25hbXUgfSBmcm9tIFwic29uYW11XCI7XG5cbmNvbnN0IERFRkFVTFRfTE9DQUxFID0gXCIke2RlZmF1bHRMb2NhbGV9XCIgYXMgY29uc3Q7XG5jb25zdCBTVVBQT1JURURfTE9DQUxFUyA9ICR7SlNPTi5zdHJpbmdpZnkoc3VwcG9ydGVkTG9jYWxlcyl9IGFzIGNvbnN0O1xuZnVuY3Rpb24gZ2V0Q3VycmVudExvY2FsZSgpOiAodHlwZW9mIFNVUFBPUlRFRF9MT0NBTEVTKVtudW1iZXJdIHtcbiAgdHJ5IHtcbiAgICBjb25zdCBjdHggPSBTb25hbXUuZ2V0Q29udGV4dCgpO1xuICAgIGNvbnN0IGxvY2FsZSA9IGN0eC5sb2NhbGU7XG4gICAgcmV0dXJuIFNVUFBPUlRFRF9MT0NBTEVTLmZpbmQoKHN1cHBvcnRlZExvY2FsZSkgPT4gc3VwcG9ydGVkTG9jYWxlID09PSBsb2NhbGUpID8/IERFRkFVTFRfTE9DQUxFO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gREVGQVVMVF9MT0NBTEU7XG4gIH1cbn1cbmAudHJpbSgpXG4gICAgICAgIDogYFxuY29uc3QgREVGQVVMVF9MT0NBTEUgPSBcIiR7ZGVmYXVsdExvY2FsZX1cIiBhcyBjb25zdDtcbmV4cG9ydCBjb25zdCBTVVBQT1JURURfTE9DQUxFUyA9ICR7SlNPTi5zdHJpbmdpZnkoc3VwcG9ydGVkTG9jYWxlcyl9IGFzIGNvbnN0O1xubGV0IGN1cnJlbnRMb2NhbGU6ICh0eXBlb2YgU1VQUE9SVEVEX0xPQ0FMRVMpW251bWJlcl0gPSBERUZBVUxUX0xPQ0FMRTtcblxuZXhwb3J0IGZ1bmN0aW9uIHNldExvY2FsZShsb2NhbGU6ICh0eXBlb2YgU1VQUE9SVEVEX0xPQ0FMRVMpW251bWJlcl0pIHtcbiAgY3VycmVudExvY2FsZSA9IGxvY2FsZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldEN1cnJlbnRMb2NhbGUoKTogKHR5cGVvZiBTVVBQT1JURURfTE9DQUxFUylbbnVtYmVyXSB7XG4gIHJldHVybiBjdXJyZW50TG9jYWxlO1xufVxuYC50cmltKCk7XG5cbiAgICAvLyBsb2NhbGUgaW1wb3J0XG4gICAgY29uc3QgbG9jYWxlSW1wb3J0cyA9IHN1cHBvcnRlZExvY2FsZXNcbiAgICAgIC5tYXAoKGxvY2FsZSkgPT4gYGltcG9ydCAke2xvY2FsZX0gZnJvbSBcIi4vJHtsb2NhbGV9XCI7YClcbiAgICAgIC5qb2luKFwiXFxuXCIpO1xuXG4gICAgLy8gZW50aXR5TGFiZWxz66W8IOy9lOuTnOuhnCDrs4DtmZhcbiAgICBjb25zdCBlbnRpdHlMYWJlbHNDb2RlID0gdGhpcy5nZW5lcmF0ZUVudGl0eUxhYmVsc0NvZGUoZW50aXR5TGFiZWxzKTtcblxuICAgIC8vIGxvY2FsZeuzhCByY0tleXMg67OA7IiY66qFIOunpO2VkVxuICAgIGNvbnN0IGdldFJDS2V5c1Zhck5hbWUgPSAobG9jYWxlOiBzdHJpbmcpID0+IHtcbiAgICAgIC8vIHN1cHBvcnRlZExvY2FsZXPsl5Ag7Y+s7ZWo65CcIGxvY2FsZeunjCDtlbTri7kg67OA7IiYIOuwmO2ZmFxuICAgICAgaWYgKGxvY2FsZSA9PT0gXCJrb1wiICYmIHN1cHBvcnRlZExvY2FsZXMuaW5jbHVkZXMoXCJrb1wiKSkgcmV0dXJuIFwicmNLZXlzS29cIjtcbiAgICAgIGlmIChsb2NhbGUgPT09IFwiZW5cIiAmJiBzdXBwb3J0ZWRMb2NhbGVzLmluY2x1ZGVzKFwiZW5cIikpIHJldHVybiBcInJjS2V5c0VuXCI7XG4gICAgICAvLyBmYWxsYmFjazogZGVmYXVsdExvY2FsZeydmCByY0tleXNcbiAgICAgIGlmIChsb2NhbGUgIT09IGRlZmF1bHRMb2NhbGUpIHtcbiAgICAgICAgcmV0dXJuIGdldFJDS2V5c1Zhck5hbWUoZGVmYXVsdExvY2FsZSk7XG4gICAgICB9XG4gICAgICAvLyBkZWZhdWx0TG9jYWxl7KGw7LCoIOyXhuuKlCDqsr3smrAgZW7snYQgZmFsbGJhY2vsnLzroZwg7IKs7JqpXG4gICAgICByZXR1cm4gXCJyY0tleXNFblwiO1xuICAgIH07XG5cbiAgICBjb25zdCBib2R5ID0gYFxuJHtsb2NhbGVNYW5hZ2VtZW50Q29kZX1cblxuJHtsb2NhbGVJbXBvcnRzfVxuXG4vLyByZWFjdC1jb21wb25lbnRzIGkxOG4ga2V5c1xuJHtzdXBwb3J0ZWRMb2NhbGVzLmluY2x1ZGVzKFwia29cIikgPyByY0tleXNTb3VyY2VDb2RlLmtvIDogXCJcIn1cblxuJHtzdXBwb3J0ZWRMb2NhbGVzLmluY2x1ZGVzKFwiZW5cIikgPyByY0tleXNTb3VyY2VDb2RlLmVuIDogXCJcIn1cblxuLy8gZW50aXR5Lmpzb27sl5DshJwg7LaU7Lac7ZWcIGVudGl0eSBsYWJlbHMgKGRlZmF1bHRMb2NhbGUg7KCE7JqpKVxuJHtlbnRpdHlMYWJlbHNDb2RlfVxuXG4vLyBkZWZhdWx0TG9jYWxl7J2YIGRpY3Rpb25hcnnrpbwg6riw7KSA7Jy866GcIO2CpCDstpTstpxcbnR5cGUgUkNLZXlzID0gdHlwZW9mICR7Z2V0UkNLZXlzVmFyTmFtZShkZWZhdWx0TG9jYWxlKX07XG50eXBlIFByb2plY3REaWN0aW9uYXJ5ID0gdHlwZW9mICR7ZGVmYXVsdExvY2FsZX07XG50eXBlIEVudGl0eUxhYmVscyA9IHR5cGVvZiBlbnRpdHlMYWJlbHM7XG50eXBlIFJhd01lcmdlZERpY3Rpb25hcnkgPSBSQ0tleXMgJiBPbWl0PEVudGl0eUxhYmVscywga2V5b2YgKFJDS2V5cyAmIFByb2plY3REaWN0aW9uYXJ5KT4gJiBQcm9qZWN0RGljdGlvbmFyeTtcblxuLy8g7YKk64qUIOycoOyngO2VmOuQmCwg6rCSIO2DgOyeheydgCBzdHJpbmcg65iQ64qUIO2VqOyImOuhnCDsnbzrsJjtmZQgKOuLpOuluCBsb2NhbGXsnZgg66as7YSw65+0IO2DgOyehSDstqnrj4wg67Cp7KeAKVxuZXhwb3J0IHR5cGUgTWVyZ2VkRGljdGlvbmFyeSA9IHtcbiAgW0sgaW4ga2V5b2YgUmF3TWVyZ2VkRGljdGlvbmFyeV06IFJhd01lcmdlZERpY3Rpb25hcnlbS10gZXh0ZW5kcyAoLi4uYXJnczogaW5mZXIgUCkgPT4gc3RyaW5nXG4gICAgPyAoLi4uYXJnczogUCkgPT4gc3RyaW5nXG4gICAgOiBzdHJpbmc7XG59O1xuZXhwb3J0IHR5cGUgRGljdEtleSA9IGtleW9mIE1lcmdlZERpY3Rpb25hcnk7XG5leHBvcnQgdHlwZSBMb2NhbGl6ZWRTdHJpbmcgPSBzdHJpbmcgJiB7IF9fYnJhbmQ6IFwiTG9jYWxpemVkU3RyaW5nXCIgfTtcblxuZXhwb3J0IGZ1bmN0aW9uIGRlZmluZUxvY2FsZShkaWN0OiBQYXJ0aWFsPE1lcmdlZERpY3Rpb25hcnk+KSB7XG4gIHJldHVybiBkaWN0O1xufVxuXG4vLyDqsIEgbG9jYWxl67OE66GcIHJjLWtleXMgKyBlbnRpdHkgbGFiZWxzICsg7ZSE66Gc7KCd7Yq4IGRpY3Qg7ZWp7LmoXG50eXBlIERpY3Rpb25hcnlSZWdpc3RyeSA9IHtcbiAgW0wgaW4gKHR5cGVvZiBTVVBQT1JURURfTE9DQUxFUylbbnVtYmVyXV06IFBhcnRpYWw8TWVyZ2VkRGljdGlvbmFyeT47XG59O1xuY29uc3QgZGljdGlvbmFyaWVzOiBEaWN0aW9uYXJ5UmVnaXN0cnkgPSB7XG4gICR7ZGVmYXVsdExvY2FsZX06IHsgLi4uJHtnZXRSQ0tleXNWYXJOYW1lKGRlZmF1bHRMb2NhbGUpfSwgLi4uZW50aXR5TGFiZWxzLCAuLi4ke2RlZmF1bHRMb2NhbGV9IH0sXG4gICR7c3VwcG9ydGVkTG9jYWxlc1xuICAgIC5maWx0ZXIoKGxvY2FsZSkgPT4gbG9jYWxlICE9PSBkZWZhdWx0TG9jYWxlKVxuICAgIC5tYXAoKGxvY2FsZSkgPT4gYCAgJHtsb2NhbGV9OiB7IC4uLiR7Z2V0UkNLZXlzVmFyTmFtZShsb2NhbGUpfSwgLi4uJHtsb2NhbGV9IH0sYClcbiAgICAuam9pbihcIlxcblwiKX1cbn07XG5cbnR5cGUgU0RSZXR1cm5UeXBlPEsgZXh0ZW5kcyBEaWN0S2V5PiA9IE1lcmdlZERpY3Rpb25hcnlbS10gZXh0ZW5kcyAoLi4uYXJnczogaW5mZXIgUCkgPT4gc3RyaW5nXG4gID8gKC4uLmFyZ3M6IFApID0+IExvY2FsaXplZFN0cmluZ1xuICA6IExvY2FsaXplZFN0cmluZztcblxuZnVuY3Rpb24gZ2V0RGljdFZhbHVlPEsgZXh0ZW5kcyBEaWN0S2V5PihrZXk6IEssIGxvY2FsZTogKHR5cGVvZiBTVVBQT1JURURfTE9DQUxFUylbbnVtYmVyXSk6IFNEUmV0dXJuVHlwZTxLPiB7XG4gIC8vIDEuIOyngOygleuQnCBsb2NhbGXsl5DshJwg7KGw7ZqMXG4gIGNvbnN0IGRpY3QgPSBkaWN0aW9uYXJpZXNbbG9jYWxlXTtcbiAgaWYgKGRpY3Q/LltrZXldICE9PSB1bmRlZmluZWQpIHtcbiAgICAvLyBTQUZFVFk6IOyalOyyrSBsb2NhbGXsnZgg6rCZ7J2AIO2CpOuKlCBNZXJnZWREaWN0aW9uYXJ56rCAIOygle2VnCDrsJjtmZgg7KKF66WY66W8IOycoOyngO2VqeuLiOuLpC5cbiAgICByZXR1cm4gZGljdFtrZXldIGFzIFNEUmV0dXJuVHlwZTxLPjtcbiAgfVxuXG4gIC8vIDIuIGRlZmF1bHQgbG9jYWxl7JeQ7IScIOyhsO2ajFxuICBpZiAobG9jYWxlICE9PSBERUZBVUxUX0xPQ0FMRSAmJiBkaWN0aW9uYXJpZXNbREVGQVVMVF9MT0NBTEVdPy5ba2V5XSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgLy8gU0FGRVRZOiDquLDrs7ggbG9jYWxl7J2YIOqwmeydgCDtgqTripQgTWVyZ2VkRGljdGlvbmFyeeqwgCDsoJXtlZwg67CY7ZmYIOyiheulmOulvCDsnKDsp4Dtlanri4jri6QuXG4gICAgcmV0dXJuIGRpY3Rpb25hcmllc1tERUZBVUxUX0xPQ0FMRV1ba2V5XSBhcyBTRFJldHVyblR5cGU8Sz47XG4gIH1cblxuICAvLyAzLiBzdXBwb3J0ZWQgbG9jYWxlcyDsiJztmoxcbiAgZm9yIChjb25zdCBzdXBwb3J0ZWRMb2NhbGUgb2YgU1VQUE9SVEVEX0xPQ0FMRVMpIHtcbiAgICBpZiAoc3VwcG9ydGVkTG9jYWxlICE9PSBsb2NhbGUgJiYgc3VwcG9ydGVkTG9jYWxlICE9PSBERUZBVUxUX0xPQ0FMRSkge1xuICAgICAgaWYgKGRpY3Rpb25hcmllc1tzdXBwb3J0ZWRMb2NhbGVdPy5ba2V5XSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIC8vIFNBRkVUWTog64yA7LK0IGxvY2FsZeydmCDqsJnsnYAg7YKk64qUIE1lcmdlZERpY3Rpb25hcnnqsIAg7KCV7ZWcIOuwmO2ZmCDsooXrpZjrpbwg7Jyg7KeA7ZWp64uI64ukLlxuICAgICAgICByZXR1cm4gZGljdGlvbmFyaWVzW3N1cHBvcnRlZExvY2FsZV1ba2V5XSBhcyBTRFJldHVyblR5cGU8Sz47XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLy8g66qo65OgIGxvY2FsZeyXkCDqsJLsnbQg7JeG7Jy866m0IOuPmeyggeycvOuhnCDsobDtlanrkJwg7YKk66W8IOq3uOuMgOuhnCDrhbjstpztlanri4jri6QuXG4gIC8vIFNBRkVUWTog64iE652965CcIOyCrOyghCDtgqTsnZgg66y47J6Q7Je0IO2RnO2YhOydgCBMb2NhbGl6ZWRTdHJpbmcgZmFsbGJhY2sg6rec7JW97J2EIOuUsOumheuLiOuLpC5cbiAgcmV0dXJuIFN0cmluZyhrZXkpIGFzIFNEUmV0dXJuVHlwZTxLPjtcbn1cblxuLyoqXG4gKiBTb25hbXUgRGljdGlvbmFyeSDtlajsiJhcbiAqIGxvY2FsZeyXkCDrp57ripQg67KI7JetIO2FjeyKpO2KuOulvCDrsJjtmZjtlanri4jri6QuXG4gKlxuICogQGV4YW1wbGVcbiAqIFNEKFwiY29tbW9uLnNhdmVcIikgIC8vIOKGkiBcIuyggOyepVwiIChMb2NhbGl6ZWRTdHJpbmcpXG4gKiBTRChcInVzZXIubm90Rm91bmRcIikoMSkgIC8vIOKGkiBcIuyhtOyerO2VmOyngCDslYrripQgVXNlciBJRCAxXCIgKExvY2FsaXplZFN0cmluZylcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIFNEPEsgZXh0ZW5kcyBEaWN0S2V5PihrZXk6IEspOiBTRFJldHVyblR5cGU8Sz4ge1xuICBjb25zdCBsb2NhbGUgPSBnZXRDdXJyZW50TG9jYWxlKCk7XG4gIHJldHVybiBnZXREaWN0VmFsdWUoa2V5LCBsb2NhbGUpO1xufVxuXG4vKipcbiAqIO2KueyglSBsb2NhbGXsnZgg67KI7JetIO2FjeyKpO2KuOulvCDrsJjtmZjtlZjripQg7ZWo7IiY66W8IOyDneyEse2VqeuLiOuLpC5cbiAqXG4gKiBAZXhhbXBsZVxuICogY29uc3QgRU4gPSBTRC5sb2NhbGUoXCJlblwiKTtcbiAqIEVOKFwiY29tbW9uLnNhdmVcIikgIC8vIOKGkiBcIlNhdmVcIlxuICovXG5TRC5sb2NhbGUgPSAobG9jYWxlOiAodHlwZW9mIFNVUFBPUlRFRF9MT0NBTEVTKVtudW1iZXJdKSA9PiA8SyBleHRlbmRzIERpY3RLZXk+KGtleTogSyk6IFNEUmV0dXJuVHlwZTxLPiA9PiB7XG4gIHJldHVybiBnZXREaWN0VmFsdWUoa2V5LCBsb2NhbGUpO1xufTtcblxuLy8gTG9jYWxpemVkIOqwgOuKpe2VnCBDb2x1bW4g7YOA7J6FIOqzhOyCsFxudHlwZSBMb2NhbGl6ZWRCYXNlQ29sdW1uPFQ+ID0ge1xuICBbSyBpbiBrZXlvZiBUICYgc3RyaW5nXTogSyBleHRlbmRzIFxcYFxcJHtpbmZlciBCYXNlfV9cXCR7KHR5cGVvZiBTVVBQT1JURURfTE9DQUxFUylbbnVtYmVyXX1cXGAgPyBCYXNlIDogSztcbn1ba2V5b2YgVCAmIHN0cmluZ107XG5cbi8qKlxuICogbG9jYWxl7JeQIOuUsOudvCDsoIHsoIjtlZwg7Lus65+8IOqwkuydhCDrsJjtmZjtlanri4jri6QuXG4gKiBEQuyXkCBuYW1lLCBuYW1lX2tvLCBuYW1lX2Vu7LKY65+8IGxvY2FsaXplZCBjb2x1bW7snbQg7J6I7J2EIOuVjCDsgqzsmqntlanri4jri6QuXG4gKlxuICog7Jqw7ISg7Iic7JyEICjsp4Dsm5Ag66Gc7LyA7J287J2AIGtvL2pwL2Vu7J206rOgLCDshJzruYTsiqTsnZgg6riw67O4IOuhnOy8gOydvOydgCBrbywg7IKs7Jqp7J6Q7J2YIOuhnOy8gOydvOydgCBqcOydvCDrlYwpOiBjb2x1bW5fanAg4oaSIGNvbHVtbiDihpIgY29sdW1uX2tvIOKGkiBjb2x1bW5fZW5cbiAqIOyasOyEoOyInOychCAo7KeA7JuQIOuhnOy8gOydvOydgCBrby9qcC9lbuydtOqzoCwg7ISc67mE7Iqk7J2YIOq4sOuzuCDroZzsvIDsnbzsnYAgZW4sIOyCrOyaqeyekOydmCDroZzsvIDsnbzsnYAga2/snbwg65WMKTogY29sdW1uX2tvIOKGkiBjb2x1bW4g4oaSIGNvbHVtbl9lbiDihpIgY29sdW1uX2pwXG4gKlxuICogQGV4YW1wbGVcbiAqIGxvY2FsaXplZENvbHVtbih0YWcsIFwibmFtZVwiKVxuICovXG50eXBlIExvY2FsaXplZENvbHVtblNjYWxhclZhbHVlID0gc3RyaW5nIHwgbnVtYmVyIHwgYm9vbGVhbiB8IGJpZ2ludDtcbnR5cGUgTG9jYWxpemVkQ29sdW1uVmFsdWUgPSBzdHJpbmcgfCBzdHJpbmdbXTtcbnR5cGUgTmVzdGVkTG9jYWxpemVkQ29sdW1uVmFsdWVGcm9tPFY+ID0gViBleHRlbmRzIHN0cmluZ1xuICA/IHN0cmluZ1xuICA6IFYgZXh0ZW5kcyByZWFkb25seSBzdHJpbmdbXVxuICAgID8gc3RyaW5nW11cbiAgICA6IG5ldmVyO1xudHlwZSBMb2NhbGl6ZWRDb2x1bW5WYWx1ZUZyb208Vj4gPSBWIGV4dGVuZHMgc3RyaW5nXG4gID8gc3RyaW5nXG4gIDogViBleHRlbmRzIHJlYWRvbmx5IHN0cmluZ1tdXG4gICAgPyBzdHJpbmdbXVxuICAgIDogViBleHRlbmRzIG51bWJlciB8IGJvb2xlYW4gfCBiaWdpbnRcbiAgICAgID8gc3RyaW5nXG4gICAgICA6IFYgZXh0ZW5kcyBQYXJ0aWFsPFJlY29yZDwodHlwZW9mIFNVUFBPUlRFRF9MT0NBTEVTKVtudW1iZXJdLCBpbmZlciBMVj4+XG4gICAgICAgID8gTmVzdGVkTG9jYWxpemVkQ29sdW1uVmFsdWVGcm9tPExWPlxuICAgICAgOiBuZXZlcjtcbnR5cGUgTG9jYWxpemVkQ29sdW1uQ2FuZGlkYXRlPFQsIEsgZXh0ZW5kcyBzdHJpbmc+ID1cbiAgfCAoSyBleHRlbmRzIGtleW9mIFQgPyBUW0tdIDogbmV2ZXIpXG4gIHwge1xuICAgICAgW0wgaW4gKHR5cGVvZiBTVVBQT1JURURfTE9DQUxFUylbbnVtYmVyXV06IFxcYFxcJHtLfV9cXCR7TH1cXGAgZXh0ZW5kcyBrZXlvZiBUID8gVFtcXGBcXCR7S31fXFwke0x9XFxgXSA6IG5ldmVyO1xuICAgIH1bKHR5cGVvZiBTVVBQT1JURURfTE9DQUxFUylbbnVtYmVyXV07XG50eXBlIExvY2FsaXplZENvbHVtblJldHVybjxULCBLIGV4dGVuZHMgc3RyaW5nPiA9XG4gIHwgTG9jYWxpemVkQ29sdW1uVmFsdWVGcm9tPExvY2FsaXplZENvbHVtbkNhbmRpZGF0ZTxULCBLPj5cbiAgfCB1bmRlZmluZWQ7XG50eXBlIExvY2FsZVZhbHVlTWFwID0ge1xuICBbTCBpbiAodHlwZW9mIFNVUFBPUlRFRF9MT0NBTEVTKVtudW1iZXJdXT86IExvY2FsaXplZENvbHVtblZhbHVlO1xufTtcbmZ1bmN0aW9uIGlzU3RyaW5nPFY+KHZhbHVlOiBWKTogdmFsdWUgaXMgViAmIHN0cmluZyB7XG4gIHJldHVybiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodmFsdWUpID09PSBcIltvYmplY3QgU3RyaW5nXVwiO1xufVxuXG5mdW5jdGlvbiBpc0xvY2FsaXplZENvbHVtblZhbHVlPFY+KHZhbHVlOiBWKTogdmFsdWUgaXMgViAmIExvY2FsaXplZENvbHVtblZhbHVlIHtcbiAgcmV0dXJuIGlzU3RyaW5nKHZhbHVlKSB8fCAoQXJyYXkuaXNBcnJheSh2YWx1ZSkgJiYgdmFsdWUuZXZlcnkoaXNTdHJpbmcpKTtcbn1cblxuZnVuY3Rpb24gaXNMb2NhbGl6ZWRDb2x1bW5TY2FsYXJWYWx1ZTxWPih2YWx1ZTogVik6IHZhbHVlIGlzIFYgJiBMb2NhbGl6ZWRDb2x1bW5TY2FsYXJWYWx1ZSB7XG4gIHJldHVybiBbXCJbb2JqZWN0IFN0cmluZ11cIiwgXCJbb2JqZWN0IE51bWJlcl1cIiwgXCJbb2JqZWN0IEJvb2xlYW5dXCIsIFwiW29iamVjdCBCaWdJbnRdXCJdLmluY2x1ZGVzKFxuICAgIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh2YWx1ZSksXG4gICk7XG59XG5cbmZ1bmN0aW9uIGlzRW1wdHlMb2NhbGl6ZWRDb2x1bW5WYWx1ZTxWPih2YWx1ZTogVik6IHZhbHVlIGlzIFYgJiAobnVsbCB8IHVuZGVmaW5lZCB8IFwiXCIpIHtcbiAgcmV0dXJuIHZhbHVlID09PSBudWxsIHx8IHZhbHVlID09PSB1bmRlZmluZWQgfHwgdmFsdWUgPT09IFwiXCI7XG59XG5cbnR5cGUgUHJvcGVydHlWYWx1ZTxULCBLIGV4dGVuZHMgUHJvcGVydHlLZXk+ID0gSyBleHRlbmRzIGtleW9mIFQgPyBUW0tdIDogdW5kZWZpbmVkO1xuXG5mdW5jdGlvbiBnZXRQcm9wZXJ0eTxUIGV4dGVuZHMgb2JqZWN0LCBLIGV4dGVuZHMgUHJvcGVydHlLZXk+KHJvdzogVCwga2V5OiBLKTogUHJvcGVydHlWYWx1ZTxULCBLPiB7XG4gIGlmICghKGtleSBpbiByb3cpKSB7XG4gICAgLy8gU0FGRVRZOiDsobTsnqztlZjsp4Ag7JWK64qUIO2bhOuztCDtgqTripQg7KGw6rG067aAIOyGjeyEsSDtg4DsnoXsl5DshJzrj4QgdW5kZWZpbmVk7J6F64uI64ukLlxuICAgIHJldHVybiB1bmRlZmluZWQgYXMgUHJvcGVydHlWYWx1ZTxULCBLPjtcbiAgfVxuXG4gIC8vIFNBRkVUWTogb3duL2luaGVyaXRlZCDtgqQg7KG07J6s66W8IO2ZleyduO2WiOycvOuvgOuhnCDtlbTri7kg7YKk7J2YIOyhsOqxtOu2gCDsho3shLEg7YOA7J6F7Jy866GcIOyige2ekCDsiJgg7J6I7Iq164uI64ukLlxuICByZXR1cm4gKHJvdyBhcyBUICYgUmVjb3JkPEssIFByb3BlcnR5VmFsdWU8VCwgSz4+KVtrZXldO1xufVxuXG5mdW5jdGlvbiBnZXROZXN0ZWRMb2NhbGVWYWx1ZTxUIGV4dGVuZHMgb2JqZWN0LCBLIGV4dGVuZHMgTG9jYWxpemVkQmFzZUNvbHVtbjxUPj4oXG4gIHJvdzogVCxcbiAgY29sdW1uOiBLLFxuICBsb2NhbGU6ICh0eXBlb2YgU1VQUE9SVEVEX0xPQ0FMRVMpW251bWJlcl0sXG4pOiBMb2NhbGl6ZWRDb2x1bW5WYWx1ZSB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IGNvbHVtblZhbHVlID0gZ2V0UHJvcGVydHkocm93LCBjb2x1bW4pO1xuICBpZiAoY29sdW1uVmFsdWUgPT09IG51bGwgfHwgT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGNvbHVtblZhbHVlKSAhPT0gXCJbb2JqZWN0IE9iamVjdF1cIikge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICAvLyBTQUZFVFk6IOydvOuwmCDqsJ3ssrQg6rKA7IKs66W8IO2GteqzvO2VnCDqsJLrp4wgbG9jYWxl67OEIOqwkiDrp7XsnLzroZwg7KGw7ZqM7ZWp64uI64ukLlxuICByZXR1cm4gKGNvbHVtblZhbHVlIGFzIExvY2FsZVZhbHVlTWFwKVtsb2NhbGVdO1xufVxuXG5mdW5jdGlvbiBsb2NhbGl6ZWRLZXk8SyBleHRlbmRzIHN0cmluZz4oY29sdW1uTmFtZTogSywgbG9jYWxlTmFtZTogKHR5cGVvZiBTVVBQT1JURURfTE9DQUxFUylbbnVtYmVyXSkge1xuICByZXR1cm4gXFxgXFwke2NvbHVtbk5hbWV9X1xcJHtsb2NhbGVOYW1lfVxcYDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGxvY2FsaXplZENvbHVtbjxUIGV4dGVuZHMgb2JqZWN0LCBLIGV4dGVuZHMgTG9jYWxpemVkQmFzZUNvbHVtbjxUPj4oXG4gIHJvdzogVCxcbiAgY29sdW1uOiBLLFxuKTogTG9jYWxpemVkQ29sdW1uUmV0dXJuPFQsIEs+IHtcbiAgY29uc3QgcmVxdWVzdGVkTG9jYWxlID0gZ2V0Q3VycmVudExvY2FsZSgpO1xuICBjb25zdCBsb2NhbGUgPSBTVVBQT1JURURfTE9DQUxFUy5pbmNsdWRlcyhyZXF1ZXN0ZWRMb2NhbGUpID8gcmVxdWVzdGVkTG9jYWxlIDogREVGQVVMVF9MT0NBTEU7XG4gIGNvbnN0IG90aGVyTG9jYWxlcyA9IFNVUFBPUlRFRF9MT0NBTEVTLmZpbHRlcihcbiAgICAoY2FuZGlkYXRlTG9jYWxlKSA9PiBjYW5kaWRhdGVMb2NhbGUgIT09IGxvY2FsZSAmJiBjYW5kaWRhdGVMb2NhbGUgIT09IERFRkFVTFRfTE9DQUxFLFxuICApO1xuICBjb25zdCB2YWx1ZXMgPSBbXG4gICAgeyB2YWx1ZTogZ2V0UHJvcGVydHkocm93LCBsb2NhbGl6ZWRLZXkoY29sdW1uLCBsb2NhbGUpKSwgc291cmNlOiBcImRpcmVjdFwiIH0sXG4gICAgeyB2YWx1ZTogZ2V0TmVzdGVkTG9jYWxlVmFsdWUocm93LCBjb2x1bW4sIGxvY2FsZSksIHNvdXJjZTogXCJuZXN0ZWRcIiB9LFxuICAgIHsgdmFsdWU6IGdldFByb3BlcnR5KHJvdywgY29sdW1uKSwgc291cmNlOiBcImRpcmVjdFwiIH0sXG4gICAgeyB2YWx1ZTogZ2V0UHJvcGVydHkocm93LCBsb2NhbGl6ZWRLZXkoY29sdW1uLCBERUZBVUxUX0xPQ0FMRSkpLCBzb3VyY2U6IFwiZGlyZWN0XCIgfSxcbiAgICB7IHZhbHVlOiBnZXROZXN0ZWRMb2NhbGVWYWx1ZShyb3csIGNvbHVtbiwgREVGQVVMVF9MT0NBTEUpLCBzb3VyY2U6IFwibmVzdGVkXCIgfSxcbiAgICAuLi5vdGhlckxvY2FsZXMuZmxhdE1hcCgobCkgPT4gW1xuICAgICAgeyB2YWx1ZTogZ2V0UHJvcGVydHkocm93LCBsb2NhbGl6ZWRLZXkoY29sdW1uLCBsKSksIHNvdXJjZTogXCJkaXJlY3RcIiB9LFxuICAgICAgeyB2YWx1ZTogZ2V0TmVzdGVkTG9jYWxlVmFsdWUocm93LCBjb2x1bW4sIGwpLCBzb3VyY2U6IFwibmVzdGVkXCIgfSxcbiAgICBdKSxcbiAgXTtcblxuICBmb3IgKGNvbnN0IHsgdmFsdWUsIHNvdXJjZSB9IG9mIHZhbHVlcykge1xuICAgIGlmICghaXNFbXB0eUxvY2FsaXplZENvbHVtblZhbHVlKHZhbHVlKSAmJiBpc0xvY2FsaXplZENvbHVtblZhbHVlKHZhbHVlKSkge1xuICAgICAgLy8gU0FGRVRZOiDqsJIg6rCA65Oc6rCAIOyEoO2Dne2VnCDsu6zrn7zsnZgg66y47J6Q7Je0IOuYkOuKlCDrrLjsnpDsl7Qg67Cw7Je07J6E7J2EIO2ZleyduO2WiOyKteuLiOuLpC5cbiAgICAgIHJldHVybiB2YWx1ZSBhcyBMb2NhbGl6ZWRDb2x1bW5SZXR1cm48VCwgSz47XG4gICAgfVxuICAgIGlmIChzb3VyY2UgPT09IFwiZGlyZWN0XCIgJiYgIWlzRW1wdHlMb2NhbGl6ZWRDb2x1bW5WYWx1ZSh2YWx1ZSkgJiYgaXNMb2NhbGl6ZWRDb2x1bW5TY2FsYXJWYWx1ZSh2YWx1ZSkpIHtcbiAgICAgIC8vIFNBRkVUWTog7KeB7KCRIOy7rOufvOydmCDsiqTsubzrnbwg6rCS7J2AIOusuOyekOyXtOuhnCDrs4DtmZjtlbQg7KeA7Jet7ZmUIOuwmO2ZmCDtg4DsnoXsnYQg7Lap7KGx7ZWp64uI64ukLlxuICAgICAgcmV0dXJuIFN0cmluZyh2YWx1ZSkgYXMgTG9jYWxpemVkQ29sdW1uUmV0dXJuPFQsIEs+O1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogRW51beydmCBsb2NhbGl6ZWQgbGFiZWxz66W8IFByb3h566GcIOuwmO2ZmO2VqeuLiOuLpC5cbiAqIFNlbGVjdCDsu7Ttj6zrhIztirgg65Ox7JeQ7IScIEVudW1MYWJlbFtrZXldIOuMgOyLoCDsgqzsmqntlanri4jri6QuXG4gKlxuICogQGV4YW1wbGVcbiAqIFNELmVudW1MYWJlbHMoXCJUYWdPcmRlckJ5XCIpW2tleV0gIC8vIOKGkiDtmITsnqwgbG9jYWxl7J2YIOudvOuyqFxuICovXG5pbnRlcmZhY2UgRW51bUxhYmVscyB7XG4gIFtrZXk6IHN0cmluZ106IExvY2FsaXplZFN0cmluZztcbn1cblxuU0QuZW51bUxhYmVscyA9IChlbnVtTmFtZTogc3RyaW5nKTogRW51bUxhYmVscyA9PiB7XG4gIHJldHVybiBuZXcgUHJveHk8RW51bUxhYmVscz4oe30sIHtcbiAgICBnZXQoXywga2V5OiBzdHJpbmcgfCBzeW1ib2wpIHtcbiAgICAgIGlmIChPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoa2V5KSA9PT0gXCJbb2JqZWN0IFN5bWJvbF1cIikge1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgfVxuXG4gICAgICAvLyBTQUZFVFk6IOyDneyEseuQnCBlbnVtIOydtOumhOqzvCDqsJLsnZgg7KGw7ZWp7J2AIGVudW0g7IKs7KCEIO2CpCDtmJXsi53snYQg65Sw66aF64uI64ukLlxuICAgICAgY29uc3QgZGljdEtleSA9IFxcYGVudW0uXFwke2VudW1OYW1lfS5cXCR7U3RyaW5nKGtleSl9XFxgIGFzIERpY3RLZXk7XG4gICAgICByZXR1cm4gZ2V0RGljdFZhbHVlKGRpY3RLZXksIGdldEN1cnJlbnRMb2NhbGUoKSk7XG4gICAgfVxuICB9KTtcbn07XG5gLnRyaW0oKTtcblxuICAgIHJldHVybiB7XG4gICAgICAuLi50aGlzLmdldFRhcmdldEFuZFBhdGgodW5kZWZpbmVkLCB0YXJnZXQpLFxuICAgICAgYm9keSxcbiAgICAgIGltcG9ydEtleXM6IFtdLFxuICAgICAgY3VzdG9tSGVhZGVyczogW1wiLyoqXCIsIFwiICogQGdlbmVyYXRlZFwiLCBcIiAqIOyngeygkSDsiJjsoJXtlZjsp4Ag66eI7IS47JqULlwiLCBcIiAqL1wiLCBcIlwiXSxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIHJlYWN0LWNvbXBvbmVudHPsnZggcmMta2V5c+ulvCDstpTstpztlalcbiAgICogc29uYW11L3NyYy9kaWN0L3JjLWtleXMudHMg7YyM7J287J2YIOyGjOyKpCDsvZTrk5zrpbwg7KeB7KCRIOydveyWtOyEnCDrsJjtmZhcbiAgICovXG4gIHByaXZhdGUgZXh0cmFjdFJDS2V5c1NvdXJjZUNvZGUoKSB7XG4gICAgdHJ5IHtcbiAgICAgIC8vIHJjLWtleXMudHMg7YyM7J28IOqyveuhnFxuICAgICAgY29uc3QgY3VycmVudEZpbGVuYW1lID0gZmlsZVVSTFRvUGF0aChpbXBvcnQubWV0YS51cmwpO1xuICAgICAgY29uc3QgY3VycmVudERpcmVjdG9yeSA9IHBhdGguZGlybmFtZShjdXJyZW50RmlsZW5hbWUpO1xuXG4gICAgICAvLyBkaXN07JeQ7IScIOyLpO2WieuQoCDrlYzripQgc3Jj66GcIOqyveuhnCDrs4Dqsr1cbiAgICAgIGNvbnN0IGJhc2VQYXRoID0gY3VycmVudERpcmVjdG9yeS5pbmNsdWRlcyhcIi9kaXN0L1wiKVxuICAgICAgICA/IGN1cnJlbnREaXJlY3RvcnkucmVwbGFjZShcIi9kaXN0L1wiLCBcIi9zcmMvXCIpXG4gICAgICAgIDogY3VycmVudERpcmVjdG9yeTtcblxuICAgICAgY29uc3QgcmNLZXlzUGF0aCA9IHBhdGguam9pbihiYXNlUGF0aCwgXCIuLi8uLi9kaWN0L3JjLWtleXMudHNcIik7XG5cbiAgICAgIC8vIO2MjOydvCDsnb3quLBcbiAgICAgIGNvbnN0IHNvdXJjZUNvZGUgPSBmcy5yZWFkRmlsZVN5bmMocmNLZXlzUGF0aCwgXCJ1dGYtOFwiKTtcblxuICAgICAgLy8gcmNLZXlzS28g7LaU7LacICjspJHqtITtmLgg7Lm07Jq07YyFIOuwqeyLnSlcbiAgICAgIGNvbnN0IGtvQ29kZSA9IGV4dHJhY3RPYmplY3REZWNsYXJhdGlvbihzb3VyY2VDb2RlLCBcInJjS2V5c0tvXCIpO1xuXG4gICAgICAvLyByY0tleXNFbiDstpTstpwgKOykkeq0hO2YuCDsubTsmrTtjIUg67Cp7IudKVxuICAgICAgY29uc3QgZW5Db2RlID0gZXh0cmFjdE9iamVjdERlY2xhcmF0aW9uKHNvdXJjZUNvZGUsIFwicmNLZXlzRW5cIik7XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIGtvOiBrb0NvZGUucmVwbGFjZSgvXmV4cG9ydCAvLCBcIlwiKSxcbiAgICAgICAgZW46IGVuQ29kZS5yZXBsYWNlKC9eZXhwb3J0IC8sIFwiXCIpLnJlcGxhY2UoLyBzYXRpc2ZpZXMgUkNLZXlzLywgXCIgYXMgY29uc3RcIiksXG4gICAgICB9O1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAvLyByYy1rZXlzIO2MjOydvOydtCDsl4bripQg6rK97JqwIOu5iCDsvZTrk5wg67CY7ZmYXG4gICAgICBjb25zb2xlLndhcm4oXCJGYWlsZWQgdG8gbG9hZCByYy1rZXlzIHNvdXJjZTpcIiwgZXJyb3IpO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAga286IFwiY29uc3QgcmNLZXlzS28gPSB7fSBhcyBjb25zdDtcIixcbiAgICAgICAgZW46IFwiY29uc3QgcmNLZXlzRW4gPSB7fSBhcyBjb25zdDtcIixcbiAgICAgIH07XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIOuqqOuToCBlbnRpdHkuanNvbuyXkOyEnCBlbnRpdHkgbGFiZWxzIOy2lOy2nFxuICAgKiBlbnRpdHkuanNvbuyXkOyEnCDsp4HsoJEg6rSA66as65CY64qUIOqwkuunjCDtj6ztlaggKOyekOuPmSDsg53shLEg6rCSIOygnOyZuClcbiAgICogLSBlbnRpdHkue2VudGl0eUlkfTogZW50aXR5IHRpdGxlXG4gICAqIC0gZW50aXR5LntlbnRpdHlJZH0ue3Byb3BOYW1lfTogcHJvcCBkZXNjXG4gICAqIC0gZW51bS57RW51bUlkfS57dmFsdWV9OiBlbnVtIGxhYmVsXG4gICAqL1xuICBwcml2YXRlIGV4dHJhY3RFbnRpdHlMYWJlbHMoKTogeyBrZXk6IHN0cmluZzsgdmFsdWU6IHN0cmluZyB9W10ge1xuICAgIGNvbnN0IGxhYmVsczogeyBrZXk6IHN0cmluZzsgdmFsdWU6IHN0cmluZyB9W10gPSBbXTtcblxuICAgIGlmICghRW50aXR5TWFuYWdlci5pc0F1dG9sb2FkZWQpIHtcbiAgICAgIHJldHVybiBsYWJlbHM7XG4gICAgfVxuXG4gICAgY29uc3QgZW50aXR5SWRzID0gRW50aXR5TWFuYWdlci5nZXRBbGxJZHMoKTtcblxuICAgIGZvciAoY29uc3QgZW50aXR5SWQgb2YgZW50aXR5SWRzKSB7XG4gICAgICBjb25zdCBlbnRpdHkgPSBFbnRpdHlNYW5hZ2VyLmdldChlbnRpdHlJZCk7XG5cbiAgICAgIC8vIGVudGl0eSB0aXRsZSAoZW50aXR5Lmpzb27sl5DshJwg6rSA66asKVxuICAgICAgbGFiZWxzLnB1c2goeyBrZXk6IGBlbnRpdHkuJHtlbnRpdHlJZH1gLCB2YWx1ZTogZW50aXR5LnRpdGxlIH0pO1xuXG4gICAgICAvLyBwcm9wIGxhYmVscyAoZW50aXR5Lmpzb27sl5DshJwg6rSA66asKVxuICAgICAgZm9yIChjb25zdCBwcm9wIG9mIGVudGl0eS5wcm9wcykge1xuICAgICAgICBpZiAocHJvcC5kZXNjKSB7XG4gICAgICAgICAgbGFiZWxzLnB1c2goeyBrZXk6IGBlbnRpdHkuJHtlbnRpdHlJZH0uJHtwcm9wLm5hbWV9YCwgdmFsdWU6IHByb3AuZGVzYyB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBlbnVtIGxhYmVscyAoZW50aXR5Lmpzb27sl5DshJwg6rSA66asKVxuICAgICAgZm9yIChjb25zdCBbZW51bUlkLCBlbnVtTGFiZWxzTWFwXSBvZiBPYmplY3QuZW50cmllcyhlbnRpdHkuZW51bUxhYmVscykpIHtcbiAgICAgICAgZm9yIChjb25zdCBbdmFsdWUsIGxhYmVsXSBvZiBPYmplY3QuZW50cmllcyhlbnVtTGFiZWxzTWFwKSkge1xuICAgICAgICAgIGxhYmVscy5wdXNoKHsga2V5OiBgZW51bS4ke2VudW1JZH0uJHt2YWx1ZX1gLCB2YWx1ZTogbGFiZWwgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gbGFiZWxzO1xuICB9XG5cbiAgLyoqXG4gICAqIGVudGl0eUxhYmVsc+ulvCBUeXBlU2NyaXB0IOy9lOuTnOuhnCDrs4DtmZhcbiAgICovXG4gIHByaXZhdGUgZ2VuZXJhdGVFbnRpdHlMYWJlbHNDb2RlKGxhYmVsczogeyBrZXk6IHN0cmluZzsgdmFsdWU6IHN0cmluZyB9W10pOiBzdHJpbmcge1xuICAgIGlmIChsYWJlbHMubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gXCJjb25zdCBlbnRpdHlMYWJlbHMgPSB7fSBhcyBjb25zdDtcIjtcbiAgICB9XG5cbiAgICBjb25zdCBlbnRyaWVzID0gbGFiZWxzLm1hcCgoeyBrZXksIHZhbHVlIH0pID0+IGAgIFwiJHtrZXl9XCI6IFwiJHt0aGlzLmVzY2FwZVN0cmluZyh2YWx1ZSl9XCIsYCk7XG5cbiAgICByZXR1cm4gYGNvbnN0IGVudGl0eUxhYmVscyA9IHtcbiR7ZW50cmllcy5qb2luKFwiXFxuXCIpfVxufSBhcyBjb25zdDtgO1xuICB9XG5cbiAgcHJpdmF0ZSBlc2NhcGVTdHJpbmcoc3RyOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiBzdHIucmVwbGFjZSgvXFxcXC9nLCBcIlxcXFxcXFxcXCIpLnJlcGxhY2UoL1wiL2csICdcXFxcXCInKS5yZXBsYWNlKC9cXG4vZywgXCJcXFxcblwiKTtcbiAgfVxufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7OztZQUl5QztvQkFDa0I7YUFHTjtjQUNmOzs7OztBQU10QyxJQUFhLGVBQWIsY0FBa0MsU0FBUztDQUN6QyxjQUFjO0VBQ1osTUFBTSxJQUFJO0NBQ1o7Q0FFQSxpQkFBaUIsUUFBNEIsVUFBa0M7RUFDN0UsTUFBTSxTQUFTLFlBQVk7RUFJM0IsT0FBTztHQUNMLFFBQVEsR0FIRSxXQUFXLFFBQVEsT0FBTyxPQUFPLElBQUksTUFBTSxPQUd0QztHQUNmLE1BQU07RUFDUjtDQUNGO0NBRUEsT0FBTyxTQUFnQztFQUNyQyxNQUFNLEVBQUUsV0FBVztFQUduQixNQUFNLEVBQUUsZUFBZSxxQkFGSixPQUFPLE9BQU87RUFLakMsTUFBTSxlQUFlLEtBQUssb0JBQW9CO0VBRzlDLE1BQU0sbUJBQW1CLEtBQUssd0JBQXdCO0VBR3RELE1BQU0sdUJBQ0osV0FBVyxRQUNQOzs7MEJBR2dCLGNBQWM7NEJBQ1osS0FBSyxVQUFVLGdCQUFnQixFQUFFOzs7Ozs7Ozs7O0VBVTNELEtBQUssSUFDRzswQkFDZ0IsY0FBYzttQ0FDTCxLQUFLLFVBQVUsZ0JBQWdCLEVBQUU7Ozs7Ozs7Ozs7RUFVbEUsS0FBSztFQUdILE1BQU0sZ0JBQWdCLGlCQUNuQixLQUFLLFdBQVcsVUFBVSxPQUFPLFdBQVcsT0FBTyxHQUFHLENBQUMsQ0FDdkQsS0FBSyxJQUFJO0VBR1osTUFBTSxtQkFBbUIsS0FBSyx5QkFBeUIsWUFBWTtFQUduRSxNQUFNLG9CQUFvQixXQUFtQjtHQUUzQyxJQUFJLFdBQVcsUUFBUSxpQkFBaUIs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
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"services.template.d.ts","sourceRoot":"","sources":["../../../src/template/implementations/services.template.ts"],"names":[],"mappings":"AAWA,OAAO,EAAE,KAAK,eAAe,EAAE,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"services.template.d.ts","sourceRoot":"","sources":["../../../src/template/implementations/services.template.ts"],"names":[],"mappings":"AAWA,OAAO,EAAE,KAAK,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAIzD,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAGvC,qBAAa,kBAAmB,SAAQ,QAAQ;;IAK9C,gBAAgB;;;;IAOhB,MAAM,CAAC,EAAE,EAAE,eAAe,CAAC,UAAU,CAAC;;;;;;;CAudvC"}
|
|
@@ -1,8 +1,9 @@
|
|
|
1
|
+
import { init_runtime_value, isStringValue } from "../../utils/runtime-value.js";
|
|
1
2
|
import { assertDefined, init_utils } from "../../utils/utils.js";
|
|
2
|
-
import { Sonamu, init_sonamu } from "../../api/sonamu.js";
|
|
3
3
|
import { ApiParamType, init_types } from "../../types/types.js";
|
|
4
|
-
import { EntityManager, init_entity_manager } from "../../entity/entity-manager.js";
|
|
5
4
|
import { apiParamToTsCode, apiParamTypeToTsType, init_code_converters, unwrapPromiseOnce } from "../../api/code-converters.js";
|
|
5
|
+
import { Sonamu, init_sonamu } from "../../api/sonamu.js";
|
|
6
|
+
import { EntityManager, init_entity_manager } from "../../entity/entity-manager.js";
|
|
6
7
|
import { Template, init_template } from "../template.js";
|
|
7
8
|
import { BUILT_IN_TYPES, init_zod_converter, zodTypeToTsTypeDef } from "../zod-converter.js";
|
|
8
9
|
import inflection from "inflection";
|
|
@@ -12,6 +13,7 @@ init_code_converters();
|
|
|
12
13
|
init_sonamu();
|
|
13
14
|
init_entity_manager();
|
|
14
15
|
init_types();
|
|
16
|
+
init_runtime_value();
|
|
15
17
|
init_utils();
|
|
16
18
|
init_template();
|
|
17
19
|
init_zod_converter();
|
|
@@ -101,7 +103,7 @@ export function ${methodNameWebSocketCamelized}(
|
|
|
101
103
|
if (clients.includes("axios-multipart")) {
|
|
102
104
|
const formDataAppend = `files.forEach(f => { formData.append("files", f); });`;
|
|
103
105
|
const otherParamsAppend = paramsWithoutContext.map((param) => {
|
|
104
|
-
if (
|
|
106
|
+
if (isStringValue(param.type) && [
|
|
105
107
|
"string",
|
|
106
108
|
"number",
|
|
107
109
|
"boolean"
|
|
@@ -300,4 +302,4 @@ export const ${names.capital}AsyncIdConfig: AsyncIdConfig<${names.capital}Subset
|
|
|
300
302
|
//#endregion
|
|
301
303
|
export { Template__services };
|
|
302
304
|
|
|
303
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VydmljZXMudGVtcGxhdGUuanMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3RlbXBsYXRlL2ltcGxlbWVudGF0aW9ucy9zZXJ2aWNlcy50ZW1wbGF0ZS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgaW5mbGVjdGlvbiBmcm9tIFwiaW5mbGVjdGlvblwiO1xuaW1wb3J0IHsgZGlmZiwgdW5pcXVlIH0gZnJvbSBcInJhZGFzaGlcIjtcblxuaW1wb3J0IHtcbiAgYXBpUGFyYW1Ub1RzQ29kZSxcbiAgYXBpUGFyYW1UeXBlVG9Uc1R5cGUsXG4gIHVud3JhcFByb21pc2VPbmNlLFxufSBmcm9tIFwiLi4vLi4vYXBpL2NvZGUtY29udmVydGVyc1wiO1xuaW1wb3J0IHsgdHlwZSBFeHRlbmRlZEFwaSB9IGZyb20gXCIuLi8uLi9hcGkvZGVjb3JhdG9yc1wiO1xuaW1wb3J0IHsgU29uYW11IH0gZnJvbSBcIi4uLy4uL2FwaS9zb25hbXVcIjtcbmltcG9ydCB7IEVudGl0eU1hbmFnZXIgfSBmcm9tIFwiLi4vLi4vZW50aXR5L2VudGl0eS1tYW5hZ2VyXCI7XG5pbXBvcnQgeyB0eXBlIFRlbXBsYXRlT3B0aW9ucyB9IGZyb20gXCIuLi8uLi90eXBlcy90eXBlc1wiO1xuaW1wb3J0IHsgQXBpUGFyYW1UeXBlIH0gZnJvbSBcIi4uLy4uL3R5cGVzL3R5cGVzXCI7XG5pbXBvcnQgeyBhc3NlcnREZWZpbmVkIH0gZnJvbSBcIi4uLy4uL3V0aWxzL3V0aWxzXCI7XG5pbXBvcnQgeyBUZW1wbGF0ZSB9IGZyb20gXCIuLi90ZW1wbGF0ZVwiO1xuaW1wb3J0IHsgQlVJTFRfSU5fVFlQRVMsIHpvZFR5cGVUb1RzVHlwZURlZiB9IGZyb20gXCIuLi96b2QtY29udmVydGVyXCI7XG5cbmV4cG9ydCBjbGFzcyBUZW1wbGF0ZV9fc2VydmljZXMgZXh0ZW5kcyBUZW1wbGF0ZSB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKFwic2VydmljZXNcIik7XG4gIH1cblxuICBnZXRUYXJnZXRBbmRQYXRoKCkge1xuICAgIHJldHVybiB7XG4gICAgICB0YXJnZXQ6IFwiOnRhcmdldC9zcmMvc2VydmljZXNcIixcbiAgICAgIHBhdGg6IGBzZXJ2aWNlcy5nZW5lcmF0ZWQudHNgLFxuICAgIH07XG4gIH1cblxuICByZW5kZXIoe306IFRlbXBsYXRlT3B0aW9uc1tcInNlcnZpY2VzXCJdKSB7XG4gICAgY29uc3QgeyBhcGlzIH0gPSBTb25hbXUuc3luY2VyO1xuXG4gICAgLy8g66qo642467OE66GcIOq3uOujue2ZlFxuICAgIGNvbnN0IGFwaXNCeU1vZGVsID0gbmV3IE1hcDxzdHJpbmcsIEV4dGVuZGVkQXBpW10+KCk7XG4gICAgZm9yIChjb25zdCBhcGkgb2YgYXBpcykge1xuICAgICAgY29uc3QgbW9kZWxOYW1lID0gYXBpLm1vZGVsTmFtZS5yZXBsYWNlKC9Nb2RlbCQvLCBcIlwiKS5yZXBsYWNlKC9GcmFtZSQvLCBcIlwiKTtcbiAgICAgIGlmICghYXBpc0J5TW9kZWwuaGFzKG1vZGVsTmFtZSkpIHtcbiAgICAgICAgYXBpc0J5TW9kZWwuc2V0KG1vZGVsTmFtZSwgW10pO1xuICAgICAgfVxuICAgICAgYXBpc0J5TW9kZWwuZ2V0KG1vZGVsTmFtZSk/LnB1c2goYXBpKTtcbiAgICB9XG5cbiAgICBjb25zdCBpbXBvcnRLZXlzOiBzdHJpbmdbXSA9IFtdO1xuICAgIGNvbnN0IG5hbWVzcGFjZXM6IHN0cmluZ1tdID0gW107XG4gICAgbGV0IHR5cGVQYXJhbU5hbWVzOiBzdHJpbmdbXSA9IFtdO1xuICAgIGNvbnN0IHJlc29sdmVXZWJTb2NrZXRFdmVudFR5cGVEZWYgPSAoXG4gICAgICB0eXBlUmVmOiBBcGlQYXJhbVR5cGUuUmVmIHwgdW5kZWZpbmVkLFxuICAgICAgc2NoZW1hOiBQYXJhbWV0ZXJzPHR5cGVvZiB6b2RUeXBlVG9Uc1R5cGVEZWY+WzBdLFxuICAgICk6IHN0cmluZyA9PiB7XG4gICAgICBpZiAodHlwZVJlZikge1xuICAgICAgICBjb25zdCBjYW5kaWRhdGVJbXBvcnRLZXlzOiBzdHJpbmdbXSA9IFtdO1xuICAgICAgICBjb25zdCBjYW5kaWRhdGVUeXBlRGVmID0gYXBpUGFyYW1UeXBlVG9Uc1R5cGUodHlwZVJlZiwgY2FuZGlkYXRlSW1wb3J0S2V5cyk7XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBmb3IgKGNvbnN0IGtleSBvZiB1bmlxdWUoY2FuZGlkYXRlSW1wb3J0S2V5cykpIHtcbiAgICAgICAgICAgIEVudGl0eU1hbmFnZXIuZ2V0TW9kdWxlUGF0aChrZXkpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpbXBvcnRLZXlzLnB1c2goLi4uY2FuZGlkYXRlSW1wb3J0S2V5cyk7XG4gICAgICAgICAgcmV0dXJuIGNhbmRpZGF0ZVR5cGVEZWY7XG4gICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgIC8vIOuhnOy7rCBjb25zdCDrk7EgaW1wb3J0IOqwgOuKpe2VnCDsi6zrs7zsnbQg7JWE64uI66m0IOq4sOyhtCBpbmxpbmUg7IOd7ISx7Jy866GcIO2bhO2HtFxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB6b2RUeXBlVG9Uc1R5cGVEZWYoc2NoZW1hKTtcbiAgICB9O1xuXG4gICAgZm9yIChjb25zdCBbbW9kZWxOYW1lLCBtb2RlbEFwaXNdIG9mIGFwaXNCeU1vZGVsKSB7XG4gICAgICBjb25zdCBmdW5jdGlvbnM6IHN0cmluZ1tdID0gW107XG5cbiAgICAgIGZvciAoY29uc3QgYXBpIG9mIG1vZGVsQXBpcykge1xuICAgICAgICAvLyBAc3RyZWFtIOuNsOy9lOugiOydtO2EsOqwgCDsnojsnLzrqbQgU1NFIOyKpO2KuOumvCDtlajsiJgg7IOd7ISxXG4gICAgICAgIGlmIChhcGkuc3RyZWFtT3B0aW9ucykge1xuICAgICAgICAgIGNvbnN0IHBhcmFtc1dpdGhvdXRDb250ZXh0ID0gYXBpLnBhcmFtZXRlcnMuZmlsdGVyKFxuICAgICAgICAgICAgKHBhcmFtKSA9PlxuICAgICAgICAgICAgICAhQXBpUGFyYW1UeXBlLmlzQ29udGV4dChwYXJhbS50eXBlKSAmJlxuICAgICAgICAgICAgICAhQXBpUGFyYW1UeXBlLmlzUmVmS25leChwYXJhbS50eXBlKSAmJlxuICAgICAgICAgICAgICAhKHBhcmFtLm9wdGlvbmFsICYmIHBhcmFtLm5hbWUuc3RhcnRzV2l0aChcIl9cIikpLFxuICAgICAgICAgICk7XG5cbiAgICAgICAgICBjb25zdCBhcGlCYXNlVXJsID0gYCR7U29uYW11LmNvbmZpZy5hcGkucm91dGUucHJlZml4fSR7YXBpLnBhdGh9YDtcblxuICAgICAgICAgIGNvbnN0IG1ldGhvZE5hbWVTdHJlYW0gPSBhcGkub3B0aW9ucy5yZXNvdXJjZU5hbWVcbiAgICAgICAgICAgID8gYHVzZSR7aW5mbGVjdGlvbi5jYW1lbGl6ZShhcGkub3B0aW9ucy5yZXNvdXJjZU5hbWUpfWBcbiAgICAgICAgICAgIDogYHVzZSR7aW5mbGVjdGlvbi5jYW1lbGl6ZShhcGkubWV0aG9kTmFtZSl9YDtcbiAgICAgICAgICBjb25zdCBtZXRob2ROYW1lU3RyZWFtQ2FtZWxpemVkID0gaW5mbGVjdGlvbi5jYW1lbGl6ZShtZXRob2ROYW1lU3RyZWFtLCB0cnVlKTtcblxuICAgICAgICAgIGNvbnN0IGV2ZW50c1R5cGVEZWYgPSB6b2RUeXBlVG9Uc1R5cGVEZWYoYXBpLnN0cmVhbU9wdGlvbnMuZXZlbnRzKTtcblxuICAgICAgICAgIC8vIO2MjOudvOuvuO2EsOulvCDqsJ3ssrQg7ZiV7YOc66GcIOygleydmCAo7YOA7J6F6rO8IOyLpOygnCDqsJIg66qo65GQ7JeQIOyCrOyaqSlcbiAgICAgICAgICBjb25zdCBwYXJhbXNEZWZBc09iamVjdCA9XG4gICAgICAgICAgICBwYXJhbXNXaXRob3V0Q29udGV4dC5sZW5ndGggPiAwXG4gICAgICAgICAgICAgID8gYHsgJHtwYXJhbXNXaXRob3V0Q29udGV4dC5tYXAoKHApID0+IGAke3AubmFtZX06ICR7YXBpUGFyYW1UeXBlVG9Uc1R5cGUocC50eXBlLCBpbXBvcnRLZXlzKX1gKS5qb2luKFwiLCBcIil9IH1gXG4gICAgICAgICAgICAgIDogXCJ7fVwiO1xuXG4gICAgICAgICAgZnVuY3Rpb25zLnB1c2goXG4gICAgICAgICAgICBgXG5leHBvcnQgZnVuY3Rpb24gJHttZXRob2ROYW1lU3RyZWFtQ2FtZWxpemVkfShcbiAgcGFyYW1zOiAke3BhcmFtc0RlZkFzT2JqZWN0fSxcbiAgaGFuZGxlcnM6IEV2ZW50SGFuZGxlcnM8JHtldmVudHNUeXBlRGVmfSAmIHsgZW5kPzogKCkgPT4gdm9pZCB9PixcbiAgb3B0aW9uczogU1NFU3RyZWFtT3B0aW9uc1xuKSB7XG4gIHJldHVybiB1c2VTU0VTdHJlYW08JHtldmVudHNUeXBlRGVmfT4oXFxgJHthcGlCYXNlVXJsfVxcYCwgcGFyYW1zLCBoYW5kbGVycywgb3B0aW9ucyk7XG59XG4gICAgICAgICAgICBgLnRyaW0oKSxcbiAgICAgICAgICApO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGFwaS53ZWJzb2NrZXRPcHRpb25zKSB7XG4gICAgICAgICAgLy8gd2Vic29ja2V0IHN1cmZhY2XripQgZmV0Y2gg7ZWo7IiYIOuMgOyLoCB0eXBlZCBob29r7J2EIOyDneyEse2VqFxuICAgICAgICAgIGNvbnN0IHBhcmFtc1dpdGhvdXRDb250ZXh0ID0gYXBpLnBhcmFtZXRlcnMuZmlsdGVyKFxuICAgICAgICAgICAgKHBhcmFtKSA9PlxuICAgICAgICAgICAgICAhQXBpUGFyYW1UeXBlLmlzQ29udGV4dChwYXJhbS50eXBlKSAmJlxuICAgICAgICAgICAgICAhQXBpUGFyYW1UeXBlLmlzUmVmS25leChwYXJhbS50eXBlKSAmJlxuICAgICAgICAgICAgICAhKHBhcmFtLm9wdGlvbmFsICYmIHBhcmFtLm5hbWUuc3RhcnRzV2l0aChcIl9cIikpLFxuICAgICAgICAgICk7XG5cbiAgICAgICAgICBjb25zdCBhcGlCYXNlVXJsID0gYCR7U29uYW11LmNvbmZpZy5hcGkucm91dGUucHJlZml4fSR7YXBpLnBhdGh9YDtcblxuICAgICAgICAgIGNvbnN0IG1ldGhvZE5hbWVXZWJTb2NrZXQgPSBhcGkub3B0aW9ucy5yZXNvdXJjZU5hbWVcbiAgICAgICAgICAgID8gYHVzZSR7aW5mbGVjdGlvbi5jYW1lbGl6ZShhcGkub3B0aW9ucy5yZXNvdXJjZU5hbWUpfWBcbiAgICAgICAgICAgIDogYHVzZSR7aW5mbGVjdGlvbi5jYW1lbGl6ZShhcGkubWV0aG9kTmFtZSl9YDtcbiAgICAgICAgICBjb25zdCBtZXRob2ROYW1lV2ViU29ja2V0Q2FtZWxpemVkID0gaW5mbGVjdGlvbi5jYW1lbGl6ZShtZXRob2ROYW1lV2ViU29ja2V0LCB0cnVlKTtcblxuICAgICAgICAgIC8vIG91dEV2ZW50c+uKlCDsiJjsi6Ag7YOA7J6FLCBpbkV2ZW50c+uKlCBzZW5kKCkg7J6F66ClIO2DgOyeheycvOuhnCDsgqzsmqntlahcbiAgICAgICAgICBjb25zdCBvdXRFdmVudHNUeXBlRGVmID0gcmVzb2x2ZVdlYlNvY2tldEV2ZW50VHlwZURlZihcbiAgICAgICAgICAgIGFwaS53ZWJzb2NrZXRPcHRpb25zLm91dEV2ZW50c1R5cGVSZWYsXG4gICAgICAgICAgICBhcGkud2Vic29ja2V0T3B0aW9ucy5vdXRFdmVudHMsXG4gICAgICAgICAgKTtcbiAgICAgICAgICBjb25zdCBpbkV2ZW50c1R5cGVEZWYgPSByZXNvbHZlV2ViU29ja2V0RXZlbnRUeXBlRGVmKFxuICAgICAgICAgICAgYXBpLndlYnNvY2tldE9wdGlvbnMuaW5FdmVudHNUeXBlUmVmLFxuICAgICAgICAgICAgYXBpLndlYnNvY2tldE9wdGlvbnMuaW5FdmVudHMsXG4gICAgICAgICAgKTtcblxuICAgICAgICAgIC8vIGNvbnRleHQvcmVmS25leC9pbnRlcm5hbCBvcHRpb25hbCDtjIzrnbzrr7jthLDripQg7YG065287J207Ja47Yq4IOyeheugpeyXkOyEnCDsoJzsmbjtlahcbiAgICAgICAgICBjb25zdCBwYXJhbXNEZWZBc09iamVjdCA9XG4gICAgICAgICAgICBwYXJhbXNXaXRob3V0Q29udGV4dC5sZW5ndGggPiAwXG4gICAgICAgICAgICAgID8gYHsgJHtwYXJhbXNXaXRob3V0Q29udGV4dC5tYXAoKHApID0+IGAke3AubmFtZX06ICR7YXBpUGFyYW1UeXBlVG9Uc1R5cGUocC50eXBlLCBpbXBvcnRLZXlzKX1gKS5qb2luKFwiLCBcIil9IH1gXG4gICAgICAgICAgICAgIDogXCJ7fVwiO1xuXG4gICAgICAgICAgZnVuY3Rpb25zLnB1c2goXG4gICAgICAgICAgICBgXG5leHBvcnQgZnVuY3Rpb24gJHttZXRob2ROYW1lV2ViU29ja2V0Q2FtZWxpemVkfShcbiAgcGFyYW1zOiAke3BhcmFtc0RlZkFzT2JqZWN0fSxcbiAgaGFuZGxlcnM6IEV2ZW50SGFuZGxlcnM8JHtvdXRFdmVudHNUeXBlRGVmfT4sXG4gIG9wdGlvbnM6IFdlYlNvY2tldENoYW5uZWxPcHRpb25zID0ge31cbikge1xuICByZXR1cm4gdXNlV2ViU29ja2V0Q2hhbm5lbDwke291dEV2ZW50c1R5cGVEZWZ9LCAke2luRXZlbnRzVHlwZURlZn0+KFxcYCR7YXBpQmFzZVVybH1cXGAsIHBhcmFtcywgaGFuZGxlcnMsIG9wdGlvbnMpO1xufVxuICAgICAgICAgICAgYC50cmltKCksXG4gICAgICAgICAgKTtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIENvbnRleHQg7KCc7Jm47ZWcIO2MjOudvOuvuO2EsFxuICAgICAgICBjb25zdCBwYXJhbXNXaXRob3V0Q29udGV4dCA9IGFwaS5wYXJhbWV0ZXJzLmZpbHRlcihcbiAgICAgICAgICAocGFyYW0pID0+XG4gICAgICAgICAgICAhQXBpUGFyYW1UeXBlLmlzQ29udGV4dChwYXJhbS50eXBlKSAmJlxuICAgICAgICAgICAgIUFwaVBhcmFtVHlwZS5pc1JlZktuZXgocGFyYW0udHlwZSkgJiZcbiAgICAgICAgICAgICEocGFyYW0ub3B0aW9uYWwgJiYgcGFyYW0ubmFtZS5zdGFydHNXaXRoKFwiX1wiKSksXG4gICAgICAgICk7XG5cbiAgICAgICAgLy8g7YOA7J6FIO2MjOudvOuvuO2EsCDsoJXsnZhcbiAgICAgICAgY29uc3QgdHlwZVBhcmFtZXRlcnNBc1RzVHlwZSA9IGFwaS50eXBlUGFyYW1ldGVyc1xuICAgICAgICAgIC5tYXAoKHR5cGVQYXJhbSkgPT4gYXBpUGFyYW1UeXBlVG9Uc1R5cGUodHlwZVBhcmFtLCBpbXBvcnRLZXlzKSlcbiAgICAgICAgICAuam9pbihcIiwgXCIpO1xuICAgICAgICBjb25zdCB0eXBlUGFyYW1zRGVmID0gdHlwZVBhcmFtZXRlcnNBc1RzVHlwZSA/IGA8JHt0eXBlUGFyYW1ldGVyc0FzVHNUeXBlfT5gIDogXCJcIjtcbiAgICAgICAgdHlwZVBhcmFtTmFtZXMgPSB0eXBlUGFyYW1OYW1lcy5jb25jYXQoYXBpLnR5cGVQYXJhbWV0ZXJzLm1hcCgodHApID0+IHRwLmlkKSk7XG5cbiAgICAgICAgLy8g7YyM652866+47YSwIOygleydmFxuICAgICAgICBjb25zdCBwYXJhbXNEZWYgPSBhcGlQYXJhbVRvVHNDb2RlKHBhcmFtc1dpdGhvdXRDb250ZXh0LCBpbXBvcnRLZXlzKTtcbiAgICAgICAgY29uc3QgcGFyYW1OYW1lcyA9IHBhcmFtc1dpdGhvdXRDb250ZXh0Lm1hcCgocCkgPT4gcC5uYW1lKS5qb2luKFwiLCBcIik7XG5cbiAgICAgICAgLy8g66as7YS0IO2DgOyehSDsoJXsnZhcbiAgICAgICAgY29uc3QgcmV0dXJuVHlwZURlZiA9IGFwaVBhcmFtVHlwZVRvVHNUeXBlKFxuICAgICAgICAgIGFzc2VydERlZmluZWQodW53cmFwUHJvbWlzZU9uY2UoYXBpLnJldHVyblR5cGUpKSxcbiAgICAgICAgICBpbXBvcnRLZXlzLFxuICAgICAgICApO1xuXG4gICAgICAgIC8vIOq4sOuzuCBVUkxcbiAgICAgICAgY29uc3QgYXBpQmFzZVVybCA9IGAke1NvbmFtdS5jb25maWcuYXBpLnJvdXRlLnByZWZpeH0ke2FwaS5wYXRofWA7XG5cbiAgICAgICAgY29uc3QgY2xpZW50cyA9IGFwaS5vcHRpb25zLmNsaWVudHMgfHwgW107XG5cbiAgICAgICAgLy8gMS4gYXhpb3Mg7ZWo7IiYIOyDneyEsVxuICAgICAgICAvLyByZXNvdXJjZU5hbWXsnbQg7J6I7Jy866m0IGdldCArIHJlc291cmNlTmFtZSDtmJXtg5zroZwg7ZWo7IiY66qFIOyDneyEsVxuICAgICAgICBjb25zdCBtZXRob2ROYW1lID0gYXBpLm9wdGlvbnMucmVzb3VyY2VOYW1lXG4gICAgICAgICAgPyBgZ2V0JHtpbmZsZWN0aW9uLmNhbWVsaXplKGFwaS5vcHRpb25zLnJlc291cmNlTmFtZSl9YFxuICAgICAgICAgIDogYXBpLm1ldGhvZE5hbWU7XG5cbiAgICAgICAgLy8gYXhpb3MtbXVsdGlwYXJ0IOyymOumrCAo7YyM7J28IOyXheuhnOuTnClcbiAgICAgICAgaWYgKGNsaWVudHMuaW5jbHVkZXMoXCJheGlvcy1tdWx0aXBhcnRcIikpIHtcbiAgICAgICAgICBjb25zdCBmb3JtRGF0YUFwcGVuZCA9IGBmaWxlcy5mb3JFYWNoKGYgPT4geyBmb3JtRGF0YS5hcHBlbmQoXCJmaWxlc1wiLCBmKTsgfSk7YDtcblxuICAgICAgICAgIGNvbnN0IG90aGVyUGFyYW1zQXBwZW5kID0gcGFyYW1zV2l0aG91dENvbnRleHRcbiAgICAgICAgICAgIC5tYXAoKHBhcmFtKSA9PiB7XG4gICAgICAgICAgICAgIC8vIHByaW1pdGl2ZSDtg4DsnoXsnbjsp4Ag7LK07YGsXG4gICAgICAgICAgICAgIGNvbnN0IGlzUHJpbWl0aXZlID1cbiAgICAgICAgICAgICAgICB0eXBlb2YgcGFyYW0udHlwZSA9PT0gXCJzdHJpbmdcIiAmJlxuICAgICAgICAgICAgICAgIFtcInN0cmluZ1wiLCBcIm51bWJlclwiLCBcImJvb2xlYW5cIl0uaW5jbHVkZXMocGFyYW0udHlwZSk7XG5cbiAgICAgICAgICAgICAgaWYgKGlzUHJpbWl0aXZlKSB7XG4gICAgICAgICAgICAgICAgLy8gcHJpbWl0aXZlOiDsp4HsoJEgZm9ybURhdGEuYXBwZW5kXG4gICAgICAgICAgICAgICAgcmV0dXJuIGBmb3JtRGF0YS5hcHBlbmQoJyR7cGFyYW0ubmFtZX0nLCBTdHJpbmcoJHtwYXJhbS5uYW1lfSkpO2A7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gb2JqZWN0OiB0b0Zvcm1EYXRhIOyCrOyaqVxuICAgICAgICAgICAgICAgIHJldHVybiBgdG9Gb3JtRGF0YSgke3BhcmFtLm5hbWV9LCBmb3JtRGF0YSwgJyR7cGFyYW0ubmFtZX0nKTtgO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgLmpvaW4oXCJcXG4gICAgXCIpO1xuXG4gICAgICAgICAgY29uc3QgcGFyYW1zRGVmQ29tbWEgPSBwYXJhbXNEZWYgIT09IFwiXCIgPyBcIiwgXCIgOiBcIlwiO1xuICAgICAgICAgIGZ1bmN0aW9ucy5wdXNoKFxuICAgICAgICAgICAgYFxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uICR7bWV0aG9kTmFtZX0ke3R5cGVQYXJhbXNEZWZ9KFxuICAke3BhcmFtc0RlZn0ke3BhcmFtc0RlZkNvbW1hfVxuICBmaWxlczogRmlsZVtdLFxuICBvblVwbG9hZFByb2dyZXNzPzogKHBlOiBBeGlvc1Byb2dyZXNzRXZlbnQpID0+IHZvaWRcbik6IFByb21pc2U8JHtyZXR1cm5UeXBlRGVmfT4ge1xuICBjb25zdCBmb3JtRGF0YSA9IG5ldyBGb3JtRGF0YSgpO1xuICAke2Zvcm1EYXRhQXBwZW5kfVxuICAke290aGVyUGFyYW1zQXBwZW5kfVxuICByZXR1cm4gZmV0Y2goe1xuICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgIHVybDogXFxgJHthcGlCYXNlVXJsfVxcYCxcbiAgICBvblVwbG9hZFByb2dyZXNzLFxuICAgIGRhdGE6IGZvcm1EYXRhLFxuICAgICR7YXBpLm9wdGlvbnMudGltZW91dCA/IGBzaWduYWw6IEFib3J0U2lnbmFsLnRpbWVvdXQoJHthcGkub3B0aW9ucy50aW1lb3V0fSksYCA6IFwiXCJ9XG4gIH0pO1xufVxuICAgICAgICAgIGAudHJpbSgpLFxuICAgICAgICAgICk7XG4gICAgICAgIH0gZWxzZSBpZiAoYXBpLm9wdGlvbnMuaHR0cE1ldGhvZCA9PT0gXCJHRVRcIikge1xuICAgICAgICAgIGNvbnN0IGhhc1BhcmFtcyA9IHBhcmFtc1dpdGhvdXRDb250ZXh0Lmxlbmd0aCA+IDA7XG4gICAgICAgICAgZnVuY3Rpb25zLnB1c2goXG4gICAgICAgICAgICBgXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gJHttZXRob2ROYW1lfSR7dHlwZVBhcmFtc0RlZn0oJHtwYXJhbXNEZWZ9KTogUHJvbWlzZTwke3JldHVyblR5cGVEZWZ9PiB7XG4gIHJldHVybiBmZXRjaCh7XG4gICAgbWV0aG9kOiBcIkdFVFwiLFxuICAgIHVybDogXFxgJHthcGlCYXNlVXJsfSR7aGFzUGFyYW1zID8gYD9cXCR7cXMuc3RyaW5naWZ5KHsgJHtwYXJhbU5hbWVzfSB9KX1gIDogXCJcIn1cXGAsXG4gICAgJHthcGkub3B0aW9ucy50aW1lb3V0ID8gYHNpZ25hbDogQWJvcnRTaWduYWwudGltZW91dCgke2FwaS5vcHRpb25zLnRpbWVvdXR9KSxgIDogXCJcIn1cbiAgfSk7XG59XG4gICAgICAgICAgYC50cmltKCksXG4gICAgICAgICAgKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb25zdCBoYXNQYXJhbXMgPSBwYXJhbXNXaXRob3V0Q29udGV4dC5sZW5ndGggPiAwO1xuICAgICAgICAgIGZ1bmN0aW9ucy5wdXNoKFxuICAgICAgICAgICAgYFxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uICR7bWV0aG9kTmFtZX0ke3R5cGVQYXJhbXNEZWZ9KCR7cGFyYW1zRGVmfSk6IFByb21pc2U8JHtyZXR1cm5UeXBlRGVmfT4ge1xuICByZXR1cm4gZmV0Y2goe1xuICAgIG1ldGhvZDogXCIke2FwaS5vcHRpb25zLmh0dHBNZXRob2R9XCIsXG4gICAgdXJsOiBcXGAke2FwaUJhc2VVcmx9XFxgLFxuICAgICR7aGFzUGFyYW1zID8gYGRhdGE6IHsgJHtwYXJhbU5hbWVzfSB9LGAgOiBcIlwifVxuICAgICR7YXBpLm9wdGlvbnMudGltZW91dCA/IGBzaWduYWw6IEFib3J0U2lnbmFsLnRpbWVvdXQoJHthcGkub3B0aW9ucy50aW1lb3V0fSksYCA6IFwiXCJ9XG4gIH0pO1xufVxuICAgICAgICAgIGAudHJpbSgpLFxuICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyAyLiBxdWVyeU9wdGlvbnMgKyB1c2VRdWVyeSAodGFuc3RhY2stcXVlcnkpXG4gICAgICAgIGlmIChjbGllbnRzLmluY2x1ZGVzKFwidGFuc3RhY2stcXVlcnlcIikpIHtcbiAgICAgICAgICBjb25zdCBob29rTmFtZSA9IGFwaS5vcHRpb25zLnJlc291cmNlTmFtZVxuICAgICAgICAgICAgPyBpbmZsZWN0aW9uLmNhbWVsaXplKGFwaS5vcHRpb25zLnJlc291cmNlTmFtZSwgdHJ1ZSlcbiAgICAgICAgICAgIDogaW5mbGVjdGlvbi5jYW1lbGl6ZShhcGkubWV0aG9kTmFtZSwgdHJ1ZSk7XG5cbiAgICAgICAgICAvLyBxdWVyeU9wdGlvbnNcbiAgICAgICAgICBmdW5jdGlvbnMucHVzaChcbiAgICAgICAgICAgIGBcbmV4cG9ydCBjb25zdCAke21ldGhvZE5hbWV9UXVlcnlPcHRpb25zID0gJHt0eXBlUGFyYW1zRGVmfSgke3BhcmFtc0RlZn0pID0+IHF1ZXJ5T3B0aW9ucyh7XG4gIHF1ZXJ5S2V5OiBbJyR7bW9kZWxOYW1lfScsICcke21ldGhvZE5hbWV9JyR7cGFyYW1OYW1lcyA/IGAsICR7cGFyYW1OYW1lc31gIDogXCJcIn1dLFxuICBxdWVyeUZuOiAoKSA9PiAke21ldGhvZE5hbWV9KCR7cGFyYW1OYW1lc30pXG59KTtcbiAgICAgICAgICBgLnRyaW0oKSxcbiAgICAgICAgICApO1xuXG4gICAgICAgICAgLy8gdXNlUXVlcnkgaG9vayAodXNlUmVmcmVzaGFibGXroZwg656Y7ZWR7ZW0IHJlZnJlc2gvaXNSZWZyZXNoaW5n7J2EIOq4sOuzuCDsoJzqs7UpXG4gICAgICAgICAgZnVuY3Rpb25zLnB1c2goXG4gICAgICAgICAgICBgXG5leHBvcnQgY29uc3QgdXNlJHtpbmZsZWN0aW9uLmNhbWVsaXplKGhvb2tOYW1lKX0gPSAke3R5cGVQYXJhbXNEZWZ9KCR7cGFyYW1zRGVmfSR7XG4gICAgICAgICAgICAgIHBhcmFtc0RlZiA/IFwiLCBcIiA6IFwiXCJcbiAgICAgICAgICAgIH1vcHRpb25zPzogeyBlbmFibGVkPzogYm9vbGVhbiB9KSA9PlxuICB1c2VSZWZyZXNoYWJsZSh1c2VRdWVyeSh7XG4gICAgLi4uJHttZXRob2ROYW1lfVF1ZXJ5T3B0aW9ucygke3BhcmFtTmFtZXN9KSxcbiAgICAuLi5vcHRpb25zXG4gIH0pKTtcbiAgICAgICAgICBgLnRyaW0oKSxcbiAgICAgICAgICApO1xuXG4gICAgICAgICAgLy8gaW5maW5pdGVRdWVyeU9wdGlvbnMgKyB1c2VJbmZpbml0ZVF1ZXJ5IChBc3luY0lkQ29uZmlnLnVzZUxpc3RJbmZpbml0ZSDrjIDsg4Eg7KGw6rG0KVxuICAgICAgICAgIC8vIOyhsOqxtDogcmVzb3VyY2VOYW1l7J20IOuzteyImO2YleydtOqzoCBtZXRob2ROYW1lID09PSBcImZpbmRNYW55XCJcbiAgICAgICAgICBjb25zdCByZXNvdXJjZU5hbWUgPSBhcGkub3B0aW9ucy5yZXNvdXJjZU5hbWU7XG4gICAgICAgICAgY29uc3QgaXNJbmZpbml0ZVRhcmdldCA9XG4gICAgICAgICAgICAhIXJlc291cmNlTmFtZSAmJlxuICAgICAgICAgICAgaW5mbGVjdGlvbi5wbHVyYWxpemUocmVzb3VyY2VOYW1lKSA9PT0gcmVzb3VyY2VOYW1lICYmXG4gICAgICAgICAgICBhcGkubWV0aG9kTmFtZSA9PT0gXCJmaW5kTWFueVwiO1xuXG4gICAgICAgICAgaWYgKGlzSW5maW5pdGVUYXJnZXQpIHtcbiAgICAgICAgICAgIGNvbnN0IGluZmluaXRlTWV0aG9kTmFtZSA9IGAke21ldGhvZE5hbWV9SW5maW5pdGVgO1xuICAgICAgICAgICAgY29uc3QgaW5maW5pdGVIb29rTmFtZSA9IGB1c2Uke2luZmxlY3Rpb24uY2FtZWxpemUoaG9va05hbWUpfUluZmluaXRlYDtcblxuICAgICAgICAgICAgZnVuY3Rpb25zLnB1c2goXG4gICAgICAgICAgICAgIGBcbmV4cG9ydCBjb25zdCAke2luZmluaXRlTWV0aG9kTmFtZX1RdWVyeU9wdGlvbnMgPSAke3R5cGVQYXJhbXNEZWZ9KCR7cGFyYW1zRGVmfSkgPT4gaW5maW5pdGVRdWVyeU9wdGlvbnMoe1xuICBxdWVyeUtleTogWycke21vZGVsTmFtZX0nLCAnJHttZXRob2ROYW1lfScsICdpbmZpbml0ZScke3BhcmFtTmFtZXMgPyBgLCAke3BhcmFtTmFtZXN9YCA6IFwiXCJ9XSxcbiAgcXVlcnlGbjogKHsgcGFnZVBhcmFtIH0pID0+ICR7bWV0aG9kTmFtZX0oJHtcbiAgICBwYXJhbU5hbWVzID8gcGFyYW1OYW1lcy5yZXBsYWNlKC9cXGJyYXdQYXJhbXNcXGIvLCBcInsgLi4ucmF3UGFyYW1zLCBwYWdlOiBwYWdlUGFyYW0gfVwiKSA6IFwiXCJcbiAgfSksXG4gIGluaXRpYWxQYWdlUGFyYW06IDEgYXMgbnVtYmVyLFxuICBnZXROZXh0UGFnZVBhcmFtOiAobGFzdFBhZ2UsIGFsbFBhZ2VzKSA9PiB7XG4gICAgY29uc3QgdG90YWwgPSAobGFzdFBhZ2UgYXMgeyB0b3RhbD86IG51bWJlciB9KT8udG90YWwgPz8gMDtcbiAgICBjb25zdCBsb2FkZWQgPSBhbGxQYWdlcy5yZWR1Y2UoXG4gICAgICAoc3VtLCBwKSA9PiBzdW0gKyAoKHAgYXMgeyByb3dzPzogdW5rbm93bltdIH0pPy5yb3dzPy5sZW5ndGggPz8gMCksXG4gICAgICAwLFxuICAgICk7XG4gICAgcmV0dXJuIGxvYWRlZCA8IHRvdGFsID8gYWxsUGFnZXMubGVuZ3RoICsgMSA6IHVuZGVmaW5lZDtcbiAgfSxcbiAgc2VsZWN0OiBkZWR1cGVBbmRGbGF0dGVuLFxufSk7XG4gICAgICAgICAgYC50cmltKCksXG4gICAgICAgICAgICApO1xuXG4gICAgICAgICAgICBmdW5jdGlvbnMucHVzaChcbiAgICAgICAgICAgICAgYFxuZXhwb3J0IGNvbnN0ICR7aW5maW5pdGVIb29rTmFtZX0gPSAke3R5cGVQYXJhbXNEZWZ9KCR7cGFyYW1zRGVmfSR7XG4gICAgICAgICAgICAgICAgcGFyYW1zRGVmID8gXCIsIFwiIDogXCJcIlxuICAgICAgICAgICAgICB9b3B0aW9ucz86IHsgZW5hYmxlZD86IGJvb2xlYW4gfSkgPT5cbiAgdXNlUmVmcmVzaGFibGUodXNlSW5maW5pdGVRdWVyeSh7XG4gICAgLi4uJHtpbmZpbml0ZU1ldGhvZE5hbWV9UXVlcnlPcHRpb25zKCR7cGFyYW1OYW1lc30pLFxuICAgIC4uLm9wdGlvbnNcbiAgfSkpO1xuICAgICAgICAgIGAudHJpbSgpLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyAzLiB1c2VNdXRhdGlvbiAodGFuc3RhY2stbXV0YXRpb24pXG4gICAgICAgIGlmIChjbGllbnRzLmluY2x1ZGVzKFwidGFuc3RhY2stbXV0YXRpb25cIikpIHtcbiAgICAgICAgICBjb25zdCBob29rTmFtZSA9IGluZmxlY3Rpb24uY2FtZWxpemUoYXBpLm1ldGhvZE5hbWUpO1xuICAgICAgICAgIGNvbnN0IG11dGF0aW9uUGFyYW1UeXBlID1cbiAgICAgICAgICAgIHBhcmFtc1dpdGhvdXRDb250ZXh0Lmxlbmd0aCA+IDBcbiAgICAgICAgICAgICAgPyBgeyAke3BhcmFtc1dpdGhvdXRDb250ZXh0XG4gICAgICAgICAgICAgICAgICAubWFwKChwKSA9PiBgJHtwLm5hbWV9OiAke2FwaVBhcmFtVHlwZVRvVHNUeXBlKHAudHlwZSwgW10pfWApXG4gICAgICAgICAgICAgICAgICAuam9pbihcIiwgXCIpfSB9YFxuICAgICAgICAgICAgICA6IFwidm9pZFwiO1xuICAgICAgICAgIGNvbnN0IG11dGF0aW9uUGFyYW1OYW1lcyA9XG4gICAgICAgICAgICBwYXJhbXNXaXRob3V0Q29udGV4dC5sZW5ndGggPiAwXG4gICAgICAgICAgICAgID8gcGFyYW1zV2l0aG91dENvbnRleHQubWFwKChwKSA9PiBgcGFyYW1zLiR7cC5uYW1lfWApLmpvaW4oXCIsIFwiKVxuICAgICAgICAgICAgICA6IFwiXCI7XG5cbiAgICAgICAgICBmdW5jdGlvbnMucHVzaChcbiAgICAgICAgICAgIGBcbmV4cG9ydCBjb25zdCB1c2Uke2hvb2tOYW1lfU11dGF0aW9uID0gJHt0eXBlUGFyYW1zRGVmfSgpID0+IHVzZU11dGF0aW9uKHtcbiAgbXV0YXRpb25GbjogKHBhcmFtczogJHttdXRhdGlvblBhcmFtVHlwZX0pID0+ICR7bW9kZWxOYW1lfVNlcnZpY2UuJHttZXRob2ROYW1lfSgke211dGF0aW9uUGFyYW1OYW1lc30pXG59KTtcbiAgICAgICAgICBgLnRyaW0oKSxcbiAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gNC4gdXNlTXV0YXRpb24gd2l0aCBtdWx0aXBhcnQgKHRhbnN0YWNrLW11dGF0aW9uLW11bHRpcGFydClcbiAgICAgICAgaWYgKGNsaWVudHMuaW5jbHVkZXMoXCJ0YW5zdGFjay1tdXRhdGlvbi1tdWx0aXBhcnRcIikpIHtcbiAgICAgICAgICBjb25zdCBob29rTmFtZSA9IGluZmxlY3Rpb24uY2FtZWxpemUoYXBpLm1ldGhvZE5hbWUpO1xuXG4gICAgICAgICAgLy8g7YyM652866+47YSwIO2DgOyehSDsoJXsnZg6IHBhcmFtc0RlZuyXkOyEnCDtg4DsnoXrp4wg7LaU7LacXG4gICAgICAgICAgLy8gcGFyYW1zRGVmIOyYiDogXCJwYXJhbXM6IHsgY2F0ZWdvcnk6IHN0cmluZyB9XCIg4oaSIFwieyBjYXRlZ29yeTogc3RyaW5nIH1cIlxuICAgICAgICAgIGNvbnN0IHBhcmFtc1R5cGVEZWYgPVxuICAgICAgICAgICAgcGFyYW1zV2l0aG91dENvbnRleHQubGVuZ3RoID4gMFxuICAgICAgICAgICAgICA/IHBhcmFtc0RlZi5zcGxpdChcIjpcIikuc2xpY2UoMSkuam9pbihcIjpcIikudHJpbSgpIC8vIFwicGFyYW1zOiB7IGNhdGVnb3J5OiBzdHJpbmcgfVwiIOKGkiBcInsgY2F0ZWdvcnk6IHN0cmluZyB9XCJcbiAgICAgICAgICAgICAgOiBcIlwiO1xuXG4gICAgICAgICAgY29uc3QgbXV0YXRpb25QYXJhbVR5cGUgPVxuICAgICAgICAgICAgcGFyYW1zV2l0aG91dENvbnRleHQubGVuZ3RoID4gMFxuICAgICAgICAgICAgICA/IGB7IHBhcmFtczogJHtwYXJhbXNUeXBlRGVmfSwgZmlsZXM6IEZpbGVbXSB9YFxuICAgICAgICAgICAgICA6IGB7IGZpbGVzOiBGaWxlW10gfWA7XG5cbiAgICAgICAgICAvLyBtdXRhdGlvbkZuIO2YuOy2nCDtjIzrnbzrr7jthLBcbiAgICAgICAgICBjb25zdCBtdXRhdGlvbkZuQ2FsbCA9XG4gICAgICAgICAgICBwYXJhbXNXaXRob3V0Q29udGV4dC5sZW5ndGggPiAwXG4gICAgICAgICAgICAgID8gYCR7bW9kZWxOYW1lfVNlcnZpY2UuJHttZXRob2ROYW1lfShwYXJhbXMucGFyYW1zLCBwYXJhbXMuZmlsZXMpYFxuICAgICAgICAgICAgICA6IGAke21vZGVsTmFtZX1TZXJ2aWNlLiR7bWV0aG9kTmFtZX0ocGFyYW1zLmZpbGVzKWA7XG5cbiAgICAgICAgICBmdW5jdGlvbnMucHVzaChcbiAgICAgICAgICAgIGBcbmV4cG9ydCBjb25zdCB1c2Uke2hvb2tOYW1lfU11dGF0aW9uID0gJHt0eXBlUGFyYW1zRGVmfShcbiAgb3B0aW9ucz86IFVzZU11dGF0aW9uT3B0aW9uczwke3JldHVyblR5cGVEZWZ9LCBFcnJvciwgJHttdXRhdGlvblBhcmFtVHlwZX0+ICYge1xuICAgIG9uVXBsb2FkUHJvZ3Jlc3M/OiAoZTogQXhpb3NQcm9ncmVzc0V2ZW50KSA9PiB2b2lkO1xuICB9XG4pID0+IHVzZU11dGF0aW9uKHtcbiAgbXV0YXRpb25GbjogKHBhcmFtczogJHttdXRhdGlvblBhcmFtVHlwZX0pID0+ICR7bXV0YXRpb25GbkNhbGx9LFxuICByZXRyeTogZmFsc2UsXG4gIC4uLm9wdGlvbnMsXG59KTtcbiAgICAgICAgICBgLnRyaW0oKSxcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIG5hbWVzcGFjZXMucHVzaChcbiAgICAgICAgYFxuZXhwb3J0IG5hbWVzcGFjZSAke21vZGVsTmFtZX1TZXJ2aWNlIHtcbiR7ZnVuY3Rpb25zLmpvaW4oXCJcXG5cXG5cIil9XG59XG4gICAgICBgLnRyaW0oKSxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gQXN5bmNJZENvbmZpZyDsg53shLEgKEVudGl0eeuzhOuhnClcbiAgICBjb25zdCBlbnRpdHlJZHMgPSBFbnRpdHlNYW5hZ2VyLmdldEFsbElkcygpO1xuICAgIGNvbnN0IGFzeW5jSWRDb25maWdzOiBzdHJpbmdbXSA9IFtdO1xuXG4gICAgZm9yIChjb25zdCBlbnRpdHlJZCBvZiBlbnRpdHlJZHMpIHtcbiAgICAgIGNvbnN0IG5hbWVzID0gRW50aXR5TWFuYWdlci5nZXROYW1lc0Zyb21JZChlbnRpdHlJZCk7XG5cbiAgICAgIC8vIEFzeW5jSWRDb25maWfsmqkg66as7Iqk7Yq4IOyhsO2ajCBBUEkg7LC+6riwXG4gICAgICBjb25zdCBsaXN0QXBpID0gYXBpc0J5TW9kZWwuZ2V0KG5hbWVzLmNhcGl0YWwpPy5maW5kKChhcGkpID0+IHtcbiAgICAgICAgLy8gcmVzb3VyY2VOYW1l7J20IOyXhuqxsOuCmCB0YW5zdGFjay1xdWVyeeulvCDsgqzsmqntlZjsp4Ag7JWK64qUIEFQSeuKlCDsoJzsmbhcbiAgICAgICAgaWYgKCFhcGkub3B0aW9ucy5yZXNvdXJjZU5hbWUgfHwgIWFwaS5vcHRpb25zLmNsaWVudHM/LmluY2x1ZGVzKFwidGFuc3RhY2stcXVlcnlcIikpIHtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgLy8gcmVzb3VyY2VOYW1l7J20IOuzteyImO2YleydtOqzoCDrqZTshJzrk5zrqoXsnbQgZmluZE1hbnnsnbggQVBJXG4gICAgICAgIGNvbnN0IHJlc291cmNlTmFtZSA9IGFwaS5vcHRpb25zLnJlc291cmNlTmFtZTtcbiAgICAgICAgcmV0dXJuIGluZmxlY3Rpb24ucGx1cmFsaXplKHJlc291cmNlTmFtZSkgPT09IHJlc291cmNlTmFtZSAmJiBhcGkubWV0aG9kTmFtZSA9PT0gXCJmaW5kTWFueVwiO1xuICAgICAgfSk7XG5cbiAgICAgIGlmIChsaXN0QXBpKSB7XG4gICAgICAgIC8vIHJlc291cmNlTmFtZeyXkOyEnCBob29rIOydtOumhCDsg53shLEgKOq4sOyhtCDroZzsp4Hqs7wg64+Z7J28KVxuICAgICAgICBjb25zdCBob29rTmFtZSA9IGluZmxlY3Rpb24uY2FtZWxpemUoYXNzZXJ0RGVmaW5lZChsaXN0QXBpLm9wdGlvbnMucmVzb3VyY2VOYW1lKSwgdHJ1ZSk7XG4gICAgICAgIGNvbnN0IHVzZUhvb2tOYW1lID0gYHVzZSR7aW5mbGVjdGlvbi5jYW1lbGl6ZShob29rTmFtZSl9YDtcbiAgICAgICAgY29uc3QgdXNlSG9va0luZmluaXRlTmFtZSA9IGAke3VzZUhvb2tOYW1lfUluZmluaXRlYDtcblxuICAgICAgICAvLyBMaXN0UGFyYW1zIO2DgOyeheuqhSDqtazshLFcbiAgICAgICAgY29uc3QgbGlzdFBhcmFtc1R5cGUgPSBgJHtuYW1lcy5jYXBpdGFsfUxpc3RQYXJhbXNgO1xuXG4gICAgICAgIGFzeW5jSWRDb25maWdzLnB1c2goXG4gICAgICAgICAgYFxuLy8gQXN5bmNJZENvbmZpZzogJHtuYW1lcy5jYXBpdGFsfVxuZXhwb3J0IGNvbnN0ICR7bmFtZXMuY2FwaXRhbH1Bc3luY0lkQ29uZmlnOiBBc3luY0lkQ29uZmlnPCR7bmFtZXMuY2FwaXRhbH1TdWJzZXRLZXksICR7bmFtZXMuY2FwaXRhbH1TdWJzZXRNYXBwaW5nLCAke2xpc3RQYXJhbXNUeXBlfT4gPSB7XG4gIHBsYWNlaG9sZGVyS2V5OiBcImVudGl0eS4ke25hbWVzLmNhcGl0YWx9XCIsXG4gIHVzZUxpc3Q6ICR7bmFtZXMuY2FwaXRhbH1TZXJ2aWNlLiR7dXNlSG9va05hbWV9LFxuICB1c2VMaXN0SW5maW5pdGU6ICR7bmFtZXMuY2FwaXRhbH1TZXJ2aWNlLiR7dXNlSG9va0luZmluaXRlTmFtZX0sXG59O1xuICAgICAgICAgIGAudHJpbSgpLFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIEJVSUxUX0lOX1RZUEVT7JeQ7IScIOyCrOyaqeuQmOuKlCDtg4DsnoXrk6TsnYQg7ZmV7J247ZWY7JesIOuPmeyggeycvOuhnCBpbXBvcnQg6rWs7ISxXG4gICAgY29uc3QgYnVpbHRJblR5cGVJbXBvcnRzID0gT2JqZWN0LmtleXMoQlVJTFRfSU5fVFlQRVMpXG4gICAgICAuZmlsdGVyKCh0eXBlS2V5KSA9PiBpbXBvcnRLZXlzLmluY2x1ZGVzKHR5cGVLZXkpKVxuICAgICAgLm1hcCgodHlwZUtleSkgPT4gYHR5cGUgJHt0eXBlS2V5fWApO1xuXG4gICAgLy8gc29uYW11LnNoYXJlZOyXkOyEnCBpbXBvcnTtlaAg7ZWt66qp65Ok7J2EIOuPmeyggeycvOuhnCDqtazshLFcbiAgICAvLyBib2R5IOusuOyekOyXtOydhCDquLDspIDsnLzroZwgaW5maW5pdGUg7ZuFIOyDneyEsSDsl6zrtoAg7YyQ64uoIChmaW5kTWFueSDrs7XsiJjtmJUg67aE6riw7JeQ7ISc66eMIOywuOyhsOuQqClcbiAgICBjb25zdCBib2R5Rm9ySW1wb3J0Q2hlY2sgPSBuYW1lc3BhY2VzLmpvaW4oXCJcXG5cXG5cIik7XG4gICAgY29uc3QgbmVlZHNEZWR1cGVBbmRGbGF0dGVuID0gYm9keUZvckltcG9ydENoZWNrLmluY2x1ZGVzKFwiZGVkdXBlQW5kRmxhdHRlblwiKTtcbiAgICBjb25zdCBuZWVkc1VzZVJlZnJlc2hhYmxlID0gYm9keUZvckltcG9ydENoZWNrLmluY2x1ZGVzKFwidXNlUmVmcmVzaGFibGVcIik7XG5cbiAgICBjb25zdCBzb25hbXVTaGFyZWRJbXBvcnRzID0gW1xuICAgICAgXCJ0eXBlIExpc3RSZXN1bHRcIixcbiAgICAgIFwidHlwZSBGaWx0ZXJRdWVyeVwiLFxuICAgICAgLi4uYnVpbHRJblR5cGVJbXBvcnRzLFxuICAgICAgXCJmZXRjaFwiLFxuICAgICAgXCJ0eXBlIEV2ZW50SGFuZGxlcnNcIixcbiAgICAgIFwidHlwZSBTU0VTdHJlYW1PcHRpb25zXCIsXG4gICAgICBcInR5cGUgV2ViU29ja2V0Q2hhbm5lbE9wdGlvbnNcIixcbiAgICAgIFwidXNlU1NFU3RyZWFtXCIsXG4gICAgICBcInVzZVdlYlNvY2tldENoYW5uZWxcIixcbiAgICAgIFwidG9Gb3JtRGF0YVwiLFxuICAgICAgLi4uKG5lZWRzRGVkdXBlQW5kRmxhdHRlbiA/IFtcImRlZHVwZUFuZEZsYXR0ZW5cIl0gOiBbXSksXG4gICAgICAuLi4obmVlZHNVc2VSZWZyZXNoYWJsZSA/IFtcInVzZVJlZnJlc2hhYmxlXCJdIDogW10pLFxuICAgIF0uam9pbihcIiwgXCIpO1xuXG4gICAgLy8gYm9keSDqtazshLE6IG5hbWVzcGFjZXMgKyBhc3luY0lkQ29uZmlnc1xuICAgIGNvbnN0IGJvZHlQYXJ0cyA9IFsuLi5uYW1lc3BhY2VzLCAuLi5hc3luY0lkQ29uZmlnc107XG5cbiAgICByZXR1cm4ge1xuICAgICAgLi4udGhpcy5nZXRUYXJnZXRBbmRQYXRoKCksXG4gICAgICBib2R5OiBib2R5UGFydHMuam9pbihcIlxcblxcblwiKSxcbiAgICAgIGltcG9ydEtleXM6IGRpZmYodW5pcXVlKGltcG9ydEtleXMpLCBbXG4gICAgICAgIC4uLnR5cGVQYXJhbU5hbWVzLFxuICAgICAgICBcIkxpc3RSZXN1bHRcIixcbiAgICAgICAgLi4uT2JqZWN0LmtleXMoQlVJTFRfSU5fVFlQRVMpLFxuICAgICAgXSksXG4gICAgICBjdXN0b21IZWFkZXJzOiBbXG4gICAgICAgIFwiLyoqXCIsXG4gICAgICAgIFwiICogQGdlbmVyYXRlZFwiLFxuICAgICAgICBcIiAqIOyngeygkSDsiJjsoJXtlZjsp4Ag66eI7IS47JqULlwiLFxuICAgICAgICBcIiAqL1wiLFxuICAgICAgICBcIlwiLFxuICAgICAgICBcIi8qIG94bGludC1kaXNhYmxlICovXCIsXG4gICAgICAgIFwiXCIsXG4gICAgICAgIGBpbXBvcnQgeyBxdWVyeU9wdGlvbnMsIHVzZVF1ZXJ5LCB1c2VJbmZpbml0ZVF1ZXJ5LCBpbmZpbml0ZVF1ZXJ5T3B0aW9ucywgdXNlTXV0YXRpb24sIHR5cGUgVXNlTXV0YXRpb25PcHRpb25zIH0gZnJvbSAnQHRhbnN0YWNrL3JlYWN0LXF1ZXJ5JztgLFxuICAgICAgICBgaW1wb3J0IHsgdHlwZSBBeGlvc1Byb2dyZXNzRXZlbnQgfSBmcm9tICdheGlvcyc7YCxcbiAgICAgICAgYGltcG9ydCBxcyBmcm9tICdxcyc7YCxcbiAgICAgICAgYGltcG9ydCB7ICR7c29uYW11U2hhcmVkSW1wb3J0c30gfSBmcm9tICcuL3NvbmFtdS5zaGFyZWQnO2AsXG4gICAgICAgIGBpbXBvcnQgeyB0eXBlIEFzeW5jSWRDb25maWcgfSBmcm9tICdAc29uYW11LWtpdC9yZWFjdC1jb21wb25lbnRzL2NvbXBvbmVudHMnO2AsXG4gICAgICBdLFxuICAgIH07XG4gIH1cbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7OztxQkFPa0M7WUFFTztvQkFDa0I7V0FFWDtXQUNDO2NBQ1g7bUJBQytCO0FBRXJFLElBQWEscUJBQWIsY0FBd0MsU0FBUztDQUMvQyxjQUFjO0VBQ1osTUFBTSxVQUFVO0NBQ2xCO0NBRUEsbUJBQW1CO0VBQ2pCLE9BQU87R0FDTCxRQUFRO0dBQ1IsTUFBTTtFQUNSO0NBQ0Y7Q0FFQSxPQUFPLElBQWlDO0VBQ3RDLE1BQU0sRUFBRSxTQUFTLE9BQU87RUFHeEIsTUFBTSw4QkFBYyxJQUFJLElBQTJCO0VBQ25ELEtBQUssTUFBTSxPQUFPLE1BQU07R0FDdEIsTUFBTSxZQUFZLElBQUksVUFBVSxRQUFRLFVBQVUsRUFBRSxDQUFDLENBQUMsUUFBUSxVQUFVLEVBQUU7R0FDMUUsSUFBSSxDQUFDLFlBQVksSUFBSSxTQUFTLEdBQzVCLFlBQVksSUFBSSxXQUFXLENBQUMsQ0FBQztHQUUvQixZQUFZLElBQUksU0FBUyxD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
|
|
305
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VydmljZXMudGVtcGxhdGUuanMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3RlbXBsYXRlL2ltcGxlbWVudGF0aW9ucy9zZXJ2aWNlcy50ZW1wbGF0ZS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgaW5mbGVjdGlvbiBmcm9tIFwiaW5mbGVjdGlvblwiO1xuaW1wb3J0IHsgZGlmZiwgdW5pcXVlIH0gZnJvbSBcInJhZGFzaGlcIjtcblxuaW1wb3J0IHtcbiAgYXBpUGFyYW1Ub1RzQ29kZSxcbiAgYXBpUGFyYW1UeXBlVG9Uc1R5cGUsXG4gIHVud3JhcFByb21pc2VPbmNlLFxufSBmcm9tIFwiLi4vLi4vYXBpL2NvZGUtY29udmVydGVyc1wiO1xuaW1wb3J0IHsgdHlwZSBFeHRlbmRlZEFwaSB9IGZyb20gXCIuLi8uLi9hcGkvZGVjb3JhdG9yc1wiO1xuaW1wb3J0IHsgU29uYW11IH0gZnJvbSBcIi4uLy4uL2FwaS9zb25hbXVcIjtcbmltcG9ydCB7IEVudGl0eU1hbmFnZXIgfSBmcm9tIFwiLi4vLi4vZW50aXR5L2VudGl0eS1tYW5hZ2VyXCI7XG5pbXBvcnQgeyB0eXBlIFRlbXBsYXRlT3B0aW9ucyB9IGZyb20gXCIuLi8uLi90eXBlcy90eXBlc1wiO1xuaW1wb3J0IHsgQXBpUGFyYW1UeXBlIH0gZnJvbSBcIi4uLy4uL3R5cGVzL3R5cGVzXCI7XG5pbXBvcnQgeyBpc1N0cmluZ1ZhbHVlIH0gZnJvbSBcIi4uLy4uL3V0aWxzL3J1bnRpbWUtdmFsdWVcIjtcbmltcG9ydCB7IGFzc2VydERlZmluZWQgfSBmcm9tIFwiLi4vLi4vdXRpbHMvdXRpbHNcIjtcbmltcG9ydCB7IFRlbXBsYXRlIH0gZnJvbSBcIi4uL3RlbXBsYXRlXCI7XG5pbXBvcnQgeyBCVUlMVF9JTl9UWVBFUywgem9kVHlwZVRvVHNUeXBlRGVmIH0gZnJvbSBcIi4uL3pvZC1jb252ZXJ0ZXJcIjtcblxuZXhwb3J0IGNsYXNzIFRlbXBsYXRlX19zZXJ2aWNlcyBleHRlbmRzIFRlbXBsYXRlIHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoXCJzZXJ2aWNlc1wiKTtcbiAgfVxuXG4gIGdldFRhcmdldEFuZFBhdGgoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHRhcmdldDogXCI6dGFyZ2V0L3NyYy9zZXJ2aWNlc1wiLFxuICAgICAgcGF0aDogYHNlcnZpY2VzLmdlbmVyYXRlZC50c2AsXG4gICAgfTtcbiAgfVxuXG4gIHJlbmRlcih7fTogVGVtcGxhdGVPcHRpb25zW1wic2VydmljZXNcIl0pIHtcbiAgICBjb25zdCB7IGFwaXMgfSA9IFNvbmFtdS5zeW5jZXI7XG5cbiAgICAvLyDrqqjrjbjrs4TroZwg6re466O57ZmUXG4gICAgY29uc3QgYXBpc0J5TW9kZWwgPSBuZXcgTWFwPHN0cmluZywgRXh0ZW5kZWRBcGlbXT4oKTtcbiAgICBmb3IgKGNvbnN0IGFwaSBvZiBhcGlzKSB7XG4gICAgICBjb25zdCBtb2RlbE5hbWUgPSBhcGkubW9kZWxOYW1lLnJlcGxhY2UoL01vZGVsJC8sIFwiXCIpLnJlcGxhY2UoL0ZyYW1lJC8sIFwiXCIpO1xuICAgICAgaWYgKCFhcGlzQnlNb2RlbC5oYXMobW9kZWxOYW1lKSkge1xuICAgICAgICBhcGlzQnlNb2RlbC5zZXQobW9kZWxOYW1lLCBbXSk7XG4gICAgICB9XG4gICAgICBhcGlzQnlNb2RlbC5nZXQobW9kZWxOYW1lKT8ucHVzaChhcGkpO1xuICAgIH1cblxuICAgIGNvbnN0IGltcG9ydEtleXM6IHN0cmluZ1tdID0gW107XG4gICAgY29uc3QgbmFtZXNwYWNlczogc3RyaW5nW10gPSBbXTtcbiAgICBsZXQgdHlwZVBhcmFtTmFtZXM6IHN0cmluZ1tdID0gW107XG4gICAgY29uc3QgcmVzb2x2ZVdlYlNvY2tldEV2ZW50VHlwZURlZiA9IChcbiAgICAgIHR5cGVSZWY6IEFwaVBhcmFtVHlwZS5SZWYgfCB1bmRlZmluZWQsXG4gICAgICBzY2hlbWE6IFBhcmFtZXRlcnM8dHlwZW9mIHpvZFR5cGVUb1RzVHlwZURlZj5bMF0sXG4gICAgKTogc3RyaW5nID0+IHtcbiAgICAgIGlmICh0eXBlUmVmKSB7XG4gICAgICAgIGNvbnN0IGNhbmRpZGF0ZUltcG9ydEtleXM6IHN0cmluZ1tdID0gW107XG4gICAgICAgIGNvbnN0IGNhbmRpZGF0ZVR5cGVEZWYgPSBhcGlQYXJhbVR5cGVUb1RzVHlwZSh0eXBlUmVmLCBjYW5kaWRhdGVJbXBvcnRLZXlzKTtcblxuICAgICAgICB0cnkge1xuICAgICAgICAgIGZvciAoY29uc3Qga2V5IG9mIHVuaXF1ZShjYW5kaWRhdGVJbXBvcnRLZXlzKSkge1xuICAgICAgICAgICAgRW50aXR5TWFuYWdlci5nZXRNb2R1bGVQYXRoKGtleSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGltcG9ydEtleXMucHVzaCguLi5jYW5kaWRhdGVJbXBvcnRLZXlzKTtcbiAgICAgICAgICByZXR1cm4gY2FuZGlkYXRlVHlwZURlZjtcbiAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgLy8g66Gc7LusIGNvbnN0IOuTsSBpbXBvcnQg6rCA64ql7ZWcIOyLrOuzvOydtCDslYTri4jrqbQg6riw7KG0IGlubGluZSDsg53shLHsnLzroZwg7ZuE7Ye0XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHpvZFR5cGVUb1RzVHlwZURlZihzY2hlbWEpO1xuICAgIH07XG5cbiAgICBmb3IgKGNvbnN0IFttb2RlbE5hbWUsIG1vZGVsQXBpc10gb2YgYXBpc0J5TW9kZWwpIHtcbiAgICAgIGNvbnN0IGZ1bmN0aW9uczogc3RyaW5nW10gPSBbXTtcblxuICAgICAgZm9yIChjb25zdCBhcGkgb2YgbW9kZWxBcGlzKSB7XG4gICAgICAgIC8vIEBzdHJlYW0g642w7L2U66CI7J207YSw6rCAIOyeiOycvOuptCBTU0Ug7Iqk7Yq466a8IO2VqOyImCDsg53shLFcbiAgICAgICAgaWYgKGFwaS5zdHJlYW1PcHRpb25zKSB7XG4gICAgICAgICAgY29uc3QgcGFyYW1zV2l0aG91dENvbnRleHQgPSBhcGkucGFyYW1ldGVycy5maWx0ZXIoXG4gICAgICAgICAgICAocGFyYW0pID0+XG4gICAgICAgICAgICAgICFBcGlQYXJhbVR5cGUuaXNDb250ZXh0KHBhcmFtLnR5cGUpICYmXG4gICAgICAgICAgICAgICFBcGlQYXJhbVR5cGUuaXNSZWZLbmV4KHBhcmFtLnR5cGUpICYmXG4gICAgICAgICAgICAgICEocGFyYW0ub3B0aW9uYWwgJiYgcGFyYW0ubmFtZS5zdGFydHNXaXRoKFwiX1wiKSksXG4gICAgICAgICAgKTtcblxuICAgICAgICAgIGNvbnN0IGFwaUJhc2VVcmwgPSBgJHtTb25hbXUuY29uZmlnLmFwaS5yb3V0ZS5wcmVmaXh9JHthcGkucGF0aH1gO1xuXG4gICAgICAgICAgY29uc3QgbWV0aG9kTmFtZVN0cmVhbSA9IGFwaS5vcHRpb25zLnJlc291cmNlTmFtZVxuICAgICAgICAgICAgPyBgdXNlJHtpbmZsZWN0aW9uLmNhbWVsaXplKGFwaS5vcHRpb25zLnJlc291cmNlTmFtZSl9YFxuICAgICAgICAgICAgOiBgdXNlJHtpbmZsZWN0aW9uLmNhbWVsaXplKGFwaS5tZXRob2ROYW1lKX1gO1xuICAgICAgICAgIGNvbnN0IG1ldGhvZE5hbWVTdHJlYW1DYW1lbGl6ZWQgPSBpbmZsZWN0aW9uLmNhbWVsaXplKG1ldGhvZE5hbWVTdHJlYW0sIHRydWUpO1xuXG4gICAgICAgICAgY29uc3QgZXZlbnRzVHlwZURlZiA9IHpvZFR5cGVUb1RzVHlwZURlZihhcGkuc3RyZWFtT3B0aW9ucy5ldmVudHMpO1xuXG4gICAgICAgICAgLy8g7YyM652866+47YSw66W8IOqwneyytCDtmJXtg5zroZwg7KCV7J2YICjtg4DsnoXqs7wg7Iuk7KCcIOqwkiDrqqjrkZDsl5Ag7IKs7JqpKVxuICAgICAgICAgIGNvbnN0IHBhcmFtc0RlZkFzT2JqZWN0ID1cbiAgICAgICAgICAgIHBhcmFtc1dpdGhvdXRDb250ZXh0Lmxlbmd0aCA+IDBcbiAgICAgICAgICAgICAgPyBgeyAke3BhcmFtc1dpdGhvdXRDb250ZXh0Lm1hcCgocCkgPT4gYCR7cC5uYW1lfTogJHthcGlQYXJhbVR5cGVUb1RzVHlwZShwLnR5cGUsIGltcG9ydEtleXMpfWApLmpvaW4oXCIsIFwiKX0gfWBcbiAgICAgICAgICAgICAgOiBcInt9XCI7XG5cbiAgICAgICAgICBmdW5jdGlvbnMucHVzaChcbiAgICAgICAgICAgIGBcbmV4cG9ydCBmdW5jdGlvbiAke21ldGhvZE5hbWVTdHJlYW1DYW1lbGl6ZWR9KFxuICBwYXJhbXM6ICR7cGFyYW1zRGVmQXNPYmplY3R9LFxuICBoYW5kbGVyczogRXZlbnRIYW5kbGVyczwke2V2ZW50c1R5cGVEZWZ9ICYgeyBlbmQ/OiAoKSA9PiB2b2lkIH0+LFxuICBvcHRpb25zOiBTU0VTdHJlYW1PcHRpb25zXG4pIHtcbiAgcmV0dXJuIHVzZVNTRVN0cmVhbTwke2V2ZW50c1R5cGVEZWZ9PihcXGAke2FwaUJhc2VVcmx9XFxgLCBwYXJhbXMsIGhhbmRsZXJzLCBvcHRpb25zKTtcbn1cbiAgICAgICAgICAgIGAudHJpbSgpLFxuICAgICAgICAgICk7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoYXBpLndlYnNvY2tldE9wdGlvbnMpIHtcbiAgICAgICAgICAvLyB3ZWJzb2NrZXQgc3VyZmFjZeuKlCBmZXRjaCDtlajsiJgg64yA7IugIHR5cGVkIGhvb2vsnYQg7IOd7ISx7ZWoXG4gICAgICAgICAgY29uc3QgcGFyYW1zV2l0aG91dENvbnRleHQgPSBhcGkucGFyYW1ldGVycy5maWx0ZXIoXG4gICAgICAgICAgICAocGFyYW0pID0+XG4gICAgICAgICAgICAgICFBcGlQYXJhbVR5cGUuaXNDb250ZXh0KHBhcmFtLnR5cGUpICYmXG4gICAgICAgICAgICAgICFBcGlQYXJhbVR5cGUuaXNSZWZLbmV4KHBhcmFtLnR5cGUpICYmXG4gICAgICAgICAgICAgICEocGFyYW0ub3B0aW9uYWwgJiYgcGFyYW0ubmFtZS5zdGFydHNXaXRoKFwiX1wiKSksXG4gICAgICAgICAgKTtcblxuICAgICAgICAgIGNvbnN0IGFwaUJhc2VVcmwgPSBgJHtTb25hbXUuY29uZmlnLmFwaS5yb3V0ZS5wcmVmaXh9JHthcGkucGF0aH1gO1xuXG4gICAgICAgICAgY29uc3QgbWV0aG9kTmFtZVdlYlNvY2tldCA9IGFwaS5vcHRpb25zLnJlc291cmNlTmFtZVxuICAgICAgICAgICAgPyBgdXNlJHtpbmZsZWN0aW9uLmNhbWVsaXplKGFwaS5vcHRpb25zLnJlc291cmNlTmFtZSl9YFxuICAgICAgICAgICAgOiBgdXNlJHtpbmZsZWN0aW9uLmNhbWVsaXplKGFwaS5tZXRob2ROYW1lKX1gO1xuICAgICAgICAgIGNvbnN0IG1ldGhvZE5hbWVXZWJTb2NrZXRDYW1lbGl6ZWQgPSBpbmZsZWN0aW9uLmNhbWVsaXplKG1ldGhvZE5hbWVXZWJTb2NrZXQsIHRydWUpO1xuXG4gICAgICAgICAgLy8gb3V0RXZlbnRz64qUIOyImOyLoCDtg4DsnoUsIGluRXZlbnRz64qUIHNlbmQoKSDsnoXroKUg7YOA7J6F7Jy866GcIOyCrOyaqe2VqFxuICAgICAgICAgIGNvbnN0IG91dEV2ZW50c1R5cGVEZWYgPSByZXNvbHZlV2ViU29ja2V0RXZlbnRUeXBlRGVmKFxuICAgICAgICAgICAgYXBpLndlYnNvY2tldE9wdGlvbnMub3V0RXZlbnRzVHlwZVJlZixcbiAgICAgICAgICAgIGFwaS53ZWJzb2NrZXRPcHRpb25zLm91dEV2ZW50cyxcbiAgICAgICAgICApO1xuICAgICAgICAgIGNvbnN0IGluRXZlbnRzVHlwZURlZiA9IHJlc29sdmVXZWJTb2NrZXRFdmVudFR5cGVEZWYoXG4gICAgICAgICAgICBhcGkud2Vic29ja2V0T3B0aW9ucy5pbkV2ZW50c1R5cGVSZWYsXG4gICAgICAgICAgICBhcGkud2Vic29ja2V0T3B0aW9ucy5pbkV2ZW50cyxcbiAgICAgICAgICApO1xuXG4gICAgICAgICAgLy8gY29udGV4dC9yZWZLbmV4L2ludGVybmFsIG9wdGlvbmFsIO2MjOudvOuvuO2EsOuKlCDtgbTrnbzsnbTslrjtirgg7J6F66Cl7JeQ7IScIOygnOyZuO2VqFxuICAgICAgICAgIGNvbnN0IHBhcmFtc0RlZkFzT2JqZWN0ID1cbiAgICAgICAgICAgIHBhcmFtc1dpdGhvdXRDb250ZXh0Lmxlbmd0aCA+IDBcbiAgICAgICAgICAgICAgPyBgeyAke3BhcmFtc1dpdGhvdXRDb250ZXh0Lm1hcCgocCkgPT4gYCR7cC5uYW1lfTogJHthcGlQYXJhbVR5cGVUb1RzVHlwZShwLnR5cGUsIGltcG9ydEtleXMpfWApLmpvaW4oXCIsIFwiKX0gfWBcbiAgICAgICAgICAgICAgOiBcInt9XCI7XG5cbiAgICAgICAgICBmdW5jdGlvbnMucHVzaChcbiAgICAgICAgICAgIGBcbmV4cG9ydCBmdW5jdGlvbiAke21ldGhvZE5hbWVXZWJTb2NrZXRDYW1lbGl6ZWR9KFxuICBwYXJhbXM6ICR7cGFyYW1zRGVmQXNPYmplY3R9LFxuICBoYW5kbGVyczogRXZlbnRIYW5kbGVyczwke291dEV2ZW50c1R5cGVEZWZ9PixcbiAgb3B0aW9uczogV2ViU29ja2V0Q2hhbm5lbE9wdGlvbnMgPSB7fVxuKSB7XG4gIHJldHVybiB1c2VXZWJTb2NrZXRDaGFubmVsPCR7b3V0RXZlbnRzVHlwZURlZn0sICR7aW5FdmVudHNUeXBlRGVmfT4oXFxgJHthcGlCYXNlVXJsfVxcYCwgcGFyYW1zLCBoYW5kbGVycywgb3B0aW9ucyk7XG59XG4gICAgICAgICAgICBgLnRyaW0oKSxcbiAgICAgICAgICApO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQ29udGV4dCDsoJzsmbjtlZwg7YyM652866+47YSwXG4gICAgICAgIGNvbnN0IHBhcmFtc1dpdGhvdXRDb250ZXh0ID0gYXBpLnBhcmFtZXRlcnMuZmlsdGVyKFxuICAgICAgICAgIChwYXJhbSkgPT5cbiAgICAgICAgICAgICFBcGlQYXJhbVR5cGUuaXNDb250ZXh0KHBhcmFtLnR5cGUpICYmXG4gICAgICAgICAgICAhQXBpUGFyYW1UeXBlLmlzUmVmS25leChwYXJhbS50eXBlKSAmJlxuICAgICAgICAgICAgIShwYXJhbS5vcHRpb25hbCAmJiBwYXJhbS5uYW1lLnN0YXJ0c1dpdGgoXCJfXCIpKSxcbiAgICAgICAgKTtcblxuICAgICAgICAvLyDtg4DsnoUg7YyM652866+47YSwIOygleydmFxuICAgICAgICBjb25zdCB0eXBlUGFyYW1ldGVyc0FzVHNUeXBlID0gYXBpLnR5cGVQYXJhbWV0ZXJzXG4gICAgICAgICAgLm1hcCgodHlwZVBhcmFtKSA9PiBhcGlQYXJhbVR5cGVUb1RzVHlwZSh0eXBlUGFyYW0sIGltcG9ydEtleXMpKVxuICAgICAgICAgIC5qb2luKFwiLCBcIik7XG4gICAgICAgIGNvbnN0IHR5cGVQYXJhbXNEZWYgPSB0eXBlUGFyYW1ldGVyc0FzVHNUeXBlID8gYDwke3R5cGVQYXJhbWV0ZXJzQXNUc1R5cGV9PmAgOiBcIlwiO1xuICAgICAgICB0eXBlUGFyYW1OYW1lcyA9IHR5cGVQYXJhbU5hbWVzLmNvbmNhdChhcGkudHlwZVBhcmFtZXRlcnMubWFwKCh0cCkgPT4gdHAuaWQpKTtcblxuICAgICAgICAvLyDtjIzrnbzrr7jthLAg7KCV7J2YXG4gICAgICAgIGNvbnN0IHBhcmFtc0RlZiA9IGFwaVBhcmFtVG9Uc0NvZGUocGFyYW1zV2l0aG91dENvbnRleHQsIGltcG9ydEtleXMpO1xuICAgICAgICBjb25zdCBwYXJhbU5hbWVzID0gcGFyYW1zV2l0aG91dENvbnRleHQubWFwKChwKSA9PiBwLm5hbWUpLmpvaW4oXCIsIFwiKTtcblxuICAgICAgICAvLyDrpqzthLQg7YOA7J6FIOygleydmFxuICAgICAgICBjb25zdCByZXR1cm5UeXBlRGVmID0gYXBpUGFyYW1UeXBlVG9Uc1R5cGUoXG4gICAgICAgICAgYXNzZXJ0RGVmaW5lZCh1bndyYXBQcm9taXNlT25jZShhcGkucmV0dXJuVHlwZSkpLFxuICAgICAgICAgIGltcG9ydEtleXMsXG4gICAgICAgICk7XG5cbiAgICAgICAgLy8g6riw67O4IFVSTFxuICAgICAgICBjb25zdCBhcGlCYXNlVXJsID0gYCR7U29uYW11LmNvbmZpZy5hcGkucm91dGUucHJlZml4fSR7YXBpLnBhdGh9YDtcblxuICAgICAgICBjb25zdCBjbGllbnRzID0gYXBpLm9wdGlvbnMuY2xpZW50cyB8fCBbXTtcblxuICAgICAgICAvLyAxLiBheGlvcyDtlajsiJgg7IOd7ISxXG4gICAgICAgIC8vIHJlc291cmNlTmFtZeydtCDsnojsnLzrqbQgZ2V0ICsgcmVzb3VyY2VOYW1lIO2Yle2DnOuhnCDtlajsiJjrqoUg7IOd7ISxXG4gICAgICAgIGNvbnN0IG1ldGhvZE5hbWUgPSBhcGkub3B0aW9ucy5yZXNvdXJjZU5hbWVcbiAgICAgICAgICA/IGBnZXQke2luZmxlY3Rpb24uY2FtZWxpemUoYXBpLm9wdGlvbnMucmVzb3VyY2VOYW1lKX1gXG4gICAgICAgICAgOiBhcGkubWV0aG9kTmFtZTtcblxuICAgICAgICAvLyBheGlvcy1tdWx0aXBhcnQg7LKY66asICjtjIzsnbwg7JeF66Gc65OcKVxuICAgICAgICBpZiAoY2xpZW50cy5pbmNsdWRlcyhcImF4aW9zLW11bHRpcGFydFwiKSkge1xuICAgICAgICAgIGNvbnN0IGZvcm1EYXRhQXBwZW5kID0gYGZpbGVzLmZvckVhY2goZiA9PiB7IGZvcm1EYXRhLmFwcGVuZChcImZpbGVzXCIsIGYpOyB9KTtgO1xuXG4gICAgICAgICAgY29uc3Qgb3RoZXJQYXJhbXNBcHBlbmQgPSBwYXJhbXNXaXRob3V0Q29udGV4dFxuICAgICAgICAgICAgLm1hcCgocGFyYW0pID0+IHtcbiAgICAgICAgICAgICAgLy8gcHJpbWl0aXZlIO2DgOyeheyduOyngCDssrTtgaxcbiAgICAgICAgICAgICAgY29uc3QgaXNQcmltaXRpdmUgPVxuICAgICAgICAgICAgICAgIGlzU3RyaW5nVmFsdWUocGFyYW0udHlwZSkgJiYgW1wic3RyaW5nXCIsIFwibnVtYmVyXCIsIFwiYm9vbGVhblwiXS5pbmNsdWRlcyhwYXJhbS50eXBlKTtcblxuICAgICAgICAgICAgICBpZiAoaXNQcmltaXRpdmUpIHtcbiAgICAgICAgICAgICAgICAvLyBwcmltaXRpdmU6IOyngeygkSBmb3JtRGF0YS5hcHBlbmRcbiAgICAgICAgICAgICAgICByZXR1cm4gYGZvcm1EYXRhLmFwcGVuZCgnJHtwYXJhbS5uYW1lfScsIFN0cmluZygke3BhcmFtLm5hbWV9KSk7YDtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyBvYmplY3Q6IHRvRm9ybURhdGEg7IKs7JqpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGB0b0Zvcm1EYXRhKCR7cGFyYW0ubmFtZX0sIGZvcm1EYXRhLCAnJHtwYXJhbS5uYW1lfScpO2A7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAuam9pbihcIlxcbiAgICBcIik7XG5cbiAgICAgICAgICBjb25zdCBwYXJhbXNEZWZDb21tYSA9IHBhcmFtc0RlZiAhPT0gXCJcIiA/IFwiLCBcIiA6IFwiXCI7XG4gICAgICAgICAgZnVuY3Rpb25zLnB1c2goXG4gICAgICAgICAgICBgXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gJHttZXRob2ROYW1lfSR7dHlwZVBhcmFtc0RlZn0oXG4gICR7cGFyYW1zRGVmfSR7cGFyYW1zRGVmQ29tbWF9XG4gIGZpbGVzOiBGaWxlW10sXG4gIG9uVXBsb2FkUHJvZ3Jlc3M/OiAocGU6IEF4aW9zUHJvZ3Jlc3NFdmVudCkgPT4gdm9pZFxuKTogUHJvbWlzZTwke3JldHVyblR5cGVEZWZ9PiB7XG4gIGNvbnN0IGZvcm1EYXRhID0gbmV3IEZvcm1EYXRhKCk7XG4gICR7Zm9ybURhdGFBcHBlbmR9XG4gICR7b3RoZXJQYXJhbXNBcHBlbmR9XG4gIHJldHVybiBmZXRjaCh7XG4gICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgdXJsOiBcXGAke2FwaUJhc2VVcmx9XFxgLFxuICAgIG9uVXBsb2FkUHJvZ3Jlc3MsXG4gICAgZGF0YTogZm9ybURhdGEsXG4gICAgJHthcGkub3B0aW9ucy50aW1lb3V0ID8gYHNpZ25hbDogQWJvcnRTaWduYWwudGltZW91dCgke2FwaS5vcHRpb25zLnRpbWVvdXR9KSxgIDogXCJcIn1cbiAgfSk7XG59XG4gICAgICAgICAgYC50cmltKCksXG4gICAgICAgICAgKTtcbiAgICAgICAgfSBlbHNlIGlmIChhcGkub3B0aW9ucy5odHRwTWV0aG9kID09PSBcIkdFVFwiKSB7XG4gICAgICAgICAgY29uc3QgaGFzUGFyYW1zID0gcGFyYW1zV2l0aG91dENvbnRleHQubGVuZ3RoID4gMDtcbiAgICAgICAgICBmdW5jdGlvbnMucHVzaChcbiAgICAgICAgICAgIGBcbmV4cG9ydCBhc3luYyBmdW5jdGlvbiAke21ldGhvZE5hbWV9JHt0eXBlUGFyYW1zRGVmfSgke3BhcmFtc0RlZn0pOiBQcm9taXNlPCR7cmV0dXJuVHlwZURlZn0+IHtcbiAgcmV0dXJuIGZldGNoKHtcbiAgICBtZXRob2Q6IFwiR0VUXCIsXG4gICAgdXJsOiBcXGAke2FwaUJhc2VVcmx9JHtoYXNQYXJhbXMgPyBgP1xcJHtxcy5zdHJpbmdpZnkoeyAke3BhcmFtTmFtZXN9IH0pfWAgOiBcIlwifVxcYCxcbiAgICAke2FwaS5vcHRpb25zLnRpbWVvdXQgPyBgc2lnbmFsOiBBYm9ydFNpZ25hbC50aW1lb3V0KCR7YXBpLm9wdGlvbnMudGltZW91dH0pLGAgOiBcIlwifVxuICB9KTtcbn1cbiAgICAgICAgICBgLnRyaW0oKSxcbiAgICAgICAgICApO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbnN0IGhhc1BhcmFtcyA9IHBhcmFtc1dpdGhvdXRDb250ZXh0Lmxlbmd0aCA+IDA7XG4gICAgICAgICAgZnVuY3Rpb25zLnB1c2goXG4gICAgICAgICAgICBgXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gJHttZXRob2ROYW1lfSR7dHlwZVBhcmFtc0RlZn0oJHtwYXJhbXNEZWZ9KTogUHJvbWlzZTwke3JldHVyblR5cGVEZWZ9PiB7XG4gIHJldHVybiBmZXRjaCh7XG4gICAgbWV0aG9kOiBcIiR7YXBpLm9wdGlvbnMuaHR0cE1ldGhvZH1cIixcbiAgICB1cmw6IFxcYCR7YXBpQmFzZVVybH1cXGAsXG4gICAgJHtoYXNQYXJhbXMgPyBgZGF0YTogeyAke3BhcmFtTmFtZXN9IH0sYCA6IFwiXCJ9XG4gICAgJHthcGkub3B0aW9ucy50aW1lb3V0ID8gYHNpZ25hbDogQWJvcnRTaWduYWwudGltZW91dCgke2FwaS5vcHRpb25zLnRpbWVvdXR9KSxgIDogXCJcIn1cbiAgfSk7XG59XG4gICAgICAgICAgYC50cmltKCksXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIDIuIHF1ZXJ5T3B0aW9ucyArIHVzZVF1ZXJ5ICh0YW5zdGFjay1xdWVyeSlcbiAgICAgICAgaWYgKGNsaWVudHMuaW5jbHVkZXMoXCJ0YW5zdGFjay1xdWVyeVwiKSkge1xuICAgICAgICAgIGNvbnN0IGhvb2tOYW1lID0gYXBpLm9wdGlvbnMucmVzb3VyY2VOYW1lXG4gICAgICAgICAgICA/IGluZmxlY3Rpb24uY2FtZWxpemUoYXBpLm9wdGlvbnMucmVzb3VyY2VOYW1lLCB0cnVlKVxuICAgICAgICAgICAgOiBpbmZsZWN0aW9uLmNhbWVsaXplKGFwaS5tZXRob2ROYW1lLCB0cnVlKTtcblxuICAgICAgICAgIC8vIHF1ZXJ5T3B0aW9uc1xuICAgICAgICAgIGZ1bmN0aW9ucy5wdXNoKFxuICAgICAgICAgICAgYFxuZXhwb3J0IGNvbnN0ICR7bWV0aG9kTmFtZX1RdWVyeU9wdGlvbnMgPSAke3R5cGVQYXJhbXNEZWZ9KCR7cGFyYW1zRGVmfSkgPT4gcXVlcnlPcHRpb25zKHtcbiAgcXVlcnlLZXk6IFsnJHttb2RlbE5hbWV9JywgJyR7bWV0aG9kTmFtZX0nJHtwYXJhbU5hbWVzID8gYCwgJHtwYXJhbU5hbWVzfWAgOiBcIlwifV0sXG4gIHF1ZXJ5Rm46ICgpID0+ICR7bWV0aG9kTmFtZX0oJHtwYXJhbU5hbWVzfSlcbn0pO1xuICAgICAgICAgIGAudHJpbSgpLFxuICAgICAgICAgICk7XG5cbiAgICAgICAgICAvLyB1c2VRdWVyeSBob29rICh1c2VSZWZyZXNoYWJsZeuhnCDrnpjtlZHtlbQgcmVmcmVzaC9pc1JlZnJlc2hpbmfsnYQg6riw67O4IOygnOqztSlcbiAgICAgICAgICBmdW5jdGlvbnMucHVzaChcbiAgICAgICAgICAgIGBcbmV4cG9ydCBjb25zdCB1c2Uke2luZmxlY3Rpb24uY2FtZWxpemUoaG9va05hbWUpfSA9ICR7dHlwZVBhcmFtc0RlZn0oJHtwYXJhbXNEZWZ9JHtcbiAgICAgICAgICAgICAgcGFyYW1zRGVmID8gXCIsIFwiIDogXCJcIlxuICAgICAgICAgICAgfW9wdGlvbnM/OiB7IGVuYWJsZWQ/OiBib29sZWFuIH0pID0+XG4gIHVzZVJlZnJlc2hhYmxlKHVzZVF1ZXJ5KHtcbiAgICAuLi4ke21ldGhvZE5hbWV9UXVlcnlPcHRpb25zKCR7cGFyYW1OYW1lc30pLFxuICAgIC4uLm9wdGlvbnNcbiAgfSkpO1xuICAgICAgICAgIGAudHJpbSgpLFxuICAgICAgICAgICk7XG5cbiAgICAgICAgICAvLyBpbmZpbml0ZVF1ZXJ5T3B0aW9ucyArIHVzZUluZmluaXRlUXVlcnkgKEFzeW5jSWRDb25maWcudXNlTGlzdEluZmluaXRlIOuMgOyDgSDsobDqsbQpXG4gICAgICAgICAgLy8g7KGw6rG0OiByZXNvdXJjZU5hbWXsnbQg67O17IiY7ZiV7J206rOgIG1ldGhvZE5hbWUgPT09IFwiZmluZE1hbnlcIlxuICAgICAgICAgIGNvbnN0IHJlc291cmNlTmFtZSA9IGFwaS5vcHRpb25zLnJlc291cmNlTmFtZTtcbiAgICAgICAgICBjb25zdCBpc0luZmluaXRlVGFyZ2V0ID1cbiAgICAgICAgICAgICEhcmVzb3VyY2VOYW1lICYmXG4gICAgICAgICAgICBpbmZsZWN0aW9uLnBsdXJhbGl6ZShyZXNvdXJjZU5hbWUpID09PSByZXNvdXJjZU5hbWUgJiZcbiAgICAgICAgICAgIGFwaS5tZXRob2ROYW1lID09PSBcImZpbmRNYW55XCI7XG5cbiAgICAgICAgICBpZiAoaXNJbmZpbml0ZVRhcmdldCkge1xuICAgICAgICAgICAgY29uc3QgaW5maW5pdGVNZXRob2ROYW1lID0gYCR7bWV0aG9kTmFtZX1JbmZpbml0ZWA7XG4gICAgICAgICAgICBjb25zdCBpbmZpbml0ZUhvb2tOYW1lID0gYHVzZSR7aW5mbGVjdGlvbi5jYW1lbGl6ZShob29rTmFtZSl9SW5maW5pdGVgO1xuXG4gICAgICAgICAgICBmdW5jdGlvbnMucHVzaChcbiAgICAgICAgICAgICAgYFxuZXhwb3J0IGNvbnN0ICR7aW5maW5pdGVNZXRob2ROYW1lfVF1ZXJ5T3B0aW9ucyA9ICR7dHlwZVBhcmFtc0RlZn0oJHtwYXJhbXNEZWZ9KSA9PiBpbmZpbml0ZVF1ZXJ5T3B0aW9ucyh7XG4gIHF1ZXJ5S2V5OiBbJyR7bW9kZWxOYW1lfScsICcke21ldGhvZE5hbWV9JywgJ2luZmluaXRlJyR7cGFyYW1OYW1lcyA/IGAsICR7cGFyYW1OYW1lc31gIDogXCJcIn1dLFxuICBxdWVyeUZuOiAoeyBwYWdlUGFyYW0gfSkgPT4gJHttZXRob2ROYW1lfSgke1xuICAgIHBhcmFtTmFtZXMgPyBwYXJhbU5hbWVzLnJlcGxhY2UoL1xcYnJhd1BhcmFtc1xcYi8sIFwieyAuLi5yYXdQYXJhbXMsIHBhZ2U6IHBhZ2VQYXJhbSB9XCIpIDogXCJcIlxuICB9KSxcbiAgaW5pdGlhbFBhZ2VQYXJhbTogMSBhcyBudW1iZXIsXG4gIGdldE5leHRQYWdlUGFyYW06IChsYXN0UGFnZSwgYWxsUGFnZXMpID0+IHtcbiAgICBjb25zdCB0b3RhbCA9IChsYXN0UGFnZSBhcyB7IHRvdGFsPzogbnVtYmVyIH0pPy50b3RhbCA/PyAwO1xuICAgIGNvbnN0IGxvYWRlZCA9IGFsbFBhZ2VzLnJlZHVjZShcbiAgICAgIChzdW0sIHApID0+IHN1bSArICgocCBhcyB7IHJvd3M/OiB1bmtub3duW10gfSk/LnJvd3M/Lmxlbmd0aCA/PyAwKSxcbiAgICAgIDAsXG4gICAgKTtcbiAgICByZXR1cm4gbG9hZGVkIDwgdG90YWwgPyBhbGxQYWdlcy5sZW5ndGggKyAxIDogdW5kZWZpbmVkO1xuICB9LFxuICBzZWxlY3Q6IGRlZHVwZUFuZEZsYXR0ZW4sXG59KTtcbiAgICAgICAgICBgLnRyaW0oKSxcbiAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgIGZ1bmN0aW9ucy5wdXNoKFxuICAgICAgICAgICAgICBgXG5leHBvcnQgY29uc3QgJHtpbmZpbml0ZUhvb2tOYW1lfSA9ICR7dHlwZVBhcmFtc0RlZn0oJHtwYXJhbXNEZWZ9JHtcbiAgICAgICAgICAgICAgICBwYXJhbXNEZWYgPyBcIiwgXCIgOiBcIlwiXG4gICAgICAgICAgICAgIH1vcHRpb25zPzogeyBlbmFibGVkPzogYm9vbGVhbiB9KSA9PlxuICB1c2VSZWZyZXNoYWJsZSh1c2VJbmZpbml0ZVF1ZXJ5KHtcbiAgICAuLi4ke2luZmluaXRlTWV0aG9kTmFtZX1RdWVyeU9wdGlvbnMoJHtwYXJhbU5hbWVzfSksXG4gICAgLi4ub3B0aW9uc1xuICB9KSk7XG4gICAgICAgICAgYC50cmltKCksXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIDMuIHVzZU11dGF0aW9uICh0YW5zdGFjay1tdXRhdGlvbilcbiAgICAgICAgaWYgKGNsaWVudHMuaW5jbHVkZXMoXCJ0YW5zdGFjay1tdXRhdGlvblwiKSkge1xuICAgICAgICAgIGNvbnN0IGhvb2tOYW1lID0gaW5mbGVjdGlvbi5jYW1lbGl6ZShhcGkubWV0aG9kTmFtZSk7XG4gICAgICAgICAgY29uc3QgbXV0YXRpb25QYXJhbVR5cGUgPVxuICAgICAgICAgICAgcGFyYW1zV2l0aG91dENvbnRleHQubGVuZ3RoID4gMFxuICAgICAgICAgICAgICA/IGB7ICR7cGFyYW1zV2l0aG91dENvbnRleHRcbiAgICAgICAgICAgICAgICAgIC5tYXAoKHApID0+IGAke3AubmFtZX06ICR7YXBpUGFyYW1UeXBlVG9Uc1R5cGUocC50eXBlLCBbXSl9YClcbiAgICAgICAgICAgICAgICAgIC5qb2luKFwiLCBcIil9IH1gXG4gICAgICAgICAgICAgIDogXCJ2b2lkXCI7XG4gICAgICAgICAgY29uc3QgbXV0YXRpb25QYXJhbU5hbWVzID1cbiAgICAgICAgICAgIHBhcmFtc1dpdGhvdXRDb250ZXh0Lmxlbmd0aCA+IDBcbiAgICAgICAgICAgICAgPyBwYXJhbXNXaXRob3V0Q29udGV4dC5tYXAoKHApID0+IGBwYXJhbXMuJHtwLm5hbWV9YCkuam9pbihcIiwgXCIpXG4gICAgICAgICAgICAgIDogXCJcIjtcblxuICAgICAgICAgIGZ1bmN0aW9ucy5wdXNoKFxuICAgICAgICAgICAgYFxuZXhwb3J0IGNvbnN0IHVzZSR7aG9va05hbWV9TXV0YXRpb24gPSAke3R5cGVQYXJhbXNEZWZ9KCkgPT4gdXNlTXV0YXRpb24oe1xuICBtdXRhdGlvbkZuOiAocGFyYW1zOiAke211dGF0aW9uUGFyYW1UeXBlfSkgPT4gJHttb2RlbE5hbWV9U2VydmljZS4ke21ldGhvZE5hbWV9KCR7bXV0YXRpb25QYXJhbU5hbWVzfSlcbn0pO1xuICAgICAgICAgIGAudHJpbSgpLFxuICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyA0LiB1c2VNdXRhdGlvbiB3aXRoIG11bHRpcGFydCAodGFuc3RhY2stbXV0YXRpb24tbXVsdGlwYXJ0KVxuICAgICAgICBpZiAoY2xpZW50cy5pbmNsdWRlcyhcInRhbnN0YWNrLW11dGF0aW9uLW11bHRpcGFydFwiKSkge1xuICAgICAgICAgIGNvbnN0IGhvb2tOYW1lID0gaW5mbGVjdGlvbi5jYW1lbGl6ZShhcGkubWV0aG9kTmFtZSk7XG5cbiAgICAgICAgICAvLyDtjIzrnbzrr7jthLAg7YOA7J6FIOygleydmDogcGFyYW1zRGVm7JeQ7IScIO2DgOyeheunjCDstpTstpxcbiAgICAgICAgICAvLyBwYXJhbXNEZWYg7JiIOiBcInBhcmFtczogeyBjYXRlZ29yeTogc3RyaW5nIH1cIiDihpIgXCJ7IGNhdGVnb3J5OiBzdHJpbmcgfVwiXG4gICAgICAgICAgY29uc3QgcGFyYW1zVHlwZURlZiA9XG4gICAgICAgICAgICBwYXJhbXNXaXRob3V0Q29udGV4dC5sZW5ndGggPiAwXG4gICAgICAgICAgICAgID8gcGFyYW1zRGVmLnNwbGl0KFwiOlwiKS5zbGljZSgxKS5qb2luKFwiOlwiKS50cmltKCkgLy8gXCJwYXJhbXM6IHsgY2F0ZWdvcnk6IHN0cmluZyB9XCIg4oaSIFwieyBjYXRlZ29yeTogc3RyaW5nIH1cIlxuICAgICAgICAgICAgICA6IFwiXCI7XG5cbiAgICAgICAgICBjb25zdCBtdXRhdGlvblBhcmFtVHlwZSA9XG4gICAgICAgICAgICBwYXJhbXNXaXRob3V0Q29udGV4dC5sZW5ndGggPiAwXG4gICAgICAgICAgICAgID8gYHsgcGFyYW1zOiAke3BhcmFtc1R5cGVEZWZ9LCBmaWxlczogRmlsZVtdIH1gXG4gICAgICAgICAgICAgIDogYHsgZmlsZXM6IEZpbGVbXSB9YDtcblxuICAgICAgICAgIC8vIG11dGF0aW9uRm4g7Zi47LacIO2MjOudvOuvuO2EsFxuICAgICAgICAgIGNvbnN0IG11dGF0aW9uRm5DYWxsID1cbiAgICAgICAgICAgIHBhcmFtc1dpdGhvdXRDb250ZXh0Lmxlbmd0aCA+IDBcbiAgICAgICAgICAgICAgPyBgJHttb2RlbE5hbWV9U2VydmljZS4ke21ldGhvZE5hbWV9KHBhcmFtcy5wYXJhbXMsIHBhcmFtcy5maWxlcylgXG4gICAgICAgICAgICAgIDogYCR7bW9kZWxOYW1lfVNlcnZpY2UuJHttZXRob2ROYW1lfShwYXJhbXMuZmlsZXMpYDtcblxuICAgICAgICAgIGZ1bmN0aW9ucy5wdXNoKFxuICAgICAgICAgICAgYFxuZXhwb3J0IGNvbnN0IHVzZSR7aG9va05hbWV9TXV0YXRpb24gPSAke3R5cGVQYXJhbXNEZWZ9KFxuICBvcHRpb25zPzogVXNlTXV0YXRpb25PcHRpb25zPCR7cmV0dXJuVHlwZURlZn0sIEVycm9yLCAke211dGF0aW9uUGFyYW1UeXBlfT4gJiB7XG4gICAgb25VcGxvYWRQcm9ncmVzcz86IChlOiBBeGlvc1Byb2dyZXNzRXZlbnQpID0+IHZvaWQ7XG4gIH1cbikgPT4gdXNlTXV0YXRpb24oe1xuICBtdXRhdGlvbkZuOiAocGFyYW1zOiAke211dGF0aW9uUGFyYW1UeXBlfSkgPT4gJHttdXRhdGlvbkZuQ2FsbH0sXG4gIHJldHJ5OiBmYWxzZSxcbiAgLi4ub3B0aW9ucyxcbn0pO1xuICAgICAgICAgIGAudHJpbSgpLFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgbmFtZXNwYWNlcy5wdXNoKFxuICAgICAgICBgXG5leHBvcnQgbmFtZXNwYWNlICR7bW9kZWxOYW1lfVNlcnZpY2Uge1xuJHtmdW5jdGlvbnMuam9pbihcIlxcblxcblwiKX1cbn1cbiAgICAgIGAudHJpbSgpLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICAvLyBBc3luY0lkQ29uZmlnIOyDneyEsSAoRW50aXR567OE66GcKVxuICAgIGNvbnN0IGVudGl0eUlkcyA9IEVudGl0eU1hbmFnZXIuZ2V0QWxsSWRzKCk7XG4gICAgY29uc3QgYXN5bmNJZENvbmZpZ3M6IHN0cmluZ1tdID0gW107XG5cbiAgICBmb3IgKGNvbnN0IGVudGl0eUlkIG9mIGVudGl0eUlkcykge1xuICAgICAgY29uc3QgbmFtZXMgPSBFbnRpdHlNYW5hZ2VyLmdldE5hbWVzRnJvbUlkKGVudGl0eUlkKTtcblxuICAgICAgLy8gQXN5bmNJZENvbmZpZ+yaqSDrpqzsiqTtirgg7KGw7ZqMIEFQSSDssL7quLBcbiAgICAgIGNvbnN0IGxpc3RBcGkgPSBhcGlzQnlNb2RlbC5nZXQobmFtZXMuY2FwaXRhbCk/LmZpbmQoKGFwaSkgPT4ge1xuICAgICAgICAvLyByZXNvdXJjZU5hbWXsnbQg7JeG6rGw64KYIHRhbnN0YWNrLXF1ZXJ566W8IOyCrOyaqe2VmOyngCDslYrripQgQVBJ64qUIOygnOyZuFxuICAgICAgICBpZiAoIWFwaS5vcHRpb25zLnJlc291cmNlTmFtZSB8fCAhYXBpLm9wdGlvbnMuY2xpZW50cz8uaW5jbHVkZXMoXCJ0YW5zdGFjay1xdWVyeVwiKSkge1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICAvLyByZXNvdXJjZU5hbWXsnbQg67O17IiY7ZiV7J206rOgIOuplOyEnOuTnOuqheydtCBmaW5kTWFueeyduCBBUElcbiAgICAgICAgY29uc3QgcmVzb3VyY2VOYW1lID0gYXBpLm9wdGlvbnMucmVzb3VyY2VOYW1lO1xuICAgICAgICByZXR1cm4gaW5mbGVjdGlvbi5wbHVyYWxpemUocmVzb3VyY2VOYW1lKSA9PT0gcmVzb3VyY2VOYW1lICYmIGFwaS5tZXRob2ROYW1lID09PSBcImZpbmRNYW55XCI7XG4gICAgICB9KTtcblxuICAgICAgaWYgKGxpc3RBcGkpIHtcbiAgICAgICAgLy8gcmVzb3VyY2VOYW1l7JeQ7IScIGhvb2sg7J2066aEIOyDneyEsSAo6riw7KG0IOuhnOyngeqzvCDrj5nsnbwpXG4gICAgICAgIGNvbnN0IGhvb2tOYW1lID0gaW5mbGVjdGlvbi5jYW1lbGl6ZShhc3NlcnREZWZpbmVkKGxpc3RBcGkub3B0aW9ucy5yZXNvdXJjZU5hbWUpLCB0cnVlKTtcbiAgICAgICAgY29uc3QgdXNlSG9va05hbWUgPSBgdXNlJHtpbmZsZWN0aW9uLmNhbWVsaXplKGhvb2tOYW1lKX1gO1xuICAgICAgICBjb25zdCB1c2VIb29rSW5maW5pdGVOYW1lID0gYCR7dXNlSG9va05hbWV9SW5maW5pdGVgO1xuXG4gICAgICAgIC8vIExpc3RQYXJhbXMg7YOA7J6F66qFIOq1rOyEsVxuICAgICAgICBjb25zdCBsaXN0UGFyYW1zVHlwZSA9IGAke25hbWVzLmNhcGl0YWx9TGlzdFBhcmFtc2A7XG5cbiAgICAgICAgYXN5bmNJZENvbmZpZ3MucHVzaChcbiAgICAgICAgICBgXG4vLyBBc3luY0lkQ29uZmlnOiAke25hbWVzLmNhcGl0YWx9XG5leHBvcnQgY29uc3QgJHtuYW1lcy5jYXBpdGFsfUFzeW5jSWRDb25maWc6IEFzeW5jSWRDb25maWc8JHtuYW1lcy5jYXBpdGFsfVN1YnNldEtleSwgJHtuYW1lcy5jYXBpdGFsfVN1YnNldE1hcHBpbmcsICR7bGlzdFBhcmFtc1R5cGV9PiA9IHtcbiAgcGxhY2Vob2xkZXJLZXk6IFwiZW50aXR5LiR7bmFtZXMuY2FwaXRhbH1cIixcbiAgdXNlTGlzdDogJHtuYW1lcy5jYXBpdGFsfVNlcnZpY2UuJHt1c2VIb29rTmFtZX0sXG4gIHVzZUxpc3RJbmZpbml0ZTogJHtuYW1lcy5jYXBpdGFsfVNlcnZpY2UuJHt1c2VIb29rSW5maW5pdGVOYW1lfSxcbn07XG4gICAgICAgICAgYC50cmltKCksXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gQlVJTFRfSU5fVFlQRVPsl5DshJwg7IKs7Jqp65CY64qUIO2DgOyeheuTpOydhCDtmZXsnbjtlZjsl6wg64+Z7KCB7Jy866GcIGltcG9ydCDqtazshLFcbiAgICBjb25zdCBidWlsdEluVHlwZUltcG9ydHMgPSBPYmplY3Qua2V5cyhCVUlMVF9JTl9UWVBFUylcbiAgICAgIC5maWx0ZXIoKHR5cGVLZXkpID0+IGltcG9ydEtleXMuaW5jbHVkZXModHlwZUtleSkpXG4gICAgICAubWFwKCh0eXBlS2V5KSA9PiBgdHlwZSAke3R5cGVLZXl9YCk7XG5cbiAgICAvLyBzb25hbXUuc2hhcmVk7JeQ7IScIGltcG9ydO2VoCDtla3rqqnrk6TsnYQg64+Z7KCB7Jy866GcIOq1rOyEsVxuICAgIC8vIGJvZHkg66y47J6Q7Je07J2EIOq4sOykgOycvOuhnCBpbmZpbml0ZSDtm4Ug7IOd7ISxIOyXrOu2gCDtjJDri6ggKGZpbmRNYW55IOuzteyImO2YlSDrtoTquLDsl5DshJzrp4wg7LC47KGw65CoKVxuICAgIGNvbnN0IGJvZHlGb3JJbXBvcnRDaGVjayA9IG5hbWVzcGFjZXMuam9pbihcIlxcblxcblwiKTtcbiAgICBjb25zdCBuZWVkc0RlZHVwZUFuZEZsYXR0ZW4gPSBib2R5Rm9ySW1wb3J0Q2hlY2suaW5jbHVkZXMoXCJkZWR1cGVBbmRGbGF0dGVuXCIpO1xuICAgIGNvbnN0IG5lZWRzVXNlUmVmcmVzaGFibGUgPSBib2R5Rm9ySW1wb3J0Q2hlY2suaW5jbHVkZXMoXCJ1c2VSZWZyZXNoYWJsZVwiKTtcblxuICAgIGNvbnN0IHNvbmFtdVNoYXJlZEltcG9ydHMgPSBbXG4gICAgICBcInR5cGUgTGlzdFJlc3VsdFwiLFxuICAgICAgXCJ0eXBlIEZpbHRlclF1ZXJ5XCIsXG4gICAgICAuLi5idWlsdEluVHlwZUltcG9ydHMsXG4gICAgICBcImZldGNoXCIsXG4gICAgICBcInR5cGUgRXZlbnRIYW5kbGVyc1wiLFxuICAgICAgXCJ0eXBlIFNTRVN0cmVhbU9wdGlvbnNcIixcbiAgICAgIFwidHlwZSBXZWJTb2NrZXRDaGFubmVsT3B0aW9uc1wiLFxuICAgICAgXCJ1c2VTU0VTdHJlYW1cIixcbiAgICAgIFwidXNlV2ViU29ja2V0Q2hhbm5lbFwiLFxuICAgICAgXCJ0b0Zvcm1EYXRhXCIsXG4gICAgICAuLi4obmVlZHNEZWR1cGVBbmRGbGF0dGVuID8gW1wiZGVkdXBlQW5kRmxhdHRlblwiXSA6IFtdKSxcbiAgICAgIC4uLihuZWVkc1VzZVJlZnJlc2hhYmxlID8gW1widXNlUmVmcmVzaGFibGVcIl0gOiBbXSksXG4gICAgXS5qb2luKFwiLCBcIik7XG5cbiAgICAvLyBib2R5IOq1rOyEsTogbmFtZXNwYWNlcyArIGFzeW5jSWRDb25maWdzXG4gICAgY29uc3QgYm9keVBhcnRzID0gWy4uLm5hbWVzcGFjZXMsIC4uLmFzeW5jSWRDb25maWdzXTtcblxuICAgIHJldHVybiB7XG4gICAgICAuLi50aGlzLmdldFRhcmdldEFuZFBhdGgoKSxcbiAgICAgIGJvZHk6IGJvZHlQYXJ0cy5qb2luKFwiXFxuXFxuXCIpLFxuICAgICAgaW1wb3J0S2V5czogZGlmZih1bmlxdWUoaW1wb3J0S2V5cyksIFtcbiAgICAgICAgLi4udHlwZVBhcmFtTmFtZXMsXG4gICAgICAgIFwiTGlzdFJlc3VsdFwiLFxuICAgICAgICAuLi5PYmplY3Qua2V5cyhCVUlMVF9JTl9UWVBFUyksXG4gICAgICBdKSxcbiAgICAgIGN1c3RvbUhlYWRlcnM6IFtcbiAgICAgICAgXCIvKipcIixcbiAgICAgICAgXCIgKiBAZ2VuZXJhdGVkXCIsXG4gICAgICAgIFwiICog7KeB7KCRIOyImOygle2VmOyngCDrp4jshLjsmpQuXCIsXG4gICAgICAgIFwiICovXCIsXG4gICAgICAgIFwiXCIsXG4gICAgICAgIFwiLyogb3hsaW50LWRpc2FibGUgKi9cIixcbiAgICAgICAgXCJcIixcbiAgICAgICAgYGltcG9ydCB7IHF1ZXJ5T3B0aW9ucywgdXNlUXVlcnksIHVzZUluZmluaXRlUXVlcnksIGluZmluaXRlUXVlcnlPcHRpb25zLCB1c2VNdXRhdGlvbiwgdHlwZSBVc2VNdXRhdGlvbk9wdGlvbnMgfSBmcm9tICdAdGFuc3RhY2svcmVhY3QtcXVlcnknO2AsXG4gICAgICAgIGBpbXBvcnQgeyB0eXBlIEF4aW9zUHJvZ3Jlc3NFdmVudCB9IGZyb20gJ2F4aW9zJztgLFxuICAgICAgICBgaW1wb3J0IHFzIGZyb20gJ3FzJztgLFxuICAgICAgICBgaW1wb3J0IHsgJHtzb25hbXVTaGFyZWRJbXBvcnRzfSB9IGZyb20gJy4vc29uYW11LnNoYXJlZCc7YCxcbiAgICAgICAgYGltcG9ydCB7IHR5cGUgQXN5bmNJZENvbmZpZyB9IGZyb20gJ0Bzb25hbXUta2l0L3JlYWN0LWNvbXBvbmVudHMvY29tcG9uZW50cyc7YCxcbiAgICAgIF0sXG4gICAgfTtcbiAgfVxufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7OztxQkFPa0M7WUFFTztvQkFDa0I7V0FFWDttQkFDUztXQUNSO2NBQ1g7bUJBQytCO0FBRXJFLElBQWEscUJBQWIsY0FBd0MsU0FBUztDQUMvQyxjQUFjO0VBQ1osTUFBTSxVQUFVO0NBQ2xCO0NBRUEsbUJBQW1CO0VBQ2pCLE9BQU87R0FDTCxRQUFRO0dBQ1IsTUFBTTtFQUNSO0NBQ0Y7Q0FFQSxPQUFPLElBQWlDO0VBQ3RDLE1BQU0sRUFBRSxTQUFTLE9BQU87RUFHeEIsTUFBTSw4QkFBYyxJQUFJLElBQTJCO0VBQ25ELEtBQUssTUFBTSxPQUFPLE1BQU07R0FDdEIsTUFBTSxZQUFZLElBQUksVUFBVSxRQUFRLFVBQVUsRUFBRSxDQUFDLENBQUMsUUFBUSxVQUFVLEVBQUU7R0FDMUUsSUFBSSxDQUFDLFlBQVksSUFBSSxTQUFTLEdBQzVCLFlB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
|
|
@@ -1,6 +1,10 @@
|
|
|
1
1
|
import { type EntityNamesRecord } from "../../entity/entity-manager";
|
|
2
2
|
import { type RenderingNode, type TemplateOptions } from "../../types/types";
|
|
3
3
|
import { Template } from "../template";
|
|
4
|
+
type FormDefaultValue = null | undefined | boolean | number | string | never[] | Record<string, never>;
|
|
5
|
+
interface FormDefaults {
|
|
6
|
+
[columnName: string]: FormDefaultValue;
|
|
7
|
+
}
|
|
4
8
|
export declare class Template__view_form extends Template {
|
|
5
9
|
constructor();
|
|
6
10
|
getTargetAndPath(names: EntityNamesRecord): {
|
|
@@ -20,7 +24,7 @@ export declare class Template__view_form extends Template {
|
|
|
20
24
|
enumId?: undefined;
|
|
21
25
|
} | null;
|
|
22
26
|
renderColumn(entityId: string, col: RenderingNode): string;
|
|
23
|
-
resolveDefaultValue(columns: RenderingNode[]):
|
|
27
|
+
resolveDefaultValue(columns: RenderingNode[]): FormDefaults;
|
|
24
28
|
render({ entityId }: TemplateOptions["view_form"]): Promise<{
|
|
25
29
|
body: string;
|
|
26
30
|
importKeys: never[];
|
|
@@ -28,4 +32,5 @@ export declare class Template__view_form extends Template {
|
|
|
28
32
|
path: string;
|
|
29
33
|
}>;
|
|
30
34
|
}
|
|
35
|
+
export {};
|
|
31
36
|
//# sourceMappingURL=view_form.template.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"view_form.template.d.ts","sourceRoot":"","sources":["../../../src/template/implementations/view_form.template.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,KAAK,iBAAiB,EAAE,MAAM,6BAA6B,CAAC;AACrE,OAAO,EAAE,KAAK,aAAa,EAAE,KAAK,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAM7E,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAEvC,qBAAa,mBAAoB,SAAQ,QAAQ;;IAK/C,gBAAgB,CAAC,KAAK,EAAE,iBAAiB;;;;IAOhC,mBAAmB,IAAI,MAAM,EAAE,GAAG,IAAI;IAI/C,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM;IAO5C,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM;IAI5C,kBAAkB,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,EAAE,aAAa;;;;;;;;;IAwBvD,YAAY,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,EAAE,aAAa,GAAG,MAAM;IAuF1D,mBAAmB,CAAC,OAAO,EAAE,aAAa,EAAE,GAAG,
|
|
1
|
+
{"version":3,"file":"view_form.template.d.ts","sourceRoot":"","sources":["../../../src/template/implementations/view_form.template.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,KAAK,iBAAiB,EAAE,MAAM,6BAA6B,CAAC;AACrE,OAAO,EAAE,KAAK,aAAa,EAAE,KAAK,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAM7E,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAEvC,KAAK,gBAAgB,GACjB,IAAI,GACJ,SAAS,GACT,OAAO,GACP,MAAM,GACN,MAAM,GACN,KAAK,EAAE,GACP,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;AAC1B,UAAU,YAAY;IACpB,CAAC,UAAU,EAAE,MAAM,GAAG,gBAAgB,CAAC;CACxC;AAED,qBAAa,mBAAoB,SAAQ,QAAQ;;IAK/C,gBAAgB,CAAC,KAAK,EAAE,iBAAiB;;;;IAOhC,mBAAmB,IAAI,MAAM,EAAE,GAAG,IAAI;IAI/C,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM;IAO5C,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM;IAI5C,kBAAkB,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,EAAE,aAAa;;;;;;;;;IAwBvD,YAAY,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,EAAE,aAAa,GAAG,MAAM;IAuF1D,mBAAmB,CAAC,OAAO,EAAE,aAAa,EAAE,GAAG,YAAY;IAkCrD,MAAM,CAAC,EAAE,QAAQ,EAAE,EAAE,eAAe,CAAC,WAAW,CAAC;;;;;;CAmWxD"}
|