sonamu 0.10.12 → 0.10.13
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/ai/agents/agent.d.ts +1 -1
- package/dist/ai/agents/agent.d.ts.map +1 -1
- package/dist/ai/agents/agent.js +5 -6
- package/dist/ai/agents/types.d.ts +1 -1
- package/dist/ai/agents/types.d.ts.map +1 -1
- package/dist/ai/providers/rtzr/api.js +18 -18
- package/dist/ai/providers/rtzr/error.d.ts.map +1 -1
- package/dist/ai/providers/rtzr/error.js +17 -15
- package/dist/ai/providers/rtzr/model.d.ts.map +1 -1
- package/dist/ai/providers/rtzr/model.js +3 -2
- package/dist/ai/providers/rtzr/options.d.ts.map +1 -1
- package/dist/ai/providers/rtzr/options.js +16 -16
- package/dist/ai/providers/rtzr/provider.d.ts.map +1 -1
- package/dist/ai/providers/rtzr/provider.js +9 -9
- package/dist/ai/providers/rtzr/utils.d.ts.map +1 -1
- package/dist/ai/providers/rtzr/utils.js +1 -1
- package/dist/api/caster.d.ts.map +1 -1
- package/dist/api/caster.js +17 -17
- package/dist/api/code-converters.d.ts +4 -2
- package/dist/api/code-converters.d.ts.map +1 -1
- package/dist/api/code-converters.js +100 -19
- package/dist/api/config.d.ts +16 -1
- package/dist/api/config.d.ts.map +1 -1
- package/dist/api/config.js +28 -21
- package/dist/api/context.d.ts +2 -2
- package/dist/api/context.d.ts.map +1 -1
- package/dist/api/context.js +1 -1
- package/dist/api/decorators.d.ts.map +1 -1
- package/dist/api/decorators.js +18 -11
- package/dist/api/http-validator.d.ts +36 -0
- package/dist/api/http-validator.d.ts.map +1 -0
- package/dist/api/http-validator.js +72 -0
- package/dist/api/index.js +6 -4
- package/dist/api/sonamu.d.ts +59 -20
- package/dist/api/sonamu.d.ts.map +1 -1
- package/dist/api/sonamu.js +250 -106
- package/dist/api/websocket-helpers.d.ts +7 -5
- package/dist/api/websocket-helpers.d.ts.map +1 -1
- package/dist/api/websocket-helpers.js +6 -6
- package/dist/auth/audit-log/builders.d.ts.map +1 -1
- package/dist/auth/audit-log/builders.js +1 -1
- package/dist/auth/audit-log/client-ip.d.ts +1 -1
- package/dist/auth/audit-log/client-ip.d.ts.map +1 -1
- package/dist/auth/audit-log/client-ip.js +4 -2
- package/dist/auth/audit-log/events.d.ts +5 -1
- package/dist/auth/audit-log/events.d.ts.map +1 -1
- package/dist/auth/audit-log/events.js +1 -1
- package/dist/auth/audit-log/plugin.d.ts +0 -8
- package/dist/auth/audit-log/plugin.d.ts.map +1 -1
- package/dist/auth/audit-log/plugin.js +48 -52
- package/dist/auth/audit-log-ingestor.d.ts.map +1 -1
- package/dist/auth/audit-log-ingestor.js +16 -12
- package/dist/auth/auth-generator.d.ts.map +1 -1
- package/dist/auth/auth-generator.js +1 -1
- package/dist/auth/better-auth-request.d.ts.map +1 -1
- package/dist/auth/better-auth-request.js +6 -5
- package/dist/auth/knex-adapter.js +1 -1
- package/dist/auth/plugins/entity-definitions/index.d.ts +13 -1
- package/dist/auth/plugins/entity-definitions/index.d.ts.map +1 -1
- package/dist/auth/plugins/entity-definitions/index.js +1 -1
- package/dist/auth/plugins/wrappers/admin.d.ts +1 -1
- package/dist/bin/build-config.d.ts +25 -0
- package/dist/bin/build-config.d.ts.map +1 -1
- package/dist/bin/build-config.js +105 -2
- package/dist/bin/cli.js +131 -27
- package/dist/bin/compiler-policy.d.ts +3 -0
- package/dist/bin/compiler-policy.d.ts.map +1 -0
- package/dist/bin/compiler-policy.js +24 -0
- package/dist/bin/fixture.d.ts.map +1 -1
- package/dist/bin/fixture.js +5 -3
- package/dist/bin/test-command.d.ts +22 -1
- package/dist/bin/test-command.d.ts.map +1 -1
- package/dist/bin/test-command.js +18 -10
- package/dist/bin/ts-loader-registration.d.ts +7 -1
- package/dist/bin/ts-loader-registration.d.ts.map +1 -1
- package/dist/bin/ts-loader-registration.js +13 -4
- package/dist/cache/decorator.d.ts.map +1 -1
- package/dist/cache/decorator.js +11 -4
- package/dist/compress/compress.d.ts.map +1 -1
- package/dist/compress/compress.js +1 -1
- package/dist/cone/cone-generator.d.ts +14 -1
- package/dist/cone/cone-generator.d.ts.map +1 -1
- package/dist/cone/cone-generator.js +13 -9
- package/dist/database/_batch_update.js +1 -1
- package/dist/database/base-model.d.ts +22 -10
- package/dist/database/base-model.d.ts.map +1 -1
- package/dist/database/base-model.js +26 -16
- package/dist/database/base-model.types.d.ts +15 -3
- package/dist/database/base-model.types.d.ts.map +1 -1
- package/dist/database/db.d.ts +12 -2
- package/dist/database/db.d.ts.map +1 -1
- package/dist/database/db.js +10 -7
- package/dist/database/knex.d.ts.map +1 -1
- package/dist/database/knex.js +17 -14
- package/dist/database/puri.d.ts +11 -9
- package/dist/database/puri.d.ts.map +1 -1
- package/dist/database/puri.js +93 -79
- package/dist/database/puri.types.d.ts +21 -21
- package/dist/database/puri.types.d.ts.map +1 -1
- package/dist/database/puri.types.js +1 -1
- package/dist/database/upsert-builder.d.ts +12 -10
- package/dist/database/upsert-builder.d.ts.map +1 -1
- package/dist/database/upsert-builder.js +20 -12
- package/dist/dict/sd.d.ts.map +1 -1
- package/dist/dict/sd.js +1 -1
- package/dist/dict/sonamu-dictionary.d.ts.map +1 -1
- package/dist/dict/sonamu-dictionary.js +1 -1
- package/dist/dict/utils.d.ts.map +1 -1
- package/dist/dict/utils.js +7 -2
- package/dist/entity/entity-manager.d.ts +13 -4
- package/dist/entity/entity-manager.d.ts.map +1 -1
- package/dist/entity/entity-manager.js +19 -11
- package/dist/entity/entity-template-cone.d.ts +73 -5
- package/dist/entity/entity-template-cone.d.ts.map +1 -1
- package/dist/entity/entity-template-cone.js +4 -2
- package/dist/entity/entity.d.ts +6 -2
- package/dist/entity/entity.d.ts.map +1 -1
- package/dist/entity/entity.js +30 -28
- package/dist/env.d.ts +3 -1
- package/dist/env.d.ts.map +1 -1
- package/dist/env.js +1 -1
- package/dist/exceptions/error-handler.d.ts.map +1 -1
- package/dist/exceptions/error-handler.js +7 -2
- package/dist/exceptions/so-exceptions.d.ts +24 -20
- package/dist/exceptions/so-exceptions.d.ts.map +1 -1
- package/dist/exceptions/so-exceptions.js +4 -2
- package/dist/filter/utils.d.ts +7 -2
- package/dist/filter/utils.d.ts.map +1 -1
- package/dist/filter/utils.js +8 -6
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +12 -6
- package/dist/logger/configure.d.ts.map +1 -1
- package/dist/logger/configure.js +10 -10
- package/dist/migration/code-generation.d.ts.map +1 -1
- package/dist/migration/code-generation.js +50 -46
- package/dist/migration/index-where-predicate.d.ts.map +1 -1
- package/dist/migration/index-where-predicate.js +22 -8
- package/dist/migration/migration-set.d.ts.map +1 -1
- package/dist/migration/migration-set.js +1 -1
- package/dist/migration/migrator.d.ts +3 -2
- package/dist/migration/migrator.d.ts.map +1 -1
- package/dist/migration/migrator.js +27 -21
- package/dist/migration/postgresql-schema-reader.d.ts.map +1 -1
- package/dist/migration/postgresql-schema-reader.js +51 -36
- package/dist/migration/slack-confirm.d.ts.map +1 -1
- package/dist/migration/slack-confirm.js +1 -1
- package/dist/naite/naite-reporter.js +2 -2
- package/dist/naite/naite.d.ts +74 -15
- package/dist/naite/naite.d.ts.map +1 -1
- package/dist/naite/naite.js +5 -19
- package/dist/runtime-type.d.ts +6 -0
- package/dist/runtime-type.d.ts.map +1 -0
- package/dist/runtime-type.js +26 -0
- package/dist/ssr/hmr-opt-out.d.ts +26 -0
- package/dist/ssr/hmr-opt-out.d.ts.map +1 -0
- package/dist/ssr/hmr-opt-out.js +59 -0
- package/dist/ssr/renderer.d.ts.map +1 -1
- package/dist/ssr/renderer.js +4 -1
- package/dist/storage/base-file.js +14 -14
- package/dist/storage/buffered-file.d.ts +2 -2
- package/dist/storage/buffered-file.d.ts.map +1 -1
- package/dist/storage/buffered-file.js +12 -12
- package/dist/storage/s3-driver.d.ts.map +1 -1
- package/dist/storage/s3-driver.js +1 -1
- package/dist/storage/uploaded-file.d.ts +2 -2
- package/dist/storage/uploaded-file.d.ts.map +1 -1
- package/dist/storage/uploaded-file.js +8 -8
- package/dist/stream/sse.js +11 -11
- package/dist/stream/ws-core.d.ts +1 -1
- package/dist/stream/ws-core.d.ts.map +1 -1
- package/dist/stream/ws-delivery.d.ts +1 -1
- package/dist/stream/ws-delivery.d.ts.map +1 -1
- package/dist/stream/ws-delivery.js +6 -4
- package/dist/stream/ws-local-connection-store.d.ts.map +1 -1
- package/dist/stream/ws-local-connection-store.js +4 -2
- package/dist/stream/ws-presence-store.js +1 -1
- package/dist/stream/ws-registry.d.ts +4 -4
- package/dist/stream/ws-registry.d.ts.map +1 -1
- package/dist/stream/ws-registry.js +4 -2
- package/dist/stream/ws-telemetry.d.ts +16 -12
- package/dist/stream/ws-telemetry.d.ts.map +1 -1
- package/dist/stream/ws-telemetry.js +22 -18
- package/dist/stream/ws.d.ts +18 -12
- package/dist/stream/ws.d.ts.map +1 -1
- package/dist/stream/ws.js +26 -22
- package/dist/syncer/api-parser.js +1 -1
- package/dist/syncer/checksum.d.ts.map +1 -1
- package/dist/syncer/checksum.js +7 -8
- package/dist/syncer/code-generator.d.ts.map +1 -1
- package/dist/syncer/code-generator.js +13 -14
- package/dist/syncer/entity-operations.d.ts.map +1 -1
- package/dist/syncer/entity-operations.js +5 -6
- package/dist/syncer/file-copy.d.ts +5 -0
- package/dist/syncer/file-copy.d.ts.map +1 -0
- package/dist/syncer/file-copy.js +36 -0
- package/dist/syncer/file-patterns.d.ts +1 -0
- package/dist/syncer/file-patterns.d.ts.map +1 -1
- package/dist/syncer/file-patterns.js +5 -2
- package/dist/syncer/file-tracking.d.ts.map +1 -1
- package/dist/syncer/file-tracking.js +5 -4
- package/dist/syncer/filesystem-dependencies.d.ts +15 -0
- package/dist/syncer/filesystem-dependencies.d.ts.map +1 -0
- package/dist/syncer/filesystem-dependencies.js +53 -0
- package/dist/syncer/module-loader.d.ts +1 -1
- package/dist/syncer/module-loader.d.ts.map +1 -1
- package/dist/syncer/module-loader.js +6 -4
- package/dist/syncer/syncer-actions.d.ts +4 -0
- package/dist/syncer/syncer-actions.d.ts.map +1 -1
- package/dist/syncer/syncer-actions.js +34 -17
- package/dist/syncer/syncer.d.ts +17 -6
- package/dist/syncer/syncer.d.ts.map +1 -1
- package/dist/syncer/syncer.js +71 -29
- package/dist/syncer/watcher.d.ts.map +1 -1
- package/dist/syncer/watcher.js +3 -3
- package/dist/tasks/decorator.d.ts +6 -6
- package/dist/tasks/decorator.d.ts.map +1 -1
- package/dist/tasks/decorator.js +4 -4
- package/dist/tasks/step-wrapper.d.ts +6 -4
- package/dist/tasks/step-wrapper.d.ts.map +1 -1
- package/dist/tasks/step-wrapper.js +5 -5
- package/dist/tasks/workflow-manager.d.ts.map +1 -1
- package/dist/tasks/workflow-manager.js +13 -7
- package/dist/template/entity-converter.d.ts +1 -1
- package/dist/template/entity-converter.d.ts.map +1 -1
- package/dist/template/entity-converter.js +2 -2
- package/dist/template/helpers.d.ts +8 -6
- package/dist/template/helpers.d.ts.map +1 -1
- package/dist/template/helpers.js +1 -1
- package/dist/template/implementations/generated.template.d.ts.map +1 -1
- package/dist/template/implementations/generated.template.js +4 -4
- package/dist/template/implementations/generated_http.template.d.ts +7 -4
- package/dist/template/implementations/generated_http.template.d.ts.map +1 -1
- package/dist/template/implementations/generated_http.template.js +21 -21
- package/dist/template/implementations/generated_sso.template.d.ts.map +1 -1
- package/dist/template/implementations/generated_sso.template.js +6 -3
- package/dist/template/implementations/http_validators.template.d.ts +18 -0
- package/dist/template/implementations/http_validators.template.d.ts.map +1 -0
- package/dist/template/implementations/http_validators.template.js +127 -0
- package/dist/template/implementations/model.template.d.ts.map +1 -1
- package/dist/template/implementations/model.template.js +1 -1
- package/dist/template/implementations/queries.template.js +1 -1
- package/dist/template/implementations/sd.template.d.ts.map +1 -1
- package/dist/template/implementations/sd.template.js +79 -39
- package/dist/template/implementations/services.template.d.ts.map +1 -1
- package/dist/template/implementations/services.template.js +6 -4
- package/dist/template/implementations/view_form.template.d.ts +6 -1
- package/dist/template/implementations/view_form.template.d.ts.map +1 -1
- package/dist/template/implementations/view_form.template.js +23 -15
- package/dist/template/implementations/view_list.template.d.ts.map +1 -1
- package/dist/template/implementations/view_list.template.js +11 -6
- package/dist/template/template-manager.d.ts.map +1 -1
- package/dist/template/template-manager.js +9 -7
- package/dist/template/template-types.d.ts +12 -5
- package/dist/template/template-types.d.ts.map +1 -1
- package/dist/template/template-types.js +1 -1
- package/dist/template/template.d.ts +2 -2
- package/dist/template/template.d.ts.map +1 -1
- package/dist/template/template.js +6 -4
- package/dist/template/zod-converter.d.ts +0 -19
- package/dist/template/zod-converter.d.ts.map +1 -1
- package/dist/template/zod-converter.js +100 -84
- package/dist/testing/_relation-graph.d.ts.map +1 -1
- package/dist/testing/_relation-graph.js +2 -1
- package/dist/testing/bootstrap.d.ts.map +1 -1
- package/dist/testing/bootstrap.js +9 -6
- package/dist/testing/data-explorer.d.ts +32 -7
- package/dist/testing/data-explorer.d.ts.map +1 -1
- package/dist/testing/data-explorer.js +77 -31
- package/dist/testing/dev-test-routes.d.ts +8 -1
- package/dist/testing/dev-test-routes.d.ts.map +1 -1
- package/dist/testing/dev-test-routes.js +125 -108
- package/dist/testing/dev-vitest-manager.d.ts +54 -8
- package/dist/testing/dev-vitest-manager.d.ts.map +1 -1
- package/dist/testing/dev-vitest-manager.js +24 -9
- package/dist/testing/faker-mappings.d.ts +412 -1
- package/dist/testing/faker-mappings.d.ts.map +1 -1
- package/dist/testing/faker-mappings.js +1 -1
- package/dist/testing/filesystem.d.ts +2 -0
- package/dist/testing/filesystem.d.ts.map +1 -0
- package/dist/testing/filesystem.js +7 -0
- package/dist/testing/fixture-generator.d.ts +25 -8
- package/dist/testing/fixture-generator.d.ts.map +1 -1
- package/dist/testing/fixture-generator.js +132 -73
- package/dist/testing/fixture-loader.d.ts +3 -1
- package/dist/testing/fixture-loader.d.ts.map +1 -1
- package/dist/testing/fixture-loader.js +1 -20
- package/dist/testing/fixture-manager.d.ts +8 -7
- package/dist/testing/fixture-manager.d.ts.map +1 -1
- package/dist/testing/fixture-manager.js +91 -59
- package/dist/testing/global-setup.d.ts.map +1 -1
- package/dist/testing/global-setup.js +5 -2
- package/dist/testing/index.d.ts +2 -0
- package/dist/testing/index.d.ts.map +1 -1
- package/dist/testing/index.js +6 -3
- package/dist/types/types.d.ts +101 -99
- package/dist/types/types.d.ts.map +1 -1
- package/dist/types/types.js +234 -225
- package/dist/ui/ai-api.d.ts.map +1 -1
- package/dist/ui/ai-api.js +1 -1
- package/dist/ui/ai-client.d.ts.map +1 -1
- package/dist/ui/ai-client.js +28 -18
- package/dist/ui/api.d.ts.map +1 -1
- package/dist/ui/api.js +135 -128
- package/dist/ui/async-route.d.ts +3 -0
- package/dist/ui/async-route.d.ts.map +1 -0
- package/dist/ui/async-route.js +12 -0
- package/dist/ui/cdd-service.d.ts +9 -7
- package/dist/ui/cdd-service.d.ts.map +1 -1
- package/dist/ui/cdd-service.js +7 -5
- package/dist/ui/migrations-api.d.ts.map +1 -1
- package/dist/ui/migrations-api.js +17 -15
- package/dist/ui-web/assets/index-DV1AAq6W.js +178 -0
- package/dist/ui-web/index.html +1 -1
- package/dist/utils/formatter.d.ts.map +1 -1
- package/dist/utils/formatter.js +7 -5
- package/dist/utils/fs-utils.d.ts +3 -3
- package/dist/utils/fs-utils.d.ts.map +1 -1
- package/dist/utils/fs-utils.js +6 -6
- package/dist/utils/model.d.ts +3 -5
- package/dist/utils/model.d.ts.map +1 -1
- package/dist/utils/model.js +1 -1
- package/dist/utils/object-utils.d.ts +1 -1
- package/dist/utils/object-utils.d.ts.map +1 -1
- package/dist/utils/object-utils.js +17 -16
- package/dist/utils/process-utils.d.ts.map +1 -1
- package/dist/utils/process-utils.js +4 -2
- package/dist/utils/runtime-value.d.ts +13 -0
- package/dist/utils/runtime-value.d.ts.map +1 -0
- package/dist/utils/runtime-value.js +40 -0
- package/dist/utils/sql-parser.d.ts +8 -1
- package/dist/utils/sql-parser.d.ts.map +1 -1
- package/dist/utils/sql-parser.js +6 -3
- package/dist/utils/type-utils.d.ts.map +1 -1
- package/dist/utils/type-utils.js +10 -8
- package/dist/utils/utils.d.ts +2 -2
- package/dist/utils/utils.d.ts.map +1 -1
- package/dist/utils/utils.js +11 -8
- package/dist/utils/zod-error.d.ts.map +1 -1
- package/dist/utils/zod-error.js +7 -4
- package/dist/vector/chunking.d.ts.map +1 -1
- package/dist/vector/chunking.js +1 -1
- package/dist/vector/embedding.d.ts.map +1 -1
- package/dist/vector/embedding.js +1 -1
- package/dist/vector/types.d.ts +3 -2
- package/dist/vector/types.d.ts.map +1 -1
- package/package.json +5 -3
- package/src/ai/agents/agent.ts +5 -5
- package/src/ai/agents/types.ts +1 -1
- package/src/ai/providers/rtzr/__tests__/model.test.ts +2 -2
- package/src/ai/providers/rtzr/error.ts +5 -3
- package/src/ai/providers/rtzr/model.ts +3 -2
- package/src/ai/providers/rtzr/options.ts +10 -5
- package/src/ai/providers/rtzr/provider.ts +10 -10
- package/src/ai/providers/rtzr/utils.ts +3 -1
- package/src/api/__tests__/config.test.ts +11 -21
- package/src/api/__tests__/sonamu.http-validator.test.ts +512 -0
- package/src/api/__tests__/sonamu.websocket.test.ts +51 -41
- package/src/api/__tests__/zod-compiler-policy.test.ts +95 -0
- package/src/api/caster.ts +6 -8
- package/src/api/code-converters.ts +136 -36
- package/src/api/config.ts +62 -4
- package/src/api/context.ts +3 -3
- package/src/api/decorators.ts +28 -17
- package/src/api/http-validator.ts +149 -0
- package/src/api/sonamu.ts +459 -152
- package/src/api/websocket-helpers.ts +24 -17
- package/src/auth/audit-log/builders.ts +3 -2
- package/src/auth/audit-log/client-ip.ts +4 -2
- package/src/auth/audit-log/events.ts +15 -1
- package/src/auth/audit-log/plugin.ts +129 -200
- package/src/auth/audit-log-ingestor.ts +19 -15
- package/src/auth/auth-generator.ts +10 -5
- package/src/auth/better-auth-request.ts +4 -3
- package/src/auth/knex-adapter.ts +8 -2
- package/src/auth/plugins/entity-definitions/index.ts +6 -5
- package/src/bin/__tests__/http-validator-benchmark.test.ts +94 -0
- package/src/bin/__tests__/test-command.test.ts +9 -15
- package/src/bin/__tests__/ts-loader-register.test.ts +15 -17
- package/src/bin/__tests__/zod-compiler-build.test.ts +307 -0
- package/src/bin/build-config.ts +167 -0
- package/src/bin/cli.ts +153 -36
- package/src/bin/compiler-policy.ts +35 -0
- package/src/bin/fixture.ts +14 -3
- package/src/bin/test-command.ts +74 -29
- package/src/bin/ts-loader-registration.ts +22 -4
- package/src/cache/decorator.ts +10 -3
- package/src/compress/compress.ts +17 -4
- package/src/cone/cone-generator.ts +34 -6
- package/src/database/__tests__/db.test.ts +1 -0
- package/src/database/__tests__/puri.test.ts +16 -15
- package/src/database/__tests__/transaction-scope.test.ts +5 -0
- package/src/database/_batch_update.ts +1 -0
- package/src/database/base-model.ts +81 -50
- package/src/database/base-model.types.ts +6 -6
- package/src/database/db.ts +29 -19
- package/src/database/knex.ts +30 -17
- package/src/database/puri-subset.test-d.ts +17 -0
- package/src/database/puri.ts +181 -143
- package/src/database/puri.types.test-d.ts +31 -1
- package/src/database/puri.types.ts +23 -21
- package/src/database/upsert-builder.ts +75 -53
- package/src/dict/sd.ts +15 -5
- package/src/dict/sonamu-dictionary.ts +6 -6
- package/src/dict/utils.ts +9 -1
- package/src/entity/entity-manager.ts +26 -9
- package/src/entity/entity-template-cone.ts +5 -10
- package/src/entity/entity.ts +50 -34
- package/src/env.ts +7 -3
- package/src/exceptions/error-handler.ts +17 -2
- package/src/exceptions/so-exceptions.ts +26 -20
- package/src/filter/utils.ts +21 -11
- package/src/index.ts +3 -0
- package/src/logger/configure.ts +26 -18
- package/src/migration/__tests__/migrator.test.ts +50 -57
- package/src/migration/code-generation.ts +132 -104
- package/src/migration/index-where-predicate.ts +51 -24
- package/src/migration/migration-set.ts +11 -5
- package/src/migration/migrator.ts +68 -41
- package/src/migration/postgresql-schema-reader.ts +52 -47
- package/src/migration/slack-confirm.ts +17 -15
- package/src/naite/naite-reporter.ts +1 -1
- package/src/naite/naite.ts +97 -24
- package/src/runtime-type.ts +34 -0
- package/src/ssr/hmr-opt-out.ts +78 -0
- package/src/ssr/renderer.ts +6 -0
- package/src/storage/base-file.ts +13 -13
- package/src/storage/buffered-file.ts +11 -11
- package/src/storage/s3-driver.ts +4 -1
- package/src/storage/uploaded-file.ts +8 -8
- package/src/stream/__tests__/ws-contracts.test.ts +4 -2
- package/src/stream/__tests__/ws-telemetry.test.ts +1 -1
- package/src/stream/__tests__/ws.test.ts +30 -6
- package/src/stream/sse.ts +12 -11
- package/src/stream/ws-core.ts +1 -1
- package/src/stream/ws-delivery.ts +16 -7
- package/src/stream/ws-local-connection-store.ts +2 -3
- package/src/stream/ws-presence-store.ts +6 -1
- package/src/stream/ws-registry.ts +16 -7
- package/src/stream/ws-telemetry.ts +66 -43
- package/src/stream/ws.ts +73 -39
- package/src/syncer/__tests__/api-parser.websocket-type-ref.test.ts +3 -2
- package/src/syncer/__tests__/http-validator-registry.test.ts +137 -0
- package/src/syncer/api-parser.ts +67 -27
- package/src/syncer/checksum.ts +17 -11
- package/src/syncer/code-generator.ts +25 -17
- package/src/syncer/entity-operations.ts +3 -5
- package/src/syncer/file-copy.ts +46 -0
- package/src/syncer/file-patterns.ts +11 -8
- package/src/syncer/file-tracking.ts +3 -4
- package/src/syncer/filesystem-dependencies.ts +73 -0
- package/src/syncer/module-loader.ts +8 -4
- package/src/syncer/syncer-actions.ts +56 -18
- package/src/syncer/syncer.ts +116 -43
- package/src/syncer/watcher.ts +8 -4
- package/src/tasks/decorator.ts +20 -12
- package/src/tasks/step-wrapper.ts +19 -9
- package/src/tasks/workflow-manager.ts +15 -9
- package/src/template/__tests__/http_validators.template.test.ts +160 -0
- package/src/template/__tests__/services.template.mutation.test.ts +24 -23
- package/src/template/__tests__/services.template.websocket.test.ts +21 -25
- package/src/template/entity-converter.ts +5 -2
- package/src/template/helpers.ts +8 -9
- package/src/template/implementations/generated.template.ts +5 -4
- package/src/template/implementations/generated_http.template.ts +61 -15
- package/src/template/implementations/generated_sso.template.ts +15 -4
- package/src/template/implementations/http_validators.template.ts +175 -0
- package/src/template/implementations/model.template.ts +3 -1
- package/src/template/implementations/sd.template.ts +81 -41
- package/src/template/implementations/services.template.ts +2 -2
- package/src/template/implementations/view_form.template.ts +56 -39
- package/src/template/implementations/view_list.template.ts +31 -23
- package/src/template/template-manager.ts +15 -13
- package/src/template/template-types.ts +13 -5
- package/src/template/template.ts +4 -3
- package/src/template/zod-converter.ts +206 -91
- package/src/testing/__tests__/dev-test-routes.test.ts +85 -25
- package/src/testing/__tests__/dev-vitest-manager.test.ts +15 -15
- package/src/testing/_relation-graph.ts +4 -1
- package/src/testing/bootstrap.ts +12 -5
- package/src/testing/data-explorer.ts +102 -53
- package/src/testing/dev-test-routes.ts +87 -50
- package/src/testing/dev-vitest-manager.ts +88 -32
- package/src/testing/faker-mappings.ts +2 -2
- package/src/testing/filesystem.ts +1 -0
- package/src/testing/fixture-generator.ts +191 -131
- package/src/testing/fixture-loader.ts +5 -1
- package/src/testing/fixture-manager.ts +129 -90
- package/src/testing/global-setup.ts +7 -3
- package/src/testing/index.ts +5 -0
- package/src/types/__tests__/entity-json-schema-search-text.test.ts +9 -3
- package/src/types/types.ts +184 -158
- package/src/ui/ai-api.ts +9 -7
- package/src/ui/ai-client.ts +61 -56
- package/src/ui/api.ts +727 -616
- package/src/ui/async-route.ts +4 -0
- package/src/ui/cdd-service.ts +35 -12
- package/src/ui/migrations-api.ts +63 -51
- package/src/utils/formatter.ts +7 -3
- package/src/utils/fs-utils.ts +5 -5
- package/src/utils/model.ts +4 -5
- package/src/utils/object-utils.ts +32 -22
- package/src/utils/process-utils.ts +4 -1
- package/src/utils/runtime-value.ts +43 -0
- package/src/utils/sql-parser.ts +13 -6
- package/src/utils/type-utils.ts +9 -7
- package/src/utils/utils.ts +19 -21
- package/src/utils/zod-error.ts +4 -2
- package/src/vector/chunking.ts +6 -1
- package/src/vector/embedding.ts +2 -1
- package/src/vector/types.ts +4 -2
- package/tsdown.api.config.ts +5 -2
- package/dist/ui-web/assets/index-C0m1pk6K.js +0 -177
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { __esmMin } from "../_virtual/_rolldown/runtime.js";
|
|
2
|
+
import { init_runtime_value, isStringValue } from "../utils/runtime-value.js";
|
|
2
3
|
import { differenceWith, init_utils, intersectionBy } from "../utils/utils.js";
|
|
3
4
|
import { formatCode, init_formatter } from "../utils/formatter.js";
|
|
4
5
|
import { init_types, isSearchTextProp } from "../types/types.js";
|
|
@@ -402,8 +403,8 @@ function genNormalColumnDefinition(column) {
|
|
|
402
403
|
else if (column.type === "json") chains.push(`jsonb('${column.name}')`);
|
|
403
404
|
else chains.push(`${column.type}('${column.name}'${column.length ? `, ${column.length}` : ""})`);
|
|
404
405
|
chains.push(column.nullable ? "nullable()" : "notNullable()");
|
|
405
|
-
if (column.defaultTo !== void 0) if (
|
|
406
|
-
else if (column.type === "json" &&
|
|
406
|
+
if (column.defaultTo !== void 0) if (isStringValue(column.defaultTo) && column.defaultTo.startsWith(`"`)) chains.push(`defaultTo(${column.defaultTo})`);
|
|
407
|
+
else if (column.type === "json" && isStringValue(column.defaultTo)) chains.push(`defaultTo(knex.raw("${column.defaultTo.replaceAll("\"", "'")}::jsonb"))`);
|
|
407
408
|
else chains.push(`defaultTo(knex.raw('${column.defaultTo}'))`);
|
|
408
409
|
return `table.${chains.join(".")};`;
|
|
409
410
|
}
|
|
@@ -831,6 +832,13 @@ function getAlterColumnLinesTo(columnsTo, entityColumns, table, dbForeigns) {
|
|
|
831
832
|
});
|
|
832
833
|
return linesTo;
|
|
833
834
|
}
|
|
835
|
+
function migrationIndexIdentity(index) {
|
|
836
|
+
return Object.keys(index).filter((key) => key !== "name").toSorted().map((key) => {
|
|
837
|
+
if (key === "name") return void 0;
|
|
838
|
+
if (key === "columns") return index[key].map((col) => Object.keys(col).toSorted().map((columnKey) => `${columnKey}=${col[columnKey]}`).join("//"));
|
|
839
|
+
return `${key}=${index[key]}`;
|
|
840
|
+
}).join("//");
|
|
841
|
+
}
|
|
834
842
|
/**
|
|
835
843
|
* 인덱스의 add, drop 여부 확인
|
|
836
844
|
*/
|
|
@@ -839,30 +847,21 @@ function getAlterIndexesTo(entityIndexes, dbIndexes) {
|
|
|
839
847
|
add: [],
|
|
840
848
|
drop: []
|
|
841
849
|
};
|
|
842
|
-
const identity = (index) => {
|
|
843
|
-
return Object.keys(index).filter((key) => key !== "name").toSorted().map((key) => {
|
|
844
|
-
if (key === "name") return;
|
|
845
|
-
if (key === "columns") return index[key].map((col) => {
|
|
846
|
-
return Object.keys(col).toSorted().map((k) => `${k}=${col[k]}`).join("//");
|
|
847
|
-
});
|
|
848
|
-
return `${key}=${index[key]}`;
|
|
849
|
-
}).join("//");
|
|
850
|
-
};
|
|
851
850
|
const normalizedEntityIndexes = entityIndexes.map(setMigrationIndexDefaults);
|
|
852
851
|
const normalizedDbIndexes = dbIndexes.map(setMigrationIndexDefaults);
|
|
853
852
|
const comparisonEntityIndexes = entityIndexes.map(setMigrationIndexComparisonDefaults);
|
|
854
853
|
const comparisonDbIndexes = dbIndexes.map(setMigrationIndexComparisonDefaults);
|
|
855
854
|
const extraIndexes = {
|
|
856
|
-
db: diff(comparisonDbIndexes, comparisonEntityIndexes,
|
|
857
|
-
entity: diff(comparisonEntityIndexes, comparisonDbIndexes,
|
|
855
|
+
db: diff(comparisonDbIndexes, comparisonEntityIndexes, migrationIndexIdentity),
|
|
856
|
+
entity: diff(comparisonEntityIndexes, comparisonDbIndexes, migrationIndexIdentity)
|
|
858
857
|
};
|
|
859
858
|
if (extraIndexes.entity.length > 0) {
|
|
860
|
-
const addIdentities = new Set(extraIndexes.entity.map(
|
|
861
|
-
indexesTo.add = indexesTo.add.concat(normalizedEntityIndexes.filter((_, index) => addIdentities.has(
|
|
859
|
+
const addIdentities = new Set(extraIndexes.entity.map(migrationIndexIdentity));
|
|
860
|
+
indexesTo.add = indexesTo.add.concat(normalizedEntityIndexes.filter((_, index) => addIdentities.has(migrationIndexIdentity(comparisonEntityIndexes[index]))));
|
|
862
861
|
}
|
|
863
862
|
if (extraIndexes.db.length > 0) {
|
|
864
|
-
const dropIdentities = new Set(extraIndexes.db.map(
|
|
865
|
-
indexesTo.drop = indexesTo.drop.concat(normalizedDbIndexes.filter((_, index) => dropIdentities.has(
|
|
863
|
+
const dropIdentities = new Set(extraIndexes.db.map(migrationIndexIdentity));
|
|
864
|
+
indexesTo.drop = indexesTo.drop.concat(normalizedDbIndexes.filter((_, index) => dropIdentities.has(migrationIndexIdentity(comparisonDbIndexes[index]))));
|
|
866
865
|
}
|
|
867
866
|
return indexesTo;
|
|
868
867
|
}
|
|
@@ -886,31 +885,35 @@ function setMigrationIndexDefaultsBase(index, normalizeWhereForComparison) {
|
|
|
886
885
|
const supportsOrdering = !isVectorIndex && (!index.using || index.using === "btree");
|
|
887
886
|
const normalizedUsing = isVectorIndex ? index.using : index.using ?? "btree";
|
|
888
887
|
const normalizedWhere = normalizeWhereForComparison ? normalizeIndexWherePredicateForComparison(index.where) : normalizeIndexWherePredicate(index.where);
|
|
889
|
-
|
|
888
|
+
const columns = index.columns.map((col) => {
|
|
889
|
+
const column = { name: col.name };
|
|
890
|
+
const opclass = getIndexColumnOpclass(col);
|
|
891
|
+
if (opclass) column.opclass = opclass;
|
|
892
|
+
if (supportsOrdering) {
|
|
893
|
+
column.sortOrder = col.sortOrder ?? "ASC";
|
|
894
|
+
column.nullsFirst = col.nullsFirst ?? col.sortOrder === "DESC";
|
|
895
|
+
}
|
|
896
|
+
return column;
|
|
897
|
+
});
|
|
898
|
+
const normalizedIndex = {
|
|
890
899
|
...index,
|
|
891
|
-
columns
|
|
892
|
-
|
|
893
|
-
...getIndexColumnOpclass(col) ? { opclass: getIndexColumnOpclass(col) } : {},
|
|
894
|
-
...supportsOrdering ? {
|
|
895
|
-
sortOrder: col.sortOrder ?? "ASC",
|
|
896
|
-
nullsFirst: col.nullsFirst ?? col.sortOrder === "DESC"
|
|
897
|
-
} : {}
|
|
898
|
-
})),
|
|
899
|
-
nullsNotDistinct: index.nullsNotDistinct ?? false,
|
|
900
|
-
...normalizedUsing ? { using: normalizedUsing } : {},
|
|
901
|
-
...normalizedWhere ? { where: normalizedWhere } : {}
|
|
900
|
+
columns,
|
|
901
|
+
nullsNotDistinct: index.nullsNotDistinct ?? false
|
|
902
902
|
};
|
|
903
|
+
if (normalizedUsing) normalizedIndex.using = normalizedUsing;
|
|
904
|
+
if (normalizedWhere) normalizedIndex.where = normalizedWhere;
|
|
905
|
+
return normalizedIndex;
|
|
906
|
+
}
|
|
907
|
+
function migrationForeignKey(migrationForeign) {
|
|
908
|
+
return [migrationForeign.columns.join("-"), migrationForeign.to].join("///");
|
|
903
909
|
}
|
|
904
910
|
/**
|
|
905
911
|
* 테이블 변경 케이스 - Foreign Key 변경
|
|
906
912
|
*/
|
|
907
913
|
async function generateAlterCode_Foreigns(table, entityForeigns, dbForeigns, droppingColumns = []) {
|
|
908
|
-
const getKey = (mf) => {
|
|
909
|
-
return [mf.columns.join("-"), mf.to].join("///");
|
|
910
|
-
};
|
|
911
914
|
const droppingColumnNames = droppingColumns.map((col) => col.name);
|
|
912
915
|
const fkTo = entityForeigns.reduce((result, entityF) => {
|
|
913
|
-
const matchingDbF = dbForeigns.find((dbF) =>
|
|
916
|
+
const matchingDbF = dbForeigns.find((dbF) => migrationForeignKey(entityF) === migrationForeignKey(dbF));
|
|
914
917
|
if (!matchingDbF) {
|
|
915
918
|
result.add.push(entityF);
|
|
916
919
|
return result;
|
|
@@ -928,7 +931,7 @@ async function generateAlterCode_Foreigns(table, entityForeigns, dbForeigns, dro
|
|
|
928
931
|
alterDst: []
|
|
929
932
|
});
|
|
930
933
|
dbForeigns.forEach((dbF) => {
|
|
931
|
-
if (!entityForeigns.find((entityF) =>
|
|
934
|
+
if (!entityForeigns.find((entityF) => migrationForeignKey(entityF) === migrationForeignKey(dbF))) {
|
|
932
935
|
if (!dbF.columns.some((col) => droppingColumnNames.includes(col))) fkTo.drop.push(dbF);
|
|
933
936
|
}
|
|
934
937
|
});
|
|
@@ -987,6 +990,17 @@ async function generateAlterCode_Foreigns(table, entityForeigns, dbForeigns, dro
|
|
|
987
990
|
async function generateCreateCode(entitySet) {
|
|
988
991
|
return [await generateCreateCode_ColumnAndIndexes(entitySet.table, entitySet.columns, entitySet.indexes), ...await generateCreateCode_Foreign(entitySet.table, entitySet.foreigns)];
|
|
989
992
|
}
|
|
993
|
+
function replaceColumnDefaultTo(column) {
|
|
994
|
+
return column;
|
|
995
|
+
}
|
|
996
|
+
function replaceNoActionOnMySQL(foreign) {
|
|
997
|
+
const { onDelete, onUpdate } = foreign;
|
|
998
|
+
return {
|
|
999
|
+
...foreign,
|
|
1000
|
+
onUpdate: onUpdate === "RESTRICT" ? "NO ACTION" : onUpdate,
|
|
1001
|
+
onDelete: onDelete === "RESTRICT" ? "NO ACTION" : onDelete
|
|
1002
|
+
};
|
|
1003
|
+
}
|
|
990
1004
|
/**
|
|
991
1005
|
* 주어진 entitySet을 목표로, dbSet을 현 상황으로 하여 테이블 ALTER 마이그레이션 코드를 생성합니다.
|
|
992
1006
|
* @param entitySet 현 상황의 MigrationSet
|
|
@@ -995,21 +1009,10 @@ async function generateCreateCode(entitySet) {
|
|
|
995
1009
|
* @returns ALTER 마이그레이션 코드
|
|
996
1010
|
*/
|
|
997
1011
|
async function generateAlterCode(entitySet, dbSet, compareDB) {
|
|
998
|
-
const replaceColumnDefaultTo = (col) => {
|
|
999
|
-
return col;
|
|
1000
|
-
};
|
|
1001
1012
|
const entityColumns = alphabetical(entitySet.columns, (a) => a.name).map(replaceColumnDefaultTo);
|
|
1002
1013
|
const dbColumns = alphabetical(dbSet.columns, (a) => a.name).map(replaceColumnDefaultTo);
|
|
1003
1014
|
const entityIndexes = alphabetical(entitySet.indexes, (a) => [a.type, ...a.columns.map((c) => c.name)].join("-"));
|
|
1004
1015
|
const dbIndexes = alphabetical(dbSet.indexes, (a) => [a.type, ...a.columns.map((c) => c.name)].join("-"));
|
|
1005
|
-
const replaceNoActionOnMySQL = (f) => {
|
|
1006
|
-
const { onDelete, onUpdate } = f;
|
|
1007
|
-
return {
|
|
1008
|
-
...f,
|
|
1009
|
-
onUpdate: onUpdate === "RESTRICT" ? "NO ACTION" : onUpdate,
|
|
1010
|
-
onDelete: onDelete === "RESTRICT" ? "NO ACTION" : onDelete
|
|
1011
|
-
};
|
|
1012
|
-
};
|
|
1013
1016
|
const entityForeigns = alphabetical(entitySet.foreigns, (a) => [a.to, ...a.columns].join("-")).map((f) => replaceNoActionOnMySQL(f));
|
|
1014
1017
|
const dbForeigns = alphabetical(dbSet.foreigns, (a) => [a.to, ...a.columns].join("-")).map((f) => replaceNoActionOnMySQL(f));
|
|
1015
1018
|
const droppingColumns = diff(dbColumns, entityColumns, (col) => col.name);
|
|
@@ -1128,6 +1131,7 @@ var init_code_generation = __esmMin((() => {
|
|
|
1128
1131
|
init_naite();
|
|
1129
1132
|
init_types();
|
|
1130
1133
|
init_formatter();
|
|
1134
|
+
init_runtime_value();
|
|
1131
1135
|
init_utils();
|
|
1132
1136
|
init_index_where_predicate();
|
|
1133
1137
|
init_postgresql_schema_reader();
|
|
@@ -1318,4 +1322,4 @@ $$\`);`
|
|
|
1318
1322
|
init_code_generation();
|
|
1319
1323
|
export { generateAlterCode, generateCreateCode, getAlterIndexesTo, init_code_generation, setMigrationIndexDefaults };
|
|
1320
1324
|
|
|
1321
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29kZS1nZW5lcmF0aW9uLmpzIiwibmFtZXMiOltdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9taWdyYXRpb24vY29kZS1nZW5lcmF0aW9uLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBlcXVhbCBmcm9tIFwiZmFzdC1kZWVwLWVxdWFsXCI7XG5pbXBvcnQgeyB0eXBlIEtuZXggfSBmcm9tIFwia25leFwiO1xuaW1wb3J0IHsgYWxwaGFiZXRpY2FsLCBkaWZmIH0gZnJvbSBcInJhZGFzaGlcIjtcblxuaW1wb3J0IHsgRW50aXR5TWFuYWdlciB9IGZyb20gXCIuLi9lbnRpdHkvZW50aXR5LW1hbmFnZXJcIjtcbmltcG9ydCB7IE5haXRlIH0gZnJvbSBcIi4uL25haXRlL25haXRlXCI7XG5pbXBvcnQge1xuICB0eXBlIEVudGl0eVByb3AsXG4gIHR5cGUgR2VuTWlncmF0aW9uQ29kZSxcbiAgdHlwZSBNaWdyYXRpb25Db2x1bW4sXG4gIHR5cGUgTWlncmF0aW9uRm9yZWlnbixcbiAgdHlwZSBNaWdyYXRpb25JbmRleCxcbiAgdHlwZSBNaWdyYXRpb25TZXQsXG59IGZyb20gXCIuLi90eXBlcy90eXBlc1wiO1xuaW1wb3J0IHsgaXNTZWFyY2hUZXh0UHJvcCB9IGZyb20gXCIuLi90eXBlcy90eXBlc1wiO1xuaW1wb3J0IHsgZm9ybWF0Q29kZSB9IGZyb20gXCIuLi91dGlscy9mb3JtYXR0ZXJcIjtcbmltcG9ydCB7IGRpZmZlcmVuY2VXaXRoLCBpbnRlcnNlY3Rpb25CeSB9IGZyb20gXCIuLi91dGlscy91dGlsc1wiO1xuaW1wb3J0IHtcbiAgbm9ybWFsaXplSW5kZXhXaGVyZVByZWRpY2F0ZSxcbiAgbm9ybWFsaXplSW5kZXhXaGVyZVByZWRpY2F0ZUZvckNvbXBhcmlzb24sXG59IGZyb20gXCIuL2luZGV4LXdoZXJlLXByZWRpY2F0ZVwiO1xuaW1wb3J0IHsgUG9zdGdyZVNRTFNjaGVtYVJlYWRlciB9IGZyb20gXCIuL3Bvc3RncmVzcWwtc2NoZW1hLXJlYWRlclwiO1xuXG4vKipcbiAqIOy7rOufvCDsoJXsnZgg6rKw6rO8IO2DgOyehVxuICogLSBidWlsZGVyOiBLbmV4IHRhYmxlIGJ1aWxkZXIg66mU7ISc65Oc66GcIOyLpO2Wie2VoCDqtazrrLggKHRhYmxlLnh4eCgpKVxuICogLSByYXc6IGtuZXgucmF3KCnroZwg7Iuk7ZaJ7ZWgIOq1rOusuFxuICovXG50eXBlIENvbHVtbkRlZmluaXRpb25SZXN1bHQgPSB7XG4gIGJ1aWxkZXI6IHN0cmluZ1tdO1xuICByYXc6IHN0cmluZ1tdO1xufTtcblxudHlwZSBTZWFyY2hUZXh0SGVscGVyS2luZCA9IFwidGV4dC1hcnJheVwiIHwgXCJqc29uYi1hcnJheVwiO1xuXG50eXBlIFNlYXJjaFRleHRFeHByZXNzaW9uVG9rZW4gPVxuICB8IHsgdHlwZTogXCJpZGVudGlmaWVyXCI7IHZhbHVlOiBzdHJpbmcgfVxuICB8IHsgdHlwZTogXCJxdW90ZWRJZGVudGlmaWVyXCI7IHZhbHVlOiBzdHJpbmcgfVxuICB8IHsgdHlwZTogXCJzdHJpbmdcIjsgdmFsdWU6IHN0cmluZyB9XG4gIHwgeyB0eXBlOiBcInN5bWJvbFwiOyB2YWx1ZTogXCIoXCIgfCBcIilcIiB8IFwiLFwiIH1cbiAgfCB7IHR5cGU6IFwib3BlcmF0b3JcIjsgdmFsdWU6IFwifHxcIiB8IFwiOjpcIiB9O1xuXG50eXBlIFNlYXJjaFRleHRFeHByZXNzaW9uTm9kZSA9XG4gIHwgeyB0eXBlOiBcImlkZW50aWZpZXJcIjsgbmFtZTogc3RyaW5nOyBxdW90ZWQ6IGJvb2xlYW4gfVxuICB8IHsgdHlwZTogXCJzdHJpbmdcIjsgdmFsdWU6IHN0cmluZyB9XG4gIHwgeyB0eXBlOiBcImJvb2xlYW5cIjsgdmFsdWU6IGJvb2xlYW4gfVxuICB8IHsgdHlwZTogXCJmdW5jdGlvblwiOyBuYW1lOiBzdHJpbmc7IGFyZ3M6IFNlYXJjaFRleHRFeHByZXNzaW9uTm9kZVtdIH1cbiAgfCB7IHR5cGU6IFwiY29uY2F0XCI7IHBhcnRzOiBTZWFyY2hUZXh0RXhwcmVzc2lvbk5vZGVbXSB9XG4gIHwgeyB0eXBlOiBcImNvbGxhdGVcIjsgZXhwcjogU2VhcmNoVGV4dEV4cHJlc3Npb25Ob2RlOyBjb2xsYXRpb246IHN0cmluZzsgcXVvdGVkOiBib29sZWFuIH1cbiAgfCB7IHR5cGU6IFwiY2FzdFwiOyBleHByOiBTZWFyY2hUZXh0RXhwcmVzc2lvbk5vZGU7IHRhcmdldFR5cGU6IHN0cmluZyB9O1xuXG5jb25zdCBTRUFSQ0hfVEVYVF9IRUxQRVJfREVGSU5JVElPTlM6IFJlY29yZDxTZWFyY2hUZXh0SGVscGVyS2luZCwgc3RyaW5nPiA9IHtcbiAgXCJ0ZXh0LWFycmF5XCI6IGBhd2FpdCBrbmV4LnJhdyhcXGBDUkVBVEUgT1IgUkVQTEFDRSBGVU5DVElPTiBzb25hbXVfdGV4dF9hcnJheV9hZ2coYXJyIHRleHRbXSwgY2kgYm9vbGVhbiBERUZBVUxUIHRydWUpXG5SRVRVUk5TIHRleHRcbkxBTkdVQUdFIHNxbCBJTU1VVEFCTEUgUEFSQUxMRUwgU0FGRSBSRVRVUk5TIE5VTEwgT04gTlVMTCBJTlBVVFxuQVMgJCRcbiAgU0VMRUNUIHN0cmluZ19hZ2coXG4gICAgQ0FTRSBXSEVOIGNpIFRIRU4gbG93ZXIodmFsdWUpIEVMU0UgdmFsdWUgRU5ELFxuICAgICcgJ1xuICApXG4gIEZST00gdW5uZXN0KGFycikgQVMgdmFsdWVcbiQkXFxgKTtgLFxuICBcImpzb25iLWFycmF5XCI6IGBhd2FpdCBrbmV4LnJhdyhcXGBDUkVBVEUgT1IgUkVQTEFDRSBGVU5DVElPTiBzb25hbXVfanNvbmJfYXJyYXlfYWdnKGFyciBqc29uYiwgY2kgYm9vbGVhbiBERUZBVUxUIHRydWUpXG5SRVRVUk5TIHRleHRcbkxBTkdVQUdFIHNxbCBJTU1VVEFCTEUgUEFSQUxMRUwgU0FGRSBSRVRVUk5TIE5VTEwgT04gTlVMTCBJTlBVVFxuQVMgJCRcbiAgU0VMRUNUIHN0cmluZ19hZ2coXG4gICAgQ0FTRSBXSEVOIGNpIFRIRU4gbG93ZXIodmFsdWUpIEVMU0UgdmFsdWUgRU5ELFxuICAgICcgJ1xuICApXG4gIEZST00ganNvbmJfYXJyYXlfZWxlbWVudHNfdGV4dChhcnIpXG4kJFxcYCk7YCxcbn07XG5cbmNsYXNzIFNlYXJjaFRleHRFeHByZXNzaW9uUGFyc2VyIHtcbiAgcHJpdmF0ZSBpbmRleCA9IDA7XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSByZWFkb25seSB0b2tlbnM6IFNlYXJjaFRleHRFeHByZXNzaW9uVG9rZW5bXSkge31cblxuICBpc0F0RW5kKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmluZGV4ID49IHRoaXMudG9rZW5zLmxlbmd0aDtcbiAgfVxuXG4gIHBhcnNlRXhwcmVzc2lvbigpOiBTZWFyY2hUZXh0RXhwcmVzc2lvbk5vZGUge1xuICAgIHJldHVybiB0aGlzLnBhcnNlQ29uY2F0KCk7XG4gIH1cblxuICBwcml2YXRlIHBhcnNlQ29uY2F0KCk6IFNlYXJjaFRleHRFeHByZXNzaW9uTm9kZSB7XG4gICAgY29uc3QgcGFydHMgPSBbdGhpcy5wYXJzZVBvc3RmaXgoKV07XG5cbiAgICB3aGlsZSAodGhpcy5tYXRjaE9wZXJhdG9yKFwifHxcIikpIHtcbiAgICAgIHBhcnRzLnB1c2godGhpcy5wYXJzZVBvc3RmaXgoKSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHBhcnRzLmxlbmd0aCA9PT0gMSA/IHBhcnRzWzBdIDogeyB0eXBlOiBcImNvbmNhdFwiLCBwYXJ0cyB9O1xuICB9XG5cbiAgcHJpdmF0ZSBwYXJzZVBvc3RmaXgoKTogU2VhcmNoVGV4dEV4cHJlc3Npb25Ob2RlIHtcbiAgICBsZXQgbm9kZSA9IHRoaXMucGFyc2VQcmltYXJ5KCk7XG5cbiAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgaWYgKHRoaXMubWF0Y2hPcGVyYXRvcihcIjo6XCIpKSB7XG4gICAgICAgIG5vZGUgPSB7XG4gICAgICAgICAgdHlwZTogXCJjYXN0XCIsXG4gICAgICAgICAgZXhwcjogbm9kZSxcbiAgICAgICAgICB0YXJnZXRUeXBlOiB0aGlzLnBhcnNlVHlwZU5hbWUoKSxcbiAgICAgICAgfTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLm1hdGNoSWRlbnRpZmllcihcImNvbGxhdGVcIikpIHtcbiAgICAgICAgY29uc3QgdG9rZW4gPSB0aGlzLmNvbnN1bWVDb2xsYXRpb25Ub2tlbigpO1xuICAgICAgICBub2RlID0ge1xuICAgICAgICAgIHR5cGU6IFwiY29sbGF0ZVwiLFxuICAgICAgICAgIGV4cHI6IG5vZGUsXG4gICAgICAgICAgY29sbGF0aW9uOiB0b2tlbi52YWx1ZSxcbiAgICAgICAgICBxdW90ZWQ6IHRva2VuLnR5cGUgPT09IFwicXVvdGVkSWRlbnRpZmllclwiLFxuICAgICAgICB9O1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgcmV0dXJuIG5vZGU7XG4gIH1cblxuICBwcml2YXRlIHBhcnNlUHJpbWFyeSgpOiBTZWFyY2hUZXh0RXhwcmVzc2lvbk5vZGUge1xuICAgIGNvbnN0IHRva2VuID0gdGhpcy5jb25zdW1lVG9rZW4oXCLtkZztmITsi51cIik7XG5cbiAgICBpZiAodG9rZW4udHlwZSA9PT0gXCJzeW1ib2xcIiAmJiB0b2tlbi52YWx1ZSA9PT0gXCIoXCIpIHtcbiAgICAgIGNvbnN0IG5vZGUgPSB0aGlzLnBhcnNlRXhwcmVzc2lvbigpO1xuICAgICAgdGhpcy5leHBlY3RTeW1ib2woXCIpXCIpO1xuICAgICAgcmV0dXJuIG5vZGU7XG4gICAgfVxuXG4gICAgaWYgKHRva2VuLnR5cGUgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgIHJldHVybiB7IHR5cGU6IFwic3RyaW5nXCIsIHZhbHVlOiB0b2tlbi52YWx1ZSB9O1xuICAgIH1cblxuICAgIGlmICh0b2tlbi50eXBlID09PSBcImlkZW50aWZpZXJcIiB8fCB0b2tlbi50eXBlID09PSBcInF1b3RlZElkZW50aWZpZXJcIikge1xuICAgICAgY29uc3QgbG93ZXJOYW1lID0gdG9rZW4udmFsdWUudG9Mb3dlckNhc2UoKTtcbiAgICAgIGlmICh0b2tlbi50eXBlID09PSBcImlkZW50aWZpZXJcIiAmJiAobG93ZXJOYW1lID09PSBcInRydWVcIiB8fCBsb3dlck5hbWUgPT09IFwiZmFsc2VcIikpIHtcbiAgICAgICAgcmV0dXJuIHsgdHlwZTogXCJib29sZWFuXCIsIHZhbHVlOiBsb3dlck5hbWUgPT09IFwidHJ1ZVwiIH07XG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLm1hdGNoU3ltYm9sKFwiKFwiKSkge1xuICAgICAgICBpZiAodG9rZW4udHlwZSA9PT0gXCJpZGVudGlmaWVyXCIgJiYgbG93ZXJOYW1lID09PSBcInRyaW1cIiAmJiB0aGlzLmlzVHJpbUJvdGhGcm9tRm9ybSgpKSB7XG4gICAgICAgICAgdGhpcy5pbmRleCArPSAyO1xuICAgICAgICAgIGNvbnN0IGFyZyA9IHRoaXMucGFyc2VFeHByZXNzaW9uKCk7XG4gICAgICAgICAgdGhpcy5leHBlY3RTeW1ib2woXCIpXCIpO1xuICAgICAgICAgIHJldHVybiB7IHR5cGU6IFwiZnVuY3Rpb25cIiwgbmFtZTogXCJ0cmltXCIsIGFyZ3M6IFthcmddIH07XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBhcmdzID0gdGhpcy5wYXJzZUZ1bmN0aW9uQXJncygpO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHR5cGU6IFwiZnVuY3Rpb25cIixcbiAgICAgICAgICBuYW1lOiB0b2tlbi52YWx1ZSxcbiAgICAgICAgICBhcmdzLFxuICAgICAgICB9O1xuICAgICAgfVxuXG4gICAgICByZXR1cm4ge1xuICAgICAgICB0eXBlOiBcImlkZW50aWZpZXJcIixcbiAgICAgICAgbmFtZTogdG9rZW4udmFsdWUsXG4gICAgICAgIHF1b3RlZDogdG9rZW4udHlwZSA9PT0gXCJxdW90ZWRJZGVudGlmaWVyXCIsXG4gICAgICB9O1xuICAgIH1cblxuICAgIHRocm93IG5ldyBFcnJvcihg7KeA7JuQ65CY7KeAIOyViuuKlCBzZWFyY2hUZXh0IGV4cHJlc3Npb24gdG9rZW46ICR7dG9rZW4udHlwZX1gKTtcbiAgfVxuXG4gIHByaXZhdGUgcGFyc2VGdW5jdGlvbkFyZ3MoKTogU2VhcmNoVGV4dEV4cHJlc3Npb25Ob2RlW10ge1xuICAgIGlmICh0aGlzLm1hdGNoU3ltYm9sKFwiKVwiKSkge1xuICAgICAgcmV0dXJuIFtdO1xuICAgIH1cblxuICAgIGNvbnN0IGFyZ3M6IFNlYXJjaFRleHRFeHByZXNzaW9uTm9kZVtdID0gW107XG4gICAgZG8ge1xuICAgICAgYXJncy5wdXNoKHRoaXMucGFyc2VFeHByZXNzaW9uKCkpO1xuICAgIH0gd2hpbGUgKHRoaXMubWF0Y2hTeW1ib2woXCIsXCIpKTtcblxuICAgIHRoaXMuZXhwZWN0U3ltYm9sKFwiKVwiKTtcbiAgICByZXR1cm4gYXJncztcbiAgfVxuXG4gIHByaXZhdGUgcGFyc2VUeXBlTmFtZSgpOiBzdHJpbmcge1xuICAgIGNvbnN0IHBhcnRzOiBzdHJpbmdbXSA9IFtdO1xuXG4gICAgd2hpbGUgKHRydWUpIHtcbiAgICAgIGNvbnN0IHRva2VuID0gdGhpcy5wZWVrKCk7XG4gICAgICBpZiAoXG4gICAgICAgIHRva2VuPy50eXBlID09PSBcImlkZW50aWZpZXJcIiB8fFxuICAgICAgICB0b2tlbj8udHlwZSA9PT0gXCJxdW90ZWRJZGVudGlmaWVyXCIgfHxcbiAgICAgICAgKHRva2VuPy50eXBlID09PSBcInN5bWJvbFwiICYmXG4gICAgICAgICAgKHRva2VuLnZhbHVlID09PSBcIihcIiB8fCB0b2tlbi52YWx1ZSA9PT0gXCIpXCIgfHwgdG9rZW4udmFsdWUgPT09IFwiLFwiKSlcbiAgICAgICkge1xuICAgICAgICBpZiAodG9rZW4udHlwZSA9PT0gXCJzeW1ib2xcIikge1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgICAgcGFydHMucHVzaCh0b2tlbi52YWx1ZS50b0xvd2VyQ2FzZSgpKTtcbiAgICAgICAgdGhpcy5pbmRleCArPSAxO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgaWYgKHBhcnRzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwi7YOA7J6FIOy6kOyKpO2MhSDrjIDsg4Eg7YOA7J6F7J2EIOywvuydhCDsiJgg7JeG7Iq164uI64ukLlwiKTtcbiAgICB9XG5cbiAgICByZXR1cm4gcGFydHMuam9pbihcIiBcIik7XG4gIH1cblxuICBwcml2YXRlIGNvbnN1bWVDb2xsYXRpb25Ub2tlbigpOiBFeHRyYWN0PFxuICAgIFNlYXJjaFRleHRFeHByZXNzaW9uVG9rZW4sXG4gICAgeyB0eXBlOiBcImlkZW50aWZpZXJcIiB8IFwicXVvdGVkSWRlbnRpZmllclwiIH1cbiAgPiB7XG4gICAgY29uc3QgdG9rZW4gPSB0aGlzLnBlZWsoKTtcbiAgICBpZiAodG9rZW4/LnR5cGUgIT09IFwiaWRlbnRpZmllclwiICYmIHRva2VuPy50eXBlICE9PSBcInF1b3RlZElkZW50aWZpZXJcIikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQ09MTEFURSDrjIDsg4Eg7Iud67OE7J6Q66W8IOywvuydhCDsiJgg7JeG7Iq164uI64ukLlwiKTtcbiAgICB9XG4gICAgdGhpcy5pbmRleCArPSAxO1xuICAgIHJldHVybiB0b2tlbjtcbiAgfVxuXG4gIHByaXZhdGUgaXNUcmltQm90aEZyb21Gb3JtKCk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IGJvdGhUb2tlbiA9IHRoaXMucGVlaygpO1xuICAgIGNvbnN0IGZyb21Ub2tlbiA9IHRoaXMucGVlaygxKTtcblxuICAgIHJldHVybiAoXG4gICAgICBib3RoVG9rZW4/LnR5cGUgPT09IFwiaWRlbnRpZmllclwiICYmXG4gICAgICBib3RoVG9rZW4udmFsdWUudG9Mb3dlckNhc2UoKSA9PT0gXCJib3RoXCIgJiZcbiAgICAgIGZyb21Ub2tlbj8udHlwZSA9PT0gXCJpZGVudGlmaWVyXCIgJiZcbiAgICAgIGZyb21Ub2tlbi52YWx1ZS50b0xvd2VyQ2FzZSgpID09PSBcImZyb21cIlxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIGV4cGVjdFN5bWJvbCh2YWx1ZTogXCIoXCIgfCBcIilcIiB8IFwiLFwiKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLm1hdGNoU3ltYm9sKHZhbHVlKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBcIiR7dmFsdWV9XCIg7Yag7YGw7J20IO2VhOyalO2VqeuLiOuLpC5gKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIG1hdGNoU3ltYm9sKHZhbHVlOiBcIihcIiB8IFwiKVwiIHwgXCIsXCIpOiBib29sZWFuIHtcbiAgICBjb25zdCB0b2tlbiA9IHRoaXMucGVlaygpO1xuICAgIGlmICh0b2tlbj8udHlwZSA9PT0gXCJzeW1ib2xcIiAmJiB0b2tlbi52YWx1ZSA9PT0gdmFsdWUpIHtcbiAgICAgIHRoaXMuaW5kZXggKz0gMTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBwcml2YXRlIG1hdGNoT3BlcmF0b3IodmFsdWU6IFwifHxcIiB8IFwiOjpcIik6IGJvb2xlYW4ge1xuICAgIGNvbnN0IHRva2VuID0gdGhpcy5wZWVrKCk7XG4gICAgaWYgKHRva2VuPy50eXBlID09PSBcIm9wZXJhdG9yXCIgJiYgdG9rZW4udmFsdWUgPT09IHZhbHVlKSB7XG4gICAgICB0aGlzLmluZGV4ICs9IDE7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcHJpdmF0ZSBtYXRjaElkZW50aWZpZXIodmFsdWU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IHRva2VuID0gdGhpcy5wZWVrKCk7XG4gICAgaWYgKHRva2VuPy50eXBlID09PSBcImlkZW50aWZpZXJcIiAmJiB0b2tlbi52YWx1ZS50b0xvd2VyQ2FzZSgpID09PSB2YWx1ZS50b0xvd2VyQ2FzZSgpKSB7XG4gICAgICB0aGlzLmluZGV4ICs9IDE7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcHJpdmF0ZSBjb25zdW1lVG9rZW4oY29udGV4dDogc3RyaW5nKTogU2VhcmNoVGV4dEV4cHJlc3Npb25Ub2tlbiB7XG4gICAgY29uc3QgdG9rZW4gPSB0aGlzLnBlZWsoKTtcbiAgICBpZiAoIXRva2VuKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7Y29udGV4dH0g7Yag7YGw7J20IO2VhOyalO2VqeuLiOuLpC5gKTtcbiAgICB9XG4gICAgdGhpcy5pbmRleCArPSAxO1xuICAgIHJldHVybiB0b2tlbjtcbiAgfVxuXG4gIHByaXZhdGUgcGVlayhvZmZzZXQgPSAwKTogU2VhcmNoVGV4dEV4cHJlc3Npb25Ub2tlbiB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMudG9rZW5zW3RoaXMuaW5kZXggKyBvZmZzZXRdO1xuICB9XG59XG5cbmZ1bmN0aW9uIGdldEluZGV4Q29sdW1uT3BjbGFzcyhjb2x1bW46IE1pZ3JhdGlvbkluZGV4W1wiY29sdW1uc1wiXVtudW1iZXJdKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgcmV0dXJuIGNvbHVtbi5vcGNsYXNzID8/IGNvbHVtbi52ZWN0b3JPcHM7XG59XG5cbmZ1bmN0aW9uIHRva2VuaXplU2VhcmNoVGV4dEV4cHJlc3Npb24oZXhwcmVzc2lvbjogc3RyaW5nKTogU2VhcmNoVGV4dEV4cHJlc3Npb25Ub2tlbltdIHtcbiAgY29uc3QgdG9rZW5zOiBTZWFyY2hUZXh0RXhwcmVzc2lvblRva2VuW10gPSBbXTtcbiAgbGV0IGluZGV4ID0gMDtcblxuICB3aGlsZSAoaW5kZXggPCBleHByZXNzaW9uLmxlbmd0aCkge1xuICAgIGNvbnN0IGNoYXIgPSBleHByZXNzaW9uW2luZGV4XTtcblxuICAgIGlmIChjaGFyID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIGlmICgvXFxzLy50ZXN0KGNoYXIpKSB7XG4gICAgICBpbmRleCArPSAxO1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgaWYgKGV4cHJlc3Npb24uc3RhcnRzV2l0aChcInx8XCIsIGluZGV4KSkge1xuICAgICAgdG9rZW5zLnB1c2goeyB0eXBlOiBcIm9wZXJhdG9yXCIsIHZhbHVlOiBcInx8XCIgfSk7XG4gICAgICBpbmRleCArPSAyO1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgaWYgKGV4cHJlc3Npb24uc3RhcnRzV2l0aChcIjo6XCIsIGluZGV4KSkge1xuICAgICAgdG9rZW5zLnB1c2goeyB0eXBlOiBcIm9wZXJhdG9yXCIsIHZhbHVlOiBcIjo6XCIgfSk7XG4gICAgICBpbmRleCArPSAyO1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgaWYgKGNoYXIgPT09IFwiKFwiIHx8IGNoYXIgPT09IFwiKVwiIHx8IGNoYXIgPT09IFwiLFwiKSB7XG4gICAgICB0b2tlbnMucHVzaCh7IHR5cGU6IFwic3ltYm9sXCIsIHZhbHVlOiBjaGFyIH0pO1xuICAgICAgaW5kZXggKz0gMTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGlmIChjaGFyID09PSBcIidcIikge1xuICAgICAgbGV0IHZhbHVlID0gXCJcIjtcbiAgICAgIGluZGV4ICs9IDE7XG5cbiAgICAgIHdoaWxlIChpbmRleCA8IGV4cHJlc3Npb24ubGVuZ3RoKSB7XG4gICAgICAgIGNvbnN0IGN1cnJlbnQgPSBleHByZXNzaW9uW2luZGV4XTtcbiAgICAgICAgaWYgKGN1cnJlbnQgPT09IFwiJ1wiKSB7XG4gICAgICAgICAgaWYgKGV4cHJlc3Npb25baW5kZXggKyAxXSA9PT0gXCInXCIpIHtcbiAgICAgICAgICAgIHZhbHVlICs9IFwiJ1wiO1xuICAgICAgICAgICAgaW5kZXggKz0gMjtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGluZGV4ICs9IDE7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY3VycmVudCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgICB2YWx1ZSArPSBjdXJyZW50O1xuICAgICAgICBpbmRleCArPSAxO1xuICAgICAgfVxuXG4gICAgICB0b2tlbnMucHVzaCh7IHR5cGU6IFwic3RyaW5nXCIsIHZhbHVlIH0pO1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgaWYgKGNoYXIgPT09ICdcIicpIHtcbiAgICAgIGxldCB2YWx1ZSA9IFwiXCI7XG4gICAgICBpbmRleCArPSAxO1xuXG4gICAgICB3aGlsZSAoaW5kZXggPCBleHByZXNzaW9uLmxlbmd0aCkge1xuICAgICAgICBjb25zdCBjdXJyZW50ID0gZXhwcmVzc2lvbltpbmRleF07XG4gICAgICAgIGlmIChjdXJyZW50ID09PSAnXCInKSB7XG4gICAgICAgICAgaWYgKGV4cHJlc3Npb25baW5kZXggKyAxXSA9PT0gJ1wiJykge1xuICAgICAgICAgICAgdmFsdWUgKz0gJ1wiJztcbiAgICAgICAgICAgIGluZGV4ICs9IDI7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpbmRleCArPSAxO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGN1cnJlbnQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFsdWUgKz0gY3VycmVudDtcbiAgICAgICAgaW5kZXggKz0gMTtcbiAgICAgIH1cblxuICAgICAgdG9rZW5zLnB1c2goeyB0eXBlOiBcInF1b3RlZElkZW50aWZpZXJcIiwgdmFsdWUgfSk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBpZiAoL1tBLVphLXpfXS8udGVzdChjaGFyKSkge1xuICAgICAgbGV0IHZhbHVlID0gY2hhcjtcbiAgICAgIGluZGV4ICs9IDE7XG5cbiAgICAgIHdoaWxlIChpbmRleCA8IGV4cHJlc3Npb24ubGVuZ3RoKSB7XG4gICAgICAgIGNvbnN0IGN1cnJlbnQgPSBleHByZXNzaW9uW2luZGV4XTtcbiAgICAgICAgaWYgKGN1cnJlbnQgIT09IHVuZGVmaW5lZCAmJiAvW0EtWmEtejAtOV8kXS8udGVzdChjdXJyZW50KSkge1xuICAgICAgICAgIHZhbHVlICs9IGN1cnJlbnQ7XG4gICAgICAgICAgaW5kZXggKz0gMTtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgICAgdG9rZW5zLnB1c2goeyB0eXBlOiBcImlkZW50aWZpZXJcIiwgdmFsdWUgfSk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICB0aHJvdyBuZXcgRXJyb3IoYOyngOybkOuQmOyngCDslYrripQgc2VhcmNoVGV4dCBleHByZXNzaW9uIOusuOyekDogJHtjaGFyfWApO1xuICB9XG5cbiAgcmV0dXJuIHRva2Vucztcbn1cblxuZnVuY3Rpb24gY2Fub25pY2FsaXplU2VhcmNoVGV4dEdlbmVyYXRlZEV4cHJlc3Npb24oZXhwcmVzc2lvbjogc3RyaW5nKTogc3RyaW5nIHtcbiAgdHJ5IHtcbiAgICBjb25zdCBwYXJzZXIgPSBuZXcgU2VhcmNoVGV4dEV4cHJlc3Npb25QYXJzZXIodG9rZW5pemVTZWFyY2hUZXh0RXhwcmVzc2lvbihleHByZXNzaW9uKSk7XG4gICAgY29uc3QgcGFyc2VkRXhwcmVzc2lvbiA9IHBhcnNlci5wYXJzZUV4cHJlc3Npb24oKTtcblxuICAgIGlmICghcGFyc2VyLmlzQXRFbmQoKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwic2VhcmNoVGV4dCBleHByZXNzaW9uIO2MjOyLseydtCDrgZ3rgpjsp4Ag7JWK7JWY7Iq164uI64ukLlwiKTtcbiAgICB9XG5cbiAgICByZXR1cm4gcmVuZGVyU2VhcmNoVGV4dEV4cHJlc3Npb24obm9ybWFsaXplU2VhcmNoVGV4dEV4cHJlc3Npb25Ob2RlKHBhcnNlZEV4cHJlc3Npb24pKTtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIG5vcm1hbGl6ZVNlYXJjaFRleHRFeHByZXNzaW9uRmFsbGJhY2soZXhwcmVzc2lvbik7XG4gIH1cbn1cblxuZnVuY3Rpb24gbm9ybWFsaXplU2VhcmNoVGV4dEV4cHJlc3Npb25Ob2RlKFxuICBub2RlOiBTZWFyY2hUZXh0RXhwcmVzc2lvbk5vZGUsXG4pOiBTZWFyY2hUZXh0RXhwcmVzc2lvbk5vZGUge1xuICBzd2l0Y2ggKG5vZGUudHlwZSkge1xuICAgIGNhc2UgXCJpZGVudGlmaWVyXCI6XG4gICAgICByZXR1cm4ge1xuICAgICAgICAuLi5ub2RlLFxuICAgICAgICBuYW1lOiBub2RlLnF1b3RlZCA/IG5vZGUubmFtZSA6IG5vZGUubmFtZS50b0xvd2VyQ2FzZSgpLFxuICAgICAgfTtcbiAgICBjYXNlIFwic3RyaW5nXCI6XG4gICAgY2FzZSBcImJvb2xlYW5cIjpcbiAgICAgIHJldHVybiBub2RlO1xuICAgIGNhc2UgXCJjb25jYXRcIjoge1xuICAgICAgY29uc3QgcGFydHMgPSBub2RlLnBhcnRzLmZsYXRNYXAoKHBhcnQpID0+IHtcbiAgICAgICAgY29uc3Qgbm9ybWFsaXplZFBhcnQgPSBub3JtYWxpemVTZWFyY2hUZXh0RXhwcmVzc2lvbk5vZGUocGFydCk7XG4gICAgICAgIHJldHVybiBub3JtYWxpemVkUGFydC50eXBlID09PSBcImNvbmNhdFwiID8gbm9ybWFsaXplZFBhcnQucGFydHMgOiBbbm9ybWFsaXplZFBhcnRdO1xuICAgICAgfSk7XG4gICAgICByZXR1cm4geyB0eXBlOiBcImNvbmNhdFwiLCBwYXJ0cyB9O1xuICAgIH1cbiAgICBjYXNlIFwiY29sbGF0ZVwiOlxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdHlwZTogXCJjb2xsYXRlXCIsXG4gICAgICAgIGV4cHI6IG5vcm1hbGl6ZVNlYXJjaFRleHRFeHByZXNzaW9uTm9kZShub2RlLmV4cHIpLFxuICAgICAgICBjb2xsYXRpb246IG5vZGUuY29sbGF0aW9uLnRvVXBwZXJDYXNlKCkgPT09IFwiQ1wiID8gXCJDXCIgOiBub2RlLmNvbGxhdGlvbixcbiAgICAgICAgcXVvdGVkOiBub2RlLnF1b3RlZCB8fCBub2RlLmNvbGxhdGlvbi50b1VwcGVyQ2FzZSgpID09PSBcIkNcIixcbiAgICAgIH07XG4gICAgY2FzZSBcImNhc3RcIjoge1xuICAgICAgY29uc3Qgbm9ybWFsaXplZEV4cHIgPSBub3JtYWxpemVTZWFyY2hUZXh0RXhwcmVzc2lvbk5vZGUobm9kZS5leHByKTtcbiAgICAgIGNvbnN0IHRhcmdldFR5cGUgPSBub2RlLnRhcmdldFR5cGUucmVwbGFjZSgvXFxzKy9nLCBcIiBcIikudHJpbSgpLnRvTG93ZXJDYXNlKCk7XG4gICAgICBpZiAodGFyZ2V0VHlwZSA9PT0gXCJ0ZXh0XCIgfHwgdGFyZ2V0VHlwZSA9PT0gXCJjaGFyYWN0ZXIgdmFyeWluZ1wiIHx8IHRhcmdldFR5cGUgPT09IFwidmFyY2hhclwiKSB7XG4gICAgICAgIHJldHVybiBub3JtYWxpemVkRXhwcjtcbiAgICAgIH1cbiAgICAgIHJldHVybiB7XG4gICAgICAgIHR5cGU6IFwiY2FzdFwiLFxuICAgICAgICBleHByOiBub3JtYWxpemVkRXhwcixcbiAgICAgICAgdGFyZ2V0VHlwZSxcbiAgICAgIH07XG4gICAgfVxuICAgIGNhc2UgXCJmdW5jdGlvblwiOiB7XG4gICAgICBjb25zdCBuYW1lID0gbm9kZS5uYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgICBsZXQgYXJncyA9IG5vZGUuYXJncy5tYXAoKGFyZykgPT4gbm9ybWFsaXplU2VhcmNoVGV4dEV4cHJlc3Npb25Ob2RlKGFyZykpO1xuXG4gICAgICBpZiAoKG5hbWUgPT09IFwidHJpbVwiIHx8IG5hbWUgPT09IFwiYnRyaW1cIikgJiYgYXJncy5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICB0eXBlOiBcImZ1bmN0aW9uXCIsXG4gICAgICAgICAgbmFtZTogXCJ0cmltXCIsXG4gICAgICAgICAgYXJncyxcbiAgICAgICAgfTtcbiAgICAgIH1cblxuICAgICAgaWYgKFxuICAgICAgICAobmFtZSA9PT0gXCJzb25hbXVfdGV4dF9hcnJheV9hZ2dcIiB8fCBuYW1lID09PSBcInNvbmFtdV9qc29uYl9hcnJheV9hZ2dcIikgJiZcbiAgICAgICAgYXJncy5sZW5ndGggPT09IDIgJiZcbiAgICAgICAgYXJnc1sxXT8udHlwZSA9PT0gXCJib29sZWFuXCIgJiZcbiAgICAgICAgYXJnc1sxXS52YWx1ZVxuICAgICAgKSB7XG4gICAgICAgIGFyZ3MgPSBbYXJnc1swXV07XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIHR5cGU6IFwiZnVuY3Rpb25cIixcbiAgICAgICAgbmFtZSxcbiAgICAgICAgYXJncyxcbiAgICAgIH07XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIHJlbmRlclNlYXJjaFRleHRFeHByZXNzaW9uKG5vZGU6IFNlYXJjaFRleHRFeHByZXNzaW9uTm9kZSwgcGFyZW50UHJlY2VkZW5jZSA9IDApOiBzdHJpbmcge1xuICBjb25zdCBwcmVjZWRlbmNlID0gZ2V0U2VhcmNoVGV4dEV4cHJlc3Npb25QcmVjZWRlbmNlKG5vZGUpO1xuICBjb25zdCByZW5kZXJlZCA9ICgoKSA9PiB7XG4gICAgc3dpdGNoIChub2RlLnR5cGUpIHtcbiAgICAgIGNhc2UgXCJpZGVudGlmaWVyXCI6XG4gICAgICAgIHJldHVybiBub2RlLnF1b3RlZCA/IGBcIiR7bm9kZS5uYW1lLnJlcGxhY2VBbGwoJ1wiJywgJ1wiXCInKX1cImAgOiBub2RlLm5hbWU7XG4gICAgICBjYXNlIFwic3RyaW5nXCI6XG4gICAgICAgIHJldHVybiBgJyR7bm9kZS52YWx1ZS5yZXBsYWNlQWxsKFwiJ1wiLCBcIicnXCIpfSdgO1xuICAgICAgY2FzZSBcImJvb2xlYW5cIjpcbiAgICAgICAgcmV0dXJuIG5vZGUudmFsdWUgPyBcInRydWVcIiA6IFwiZmFsc2VcIjtcbiAgICAgIGNhc2UgXCJmdW5jdGlvblwiOlxuICAgICAgICByZXR1cm4gYCR7bm9kZS5uYW1lfSgke25vZGUuYXJnc1xuICAgICAgICAgIC5tYXAoKGFyZykgPT4gcmVuZGVyU2VhcmNoVGV4dEV4cHJlc3Npb24oYXJnKSlcbiAgICAgICAgICAuam9pbihcIiwgXCIpfSlgO1xuICAgICAgY2FzZSBcImNvbmNhdFwiOlxuICAgICAgICByZXR1cm4gbm9kZS5wYXJ0cy5tYXAoKHBhcnQpID0+IHJlbmRlclNlYXJjaFRleHRFeHByZXNzaW9uKHBhcnQsIHByZWNlZGVuY2UpKS5qb2luKFwiIHx8IFwiKTtcbiAgICAgIGNhc2UgXCJjb2xsYXRlXCI6IHtcbiAgICAgICAgY29uc3QgY29sbGF0aW9uID0gbm9kZS5xdW90ZWRcbiAgICAgICAgICA/IGBcIiR7bm9kZS5jb2xsYXRpb24ucmVwbGFjZUFsbCgnXCInLCAnXCJcIicpfVwiYFxuICAgICAgICAgIDogbm9kZS5jb2xsYXRpb247XG4gICAgICAgIHJldHVybiBgJHtyZW5kZXJTZWFyY2hUZXh0RXhwcmVzc2lvbihub2RlLmV4cHIsIHByZWNlZGVuY2UpfSBDT0xMQVRFICR7Y29sbGF0aW9ufWA7XG4gICAgICB9XG4gICAgICBjYXNlIFwiY2FzdFwiOlxuICAgICAgICByZXR1cm4gYCR7cmVuZGVyU2VhcmNoVGV4dEV4cHJlc3Npb24obm9kZS5leHByLCBwcmVjZWRlbmNlKX06OiR7bm9kZS50YXJnZXRUeXBlfWA7XG4gICAgfVxuICB9KSgpO1xuXG4gIGlmIChwcmVjZWRlbmNlIDwgcGFyZW50UHJlY2VkZW5jZSkge1xuICAgIHJldHVybiBgKCR7cmVuZGVyZWR9KWA7XG4gIH1cblxuICByZXR1cm4gcmVuZGVyZWQ7XG59XG5cbmZ1bmN0aW9uIGdldFNlYXJjaFRleHRFeHByZXNzaW9uUHJlY2VkZW5jZShub2RlOiBTZWFyY2hUZXh0RXhwcmVzc2lvbk5vZGUpOiBudW1iZXIge1xuICBzd2l0Y2ggKG5vZGUudHlwZSkge1xuICAgIGNhc2UgXCJjb25jYXRcIjpcbiAgICAgIHJldHVybiAxO1xuICAgIGNhc2UgXCJjb2xsYXRlXCI6XG4gICAgY2FzZSBcImNhc3RcIjpcbiAgICAgIHJldHVybiAyO1xuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gMztcbiAgfVxufVxuXG5mdW5jdGlvbiBub3JtYWxpemVTZWFyY2hUZXh0RXhwcmVzc2lvbkZhbGxiYWNrKGV4cHJlc3Npb246IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBleHByZXNzaW9uXG4gICAgLnJlcGxhY2UoL1xccysvZywgXCIgXCIpXG4gICAgLnJlcGxhY2UoL1xcYlRSSU1cXHMqXFwoXFxzKkJPVEhcXHMrRlJPTVxccysvZ2ksIFwidHJpbShcIilcbiAgICAucmVwbGFjZSgvOjooPzp0ZXh0fGNoYXJhY3RlciB2YXJ5aW5nfHZhcmNoYXIpXFxiL2dpLCBcIlwiKVxuICAgIC5yZXBsYWNlKC8sXFxzKnRydWVcXGIvZ2ksIFwiXCIpXG4gICAgLnRyaW0oKTtcbn1cblxuZnVuY3Rpb24gdmlzaXRTZWFyY2hUZXh0RXhwcmVzc2lvbk5vZGUoXG4gIG5vZGU6IFNlYXJjaFRleHRFeHByZXNzaW9uTm9kZSxcbiAgdmlzaXRvcjogKG5vZGU6IFNlYXJjaFRleHRFeHByZXNzaW9uTm9kZSkgPT4gdm9pZCxcbik6IHZvaWQge1xuICB2aXNpdG9yKG5vZGUpO1xuXG4gIHN3aXRjaCAobm9kZS50eXBlKSB7XG4gICAgY2FzZSBcImNvbmNhdFwiOlxuICAgICAgbm9kZS5wYXJ0cy5mb3JFYWNoKChwYXJ0KSA9PiB7XG4gICAgICAgIHZpc2l0U2VhcmNoVGV4dEV4cHJlc3Npb25Ob2RlKHBhcnQsIHZpc2l0b3IpO1xuICAgICAgfSk7XG4gICAgICByZXR1cm47XG4gICAgY2FzZSBcImNvbGxhdGVcIjpcbiAgICBjYXNlIFwiY2FzdFwiOlxuICAgICAgdmlzaXRTZWFyY2hUZXh0RXhwcmVzc2lvbk5vZGUobm9kZS5leHByLCB2aXNpdG9yKTtcbiAgICAgIHJldHVybjtcbiAgICBjYXNlIFwiZnVuY3Rpb25cIjpcbiAgICAgIG5vZGUuYXJncy5mb3JFYWNoKChhcmcpID0+IHtcbiAgICAgICAgdmlzaXRTZWFyY2hUZXh0RXhwcmVzc2lvbk5vZGUoYXJnLCB2aXNpdG9yKTtcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuO1xuICAgIGNhc2UgXCJpZGVudGlmaWVyXCI6XG4gICAgY2FzZSBcInN0cmluZ1wiOlxuICAgIGNhc2UgXCJib29sZWFuXCI6XG4gICAgICByZXR1cm47XG4gIH1cbn1cblxuZnVuY3Rpb24gZ2V0U2VhcmNoVGV4dEhlbHBlcktpbmRzRnJvbUV4cHJlc3Npb24oZXhwcmVzc2lvbjogc3RyaW5nKTogU2V0PFNlYXJjaFRleHRIZWxwZXJLaW5kPiB7XG4gIGNvbnN0IGhlbHBlcktpbmRzID0gbmV3IFNldDxTZWFyY2hUZXh0SGVscGVyS2luZD4oKTtcbiAgY29uc3QgYWRkSGVscGVyS2luZEZyb21OYW1lID0gKG5hbWU6IHN0cmluZykgPT4ge1xuICAgIGNvbnN0IG5vcm1hbGl6ZWROYW1lID0gbmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgIGlmIChub3JtYWxpemVkTmFtZSA9PT0gXCJzb25hbXVfdGV4dF9hcnJheV9hZ2dcIikge1xuICAgICAgaGVscGVyS2luZHMuYWRkKFwidGV4dC1hcnJheVwiKTtcbiAgICB9IGVsc2UgaWYgKG5vcm1hbGl6ZWROYW1lID09PSBcInNvbmFtdV9qc29uYl9hcnJheV9hZ2dcIikge1xuICAgICAgaGVscGVyS2luZHMuYWRkKFwianNvbmItYXJyYXlcIik7XG4gICAgfVxuICB9O1xuXG4gIHRyeSB7XG4gICAgY29uc3QgcGFyc2VyID0gbmV3IFNlYXJjaFRleHRFeHByZXNzaW9uUGFyc2VyKHRva2VuaXplU2VhcmNoVGV4dEV4cHJlc3Npb24oZXhwcmVzc2lvbikpO1xuICAgIGNvbnN0IHBhcnNlZEV4cHJlc3Npb24gPSBwYXJzZXIucGFyc2VFeHByZXNzaW9uKCk7XG5cbiAgICBpZiAoIXBhcnNlci5pc0F0RW5kKCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcInNlYXJjaFRleHQgaGVscGVyIGV4cHJlc3Npb24g7YyM7Iux7J20IOuBneuCmOyngCDslYrslZjsirXri4jri6QuXCIpO1xuICAgIH1cblxuICAgIHZpc2l0U2VhcmNoVGV4dEV4cHJlc3Npb25Ob2RlKHBhcnNlZEV4cHJlc3Npb24sIChub2RlKSA9PiB7XG4gICAgICBpZiAobm9kZS50eXBlID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgYWRkSGVscGVyS2luZEZyb21OYW1lKG5vZGUubmFtZSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH0gY2F0Y2gge1xuICAgIGlmICgvXFxic29uYW11X3RleHRfYXJyYXlfYWdnXFxzKlxcKC9pLnRlc3QoZXhwcmVzc2lvbikpIHtcbiAgICAgIGhlbHBlcktpbmRzLmFkZChcInRleHQtYXJyYXlcIik7XG4gICAgfVxuICAgIGlmICgvXFxic29uYW11X2pzb25iX2FycmF5X2FnZ1xccypcXCgvaS50ZXN0KGV4cHJlc3Npb24pKSB7XG4gICAgICBoZWxwZXJLaW5kcy5hZGQoXCJqc29uYi1hcnJheVwiKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gaGVscGVyS2luZHM7XG59XG5cbmZ1bmN0aW9uIHJlc29sdmVTZWFyY2hUZXh0Q29sdW1ucyh0YWJsZTogc3RyaW5nLCBjb2x1bW5zOiBNaWdyYXRpb25Db2x1bW5bXSk6IE1pZ3JhdGlvbkNvbHVtbltdIHtcbiAgY29uc3QgZW50aXR5ID0gKCgpID0+IHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIEVudGl0eU1hbmFnZXIuZ2V0QnlUYWJsZSh0YWJsZSk7XG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gIH0pKCk7XG5cbiAgaWYgKCFlbnRpdHkpIHtcbiAgICByZXR1cm4gY29sdW1ucztcbiAgfVxuXG4gIGNvbnN0IHByb3BzQnlOYW1lID0gbmV3IE1hcChlbnRpdHkucHJvcHMubWFwKChwcm9wKSA9PiBbcHJvcC5uYW1lLCBwcm9wXSkpO1xuXG4gIHJldHVybiBjb2x1bW5zLm1hcCgoY29sdW1uKSA9PiB7XG4gICAgY29uc3QgcHJvcCA9IHByb3BzQnlOYW1lLmdldChjb2x1bW4ubmFtZSk7XG4gICAgaWYgKCFwcm9wIHx8ICFpc1NlYXJjaFRleHRQcm9wKHByb3ApKSB7XG4gICAgICByZXR1cm4gY29sdW1uO1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICAuLi5jb2x1bW4sXG4gICAgICBnZW5lcmF0ZWQ6IHtcbiAgICAgICAgdHlwZTogXCJTVE9SRURcIixcbiAgICAgICAgZXhwcmVzc2lvbjogYnVpbGRTZWFyY2hUZXh0R2VuZXJhdGVkRXhwcmVzc2lvbihwcm9wLCBwcm9wc0J5TmFtZSksXG4gICAgICB9LFxuICAgIH07XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBidWlsZFNlYXJjaFRleHRHZW5lcmF0ZWRFeHByZXNzaW9uKFxuICBwcm9wOiBFeHRyYWN0PEVudGl0eVByb3AsIHsgdHlwZTogXCJzZWFyY2hUZXh0XCIgfT4sXG4gIHByb3BzQnlOYW1lOiBNYXA8c3RyaW5nLCBFbnRpdHlQcm9wPixcbik6IHN0cmluZyB7XG4gIGNvbnN0IHRva2VucyA9IHByb3Auc291cmNlQ29sdW1ucy5tYXAoKHNvdXJjZSkgPT4ge1xuICAgIGNvbnN0IHNvdXJjZVByb3AgPSBwcm9wc0J5TmFtZS5nZXQoc291cmNlLm5hbWUpO1xuICAgIGlmICghc291cmNlUHJvcCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBzZWFyY2hUZXh0IHNvdXJjZSBjb2x1bW4gXCIke3NvdXJjZS5uYW1lfVwi7J2EKOulvCkg7LC+7J2EIOyImCDsl4bsirXri4jri6QuYCk7XG4gICAgfVxuXG4gICAgaWYgKHNvdXJjZVByb3AudHlwZSA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgcmV0dXJuIHNvdXJjZS5jYXNlSW5zZW5zaXRpdmVcbiAgICAgICAgPyBgbG93ZXIoQ09BTEVTQ0UoJHtzb3VyY2UubmFtZX0sICcnKSlgXG4gICAgICAgIDogYENPQUxFU0NFKCR7c291cmNlLm5hbWV9LCAnJylgO1xuICAgIH1cblxuICAgIGlmIChzb3VyY2VQcm9wLnR5cGUgPT09IFwic3RyaW5nW11cIikge1xuICAgICAgcmV0dXJuIHNvdXJjZS5jYXNlSW5zZW5zaXRpdmVcbiAgICAgICAgPyBgQ09BTEVTQ0Uoc29uYW11X3RleHRfYXJyYXlfYWdnKCR7c291cmNlLm5hbWV9KSwgJycpYFxuICAgICAgICA6IGBDT0FMRVNDRShzb25hbXVfdGV4dF9hcnJheV9hZ2coJHtzb3VyY2UubmFtZX0sIGZhbHNlKSwgJycpYDtcbiAgICB9XG5cbiAgICBpZiAoc291cmNlUHJvcC50eXBlID09PSBcImpzb25cIikge1xuICAgICAgcmV0dXJuIHNvdXJjZS5jYXNlSW5zZW5zaXRpdmVcbiAgICAgICAgPyBgQ09BTEVTQ0Uoc29uYW11X2pzb25iX2FycmF5X2FnZygke3NvdXJjZS5uYW1lfSksICcnKWBcbiAgICAgICAgOiBgQ09BTEVTQ0Uoc29uYW11X2pzb25iX2FycmF5X2FnZygke3NvdXJjZS5uYW1lfSwgZmFsc2UpLCAnJylgO1xuICAgIH1cblxuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGBzZWFyY2hUZXh0IHNvdXJjZSBjb2x1bW4gXCIke3NvdXJjZS5uYW1lfVwi7J2YIO2DgOyehSBcIiR7c291cmNlUHJvcC50eXBlfVwi7J2AKOuKlCkg7KeA7JuQ65CY7KeAIOyViuyKteuLiOuLpC5gLFxuICAgICk7XG4gIH0pO1xuXG4gIHJldHVybiBgdHJpbSgke3Rva2Vucy5qb2luKGAgfHwgJyAnIHx8IGApfSlgO1xufVxuXG5mdW5jdGlvbiBnZXRTZWFyY2hUZXh0SGVscGVyRGVmaW5pdGlvbnModGFibGU6IHN0cmluZywgY29sdW1uczogTWlncmF0aW9uQ29sdW1uW10pOiBzdHJpbmdbXSB7XG4gIGNvbnN0IGhlbHBlcktpbmRzID0gbmV3IFNldDxTZWFyY2hUZXh0SGVscGVyS2luZD4oKTtcblxuICBjb2x1bW5zLmZvckVhY2goKGNvbHVtbikgPT4ge1xuICAgIGlmICghY29sdW1uLmdlbmVyYXRlZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGdldFNlYXJjaFRleHRIZWxwZXJLaW5kc0Zyb21FeHByZXNzaW9uKGNvbHVtbi5nZW5lcmF0ZWQuZXhwcmVzc2lvbikuZm9yRWFjaCgoa2luZCkgPT4ge1xuICAgICAgaGVscGVyS2luZHMuYWRkKGtpbmQpO1xuICAgIH0pO1xuICB9KTtcblxuICBpZiAoaGVscGVyS2luZHMuc2l6ZSA+IDApIHtcbiAgICByZXR1cm4gKFtcInRleHQtYXJyYXlcIiwgXCJqc29uYi1hcnJheVwiXSBhcyBjb25zdClcbiAgICAgIC5maWx0ZXIoKGtpbmQpID0+IGhlbHBlcktpbmRzLmhhcyhraW5kKSlcbiAgICAgIC5tYXAoKGtpbmQpID0+IFNFQVJDSF9URVhUX0hFTFBFUl9ERUZJTklUSU9OU1traW5kXSk7XG4gIH1cblxuICBjb25zdCBlbnRpdHkgPSAoKCkgPT4ge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gRW50aXR5TWFuYWdlci5nZXRCeVRhYmxlKHRhYmxlKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgfSkoKTtcblxuICBpZiAoIWVudGl0eSkge1xuICAgIHJldHVybiBbXTtcbiAgfVxuICBjb25zdCBwcm9wc0J5TmFtZSA9IG5ldyBNYXAoZW50aXR5LnByb3BzLm1hcCgocHJvcCkgPT4gW3Byb3AubmFtZSwgcHJvcF0pKTtcblxuICBjb2x1bW5zLmZvckVhY2goKGNvbHVtbikgPT4ge1xuICAgIGNvbnN0IHByb3AgPSBwcm9wc0J5TmFtZS5nZXQoY29sdW1uLm5hbWUpO1xuICAgIGlmICghcHJvcCB8fCAhaXNTZWFyY2hUZXh0UHJvcChwcm9wKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHByb3Auc291cmNlQ29sdW1ucy5mb3JFYWNoKChzb3VyY2UpID0+IHtcbiAgICAgIGNvbnN0IHNvdXJjZVByb3AgPSBwcm9wc0J5TmFtZS5nZXQoc291cmNlLm5hbWUpO1xuICAgICAgaWYgKHNvdXJjZVByb3A/LnR5cGUgPT09IFwic3RyaW5nW11cIikge1xuICAgICAgICBoZWxwZXJLaW5kcy5hZGQoXCJ0ZXh0LWFycmF5XCIpO1xuICAgICAgfSBlbHNlIGlmIChzb3VyY2VQcm9wPy50eXBlID09PSBcImpzb25cIikge1xuICAgICAgICBoZWxwZXJLaW5kcy5hZGQoXCJqc29uYi1hcnJheVwiKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfSk7XG5cbiAgcmV0dXJuIChbXCJ0ZXh0LWFycmF5XCIsIFwianNvbmItYXJyYXlcIl0gYXMgY29uc3QpXG4gICAgLmZpbHRlcigoa2luZCkgPT4gaGVscGVyS2luZHMuaGFzKGtpbmQpKVxuICAgIC5tYXAoKGtpbmQpID0+IFNFQVJDSF9URVhUX0hFTFBFUl9ERUZJTklUSU9OU1traW5kXSk7XG59XG5cbmZ1bmN0aW9uIGdldFNlYXJjaFRleHRDb2x1bW5OYW1lcyh0YWJsZTogc3RyaW5nKTogU2V0PHN0cmluZz4ge1xuICBjb25zdCBlbnRpdHkgPSAoKCkgPT4ge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gRW50aXR5TWFuYWdlci5nZXRCeVRhYmxlKHRhYmxlKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgfSkoKTtcblxuICBpZiAoIWVudGl0eSkge1xuICAgIHJldHVybiBuZXcgU2V0KCk7XG4gIH1cblxuICByZXR1cm4gbmV3IFNldChlbnRpdHkucHJvcHMuZmlsdGVyKGlzU2VhcmNoVGV4dFByb3ApLm1hcCgocHJvcCkgPT4gcHJvcC5uYW1lKSk7XG59XG5cbi8qKlxuICog7YWM7J2067iUIOyDneyEse2VmOuKlCDsvIDsnbTsiqQgLSDsu6zrn7wv7J24642x7IqkIOyDneyEsVxuICovXG5hc3luYyBmdW5jdGlvbiBnZW5lcmF0ZUNyZWF0ZUNvZGVfQ29sdW1uQW5kSW5kZXhlcyhcbiAgdGFibGU6IHN0cmluZyxcbiAgY29sdW1uczogTWlncmF0aW9uQ29sdW1uW10sXG4gIGluZGV4ZXM6IE1pZ3JhdGlvbkluZGV4W10sXG4pOiBQcm9taXNlPEdlbk1pZ3JhdGlvbkNvZGU+IHtcbiAgY29uc3QgcmVzb2x2ZWRDb2x1bW5zID0gcmVzb2x2ZVNlYXJjaFRleHRDb2x1bW5zKHRhYmxlLCBjb2x1bW5zKTtcbiAgY29uc3QgY29sdW1uRGVmcyA9IGdlbkNvbHVtbkRlZmluaXRpb25zKHRhYmxlLCByZXNvbHZlZENvbHVtbnMpO1xuICBjb25zdCBoZWxwZXJEZWZpbml0aW9ucyA9IGdldFNlYXJjaFRleHRIZWxwZXJEZWZpbml0aW9ucyh0YWJsZSwgcmVzb2x2ZWRDb2x1bW5zKTtcblxuICAvLyDsu6zrn7wsIOyduOuNseyKpCDsspjrpqxcbiAgY29uc3QgbGluZXM6IHN0cmluZ1tdID0gW1xuICAgICdpbXBvcnQgdHlwZSB7IEtuZXggfSBmcm9tIFwia25leFwiOycsXG4gICAgXCJcIixcbiAgICBcImV4cG9ydCBhc3luYyBmdW5jdGlvbiB1cChrbmV4OiBLbmV4KTogUHJvbWlzZTx2b2lkPiB7XCIsXG4gICAgLi4uaGVscGVyRGVmaW5pdGlvbnMsXG4gICAgYGF3YWl0IGtuZXguc2NoZW1hLmNyZWF0ZVRhYmxlKFwiJHt0YWJsZX1cIiwgKHRhYmxlKSA9PiB7YCxcbiAgICAuLi5jb2x1bW5EZWZzLmJ1aWxkZXIsXG4gICAgXCJ9KTtcIixcbiAgICAvLyByYXcg6rWs66y4IChHZW5lcmF0ZWQgQ29sdW1uIOuTsSlcbiAgICAuLi5jb2x1bW5EZWZzLnJhdyxcbiAgICAvLyBpbmRleOuKlCBrbmV4LnJhd+uhnCDsspjrpqztlZjrr4DroZwgY3JlYXRlVGFibGUg67CW7JeQ7IScIOyLpO2WiVxuICAgIC4uLmluZGV4ZXMubWFwKChpbmRleCkgPT4gZ2VuSW5kZXhEZWZpbml0aW9uKGluZGV4LCB0YWJsZSkpLFxuICAgIFwifVwiLFxuICAgIFwiXCIsXG4gICAgXCJleHBvcnQgYXN5bmMgZnVuY3Rpb24gZG93bihrbmV4OiBLbmV4KTogUHJvbWlzZTx2b2lkPiB7XCIsXG4gICAgYCByZXR1cm4ga25leC5zY2hlbWEuZHJvcFRhYmxlKFwiJHt0YWJsZX1cIik7YCxcbiAgICBcIn1cIixcbiAgXTtcbiAgcmV0dXJuIHtcbiAgICB0YWJsZSxcbiAgICB0eXBlOiBcIm5vcm1hbFwiLFxuICAgIHRpdGxlOiBgY3JlYXRlX18ke3RhYmxlfWAsXG4gICAgZm9ybWF0dGVkOiBhd2FpdCBmb3JtYXRDb2RlKGxpbmVzLmpvaW4oXCJcXG5cIiksIGBzcmMvbWlncmF0aW9uLyR7dGFibGV9LnRzYCksXG4gIH07XG59XG5cbi8qKlxuICogTWlncmF0aW9uQ29sdW1uW10g7J297Ja07IScIOy7rOufvCDsoJXsnZjtlZjripQg6rWs66y4IOyDneyEsVxuICogQHJldHVybnMgYnVpbGRlcjogdGFibGUgYnVpbGRlciDrqZTshJzrk5wsIHJhdzoga25leC5yYXcoKSDqtazrrLhcbiAqL1xuZnVuY3Rpb24gZ2VuQ29sdW1uRGVmaW5pdGlvbnModGFibGU6IHN0cmluZywgY29sdW1uczogTWlncmF0aW9uQ29sdW1uW10pOiBDb2x1bW5EZWZpbml0aW9uUmVzdWx0IHtcbiAgY29uc3QgcmVzdWx0OiBDb2x1bW5EZWZpbml0aW9uUmVzdWx0ID0ge1xuICAgIGJ1aWxkZXI6IFtdLFxuICAgIHJhdzogW10sXG4gIH07XG5cbiAgZm9yIChjb25zdCBjb2x1bW4gb2YgY29sdW1ucykge1xuICAgIC8vIEdlbmVyYXRlZCBDb2x1bW7snYAgcmF366GcIOyymOumrFxuICAgIGlmIChjb2x1bW4uZ2VuZXJhdGVkKSB7XG4gICAgICByZXN1bHQucmF3LnB1c2goZ2VuR2VuZXJhdGVkQ29sdW1uRGVmaW5pdGlvbih0YWJsZSwgY29sdW1uKSk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICAvLyDsnbzrsJgg7Lus65+87J2AIGJ1aWxkZXLroZwg7LKY66asXG4gICAgcmVzdWx0LmJ1aWxkZXIucHVzaChnZW5Ob3JtYWxDb2x1bW5EZWZpbml0aW9uKGNvbHVtbikpO1xuICB9XG5cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuLyoqXG4gKiBHZW5lcmF0ZWQgQ29sdW1uIOygleydmCDsg53shLEgKEFMVEVSIFRBQkxFIEFERCBDT0xVTU4g7IKs7JqpKVxuICovXG5mdW5jdGlvbiBnZW5HZW5lcmF0ZWRDb2x1bW5EZWZpbml0aW9uKHRhYmxlOiBzdHJpbmcsIGNvbHVtbjogTWlncmF0aW9uQ29sdW1uKTogc3RyaW5nIHtcbiAgaWYgKCFjb2x1bW4uZ2VuZXJhdGVkKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiR2VuZXJhdGVkIGNvbHVtbiBkZWZpbml0aW9uIHJlcXVpcmVkXCIpO1xuICB9XG4gIGNvbnN0IHBnVHlwZSA9IGdldFBnVHlwZUZvckNvbHVtbihjb2x1bW4pO1xuICBjb25zdCBzdG9yYWdlVHlwZSA9IGNvbHVtbi5nZW5lcmF0ZWQudHlwZSA9PT0gXCJWSVJUVUFMXCIgPyBcIiBWSVJUVUFMXCIgOiBcIiBTVE9SRURcIjtcbiAgY29uc3QgbnVsbGFibGVDbGF1c2UgPSBjb2x1bW4ubnVsbGFibGUgPyBcIlwiIDogXCIgTk9UIE5VTExcIjtcbiAgcmV0dXJuIGBhd2FpdCBrbmV4LnJhdyhcXGBBTFRFUiBUQUJMRSBcIiR7dGFibGV9XCIgQUREIENPTFVNTiBcIiR7Y29sdW1uLm5hbWV9XCIgJHtwZ1R5cGV9IEdFTkVSQVRFRCBBTFdBWVMgQVMgKCR7Y29sdW1uLmdlbmVyYXRlZC5leHByZXNzaW9ufSkke3N0b3JhZ2VUeXBlfSR7bnVsbGFibGVDbGF1c2V9XFxgKTtgO1xufVxuXG4vKipcbiAqIOydvOuwmCDsu6zrn7wg7KCV7J2YIOyDneyEsSAodGFibGUueHh4KCkg7LK07J24KVxuICovXG5mdW5jdGlvbiBnZW5Ob3JtYWxDb2x1bW5EZWZpbml0aW9uKGNvbHVtbjogTWlncmF0aW9uQ29sdW1uKTogc3RyaW5nIHtcbiAgY29uc3QgY2hhaW5zOiBzdHJpbmdbXSA9IFtdO1xuXG4gIGlmIChjb2x1bW4ubmFtZSA9PT0gXCJpZFwiKSB7XG4gICAgLy8gUEsg7YOA7J6F7JeQIOuUsOuluCDrtoTquLAg7LKY66asXG4gICAgaWYgKGNvbHVtbi50eXBlID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAvLyBzdHJpbmcgUEs6IGxlbmd0aOqwgCDsnojsnLzrqbQgdmFyY2hhciwg7JeG7Jy866m0IHRleHRcbiAgICAgIGlmIChjb2x1bW4ubGVuZ3RoICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuIGB0YWJsZS5zdHJpbmcoJ2lkJywgJHtjb2x1bW4ubGVuZ3RofSkucHJpbWFyeSgpLm5vdE51bGxhYmxlKCk7YDtcbiAgICAgIH1cbiAgICAgIHJldHVybiBgdGFibGUudGV4dCgnaWQnKS5wcmltYXJ5KCkubm90TnVsbGFibGUoKTtgO1xuICAgIH1cbiAgICBpZiAoY29sdW1uLnR5cGUgPT09IFwidXVpZFwiKSB7XG4gICAgICByZXR1cm4gYHRhYmxlLnV1aWQoJ2lkJykucHJpbWFyeSgpLm5vdE51bGxhYmxlKCk7YDtcbiAgICB9XG4gICAgLy8g6riw7KG0IGludGVnZXIgUEsgKOq4sOuzuOqwkilcbiAgICByZXR1cm4gYHRhYmxlLmluY3JlbWVudHMoKS5wcmltYXJ5KCk7YDtcbiAgfVxuXG4gIC8vIOuwsOyXtCDtg4DsnoUg7LKY66asXG4gIGlmIChjb2x1bW4udHlwZS5lbmRzV2l0aChcIltdXCIpKSB7XG4gICAgY29uc3QgZWxlbWVudFR5cGUgPSBjb2x1bW4udHlwZS5zbGljZSgwLCAtMik7IC8vIFwiaW50ZWdlcltdXCIgLT4gXCJpbnRlZ2VyXCJcbiAgICBjb25zdCBwZ1R5cGUgPSBnZXRQZ0FycmF5VHlwZShjb2x1bW4sIGVsZW1lbnRUeXBlKTtcbiAgICBjaGFpbnMucHVzaChgc3BlY2lmaWNUeXBlKCcke2NvbHVtbi5uYW1lfScsICcke3BnVHlwZX0nKWApO1xuICB9IGVsc2UgaWYgKGNvbHVtbi50eXBlID09PSBcInZlY3RvclwiKSB7XG4gICAgLy8gS25leOuKlCB2ZWN0b3Ig7YOA7J6F7J2EIOyngeygkSDsp4Dsm5DtlZjsp4Ag7JWK7Jy866+A66GcIHNwZWNpZmljVHlwZSDsgqzsmqlcbiAgICBjaGFpbnMucHVzaChgc3BlY2lmaWNUeXBlKCcke2NvbHVtbi5uYW1lfScsICd2ZWN0b3IoJHtjb2x1bW4uZGltZW5zaW9uc30pJylgKTtcbiAgfSBlbHNlIGlmIChjb2x1bW4udHlwZSA9PT0gXCJudW1iZXJPck51bWVyaWNcIikge1xuICAgIC8vIG51bWJlclxuICAgIGlmIChjb2x1bW4ubnVtYmVyVHlwZSA9PT0gXCJyZWFsXCIpIHtcbiAgICAgIGNoYWlucy5wdXNoKGBmbG9hdCgnJHtjb2x1bW4ubmFtZX0nKWApO1xuICAgIH0gZWxzZSBpZiAoY29sdW1uLm51bWJlclR5cGUgPT09IFwiZG91YmxlIHByZWNpc2lvblwiKSB7XG4gICAgICBjaGFpbnMucHVzaChgZG91YmxlKCcke2NvbHVtbi5uYW1lfScpYCk7XG4gICAgfSBlbHNlIGlmICgoY29sdW1uLm51bWJlclR5cGUgPz8gXCJudW1lcmljXCIpID09PSBcIm51bWVyaWNcIikge1xuICAgICAgY2hhaW5zLnB1c2goYGRlY2ltYWwoJyR7Y29sdW1uLm5hbWV9JywgJHtjb2x1bW4ucHJlY2lzaW9ufSwgJHtjb2x1bW4uc2NhbGV9KWApO1xuICAgIH1cbiAgfSBlbHNlIGlmIChjb2x1bW4udHlwZSA9PT0gXCJzdHJpbmdcIikge1xuICAgIC8vIHN0cmluZ1xuICAgIGlmIChjb2x1bW4ubGVuZ3RoICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGNoYWlucy5wdXNoKGBzdHJpbmcoJyR7Y29sdW1uLm5hbWV9JywgJHtjb2x1bW4ubGVuZ3RofSlgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY2hhaW5zLnB1c2goYHRleHQoJyR7Y29sdW1uLm5hbWV9JylgKTtcbiAgICB9XG4gIH0gZWxzZSBpZiAoY29sdW1uLnR5cGUgPT09IFwiZGF0ZVwiKSB7XG4gICAgLy8gZGF0ZVxuICAgIGNoYWlucy5wdXNoKFxuICAgICAgYHRpbWVzdGFtcCgnJHtjb2x1bW4ubmFtZX0nLCB7IHVzZVR6OiB0cnVlLCBwcmVjaXNpb246ICR7Y29sdW1uLnByZWNpc2lvbiA/PyAzfSB9KWAsXG4gICAgKTtcbiAgfSBlbHNlIGlmIChjb2x1bW4udHlwZSA9PT0gXCJqc29uXCIpIHtcbiAgICAvLyBqc29uXG4gICAgY2hhaW5zLnB1c2goYGpzb25iKCcke2NvbHVtbi5uYW1lfScpYCk7XG4gIH0gZWxzZSB7XG4gICAgLy8gdHlwZSwgbGVuZ3RoXG4gICAgY2hhaW5zLnB1c2goYCR7Y29sdW1uLnR5cGV9KCcke2NvbHVtbi5uYW1lfScke2NvbHVtbi5sZW5ndGggPyBgLCAke2NvbHVtbi5sZW5ndGh9YCA6IFwiXCJ9KWApO1xuICB9XG5cbiAgLy8gbnVsbGFibGVcbiAgY2hhaW5zLnB1c2goY29sdW1uLm51bGxhYmxlID8gXCJudWxsYWJsZSgpXCIgOiBcIm5vdE51bGxhYmxlKClcIik7XG5cbiAgLy8gZGVmYXVsdFRvXG4gIGlmIChjb2x1bW4uZGVmYXVsdFRvICE9PSB1bmRlZmluZWQpIHtcbiAgICBpZiAodHlwZW9mIGNvbHVtbi5kZWZhdWx0VG8gPT09IFwic3RyaW5nXCIgJiYgY29sdW1uLmRlZmF1bHRUby5zdGFydHNXaXRoKGBcImApKSB7XG4gICAgICBjaGFpbnMucHVzaChgZGVmYXVsdFRvKCR7Y29sdW1uLmRlZmF1bHRUb30pYCk7XG4gICAgfSBlbHNlIGlmIChjb2x1bW4udHlwZSA9PT0gXCJqc29uXCIgJiYgdHlwZW9mIGNvbHVtbi5kZWZhdWx0VG8gPT09IFwic3RyaW5nXCIpIHtcbiAgICAgIGNoYWlucy5wdXNoKGBkZWZhdWx0VG8oa25leC5yYXcoXCIke2NvbHVtbi5kZWZhdWx0VG8ucmVwbGFjZUFsbCgnXCInLCBcIidcIil9Ojpqc29uYlwiKSlgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY2hhaW5zLnB1c2goYGRlZmF1bHRUbyhrbmV4LnJhdygnJHtjb2x1bW4uZGVmYXVsdFRvfScpKWApO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBgdGFibGUuJHtjaGFpbnMuam9pbihcIi5cIil9O2A7XG59XG5cbi8qKlxuICogTWlncmF0aW9uQ29sdW1u7J2YIO2DgOyeheydhCBQb3N0Z3JlU1FMIO2DgOyehSDrrLjsnpDsl7TroZwg67OA7ZmYXG4gKi9cbmZ1bmN0aW9uIGdldFBnVHlwZUZvckNvbHVtbihjb2x1bW46IE1pZ3JhdGlvbkNvbHVtbik6IHN0cmluZyB7XG4gIGlmIChjb2x1bW4udHlwZS5lbmRzV2l0aChcIltdXCIpKSB7XG4gICAgY29uc3QgZWxlbWVudFR5cGUgPSBjb2x1bW4udHlwZS5zbGljZSgwLCAtMik7XG4gICAgcmV0dXJuIGdldFBnQXJyYXlUeXBlKGNvbHVtbiwgZWxlbWVudFR5cGUpO1xuICB9XG5cbiAgc3dpdGNoIChjb2x1bW4udHlwZSkge1xuICAgIGNhc2UgXCJzdHJpbmdcIjpcbiAgICAgIHJldHVybiBjb2x1bW4ubGVuZ3RoICE9PSB1bmRlZmluZWQgPyBgdmFyY2hhcigke2NvbHVtbi5sZW5ndGh9KWAgOiBcInRleHRcIjtcbiAgICBjYXNlIFwiYmlnSW50ZWdlclwiOlxuICAgICAgcmV0dXJuIFwiYmlnaW50XCI7XG4gICAgY2FzZSBcIm51bWJlck9yTnVtZXJpY1wiOlxuICAgICAgaWYgKGNvbHVtbi5udW1iZXJUeXBlID09PSBcInJlYWxcIikgcmV0dXJuIFwicmVhbFwiO1xuICAgICAgaWYgKGNvbHVtbi5udW1iZXJUeXBlID09PSBcImRvdWJsZSBwcmVjaXNpb25cIikgcmV0dXJuIFwiZG91YmxlIHByZWNpc2lvblwiO1xuICAgICAgcmV0dXJuIGBudW1lcmljKCR7Y29sdW1uLnByZWNpc2lvbn0sICR7Y29sdW1uLnNjYWxlfSlgO1xuICAgIGNhc2UgXCJkYXRlXCI6XG4gICAgICByZXR1cm4gXCJ0aW1lc3RhbXB0elwiO1xuICAgIGNhc2UgXCJqc29uXCI6XG4gICAgICByZXR1cm4gXCJqc29uYlwiO1xuICAgIGNhc2UgXCJ2ZWN0b3JcIjpcbiAgICAgIHJldHVybiBgdmVjdG9yKCR7Y29sdW1uLmRpbWVuc2lvbnN9KWA7XG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiBjb2x1bW4udHlwZTtcbiAgfVxufVxuXG5mdW5jdGlvbiBnZXRQZ0FycmF5VHlwZShjb2x1bW46IE1pZ3JhdGlvbkNvbHVtbiwgZWxlbWVudFR5cGU6IHN0cmluZyk6IHN0cmluZyB7XG4gIGlmIChlbGVtZW50VHlwZSA9PT0gXCJudW1iZXJPck51bWVyaWNcIikge1xuICAgIGlmIChjb2x1bW4ubnVtYmVyVHlwZSA9PT0gXCJyZWFsXCIpIHJldHVybiBcInJlYWxbXVwiO1xuICAgIGlmIChjb2x1bW4ubnVtYmVyVHlwZSA9PT0gXCJkb3VibGUgcHJlY2lzaW9uXCIpIHJldHVybiBcImRvdWJsZSBwcmVjaXNpb25bXVwiO1xuICAgIHJldHVybiBgbnVtZXJpYygke2NvbHVtbi5wcmVjaXNpb259LCAke2NvbHVtbi5zY2FsZX0pW11gO1xuICB9XG4gIGlmIChlbGVtZW50VHlwZSA9PT0gXCJzdHJpbmdcIikge1xuICAgIHJldHVybiBjb2x1bW4ubGVuZ3RoID8gYHZhcmNoYXIoJHtjb2x1bW4ubGVuZ3RofSlbXWAgOiBcInRleHRbXVwiO1xuICB9XG4gIGlmIChlbGVtZW50VHlwZSA9PT0gXCJkYXRlXCIpIHJldHVybiBcInRpbWVzdGFtcHR6W11cIjtcbiAgaWYgKGVsZW1lbnRUeXBlID09PSBcImludGVnZXJcIikgcmV0dXJuIFwiaW50ZWdlcltdXCI7XG4gIGlmIChlbGVtZW50VHlwZSA9PT0gXCJiaWdJbnRlZ2VyXCIpIHJldHVybiBcImJpZ2ludFtdXCI7XG4gIGlmIChlbGVtZW50VHlwZSA9PT0gXCJib29sZWFuXCIpIHJldHVybiBcImJvb2xlYW5bXVwiO1xuICBpZiAoZWxlbWVudFR5cGUgPT09IFwidXVpZFwiKSByZXR1cm4gXCJ1dWlkW11cIjtcbiAgaWYgKGVsZW1lbnRUeXBlID09PSBcImVudW1cIikgcmV0dXJuIFwidGV4dFtdXCI7XG4gIGlmIChlbGVtZW50VHlwZSA9PT0gXCJ2ZWN0b3JcIikgcmV0dXJuIGB2ZWN0b3IoJHtjb2x1bW4uZGltZW5zaW9uc30pW11gO1xuXG4gIHRocm93IG5ldyBFcnJvcihgVW5rbm93biBhcnJheSBlbGVtZW50IHR5cGU6ICR7ZWxlbWVudFR5cGV9YCk7XG59XG5cbi8qKlxuICog6rCc67OEIOyduOuNseyKpCDsoJXsnZgg7IOd7ISxXG4gKi9cbmZ1bmN0aW9uIGdlbkluZGV4RGVmaW5pdGlvbihpbmRleDogTWlncmF0aW9uSW5kZXgsIHRhYmxlOiBzdHJpbmcpOiBzdHJpbmcge1xuICBpZiAoaW5kZXgudHlwZSA9PT0gXCJobnN3XCIgfHwgaW5kZXgudHlwZSA9PT0gXCJpdmZmbGF0XCIpIHtcbiAgICByZXR1cm4gZ2VuVmVjdG9ySW5kZXhEZWZpbml0aW9uKGluZGV4LCB0YWJsZSk7XG4gIH1cblxuICBpZiAoaW5kZXgudXNpbmcgPT09IFwicGdyb29uZ2FcIikge1xuICAgIHJldHVybiBnZW5QZ3Jvb25nYUluZGV4RGVmaW5pdGlvbihpbmRleCwgdGFibGUpO1xuICB9XG5cbiAgY29uc3QgbWV0aG9kTWFwID0ge1xuICAgIGluZGV4OiBcIklOREVYXCIsXG4gICAgdW5pcXVlOiBcIlVOSVFVRSBJTkRFWFwiLFxuICB9O1xuXG4gIGNvbnN0IG51bGxzTm90RGlzdGluY3RDbGF1c2UgPVxuICAgIGluZGV4LnR5cGUgPT09IFwidW5pcXVlXCIgJiYgaW5kZXgubnVsbHNOb3REaXN0aW5jdCAhPT0gdW5kZWZpbmVkXG4gICAgICA/IGAgTlVMTFMgJHtpbmRleC5udWxsc05vdERpc3RpbmN0ID8gXCJOT1QgRElTVElOQ1RcIiA6IFwiRElTVElOQ1RcIn1gXG4gICAgICA6IFwiXCI7XG5cbiAgY29uc3QgdXNpbmdDbGF1c2UgPSBpbmRleC51c2luZyA9PT0gdW5kZWZpbmVkID8gXCJcIiA6IGBVU0lORyAke2luZGV4LnVzaW5nfWA7XG4gIGNvbnN0IHdoZXJlQ2xhdXNlID0gZ2V0SW5kZXhXaGVyZUNsYXVzZShpbmRleCk7XG5cbiAgcmV0dXJuIGBhd2FpdCBrbmV4LnJhdyhcbiAgXFxgQ1JFQVRFICR7bWV0aG9kTWFwW2luZGV4LnR5cGVdfSAke2luZGV4Lm5hbWV9IE9OICR7dGFibGV9ICR7dXNpbmdDbGF1c2V9KCR7aW5kZXguY29sdW1uc1xuICAgIC5tYXAoKGNvbCkgPT4ge1xuICAgICAgY29uc3Qgb3BjbGFzc0NsYXVzZSA9ICgoKSA9PiB7XG4gICAgICAgIGNvbnN0IG9wY2xhc3MgPSBnZXRJbmRleENvbHVtbk9wY2xhc3MoY29sKTtcbiAgICAgICAgcmV0dXJuIG9wY2xhc3MgPyBgICR7b3BjbGFzc31gIDogXCJcIjtcbiAgICAgIH0pKCk7XG5cbiAgICAgIC8vIOygleugrCDsmLXshZjsnYAgYnRyZWXrp4wg7IKs7JqpIOqwgOuKpVxuICAgICAgaWYgKGluZGV4LnVzaW5nICE9PSBcImJ0cmVlXCIgJiYgaW5kZXgudXNpbmcgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gYCR7Y29sLm5hbWV9JHtvcGNsYXNzQ2xhdXNlfWA7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHNvcnRPcmRlckNsYXVzZSA9IGNvbC5zb3J0T3JkZXIgPT09IHVuZGVmaW5lZCA/IFwiXCIgOiBgICR7Y29sLnNvcnRPcmRlcn1gO1xuICAgICAgY29uc3QgbnVsbHNGaXJzdENsYXVzZSA9XG4gICAgICAgIGNvbC5udWxsc0ZpcnN0ID09PSB1bmRlZmluZWQgPyBcIlwiIDogYCBOVUxMUyAke2NvbC5udWxsc0ZpcnN0ID8gXCJGSVJTVFwiIDogXCJMQVNUXCJ9YDtcbiAgICAgIHJldHVybiBgJHtjb2wubmFtZX0ke29wY2xhc3NDbGF1c2V9JHtzb3J0T3JkZXJDbGF1c2V9JHtudWxsc0ZpcnN0Q2xhdXNlfWA7XG4gICAgfSlcbiAgICAuam9pbihcIiwgXCIpfSkke251bGxzTm90RGlzdGluY3RDbGF1c2V9JHt3aGVyZUNsYXVzZX07XFxgXG4gICk7YDtcbn1cblxuZnVuY3Rpb24gZ2VuUGdyb29uZ2FJbmRleERlZmluaXRpb24oaW5kZXg6IE1pZ3JhdGlvbkluZGV4LCB0YWJsZTogc3RyaW5nKSB7XG4gIGNvbnN0IGVudGl0eSA9IEVudGl0eU1hbmFnZXIuZ2V0QnlUYWJsZSh0YWJsZSk7XG4gIGNvbnN0IHdoZXJlQ2xhdXNlID0gZ2V0SW5kZXhXaGVyZUNsYXVzZShpbmRleCk7XG5cbiAgLy8g67O17ZWpIOyduOuNseyKpOyduCDqsr3smrAgQVJSQVkg7IKs7JqpXG4gIGNvbnN0IGNvbHVtbkNsYXVzZSA9ICgoKSA9PiB7XG4gICAgaWYgKGluZGV4LmNvbHVtbnMubGVuZ3RoID09PSAxKSB7XG4gICAgICBjb25zdCBjb2x1bW4gPSBlbnRpdHkucHJvcHNEaWN0W2luZGV4LmNvbHVtbnNbMF0ubmFtZV07XG4gICAgICBjb25zdCBvcHRpb24gPSBnZXRQZ3Jvb25nYUNvbHVtbk9wdGlvbihjb2x1bW4pO1xuICAgICAgcmV0dXJuIGAke2luZGV4LmNvbHVtbnNbMF0ubmFtZX0ke29wdGlvbiA/IGAgJHtvcHRpb259YCA6IFwiXCJ9YDtcbiAgICB9XG5cbiAgICByZXR1cm4gYChBUlJBWVske2luZGV4LmNvbHVtbnMubWFwKChjb2wpID0+IGAke2NvbC5uYW1lfTo6dGV4dGApLmpvaW4oXCIsXCIpfV0pYDtcbiAgfSkoKTtcblxuICByZXR1cm4gYGF3YWl0IGtuZXgucmF3KFxuICBcXGBDUkVBVEUgSU5ERVggJHtpbmRleC5uYW1lfSBPTiAke3RhYmxlfSBVU0lORyBwZ3Jvb25nYSAoJHtjb2x1bW5DbGF1c2V9KSBXSVRIICh0b2tlbml6ZXI9J1Rva2VuTWVjYWInKSR7d2hlcmVDbGF1c2V9O1xcYFxuICApYDtcbn1cblxuLyoqXG4gKiBQR3Jvb25nYSDsu6zrn7wg7Ji17IWYIOy2lOy2nFxuICpcbiAqIEZ1bGxUZXh0IOyYpO2NvOugiOydtO2EsOulvCDsp4Dsm5DtlZjripQg6rK97JqwIOyasOyEoCDshKTsoJUsIOuCmOuouOyngOuKlCDrlJTtj7Ttirgg7J207JqpXG4gKiBAbGluayBodHRwczovL3Bncm9vbmdhLmdpdGh1Yi5pby9yZWZlcmVuY2VcbiAqL1xuZnVuY3Rpb24gZ2V0UGdyb29uZ2FDb2x1bW5PcHRpb24oY29sdW1uOiBFbnRpdHlQcm9wKSB7XG4gIGlmIChjb2x1bW4udHlwZSA9PT0gXCJzdHJpbmdcIiAmJiBjb2x1bW4ubGVuZ3RoICE9PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gXCJwZ3Jvb25nYV92YXJjaGFyX2Z1bGxfdGV4dF9zZWFyY2hfb3BzX3YyXCI7XG4gIH0gZWxzZSBpZiAoY29sdW1uLnR5cGUgPT09IFwianNvblwiKSB7XG4gICAgcmV0dXJuIFwicGdyb29uZ2FfanNvbmJfZnVsbF90ZXh0X3NlYXJjaF9vcHNfdjJcIjtcbiAgfVxuICByZXR1cm4gbnVsbDtcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb25cbiAqIC0gSE5TVyAoSGllcmFyY2hpY2FsIE5hdmlnYWJsZSBTbWFsbCBXb3JsZCk6IOuKkOumsCDruYzrk5wsIOu5oOuluCDqsoDsg4kg7IaN64+ELCDrhpLsnYAg66mU66qo66asIOuwjyDsoJXtmZXrj4RcbiAqIC0gSVZGRmxhdCAoSW52ZXJ0ZWQgRmlsZSB3aXRoIEZsYXQgQ29tcHJlc3Npb24pOiDruaDrpbgg67mM65OcLCDspJHqsIQg6rKA7IOJIOyGjeuPhCwg64Ku7J2AIOuplOuqqOumrFxuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBITlNXIOyduOuNseyKpCAo6raM7J6lIC0g67mg66W4IOqygOyDiSwg64aS7J2AIOygle2ZleuPhClcbiAqIENSRUFURSBJTkRFWCBpZHhfZW1iZWRkaW5nIE9OIGl0ZW1zIFVTSU5HIGhuc3cgKGVtYmVkZGluZyB2ZWN0b3JfY29zaW5lX29wcykgV0lUSCAobSA9IDE2LCBlZl9jb25zdHJ1Y3Rpb24gPSA2NCk7XG4gKlxuICogLy8gSVZGRmxhdCDsnbjrjbHsiqQgKOuMgOyaqeufiSDrjbDsnbTthLAsIOu5hOyaqSDspJHsmpQg7IucKVxuICogQ1JFQVRFIElOREVYIGlkeF9lbWJlZGRpbmcgT04gaXRlbXMgVVNJTkcgaXZmZmxhdCAoZW1iZWRkaW5nIHZlY3Rvcl9jb3NpbmVfb3BzKSBXSVRIIChsaXN0cyA9IDEwMCk7XG4gKi9cbmZ1bmN0aW9uIGdlblZlY3RvckluZGV4RGVmaW5pdGlvbihpbmRleDogTWlncmF0aW9uSW5kZXgsIHRhYmxlOiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCBjb2x1bW4gPSBpbmRleC5jb2x1bW5zWzBdO1xuICBjb25zdCB2ZWN0b3JPcHMgPSBnZXRJbmRleENvbHVtbk9wY2xhc3MoY29sdW1uKSA/PyBcInZlY3Rvcl9jb3NpbmVfb3BzXCI7XG4gIGNvbnN0IHdoZXJlQ2xhdXNlID0gZ2V0SW5kZXhXaGVyZUNsYXVzZShpbmRleCk7XG5cbiAgLy8gSE5TVyAoSGllcmFyY2hpY2FsIE5hdmlnYWJsZSBTbWFsbCBXb3JsZCkgLSDqtozsnqU6IOu5oOuluCDqsoDsg4ksIOuGkuydgCDsoJXtmZXrj4RcbiAgaWYgKGluZGV4LnR5cGUgPT09IFwiaG5zd1wiKSB7XG4gICAgY29uc3QgbSA9IGluZGV4Lm0gPz8gMTY7XG4gICAgY29uc3QgZWZDb25zdHJ1Y3Rpb24gPSBpbmRleC5lZkNvbnN0cnVjdGlvbiA/PyA2NDtcbiAgICByZXR1cm4gYGF3YWl0IGtuZXgucmF3KFxcYENSRUFURSBJTkRFWCAke2luZGV4Lm5hbWV9IE9OICR7dGFibGV9IFVTSU5HIGhuc3cgKCR7Y29sdW1uLm5hbWV9ICR7dmVjdG9yT3BzfSkgV0lUSCAobSA9ICR7bX0sIGVmX2NvbnN0cnVjdGlvbiA9ICR7ZWZDb25zdHJ1Y3Rpb259KSR7d2hlcmVDbGF1c2V9XFxgKTtgO1xuICB9XG5cbiAgLy8gSVZGRmxhdCAoSW52ZXJ0ZWQgRmlsZSB3aXRoIEZsYXQgQ29tcHJlc3Npb24pIC0g64yA7Jqp65+JLCDruYTsmqkg7KSR7JqUIOyLnFxuICBpZiAoaW5kZXgudHlwZSA9PT0gXCJpdmZmbGF0XCIpIHtcbiAgICBjb25zdCBsaXN0cyA9IGluZGV4Lmxpc3RzID8/IDEwMDtcbiAgICByZXR1cm4gYGF3YWl0IGtuZXgucmF3KFxcYENSRUFURSBJTkRFWCAke2luZGV4Lm5hbWV9IE9OICR7dGFibGV9IFVTSU5HIGl2ZmZsYXQgKCR7Y29sdW1uLm5hbWV9ICR7dmVjdG9yT3BzfSkgV0lUSCAobGlzdHMgPSAke2xpc3RzfSkke3doZXJlQ2xhdXNlfVxcYCk7YDtcbiAgfVxuXG4gIHRocm93IG5ldyBFcnJvcihgVW5rbm93biByYXcgU1FMIGluZGV4IHR5cGU6ICR7aW5kZXgudHlwZX1gKTtcbn1cblxuZnVuY3Rpb24gZ2V0SW5kZXhXaGVyZUNsYXVzZShpbmRleDogTWlncmF0aW9uSW5kZXgpOiBzdHJpbmcge1xuICBjb25zdCB3aGVyZSA9IG5vcm1hbGl6ZUluZGV4V2hlcmVQcmVkaWNhdGUoaW5kZXgud2hlcmUpO1xuICByZXR1cm4gd2hlcmUgPyBgIFdIRVJFICR7d2hlcmV9YCA6IFwiXCI7XG59XG5cbi8qKlxuICog7YWM7J2067iUIOyDneyEse2VmOuKlCDsvIDsnbTsiqQgLSBGSyDsg53shLFcbiAqL1xuYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVDcmVhdGVDb2RlX0ZvcmVpZ24oXG4gIHRhYmxlOiBzdHJpbmcsXG4gIGZvcmVpZ25zOiBNaWdyYXRpb25Gb3JlaWduW10sXG4pOiBQcm9taXNlPEdlbk1pZ3JhdGlvbkNvZGVbXT4ge1xuICBpZiAoZm9yZWlnbnMubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuIFtdO1xuICB9XG5cbiAgY29uc3QgeyB1cCwgZG93biB9ID0gZ2VuRm9yZWlnbkRlZmluaXRpb25zKHRhYmxlLCBmb3JlaWducyk7XG4gIGlmICh1cC5sZW5ndGggPT09IDAgJiYgZG93bi5sZW5ndGggPT09IDApIHtcbiAgICAvLyBmb3JlaWduc+qwgCDsnojripTrjbAg7IOd7ISx65CcIOy9lOuTnOqwgCDsl4bripQg6rK97Jqw64qUIOu5hOygleyDgeyggeyduCDsg4HtmansnbTsp4Drp4wsXG4gICAgLy8g66eI7J206re466CI7J207IWYIOyDneyEseydhCDspJHri6jsi5ztgqTsp4Ag7JWK6rOgIOu5iCDrsLDsl7TsnYQg67CY7ZmY7ZWp64uI64ukLlxuICAgIHJldHVybiBbXTtcbiAgfVxuXG4gIGNvbnN0IGxpbmVzOiBzdHJpbmdbXSA9IFtcbiAgICAnaW1wb3J0IHR5cGUgeyBLbmV4IH0gZnJvbSBcImtuZXhcIjsnLFxuICAgIFwiXCIsXG4gICAgXCJleHBvcnQgYXN5bmMgZnVuY3Rpb24gdXAoa25leDogS25leCk6IFByb21pc2U8dm9pZD4ge1wiLFxuICAgIGByZXR1cm4ga25leC5zY2hlbWEuYWx0ZXJUYWJsZShcIiR7dGFibGV9XCIsICh0YWJsZSkgPT4ge2AsXG4gICAgXCIvLyBjcmVhdGUgZmtcIixcbiAgICAuLi51cCxcbiAgICBcIn0pO1wiLFxuICAgIFwifVwiLFxuICAgIFwiXCIsXG4gICAgXCJleHBvcnQgYXN5bmMgZnVuY3Rpb24gZG93bihrbmV4OiBLbmV4KTogUHJvbWlzZTx2b2lkPiB7XCIsXG4gICAgYHJldHVybiBrbmV4LnNjaGVtYS5hbHRlclRhYmxlKFwiJHt0YWJsZX1cIiwgKHRhYmxlKSA9PiB7YCxcbiAgICBcIi8vIGRyb3AgZmtcIixcbiAgICAuLi5kb3duLFxuICAgIFwifSk7XCIsXG4gICAgXCJ9XCIsXG4gIF07XG5cbiAgY29uc3QgZm9yZWlnbktleXNTdHJpbmcgPSBmb3JlaWducy5tYXAoKGZvcmVpZ24pID0+IGZvcmVpZ24uY29sdW1ucy5qb2luKFwiX1wiKSkuam9pbihcIl9cIik7XG4gIHJldHVybiBbXG4gICAge1xuICAgICAgdGFibGUsXG4gICAgICB0eXBlOiBcImZvcmVpZ25cIixcbiAgICAgIHRpdGxlOiBgZm9yZWlnbl9fJHt0YWJsZX1fXyR7Zm9yZWlnbktleXNTdHJpbmd9YCxcbiAgICAgIGZvcm1hdHRlZDogYXdhaXQgZm9ybWF0Q29kZShsaW5lcy5qb2luKFwiXFxuXCIpLCBgc3JjL21pZ3JhdGlvbi8ke3RhYmxlfS50c2ApLFxuICAgIH0sXG4gIF07XG59XG5cbi8qKlxuICogTWlncmF0aW9uRm9yZWlnbltdIOydveyWtOyEnCDsmbjrtoDtgqQgY29uc3RyYWludCDsoJXsnZjtlZjripQg6rWs66y4IOyDneyEsVxuICovXG5mdW5jdGlvbiBnZW5Gb3JlaWduRGVmaW5pdGlvbnMoXG4gIHRhYmxlOiBzdHJpbmcsXG4gIGZvcmVpZ25zOiBNaWdyYXRpb25Gb3JlaWduW10sXG4pOiB7IHVwOiBzdHJpbmdbXTsgZG93bjogc3RyaW5nW10gfSB7XG4gIHJldHVybiBmb3JlaWducy5yZWR1Y2UoXG4gICAgKHIsIGZvcmVpZ24pID0+IHtcbiAgICAgIGNvbnN0IGNvbHVtbnNTdHJpbmdRdW90ZSA9IGZvcmVpZ24uY29sdW1uc1xuICAgICAgICAubWFwKChjb2wpID0+IGAnJHtjb2wucmVwbGFjZShgJHt0YWJsZX0uYCwgXCJcIil9J2ApXG4gICAgICAgIC5qb2luKFwiLFwiKTtcbiAgICAgIHIudXAucHVzaChcbiAgICAgICAgYHRhYmxlLmZvcmVpZ24oJyR7Zm9yZWlnbi5jb2x1bW5zLmpvaW4oXCIsXCIpfScpXG4gICAgICAgICAgICAucmVmZXJlbmNlcygnJHtmb3JlaWduLnRvfScpXG4gICAgICAgICAgICAub25VcGRhdGUoJyR7Zm9yZWlnbi5vblVwZGF0ZX0nKVxuICAgICAgICAgICAgLm9uRGVsZXRlKCcke2ZvcmVpZ24ub25EZWxldGV9JylgLFxuICAgICAgKTtcbiAgICAgIHIuZG93bi5wdXNoKGB0YWJsZS5kcm9wRm9yZWlnbihbJHtjb2x1bW5zU3RyaW5nUXVvdGV9XSlgKTtcbiAgICAgIHJldHVybiByO1xuICAgIH0sXG4gICAge1xuICAgICAgdXA6IFtdIGFzIHN0cmluZ1tdLFxuICAgICAgZG93bjogW10gYXMgc3RyaW5nW10sXG4gICAgfSxcbiAgKTtcbn1cblxuLyoqXG4gKiDthYzsnbTruJQg67OA6rK9IOy8gOydtOyKpCAtIOy7rOufvC/snbjrjbHsiqQg67OA6rK9XG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlQWx0ZXJDb2RlX0NvbHVtbkFuZEluZGV4ZXMoXG4gIHRhYmxlOiBzdHJpbmcsXG4gIGVudGl0eUNvbHVtbnM6IE1pZ3JhdGlvbkNvbHVtbltdLFxuICBlbnRpdHlJbmRleGVzOiBNaWdyYXRpb25JbmRleFtdLFxuICBkYkNvbHVtbnM6IE1pZ3JhdGlvbkNvbHVtbltdLFxuICBkYkluZGV4ZXM6IE1pZ3JhdGlvbkluZGV4W10sXG4gIGRiRm9yZWlnbnM6IE1pZ3JhdGlvbkZvcmVpZ25bXSxcbiAgY29tcGFyZURCPzogS25leCxcbik6IFByb21pc2U8R2VuTWlncmF0aW9uQ29kZVtdPiB7XG4gIGNvbnN0IHJlc29sdmVkRW50aXR5Q29sdW1ucyA9IHJlc29sdmVTZWFyY2hUZXh0Q29sdW1ucyh0YWJsZSwgZW50aXR5Q29sdW1ucyk7XG4gIGNvbnN0IHNlYXJjaFRleHRDb2x1bW5OYW1lcyA9IGdldFNlYXJjaFRleHRDb2x1bW5OYW1lcyh0YWJsZSk7XG4gIC8qXG4gICAg7IS467aAIOu5hOq1kCDtm4Qg64uk66W47KCQIOywvuyVhOyEnCDsvZTrk5wg7IOd7ISxXG5cbiAgICAxLiDsu6zrn7zqsK/siJgg64uk66aEOiBNROyXkCDsnojsnLzrgpgsIERC7JeQIOyXhuuLpOuptCDstpTqsIBcbiAgICAyLiDsu6zrn7zqsK/siJgg64uk66aEOiBNROyXkCDsl4bsnLzrgpgsIERC7JeQIOyeiOuLpOuptCDsgq3soJxcbiAgICAzLiDqt7jsmbgg7Lus65+8KOy7rOufvCDqsK/siJjqsIAg64+Z7J287ZWY6rGw64KYLCDri6Trpbgg6rK97JqwIOuPmeydvO2VnCDsu6zrn7zrgbzrpqwpID0+IGFsdGVyXG4gICAgNC4g64uk66W46rGwIOuLpCDrj5nsnbztlZjqs6AgaW5kZXjrp4wg67OA6rK965CY64qUIOqyveyasFxuXG4gICAgKiog7Lus65+866qF7J2EIOuzgOqyve2VmOuKlCDqsr3smrDripQg65Sw66GcIO2VuOuTpOunge2VmOyngCDslYrsnYxcbiAgICA9PiBkcm9wL2FkZCDtmJXtg5zsnZgg66eI7J206re466CI7J207IWYIOy9lOuTnOqwgCDsg53shLHrkJjripTrjbAsIOyImOuPmeycvOuhnCByZW5hbWUg7L2U65Oc66GcIOyImOygle2VmOyXrCDsspjrpqxcbiAgKi9cblxuICAvLyBQSyhpZCkg7Lus65+8IO2DgOyehSDrs4Dqsr0g6rCQ7KeAIOuwjyDsspjrpqxcbiAgY29uc3QgZW50aXR5SWRDb2wgPSByZXNvbHZlZEVudGl0eUNvbHVtbnMuZmluZCgoY29sKSA9PiBjb2wubmFtZSA9PT0gXCJpZFwiKTtcbiAgY29uc3QgZGJJZENvbCA9IGRiQ29sdW1ucy5maW5kKChjb2wpID0+IGNvbC5uYW1lID09PSBcImlkXCIpO1xuXG4gIGlmIChlbnRpdHlJZENvbCAmJiBkYklkQ29sICYmIGNvbXBhcmVEQikge1xuICAgIGNvbnN0IGlzUGtUeXBlQ2hhbmdlZCA9XG4gICAgICBlbnRpdHlJZENvbC50eXBlICE9PSBkYklkQ29sLnR5cGUgfHwgZW50aXR5SWRDb2wubGVuZ3RoICE9PSBkYklkQ29sLmxlbmd0aDtcblxuICAgIGlmIChpc1BrVHlwZUNoYW5nZWQpIHtcbiAgICAgIHJldHVybiBnZW5lcmF0ZVBrVHlwZUNoYW5nZU1pZ3JhdGlvbihcbiAgICAgICAgdGFibGUsXG4gICAgICAgIGVudGl0eUlkQ29sLFxuICAgICAgICBkYklkQ29sLFxuICAgICAgICByZXNvbHZlZEVudGl0eUNvbHVtbnMsXG4gICAgICAgIGVudGl0eUluZGV4ZXMsXG4gICAgICAgIGRiQ29sdW1ucyxcbiAgICAgICAgZGJJbmRleGVzLFxuICAgICAgICBkYkZvcmVpZ25zLFxuICAgICAgICBjb21wYXJlREIsXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIC8vIOqwgSDsu6zrn7wg7J2066aEIOq4sOykgOycvOuhnCBhZGQsIGRyb3AsIGFsdGVyIOyXrOu2gCDtmZXsnbhcbiAgY29uc3QgYWx0ZXJDb2x1bW5zVG8gPSBnZXRBbHRlckNvbHVtbnNUbyhyZXNvbHZlZEVudGl0eUNvbHVtbnMsIGRiQ29sdW1ucywgc2VhcmNoVGV4dENvbHVtbk5hbWVzKTtcblxuICAvLyDstpTstpzrkJwg7Lus65+865Ok7J2EIOq4sOykgOycvOuhnCDqsIHqsIEg65287J24IOyDneyEsVxuICBjb25zdCBhbHRlckNvbHVtbkxpbmVzVG8gPSBnZXRBbHRlckNvbHVtbkxpbmVzVG8oXG4gICAgYWx0ZXJDb2x1bW5zVG8sXG4gICAgcmVzb2x2ZWRFbnRpdHlDb2x1bW5zLFxuICAgIHRhYmxlLFxuICAgIGRiRm9yZWlnbnMsXG4gICk7XG5cbiAgLy8g7J24642x7Iqk7J2YIGFkZCwgZHJvcCDsl6zrtoAg7ZmV7J24XG4gIGNvbnN0IGFsdGVySW5kZXhlc1RvID0gZ2V0QWx0ZXJJbmRleGVzVG8oZW50aXR5SW5kZXhlcywgZGJJbmRleGVzKTtcbiAgY29uc3QgcmVjcmVhdGVkU2VhcmNoVGV4dENvbHVtbk5hbWVzID0gbmV3IFNldChcbiAgICBhbHRlckNvbHVtbnNUby5hbHRlclxuICAgICAgLmZpbHRlcigoZGJDb2x1bW4pID0+IHtcbiAgICAgICAgY29uc3QgZW50aXR5Q29sdW1uID0gcmVzb2x2ZWRFbnRpdHlDb2x1bW5zLmZpbmQoKGNvbCkgPT4gY29sLm5hbWUgPT09IGRiQ29sdW1uLm5hbWUpO1xuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgIHNlYXJjaFRleHRDb2x1bW5OYW1lcy5oYXMoZGJDb2x1bW4ubmFtZSkgJiZcbiAgICAgICAgICBkYkNvbHVtbi5nZW5lcmF0ZWQgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgICAgIGVudGl0eUNvbHVtbj8uZ2VuZXJhdGVkICE9PSB1bmRlZmluZWRcbiAgICAgICAgKTtcbiAgICAgIH0pXG4gICAgICAubWFwKChjb2x1bW4pID0+IGNvbHVtbi5uYW1lKSxcbiAgKTtcbiAgY29uc3QgcmVjcmVhdGVkU2VhcmNoVGV4dERiSW5kZXhlcyA9IGRiSW5kZXhlcy5maWx0ZXIoXG4gICAgKGluZGV4KSA9PlxuICAgICAgaW5kZXguY29sdW1ucy5zb21lKCh7IG5hbWUgfSkgPT4gcmVjcmVhdGVkU2VhcmNoVGV4dENvbHVtbk5hbWVzLmhhcyhuYW1lKSkgJiZcbiAgICAgICFhbHRlckluZGV4ZXNUby5kcm9wLnNvbWUoKGRyb3BJbmRleCkgPT4gZHJvcEluZGV4Lm5hbWUgPT09IGluZGV4Lm5hbWUpLFxuICApO1xuICBjb25zdCByZWNyZWF0ZWRTZWFyY2hUZXh0RW50aXR5SW5kZXhlcyA9IGVudGl0eUluZGV4ZXMuZmlsdGVyKFxuICAgIChpbmRleCkgPT5cbiAgICAgIGluZGV4LmNvbHVtbnMuc29tZSgoeyBuYW1lIH0pID0+IHJlY3JlYXRlZFNlYXJjaFRleHRDb2x1bW5OYW1lcy5oYXMobmFtZSkpICYmXG4gICAgICAhYWx0ZXJJbmRleGVzVG8uYWRkLnNvbWUoKGFkZEluZGV4KSA9PiBhZGRJbmRleC5uYW1lID09PSBpbmRleC5uYW1lKSxcbiAgKTtcbiAgY29uc3QgaW1wbGljaXRseURyb3BwZWREYkluZGV4ZXMgPSBhbHRlckluZGV4ZXNUby5kcm9wLmZpbHRlcigoaW5kZXgpID0+XG4gICAgaW5kZXguY29sdW1ucy5ldmVyeSgoeyBuYW1lIH0pID0+IGFsdGVyQ29sdW1uc1RvLmRyb3Auc29tZSgoY29sdW1uKSA9PiBjb2x1bW4ubmFtZSA9PT0gbmFtZSkpLFxuICApO1xuXG4gIC8vIOyduOuNseyKpOqwgCDsgq3soJzrkJjripQg6rK97JqwLCDsu6zrn7zqs7wg6rCZ7J20IOyCreygnOuQnCDsvIDsnbTsiqTsl5DripQgZHJvcOyXkOyEnCDsoJzsmbjtlbTslbztlaghXG4gIGNvbnN0IGluZGV4TmVlZHNUb0Ryb3AgPSBhbHRlckluZGV4ZXNUby5kcm9wLmZpbHRlcihcbiAgICAoaW5kZXgpID0+ICFpbXBsaWNpdGx5RHJvcHBlZERiSW5kZXhlcy5zb21lKChkcm9wcGVkSW5kZXgpID0+IGRyb3BwZWRJbmRleC5uYW1lID09PSBpbmRleC5uYW1lKSxcbiAgKTtcblxuICAvLyDruYgg7L2U65OcIOyDneyEsSDrsKnsp4BcbiAgY29uc3QgaGFzVXBDaGFuZ2VzID1cbiAgICBhbHRlckNvbHVtbkxpbmVzVG8uYWRkLnVwLmJ1aWxkZXIubGVuZ3RoID4gMCB8fFxuICAgIGFsdGVyQ29sdW1uTGluZXNUby5hZGQudXAucmF3Lmxlbmd0aCA+IDAgfHxcbiAgICBhbHRlckNvbHVtbkxpbmVzVG8uZHJvcC51cC5idWlsZGVyLmxlbmd0aCA+IDAgfHxcbiAgICBhbHRlckNvbHVtbkxpbmVzVG8uYWx0ZXIudXAuYnVpbGRlci5sZW5ndGggPiAwIHx8XG4gICAgYWx0ZXJDb2x1bW5MaW5lc1RvLmFsdGVyLnVwLnJhdy5sZW5ndGggPiAwIHx8XG4gICAgYWx0ZXJJbmRleGVzVG8uYWRkLmxlbmd0aCA+IDAgfHxcbiAgICBpbmRleE5lZWRzVG9Ecm9wLmxlbmd0aCA+IDAgfHxcbiAgICByZWNyZWF0ZWRTZWFyY2hUZXh0RGJJbmRleGVzLmxlbmd0aCA+IDA7XG4gIGlmICghaGFzVXBDaGFuZ2VzKSB7XG4gICAgLy8g67OA6rK97IKs7ZWt7J20IOyXhuycvOuptCDruYgg67Cw7Je0IOuwmO2ZmFxuICAgIHJldHVybiBbXTtcbiAgfVxuICBOYWl0ZS50KFwibWlncmF0b3I6Z2VuZXJhdGVBbHRlckNvZGVfQ29sdW1uQW5kSW5kZXhlczpkZWJ1Z1wiLCB7XG4gICAgXCJhbHRlckNvbHVtbnNUby5hZGQubGVuZ3RoXCI6IGFsdGVyQ29sdW1uc1RvLmFkZC5sZW5ndGgsXG4gICAgXCJhbHRlckNvbHVtbnNUby5kcm9wLmxlbmd0aFwiOiBhbHRlckNvbHVtbnNUby5kcm9wLmxlbmd0aCxcbiAgICBcImFsdGVyQ29sdW1uc1RvLmFsdGVyLmxlbmd0aFwiOiBhbHRlckNvbHVtbnNUby5hbHRlci5sZW5ndGgsXG4gICAgXCJhbHRlckluZGV4ZXNUby5hZGQubGVuZ3RoXCI6IGFsdGVySW5kZXhlc1RvLmFkZC5sZW5ndGgsXG4gICAgXCJhbHRlckluZGV4ZXNUby5kcm9wLmxlbmd0aFwiOiBhbHRlckluZGV4ZXNUby5kcm9wLmxlbmd0aCxcbiAgICBcImluZGV4TmVlZHNUb0Ryb3AubGVuZ3RoXCI6IGluZGV4TmVlZHNUb0Ryb3AubGVuZ3RoLFxuICB9KTtcbiAgLy8gTmFpdGUudChcIm1pZ3JhdG9yOmdlbmVyYXRlQWx0ZXJDb2RlX0NvbHVtbkFuZEluZGV4ZXM6YWx0ZXJDb2x1bW5zVG9cIiwgYWx0ZXJDb2x1bW5zVG8pO1xuXG4gIC8vIFRPRE86IOyduOuNseyKpOuqhSDrs4Dqsr3rkJwg6rK97JqwIOyymOumrFxuXG4gIC8vIHRhYmxlIGJ1aWxkZXIg66mU7ISc65Oc66GcIOyLpO2Wie2VoCDsvZTrk5wgKGRyb3Ag4oaSIGFkZCDihpIgYWx0ZXIg7Iic7IScKVxuICBjb25zdCB1cEJ1aWxkZXJMaW5lcyA9IFtcbiAgICAuLi4oYWx0ZXJDb2x1bW5MaW5lc1RvLmRyb3AudXAuYnVpbGRlci5sZW5ndGggPiAwID8gYWx0ZXJDb2x1bW5MaW5lc1RvLmRyb3AudXAuYnVpbGRlciA6IFtdKSxcbiAgICAuLi4oYWx0ZXJDb2x1bW5MaW5lc1RvLmFkZC51cC5idWlsZGVyLmxlbmd0aCA+IDAgPyBhbHRlckNvbHVtbkxpbmVzVG8uYWRkLnVwLmJ1aWxkZXIgOiBbXSksXG4gICAgLi4ucmVjcmVhdGVkU2VhcmNoVGV4dERiSW5kZXhlcy5tYXAoZ2VuSW5kZXhEcm9wRGVmaW5pdGlvbiksXG4gICAgLi4uKGFsdGVyQ29sdW1uTGluZXNUby5hbHRlci51cC5idWlsZGVyLmxlbmd0aCA+IDAgPyBhbHRlckNvbHVtbkxpbmVzVG8uYWx0ZXIudXAuYnVpbGRlciA6IFtdKSxcbiAgICAuLi5pbmRleE5lZWRzVG9Ecm9wLm1hcChnZW5JbmRleERyb3BEZWZpbml0aW9uKSxcbiAgXTtcblxuICAvLyBrbmV4LnJhdygp66GcIOyLpO2Wie2VoCDsvZTrk5xcbiAgY29uc3QgdXBSYXdMaW5lcyA9IFtcbiAgICAuLi4oYWx0ZXJDb2x1bW5MaW5lc1RvLmFkZC51cC5yYXcubGVuZ3RoID4gMCA/IGFsdGVyQ29sdW1uTGluZXNUby5hZGQudXAucmF3IDogW10pLFxuICAgIC4uLihhbHRlckNvbHVtbkxpbmVzVG8uYWx0ZXIudXAucmF3Lmxlbmd0aCA+IDAgPyBhbHRlckNvbHVtbkxpbmVzVG8uYWx0ZXIudXAucmF3IDogW10pLFxuICAgIC4uLnJlY3JlYXRlZFNlYXJjaFRleHRFbnRpdHlJbmRleGVzLm1hcCgoaW5kZXgpID0+IGdlbkluZGV4RGVmaW5pdGlvbihpbmRleCwgdGFibGUpKSxcbiAgICAuLi5hbHRlckluZGV4ZXNUby5hZGQubWFwKChpbmRleCkgPT4gZ2VuSW5kZXhEZWZpbml0aW9uKGluZGV4LCB0YWJsZSkpLFxuICBdO1xuXG4gIC8vIGRvd27snYAgdXDsnZgg7Jet7IicIChhZGQuZG93biA9IGRyb3Agcm9sbGJhY2ssIGRyb3AuZG93biA9IGFkZCByb2xsYmFjaylcbiAgY29uc3QgZG93bkJ1aWxkZXJMaW5lcyA9IFtcbiAgICAuLi4oYWx0ZXJDb2x1bW5MaW5lc1RvLmFkZC5kb3duLmJ1aWxkZXIubGVuZ3RoID4gMCA/IGFsdGVyQ29sdW1uTGluZXNUby5hZGQuZG93bi5idWlsZGVyIDogW10pLFxuICAgIC4uLnJlY3JlYXRlZFNlYXJjaFRleHRFbnRpdHlJbmRleGVzLm1hcChnZW5JbmRleERyb3BEZWZpbml0aW9uKSxcbiAgICAuLi4oYWx0ZXJDb2x1bW5MaW5lc1RvLmFsdGVyLmRvd24uYnVpbGRlci5sZW5ndGggPiAwXG4gICAgICA/IGFsdGVyQ29sdW1uTGluZXNUby5hbHRlci5kb3duLmJ1aWxkZXJcbiAgICAgIDogW10pLFxuICAgIC4uLihhbHRlckNvbHVtbkxpbmVzVG8uZHJvcC5kb3duLmJ1aWxkZXIubGVuZ3RoID4gMFxuICAgICAgPyBhbHRlckNvbHVtbkxpbmVzVG8uZHJvcC5kb3duLmJ1aWxkZXJcbiAgICAgIDogW10pLFxuICAgIC4uLmFsdGVySW5kZXhlc1RvLmFkZFxuICAgICAgLmZpbHRlcihcbiAgICAgICAgKGluZGV4KSA9PlxuICAgICAgICAgICFpbmRleC5jb2x1bW5zLmV2ZXJ5KChpbmRleENvbCkgPT5cbiAgICAgICAgICAgIGFsdGVyQ29sdW1uc1RvLmFkZC5tYXAoKGNvbCkgPT4gY29sLm5hbWUpLmluY2x1ZGVzKGluZGV4Q29sLm5hbWUpLFxuICAgICAgICAgICksXG4gICAgICApXG4gICAgICAubWFwKGdlbkluZGV4RHJvcERlZmluaXRpb24pLFxuICBdO1xuXG4gIGNvbnN0IGRvd25SYXdMaW5lcyA9IFtcbiAgICAuLi4oYWx0ZXJDb2x1bW5MaW5lc1RvLmRyb3AuZG93bi5yYXcubGVuZ3RoID4gMCA/IGFsdGVyQ29sdW1uTGluZXNUby5kcm9wLmRvd24ucmF3IDogW10pLFxuICAgIC4uLihhbHRlckNvbHVtbkxpbmVzVG8uYWx0ZXIuZG93bi5yYXcubGVuZ3RoID4gMCA/IGFsdGVyQ29sdW1uTGluZXNUby5hbHRlci5kb3duLnJhdyA6IFtdKSxcbiAgICAuLi5yZWNyZWF0ZWRTZWFyY2hUZXh0RGJJbmRleGVzLm1hcCgoaW5kZXgpID0+IGdlbkluZGV4RGVmaW5pdGlvbihpbmRleCwgdGFibGUpKSxcbiAgICAuLi5pbXBsaWNpdGx5RHJvcHBlZERiSW5kZXhlcy5tYXAoKGluZGV4KSA9PiBnZW5JbmRleERlZmluaXRpb24oaW5kZXgsIHRhYmxlKSksXG4gICAgLi4uaW5kZXhOZWVkc1RvRHJvcC5tYXAoKGluZGV4KSA9PiBnZW5JbmRleERlZmluaXRpb24oaW5kZXgsIHRhYmxlKSksXG4gIF07XG5cbiAgY29uc3QgbGluZXM6IHN0cmluZ1tdID0gW1xuICAgICdpbXBvcnQgdHlwZSB7IEtuZXggfSBmcm9tIFwia25leFwiOycsXG4gICAgXCJcIixcbiAgICBcImV4cG9ydCBhc3luYyBmdW5jdGlvbiB1cChrbmV4OiBLbmV4KTogUHJvbWlzZTx2b2lkPiB7XCIsXG4gICAgLi4uKHVwQnVpbGRlckxpbmVzLmxlbmd0aCA+IDBcbiAgICAgID8gW2Bhd2FpdCBrbmV4LnNjaGVtYS5hbHRlclRhYmxlKFwiJHt0YWJsZX1cIiwgKHRhYmxlKSA9PiB7YCwgLi4udXBCdWlsZGVyTGluZXMsIFwifSk7XCJdXG4gICAgICA6IFtdKSxcbiAgICAuLi51cFJhd0xpbmVzLFxuICAgIFwifVwiLFxuICAgIFwiXCIsXG4gICAgXCJleHBvcnQgYXN5bmMgZnVuY3Rpb24gZG93bihrbmV4OiBLbmV4KTogUHJvbWlzZTx2b2lkPiB7XCIsXG4gICAgLi4uKGRvd25CdWlsZGVyTGluZXMubGVuZ3RoID4gMFxuICAgICAgPyBbYGF3YWl0IGtuZXguc2NoZW1hLmFsdGVyVGFibGUoXCIke3RhYmxlfVwiLCAodGFibGUpID0+IHtgLCAuLi5kb3duQnVpbGRlckxpbmVzLCBcIn0pO1wiXVxuICAgICAgOiBbXSksXG4gICAgLi4uZG93blJhd0xpbmVzLFxuICAgIFwifVwiLFxuICBdO1xuXG4gIGNvbnN0IGZvcm1hdHRlZCA9IGF3YWl0IGZvcm1hdENvZGUobGluZXMuam9pbihcIlxcblwiKSwgYHNyYy9taWdyYXRpb24vJHt0YWJsZX0udHNgKTtcbiAgY29uc3QgdGl0bGUgPSBbXG4gICAgXCJhbHRlclwiLFxuICAgIHRhYmxlLFxuICAgIC4uLihbXCJhZGRcIiwgXCJkcm9wXCIsIFwiYWx0ZXJcIl0gYXMgY29uc3QpXG4gICAgICAubWFwKChhY3Rpb24pID0+IHtcbiAgICAgICAgY29uc3QgbGVuID0gYWx0ZXJDb2x1bW5zVG9bYWN0aW9uXS5sZW5ndGg7XG4gICAgICAgIGlmIChsZW4gPiAwKSB7XG4gICAgICAgICAgcmV0dXJuIGFjdGlvbiArIGxlbjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH0pXG4gICAgICAuZmlsdGVyKChwYXJ0KSA9PiBwYXJ0ICE9PSBudWxsKSxcbiAgXS5qb2luKFwiX1wiKTtcblxuICByZXR1cm4gW1xuICAgIHtcbiAgICAgIHRhYmxlLFxuICAgICAgdGl0bGUsXG4gICAgICBmb3JtYXR0ZWQsXG4gICAgICB0eXBlOiBcIm5vcm1hbFwiLFxuICAgIH0sXG4gIF07XG59XG5cbi8qKlxuICog7Lus65+8IOu5hOq1kOulvCDsnITtlbQgR2VuZXJhdGVkIENvbHVtbuydmCBleHByZXNzaW9u7J2EIOygnOyZuO2VnCDqsJ3ssrTrpbwg7IOd7ISxXG4gKi9cbmZ1bmN0aW9uIG5vcm1hbGl6ZUNvbHVtbkZvckNvbXBhcmlzb24oXG4gIGNvbDogTWlncmF0aW9uQ29sdW1uLFxuICBzZWFyY2hUZXh0Q29sdW1uTmFtZXM6IFNldDxzdHJpbmc+LFxuKTogTWlncmF0aW9uQ29sdW1uIHtcbiAgaWYgKCFjb2wuZ2VuZXJhdGVkKSB7XG4gICAgcmV0dXJuIGNvbDtcbiAgfVxuXG4gIGlmICghc2VhcmNoVGV4dENvbHVtbk5hbWVzLmhhcyhjb2wubmFtZSkpIHtcbiAgICByZXR1cm4ge1xuICAgICAgLi4uY29sLFxuICAgICAgZ2VuZXJhdGVkOiB1bmRlZmluZWQsXG4gICAgfTtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgLi4uY29sLFxuICAgIGdlbmVyYXRlZDoge1xuICAgICAgLi4uY29sLmdlbmVyYXRlZCxcbiAgICAgIGV4cHJlc3Npb246IGNhbm9uaWNhbGl6ZVNlYXJjaFRleHRHZW5lcmF0ZWRFeHByZXNzaW9uKGNvbC5nZW5lcmF0ZWQuZXhwcmVzc2lvbiksXG4gICAgfSxcbiAgfTtcbn1cblxuLyoqXG4gKiDqsIEg7Lus65+8IOydtOumhCDquLDspIDsnLzroZwgYWRkLCBkcm9wLCBhbHRlciDsl6zrtoAg7ZmV7J24XG4gKi9cbmZ1bmN0aW9uIGdldEFsdGVyQ29sdW1uc1RvKFxuICBlbnRpdHlDb2x1bW5zOiBNaWdyYXRpb25Db2x1bW5bXSxcbiAgZGJDb2x1bW5zOiBNaWdyYXRpb25Db2x1bW5bXSxcbiAgc2VhcmNoVGV4dENvbHVtbk5hbWVzOiBTZXQ8c3RyaW5nPixcbikge1xuICBjb25zdCBjb2x1bW5zVG8gPSB7XG4gICAgYWRkOiBbXSBhcyBNaWdyYXRpb25Db2x1bW5bXSxcbiAgICBkcm9wOiBbXSBhcyBNaWdyYXRpb25Db2x1bW5bXSxcbiAgICBhbHRlcjogW10gYXMgTWlncmF0aW9uQ29sdW1uW10sXG4gIH07XG5cbiAgLy8g7Lus65+866qFIOq4sOykgCDruYTqtZBcbiAgY29uc3QgZXh0cmFDb2x1bW5zID0ge1xuICAgIGRiOiBkaWZmKGRiQ29sdW1ucywgZW50aXR5Q29sdW1ucywgKGNvbCkgPT4gW2NvbC5uYW1lLCBjb2wuZ2VuZXJhdGVkPy50eXBlXS5qb2luKFwiLy8vXCIpKSxcbiAgICBlbnRpdHk6IGRpZmYoZW50aXR5Q29sdW1ucywgZGJDb2x1bW5zLCAoY29sKSA9PiBbY29sLm5hbWUsIGNvbC5nZW5lcmF0ZWQ/LnR5cGVdLmpvaW4oXCIvLy9cIikpLFxuICB9O1xuICBpZiAoZXh0cmFDb2x1bW5zLmVudGl0eS5sZW5ndGggPiAwKSB7XG4gICAgY29sdW1uc1RvLmFkZCA9IGNvbHVtbnNUby5hZGQuY29uY2F0KGV4dHJhQ29sdW1ucy5lbnRpdHkpO1xuICB9XG4gIGlmIChleHRyYUNvbHVtbnMuZGIubGVuZ3RoID4gMCkge1xuICAgIGNvbHVtbnNUby5kcm9wID0gY29sdW1uc1RvLmRyb3AuY29uY2F0KGV4dHJhQ29sdW1ucy5kYik7XG4gIH1cblxuICAvLyDrj5nsnbwg7Lus65+866qF7J2YIOyEuOu2gCDtlYTrk5wg67mE6rWQXG4gIGNvbnN0IHNhbWVEYkNvbHVtbnMgPSBpbnRlcnNlY3Rpb25CeShkYkNvbHVtbnMsIGVudGl0eUNvbHVtbnMsIChjb2wpID0+IGNvbC5uYW1lKTtcbiAgY29uc3Qgc2FtZU1kQ29sdW1ucyA9IGludGVyc2VjdGlvbkJ5KGVudGl0eUNvbHVtbnMsIGRiQ29sdW1ucywgKGNvbCkgPT4gY29sLm5hbWUpO1xuICBjb2x1bW5zVG8uYWx0ZXIgPSBkaWZmZXJlbmNlV2l0aChzYW1lRGJDb2x1bW5zLCBzYW1lTWRDb2x1bW5zLCAoYSwgYikgPT5cbiAgICBlcXVhbChcbiAgICAgIG5vcm1hbGl6ZUNvbHVtbkZvckNvbXBhcmlzb24oYSwgc2VhcmNoVGV4dENvbHVtbk5hbWVzKSxcbiAgICAgIG5vcm1hbGl6ZUNvbHVtbkZvckNvbXBhcmlzb24oYiwgc2VhcmNoVGV4dENvbHVtbk5hbWVzKSxcbiAgICApLFxuICApO1xuXG4gIHJldHVybiBjb2x1bW5zVG87XG59XG5cbi8qKlxuICog7LaU7Lac65CcIOy7rOufvOuTpOydhCDquLDspIDsnLzroZwg6rCB6rCBIOudvOyduCDsg53shLFcbiAqL1xuZnVuY3Rpb24gZ2V0QWx0ZXJDb2x1bW5MaW5lc1RvKFxuICBjb2x1bW5zVG86IFJldHVyblR5cGU8dHlwZW9mIGdldEFsdGVyQ29sdW1uc1RvPixcbiAgZW50aXR5Q29sdW1uczogTWlncmF0aW9uQ29sdW1uW10sXG4gIHRhYmxlOiBzdHJpbmcsXG4gIGRiRm9yZWlnbnM6IE1pZ3JhdGlvbkZvcmVpZ25bXSxcbikge1xuICBjb25zdCBzZWFyY2hUZXh0Q29sdW1uTmFtZXMgPSBnZXRTZWFyY2hUZXh0Q29sdW1uTmFtZXModGFibGUpO1xuICBjb25zdCBsaW5lc1RvID0ge1xuICAgIGFkZDoge1xuICAgICAgdXA6IHsgYnVpbGRlcjogW10gYXMgc3RyaW5nW10sIHJhdzogW10gYXMgc3RyaW5nW10gfSxcbiAgICAgIGRvd246IHsgYnVpbGRlcjogW10gYXMgc3RyaW5nW10sIHJhdzogW10gYXMgc3RyaW5nW10gfSxcbiAgICB9LFxuICAgIGRyb3A6IHtcbiAgICAgIHVwOiB7IGJ1aWxkZXI6IFtdIGFzIHN0cmluZ1tdLCByYXc6IFtdIGFzIHN0cmluZ1tdIH0sXG4gICAgICBkb3duOiB7IGJ1aWxkZXI6IFtdIGFzIHN0cmluZ1tdLCByYXc6IFtdIGFzIHN0cmluZ1tdIH0sXG4gICAgfSxcbiAgICBhbHRlcjoge1xuICAgICAgdXA6IHsgYnVpbGRlcjogW10gYXMgc3RyaW5nW10sIHJhdzogW10gYXMgc3RyaW5nW10gfSxcbiAgICAgIGRvd246IHsgYnVpbGRlcjogW10gYXMgc3RyaW5nW10sIHJhdzogW10gYXMgc3RyaW5nW10gfSxcbiAgICB9LFxuICB9O1xuXG4gIC8vIGFkZCBjb2x1bW5zXG4gIGNvbnN0IGFkZENvbHVtbkRlZnMgPSBnZW5Db2x1bW5EZWZpbml0aW9ucyh0YWJsZSwgY29sdW1uc1RvLmFkZCk7XG4gIGxpbmVzVG8uYWRkLnVwID0ge1xuICAgIGJ1aWxkZXI6IGFkZENvbHVtbkRlZnMuYnVpbGRlci5sZW5ndGggPiAwID8gW1wiLy8gYWRkXCIsIC4uLmFkZENvbHVtbkRlZnMuYnVpbGRlcl0gOiBbXSxcbiAgICByYXc6XG4gICAgICBhZGRDb2x1bW5EZWZzLnJhdy5sZW5ndGggPiAwXG4gICAgICAgID8gW1xuICAgICAgICAgICAgLi4uZ2V0U2VhcmNoVGV4dEhlbHBlckRlZmluaXRpb25zKHRhYmxlLCBjb2x1bW5zVG8uYWRkKSxcbiAgICAgICAgICAgIFwiLy8gYWRkIChnZW5lcmF0ZWQpXCIsXG4gICAgICAgICAgICAuLi5hZGRDb2x1bW5EZWZzLnJhdyxcbiAgICAgICAgICBdXG4gICAgICAgIDogW10sXG4gIH07XG4gIGxpbmVzVG8uYWRkLmRvd24gPSB7XG4gICAgYnVpbGRlcjpcbiAgICAgIGNvbHVtbnNUby5hZGQubGVuZ3RoID4gMFxuICAgICAgICA/IFtcbiAgICAgICAgICAgIFwiLy8gcm9sbGJhY2sgLSBhZGRcIixcbiAgICAgICAgICAgIGB0YWJsZS5kcm9wQ29sdW1ucygke2NvbHVtbnNUby5hZGQubWFwKChjb2wpID0+IGAnJHtjb2wubmFtZX0nYCkuam9pbihcIiwgXCIpfSlgLFxuICAgICAgICAgIF1cbiAgICAgICAgOiBbXSxcbiAgICByYXc6IFtdLFxuICB9O1xuXG4gIC8vIGRyb3DtlaAg7Lus65+87JeQIOqxuOumsCBGSyDssL7quLBcbiAgY29uc3QgZHJvcENvbHVtbk5hbWVzID0gY29sdW1uc1RvLmRyb3AubWFwKChjb2wpID0+IGNvbC5uYW1lKTtcbiAgY29uc3QgZmtUb0Ryb3BCZWZvcmVDb2x1bW4gPSBkYkZvcmVpZ25zLmZpbHRlcigoZmspID0+XG4gICAgZmsuY29sdW1ucy5zb21lKChjb2wpID0+IGRyb3BDb2x1bW5OYW1lcy5pbmNsdWRlcyhjb2wpKSxcbiAgKTtcblxuICBjb25zdCBkcm9wRmtMaW5lcyA9IGZrVG9Ecm9wQmVmb3JlQ29sdW1uLm1hcCgoZmspID0+IHtcbiAgICBjb25zdCBjb2x1bW5zU3RyaW5nUXVvdGUgPSBmay5jb2x1bW5zLm1hcCgoY29sKSA9PiBgJyR7Y29sfSdgKS5qb2luKFwiLFwiKTtcbiAgICByZXR1cm4gYHRhYmxlLmRyb3BGb3JlaWduKFske2NvbHVtbnNTdHJpbmdRdW90ZX1dKWA7XG4gIH0pO1xuXG4gIGNvbnN0IHJlc3RvcmVGa0xpbmVzID0gZ2VuRm9yZWlnbkRlZmluaXRpb25zKHRhYmxlLCBma1RvRHJvcEJlZm9yZUNvbHVtbikudXA7XG5cbiAgLy8gZHJvcOydmCByb2xsYmFja+yLnOyXkOuKlCBnZW5lcmF0ZWQgY29sdW1u64+EIOuzteybkO2VtOyVvCDtlahcbiAgY29uc3QgZHJvcENvbHVtbkRlZnMgPSBnZW5Db2x1bW5EZWZpbml0aW9ucyh0YWJsZSwgY29sdW1uc1RvLmRyb3ApO1xuICBsaW5lc1RvLmRyb3AgPSB7XG4gICAgdXA6IHtcbiAgICAgIGJ1aWxkZXI6IFtcbiAgICAgICAgLi4uKGRyb3BGa0xpbmVzLmxlbmd0aCA+IDBcbiAgICAgICAgICA/IFtcIi8vIGRyb3AgZm9yZWlnbiBrZXlzIG9uIGNvbHVtbnMgdG8gYmUgZHJvcHBlZFwiLCAuLi5kcm9wRmtMaW5lc11cbiAgICAgICAgICA6IFtdKSxcbiAgICAgICAgLi4uKGNvbHVtbnNUby5kcm9wLmxlbmd0aCA+IDBcbiAgICAgICAgICA/IFtcbiAgICAgICAgICAgICAgXCIvLyBkcm9wIGNvbHVtbnNcIixcbiAgICAgICAgICAgICAgYHRhYmxlLmRyb3BDb2x1bW5zKCR7Y29sdW1uc1RvLmRyb3AubWFwKChjb2wpID0+IGAnJHtjb2wubmFtZX0nYCkuam9pbihcIiwgXCIpfSlgLFxuICAgICAgICAgICAgXVxuICAgICAgICAgIDogW10pLFxuICAgICAgXSxcbiAgICAgIHJhdzogW10sXG4gICAgfSxcbiAgICBkb3duOiB7XG4gICAgICBidWlsZGVyOiBbXG4gICAgICAgIC4uLihkcm9wQ29sdW1uRGVmcy5idWlsZGVyLmxlbmd0aCA+IDBcbiAgICAgICAgICA/IFtcIi8vIHJvbGxiYWNrIC0gZHJvcCBjb2x1bW5zXCIsIC4uLmRyb3BDb2x1bW5EZWZzLmJ1aWxkZXJdXG4gICAgICAgICAgOiBbXSksXG4gICAgICAgIC4uLihyZXN0b3JlRmtMaW5lcy5sZW5ndGggPiAwID8gW1wiLy8gcmVzdG9yZSBmb3JlaWduIGtleXNcIiwgLi4ucmVzdG9yZUZrTGluZXNdIDogW10pLFxuICAgICAgXSxcbiAgICAgIHJhdzpcbiAgICAgICAgZHJvcENvbHVtbkRlZnMucmF3Lmxlbmd0aCA+IDBcbiAgICAgICAgICA/IFtcbiAgICAgICAgICAgICAgLi4uZ2V0U2VhcmNoVGV4dEhlbHBlckRlZmluaXRpb25zKHRhYmxlLCBjb2x1bW5zVG8uZHJvcCksXG4gICAgICAgICAgICAgIFwiLy8gcm9sbGJhY2sgLSBkcm9wIGNvbHVtbnMgKGdlbmVyYXRlZClcIixcbiAgICAgICAgICAgICAgLi4uZHJvcENvbHVtbkRlZnMucmF3LFxuICAgICAgICAgICAgXVxuICAgICAgICAgIDogW10sXG4gICAgfSxcbiAgfTtcblxuICAvLyBhbHRlciBjb2x1bW5zIChHZW5lcmF0ZWQgQ29sdW1u7J2AIEFMVEVSIOu2iOqwgO2VmOuvgOuhnCBkcm9wIO2bhCDsnqzsg53shLEpXG4gIGxpbmVzVG8uYWx0ZXIgPSBjb2x1bW5zVG8uYWx0ZXIucmVkdWNlKFxuICAgIChyLCBkYkNvbHVtbikgPT4ge1xuICAgICAgY29uc3QgZW50aXR5Q29sdW1uID0gZW50aXR5Q29sdW1ucy5maW5kKChjb2wpID0+IGNvbC5uYW1lID09PSBkYkNvbHVtbi5uYW1lKTtcbiAgICAgIGlmIChlbnRpdHlDb2x1bW4gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gcjtcbiAgICAgIH1cblxuICAgICAgaWYgKFxuICAgICAgICBzZWFyY2hUZXh0Q29sdW1uTmFtZXMuaGFzKGRiQ29sdW1uLm5hbWUpICYmXG4gICAgICAgIGRiQ29sdW1uLmdlbmVyYXRlZCAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAgIGVudGl0eUNvbHVtbi5nZW5lcmF0ZWQgIT09IHVuZGVmaW5lZFxuICAgICAgKSB7XG4gICAgICAgIHIudXAuYnVpbGRlciA9IFtcbiAgICAgICAgICAuLi5yLnVwLmJ1aWxkZXIsXG4gICAgICAgICAgXCIvLyBhbHRlciBnZW5lcmF0ZWQgY29sdW1uXCIsXG4gICAgICAgICAgYHRhYmxlLmRyb3BDb2x1bW5zKCcke2RiQ29sdW1uLm5hbWV9JylgLFxuICAgICAgICBdO1xuICAgICAgICByLnVwLnJhdyA9IFtcbiAgICAgICAgICAuLi5yLnVwLnJhdyxcbiAgICAgICAgICAuLi5nZXRTZWFyY2hUZXh0SGVscGVyRGVmaW5pdGlvbnModGFibGUsIFtlbnRpdHlDb2x1bW5dKSxcbiAgICAgICAgICBcIi8vIGFsdGVyIGdlbmVyYXRlZCBjb2x1bW5cIixcbiAgICAgICAgICBnZW5HZW5lcmF0ZWRDb2x1bW5EZWZpbml0aW9uKHRhYmxlLCBlbnRpdHlDb2x1bW4pLFxuICAgICAgICBdO1xuICAgICAgICByLmRvd24uYnVpbGRlciA9IFtcbiAgICAgICAgICAuLi5yLmRvd24uYnVpbGRlcixcbiAgICAgICAgICBcIi8vIHJvbGxiYWNrIC0gYWx0ZXIgZ2VuZXJhdGVkIGNvbHVtblwiLFxuICAgICAgICAgIGB0YWJsZS5kcm9wQ29sdW1ucygnJHtkYkNvbHVtbi5uYW1lfScpYCxcbiAgICAgICAgXTtcbiAgICAgICAgci5kb3duLnJhdyA9IFtcbiAgICAgICAgICAuLi5yLmRvd24ucmF3LFxuICAgICAgICAgIC4uLmdldFNlYXJjaFRleHRIZWxwZXJEZWZpbml0aW9ucyh0YWJsZSwgW2RiQ29sdW1uXSksXG4gICAgICAgICAgXCIvLyByb2xsYmFjayAtIGFsdGVyIGdlbmVyYXRlZCBjb2x1bW5cIixcbiAgICAgICAgICBnZW5HZW5lcmF0ZWRDb2x1bW5EZWZpbml0aW9uKHRhYmxlLCBkYkNvbHVtbiksXG4gICAgICAgIF07XG4gICAgICAgIHJldHVybiByO1xuICAgICAgfVxuXG4gICAgICAvLyDsu6zrn7wg67OA6rK97IKs7ZWtXG4gICAgICBjb25zdCBjb2x1bW5EaWZmVXAgPSBkaWZmKFxuICAgICAgICBnZW5Db2x1bW5EZWZpbml0aW9ucyh0YWJsZSwgW2VudGl0eUNvbHVtbl0pLmJ1aWxkZXIsXG4gICAgICAgIGdlbkNvbHVtbkRlZmluaXRpb25zKHRhYmxlLCBbZGJDb2x1bW5dKS5idWlsZGVyLFxuICAgICAgKTtcbiAgICAgIGNvbnN0IGNvbHVtbkRpZmZEb3duID0gZGlmZihcbiAgICAgICAgZ2VuQ29sdW1uRGVmaW5pdGlvbnModGFibGUsIFtkYkNvbHVtbl0pLmJ1aWxkZXIsXG4gICAgICAgIGdlbkNvbHVtbkRlZmluaXRpb25zKHRhYmxlLCBbZW50aXR5Q29sdW1uXSkuYnVpbGRlcixcbiAgICAgICk7XG4gICAgICBpZiAoY29sdW1uRGlmZlVwLmxlbmd0aCA+IDApIHtcbiAgICAgICAgci51cC5idWlsZGVyID0gW1xuICAgICAgICAgIC4uLnIudXAuYnVpbGRlcixcbiAgICAgICAgICBcIi8vIGFsdGVyIGNvbHVtblwiLFxuICAgICAgICAgIC4uLmNvbHVtbkRpZmZVcC5tYXAoKGwpID0+IGAke2wucmVwbGFjZShcIjtcIiwgXCJcIil9LmFsdGVyKCk7YCksXG4gICAgICAgIF07XG4gICAgICAgIHIuZG93bi5idWlsZGVyID0gW1xuICAgICAgICAgIC4uLnIuZG93bi5idWlsZGVyLFxuICAgICAgICAgIFwiLy8gcm9sbGJhY2sgLSBhbHRlciBjb2x1bW5cIixcbiAgICAgICAgICAuLi5jb2x1bW5EaWZmRG93bi5tYXAoKGwpID0+IGAke2wucmVwbGFjZShcIjtcIiwgXCJcIil9LmFsdGVyKCk7YCksXG4gICAgICAgIF07XG4gICAgICB9XG5cbiAgICAgIHJldHVybiByO1xuICAgIH0sXG4gICAge1xuICAgICAgdXA6IHsgYnVpbGRlcjogW10gYXMgc3RyaW5nW10sIHJhdzogW10gYXMgc3RyaW5nW10gfSxcbiAgICAgIGRvd246IHsgYnVpbGRlcjogW10gYXMgc3RyaW5nW10sIHJhdzogW10gYXMgc3RyaW5nW10gfSxcbiAgICB9LFxuICApO1xuXG4gIHJldHVybiBsaW5lc1RvO1xufVxuXG4vKipcbiAqIOyduOuNseyKpOydmCBhZGQsIGRyb3Ag7Jes67aAIO2ZleyduFxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0QWx0ZXJJbmRleGVzVG8oZW50aXR5SW5kZXhlczogTWlncmF0aW9uSW5kZXhbXSwgZGJJbmRleGVzOiBNaWdyYXRpb25JbmRleFtdKSB7XG4gIC8vIOyduOuNseyKpCDruYTqtZBcbiAgY29uc3QgaW5kZXhlc1RvID0ge1xuICAgIGFkZDogW10gYXMgTWlncmF0aW9uSW5kZXhbXSxcbiAgICBkcm9wOiBbXSBhcyBNaWdyYXRpb25JbmRleFtdLFxuICB9O1xuXG4gIC8vIOyduOuNseyKpCDqs6DsnKAg7Iud67OE7J6QIOyDneyEsSAobmFtZeydhCDsoJzsmbjtlZwg66qo65OgIO2VhOuTnOulvCDrrLjsnpDsl7TroZwg67OA7ZmY7ZWY7JesIOyhsO2VqSlcbiAgY29uc3QgaWRlbnRpdHkgPSA8VCBleHRlbmRzIFJlY29yZDxzdHJpbmcsIHVua25vd24+PihpbmRleDogVCk6IHN0cmluZyA9PiB7XG4gICAgY29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKGluZGV4KVxuICAgICAgLmZpbHRlcigoa2V5KSA9PiBrZXkgIT09IFwibmFtZVwiKVxuICAgICAgLnRvU29ydGVkKCk7XG5cbiAgICByZXR1cm4ga2V5c1xuICAgICAgLm1hcCgoa2V5KSA9PiB7XG4gICAgICAgIGlmIChrZXkgPT09IFwibmFtZVwiKSB7XG4gICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoa2V5ID09PSBcImNvbHVtbnNcIikge1xuICAgICAgICAgIHJldHVybiAoaW5kZXhba2V5XSBhcyBNaWdyYXRpb25JbmRleFtcImNvbHVtbnNcIl0pLm1hcCgoY29sKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gT2JqZWN0LmtleXMoY29sKVxuICAgICAgICAgICAgICAudG9Tb3J0ZWQoKVxuICAgICAgICAgICAgICAubWFwKChrKSA9PiBgJHtrfT0ke2NvbFtrIGFzIGtleW9mIHR5cGVvZiBjb2xdfWApXG4gICAgICAgICAgICAgIC5qb2luKFwiLy9cIik7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGAke2tleX09JHtpbmRleFtrZXkgYXMga2V5b2YgTWlncmF0aW9uSW5kZXhdfWA7XG4gICAgICB9KVxuICAgICAgLmpvaW4oXCIvL1wiKTtcbiAgfTtcblxuICBjb25zdCBub3JtYWxpemVkRW50aXR5SW5kZXhlcyA9IGVudGl0eUluZGV4ZXMubWFwKHNldE1pZ3JhdGlvbkluZGV4RGVmYXVsdHMpO1xuICBjb25zdCBub3JtYWxpemVkRGJJbmRleGVzID0gZGJJbmRleGVzLm1hcChzZXRNaWdyYXRpb25JbmRleERlZmF1bHRzKTtcbiAgLy8g67mE6rWQ7JeQ64qUIOygleq3nO2ZlOuQnCBwcmVkaWNhdGXrpbwg7JOw65CYLCDsi6TsoJwgbWlncmF0aW9uIOy2nOugpeydgCDsm5Drs7ggU1FM7J2EIOuztOyhtO2VnOuLpC5cbiAgY29uc3QgY29tcGFyaXNvbkVudGl0eUluZGV4ZXMgPSBlbnRpdHlJbmRleGVzLm1hcChzZXRNaWdyYXRpb25JbmRleENvbXBhcmlzb25EZWZhdWx0cyk7XG4gIGNvbnN0IGNvbXBhcmlzb25EYkluZGV4ZXMgPSBkYkluZGV4ZXMubWFwKHNldE1pZ3JhdGlvbkluZGV4Q29tcGFyaXNvbkRlZmF1bHRzKTtcbiAgY29uc3QgZXh0cmFJbmRleGVzID0ge1xuICAgIGRiOiBkaWZmKGNvbXBhcmlzb25EYkluZGV4ZXMsIGNvbXBhcmlzb25FbnRpdHlJbmRleGVzLCBpZGVudGl0eSksXG4gICAgZW50aXR5OiBkaWZmKGNvbXBhcmlzb25FbnRpdHlJbmRleGVzLCBjb21wYXJpc29uRGJJbmRleGVzLCBpZGVudGl0eSksXG4gIH07XG4gIGlmIChleHRyYUluZGV4ZXMuZW50aXR5Lmxlbmd0aCA+IDApIHtcbiAgICBjb25zdCBhZGRJZGVudGl0aWVzID0gbmV3IFNldChleHRyYUluZGV4ZXMuZW50aXR5Lm1hcChpZGVudGl0eSkpO1xuICAgIGluZGV4ZXNUby5hZGQgPSBpbmRleGVzVG8uYWRkLmNvbmNhdChcbiAgICAgIG5vcm1hbGl6ZWRFbnRpdHlJbmRleGVzLmZpbHRlcigoXywgaW5kZXgpID0+XG4gICAgICAgIGFkZElkZW50aXRpZXMuaGFzKGlkZW50aXR5KGNvbXBhcmlzb25FbnRpdHlJbmRleGVzW2luZGV4XSkpLFxuICAgICAgKSxcbiAgICApO1xuICB9XG4gIGlmIChleHRyYUluZGV4ZXMuZGIubGVuZ3RoID4gMCkge1xuICAgIGNvbnN0IGRyb3BJZGVudGl0aWVzID0gbmV3IFNldChleHRyYUluZGV4ZXMuZGIubWFwKGlkZW50aXR5KSk7XG4gICAgaW5kZXhlc1RvLmRyb3AgPSBpbmRleGVzVG8uZHJvcC5jb25jYXQoXG4gICAgICBub3JtYWxpemVkRGJJbmRleGVzLmZpbHRlcigoXywgaW5kZXgpID0+XG4gICAgICAgIGRyb3BJZGVudGl0aWVzLmhhcyhpZGVudGl0eShjb21wYXJpc29uRGJJbmRleGVzW2luZGV4XSkpLFxuICAgICAgKSxcbiAgICApO1xuICB9XG5cbiAgcmV0dXJuIGluZGV4ZXNUbztcbn1cblxuLyoqXG4gKiDsnbjrjbHsiqQg7IKt7KCcIOygleydmCDsg53shLFcbiAqL1xuZnVuY3Rpb24gZ2VuSW5kZXhEcm9wRGVmaW5pdGlvbihpbmRleDogTWlncmF0aW9uSW5kZXgpIHtcbiAgcmV0dXJuIGB0YWJsZS5kcm9wSW5kZXgoWyR7aW5kZXguY29sdW1uc1xuICAgIC5tYXAoKGNvbHVtbikgPT4gYCcke2NvbHVtbi5uYW1lfSdgKVxuICAgIC5qb2luKFwiLFwiKX1dLCAnJHtpbmRleC5uYW1lfScpYDtcbn1cblxuLyoqXG4gKiBEQiDsobDtmowg6rKw6rO87JmAIOu5hOq1kO2VmOq4sCDsnITtlZwg7J24642x7IqkIOq4sOuzuOqwkiDshKTsoJVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNldE1pZ3JhdGlvbkluZGV4RGVmYXVsdHMoaW5kZXg6IE1pZ3JhdGlvbkluZGV4KTogTWlncmF0aW9uSW5kZXgge1xuICByZXR1cm4gc2V0TWlncmF0aW9uSW5kZXhEZWZhdWx0c0Jhc2UoaW5kZXgsIGZhbHNlKTtcbn1cblxuZnVuY3Rpb24gc2V0TWlncmF0aW9uSW5kZXhDb21wYXJpc29uRGVmYXVsdHMoaW5kZXg6IE1pZ3JhdGlvbkluZGV4KTogTWlncmF0aW9uSW5kZXgge1xuICAvLyBEQiBjYW5vbmljYWwgU1FM6rO8IGVudGl0eSBTUUzsnZgg7ZGc7ZiEIOywqOydtOulvCBkaWZmIGlkZW50aXR57JeQ7ISc66eMIO2doeyImO2VnOuLpC5cbiAgcmV0dXJuIHNldE1pZ3JhdGlvbkluZGV4RGVmYXVsdHNCYXNlKGluZGV4LCB0cnVlKTtcbn1cblxuZnVuY3Rpb24gc2V0TWlncmF0aW9uSW5kZXhEZWZhdWx0c0Jhc2UoXG4gIGluZGV4OiBNaWdyYXRpb25JbmRleCxcbiAgbm9ybWFsaXplV2hlcmVGb3JDb21wYXJpc29uOiBib29sZWFuLFxuKTogTWlncmF0aW9uSW5kZXgge1xuICBjb25zdCBpc1ZlY3RvckluZGV4ID0gaW5kZXgudHlwZSA9PT0gXCJobnN3XCIgfHwgaW5kZXgudHlwZSA9PT0gXCJpdmZmbGF0XCI7XG4gIGNvbnN0IHN1cHBvcnRzT3JkZXJpbmcgPSAhaXNWZWN0b3JJbmRleCAmJiAoIWluZGV4LnVzaW5nIHx8IGluZGV4LnVzaW5nID09PSBcImJ0cmVlXCIpO1xuICBjb25zdCBub3JtYWxpemVkVXNpbmcgPSBpc1ZlY3RvckluZGV4ID8gaW5kZXgudXNpbmcgOiAoaW5kZXgudXNpbmcgPz8gXCJidHJlZVwiKTtcbiAgY29uc3Qgbm9ybWFsaXplZFdoZXJlID0gbm9ybWFsaXplV2hlcmVGb3JDb21wYXJpc29uXG4gICAgPyBub3JtYWxpemVJbmRleFdoZXJlUHJlZGljYXRlRm9yQ29tcGFyaXNvbihpbmRleC53aGVyZSlcbiAgICA6IG5vcm1hbGl6ZUluZGV4V2hlcmVQcmVkaWNhdGUoaW5kZXgud2hlcmUpO1xuXG4gIHJldHVybiB7XG4gICAgLi4uaW5kZXgsXG4gICAgY29sdW1uczogaW5kZXguY29sdW1ucy5tYXAoKGNvbCkgPT4gKHtcbiAgICAgIG5hbWU6IGNvbC5uYW1lLFxuICAgICAgLi4uKGdldEluZGV4Q29sdW1uT3BjbGFzcyhjb2wpID8geyBvcGNsYXNzOiBnZXRJbmRleENvbHVtbk9wY2xhc3MoY29sKSB9IDoge30pLFxuICAgICAgLi4uKHN1cHBvcnRzT3JkZXJpbmdcbiAgICAgICAgPyB7XG4gICAgICAgICAgICBzb3J0T3JkZXI6IGNvbC5zb3J0T3JkZXIgPz8gXCJBU0NcIixcbiAgICAgICAgICAgIG51bGxzRmlyc3Q6IGNvbC5udWxsc0ZpcnN0ID8/IGNvbC5zb3J0T3JkZXIgPT09IFwiREVTQ1wiLFxuICAgICAgICAgIH1cbiAgICAgICAgOiB7fSksXG4gICAgfSkpLFxuICAgIG51bGxzTm90RGlzdGluY3Q6IGluZGV4Lm51bGxzTm90RGlzdGluY3QgPz8gZmFsc2UsXG4gICAgLi4uKG5vcm1hbGl6ZWRVc2luZyA/IHsgdXNpbmc6IG5vcm1hbGl6ZWRVc2luZyB9IDoge30pLFxuICAgIC4uLihub3JtYWxpemVkV2hlcmUgPyB7IHdoZXJlOiBub3JtYWxpemVkV2hlcmUgfSA6IHt9KSxcbiAgfTtcbn1cblxuLyoqXG4gKiDthYzsnbTruJQg67OA6rK9IOy8gOydtOyKpCAtIEZvcmVpZ24gS2V5IOuzgOqyvVxuICovXG5hc3luYyBmdW5jdGlvbiBnZW5lcmF0ZUFsdGVyQ29kZV9Gb3JlaWducyhcbiAgdGFibGU6IHN0cmluZyxcbiAgZW50aXR5Rm9yZWlnbnM6IE1pZ3JhdGlvbkZvcmVpZ25bXSxcbiAgZGJGb3JlaWduczogTWlncmF0aW9uRm9yZWlnbltdLFxuICBkcm9wcGluZ0NvbHVtbnM6IE1pZ3JhdGlvbkNvbHVtbltdID0gW10sXG4pOiBQcm9taXNlPEdlbk1pZ3JhdGlvbkNvZGVbXT4ge1xuICAvLyBjb25zb2xlLmxvZyh7IGVudGl0eUZvcmVpZ25zLCBkYkZvcmVpZ25zIH0pO1xuXG4gIGNvbnN0IGdldEtleSA9IChtZjogTWlncmF0aW9uRm9yZWlnbik6IHN0cmluZyA9PiB7XG4gICAgcmV0dXJuIFttZi5jb2x1bW5zLmpvaW4oXCItXCIpLCBtZi50b10uam9pbihcIi8vL1wiKTtcbiAgfTtcblxuICAvLyDsgq3soJzrkKAg7Lus65+866qFIOuqqeuhnVxuICBjb25zdCBkcm9wcGluZ0NvbHVtbk5hbWVzID0gZHJvcHBpbmdDb2x1bW5zLm1hcCgoY29sKSA9PiBjb2wubmFtZSk7XG5cbiAgY29uc3QgZmtUbyA9IGVudGl0eUZvcmVpZ25zLnJlZHVjZShcbiAgICAocmVzdWx0LCBlbnRpdHlGKSA9PiB7XG4gICAgICBjb25zdCBtYXRjaGluZ0RiRiA9IGRiRm9yZWlnbnMuZmluZCgoZGJGKSA9PiBnZXRLZXkoZW50aXR5RikgPT09IGdldEtleShkYkYpKTtcbiAgICAgIGlmICghbWF0Y2hpbmdEYkYpIHtcbiAgICAgICAgcmVzdWx0LmFkZC5wdXNoKGVudGl0eUYpO1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgfVxuXG4gICAgICBpZiAoIWVxdWFsKGVudGl0eUYsIG1hdGNoaW5nRGJGKSkge1xuICAgICAgICByZXN1bHQuYWx0ZXJTcmMucHVzaChtYXRjaGluZ0RiRik7XG4gICAgICAgIHJlc3VsdC5hbHRlckRzdC5wdXNoKGVudGl0eUYpO1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9LFxuICAgIHtcbiAgICAgIGFkZDogW10gYXMgTWlncmF0aW9uRm9yZWlnbltdLFxuICAgICAgZHJvcDogW10gYXMgTWlncmF0aW9uRm9yZWlnbltdLFxuICAgICAgYWx0ZXJTcmM6IFtdIGFzIE1pZ3JhdGlvbkZvcmVpZ25bXSxcbiAgICAgIGFsdGVyRHN0OiBbXSBhcyBNaWdyYXRpb25Gb3JlaWduW10sXG4gICAgfSxcbiAgKTtcblxuICAvLyBkYkZvcmVpZ25z7JeQ64qUIOyeiOyngOunjCBlbnRpdHlGb3JlaWduc+yXkOuKlCDsl4bripQg6rK97JqwICjsgq3soJzrkJwgRkspXG4gIC8vIOuLqCwg7IKt7KCc65CgIOy7rOufvOydmCBGS+uKlCDsoJzsmbggKGdlbmVyYXRlQWx0ZXJDb2RlX0NvbHVtbkFuZEluZGV4ZXPsl5DshJwg7LKY66asKVxuICBkYkZvcmVpZ25zLmZvckVhY2goKGRiRikgPT4ge1xuICAgIGNvbnN0IG1hdGNoaW5nRW50aXR5RiA9IGVudGl0eUZvcmVpZ25zLmZpbmQoKGVudGl0eUYpID0+IGdldEtleShlbnRpdHlGKSA9PT0gZ2V0S2V5KGRiRikpO1xuICAgIGlmICghbWF0Y2hpbmdFbnRpdHlGKSB7XG4gICAgICAvLyDsnbQgRkvsnZgg7Lus65+87J20IOyCreygnOuQoCDsu6zrn7wg66qp66Gd7JeQIOyeiOuKlOyngCDtmZXsnbhcbiAgICAgIGNvbnN0IGlzQ29sdW1uRHJvcHBpbmcgPSBkYkYuY29sdW1ucy5zb21lKChjb2wpID0+IGRyb3BwaW5nQ29sdW1uTmFtZXMuaW5jbHVkZXMoY29sKSk7XG4gICAgICAvLyDsu6zrn7zsnbQg7IKt7KCc65CY7KeAIOyViuuKlCDqsr3smrDsl5Drp4wgRksgZHJvcCDrqqnroZ3sl5Ag7LaU6rCAXG4gICAgICBpZiAoIWlzQ29sdW1uRHJvcHBpbmcpIHtcbiAgICAgICAgZmtUby5kcm9wLnB1c2goZGJGKTtcbiAgICAgIH1cbiAgICB9XG4gIH0pO1xuXG4gIGNvbnN0IGxpbmVzVG8gPSB7XG4gICAgYWRkOiBnZW5Gb3JlaWduRGVmaW5pdGlvbnModGFibGUsIGZrVG8uYWRkKSxcbiAgICBkcm9wOiBnZW5Gb3JlaWduRGVmaW5pdGlvbnModGFibGUsIGZrVG8uZHJvcCksXG4gICAgYWx0ZXJTcmM6IGdlbkZvcmVpZ25EZWZpbml0aW9ucyh0YWJsZSwgZmtUby5hbHRlclNyYyksXG4gICAgYWx0ZXJEc3Q6IGdlbkZvcmVpZ25EZWZpbml0aW9ucyh0YWJsZSwgZmtUby5hbHRlckRzdCksXG4gIH07XG5cbiAgLy8gZHJvcCBmayBjb2x1bW5z7J24IOqyveyasCjsg53shLHrkKAg7L2U65OcIOyXhuuKlCDqsr3smrApIO2MqOyKpFxuICBjb25zdCBoYXNMaW5lcyA9IE9iamVjdC52YWx1ZXMobGluZXNUbykuc29tZSgobCkgPT4gbC51cC5sZW5ndGggPiAwIHx8IGwuZG93bi5sZW5ndGggPiAwKTtcbiAgaWYgKCFoYXNMaW5lcykge1xuICAgIHJldHVybiBbXTtcbiAgfVxuXG4gIGlmIChcbiAgICBsaW5lc1RvLmFkZC51cC5sZW5ndGggPT09IDAgJiZcbiAgICBsaW5lc1RvLmRyb3AudXAubGVuZ3RoID09PSAwICYmXG4gICAgbGluZXNUby5hbHRlclNyYy51cC5sZW5ndGggPT09IDAgJiZcbiAgICBsaW5lc1RvLmFsdGVyRHN0LnVwLmxlbmd0aCA9PT0gMFxuICApIHtcbiAgICBOYWl0ZS50KFwibWlncmF0b3I6Z2VuZXJhdGVBbHRlckNvZGVfRm9yZWlnbnM6ZmtDaGFuZ2VDb2RlR2VuZXJhdGlvbkVycm9yXCIsIHtcbiAgICAgIHRhYmxlLFxuICAgICAgZW50aXR5Rm9yZWlnbnMsXG4gICAgICBkYkZvcmVpZ25zLFxuICAgIH0pO1xuICAgIHRocm93IG5ldyBFcnJvcihcIkZLIOuzgOqyvSDsvZTrk5wg7IOd7ISxIOyYpOulmFwiKTtcbiAgfVxuXG4gIGNvbnN0IGxpbmVzOiBzdHJpbmdbXSA9IFtcbiAgICAnaW1wb3J0IHR5cGUgeyBLbmV4IH0gZnJvbSBcImtuZXhcIjsnLFxuICAgIFwiXCIsXG4gICAgXCJleHBvcnQgYXN5bmMgZnVuY3Rpb24gdXAoa25leDogS25leCk6IFByb21pc2U8dm9pZD4ge1wiLFxuICAgIGByZXR1cm4ga25leC5zY2hlbWEuYWx0ZXJUYWJsZShcIiR7dGFibGV9XCIsICh0YWJsZSkgPT4ge2AsXG4gICAgLi4ubGluZXNUby5kcm9wLmRvd24sXG4gICAgLi4ubGluZXNUby5hZGQudXAsXG4gICAgLi4ubGluZXNUby5hbHRlclNyYy5kb3duLFxuICAgIC4uLmxpbmVzVG8uYWx0ZXJEc3QudXAsXG4gICAgXCJ9KVwiLFxuICAgIFwifVwiLFxuICAgIFwiXCIsXG4gICAgXCJleHBvcnQgYXN5bmMgZnVuY3Rpb24gZG93bihrbmV4OiBLbmV4KTogUHJvbWlzZTx2b2lkPiB7XCIsXG4gICAgYHJldHVybiBrbmV4LnNjaGVtYS5hbHRlclRhYmxlKFwiJHt0YWJsZX1cIiwgKHRhYmxlKSA9PiB7YCxcbiAgICAuLi5saW5lc1RvLmFkZC5kb3duLFxuICAgIC4uLmxpbmVzVG8uYWx0ZXJEc3QuZG93bixcbiAgICAuLi5saW5lc1RvLmFsdGVyU3JjLnVwLFxuICAgIC4uLmxpbmVzVG8uZHJvcC51cCxcbiAgICBcIn0pXCIsXG4gICAgXCJ9XCIsXG4gIF07XG5cbiAgY29uc3QgZm9ybWF0dGVkID0gYXdhaXQgZm9ybWF0Q29kZShsaW5lcy5qb2luKFwiXFxuXCIpLCBgc3JjL21pZ3JhdGlvbi8ke3RhYmxlfS50c2ApO1xuICBjb25zdCB0aXRsZSA9IFtcImFsdGVyXCIsIHRhYmxlLCBcImZvcmVpZ25zXCJdLmpvaW4oXCJfXCIpO1xuXG4gIHJldHVybiBbXG4gICAge1xuICAgICAgdGFibGUsXG4gICAgICB0aXRsZSxcbiAgICAgIGZvcm1hdHRlZCxcbiAgICAgIHR5cGU6IFwibm9ybWFsXCIsXG4gICAgfSxcbiAgXTtcbn1cblxuLyoqXG4gKiDso7zslrTsp4QgRW50aXR5U2V07J2EIOq4sOuwmOycvOuhnCDthYzsnbTruJQgQ1JFQVRFIOuniOydtOq3uOugiOydtOyFmCDsvZTrk5zrpbwg7IOd7ISx7ZWp64uI64ukLlxuICogQHBhcmFtIGVudGl0eVNldFxuICogQHJldHVybnMgQ1JFQVRFIOuniOydtOq3uOugiOydtOyFmCDsvZTrk5xcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlQ3JlYXRlQ29kZShlbnRpdHlTZXQ6IE1pZ3JhdGlvblNldCk6IFByb21pc2U8R2VuTWlncmF0aW9uQ29kZVtdPiB7XG4gIHJldHVybiBbXG4gICAgYXdhaXQgZ2VuZXJhdGVDcmVhdGVDb2RlX0NvbHVtbkFuZEluZGV4ZXMoXG4gICAgICBlbnRpdHlTZXQudGFibGUsXG4gICAgICBlbnRpdHlTZXQuY29sdW1ucyxcbiAgICAgIGVudGl0eVNldC5pbmRleGVzLFxuICAgICksXG4gICAgLi4uKGF3YWl0IGdlbmVyYXRlQ3JlYXRlQ29kZV9Gb3JlaWduKGVudGl0eVNldC50YWJsZSwgZW50aXR5U2V0LmZvcmVpZ25zKSksXG4gIF07XG59XG5cbi8qKlxuICog7KO87Ja07KeEIGVudGl0eVNldOydhCDrqqntkZzroZwsIGRiU2V07J2EIO2YhCDsg4HtmansnLzroZwg7ZWY7JesIO2FjOydtOu4lCBBTFRFUiDrp4jsnbTqt7jroIjsnbTshZgg7L2U65Oc66W8IOyDneyEse2VqeuLiOuLpC5cbiAqIEBwYXJhbSBlbnRpdHlTZXQg7ZiEIOyDge2ZqeydmCBNaWdyYXRpb25TZXRcbiAqIEBwYXJhbSBkYlNldCDrqqntkZwg7IOB7Zmp7J2YIE1pZ3JhdGlvblNldFxuICogQHBhcmFtIGNvbXBhcmVEQiBQSyDtg4DsnoUg67OA6rK9IOyLnCDsl63ssLjsobAgRkvrpbwg7KGw7ZqM7ZWY6riwIOychO2VnCBLbmV4IOyduOyKpO2EtOyKpCAo7ISg7YOdKVxuICogQHJldHVybnMgQUxURVIg66eI7J206re466CI7J207IWYIOy9lOuTnFxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVBbHRlckNvZGUoXG4gIGVudGl0eVNldDogTWlncmF0aW9uU2V0LFxuICBkYlNldDogTWlncmF0aW9uU2V0LFxuICBjb21wYXJlREI/OiBLbmV4LFxuKTogUHJvbWlzZTxHZW5NaWdyYXRpb25Db2RlW10+IHtcbiAgY29uc3QgcmVwbGFjZUNvbHVtbkRlZmF1bHRUbyA9IChjb2w6IE1pZ3JhdGlvbkNvbHVtbikgPT4ge1xuICAgIC8vIGZsb2F07J24IOqyveyasCDquLDrs7jqsJLsnYQgMOycvOuhnCDsp4DsoJXtlZjripQg6rK97JqwIFwiMC4wMFwi7Jy866GcIOuzgO2ZmOuQmOuKlCDsvIDsnbTsiqQg64yA7J2RXG4gICAgLy8gaWYgKGNvbC50eXBlID09PSBcImZsb2F0XCIgJiYgY29sLmRlZmF1bHRUbyAmJiBTdHJpbmcoY29sLmRlZmF1bHRUbykuaW5jbHVkZXMoJ1wiJykgPT09IGZhbHNlKSB7XG4gICAgLy8gICBjb2wuZGVmYXVsdFRvID0gYFwiJHtOdW1iZXIoY29sLmRlZmF1bHRUbykudG9GaXhlZChjb2wuc2NhbGUgPz8gMil9XCJgO1xuICAgIC8vIH1cbiAgICAvLyAvLyBzdHJpbmfsnbgg6rK97JqwIOq4sOuzuOqwkuydtCDruYgg7Iqk7Yq466eB7J24IOqyveyasCDrjIDsnZFcbiAgICAvLyBpZiAoY29sLnR5cGUgPT09IFwic3RyaW5nXCIgJiYgY29sLmRlZmF1bHRUbyA9PT0gXCJcIikge1xuICAgIC8vICAgY29sLmRlZmF1bHRUbyA9ICdcIlwiJztcbiAgICAvLyB9XG4gICAgLy8gLy8gYm9vbGVhbuyduCDqsr3smrAg6riw67O46rCSIOygleq3nO2ZlCAoTXlTUUzsl5DshJzripQgVElOWUlOVCgxKeuhnCDsoIDsnqXrkJjrr4DroZwgMCDrmJDripQgMeuhnCDsoJXqt5ztmZQpXG4gICAgLy8gLy8gVE9ETzogZGIudHPsl5AgdHlwZUNhc2Ug7ISk7KCVIO2ZleyduO2VmOyXrCDsspjrpqztlZjrj4TroZ0g7IiY7KCVIO2VhOyalFxuICAgIC8vIGlmIChjb2wudHlwZSA9PT0gXCJib29sZWFuXCIgJiYgY29sLmRlZmF1bHRUbyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgLy8gICBpZiAoY29sLmRlZmF1bHRUbyA9PT0gXCIwXCIgfHwgY29sLmRlZmF1bHRUby50b0xvd2VyQ2FzZSgpID09PSBcImZhbHNlXCIpIHtcbiAgICAvLyAgICAgY29sLmRlZmF1bHRUbyA9IFwiMFwiO1xuICAgIC8vICAgfSBlbHNlIGlmIChjb2wuZGVmYXVsdFRvID09PSBcIjFcIiB8fCBjb2wuZGVmYXVsdFRvLnRvTG93ZXJDYXNlKCkgPT09IFwidHJ1ZVwiKSB7XG4gICAgLy8gICAgIGNvbC5kZWZhdWx0VG8gPSBcIjFcIjtcbiAgICAvLyAgIH1cbiAgICAvLyB9XG5cbiAgICAvLyBGSVhNRTog7J2864uoIE15U1FMIOyDge2ZqeyXkOyEnCDrsJzsg53tlojrjZgg7J207IqI7J2YIHdvcmthcm91bmQg7J2066+A66GcIFBn7JeQ7IScIOyerO2ZleyduCDtm4Qg64yA7J2RIOy2lOqwgFxuICAgIHJldHVybiBjb2w7XG4gIH07XG4gIGNvbnN0IGVudGl0eUNvbHVtbnMgPSBhbHBoYWJldGljYWwoZW50aXR5U2V0LmNvbHVtbnMsIChhKSA9PiBhLm5hbWUpLm1hcChyZXBsYWNlQ29sdW1uRGVmYXVsdFRvKTtcbiAgY29uc3QgZGJDb2x1bW5zID0gYWxwaGFiZXRpY2FsKGRiU2V0LmNvbHVtbnMsIChhKSA9PiBhLm5hbWUpLm1hcChyZXBsYWNlQ29sdW1uRGVmYXVsdFRvKTtcblxuICAvKiDrlJTrsoTquYXsmqkg7L2U65OcLCDtirnsoJUg7Lus65+87JeQ7IScIOu2iOydvOy5mCDrsJzsg53tlaAg65WMIO2ZleyduFxuICAgICAgICBjb25zdCBlbnRpdHlDb2x1bW4gPSBlbnRpdHlTZXQuY29sdW1ucy5maW5kKFxuICAgICAgICAgIChjb2wpID0+IGNvbC5uYW1lID09PSBcInByaWNlX2tyd1wiXG4gICAgICAgICk7XG4gICAgICAgIGNvbnN0IGRiQ29sdW1uID0gZGJTZXQuY29sdW1ucy5maW5kKFxuICAgICAgICAgIChjb2wpID0+IGNvbC5uYW1lID09PSBcInByaWNlX2tyd1wiXG4gICAgICAgICk7XG4gICAgICAgIGNvbnNvbGUuZGVidWcoeyBlbnRpdHlDb2x1bW4sIGRiQ29sdW1uIH0pO1xuICAgICAgICAgKi9cblxuICBjb25zdCBlbnRpdHlJbmRleGVzID0gYWxwaGFiZXRpY2FsKGVudGl0eVNldC5pbmRleGVzLCAoYSkgPT5cbiAgICBbYS50eXBlLCAuLi5hLmNvbHVtbnMubWFwKChjKSA9PiBjLm5hbWUpXS5qb2luKFwiLVwiKSxcbiAgKTtcbiAgY29uc3QgZGJJbmRleGVzID0gYWxwaGFiZXRpY2FsKGRiU2V0LmluZGV4ZXMsIChhKSA9PlxuICAgIFthLnR5cGUsIC4uLmEuY29sdW1ucy5tYXAoKGMpID0+IGMubmFtZSldLmpvaW4oXCItXCIpLFxuICApO1xuXG4gIGNvbnN0IHJlcGxhY2VOb0FjdGlvbk9uTXlTUUwgPSAoZjogTWlncmF0aW9uRm9yZWlnbikgPT4ge1xuICAgIC8vIE15U1FM7JeQ7IScIFJFU1RSSUNU7JmAIE5PIEFDVElPTuydgCDrj5nsnbztlahcbiAgICBjb25zdCB7IG9uRGVsZXRlLCBvblVwZGF0ZSB9ID0gZjtcbiAgICByZXR1cm4ge1xuICAgICAgLi4uZixcbiAgICAgIG9uVXBkYXRlOiBvblVwZGF0ZSA9PT0gXCJSRVNUUklDVFwiID8gXCJOTyBBQ1RJT05cIiA6IG9uVXBkYXRlLFxuICAgICAgb25EZWxldGU6IG9uRGVsZXRlID09PSBcIlJFU1RSSUNUXCIgPyBcIk5PIEFDVElPTlwiIDogb25EZWxldGUsXG4gICAgfTtcbiAgfTtcblxuICBjb25zdCBlbnRpdHlGb3JlaWducyA9IGFscGhhYmV0aWNhbChlbnRpdHlTZXQuZm9yZWlnbnMsIChhKSA9PlxuICAgIFthLnRvLCAuLi5hLmNvbHVtbnNdLmpvaW4oXCItXCIpLFxuICApLm1hcCgoZikgPT4gcmVwbGFjZU5vQWN0aW9uT25NeVNRTChmKSk7XG4gIGNvbnN0IGRiRm9yZWlnbnMgPSBhbHBoYWJldGljYWwoZGJTZXQuZm9yZWlnbnMsIChhKSA9PiBbYS50bywgLi4uYS5jb2x1bW5zXS5qb2luKFwiLVwiKSkubWFwKChmKSA9PlxuICAgIHJlcGxhY2VOb0FjdGlvbk9uTXlTUUwoZiksXG4gICk7XG5cbiAgLy8g7IKt7KCc65CgIOy7rOufvCDrqqnroZ0g6rOE7IKwXG4gIGNvbnN0IGRyb3BwaW5nQ29sdW1ucyA9IGRpZmYoZGJDb2x1bW5zLCBlbnRpdHlDb2x1bW5zLCAoY29sKSA9PiBjb2wubmFtZSk7XG5cbiAgY29uc3QgYWx0ZXJDb2RlczogKEdlbk1pZ3JhdGlvbkNvZGUgfCBHZW5NaWdyYXRpb25Db2RlW10gfCBudWxsKVtdID0gW107XG5cbiAgLy8gMS4gY29sdW1uc0FuZEluZGV4ZXMg7LKY66asXG4gIGNvbnN0IHNlYXJjaFRleHRDb2x1bW5OYW1lcyA9IGdldFNlYXJjaFRleHRDb2x1bW5OYW1lcyhlbnRpdHlTZXQudGFibGUpO1xuICBjb25zdCBpc0VxdWFsQ29sdW1ucyA9IGVxdWFsKFxuICAgIGVudGl0eUNvbHVtbnMubWFwKChjb2x1bW4pID0+IG5vcm1hbGl6ZUNvbHVtbkZvckNvbXBhcmlzb24oY29sdW1uLCBzZWFyY2hUZXh0Q29sdW1uTmFtZXMpKSxcbiAgICBkYkNvbHVtbnMubWFwKChjb2x1bW4pID0+IG5vcm1hbGl6ZUNvbHVtbkZvckNvbXBhcmlzb24oY29sdW1uLCBzZWFyY2hUZXh0Q29sdW1uTmFtZXMpKSxcbiAgKTtcbiAgY29uc3QgaXNFcXVhbEluZGV4ZXMgPSBlcXVhbChcbiAgICBlbnRpdHlJbmRleGVzLm1hcChzZXRNaWdyYXRpb25JbmRleERlZmF1bHRzKSxcbiAgICBkYkluZGV4ZXMubWFwKHNldE1pZ3JhdGlvbkluZGV4RGVmYXVsdHMpLFxuICApO1xuICBpZiAoIWlzRXF1YWxDb2x1bW5zIHx8ICFpc0VxdWFsSW5kZXhlcykge1xuICAgIGFsdGVyQ29kZXMucHVzaChcbiAgICAgIGF3YWl0IGdlbmVyYXRlQWx0ZXJDb2RlX0NvbHVtbkFuZEluZGV4ZXMoXG4gICAgICAgIGVudGl0eVNldC50YWJsZSxcbiAgICAgICAgZW50aXR5Q29sdW1ucyxcbiAgICAgICAgZW50aXR5SW5kZXhlcyxcbiAgICAgICAgZGJDb2x1bW5zLFxuICAgICAgICBkYkluZGV4ZXMsXG4gICAgICAgIGRiU2V0LmZvcmVpZ25zLFxuICAgICAgICBjb21wYXJlREIsXG4gICAgICApLFxuICAgICk7XG4gIH1cblxuICAvLyAyLiBmb3JlaWducyDsspjrpqwgKOyCreygnOuQoCDsu6zrn7wg7KCV67O0IOyghOuLrClcbiAgaWYgKCFlcXVhbChlbnRpdHlGb3JlaWducywgZGJGb3JlaWducykpIHtcbiAgICBhbHRlckNvZGVzLnB1c2goXG4gICAgICBhd2FpdCBnZW5lcmF0ZUFsdGVyQ29kZV9Gb3JlaWducyhcbiAgICAgICAgZW50aXR5U2V0LnRhYmxlLFxuICAgICAgICBlbnRpdHlGb3JlaWducyxcbiAgICAgICAgZGJGb3JlaWducyxcbiAgICAgICAgZHJvcHBpbmdDb2x1bW5zLFxuICAgICAgKSxcbiAgICApO1xuICB9XG5cbiAgaWYgKGFsdGVyQ29kZXMuZXZlcnkoKGFsdGVyQ29kZSkgPT4gYWx0ZXJDb2RlID09PSBudWxsKSkge1xuICAgIHJldHVybiBbXTtcbiAgfVxuXG4gIHJldHVybiBhbHRlckNvZGVzLmZpbHRlcigoYWx0ZXJDb2RlKSA9PiBhbHRlckNvZGUgIT09IG51bGwpLmZsYXQoKTtcbn1cblxuLyoqXG4gKiBQSyDtg4DsnoUg67OA6rK9IOyLnCDsl63ssLjsobAgRksg7KCc7JW97KGw6rG07J2EIOyymOumrO2VmOuKlCDrp4jsnbTqt7jroIjsnbTshZgg7L2U65Oc66W8IOyDneyEse2VqeuLiOuLpC5cbiAqXG4gKiBQSyDtg4DsnoUg67OA6rK9IOyLnCDsiJzshJw6XG4gKiAxLiBGSyDsoJzslb3sobDqsbQg7IKt7KCcICjsl63ssLjsobAg7YWM7J2067iU65OkKVxuICogMi4g7J6Q6riwIOywuOyhsCBGSyDsgq3soJwgKOyeiOuKlCDqsr3smrApXG4gKiAzLiBQSyDsoJzslb3sobDqsbQg7IKt7KCcXG4gKiA0LiBQSyDsu6zrn7wg7YOA7J6FIOuzgOqyvVxuICogNS4gRksg7Lus65+8IO2DgOyehSDrs4Dqsr0gKOyXreywuOyhsCDthYzsnbTruJTrk6QpXG4gKiA2LiBQSyDsoJzslb3sobDqsbQg67O16rWsXG4gKiA3LiDsnpDquLAg7LC47KGwIEZLIOuzteq1rFxuICogOC4gRksg7KCc7JW97KGw6rG0IOuzteq1rFxuICovXG5hc3luYyBmdW5jdGlvbiBnZW5lcmF0ZVBrVHlwZUNoYW5nZU1pZ3JhdGlvbihcbiAgdGFibGU6IHN0cmluZyxcbiAgZW50aXR5SWRDb2w6IE1pZ3JhdGlvbkNvbHVtbixcbiAgZGJJZENvbDogTWlncmF0aW9uQ29sdW1uLFxuICBfZW50aXR5Q29sdW1uczogTWlncmF0aW9uQ29sdW1uW10sXG4gIF9lbnRpdHlJbmRleGVzOiBNaWdyYXRpb25JbmRleFtdLFxuICBfZGJDb2x1bW5zOiBNaWdyYXRpb25Db2x1bW5bXSxcbiAgX2RiSW5kZXhlczogTWlncmF0aW9uSW5kZXhbXSxcbiAgX2RiRm9yZWlnbnM6IE1pZ3JhdGlvbkZvcmVpZ25bXSxcbiAgY29tcGFyZURCOiBLbmV4LFxuKTogUHJvbWlzZTxHZW5NaWdyYXRpb25Db2RlW10+IHtcbiAgLy8g7Jet7LC47KGwIEZLIOyhsO2ajCAo7J20IO2FjOydtOu4lOydmCBQS+ulvCDssLjsobDtlZjripQg64uk66W4IO2FjOydtOu4lOydmCBGS+uTpClcbiAgY29uc3QgcmVmZXJlbmNpbmdGS3MgPSBhd2FpdCBQb3N0Z3JlU1FMU2NoZW1hUmVhZGVyLmdldFJlZmVyZW5jaW5nRm9yZWlnbktleXMoY29tcGFyZURCLCB0YWJsZSk7XG5cbiAgLy8g7J6Q6riwIOywuOyhsCBGSyDrtoTrpqwgKOyYiDogRGVwYXJ0bWVudC5wYXJlbnRfaWQg4oaSIERlcGFydG1lbnQuaWQpXG4gIGNvbnN0IHNlbGZSZWZlcmVuY2luZ0ZLcyA9IHJlZmVyZW5jaW5nRktzLmZpbHRlcigoZmspID0+IGZrLnRhYmxlTmFtZSA9PT0gdGFibGUpO1xuICBjb25zdCBleHRlcm5hbFJlZmVyZW5jaW5nRktzID0gcmVmZXJlbmNpbmdGS3MuZmlsdGVyKChmaykgPT4gZmsudGFibGVOYW1lICE9PSB0YWJsZSk7XG5cbiAgLy8gUEsg7KCc7JW97KGw6rG0IOydtOumhCDsobDtmoxcbiAgY29uc3QgcGtDb25zdHJhaW50TmFtZSA9IGAke3RhYmxlfV9wa2V5YDtcblxuICAvLyDsg4ggUEsg7YOA7J6F7JeQIOunnuuKlCBQb3N0Z3JlU1FMIO2DgOyehSDrrLjsnpDsl7RcbiAgY29uc3QgbmV3UGtQZ1R5cGUgPSBnZXRQa1BnVHlwZShlbnRpdHlJZENvbCk7XG4gIGNvbnN0IG9sZFBrUGdUeXBlID0gZ2V0UGtQZ1R5cGUoZGJJZENvbCk7XG5cbiAgLy8gVVAg7L2U65OcIOyDneyEsVxuICBjb25zdCB1cExpbmVzOiBzdHJpbmdbXSA9IFtdO1xuXG4gIC8vIDEuIOyZuOu2gCDthYzsnbTruJTsnZggRksg7KCc7JW97KGw6rG0IOyCreygnFxuICBmb3IgKGNvbnN0IGZrIG9mIGV4dGVybmFsUmVmZXJlbmNpbmdGS3MpIHtcbiAgICB1cExpbmVzLnB1c2goYCAgLy8gJHtmay50YWJsZU5hbWV9LiR7ZmsuY29sdW1uTmFtZX0gRksg7KCc7JW97KGw6rG0IOyCreygnGApO1xuICAgIHVwTGluZXMucHVzaChcbiAgICAgIGAgIGF3YWl0IGtuZXgucmF3KCdBTFRFUiBUQUJMRSBcIiR7ZmsudGFibGVOYW1lfVwiIERST1AgQ09OU1RSQUlOVCBcIiR7ZmsuY29uc3RyYWludE5hbWV9XCInKTtgLFxuICAgICk7XG4gIH1cblxuICAvLyAyLiDsnpDquLAg7LC47KGwIEZLIOyCreygnFxuICBmb3IgKGNvbnN0IGZrIG9mIHNlbGZSZWZlcmVuY2luZ0ZLcykge1xuICAgIHVwTGluZXMucHVzaChgICAvLyDsnpDquLAg7LC47KGwIEZLIOyCreygnDogJHtmay5jb2x1bW5OYW1lfWApO1xuICAgIHVwTGluZXMucHVzaChcbiAgICAgIGAgIGF3YWl0IGtuZXgucmF3KCdBTFRFUiBUQUJMRSBcIiR7dGFibGV9XCIgRFJPUCBDT05TVFJBSU5UIFwiJHtmay5jb25zdHJhaW50TmFtZX1cIicpO2AsXG4gICAgKTtcbiAgfVxuXG4gIC8vIDMuIFBLIOygnOyVveyhsOqxtCDsgq3soJxcbiAgdXBMaW5lcy5wdXNoKGAgIC8vIFBLIOygnOyVveyhsOqxtCDsgq3soJxgKTtcbiAgdXBMaW5lcy5wdXNoKGAgIGF3YWl0IGtuZXgucmF3KCdBTFRFUiBUQUJMRSBcIiR7dGFibGV9XCIgRFJPUCBDT05TVFJBSU5UIFwiJHtwa0NvbnN0cmFpbnROYW1lfVwiJyk7YCk7XG5cbiAgLy8gNC4gUEsg7Lus65+8IO2DgOyehSDrs4Dqsr1cbiAgdXBMaW5lcy5wdXNoKGAgIC8vIFBLIOy7rOufvCDtg4DsnoUg67OA6rK9YCk7XG4gIHVwTGluZXMucHVzaChcbiAgICBgICBhd2FpdCBrbmV4LnJhdygnQUxURVIgVEFCTEUgXCIke3RhYmxlfVwiIEFMVEVSIENPTFVNTiBcImlkXCIgVFlQRSAke25ld1BrUGdUeXBlfSBVU0lORyBcImlkXCI6OiR7bmV3UGtQZ1R5cGV9Jyk7YCxcbiAgKTtcblxuICAvLyA1LiBGSyDsu6zrn7wg7YOA7J6FIOuzgOqyvSAo7Jet7LC47KGwIO2FjOydtOu4lOuTpCkgLSDsnpDquLAg7LC47KGwIO2PrO2VqFxuICBmb3IgKGNvbnN0IGZrIG9mIHJlZmVyZW5jaW5nRktzKSB7XG4gICAgdXBMaW5lcy5wdXNoKGAgIC8vICR7ZmsudGFibGVOYW1lfS4ke2ZrLmNvbHVtbk5hbWV9IOy7rOufvCDtg4DsnoUg67OA6rK9YCk7XG4gICAgdXBMaW5lcy5wdXNoKFxuICAgICAgYCAgYXdhaXQga25leC5yYXcoJ0FMVEVSIFRBQkxFIFwiJHtmay50YWJsZU5hbWV9XCIgQUxURVIgQ09MVU1OIFwiJHtmay5jb2x1bW5OYW1lfVwiIFRZUEUgJHtuZXdQa1BnVHlwZX0gVVNJTkcgXCIke2ZrLmNvbHVtbk5hbWV9XCI6OiR7bmV3UGtQZ1R5cGV9Jyk7YCxcbiAgICApO1xuICB9XG5cbiAgLy8gNi4gUEsg7KCc7JW97KGw6rG0IOuzteq1rFxuICB1cExpbmVzLnB1c2goYCAgLy8gUEsg7KCc7JW97KGw6rG0IOuzteq1rGApO1xuICB1cExpbmVzLnB1c2goXG4gICAgYCAgYXdhaXQga25leC5yYXcoJ0FMVEVSIFRBQkxFIFwiJHt0YWJsZX1cIiBBREQgQ09OU1RSQUlOVCBcIiR7cGtDb25zdHJhaW50TmFtZX1cIiBQUklNQVJZIEtFWSAoXCJpZFwiKScpO2AsXG4gICk7XG5cbiAgLy8gNy4g7J6Q6riwIOywuOyhsCBGSyDrs7XqtaxcbiAgZm9yIChjb25zdCBmayBvZiBzZWxmUmVmZXJlbmNpbmdGS3MpIHtcbiAgICB1cExpbmVzLnB1c2goYCAgLy8g7J6Q6riwIOywuOyhsCBGSyDrs7Xqtaw6ICR7ZmsuY29sdW1uTmFtZX1gKTtcbiAgICB1cExpbmVzLnB1c2goXG4gICAgICBgICBhd2FpdCBrbmV4LnJhdygnQUxURVIgVEFCTEUgXCIke3RhYmxlfVwiIEFERCBDT05TVFJBSU5UIFwiJHtmay5jb25zdHJhaW50TmFtZX1cIiBGT1JFSUdOIEtFWSAoXCIke2ZrLmNvbHVtbk5hbWV9XCIpIFJFRkVSRU5DRVMgXCIke3RhYmxlfVwiKFwiaWRcIikgT04gVVBEQVRFICR7Zmsub25VcGRhdGV9IE9OIERFTEVURSAke2ZrLm9uRGVsZXRlfScpO2AsXG4gICAgKTtcbiAgfVxuXG4gIC8vIDguIOyZuOu2gCDthYzsnbTruJTsnZggRksg7KCc7JW97KGw6rG0IOuzteq1rFxuICBmb3IgKGNvbnN0IGZrIG9mIGV4dGVybmFsUmVmZXJlbmNpbmdGS3MpIHtcbiAgICB1cExpbmVzLnB1c2goYCAgLy8gJHtmay50YWJsZU5hbWV9LiR7ZmsuY29sdW1uTmFtZX0gRksg7KCc7JW97KGw6rG0IOuzteq1rGApO1xuICAgIHVwTGluZXMucHVzaChcbiAgICAgIGAgIGF3YWl0IGtuZXgucmF3KCdBTFRFUiBUQUJMRSBcIiR7ZmsudGFibGVOYW1lfVwiIEFERCBDT05TVFJBSU5UIFwiJHtmay5jb25zdHJhaW50TmFtZX1cIiBGT1JFSUdOIEtFWSAoXCIke2ZrLmNvbHVtbk5hbWV9XCIpIFJFRkVSRU5DRVMgXCIke3RhYmxlfVwiKFwiaWRcIikgT04gVVBEQVRFICR7Zmsub25VcGRhdGV9IE9OIERFTEVURSAke2ZrLm9uRGVsZXRlfScpO2AsXG4gICAgKTtcbiAgfVxuXG4gIC8vIERPV04g7L2U65OcIOyDneyEsSAo7Jet7IicKVxuICBjb25zdCBkb3duTGluZXM6IHN0cmluZ1tdID0gW107XG5cbiAgLy8gMS4g7Jm467aAIO2FjOydtOu4lOydmCBGSyDsoJzslb3sobDqsbQg7IKt7KCcXG4gIGZvciAoY29uc3QgZmsgb2YgZXh0ZXJuYWxSZWZlcmVuY2luZ0ZLcykge1xuICAgIGRvd25MaW5lcy5wdXNoKGAgIC8vICR7ZmsudGFibGVOYW1lfS4ke2ZrLmNvbHVtbk5hbWV9IEZLIOygnOyVveyhsOqxtCDsgq3soJxgKTtcbiAgICBkb3duTGluZXMucHVzaChcbiAgICAgIGAgIGF3YWl0IGtuZXgucmF3KCdBTFRFUiBUQUJMRSBcIiR7ZmsudGFibGVOYW1lfVwiIERST1AgQ09OU1RSQUlOVCBcIiR7ZmsuY29uc3RyYWludE5hbWV9XCInKTtgLFxuICAgICk7XG4gIH1cblxuICAvLyAyLiDsnpDquLAg7LC47KGwIEZLIOyCreygnFxuICBmb3IgKGNvbnN0IGZrIG9mIHNlbGZSZWZlcmVuY2luZ0ZLcykge1xuICAgIGRvd25MaW5lcy5wdXNoKGAgIC8vIOyekOq4sCDssLjsobAgRksg7IKt7KCcOiAke2ZrLmNvbHVtbk5hbWV9YCk7XG4gICAgZG93bkxpbmVzLnB1c2goXG4gICAgICBgICBhd2FpdCBrbmV4LnJhdygnQUxURVIgVEFCTEUgXCIke3RhYmxlfVwiIERST1AgQ09OU1RSQUlOVCBcIiR7ZmsuY29uc3RyYWludE5hbWV9XCInKTtgLFxuICAgICk7XG4gIH1cblxuICAvLyAzLiBQSyDsoJzslb3sobDqsbQg7IKt7KCcXG4gIGRvd25MaW5lcy5wdXNoKGAgIC8vIFBLIOygnOyVveyhsOqxtCDsgq3soJxgKTtcbiAgZG93bkxpbmVzLnB1c2goXG4gICAgYCAgYXdhaXQga25leC5yYXcoJ0FMVEVSIFRBQkxFIFwiJHt0YWJsZX1cIiBEUk9QIENPTlNUUkFJTlQgXCIke3BrQ29uc3RyYWludE5hbWV9XCInKTtgLFxuICApO1xuXG4gIC8vIDQuIFBLIOy7rOufvCDtg4DsnoUg7JuQ67O1XG4gIGRvd25MaW5lcy5wdXNoKGAgIC8vIFBLIOy7rOufvCDtg4DsnoUg7JuQ67O1YCk7XG4gIGRvd25MaW5lcy5wdXNoKFxuICAgIGAgIGF3YWl0IGtuZXgucmF3KCdBTFRFUiBUQUJMRSBcIiR7dGFibGV9XCIgQUxURVIgQ09MVU1OIFwiaWRcIiBUWVBFICR7b2xkUGtQZ1R5cGV9IFVTSU5HIFwiaWRcIjo6JHtvbGRQa1BnVHlwZX0nKTtgLFxuICApO1xuXG4gIC8vIDUuIEZLIOy7rOufvCDtg4DsnoUg7JuQ67O1ICjsl63ssLjsobAg7YWM7J2067iU65OkKVxuICBmb3IgKGNvbnN0IGZrIG9mIHJlZmVyZW5jaW5nRktzKSB7XG4gICAgZG93bkxpbmVzLnB1c2goYCAgLy8gJHtmay50YWJsZU5hbWV9LiR7ZmsuY29sdW1uTmFtZX0g7Lus65+8IO2DgOyehSDsm5Drs7VgKTtcbiAgICBkb3duTGluZXMucHVzaChcbiAgICAgIGAgIGF3YWl0IGtuZXgucmF3KCdBTFRFUiBUQUJMRSBcIiR7ZmsudGFibGVOYW1lfVwiIEFMVEVSIENPTFVNTiBcIiR7ZmsuY29sdW1uTmFtZX1cIiBUWVBFICR7b2xkUGtQZ1R5cGV9IFVTSU5HIFwiJHtmay5jb2x1bW5OYW1lfVwiOjoke29sZFBrUGdUeXBlfScpO2AsXG4gICAgKTtcbiAgfVxuXG4gIC8vIDYuIFBLIOygnOyVveyhsOqxtCDrs7XqtaxcbiAgZG93bkxpbmVzLnB1c2goYCAgLy8gUEsg7KCc7JW97KGw6rG0IOuzteq1rGApO1xuICBkb3duTGluZXMucHVzaChcbiAgICBgICBhd2FpdCBrbmV4LnJhdygnQUxURVIgVEFCTEUgXCIke3RhYmxlfVwiIEFERCBDT05TVFJBSU5UIFwiJHtwa0NvbnN0cmFpbnROYW1lfVwiIFBSSU1BUlkgS0VZIChcImlkXCIpJyk7YCxcbiAgKTtcblxuICAvLyA3LiDsnpDquLAg7LC47KGwIEZLIOuzteq1rFxuICBmb3IgKGNvbnN0IGZrIG9mIHNlbGZSZWZlcmVuY2luZ0ZLcykge1xuICAgIGRvd25MaW5lcy5wdXNoKGAgIC8vIOyekOq4sCDssLjsobAgRksg67O16rWsOiAke2ZrLmNvbHVtbk5hbWV9YCk7XG4gICAgZG93bkxpbmVzLnB1c2goXG4gICAgICBgICBhd2FpdCBrbmV4LnJhdygnQUxURVIgVEFCTEUgXCIke3RhYmxlfVwiIEFERCBDT05TVFJBSU5UIFwiJHtmay5jb25zdHJhaW50TmFtZX1cIiBGT1JFSUdOIEtFWSAoXCIke2ZrLmNvbHVtbk5hbWV9XCIpIFJFRkVSRU5DRVMgXCIke3RhYmxlfVwiKFwiaWRcIikgT04gVVBEQVRFICR7Zmsub25VcGRhdGV9IE9OIERFTEVURSAke2ZrLm9uRGVsZXRlfScpO2AsXG4gICAgKTtcbiAgfVxuXG4gIC8vIDguIOyZuOu2gCDthYzsnbTruJTsnZggRksg7KCc7JW97KGw6rG0IOuzteq1rFxuICBmb3IgKGNvbnN0IGZrIG9mIGV4dGVybmFsUmVmZXJlbmNpbmdGS3MpIHtcbiAgICBkb3duTGluZXMucHVzaChgICAvLyAke2ZrLnRhYmxlTmFtZX0uJHtmay5jb2x1bW5OYW1lfSBGSyDsoJzslb3sobDqsbQg67O16rWsYCk7XG4gICAgZG93bkxpbmVzLnB1c2goXG4gICAgICBgICBhd2FpdCBrbmV4LnJhdygnQUxURVIgVEFCTEUgXCIke2ZrLnRhYmxlTmFtZX1cIiBBREQgQ09OU1RSQUlOVCBcIiR7ZmsuY29uc3RyYWludE5hbWV9XCIgRk9SRUlHTiBLRVkgKFwiJHtmay5jb2x1bW5OYW1lfVwiKSBSRUZFUkVOQ0VTIFwiJHt0YWJsZX1cIihcImlkXCIpIE9OIFVQREFURSAke2ZrLm9uVXBkYXRlfSBPTiBERUxFVEUgJHtmay5vbkRlbGV0ZX0nKTtgLFxuICAgICk7XG4gIH1cblxuICBjb25zdCBsaW5lczogc3RyaW5nW10gPSBbXG4gICAgJ2ltcG9ydCB0eXBlIHsgS25leCB9IGZyb20gXCJrbmV4XCI7JyxcbiAgICBcIlwiLFxuICAgIFwiZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHVwKGtuZXg6IEtuZXgpOiBQcm9taXNlPHZvaWQ+IHtcIixcbiAgICAuLi51cExpbmVzLFxuICAgIFwifVwiLFxuICAgIFwiXCIsXG4gICAgXCJleHBvcnQgYXN5bmMgZnVuY3Rpb24gZG93bihrbmV4OiBLbmV4KTogUHJvbWlzZTx2b2lkPiB7XCIsXG4gICAgLi4uZG93bkxpbmVzLFxuICAgIFwifVwiLFxuICBdO1xuXG4gIGNvbnN0IGZvcm1hdHRlZCA9IGF3YWl0IGZvcm1hdENvZGUobGluZXMuam9pbihcIlxcblwiKSwgYHNyYy9taWdyYXRpb24vJHt0YWJsZX0udHNgKTtcblxuICByZXR1cm4gW1xuICAgIHtcbiAgICAgIHRhYmxlLFxuICAgICAgdGl0bGU6IGBhbHRlcl8ke3RhYmxlfV9wa190eXBlYCxcbiAgICAgIGZvcm1hdHRlZCxcbiAgICAgIHR5cGU6IFwibm9ybWFsXCIsXG4gICAgfSxcbiAgXTtcbn1cblxuLyoqXG4gKiBQSyDsu6zrn7zsnZggUG9zdGdyZVNRTCDtg4DsnoUg66y47J6Q7Je07J2EIOuwmO2ZmO2VqeuLiOuLpC5cbiAqL1xuZnVuY3Rpb24gZ2V0UGtQZ1R5cGUoY29sOiBNaWdyYXRpb25Db2x1bW4pOiBzdHJpbmcge1xuICBpZiAoY29sLnR5cGUgPT09IFwic3RyaW5nXCIpIHtcbiAgICByZXR1cm4gY29sLmxlbmd0aCAhPT0gdW5kZWZpbmVkID8gYHZhcmNoYXIoJHtjb2wubGVuZ3RofSlgIDogXCJ0ZXh0XCI7XG4gIH1cbiAgaWYgKGNvbC50eXBlID09PSBcInV1aWRcIikge1xuICAgIHJldHVybiBcInV1aWRcIjtcbiAgfVxuICAvLyBpbnRlZ2Vy7J2YIOqyveyasCBzZXJpYWwvaW50ZWdlciDqtazrtoTsnbQg7ZWE7JqU7ZWY7KeA66eMLFxuICAvLyDtg4DsnoUg67OA6rK9IOyLnOyXkOuKlCBpbnRlZ2Vy66GcIOyymOumrO2VqeuLiOuLpC5cbiAgcmV0dXJuIFwiaW50ZWdlclwiO1xufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7OztBQStSQSxTQUFTLHNCQUFzQixRQUErRDtDQUM1RixPQUFPLE9BQU8sV0FBVyxPQUFPO0FBQ2xDO0FBRUEsU0FBUyw2QkFBNkIsWUFBaUQ7Q0FDckYsTUFBTSxTQUFzQyxDQUFDO0NBQzdDLElBQUksUUFBUTtDQUVaLE9BQU8sUUFBUSxXQUFXLFFBQVE7RUFDaEMsTUFBTSxPQUFPLFdBQVc7RUFFeEIsSUFBSSxTQUFTLFFBQ1g7RUFHRixJQUFJLEtBQUssS0FBSyxJQUFJLEdBQUc7R0FDbkIsU0FBUztHQUNUO0VBQ0Y7RUFFQSxJQUFJLFdBQVcsV0FBVyxNQUFNLEtBQUssR0FBRztHQUN0QyxPQUFPLEtBQUs7SUFBRSxNQUFNO0lBQVksT0FBTztHQUFLLENBQUM7R0FDN0MsU0FBUztHQUNUO0VBQ0Y7RUFFQSxJQUFJLFdBQVcsV0FBVyxNQUFNLEtBQUssR0FBRztHQUN0QyxPQUFPLEtBQUs7SUFBRSxNQUFNO0lBQVksT0FBTztHQUFLLENBQUM7R0FDN0MsU0FBUztHQUNUO0VBQ0Y7RUFFQSxJQUFJLFNBQVMsT0FBTyxTQUFTLE9BQU8sU0FBUyxLQUFLO0dBQ2hELE9BQU8sS0FBSztJQUFFLE1BQU07SUFBVSxPQUFPO0dBQUssQ0FBQztHQUMzQyxT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
|
|
1325
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29kZS1nZW5lcmF0aW9uLmpzIiwibmFtZXMiOltdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9taWdyYXRpb24vY29kZS1nZW5lcmF0aW9uLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBlcXVhbCBmcm9tIFwiZmFzdC1kZWVwLWVxdWFsXCI7XG5pbXBvcnQgeyB0eXBlIEtuZXggfSBmcm9tIFwia25leFwiO1xuaW1wb3J0IHsgYWxwaGFiZXRpY2FsLCBkaWZmIH0gZnJvbSBcInJhZGFzaGlcIjtcblxuaW1wb3J0IHsgRW50aXR5TWFuYWdlciB9IGZyb20gXCIuLi9lbnRpdHkvZW50aXR5LW1hbmFnZXJcIjtcbmltcG9ydCB7IE5haXRlIH0gZnJvbSBcIi4uL25haXRlL25haXRlXCI7XG5pbXBvcnQge1xuICB0eXBlIEVudGl0eVByb3AsXG4gIHR5cGUgR2VuTWlncmF0aW9uQ29kZSxcbiAgdHlwZSBNaWdyYXRpb25Db2x1bW4sXG4gIHR5cGUgTWlncmF0aW9uRm9yZWlnbixcbiAgdHlwZSBNaWdyYXRpb25JbmRleCxcbiAgdHlwZSBNaWdyYXRpb25TZXQsXG59IGZyb20gXCIuLi90eXBlcy90eXBlc1wiO1xuaW1wb3J0IHsgaXNTZWFyY2hUZXh0UHJvcCB9IGZyb20gXCIuLi90eXBlcy90eXBlc1wiO1xuaW1wb3J0IHsgZm9ybWF0Q29kZSB9IGZyb20gXCIuLi91dGlscy9mb3JtYXR0ZXJcIjtcbmltcG9ydCB7IGlzU3RyaW5nVmFsdWUgfSBmcm9tIFwiLi4vdXRpbHMvcnVudGltZS12YWx1ZVwiO1xuaW1wb3J0IHsgZGlmZmVyZW5jZVdpdGgsIGludGVyc2VjdGlvbkJ5IH0gZnJvbSBcIi4uL3V0aWxzL3V0aWxzXCI7XG5pbXBvcnQge1xuICBub3JtYWxpemVJbmRleFdoZXJlUHJlZGljYXRlLFxuICBub3JtYWxpemVJbmRleFdoZXJlUHJlZGljYXRlRm9yQ29tcGFyaXNvbixcbn0gZnJvbSBcIi4vaW5kZXgtd2hlcmUtcHJlZGljYXRlXCI7XG5pbXBvcnQgeyBQb3N0Z3JlU1FMU2NoZW1hUmVhZGVyIH0gZnJvbSBcIi4vcG9zdGdyZXNxbC1zY2hlbWEtcmVhZGVyXCI7XG5cbi8qKlxuICog7Lus65+8IOygleydmCDqsrDqs7wg7YOA7J6FXG4gKiAtIGJ1aWxkZXI6IEtuZXggdGFibGUgYnVpbGRlciDrqZTshJzrk5zroZwg7Iuk7ZaJ7ZWgIOq1rOusuCAodGFibGUueHh4KCkpXG4gKiAtIHJhdzoga25leC5yYXcoKeuhnCDsi6TtlontlaAg6rWs66y4XG4gKi9cbnR5cGUgQ29sdW1uRGVmaW5pdGlvblJlc3VsdCA9IHtcbiAgYnVpbGRlcjogc3RyaW5nW107XG4gIHJhdzogc3RyaW5nW107XG59O1xuXG50eXBlIFNlYXJjaFRleHRIZWxwZXJLaW5kID0gXCJ0ZXh0LWFycmF5XCIgfCBcImpzb25iLWFycmF5XCI7XG5cbnR5cGUgU2VhcmNoVGV4dEV4cHJlc3Npb25Ub2tlbiA9XG4gIHwgeyB0eXBlOiBcImlkZW50aWZpZXJcIjsgdmFsdWU6IHN0cmluZyB9XG4gIHwgeyB0eXBlOiBcInF1b3RlZElkZW50aWZpZXJcIjsgdmFsdWU6IHN0cmluZyB9XG4gIHwgeyB0eXBlOiBcInN0cmluZ1wiOyB2YWx1ZTogc3RyaW5nIH1cbiAgfCB7IHR5cGU6IFwic3ltYm9sXCI7IHZhbHVlOiBcIihcIiB8IFwiKVwiIHwgXCIsXCIgfVxuICB8IHsgdHlwZTogXCJvcGVyYXRvclwiOyB2YWx1ZTogXCJ8fFwiIHwgXCI6OlwiIH07XG5cbnR5cGUgU2VhcmNoVGV4dEV4cHJlc3Npb25Ob2RlID1cbiAgfCB7IHR5cGU6IFwiaWRlbnRpZmllclwiOyBuYW1lOiBzdHJpbmc7IHF1b3RlZDogYm9vbGVhbiB9XG4gIHwgeyB0eXBlOiBcInN0cmluZ1wiOyB2YWx1ZTogc3RyaW5nIH1cbiAgfCB7IHR5cGU6IFwiYm9vbGVhblwiOyB2YWx1ZTogYm9vbGVhbiB9XG4gIHwgeyB0eXBlOiBcImZ1bmN0aW9uXCI7IG5hbWU6IHN0cmluZzsgYXJnczogU2VhcmNoVGV4dEV4cHJlc3Npb25Ob2RlW10gfVxuICB8IHsgdHlwZTogXCJjb25jYXRcIjsgcGFydHM6IFNlYXJjaFRleHRFeHByZXNzaW9uTm9kZVtdIH1cbiAgfCB7IHR5cGU6IFwiY29sbGF0ZVwiOyBleHByOiBTZWFyY2hUZXh0RXhwcmVzc2lvbk5vZGU7IGNvbGxhdGlvbjogc3RyaW5nOyBxdW90ZWQ6IGJvb2xlYW4gfVxuICB8IHsgdHlwZTogXCJjYXN0XCI7IGV4cHI6IFNlYXJjaFRleHRFeHByZXNzaW9uTm9kZTsgdGFyZ2V0VHlwZTogc3RyaW5nIH07XG5cbmNvbnN0IFNFQVJDSF9URVhUX0hFTFBFUl9ERUZJTklUSU9OUyA9IHtcbiAgXCJ0ZXh0LWFycmF5XCI6IGBhd2FpdCBrbmV4LnJhdyhcXGBDUkVBVEUgT1IgUkVQTEFDRSBGVU5DVElPTiBzb25hbXVfdGV4dF9hcnJheV9hZ2coYXJyIHRleHRbXSwgY2kgYm9vbGVhbiBERUZBVUxUIHRydWUpXG5SRVRVUk5TIHRleHRcbkxBTkdVQUdFIHNxbCBJTU1VVEFCTEUgUEFSQUxMRUwgU0FGRSBSRVRVUk5TIE5VTEwgT04gTlVMTCBJTlBVVFxuQVMgJCRcbiAgU0VMRUNUIHN0cmluZ19hZ2coXG4gICAgQ0FTRSBXSEVOIGNpIFRIRU4gbG93ZXIodmFsdWUpIEVMU0UgdmFsdWUgRU5ELFxuICAgICcgJ1xuICApXG4gIEZST00gdW5uZXN0KGFycikgQVMgdmFsdWVcbiQkXFxgKTtgLFxuICBcImpzb25iLWFycmF5XCI6IGBhd2FpdCBrbmV4LnJhdyhcXGBDUkVBVEUgT1IgUkVQTEFDRSBGVU5DVElPTiBzb25hbXVfanNvbmJfYXJyYXlfYWdnKGFyciBqc29uYiwgY2kgYm9vbGVhbiBERUZBVUxUIHRydWUpXG5SRVRVUk5TIHRleHRcbkxBTkdVQUdFIHNxbCBJTU1VVEFCTEUgUEFSQUxMRUwgU0FGRSBSRVRVUk5TIE5VTEwgT04gTlVMTCBJTlBVVFxuQVMgJCRcbiAgU0VMRUNUIHN0cmluZ19hZ2coXG4gICAgQ0FTRSBXSEVOIGNpIFRIRU4gbG93ZXIodmFsdWUpIEVMU0UgdmFsdWUgRU5ELFxuICAgICcgJ1xuICApXG4gIEZST00ganNvbmJfYXJyYXlfZWxlbWVudHNfdGV4dChhcnIpXG4kJFxcYCk7YCxcbn0gc2F0aXNmaWVzIFJlY29yZDxTZWFyY2hUZXh0SGVscGVyS2luZCwgc3RyaW5nPjtcblxuY2xhc3MgU2VhcmNoVGV4dEV4cHJlc3Npb25QYXJzZXIge1xuICBwcml2YXRlIGluZGV4ID0gMDtcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIHJlYWRvbmx5IHRva2VuczogU2VhcmNoVGV4dEV4cHJlc3Npb25Ub2tlbltdKSB7fVxuXG4gIGlzQXRFbmQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuaW5kZXggPj0gdGhpcy50b2tlbnMubGVuZ3RoO1xuICB9XG5cbiAgcGFyc2VFeHByZXNzaW9uKCk6IFNlYXJjaFRleHRFeHByZXNzaW9uTm9kZSB7XG4gICAgcmV0dXJuIHRoaXMucGFyc2VDb25jYXQoKTtcbiAgfVxuXG4gIHByaXZhdGUgcGFyc2VDb25jYXQoKTogU2VhcmNoVGV4dEV4cHJlc3Npb25Ob2RlIHtcbiAgICBjb25zdCBwYXJ0cyA9IFt0aGlzLnBhcnNlUG9zdGZpeCgpXTtcblxuICAgIHdoaWxlICh0aGlzLm1hdGNoT3BlcmF0b3IoXCJ8fFwiKSkge1xuICAgICAgcGFydHMucHVzaCh0aGlzLnBhcnNlUG9zdGZpeCgpKTtcbiAgICB9XG5cbiAgICByZXR1cm4gcGFydHMubGVuZ3RoID09PSAxID8gcGFydHNbMF0gOiB7IHR5cGU6IFwiY29uY2F0XCIsIHBhcnRzIH07XG4gIH1cblxuICBwcml2YXRlIHBhcnNlUG9zdGZpeCgpOiBTZWFyY2hUZXh0RXhwcmVzc2lvbk5vZGUge1xuICAgIGxldCBub2RlID0gdGhpcy5wYXJzZVByaW1hcnkoKTtcblxuICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICBpZiAodGhpcy5tYXRjaE9wZXJhdG9yKFwiOjpcIikpIHtcbiAgICAgICAgbm9kZSA9IHtcbiAgICAgICAgICB0eXBlOiBcImNhc3RcIixcbiAgICAgICAgICBleHByOiBub2RlLFxuICAgICAgICAgIHRhcmdldFR5cGU6IHRoaXMucGFyc2VUeXBlTmFtZSgpLFxuICAgICAgICB9O1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMubWF0Y2hJZGVudGlmaWVyKFwiY29sbGF0ZVwiKSkge1xuICAgICAgICBjb25zdCB0b2tlbiA9IHRoaXMuY29uc3VtZUNvbGxhdGlvblRva2VuKCk7XG4gICAgICAgIG5vZGUgPSB7XG4gICAgICAgICAgdHlwZTogXCJjb2xsYXRlXCIsXG4gICAgICAgICAgZXhwcjogbm9kZSxcbiAgICAgICAgICBjb2xsYXRpb246IHRva2VuLnZhbHVlLFxuICAgICAgICAgIHF1b3RlZDogdG9rZW4udHlwZSA9PT0gXCJxdW90ZWRJZGVudGlmaWVyXCIsXG4gICAgICAgIH07XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBicmVhaztcbiAgICB9XG5cbiAgICByZXR1cm4gbm9kZTtcbiAgfVxuXG4gIHByaXZhdGUgcGFyc2VQcmltYXJ5KCk6IFNlYXJjaFRleHRFeHByZXNzaW9uTm9kZSB7XG4gICAgY29uc3QgdG9rZW4gPSB0aGlzLmNvbnN1bWVUb2tlbihcIu2RnO2YhOyLnVwiKTtcblxuICAgIGlmICh0b2tlbi50eXBlID09PSBcInN5bWJvbFwiICYmIHRva2VuLnZhbHVlID09PSBcIihcIikge1xuICAgICAgY29uc3Qgbm9kZSA9IHRoaXMucGFyc2VFeHByZXNzaW9uKCk7XG4gICAgICB0aGlzLmV4cGVjdFN5bWJvbChcIilcIik7XG4gICAgICByZXR1cm4gbm9kZTtcbiAgICB9XG5cbiAgICBpZiAodG9rZW4udHlwZSA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgcmV0dXJuIHsgdHlwZTogXCJzdHJpbmdcIiwgdmFsdWU6IHRva2VuLnZhbHVlIH07XG4gICAgfVxuXG4gICAgaWYgKHRva2VuLnR5cGUgPT09IFwiaWRlbnRpZmllclwiIHx8IHRva2VuLnR5cGUgPT09IFwicXVvdGVkSWRlbnRpZmllclwiKSB7XG4gICAgICBjb25zdCBsb3dlck5hbWUgPSB0b2tlbi52YWx1ZS50b0xvd2VyQ2FzZSgpO1xuICAgICAgaWYgKHRva2VuLnR5cGUgPT09IFwiaWRlbnRpZmllclwiICYmIChsb3dlck5hbWUgPT09IFwidHJ1ZVwiIHx8IGxvd2VyTmFtZSA9PT0gXCJmYWxzZVwiKSkge1xuICAgICAgICByZXR1cm4geyB0eXBlOiBcImJvb2xlYW5cIiwgdmFsdWU6IGxvd2VyTmFtZSA9PT0gXCJ0cnVlXCIgfTtcbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMubWF0Y2hTeW1ib2woXCIoXCIpKSB7XG4gICAgICAgIGlmICh0b2tlbi50eXBlID09PSBcImlkZW50aWZpZXJcIiAmJiBsb3dlck5hbWUgPT09IFwidHJpbVwiICYmIHRoaXMuaXNUcmltQm90aEZyb21Gb3JtKCkpIHtcbiAgICAgICAgICB0aGlzLmluZGV4ICs9IDI7XG4gICAgICAgICAgY29uc3QgYXJnID0gdGhpcy5wYXJzZUV4cHJlc3Npb24oKTtcbiAgICAgICAgICB0aGlzLmV4cGVjdFN5bWJvbChcIilcIik7XG4gICAgICAgICAgcmV0dXJuIHsgdHlwZTogXCJmdW5jdGlvblwiLCBuYW1lOiBcInRyaW1cIiwgYXJnczogW2FyZ10gfTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGFyZ3MgPSB0aGlzLnBhcnNlRnVuY3Rpb25BcmdzKCk7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgdHlwZTogXCJmdW5jdGlvblwiLFxuICAgICAgICAgIG5hbWU6IHRva2VuLnZhbHVlLFxuICAgICAgICAgIGFyZ3MsXG4gICAgICAgIH07XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIHR5cGU6IFwiaWRlbnRpZmllclwiLFxuICAgICAgICBuYW1lOiB0b2tlbi52YWx1ZSxcbiAgICAgICAgcXVvdGVkOiB0b2tlbi50eXBlID09PSBcInF1b3RlZElkZW50aWZpZXJcIixcbiAgICAgIH07XG4gICAgfVxuXG4gICAgdGhyb3cgbmV3IEVycm9yKGDsp4Dsm5DrkJjsp4Ag7JWK64qUIHNlYXJjaFRleHQgZXhwcmVzc2lvbiB0b2tlbjogJHt0b2tlbi50eXBlfWApO1xuICB9XG5cbiAgcHJpdmF0ZSBwYXJzZUZ1bmN0aW9uQXJncygpOiBTZWFyY2hUZXh0RXhwcmVzc2lvbk5vZGVbXSB7XG4gICAgaWYgKHRoaXMubWF0Y2hTeW1ib2woXCIpXCIpKSB7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuXG4gICAgY29uc3QgYXJnczogU2VhcmNoVGV4dEV4cHJlc3Npb25Ob2RlW10gPSBbXTtcbiAgICBkbyB7XG4gICAgICBhcmdzLnB1c2godGhpcy5wYXJzZUV4cHJlc3Npb24oKSk7XG4gICAgfSB3aGlsZSAodGhpcy5tYXRjaFN5bWJvbChcIixcIikpO1xuXG4gICAgdGhpcy5leHBlY3RTeW1ib2woXCIpXCIpO1xuICAgIHJldHVybiBhcmdzO1xuICB9XG5cbiAgcHJpdmF0ZSBwYXJzZVR5cGVOYW1lKCk6IHN0cmluZyB7XG4gICAgY29uc3QgcGFydHM6IHN0cmluZ1tdID0gW107XG5cbiAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgY29uc3QgdG9rZW4gPSB0aGlzLnBlZWsoKTtcbiAgICAgIGlmIChcbiAgICAgICAgdG9rZW4/LnR5cGUgPT09IFwiaWRlbnRpZmllclwiIHx8XG4gICAgICAgIHRva2VuPy50eXBlID09PSBcInF1b3RlZElkZW50aWZpZXJcIiB8fFxuICAgICAgICAodG9rZW4/LnR5cGUgPT09IFwic3ltYm9sXCIgJiZcbiAgICAgICAgICAodG9rZW4udmFsdWUgPT09IFwiKFwiIHx8IHRva2VuLnZhbHVlID09PSBcIilcIiB8fCB0b2tlbi52YWx1ZSA9PT0gXCIsXCIpKVxuICAgICAgKSB7XG4gICAgICAgIGlmICh0b2tlbi50eXBlID09PSBcInN5bWJvbFwiKSB7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgICBwYXJ0cy5wdXNoKHRva2VuLnZhbHVlLnRvTG93ZXJDYXNlKCkpO1xuICAgICAgICB0aGlzLmluZGV4ICs9IDE7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBicmVhaztcbiAgICB9XG5cbiAgICBpZiAocGFydHMubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCLtg4DsnoUg7LqQ7Iqk7YyFIOuMgOyDgSDtg4DsnoXsnYQg7LC+7J2EIOyImCDsl4bsirXri4jri6QuXCIpO1xuICAgIH1cblxuICAgIHJldHVybiBwYXJ0cy5qb2luKFwiIFwiKTtcbiAgfVxuXG4gIHByaXZhdGUgY29uc3VtZUNvbGxhdGlvblRva2VuKCk6IEV4dHJhY3Q8XG4gICAgU2VhcmNoVGV4dEV4cHJlc3Npb25Ub2tlbixcbiAgICB7IHR5cGU6IFwiaWRlbnRpZmllclwiIHwgXCJxdW90ZWRJZGVudGlmaWVyXCIgfVxuICA+IHtcbiAgICBjb25zdCB0b2tlbiA9IHRoaXMucGVlaygpO1xuICAgIGlmICh0b2tlbj8udHlwZSAhPT0gXCJpZGVudGlmaWVyXCIgJiYgdG9rZW4/LnR5cGUgIT09IFwicXVvdGVkSWRlbnRpZmllclwiKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJDT0xMQVRFIOuMgOyDgSDsi53rs4TsnpDrpbwg7LC+7J2EIOyImCDsl4bsirXri4jri6QuXCIpO1xuICAgIH1cbiAgICB0aGlzLmluZGV4ICs9IDE7XG4gICAgcmV0dXJuIHRva2VuO1xuICB9XG5cbiAgcHJpdmF0ZSBpc1RyaW1Cb3RoRnJvbUZvcm0oKTogYm9vbGVhbiB7XG4gICAgY29uc3QgYm90aFRva2VuID0gdGhpcy5wZWVrKCk7XG4gICAgY29uc3QgZnJvbVRva2VuID0gdGhpcy5wZWVrKDEpO1xuXG4gICAgcmV0dXJuIChcbiAgICAgIGJvdGhUb2tlbj8udHlwZSA9PT0gXCJpZGVudGlmaWVyXCIgJiZcbiAgICAgIGJvdGhUb2tlbi52YWx1ZS50b0xvd2VyQ2FzZSgpID09PSBcImJvdGhcIiAmJlxuICAgICAgZnJvbVRva2VuPy50eXBlID09PSBcImlkZW50aWZpZXJcIiAmJlxuICAgICAgZnJvbVRva2VuLnZhbHVlLnRvTG93ZXJDYXNlKCkgPT09IFwiZnJvbVwiXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgZXhwZWN0U3ltYm9sKHZhbHVlOiBcIihcIiB8IFwiKVwiIHwgXCIsXCIpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMubWF0Y2hTeW1ib2wodmFsdWUpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFwiJHt2YWx1ZX1cIiDthqDtgbDsnbQg7ZWE7JqU7ZWp64uI64ukLmApO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgbWF0Y2hTeW1ib2wodmFsdWU6IFwiKFwiIHwgXCIpXCIgfCBcIixcIik6IGJvb2xlYW4ge1xuICAgIGNvbnN0IHRva2VuID0gdGhpcy5wZWVrKCk7XG4gICAgaWYgKHRva2VuPy50eXBlID09PSBcInN5bWJvbFwiICYmIHRva2VuLnZhbHVlID09PSB2YWx1ZSkge1xuICAgICAgdGhpcy5pbmRleCArPSAxO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHByaXZhdGUgbWF0Y2hPcGVyYXRvcih2YWx1ZTogXCJ8fFwiIHwgXCI6OlwiKTogYm9vbGVhbiB7XG4gICAgY29uc3QgdG9rZW4gPSB0aGlzLnBlZWsoKTtcbiAgICBpZiAodG9rZW4/LnR5cGUgPT09IFwib3BlcmF0b3JcIiAmJiB0b2tlbi52YWx1ZSA9PT0gdmFsdWUpIHtcbiAgICAgIHRoaXMuaW5kZXggKz0gMTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBwcml2YXRlIG1hdGNoSWRlbnRpZmllcih2YWx1ZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgY29uc3QgdG9rZW4gPSB0aGlzLnBlZWsoKTtcbiAgICBpZiAodG9rZW4/LnR5cGUgPT09IFwiaWRlbnRpZmllclwiICYmIHRva2VuLnZhbHVlLnRvTG93ZXJDYXNlKCkgPT09IHZhbHVlLnRvTG93ZXJDYXNlKCkpIHtcbiAgICAgIHRoaXMuaW5kZXggKz0gMTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBwcml2YXRlIGNvbnN1bWVUb2tlbihjb250ZXh0OiBzdHJpbmcpOiBTZWFyY2hUZXh0RXhwcmVzc2lvblRva2VuIHtcbiAgICBjb25zdCB0b2tlbiA9IHRoaXMucGVlaygpO1xuICAgIGlmICghdG9rZW4pIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgJHtjb250ZXh0fSDthqDtgbDsnbQg7ZWE7JqU7ZWp64uI64ukLmApO1xuICAgIH1cbiAgICB0aGlzLmluZGV4ICs9IDE7XG4gICAgcmV0dXJuIHRva2VuO1xuICB9XG5cbiAgcHJpdmF0ZSBwZWVrKG9mZnNldCA9IDApOiBTZWFyY2hUZXh0RXhwcmVzc2lvblRva2VuIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy50b2tlbnNbdGhpcy5pbmRleCArIG9mZnNldF07XG4gIH1cbn1cblxuZnVuY3Rpb24gZ2V0SW5kZXhDb2x1bW5PcGNsYXNzKGNvbHVtbjogTWlncmF0aW9uSW5kZXhbXCJjb2x1bW5zXCJdW251bWJlcl0pOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICByZXR1cm4gY29sdW1uLm9wY2xhc3MgPz8gY29sdW1uLnZlY3Rvck9wcztcbn1cblxuZnVuY3Rpb24gdG9rZW5pemVTZWFyY2hUZXh0RXhwcmVzc2lvbihleHByZXNzaW9uOiBzdHJpbmcpOiBTZWFyY2hUZXh0RXhwcmVzc2lvblRva2VuW10ge1xuICBjb25zdCB0b2tlbnM6IFNlYXJjaFRleHRFeHByZXNzaW9uVG9rZW5bXSA9IFtdO1xuICBsZXQgaW5kZXggPSAwO1xuXG4gIHdoaWxlIChpbmRleCA8IGV4cHJlc3Npb24ubGVuZ3RoKSB7XG4gICAgY29uc3QgY2hhciA9IGV4cHJlc3Npb25baW5kZXhdO1xuXG4gICAgaWYgKGNoYXIgPT09IHVuZGVmaW5lZCkge1xuICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgaWYgKC9cXHMvLnRlc3QoY2hhcikpIHtcbiAgICAgIGluZGV4ICs9IDE7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBpZiAoZXhwcmVzc2lvbi5zdGFydHNXaXRoKFwifHxcIiwgaW5kZXgpKSB7XG4gICAgICB0b2tlbnMucHVzaCh7IHR5cGU6IFwib3BlcmF0b3JcIiwgdmFsdWU6IFwifHxcIiB9KTtcbiAgICAgIGluZGV4ICs9IDI7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBpZiAoZXhwcmVzc2lvbi5zdGFydHNXaXRoKFwiOjpcIiwgaW5kZXgpKSB7XG4gICAgICB0b2tlbnMucHVzaCh7IHR5cGU6IFwib3BlcmF0b3JcIiwgdmFsdWU6IFwiOjpcIiB9KTtcbiAgICAgIGluZGV4ICs9IDI7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBpZiAoY2hhciA9PT0gXCIoXCIgfHwgY2hhciA9PT0gXCIpXCIgfHwgY2hhciA9PT0gXCIsXCIpIHtcbiAgICAgIHRva2Vucy5wdXNoKHsgdHlwZTogXCJzeW1ib2xcIiwgdmFsdWU6IGNoYXIgfSk7XG4gICAgICBpbmRleCArPSAxO1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgaWYgKGNoYXIgPT09IFwiJ1wiKSB7XG4gICAgICBsZXQgdmFsdWUgPSBcIlwiO1xuICAgICAgaW5kZXggKz0gMTtcblxuICAgICAgd2hpbGUgKGluZGV4IDwgZXhwcmVzc2lvbi5sZW5ndGgpIHtcbiAgICAgICAgY29uc3QgY3VycmVudCA9IGV4cHJlc3Npb25baW5kZXhdO1xuICAgICAgICBpZiAoY3VycmVudCA9PT0gXCInXCIpIHtcbiAgICAgICAgICBpZiAoZXhwcmVzc2lvbltpbmRleCArIDFdID09PSBcIidcIikge1xuICAgICAgICAgICAgdmFsdWUgKz0gXCInXCI7XG4gICAgICAgICAgICBpbmRleCArPSAyO1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaW5kZXggKz0gMTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjdXJyZW50ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICAgIHZhbHVlICs9IGN1cnJlbnQ7XG4gICAgICAgIGluZGV4ICs9IDE7XG4gICAgICB9XG5cbiAgICAgIHRva2Vucy5wdXNoKHsgdHlwZTogXCJzdHJpbmdcIiwgdmFsdWUgfSk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBpZiAoY2hhciA9PT0gJ1wiJykge1xuICAgICAgbGV0IHZhbHVlID0gXCJcIjtcbiAgICAgIGluZGV4ICs9IDE7XG5cbiAgICAgIHdoaWxlIChpbmRleCA8IGV4cHJlc3Npb24ubGVuZ3RoKSB7XG4gICAgICAgIGNvbnN0IGN1cnJlbnQgPSBleHByZXNzaW9uW2luZGV4XTtcbiAgICAgICAgaWYgKGN1cnJlbnQgPT09ICdcIicpIHtcbiAgICAgICAgICBpZiAoZXhwcmVzc2lvbltpbmRleCArIDFdID09PSAnXCInKSB7XG4gICAgICAgICAgICB2YWx1ZSArPSAnXCInO1xuICAgICAgICAgICAgaW5kZXggKz0gMjtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGluZGV4ICs9IDE7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY3VycmVudCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgICB2YWx1ZSArPSBjdXJyZW50O1xuICAgICAgICBpbmRleCArPSAxO1xuICAgICAgfVxuXG4gICAgICB0b2tlbnMucHVzaCh7IHR5cGU6IFwicXVvdGVkSWRlbnRpZmllclwiLCB2YWx1ZSB9KTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGlmICgvW0EtWmEtel9dLy50ZXN0KGNoYXIpKSB7XG4gICAgICBsZXQgdmFsdWUgPSBjaGFyO1xuICAgICAgaW5kZXggKz0gMTtcblxuICAgICAgd2hpbGUgKGluZGV4IDwgZXhwcmVzc2lvbi5sZW5ndGgpIHtcbiAgICAgICAgY29uc3QgY3VycmVudCA9IGV4cHJlc3Npb25baW5kZXhdO1xuICAgICAgICBpZiAoY3VycmVudCAhPT0gdW5kZWZpbmVkICYmIC9bQS1aYS16MC05XyRdLy50ZXN0KGN1cnJlbnQpKSB7XG4gICAgICAgICAgdmFsdWUgKz0gY3VycmVudDtcbiAgICAgICAgICBpbmRleCArPSAxO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgICB0b2tlbnMucHVzaCh7IHR5cGU6IFwiaWRlbnRpZmllclwiLCB2YWx1ZSB9KTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIHRocm93IG5ldyBFcnJvcihg7KeA7JuQ65CY7KeAIOyViuuKlCBzZWFyY2hUZXh0IGV4cHJlc3Npb24g66y47J6QOiAke2NoYXJ9YCk7XG4gIH1cblxuICByZXR1cm4gdG9rZW5zO1xufVxuXG5mdW5jdGlvbiBjYW5vbmljYWxpemVTZWFyY2hUZXh0R2VuZXJhdGVkRXhwcmVzc2lvbihleHByZXNzaW9uOiBzdHJpbmcpOiBzdHJpbmcge1xuICB0cnkge1xuICAgIGNvbnN0IHBhcnNlciA9IG5ldyBTZWFyY2hUZXh0RXhwcmVzc2lvblBhcnNlcih0b2tlbml6ZVNlYXJjaFRleHRFeHByZXNzaW9uKGV4cHJlc3Npb24pKTtcbiAgICBjb25zdCBwYXJzZWRFeHByZXNzaW9uID0gcGFyc2VyLnBhcnNlRXhwcmVzc2lvbigpO1xuXG4gICAgaWYgKCFwYXJzZXIuaXNBdEVuZCgpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJzZWFyY2hUZXh0IGV4cHJlc3Npb24g7YyM7Iux7J20IOuBneuCmOyngCDslYrslZjsirXri4jri6QuXCIpO1xuICAgIH1cblxuICAgIHJldHVybiByZW5kZXJTZWFyY2hUZXh0RXhwcmVzc2lvbihub3JtYWxpemVTZWFyY2hUZXh0RXhwcmVzc2lvbk5vZGUocGFyc2VkRXhwcmVzc2lvbikpO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gbm9ybWFsaXplU2VhcmNoVGV4dEV4cHJlc3Npb25GYWxsYmFjayhleHByZXNzaW9uKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBub3JtYWxpemVTZWFyY2hUZXh0RXhwcmVzc2lvbk5vZGUoXG4gIG5vZGU6IFNlYXJjaFRleHRFeHByZXNzaW9uTm9kZSxcbik6IFNlYXJjaFRleHRFeHByZXNzaW9uTm9kZSB7XG4gIHN3aXRjaCAobm9kZS50eXBlKSB7XG4gICAgY2FzZSBcImlkZW50aWZpZXJcIjpcbiAgICAgIHJldHVybiB7XG4gICAgICAgIC4uLm5vZGUsXG4gICAgICAgIG5hbWU6IG5vZGUucXVvdGVkID8gbm9kZS5uYW1lIDogbm9kZS5uYW1lLnRvTG93ZXJDYXNlKCksXG4gICAgICB9O1xuICAgIGNhc2UgXCJzdHJpbmdcIjpcbiAgICBjYXNlIFwiYm9vbGVhblwiOlxuICAgICAgcmV0dXJuIG5vZGU7XG4gICAgY2FzZSBcImNvbmNhdFwiOiB7XG4gICAgICBjb25zdCBwYXJ0cyA9IG5vZGUucGFydHMuZmxhdE1hcCgocGFydCkgPT4ge1xuICAgICAgICBjb25zdCBub3JtYWxpemVkUGFydCA9IG5vcm1hbGl6ZVNlYXJjaFRleHRFeHByZXNzaW9uTm9kZShwYXJ0KTtcbiAgICAgICAgcmV0dXJuIG5vcm1hbGl6ZWRQYXJ0LnR5cGUgPT09IFwiY29uY2F0XCIgPyBub3JtYWxpemVkUGFydC5wYXJ0cyA6IFtub3JtYWxpemVkUGFydF07XG4gICAgICB9KTtcbiAgICAgIHJldHVybiB7IHR5cGU6IFwiY29uY2F0XCIsIHBhcnRzIH07XG4gICAgfVxuICAgIGNhc2UgXCJjb2xsYXRlXCI6XG4gICAgICByZXR1cm4ge1xuICAgICAgICB0eXBlOiBcImNvbGxhdGVcIixcbiAgICAgICAgZXhwcjogbm9ybWFsaXplU2VhcmNoVGV4dEV4cHJlc3Npb25Ob2RlKG5vZGUuZXhwciksXG4gICAgICAgIGNvbGxhdGlvbjogbm9kZS5jb2xsYXRpb24udG9VcHBlckNhc2UoKSA9PT0gXCJDXCIgPyBcIkNcIiA6IG5vZGUuY29sbGF0aW9uLFxuICAgICAgICBxdW90ZWQ6IG5vZGUucXVvdGVkIHx8IG5vZGUuY29sbGF0aW9uLnRvVXBwZXJDYXNlKCkgPT09IFwiQ1wiLFxuICAgICAgfTtcbiAgICBjYXNlIFwiY2FzdFwiOiB7XG4gICAgICBjb25zdCBub3JtYWxpemVkRXhwciA9IG5vcm1hbGl6ZVNlYXJjaFRleHRFeHByZXNzaW9uTm9kZShub2RlLmV4cHIpO1xuICAgICAgY29uc3QgdGFyZ2V0VHlwZSA9IG5vZGUudGFyZ2V0VHlwZS5yZXBsYWNlKC9cXHMrL2csIFwiIFwiKS50cmltKCkudG9Mb3dlckNhc2UoKTtcbiAgICAgIGlmICh0YXJnZXRUeXBlID09PSBcInRleHRcIiB8fCB0YXJnZXRUeXBlID09PSBcImNoYXJhY3RlciB2YXJ5aW5nXCIgfHwgdGFyZ2V0VHlwZSA9PT0gXCJ2YXJjaGFyXCIpIHtcbiAgICAgICAgcmV0dXJuIG5vcm1hbGl6ZWRFeHByO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdHlwZTogXCJjYXN0XCIsXG4gICAgICAgIGV4cHI6IG5vcm1hbGl6ZWRFeHByLFxuICAgICAgICB0YXJnZXRUeXBlLFxuICAgICAgfTtcbiAgICB9XG4gICAgY2FzZSBcImZ1bmN0aW9uXCI6IHtcbiAgICAgIGNvbnN0IG5hbWUgPSBub2RlLm5hbWUudG9Mb3dlckNhc2UoKTtcbiAgICAgIGxldCBhcmdzID0gbm9kZS5hcmdzLm1hcCgoYXJnKSA9PiBub3JtYWxpemVTZWFyY2hUZXh0RXhwcmVzc2lvbk5vZGUoYXJnKSk7XG5cbiAgICAgIGlmICgobmFtZSA9PT0gXCJ0cmltXCIgfHwgbmFtZSA9PT0gXCJidHJpbVwiKSAmJiBhcmdzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHR5cGU6IFwiZnVuY3Rpb25cIixcbiAgICAgICAgICBuYW1lOiBcInRyaW1cIixcbiAgICAgICAgICBhcmdzLFxuICAgICAgICB9O1xuICAgICAgfVxuXG4gICAgICBpZiAoXG4gICAgICAgIChuYW1lID09PSBcInNvbmFtdV90ZXh0X2FycmF5X2FnZ1wiIHx8IG5hbWUgPT09IFwic29uYW11X2pzb25iX2FycmF5X2FnZ1wiKSAmJlxuICAgICAgICBhcmdzLmxlbmd0aCA9PT0gMiAmJlxuICAgICAgICBhcmdzWzFdPy50eXBlID09PSBcImJvb2xlYW5cIiAmJlxuICAgICAgICBhcmdzWzFdLnZhbHVlXG4gICAgICApIHtcbiAgICAgICAgYXJncyA9IFthcmdzWzBdXTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdHlwZTogXCJmdW5jdGlvblwiLFxuICAgICAgICBuYW1lLFxuICAgICAgICBhcmdzLFxuICAgICAgfTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gcmVuZGVyU2VhcmNoVGV4dEV4cHJlc3Npb24obm9kZTogU2VhcmNoVGV4dEV4cHJlc3Npb25Ob2RlLCBwYXJlbnRQcmVjZWRlbmNlID0gMCk6IHN0cmluZyB7XG4gIGNvbnN0IHByZWNlZGVuY2UgPSBnZXRTZWFyY2hUZXh0RXhwcmVzc2lvblByZWNlZGVuY2Uobm9kZSk7XG4gIGNvbnN0IHJlbmRlcmVkID0gKCgpID0+IHtcbiAgICBzd2l0Y2ggKG5vZGUudHlwZSkge1xuICAgICAgY2FzZSBcImlkZW50aWZpZXJcIjpcbiAgICAgICAgcmV0dXJuIG5vZGUucXVvdGVkID8gYFwiJHtub2RlLm5hbWUucmVwbGFjZUFsbCgnXCInLCAnXCJcIicpfVwiYCA6IG5vZGUubmFtZTtcbiAgICAgIGNhc2UgXCJzdHJpbmdcIjpcbiAgICAgICAgcmV0dXJuIGAnJHtub2RlLnZhbHVlLnJlcGxhY2VBbGwoXCInXCIsIFwiJydcIil9J2A7XG4gICAgICBjYXNlIFwiYm9vbGVhblwiOlxuICAgICAgICByZXR1cm4gbm9kZS52YWx1ZSA/IFwidHJ1ZVwiIDogXCJmYWxzZVwiO1xuICAgICAgY2FzZSBcImZ1bmN0aW9uXCI6XG4gICAgICAgIHJldHVybiBgJHtub2RlLm5hbWV9KCR7bm9kZS5hcmdzXG4gICAgICAgICAgLm1hcCgoYXJnKSA9PiByZW5kZXJTZWFyY2hUZXh0RXhwcmVzc2lvbihhcmcpKVxuICAgICAgICAgIC5qb2luKFwiLCBcIil9KWA7XG4gICAgICBjYXNlIFwiY29uY2F0XCI6XG4gICAgICAgIHJldHVybiBub2RlLnBhcnRzLm1hcCgocGFydCkgPT4gcmVuZGVyU2VhcmNoVGV4dEV4cHJlc3Npb24ocGFydCwgcHJlY2VkZW5jZSkpLmpvaW4oXCIgfHwgXCIpO1xuICAgICAgY2FzZSBcImNvbGxhdGVcIjoge1xuICAgICAgICBjb25zdCBjb2xsYXRpb24gPSBub2RlLnF1b3RlZFxuICAgICAgICAgID8gYFwiJHtub2RlLmNvbGxhdGlvbi5yZXBsYWNlQWxsKCdcIicsICdcIlwiJyl9XCJgXG4gICAgICAgICAgOiBub2RlLmNvbGxhdGlvbjtcbiAgICAgICAgcmV0dXJuIGAke3JlbmRlclNlYXJjaFRleHRFeHByZXNzaW9uKG5vZGUuZXhwciwgcHJlY2VkZW5jZSl9IENPTExBVEUgJHtjb2xsYXRpb259YDtcbiAgICAgIH1cbiAgICAgIGNhc2UgXCJjYXN0XCI6XG4gICAgICAgIHJldHVybiBgJHtyZW5kZXJTZWFyY2hUZXh0RXhwcmVzc2lvbihub2RlLmV4cHIsIHByZWNlZGVuY2UpfTo6JHtub2RlLnRhcmdldFR5cGV9YDtcbiAgICB9XG4gIH0pKCk7XG5cbiAgaWYgKHByZWNlZGVuY2UgPCBwYXJlbnRQcmVjZWRlbmNlKSB7XG4gICAgcmV0dXJuIGAoJHtyZW5kZXJlZH0pYDtcbiAgfVxuXG4gIHJldHVybiByZW5kZXJlZDtcbn1cblxuZnVuY3Rpb24gZ2V0U2VhcmNoVGV4dEV4cHJlc3Npb25QcmVjZWRlbmNlKG5vZGU6IFNlYXJjaFRleHRFeHByZXNzaW9uTm9kZSk6IG51bWJlciB7XG4gIHN3aXRjaCAobm9kZS50eXBlKSB7XG4gICAgY2FzZSBcImNvbmNhdFwiOlxuICAgICAgcmV0dXJuIDE7XG4gICAgY2FzZSBcImNvbGxhdGVcIjpcbiAgICBjYXNlIFwiY2FzdFwiOlxuICAgICAgcmV0dXJuIDI7XG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiAzO1xuICB9XG59XG5cbmZ1bmN0aW9uIG5vcm1hbGl6ZVNlYXJjaFRleHRFeHByZXNzaW9uRmFsbGJhY2soZXhwcmVzc2lvbjogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIGV4cHJlc3Npb25cbiAgICAucmVwbGFjZSgvXFxzKy9nLCBcIiBcIilcbiAgICAucmVwbGFjZSgvXFxiVFJJTVxccypcXChcXHMqQk9USFxccytGUk9NXFxzKy9naSwgXCJ0cmltKFwiKVxuICAgIC5yZXBsYWNlKC86Oig/OnRleHR8Y2hhcmFjdGVyIHZhcnlpbmd8dmFyY2hhcilcXGIvZ2ksIFwiXCIpXG4gICAgLnJlcGxhY2UoLyxcXHMqdHJ1ZVxcYi9naSwgXCJcIilcbiAgICAudHJpbSgpO1xufVxuXG5mdW5jdGlvbiB2aXNpdFNlYXJjaFRleHRFeHByZXNzaW9uTm9kZShcbiAgbm9kZTogU2VhcmNoVGV4dEV4cHJlc3Npb25Ob2RlLFxuICB2aXNpdG9yOiAobm9kZTogU2VhcmNoVGV4dEV4cHJlc3Npb25Ob2RlKSA9PiB2b2lkLFxuKTogdm9pZCB7XG4gIHZpc2l0b3Iobm9kZSk7XG5cbiAgc3dpdGNoIChub2RlLnR5cGUpIHtcbiAgICBjYXNlIFwiY29uY2F0XCI6XG4gICAgICBub2RlLnBhcnRzLmZvckVhY2goKHBhcnQpID0+IHtcbiAgICAgICAgdmlzaXRTZWFyY2hUZXh0RXhwcmVzc2lvbk5vZGUocGFydCwgdmlzaXRvcik7XG4gICAgICB9KTtcbiAgICAgIHJldHVybjtcbiAgICBjYXNlIFwiY29sbGF0ZVwiOlxuICAgIGNhc2UgXCJjYXN0XCI6XG4gICAgICB2aXNpdFNlYXJjaFRleHRFeHByZXNzaW9uTm9kZShub2RlLmV4cHIsIHZpc2l0b3IpO1xuICAgICAgcmV0dXJuO1xuICAgIGNhc2UgXCJmdW5jdGlvblwiOlxuICAgICAgbm9kZS5hcmdzLmZvckVhY2goKGFyZykgPT4ge1xuICAgICAgICB2aXNpdFNlYXJjaFRleHRFeHByZXNzaW9uTm9kZShhcmcsIHZpc2l0b3IpO1xuICAgICAgfSk7XG4gICAgICByZXR1cm47XG4gICAgY2FzZSBcImlkZW50aWZpZXJcIjpcbiAgICBjYXNlIFwic3RyaW5nXCI6XG4gICAgY2FzZSBcImJvb2xlYW5cIjpcbiAgICAgIHJldHVybjtcbiAgfVxufVxuXG5mdW5jdGlvbiBnZXRTZWFyY2hUZXh0SGVscGVyS2luZHNGcm9tRXhwcmVzc2lvbihleHByZXNzaW9uOiBzdHJpbmcpOiBTZXQ8U2VhcmNoVGV4dEhlbHBlcktpbmQ+IHtcbiAgY29uc3QgaGVscGVyS2luZHMgPSBuZXcgU2V0PFNlYXJjaFRleHRIZWxwZXJLaW5kPigpO1xuICBjb25zdCBhZGRIZWxwZXJLaW5kRnJvbU5hbWUgPSAobmFtZTogc3RyaW5nKSA9PiB7XG4gICAgY29uc3Qgbm9ybWFsaXplZE5hbWUgPSBuYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgaWYgKG5vcm1hbGl6ZWROYW1lID09PSBcInNvbmFtdV90ZXh0X2FycmF5X2FnZ1wiKSB7XG4gICAgICBoZWxwZXJLaW5kcy5hZGQoXCJ0ZXh0LWFycmF5XCIpO1xuICAgIH0gZWxzZSBpZiAobm9ybWFsaXplZE5hbWUgPT09IFwic29uYW11X2pzb25iX2FycmF5X2FnZ1wiKSB7XG4gICAgICBoZWxwZXJLaW5kcy5hZGQoXCJqc29uYi1hcnJheVwiKTtcbiAgICB9XG4gIH07XG5cbiAgdHJ5IHtcbiAgICBjb25zdCBwYXJzZXIgPSBuZXcgU2VhcmNoVGV4dEV4cHJlc3Npb25QYXJzZXIodG9rZW5pemVTZWFyY2hUZXh0RXhwcmVzc2lvbihleHByZXNzaW9uKSk7XG4gICAgY29uc3QgcGFyc2VkRXhwcmVzc2lvbiA9IHBhcnNlci5wYXJzZUV4cHJlc3Npb24oKTtcblxuICAgIGlmICghcGFyc2VyLmlzQXRFbmQoKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwic2VhcmNoVGV4dCBoZWxwZXIgZXhwcmVzc2lvbiDtjIzsi7HsnbQg64Gd64KY7KeAIOyViuyVmOyKteuLiOuLpC5cIik7XG4gICAgfVxuXG4gICAgdmlzaXRTZWFyY2hUZXh0RXhwcmVzc2lvbk5vZGUocGFyc2VkRXhwcmVzc2lvbiwgKG5vZGUpID0+IHtcbiAgICAgIGlmIChub2RlLnR5cGUgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICBhZGRIZWxwZXJLaW5kRnJvbU5hbWUobm9kZS5uYW1lKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfSBjYXRjaCB7XG4gICAgaWYgKC9cXGJzb25hbXVfdGV4dF9hcnJheV9hZ2dcXHMqXFwoL2kudGVzdChleHByZXNzaW9uKSkge1xuICAgICAgaGVscGVyS2luZHMuYWRkKFwidGV4dC1hcnJheVwiKTtcbiAgICB9XG4gICAgaWYgKC9cXGJzb25hbXVfanNvbmJfYXJyYXlfYWdnXFxzKlxcKC9pLnRlc3QoZXhwcmVzc2lvbikpIHtcbiAgICAgIGhlbHBlcktpbmRzLmFkZChcImpzb25iLWFycmF5XCIpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBoZWxwZXJLaW5kcztcbn1cblxuZnVuY3Rpb24gcmVzb2x2ZVNlYXJjaFRleHRDb2x1bW5zKHRhYmxlOiBzdHJpbmcsIGNvbHVtbnM6IE1pZ3JhdGlvbkNvbHVtbltdKTogTWlncmF0aW9uQ29sdW1uW10ge1xuICBjb25zdCBlbnRpdHkgPSAoKCkgPT4ge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gRW50aXR5TWFuYWdlci5nZXRCeVRhYmxlKHRhYmxlKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgfSkoKTtcblxuICBpZiAoIWVudGl0eSkge1xuICAgIHJldHVybiBjb2x1bW5zO1xuICB9XG5cbiAgY29uc3QgcHJvcHNCeU5hbWUgPSBuZXcgTWFwKGVudGl0eS5wcm9wcy5tYXAoKHByb3ApID0+IFtwcm9wLm5hbWUsIHByb3BdKSk7XG5cbiAgcmV0dXJuIGNvbHVtbnMubWFwKChjb2x1bW4pID0+IHtcbiAgICBjb25zdCBwcm9wID0gcHJvcHNCeU5hbWUuZ2V0KGNvbHVtbi5uYW1lKTtcbiAgICBpZiAoIXByb3AgfHwgIWlzU2VhcmNoVGV4dFByb3AocHJvcCkpIHtcbiAgICAgIHJldHVybiBjb2x1bW47XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLmNvbHVtbixcbiAgICAgIGdlbmVyYXRlZDoge1xuICAgICAgICB0eXBlOiBcIlNUT1JFRFwiLFxuICAgICAgICBleHByZXNzaW9uOiBidWlsZFNlYXJjaFRleHRHZW5lcmF0ZWRFeHByZXNzaW9uKHByb3AsIHByb3BzQnlOYW1lKSxcbiAgICAgIH0sXG4gICAgfTtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGJ1aWxkU2VhcmNoVGV4dEdlbmVyYXRlZEV4cHJlc3Npb24oXG4gIHByb3A6IEV4dHJhY3Q8RW50aXR5UHJvcCwgeyB0eXBlOiBcInNlYXJjaFRleHRcIiB9PixcbiAgcHJvcHNCeU5hbWU6IE1hcDxzdHJpbmcsIEVudGl0eVByb3A+LFxuKTogc3RyaW5nIHtcbiAgY29uc3QgdG9rZW5zID0gcHJvcC5zb3VyY2VDb2x1bW5zLm1hcCgoc291cmNlKSA9PiB7XG4gICAgY29uc3Qgc291cmNlUHJvcCA9IHByb3BzQnlOYW1lLmdldChzb3VyY2UubmFtZSk7XG4gICAgaWYgKCFzb3VyY2VQcm9wKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYHNlYXJjaFRleHQgc291cmNlIGNvbHVtbiBcIiR7c291cmNlLm5hbWV9XCLsnYQo66W8KSDssL7snYQg7IiYIOyXhuyKteuLiOuLpC5gKTtcbiAgICB9XG5cbiAgICBpZiAoc291cmNlUHJvcC50eXBlID09PSBcInN0cmluZ1wiKSB7XG4gICAgICByZXR1cm4gc291cmNlLmNhc2VJbnNlbnNpdGl2ZVxuICAgICAgICA/IGBsb3dlcihDT0FMRVNDRSgke3NvdXJjZS5uYW1lfSwgJycpKWBcbiAgICAgICAgOiBgQ09BTEVTQ0UoJHtzb3VyY2UubmFtZX0sICcnKWA7XG4gICAgfVxuXG4gICAgaWYgKHNvdXJjZVByb3AudHlwZSA9PT0gXCJzdHJpbmdbXVwiKSB7XG4gICAgICByZXR1cm4gc291cmNlLmNhc2VJbnNlbnNpdGl2ZVxuICAgICAgICA/IGBDT0FMRVNDRShzb25hbXVfdGV4dF9hcnJheV9hZ2coJHtzb3VyY2UubmFtZX0pLCAnJylgXG4gICAgICAgIDogYENPQUxFU0NFKHNvbmFtdV90ZXh0X2FycmF5X2FnZygke3NvdXJjZS5uYW1lfSwgZmFsc2UpLCAnJylgO1xuICAgIH1cblxuICAgIGlmIChzb3VyY2VQcm9wLnR5cGUgPT09IFwianNvblwiKSB7XG4gICAgICByZXR1cm4gc291cmNlLmNhc2VJbnNlbnNpdGl2ZVxuICAgICAgICA/IGBDT0FMRVNDRShzb25hbXVfanNvbmJfYXJyYXlfYWdnKCR7c291cmNlLm5hbWV9KSwgJycpYFxuICAgICAgICA6IGBDT0FMRVNDRShzb25hbXVfanNvbmJfYXJyYXlfYWdnKCR7c291cmNlLm5hbWV9LCBmYWxzZSksICcnKWA7XG4gICAgfVxuXG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgYHNlYXJjaFRleHQgc291cmNlIGNvbHVtbiBcIiR7c291cmNlLm5hbWV9XCLsnZgg7YOA7J6FIFwiJHtzb3VyY2VQcm9wLnR5cGV9XCLsnYAo64qUKSDsp4Dsm5DrkJjsp4Ag7JWK7Iq164uI64ukLmAsXG4gICAgKTtcbiAgfSk7XG5cbiAgcmV0dXJuIGB0cmltKCR7dG9rZW5zLmpvaW4oYCB8fCAnICcgfHwgYCl9KWA7XG59XG5cbmZ1bmN0aW9uIGdldFNlYXJjaFRleHRIZWxwZXJEZWZpbml0aW9ucyh0YWJsZTogc3RyaW5nLCBjb2x1bW5zOiBNaWdyYXRpb25Db2x1bW5bXSk6IHN0cmluZ1tdIHtcbiAgY29uc3QgaGVscGVyS2luZHMgPSBuZXcgU2V0PFNlYXJjaFRleHRIZWxwZXJLaW5kPigpO1xuXG4gIGNvbHVtbnMuZm9yRWFjaCgoY29sdW1uKSA9PiB7XG4gICAgaWYgKCFjb2x1bW4uZ2VuZXJhdGVkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgZ2V0U2VhcmNoVGV4dEhlbHBlcktpbmRzRnJvbUV4cHJlc3Npb24oY29sdW1uLmdlbmVyYXRlZC5leHByZXNzaW9uKS5mb3JFYWNoKChraW5kKSA9PiB7XG4gICAgICBoZWxwZXJLaW5kcy5hZGQoa2luZCk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGlmIChoZWxwZXJLaW5kcy5zaXplID4gMCkge1xuICAgIHJldHVybiAoW1widGV4dC1hcnJheVwiLCBcImpzb25iLWFycmF5XCJdIGFzIGNvbnN0KVxuICAgICAgLmZpbHRlcigoa2luZCkgPT4gaGVscGVyS2luZHMuaGFzKGtpbmQpKVxuICAgICAgLm1hcCgoa2luZCkgPT4gU0VBUkNIX1RFWFRfSEVMUEVSX0RFRklOSVRJT05TW2tpbmRdKTtcbiAgfVxuXG4gIGNvbnN0IGVudGl0eSA9ICgoKSA9PiB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBFbnRpdHlNYW5hZ2VyLmdldEJ5VGFibGUodGFibGUpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9KSgpO1xuXG4gIGlmICghZW50aXR5KSB7XG4gICAgcmV0dXJuIFtdO1xuICB9XG4gIGNvbnN0IHByb3BzQnlOYW1lID0gbmV3IE1hcChlbnRpdHkucHJvcHMubWFwKChwcm9wKSA9PiBbcHJvcC5uYW1lLCBwcm9wXSkpO1xuXG4gIGNvbHVtbnMuZm9yRWFjaCgoY29sdW1uKSA9PiB7XG4gICAgY29uc3QgcHJvcCA9IHByb3BzQnlOYW1lLmdldChjb2x1bW4ubmFtZSk7XG4gICAgaWYgKCFwcm9wIHx8ICFpc1NlYXJjaFRleHRQcm9wKHByb3ApKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgcHJvcC5zb3VyY2VDb2x1bW5zLmZvckVhY2goKHNvdXJjZSkgPT4ge1xuICAgICAgY29uc3Qgc291cmNlUHJvcCA9IHByb3BzQnlOYW1lLmdldChzb3VyY2UubmFtZSk7XG4gICAgICBpZiAoc291cmNlUHJvcD8udHlwZSA9PT0gXCJzdHJpbmdbXVwiKSB7XG4gICAgICAgIGhlbHBlcktpbmRzLmFkZChcInRleHQtYXJyYXlcIik7XG4gICAgICB9IGVsc2UgaWYgKHNvdXJjZVByb3A/LnR5cGUgPT09IFwianNvblwiKSB7XG4gICAgICAgIGhlbHBlcktpbmRzLmFkZChcImpzb25iLWFycmF5XCIpO1xuICAgICAgfVxuICAgIH0pO1xuICB9KTtcblxuICByZXR1cm4gKFtcInRleHQtYXJyYXlcIiwgXCJqc29uYi1hcnJheVwiXSBhcyBjb25zdClcbiAgICAuZmlsdGVyKChraW5kKSA9PiBoZWxwZXJLaW5kcy5oYXMoa2luZCkpXG4gICAgLm1hcCgoa2luZCkgPT4gU0VBUkNIX1RFWFRfSEVMUEVSX0RFRklOSVRJT05TW2tpbmRdKTtcbn1cblxuZnVuY3Rpb24gZ2V0U2VhcmNoVGV4dENvbHVtbk5hbWVzKHRhYmxlOiBzdHJpbmcpOiBTZXQ8c3RyaW5nPiB7XG4gIGNvbnN0IGVudGl0eSA9ICgoKSA9PiB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBFbnRpdHlNYW5hZ2VyLmdldEJ5VGFibGUodGFibGUpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9KSgpO1xuXG4gIGlmICghZW50aXR5KSB7XG4gICAgcmV0dXJuIG5ldyBTZXQoKTtcbiAgfVxuXG4gIHJldHVybiBuZXcgU2V0KGVudGl0eS5wcm9wcy5maWx0ZXIoaXNTZWFyY2hUZXh0UHJvcCkubWFwKChwcm9wKSA9PiBwcm9wLm5hbWUpKTtcbn1cblxuLyoqXG4gKiDthYzsnbTruJQg7IOd7ISx7ZWY64qUIOy8gOydtOyKpCAtIOy7rOufvC/snbjrjbHsiqQg7IOd7ISxXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlQ3JlYXRlQ29kZV9Db2x1bW5BbmRJbmRleGVzKFxuICB0YWJsZTogc3RyaW5nLFxuICBjb2x1bW5zOiBNaWdyYXRpb25Db2x1bW5bXSxcbiAgaW5kZXhlczogTWlncmF0aW9uSW5kZXhbXSxcbik6IFByb21pc2U8R2VuTWlncmF0aW9uQ29kZT4ge1xuICBjb25zdCByZXNvbHZlZENvbHVtbnMgPSByZXNvbHZlU2VhcmNoVGV4dENvbHVtbnModGFibGUsIGNvbHVtbnMpO1xuICBjb25zdCBjb2x1bW5EZWZzID0gZ2VuQ29sdW1uRGVmaW5pdGlvbnModGFibGUsIHJlc29sdmVkQ29sdW1ucyk7XG4gIGNvbnN0IGhlbHBlckRlZmluaXRpb25zID0gZ2V0U2VhcmNoVGV4dEhlbHBlckRlZmluaXRpb25zKHRhYmxlLCByZXNvbHZlZENvbHVtbnMpO1xuXG4gIC8vIOy7rOufvCwg7J24642x7IqkIOyymOumrFxuICBjb25zdCBsaW5lczogc3RyaW5nW10gPSBbXG4gICAgJ2ltcG9ydCB0eXBlIHsgS25leCB9IGZyb20gXCJrbmV4XCI7JyxcbiAgICBcIlwiLFxuICAgIFwiZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHVwKGtuZXg6IEtuZXgpOiBQcm9taXNlPHZvaWQ+IHtcIixcbiAgICAuLi5oZWxwZXJEZWZpbml0aW9ucyxcbiAgICBgYXdhaXQga25leC5zY2hlbWEuY3JlYXRlVGFibGUoXCIke3RhYmxlfVwiLCAodGFibGUpID0+IHtgLFxuICAgIC4uLmNvbHVtbkRlZnMuYnVpbGRlcixcbiAgICBcIn0pO1wiLFxuICAgIC8vIHJhdyDqtazrrLggKEdlbmVyYXRlZCBDb2x1bW4g65OxKVxuICAgIC4uLmNvbHVtbkRlZnMucmF3LFxuICAgIC8vIGluZGV464qUIGtuZXgucmF366GcIOyymOumrO2VmOuvgOuhnCBjcmVhdGVUYWJsZSDrsJbsl5DshJwg7Iuk7ZaJXG4gICAgLi4uaW5kZXhlcy5tYXAoKGluZGV4KSA9PiBnZW5JbmRleERlZmluaXRpb24oaW5kZXgsIHRhYmxlKSksXG4gICAgXCJ9XCIsXG4gICAgXCJcIixcbiAgICBcImV4cG9ydCBhc3luYyBmdW5jdGlvbiBkb3duKGtuZXg6IEtuZXgpOiBQcm9taXNlPHZvaWQ+IHtcIixcbiAgICBgIHJldHVybiBrbmV4LnNjaGVtYS5kcm9wVGFibGUoXCIke3RhYmxlfVwiKTtgLFxuICAgIFwifVwiLFxuICBdO1xuICByZXR1cm4ge1xuICAgIHRhYmxlLFxuICAgIHR5cGU6IFwibm9ybWFsXCIsXG4gICAgdGl0bGU6IGBjcmVhdGVfXyR7dGFibGV9YCxcbiAgICBmb3JtYXR0ZWQ6IGF3YWl0IGZvcm1hdENvZGUobGluZXMuam9pbihcIlxcblwiKSwgYHNyYy9taWdyYXRpb24vJHt0YWJsZX0udHNgKSxcbiAgfTtcbn1cblxuLyoqXG4gKiBNaWdyYXRpb25Db2x1bW5bXSDsnb3slrTshJwg7Lus65+8IOygleydmO2VmOuKlCDqtazrrLgg7IOd7ISxXG4gKiBAcmV0dXJucyBidWlsZGVyOiB0YWJsZSBidWlsZGVyIOuplOyEnOuTnCwgcmF3OiBrbmV4LnJhdygpIOq1rOusuFxuICovXG5mdW5jdGlvbiBnZW5Db2x1bW5EZWZpbml0aW9ucyh0YWJsZTogc3RyaW5nLCBjb2x1bW5zOiBNaWdyYXRpb25Db2x1bW5bXSk6IENvbHVtbkRlZmluaXRpb25SZXN1bHQge1xuICBjb25zdCByZXN1bHQ6IENvbHVtbkRlZmluaXRpb25SZXN1bHQgPSB7XG4gICAgYnVpbGRlcjogW10sXG4gICAgcmF3OiBbXSxcbiAgfTtcblxuICBmb3IgKGNvbnN0IGNvbHVtbiBvZiBjb2x1bW5zKSB7XG4gICAgLy8gR2VuZXJhdGVkIENvbHVtbuydgCByYXfroZwg7LKY66asXG4gICAgaWYgKGNvbHVtbi5nZW5lcmF0ZWQpIHtcbiAgICAgIHJlc3VsdC5yYXcucHVzaChnZW5HZW5lcmF0ZWRDb2x1bW5EZWZpbml0aW9uKHRhYmxlLCBjb2x1bW4pKTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIC8vIOydvOuwmCDsu6zrn7zsnYAgYnVpbGRlcuuhnCDsspjrpqxcbiAgICByZXN1bHQuYnVpbGRlci5wdXNoKGdlbk5vcm1hbENvbHVtbkRlZmluaXRpb24oY29sdW1uKSk7XG4gIH1cblxuICByZXR1cm4gcmVzdWx0O1xufVxuXG4vKipcbiAqIEdlbmVyYXRlZCBDb2x1bW4g7KCV7J2YIOyDneyEsSAoQUxURVIgVEFCTEUgQUREIENPTFVNTiDsgqzsmqkpXG4gKi9cbmZ1bmN0aW9uIGdlbkdlbmVyYXRlZENvbHVtbkRlZmluaXRpb24odGFibGU6IHN0cmluZywgY29sdW1uOiBNaWdyYXRpb25Db2x1bW4pOiBzdHJpbmcge1xuICBpZiAoIWNvbHVtbi5nZW5lcmF0ZWQpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJHZW5lcmF0ZWQgY29sdW1uIGRlZmluaXRpb24gcmVxdWlyZWRcIik7XG4gIH1cbiAgY29uc3QgcGdUeXBlID0gZ2V0UGdUeXBlRm9yQ29sdW1uKGNvbHVtbik7XG4gIGNvbnN0IHN0b3JhZ2VUeXBlID0gY29sdW1uLmdlbmVyYXRlZC50eXBlID09PSBcIlZJUlRVQUxcIiA/IFwiIFZJUlRVQUxcIiA6IFwiIFNUT1JFRFwiO1xuICBjb25zdCBudWxsYWJsZUNsYXVzZSA9IGNvbHVtbi5udWxsYWJsZSA/IFwiXCIgOiBcIiBOT1QgTlVMTFwiO1xuICByZXR1cm4gYGF3YWl0IGtuZXgucmF3KFxcYEFMVEVSIFRBQkxFIFwiJHt0YWJsZX1cIiBBREQgQ09MVU1OIFwiJHtjb2x1bW4ubmFtZX1cIiAke3BnVHlwZX0gR0VORVJBVEVEIEFMV0FZUyBBUyAoJHtjb2x1bW4uZ2VuZXJhdGVkLmV4cHJlc3Npb259KSR7c3RvcmFnZVR5cGV9JHtudWxsYWJsZUNsYXVzZX1cXGApO2A7XG59XG5cbi8qKlxuICog7J2867CYIOy7rOufvCDsoJXsnZgg7IOd7ISxICh0YWJsZS54eHgoKSDssrTsnbgpXG4gKi9cbmZ1bmN0aW9uIGdlbk5vcm1hbENvbHVtbkRlZmluaXRpb24oY29sdW1uOiBNaWdyYXRpb25Db2x1bW4pOiBzdHJpbmcge1xuICBjb25zdCBjaGFpbnM6IHN0cmluZ1tdID0gW107XG5cbiAgaWYgKGNvbHVtbi5uYW1lID09PSBcImlkXCIpIHtcbiAgICAvLyBQSyDtg4DsnoXsl5Ag65Sw66W4IOu2hOq4sCDsspjrpqxcbiAgICBpZiAoY29sdW1uLnR5cGUgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgIC8vIHN0cmluZyBQSzogbGVuZ3Ro6rCAIOyeiOycvOuptCB2YXJjaGFyLCDsl4bsnLzrqbQgdGV4dFxuICAgICAgaWYgKGNvbHVtbi5sZW5ndGggIT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gYHRhYmxlLnN0cmluZygnaWQnLCAke2NvbHVtbi5sZW5ndGh9KS5wcmltYXJ5KCkubm90TnVsbGFibGUoKTtgO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGB0YWJsZS50ZXh0KCdpZCcpLnByaW1hcnkoKS5ub3ROdWxsYWJsZSgpO2A7XG4gICAgfVxuICAgIGlmIChjb2x1bW4udHlwZSA9PT0gXCJ1dWlkXCIpIHtcbiAgICAgIHJldHVybiBgdGFibGUudXVpZCgnaWQnKS5wcmltYXJ5KCkubm90TnVsbGFibGUoKTtgO1xuICAgIH1cbiAgICAvLyDquLDsobQgaW50ZWdlciBQSyAo6riw67O46rCSKVxuICAgIHJldHVybiBgdGFibGUuaW5jcmVtZW50cygpLnByaW1hcnkoKTtgO1xuICB9XG5cbiAgLy8g67Cw7Je0IO2DgOyehSDsspjrpqxcbiAgaWYgKGNvbHVtbi50eXBlLmVuZHNXaXRoKFwiW11cIikpIHtcbiAgICBjb25zdCBlbGVtZW50VHlwZSA9IGNvbHVtbi50eXBlLnNsaWNlKDAsIC0yKTsgLy8gXCJpbnRlZ2VyW11cIiAtPiBcImludGVnZXJcIlxuICAgIGNvbnN0IHBnVHlwZSA9IGdldFBnQXJyYXlUeXBlKGNvbHVtbiwgZWxlbWVudFR5cGUpO1xuICAgIGNoYWlucy5wdXNoKGBzcGVjaWZpY1R5cGUoJyR7Y29sdW1uLm5hbWV9JywgJyR7cGdUeXBlfScpYCk7XG4gIH0gZWxzZSBpZiAoY29sdW1uLnR5cGUgPT09IFwidmVjdG9yXCIpIHtcbiAgICAvLyBLbmV464qUIHZlY3RvciDtg4DsnoXsnYQg7KeB7KCRIOyngOybkO2VmOyngCDslYrsnLzrr4DroZwgc3BlY2lmaWNUeXBlIOyCrOyaqVxuICAgIGNoYWlucy5wdXNoKGBzcGVjaWZpY1R5cGUoJyR7Y29sdW1uLm5hbWV9JywgJ3ZlY3Rvcigke2NvbHVtbi5kaW1lbnNpb25zfSknKWApO1xuICB9IGVsc2UgaWYgKGNvbHVtbi50eXBlID09PSBcIm51bWJlck9yTnVtZXJpY1wiKSB7XG4gICAgLy8gbnVtYmVyXG4gICAgaWYgKGNvbHVtbi5udW1iZXJUeXBlID09PSBcInJlYWxcIikge1xuICAgICAgY2hhaW5zLnB1c2goYGZsb2F0KCcke2NvbHVtbi5uYW1lfScpYCk7XG4gICAgfSBlbHNlIGlmIChjb2x1bW4ubnVtYmVyVHlwZSA9PT0gXCJkb3VibGUgcHJlY2lzaW9uXCIpIHtcbiAgICAgIGNoYWlucy5wdXNoKGBkb3VibGUoJyR7Y29sdW1uLm5hbWV9JylgKTtcbiAgICB9IGVsc2UgaWYgKChjb2x1bW4ubnVtYmVyVHlwZSA/PyBcIm51bWVyaWNcIikgPT09IFwibnVtZXJpY1wiKSB7XG4gICAgICBjaGFpbnMucHVzaChgZGVjaW1hbCgnJHtjb2x1bW4ubmFtZX0nLCAke2NvbHVtbi5wcmVjaXNpb259LCAke2NvbHVtbi5zY2FsZX0pYCk7XG4gICAgfVxuICB9IGVsc2UgaWYgKGNvbHVtbi50eXBlID09PSBcInN0cmluZ1wiKSB7XG4gICAgLy8gc3RyaW5nXG4gICAgaWYgKGNvbHVtbi5sZW5ndGggIT09IHVuZGVmaW5lZCkge1xuICAgICAgY2hhaW5zLnB1c2goYHN0cmluZygnJHtjb2x1bW4ubmFtZX0nLCAke2NvbHVtbi5sZW5ndGh9KWApO1xuICAgIH0gZWxzZSB7XG4gICAgICBjaGFpbnMucHVzaChgdGV4dCgnJHtjb2x1bW4ubmFtZX0nKWApO1xuICAgIH1cbiAgfSBlbHNlIGlmIChjb2x1bW4udHlwZSA9PT0gXCJkYXRlXCIpIHtcbiAgICAvLyBkYXRlXG4gICAgY2hhaW5zLnB1c2goXG4gICAgICBgdGltZXN0YW1wKCcke2NvbHVtbi5uYW1lfScsIHsgdXNlVHo6IHRydWUsIHByZWNpc2lvbjogJHtjb2x1bW4ucHJlY2lzaW9uID8/IDN9IH0pYCxcbiAgICApO1xuICB9IGVsc2UgaWYgKGNvbHVtbi50eXBlID09PSBcImpzb25cIikge1xuICAgIC8vIGpzb25cbiAgICBjaGFpbnMucHVzaChganNvbmIoJyR7Y29sdW1uLm5hbWV9JylgKTtcbiAgfSBlbHNlIHtcbiAgICAvLyB0eXBlLCBsZW5ndGhcbiAgICBjaGFpbnMucHVzaChgJHtjb2x1bW4udHlwZX0oJyR7Y29sdW1uLm5hbWV9JyR7Y29sdW1uLmxlbmd0aCA/IGAsICR7Y29sdW1uLmxlbmd0aH1gIDogXCJcIn0pYCk7XG4gIH1cblxuICAvLyBudWxsYWJsZVxuICBjaGFpbnMucHVzaChjb2x1bW4ubnVsbGFibGUgPyBcIm51bGxhYmxlKClcIiA6IFwibm90TnVsbGFibGUoKVwiKTtcblxuICAvLyBkZWZhdWx0VG9cbiAgaWYgKGNvbHVtbi5kZWZhdWx0VG8gIT09IHVuZGVmaW5lZCkge1xuICAgIGlmIChpc1N0cmluZ1ZhbHVlKGNvbHVtbi5kZWZhdWx0VG8pICYmIGNvbHVtbi5kZWZhdWx0VG8uc3RhcnRzV2l0aChgXCJgKSkge1xuICAgICAgY2hhaW5zLnB1c2goYGRlZmF1bHRUbygke2NvbHVtbi5kZWZhdWx0VG99KWApO1xuICAgIH0gZWxzZSBpZiAoY29sdW1uLnR5cGUgPT09IFwianNvblwiICYmIGlzU3RyaW5nVmFsdWUoY29sdW1uLmRlZmF1bHRUbykpIHtcbiAgICAgIGNoYWlucy5wdXNoKGBkZWZhdWx0VG8oa25leC5yYXcoXCIke2NvbHVtbi5kZWZhdWx0VG8ucmVwbGFjZUFsbCgnXCInLCBcIidcIil9Ojpqc29uYlwiKSlgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY2hhaW5zLnB1c2goYGRlZmF1bHRUbyhrbmV4LnJhdygnJHtjb2x1bW4uZGVmYXVsdFRvfScpKWApO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBgdGFibGUuJHtjaGFpbnMuam9pbihcIi5cIil9O2A7XG59XG5cbi8qKlxuICogTWlncmF0aW9uQ29sdW1u7J2YIO2DgOyeheydhCBQb3N0Z3JlU1FMIO2DgOyehSDrrLjsnpDsl7TroZwg67OA7ZmYXG4gKi9cbmZ1bmN0aW9uIGdldFBnVHlwZUZvckNvbHVtbihjb2x1bW46IE1pZ3JhdGlvbkNvbHVtbik6IHN0cmluZyB7XG4gIGlmIChjb2x1bW4udHlwZS5lbmRzV2l0aChcIltdXCIpKSB7XG4gICAgY29uc3QgZWxlbWVudFR5cGUgPSBjb2x1bW4udHlwZS5zbGljZSgwLCAtMik7XG4gICAgcmV0dXJuIGdldFBnQXJyYXlUeXBlKGNvbHVtbiwgZWxlbWVudFR5cGUpO1xuICB9XG5cbiAgc3dpdGNoIChjb2x1bW4udHlwZSkge1xuICAgIGNhc2UgXCJzdHJpbmdcIjpcbiAgICAgIHJldHVybiBjb2x1bW4ubGVuZ3RoICE9PSB1bmRlZmluZWQgPyBgdmFyY2hhcigke2NvbHVtbi5sZW5ndGh9KWAgOiBcInRleHRcIjtcbiAgICBjYXNlIFwiYmlnSW50ZWdlclwiOlxuICAgICAgcmV0dXJuIFwiYmlnaW50XCI7XG4gICAgY2FzZSBcIm51bWJlck9yTnVtZXJpY1wiOlxuICAgICAgaWYgKGNvbHVtbi5udW1iZXJUeXBlID09PSBcInJlYWxcIikgcmV0dXJuIFwicmVhbFwiO1xuICAgICAgaWYgKGNvbHVtbi5udW1iZXJUeXBlID09PSBcImRvdWJsZSBwcmVjaXNpb25cIikgcmV0dXJuIFwiZG91YmxlIHByZWNpc2lvblwiO1xuICAgICAgcmV0dXJuIGBudW1lcmljKCR7Y29sdW1uLnByZWNpc2lvbn0sICR7Y29sdW1uLnNjYWxlfSlgO1xuICAgIGNhc2UgXCJkYXRlXCI6XG4gICAgICByZXR1cm4gXCJ0aW1lc3RhbXB0elwiO1xuICAgIGNhc2UgXCJqc29uXCI6XG4gICAgICByZXR1cm4gXCJqc29uYlwiO1xuICAgIGNhc2UgXCJ2ZWN0b3JcIjpcbiAgICAgIHJldHVybiBgdmVjdG9yKCR7Y29sdW1uLmRpbWVuc2lvbnN9KWA7XG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiBjb2x1bW4udHlwZTtcbiAgfVxufVxuXG5mdW5jdGlvbiBnZXRQZ0FycmF5VHlwZShjb2x1bW46IE1pZ3JhdGlvbkNvbHVtbiwgZWxlbWVudFR5cGU6IHN0cmluZyk6IHN0cmluZyB7XG4gIGlmIChlbGVtZW50VHlwZSA9PT0gXCJudW1iZXJPck51bWVyaWNcIikge1xuICAgIGlmIChjb2x1bW4ubnVtYmVyVHlwZSA9PT0gXCJyZWFsXCIpIHJldHVybiBcInJlYWxbXVwiO1xuICAgIGlmIChjb2x1bW4ubnVtYmVyVHlwZSA9PT0gXCJkb3VibGUgcHJlY2lzaW9uXCIpIHJldHVybiBcImRvdWJsZSBwcmVjaXNpb25bXVwiO1xuICAgIHJldHVybiBgbnVtZXJpYygke2NvbHVtbi5wcmVjaXNpb259LCAke2NvbHVtbi5zY2FsZX0pW11gO1xuICB9XG4gIGlmIChlbGVtZW50VHlwZSA9PT0gXCJzdHJpbmdcIikge1xuICAgIHJldHVybiBjb2x1bW4ubGVuZ3RoID8gYHZhcmNoYXIoJHtjb2x1bW4ubGVuZ3RofSlbXWAgOiBcInRleHRbXVwiO1xuICB9XG4gIGlmIChlbGVtZW50VHlwZSA9PT0gXCJkYXRlXCIpIHJldHVybiBcInRpbWVzdGFtcHR6W11cIjtcbiAgaWYgKGVsZW1lbnRUeXBlID09PSBcImludGVnZXJcIikgcmV0dXJuIFwiaW50ZWdlcltdXCI7XG4gIGlmIChlbGVtZW50VHlwZSA9PT0gXCJiaWdJbnRlZ2VyXCIpIHJldHVybiBcImJpZ2ludFtdXCI7XG4gIGlmIChlbGVtZW50VHlwZSA9PT0gXCJib29sZWFuXCIpIHJldHVybiBcImJvb2xlYW5bXVwiO1xuICBpZiAoZWxlbWVudFR5cGUgPT09IFwidXVpZFwiKSByZXR1cm4gXCJ1dWlkW11cIjtcbiAgaWYgKGVsZW1lbnRUeXBlID09PSBcImVudW1cIikgcmV0dXJuIFwidGV4dFtdXCI7XG4gIGlmIChlbGVtZW50VHlwZSA9PT0gXCJ2ZWN0b3JcIikgcmV0dXJuIGB2ZWN0b3IoJHtjb2x1bW4uZGltZW5zaW9uc30pW11gO1xuXG4gIHRocm93IG5ldyBFcnJvcihgVW5rbm93biBhcnJheSBlbGVtZW50IHR5cGU6ICR7ZWxlbWVudFR5cGV9YCk7XG59XG5cbi8qKlxuICog6rCc67OEIOyduOuNseyKpCDsoJXsnZgg7IOd7ISxXG4gKi9cbmZ1bmN0aW9uIGdlbkluZGV4RGVmaW5pdGlvbihpbmRleDogTWlncmF0aW9uSW5kZXgsIHRhYmxlOiBzdHJpbmcpOiBzdHJpbmcge1xuICBpZiAoaW5kZXgudHlwZSA9PT0gXCJobnN3XCIgfHwgaW5kZXgudHlwZSA9PT0gXCJpdmZmbGF0XCIpIHtcbiAgICByZXR1cm4gZ2VuVmVjdG9ySW5kZXhEZWZpbml0aW9uKGluZGV4LCB0YWJsZSk7XG4gIH1cblxuICBpZiAoaW5kZXgudXNpbmcgPT09IFwicGdyb29uZ2FcIikge1xuICAgIHJldHVybiBnZW5QZ3Jvb25nYUluZGV4RGVmaW5pdGlvbihpbmRleCwgdGFibGUpO1xuICB9XG5cbiAgY29uc3QgbWV0aG9kTWFwID0ge1xuICAgIGluZGV4OiBcIklOREVYXCIsXG4gICAgdW5pcXVlOiBcIlVOSVFVRSBJTkRFWFwiLFxuICB9O1xuXG4gIGNvbnN0IG51bGxzTm90RGlzdGluY3RDbGF1c2UgPVxuICAgIGluZGV4LnR5cGUgPT09IFwidW5pcXVlXCIgJiYgaW5kZXgubnVsbHNOb3REaXN0aW5jdCAhPT0gdW5kZWZpbmVkXG4gICAgICA/IGAgTlVMTFMgJHtpbmRleC5udWxsc05vdERpc3RpbmN0ID8gXCJOT1QgRElTVElOQ1RcIiA6IFwiRElTVElOQ1RcIn1gXG4gICAgICA6IFwiXCI7XG5cbiAgY29uc3QgdXNpbmdDbGF1c2UgPSBpbmRleC51c2luZyA9PT0gdW5kZWZpbmVkID8gXCJcIiA6IGBVU0lORyAke2luZGV4LnVzaW5nfWA7XG4gIGNvbnN0IHdoZXJlQ2xhdXNlID0gZ2V0SW5kZXhXaGVyZUNsYXVzZShpbmRleCk7XG5cbiAgcmV0dXJuIGBhd2FpdCBrbmV4LnJhdyhcbiAgXFxgQ1JFQVRFICR7bWV0aG9kTWFwW2luZGV4LnR5cGVdfSAke2luZGV4Lm5hbWV9IE9OICR7dGFibGV9ICR7dXNpbmdDbGF1c2V9KCR7aW5kZXguY29sdW1uc1xuICAgIC5tYXAoKGNvbCkgPT4ge1xuICAgICAgY29uc3Qgb3BjbGFzc0NsYXVzZSA9ICgoKSA9PiB7XG4gICAgICAgIGNvbnN0IG9wY2xhc3MgPSBnZXRJbmRleENvbHVtbk9wY2xhc3MoY29sKTtcbiAgICAgICAgcmV0dXJuIG9wY2xhc3MgPyBgICR7b3BjbGFzc31gIDogXCJcIjtcbiAgICAgIH0pKCk7XG5cbiAgICAgIC8vIOygleugrCDsmLXshZjsnYAgYnRyZWXrp4wg7IKs7JqpIOqwgOuKpVxuICAgICAgaWYgKGluZGV4LnVzaW5nICE9PSBcImJ0cmVlXCIgJiYgaW5kZXgudXNpbmcgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gYCR7Y29sLm5hbWV9JHtvcGNsYXNzQ2xhdXNlfWA7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHNvcnRPcmRlckNsYXVzZSA9IGNvbC5zb3J0T3JkZXIgPT09IHVuZGVmaW5lZCA/IFwiXCIgOiBgICR7Y29sLnNvcnRPcmRlcn1gO1xuICAgICAgY29uc3QgbnVsbHNGaXJzdENsYXVzZSA9XG4gICAgICAgIGNvbC5udWxsc0ZpcnN0ID09PSB1bmRlZmluZWQgPyBcIlwiIDogYCBOVUxMUyAke2NvbC5udWxsc0ZpcnN0ID8gXCJGSVJTVFwiIDogXCJMQVNUXCJ9YDtcbiAgICAgIHJldHVybiBgJHtjb2wubmFtZX0ke29wY2xhc3NDbGF1c2V9JHtzb3J0T3JkZXJDbGF1c2V9JHtudWxsc0ZpcnN0Q2xhdXNlfWA7XG4gICAgfSlcbiAgICAuam9pbihcIiwgXCIpfSkke251bGxzTm90RGlzdGluY3RDbGF1c2V9JHt3aGVyZUNsYXVzZX07XFxgXG4gICk7YDtcbn1cblxuZnVuY3Rpb24gZ2VuUGdyb29uZ2FJbmRleERlZmluaXRpb24oaW5kZXg6IE1pZ3JhdGlvbkluZGV4LCB0YWJsZTogc3RyaW5nKSB7XG4gIGNvbnN0IGVudGl0eSA9IEVudGl0eU1hbmFnZXIuZ2V0QnlUYWJsZSh0YWJsZSk7XG4gIGNvbnN0IHdoZXJlQ2xhdXNlID0gZ2V0SW5kZXhXaGVyZUNsYXVzZShpbmRleCk7XG5cbiAgLy8g67O17ZWpIOyduOuNseyKpOyduCDqsr3smrAgQVJSQVkg7IKs7JqpXG4gIGNvbnN0IGNvbHVtbkNsYXVzZSA9ICgoKSA9PiB7XG4gICAgaWYgKGluZGV4LmNvbHVtbnMubGVuZ3RoID09PSAxKSB7XG4gICAgICBjb25zdCBjb2x1bW4gPSBlbnRpdHkucHJvcHNEaWN0W2luZGV4LmNvbHVtbnNbMF0ubmFtZV07XG4gICAgICBjb25zdCBvcHRpb24gPSBnZXRQZ3Jvb25nYUNvbHVtbk9wdGlvbihjb2x1bW4pO1xuICAgICAgcmV0dXJuIGAke2luZGV4LmNvbHVtbnNbMF0ubmFtZX0ke29wdGlvbiA/IGAgJHtvcHRpb259YCA6IFwiXCJ9YDtcbiAgICB9XG5cbiAgICByZXR1cm4gYChBUlJBWVske2luZGV4LmNvbHVtbnMubWFwKChjb2wpID0+IGAke2NvbC5uYW1lfTo6dGV4dGApLmpvaW4oXCIsXCIpfV0pYDtcbiAgfSkoKTtcblxuICByZXR1cm4gYGF3YWl0IGtuZXgucmF3KFxuICBcXGBDUkVBVEUgSU5ERVggJHtpbmRleC5uYW1lfSBPTiAke3RhYmxlfSBVU0lORyBwZ3Jvb25nYSAoJHtjb2x1bW5DbGF1c2V9KSBXSVRIICh0b2tlbml6ZXI9J1Rva2VuTWVjYWInKSR7d2hlcmVDbGF1c2V9O1xcYFxuICApYDtcbn1cblxuLyoqXG4gKiBQR3Jvb25nYSDsu6zrn7wg7Ji17IWYIOy2lOy2nFxuICpcbiAqIEZ1bGxUZXh0IOyYpO2NvOugiOydtO2EsOulvCDsp4Dsm5DtlZjripQg6rK97JqwIOyasOyEoCDshKTsoJUsIOuCmOuouOyngOuKlCDrlJTtj7Ttirgg7J207JqpXG4gKiBAbGluayBodHRwczovL3Bncm9vbmdhLmdpdGh1Yi5pby9yZWZlcmVuY2VcbiAqL1xuZnVuY3Rpb24gZ2V0UGdyb29uZ2FDb2x1bW5PcHRpb24oY29sdW1uOiBFbnRpdHlQcm9wKSB7XG4gIGlmIChjb2x1bW4udHlwZSA9PT0gXCJzdHJpbmdcIiAmJiBjb2x1bW4ubGVuZ3RoICE9PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gXCJwZ3Jvb25nYV92YXJjaGFyX2Z1bGxfdGV4dF9zZWFyY2hfb3BzX3YyXCI7XG4gIH0gZWxzZSBpZiAoY29sdW1uLnR5cGUgPT09IFwianNvblwiKSB7XG4gICAgcmV0dXJuIFwicGdyb29uZ2FfanNvbmJfZnVsbF90ZXh0X3NlYXJjaF9vcHNfdjJcIjtcbiAgfVxuICByZXR1cm4gbnVsbDtcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb25cbiAqIC0gSE5TVyAoSGllcmFyY2hpY2FsIE5hdmlnYWJsZSBTbWFsbCBXb3JsZCk6IOuKkOumsCDruYzrk5wsIOu5oOuluCDqsoDsg4kg7IaN64+ELCDrhpLsnYAg66mU66qo66asIOuwjyDsoJXtmZXrj4RcbiAqIC0gSVZGRmxhdCAoSW52ZXJ0ZWQgRmlsZSB3aXRoIEZsYXQgQ29tcHJlc3Npb24pOiDruaDrpbgg67mM65OcLCDspJHqsIQg6rKA7IOJIOyGjeuPhCwg64Ku7J2AIOuplOuqqOumrFxuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBITlNXIOyduOuNseyKpCAo6raM7J6lIC0g67mg66W4IOqygOyDiSwg64aS7J2AIOygle2ZleuPhClcbiAqIENSRUFURSBJTkRFWCBpZHhfZW1iZWRkaW5nIE9OIGl0ZW1zIFVTSU5HIGhuc3cgKGVtYmVkZGluZyB2ZWN0b3JfY29zaW5lX29wcykgV0lUSCAobSA9IDE2LCBlZl9jb25zdHJ1Y3Rpb24gPSA2NCk7XG4gKlxuICogLy8gSVZGRmxhdCDsnbjrjbHsiqQgKOuMgOyaqeufiSDrjbDsnbTthLAsIOu5hOyaqSDspJHsmpQg7IucKVxuICogQ1JFQVRFIElOREVYIGlkeF9lbWJlZGRpbmcgT04gaXRlbXMgVVNJTkcgaXZmZmxhdCAoZW1iZWRkaW5nIHZlY3Rvcl9jb3NpbmVfb3BzKSBXSVRIIChsaXN0cyA9IDEwMCk7XG4gKi9cbmZ1bmN0aW9uIGdlblZlY3RvckluZGV4RGVmaW5pdGlvbihpbmRleDogTWlncmF0aW9uSW5kZXgsIHRhYmxlOiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCBjb2x1bW4gPSBpbmRleC5jb2x1bW5zWzBdO1xuICBjb25zdCB2ZWN0b3JPcHMgPSBnZXRJbmRleENvbHVtbk9wY2xhc3MoY29sdW1uKSA/PyBcInZlY3Rvcl9jb3NpbmVfb3BzXCI7XG4gIGNvbnN0IHdoZXJlQ2xhdXNlID0gZ2V0SW5kZXhXaGVyZUNsYXVzZShpbmRleCk7XG5cbiAgLy8gSE5TVyAoSGllcmFyY2hpY2FsIE5hdmlnYWJsZSBTbWFsbCBXb3JsZCkgLSDqtozsnqU6IOu5oOuluCDqsoDsg4ksIOuGkuydgCDsoJXtmZXrj4RcbiAgaWYgKGluZGV4LnR5cGUgPT09IFwiaG5zd1wiKSB7XG4gICAgY29uc3QgbSA9IGluZGV4Lm0gPz8gMTY7XG4gICAgY29uc3QgZWZDb25zdHJ1Y3Rpb24gPSBpbmRleC5lZkNvbnN0cnVjdGlvbiA/PyA2NDtcbiAgICByZXR1cm4gYGF3YWl0IGtuZXgucmF3KFxcYENSRUFURSBJTkRFWCAke2luZGV4Lm5hbWV9IE9OICR7dGFibGV9IFVTSU5HIGhuc3cgKCR7Y29sdW1uLm5hbWV9ICR7dmVjdG9yT3BzfSkgV0lUSCAobSA9ICR7bX0sIGVmX2NvbnN0cnVjdGlvbiA9ICR7ZWZDb25zdHJ1Y3Rpb259KSR7d2hlcmVDbGF1c2V9XFxgKTtgO1xuICB9XG5cbiAgLy8gSVZGRmxhdCAoSW52ZXJ0ZWQgRmlsZSB3aXRoIEZsYXQgQ29tcHJlc3Npb24pIC0g64yA7Jqp65+JLCDruYTsmqkg7KSR7JqUIOyLnFxuICBpZiAoaW5kZXgudHlwZSA9PT0gXCJpdmZmbGF0XCIpIHtcbiAgICBjb25zdCBsaXN0cyA9IGluZGV4Lmxpc3RzID8/IDEwMDtcbiAgICByZXR1cm4gYGF3YWl0IGtuZXgucmF3KFxcYENSRUFURSBJTkRFWCAke2luZGV4Lm5hbWV9IE9OICR7dGFibGV9IFVTSU5HIGl2ZmZsYXQgKCR7Y29sdW1uLm5hbWV9ICR7dmVjdG9yT3BzfSkgV0lUSCAobGlzdHMgPSAke2xpc3RzfSkke3doZXJlQ2xhdXNlfVxcYCk7YDtcbiAgfVxuXG4gIHRocm93IG5ldyBFcnJvcihgVW5rbm93biByYXcgU1FMIGluZGV4IHR5cGU6ICR7aW5kZXgudHlwZX1gKTtcbn1cblxuZnVuY3Rpb24gZ2V0SW5kZXhXaGVyZUNsYXVzZShpbmRleDogTWlncmF0aW9uSW5kZXgpOiBzdHJpbmcge1xuICBjb25zdCB3aGVyZSA9IG5vcm1hbGl6ZUluZGV4V2hlcmVQcmVkaWNhdGUoaW5kZXgud2hlcmUpO1xuICByZXR1cm4gd2hlcmUgPyBgIFdIRVJFICR7d2hlcmV9YCA6IFwiXCI7XG59XG5cbi8qKlxuICog7YWM7J2067iUIOyDneyEse2VmOuKlCDsvIDsnbTsiqQgLSBGSyDsg53shLFcbiAqL1xuYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVDcmVhdGVDb2RlX0ZvcmVpZ24oXG4gIHRhYmxlOiBzdHJpbmcsXG4gIGZvcmVpZ25zOiBNaWdyYXRpb25Gb3JlaWduW10sXG4pOiBQcm9taXNlPEdlbk1pZ3JhdGlvbkNvZGVbXT4ge1xuICBpZiAoZm9yZWlnbnMubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuIFtdO1xuICB9XG5cbiAgY29uc3QgeyB1cCwgZG93biB9ID0gZ2VuRm9yZWlnbkRlZmluaXRpb25zKHRhYmxlLCBmb3JlaWducyk7XG4gIGlmICh1cC5sZW5ndGggPT09IDAgJiYgZG93bi5sZW5ndGggPT09IDApIHtcbiAgICAvLyBmb3JlaWduc+qwgCDsnojripTrjbAg7IOd7ISx65CcIOy9lOuTnOqwgCDsl4bripQg6rK97Jqw64qUIOu5hOygleyDgeyggeyduCDsg4HtmansnbTsp4Drp4wsXG4gICAgLy8g66eI7J206re466CI7J207IWYIOyDneyEseydhCDspJHri6jsi5ztgqTsp4Ag7JWK6rOgIOu5iCDrsLDsl7TsnYQg67CY7ZmY7ZWp64uI64ukLlxuICAgIHJldHVybiBbXTtcbiAgfVxuXG4gIGNvbnN0IGxpbmVzOiBzdHJpbmdbXSA9IFtcbiAgICAnaW1wb3J0IHR5cGUgeyBLbmV4IH0gZnJvbSBcImtuZXhcIjsnLFxuICAgIFwiXCIsXG4gICAgXCJleHBvcnQgYXN5bmMgZnVuY3Rpb24gdXAoa25leDogS25leCk6IFByb21pc2U8dm9pZD4ge1wiLFxuICAgIGByZXR1cm4ga25leC5zY2hlbWEuYWx0ZXJUYWJsZShcIiR7dGFibGV9XCIsICh0YWJsZSkgPT4ge2AsXG4gICAgXCIvLyBjcmVhdGUgZmtcIixcbiAgICAuLi51cCxcbiAgICBcIn0pO1wiLFxuICAgIFwifVwiLFxuICAgIFwiXCIsXG4gICAgXCJleHBvcnQgYXN5bmMgZnVuY3Rpb24gZG93bihrbmV4OiBLbmV4KTogUHJvbWlzZTx2b2lkPiB7XCIsXG4gICAgYHJldHVybiBrbmV4LnNjaGVtYS5hbHRlclRhYmxlKFwiJHt0YWJsZX1cIiwgKHRhYmxlKSA9PiB7YCxcbiAgICBcIi8vIGRyb3AgZmtcIixcbiAgICAuLi5kb3duLFxuICAgIFwifSk7XCIsXG4gICAgXCJ9XCIsXG4gIF07XG5cbiAgY29uc3QgZm9yZWlnbktleXNTdHJpbmcgPSBmb3JlaWducy5tYXAoKGZvcmVpZ24pID0+IGZvcmVpZ24uY29sdW1ucy5qb2luKFwiX1wiKSkuam9pbihcIl9cIik7XG4gIHJldHVybiBbXG4gICAge1xuICAgICAgdGFibGUsXG4gICAgICB0eXBlOiBcImZvcmVpZ25cIixcbiAgICAgIHRpdGxlOiBgZm9yZWlnbl9fJHt0YWJsZX1fXyR7Zm9yZWlnbktleXNTdHJpbmd9YCxcbiAgICAgIGZvcm1hdHRlZDogYXdhaXQgZm9ybWF0Q29kZShsaW5lcy5qb2luKFwiXFxuXCIpLCBgc3JjL21pZ3JhdGlvbi8ke3RhYmxlfS50c2ApLFxuICAgIH0sXG4gIF07XG59XG5cbi8qKlxuICogTWlncmF0aW9uRm9yZWlnbltdIOydveyWtOyEnCDsmbjrtoDtgqQgY29uc3RyYWludCDsoJXsnZjtlZjripQg6rWs66y4IOyDneyEsVxuICovXG5mdW5jdGlvbiBnZW5Gb3JlaWduRGVmaW5pdGlvbnMoXG4gIHRhYmxlOiBzdHJpbmcsXG4gIGZvcmVpZ25zOiBNaWdyYXRpb25Gb3JlaWduW10sXG4pOiB7IHVwOiBzdHJpbmdbXTsgZG93bjogc3RyaW5nW10gfSB7XG4gIHJldHVybiBmb3JlaWducy5yZWR1Y2UoXG4gICAgKHIsIGZvcmVpZ24pID0+IHtcbiAgICAgIGNvbnN0IGNvbHVtbnNTdHJpbmdRdW90ZSA9IGZvcmVpZ24uY29sdW1uc1xuICAgICAgICAubWFwKChjb2wpID0+IGAnJHtjb2wucmVwbGFjZShgJHt0YWJsZX0uYCwgXCJcIil9J2ApXG4gICAgICAgIC5qb2luKFwiLFwiKTtcbiAgICAgIHIudXAucHVzaChcbiAgICAgICAgYHRhYmxlLmZvcmVpZ24oJyR7Zm9yZWlnbi5jb2x1bW5zLmpvaW4oXCIsXCIpfScpXG4gICAgICAgICAgICAucmVmZXJlbmNlcygnJHtmb3JlaWduLnRvfScpXG4gICAgICAgICAgICAub25VcGRhdGUoJyR7Zm9yZWlnbi5vblVwZGF0ZX0nKVxuICAgICAgICAgICAgLm9uRGVsZXRlKCcke2ZvcmVpZ24ub25EZWxldGV9JylgLFxuICAgICAgKTtcbiAgICAgIHIuZG93bi5wdXNoKGB0YWJsZS5kcm9wRm9yZWlnbihbJHtjb2x1bW5zU3RyaW5nUXVvdGV9XSlgKTtcbiAgICAgIHJldHVybiByO1xuICAgIH0sXG4gICAge1xuICAgICAgdXA6IC8qIFNBRkVUWTogS25leOyZgCBQb3N0Z3JlU1FMIOyKpO2CpOuniCDsobDtmowg6rOE7JW97J20IOydtCDqsJLsnZgg7YOA7J6F7J2EIOuztOyepe2VnOuLpC4gKi8gW10gYXMgc3RyaW5nW10sXG4gICAgICBkb3duOiAvKiBTQUZFVFk6IEtuZXjsmYAgUG9zdGdyZVNRTCDsiqTtgqTrp4gg7KGw7ZqMIOqzhOyVveydtCDsnbQg6rCS7J2YIO2DgOyeheydhCDrs7TsnqXtlZzri6QuICovIFtdIGFzIHN0cmluZ1tdLFxuICAgIH0sXG4gICk7XG59XG5cbi8qKlxuICog7YWM7J2067iUIOuzgOqyvSDsvIDsnbTsiqQgLSDsu6zrn7wv7J24642x7IqkIOuzgOqyvVxuICovXG5hc3luYyBmdW5jdGlvbiBnZW5lcmF0ZUFsdGVyQ29kZV9Db2x1bW5BbmRJbmRleGVzKFxuICB0YWJsZTogc3RyaW5nLFxuICBlbnRpdHlDb2x1bW5zOiBNaWdyYXRpb25Db2x1bW5bXSxcbiAgZW50aXR5SW5kZXhlczogTWlncmF0aW9uSW5kZXhbXSxcbiAgZGJDb2x1bW5zOiBNaWdyYXRpb25Db2x1bW5bXSxcbiAgZGJJbmRleGVzOiBNaWdyYXRpb25JbmRleFtdLFxuICBkYkZvcmVpZ25zOiBNaWdyYXRpb25Gb3JlaWduW10sXG4gIGNvbXBhcmVEQj86IEtuZXgsXG4pOiBQcm9taXNlPEdlbk1pZ3JhdGlvbkNvZGVbXT4ge1xuICBjb25zdCByZXNvbHZlZEVudGl0eUNvbHVtbnMgPSByZXNvbHZlU2VhcmNoVGV4dENvbHVtbnModGFibGUsIGVudGl0eUNvbHVtbnMpO1xuICBjb25zdCBzZWFyY2hUZXh0Q29sdW1uTmFtZXMgPSBnZXRTZWFyY2hUZXh0Q29sdW1uTmFtZXModGFibGUpO1xuICAvKlxuICAgIOyEuOu2gCDruYTqtZAg7ZuEIOuLpOuluOygkCDssL7slYTshJwg7L2U65OcIOyDneyEsVxuXG4gICAgMS4g7Lus65+86rCv7IiYIOuLpOumhDogTUTsl5Ag7J6I7Jy864KYLCBEQuyXkCDsl4bri6TrqbQg7LaU6rCAXG4gICAgMi4g7Lus65+86rCv7IiYIOuLpOumhDogTUTsl5Ag7JeG7Jy864KYLCBEQuyXkCDsnojri6TrqbQg7IKt7KCcXG4gICAgMy4g6re47Jm4IOy7rOufvCjsu6zrn7wg6rCv7IiY6rCAIOuPmeydvO2VmOqxsOuCmCwg64uk66W4IOqyveyasCDrj5nsnbztlZwg7Lus65+864G866asKSA9PiBhbHRlclxuICAgIDQuIOuLpOuluOqxsCDri6Qg64+Z7J287ZWY6rOgIGluZGV466eMIOuzgOqyveuQmOuKlCDqsr3smrBcblxuICAgICoqIOy7rOufvOuqheydhCDrs4Dqsr3tlZjripQg6rK97Jqw64qUIOuUsOuhnCDtlbjrk6Trp4HtlZjsp4Ag7JWK7J2MXG4gICAgPT4gZHJvcC9hZGQg7ZiV7YOc7J2YIOuniOydtOq3uOugiOydtOyFmCDsvZTrk5zqsIAg7IOd7ISx65CY64qU642wLCDsiJjrj5nsnLzroZwgcmVuYW1lIOy9lOuTnOuhnCDsiJjsoJXtlZjsl6wg7LKY66asXG4gICovXG5cbiAgLy8gUEsoaWQpIOy7rOufvCDtg4DsnoUg67OA6rK9IOqwkOyngCDrsI8g7LKY66asXG4gIGNvbnN0IGVudGl0eUlkQ29sID0gcmVzb2x2ZWRFbnRpdHlDb2x1bW5zLmZpbmQoKGNvbCkgPT4gY29sLm5hbWUgPT09IFwiaWRcIik7XG4gIGNvbnN0IGRiSWRDb2wgPSBkYkNvbHVtbnMuZmluZCgoY29sKSA9PiBjb2wubmFtZSA9PT0gXCJpZFwiKTtcblxuICBpZiAoZW50aXR5SWRDb2wgJiYgZGJJZENvbCAmJiBjb21wYXJlREIpIHtcbiAgICBjb25zdCBpc1BrVHlwZUNoYW5nZWQgPVxuICAgICAgZW50aXR5SWRDb2wudHlwZSAhPT0gZGJJZENvbC50eXBlIHx8IGVudGl0eUlkQ29sLmxlbmd0aCAhPT0gZGJJZENvbC5sZW5ndGg7XG5cbiAgICBpZiAoaXNQa1R5cGVDaGFuZ2VkKSB7XG4gICAgICByZXR1cm4gZ2VuZXJhdGVQa1R5cGVDaGFuZ2VNaWdyYXRpb24oXG4gICAgICAgIHRhYmxlLFxuICAgICAgICBlbnRpdHlJZENvbCxcbiAgICAgICAgZGJJZENvbCxcbiAgICAgICAgcmVzb2x2ZWRFbnRpdHlDb2x1bW5zLFxuICAgICAgICBlbnRpdHlJbmRleGVzLFxuICAgICAgICBkYkNvbHVtbnMsXG4gICAgICAgIGRiSW5kZXhlcyxcbiAgICAgICAgZGJGb3JlaWducyxcbiAgICAgICAgY29tcGFyZURCLFxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICAvLyDqsIEg7Lus65+8IOydtOumhCDquLDspIDsnLzroZwgYWRkLCBkcm9wLCBhbHRlciDsl6zrtoAg7ZmV7J24XG4gIGNvbnN0IGFsdGVyQ29sdW1uc1RvID0gZ2V0QWx0ZXJDb2x1bW5zVG8ocmVzb2x2ZWRFbnRpdHlDb2x1bW5zLCBkYkNvbHVtbnMsIHNlYXJjaFRleHRDb2x1bW5OYW1lcyk7XG5cbiAgLy8g7LaU7Lac65CcIOy7rOufvOuTpOydhCDquLDspIDsnLzroZwg6rCB6rCBIOudvOyduCDsg53shLFcbiAgY29uc3QgYWx0ZXJDb2x1bW5MaW5lc1RvID0gZ2V0QWx0ZXJDb2x1bW5MaW5lc1RvKFxuICAgIGFsdGVyQ29sdW1uc1RvLFxuICAgIHJlc29sdmVkRW50aXR5Q29sdW1ucyxcbiAgICB0YWJsZSxcbiAgICBkYkZvcmVpZ25zLFxuICApO1xuXG4gIC8vIOyduOuNseyKpOydmCBhZGQsIGRyb3Ag7Jes67aAIO2ZleyduFxuICBjb25zdCBhbHRlckluZGV4ZXNUbyA9IGdldEFsdGVySW5kZXhlc1RvKGVudGl0eUluZGV4ZXMsIGRiSW5kZXhlcyk7XG4gIGNvbnN0IHJlY3JlYXRlZFNlYXJjaFRleHRDb2x1bW5OYW1lcyA9IG5ldyBTZXQoXG4gICAgYWx0ZXJDb2x1bW5zVG8uYWx0ZXJcbiAgICAgIC5maWx0ZXIoKGRiQ29sdW1uKSA9PiB7XG4gICAgICAgIGNvbnN0IGVudGl0eUNvbHVtbiA9IHJlc29sdmVkRW50aXR5Q29sdW1ucy5maW5kKChjb2wpID0+IGNvbC5uYW1lID09PSBkYkNvbHVtbi5uYW1lKTtcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICBzZWFyY2hUZXh0Q29sdW1uTmFtZXMuaGFzKGRiQ29sdW1uLm5hbWUpICYmXG4gICAgICAgICAgZGJDb2x1bW4uZ2VuZXJhdGVkICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICAgICBlbnRpdHlDb2x1bW4/LmdlbmVyYXRlZCAhPT0gdW5kZWZpbmVkXG4gICAgICAgICk7XG4gICAgICB9KVxuICAgICAgLm1hcCgoY29sdW1uKSA9PiBjb2x1bW4ubmFtZSksXG4gICk7XG4gIGNvbnN0IHJlY3JlYXRlZFNlYXJjaFRleHREYkluZGV4ZXMgPSBkYkluZGV4ZXMuZmlsdGVyKFxuICAgIChpbmRleCkgPT5cbiAgICAgIGluZGV4LmNvbHVtbnMuc29tZSgoeyBuYW1lIH0pID0+IHJlY3JlYXRlZFNlYXJjaFRleHRDb2x1bW5OYW1lcy5oYXMobmFtZSkpICYmXG4gICAgICAhYWx0ZXJJbmRleGVzVG8uZHJvcC5zb21lKChkcm9wSW5kZXgpID0+IGRyb3BJbmRleC5uYW1lID09PSBpbmRleC5uYW1lKSxcbiAgKTtcbiAgY29uc3QgcmVjcmVhdGVkU2VhcmNoVGV4dEVudGl0eUluZGV4ZXMgPSBlbnRpdHlJbmRleGVzLmZpbHRlcihcbiAgICAoaW5kZXgpID0+XG4gICAgICBpbmRleC5jb2x1bW5zLnNvbWUoKHsgbmFtZSB9KSA9PiByZWNyZWF0ZWRTZWFyY2hUZXh0Q29sdW1uTmFtZXMuaGFzKG5hbWUpKSAmJlxuICAgICAgIWFsdGVySW5kZXhlc1RvLmFkZC5zb21lKChhZGRJbmRleCkgPT4gYWRkSW5kZXgubmFtZSA9PT0gaW5kZXgubmFtZSksXG4gICk7XG4gIGNvbnN0IGltcGxpY2l0bHlEcm9wcGVkRGJJbmRleGVzID0gYWx0ZXJJbmRleGVzVG8uZHJvcC5maWx0ZXIoKGluZGV4KSA9PlxuICAgIGluZGV4LmNvbHVtbnMuZXZlcnkoKHsgbmFtZSB9KSA9PiBhbHRlckNvbHVtbnNUby5kcm9wLnNvbWUoKGNvbHVtbikgPT4gY29sdW1uLm5hbWUgPT09IG5hbWUpKSxcbiAgKTtcblxuICAvLyDsnbjrjbHsiqTqsIAg7IKt7KCc65CY64qUIOqyveyasCwg7Lus65+86rO8IOqwmeydtCDsgq3soJzrkJwg7LyA7J207Iqk7JeQ64qUIGRyb3Dsl5DshJwg7KCc7Jm47ZW07JW87ZWoIVxuICBjb25zdCBpbmRleE5lZWRzVG9Ecm9wID0gYWx0ZXJJbmRleGVzVG8uZHJvcC5maWx0ZXIoXG4gICAgKGluZGV4KSA9PiAhaW1wbGljaXRseURyb3BwZWREYkluZGV4ZXMuc29tZSgoZHJvcHBlZEluZGV4KSA9PiBkcm9wcGVkSW5kZXgubmFtZSA9PT0gaW5kZXgubmFtZSksXG4gICk7XG5cbiAgLy8g67mIIOy9lOuTnCDsg53shLEg67Cp7KeAXG4gIGNvbnN0IGhhc1VwQ2hhbmdlcyA9XG4gICAgYWx0ZXJDb2x1bW5MaW5lc1RvLmFkZC51cC5idWlsZGVyLmxlbmd0aCA+IDAgfHxcbiAgICBhbHRlckNvbHVtbkxpbmVzVG8uYWRkLnVwLnJhdy5sZW5ndGggPiAwIHx8XG4gICAgYWx0ZXJDb2x1bW5MaW5lc1RvLmRyb3AudXAuYnVpbGRlci5sZW5ndGggPiAwIHx8XG4gICAgYWx0ZXJDb2x1bW5MaW5lc1RvLmFsdGVyLnVwLmJ1aWxkZXIubGVuZ3RoID4gMCB8fFxuICAgIGFsdGVyQ29sdW1uTGluZXNUby5hbHRlci51cC5yYXcubGVuZ3RoID4gMCB8fFxuICAgIGFsdGVySW5kZXhlc1RvLmFkZC5sZW5ndGggPiAwIHx8XG4gICAgaW5kZXhOZWVkc1RvRHJvcC5sZW5ndGggPiAwIHx8XG4gICAgcmVjcmVhdGVkU2VhcmNoVGV4dERiSW5kZXhlcy5sZW5ndGggPiAwO1xuICBpZiAoIWhhc1VwQ2hhbmdlcykge1xuICAgIC8vIOuzgOqyveyCrO2VreydtCDsl4bsnLzrqbQg67mIIOuwsOyXtCDrsJjtmZhcbiAgICByZXR1cm4gW107XG4gIH1cbiAgTmFpdGUudChcIm1pZ3JhdG9yOmdlbmVyYXRlQWx0ZXJDb2RlX0NvbHVtbkFuZEluZGV4ZXM6ZGVidWdcIiwge1xuICAgIFwiYWx0ZXJDb2x1bW5zVG8uYWRkLmxlbmd0aFwiOiBhbHRlckNvbHVtbnNUby5hZGQubGVuZ3RoLFxuICAgIFwiYWx0ZXJDb2x1bW5zVG8uZHJvcC5sZW5ndGhcIjogYWx0ZXJDb2x1bW5zVG8uZHJvcC5sZW5ndGgsXG4gICAgXCJhbHRlckNvbHVtbnNUby5hbHRlci5sZW5ndGhcIjogYWx0ZXJDb2x1bW5zVG8uYWx0ZXIubGVuZ3RoLFxuICAgIFwiYWx0ZXJJbmRleGVzVG8uYWRkLmxlbmd0aFwiOiBhbHRlckluZGV4ZXNUby5hZGQubGVuZ3RoLFxuICAgIFwiYWx0ZXJJbmRleGVzVG8uZHJvcC5sZW5ndGhcIjogYWx0ZXJJbmRleGVzVG8uZHJvcC5sZW5ndGgsXG4gICAgXCJpbmRleE5lZWRzVG9Ecm9wLmxlbmd0aFwiOiBpbmRleE5lZWRzVG9Ecm9wLmxlbmd0aCxcbiAgfSk7XG4gIC8vIE5haXRlLnQoXCJtaWdyYXRvcjpnZW5lcmF0ZUFsdGVyQ29kZV9Db2x1bW5BbmRJbmRleGVzOmFsdGVyQ29sdW1uc1RvXCIsIGFsdGVyQ29sdW1uc1RvKTtcblxuICAvLyBUT0RPOiDsnbjrjbHsiqTrqoUg67OA6rK965CcIOqyveyasCDsspjrpqxcblxuICAvLyB0YWJsZSBidWlsZGVyIOuplOyEnOuTnOuhnCDsi6TtlontlaAg7L2U65OcIChkcm9wIOKGkiBhZGQg4oaSIGFsdGVyIOyInOyEnClcbiAgY29uc3QgdXBCdWlsZGVyTGluZXMgPSBbXG4gICAgLi4uKGFsdGVyQ29sdW1uTGluZXNUby5kcm9wLnVwLmJ1aWxkZXIubGVuZ3RoID4gMCA/IGFsdGVyQ29sdW1uTGluZXNUby5kcm9wLnVwLmJ1aWxkZXIgOiBbXSksXG4gICAgLi4uKGFsdGVyQ29sdW1uTGluZXNUby5hZGQudXAuYnVpbGRlci5sZW5ndGggPiAwID8gYWx0ZXJDb2x1bW5MaW5lc1RvLmFkZC51cC5idWlsZGVyIDogW10pLFxuICAgIC4uLnJlY3JlYXRlZFNlYXJjaFRleHREYkluZGV4ZXMubWFwKGdlbkluZGV4RHJvcERlZmluaXRpb24pLFxuICAgIC4uLihhbHRlckNvbHVtbkxpbmVzVG8uYWx0ZXIudXAuYnVpbGRlci5sZW5ndGggPiAwID8gYWx0ZXJDb2x1bW5MaW5lc1RvLmFsdGVyLnVwLmJ1aWxkZXIgOiBbXSksXG4gICAgLi4uaW5kZXhOZWVkc1RvRHJvcC5tYXAoZ2VuSW5kZXhEcm9wRGVmaW5pdGlvbiksXG4gIF07XG5cbiAgLy8ga25leC5yYXcoKeuhnCDsi6TtlontlaAg7L2U65OcXG4gIGNvbnN0IHVwUmF3TGluZXMgPSBbXG4gICAgLi4uKGFsdGVyQ29sdW1uTGluZXNUby5hZGQudXAucmF3Lmxlbmd0aCA+IDAgPyBhbHRlckNvbHVtbkxpbmVzVG8uYWRkLnVwLnJhdyA6IFtdKSxcbiAgICAuLi4oYWx0ZXJDb2x1bW5MaW5lc1RvLmFsdGVyLnVwLnJhdy5sZW5ndGggPiAwID8gYWx0ZXJDb2x1bW5MaW5lc1RvLmFsdGVyLnVwLnJhdyA6IFtdKSxcbiAgICAuLi5yZWNyZWF0ZWRTZWFyY2hUZXh0RW50aXR5SW5kZXhlcy5tYXAoKGluZGV4KSA9PiBnZW5JbmRleERlZmluaXRpb24oaW5kZXgsIHRhYmxlKSksXG4gICAgLi4uYWx0ZXJJbmRleGVzVG8uYWRkLm1hcCgoaW5kZXgpID0+IGdlbkluZGV4RGVmaW5pdGlvbihpbmRleCwgdGFibGUpKSxcbiAgXTtcblxuICAvLyBkb3du7J2AIHVw7J2YIOyXreyInCAoYWRkLmRvd24gPSBkcm9wIHJvbGxiYWNrLCBkcm9wLmRvd24gPSBhZGQgcm9sbGJhY2spXG4gIGNvbnN0IGRvd25CdWlsZGVyTGluZXMgPSBbXG4gICAgLi4uKGFsdGVyQ29sdW1uTGluZXNUby5hZGQuZG93bi5idWlsZGVyLmxlbmd0aCA+IDAgPyBhbHRlckNvbHVtbkxpbmVzVG8uYWRkLmRvd24uYnVpbGRlciA6IFtdKSxcbiAgICAuLi5yZWNyZWF0ZWRTZWFyY2hUZXh0RW50aXR5SW5kZXhlcy5tYXAoZ2VuSW5kZXhEcm9wRGVmaW5pdGlvbiksXG4gICAgLi4uKGFsdGVyQ29sdW1uTGluZXNUby5hbHRlci5kb3duLmJ1aWxkZXIubGVuZ3RoID4gMFxuICAgICAgPyBhbHRlckNvbHVtbkxpbmVzVG8uYWx0ZXIuZG93bi5idWlsZGVyXG4gICAgICA6IFtdKSxcbiAgICAuLi4oYWx0ZXJDb2x1bW5MaW5lc1RvLmRyb3AuZG93bi5idWlsZGVyLmxlbmd0aCA+IDBcbiAgICAgID8gYWx0ZXJDb2x1bW5MaW5lc1RvLmRyb3AuZG93bi5idWlsZGVyXG4gICAgICA6IFtdKSxcbiAgICAuLi5hbHRlckluZGV4ZXNUby5hZGRcbiAgICAgIC5maWx0ZXIoXG4gICAgICAgIChpbmRleCkgPT5cbiAgICAgICAgICAhaW5kZXguY29sdW1ucy5ldmVyeSgoaW5kZXhDb2wpID0+XG4gICAgICAgICAgICBhbHRlckNvbHVtbnNUby5hZGQubWFwKChjb2wpID0+IGNvbC5uYW1lKS5pbmNsdWRlcyhpbmRleENvbC5uYW1lKSxcbiAgICAgICAgICApLFxuICAgICAgKVxuICAgICAgLm1hcChnZW5JbmRleERyb3BEZWZpbml0aW9uKSxcbiAgXTtcblxuICBjb25zdCBkb3duUmF3TGluZXMgPSBbXG4gICAgLi4uKGFsdGVyQ29sdW1uTGluZXNUby5kcm9wLmRvd24ucmF3Lmxlbmd0aCA+IDAgPyBhbHRlckNvbHVtbkxpbmVzVG8uZHJvcC5kb3duLnJhdyA6IFtdKSxcbiAgICAuLi4oYWx0ZXJDb2x1bW5MaW5lc1RvLmFsdGVyLmRvd24ucmF3Lmxlbmd0aCA+IDAgPyBhbHRlckNvbHVtbkxpbmVzVG8uYWx0ZXIuZG93bi5yYXcgOiBbXSksXG4gICAgLi4ucmVjcmVhdGVkU2VhcmNoVGV4dERiSW5kZXhlcy5tYXAoKGluZGV4KSA9PiBnZW5JbmRleERlZmluaXRpb24oaW5kZXgsIHRhYmxlKSksXG4gICAgLi4uaW1wbGljaXRseURyb3BwZWREYkluZGV4ZXMubWFwKChpbmRleCkgPT4gZ2VuSW5kZXhEZWZpbml0aW9uKGluZGV4LCB0YWJsZSkpLFxuICAgIC4uLmluZGV4TmVlZHNUb0Ryb3AubWFwKChpbmRleCkgPT4gZ2VuSW5kZXhEZWZpbml0aW9uKGluZGV4LCB0YWJsZSkpLFxuICBdO1xuXG4gIGNvbnN0IGxpbmVzOiBzdHJpbmdbXSA9IFtcbiAgICAnaW1wb3J0IHR5cGUgeyBLbmV4IH0gZnJvbSBcImtuZXhcIjsnLFxuICAgIFwiXCIsXG4gICAgXCJleHBvcnQgYXN5bmMgZnVuY3Rpb24gdXAoa25leDogS25leCk6IFByb21pc2U8dm9pZD4ge1wiLFxuICAgIC4uLih1cEJ1aWxkZXJMaW5lcy5sZW5ndGggPiAwXG4gICAgICA/IFtgYXdhaXQga25leC5zY2hlbWEuYWx0ZXJUYWJsZShcIiR7dGFibGV9XCIsICh0YWJsZSkgPT4ge2AsIC4uLnVwQnVpbGRlckxpbmVzLCBcIn0pO1wiXVxuICAgICAgOiBbXSksXG4gICAgLi4udXBSYXdMaW5lcyxcbiAgICBcIn1cIixcbiAgICBcIlwiLFxuICAgIFwiZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGRvd24oa25leDogS25leCk6IFByb21pc2U8dm9pZD4ge1wiLFxuICAgIC4uLihkb3duQnVpbGRlckxpbmVzLmxlbmd0aCA+IDBcbiAgICAgID8gW2Bhd2FpdCBrbmV4LnNjaGVtYS5hbHRlclRhYmxlKFwiJHt0YWJsZX1cIiwgKHRhYmxlKSA9PiB7YCwgLi4uZG93bkJ1aWxkZXJMaW5lcywgXCJ9KTtcIl1cbiAgICAgIDogW10pLFxuICAgIC4uLmRvd25SYXdMaW5lcyxcbiAgICBcIn1cIixcbiAgXTtcblxuICBjb25zdCBmb3JtYXR0ZWQgPSBhd2FpdCBmb3JtYXRDb2RlKGxpbmVzLmpvaW4oXCJcXG5cIiksIGBzcmMvbWlncmF0aW9uLyR7dGFibGV9LnRzYCk7XG4gIGNvbnN0IHRpdGxlID0gW1xuICAgIFwiYWx0ZXJcIixcbiAgICB0YWJsZSxcbiAgICAuLi4oW1wiYWRkXCIsIFwiZHJvcFwiLCBcImFsdGVyXCJdIGFzIGNvbnN0KVxuICAgICAgLm1hcCgoYWN0aW9uKSA9PiB7XG4gICAgICAgIGNvbnN0IGxlbiA9IGFsdGVyQ29sdW1uc1RvW2FjdGlvbl0ubGVuZ3RoO1xuICAgICAgICBpZiAobGVuID4gMCkge1xuICAgICAgICAgIHJldHVybiBhY3Rpb24gKyBsZW47XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9KVxuICAgICAgLmZpbHRlcigocGFydCkgPT4gcGFydCAhPT0gbnVsbCksXG4gIF0uam9pbihcIl9cIik7XG5cbiAgcmV0dXJuIFtcbiAgICB7XG4gICAgICB0YWJsZSxcbiAgICAgIHRpdGxlLFxuICAgICAgZm9ybWF0dGVkLFxuICAgICAgdHlwZTogXCJub3JtYWxcIixcbiAgICB9LFxuICBdO1xufVxuXG4vKipcbiAqIOy7rOufvCDruYTqtZDrpbwg7JyE7ZW0IEdlbmVyYXRlZCBDb2x1bW7snZggZXhwcmVzc2lvbuydhCDsoJzsmbjtlZwg6rCd7LK066W8IOyDneyEsVxuICovXG5mdW5jdGlvbiBub3JtYWxpemVDb2x1bW5Gb3JDb21wYXJpc29uKFxuICBjb2w6IE1pZ3JhdGlvbkNvbHVtbixcbiAgc2VhcmNoVGV4dENvbHVtbk5hbWVzOiBTZXQ8c3RyaW5nPixcbik6IE1pZ3JhdGlvbkNvbHVtbiB7XG4gIGlmICghY29sLmdlbmVyYXRlZCkge1xuICAgIHJldHVybiBjb2w7XG4gIH1cblxuICBpZiAoIXNlYXJjaFRleHRDb2x1bW5OYW1lcy5oYXMoY29sLm5hbWUpKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLmNvbCxcbiAgICAgIGdlbmVyYXRlZDogdW5kZWZpbmVkLFxuICAgIH07XG4gIH1cblxuICByZXR1cm4ge1xuICAgIC4uLmNvbCxcbiAgICBnZW5lcmF0ZWQ6IHtcbiAgICAgIC4uLmNvbC5nZW5lcmF0ZWQsXG4gICAgICBleHByZXNzaW9uOiBjYW5vbmljYWxpemVTZWFyY2hUZXh0R2VuZXJhdGVkRXhwcmVzc2lvbihjb2wuZ2VuZXJhdGVkLmV4cHJlc3Npb24pLFxuICAgIH0sXG4gIH07XG59XG5cbi8qKlxuICog6rCBIOy7rOufvCDsnbTrpoQg6riw7KSA7Jy866GcIGFkZCwgZHJvcCwgYWx0ZXIg7Jes67aAIO2ZleyduFxuICovXG5mdW5jdGlvbiBnZXRBbHRlckNvbHVtbnNUbyhcbiAgZW50aXR5Q29sdW1uczogTWlncmF0aW9uQ29sdW1uW10sXG4gIGRiQ29sdW1uczogTWlncmF0aW9uQ29sdW1uW10sXG4gIHNlYXJjaFRleHRDb2x1bW5OYW1lczogU2V0PHN0cmluZz4sXG4pIHtcbiAgY29uc3QgY29sdW1uc1RvID0ge1xuICAgIGFkZDogLyogU0FGRVRZOiBLbmV47JmAIFBvc3RncmVTUUwg7Iqk7YKk66eIIOyhsO2ajCDqs4Tslb3snbQg7J20IOqwkuydmCDtg4DsnoXsnYQg67O07J6l7ZWc64ukLiAqLyBbXSBhcyBNaWdyYXRpb25Db2x1bW5bXSxcbiAgICBkcm9wOiAvKiBTQUZFVFk6IEtuZXjsmYAgUG9zdGdyZVNRTCDsiqTtgqTrp4gg7KGw7ZqMIOqzhOyVveydtCDsnbQg6rCS7J2YIO2DgOyeheydhCDrs7TsnqXtlZzri6QuICovIFtdIGFzIE1pZ3JhdGlvbkNvbHVtbltdLFxuICAgIGFsdGVyOlxuICAgICAgLyogU0FGRVRZOiBLbmV47JmAIFBvc3RncmVTUUwg7Iqk7YKk66eIIOyhsO2ajCDqs4Tslb3snbQg7J20IOqwkuydmCDtg4DsnoXsnYQg67O07J6l7ZWc64ukLiAqLyBbXSBhcyBNaWdyYXRpb25Db2x1bW5bXSxcbiAgfTtcblxuICAvLyDsu6zrn7zrqoUg6riw7KSAIOu5hOq1kFxuICBjb25zdCBleHRyYUNvbHVtbnMgPSB7XG4gICAgZGI6IGRpZmYoZGJDb2x1bW5zLCBlbnRpdHlDb2x1bW5zLCAoY29sKSA9PiBbY29sLm5hbWUsIGNvbC5nZW5lcmF0ZWQ/LnR5cGVdLmpvaW4oXCIvLy9cIikpLFxuICAgIGVudGl0eTogZGlmZihlbnRpdHlDb2x1bW5zLCBkYkNvbHVtbnMsIChjb2wpID0+IFtjb2wubmFtZSwgY29sLmdlbmVyYXRlZD8udHlwZV0uam9pbihcIi8vL1wiKSksXG4gIH07XG4gIGlmIChleHRyYUNvbHVtbnMuZW50aXR5Lmxlbmd0aCA+IDApIHtcbiAgICBjb2x1bW5zVG8uYWRkID0gY29sdW1uc1RvLmFkZC5jb25jYXQoZXh0cmFDb2x1bW5zLmVudGl0eSk7XG4gIH1cbiAgaWYgKGV4dHJhQ29sdW1ucy5kYi5sZW5ndGggPiAwKSB7XG4gICAgY29sdW1uc1RvLmRyb3AgPSBjb2x1bW5zVG8uZHJvcC5jb25jYXQoZXh0cmFDb2x1bW5zLmRiKTtcbiAgfVxuXG4gIC8vIOuPmeydvCDsu6zrn7zrqoXsnZgg7IS467aAIO2VhOuTnCDruYTqtZBcbiAgY29uc3Qgc2FtZURiQ29sdW1ucyA9IGludGVyc2VjdGlvbkJ5KGRiQ29sdW1ucywgZW50aXR5Q29sdW1ucywgKGNvbCkgPT4gY29sLm5hbWUpO1xuICBjb25zdCBzYW1lTWRDb2x1bW5zID0gaW50ZXJzZWN0aW9uQnkoZW50aXR5Q29sdW1ucywgZGJDb2x1bW5zLCAoY29sKSA9PiBjb2wubmFtZSk7XG4gIGNvbHVtbnNUby5hbHRlciA9IGRpZmZlcmVuY2VXaXRoKHNhbWVEYkNvbHVtbnMsIHNhbWVNZENvbHVtbnMsIChhLCBiKSA9PlxuICAgIGVxdWFsKFxuICAgICAgbm9ybWFsaXplQ29sdW1uRm9yQ29tcGFyaXNvbihhLCBzZWFyY2hUZXh0Q29sdW1uTmFtZXMpLFxuICAgICAgbm9ybWFsaXplQ29sdW1uRm9yQ29tcGFyaXNvbihiLCBzZWFyY2hUZXh0Q29sdW1uTmFtZXMpLFxuICAgICksXG4gICk7XG5cbiAgcmV0dXJuIGNvbHVtbnNUbztcbn1cblxuLyoqXG4gKiDstpTstpzrkJwg7Lus65+865Ok7J2EIOq4sOykgOycvOuhnCDqsIHqsIEg65287J24IOyDneyEsVxuICovXG5mdW5jdGlvbiBnZXRBbHRlckNvbHVtbkxpbmVzVG8oXG4gIGNvbHVtbnNUbzogUmV0dXJuVHlwZTx0eXBlb2YgZ2V0QWx0ZXJDb2x1bW5zVG8+LFxuICBlbnRpdHlDb2x1bW5zOiBNaWdyYXRpb25Db2x1bW5bXSxcbiAgdGFibGU6IHN0cmluZyxcbiAgZGJGb3JlaWduczogTWlncmF0aW9uRm9yZWlnbltdLFxuKSB7XG4gIGNvbnN0IHNlYXJjaFRleHRDb2x1bW5OYW1lcyA9IGdldFNlYXJjaFRleHRDb2x1bW5OYW1lcyh0YWJsZSk7XG4gIGNvbnN0IGxpbmVzVG8gPSB7XG4gICAgYWRkOiB7XG4gICAgICB1cDoge1xuICAgICAgICBidWlsZGVyOlxuICAgICAgICAgIC8qIFNBRkVUWTogS25leOyZgCBQb3N0Z3JlU1FMIOyKpO2CpOuniCDsobDtmowg6rOE7JW97J20IOydtCDqsJLsnZgg7YOA7J6F7J2EIOuztOyepe2VnOuLpC4gKi8gW10gYXMgc3RyaW5nW10sXG4gICAgICAgIHJhdzogLyogU0FGRVRZOiBLbmV47JmAIFBvc3RncmVTUUwg7Iqk7YKk66eIIOyhsO2ajCDqs4Tslb3snbQg7J20IOqwkuydmCDtg4DsnoXsnYQg67O07J6l7ZWc64ukLiAqLyBbXSBhcyBzdHJpbmdbXSxcbiAgICAgIH0sXG4gICAgICBkb3duOiB7XG4gICAgICAgIGJ1aWxkZXI6XG4gICAgICAgICAgLyogU0FGRVRZOiBLbmV47JmAIFBvc3RncmVTUUwg7Iqk7YKk66eIIOyhsO2ajCDqs4Tslb3snbQg7J20IOqwkuydmCDtg4DsnoXsnYQg67O07J6l7ZWc64ukLiAqLyBbXSBhcyBzdHJpbmdbXSxcbiAgICAgICAgcmF3OiAvKiBTQUZFVFk6IEtuZXjsmYAgUG9zdGdyZVNRTCDsiqTtgqTrp4gg7KGw7ZqMIOqzhOyVveydtCDsnbQg6rCS7J2YIO2DgOyeheydhCDrs7TsnqXtlZzri6QuICovIFtdIGFzIHN0cmluZ1tdLFxuICAgICAgfSxcbiAgICB9LFxuICAgIGRyb3A6IHtcbiAgICAgIHVwOiB7XG4gICAgICAgIGJ1aWxkZXI6XG4gICAgICAgICAgLyogU0FGRVRZOiBLbmV47JmAIFBvc3RncmVTUUwg7Iqk7YKk66eIIOyhsO2ajCDqs4Tslb3snbQg7J20IOqwkuydmCDtg4DsnoXsnYQg67O07J6l7ZWc64ukLiAqLyBbXSBhcyBzdHJpbmdbXSxcbiAgICAgICAgcmF3OiAvKiBTQUZFVFk6IEtuZXjsmYAgUG9zdGdyZVNRTCDsiqTtgqTrp4gg7KGw7ZqMIOqzhOyVveydtCDsnbQg6rCS7J2YIO2DgOyeheydhCDrs7TsnqXtlZzri6QuICovIFtdIGFzIHN0cmluZ1tdLFxuICAgICAgfSxcbiAgICAgIGRvd246IHtcbiAgICAgICAgYnVpbGRlcjpcbiAgICAgICAgICAvKiBTQUZFVFk6IEtuZXjsmYAgUG9zdGdyZVNRTCDsiqTtgqTrp4gg7KGw7ZqMIOqzhOyVveydtCDsnbQg6rCS7J2YIO2DgOyeheydhCDrs7TsnqXtlZzri6QuICovIFtdIGFzIHN0cmluZ1tdLFxuICAgICAgICByYXc6IC8qIFNBRkVUWTogS25leOyZgCBQb3N0Z3JlU1FMIOyKpO2CpOuniCDsobDtmowg6rOE7JW97J20IOydtCDqsJLsnZgg7YOA7J6F7J2EIOuztOyepe2VnOuLpC4gKi8gW10gYXMgc3RyaW5nW10sXG4gICAgICB9LFxuICAgIH0sXG4gICAgYWx0ZXI6IHtcbiAgICAgIHVwOiB7XG4gICAgICAgIGJ1aWxkZXI6XG4gICAgICAgICAgLyogU0FGRVRZOiBLbmV47JmAIFBvc3RncmVTUUwg7Iqk7YKk66eIIOyhsO2ajCDqs4Tslb3snbQg7J20IOqwkuydmCDtg4DsnoXsnYQg67O07J6l7ZWc64ukLiAqLyBbXSBhcyBzdHJpbmdbXSxcbiAgICAgICAgcmF3OiAvKiBTQUZFVFk6IEtuZXjsmYAgUG9zdGdyZVNRTCDsiqTtgqTrp4gg7KGw7ZqMIOqzhOyVveydtCDsnbQg6rCS7J2YIO2DgOyeheydhCDrs7TsnqXtlZzri6QuICovIFtdIGFzIHN0cmluZ1tdLFxuICAgICAgfSxcbiAgICAgIGRvd246IHtcbiAgICAgICAgYnVpbGRlcjpcbiAgICAgICAgICAvKiBTQUZFVFk6IEtuZXjsmYAgUG9zdGdyZVNRTCDsiqTtgqTrp4gg7KGw7ZqMIOqzhOyVveydtCDsnbQg6rCS7J2YIO2DgOyeheydhCDrs7TsnqXtlZzri6QuICovIFtdIGFzIHN0cmluZ1tdLFxuICAgICAgICByYXc6IC8qIFNBRkVUWTogS25leOyZgCBQb3N0Z3JlU1FMIOyKpO2CpOuniCDsobDtmowg6rOE7JW97J20IOydtCDqsJLsnZgg7YOA7J6F7J2EIOuztOyepe2VnOuLpC4gKi8gW10gYXMgc3RyaW5nW10sXG4gICAgICB9LFxuICAgIH0sXG4gIH07XG5cbiAgLy8gYWRkIGNvbHVtbnNcbiAgY29uc3QgYWRkQ29sdW1uRGVmcyA9IGdlbkNvbHVtbkRlZmluaXRpb25zKHRhYmxlLCBjb2x1bW5zVG8uYWRkKTtcbiAgbGluZXNUby5hZGQudXAgPSB7XG4gICAgYnVpbGRlcjogYWRkQ29sdW1uRGVmcy5idWlsZGVyLmxlbmd0aCA+IDAgPyBbXCIvLyBhZGRcIiwgLi4uYWRkQ29sdW1uRGVmcy5idWlsZGVyXSA6IFtdLFxuICAgIHJhdzpcbiAgICAgIGFkZENvbHVtbkRlZnMucmF3Lmxlbmd0aCA+IDBcbiAgICAgICAgPyBbXG4gICAgICAgICAgICAuLi5nZXRTZWFyY2hUZXh0SGVscGVyRGVmaW5pdGlvbnModGFibGUsIGNvbHVtbnNUby5hZGQpLFxuICAgICAgICAgICAgXCIvLyBhZGQgKGdlbmVyYXRlZClcIixcbiAgICAgICAgICAgIC4uLmFkZENvbHVtbkRlZnMucmF3LFxuICAgICAgICAgIF1cbiAgICAgICAgOiBbXSxcbiAgfTtcbiAgbGluZXNUby5hZGQuZG93biA9IHtcbiAgICBidWlsZGVyOlxuICAgICAgY29sdW1uc1RvLmFkZC5sZW5ndGggPiAwXG4gICAgICAgID8gW1xuICAgICAgICAgICAgXCIvLyByb2xsYmFjayAtIGFkZFwiLFxuICAgICAgICAgICAgYHRhYmxlLmRyb3BDb2x1bW5zKCR7Y29sdW1uc1RvLmFkZC5tYXAoKGNvbCkgPT4gYCcke2NvbC5uYW1lfSdgKS5qb2luKFwiLCBcIil9KWAsXG4gICAgICAgICAgXVxuICAgICAgICA6IFtdLFxuICAgIHJhdzogW10sXG4gIH07XG5cbiAgLy8gZHJvcO2VoCDsu6zrn7zsl5Ag6rG466awIEZLIOywvuq4sFxuICBjb25zdCBkcm9wQ29sdW1uTmFtZXMgPSBjb2x1bW5zVG8uZHJvcC5tYXAoKGNvbCkgPT4gY29sLm5hbWUpO1xuICBjb25zdCBma1RvRHJvcEJlZm9yZUNvbHVtbiA9IGRiRm9yZWlnbnMuZmlsdGVyKChmaykgPT5cbiAgICBmay5jb2x1bW5zLnNvbWUoKGNvbCkgPT4gZHJvcENvbHVtbk5hbWVzLmluY2x1ZGVzKGNvbCkpLFxuICApO1xuXG4gIGNvbnN0IGRyb3BGa0xpbmVzID0gZmtUb0Ryb3BCZWZvcmVDb2x1bW4ubWFwKChmaykgPT4ge1xuICAgIGNvbnN0IGNvbHVtbnNTdHJpbmdRdW90ZSA9IGZrLmNvbHVtbnMubWFwKChjb2wpID0+IGAnJHtjb2x9J2ApLmpvaW4oXCIsXCIpO1xuICAgIHJldHVybiBgdGFibGUuZHJvcEZvcmVpZ24oWyR7Y29sdW1uc1N0cmluZ1F1b3RlfV0pYDtcbiAgfSk7XG5cbiAgY29uc3QgcmVzdG9yZUZrTGluZXMgPSBnZW5Gb3JlaWduRGVmaW5pdGlvbnModGFibGUsIGZrVG9Ecm9wQmVmb3JlQ29sdW1uKS51cDtcblxuICAvLyBkcm9w7J2YIHJvbGxiYWNr7Iuc7JeQ64qUIGdlbmVyYXRlZCBjb2x1bW7rj4Qg67O17JuQ7ZW07JW8IO2VqFxuICBjb25zdCBkcm9wQ29sdW1uRGVmcyA9IGdlbkNvbHVtbkRlZmluaXRpb25zKHRhYmxlLCBjb2x1bW5zVG8uZHJvcCk7XG4gIGxpbmVzVG8uZHJvcCA9IHtcbiAgICB1cDoge1xuICAgICAgYnVpbGRlcjogW1xuICAgICAgICAuLi4oZHJvcEZrTGluZXMubGVuZ3RoID4gMFxuICAgICAgICAgID8gW1wiLy8gZHJvcCBmb3JlaWduIGtleXMgb24gY29sdW1ucyB0byBiZSBkcm9wcGVkXCIsIC4uLmRyb3BGa0xpbmVzXVxuICAgICAgICAgIDogW10pLFxuICAgICAgICAuLi4oY29sdW1uc1RvLmRyb3AubGVuZ3RoID4gMFxuICAgICAgICAgID8gW1xuICAgICAgICAgICAgICBcIi8vIGRyb3AgY29sdW1uc1wiLFxuICAgICAgICAgICAgICBgdGFibGUuZHJvcENvbHVtbnMoJHtjb2x1bW5zVG8uZHJvcC5tYXAoKGNvbCkgPT4gYCcke2NvbC5uYW1lfSdgKS5qb2luKFwiLCBcIil9KWAsXG4gICAgICAgICAgICBdXG4gICAgICAgICAgOiBbXSksXG4gICAgICBdLFxuICAgICAgcmF3OiBbXSxcbiAgICB9LFxuICAgIGRvd246IHtcbiAgICAgIGJ1aWxkZXI6IFtcbiAgICAgICAgLi4uKGRyb3BDb2x1bW5EZWZzLmJ1aWxkZXIubGVuZ3RoID4gMFxuICAgICAgICAgID8gW1wiLy8gcm9sbGJhY2sgLSBkcm9wIGNvbHVtbnNcIiwgLi4uZHJvcENvbHVtbkRlZnMuYnVpbGRlcl1cbiAgICAgICAgICA6IFtdKSxcbiAgICAgICAgLi4uKHJlc3RvcmVGa0xpbmVzLmxlbmd0aCA+IDAgPyBbXCIvLyByZXN0b3JlIGZvcmVpZ24ga2V5c1wiLCAuLi5yZXN0b3JlRmtMaW5lc10gOiBbXSksXG4gICAgICBdLFxuICAgICAgcmF3OlxuICAgICAgICBkcm9wQ29sdW1uRGVmcy5yYXcubGVuZ3RoID4gMFxuICAgICAgICAgID8gW1xuICAgICAgICAgICAgICAuLi5nZXRTZWFyY2hUZXh0SGVscGVyRGVmaW5pdGlvbnModGFibGUsIGNvbHVtbnNUby5kcm9wKSxcbiAgICAgICAgICAgICAgXCIvLyByb2xsYmFjayAtIGRyb3AgY29sdW1ucyAoZ2VuZXJhdGVkKVwiLFxuICAgICAgICAgICAgICAuLi5kcm9wQ29sdW1uRGVmcy5yYXcsXG4gICAgICAgICAgICBdXG4gICAgICAgICAgOiBbXSxcbiAgICB9LFxuICB9O1xuXG4gIC8vIGFsdGVyIGNvbHVtbnMgKEdlbmVyYXRlZCBDb2x1bW7snYAgQUxURVIg67aI6rCA7ZWY66+A66GcIGRyb3Ag7ZuEIOyerOyDneyEsSlcbiAgbGluZXNUby5hbHRlciA9IGNvbHVtbnNUby5hbHRlci5yZWR1Y2UoXG4gICAgKHIsIGRiQ29sdW1uKSA9PiB7XG4gICAgICBjb25zdCBlbnRpdHlDb2x1bW4gPSBlbnRpdHlDb2x1bW5zLmZpbmQoKGNvbCkgPT4gY29sLm5hbWUgPT09IGRiQ29sdW1uLm5hbWUpO1xuICAgICAgaWYgKGVudGl0eUNvbHVtbiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybiByO1xuICAgICAgfVxuXG4gICAgICBpZiAoXG4gICAgICAgIHNlYXJjaFRleHRDb2x1bW5OYW1lcy5oYXMoZGJDb2x1bW4ubmFtZSkgJiZcbiAgICAgICAgZGJDb2x1bW4uZ2VuZXJhdGVkICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICAgZW50aXR5Q29sdW1uLmdlbmVyYXRlZCAhPT0gdW5kZWZpbmVkXG4gICAgICApIHtcbiAgICAgICAgci51cC5idWlsZGVyID0gW1xuICAgICAgICAgIC4uLnIudXAuYnVpbGRlcixcbiAgICAgICAgICBcIi8vIGFsdGVyIGdlbmVyYXRlZCBjb2x1bW5cIixcbiAgICAgICAgICBgdGFibGUuZHJvcENvbHVtbnMoJyR7ZGJDb2x1bW4ubmFtZX0nKWAsXG4gICAgICAgIF07XG4gICAgICAgIHIudXAucmF3ID0gW1xuICAgICAgICAgIC4uLnIudXAucmF3LFxuICAgICAgICAgIC4uLmdldFNlYXJjaFRleHRIZWxwZXJEZWZpbml0aW9ucyh0YWJsZSwgW2VudGl0eUNvbHVtbl0pLFxuICAgICAgICAgIFwiLy8gYWx0ZXIgZ2VuZXJhdGVkIGNvbHVtblwiLFxuICAgICAgICAgIGdlbkdlbmVyYXRlZENvbHVtbkRlZmluaXRpb24odGFibGUsIGVudGl0eUNvbHVtbiksXG4gICAgICAgIF07XG4gICAgICAgIHIuZG93bi5idWlsZGVyID0gW1xuICAgICAgICAgIC4uLnIuZG93bi5idWlsZGVyLFxuICAgICAgICAgIFwiLy8gcm9sbGJhY2sgLSBhbHRlciBnZW5lcmF0ZWQgY29sdW1uXCIsXG4gICAgICAgICAgYHRhYmxlLmRyb3BDb2x1bW5zKCcke2RiQ29sdW1uLm5hbWV9JylgLFxuICAgICAgICBdO1xuICAgICAgICByLmRvd24ucmF3ID0gW1xuICAgICAgICAgIC4uLnIuZG93bi5yYXcsXG4gICAgICAgICAgLi4uZ2V0U2VhcmNoVGV4dEhlbHBlckRlZmluaXRpb25zKHRhYmxlLCBbZGJDb2x1bW5dKSxcbiAgICAgICAgICBcIi8vIHJvbGxiYWNrIC0gYWx0ZXIgZ2VuZXJhdGVkIGNvbHVtblwiLFxuICAgICAgICAgIGdlbkdlbmVyYXRlZENvbHVtbkRlZmluaXRpb24odGFibGUsIGRiQ29sdW1uKSxcbiAgICAgICAgXTtcbiAgICAgICAgcmV0dXJuIHI7XG4gICAgICB9XG5cbiAgICAgIC8vIOy7rOufvCDrs4Dqsr3sgqztla1cbiAgICAgIGNvbnN0IGNvbHVtbkRpZmZVcCA9IGRpZmYoXG4gICAgICAgIGdlbkNvbHVtbkRlZmluaXRpb25zKHRhYmxlLCBbZW50aXR5Q29sdW1uXSkuYnVpbGRlcixcbiAgICAgICAgZ2VuQ29sdW1uRGVmaW5pdGlvbnModGFibGUsIFtkYkNvbHVtbl0pLmJ1aWxkZXIsXG4gICAgICApO1xuICAgICAgY29uc3QgY29sdW1uRGlmZkRvd24gPSBkaWZmKFxuICAgICAgICBnZW5Db2x1bW5EZWZpbml0aW9ucyh0YWJsZSwgW2RiQ29sdW1uXSkuYnVpbGRlcixcbiAgICAgICAgZ2VuQ29sdW1uRGVmaW5pdGlvbnModGFibGUsIFtlbnRpdHlDb2x1bW5dKS5idWlsZGVyLFxuICAgICAgKTtcbiAgICAgIGlmIChjb2x1bW5EaWZmVXAubGVuZ3RoID4gMCkge1xuICAgICAgICByLnVwLmJ1aWxkZXIgPSBbXG4gICAgICAgICAgLi4uci51cC5idWlsZGVyLFxuICAgICAgICAgIFwiLy8gYWx0ZXIgY29sdW1uXCIsXG4gICAgICAgICAgLi4uY29sdW1uRGlmZlVwLm1hcCgobCkgPT4gYCR7bC5yZXBsYWNlKFwiO1wiLCBcIlwiKX0uYWx0ZXIoKTtgKSxcbiAgICAgICAgXTtcbiAgICAgICAgci5kb3duLmJ1aWxkZXIgPSBbXG4gICAgICAgICAgLi4uci5kb3duLmJ1aWxkZXIsXG4gICAgICAgICAgXCIvLyByb2xsYmFjayAtIGFsdGVyIGNvbHVtblwiLFxuICAgICAgICAgIC4uLmNvbHVtbkRpZmZEb3duLm1hcCgobCkgPT4gYCR7bC5yZXBsYWNlKFwiO1wiLCBcIlwiKX0uYWx0ZXIoKTtgKSxcbiAgICAgICAgXTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHI7XG4gICAgfSxcbiAgICB7XG4gICAgICB1cDoge1xuICAgICAgICBidWlsZGVyOlxuICAgICAgICAgIC8qIFNBRkVUWTogS25leOyZgCBQb3N0Z3JlU1FMIOyKpO2CpOuniCDsobDtmowg6rOE7JW97J20IOydtCDqsJLsnZgg7YOA7J6F7J2EIOuztOyepe2VnOuLpC4gKi8gW10gYXMgc3RyaW5nW10sXG4gICAgICAgIHJhdzogLyogU0FGRVRZOiBLbmV47JmAIFBvc3RncmVTUUwg7Iqk7YKk66eIIOyhsO2ajCDqs4Tslb3snbQg7J20IOqwkuydmCDtg4DsnoXsnYQg67O07J6l7ZWc64ukLiAqLyBbXSBhcyBzdHJpbmdbXSxcbiAgICAgIH0sXG4gICAgICBkb3duOiB7XG4gICAgICAgIGJ1aWxkZXI6XG4gICAgICAgICAgLyogU0FGRVRZOiBLbmV47JmAIFBvc3RncmVTUUwg7Iqk7YKk66eIIOyhsO2ajCDqs4Tslb3snbQg7J20IOqwkuydmCDtg4DsnoXsnYQg67O07J6l7ZWc64ukLiAqLyBbXSBhcyBzdHJpbmdbXSxcbiAgICAgICAgcmF3OiAvKiBTQUZFVFk6IEtuZXjsmYAgUG9zdGdyZVNRTCDsiqTtgqTrp4gg7KGw7ZqMIOqzhOyVveydtCDsnbQg6rCS7J2YIO2DgOyeheydhCDrs7TsnqXtlZzri6QuICovIFtdIGFzIHN0cmluZ1tdLFxuICAgICAgfSxcbiAgICB9LFxuICApO1xuXG4gIHJldHVybiBsaW5lc1RvO1xufVxuXG4vLyDsnbjrjbHsiqQg6rOg7JygIOyLneuzhOyekCDsg53shLEgKG5hbWXsnYQg7KCc7Jm47ZWcIOuqqOuToCDtlYTrk5zrpbwg66y47J6Q7Je066GcIOuzgO2ZmO2VmOyXrCDsobDtlakpXG5mdW5jdGlvbiBtaWdyYXRpb25JbmRleElkZW50aXR5KGluZGV4OiBNaWdyYXRpb25JbmRleCk6IHN0cmluZyB7XG4gIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyhpbmRleClcbiAgICAuZmlsdGVyKChrZXkpID0+IGtleSAhPT0gXCJuYW1lXCIpXG4gICAgLnRvU29ydGVkKCk7XG5cbiAgcmV0dXJuIGtleXNcbiAgICAubWFwKChrZXkpID0+IHtcbiAgICAgIGlmIChrZXkgPT09IFwibmFtZVwiKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgaWYgKGtleSA9PT0gXCJjb2x1bW5zXCIpIHtcbiAgICAgICAgcmV0dXJuIC8qIFNBRkVUWTogS25leOyZgCBQb3N0Z3JlU1FMIOyKpO2CpOuniCDsobDtmowg6rOE7JW97J20IOydtCDqsJLsnZgg7YOA7J6F7J2EIOuztOyepe2VnOuLpC4gKi8gKFxuICAgICAgICAgIGluZGV4W2tleV0gYXMgTWlncmF0aW9uSW5kZXhbXCJjb2x1bW5zXCJdXG4gICAgICAgICkubWFwKChjb2wpID0+XG4gICAgICAgICAgT2JqZWN0LmtleXMoY29sKVxuICAgICAgICAgICAgLnRvU29ydGVkKClcbiAgICAgICAgICAgIC5tYXAoXG4gICAgICAgICAgICAgIChjb2x1bW5LZXkpID0+XG4gICAgICAgICAgICAgICAgYCR7Y29sdW1uS2V5fT0ke2NvbFsvKiBTQUZFVFk6IEtuZXjsmYAgUG9zdGdyZVNRTCDsiqTtgqTrp4gg7KGw7ZqMIOqzhOyVveydtCDsnbQg6rCS7J2YIO2DgOyeheydhCDrs7TsnqXtlZzri6QuICovIGNvbHVtbktleSBhcyBrZXlvZiB0eXBlb2YgY29sXX1gLFxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgLmpvaW4oXCIvL1wiKSxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBgJHtrZXl9PSR7aW5kZXhbLyogU0FGRVRZOiBLbmV47JmAIFBvc3RncmVTUUwg7Iqk7YKk66eIIOyhsO2ajCDqs4Tslb3snbQg7J20IOqwkuydmCDtg4DsnoXsnYQg67O07J6l7ZWc64ukLiAqLyBrZXkgYXMga2V5b2YgTWlncmF0aW9uSW5kZXhdfWA7XG4gICAgfSlcbiAgICAuam9pbihcIi8vXCIpO1xufVxuXG4vKipcbiAqIOyduOuNseyKpOydmCBhZGQsIGRyb3Ag7Jes67aAIO2ZleyduFxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0QWx0ZXJJbmRleGVzVG8oZW50aXR5SW5kZXhlczogTWlncmF0aW9uSW5kZXhbXSwgZGJJbmRleGVzOiBNaWdyYXRpb25JbmRleFtdKSB7XG4gIC8vIOyduOuNseyKpCDruYTqtZBcbiAgY29uc3QgaW5kZXhlc1RvID0ge1xuICAgIGFkZDogLyogU0FGRVRZOiBLbmV47JmAIFBvc3RncmVTUUwg7Iqk7YKk66eIIOyhsO2ajCDqs4Tslb3snbQg7J20IOqwkuydmCDtg4DsnoXsnYQg67O07J6l7ZWc64ukLiAqLyBbXSBhcyBNaWdyYXRpb25JbmRleFtdLFxuICAgIGRyb3A6IC8qIFNBRkVUWTogS25leOyZgCBQb3N0Z3JlU1FMIOyKpO2CpOuniCDsobDtmowg6rOE7JW97J20IOydtCDqsJLsnZgg7YOA7J6F7J2EIOuztOyepe2VnOuLpC4gKi8gW10gYXMgTWlncmF0aW9uSW5kZXhbXSxcbiAgfTtcblxuICBjb25zdCBub3JtYWxpemVkRW50aXR5SW5kZXhlcyA9IGVudGl0eUluZGV4ZXMubWFwKHNldE1pZ3JhdGlvbkluZGV4RGVmYXVsdHMpO1xuICBjb25zdCBub3JtYWxpemVkRGJJbmRleGVzID0gZGJJbmRleGVzLm1hcChzZXRNaWdyYXRpb25JbmRleERlZmF1bHRzKTtcbiAgLy8g67mE6rWQ7JeQ64qUIOygleq3nO2ZlOuQnCBwcmVkaWNhdGXrpbwg7JOw65CYLCDsi6TsoJwgbWlncmF0aW9uIOy2nOugpeydgCDsm5Drs7ggU1FM7J2EIOuztOyhtO2VnOuLpC5cbiAgY29uc3QgY29tcGFyaXNvbkVudGl0eUluZGV4ZXMgPSBlbnRpdHlJbmRleGVzLm1hcChzZXRNaWdyYXRpb25JbmRleENvbXBhcmlzb25EZWZhdWx0cyk7XG4gIGNvbnN0IGNvbXBhcmlzb25EYkluZGV4ZXMgPSBkYkluZGV4ZXMubWFwKHNldE1pZ3JhdGlvbkluZGV4Q29tcGFyaXNvbkRlZmF1bHRzKTtcbiAgY29uc3QgZXh0cmFJbmRleGVzID0ge1xuICAgIGRiOiBkaWZmKGNvbXBhcmlzb25EYkluZGV4ZXMsIGNvbXBhcmlzb25FbnRpdHlJbmRleGVzLCBtaWdyYXRpb25JbmRleElkZW50aXR5KSxcbiAgICBlbnRpdHk6IGRpZmYoY29tcGFyaXNvbkVudGl0eUluZGV4ZXMsIGNvbXBhcmlzb25EYkluZGV4ZXMsIG1pZ3JhdGlvbkluZGV4SWRlbnRpdHkpLFxuICB9O1xuICBpZiAoZXh0cmFJbmRleGVzLmVudGl0eS5sZW5ndGggPiAwKSB7XG4gICAgY29uc3QgYWRkSWRlbnRpdGllcyA9IG5ldyBTZXQoZXh0cmFJbmRleGVzLmVudGl0eS5tYXAobWlncmF0aW9uSW5kZXhJZGVudGl0eSkpO1xuICAgIGluZGV4ZXNUby5hZGQgPSBpbmRleGVzVG8uYWRkLmNvbmNhdChcbiAgICAgIG5vcm1hbGl6ZWRFbnRpdHlJbmRleGVzLmZpbHRlcigoXywgaW5kZXgpID0+XG4gICAgICAgIGFkZElkZW50aXRpZXMuaGFzKG1pZ3JhdGlvbkluZGV4SWRlbnRpdHkoY29tcGFyaXNvbkVudGl0eUluZGV4ZXNbaW5kZXhdKSksXG4gICAgICApLFxuICAgICk7XG4gIH1cbiAgaWYgKGV4dHJhSW5kZXhlcy5kYi5sZW5ndGggPiAwKSB7XG4gICAgY29uc3QgZHJvcElkZW50aXRpZXMgPSBuZXcgU2V0KGV4dHJhSW5kZXhlcy5kYi5tYXAobWlncmF0aW9uSW5kZXhJZGVudGl0eSkpO1xuICAgIGluZGV4ZXNUby5kcm9wID0gaW5kZXhlc1RvLmRyb3AuY29uY2F0KFxuICAgICAgbm9ybWFsaXplZERiSW5kZXhlcy5maWx0ZXIoKF8sIGluZGV4KSA9PlxuICAgICAgICBkcm9wSWRlbnRpdGllcy5oYXMobWlncmF0aW9uSW5kZXhJZGVudGl0eShjb21wYXJpc29uRGJJbmRleGVzW2luZGV4XSkpLFxuICAgICAgKSxcbiAgICApO1xuICB9XG5cbiAgcmV0dXJuIGluZGV4ZXNUbztcbn1cblxuLyoqXG4gKiDsnbjrjbHsiqQg7IKt7KCcIOygleydmCDsg53shLFcbiAqL1xuZnVuY3Rpb24gZ2VuSW5kZXhEcm9wRGVmaW5pdGlvbihpbmRleDogTWlncmF0aW9uSW5kZXgpIHtcbiAgcmV0dXJuIGB0YWJsZS5kcm9wSW5kZXgoWyR7aW5kZXguY29sdW1uc1xuICAgIC5tYXAoKGNvbHVtbikgPT4gYCcke2NvbHVtbi5uYW1lfSdgKVxuICAgIC5qb2luKFwiLFwiKX1dLCAnJHtpbmRleC5uYW1lfScpYDtcbn1cblxuLyoqXG4gKiBEQiDsobDtmowg6rKw6rO87JmAIOu5hOq1kO2VmOq4sCDsnITtlZwg7J24642x7IqkIOq4sOuzuOqwkiDshKTsoJVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNldE1pZ3JhdGlvbkluZGV4RGVmYXVsdHMoaW5kZXg6IE1pZ3JhdGlvbkluZGV4KTogTWlncmF0aW9uSW5kZXgge1xuICByZXR1cm4gc2V0TWlncmF0aW9uSW5kZXhEZWZhdWx0c0Jhc2UoaW5kZXgsIGZhbHNlKTtcbn1cblxuZnVuY3Rpb24gc2V0TWlncmF0aW9uSW5kZXhDb21wYXJpc29uRGVmYXVsdHMoaW5kZXg6IE1pZ3JhdGlvbkluZGV4KTogTWlncmF0aW9uSW5kZXgge1xuICAvLyBEQiBjYW5vbmljYWwgU1FM6rO8IGVudGl0eSBTUUzsnZgg7ZGc7ZiEIOywqOydtOulvCBkaWZmIGlkZW50aXR57JeQ7ISc66eMIO2doeyImO2VnOuLpC5cbiAgcmV0dXJuIHNldE1pZ3JhdGlvbkluZGV4RGVmYXVsdHNCYXNlKGluZGV4LCB0cnVlKTtcbn1cblxuZnVuY3Rpb24gc2V0TWlncmF0aW9uSW5kZXhEZWZhdWx0c0Jhc2UoXG4gIGluZGV4OiBNaWdyYXRpb25JbmRleCxcbiAgbm9ybWFsaXplV2hlcmVGb3JDb21wYXJpc29uOiBib29sZWFuLFxuKTogTWlncmF0aW9uSW5kZXgge1xuICBjb25zdCBpc1ZlY3RvckluZGV4ID0gaW5kZXgudHlwZSA9PT0gXCJobnN3XCIgfHwgaW5kZXgudHlwZSA9PT0gXCJpdmZmbGF0XCI7XG4gIGNvbnN0IHN1cHBvcnRzT3JkZXJpbmcgPSAhaXNWZWN0b3JJbmRleCAmJiAoIWluZGV4LnVzaW5nIHx8IGluZGV4LnVzaW5nID09PSBcImJ0cmVlXCIpO1xuICBjb25zdCBub3JtYWxpemVkVXNpbmcgPSBpc1ZlY3RvckluZGV4ID8gaW5kZXgudXNpbmcgOiAoaW5kZXgudXNpbmcgPz8gXCJidHJlZVwiKTtcbiAgY29uc3Qgbm9ybWFsaXplZFdoZXJlID0gbm9ybWFsaXplV2hlcmVGb3JDb21wYXJpc29uXG4gICAgPyBub3JtYWxpemVJbmRleFdoZXJlUHJlZGljYXRlRm9yQ29tcGFyaXNvbihpbmRleC53aGVyZSlcbiAgICA6IG5vcm1hbGl6ZUluZGV4V2hlcmVQcmVkaWNhdGUoaW5kZXgud2hlcmUpO1xuXG4gIGNvbnN0IGNvbHVtbnMgPSBpbmRleC5jb2x1bW5zLm1hcCgoY29sKSA9PiB7XG4gICAgY29uc3QgY29sdW1uOiBNaWdyYXRpb25JbmRleFtcImNvbHVtbnNcIl1bbnVtYmVyXSA9IHsgbmFtZTogY29sLm5hbWUgfTtcbiAgICBjb25zdCBvcGNsYXNzID0gZ2V0SW5kZXhDb2x1bW5PcGNsYXNzKGNvbCk7XG4gICAgaWYgKG9wY2xhc3MpIGNvbHVtbi5vcGNsYXNzID0gb3BjbGFzcztcbiAgICBpZiAoc3VwcG9ydHNPcmRlcmluZykge1xuICAgICAgY29sdW1uLnNvcnRPcmRlciA9IGNvbC5zb3J0T3JkZXIgPz8gXCJBU0NcIjtcbiAgICAgIGNvbHVtbi5udWxsc0ZpcnN0ID0gY29sLm51bGxzRmlyc3QgPz8gY29sLnNvcnRPcmRlciA9PT0gXCJERVNDXCI7XG4gICAgfVxuICAgIHJldHVybiBjb2x1bW47XG4gIH0pO1xuICBjb25zdCBub3JtYWxpemVkSW5kZXg6IE1pZ3JhdGlvbkluZGV4ID0ge1xuICAgIC4uLmluZGV4LFxuICAgIGNvbHVtbnMsXG4gICAgbnVsbHNOb3REaXN0aW5jdDogaW5kZXgubnVsbHNOb3REaXN0aW5jdCA/PyBmYWxzZSxcbiAgfTtcbiAgaWYgKG5vcm1hbGl6ZWRVc2luZykgbm9ybWFsaXplZEluZGV4LnVzaW5nID0gbm9ybWFsaXplZFVzaW5nO1xuICBpZiAobm9ybWFsaXplZFdoZXJlKSBub3JtYWxpemVkSW5kZXgud2hlcmUgPSBub3JtYWxpemVkV2hlcmU7XG4gIHJldHVybiBub3JtYWxpemVkSW5kZXg7XG59XG5cbmZ1bmN0aW9uIG1pZ3JhdGlvbkZvcmVpZ25LZXkobWlncmF0aW9uRm9yZWlnbjogTWlncmF0aW9uRm9yZWlnbik6IHN0cmluZyB7XG4gIHJldHVybiBbbWlncmF0aW9uRm9yZWlnbi5jb2x1bW5zLmpvaW4oXCItXCIpLCBtaWdyYXRpb25Gb3JlaWduLnRvXS5qb2luKFwiLy8vXCIpO1xufVxuXG4vKipcbiAqIO2FjOydtOu4lCDrs4Dqsr0g7LyA7J207IqkIC0gRm9yZWlnbiBLZXkg67OA6rK9XG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlQWx0ZXJDb2RlX0ZvcmVpZ25zKFxuICB0YWJsZTogc3RyaW5nLFxuICBlbnRpdHlGb3JlaWduczogTWlncmF0aW9uRm9yZWlnbltdLFxuICBkYkZvcmVpZ25zOiBNaWdyYXRpb25Gb3JlaWduW10sXG4gIGRyb3BwaW5nQ29sdW1uczogTWlncmF0aW9uQ29sdW1uW10gPSBbXSxcbik6IFByb21pc2U8R2VuTWlncmF0aW9uQ29kZVtdPiB7XG4gIC8vIGNvbnNvbGUubG9nKHsgZW50aXR5Rm9yZWlnbnMsIGRiRm9yZWlnbnMgfSk7XG5cbiAgLy8g7IKt7KCc65CgIOy7rOufvOuqhSDrqqnroZ1cbiAgY29uc3QgZHJvcHBpbmdDb2x1bW5OYW1lcyA9IGRyb3BwaW5nQ29sdW1ucy5tYXAoKGNvbCkgPT4gY29sLm5hbWUpO1xuXG4gIGNvbnN0IGZrVG8gPSBlbnRpdHlGb3JlaWducy5yZWR1Y2UoXG4gICAgKHJlc3VsdCwgZW50aXR5RikgPT4ge1xuICAgICAgY29uc3QgbWF0Y2hpbmdEYkYgPSBkYkZvcmVpZ25zLmZpbmQoXG4gICAgICAgIChkYkYpID0+IG1pZ3JhdGlvbkZvcmVpZ25LZXkoZW50aXR5RikgPT09IG1pZ3JhdGlvbkZvcmVpZ25LZXkoZGJGKSxcbiAgICAgICk7XG4gICAgICBpZiAoIW1hdGNoaW5nRGJGKSB7XG4gICAgICAgIHJlc3VsdC5hZGQucHVzaChlbnRpdHlGKTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgIH1cblxuICAgICAgaWYgKCFlcXVhbChlbnRpdHlGLCBtYXRjaGluZ0RiRikpIHtcbiAgICAgICAgcmVzdWx0LmFsdGVyU3JjLnB1c2gobWF0Y2hpbmdEYkYpO1xuICAgICAgICByZXN1bHQuYWx0ZXJEc3QucHVzaChlbnRpdHlGKTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgIH1cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfSxcbiAgICB7XG4gICAgICBhZGQ6IC8qIFNBRkVUWTogS25leOyZgCBQb3N0Z3JlU1FMIOyKpO2CpOuniCDsobDtmowg6rOE7JW97J20IOydtCDqsJLsnZgg7YOA7J6F7J2EIOuztOyepe2VnOuLpC4gKi8gW10gYXMgTWlncmF0aW9uRm9yZWlnbltdLFxuICAgICAgZHJvcDogLyogU0FGRVRZOiBLbmV47JmAIFBvc3RncmVTUUwg7Iqk7YKk66eIIOyhsO2ajCDqs4Tslb3snbQg7J20IOqwkuydmCDtg4DsnoXsnYQg67O07J6l7ZWc64ukLiAqLyBbXSBhcyBNaWdyYXRpb25Gb3JlaWduW10sXG4gICAgICBhbHRlclNyYzpcbiAgICAgICAgLyogU0FGRVRZOiBLbmV47JmAIFBvc3RncmVTUUwg7Iqk7YKk66eIIOyhsO2ajCDqs4Tslb3snbQg7J20IOqwkuydmCDtg4DsnoXsnYQg67O07J6l7ZWc64ukLiAqLyBbXSBhcyBNaWdyYXRpb25Gb3JlaWduW10sXG4gICAgICBhbHRlckRzdDpcbiAgICAgICAgLyogU0FGRVRZOiBLbmV47JmAIFBvc3RncmVTUUwg7Iqk7YKk66eIIOyhsO2ajCDqs4Tslb3snbQg7J20IOqwkuydmCDtg4DsnoXsnYQg67O07J6l7ZWc64ukLiAqLyBbXSBhcyBNaWdyYXRpb25Gb3JlaWduW10sXG4gICAgfSxcbiAgKTtcblxuICAvLyBkYkZvcmVpZ25z7JeQ64qUIOyeiOyngOunjCBlbnRpdHlGb3JlaWduc+yXkOuKlCDsl4bripQg6rK97JqwICjsgq3soJzrkJwgRkspXG4gIC8vIOuLqCwg7IKt7KCc65CgIOy7rOufvOydmCBGS+uKlCDsoJzsmbggKGdlbmVyYXRlQWx0ZXJDb2RlX0NvbHVtbkFuZEluZGV4ZXPsl5DshJwg7LKY66asKVxuICBkYkZvcmVpZ25zLmZvckVhY2goKGRiRikgPT4ge1xuICAgIGNvbnN0IG1hdGNoaW5nRW50aXR5RiA9IGVudGl0eUZvcmVpZ25zLmZpbmQoXG4gICAgICAoZW50aXR5RikgPT4gbWlncmF0aW9uRm9yZWlnbktleShlbnRpdHlGKSA9PT0gbWlncmF0aW9uRm9yZWlnbktleShkYkYpLFxuICAgICk7XG4gICAgaWYgKCFtYXRjaGluZ0VudGl0eUYpIHtcbiAgICAgIC8vIOydtCBGS+ydmCDsu6zrn7zsnbQg7IKt7KCc65CgIOy7rOufvCDrqqnroZ3sl5Ag7J6I64qU7KeAIO2ZleyduFxuICAgICAgY29uc3QgaXNDb2x1bW5Ecm9wcGluZyA9IGRiRi5jb2x1bW5zLnNvbWUoKGNvbCkgPT4gZHJvcHBpbmdDb2x1bW5OYW1lcy5pbmNsdWRlcyhjb2wpKTtcbiAgICAgIC8vIOy7rOufvOydtCDsgq3soJzrkJjsp4Ag7JWK64qUIOqyveyasOyXkOunjCBGSyBkcm9wIOuqqeuhneyXkCDstpTqsIBcbiAgICAgIGlmICghaXNDb2x1bW5Ecm9wcGluZykge1xuICAgICAgICBma1RvLmRyb3AucHVzaChkYkYpO1xuICAgICAgfVxuICAgIH1cbiAgfSk7XG5cbiAgY29uc3QgbGluZXNUbyA9IHtcbiAgICBhZGQ6IGdlbkZvcmVpZ25EZWZpbml0aW9ucyh0YWJsZSwgZmtUby5hZGQpLFxuICAgIGRyb3A6IGdlbkZvcmVpZ25EZWZpbml0aW9ucyh0YWJsZSwgZmtUby5kcm9wKSxcbiAgICBhbHRlclNyYzogZ2VuRm9yZWlnbkRlZmluaXRpb25zKHRhYmxlLCBma1RvLmFsdGVyU3JjKSxcbiAgICBhbHRlckRzdDogZ2VuRm9yZWlnbkRlZmluaXRpb25zKHRhYmxlLCBma1RvLmFsdGVyRHN0KSxcbiAgfTtcblxuICAvLyBkcm9wIGZrIGNvbHVtbnPsnbgg6rK97JqwKOyDneyEseuQoCDsvZTrk5wg7JeG64qUIOqyveyasCkg7Yyo7IqkXG4gIGNvbnN0IGhhc0xpbmVzID0gT2JqZWN0LnZhbHVlcyhsaW5lc1RvKS5zb21lKChsKSA9PiBsLnVwLmxlbmd0aCA+IDAgfHwgbC5kb3duLmxlbmd0aCA+IDApO1xuICBpZiAoIWhhc0xpbmVzKSB7XG4gICAgcmV0dXJuIFtdO1xuICB9XG5cbiAgaWYgKFxuICAgIGxpbmVzVG8uYWRkLnVwLmxlbmd0aCA9PT0gMCAmJlxuICAgIGxpbmVzVG8uZHJvcC51cC5sZW5ndGggPT09IDAgJiZcbiAgICBsaW5lc1RvLmFsdGVyU3JjLnVwLmxlbmd0aCA9PT0gMCAmJlxuICAgIGxpbmVzVG8uYWx0ZXJEc3QudXAubGVuZ3RoID09PSAwXG4gICkge1xuICAgIE5haXRlLnQoXCJtaWdyYXRvcjpnZW5lcmF0ZUFsdGVyQ29kZV9Gb3JlaWduczpma0NoYW5nZUNvZGVHZW5lcmF0aW9uRXJyb3JcIiwge1xuICAgICAgdGFibGUsXG4gICAgICBlbnRpdHlGb3JlaWducyxcbiAgICAgIGRiRm9yZWlnbnMsXG4gICAgfSk7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiRksg67OA6rK9IOy9lOuTnCDsg53shLEg7Jik66WYXCIpO1xuICB9XG5cbiAgY29uc3QgbGluZXM6IHN0cmluZ1tdID0gW1xuICAgICdpbXBvcnQgdHlwZSB7IEtuZXggfSBmcm9tIFwia25leFwiOycsXG4gICAgXCJcIixcbiAgICBcImV4cG9ydCBhc3luYyBmdW5jdGlvbiB1cChrbmV4OiBLbmV4KTogUHJvbWlzZTx2b2lkPiB7XCIsXG4gICAgYHJldHVybiBrbmV4LnNjaGVtYS5hbHRlclRhYmxlKFwiJHt0YWJsZX1cIiwgKHRhYmxlKSA9PiB7YCxcbiAgICAuLi5saW5lc1RvLmRyb3AuZG93bixcbiAgICAuLi5saW5lc1RvLmFkZC51cCxcbiAgICAuLi5saW5lc1RvLmFsdGVyU3JjLmRvd24sXG4gICAgLi4ubGluZXNUby5hbHRlckRzdC51cCxcbiAgICBcIn0pXCIsXG4gICAgXCJ9XCIsXG4gICAgXCJcIixcbiAgICBcImV4cG9ydCBhc3luYyBmdW5jdGlvbiBkb3duKGtuZXg6IEtuZXgpOiBQcm9taXNlPHZvaWQ+IHtcIixcbiAgICBgcmV0dXJuIGtuZXguc2NoZW1hLmFsdGVyVGFibGUoXCIke3RhYmxlfVwiLCAodGFibGUpID0+IHtgLFxuICAgIC4uLmxpbmVzVG8uYWRkLmRvd24sXG4gICAgLi4ubGluZXNUby5hbHRlckRzdC5kb3duLFxuICAgIC4uLmxpbmVzVG8uYWx0ZXJTcmMudXAsXG4gICAgLi4ubGluZXNUby5kcm9wLnVwLFxuICAgIFwifSlcIixcbiAgICBcIn1cIixcbiAgXTtcblxuICBjb25zdCBmb3JtYXR0ZWQgPSBhd2FpdCBmb3JtYXRDb2RlKGxpbmVzLmpvaW4oXCJcXG5cIiksIGBzcmMvbWlncmF0aW9uLyR7dGFibGV9LnRzYCk7XG4gIGNvbnN0IHRpdGxlID0gW1wiYWx0ZXJcIiwgdGFibGUsIFwiZm9yZWlnbnNcIl0uam9pbihcIl9cIik7XG5cbiAgcmV0dXJuIFtcbiAgICB7XG4gICAgICB0YWJsZSxcbiAgICAgIHRpdGxlLFxuICAgICAgZm9ybWF0dGVkLFxuICAgICAgdHlwZTogXCJub3JtYWxcIixcbiAgICB9LFxuICBdO1xufVxuXG4vKipcbiAqIOyjvOyWtOynhCBFbnRpdHlTZXTsnYQg6riw67CY7Jy866GcIO2FjOydtOu4lCBDUkVBVEUg66eI7J206re466CI7J207IWYIOy9lOuTnOulvCDsg53shLHtlanri4jri6QuXG4gKiBAcGFyYW0gZW50aXR5U2V0XG4gKiBAcmV0dXJucyBDUkVBVEUg66eI7J206re466CI7J207IWYIOy9lOuTnFxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVDcmVhdGVDb2RlKGVudGl0eVNldDogTWlncmF0aW9uU2V0KTogUHJvbWlzZTxHZW5NaWdyYXRpb25Db2RlW10+IHtcbiAgcmV0dXJuIFtcbiAgICBhd2FpdCBnZW5lcmF0ZUNyZWF0ZUNvZGVfQ29sdW1uQW5kSW5kZXhlcyhcbiAgICAgIGVudGl0eVNldC50YWJsZSxcbiAgICAgIGVudGl0eVNldC5jb2x1bW5zLFxuICAgICAgZW50aXR5U2V0LmluZGV4ZXMsXG4gICAgKSxcbiAgICAuLi4oYXdhaXQgZ2VuZXJhdGVDcmVhdGVDb2RlX0ZvcmVpZ24oZW50aXR5U2V0LnRhYmxlLCBlbnRpdHlTZXQuZm9yZWlnbnMpKSxcbiAgXTtcbn1cblxuZnVuY3Rpb24gcmVwbGFjZUNvbHVtbkRlZmF1bHRUbyhjb2x1bW46IE1pZ3JhdGlvbkNvbHVtbikge1xuICAvLyBGSVhNRTog7J2864uoIE15U1FMIOyDge2ZqeyXkOyEnCDrsJzsg53tlojrjZgg7J207IqI7J2YIHdvcmthcm91bmQg7J2066+A66GcIFBn7JeQ7IScIOyerO2ZleyduCDtm4Qg64yA7J2RIOy2lOqwgFxuICByZXR1cm4gY29sdW1uO1xufVxuXG5mdW5jdGlvbiByZXBsYWNlTm9BY3Rpb25Pbk15U1FMKGZvcmVpZ246IE1pZ3JhdGlvbkZvcmVpZ24pIHtcbiAgLy8gTXlTUUzsl5DshJwgUkVTVFJJQ1TsmYAgTk8gQUNUSU9O7J2AIOuPmeydvO2VqFxuICBjb25zdCB7IG9uRGVsZXRlLCBvblVwZGF0ZSB9ID0gZm9yZWlnbjtcbiAgcmV0dXJuIHtcbiAgICAuLi5mb3JlaWduLFxuICAgIG9uVXBkYXRlOiBvblVwZGF0ZSA9PT0gXCJSRVNUUklDVFwiID8gXCJOTyBBQ1RJT05cIiA6IG9uVXBkYXRlLFxuICAgIG9uRGVsZXRlOiBvbkRlbGV0ZSA9PT0gXCJSRVNUUklDVFwiID8gXCJOTyBBQ1RJT05cIiA6IG9uRGVsZXRlLFxuICB9O1xufVxuXG4vKipcbiAqIOyjvOyWtOynhCBlbnRpdHlTZXTsnYQg66qp7ZGc66GcLCBkYlNldOydhCDtmIQg7IOB7Zmp7Jy866GcIO2VmOyXrCDthYzsnbTruJQgQUxURVIg66eI7J206re466CI7J207IWYIOy9lOuTnOulvCDsg53shLHtlanri4jri6QuXG4gKiBAcGFyYW0gZW50aXR5U2V0IO2YhCDsg4HtmansnZggTWlncmF0aW9uU2V0XG4gKiBAcGFyYW0gZGJTZXQg66qp7ZGcIOyDge2ZqeydmCBNaWdyYXRpb25TZXRcbiAqIEBwYXJhbSBjb21wYXJlREIgUEsg7YOA7J6FIOuzgOqyvSDsi5wg7Jet7LC47KGwIEZL66W8IOyhsO2ajO2VmOq4sCDsnITtlZwgS25leCDsnbjsiqTthLTsiqQgKOyEoO2DnSlcbiAqIEByZXR1cm5zIEFMVEVSIOuniOydtOq3uOugiOydtOyFmCDsvZTrk5xcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlQWx0ZXJDb2RlKFxuICBlbnRpdHlTZXQ6IE1pZ3JhdGlvblNldCxcbiAgZGJTZXQ6IE1pZ3JhdGlvblNldCxcbiAgY29tcGFyZURCPzogS25leCxcbik6IFByb21pc2U8R2VuTWlncmF0aW9uQ29kZVtdPiB7XG4gIGNvbnN0IGVudGl0eUNvbHVtbnMgPSBhbHBoYWJldGljYWwoZW50aXR5U2V0LmNvbHVtbnMsIChhKSA9PiBhLm5hbWUpLm1hcChyZXBsYWNlQ29sdW1uRGVmYXVsdFRvKTtcbiAgY29uc3QgZGJDb2x1bW5zID0gYWxwaGFiZXRpY2FsKGRiU2V0LmNvbHVtbnMsIChhKSA9PiBhLm5hbWUpLm1hcChyZXBsYWNlQ29sdW1uRGVmYXVsdFRvKTtcblxuICAvKiDrlJTrsoTquYXsmqkg7L2U65OcLCDtirnsoJUg7Lus65+87JeQ7IScIOu2iOydvOy5mCDrsJzsg53tlaAg65WMIO2ZleyduFxuICAgICAgICBjb25zdCBlbnRpdHlDb2x1bW4gPSBlbnRpdHlTZXQuY29sdW1ucy5maW5kKFxuICAgICAgICAgIChjb2wpID0+IGNvbC5uYW1lID09PSBcInByaWNlX2tyd1wiXG4gICAgICAgICk7XG4gICAgICAgIGNvbnN0IGRiQ29sdW1uID0gZGJTZXQuY29sdW1ucy5maW5kKFxuICAgICAgICAgIChjb2wpID0+IGNvbC5uYW1lID09PSBcInByaWNlX2tyd1wiXG4gICAgICAgICk7XG4gICAgICAgIGNvbnNvbGUuZGVidWcoeyBlbnRpdHlDb2x1bW4sIGRiQ29sdW1uIH0pO1xuICAgICAgICAgKi9cblxuICBjb25zdCBlbnRpdHlJbmRleGVzID0gYWxwaGFiZXRpY2FsKGVudGl0eVNldC5pbmRleGVzLCAoYSkgPT5cbiAgICBbYS50eXBlLCAuLi5hLmNvbHVtbnMubWFwKChjKSA9PiBjLm5hbWUpXS5qb2luKFwiLVwiKSxcbiAgKTtcbiAgY29uc3QgZGJJbmRleGVzID0gYWxwaGFiZXRpY2FsKGRiU2V0LmluZGV4ZXMsIChhKSA9PlxuICAgIFthLnR5cGUsIC4uLmEuY29sdW1ucy5tYXAoKGMpID0+IGMubmFtZSldLmpvaW4oXCItXCIpLFxuICApO1xuXG4gIGNvbnN0IGVudGl0eUZvcmVpZ25zID0gYWxwaGFiZXRpY2FsKGVudGl0eVNldC5mb3JlaWducywgKGEpID0+XG4gICAgW2EudG8sIC4uLmEuY29sdW1uc10uam9pbihcIi1cIiksXG4gICkubWFwKChmKSA9PiByZXBsYWNlTm9BY3Rpb25Pbk15U1FMKGYpKTtcbiAgY29uc3QgZGJGb3JlaWducyA9IGFscGhhYmV0aWNhbChkYlNldC5mb3JlaWducywgKGEpID0+IFthLnRvLCAuLi5hLmNvbHVtbnNdLmpvaW4oXCItXCIpKS5tYXAoKGYpID0+XG4gICAgcmVwbGFjZU5vQWN0aW9uT25NeVNRTChmKSxcbiAgKTtcblxuICAvLyDsgq3soJzrkKAg7Lus65+8IOuqqeuhnSDqs4TsgrBcbiAgY29uc3QgZHJvcHBpbmdDb2x1bW5zID0gZGlmZihkYkNvbHVtbnMsIGVudGl0eUNvbHVtbnMsIChjb2wpID0+IGNvbC5uYW1lKTtcblxuICBjb25zdCBhbHRlckNvZGVzOiAoR2VuTWlncmF0aW9uQ29kZSB8IEdlbk1pZ3JhdGlvbkNvZGVbXSB8IG51bGwpW10gPSBbXTtcblxuICAvLyAxLiBjb2x1bW5zQW5kSW5kZXhlcyDsspjrpqxcbiAgY29uc3Qgc2VhcmNoVGV4dENvbHVtbk5hbWVzID0gZ2V0U2VhcmNoVGV4dENvbHVtbk5hbWVzKGVudGl0eVNldC50YWJsZSk7XG4gIGNvbnN0IGlzRXF1YWxDb2x1bW5zID0gZXF1YWwoXG4gICAgZW50aXR5Q29sdW1ucy5tYXAoKGNvbHVtbikgPT4gbm9ybWFsaXplQ29sdW1uRm9yQ29tcGFyaXNvbihjb2x1bW4sIHNlYXJjaFRleHRDb2x1bW5OYW1lcykpLFxuICAgIGRiQ29sdW1ucy5tYXAoKGNvbHVtbikgPT4gbm9ybWFsaXplQ29sdW1uRm9yQ29tcGFyaXNvbihjb2x1bW4sIHNlYXJjaFRleHRDb2x1bW5OYW1lcykpLFxuICApO1xuICBjb25zdCBpc0VxdWFsSW5kZXhlcyA9IGVxdWFsKFxuICAgIGVudGl0eUluZGV4ZXMubWFwKHNldE1pZ3JhdGlvbkluZGV4RGVmYXVsdHMpLFxuICAgIGRiSW5kZXhlcy5tYXAoc2V0TWlncmF0aW9uSW5kZXhEZWZhdWx0cyksXG4gICk7XG4gIGlmICghaXNFcXVhbENvbHVtbnMgfHwgIWlzRXF1YWxJbmRleGVzKSB7XG4gICAgYWx0ZXJDb2Rlcy5wdXNoKFxuICAgICAgYXdhaXQgZ2VuZXJhdGVBbHRlckNvZGVfQ29sdW1uQW5kSW5kZXhlcyhcbiAgICAgICAgZW50aXR5U2V0LnRhYmxlLFxuICAgICAgICBlbnRpdHlDb2x1bW5zLFxuICAgICAgICBlbnRpdHlJbmRleGVzLFxuICAgICAgICBkYkNvbHVtbnMsXG4gICAgICAgIGRiSW5kZXhlcyxcbiAgICAgICAgZGJTZXQuZm9yZWlnbnMsXG4gICAgICAgIGNvbXBhcmVEQixcbiAgICAgICksXG4gICAgKTtcbiAgfVxuXG4gIC8vIDIuIGZvcmVpZ25zIOyymOumrCAo7IKt7KCc65CgIOy7rOufvCDsoJXrs7Qg7KCE64usKVxuICBpZiAoIWVxdWFsKGVudGl0eUZvcmVpZ25zLCBkYkZvcmVpZ25zKSkge1xuICAgIGFsdGVyQ29kZXMucHVzaChcbiAgICAgIGF3YWl0IGdlbmVyYXRlQWx0ZXJDb2RlX0ZvcmVpZ25zKFxuICAgICAgICBlbnRpdHlTZXQudGFibGUsXG4gICAgICAgIGVudGl0eUZvcmVpZ25zLFxuICAgICAgICBkYkZvcmVpZ25zLFxuICAgICAgICBkcm9wcGluZ0NvbHVtbnMsXG4gICAgICApLFxuICAgICk7XG4gIH1cblxuICBpZiAoYWx0ZXJDb2Rlcy5ldmVyeSgoYWx0ZXJDb2RlKSA9PiBhbHRlckNvZGUgPT09IG51bGwpKSB7XG4gICAgcmV0dXJuIFtdO1xuICB9XG5cbiAgcmV0dXJuIGFsdGVyQ29kZXMuZmlsdGVyKChhbHRlckNvZGUpID0+IGFsdGVyQ29kZSAhPT0gbnVsbCkuZmxhdCgpO1xufVxuXG4vKipcbiAqIFBLIO2DgOyehSDrs4Dqsr0g7IucIOyXreywuOyhsCBGSyDsoJzslb3sobDqsbTsnYQg7LKY66as7ZWY64qUIOuniOydtOq3uOugiOydtOyFmCDsvZTrk5zrpbwg7IOd7ISx7ZWp64uI64ukLlxuICpcbiAqIFBLIO2DgOyehSDrs4Dqsr0g7IucIOyInOyEnDpcbiAqIDEuIEZLIOygnOyVveyhsOqxtCDsgq3soJwgKOyXreywuOyhsCDthYzsnbTruJTrk6QpXG4gKiAyLiDsnpDquLAg7LC47KGwIEZLIOyCreygnCAo7J6I64qUIOqyveyasClcbiAqIDMuIFBLIOygnOyVveyhsOqxtCDsgq3soJxcbiAqIDQuIFBLIOy7rOufvCDtg4DsnoUg67OA6rK9XG4gKiA1LiBGSyDsu6zrn7wg7YOA7J6FIOuzgOqyvSAo7Jet7LC47KGwIO2FjOydtOu4lOuTpClcbiAqIDYuIFBLIOygnOyVveyhsOqxtCDrs7XqtaxcbiAqIDcuIOyekOq4sCDssLjsobAgRksg67O16rWsXG4gKiA4LiBGSyDsoJzslb3sobDqsbQg67O16rWsXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlUGtUeXBlQ2hhbmdlTWlncmF0aW9uKFxuICB0YWJsZTogc3RyaW5nLFxuICBlbnRpdHlJZENvbDogTWlncmF0aW9uQ29sdW1uLFxuICBkYklkQ29sOiBNaWdyYXRpb25Db2x1bW4sXG4gIF9lbnRpdHlDb2x1bW5zOiBNaWdyYXRpb25Db2x1bW5bXSxcbiAgX2VudGl0eUluZGV4ZXM6IE1pZ3JhdGlvbkluZGV4W10sXG4gIF9kYkNvbHVtbnM6IE1pZ3JhdGlvbkNvbHVtbltdLFxuICBfZGJJbmRleGVzOiBNaWdyYXRpb25JbmRleFtdLFxuICBfZGJGb3JlaWduczogTWlncmF0aW9uRm9yZWlnbltdLFxuICBjb21wYXJlREI6IEtuZXgsXG4pOiBQcm9taXNlPEdlbk1pZ3JhdGlvbkNvZGVbXT4ge1xuICAvLyDsl63ssLjsobAgRksg7KGw7ZqMICjsnbQg7YWM7J2067iU7J2YIFBL66W8IOywuOyhsO2VmOuKlCDri6Trpbgg7YWM7J2067iU7J2YIEZL65OkKVxuICBjb25zdCByZWZlcmVuY2luZ0ZLcyA9IGF3YWl0IFBvc3RncmVTUUxTY2hlbWFSZWFkZXIuZ2V0UmVmZXJlbmNpbmdGb3JlaWduS2V5cyhjb21wYXJlREIsIHRhYmxlKTtcblxuICAvLyDsnpDquLAg7LC47KGwIEZLIOu2hOumrCAo7JiIOiBEZXBhcnRtZW50LnBhcmVudF9pZCDihpIgRGVwYXJ0bWVudC5pZClcbiAgY29uc3Qgc2VsZlJlZmVyZW5jaW5nRktzID0gcmVmZXJlbmNpbmdGS3MuZmlsdGVyKChmaykgPT4gZmsudGFibGVOYW1lID09PSB0YWJsZSk7XG4gIGNvbnN0IGV4dGVybmFsUmVmZXJlbmNpbmdGS3MgPSByZWZlcmVuY2luZ0ZLcy5maWx0ZXIoKGZrKSA9PiBmay50YWJsZU5hbWUgIT09IHRhYmxlKTtcblxuICAvLyBQSyDsoJzslb3sobDqsbQg7J2066aEIOyhsO2ajFxuICBjb25zdCBwa0NvbnN0cmFpbnROYW1lID0gYCR7dGFibGV9X3BrZXlgO1xuXG4gIC8vIOyDiCBQSyDtg4DsnoXsl5Ag66ee64qUIFBvc3RncmVTUUwg7YOA7J6FIOusuOyekOyXtFxuICBjb25zdCBuZXdQa1BnVHlwZSA9IGdldFBrUGdUeXBlKGVudGl0eUlkQ29sKTtcbiAgY29uc3Qgb2xkUGtQZ1R5cGUgPSBnZXRQa1BnVHlwZShkYklkQ29sKTtcblxuICAvLyBVUCDsvZTrk5wg7IOd7ISxXG4gIGNvbnN0IHVwTGluZXM6IHN0cmluZ1tdID0gW107XG5cbiAgLy8gMS4g7Jm467aAIO2FjOydtOu4lOydmCBGSyDsoJzslb3sobDqsbQg7IKt7KCcXG4gIGZvciAoY29uc3QgZmsgb2YgZXh0ZXJuYWxSZWZlcmVuY2luZ0ZLcykge1xuICAgIHVwTGluZXMucHVzaChgICAvLyAke2ZrLnRhYmxlTmFtZX0uJHtmay5jb2x1bW5OYW1lfSBGSyDsoJzslb3sobDqsbQg7IKt7KCcYCk7XG4gICAgdXBMaW5lcy5wdXNoKFxuICAgICAgYCAgYXdhaXQga25leC5yYXcoJ0FMVEVSIFRBQkxFIFwiJHtmay50YWJsZU5hbWV9XCIgRFJPUCBDT05TVFJBSU5UIFwiJHtmay5jb25zdHJhaW50TmFtZX1cIicpO2AsXG4gICAgKTtcbiAgfVxuXG4gIC8vIDIuIOyekOq4sCDssLjsobAgRksg7IKt7KCcXG4gIGZvciAoY29uc3QgZmsgb2Ygc2VsZlJlZmVyZW5jaW5nRktzKSB7XG4gICAgdXBMaW5lcy5wdXNoKGAgIC8vIOyekOq4sCDssLjsobAgRksg7IKt7KCcOiAke2ZrLmNvbHVtbk5hbWV9YCk7XG4gICAgdXBMaW5lcy5wdXNoKFxuICAgICAgYCAgYXdhaXQga25leC5yYXcoJ0FMVEVSIFRBQkxFIFwiJHt0YWJsZX1cIiBEUk9QIENPTlNUUkFJTlQgXCIke2ZrLmNvbnN0cmFpbnROYW1lfVwiJyk7YCxcbiAgICApO1xuICB9XG5cbiAgLy8gMy4gUEsg7KCc7JW97KGw6rG0IOyCreygnFxuICB1cExpbmVzLnB1c2goYCAgLy8gUEsg7KCc7JW97KGw6rG0IOyCreygnGApO1xuICB1cExpbmVzLnB1c2goYCAgYXdhaXQga25leC5yYXcoJ0FMVEVSIFRBQkxFIFwiJHt0YWJsZX1cIiBEUk9QIENPTlNUUkFJTlQgXCIke3BrQ29uc3RyYWludE5hbWV9XCInKTtgKTtcblxuICAvLyA0LiBQSyDsu6zrn7wg7YOA7J6FIOuzgOqyvVxuICB1cExpbmVzLnB1c2goYCAgLy8gUEsg7Lus65+8IO2DgOyehSDrs4Dqsr1gKTtcbiAgdXBMaW5lcy5wdXNoKFxuICAgIGAgIGF3YWl0IGtuZXgucmF3KCdBTFRFUiBUQUJMRSBcIiR7dGFibGV9XCIgQUxURVIgQ09MVU1OIFwiaWRcIiBUWVBFICR7bmV3UGtQZ1R5cGV9IFVTSU5HIFwiaWRcIjo6JHtuZXdQa1BnVHlwZX0nKTtgLFxuICApO1xuXG4gIC8vIDUuIEZLIOy7rOufvCDtg4DsnoUg67OA6rK9ICjsl63ssLjsobAg7YWM7J2067iU65OkKSAtIOyekOq4sCDssLjsobAg7Y+s7ZWoXG4gIGZvciAoY29uc3QgZmsgb2YgcmVmZXJlbmNpbmdGS3MpIHtcbiAgICB1cExpbmVzLnB1c2goYCAgLy8gJHtmay50YWJsZU5hbWV9LiR7ZmsuY29sdW1uTmFtZX0g7Lus65+8IO2DgOyehSDrs4Dqsr1gKTtcbiAgICB1cExpbmVzLnB1c2goXG4gICAgICBgICBhd2FpdCBrbmV4LnJhdygnQUxURVIgVEFCTEUgXCIke2ZrLnRhYmxlTmFtZX1cIiBBTFRFUiBDT0xVTU4gXCIke2ZrLmNvbHVtbk5hbWV9XCIgVFlQRSAke25ld1BrUGdUeXBlfSBVU0lORyBcIiR7ZmsuY29sdW1uTmFtZX1cIjo6JHtuZXdQa1BnVHlwZX0nKTtgLFxuICAgICk7XG4gIH1cblxuICAvLyA2LiBQSyDsoJzslb3sobDqsbQg67O16rWsXG4gIHVwTGluZXMucHVzaChgICAvLyBQSyDsoJzslb3sobDqsbQg67O16rWsYCk7XG4gIHVwTGluZXMucHVzaChcbiAgICBgICBhd2FpdCBrbmV4LnJhdygnQUxURVIgVEFCTEUgXCIke3RhYmxlfVwiIEFERCBDT05TVFJBSU5UIFwiJHtwa0NvbnN0cmFpbnROYW1lfVwiIFBSSU1BUlkgS0VZIChcImlkXCIpJyk7YCxcbiAgKTtcblxuICAvLyA3LiDsnpDquLAg7LC47KGwIEZLIOuzteq1rFxuICBmb3IgKGNvbnN0IGZrIG9mIHNlbGZSZWZlcmVuY2luZ0ZLcykge1xuICAgIHVwTGluZXMucHVzaChgICAvLyDsnpDquLAg7LC47KGwIEZLIOuzteq1rDogJHtmay5jb2x1bW5OYW1lfWApO1xuICAgIHVwTGluZXMucHVzaChcbiAgICAgIGAgIGF3YWl0IGtuZXgucmF3KCdBTFRFUiBUQUJMRSBcIiR7dGFibGV9XCIgQUREIENPTlNUUkFJTlQgXCIke2ZrLmNvbnN0cmFpbnROYW1lfVwiIEZPUkVJR04gS0VZIChcIiR7ZmsuY29sdW1uTmFtZX1cIikgUkVGRVJFTkNFUyBcIiR7dGFibGV9XCIoXCJpZFwiKSBPTiBVUERBVEUgJHtmay5vblVwZGF0ZX0gT04gREVMRVRFICR7Zmsub25EZWxldGV9Jyk7YCxcbiAgICApO1xuICB9XG5cbiAgLy8gOC4g7Jm467aAIO2FjOydtOu4lOydmCBGSyDsoJzslb3sobDqsbQg67O16rWsXG4gIGZvciAoY29uc3QgZmsgb2YgZXh0ZXJuYWxSZWZlcmVuY2luZ0ZLcykge1xuICAgIHVwTGluZXMucHVzaChgICAvLyAke2ZrLnRhYmxlTmFtZX0uJHtmay5jb2x1bW5OYW1lfSBGSyDsoJzslb3sobDqsbQg67O16rWsYCk7XG4gICAgdXBMaW5lcy5wdXNoKFxuICAgICAgYCAgYXdhaXQga25leC5yYXcoJ0FMVEVSIFRBQkxFIFwiJHtmay50YWJsZU5hbWV9XCIgQUREIENPTlNUUkFJTlQgXCIke2ZrLmNvbnN0cmFpbnROYW1lfVwiIEZPUkVJR04gS0VZIChcIiR7ZmsuY29sdW1uTmFtZX1cIikgUkVGRVJFTkNFUyBcIiR7dGFibGV9XCIoXCJpZFwiKSBPTiBVUERBVEUgJHtmay5vblVwZGF0ZX0gT04gREVMRVRFICR7Zmsub25EZWxldGV9Jyk7YCxcbiAgICApO1xuICB9XG5cbiAgLy8gRE9XTiDsvZTrk5wg7IOd7ISxICjsl63siJwpXG4gIGNvbnN0IGRvd25MaW5lczogc3RyaW5nW10gPSBbXTtcblxuICAvLyAxLiDsmbjrtoAg7YWM7J2067iU7J2YIEZLIOygnOyVveyhsOqxtCDsgq3soJxcbiAgZm9yIChjb25zdCBmayBvZiBleHRlcm5hbFJlZmVyZW5jaW5nRktzKSB7XG4gICAgZG93bkxpbmVzLnB1c2goYCAgLy8gJHtmay50YWJsZU5hbWV9LiR7ZmsuY29sdW1uTmFtZX0gRksg7KCc7JW97KGw6rG0IOyCreygnGApO1xuICAgIGRvd25MaW5lcy5wdXNoKFxuICAgICAgYCAgYXdhaXQga25leC5yYXcoJ0FMVEVSIFRBQkxFIFwiJHtmay50YWJsZU5hbWV9XCIgRFJPUCBDT05TVFJBSU5UIFwiJHtmay5jb25zdHJhaW50TmFtZX1cIicpO2AsXG4gICAgKTtcbiAgfVxuXG4gIC8vIDIuIOyekOq4sCDssLjsobAgRksg7IKt7KCcXG4gIGZvciAoY29uc3QgZmsgb2Ygc2VsZlJlZmVyZW5jaW5nRktzKSB7XG4gICAgZG93bkxpbmVzLnB1c2goYCAgLy8g7J6Q6riwIOywuOyhsCBGSyDsgq3soJw6ICR7ZmsuY29sdW1uTmFtZX1gKTtcbiAgICBkb3duTGluZXMucHVzaChcbiAgICAgIGAgIGF3YWl0IGtuZXgucmF3KCdBTFRFUiBUQUJMRSBcIiR7dGFibGV9XCIgRFJPUCBDT05TVFJBSU5UIFwiJHtmay5jb25zdHJhaW50TmFtZX1cIicpO2AsXG4gICAgKTtcbiAgfVxuXG4gIC8vIDMuIFBLIOygnOyVveyhsOqxtCDsgq3soJxcbiAgZG93bkxpbmVzLnB1c2goYCAgLy8gUEsg7KCc7JW97KGw6rG0IOyCreygnGApO1xuICBkb3duTGluZXMucHVzaChcbiAgICBgICBhd2FpdCBrbmV4LnJhdygnQUxURVIgVEFCTEUgXCIke3RhYmxlfVwiIERST1AgQ09OU1RSQUlOVCBcIiR7cGtDb25zdHJhaW50TmFtZX1cIicpO2AsXG4gICk7XG5cbiAgLy8gNC4gUEsg7Lus65+8IO2DgOyehSDsm5Drs7VcbiAgZG93bkxpbmVzLnB1c2goYCAgLy8gUEsg7Lus65+8IO2DgOyehSDsm5Drs7VgKTtcbiAgZG93bkxpbmVzLnB1c2goXG4gICAgYCAgYXdhaXQga25leC5yYXcoJ0FMVEVSIFRBQkxFIFwiJHt0YWJsZX1cIiBBTFRFUiBDT0xVTU4gXCJpZFwiIFRZUEUgJHtvbGRQa1BnVHlwZX0gVVNJTkcgXCJpZFwiOjoke29sZFBrUGdUeXBlfScpO2AsXG4gICk7XG5cbiAgLy8gNS4gRksg7Lus65+8IO2DgOyehSDsm5Drs7UgKOyXreywuOyhsCDthYzsnbTruJTrk6QpXG4gIGZvciAoY29uc3QgZmsgb2YgcmVmZXJlbmNpbmdGS3MpIHtcbiAgICBkb3duTGluZXMucHVzaChgICAvLyAke2ZrLnRhYmxlTmFtZX0uJHtmay5jb2x1bW5OYW1lfSDsu6zrn7wg7YOA7J6FIOybkOuztWApO1xuICAgIGRvd25MaW5lcy5wdXNoKFxuICAgICAgYCAgYXdhaXQga25leC5yYXcoJ0FMVEVSIFRBQkxFIFwiJHtmay50YWJsZU5hbWV9XCIgQUxURVIgQ09MVU1OIFwiJHtmay5jb2x1bW5OYW1lfVwiIFRZUEUgJHtvbGRQa1BnVHlwZX0gVVNJTkcgXCIke2ZrLmNvbHVtbk5hbWV9XCI6OiR7b2xkUGtQZ1R5cGV9Jyk7YCxcbiAgICApO1xuICB9XG5cbiAgLy8gNi4gUEsg7KCc7JW97KGw6rG0IOuzteq1rFxuICBkb3duTGluZXMucHVzaChgICAvLyBQSyDsoJzslb3sobDqsbQg67O16rWsYCk7XG4gIGRvd25MaW5lcy5wdXNoKFxuICAgIGAgIGF3YWl0IGtuZXgucmF3KCdBTFRFUiBUQUJMRSBcIiR7dGFibGV9XCIgQUREIENPTlNUUkFJTlQgXCIke3BrQ29uc3RyYWludE5hbWV9XCIgUFJJTUFSWSBLRVkgKFwiaWRcIiknKTtgLFxuICApO1xuXG4gIC8vIDcuIOyekOq4sCDssLjsobAgRksg67O16rWsXG4gIGZvciAoY29uc3QgZmsgb2Ygc2VsZlJlZmVyZW5jaW5nRktzKSB7XG4gICAgZG93bkxpbmVzLnB1c2goYCAgLy8g7J6Q6riwIOywuOyhsCBGSyDrs7Xqtaw6ICR7ZmsuY29sdW1uTmFtZX1gKTtcbiAgICBkb3duTGluZXMucHVzaChcbiAgICAgIGAgIGF3YWl0IGtuZXgucmF3KCdBTFRFUiBUQUJMRSBcIiR7dGFibGV9XCIgQUREIENPTlNUUkFJTlQgXCIke2ZrLmNvbnN0cmFpbnROYW1lfVwiIEZPUkVJR04gS0VZIChcIiR7ZmsuY29sdW1uTmFtZX1cIikgUkVGRVJFTkNFUyBcIiR7dGFibGV9XCIoXCJpZFwiKSBPTiBVUERBVEUgJHtmay5vblVwZGF0ZX0gT04gREVMRVRFICR7Zmsub25EZWxldGV9Jyk7YCxcbiAgICApO1xuICB9XG5cbiAgLy8gOC4g7Jm467aAIO2FjOydtOu4lOydmCBGSyDsoJzslb3sobDqsbQg67O16rWsXG4gIGZvciAoY29uc3QgZmsgb2YgZXh0ZXJuYWxSZWZlcmVuY2luZ0ZLcykge1xuICAgIGRvd25MaW5lcy5wdXNoKGAgIC8vICR7ZmsudGFibGVOYW1lfS4ke2ZrLmNvbHVtbk5hbWV9IEZLIOygnOyVveyhsOqxtCDrs7XqtaxgKTtcbiAgICBkb3duTGluZXMucHVzaChcbiAgICAgIGAgIGF3YWl0IGtuZXgucmF3KCdBTFRFUiBUQUJMRSBcIiR7ZmsudGFibGVOYW1lfVwiIEFERCBDT05TVFJBSU5UIFwiJHtmay5jb25zdHJhaW50TmFtZX1cIiBGT1JFSUdOIEtFWSAoXCIke2ZrLmNvbHVtbk5hbWV9XCIpIFJFRkVSRU5DRVMgXCIke3RhYmxlfVwiKFwiaWRcIikgT04gVVBEQVRFICR7Zmsub25VcGRhdGV9IE9OIERFTEVURSAke2ZrLm9uRGVsZXRlfScpO2AsXG4gICAgKTtcbiAgfVxuXG4gIGNvbnN0IGxpbmVzOiBzdHJpbmdbXSA9IFtcbiAgICAnaW1wb3J0IHR5cGUgeyBLbmV4IH0gZnJvbSBcImtuZXhcIjsnLFxuICAgIFwiXCIsXG4gICAgXCJleHBvcnQgYXN5bmMgZnVuY3Rpb24gdXAoa25leDogS25leCk6IFByb21pc2U8dm9pZD4ge1wiLFxuICAgIC4uLnVwTGluZXMsXG4gICAgXCJ9XCIsXG4gICAgXCJcIixcbiAgICBcImV4cG9ydCBhc3luYyBmdW5jdGlvbiBkb3duKGtuZXg6IEtuZXgpOiBQcm9taXNlPHZvaWQ+IHtcIixcbiAgICAuLi5kb3duTGluZXMsXG4gICAgXCJ9XCIsXG4gIF07XG5cbiAgY29uc3QgZm9ybWF0dGVkID0gYXdhaXQgZm9ybWF0Q29kZShsaW5lcy5qb2luKFwiXFxuXCIpLCBgc3JjL21pZ3JhdGlvbi8ke3RhYmxlfS50c2ApO1xuXG4gIHJldHVybiBbXG4gICAge1xuICAgICAgdGFibGUsXG4gICAgICB0aXRsZTogYGFsdGVyXyR7dGFibGV9X3BrX3R5cGVgLFxuICAgICAgZm9ybWF0dGVkLFxuICAgICAgdHlwZTogXCJub3JtYWxcIixcbiAgICB9LFxuICBdO1xufVxuXG4vKipcbiAqIFBLIOy7rOufvOydmCBQb3N0Z3JlU1FMIO2DgOyehSDrrLjsnpDsl7TsnYQg67CY7ZmY7ZWp64uI64ukLlxuICovXG5mdW5jdGlvbiBnZXRQa1BnVHlwZShjb2w6IE1pZ3JhdGlvbkNvbHVtbik6IHN0cmluZyB7XG4gIGlmIChjb2wudHlwZSA9PT0gXCJzdHJpbmdcIikge1xuICAgIHJldHVybiBjb2wubGVuZ3RoICE9PSB1bmRlZmluZWQgPyBgdmFyY2hhcigke2NvbC5sZW5ndGh9KWAgOiBcInRleHRcIjtcbiAgfVxuICBpZiAoY29sLnR5cGUgPT09IFwidXVpZFwiKSB7XG4gICAgcmV0dXJuIFwidXVpZFwiO1xuICB9XG4gIC8vIGludGVnZXLsnZgg6rK97JqwIHNlcmlhbC9pbnRlZ2VyIOq1rOu2hOydtCDtlYTsmpTtlZjsp4Drp4wsXG4gIC8vIO2DgOyehSDrs4Dqsr0g7Iuc7JeQ64qUIGludGVnZXLroZwg7LKY66as7ZWp64uI64ukLlxuICByZXR1cm4gXCJpbnRlZ2VyXCI7XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7OztBQWdTQSxTQUFTLHNCQUFzQixRQUErRDtDQUM1RixPQUFPLE9BQU8sV0FBVyxPQUFPO0FBQ2xDO0FBRUEsU0FBUyw2QkFBNkIsWUFBaUQ7Q0FDckYsTUFBTSxTQUFzQyxDQUFDO0NBQzdDLElBQUksUUFBUTtDQUVaLE9BQU8sUUFBUSxXQUFXLFFBQVE7RUFDaEMsTUFBTSxPQUFPLFdBQVc7RUFFeEIsSUFBSSxTQUFTLFFBQ1g7RUFHRixJQUFJLEtBQUssS0FBSyxJQUFJLEdBQUc7R0FDbkIsU0FBUztHQUNUO0VBQ0Y7RUFFQSxJQUFJLFdBQVcsV0FBVyxNQUFNLEtBQUssR0FBRztHQUN0QyxPQUFPLEtBQUs7SUFBRSxNQUFNO0lBQVksT0FBTztHQUFLLENBQUM7R0FDN0MsU0FBUztHQUNUO0VBQ0Y7RUFFQSxJQUFJLFdBQVcsV0FBVyxNQUFNLEtBQUssR0FBRztHQUN0QyxPQUFPLEtBQUs7SUFBRSxNQUFNO0lBQVksT0FBTztHQUFLLENBQUM7R0FDN0MsU0FBUztHQUNUO0VBQ0Y7RUFFQSxJQUFJLFNBQVMsT0FBTyxTQUFTLE9BQU8sU0FBUyxLQUFLO0dBQ2hELE9BQU8sS0FBSztJQUFFLE1BQU07SUFBVSxPQUFPO0dBQUssQ0FBQztHQUMzQyxTQUFTO0dBQ1Q7RUFDRjtFQUVBLElBQUksU0FBUyxLQUFLO0dBQ2hCLElBQUksUUFBUTtHQUNaLFNBQVM7R0FFVCxPQUFPLFFBQVEsV0FBVyxRQUFRO0lBQ2hDLE1BQU0sVUFBVSxXQUFXO0lBQzNCLElBQUksWUFBWSxLQUFLO0tBQ25CLElBQUksV0FBVyxRQUFRLE9BQU8sS0FBSztNQUNq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
|