sonamu 0.5.7 → 0.7.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.swcrc.project-default +18 -0
- package/bin/cli.js +24 -0
- package/dist/ai/agents/agent.d.ts +11 -0
- package/dist/ai/agents/agent.d.ts.map +1 -0
- package/dist/ai/agents/agent.js +65 -0
- package/dist/ai/agents/index.d.ts +3 -0
- package/dist/ai/agents/index.d.ts.map +1 -0
- package/dist/ai/agents/index.js +4 -0
- package/dist/ai/agents/types.d.ts +43 -0
- package/dist/ai/agents/types.d.ts.map +1 -0
- package/dist/ai/agents/types.js +3 -0
- package/dist/ai/index.d.ts +2 -0
- package/dist/ai/index.d.ts.map +1 -0
- package/dist/ai/index.js +3 -0
- package/dist/ai/providers/rtzr/api.d.ts +22 -0
- package/dist/ai/providers/rtzr/api.d.ts.map +1 -0
- package/dist/ai/providers/rtzr/api.js +28 -0
- package/dist/ai/providers/rtzr/error.d.ts +18 -0
- package/dist/ai/providers/rtzr/error.d.ts.map +1 -0
- package/dist/ai/providers/rtzr/error.js +29 -0
- package/dist/ai/providers/rtzr/index.d.ts +5 -0
- package/dist/ai/providers/rtzr/index.d.ts.map +1 -0
- package/dist/ai/providers/rtzr/index.js +6 -0
- package/dist/ai/providers/rtzr/model.d.ts +52 -0
- package/dist/ai/providers/rtzr/model.d.ts.map +1 -0
- package/dist/ai/providers/rtzr/model.js +137 -0
- package/dist/ai/providers/rtzr/options.d.ts +7 -0
- package/dist/ai/providers/rtzr/options.d.ts.map +1 -0
- package/dist/ai/providers/rtzr/options.js +47 -0
- package/dist/ai/providers/rtzr/provider.d.ts +18 -0
- package/dist/ai/providers/rtzr/provider.d.ts.map +1 -0
- package/dist/ai/providers/rtzr/provider.js +54 -0
- package/dist/ai/providers/rtzr/utils.d.ts +19 -0
- package/dist/ai/providers/rtzr/utils.d.ts.map +1 -0
- package/dist/ai/providers/rtzr/utils.js +88 -0
- package/dist/api/base-frame.d.ts +2 -2
- package/dist/api/base-frame.d.ts.map +1 -1
- package/dist/api/base-frame.js +13 -2
- package/dist/api/caster.d.ts.map +1 -1
- package/dist/api/caster.js +71 -2
- package/dist/api/code-converters.d.ts +58 -14
- package/dist/api/code-converters.d.ts.map +1 -1
- package/dist/api/code-converters.js +258 -2
- package/dist/api/config.d.ts +90 -0
- package/dist/api/config.d.ts.map +1 -0
- package/dist/api/config.js +25 -0
- package/dist/api/context.d.ts +4 -2
- package/dist/api/context.d.ts.map +1 -1
- package/dist/api/context.js +3 -2
- package/dist/api/decorators.d.ts +20 -6
- package/dist/api/decorators.d.ts.map +1 -1
- package/dist/api/decorators.js +235 -2
- package/dist/api/index.d.ts +2 -2
- package/dist/api/index.d.ts.map +1 -1
- package/dist/api/index.js +9 -2
- package/dist/api/sonamu.d.ts +10 -24
- package/dist/api/sonamu.d.ts.map +1 -1
- package/dist/api/sonamu.js +514 -2
- package/dist/api/validator.d.ts +6 -0
- package/dist/api/validator.d.ts.map +1 -0
- package/dist/api/validator.js +81 -0
- package/dist/bin/build-config.d.ts +6 -1
- package/dist/bin/build-config.d.ts.map +1 -1
- package/dist/bin/build-config.js +15 -2
- package/dist/bin/cli.js +519 -2
- package/dist/bin/hot-hook-register.d.ts +11 -0
- package/dist/bin/hot-hook-register.d.ts.map +1 -0
- package/dist/bin/hot-hook-register.js +21 -0
- package/dist/bin/loader-register.d.ts +2 -0
- package/dist/bin/loader-register.d.ts.map +1 -0
- package/dist/bin/loader-register.js +34 -0
- package/dist/database/_batch_update.d.ts +5 -3
- package/dist/database/_batch_update.d.ts.map +1 -1
- package/dist/database/_batch_update.js +95 -2
- package/dist/database/base-model.d.ts +96 -10
- package/dist/database/base-model.d.ts.map +1 -1
- package/dist/database/base-model.js +390 -2
- package/dist/database/base-model.types.d.ts +93 -0
- package/dist/database/base-model.types.d.ts.map +1 -0
- package/dist/database/base-model.types.js +10 -0
- package/dist/database/code-generator.d.ts +1 -1
- package/dist/database/code-generator.d.ts.map +1 -1
- package/dist/database/code-generator.js +54 -2
- package/dist/database/db.d.ts +6 -21
- package/dist/database/db.d.ts.map +1 -1
- package/dist/database/db.js +129 -2
- package/dist/database/puri-subset.test-d.js +81 -0
- package/dist/database/puri-subset.types.d.ts +123 -0
- package/dist/database/puri-subset.types.d.ts.map +1 -0
- package/dist/database/puri-subset.types.js +16 -0
- package/dist/database/puri-wrapper.d.ts +13 -11
- package/dist/database/puri-wrapper.d.ts.map +1 -1
- package/dist/database/puri-wrapper.js +109 -2
- package/dist/database/puri.d.ts +41 -23
- package/dist/database/puri.d.ts.map +1 -1
- package/dist/database/puri.js +601 -2
- package/dist/database/puri.types.d.ts +25 -6
- package/dist/database/puri.types.d.ts.map +1 -1
- package/dist/database/puri.types.js +6 -2
- package/dist/database/transaction-context.d.ts +1 -1
- package/dist/database/transaction-context.d.ts.map +1 -1
- package/dist/database/transaction-context.js +14 -2
- package/dist/database/upsert-builder.d.ts +9 -3
- package/dist/database/upsert-builder.d.ts.map +1 -1
- package/dist/database/upsert-builder.js +365 -2
- package/dist/entity/entity-manager.d.ts +167 -2
- package/dist/entity/entity-manager.d.ts.map +1 -1
- package/dist/entity/entity-manager.js +130 -2
- package/dist/entity/entity.d.ts +5 -3
- package/dist/entity/entity.d.ts.map +1 -1
- package/dist/entity/entity.js +750 -2
- package/dist/exceptions/error-handler.d.ts +1 -1
- package/dist/exceptions/error-handler.d.ts.map +1 -1
- package/dist/exceptions/error-handler.js +29 -2
- package/dist/exceptions/so-exceptions.d.ts +1 -1
- package/dist/exceptions/so-exceptions.d.ts.map +1 -1
- package/dist/exceptions/so-exceptions.js +85 -2
- package/dist/file-storage/driver.d.ts +1 -1
- package/dist/file-storage/driver.d.ts.map +1 -1
- package/dist/file-storage/driver.js +79 -2
- package/dist/file-storage/file-storage.js +75 -2
- package/dist/index.d.ts +18 -9
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +34 -2
- package/dist/migration/code-generation.d.ts +1 -1
- package/dist/migration/code-generation.d.ts.map +1 -1
- package/dist/migration/code-generation.js +614 -2
- package/dist/migration/migration-set.d.ts +2 -10
- package/dist/migration/migration-set.d.ts.map +1 -1
- package/dist/migration/migration-set.js +213 -2
- package/dist/migration/migrator.d.ts +24 -82
- package/dist/migration/migrator.d.ts.map +1 -1
- package/dist/migration/migrator.js +330 -2
- package/dist/migration/postgresql-schema-reader.d.ts +51 -0
- package/dist/migration/postgresql-schema-reader.d.ts.map +1 -0
- package/dist/migration/postgresql-schema-reader.js +245 -0
- package/dist/migration/types.d.ts +6 -38
- package/dist/migration/types.d.ts.map +1 -1
- package/dist/migration/types.js +3 -2
- package/dist/naite/messaging-types.d.ts +43 -0
- package/dist/naite/messaging-types.d.ts.map +1 -0
- package/dist/naite/messaging-types.js +7 -0
- package/dist/naite/naite-reporter.d.ts +41 -0
- package/dist/naite/naite-reporter.d.ts.map +1 -0
- package/dist/naite/naite-reporter.js +102 -0
- package/dist/naite/naite.d.ts +95 -0
- package/dist/naite/naite.d.ts.map +1 -0
- package/dist/naite/naite.js +316 -0
- package/dist/stream/index.js +3 -2
- package/dist/stream/sse.d.ts +2 -2
- package/dist/stream/sse.d.ts.map +1 -1
- package/dist/stream/sse.js +38 -2
- package/dist/syncer/api-parser.d.ts +10 -0
- package/dist/syncer/api-parser.d.ts.map +1 -0
- package/dist/syncer/api-parser.js +240 -0
- package/dist/syncer/checksum.d.ts +21 -0
- package/dist/syncer/checksum.d.ts.map +1 -0
- package/dist/syncer/checksum.js +98 -0
- package/dist/syncer/code-generator.d.ts +20 -0
- package/dist/syncer/code-generator.d.ts.map +1 -0
- package/dist/syncer/code-generator.js +161 -0
- package/dist/syncer/entity-operations.d.ts +17 -0
- package/dist/syncer/entity-operations.d.ts.map +1 -0
- package/dist/syncer/entity-operations.js +59 -0
- package/dist/syncer/file-patterns.d.ts +29 -0
- package/dist/syncer/file-patterns.d.ts.map +1 -0
- package/dist/syncer/file-patterns.js +38 -0
- package/dist/syncer/index.d.ts +6 -0
- package/dist/syncer/index.d.ts.map +1 -1
- package/dist/syncer/index.js +9 -2
- package/dist/syncer/module-loader.d.ts +35 -0
- package/dist/syncer/module-loader.d.ts.map +1 -0
- package/dist/syncer/module-loader.js +87 -0
- package/dist/syncer/syncer.d.ts +98 -106
- package/dist/syncer/syncer.d.ts.map +1 -1
- package/dist/syncer/syncer.js +422 -2
- package/dist/template/entity-converter.d.ts +14 -0
- package/dist/template/entity-converter.d.ts.map +1 -0
- package/dist/template/entity-converter.js +108 -0
- package/dist/template/helpers.d.ts +23 -0
- package/dist/template/helpers.d.ts.map +1 -0
- package/dist/template/helpers.js +64 -0
- package/dist/{templates → template/implementations}/entity.template.d.ts +3 -3
- package/dist/template/implementations/entity.template.d.ts.map +1 -0
- package/dist/template/implementations/entity.template.js +86 -0
- package/dist/{templates → template/implementations}/generated.template.d.ts +3 -4
- package/dist/template/implementations/generated.template.d.ts.map +1 -0
- package/dist/template/implementations/generated.template.js +249 -0
- package/dist/{templates → template/implementations}/generated_http.template.d.ts +3 -4
- package/dist/template/implementations/generated_http.template.d.ts.map +1 -0
- package/dist/template/implementations/generated_http.template.js +131 -0
- package/dist/{templates → template/implementations}/generated_sso.template.d.ts +4 -5
- package/dist/template/implementations/generated_sso.template.d.ts.map +1 -0
- package/dist/template/implementations/generated_sso.template.js +134 -0
- package/dist/{templates → template/implementations}/init_types.template.d.ts +3 -3
- package/dist/template/implementations/init_types.template.d.ts.map +1 -0
- package/dist/template/implementations/init_types.template.js +38 -0
- package/dist/template/implementations/model.template.d.ts +17 -0
- package/dist/template/implementations/model.template.d.ts.map +1 -0
- package/dist/template/implementations/model.template.js +181 -0
- package/dist/{templates → template/implementations}/model_test.template.d.ts +3 -3
- package/dist/template/implementations/model_test.template.d.ts.map +1 -0
- package/dist/template/implementations/model_test.template.js +35 -0
- package/dist/{templates → template/implementations}/service.template.d.ts +6 -6
- package/dist/template/implementations/service.template.d.ts.map +1 -0
- package/dist/template/implementations/service.template.js +201 -0
- package/dist/{templates → template/implementations}/view_enums_buttonset.template.d.ts +3 -3
- package/dist/template/implementations/view_enums_buttonset.template.d.ts.map +1 -0
- package/dist/template/implementations/view_enums_buttonset.template.js +31 -0
- package/dist/{templates → template/implementations}/view_enums_dropdown.template.d.ts +3 -4
- package/dist/template/implementations/view_enums_dropdown.template.d.ts.map +1 -0
- package/dist/template/implementations/view_enums_dropdown.template.js +50 -0
- package/dist/{templates → template/implementations}/view_enums_select.template.d.ts +3 -3
- package/dist/template/implementations/view_enums_select.template.d.ts.map +1 -0
- package/dist/template/implementations/view_enums_select.template.js +55 -0
- package/dist/{templates → template/implementations}/view_form.template.d.ts +5 -5
- package/dist/template/implementations/view_form.template.d.ts.map +1 -0
- package/dist/template/implementations/view_form.template.js +337 -0
- package/dist/{templates → template/implementations}/view_id_all_select.template.d.ts +3 -3
- package/dist/template/implementations/view_id_all_select.template.d.ts.map +1 -0
- package/dist/template/implementations/view_id_all_select.template.js +31 -0
- package/dist/{templates → template/implementations}/view_id_async_select.template.d.ts +3 -3
- package/dist/template/implementations/view_id_async_select.template.d.ts.map +1 -0
- package/dist/template/implementations/view_id_async_select.template.js +105 -0
- package/dist/{templates → template/implementations}/view_list.template.d.ts +5 -13
- package/dist/template/implementations/view_list.template.d.ts.map +1 -0
- package/dist/template/implementations/view_list.template.js +475 -0
- package/dist/template/implementations/view_list_columns.template.d.ts +17 -0
- package/dist/template/implementations/view_list_columns.template.d.ts.map +1 -0
- package/dist/template/implementations/view_list_columns.template.js +49 -0
- package/dist/{templates → template/implementations}/view_search_input.template.d.ts +3 -3
- package/dist/template/implementations/view_search_input.template.d.ts.map +1 -0
- package/dist/template/implementations/view_search_input.template.js +64 -0
- package/dist/template/index.d.ts +7 -0
- package/dist/template/index.d.ts.map +1 -0
- package/dist/template/index.js +8 -0
- package/dist/template/template-manager.d.ts +56 -0
- package/dist/template/template-manager.d.ts.map +1 -0
- package/dist/template/template-manager.js +125 -0
- package/dist/template/template-types.d.ts +16 -0
- package/dist/template/template-types.d.ts.map +1 -0
- package/dist/template/template-types.js +7 -0
- package/dist/template/template.d.ts +49 -0
- package/dist/template/template.d.ts.map +1 -0
- package/dist/template/template.js +60 -0
- package/dist/template/zod-converter.d.ts +51 -0
- package/dist/template/zod-converter.d.ts.map +1 -0
- package/dist/template/zod-converter.js +449 -0
- package/dist/testing/_relation-graph.d.ts +1 -1
- package/dist/testing/_relation-graph.d.ts.map +1 -1
- package/dist/testing/_relation-graph.js +89 -2
- package/dist/testing/fixture-manager.d.ts +42 -11
- package/dist/testing/fixture-manager.d.ts.map +1 -1
- package/dist/testing/fixture-manager.js +623 -2
- package/dist/types/types.d.ts +747 -143
- package/dist/types/types.d.ts.map +1 -1
- package/dist/types/types.js +546 -2
- package/dist/typings/knex.d.js +3 -2
- package/dist/utils/async-utils.d.ts +7 -0
- package/dist/utils/async-utils.d.ts.map +1 -1
- package/dist/utils/async-utils.js +57 -2
- package/dist/utils/console-util.d.ts +2 -0
- package/dist/utils/console-util.d.ts.map +1 -0
- package/dist/utils/console-util.js +6 -0
- package/dist/utils/controller.d.ts +1 -0
- package/dist/utils/controller.d.ts.map +1 -1
- package/dist/utils/controller.js +29 -2
- package/dist/utils/esm-utils.d.ts +39 -0
- package/dist/utils/esm-utils.d.ts.map +1 -0
- package/dist/utils/esm-utils.js +49 -0
- package/dist/utils/formatter.d.ts +3 -0
- package/dist/utils/formatter.d.ts.map +1 -0
- package/dist/utils/formatter.js +110 -0
- package/dist/utils/fs-utils.d.ts +1 -1
- package/dist/utils/fs-utils.d.ts.map +1 -1
- package/dist/utils/fs-utils.js +17 -2
- package/dist/utils/lodash-able.d.ts.map +1 -1
- package/dist/utils/lodash-able.js +6 -2
- package/dist/utils/model.js +22 -2
- package/dist/utils/object-utils.d.ts +44 -0
- package/dist/utils/object-utils.d.ts.map +1 -0
- package/dist/utils/object-utils.js +191 -0
- package/dist/utils/path-utils.d.ts +89 -0
- package/dist/utils/path-utils.d.ts.map +1 -0
- package/dist/utils/path-utils.js +60 -0
- package/dist/utils/process-utils.d.ts +13 -0
- package/dist/utils/process-utils.d.ts.map +1 -0
- package/dist/utils/process-utils.js +36 -0
- package/dist/utils/sql-parser.d.ts +5 -1
- package/dist/utils/sql-parser.d.ts.map +1 -1
- package/dist/utils/sql-parser.js +46 -2
- package/dist/utils/type-utils.d.ts +23 -0
- package/dist/utils/type-utils.d.ts.map +1 -0
- package/dist/utils/type-utils.js +45 -0
- package/dist/utils/utils.d.ts +10 -7
- package/dist/utils/utils.d.ts.map +1 -1
- package/dist/utils/utils.js +72 -2
- package/dist/utils/zod-error.d.ts +1 -1
- package/dist/utils/zod-error.d.ts.map +1 -1
- package/dist/utils/zod-error.js +19 -2
- package/package.json +65 -27
- package/src/ai/agents/agent.ts +87 -0
- package/src/ai/agents/index.ts +2 -0
- package/src/ai/agents/types.ts +47 -0
- package/src/ai/index.ts +1 -0
- package/src/ai/providers/rtzr/api.ts +37 -0
- package/src/ai/providers/rtzr/error.ts +34 -0
- package/src/ai/providers/rtzr/index.ts +4 -0
- package/src/ai/providers/rtzr/model.ts +201 -0
- package/src/ai/providers/rtzr/options.ts +49 -0
- package/src/ai/providers/rtzr/provider.ts +91 -0
- package/src/ai/providers/rtzr/utils.ts +127 -0
- package/src/api/base-frame.ts +4 -2
- package/src/api/caster.ts +17 -23
- package/src/api/code-converters.ts +178 -535
- package/src/api/config.ts +125 -0
- package/src/api/context.ts +7 -17
- package/src/api/decorators.ts +176 -46
- package/src/api/index.ts +2 -2
- package/src/api/sonamu.ts +190 -167
- package/src/api/validator.ts +83 -0
- package/src/bin/build-config.ts +8 -1
- package/src/bin/cli.ts +258 -124
- package/src/bin/hot-hook-register.ts +22 -0
- package/src/bin/loader-register.ts +38 -0
- package/src/database/_batch_update.ts +46 -31
- package/src/database/base-model.ts +390 -182
- package/src/database/base-model.types.ts +155 -0
- package/src/database/code-generator.ts +13 -32
- package/src/database/db.ts +40 -96
- package/src/database/puri-subset.test-d.ts +471 -0
- package/src/database/puri-subset.types.ts +195 -0
- package/src/database/puri-wrapper.ts +58 -67
- package/src/database/puri.ts +229 -148
- package/src/database/puri.types.ts +76 -30
- package/src/database/transaction-context.ts +1 -1
- package/src/database/upsert-builder.ts +262 -132
- package/src/entity/entity-manager.ts +48 -36
- package/src/entity/entity.ts +330 -248
- package/src/exceptions/error-handler.ts +3 -3
- package/src/exceptions/so-exceptions.ts +11 -11
- package/src/file-storage/driver.ts +5 -5
- package/src/file-storage/file-storage.ts +2 -2
- package/src/index.ts +18 -10
- package/src/migration/code-generation.ts +185 -172
- package/src/migration/migration-set.ts +80 -293
- package/src/migration/migrator.ts +199 -571
- package/src/migration/mysql-schema-reader.ts.txt +272 -0
- package/src/migration/postgresql-schema-reader.ts +310 -0
- package/src/migration/types.ts +6 -39
- package/src/naite/messaging-types.ts +51 -0
- package/src/naite/naite-reporter.ts +128 -0
- package/src/naite/naite.ts +415 -0
- package/src/shared/web.shared.ts.txt +20 -24
- package/src/stream/sse.ts +5 -5
- package/src/syncer/api-parser.ts +282 -0
- package/src/syncer/checksum.ts +140 -0
- package/src/syncer/code-generator.ts +198 -0
- package/src/syncer/entity-operations.ts +65 -0
- package/src/syncer/file-patterns.ts +56 -0
- package/src/syncer/index.ts +6 -0
- package/src/syncer/module-loader.ts +128 -0
- package/src/syncer/syncer.ts +389 -1453
- package/src/template/entity-converter.ts +114 -0
- package/src/template/helpers.ts +81 -0
- package/src/{templates → template/implementations}/entity.template.ts +7 -7
- package/src/{templates → template/implementations}/generated.template.ts +101 -101
- package/src/{templates → template/implementations}/generated_http.template.ts +27 -57
- package/src/template/implementations/generated_sso.template.ts +151 -0
- package/src/{templates → template/implementations}/init_types.template.ts +5 -7
- package/src/{templates → template/implementations}/model.template.ts +52 -43
- package/src/{templates → template/implementations}/model_test.template.ts +5 -5
- package/src/{templates → template/implementations}/service.template.ts +66 -82
- package/src/{templates → template/implementations}/view_enums_buttonset.template.ts +3 -3
- package/src/{templates → template/implementations}/view_enums_dropdown.template.ts +4 -20
- package/src/{templates → template/implementations}/view_enums_select.template.ts +4 -4
- package/src/{templates → template/implementations}/view_form.template.ts +40 -83
- package/src/{templates → template/implementations}/view_id_all_select.template.ts +3 -3
- package/src/{templates → template/implementations}/view_id_async_select.template.ts +10 -24
- package/src/{templates → template/implementations}/view_list.template.ts +60 -152
- package/src/{templates → template/implementations}/view_list_columns.template.ts +5 -11
- package/src/{templates → template/implementations}/view_search_input.template.ts +3 -3
- package/src/template/index.ts +6 -0
- package/src/template/template-manager.ts +166 -0
- package/src/template/template-types.ts +16 -0
- package/src/template/template.ts +105 -0
- package/src/template/zod-converter.ts +525 -0
- package/src/testing/_relation-graph.ts +18 -11
- package/src/testing/fixture-manager.ts +472 -359
- package/src/types/types.ts +553 -308
- package/src/typings/knex.d.ts +7 -9
- package/src/utils/async-utils.ts +23 -10
- package/src/utils/console-util.ts +4 -0
- package/src/utils/controller.ts +3 -0
- package/src/utils/esm-utils.ts +59 -0
- package/src/utils/formatter.ts +109 -0
- package/src/utils/fs-utils.ts +1 -1
- package/src/utils/lodash-able.ts +1 -4
- package/src/utils/object-utils.ts +217 -0
- package/src/utils/path-utils.ts +99 -0
- package/src/utils/process-utils.ts +46 -0
- package/src/utils/sql-parser.ts +23 -5
- package/src/utils/type-utils.ts +83 -0
- package/src/utils/utils.ts +66 -43
- package/src/utils/zod-error.ts +3 -4
- package/dist/api/base-frame.js.map +0 -1
- package/dist/api/caster.js.map +0 -1
- package/dist/api/code-converters.js.map +0 -1
- package/dist/api/context.js.map +0 -1
- package/dist/api/decorators.js.map +0 -1
- package/dist/api/index.js.map +0 -1
- package/dist/api/sonamu.js.map +0 -1
- package/dist/bin/build-config.js.map +0 -1
- package/dist/bin/cli-wrapper.d.ts +0 -3
- package/dist/bin/cli-wrapper.d.ts.map +0 -1
- package/dist/bin/cli-wrapper.js +0 -3
- package/dist/bin/cli-wrapper.js.map +0 -1
- package/dist/bin/cli.js.map +0 -1
- package/dist/database/_batch_update.js.map +0 -1
- package/dist/database/base-model.js.map +0 -1
- package/dist/database/code-generator.js.map +0 -1
- package/dist/database/db.js.map +0 -1
- package/dist/database/knex-plugins/knex-on-duplicate-update.d.ts +0 -2
- package/dist/database/knex-plugins/knex-on-duplicate-update.d.ts.map +0 -1
- package/dist/database/knex-plugins/knex-on-duplicate-update.js +0 -2
- package/dist/database/knex-plugins/knex-on-duplicate-update.js.map +0 -1
- package/dist/database/puri-wrapper.js.map +0 -1
- package/dist/database/puri.js.map +0 -1
- package/dist/database/puri.types.js.map +0 -1
- package/dist/database/transaction-context.js.map +0 -1
- package/dist/database/upsert-builder.js.map +0 -1
- package/dist/entity/entity-manager.js.map +0 -1
- package/dist/entity/entity-utils.d.ts +0 -61
- package/dist/entity/entity-utils.d.ts.map +0 -1
- package/dist/entity/entity-utils.js +0 -2
- package/dist/entity/entity-utils.js.map +0 -1
- package/dist/entity/entity.js.map +0 -1
- package/dist/exceptions/error-handler.js.map +0 -1
- package/dist/exceptions/so-exceptions.js.map +0 -1
- package/dist/file-storage/driver.js.map +0 -1
- package/dist/file-storage/file-storage.js.map +0 -1
- package/dist/index.js.map +0 -1
- package/dist/migration/code-generation.js.map +0 -1
- package/dist/migration/migration-set.js.map +0 -1
- package/dist/migration/migrator.js.map +0 -1
- package/dist/migration/types.js.map +0 -1
- package/dist/stream/index.js.map +0 -1
- package/dist/stream/sse.js.map +0 -1
- package/dist/syncer/index.js.map +0 -1
- package/dist/syncer/syncer.js.map +0 -1
- package/dist/templates/base-template.d.ts +0 -13
- package/dist/templates/base-template.d.ts.map +0 -1
- package/dist/templates/base-template.js +0 -2
- package/dist/templates/base-template.js.map +0 -1
- package/dist/templates/entity.template.d.ts.map +0 -1
- package/dist/templates/entity.template.js +0 -2
- package/dist/templates/entity.template.js.map +0 -1
- package/dist/templates/generated.template.d.ts.map +0 -1
- package/dist/templates/generated.template.js +0 -2
- package/dist/templates/generated.template.js.map +0 -1
- package/dist/templates/generated_http.template.d.ts.map +0 -1
- package/dist/templates/generated_http.template.js +0 -2
- package/dist/templates/generated_http.template.js.map +0 -1
- package/dist/templates/generated_sso.template.d.ts.map +0 -1
- package/dist/templates/generated_sso.template.js +0 -2
- package/dist/templates/generated_sso.template.js.map +0 -1
- package/dist/templates/index.d.ts +0 -2
- package/dist/templates/index.d.ts.map +0 -1
- package/dist/templates/index.js +0 -2
- package/dist/templates/index.js.map +0 -1
- package/dist/templates/init_types.template.d.ts.map +0 -1
- package/dist/templates/init_types.template.js +0 -2
- package/dist/templates/init_types.template.js.map +0 -1
- package/dist/templates/model.template.d.ts +0 -17
- package/dist/templates/model.template.d.ts.map +0 -1
- package/dist/templates/model.template.js +0 -2
- package/dist/templates/model.template.js.map +0 -1
- package/dist/templates/model_test.template.d.ts.map +0 -1
- package/dist/templates/model_test.template.js +0 -2
- package/dist/templates/model_test.template.js.map +0 -1
- package/dist/templates/service.template.d.ts.map +0 -1
- package/dist/templates/service.template.js +0 -2
- package/dist/templates/service.template.js.map +0 -1
- package/dist/templates/view_enums_buttonset.template.d.ts.map +0 -1
- package/dist/templates/view_enums_buttonset.template.js +0 -2
- package/dist/templates/view_enums_buttonset.template.js.map +0 -1
- package/dist/templates/view_enums_dropdown.template.d.ts.map +0 -1
- package/dist/templates/view_enums_dropdown.template.js +0 -2
- package/dist/templates/view_enums_dropdown.template.js.map +0 -1
- package/dist/templates/view_enums_select.template.d.ts.map +0 -1
- package/dist/templates/view_enums_select.template.js +0 -2
- package/dist/templates/view_enums_select.template.js.map +0 -1
- package/dist/templates/view_form.template.d.ts.map +0 -1
- package/dist/templates/view_form.template.js +0 -2
- package/dist/templates/view_form.template.js.map +0 -1
- package/dist/templates/view_id_all_select.template.d.ts.map +0 -1
- package/dist/templates/view_id_all_select.template.js +0 -2
- package/dist/templates/view_id_all_select.template.js.map +0 -1
- package/dist/templates/view_id_async_select.template.d.ts.map +0 -1
- package/dist/templates/view_id_async_select.template.js +0 -2
- package/dist/templates/view_id_async_select.template.js.map +0 -1
- package/dist/templates/view_list.template.d.ts.map +0 -1
- package/dist/templates/view_list.template.js +0 -2
- package/dist/templates/view_list.template.js.map +0 -1
- package/dist/templates/view_list_columns.template.d.ts +0 -17
- package/dist/templates/view_list_columns.template.d.ts.map +0 -1
- package/dist/templates/view_list_columns.template.js +0 -2
- package/dist/templates/view_list_columns.template.js.map +0 -1
- package/dist/templates/view_search_input.template.d.ts.map +0 -1
- package/dist/templates/view_search_input.template.js +0 -2
- package/dist/templates/view_search_input.template.js.map +0 -1
- package/dist/testing/_relation-graph.js.map +0 -1
- package/dist/testing/fixture-manager.js.map +0 -1
- package/dist/types/types.js.map +0 -1
- package/dist/typings/knex.d.js.map +0 -1
- package/dist/utils/async-utils.js.map +0 -1
- package/dist/utils/controller.js.map +0 -1
- package/dist/utils/fs-utils.js.map +0 -1
- package/dist/utils/lodash-able.js.map +0 -1
- package/dist/utils/model.js.map +0 -1
- package/dist/utils/sql-parser.js.map +0 -1
- package/dist/utils/utils.js.map +0 -1
- package/dist/utils/zod-error.js.map +0 -1
- package/src/bin/cli-wrapper.ts +0 -75
- package/src/database/knex-plugins/knex-on-duplicate-update.ts +0 -45
- package/src/entity/entity-utils.ts +0 -291
- package/src/templates/base-template.ts +0 -19
- package/src/templates/generated_sso.template.ts +0 -138
- package/src/templates/index.ts +0 -1
package/dist/types/types.js
CHANGED
|
@@ -1,2 +1,546 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
/*
|
|
3
|
+
Utility Types
|
|
4
|
+
*/ export function zArrayable(shape) {
|
|
5
|
+
return z.union([
|
|
6
|
+
shape,
|
|
7
|
+
shape.array()
|
|
8
|
+
]);
|
|
9
|
+
}
|
|
10
|
+
/*
|
|
11
|
+
Prop Type Guards
|
|
12
|
+
*/ export function isIntegerSingleProp(p) {
|
|
13
|
+
return p?.type === "integer";
|
|
14
|
+
}
|
|
15
|
+
export function isIntegerArrayProp(p) {
|
|
16
|
+
return p?.type === "integer[]";
|
|
17
|
+
}
|
|
18
|
+
export function isIntegerProp(p) {
|
|
19
|
+
return isIntegerSingleProp(p) || isIntegerArrayProp(p);
|
|
20
|
+
}
|
|
21
|
+
export function isBigIntegerSingleProp(p) {
|
|
22
|
+
return p?.type === "bigInteger";
|
|
23
|
+
}
|
|
24
|
+
export function isBigIntegerArrayProp(p) {
|
|
25
|
+
return p?.type === "bigInteger[]";
|
|
26
|
+
}
|
|
27
|
+
export function isBigIntegerProp(p) {
|
|
28
|
+
return isBigIntegerSingleProp(p) || isBigIntegerArrayProp(p);
|
|
29
|
+
}
|
|
30
|
+
export function isStringSingleProp(p) {
|
|
31
|
+
return p?.type === "string";
|
|
32
|
+
}
|
|
33
|
+
export function isStringArrayProp(p) {
|
|
34
|
+
return p?.type === "string[]";
|
|
35
|
+
}
|
|
36
|
+
export function isStringProp(p) {
|
|
37
|
+
return isStringSingleProp(p) || isStringArrayProp(p);
|
|
38
|
+
}
|
|
39
|
+
export function isEnumSingleProp(p) {
|
|
40
|
+
return p?.type === "enum";
|
|
41
|
+
}
|
|
42
|
+
export function isEnumArrayProp(p) {
|
|
43
|
+
return p?.type === "enum[]";
|
|
44
|
+
}
|
|
45
|
+
export function isEnumProp(p) {
|
|
46
|
+
return isEnumSingleProp(p) || isEnumArrayProp(p);
|
|
47
|
+
}
|
|
48
|
+
export function isNumberSingleProp(p) {
|
|
49
|
+
return p?.type === "number";
|
|
50
|
+
}
|
|
51
|
+
export function isNumberArrayProp(p) {
|
|
52
|
+
return p?.type === "number[]";
|
|
53
|
+
}
|
|
54
|
+
export function isNumberProp(p) {
|
|
55
|
+
return isNumberSingleProp(p) || isNumberArrayProp(p);
|
|
56
|
+
}
|
|
57
|
+
export function isNumericSingleProp(p) {
|
|
58
|
+
return p?.type === "numeric";
|
|
59
|
+
}
|
|
60
|
+
export function isNumericArrayProp(p) {
|
|
61
|
+
return p?.type === "numeric[]";
|
|
62
|
+
}
|
|
63
|
+
export function isNumericProp(p) {
|
|
64
|
+
return isNumericSingleProp(p) || isNumericArrayProp(p);
|
|
65
|
+
}
|
|
66
|
+
export function isBooleanSingleProp(p) {
|
|
67
|
+
return p?.type === "boolean";
|
|
68
|
+
}
|
|
69
|
+
export function isBooleanArrayProp(p) {
|
|
70
|
+
return p?.type === "boolean[]";
|
|
71
|
+
}
|
|
72
|
+
export function isBooleanProp(p) {
|
|
73
|
+
return isBooleanSingleProp(p) || isBooleanArrayProp(p);
|
|
74
|
+
}
|
|
75
|
+
export function isDateSingleProp(p) {
|
|
76
|
+
return p?.type === "date";
|
|
77
|
+
}
|
|
78
|
+
export function isDateArrayProp(p) {
|
|
79
|
+
return p?.type === "date[]";
|
|
80
|
+
}
|
|
81
|
+
export function isDateProp(p) {
|
|
82
|
+
return isDateSingleProp(p) || isDateArrayProp(p);
|
|
83
|
+
}
|
|
84
|
+
export function isUuidSingleProp(p) {
|
|
85
|
+
return p?.type === "uuid";
|
|
86
|
+
}
|
|
87
|
+
export function isUuidArrayProp(p) {
|
|
88
|
+
return p?.type === "uuid[]";
|
|
89
|
+
}
|
|
90
|
+
export function isUuidProp(p) {
|
|
91
|
+
return isUuidSingleProp(p) || isUuidArrayProp(p);
|
|
92
|
+
}
|
|
93
|
+
export function isJsonProp(p) {
|
|
94
|
+
return p?.type === "json";
|
|
95
|
+
}
|
|
96
|
+
export function isVirtualProp(p) {
|
|
97
|
+
return p?.type === "virtual";
|
|
98
|
+
}
|
|
99
|
+
export function isRelationProp(p) {
|
|
100
|
+
return p?.type === "relation";
|
|
101
|
+
}
|
|
102
|
+
export function isOneToOneRelationProp(p) {
|
|
103
|
+
return p?.relationType === "OneToOne";
|
|
104
|
+
}
|
|
105
|
+
export function isBelongsToOneRelationProp(p) {
|
|
106
|
+
return p?.relationType === "BelongsToOne";
|
|
107
|
+
}
|
|
108
|
+
export function isHasManyRelationProp(p) {
|
|
109
|
+
return p?.relationType === "HasMany";
|
|
110
|
+
}
|
|
111
|
+
export function isManyToManyRelationProp(p) {
|
|
112
|
+
return p?.relationType === "ManyToMany";
|
|
113
|
+
}
|
|
114
|
+
export function isCustomJoinClause(p) {
|
|
115
|
+
return !!p?.custom;
|
|
116
|
+
}
|
|
117
|
+
/* BaseModel */ export const SonamuQueryMode = z.enum([
|
|
118
|
+
"both",
|
|
119
|
+
"list",
|
|
120
|
+
"count"
|
|
121
|
+
]);
|
|
122
|
+
export function isKnexError(e) {
|
|
123
|
+
return !!e?.code && !!e?.sqlMessage && !!e?.sqlState;
|
|
124
|
+
}
|
|
125
|
+
(function(ApiParamType) {
|
|
126
|
+
function isObject(v) {
|
|
127
|
+
return v?.t === "object";
|
|
128
|
+
}
|
|
129
|
+
ApiParamType.isObject = isObject;
|
|
130
|
+
function isUnion(v) {
|
|
131
|
+
return v?.t === "union";
|
|
132
|
+
}
|
|
133
|
+
ApiParamType.isUnion = isUnion;
|
|
134
|
+
function isIntersection(v) {
|
|
135
|
+
return v?.t === "intersection";
|
|
136
|
+
}
|
|
137
|
+
ApiParamType.isIntersection = isIntersection;
|
|
138
|
+
function isStringLiteral(v) {
|
|
139
|
+
return v?.t === "string-literal";
|
|
140
|
+
}
|
|
141
|
+
ApiParamType.isStringLiteral = isStringLiteral;
|
|
142
|
+
function isNumericLiteral(v) {
|
|
143
|
+
return v?.t === "numeric-literal";
|
|
144
|
+
}
|
|
145
|
+
ApiParamType.isNumericLiteral = isNumericLiteral;
|
|
146
|
+
function isArray(v) {
|
|
147
|
+
return v?.t === "array";
|
|
148
|
+
}
|
|
149
|
+
ApiParamType.isArray = isArray;
|
|
150
|
+
function isRef(v) {
|
|
151
|
+
return typeof v === "object" && v !== null && v.t === "ref";
|
|
152
|
+
}
|
|
153
|
+
ApiParamType.isRef = isRef;
|
|
154
|
+
function isIndexedAccess(v) {
|
|
155
|
+
return typeof v === "object" && v !== null && v.t === "indexed-access";
|
|
156
|
+
}
|
|
157
|
+
ApiParamType.isIndexedAccess = isIndexedAccess;
|
|
158
|
+
function isTupleType(v) {
|
|
159
|
+
return typeof v === "object" && v !== null && v.t === "tuple-type";
|
|
160
|
+
}
|
|
161
|
+
ApiParamType.isTupleType = isTupleType;
|
|
162
|
+
function isPick(v) {
|
|
163
|
+
return typeof v === "object" && v !== null && v.t === "ref" && v.id === "Pick";
|
|
164
|
+
}
|
|
165
|
+
ApiParamType.isPick = isPick;
|
|
166
|
+
function isOmit(v) {
|
|
167
|
+
return typeof v === "object" && v !== null && v.t === "ref" && v.id === "Omit";
|
|
168
|
+
}
|
|
169
|
+
ApiParamType.isOmit = isOmit;
|
|
170
|
+
function isPartial(v) {
|
|
171
|
+
return typeof v === "object" && v !== null && v.t === "ref" && v.id === "Partial";
|
|
172
|
+
}
|
|
173
|
+
ApiParamType.isPartial = isPartial;
|
|
174
|
+
function isPromise(v) {
|
|
175
|
+
return typeof v === "object" && v !== null && v.t === "ref" && v.id === "Promise";
|
|
176
|
+
}
|
|
177
|
+
ApiParamType.isPromise = isPromise;
|
|
178
|
+
function isContext(v) {
|
|
179
|
+
return typeof v === "object" && v !== null && v.t === "ref" && v.id === "Context";
|
|
180
|
+
}
|
|
181
|
+
ApiParamType.isContext = isContext;
|
|
182
|
+
function isRefKnex(v) {
|
|
183
|
+
return typeof v === "object" && v !== null && v.t === "ref" && v.id === "Knex";
|
|
184
|
+
}
|
|
185
|
+
ApiParamType.isRefKnex = isRefKnex;
|
|
186
|
+
function isTypeParam(v) {
|
|
187
|
+
return typeof v === "object" && v !== null && v.t === "type-param";
|
|
188
|
+
}
|
|
189
|
+
ApiParamType.isTypeParam = isTypeParam;
|
|
190
|
+
})(ApiParamType || (ApiParamType = {}));
|
|
191
|
+
/* Template */ /**
|
|
192
|
+
* UI 컴포넌트 렌더링을 위한 메타데이터 노드입니다.
|
|
193
|
+
*
|
|
194
|
+
* **목적**: Zod 스키마로부터 프론트엔드 UI 컴포넌트를 자동 생성하기 위한
|
|
195
|
+
* 렌더링 정보를 담은 트리 구조입니다. 각 필드가 어떤 UI 컴포넌트로
|
|
196
|
+
* 표현되어야 하는지(텍스트, 이미지, 날짜, Enum 선택 등)를 명시합니다.
|
|
197
|
+
*
|
|
198
|
+
* **변환 흐름**:
|
|
199
|
+
* Entity subset → EntityPropNode → Zod 스키마 → RenderingNode (UI용) → React 컴포넌트 코드 생성
|
|
200
|
+
*
|
|
201
|
+
* **주요 필드**:
|
|
202
|
+
* - `renderType`: UI 컴포넌트 유형 (string-plain, number-fk_id, enums, array 등)
|
|
203
|
+
* - `zodType`: 원본 Zod 스키마 (validation 용)
|
|
204
|
+
* - `children`: 중첩된 객체 필드들 (object일 때)
|
|
205
|
+
* - `element`: 배열 요소 타입 (array일 때)
|
|
206
|
+
*
|
|
207
|
+
* **사용 위치**:
|
|
208
|
+
* - zod-converter.ts의 zodTypeToRenderingNode()에서 생성
|
|
209
|
+
* - view_form.template.ts, view_list.template.ts 등에서 React 컴포넌트 코드 생성에 사용
|
|
210
|
+
*/ // 셀프 참조 타입이므로 Zod 생략하고 직접 정의
|
|
211
|
+
export const RenderingNode = z.any();
|
|
212
|
+
const BasePropFields = {
|
|
213
|
+
name: z.string(),
|
|
214
|
+
desc: z.string().optional(),
|
|
215
|
+
nullable: z.boolean().optional(),
|
|
216
|
+
toFilter: z.literal(true).optional(),
|
|
217
|
+
dbDefault: z.union([
|
|
218
|
+
z.string(),
|
|
219
|
+
z.number(),
|
|
220
|
+
z.boolean()
|
|
221
|
+
]).optional()
|
|
222
|
+
};
|
|
223
|
+
// 부가 필드가 필요없는 prop
|
|
224
|
+
const BasePropFieldsWithoutAdditional = z.object({
|
|
225
|
+
...BasePropFields,
|
|
226
|
+
type: z.union([
|
|
227
|
+
z.literal("integer"),
|
|
228
|
+
z.literal("integer[]"),
|
|
229
|
+
z.literal("bigInteger"),
|
|
230
|
+
z.literal("bigInteger[]"),
|
|
231
|
+
z.literal("boolean"),
|
|
232
|
+
z.literal("boolean[]"),
|
|
233
|
+
z.literal("date"),
|
|
234
|
+
z.literal("date[]"),
|
|
235
|
+
z.literal("uuid"),
|
|
236
|
+
z.literal("uuid[]")
|
|
237
|
+
])
|
|
238
|
+
}).strict();
|
|
239
|
+
// precision/scale 필드
|
|
240
|
+
const PrecisionScaleFields = {
|
|
241
|
+
precision: z.number().optional(),
|
|
242
|
+
scale: z.number().optional()
|
|
243
|
+
};
|
|
244
|
+
// 각 타입별 스키마 정의
|
|
245
|
+
const StringPropSchema = z.object({
|
|
246
|
+
...BasePropFields,
|
|
247
|
+
type: z.literal("string"),
|
|
248
|
+
length: z.number().optional()
|
|
249
|
+
}).strict();
|
|
250
|
+
const StringArrayPropSchema = z.object({
|
|
251
|
+
...BasePropFields,
|
|
252
|
+
type: z.literal("string[]"),
|
|
253
|
+
length: z.number().optional()
|
|
254
|
+
}).strict();
|
|
255
|
+
const EnumPropSchema = z.object({
|
|
256
|
+
...BasePropFields,
|
|
257
|
+
type: z.literal("enum"),
|
|
258
|
+
id: z.string()
|
|
259
|
+
}).strict();
|
|
260
|
+
const EnumArrayPropSchema = z.object({
|
|
261
|
+
...BasePropFields,
|
|
262
|
+
type: z.literal("enum[]"),
|
|
263
|
+
id: z.string()
|
|
264
|
+
}).strict();
|
|
265
|
+
const NumberPropSchema = z.object({
|
|
266
|
+
...BasePropFields,
|
|
267
|
+
type: z.literal("number"),
|
|
268
|
+
...PrecisionScaleFields,
|
|
269
|
+
numberType: z.enum([
|
|
270
|
+
"real",
|
|
271
|
+
"double precision",
|
|
272
|
+
"numeric"
|
|
273
|
+
]).optional()
|
|
274
|
+
}).strict();
|
|
275
|
+
const NumberArrayPropSchema = z.object({
|
|
276
|
+
...BasePropFields,
|
|
277
|
+
type: z.literal("number[]"),
|
|
278
|
+
...PrecisionScaleFields,
|
|
279
|
+
numberType: z.enum([
|
|
280
|
+
"real",
|
|
281
|
+
"double precision",
|
|
282
|
+
"numeric"
|
|
283
|
+
]).optional()
|
|
284
|
+
}).strict();
|
|
285
|
+
const NumericPropSchema = z.object({
|
|
286
|
+
...BasePropFields,
|
|
287
|
+
type: z.literal("numeric"),
|
|
288
|
+
...PrecisionScaleFields
|
|
289
|
+
}).strict();
|
|
290
|
+
const NumericArrayPropSchema = z.object({
|
|
291
|
+
...BasePropFields,
|
|
292
|
+
type: z.literal("numeric[]"),
|
|
293
|
+
...PrecisionScaleFields
|
|
294
|
+
}).strict();
|
|
295
|
+
const JsonPropSchema = z.object({
|
|
296
|
+
...BasePropFields,
|
|
297
|
+
type: z.literal("json"),
|
|
298
|
+
id: z.string()
|
|
299
|
+
}).strict();
|
|
300
|
+
const VirtualPropSchema = z.object({
|
|
301
|
+
...BasePropFields,
|
|
302
|
+
type: z.literal("virtual"),
|
|
303
|
+
id: z.string()
|
|
304
|
+
}).strict();
|
|
305
|
+
// Relation 타입은 relationType에 따라 세분화
|
|
306
|
+
const BaseRelationFields = {
|
|
307
|
+
...BasePropFields,
|
|
308
|
+
type: z.literal("relation"),
|
|
309
|
+
with: z.string()
|
|
310
|
+
};
|
|
311
|
+
// RelationOn 타입
|
|
312
|
+
const RelationOnSchema = z.enum([
|
|
313
|
+
"CASCADE",
|
|
314
|
+
"SET NULL",
|
|
315
|
+
"NO ACTION",
|
|
316
|
+
"SET DEFAULT",
|
|
317
|
+
"RESTRICT"
|
|
318
|
+
]);
|
|
319
|
+
const BelongsToOneRelationPropSchema = z.object({
|
|
320
|
+
...BaseRelationFields,
|
|
321
|
+
relationType: z.literal("BelongsToOne"),
|
|
322
|
+
customJoinClause: z.string().optional(),
|
|
323
|
+
useConstraint: z.boolean().optional(),
|
|
324
|
+
onUpdate: RelationOnSchema.optional(),
|
|
325
|
+
onDelete: RelationOnSchema.optional()
|
|
326
|
+
}).strict();
|
|
327
|
+
const HasManyRelationPropSchema = z.object({
|
|
328
|
+
...BaseRelationFields,
|
|
329
|
+
relationType: z.literal("HasMany"),
|
|
330
|
+
joinColumn: z.string(),
|
|
331
|
+
fromColumn: z.string().optional()
|
|
332
|
+
}).strict();
|
|
333
|
+
const ManyToManyRelationPropSchema = z.object({
|
|
334
|
+
...BaseRelationFields,
|
|
335
|
+
relationType: z.literal("ManyToMany"),
|
|
336
|
+
joinTable: z.string(),
|
|
337
|
+
onUpdate: RelationOnSchema,
|
|
338
|
+
onDelete: RelationOnSchema
|
|
339
|
+
}).strict();
|
|
340
|
+
const OneToOneRelationPropSchema = z.object({
|
|
341
|
+
...BaseRelationFields,
|
|
342
|
+
relationType: z.literal("OneToOne"),
|
|
343
|
+
customJoinClause: z.string().optional(),
|
|
344
|
+
hasJoinColumn: z.boolean().optional(),
|
|
345
|
+
useConstraint: z.boolean().optional(),
|
|
346
|
+
onUpdate: RelationOnSchema.optional(),
|
|
347
|
+
onDelete: RelationOnSchema.optional()
|
|
348
|
+
}).strict();
|
|
349
|
+
const RelationTypes = [
|
|
350
|
+
"BelongsToOne",
|
|
351
|
+
"HasMany",
|
|
352
|
+
"ManyToMany",
|
|
353
|
+
"OneToOne"
|
|
354
|
+
];
|
|
355
|
+
export const RelationPropSchema = z.discriminatedUnion("relationType", [
|
|
356
|
+
BelongsToOneRelationPropSchema,
|
|
357
|
+
HasManyRelationPropSchema,
|
|
358
|
+
ManyToManyRelationPropSchema,
|
|
359
|
+
OneToOneRelationPropSchema
|
|
360
|
+
], {
|
|
361
|
+
error: (iss)=>`relationType은 ${RelationTypes.map((t)=>`'${t}'`).join(", ")} 중 하나여야 합니다. 입력값: "${iss.input?.relationType}"`
|
|
362
|
+
});
|
|
363
|
+
const NormalPropTypes = [
|
|
364
|
+
"integer",
|
|
365
|
+
"integer[]",
|
|
366
|
+
"bigInteger",
|
|
367
|
+
"bigInteger[]",
|
|
368
|
+
"string",
|
|
369
|
+
"string[]",
|
|
370
|
+
"enum",
|
|
371
|
+
"enum[]",
|
|
372
|
+
"number",
|
|
373
|
+
"number[]",
|
|
374
|
+
"numeric",
|
|
375
|
+
"numeric[]",
|
|
376
|
+
"boolean",
|
|
377
|
+
"boolean[]",
|
|
378
|
+
"date",
|
|
379
|
+
"date[]",
|
|
380
|
+
"uuid",
|
|
381
|
+
"uuid[]",
|
|
382
|
+
"json",
|
|
383
|
+
"virtual"
|
|
384
|
+
];
|
|
385
|
+
export const NormalPropSchema = z.discriminatedUnion("type", [
|
|
386
|
+
BasePropFieldsWithoutAdditional,
|
|
387
|
+
StringPropSchema,
|
|
388
|
+
StringArrayPropSchema,
|
|
389
|
+
EnumPropSchema,
|
|
390
|
+
EnumArrayPropSchema,
|
|
391
|
+
NumberPropSchema,
|
|
392
|
+
NumberArrayPropSchema,
|
|
393
|
+
NumericPropSchema,
|
|
394
|
+
NumericArrayPropSchema,
|
|
395
|
+
JsonPropSchema,
|
|
396
|
+
VirtualPropSchema
|
|
397
|
+
], {
|
|
398
|
+
error: (iss)=>`type은 ${NormalPropTypes.map((t)=>`'${t}'`).join(", ")} 중 하나여야 합니다. 입력값: "${iss.input?.type}"`
|
|
399
|
+
});
|
|
400
|
+
const AllPropTypes = [
|
|
401
|
+
...NormalPropTypes,
|
|
402
|
+
"relation"
|
|
403
|
+
];
|
|
404
|
+
const EntityPropSchema = z.discriminatedUnion("type", [
|
|
405
|
+
NormalPropSchema,
|
|
406
|
+
RelationPropSchema
|
|
407
|
+
], {
|
|
408
|
+
error: (iss)=>`type은 ${AllPropTypes.map((t)=>`'${t}'`).join(", ")} 중 하나여야 합니다. 입력값: "${iss.input?.type}"`
|
|
409
|
+
});
|
|
410
|
+
// EntityIndex 스키마 정의
|
|
411
|
+
const EntityIndexSchema = z.object({
|
|
412
|
+
type: z.enum([
|
|
413
|
+
"index",
|
|
414
|
+
"unique",
|
|
415
|
+
"fulltext"
|
|
416
|
+
]),
|
|
417
|
+
columns: z.array(z.string()),
|
|
418
|
+
name: z.string().optional(),
|
|
419
|
+
parser: z.enum([
|
|
420
|
+
"built-in",
|
|
421
|
+
"ngram"
|
|
422
|
+
]).optional()
|
|
423
|
+
}).strict();
|
|
424
|
+
export const EntityJsonSchema = z.object({
|
|
425
|
+
id: z.string().describe("PascalCase로 된 Entity ID"),
|
|
426
|
+
title: z.string().describe("Entity 이름"),
|
|
427
|
+
table: z.string().describe("snake_case로 된 테이블명"),
|
|
428
|
+
parentId: z.string().optional().describe("부모 Entity ID"),
|
|
429
|
+
props: z.array(EntityPropSchema),
|
|
430
|
+
indexes: z.array(EntityIndexSchema),
|
|
431
|
+
subsets: z.record(z.string(), z.array(z.string())),
|
|
432
|
+
enums: z.record(z.string(), z.record(z.string(), z.string()))
|
|
433
|
+
}).strict();
|
|
434
|
+
export const TemplateOptions = z.object({
|
|
435
|
+
entity: EntityJsonSchema.omit({
|
|
436
|
+
id: true
|
|
437
|
+
}).extend({
|
|
438
|
+
entityId: z.string()
|
|
439
|
+
}).partial({
|
|
440
|
+
table: true,
|
|
441
|
+
props: true,
|
|
442
|
+
indexes: true,
|
|
443
|
+
subsets: true,
|
|
444
|
+
enums: true
|
|
445
|
+
}),
|
|
446
|
+
init_types: z.object({
|
|
447
|
+
entityId: z.string()
|
|
448
|
+
}),
|
|
449
|
+
generated: z.object({}),
|
|
450
|
+
generated_sso: z.object({}),
|
|
451
|
+
generated_http: z.object({
|
|
452
|
+
entityId: z.string()
|
|
453
|
+
}),
|
|
454
|
+
model: z.object({
|
|
455
|
+
entityId: z.string(),
|
|
456
|
+
defaultSearchField: z.string().optional(),
|
|
457
|
+
defaultOrderBy: z.string().optional()
|
|
458
|
+
}),
|
|
459
|
+
model_test: z.object({
|
|
460
|
+
entityId: z.string()
|
|
461
|
+
}),
|
|
462
|
+
bridge: z.object({
|
|
463
|
+
entityId: z.string()
|
|
464
|
+
}),
|
|
465
|
+
service: z.object({
|
|
466
|
+
namesRecord: z.object({
|
|
467
|
+
fs: z.string(),
|
|
468
|
+
fsPlural: z.string(),
|
|
469
|
+
camel: z.string(),
|
|
470
|
+
camelPlural: z.string(),
|
|
471
|
+
capital: z.string(),
|
|
472
|
+
capitalPlural: z.string(),
|
|
473
|
+
upper: z.string(),
|
|
474
|
+
constant: z.string()
|
|
475
|
+
}),
|
|
476
|
+
modelTsPath: z.string()
|
|
477
|
+
}),
|
|
478
|
+
view_list: z.object({
|
|
479
|
+
entityId: z.string(),
|
|
480
|
+
extra: z.unknown()
|
|
481
|
+
}),
|
|
482
|
+
view_list_columns: z.object({
|
|
483
|
+
entityId: z.string(),
|
|
484
|
+
columns: z.object({
|
|
485
|
+
name: z.string(),
|
|
486
|
+
label: z.string(),
|
|
487
|
+
tc: z.string()
|
|
488
|
+
}).array(),
|
|
489
|
+
columnImports: z.string()
|
|
490
|
+
}),
|
|
491
|
+
view_search_input: z.object({
|
|
492
|
+
entityId: z.string()
|
|
493
|
+
}),
|
|
494
|
+
view_form: z.object({
|
|
495
|
+
entityId: z.string()
|
|
496
|
+
}),
|
|
497
|
+
view_id_all_select: z.object({
|
|
498
|
+
entityId: z.string()
|
|
499
|
+
}),
|
|
500
|
+
view_id_async_select: z.object({
|
|
501
|
+
entityId: z.string(),
|
|
502
|
+
textField: z.string()
|
|
503
|
+
}),
|
|
504
|
+
view_enums_select: z.object({
|
|
505
|
+
entityId: z.string(),
|
|
506
|
+
enumId: z.string()
|
|
507
|
+
}),
|
|
508
|
+
view_enums_dropdown: z.object({
|
|
509
|
+
entityId: z.string(),
|
|
510
|
+
enumId: z.string()
|
|
511
|
+
}),
|
|
512
|
+
view_enums_buttonset: z.object({
|
|
513
|
+
entityId: z.string(),
|
|
514
|
+
enumId: z.string()
|
|
515
|
+
})
|
|
516
|
+
});
|
|
517
|
+
export const TemplateKey = z.enum([
|
|
518
|
+
"entity",
|
|
519
|
+
"init_types",
|
|
520
|
+
"generated",
|
|
521
|
+
"generated_sso",
|
|
522
|
+
"generated_http",
|
|
523
|
+
"model",
|
|
524
|
+
"model_test",
|
|
525
|
+
"bridge",
|
|
526
|
+
"service",
|
|
527
|
+
"view_list",
|
|
528
|
+
"view_list_columns",
|
|
529
|
+
"view_search_input",
|
|
530
|
+
"view_form",
|
|
531
|
+
"view_id_all_select",
|
|
532
|
+
"view_id_async_select",
|
|
533
|
+
"view_enums_select",
|
|
534
|
+
"view_enums_dropdown",
|
|
535
|
+
"view_enums_buttonset"
|
|
536
|
+
]);
|
|
537
|
+
export const GenerateOptions = z.object({
|
|
538
|
+
overwrite: z.boolean().optional()
|
|
539
|
+
});
|
|
540
|
+
export const PathAndCode = z.object({
|
|
541
|
+
path: z.string(),
|
|
542
|
+
code: z.string()
|
|
543
|
+
});
|
|
544
|
+
export var ApiParamType;
|
|
545
|
+
|
|
546
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy90eXBlcy90eXBlcy50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IEZhc3RpZnlSZXBseSwgRmFzdGlmeVJlcXVlc3QgfSBmcm9tIFwiZmFzdGlmeVwiO1xuaW1wb3J0IHsgeiB9IGZyb20gXCJ6b2RcIjtcbmltcG9ydCB0eXBlIHsgQXBpRGVjb3JhdG9yT3B0aW9ucywgQXV0aENvbnRleHQsIENvbnRleHQgfSBmcm9tIFwiLi4vYXBpXCI7XG5pbXBvcnQgdHlwZSB7IEd1YXJkS2V5IH0gZnJvbSBcIi4vLi4vYXBpL2RlY29yYXRvcnNcIjtcblxuLypcbiAgVXRpbGl0eSBUeXBlc1xuKi9cbmV4cG9ydCBmdW5jdGlvbiB6QXJyYXlhYmxlPFQgZXh0ZW5kcyB6LlpvZFR5cGVBbnk+KHNoYXBlOiBUKTogei5ab2RVbmlvbjxbVCwgei5ab2RBcnJheTxUPl0+IHtcbiAgcmV0dXJuIHoudW5pb24oW3NoYXBlLCBzaGFwZS5hcnJheSgpXSk7XG59XG4vLyBiaW9tZS1pZ25vcmUgbGludC9zdXNwaWNpb3VzL25vRXhwbGljaXRBbnk6IGFueSBpcyB1c2VkIHRvIG1ha2UgdGhlIHR5cGUgZGlzdHJpYnV0aXZlXG5leHBvcnQgdHlwZSBEaXN0cmlidXRpdmVPbWl0PFQsIEsgZXh0ZW5kcyBrZXlvZiBhbnk+ID0gVCBleHRlbmRzIGFueSA/IE9taXQ8VCwgSz4gOiBuZXZlcjtcblxuLypcbiAgTW9kZWwtRGVmaW50aW9uXG4qL1xuZXhwb3J0IHR5cGUgQ29tbW9uUHJvcCA9IHtcbiAgbmFtZTogc3RyaW5nO1xuICBudWxsYWJsZT86IGJvb2xlYW47XG4gIHRvRmlsdGVyPzogdHJ1ZTtcbiAgZGVzYz86IHN0cmluZztcbiAgZGJEZWZhdWx0Pzogc3RyaW5nO1xufTtcbmV4cG9ydCB0eXBlIEludGVnZXJQcm9wID0gQ29tbW9uUHJvcCAmIHtcbiAgdHlwZTogXCJpbnRlZ2VyXCI7XG59OyAvLyBQRzogaW50ZWdlciAvIFRTOiBudW1iZXIgLyBKU09OOiBudW1iZXJcbmV4cG9ydCB0eXBlIEludGVnZXJBcnJheVByb3AgPSBDb21tb25Qcm9wICYge1xuICB0eXBlOiBcImludGVnZXJbXVwiO1xufTsgLy8gUEc6IGludGVnZXJbXSAvIFRTOiBudW1iZXJbXSAvIEpTT046IG51bWJlcltdXG5leHBvcnQgdHlwZSBCaWdJbnRlZ2VyUHJvcCA9IENvbW1vblByb3AgJiB7XG4gIHR5cGU6IFwiYmlnSW50ZWdlclwiO1xufTsgLy8gUEc6IGJpZ2ludCAvIFRTOiBiaWdpbnQgLyBKU09OOiBiaWdpbnRcbmV4cG9ydCB0eXBlIEJpZ0ludGVnZXJBcnJheVByb3AgPSBDb21tb25Qcm9wICYge1xuICB0eXBlOiBcImJpZ0ludGVnZXJbXVwiO1xufTsgLy8gUEc6IGJpZ2ludFtdIC8gVFM6IGJpZ2ludFtdIC8gSlNPTjogYmlnaW50W11cbmV4cG9ydCB0eXBlIFN0cmluZ1Byb3AgPSBDb21tb25Qcm9wICYge1xuICB0eXBlOiBcInN0cmluZ1wiO1xuICBsZW5ndGg/OiBudW1iZXI7IC8vIFBHOiB2YXJjaGFyKG4pLCB0ZXh0IC8gVFM6IHN0cmluZyAvIEpTT046IHN0cmluZ1xufTsgLy8gUEc6IHRleHQgLyBUUzogc3RyaW5nIC8gSlNPTjogc3RyaW5nXG5leHBvcnQgdHlwZSBTdHJpbmdBcnJheVByb3AgPSBDb21tb25Qcm9wICYge1xuICB0eXBlOiBcInN0cmluZ1tdXCI7XG4gIGxlbmd0aD86IG51bWJlcjsgLy8gUEc6IHZhcmNoYXIobilbXSwgdGV4dFtdIC8gVFM6IHN0cmluZ1tdIC8gSlNPTjogc3RyaW5nW11cbn07IC8vIFBHOiB2YXJjaGFyKG4pW10sIHRleHRbXSAvIFRTOiBzdHJpbmdbXSAvIEpTT046IHN0cmluZ1tdXG5leHBvcnQgdHlwZSBFbnVtUHJvcCA9IENvbW1vblByb3AgJiB7XG4gIHR5cGU6IFwiZW51bVwiO1xuICBpZDogc3RyaW5nO1xuICBsZW5ndGg/OiBudW1iZXI7XG59OyAvLyBQRzogdGV4dCAvIFRTOiBzdHJpbmcgLyBKU09OOiBzdHJpbmdcbmV4cG9ydCB0eXBlIEVudW1BcnJheVByb3AgPSBDb21tb25Qcm9wICYge1xuICB0eXBlOiBcImVudW1bXVwiO1xuICBpZDogc3RyaW5nO1xufTsgLy8gUEc6IHRleHRbXSAvIFRTOiBzdHJpbmdbXSAvIEpTT046IHN0cmluZ1tdXG5leHBvcnQgdHlwZSBOdW1iZXJQcm9wID0gQ29tbW9uUHJvcCAmIHtcbiAgdHlwZTogXCJudW1iZXJcIjtcbiAgcHJlY2lzaW9uPzogbnVtYmVyOyAvLyBQRzogbnVtZXJpYyhwLCBzKSAvIFRTOiBudW1iZXIgLyBKU09OOiBudW1iZXJcbiAgc2NhbGU/OiBudW1iZXI7IC8vIFBHOiBudW1lcmljKHAsIHMpIC8gVFM6IG51bWJlciAvIEpTT046IG51bWJlclxuICBudW1iZXJUeXBlPzogXCJyZWFsXCIgfCBcImRvdWJsZSBwcmVjaXNpb25cIiB8IFwibnVtZXJpY1wiOyAvLyDquLDrs7jqsJI6IG51bWVyaWNcbn07IC8vIFBHOiBudW1lcmljKHAsIHMpIC8gVFM6IG51bWJlciAvIEpTT046IG51bWJlclxuZXhwb3J0IHR5cGUgTnVtYmVyQXJyYXlQcm9wID0gQ29tbW9uUHJvcCAmIHtcbiAgdHlwZTogXCJudW1iZXJbXVwiO1xuICBwcmVjaXNpb24/OiBudW1iZXI7XG4gIHNjYWxlPzogbnVtYmVyO1xuICBudW1iZXJUeXBlPzogXCJyZWFsXCIgfCBcImRvdWJsZSBwcmVjaXNpb25cIiB8IFwibnVtZXJpY1wiOyAvLyDquLDrs7jqsJI6IG51bWVyaWNcbn07IC8vIFBHOiBudW1lcmljKHAsIHMpW10gLyBUUzogbnVtYmVyW10gLyBKU09OOiBudW1iZXJbXVxuZXhwb3J0IHR5cGUgTnVtZXJpY1Byb3AgPSBDb21tb25Qcm9wICYge1xuICB0eXBlOiBcIm51bWVyaWNcIjtcbiAgcHJlY2lzaW9uPzogbnVtYmVyO1xuICBzY2FsZT86IG51bWJlcjtcbn07IC8vIFBHOiBudW1lcmljKHAsIHMpIC8gVFM6IHN0cmluZyAvIEpTT046IHN0cmluZ1xuZXhwb3J0IHR5cGUgTnVtZXJpY0FycmF5UHJvcCA9IENvbW1vblByb3AgJiB7XG4gIHR5cGU6IFwibnVtZXJpY1tdXCI7XG4gIHByZWNpc2lvbj86IG51bWJlcjtcbiAgc2NhbGU/OiBudW1iZXI7XG59OyAvLyBQRzogbnVtZXJpYyhwLCBzKVtdIC8gVFM6IHN0cmluZ1tdIC8gSlNPTjogc3RyaW5nW11cbmV4cG9ydCB0eXBlIEJvb2xlYW5Qcm9wID0gQ29tbW9uUHJvcCAmIHtcbiAgdHlwZTogXCJib29sZWFuXCI7XG59OyAvLyBQRzogYm9vbGVhbiAvIFRTOiBib29sZWFuIC8gSlNPTjogYm9vbGVhblxuZXhwb3J0IHR5cGUgQm9vbGVhbkFycmF5UHJvcCA9IENvbW1vblByb3AgJiB7XG4gIHR5cGU6IFwiYm9vbGVhbltdXCI7XG59OyAvLyBQRzogYm9vbGVhbltdIC8gVFM6IGJvb2xlYW5bXSAvIEpTT046IGJvb2xlYW5bXVxuZXhwb3J0IHR5cGUgRGF0ZVByb3AgPSBDb21tb25Qcm9wICYge1xuICB0eXBlOiBcImRhdGVcIjtcbn07IC8vIFBHOiB0aW1lc3RhbXB6IC8gVFM6IERhdGUgLyBKU09OOiBzdHJpbmcoSVNPU3RyaW5nKVxuZXhwb3J0IHR5cGUgRGF0ZUFycmF5UHJvcCA9IENvbW1vblByb3AgJiB7XG4gIHR5cGU6IFwiZGF0ZVtdXCI7XG59OyAvLyBQRzogdGltZXN0YW1wdHpbXSAvIFRTOiBEYXRlW10gLyBKU09OOiBzdHJpbmdbXVxuZXhwb3J0IHR5cGUgSnNvblByb3AgPSBDb21tb25Qcm9wICYge1xuICB0eXBlOiBcImpzb25cIjtcbiAgaWQ6IHN0cmluZztcbn07IC8vIFBHOiBqc29uIC8gVFM6IGFueShpZCkgLyBKU09OOiBhbnlcbmV4cG9ydCB0eXBlIFV1aWRQcm9wID0gQ29tbW9uUHJvcCAmIHtcbiAgdHlwZTogXCJ1dWlkXCI7XG59OyAvLyBQRzogdXVpZCAvIFRTOiBzdHJpbmcgLyBKU09OOiBzdHJpbmdcbmV4cG9ydCB0eXBlIFV1aWRBcnJheVByb3AgPSBDb21tb25Qcm9wICYge1xuICB0eXBlOiBcInV1aWRbXVwiO1xufTsgLy8gUEc6IHV1aWRbXSAvIFRTOiBzdHJpbmdbXSAvIEpTT046IHN0cmluZ1tdXG5leHBvcnQgdHlwZSBWaXJ0dWFsUHJvcCA9IENvbW1vblByb3AgJiB7XG4gIHR5cGU6IFwidmlydHVhbFwiO1xuICBpZDogc3RyaW5nO1xufTsgLy8gUEc6IG5vbmUgLyBUUzogYW55KGlkKSAvIEpTT046IGFueVxuXG5leHBvcnQgdHlwZSBSZWxhdGlvblR5cGUgPSBcIkhhc01hbnlcIiB8IFwiQmVsb25nc1RvT25lXCIgfCBcIk1hbnlUb01hbnlcIiB8IFwiT25lVG9PbmVcIjtcbmV4cG9ydCB0eXBlIFJlbGF0aW9uT24gPSBcIkNBU0NBREVcIiB8IFwiU0VUIE5VTExcIiB8IFwiTk8gQUNUSU9OXCIgfCBcIlNFVCBERUZBVUxUXCIgfCBcIlJFU1RSSUNUXCI7XG50eXBlIF9SZWxhdGlvblByb3AgPSB7XG4gIHR5cGU6IFwicmVsYXRpb25cIjtcbiAgbmFtZTogc3RyaW5nO1xuICB3aXRoOiBzdHJpbmc7XG4gIG51bGxhYmxlPzogYm9vbGVhbjsgLy8gREVGQVVMVDogZmFsc2VcbiAgdG9GaWx0ZXI/OiB0cnVlOyAvLyBERUZBVUxUOiBmYWxzZVxuICBkZXNjPzogc3RyaW5nO1xufTtcbmV4cG9ydCB0eXBlIE9uZVRvT25lUmVsYXRpb25Qcm9wID0gX1JlbGF0aW9uUHJvcCAmIHtcbiAgcmVsYXRpb25UeXBlOiBcIk9uZVRvT25lXCI7XG4gIGN1c3RvbUpvaW5DbGF1c2U/OiBzdHJpbmc7XG59ICYgKFxuICAgIHwge1xuICAgICAgICBoYXNKb2luQ29sdW1uOiB0cnVlO1xuICAgICAgICB1c2VDb25zdHJhaW50PzogYm9vbGVhbjsgLy8gREVGQVVMVDogdHJ1ZVxuICAgICAgICBvblVwZGF0ZT86IFJlbGF0aW9uT247IC8vIERFRkFVTFQ6IFJFU1RSSUNUXG4gICAgICAgIG9uRGVsZXRlPzogUmVsYXRpb25PbjsgLy8gREVGQVVMVDogUkVTVFJJQ1RcbiAgICAgIH1cbiAgICB8IHtcbiAgICAgICAgaGFzSm9pbkNvbHVtbjogZmFsc2U7XG4gICAgICB9XG4gICk7XG5leHBvcnQgdHlwZSBCZWxvbmdzVG9PbmVSZWxhdGlvblByb3AgPSBfUmVsYXRpb25Qcm9wICYge1xuICByZWxhdGlvblR5cGU6IFwiQmVsb25nc1RvT25lXCI7XG4gIGN1c3RvbUpvaW5DbGF1c2U/OiBzdHJpbmc7XG4gIHVzZUNvbnN0cmFpbnQ/OiBib29sZWFuOyAvLyBERUZBVUxUOiB0cnVlXG4gIG9uVXBkYXRlPzogUmVsYXRpb25PbjsgLy8gREVGQVVMVDogUkVTVFJJQ1RcbiAgb25EZWxldGU/OiBSZWxhdGlvbk9uOyAvLyBERUZBVUxUOiBSRVNUUklDVFxufTtcbmV4cG9ydCB0eXBlIEhhc01hbnlSZWxhdGlvblByb3AgPSBfUmVsYXRpb25Qcm9wICYge1xuICByZWxhdGlvblR5cGU6IFwiSGFzTWFueVwiO1xuICBqb2luQ29sdW1uOiBzdHJpbmc7XG4gIGZyb21Db2x1bW4/OiBzdHJpbmc7XG59O1xuZXhwb3J0IHR5cGUgTWFueVRvTWFueVJlbGF0aW9uUHJvcCA9IF9SZWxhdGlvblByb3AgJiB7XG4gIHJlbGF0aW9uVHlwZTogXCJNYW55VG9NYW55XCI7XG4gIGpvaW5UYWJsZTogYCR7c3RyaW5nfV9fJHtzdHJpbmd9YDtcbiAgb25VcGRhdGU6IFJlbGF0aW9uT247XG4gIG9uRGVsZXRlOiBSZWxhdGlvbk9uO1xufTtcbmV4cG9ydCB0eXBlIFJlbGF0aW9uUHJvcCA9XG4gIHwgT25lVG9PbmVSZWxhdGlvblByb3BcbiAgfCBCZWxvbmdzVG9PbmVSZWxhdGlvblByb3BcbiAgfCBIYXNNYW55UmVsYXRpb25Qcm9wXG4gIHwgTWFueVRvTWFueVJlbGF0aW9uUHJvcDtcblxuZXhwb3J0IHR5cGUgRW50aXR5UHJvcCA9XG4gIHwgSW50ZWdlclByb3BcbiAgfCBJbnRlZ2VyQXJyYXlQcm9wXG4gIHwgQmlnSW50ZWdlclByb3BcbiAgfCBCaWdJbnRlZ2VyQXJyYXlQcm9wXG4gIHwgU3RyaW5nUHJvcFxuICB8IFN0cmluZ0FycmF5UHJvcFxuICB8IEVudW1Qcm9wXG4gIHwgRW51bUFycmF5UHJvcFxuICB8IE51bWJlclByb3BcbiAgfCBOdW1iZXJBcnJheVByb3BcbiAgfCBOdW1lcmljUHJvcFxuICB8IE51bWVyaWNBcnJheVByb3BcbiAgfCBOdW1lcmljUHJvcFxuICB8IEJvb2xlYW5Qcm9wXG4gIHwgQm9vbGVhbkFycmF5UHJvcFxuICB8IERhdGVQcm9wXG4gIHwgRGF0ZUFycmF5UHJvcFxuICB8IFV1aWRQcm9wXG4gIHwgVXVpZEFycmF5UHJvcFxuICB8IEpzb25Qcm9wXG4gIHwgVmlydHVhbFByb3BcbiAgfCBSZWxhdGlvblByb3A7XG5cbmV4cG9ydCB0eXBlIEVudGl0eUluZGV4ID0ge1xuICB0eXBlOiBcImluZGV4XCIgfCBcInVuaXF1ZVwiIHwgXCJmdWxsdGV4dFwiO1xuICBjb2x1bW5zOiBzdHJpbmdbXTtcbiAgbmFtZT86IHN0cmluZztcbiAgcGFyc2VyPzogXCJidWlsdC1pblwiIHwgXCJuZ3JhbVwiO1xufTtcbmV4cG9ydCB0eXBlIEVudGl0eUpzb24gPSB7XG4gIGlkOiBzdHJpbmc7XG4gIHBhcmVudElkPzogc3RyaW5nO1xuICB0YWJsZTogc3RyaW5nO1xuICB0aXRsZT86IHN0cmluZztcbiAgcHJvcHM6IEVudGl0eVByb3BbXTtcbiAgaW5kZXhlczogRW50aXR5SW5kZXhbXTtcbiAgc3Vic2V0czoge1xuICAgIFtzdWJzZXQ6IHN0cmluZ106IHN0cmluZ1tdO1xuICB9O1xuICBlbnVtczoge1xuICAgIFtlbnVtSWQ6IHN0cmluZ106IHtcbiAgICAgIFtrZXk6IHN0cmluZ106IHN0cmluZztcbiAgICB9O1xuICB9O1xufTtcbmV4cG9ydCB0eXBlIEVudGl0eVN1YnNldFJvdyA9IHtcbiAgZmllbGQ6IHN0cmluZztcbiAgaGFzOiB7XG4gICAgW2tleTogc3RyaW5nXTogYm9vbGVhbjtcbiAgfTtcbiAgY2hpbGRyZW46IEVudGl0eVN1YnNldFJvd1tdO1xuICBwcmVmaXhlczogc3RyaW5nW107XG4gIHJlbGF0aW9uRW50aXR5Pzogc3RyaW5nO1xuICBpc09wZW4/OiBib29sZWFuO1xufTtcbmV4cG9ydCB0eXBlIEZsYXR0ZW5TdWJzZXRSb3cgPSBPbWl0PEVudGl0eVN1YnNldFJvdywgXCJjaGlsZHJlblwiPjtcblxuLypcbiAgUHJvcE5vZGVcbiovXG5cbi8qKlxuICog7JeU7Yuw7Yuw7J2YIO2VhOuTnCDqtazsobDrpbwg7Yq466asIO2Yle2DnOuhnCDtkZztmITtlZjripQg7KSR6rCEIOuFuOuTnOyeheuLiOuLpC5cbiAqXG4gKiAqKuuqqeyggSoqOiBFbnRpdHnsnZggc3Vic2V0IO2VhOuTnCDtkZztmITsi50o7JiIOiBcImlkXCIsIFwidXNlci5uYW1lXCIsIFwidGFnc1tdXCIp7J2EXG4gKiDsnqzqt4DsoIHsnbgg7Yq466asIOq1rOyhsOuhnCDtjIzsi7HtlZjsl6wgWm9kIOyKpO2CpOuniCDsg53shLHsnZgg7KSR6rCEIOuLqOqzhOuhnCDsgqzsmqntlanri4jri6QuXG4gKlxuICogKirrs4DtmZgg7Z2Q66aEKio6XG4gKiBFbnRpdHkgc3Vic2V0IOKGkiBFbnRpdHlQcm9wTm9kZSAo7Yq466asIOq1rOyhsCkg4oaSIFpvZCDsiqTtgqTrp4gg4oaSIFJlbmRlcmluZ05vZGUgKFVJ7JqpKVxuICpcbiAqICoqbm9kZVR5cGUqKjpcbiAqIC0gXCJwbGFpblwiOiDri6jsnbwg7ZWE65OcICjsmIg6IFwiaWRcIiwgXCJuYW1lXCIpXG4gKiAtIFwib2JqZWN0XCI6IOykkeyyqSDqsJ3ssrQgKOyYiDogXCJ1c2VyLm5hbWVcIiDihpIgdXNlciDqsJ3ssrQpXG4gKiAtIFwiYXJyYXlcIjog67Cw7Je0ICjsmIg6IFwidGFnc1tdXCIg4oaSIHRhZ3Mg67Cw7Je0KVxuICpcbiAqICoq7IKs7JqpIOychOy5mCoqOiBlbnRpdHktY29udmVydGVyLnRz7J2YIHByb3BOb2RlVG9ab2RUeXBlKClcbiAqL1xuZXhwb3J0IHR5cGUgRW50aXR5UHJvcE5vZGUgPVxuICB8IHtcbiAgICAgIG5vZGVUeXBlOiBcInBsYWluXCI7XG4gICAgICBwcm9wOiBFbnRpdHlQcm9wO1xuICAgIH1cbiAgfCB7XG4gICAgICBub2RlVHlwZTogXCJvYmplY3RcIiB8IFwiYXJyYXlcIjtcbiAgICAgIHByb3A/OiBFbnRpdHlQcm9wO1xuICAgICAgY2hpbGRyZW46IEVudGl0eVByb3BOb2RlW107XG4gICAgfTtcblxuLypcbiAgUHJvcCBUeXBlIEd1YXJkc1xuKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0ludGVnZXJTaW5nbGVQcm9wKHA6IHVua25vd24pOiBwIGlzIEludGVnZXJQcm9wIHtcbiAgcmV0dXJuIChwIGFzIEludGVnZXJQcm9wKT8udHlwZSA9PT0gXCJpbnRlZ2VyXCI7XG59XG5leHBvcnQgZnVuY3Rpb24gaXNJbnRlZ2VyQXJyYXlQcm9wKHA6IHVua25vd24pOiBwIGlzIEludGVnZXJBcnJheVByb3Age1xuICByZXR1cm4gKHAgYXMgSW50ZWdlckFycmF5UHJvcCk/LnR5cGUgPT09IFwiaW50ZWdlcltdXCI7XG59XG5leHBvcnQgZnVuY3Rpb24gaXNJbnRlZ2VyUHJvcChwOiB1bmtub3duKTogcCBpcyBJbnRlZ2VyUHJvcCB8IEludGVnZXJBcnJheVByb3Age1xuICByZXR1cm4gaXNJbnRlZ2VyU2luZ2xlUHJvcChwKSB8fCBpc0ludGVnZXJBcnJheVByb3AocCk7XG59XG5leHBvcnQgZnVuY3Rpb24gaXNCaWdJbnRlZ2VyU2luZ2xlUHJvcChwOiB1bmtub3duKTogcCBpcyBCaWdJbnRlZ2VyUHJvcCB7XG4gIHJldHVybiAocCBhcyBCaWdJbnRlZ2VyUHJvcCk/LnR5cGUgPT09IFwiYmlnSW50ZWdlclwiO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGlzQmlnSW50ZWdlckFycmF5UHJvcChwOiB1bmtub3duKTogcCBpcyBCaWdJbnRlZ2VyQXJyYXlQcm9wIHtcbiAgcmV0dXJuIChwIGFzIEJpZ0ludGVnZXJBcnJheVByb3ApPy50eXBlID09PSBcImJpZ0ludGVnZXJbXVwiO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGlzQmlnSW50ZWdlclByb3AocDogdW5rbm93bik6IHAgaXMgQmlnSW50ZWdlclByb3AgfCBCaWdJbnRlZ2VyQXJyYXlQcm9wIHtcbiAgcmV0dXJuIGlzQmlnSW50ZWdlclNpbmdsZVByb3AocCkgfHwgaXNCaWdJbnRlZ2VyQXJyYXlQcm9wKHApO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGlzU3RyaW5nU2luZ2xlUHJvcChwOiB1bmtub3duKTogcCBpcyBTdHJpbmdQcm9wIHtcbiAgcmV0dXJuIChwIGFzIFN0cmluZ1Byb3ApPy50eXBlID09PSBcInN0cmluZ1wiO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGlzU3RyaW5nQXJyYXlQcm9wKHA6IHVua25vd24pOiBwIGlzIFN0cmluZ0FycmF5UHJvcCB7XG4gIHJldHVybiAocCBhcyBTdHJpbmdBcnJheVByb3ApPy50eXBlID09PSBcInN0cmluZ1tdXCI7XG59XG5leHBvcnQgZnVuY3Rpb24gaXNTdHJpbmdQcm9wKHA6IHVua25vd24pOiBwIGlzIFN0cmluZ1Byb3AgfCBTdHJpbmdBcnJheVByb3Age1xuICByZXR1cm4gaXNTdHJpbmdTaW5nbGVQcm9wKHApIHx8IGlzU3RyaW5nQXJyYXlQcm9wKHApO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGlzRW51bVNpbmdsZVByb3AocDogdW5rbm93bik6IHAgaXMgRW51bVByb3Age1xuICByZXR1cm4gKHAgYXMgRW51bVByb3ApPy50eXBlID09PSBcImVudW1cIjtcbn1cbmV4cG9ydCBmdW5jdGlvbiBpc0VudW1BcnJheVByb3AocDogdW5rbm93bik6IHAgaXMgRW51bUFycmF5UHJvcCB7XG4gIHJldHVybiAocCBhcyBFbnVtQXJyYXlQcm9wKT8udHlwZSA9PT0gXCJlbnVtW11cIjtcbn1cbmV4cG9ydCBmdW5jdGlvbiBpc0VudW1Qcm9wKHA6IHVua25vd24pOiBwIGlzIEVudW1Qcm9wIHwgRW51bUFycmF5UHJvcCB7XG4gIHJldHVybiBpc0VudW1TaW5nbGVQcm9wKHApIHx8IGlzRW51bUFycmF5UHJvcChwKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBpc051bWJlclNpbmdsZVByb3AocDogdW5rbm93bik6IHAgaXMgTnVtYmVyUHJvcCB7XG4gIHJldHVybiAocCBhcyBOdW1iZXJQcm9wKT8udHlwZSA9PT0gXCJudW1iZXJcIjtcbn1cbmV4cG9ydCBmdW5jdGlvbiBpc051bWJlckFycmF5UHJvcChwOiB1bmtub3duKTogcCBpcyBOdW1iZXJBcnJheVByb3Age1xuICByZXR1cm4gKHAgYXMgTnVtYmVyQXJyYXlQcm9wKT8udHlwZSA9PT0gXCJudW1iZXJbXVwiO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGlzTnVtYmVyUHJvcChwOiB1bmtub3duKTogcCBpcyBOdW1iZXJQcm9wIHwgTnVtYmVyQXJyYXlQcm9wIHtcbiAgcmV0dXJuIGlzTnVtYmVyU2luZ2xlUHJvcChwKSB8fCBpc051bWJlckFycmF5UHJvcChwKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBpc051bWVyaWNTaW5nbGVQcm9wKHA6IHVua25vd24pOiBwIGlzIE51bWVyaWNQcm9wIHtcbiAgcmV0dXJuIChwIGFzIE51bWVyaWNQcm9wKT8udHlwZSA9PT0gXCJudW1lcmljXCI7XG59XG5leHBvcnQgZnVuY3Rpb24gaXNOdW1lcmljQXJyYXlQcm9wKHA6IHVua25vd24pOiBwIGlzIE51bWVyaWNBcnJheVByb3Age1xuICByZXR1cm4gKHAgYXMgTnVtZXJpY0FycmF5UHJvcCk/LnR5cGUgPT09IFwibnVtZXJpY1tdXCI7XG59XG5leHBvcnQgZnVuY3Rpb24gaXNOdW1lcmljUHJvcChwOiB1bmtub3duKTogcCBpcyBOdW1lcmljUHJvcCB8IE51bWVyaWNBcnJheVByb3Age1xuICByZXR1cm4gaXNOdW1lcmljU2luZ2xlUHJvcChwKSB8fCBpc051bWVyaWNBcnJheVByb3AocCk7XG59XG5leHBvcnQgZnVuY3Rpb24gaXNCb29sZWFuU2luZ2xlUHJvcChwOiB1bmtub3duKTogcCBpcyBCb29sZWFuUHJvcCB7XG4gIHJldHVybiAocCBhcyBCb29sZWFuUHJvcCk/LnR5cGUgPT09IFwiYm9vbGVhblwiO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGlzQm9vbGVhbkFycmF5UHJvcChwOiB1bmtub3duKTogcCBpcyBCb29sZWFuQXJyYXlQcm9wIHtcbiAgcmV0dXJuIChwIGFzIEJvb2xlYW5BcnJheVByb3ApPy50eXBlID09PSBcImJvb2xlYW5bXVwiO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGlzQm9vbGVhblByb3AocDogdW5rbm93bik6IHAgaXMgQm9vbGVhblByb3AgfCBCb29sZWFuQXJyYXlQcm9wIHtcbiAgcmV0dXJuIGlzQm9vbGVhblNpbmdsZVByb3AocCkgfHwgaXNCb29sZWFuQXJyYXlQcm9wKHApO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGlzRGF0ZVNpbmdsZVByb3AocDogdW5rbm93bik6IHAgaXMgRGF0ZVByb3Age1xuICByZXR1cm4gKHAgYXMgRGF0ZVByb3ApPy50eXBlID09PSBcImRhdGVcIjtcbn1cbmV4cG9ydCBmdW5jdGlvbiBpc0RhdGVBcnJheVByb3AocDogdW5rbm93bik6IHAgaXMgRGF0ZUFycmF5UHJvcCB7XG4gIHJldHVybiAocCBhcyBEYXRlQXJyYXlQcm9wKT8udHlwZSA9PT0gXCJkYXRlW11cIjtcbn1cbmV4cG9ydCBmdW5jdGlvbiBpc0RhdGVQcm9wKHA6IHVua25vd24pOiBwIGlzIERhdGVQcm9wIHwgRGF0ZUFycmF5UHJvcCB7XG4gIHJldHVybiBpc0RhdGVTaW5nbGVQcm9wKHApIHx8IGlzRGF0ZUFycmF5UHJvcChwKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBpc1V1aWRTaW5nbGVQcm9wKHA6IHVua25vd24pOiBwIGlzIFV1aWRQcm9wIHtcbiAgcmV0dXJuIChwIGFzIFV1aWRQcm9wKT8udHlwZSA9PT0gXCJ1dWlkXCI7XG59XG5leHBvcnQgZnVuY3Rpb24gaXNVdWlkQXJyYXlQcm9wKHA6IHVua25vd24pOiBwIGlzIFV1aWRBcnJheVByb3Age1xuICByZXR1cm4gKHAgYXMgVXVpZEFycmF5UHJvcCk/LnR5cGUgPT09IFwidXVpZFtdXCI7XG59XG5leHBvcnQgZnVuY3Rpb24gaXNVdWlkUHJvcChwOiB1bmtub3duKTogcCBpcyBVdWlkUHJvcCB8IFV1aWRBcnJheVByb3Age1xuICByZXR1cm4gaXNVdWlkU2luZ2xlUHJvcChwKSB8fCBpc1V1aWRBcnJheVByb3AocCk7XG59XG5leHBvcnQgZnVuY3Rpb24gaXNKc29uUHJvcChwOiB1bmtub3duKTogcCBpcyBKc29uUHJvcCB7XG4gIHJldHVybiAocCBhcyBKc29uUHJvcCk/LnR5cGUgPT09IFwianNvblwiO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGlzVmlydHVhbFByb3AocDogdW5rbm93bik6IHAgaXMgVmlydHVhbFByb3Age1xuICByZXR1cm4gKHAgYXMgVmlydHVhbFByb3ApPy50eXBlID09PSBcInZpcnR1YWxcIjtcbn1cbmV4cG9ydCBmdW5jdGlvbiBpc1JlbGF0aW9uUHJvcChwOiB1bmtub3duKTogcCBpcyBSZWxhdGlvblByb3Age1xuICByZXR1cm4gKHAgYXMgUmVsYXRpb25Qcm9wKT8udHlwZSA9PT0gXCJyZWxhdGlvblwiO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGlzT25lVG9PbmVSZWxhdGlvblByb3AocDogdW5rbm93bik6IHAgaXMgT25lVG9PbmVSZWxhdGlvblByb3Age1xuICByZXR1cm4gKHAgYXMgT25lVG9PbmVSZWxhdGlvblByb3ApPy5yZWxhdGlvblR5cGUgPT09IFwiT25lVG9PbmVcIjtcbn1cbmV4cG9ydCBmdW5jdGlvbiBpc0JlbG9uZ3NUb09uZVJlbGF0aW9uUHJvcChwOiB1bmtub3duKTogcCBpcyBCZWxvbmdzVG9PbmVSZWxhdGlvblByb3Age1xuICByZXR1cm4gKHAgYXMgQmVsb25nc1RvT25lUmVsYXRpb25Qcm9wKT8ucmVsYXRpb25UeXBlID09PSBcIkJlbG9uZ3NUb09uZVwiO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGlzSGFzTWFueVJlbGF0aW9uUHJvcChwOiB1bmtub3duKTogcCBpcyBIYXNNYW55UmVsYXRpb25Qcm9wIHtcbiAgcmV0dXJuIChwIGFzIEhhc01hbnlSZWxhdGlvblByb3ApPy5yZWxhdGlvblR5cGUgPT09IFwiSGFzTWFueVwiO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGlzTWFueVRvTWFueVJlbGF0aW9uUHJvcChwOiB1bmtub3duKTogcCBpcyBNYW55VG9NYW55UmVsYXRpb25Qcm9wIHtcbiAgcmV0dXJuIChwIGFzIE1hbnlUb01hbnlSZWxhdGlvblByb3ApPy5yZWxhdGlvblR5cGUgPT09IFwiTWFueVRvTWFueVwiO1xufVxuXG50eXBlIEpvaW5DbGF1c2UgPVxuICB8IHtcbiAgICAgIGZyb206IHN0cmluZztcbiAgICAgIHRvOiBzdHJpbmc7XG4gICAgfVxuICB8IHtcbiAgICAgIGN1c3RvbTogc3RyaW5nO1xuICAgIH07XG5leHBvcnQgZnVuY3Rpb24gaXNDdXN0b21Kb2luQ2xhdXNlKHA6IHVua25vd24pOiBwIGlzIHsgY3VzdG9tOiBzdHJpbmcgfSB7XG4gIHJldHVybiAhIShwIGFzIHsgY3VzdG9tOiBzdHJpbmcgfSk/LmN1c3RvbTtcbn1cblxudHlwZSBTdWJzZXRMb2FkZXIgPSB7XG4gIGFzOiBzdHJpbmc7XG4gIHRhYmxlOiBzdHJpbmc7XG4gIG1hbnlKb2luOiB7XG4gICAgZnJvbVRhYmxlOiBzdHJpbmc7XG4gICAgZnJvbUNvbDogc3RyaW5nO1xuICAgIGlkRmllbGQ6IHN0cmluZztcbiAgICB0b1RhYmxlOiBzdHJpbmc7XG4gICAgdG9Db2w6IHN0cmluZztcbiAgICB0aHJvdWdoPzoge1xuICAgICAgdGFibGU6IHN0cmluZztcbiAgICAgIGZyb21Db2w6IHN0cmluZztcbiAgICAgIHRvQ29sOiBzdHJpbmc7XG4gICAgfTtcbiAgfTtcbiAgb25lSm9pbnM6ICh7XG4gICAgYXM6IHN0cmluZztcbiAgICBqb2luOiBcImlubmVyXCIgfCBcIm91dGVyXCI7XG4gICAgdGFibGU6IHN0cmluZztcbiAgfSAmIEpvaW5DbGF1c2UpW107XG4gIHNlbGVjdDogc3RyaW5nW107XG4gIGxvYWRlcnM/OiBTdWJzZXRMb2FkZXJbXTtcbn07XG5cbmV4cG9ydCB0eXBlIFN1YnNldFF1ZXJ5ID0ge1xuICBzZWxlY3Q6IHN0cmluZ1tdO1xuICB2aXJ0dWFsOiBzdHJpbmdbXTtcbiAgam9pbnM6ICh7XG4gICAgYXM6IHN0cmluZztcbiAgICBqb2luOiBcImlubmVyXCIgfCBcIm91dGVyXCI7XG4gICAgdGFibGU6IHN0cmluZztcbiAgfSAmIEpvaW5DbGF1c2UpW107XG4gIGxvYWRlcnM6IFN1YnNldExvYWRlcltdO1xufTtcblxuLyogQmFzZU1vZGVsICovXG5leHBvcnQgY29uc3QgU29uYW11UXVlcnlNb2RlID0gei5lbnVtKFtcImJvdGhcIiwgXCJsaXN0XCIsIFwiY291bnRcIl0pO1xuZXhwb3J0IHR5cGUgU29uYW11UXVlcnlNb2RlID0gei5pbmZlcjx0eXBlb2YgU29uYW11UXVlcnlNb2RlPjtcblxuLyogS25leCBNaWdyYXRpb24gKi9cbmV4cG9ydCB0eXBlIEtuZXhFcnJvciA9IHtcbiAgY29kZTogc3RyaW5nO1xuICBlcnJubzogbnVtYmVyO1xuICBzcWw6IHN0cmluZztcbiAgc3FsTWVzc2FnZTogc3RyaW5nO1xuICBzcWxTdGF0ZTogc3RyaW5nO1xufTtcbmV4cG9ydCBmdW5jdGlvbiBpc0tuZXhFcnJvcihlOiB1bmtub3duKTogZSBpcyBLbmV4RXJyb3Ige1xuICByZXR1cm4gISEoZSBhcyBLbmV4RXJyb3IpPy5jb2RlICYmICEhKGUgYXMgS25leEVycm9yKT8uc3FsTWVzc2FnZSAmJiAhIShlIGFzIEtuZXhFcnJvcik/LnNxbFN0YXRlO1xufVxuXG5leHBvcnQgdHlwZSBLbmV4Q29sdW1uVHlwZSA9XG4gIHwgXCJzdHJpbmdcIlxuICB8IFwidGV4dFwiXG4gIHwgXCJzbWFsbHRleHRcIlxuICB8IFwibWVkaXVtdGV4dFwiXG4gIHwgXCJsb25ndGV4dFwiXG4gIHwgXCJpbnRlZ2VyXCJcbiAgfCBcImJpZ0ludGVnZXJcIlxuICB8IFwiZGVjaW1hbFwiXG4gIHwgXCJ0aW1lc3RhbXBcIlxuICB8IFwiYm9vbGVhblwiXG4gIHwgXCJmb3JlaWduXCJcbiAgfCBcInV1aWRcIlxuICB8IFwianNvblwiXG4gIHwgXCJmbG9hdFwiXG4gIHwgXCJkYXRlXCJcbiAgfCBcInRpbWVcIlxuICB8IFwiZGF0ZXRpbWVcIjtcbmV4cG9ydCB0eXBlIE1pZ3JhdGlvbkNvbHVtblR5cGUgPVxuICB8IFwic3RyaW5nXCJcbiAgfCBcInN0cmluZ1tdXCJcbiAgfCBcImludGVnZXJcIlxuICB8IFwiaW50ZWdlcltdXCJcbiAgfCBcImJpZ0ludGVnZXJcIlxuICB8IFwiYmlnSW50ZWdlcltdXCJcbiAgfCBcIm51bWJlck9yTnVtZXJpY1wiXG4gIHwgXCJudW1iZXJPck51bWVyaWNbXVwiXG4gIHwgXCJib29sZWFuXCJcbiAgfCBcImJvb2xlYW5bXVwiXG4gIHwgXCJkYXRlXCJcbiAgfCBcImRhdGVbXVwiXG4gIHwgXCJ1dWlkXCJcbiAgfCBcInV1aWRbXVwiXG4gIHwgXCJqc29uXCI7XG5leHBvcnQgdHlwZSBNaWdyYXRpb25Db2x1bW4gPSB7XG4gIG5hbWU6IHN0cmluZztcbiAgdHlwZTogTWlncmF0aW9uQ29sdW1uVHlwZTtcbiAgbnVsbGFibGU6IGJvb2xlYW47XG4gIG51bWJlclR5cGU/OiBcInJlYWxcIiB8IFwiZG91YmxlIHByZWNpc2lvblwiIHwgXCJudW1lcmljXCI7XG4gIGxlbmd0aD86IG51bWJlcjtcbiAgZGVmYXVsdFRvPzogc3RyaW5nO1xuICBwcmVjaXNpb24/OiBudW1iZXI7XG4gIHNjYWxlPzogbnVtYmVyO1xufTtcbmV4cG9ydCB0eXBlIE1pZ3JhdGlvbkluZGV4ID0ge1xuICBjb2x1bW5zOiBzdHJpbmdbXTtcbiAgdHlwZTogXCJ1bmlxdWVcIiB8IFwiaW5kZXhcIiB8IFwiZnVsbHRleHRcIjtcbiAgcGFyc2VyPzogXCJidWlsdC1pblwiIHwgXCJuZ3JhbVwiO1xufTtcbmV4cG9ydCB0eXBlIE1pZ3JhdGlvbkZvcmVpZ24gPSB7XG4gIGNvbHVtbnM6IHN0cmluZ1tdO1xuICB0bzogc3RyaW5nO1xuICBvblVwZGF0ZTogUmVsYXRpb25PbjtcbiAgb25EZWxldGU6IFJlbGF0aW9uT247XG59O1xuZXhwb3J0IHR5cGUgTWlncmF0aW9uSm9pblRhYmxlID0ge1xuICB0YWJsZTogc3RyaW5nO1xuICBpbmRleGVzOiBNaWdyYXRpb25JbmRleFtdO1xuICBjb2x1bW5zOiBNaWdyYXRpb25Db2x1bW5bXTtcbiAgZm9yZWlnbnM6IE1pZ3JhdGlvbkZvcmVpZ25bXTtcbn07XG5leHBvcnQgdHlwZSBNaWdyYXRpb25TZXQgPSB7XG4gIHRhYmxlOiBzdHJpbmc7XG4gIGNvbHVtbnM6IE1pZ3JhdGlvbkNvbHVtbltdO1xuICBpbmRleGVzOiBNaWdyYXRpb25JbmRleFtdO1xuICBmb3JlaWduczogTWlncmF0aW9uRm9yZWlnbltdO1xufTtcbmV4cG9ydCB0eXBlIE1pZ3JhdGlvblNldEFuZEpvaW5UYWJsZSA9IE1pZ3JhdGlvblNldCAmIHtcbiAgam9pblRhYmxlczogTWlncmF0aW9uSm9pblRhYmxlW107XG59O1xuZXhwb3J0IHR5cGUgR2VuTWlncmF0aW9uQ29kZSA9IHtcbiAgdGl0bGU6IHN0cmluZztcbiAgdGFibGU6IHN0cmluZztcbiAgdHlwZTogXCJub3JtYWxcIiB8IFwiZm9yZWlnblwiO1xuICBmb3JtYXR0ZWQ6IHN0cmluZyB8IG51bGw7XG59O1xuXG4vKiBBcGkgKi9cbmV4cG9ydCB0eXBlIEFwaVBhcmFtID0ge1xuICBuYW1lOiBzdHJpbmc7XG4gIHR5cGU6IEFwaVBhcmFtVHlwZTtcbiAgb3B0aW9uYWw6IGJvb2xlYW47XG4gIGRlZmF1bHREZWY/OiBzdHJpbmc7XG59O1xuZXhwb3J0IG5hbWVzcGFjZSBBcGlQYXJhbVR5cGUge1xuICBleHBvcnQgdHlwZSBPYmplY3QgPSB7XG4gICAgdDogXCJvYmplY3RcIjtcbiAgICBwcm9wczogQXBpUGFyYW1bXTtcbiAgfTtcbiAgZXhwb3J0IHR5cGUgVW5pb24gPSB7XG4gICAgdDogXCJ1bmlvblwiO1xuICAgIHR5cGVzOiBBcGlQYXJhbVR5cGVbXTtcbiAgfTtcbiAgZXhwb3J0IHR5cGUgSW50ZXJzZWN0aW9uID0ge1xuICAgIHQ6IFwiaW50ZXJzZWN0aW9uXCI7XG4gICAgdHlwZXM6IEFwaVBhcmFtVHlwZVtdO1xuICB9O1xuICBleHBvcnQgdHlwZSBTdHJpbmdMaXRlcmFsID0ge1xuICAgIHQ6IFwic3RyaW5nLWxpdGVyYWxcIjtcbiAgICB2YWx1ZTogc3RyaW5nO1xuICB9O1xuICBleHBvcnQgdHlwZSBOdW1lcmljTGl0ZXJhbCA9IHtcbiAgICB0OiBcIm51bWVyaWMtbGl0ZXJhbFwiO1xuICAgIHZhbHVlOiBudW1iZXI7XG4gIH07XG4gIGV4cG9ydCB0eXBlIEFycmF5ID0ge1xuICAgIHQ6IFwiYXJyYXlcIjtcbiAgICBlbGVtZW50c1R5cGU6IEFwaVBhcmFtVHlwZTtcbiAgfTtcbiAgZXhwb3J0IHR5cGUgUmVmID0ge1xuICAgIHQ6IFwicmVmXCI7XG4gICAgaWQ6IHN0cmluZztcbiAgICBhcmdzPzogQXBpUGFyYW1UeXBlW107XG4gIH07XG4gIGV4cG9ydCB0eXBlIEluZGV4ZWRBY2Nlc3MgPSB7XG4gICAgdDogXCJpbmRleGVkLWFjY2Vzc1wiO1xuICAgIG9iamVjdDogQXBpUGFyYW1UeXBlO1xuICAgIGluZGV4OiBBcGlQYXJhbVR5cGU7XG4gIH07XG4gIGV4cG9ydCB0eXBlIFR1cGxlVHlwZSA9IHtcbiAgICB0OiBcInR1cGxlLXR5cGVcIjtcbiAgICBlbGVtZW50czogQXBpUGFyYW1UeXBlW107XG4gIH07XG4gIGV4cG9ydCB0eXBlIFBpY2sgPSBSZWYgJiB7XG4gICAgdDogXCJyZWZcIjtcbiAgICBpZDogXCJQaWNrXCI7XG4gIH07XG4gIGV4cG9ydCB0eXBlIE9taXQgPSBSZWYgJiB7XG4gICAgdDogXCJyZWZcIjtcbiAgICBpZDogXCJPbWl0XCI7XG4gIH07XG4gIGV4cG9ydCB0eXBlIFBhcnRpYWwgPSBSZWYgJiB7XG4gICAgdDogXCJyZWZcIjtcbiAgICBpZDogXCJQYXJ0aWFsXCI7XG4gIH07XG4gIGV4cG9ydCB0eXBlIFByb21pc2UgPSBSZWYgJiB7XG4gICAgdDogXCJyZWZcIjtcbiAgICBpZDogXCJQcm9taXNlXCI7XG4gIH07XG4gIGV4cG9ydCB0eXBlIENvbnRleHQgPSBSZWYgJiB7XG4gICAgdDogXCJyZWZcIjtcbiAgICBpZDogXCJDb250ZXh0XCI7XG4gIH07XG4gIGV4cG9ydCB0eXBlIFR5cGVQYXJhbSA9IHtcbiAgICB0OiBcInR5cGUtcGFyYW1cIjtcbiAgICBpZDogc3RyaW5nO1xuICAgIGNvbnN0cmFpbnQ/OiBBcGlQYXJhbVR5cGU7XG4gIH07XG5cbiAgZXhwb3J0IGZ1bmN0aW9uIGlzT2JqZWN0KHY6IHVua25vd24pOiB2IGlzIEFwaVBhcmFtVHlwZS5PYmplY3Qge1xuICAgIHJldHVybiAodiBhcyBBcGlQYXJhbVR5cGUuT2JqZWN0KT8udCA9PT0gXCJvYmplY3RcIjtcbiAgfVxuICBleHBvcnQgZnVuY3Rpb24gaXNVbmlvbih2OiB1bmtub3duKTogdiBpcyBBcGlQYXJhbVR5cGUuVW5pb24ge1xuICAgIHJldHVybiAodiBhcyBBcGlQYXJhbVR5cGUuVW5pb24pPy50ID09PSBcInVuaW9uXCI7XG4gIH1cbiAgZXhwb3J0IGZ1bmN0aW9uIGlzSW50ZXJzZWN0aW9uKHY6IHVua25vd24pOiB2IGlzIEFwaVBhcmFtVHlwZS5JbnRlcnNlY3Rpb24ge1xuICAgIHJldHVybiAodiBhcyBBcGlQYXJhbVR5cGUuSW50ZXJzZWN0aW9uKT8udCA9PT0gXCJpbnRlcnNlY3Rpb25cIjtcbiAgfVxuICBleHBvcnQgZnVuY3Rpb24gaXNTdHJpbmdMaXRlcmFsKHY6IHVua25vd24pOiB2IGlzIEFwaVBhcmFtVHlwZS5TdHJpbmdMaXRlcmFsIHtcbiAgICByZXR1cm4gKHYgYXMgQXBpUGFyYW1UeXBlLlN0cmluZ0xpdGVyYWwpPy50ID09PSBcInN0cmluZy1saXRlcmFsXCI7XG4gIH1cbiAgZXhwb3J0IGZ1bmN0aW9uIGlzTnVtZXJpY0xpdGVyYWwodjogdW5rbm93bik6IHYgaXMgQXBpUGFyYW1UeXBlLk51bWVyaWNMaXRlcmFsIHtcbiAgICByZXR1cm4gKHYgYXMgQXBpUGFyYW1UeXBlLk51bWVyaWNMaXRlcmFsKT8udCA9PT0gXCJudW1lcmljLWxpdGVyYWxcIjtcbiAgfVxuICBleHBvcnQgZnVuY3Rpb24gaXNBcnJheSh2OiB1bmtub3duKTogdiBpcyBBcGlQYXJhbVR5cGUuQXJyYXkge1xuICAgIHJldHVybiAodiBhcyBBcGlQYXJhbVR5cGUuQXJyYXkpPy50ID09PSBcImFycmF5XCI7XG4gIH1cbiAgZXhwb3J0IGZ1bmN0aW9uIGlzUmVmKHY6IHVua25vd24pOiB2IGlzIEFwaVBhcmFtVHlwZS5SZWYge1xuICAgIHJldHVybiB0eXBlb2YgdiA9PT0gXCJvYmplY3RcIiAmJiB2ICE9PSBudWxsICYmICh2IGFzIHsgdD86IHVua25vd24gfSkudCA9PT0gXCJyZWZcIjtcbiAgfVxuICBleHBvcnQgZnVuY3Rpb24gaXNJbmRleGVkQWNjZXNzKHY6IHVua25vd24pOiB2IGlzIEFwaVBhcmFtVHlwZS5JbmRleGVkQWNjZXNzIHtcbiAgICByZXR1cm4gdHlwZW9mIHYgPT09IFwib2JqZWN0XCIgJiYgdiAhPT0gbnVsbCAmJiAodiBhcyB7IHQ/OiB1bmtub3duIH0pLnQgPT09IFwiaW5kZXhlZC1hY2Nlc3NcIjtcbiAgfVxuICBleHBvcnQgZnVuY3Rpb24gaXNUdXBsZVR5cGUodjogdW5rbm93bik6IHYgaXMgQXBpUGFyYW1UeXBlLlR1cGxlVHlwZSB7XG4gICAgcmV0dXJuIHR5cGVvZiB2ID09PSBcIm9iamVjdFwiICYmIHYgIT09IG51bGwgJiYgKHYgYXMgeyB0PzogdW5rbm93biB9KS50ID09PSBcInR1cGxlLXR5cGVcIjtcbiAgfVxuICBleHBvcnQgZnVuY3Rpb24gaXNQaWNrKHY6IHVua25vd24pOiB2IGlzIEFwaVBhcmFtVHlwZS5QaWNrIHtcbiAgICByZXR1cm4gKFxuICAgICAgdHlwZW9mIHYgPT09IFwib2JqZWN0XCIgJiZcbiAgICAgIHYgIT09IG51bGwgJiZcbiAgICAgICh2IGFzIHsgdD86IHVua25vd24gfSkudCA9PT0gXCJyZWZcIiAmJlxuICAgICAgKHYgYXMgeyBpZD86IHVua25vd24gfSkuaWQgPT09IFwiUGlja1wiXG4gICAgKTtcbiAgfVxuICBleHBvcnQgZnVuY3Rpb24gaXNPbWl0KHY6IHVua25vd24pOiB2IGlzIEFwaVBhcmFtVHlwZS5PbWl0IHtcbiAgICByZXR1cm4gKFxuICAgICAgdHlwZW9mIHYgPT09IFwib2JqZWN0XCIgJiZcbiAgICAgIHYgIT09IG51bGwgJiZcbiAgICAgICh2IGFzIHsgdD86IHVua25vd24gfSkudCA9PT0gXCJyZWZcIiAmJlxuICAgICAgKHYgYXMgeyBpZD86IHVua25vd24gfSkuaWQgPT09IFwiT21pdFwiXG4gICAgKTtcbiAgfVxuICBleHBvcnQgZnVuY3Rpb24gaXNQYXJ0aWFsKHY6IHVua25vd24pOiB2IGlzIEFwaVBhcmFtVHlwZS5QYXJ0aWFsIHtcbiAgICByZXR1cm4gKFxuICAgICAgdHlwZW9mIHYgPT09IFwib2JqZWN0XCIgJiZcbiAgICAgIHYgIT09IG51bGwgJiZcbiAgICAgICh2IGFzIHsgdD86IHVua25vd24gfSkudCA9PT0gXCJyZWZcIiAmJlxuICAgICAgKHYgYXMgeyBpZD86IHVua25vd24gfSkuaWQgPT09IFwiUGFydGlhbFwiXG4gICAgKTtcbiAgfVxuICBleHBvcnQgZnVuY3Rpb24gaXNQcm9taXNlKHY6IHVua25vd24pOiB2IGlzIEFwaVBhcmFtVHlwZS5Qcm9taXNlIHtcbiAgICByZXR1cm4gKFxuICAgICAgdHlwZW9mIHYgPT09IFwib2JqZWN0XCIgJiZcbiAgICAgIHYgIT09IG51bGwgJiZcbiAgICAgICh2IGFzIHsgdD86IHVua25vd24gfSkudCA9PT0gXCJyZWZcIiAmJlxuICAgICAgKHYgYXMgeyBpZD86IHVua25vd24gfSkuaWQgPT09IFwiUHJvbWlzZVwiXG4gICAgKTtcbiAgfVxuICBleHBvcnQgZnVuY3Rpb24gaXNDb250ZXh0KHY6IHVua25vd24pOiB2IGlzIEFwaVBhcmFtVHlwZS5Db250ZXh0IHtcbiAgICByZXR1cm4gKFxuICAgICAgdHlwZW9mIHYgPT09IFwib2JqZWN0XCIgJiZcbiAgICAgIHYgIT09IG51bGwgJiZcbiAgICAgICh2IGFzIHsgdD86IHVua25vd24gfSkudCA9PT0gXCJyZWZcIiAmJlxuICAgICAgKHYgYXMgeyBpZD86IHVua25vd24gfSkuaWQgPT09IFwiQ29udGV4dFwiXG4gICAgKTtcbiAgfVxuICBleHBvcnQgZnVuY3Rpb24gaXNSZWZLbmV4KHY6IHVua25vd24pOiB2IGlzIEFwaVBhcmFtVHlwZS5SZWYge1xuICAgIHJldHVybiAoXG4gICAgICB0eXBlb2YgdiA9PT0gXCJvYmplY3RcIiAmJlxuICAgICAgdiAhPT0gbnVsbCAmJlxuICAgICAgKHYgYXMgeyB0PzogdW5rbm93biB9KS50ID09PSBcInJlZlwiICYmXG4gICAgICAodiBhcyB7IGlkPzogdW5rbm93biB9KS5pZCA9PT0gXCJLbmV4XCJcbiAgICApO1xuICB9XG4gIGV4cG9ydCBmdW5jdGlvbiBpc1R5cGVQYXJhbSh2OiB1bmtub3duKTogdiBpcyBBcGlQYXJhbVR5cGUuVHlwZVBhcmFtIHtcbiAgICByZXR1cm4gdHlwZW9mIHYgPT09IFwib2JqZWN0XCIgJiYgdiAhPT0gbnVsbCAmJiAodiBhcyB7IHQ/OiB1bmtub3duIH0pLnQgPT09IFwidHlwZS1wYXJhbVwiO1xuICB9XG59XG5leHBvcnQgdHlwZSBBcGlQYXJhbVR5cGUgPVxuICB8IFwic3RyaW5nXCJcbiAgfCBcIm51bWJlclwiXG4gIHwgXCJib29sZWFuXCJcbiAgfCBcIm51bGxcIlxuICB8IFwidW5kZWZpbmVkXCJcbiAgfCBcInZvaWRcIlxuICB8IFwiYW55XCJcbiAgfCBcInVua25vd25cIlxuICB8IFwidHJ1ZVwiXG4gIHwgXCJmYWxzZVwiXG4gIHwgQXBpUGFyYW1UeXBlLlN0cmluZ0xpdGVyYWxcbiAgfCBBcGlQYXJhbVR5cGUuTnVtZXJpY0xpdGVyYWxcbiAgfCBBcGlQYXJhbVR5cGUuT2JqZWN0XG4gIHwgQXBpUGFyYW1UeXBlLlVuaW9uXG4gIHwgQXBpUGFyYW1UeXBlLkludGVyc2VjdGlvblxuICB8IEFwaVBhcmFtVHlwZS5BcnJheVxuICB8IEFwaVBhcmFtVHlwZS5SZWZcbiAgfCBBcGlQYXJhbVR5cGUuSW5kZXhlZEFjY2Vzc1xuICB8IEFwaVBhcmFtVHlwZS5UeXBlUGFyYW1cbiAgfCBBcGlQYXJhbVR5cGUuVHVwbGVUeXBlO1xuXG4vKiBUZW1wbGF0ZSAqL1xuLyoqXG4gKiBVSSDsu7Ttj6zrhIztirgg66CM642U66eB7J2EIOychO2VnCDrqZTtg4DrjbDsnbTthLAg64W465Oc7J6F64uI64ukLlxuICpcbiAqICoq66qp7KCBKio6IFpvZCDsiqTtgqTrp4jroZzrtoDthLAg7ZSE66Gg7Yq47JeU65OcIFVJIOy7tO2PrOuEjO2KuOulvCDsnpDrj5kg7IOd7ISx7ZWY6riwIOychO2VnFxuICog66CM642U66eBIOygleuztOulvCDri7TsnYAg7Yq466asIOq1rOyhsOyeheuLiOuLpC4g6rCBIO2VhOuTnOqwgCDslrTrlqQgVUkg7Lu07Y+s64SM7Yq466GcXG4gKiDtkZztmITrkJjslrTslbwg7ZWY64qU7KeAKO2FjeyKpO2KuCwg7J2066+47KeALCDrgqDsp5wsIEVudW0g7ISg7YOdIOuTsSnrpbwg66qF7Iuc7ZWp64uI64ukLlxuICpcbiAqICoq67OA7ZmYIO2dkOumhCoqOlxuICogRW50aXR5IHN1YnNldCDihpIgRW50aXR5UHJvcE5vZGUg4oaSIFpvZCDsiqTtgqTrp4gg4oaSIFJlbmRlcmluZ05vZGUgKFVJ7JqpKSDihpIgUmVhY3Qg7Lu07Y+s64SM7Yq4IOy9lOuTnCDsg53shLFcbiAqXG4gKiAqKuyjvOyalCDtlYTrk5wqKjpcbiAqIC0gYHJlbmRlclR5cGVgOiBVSSDsu7Ttj6zrhIztirgg7Jyg7ZiVIChzdHJpbmctcGxhaW4sIG51bWJlci1ma19pZCwgZW51bXMsIGFycmF5IOuTsSlcbiAqIC0gYHpvZFR5cGVgOiDsm5Drs7ggWm9kIOyKpO2CpOuniCAodmFsaWRhdGlvbiDsmqkpXG4gKiAtIGBjaGlsZHJlbmA6IOykkeyyqeuQnCDqsJ3ssrQg7ZWE65Oc65OkIChvYmplY3Tsnbwg65WMKVxuICogLSBgZWxlbWVudGA6IOuwsOyXtCDsmpTshowg7YOA7J6FIChhcnJheeydvCDrlYwpXG4gKlxuICogKirsgqzsmqkg7JyE7LmYKio6XG4gKiAtIHpvZC1jb252ZXJ0ZXIudHPsnZggem9kVHlwZVRvUmVuZGVyaW5nTm9kZSgp7JeQ7IScIOyDneyEsVxuICogLSB2aWV3X2Zvcm0udGVtcGxhdGUudHMsIHZpZXdfbGlzdC50ZW1wbGF0ZS50cyDrk7Hsl5DshJwgUmVhY3Qg7Lu07Y+s64SM7Yq4IOy9lOuTnCDsg53shLHsl5Ag7IKs7JqpXG4gKi9cbi8vIOyFgO2UhCDssLjsobAg7YOA7J6F7J2066+A66GcIFpvZCDsg53rnrXtlZjqs6Ag7KeB7KCRIOygleydmFxuZXhwb3J0IGNvbnN0IFJlbmRlcmluZ05vZGUgPSB6LmFueSgpO1xuZXhwb3J0IHR5cGUgUmVuZGVyaW5nTm9kZSA9IHtcbiAgbmFtZTogc3RyaW5nO1xuICBsYWJlbDogc3RyaW5nO1xuICByZW5kZXJUeXBlOlxuICAgIHwgXCJzdHJpbmctcGxhaW5cIlxuICAgIHwgXCJzdHJpbmctaW1hZ2VcIlxuICAgIHwgXCJzdHJpbmctZGF0ZXRpbWVcIlxuICAgIHwgXCJzdHJpbmctZGF0ZVwiXG4gICAgfCBcImRhdGV0aW1lXCJcbiAgICB8IFwibnVtYmVyLXBsYWluXCJcbiAgICB8IFwibnVtYmVyLWlkXCJcbiAgICB8IFwibnVtYmVyLWZrX2lkXCJcbiAgICB8IFwiYm9vbGVhblwiXG4gICAgfCBcImVudW1zXCJcbiAgICB8IFwiYXJyYXlcIlxuICAgIHwgXCJhcnJheS1pbWFnZXNcIlxuICAgIHwgXCJvYmplY3RcIlxuICAgIHwgXCJvYmplY3QtcGlja1wiXG4gICAgfCBcInJlY29yZFwiO1xuICB6b2RUeXBlOiB6LlpvZFR5cGVBbnk7XG4gIGVsZW1lbnQ/OiBSZW5kZXJpbmdOb2RlO1xuICBjaGlsZHJlbj86IFJlbmRlcmluZ05vZGVbXTtcbiAgY29uZmlnPzoge1xuICAgIHBpY2tlZDogc3RyaW5nO1xuICB9O1xuICBvcHRpb25hbD86IGJvb2xlYW47XG4gIG51bGxhYmxlPzogYm9vbGVhbjtcbn07XG5cbmNvbnN0IEJhc2VQcm9wRmllbGRzID0ge1xuICBuYW1lOiB6LnN0cmluZygpLFxuICBkZXNjOiB6LnN0cmluZygpLm9wdGlvbmFsKCksXG4gIG51bGxhYmxlOiB6LmJvb2xlYW4oKS5vcHRpb25hbCgpLFxuICB0b0ZpbHRlcjogei5saXRlcmFsKHRydWUpLm9wdGlvbmFsKCksXG4gIGRiRGVmYXVsdDogei51bmlvbihbei5zdHJpbmcoKSwgei5udW1iZXIoKSwgei5ib29sZWFuKCldKS5vcHRpb25hbCgpLFxufTtcblxuLy8g67aA6rCAIO2VhOuTnOqwgCDtlYTsmpTsl4bripQgcHJvcFxuY29uc3QgQmFzZVByb3BGaWVsZHNXaXRob3V0QWRkaXRpb25hbCA9IHpcbiAgLm9iamVjdCh7XG4gICAgLi4uQmFzZVByb3BGaWVsZHMsXG4gICAgdHlwZTogei51bmlvbihbXG4gICAgICB6LmxpdGVyYWwoXCJpbnRlZ2VyXCIpLFxuICAgICAgei5saXRlcmFsKFwiaW50ZWdlcltdXCIpLFxuICAgICAgei5saXRlcmFsKFwiYmlnSW50ZWdlclwiKSxcbiAgICAgIHoubGl0ZXJhbChcImJpZ0ludGVnZXJbXVwiKSxcbiAgICAgIHoubGl0ZXJhbChcImJvb2xlYW5cIiksXG4gICAgICB6LmxpdGVyYWwoXCJib29sZWFuW11cIiksXG4gICAgICB6LmxpdGVyYWwoXCJkYXRlXCIpLFxuICAgICAgei5saXRlcmFsKFwiZGF0ZVtdXCIpLFxuICAgICAgei5saXRlcmFsKFwidXVpZFwiKSxcbiAgICAgIHoubGl0ZXJhbChcInV1aWRbXVwiKSxcbiAgICBdKSxcbiAgfSlcbiAgLnN0cmljdCgpO1xuXG4vLyBwcmVjaXNpb24vc2NhbGUg7ZWE65OcXG5jb25zdCBQcmVjaXNpb25TY2FsZUZpZWxkcyA9IHtcbiAgcHJlY2lzaW9uOiB6Lm51bWJlcigpLm9wdGlvbmFsKCksXG4gIHNjYWxlOiB6Lm51bWJlcigpLm9wdGlvbmFsKCksXG59O1xuXG4vLyDqsIEg7YOA7J6F67OEIOyKpO2CpOuniCDsoJXsnZhcblxuY29uc3QgU3RyaW5nUHJvcFNjaGVtYSA9IHpcbiAgLm9iamVjdCh7XG4gICAgLi4uQmFzZVByb3BGaWVsZHMsXG4gICAgdHlwZTogei5saXRlcmFsKFwic3RyaW5nXCIpLFxuICAgIGxlbmd0aDogei5udW1iZXIoKS5vcHRpb25hbCgpLFxuICB9KVxuICAuc3RyaWN0KCk7XG5jb25zdCBTdHJpbmdBcnJheVByb3BTY2hlbWEgPSB6XG4gIC5vYmplY3Qoe1xuICAgIC4uLkJhc2VQcm9wRmllbGRzLFxuICAgIHR5cGU6IHoubGl0ZXJhbChcInN0cmluZ1tdXCIpLFxuICAgIGxlbmd0aDogei5udW1iZXIoKS5vcHRpb25hbCgpLFxuICB9KVxuICAuc3RyaWN0KCk7XG5cbmNvbnN0IEVudW1Qcm9wU2NoZW1hID0gelxuICAub2JqZWN0KHtcbiAgICAuLi5CYXNlUHJvcEZpZWxkcyxcbiAgICB0eXBlOiB6LmxpdGVyYWwoXCJlbnVtXCIpLFxuICAgIGlkOiB6LnN0cmluZygpLFxuICB9KVxuICAuc3RyaWN0KCk7XG5jb25zdCBFbnVtQXJyYXlQcm9wU2NoZW1hID0gelxuICAub2JqZWN0KHtcbiAgICAuLi5CYXNlUHJvcEZpZWxkcyxcbiAgICB0eXBlOiB6LmxpdGVyYWwoXCJlbnVtW11cIiksXG4gICAgaWQ6IHouc3RyaW5nKCksXG4gIH0pXG4gIC5zdHJpY3QoKTtcblxuY29uc3QgTnVtYmVyUHJvcFNjaGVtYSA9IHpcbiAgLm9iamVjdCh7XG4gICAgLi4uQmFzZVByb3BGaWVsZHMsXG4gICAgdHlwZTogei5saXRlcmFsKFwibnVtYmVyXCIpLFxuICAgIC4uLlByZWNpc2lvblNjYWxlRmllbGRzLFxuICAgIG51bWJlclR5cGU6IHouZW51bShbXCJyZWFsXCIsIFwiZG91YmxlIHByZWNpc2lvblwiLCBcIm51bWVyaWNcIl0pLm9wdGlvbmFsKCksXG4gIH0pXG4gIC5zdHJpY3QoKTtcbmNvbnN0IE51bWJlckFycmF5UHJvcFNjaGVtYSA9IHpcbiAgLm9iamVjdCh7XG4gICAgLi4uQmFzZVByb3BGaWVsZHMsXG4gICAgdHlwZTogei5saXRlcmFsKFwibnVtYmVyW11cIiksXG4gICAgLi4uUHJlY2lzaW9uU2NhbGVGaWVsZHMsXG4gICAgbnVtYmVyVHlwZTogei5lbnVtKFtcInJlYWxcIiwgXCJkb3VibGUgcHJlY2lzaW9uXCIsIFwibnVtZXJpY1wiXSkub3B0aW9uYWwoKSxcbiAgfSlcbiAgLnN0cmljdCgpO1xuXG5jb25zdCBOdW1lcmljUHJvcFNjaGVtYSA9IHpcbiAgLm9iamVjdCh7XG4gICAgLi4uQmFzZVByb3BGaWVsZHMsXG4gICAgdHlwZTogei5saXRlcmFsKFwibnVtZXJpY1wiKSxcbiAgICAuLi5QcmVjaXNpb25TY2FsZUZpZWxkcyxcbiAgfSlcbiAgLnN0cmljdCgpO1xuY29uc3QgTnVtZXJpY0FycmF5UHJvcFNjaGVtYSA9IHpcbiAgLm9iamVjdCh7XG4gICAgLi4uQmFzZVByb3BGaWVsZHMsXG4gICAgdHlwZTogei5saXRlcmFsKFwibnVtZXJpY1tdXCIpLFxuICAgIC4uLlByZWNpc2lvblNjYWxlRmllbGRzLFxuICB9KVxuICAuc3RyaWN0KCk7XG5cbmNvbnN0IEpzb25Qcm9wU2NoZW1hID0gelxuICAub2JqZWN0KHtcbiAgICAuLi5CYXNlUHJvcEZpZWxkcyxcbiAgICB0eXBlOiB6LmxpdGVyYWwoXCJqc29uXCIpLFxuICAgIGlkOiB6LnN0cmluZygpLFxuICB9KVxuICAuc3RyaWN0KCk7XG5cbmNvbnN0IFZpcnR1YWxQcm9wU2NoZW1hID0gelxuICAub2JqZWN0KHtcbiAgICAuLi5CYXNlUHJvcEZpZWxkcyxcbiAgICB0eXBlOiB6LmxpdGVyYWwoXCJ2aXJ0dWFsXCIpLFxuICAgIGlkOiB6LnN0cmluZygpLFxuICB9KVxuICAuc3RyaWN0KCk7XG5cbi8vIFJlbGF0aW9uIO2DgOyeheydgCByZWxhdGlvblR5cGXsl5Ag65Sw6528IOyEuOu2hO2ZlFxuY29uc3QgQmFzZVJlbGF0aW9uRmllbGRzID0ge1xuICAuLi5CYXNlUHJvcEZpZWxkcyxcbiAgdHlwZTogei5saXRlcmFsKFwicmVsYXRpb25cIiksXG4gIHdpdGg6IHouc3RyaW5nKCksXG59O1xuXG4vLyBSZWxhdGlvbk9uIO2DgOyehVxuY29uc3QgUmVsYXRpb25PblNjaGVtYSA9IHouZW51bShbXCJDQVNDQURFXCIsIFwiU0VUIE5VTExcIiwgXCJOTyBBQ1RJT05cIiwgXCJTRVQgREVGQVVMVFwiLCBcIlJFU1RSSUNUXCJdKTtcblxuY29uc3QgQmVsb25nc1RvT25lUmVsYXRpb25Qcm9wU2NoZW1hID0gelxuICAub2JqZWN0KHtcbiAgICAuLi5CYXNlUmVsYXRpb25GaWVsZHMsXG4gICAgcmVsYXRpb25UeXBlOiB6LmxpdGVyYWwoXCJCZWxvbmdzVG9PbmVcIiksXG4gICAgY3VzdG9tSm9pbkNsYXVzZTogei5zdHJpbmcoKS5vcHRpb25hbCgpLFxuICAgIHVzZUNvbnN0cmFpbnQ6IHouYm9vbGVhbigpLm9wdGlvbmFsKCksXG4gICAgb25VcGRhdGU6IFJlbGF0aW9uT25TY2hlbWEub3B0aW9uYWwoKSxcbiAgICBvbkRlbGV0ZTogUmVsYXRpb25PblNjaGVtYS5vcHRpb25hbCgpLFxuICB9KVxuICAuc3RyaWN0KCk7XG5cbmNvbnN0IEhhc01hbnlSZWxhdGlvblByb3BTY2hlbWEgPSB6XG4gIC5vYmplY3Qoe1xuICAgIC4uLkJhc2VSZWxhdGlvbkZpZWxkcyxcbiAgICByZWxhdGlvblR5cGU6IHoubGl0ZXJhbChcIkhhc01hbnlcIiksXG4gICAgam9pbkNvbHVtbjogei5zdHJpbmcoKSxcbiAgICBmcm9tQ29sdW1uOiB6LnN0cmluZygpLm9wdGlvbmFsKCksXG4gIH0pXG4gIC5zdHJpY3QoKTtcblxuY29uc3QgTWFueVRvTWFueVJlbGF0aW9uUHJvcFNjaGVtYSA9IHpcbiAgLm9iamVjdCh7XG4gICAgLi4uQmFzZVJlbGF0aW9uRmllbGRzLFxuICAgIHJlbGF0aW9uVHlwZTogei5saXRlcmFsKFwiTWFueVRvTWFueVwiKSxcbiAgICBqb2luVGFibGU6IHouc3RyaW5nKCksXG4gICAgb25VcGRhdGU6IFJlbGF0aW9uT25TY2hlbWEsXG4gICAgb25EZWxldGU6IFJlbGF0aW9uT25TY2hlbWEsXG4gIH0pXG4gIC5zdHJpY3QoKTtcblxuY29uc3QgT25lVG9PbmVSZWxhdGlvblByb3BTY2hlbWEgPSB6XG4gIC5vYmplY3Qoe1xuICAgIC4uLkJhc2VSZWxhdGlvbkZpZWxkcyxcbiAgICByZWxhdGlvblR5cGU6IHoubGl0ZXJhbChcIk9uZVRvT25lXCIpLFxuICAgIGN1c3RvbUpvaW5DbGF1c2U6IHouc3RyaW5nKCkub3B0aW9uYWwoKSxcbiAgICBoYXNKb2luQ29sdW1uOiB6LmJvb2xlYW4oKS5vcHRpb25hbCgpLFxuICAgIHVzZUNvbnN0cmFpbnQ6IHouYm9vbGVhbigpLm9wdGlvbmFsKCksXG4gICAgb25VcGRhdGU6IFJlbGF0aW9uT25TY2hlbWEub3B0aW9uYWwoKSxcbiAgICBvbkRlbGV0ZTogUmVsYXRpb25PblNjaGVtYS5vcHRpb25hbCgpLFxuICB9KVxuICAuc3RyaWN0KCk7XG5cbmNvbnN0IFJlbGF0aW9uVHlwZXMgPSBbXCJCZWxvbmdzVG9PbmVcIiwgXCJIYXNNYW55XCIsIFwiTWFueVRvTWFueVwiLCBcIk9uZVRvT25lXCJdIGFzIGNvbnN0O1xuZXhwb3J0IGNvbnN0IFJlbGF0aW9uUHJvcFNjaGVtYSA9IHouZGlzY3JpbWluYXRlZFVuaW9uKFxuICBcInJlbGF0aW9uVHlwZVwiLFxuICBbXG4gICAgQmVsb25nc1RvT25lUmVsYXRpb25Qcm9wU2NoZW1hLFxuICAgIEhhc01hbnlSZWxhdGlvblByb3BTY2hlbWEsXG4gICAgTWFueVRvTWFueVJlbGF0aW9uUHJvcFNjaGVtYSxcbiAgICBPbmVUb09uZVJlbGF0aW9uUHJvcFNjaGVtYSxcbiAgXSxcbiAge1xuICAgIGVycm9yOiAoaXNzKSA9PlxuICAgICAgYHJlbGF0aW9uVHlwZeydgCAke1JlbGF0aW9uVHlwZXMubWFwKCh0KSA9PiBgJyR7dH0nYCkuam9pbihcIiwgXCIpfSDspJEg7ZWY64KY7Jes7JW8IO2VqeuLiOuLpC4g7J6F66Cl6rCSOiBcIiR7KGlzcy5pbnB1dCBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPik/LnJlbGF0aW9uVHlwZX1cImAsXG4gIH0sXG4pO1xuXG5jb25zdCBOb3JtYWxQcm9wVHlwZXMgPSBbXG4gIFwiaW50ZWdlclwiLFxuICBcImludGVnZXJbXVwiLFxuICBcImJpZ0ludGVnZXJcIixcbiAgXCJiaWdJbnRlZ2VyW11cIixcbiAgXCJzdHJpbmdcIixcbiAgXCJzdHJpbmdbXVwiLFxuICBcImVudW1cIixcbiAgXCJlbnVtW11cIixcbiAgXCJudW1iZXJcIixcbiAgXCJudW1iZXJbXVwiLFxuICBcIm51bWVyaWNcIixcbiAgXCJudW1lcmljW11cIixcbiAgXCJib29sZWFuXCIsXG4gIFwiYm9vbGVhbltdXCIsXG4gIFwiZGF0ZVwiLFxuICBcImRhdGVbXVwiLFxuICBcInV1aWRcIixcbiAgXCJ1dWlkW11cIixcbiAgXCJqc29uXCIsXG4gIFwidmlydHVhbFwiLFxuXSBhcyBjb25zdDtcbmV4cG9ydCBjb25zdCBOb3JtYWxQcm9wU2NoZW1hID0gei5kaXNjcmltaW5hdGVkVW5pb24oXG4gIFwidHlwZVwiLFxuICBbXG4gICAgQmFzZVByb3BGaWVsZHNXaXRob3V0QWRkaXRpb25hbCxcbiAgICBTdHJpbmdQcm9wU2NoZW1hLFxuICAgIFN0cmluZ0FycmF5UHJvcFNjaGVtYSxcbiAgICBFbnVtUHJvcFNjaGVtYSxcbiAgICBFbnVtQXJyYXlQcm9wU2NoZW1hLFxuICAgIE51bWJlclByb3BTY2hlbWEsXG4gICAgTnVtYmVyQXJyYXlQcm9wU2NoZW1hLFxuICAgIE51bWVyaWNQcm9wU2NoZW1hLFxuICAgIE51bWVyaWNBcnJheVByb3BTY2hlbWEsXG4gICAgSnNvblByb3BTY2hlbWEsXG4gICAgVmlydHVhbFByb3BTY2hlbWEsXG4gIF0sXG4gIHtcbiAgICBlcnJvcjogKGlzcykgPT5cbiAgICAgIGB0eXBl7J2AICR7Tm9ybWFsUHJvcFR5cGVzLm1hcCgodCkgPT4gYCcke3R9J2ApLmpvaW4oXCIsIFwiKX0g7KSRIO2VmOuCmOyXrOyVvCDtlanri4jri6QuIOyeheugpeqwkjogXCIkeyhpc3MuaW5wdXQgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pPy50eXBlfVwiYCxcbiAgfSxcbik7XG5cbmNvbnN0IEFsbFByb3BUeXBlcyA9IFsuLi5Ob3JtYWxQcm9wVHlwZXMsIFwicmVsYXRpb25cIl0gYXMgY29uc3Q7XG5jb25zdCBFbnRpdHlQcm9wU2NoZW1hID0gei5kaXNjcmltaW5hdGVkVW5pb24oXCJ0eXBlXCIsIFtOb3JtYWxQcm9wU2NoZW1hLCBSZWxhdGlvblByb3BTY2hlbWFdLCB7XG4gIGVycm9yOiAoaXNzKSA9PlxuICAgIGB0eXBl7J2AICR7QWxsUHJvcFR5cGVzLm1hcCgodCkgPT4gYCcke3R9J2ApLmpvaW4oXCIsIFwiKX0g7KSRIO2VmOuCmOyXrOyVvCDtlanri4jri6QuIOyeheugpeqwkjogXCIkeyhpc3MuaW5wdXQgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pPy50eXBlfVwiYCxcbn0pO1xuXG4vLyBFbnRpdHlJbmRleCDsiqTtgqTrp4gg7KCV7J2YXG5jb25zdCBFbnRpdHlJbmRleFNjaGVtYSA9IHpcbiAgLm9iamVjdCh7XG4gICAgdHlwZTogei5lbnVtKFtcImluZGV4XCIsIFwidW5pcXVlXCIsIFwiZnVsbHRleHRcIl0pLFxuICAgIGNvbHVtbnM6IHouYXJyYXkoei5zdHJpbmcoKSksXG4gICAgbmFtZTogei5zdHJpbmcoKS5vcHRpb25hbCgpLFxuICAgIHBhcnNlcjogei5lbnVtKFtcImJ1aWx0LWluXCIsIFwibmdyYW1cIl0pLm9wdGlvbmFsKCksXG4gIH0pXG4gIC5zdHJpY3QoKTtcblxuZXhwb3J0IGNvbnN0IEVudGl0eUpzb25TY2hlbWEgPSB6XG4gIC5vYmplY3Qoe1xuICAgIGlkOiB6LnN0cmluZygpLmRlc2NyaWJlKFwiUGFzY2FsQ2FzZeuhnCDrkJwgRW50aXR5IElEXCIpLFxuICAgIHRpdGxlOiB6LnN0cmluZygpLmRlc2NyaWJlKFwiRW50aXR5IOydtOumhFwiKSxcbiAgICB0YWJsZTogei5zdHJpbmcoKS5kZXNjcmliZShcInNuYWtlX2Nhc2XroZwg65CcIO2FjOydtOu4lOuqhVwiKSxcbiAgICBwYXJlbnRJZDogei5zdHJpbmcoKS5vcHRpb25hbCgpLmRlc2NyaWJlKFwi67aA66qoIEVudGl0eSBJRFwiKSxcbiAgICBwcm9wczogei5hcnJheShFbnRpdHlQcm9wU2NoZW1hKSxcbiAgICBpbmRleGVzOiB6LmFycmF5KEVudGl0eUluZGV4U2NoZW1hKSxcbiAgICBzdWJzZXRzOiB6LnJlY29yZCh6LnN0cmluZygpLCB6LmFycmF5KHouc3RyaW5nKCkpKSxcbiAgICBlbnVtczogei5yZWNvcmQoei5zdHJpbmcoKSwgei5yZWNvcmQoei5zdHJpbmcoKSwgei5zdHJpbmcoKSkpLFxuICB9KVxuICAuc3RyaWN0KCk7XG5cbmV4cG9ydCBjb25zdCBUZW1wbGF0ZU9wdGlvbnMgPSB6Lm9iamVjdCh7XG4gIGVudGl0eTogRW50aXR5SnNvblNjaGVtYS5vbWl0KHsgaWQ6IHRydWUgfSlcbiAgICAuZXh0ZW5kKHtcbiAgICAgIGVudGl0eUlkOiB6LnN0cmluZygpLFxuICAgIH0pXG4gICAgLnBhcnRpYWwoe1xuICAgICAgdGFibGU6IHRydWUsXG4gICAgICBwcm9wczogdHJ1ZSxcbiAgICAgIGluZGV4ZXM6IHRydWUsXG4gICAgICBzdWJzZXRzOiB0cnVlLFxuICAgICAgZW51bXM6IHRydWUsXG4gICAgfSksXG4gIGluaXRfdHlwZXM6IHoub2JqZWN0KHtcbiAgICBlbnRpdHlJZDogei5zdHJpbmcoKSxcbiAgfSksXG4gIGdlbmVyYXRlZDogei5vYmplY3Qoe30pLFxuICBnZW5lcmF0ZWRfc3NvOiB6Lm9iamVjdCh7fSksXG4gIGdlbmVyYXRlZF9odHRwOiB6Lm9iamVjdCh7XG4gICAgZW50aXR5SWQ6IHouc3RyaW5nKCksXG4gIH0pLFxuICBtb2RlbDogei5vYmplY3Qoe1xuICAgIGVudGl0eUlkOiB6LnN0cmluZygpLFxuICAgIGRlZmF1bHRTZWFyY2hGaWVsZDogei5zdHJpbmcoKS5vcHRpb25hbCgpLFxuICAgIGRlZmF1bHRPcmRlckJ5OiB6LnN0cmluZygpLm9wdGlvbmFsKCksXG4gIH0pLFxuICBtb2RlbF90ZXN0OiB6Lm9iamVjdCh7XG4gICAgZW50aXR5SWQ6IHouc3RyaW5nKCksXG4gIH0pLFxuICBicmlkZ2U6IHoub2JqZWN0KHtcbiAgICBlbnRpdHlJZDogei5zdHJpbmcoKSxcbiAgfSksXG4gIHNlcnZpY2U6IHoub2JqZWN0KHtcbiAgICBuYW1lc1JlY29yZDogei5vYmplY3Qoe1xuICAgICAgZnM6IHouc3RyaW5nKCksXG4gICAgICBmc1BsdXJhbDogei5zdHJpbmcoKSxcbiAgICAgIGNhbWVsOiB6LnN0cmluZygpLFxuICAgICAgY2FtZWxQbHVyYWw6IHouc3RyaW5nKCksXG4gICAgICBjYXBpdGFsOiB6LnN0cmluZygpLFxuICAgICAgY2FwaXRhbFBsdXJhbDogei5zdHJpbmcoKSxcbiAgICAgIHVwcGVyOiB6LnN0cmluZygpLFxuICAgICAgY29uc3RhbnQ6IHouc3RyaW5nKCksXG4gICAgfSksXG4gICAgbW9kZWxUc1BhdGg6IHouc3RyaW5nKCksXG4gIH0pLFxuICB2aWV3X2xpc3Q6IHoub2JqZWN0KHtcbiAgICBlbnRpdHlJZDogei5zdHJpbmcoKSxcbiAgICBleHRyYTogei51bmtub3duKCksXG4gIH0pLFxuICB2aWV3X2xpc3RfY29sdW1uczogei5vYmplY3Qoe1xuICAgIGVudGl0eUlkOiB6LnN0cmluZygpLFxuICAgIGNvbHVtbnM6IHpcbiAgICAgIC5vYmplY3Qoe1xuICAgICAgICBuYW1lOiB6LnN0cmluZygpLFxuICAgICAgICBsYWJlbDogei5zdHJpbmcoKSxcbiAgICAgICAgdGM6IHouc3RyaW5nKCksXG4gICAgICB9KVxuICAgICAgLmFycmF5KCksXG4gICAgY29sdW1uSW1wb3J0czogei5zdHJpbmcoKSxcbiAgfSksXG4gIHZpZXdfc2VhcmNoX2lucHV0OiB6Lm9iamVjdCh7XG4gICAgZW50aXR5SWQ6IHouc3RyaW5nKCksXG4gIH0pLFxuICB2aWV3X2Zvcm06IHoub2JqZWN0KHtcbiAgICBlbnRpdHlJZDogei5zdHJpbmcoKSxcbiAgfSksXG4gIHZpZXdfaWRfYWxsX3NlbGVjdDogei5vYmplY3Qoe1xuICAgIGVudGl0eUlkOiB6LnN0cmluZygpLFxuICB9KSxcbiAgdmlld19pZF9hc3luY19zZWxlY3Q6IHoub2JqZWN0KHtcbiAgICBlbnRpdHlJZDogei5zdHJpbmcoKSxcbiAgICB0ZXh0RmllbGQ6IHouc3RyaW5nKCksXG4gIH0pLFxuICB2aWV3X2VudW1zX3NlbGVjdDogei5vYmplY3Qoe1xuICAgIGVudGl0eUlkOiB6LnN0cmluZygpLFxuICAgIGVudW1JZDogei5zdHJpbmcoKSxcbiAgfSksXG4gIHZpZXdfZW51bXNfZHJvcGRvd246IHoub2JqZWN0KHtcbiAgICBlbnRpdHlJZDogei5zdHJpbmcoKSxcbiAgICBlbnVtSWQ6IHouc3RyaW5nKCksXG4gIH0pLFxuICB2aWV3X2VudW1zX2J1dHRvbnNldDogei5vYmplY3Qoe1xuICAgIGVudGl0eUlkOiB6LnN0cmluZygpLFxuICAgIGVudW1JZDogei5zdHJpbmcoKSxcbiAgfSksXG59KTtcbmV4cG9ydCB0eXBlIFRlbXBsYXRlT3B0aW9ucyA9IHouaW5mZXI8dHlwZW9mIFRlbXBsYXRlT3B0aW9ucz47XG5cbmV4cG9ydCBjb25zdCBUZW1wbGF0ZUtleSA9IHouZW51bShbXG4gIFwiZW50aXR5XCIsXG4gIFwiaW5pdF90eXBlc1wiLFxuICBcImdlbmVyYXRlZFwiLFxuICBcImdlbmVyYXRlZF9zc29cIixcbiAgXCJnZW5lcmF0ZWRfaHR0cFwiLFxuICBcIm1vZGVsXCIsXG4gIFwibW9kZWxfdGVzdFwiLFxuICBcImJyaWRnZVwiLFxuICBcInNlcnZpY2VcIixcbiAgXCJ2aWV3X2xpc3RcIixcbiAgXCJ2aWV3X2xpc3RfY29sdW1uc1wiLFxuICBcInZpZXdfc2VhcmNoX2lucHV0XCIsXG4gIFwidmlld19mb3JtXCIsXG4gIFwidmlld19pZF9hbGxfc2VsZWN0XCIsXG4gIFwidmlld19pZF9hc3luY19zZWxlY3RcIixcbiAgXCJ2aWV3X2VudW1zX3NlbGVjdFwiLFxuICBcInZpZXdfZW51bXNfZHJvcGRvd25cIixcbiAgXCJ2aWV3X2VudW1zX2J1dHRvbnNldFwiLFxuXSk7XG5leHBvcnQgdHlwZSBUZW1wbGF0ZUtleSA9IHouaW5mZXI8dHlwZW9mIFRlbXBsYXRlS2V5PjtcblxuZXhwb3J0IGNvbnN0IEdlbmVyYXRlT3B0aW9ucyA9IHoub2JqZWN0KHtcbiAgb3ZlcndyaXRlOiB6LmJvb2xlYW4oKS5vcHRpb25hbCgpLFxufSk7XG5leHBvcnQgdHlwZSBHZW5lcmF0ZU9wdGlvbnMgPSB6LmluZmVyPHR5cGVvZiBHZW5lcmF0ZU9wdGlvbnM+O1xuXG5leHBvcnQgY29uc3QgUGF0aEFuZENvZGUgPSB6Lm9iamVjdCh7XG4gIHBhdGg6IHouc3RyaW5nKCksXG4gIGNvZGU6IHouc3RyaW5nKCksXG59KTtcbmV4cG9ydCB0eXBlIFBhdGhBbmRDb2RlID0gei5pbmZlcjx0eXBlb2YgUGF0aEFuZENvZGU+O1xuXG5leHBvcnQgdHlwZSBGaXh0dXJlU2VhcmNoT3B0aW9ucyA9IHtcbiAgZW50aXR5SWQ6IHN0cmluZztcbiAgZmllbGQ6IHN0cmluZztcbiAgdmFsdWU6IHN0cmluZztcbiAgc2VhcmNoVHlwZTogXCJlcXVhbHNcIiB8IFwibGlrZVwiO1xufTtcblxudHlwZSBDb2x1bW5WYWx1ZSA9IHN0cmluZyB8IG51bWJlciB8IGJvb2xlYW4gfCBEYXRlIHwgbnVsbDtcbmV4cG9ydCB0eXBlIEZpeHR1cmVSZWNvcmQgPSB7XG4gIGZpeHR1cmVJZDogc3RyaW5nO1xuICBlbnRpdHlJZDogc3RyaW5nO1xuICBpZDogbnVtYmVyO1xuICBjb2x1bW5zOiB7XG4gICAgW2tleTogc3RyaW5nXToge1xuICAgICAgcHJvcDogRW50aXR5UHJvcDtcbiAgICAgIHZhbHVlOiBDb2x1bW5WYWx1ZSB8IENvbHVtblZhbHVlW107XG4gICAgfTtcbiAgfTtcbiAgZmV0Y2hlZFJlY29yZHM6IHN0cmluZ1tdO1xuICBiZWxvbmdzUmVjb3Jkczogc3RyaW5nW107XG4gIHRhcmdldD86IEZpeHR1cmVSZWNvcmQ7IC8vIEltcG9ydCDrjIDsg4EgREIg66CI7L2U65OcKGlk6rCAIOqwmeydgClcbiAgdW5pcXVlPzogRml4dHVyZVJlY29yZDsgLy8gSW1wb3J0IOuMgOyDgSBEQiDroIjsvZTrk5wodW5pcXVlIGtleeqwgCDqsJnsnYApXG4gIG92ZXJyaWRlPzogYm9vbGVhbjtcbn07XG5cbmV4cG9ydCB0eXBlIEZpeHR1cmVJbXBvcnRSZXN1bHQgPSB7XG4gIGVudGl0eUlkOiBzdHJpbmc7XG4gIGRhdGE6IHtcbiAgICBba2V5OiBzdHJpbmddOiBDb2x1bW5WYWx1ZTtcbiAgfTtcbn07XG5cbmV4cG9ydCB0eXBlIFJlbGF0aW9uTm9kZSA9IHtcbiAgZml4dHVyZUlkOiBzdHJpbmc7XG4gIGVudGl0eUlkOiBzdHJpbmc7XG4gIHJlbGF0ZWQ6IFNldDxzdHJpbmc+O1xufTtcblxuLy8gYmlvbWUtaWdub3JlIGxpbnQvc3VzcGljaW91cy9ub0VtcHR5SW50ZXJmYWNlOiBzb25hbXUuZ2VuZXJhdGVkLnNzbyDsl5DshJwg7ZmV7J6l7J2EIOychO2VtCDspIDruYTrkJwg67mIIOyduO2EsO2OmOydtOyKpFxuZXhwb3J0IGludGVyZmFjZSBEYXRhYmFzZVNjaGVtYUV4dGVuZCB7fVxuZXhwb3J0IHR5cGUgTWFueVRvTWFueUJhc2VTY2hlbWE8RnJvbUlkS2V5IGV4dGVuZHMgc3RyaW5nLCBUb0lkS2V5IGV4dGVuZHMgc3RyaW5nPiA9IHtcbiAgaWQ6IG51bWJlcjtcbn0gJiB7XG4gIFtLIGluIGAke0Zyb21JZEtleX1faWRgXTogbnVtYmVyO1xufSAmIHtcbiAgW0sgaW4gYCR7VG9JZEtleX1faWRgXTogbnVtYmVyO1xufTtcblxuZXhwb3J0IHR5cGUgU29uYW11RmFzdGlmeUNvbmZpZyA9IHtcbiAgY29udGV4dFByb3ZpZGVyOiAoXG4gICAgZGVmYXVsdENvbnRleHQ6IFBpY2s8Q29udGV4dCwgXCJyZXF1ZXN0XCIgfCBcInJlcGx5XCIgfCBcImhlYWRlcnNcIiB8IFwiY3JlYXRlU1NFXCIgfCBcIm5haXRlU3RvcmVcIj4gJlxuICAgICAgQXV0aENvbnRleHQsXG4gICAgcmVxdWVzdDogRmFzdGlmeVJlcXVlc3QsXG4gICAgcmVwbHk6IEZhc3RpZnlSZXBseSxcbiAgKSA9PiBDb250ZXh0IHwgUHJvbWlzZTxDb250ZXh0PjtcbiAgZ3VhcmRIYW5kbGVyOiAoXG4gICAgZ3VhcmQ6IEd1YXJkS2V5LFxuICAgIHJlcXVlc3Q6IEZhc3RpZnlSZXF1ZXN0LFxuICAgIGFwaToge1xuICAgICAgdHlwZVBhcmFtZXRlcnM6IEFwaVBhcmFtVHlwZS5UeXBlUGFyYW1bXTtcbiAgICAgIHBhcmFtZXRlcnM6IEFwaVBhcmFtW107XG4gICAgICByZXR1cm5UeXBlOiBBcGlQYXJhbVR5cGU7XG4gICAgICBtb2RlbE5hbWU6IHN0cmluZztcbiAgICAgIG1ldGhvZE5hbWU6IHN0cmluZztcbiAgICAgIHBhdGg6IHN0cmluZztcbiAgICAgIG9wdGlvbnM6IEFwaURlY29yYXRvck9wdGlvbnM7XG4gICAgfSxcbiAgKSA9PiB2b2lkO1xuICBjYWNoZT86IHtcbiAgICBnZXQ6IChrZXk6IHN0cmluZykgPT4gUHJvbWlzZTx1bmtub3duIHwgbnVsbD47XG4gICAgcHV0OiAoa2V5OiBzdHJpbmcsIHZhbHVlOiB1bmtub3duLCB0dGw/OiBudW1iZXIpID0+IFByb21pc2U8dm9pZD47XG4gICAgcmVzb2x2ZUtleTogKFxuICAgICAgcGF0aDogc3RyaW5nLFxuICAgICAgcmVxQm9keToge1xuICAgICAgICBba2V5OiBzdHJpbmddOiB1bmtub3duO1xuICAgICAgfSxcbiAgICApID0+XG4gICAgICB8IHtcbiAgICAgICAgICBjYWNoZTogZmFsc2U7XG4gICAgICAgIH1cbiAgICAgIHwge1xuICAgICAgICAgIGNhY2hlOiB0cnVlO1xuICAgICAgICAgIGtleTogc3RyaW5nO1xuICAgICAgICAgIHR0bD86IG51bWJlcjtcbiAgICAgICAgfTtcbiAgfTtcbn07XG4iXSwibmFtZXMiOlsieiIsInpBcnJheWFibGUiLCJzaGFwZSIsInVuaW9uIiwiYXJyYXkiLCJpc0ludGVnZXJTaW5nbGVQcm9wIiwicCIsInR5cGUiLCJpc0ludGVnZXJBcnJheVByb3AiLCJpc0ludGVnZXJQcm9wIiwiaXNCaWdJbnRlZ2VyU2luZ2xlUHJvcCIsImlzQmlnSW50ZWdlckFycmF5UHJvcCIsImlzQmlnSW50ZWdlclByb3AiLCJpc1N0cmluZ1NpbmdsZVByb3AiLCJpc1N0cmluZ0FycmF5UHJvcCIsImlzU3RyaW5nUHJvcCIsImlzRW51bVNpbmdsZVByb3AiLCJpc0VudW1BcnJheVByb3AiLCJpc0VudW1Qcm9wIiwiaXNOdW1iZXJTaW5nbGVQcm9wIiwiaXNOdW1iZXJBcnJheVByb3AiLCJpc051bWJlclByb3AiLCJpc051bWVyaWNTaW5nbGVQcm9wIiwiaXNOdW1lcmljQXJyYXlQcm9wIiwiaXNOdW1lcmljUHJvcCIsImlzQm9vbGVhblNpbmdsZVByb3AiLCJpc0Jvb2xlYW5BcnJheVByb3AiLCJpc0Jvb2xlYW5Qcm9wIiwiaXNEYXRlU2luZ2xlUHJvcCIsImlzRGF0ZUFycmF5UHJvcCIsImlzRGF0ZVByb3AiLCJpc1V1aWRTaW5nbGVQcm9wIiwiaXNVdWlkQXJyYXlQcm9wIiwiaXNVdWlkUHJvcCIsImlzSnNvblByb3AiLCJpc1ZpcnR1YWxQcm9wIiwiaXNSZWxhdGlvblByb3AiLCJpc09uZVRvT25lUmVsYXRpb25Qcm9wIiwicmVsYXRpb25UeXBlIiwiaXNCZWxvbmdzVG9PbmVSZWxhdGlvblByb3AiLCJpc0hhc01hbnlSZWxhdGlvblByb3AiLCJpc01hbnlUb01hbnlSZWxhdGlvblByb3AiLCJpc0N1c3RvbUpvaW5DbGF1c2UiLCJjdXN0b20iLCJTb25hbXVRdWVyeU1vZGUiLCJlbnVtIiwiaXNLbmV4RXJyb3IiLCJlIiwiY29kZSIsInNxbE1lc3NhZ2UiLCJzcWxTdGF0ZSIsIkFwaVBhcmFtVHlwZSIsImlzT2JqZWN0IiwidiIsInQiLCJpc1VuaW9uIiwiaXNJbnRlcnNlY3Rpb24iLCJpc1N0cmluZ0xpdGVyYWwiLCJpc051bWVyaWNMaXRlcmFsIiwiaXNBcnJheSIsImlzUmVmIiwiaXNJbmRleGVkQWNjZXNzIiwiaXNUdXBsZVR5cGUiLCJpc1BpY2siLCJpZCIsImlzT21pdCIsImlzUGFydGlhbCIsImlzUHJvbWlzZSIsImlzQ29udGV4dCIsImlzUmVmS25leCIsImlzVHlwZVBhcmFtIiwiUmVuZGVyaW5nTm9kZSIsImFueSIsIkJhc2VQcm9wRmllbGRzIiwibmFtZSIsInN0cmluZyIsImRlc2MiLCJvcHRpb25hbCIsIm51bGxhYmxlIiwiYm9vbGVhbiIsInRvRmlsdGVyIiwibGl0ZXJhbCIsImRiRGVmYXVsdCIsIm51bWJlciIsIkJhc2VQcm9wRmllbGRzV2l0aG91dEFkZGl0aW9uYWwiLCJvYmplY3QiLCJzdHJpY3QiLCJQcmVjaXNpb25TY2FsZUZpZWxkcyIsInByZWNpc2lvbiIsInNjYWxlIiwiU3RyaW5nUHJvcFNjaGVtYSIsImxlbmd0aCIsIlN0cmluZ0FycmF5UHJvcFNjaGVtYSIsIkVudW1Qcm9wU2NoZW1hIiwiRW51bUFycmF5UHJvcFNjaGVtYSIsIk51bWJlclByb3BTY2hlbWEiLCJudW1iZXJUeXBlIiwiTnVtYmVyQXJyYXlQcm9wU2NoZW1hIiwiTnVtZXJpY1Byb3BTY2hlbWEiLCJOdW1lcmljQXJyYXlQcm9wU2NoZW1hIiwiSnNvblByb3BTY2hlbWEiLCJWaXJ0dWFsUHJvcFNjaGVtYSIsIkJhc2VSZWxhdGlvbkZpZWxkcyIsIndpdGgiLCJSZWxhdGlvbk9uU2NoZW1hIiwiQmVsb25nc1RvT25lUmVsYXRpb25Qcm9wU2NoZW1hIiwiY3VzdG9tSm9pbkNsYXVzZSIsInVzZUNvbnN0cmFpbnQiLCJvblVwZGF0ZSIsIm9uRGVsZXRlIiwiSGFzTWFueVJlbGF0aW9uUHJvcFNjaGVtYSIsImpvaW5Db2x1bW4iLCJmcm9tQ29sdW1uIiwiTWFueVRvTWFueVJlbGF0aW9uUHJvcFNjaGVtYSIsImpvaW5UYWJsZSIsIk9uZVRvT25lUmVsYXRpb25Qcm9wU2NoZW1hIiwiaGFzSm9pbkNvbHVtbiIsIlJlbGF0aW9uVHlwZXMiLCJSZWxhdGlvblByb3BTY2hlbWEiLCJkaXNjcmltaW5hdGVkVW5pb24iLCJlcnJvciIsImlzcyIsIm1hcCIsImpvaW4iLCJpbnB1dCIsIk5vcm1hbFByb3BUeXBlcyIsIk5vcm1hbFByb3BTY2hlbWEiLCJBbGxQcm9wVHlwZXMiLCJFbnRpdHlQcm9wU2NoZW1hIiwiRW50aXR5SW5kZXhTY2hlbWEiLCJjb2x1bW5zIiwicGFyc2VyIiwiRW50aXR5SnNvblNjaGVtYSIsImRlc2NyaWJlIiwidGl0bGUiLCJ0YWJsZSIsInBhcmVudElkIiwicHJvcHMiLCJpbmRleGVzIiwic3Vic2V0cyIsInJlY29yZCIsImVudW1zIiwiVGVtcGxhdGVPcHRpb25zIiwiZW50aXR5Iiwib21pdCIsImV4dGVuZCIsImVudGl0eUlkIiwicGFydGlhbCIsImluaXRfdHlwZXMiLCJnZW5lcmF0ZWQiLCJnZW5lcmF0ZWRfc3NvIiwiZ2VuZXJhdGVkX2h0dHAiLCJtb2RlbCIsImRlZmF1bHRTZWFyY2hGaWVsZCIsImRlZmF1bHRPcmRlckJ5IiwibW9kZWxfdGVzdCIsImJyaWRnZSIsInNlcnZpY2UiLCJuYW1lc1JlY29yZCIsImZzIiwiZnNQbHVyYWwiLCJjYW1lbCIsImNhbWVsUGx1cmFsIiwiY2FwaXRhbCIsImNhcGl0YWxQbHVyYWwiLCJ1cHBlciIsImNvbnN0YW50IiwibW9kZWxUc1BhdGgiLCJ2aWV3X2xpc3QiLCJleHRyYSIsInVua25vd24iLCJ2aWV3X2xpc3RfY29sdW1ucyIsImxhYmVsIiwidGMiLCJjb2x1bW5JbXBvcnRzIiwidmlld19zZWFyY2hfaW5wdXQiLCJ2aWV3X2Zvcm0iLCJ2aWV3X2lkX2FsbF9zZWxlY3QiLCJ2aWV3X2lkX2FzeW5jX3NlbGVjdCIsInRleHRGaWVsZCIsInZpZXdfZW51bXNfc2VsZWN0IiwiZW51bUlkIiwidmlld19lbnVtc19kcm9wZG93biIsInZpZXdfZW51bXNfYnV0dG9uc2V0IiwiVGVtcGxhdGVLZXkiLCJHZW5lcmF0ZU9wdGlvbnMiLCJvdmVyd3JpdGUiLCJQ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
|