@acorex/platform 21.0.0-next.3 → 21.0.0-next.33
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/fesm2022/acorex-platform-auth.mjs +295 -45
- package/fesm2022/acorex-platform-auth.mjs.map +1 -1
- package/fesm2022/{acorex-platform-common-common-settings.provider-zhqNP3xb.mjs → acorex-platform-common-common-settings.provider-G9XcXXOG.mjs} +60 -4
- package/fesm2022/acorex-platform-common-common-settings.provider-G9XcXXOG.mjs.map +1 -0
- package/fesm2022/acorex-platform-common.mjs +960 -319
- package/fesm2022/acorex-platform-common.mjs.map +1 -1
- package/fesm2022/acorex-platform-core.mjs +1352 -832
- package/fesm2022/acorex-platform-core.mjs.map +1 -1
- package/fesm2022/acorex-platform-domain.mjs +554 -826
- package/fesm2022/acorex-platform-domain.mjs.map +1 -1
- package/fesm2022/acorex-platform-layout-builder.mjs +530 -154
- package/fesm2022/acorex-platform-layout-builder.mjs.map +1 -1
- package/fesm2022/acorex-platform-layout-components-binding-expression-editor-popup.component-CXEdvDTf.mjs +121 -0
- package/fesm2022/acorex-platform-layout-components-binding-expression-editor-popup.component-CXEdvDTf.mjs.map +1 -0
- package/fesm2022/acorex-platform-layout-components.mjs +5969 -2347
- package/fesm2022/acorex-platform-layout-components.mjs.map +1 -1
- package/fesm2022/acorex-platform-layout-designer.mjs +169 -154
- package/fesm2022/acorex-platform-layout-designer.mjs.map +1 -1
- package/fesm2022/acorex-platform-layout-entity.mjs +15380 -9274
- package/fesm2022/acorex-platform-layout-entity.mjs.map +1 -1
- package/fesm2022/acorex-platform-layout-views.mjs +393 -110
- package/fesm2022/acorex-platform-layout-views.mjs.map +1 -1
- package/fesm2022/acorex-platform-layout-widget-core.mjs +511 -450
- package/fesm2022/acorex-platform-layout-widget-core.mjs.map +1 -1
- package/fesm2022/{acorex-platform-layout-widgets-button-widget-designer.component-C3VoBb_b.mjs → acorex-platform-layout-widgets-button-widget-designer.component-Dy7jF-oD.mjs} +10 -10
- package/fesm2022/acorex-platform-layout-widgets-button-widget-designer.component-Dy7jF-oD.mjs.map +1 -0
- package/fesm2022/{acorex-platform-layout-widgets-file-list-popup.component-CxrsI6Hn.mjs → acorex-platform-layout-widgets-file-list-popup.component-9uCkMxcc.mjs} +39 -16
- package/fesm2022/acorex-platform-layout-widgets-file-list-popup.component-9uCkMxcc.mjs.map +1 -0
- package/fesm2022/{acorex-platform-layout-widgets-image-preview.popup-V31OpYah.mjs → acorex-platform-layout-widgets-image-preview.popup-C_EPAvCU.mjs} +6 -7
- package/fesm2022/acorex-platform-layout-widgets-image-preview.popup-C_EPAvCU.mjs.map +1 -0
- package/fesm2022/{acorex-platform-layout-widgets-page-widget-designer.component-BtZMBxYp.mjs → acorex-platform-layout-widgets-page-widget-designer.component-D10yO28c.mjs} +12 -12
- package/fesm2022/acorex-platform-layout-widgets-page-widget-designer.component-D10yO28c.mjs.map +1 -0
- package/fesm2022/acorex-platform-layout-widgets-repeater-widget-column.component-BGQqY5Mw.mjs +111 -0
- package/fesm2022/acorex-platform-layout-widgets-repeater-widget-column.component-BGQqY5Mw.mjs.map +1 -0
- package/fesm2022/{acorex-platform-layout-widgets-tabular-data-edit-popup.component-Ck7-wpT2.mjs → acorex-platform-layout-widgets-tabular-data-edit-popup.component-DmzNTYiS.mjs} +6 -6
- package/fesm2022/acorex-platform-layout-widgets-tabular-data-edit-popup.component-DmzNTYiS.mjs.map +1 -0
- package/fesm2022/{acorex-platform-layout-widgets-tabular-data-view-popup.component-y8vjUiVs.mjs → acorex-platform-layout-widgets-tabular-data-view-popup.component-BNG_588B.mjs} +5 -5
- package/fesm2022/acorex-platform-layout-widgets-tabular-data-view-popup.component-BNG_588B.mjs.map +1 -0
- package/fesm2022/{acorex-platform-layout-widgets-text-block-widget-designer.component-Df1BFkSa.mjs → acorex-platform-layout-widgets-text-block-widget-designer.component-Vo4fWHtX.mjs} +6 -6
- package/fesm2022/acorex-platform-layout-widgets-text-block-widget-designer.component-Vo4fWHtX.mjs.map +1 -0
- package/fesm2022/acorex-platform-layout-widgets.mjs +7865 -4026
- package/fesm2022/acorex-platform-layout-widgets.mjs.map +1 -1
- package/fesm2022/acorex-platform-native.mjs +8 -7
- package/fesm2022/acorex-platform-native.mjs.map +1 -1
- package/fesm2022/acorex-platform-runtime.mjs +220 -169
- package/fesm2022/acorex-platform-runtime.mjs.map +1 -1
- package/fesm2022/acorex-platform-themes-default-entity-master-create-view.component-Cvvr4HnL.mjs +160 -0
- package/fesm2022/acorex-platform-themes-default-entity-master-create-view.component-Cvvr4HnL.mjs.map +1 -0
- package/fesm2022/acorex-platform-themes-default-entity-master-modify-view.component-TYoLN1Jq.mjs +120 -0
- package/fesm2022/acorex-platform-themes-default-entity-master-modify-view.component-TYoLN1Jq.mjs.map +1 -0
- package/fesm2022/{acorex-platform-themes-default-entity-master-single-view.component-eMBby9k4.mjs → acorex-platform-themes-default-entity-master-single-view.component-C2z5Lq9y.mjs} +18 -25
- package/fesm2022/acorex-platform-themes-default-entity-master-single-view.component-C2z5Lq9y.mjs.map +1 -0
- package/fesm2022/{acorex-platform-themes-default-error-401.component-cfREo88K.mjs → acorex-platform-themes-default-error-401.component-C7EYJzSr.mjs} +4 -4
- package/fesm2022/acorex-platform-themes-default-error-401.component-C7EYJzSr.mjs.map +1 -0
- package/fesm2022/{acorex-platform-themes-default-error-404.component-CdCV5ZoA.mjs → acorex-platform-themes-default-error-404.component-7MVLMwIa.mjs} +4 -4
- package/fesm2022/acorex-platform-themes-default-error-404.component-7MVLMwIa.mjs.map +1 -0
- package/fesm2022/acorex-platform-themes-default-error-offline.component-DR6G8gPC.mjs +19 -0
- package/fesm2022/acorex-platform-themes-default-error-offline.component-DR6G8gPC.mjs.map +1 -0
- package/fesm2022/acorex-platform-themes-default.mjs +1717 -66
- package/fesm2022/acorex-platform-themes-default.mjs.map +1 -1
- package/fesm2022/{acorex-platform-themes-shared-icon-chooser-column.component-C0EpfU2k.mjs → acorex-platform-themes-shared-icon-chooser-column.component-CqkWJYdv.mjs} +6 -6
- package/fesm2022/acorex-platform-themes-shared-icon-chooser-column.component-CqkWJYdv.mjs.map +1 -0
- package/fesm2022/{acorex-platform-themes-shared-icon-chooser-view.component-9W52W6Nu.mjs → acorex-platform-themes-shared-icon-chooser-view.component-BOTuLdWN.mjs} +6 -6
- package/fesm2022/acorex-platform-themes-shared-icon-chooser-view.component-BOTuLdWN.mjs.map +1 -0
- package/fesm2022/acorex-platform-themes-shared-settings.provider-DSs1o1M6.mjs.map +1 -1
- package/fesm2022/{acorex-platform-themes-shared-theme-color-chooser-column.component-DTnfRy5f.mjs → acorex-platform-themes-shared-theme-color-chooser-column.component-CHfrTtol.mjs} +11 -11
- package/fesm2022/acorex-platform-themes-shared-theme-color-chooser-column.component-CHfrTtol.mjs.map +1 -0
- package/fesm2022/{acorex-platform-themes-shared-theme-color-chooser-view.component-DY0JtT1v.mjs → acorex-platform-themes-shared-theme-color-chooser-view.component-BSmvnUVq.mjs} +9 -9
- package/fesm2022/acorex-platform-themes-shared-theme-color-chooser-view.component-BSmvnUVq.mjs.map +1 -0
- package/fesm2022/acorex-platform-themes-shared.mjs +563 -561
- package/fesm2022/acorex-platform-themes-shared.mjs.map +1 -1
- package/fesm2022/acorex-platform-workflow.mjs +1735 -1750
- package/fesm2022/acorex-platform-workflow.mjs.map +1 -1
- package/fesm2022/acorex-platform.mjs.map +1 -1
- package/package.json +31 -31
- package/{auth/index.d.ts → types/acorex-platform-auth.d.ts} +247 -10
- package/{common/index.d.ts → types/acorex-platform-common.d.ts} +492 -31
- package/{core/index.d.ts → types/acorex-platform-core.d.ts} +606 -392
- package/{domain/index.d.ts → types/acorex-platform-domain.d.ts} +719 -413
- package/{layout/builder/index.d.ts → types/acorex-platform-layout-builder.d.ts} +128 -56
- package/types/acorex-platform-layout-components.d.ts +2927 -0
- package/{layout/designer/index.d.ts → types/acorex-platform-layout-designer.d.ts} +9 -3
- package/{layout/entity/index.d.ts → types/acorex-platform-layout-entity.d.ts} +1133 -237
- package/{layout/views/index.d.ts → types/acorex-platform-layout-views.d.ts} +90 -31
- package/{layout/widget-core/index.d.ts → types/acorex-platform-layout-widget-core.d.ts} +206 -102
- package/{layout/widgets/index.d.ts → types/acorex-platform-layout-widgets.d.ts} +942 -137
- package/{native/index.d.ts → types/acorex-platform-native.d.ts} +0 -7
- package/{runtime/index.d.ts → types/acorex-platform-runtime.d.ts} +237 -74
- package/{themes/default/index.d.ts → types/acorex-platform-themes-default.d.ts} +113 -5
- package/{themes/shared/index.d.ts → types/acorex-platform-themes-shared.d.ts} +1 -1
- package/types/acorex-platform-workflow.d.ts +1806 -0
- package/fesm2022/acorex-platform-common-common-settings.provider-zhqNP3xb.mjs.map +0 -1
- package/fesm2022/acorex-platform-layout-widgets-button-widget-designer.component-C3VoBb_b.mjs.map +0 -1
- package/fesm2022/acorex-platform-layout-widgets-file-list-popup.component-CxrsI6Hn.mjs.map +0 -1
- package/fesm2022/acorex-platform-layout-widgets-image-preview.popup-V31OpYah.mjs.map +0 -1
- package/fesm2022/acorex-platform-layout-widgets-page-widget-designer.component-BtZMBxYp.mjs.map +0 -1
- package/fesm2022/acorex-platform-layout-widgets-tabular-data-edit-popup.component-Ck7-wpT2.mjs.map +0 -1
- package/fesm2022/acorex-platform-layout-widgets-tabular-data-view-popup.component-y8vjUiVs.mjs.map +0 -1
- package/fesm2022/acorex-platform-layout-widgets-text-block-widget-designer.component-Df1BFkSa.mjs.map +0 -1
- package/fesm2022/acorex-platform-themes-default-entity-master-create-view.component-VIGuU5M4.mjs +0 -157
- package/fesm2022/acorex-platform-themes-default-entity-master-create-view.component-VIGuU5M4.mjs.map +0 -1
- package/fesm2022/acorex-platform-themes-default-entity-master-list-view.component-DyDa_hyd.mjs +0 -1542
- package/fesm2022/acorex-platform-themes-default-entity-master-list-view.component-DyDa_hyd.mjs.map +0 -1
- package/fesm2022/acorex-platform-themes-default-entity-master-modify-view.component-Ua3ZA5hk.mjs +0 -101
- package/fesm2022/acorex-platform-themes-default-entity-master-modify-view.component-Ua3ZA5hk.mjs.map +0 -1
- package/fesm2022/acorex-platform-themes-default-entity-master-single-view.component-eMBby9k4.mjs.map +0 -1
- package/fesm2022/acorex-platform-themes-default-error-401.component-cfREo88K.mjs.map +0 -1
- package/fesm2022/acorex-platform-themes-default-error-404.component-CdCV5ZoA.mjs.map +0 -1
- package/fesm2022/acorex-platform-themes-default-error-offline.component-E7SzBcAt.mjs +0 -19
- package/fesm2022/acorex-platform-themes-default-error-offline.component-E7SzBcAt.mjs.map +0 -1
- package/fesm2022/acorex-platform-themes-shared-icon-chooser-column.component-C0EpfU2k.mjs.map +0 -1
- package/fesm2022/acorex-platform-themes-shared-icon-chooser-view.component-9W52W6Nu.mjs.map +0 -1
- package/fesm2022/acorex-platform-themes-shared-theme-color-chooser-column.component-DTnfRy5f.mjs.map +0 -1
- package/fesm2022/acorex-platform-themes-shared-theme-color-chooser-view.component-DY0JtT1v.mjs.map +0 -1
- package/layout/components/index.d.ts +0 -1669
- package/workflow/index.d.ts +0 -2443
- /package/{index.d.ts → types/acorex-platform.d.ts} +0 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"acorex-platform-auth.mjs","sources":["../tmp-esm2022/auth/lib/application/application.loader.js","../tmp-esm2022/auth/lib/tenant/tenant.loader.js","../tmp-esm2022/auth/lib/auth-registry.service.js","../tmp-esm2022/auth/lib/feature/feature.loader.js","../tmp-esm2022/auth/lib/feature/feature.directive.js","../tmp-esm2022/auth/lib/errors.types.js","../tmp-esm2022/auth/lib/feature/feature.guard.js","../tmp-esm2022/auth/lib/feature/feature-checker.token.js","../tmp-esm2022/auth/lib/permission/permission.loader.js","../tmp-esm2022/auth/lib/permission/permission-checker.token.js","../tmp-esm2022/auth/lib/session.types.js","../tmp-esm2022/auth/lib/session.service.js","../tmp-esm2022/auth/lib/permission/permission.directive.js","../tmp-esm2022/auth/lib/permission/permission.guard.js","../tmp-esm2022/auth/lib/permission/permission-definition.builder.js","../tmp-esm2022/auth/lib/permission/permission-definition.service.js","../tmp-esm2022/auth/lib/permission/permission-evaluator-scope.provider.js","../tmp-esm2022/auth/lib/auth.guard.js","../tmp-esm2022/auth/lib/auth.module.js","../tmp-esm2022/auth/lib/auth.strategy.js","../tmp-esm2022/auth/lib/auth.utils.js","../tmp-esm2022/auth/acorex-platform-auth.js"],"sourcesContent":["import { InjectionToken } from '@angular/core';\nexport const AXP_APPLICATION_LOADER = new InjectionToken('AXP_APPLICATION_LOADER', {\n providedIn: 'root',\n factory: () => {\n return new AXPApplicationDefaultLoader();\n },\n});\nclass AXPApplicationDefaultLoader {\n async getList(context) {\n return [\n {\n id: '1',\n name: 'default-app',\n title: 'Default Application',\n version: '1.0.0',\n edition: {\n id: 'default-edition-1',\n title: 'Standard',\n },\n },\n {\n id: '2',\n name: 'default-app',\n title: 'Default Application',\n version: '1.0.0',\n edition: {\n id: 'default-edition-2',\n title: 'Standard',\n },\n },\n ];\n }\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBwbGljYXRpb24ubG9hZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9wbGF0Zm9ybS9hdXRoL3NyYy9saWIvYXBwbGljYXRpb24vYXBwbGljYXRpb24ubG9hZGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFRL0MsTUFBTSxDQUFDLE1BQU0sc0JBQXNCLEdBQUcsSUFBSSxjQUFjLENBQXVCLHdCQUF3QixFQUFFO0lBQ3ZHLFVBQVUsRUFBRSxNQUFNO0lBQ2xCLE9BQU8sRUFBRSxHQUFHLEVBQUU7UUFDWixPQUFPLElBQUksMkJBQTJCLEVBQUUsQ0FBQztJQUMzQyxDQUFDO0NBQ0YsQ0FBQyxDQUFDO0FBRUgsTUFBTSwyQkFBMkI7SUFDL0IsS0FBSyxDQUFDLE9BQU8sQ0FBQyxPQUEwQjtRQUN0QyxPQUFPO1lBQ0w7Z0JBQ0UsRUFBRSxFQUFFLEdBQUc7Z0JBQ1AsSUFBSSxFQUFFLGFBQWE7Z0JBQ25CLEtBQUssRUFBRSxxQkFBcUI7Z0JBQzVCLE9BQU8sRUFBRSxPQUFPO2dCQUNoQixPQUFPLEVBQUU7b0JBQ1AsRUFBRSxFQUFFLG1CQUFtQjtvQkFDdkIsS0FBSyxFQUFFLFVBQVU7aUJBQ2xCO2FBQ0Y7WUFDRDtnQkFDRSxFQUFFLEVBQUUsR0FBRztnQkFDUCxJQUFJLEVBQUUsYUFBYTtnQkFDbkIsS0FBSyxFQUFFLHFCQUFxQjtnQkFDNUIsT0FBTyxFQUFFLE9BQU87Z0JBQ2hCLE9BQU8sRUFBRTtvQkFDUCxFQUFFLEVBQUUsbUJBQW1CO29CQUN2QixLQUFLLEVBQUUsVUFBVTtpQkFDbEI7YUFDRjtTQUNGLENBQUM7SUFDSixDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3Rpb25Ub2tlbiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQVhQU2Vzc2lvbkNvbnRleHQgfSBmcm9tICcuLi9zZXNzaW9uLnR5cGVzJztcbmltcG9ydCB7IEFYUEFwcGxpY2F0aW9uIH0gZnJvbSAnLi9hcHBsaWNhdGlvbi50eXBlcyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgQVhQQXBwbGljYXRpb25Mb2FkZXIge1xuICBnZXRMaXN0KGNvbnRleHQ6IEFYUFNlc3Npb25Db250ZXh0KTogUHJvbWlzZTxBWFBBcHBsaWNhdGlvbltdPjtcbn1cblxuZXhwb3J0IGNvbnN0IEFYUF9BUFBMSUNBVElPTl9MT0FERVIgPSBuZXcgSW5qZWN0aW9uVG9rZW48QVhQQXBwbGljYXRpb25Mb2FkZXI+KCdBWFBfQVBQTElDQVRJT05fTE9BREVSJywge1xuICBwcm92aWRlZEluOiAncm9vdCcsXG4gIGZhY3Rvcnk6ICgpID0+IHtcbiAgICByZXR1cm4gbmV3IEFYUEFwcGxpY2F0aW9uRGVmYXVsdExvYWRlcigpO1xuICB9LFxufSk7XG5cbmNsYXNzIEFYUEFwcGxpY2F0aW9uRGVmYXVsdExvYWRlciBpbXBsZW1lbnRzIEFYUEFwcGxpY2F0aW9uTG9hZGVyIHtcbiAgYXN5bmMgZ2V0TGlzdChjb250ZXh0OiBBWFBTZXNzaW9uQ29udGV4dCk6IFByb21pc2U8QVhQQXBwbGljYXRpb25bXT4ge1xuICAgIHJldHVybiBbXG4gICAgICB7XG4gICAgICAgIGlkOiAnMScsXG4gICAgICAgIG5hbWU6ICdkZWZhdWx0LWFwcCcsXG4gICAgICAgIHRpdGxlOiAnRGVmYXVsdCBBcHBsaWNhdGlvbicsXG4gICAgICAgIHZlcnNpb246ICcxLjAuMCcsXG4gICAgICAgIGVkaXRpb246IHtcbiAgICAgICAgICBpZDogJ2RlZmF1bHQtZWRpdGlvbi0xJyxcbiAgICAgICAgICB0aXRsZTogJ1N0YW5kYXJkJyxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIGlkOiAnMicsXG4gICAgICAgIG5hbWU6ICdkZWZhdWx0LWFwcCcsXG4gICAgICAgIHRpdGxlOiAnRGVmYXVsdCBBcHBsaWNhdGlvbicsXG4gICAgICAgIHZlcnNpb246ICcxLjAuMCcsXG4gICAgICAgIGVkaXRpb246IHtcbiAgICAgICAgICBpZDogJ2RlZmF1bHQtZWRpdGlvbi0yJyxcbiAgICAgICAgICB0aXRsZTogJ1N0YW5kYXJkJyxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgXTtcbiAgfVxufVxuIl19","import { InjectionToken } from '@angular/core';\nexport const AXP_TENANT_LOADER = new InjectionToken('AXP_TENANT_LOADER', {\n providedIn: 'root',\n factory: () => {\n return new AXPTenantDefaultLoader();\n },\n});\nclass AXPTenantDefaultLoader {\n async getList(context) {\n return [\n {\n id: '1',\n name: 'default-tenant',\n title: 'Default Tenant',\n },\n ];\n }\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVuYW50LmxvYWRlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvcGxhdGZvcm0vYXV0aC9zcmMvbGliL3RlbmFudC90ZW5hbnQubG9hZGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFRL0MsTUFBTSxDQUFDLE1BQU0saUJBQWlCLEdBQUcsSUFBSSxjQUFjLENBQWtCLG1CQUFtQixFQUFFO0lBQ3hGLFVBQVUsRUFBRSxNQUFNO0lBQ2xCLE9BQU8sRUFBRSxHQUFHLEVBQUU7UUFDWixPQUFPLElBQUksc0JBQXNCLEVBQUUsQ0FBQztJQUN0QyxDQUFDO0NBQ0YsQ0FBQyxDQUFDO0FBRUgsTUFBTSxzQkFBc0I7SUFDMUIsS0FBSyxDQUFDLE9BQU8sQ0FBQyxPQUEwQjtRQUN0QyxPQUFPO1lBQ0w7Z0JBQ0UsRUFBRSxFQUFFLEdBQUc7Z0JBQ1AsSUFBSSxFQUFFLGdCQUFnQjtnQkFDdEIsS0FBSyxFQUFFLGdCQUFnQjthQUN4QjtTQUNGLENBQUM7SUFDSixDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3Rpb25Ub2tlbiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQVhQVGVuYW50IH0gZnJvbSAnLi90ZW5hbnQudHlwZXMnO1xuaW1wb3J0IHsgQVhQU2Vzc2lvbkNvbnRleHQgfSBmcm9tICcuLi9zZXNzaW9uLnR5cGVzJztcblxuZXhwb3J0IGludGVyZmFjZSBBWFBUZW5hbnRMb2FkZXIge1xuICBnZXRMaXN0KGNvbnRleHQ6IEFYUFNlc3Npb25Db250ZXh0KTogUHJvbWlzZTxBWFBUZW5hbnRbXT47XG59XG5cbmV4cG9ydCBjb25zdCBBWFBfVEVOQU5UX0xPQURFUiA9IG5ldyBJbmplY3Rpb25Ub2tlbjxBWFBUZW5hbnRMb2FkZXI+KCdBWFBfVEVOQU5UX0xPQURFUicsIHtcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnLFxuICBmYWN0b3J5OiAoKSA9PiB7XG4gICAgcmV0dXJuIG5ldyBBWFBUZW5hbnREZWZhdWx0TG9hZGVyKCk7XG4gIH0sXG59KTtcblxuY2xhc3MgQVhQVGVuYW50RGVmYXVsdExvYWRlciBpbXBsZW1lbnRzIEFYUFRlbmFudExvYWRlciB7XG4gIGFzeW5jIGdldExpc3QoY29udGV4dDogQVhQU2Vzc2lvbkNvbnRleHQpOiBQcm9taXNlPEFYUFRlbmFudFtdPiB7XG4gICAgcmV0dXJuIFtcbiAgICAgIHtcbiAgICAgICAgaWQ6ICcxJyxcbiAgICAgICAgbmFtZTogJ2RlZmF1bHQtdGVuYW50JyxcbiAgICAgICAgdGl0bGU6ICdEZWZhdWx0IFRlbmFudCcsXG4gICAgICB9LFxuICAgIF07XG4gIH1cbn1cbiJdfQ==","import { Injectable, Injector } from \"@angular/core\";\nimport * as i0 from \"@angular/core\";\nexport class AXPAuthStrategyRegistryService {\n constructor(injector) {\n this.strategies = new Map();\n this.injector = injector;\n }\n register(...plugins) {\n plugins.forEach(t => {\n const childInjector = Injector.create({ providers: [{ provide: t, useClass: t, deps: [] }], parent: this.injector });\n const strategy = childInjector.get(t);\n if (strategy) {\n this.strategies.set(strategy.name, strategy);\n }\n });\n }\n get(strategyKey) {\n return this.strategies.get(strategyKey);\n }\n static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: \"12.0.0\", version: \"20.3.12\", ngImport: i0, type: AXPAuthStrategyRegistryService, deps: [{ token: i0.Injector }], target: i0.ɵɵFactoryTarget.Injectable }); }\n static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: \"12.0.0\", version: \"20.3.12\", ngImport: i0, type: AXPAuthStrategyRegistryService, providedIn: 'root' }); }\n}\ni0.ɵɵngDeclareClassMetadata({ minVersion: \"12.0.0\", version: \"20.3.12\", ngImport: i0, type: AXPAuthStrategyRegistryService, decorators: [{\n type: Injectable,\n args: [{\n providedIn: 'root'\n }]\n }], ctorParameters: () => [{ type: i0.Injector }] });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXV0aC1yZWdpc3RyeS5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9wbGF0Zm9ybS9hdXRoL3NyYy9saWIvYXV0aC1yZWdpc3RyeS5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsUUFBUSxFQUFFLE1BQU0sZUFBZSxDQUFDOztBQU1yRCxNQUFNLE9BQU8sOEJBQThCO0lBS3pDLFlBQVksUUFBa0I7UUFKdEIsZUFBVSxHQUFHLElBQUksR0FBRyxFQUEyQixDQUFDO1FBS3RELElBQUksQ0FBQyxRQUFRLEdBQUcsUUFBUSxDQUFDO0lBQzNCLENBQUM7SUFFRCxRQUFRLENBQUMsR0FBRyxPQUFzQztRQUNoRCxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFO1lBQ2xCLE1BQU0sYUFBYSxHQUFHLFFBQVEsQ0FBQyxNQUFNLENBQUMsRUFBRSxTQUFTLEVBQUUsQ0FBQyxFQUFFLE9BQU8sRUFBRSxDQUFDLEVBQUUsUUFBUSxFQUFFLENBQUMsRUFBRSxJQUFJLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxNQUFNLEVBQUUsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUM7WUFDckgsTUFBTSxRQUFRLEdBQUcsYUFBYSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUN0QyxJQUFJLFFBQVEsRUFBRSxDQUFDO2dCQUNiLElBQUksQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsUUFBUSxDQUFDLENBQUM7WUFDL0MsQ0FBQztRQUNILENBQUMsQ0FBQyxDQUFBO0lBQ0osQ0FBQztJQUVELEdBQUcsQ0FBQyxXQUFtQjtRQUNyQixPQUFPLElBQUksQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLFdBQVcsQ0FBQyxDQUFDO0lBQzFDLENBQUM7K0dBckJVLDhCQUE4QjttSEFBOUIsOEJBQThCLGNBRjdCLE1BQU07OzRGQUVQLDhCQUE4QjtrQkFIMUMsVUFBVTttQkFBQztvQkFDVixVQUFVLEVBQUUsTUFBTTtpQkFDbkIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlLCBJbmplY3RvciB9IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XG5pbXBvcnQgeyBBWFBBdXRoU3RyYXRlZ3kgfSBmcm9tIFwiLi9hdXRoLnN0cmF0ZWd5XCI7XG5cbkBJbmplY3RhYmxlKHtcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnXG59KVxuZXhwb3J0IGNsYXNzIEFYUEF1dGhTdHJhdGVneVJlZ2lzdHJ5U2VydmljZSB7XG4gIHByaXZhdGUgc3RyYXRlZ2llcyA9IG5ldyBNYXA8c3RyaW5nLCBBWFBBdXRoU3RyYXRlZ3k+KCk7XG5cbiAgcHJpdmF0ZSBpbmplY3RvcjogSW5qZWN0b3I7XG5cbiAgY29uc3RydWN0b3IoaW5qZWN0b3I6IEluamVjdG9yKSB7XG4gICAgdGhpcy5pbmplY3RvciA9IGluamVjdG9yO1xuICB9XG5cbiAgcmVnaXN0ZXIoLi4ucGx1Z2luczogKG5ldyAoKSA9PiBBWFBBdXRoU3RyYXRlZ3kpW10pIHtcbiAgICBwbHVnaW5zLmZvckVhY2godCA9PiB7XG4gICAgICBjb25zdCBjaGlsZEluamVjdG9yID0gSW5qZWN0b3IuY3JlYXRlKHsgcHJvdmlkZXJzOiBbeyBwcm92aWRlOiB0LCB1c2VDbGFzczogdCwgZGVwczogW10gfV0sIHBhcmVudDogdGhpcy5pbmplY3RvciB9KTtcbiAgICAgIGNvbnN0IHN0cmF0ZWd5ID0gY2hpbGRJbmplY3Rvci5nZXQodCk7XG4gICAgICBpZiAoc3RyYXRlZ3kpIHtcbiAgICAgICAgdGhpcy5zdHJhdGVnaWVzLnNldChzdHJhdGVneS5uYW1lLCBzdHJhdGVneSk7XG4gICAgICB9XG4gICAgfSlcbiAgfVxuXG4gIGdldChzdHJhdGVneUtleTogc3RyaW5nKTogQVhQQXV0aFN0cmF0ZWd5IHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5zdHJhdGVnaWVzLmdldChzdHJhdGVneUtleSk7XG4gIH1cbn0iXX0=","import { InjectionToken } from '@angular/core';\nexport const AXP_FEATURE_LOADER = new InjectionToken('AXP_FEATURE_LOADER', {\n providedIn: 'root',\n factory: () => {\n return new AXPFeatureDefaultLoader();\n },\n});\nclass AXPFeatureDefaultLoader {\n async getList(context) {\n return [];\n }\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmVhdHVyZS5sb2FkZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL3BsYXRmb3JtL2F1dGgvc3JjL2xpYi9mZWF0dXJlL2ZlYXR1cmUubG9hZGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFRL0MsTUFBTSxDQUFDLE1BQU0sa0JBQWtCLEdBQUcsSUFBSSxjQUFjLENBQW1CLG9CQUFvQixFQUFFO0lBQzNGLFVBQVUsRUFBRSxNQUFNO0lBQ2xCLE9BQU8sRUFBRSxHQUFHLEVBQUU7UUFDWixPQUFPLElBQUksdUJBQXVCLEVBQUUsQ0FBQztJQUN2QyxDQUFDO0NBQ0YsQ0FBQyxDQUFDO0FBRUgsTUFBTSx1QkFBdUI7SUFDM0IsS0FBSyxDQUFDLE9BQU8sQ0FBQyxPQUEwQjtRQUN0QyxPQUFPLEVBQUUsQ0FBQztJQUNaLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGlvblRva2VuIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBBWFBGZWF0dXJlIH0gZnJvbSAnLi9mZWF0dXJlLnR5cGVzJztcbmltcG9ydCB7IEFYUFNlc3Npb25Db250ZXh0IH0gZnJvbSAnLi4vc2Vzc2lvbi50eXBlcyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgQVhQRmVhdHVyZUxvYWRlciB7XG4gIGdldExpc3QoY29udGV4dDogQVhQU2Vzc2lvbkNvbnRleHQpOiBQcm9taXNlPEFYUEZlYXR1cmVbXT47XG59XG5cbmV4cG9ydCBjb25zdCBBWFBfRkVBVFVSRV9MT0FERVIgPSBuZXcgSW5qZWN0aW9uVG9rZW48QVhQRmVhdHVyZUxvYWRlcj4oJ0FYUF9GRUFUVVJFX0xPQURFUicsIHtcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnLFxuICBmYWN0b3J5OiAoKSA9PiB7XG4gICAgcmV0dXJuIG5ldyBBWFBGZWF0dXJlRGVmYXVsdExvYWRlcigpO1xuICB9LFxufSk7XG5cbmNsYXNzIEFYUEZlYXR1cmVEZWZhdWx0TG9hZGVyIGltcGxlbWVudHMgQVhQRmVhdHVyZUxvYWRlciB7XG4gIGFzeW5jIGdldExpc3QoY29udGV4dDogQVhQU2Vzc2lvbkNvbnRleHQpOiBQcm9taXNlPEFYUEZlYXR1cmVbXT4ge1xuICAgIHJldHVybiBbXTtcbiAgfVxufVxuIl19","import { Directive, Input, TemplateRef, ViewContainerRef, inject, signal } from '@angular/core';\nimport { AXPSessionService } from '../session.service';\nimport * as i0 from \"@angular/core\";\nexport class AXPFeatureDirective {\n constructor(templateRef, viewContainer) {\n this.templateRef = templateRef;\n this.viewContainer = viewContainer;\n this.hasView = signal(false, ...(ngDevMode ? [{ debugName: \"hasView\" }] : []));\n this.sessionService = inject(AXPSessionService);\n }\n set feature(featureKeys) {\n const keys = !featureKeys ? [] : (Array.isArray(featureKeys) ? featureKeys : [featureKeys]);\n if (keys.length == 0) {\n // If featureKey is null or empty, decide the default behavior here\n this.viewContainer.createEmbeddedView(this.templateRef);\n this.hasView.set(true);\n return;\n }\n this.subscription = this.sessionService.features$\n //.pipe(first())\n .subscribe(() => {\n if (this.sessionService.isFeatureEnabled(...keys)) {\n if (!this.hasView()) {\n this.viewContainer.createEmbeddedView(this.templateRef);\n this.hasView.set(true);\n }\n }\n else {\n this.viewContainer.clear();\n this.hasView.set(false);\n }\n });\n }\n set featureElse(elseTemplateRef) {\n if (!this.hasView()) {\n this.viewContainer.createEmbeddedView(elseTemplateRef);\n }\n }\n ngOnDestroy() {\n this.subscription?.unsubscribe();\n }\n static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: \"12.0.0\", version: \"20.3.12\", ngImport: i0, type: AXPFeatureDirective, deps: [{ token: i0.TemplateRef }, { token: i0.ViewContainerRef }], target: i0.ɵɵFactoryTarget.Directive }); }\n static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: \"14.0.0\", version: \"20.3.12\", type: AXPFeatureDirective, isStandalone: false, selector: \"[feature]\", inputs: { feature: \"feature\", featureElse: \"featureElse\" }, ngImport: i0 }); }\n}\ni0.ɵɵngDeclareClassMetadata({ minVersion: \"12.0.0\", version: \"20.3.12\", ngImport: i0, type: AXPFeatureDirective, decorators: [{\n type: Directive,\n args: [{\n selector: '[feature]',\n standalone: false\n }]\n }], ctorParameters: () => [{ type: i0.TemplateRef }, { type: i0.ViewContainerRef }], propDecorators: { feature: [{\n type: Input\n }], featureElse: [{\n type: Input\n }] } });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmVhdHVyZS5kaXJlY3RpdmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL3BsYXRmb3JtL2F1dGgvc3JjL2xpYi9mZWF0dXJlL2ZlYXR1cmUuZGlyZWN0aXZlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLFdBQVcsRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRWhHLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLG9CQUFvQixDQUFDOztBQU12RCxNQUFNLE9BQU8sbUJBQW1CO0lBSzlCLFlBQ1UsV0FBNkIsRUFDN0IsYUFBK0I7UUFEL0IsZ0JBQVcsR0FBWCxXQUFXLENBQWtCO1FBQzdCLGtCQUFhLEdBQWIsYUFBYSxDQUFrQjtRQU5qQyxZQUFPLEdBQUcsTUFBTSxDQUFDLEtBQUssbURBQUMsQ0FBQztRQUV4QixtQkFBYyxHQUFHLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO0lBSy9DLENBQUM7SUFFTCxJQUNXLE9BQU8sQ0FBQyxXQUFxQztRQUN0RCxNQUFNLElBQUksR0FBYSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDO1FBQ3RHLElBQUksSUFBSSxDQUFDLE1BQU0sSUFBSSxDQUFDLEVBQUUsQ0FBQztZQUNyQixtRUFBbUU7WUFDbkUsSUFBSSxDQUFDLGFBQWEsQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7WUFDeEQsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDdkIsT0FBTztRQUNULENBQUM7UUFDRCxJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsU0FBUztZQUMvQyxnQkFBZ0I7YUFDZixTQUFTLENBQUMsR0FBRyxFQUFFO1lBQ2QsSUFBSSxJQUFJLENBQUMsY0FBYyxDQUFDLGdCQUFnQixDQUFDLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQztnQkFDbEQsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDO29CQUNwQixJQUFJLENBQUMsYUFBYSxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQztvQkFDeEQsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7Z0JBQ3pCLENBQUM7WUFDSCxDQUFDO2lCQUFNLENBQUM7Z0JBQ04sSUFBSSxDQUFDLGFBQWEsQ0FBQyxLQUFLLEVBQUUsQ0FBQztnQkFDM0IsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDMUIsQ0FBQztRQUNILENBQUMsQ0FBQyxDQUFDO0lBQ1AsQ0FBQztJQUVELElBQ1csV0FBVyxDQUFDLGVBQWlDO1FBQ3RELElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQztZQUNwQixJQUFJLENBQUMsYUFBYSxDQUFDLGtCQUFrQixDQUFDLGVBQWUsQ0FBQyxDQUFDO1FBQ3pELENBQUM7SUFDSCxDQUFDO0lBRUQsV0FBVztRQUNULElBQUksQ0FBQyxZQUFZLEVBQUUsV0FBVyxFQUFFLENBQUM7SUFDbkMsQ0FBQzsrR0EzQ1UsbUJBQW1CO21HQUFuQixtQkFBbUI7OzRGQUFuQixtQkFBbUI7a0JBSi9CLFNBQVM7bUJBQUM7b0JBQ1AsUUFBUSxFQUFFLFdBQVc7b0JBQ3JCLFVBQVUsRUFBRSxLQUFLO2lCQUNwQjs7c0JBV0UsS0FBSzs7c0JBd0JMLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBEaXJlY3RpdmUsIElucHV0LCBUZW1wbGF0ZVJlZiwgVmlld0NvbnRhaW5lclJlZiwgaW5qZWN0LCBzaWduYWwgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFN1YnNjcmlwdGlvbiwgZmlyc3QgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IEFYUFNlc3Npb25TZXJ2aWNlIH0gZnJvbSAnLi4vc2Vzc2lvbi5zZXJ2aWNlJztcblxuQERpcmVjdGl2ZSh7XG4gICAgc2VsZWN0b3I6ICdbZmVhdHVyZV0nLFxuICAgIHN0YW5kYWxvbmU6IGZhbHNlXG59KVxuZXhwb3J0IGNsYXNzIEFYUEZlYXR1cmVEaXJlY3RpdmUge1xuICBwcml2YXRlIGhhc1ZpZXcgPSBzaWduYWwoZmFsc2UpO1xuICBwcml2YXRlIHN1YnNjcmlwdGlvbiE6IFN1YnNjcmlwdGlvbjtcbiAgcHJpdmF0ZSBzZXNzaW9uU2VydmljZSA9IGluamVjdChBWFBTZXNzaW9uU2VydmljZSk7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSB0ZW1wbGF0ZVJlZjogVGVtcGxhdGVSZWY8YW55PixcbiAgICBwcml2YXRlIHZpZXdDb250YWluZXI6IFZpZXdDb250YWluZXJSZWZcbiAgKSB7IH1cblxuICBASW5wdXQoKVxuICBwdWJsaWMgc2V0IGZlYXR1cmUoZmVhdHVyZUtleXM6IHN0cmluZyB8IHN0cmluZ1tdIHwgbnVsbCkge1xuICAgIGNvbnN0IGtleXM6IHN0cmluZ1tdID0gIWZlYXR1cmVLZXlzID8gW10gOiAoQXJyYXkuaXNBcnJheShmZWF0dXJlS2V5cykgPyBmZWF0dXJlS2V5cyA6IFtmZWF0dXJlS2V5c10pO1xuICAgIGlmIChrZXlzLmxlbmd0aCA9PSAwKSB7XG4gICAgICAvLyBJZiBmZWF0dXJlS2V5IGlzIG51bGwgb3IgZW1wdHksIGRlY2lkZSB0aGUgZGVmYXVsdCBiZWhhdmlvciBoZXJlXG4gICAgICB0aGlzLnZpZXdDb250YWluZXIuY3JlYXRlRW1iZWRkZWRWaWV3KHRoaXMudGVtcGxhdGVSZWYpO1xuICAgICAgdGhpcy5oYXNWaWV3LnNldCh0cnVlKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5zdWJzY3JpcHRpb24gPSB0aGlzLnNlc3Npb25TZXJ2aWNlLmZlYXR1cmVzJFxuICAgICAgLy8ucGlwZShmaXJzdCgpKVxuICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgIGlmICh0aGlzLnNlc3Npb25TZXJ2aWNlLmlzRmVhdHVyZUVuYWJsZWQoLi4ua2V5cykpIHtcbiAgICAgICAgICBpZiAoIXRoaXMuaGFzVmlldygpKSB7XG4gICAgICAgICAgICB0aGlzLnZpZXdDb250YWluZXIuY3JlYXRlRW1iZWRkZWRWaWV3KHRoaXMudGVtcGxhdGVSZWYpO1xuICAgICAgICAgICAgdGhpcy5oYXNWaWV3LnNldCh0cnVlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy52aWV3Q29udGFpbmVyLmNsZWFyKCk7XG4gICAgICAgICAgdGhpcy5oYXNWaWV3LnNldChmYWxzZSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICB9XG5cbiAgQElucHV0KClcbiAgcHVibGljIHNldCBmZWF0dXJlRWxzZShlbHNlVGVtcGxhdGVSZWY6IFRlbXBsYXRlUmVmPGFueT4pIHtcbiAgICBpZiAoIXRoaXMuaGFzVmlldygpKSB7XG4gICAgICB0aGlzLnZpZXdDb250YWluZXIuY3JlYXRlRW1iZWRkZWRWaWV3KGVsc2VUZW1wbGF0ZVJlZik7XG4gICAgfVxuICB9XG5cbiAgbmdPbkRlc3Ryb3koKSB7XG4gICAgdGhpcy5zdWJzY3JpcHRpb24/LnVuc3Vic2NyaWJlKCk7XG4gIH1cbn1cbiJdfQ==","export class AXPUnauthorizedError extends Error {\n constructor(message, data) {\n super(message);\n this.data = data;\n this.name = 'AXPUnauthorizedError';\n }\n}\nexport class AXPUnauthenticatedError extends Error {\n constructor(message, data) {\n super(message);\n this.data = data;\n this.name = 'AXPUnauthenticatedError';\n }\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXJyb3JzLnR5cGVzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9wbGF0Zm9ybS9hdXRoL3NyYy9saWIvZXJyb3JzLnR5cGVzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE1BQU0sT0FBTyxvQkFBcUIsU0FBUSxLQUFLO0lBQzNDLFlBQVksT0FBZ0IsRUFBUyxJQUErQjtRQUNoRSxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUM7UUFEa0IsU0FBSSxHQUFKLElBQUksQ0FBMkI7UUFFaEUsSUFBSSxDQUFDLElBQUksR0FBRyxzQkFBc0IsQ0FBQztJQUN2QyxDQUFDO0NBQ0o7QUFHRCxNQUFNLE9BQU8sdUJBQXdCLFNBQVEsS0FBSztJQUM5QyxZQUFZLE9BQWdCLEVBQVMsSUFBK0I7UUFDaEUsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBRGtCLFNBQUksR0FBSixJQUFJLENBQTJCO1FBRWhFLElBQUksQ0FBQyxJQUFJLEdBQUcseUJBQXlCLENBQUM7SUFDMUMsQ0FBQztDQUNKIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGNsYXNzIEFYUFVuYXV0aG9yaXplZEVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICAgIGNvbnN0cnVjdG9yKG1lc3NhZ2U/OiBzdHJpbmcsIHB1YmxpYyBkYXRhPzogeyByZWRpcmVjdFVybD86IHN0cmluZyB9KSB7XG4gICAgICAgIHN1cGVyKG1lc3NhZ2UpO1xuICAgICAgICB0aGlzLm5hbWUgPSAnQVhQVW5hdXRob3JpemVkRXJyb3InO1xuICAgIH1cbn1cblxuXG5leHBvcnQgY2xhc3MgQVhQVW5hdXRoZW50aWNhdGVkRXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gICAgY29uc3RydWN0b3IobWVzc2FnZT86IHN0cmluZywgcHVibGljIGRhdGE/OiB7IHJlZGlyZWN0VXJsPzogc3RyaW5nIH0pIHtcbiAgICAgICAgc3VwZXIobWVzc2FnZSk7XG4gICAgICAgIHRoaXMubmFtZSA9ICdBWFBVbmF1dGhlbnRpY2F0ZWRFcnJvcic7XG4gICAgfVxufSJdfQ==","import { inject } from \"@angular/core\";\nimport { AXPSessionService } from \"../session.service\";\nimport { map } from \"rxjs\";\nimport { AXPUnauthorizedError } from \"../errors.types\";\nexport const AXPFeatureGuard = (route, state) => {\n const sessionService = inject(AXPSessionService);\n const requiredFeatures = route.data['requiredFeature'];\n return sessionService.features$.pipe(map(() => {\n const keys = !requiredFeatures ? [] : (Array.isArray(requiredFeatures) ? requiredFeatures : [requiredFeatures]);\n const hasFeature = keys.length == 0 || sessionService.isFeatureEnabled(...keys);\n if (!hasFeature) {\n throw new AXPUnauthorizedError(`Access Denied. You do not have access to this feature. Required feature(s): ${keys.join(', ')}. Please contact support if you need access.`, {\n redirectUrl: state.url\n });\n }\n return true;\n }));\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmVhdHVyZS5ndWFyZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvcGxhdGZvcm0vYXV0aC9zcmMvbGliL2ZlYXR1cmUvZmVhdHVyZS5ndWFyZC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3ZDLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQ3ZELE9BQU8sRUFBcUIsR0FBRyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQzlDLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBR3ZELE1BQU0sQ0FBQyxNQUFNLGVBQWUsR0FDMUIsQ0FBQyxLQUE2QixFQUFFLEtBQTBCLEVBQWlDLEVBQUU7SUFDM0YsTUFBTSxjQUFjLEdBQUcsTUFBTSxDQUFDLGlCQUFpQixDQUFDLENBQUM7SUFDakQsTUFBTSxnQkFBZ0IsR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUErQixDQUFDO0lBRXJGLE9BQU8sY0FBYyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQ2xDLEdBQUcsQ0FBQyxHQUFHLEVBQUU7UUFDUCxNQUFNLElBQUksR0FBYSxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUM7UUFDMUgsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLE1BQU0sSUFBSSxDQUFDLElBQUksY0FBYyxDQUFDLGdCQUFnQixDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUM7UUFDaEYsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO1lBQ2hCLE1BQU0sSUFBSSxvQkFBb0IsQ0FDNUIsK0VBQStFLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLDhDQUE4QyxFQUM1STtnQkFDRSxXQUFXLEVBQUUsS0FBSyxDQUFDLEdBQUc7YUFDdkIsQ0FDRixDQUFDO1FBQ0osQ0FBQztRQUNELE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQyxDQUFDLENBQ0gsQ0FBQztBQUNKLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEFjdGl2YXRlZFJvdXRlU25hcHNob3QsIENhbkFjdGl2YXRlRm4sIFJvdXRlclN0YXRlU25hcHNob3QsIFVybFRyZWUgfSBmcm9tIFwiQGFuZ3VsYXIvcm91dGVyXCI7XG5pbXBvcnQgeyBpbmplY3QgfSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xuaW1wb3J0IHsgQVhQU2Vzc2lvblNlcnZpY2UgfSBmcm9tIFwiLi4vc2Vzc2lvbi5zZXJ2aWNlXCI7XG5pbXBvcnQgeyBPYnNlcnZhYmxlLCBmaXJzdCwgbWFwIH0gZnJvbSBcInJ4anNcIjtcbmltcG9ydCB7IEFYUFVuYXV0aG9yaXplZEVycm9yIH0gZnJvbSBcIi4uL2Vycm9ycy50eXBlc1wiO1xuXG5cbmV4cG9ydCBjb25zdCBBWFBGZWF0dXJlR3VhcmQ6IENhbkFjdGl2YXRlRm4gPVxuICAocm91dGU6IEFjdGl2YXRlZFJvdXRlU25hcHNob3QsIHN0YXRlOiBSb3V0ZXJTdGF0ZVNuYXBzaG90KTogT2JzZXJ2YWJsZTxib29sZWFuIHwgVXJsVHJlZT4gPT4ge1xuICAgIGNvbnN0IHNlc3Npb25TZXJ2aWNlID0gaW5qZWN0KEFYUFNlc3Npb25TZXJ2aWNlKTtcbiAgICBjb25zdCByZXF1aXJlZEZlYXR1cmVzID0gcm91dGUuZGF0YVsncmVxdWlyZWRGZWF0dXJlJ10gYXMgKHN0cmluZyB8IHN0cmluZ1tdIHwgbnVsbCk7XG5cbiAgICByZXR1cm4gc2Vzc2lvblNlcnZpY2UuZmVhdHVyZXMkLnBpcGUoXG4gICAgICBtYXAoKCkgPT4ge1xuICAgICAgICBjb25zdCBrZXlzOiBzdHJpbmdbXSA9ICFyZXF1aXJlZEZlYXR1cmVzID8gW10gOiAoQXJyYXkuaXNBcnJheShyZXF1aXJlZEZlYXR1cmVzKSA/IHJlcXVpcmVkRmVhdHVyZXMgOiBbcmVxdWlyZWRGZWF0dXJlc10pO1xuICAgICAgICBjb25zdCBoYXNGZWF0dXJlID0ga2V5cy5sZW5ndGggPT0gMCB8fCBzZXNzaW9uU2VydmljZS5pc0ZlYXR1cmVFbmFibGVkKC4uLmtleXMpO1xuICAgICAgICBpZiAoIWhhc0ZlYXR1cmUpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgQVhQVW5hdXRob3JpemVkRXJyb3IoXG4gICAgICAgICAgICBgQWNjZXNzIERlbmllZC4gWW91IGRvIG5vdCBoYXZlIGFjY2VzcyB0byB0aGlzIGZlYXR1cmUuIFJlcXVpcmVkIGZlYXR1cmUocyk6ICR7a2V5cy5qb2luKCcsICcpfS4gUGxlYXNlIGNvbnRhY3Qgc3VwcG9ydCBpZiB5b3UgbmVlZCBhY2Nlc3MuYCxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgcmVkaXJlY3RVcmw6IHN0YXRlLnVybFxuICAgICAgICAgICAgfVxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9KVxuICAgICk7XG4gIH07XG4iXX0=","import { InjectionToken } from '@angular/core';\n/**\n * Optional injection token for feature checker.\n * If provided, the checker will be called to potentially override\n * feature enablement results based on custom logic.\n */\nexport const AXP_FEATURE_CHECKER = new InjectionToken('AXP_FEATURE_CHECKER');\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmVhdHVyZS1jaGVja2VyLnRva2VuLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9wbGF0Zm9ybS9hdXRoL3NyYy9saWIvZmVhdHVyZS9mZWF0dXJlLWNoZWNrZXIudG9rZW4udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUcvQzs7OztHQUlHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sbUJBQW1CLEdBQUcsSUFBSSxjQUFjLENBQ25ELHFCQUFxQixDQUN0QixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0aW9uVG9rZW4gfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEFYUEZlYXR1cmVDaGVja2VyIH0gZnJvbSAnLi9mZWF0dXJlLWNoZWNrZXIudHlwZXMnO1xuXG4vKipcbiAqIE9wdGlvbmFsIGluamVjdGlvbiB0b2tlbiBmb3IgZmVhdHVyZSBjaGVja2VyLlxuICogSWYgcHJvdmlkZWQsIHRoZSBjaGVja2VyIHdpbGwgYmUgY2FsbGVkIHRvIHBvdGVudGlhbGx5IG92ZXJyaWRlXG4gKiBmZWF0dXJlIGVuYWJsZW1lbnQgcmVzdWx0cyBiYXNlZCBvbiBjdXN0b20gbG9naWMuXG4gKi9cbmV4cG9ydCBjb25zdCBBWFBfRkVBVFVSRV9DSEVDS0VSID0gbmV3IEluamVjdGlvblRva2VuPEFYUEZlYXR1cmVDaGVja2VyPihcbiAgJ0FYUF9GRUFUVVJFX0NIRUNLRVInXG4pO1xuXG4iXX0=","import { InjectionToken } from \"@angular/core\";\nexport const AXP_PERMISSION_LOADER = new InjectionToken('AXP_PERMISSION_LOADER', {\n providedIn: 'root',\n factory: () => {\n return new AXPPermissionDefaultLoader();\n }\n});\nclass AXPPermissionDefaultLoader {\n async getList(context) {\n return [];\n }\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGVybWlzc2lvbi5sb2FkZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL3BsYXRmb3JtL2F1dGgvc3JjL2xpYi9wZXJtaXNzaW9uL3Blcm1pc3Npb24ubG9hZGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFRL0MsTUFBTSxDQUFDLE1BQU0scUJBQXFCLEdBQUcsSUFBSSxjQUFjLENBQXNCLHVCQUF1QixFQUFFO0lBQ2xHLFVBQVUsRUFBRSxNQUFNO0lBQ2xCLE9BQU8sRUFBRSxHQUFHLEVBQUU7UUFDVixPQUFPLElBQUksMEJBQTBCLEVBQUUsQ0FBQztJQUM1QyxDQUFDO0NBQ0osQ0FBQyxDQUFDO0FBR0gsTUFBTSwwQkFBMEI7SUFDNUIsS0FBSyxDQUFDLE9BQU8sQ0FBQyxPQUEwQjtRQUNwQyxPQUFPLEVBQUUsQ0FBQztJQUNkLENBQUM7Q0FDSiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGlvblRva2VuIH0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcbmltcG9ydCB7IEFYUFBlcm1pc3Npb24gfSBmcm9tIFwiLi9wZXJtaXNzaW9uLnR5cGVzXCI7XG5pbXBvcnQgeyBBWFBTZXNzaW9uQ29udGV4dCB9IGZyb20gXCIuLi9zZXNzaW9uLnR5cGVzXCI7XG5cbmV4cG9ydCBpbnRlcmZhY2UgQVhQUGVybWlzc2lvbkxvYWRlciB7XG4gICAgZ2V0TGlzdChjb250ZXh0OiBBWFBTZXNzaW9uQ29udGV4dCk6IFByb21pc2U8QVhQUGVybWlzc2lvbltdPjtcbn1cblxuZXhwb3J0IGNvbnN0IEFYUF9QRVJNSVNTSU9OX0xPQURFUiA9IG5ldyBJbmplY3Rpb25Ub2tlbjxBWFBQZXJtaXNzaW9uTG9hZGVyPignQVhQX1BFUk1JU1NJT05fTE9BREVSJywge1xuICAgIHByb3ZpZGVkSW46ICdyb290JyxcbiAgICBmYWN0b3J5OiAoKSA9PiB7XG4gICAgICAgIHJldHVybiBuZXcgQVhQUGVybWlzc2lvbkRlZmF1bHRMb2FkZXIoKTtcbiAgICB9XG59KTtcblxuXG5jbGFzcyBBWFBQZXJtaXNzaW9uRGVmYXVsdExvYWRlciBpbXBsZW1lbnRzIEFYUFBlcm1pc3Npb25Mb2FkZXIge1xuICAgIGFzeW5jIGdldExpc3QoY29udGV4dDogQVhQU2Vzc2lvbkNvbnRleHQpOiBQcm9taXNlPEFYUFBlcm1pc3Npb25bXT4ge1xuICAgICAgICByZXR1cm4gW107XG4gICAgfVxufSJdfQ==","import { InjectionToken } from '@angular/core';\n/**\n * Optional injection token for permission checker.\n * If provided, the checker will be called to potentially override\n * authorization results based on custom logic.\n */\nexport const AXP_PERMISSION_CHECKER = new InjectionToken('AXP_PERMISSION_CHECKER');\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGVybWlzc2lvbi1jaGVja2VyLnRva2VuLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9wbGF0Zm9ybS9hdXRoL3NyYy9saWIvcGVybWlzc2lvbi9wZXJtaXNzaW9uLWNoZWNrZXIudG9rZW4udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUcvQzs7OztHQUlHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sc0JBQXNCLEdBQUcsSUFBSSxjQUFjLENBQ3RELHdCQUF3QixDQUN6QixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0aW9uVG9rZW4gfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEFYUFBlcm1pc3Npb25DaGVja2VyIH0gZnJvbSAnLi9wZXJtaXNzaW9uLWNoZWNrZXIudHlwZXMnO1xuXG4vKipcbiAqIE9wdGlvbmFsIGluamVjdGlvbiB0b2tlbiBmb3IgcGVybWlzc2lvbiBjaGVja2VyLlxuICogSWYgcHJvdmlkZWQsIHRoZSBjaGVja2VyIHdpbGwgYmUgY2FsbGVkIHRvIHBvdGVudGlhbGx5IG92ZXJyaWRlXG4gKiBhdXRob3JpemF0aW9uIHJlc3VsdHMgYmFzZWQgb24gY3VzdG9tIGxvZ2ljLlxuICovXG5leHBvcnQgY29uc3QgQVhQX1BFUk1JU1NJT05fQ0hFQ0tFUiA9IG5ldyBJbmplY3Rpb25Ub2tlbjxBWFBQZXJtaXNzaW9uQ2hlY2tlcj4oXG4gICdBWFBfUEVSTUlTU0lPTl9DSEVDS0VSJ1xuKTtcblxuIl19","export class AXPSessionContext {\n get user() {\n return this._user;\n }\n get tenant() {\n return this._tenant;\n }\n get application() {\n return this._application;\n }\n constructor(context) {\n this._user = null;\n this._tenant = null;\n this._application = null;\n this._user = context.user;\n this._tenant = context.tenant;\n this._application = context.application;\n }\n}\nexport var AXPSessionStatus;\n(function (AXPSessionStatus) {\n AXPSessionStatus[\"Authenticated\"] = \"authenticated\";\n AXPSessionStatus[\"Unauthenticated\"] = \"unauthenticated\";\n AXPSessionStatus[\"Unauthorized\"] = \"unauthorized\";\n AXPSessionStatus[\"Authorized\"] = \"authorized\";\n AXPSessionStatus[\"Expired\"] = \"expired\";\n AXPSessionStatus[\"SignedOut\"] = \"signedOut\";\n})(AXPSessionStatus || (AXPSessionStatus = {}));\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2Vzc2lvbi50eXBlcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvcGxhdGZvcm0vYXV0aC9zcmMvbGliL3Nlc3Npb24udHlwZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBSUEsTUFBTSxPQUFPLGlCQUFpQjtJQUcxQixJQUFXLElBQUk7UUFDWCxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUM7SUFDdEIsQ0FBQztJQUdELElBQVcsTUFBTTtRQUNiLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQztJQUN4QixDQUFDO0lBR0QsSUFBVyxXQUFXO1FBQ2xCLE9BQU8sSUFBSSxDQUFDLFlBQVksQ0FBQztJQUM3QixDQUFDO0lBRUQsWUFBWSxPQUlYO1FBbkJPLFVBQUssR0FBbUIsSUFBSSxDQUFDO1FBSzdCLFlBQU8sR0FBcUIsSUFBSSxDQUFDO1FBS2pDLGlCQUFZLEdBQTBCLElBQUksQ0FBQztRQVUvQyxJQUFJLENBQUMsS0FBSyxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUM7UUFDMUIsSUFBSSxDQUFDLE9BQU8sR0FBRyxPQUFPLENBQUMsTUFBTSxDQUFDO1FBQzlCLElBQUksQ0FBQyxZQUFZLEdBQUcsT0FBTyxDQUFDLFdBQVcsQ0FBQztJQUM1QyxDQUFDO0NBQ0o7QUFHRCxNQUFNLENBQU4sSUFBWSxnQkFPWDtBQVBELFdBQVksZ0JBQWdCO0lBQ3hCLG1EQUErQixDQUFBO0lBQy9CLHVEQUFtQyxDQUFBO0lBQ25DLGlEQUE2QixDQUFBO0lBQzdCLDZDQUF5QixDQUFBO0lBQ3pCLHVDQUFtQixDQUFBO0lBQ25CLDJDQUF1QixDQUFBO0FBQzNCLENBQUMsRUFQVyxnQkFBZ0IsS0FBaEIsZ0JBQWdCLFFBTzNCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQVhQQXBwbGljYXRpb24gfSBmcm9tIFwiLi9hcHBsaWNhdGlvbi9hcHBsaWNhdGlvbi50eXBlc1wiO1xuaW1wb3J0IHsgQVhQVGVuYW50IH0gZnJvbSBcIi4vdGVuYW50L3RlbmFudC50eXBlc1wiO1xuaW1wb3J0IHsgQVhQVXNlciB9IGZyb20gXCIuL3VzZXIvdXNlci50eXBlc1wiO1xuXG5leHBvcnQgY2xhc3MgQVhQU2Vzc2lvbkNvbnRleHQge1xuXG4gICAgcHJpdmF0ZSBfdXNlcjogQVhQVXNlciB8IG51bGwgPSBudWxsO1xuICAgIHB1YmxpYyBnZXQgdXNlcigpOiBBWFBVc2VyIHwgbnVsbCB7XG4gICAgICAgIHJldHVybiB0aGlzLl91c2VyO1xuICAgIH1cblxuICAgIHByaXZhdGUgX3RlbmFudDogQVhQVGVuYW50IHwgbnVsbCA9IG51bGw7XG4gICAgcHVibGljIGdldCB0ZW5hbnQoKTogQVhQVGVuYW50IHwgbnVsbCB7XG4gICAgICAgIHJldHVybiB0aGlzLl90ZW5hbnQ7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfYXBwbGljYXRpb246IEFYUEFwcGxpY2F0aW9uIHwgbnVsbCA9IG51bGw7XG4gICAgcHVibGljIGdldCBhcHBsaWNhdGlvbigpOiBBWFBBcHBsaWNhdGlvbiB8IG51bGwge1xuICAgICAgICByZXR1cm4gdGhpcy5fYXBwbGljYXRpb247XG4gICAgfVxuXG4gICAgY29uc3RydWN0b3IoY29udGV4dDoge1xuICAgICAgICB1c2VyOiBBWFBVc2VyIHwgbnVsbCxcbiAgICAgICAgdGVuYW50OiBBWFBUZW5hbnQgfCBudWxsLFxuICAgICAgICBhcHBsaWNhdGlvbjogQVhQQXBwbGljYXRpb24gfCBudWxsLFxuICAgIH0pIHtcbiAgICAgICAgdGhpcy5fdXNlciA9IGNvbnRleHQudXNlcjtcbiAgICAgICAgdGhpcy5fdGVuYW50ID0gY29udGV4dC50ZW5hbnQ7XG4gICAgICAgIHRoaXMuX2FwcGxpY2F0aW9uID0gY29udGV4dC5hcHBsaWNhdGlvbjtcbiAgICB9XG59XG5cblxuZXhwb3J0IGVudW0gQVhQU2Vzc2lvblN0YXR1cyB7XG4gICAgQXV0aGVudGljYXRlZCA9IFwiYXV0aGVudGljYXRlZFwiLFxuICAgIFVuYXV0aGVudGljYXRlZCA9IFwidW5hdXRoZW50aWNhdGVkXCIsXG4gICAgVW5hdXRob3JpemVkID0gXCJ1bmF1dGhvcml6ZWRcIixcbiAgICBBdXRob3JpemVkID0gXCJhdXRob3JpemVkXCIsXG4gICAgRXhwaXJlZCA9IFwiZXhwaXJlZFwiLFxuICAgIFNpZ25lZE91dCA9IFwic2lnbmVkT3V0XCJcbn0iXX0=","import { AXPBroadcastEventService, AXP_MODULE_PROVIDER_LOADER } from '@acorex/platform/core';\nimport { Injectable, inject, Injector } from '@angular/core';\nimport { isEmpty } from 'lodash-es';\nimport { BehaviorSubject, defaultIfEmpty, filter, from, map, shareReplay, switchMap } from 'rxjs';\nimport { AXP_APPLICATION_LOADER } from './application/application.loader';\nimport { AXPAuthStrategyRegistryService } from './auth-registry.service';\nimport { AXP_FEATURE_LOADER, AXP_FEATURE_CHECKER } from './feature';\nimport { AXP_PERMISSION_LOADER } from './permission/permission.loader';\nimport { AXP_PERMISSION_CHECKER } from './permission/permission-checker.token';\nimport { AXPSessionContext, AXPSessionStatus } from './session.types';\nimport { AXP_TENANT_LOADER } from './tenant/tenant.loader';\nimport * as i0 from \"@angular/core\";\nexport class AXPSessionService {\n constructor() {\n this.eventService = inject(AXPBroadcastEventService);\n this.authStrategyRegistry = inject(AXPAuthStrategyRegistryService);\n this.injector = inject(Injector);\n this.permissionLoader = inject(AXP_PERMISSION_LOADER);\n this.featureLoader = inject(AXP_FEATURE_LOADER);\n this.tenantLoader = inject(AXP_TENANT_LOADER);\n this.applicationLoader = inject(AXP_APPLICATION_LOADER);\n this.permissionChecker = inject(AXP_PERMISSION_CHECKER, { optional: true });\n this.featureChecker = inject(AXP_FEATURE_CHECKER, { optional: true });\n this.status = new BehaviorSubject(AXPSessionStatus.Unauthenticated);\n this.status$ = this.status.asObservable().pipe(shareReplay(1));\n // Add loading state to prevent premature redirects\n this.isLoading = new BehaviorSubject(true);\n this.isLoading$ = this.isLoading.asObservable().pipe(shareReplay(1));\n this.currentUserSubject = new BehaviorSubject(null);\n this.user$ = this.currentUserSubject.asObservable().pipe(shareReplay(1));\n this.currentTenantSubject = new BehaviorSubject(null);\n this.tenant$ = this.currentTenantSubject.asObservable().pipe(shareReplay(1));\n this.currentApplicationSubject = new BehaviorSubject(null);\n this.application$ = this.currentApplicationSubject.asObservable().pipe(shareReplay(1));\n this.permissionsSubject = new BehaviorSubject([]);\n this.permissions$ = this.permissionsSubject.asObservable().pipe(shareReplay(1), defaultIfEmpty([]));\n this.featuresSubject = new BehaviorSubject([]);\n this.features$ = this.featuresSubject.asObservable().pipe(shareReplay(1), defaultIfEmpty([]));\n this.isAuthenticated$ = this.status$.pipe(map((status) => {\n const isAuth = status === AXPSessionStatus.Authenticated || status === AXPSessionStatus.Authorized;\n return isAuth;\n }), shareReplay(1));\n // Add a new observable that considers loading state\n this.isAuthenticatedWithLoading$ = this.isLoading$.pipe(switchMap((loading) => {\n if (loading) {\n // Wait for loading to complete, then return authentication status\n return this.isLoading$.pipe(filter((isLoading) => !isLoading), switchMap(() => this.isAuthenticated$));\n }\n // If not loading, return current authentication status\n return this.isAuthenticated$;\n }), shareReplay(1));\n this.isAuthorized$ = this.status$.pipe(map((status) => status === AXPSessionStatus.Authorized), shareReplay(1));\n }\n static { this.SESSION_KEY = 'AXP_SESSION'; }\n /**\n * Get module provider loader lazily to avoid circular dependency.\n * ModuleProviderLoader depends on AXPSessionService, which is this service.\n */\n getModuleProviderLoader() {\n return this.injector.get(AXP_MODULE_PROVIDER_LOADER);\n }\n get user() {\n const session = this.getSessionData();\n if (session?.user && !this.currentUserSubject.value) {\n this.currentUserSubject.next(session.user);\n }\n return this.currentUserSubject.value;\n }\n get tenant() {\n const session = this.getSessionData();\n if (session?.tenant && !this.currentTenantSubject.value) {\n this.currentTenantSubject.next(session.tenant);\n }\n return this.currentTenantSubject.value;\n }\n get tenants$() {\n return from(this.tenantLoader.getList(this.getContext()));\n }\n get application() {\n const session = this.getSessionData();\n if (session?.application && !this.currentApplicationSubject.value) {\n this.currentApplicationSubject.next(session.application);\n }\n return this.currentApplicationSubject.value;\n }\n get applications$() {\n return from(this.applicationLoader.getList(this.getContext()));\n }\n get permissions() {\n return this.permissionsSubject.value ?? [];\n }\n get features() {\n return this.featuresSubject.value ?? [];\n }\n async restoreSession() {\n this.isLoading.next(true);\n try {\n const sessionData = this.getSessionData();\n if (sessionData) {\n if (sessionData.user) {\n this.currentUserSubject.next(sessionData.user);\n // Restore tenant and application from session data\n if (sessionData.tenant) {\n this.currentTenantSubject.next(sessionData.tenant);\n }\n if (sessionData.application) {\n this.currentApplicationSubject.next(sessionData.application);\n }\n this.status.next(AXPSessionStatus.Authenticated);\n // Load required modules first to ensure entities are available for loaders\n // This is critical because loaders (like application.loader) need entities\n // from required modules (ApplicationManagement, TenantManagement, SecurityManagement)\n await this.getModuleProviderLoader().loadRequiredModules();\n await this.loadPermissions();\n await this.loadFeatures();\n await this.signInComplete();\n }\n }\n else {\n this.status.next(AXPSessionStatus.Unauthorized);\n }\n }\n catch (error) {\n this.status.next(AXPSessionStatus.Unauthorized);\n }\n finally {\n this.isLoading.next(false);\n }\n }\n async signin(credentials) {\n this.isLoading.next(true);\n try {\n //\n // this.clearSession();\n //\n const strategy = this.authStrategyRegistry.get(credentials.strategy);\n if (!strategy) {\n throw new Error(`Authentication strategy '${credentials.strategy}' is not supported`);\n }\n const result = await strategy.signin(credentials);\n if (!result)\n return;\n if (result?.succeed) {\n this.currentUserSubject.next(result.data.user);\n this.setSession({\n accessToken: result.data.accessToken,\n refreshToken: result.data.refreshToken,\n strategy: credentials.strategy,\n user: result.data.user,\n application: result.data?.application,\n tenant: result.data?.tenant,\n expiresIn: result.data?.expiresIn,\n idToken: result.data?.idToken ?? null,\n });\n }\n else {\n this.status.next(AXPSessionStatus.Unauthenticated);\n throw new Error(`Invalid Username or Password`);\n }\n }\n catch (error) {\n console.error('Signin error:', error);\n this.status.next(AXPSessionStatus.Unauthenticated);\n throw error;\n }\n finally {\n this.isLoading.next(false);\n console.log('Signin process completed');\n }\n }\n async updateToken(params) {\n this.isLoading.next(true);\n try {\n const strategyName = this.getSessionData()?.strategy;\n if (!strategyName) {\n throw new Error('Strategy not found');\n }\n const strategy = this.authStrategyRegistry.get(strategyName);\n if (!strategy) {\n throw new Error(`Authentication strategy '${this.getSessionData()?.strategy}' is not supported`);\n }\n const result = await strategy.updateToken(params);\n if (result?.succeed) {\n this.currentUserSubject.next(result.data.user);\n this.setSession({\n accessToken: result.data.accessToken,\n refreshToken: result.data.refreshToken,\n strategy: strategyName,\n user: result.data.user,\n application: result.data?.application,\n tenant: result.data?.tenant,\n expiresIn: result.data?.expiresIn,\n idToken: result.data?.idToken ?? null,\n });\n this.status.next(AXPSessionStatus.Authenticated);\n // If we have both tenant and application, complete the sign-in\n if (this.application && this.tenant) {\n await this.restoreSession();\n }\n }\n else {\n this.status.next(AXPSessionStatus.Unauthenticated);\n throw new Error(`Invalid Username or Password`);\n }\n }\n catch (error) {\n console.error('Update token error:', error);\n throw error;\n }\n finally {\n this.isLoading.next(false);\n console.log('Update token process completed');\n }\n }\n async signout() {\n console.log('Signing out...');\n this.isLoading.next(true);\n try {\n const sessionData = this.getSessionData();\n if (sessionData?.strategy) {\n const strategy = this.authStrategyRegistry.get(sessionData?.strategy);\n if (strategy) {\n try {\n await strategy.signout();\n }\n catch (error) { }\n }\n }\n //\n const userId = this.user?.id;\n // Clear module provider loader cache before clearing session\n // This ensures modules and providers from previous user are not cached\n await this.getModuleProviderLoader().clear();\n this.clearSession();\n this.eventService.publish(AXPSessionStatus.SignedOut, { id: userId });\n this.isLoading.next(false);\n this.status.next(AXPSessionStatus.SignedOut);\n }\n finally {\n this.isLoading.next(false);\n }\n }\n async refreshToken() {\n console.log('Refreshing token...');\n return new Promise(async (resolve, reject) => {\n const sessionData = this.getSessionData();\n if (!sessionData || !sessionData?.refreshToken) {\n console.log('No session data or refresh token found');\n reject(new Error('No refresh token available'));\n return;\n }\n const strategy = this.authStrategyRegistry.get(sessionData.strategy);\n if (!strategy) {\n console.error('Authentication strategy not found:', sessionData.strategy);\n reject(new Error(`Authentication strategy '${sessionData.strategy}' is not found`));\n return;\n }\n try {\n const result = await strategy.refreshToken(this.getContext());\n if (result.succeed) {\n console.log('Token refresh successful');\n this.setSession(result.data);\n resolve(result.data?.accessToken);\n }\n else {\n console.error('Token refresh failed');\n this.clearSession();\n this.status.next(AXPSessionStatus.Expired);\n reject(new Error('Token refresh failed'));\n }\n }\n catch (error) {\n console.error('Error during token refresh:', error);\n this.clearSession();\n this.status.next(AXPSessionStatus.Expired);\n reject(error);\n }\n });\n }\n async loadPermissions() {\n try {\n const permissions = await this.permissionLoader.getList(this.getContext());\n this.permissionsSubject.next(permissions ?? []);\n }\n catch (error) {\n console.error('Error loading permissions:', error);\n this.permissionsSubject.next([]);\n }\n }\n async loadFeatures() {\n try {\n const features = await this.featureLoader.getList(this.getContext());\n this.featuresSubject.next(features ?? []);\n }\n catch (error) {\n console.error('Error loading features:', error);\n this.featuresSubject.next([]);\n }\n }\n async signInComplete() {\n // Ensure we have the required data\n if (!this.user) {\n this.status.next(AXPSessionStatus.Unauthenticated);\n return;\n }\n // Set status to Authorized\n this.status.next(AXPSessionStatus.Authorized);\n // Double-check the status was set correctly\n setTimeout(() => {\n console.log('Status after timeout:', this.status.value);\n }, 100);\n }\n setSession(tokens) {\n const sessionData = {\n accessToken: tokens.accessToken,\n refreshToken: tokens.refreshToken,\n strategy: tokens.strategy,\n user: tokens.user,\n application: tokens.application,\n tenant: tokens.tenant,\n expiresIn: tokens.expiresIn,\n idToken: tokens.idToken,\n };\n // Update subjects\n if (tokens.user) {\n this.currentUserSubject.next(tokens.user);\n }\n if (tokens.tenant) {\n this.currentTenantSubject.next(tokens.tenant);\n }\n if (tokens.application) {\n this.currentApplicationSubject.next(tokens.application);\n }\n localStorage.setItem(AXPSessionService.SESSION_KEY, JSON.stringify(sessionData));\n }\n setStrategy(strategy) {\n const sessionData = this.getSessionData();\n const newSessionData = { ...sessionData, strategy };\n this.setSession(newSessionData);\n }\n getSessionData() {\n try {\n const sessionDataString = localStorage.getItem(AXPSessionService.SESSION_KEY);\n if (sessionDataString) {\n const sessionData = JSON.parse(sessionDataString);\n return sessionData;\n }\n else {\n return null;\n }\n }\n catch (error) {\n localStorage.removeItem(AXPSessionService.SESSION_KEY);\n return null;\n }\n }\n clearSession() {\n //\n this.currentUserSubject.next(null);\n //\n this.currentTenantSubject.next(null);\n //\n this.currentApplicationSubject.next(null);\n //\n this.permissionsSubject.next([]);\n //\n this.featuresSubject.next([]);\n //\n localStorage.removeItem(AXPSessionService.SESSION_KEY);\n }\n authorize(...keys) {\n // Calculate base result\n const baseResult = keys.every((k) => {\n if (isEmpty(k))\n return true;\n // Check if user has the permission\n const hasPermission = this.permissions.indexOf(k) > -1;\n if (!hasPermission)\n return false;\n // Check if permission has required features (if permission definition service is available)\n // Note: This is a lightweight check. Full feature validation happens in permission definition service.\n return true;\n });\n // If permission checker is provided, use it to potentially override the result\n if (this.permissionChecker) {\n const context = this.getContext();\n return this.permissionChecker.check(keys, context, baseResult);\n }\n return baseResult;\n }\n isFeatureEnabled(...keys) {\n // Calculate base result\n const baseResult = keys.every((k) => isEmpty(k) || this.features.some((c) => c.name == k && c.value == true));\n // If feature checker is provided, use it to potentially override the result\n if (this.featureChecker) {\n const context = this.getContext();\n return this.featureChecker.check(keys, context, baseResult);\n }\n return baseResult;\n }\n getToken() {\n const sessionData = this.getSessionData();\n return sessionData?.accessToken;\n }\n getContext() {\n return new AXPSessionContext({\n user: this.user,\n tenant: this.tenant,\n application: this.application,\n });\n }\n static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: \"12.0.0\", version: \"20.3.12\", ngImport: i0, type: AXPSessionService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }\n static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: \"12.0.0\", version: \"20.3.12\", ngImport: i0, type: AXPSessionService, providedIn: 'root' }); }\n}\ni0.ɵɵngDeclareClassMetadata({ minVersion: \"12.0.0\", version: \"20.3.12\", ngImport: i0, type: AXPSessionService, decorators: [{\n type: Injectable,\n args: [{\n providedIn: 'root',\n }]\n }] });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2Vzc2lvbi5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9wbGF0Zm9ybS9hdXRoL3NyYy9saWIvc2Vzc2lvbi5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSx3QkFBd0IsRUFBRSwwQkFBMEIsRUFBNEIsTUFBTSx1QkFBdUIsQ0FBQztBQUN2SCxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDN0QsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUNwQyxPQUFPLEVBQUUsZUFBZSxFQUFjLGNBQWMsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRSxXQUFXLEVBQUUsU0FBUyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQzlHLE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLGtDQUFrQyxDQUFDO0FBRTFFLE9BQU8sRUFBRSw4QkFBOEIsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBRXpFLE9BQU8sRUFBYyxrQkFBa0IsRUFBRSxtQkFBbUIsRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUNoRixPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUN2RSxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSx1Q0FBdUMsQ0FBQztBQUUvRSxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUN0RSxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQzs7QUFPM0QsTUFBTSxPQUFPLGlCQUFpQjtJQUg5QjtRQUlVLGlCQUFZLEdBQUcsTUFBTSxDQUFDLHdCQUF3QixDQUFDLENBQUM7UUFFaEQseUJBQW9CLEdBQUcsTUFBTSxDQUFDLDhCQUE4QixDQUFDLENBQUM7UUFDckQsYUFBUSxHQUFHLE1BQU0sQ0FBQyxR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Q3BCLENBQUM7SUFFTSxRQUFRO1FBQ2IsTUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO1FBRTFDLE9BQU8sV0FBVyxFQUFFLFdBQVcsQ0FBQztJQUNsQyxDQUFDO0lBRU0sVUFBVTtRQUNmLE9BQU8sSUFBSSxpQkFBaUIsQ0FBQztZQUMzQixJQUFJLEVBQUUsSUFBSSxDQUFDLElBQUk7WUFDZixNQUFNLEVBQUUsSUFBSSxDQUFDLE1BQU07WUFDbkIsV0FBVyxFQUFFLElBQUksQ0FBQyxXQUFXO1NBQzlCLENBQUMsQ0FBQztJQUNMLENBQUM7K0dBeGJVLGlCQUFpQjttSEFBakIsaUJBQWlCLGNBRmhCLE1BQU07OzRGQUVQLGlCQUFpQjtrQkFIN0IsVUFBVTttQkFBQztvQkFDVixVQUFVLEVBQUUsTUFBTTtpQkFDbkIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBBWFBCcm9hZGNhc3RFdmVudFNlcnZpY2UsIEFYUF9NT0RVTEVfUFJPVklERVJfTE9BREVSLCBBWFBJTW9kdWxlUHJvdmlkZXJMb2FkZXIgfSBmcm9tICdAYWNvcmV4L3BsYXRmb3JtL2NvcmUnO1xuaW1wb3J0IHsgSW5qZWN0YWJsZSwgaW5qZWN0LCBJbmplY3RvciB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgaXNFbXB0eSB9IGZyb20gJ2xvZGFzaC1lcyc7XG5pbXBvcnQgeyBCZWhhdmlvclN1YmplY3QsIE9ic2VydmFibGUsIGRlZmF1bHRJZkVtcHR5LCBmaWx0ZXIsIGZyb20sIG1hcCwgc2hhcmVSZXBsYXksIHN3aXRjaE1hcCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgQVhQX0FQUExJQ0FUSU9OX0xPQURFUiB9IGZyb20gJy4vYXBwbGljYXRpb24vYXBwbGljYXRpb24ubG9hZGVyJztcbmltcG9ydCB7IEFYUEFwcGxpY2F0aW9uIH0gZnJvbSAnLi9hcHBsaWNhdGlvbi9hcHBsaWNhdGlvbi50eXBlcyc7XG5pbXBvcnQgeyBBWFBBdXRoU3RyYXRlZ3lSZWdpc3RyeVNlcnZpY2UgfSBmcm9tICcuL2F1dGgtcmVnaXN0cnkuc2VydmljZSc7XG5pbXBvcnQgeyBBWFBCYXNlQ3JlZGVudGlhbHMsIEFYUFNlc3Npb25EYXRhIH0gZnJvbSAnLi9hdXRoLnN0cmF0ZWd5JztcbmltcG9ydCB7IEFYUEZlYXR1cmUsIEFYUF9GRUFUVVJFX0xPQURFUiwgQVhQX0ZFQVRVUkVfQ0hFQ0tFUiB9IGZyb20gJy4vZmVhdHVyZSc7XG5pbXBvcnQgeyBBWFBfUEVSTUlTU0lPTl9MT0FERVIgfSBmcm9tICcuL3Blcm1pc3Npb24vcGVybWlzc2lvbi5sb2FkZXInO1xuaW1wb3J0IHsgQVhQX1BFUk1JU1NJT05fQ0hFQ0tFUiB9IGZyb20gJy4vcGVybWlzc2lvbi9wZXJtaXNzaW9uLWNoZWNrZXIudG9rZW4nO1xuaW1wb3J0IHsgQVhQUGVybWlzc2lvbiB9IGZyb20gJy4vcGVybWlzc2lvbi9wZXJtaXNzaW9uLnR5cGVzJztcbmltcG9ydCB7IEFYUFNlc3Npb25Db250ZXh0LCBBWFBTZXNzaW9uU3RhdHVzIH0gZnJvbSAnLi9zZXNzaW9uLnR5cGVzJztcbmltcG9ydCB7IEFYUF9URU5BTlRfTE9BREVSIH0gZnJvbSAnLi90ZW5hbnQvdGVuYW50LmxvYWRlcic7XG5pbXBvcnQgeyBBWFBUZW5hbnQgfSBmcm9tICcuL3RlbmFudC90ZW5hbnQudHlwZXMnO1xuaW1wb3J0IHsgQVhQVXNlciB9IGZyb20gJy4vdXNlci91c2VyLnR5cGVzJztcblxuQEluamVjdGFibGUoe1xuICBwcm92aWRlZEluOiAncm9vdCcsXG59KVxuZXhwb3J0IGNsYXNzIEFYUFNlc3Npb25TZXJ2aWNlIHtcbiAgcHJpdmF0ZSBldmVudFNlcnZpY2UgPSBpbmplY3QoQVhQQnJvYWRjYXN0RXZlbnRTZXJ2aWNlKTtcblxuICBwcml2YXRlIGF1dGhTdHJhdGVneVJlZ2lzdHJ5ID0gaW5qZWN0KEFYUEF1dGhTdHJhdGVneVJlZ2lzdHJ5U2VydmljZSk7XG4gIHByaXZhdGUgcmVhZG9ubHkgaW5qZWN0b3IgPSBpbmplY3QoSW5qZWN0b3IpO1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFNFU1NJT05fS0VZID0gJ0FYUF9TRVNTSU9OJztcblxuICBwcml2YXRlIHJlYWRvbmx5IHBlcm1pc3Npb25Mb2FkZXIgPSBpbmplY3QoQVhQX1BFUk1JU1NJT05fTE9BREVSKTtcbiAgcHJpdmF0ZSByZWFkb25seSBmZWF0dXJlTG9hZGVyID0gaW5qZWN0KEFYUF9GRUFUVVJFX0xPQURFUik7XG4gIHByaXZhdGUgcmVhZG9ubHkgdGVuYW50TG9hZGVyID0gaW5qZWN0KEFYUF9URU5BTlRfTE9BREVSKTtcbiAgcHJpdmF0ZSByZWFkb25seSBhcHBsaWNhdGlvbkxvYWRlciA9IGluamVjdChBWFBfQVBQTElDQVRJT05fTE9BREVSKTtcbiAgcHJpdmF0ZSByZWFkb25seSBwZXJtaXNzaW9uQ2hlY2tlciA9IGluamVjdChBWFBfUEVSTUlTU0lPTl9DSEVDS0VSLCB7IG9wdGlvbmFsOiB0cnVlIH0pO1xuICBwcml2YXRlIHJlYWRvbmx5IGZlYXR1cmVDaGVja2VyID0gaW5qZWN0KEFYUF9GRUFUVVJFX0NIRUNLRVIsIHsgb3B0aW9uYWw6IHRydWUgfSk7XG5cbiAgLyoqXG4gICAqIEdldCBtb2R1bGUgcHJvdmlkZXIgbG9hZGVyIGxhemlseSB0byBhdm9pZCBjaXJjdWxhciBkZXBlbmRlbmN5LlxuICAgKiBNb2R1bGVQcm92aWRlckxvYWRlciBkZXBlbmRzIG9uIEFYUFNlc3Npb25TZXJ2aWNlLCB3aGljaCBpcyB0aGlzIHNlcnZpY2UuXG4gICAqL1xuICBwcml2YXRlIGdldE1vZHVsZVByb3ZpZGVyTG9hZGVyKCk6IEFYUElNb2R1bGVQcm92aWRlckxvYWRlciB7XG4gICAgcmV0dXJuIHRoaXMuaW5qZWN0b3IuZ2V0KEFYUF9NT0RVTEVfUFJPVklERVJfTE9BREVSKTtcbiAgfVxuXG4gIHByaXZhdGUgc3RhdHVzID0gbmV3IEJlaGF2aW9yU3ViamVjdDxBWFBTZXNzaW9uU3RhdHVzPihBWFBTZXNzaW9uU3RhdHVzLlVuYXV0aGVudGljYXRlZCk7XG4gIHB1YmxpYyByZWFkb25seSBzdGF0dXMkID0gdGhpcy5zdGF0dXMuYXNPYnNlcnZhYmxlKCkucGlwZShzaGFyZVJlcGxheSgxKSk7XG5cbiAgLy8gQWRkIGxvYWRpbmcgc3RhdGUgdG8gcHJldmVudCBwcmVtYXR1cmUgcmVkaXJlY3RzXG4gIHByaXZhdGUgaXNMb2FkaW5nID0gbmV3IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPih0cnVlKTtcbiAgcHVibGljIHJlYWRvbmx5IGlzTG9hZGluZyQgPSB0aGlzLmlzTG9hZGluZy5hc09ic2VydmFibGUoKS5waXBlKHNoYXJlUmVwbGF5KDEpKTtcblxuICBwcml2YXRlIGN1cnJlbnRVc2VyU3ViamVjdCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8QVhQVXNlciB8IG51bGw+KG51bGwpO1xuICBwdWJsaWMgcmVhZG9ubHkgdXNlciQgPSB0aGlzLmN1cnJlbnRVc2VyU3ViamVjdC5hc09ic2VydmFibGUoKS5waXBlKHNoYXJlUmVwbGF5KDEpKTtcbiAgcHVibGljIGdldCB1c2VyKCk6IEFYUFVzZXIgfCBudWxsIHtcbiAgICBjb25zdCBzZXNzaW9uID0gdGhpcy5nZXRTZXNzaW9uRGF0YSgpO1xuICAgIGlmIChzZXNzaW9uPy51c2VyICYmICF0aGlzLmN1cnJlbnRVc2VyU3ViamVjdC52YWx1ZSkge1xuICAgICAgdGhpcy5jdXJyZW50VXNlclN1YmplY3QubmV4dChzZXNzaW9uLnVzZXIpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5jdXJyZW50VXNlclN1YmplY3QudmFsdWU7XG4gIH1cblxuICBwcml2YXRlIGN1cnJlbnRUZW5hbnRTdWJqZWN0ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxBWFBUZW5hbnQgfCBudWxsPihudWxsKTtcbiAgcHVibGljIHJlYWRvbmx5IHRlbmFudCQgPSB0aGlzLmN1cnJlbnRUZW5hbnRTdWJqZWN0LmFzT2JzZXJ2YWJsZSgpLnBpcGUoc2hhcmVSZXBsYXkoMSkpO1xuICBwdWJsaWMgZ2V0IHRlbmFudCgpOiBBWFBUZW5hbnQgfCBudWxsIHtcbiAgICBjb25zdCBzZXNzaW9uID0gdGhpcy5nZXRTZXNzaW9uRGF0YSgpO1xuICAgIGlmIChzZXNzaW9uPy50ZW5hbnQgJiYgIXRoaXMuY3VycmVudFRlbmFudFN1YmplY3QudmFsdWUpIHtcbiAgICAgIHRoaXMuY3VycmVudFRlbmFudFN1YmplY3QubmV4dChzZXNzaW9uLnRlbmFudCk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmN1cnJlbnRUZW5hbnRTdWJqZWN0LnZhbHVlO1xuICB9XG5cbiAgcHVibGljIGdldCB0ZW5hbnRzJCgpOiBPYnNlcnZhYmxlPEFYUFRlbmFudFtdPiB7XG4gICAgcmV0dXJuIGZyb20odGhpcy50ZW5hbnRMb2FkZXIuZ2V0TGlzdCh0aGlzLmdldENvbnRleHQoKSkpO1xuICB9XG5cbiAgcHJpdmF0ZSBjdXJyZW50QXBwbGljYXRpb25TdWJqZWN0ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxBWFBBcHBsaWNhdGlvbiB8IG51bGw+KG51bGwpO1xuICBwdWJsaWMgcmVhZG9ubHkgYXBwbGljYXRpb24kID0gdGhpcy5jdXJyZW50QXBwbGljYXRpb25TdWJqZWN0LmFzT2JzZXJ2YWJsZSgpLnBpcGUoc2hhcmVSZXBsYXkoMSkpO1xuICBwdWJsaWMgZ2V0IGFwcGxpY2F0aW9uKCk6IEFYUEFwcGxpY2F0aW9uIHwgbnVsbCB7XG4gICAgY29uc3Qgc2Vzc2lvbiA9IHRoaXMuZ2V0U2Vzc2lvbkRhdGEoKTtcbiAgICBpZiAoc2Vzc2lvbj8uYXBwbGljYXRpb24gJiYgIXRoaXMuY3VycmVudEFwcGxpY2F0aW9uU3ViamVjdC52YWx1ZSkge1xuICAgICAgdGhpcy5jdXJyZW50QXBwbGljYXRpb25TdWJqZWN0Lm5leHQoc2Vzc2lvbi5hcHBsaWNhdGlvbik7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmN1cnJlbnRBcHBsaWNhdGlvblN1YmplY3QudmFsdWU7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGFwcGxpY2F0aW9ucyQoKTogT2JzZXJ2YWJsZTxBWFBBcHBsaWNhdGlvbltdPiB7XG4gICAgcmV0dXJuIGZyb20odGhpcy5hcHBsaWNhdGlvbkxvYWRlci5nZXRMaXN0KHRoaXMuZ2V0Q29udGV4dCgpKSk7XG4gIH1cblxuICBwcml2YXRlIHBlcm1pc3Npb25zU3ViamVjdCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8QVhQUGVybWlzc2lvbltdPihbXSk7XG4gIHB1YmxpYyByZWFkb25seSBwZXJtaXNzaW9ucyQgPSB0aGlzLnBlcm1pc3Npb25zU3ViamVjdC5hc09ic2VydmFibGUoKS5waXBlKHNoYXJlUmVwbGF5KDEpLCBkZWZhdWx0SWZFbXB0eShbXSkpO1xuICBwdWJsaWMgZ2V0IHBlcm1pc3Npb25zKCk6IEFYUFBlcm1pc3Npb25bXSB7XG4gICAgcmV0dXJuIHRoaXMucGVybWlzc2lvbnNTdWJqZWN0LnZhbHVlID8/IFtdO1xuICB9XG5cbiAgcHJpdmF0ZSBmZWF0dXJlc1N1YmplY3QgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PEFYUEZlYXR1cmVbXT4oW10pO1xuICBwdWJsaWMgcmVhZG9ubHkgZmVhdHVyZXMkID0gdGhpcy5mZWF0dXJlc1N1YmplY3QuYXNPYnNlcnZhYmxlKCkucGlwZShzaGFyZVJlcGxheSgxKSwgZGVmYXVsdElmRW1wdHkoW10pKTtcbiAgcHVibGljIGdldCBmZWF0dXJlcygpOiBBWFBGZWF0dXJlW10ge1xuICAgIHJldHVybiB0aGlzLmZlYXR1cmVzU3ViamVjdC52YWx1ZSA/PyBbXTtcbiAgfVxuXG4gIHB1YmxpYyByZWFkb25seSBpc0F1dGhlbnRpY2F0ZWQkID0gdGhpcy5zdGF0dXMkLnBpcGUoXG4gICAgbWFwKChzdGF0dXMpID0+IHtcbiAgICAgIGNvbnN0IGlzQXV0aCA9IHN0YXR1cyA9PT0gQVhQU2Vzc2lvblN0YXR1cy5BdXRoZW50aWNhdGVkIHx8IHN0YXR1cyA9PT0gQVhQU2Vzc2lvblN0YXR1cy5BdXRob3JpemVkO1xuICAgICAgcmV0dXJuIGlzQXV0aDtcbiAgICB9KSxcbiAgICBzaGFyZVJlcGxheSgxKSxcbiAgKTtcblxuICAvLyBBZGQgYSBuZXcgb2JzZXJ2YWJsZSB0aGF0IGNvbnNpZGVycyBsb2FkaW5nIHN0YXRlXG4gIHB1YmxpYyByZWFkb25seSBpc0F1dGhlbnRpY2F0ZWRXaXRoTG9hZGluZyQgPSB0aGlzLmlzTG9hZGluZyQucGlwZShcbiAgICBzd2l0Y2hNYXAoKGxvYWRpbmcpID0+IHtcbiAgICAgIGlmIChsb2FkaW5nKSB7XG4gICAgICAgIC8vIFdhaXQgZm9yIGxvYWRpbmcgdG8gY29tcGxldGUsIHRoZW4gcmV0dXJuIGF1dGhlbnRpY2F0aW9uIHN0YXR1c1xuICAgICAgICByZXR1cm4gdGhpcy5pc0xvYWRpbmckLnBpcGUoXG4gICAgICAgICAgZmlsdGVyKChpc0xvYWRpbmcpID0+ICFpc0xvYWRpbmcpLFxuICAgICAgICAgIHN3aXRjaE1hcCgoKSA9PiB0aGlzLmlzQXV0aGVudGljYXRlZCQpLFxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgLy8gSWYgbm90IGxvYWRpbmcsIHJldHVybiBjdXJyZW50IGF1dGhlbnRpY2F0aW9uIHN0YXR1c1xuICAgICAgcmV0dXJuIHRoaXMuaXNBdXRoZW50aWNhdGVkJDtcbiAgICB9KSxcbiAgICBzaGFyZVJlcGxheSgxKSxcbiAgKTtcblxuICBwdWJsaWMgcmVhZG9ubHkgaXNBdXRob3JpemVkJCA9IHRoaXMuc3RhdHVzJC5waXBlKFxuICAgIG1hcCgoc3RhdHVzKSA9PiBzdGF0dXMgPT09IEFYUFNlc3Npb25TdGF0dXMuQXV0aG9yaXplZCksXG4gICAgc2hhcmVSZXBsYXkoMSksXG4gICk7XG5cbiAgcHVibGljIGFzeW5jIHJlc3RvcmVTZXNzaW9uKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRoaXMuaXNMb2FkaW5nLm5leHQodHJ1ZSk7XG5cbiAgICB0cnkge1xuICAgICAgY29uc3Qgc2Vzc2lvbkRhdGEgPSB0aGlzLmdldFNlc3Npb25EYXRhKCk7XG4gICAgICBpZiAoc2Vzc2lvbkRhdGEpIHtcbiAgICAgICAgaWYgKHNlc3Npb25EYXRhLnVzZXIpIHtcbiAgICAgICAgICB0aGlzLmN1cnJlbnRVc2VyU3ViamVjdC5uZXh0KHNlc3Npb25EYXRhLnVzZXIpO1xuXG4gICAgICAgICAgLy8gUmVzdG9yZSB0ZW5hbnQgYW5kIGFwcGxpY2F0aW9uIGZyb20gc2Vzc2lvbiBkYXRhXG4gICAgICAgICAgaWYgKHNlc3Npb25EYXRhLnRlbmFudCkge1xuICAgICAgICAgICAgdGhpcy5jdXJyZW50VGVuYW50U3ViamVjdC5uZXh0KHNlc3Npb25EYXRhLnRlbmFudCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChzZXNzaW9uRGF0YS5hcHBsaWNhdGlvbikge1xuICAgICAgICAgICAgdGhpcy5jdXJyZW50QXBwbGljYXRpb25TdWJqZWN0Lm5leHQoc2Vzc2lvbkRhdGEuYXBwbGljYXRpb24pO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHRoaXMuc3RhdHVzLm5leHQoQVhQU2Vzc2lvblN0YXR1cy5BdXRoZW50aWNhdGVkKTtcblxuICAgICAgICAgIC8vIExvYWQgcmVxdWlyZWQgbW9kdWxlcyBmaXJzdCB0byBlbnN1cmUgZW50aXRpZXMgYXJlIGF2YWlsYWJsZSBmb3IgbG9hZGVyc1xuICAgICAgICAgIC8vIFRoaXMgaXMgY3JpdGljYWwgYmVjYXVzZSBsb2FkZXJzIChsaWtlIGFwcGxpY2F0aW9uLmxvYWRlcikgbmVlZCBlbnRpdGllc1xuICAgICAgICAgIC8vIGZyb20gcmVxdWlyZWQgbW9kdWxlcyAoQXBwbGljYXRpb25NYW5hZ2VtZW50LCBUZW5hbnRNYW5hZ2VtZW50LCBTZWN1cml0eU1hbmFnZW1lbnQpXG4gICAgICAgICAgYXdhaXQgdGhpcy5nZXRNb2R1bGVQcm92aWRlckxvYWRlcigpLmxvYWRSZXF1aXJlZE1vZHVsZXMoKTtcblxuICAgICAgICAgIGF3YWl0IHRoaXMubG9hZFBlcm1pc3Npb25zKCk7XG4gICAgICAgICAgYXdhaXQgdGhpcy5sb2FkRmVhdHVyZXMoKTtcbiAgICAgICAgICBhd2FpdCB0aGlzLnNpZ25JbkNvbXBsZXRlKCk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuc3RhdHVzLm5leHQoQVhQU2Vzc2lvblN0YXR1cy5VbmF1dGhvcml6ZWQpO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICB0aGlzLnN0YXR1cy5uZXh0KEFYUFNlc3Npb25TdGF0dXMuVW5hdXRob3JpemVkKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgdGhpcy5pc0xvYWRpbmcubmV4dChmYWxzZSk7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgc2lnbmluKGNyZWRlbnRpYWxzOiBBWFBCYXNlQ3JlZGVudGlhbHMpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0aGlzLmlzTG9hZGluZy5uZXh0KHRydWUpO1xuICAgIHRyeSB7XG4gICAgICAvL1xuICAgICAgLy8gdGhpcy5jbGVhclNlc3Npb24oKTtcbiAgICAgIC8vXG4gICAgICBjb25zdCBzdHJhdGVneSA9IHRoaXMuYXV0aFN0cmF0ZWd5UmVnaXN0cnkuZ2V0KGNyZWRlbnRpYWxzLnN0cmF0ZWd5KTtcbiAgICAgIGlmICghc3RyYXRlZ3kpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBBdXRoZW50aWNhdGlvbiBzdHJhdGVneSAnJHtjcmVkZW50aWFscy5zdHJhdGVneX0nIGlzIG5vdCBzdXBwb3J0ZWRgKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHN0cmF0ZWd5LnNpZ25pbihjcmVkZW50aWFscyk7XG4gICAgICBpZiAoIXJlc3VsdCkgcmV0dXJuO1xuICAgICAgaWYgKHJlc3VsdD8uc3VjY2VlZCkge1xuICAgICAgICB0aGlzLmN1cnJlbnRVc2VyU3ViamVjdC5uZXh0KHJlc3VsdC5kYXRhIS51c2VyKTtcbiAgICAgICAgdGhpcy5zZXRTZXNzaW9uKHtcbiAgICAgICAgICBhY2Nlc3NUb2tlbjogcmVzdWx0LmRhdGEhLmFjY2Vzc1Rva2VuLFxuICAgICAgICAgIHJlZnJlc2hUb2tlbjogcmVzdWx0LmRhdGEhLnJlZnJlc2hUb2tlbixcbiAgICAgICAgICBzdHJhdGVneTogY3JlZGVudGlhbHMuc3RyYXRlZ3ksXG4gICAgICAgICAgdXNlcjogcmVzdWx0LmRhdGEhLnVzZXIsXG4gICAgICAgICAgYXBwbGljYXRpb246IHJlc3VsdC5kYXRhPy5hcHBsaWNhdGlvbixcbiAgICAgICAgICB0ZW5hbnQ6IHJlc3VsdC5kYXRhPy50ZW5hbnQsXG4gICAgICAgICAgZXhwaXJlc0luOiByZXN1bHQuZGF0YT8uZXhwaXJlc0luLFxuICAgICAgICAgIGlkVG9rZW46IHJlc3VsdC5kYXRhPy5pZFRva2VuID8/IG51bGwsXG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5zdGF0dXMubmV4dChBWFBTZXNzaW9uU3RhdHVzLlVuYXV0aGVudGljYXRlZCk7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBVc2VybmFtZSBvciBQYXNzd29yZGApO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zb2xlLmVycm9yKCdTaWduaW4gZXJyb3I6JywgZXJyb3IpO1xuICAgICAgdGhpcy5zdGF0dXMubmV4dChBWFBTZXNzaW9uU3RhdHVzLlVuYXV0aGVudGljYXRlZCk7XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgdGhpcy5pc0xvYWRpbmcubmV4dChmYWxzZSk7XG4gICAgICBjb25zb2xlLmxvZygnU2lnbmluIHByb2Nlc3MgY29tcGxldGVkJyk7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgdXBkYXRlVG9rZW4ocGFyYW1zPzogeyBba2V5OiBzdHJpbmddOiBhbnkgfSk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRoaXMuaXNMb2FkaW5nLm5leHQodHJ1ZSk7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHN0cmF0ZWd5TmFtZSA9IHRoaXMuZ2V0U2Vzc2lvbkRhdGEoKT8uc3RyYXRlZ3khO1xuICAgICAgaWYgKCFzdHJhdGVneU5hbWUpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdTdHJhdGVneSBub3QgZm91bmQnKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHN0cmF0ZWd5ID0gdGhpcy5hdXRoU3RyYXRlZ3lSZWdpc3RyeS5nZXQoc3RyYXRlZ3lOYW1lKTtcbiAgICAgIGlmICghc3RyYXRlZ3kpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBBdXRoZW50aWNhdGlvbiBzdHJhdGVneSAnJHt0aGlzLmdldFNlc3Npb25EYXRhKCk/LnN0cmF0ZWd5fScgaXMgbm90IHN1cHBvcnRlZGApO1xuICAgICAgfVxuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgc3RyYXRlZ3kudXBkYXRlVG9rZW4ocGFyYW1zKTtcbiAgICAgIGlmIChyZXN1bHQ/LnN1Y2NlZWQpIHtcbiAgICAgICAgdGhpcy5jdXJyZW50VXNlclN1YmplY3QubmV4dChyZXN1bHQuZGF0YSEudXNlcik7XG4gICAgICAgIHRoaXMuc2V0U2Vzc2lvbih7XG4gICAgICAgICAgYWNjZXNzVG9rZW46IHJlc3VsdC5kYXRhIS5hY2Nlc3NUb2tlbixcbiAgICAgICAgICByZWZyZXNoVG9rZW46IHJlc3VsdC5kYXRhIS5yZWZyZXNoVG9rZW4sXG4gICAgICAgICAgc3RyYXRlZ3k6IHN0cmF0ZWd5TmFtZSxcbiAgICAgICAgICB1c2VyOiByZXN1bHQuZGF0YSEudXNlcixcbiAgICAgICAgICBhcHBsaWNhdGlvbjogcmVzdWx0LmRhdGE/LmFwcGxpY2F0aW9uLFxuICAgICAgICAgIHRlbmFudDogcmVzdWx0LmRhdGE/LnRlbmFudCxcbiAgICAgICAgICBleHBpcmVzSW46IHJlc3VsdC5kYXRhPy5leHBpcmVzSW4sXG4gICAgICAgICAgaWRUb2tlbjogcmVzdWx0LmRhdGE/LmlkVG9rZW4gPz8gbnVsbCxcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuc3RhdHVzLm5leHQoQVhQU2Vzc2lvblN0YXR1cy5BdXRoZW50aWNhdGVkKTtcblxuICAgICAgICAvLyBJZiB3ZSBoYXZlIGJvdGggdGVuYW50IGFuZCBhcHBsaWNhdGlvbiwgY29tcGxldGUgdGhlIHNpZ24taW5cbiAgICAgICAgaWYgKHRoaXMuYXBwbGljYXRpb24gJiYgdGhpcy50ZW5hbnQpIHtcbiAgICAgICAgICBhd2FpdCB0aGlzLnJlc3RvcmVTZXNzaW9uKCk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuc3RhdHVzLm5leHQoQVhQU2Vzc2lvblN0YXR1cy5VbmF1dGhlbnRpY2F0ZWQpO1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgVXNlcm5hbWUgb3IgUGFzc3dvcmRgKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc29sZS5lcnJvcignVXBkYXRlIHRva2VuIGVycm9yOicsIGVycm9yKTtcbiAgICAgIHRocm93IGVycm9yO1xuICAgIH0gZmluYWxseSB7XG4gICAgICB0aGlzLmlzTG9hZGluZy5uZXh0KGZhbHNlKTtcbiAgICAgIGNvbnNvbGUubG9nKCdVcGRhdGUgdG9rZW4gcHJvY2VzcyBjb21wbGV0ZWQnKTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBzaWdub3V0KCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnNvbGUubG9nKCdTaWduaW5nIG91dC4uLicpO1xuICAgIHRoaXMuaXNMb2FkaW5nLm5leHQodHJ1ZSk7XG5cbiAgICB0cnkge1xuICAgICAgY29uc3Qgc2Vzc2lvbkRhdGEgPSB0aGlzLmdldFNlc3Npb25EYXRhKCk7XG5cbiAgICAgIGlmIChzZXNzaW9uRGF0YT8uc3RyYXRlZ3kpIHtcbiAgICAgICAgY29uc3Qgc3RyYXRlZ3kgPSB0aGlzLmF1dGhTdHJhdGVneVJlZ2lzdHJ5LmdldChzZXNzaW9uRGF0YT8uc3RyYXRlZ3kpO1xuICAgICAgICBpZiAoc3RyYXRlZ3kpIHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgYXdhaXQgc3RyYXRlZ3kuc2lnbm91dCgpO1xuICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7IH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgLy9cblxuICAgICAgY29uc3QgdXNlcklkID0gdGhpcy51c2VyPy5pZDtcblxuICAgICAgLy8gQ2xlYXIgbW9kdWxlIHByb3ZpZGVyIGxvYWRlciBjYWNoZSBiZWZvcmUgY2xlYXJpbmcgc2Vzc2lvblxuICAgICAgLy8gVGhpcyBlbnN1cmVzIG1vZHVsZXMgYW5kIHByb3ZpZGVycyBmcm9tIHByZXZpb3VzIHVzZXIgYXJlIG5vdCBjYWNoZWRcbiAgICAgIGF3YWl0IHRoaXMuZ2V0TW9kdWxlUHJvdmlkZXJMb2FkZXIoKS5jbGVhcigpO1xuXG4gICAgICB0aGlzLmNsZWFyU2Vzc2lvbigpO1xuICAgICAgdGhpcy5ldmVudFNlcnZpY2UucHVibGlzaChBWFBTZXNzaW9uU3RhdHVzLlNpZ25lZE91dCwgeyBpZDogdXNlcklkIH0pO1xuICAgICAgdGhpcy5pc0xvYWRpbmcubmV4dChmYWxzZSk7XG4gICAgICB0aGlzLnN0YXR1cy5uZXh0KEFYUFNlc3Npb25TdGF0dXMuU2lnbmVkT3V0KTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgdGhpcy5pc0xvYWRpbmcubmV4dChmYWxzZSk7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgcmVmcmVzaFRva2VuKCk6IFByb21pc2U8YW55PiB7XG4gICAgY29uc29sZS5sb2coJ1JlZnJlc2hpbmcgdG9rZW4uLi4nKTtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoYXN5bmMgKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgY29uc3Qgc2Vzc2lvbkRhdGEgPSB0aGlzLmdldFNlc3Npb25EYXRhKCk7XG4gICAgICBpZiAoIXNlc3Npb25EYXRhIHx8ICFzZXNzaW9uRGF0YT8ucmVmcmVzaFRva2VuKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKCdObyBzZXNzaW9uIGRhdGEgb3IgcmVmcmVzaCB0b2tlbiBmb3VuZCcpO1xuICAgICAgICByZWplY3QobmV3IEVycm9yKCdObyByZWZyZXNoIHRva2VuIGF2YWlsYWJsZScpKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgY29uc3Qgc3RyYXRlZ3kgPSB0aGlzLmF1dGhTdHJhdGVneVJlZ2lzdHJ5LmdldChzZXNzaW9uRGF0YS5zdHJhdGVneSk7XG4gICAgICBpZiAoIXN0cmF0ZWd5KSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ0F1dGhlbnRpY2F0aW9uIHN0cmF0ZWd5IG5vdCBmb3VuZDonLCBzZXNzaW9uRGF0YS5zdHJhdGVneSk7XG4gICAgICAgIHJlamVjdChuZXcgRXJyb3IoYEF1dGhlbnRpY2F0aW9uIHN0cmF0ZWd5ICcke3Nlc3Npb25EYXRhLnN0cmF0ZWd5fScgaXMgbm90IGZvdW5kYCkpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBzdHJhdGVneS5yZWZyZXNoVG9rZW4odGhpcy5nZXRDb250ZXh0KCkpO1xuICAgICAgICBpZiAocmVzdWx0LnN1Y2NlZWQpIHtcbiAgICAgICAgICBjb25zb2xlLmxvZygnVG9rZW4gcmVmcmVzaCBzdWNjZXNzZnVsJyk7XG4gICAgICAgICAgdGhpcy5zZXRTZXNzaW9uKHJlc3VsdC5kYXRhIGFzIEFYUFNlc3Npb25EYXRhKTtcbiAgICAgICAgICByZXNvbHZlKHJlc3VsdC5kYXRhPy5hY2Nlc3NUb2tlbik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcignVG9rZW4gcmVmcmVzaCBmYWlsZWQnKTtcbiAgICAgICAgICB0aGlzLmNsZWFyU2Vzc2lvbigpO1xuICAgICAgICAgIHRoaXMuc3RhdHVzLm5leHQoQVhQU2Vzc2lvblN0YXR1cy5FeHBpcmVkKTtcbiAgICAgICAgICByZWplY3QobmV3IEVycm9yKCdUb2tlbiByZWZyZXNoIGZhaWxlZCcpKTtcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcignRXJyb3IgZHVyaW5nIHRva2VuIHJlZnJlc2g6JywgZXJyb3IpO1xuICAgICAgICB0aGlzLmNsZWFyU2Vzc2lvbigpO1xuICAgICAgICB0aGlzLnN0YXR1cy5uZXh0KEFYUFNlc3Npb25TdGF0dXMuRXhwaXJlZCk7XG4gICAgICAgIHJlamVjdChlcnJvcik7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGxvYWRQZXJtaXNzaW9ucygpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcGVybWlzc2lvbnMgPSBhd2FpdCB0aGlzLnBlcm1pc3Npb25Mb2FkZXIuZ2V0TGlzdCh0aGlzLmdldENvbnRleHQoKSk7XG4gICAgICB0aGlzLnBlcm1pc3Npb25zU3ViamVjdC5uZXh0KHBlcm1pc3Npb25zID8/IFtdKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc29sZS5lcnJvcignRXJyb3IgbG9hZGluZyBwZXJtaXNzaW9uczonLCBlcnJvcik7XG4gICAgICB0aGlzLnBlcm1pc3Npb25zU3ViamVjdC5uZXh0KFtdKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGxvYWRGZWF0dXJlcygpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgZmVhdHVyZXMgPSBhd2FpdCB0aGlzLmZlYXR1cmVMb2FkZXIuZ2V0TGlzdCh0aGlzLmdldENvbnRleHQoKSk7XG4gICAgICB0aGlzLmZlYXR1cmVzU3ViamVjdC5uZXh0KGZlYXR1cmVzID8/IFtdKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc29sZS5lcnJvcignRXJyb3IgbG9hZGluZyBmZWF0dXJlczonLCBlcnJvcik7XG4gICAgICB0aGlzLmZlYXR1cmVzU3ViamVjdC5uZXh0KFtdKTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBzaWduSW5Db21wbGV0ZSgpIHtcbiAgICAvLyBFbnN1cmUgd2UgaGF2ZSB0aGUgcmVxdWlyZWQgZGF0YVxuICAgIGlmICghdGhpcy51c2VyKSB7XG4gICAgICB0aGlzLnN0YXR1cy5uZXh0KEFYUFNlc3Npb25TdGF0dXMuVW5hdXRoZW50aWNhdGVkKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBTZXQgc3RhdHVzIHRvIEF1dGhvcml6ZWRcbiAgICB0aGlzLnN0YXR1cy5uZXh0KEFYUFNlc3Npb25TdGF0dXMuQXV0aG9yaXplZCk7XG5cbiAgICAvLyBEb3VibGUtY2hlY2sgdGhlIHN0YXR1cyB3YXMgc2V0IGNvcnJlY3RseVxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgY29uc29sZS5sb2coJ1N0YXR1cyBhZnRlciB0aW1lb3V0OicsIHRoaXMuc3RhdHVzLnZhbHVlKTtcbiAgICB9LCAxMDApO1xuICB9XG5cbiAgcHVibGljIHNldFNlc3Npb24odG9rZW5zOiBQYXJ0aWFsPEFYUFNlc3Npb25EYXRhPik6IHZvaWQge1xuICAgIGNvbnN0IHNlc3Npb25EYXRhOiBQYXJ0aWFsPEFYUFNlc3Npb25EYXRhPiA9IHtcbiAgICAgIGFjY2Vzc1Rva2VuOiB0b2tlbnMuYWNjZXNzVG9rZW4sXG4gICAgICByZWZyZXNoVG9rZW46IHRva2Vucy5yZWZyZXNoVG9rZW4sXG4gICAgICBzdHJhdGVneTogdG9rZW5zLnN0cmF0ZWd5LFxuICAgICAgdXNlcjogdG9rZW5zLnVzZXIsXG4gICAgICBhcHBsaWNhdGlvbjogdG9rZW5zLmFwcGxpY2F0aW9uLFxuICAgICAgdGVuYW50OiB0b2tlbnMudGVuYW50LFxuICAgICAgZXhwaXJlc0luOiB0b2tlbnMuZXhwaXJlc0luLFxuICAgICAgaWRUb2tlbjogdG9rZW5zLmlkVG9rZW4sXG4gICAgfTtcbiAgICAvLyBVcGRhdGUgc3ViamVjdHNcbiAgICBpZiAodG9rZW5zLnVzZXIpIHtcbiAgICAgIHRoaXMuY3VycmVudFVzZXJTdWJqZWN0Lm5leHQodG9rZW5zLnVzZXIpO1xuICAgIH1cbiAgICBpZiAodG9rZW5zLnRlbmFudCkge1xuICAgICAgdGhpcy5jdXJyZW50VGVuYW50U3ViamVjdC5uZXh0KHRva2Vucy50ZW5hbnQpO1xuICAgIH1cbiAgICBpZiAodG9rZW5zLmFwcGxpY2F0aW9uKSB7XG4gICAgICB0aGlzLmN1cnJlbnRBcHBsaWNhdGlvblN1YmplY3QubmV4dCh0b2tlbnMuYXBwbGljYXRpb24pO1xuICAgIH1cbiAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShBWFBTZXNzaW9uU2VydmljZS5TRVNTSU9OX0tFWSwgSlNPTi5zdHJpbmdpZnkoc2Vzc2lvbkRhdGEpKTtcbiAgfVxuXG4gIHB1YmxpYyBzZXRTdHJhdGVneShzdHJhdGVneTogc3RyaW5nKTogdm9pZCB7XG4gICAgY29uc3Qgc2Vzc2lvbkRhdGEgPSB0aGlzLmdldFNlc3Npb25EYXRhKCk7XG4gICAgY29uc3QgbmV3U2Vzc2lvbkRhdGEgPSB7IC4uLnNlc3Npb25EYXRhLCBzdHJhdGVneSB9O1xuICAgIHRoaXMuc2V0U2Vzc2lvbihuZXdTZXNzaW9uRGF0YSk7XG4gIH1cblxuICBwdWJsaWMgZ2V0U2Vzc2lvbkRhdGEoKTogQVhQU2Vzc2lvbkRhdGEgfCBudWxsIHtcbiAgICB0cnkge1xuICAgICAgY29uc3Qgc2Vzc2lvbkRhdGFTdHJpbmcgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShBWFBTZXNzaW9uU2VydmljZS5TRVNTSU9OX0tFWSk7XG4gICAgICBpZiAoc2Vzc2lvbkRhdGFTdHJpbmcpIHtcbiAgICAgICAgY29uc3Qgc2Vzc2lvbkRhdGEgPSBKU09OLnBhcnNlKHNlc3Npb25EYXRhU3RyaW5nKTtcblxuICAgICAgICByZXR1cm4gc2Vzc2lvbkRhdGE7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgbG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0oQVhQU2Vzc2lvblNlcnZpY2UuU0VTU0lPTl9LRVkpO1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBjbGVhclNlc3Npb24oKTogdm9pZCB7XG4gICAgLy9cbiAgICB0aGlzLmN1cnJlbnRVc2VyU3ViamVjdC5uZXh0KG51bGwpO1xuICAgIC8vXG4gICAgdGhpcy5jdXJyZW50VGVuYW50U3ViamVjdC5uZXh0KG51bGwpO1xuICAgIC8vXG4gICAgdGhpcy5jdXJyZW50QXBwbGljYXRpb25TdWJqZWN0Lm5leHQobnVsbCk7XG4gICAgLy9cbiAgICB0aGlzLnBlcm1pc3Npb25zU3ViamVjdC5uZXh0KFtdKTtcbiAgICAvL1xuICAgIHRoaXMuZmVhdHVyZXNTdWJqZWN0Lm5leHQoW10pO1xuICAgIC8vXG4gICAgbG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0oQVhQU2Vzc2lvblNlcnZpY2UuU0VTU0lPTl9LRVkpO1xuICB9XG5cbiAgcHVibGljIGF1dGhvcml6ZSguLi5rZXlzOiBzdHJpbmdbXSk6IGJvb2xlYW4ge1xuICAgIC8vIENhbGN1bGF0ZSBiYXNlIHJlc3VsdFxuICAgIGNvbnN0IGJhc2VSZXN1bHQgPSBrZXlzLmV2ZXJ5KChrKSA9PiB7XG4gICAgICBpZiAoaXNFbXB0eShrKSkgcmV0dXJuIHRydWU7XG5cbiAgICAgIC8vIENoZWNrIGlmIHVzZXIgaGFzIHRoZSBwZXJtaXNzaW9uXG4gICAgICBjb25zdCBoYXNQZXJtaXNzaW9uID0gdGhpcy5wZXJtaXNzaW9ucy5pbmRleE9mKGspID4gLTE7XG4gICAgICBpZiAoIWhhc1Blcm1pc3Npb24pIHJldHVybiBmYWxzZTtcblxuICAgICAgLy8gQ2hlY2sgaWYgcGVybWlzc2lvbiBoYXMgcmVxdWlyZWQgZmVhdHVyZXMgKGlmIHBlcm1pc3Npb24gZGVmaW5pdGlvbiBzZXJ2aWNlIGlzIGF2YWlsYWJsZSlcbiAgICAgIC8vIE5vdGU6IFRoaXMgaXMgYSBsaWdodHdlaWdodCBjaGVjay4gRnVsbCBmZWF0dXJlIHZhbGlkYXRpb24gaGFwcGVucyBpbiBwZXJtaXNzaW9uIGRlZmluaXRpb24gc2VydmljZS5cbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0pO1xuXG4gICAgLy8gSWYgcGVybWlzc2lvbiBjaGVja2VyIGlzIHByb3ZpZGVkLCB1c2UgaXQgdG8gcG90ZW50aWFsbHkgb3ZlcnJpZGUgdGhlIHJlc3VsdFxuICAgIGlmICh0aGlzLnBlcm1pc3Npb25DaGVja2VyKSB7XG4gICAgICBjb25zdCBjb250ZXh0ID0gdGhpcy5nZXRDb250ZXh0KCk7XG4gICAgICByZXR1cm4gdGhpcy5wZXJtaXNzaW9uQ2hlY2tlci5jaGVjayhrZXlzLCBjb250ZXh0LCBiYXNlUmVzdWx0KTtcbiAgICB9XG5cbiAgICByZXR1cm4gYmFzZVJlc3VsdDtcbiAgfVxuXG4gIHB1YmxpYyBpc0ZlYXR1cmVFbmFibGVkKC4uLmtleXM6IHN0cmluZ1tdKTogYm9vbGVhbiB7XG4gICAgLy8gQ2FsY3VsYXRlIGJhc2UgcmVzdWx0XG4gICAgY29uc3QgYmFzZVJlc3VsdCA9IGtleXMuZXZlcnkoKGspID0+IGlzRW1wdHkoaykgfHwgdGhpcy5mZWF0dXJlcy5zb21lKChjKSA9PiBjLm5hbWUgPT0gayAmJiBjLnZhbHVlID09IHRydWUpKTtcblxuICAgIC8vIElmIGZlYXR1cmUgY2hlY2tlciBpcyBwcm92aWRlZCwgdXNlIGl0IHRvIHBvdGVudGlhbGx5IG92ZXJyaWRlIHRoZSByZXN1bHRcbiAgICBpZiAodGhpcy5mZWF0dXJlQ2hlY2tlcikge1xuICAgICAgY29uc3QgY29udGV4dCA9IHRoaXMuZ2V0Q29udGV4dCgpO1xuICAgICAgcmV0dXJuIHRoaXMuZmVhdHVyZUNoZWNrZXIuY2hlY2soa2V5cywgY29udGV4dCwgYmFzZVJlc3VsdCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGJhc2VSZXN1bHQ7XG4gIH1cblxuICBwdWJsaWMgZ2V0VG9rZW4oKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCBzZXNzaW9uRGF0YSA9IHRoaXMuZ2V0U2Vzc2lvbkRhdGEoKTtcblxuICAgIHJldHVybiBzZXNzaW9uRGF0YT8uYWNjZXNzVG9rZW47XG4gIH1cblxuICBwdWJsaWMgZ2V0Q29udGV4dCgpOiBBWFBTZXNzaW9uQ29udGV4dCB7XG4gICAgcmV0dXJuIG5ldyBBWFBTZXNzaW9uQ29udGV4dCh7XG4gICAgICB1c2VyOiB0aGlzLnVzZXIsXG4gICAgICB0ZW5hbnQ6IHRoaXMudGVuYW50LFxuICAgICAgYXBwbGljYXRpb246IHRoaXMuYXBwbGljYXRpb24sXG4gICAgfSk7XG4gIH1cbn1cbiJdfQ==","import { Directive, Input, TemplateRef, ViewContainerRef, inject, signal } from '@angular/core';\nimport { AXPSessionService } from '../session.service';\nimport * as i0 from \"@angular/core\";\nexport class AXPPermissionDirective {\n constructor(templateRef, viewContainer) {\n this.templateRef = templateRef;\n this.viewContainer = viewContainer;\n this.hasView = signal(false, ...(ngDevMode ? [{ debugName: \"hasView\" }] : []));\n this.sessionService = inject(AXPSessionService);\n }\n set permission(permissionKeys) {\n const keys = !permissionKeys ? [] : (Array.isArray(permissionKeys) ? permissionKeys : [permissionKeys]);\n if (keys.length == 0) {\n // If permissionKey is null or empty, decide the default behavior here\n this.viewContainer.createEmbeddedView(this.templateRef);\n this.hasView.set(true);\n return;\n }\n this.subscription = this.sessionService.isAuthorized$\n .subscribe((isAuthorized) => {\n if (isAuthorized && this.sessionService.authorize(...keys)) {\n if (!this.hasView()) {\n this.viewContainer.createEmbeddedView(this.templateRef);\n this.hasView.set(true);\n }\n }\n else {\n this.viewContainer.clear();\n this.hasView.set(false);\n }\n });\n }\n set permissionElse(elseTemplateRef) {\n if (!this.hasView()) {\n this.viewContainer.createEmbeddedView(elseTemplateRef);\n }\n }\n ngOnDestroy() {\n this.subscription?.unsubscribe();\n }\n static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: \"12.0.0\", version: \"20.3.12\", ngImport: i0, type: AXPPermissionDirective, deps: [{ token: i0.TemplateRef }, { token: i0.ViewContainerRef }], target: i0.ɵɵFactoryTarget.Directive }); }\n static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: \"14.0.0\", version: \"20.3.12\", type: AXPPermissionDirective, isStandalone: false, selector: \"[permission]\", inputs: { permission: \"permission\", permissionElse: \"permissionElse\" }, ngImport: i0 }); }\n}\ni0.ɵɵngDeclareClassMetadata({ minVersion: \"12.0.0\", version: \"20.3.12\", ngImport: i0, type: AXPPermissionDirective, decorators: [{\n type: Directive,\n args: [{\n selector: '[permission]',\n standalone: false\n }]\n }], ctorParameters: () => [{ type: i0.TemplateRef }, { type: i0.ViewContainerRef }], propDecorators: { permission: [{\n type: Input\n }], permissionElse: [{\n type: Input\n }] } });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGVybWlzc2lvbi5kaXJlY3RpdmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL3BsYXRmb3JtL2F1dGgvc3JjL2xpYi9wZXJtaXNzaW9uL3Blcm1pc3Npb24uZGlyZWN0aXZlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLFdBQVcsRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRWhHLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLG9CQUFvQixDQUFDOztBQU12RCxNQUFNLE9BQU8sc0JBQXNCO0lBS2pDLFlBQ1UsV0FBNkIsRUFDN0IsYUFBK0I7UUFEL0IsZ0JBQVcsR0FBWCxXQUFXLENBQWtCO1FBQzdCLGtCQUFhLEdBQWIsYUFBYSxDQUFrQjtRQU5qQyxZQUFPLEdBQUcsTUFBTSxDQUFDLEtBQUssbURBQUMsQ0FBQztRQUV4QixtQkFBYyxHQUFHLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO0lBSy9DLENBQUM7SUFFTCxJQUNXLFVBQVUsQ0FBQyxjQUF3QztRQUM1RCxNQUFNLElBQUksR0FBYSxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDO1FBQ2xILElBQUksSUFBSSxDQUFDLE1BQU0sSUFBSSxDQUFDLEVBQUUsQ0FBQztZQUNyQixzRUFBc0U7WUFDdEUsSUFBSSxDQUFDLGFBQWEsQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7WUFDeEQsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDdkIsT0FBTztRQUNULENBQUM7UUFDRCxJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsYUFBYTthQUNsRCxTQUFTLENBQUMsQ0FBQyxZQUFZLEVBQUUsRUFBRTtZQUMxQixJQUFJLFlBQVksSUFBSSxJQUFJLENBQUMsY0FBYyxDQUFDLFNBQVMsQ0FBQyxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUM7Z0JBQzNELElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQztvQkFDcEIsSUFBSSxDQUFDLGFBQWEsQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7b0JBQ3hELElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO2dCQUN6QixDQUFDO1lBQ0gsQ0FBQztpQkFBTSxDQUFDO2dCQUNOLElBQUksQ0FBQyxhQUFhLENBQUMsS0FBSyxFQUFFLENBQUM7Z0JBQzNCLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQzFCLENBQUM7UUFDSCxDQUFDLENBQUMsQ0FBQztJQUNQLENBQUM7SUFFRCxJQUNXLGNBQWMsQ0FBQyxlQUFpQztRQUN6RCxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUM7WUFDcEIsSUFBSSxDQUFDLGFBQWEsQ0FBQyxrQkFBa0IsQ0FBQyxlQUFlLENBQUMsQ0FBQztRQUN6RCxDQUFDO0lBQ0gsQ0FBQztJQUVELFdBQVc7UUFDVCxJQUFJLENBQUMsWUFBWSxFQUFFLFdBQVcsRUFBRSxDQUFDO0lBQ25DLENBQUM7K0dBMUNVLHNCQUFzQjttR0FBdEIsc0JBQXNCOzs0RkFBdEIsc0JBQXNCO2tCQUpsQyxTQUFTO21CQUFDO29CQUNQLFFBQVEsRUFBRSxjQUFjO29CQUN4QixVQUFVLEVBQUUsS0FBSztpQkFDcEI7O3NCQVdFLEtBQUs7O3NCQXVCTCxLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRGlyZWN0aXZlLCBJbnB1dCwgVGVtcGxhdGVSZWYsIFZpZXdDb250YWluZXJSZWYsIGluamVjdCwgc2lnbmFsIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBTdWJzY3JpcHRpb24sIGZpcnN0IH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBBWFBTZXNzaW9uU2VydmljZSB9IGZyb20gJy4uL3Nlc3Npb24uc2VydmljZSc7XG5cbkBEaXJlY3RpdmUoe1xuICAgIHNlbGVjdG9yOiAnW3Blcm1pc3Npb25dJyxcbiAgICBzdGFuZGFsb25lOiBmYWxzZVxufSlcbmV4cG9ydCBjbGFzcyBBWFBQZXJtaXNzaW9uRGlyZWN0aXZlIHtcbiAgcHJpdmF0ZSBoYXNWaWV3ID0gc2lnbmFsKGZhbHNlKTtcbiAgcHJpdmF0ZSBzdWJzY3JpcHRpb24hOiBTdWJzY3JpcHRpb247XG4gIHByaXZhdGUgc2Vzc2lvblNlcnZpY2UgPSBpbmplY3QoQVhQU2Vzc2lvblNlcnZpY2UpO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgdGVtcGxhdGVSZWY6IFRlbXBsYXRlUmVmPGFueT4sXG4gICAgcHJpdmF0ZSB2aWV3Q29udGFpbmVyOiBWaWV3Q29udGFpbmVyUmVmXG4gICkgeyB9XG5cbiAgQElucHV0KClcbiAgcHVibGljIHNldCBwZXJtaXNzaW9uKHBlcm1pc3Npb25LZXlzOiBzdHJpbmcgfCBzdHJpbmdbXSB8IG51bGwpIHtcbiAgICBjb25zdCBrZXlzOiBzdHJpbmdbXSA9ICFwZXJtaXNzaW9uS2V5cyA/IFtdIDogKEFycmF5LmlzQXJyYXkocGVybWlzc2lvbktleXMpID8gcGVybWlzc2lvbktleXMgOiBbcGVybWlzc2lvbktleXNdKTtcbiAgICBpZiAoa2V5cy5sZW5ndGggPT0gMCkge1xuICAgICAgLy8gSWYgcGVybWlzc2lvbktleSBpcyBudWxsIG9yIGVtcHR5LCBkZWNpZGUgdGhlIGRlZmF1bHQgYmVoYXZpb3IgaGVyZVxuICAgICAgdGhpcy52aWV3Q29udGFpbmVyLmNyZWF0ZUVtYmVkZGVkVmlldyh0aGlzLnRlbXBsYXRlUmVmKTtcbiAgICAgIHRoaXMuaGFzVmlldy5zZXQodHJ1ZSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuc3Vic2NyaXB0aW9uID0gdGhpcy5zZXNzaW9uU2VydmljZS5pc0F1dGhvcml6ZWQkXG4gICAgICAuc3Vic2NyaWJlKChpc0F1dGhvcml6ZWQpID0+IHtcbiAgICAgICAgaWYgKGlzQXV0aG9yaXplZCAmJiB0aGlzLnNlc3Npb25TZXJ2aWNlLmF1dGhvcml6ZSguLi5rZXlzKSkge1xuICAgICAgICAgIGlmICghdGhpcy5oYXNWaWV3KCkpIHtcbiAgICAgICAgICAgIHRoaXMudmlld0NvbnRhaW5lci5jcmVhdGVFbWJlZGRlZFZpZXcodGhpcy50ZW1wbGF0ZVJlZik7XG4gICAgICAgICAgICB0aGlzLmhhc1ZpZXcuc2V0KHRydWUpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLnZpZXdDb250YWluZXIuY2xlYXIoKTtcbiAgICAgICAgICB0aGlzLmhhc1ZpZXcuc2V0KGZhbHNlKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gIH1cblxuICBASW5wdXQoKVxuICBwdWJsaWMgc2V0IHBlcm1pc3Npb25FbHNlKGVsc2VUZW1wbGF0ZVJlZjogVGVtcGxhdGVSZWY8YW55Pikge1xuICAgIGlmICghdGhpcy5oYXNWaWV3KCkpIHtcbiAgICAgIHRoaXMudmlld0NvbnRhaW5lci5jcmVhdGVFbWJlZGRlZFZpZXcoZWxzZVRlbXBsYXRlUmVmKTtcbiAgICB9XG4gIH1cblxuICBuZ09uRGVzdHJveSgpIHtcbiAgICB0aGlzLnN1YnNjcmlwdGlvbj8udW5zdWJzY3JpYmUoKTtcbiAgfVxufVxuIl19","import { inject } from '@angular/core';\nimport { first, map } from 'rxjs';\nimport { AXPUnauthorizedError } from '../errors.types';\nimport { AXPSessionService } from '../session.service';\nexport const AXPPermissionGuard = (route, state) => {\n const sessionService = inject(AXPSessionService);\n const permissionKeys = route.data['requiredPermission'];\n return sessionService.isAuthorized$.pipe(first(), map((value) => {\n const keys = !permissionKeys ? [] : Array.isArray(permissionKeys) ? permissionKeys : [permissionKeys];\n const hasPermission = keys.length == 0 || sessionService.authorize(...keys);\n if (!hasPermission) {\n throw new AXPUnauthorizedError(`Access denied. Required permissions: ${keys.join(', ')}. Please contact your administrator if you believe this is an error.`, {\n redirectUrl: state.url\n });\n }\n return true;\n }));\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGVybWlzc2lvbi5ndWFyZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvcGxhdGZvcm0vYXV0aC9zcmMvbGliL3Blcm1pc3Npb24vcGVybWlzc2lvbi5ndWFyZC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRXZDLE9BQU8sRUFBRSxLQUFLLEVBQUUsR0FBRyxFQUFPLE1BQU0sTUFBTSxDQUFDO0FBQ3ZDLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ3ZELE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBRXZELE1BQU0sQ0FBQyxNQUFNLGtCQUFrQixHQUFrQixDQUFDLEtBQTZCLEVBQUUsS0FBMEIsRUFBRSxFQUFFO0lBRTdHLE1BQU0sY0FBYyxHQUFHLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO0lBRWpELE1BQU0sY0FBYyxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMsb0JBQW9CLENBQTZCLENBQUM7SUFFcEYsT0FBTyxjQUFjLENBQUMsYUFBYSxDQUFDLElBQUksQ0FDdEMsS0FBSyxFQUFFLEVBQ1AsR0FBRyxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUU7UUFDWixNQUFNLElBQUksR0FBYSxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLENBQUMsY0FBYyxDQUFDLENBQUM7UUFDaEgsTUFBTSxhQUFhLEdBQUcsSUFBSSxDQUFDLE1BQU0sSUFBSSxDQUFDLElBQUksY0FBYyxDQUFDLFNBQVMsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDO1FBQzVFLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztZQUNuQixNQUFNLElBQUksb0JBQW9CLENBQzVCLHdDQUF3QyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxzRUFBc0UsRUFDN0g7Z0JBQ0UsV0FBVyxFQUFFLEtBQUssQ0FBQyxHQUFHO2FBQ3ZCLENBQ0YsQ0FBQztRQUNKLENBQUM7UUFDRCxPQUFPLElBQUksQ0FBQztJQUNkLENBQUMsQ0FBQyxDQUNILENBQUM7QUFDSixDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBpbmplY3QgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEFjdGl2YXRlZFJvdXRlU25hcHNob3QsIENhbkFjdGl2YXRlRm4sIFJvdXRlclN0YXRlU25hcHNob3QgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xuaW1wb3J0IHsgZmlyc3QsIG1hcCwgdGFwIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBBWFBVbmF1dGhvcml6ZWRFcnJvciB9IGZyb20gJy4uL2Vycm9ycy50eXBlcyc7XG5pbXBvcnQgeyBBWFBTZXNzaW9uU2VydmljZSB9IGZyb20gJy4uL3Nlc3Npb24uc2VydmljZSc7XG5cbmV4cG9ydCBjb25zdCBBWFBQZXJtaXNzaW9uR3VhcmQ6IENhbkFjdGl2YXRlRm4gPSAocm91dGU6IEFjdGl2YXRlZFJvdXRlU25hcHNob3QsIHN0YXRlOiBSb3V0ZXJTdGF0ZVNuYXBzaG90KSA9PiB7XG5cbiAgY29uc3Qgc2Vzc2lvblNlcnZpY2UgPSBpbmplY3QoQVhQU2Vzc2lvblNlcnZpY2UpO1xuXG4gIGNvbnN0IHBlcm1pc3Npb25LZXlzID0gcm91dGUuZGF0YVsncmVxdWlyZWRQZXJtaXNzaW9uJ10gYXMgc3RyaW5nIHwgc3RyaW5nW10gfCBudWxsO1xuXG4gIHJldHVybiBzZXNzaW9uU2VydmljZS5pc0F1dGhvcml6ZWQkLnBpcGUoXG4gICAgZmlyc3QoKSxcbiAgICBtYXAoKHZhbHVlKSA9PiB7XG4gICAgICBjb25zdCBrZXlzOiBzdHJpbmdbXSA9ICFwZXJtaXNzaW9uS2V5cyA/IFtdIDogQXJyYXkuaXNBcnJheShwZXJtaXNzaW9uS2V5cykgPyBwZXJtaXNzaW9uS2V5cyA6IFtwZXJtaXNzaW9uS2V5c107XG4gICAgICBjb25zdCBoYXNQZXJtaXNzaW9uID0ga2V5cy5sZW5ndGggPT0gMCB8fCBzZXNzaW9uU2VydmljZS5hdXRob3JpemUoLi4ua2V5cyk7XG4gICAgICBpZiAoIWhhc1Blcm1pc3Npb24pIHtcbiAgICAgICAgdGhyb3cgbmV3IEFYUFVuYXV0aG9yaXplZEVycm9yKFxuICAgICAgICAgIGBBY2Nlc3MgZGVuaWVkLiBSZXF1aXJlZCBwZXJtaXNzaW9uczogJHtrZXlzLmpvaW4oJywgJyl9LiBQbGVhc2UgY29udGFjdCB5b3VyIGFkbWluaXN0cmF0b3IgaWYgeW91IGJlbGlldmUgdGhpcyBpcyBhbiBlcnJvci5gLFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIHJlZGlyZWN0VXJsOiBzdGF0ZS51cmxcbiAgICAgICAgICB9XG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9KVxuICApO1xufTtcbiJdfQ==","export class AXPPermissionDefinitionProviderContext {\n constructor() {\n this.builders = new Map();\n }\n addGroup(name, title, description) {\n if (this.isGroupDefined(name)) {\n return this.findGroup(name);\n }\n const group = {\n name,\n title,\n description,\n permissions: []\n };\n const builder = new AXPPermissionDefinitionGroupBuilder(this, group);\n this.builders.set(name, builder);\n return builder;\n }\n getGroupDefinitions() {\n return Array.from(this.builders.values()).map(b => b.group);\n }\n findGroup(name) {\n return this.builders.get(name);\n }\n isGroupDefined(name) {\n return this.builders.has(name);\n }\n}\nexport class AXPPermissionDefinitionGroupBuilder {\n get group() {\n return this._group;\n }\n constructor(context, group) {\n this.context = context;\n this._group = group;\n }\n addPermission(name, title, description, requiredFeatures) {\n const permission = {\n name,\n title,\n description,\n children: [],\n requiredFeatures\n };\n this._group.permissions.push(permission);\n return new AXPPermissionDefinitionBuilder(this, permission);\n }\n endGroup() {\n return this.context;\n }\n findPermission(path) {\n return undefined;\n }\n findGroup(name) {\n return undefined;\n }\n}\nexport class AXPPermissionDefinitionBuilder {\n constructor(groupBuilder, permission) {\n this.groupBuilder = groupBuilder;\n this.permission = permission;\n }\n addChild(name, title, description, requiredFeatures) {\n const permission = {\n name,\n title,\n description,\n children: [],\n requiredFeatures\n };\n this.permission.children.push(permission);\n return this;\n }\n /**\n * Set required features for this permission.\n * @param features - Array of feature names (e.g., ['PlatformManagement.menu-customization'])\n */\n requireFeatures(...features) {\n this.permission.requiredFeatures = features;\n return this;\n }\n endPermission() {\n return this.groupBuilder;\n }\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGVybWlzc2lvbi1kZWZpbml0aW9uLmJ1aWxkZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL3BsYXRmb3JtL2F1dGgvc3JjL2xpYi9wZXJtaXNzaW9uL3Blcm1pc3Npb24tZGVmaW5pdGlvbi5idWlsZGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUdBLE1BQU0sT0FBTyxzQ0FBc0M7SUFBbkQ7UUFDWSxhQUFRLEdBQXFELElBQUksR0FBRyxFQUFFLENBQUM7SUE0Qm5GLENBQUM7SUExQkcsUUFBUSxDQUFDLElBQVksRUFBRSxLQUFhLEVBQUUsV0FBb0I7UUFDdEQsSUFBSSxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7WUFDNUIsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBRSxDQUFBO1FBQ2hDLENBQUM7UUFDRCxNQUFNLEtBQUssR0FBaUM7WUFDeEMsSUFBSTtZQUNKLEtBQUs7WUFDTCxXQUFXO1lBQ1gsV0FBVyxFQUFFLEVBQUU7U0FDbEIsQ0FBQztRQUNGLE1BQU0sT0FBTyxHQUFHLElBQUksbUNBQW1DLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQ3JFLElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLElBQUksRUFBRSxPQUFPLENBQUMsQ0FBQztRQUNqQyxPQUFPLE9BQU8sQ0FBQztJQUNuQixDQUFDO0lBRUQsbUJBQW1CO1FBQ2YsT0FBTyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDaEUsQ0FBQztJQUVELFNBQVMsQ0FBQyxJQUFZO1FBQ2xCLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDbkMsQ0FBQztJQUVELGNBQWMsQ0FBQyxJQUFZO1FBQ3ZCLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDbkMsQ0FBQztDQUNKO0FBSUQsTUFBTSxPQUFPLG1DQUFtQztJQUk1QyxJQUFXLEtBQUs7UUFDWixPQUFPLElBQUksQ0FBQyxNQUFNLENBQUM7SUFDdkIsQ0FBQztJQUVELFlBQVksT0FBK0MsRUFBRSxLQUFtQztRQUM1RixJQUFJLENBQUMsT0FBTyxHQUFHLE9BQU8sQ0FBQztRQUN2QixJQUFJLENBQUMsTUFBTSxHQUFHLEtBQUssQ0FBQztJQUN4QixDQUFDO0lBRUQsYUFBYSxDQUFDLElBQVksRUFBRSxLQUFhLEVBQUUsV0FBb0IsRUFBRSxnQkFBMkI7UUFDeEYsTUFBTSxVQUFVLEdBQTRCO1lBQ3hDLElBQUk7WUFDSixLQUFLO1lBQ0wsV0FBVztZQUNYLFFBQVEsRUFBRSxFQUFFO1lBQ1osZ0JBQWdCO1NBQ25CLENBQUM7UUFDRixJQUFJLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDekMsT0FBTyxJQUFJLDhCQUE4QixDQUFDLElBQUksRUFBRSxVQUFVLENBQUMsQ0FBQztJQUNoRSxDQUFDO0lBS0QsUUFBUTtRQUNKLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQztJQUN4QixDQUFDO0lBRUQsY0FBYyxDQUFDLElBQVk7UUFDdkIsT0FBTyxTQUFTLENBQUM7SUFDckIsQ0FBQztJQUVELFNBQVMsQ0FBQyxJQUFZO1FBQ2xCLE9BQU8sU0FBUyxDQUFDO0lBQ3JCLENBQUM7Q0FFSjtBQUVELE1BQU0sT0FBTyw4QkFBOEI7SUFJdkMsWUFBWSxZQUFpRCxFQUFFLFVBQW1DO1FBQzlGLElBQUksQ0FBQyxZQUFZLEdBQUcsWUFBWSxDQUFDO1FBQ2pDLElBQUksQ0FBQyxVQUFVLEdBQUcsVUFBVSxDQUFDO0lBQ2pDLENBQUM7SUFFRCxRQUFRLENBQUMsSUFBWSxFQUFFLEtBQWEsRUFBRSxXQUFvQixFQUFFLGdCQUEyQjtRQUNuRixNQUFNLFVBQVUsR0FBNEI7WUFDeEMsSUFBSTtZQUNKLEtBQUs7WUFDTCxXQUFXO1lBQ1gsUUFBUSxFQUFFLEVBQUU7WUFDWixnQkFBZ0I7U0FDbkIsQ0FBQztRQUNGLElBQUksQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUMxQyxPQUFPLElBQUksQ0FBQztJQUNoQixDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsZUFBZSxDQUFDLEdBQUcsUUFBa0I7UUFDakMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxnQkFBZ0IsR0FBRyxRQUFRLENBQUM7UUFDNUMsT0FBTyxJQUFJLENBQUM7SUFDaEIsQ0FBQztJQUdELGFBQWE7UUFDVCxPQUFPLElBQUksQ0FBQyxZQUFZLENBQUM7SUFDN0IsQ0FBQztDQUNKIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQVhQUGVybWlzc2lvbkRlZmluaXRpb24sIEFYUFBlcm1pc3Npb25Hcm91cERlZmluaXRpb24gfSBmcm9tIFwiLi9wZXJtaXNzaW9uLnR5cGVzXCI7XG5cblxuZXhwb3J0IGNsYXNzIEFYUFBlcm1pc3Npb25EZWZpbml0aW9uUHJvdmlkZXJDb250ZXh0IHtcbiAgICBwcml2YXRlIGJ1aWxkZXJzOiBNYXA8c3RyaW5nLCBBWFBQZXJtaXNzaW9uRGVmaW5pdGlvbkdyb3VwQnVpbGRlcj4gPSBuZXcgTWFwKCk7XG5cbiAgICBhZGRHcm91cChuYW1lOiBzdHJpbmcsIHRpdGxlOiBzdHJpbmcsIGRlc2NyaXB0aW9uPzogc3RyaW5nKTogQVhQUGVybWlzc2lvbkRlZmluaXRpb25Hcm91cEJ1aWxkZXIge1xuICAgICAgICBpZiAodGhpcy5pc0dyb3VwRGVmaW5lZChuYW1lKSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZmluZEdyb3VwKG5hbWUpIVxuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGdyb3VwOiBBWFBQZXJtaXNzaW9uR3JvdXBEZWZpbml0aW9uID0ge1xuICAgICAgICAgICAgbmFtZSxcbiAgICAgICAgICAgIHRpdGxlLFxuICAgICAgICAgICAgZGVzY3JpcHRpb24sXG4gICAgICAgICAgICBwZXJtaXNzaW9uczogW11cbiAgICAgICAgfTtcbiAgICAgICAgY29uc3QgYnVpbGRlciA9IG5ldyBBWFBQZXJtaXNzaW9uRGVmaW5pdGlvbkdyb3VwQnVpbGRlcih0aGlzLCBncm91cCk7XG4gICAgICAgIHRoaXMuYnVpbGRlcnMuc2V0KG5hbWUsIGJ1aWxkZXIpO1xuICAgICAgICByZXR1cm4gYnVpbGRlcjtcbiAgICB9XG5cbiAgICBnZXRHcm91cERlZmluaXRpb25zKCk6IEFYUFBlcm1pc3Npb25Hcm91cERlZmluaXRpb25bXSB7XG4gICAgICAgIHJldHVybiBBcnJheS5mcm9tKHRoaXMuYnVpbGRlcnMudmFsdWVzKCkpLm1hcChiID0+IGIuZ3JvdXApO1xuICAgIH1cblxuICAgIGZpbmRHcm91cChuYW1lOiBzdHJpbmcpOiBBWFBQZXJtaXNzaW9uRGVmaW5pdGlvbkdyb3VwQnVpbGRlciB8IHVuZGVmaW5lZCB7XG4gICAgICAgIHJldHVybiB0aGlzLmJ1aWxkZXJzLmdldChuYW1lKTtcbiAgICB9XG5cbiAgICBpc0dyb3VwRGVmaW5lZChuYW1lOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYnVpbGRlcnMuaGFzKG5hbWUpO1xuICAgIH1cbn1cblxuXG5cbmV4cG9ydCBjbGFzcyBBWFBQZXJtaXNzaW9uRGVmaW5pdGlvbkdyb3VwQnVpbGRlciB7XG4gICAgcHJpdmF0ZSBjb250ZXh0OiBBWFBQZXJtaXNzaW9uRGVmaW5pdGlvblByb3ZpZGVyQ29udGV4dDtcbiAgICBwcml2YXRlIF9ncm91cDogQVhQUGVybWlzc2lvbkdyb3VwRGVmaW5pdGlvbjtcblxuICAgIHB1YmxpYyBnZXQgZ3JvdXAoKTogQVhQUGVybWlzc2lvbkdyb3VwRGVmaW5pdGlvbiB7XG4gICAgICAgIHJldHVybiB0aGlzLl9ncm91cDtcbiAgICB9XG5cbiAgICBjb25zdHJ1Y3Rvcihjb250ZXh0OiBBWFBQZXJtaXNzaW9uRGVmaW5pdGlvblByb3ZpZGVyQ29udGV4dCwgZ3JvdXA6IEFYUFBlcm1pc3Npb25Hcm91cERlZmluaXRpb24pIHtcbiAgICAgICAgdGhpcy5jb250ZXh0ID0gY29udGV4dDtcbiAgICAgICAgdGhpcy5fZ3JvdXAgPSBncm91cDtcbiAgICB9XG5cbiAgICBhZGRQZXJtaXNzaW9uKG5hbWU6IHN0cmluZywgdGl0bGU6IHN0cmluZywgZGVzY3JpcHRpb24/OiBzdHJpbmcsIHJlcXVpcmVkRmVhdHVyZXM/OiBzdHJpbmdbXSk6IEFYUFBlcm1pc3Npb25EZWZpbml0aW9uQnVpbGRlciB7XG4gICAgICAgIGNvbnN0IHBlcm1pc3Npb246IEFYUFBlcm1pc3Npb25EZWZpbml0aW9uID0ge1xuICAgICAgICAgICAgbmFtZSxcbiAgICAgICAgICAgIHRpdGxlLFxuICAgICAgICAgICAgZGVzY3JpcHRpb24sXG4gICAgICAgICAgICBjaGlsZHJlbjogW10sXG4gICAgICAgICAgICByZXF1aXJlZEZlYXR1cmVzXG4gICAgICAgIH07XG4gICAgICAgIHRoaXMuX2dyb3VwLnBlcm1pc3Npb25zLnB1c2gocGVybWlzc2lvbik7XG4gICAgICAgIHJldHVybiBuZXcgQVhQUGVybWlzc2lvbkRlZmluaXRpb25CdWlsZGVyKHRoaXMsIHBlcm1pc3Npb24pO1xuICAgIH1cblxuXG5cblxuICAgIGVuZEdyb3VwKCk6IEFYUFBlcm1pc3Npb25EZWZpbml0aW9uUHJvdmlkZXJDb250ZXh0IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY29udGV4dDtcbiAgICB9XG5cbiAgICBmaW5kUGVybWlzc2lvbihwYXRoOiBzdHJpbmcpOiBBWFBQZXJtaXNzaW9uRGVmaW5pdGlvbiB8IHVuZGVmaW5lZCB7XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgZmluZEdyb3VwKG5hbWU6IHN0cmluZyk6IEFYUFBlcm1pc3Npb25EZWZpbml0aW9uR3JvdXBCdWlsZGVyIHwgdW5kZWZpbmVkIHtcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG5cbn1cblxuZXhwb3J0IGNsYXNzIEFYUFBlcm1pc3Npb25EZWZpbml0aW9uQnVpbGRlciB7XG4gICAgcHJpdmF0ZSBncm91cEJ1aWxkZXI6IEFYUFBlcm1pc3Npb25EZWZpbml0aW9uR3JvdXBCdWlsZGVyO1xuICAgIHByaXZhdGUgcGVybWlzc2lvbjogQVhQUGVybWlzc2lvbkRlZmluaXRpb247XG5cbiAgICBjb25zdHJ1Y3Rvcihncm91cEJ1aWxkZXI6IEFYUFBlcm1pc3Npb25EZWZpbml0aW9uR3JvdXBCdWlsZGVyLCBwZXJtaXNzaW9uOiBBWFBQZXJtaXNzaW9uRGVmaW5pdGlvbikge1xuICAgICAgICB0aGlzLmdyb3VwQnVpbGRlciA9IGdyb3VwQnVpbGRlcjtcbiAgICAgICAgdGhpcy5wZXJtaXNzaW9uID0gcGVybWlzc2lvbjtcbiAgICB9XG5cbiAgICBhZGRDaGlsZChuYW1lOiBzdHJpbmcsIHRpdGxlOiBzdHJpbmcsIGRlc2NyaXB0aW9uPzogc3RyaW5nLCByZXF1aXJlZEZlYXR1cmVzPzogc3RyaW5nW10pOiBBWFBQZXJtaXNzaW9uRGVmaW5pdGlvbkJ1aWxkZXIge1xuICAgICAgICBjb25zdCBwZXJtaXNzaW9uOiBBWFBQZXJtaXNzaW9uRGVmaW5pdGlvbiA9IHtcbiAgICAgICAgICAgIG5hbWUsXG4gICAgICAgICAgICB0aXRsZSxcbiAgICAgICAgICAgIGRlc2NyaXB0aW9uLFxuICAgICAgICAgICAgY2hpbGRyZW46IFtdLFxuICAgICAgICAgICAgcmVxdWlyZWRGZWF0dXJlc1xuICAgICAgICB9O1xuICAgICAgICB0aGlzLnBlcm1pc3Npb24uY2hpbGRyZW4ucHVzaChwZXJtaXNzaW9uKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0IHJlcXVpcmVkIGZlYXR1cmVzIGZvciB0aGlzIHBlcm1pc3Npb24uXG4gICAgICogQHBhcmFtIGZlYXR1cmVzIC0gQXJyYXkgb2YgZmVhdHVyZSBuYW1lcyAoZS5nLiwgWydQbGF0Zm9ybU1hbmFnZW1lbnQubWVudS1jdXN0b21pemF0aW9uJ10pXG4gICAgICovXG4gICAgcmVxdWlyZUZlYXR1cmVzKC4uLmZlYXR1cmVzOiBzdHJpbmdbXSk6IEFYUFBlcm1pc3Npb25EZWZpbml0aW9uQnVpbGRlciB7XG4gICAgICAgIHRoaXMucGVybWlzc2lvbi5yZXF1aXJlZEZlYXR1cmVzID0gZmVhdHVyZXM7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuXG4gICAgZW5kUGVybWlzc2lvbigpOiBBWFBQZXJtaXNzaW9uRGVmaW5pdGlvbkdyb3VwQnVpbGRlciB7XG4gICAgICAgIHJldHVybiB0aGlzLmdyb3VwQnVpbGRlcjtcbiAgICB9XG59Il19","import { inject, Injectable, InjectionToken } from '@angular/core';\nimport { AXPModuleProviderRegistry } from '@acorex/platform/core';\nimport { AXPPermissionDefinitionProviderContext } from './permission-definition.builder';\nimport { AXPSessionService } from '../session.service';\nimport * as i0 from \"@angular/core\";\nexport const AXP_PERMISSION_DEFINITION_PROVIDER = new InjectionToken('AXP_PERMISSION_DEFINITION_PROVIDER', {\n providedIn: 'root',\n factory: () => {\n return [];\n }\n});\nexport class AXPPermissionDefinitionService {\n constructor() {\n this.providers = inject(AXP_PERMISSION_DEFINITION_PROVIDER, { optional: true });\n this.providerRegistry = inject(AXPModuleProviderRegistry);\n this.sessionService = inject(AXPSessionService);\n this.cache = null;\n }\n async load() {\n if (this.cache) {\n return;\n }\n const context = new AXPPermissionDefinitionProviderContext();\n // Load providers from DI tokens (backward compatibility)\n if (Array.isArray(this.providers)) {\n for (const provider of this.providers) {\n if (provider instanceof Promise) {\n // If provider is a promise, resolve it\n const resolvedProvider = await provider;\n await resolvedProvider.define(context);\n }\n else {\n // If provider is a direct instance, use it directly\n await provider.define(context);\n }\n }\n }\n // Load providers from registry (manifest-based, conditionally loaded)\n const registryProviders = this.providerRegistry.getPermissionProviders();\n for (const provider of registryProviders) {\n await provider.define(context);\n }\n // Filter permissions based on required features\n const allGroups = context.getGroupDefinitions();\n this.cache = this.filterByFeatures(allGroups);\n }\n /**\n * Filter permissions based on required features.\n * Removes permissions that have required features that are not enabled.\n */\n filterByFeatures(groups) {\n return groups.map(group => ({\n ...group,\n permissions: this.filterPermissions(group.permissions)\n })).filter(group => group.permissions.length > 0);\n }\n /**\n * Recursively filter permissions and their children based on required features.\n */\n filterPermissions(permissions) {\n return permissions\n .filter(permission => {\n // Check if required features are enabled\n if (permission.requiredFeatures && permission.requiredFeatures.length > 0) {\n const allFeaturesEnabled = permission.requiredFeatures.every(featureName => this.sessionService.isFeatureEnabled(featureName));\n if (!allFeaturesEnabled) {\n return false; // Filter out this permission\n }\n }\n return true;\n })\n .map(permission => ({\n ...permission,\n children: this.filterPermissions(permission.children)\n }))\n .filter(permission => {\n // Remove permissions that have no children if they were only containers\n // (This is optional - you might want to keep parent permissions even without children)\n return true;\n });\n }\n async reload() {\n this.cache = null;\n await this.load();\n }\n async getGroups() {\n await this.load();\n return this.cache ?? [];\n }\n async getPermissions() {\n await this.load();\n return this.cache?.flatMap(g => g.permissions) ?? [];\n }\n async getGroup(name) {\n await this.load();\n return this.cache?.find(g => g.name === name) ?? null;\n }\n async getPermission(name) {\n await this.load();\n return this.cache?.find(g => g.permissions.find(p => p.name === name))?.permissions.find(p => p.name === name) ?? null;\n }\n static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: \"12.0.0\", version: \"20.3.12\", ngImport: i0, type: AXPPermissionDefinitionService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }\n static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: \"12.0.0\", version: \"20.3.12\", ngImport: i0, type: AXPPermissionDefinitionService, providedIn: 'root' }); }\n}\ni0.ɵɵngDeclareClassMetadata({ minVersion: \"12.0.0\", version: \"20.3.12\", ngImport: i0, type: AXPPermissionDefinitionService, decorators: [{\n type: Injectable,\n args: [{ providedIn: 'root' }]\n }] });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGVybWlzc2lvbi1kZWZpbml0aW9uLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL3BsYXRmb3JtL2F1dGgvc3JjL2xpYi9wZXJtaXNzaW9uL3Blcm1pc3Npb24tZGVmaW5pdGlvbi5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFFLGNBQWMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNuRSxPQUFPLEVBQUUseUJBQXlCLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUVsRSxPQUFPLEVBQUUsc0NBQXNDLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUN6RixPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQzs7QUFRdkQsTUFBTSxDQUFDLE1BQU0sa0NBQWtDLEdBQUcsSUFBSSxjQUFjLENBQW9DLG9DQUFvQyxFQUFFO0lBQzVJLFVBQVUsRUFBRSxNQUFNO0lBQ2xCLE9BQU8sRUFBRSxHQUFHLEVBQUU7UUFDWixPQUFPLEVBQUUsQ0FBQztJQUNaLENBQUM7Q0FDRixDQUFDLENBQUM7QUFJSCxNQUFNLE9BQU8sOEJBQThCO0lBRDNDO1FBRVUsY0FBUyxHQUFHLE1BQU0sQ0FBQyxrQ0FBa0MsRUFBRSxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO1FBQzNFLHFCQUFnQixHQUFHLE1BQU0sQ0FBQyx5QkFBeUIsQ0FBQyxDQUFDO1FBQ3JELG1CQUFjLEdBQUcsTUFBTSxDQUFDLGlCQUFpQixDQUFDLENBQUM7UUFDM0MsVUFBSyxHQUEwQyxJQUFJLENBQUM7S0FrRzdEO0lBL0ZTLEtBQUssQ0FBQyxJQUFJO1FBQ2hCLElBQUksSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQ2YsT0FBTTtRQUNSLENBQUM7UUFDRCxNQUFNLE9BQU8sR0FBRyxJQUFJLHNDQUFzQyxFQUFFLENBQUM7UUFFN0QseURB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SSxFQUFFLENBQUM7SUFDMUIsQ0FBQztJQUVNLEtBQUssQ0FBQyxjQUFjO1FBQ3pCLE1BQU0sSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ2xCLE9BQU8sSUFBSSxDQUFDLEtBQUssRUFBRSxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLElBQUksRUFBRSxDQUFDO0lBQ3ZELENBQUM7SUFFTSxLQUFLLENBQUMsUUFBUSxDQUFDLElBQVk7UUFDaEMsTUFBTSxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDbEIsT0FBTyxJQUFJLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLEtBQUssSUFBSSxDQUFDLElBQUksSUFBSSxDQUFDO0lBQ3hELENBQUM7SUFFTSxLQUFLLENBQUMsYUFBYSxDQUFDLElBQVk7UUFDckMsTUFBTSxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDbEIsT0FBTyxJQUFJLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksS0FBSyxJQUFJLENBQUMsQ0FBQyxFQUFFLFdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxLQUFLLElBQUksQ0FBQyxJQUFJLElBQUksQ0FBQztJQUN6SCxDQUFDOytHQXBHVSw4QkFBOEI7bUhBQTlCLDhCQUE4QixjQURqQixNQUFNOzs0RkFDbkIsOEJBQThCO2tCQUQxQyxVQUFVO21CQUFDLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGluamVjdCwgSW5qZWN0YWJsZSwgSW5qZWN0aW9uVG9rZW4gfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEFYUE1vZHVsZVByb3ZpZGVyUmVnaXN0cnkgfSBmcm9tICdAYWNvcmV4L3BsYXRmb3JtL2NvcmUnO1xuaW1wb3J0IHsgQVhQUGVybWlzc2lvbkRlZmluaXRpb24sIEFYUFBlcm1pc3Npb25Hcm91cERlZmluaXRpb24gfSBmcm9tICcuL3Blcm1pc3Npb24udHlwZXMnO1xuaW1wb3J0IHsgQVhQUGVybWlzc2lvbkRlZmluaXRpb25Qcm92aWRlckNvbnRleHQgfSBmcm9tICcuL3Blcm1pc3Npb24tZGVmaW5pdGlvbi5idWlsZGVyJztcbmltcG9ydCB7IEFYUFNlc3Npb25TZXJ2aWNlIH0gZnJvbSAnLi4vc2Vzc2lvbi5zZXJ2aWNlJztcblxuXG5cbmV4cG9ydCBpbnRlcmZhY2UgQVhQUGVybWlzc2lvbkRlZmluaXRpb25Qcm92aWRlciB7XG4gIGRlZmluZShjb250ZXh0OiBBWFBQZXJtaXNzaW9uRGVmaW5pdGlvblByb3ZpZGVyQ29udGV4dCk6IFByb21pc2U8dm9pZD47XG59XG5cbmV4cG9ydCBjb25zdCBBWFBfUEVSTUlTU0lPTl9ERUZJTklUSU9OX1BST1ZJREVSID0gbmV3IEluamVjdGlvblRva2VuPEFYUFBlcm1pc3Npb25EZWZpbml0aW9uUHJvdmlkZXJbXT4oJ0FYUF9QRVJNSVNTSU9OX0RFRklOSVRJT05fUFJPVklERVInLCB7XG4gIHByb3ZpZGVkSW46ICdyb290JyxcbiAgZmFjdG9yeTogKCkgPT4ge1xuICAgIHJldHVybiBbXTtcbiAgfVxufSk7XG5cblxuQEluamVjdGFibGUoeyBwcm92aWRlZEluOiAncm9vdCcgfSlcbmV4cG9ydCBjbGFzcyBBWFBQZXJtaXNzaW9uRGVmaW5pdGlvblNlcnZpY2Uge1xuICBwcml2YXRlIHByb3ZpZGVycyA9IGluamVjdChBWFBfUEVSTUlTU0lPTl9ERUZJTklUSU9OX1BST1ZJREVSLCB7IG9wdGlvbmFsOiB0cnVlIH0pO1xuICBwcml2YXRlIHByb3ZpZGVyUmVnaXN0cnkgPSBpbmplY3QoQVhQTW9kdWxlUHJvdmlkZXJSZWdpc3RyeSk7XG4gIHByaXZhdGUgc2Vzc2lvblNlcnZpY2UgPSBpbmplY3QoQVhQU2Vzc2lvblNlcnZpY2UpO1xuICBwcml2YXRlIGNhY2hlOiBBWFBQZXJtaXNzaW9uR3JvdXBEZWZpbml0aW9uW10gfCBudWxsID0gbnVsbDtcblxuXG4gIHByaXZhdGUgYXN5bmMgbG9hZCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAodGhpcy5jYWNoZSkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuICAgIGNvbnN0IGNvbnRleHQgPSBuZXcgQVhQUGVybWlzc2lvbkRlZmluaXRpb25Qcm92aWRlckNvbnRleHQoKTtcbiAgICBcbiAgICAvLyBMb2FkIHByb3ZpZGVycyBmcm9tIERJIHRva2VucyAoYmFja3dhcmQgY29tcGF0aWJpbGl0eSlcbiAgICBpZiAoQXJyYXkuaXNBcnJheSh0aGlzLnByb3ZpZGVycykpIHtcbiAgICAgIGZvciAoY29uc3QgcHJvdmlkZXIgb2YgdGhpcy5wcm92aWRlcnMpIHtcbiAgICAgICAgaWYgKHByb3ZpZGVyIGluc3RhbmNlb2YgUHJvbWlzZSkge1xuICAgICAgICAgIC8vIElmIHByb3ZpZGVyIGlzIGEgcHJvbWlzZSwgcmVzb2x2ZSBpdFxuICAgICAgICAgIGNvbnN0IHJlc29sdmVkUHJvdmlkZXIgPSBhd2FpdCBwcm92aWRlcjtcbiAgICAgICAgICBhd2FpdCByZXNvbHZlZFByb3ZpZGVyLmRlZmluZShjb250ZXh0KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBJZiBwcm92aWRlciBpcyBhIGRpcmVjdCBpbnN0YW5jZSwgdXNlIGl0IGRpcmVjdGx5XG4gICAgICAgICAgYXdhaXQgcHJvdmlkZXIuZGVmaW5lKGNvbnRleHQpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gTG9hZCBwcm92aWRlcnMgZnJvbSByZWdpc3RyeSAobWFuaWZlc3QtYmFzZWQsIGNvbmRpdGlvbmFsbHkgbG9hZGVkKVxuICAgIGNvbnN0IHJlZ2lzdHJ5UHJvdmlkZXJzID0gdGhpcy5wcm92aWRlclJlZ2lzdHJ5LmdldFBlcm1pc3Npb25Qcm92aWRlcnMoKTtcbiAgICBmb3IgKGNvbnN0IHByb3ZpZGVyIG9mIHJlZ2lzdHJ5UHJvdmlkZXJzKSB7XG4gICAgICBhd2FpdCBwcm92aWRlci5kZWZpbmUoY29udGV4dCk7XG4gICAgfVxuXG4gICAgLy8gRmlsdGVyIHBlcm1pc3Npb25zIGJhc2VkIG9uIHJlcXVpcmVkIGZlYXR1cmVzXG4gICAgY29uc3QgYWxsR3JvdXBzID0gY29udGV4dC5nZXRHcm91cERlZmluaXRpb25zKCk7XG4gICAgdGhpcy5jYWNoZSA9IHRoaXMuZmlsdGVyQnlGZWF0dXJlcyhhbGxHcm91cHMpO1xuICB9XG5cbiAgLyoqXG4gICAqIEZpbHRlciBwZXJtaXNzaW9ucyBiYXNlZCBvbiByZXF1aXJlZCBmZWF0dXJlcy5cbiAgICogUmVtb3ZlcyBwZXJtaXNzaW9ucyB0aGF0IGhhdmUgcmVxdWlyZWQgZmVhdHVyZXMgdGhhdCBhcmUgbm90IGVuYWJsZWQuXG4gICAqL1xuICBwcml2YXRlIGZpbHRlckJ5RmVhdHVyZXMoZ3JvdXBzOiBBWFBQZXJtaXNzaW9uR3JvdXBEZWZpbml0aW9uW10pOiBBWFBQZXJtaXNzaW9uR3JvdXBEZWZpbml0aW9uW10ge1xuICAgIHJldHVybiBncm91cHMubWFwKGdyb3VwID0+ICh7XG4gICAgICAuLi5ncm91cCxcbiAgICAgIHBlcm1pc3Npb25zOiB0aGlzLmZpbHRlclBlcm1pc3Npb25zKGdyb3VwLnBlcm1pc3Npb25zKVxuICAgIH0pKS5maWx0ZXIoZ3JvdXAgPT4gZ3JvdXAucGVybWlzc2lvbnMubGVuZ3RoID4gMCk7XG4gIH1cblxuICAvKipcbiAgICogUmVjdXJzaXZlbHkgZmlsdGVyIHBlcm1pc3Npb25zIGFuZCB0aGVpciBjaGlsZHJlbiBiYXNlZCBvbiByZXF1aXJlZCBmZWF0dXJlcy5cbiAgICovXG4gIHByaXZhdGUgZmlsdGVyUGVybWlzc2lvbnMocGVybWlzc2lvbnM6IEFYUFBlcm1pc3Npb25EZWZpbml0aW9uW10pOiBBWFBQZXJtaXNzaW9uRGVmaW5pdGlvbltdIHtcbiAgICByZXR1cm4gcGVybWlzc2lvbnNcbiAgICAgIC5maWx0ZXIocGVybWlzc2lvbiA9PiB7XG4gICAgICAgIC8vIENoZWNrIGlmIHJlcXVpcmVkIGZlYXR1cmVzIGFyZSBlbmFibGVkXG4gICAgICAgIGlmIChwZXJtaXNzaW9uLnJlcXVpcmVkRmVhdHVyZXMgJiYgcGVybWlzc2lvbi5yZXF1aXJlZEZlYXR1cmVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBjb25zdCBhbGxGZWF0dXJlc0VuYWJsZWQgPSBwZXJtaXNzaW9uLnJlcXVpcmVkRmVhdHVyZXMuZXZlcnkoZmVhdHVyZU5hbWUgPT5cbiAgICAgICAgICAgIHRoaXMuc2Vzc2lvblNlcnZpY2UuaXNGZWF0dXJlRW5hYmxlZChmZWF0dXJlTmFtZSlcbiAgICAgICAgICApO1xuICAgICAgICAgIGlmICghYWxsRmVhdHVyZXNFbmFibGVkKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7IC8vIEZpbHRlciBvdXQgdGhpcyBwZXJtaXNzaW9uXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfSlcbiAgICAgIC5tYXAocGVybWlzc2lvbiA9PiAoe1xuICAgICAgICAuLi5wZXJtaXNzaW9uLFxuICAgICAgICBjaGlsZHJlbjogdGhpcy5maWx0ZXJQZXJtaXNzaW9ucyhwZXJtaXNzaW9uLmNoaWxkcmVuKVxuICAgICAgfSkpXG4gICAgICAuZmlsdGVyKHBlcm1pc3Npb24gPT4ge1xuICAgICAgICAvLyBSZW1vdmUgcGVybWlzc2lvbnMgdGhhdCBoYXZlIG5vIGNoaWxkcmVuIGlmIHRoZXkgd2VyZSBvbmx5IGNvbnRhaW5lcnNcbiAgICAgICAgLy8gKFRoaXMgaXMgb3B0aW9uYWwgLSB5b3UgbWlnaHQgd2FudCB0byBrZWVwIHBhcmVudCBwZXJtaXNzaW9ucyBldmVuIHdpdGhvdXQgY2hpbGRyZW4pXG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfSk7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgcmVsb2FkKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRoaXMuY2FjaGUgPSBudWxsO1xuICAgIGF3YWl0IHRoaXMubG9hZCgpO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIGdldEdyb3VwcygpOiBQcm9taXNlPEFYUFBlcm1pc3Npb25Hcm91cERlZmluaXRpb25bXT4ge1xuICAgIGF3YWl0IHRoaXMubG9hZCgpO1xuICAgIHJldHVybiB0aGlzLmNhY2hlID8/IFtdO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIGdldFBlcm1pc3Npb25zKCk6IFByb21pc2U8QVhQUGVybWlzc2lvbkRlZmluaXRpb25bXT4ge1xuICAgIGF3YWl0IHRoaXMubG9hZCgpO1xuICAgIHJldHVybiB0aGlzLmNhY2hlPy5mbGF0TWFwKGcgPT4gZy5wZXJtaXNzaW9ucykgPz8gW107XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgZ2V0R3JvdXAobmFtZTogc3RyaW5nKTogUHJvbWlzZTxBWFBQZXJtaXNzaW9uR3JvdXBEZWZpbml0aW9uIHwgbnVsbD4ge1xuICAgIGF3YWl0IHRoaXMubG9hZCgpO1xuICAgIHJldHVybiB0aGlzLmNhY2hlPy5maW5kKGcgPT4gZy5uYW1lID09PSBuYW1lKSA/PyBudWxsO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIGdldFBlcm1pc3Npb24obmFtZTogc3RyaW5nKTogUHJvbWlzZTxBWFBQZXJtaXNzaW9uRGVmaW5pdGlvbiB8IG51bGw+IHtcbiAgICBhd2FpdCB0aGlzLmxvYWQoKTtcbiAgICByZXR1cm4gdGhpcy5jYWNoZT8uZmluZChnID0+IGcucGVybWlzc2lvbnMuZmluZChwID0+IHAubmFtZSA9PT0gbmFtZSkpPy5wZXJtaXNzaW9ucy5maW5kKHAgPT4gcC5uYW1lID09PSBuYW1lKSA/PyBudWxsO1xuICB9XG5cbn1cbiJdfQ==","import { inject } from \"@angular/core\";\nimport { AXPSessionService } from \"../session.service\";\nexport class AXPPermissionEvaluatorScopeProvider {\n constructor() {\n this.sessionService = inject(AXPSessionService);\n }\n async provide(context) {\n context.addScope('permission', {\n /**\n * Check if the current user has all specified permissions\n * @param permissions - Single permission string or array of permission strings\n * @returns boolean - true if user has all permissions, false otherwise\n */\n check: (...permissions) => {\n return this.sessionService.authorize(...permissions);\n },\n /**\n * Check if the current user has any of the specified permissions\n * @param permissions - Array of permission strings\n * @returns boolean - true if user has any of the permissions, false otherwise\n */\n checkAny: (...permissions) => {\n return permissions.some(p => this.sessionService.authorize(p));\n },\n });\n }\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGVybWlzc2lvbi1ldmFsdWF0b3Itc2NvcGUucHJvdmlkZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL3BsYXRmb3JtL2F1dGgvc3JjL2xpYi9wZXJtaXNzaW9uL3Blcm1pc3Npb24tZXZhbHVhdG9yLXNjb3BlLnByb3ZpZGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDdkMsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFFdkQsTUFBTSxPQUFPLG1DQUFtQztJQUFoRDtRQUVjLG1CQUFjLEdBQUcsTUFBTSxDQUFDLGlCQUFpQixDQUFDLENBQUM7SUF1QnpELENBQUM7SUFyQkcsS0FBSyxDQUFDLE9BQU8sQ0FBQyxPQUFtRDtRQUM3RCxPQUFPLENBQUMsUUFBUSxDQUFDLFlBQVksRUFBRTtZQUMzQjs7OztlQUlHO1lBQ0gsS0FBSyxFQUFFLENBQUMsR0FBRyxXQUFxQixFQUFFLEVBQUU7Z0JBQ2hDLE9BQU8sSUFBSSxDQUFDLGNBQWMsQ0FBQyxTQUFTLENBQUMsR0FBRyxXQUFXLENBQUMsQ0FBQztZQUN6RCxDQUFDO1lBRUQ7Ozs7ZUFJRztZQUNILFFBQVEsRUFBRSxDQUFDLEdBQUcsV0FBcUIsRUFBRSxFQUFFO2dCQUNuQyxPQUFPLFdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ25FLENBQUM7U0FDSixDQUFDLENBQUM7SUFDUCxDQUFDO0NBQ0oiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBBWFBFeHByZXNzaW9uRXZhbHVhdG9yU2NvcGVQcm92aWRlciwgQVhQRXhwcmVzc2lvbkV2YWx1YXRvclNjb3BlUHJvdmlkZXJDb250ZXh0IH0gZnJvbSBcIkBhY29yZXgvcGxhdGZvcm0vY29yZVwiO1xuaW1wb3J0IHsgaW5qZWN0IH0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcbmltcG9ydCB7IEFYUFNlc3Npb25TZXJ2aWNlIH0gZnJvbSBcIi4uL3Nlc3Npb24uc2VydmljZVwiO1xuXG5leHBvcnQgY2xhc3MgQVhQUGVybWlzc2lvbkV2YWx1YXRvclNjb3BlUHJvdmlkZXIgaW1wbGVtZW50cyBBWFBFeHByZXNzaW9uRXZhbHVhdG9yU2NvcGVQcm92aWRlciB7XG5cbiAgICBwcm90ZWN0ZWQgc2Vzc2lvblNlcnZpY2UgPSBpbmplY3QoQVhQU2Vzc2lvblNlcnZpY2UpO1xuXG4gICAgYXN5bmMgcHJvdmlkZShjb250ZXh0OiBBWFBFeHByZXNzaW9uRXZhbHVhdG9yU2NvcGVQcm92aWRlckNvbnRleHQpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgY29udGV4dC5hZGRTY29wZSgncGVybWlzc2lvbicsIHtcbiAgICAgICAgICAgIC8qKlxuICAgICAgICAgICAgICogQ2hlY2sgaWYgdGhlIGN1cnJlbnQgdXNlciBoYXMgYWxsIHNwZWNpZmllZCBwZXJtaXNzaW9uc1xuICAgICAgICAgICAgICogQHBhcmFtIHBlcm1pc3Npb25zIC0gU2luZ2xlIHBlcm1pc3Npb24gc3RyaW5nIG9yIGFycmF5IG9mIHBlcm1pc3Npb24gc3RyaW5nc1xuICAgICAgICAgICAgICogQHJldHVybnMgYm9vbGVhbiAtIHRydWUgaWYgdXNlciBoYXMgYWxsIHBlcm1pc3Npb25zLCBmYWxzZSBvdGhlcndpc2VcbiAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgY2hlY2s6ICguLi5wZXJtaXNzaW9uczogc3RyaW5nW10pID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5zZXNzaW9uU2VydmljZS5hdXRob3JpemUoLi4ucGVybWlzc2lvbnMpO1xuICAgICAgICAgICAgfSxcblxuICAgICAgICAgICAgLyoqXG4gICAgICAgICAgICAgKiBDaGVjayBpZiB0aGUgY3VycmVudCB1c2VyIGhhcyBhbnkgb2YgdGhlIHNwZWNpZmllZCBwZXJtaXNzaW9uc1xuICAgICAgICAgICAgICogQHBhcmFtIHBlcm1pc3Npb25zIC0gQXJyYXkgb2YgcGVybWlzc2lvbiBzdHJpbmdzXG4gICAgICAgICAgICAgKiBAcmV0dXJucyBib29sZWFuIC0gdHJ1ZSBpZiB1c2VyIGhhcyBhbnkgb2YgdGhlIHBlcm1pc3Npb25zLCBmYWxzZSBvdGhlcndpc2VcbiAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgY2hlY2tBbnk6ICguLi5wZXJtaXNzaW9uczogc3RyaW5nW10pID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcGVybWlzc2lvbnMuc29tZShwID0+IHRoaXMuc2Vzc2lvblNlcnZpY2UuYXV0aG9yaXplKHApKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgIH0pO1xuICAgIH1cbn0gIl19","import { inject } from '@angular/core';\nimport { first, map } from 'rxjs';\nimport { AXPUnauthenticatedError } from './errors.types';\nimport { AXPSessionService } from './session.service';\nexport const AXPAuthGuard = (route, state) => {\n const sessionService = inject(AXPSessionService);\n return sessionService.isAuthenticatedWithLoading$.pipe(first(), map((value) => {\n if (value) {\n return true;\n }\n throw new AXPUnauthenticatedError(`Access denied. You are not currently logged in. Please log in to access this page. If you continue to see this message after logging in, please contact support.`, {\n redirectUrl: state.url,\n });\n }));\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXV0aC5ndWFyZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvcGxhdGZvcm0vYXV0aC9zcmMvbGliL2F1dGguZ3VhcmQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUV2QyxPQUFPLEVBQUUsS0FBSyxFQUFFLEdBQUcsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUNsQyxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUN6RCxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUV0RCxNQUFNLENBQUMsTUFBTSxZQUFZLEdBQWtCLENBQUMsS0FBNkIsRUFBRSxLQUEwQixFQUFFLEVBQUU7SUFDdkcsTUFBTSxjQUFjLEdBQUcsTUFBTSxDQUFDLGlCQUFpQixDQUFDLENBQUM7SUFDakQsT0FBTyxjQUFjLENBQUMsMkJBQTJCLENBQUMsSUFBSSxDQUNwRCxLQUFLLEVBQUUsRUFDUCxHQUFHLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRTtRQUNaLElBQUksS0FBSyxFQUFFLENBQUM7WUFDVixPQUFPLElBQUksQ0FBQztRQUNkLENBQUM7UUFDRCxNQUFNLElBQUksdUJBQXVCLENBQy9CLGtLQUFrSyxFQUNsSztZQUNFLFdBQVcsRUFBRSxLQUFLLENBQUMsR0FBRztTQUN2QixDQUNGLENBQUM7SUFDSixDQUFDLENBQUMsQ0FDSCxDQUFDO0FBQ0osQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgaW5qZWN0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBBY3RpdmF0ZWRSb3V0ZVNuYXBzaG90LCBDYW5BY3RpdmF0ZUZuLCBSb3V0ZXJTdGF0ZVNuYXBzaG90IH0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcbmltcG9ydCB7IGZpcnN0LCBtYXAgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IEFYUFVuYXV0aGVudGljYXRlZEVycm9yIH0gZnJvbSAnLi9lcnJvcnMudHlwZXMnO1xuaW1wb3J0IHsgQVhQU2Vzc2lvblNlcnZpY2UgfSBmcm9tICcuL3Nlc3Npb24uc2VydmljZSc7XG5cbmV4cG9ydCBjb25zdCBBWFBBdXRoR3VhcmQ6IENhbkFjdGl2YXRlRm4gPSAocm91dGU6IEFjdGl2YXRlZFJvdXRlU25hcHNob3QsIHN0YXRlOiBSb3V0ZXJTdGF0ZVNuYXBzaG90KSA9PiB7XG4gIGNvbnN0IHNlc3Npb25TZXJ2aWNlID0gaW5qZWN0KEFYUFNlc3Npb25TZXJ2aWNlKTtcbiAgcmV0dXJuIHNlc3Npb25TZXJ2aWNlLmlzQXV0aGVudGljYXRlZFdpdGhMb2FkaW5nJC5waXBlKFxuICAgIGZpcnN0KCksXG4gICAgbWFwKCh2YWx1ZSkgPT4ge1xuICAgICAgaWYgKHZhbHVlKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgICAgdGhyb3cgbmV3IEFYUFVuYXV0aGVudGljYXRlZEVycm9yKFxuICAgICAgICBgQWNjZXNzIGRlbmllZC4gWW91IGFyZSBub3QgY3VycmVudGx5IGxvZ2dlZCBpbi4gUGxlYXNlIGxvZyBpbiB0byBhY2Nlc3MgdGhpcyBwYWdlLiBJZiB5b3UgY29udGludWUgdG8gc2VlIHRoaXMgbWVzc2FnZSBhZnRlciBsb2dnaW5nIGluLCBwbGVhc2UgY29udGFjdCBzdXBwb3J0LmAsXG4gICAgICAgIHtcbiAgICAgICAgICByZWRpcmVjdFVybDogc3RhdGUudXJsLFxuICAgICAgICB9LFxuICAgICAgKTtcbiAgICB9KSxcbiAgKTtcbn07XG4iXX0=","import { Inject, NgModule, Optional, inject, provideAppInitializer } from '@angular/core';\nimport { AXP_SESSION_SERVICE } from '@acorex/platform/core';\nimport { AXPAuthStrategyRegistryService } from './auth-registry.service';\nimport { AXPFeatureDirective } from './feature';\nimport { AXPPermissionDirective } from './permission/permission.directive';\nimport { AXPSessionService } from './session.service';\nimport * as i0 from \"@angular/core\";\nexport function initializeAppState(service) {\n return async () => {\n try {\n await service.restoreSession();\n }\n catch (error) {\n console.error(error);\n }\n };\n}\nexport class AXPAuthModule {\n static forRoot(configs) {\n return {\n ngModule: AXPAuthModule,\n providers: [\n ...(configs?.strategies || []),\n {\n provide: 'AXPAuthModuleFactory',\n useFactory: (registry) => () => {\n registry.register(...(configs?.strategies || []));\n },\n deps: [AXPAuthStrategyRegistryService],\n multi: true,\n },\n ],\n };\n }\n static forChild(configs) {\n return {\n ngModule: AXPAuthModule,\n providers: [\n ...(configs?.strategies || []),\n {\n provide: 'AXPAuthModuleFactory',\n useFactory: (registry) => () => {\n registry.register(...(configs?.strategies || []));\n },\n deps: [AXPAuthStrategyRegistryService],\n multi: true,\n },\n ],\n };\n }\n /**\n * @ignore\n */\n constructor(instances) {\n instances?.forEach((f) => {\n f();\n });\n }\n static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: \"12.0.0\", version: \"20.3.12\", ngImport: i0, type: AXPAuthModule, deps: [{ token: 'AXPAuthModuleFactory', optional: true }], target: i0.ɵɵFactoryTarget.NgModule }); }\n static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: \"14.0.0\", version: \"20.3.12\", ngImport: i0, type: AXPAuthModule, declarations: [AXPPermissionDirective, AXPFeatureDirective], exports: [AXPPermissionDirective, AXPFeatureDirective] }); }\n static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: \"12.0.0\", version: \"20.3.12\", ngImport: i0, type: AXPAuthModule, providers: [\n provideAppInitializer(() => {\n const initializerFn = initializeAppState(inject(AXPSessionService));\n return initializerFn();\n }),\n {\n provide: AXP_SESSION_SERVICE,\n useExisting: AXPSessionService,\n },\n ] }); }\n}\ni0.ɵɵngDeclareClassMetadata({ minVersion: \"12.0.0\", version: \"20.3.12\", ngImport: i0, type: AXPAuthModule, decorators: [{\n type: NgModule,\n args: [{\n imports: [],\n exports: [AXPPermissionDirective, AXPFeatureDirective],\n declarations: [AXPPermissionDirective, AXPFeatureDirective],\n providers: [\n provideAppInitializer(() => {\n const initializerFn = initializeAppState(inject(AXPSessionService));\n return initializerFn();\n }),\n {\n provide: AXP_SESSION_SERVICE,\n useExisting: AXPSessionService,\n },\n ],\n }]\n }], ctorParameters: () => [{ type: undefined, decorators: [{\n type: Optional\n }, {\n type: Inject,\n args: ['AXPAuthModuleFactory']\n }] }] });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXV0aC5tb2R1bGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9saWJzL3BsYXRmb3JtL2F1dGgvc3JjL2xpYi9hdXRoLm1vZHVsZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsTUFBTSxFQUF1QixRQUFRLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMvRyxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUM1RCxPQUFPLEVBQUUsOEJBQThCLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUV6RSxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFDaEQsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0sbUNBQW1DLENBQUM7QUFDM0UsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sbUJBQW1CLENBQUM7O0FBTXRELE1BQU0sVUFBVSxrQkFBa0IsQ0FBQyxPQUEwQjtJQUMzRCxPQUFPLEtBQUssSUFBSSxFQUFFO1FBQ2hCLElBQUksQ0FBQztZQUNILE1BQU0sT0FBTyxDQUFDLGNBQWMsRUFBRSxDQUFDO1FBQ2pDLENBQUM7UUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO1lBQ2YsT0FBTyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUN2QixDQUFDO0lBQ0gsQ0FBQyxDQUFDO0FBQ0osQ0FBQztBQWlCRCxNQUFNLE9BQU8sYUFBYTtJQUN4QixNQUFNLENBQUMsT0FBTyxDQUFDLE9BQThCO1FBQzNDLE9BQU87WUFDTCxRQUFRLEVBQUUsYUFBYTtZQUN2QixTQUFTLEVBQUU7Z0JBQ1QsR0FBRyxDQUFDLE9BQU8sRUFBRSxVQUFVLElBQUksRUFBRSxDQUFDO2dCQUM5QjtvQkFDRSxPQUFPLEVBQUUsc0JBQXNCO29CQUMvQixVQUFVLEVBQUUsQ0FBQyxRQUF3QyxFQUFFLEVBQUUsQ0FBQyxHQUFHLEVBQUU7d0JBQzdELFFBQVEsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLE9BQU8sRUFBRSxVQUFVLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQztvQkFDcEQsQ0FBQztvQkFDRCxJQUFJLEVBQUUsQ0FBQyw4QkFBOEIsQ0FBQztvQkFDdEMsS0FBSyxFQUFFLElBQUk7aUJBQ1o7YUFDRjtTQUNGLENBQUM7SUFDSixDQUFDO0lBRUQsTUFBTSxDQUFDLFFBQVEsQ0FBQyxPQUE4QjtRQUM1QyxPQUFPO1lBQ0wsUUFBUSxFQUFFLGFBQWE7WUFDdkIsU0FBUyxFQUFFO2dCQUNULEdBQUcsQ0FBQyxPQUFPLEVBQUUsVUFBVSxJQUFJLEVBQUUsQ0FBQztnQkFDOUI7b0JBQ0UsT0FBTyxFQUFFLHNCQUFzQjtvQkFDL0IsVUFBVSxFQUFFLENBQUMsUUFBd0MsRUFBRSxFQUFFLENBQUMsR0FBRyxFQUFFO3dCQUM3RCxRQUFRLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxPQUFPLEVBQUUsVUFBVSxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUM7b0JBQ3BELENBQUM7b0JBQ0QsSUFBSSxFQUFFLENBQUMsOEJBQThCLENBQUM7b0JBQ3RDLEtBQUssRUFBRSxJQUFJO2lCQUNaO2FBQ0Y7U0FDRixDQUFDO0lBQ0osQ0FBQztJQUVEOztPQUVHO0lBQ0gsWUFBd0QsU0FBZ0I7UUFDdEUsU0FBUyxFQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFO1lBQ3ZCLENBQUMsRUFBRSxDQUFDO1FBQ04sQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDOytHQTFDVSxhQUFhLGtCQXNDUSxzQkFBc0I7Z0hBdEMzQyxhQUFhLGlCQVpULHNCQUFzQixFQUFFLG1CQUFtQixhQURoRCxzQkFBc0IsRUFBRSxtQkFBbUI7Z0hBYTFDLGFBQWEsYUFYYjtZQUNULHFCQUFxQixDQUFDLEdBQUcsRUFBRTtnQkFDekIsTUFBTSxhQUFhLEdBQUcsa0JBQWtCLENBQUMsTUFBTSxDQUFDLGlCQUFpQixDQUFDLENBQUMsQ0FBQztnQkFDcEUsT0FBTyxhQUFhLEVBQUUsQ0FBQztZQUN6QixDQUFDLENBQUM7WUFDRjtnQkFDRSxPQUFPLEVBQUUsbUJBQW1CO2dCQUM1QixXQUFXLEVBQUUsaUJBQWlCO2FBQy9CO1NBQ0Y7OzRGQUVVLGFBQWE7a0JBZnpCLFFBQVE7bUJBQUM7b0JBQ1IsT0FBTyxFQUFFLEVBQUU7b0JBQ1gsT0FBTyxFQUFFLENBQUMsc0JBQXNCLEVBQUUsbUJBQW1CLENBQUM7b0JBQ3RELFlBQVksRUFBRSxDQUFDLHNCQUFzQixFQUFFLG1CQUFtQixDQUFDO29CQUMzRCxTQUFTLEVBQUU7d0JBQ1QscUJBQXFCLENBQUMsR0FBRyxFQUFFOzRCQUN6QixNQUFNLGFBQWEsR0FBRyxrQkFBa0IsQ0FBQyxNQUFNLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxDQUFDOzRCQUNwRSxPQUFPLGFBQWEsRUFBRSxDQUFDO3dCQUN6QixDQUFDLENBQUM7d0JBQ0Y7NEJBQ0UsT0FBTyxFQUFFLG1CQUFtQjs0QkFDNUIsV0FBVyxFQUFFLGlCQUFpQjt5QkFDL0I7cUJBQ0Y7aUJBQ0Y7OzBCQXVDYyxRQUFROzswQkFBSSxNQUFNOzJCQUFDLHNCQUFzQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdCwgTW9kdWxlV2l0aFByb3ZpZGVycywgTmdNb2R1bGUsIE9wdGlvbmFsLCBpbmplY3QsIHByb3ZpZGVBcHBJbml0aWFsaXplciB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQVhQX1NFU1NJT05fU0VSVklDRSB9IGZyb20gJ0BhY29yZXgvcGxhdGZvcm0vY29yZSc7XG5pbXBvcnQgeyBBWFBBdXRoU3RyYXRlZ3lSZWdpc3RyeVNlcnZpY2UgfSBmcm9tICcuL2F1dGgtcmVnaXN0cnkuc2VydmljZSc7XG5pbXBvcnQgeyBBWFBBdXRoU3RyYXRlZ3kgfSBmcm9tICcuL2F1dGguc3RyYXRlZ3knO1xuaW1wb3J0IHsgQVhQRmVhdHVyZURpcmVjdGl2ZSB9IGZyb20gJy4vZmVhdHVyZSc7XG5pbXBvcnQgeyBBWFBQZXJtaXNzaW9uRGlyZWN0aXZlIH0gZnJvbSAnLi9wZXJtaXNzaW9uL3Blcm1pc3Npb24uZGlyZWN0aXZlJztcbmltcG9ydCB7IEFYUFNlc3Npb25TZXJ2aWNlIH0gZnJvbSAnLi9zZXNzaW9uLnNlcnZpY2UnO1xuXG5leHBvcnQgaW50ZXJmYWNlIEFYUEF1dGhNb2R1bGVDb25maWdzIHtcbiAgc3RyYXRlZ2llczogKG5ldyAoKSA9PiBBWFBBdXRoU3RyYXRlZ3kpW107XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpbml0aWFsaXplQXBwU3RhdGUoc2VydmljZTogQVhQU2Vzc2lvblNlcnZpY2UpIHtcbiAgcmV0dXJuIGFzeW5jICgpID0+IHtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgc2VydmljZS5yZXN0b3JlU2Vzc2lvbigpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGVycm9yKTtcbiAgICB9XG4gIH07XG59XG5cbkBOZ01vZHVsZSh7XG4gIGltcG9ydHM6IFtdLFxuICBleHBvcnRzOiBbQVhQUGVybWlzc2lvbkRpcmVjdGl2ZSwgQVhQRmVhdHVyZURpcmVjdGl2ZV0sXG4gIGRlY2xhcmF0aW9uczogW0FYUFBlcm1pc3Npb25EaXJlY3RpdmUsIEFYUEZlYXR1cmVEaXJlY3RpdmVdLFxuICBwcm92aWRlcnM6IFtcbiAgICBwcm92aWRlQXBwSW5pdGlhbGl6ZXIoKCkgPT4ge1xuICAgICAgY29uc3QgaW5pdGlhbGl6ZXJGbiA9IGluaXRpYWxpemVBcHBTdGF0ZShpbmplY3QoQVhQU2Vzc2lvblNlcnZpY2UpKTtcbiAgICAgIHJldHVybiBpbml0aWFsaXplckZuKCk7XG4gICAgfSksXG4gICAge1xuICAgICAgcHJvdmlkZTogQVhQX1NFU1NJT05fU0VSVklDRSxcbiAgICAgIHVzZUV4aXN0aW5nOiBBWFBTZXNzaW9uU2VydmljZSxcbiAgICB9LFxuICBdLFxufSlcbmV4cG9ydCBjbGFzcyBBWFBBdXRoTW9kdWxlIHtcbiAgc3RhdGljIGZvclJvb3QoY29uZmlncz86IEFYUEF1dGhNb2R1bGVDb25maWdzKTogTW9kdWxlV2l0aFByb3ZpZGVyczxBWFBBdXRoTW9kdWxlPiB7XG4gICAgcmV0dXJuIHtcbiAgICAgIG5nTW9kdWxlOiBBWFBBdXRoTW9kdWxlLFxuICAgICAgcHJvdmlkZXJzOiBbXG4gICAgICAgIC4uLihjb25maWdzPy5zdHJhdGVnaWVzIHx8IFtdKSxcbiAgICAgICAge1xuICAgICAgICAgIHByb3ZpZGU6ICdBWFBBdXRoTW9kdWxlRmFjdG9yeScsXG4gICAgICAgICAgdXNlRmFjdG9yeTogKHJlZ2lzdHJ5OiBBWFBBdXRoU3RyYXRlZ3lSZWdpc3RyeVNlcnZpY2UpID0+ICgpID0+IHtcbiAgICAgICAgICAgIHJlZ2lzdHJ5LnJlZ2lzdGVyKC4uLihjb25maWdzPy5zdHJhdGVnaWVzIHx8IFtdKSk7XG4gICAgICAgICAgfSxcbiAgICAgICAgICBkZXBzOiBbQVhQQXV0aFN0cmF0ZWd5UmVnaXN0cnlTZXJ2aWNlXSxcbiAgICAgICAgICBtdWx0aTogdHJ1ZSxcbiAgICAgICAgfSxcbiAgICAgIF0sXG4gICAgfTtcbiAgfVxuXG4gIHN0YXRpYyBmb3JDaGlsZChjb25maWdzPzogQVhQQXV0aE1vZHVsZUNvbmZpZ3MpOiBNb2R1bGVXaXRoUHJvdmlkZXJzPEFYUEF1dGhNb2R1bGU+IHtcbiAgICByZXR1cm4ge1xuICAgICAgbmdNb2R1bGU6IEFYUEF1dGhNb2R1bGUsXG4gICAgICBwcm92aWRlcnM6IFtcbiAgICAgICAgLi4uKGNvbmZpZ3M/LnN0cmF0ZWdpZXMgfHwgW10pLFxuICAgICAgICB7XG4gICAgICAgICAgcHJvdmlkZTogJ0FYUEF1dGhNb2R1bGVGYWN0b3J5JyxcbiAgICAgICAgICB1c2VGYWN0b3J5OiAocmVnaXN0cnk6IEFYUEF1dGhTdHJhdGVneVJlZ2lzdHJ5U2VydmljZSkgPT4gKCkgPT4ge1xuICAgICAgICAgICAgcmVnaXN0cnkucmVnaXN0ZXIoLi4uKGNvbmZpZ3M/LnN0cmF0ZWdpZXMgfHwgW10pKTtcbiAgICAgICAgICB9LFxuICAgICAgICAgIGRlcHM6IFtBWFBBdXRoU3RyYXRlZ3lSZWdpc3RyeVNlcnZpY2VdLFxuICAgICAgICAgIG11bHRpOiB0cnVlLFxuICAgICAgICB9LFxuICAgICAgXSxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIEBpZ25vcmVcbiAgICovXG4gIGNvbnN0cnVjdG9yKEBPcHRpb25hbCgpIEBJbmplY3QoJ0FYUEF1dGhNb2R1bGVGYWN0b3J5JykgaW5zdGFuY2VzOiBhbnlbXSkge1xuICAgIGluc3RhbmNlcz8uZm9yRWFjaCgoZikgPT4ge1xuICAgICAgZigpO1xuICAgIH0pO1xuICB9XG59XG4iXX0=","export class AXPAuthStrategy {\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXV0aC5zdHJhdGVneS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvcGxhdGZvcm0vYXV0aC9zcmMvbGliL2F1dGguc3RyYXRlZ3kudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBZ0NBLE1BQU0sT0FBZ0IsZUFBZTtDQU1wQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEFYUEFwcGxpY2F0aW9uIH0gZnJvbSAnLi9hcHBsaWNhdGlvbi9hcHBsaWNhdGlvbi50eXBlcyc7XG5pbXBvcnQgeyBBWFBTZXNzaW9uQ29udGV4dCB9IGZyb20gJy4vc2Vzc2lvbi50eXBlcyc7XG5pbXBvcnQgeyBBWFBUZW5hbnQgfSBmcm9tICcuL3RlbmFudC90ZW5hbnQudHlwZXMnO1xuaW1wb3J0IHsgQVhQVXNlciB9IGZyb20gJy4vdXNlci91c2VyLnR5cGVzJztcblxuZXhwb3J0IGludGVyZmFjZSBBWFBCYXNlQ3JlZGVudGlhbHMge1xuICBzdHJhdGVneTogc3RyaW5nO1xuICBba2V5OiBzdHJpbmddOiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQVhQVG9rZW5SZXN1bHQge1xuICBhY2Nlc3NUb2tlbjogc3RyaW5nO1xuICBleHBpcmVzSW4/OiBzdHJpbmcgfCBudWxsO1xuICByZWZyZXNoVG9rZW4/OiBzdHJpbmc7XG4gIGlkVG9rZW4/OiBzdHJpbmc7XG4gIHRlbmFudD86IEFYUFRlbmFudCB8IG51bGw7XG4gIGFwcGxpY2F0aW9uPzogQVhQQXBwbGljYXRpb24gfCBudWxsO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEFYUFNpZ25JblJlc3VsdCB7XG4gIHN1Y2NlZWQ6IGJvb2xlYW47XG4gIGRhdGE/OiB7XG4gICAgYWNjZXNzVG9rZW46IHN0cmluZztcbiAgICBpZFRva2VuPzogc3RyaW5nIHwgbnVsbDtcbiAgICBleHBpcmVzSW4/OiBzdHJpbmcgfCBudWxsO1xuICAgIHJlZnJlc2hUb2tlbjogc3RyaW5nO1xuICAgIHVzZXI6IEFYUFVzZXI7XG4gICAgdGVuYW50PzogQVhQVGVuYW50IHwgbnVsbDtcbiAgICBhcHBsaWNhdGlvbj86IEFYUEFwcGxpY2F0aW9uIHwgbnVsbDtcbiAgfTtcbn1cblxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIEFYUEF1dGhTdHJhdGVneSB7XG4gIGFic3RyYWN0IGdldCBuYW1lKCk6IHN0cmluZztcbiAgYWJzdHJhY3Qgc2lnbmluKGNyZWRlbnRpYWxzOiBBWFBCYXNlQ3JlZGVudGlhbHMpOiBQcm9taXNlPEFYUFNpZ25JblJlc3VsdCB8IHZvaWQ+O1xuICBhYnN0cmFjdCBzaWdub3V0KCk6IFByb21pc2U8dm9pZD47XG4gIGFic3RyYWN0IHJlZnJlc2hUb2tlbihjb250ZXh0OiBBWFBTZXNzaW9uQ29udGV4dCk6IFByb21pc2U8QVhQU2lnbkluUmVzdWx0PjtcbiAgYWJzdHJhY3QgdXBkYXRlVG9rZW4ocGFyYW1zPzogeyBba2V5OiBzdHJpbmddOiBhbnkgfSk6IFByb21pc2U8QVhQU2lnbkluUmVzdWx0IHwgdm9pZD47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQVhQU2Vzc2lvbkRhdGEge1xuICBhY2Nlc3NUb2tlbjogc3RyaW5nO1xuICByZWZyZXNoVG9rZW46IHN0cmluZztcbiAgaWRUb2tlbjogc3RyaW5nIHwgbnVsbDtcbiAgc3RyYXRlZ3k6IHN0cmluZztcbiAgdXNlcj86IEFYUFVzZXIgfCBudWxsO1xuICB0ZW5hbnQ/OiBBWFBUZW5hbnQgfCBudWxsO1xuICBhcHBsaWNhdGlvbj86IEFYUEFwcGxpY2F0aW9uIHwgbnVsbDtcbiAgZXhwaXJlc0luPzogc3RyaW5nIHwgbnVsbDtcbn1cbiJdfQ==","//#region ---- JWT Utility ----\n/**\n * Utility class for JWT token operations\n */\nexport class JwtUtil {\n /**\n * Parses a JWT token and returns the payload\n */\n static parseJwt(token) {\n try {\n const base64Url = token.split('.')[1];\n const base64 = base64Url.replace(/-/g, '+').replace(/_/g, '/');\n const jsonPayload = decodeURIComponent(atob(base64)\n .split('')\n .map(c => '%' + ('00' + c.charCodeAt(0).toString(16)).slice(-2))\n .join(''));\n return JSON.parse(jsonPayload);\n }\n catch (error) {\n throw new Error('Invalid JWT token');\n }\n }\n}\n//#endregion\n//#region ---- PKCE Utility ----\n/**\n * Utility class for PKCE (Proof Key for Code Exchange) operations\n */\nexport class PkceUtil {\n /**\n * Generates a random string for PKCE code verifier\n */\n static generateRandomString(length) {\n const array = new Uint8Array(length);\n crypto.getRandomValues(array);\n return this.base64UrlEncode(array);\n }\n /**\n * Generates PKCE code challenge from verifier\n */\n static async generateCodeChallenge(codeVerifier) {\n const encoder = new TextEncoder();\n const data = encoder.encode(codeVerifier);\n const digest = await crypto.subtle.digest('SHA-256', data);\n return this.base64UrlEncode(new Uint8Array(digest));\n }\n /**\n * Base64 URL encoding for PKCE\n */\n static base64UrlEncode(array) {\n return btoa(String.fromCharCode(...array))\n .replace(/\\+/g, '-')\n .replace(/\\//g, '_')\n .replace(/=/g, '');\n }\n}\n//#endregion\n//#region ---- Time Utility ----\n/**\n * Utility class for time and date operations\n */\nexport class TimeUtil {\n /**\n * Calculates the time difference in milliseconds between a future date and now\n */\n static expiresInMilliseconds(expiresInDate) {\n return new Date(expiresInDate).getTime() - new Date().getTime();\n }\n /**\n * Calculates expiration date from seconds\n */\n static calculateExpireInDate(expireInSeconds) {\n return new Date(Date.now() + expireInSeconds * 1000).toISOString();\n }\n}\n//#endregion \n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXV0aC51dGlscy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvcGxhdGZvcm0vYXV0aC9zcmMvbGliL2F1dGgudXRpbHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsbUNBQW1DO0FBRW5DOztHQUVHO0FBQ0gsTUFBTSxPQUFPLE9BQU87SUFDbEI7O09BRUc7SUFDSCxNQUFNLENBQUMsUUFBUSxDQUFDLEtBQWE7UUFDM0IsSUFBSSxDQUFDO1lBQ0gsTUFBTSxTQUFTLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUN0QyxNQUFNLE1BQU0sR0FBRyxTQUFTLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLEdBQUcsQ0FBQyxDQUFDO1lBQy9ELE1BQU0sV0FBVyxHQUFHLGtCQUFrQixDQUNwQyxJQUFJLENBQUMsTUFBTSxDQUFDO2lCQUNULEtBQUssQ0FBQyxFQUFFLENBQUM7aUJBQ1QsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxHQUFHLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7aUJBQy9ELElBQUksQ0FBQyxFQUFFLENBQUMsQ0FDWixDQUFDO1lBQ0YsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBQ2pDLENBQUM7UUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO1lBQ2YsTUFBTSxJQUFJLEtBQUssQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO1FBQ3ZDLENBQUM7SUFDSCxDQUFDO0NBQ0Y7QUFFRCxZQUFZO0FBRVosb0NBQW9DO0FBRXBDOztHQUVHO0FBQ0gsTUFBTSxPQUFPLFFBQVE7SUFDbkI7O09BRUc7SUFDSCxNQUFNLENBQUMsb0JBQW9CLENBQUMsTUFBYztRQUN4QyxNQUFNLEtBQUssR0FBRyxJQUFJLFVBQVUsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUNyQyxNQUFNLENBQUMsZUFBZSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzlCLE9BQU8sSUFBSSxDQUFDLGVBQWUsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUNyQyxDQUFDO0lBRUQ7O09BRUc7SUFDSCxNQUFNLENBQUMsS0FBSyxDQUFDLHFCQUFxQixDQUFDLFlBQW9CO1FBQ3JELE1BQU0sT0FBTyxHQUFHLElBQUksV0FBVyxFQUFFLENBQUM7UUFDbEMsTUFBTSxJQUFJLEdBQUcsT0FBTyxDQUFDLE1BQU0sQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUMxQyxNQUFNLE1BQU0sR0FBRyxNQUFNLE1BQU0sQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLFNBQVMsRUFBRSxJQUFJLENBQUMsQ0FBQztRQUMzRCxPQUFPLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxVQUFVLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztJQUN0RCxDQUFDO0lBRUQ7O09BRUc7SUFDSyxNQUFNLENBQUMsZUFBZSxDQUFDLEtBQWlCO1FBQzlDLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxZQUFZLENBQUMsR0FBRyxLQUFLLENBQUMsQ0FBQzthQUN2QyxPQUFPLENBQUMsS0FBSyxFQUFFLEdBQUcsQ0FBQzthQUNuQixPQUFPLENBQUMsS0FBSyxFQUFFLEdBQUcsQ0FBQzthQUNuQixPQUFPLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxDQUFDO0lBQ3ZCLENBQUM7Q0FDRjtBQUVELFlBQVk7QUFFWixvQ0FBb0M7QUFFcEM7O0dBRUc7QUFDSCxNQUFNLE9BQU8sUUFBUTtJQUNuQjs7T0FFRztJQUNILE1BQU0sQ0FBQyxxQkFBcUIsQ0FBQyxhQUFxQjtRQUNoRCxPQUFPLElBQUksSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDLE9BQU8sRUFBRSxHQUFHLElBQUksSUFBSSxFQUFFLENBQUMsT0FBTyxFQUFFLENBQUM7SUFDbEUsQ0FBQztJQUVEOztPQUVHO0lBQ0gsTUFBTSxDQUFDLHFCQUFxQixDQUFDLGVBQXVCO1FBQ2xELE9BQU8sSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxHQUFHLGVBQWUsR0FBRyxJQUFJLENBQUMsQ0FBQyxXQUFXLEVBQUUsQ0FBQztJQUNyRSxDQUFDO0NBQ0Y7QUFFRCxhQUFhIiwic291cmNlc0NvbnRlbnQiOlsiLy8jcmVnaW9uIC0tLS0gICBKV1QgVXRpbGl0eSAgIC0tLS1cblxuLyoqXG4gKiBVdGlsaXR5IGNsYXNzIGZvciBKV1QgdG9rZW4gb3BlcmF0aW9uc1xuICovXG5leHBvcnQgY2xhc3MgSnd0VXRpbCB7XG4gIC8qKlxuICAgKiBQYXJzZXMgYSBKV1QgdG9rZW4gYW5kIHJldHVybnMgdGhlIHBheWxvYWRcbiAgICovXG4gIHN0YXRpYyBwYXJzZUp3dCh0b2tlbjogc3RyaW5nKTogYW55IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgYmFzZTY0VXJsID0gdG9rZW4uc3BsaXQoJy4nKVsxXTtcbiAgICAgIGNvbnN0IGJhc2U2NCA9IGJhc2U2NFVybC5yZXBsYWNlKC8tL2csICcrJykucmVwbGFjZSgvXy9nLCAnLycpO1xuICAgICAgY29uc3QganNvblBheWxvYWQgPSBkZWNvZGVVUklDb21wb25lbnQoXG4gICAgICAgIGF0b2IoYmFzZTY0KVxuICAgICAgICAgIC5zcGxpdCgnJylcbiAgICAgICAgICAubWFwKGMgPT4gJyUnICsgKCcwMCcgKyBjLmNoYXJDb2RlQXQoMCkudG9TdHJpbmcoMTYpKS5zbGljZSgtMikpXG4gICAgICAgICAgLmpvaW4oJycpXG4gICAgICApO1xuICAgICAgcmV0dXJuIEpTT04ucGFyc2UoanNvblBheWxvYWQpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgSldUIHRva2VuJyk7XG4gICAgfVxuICB9XG59XG5cbi8vI2VuZHJlZ2lvblxuXG4vLyNyZWdpb24gLS0tLSAgIFBLQ0UgVXRpbGl0eSAgIC0tLS1cblxuLyoqXG4gKiBVdGlsaXR5IGNsYXNzIGZvciBQS0NFIChQcm9vZiBLZXkgZm9yIENvZGUgRXhjaGFuZ2UpIG9wZXJhdGlvbnNcbiAqL1xuZXhwb3J0IGNsYXNzIFBrY2VVdGlsIHtcbiAgLyoqXG4gICAqIEdlbmVyYXRlcyBhIHJhbmRvbSBzdHJpbmcgZm9yIFBLQ0UgY29kZSB2ZXJpZmllclxuICAgKi9cbiAgc3RhdGljIGdlbmVyYXRlUmFuZG9tU3RyaW5nKGxlbmd0aDogbnVtYmVyKTogc3RyaW5nIHtcbiAgICBjb25zdCBhcnJheSA9IG5ldyBVaW50OEFycmF5KGxlbmd0aCk7XG4gICAgY3J5cHRvLmdldFJhbmRvbVZhbHVlcyhhcnJheSk7XG4gICAgcmV0dXJuIHRoaXMuYmFzZTY0VXJsRW5jb2RlKGFycmF5KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZW5lcmF0ZXMgUEtDRSBjb2RlIGNoYWxsZW5nZSBmcm9tIHZlcmlmaWVyXG4gICAqL1xuICBzdGF0aWMgYXN5bmMgZ2VuZXJhdGVDb2RlQ2hhbGxlbmdlKGNvZGVWZXJpZmllcjogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBjb25zdCBlbmNvZGVyID0gbmV3IFRleHRFbmNvZGVyKCk7XG4gICAgY29uc3QgZGF0YSA9IGVuY29kZXIuZW5jb2RlKGNvZGVWZXJpZmllcik7XG4gICAgY29uc3QgZGlnZXN0ID0gYXdhaXQgY3J5cHRvLnN1YnRsZS5kaWdlc3QoJ1NIQS0yNTYnLCBkYXRhKTtcbiAgICByZXR1cm4gdGhpcy5iYXNlNjRVcmxFbmNvZGUobmV3IFVpbnQ4QXJyYXkoZGlnZXN0KSk7XG4gIH1cblxuICAvKipcbiAgICogQmFzZTY0IFVSTCBlbmNvZGluZyBmb3IgUEtDRVxuICAgKi9cbiAgcHJpdmF0ZSBzdGF0aWMgYmFzZTY0VXJsRW5jb2RlKGFycmF5OiBVaW50OEFycmF5KTogc3RyaW5nIHtcbiAgICByZXR1cm4gYnRvYShTdHJpbmcuZnJvbUNoYXJDb2RlKC4uLmFycmF5KSlcbiAgICAgIC5yZXBsYWNlKC9cXCsvZywgJy0nKVxuICAgICAgLnJlcGxhY2UoL1xcLy9nLCAnXycpXG4gICAgICAucmVwbGFjZSgvPS9nLCAnJyk7XG4gIH1cbn1cblxuLy8jZW5kcmVnaW9uXG5cbi8vI3JlZ2lvbiAtLS0tICAgVGltZSBVdGlsaXR5ICAgLS0tLVxuXG4vKipcbiAqIFV0aWxpdHkgY2xhc3MgZm9yIHRpbWUgYW5kIGRhdGUgb3BlcmF0aW9uc1xuICovXG5leHBvcnQgY2xhc3MgVGltZVV0aWwge1xuICAvKipcbiAgICogQ2FsY3VsYXRlcyB0aGUgdGltZSBkaWZmZXJlbmNlIGluIG1pbGxpc2Vjb25kcyBiZXR3ZWVuIGEgZnV0dXJlIGRhdGUgYW5kIG5vd1xuICAgKi9cbiAgc3RhdGljIGV4cGlyZXNJbk1pbGxpc2Vjb25kcyhleHBpcmVzSW5EYXRlOiBzdHJpbmcpOiBudW1iZXIge1xuICAgIHJldHVybiBuZXcgRGF0ZShleHBpcmVzSW5EYXRlKS5nZXRUaW1lKCkgLSBuZXcgRGF0ZSgpLmdldFRpbWUoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDYWxjdWxhdGVzIGV4cGlyYXRpb24gZGF0ZSBmcm9tIHNlY29uZHNcbiAgICovXG4gIHN0YXRpYyBjYWxjdWxhdGVFeHBpcmVJbkRhdGUoZXhwaXJlSW5TZWNvbmRzOiBudW1iZXIpOiBzdHJpbmcge1xuICAgIHJldHVybiBuZXcgRGF0ZShEYXRlLm5vdygpICsgZXhwaXJlSW5TZWNvbmRzICogMTAwMCkudG9JU09TdHJpbmcoKTtcbiAgfVxufVxuXG4vLyNlbmRyZWdpb24gIl19","/**\n * Generated bundle index. Do not edit.\n */\nexport * from './index';\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWNvcmV4LXBsYXRmb3JtLWF1dGguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9saWJzL3BsYXRmb3JtL2F1dGgvc3JjL2Fjb3JleC1wbGF0Zm9ybS1hdXRoLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOztHQUVHO0FBRUgsY0FBYyxTQUFTLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEdlbmVyYXRlZCBidW5kbGUgaW5kZXguIERvIG5vdCBlZGl0LlxuICovXG5cbmV4cG9ydCAqIGZyb20gJy4vaW5kZXgnO1xuIl19"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"acorex-platform-auth.mjs","sources":["../../../../libs/platform/auth/src/lib/application/application.loader.ts","../../../../libs/platform/auth/src/lib/tenant/tenant.loader.ts","../../../../libs/platform/auth/src/lib/auth-registry.service.ts","../../../../libs/platform/auth/src/lib/feature/feature.loader.ts","../../../../libs/platform/auth/src/lib/feature/feature.directive.ts","../../../../libs/platform/auth/src/lib/errors.types.ts","../../../../libs/platform/auth/src/lib/feature/feature.guard.ts","../../../../libs/platform/auth/src/lib/feature/feature-checker.token.ts","../../../../libs/platform/auth/src/lib/permission/permission.loader.ts","../../../../libs/platform/auth/src/lib/permission/permission-checker.token.ts","../../../../libs/platform/auth/src/lib/session.types.ts","../../../../libs/platform/auth/src/lib/session.service.ts","../../../../libs/platform/auth/src/lib/permission/permission.directive.ts","../../../../libs/platform/auth/src/lib/permission/permission.guard.ts","../../../../libs/platform/auth/src/lib/permission/permission-definition.builder.ts","../../../../libs/platform/auth/src/lib/permission/permission-definition.service.ts","../../../../libs/platform/auth/src/lib/permission/permission-definitions.datasource.ts","../../../../libs/platform/auth/src/lib/permission/permission-evaluator-scope.provider.ts","../../../../libs/platform/auth/src/lib/auth.guard.ts","../../../../libs/platform/auth/src/lib/auth.module.ts","../../../../libs/platform/auth/src/lib/auth.strategy.ts","../../../../libs/platform/auth/src/lib/auth.utils.ts","../../../../libs/platform/auth/src/lib/challenge/challenge.types.ts","../../../../libs/platform/auth/src/lib/challenge/challenge.provider.ts","../../../../libs/platform/auth/src/lib/challenge/challenge.token.ts","../../../../libs/platform/auth/src/lib/challenge/challenge-component.base.ts","../../../../libs/platform/auth/src/acorex-platform-auth.ts"],"sourcesContent":["import { InjectionToken } from '@angular/core';\nimport { AXPSessionContext } from '../session.types';\nimport { AXPApplication } from './application.types';\n\nexport interface AXPApplicationLoader {\n getList(context: AXPSessionContext): Promise<AXPApplication[]>;\n}\n\nexport const AXP_APPLICATION_LOADER = new InjectionToken<AXPApplicationLoader>('AXP_APPLICATION_LOADER', {\n providedIn: 'root',\n factory: () => {\n return new AXPApplicationDefaultLoader();\n },\n});\n\nclass AXPApplicationDefaultLoader implements AXPApplicationLoader {\n async getList(context: AXPSessionContext): Promise<AXPApplication[]> {\n return [\n {\n id: '1',\n name: 'default-app',\n title: 'Default Application',\n version: '1.0.0',\n edition: {\n id: 'default-edition-1',\n title: 'Standard',\n },\n },\n {\n id: '2',\n name: 'default-app',\n title: 'Default Application',\n version: '1.0.0',\n edition: {\n id: 'default-edition-2',\n title: 'Standard',\n },\n },\n ];\n }\n}\n","import { InjectionToken } from '@angular/core';\nimport { AXPTenant } from './tenant.types';\nimport { AXPSessionContext } from '../session.types';\n\nexport interface AXPTenantLoader {\n getList(context: AXPSessionContext): Promise<AXPTenant[]>;\n}\n\nexport const AXP_TENANT_LOADER = new InjectionToken<AXPTenantLoader>('AXP_TENANT_LOADER', {\n providedIn: 'root',\n factory: () => {\n return new AXPTenantDefaultLoader();\n },\n});\n\nclass AXPTenantDefaultLoader implements AXPTenantLoader {\n async getList(context: AXPSessionContext): Promise<AXPTenant[]> {\n return [\n {\n id: '1',\n name: 'default-tenant',\n title: 'Default Tenant',\n },\n ];\n }\n}\n","import { Injectable, Injector } from \"@angular/core\";\nimport { AXPAuthStrategy } from \"./auth.strategy\";\n\n@Injectable({\n providedIn: 'root'\n})\nexport class AXPAuthStrategyRegistryService {\n private strategies = new Map<string, AXPAuthStrategy>();\n\n private injector: Injector;\n\n constructor(injector: Injector) {\n this.injector = injector;\n }\n\n register(...plugins: (new () => AXPAuthStrategy)[]) {\n plugins.forEach(t => {\n const childInjector = Injector.create({ providers: [{ provide: t, useClass: t, deps: [] }], parent: this.injector });\n const strategy = childInjector.get(t);\n if (strategy) {\n this.strategies.set(strategy.name, strategy);\n }\n })\n }\n\n get(strategyKey: string): AXPAuthStrategy | undefined {\n return this.strategies.get(strategyKey);\n }\n}","import { InjectionToken } from '@angular/core';\nimport { AXPFeature } from './feature.types';\nimport { AXPSessionContext } from '../session.types';\n\nexport interface AXPFeatureLoader {\n getList(context: AXPSessionContext): Promise<AXPFeature[]>;\n}\n\nexport const AXP_FEATURE_LOADER = new InjectionToken<AXPFeatureLoader>('AXP_FEATURE_LOADER', {\n providedIn: 'root',\n factory: () => {\n return new AXPFeatureDefaultLoader();\n },\n});\n\nclass AXPFeatureDefaultLoader implements AXPFeatureLoader {\n async getList(context: AXPSessionContext): Promise<AXPFeature[]> {\n return [];\n }\n}\n","import { Directive, Input, TemplateRef, ViewContainerRef, inject, signal } from '@angular/core';\nimport { Subscription, first } from 'rxjs';\nimport { AXPSessionService } from '../session.service';\n\n@Directive({\n selector: '[feature]',\n standalone: false\n})\nexport class AXPFeatureDirective {\n private hasView = signal(false);\n private subscription!: Subscription;\n private sessionService = inject(AXPSessionService);\n\n constructor(\n private templateRef: TemplateRef<any>,\n private viewContainer: ViewContainerRef\n ) { }\n\n @Input()\n public set feature(featureKeys: string | string[] | null) {\n const keys: string[] = !featureKeys ? [] : (Array.isArray(featureKeys) ? featureKeys : [featureKeys]);\n if (keys.length == 0) {\n // If featureKey is null or empty, decide the default behavior here\n this.viewContainer.createEmbeddedView(this.templateRef);\n this.hasView.set(true);\n return;\n }\n this.subscription = this.sessionService.features$\n //.pipe(first())\n .subscribe(() => {\n if (this.sessionService.isFeatureEnabled(...keys)) {\n if (!this.hasView()) {\n this.viewContainer.createEmbeddedView(this.templateRef);\n this.hasView.set(true);\n }\n } else {\n this.viewContainer.clear();\n this.hasView.set(false);\n }\n });\n }\n\n @Input()\n public set featureElse(elseTemplateRef: TemplateRef<any>) {\n if (!this.hasView()) {\n this.viewContainer.createEmbeddedView(elseTemplateRef);\n }\n }\n\n ngOnDestroy() {\n this.subscription?.unsubscribe();\n }\n}\n","export class AXPUnauthorizedError extends Error {\n constructor(message?: string, public data?: { redirectUrl?: string }) {\n super(message);\n this.name = 'AXPUnauthorizedError';\n }\n}\n\n\nexport class AXPUnauthenticatedError extends Error {\n constructor(message?: string, public data?: { redirectUrl?: string }) {\n super(message);\n this.name = 'AXPUnauthenticatedError';\n }\n}","import { ActivatedRouteSnapshot, CanActivateFn, RouterStateSnapshot, UrlTree } from \"@angular/router\";\nimport { inject } from \"@angular/core\";\nimport { AXPSessionService } from \"../session.service\";\nimport { Observable, first, map } from \"rxjs\";\nimport { AXPUnauthorizedError } from \"../errors.types\";\n\n\nexport const AXPFeatureGuard: CanActivateFn =\n (route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable<boolean | UrlTree> => {\n const sessionService = inject(AXPSessionService);\n const requiredFeatures = route.data['requiredFeature'] as (string | string[] | null);\n\n return sessionService.features$.pipe(\n map(() => {\n const keys: string[] = !requiredFeatures ? [] : (Array.isArray(requiredFeatures) ? requiredFeatures : [requiredFeatures]);\n const hasFeature = keys.length == 0 || sessionService.isFeatureEnabled(...keys);\n if (!hasFeature) {\n throw new AXPUnauthorizedError(\n `Access Denied. You do not have access to this feature. Required feature(s): ${keys.join(', ')}. Please contact support if you need access.`,\n {\n redirectUrl: state.url\n }\n );\n }\n return true;\n })\n );\n };\n","import { InjectionToken } from '@angular/core';\nimport { AXPFeatureChecker } from './feature-checker.types';\n\n/**\n * Optional injection token for feature checker.\n * If provided, the checker will be called to potentially override\n * feature enablement results based on custom logic.\n */\nexport const AXP_FEATURE_CHECKER = new InjectionToken<AXPFeatureChecker>(\n 'AXP_FEATURE_CHECKER'\n);\n\n","import { InjectionToken } from \"@angular/core\";\nimport { AXPPermission } from \"./permission.types\";\nimport { AXPSessionContext } from \"../session.types\";\n\nexport interface AXPPermissionLoader {\n getList(context: AXPSessionContext): Promise<AXPPermission[]>;\n}\n\nexport const AXP_PERMISSION_LOADER = new InjectionToken<AXPPermissionLoader>('AXP_PERMISSION_LOADER', {\n providedIn: 'root',\n factory: () => {\n return new AXPPermissionDefaultLoader();\n }\n});\n\n\nclass AXPPermissionDefaultLoader implements AXPPermissionLoader {\n async getList(context: AXPSessionContext): Promise<AXPPermission[]> {\n return [];\n }\n}","import { InjectionToken } from '@angular/core';\nimport { AXPPermissionChecker } from './permission-checker.types';\n\n/**\n * Optional injection token for permission checker.\n * If provided, the checker will be called to potentially override\n * authorization results based on custom logic.\n */\nexport const AXP_PERMISSION_CHECKER = new InjectionToken<AXPPermissionChecker>(\n 'AXP_PERMISSION_CHECKER'\n);\n\n","import { AXPApplication } from \"./application/application.types\";\nimport { AXPTenant } from \"./tenant/tenant.types\";\nimport { AXPUser } from \"./user/user.types\";\n\nexport class AXPSessionContext {\n\n private _user: AXPUser | null = null;\n public get user(): AXPUser | null {\n return this._user;\n }\n\n private _tenant: AXPTenant | null = null;\n public get tenant(): AXPTenant | null {\n return this._tenant;\n }\n\n private _application: AXPApplication | null = null;\n public get application(): AXPApplication | null {\n return this._application;\n }\n\n constructor(context: {\n user: AXPUser | null,\n tenant: AXPTenant | null,\n application: AXPApplication | null,\n }) {\n this._user = context.user;\n this._tenant = context.tenant;\n this._application = context.application;\n }\n}\n\n\nexport enum AXPSessionStatus {\n Authenticated = \"authenticated\",\n Unauthenticated = \"unauthenticated\",\n Unauthorized = \"unauthorized\",\n Authorized = \"authorized\",\n Expired = \"expired\",\n SignedOut = \"signedOut\"\n}","import { AXPBroadcastEventService } from '@acorex/platform/core';\nimport { Injectable, inject, Injector } from '@angular/core';\nimport { isEmpty } from 'lodash-es';\nimport { BehaviorSubject, Observable, defaultIfEmpty, filter, from, map, shareReplay, switchMap } from 'rxjs';\nimport { AXP_APPLICATION_LOADER } from './application/application.loader';\nimport { AXPApplication } from './application/application.types';\nimport { AXPAuthStrategyRegistryService } from './auth-registry.service';\nimport { AXPBaseCredentials, AXPSessionData } from './auth.strategy';\nimport { AXPFeature, AXP_FEATURE_LOADER, AXP_FEATURE_CHECKER } from './feature';\nimport { AXP_PERMISSION_LOADER } from './permission/permission.loader';\nimport { AXP_PERMISSION_CHECKER } from './permission/permission-checker.token';\nimport { AXPPermission } from './permission/permission.types';\nimport { AXPSessionContext, AXPSessionStatus } from './session.types';\nimport { AXP_TENANT_LOADER } from './tenant/tenant.loader';\nimport { AXPTenant } from './tenant/tenant.types';\nimport { AXPUser } from './user/user.types';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class AXPSessionService {\n private eventService = inject(AXPBroadcastEventService);\n\n private authStrategyRegistry = inject(AXPAuthStrategyRegistryService);\n private readonly injector = inject(Injector);\n public static readonly SESSION_KEY = 'AXP_SESSION';\n\n private readonly permissionLoader = inject(AXP_PERMISSION_LOADER);\n private readonly featureLoader = inject(AXP_FEATURE_LOADER);\n private readonly tenantLoader = inject(AXP_TENANT_LOADER);\n private readonly applicationLoader = inject(AXP_APPLICATION_LOADER);\n private readonly permissionChecker = inject(AXP_PERMISSION_CHECKER, { optional: true });\n private readonly featureChecker = inject(AXP_FEATURE_CHECKER, { optional: true });\n\n\n\n private status = new BehaviorSubject<AXPSessionStatus>(AXPSessionStatus.Unauthenticated);\n public readonly status$ = this.status.asObservable().pipe(shareReplay(1));\n\n // Add loading state to prevent premature redirects\n private isLoading = new BehaviorSubject<boolean>(true);\n public readonly isLoading$ = this.isLoading.asObservable().pipe(shareReplay(1));\n\n private currentUserSubject = new BehaviorSubject<AXPUser | null>(null);\n public readonly user$ = this.currentUserSubject.asObservable().pipe(shareReplay(1));\n public get user(): AXPUser | null {\n const session = this.getSessionData();\n if (session?.user && !this.currentUserSubject.value) {\n this.currentUserSubject.next(session.user);\n }\n return this.currentUserSubject.value;\n }\n\n private currentTenantSubject = new BehaviorSubject<AXPTenant | null>(null);\n public readonly tenant$ = this.currentTenantSubject.asObservable().pipe(shareReplay(1));\n public get tenant(): AXPTenant | null {\n const session = this.getSessionData();\n if (session?.tenant && !this.currentTenantSubject.value) {\n this.currentTenantSubject.next(session.tenant);\n }\n return this.currentTenantSubject.value;\n }\n\n public get tenants$(): Observable<AXPTenant[]> {\n return from(this.tenantLoader.getList(this.getContext()));\n }\n\n private currentApplicationSubject = new BehaviorSubject<AXPApplication | null>(null);\n public readonly application$ = this.currentApplicationSubject.asObservable().pipe(shareReplay(1));\n public get application(): AXPApplication | null {\n const session = this.getSessionData();\n if (session?.application && !this.currentApplicationSubject.value) {\n this.currentApplicationSubject.next(session.application);\n }\n return this.currentApplicationSubject.value;\n }\n\n public get applications$(): Observable<AXPApplication[]> {\n return from(this.applicationLoader.getList(this.getContext()));\n }\n\n private permissionsSubject = new BehaviorSubject<AXPPermission[]>([]);\n public readonly permissions$ = this.permissionsSubject.asObservable().pipe(shareReplay(1), defaultIfEmpty([]));\n public get permissions(): AXPPermission[] {\n return this.permissionsSubject.value ?? [];\n }\n\n private featuresSubject = new BehaviorSubject<AXPFeature[]>([]);\n public readonly features$ = this.featuresSubject.asObservable().pipe(shareReplay(1), defaultIfEmpty([]));\n public get features(): AXPFeature[] {\n return this.featuresSubject.value ?? [];\n }\n\n public readonly isAuthenticated$ = this.status$.pipe(\n map((status) => {\n const isAuth = status === AXPSessionStatus.Authenticated || status === AXPSessionStatus.Authorized;\n return isAuth;\n }),\n shareReplay(1),\n );\n\n // Add a new observable that considers loading state\n public readonly isAuthenticatedWithLoading$ = this.isLoading$.pipe(\n switchMap((loading) => {\n if (loading) {\n // Wait for loading to complete, then return authentication status\n return this.isLoading$.pipe(\n filter((isLoading) => !isLoading),\n switchMap(() => this.isAuthenticated$),\n );\n }\n // If not loading, return current authentication status\n return this.isAuthenticated$;\n }),\n shareReplay(1),\n );\n\n public readonly isAuthorized$ = this.status$.pipe(\n map((status) => status === AXPSessionStatus.Authorized),\n shareReplay(1),\n );\n\n public async restoreSession(): Promise<void> {\n this.isLoading.next(true);\n\n try {\n const sessionData = this.getSessionData();\n if (sessionData) {\n if (sessionData.user) {\n this.currentUserSubject.next(sessionData.user);\n\n // Restore tenant and application from session data\n if (sessionData.tenant) {\n this.currentTenantSubject.next(sessionData.tenant);\n }\n if (sessionData.application) {\n this.currentApplicationSubject.next(sessionData.application);\n }\n\n this.status.next(AXPSessionStatus.Authenticated);\n\n\n\n await this.loadPermissions();\n await this.loadFeatures();\n await this.signInComplete();\n }\n } else {\n this.status.next(AXPSessionStatus.Unauthorized);\n }\n } catch (error) {\n this.status.next(AXPSessionStatus.Unauthorized);\n } finally {\n this.isLoading.next(false);\n }\n }\n\n async signin(credentials: AXPBaseCredentials): Promise<void> {\n this.isLoading.next(true);\n try {\n //\n // this.clearSession();\n //\n const strategy = this.authStrategyRegistry.get(credentials.strategy);\n if (!strategy) {\n throw new Error(`Authentication strategy '${credentials.strategy}' is not supported`);\n }\n const result = await strategy.signin(credentials);\n if (!result) return;\n if (result?.succeed) {\n this.currentUserSubject.next(result.data!.user);\n this.setSession({\n accessToken: result.data!.accessToken,\n refreshToken: result.data!.refreshToken,\n strategy: credentials.strategy,\n user: result.data!.user,\n application: result.data?.application,\n tenant: result.data?.tenant,\n expiresIn: result.data?.expiresIn,\n idToken: result.data?.idToken ?? null,\n });\n } else {\n this.status.next(AXPSessionStatus.Unauthenticated);\n throw new Error(`Invalid Username or Password`);\n }\n } catch (error) {\n console.error('Signin error:', error);\n this.status.next(AXPSessionStatus.Unauthenticated);\n throw error;\n } finally {\n this.isLoading.next(false);\n console.log('Signin process completed');\n }\n }\n\n async updateToken(params?: { [key: string]: any }): Promise<void> {\n this.isLoading.next(true);\n try {\n const strategyName = this.getSessionData()?.strategy!;\n if (!strategyName) {\n throw new Error('Strategy not found');\n }\n const strategy = this.authStrategyRegistry.get(strategyName);\n if (!strategy) {\n throw new Error(`Authentication strategy '${this.getSessionData()?.strategy}' is not supported`);\n }\n const result = await strategy.updateToken(params);\n if (result?.succeed) {\n this.currentUserSubject.next(result.data!.user);\n this.setSession({\n accessToken: result.data!.accessToken,\n refreshToken: result.data!.refreshToken,\n strategy: strategyName,\n user: result.data!.user,\n application: result.data?.application,\n tenant: result.data?.tenant,\n expiresIn: result.data?.expiresIn,\n idToken: result.data?.idToken ?? null,\n });\n this.status.next(AXPSessionStatus.Authenticated);\n\n // If we have both tenant and application, complete the sign-in\n if (this.application && this.tenant) {\n await this.restoreSession();\n }\n } else {\n this.status.next(AXPSessionStatus.Unauthenticated);\n throw new Error(`Invalid Username or Password`);\n }\n } catch (error) {\n console.error('Update token error:', error);\n throw error;\n } finally {\n this.isLoading.next(false);\n console.log('Update token process completed');\n }\n }\n\n async signout(): Promise<void> {\n console.log('Signing out...');\n this.isLoading.next(true);\n\n try {\n const sessionData = this.getSessionData();\n\n if (sessionData?.strategy) {\n const strategy = this.authStrategyRegistry.get(sessionData?.strategy);\n if (strategy) {\n try {\n await strategy.signout();\n } catch (error) { }\n }\n }\n //\n\n const userId = this.user?.id;\n\n\n this.clearSession();\n this.eventService.publish(AXPSessionStatus.SignedOut, { id: userId });\n this.isLoading.next(false);\n this.status.next(AXPSessionStatus.SignedOut);\n } finally {\n this.isLoading.next(false);\n }\n }\n\n async refreshToken(): Promise<any> {\n console.log('Refreshing token...');\n return new Promise(async (resolve, reject) => {\n const sessionData = this.getSessionData();\n if (!sessionData || !sessionData?.refreshToken) {\n console.log('No session data or refresh token found');\n reject(new Error('No refresh token available'));\n return;\n }\n const strategy = this.authStrategyRegistry.get(sessionData.strategy);\n if (!strategy) {\n console.error('Authentication strategy not found:', sessionData.strategy);\n reject(new Error(`Authentication strategy '${sessionData.strategy}' is not found`));\n return;\n }\n try {\n const result = await strategy.refreshToken(this.getContext());\n if (result.succeed) {\n console.log('Token refresh successful');\n this.setSession(result.data as AXPSessionData);\n resolve(result.data?.accessToken);\n } else {\n console.error('Token refresh failed');\n this.clearSession();\n this.status.next(AXPSessionStatus.Expired);\n reject(new Error('Token refresh failed'));\n }\n } catch (error) {\n console.error('Error during token refresh:', error);\n this.clearSession();\n this.status.next(AXPSessionStatus.Expired);\n reject(error);\n }\n });\n }\n\n private async loadPermissions(): Promise<void> {\n try {\n const permissions = await this.permissionLoader.getList(this.getContext());\n this.permissionsSubject.next(permissions ?? []);\n } catch (error) {\n console.error('Error loading permissions:', error);\n this.permissionsSubject.next([]);\n }\n }\n\n private async loadFeatures(): Promise<void> {\n try {\n const features = await this.featureLoader.getList(this.getContext());\n this.featuresSubject.next(features ?? []);\n } catch (error) {\n console.error('Error loading features:', error);\n this.featuresSubject.next([]);\n }\n }\n\n async signInComplete() {\n // Ensure we have the required data\n if (!this.user) {\n this.status.next(AXPSessionStatus.Unauthenticated);\n return;\n }\n\n // Set status to Authorized\n this.status.next(AXPSessionStatus.Authorized);\n\n // Double-check the status was set correctly\n setTimeout(() => {\n console.log('Status after timeout:', this.status.value);\n }, 100);\n }\n\n public setSession(tokens: Partial<AXPSessionData>): void {\n const sessionData: Partial<AXPSessionData> = {\n accessToken: tokens.accessToken,\n refreshToken: tokens.refreshToken,\n strategy: tokens.strategy,\n user: tokens.user,\n application: tokens.application,\n tenant: tokens.tenant,\n expiresIn: tokens.expiresIn,\n idToken: tokens.idToken,\n };\n // Update subjects\n if (tokens.user) {\n this.currentUserSubject.next(tokens.user);\n }\n if (tokens.tenant) {\n this.currentTenantSubject.next(tokens.tenant);\n }\n if (tokens.application) {\n this.currentApplicationSubject.next(tokens.application);\n }\n localStorage.setItem(AXPSessionService.SESSION_KEY, JSON.stringify(sessionData));\n }\n\n public setStrategy(strategy: string): void {\n const sessionData = this.getSessionData();\n const newSessionData = { ...sessionData, strategy };\n this.setSession(newSessionData);\n }\n\n public getSessionData(): AXPSessionData | null {\n try {\n const sessionDataString = localStorage.getItem(AXPSessionService.SESSION_KEY);\n if (sessionDataString) {\n const sessionData = JSON.parse(sessionDataString);\n\n return sessionData;\n } else {\n return null;\n }\n } catch (error) {\n localStorage.removeItem(AXPSessionService.SESSION_KEY);\n return null;\n }\n }\n\n private clearSession(): void {\n //\n this.currentUserSubject.next(null);\n //\n this.currentTenantSubject.next(null);\n //\n this.currentApplicationSubject.next(null);\n //\n this.permissionsSubject.next([]);\n //\n this.featuresSubject.next([]);\n //\n localStorage.removeItem(AXPSessionService.SESSION_KEY);\n }\n\n public authorize(...keys: string[]): boolean {\n // Calculate base result\n const baseResult = keys.every((k) => {\n if (isEmpty(k)) return true;\n\n // Check if user has the permission\n const hasPermission = this.permissions.indexOf(k) > -1;\n if (!hasPermission) return false;\n\n // Check if permission has required features (if permission definition service is available)\n // Note: This is a lightweight check. Full feature validation happens in permission definition service.\n return true;\n });\n\n // If permission checker is provided, use it to potentially override the result\n if (this.permissionChecker) {\n const context = this.getContext();\n return this.permissionChecker.check(keys, context, baseResult);\n }\n\n return baseResult;\n }\n\n public isFeatureEnabled(...keys: string[]): boolean {\n // Calculate base result\n const baseResult = keys.every((k) => isEmpty(k) || this.features.some((c) => c.name == k && c.value == true));\n\n // If feature checker is provided, use it to potentially override the result\n if (this.featureChecker) {\n const context = this.getContext();\n return this.featureChecker.check(keys, context, baseResult);\n }\n\n return baseResult;\n }\n\n /**\n * Checks if a module is enabled for the current tenant/application.\n * Module names are stored as features with value: true when enabled.\n * Module names can be provided in PascalCase (e.g., 'SecurityManagement') or kebab-case (e.g., 'security-management').\n */\n public isModuleEnabled(moduleName: string): boolean {\n if (!moduleName) {\n return false;\n }\n\n // Normalize module name: convert kebab-case to PascalCase if needed\n const normalizedModuleName = moduleName.includes('-')\n ? moduleName.split('-').map(word => word.charAt(0).toUpperCase() + word.slice(1)).join('')\n : moduleName;\n\n // Module names are stored as features with value: true when enabled\n return this.features.some(f => f.name === normalizedModuleName && f.value === true);\n }\n\n public getToken(): string | undefined {\n const sessionData = this.getSessionData();\n\n return sessionData?.accessToken;\n }\n\n public getContext(): AXPSessionContext {\n return new AXPSessionContext({\n user: this.user,\n tenant: this.tenant,\n application: this.application,\n });\n }\n}\n","import { Directive, Input, TemplateRef, ViewContainerRef, inject, signal } from '@angular/core';\nimport { Subscription, first } from 'rxjs';\nimport { AXPSessionService } from '../session.service';\n\n@Directive({\n selector: '[permission]',\n standalone: false\n})\nexport class AXPPermissionDirective {\n private hasView = signal(false);\n private subscription!: Subscription;\n private sessionService = inject(AXPSessionService);\n\n constructor(\n private templateRef: TemplateRef<any>,\n private viewContainer: ViewContainerRef\n ) { }\n\n @Input()\n public set permission(permissionKeys: string | string[] | null) {\n const keys: string[] = !permissionKeys ? [] : (Array.isArray(permissionKeys) ? permissionKeys : [permissionKeys]);\n if (keys.length == 0) {\n // If permissionKey is null or empty, decide the default behavior here\n this.viewContainer.createEmbeddedView(this.templateRef);\n this.hasView.set(true);\n return;\n }\n this.subscription = this.sessionService.isAuthorized$\n .subscribe((isAuthorized) => {\n if (isAuthorized && this.sessionService.authorize(...keys)) {\n if (!this.hasView()) {\n this.viewContainer.createEmbeddedView(this.templateRef);\n this.hasView.set(true);\n }\n } else {\n this.viewContainer.clear();\n this.hasView.set(false);\n }\n });\n }\n\n @Input()\n public set permissionElse(elseTemplateRef: TemplateRef<any>) {\n if (!this.hasView()) {\n this.viewContainer.createEmbeddedView(elseTemplateRef);\n }\n }\n\n ngOnDestroy() {\n this.subscription?.unsubscribe();\n }\n}\n","import { inject } from '@angular/core';\nimport { ActivatedRouteSnapshot, CanActivateFn, RouterStateSnapshot } from '@angular/router';\nimport { first, map, tap } from 'rxjs';\nimport { AXPUnauthorizedError } from '../errors.types';\nimport { AXPSessionService } from '../session.service';\n\nexport const AXPPermissionGuard: CanActivateFn = (route: ActivatedRouteSnapshot, state: RouterStateSnapshot) => {\n\n const sessionService = inject(AXPSessionService);\n\n const permissionKeys = route.data['requiredPermission'] as string | string[] | null;\n\n return sessionService.isAuthorized$.pipe(\n first(),\n map((value) => {\n const keys: string[] = !permissionKeys ? [] : Array.isArray(permissionKeys) ? permissionKeys : [permissionKeys];\n const hasPermission = keys.length == 0 || sessionService.authorize(...keys);\n if (!hasPermission) {\n throw new AXPUnauthorizedError(\n `Access denied. Required permissions: ${keys.join(', ')}. Please contact your administrator if you believe this is an error.`,\n {\n redirectUrl: state.url\n }\n );\n }\n return true;\n })\n );\n};\n","import { AXPPermissionDefinition, AXPPermissionGroupDefinition } from \"./permission.types\";\n\n\nexport class AXPPermissionDefinitionProviderContext {\n private builders: Map<string, AXPPermissionDefinitionGroupBuilder> = new Map();\n\n addGroup(name: string, title: string, description?: string): AXPPermissionDefinitionGroupBuilder {\n if (this.isGroupDefined(name)) {\n return this.findGroup(name)!\n }\n const group: AXPPermissionGroupDefinition = {\n name,\n title,\n description,\n permissions: []\n };\n const builder = new AXPPermissionDefinitionGroupBuilder(this, group);\n this.builders.set(name, builder);\n return builder;\n }\n\n getGroupDefinitions(): AXPPermissionGroupDefinition[] {\n return Array.from(this.builders.values()).map(b => b.group);\n }\n\n findGroup(name: string): AXPPermissionDefinitionGroupBuilder | undefined {\n return this.builders.get(name);\n }\n\n isGroupDefined(name: string): boolean {\n return this.builders.has(name);\n }\n}\n\n\n\nexport class AXPPermissionDefinitionGroupBuilder {\n private context: AXPPermissionDefinitionProviderContext;\n private _group: AXPPermissionGroupDefinition;\n\n public get group(): AXPPermissionGroupDefinition {\n return this._group;\n }\n\n constructor(context: AXPPermissionDefinitionProviderContext, group: AXPPermissionGroupDefinition) {\n this.context = context;\n this._group = group;\n }\n\n addPermission(name: string, title: string, description?: string, requiredFeatures?: string[]): AXPPermissionDefinitionBuilder {\n const permission: AXPPermissionDefinition = {\n name,\n title,\n description,\n children: [],\n requiredFeatures\n };\n this._group.permissions.push(permission);\n return new AXPPermissionDefinitionBuilder(this, permission);\n }\n\n\n\n\n endGroup(): AXPPermissionDefinitionProviderContext {\n return this.context;\n }\n\n findPermission(path: string): AXPPermissionDefinition | undefined {\n return undefined;\n }\n\n findGroup(name: string): AXPPermissionDefinitionGroupBuilder | undefined {\n return undefined;\n }\n\n}\n\nexport class AXPPermissionDefinitionBuilder {\n private groupBuilder: AXPPermissionDefinitionGroupBuilder;\n private permission: AXPPermissionDefinition;\n\n constructor(groupBuilder: AXPPermissionDefinitionGroupBuilder, permission: AXPPermissionDefinition) {\n this.groupBuilder = groupBuilder;\n this.permission = permission;\n }\n\n addChild(name: string, title: string, description?: string, requiredFeatures?: string[]): AXPPermissionDefinitionBuilder {\n const permission: AXPPermissionDefinition = {\n name,\n title,\n description,\n children: [],\n requiredFeatures\n };\n this.permission.children.push(permission);\n return this;\n }\n\n /**\n * Set required features for this permission.\n * @param features - Array of feature names (e.g., ['PlatformManagement.menu-customization'])\n */\n requireFeatures(...features: string[]): AXPPermissionDefinitionBuilder {\n this.permission.requiredFeatures = features;\n return this;\n }\n\n\n endPermission(): AXPPermissionDefinitionGroupBuilder {\n return this.groupBuilder;\n }\n}","import { inject, Injectable, InjectionToken } from '@angular/core';\nimport { AXPPermissionDefinition, AXPPermissionGroupDefinition } from './permission.types';\nimport { AXPPermissionDefinitionProviderContext } from './permission-definition.builder';\nimport { AXPSessionService } from '../session.service';\n\n\n\nexport interface AXPPermissionDefinitionProvider {\n define(context: AXPPermissionDefinitionProviderContext): Promise<void>;\n}\n\nexport const AXP_PERMISSION_DEFINITION_PROVIDER = new InjectionToken<AXPPermissionDefinitionProvider[]>('AXP_PERMISSION_DEFINITION_PROVIDER', {\n providedIn: 'root',\n factory: () => {\n return [];\n }\n});\n\n\n@Injectable({ providedIn: 'root' })\nexport class AXPPermissionDefinitionService {\n private providers = inject(AXP_PERMISSION_DEFINITION_PROVIDER, { optional: true });\n private sessionService = inject(AXPSessionService);\n private cache: AXPPermissionGroupDefinition[] | null = null;\n\n\n private async load(): Promise<void> {\n if (this.cache) {\n return\n }\n const context = new AXPPermissionDefinitionProviderContext();\n \n // Load providers from DI tokens\n if (Array.isArray(this.providers)) {\n for (const provider of this.providers) {\n if (provider instanceof Promise) {\n // If provider is a promise, resolve it\n const resolvedProvider = await provider;\n await resolvedProvider.define(context);\n } else {\n // If provider is a direct instance, use it directly\n await provider.define(context);\n }\n }\n }\n\n // Filter permissions based on required features\n const allGroups = context.getGroupDefinitions();\n this.cache = this.filterByFeatures(allGroups);\n }\n\n /**\n * Filter permissions based on required features.\n * Removes permissions that have required features that are not enabled.\n */\n private filterByFeatures(groups: AXPPermissionGroupDefinition[]): AXPPermissionGroupDefinition[] {\n return groups.map(group => ({\n ...group,\n permissions: this.filterPermissions(group.permissions)\n })).filter(group => group.permissions.length > 0);\n }\n\n /**\n * Recursively filter permissions and their children based on required features.\n */\n private filterPermissions(permissions: AXPPermissionDefinition[]): AXPPermissionDefinition[] {\n return permissions\n .filter(permission => {\n // Check if required features are enabled\n if (permission.requiredFeatures && permission.requiredFeatures.length > 0) {\n const allFeaturesEnabled = permission.requiredFeatures.every(featureName =>\n this.sessionService.isFeatureEnabled(featureName)\n );\n if (!allFeaturesEnabled) {\n return false; // Filter out this permission\n }\n }\n return true;\n })\n .map(permission => ({\n ...permission,\n children: this.filterPermissions(permission.children)\n }))\n .filter(permission => {\n // Remove permissions that have no children if they were only containers\n // (This is optional - you might want to keep parent permissions even without children)\n return true;\n });\n }\n\n public async reload(): Promise<void> {\n this.cache = null;\n await this.load();\n }\n\n public async getGroups(): Promise<AXPPermissionGroupDefinition[]> {\n await this.load();\n return this.cache ?? [];\n }\n\n public async getPermissions(): Promise<AXPPermissionDefinition[]> {\n await this.load();\n return this.cache?.flatMap(g => g.permissions) ?? [];\n }\n\n public async getGroup(name: string): Promise<AXPPermissionGroupDefinition | null> {\n await this.load();\n return this.cache?.find(g => g.name === name) ?? null;\n }\n\n public async getPermission(name: string): Promise<AXPPermissionDefinition | null> {\n await this.load();\n return this.cache?.find(g => g.permissions.find(p => p.name === name))?.permissions.find(p => p.name === name) ?? null;\n }\n\n}\n","//#region ---- Imports ----\n\nimport { AXDataSource } from '@acorex/cdk/common';\nimport {\n AXPDataSourceDefinition,\n AXPDataSourceDefinitionProvider,\n AXPFilterDefinition,\n} from '@acorex/platform/core';\nimport { AXPWidgetsCatalog } from '@acorex/platform/layout/widget-core';\nimport { inject } from '@angular/core';\nimport { AXPPermissionDefinitionService } from './permission-definition.service';\nimport { AXPPermissionDefinition } from './permission.types';\n\n//#endregion\n\n//#region ---- Helpers ----\n\nfunction flattenPermissionDefinitions(\n nodes: AXPPermissionDefinition[],\n groupPrefix: string,\n): Array<{ id: string; title: string }> {\n const rows: Array<{ id: string; title: string }> = [];\n for (const node of nodes) {\n const displayTitle = groupPrefix ? `${groupPrefix} / ${node.title}` : node.title;\n if (node.children?.length) {\n rows.push(...flattenPermissionDefinitions(node.children, displayTitle));\n } else {\n rows.push({\n id: String(node.name),\n title: displayTitle,\n });\n }\n }\n return rows;\n}\n\n//#endregion\n\n//#region ---- Permission definitions data source ----\n\n/**\n * Registered permission definitions for select widgets via dataSource name {@link PERMISSION_DEFINITIONS_DATASOURCE_NAME}.\n */\nexport const PERMISSION_DEFINITIONS_DATASOURCE_NAME = 'platform-permission-definitions';\n\n/**\n * Data source definition for leaf permissions from {@link AXPPermissionDefinitionService#getGroups}.\n */\nexport class AXPPermissionDefinitionsDataSourceDefinition implements AXPDataSourceDefinitionProvider {\n //#region ---- Services & Dependencies ----\n\n private readonly permissionDefinitionService = inject(AXPPermissionDefinitionService);\n\n //#endregion\n\n //#region ---- Public API ----\n\n async items(): Promise<AXPDataSourceDefinition[]> {\n return [\n {\n name: PERMISSION_DEFINITIONS_DATASOURCE_NAME,\n title: 'Permissions',\n source: () =>\n new AXDataSource({\n key: 'id',\n load: async () => {\n const groups = await this.permissionDefinitionService.getGroups();\n const list: Array<{ id: string; title: string }> = [];\n for (const g of groups) {\n list.push(...flattenPermissionDefinitions(g.permissions, g.title));\n }\n return { items: list, total: list.length };\n },\n byKey: async (key: unknown) => {\n const groups = await this.permissionDefinitionService.getGroups();\n const list: Array<{ id: string; title: string }> = [];\n for (const g of groups) {\n list.push(...flattenPermissionDefinitions(g.permissions, g.title));\n }\n return list.find((item) => item.id === key);\n },\n pageSize: 1000,\n }),\n columns: [\n {\n name: 'id',\n title: 'ID',\n datatype: 'string',\n type: AXPWidgetsCatalog.text,\n },\n {\n name: 'title',\n title: 'Title',\n datatype: 'string',\n type: AXPWidgetsCatalog.text,\n },\n ],\n filters: [\n {\n field: 'title',\n title: 'Title',\n operator: { type: 'equal' },\n widget: { type: AXPWidgetsCatalog.text },\n filterType: { advance: true, inline: true },\n } as AXPFilterDefinition,\n ],\n textField: { name: 'title', title: 'Title' },\n valueField: { name: 'id', title: 'ID' },\n },\n ];\n }\n\n //#endregion\n}\n\n//#endregion\n","import { AXPExpressionEvaluatorScopeProvider, AXPExpressionEvaluatorScopeProviderContext } from \"@acorex/platform/core\";\nimport { inject } from \"@angular/core\";\nimport { AXPSessionService } from \"../session.service\";\n\nexport class AXPPermissionEvaluatorScopeProvider implements AXPExpressionEvaluatorScopeProvider {\n\n protected sessionService = inject(AXPSessionService);\n\n async provide(context: AXPExpressionEvaluatorScopeProviderContext): Promise<void> {\n context.addScope('permission', {\n /**\n * Check if the current user has all specified permissions\n * @param permissions - Single permission string or array of permission strings\n * @returns boolean - true if user has all permissions, false otherwise\n */\n check: (...permissions: string[]) => {\n return this.sessionService.authorize(...permissions);\n },\n\n /**\n * Check if the current user has any of the specified permissions\n * @param permissions - Array of permission strings\n * @returns boolean - true if user has any of the permissions, false otherwise\n */\n checkAny: (...permissions: string[]) => {\n return permissions.some(p => this.sessionService.authorize(p));\n },\n });\n }\n} ","import { inject } from '@angular/core';\nimport { ActivatedRouteSnapshot, CanActivateFn, RouterStateSnapshot } from '@angular/router';\nimport { first, map } from 'rxjs';\nimport { AXPUnauthenticatedError } from './errors.types';\nimport { AXPSessionService } from './session.service';\n\nexport const AXPAuthGuard: CanActivateFn = (route: ActivatedRouteSnapshot, state: RouterStateSnapshot) => {\n const sessionService = inject(AXPSessionService);\n return sessionService.isAuthenticatedWithLoading$.pipe(\n first(),\n map((value) => {\n if (value) {\n return true;\n }\n throw new AXPUnauthenticatedError(\n `Access denied. You are not currently logged in. Please log in to access this page. If you continue to see this message after logging in, please contact support.`,\n {\n redirectUrl: state.url,\n },\n );\n }),\n );\n};\n","import { Inject, ModuleWithProviders, NgModule, Optional, inject, provideAppInitializer } from '@angular/core';\nimport { AXP_SESSION_SERVICE } from '@acorex/platform/core';\nimport { AXPAuthStrategyRegistryService } from './auth-registry.service';\nimport { AXPAuthStrategy } from './auth.strategy';\nimport { AXPFeatureDirective } from './feature';\nimport { AXPPermissionDirective } from './permission/permission.directive';\nimport { AXPSessionService } from './session.service';\n\nexport interface AXPAuthModuleConfigs {\n strategies: (new () => AXPAuthStrategy)[];\n}\n\nexport function initializeAppState(service: AXPSessionService) {\n return async () => {\n try {\n await service.restoreSession();\n } catch (error) {\n console.error(error);\n }\n };\n}\n\n@NgModule({\n imports: [],\n exports: [AXPPermissionDirective, AXPFeatureDirective],\n declarations: [AXPPermissionDirective, AXPFeatureDirective],\n providers: [\n provideAppInitializer(() => {\n const initializerFn = initializeAppState(inject(AXPSessionService));\n return initializerFn();\n }),\n {\n provide: AXP_SESSION_SERVICE,\n useExisting: AXPSessionService,\n },\n ],\n})\nexport class AXPAuthModule {\n static forRoot(configs?: AXPAuthModuleConfigs): ModuleWithProviders<AXPAuthModule> {\n return {\n ngModule: AXPAuthModule,\n providers: [\n ...(configs?.strategies || []),\n {\n provide: 'AXPAuthModuleFactory',\n useFactory: (registry: AXPAuthStrategyRegistryService) => () => {\n registry.register(...(configs?.strategies || []));\n },\n deps: [AXPAuthStrategyRegistryService],\n multi: true,\n },\n ],\n };\n }\n\n static forChild(configs?: AXPAuthModuleConfigs): ModuleWithProviders<AXPAuthModule> {\n return {\n ngModule: AXPAuthModule,\n providers: [\n ...(configs?.strategies || []),\n {\n provide: 'AXPAuthModuleFactory',\n useFactory: (registry: AXPAuthStrategyRegistryService) => () => {\n registry.register(...(configs?.strategies || []));\n },\n deps: [AXPAuthStrategyRegistryService],\n multi: true,\n },\n ],\n };\n }\n\n /**\n * @ignore\n */\n constructor(@Optional() @Inject('AXPAuthModuleFactory') instances: any[]) {\n instances?.forEach((f) => {\n f();\n });\n }\n}\n","import { AXPApplication } from './application/application.types';\nimport { AXPSessionContext } from './session.types';\nimport { AXPTenant } from './tenant/tenant.types';\nimport { AXPUser } from './user/user.types';\n\nexport interface AXPBaseCredentials {\n strategy: string;\n [key: string]: string;\n}\n\nexport interface AXPTokenResult {\n accessToken: string;\n expiresIn?: string | null;\n refreshToken?: string;\n idToken?: string;\n tenant?: AXPTenant | null;\n application?: AXPApplication | null;\n}\n\nexport interface AXPSignInResult {\n succeed: boolean;\n data?: {\n accessToken: string;\n idToken?: string | null;\n expiresIn?: string | null;\n refreshToken: string;\n user: AXPUser;\n tenant?: AXPTenant | null;\n application?: AXPApplication | null;\n };\n}\n\nexport abstract class AXPAuthStrategy {\n abstract get name(): string;\n abstract signin(credentials: AXPBaseCredentials): Promise<AXPSignInResult | void>;\n abstract signout(): Promise<void>;\n abstract refreshToken(context: AXPSessionContext): Promise<AXPSignInResult>;\n abstract updateToken(params?: { [key: string]: any }): Promise<AXPSignInResult | void>;\n}\n\nexport interface AXPSessionData {\n accessToken: string;\n refreshToken: string;\n idToken: string | null;\n strategy: string;\n user?: AXPUser | null;\n tenant?: AXPTenant | null;\n application?: AXPApplication | null;\n expiresIn?: string | null;\n}\n","//#region ---- JWT Utility ----\n\n/**\n * Utility class for JWT token operations\n */\nexport class JwtUtil {\n /**\n * Parses a JWT token and returns the payload\n */\n static parseJwt(token: string): any {\n try {\n const base64Url = token.split('.')[1];\n const base64 = base64Url.replace(/-/g, '+').replace(/_/g, '/');\n const jsonPayload = decodeURIComponent(\n atob(base64)\n .split('')\n .map(c => '%' + ('00' + c.charCodeAt(0).toString(16)).slice(-2))\n .join('')\n );\n return JSON.parse(jsonPayload);\n } catch (error) {\n throw new Error('Invalid JWT token');\n }\n }\n}\n\n//#endregion\n\n//#region ---- PKCE Utility ----\n\n/**\n * Utility class for PKCE (Proof Key for Code Exchange) operations\n */\nexport class PkceUtil {\n /**\n * Generates a random string for PKCE code verifier\n */\n static generateRandomString(length: number): string {\n const array = new Uint8Array(length);\n crypto.getRandomValues(array);\n return this.base64UrlEncode(array);\n }\n\n /**\n * Generates PKCE code challenge from verifier\n */\n static async generateCodeChallenge(codeVerifier: string): Promise<string> {\n const encoder = new TextEncoder();\n const data = encoder.encode(codeVerifier);\n const digest = await crypto.subtle.digest('SHA-256', data);\n return this.base64UrlEncode(new Uint8Array(digest));\n }\n\n /**\n * Base64 URL encoding for PKCE\n */\n private static base64UrlEncode(array: Uint8Array): string {\n return btoa(String.fromCharCode(...array))\n .replace(/\\+/g, '-')\n .replace(/\\//g, '_')\n .replace(/=/g, '');\n }\n}\n\n//#endregion\n\n//#region ---- Time Utility ----\n\n/**\n * Utility class for time and date operations\n */\nexport class TimeUtil {\n /**\n * Calculates the time difference in milliseconds between a future date and now\n */\n static expiresInMilliseconds(expiresInDate: string): number {\n return new Date(expiresInDate).getTime() - new Date().getTime();\n }\n\n /**\n * Calculates expiration date from seconds\n */\n static calculateExpireInDate(expireInSeconds: number): string {\n return new Date(Date.now() + expireInSeconds * 1000).toISOString();\n }\n}\n\n//#endregion ","//#region ---- Challenge Data Types ----\n\n/**\n * Supported content types for challenge display\n */\nexport type AXPChallengeContentType = 'image-url' | 'image-base64' | 'text' | 'audio-url';\n\n/**\n * Challenge data returned from the server\n * Contains all information needed to display and submit a challenge\n */\nexport interface AXPLoginChallengeData {\n /**\n * Unique identifier for this challenge\n * Must be sent back with credentials when submitting login\n */\n id: string;\n\n /**\n * The challenge content to display\n * Could be an image URL, base64 encoded image, text, or audio URL\n */\n content: string;\n\n /**\n * Type of content for proper rendering\n */\n contentType: AXPChallengeContentType;\n\n /**\n * When this challenge expires (optional)\n * After expiration, a new challenge should be fetched\n */\n expiresAt?: Date;\n\n /**\n * Additional metadata from server (optional)\n */\n metadata?: Record<string, unknown>;\n}\n\n//#endregion\n\n//#region ---- Challenge Check Result ----\n\n/**\n * Result of checking a login error response\n * Determines if a challenge should be displayed\n */\nexport interface AXPChallengeCheckResult {\n /**\n * Whether a challenge is required\n */\n required: boolean;\n\n /**\n * Optional message to display to the user\n */\n message?: string;\n\n /**\n * Additional data from server that may be needed for getChallenge()\n * For example: sessionId, attemptId, etc.\n */\n serverData?: Record<string, unknown>;\n}\n\n//#endregion\n\n","import { Type } from '@angular/core';\nimport { AXPLoginChallengeComponentBase } from './challenge-component.base';\nimport { AXPChallengeCheckResult, AXPLoginChallengeData } from './challenge.types';\n\n//#region ---- Abstract Challenge Provider ----\n\n/**\n * Abstract base class for login challenge providers\n *\n * Implement this class to create custom challenge mechanisms like:\n * - Image CAPTCHA\n * - reCAPTCHA\n * - SMS verification\n * - Email verification\n *\n * @example\n * ```typescript\n * @Injectable()\n * export class MyImageCaptchaProvider extends AXPLoginChallengeProvider {\n * readonly name = 'image-captcha';\n *\n * checkResponse(error: unknown): AXPChallengeCheckResult | null {\n * if (error instanceof HttpErrorResponse) {\n * if (error.error?.requiresCaptcha) {\n * return { required: true };\n * }\n * }\n * return null;\n * }\n *\n * async getChallenge(): Promise<AXPLoginChallengeData> {\n * const response = await this.http.get('/api/captcha').toPromise();\n * return {\n * id: response.id,\n * content: response.image,\n * contentType: 'image-base64'\n * };\n * }\n *\n * async refreshChallenge(): Promise<AXPLoginChallengeData> {\n * return this.getChallenge();\n * }\n *\n * getChallengeComponent(): Type<AXPLoginChallengeComponentBase> {\n * return MyCaptchaChallengeComponent;\n * }\n * }\n * ```\n */\nexport abstract class AXPLoginChallengeProvider {\n\n /**\n * Unique name identifier for this provider\n */\n abstract readonly name: string;\n\n /**\n * Checks the login error response to determine if a challenge is required\n *\n * This method is called after a failed login attempt. The implementation\n * should inspect the error and return a result indicating whether a\n * challenge should be displayed.\n *\n * @param error - The error from the failed login attempt (type varies by implementation)\n * @returns Challenge check result, or null if this provider doesn't handle this error\n */\n abstract checkResponse(error: unknown): AXPChallengeCheckResult | null;\n\n /**\n * Fetches a new challenge from the server\n *\n * Called when checkResponse indicates a challenge is required.\n * Should make an API call to get challenge data (e.g., CAPTCHA image).\n *\n * @param serverData - Optional data from checkResponse result that may be needed\n * @returns Promise resolving to challenge data for display\n */\n abstract getChallenge(serverData?: Record<string, unknown>): Promise<AXPLoginChallengeData>;\n\n /**\n * Fetches a fresh challenge, replacing the current one\n *\n * Called when user requests a new challenge (e.g., clicks \"new image\" button).\n * Typically delegates to getChallenge() but may have different behavior.\n *\n * @returns Promise resolving to new challenge data\n */\n abstract refreshChallenge(): Promise<AXPLoginChallengeData>;\n\n /**\n * Returns the component type for rendering the challenge UI\n *\n * Override this method to provide a custom challenge UI component.\n * If not overridden (returns null), the login component will use\n * a default built-in UI.\n *\n * @returns Component type extending AXPLoginChallengeComponentBase, or null for default UI\n */\n getChallengeComponent(): Type<AXPLoginChallengeComponentBase> | null {\n return null;\n }\n}\n\n//#endregion\n\n","import { InjectionToken } from '@angular/core';\nimport { AXPLoginChallengeProvider } from './challenge.provider';\n\n//#region ---- Injection Token ----\n\n/**\n * Injection token for the login challenge provider\n *\n * This token is optional - if not provided, no challenge mechanism will be used.\n *\n * @example\n * ```typescript\n * // In your app module or provider configuration:\n * providers: [\n * {\n * provide: AXP_LOGIN_CHALLENGE_PROVIDER,\n * useClass: MyImageCaptchaProvider\n * }\n * ]\n *\n * // In a component:\n * private challengeProvider = inject(AXP_LOGIN_CHALLENGE_PROVIDER, { optional: true });\n * ```\n */\nexport const AXP_LOGIN_CHALLENGE_PROVIDER = new InjectionToken<AXPLoginChallengeProvider>(\n 'AXP_LOGIN_CHALLENGE_PROVIDER'\n);\n\n//#endregion\n\n","import { Component, input, output } from '@angular/core';\nimport { AXPLoginChallengeData } from './challenge.types';\n\n//#region ---- Base Challenge Component ----\n\n/**\n * Base class for login challenge UI components\n *\n * Providers can extend this class to create custom challenge UIs.\n * The login component will render this component and listen to its outputs.\n *\n * @example\n * ```typescript\n * @Component({\n * selector: 'my-captcha-challenge',\n * template: `\n * <div class=\"captcha-container\">\n * <img [src]=\"'data:image/png;base64,' + challengeData().content\" />\n * <input\n * type=\"text\"\n * [value]=\"response()\"\n * (input)=\"onResponseChange($event)\"\n * />\n * <button (click)=\"onRefreshClick()\">Refresh</button>\n * </div>\n * `\n * })\n * export class MyCaptchaChallengeComponent extends AXPLoginChallengeComponentBase {\n * response = signal('');\n *\n * onResponseChange(event: Event) {\n * const value = (event.target as HTMLInputElement).value;\n * this.response.set(value);\n * this.responseChange.emit(value);\n * }\n *\n * onRefreshClick() {\n * this.refreshRequest.emit();\n * }\n * }\n * ```\n */\n@Component({\n template: '',\n standalone: true,\n})\nexport abstract class AXPLoginChallengeComponentBase {\n //#region ---- Inputs ----\n\n /**\n * Challenge data to display\n * Contains the image/content and metadata from the server\n */\n challengeData = input.required<AXPLoginChallengeData>();\n\n /**\n * Whether the challenge is currently loading (e.g., refreshing)\n */\n isLoading = input<boolean>(false);\n\n //#endregion\n\n //#region ---- Outputs ----\n\n /**\n * Emits when the user enters or changes their response\n * The login component will capture this value and include it in credentials\n */\n responseChange = output<string>();\n\n /**\n * Emits when the user requests a new challenge (e.g., clicks refresh button)\n * The login component will call provider.refreshChallenge()\n */\n refreshRequest = output<void>();\n\n //#endregion\n}\n\n//#endregion\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
|