@sdcorejs/angular 19.1.3 → 19.1.5
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/README.md +19 -14
- package/components/audit-diff/index.d.ts +2 -0
- package/components/audit-diff/src/audit-diff.component.d.ts +30 -0
- package/components/audit-diff/src/audit-diff.engine.d.ts +40 -0
- package/components/badge/src/badge.component.d.ts +1 -1
- package/components/breadcrumb/index.d.ts +1 -0
- package/components/breadcrumb/src/breadcrumb.component.d.ts +50 -0
- package/components/data-state/index.d.ts +1 -0
- package/components/data-state/src/data-state.component.d.ts +40 -0
- package/components/document-builder/src/components/header-footer-builder/header-footer-builder.component.d.ts +1 -2
- package/components/document-builder/src/document-builder.component.d.ts +4 -4
- package/components/form-generic/src/components/form-builder/components/attribute-expression/attribute-expression.component.d.ts +7 -8
- package/components/form-generic/src/components/form-builder/components/attribute-input/attribute-input.component.d.ts +4 -5
- package/components/form-generic/src/components/form-builder/components/attribute-input-number/attribute-input-number.component.d.ts +1 -2
- package/components/form-generic/src/components/form-builder/components/attribute-parameter/attribute-parameter.component.d.ts +6 -5
- package/components/form-generic/src/components/form-builder/components/attribute-select/attribute-select.component.d.ts +4 -5
- package/components/form-generic/src/components/form-builder/components/attribute-selection/attribute-selection.component.d.ts +9 -9
- package/components/form-generic/src/components/form-builder/components/attribute-selection/components/build-queries/build-queries.component.d.ts +8 -7
- package/components/form-generic/src/components/form-builder/components/attribute-selection/components/build-variables/build-variables.component.d.ts +8 -7
- package/components/form-generic/src/components/form-builder/components/attribute-switch/attribute-switch.component.d.ts +3 -4
- package/components/form-generic/src/components/form-builder/components/attribute-table/attribute-table.component.d.ts +5 -6
- package/components/form-generic/src/components/form-builder/components/attribute-template/attribute-template.component.d.ts +1 -2
- package/components/form-generic/src/components/form-builder/components/attribute-textarea/attribute-textarea.component.d.ts +4 -5
- package/components/form-generic/src/components/form-builder/components/checkbox/attribute/checkbox-attribute.component.d.ts +6 -6
- package/components/form-generic/src/components/form-builder/components/chip-calendar/attribute/chip-calendar-attribute.component.d.ts +6 -6
- package/components/form-generic/src/components/form-builder/components/chip-calendar/control/chip-calendar-control.component.d.ts +3 -3
- package/components/form-generic/src/components/form-builder/components/chip-string/attribute/chip-string-attribute.component.d.ts +6 -6
- package/components/form-generic/src/components/form-builder/components/chip-string/control/chip-string-control.component.d.ts +3 -3
- package/components/form-generic/src/components/form-builder/components/configure-validation/configure-validation.component.d.ts +2 -2
- package/components/form-generic/src/components/form-builder/components/datetime/attribute/datetime-attribute.component.d.ts +6 -6
- package/components/form-generic/src/components/form-builder/components/datetime/control/datetime-control.component.d.ts +3 -3
- package/components/form-generic/src/components/form-builder/components/expression-builder/expression-builder.component.d.ts +6 -5
- package/components/form-generic/src/components/form-builder/components/html/attribute/components/build-queries/build-queries.component.d.ts +7 -6
- package/components/form-generic/src/components/form-builder/components/html/attribute/html-attribute.component.d.ts +7 -8
- package/components/form-generic/src/components/form-builder/components/html/control/html-control.component.d.ts +3 -4
- package/components/form-generic/src/components/form-builder/components/number/attribute/number-attribute.component.d.ts +6 -6
- package/components/form-generic/src/components/form-builder/components/number/control/number-control.component.d.ts +3 -3
- package/components/form-generic/src/components/form-builder/components/radio/attribute/radio-attribute.component.d.ts +6 -6
- package/components/form-generic/src/components/form-builder/components/radio/control/radio-control.component.d.ts +3 -3
- package/components/form-generic/src/components/form-builder/components/select/attribute/select-attribute.component.d.ts +6 -6
- package/components/form-generic/src/components/form-builder/components/select/control/select-control.component.d.ts +3 -3
- package/components/form-generic/src/components/form-builder/components/table/attribute/table-attribute.component.d.ts +6 -6
- package/components/form-generic/src/components/form-builder/components/table/control/table-control.component.d.ts +3 -3
- package/components/form-generic/src/components/form-builder/components/textarea/attribute/textarea-attribute.component.d.ts +6 -6
- package/components/form-generic/src/components/form-builder/components/textarea/control/textarea-control.component.d.ts +3 -3
- package/components/form-generic/src/components/form-builder/components/textfield/attribute/textfield-attribute.component.d.ts +6 -6
- package/components/form-generic/src/components/form-builder/components/textfield/control/textfield-control.component.d.ts +3 -3
- package/components/form-generic/src/components/form-builder/components/upload/attribute/upload-attribute.component.d.ts +6 -6
- package/components/form-generic/src/components/form-builder/components/upload/control/upload-control.component.d.ts +3 -3
- package/components/form-generic/src/components/form-render/components/item/components/chip-calendar/chip-calendar.component.d.ts +7 -6
- package/components/form-generic/src/components/form-render/components/item/components/chip-string/chip-string.component.d.ts +7 -6
- package/components/form-generic/src/components/form-render/components/item/components/datetime/datetime.component.d.ts +7 -7
- package/components/form-generic/src/components/form-render/components/item/components/html/html.component.d.ts +6 -6
- package/components/form-generic/src/components/form-render/components/item/components/number/number.component.d.ts +7 -6
- package/components/form-generic/src/components/form-render/components/item/components/radio/radio.component.d.ts +6 -7
- package/components/form-generic/src/components/form-render/components/item/components/select/select.component.d.ts +6 -7
- package/components/form-generic/src/components/form-render/components/item/components/table/table.component.d.ts +8 -8
- package/components/form-generic/src/components/form-render/components/item/components/textarea/textarea.component.d.ts +7 -6
- package/components/form-generic/src/components/form-render/components/item/components/textfield/textfield.component.d.ts +7 -6
- package/components/form-generic/src/components/form-render/components/item/components/upload/upload.component.d.ts +7 -6
- package/components/form-generic/src/components/form-render/components/item/item.component.d.ts +4 -4
- package/components/form-generic/src/components/sd-feel-expression/sd-feel-expression.component.d.ts +8 -9
- package/components/form-generic/src/pipes/component-viewed.pipe.d.ts +2 -3
- package/components/form-generic/src/pipes/html.pipe.d.ts +2 -2
- package/components/form-generic/src/services/form-render.service.d.ts +2 -2
- package/components/import-excel/src/import-excel.component.d.ts +4 -7
- package/components/import-excel/src/pipes/column-transform.pipe.d.ts +3 -2
- package/components/index.d.ts +4 -0
- package/components/job-progress/index.d.ts +1 -0
- package/components/job-progress/src/job-progress.component.d.ts +34 -0
- package/components/mini-editor/src/mini-editor.component.d.ts +7 -7
- package/components/modal/src/modal.component.d.ts +6 -1
- package/components/preview/index.d.ts +3 -0
- package/components/preview/src/preview-pdf/preview-pdf.browser.d.ts +28 -0
- package/components/preview/src/preview-pdf/preview-pdf.component.d.ts +61 -23
- package/components/preview/src/preview-pdf/preview-pdf.pdfjs.d.ts +77 -0
- package/components/preview/src/preview-pdf/preview-pdf.print.d.ts +10 -0
- package/components/preview/src/preview-pdf/preview-pdf.types.d.ts +11 -9
- package/components/side-drawer/src/side-drawer.component.d.ts +6 -1
- package/components/tab/src/tab-group.component.d.ts +1 -0
- package/components/tab/src/tab.component.d.ts +7 -1
- package/components/tab-router/src/components/tab-router-item/tab-router-item.component.d.ts +3 -4
- package/components/tab-router/src/pipes/tab-info.pipe.d.ts +2 -2
- package/components/tab-router/src/services/tab-decorator.service.d.ts +2 -1
- package/components/table/src/components/filter/column-filter/column-filter.component.d.ts +1 -1
- package/components/table/src/components/popup-export/popup-export.component.d.ts +6 -6
- package/components/table/src/models/table-column.model.d.ts +1 -1
- package/components/table/src/services/config.service.d.ts +3 -2
- package/components/table/src/services/table-filter/table-filter.model.d.ts +1 -1
- package/components/table/src/services/table-filter/table-filter.service.d.ts +2 -2
- package/components/tree/src/tree.component.d.ts +13 -2
- package/components/tree/src/tree.model.d.ts +11 -0
- package/components/upload-file/src/components/preview/preview.component.d.ts +4 -4
- package/directives/src/sd-hover-copy.directive.d.ts +6 -5
- package/directives/src/sd-href.directive.d.ts +2 -2
- package/directives/src/sd-scroll.directive.d.ts +3 -2
- package/fesm2022/sdcorejs-angular-components-anchor.mjs +14 -14
- package/fesm2022/sdcorejs-angular-components-anchor.mjs.map +1 -1
- package/fesm2022/sdcorejs-angular-components-audit-diff.mjs +332 -0
- package/fesm2022/sdcorejs-angular-components-audit-diff.mjs.map +1 -0
- package/fesm2022/sdcorejs-angular-components-badge.mjs +1 -0
- package/fesm2022/sdcorejs-angular-components-badge.mjs.map +1 -1
- package/fesm2022/sdcorejs-angular-components-breadcrumb.mjs +121 -0
- package/fesm2022/sdcorejs-angular-components-breadcrumb.mjs.map +1 -0
- package/fesm2022/sdcorejs-angular-components-data-state.mjs +68 -0
- package/fesm2022/sdcorejs-angular-components-data-state.mjs.map +1 -0
- package/fesm2022/sdcorejs-angular-components-document-builder.mjs +16 -21
- package/fesm2022/sdcorejs-angular-components-document-builder.mjs.map +1 -1
- package/fesm2022/sdcorejs-angular-components-editor.mjs +6 -4
- package/fesm2022/sdcorejs-angular-components-editor.mjs.map +1 -1
- package/fesm2022/sdcorejs-angular-components-form-generic.mjs +463 -806
- package/fesm2022/sdcorejs-angular-components-form-generic.mjs.map +1 -1
- package/fesm2022/sdcorejs-angular-components-import-excel.mjs +23 -33
- package/fesm2022/sdcorejs-angular-components-import-excel.mjs.map +1 -1
- package/fesm2022/sdcorejs-angular-components-job-progress.mjs +97 -0
- package/fesm2022/sdcorejs-angular-components-job-progress.mjs.map +1 -0
- package/fesm2022/sdcorejs-angular-components-mini-editor.mjs +9 -19
- package/fesm2022/sdcorejs-angular-components-mini-editor.mjs.map +1 -1
- package/fesm2022/sdcorejs-angular-components-modal.mjs +60 -3
- package/fesm2022/sdcorejs-angular-components-modal.mjs.map +1 -1
- package/fesm2022/sdcorejs-angular-components-preview.mjs +1437 -217
- package/fesm2022/sdcorejs-angular-components-preview.mjs.map +1 -1
- package/fesm2022/sdcorejs-angular-components-query-bar.mjs +4 -4
- package/fesm2022/sdcorejs-angular-components-query-bar.mjs.map +1 -1
- package/fesm2022/sdcorejs-angular-components-query-builder.mjs +1 -1
- package/fesm2022/sdcorejs-angular-components-query-builder.mjs.map +1 -1
- package/fesm2022/sdcorejs-angular-components-side-drawer.mjs +38 -1
- package/fesm2022/sdcorejs-angular-components-side-drawer.mjs.map +1 -1
- package/fesm2022/sdcorejs-angular-components-tab-router.mjs +16 -22
- package/fesm2022/sdcorejs-angular-components-tab-router.mjs.map +1 -1
- package/fesm2022/sdcorejs-angular-components-tab.mjs +47 -3
- package/fesm2022/sdcorejs-angular-components-tab.mjs.map +1 -1
- package/fesm2022/sdcorejs-angular-components-table.mjs +94 -61
- package/fesm2022/sdcorejs-angular-components-table.mjs.map +1 -1
- package/fesm2022/sdcorejs-angular-components-tree.mjs +185 -16
- package/fesm2022/sdcorejs-angular-components-tree.mjs.map +1 -1
- package/fesm2022/sdcorejs-angular-components-upload-file.mjs +14 -21
- package/fesm2022/sdcorejs-angular-components-upload-file.mjs.map +1 -1
- package/fesm2022/sdcorejs-angular-components.mjs +4 -0
- package/fesm2022/sdcorejs-angular-components.mjs.map +1 -1
- package/fesm2022/sdcorejs-angular-directives.mjs +29 -41
- package/fesm2022/sdcorejs-angular-directives.mjs.map +1 -1
- package/fesm2022/sdcorejs-angular-forms-autocomplete.mjs +7 -7
- package/fesm2022/sdcorejs-angular-forms-autocomplete.mjs.map +1 -1
- package/fesm2022/sdcorejs-angular-forms-checkbox.mjs +20 -73
- package/fesm2022/sdcorejs-angular-forms-checkbox.mjs.map +1 -1
- package/fesm2022/sdcorejs-angular-forms-chip-calendar.mjs +6 -3
- package/fesm2022/sdcorejs-angular-forms-chip-calendar.mjs.map +1 -1
- package/fesm2022/sdcorejs-angular-forms-chip.mjs +6 -3
- package/fesm2022/sdcorejs-angular-forms-chip.mjs.map +1 -1
- package/fesm2022/sdcorejs-angular-forms-date-range.mjs +16 -13
- package/fesm2022/sdcorejs-angular-forms-date-range.mjs.map +1 -1
- package/fesm2022/sdcorejs-angular-forms-date.mjs +42 -65
- package/fesm2022/sdcorejs-angular-forms-date.mjs.map +1 -1
- package/fesm2022/sdcorejs-angular-forms-datetime.mjs +51 -66
- package/fesm2022/sdcorejs-angular-forms-datetime.mjs.map +1 -1
- package/fesm2022/sdcorejs-angular-forms-entity-picker.mjs +384 -0
- package/fesm2022/sdcorejs-angular-forms-entity-picker.mjs.map +1 -0
- package/fesm2022/sdcorejs-angular-forms-input-color.mjs +1 -1
- package/fesm2022/sdcorejs-angular-forms-input-color.mjs.map +1 -1
- package/fesm2022/sdcorejs-angular-forms-input-number.mjs +7 -5
- package/fesm2022/sdcorejs-angular-forms-input-number.mjs.map +1 -1
- package/fesm2022/sdcorejs-angular-forms-input.mjs +289 -55
- package/fesm2022/sdcorejs-angular-forms-input.mjs.map +1 -1
- package/fesm2022/sdcorejs-angular-forms-models.mjs +155 -2
- package/fesm2022/sdcorejs-angular-forms-models.mjs.map +1 -1
- package/fesm2022/sdcorejs-angular-forms-radio.mjs +44 -68
- package/fesm2022/sdcorejs-angular-forms-radio.mjs.map +1 -1
- package/fesm2022/sdcorejs-angular-forms-select.mjs +6 -20
- package/fesm2022/sdcorejs-angular-forms-select.mjs.map +1 -1
- package/fesm2022/sdcorejs-angular-forms-switch.mjs +19 -66
- package/fesm2022/sdcorejs-angular-forms-switch.mjs.map +1 -1
- package/fesm2022/sdcorejs-angular-forms-textarea.mjs +6 -5
- package/fesm2022/sdcorejs-angular-forms-textarea.mjs.map +1 -1
- package/fesm2022/sdcorejs-angular-forms-time-range.mjs +279 -0
- package/fesm2022/sdcorejs-angular-forms-time-range.mjs.map +1 -0
- package/fesm2022/sdcorejs-angular-forms-time.mjs +309 -0
- package/fesm2022/sdcorejs-angular-forms-time.mjs.map +1 -0
- package/fesm2022/sdcorejs-angular-forms-tree-select.mjs +210 -0
- package/fesm2022/sdcorejs-angular-forms-tree-select.mjs.map +1 -0
- package/fesm2022/sdcorejs-angular-forms.mjs +73 -4
- package/fesm2022/sdcorejs-angular-forms.mjs.map +1 -1
- package/fesm2022/sdcorejs-angular-i18n.mjs +375 -10
- package/fesm2022/sdcorejs-angular-i18n.mjs.map +1 -1
- package/fesm2022/sdcorejs-angular-interceptors.mjs +12 -17
- package/fesm2022/sdcorejs-angular-interceptors.mjs.map +1 -1
- package/fesm2022/sdcorejs-angular-modules-layout.mjs +992 -166
- package/fesm2022/sdcorejs-angular-modules-layout.mjs.map +1 -1
- package/fesm2022/sdcorejs-angular-pipes.mjs +5 -7
- package/fesm2022/sdcorejs-angular-pipes.mjs.map +1 -1
- package/fesm2022/sdcorejs-angular-services-api.mjs +407 -137
- package/fesm2022/sdcorejs-angular-services-api.mjs.map +1 -1
- package/fesm2022/sdcorejs-angular-services-cache.mjs +515 -105
- package/fesm2022/sdcorejs-angular-services-cache.mjs.map +1 -1
- package/fesm2022/sdcorejs-angular-services-confirm.mjs +5 -7
- package/fesm2022/sdcorejs-angular-services-confirm.mjs.map +1 -1
- package/fesm2022/sdcorejs-angular-services-docx.mjs +7 -10
- package/fesm2022/sdcorejs-angular-services-docx.mjs.map +1 -1
- package/fesm2022/sdcorejs-angular-services-loading.mjs +339 -74
- package/fesm2022/sdcorejs-angular-services-loading.mjs.map +1 -1
- package/fesm2022/sdcorejs-angular-services-notify.mjs +7 -10
- package/fesm2022/sdcorejs-angular-services-notify.mjs.map +1 -1
- package/fesm2022/sdcorejs-angular-services-persistence.mjs +899 -0
- package/fesm2022/sdcorejs-angular-services-persistence.mjs.map +1 -0
- package/fesm2022/sdcorejs-angular-services-storage.mjs +324 -122
- package/fesm2022/sdcorejs-angular-services-storage.mjs.map +1 -1
- package/fesm2022/sdcorejs-angular-services-task.mjs +389 -0
- package/fesm2022/sdcorejs-angular-services-task.mjs.map +1 -0
- package/fesm2022/sdcorejs-angular-services-unsaved-changes.mjs +255 -0
- package/fesm2022/sdcorejs-angular-services-unsaved-changes.mjs.map +1 -0
- package/fesm2022/sdcorejs-angular-services-viewport.mjs +76 -0
- package/fesm2022/sdcorejs-angular-services-viewport.mjs.map +1 -0
- package/fesm2022/sdcorejs-angular-services.mjs +4 -0
- package/fesm2022/sdcorejs-angular-services.mjs.map +1 -1
- package/forms/autocomplete/src/autocomplete.component.d.ts +3 -4
- package/forms/checkbox/src/checkbox.component.d.ts +4 -8
- package/forms/date/src/date.component.d.ts +3 -2
- package/forms/date-range/src/date-range.component.d.ts +5 -8
- package/forms/datetime/src/datetime.component.d.ts +3 -2
- package/forms/entity-picker/index.d.ts +1 -0
- package/forms/entity-picker/src/entity-picker.component.d.ts +123 -0
- package/forms/index.d.ts +6 -0
- package/forms/input/index.d.ts +1 -0
- package/forms/input/src/input-mask.d.ts +43 -0
- package/forms/input/src/input.component.d.ts +26 -9
- package/forms/input-number/src/input-number.component.d.ts +1 -1
- package/forms/models/index.d.ts +1 -0
- package/forms/models/src/sd-form-control-connector.d.ts +86 -0
- package/forms/radio/src/radio.component.d.ts +12 -8
- package/forms/src/forms.module.d.ts +9 -5
- package/forms/switch/src/switch.component.d.ts +4 -7
- package/forms/time/index.d.ts +3 -0
- package/forms/time/src/time-picker.adapter.d.ts +13 -0
- package/forms/time/src/time-value.d.ts +19 -0
- package/forms/time/src/time.component.d.ts +78 -0
- package/forms/time-range/index.d.ts +2 -0
- package/forms/time-range/src/time-range-value.d.ts +14 -0
- package/forms/time-range/src/time-range.component.d.ts +80 -0
- package/forms/tree-select/index.d.ts +1 -0
- package/forms/tree-select/src/tree-select.component.d.ts +71 -0
- package/i18n/src/en.d.ts +72 -2
- package/interceptors/no-internet/no-internet.interceptor.d.ts +2 -3
- package/interceptors/unauthorized/unauthorized.interceptor.d.ts +2 -2
- package/modules/layout/components/index.d.ts +6 -0
- package/modules/layout/components/layout-main/layout-main.component.d.ts +7 -2
- package/modules/layout/components/shared/menu-tree/menu-tree.component.d.ts +33 -0
- package/modules/layout/components/shared/search-field/search-field.component.d.ts +9 -0
- package/modules/layout/components/shared/user-menu/user-menu.component.d.ts +45 -0
- package/modules/layout/components/sidebar-mobile-v1/components/user/user.component.d.ts +3 -11
- package/modules/layout/components/sidebar-mobile-v2/main.component.d.ts +27 -0
- package/modules/layout/components/sidebar-mobile-v3/main.component.d.ts +28 -0
- package/modules/layout/components/sidebar-v1/components/sidebar/sidebar.component.d.ts +4 -4
- package/modules/layout/components/sidebar-v1/components/user/user.component.d.ts +3 -9
- package/modules/layout/components/sidebar-v1/main.component.d.ts +3 -2
- package/modules/layout/components/sidebar-v2/main.component.d.ts +36 -0
- package/modules/layout/components/sidebar-v3/main.component.d.ts +29 -0
- package/modules/layout/configurations/layout.configuration.d.ts +78 -5
- package/modules/layout/index.d.ts +1 -0
- package/modules/layout/pipes/menu.pipe.d.ts +2 -2
- package/modules/layout/services/index.d.ts +3 -0
- package/modules/layout/services/layout.service.d.ts +2 -2
- package/modules/layout/services/menu/menu.utils.d.ts +6 -0
- package/modules/layout/services/navigation-state/navigation-state.service.d.ts +18 -0
- package/modules/layout/services/responsive/responsive.service.d.ts +12 -0
- package/modules/layout/services/storage/storage.service.d.ts +21 -8
- package/package.json +49 -1
- package/pipes/src/safe-html.pipe.d.ts +2 -2
- package/services/api/src/api.model.d.ts +54 -15
- package/services/api/src/api.service.d.ts +13 -8
- package/services/api/src/interceptors/api.interceptor.d.ts +1 -1
- package/services/cache/src/cache.model.d.ts +46 -13
- package/services/cache/src/cache.service.d.ts +5 -2
- package/services/confirm/src/lib/confirm.service.d.ts +2 -2
- package/services/docx/src/lib/docx.service.d.ts +2 -3
- package/services/index.d.ts +4 -0
- package/services/loading/src/loading.service.d.ts +15 -8
- package/services/notify/src/components/toast/toast.component.d.ts +2 -3
- package/services/persistence/index.d.ts +5 -0
- package/services/persistence/src/graph-serializer.d.ts +16 -0
- package/services/persistence/src/persistence-envelope.d.ts +28 -0
- package/services/persistence/src/persistence-key.d.ts +17 -0
- package/services/persistence/src/persistence.model.d.ts +63 -0
- package/services/persistence/src/storage-adapter.d.ts +29 -0
- package/services/storage/src/storage.model.d.ts +20 -5
- package/services/storage/src/storage.service.d.ts +6 -3
- package/services/task/index.d.ts +3 -0
- package/services/task/src/task.model.d.ts +75 -0
- package/services/task/src/task.service.d.ts +14 -0
- package/services/task/src/task.tokens.d.ts +12 -0
- package/services/unsaved-changes/index.d.ts +4 -0
- package/services/unsaved-changes/src/unsaved-changes.adapters.d.ts +15 -0
- package/services/unsaved-changes/src/unsaved-changes.model.d.ts +41 -0
- package/services/unsaved-changes/src/unsaved-changes.service.d.ts +16 -0
- package/services/unsaved-changes/src/unsaved-changes.tokens.d.ts +9 -0
- package/services/viewport/index.d.ts +3 -0
- package/services/viewport/src/viewport.model.d.ts +12 -0
- package/services/viewport/src/viewport.service.d.ts +18 -0
- package/services/viewport/src/viewport.tokens.d.ts +6 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sdcorejs-angular-services-api.mjs","sources":["../../../projects/sdcorejs-angular/services/api/src/api.model.ts","../../../projects/sdcorejs-angular/services/api/src/api.service.ts","../../../projects/sdcorejs-angular/services/api/src/interceptors/api.interceptor.ts","../../../projects/sdcorejs-angular/services/api/src/api.module.ts","../../../projects/sdcorejs-angular/services/api/sdcorejs-angular-services-api.ts"],"sourcesContent":["import { HttpClient, HttpErrorResponse, HttpRequest, HttpResponse } from '@angular/common/http';\nimport { InjectionToken } from '@angular/core';\nimport { SdCacheOption } from '@sdcorejs/angular/services/cache';\n// import hash from 'object-hash';\n\nexport interface SdApiOption {\n cacheOption?: SdCacheOption;\n timeout?: number; // Default: 30000 (30s)\n autoCache?: boolean; // Default: true\n}\ntype HttpGetOption = Parameters<HttpClient['get']>[1];\nexport type SdGetOption = HttpGetOption & SdApiOption;\n\ntype HttpPostOption = Parameters<HttpClient['post']>[2];\nexport type SdPostOption = HttpPostOption & SdApiOption;\n\ntype HttpPutOption = Parameters<HttpClient['put']>[2];\nexport type SdPutOption = HttpPutOption & SdApiOption;\n\ntype HttpDeleteOption = Parameters<HttpClient['delete']>[1];\nexport type SdDeleteOption = HttpDeleteOption & SdApiOption;\n\nexport interface SdApiHandler {\n /** Danh sách host URL mà handler này sẽ xử lý */\n hosts: string[];\n /** Can thiệp request: gắn header, token, transform body... */\n intercept?: (request: HttpRequest<any>) => HttpRequest<any>;\n /** Hook chạy TRƯỚC khi gửi request (dùng để log, tracking...) */\n beforeRemote?: (request: HttpRequest<any>) => void | Promise<void>;\n /** Hook chạy SAU khi nhận response (xử lý lỗi, notify...) */\n afterRemote?: (response: HttpResponse<any> | HttpErrorResponse | Error) => void | Promise<void>;\n /** Transform response body thành kiểu dữ liệu mong muốn */\n mapResponse?: <Tres = any, Tdata = any>(response: Tres) => Tdata;\n /** Timeout tính bằng milliseconds. Mặc định: 30000 (30 giây) */\n timeout?: number;\n}\n\nexport interface ISdApiConfiguration {\n handlers: SdApiHandler[];\n}\n\nexport const SD_API_CONFIG = new InjectionToken<ISdApiConfiguration>('sd-api.configuration');\n\nexport const SD_API_CONFIGURATION = new InjectionToken<ISdApiConfiguration>('sd-api.configuration');\n","import { HttpClient } from '@angular/common/http';\nimport { inject, Injectable } from '@angular/core';\nimport { SdCacheService } from '@sdcorejs/angular/services/cache';\nimport { BrowserUtilities, Utilities } from '@sdcorejs/utils/fns';\nimport { lastValueFrom, Observable } from 'rxjs';\nimport { catchError, map, shareReplay, timeout } from 'rxjs/operators';\nimport { ISdApiConfiguration, SD_API_CONFIG, SdApiHandler, SdDeleteOption, SdGetOption, SdPostOption, SdPutOption } from './api.model';\n\n// Gom nhóm các Option lại cho gọn\ntype SdHttpOptions = SdGetOption & SdPostOption & SdPutOption & SdDeleteOption;\ntype HttpMethod = 'GET' | 'POST' | 'PUT' | 'DELETE';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class SdApiService {\n readonly #defaultTimeout = 60000; // 60s\n readonly #dedupCacheDuration = 1000; // 1s (Deduplication cache duration)\n #httpClient = inject(HttpClient);\n #configurations = inject<ISdApiConfiguration[]>(SD_API_CONFIG, { optional: true }) || [];\n #cacheService = inject(SdCacheService);\n\n // Thay đổi cấu trúc Cache: Lưu Observable thay vì Subject phức tạp\n // Key: hash string -> Value: { stream$: Observable, expiry: number }\n #inFlightRequests = new Map<string, { stream$: Observable<any>; expiry: number }>();\n\n constructor() {\n // Optional: Cơ chế dọn dẹp cache định kỳ (mỗi 1 phút dọn dẹp các key hết hạn)\n setInterval(() => this.#cleanupCache(), 60000);\n }\n\n get http() {\n return this.#httpClient;\n }\n\n // --- PUBLIC METHODS ---\n\n get = <T = any>(url: string, option?: SdGetOption): Promise<T> => {\n return this.#executeWithLayeredCache<T>(url, 'GET', undefined, option);\n };\n\n post = <T = any>(url: string, body?: any, option?: SdPostOption): Promise<T> => {\n return this.#executeWithLayeredCache<T>(url, 'POST', body, option);\n };\n\n put = <T = any>(url: string, body?: any, option?: SdPutOption): Promise<T> => {\n return this.#executeWithLayeredCache<T>(url, 'PUT', body, option);\n };\n\n delete = <T = any>(url: string, option?: SdDeleteOption): Promise<T> => {\n return this.#executeWithLayeredCache<T>(url, 'DELETE', undefined, option);\n };\n\n // Upload file logic giữ nguyên nhưng refactor nhẹ\n upload = async (url: string, option?: { extensions?: string[]; maxSizeInMb?: number }): Promise<any> => {\n const file = await BrowserUtilities.upload(option);\n if (!Array.isArray(file) && file) {\n return this.uploadFile(url, file);\n }\n };\n\n uploadFile = async (url: string, file: File): Promise<any> => {\n if (!file) return null;\n if (file.name.lastIndexOf('.') === -1) throw new Error('Invalid file extension');\n\n const formData = new FormData();\n formData.append('file', file, file.name);\n // Upload thường không cần deduplication cache, set autoCache: false\n return await this.post(url, formData, { autoCache: false });\n };\n\n // --- PRIVATE CORE LOGIC ---\n\n /**\n * Hàm trung gian xử lý Layer Cache (SdCacheService) trước khi gọi API thực tế\n */\n #executeWithLayeredCache = async <T>(url: string, method: HttpMethod, body?: any, option?: SdHttpOptions): Promise<T> => {\n // Layer 1: Persistent Cache (SdCacheService)\n if (option?.cacheOption) {\n const key = this.#generateKey(url, method, body, option);\n const { get, set, has } = this.#cacheService.create(key, option.cacheOption);\n\n if (has()) {\n return get();\n }\n\n const result = await this.#request<T>(url, method, body, option);\n set(result);\n return result;\n }\n\n // Không có cache dài hạn thì gọi trực tiếp logic deduplication\n return this.#request<T>(url, method, body, option);\n };\n\n /**\n * Core Request: Xử lý Deduplication, Timeout, Mapping Response\n */\n #request = <T>(url: string, method: HttpMethod, body: any, option?: SdHttpOptions): Promise<T> => {\n const key = this.#generateKey(url, method, body, option);\n\n // Layer 2: Deduplication Cache (In-Flight Request / Short-term cache)\n const now = Date.now();\n const cachedItem = this.#inFlightRequests.get(key);\n\n // Nếu đã có request đang chạy hoặc mới chạy xong trong vòng 1s -> Trả về stream đó luôn\n if (cachedItem && cachedItem.expiry > now) {\n return lastValueFrom(cachedItem.stream$);\n }\n\n // Setup request mới\n const handler = this.#getHandler(url);\n const apiTimeout = option?.timeout ?? handler?.timeout ?? this.#defaultTimeout;\n\n // Tạo Observable call API\n const request$ = this.#httpClient\n .request(method, url, {\n body,\n headers: option?.headers,\n params: option?.params,\n observe: 'response', // Lấy full response để check status\n responseType: option?.responseType,\n })\n .pipe(\n timeout(apiTimeout),\n map(res => {\n // Normalize Response Logic\n const bodyRes = res.body as any;\n // Logic check response cũ của bạn\n if (bodyRes && typeof bodyRes === 'object' && 'ok' in bodyRes && !bodyRes.ok) {\n throw bodyRes; // Giả sử structure trả về { ok: false, ... } là lỗi\n }\n\n if (handler?.mapResponse) {\n return handler.mapResponse(bodyRes);\n }\n\n return bodyRes;\n }),\n catchError(err => {\n // Xóa cache ngay lập tức nếu lỗi để user có thể retry\n this.#inFlightRequests.delete(key);\n throw err;\n }),\n // QUAN TRỌNG: shareReplay(1) giúp share kết quả cho các subscriber đến sau (trong 1s)\n shareReplay(1)\n );\n\n // Lưu vào Map\n this.#inFlightRequests.set(key, {\n stream$: request$,\n expiry: now + this.#dedupCacheDuration,\n });\n\n // Chuyển đổi sang Promise cho đúng return type của bạn\n return lastValueFrom(request$);\n };\n\n // --- HELPERS ---\n\n #getHandler = (url: string): SdApiHandler | undefined => {\n const handlers = this.#configurations.flatMap(b => b?.handlers || []);\n return handlers.find(e => e.hosts.some(host => url.startsWith(host)));\n };\n\n #generateKey = (url: string, method: HttpMethod, body: any, option?: SdHttpOptions): string => {\n // FormData không hash được nội dung file, luôn generate key mới\n if (body instanceof FormData || option?.autoCache === false) {\n return Utilities.generateUuid();\n }\n return Utilities.hash({\n url,\n method,\n params: option?.params,\n headers: option?.headers,\n body,\n });\n };\n\n // Dọn dẹp memory leak\n #cleanupCache() {\n const now = Date.now();\n this.#inFlightRequests.forEach((value, key) => {\n if (value.expiry < now) {\n this.#inFlightRequests.delete(key);\n }\n });\n }\n}\n","import { HttpErrorResponse, HttpEvent, HttpHandler, HttpInterceptor, HttpRequest, HttpResponse } from '@angular/common/http';\nimport { inject, Injectable } from '@angular/core';\nimport { from, Observable, throwError } from 'rxjs';\nimport { catchError, map, switchMap } from 'rxjs/operators';\nimport { ISdApiConfiguration, SD_API_CONFIG } from '../api.model';\n\n@Injectable()\nexport class SdHttpInterceptor implements HttpInterceptor {\n #configurations = inject<ISdApiConfiguration[]>(SD_API_CONFIG, { optional: true }) || [];\n\n intercept(request: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {\n const url = request.url;\n if (!url) {\n throw new Error(`Invalid URL`);\n }\n const handlers = this.#configurations.flatMap(configuration => configuration?.handlers || []);\n const handler = handlers?.find(e => e.hosts.some(host => url.startsWith(host)));\n const intercept = handler?.intercept;\n if (intercept) {\n request = request.clone(intercept(request));\n }\n if (request.body instanceof FormData) {\n request = request.clone({\n headers: request.headers.delete('Content-Type'),\n });\n }\n const beforeRemoteHandler = handler?.beforeRemote;\n const afterRemoteHandler = handler?.afterRemote;\n const beforeRemote = beforeRemoteHandler?.(request);\n if (beforeRemote instanceof Promise) {\n return from(beforeRemote).pipe(\n switchMap(() => next.handle(request)),\n map((event: HttpEvent<any>) => {\n if (event instanceof HttpResponse) {\n afterRemoteHandler?.(event);\n }\n return event;\n }),\n catchError((error: HttpErrorResponse) => {\n afterRemoteHandler?.(error);\n return throwError(() => error);\n })\n );\n }\n return next.handle(request).pipe(\n map((event: HttpEvent<any>) => {\n if (event instanceof HttpResponse) {\n afterRemoteHandler?.(event);\n }\n return event;\n }),\n catchError((error: HttpErrorResponse) => {\n afterRemoteHandler?.(error);\n return throwError(() => error);\n })\n );\n }\n}\n","import { HTTP_INTERCEPTORS, provideHttpClient, withInterceptorsFromDi } from '@angular/common/http';\nimport { NgModule } from '@angular/core';\nimport { SdHttpInterceptor } from './interceptors/api.interceptor';\n\n@NgModule({\n imports: [],\n exports: [],\n providers: [provideHttpClient(withInterceptorsFromDi()), { provide: HTTP_INTERCEPTORS, useClass: SdHttpInterceptor, multi: true }],\n})\nexport class SdApiModule {}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"sdcorejs-angular-services-api.mjs","sources":["../../../projects/sdcorejs-angular/services/api/src/api.model.ts","../../../projects/sdcorejs-angular/services/api/src/api.service.ts","../../../projects/sdcorejs-angular/services/api/src/interceptors/api.interceptor.ts","../../../projects/sdcorejs-angular/services/api/src/api.module.ts","../../../projects/sdcorejs-angular/services/api/sdcorejs-angular-services-api.ts"],"sourcesContent":["import { HttpContext, HttpErrorResponse, HttpHeaders, HttpParams, HttpRequest, HttpResponse } from '@angular/common/http';\nimport { InjectionToken } from '@angular/core';\nimport { SdCacheOption } from '@sdcorejs/angular/services/cache';\n\nexport type SdApiResponseType = 'arraybuffer' | 'blob' | 'json' | 'text';\ntype SdApiBivariantCallback<TArgument, TResult> = { bivarianceHack(argument: TArgument): TResult }['bivarianceHack'];\n\nexport interface SdApiHttpOption {\n headers?: HttpHeaders | Record<string, string | string[]>;\n context?: HttpContext;\n params?: HttpParams | Record<string, string | number | boolean | readonly (string | number | boolean)[]>;\n observe?: 'body';\n reportProgress?: boolean;\n responseType?: SdApiResponseType;\n withCredentials?: boolean;\n transferCache?: { includeHeaders?: string[] } | boolean;\n}\n\nexport interface SdApiRetryOption {\n /** Number of retries after the initial request. Values are clamped to a finite safe limit. */\n attempts: number;\n /** Delay before the first retry. Defaults to 0. */\n delayMs?: number;\n /** Multiplier applied to each subsequent delay. Defaults to 1. */\n backoff?: number;\n /** Overrides the default transient HTTP-status predicate. `attempt` is one-based. */\n retryWhen?: (error: unknown, attempt: number) => boolean;\n /** Required to retry POST, PUT, PATCH, or DELETE. */\n mutations?: boolean;\n}\n\nexport interface SdApiOption {\n cacheOption?: SdCacheOption;\n timeout?: number; // Default: 60000 (60s)\n /** Cancels only this caller; a shared HTTP request continues while another caller remains. */\n signal?: AbortSignal;\n /** Enables request deduplication. Defaults to true for GET and false for mutations. */\n dedupe?: boolean;\n /** Keeps a successful dedupe result replayable for this duration. Defaults to 1000ms. */\n dedupeWindowMs?: number;\n /** Opt-in bounded retry policy. The default is no retries. */\n retry?: SdApiRetryOption;\n /**\n * @deprecated Use `dedupe`. When both are provided, `dedupe` takes precedence.\n * Explicit `true` remains a compatibility opt-in for mutation deduplication.\n */\n autoCache?: boolean;\n}\n\nexport type SdGetOption = SdApiHttpOption & SdApiOption;\nexport type SdPostOption = SdApiHttpOption & SdApiOption;\nexport type SdPutOption = SdApiHttpOption & SdApiOption;\nexport type SdPatchOption = SdApiHttpOption & SdApiOption;\nexport type SdDeleteOption = SdApiHttpOption & SdApiOption;\nexport type SdApiRequestUpdate = Parameters<HttpRequest<unknown>['clone']>[0];\n\nexport interface SdApiHandler {\n /** Danh sách host URL mà handler này sẽ xử lý */\n hosts: string[];\n /** Can thiệp request: gắn header, token, transform body... */\n intercept?: SdApiBivariantCallback<HttpRequest<unknown>, HttpRequest<unknown> | SdApiRequestUpdate>;\n /** Hook chạy TRƯỚC khi gửi request (dùng để log, tracking...) */\n beforeRemote?: SdApiBivariantCallback<HttpRequest<unknown>, void | Promise<void>>;\n /** Hook chạy SAU khi nhận response (xử lý lỗi, notify...) */\n afterRemote?: SdApiBivariantCallback<HttpResponse<unknown> | HttpErrorResponse | Error, void | Promise<void>>;\n /** Transform response body thành kiểu dữ liệu mong muốn */\n mapResponse?: SdApiBivariantCallback<unknown, unknown>;\n /** Timeout tính bằng milliseconds. Mặc định: 60000 (60 giây) */\n timeout?: number;\n}\n\nexport interface ISdApiConfiguration {\n handlers?: SdApiHandler[];\n}\n\nexport const SD_API_CONFIG = new InjectionToken<ISdApiConfiguration>('sd-api.configuration');\n\n/** @deprecated Use `SD_API_CONFIG`. This is the same injection token. */\nexport const SD_API_CONFIGURATION = SD_API_CONFIG;\n","import { HttpClient, HttpErrorResponse, HttpHeaders, HttpParams, HttpRequest, HttpResponse } from '@angular/common/http';\nimport { DestroyRef, inject, Injectable } from '@angular/core';\nimport { SdCacheService } from '@sdcorejs/angular/services/cache';\nimport { BrowserUtilities, Utilities } from '@sdcorejs/utils/fns';\nimport { Observable, of, Subscription, throwError, timer, TimeoutError } from 'rxjs';\nimport { filter, map, retry, timeout } from 'rxjs/operators';\nimport {\n ISdApiConfiguration,\n SD_API_CONFIG,\n SdApiHandler,\n SdApiRetryOption,\n SdDeleteOption,\n SdGetOption,\n SdPatchOption,\n SdPostOption,\n SdPutOption,\n} from './api.model';\n\ntype SdHttpOptions = SdGetOption & SdPostOption & SdPutOption & SdPatchOption & SdDeleteOption;\ntype HttpMethod = 'GET' | 'POST' | 'PUT' | 'PATCH' | 'DELETE';\ntype SharedRequestState = 'pending' | 'succeeded' | 'failed' | 'cancelled';\n\ninterface SharedRequest {\n readonly key?: string;\n readonly replayWindowMs: number;\n readonly promise: Promise<unknown>;\n resolve(value: unknown): void;\n reject(error: unknown): void;\n subscription: Subscription;\n owners: number;\n state: SharedRequestState;\n replayTimer?: ReturnType<typeof setTimeout>;\n}\n\ninterface PreparedRequest {\n request: SharedRequest;\n source: Observable<unknown>;\n}\n\n/**\n * Response generics intentionally default to `unknown` for type safety.\n * Callers should specify `T`; migration guidance is tracked for Task 13.\n */\n@Injectable({\n providedIn: 'root',\n})\nexport class SdApiService {\n readonly #defaultTimeout = 60000;\n readonly #defaultDedupeWindowMs = 1000;\n readonly #maxTimerMs = 2_147_483_647;\n readonly #maxRetryAttempts = 10;\n readonly #httpClient = inject(HttpClient);\n readonly #configurations = inject<ISdApiConfiguration[]>(SD_API_CONFIG, { optional: true }) ?? [];\n readonly #cacheService = inject(SdCacheService);\n readonly #destroyRef = inject(DestroyRef);\n readonly #sharedRequests = new Map<string, SharedRequest>();\n readonly #activeRequests = new Set<SharedRequest>();\n readonly #objectIds = new WeakMap<object, number>();\n #nextObjectId = 1;\n #destroyed = false;\n\n constructor() {\n this.#destroyRef.onDestroy(() => this.#destroy());\n }\n\n get http(): HttpClient {\n return this.#httpClient;\n }\n\n get = <T = unknown>(url: string, option?: SdGetOption): Promise<T> => {\n return this.#executeWithLayeredCache<T>(url, 'GET', undefined, option);\n };\n\n post = <T = unknown>(url: string, body?: unknown, option?: SdPostOption): Promise<T> => {\n return this.#executeWithLayeredCache<T>(url, 'POST', body, option);\n };\n\n put = <T = unknown>(url: string, body?: unknown, option?: SdPutOption): Promise<T> => {\n return this.#executeWithLayeredCache<T>(url, 'PUT', body, option);\n };\n\n patch = <T = unknown>(url: string, body?: unknown, option?: SdPatchOption): Promise<T> => {\n return this.#executeWithLayeredCache<T>(url, 'PATCH', body, option);\n };\n\n delete = <T = unknown>(url: string, option?: SdDeleteOption): Promise<T> => {\n return this.#executeWithLayeredCache<T>(url, 'DELETE', undefined, option);\n };\n\n upload = async <T = unknown>(url: string, option?: { extensions?: string[]; maxSizeInMb?: number }): Promise<T | null | undefined> => {\n const file = await BrowserUtilities.upload(option);\n if (!Array.isArray(file) && file) {\n return this.uploadFile<T>(url, file);\n }\n return undefined;\n };\n\n uploadFile = async <T = unknown>(url: string, file: File | null | undefined): Promise<T | null> => {\n if (!file) return null;\n if (file.name.lastIndexOf('.') === -1) throw new Error('Invalid file extension');\n\n const formData = new FormData();\n formData.append('file', file, file.name);\n return this.post<T>(url, formData, { dedupe: false });\n };\n\n async #executeWithLayeredCache<T>(url: string, method: HttpMethod, body?: unknown, option?: SdHttpOptions): Promise<T> {\n if (this.#destroyed || option?.signal?.aborted) {\n throw this.#createAbortError();\n }\n\n if (!option?.cacheOption) {\n return this.#request<T>(url, method, body, option);\n }\n\n const key = this.#generateKey(url, method, body, option);\n const cache = this.#cacheService.create<T>(key, option.cacheOption);\n try {\n const cached = cache.snapshot();\n if (cached.present) return cached.value;\n\n const result = await this.#request<T>(url, method, body, option);\n cache.set(result);\n return result;\n } finally {\n cache.release();\n }\n }\n\n #request<T>(url: string, method: HttpMethod, body?: unknown, option?: SdHttpOptions): Promise<T> {\n if (this.#destroyed || option?.signal?.aborted) {\n return Promise.reject(this.#createAbortError());\n }\n\n const shouldDedupe = option?.dedupe ?? option?.autoCache ?? method === 'GET';\n const key = shouldDedupe ? this.#generateRequestKey(url, method, body, option) : undefined;\n let request = key ? this.#sharedRequests.get(key) : undefined;\n\n if (!request) {\n const prepared = this.#prepareRequest(url, method, body, option, key);\n request = prepared.request;\n if (key) this.#sharedRequests.set(key, request);\n this.#startRequest(request, prepared.source);\n }\n\n return this.#attachCaller<T>(request, option?.signal);\n }\n\n #prepareRequest(\n url: string,\n method: HttpMethod,\n body: unknown,\n option: SdHttpOptions | undefined,\n key: string | undefined\n ): PreparedRequest {\n let resolve!: (value: unknown) => void;\n let reject!: (error: unknown) => void;\n const promise = new Promise<unknown>((resolvePromise, rejectPromise) => {\n resolve = resolvePromise;\n reject = rejectPromise;\n });\n const request: SharedRequest = {\n key,\n replayWindowMs: this.#normalizeDedupeWindow(option?.dedupeWindowMs),\n promise,\n resolve,\n reject,\n subscription: Subscription.EMPTY,\n owners: 0,\n state: 'pending',\n };\n this.#activeRequests.add(request);\n\n const handler = this.#getHandler(url);\n const httpRequest = new HttpRequest<unknown>(method, url, body ?? null, {\n headers: this.#toHttpHeaders(option?.headers),\n context: option?.context,\n params: this.#toHttpParams(option?.params),\n reportProgress: option?.reportProgress,\n responseType: option?.responseType ?? 'json',\n withCredentials: option?.withCredentials,\n transferCache: option?.transferCache,\n });\n const source = this.#withRetry(\n this.#httpClient.request(httpRequest).pipe(\n timeout(this.#resolveTimeout(url, option?.timeout)),\n filter((event): event is HttpResponse<unknown> => event instanceof HttpResponse),\n map(response => this.#mapResponse(response.body, handler))\n ),\n method,\n option?.retry\n );\n\n return { request, source };\n }\n\n #startRequest(request: SharedRequest, source: Observable<unknown>): void {\n request.subscription = source.subscribe({\n next: value => this.#completeSuccess(request, value),\n error: error => this.#completeError(request, error),\n complete: () => {\n if (request.state === 'pending') {\n this.#completeError(request, new Error('HTTP request completed without a response'));\n }\n },\n });\n }\n\n #attachCaller<T>(request: SharedRequest, signal?: AbortSignal): Promise<T> {\n request.owners++;\n\n return new Promise<T>((resolve, reject) => {\n let settled = false;\n const cleanup = (): void => {\n if (signal) signal.removeEventListener('abort', abort);\n };\n const release = (): void => {\n request.owners = Math.max(0, request.owners - 1);\n if (request.state === 'pending' && request.owners === 0) {\n this.#cancelRequest(request);\n }\n };\n const abort = (): void => {\n if (settled) return;\n settled = true;\n cleanup();\n release();\n reject(this.#createAbortError());\n };\n\n if (signal) {\n signal.addEventListener('abort', abort, { once: true });\n if (signal.aborted) {\n abort();\n return;\n }\n }\n\n request.promise.then(\n value => {\n if (settled) return;\n settled = true;\n cleanup();\n release();\n resolve(value as T);\n },\n error => {\n if (settled) return;\n settled = true;\n cleanup();\n release();\n reject(error);\n }\n );\n });\n }\n\n #completeSuccess(request: SharedRequest, value: unknown): void {\n if (request.state !== 'pending') return;\n request.state = 'succeeded';\n request.resolve(value);\n\n if (!request.key) {\n this.#activeRequests.delete(request);\n return;\n }\n\n if (request.replayWindowMs === 0) {\n this.#evictRequest(request);\n return;\n }\n\n request.replayTimer = setTimeout(() => this.#evictRequest(request), request.replayWindowMs);\n }\n\n #completeError(request: SharedRequest, error: unknown): void {\n if (request.state !== 'pending') return;\n request.state = 'failed';\n this.#removeRequest(request);\n request.reject(error);\n }\n\n #cancelRequest(request: SharedRequest): void {\n if (request.state !== 'pending') return;\n request.state = 'cancelled';\n request.subscription.unsubscribe();\n this.#removeRequest(request);\n request.reject(this.#createAbortError());\n }\n\n #evictRequest(request: SharedRequest): void {\n if (request.replayTimer !== undefined) {\n clearTimeout(request.replayTimer);\n request.replayTimer = undefined;\n }\n this.#removeRequest(request);\n }\n\n #removeRequest(request: SharedRequest): void {\n if (request.key && this.#sharedRequests.get(request.key) === request) {\n this.#sharedRequests.delete(request.key);\n }\n this.#activeRequests.delete(request);\n }\n\n #withRetry(source: Observable<unknown>, method: HttpMethod, option?: SdApiRetryOption): Observable<unknown> {\n const attempts = this.#normalizeRetryAttempts(option?.attempts);\n const mutation = method !== 'GET';\n if (attempts === 0 || (mutation && option?.mutations !== true)) {\n return source;\n }\n\n return source.pipe(\n retry({\n count: attempts,\n delay: (error: unknown, attempt: number) => {\n if (this.#isAbortError(error) || !this.#shouldRetry(error, attempt, option)) {\n return throwError(() => error);\n }\n\n const baseDelay = this.#normalizeRetryDelay(option?.delayMs);\n const backoff = this.#normalizeRetryBackoff(option?.backoff);\n const computedDelay = baseDelay * Math.pow(backoff, attempt - 1);\n const delayMs = Number.isFinite(computedDelay) ? Math.min(this.#maxTimerMs, computedDelay) : this.#maxTimerMs;\n return delayMs > 0 ? timer(delayMs) : of(undefined);\n },\n })\n );\n }\n\n #shouldRetry(error: unknown, attempt: number, option: SdApiRetryOption | undefined): boolean {\n if (option?.retryWhen) {\n return option.retryWhen(error, attempt);\n }\n if (error instanceof TimeoutError) return true;\n if (!(error instanceof HttpErrorResponse)) return false;\n return error.status === 0 || [408, 425, 429, 500, 502, 503, 504].includes(error.status);\n }\n\n #mapResponse(body: unknown, handler: SdApiHandler | undefined): unknown {\n if (body !== null && typeof body === 'object' && 'ok' in body && body.ok === false) {\n throw body;\n }\n return handler?.mapResponse ? handler.mapResponse(body) : body;\n }\n\n #getHandler(url: string): SdApiHandler | undefined {\n const handlers = this.#configurations.flatMap(configuration => configuration.handlers ?? []);\n return handlers.find(handler => handler.hosts.some(host => url.startsWith(host)));\n }\n\n #generateKey(url: string, method: HttpMethod, body: unknown, option?: SdHttpOptions): string {\n return Utilities.hash({\n method,\n url,\n body: this.#normalizeBody(body),\n headers: this.#normalizeHeaders(option?.headers),\n params: this.#normalizeParams(option?.params),\n context: option?.context ? this.#getObjectId(option.context) : undefined,\n reportProgress: option?.reportProgress ?? false,\n responseType: option?.responseType ?? 'json',\n withCredentials: option?.withCredentials ?? false,\n transferCache: option?.transferCache,\n timeout: this.#resolveTimeout(url, option?.timeout),\n retry: option?.retry\n ? {\n attempts: this.#normalizeRetryAttempts(option.retry.attempts),\n delayMs: this.#normalizeRetryDelay(option.retry.delayMs),\n backoff: this.#normalizeRetryBackoff(option.retry.backoff),\n mutations: option.retry.mutations,\n retryWhen: option.retry.retryWhen ? this.#getObjectId(option.retry.retryWhen) : undefined,\n }\n : undefined,\n });\n }\n\n #generateRequestKey(url: string, method: HttpMethod, body: unknown, option?: SdHttpOptions): string {\n return Utilities.hash({\n responseKey: this.#generateKey(url, method, body, option),\n dedupeWindowMs: this.#normalizeDedupeWindow(option?.dedupeWindowMs),\n });\n }\n\n #normalizeDedupeWindow(dedupeWindowMs: number | undefined): number {\n return this.#normalizeFiniteNumber(dedupeWindowMs, this.#defaultDedupeWindowMs, 0, this.#maxTimerMs);\n }\n\n #resolveTimeout(url: string, timeoutMs: number | undefined): number {\n const configuredTimeout = timeoutMs === undefined ? this.#getHandler(url)?.timeout : timeoutMs;\n return this.#normalizeFiniteNumber(configuredTimeout, this.#defaultTimeout, 0, this.#maxTimerMs);\n }\n\n #normalizeRetryAttempts(attempts: number | undefined): number {\n return Math.floor(this.#normalizeFiniteNumber(attempts, 0, 0, this.#maxRetryAttempts));\n }\n\n #normalizeRetryDelay(delayMs: number | undefined): number {\n return this.#normalizeFiniteNumber(delayMs, 0, 0, this.#maxTimerMs);\n }\n\n #normalizeRetryBackoff(backoff: number | undefined): number {\n const normalized = this.#normalizeFiniteNumber(backoff, 1, 0, this.#maxTimerMs);\n return normalized > 0 ? normalized : 1;\n }\n\n #normalizeFiniteNumber(value: number | undefined, defaultValue: number, minimum: number, maximum: number): number {\n if (value === undefined || !Number.isFinite(value)) return defaultValue;\n return Math.min(maximum, Math.max(minimum, value));\n }\n\n #normalizeBody(body: unknown, ancestors = new WeakSet<object>()): unknown {\n if (body === null || typeof body !== 'object') return body;\n if (typeof URLSearchParams !== 'undefined' && body instanceof URLSearchParams) {\n return { urlSearchParams: body.toString() };\n }\n if (typeof FormData !== 'undefined' && body instanceof FormData) {\n return { objectType: 'FormData', objectId: this.#getObjectId(body) };\n }\n if (typeof Blob !== 'undefined' && body instanceof Blob) {\n return { objectType: 'Blob', objectId: this.#getObjectId(body) };\n }\n if (typeof ArrayBuffer !== 'undefined' && (body instanceof ArrayBuffer || ArrayBuffer.isView(body))) {\n return { objectType: 'ArrayBuffer', objectId: this.#getObjectId(body) };\n }\n if (body instanceof Date) {\n return { date: body.getTime() };\n }\n if (ancestors.has(body)) {\n return { circularObjectId: this.#getObjectId(body) };\n }\n if (Array.isArray(body)) {\n ancestors.add(body);\n const normalized = body.map(value => this.#normalizeBody(value, ancestors));\n ancestors.delete(body);\n return normalized;\n }\n const prototype = Object.getPrototypeOf(body);\n if (prototype === Object.prototype || prototype === null) {\n ancestors.add(body);\n const normalized = Object.fromEntries(Object.entries(body).map(([key, value]) => [key, this.#normalizeBody(value, ancestors)]));\n ancestors.delete(body);\n return normalized;\n }\n return { objectType: prototype?.constructor?.name ?? 'Object', objectId: this.#getObjectId(body) };\n }\n\n #normalizeHeaders(headers: SdHttpOptions['headers']): unknown {\n if (headers instanceof HttpHeaders) {\n return headers\n .keys()\n .sort()\n .map(key => [key.toLowerCase(), headers.getAll(key)]);\n }\n return headers;\n }\n\n #normalizeParams(params: SdHttpOptions['params']): unknown {\n if (params instanceof HttpParams) {\n return params\n .keys()\n .sort()\n .map(key => [key, params.getAll(key)]);\n }\n return params;\n }\n\n #toHttpHeaders(headers: SdHttpOptions['headers']): HttpHeaders | undefined {\n if (!headers || headers instanceof HttpHeaders) return headers;\n return new HttpHeaders(headers);\n }\n\n #toHttpParams(params: SdHttpOptions['params']): HttpParams | undefined {\n if (!params || params instanceof HttpParams) return params;\n return new HttpParams({ fromObject: params });\n }\n\n #getObjectId(value: object): number {\n const existing = this.#objectIds.get(value);\n if (existing !== undefined) return existing;\n const id = this.#nextObjectId++;\n this.#objectIds.set(value, id);\n return id;\n }\n\n #createAbortError(): Error {\n const error = new Error('The operation was aborted');\n error.name = 'AbortError';\n return error;\n }\n\n #isAbortError(error: unknown): boolean {\n return error instanceof Error && error.name === 'AbortError';\n }\n\n #destroy(): void {\n if (this.#destroyed) return;\n this.#destroyed = true;\n\n for (const request of [...this.#activeRequests]) {\n if (request.replayTimer !== undefined) {\n clearTimeout(request.replayTimer);\n request.replayTimer = undefined;\n }\n if (request.state === 'pending') {\n request.state = 'cancelled';\n request.subscription.unsubscribe();\n request.reject(this.#createAbortError());\n }\n this.#removeRequest(request);\n }\n this.#sharedRequests.clear();\n this.#activeRequests.clear();\n }\n}\n","import { HttpErrorResponse, HttpEvent, HttpHandler, HttpInterceptor, HttpRequest, HttpResponse } from '@angular/common/http';\nimport { inject, Injectable } from '@angular/core';\nimport { defer, from, Observable, of, throwError } from 'rxjs';\nimport { catchError, concatMap, dematerialize, map, materialize, switchMap } from 'rxjs/operators';\nimport { ISdApiConfiguration, SD_API_CONFIG, SdApiHandler } from '../api.model';\n\n@Injectable()\nexport class SdHttpInterceptor implements HttpInterceptor {\n readonly #configurations = inject<ISdApiConfiguration[]>(SD_API_CONFIG, { optional: true }) ?? [];\n\n intercept(request: HttpRequest<unknown>, next: HttpHandler): Observable<HttpEvent<unknown>> {\n if (!request.url) throw new Error('Invalid URL');\n\n const handler = this.#findHandler(request.url);\n if (handler?.intercept) {\n const interceptedRequest = handler.intercept(request);\n request = interceptedRequest instanceof HttpRequest ? interceptedRequest : request.clone(interceptedRequest);\n }\n if (typeof FormData !== 'undefined' && request.body instanceof FormData) {\n request = request.clone({ headers: request.headers.delete('Content-Type') });\n }\n\n const beforeRemote = handler?.beforeRemote?.(request);\n if (beforeRemote instanceof Promise) {\n return from(beforeRemote).pipe(switchMap(() => this.#handleRemote(request, next, handler)));\n }\n return this.#handleRemote(request, next, handler);\n }\n\n #handleRemote(request: HttpRequest<unknown>, next: HttpHandler, handler: SdApiHandler | undefined): Observable<HttpEvent<unknown>> {\n return next.handle(request).pipe(\n materialize(),\n concatMap(notification => {\n const afterValue =\n notification.kind === 'N' && notification.value instanceof HttpResponse\n ? notification.value\n : notification.kind === 'E' && (notification.error instanceof Error || notification.error instanceof HttpErrorResponse)\n ? notification.error\n : undefined;\n if (!afterValue || !handler?.afterRemote) {\n return of(notification);\n }\n\n return defer(() => {\n const result = handler.afterRemote?.(afterValue);\n return result instanceof Promise ? result : Promise.resolve();\n }).pipe(\n map(() => notification),\n catchError(hookError => (notification.kind === 'E' ? of(notification) : throwError(() => hookError)))\n );\n }),\n dematerialize()\n );\n }\n\n #findHandler(url: string): SdApiHandler | undefined {\n const handlers = this.#configurations.flatMap(configuration => configuration.handlers ?? []);\n return handlers.find(handler => handler.hosts.some(host => url.startsWith(host)));\n }\n}\n","import { HTTP_INTERCEPTORS, provideHttpClient, withInterceptorsFromDi } from '@angular/common/http';\nimport { NgModule } from '@angular/core';\nimport { SdHttpInterceptor } from './interceptors/api.interceptor';\n\n@NgModule({\n imports: [],\n exports: [],\n providers: [provideHttpClient(withInterceptorsFromDi()), { provide: HTTP_INTERCEPTORS, useClass: SdHttpInterceptor, multi: true }],\n})\nexport class SdApiModule {}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":";;;;;;;;MA2Ea,aAAa,GAAG,IAAI,cAAc,CAAsB,sBAAsB;AAE3F;AACO,MAAM,oBAAoB,GAAG;;ACvCpC;;;AAGG;MAIU,YAAY,CAAA;IACd,eAAe,GAAG,KAAK;IACvB,sBAAsB,GAAG,IAAI;IAC7B,WAAW,GAAG,aAAa;IAC3B,iBAAiB,GAAG,EAAE;AACtB,IAAA,WAAW,GAAG,MAAM,CAAC,UAAU,CAAC;AAChC,IAAA,eAAe,GAAG,MAAM,CAAwB,aAAa,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,IAAI,EAAE;AACxF,IAAA,aAAa,GAAG,MAAM,CAAC,cAAc,CAAC;AACtC,IAAA,WAAW,GAAG,MAAM,CAAC,UAAU,CAAC;AAChC,IAAA,eAAe,GAAG,IAAI,GAAG,EAAyB;AAClD,IAAA,eAAe,GAAG,IAAI,GAAG,EAAiB;AAC1C,IAAA,UAAU,GAAG,IAAI,OAAO,EAAkB;IACnD,aAAa,GAAG,CAAC;IACjB,UAAU,GAAG,KAAK;AAElB,IAAA,WAAA,GAAA;AACE,QAAA,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,MAAM,IAAI,CAAC,QAAQ,EAAE,CAAC;IACnD;AAEA,IAAA,IAAI,IAAI,GAAA;QACN,OAAO,IAAI,CAAC,WAAW;IACzB;AAEA,IAAA,GAAG,GAAG,CAAc,GAAW,EAAE,MAAoB,KAAgB;AACnE,QAAA,OAAO,IAAI,CAAC,wBAAwB,CAAI,GAAG,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,CAAC;AACxE,IAAA,CAAC;IAED,IAAI,GAAG,CAAc,GAAW,EAAE,IAAc,EAAE,MAAqB,KAAgB;AACrF,QAAA,OAAO,IAAI,CAAC,wBAAwB,CAAI,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC;AACpE,IAAA,CAAC;IAED,GAAG,GAAG,CAAc,GAAW,EAAE,IAAc,EAAE,MAAoB,KAAgB;AACnF,QAAA,OAAO,IAAI,CAAC,wBAAwB,CAAI,GAAG,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,CAAC;AACnE,IAAA,CAAC;IAED,KAAK,GAAG,CAAc,GAAW,EAAE,IAAc,EAAE,MAAsB,KAAgB;AACvF,QAAA,OAAO,IAAI,CAAC,wBAAwB,CAAI,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,CAAC;AACrE,IAAA,CAAC;AAED,IAAA,MAAM,GAAG,CAAc,GAAW,EAAE,MAAuB,KAAgB;AACzE,QAAA,OAAO,IAAI,CAAC,wBAAwB,CAAI,GAAG,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,CAAC;AAC3E,IAAA,CAAC;AAED,IAAA,MAAM,GAAG,OAAoB,GAAW,EAAE,MAAwD,KAAmC;QACnI,MAAM,IAAI,GAAG,MAAM,gBAAgB,CAAC,MAAM,CAAC,MAAM,CAAC;QAClD,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,IAAI,EAAE;YAChC,OAAO,IAAI,CAAC,UAAU,CAAI,GAAG,EAAE,IAAI,CAAC;QACtC;AACA,QAAA,OAAO,SAAS;AAClB,IAAA,CAAC;AAED,IAAA,UAAU,GAAG,OAAoB,GAAW,EAAE,IAA6B,KAAuB;AAChG,QAAA,IAAI,CAAC,IAAI;AAAE,YAAA,OAAO,IAAI;QACtB,IAAI,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;AAAE,YAAA,MAAM,IAAI,KAAK,CAAC,wBAAwB,CAAC;AAEhF,QAAA,MAAM,QAAQ,GAAG,IAAI,QAAQ,EAAE;QAC/B,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC;AACxC,QAAA,OAAO,IAAI,CAAC,IAAI,CAAI,GAAG,EAAE,QAAQ,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC;AACvD,IAAA,CAAC;IAED,MAAM,wBAAwB,CAAI,GAAW,EAAE,MAAkB,EAAE,IAAc,EAAE,MAAsB,EAAA;QACvG,IAAI,IAAI,CAAC,UAAU,IAAI,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE;AAC9C,YAAA,MAAM,IAAI,CAAC,iBAAiB,EAAE;QAChC;AAEA,QAAA,IAAI,CAAC,MAAM,EAAE,WAAW,EAAE;AACxB,YAAA,OAAO,IAAI,CAAC,QAAQ,CAAI,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC;QACpD;AAEA,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,YAAY,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC;AACxD,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,aAAa,CAAC,MAAM,CAAI,GAAG,EAAE,MAAM,CAAC,WAAW,CAAC;AACnE,QAAA,IAAI;AACF,YAAA,MAAM,MAAM,GAAG,KAAK,CAAC,QAAQ,EAAE;YAC/B,IAAI,MAAM,CAAC,OAAO;gBAAE,OAAO,MAAM,CAAC,KAAK;AAEvC,YAAA,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAI,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC;AAChE,YAAA,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC;AACjB,YAAA,OAAO,MAAM;QACf;gBAAU;YACR,KAAK,CAAC,OAAO,EAAE;QACjB;IACF;AAEA,IAAA,QAAQ,CAAI,GAAW,EAAE,MAAkB,EAAE,IAAc,EAAE,MAAsB,EAAA;QACjF,IAAI,IAAI,CAAC,UAAU,IAAI,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE;YAC9C,OAAO,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,iBAAiB,EAAE,CAAC;QACjD;AAEA,QAAA,MAAM,YAAY,GAAG,MAAM,EAAE,MAAM,IAAI,MAAM,EAAE,SAAS,IAAI,MAAM,KAAK,KAAK;QAC5E,MAAM,GAAG,GAAG,YAAY,GAAG,IAAI,CAAC,mBAAmB,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,GAAG,SAAS;AAC1F,QAAA,IAAI,OAAO,GAAG,GAAG,GAAG,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,SAAS;QAE7D,IAAI,CAAC,OAAO,EAAE;AACZ,YAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,eAAe,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,CAAC;AACrE,YAAA,OAAO,GAAG,QAAQ,CAAC,OAAO;AAC1B,YAAA,IAAI,GAAG;gBAAE,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,GAAG,EAAE,OAAO,CAAC;YAC/C,IAAI,CAAC,aAAa,CAAC,OAAO,EAAE,QAAQ,CAAC,MAAM,CAAC;QAC9C;QAEA,OAAO,IAAI,CAAC,aAAa,CAAI,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC;IACvD;IAEA,eAAe,CACb,GAAW,EACX,MAAkB,EAClB,IAAa,EACb,MAAiC,EACjC,GAAuB,EAAA;AAEvB,QAAA,IAAI,OAAkC;AACtC,QAAA,IAAI,MAAiC;QACrC,MAAM,OAAO,GAAG,IAAI,OAAO,CAAU,CAAC,cAAc,EAAE,aAAa,KAAI;YACrE,OAAO,GAAG,cAAc;YACxB,MAAM,GAAG,aAAa;AACxB,QAAA,CAAC,CAAC;AACF,QAAA,MAAM,OAAO,GAAkB;YAC7B,GAAG;YACH,cAAc,EAAE,IAAI,CAAC,sBAAsB,CAAC,MAAM,EAAE,cAAc,CAAC;YACnE,OAAO;YACP,OAAO;YACP,MAAM;YACN,YAAY,EAAE,YAAY,CAAC,KAAK;AAChC,YAAA,MAAM,EAAE,CAAC;AACT,YAAA,KAAK,EAAE,SAAS;SACjB;AACD,QAAA,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,OAAO,CAAC;QAEjC,MAAM,OAAO,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC;AACrC,QAAA,MAAM,WAAW,GAAG,IAAI,WAAW,CAAU,MAAM,EAAE,GAAG,EAAE,IAAI,IAAI,IAAI,EAAE;YACtE,OAAO,EAAE,IAAI,CAAC,cAAc,CAAC,MAAM,EAAE,OAAO,CAAC;YAC7C,OAAO,EAAE,MAAM,EAAE,OAAO;YACxB,MAAM,EAAE,IAAI,CAAC,aAAa,CAAC,MAAM,EAAE,MAAM,CAAC;YAC1C,cAAc,EAAE,MAAM,EAAE,cAAc;AACtC,YAAA,YAAY,EAAE,MAAM,EAAE,YAAY,IAAI,MAAM;YAC5C,eAAe,EAAE,MAAM,EAAE,eAAe;YACxC,aAAa,EAAE,MAAM,EAAE,aAAa;AACrC,SAAA,CAAC;AACF,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,UAAU,CAC5B,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,IAAI,CACxC,OAAO,CAAC,IAAI,CAAC,eAAe,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC,EACnD,MAAM,CAAC,CAAC,KAAK,KAAqC,KAAK,YAAY,YAAY,CAAC,EAChF,GAAG,CAAC,QAAQ,IAAI,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC,CAC3D,EACD,MAAM,EACN,MAAM,EAAE,KAAK,CACd;AAED,QAAA,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE;IAC5B;IAEA,aAAa,CAAC,OAAsB,EAAE,MAA2B,EAAA;AAC/D,QAAA,OAAO,CAAC,YAAY,GAAG,MAAM,CAAC,SAAS,CAAC;AACtC,YAAA,IAAI,EAAE,KAAK,IAAI,IAAI,CAAC,gBAAgB,CAAC,OAAO,EAAE,KAAK,CAAC;AACpD,YAAA,KAAK,EAAE,KAAK,IAAI,IAAI,CAAC,cAAc,CAAC,OAAO,EAAE,KAAK,CAAC;YACnD,QAAQ,EAAE,MAAK;AACb,gBAAA,IAAI,OAAO,CAAC,KAAK,KAAK,SAAS,EAAE;oBAC/B,IAAI,CAAC,cAAc,CAAC,OAAO,EAAE,IAAI,KAAK,CAAC,2CAA2C,CAAC,CAAC;gBACtF;YACF,CAAC;AACF,SAAA,CAAC;IACJ;IAEA,aAAa,CAAI,OAAsB,EAAE,MAAoB,EAAA;QAC3D,OAAO,CAAC,MAAM,EAAE;QAEhB,OAAO,IAAI,OAAO,CAAI,CAAC,OAAO,EAAE,MAAM,KAAI;YACxC,IAAI,OAAO,GAAG,KAAK;YACnB,MAAM,OAAO,GAAG,MAAW;AACzB,gBAAA,IAAI,MAAM;AAAE,oBAAA,MAAM,CAAC,mBAAmB,CAAC,OAAO,EAAE,KAAK,CAAC;AACxD,YAAA,CAAC;YACD,MAAM,OAAO,GAAG,MAAW;AACzB,gBAAA,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC;AAChD,gBAAA,IAAI,OAAO,CAAC,KAAK,KAAK,SAAS,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE;AACvD,oBAAA,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC;gBAC9B;AACF,YAAA,CAAC;YACD,MAAM,KAAK,GAAG,MAAW;AACvB,gBAAA,IAAI,OAAO;oBAAE;gBACb,OAAO,GAAG,IAAI;AACd,gBAAA,OAAO,EAAE;AACT,gBAAA,OAAO,EAAE;AACT,gBAAA,MAAM,CAAC,IAAI,CAAC,iBAAiB,EAAE,CAAC;AAClC,YAAA,CAAC;YAED,IAAI,MAAM,EAAE;AACV,gBAAA,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;AACvD,gBAAA,IAAI,MAAM,CAAC,OAAO,EAAE;AAClB,oBAAA,KAAK,EAAE;oBACP;gBACF;YACF;AAEA,YAAA,OAAO,CAAC,OAAO,CAAC,IAAI,CAClB,KAAK,IAAG;AACN,gBAAA,IAAI,OAAO;oBAAE;gBACb,OAAO,GAAG,IAAI;AACd,gBAAA,OAAO,EAAE;AACT,gBAAA,OAAO,EAAE;gBACT,OAAO,CAAC,KAAU,CAAC;YACrB,CAAC,EACD,KAAK,IAAG;AACN,gBAAA,IAAI,OAAO;oBAAE;gBACb,OAAO,GAAG,IAAI;AACd,gBAAA,OAAO,EAAE;AACT,gBAAA,OAAO,EAAE;gBACT,MAAM,CAAC,KAAK,CAAC;AACf,YAAA,CAAC,CACF;AACH,QAAA,CAAC,CAAC;IACJ;IAEA,gBAAgB,CAAC,OAAsB,EAAE,KAAc,EAAA;AACrD,QAAA,IAAI,OAAO,CAAC,KAAK,KAAK,SAAS;YAAE;AACjC,QAAA,OAAO,CAAC,KAAK,GAAG,WAAW;AAC3B,QAAA,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC;AAEtB,QAAA,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE;AAChB,YAAA,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,OAAO,CAAC;YACpC;QACF;AAEA,QAAA,IAAI,OAAO,CAAC,cAAc,KAAK,CAAC,EAAE;AAChC,YAAA,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC;YAC3B;QACF;AAEA,QAAA,OAAO,CAAC,WAAW,GAAG,UAAU,CAAC,MAAM,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC,cAAc,CAAC;IAC7F;IAEA,cAAc,CAAC,OAAsB,EAAE,KAAc,EAAA;AACnD,QAAA,IAAI,OAAO,CAAC,KAAK,KAAK,SAAS;YAAE;AACjC,QAAA,OAAO,CAAC,KAAK,GAAG,QAAQ;AACxB,QAAA,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC;AAC5B,QAAA,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC;IACvB;AAEA,IAAA,cAAc,CAAC,OAAsB,EAAA;AACnC,QAAA,IAAI,OAAO,CAAC,KAAK,KAAK,SAAS;YAAE;AACjC,QAAA,OAAO,CAAC,KAAK,GAAG,WAAW;AAC3B,QAAA,OAAO,CAAC,YAAY,CAAC,WAAW,EAAE;AAClC,QAAA,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC;QAC5B,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,iBAAiB,EAAE,CAAC;IAC1C;AAEA,IAAA,aAAa,CAAC,OAAsB,EAAA;AAClC,QAAA,IAAI,OAAO,CAAC,WAAW,KAAK,SAAS,EAAE;AACrC,YAAA,YAAY,CAAC,OAAO,CAAC,WAAW,CAAC;AACjC,YAAA,OAAO,CAAC,WAAW,GAAG,SAAS;QACjC;AACA,QAAA,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC;IAC9B;AAEA,IAAA,cAAc,CAAC,OAAsB,EAAA;AACnC,QAAA,IAAI,OAAO,CAAC,GAAG,IAAI,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,OAAO,EAAE;YACpE,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC;QAC1C;AACA,QAAA,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,OAAO,CAAC;IACtC;AAEA,IAAA,UAAU,CAAC,MAA2B,EAAE,MAAkB,EAAE,MAAyB,EAAA;QACnF,MAAM,QAAQ,GAAG,IAAI,CAAC,uBAAuB,CAAC,MAAM,EAAE,QAAQ,CAAC;AAC/D,QAAA,MAAM,QAAQ,GAAG,MAAM,KAAK,KAAK;AACjC,QAAA,IAAI,QAAQ,KAAK,CAAC,KAAK,QAAQ,IAAI,MAAM,EAAE,SAAS,KAAK,IAAI,CAAC,EAAE;AAC9D,YAAA,OAAO,MAAM;QACf;AAEA,QAAA,OAAO,MAAM,CAAC,IAAI,CAChB,KAAK,CAAC;AACJ,YAAA,KAAK,EAAE,QAAQ;AACf,YAAA,KAAK,EAAE,CAAC,KAAc,EAAE,OAAe,KAAI;AACzC,gBAAA,IAAI,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,KAAK,EAAE,OAAO,EAAE,MAAM,CAAC,EAAE;AAC3E,oBAAA,OAAO,UAAU,CAAC,MAAM,KAAK,CAAC;gBAChC;gBAEA,MAAM,SAAS,GAAG,IAAI,CAAC,oBAAoB,CAAC,MAAM,EAAE,OAAO,CAAC;gBAC5D,MAAM,OAAO,GAAG,IAAI,CAAC,sBAAsB,CAAC,MAAM,EAAE,OAAO,CAAC;AAC5D,gBAAA,MAAM,aAAa,GAAG,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,OAAO,GAAG,CAAC,CAAC;gBAChE,MAAM,OAAO,GAAG,MAAM,CAAC,QAAQ,CAAC,aAAa,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,EAAE,aAAa,CAAC,GAAG,IAAI,CAAC,WAAW;AAC7G,gBAAA,OAAO,OAAO,GAAG,CAAC,GAAG,KAAK,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC;YACrD,CAAC;AACF,SAAA,CAAC,CACH;IACH;AAEA,IAAA,YAAY,CAAC,KAAc,EAAE,OAAe,EAAE,MAAoC,EAAA;AAChF,QAAA,IAAI,MAAM,EAAE,SAAS,EAAE;YACrB,OAAO,MAAM,CAAC,SAAS,CAAC,KAAK,EAAE,OAAO,CAAC;QACzC;QACA,IAAI,KAAK,YAAY,YAAY;AAAE,YAAA,OAAO,IAAI;AAC9C,QAAA,IAAI,EAAE,KAAK,YAAY,iBAAiB,CAAC;AAAE,YAAA,OAAO,KAAK;AACvD,QAAA,OAAO,KAAK,CAAC,MAAM,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC;IACzF;IAEA,YAAY,CAAC,IAAa,EAAE,OAAiC,EAAA;AAC3D,QAAA,IAAI,IAAI,KAAK,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,CAAC,EAAE,KAAK,KAAK,EAAE;AAClF,YAAA,MAAM,IAAI;QACZ;AACA,QAAA,OAAO,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,WAAW,CAAC,IAAI,CAAC,GAAG,IAAI;IAChE;AAEA,IAAA,WAAW,CAAC,GAAW,EAAA;AACrB,QAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC,aAAa,IAAI,aAAa,CAAC,QAAQ,IAAI,EAAE,CAAC;QAC5F,OAAO,QAAQ,CAAC,IAAI,CAAC,OAAO,IAAI,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,IAAI,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC;IACnF;AAEA,IAAA,YAAY,CAAC,GAAW,EAAE,MAAkB,EAAE,IAAa,EAAE,MAAsB,EAAA;QACjF,OAAO,SAAS,CAAC,IAAI,CAAC;YACpB,MAAM;YACN,GAAG;AACH,YAAA,IAAI,EAAE,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC;YAC/B,OAAO,EAAE,IAAI,CAAC,iBAAiB,CAAC,MAAM,EAAE,OAAO,CAAC;YAChD,MAAM,EAAE,IAAI,CAAC,gBAAgB,CAAC,MAAM,EAAE,MAAM,CAAC;AAC7C,YAAA,OAAO,EAAE,MAAM,EAAE,OAAO,GAAG,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,SAAS;AACxE,YAAA,cAAc,EAAE,MAAM,EAAE,cAAc,IAAI,KAAK;AAC/C,YAAA,YAAY,EAAE,MAAM,EAAE,YAAY,IAAI,MAAM;AAC5C,YAAA,eAAe,EAAE,MAAM,EAAE,eAAe,IAAI,KAAK;YACjD,aAAa,EAAE,MAAM,EAAE,aAAa;YACpC,OAAO,EAAE,IAAI,CAAC,eAAe,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC;YACnD,KAAK,EAAE,MAAM,EAAE;AACb,kBAAE;oBACE,QAAQ,EAAE,IAAI,CAAC,uBAAuB,CAAC,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC;oBAC7D,OAAO,EAAE,IAAI,CAAC,oBAAoB,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC;oBACxD,OAAO,EAAE,IAAI,CAAC,sBAAsB,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC;AAC1D,oBAAA,SAAS,EAAE,MAAM,CAAC,KAAK,CAAC,SAAS;oBACjC,SAAS,EAAE,MAAM,CAAC,KAAK,CAAC,SAAS,GAAG,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,GAAG,SAAS;AAC1F;AACH,kBAAE,SAAS;AACd,SAAA,CAAC;IACJ;AAEA,IAAA,mBAAmB,CAAC,GAAW,EAAE,MAAkB,EAAE,IAAa,EAAE,MAAsB,EAAA;QACxF,OAAO,SAAS,CAAC,IAAI,CAAC;AACpB,YAAA,WAAW,EAAE,IAAI,CAAC,YAAY,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC;YACzD,cAAc,EAAE,IAAI,CAAC,sBAAsB,CAAC,MAAM,EAAE,cAAc,CAAC;AACpE,SAAA,CAAC;IACJ;AAEA,IAAA,sBAAsB,CAAC,cAAkC,EAAA;AACvD,QAAA,OAAO,IAAI,CAAC,sBAAsB,CAAC,cAAc,EAAE,IAAI,CAAC,sBAAsB,EAAE,CAAC,EAAE,IAAI,CAAC,WAAW,CAAC;IACtG;IAEA,eAAe,CAAC,GAAW,EAAE,SAA6B,EAAA;QACxD,MAAM,iBAAiB,GAAG,SAAS,KAAK,SAAS,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,EAAE,OAAO,GAAG,SAAS;AAC9F,QAAA,OAAO,IAAI,CAAC,sBAAsB,CAAC,iBAAiB,EAAE,IAAI,CAAC,eAAe,EAAE,CAAC,EAAE,IAAI,CAAC,WAAW,CAAC;IAClG;AAEA,IAAA,uBAAuB,CAAC,QAA4B,EAAA;AAClD,QAAA,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,sBAAsB,CAAC,QAAQ,EAAE,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,iBAAiB,CAAC,CAAC;IACxF;AAEA,IAAA,oBAAoB,CAAC,OAA2B,EAAA;AAC9C,QAAA,OAAO,IAAI,CAAC,sBAAsB,CAAC,OAAO,EAAE,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,WAAW,CAAC;IACrE;AAEA,IAAA,sBAAsB,CAAC,OAA2B,EAAA;AAChD,QAAA,MAAM,UAAU,GAAG,IAAI,CAAC,sBAAsB,CAAC,OAAO,EAAE,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,WAAW,CAAC;QAC/E,OAAO,UAAU,GAAG,CAAC,GAAG,UAAU,GAAG,CAAC;IACxC;AAEA,IAAA,sBAAsB,CAAC,KAAyB,EAAE,YAAoB,EAAE,OAAe,EAAE,OAAe,EAAA;QACtG,IAAI,KAAK,KAAK,SAAS,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC;AAAE,YAAA,OAAO,YAAY;AACvE,QAAA,OAAO,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;IACpD;AAEA,IAAA,cAAc,CAAC,IAAa,EAAE,SAAA,GAAY,IAAI,OAAO,EAAU,EAAA;AAC7D,QAAA,IAAI,IAAI,KAAK,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ;AAAE,YAAA,OAAO,IAAI;QAC1D,IAAI,OAAO,eAAe,KAAK,WAAW,IAAI,IAAI,YAAY,eAAe,EAAE;YAC7E,OAAO,EAAE,eAAe,EAAE,IAAI,CAAC,QAAQ,EAAE,EAAE;QAC7C;QACA,IAAI,OAAO,QAAQ,KAAK,WAAW,IAAI,IAAI,YAAY,QAAQ,EAAE;AAC/D,YAAA,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,QAAQ,EAAE,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,EAAE;QACtE;QACA,IAAI,OAAO,IAAI,KAAK,WAAW,IAAI,IAAI,YAAY,IAAI,EAAE;AACvD,YAAA,OAAO,EAAE,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,EAAE;QAClE;AACA,QAAA,IAAI,OAAO,WAAW,KAAK,WAAW,KAAK,IAAI,YAAY,WAAW,IAAI,WAAW,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,EAAE;AACnG,YAAA,OAAO,EAAE,UAAU,EAAE,aAAa,EAAE,QAAQ,EAAE,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,EAAE;QACzE;AACA,QAAA,IAAI,IAAI,YAAY,IAAI,EAAE;YACxB,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,OAAO,EAAE,EAAE;QACjC;AACA,QAAA,IAAI,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE;YACvB,OAAO,EAAE,gBAAgB,EAAE,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,EAAE;QACtD;AACA,QAAA,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE;AACvB,YAAA,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC;AACnB,YAAA,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,IAAI,IAAI,CAAC,cAAc,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC;AAC3E,YAAA,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC;AACtB,YAAA,OAAO,UAAU;QACnB;QACA,MAAM,SAAS,GAAG,MAAM,CAAC,cAAc,CAAC,IAAI,CAAC;QAC7C,IAAI,SAAS,KAAK,MAAM,CAAC,SAAS,IAAI,SAAS,KAAK,IAAI,EAAE;AACxD,YAAA,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC;AACnB,YAAA,MAAM,UAAU,GAAG,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,KAAK,CAAC,GAAG,EAAE,IAAI,CAAC,cAAc,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC;AAC/H,YAAA,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC;AACtB,YAAA,OAAO,UAAU;QACnB;QACA,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,WAAW,EAAE,IAAI,IAAI,QAAQ,EAAE,QAAQ,EAAE,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,EAAE;IACpG;AAEA,IAAA,iBAAiB,CAAC,OAAiC,EAAA;AACjD,QAAA,IAAI,OAAO,YAAY,WAAW,EAAE;AAClC,YAAA,OAAO;AACJ,iBAAA,IAAI;AACJ,iBAAA,IAAI;AACJ,iBAAA,GAAG,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,WAAW,EAAE,EAAE,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;QACzD;AACA,QAAA,OAAO,OAAO;IAChB;AAEA,IAAA,gBAAgB,CAAC,MAA+B,EAAA;AAC9C,QAAA,IAAI,MAAM,YAAY,UAAU,EAAE;AAChC,YAAA,OAAO;AACJ,iBAAA,IAAI;AACJ,iBAAA,IAAI;AACJ,iBAAA,GAAG,CAAC,GAAG,IAAI,CAAC,GAAG,EAAE,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;QAC1C;AACA,QAAA,OAAO,MAAM;IACf;AAEA,IAAA,cAAc,CAAC,OAAiC,EAAA;AAC9C,QAAA,IAAI,CAAC,OAAO,IAAI,OAAO,YAAY,WAAW;AAAE,YAAA,OAAO,OAAO;AAC9D,QAAA,OAAO,IAAI,WAAW,CAAC,OAAO,CAAC;IACjC;AAEA,IAAA,aAAa,CAAC,MAA+B,EAAA;AAC3C,QAAA,IAAI,CAAC,MAAM,IAAI,MAAM,YAAY,UAAU;AAAE,YAAA,OAAO,MAAM;QAC1D,OAAO,IAAI,UAAU,CAAC,EAAE,UAAU,EAAE,MAAM,EAAE,CAAC;IAC/C;AAEA,IAAA,YAAY,CAAC,KAAa,EAAA;QACxB,MAAM,QAAQ,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC;QAC3C,IAAI,QAAQ,KAAK,SAAS;AAAE,YAAA,OAAO,QAAQ;AAC3C,QAAA,MAAM,EAAE,GAAG,IAAI,CAAC,aAAa,EAAE;QAC/B,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,KAAK,EAAE,EAAE,CAAC;AAC9B,QAAA,OAAO,EAAE;IACX;IAEA,iBAAiB,GAAA;AACf,QAAA,MAAM,KAAK,GAAG,IAAI,KAAK,CAAC,2BAA2B,CAAC;AACpD,QAAA,KAAK,CAAC,IAAI,GAAG,YAAY;AACzB,QAAA,OAAO,KAAK;IACd;AAEA,IAAA,aAAa,CAAC,KAAc,EAAA;QAC1B,OAAO,KAAK,YAAY,KAAK,IAAI,KAAK,CAAC,IAAI,KAAK,YAAY;IAC9D;IAEA,QAAQ,GAAA;QACN,IAAI,IAAI,CAAC,UAAU;YAAE;AACrB,QAAA,IAAI,CAAC,UAAU,GAAG,IAAI;QAEtB,KAAK,MAAM,OAAO,IAAI,CAAC,GAAG,IAAI,CAAC,eAAe,CAAC,EAAE;AAC/C,YAAA,IAAI,OAAO,CAAC,WAAW,KAAK,SAAS,EAAE;AACrC,gBAAA,YAAY,CAAC,OAAO,CAAC,WAAW,CAAC;AACjC,gBAAA,OAAO,CAAC,WAAW,GAAG,SAAS;YACjC;AACA,YAAA,IAAI,OAAO,CAAC,KAAK,KAAK,SAAS,EAAE;AAC/B,gBAAA,OAAO,CAAC,KAAK,GAAG,WAAW;AAC3B,gBAAA,OAAO,CAAC,YAAY,CAAC,WAAW,EAAE;gBAClC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,iBAAiB,EAAE,CAAC;YAC1C;AACA,YAAA,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC;QAC9B;AACA,QAAA,IAAI,CAAC,eAAe,CAAC,KAAK,EAAE;AAC5B,QAAA,IAAI,CAAC,eAAe,CAAC,KAAK,EAAE;IAC9B;wGAldW,YAAY,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA;AAAZ,IAAA,OAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,YAAY,cAFX,MAAM,EAAA,CAAA;;4FAEP,YAAY,EAAA,UAAA,EAAA,CAAA;kBAHxB,UAAU;AAAC,YAAA,IAAA,EAAA,CAAA;AACV,oBAAA,UAAU,EAAE,MAAM;AACnB,iBAAA;;;MCtCY,iBAAiB,CAAA;AACnB,IAAA,eAAe,GAAG,MAAM,CAAwB,aAAa,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,IAAI,EAAE;IAEjG,SAAS,CAAC,OAA6B,EAAE,IAAiB,EAAA;QACxD,IAAI,CAAC,OAAO,CAAC,GAAG;AAAE,YAAA,MAAM,IAAI,KAAK,CAAC,aAAa,CAAC;QAEhD,MAAM,OAAO,GAAG,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,GAAG,CAAC;AAC9C,QAAA,IAAI,OAAO,EAAE,SAAS,EAAE;YACtB,MAAM,kBAAkB,GAAG,OAAO,CAAC,SAAS,CAAC,OAAO,CAAC;AACrD,YAAA,OAAO,GAAG,kBAAkB,YAAY,WAAW,GAAG,kBAAkB,GAAG,OAAO,CAAC,KAAK,CAAC,kBAAkB,CAAC;QAC9G;QACA,IAAI,OAAO,QAAQ,KAAK,WAAW,IAAI,OAAO,CAAC,IAAI,YAAY,QAAQ,EAAE;AACvE,YAAA,OAAO,GAAG,OAAO,CAAC,KAAK,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,cAAc,CAAC,EAAE,CAAC;QAC9E;QAEA,MAAM,YAAY,GAAG,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC;AACrD,QAAA,IAAI,YAAY,YAAY,OAAO,EAAE;YACnC,OAAO,IAAI,CAAC,YAAY,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,IAAI,CAAC,aAAa,CAAC,OAAO,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC;QAC7F;QACA,OAAO,IAAI,CAAC,aAAa,CAAC,OAAO,EAAE,IAAI,EAAE,OAAO,CAAC;IACnD;AAEA,IAAA,aAAa,CAAC,OAA6B,EAAE,IAAiB,EAAE,OAAiC,EAAA;AAC/F,QAAA,OAAO,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAC9B,WAAW,EAAE,EACb,SAAS,CAAC,YAAY,IAAG;AACvB,YAAA,MAAM,UAAU,GACd,YAAY,CAAC,IAAI,KAAK,GAAG,IAAI,YAAY,CAAC,KAAK,YAAY;kBACvD,YAAY,CAAC;AACf,kBAAE,YAAY,CAAC,IAAI,KAAK,GAAG,KAAK,YAAY,CAAC,KAAK,YAAY,KAAK,IAAI,YAAY,CAAC,KAAK,YAAY,iBAAiB;sBAClH,YAAY,CAAC;sBACb,SAAS;YACjB,IAAI,CAAC,UAAU,IAAI,CAAC,OAAO,EAAE,WAAW,EAAE;AACxC,gBAAA,OAAO,EAAE,CAAC,YAAY,CAAC;YACzB;YAEA,OAAO,KAAK,CAAC,MAAK;gBAChB,MAAM,MAAM,GAAG,OAAO,CAAC,WAAW,GAAG,UAAU,CAAC;AAChD,gBAAA,OAAO,MAAM,YAAY,OAAO,GAAG,MAAM,GAAG,OAAO,CAAC,OAAO,EAAE;YAC/D,CAAC,CAAC,CAAC,IAAI,CACL,GAAG,CAAC,MAAM,YAAY,CAAC,EACvB,UAAU,CAAC,SAAS,KAAK,YAAY,CAAC,IAAI,KAAK,GAAG,GAAG,EAAE,CAAC,YAAY,CAAC,GAAG,UAAU,CAAC,MAAM,SAAS,CAAC,CAAC,CAAC,CACtG;AACH,QAAA,CAAC,CAAC,EACF,aAAa,EAAE,CAChB;IACH;AAEA,IAAA,YAAY,CAAC,GAAW,EAAA;AACtB,QAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC,aAAa,IAAI,aAAa,CAAC,QAAQ,IAAI,EAAE,CAAC;QAC5F,OAAO,QAAQ,CAAC,IAAI,CAAC,OAAO,IAAI,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,IAAI,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC;IACnF;wGAnDW,iBAAiB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA;4GAAjB,iBAAiB,EAAA,CAAA;;4FAAjB,iBAAiB,EAAA,UAAA,EAAA,CAAA;kBAD7B;;;MCGY,WAAW,CAAA;wGAAX,WAAW,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,QAAA,EAAA,CAAA;yGAAX,WAAW,EAAA,CAAA;yGAAX,WAAW,EAAA,SAAA,EAFX,CAAC,iBAAiB,CAAC,sBAAsB,EAAE,CAAC,EAAE,EAAE,OAAO,EAAE,iBAAiB,EAAE,QAAQ,EAAE,iBAAiB,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,EAAA,CAAA;;4FAEvH,WAAW,EAAA,UAAA,EAAA,CAAA;kBALvB,QAAQ;AAAC,YAAA,IAAA,EAAA,CAAA;AACR,oBAAA,OAAO,EAAE,EAAE;AACX,oBAAA,OAAO,EAAE,EAAE;oBACX,SAAS,EAAE,CAAC,iBAAiB,CAAC,sBAAsB,EAAE,CAAC,EAAE,EAAE,OAAO,EAAE,iBAAiB,EAAE,QAAQ,EAAE,iBAAiB,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;AACnI,iBAAA;;;ACRD;;AAEG;;;;"}
|