@veloceapps/sdk 12.0.0-13 → 12.0.0-15
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/cms/index.d.ts +921 -15
- package/core/index.d.ts +525 -8
- package/fesm2022/veloceapps-sdk-cms.mjs +2617 -0
- package/fesm2022/veloceapps-sdk-cms.mjs.map +1 -0
- package/{fesm2020 → fesm2022}/veloceapps-sdk-core.mjs +117 -112
- package/fesm2022/veloceapps-sdk-core.mjs.map +1 -0
- package/{fesm2020 → fesm2022}/veloceapps-sdk.mjs +170 -170
- package/fesm2022/veloceapps-sdk.mjs.map +1 -0
- package/index.d.ts +330 -1
- package/package.json +17 -34
- package/cms/cms.actions.d.ts +0 -154
- package/cms/cms.default.d.ts +0 -5
- package/cms/cms.elements.d.ts +0 -4
- package/cms/cms.layouts.d.ts +0 -4
- package/cms/components/element-children/element-children.component.d.ts +0 -22
- package/cms/components/element-children/element-children.module.d.ts +0 -11
- package/cms/components/element-drop-handle/element-drop-handle.component.d.ts +0 -12
- package/cms/components/element-drop-handle/element-drop-handle.module.d.ts +0 -9
- package/cms/components/element-renderer/element-renderer.component.d.ts +0 -29
- package/cms/components/element-renderer/element-renderer.module.d.ts +0 -7
- package/cms/components/element-tools-panel/element-tools-panel.component.d.ts +0 -14
- package/cms/components/element.component.d.ts +0 -17
- package/cms/components/index.d.ts +0 -1
- package/cms/components/plugin.component.d.ts +0 -15
- package/cms/components/preview/index.d.ts +0 -3
- package/cms/components/preview/preview.component.d.ts +0 -32
- package/cms/components/preview/preview.module.d.ts +0 -13
- package/cms/components/preview/preview.types.d.ts +0 -20
- package/cms/decorators/element.decorator.d.ts +0 -2
- package/cms/decorators/index.d.ts +0 -1
- package/cms/definitions/index.d.ts +0 -1
- package/cms/definitions/ui-builder.definitions.d.ts +0 -6
- package/cms/directives/custom-template.directive.d.ts +0 -17
- package/cms/engine/models/entity.d.ts +0 -11
- package/cms/engine/models/plugin.d.ts +0 -5
- package/cms/injection-tokens.d.ts +0 -9
- package/cms/launcher.module.d.ts +0 -12
- package/cms/modules/federated/default-options.d.ts +0 -4
- package/cms/modules/federated/export.d.ts +0 -1
- package/cms/modules/federated/federated-host.directive.d.ts +0 -8
- package/cms/modules/federated/federated.component.d.ts +0 -25
- package/cms/modules/federated/federated.module.d.ts +0 -10
- package/cms/modules/federated/federated.types.d.ts +0 -26
- package/cms/modules/migrations/index.d.ts +0 -2
- package/cms/modules/migrations/migrations.d.ts +0 -2
- package/cms/modules/migrations/migrations.module.d.ts +0 -6
- package/cms/modules/migrations/services/migrations.service.d.ts +0 -10
- package/cms/modules/migrations/types/migrations.types.d.ts +0 -2
- package/cms/modules/runtime/index.d.ts +0 -3
- package/cms/modules/runtime/runtime.module.d.ts +0 -8
- package/cms/modules/runtime/services/compilation.service.d.ts +0 -19
- package/cms/modules/runtime/services/runtime-editor.service.d.ts +0 -20
- package/cms/modules/runtime/services/runtime.service.d.ts +0 -33
- package/cms/modules/runtime/tokens.d.ts +0 -3
- package/cms/modules/runtime/types/compilation.types.d.ts +0 -8
- package/cms/modules/runtime/types/runtime.actions.d.ts +0 -12
- package/cms/plugins/element-hover.plugin.d.ts +0 -33
- package/cms/plugins/io.plugin.d.ts +0 -9
- package/cms/plugins/page.plugin.d.ts +0 -15
- package/cms/plugins/region.plugin.d.ts +0 -17
- package/cms/plugins/script.plugin.d.ts +0 -10
- package/cms/services/element-context.service.d.ts +0 -7
- package/cms/services/index.d.ts +0 -2
- package/cms/services/io-provider.service.d.ts +0 -15
- package/cms/services/resources.service.d.ts +0 -21
- package/cms/services/templates.service.d.ts +0 -14
- package/cms/types/common.types.d.ts +0 -130
- package/cms/types/elements.types.d.ts +0 -2
- package/cms/types/index.d.ts +0 -6
- package/cms/types/layouts.types.d.ts +0 -102
- package/cms/types/pages.types.d.ts +0 -1
- package/cms/types/path.types.d.ts +0 -11
- package/cms/utils/element-metadata-worker.d.ts +0 -11
- package/cms/utils/element.utils.d.ts +0 -20
- package/cms/utils/elements-resolver.d.ts +0 -28
- package/cms/utils/encoding.utils.d.ts +0 -2
- package/cms/utils/index.d.ts +0 -9
- package/cms/utils/inject.d.ts +0 -1
- package/cms/utils/path.utils.d.ts +0 -3
- package/cms/utils/script.utils.d.ts +0 -2
- package/cms/utils/transpilation-worker.d.ts +0 -13
- package/cms/utils/ui-builder-layout.utils.d.ts +0 -4
- package/cms/utils/ui-definition.utils.d.ts +0 -6
- package/cms/vendor-map.d.ts +0 -86
- package/core/core.module.d.ts +0 -10
- package/core/directives/directives.module.d.ts +0 -7
- package/core/directives/index.d.ts +0 -2
- package/core/directives/primeng-calendar.directive.d.ts +0 -14
- package/core/modules/configuration/configuration.module.d.ts +0 -8
- package/core/modules/configuration/index.d.ts +0 -6
- package/core/modules/configuration/services/configuration-runtime.service.d.ts +0 -19
- package/core/modules/configuration/services/configuration-state.service.d.ts +0 -60
- package/core/modules/configuration/services/configuration.service.d.ts +0 -38
- package/core/modules/configuration/services/guided-selling.service.d.ts +0 -15
- package/core/modules/configuration/services/test-mode-configuration.service.d.ts +0 -26
- package/core/modules/configuration/types/configuration-runtime.types.d.ts +0 -3
- package/core/modules/configuration/types/configuration.types.d.ts +0 -20
- package/core/modules/configuration/types/index.d.ts +0 -2
- package/core/modules/flow-configuration/flow-configuration.module.d.ts +0 -7
- package/core/modules/flow-configuration/index.d.ts +0 -1
- package/core/modules/flow-configuration/services/flow-configuration.service.d.ts +0 -23
- package/core/modules/index.d.ts +0 -2
- package/core/operators/filter-successful-execute.operator.d.ts +0 -3
- package/core/operators/index.d.ts +0 -1
- package/core/pipes/action-code.pipe.d.ts +0 -8
- package/core/pipes/date.pipe.d.ts +0 -13
- package/core/pipes/index.d.ts +0 -5
- package/core/pipes/number.pipe.d.ts +0 -10
- package/core/pipes/pipes.module.d.ts +0 -10
- package/core/pipes/price.pipe.d.ts +0 -10
- package/core/services/catalog-products.service.d.ts +0 -11
- package/core/services/flow-info.service.d.ts +0 -44
- package/core/services/flow-state-configuration.service.d.ts +0 -25
- package/core/services/flow-state.service.d.ts +0 -70
- package/core/services/index.d.ts +0 -8
- package/core/services/integration.state.d.ts +0 -16
- package/core/services/product-images.service.d.ts +0 -12
- package/core/services/runtime-settings.service.d.ts +0 -24
- package/core/services/sales-transaction.service.d.ts +0 -27
- package/core/types/flow-customization.types.d.ts +0 -10
- package/core/types/flow-state.types.d.ts +0 -12
- package/core/types/formatting-settings.types.d.ts +0 -13
- package/core/types/index.d.ts +0 -5
- package/core/types/integration.types.d.ts +0 -10
- package/core/types/pipe.types.d.ts +0 -1
- package/core/types/ui-definition.types.d.ts +0 -1
- package/core/utils/index.d.ts +0 -4
- package/core/utils/pcm.utils.d.ts +0 -5
- package/core/utils/transaction-item.utils.d.ts +0 -10
- package/core/utils/transaction-item.worker.d.ts +0 -8
- package/core/utils/ui-definition.utils.d.ts +0 -2
- package/esm2020/cms/cms.actions.mjs +0 -151
- package/esm2020/cms/cms.default.mjs +0 -5
- package/esm2020/cms/cms.elements.mjs +0 -52
- package/esm2020/cms/cms.layouts.mjs +0 -239
- package/esm2020/cms/components/element-children/element-children.component.mjs +0 -41
- package/esm2020/cms/components/element-children/element-children.module.mjs +0 -21
- package/esm2020/cms/components/element-drop-handle/element-drop-handle.component.mjs +0 -28
- package/esm2020/cms/components/element-drop-handle/element-drop-handle.module.mjs +0 -19
- package/esm2020/cms/components/element-renderer/element-renderer.component.mjs +0 -117
- package/esm2020/cms/components/element-renderer/element-renderer.module.mjs +0 -16
- package/esm2020/cms/components/element-tools-panel/element-tools-panel.component.mjs +0 -35
- package/esm2020/cms/components/element.component.mjs +0 -45
- package/esm2020/cms/components/index.mjs +0 -2
- package/esm2020/cms/components/plugin.component.mjs +0 -17
- package/esm2020/cms/components/preview/index.mjs +0 -4
- package/esm2020/cms/components/preview/preview.component.mjs +0 -75
- package/esm2020/cms/components/preview/preview.module.mjs +0 -42
- package/esm2020/cms/components/preview/preview.types.mjs +0 -2
- package/esm2020/cms/decorators/element.decorator.mjs +0 -6
- package/esm2020/cms/decorators/index.mjs +0 -2
- package/esm2020/cms/definitions/index.mjs +0 -2
- package/esm2020/cms/definitions/ui-builder.definitions.mjs +0 -18
- package/esm2020/cms/directives/custom-template.directive.mjs +0 -38
- package/esm2020/cms/engine/models/entity.mjs +0 -17
- package/esm2020/cms/engine/models/plugin.mjs +0 -6
- package/esm2020/cms/index.mjs +0 -16
- package/esm2020/cms/injection-tokens.mjs +0 -7
- package/esm2020/cms/launcher.module.mjs +0 -24
- package/esm2020/cms/modules/federated/default-options.mjs +0 -5
- package/esm2020/cms/modules/federated/export.mjs +0 -2
- package/esm2020/cms/modules/federated/federated-host.directive.mjs +0 -16
- package/esm2020/cms/modules/federated/federated.component.mjs +0 -74
- package/esm2020/cms/modules/federated/federated.module.mjs +0 -20
- package/esm2020/cms/modules/federated/federated.types.mjs +0 -2
- package/esm2020/cms/modules/migrations/index.mjs +0 -3
- package/esm2020/cms/modules/migrations/migrations.mjs +0 -22
- package/esm2020/cms/modules/migrations/migrations.module.mjs +0 -15
- package/esm2020/cms/modules/migrations/services/migrations.service.mjs +0 -47
- package/esm2020/cms/modules/migrations/types/migrations.types.mjs +0 -2
- package/esm2020/cms/modules/runtime/index.mjs +0 -4
- package/esm2020/cms/modules/runtime/runtime.module.mjs +0 -32
- package/esm2020/cms/modules/runtime/services/compilation.service.mjs +0 -93
- package/esm2020/cms/modules/runtime/services/runtime-editor.service.mjs +0 -30
- package/esm2020/cms/modules/runtime/services/runtime.service.mjs +0 -117
- package/esm2020/cms/modules/runtime/tokens.mjs +0 -3
- package/esm2020/cms/modules/runtime/types/compilation.types.mjs +0 -2
- package/esm2020/cms/modules/runtime/types/runtime.actions.mjs +0 -2
- package/esm2020/cms/plugins/element-hover.plugin.mjs +0 -121
- package/esm2020/cms/plugins/io.plugin.mjs +0 -45
- package/esm2020/cms/plugins/page.plugin.mjs +0 -37
- package/esm2020/cms/plugins/region.plugin.mjs +0 -59
- package/esm2020/cms/plugins/script.plugin.mjs +0 -31
- package/esm2020/cms/services/element-context.service.mjs +0 -10
- package/esm2020/cms/services/index.mjs +0 -3
- package/esm2020/cms/services/io-provider.service.mjs +0 -53
- package/esm2020/cms/services/resources.service.mjs +0 -71
- package/esm2020/cms/services/templates.service.mjs +0 -32
- package/esm2020/cms/types/common.types.mjs +0 -2
- package/esm2020/cms/types/elements.types.mjs +0 -2
- package/esm2020/cms/types/index.mjs +0 -7
- package/esm2020/cms/types/layouts.types.mjs +0 -71
- package/esm2020/cms/types/pages.types.mjs +0 -2
- package/esm2020/cms/types/path.types.mjs +0 -2
- package/esm2020/cms/utils/element-metadata-worker.mjs +0 -31
- package/esm2020/cms/utils/element.utils.mjs +0 -182
- package/esm2020/cms/utils/elements-resolver.mjs +0 -206
- package/esm2020/cms/utils/encoding.utils.mjs +0 -29
- package/esm2020/cms/utils/index.mjs +0 -10
- package/esm2020/cms/utils/inject.mjs +0 -27
- package/esm2020/cms/utils/path.utils.mjs +0 -44
- package/esm2020/cms/utils/script.utils.mjs +0 -46
- package/esm2020/cms/utils/transpilation-worker.mjs +0 -52
- package/esm2020/cms/utils/ui-builder-layout.utils.mjs +0 -46
- package/esm2020/cms/utils/ui-definition.utils.mjs +0 -85
- package/esm2020/cms/veloceapps-sdk-cms.mjs +0 -5
- package/esm2020/cms/vendor-map.mjs +0 -83
- package/esm2020/core/core.module.mjs +0 -54
- package/esm2020/core/directives/directives.module.mjs +0 -16
- package/esm2020/core/directives/index.mjs +0 -3
- package/esm2020/core/directives/primeng-calendar.directive.mjs +0 -41
- package/esm2020/core/index.mjs +0 -9
- package/esm2020/core/modules/configuration/configuration.module.mjs +0 -34
- package/esm2020/core/modules/configuration/index.mjs +0 -7
- package/esm2020/core/modules/configuration/services/configuration-runtime.service.mjs +0 -38
- package/esm2020/core/modules/configuration/services/configuration-state.service.mjs +0 -381
- package/esm2020/core/modules/configuration/services/configuration.service.mjs +0 -172
- package/esm2020/core/modules/configuration/services/guided-selling.service.mjs +0 -62
- package/esm2020/core/modules/configuration/services/test-mode-configuration.service.mjs +0 -97
- package/esm2020/core/modules/configuration/types/configuration-runtime.types.mjs +0 -2
- package/esm2020/core/modules/configuration/types/configuration.types.mjs +0 -2
- package/esm2020/core/modules/configuration/types/index.mjs +0 -3
- package/esm2020/core/modules/flow-configuration/flow-configuration.module.mjs +0 -17
- package/esm2020/core/modules/flow-configuration/index.mjs +0 -2
- package/esm2020/core/modules/flow-configuration/services/flow-configuration.service.mjs +0 -80
- package/esm2020/core/modules/index.mjs +0 -3
- package/esm2020/core/operators/filter-successful-execute.operator.mjs +0 -5
- package/esm2020/core/operators/index.mjs +0 -2
- package/esm2020/core/pipes/action-code.pipe.mjs +0 -20
- package/esm2020/core/pipes/date.pipe.mjs +0 -44
- package/esm2020/core/pipes/index.mjs +0 -6
- package/esm2020/core/pipes/number.pipe.mjs +0 -27
- package/esm2020/core/pipes/pipes.module.mjs +0 -19
- package/esm2020/core/pipes/price.pipe.mjs +0 -30
- package/esm2020/core/services/catalog-products.service.mjs +0 -25
- package/esm2020/core/services/flow-info.service.mjs +0 -146
- package/esm2020/core/services/flow-state-configuration.service.mjs +0 -120
- package/esm2020/core/services/flow-state.service.mjs +0 -417
- package/esm2020/core/services/index.mjs +0 -9
- package/esm2020/core/services/integration.state.mjs +0 -36
- package/esm2020/core/services/product-images.service.mjs +0 -30
- package/esm2020/core/services/runtime-settings.service.mjs +0 -112
- package/esm2020/core/services/sales-transaction.service.mjs +0 -67
- package/esm2020/core/types/flow-customization.types.mjs +0 -3
- package/esm2020/core/types/flow-state.types.mjs +0 -2
- package/esm2020/core/types/formatting-settings.types.mjs +0 -3
- package/esm2020/core/types/index.mjs +0 -6
- package/esm2020/core/types/integration.types.mjs +0 -2
- package/esm2020/core/types/pipe.types.mjs +0 -2
- package/esm2020/core/types/ui-definition.types.mjs +0 -2
- package/esm2020/core/utils/index.mjs +0 -5
- package/esm2020/core/utils/pcm.utils.mjs +0 -15
- package/esm2020/core/utils/transaction-item.utils.mjs +0 -144
- package/esm2020/core/utils/transaction-item.worker.mjs +0 -16
- package/esm2020/core/utils/ui-definition.utils.mjs +0 -9
- package/esm2020/core/veloceapps-sdk-core.mjs +0 -5
- package/esm2020/index.mjs +0 -2
- package/esm2020/src/components/dialog/dialog.component.mjs +0 -36
- package/esm2020/src/components/dialog/dialog.module.mjs +0 -19
- package/esm2020/src/components/dialog/dialog.types.mjs +0 -2
- package/esm2020/src/components/flow-header/flow-header.component.mjs +0 -107
- package/esm2020/src/components/flow-header/flow-header.module.mjs +0 -19
- package/esm2020/src/components/flow-header/index.mjs +0 -2
- package/esm2020/src/components/guided-selling/guided-selling.component.mjs +0 -107
- package/esm2020/src/components/guided-selling/guided-selling.module.mjs +0 -19
- package/esm2020/src/configure-primeng.mjs +0 -33
- package/esm2020/src/constants.mjs +0 -2
- package/esm2020/src/flow-routing.module.mjs +0 -97
- package/esm2020/src/flow.component.mjs +0 -39
- package/esm2020/src/flow.module.mjs +0 -60
- package/esm2020/src/guards/flow.guard.mjs +0 -35
- package/esm2020/src/guards/product-unload.guard.mjs +0 -49
- package/esm2020/src/guards/root.guard.mjs +0 -46
- package/esm2020/src/index.mjs +0 -5
- package/esm2020/src/pages/assets/assets.component.mjs +0 -106
- package/esm2020/src/pages/assets/assets.module.mjs +0 -20
- package/esm2020/src/pages/catalog/catalog.component.mjs +0 -106
- package/esm2020/src/pages/catalog/catalog.module.mjs +0 -20
- package/esm2020/src/pages/debug/debug.component.mjs +0 -49
- package/esm2020/src/pages/debug/debug.module.mjs +0 -46
- package/esm2020/src/pages/product/product.component.mjs +0 -55
- package/esm2020/src/pages/product/product.module.mjs +0 -20
- package/esm2020/src/pages/record-not-found/record-not-found.component.mjs +0 -27
- package/esm2020/src/pages/record-not-found/record-not-found.module.mjs +0 -20
- package/esm2020/src/pages/shopping-cart/shopping-cart.component.mjs +0 -106
- package/esm2020/src/pages/shopping-cart/shopping-cart.module.mjs +0 -20
- package/esm2020/src/resolvers/flow.resolver.mjs +0 -50
- package/esm2020/src/resolvers/pcm-model.resolver.mjs +0 -12
- package/esm2020/src/resolvers/sales-transaction.resolver.mjs +0 -64
- package/esm2020/src/resolvers/ui-definition.resolver.mjs +0 -44
- package/esm2020/src/services/flow-dialog.service.mjs +0 -91
- package/esm2020/src/services/flow-router.service.mjs +0 -173
- package/esm2020/src/services/flow.service.mjs +0 -102
- package/esm2020/src/services/guided-selling.service.mjs +0 -34
- package/esm2020/src/services/index.mjs +0 -4
- package/esm2020/src/types/index.mjs +0 -2
- package/esm2020/src/types/route.types.mjs +0 -2
- package/esm2020/veloceapps-sdk.mjs +0 -5
- package/fesm2015/veloceapps-sdk-cms.mjs +0 -2514
- package/fesm2015/veloceapps-sdk-cms.mjs.map +0 -1
- package/fesm2015/veloceapps-sdk-core.mjs +0 -2104
- package/fesm2015/veloceapps-sdk-core.mjs.map +0 -1
- package/fesm2015/veloceapps-sdk.mjs +0 -1598
- package/fesm2015/veloceapps-sdk.mjs.map +0 -1
- package/fesm2020/veloceapps-sdk-cms.mjs +0 -2613
- package/fesm2020/veloceapps-sdk-cms.mjs.map +0 -1
- package/fesm2020/veloceapps-sdk-core.mjs.map +0 -1
- package/fesm2020/veloceapps-sdk.mjs.map +0 -1
- package/src/components/dialog/dialog.component.d.ts +0 -13
- package/src/components/dialog/dialog.module.d.ts +0 -9
- package/src/components/dialog/dialog.types.d.ts +0 -7
- package/src/components/flow-header/flow-header.component.d.ts +0 -25
- package/src/components/flow-header/flow-header.module.d.ts +0 -9
- package/src/components/flow-header/index.d.ts +0 -1
- package/src/components/guided-selling/guided-selling.component.d.ts +0 -25
- package/src/components/guided-selling/guided-selling.module.d.ts +0 -9
- package/src/configure-primeng.d.ts +0 -1
- package/src/constants.d.ts +0 -1
- package/src/flow-routing.module.d.ts +0 -11
- package/src/flow.component.d.ts +0 -21
- package/src/flow.module.d.ts +0 -16
- package/src/guards/flow.guard.d.ts +0 -2
- package/src/guards/product-unload.guard.d.ts +0 -16
- package/src/guards/root.guard.d.ts +0 -14
- package/src/index.d.ts +0 -4
- package/src/pages/assets/assets.component.d.ts +0 -31
- package/src/pages/assets/assets.module.d.ts +0 -10
- package/src/pages/catalog/catalog.component.d.ts +0 -31
- package/src/pages/catalog/catalog.module.d.ts +0 -10
- package/src/pages/debug/debug.component.d.ts +0 -21
- package/src/pages/debug/debug.module.d.ts +0 -14
- package/src/pages/product/product.component.d.ts +0 -24
- package/src/pages/product/product.module.d.ts +0 -10
- package/src/pages/record-not-found/record-not-found.component.d.ts +0 -12
- package/src/pages/record-not-found/record-not-found.module.d.ts +0 -9
- package/src/pages/shopping-cart/shopping-cart.component.d.ts +0 -31
- package/src/pages/shopping-cart/shopping-cart.module.d.ts +0 -10
- package/src/resolvers/flow.resolver.d.ts +0 -14
- package/src/resolvers/pcm-model.resolver.d.ts +0 -3
- package/src/resolvers/sales-transaction.resolver.d.ts +0 -18
- package/src/resolvers/ui-definition.resolver.d.ts +0 -3
- package/src/services/flow-dialog.service.d.ts +0 -23
- package/src/services/flow-router.service.d.ts +0 -42
- package/src/services/flow.service.d.ts +0 -21
- package/src/services/guided-selling.service.d.ts +0 -13
- package/src/services/index.d.ts +0 -3
- package/src/types/index.d.ts +0 -1
- package/src/types/route.types.d.ts +0 -4
@@ -1,417 +0,0 @@
|
|
1
|
-
import { Inject, Injectable, Optional } from '@angular/core';
|
2
|
-
import { FlowStateApiService } from '@veloceapps/api';
|
3
|
-
import { ConfigurationProcessorsApiService, SalesTransactionApiService, } from '@veloceapps/api/v2';
|
4
|
-
import { ToastService, ToastType } from '@veloceapps/components';
|
5
|
-
import { ConfigurationProcessorTypes, EntityUtil, isDefined, UUID, } from '@veloceapps/core';
|
6
|
-
import { assign, cloneDeep, flatten, isEqual } from 'lodash';
|
7
|
-
import { BehaviorSubject, buffer, catchError, combineLatest, debounceTime, filter, finalize, forkJoin, map, noop, of, share, Subject, switchMap, take, tap, throwError, } from 'rxjs';
|
8
|
-
import { FlowConfigurationService } from '../modules';
|
9
|
-
import { FLOW_CUSTOMIZATION } from '../types/flow-customization.types';
|
10
|
-
import { FlowInfoService } from './flow-info.service';
|
11
|
-
import { SalesTransactionService } from './sales-transaction.service';
|
12
|
-
import * as i0 from "@angular/core";
|
13
|
-
import * as i1 from "../modules";
|
14
|
-
import * as i2 from "./flow-info.service";
|
15
|
-
import * as i3 from "@veloceapps/api";
|
16
|
-
import * as i4 from "@veloceapps/api/v2";
|
17
|
-
import * as i5 from "./sales-transaction.service";
|
18
|
-
import * as i6 from "@veloceapps/components";
|
19
|
-
export class FlowStateService {
|
20
|
-
constructor(flowConfiguration, flowInfoService, flowStateApiService, processorsApiService, salesTransactionApiService, salesTransactionService, toastService, customizationService) {
|
21
|
-
this.flowConfiguration = flowConfiguration;
|
22
|
-
this.flowInfoService = flowInfoService;
|
23
|
-
this.flowStateApiService = flowStateApiService;
|
24
|
-
this.processorsApiService = processorsApiService;
|
25
|
-
this.salesTransactionApiService = salesTransactionApiService;
|
26
|
-
this.salesTransactionService = salesTransactionService;
|
27
|
-
this.toastService = toastService;
|
28
|
-
this.customizationService = customizationService;
|
29
|
-
this.NOT_INITIALIZED = Symbol();
|
30
|
-
this.EXECUTION_BUFFER_TIME = 100;
|
31
|
-
this.executedFunctions = {};
|
32
|
-
this.stateId$ = new BehaviorSubject(null);
|
33
|
-
this.initialStatefulData = {};
|
34
|
-
this.trackedStatefulChangesMap = new Map();
|
35
|
-
this.processors = {};
|
36
|
-
this.subscriptions = {};
|
37
|
-
this.flowStore = {};
|
38
|
-
this.executionInProgress$ = new BehaviorSubject(false);
|
39
|
-
this.statefulRequestStream$ = new Subject();
|
40
|
-
this.cleanup$ = new Subject();
|
41
|
-
this.statefulExecutionRequest$ = this.initBufferedRequest$();
|
42
|
-
/*
|
43
|
-
In stateless mode watch State changes and call executeRequest so that
|
44
|
-
all subscriptions get their updates according to updated State
|
45
|
-
*/
|
46
|
-
this.isInitialized$()
|
47
|
-
.pipe(filter(Boolean), filter(() => !this.flowInfoService.flow.properties.stateful), switchMap(() => this.flowConfiguration.updated$), switchMap(() => this.executeRequest$({}, true)))
|
48
|
-
.subscribe();
|
49
|
-
}
|
50
|
-
init$() {
|
51
|
-
if (this.flowInfoService.flow.properties.stateful) {
|
52
|
-
return this.initProcessors$().pipe(switchMap(() => this.initStateful$()));
|
53
|
-
}
|
54
|
-
else {
|
55
|
-
return forkJoin([this.initStateless$(), this.initProcessors$()]).pipe(map(noop));
|
56
|
-
}
|
57
|
-
}
|
58
|
-
reset() {
|
59
|
-
Object.values(this.subscriptions).forEach(({ data$ }) => data$.complete());
|
60
|
-
this.subscriptions = {};
|
61
|
-
if (this.stateId$.value) {
|
62
|
-
this.flowStateApiService.cancel(this.stateId$.value).subscribe();
|
63
|
-
this.stateId$.next(null);
|
64
|
-
}
|
65
|
-
this.processors = {};
|
66
|
-
this.flowStore = {};
|
67
|
-
this.cleanup$.next();
|
68
|
-
}
|
69
|
-
get hasUnsavedChanges() {
|
70
|
-
return this.flowInfoService.flow.properties.stateful
|
71
|
-
? Array.from(this.trackedStatefulChangesMap.values()).some(Boolean)
|
72
|
-
: this.salesTransactionService.hasUnsavedChanges;
|
73
|
-
}
|
74
|
-
get stateId() {
|
75
|
-
return this.stateId$.value;
|
76
|
-
}
|
77
|
-
get isExecutionInProgress$() {
|
78
|
-
return this.executionInProgress$.asObservable();
|
79
|
-
}
|
80
|
-
isInitialized$() {
|
81
|
-
return combineLatest([this.stateId$, this.salesTransactionService.isInitialized$]).pipe(map(values => values.some(Boolean)));
|
82
|
-
}
|
83
|
-
isInitialized() {
|
84
|
-
return Boolean(this.stateId$.value) || this.salesTransactionService.isInitialized;
|
85
|
-
}
|
86
|
-
execute$(scope, exec) {
|
87
|
-
const request = this.execToRequest(scope, exec);
|
88
|
-
return this.executeRequest$(request).pipe(map(result => {
|
89
|
-
// Keep only requested results
|
90
|
-
const actualSelectors = Object.entries(result.selectors).reduce((trunk, [requestId, result]) => {
|
91
|
-
if (exec.selectors?.[requestId]) {
|
92
|
-
trunk[requestId] = result;
|
93
|
-
}
|
94
|
-
return trunk;
|
95
|
-
}, {});
|
96
|
-
return actualSelectors;
|
97
|
-
}));
|
98
|
-
}
|
99
|
-
dispatch$(scope, action, inputData) {
|
100
|
-
const exec = {
|
101
|
-
actions: [{ name: action, inputData }],
|
102
|
-
};
|
103
|
-
const request = this.execToRequest(scope, exec);
|
104
|
-
return this.executeRequest$(request).pipe(map(noop));
|
105
|
-
}
|
106
|
-
select$(scope, selectorName, inputData) {
|
107
|
-
const requestId = this.generateRequestId(scope, selectorName, inputData);
|
108
|
-
const request = this.execToRequest(scope, {
|
109
|
-
selectors: {
|
110
|
-
[requestId]: {
|
111
|
-
name: selectorName,
|
112
|
-
inputData,
|
113
|
-
},
|
114
|
-
},
|
115
|
-
});
|
116
|
-
return this.executeRequest$(request).pipe(map(response => response.selectors[requestId]));
|
117
|
-
}
|
118
|
-
subscribe$(scope, selectorName, inputData, options) {
|
119
|
-
const requestId = this.generateRequestId(scope, selectorName, inputData);
|
120
|
-
let subscription = this.subscriptions[requestId];
|
121
|
-
if (!subscription) {
|
122
|
-
const request = this.execToRequest(scope, {
|
123
|
-
selectors: {
|
124
|
-
[requestId]: {
|
125
|
-
name: selectorName,
|
126
|
-
inputData,
|
127
|
-
},
|
128
|
-
},
|
129
|
-
});
|
130
|
-
subscription = {
|
131
|
-
request,
|
132
|
-
data$: new BehaviorSubject(this.NOT_INITIALIZED),
|
133
|
-
};
|
134
|
-
this.subscriptions[requestId] = subscription;
|
135
|
-
if (options?.trackedChanges) {
|
136
|
-
this.trackedStatefulChangesMap.set(requestId, false);
|
137
|
-
}
|
138
|
-
if (!options?.cold) {
|
139
|
-
this.executeRequest$(request).subscribe();
|
140
|
-
}
|
141
|
-
}
|
142
|
-
return subscription.data$.pipe(filter(data => data != this.NOT_INITIALIZED), map(data => data), finalize(() => {
|
143
|
-
if (!this.subscriptions[requestId]?.data$.observed) {
|
144
|
-
delete this.subscriptions[requestId];
|
145
|
-
}
|
146
|
-
}));
|
147
|
-
}
|
148
|
-
save$() {
|
149
|
-
if (this.flowInfoService.flow.properties.stateful) {
|
150
|
-
if (this.stateId$.value) {
|
151
|
-
return this.flowStateApiService.save(this.stateId$.value).pipe(map(({ quoteId }) => ({ id: quoteId })), tap(() => {
|
152
|
-
Array.from(this.trackedStatefulChangesMap.keys()).forEach(key => {
|
153
|
-
this.trackedStatefulChangesMap.set(key, false);
|
154
|
-
});
|
155
|
-
}));
|
156
|
-
}
|
157
|
-
}
|
158
|
-
else {
|
159
|
-
const state = this.salesTransactionService.state;
|
160
|
-
if (state) {
|
161
|
-
const request = {
|
162
|
-
transactionContext: state,
|
163
|
-
flowId: this.flowInfoService.flow.id,
|
164
|
-
};
|
165
|
-
return this.salesTransactionApiService.save(request).pipe(map(id => ({ id })));
|
166
|
-
}
|
167
|
-
}
|
168
|
-
return of({ id: '' });
|
169
|
-
}
|
170
|
-
getFlowStore() {
|
171
|
-
return this.flowStore;
|
172
|
-
}
|
173
|
-
getOwnerIdByScope(scope) {
|
174
|
-
const ownerId = this.flowInfoService.templates[scope]?.id;
|
175
|
-
if (!ownerId) {
|
176
|
-
throw `OwnerId is not found for scope ${scope}`;
|
177
|
-
}
|
178
|
-
return ownerId;
|
179
|
-
}
|
180
|
-
getScopeByOwnerId(id) {
|
181
|
-
for (const template of Object.values(this.flowInfoService.templates)) {
|
182
|
-
if (template.id === id) {
|
183
|
-
return template.type;
|
184
|
-
}
|
185
|
-
}
|
186
|
-
return;
|
187
|
-
}
|
188
|
-
execToRequest(scope, exec) {
|
189
|
-
const ownerId = this.getOwnerIdByScope(scope);
|
190
|
-
return {
|
191
|
-
actions: exec.actions?.map(action => ({ apiName: action.name, ownerId, inputData: action.inputData ?? {} })),
|
192
|
-
selectors: exec.selectors &&
|
193
|
-
Object.entries(exec.selectors).reduce((trunk, [key, selector]) => ({
|
194
|
-
...trunk,
|
195
|
-
[key]: { apiName: selector.name, ownerId, inputData: selector.inputData ?? {} },
|
196
|
-
}), {}),
|
197
|
-
};
|
198
|
-
}
|
199
|
-
executeRequest$(request, forceSubscriptions = false) {
|
200
|
-
const fullRequest = cloneDeep(request);
|
201
|
-
if (fullRequest.actions?.length || forceSubscriptions) {
|
202
|
-
for (const subscription of Object.values(this.subscriptions)) {
|
203
|
-
fullRequest.selectors = assign(fullRequest.selectors, subscription.request.selectors);
|
204
|
-
}
|
205
|
-
}
|
206
|
-
const execution$ = this.flowInfoService.flow.properties.stateful
|
207
|
-
? this.executeStateful$(fullRequest)
|
208
|
-
: this.executeStateless$(fullRequest);
|
209
|
-
return execution$.pipe(tap(result => this.handleSelectorsResponse(result.selectors)));
|
210
|
-
}
|
211
|
-
handleSelectorsResponse(selectors) {
|
212
|
-
Object.entries(selectors).forEach(([requestId, selectorResult]) => {
|
213
|
-
if (!selectorResult.success) {
|
214
|
-
this.toastService.add({ severity: ToastType.error, summary: selectorResult.errorMessage });
|
215
|
-
}
|
216
|
-
const subscription$ = this.subscriptions[requestId]?.data$;
|
217
|
-
if (subscription$ && subscription$.value !== selectorResult) {
|
218
|
-
this.checkStatefulChanges(requestId, selectorResult);
|
219
|
-
subscription$.next(selectorResult);
|
220
|
-
}
|
221
|
-
});
|
222
|
-
}
|
223
|
-
initStateful$() {
|
224
|
-
const processorsList = flatten(Object.values(this.processors).map(ownerMap => Object.values(ownerMap ?? {})));
|
225
|
-
const processors = processorsList.length ? processorsList : undefined;
|
226
|
-
const selectors = Object.values(this.subscriptions)
|
227
|
-
.map(({ request }) => request.selectors)
|
228
|
-
.filter(isDefined)
|
229
|
-
.reduce((trunk, selectors) => ({ ...trunk, ...selectors }), {});
|
230
|
-
return this.flowStateApiService
|
231
|
-
.init({
|
232
|
-
quoteId: this.flowInfoService.context.headerId,
|
233
|
-
params: this.flowInfoService.context,
|
234
|
-
actionsOverride: processors?.filter(processor => processor.type === ConfigurationProcessorTypes.ACTION),
|
235
|
-
selectorsOverride: processors?.filter(processor => processor.type === ConfigurationProcessorTypes.SELECTOR),
|
236
|
-
selectors: selectors,
|
237
|
-
})
|
238
|
-
.pipe(map(({ stateId, selectors }) => {
|
239
|
-
this.handleSelectorsResponse(selectors);
|
240
|
-
this.stateId$.next(stateId);
|
241
|
-
}));
|
242
|
-
}
|
243
|
-
initBufferedRequest$() {
|
244
|
-
return this.statefulRequestStream$.pipe(buffer(this.statefulRequestStream$.pipe(debounceTime(this.EXECUTION_BUFFER_TIME))), switchMap(requests => {
|
245
|
-
if (!this.stateId$.value) {
|
246
|
-
throw 'Stateful session is not initialized';
|
247
|
-
}
|
248
|
-
// merge buffered requests
|
249
|
-
const request = {
|
250
|
-
actions: requests.flatMap(({ actions }) => actions).filter(isDefined),
|
251
|
-
selectors: requests
|
252
|
-
.map(({ selectors }) => selectors)
|
253
|
-
.filter(isDefined)
|
254
|
-
.reduce((acc, selectorsMap) => Object.assign(acc, selectorsMap), {}),
|
255
|
-
};
|
256
|
-
this.executionInProgress$.next(true);
|
257
|
-
return this.flowStateApiService.execute(this.stateId$.value, request);
|
258
|
-
}), tap(({ stateId }) => this.stateId$.next(stateId)), share(), tap(() => this.executionInProgress$.next(false)), catchError(e => {
|
259
|
-
this.executionInProgress$.next(false);
|
260
|
-
return throwError(() => e);
|
261
|
-
}));
|
262
|
-
}
|
263
|
-
executeStateful$(request) {
|
264
|
-
return this.executionInProgress$.pipe(filter(inProgress => !inProgress), take(1), switchMap(() =>
|
265
|
-
// make sure stream switches to statefulExecutionRequest$ before pushing an execution request
|
266
|
-
combineLatest([
|
267
|
-
this.statefulExecutionRequest$,
|
268
|
-
of(undefined).pipe(tap(() => this.statefulRequestStream$.next(request))),
|
269
|
-
])), map(([response]) => response), take(1));
|
270
|
-
}
|
271
|
-
initStateless$() {
|
272
|
-
return this.salesTransactionService.init(this.flowInfoService.context.headerId, this.flowInfoService.context).pipe(switchMap(state => this.flowConfiguration.calculate$(state)), tap(() => this.salesTransactionService.finalizeInit()), map(noop));
|
273
|
-
}
|
274
|
-
executeStateless$(request) {
|
275
|
-
this.executionInProgress$.next(true);
|
276
|
-
return of(undefined).pipe(tap(() => this.executeStatelessActions(request)), switchMap(() => {
|
277
|
-
/*
|
278
|
-
Skip price calculation in case
|
279
|
-
1. No actions in the request
|
280
|
-
2. Initialization process execution (state not initialized yet)
|
281
|
-
*/
|
282
|
-
const { state } = this.salesTransactionService;
|
283
|
-
if (!state || !request.actions?.length || !this.isInitialized()) {
|
284
|
-
return of(undefined);
|
285
|
-
}
|
286
|
-
else {
|
287
|
-
return this.flowConfiguration.calculate$(state);
|
288
|
-
}
|
289
|
-
}), map(() => this.executeStatelessSelectors(request)), tap(() => this.executionInProgress$.next(false)), catchError(e => {
|
290
|
-
this.executionInProgress$.next(false);
|
291
|
-
return throwError(() => e);
|
292
|
-
}));
|
293
|
-
}
|
294
|
-
executeStatelessActions(request) {
|
295
|
-
const state = this.salesTransactionService.state;
|
296
|
-
if (!state || !request.actions?.length) {
|
297
|
-
return;
|
298
|
-
}
|
299
|
-
let flowState = state;
|
300
|
-
request.actions.forEach(action => {
|
301
|
-
try {
|
302
|
-
flowState = this.executeActionScript(flowState, action) ?? flowState;
|
303
|
-
}
|
304
|
-
catch (e) {
|
305
|
-
console.error(e);
|
306
|
-
this.toastService.add({ severity: ToastType.error, summary: String(e) });
|
307
|
-
throw e;
|
308
|
-
}
|
309
|
-
});
|
310
|
-
this.salesTransactionService.setState(flowState);
|
311
|
-
}
|
312
|
-
executeStatelessSelectors(request) {
|
313
|
-
if (!this.salesTransactionService.state) {
|
314
|
-
throw 'State is not initialized';
|
315
|
-
}
|
316
|
-
const flowState = this.salesTransactionService.state;
|
317
|
-
return EntityUtil.entries(request.selectors ?? {}).reduce((result, [key, selector]) => {
|
318
|
-
try {
|
319
|
-
result.selectors[key] = {
|
320
|
-
success: true,
|
321
|
-
result: this.executeSelectorScript(flowState, selector),
|
322
|
-
};
|
323
|
-
}
|
324
|
-
catch (e) {
|
325
|
-
console.error(e);
|
326
|
-
result.selectors[key] = {
|
327
|
-
success: false,
|
328
|
-
errorMessage: String(e),
|
329
|
-
};
|
330
|
-
}
|
331
|
-
return result;
|
332
|
-
}, { stateId: '', selectors: {} });
|
333
|
-
}
|
334
|
-
initProcessors$() {
|
335
|
-
const hasOverrides = Boolean(this.customizationService?.getTemplateConfigurationProcessors);
|
336
|
-
if (this.flowInfoService.flow.properties.stateful && !hasOverrides) {
|
337
|
-
// Skip initialization as backend will take processors from SF
|
338
|
-
return of(undefined);
|
339
|
-
}
|
340
|
-
const owners$ = Object.values(this.flowInfoService.templates)
|
341
|
-
.map(template => {
|
342
|
-
if (!template) {
|
343
|
-
return;
|
344
|
-
}
|
345
|
-
const localProcessors$ = this.customizationService?.getTemplateConfigurationProcessors?.(template.name) ?? of(null);
|
346
|
-
return localProcessors$.pipe(switchMap(processors => processors ? of(processors) : this.processorsApiService.fetchConfigurationProcessors$(template.id)), tap(processors => {
|
347
|
-
const processorsMap = processors.reduce((acc, p) => {
|
348
|
-
acc[p.apiName] = p;
|
349
|
-
return acc;
|
350
|
-
}, {});
|
351
|
-
this.processors[template.id] = processorsMap;
|
352
|
-
}));
|
353
|
-
})
|
354
|
-
.filter(isDefined);
|
355
|
-
if (!owners$.length) {
|
356
|
-
return of(undefined);
|
357
|
-
}
|
358
|
-
return forkJoin(owners$).pipe(map(noop));
|
359
|
-
}
|
360
|
-
executeActionScript(request, executable) {
|
361
|
-
const configurationProcessor = this.processors[executable.ownerId]?.[executable.apiName];
|
362
|
-
if (!configurationProcessor?.script) {
|
363
|
-
const scope = this.getScopeByOwnerId(executable.ownerId);
|
364
|
-
const scopeText = scope ? ` in ${scope}` : '';
|
365
|
-
throw `ConfigurationProcessor ${executable.apiName}${scopeText} not found`;
|
366
|
-
}
|
367
|
-
return this.executeProcessorScript(request, configurationProcessor, executable.inputData);
|
368
|
-
}
|
369
|
-
executeSelectorScript(request, executable) {
|
370
|
-
const configurationProcessor = this.processors[executable.ownerId]?.[executable.apiName];
|
371
|
-
if (!configurationProcessor?.script) {
|
372
|
-
const scope = this.getScopeByOwnerId(executable.ownerId);
|
373
|
-
const scopeText = scope ? ` in ${scope}` : '';
|
374
|
-
throw `ConfigurationProcessor ${executable.apiName}${scopeText} not found`;
|
375
|
-
}
|
376
|
-
return this.executeProcessorScript(request, configurationProcessor, executable.inputData);
|
377
|
-
}
|
378
|
-
executeProcessorScript(request, configurationProcessor, inputData) {
|
379
|
-
const scope = this.getScopeByOwnerId(configurationProcessor.ownerId ?? '');
|
380
|
-
let functionToExecute = this.executedFunctions[scope + configurationProcessor.apiName];
|
381
|
-
if (!functionToExecute) {
|
382
|
-
const script = `${configurationProcessor.script}\nreturn transform;`;
|
383
|
-
const sourceMap = `\n//# sourceURL=${scope ? scope + '/' : ''}${configurationProcessor.apiName}.js`;
|
384
|
-
functionToExecute = new Function(script + sourceMap)();
|
385
|
-
this.executedFunctions[scope + configurationProcessor.apiName] = functionToExecute;
|
386
|
-
}
|
387
|
-
return functionToExecute({
|
388
|
-
request,
|
389
|
-
inputData,
|
390
|
-
flowStore: this.flowStore,
|
391
|
-
});
|
392
|
-
}
|
393
|
-
generateRequestId(scope, selectorName, inputData) {
|
394
|
-
const inputDataHash = UUID.hex(JSON.stringify(inputData) || '').slice(0, 8);
|
395
|
-
return `${scope}/${selectorName}/${inputDataHash}`;
|
396
|
-
}
|
397
|
-
checkStatefulChanges(requestId, selectorResult) {
|
398
|
-
if (this.trackedStatefulChangesMap.has(requestId)) {
|
399
|
-
if (!this.initialStatefulData[requestId]) {
|
400
|
-
this.initialStatefulData[requestId] = selectorResult;
|
401
|
-
}
|
402
|
-
const hasChanges = !isEqual(this.initialStatefulData[requestId], selectorResult);
|
403
|
-
this.trackedStatefulChangesMap.set(requestId, hasChanges);
|
404
|
-
}
|
405
|
-
}
|
406
|
-
}
|
407
|
-
FlowStateService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: FlowStateService, deps: [{ token: i1.FlowConfigurationService }, { token: i2.FlowInfoService }, { token: i3.FlowStateApiService }, { token: i4.ConfigurationProcessorsApiService }, { token: i4.SalesTransactionApiService }, { token: i5.SalesTransactionService }, { token: i6.ToastService }, { token: FLOW_CUSTOMIZATION, optional: true }], target: i0.ɵɵFactoryTarget.Injectable });
|
408
|
-
FlowStateService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: FlowStateService });
|
409
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: FlowStateService, decorators: [{
|
410
|
-
type: Injectable
|
411
|
-
}], ctorParameters: function () { return [{ type: i1.FlowConfigurationService }, { type: i2.FlowInfoService }, { type: i3.FlowStateApiService }, { type: i4.ConfigurationProcessorsApiService }, { type: i4.SalesTransactionApiService }, { type: i5.SalesTransactionService }, { type: i6.ToastService }, { type: undefined, decorators: [{
|
412
|
-
type: Optional
|
413
|
-
}, {
|
414
|
-
type: Inject,
|
415
|
-
args: [FLOW_CUSTOMIZATION]
|
416
|
-
}] }]; } });
|
417
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmxvdy1zdGF0ZS5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9zZGsvY29yZS9zZXJ2aWNlcy9mbG93LXN0YXRlLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsUUFBUSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzdELE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ3RELE9BQU8sRUFDTCxpQ0FBaUMsRUFDakMsMEJBQTBCLEdBRTNCLE1BQU0sb0JBQW9CLENBQUM7QUFDNUIsT0FBTyxFQUFFLFlBQVksRUFBRSxTQUFTLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUNqRSxPQUFPLEVBR0wsMkJBQTJCLEVBQzNCLFVBQVUsRUFPVixTQUFTLEVBRVQsSUFBSSxHQUNMLE1BQU0sa0JBQWtCLENBQUM7QUFDMUIsT0FBTyxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQWMsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLFFBQVEsQ0FBQztBQUN6RSxPQUFPLEVBQ0wsZUFBZSxFQUNmLE1BQU0sRUFDTixVQUFVLEVBQ1YsYUFBYSxFQUNiLFlBQVksRUFDWixNQUFNLEVBQ04sUUFBUSxFQUNSLFFBQVEsRUFDUixHQUFHLEVBQ0gsSUFBSSxFQUVKLEVBQUUsRUFDRixLQUFLLEVBQ0wsT0FBTyxFQUNQLFNBQVMsRUFDVCxJQUFJLEVBQ0osR0FBRyxFQUNILFVBQVUsR0FDWCxNQUFNLE1BQU0sQ0FBQztBQUNkLE9BQU8sRUFBRSx3QkFBd0IsRUFBRSxNQUFNLFlBQVksQ0FBQztBQUN0RCxPQUFPLEVBQXFCLGtCQUFrQixFQUFFLE1BQU0sbUNBQW1DLENBQUM7QUFFMUYsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ3RELE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLDZCQUE2QixDQUFDOzs7Ozs7OztBQWN0RSxNQUFNLE9BQU8sZ0JBQWdCO0lBa0IzQixZQUNVLGlCQUEyQyxFQUMzQyxlQUFnQyxFQUNoQyxtQkFBd0MsRUFDeEMsb0JBQXVELEVBQ3ZELDBCQUFzRCxFQUN0RCx1QkFBZ0QsRUFDaEQsWUFBMEIsRUFDYyxvQkFBd0M7UUFQaEYsc0JBQWlCLEdBQWpCLGlCQUFpQixDQUEwQjtRQUMzQyxvQkFBZSxHQUFmLGVBQWUsQ0FBaUI7UUFDaEMsd0JBQW1CLEdBQW5CLG1CQUFtQixDQUFxQjtRQUN4Qyx5QkFBb0IsR0FBcEIsb0JBQW9CLENBQW1DO1FBQ3ZELCtCQUEwQixHQUExQiwwQkFBMEIsQ0FBNEI7UUFDdEQsNEJBQXVCLEdBQXZCLHVCQUF1QixDQUF5QjtRQUNoRCxpQkFBWSxHQUFaLFlBQVksQ0FBYztRQUNjLHlCQUFvQixHQUFwQixvQkFBb0IsQ0FBb0I7UUF6QnpFLG9CQUFlLEdBQUcsTUFBTSxFQUFFLENBQUM7UUFDM0IsMEJBQXFCLEdBQUcsR0FBRyxDQUFDO1FBRXJDLHNCQUFpQixHQUErQyxFQUFFLENBQUM7UUFDbkUsYUFBUSxHQUFHLElBQUksZUFBZSxDQUFnQixJQUFJLENBQUMsQ0FBQztRQUNwRCx3QkFBbUIsR0FBd0IsRUFBRSxDQUFDO1FBQzlDLDhCQUF5QixHQUF5QixJQUFJLEdBQUcsRUFBRSxDQUFDO1FBQzVELGVBQVUsR0FBa0IsRUFBRSxDQUFDO1FBQy9CLGtCQUFhLEdBQWlDLEVBQUUsQ0FBQztRQUNqRCxjQUFTLEdBQWMsRUFBRSxDQUFDO1FBRTFCLHlCQUFvQixHQUFHLElBQUksZUFBZSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ2xELDJCQUFzQixHQUFHLElBQUksT0FBTyxFQUFnQyxDQUFDO1FBR3JFLGFBQVEsR0FBRyxJQUFJLE9BQU8sRUFBUSxDQUFDO1FBWXJDLElBQUksQ0FBQyx5QkFBeUIsR0FBRyxJQUFJLENBQUMsb0JBQW9CLEVBQUUsQ0FBQztRQUU3RDs7O1VBR0U7UUFDRixJQUFJLENBQUMsY0FBYyxFQUFFO2FBQ2xCLElBQUksQ0FDSCxNQUFNLENBQUMsT0FBTyxDQUFDLEVBQ2YsTUFBTSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxFQUM1RCxTQUFTLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLFFBQVEsQ0FBQyxFQUNoRCxTQUFTLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxFQUFFLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FDaEQ7YUFDQSxTQUFTLEVBQUUsQ0FBQztJQUNqQixDQUFDO0lBRU0sS0FBSztRQUNWLElBQUksSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLFFBQVEsRUFBRTtZQUNqRCxPQUFPLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQyxDQUFDLENBQUM7U0FDM0U7YUFBTTtZQUNMLE9BQU8sUUFBUSxDQUFDLENBQUMsSUFBSSxDQUFDLGNBQWMsRUFBRSxFQUFFLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO1NBQ2xGO0lBQ0gsQ0FBQztJQUVNLEtBQUs7UUFDVixNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxFQUFFLEtBQUssRUFBRSxFQUFFLEVBQUUsQ0FBQyxLQUFLLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQztRQUMzRSxJQUFJLENBQUMsYUFBYSxHQUFHLEVBQUUsQ0FBQztRQUV4QixJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxFQUFFO1lBQ3ZCLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxTQUFTLEVBQUUsQ0FBQztZQUNqRSxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztTQUMxQjtRQUVELElBQUksQ0FBQyxVQUFVLEdBQUcsRUFBRSxDQUFDO1FBQ3JCLElBQUksQ0FBQyxTQUFTLEdBQUcsRUFBRSxDQUFDO1FBQ3BCLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLENBQUM7SUFDdkIsQ0FBQztJQUVELElBQVcsaUJBQWlCO1FBQzFCLE9BQU8sSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLFFBQVE7WUFDbEQsQ0FBQyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLHlCQUF5QixDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQztZQUNuRSxDQUFDLENBQUMsSUFBSSxDQUFDLHVCQUF1QixDQUFDLGlCQUFpQixDQUFDO0lBQ3JELENBQUM7SUFFRCxJQUFXLE9BQU87UUFDaEIsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQztJQUM3QixDQUFDO0lBRUQsSUFBVyxzQkFBc0I7UUFDL0IsT0FBTyxJQUFJLENBQUMsb0JBQW9CLENBQUMsWUFBWSxFQUFFLENBQUM7SUFDbEQsQ0FBQztJQUVNLGNBQWM7UUFDbkIsT0FBTyxhQUFhLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FDckYsR0FBRyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUNwQyxDQUFDO0lBQ0osQ0FBQztJQUVNLGFBQWE7UUFDbEIsT0FBTyxPQUFPLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsSUFBSSxJQUFJLENBQUMsdUJBQXVCLENBQUMsYUFBYSxDQUFDO0lBQ3BGLENBQUM7SUFFTSxRQUFRLENBQ2IsS0FBcUIsRUFDckIsSUFBK0I7UUFFL0IsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFFaEQsT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FDdkMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxFQUFFO1lBQ1gsOEJBQThCO1lBQzlCLE1BQU0sZUFBZSxHQUFHLE1BQU0sQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDLE1BQU0sQ0FDN0QsQ0FBQyxLQUFnRCxFQUFFLENBQUMsU0FBUyxFQUFFLE1BQU0sQ0FBQyxFQUFFLEVBQUU7Z0JBQ3hFLElBQUksSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDLFNBQVMsQ0FBQyxFQUFFO29CQUMvQixLQUFLLENBQUMsU0FBUyxDQUFDLEdBQUcsTUFBTSxDQUFDO2lCQUMzQjtnQkFDRCxPQUFPLEtBQUssQ0FBQztZQUNmLENBQUMsRUFDRCxFQUFFLENBQ0gsQ0FBQztZQUVGLE9BQU8sZUFBZSxDQUFDO1FBQ3pCLENBQUMsQ0FBQyxDQUNILENBQUM7SUFDSixDQUFDO0lBRU0sU0FBUyxDQUFDLEtBQXFCLEVBQUUsTUFBYyxFQUFFLFNBQW1CO1FBQ3pFLE1BQU0sSUFBSSxHQUE4QjtZQUN0QyxPQUFPLEVBQUUsQ0FBQyxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLENBQUM7U0FDdkMsQ0FBQztRQUNGLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxDQUFDO1FBRWhELE9BQU8sSUFBSSxDQUFDLGVBQWUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7SUFDdkQsQ0FBQztJQUVNLE9BQU8sQ0FDWixLQUFxQixFQUNyQixZQUFvQixFQUNwQixTQUFtQjtRQUVuQixNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsaUJBQWlCLENBQUMsS0FBSyxFQUFFLFlBQVksRUFBRSxTQUFTLENBQUMsQ0FBQztRQUN6RSxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLEtBQUssRUFBRTtZQUN4QyxTQUFTLEVBQUU7Z0JBQ1QsQ0FBQyxTQUFTLENBQUMsRUFBRTtvQkFDWCxJQUFJLEVBQUUsWUFBWTtvQkFDbEIsU0FBUztpQkFDVjthQUNGO1NBQ0YsQ0FBQyxDQUFDO1FBRUgsT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FDdkMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQXdDLENBQUMsQ0FDdEYsQ0FBQztJQUNKLENBQUM7SUFFTSxVQUFVLENBQ2YsS0FBcUIsRUFDckIsWUFBb0IsRUFDcEIsU0FBbUIsRUFDbkIsT0FBc0M7UUFFdEMsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUFDLEtBQUssRUFBRSxZQUFZLEVBQUUsU0FBUyxDQUFDLENBQUM7UUFFekUsSUFBSSxZQUFZLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUVqRCxJQUFJLENBQUMsWUFBWSxFQUFFO1lBQ2pCLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsS0FBSyxFQUFFO2dCQUN4QyxTQUFTLEVBQUU7b0JBQ1QsQ0FBQyxTQUFTLENBQUMsRUFBRTt3QkFDWCxJQUFJLEVBQUUsWUFBWTt3QkFDbEIsU0FBUztxQkFDVjtpQkFDRjthQUNGLENBQUMsQ0FBQztZQUVILFlBQVksR0FBRztnQkFDYixPQUFPO2dCQUNQLEtBQUssRUFBRSxJQUFJLGVBQWUsQ0FBVSxJQUFJLENBQUMsZUFBZSxDQUFDO2FBQzFELENBQUM7WUFFRixJQUFJLENBQUMsYUFBYSxDQUFDLFNBQVMsQ0FBQyxHQUFHLFlBQVksQ0FBQztZQUU3QyxJQUFJLE9BQU8sRUFBRSxjQUFjLEVBQUU7Z0JBQzNCLElBQUksQ0FBQyx5QkFBeUIsQ0FBQyxHQUFHLENBQUMsU0FBUyxFQUFFLEtBQUssQ0FBQyxDQUFDO2FBQ3REO1lBRUQsSUFBSSxDQUFDLE9BQU8sRUFBRSxJQUFJLEVBQUU7Z0JBQ2xCLElBQUksQ0FBQyxlQUFlLENBQUMsT0FBTyxDQUFDLENBQUMsU0FBUyxFQUFFLENBQUM7YUFDM0M7U0FDRjtRQUVELE9BQU8sWUFBWSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQzVCLE1BQU0sQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLElBQUksSUFBSSxJQUFJLENBQUMsZUFBZSxDQUFDLEVBQzVDLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLElBQTJDLENBQUMsRUFDeEQsUUFBUSxDQUFDLEdBQUcsRUFBRTtZQUNaLElBQUksQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLFNBQVMsQ0FBQyxFQUFFLEtBQUssQ0FBQyxRQUFRLEVBQUU7Z0JBQ2xELE9BQU8sSUFBSSxDQUFDLGFBQWEsQ0FBQyxTQUFTLENBQUMsQ0FBQzthQUN0QztRQUNILENBQUMsQ0FBQyxDQUNILENBQUM7SUFDSixDQUFDO0lBRU0sS0FBSztRQUNWLElBQUksSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLFFBQVEsRUFBRTtZQUNqRCxJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxFQUFFO2dCQUN2QixPQUFPLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxJQUFJLENBQzVELEdBQUcsQ0FBQyxDQUFDLEVBQUUsT0FBTyxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsT0FBTyxFQUFFLENBQUMsQ0FBQyxFQUN2QyxHQUFHLENBQUMsR0FBRyxFQUFFO29CQUNQLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLHlCQUF5QixDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxFQUFFO3dCQUM5RCxJQUFJLENBQUMseUJBQXlCLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxLQUFLLENBQUMsQ0FBQztvQkFDakQsQ0FBQyxDQUFDLENBQUM7Z0JBQ0wsQ0FBQyxDQUFDLENBQ0gsQ0FBQzthQUNIO1NBQ0Y7YUFBTTtZQUNMLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxLQUFLLENBQUM7WUFDakQsSUFBSSxLQUFLLEVBQUU7Z0JBQ1QsTUFBTSxPQUFPLEdBQWtDO29CQUM3QyxrQkFBa0IsRUFBRSxLQUFLO29CQUN6QixNQUFNLEVBQUUsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsRUFBRTtpQkFDckMsQ0FBQztnQkFFRixPQUFPLElBQUksQ0FBQywwQkFBMEIsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQzthQUNoRjtTQUNGO1FBRUQsT0FBTyxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQztJQUN4QixDQUFDO0lBRU0sWUFBWTtRQUNqQixPQUFPLElBQUksQ0FBQyxTQUFTLENBQUM7SUFDeEIsQ0FBQztJQUVPLGlCQUFpQixDQUFDLEtBQXFCO1FBQzdDLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxFQUFFLEVBQUUsQ0FBQztRQUMxRCxJQUFJLENBQUMsT0FBTyxFQUFFO1lBQ1osTUFBTSxrQ0FBa0MsS0FBSyxFQUFFLENBQUM7U0FDakQ7UUFFRCxPQUFPLE9BQU8sQ0FBQztJQUNqQixDQUFDO0lBRU8saUJBQWlCLENBQUMsRUFBVTtRQUNsQyxLQUFLLE1BQU0sUUFBUSxJQUFJLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxTQUFTLENBQUMsRUFBRTtZQUNwRSxJQUFJLFFBQVEsQ0FBQyxFQUFFLEtBQUssRUFBRSxFQUFFO2dCQUN0QixPQUFPLFFBQVEsQ0FBQyxJQUFJLENBQUM7YUFDdEI7U0FDRjtRQUVELE9BQU87SUFDVCxDQUFDO0lBRU8sYUFBYSxDQUFDLEtBQXFCLEVBQUUsSUFBK0I7UUFDMUUsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUFDLEtBQUssQ0FBQyxDQUFDO1FBRTlDLE9BQU87WUFDTCxPQUFPLEVBQUUsSUFBSSxDQUFDLE9BQU8sRUFBRSxHQUFHLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsT0FBTyxFQUFFLE1BQU0sQ0FBQyxJQUFJLEVBQUUsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLENBQUMsU0FBUyxJQUFJLEVBQUUsRUFBRSxDQUFDLENBQUM7WUFDNUcsU0FBUyxFQUNQLElBQUksQ0FBQyxTQUFTO2dCQUNkLE1BQU0sQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLE1BQU0sQ0FDbkMsQ0FBQyxLQUE2QyxFQUFFLENBQUMsR0FBRyxFQUFFLFFBQVEsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO29CQUNuRSxHQUFHLEtBQUs7b0JBQ1IsQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLE9BQU8sRUFBRSxRQUFRLENBQUMsSUFBSSxFQUFFLE9BQU8sRUFBRSxTQUFTLEVBQUUsUUFBUSxDQUFDLFNBQVMsSUFBSSxFQUFFLEVBQUU7aUJBQ2hGLENBQUMsRUFDRixFQUFFLENBQ0g7U0FDSixDQUFDO0lBQ0osQ0FBQztJQUVNLGVBQWUsQ0FDcEIsT0FBcUMsRUFDckMscUJBQThCLEtBQUs7UUFFbkMsTUFBTSxXQUFXLEdBQUcsU0FBUyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ3ZDLElBQUksV0FBVyxDQUFDLE9BQU8sRUFBRSxNQUFNLElBQUksa0JBQWtCLEVBQUU7WUFDckQsS0FBSyxNQUFNLFlBQVksSUFBSSxNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsRUFBRTtnQkFDNUQsV0FBVyxDQUFDLFNBQVMsR0FBRyxNQUFNLENBQUMsV0FBVyxDQUFDLFNBQVMsRUFBRSxZQUFZLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDO2FBQ3ZGO1NBQ0Y7UUFFRCxNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsUUFBUTtZQUM5RCxDQUFDLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFdBQVcsQ0FBQztZQUNwQyxDQUFDLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBRXhDLE9BQU8sVUFBVSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsdUJBQXVCLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUN4RixDQUFDO0lBRU8sdUJBQXVCLENBQUMsU0FBNkQ7UUFDM0YsTUFBTSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLFNBQVMsRUFBRSxjQUFjLENBQUMsRUFBRSxFQUFFO1lBQ2hFLElBQUksQ0FBQyxjQUFjLENBQUMsT0FBTyxFQUFFO2dCQUMzQixJQUFJLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxFQUFFLFFBQVEsRUFBRSxTQUFTLENBQUMsS0FBSyxFQUFFLE9BQU8sRUFBRSxjQUFjLENBQUMsWUFBWSxFQUFFLENBQUMsQ0FBQzthQUM1RjtZQUVELE1BQU0sYUFBYSxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsU0FBUyxDQUFDLEVBQUUsS0FBSyxDQUFDO1lBQzNELElBQUksYUFBYSxJQUFJLGFBQWEsQ0FBQyxLQUFLLEtBQUssY0FBYyxFQUFFO2dCQUMzRCxJQUFJLENBQUMsb0JBQW9CLENBQUMsU0FBUyxFQUFFLGNBQWMsQ0FBQyxDQUFDO2dCQUNyRCxhQUFhLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDO2FBQ3BDO1FBQ0gsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRU8sYUFBYTtRQUNuQixNQUFNLGNBQWMsR0FBRyxPQUFPLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxRQUFRLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzlHLE1BQU0sVUFBVSxHQUFHLGNBQWMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO1FBQ3RFLE1BQU0sU0FBUyxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQzthQUNoRCxHQUFHLENBQUMsQ0FBQyxFQUFFLE9BQU8sRUFBRSxFQUFFLEVBQUUsQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDO2FBQ3ZDLE1BQU0sQ0FBQyxTQUFTLENBQUM7YUFDakIsTUFBTSxDQUFDLENBQUMsS0FBSyxFQUFFLFNBQVMsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLEdBQUcsS0FBSyxFQUFFLEdBQUcsU0FBUyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztRQUVsRSxPQUFPLElBQUksQ0FBQyxtQkFBbUI7YUFDNUIsSUFBSSxDQUFDO1lBQ0osT0FBTyxFQUFFLElBQUksQ0FBQyxlQUFlLENBQUMsT0FBTyxDQUFDLFFBQVE7WUFDOUMsTUFBTSxFQUFFLElBQUksQ0FBQyxlQUFlLENBQUMsT0FBTztZQUNwQyxlQUFlLEVBQUUsVUFBVSxFQUFFLE1BQU0sQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDLFNBQVMsQ0FBQyxJQUFJLEtBQUssMkJBQTJCLENBQUMsTUFBTSxDQUFDO1lBQ3ZHLGlCQUFpQixFQUFFLFVBQVUsRUFBRSxNQUFNLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQyxTQUFTLENBQUMsSUFBSSxLQUFLLDJCQUEyQixDQUFDLFFBQVEsQ0FBQztZQUMzRyxTQUFTLEVBQUUsU0FBUztTQUNyQixDQUFDO2FBQ0QsSUFBSSxDQUNILEdBQUcsQ0FBQyxDQUFDLEVBQUUsT0FBTyxFQUFFLFNBQVMsRUFBRSxFQUFFLEVBQUU7WUFDN0IsSUFBSSxDQUFDLHVCQUF1QixDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBQ3hDLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQzlCLENBQUMsQ0FBQyxDQUNILENBQUM7SUFDTixDQUFDO0lBRU8sb0JBQW9CO1FBQzFCLE9BQU8sSUFBSSxDQUFDLHNCQUFzQixDQUFDLElBQUksQ0FDckMsTUFBTSxDQUFDLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDLENBQUMsRUFDbEYsU0FBUyxDQUFDLFFBQVEsQ0FBQyxFQUFFO1lBQ25CLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssRUFBRTtnQkFDeEIsTUFBTSxxQ0FBcUMsQ0FBQzthQUM3QztZQUVELDBCQUEwQjtZQUMxQixNQUFNLE9BQU8sR0FBaUM7Z0JBQzVDLE9BQU8sRUFBRSxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUMsRUFBRSxPQUFPLEVBQUUsRUFBRSxFQUFFLENBQUMsT0FBTyxDQUFDLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQztnQkFDckUsU0FBUyxFQUFFLFFBQVE7cUJBQ2hCLEdBQUcsQ0FBQyxDQUFDLEVBQUUsU0FBUyxFQUFFLEVBQUUsRUFBRSxDQUFDLFNBQVMsQ0FBQztxQkFDakMsTUFBTSxDQUFDLFNBQVMsQ0FBQztxQkFDakIsTUFBTSxDQUFDLENBQUMsR0FBRyxFQUFFLFlBQVksRUFBRSxFQUFFLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxHQUFHLEVBQUUsWUFBWSxDQUFDLEVBQUUsRUFBRSxDQUFDO2FBQ3ZFLENBQUM7WUFFRixJQUFJLENBQUMsb0JBQW9CLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ3JDLE9BQU8sSUFBSSxDQUFDLG1CQUFtQixDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssRUFBRSxPQUFPLENBQUMsQ0FBQztRQUN4RSxDQUFDLENBQUMsRUFDRixHQUFHLENBQUMsQ0FBQyxFQUFFLE9BQU8sRUFBRSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxFQUNqRCxLQUFLLEVBQUUsRUFDUCxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLG9CQUFvQixDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUNoRCxVQUFVLENBQUMsQ0FBQyxDQUFDLEVBQUU7WUFDYixJQUFJLENBQUMsb0JBQW9CLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ3RDLE9BQU8sVUFBVSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzdCLENBQUMsQ0FBQyxDQUNILENBQUM7SUFDSixDQUFDO0lBRU8sZ0JBQWdCLENBQUMsT0FBcUM7UUFDNUQsT0FBTyxJQUFJLENBQUMsb0JBQW9CLENBQUMsSUFBSSxDQUNuQyxNQUFNLENBQUMsVUFBVSxDQUFDLEVBQUUsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxFQUNqQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQ1AsU0FBUyxDQUFDLEdBQUcsRUFBRTtRQUNiLDZGQUE2RjtRQUM3RixhQUFhLENBQUM7WUFDWixJQUFJLENBQUMseUJBQXlCO1lBQzlCLEVBQUUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQztTQUN6RSxDQUFDLENBQ0gsRUFDRCxHQUFHLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxRQUFRLENBQUMsRUFDN0IsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUNSLENBQUM7SUFDSixDQUFDO0lBRU8sY0FBYztRQUNwQixPQUFPLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxPQUFPLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxlQUFlLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBSSxDQUNoSCxTQUFTLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQzVELEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsdUJBQXVCLENBQUMsWUFBWSxFQUFFLENBQUMsRUFDdEQsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUNWLENBQUM7SUFDSixDQUFDO0lBRU8saUJBQWlCLENBQUMsT0FBcUM7UUFDN0QsSUFBSSxDQUFDLG9CQUFvQixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUVyQyxPQUFPLEVBQUUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxJQUFJLENBQ3ZCLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsdUJBQXVCLENBQUMsT0FBTyxDQUFDLENBQUMsRUFDaEQsU0FBUyxDQUFDLEdBQUcsRUFBRTtZQUNiOzs7O2NBSUU7WUFDRixNQUFNLEVBQUUsS0FBSyxFQUFFLEdBQUcsSUFBSSxDQUFDLHVCQUF1QixDQUFDO1lBQy9DLElBQUksQ0FBQyxLQUFLLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxFQUFFLE1BQU0sSUFBSSxDQUFDLElBQUksQ0FBQyxhQUFhLEVBQUUsRUFBRTtnQkFDL0QsT0FBTyxFQUFFLENBQUMsU0FBUyxDQUFDLENBQUM7YUFDdEI7aUJBQU07Z0JBQ0wsT0FBTyxJQUFJLENBQUMsaUJBQWlCLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxDQUFDO2FBQ2pEO1FBQ0gsQ0FBQyxDQUFDLEVBQ0YsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyx5QkFBeUIsQ0FBQyxPQUFPLENBQUMsQ0FBQyxFQUNsRCxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLG9CQUFvQixDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUNoRCxVQUFVLENBQUMsQ0FBQyxDQUFDLEVBQUU7WUFDYixJQUFJLENBQUMsb0JBQW9CLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ3RDLE9BQU8sVUFBVSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzdCLENBQUMsQ0FBQyxDQUNILENBQUM7SUFDSixDQUFDO0lBRU8sdUJBQXVCLENBQUMsT0FBcUM7UUFDbkUsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLHVCQUF1QixDQUFDLEtBQUssQ0FBQztRQUNqRCxJQUFJLENBQUMsS0FBSyxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sRUFBRSxNQUFNLEVBQUU7WUFDdEMsT0FBTztTQUNSO1FBRUQsSUFBSSxTQUFTLEdBQUcsS0FBSyxDQUFDO1FBQ3RCLE9BQU8sQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxFQUFFO1lBQy9CLElBQUk7Z0JBQ0YsU0FBUyxHQUFHLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxTQUFTLEVBQUUsTUFBTSxDQUFDLElBQUksU0FBUyxDQUFDO2FBQ3RFO1lBQUMsT0FBTyxDQUFDLEVBQUU7Z0JBQ1YsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDakIsSUFBSSxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsRUFBRSxRQUFRLEVBQUUsU0FBUyxDQUFDLEtBQUssRUFBRSxPQUFPLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztnQkFDekUsTUFBTSxDQUFDLENBQUM7YUFDVDtRQUNILENBQUMsQ0FBQyxDQUFDO1FBRUgsSUFBSSxDQUFDLHVCQUF1QixDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUNuRCxDQUFDO0lBRU8seUJBQXlCLENBQUMsT0FBcUM7UUFDckUsSUFBSSxDQUFDLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxLQUFLLEVBQUU7WUFDdkMsTUFBTSwwQkFBMEIsQ0FBQztTQUNsQztRQUVELE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxLQUFLLENBQUM7UUFDckQsT0FBTyxVQUFVLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxTQUFTLElBQUksRUFBRSxDQUFDLENBQUMsTUFBTSxDQUN2RCxDQUFDLE1BQWdDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsUUFBUSxDQUFDLEVBQUUsRUFBRTtZQUNwRCxJQUFJO2dCQUNGLE1BQU0sQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLEdBQUc7b0JBQ3RCLE9BQU8sRUFBRSxJQUFJO29CQUNiLE1BQU0sRUFBRSxJQUFJLENBQUMscUJBQXFCLENBQUMsU0FBUyxFQUFFLFFBQVEsQ0FBQztpQkFDeEQsQ0FBQzthQUNIO1lBQUMsT0FBTyxDQUFDLEVBQUU7Z0JBQ1YsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDakIsTUFBTSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsR0FBRztvQkFDdEIsT0FBTyxFQUFFLEtBQUs7b0JBQ2QsWUFBWSxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUM7aUJBQ3hCLENBQUM7YUFDSDtZQUVELE9BQU8sTUFBTSxDQUFDO1FBQ2hCLENBQUMsRUFDRCxFQUFFLE9BQU8sRUFBRSxFQUFFLEVBQUUsU0FBUyxFQUFFLEVBQUUsRUFBRSxDQUMvQixDQUFDO0lBQ0osQ0FBQztJQUVPLGVBQWU7UUFDckIsTUFBTSxZQUFZLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxvQkFBb0IsRUFBRSxrQ0FBa0MsQ0FBQyxDQUFDO1FBQzVGLElBQUksSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLFFBQVEsSUFBSSxDQUFDLFlBQVksRUFBRTtZQUNsRSw4REFBOEQ7WUFDOUQsT0FBTyxFQUFFLENBQUMsU0FBUyxDQUFDLENBQUM7U0FDdEI7UUFFRCxNQUFNLE9BQU8sR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsU0FBUyxDQUFDO2FBQzFELEdBQUcsQ0FBQyxRQUFRLENBQUMsRUFBRTtZQUNkLElBQUksQ0FBQyxRQUFRLEVBQUU7Z0JBQ2IsT0FBTzthQUNSO1lBRUQsTUFBTSxnQkFBZ0IsR0FDcEIsSUFBSSxDQUFDLG9CQUFvQixFQUFFLGtDQUFrQyxFQUFFLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUU3RixPQUFPLGdCQUFnQixDQUFDLElBQUksQ0FDMUIsU0FBUyxDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQ3JCLFVBQVUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsb0JBQW9CLENBQUMsNkJBQTZCLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxDQUNuRyxFQUNELEdBQUcsQ0FBQyxVQUFVLENBQUMsRUFBRTtnQkFDZixNQUFNLGFBQWEsR0FBRyxVQUFVLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBMkMsRUFBRSxDQUFDLEVBQUUsRUFBRTtvQkFDekYsR0FBRyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUM7b0JBQ25CLE9BQU8sR0FBRyxDQUFDO2dCQUNiLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztnQkFFUCxJQUFJLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsR0FBRyxhQUFhLENBQUM7WUFDL0MsQ0FBQyxDQUFDLENBQ0gsQ0FBQztRQUNKLENBQUMsQ0FBQzthQUNELE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUVyQixJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sRUFBRTtZQUNuQixPQUFPLEVBQUUsQ0FBQyxTQUFTLENBQUMsQ0FBQztTQUN0QjtRQUVELE9BQU8sUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztJQUMzQyxDQUFDO0lBRU8sbUJBQW1CLENBQUMsT0FBa0IsRUFBRSxVQUFrQztRQUNoRixNQUFNLHNCQUFzQixHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBRXpGLElBQUksQ0FBQyxzQkFBc0IsRUFBRSxNQUFNLEVBQUU7WUFDbkMsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUN6RCxNQUFNLFNBQVMsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLE9BQU8sS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztZQUM5QyxNQUFNLDBCQUEwQixVQUFVLENBQUMsT0FBTyxHQUFHLFNBQVMsWUFBWSxDQUFDO1NBQzVFO1FBRUQsT0FBTyxJQUFJLENBQUMsc0JBQXNCLENBQUMsT0FBTyxFQUFFLHNCQUFzQixFQUFFLFVBQVUsQ0FBQyxTQUFTLENBQWMsQ0FBQztJQUN6RyxDQUFDO0lBRU8scUJBQXFCLENBQUMsT0FBa0IsRUFBRSxVQUFrQztRQUNsRixNQUFNLHNCQUFzQixHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBRXpGLElBQUksQ0FBQyxzQkFBc0IsRUFBRSxNQUFNLEVBQUU7WUFDbkMsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUN6RCxNQUFNLFNBQVMsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLE9BQU8sS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztZQUM5QyxNQUFNLDBCQUEwQixVQUFVLENBQUMsT0FBTyxHQUFHLFNBQVMsWUFBWSxDQUFDO1NBQzVFO1FBRUQsT0FBTyxJQUFJLENBQUMsc0JBQXNCLENBQUMsT0FBTyxFQUFFLHNCQUFzQixFQUFFLFVBQVUsQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUM1RixDQUFDO0lBRU8sc0JBQXNCLENBQzVCLE9BQWtCLEVBQ2xCLHNCQUE4QyxFQUM5QyxTQUFrQjtRQUVsQixNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsaUJBQWlCLENBQUMsc0JBQXNCLENBQUMsT0FBTyxJQUFJLEVBQUUsQ0FBQyxDQUFDO1FBQzNFLElBQUksaUJBQWlCLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUFDLEtBQUssR0FBRyxzQkFBc0IsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUV2RixJQUFJLENBQUMsaUJBQWlCLEVBQUU7WUFDdEIsTUFBTSxNQUFNLEdBQUcsR0FBRyxzQkFBc0IsQ0FBQyxNQUFNLHFCQUFxQixDQUFDO1lBQ3JFLE1BQU0sU0FBUyxHQUFHLG1CQUFtQixLQUFLLENBQUMsQ0FBQyxDQUFDLEtBQUssR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxzQkFBc0IsQ0FBQyxPQUFPLEtBQUssQ0FBQztZQUNwRyxpQkFBaUIsR0FBRyxJQUFJLFFBQVEsQ0FBQyxNQUFNLEdBQUcsU0FBUyxDQUFDLEVBQW9DLENBQUM7WUFDekYsSUFBSSxDQUFDLGlCQUFpQixDQUFDLEtBQUssR0FBRyxzQkFBc0IsQ0FBQyxPQUFPLENBQUMsR0FBRyxpQkFBaUIsQ0FBQztTQUNwRjtRQUVELE9BQU8saUJBQWlCLENBQUM7WUFDdkIsT0FBTztZQUNQLFNBQVM7WUFDVCxTQUFTLEVBQUUsSUFBSSxDQUFDLFNBQVM7U0FDMUIsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVPLGlCQUFpQixDQUFDLEtBQXFCLEVBQUUsWUFBb0IsRUFBRSxTQUFtQjtRQUN4RixNQUFNLGFBQWEsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUM1RSxPQUFPLEdBQUcsS0FBSyxJQUFJLFlBQVksSUFBSSxhQUFhLEVBQUUsQ0FBQztJQUNyRCxDQUFDO0lBRU8sb0JBQW9CLENBQUMsU0FBaUIsRUFBRSxjQUF1QjtRQUNyRSxJQUFJLElBQUksQ0FBQyx5QkFBeUIsQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLEVBQUU7WUFDakQsSUFBSSxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxTQUFTLENBQUMsRUFBRTtnQkFDeEMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLFNBQVMsQ0FBQyxHQUFHLGNBQWMsQ0FBQzthQUN0RDtZQUVELE1BQU0sVUFBVSxHQUFHLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxTQUFTLENBQUMsRUFBRSxjQUFjLENBQUMsQ0FBQztZQUNqRixJQUFJLENBQUMseUJBQXlCLENBQUMsR0FBRyxDQUFDLFNBQVMsRUFBRSxVQUFVLENBQUMsQ0FBQztTQUMzRDtJQUNILENBQUM7OzZHQTVoQlUsZ0JBQWdCLDBSQTBCTCxrQkFBa0I7aUhBMUI3QixnQkFBZ0I7MkZBQWhCLGdCQUFnQjtrQkFENUIsVUFBVTs7MEJBMkJOLFFBQVE7OzBCQUFJLE1BQU07MkJBQUMsa0JBQWtCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0LCBJbmplY3RhYmxlLCBPcHRpb25hbCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgRmxvd1N0YXRlQXBpU2VydmljZSB9IGZyb20gJ0B2ZWxvY2VhcHBzL2FwaSc7XG5pbXBvcnQge1xuICBDb25maWd1cmF0aW9uUHJvY2Vzc29yc0FwaVNlcnZpY2UsXG4gIFNhbGVzVHJhbnNhY3Rpb25BcGlTZXJ2aWNlLFxuICBTYWxlc1RyYW5zYWN0aW9uVXBzZXJ0UmVxdWVzdCxcbn0gZnJvbSAnQHZlbG9jZWFwcHMvYXBpL3YyJztcbmltcG9ydCB7IFRvYXN0U2VydmljZSwgVG9hc3RUeXBlIH0gZnJvbSAnQHZlbG9jZWFwcHMvY29tcG9uZW50cyc7XG5pbXBvcnQge1xuICBDb25maWd1cmF0aW9uUHJvY2Vzc29yLFxuICBDb25maWd1cmF0aW9uUHJvY2Vzc29yU2NyaXB0Rm4sXG4gIENvbmZpZ3VyYXRpb25Qcm9jZXNzb3JUeXBlcyxcbiAgRW50aXR5VXRpbCxcbiAgRmxvd1N0YXRlLFxuICBGbG93U3RhdGVFeGVjdXRhYmxlRFRPLFxuICBGbG93U3RhdGVFeGVjdXRpb25SZXF1ZXN0LFxuICBGbG93U3RhdGVFeGVjdXRpb25SZXF1ZXN0RFRPLFxuICBGbG93U3RhdGVFeGVjdXRpb25SZXN1bHQsXG4gIEZsb3dTdGF0ZVNlbGVjdG9yUmVzcG9uc2UsXG4gIGlzRGVmaW5lZCxcbiAgVUlUZW1wbGF0ZVR5cGUsXG4gIFVVSUQsXG59IGZyb20gJ0B2ZWxvY2VhcHBzL2NvcmUnO1xuaW1wb3J0IHsgYXNzaWduLCBjbG9uZURlZXAsIERpY3Rpb25hcnksIGZsYXR0ZW4sIGlzRXF1YWwgfSBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IHtcbiAgQmVoYXZpb3JTdWJqZWN0LFxuICBidWZmZXIsXG4gIGNhdGNoRXJyb3IsXG4gIGNvbWJpbmVMYXRlc3QsXG4gIGRlYm91bmNlVGltZSxcbiAgZmlsdGVyLFxuICBmaW5hbGl6ZSxcbiAgZm9ya0pvaW4sXG4gIG1hcCxcbiAgbm9vcCxcbiAgT2JzZXJ2YWJsZSxcbiAgb2YsXG4gIHNoYXJlLFxuICBTdWJqZWN0LFxuICBzd2l0Y2hNYXAsXG4gIHRha2UsXG4gIHRhcCxcbiAgdGhyb3dFcnJvcixcbn0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBGbG93Q29uZmlndXJhdGlvblNlcnZpY2UgfSBmcm9tICcuLi9tb2R1bGVzJztcbmltcG9ydCB7IEZsb3dDdXN0b21pemF0aW9uLCBGTE9XX0NVU1RPTUlaQVRJT04gfSBmcm9tICcuLi90eXBlcy9mbG93LWN1c3RvbWl6YXRpb24udHlwZXMnO1xuaW1wb3J0IHsgRmxvd1N0YXRlU3Vic2NyaXB0aW9uT3B0aW9ucywgRmxvd1N0b3JlIH0gZnJvbSAnLi4vdHlwZXMvZmxvdy1zdGF0ZS50eXBlcyc7XG5pbXBvcnQgeyBGbG93SW5mb1NlcnZpY2UgfSBmcm9tICcuL2Zsb3ctaW5mby5zZXJ2aWNlJztcbmltcG9ydCB7IFNhbGVzVHJhbnNhY3Rpb25TZXJ2aWNlIH0gZnJvbSAnLi9zYWxlcy10cmFuc2FjdGlvbi5zZXJ2aWNlJztcblxudHlwZSBQcm9jZXNzb3JzTWFwID0gUGFydGlhbDx7XG4gIFtvd25lcklkOiBzdHJpbmddOiB7XG4gICAgW2FwaU5hbWU6IHN0cmluZ106IENvbmZpZ3VyYXRpb25Qcm9jZXNzb3I7XG4gIH07XG59PjtcblxudHlwZSBTdWJzY3JpcHRpb24gPSB7XG4gIHJlcXVlc3Q6IEZsb3dTdGF0ZUV4ZWN1dGlvblJlcXVlc3REVE87XG4gIGRhdGEkOiBCZWhhdmlvclN1YmplY3Q8dW5rbm93bj47XG59O1xuXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgRmxvd1N0YXRlU2VydmljZSB7XG4gIHByaXZhdGUgcmVhZG9ubHkgTk9UX0lOSVRJQUxJWkVEID0gU3ltYm9sKCk7XG4gIHByaXZhdGUgcmVhZG9ubHkgRVhFQ1VUSU9OX0JVRkZFUl9USU1FID0gMTAwO1xuXG4gIHByaXZhdGUgZXhlY3V0ZWRGdW5jdGlvbnM6IERpY3Rpb25hcnk8Q29uZmlndXJhdGlvblByb2Nlc3NvclNjcmlwdEZuPiA9IHt9O1xuICBwcml2YXRlIHN0YXRlSWQkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxzdHJpbmcgfCBudWxsPihudWxsKTtcbiAgcHJpdmF0ZSBpbml0aWFsU3RhdGVmdWxEYXRhOiBEaWN0aW9uYXJ5PHVua25vd24+ID0ge307XG4gIHByaXZhdGUgdHJhY2tlZFN0YXRlZnVsQ2hhbmdlc01hcDogTWFwPHN0cmluZywgYm9vbGVhbj4gPSBuZXcgTWFwKCk7XG4gIHByaXZhdGUgcHJvY2Vzc29yczogUHJvY2Vzc29yc01hcCA9IHt9O1xuICBwcml2YXRlIHN1YnNjcmlwdGlvbnM6IFJlY29yZDxzdHJpbmcsIFN1YnNjcmlwdGlvbj4gPSB7fTtcbiAgcHJpdmF0ZSBmbG93U3RvcmU6IEZsb3dTdG9yZSA9IHt9O1xuXG4gIHByaXZhdGUgZXhlY3V0aW9uSW5Qcm9ncmVzcyQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0KGZhbHNlKTtcbiAgcHJpdmF0ZSBzdGF0ZWZ1bFJlcXVlc3RTdHJlYW0kID0gbmV3IFN1YmplY3Q8Rmxvd1N0YXRlRXhlY3V0aW9uUmVxdWVzdERUTz4oKTtcbiAgcHJpdmF0ZSBzdGF0ZWZ1bEV4ZWN1dGlvblJlcXVlc3QkOiBPYnNlcnZhYmxlPEZsb3dTdGF0ZUV4ZWN1dGlvblJlc3VsdD47XG5cbiAgcHJpdmF0ZSBjbGVhbnVwJCA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBmbG93Q29uZmlndXJhdGlvbjogRmxvd0NvbmZpZ3VyYXRpb25TZXJ2aWNlLFxuICAgIHByaXZhdGUgZmxvd0luZm9TZXJ2aWNlOiBGbG93SW5mb1NlcnZpY2UsXG4gICAgcHJpdmF0ZSBmbG93U3RhdGVBcGlTZXJ2aWNlOiBGbG93U3RhdGVBcGlTZXJ2aWNlLFxuICAgIHByaXZhdGUgcHJvY2Vzc29yc0FwaVNlcnZpY2U6IENvbmZpZ3VyYXRpb25Qcm9jZXNzb3JzQXBpU2VydmljZSxcbiAgICBwcml2YXRlIHNhbGVzVHJhbnNhY3Rpb25BcGlTZXJ2aWNlOiBTYWxlc1RyYW5zYWN0aW9uQXBpU2VydmljZSxcbiAgICBwcml2YXRlIHNhbGVzVHJhbnNhY3Rpb25TZXJ2aWNlOiBTYWxlc1RyYW5zYWN0aW9uU2VydmljZSxcbiAgICBwcml2YXRlIHRvYXN0U2VydmljZTogVG9hc3RTZXJ2aWNlLFxuICAgIEBPcHRpb25hbCgpIEBJbmplY3QoRkxPV19DVVNUT01JWkFUSU9OKSBwcml2YXRlIGN1c3RvbWl6YXRpb25TZXJ2aWNlPzogRmxvd0N1c3RvbWl6YXRpb24sXG4gICkge1xuICAgIHRoaXMuc3RhdGVmdWxFeGVjdXRpb25SZXF1ZXN0JCA9IHRoaXMuaW5pdEJ1ZmZlcmVkUmVxdWVzdCQoKTtcblxuICAgIC8qXG4gICAgICBJbiBzdGF0ZWxlc3MgbW9kZSB3YXRjaCBTdGF0ZSBjaGFuZ2VzIGFuZCBjYWxsIGV4ZWN1dGVSZXF1ZXN0IHNvIHRoYXRcbiAgICAgIGFsbCBzdWJzY3JpcHRpb25zIGdldCB0aGVpciB1cGRhdGVzIGFjY29yZGluZyB0byB1cGRhdGVkIFN0YXRlXG4gICAgKi9cbiAgICB0aGlzLmlzSW5pdGlhbGl6ZWQkKClcbiAgICAgIC5waXBlKFxuICAgICAgICBmaWx0ZXIoQm9vbGVhbiksXG4gICAgICAgIGZpbHRlcigoKSA9PiAhdGhpcy5mbG93SW5mb1NlcnZpY2UuZmxvdy5wcm9wZXJ0aWVzLnN0YXRlZnVsKSxcbiAgICAgICAgc3dpdGNoTWFwKCgpID0+IHRoaXMuZmxvd0NvbmZpZ3VyYXRpb24udXBkYXRlZCQpLFxuICAgICAgICBzd2l0Y2hNYXAoKCkgPT4gdGhpcy5leGVjdXRlUmVxdWVzdCQoe30sIHRydWUpKSxcbiAgICAgIClcbiAgICAgIC5zdWJzY3JpYmUoKTtcbiAgfVxuXG4gIHB1YmxpYyBpbml0JCgpOiBPYnNlcnZhYmxlPHZvaWQ+IHtcbiAgICBpZiAodGhpcy5mbG93SW5mb1NlcnZpY2UuZmxvdy5wcm9wZXJ0aWVzLnN0YXRlZnVsKSB7XG4gICAgICByZXR1cm4gdGhpcy5pbml0UHJvY2Vzc29ycyQoKS5waXBlKHN3aXRjaE1hcCgoKSA9PiB0aGlzLmluaXRTdGF0ZWZ1bCQoKSkpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gZm9ya0pvaW4oW3RoaXMuaW5pdFN0YXRlbGVzcyQoKSwgdGhpcy5pbml0UHJvY2Vzc29ycyQoKV0pLnBpcGUobWFwKG5vb3ApKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgcmVzZXQoKTogdm9pZCB7XG4gICAgT2JqZWN0LnZhbHVlcyh0aGlzLnN1YnNjcmlwdGlvbnMpLmZvckVhY2goKHsgZGF0YSQgfSkgPT4gZGF0YSQuY29tcGxldGUoKSk7XG4gICAgdGhpcy5zdWJzY3JpcHRpb25zID0ge307XG5cbiAgICBpZiAodGhpcy5zdGF0ZUlkJC52YWx1ZSkge1xuICAgICAgdGhpcy5mbG93U3RhdGVBcGlTZXJ2aWNlLmNhbmNlbCh0aGlzLnN0YXRlSWQkLnZhbHVlKS5zdWJzY3JpYmUoKTtcbiAgICAgIHRoaXMuc3RhdGVJZCQubmV4dChudWxsKTtcbiAgICB9XG5cbiAgICB0aGlzLnByb2Nlc3NvcnMgPSB7fTtcbiAgICB0aGlzLmZsb3dTdG9yZSA9IHt9O1xuICAgIHRoaXMuY2xlYW51cCQubmV4dCgpO1xuICB9XG5cbiAgcHVibGljIGdldCBoYXNVbnNhdmVkQ2hhbmdlcygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5mbG93SW5mb1NlcnZpY2UuZmxvdy5wcm9wZXJ0aWVzLnN0YXRlZnVsXG4gICAgICA/IEFycmF5LmZyb20odGhpcy50cmFja2VkU3RhdGVmdWxDaGFuZ2VzTWFwLnZhbHVlcygpKS5zb21lKEJvb2xlYW4pXG4gICAgICA6IHRoaXMuc2FsZXNUcmFuc2FjdGlvblNlcnZpY2UuaGFzVW5zYXZlZENoYW5nZXM7XG4gIH1cblxuICBwdWJsaWMgZ2V0IHN0YXRlSWQoKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMuc3RhdGVJZCQudmFsdWU7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGlzRXhlY3V0aW9uSW5Qcm9ncmVzcyQoKSB7XG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0aW9uSW5Qcm9ncmVzcyQuYXNPYnNlcnZhYmxlKCk7XG4gIH1cblxuICBwdWJsaWMgaXNJbml0aWFsaXplZCQoKTogT2JzZXJ2YWJsZTxib29sZWFuPiB7XG4gICAgcmV0dXJuIGNvbWJpbmVMYXRlc3QoW3RoaXMuc3RhdGVJZCQsIHRoaXMuc2FsZXNUcmFuc2FjdGlvblNlcnZpY2UuaXNJbml0aWFsaXplZCRdKS5waXBlKFxuICAgICAgbWFwKHZhbHVlcyA9PiB2YWx1ZXMuc29tZShCb29sZWFuKSksXG4gICAgKTtcbiAgfVxuXG4gIHB1YmxpYyBpc0luaXRpYWxpemVkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBCb29sZWFuKHRoaXMuc3RhdGVJZCQudmFsdWUpIHx8IHRoaXMuc2FsZXNUcmFuc2FjdGlvblNlcnZpY2UuaXNJbml0aWFsaXplZDtcbiAgfVxuXG4gIHB1YmxpYyBleGVjdXRlJChcbiAgICBzY29wZTogVUlUZW1wbGF0ZVR5cGUsXG4gICAgZXhlYzogRmxvd1N0YXRlRXhlY3V0aW9uUmVxdWVzdCxcbiAgKTogT2JzZXJ2YWJsZTxGbG93U3RhdGVFeGVjdXRpb25SZXN1bHRbJ3NlbGVjdG9ycyddPiB7XG4gICAgY29uc3QgcmVxdWVzdCA9IHRoaXMuZXhlY1RvUmVxdWVzdChzY29wZSwgZXhlYyk7XG5cbiAgICByZXR1cm4gdGhpcy5leGVjdXRlUmVxdWVzdCQocmVxdWVzdCkucGlwZShcbiAgICAgIG1hcChyZXN1bHQgPT4ge1xuICAgICAgICAvLyBLZWVwIG9ubHkgcmVxdWVzdGVkIHJlc3VsdHNcbiAgICAgICAgY29uc3QgYWN0dWFsU2VsZWN0b3JzID0gT2JqZWN0LmVudHJpZXMocmVzdWx0LnNlbGVjdG9ycykucmVkdWNlKFxuICAgICAgICAgICh0cnVuazogUmVjb3JkPHN0cmluZywgRmxvd1N0YXRlU2VsZWN0b3JSZXNwb25zZT4sIFtyZXF1ZXN0SWQsIHJlc3VsdF0pID0+IHtcbiAgICAgICAgICAgIGlmIChleGVjLnNlbGVjdG9ycz8uW3JlcXVlc3RJZF0pIHtcbiAgICAgICAgICAgICAgdHJ1bmtbcmVxdWVzdElkXSA9IHJlc3VsdDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB0cnVuaztcbiAgICAgICAgICB9LFxuICAgICAgICAgIHt9LFxuICAgICAgICApO1xuXG4gICAgICAgIHJldHVybiBhY3R1YWxTZWxlY3RvcnM7XG4gICAgICB9KSxcbiAgICApO1xuICB9XG5cbiAgcHVibGljIGRpc3BhdGNoJChzY29wZTogVUlUZW1wbGF0ZVR5cGUsIGFjdGlvbjogc3RyaW5nLCBpbnB1dERhdGE/OiB1bmtub3duKTogT2JzZXJ2YWJsZTx2b2lkPiB7XG4gICAgY29uc3QgZXhlYzogRmxvd1N0YXRlRXhlY3V0aW9uUmVxdWVzdCA9IHtcbiAgICAgIGFjdGlvbnM6IFt7IG5hbWU6IGFjdGlvbiwgaW5wdXREYXRhIH1dLFxuICAgIH07XG4gICAgY29uc3QgcmVxdWVzdCA9IHRoaXMuZXhlY1RvUmVxdWVzdChzY29wZSwgZXhlYyk7XG5cbiAgICByZXR1cm4gdGhpcy5leGVjdXRlUmVxdWVzdCQocmVxdWVzdCkucGlwZShtYXAobm9vcCkpO1xuICB9XG5cbiAgcHVibGljIHNlbGVjdCQ8UmVzcG9uc2UgPSB1bmtub3duPihcbiAgICBzY29wZTogVUlUZW1wbGF0ZVR5cGUsXG4gICAgc2VsZWN0b3JOYW1lOiBzdHJpbmcsXG4gICAgaW5wdXREYXRhPzogdW5rbm93bixcbiAgKTogT2JzZXJ2YWJsZTxGbG93U3RhdGVTZWxlY3RvclJlc3BvbnNlPFJlc3BvbnNlPj4ge1xuICAgIGNvbnN0IHJlcXVlc3RJZCA9IHRoaXMuZ2VuZXJhdGVSZXF1ZXN0SWQoc2NvcGUsIHNlbGVjdG9yTmFtZSwgaW5wdXREYXRhKTtcbiAgICBjb25zdCByZXF1ZXN0ID0gdGhpcy5leGVjVG9SZXF1ZXN0KHNjb3BlLCB7XG4gICAgICBzZWxlY3RvcnM6IHtcbiAgICAgICAgW3JlcXVlc3RJZF06IHtcbiAgICAgICAgICBuYW1lOiBzZWxlY3Rvck5hbWUsXG4gICAgICAgICAgaW5wdXREYXRhLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICB9KTtcblxuICAgIHJldHVybiB0aGlzLmV4ZWN1dGVSZXF1ZXN0JChyZXF1ZXN0KS5waXBlKFxuICAgICAgbWFwKHJlc3BvbnNlID0+IHJlc3BvbnNlLnNlbGVjdG9yc1tyZXF1ZXN0SWRdIGFzIEZsb3dTdGF0ZVNlbGVjdG9yUmVzcG9uc2U8UmVzcG9uc2U+KSxcbiAgICApO1xuICB9XG5cbiAgcHVibGljIHN1YnNjcmliZSQ8UmVzcG9uc2UgPSB1bmtub3duPihcbiAgICBzY29wZTogVUlUZW1wbGF0ZVR5cGUsXG4gICAgc2VsZWN0b3JOYW1lOiBzdHJpbmcsXG4gICAgaW5wdXREYXRhPzogdW5rbm93bixcbiAgICBvcHRpb25zPzogRmxvd1N0YXRlU3Vic2NyaXB0aW9uT3B0aW9ucyxcbiAgKTogT2JzZXJ2YWJsZTxGbG93U3RhdGVTZWxlY3RvclJlc3BvbnNlPFJlc3BvbnNlPj4ge1xuICAgIGNvbnN0IHJlcXVlc3RJZCA9IHRoaXMuZ2VuZXJhdGVSZXF1ZXN0SWQoc2NvcGUsIHNlbGVjdG9yTmFtZSwgaW5wdXREYXRhKTtcblxuICAgIGxldCBzdWJzY3JpcHRpb24gPSB0aGlzLnN1YnNjcmlwdGlvbnNbcmVxdWVzdElkXTtcblxuICAgIGlmICghc3Vic2NyaXB0aW9uKSB7XG4gICAgICBjb25zdCByZXF1ZXN0ID0gdGhpcy5leGVjVG9SZXF1ZXN0KHNjb3BlLCB7XG4gICAgICAgIHNlbGVjdG9yczoge1xuICAgICAgICAgIFtyZXF1ZXN0SWRdOiB7XG4gICAgICAgICAgICBuYW1lOiBzZWxlY3Rvck5hbWUsXG4gICAgICAgICAgICBpbnB1dERhdGEsXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuXG4gICAgICBzdWJzY3JpcHRpb24gPSB7XG4gICAgICAgIHJlcXVlc3QsXG4gICAgICAgIGRhdGEkOiBuZXcgQmVoYXZpb3JTdWJqZWN0PHVua25vd24+KHRoaXMuTk9UX0lOSVRJQUxJWkVEKSxcbiAgICAgIH07XG5cbiAgICAgIHRoaXMuc3Vic2NyaXB0aW9uc1tyZXF1ZXN0SWRdID0gc3Vic2NyaXB0aW9uO1xuXG4gICAgICBpZiAob3B0aW9ucz8udHJhY2tlZENoYW5nZXMpIHtcbiAgICAgICAgdGhpcy50cmFja2VkU3RhdGVmdWxDaGFuZ2VzTWFwLnNldChyZXF1ZXN0SWQsIGZhbHNlKTtcbiAgICAgIH1cblxuICAgICAgaWYgKCFvcHRpb25zPy5jb2xkKSB7XG4gICAgICAgIHRoaXMuZXhlY3V0ZVJlcXVlc3QkKHJlcXVlc3QpLnN1YnNjcmliZSgpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBzdWJzY3JpcHRpb24uZGF0YSQucGlwZShcbiAgICAgIGZpbHRlcihkYXRhID0+IGRhdGEgIT0gdGhpcy5OT1RfSU5JVElBTElaRUQpLFxuICAgICAgbWFwKGRhdGEgPT4gZGF0YSBhcyBGbG93U3RhdGVTZWxlY3RvclJlc3BvbnNlPFJlc3BvbnNlPiksXG4gICAgICBmaW5hbGl6ZSgoKSA9PiB7XG4gICAgICAgIGlmICghdGhpcy5zdWJzY3JpcHRpb25zW3JlcXVlc3RJZF0/LmRhdGEkLm9ic2VydmVkKSB7XG4gICAgICAgICAgZGVsZXRlIHRoaXMuc3Vic2NyaXB0aW9uc1tyZXF1ZXN0SWRdO1xuICAgICAgICB9XG4gICAgICB9KSxcbiAgICApO1xuICB9XG5cbiAgcHVibGljIHNhdmUkKCk6IE9ic2VydmFibGU8eyBpZDogc3RyaW5nIH0+IHtcbiAgICBpZiAodGhpcy5mbG93SW5mb1NlcnZpY2UuZmxvdy5wcm9wZXJ0aWVzLnN0YXRlZnVsKSB7XG4gICAgICBpZiAodGhpcy5zdGF0ZUlkJC52YWx1ZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5mbG93U3RhdGVBcGlTZXJ2aWNlLnNhdmUodGhpcy5zdGF0ZUlkJC52YWx1ZSkucGlwZShcbiAgICAgICAgICBtYXAoKHsgcXVvdGVJZCB9KSA9PiAoeyBpZDogcXVvdGVJZCB9KSksXG4gICAgICAgICAgdGFwKCgpID0+IHtcbiAgICAgICAgICAgIEFycmF5LmZyb20odGhpcy50cmFja2VkU3RhdGVmdWxDaGFuZ2VzTWFwLmtleXMoKSkuZm9yRWFjaChrZXkgPT4ge1xuICAgICAgICAgICAgICB0aGlzLnRyYWNrZWRTdGF0ZWZ1bENoYW5nZXNNYXAuc2V0KGtleSwgZmFsc2UpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSksXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IHN0YXRlID0gdGhpcy5zYWxlc1RyYW5zYWN0aW9uU2VydmljZS5zdGF0ZTtcbiAgICAgIGlmIChzdGF0ZSkge1xuICAgICAgICBjb25zdCByZXF1ZXN0OiBTYWxlc1RyYW5zYWN0aW9uVXBzZXJ0UmVxdWVzdCA9IHtcbiAgICAgICAgICB0cmFuc2FjdGlvbkNvbnRleHQ6IHN0YXRlLFxuICAgICAgICAgIGZsb3dJZDogdGhpcy5mbG93SW5mb1NlcnZpY2UuZmxvdy5pZCxcbiAgICAgICAgfTtcblxuICAgICAgICByZXR1cm4gdGhpcy5zYWxlc1RyYW5zYWN0aW9uQXBpU2VydmljZS5zYXZlKHJlcXVlc3QpLnBpcGUobWFwKGlkID0+ICh7IGlkIH0pKSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIG9mKHsgaWQ6ICcnIH0pO1xuICB9XG5cbiAgcHVibGljIGdldEZsb3dTdG9yZSgpOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB7XG4gICAgcmV0dXJuIHRoaXMuZmxvd1N0b3JlO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRPd25lcklkQnlTY29wZShzY29wZTogVUlUZW1wbGF0ZVR5cGUpOiBzdHJpbmcge1xuICAgIGNvbnN0IG93bmVySWQgPSB0aGlzLmZsb3dJbmZvU2VydmljZS50ZW1wbGF0ZXNbc2NvcGVdPy5pZDtcbiAgICBpZiAoIW93bmVySWQpIHtcbiAgICAgIHRocm93IGBPd25lcklkIGlzIG5vdCBmb3VuZCBmb3Igc2NvcGUgJHtzY29wZX1gO1xuICAgIH1cblxuICAgIHJldHVybiBvd25lcklkO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRTY29wZUJ5T3duZXJJZChpZDogc3RyaW5nKTogVUlUZW1wbGF0ZVR5cGUgfCB1bmRlZmluZWQge1xuICAgIGZvciAoY29uc3QgdGVtcGxhdGUgb2YgT2JqZWN0LnZhbHVlcyh0aGlzLmZsb3dJbmZvU2VydmljZS50ZW1wbGF0ZXMpKSB7XG4gICAgICBpZiAodGVtcGxhdGUuaWQgPT09IGlkKSB7XG4gICAgICAgIHJldHVybiB0ZW1wbGF0ZS50eXBlO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybjtcbiAgfVxuXG4gIHByaXZhdGUgZXhlY1RvUmVxdWVzdChzY29wZTogVUlUZW1wbGF0ZVR5cGUsIGV4ZWM6IEZsb3dTdGF0ZUV4ZWN1dGlvblJlcXVlc3QpOiBGbG93U3RhdGVFeGVjdXRpb25SZXF1ZXN0RFRPIHtcbiAgICBjb25zdCBvd25lcklkID0gdGhpcy5nZXRPd25lcklkQnlTY29wZShzY29wZSk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgYWN0aW9uczogZXhlYy5hY3Rpb25zPy5tYXAoYWN0aW9uID0+ICh7IGFwaU5hbWU6IGFjdGlvbi5uYW1lLCBvd25lcklkLCBpbnB1dERhdGE6IGFjdGlvbi5pbnB1dERhdGEgPz8ge30gfSkpLFxuICAgICAgc2VsZWN0b3JzOlxuICAgICAgICBleGVjLnNlbGVjdG9ycyAmJlxuICAgICAgICBPYmplY3QuZW50cmllcyhleGVjLnNlbGVjdG9ycykucmVkdWNlKFxuICAgICAgICAgICh0cnVuazogUmVjb3JkPHN0cmluZywgRmxvd1N0YXRlRXhlY3V0YWJsZURUTz4sIFtrZXksIHNlbGVjdG9yXSkgPT4gKHtcbiAgICAgICAgICAgIC4uLnRydW5rLFxuICAgICAgICAgICAgW2tleV06IHsgYXBpTmFtZTogc2VsZWN0b3IubmFtZSwgb3duZXJJZCwgaW5wdXREYXRhOiBzZWxlY3Rvci5pbnB1dERhdGEgPz8ge30gfSxcbiAgICAgICAgICB9KSxcbiAgICAgICAgICB7fSxcbiAgICAgICAgKSxcbiAgICB9O1xuICB9XG5cbiAgcHVibGljIGV4ZWN1dGVSZXF1ZXN0JChcbiAgICByZXF1ZXN0OiBGbG93U3RhdGVFeGVjdXRpb25SZXF1ZXN0RFRPLFxuICAgIGZvcmNlU3Vic2NyaXB0aW9uczogYm9vbGVhbiA9IGZhbHNlLFxuICApOiBPYnNlcnZhYmxlPEZsb3dTdGF0ZUV4ZWN1dGlvblJlc3VsdD4ge1xuICAgIGNvbnN0IGZ1bGxSZXF1ZXN0ID0gY2xvbmVEZWVwKHJlcXVlc3QpO1xuICAgIGlmIChmdWxsUmVxdWVzdC5hY3Rpb25zPy5sZW5ndGggfHwgZm9yY2VTdWJzY3JpcHRpb25zKSB7XG4gICAgICBmb3IgKGNvbnN0IHN1YnNjcmlwdGlvbiBvZiBPYmplY3QudmFsdWVzKHRoaXMuc3Vic2NyaXB0aW9ucykpIHtcbiAgICAgICAgZnVsbFJlcXVlc3Quc2VsZWN0b3JzID0gYXNzaWduKGZ1bGxSZXF1ZXN0LnNlbGVjdG9ycywgc3Vic2NyaXB0aW9uLnJlcXVlc3Quc2VsZWN0b3JzKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBleGVjdXRpb24kID0gdGhpcy5mbG93SW5mb1NlcnZpY2UuZmxvdy5wcm9wZXJ0aWVzLnN0YXRlZnVsXG4gICAgICA/IHRoaXMuZXhlY3V0ZVN0YXRlZnVsJChmdWxsUmVxdWVzdClcbiAgICAgIDogdGhpcy5leGVjdXRlU3RhdGVsZXNzJChmdWxsUmVxdWVzdCk7XG5cbiAgICByZXR1cm4gZXhlY3V0aW9uJC5waXBlKHRhcChyZXN1bHQgPT4gdGhpcy5oYW5kbGVTZWxlY3RvcnNSZXNwb25zZShyZXN1bHQuc2VsZWN0b3JzKSkpO1xuICB9XG5cbiAgcHJpdmF0ZSBoYW5kbGVTZWxlY3RvcnNSZXNwb25zZShzZWxlY3RvcnM6IFJlY29yZDxzdHJpbmcsIEZsb3dTdGF0ZVNlbGVjdG9yUmVzcG9uc2U8dW5rbm93bj4+KTogdm9pZCB7XG4gICAgT2JqZWN0LmVudHJpZXMoc2VsZWN0b3JzKS5mb3JFYWNoKChbcmVxdWVzdElkLCBzZWxlY3RvclJlc3VsdF0pID0+IHtcbiAgICAgIGlmICghc2VsZWN0b3JSZXN1bHQuc3VjY2Vzcykge1xuICAgICAgICB0aGlzLnRvYXN0U2VydmljZS5hZGQoeyBzZXZlcml0eTogVG9hc3RUeXBlLmVycm9yLCBzdW1tYXJ5OiBzZWxlY3RvclJlc3VsdC5lcnJvck1lc3NhZ2UgfSk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHN1YnNjcmlwdGlvbiQgPSB0aGlzLnN1YnNjcmlwdGlvbnNbcmVxdWVzdElkXT8uZGF0YSQ7XG4gICAgICBpZiAoc3Vic2NyaXB0aW9uJCAmJiBzdWJzY3JpcHRpb24kLnZhbHVlICE9PSBzZWxlY3RvclJlc3VsdCkge1xuICAgICAgICB0aGlzLmNoZWNrU3RhdGVmdWxDaGFuZ2VzKHJlcXVlc3RJZCwgc2VsZWN0b3JSZXN1bHQpO1xuICAgICAgICBzdWJzY3JpcHRpb24kLm5leHQoc2VsZWN0b3JSZXN1bHQpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBpbml0U3RhdGVmdWwkKCk6IE9ic2VydmFibGU8dm9pZD4ge1xuICAgIGNvbnN0IHByb2Nlc3NvcnNMaXN0ID0gZmxhdHRlbihPYmplY3QudmFsdWVzKHRoaXMucHJvY2Vzc29ycykubWFwKG93bmVyTWFwID0+IE9iamVjdC52YWx1ZXMob3duZXJNYXAgPz8ge30pKSk7XG4gICAgY29uc3QgcHJvY2Vzc29ycyA9IHByb2Nlc3NvcnNMaXN0Lmxlbmd0aCA/IHByb2Nlc3NvcnNMaXN0IDogdW5kZWZpbmVkO1xuICAgIGNvbnN0IHNlbGVjdG9ycyA9IE9iamVjdC52YWx1ZXModGhpcy5zdWJzY3JpcHRpb25zKVxuICAgICAgLm1hcCgoeyByZXF1ZXN0IH0pID0+IHJlcXVlc3Quc2VsZWN0b3JzKVxuICAgICAgLmZpbHRlcihpc0RlZmluZWQpXG4gICAgICAucmVkdWNlKCh0cnVuaywgc2VsZWN0b3JzKSA9PiAoeyAuLi50cnVuaywgLi4uc2VsZWN0b3JzIH0pLCB7fSk7XG5cbiAgICByZXR1cm4gdGhpcy5mbG93U3RhdGVBcGlTZXJ2aWNlXG4gICAgICAuaW5pdCh7XG4gICAgICAgIHF1b3RlSWQ6IHRoaXMuZmxvd0luZm9TZXJ2aWNlLmNvbnRleHQuaGVhZGVySWQsXG4gICAgICAgIHBhcmFtczogdGhpcy5mbG93SW5mb1NlcnZpY2UuY29udGV4dCxcbiAgICAgICAgYWN0aW9uc092ZXJyaWRlOiBwcm9jZXNzb3JzPy5maWx0ZXIocHJvY2Vzc29yID0+IHByb2Nlc3Nvci50eXBlID09PSBDb25maWd1cmF0aW9uUHJvY2Vzc29yVHlwZXMuQUNUSU9OKSxcbiAgICAgICAgc2VsZWN0b3JzT3ZlcnJpZGU6IHByb2Nlc3NvcnM/LmZpbHRlcihwcm9jZXNzb3IgPT4gcHJvY2Vzc29yLnR5cGUgPT09IENvbmZpZ3VyYXRpb25Qcm9jZXNzb3JUeXBlcy5TRUxFQ1RPUiksXG4gICAgICAgIHNlbGVjdG9yczogc2VsZWN0b3JzLFxuICAgICAgfSlcbiAgICAgIC5waXBlKFxuICAgICAgICBtYXAoKHsgc3RhdGVJZCwgc2VsZWN0b3JzIH0pID0+IHtcbiAgICAgICAgICB0aGlzLmhhbmRsZVNlbGVjdG9yc1Jlc3BvbnNlKHNlbGVjdG9ycyk7XG4gICAgICAgICAgdGhpcy5zdGF0ZUlkJC5uZXh0KHN0YXRlSWQpO1xuICAgICAgICB9KSxcbiAgICAgICk7XG4gIH1cblxuICBwcml2YXRlIGluaXRCdWZmZXJlZFJlcXVlc3QkKCkge1xuICAgIHJldHVybiB0aGlzLnN0YXRlZnVsUmVxdWVzdFN0cmVhbSQucGlwZShcbiAgICAgIGJ1ZmZlcih0aGlzLnN0YXRlZnVsUmVxdWVzdFN0cmVhbSQucGlwZShkZWJvdW5jZVRpbWUodGhpcy5FWEVDVVRJT05fQlVGRkVSX1RJTUUpKSksXG4gICAgICBzd2l0Y2hNYXAocmVxdWVzdHMgPT4ge1xuICAgICAgICBpZiAoIXRoaXMuc3RhdGVJZCQudmFsdWUpIHtcbiAgICAgICAgICB0aHJvdyAnU3RhdGVmdWwgc2Vzc2lvbiBpcyBub3QgaW5pdGlhbGl6ZWQnO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gbWVyZ2UgYnVmZmVyZWQgcmVxdWVzdHNcbiAgICAgICAgY29uc3QgcmVxdWVzdDogRmxvd1N0YXRlRXhlY3V0aW9uUmVxdWVzdERUTyA9IHtcbiAgICAgICAgICBhY3Rpb25zOiByZXF1ZXN0cy5mbGF0TWFwKCh7IGFjdGlvbnMgfSkgPT4gYWN0aW9ucykuZmlsdGVyKGlzRGVmaW5lZCksXG4gICAgICAgICAgc2VsZWN0b3JzOiByZXF1ZXN0c1xuICAgICAgICAgICAgLm1hcCgoeyBzZWxlY3RvcnMgfSkgPT4gc2VsZWN0b3JzKVxuICAgICAgICAgICAgLmZpbHRlcihpc0RlZmluZWQpXG4gICAgICAgICAgICAucmVkdWNlKChhY2MsIHNlbGVjdG9yc01hcCkgPT4gT2JqZWN0LmFzc2lnbihhY2MsIHNlbGVjdG9yc01hcCksIHt9KSxcbiAgICAgICAgfTtcblxuICAgICAgICB0aGlzLmV4ZWN1dGlvbkluUHJvZ3Jlc3MkLm5leHQodHJ1ZSk7XG4gICAgICAgIHJldHVybiB0aGlzLmZsb3dTdGF0ZUFwaVNlcnZpY2UuZXhlY3V0ZSh0aGlzLnN0YXRlSWQkLnZhbHVlLCByZXF1ZXN0KTtcbiAgICAgIH0pLFxuICAgICAgdGFwKCh7IHN0YXRlSWQgfSkgPT4gdGhpcy5zdGF0ZUlkJC5uZXh0KHN0YXRlSWQpKSxcbiAgICAgIHNoYXJlKCksXG4gICAgICB0YXAoKCkgPT4gdGhpcy5leGVjdXRpb25JblByb2dyZXNzJC5uZXh0KGZhbHNlKSksXG4gICAgICBjYXRjaEVycm9yKGUgPT4ge1xuICAgICAgICB0aGlzLmV4ZWN1dGlvbkluUHJvZ3Jlc3MkLm5leHQoZmFsc2UpO1xuICAgICAgICByZXR1cm4gdGhyb3dFcnJvcigoKSA9PiBlKTtcbiAgICAgIH0pLFxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIGV4ZWN1dGVTdGF0ZWZ1bCQocmVxdWVzdDogRmxvd1N0YXRlRXhlY3V0aW9uUmVxdWVzdERUTyk6IE9ic2VydmFibGU8Rmxvd1N0YXRlRXhlY3V0aW9uUmVzdWx0PiB7XG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0aW9uSW5Qcm9ncmVzcyQucGlwZShcbiAgICAgIGZpbHRlcihpblByb2dyZXNzID0+ICFpblByb2dyZXNzKSxcbiAgICAgIHRha2UoMSksXG4gICAgICBzd2l0Y2hNYXAoKCkgPT5cbiAgICAgICAgLy8gbWFrZSBzdXJlIHN0cmVhbSBzd2l0Y2hlcyB0byBzdGF0ZWZ1bEV4ZWN1dGlvblJlcXVlc3QkIGJlZm9yZSBwdXNoaW5nIGFuIGV4ZWN1dGlvbiByZXF1ZXN0XG4gICAgICAgIGNvbWJpbmVMYXRlc3QoW1xuICAgICAgICAgIHRoaXMuc3RhdGVmdWxFeGVjdXRpb25SZXF1ZXN0JCxcbiAgICAgICAgICBvZih1bmRlZmluZWQpLnBpcGUodGFwKCgpID0+IHRoaXMuc3RhdGVmdWxSZXF1ZXN0U3RyZWFtJC5uZXh0KHJlcXVlc3QpKSksXG4gICAgICAgIF0pLFxuICAgICAgKSxcbiAgICAgIG1hcCgoW3Jlc3BvbnNlXSkgPT4gcmVzcG9uc2UpLFxuICAgICAgdGFrZSgxKSxcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBpbml0U3RhdGVsZXNzJCgpOiBPYnNlcnZhYmxlPHZvaWQ+IHtcbiAgICByZXR1cm4gdGhpcy5zYWxlc1RyYW5zYWN0aW9uU2VydmljZS5pbml0KHRoaXMuZmxvd0luZm9TZXJ2aWNlLmNvbnRleHQuaGVhZGVySWQsIHRoaXMuZmxvd0luZm9TZXJ2aWNlLmNvbnRleHQpLnBpcGUoXG4gICAgICBzd2l0Y2hNYXAoc3RhdGUgPT4gdGhpcy5mbG93Q29uZmlndXJhdGlvbi5jYWxjdWxhdGUkKHN0YXRlKSksXG4gICAgICB0YXAoKCkgPT4gdGhpcy5zYWxlc1RyYW5zYWN0aW9uU2VydmljZS5maW5hbGl6ZUluaXQoKSksXG4gICAgICBtYXAobm9vcCksXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgZXhlY3V0ZVN0YXRlbGVzcyQocmVxdWVzdDogRmxvd1N0YXRlRXhlY3V0aW9uUmVxdWVzdERUTyk6IE9ic2VydmFibGU8Rmxvd1N0YXRlRXhlY3V0aW9uUmVzdWx0PiB7XG4gICAgdGhpcy5leGVjdXRpb25JblByb2dyZXNzJC5uZXh0KHRydWUpO1xuXG4gICAgcmV0dXJuIG9mKHVuZGVmaW5lZCkucGlwZShcbiAgICAgIHRhcCgoKSA9PiB0aGlzLmV4ZWN1dGVTdGF0ZWxlc3NBY3Rpb25zKHJlcXVlc3QpKSxcbiAgICAgIHN3aXRjaE1hcCgoKSA9PiB7XG4gICAgICAgIC8qXG4gICAgICAgICAgU2tpcCBwcmljZSBjYWxjdWxhdGlvbiBpbiBjYXNlXG4gICAgICAgICAgMS4gTm8gYWN0aW9ucyBpbiB0aGUgcmVxdWVzdFxuICAgICAgICAgIDIuIEluaXRpYWxpemF0aW9uIHByb2Nlc3MgZXhlY3V0aW9uIChzdGF0ZSBub3QgaW5pdGlhbGl6ZWQgeWV0KVxuICAgICAgICAqL1xuICAgICAgICBjb25zdCB7IHN0YXRlIH0gPSB0aGlzLnNhbGVzVHJhbnNhY3Rpb25TZXJ2aWNlO1xuICAgICAgICBpZiAoIXN0YXRlIHx8ICFyZXF1ZXN0LmFjdGlvbnM/Lmxlbmd0aCB8fCAhdGhpcy5pc0luaXRpYWxpemVkKCkpIHtcbiAgICAgICAgICByZXR1cm4gb2YodW5kZWZpbmVkKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5mbG93Q29uZmlndXJhdGlvbi5jYWxjdWxhdGUkKHN0YXRlKTtcbiAgICAgICAgfVxuICAgICAgfSksXG4gICAgICBtYXAoKCkgPT4gdGhpcy5leGVjdXRlU3RhdGVsZXNzU2VsZWN0b3JzKHJlcXVlc3QpKSxcbiAgICAgIHRhcCgoKSA9PiB0aGlzLmV4ZWN1dGlvbkluUHJvZ3Jlc3MkLm5leHQoZmFsc2UpKSxcbiAgICAgIGNhdGNoRXJyb3IoZSA9PiB7XG4gICAgICAgIHRoaXMuZXhlY3V0aW9uSW5Qcm9ncmVzcyQubmV4dChmYWxzZSk7XG4gICAgICAgIHJldHVybiB0aHJvd0Vycm9yKCgpID0+IGUpO1xuICAgICAgfSksXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgZXhlY3V0ZVN0YXRlbGVzc0FjdGlvbnMocmVxdWVzdDogRmxvd1N0YXRlRXhlY3V0aW9uUmVxdWVzdERUTyk6IHZvaWQge1xuICAgIGNvbnN0IHN0YXRlID0gdGhpcy5zYWxlc1RyYW5zYWN0aW9uU2VydmljZS5zdGF0ZTtcbiAgICBpZiAoIXN0YXRlIHx8ICFyZXF1ZXN0LmFjdGlvbnM/Lmxlbmd0aCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGxldCBmbG93U3RhdGUgPSBzdGF0ZTtcbiAgICByZXF1ZXN0LmFjdGlvbnMuZm9yRWFjaChhY3Rpb24gPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgZmxvd1N0YXRlID0gdGhpcy5leGVjdXRlQWN0aW9uU2NyaXB0KGZsb3dTdGF0ZSwgYWN0aW9uKSA/PyBmbG93U3RhdGU7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoZSk7XG4gICAgICAgIHRoaXMudG9hc3RTZXJ2aWNlLmFkZCh7IHNldmVyaXR5OiBUb2FzdFR5cGUuZXJyb3IsIHN1bW1hcnk6IFN0cmluZyhlKSB9KTtcbiAgICAgICAgdGhyb3cgZTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHRoaXMuc2FsZXNUcmFuc2FjdGlvblNlcnZpY2Uuc2V0U3RhdGUoZmxvd1N0YXRlKTtcbiAgfVxuXG4gIHByaXZhdGUgZXhlY3V0ZVN0YXRlbGVzc1NlbGVjdG9ycyhyZXF1ZXN0OiBGbG93U3RhdGVFeGVjdXRpb25SZXF1ZXN0RFRPKTogRmxvd1N0YXRlRXhlY3V0aW9uUmVzdWx0IHtcbiAgICBpZiAoIXRoaXMuc2FsZXNUcmFuc2FjdGlvblNlcnZpY2Uuc3RhdGUpIHtcbiAgICAgIHRocm93ICdTdGF0ZSBpcyBub3QgaW5pdGlhbGl6ZWQnO1xuICAgIH1cblxuICAgIGNvbnN0IGZsb3dTdGF0ZSA9IHRoaXMuc2FsZXNUcmFuc2FjdGlvblNlcnZpY2Uuc3RhdGU7XG4gICAgcmV0dXJuIEVudGl0eVV0aWwuZW50cmllcyhyZXF1ZXN0LnNlbGVjdG9ycyA/PyB7fSkucmVkdWNlKFxuICAgICAgKHJlc3VsdDogRmxvd1N0YXRlRXhlY3V0aW9uUmVzdWx0LCBba2V5LCBzZWxlY3Rvcl0pID0+IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICByZXN1bHQuc2VsZWN0b3JzW2tleV0gPSB7XG4gICAgICAgICAgICBzdWNjZXNzOiB0cnVlLFxuICAgICAgICAgICAgcmVzdWx0OiB0aGlzLmV4ZWN1dGVTZWxlY3RvclNjcmlwdChmbG93U3RhdGUsIHNlbGVjdG9yKSxcbiAgICAgICAgICB9O1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcihlKTtcbiAgICAgICAgICByZXN1bHQuc2VsZWN0b3JzW2tleV0gPSB7XG4gICAgICAgICAgICBzdWNjZXNzOiBmYWxzZSxcbiAgICAgICAgICAgIGVycm9yTWVzc2FnZTogU3RyaW5nKGUpLFxuICAgICAgICAgIH07XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgfSxcbiAgICAgIHsgc3RhdGVJZDogJycsIHNlbGVjdG9yczoge30gfSxcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBpbml0UHJvY2Vzc29ycyQoKTogT2JzZXJ2YWJsZTx2b2lkPiB7XG4gICAgY29uc3QgaGFzT3ZlcnJpZGVzID0gQm9vbGVhbih0aGlzLmN1c3RvbWl6YXRpb25TZXJ2aWNlPy5nZXRUZW1wbGF0ZUNvbmZpZ3VyYXRpb25Qcm9jZXNzb3JzKTtcbiAgICBpZiAodGhpcy5mbG93SW5mb1NlcnZpY2UuZmxvdy5wcm9wZXJ0aWVzLnN0YXRlZnVsICYmICFoYXNPdmVycmlkZXMpIHtcbiAgICAgIC8vIFNraXAgaW5pdGlhbGl6YXRpb24gYXMgYmFja2VuZCB3aWxsIHRha2UgcHJvY2Vzc29ycyBmcm9tIFNGXG4gICAgICByZXR1cm4gb2YodW5kZWZpbmVkKTtcbiAgICB9XG5cbiAgICBjb25zdCBvd25lcnMkID0gT2JqZWN0LnZhbHVlcyh0aGlzLmZsb3dJbmZvU2VydmljZS50ZW1wbGF0ZXMpXG4gICAgICAubWFwKHRlbXBsYXRlID0+IHtcbiAgICAgICAgaWYgKCF0ZW1wbGF0ZSkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGxvY2FsUHJvY2Vzc29ycyQgPVxuICAgICAgICAgIHRoaXMuY3VzdG9taXphdGlvblNlcnZpY2U/LmdldFRlbXBsYXRlQ29uZmlndXJhdGlvblByb2Nlc3NvcnM/Lih0ZW1wbGF0ZS5uYW1lKSA/PyBvZihudWxsKTtcblxuICAgICAgICByZXR1cm4gbG9jYWxQcm9jZXNzb3JzJC5waXBlKFxuICAgICAgICAgIHN3aXRjaE1hcChwcm9jZXNzb3JzID0+XG4gICAgICAgICAgICBwcm9jZXNzb3JzID8gb2YocHJvY2Vzc29ycykgOiB0aGlzLnByb2Nlc3NvcnNBcGlTZXJ2aWNlLmZldGNoQ29uZmlndXJhdGlvblByb2Nlc3NvcnMkKHRlbXBsYXRlLmlkKSxcbiAgICAgICAgICApLFxuICAgICAgICAgIHRhcChwcm9jZXNzb3JzID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHByb2Nlc3NvcnNNYXAgPSBwcm9jZXNzb3JzLnJlZHVjZSgoYWNjOiBSZWNvcmQ8c3RyaW5nLCBDb25maWd1cmF0aW9uUHJvY2Vzc29yPiwgcCkgPT4ge1xuICAgICAgICAgICAgICBhY2NbcC5hcGlOYW1lXSA9IHA7XG4gICAgICAgICAgICAgIHJldHVybiBhY2M7XG4gICAgICAgICAgICB9LCB7fSk7XG5cbiAgICAgICAgICAgIHRoaXMucHJvY2Vzc29yc1t0ZW1wbGF0ZS5pZF0gPSBwcm9jZXNzb3JzTWFwO1xuICAgICAgICAgIH0pLFxuICAgICAgICApO1xuICAgICAgfSlcbiAgICAgIC5maWx0ZXIoaXNEZWZpbmVkKTtcblxuICAgIGlmICghb3duZXJzJC5sZW5ndGgpIHtcbiAgICAgIHJldHVybiBvZih1bmRlZmluZWQpO1xuICAgIH1cblxuICAgIHJldHVybiBmb3JrSm9pbihvd25lcnMkKS5waXBlKG1hcChub29wKSk7XG4gIH1cblxuICBwcml2YXRlIGV4ZWN1dGVBY3Rpb25TY3JpcHQocmVxdWVzdDogRmxvd1N0YXRlLCBleGVjdXRhYmxlOiBGbG93U3RhdGVFeGVjdXRhYmxlRFRPKTogRmxvd1N0YXRlIHwgbnVsbCB7XG4gICAgY29uc3QgY29uZmlndXJhdGlvblByb2Nlc3NvciA9IHRoaXMucHJvY2Vzc29yc1tleGVjdXRhYmxlLm93bmVySWRdPy5bZXhlY3V0YWJsZS5hcGlOYW1lXTtcblxuICAgIGlmICghY29uZmlndXJhdGlvblByb2Nlc3Nvcj8uc2NyaXB0KSB7XG4gICAgICBjb25zdCBzY29wZSA9IHRoaXMuZ2V0U2NvcGVCeU93bmVySWQoZXhlY3V0YWJsZS5vd25lcklkKTtcbiAgICAgIGNvbnN0IHNjb3BlVGV4dCA9IHNjb3BlID8gYCBpbiAke3Njb3BlfWAgOiAnJztcbiAgICAgIHRocm93IGBDb25maWd1cmF0aW9uUHJvY2Vzc29yICR7ZXhlY3V0YWJsZS5hcGlOYW1lfSR7c2NvcGVUZXh0fSBub3QgZm91bmRgO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLmV4ZWN1dGVQcm9jZXNzb3JTY3JpcHQocmVxdWVzdCwgY29uZmlndXJhdGlvblByb2Nlc3NvciwgZXhlY3V0YWJsZS5pbnB1dERhdGEpIGFzIEZsb3dTdGF0ZTtcbiAgfVxuXG4gIHByaXZhdGUgZXhlY3V0ZVNlbGVjdG9yU2NyaXB0KHJlcXVlc3Q6IEZsb3dTdGF0ZSwgZXhlY3V0YWJsZTogRmxvd1N0YXRlRXhlY3V0YWJsZURUTyk6IHVua25vd24ge1xuICAgIGNvbnN0IGNvbmZpZ3VyYXRpb25Qcm9jZXNzb3IgPSB0aGlzLnByb2Nlc3NvcnNbZXhlY3V0YWJsZS5vd25lcklkXT8uW2V4ZWN1dGFibGUuYXBpTmFtZV07XG5cbiAgICBpZiAoIWNvbmZpZ3VyYXRpb25Qcm9jZXNzb3I/LnNjcmlwdCkge1xuICAgICAgY29uc3Qgc2NvcGUgPSB0aGlzLmdldFNjb3BlQnlPd25lcklkKGV4ZWN1dGFibGUub3duZXJJZCk7XG4gICAgICBjb25zdCBzY29wZVRleHQgPSBzY29wZSA/IGAgaW4gJHtzY29wZX1gIDogJyc7XG4gICAgICB0aHJvdyBgQ29uZmlndXJhdGlvblByb2Nlc3NvciAke2V4ZWN1dGFibGUuYXBpTmFtZX0ke3Njb3BlVGV4dH0gbm90IGZvdW5kYDtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5leGVjdXRlUHJvY2Vzc29yU2NyaXB0KHJlcXVlc3QsIGNvbmZpZ3VyYXRpb25Qcm9jZXNzb3IsIGV4ZWN1dGFibGUuaW5wdXREYXRhKTtcbiAgfVxuXG4gIHByaXZhdGUgZXhlY3V0ZVByb2Nlc3NvclNjcmlwdChcbiAgICByZXF1ZXN0OiBGbG93U3RhdGUsXG4gICAgY29uZmlndXJhdGlvblByb2Nlc3NvcjogQ29uZmlndXJhdGlvblByb2Nlc3NvcixcbiAgICBpbnB1dERhdGE6IHVua25vd24sXG4gICk6IHVua25vd24ge1xuICAgIGNvbnN0IHNjb3BlID0gdGhpcy5nZXRTY29wZUJ5T3duZXJJZChjb25maWd1cmF0aW9uUHJvY2Vzc29yLm93bmVySWQgPz8gJycpO1xuICAgIGxldCBmdW5jdGlvblRvRXhlY3V0ZSA9IHRoaXMuZXhlY3V0ZWRGdW5jdGlvbnNbc2NvcGUgKyBjb25maWd1cmF0aW9uUHJvY2Vzc29yLmFwaU5hbWVdO1xuXG4gICAgaWYgKCFmdW5jdGlvblRvRXhlY3V0ZSkge1xuICAgICAgY29uc3Qgc2NyaXB0ID0gYCR7Y29uZmlndXJhdGlvblByb2Nlc3Nvci5zY3JpcHR9XFxucmV0dXJuIHRyYW5zZm9ybTtgO1xuICAgICAgY29uc3Qgc291cmNlTWFwID0gYFxcbi8vIyBzb3VyY2VVUkw9JHtzY29wZSA/IHNjb3BlICsgJy8nIDogJyd9JHtjb25maWd1cmF0aW9uUHJvY2Vzc29yLmFwaU5hbWV9LmpzYDtcbiAgICAgIGZ1bmN0aW9uVG9FeGVjdXRlID0gbmV3IEZ1bmN0aW9uKHNjcmlwdCArIHNvdXJjZU1hcCkoKSBhcyBDb25maWd1cmF0aW9uUHJvY2Vzc29yU2NyaXB0Rm47XG4gICAgICB0aGlzLmV4ZWN1dGVkRnVuY3Rpb25zW3Njb3BlICsgY29uZmlndXJhdGlvblByb2Nlc3Nvci5hcGlOYW1lXSA9IGZ1bmN0aW9uVG9FeGVjdXRlO1xuICAgIH1cblxuICAgIHJldHVybiBmdW5jdGlvblRvRXhlY3V0ZSh7XG4gICAgICByZXF1ZXN0LFxuICAgICAgaW5wdXREYXRhLFxuICAgICAgZmxvd1N0b3JlOiB0aGlzLmZsb3dTdG9yZSxcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgZ2VuZXJhdGVSZXF1ZXN0SWQoc2NvcGU6IFVJVGVtcGxhdGVUeXBlLCBzZWxlY3Rvck5hbWU6IHN0cmluZywgaW5wdXREYXRhPzogdW5rbm93bik6IHN0cmluZyB7XG4gICAgY29uc3QgaW5wdXREYXRhSGFzaCA9IFVVSUQuaGV4KEpTT04uc3RyaW5naWZ5KGlucHV0RGF0YSkgfHwgJycpLnNsaWNlKDAsIDgpO1xuICAgIHJldHVybiBgJHtzY29wZX0vJHtzZWxlY3Rvck5hbWV9LyR7aW5wdXREYXRhSGFzaH1gO1xuICB9XG5cbiAgcHJpdmF0ZSBjaGVja1N0YXRlZnVsQ2hhbmdlcyhyZXF1ZXN0SWQ6IHN0cmluZywgc2VsZWN0b3JSZXN1bHQ6IHVua25vd24pIHtcbiAgICBpZiAodGhpcy50cmFja2VkU3RhdGVmdWxDaGFuZ2VzTWFwLmhhcyhyZXF1ZXN0SWQpKSB7XG4gICAgICBpZiAoIXRoaXMuaW5pdGlhbFN0YXRlZnVsRGF0YVtyZXF1ZXN0SWRdKSB7XG4gICAgICAgIHRoaXMuaW5pdGlhbFN0YXRlZnVsRGF0YVtyZXF1ZXN0SWRdID0gc2VsZWN0b3JSZXN1bHQ7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGhhc0NoYW5nZXMgPSAhaXNFcXVhbCh0aGlzLmluaXRpYWxTdGF0ZWZ1bERhdGFbcmVxdWVzdElkXSwgc2VsZWN0b3JSZXN1bHQpO1xuICAgICAgdGhpcy50cmFja2VkU3RhdGVmdWxDaGFuZ2VzTWFwLnNldChyZXF1ZXN0SWQsIGhhc0NoYW5nZXMpO1xuICAgIH1cbiAgfVxufVxuIl19
|
@@ -1,9 +0,0 @@
|
|
1
|
-
export * from './flow-info.service';
|
2
|
-
export * from './flow-state-configuration.service';
|
3
|
-
export * from './flow-state.service';
|
4
|
-
export * from './integration.state';
|
5
|
-
export * from './product-images.service';
|
6
|
-
export * from './runtime-settings.service';
|
7
|
-
export * from './sales-transaction.service';
|
8
|
-
export * from './catalog-products.service';
|
9
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9saWJzL3Nkay9jb3JlL3NlcnZpY2VzL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLGNBQWMscUJBQXFCLENBQUM7QUFDcEMsY0FBYyxvQ0FBb0MsQ0FBQztBQUNuRCxjQUFjLHNCQUFzQixDQUFDO0FBQ3JDLGNBQWMscUJBQXFCLENBQUM7QUFDcEMsY0FBYywwQkFBMEIsQ0FBQztBQUN6QyxjQUFjLDRCQUE0QixDQUFDO0FBQzNDLGNBQWMsNkJBQTZCLENBQUM7QUFDNUMsY0FBYyw0QkFBNEIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCAqIGZyb20gJy4vZmxvdy1pbmZvLnNlcnZpY2UnO1xuZXhwb3J0ICogZnJvbSAnLi9mbG93LXN0YXRlLWNvbmZpZ3VyYXRpb24uc2VydmljZSc7XG5leHBvcnQgKiBmcm9tICcuL2Zsb3ctc3RhdGUuc2VydmljZSc7XG5leHBvcnQgKiBmcm9tICcuL2ludGVncmF0aW9uLnN0YXRlJztcbmV4cG9ydCAqIGZyb20gJy4vcHJvZHVjdC1pbWFnZXMuc2VydmljZSc7XG5leHBvcnQgKiBmcm9tICcuL3J1bnRpbWUtc2V0dGluZ3Muc2VydmljZSc7XG5leHBvcnQgKiBmcm9tICcuL3NhbGVzLXRyYW5zYWN0aW9uLnNlcnZpY2UnO1xuZXhwb3J0ICogZnJvbSAnLi9jYXRhbG9nLXByb2R1Y3RzLnNlcnZpY2UnO1xuIl19
|
@@ -1,36 +0,0 @@
|
|
1
|
-
import { Injectable } from '@angular/core';
|
2
|
-
import { BehaviorSubject, filter, map, Subject } from 'rxjs';
|
3
|
-
import * as i0 from "@angular/core";
|
4
|
-
export class IntegrationState {
|
5
|
-
constructor() {
|
6
|
-
this.stateSubj$ = new BehaviorSubject({});
|
7
|
-
this.action$ = new Subject();
|
8
|
-
}
|
9
|
-
get state$() {
|
10
|
-
return this.stateSubj$.asObservable();
|
11
|
-
}
|
12
|
-
get state() {
|
13
|
-
return this.stateSubj$.getValue();
|
14
|
-
}
|
15
|
-
patchState(update) {
|
16
|
-
this.stateSubj$.next({ ...this.stateSubj$.getValue(), ...update });
|
17
|
-
}
|
18
|
-
dispatch(action) {
|
19
|
-
this.action$.next(action);
|
20
|
-
}
|
21
|
-
listen$(actionType) {
|
22
|
-
return this.action$.pipe(filter(action => action.type === actionType), map(action => action.payload));
|
23
|
-
}
|
24
|
-
listenAll$() {
|
25
|
-
return this.action$.asObservable();
|
26
|
-
}
|
27
|
-
reset() {
|
28
|
-
this.stateSubj$.next({});
|
29
|
-
}
|
30
|
-
}
|
31
|
-
IntegrationState.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: IntegrationState, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
|
32
|
-
IntegrationState.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: IntegrationState });
|
33
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: IntegrationState, decorators: [{
|
34
|
-
type: Injectable
|
35
|
-
}] });
|
36
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW50ZWdyYXRpb24uc3RhdGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9saWJzL3Nkay9jb3JlL3NlcnZpY2VzL2ludGVncmF0aW9uLnN0YXRlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDM0MsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLEVBQUUsR0FBRyxFQUFjLE9BQU8sRUFBRSxNQUFNLE1BQU0sQ0FBQzs7QUFJekUsTUFBTSxPQUFPLGdCQUFnQjtJQUQ3QjtRQUVtQixlQUFVLEdBQUcsSUFBSSxlQUFlLENBQUksRUFBTyxDQUFDLENBQUM7UUFDN0MsWUFBTyxHQUFHLElBQUksT0FBTyxFQUFxQixDQUFDO0tBZ0M3RDtJQTlCQyxJQUFXLE1BQU07UUFDZixPQUFPLElBQUksQ0FBQyxVQUFVLENBQUMsWUFBWSxFQUFFLENBQUM7SUFDeEMsQ0FBQztJQUVELElBQVcsS0FBSztRQUNkLE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQyxRQUFRLEVBQUUsQ0FBQztJQUNwQyxDQUFDO0lBRU0sVUFBVSxDQUFDLE1BQWtCO1FBQ2xDLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLEVBQUUsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLFFBQVEsRUFBRSxFQUFFLEdBQUcsTUFBTSxFQUFFLENBQUMsQ0FBQztJQUNyRSxDQUFDO0lBRU0sUUFBUSxDQUFDLE1BQXlCO1FBQ3ZDLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQzVCLENBQUM7SUFFTSxPQUFPLENBQVUsVUFBa0I7UUFDeEMsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FDdEIsTUFBTSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDLElBQUksS0FBSyxVQUFVLENBQUMsRUFDNUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDLE9BQVksQ0FBQyxDQUNuQyxDQUFDO0lBQ0osQ0FBQztJQUVNLFVBQVU7UUFDZixPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsWUFBWSxFQUFtQixDQUFDO0lBQ3RELENBQUM7SUFFTSxLQUFLO1FBQ1YsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsRUFBTyxDQUFDLENBQUM7SUFDaEMsQ0FBQzs7NkdBakNVLGdCQUFnQjtpSEFBaEIsZ0JBQWdCOzJGQUFoQixnQkFBZ0I7a0JBRDVCLFVBQVUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBCZWhhdmlvclN1YmplY3QsIGZpbHRlciwgbWFwLCBPYnNlcnZhYmxlLCBTdWJqZWN0IH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBJbnRlZ3JhdGlvbkFjdGlvbiwgSW50ZWdyYXRpb25TdGF0ZU1vZGVsIH0gZnJvbSAnLi4vdHlwZXMvaW50ZWdyYXRpb24udHlwZXMnO1xuXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgSW50ZWdyYXRpb25TdGF0ZTxTID0gSW50ZWdyYXRpb25TdGF0ZU1vZGVsPiB7XG4gIHByaXZhdGUgcmVhZG9ubHkgc3RhdGVTdWJqJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Uz4oe30gYXMgUyk7XG4gIHByaXZhdGUgcmVhZG9ubHkgYWN0aW9uJCA9IG5ldyBTdWJqZWN0PEludGVncmF0aW9uQWN0aW9uPigpO1xuXG4gIHB1YmxpYyBnZXQgc3RhdGUkKCk6IE9ic2VydmFibGU8Uz4ge1xuICAgIHJldHVybiB0aGlzLnN0YXRlU3ViaiQuYXNPYnNlcnZhYmxlKCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IHN0YXRlKCk6IFMge1xuICAgIHJldHVybiB0aGlzLnN0YXRlU3ViaiQuZ2V0VmFsdWUoKTtcbiAgfVxuXG4gIHB1YmxpYyBwYXRjaFN0YXRlKHVwZGF0ZTogUGFydGlhbDxTPik6IHZvaWQge1xuICAgIHRoaXMuc3RhdGVTdWJqJC5uZXh0KHsgLi4udGhpcy5zdGF0ZVN1YmokLmdldFZhbHVlKCksIC4uLnVwZGF0ZSB9KTtcbiAgfVxuXG4gIHB1YmxpYyBkaXNwYXRjaChhY3Rpb246IEludGVncmF0aW9uQWN0aW9uKTogdm9pZCB7XG4gICAgdGhpcy5hY3Rpb24kLm5leHQoYWN0aW9uKTtcbiAgfVxuXG4gIHB1YmxpYyBsaXN0ZW4kPFAgPSBhbnk+KGFjdGlvblR5cGU6IHN0cmluZyk6IE9ic2VydmFibGU8UD4ge1xuICAgIHJldHVybiB0aGlzLmFjdGlvbiQucGlwZShcbiAgICAgIGZpbHRlcihhY3Rpb24gPT4gYWN0aW9uLnR5cGUgPT09IGFjdGlvblR5cGUpLFxuICAgICAgbWFwKGFjdGlvbiA9PiBhY3Rpb24ucGF5bG9hZCBhcyBQKSxcbiAgICApO1xuICB9XG5cbiAgcHVibGljIGxpc3RlbkFsbCQ8VCBleHRlbmRzIEludGVncmF0aW9uQWN0aW9uPigpOiBPYnNlcnZhYmxlPFQ+IHtcbiAgICByZXR1cm4gdGhpcy5hY3Rpb24kLmFzT2JzZXJ2YWJsZSgpIGFzIE9ic2VydmFibGU8VD47XG4gIH1cblxuICBwdWJsaWMgcmVzZXQoKTogdm9pZCB7XG4gICAgdGhpcy5zdGF0ZVN1YmokLm5leHQoe30gYXMgUyk7XG4gIH1cbn1cbiJdfQ==
|
@@ -1,30 +0,0 @@
|
|
1
|
-
import { Injectable } from '@angular/core';
|
2
|
-
import { ProductsAdminApiService } from '@veloceapps/api/v2';
|
3
|
-
import { BehaviorSubject, catchError, distinctUntilChanged, map, of, tap } from 'rxjs';
|
4
|
-
import * as i0 from "@angular/core";
|
5
|
-
import * as i1 from "@veloceapps/api/v2";
|
6
|
-
export class ProductImagesService {
|
7
|
-
constructor(productsAdminApiService) {
|
8
|
-
this.productsAdminApiService = productsAdminApiService;
|
9
|
-
this.imagesMap$ = new BehaviorSubject({});
|
10
|
-
}
|
11
|
-
getImageUrl$(productId) {
|
12
|
-
if (this.imagesMap$.value[productId] == null) {
|
13
|
-
this.imagesMap$.next({ ...this.imagesMap$.value, [productId]: '' });
|
14
|
-
this.fetchProductImage(productId);
|
15
|
-
}
|
16
|
-
return this.imagesMap$.pipe(map(imagesMap => imagesMap[productId] ?? null), distinctUntilChanged());
|
17
|
-
}
|
18
|
-
fetchProductImage(productId) {
|
19
|
-
this.productsAdminApiService
|
20
|
-
.fetchImage$(productId)
|
21
|
-
.pipe(map(file => URL.createObjectURL(file)), catchError(() => of('')), tap(url => this.imagesMap$.next({ ...this.imagesMap$.value, [productId]: url })))
|
22
|
-
.subscribe();
|
23
|
-
}
|
24
|
-
}
|
25
|
-
ProductImagesService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: ProductImagesService, deps: [{ token: i1.ProductsAdminApiService }], target: i0.ɵɵFactoryTarget.Injectable });
|
26
|
-
ProductImagesService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: ProductImagesService });
|
27
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: ProductImagesService, decorators: [{
|
28
|
-
type: Injectable
|
29
|
-
}], ctorParameters: function () { return [{ type: i1.ProductsAdminApiService }]; } });
|
30
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvZHVjdC1pbWFnZXMuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvc2RrL2NvcmUvc2VydmljZXMvcHJvZHVjdC1pbWFnZXMuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzNDLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBRTdELE9BQU8sRUFBRSxlQUFlLEVBQUUsVUFBVSxFQUFFLG9CQUFvQixFQUFFLEdBQUcsRUFBYyxFQUFFLEVBQUUsR0FBRyxFQUFFLE1BQU0sTUFBTSxDQUFDOzs7QUFHbkcsTUFBTSxPQUFPLG9CQUFvQjtJQUcvQixZQUFvQix1QkFBZ0Q7UUFBaEQsNEJBQXVCLEdBQXZCLHVCQUF1QixDQUF5QjtRQUY1RCxlQUFVLEdBQUcsSUFBSSxlQUFlLENBQXFCLEVBQUUsQ0FBQyxDQUFDO0lBRU0sQ0FBQztJQUVqRSxZQUFZLENBQUMsU0FBaUI7UUFDbkMsSUFBSSxJQUFJLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsSUFBSSxJQUFJLEVBQUU7WUFDNUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsRUFBRSxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsS0FBSyxFQUFFLENBQUMsU0FBUyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQztZQUNwRSxJQUFJLENBQUMsaUJBQWlCLENBQUMsU0FBUyxDQUFDLENBQUM7U0FDbkM7UUFFRCxPQUFPLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUN6QixHQUFHLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLElBQUksSUFBSSxDQUFDLEVBQzlDLG9CQUFvQixFQUFFLENBQ3ZCLENBQUM7SUFDSixDQUFDO0lBRU8saUJBQWlCLENBQUMsU0FBaUI7UUFDekMsSUFBSSxDQUFDLHVCQUF1QjthQUN6QixXQUFXLENBQUMsU0FBUyxDQUFDO2FBQ3RCLElBQUksQ0FDSCxHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQ3RDLFVBQVUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFDeEIsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsRUFBRSxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsS0FBSyxFQUFFLENBQUMsU0FBUyxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUNqRjthQUNBLFNBQVMsRUFBRSxDQUFDO0lBQ2pCLENBQUM7O2lIQTFCVSxvQkFBb0I7cUhBQXBCLG9CQUFvQjsyRkFBcEIsb0JBQW9CO2tCQURoQyxVQUFVIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgUHJvZHVjdHNBZG1pbkFwaVNlcnZpY2UgfSBmcm9tICdAdmVsb2NlYXBwcy9hcGkvdjInO1xuaW1wb3J0IHsgRGljdGlvbmFyeSB9IGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQgeyBCZWhhdmlvclN1YmplY3QsIGNhdGNoRXJyb3IsIGRpc3RpbmN0VW50aWxDaGFuZ2VkLCBtYXAsIE9ic2VydmFibGUsIG9mLCB0YXAgfSBmcm9tICdyeGpzJztcblxuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIFByb2R1Y3RJbWFnZXNTZXJ2aWNlIHtcbiAgcHJpdmF0ZSBpbWFnZXNNYXAkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxEaWN0aW9uYXJ5PHN0cmluZz4+KHt9KTtcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIHByb2R1Y3RzQWRtaW5BcGlTZXJ2aWNlOiBQcm9kdWN0c0FkbWluQXBpU2VydmljZSkge31cblxuICBwdWJsaWMgZ2V0SW1hZ2VVcmwkKHByb2R1Y3RJZDogc3RyaW5nKTogT2JzZXJ2YWJsZTxzdHJpbmcgfCBudWxsPiB7XG4gICAgaWYgKHRoaXMuaW1hZ2VzTWFwJC52YWx1ZVtwcm9kdWN0SWRdID09IG51bGwpIHtcbiAgICAgIHRoaXMuaW1hZ2VzTWFwJC5uZXh0KHsgLi4udGhpcy5pbWFnZXNNYXAkLnZhbHVlLCBbcHJvZHVjdElkXTogJycgfSk7XG4gICAgICB0aGlzLmZldGNoUHJvZHVjdEltYWdlKHByb2R1Y3RJZCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuaW1hZ2VzTWFwJC5waXBlKFxuICAgICAgbWFwKGltYWdlc01hcCA9PiBpbWFnZXNNYXBbcHJvZHVjdElkXSA/PyBudWxsKSxcbiAgICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkKCksXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgZmV0Y2hQcm9kdWN0SW1hZ2UocHJvZHVjdElkOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLnByb2R1Y3RzQWRtaW5BcGlTZXJ2aWNlXG4gICAgICAuZmV0Y2hJbWFnZSQocHJvZHVjdElkKVxuICAgICAgLnBpcGUoXG4gICAgICAgIG1hcChmaWxlID0+IFVSTC5jcmVhdGVPYmplY3RVUkwoZmlsZSkpLFxuICAgICAgICBjYXRjaEVycm9yKCgpID0+IG9mKCcnKSksXG4gICAgICAgIHRhcCh1cmwgPT4gdGhpcy5pbWFnZXNNYXAkLm5leHQoeyAuLi50aGlzLmltYWdlc01hcCQudmFsdWUsIFtwcm9kdWN0SWRdOiB1cmwgfSkpLFxuICAgICAgKVxuICAgICAgLnN1YnNjcmliZSgpO1xuICB9XG59XG4iXX0=
|