sonamu 0.10.11 → 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 +133 -29
- 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 +13 -7
- 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 +61 -36
- package/dist/migration/migrator.d.ts.map +1 -1
- package/dist/migration/migrator.js +276 -167
- 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/migration/types.d.ts +54 -0
- package/dist/migration/types.d.ts.map +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 +146 -210
- 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 +3 -0
- package/dist/ui/migrations-api.d.ts.map +1 -0
- package/dist/ui/migrations-api.js +215 -0
- package/dist/ui-web/assets/index-D3QNH-Dv.css +1 -0
- package/dist/ui-web/assets/index-DV1AAq6W.js +178 -0
- package/dist/ui-web/index.html +2 -2
- 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 +11 -7
- 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 +155 -38
- 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 +392 -244
- package/src/migration/postgresql-schema-reader.ts +52 -47
- package/src/migration/slack-confirm.ts +17 -15
- package/src/migration/types.ts +57 -0
- 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 +726 -770
- package/src/ui/async-route.ts +4 -0
- package/src/ui/cdd-service.ts +35 -12
- package/src/ui/migrations-api.ts +381 -0
- 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-CJf8uJYf.js +0 -176
- package/dist/ui-web/assets/index-GMMIVGja.css +0 -1
package/dist/naite/naite.d.ts
CHANGED
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
|
|
2
1
|
import { type ComparisonOperator } from "../database/puri.types";
|
|
3
2
|
interface StackFrame {
|
|
4
3
|
functionName: string | null;
|
|
@@ -7,14 +6,75 @@ interface StackFrame {
|
|
|
7
6
|
}
|
|
8
7
|
interface NaiteTrace {
|
|
9
8
|
key: string;
|
|
10
|
-
data:
|
|
9
|
+
data: NaiteData;
|
|
11
10
|
stack: StackFrame[];
|
|
12
11
|
at: Date;
|
|
13
12
|
}
|
|
13
|
+
export type NaiteData = null | undefined | bigint | boolean | number | object | string | symbol;
|
|
14
|
+
export interface NaiteEventRegistry {
|
|
15
|
+
actionGenerateServices: readonly object[];
|
|
16
|
+
"fs/promises:rm": {
|
|
17
|
+
path: string;
|
|
18
|
+
options?: object;
|
|
19
|
+
};
|
|
20
|
+
"fs/promises:writeFile": {
|
|
21
|
+
path: string;
|
|
22
|
+
data: string;
|
|
23
|
+
};
|
|
24
|
+
"puri:executed-query": string;
|
|
25
|
+
"puri:ub-batch-updated": {
|
|
26
|
+
tableName: string;
|
|
27
|
+
rowCount: number;
|
|
28
|
+
whereColumns: string[];
|
|
29
|
+
};
|
|
30
|
+
"puri:ub-clean-orphans": {
|
|
31
|
+
tableName: string;
|
|
32
|
+
cleanOrphans: string[];
|
|
33
|
+
deletedCount: number;
|
|
34
|
+
};
|
|
35
|
+
"puri:ub-inherit": {
|
|
36
|
+
tableName: string;
|
|
37
|
+
inheritColumns: string[];
|
|
38
|
+
excludedFromUpdate: string[];
|
|
39
|
+
};
|
|
40
|
+
"puri:ub-ref-resolved": {
|
|
41
|
+
tableName: string;
|
|
42
|
+
field: string;
|
|
43
|
+
from: UBReference;
|
|
44
|
+
to: NaiteData;
|
|
45
|
+
};
|
|
46
|
+
"puri:ub-register": {
|
|
47
|
+
tableName: string;
|
|
48
|
+
uuid: string;
|
|
49
|
+
isUuidReused: boolean;
|
|
50
|
+
row: object & {
|
|
51
|
+
user_id: UBReference;
|
|
52
|
+
};
|
|
53
|
+
};
|
|
54
|
+
"puri:ub-upserted": {
|
|
55
|
+
tableName: string;
|
|
56
|
+
mode: "insert" | "upsert";
|
|
57
|
+
rowCount: number;
|
|
58
|
+
returnedIds: Array<number | string>;
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
interface UBReference {
|
|
62
|
+
uuid: string;
|
|
63
|
+
of: string;
|
|
64
|
+
use?: string;
|
|
65
|
+
}
|
|
66
|
+
export interface NaiteResult<Payload> extends Array<Payload> {
|
|
67
|
+
0: Payload;
|
|
68
|
+
1: Payload;
|
|
69
|
+
[index: number]: Payload;
|
|
70
|
+
find<Match extends Payload>(predicate: (value: Payload, index: number, values: Payload[]) => value is Match): Match;
|
|
71
|
+
find(predicate: (value: Payload, index: number, values: Payload[]) => boolean): Payload;
|
|
72
|
+
}
|
|
73
|
+
type NaiteValuesByKey = Record<string, NaiteTrace[] | Array<NaiteTrace["data"]>>;
|
|
14
74
|
export type NaiteStore = Map<string, NaiteTrace[]>;
|
|
15
75
|
export type SerializedTrace = {
|
|
16
76
|
key: string;
|
|
17
|
-
value:
|
|
77
|
+
value: unknown;
|
|
18
78
|
filePath: string;
|
|
19
79
|
lineNumber: number;
|
|
20
80
|
at: string;
|
|
@@ -23,7 +83,7 @@ export type SerializedTrace = {
|
|
|
23
83
|
* NaiteQuery 클래스
|
|
24
84
|
* 체이닝을 통한 trace 필터링 및 조회
|
|
25
85
|
*/
|
|
26
|
-
export declare class NaiteQuery {
|
|
86
|
+
export declare class NaiteQuery<Payload extends NaiteData = NaiteData> {
|
|
27
87
|
private traces;
|
|
28
88
|
constructor(traces: NaiteTrace[]);
|
|
29
89
|
private isComparableValue;
|
|
@@ -31,7 +91,7 @@ export declare class NaiteQuery {
|
|
|
31
91
|
* 파일명으로 필터링
|
|
32
92
|
* @param fileName 파일명 (예: "syncer.test.ts")
|
|
33
93
|
*/
|
|
34
|
-
fromFile(fileName: string): NaiteQuery
|
|
94
|
+
fromFile(fileName: string): NaiteQuery<Payload>;
|
|
35
95
|
/**
|
|
36
96
|
* 함수명으로 필터링
|
|
37
97
|
* @param funcName 함수명 (includes 체크)
|
|
@@ -39,45 +99,44 @@ export declare class NaiteQuery {
|
|
|
39
99
|
*/
|
|
40
100
|
fromFunction(funcName: string, options?: {
|
|
41
101
|
from: "direct" | "indirect" | "both";
|
|
42
|
-
}): NaiteQuery
|
|
102
|
+
}): NaiteQuery<Payload>;
|
|
43
103
|
/**
|
|
44
104
|
* 데이터 경로 기반 필터링
|
|
45
105
|
* @param path radash get 경로 (예: "data.userId")
|
|
46
106
|
* @param operator 비교 연산자
|
|
47
107
|
* @param value 비교값
|
|
48
108
|
*/
|
|
49
|
-
where(path: string, operator: ComparisonOperator | "includes", value:
|
|
109
|
+
where<Value extends NaiteData>(path: string, operator: ComparisonOperator | "includes", value: Value): NaiteQuery<Payload>;
|
|
50
110
|
/**
|
|
51
111
|
* 전체 데이터 배열 반환
|
|
52
112
|
*/
|
|
53
|
-
result():
|
|
113
|
+
result(): NaiteResult<Payload>;
|
|
54
114
|
/**
|
|
55
115
|
* 첫 번째 데이터 반환
|
|
56
116
|
*/
|
|
57
|
-
first():
|
|
117
|
+
first(): Payload;
|
|
58
118
|
/**
|
|
59
119
|
* 마지막 데이터 반환
|
|
60
120
|
*/
|
|
61
|
-
last():
|
|
121
|
+
last(): Payload;
|
|
62
122
|
/**
|
|
63
123
|
* n번째 데이터 반환
|
|
64
124
|
*/
|
|
65
|
-
at(index: number):
|
|
125
|
+
at(index: number): Payload;
|
|
66
126
|
/**
|
|
67
127
|
* 원본 trace 배열 반환 (디버깅/NaiteViewer용)
|
|
68
128
|
*/
|
|
69
129
|
getTraces(): NaiteTrace[];
|
|
70
130
|
}
|
|
71
131
|
export declare class NaiteClass {
|
|
72
|
-
t(name: string, value:
|
|
132
|
+
t<Value extends NaiteData>(name: string, value: Value): void;
|
|
73
133
|
/**
|
|
74
134
|
* key 또는 wildcard 패턴으로 trace 조회
|
|
75
135
|
* 항상 NaiteQuery 반환하여 체이닝 가능
|
|
76
136
|
*/
|
|
137
|
+
get<Key extends keyof NaiteEventRegistry>(keyPattern: Key): NaiteQuery<NaiteEventRegistry[Key]>;
|
|
77
138
|
get(keyPattern: string): NaiteQuery;
|
|
78
|
-
getAll():
|
|
79
|
-
[key: string]: any;
|
|
80
|
-
};
|
|
139
|
+
getAll(): NaiteValuesByKey;
|
|
81
140
|
/**
|
|
82
141
|
* 스토어에 들어있던 트레이스를 고대로 꺼내옵니다.
|
|
83
142
|
* 이때 값들은 모두 직렬화 가능한 상태로 나가게 됩니다.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"naite.d.ts","sourceRoot":"","sources":["../../src/naite/naite.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"naite.d.ts","sourceRoot":"","sources":["../../src/naite/naite.ts"],"names":[],"mappings":"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"}
|
package/dist/naite/naite.js
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { __esmMin } from "../_virtual/_rolldown/runtime.js";
|
|
2
2
|
import { convertNaiteKeyToCategory, init_category } from "../logger/category.js";
|
|
3
|
+
import { init_runtime_value, isNumberValue, isStringValue } from "../utils/runtime-value.js";
|
|
3
4
|
import { Sonamu, init_sonamu } from "../api/sonamu.js";
|
|
4
5
|
import { init_object_utils, isSerializable } from "../utils/object-utils.js";
|
|
5
6
|
import { getLogger } from "@logtape/logtape";
|
|
@@ -71,13 +72,14 @@ var init_naite = __esmMin((() => {
|
|
|
71
72
|
init_sonamu();
|
|
72
73
|
init_category();
|
|
73
74
|
init_object_utils();
|
|
75
|
+
init_runtime_value();
|
|
74
76
|
NaiteQuery = class NaiteQuery {
|
|
75
77
|
traces;
|
|
76
78
|
constructor(traces) {
|
|
77
79
|
this.traces = traces;
|
|
78
80
|
}
|
|
79
81
|
isComparableValue(value) {
|
|
80
|
-
return
|
|
82
|
+
return isNumberValue(value) || isStringValue(value);
|
|
81
83
|
}
|
|
82
84
|
/**
|
|
83
85
|
* 파일명으로 필터링
|
|
@@ -114,32 +116,20 @@ var init_naite = __esmMin((() => {
|
|
|
114
116
|
case "<=": return this.isComparableValue(actual) && this.isComparableValue(value) && actual <= value;
|
|
115
117
|
case "=": return actual === value;
|
|
116
118
|
case "!=": return actual !== value;
|
|
117
|
-
case "includes": return
|
|
119
|
+
case "includes": return isStringValue(actual) && isStringValue(value) && actual.includes(value);
|
|
118
120
|
default: return false;
|
|
119
121
|
}
|
|
120
122
|
}));
|
|
121
123
|
}
|
|
122
|
-
/**
|
|
123
|
-
* 전체 데이터 배열 반환
|
|
124
|
-
*/
|
|
125
124
|
result() {
|
|
126
125
|
return this.traces.map((t) => t.data);
|
|
127
126
|
}
|
|
128
|
-
/**
|
|
129
|
-
* 첫 번째 데이터 반환
|
|
130
|
-
*/
|
|
131
127
|
first() {
|
|
132
128
|
return this.traces[0]?.data;
|
|
133
129
|
}
|
|
134
|
-
/**
|
|
135
|
-
* 마지막 데이터 반환
|
|
136
|
-
*/
|
|
137
130
|
last() {
|
|
138
131
|
return this.traces[this.traces.length - 1]?.data;
|
|
139
132
|
}
|
|
140
|
-
/**
|
|
141
|
-
* n번째 데이터 반환
|
|
142
|
-
*/
|
|
143
133
|
at(index) {
|
|
144
134
|
return this.traces[index]?.data;
|
|
145
135
|
}
|
|
@@ -170,10 +160,6 @@ var init_naite = __esmMin((() => {
|
|
|
170
160
|
store.set(name, [...existing, trace]);
|
|
171
161
|
} catch {}
|
|
172
162
|
}
|
|
173
|
-
/**
|
|
174
|
-
* key 또는 wildcard 패턴으로 trace 조회
|
|
175
|
-
* 항상 NaiteQuery 반환하여 체이닝 가능
|
|
176
|
-
*/
|
|
177
163
|
get(keyPattern) {
|
|
178
164
|
const store = Sonamu.getContext()?.naiteStore;
|
|
179
165
|
if (!store) return new NaiteQuery([]);
|
|
@@ -238,4 +224,4 @@ var init_naite = __esmMin((() => {
|
|
|
238
224
|
init_naite();
|
|
239
225
|
export { Naite, NaiteClass, NaiteQuery, init_naite };
|
|
240
226
|
|
|
241
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmFpdGUuanMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vLi4vc3JjL25haXRlL25haXRlLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qIG94bGludC1kaXNhYmxlIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnkgKi8gLy8gTmFpdGXripQgZXhwZWN07JmAIO2YuOydke2VmOuPhOuhnSBhbnnrpbwg7ZeI7Jqp7ZWoXG5cbmltcG9ydCB7IGdldExvZ2dlciB9IGZyb20gXCJAbG9ndGFwZS9sb2d0YXBlXCI7XG5pbXBvcnQgeyBnZXQgfSBmcm9tIFwicmFkYXNoaVwiO1xuXG5pbXBvcnQgeyBTb25hbXUgfSBmcm9tIFwiLi4vYXBpL3NvbmFtdVwiO1xuaW1wb3J0IHsgdHlwZSBDb21wYXJpc29uT3BlcmF0b3IgfSBmcm9tIFwiLi4vZGF0YWJhc2UvcHVyaS50eXBlc1wiO1xuaW1wb3J0IHsgY29udmVydE5haXRlS2V5VG9DYXRlZ29yeSB9IGZyb20gXCIuLi9sb2dnZXIvY2F0ZWdvcnlcIjtcbmltcG9ydCB7IGlzU2VyaWFsaXphYmxlIH0gZnJvbSBcIi4uL3V0aWxzL29iamVjdC11dGlsc1wiO1xuXG4vLyBTdGFja0ZyYW1lIO2DgOyehVxuaW50ZXJmYWNlIFN0YWNrRnJhbWUge1xuICBmdW5jdGlvbk5hbWU6IHN0cmluZyB8IG51bGw7XG4gIGZpbGVQYXRoOiBzdHJpbmc7IC8vIFwiL1VzZXJzLy4uLi9zeW5jZXIudHNcIiDrmJDripQgXCJub2RlOmludGVybmFsLy4uLlwiXG4gIGxpbmVOdW1iZXI6IG51bWJlcjsgLy8gVFMg7YyM7J28IOq4sOykgCDrnbzsnbgg67KI7Zi4XG59XG5cbi8vIE5haXRlVHJhY2Ug7YOA7J6FXG5pbnRlcmZhY2UgTmFpdGVUcmFjZSB7XG4gIGtleTogc3RyaW5nO1xuICBkYXRhOiBhbnk7XG4gIHN0YWNrOiBTdGFja0ZyYW1lW107IC8vIOy9nOyKpO2DnSDsoJXrs7RcbiAgYXQ6IERhdGU7XG59XG5cbi8vIE5haXRlLnTqsIAg7KCA7J6l65CY64qUIO2DgOyehSAo7ZWt7IOBIOuwsOyXtOuhnCDthrXsnbwpXG5leHBvcnQgdHlwZSBOYWl0ZVN0b3JlID0gTWFwPHN0cmluZywgTmFpdGVUcmFjZVtdPjtcblxuLy8gZ2V0QWxsVHJhY2VzKCnqsIAg67CY7ZmY7ZWY64qUIOyngeugrO2ZlOuQnCB0cmFjZSDtg4DsnoVcbi8vIGJvb3RzdHJhcC50c+ydmCBUYXNrTWV0YSBhdWdtZW50YXRpb24sIGRldi12aXRlc3QtbWFuYWdlci50c+yXkOyEnOuPhCDsnbQg7YOA7J6F7J2EIOqzteycoO2VqeuLiOuLpC5cbmV4cG9ydCB0eXBlIFNlcmlhbGl6ZWRUcmFjZSA9IHtcbiAga2V5OiBzdHJpbmc7XG4gIHZhbHVlOiBhbnk7XG4gIGZpbGVQYXRoOiBzdHJpbmc7XG4gIGxpbmVOdW1iZXI6IG51bWJlcjtcbiAgYXQ6IHN0cmluZztcbn07XG5cbi8qKlxuICog7L2c7Iqk7YOd7J2EIO2MjOyLse2VmOyXrCBTdGFja0ZyYW1lIOuwsOyXtOuhnCDrsJjtmZhcbiAqIC0gZXh0cmFjdENhbGxTdGFjayDsnpDsi6Dqs7wgTmFpdGUudOuKlCDsoJzsmbhcbiAqIC0gcnVuV2l0aENvbnRleHQvcnVuV2l0aE1vY2tDb250ZXh0IOuwnOqyrCDsi5wg6rGw6riw7IScIOyiheujjFxuICogLSBub2RlOiDrgrTrtoAg6rK966Gc64qUIO2PrO2VqO2VmOuQmCwgbGluZU51bWJlcuuKlCBwYXRo7JeQIDog7Y+s7ZWoIOyLnCDrtpnsnbTsp4Ag7JWK7J2MXG4gKi9cbmZ1bmN0aW9uIGV4dHJhY3RDYWxsU3RhY2soKTogU3RhY2tGcmFtZVtdIHtcbiAgY29uc3Qgc3RhY2sgPSBuZXcgRXJyb3IoKS5zdGFjaztcbiAgaWYgKCFzdGFjaykgcmV0dXJuIFtdO1xuXG4gIGNvbnN0IGxpbmVzID0gc3RhY2suc3BsaXQoXCJcXG5cIik7XG5cbiAgLy8g7L2c7Iqk7YOdIOq1rOyhsDpcbiAgLy8gWzBdOiBcIkVycm9yXCJcbiAgLy8gWzFdOiBcImF0IGV4dHJhY3RDYWxsU3RhY2tcIlxuICAvLyBbMl06IFwiYXQgTmFpdGUudFwiXG4gIC8vIFszXTog7Iuk7KCcIO2YuOy2nCDsnITsuZjrtoDthLAg7Iuc7J6RXG4gIGNvbnN0IGZyYW1lcyA9IGxpbmVzXG4gICAgLnNsaWNlKDMpXG4gICAgLm1hcChwYXJzZVN0YWNrRnJhbWUpXG4gICAgLmZpbHRlcigoZnJhbWUpOiBmcmFtZSBpcyBTdGFja0ZyYW1lID0+IGZyYW1lICE9PSBudWxsKTtcblxuICAvLyBydW5XaXRoQ29udGV4dCDqs4Tsl7Qg7ZWo7IiYIOuwnOqyrCDsi5wg6rGw6riw7IScIOyekOultOq4sFxuICBjb25zdCBjb250ZXh0SW5kZXggPSBmcmFtZXMuZmluZEluZGV4KFxuICAgIChmKSA9PlxuICAgICAgZi5mdW5jdGlvbk5hbWU/LmluY2x1ZGVzKFwicnVuV2l0aENvbnRleHRcIikgfHwgZi5mdW5jdGlvbk5hbWU/LmluY2x1ZGVzKFwicnVuV2l0aE1vY2tDb250ZXh0XCIpLFxuICApO1xuXG4gIHJldHVybiBjb250ZXh0SW5kZXggPj0gMCA/IGZyYW1lcy5zbGljZSgwLCBjb250ZXh0SW5kZXggKyAxKSA6IGZyYW1lcztcbn1cblxuLyoqXG4gKiDsvZzsiqTtg50g7ZWcIOykhOydhCDtjIzsi7FcbiAqIO2YleyLnTE6IFwiYXQgRnVuY3Rpb25OYW1lIChmaWxlUGF0aDpsaW5lTnVtYmVyOmNvbHVtbk51bWJlcilcIlxuICog7ZiV7IudMjogXCJhdCBmaWxlUGF0aDpsaW5lTnVtYmVyOmNvbHVtbk51bWJlclwiICjsnbXrqoUg7ZWo7IiYL+uqqOuTiCDroIjrsqgpXG4gKi9cbmZ1bmN0aW9uIHBhcnNlU3RhY2tGcmFtZShsaW5lOiBzdHJpbmcpOiBTdGFja0ZyYW1lIHwgbnVsbCB7XG4gIC8vIO2MqO2EtDE6IFwiYXQgRnVuY3Rpb25OYW1lIChmaWxlUGF0aDpsaW5lTnVtYmVyOmNvbHVtbk51bWJlcilcIlxuICBjb25zdCBtYXRjaFdpdGhGdW5jID0gbGluZS5tYXRjaCgvYXRcXHMrKC4rPylcXHMrXFwoKC4rPyk6KFxcZCspOlxcZCtcXCkvKTtcbiAgaWYgKG1hdGNoV2l0aEZ1bmMpIHtcbiAgICBjb25zdCBmdW5jdGlvbk5hbWUgPSBtYXRjaFdpdGhGdW5jWzFdO1xuICAgIGNvbnN0IGZpbGVQYXRoID0gbWF0Y2hXaXRoRnVuY1syXTtcbiAgICBjb25zdCBsaW5lTnVtYmVyU3RyID0gbWF0Y2hXaXRoRnVuY1szXTtcblxuICAgIC8vIGZpbGVQYXRo7JeQIOydtOuvuCA66rCAIO2PrO2VqOuQmOyWtCDsnojsnLzrqbQgKOyYiDogXCJub2RlOmludGVybmFsLy4uLlwiKVxuICAgIGlmIChmaWxlUGF0aC5pbmNsdWRlcyhcIjpcIikpIHtcbiAgICAgIHJldHVybiB7IGZ1bmN0aW9uTmFtZSwgZmlsZVBhdGgsIGxpbmVOdW1iZXI6IDAgfTtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgZnVuY3Rpb25OYW1lLFxuICAgICAgZmlsZVBhdGgsXG4gICAgICBsaW5lTnVtYmVyOiBOdW1iZXIucGFyc2VJbnQobGluZU51bWJlclN0ciwgMTApLFxuICAgIH07XG4gIH1cblxuICAvLyDtjKjthLQyOiBcImF0IGZpbGVQYXRoOmxpbmVOdW1iZXI6Y29sdW1uTnVtYmVyXCIgKO2VqOyImOuqhSDsl4bsnYwpXG4gIGNvbnN0IG1hdGNoTm9GdW5jID0gbGluZS5tYXRjaCgvYXRcXHMrKC4rPyk6KFxcZCspOlxcZCskLyk7XG4gIGlmIChtYXRjaE5vRnVuYykge1xuICAgIGNvbnN0IGZpbGVQYXRoID0gbWF0Y2hOb0Z1bmNbMV07XG4gICAgY29uc3QgbGluZU51bWJlclN0ciA9IG1hdGNoTm9GdW5jWzJdO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIGZ1bmN0aW9uTmFtZTogbnVsbCxcbiAgICAgIGZpbGVQYXRoLFxuICAgICAgbGluZU51bWJlcjogTnVtYmVyLnBhcnNlSW50KGxpbmVOdW1iZXJTdHIsIDEwKSxcbiAgICB9O1xuICB9XG5cbiAgcmV0dXJuIG51bGw7XG59XG5cbi8qKlxuICogd2lsZGNhcmQg7Yyo7YS0IOunpOy5rVxuICog7JiI7IucOlxuICogLSBcInN5bmNlcjoqXCIg4oaSIFwic3luY2VyOmFcIiwgXCJzeW5jZXI6YTpiXCIg66qo65GQIOunpOy5rVxuICogLSBcInN5bmNlcjoqOnVzZXJcIiDihpIgXCJzeW5jZXI6cmVuZGVyVGVtcGxhdGU6dXNlclwiIOunpOy5rVxuICogLSBcInN5bmNlcjpyZW5kZXJUZW1wbGF0ZToqXCIg4oaSIFwic3luY2VyOnJlbmRlclRlbXBsYXRlOnNlcnZpY2VcIiDrp6Tsua1cbiAqL1xuZnVuY3Rpb24gbWF0Y2hlc1BhdHRlcm4oa2V5OiBzdHJpbmcsIHBhdHRlcm46IHN0cmluZyk6IGJvb2xlYW4ge1xuICBjb25zdCBrZXlQYXJ0cyA9IGtleS5zcGxpdChcIjpcIik7XG4gIGNvbnN0IHBhdHRlcm5QYXJ0cyA9IHBhdHRlcm4uc3BsaXQoXCI6XCIpO1xuXG4gIC8vIOuniOyngOunieydtCAqIOKGkiBwcmVmaXgg66ek7LmtICjquLjsnbQg66y06rSAKVxuICAvLyDsmIg6IFwic3luY2VyOipcIuuKlCBcInN5bmNlcjphXCIsIFwic3luY2VyOmE6YlwiIOuqqOuRkCDrp6Tsua1cbiAgaWYgKHBhdHRlcm5QYXJ0c1twYXR0ZXJuUGFydHMubGVuZ3RoIC0gMV0gPT09IFwiKlwiKSB7XG4gICAgY29uc3QgcHJlZml4UGFydHMgPSBwYXR0ZXJuUGFydHMuc2xpY2UoMCwgLTEpO1xuICAgIC8vIHByZWZpeOqwgCDrqqjrkZAg7J287LmY7ZWY64qU7KeAIO2ZleyduFxuICAgIHJldHVybiBwcmVmaXhQYXJ0cy5ldmVyeSgocGFydCwgaSkgPT4gcGFydCA9PT0ga2V5UGFydHNbaV0pO1xuICB9XG5cbiAgLy8g6ri47J206rCAIOqwmeyVhOyVvCDtlahcbiAgaWYgKHBhdHRlcm5QYXJ0cy5sZW5ndGggIT09IGtleVBhcnRzLmxlbmd0aCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIC8vIOqwgSDtjIztirjqsIAgKiDrmJDripQg7KCV7ZmV7Z6IIOydvOy5mFxuICByZXR1cm4gcGF0dGVyblBhcnRzLmV2ZXJ5KChwYXJ0LCBpKSA9PiBwYXJ0ID09PSBcIipcIiB8fCBwYXJ0ID09PSBrZXlQYXJ0c1tpXSk7XG59XG5cbi8qKlxuICogTmFpdGVRdWVyeSDtgbTrnpjsiqRcbiAqIOyytOydtOuLneydhCDthrXtlZwgdHJhY2Ug7ZWE7YSw66eBIOuwjyDsobDtmoxcbiAqL1xuZXhwb3J0IGNsYXNzIE5haXRlUXVlcnkge1xuICBjb25zdHJ1Y3Rvcihwcml2YXRlIHRyYWNlczogTmFpdGVUcmFjZVtdKSB7fVxuXG4gIHByaXZhdGUgaXNDb21wYXJhYmxlVmFsdWUodmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBudW1iZXIgfCBzdHJpbmcge1xuICAgIHJldHVybiB0eXBlb2YgdmFsdWUgPT09IFwibnVtYmVyXCIgfHwgdHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiO1xuICB9XG5cbiAgLyoqXG4gICAqIO2MjOydvOuqheycvOuhnCDtlYTthLDrp4FcbiAgICogQHBhcmFtIGZpbGVOYW1lIO2MjOydvOuqhSAo7JiIOiBcInN5bmNlci50ZXN0LnRzXCIpXG4gICAqL1xuICBmcm9tRmlsZShmaWxlTmFtZTogc3RyaW5nKTogTmFpdGVRdWVyeSB7XG4gICAgY29uc3QgZmlsdGVyZWQgPSB0aGlzLnRyYWNlcy5maWx0ZXIoKHQpID0+XG4gICAgICB0LnN0YWNrLnNvbWUoKGZyYW1lKSA9PiBmcmFtZS5maWxlUGF0aC5lbmRzV2l0aChgLyR7ZmlsZU5hbWV9YCkpLFxuICAgICk7XG4gICAgcmV0dXJuIG5ldyBOYWl0ZVF1ZXJ5KGZpbHRlcmVkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDtlajsiJjrqoXsnLzroZwg7ZWE7YSw66eBXG4gICAqIEBwYXJhbSBmdW5jTmFtZSDtlajsiJjrqoUgKGluY2x1ZGVzIOyytO2BrClcbiAgICogQHBhcmFtIG9wdGlvbnMuZnJvbSAnZGlyZWN0JyA9IOyngeygkSDtmLjstpzrp4wsICdpbmRpcmVjdCcgPSDqsITsoJEg7Zi47Lac66eMLCAnYm90aCcgPSDrqqjrkZBcbiAgICovXG4gIGZyb21GdW5jdGlvbihcbiAgICBmdW5jTmFtZTogc3RyaW5nLFxuICAgIG9wdGlvbnM6IHsgZnJvbTogXCJkaXJlY3RcIiB8IFwiaW5kaXJlY3RcIiB8IFwiYm90aFwiIH0gPSB7IGZyb206IFwiYm90aFwiIH0sXG4gICk6IE5haXRlUXVlcnkge1xuICAgIGNvbnN0IGZpbHRlcmVkID0gdGhpcy50cmFjZXMuZmlsdGVyKCh0KSA9PiB7XG4gICAgICBpZiAob3B0aW9ucy5mcm9tID09PSBcImRpcmVjdFwiKSB7XG4gICAgICAgIC8vIHN0YWNrWzBd66eMIO2ZleyduCAo7KeB7KCRIO2YuOy2nClcbiAgICAgICAgcmV0dXJuIHQuc3RhY2tbMF0/LmZ1bmN0aW9uTmFtZT8uaW5jbHVkZXMoZnVuY05hbWUpO1xuICAgICAgfVxuICAgICAgaWYgKG9wdGlvbnMuZnJvbSA9PT0gXCJpbmRpcmVjdFwiKSB7XG4gICAgICAgIC8vIHN0YWNrWzErXeyXkOyEnCDtmZXsnbggKOqwhOygkSDtmLjstpwpXG4gICAgICAgIHJldHVybiB0LnN0YWNrLnNsaWNlKDEpLnNvbWUoKGYpID0+IGYuZnVuY3Rpb25OYW1lPy5pbmNsdWRlcyhmdW5jTmFtZSkpO1xuICAgICAgfVxuICAgICAgLy8g7KCE7LK0IOyKpO2DneyXkOyEnCDtmZXsnbhcbiAgICAgIHJldHVybiB0LnN0YWNrLnNvbWUoKGYpID0+IGYuZnVuY3Rpb25OYW1lPy5pbmNsdWRlcyhmdW5jTmFtZSkpO1xuICAgIH0pO1xuICAgIHJldHVybiBuZXcgTmFpdGVRdWVyeShmaWx0ZXJlZCk7XG4gIH1cblxuICAvKipcbiAgICog642w7J207YSwIOqyveuhnCDquLDrsJgg7ZWE7YSw66eBXG4gICAqIEBwYXJhbSBwYXRoIHJhZGFzaCBnZXQg6rK966GcICjsmIg6IFwiZGF0YS51c2VySWRcIilcbiAgICogQHBhcmFtIG9wZXJhdG9yIOu5hOq1kCDsl7DsgrDsnpBcbiAgICogQHBhcmFtIHZhbHVlIOu5hOq1kOqwklxuICAgKi9cbiAgd2hlcmUocGF0aDogc3RyaW5nLCBvcGVyYXRvcjogQ29tcGFyaXNvbk9wZXJhdG9yIHwgXCJpbmNsdWRlc1wiLCB2YWx1ZTogYW55KTogTmFpdGVRdWVyeSB7XG4gICAgY29uc3QgZmlsdGVyZWQgPSB0aGlzLnRyYWNlcy5maWx0ZXIoKHRyYWNlKSA9PiB7XG4gICAgICBjb25zdCBhY3R1YWwgPSBnZXQodHJhY2UsIHBhdGgpO1xuXG4gICAgICBzd2l0Y2ggKG9wZXJhdG9yKSB7XG4gICAgICAgIGNhc2UgXCI+XCI6XG4gICAgICAgICAgcmV0dXJuIHRoaXMuaXNDb21wYXJhYmxlVmFsdWUoYWN0dWFsKSAmJiB0aGlzLmlzQ29tcGFyYWJsZVZhbHVlKHZhbHVlKSAmJiBhY3R1YWwgPiB2YWx1ZTtcbiAgICAgICAgY2FzZSBcIjxcIjpcbiAgICAgICAgICByZXR1cm4gdGhpcy5pc0NvbXBhcmFibGVWYWx1ZShhY3R1YWwpICYmIHRoaXMuaXNDb21wYXJhYmxlVmFsdWUodmFsdWUpICYmIGFjdHVhbCA8IHZhbHVlO1xuICAgICAgICBjYXNlIFwiPj1cIjpcbiAgICAgICAgICByZXR1cm4gdGhpcy5pc0NvbXBhcmFibGVWYWx1ZShhY3R1YWwpICYmIHRoaXMuaXNDb21wYXJhYmxlVmFsdWUodmFsdWUpICYmIGFjdHVhbCA+PSB2YWx1ZTtcbiAgICAgICAgY2FzZSBcIjw9XCI6XG4gICAgICAgICAgcmV0dXJuIHRoaXMuaXNDb21wYXJhYmxlVmFsdWUoYWN0dWFsKSAmJiB0aGlzLmlzQ29tcGFyYWJsZVZhbHVlKHZhbHVlKSAmJiBhY3R1YWwgPD0gdmFsdWU7XG4gICAgICAgIGNhc2UgXCI9XCI6XG4gICAgICAgICAgcmV0dXJuIGFjdHVhbCA9PT0gdmFsdWU7XG4gICAgICAgIGNhc2UgXCIhPVwiOlxuICAgICAgICAgIHJldHVybiBhY3R1YWwgIT09IHZhbHVlO1xuICAgICAgICBjYXNlIFwiaW5jbHVkZXNcIjpcbiAgICAgICAgICByZXR1cm4gdHlwZW9mIGFjdHVhbCA9PT0gXCJzdHJpbmdcIiAmJiBhY3R1YWwuaW5jbHVkZXModmFsdWUpO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gbmV3IE5haXRlUXVlcnkoZmlsdGVyZWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIOyghOyytCDrjbDsnbTthLAg67Cw7Je0IOuwmO2ZmFxuICAgKi9cbiAgcmVzdWx0KCk6IGFueVtdIHtcbiAgICByZXR1cm4gdGhpcy50cmFjZXMubWFwKCh0KSA9PiB0LmRhdGEpO1xuICB9XG5cbiAgLyoqXG4gICAqIOyyqyDrsojsp7gg642w7J207YSwIOuwmO2ZmFxuICAgKi9cbiAgZmlyc3QoKTogYW55IHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy50cmFjZXNbMF0/LmRhdGE7XG4gIH1cblxuICAvKipcbiAgICog66eI7KeA66eJIOuNsOydtO2EsCDrsJjtmZhcbiAgICovXG4gIGxhc3QoKTogYW55IHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy50cmFjZXNbdGhpcy50cmFjZXMubGVuZ3RoIC0gMV0/LmRhdGE7XG4gIH1cblxuICAvKipcbiAgICogbuuyiOynuCDrjbDsnbTthLAg67CY7ZmYXG4gICAqL1xuICBhdChpbmRleDogbnVtYmVyKTogYW55IHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy50cmFjZXNbaW5kZXhdPy5kYXRhO1xuICB9XG5cbiAgLyoqXG4gICAqIOybkOuzuCB0cmFjZSDrsLDsl7Qg67CY7ZmYICjrlJTrsoTquYUvTmFpdGVWaWV3ZXLsmqkpXG4gICAqL1xuICBnZXRUcmFjZXMoKTogTmFpdGVUcmFjZVtdIHtcbiAgICByZXR1cm4gdGhpcy50cmFjZXM7XG4gIH1cbn1cblxuLy8gTmFpdGUg7Iux6riA7YS0IOqwneyytCAo7LaU7ZuEIGxvZ2dlciDsl7DqsrAg65Ox7J2YIOyDge2DnCDqtIDrpqwg7ZWE7JqU7ISxIOqzoOugpClcbmV4cG9ydCBjbGFzcyBOYWl0ZUNsYXNzIHtcbiAgLy8g7YWM7Iqk7Yq4IOuhnOq3uCDquLDroZ1cbiAgdChcbiAgICBuYW1lOiBzdHJpbmcsXG4gICAgdmFsdWU6IGFueSAvKuydtOugh+qyjCDrsJvsnYAg6rCS7J20IE5haXRlVHJhY2XroZwg7KCA7J6l65CY7Ja0IOyeiOuLpOqwgCDstpTtm4Tsl5Agdml0ZXN07JeQ6rKMIG1ldGHrpbwg7Ya17ZW0IOuEmOqyqOyguCDtlITroZzshLjsiqTqsIQg7Ya17Iug7J2EIO2Gte2VtCDsp4HroKztmZTrkJjslrTslbwg7ZWY64qUIOygkOydhCDqs6DroKTtlZjsmIDsnYQg65WMIOyXrOq4sOyXkCBTZXJpYWxpemFibGXsnYQg7I2o7IScIOygnO2VnOydhCDrkZgg7IiY64+EIOyeiOyngOunjCwg7IKs7Jqp7IOB7J2YIO2OuOydmOulvCDsg53qsIHtlZjsl6wgYW5566GcIOuwm+yKteuLiOuLpC4qLyxcbiAgKSB7XG4gICAgLy8g7J20IHQg7ZWo7IiY64qUIO2FjOyKpO2KuCDtmZjqsr3sl5DshJzrp4wg7J6R64+Z7ZW07JW8IO2VqeuLiOuLpC5cbiAgICAvLyDqt7jrpqzqs6Ag7YWM7Iqk7Yq4IO2ZmOqyvSDtjJDri6jsl5Ag7JmcIGlzVGVzdCgpIO2VqOyImOulvCDsgqzsmqntlZjsp4Ag7JWK7JWY64OQ66m07JqULCxcbiAgICAvLyDsnbTroIfqsowg7ZWY64qU6rKMIOycoO2LuCDtlajsiJgg67aI65+s7JmA7IScIOyCrOyaqe2VmOuKlCDqsoPrs7Tri6Qg7KGw6riI7J2064KY66eIIOu5oOulvCDqsoMg6rCZ7JWY6riwIOuVjOusuOyeheuLiOuLpC5cbiAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwidGVzdFwiKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGNvbnRleHQgPSBTb25hbXUuZ2V0Q29udGV4dCgpO1xuICAgICAgY29uc3Qgc3RvcmUgPSBjb250ZXh0Py5uYWl0ZVN0b3JlO1xuXG4gICAgICBpZiAoIXN0b3JlKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgLy8g7L2c7Iqk7YOdIOyImOynkVxuICAgICAgY29uc3Qgc3RhY2sgPSBleHRyYWN0Q2FsbFN0YWNrKCk7XG5cbiAgICAgIGNvbnN0IHRyYWNlOiBOYWl0ZVRyYWNlID0ge1xuICAgICAgICBrZXk6IG5hbWUsXG4gICAgICAgIGRhdGE6IHZhbHVlLFxuICAgICAgICBzdGFjayxcbiAgICAgICAgYXQ6IG5ldyBEYXRlKCksXG4gICAgICB9O1xuXG4gICAgICAvLyDtla3sg4Eg67Cw7Je066GcIOq0gOumrFxuICAgICAgY29uc3QgZXhpc3RpbmcgPSBzdG9yZS5nZXQobmFtZSkgPz8gW107XG4gICAgICBnZXRMb2dnZXIoW1wibmFpdGVcIiwgLi4uY29udmVydE5haXRlS2V5VG9DYXRlZ29yeShuYW1lKV0pLmRlYnVnKFxuICAgICAgICBgbmFpdGU6IHtuYW1lfSAke2V4aXN0aW5nLmxlbmd0aCA9PT0gMCA/IFwiaXMgZW1wdHkgc3RhdGVcIiA6IGBhbHJlYWR5IGV4aXN0aW5nIHdpdGggJHtleGlzdGluZy5sZW5ndGh9IGVudHJpZXNgfSwgYXBwZW5kaW5nIG5ldyBlbnRyeWAsXG4gICAgICAgIHtcbiAgICAgICAgICBuYW1lLFxuICAgICAgICAgIHZhbHVlLFxuICAgICAgICB9LFxuICAgICAgKTtcblxuICAgICAgc3RvcmUuc2V0KG5hbWUsIFsuLi5leGlzdGluZywgdHJhY2VdKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIENvbnRleHQg7JeG64qUIOyDge2ZqeyXkOyEnCBOYWl0ZS50IO2YuOy2nFxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBrZXkg65iQ64qUIHdpbGRjYXJkIO2MqO2EtOycvOuhnCB0cmFjZSDsobDtmoxcbiAgICog7ZWt7IOBIE5haXRlUXVlcnkg67CY7ZmY7ZWY7JesIOyytOydtOuLnSDqsIDriqVcbiAgICovXG4gIGdldChrZXlQYXR0ZXJuOiBzdHJpbmcpOiBOYWl0ZVF1ZXJ5IHtcbiAgICBjb25zdCBjb250ZXh0ID0gU29uYW11LmdldENvbnRleHQoKTtcbiAgICBjb25zdCBzdG9yZSA9IGNvbnRleHQ/Lm5haXRlU3RvcmU7XG5cbiAgICBpZiAoIXN0b3JlKSB7XG4gICAgICByZXR1cm4gbmV3IE5haXRlUXVlcnkoW10pO1xuICAgIH1cblxuICAgIC8vIHdpbGRjYXJkIOyXhuycvOuptCBleGFjdCBtYXRjaFxuICAgIGlmICgha2V5UGF0dGVybi5pbmNsdWRlcyhcIipcIikpIHtcbiAgICAgIGNvbnN0IHRyYWNlcyA9IHN0b3JlLmdldChrZXlQYXR0ZXJuKSA/PyBbXTtcbiAgICAgIHJldHVybiBuZXcgTmFpdGVRdWVyeSh0cmFjZXMpO1xuICAgIH1cblxuICAgIC8vIHdpbGRjYXJkIO2MqO2EtCDrp6Tsua1cbiAgICBjb25zdCBhbGxUcmFjZXM6IE5haXRlVHJhY2VbXSA9IFtdO1xuICAgIGZvciAoY29uc3QgW2tleSwgdHJhY2VzXSBvZiBzdG9yZS5lbnRyaWVzKCkpIHtcbiAgICAgIGlmIChtYXRjaGVzUGF0dGVybihrZXksIGtleVBhdHRlcm4pKSB7XG4gICAgICAgIGFsbFRyYWNlcy5wdXNoKC4uLnRyYWNlcyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIG5ldyBOYWl0ZVF1ZXJ5KGFsbFRyYWNlcyk7XG4gIH1cblxuICAvLyDsoITssrQg66as7Iqk7Yq4IOqwgOyguOyYpOq4sFxuICBnZXRBbGwoKTogeyBba2V5OiBzdHJpbmddOiBhbnkgfSB7XG4gICAgY29uc3QgY29udGV4dCA9IFNvbmFtdS5nZXRDb250ZXh0KCk7XG4gICAgaWYgKCFjb250ZXh0Py5uYWl0ZVN0b3JlKSB7XG4gICAgICByZXR1cm4ge307XG4gICAgfVxuICAgIC8vIE5haXRlVHJhY2Ug67Cw7Je07J2EIGRhdGHrp4wg7LaU7Lac7ZWY7JesIOuwmO2ZmFxuICAgIGNvbnN0IHJlc3VsdDogeyBba2V5OiBzdHJpbmddOiBhbnkgfSA9IHt9O1xuICAgIGZvciAoY29uc3QgW2tleSwgdHJhY2VzXSBvZiBjb250ZXh0Lm5haXRlU3RvcmUuZW50cmllcygpKSB7XG4gICAgICBpZiAoa2V5LnN0YXJ0c1dpdGgoXCJtb2NrOlwiKSkge1xuICAgICAgICAvLyBNb2NrIOyEpOygleydgCDqt7jrjIDroZwg67CY7ZmYXG4gICAgICAgIHJlc3VsdFtrZXldID0gdHJhY2VzO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gTmFpdGVUcmFjZSDrsLDsl7TsnYAgZGF0YeunjCDstpTstpxcbiAgICAgICAgcmVzdWx0W2tleV0gPSB0cmFjZXMubWFwKCh0OiBOYWl0ZVRyYWNlKSA9PiB0LmRhdGEpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgLyoqXG4gICAqIOyKpO2GoOyWtOyXkCDrk6TslrTsnojrjZgg7Yq466CI7J207Iqk66W8IOqzoOuMgOuhnCDqurzrgrTsmLXri4jri6QuXG4gICAqIOydtOuVjCDqsJLrk6TsnYAg66qo65GQIOyngeugrO2ZlCDqsIDriqXtlZwg7IOB7YOc66GcIOuCmOqwgOqyjCDrkKnri4jri6QuXG4gICAqIO2FjOyKpO2KuCDsoJXrs7TsmYAg7ZWo6ruYIGV4dGVuc2lvbnPsl5Ag67O064K8IOyaqeuPhOuhnCDrp4zrk6Tsl4jsirXri4jri6QuXG4gICAqIEByZXR1cm5zXG4gICAqL1xuICBnZXRBbGxUcmFjZXMoKTogU2VyaWFsaXplZFRyYWNlW10ge1xuICAgIGNvbnN0IGNvbnRleHQgPSBTb25hbXUuZ2V0Q29udGV4dCgpO1xuICAgIGlmICghY29udGV4dD8ubmFpdGVTdG9yZSkge1xuICAgICAgcmV0dXJuIFtdO1xuICAgIH1cblxuICAgIGNvbnN0IHRyYWNlcyA9IEFycmF5LmZyb20oY29udGV4dC5uYWl0ZVN0b3JlLnZhbHVlcygpKS5mbGF0KCk7XG5cbiAgICAvLyDsp4HroKztmZQg67aI6rCA64ql7ZWcIOqwkuydtCDsobTsnqztlZzri6TrqbQg7J2066W8IOuMgOusuOynneunjO2VmOqyjCDslYzroKTspI3ri4jri6QhIOq3uOy5mOunjCDslYzrpqzquLDrp4wg7ZWY6rOgIOq3uOuDpSDsp4DrgpjqsJHri4jri6Qg44WO44WOXG4gICAgLy8g7JmcIOyngeugrO2ZlOqwgCDspJHsmpTtlZzqsIA/IOydtChnZXRBbGxUcmFjZXMpIO2YuOy2nOydmCDqsrDqs7zripQg7Jm467aA66GcIOuCmOqwgOqyjCDrkJjripTrjbAsXG4gICAgLy8g7J2065WMIOyjvCDsmqnrj4TqsIAgdml0ZXN07J2YIHRhc2subWV0YSDtlYTrk5zrpbwg7Ya17ZW0IGFmdGVyRWFjaOyXkOyEnCBTb25hbXUgZXh0ZW5zaW9u7Jy866GcIOyghOuLrO2VmOuKlCDqsoPsnoXri4jri6QuXG4gICAgLy8g7Jes6riw7IScIG1ldGEg7ZWE65Oc7JeQIOuLtOq4tCDrgrTsmqnsnYAg7ZSE66Gc7IS47Iqk6rCEIO2GteyLoChwcm9jZXNzLnNlbmQpIOuYkOuKlCDsiqTroIjrk5zqsIQg7Ya17IugKG1lc3NhZ2UgcG9ydCnsnYQg7Ya17ZW0IOyghOuLrOuQmOyWtOyVvCDtlZjripTrjbAsXG4gICAgLy8g7J2066GcIOyduO2VtCBcIuyngeugrO2ZlCDqsIDriqXtlZwg6rCS65Ok66eMIO2XiOyaqVwi7ZWY64qUIOygnOyVveydtCDsg53quYHri4jri6QuXG4gICAgLy9cbiAgICAvLyDsnbQg7KCc7JW97J2EIOydmOyLne2VmOyXrCBOYWl0ZS507JeQIOyngeugrO2ZlCDqsIDriqXtlZwg6rCS66eMIOuEmOq4sOqyjCDtlaAg7IiY64+EIOyeiOyXiOyngOunjCwg6re466CH6rKMIO2VmOuptCDrtojtjrjtlbTsp4gg6rKDIOqwmeyVhOyEnCDtlZjsp4Ag7JWK7JWY7Iq164uI64ukLlxuICAgIC8vIOuUsOudvOyEnCDtmITsnqwgTmFpdGUudOuKlCDrqqjrk6Ag6rCS7J2EIOuwm+ydhCDsiJgg7J6I6rKMIOuQmOyWtCDsnojsirXri4jri6QuXG4gICAgLy8g64yA7IugIOydtOugh+qyjChnZXRBbGxUcmFjZXMpIOq3uCDqsJLrk6TsnYQg67m864K8IOuVjCBKU09OLnN0cmluZ2lmeeulvCDsgqzsmqntlZjsl6wg6rCV7KCc66GcIOyngeugrO2ZlCDqsIDriqXtlZjqsowg66eM65Ok7JeI7Iq164uI64ukLCxcbiAgICBmb3IgKGNvbnN0IHRyYWNlIG9mIHRyYWNlcykge1xuICAgICAgY29uc3QgY2hlY2sgPSBpc1NlcmlhbGl6YWJsZSh0cmFjZS5kYXRhKTtcbiAgICAgIGlmICghY2hlY2sudmFsaWQpIHtcbiAgICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICAgIFwiXFxuXCIgK1xuICAgICAgICAgICAgXCLilZTilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZdcXG5cIiArXG4gICAgICAgICAgICBcIuKVkSAgW05haXRlXSBOb24tc2VyaWFsaXphYmxlIHZhbHVlIGRldGVjdGVkISAgICAgICAgICAgICAgICAgICAgICDilZFcXG5cIiArXG4gICAgICAgICAgICBcIuKVoOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVo1xcblwiICtcbiAgICAgICAgICAgIGDilZEgIEtleTogJHt0cmFjZS5rZXkucGFkRW5kKDU3KX3ilZFcXG5gICtcbiAgICAgICAgICAgIGDilZEgIFJlYXNvbjogJHsoY2hlY2sucmVhc29uID8/IFwidW5rbm93blwiKS5zbGljZSgwLCA1NCkucGFkRW5kKDU0KX3ilZFcXG5gICtcbiAgICAgICAgICAgIGDilZEgIExvY2F0aW9uOiAkeyh0cmFjZS5zdGFja1swXT8uZmlsZVBhdGggPz8gXCJ1bmtub3duXCIpLnNsaWNlKC01MSkucGFkRW5kKDUyKX3ilZFcXG5gICtcbiAgICAgICAgICAgIGDilZEgIExpbmU6ICR7U3RyaW5nKHRyYWNlLnN0YWNrWzBdPy5saW5lTnVtYmVyID8/IDApLnBhZEVuZCg1Nil94pWRXFxuYCArXG4gICAgICAgICAgICBcIuKVoOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVo1xcblwiICtcbiAgICAgICAgICAgIFwi4pWRICBOYWl0ZS50KCkgYWNjZXB0cyBhbnkgdHlwZSBvZiB2YWx1ZS4gSG93ZXZlciwgdmFsdWVzIHdpbGwgICAgIOKVkVxcblwiICtcbiAgICAgICAgICAgIFwi4pWRICBiZSBzZXJpYWxpemVkIHRvIEpTT04gd2hlbiBleHBvcnRlZCB2aWEgTmFpdGUuZ2V0QWxsVHJhY2VzKCkuIOKVkVxcblwiICtcbiAgICAgICAgICAgIFwi4pWa4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWdXFxuXCIsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHRyYWNlcy5tYXAoKHRyYWNlKSA9PiAoe1xuICAgICAga2V5OiB0cmFjZS5rZXksXG4gICAgICB2YWx1ZTogSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeSh0cmFjZS5kYXRhID8/IFwiXCIpKSwgLy8g7KeB66Cs7ZmUIOqwgOuKpe2VnCDqsoPrp4wg64Ko6riw66Ck64qUIOuIiOusvOqyqOyatCDrhbjroKUsLCDslYjqt7jrn6zrqbQgdGFzay5tZXRh7JeQIOuTpOyWtOqwgOyEnCDtlITroZzshLjsiqTqsIQg7Ya17IugIO2VoCDrlYwg66y47KCcIOyDneq4sOqxsOuToOyalCwsXG4gICAgICBmaWxlUGF0aDogdHJhY2Uuc3RhY2tbMF0/LmZpbGVQYXRoID8/IFwiXCIsXG4gICAgICBsaW5lTnVtYmVyOiB0cmFjZS5zdGFja1swXT8ubGluZU51bWJlciA/PyAwLFxuICAgICAgYXQ6IHRyYWNlLmF0LnRvSVNPU3RyaW5nKCksXG4gICAgfSkpO1xuICB9XG5cbiAgLy8g7Yq57KCVIO2CpCDsgq3soJztlZjquLBcbiAgZGVsKGtleTogc3RyaW5nKSB7XG4gICAgY29uc3QgY29udGV4dCA9IFNvbmFtdS5nZXRDb250ZXh0KCk7XG4gICAgaWYgKCFjb250ZXh0Py5uYWl0ZVN0b3JlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnRleHQubmFpdGVTdG9yZS5kZWxldGUoa2V5KTtcbiAgfVxuXG4gIGNyZWF0ZVN0b3JlKCk6IE5haXRlU3RvcmUge1xuICAgIHJldHVybiBuZXcgTWFwPHN0cmluZywgTmFpdGVUcmFjZVtdPigpO1xuICB9XG59XG5cbmV4cG9ydCBjb25zdCBOYWl0ZSA9IG5ldyBOYWl0ZUNsYXNzKCk7XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7QUE0Q0EsU0FBUyxtQkFBaUM7Q0FDeEMsTUFBTSx5QkFBUSxJQUFJLE1BQU0sRUFBQyxDQUFDO0NBQzFCLElBQUksQ0FBQyxPQUFPLE9BQU8sQ0FBQztDQVNwQixNQUFNLFNBUFEsTUFBTSxNQUFNLElBT1gsQ0FBQSxDQUNaLE1BQU0sQ0FBQyxDQUFDLENBQ1IsSUFBSSxlQUFl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
|
|
227
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmFpdGUuanMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vLi4vc3JjL25haXRlL25haXRlLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGdldExvZ2dlciB9IGZyb20gXCJAbG9ndGFwZS9sb2d0YXBlXCI7XG5pbXBvcnQgeyBnZXQgfSBmcm9tIFwicmFkYXNoaVwiO1xuXG5pbXBvcnQgeyBTb25hbXUgfSBmcm9tIFwiLi4vYXBpL3NvbmFtdVwiO1xuaW1wb3J0IHsgdHlwZSBDb21wYXJpc29uT3BlcmF0b3IgfSBmcm9tIFwiLi4vZGF0YWJhc2UvcHVyaS50eXBlc1wiO1xuaW1wb3J0IHsgY29udmVydE5haXRlS2V5VG9DYXRlZ29yeSB9IGZyb20gXCIuLi9sb2dnZXIvY2F0ZWdvcnlcIjtcbmltcG9ydCB7IGlzU2VyaWFsaXphYmxlIH0gZnJvbSBcIi4uL3V0aWxzL29iamVjdC11dGlsc1wiO1xuaW1wb3J0IHsgaXNOdW1iZXJWYWx1ZSwgaXNTdHJpbmdWYWx1ZSB9IGZyb20gXCIuLi91dGlscy9ydW50aW1lLXZhbHVlXCI7XG5cbi8vIFN0YWNrRnJhbWUg7YOA7J6FXG5pbnRlcmZhY2UgU3RhY2tGcmFtZSB7XG4gIGZ1bmN0aW9uTmFtZTogc3RyaW5nIHwgbnVsbDtcbiAgZmlsZVBhdGg6IHN0cmluZzsgLy8gXCIvVXNlcnMvLi4uL3N5bmNlci50c1wiIOuYkOuKlCBcIm5vZGU6aW50ZXJuYWwvLi4uXCJcbiAgbGluZU51bWJlcjogbnVtYmVyOyAvLyBUUyDtjIzsnbwg6riw7KSAIOudvOyduCDrsojtmLhcbn1cblxuLy8gTmFpdGVUcmFjZSDtg4DsnoVcbmludGVyZmFjZSBOYWl0ZVRyYWNlIHtcbiAga2V5OiBzdHJpbmc7XG4gIGRhdGE6IE5haXRlRGF0YTtcbiAgc3RhY2s6IFN0YWNrRnJhbWVbXTsgLy8g7L2c7Iqk7YOdIOygleuztFxuICBhdDogRGF0ZTtcbn1cblxuLy8gTmFpdGXripQg7KeB66Cs7ZmUIOqwgOuKpeyEsSDqsoDsgqzrpbwg64K067O064K06riwIOyLnOygkOyXkCDsiJjtlontlZjrr4DroZwg66qo65OgIEphdmFTY3JpcHQg6rCS7J2EIOq4sOuhne2VoCDsiJgg7J6I7Iq164uI64ukLlxuZXhwb3J0IHR5cGUgTmFpdGVEYXRhID0gbnVsbCB8IHVuZGVmaW5lZCB8IGJpZ2ludCB8IGJvb2xlYW4gfCBudW1iZXIgfCBvYmplY3QgfCBzdHJpbmcgfCBzeW1ib2w7XG5cbmV4cG9ydCBpbnRlcmZhY2UgTmFpdGVFdmVudFJlZ2lzdHJ5IHtcbiAgYWN0aW9uR2VuZXJhdGVTZXJ2aWNlczogcmVhZG9ubHkgb2JqZWN0W107XG4gIFwiZnMvcHJvbWlzZXM6cm1cIjoge1xuICAgIHBhdGg6IHN0cmluZztcbiAgICBvcHRpb25zPzogb2JqZWN0O1xuICB9O1xuICBcImZzL3Byb21pc2VzOndyaXRlRmlsZVwiOiB7XG4gICAgcGF0aDogc3RyaW5nO1xuICAgIGRhdGE6IHN0cmluZztcbiAgfTtcbiAgXCJwdXJpOmV4ZWN1dGVkLXF1ZXJ5XCI6IHN0cmluZztcbiAgXCJwdXJpOnViLWJhdGNoLXVwZGF0ZWRcIjoge1xuICAgIHRhYmxlTmFtZTogc3RyaW5nO1xuICAgIHJvd0NvdW50OiBudW1iZXI7XG4gICAgd2hlcmVDb2x1bW5zOiBzdHJpbmdbXTtcbiAgfTtcbiAgXCJwdXJpOnViLWNsZWFuLW9ycGhhbnNcIjoge1xuICAgIHRhYmxlTmFtZTogc3RyaW5nO1xuICAgIGNsZWFuT3JwaGFuczogc3RyaW5nW107XG4gICAgZGVsZXRlZENvdW50OiBudW1iZXI7XG4gIH07XG4gIFwicHVyaTp1Yi1pbmhlcml0XCI6IHtcbiAgICB0YWJsZU5hbWU6IHN0cmluZztcbiAgICBpbmhlcml0Q29sdW1uczogc3RyaW5nW107XG4gICAgZXhjbHVkZWRGcm9tVXBkYXRlOiBzdHJpbmdbXTtcbiAgfTtcbiAgXCJwdXJpOnViLXJlZi1yZXNvbHZlZFwiOiB7XG4gICAgdGFibGVOYW1lOiBzdHJpbmc7XG4gICAgZmllbGQ6IHN0cmluZztcbiAgICBmcm9tOiBVQlJlZmVyZW5jZTtcbiAgICB0bzogTmFpdGVEYXRhO1xuICB9O1xuICBcInB1cmk6dWItcmVnaXN0ZXJcIjoge1xuICAgIHRhYmxlTmFtZTogc3RyaW5nO1xuICAgIHV1aWQ6IHN0cmluZztcbiAgICBpc1V1aWRSZXVzZWQ6IGJvb2xlYW47XG4gICAgcm93OiBvYmplY3QgJiB7IHVzZXJfaWQ6IFVCUmVmZXJlbmNlIH07XG4gIH07XG4gIFwicHVyaTp1Yi11cHNlcnRlZFwiOiB7XG4gICAgdGFibGVOYW1lOiBzdHJpbmc7XG4gICAgbW9kZTogXCJpbnNlcnRcIiB8IFwidXBzZXJ0XCI7XG4gICAgcm93Q291bnQ6IG51bWJlcjtcbiAgICByZXR1cm5lZElkczogQXJyYXk8bnVtYmVyIHwgc3RyaW5nPjtcbiAgfTtcbn1cblxuaW50ZXJmYWNlIFVCUmVmZXJlbmNlIHtcbiAgdXVpZDogc3RyaW5nO1xuICBvZjogc3RyaW5nO1xuICB1c2U/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTmFpdGVSZXN1bHQ8UGF5bG9hZD4gZXh0ZW5kcyBBcnJheTxQYXlsb2FkPiB7XG4gIDA6IFBheWxvYWQ7XG4gIDE6IFBheWxvYWQ7XG4gIFtpbmRleDogbnVtYmVyXTogUGF5bG9hZDtcbiAgZmluZDxNYXRjaCBleHRlbmRzIFBheWxvYWQ+KFxuICAgIHByZWRpY2F0ZTogKHZhbHVlOiBQYXlsb2FkLCBpbmRleDogbnVtYmVyLCB2YWx1ZXM6IFBheWxvYWRbXSkgPT4gdmFsdWUgaXMgTWF0Y2gsXG4gICk6IE1hdGNoO1xuICBmaW5kKHByZWRpY2F0ZTogKHZhbHVlOiBQYXlsb2FkLCBpbmRleDogbnVtYmVyLCB2YWx1ZXM6IFBheWxvYWRbXSkgPT4gYm9vbGVhbik6IFBheWxvYWQ7XG59XG5cbnR5cGUgTmFpdGVWYWx1ZXNCeUtleSA9IFJlY29yZDxzdHJpbmcsIE5haXRlVHJhY2VbXSB8IEFycmF5PE5haXRlVHJhY2VbXCJkYXRhXCJdPj47XG5cbi8vIE5haXRlLnTqsIAg7KCA7J6l65CY64qUIO2DgOyehSAo7ZWt7IOBIOuwsOyXtOuhnCDthrXsnbwpXG5leHBvcnQgdHlwZSBOYWl0ZVN0b3JlID0gTWFwPHN0cmluZywgTmFpdGVUcmFjZVtdPjtcblxuLy8gZ2V0QWxsVHJhY2VzKCnqsIAg67CY7ZmY7ZWY64qUIOyngeugrO2ZlOuQnCB0cmFjZSDtg4DsnoVcbi8vIGJvb3RzdHJhcC50c+ydmCBUYXNrTWV0YSBhdWdtZW50YXRpb24sIGRldi12aXRlc3QtbWFuYWdlci50c+yXkOyEnOuPhCDsnbQg7YOA7J6F7J2EIOqzteycoO2VqeuLiOuLpC5cbmV4cG9ydCB0eXBlIFNlcmlhbGl6ZWRUcmFjZSA9IHtcbiAga2V5OiBzdHJpbmc7XG4gIHZhbHVlOiB1bmtub3duO1xuICBmaWxlUGF0aDogc3RyaW5nO1xuICBsaW5lTnVtYmVyOiBudW1iZXI7XG4gIGF0OiBzdHJpbmc7XG59O1xuXG4vKipcbiAqIOy9nOyKpO2DneydhCDtjIzsi7HtlZjsl6wgU3RhY2tGcmFtZSDrsLDsl7TroZwg67CY7ZmYXG4gKiAtIGV4dHJhY3RDYWxsU3RhY2sg7J6Q7Iug6rO8IE5haXRlLnTripQg7KCc7Jm4XG4gKiAtIHJ1bldpdGhDb250ZXh0L3J1bldpdGhNb2NrQ29udGV4dCDrsJzqsqwg7IucIOqxsOq4sOyEnCDsooXro4xcbiAqIC0gbm9kZTog64K067aAIOqyveuhnOuKlCDtj6ztlajtlZjrkJgsIGxpbmVOdW1iZXLripQgcGF0aOyXkCA6IO2PrO2VqCDsi5wg67aZ7J207KeAIOyViuydjFxuICovXG5mdW5jdGlvbiBleHRyYWN0Q2FsbFN0YWNrKCk6IFN0YWNrRnJhbWVbXSB7XG4gIGNvbnN0IHN0YWNrID0gbmV3IEVycm9yKCkuc3RhY2s7XG4gIGlmICghc3RhY2spIHJldHVybiBbXTtcblxuICBjb25zdCBsaW5lcyA9IHN0YWNrLnNwbGl0KFwiXFxuXCIpO1xuXG4gIC8vIOy9nOyKpO2DnSDqtazsobA6XG4gIC8vIFswXTogXCJFcnJvclwiXG4gIC8vIFsxXTogXCJhdCBleHRyYWN0Q2FsbFN0YWNrXCJcbiAgLy8gWzJdOiBcImF0IE5haXRlLnRcIlxuICAvLyBbM106IOyLpOygnCDtmLjstpwg7JyE7LmY67aA7YSwIOyLnOyekVxuICBjb25zdCBmcmFtZXMgPSBsaW5lc1xuICAgIC5zbGljZSgzKVxuICAgIC5tYXAocGFyc2VTdGFja0ZyYW1lKVxuICAgIC5maWx0ZXIoKGZyYW1lKTogZnJhbWUgaXMgU3RhY2tGcmFtZSA9PiBmcmFtZSAhPT0gbnVsbCk7XG5cbiAgLy8gcnVuV2l0aENvbnRleHQg6rOE7Je0IO2VqOyImCDrsJzqsqwg7IucIOqxsOq4sOyEnCDsnpDrpbTquLBcbiAgY29uc3QgY29udGV4dEluZGV4ID0gZnJhbWVzLmZpbmRJbmRleChcbiAgICAoZikgPT5cbiAgICAgIGYuZnVuY3Rpb25OYW1lPy5pbmNsdWRlcyhcInJ1bldpdGhDb250ZXh0XCIpIHx8IGYuZnVuY3Rpb25OYW1lPy5pbmNsdWRlcyhcInJ1bldpdGhNb2NrQ29udGV4dFwiKSxcbiAgKTtcblxuICByZXR1cm4gY29udGV4dEluZGV4ID49IDAgPyBmcmFtZXMuc2xpY2UoMCwgY29udGV4dEluZGV4ICsgMSkgOiBmcmFtZXM7XG59XG5cbi8qKlxuICog7L2c7Iqk7YOdIO2VnCDspITsnYQg7YyM7IuxXG4gKiDtmJXsi50xOiBcImF0IEZ1bmN0aW9uTmFtZSAoZmlsZVBhdGg6bGluZU51bWJlcjpjb2x1bW5OdW1iZXIpXCJcbiAqIO2YleyLnTI6IFwiYXQgZmlsZVBhdGg6bGluZU51bWJlcjpjb2x1bW5OdW1iZXJcIiAo7J2166qFIO2VqOyImC/rqqjrk4gg66CI67KoKVxuICovXG5mdW5jdGlvbiBwYXJzZVN0YWNrRnJhbWUobGluZTogc3RyaW5nKTogU3RhY2tGcmFtZSB8IG51bGwge1xuICAvLyDtjKjthLQxOiBcImF0IEZ1bmN0aW9uTmFtZSAoZmlsZVBhdGg6bGluZU51bWJlcjpjb2x1bW5OdW1iZXIpXCJcbiAgY29uc3QgbWF0Y2hXaXRoRnVuYyA9IGxpbmUubWF0Y2goL2F0XFxzKyguKz8pXFxzK1xcKCguKz8pOihcXGQrKTpcXGQrXFwpLyk7XG4gIGlmIChtYXRjaFdpdGhGdW5jKSB7XG4gICAgY29uc3QgZnVuY3Rpb25OYW1lID0gbWF0Y2hXaXRoRnVuY1sxXTtcbiAgICBjb25zdCBmaWxlUGF0aCA9IG1hdGNoV2l0aEZ1bmNbMl07XG4gICAgY29uc3QgbGluZU51bWJlclN0ciA9IG1hdGNoV2l0aEZ1bmNbM107XG5cbiAgICAvLyBmaWxlUGF0aOyXkCDsnbTrr7ggOuqwgCDtj6ztlajrkJjslrQg7J6I7Jy866m0ICjsmIg6IFwibm9kZTppbnRlcm5hbC8uLi5cIilcbiAgICBpZiAoZmlsZVBhdGguaW5jbHVkZXMoXCI6XCIpKSB7XG4gICAgICByZXR1cm4geyBmdW5jdGlvbk5hbWUsIGZpbGVQYXRoLCBsaW5lTnVtYmVyOiAwIH07XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIGZ1bmN0aW9uTmFtZSxcbiAgICAgIGZpbGVQYXRoLFxuICAgICAgbGluZU51bWJlcjogTnVtYmVyLnBhcnNlSW50KGxpbmVOdW1iZXJTdHIsIDEwKSxcbiAgICB9O1xuICB9XG5cbiAgLy8g7Yyo7YS0MjogXCJhdCBmaWxlUGF0aDpsaW5lTnVtYmVyOmNvbHVtbk51bWJlclwiICjtlajsiJjrqoUg7JeG7J2MKVxuICBjb25zdCBtYXRjaE5vRnVuYyA9IGxpbmUubWF0Y2goL2F0XFxzKyguKz8pOihcXGQrKTpcXGQrJC8pO1xuICBpZiAobWF0Y2hOb0Z1bmMpIHtcbiAgICBjb25zdCBmaWxlUGF0aCA9IG1hdGNoTm9GdW5jWzFdO1xuICAgIGNvbnN0IGxpbmVOdW1iZXJTdHIgPSBtYXRjaE5vRnVuY1syXTtcblxuICAgIHJldHVybiB7XG4gICAgICBmdW5jdGlvbk5hbWU6IG51bGwsXG4gICAgICBmaWxlUGF0aCxcbiAgICAgIGxpbmVOdW1iZXI6IE51bWJlci5wYXJzZUludChsaW5lTnVtYmVyU3RyLCAxMCksXG4gICAgfTtcbiAgfVxuXG4gIHJldHVybiBudWxsO1xufVxuXG4vKipcbiAqIHdpbGRjYXJkIO2MqO2EtCDrp6Tsua1cbiAqIOyYiOyLnDpcbiAqIC0gXCJzeW5jZXI6KlwiIOKGkiBcInN5bmNlcjphXCIsIFwic3luY2VyOmE6YlwiIOuqqOuRkCDrp6Tsua1cbiAqIC0gXCJzeW5jZXI6Kjp1c2VyXCIg4oaSIFwic3luY2VyOnJlbmRlclRlbXBsYXRlOnVzZXJcIiDrp6Tsua1cbiAqIC0gXCJzeW5jZXI6cmVuZGVyVGVtcGxhdGU6KlwiIOKGkiBcInN5bmNlcjpyZW5kZXJUZW1wbGF0ZTpzZXJ2aWNlXCIg66ek7LmtXG4gKi9cbmZ1bmN0aW9uIG1hdGNoZXNQYXR0ZXJuKGtleTogc3RyaW5nLCBwYXR0ZXJuOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgY29uc3Qga2V5UGFydHMgPSBrZXkuc3BsaXQoXCI6XCIpO1xuICBjb25zdCBwYXR0ZXJuUGFydHMgPSBwYXR0ZXJuLnNwbGl0KFwiOlwiKTtcblxuICAvLyDrp4jsp4Drp4nsnbQgKiDihpIgcHJlZml4IOunpOy5rSAo6ri47J20IOustOq0gClcbiAgLy8g7JiIOiBcInN5bmNlcjoqXCLripQgXCJzeW5jZXI6YVwiLCBcInN5bmNlcjphOmJcIiDrqqjrkZAg66ek7LmtXG4gIGlmIChwYXR0ZXJuUGFydHNbcGF0dGVyblBhcnRzLmxlbmd0aCAtIDFdID09PSBcIipcIikge1xuICAgIGNvbnN0IHByZWZpeFBhcnRzID0gcGF0dGVyblBhcnRzLnNsaWNlKDAsIC0xKTtcbiAgICAvLyBwcmVmaXjqsIAg66qo65GQIOydvOy5mO2VmOuKlOyngCDtmZXsnbhcbiAgICByZXR1cm4gcHJlZml4UGFydHMuZXZlcnkoKHBhcnQsIGkpID0+IHBhcnQgPT09IGtleVBhcnRzW2ldKTtcbiAgfVxuXG4gIC8vIOq4uOydtOqwgCDqsJnslYTslbwg7ZWoXG4gIGlmIChwYXR0ZXJuUGFydHMubGVuZ3RoICE9PSBrZXlQYXJ0cy5sZW5ndGgpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICAvLyDqsIEg7YyM7Yq46rCAICog65iQ64qUIOygle2Zle2eiCDsnbzsuZhcbiAgcmV0dXJuIHBhdHRlcm5QYXJ0cy5ldmVyeSgocGFydCwgaSkgPT4gcGFydCA9PT0gXCIqXCIgfHwgcGFydCA9PT0ga2V5UGFydHNbaV0pO1xufVxuXG4vKipcbiAqIE5haXRlUXVlcnkg7YG0656Y7IqkXG4gKiDssrTsnbTri53snYQg7Ya17ZWcIHRyYWNlIO2VhO2EsOungSDrsI8g7KGw7ZqMXG4gKi9cbmV4cG9ydCBjbGFzcyBOYWl0ZVF1ZXJ5PFBheWxvYWQgZXh0ZW5kcyBOYWl0ZURhdGEgPSBOYWl0ZURhdGE+IHtcbiAgY29uc3RydWN0b3IocHJpdmF0ZSB0cmFjZXM6IE5haXRlVHJhY2VbXSkge31cblxuICBwcml2YXRlIGlzQ29tcGFyYWJsZVZhbHVlPFZhbHVlPih2YWx1ZTogVmFsdWUpOiB2YWx1ZSBpcyBWYWx1ZSAmIChudW1iZXIgfCBzdHJpbmcpIHtcbiAgICByZXR1cm4gaXNOdW1iZXJWYWx1ZSh2YWx1ZSkgfHwgaXNTdHJpbmdWYWx1ZSh2YWx1ZSk7XG4gIH1cblxuICAvKipcbiAgICog7YyM7J2866qF7Jy866GcIO2VhO2EsOungVxuICAgKiBAcGFyYW0gZmlsZU5hbWUg7YyM7J2866qFICjsmIg6IFwic3luY2VyLnRlc3QudHNcIilcbiAgICovXG4gIGZyb21GaWxlKGZpbGVOYW1lOiBzdHJpbmcpOiBOYWl0ZVF1ZXJ5PFBheWxvYWQ+IHtcbiAgICBjb25zdCBmaWx0ZXJlZCA9IHRoaXMudHJhY2VzLmZpbHRlcigodCkgPT5cbiAgICAgIHQuc3RhY2suc29tZSgoZnJhbWUpID0+IGZyYW1lLmZpbGVQYXRoLmVuZHNXaXRoKGAvJHtmaWxlTmFtZX1gKSksXG4gICAgKTtcbiAgICByZXR1cm4gbmV3IE5haXRlUXVlcnk8UGF5bG9hZD4oZmlsdGVyZWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIO2VqOyImOuqheycvOuhnCDtlYTthLDrp4FcbiAgICogQHBhcmFtIGZ1bmNOYW1lIO2VqOyImOuqhSAoaW5jbHVkZXMg7LK07YGsKVxuICAgKiBAcGFyYW0gb3B0aW9ucy5mcm9tICdkaXJlY3QnID0g7KeB7KCRIO2YuOy2nOunjCwgJ2luZGlyZWN0JyA9IOqwhOygkSDtmLjstpzrp4wsICdib3RoJyA9IOuqqOuRkFxuICAgKi9cbiAgZnJvbUZ1bmN0aW9uKFxuICAgIGZ1bmNOYW1lOiBzdHJpbmcsXG4gICAgb3B0aW9uczogeyBmcm9tOiBcImRpcmVjdFwiIHwgXCJpbmRpcmVjdFwiIHwgXCJib3RoXCIgfSA9IHsgZnJvbTogXCJib3RoXCIgfSxcbiAgKTogTmFpdGVRdWVyeTxQYXlsb2FkPiB7XG4gICAgY29uc3QgZmlsdGVyZWQgPSB0aGlzLnRyYWNlcy5maWx0ZXIoKHQpID0+IHtcbiAgICAgIGlmIChvcHRpb25zLmZyb20gPT09IFwiZGlyZWN0XCIpIHtcbiAgICAgICAgLy8gc3RhY2tbMF3rp4wg7ZmV7J24ICjsp4HsoJEg7Zi47LacKVxuICAgICAgICByZXR1cm4gdC5zdGFja1swXT8uZnVuY3Rpb25OYW1lPy5pbmNsdWRlcyhmdW5jTmFtZSk7XG4gICAgICB9XG4gICAgICBpZiAob3B0aW9ucy5mcm9tID09PSBcImluZGlyZWN0XCIpIHtcbiAgICAgICAgLy8gc3RhY2tbMStd7JeQ7IScIO2ZleyduCAo6rCE7KCRIO2YuOy2nClcbiAgICAgICAgcmV0dXJuIHQuc3RhY2suc2xpY2UoMSkuc29tZSgoZikgPT4gZi5mdW5jdGlvbk5hbWU/LmluY2x1ZGVzKGZ1bmNOYW1lKSk7XG4gICAgICB9XG4gICAgICAvLyDsoITssrQg7Iqk7YOd7JeQ7IScIO2ZleyduFxuICAgICAgcmV0dXJuIHQuc3RhY2suc29tZSgoZikgPT4gZi5mdW5jdGlvbk5hbWU/LmluY2x1ZGVzKGZ1bmNOYW1lKSk7XG4gICAgfSk7XG4gICAgcmV0dXJuIG5ldyBOYWl0ZVF1ZXJ5PFBheWxvYWQ+KGZpbHRlcmVkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDrjbDsnbTthLAg6rK966GcIOq4sOuwmCDtlYTthLDrp4FcbiAgICogQHBhcmFtIHBhdGggcmFkYXNoIGdldCDqsr3roZwgKOyYiDogXCJkYXRhLnVzZXJJZFwiKVxuICAgKiBAcGFyYW0gb3BlcmF0b3Ig67mE6rWQIOyXsOyCsOyekFxuICAgKiBAcGFyYW0gdmFsdWUg67mE6rWQ6rCSXG4gICAqL1xuICB3aGVyZTxWYWx1ZSBleHRlbmRzIE5haXRlRGF0YT4oXG4gICAgcGF0aDogc3RyaW5nLFxuICAgIG9wZXJhdG9yOiBDb21wYXJpc29uT3BlcmF0b3IgfCBcImluY2x1ZGVzXCIsXG4gICAgdmFsdWU6IFZhbHVlLFxuICApOiBOYWl0ZVF1ZXJ5PFBheWxvYWQ+IHtcbiAgICBjb25zdCBmaWx0ZXJlZCA9IHRoaXMudHJhY2VzLmZpbHRlcigodHJhY2UpID0+IHtcbiAgICAgIGNvbnN0IGFjdHVhbCA9IGdldCh0cmFjZSwgcGF0aCk7XG5cbiAgICAgIHN3aXRjaCAob3BlcmF0b3IpIHtcbiAgICAgICAgY2FzZSBcIj5cIjpcbiAgICAgICAgICByZXR1cm4gdGhpcy5pc0NvbXBhcmFibGVWYWx1ZShhY3R1YWwpICYmIHRoaXMuaXNDb21wYXJhYmxlVmFsdWUodmFsdWUpICYmIGFjdHVhbCA+IHZhbHVlO1xuICAgICAgICBjYXNlIFwiPFwiOlxuICAgICAgICAgIHJldHVybiB0aGlzLmlzQ29tcGFyYWJsZVZhbHVlKGFjdHVhbCkgJiYgdGhpcy5pc0NvbXBhcmFibGVWYWx1ZSh2YWx1ZSkgJiYgYWN0dWFsIDwgdmFsdWU7XG4gICAgICAgIGNhc2UgXCI+PVwiOlxuICAgICAgICAgIHJldHVybiB0aGlzLmlzQ29tcGFyYWJsZVZhbHVlKGFjdHVhbCkgJiYgdGhpcy5pc0NvbXBhcmFibGVWYWx1ZSh2YWx1ZSkgJiYgYWN0dWFsID49IHZhbHVlO1xuICAgICAgICBjYXNlIFwiPD1cIjpcbiAgICAgICAgICByZXR1cm4gdGhpcy5pc0NvbXBhcmFibGVWYWx1ZShhY3R1YWwpICYmIHRoaXMuaXNDb21wYXJhYmxlVmFsdWUodmFsdWUpICYmIGFjdHVhbCA8PSB2YWx1ZTtcbiAgICAgICAgY2FzZSBcIj1cIjpcbiAgICAgICAgICByZXR1cm4gYWN0dWFsID09PSB2YWx1ZTtcbiAgICAgICAgY2FzZSBcIiE9XCI6XG4gICAgICAgICAgcmV0dXJuIGFjdHVhbCAhPT0gdmFsdWU7XG4gICAgICAgIGNhc2UgXCJpbmNsdWRlc1wiOlxuICAgICAgICAgIHJldHVybiBpc1N0cmluZ1ZhbHVlKGFjdHVhbCkgJiYgaXNTdHJpbmdWYWx1ZSh2YWx1ZSkgJiYgYWN0dWFsLmluY2x1ZGVzKHZhbHVlKTtcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIG5ldyBOYWl0ZVF1ZXJ5PFBheWxvYWQ+KGZpbHRlcmVkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDsoITssrQg642w7J207YSwIOuwsOyXtCDrsJjtmZhcbiAgICovXG4gIHJlc3VsdCgpOiBOYWl0ZVJlc3VsdDxQYXlsb2FkPjtcbiAgcmVzdWx0KCk6IE5haXRlRGF0YVtdIHtcbiAgICByZXR1cm4gdGhpcy50cmFjZXMubWFwKCh0KSA9PiB0LmRhdGEpO1xuICB9XG5cbiAgLyoqXG4gICAqIOyyqyDrsojsp7gg642w7J207YSwIOuwmO2ZmFxuICAgKi9cbiAgZmlyc3QoKTogUGF5bG9hZDtcbiAgZmlyc3QoKTogTmFpdGVEYXRhIHtcbiAgICByZXR1cm4gdGhpcy50cmFjZXNbMF0/LmRhdGE7XG4gIH1cblxuICAvKipcbiAgICog66eI7KeA66eJIOuNsOydtO2EsCDrsJjtmZhcbiAgICovXG4gIGxhc3QoKTogUGF5bG9hZDtcbiAgbGFzdCgpOiBOYWl0ZURhdGEge1xuICAgIHJldHVybiB0aGlzLnRyYWNlc1t0aGlzLnRyYWNlcy5sZW5ndGggLSAxXT8uZGF0YTtcbiAgfVxuXG4gIC8qKlxuICAgKiBu67KI7Ke4IOuNsOydtO2EsCDrsJjtmZhcbiAgICovXG4gIGF0KGluZGV4OiBudW1iZXIpOiBQYXlsb2FkO1xuICBhdChpbmRleDogbnVtYmVyKTogTmFpdGVEYXRhIHtcbiAgICByZXR1cm4gdGhpcy50cmFjZXNbaW5kZXhdPy5kYXRhO1xuICB9XG5cbiAgLyoqXG4gICAqIOybkOuzuCB0cmFjZSDrsLDsl7Qg67CY7ZmYICjrlJTrsoTquYUvTmFpdGVWaWV3ZXLsmqkpXG4gICAqL1xuICBnZXRUcmFjZXMoKTogTmFpdGVUcmFjZVtdIHtcbiAgICByZXR1cm4gdGhpcy50cmFjZXM7XG4gIH1cbn1cblxuLy8gTmFpdGUg7Iux6riA7YS0IOqwneyytCAo7LaU7ZuEIGxvZ2dlciDsl7DqsrAg65Ox7J2YIOyDge2DnCDqtIDrpqwg7ZWE7JqU7ISxIOqzoOugpClcbmV4cG9ydCBjbGFzcyBOYWl0ZUNsYXNzIHtcbiAgLy8g7YWM7Iqk7Yq4IOuhnOq3uCDquLDroZ1cbiAgdDxWYWx1ZSBleHRlbmRzIE5haXRlRGF0YT4obmFtZTogc3RyaW5nLCB2YWx1ZTogVmFsdWUpIHtcbiAgICAvLyDsnbQgdCDtlajsiJjripQg7YWM7Iqk7Yq4IO2ZmOqyveyXkOyEnOunjCDsnpHrj5ntlbTslbwg7ZWp64uI64ukLlxuICAgIC8vIOq3uOumrOqzoCDthYzsiqTtirgg7ZmY6rK9IO2MkOuLqOyXkCDsmZwgaXNUZXN0KCkg7ZWo7IiY66W8IOyCrOyaqe2VmOyngCDslYrslZjrg5DrqbTsmpQsLFxuICAgIC8vIOydtOugh+qyjCDtlZjripTqsowg7Jyg7Yu4IO2VqOyImCDrtojrn6zsmYDshJwg7IKs7Jqp7ZWY64qUIOqyg+uztOuLpCDsobDquIjsnbTrgpjrp4gg67mg66W8IOqygyDqsJnslZjquLAg65WM66y47J6F64uI64ukLlxuICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJ0ZXN0XCIpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgY29udGV4dCA9IFNvbmFtdS5nZXRDb250ZXh0KCk7XG4gICAgICBjb25zdCBzdG9yZSA9IGNvbnRleHQ/Lm5haXRlU3RvcmU7XG5cbiAgICAgIGlmICghc3RvcmUpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICAvLyDsvZzsiqTtg50g7IiY7KeRXG4gICAgICBjb25zdCBzdGFjayA9IGV4dHJhY3RDYWxsU3RhY2soKTtcblxuICAgICAgY29uc3QgdHJhY2U6IE5haXRlVHJhY2UgPSB7XG4gICAgICAgIGtleTogbmFtZSxcbiAgICAgICAgZGF0YTogdmFsdWUsXG4gICAgICAgIHN0YWNrLFxuICAgICAgICBhdDogbmV3IERhdGUoKSxcbiAgICAgIH07XG5cbiAgICAgIC8vIO2VreyDgSDrsLDsl7TroZwg6rSA66asXG4gICAgICBjb25zdCBleGlzdGluZyA9IHN0b3JlLmdldChuYW1lKSA/PyBbXTtcbiAgICAgIGdldExvZ2dlcihbXCJuYWl0ZVwiLCAuLi5jb252ZXJ0TmFpdGVLZXlUb0NhdGVnb3J5KG5hbWUpXSkuZGVidWcoXG4gICAgICAgIGBuYWl0ZToge25hbWV9ICR7ZXhpc3RpbmcubGVuZ3RoID09PSAwID8gXCJpcyBlbXB0eSBzdGF0ZVwiIDogYGFscmVhZHkgZXhpc3Rpbmcgd2l0aCAke2V4aXN0aW5nLmxlbmd0aH0gZW50cmllc2B9LCBhcHBlbmRpbmcgbmV3IGVudHJ5YCxcbiAgICAgICAge1xuICAgICAgICAgIG5hbWUsXG4gICAgICAgICAgdmFsdWUsXG4gICAgICAgIH0sXG4gICAgICApO1xuXG4gICAgICBzdG9yZS5zZXQobmFtZSwgWy4uLmV4aXN0aW5nLCB0cmFjZV0pO1xuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gQ29udGV4dCDsl4bripQg7IOB7Zmp7JeQ7IScIE5haXRlLnQg7Zi47LacXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIGtleSDrmJDripQgd2lsZGNhcmQg7Yyo7YS07Jy866GcIHRyYWNlIOyhsO2ajFxuICAgKiDtla3sg4EgTmFpdGVRdWVyeSDrsJjtmZjtlZjsl6wg7LK07J2064udIOqwgOuKpVxuICAgKi9cbiAgZ2V0PEtleSBleHRlbmRzIGtleW9mIE5haXRlRXZlbnRSZWdpc3RyeT4oa2V5UGF0dGVybjogS2V5KTogTmFpdGVRdWVyeTxOYWl0ZUV2ZW50UmVnaXN0cnlbS2V5XT47XG4gIGdldChrZXlQYXR0ZXJuOiBzdHJpbmcpOiBOYWl0ZVF1ZXJ5O1xuICBnZXQoa2V5UGF0dGVybjogc3RyaW5nKTogTmFpdGVRdWVyeSB7XG4gICAgY29uc3QgY29udGV4dCA9IFNvbmFtdS5nZXRDb250ZXh0KCk7XG4gICAgY29uc3Qgc3RvcmUgPSBjb250ZXh0Py5uYWl0ZVN0b3JlO1xuXG4gICAgaWYgKCFzdG9yZSkge1xuICAgICAgcmV0dXJuIG5ldyBOYWl0ZVF1ZXJ5KFtdKTtcbiAgICB9XG5cbiAgICAvLyB3aWxkY2FyZCDsl4bsnLzrqbQgZXhhY3QgbWF0Y2hcbiAgICBpZiAoIWtleVBhdHRlcm4uaW5jbHVkZXMoXCIqXCIpKSB7XG4gICAgICBjb25zdCB0cmFjZXMgPSBzdG9yZS5nZXQoa2V5UGF0dGVybikgPz8gW107XG4gICAgICByZXR1cm4gbmV3IE5haXRlUXVlcnkodHJhY2VzKTtcbiAgICB9XG5cbiAgICAvLyB3aWxkY2FyZCDtjKjthLQg66ek7LmtXG4gICAgY29uc3QgYWxsVHJhY2VzOiBOYWl0ZVRyYWNlW10gPSBbXTtcbiAgICBmb3IgKGNvbnN0IFtrZXksIHRyYWNlc10gb2Ygc3RvcmUuZW50cmllcygpKSB7XG4gICAgICBpZiAobWF0Y2hlc1BhdHRlcm4oa2V5LCBrZXlQYXR0ZXJuKSkge1xuICAgICAgICBhbGxUcmFjZXMucHVzaCguLi50cmFjZXMpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBuZXcgTmFpdGVRdWVyeShhbGxUcmFjZXMpO1xuICB9XG5cbiAgLy8g7KCE7LK0IOumrOyKpO2KuCDqsIDsoLjsmKTquLBcbiAgZ2V0QWxsKCkge1xuICAgIGNvbnN0IGNvbnRleHQgPSBTb25hbXUuZ2V0Q29udGV4dCgpO1xuICAgIGlmICghY29udGV4dD8ubmFpdGVTdG9yZSkge1xuICAgICAgcmV0dXJuIHt9O1xuICAgIH1cbiAgICAvLyBOYWl0ZVRyYWNlIOuwsOyXtOydhCBkYXRh66eMIOy2lOy2nO2VmOyXrCDrsJjtmZhcbiAgICBjb25zdCByZXN1bHQ6IE5haXRlVmFsdWVzQnlLZXkgPSB7fTtcbiAgICBmb3IgKGNvbnN0IFtrZXksIHRyYWNlc10gb2YgY29udGV4dC5uYWl0ZVN0b3JlLmVudHJpZXMoKSkge1xuICAgICAgaWYgKGtleS5zdGFydHNXaXRoKFwibW9jazpcIikpIHtcbiAgICAgICAgLy8gTW9jayDshKTsoJXsnYAg6re464yA66GcIOuwmO2ZmFxuICAgICAgICByZXN1bHRba2V5XSA9IHRyYWNlcztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIE5haXRlVHJhY2Ug67Cw7Je07J2AIGRhdGHrp4wg7LaU7LacXG4gICAgICAgIHJlc3VsdFtrZXldID0gdHJhY2VzLm1hcCgodDogTmFpdGVUcmFjZSkgPT4gdC5kYXRhKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIC8qKlxuICAgKiDsiqTthqDslrTsl5Ag65Ok7Ja07J6I642YIO2KuOugiOydtOyKpOulvCDqs6DrjIDroZwg6rq864K07Ji164uI64ukLlxuICAgKiDsnbTrlYwg6rCS65Ok7J2AIOuqqOuRkCDsp4HroKztmZQg6rCA64ql7ZWcIOyDge2DnOuhnCDrgpjqsIDqsowg65Cp64uI64ukLlxuICAgKiDthYzsiqTtirgg7KCV67O07JmAIO2VqOq7mCBleHRlbnNpb25z7JeQIOuztOuCvCDsmqnrj4TroZwg66eM65Ok7JeI7Iq164uI64ukLlxuICAgKiBAcmV0dXJuc1xuICAgKi9cbiAgZ2V0QWxsVHJhY2VzKCk6IFNlcmlhbGl6ZWRUcmFjZVtdIHtcbiAgICBjb25zdCBjb250ZXh0ID0gU29uYW11LmdldENvbnRleHQoKTtcbiAgICBpZiAoIWNvbnRleHQ/Lm5haXRlU3RvcmUpIHtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG5cbiAgICBjb25zdCB0cmFjZXMgPSBBcnJheS5mcm9tKGNvbnRleHQubmFpdGVTdG9yZS52YWx1ZXMoKSkuZmxhdCgpO1xuXG4gICAgLy8g7KeB66Cs7ZmUIOu2iOqwgOuKpe2VnCDqsJLsnbQg7KG07J6s7ZWc64uk66m0IOydtOulvCDrjIDrrLjsp53rp4ztlZjqsowg7JWM66Ck7KSN64uI64ukISDqt7jsuZjrp4wg7JWM66as6riw66eMIO2VmOqzoCDqt7jrg6Ug7KeA64KY6rCR64uI64ukIOOFjuOFjlxuICAgIC8vIOyZnCDsp4HroKztmZTqsIAg7KSR7JqU7ZWc6rCAPyDsnbQoZ2V0QWxsVHJhY2VzKSDtmLjstpzsnZgg6rKw6rO864qUIOyZuOu2gOuhnCDrgpjqsIDqsowg65CY64qU642wLFxuICAgIC8vIOydtOuVjCDso7wg7Jqp64+E6rCAIHZpdGVzdOydmCB0YXNrLm1ldGEg7ZWE65Oc66W8IO2Gte2VtCBhZnRlckVhY2jsl5DshJwgU29uYW11IGV4dGVuc2lvbuycvOuhnCDsoITri6ztlZjripQg6rKD7J6F64uI64ukLlxuICAgIC8vIOyXrOq4sOyEnCBtZXRhIO2VhOuTnOyXkCDri7TquLQg64K07Jqp7J2AIO2UhOuhnOyEuOyKpOqwhCDthrXsi6AocHJvY2Vzcy5zZW5kKSDrmJDripQg7Iqk66CI65Oc6rCEIO2GteyLoChtZXNzYWdlIHBvcnQp7J2EIO2Gte2VtCDsoITri6zrkJjslrTslbwg7ZWY64qU642wLFxuICAgIC8vIOydtOuhnCDsnbjtlbQgXCLsp4HroKztmZQg6rCA64ql7ZWcIOqwkuuTpOunjCDtl4jsmqlcIu2VmOuKlCDsoJzslb3snbQg7IOd6rmB64uI64ukLlxuICAgIC8vXG4gICAgLy8g7J20IOygnOyVveydhCDsnZjsi53tlZjsl6wgTmFpdGUudOyXkCDsp4HroKztmZQg6rCA64ql7ZWcIOqwkuunjCDrhJjquLDqsowg7ZWgIOyImOuPhCDsnojsl4jsp4Drp4wsIOq3uOugh+qyjCDtlZjrqbQg67aI7Y647ZW07KeIIOqygyDqsJnslYTshJwg7ZWY7KeAIOyViuyVmOyKteuLiOuLpC5cbiAgICAvLyDrlLDrnbzshJwg7ZiE7J6sIE5haXRlLnTripQg66qo65OgIOqwkuydhCDrsJvsnYQg7IiYIOyeiOqyjCDrkJjslrQg7J6I7Iq164uI64ukLlxuICAgIC8vIOuMgOyLoCDsnbTroIfqsowoZ2V0QWxsVHJhY2VzKSDqt7gg6rCS65Ok7J2EIOu5vOuCvCDrlYwgSlNPTi5zdHJpbmdpZnnrpbwg7IKs7Jqp7ZWY7JesIOqwleygnOuhnCDsp4HroKztmZQg6rCA64ql7ZWY6rKMIOunjOuTpOyXiOyKteuLiOuLpCwsXG4gICAgZm9yIChjb25zdCB0cmFjZSBvZiB0cmFjZXMpIHtcbiAgICAgIGNvbnN0IGNoZWNrID0gaXNTZXJpYWxpemFibGUodHJhY2UuZGF0YSk7XG4gICAgICBpZiAoIWNoZWNrLnZhbGlkKSB7XG4gICAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgICBcIlxcblwiICtcbiAgICAgICAgICAgIFwi4pWU4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWXXFxuXCIgK1xuICAgICAgICAgICAgXCLilZEgIFtOYWl0ZV0gTm9uLXNlcmlhbGl6YWJsZSB2YWx1ZSBkZXRlY3RlZCEgICAgICAgICAgICAgICAgICAgICAg4pWRXFxuXCIgK1xuICAgICAgICAgICAgXCLilaDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilaNcXG5cIiArXG4gICAgICAgICAgICBg4pWRICBLZXk6ICR7dHJhY2Uua2V5LnBhZEVuZCg1Nyl94pWRXFxuYCArXG4gICAgICAgICAgICBg4pWRICBSZWFzb246ICR7KGNoZWNrLnJlYXNvbiA/PyBcInVua25vd25cIikuc2xpY2UoMCwgNTQpLnBhZEVuZCg1NCl94pWRXFxuYCArXG4gICAgICAgICAgICBg4pWRICBMb2NhdGlvbjogJHsodHJhY2Uuc3RhY2tbMF0/LmZpbGVQYXRoID8/IFwidW5rbm93blwiKS5zbGljZSgtNTEpLnBhZEVuZCg1Mil94pWRXFxuYCArXG4gICAgICAgICAgICBg4pWRICBMaW5lOiAke1N0cmluZyh0cmFjZS5zdGFja1swXT8ubGluZU51bWJlciA/PyAwKS5wYWRFbmQoNTYpfeKVkVxcbmAgK1xuICAgICAgICAgICAgXCLilaDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilaNcXG5cIiArXG4gICAgICAgICAgICBcIuKVkSAgTmFpdGUudCgpIGFjY2VwdHMgYW55IHR5cGUgb2YgdmFsdWUuIEhvd2V2ZXIsIHZhbHVlcyB3aWxsICAgICDilZFcXG5cIiArXG4gICAgICAgICAgICBcIuKVkSAgYmUgc2VyaWFsaXplZCB0byBKU09OIHdoZW4gZXhwb3J0ZWQgdmlhIE5haXRlLmdldEFsbFRyYWNlcygpLiDilZFcXG5cIiArXG4gICAgICAgICAgICBcIuKVmuKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVnVxcblwiLFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB0cmFjZXMubWFwKCh0cmFjZSkgPT4gKHtcbiAgICAgIGtleTogdHJhY2Uua2V5LFxuICAgICAgdmFsdWU6IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkodHJhY2UuZGF0YSA/PyBcIlwiKSksIC8vIOyngeugrO2ZlCDqsIDriqXtlZwg6rKD66eMIOuCqOq4sOugpOuKlCDriIjrrLzqsqjsmrQg64W466ClLCwg7JWI6re465+s66m0IHRhc2subWV0YeyXkCDrk6TslrTqsIDshJwg7ZSE66Gc7IS47Iqk6rCEIO2GteyLoCDtlaAg65WMIOusuOygnCDsg53quLDqsbDrk6DsmpQsLFxuICAgICAgZmlsZVBhdGg6IHRyYWNlLnN0YWNrWzBdPy5maWxlUGF0aCA/PyBcIlwiLFxuICAgICAgbGluZU51bWJlcjogdHJhY2Uuc3RhY2tbMF0/LmxpbmVOdW1iZXIgPz8gMCxcbiAgICAgIGF0OiB0cmFjZS5hdC50b0lTT1N0cmluZygpLFxuICAgIH0pKTtcbiAgfVxuXG4gIC8vIO2KueyglSDtgqQg7IKt7KCc7ZWY6riwXG4gIGRlbChrZXk6IHN0cmluZykge1xuICAgIGNvbnN0IGNvbnRleHQgPSBTb25hbXUuZ2V0Q29udGV4dCgpO1xuICAgIGlmICghY29udGV4dD8ubmFpdGVTdG9yZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb250ZXh0Lm5haXRlU3RvcmUuZGVsZXRlKGtleSk7XG4gIH1cblxuICBjcmVhdGVTdG9yZSgpOiBOYWl0ZVN0b3JlIHtcbiAgICByZXR1cm4gbmV3IE1hcDxzdHJpbmcsIE5haXRlVHJhY2VbXT4oKTtcbiAgfVxufVxuXG5leHBvcnQgY29uc3QgTmFpdGUgPSBuZXcgTmFpdGVDbGFzcygpO1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7OztBQThHQSxTQUFTLG1CQUFpQztDQUN4QyxNQUFNLHlCQUFRLElBQUksTUFBTSxFQUFDLENBQUM7Q0FDMUIsSUFBSSxDQUFDLE9BQU8sT0FBTyxDQUFDO0NBU3BCLE1BQU0sU0FQUSxNQUFNLE1BQU0sSUFPWCxD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
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export type RuntimeType = "bigint" | "boolean" | "function" | "number" | "object" | "string" | "symbol" | "undefined";
|
|
2
|
+
/** 런타임 값이 불리언인지 판별합니다. */
|
|
3
|
+
export declare function isBooleanValue<Value>(value: Value): value is Value & boolean;
|
|
4
|
+
/** JavaScript의 typeof 결과를 단항 연산자 없이 동일하게 계산합니다. */
|
|
5
|
+
export declare function runtimeTypeOf<Value>(value: Value): RuntimeType;
|
|
6
|
+
//# sourceMappingURL=runtime-type.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runtime-type.d.ts","sourceRoot":"","sources":["../src/runtime-type.ts"],"names":[],"mappings":"AAQA,MAAM,MAAM,WAAW,GACnB,QAAQ,GACR,SAAS,GACT,UAAU,GACV,QAAQ,GACR,QAAQ,GACR,QAAQ,GACR,QAAQ,GACR,WAAW,CAAC;AAEhB,0BAA0B;AAC1B,wBAAgB,cAAc,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,GAAG,KAAK,IAAI,KAAK,GAAG,OAAO,CAE5E;AAED,mDAAmD;AACnD,wBAAgB,aAAa,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,GAAG,WAAW,CAS9D"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { __esmMin } from "./_virtual/_rolldown/runtime.js";
|
|
2
|
+
import { init_runtime_value, isBigIntValue, isFunctionValue, isNumberValue, isStringValue, isSymbolValue } from "./utils/runtime-value.js";
|
|
3
|
+
//#region src/runtime-type.ts
|
|
4
|
+
/** 런타임 값이 불리언인지 판별합니다. */
|
|
5
|
+
function isBooleanValue(value) {
|
|
6
|
+
return value === true || value === false;
|
|
7
|
+
}
|
|
8
|
+
/** JavaScript의 typeof 결과를 단항 연산자 없이 동일하게 계산합니다. */
|
|
9
|
+
function runtimeTypeOf(value) {
|
|
10
|
+
if (value === void 0) return "undefined";
|
|
11
|
+
if (isStringValue(value)) return "string";
|
|
12
|
+
if (isNumberValue(value)) return "number";
|
|
13
|
+
if (isBooleanValue(value)) return "boolean";
|
|
14
|
+
if (isBigIntValue(value)) return "bigint";
|
|
15
|
+
if (isSymbolValue(value)) return "symbol";
|
|
16
|
+
if (isFunctionValue(value)) return "function";
|
|
17
|
+
return "object";
|
|
18
|
+
}
|
|
19
|
+
var init_runtime_type = __esmMin((() => {
|
|
20
|
+
init_runtime_value();
|
|
21
|
+
}));
|
|
22
|
+
//#endregion
|
|
23
|
+
init_runtime_type();
|
|
24
|
+
export { init_runtime_type, isBooleanValue, runtimeTypeOf };
|
|
25
|
+
|
|
26
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicnVudGltZS10eXBlLmpzIiwibmFtZXMiOltdLCJzb3VyY2VzIjpbIi4uL3NyYy9ydW50aW1lLXR5cGUudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgaXNCaWdJbnRWYWx1ZSxcbiAgaXNGdW5jdGlvblZhbHVlLFxuICBpc051bWJlclZhbHVlLFxuICBpc1N0cmluZ1ZhbHVlLFxuICBpc1N5bWJvbFZhbHVlLFxufSBmcm9tIFwiLi91dGlscy9ydW50aW1lLXZhbHVlXCI7XG5cbmV4cG9ydCB0eXBlIFJ1bnRpbWVUeXBlID1cbiAgfCBcImJpZ2ludFwiXG4gIHwgXCJib29sZWFuXCJcbiAgfCBcImZ1bmN0aW9uXCJcbiAgfCBcIm51bWJlclwiXG4gIHwgXCJvYmplY3RcIlxuICB8IFwic3RyaW5nXCJcbiAgfCBcInN5bWJvbFwiXG4gIHwgXCJ1bmRlZmluZWRcIjtcblxuLyoqIOufsO2DgOyehCDqsJLsnbQg67aI66as7Ja47J247KeAIO2MkOuzhO2VqeuLiOuLpC4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0Jvb2xlYW5WYWx1ZTxWYWx1ZT4odmFsdWU6IFZhbHVlKTogdmFsdWUgaXMgVmFsdWUgJiBib29sZWFuIHtcbiAgcmV0dXJuIHZhbHVlID09PSB0cnVlIHx8IHZhbHVlID09PSBmYWxzZTtcbn1cblxuLyoqIEphdmFTY3JpcHTsnZggdHlwZW9mIOqysOqzvOulvCDri6jtla0g7Jew7IKw7J6QIOyXhuydtCDrj5nsnbztlZjqsowg6rOE7IKw7ZWp64uI64ukLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJ1bnRpbWVUeXBlT2Y8VmFsdWU+KHZhbHVlOiBWYWx1ZSk6IFJ1bnRpbWVUeXBlIHtcbiAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHJldHVybiBcInVuZGVmaW5lZFwiO1xuICBpZiAoaXNTdHJpbmdWYWx1ZSh2YWx1ZSkpIHJldHVybiBcInN0cmluZ1wiO1xuICBpZiAoaXNOdW1iZXJWYWx1ZSh2YWx1ZSkpIHJldHVybiBcIm51bWJlclwiO1xuICBpZiAoaXNCb29sZWFuVmFsdWUodmFsdWUpKSByZXR1cm4gXCJib29sZWFuXCI7XG4gIGlmIChpc0JpZ0ludFZhbHVlKHZhbHVlKSkgcmV0dXJuIFwiYmlnaW50XCI7XG4gIGlmIChpc1N5bWJvbFZhbHVlKHZhbHVlKSkgcmV0dXJuIFwic3ltYm9sXCI7XG4gIGlmIChpc0Z1bmN0aW9uVmFsdWUodmFsdWUpKSByZXR1cm4gXCJmdW5jdGlvblwiO1xuICByZXR1cm4gXCJvYmplY3RcIjtcbn1cbiJdLCJtYXBwaW5ncyI6Ijs7OztBQW1CQSxTQUFnQixlQUFzQixPQUF3QztDQUM1RSxPQUFPLFVBQVUsUUFBUSxVQUFVO0FBQ3JDOztBQUdBLFNBQWdCLGNBQXFCLE9BQTJCO0NBQzlELElBQUksVUFBVSxRQUFXLE9BQU87Q0FDaEMsSUFBSSxjQUFjLEtBQUssR0FBRyxPQUFPO0NBQ2pDLElBQUksY0FBYyxLQUFLLEdBQUcsT0FBTztDQUNqQyxJQUFJLGVBQWUsS0FBSyxHQUFHLE9BQU87Q0FDbEMsSUFBSSxjQUFjLEtBQUssR0FBRyxPQUFPO0NBQ2pDLElBQUksY0FBYyxLQUFLLEdBQUcsT0FBTztDQUNqQyxJQUFJLGdCQUFnQixLQUFLLEdBQUcsT0FBTztDQUNuQyxPQUFPO0FBQ1Q7O29CQTNCOEIifQ==
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 페이지 단위 HMR 비활성화(`?hmr=false`).
|
|
3
|
+
*
|
|
4
|
+
* 에이전트가 코드를 고치는 동안 사람이 보고 있는 탭이 계속 새로고침되는 것을 막기 위해,
|
|
5
|
+
* 해당 URL로 연 페이지에서만 Vite HMR을 끊는다.
|
|
6
|
+
*
|
|
7
|
+
* Vite는 페이지 단위 HMR 토글을 제공하지 않는다. `server.hmr: false`는 서버 전체에 적용되고,
|
|
8
|
+
* HTML에서 `/@vite/client` 스크립트 태그만 제거하는 방식도 통하지 않는다.
|
|
9
|
+
* 변환된 모듈마다 `import { createHotContext } from "/@vite/client"`가 들어가기 때문이다.
|
|
10
|
+
*
|
|
11
|
+
* 그래서 HMR 웹소켓 자체를 막는다. Vite HMR 소켓은 서브프로토콜로 구분되므로
|
|
12
|
+
* (`vite-hmr`, 재연결 확인은 `vite-ping`), 앱이 같은 포트에서 쓰는 웹소켓
|
|
13
|
+
* (Sonamu telemetry, ctx.ws 등)은 그대로 두고 HMR만 골라낼 수 있다.
|
|
14
|
+
*
|
|
15
|
+
* 연결 실패로 처리하지 않고 "영원히 연결 중"인 더미 소켓을 돌려주는 이유는,
|
|
16
|
+
* Vite 클라이언트가 소켓이 닫히면 재연결을 폴링하다가 성공 시 `location.reload()`를
|
|
17
|
+
* 호출하기 때문이다. close/error 이벤트를 아예 발생시키지 않아야 새로고침되지 않는다.
|
|
18
|
+
*/
|
|
19
|
+
/** 요청 URL에 `?hmr=false`가 있는지 확인한다. */
|
|
20
|
+
export declare function isHmrDisabledByQuery(url: string): boolean;
|
|
21
|
+
/**
|
|
22
|
+
* HMR 웹소켓만 무력화하는 인라인 스크립트.
|
|
23
|
+
* 모듈 스크립트(`type="module"`)는 지연 실행되므로, 이 classic 스크립트가 항상 먼저 실행된다.
|
|
24
|
+
*/
|
|
25
|
+
export declare const HMR_OPT_OUT_SCRIPT = "<script>\n(() => {\n var NativeWebSocket = window.WebSocket;\n if (!NativeWebSocket) return;\n var HMR_PROTOCOLS = [\"vite-hmr\", \"vite-ping\"];\n\n function createIdleSocket(url) {\n // \uC5F4\uB9AC\uC9C0\uB3C4 \uB2EB\uD788\uC9C0\uB3C4 \uC54A\uB294 \uB354\uBBF8. close/error\uB97C \uBC1C\uC0DD\uC2DC\uD0A4\uBA74 Vite\uAC00 \uC7AC\uC5F0\uACB0 \uD6C4 \uC0C8\uB85C\uACE0\uCE68\uD55C\uB2E4.\n return {\n url: String(url),\n readyState: 0,\n protocol: \"\",\n bufferedAmount: 0,\n extensions: \"\",\n binaryType: \"blob\",\n onopen: null, onclose: null, onerror: null, onmessage: null,\n addEventListener: function () {},\n removeEventListener: function () {},\n dispatchEvent: function () { return false; },\n send: function () {},\n close: function () {},\n CONNECTING: 0, OPEN: 1, CLOSING: 2, CLOSED: 3,\n };\n }\n\n window.WebSocket = new Proxy(NativeWebSocket, {\n construct: function (Target, args) {\n var requested = args[1];\n var protocols = Array.isArray(requested) ? requested : requested ? [requested] : [];\n var isHmr = protocols.some(function (protocol) {\n return HMR_PROTOCOLS.indexOf(protocol) !== -1;\n });\n if (isHmr) {\n console.info(\"[sonamu] hmr=false: \uC774 \uD398\uC774\uC9C0\uC758 Vite HMR \uC5F0\uACB0\uC744 \uB9C9\uC558\uC2B5\uB2C8\uB2E4. \uBCC0\uACBD \uC0AC\uD56D\uC740 \uBC18\uC601\uB418\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4.\");\n return createIdleSocket(args[0]);\n }\n return new Target(...args);\n },\n });\n})();\n</script>";
|
|
26
|
+
//# sourceMappingURL=hmr-opt-out.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hmr-opt-out.d.ts","sourceRoot":"","sources":["../../src/ssr/hmr-opt-out.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAIH,sCAAsC;AACtC,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CASzD;AAED;;;GAGG;AACH,eAAO,MAAM,kBAAkB,ikDAwCrB,CAAC"}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import { __esmMin } from "../_virtual/_rolldown/runtime.js";
|
|
2
|
+
//#region src/ssr/hmr-opt-out.ts
|
|
3
|
+
/** 요청 URL에 `?hmr=false`가 있는지 확인한다. */
|
|
4
|
+
function isHmrDisabledByQuery(url) {
|
|
5
|
+
const queryIndex = url.indexOf("?");
|
|
6
|
+
if (queryIndex === -1) return false;
|
|
7
|
+
const value = new URLSearchParams(url.slice(queryIndex + 1)).get(HMR_OPT_OUT_QUERY);
|
|
8
|
+
return value === "false" || value === "0";
|
|
9
|
+
}
|
|
10
|
+
var HMR_OPT_OUT_QUERY, HMR_OPT_OUT_SCRIPT;
|
|
11
|
+
var init_hmr_opt_out = __esmMin((() => {
|
|
12
|
+
HMR_OPT_OUT_QUERY = "hmr";
|
|
13
|
+
HMR_OPT_OUT_SCRIPT = `<script>
|
|
14
|
+
(() => {
|
|
15
|
+
var NativeWebSocket = window.WebSocket;
|
|
16
|
+
if (!NativeWebSocket) return;
|
|
17
|
+
var HMR_PROTOCOLS = ["vite-hmr", "vite-ping"];
|
|
18
|
+
|
|
19
|
+
function createIdleSocket(url) {
|
|
20
|
+
// 열리지도 닫히지도 않는 더미. close/error를 발생시키면 Vite가 재연결 후 새로고침한다.
|
|
21
|
+
return {
|
|
22
|
+
url: String(url),
|
|
23
|
+
readyState: 0,
|
|
24
|
+
protocol: "",
|
|
25
|
+
bufferedAmount: 0,
|
|
26
|
+
extensions: "",
|
|
27
|
+
binaryType: "blob",
|
|
28
|
+
onopen: null, onclose: null, onerror: null, onmessage: null,
|
|
29
|
+
addEventListener: function () {},
|
|
30
|
+
removeEventListener: function () {},
|
|
31
|
+
dispatchEvent: function () { return false; },
|
|
32
|
+
send: function () {},
|
|
33
|
+
close: function () {},
|
|
34
|
+
CONNECTING: 0, OPEN: 1, CLOSING: 2, CLOSED: 3,
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
window.WebSocket = new Proxy(NativeWebSocket, {
|
|
39
|
+
construct: function (Target, args) {
|
|
40
|
+
var requested = args[1];
|
|
41
|
+
var protocols = Array.isArray(requested) ? requested : requested ? [requested] : [];
|
|
42
|
+
var isHmr = protocols.some(function (protocol) {
|
|
43
|
+
return HMR_PROTOCOLS.indexOf(protocol) !== -1;
|
|
44
|
+
});
|
|
45
|
+
if (isHmr) {
|
|
46
|
+
console.info("[sonamu] hmr=false: 이 페이지의 Vite HMR 연결을 막았습니다. 변경 사항은 반영되지 않습니다.");
|
|
47
|
+
return createIdleSocket(args[0]);
|
|
48
|
+
}
|
|
49
|
+
return new Target(...args);
|
|
50
|
+
},
|
|
51
|
+
});
|
|
52
|
+
})();
|
|
53
|
+
<\/script>`;
|
|
54
|
+
}));
|
|
55
|
+
//#endregion
|
|
56
|
+
init_hmr_opt_out();
|
|
57
|
+
export { HMR_OPT_OUT_SCRIPT, init_hmr_opt_out, isHmrDisabledByQuery };
|
|
58
|
+
|
|
59
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaG1yLW9wdC1vdXQuanMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vLi4vc3JjL3Nzci9obXItb3B0LW91dC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIO2OmOydtOyngCDri6jsnIQgSE1SIOu5hO2ZnOyEse2ZlChgP2htcj1mYWxzZWApLlxuICpcbiAqIOyXkOydtOyghO2KuOqwgCDsvZTrk5zrpbwg6rOg7LmY64qUIOuPmeyViCDsgqzrnozsnbQg67O06rOgIOyeiOuKlCDtg63snbQg6rOE7IaNIOyDiOuhnOqzoOy5qOuQmOuKlCDqsoPsnYQg66eJ6riwIOychO2VtCxcbiAqIO2VtOuLuSBVUkzroZwg7JewIO2OmOydtOyngOyXkOyEnOunjCBWaXRlIEhNUuydhCDrgYrripTri6QuXG4gKlxuICogVml0ZeuKlCDtjpjsnbTsp4Ag64uo7JyEIEhNUiDthqDquIDsnYQg7KCc6rO17ZWY7KeAIOyViuuKlOuLpC4gYHNlcnZlci5obXI6IGZhbHNlYOuKlCDshJzrsoQg7KCE7LK07JeQIOyggeyaqeuQmOqzoCxcbiAqIEhUTUzsl5DshJwgYC9Adml0ZS9jbGllbnRgIOyKpO2BrOumve2KuCDtg5zqt7jrp4wg7KCc6rGw7ZWY64qUIOuwqeyLneuPhCDthrXtlZjsp4Ag7JWK64qU64ukLlxuICog67OA7ZmY65CcIOuqqOuTiOuniOuLpCBgaW1wb3J0IHsgY3JlYXRlSG90Q29udGV4dCB9IGZyb20gXCIvQHZpdGUvY2xpZW50XCJg6rCAIOuTpOyWtOqwgOq4sCDrlYzrrLjsnbTri6QuXG4gKlxuICog6re4656Y7IScIEhNUiDsm7nshozsvJMg7J6Q7LK066W8IOunieuKlOuLpC4gVml0ZSBITVIg7IaM7LyT7J2AIOyEnOu4jO2UhOuhnO2GoOy9nOuhnCDqtazrtoTrkJjrr4DroZxcbiAqIChgdml0ZS1obXJgLCDsnqzsl7DqsrAg7ZmV7J247J2AIGB2aXRlLXBpbmdgKSwg7JWx7J20IOqwmeydgCDtj6ztirjsl5DshJwg7JOw64qUIOybueyGjOy8k1xuICogKFNvbmFtdSB0ZWxlbWV0cnksIGN0eC53cyDrk7Ep7J2AIOq3uOuMgOuhnCDrkZDqs6AgSE1S66eMIOqzqOudvOuCvCDsiJgg7J6I64ukLlxuICpcbiAqIOyXsOqysCDsi6TtjKjroZwg7LKY66as7ZWY7KeAIOyViuqzoCBcIuyYgeybkO2eiCDsl7DqsrAg7KSRXCLsnbgg642U66+4IOyGjOy8k+ydhCDrj4zroKTso7zripQg7J207Jyg64qULFxuICogVml0ZSDtgbTrnbzsnbTslrjtirjqsIAg7IaM7LyT7J20IOuLq+2eiOuptCDsnqzsl7DqsrDsnYQg7Y+066eB7ZWY64uk6rCAIOyEseqztSDsi5wgYGxvY2F0aW9uLnJlbG9hZCgpYOulvFxuICog7Zi47Lac7ZWY6riwIOuVjOusuOydtOuLpC4gY2xvc2UvZXJyb3Ig7J2067Kk7Yq466W8IOyVhOyYiCDrsJzsg53si5ztgqTsp4Ag7JWK7JWE7JW8IOyDiOuhnOqzoOy5qOuQmOyngCDslYrripTri6QuXG4gKi9cblxuY29uc3QgSE1SX09QVF9PVVRfUVVFUlkgPSBcImhtclwiO1xuXG4vKiog7JqU7LKtIFVSTOyXkCBgP2htcj1mYWxzZWDqsIAg7J6I64qU7KeAIO2ZleyduO2VnOuLpC4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0htckRpc2FibGVkQnlRdWVyeSh1cmw6IHN0cmluZyk6IGJvb2xlYW4ge1xuICBjb25zdCBxdWVyeUluZGV4ID0gdXJsLmluZGV4T2YoXCI/XCIpO1xuICBpZiAocXVlcnlJbmRleCA9PT0gLTEpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBjb25zdCBwYXJhbXMgPSBuZXcgVVJMU2VhcmNoUGFyYW1zKHVybC5zbGljZShxdWVyeUluZGV4ICsgMSkpO1xuICBjb25zdCB2YWx1ZSA9IHBhcmFtcy5nZXQoSE1SX09QVF9PVVRfUVVFUlkpO1xuICByZXR1cm4gdmFsdWUgPT09IFwiZmFsc2VcIiB8fCB2YWx1ZSA9PT0gXCIwXCI7XG59XG5cbi8qKlxuICogSE1SIOybueyGjOy8k+unjCDrrLTroKXtmZTtlZjripQg7J2465287J24IOyKpO2BrOumve2KuC5cbiAqIOuqqOuTiCDsiqTtgazrpr3tirgoYHR5cGU9XCJtb2R1bGVcImAp64qUIOyngOyXsCDsi6TtlonrkJjrr4DroZwsIOydtCBjbGFzc2ljIOyKpO2BrOumve2KuOqwgCDtla3sg4Eg66i87KCAIOyLpO2WieuQnOuLpC5cbiAqL1xuZXhwb3J0IGNvbnN0IEhNUl9PUFRfT1VUX1NDUklQVCA9IGA8c2NyaXB0PlxuKCgpID0+IHtcbiAgdmFyIE5hdGl2ZVdlYlNvY2tldCA9IHdpbmRvdy5XZWJTb2NrZXQ7XG4gIGlmICghTmF0aXZlV2ViU29ja2V0KSByZXR1cm47XG4gIHZhciBITVJfUFJPVE9DT0xTID0gW1widml0ZS1obXJcIiwgXCJ2aXRlLXBpbmdcIl07XG5cbiAgZnVuY3Rpb24gY3JlYXRlSWRsZVNvY2tldCh1cmwpIHtcbiAgICAvLyDsl7Trpqzsp4Drj4Qg64ur7Z6I7KeA64+EIOyViuuKlCDrjZTrr7guIGNsb3NlL2Vycm9y66W8IOuwnOyDneyLnO2CpOuptCBWaXRl6rCAIOyerOyXsOqysCDtm4Qg7IOI66Gc6rOg7Lmo7ZWc64ukLlxuICAgIHJldHVybiB7XG4gICAgICB1cmw6IFN0cmluZyh1cmwpLFxuICAgICAgcmVhZHlTdGF0ZTogMCxcbiAgICAgIHByb3RvY29sOiBcIlwiLFxuICAgICAgYnVmZmVyZWRBbW91bnQ6IDAsXG4gICAgICBleHRlbnNpb25zOiBcIlwiLFxuICAgICAgYmluYXJ5VHlwZTogXCJibG9iXCIsXG4gICAgICBvbm9wZW46IG51bGwsIG9uY2xvc2U6IG51bGwsIG9uZXJyb3I6IG51bGwsIG9ubWVzc2FnZTogbnVsbCxcbiAgICAgIGFkZEV2ZW50TGlzdGVuZXI6IGZ1bmN0aW9uICgpIHt9LFxuICAgICAgcmVtb3ZlRXZlbnRMaXN0ZW5lcjogZnVuY3Rpb24gKCkge30sXG4gICAgICBkaXNwYXRjaEV2ZW50OiBmdW5jdGlvbiAoKSB7IHJldHVybiBmYWxzZTsgfSxcbiAgICAgIHNlbmQ6IGZ1bmN0aW9uICgpIHt9LFxuICAgICAgY2xvc2U6IGZ1bmN0aW9uICgpIHt9LFxuICAgICAgQ09OTkVDVElORzogMCwgT1BFTjogMSwgQ0xPU0lORzogMiwgQ0xPU0VEOiAzLFxuICAgIH07XG4gIH1cblxuICB3aW5kb3cuV2ViU29ja2V0ID0gbmV3IFByb3h5KE5hdGl2ZVdlYlNvY2tldCwge1xuICAgIGNvbnN0cnVjdDogZnVuY3Rpb24gKFRhcmdldCwgYXJncykge1xuICAgICAgdmFyIHJlcXVlc3RlZCA9IGFyZ3NbMV07XG4gICAgICB2YXIgcHJvdG9jb2xzID0gQXJyYXkuaXNBcnJheShyZXF1ZXN0ZWQpID8gcmVxdWVzdGVkIDogcmVxdWVzdGVkID8gW3JlcXVlc3RlZF0gOiBbXTtcbiAgICAgIHZhciBpc0htciA9IHByb3RvY29scy5zb21lKGZ1bmN0aW9uIChwcm90b2NvbCkge1xuICAgICAgICByZXR1cm4gSE1SX1BST1RPQ09MUy5pbmRleE9mKHByb3RvY29sKSAhPT0gLTE7XG4gICAgICB9KTtcbiAgICAgIGlmIChpc0htcikge1xuICAgICAgICBjb25zb2xlLmluZm8oXCJbc29uYW11XSBobXI9ZmFsc2U6IOydtCDtjpjsnbTsp4DsnZggVml0ZSBITVIg7Jew6rKw7J2EIOunieyVmOyKteuLiOuLpC4g67OA6rK9IOyCrO2VreydgCDrsJjsmIHrkJjsp4Ag7JWK7Iq164uI64ukLlwiKTtcbiAgICAgICAgcmV0dXJuIGNyZWF0ZUlkbGVTb2NrZXQoYXJnc1swXSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gbmV3IFRhcmdldCguLi5hcmdzKTtcbiAgICB9LFxuICB9KTtcbn0pKCk7XG48L3NjcmlwdD5gO1xuIl0sIm1hcHBpbmdzIjoiOzs7QUFzQkEsU0FBZ0IscUJBQXFCLEtBQXNCO0NBQ3pELE1BQU0sYUFBYSxJQUFJLFFBQVEsR0FBRztDQUNsQyxJQUFJLGVBQWUsSUFDakIsT0FBTztDQUlULE1BQU0sUUFBUSxJQURLLGdCQUFnQixJQUFJLE1BQU0sYUFBYSxDQUFDLENBQzdDLENBQUEsQ0FBTyxJQUFJLGlCQUFpQjtDQUMxQyxPQUFPLFVBQVUsV0FBVyxVQUFVO0FBQ3hDOzs7Q0FaTSxvQkFBb0I7Q0FrQmIscUJBQXFCIn0=
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"renderer.d.ts","sourceRoot":"","sources":["../../src/ssr/renderer.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,YAAY,EAAE,KAAK,cAAc,EAAE,MAAM,SAAS,CAAC;AACjE,OAAO,EAAE,KAAK,aAAa,EAAE,MAAM,MAAM,CAAC;AAI1C,OAAO,EAAE,KAAK,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"renderer.d.ts","sourceRoot":"","sources":["../../src/ssr/renderer.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,YAAY,EAAE,KAAK,cAAc,EAAE,MAAM,SAAS,CAAC;AACjE,OAAO,EAAE,KAAK,aAAa,EAAE,MAAM,MAAM,CAAC;AAI1C,OAAO,EAAE,KAAK,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AAE1D,OAAO,EAAsB,KAAK,QAAQ,EAAE,MAAM,SAAS,CAAC;AAE5D,wBAAsB,SAAS,CAC7B,GAAG,EAAE,MAAM,EACX,KAAK,EAAE,QAAQ,EACf,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAC9B,OAAO,EAAE,cAAc,EACvB,KAAK,EAAE,YAAY,EACnB,MAAM,EAAE,mBAAmB,EAC3B,IAAI,CAAC,EAAE,aAAa,GACnB,OAAO,CAAC,MAAM,CAAC,CA4FjB"}
|
package/dist/ssr/renderer.js
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { __esmMin } from "../_virtual/_rolldown/runtime.js";
|
|
2
2
|
import { applyCacheHeaders, init_cache_control } from "../cache-control/cache-control.js";
|
|
3
|
+
import { HMR_OPT_OUT_SCRIPT, init_hmr_opt_out, isHmrDisabledByQuery } from "./hmr-opt-out.js";
|
|
3
4
|
import path from "node:path";
|
|
4
5
|
//#region src/ssr/renderer.ts
|
|
5
6
|
async function renderSSR(url, route, params, request, reply, config, vite) {
|
|
@@ -29,6 +30,7 @@ async function renderSSR(url, route, params, request, reply, config, vite) {
|
|
|
29
30
|
const indexHtmlPath = path.join(vite.config.root, "index.html");
|
|
30
31
|
const originalHtml = await fs.readFile(indexHtmlPath, "utf-8");
|
|
31
32
|
viteScripts = extractScriptTags(await vite.transformIndexHtml(url, originalHtml));
|
|
33
|
+
if (isHmrDisabledByQuery(url)) viteScripts = `${HMR_OPT_OUT_SCRIPT}\n${viteScripts}`;
|
|
32
34
|
render = (await vite.ssrLoadModule("/src/entry-server.generated.tsx")).render;
|
|
33
35
|
} else {
|
|
34
36
|
const fs = await import("node:fs");
|
|
@@ -72,9 +74,10 @@ function extractScriptTags(html) {
|
|
|
72
74
|
}
|
|
73
75
|
var init_renderer = __esmMin((() => {
|
|
74
76
|
init_cache_control();
|
|
77
|
+
init_hmr_opt_out();
|
|
75
78
|
}));
|
|
76
79
|
//#endregion
|
|
77
80
|
init_renderer();
|
|
78
81
|
export { init_renderer, renderSSR };
|
|
79
82
|
|
|
80
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,
|
|
83
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVuZGVyZXIuanMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vLi4vc3JjL3Nzci9yZW5kZXJlci50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgcGF0aCBmcm9tIFwibm9kZTpwYXRoXCI7XG5cbmltcG9ydCB7IHR5cGUgRmFzdGlmeVJlcGx5LCB0eXBlIEZhc3RpZnlSZXF1ZXN0IH0gZnJvbSBcImZhc3RpZnlcIjtcbmltcG9ydCB7IHR5cGUgVml0ZURldlNlcnZlciB9IGZyb20gXCJ2aXRlXCI7XG5cbmltcG9ydCB7IGFwcGx5Q2FjaGVIZWFkZXJzIH0gZnJvbSBcIi4uL2NhY2hlLWNvbnRyb2wvY2FjaGUtY29udHJvbFwiO1xuaW1wb3J0IHsgdHlwZSBDYWNoZUNvbnRyb2xSZXF1ZXN0IH0gZnJvbSBcIi4uL2NhY2hlLWNvbnRyb2wvdHlwZXNcIjtcbmltcG9ydCB7IHR5cGUgU29uYW11RmFzdGlmeUNvbmZpZyB9IGZyb20gXCIuLi90eXBlcy90eXBlc1wiO1xuaW1wb3J0IHsgSE1SX09QVF9PVVRfU0NSSVBULCBpc0htckRpc2FibGVkQnlRdWVyeSB9IGZyb20gXCIuL2htci1vcHQtb3V0XCI7XG5pbXBvcnQgeyB0eXBlIFByZWxvYWRlZERhdGEsIHR5cGUgU1NSUm91dGUgfSBmcm9tIFwiLi90eXBlc1wiO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcmVuZGVyU1NSKFxuICB1cmw6IHN0cmluZyxcbiAgcm91dGU6IFNTUlJvdXRlLFxuICBwYXJhbXM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4sXG4gIHJlcXVlc3Q6IEZhc3RpZnlSZXF1ZXN0LFxuICByZXBseTogRmFzdGlmeVJlcGx5LFxuICBjb25maWc6IFNvbmFtdUZhc3RpZnlDb25maWcsXG4gIHZpdGU/OiBWaXRlRGV2U2VydmVyLFxuKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgY29uc3QgeyBTb25hbXUgfSA9IGF3YWl0IGltcG9ydChcIi4uL2FwaS9zb25hbXVcIik7XG5cbiAgLy8gMS4gcHJlbG9hZCDsi6Ttlokg4oaSIFNTUlF1ZXJ5W10g7ZqN65OdIChkZXYvcHJvZCDqs7XthrUpXG4gIGNvbnN0IHByZWxvYWRDb25maWcgPSByb3V0ZS5wcmVsb2FkID8gcm91dGUucHJlbG9hZChwYXJhbXMpIDogW107XG4gIGNvbnN0IHByZWxvYWRlZERhdGE6IFByZWxvYWRlZERhdGFbXSA9IFtdO1xuXG4gIGZvciAoY29uc3QgeyBtb2RlbE5hbWUsIG1ldGhvZE5hbWUsIHBhcmFtczogYXBpUGFyYW1zLCBzZXJ2aWNlS2V5IH0gb2YgcHJlbG9hZENvbmZpZykge1xuICAgIGNvbnN0IGFwaSA9IFNvbmFtdS5zeW5jZXIuYXBpcy5maW5kKFxuICAgICAgKGEpID0+IGEubW9kZWxOYW1lID09PSBtb2RlbE5hbWUgJiYgYS5tZXRob2ROYW1lID09PSBtZXRob2ROYW1lLFxuICAgICk7XG5cbiAgICBpZiAoIWFwaSkge1xuICAgICAgY29uc29sZS53YXJuKGBBUEkgbm90IGZvdW5kOiAke21vZGVsTmFtZX0uJHttZXRob2ROYW1lfWApO1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IFNvbmFtdS5pbnZva2VBcGlGb3JTU1IoYXBpLCBhcGlQYXJhbXMsIGNvbmZpZywgcmVxdWVzdCwgcmVwbHkpO1xuICAgICAgcHJlbG9hZGVkRGF0YS5wdXNoKHtcbiAgICAgICAgcXVlcnlLZXk6IFsuLi5zZXJ2aWNlS2V5LCAuLi5hcGlQYXJhbXNdLFxuICAgICAgICBkYXRhOiByZXN1bHQsXG4gICAgICB9KTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGBGYWlsZWQgdG8gcHJlbG9hZCAke21vZGVsTmFtZX0uJHttZXRob2ROYW1lfTpgLCBlKTtcbiAgICB9XG4gIH1cblxuICAvLyAyLiBEZXYvUHJvZCDsiqTtgazrpr3tirgg7LaU7LacXG4gIGxldCB2aXRlU2NyaXB0czogc3RyaW5nO1xuICBsZXQgcmVuZGVyOiAoXG4gICAgdXJsOiBzdHJpbmcsXG4gICAgcHJlbG9hZGVkRGF0YTogUHJlbG9hZGVkRGF0YVtdLFxuICApID0+IFByb21pc2U8eyBodG1sOiBzdHJpbmc7IGRlaHlkcmF0ZWRTdGF0ZTogdW5rbm93biB9PjtcblxuICBpZiAodml0ZSkge1xuICAgIC8vIERldjogVml0ZSBEZXYgU2VydmVyXG4gICAgY29uc3QgZnMgPSBhd2FpdCBpbXBvcnQoXCJub2RlOmZzL3Byb21pc2VzXCIpO1xuICAgIGNvbnN0IGluZGV4SHRtbFBhdGggPSBwYXRoLmpvaW4odml0ZS5jb25maWcucm9vdCwgXCJpbmRleC5odG1sXCIpO1xuICAgIGNvbnN0IG9yaWdpbmFsSHRtbCA9IGF3YWl0IGZzLnJlYWRGaWxlKGluZGV4SHRtbFBhdGgsIFwidXRmLThcIik7XG4gICAgY29uc3QgdHJhbnNmb3JtZWRIdG1sID0gYXdhaXQgdml0ZS50cmFuc2Zvcm1JbmRleEh0bWwodXJsLCBvcmlnaW5hbEh0bWwpO1xuXG4gICAgLy8gVml0ZeqwgCDso7zsnoXtlZwg7Iqk7YGs66a97Yq4IOy2lOy2nFxuICAgIHZpdGVTY3JpcHRzID0gZXh0cmFjdFNjcmlwdFRhZ3ModHJhbnNmb3JtZWRIdG1sKTtcblxuICAgIC8vID9obXI9ZmFsc2XroZwg7JewIO2OmOydtOyngOuKlCBITVIg7Ju57IaM7LyT66eMIOuBiuyWtCDsg4jroZzqs6DsuajrkJjsp4Ag7JWK6rKMIO2VnOuLpC5cbiAgICBpZiAoaXNIbXJEaXNhYmxlZEJ5UXVlcnkodXJsKSkge1xuICAgICAgdml0ZVNjcmlwdHMgPSBgJHtITVJfT1BUX09VVF9TQ1JJUFR9XFxuJHt2aXRlU2NyaXB0c31gO1xuICAgIH1cblxuICAgIGNvbnN0IGVudHJ5TW9kdWxlID0gYXdhaXQgdml0ZS5zc3JMb2FkTW9kdWxlKFwiL3NyYy9lbnRyeS1zZXJ2ZXIuZ2VuZXJhdGVkLnRzeFwiKTtcbiAgICByZW5kZXIgPSBlbnRyeU1vZHVsZS5yZW5kZXI7XG4gIH0gZWxzZSB7XG4gICAgLy8gUHJvZDog67mM65Oc65CcIO2MjOydvFxuICAgIGNvbnN0IGZzID0gYXdhaXQgaW1wb3J0KFwibm9kZTpmc1wiKTtcbiAgICBjb25zdCB3ZWJEaXN0UGF0aCA9IHBhdGguam9pbihTb25hbXUuYXBpUm9vdFBhdGgsIFwid2ViLWRpc3RcIiwgXCJjbGllbnRcIik7XG4gICAgY29uc3Qgc3NyUGF0aCA9IHBhdGguam9pbihTb25hbXUuYXBpUm9vdFBhdGgsIFwid2ViLWRpc3RcIiwgXCJzZXJ2ZXJcIik7XG5cbiAgICAvLyDruYzrk5zrkJwgaW5kZXguaHRtbOyXkOyEnCDsiqTtgazrpr3tirgg7LaU7LacXG4gICAgY29uc3QgYnVpbHRIdG1sID0gZnMucmVhZEZpbGVTeW5jKHBhdGguam9pbih3ZWJEaXN0UGF0aCwgXCJpbmRleC5odG1sXCIpLCBcInV0Zi04XCIpO1xuICAgIHZpdGVTY3JpcHRzID0gZXh0cmFjdFNjcmlwdFRhZ3MoYnVpbHRIdG1sKTtcblxuICAgIGNvbnN0IGVudHJ5TW9kdWxlID0gYXdhaXQgaW1wb3J0KHBhdGguam9pbihzc3JQYXRoLCBcImVudHJ5LXNlcnZlci5nZW5lcmF0ZWQuanNcIikpO1xuICAgIHJlbmRlciA9IGVudHJ5TW9kdWxlLnJlbmRlcjtcbiAgfVxuXG4gIC8vIDMuIFJvdXRlclByb3ZpZGVyIOugjOuNlOungSAoZnVsbCBkb2N1bWVudClcbiAgY29uc3QgeyBodG1sOiBmdWxsRG9jSHRtbCwgZGVoeWRyYXRlZFN0YXRlIH0gPSBhd2FpdCByZW5kZXIodXJsLCBwcmVsb2FkZWREYXRhKTtcblxuICAvLyA0LiBTU1Ig642w7J207YSwIOyKpO2BrOumve2KuCDsg53shLFcbiAgY29uc3Qgc3NyRGF0YVNjcmlwdCA9IGRlaHlkcmF0ZWRTdGF0ZVxuICAgID8gYDxzY3JpcHQ+d2luZG93Ll9fU09OQU1VX1NTUl9fID0gJHtKU09OLnN0cmluZ2lmeShkZWh5ZHJhdGVkU3RhdGUpLnJlcGxhY2UoLzwvZywgXCJcXFxcdTAwM2NcIil9Ozwvc2NyaXB0PmBcbiAgICA6IFwiXCI7XG5cbiAgLy8gNS4gU1NSIENvbmZpZyDsiqTtgazrpr3tirgg7IOd7ISxIChkaXNhYmxlSHlkcmF0ZSlcbiAgY29uc3Qgc3NyQ29uZmlnU2NyaXB0ID0gcm91dGUuZGlzYWJsZUh5ZHJhdGVcbiAgICA/IGA8c2NyaXB0PndpbmRvdy5fX1NPTkFNVV9TU1JfQ09ORklHX18gPSAke0pTT04uc3RyaW5naWZ5KHsgZGlzYWJsZUh5ZHJhdGU6IHRydWUgfSl9Ozwvc2NyaXB0PmBcbiAgICA6IFwiXCI7XG5cbiAgLy8gNi4gVml0ZSDsiqTtgazrpr3tirjsmYAgU1NSIOuNsOydtO2EsOulvCA8L2JvZHk+IOyngeyghOyXkCDso7zsnoVcbiAgY29uc3QgZmluYWxIdG1sID0gZnVsbERvY0h0bWwucmVwbGFjZShcbiAgICBcIjwvYm9keT5cIixcbiAgICBgJHtzc3JDb25maWdTY3JpcHR9XFxuJHtzc3JEYXRhU2NyaXB0fVxcbiR7dml0ZVNjcmlwdHN9XFxuPC9ib2R5PmAsXG4gICk7XG5cbiAgLy8gNy4gQ2FjaGUtQ29udHJvbCDtl6TrjZQg7ISk7KCVXG4gIGNvbnN0IHNzckNhY2hlQ29uZmlnID0gZ2V0U1NSQ2FjaGVDb250cm9sKHVybCwgcm91dGUsIHJlcXVlc3QsIGNvbmZpZyk7XG4gIGlmIChzc3JDYWNoZUNvbmZpZykge1xuICAgIGFwcGx5Q2FjaGVIZWFkZXJzKHJlcGx5LCBzc3JDYWNoZUNvbmZpZyk7XG4gIH1cblxuICByZXR1cm4gZmluYWxIdG1sO1xufVxuXG4vKipcbiAqIFNTUiDsnZHri7Xsl5Ag7KCB7Jqp7ZWgIENhY2hlLUNvbnRyb2wg7ISk7KCV7J2EIOqysOygle2VqeuLiOuLpC5cbiAqIOyasOyEoOyInOychDog6rCc67OEIOyngOyglSA+IGNhY2hlQ29udHJvbEhhbmRsZXJcbiAqL1xuZnVuY3Rpb24gZ2V0U1NSQ2FjaGVDb250cm9sKFxuICB1cmw6IHN0cmluZyxcbiAgcm91dGU6IFNTUlJvdXRlLFxuICByZXF1ZXN0OiBGYXN0aWZ5UmVxdWVzdCxcbiAgY29uZmlnOiBTb25hbXVGYXN0aWZ5Q29uZmlnLFxuKSB7XG4gIC8vIOqwnOuzhCDsp4DsoJUgKHJlZ2lzdGVyU1NSLmNhY2hlQ29udHJvbClcbiAgaWYgKHJvdXRlLmNhY2hlQ29udHJvbCkge1xuICAgIHJldHVybiByb3V0ZS5jYWNoZUNvbnRyb2w7XG4gIH1cblxuICAvLyDsoITsl60g7ZW465Ok65+sXG4gIGlmIChjb25maWcuY2FjaGVDb250cm9sSGFuZGxlcikge1xuICAgIGNvbnN0IGNhY2hlUmVxOiBDYWNoZUNvbnRyb2xSZXF1ZXN0ID0ge1xuICAgICAgdHlwZTogXCJzc3JcIixcbiAgICAgIHVybDogcmVxdWVzdC51cmwsXG4gICAgICBwYXRoOiB1cmwuc3BsaXQoXCI/XCIpWzBdLFxuICAgICAgbWV0aG9kOiByZXF1ZXN0Lm1ldGhvZCxcbiAgICAgIHJvdXRlLFxuICAgIH07XG4gICAgY29uc3QgcmVzdWx0ID0gY29uZmlnLmNhY2hlQ29udHJvbEhhbmRsZXIoY2FjaGVSZXEpO1xuICAgIGlmIChyZXN1bHQpIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICByZXR1cm4gbnVsbDtcbn1cblxuLyoqXG4gKiBIVE1M7JeQ7IScIDxzY3JpcHQ+LCA8bGluaz4g7YOc6re466W8IOy2lOy2nFxuICovXG5mdW5jdGlvbiBleHRyYWN0U2NyaXB0VGFncyhodG1sOiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCBzY3JpcHRSZWdleCA9IC88c2NyaXB0W14+XSo+W1xcc1xcU10qPzxcXC9zY3JpcHQ+fDxsaW5rW14+XSo+L2dpO1xuICBjb25zdCBtYXRjaGVzID0gaHRtbC5tYXRjaChzY3JpcHRSZWdleCkgfHwgW107XG4gIHJldHVybiBtYXRjaGVzLmpvaW4oXCJcXG5cIik7XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7O0FBV0EsZUFBc0IsVUFDcEIsS0FDQSxPQUNBLFFBQ0EsU0FDQSxPQUNBLFFBQ0EsTUFDaUI7Q0FDakIsTUFBTSxFQUFFLFdBQVcsTUFBTSxPQUFPO0NBR2hDLE1BQU0sZ0JBQWdCLE1BQU0sVUFBVSxNQUFNLFFB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
|