bways-report 0.1.4 → 0.1.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +75 -35
- package/esm2022/lib/core/services/index.mjs +3 -1
- package/esm2022/lib/core/services/report-data-discovery.service.mjs +135 -0
- package/esm2022/lib/core/services/report-storage.service.mjs +63 -0
- package/esm2022/lib/core/tokens/index.mjs +2 -1
- package/esm2022/lib/core/tokens/reporting-config.token.mjs +1 -1
- package/esm2022/lib/core/tokens/storage.token.mjs +128 -0
- package/esm2022/lib/core/utils/identifier-humanizer.mjs +15 -4
- package/esm2022/lib/data-access/adapters/http-lookup.adapter.mjs +17 -8
- package/esm2022/lib/data-access/adapters/local-storage-persistence.adapter.mjs +16 -44
- package/esm2022/lib/features/designer/components/component-palette/component-palette.component.mjs +3 -371
- package/esm2022/lib/features/designer/components/design-canvas/design-canvas.component.mjs +69 -1023
- package/esm2022/lib/features/designer/components/property-editor/parameter-binding-editor.component.mjs +345 -213
- package/esm2022/lib/features/designer/components/property-editor/property-editor-action.component.mjs +39 -32
- package/esm2022/lib/features/designer/components/property-editor/property-editor-datasource.component.mjs +35 -679
- package/esm2022/lib/features/designer/components/property-editor/property-editor-grid.component.mjs +97 -949
- package/esm2022/lib/features/designer/components/property-editor/property-editor.component.mjs +112 -585
- package/esm2022/lib/features/designer/designer.component.mjs +3 -3
- package/esm2022/lib/features/designer/services/designer-state.service.mjs +62 -2
- package/esm2022/lib/features/runtime/report-grid-bridge.component.mjs +115 -19
- package/esm2022/lib/primitives/components/dropdown/rpt-dropdown.component.mjs +31 -423
- package/esm2022/lib/provide-reporting.mjs +20 -5
- package/fesm2022/bways-report.mjs +2263 -5342
- package/fesm2022/bways-report.mjs.map +1 -1
- package/lib/core/services/index.d.ts +2 -0
- package/lib/core/services/report-data-discovery.service.d.ts +38 -0
- package/lib/core/services/report-storage.service.d.ts +26 -0
- package/lib/core/tokens/index.d.ts +2 -0
- package/lib/core/tokens/reporting-config.token.d.ts +2 -0
- package/lib/core/tokens/storage.token.d.ts +48 -0
- package/lib/data-access/adapters/http-lookup.adapter.d.ts +2 -1
- package/lib/data-access/adapters/local-storage-persistence.adapter.d.ts +1 -0
- package/lib/features/designer/components/design-canvas/design-canvas.component.d.ts +5 -1
- package/lib/features/designer/components/property-editor/parameter-binding-editor.component.d.ts +5 -0
- package/lib/features/designer/components/property-editor/property-editor-action.component.d.ts +3 -0
- package/lib/features/designer/components/property-editor/property-editor-grid.component.d.ts +31 -1
- package/lib/features/designer/components/property-editor/property-editor.component.d.ts +19 -0
- package/lib/features/designer/services/designer-state.service.d.ts +12 -1
- package/lib/features/runtime/report-grid-bridge.component.d.ts +8 -58
- package/lib/primitives/components/dropdown/rpt-dropdown.component.d.ts +3 -0
- package/lib/provide-reporting.d.ts +6 -0
- package/package.json +9 -1
package/README.md
CHANGED
|
@@ -7,6 +7,7 @@ It allows non-developers to visually design reporting pages with filters, KPI me
|
|
|
7
7
|
---
|
|
8
8
|
[](https://www.npmjs.com/package/bways-report)
|
|
9
9
|
[](https://github.com/ccplProject/BWays-CustomeReport)
|
|
10
|
+
[](CHANGELOG.md)
|
|
10
11
|
---
|
|
11
12
|
|
|
12
13
|
## Table of Contents
|
|
@@ -25,6 +26,11 @@ It allows non-developers to visually design reporting pages with filters, KPI me
|
|
|
25
26
|
5. [Routing & ERP Navigation Integration](#5-routing--erp-navigation-integration)
|
|
26
27
|
6. [Drill-Down Drill-Through & Slide-Over Drawers](#6-drill-down--slide-over-drawers)
|
|
27
28
|
7. [Starter Blueprints Gallery & Branded Exports](#7-starter-blueprints--branded-exports)
|
|
29
|
+
8. [Grid Bridge & Circular Echo Suppression](#8-grid-bridge--circular-echo-suppression)
|
|
30
|
+
9. [Stored Procedure Discovery & Smart Parameter Mapping](#9-stored-procedure-discovery--smart-parameter-mapping)
|
|
31
|
+
10. [Theming & CSS Custom Properties](#10-theming--css-custom-properties)
|
|
32
|
+
11. [Exporting Data (CSV & JSON)](#11-exporting-data-csv--json)
|
|
33
|
+
12. [Changelog & Version History](#12-changelog--version-history)
|
|
28
34
|
|
|
29
35
|
---
|
|
30
36
|
|
|
@@ -456,7 +462,67 @@ If not provided, the built-in SVG visual chart renderer outputs crisp, responsiv
|
|
|
456
462
|
|
|
457
463
|
---
|
|
458
464
|
|
|
459
|
-
##
|
|
465
|
+
## 8. Grid Bridge & Circular Echo Suppression
|
|
466
|
+
|
|
467
|
+
`bways-report` features an intelligent runtime bridge (`ReportGridBridgeComponent` and `RptGridOutletDirective`) that connects any underlying grid library (e.g., `UltraGridComponent` from `bways-grid`) to the dynamic report state:
|
|
468
|
+
|
|
469
|
+
```
|
|
470
|
+
┌─────────────────────────────────────────────────────────────┐
|
|
471
|
+
│ Design Canvas / Runtime │
|
|
472
|
+
│ │
|
|
473
|
+
│ [gridDefinition] (ReportGridDefinition) │
|
|
474
|
+
│ │ │
|
|
475
|
+
│ ▼ │
|
|
476
|
+
│ ┌─────────────────────────────────────────────────────┐ │
|
|
477
|
+
│ │ ReportGridBridgeComponent │ │
|
|
478
|
+
│ │ │ │
|
|
479
|
+
│ │ - gridInputs: transforms definition into inputs │ │
|
|
480
|
+
│ │ - gridReportState: preserves active & condition │ │
|
|
481
|
+
│ │ filters from serialized report state │ │
|
|
482
|
+
│ │ │ │
|
|
483
|
+
│ │ ┌─────────────────────────────────────────────┐ │ │
|
|
484
|
+
│ │ │ RptGridOutletDirective │ │ │
|
|
485
|
+
│ │ │ │ │ │
|
|
486
|
+
│ │ │ - Circular Echo Suppression: │ │ │
|
|
487
|
+
│ │ │ Tracks last emitted state & col-defs │ │ │
|
|
488
|
+
│ │ │ Skips setInput when update came from │ │ │
|
|
489
|
+
│ │ │ the grid itself. │ │ │
|
|
490
|
+
│ │ └─────────────────────┬───────────────────────┘ │ │
|
|
491
|
+
│ └─────────────────────────┼───────────────────────────┘ │
|
|
492
|
+
│ │ │
|
|
493
|
+
│ ▼ │
|
|
494
|
+
│ ┌───────────────────────┐ │
|
|
495
|
+
│ │ UltraGridComponent │ │
|
|
496
|
+
│ │ (Live ERP Grid) │ │
|
|
497
|
+
│ └───────────────────────┘ │
|
|
498
|
+
└─────────────────────────────────────────────────────────────┘
|
|
499
|
+
```
|
|
500
|
+
|
|
501
|
+
### Key Capabilities:
|
|
502
|
+
- **Interactive Filtering without Popover Dismissal**: In traditional bindings, when a user types in a filter or checks a box, parent state updates re-trigger `setInput`, causing the grid to re-initialize headers and snap popovers shut. `RptGridOutletDirective` compares incoming states (`isReportStateMatching`) against the grid's own latest emission, preventing unnecessary re-renders.
|
|
503
|
+
- **Layout Auto-Persist vs. Runtime Filtering**:
|
|
504
|
+
- **Structural Layout** changes (`groupModel`, `sortModel`, column widths, visibility) trigger immediate persistence and display the `"Layout auto-persisted"` status banner.
|
|
505
|
+
- **Column Data Filtering** (`activeFilters`, `conditionFilters`) is treated as runtime data exploration: debounced (1200ms) with `{ skipHistory: true }`, ensuring undo/redo stacks aren't flooded with intermediate keystrokes.
|
|
506
|
+
- **Full Filter State Preservation**: Filter sets and expressions are preserved intact in `options.reportState` when saved or exported.
|
|
507
|
+
|
|
508
|
+
---
|
|
509
|
+
|
|
510
|
+
## 9. Stored Procedure Discovery & Smart Parameter Mapping
|
|
511
|
+
|
|
512
|
+
`bways-report` integrates with SQL Server stored procedures via `HttpReportSchemaDiscoveryAdapter`:
|
|
513
|
+
|
|
514
|
+
1. **Introspection (`sys.parameters`)**: Queries stored procedure signatures, determining data types, nullability, and default expressions.
|
|
515
|
+
2. **Smart Control Inference**:
|
|
516
|
+
- Date parameters (`@FromDate`, `@ToDate`, `@AsOnDate`) automatically suggest date-picker or date-range controls.
|
|
517
|
+
- Master entity parameters (`@SubGLCode`, `@BranchId`, `@CustomerId`) infer dropdown lookups from associated tables or views.
|
|
518
|
+
3. **Lookup Deduplication & Account Resolution**:
|
|
519
|
+
- `identifier-humanizer.ts` prioritizes unique account numbers (`_acno`, `glacno`, `account_no`) over category codes (`_code`), preventing duplicate collapsing of customer accounts in dropdown lookups.
|
|
520
|
+
4. **Session Token Binding**:
|
|
521
|
+
- Parameters matching ERP session context (`@BranchId`, `@CompanyId`, `@FinYearId`) are automatically resolved via `SessionContextProvider` without manual user intervention.
|
|
522
|
+
|
|
523
|
+
---
|
|
524
|
+
|
|
525
|
+
## 10. Theming & CSS Custom Properties
|
|
460
526
|
|
|
461
527
|
`bways-report` uses CSS custom properties (`--rpt-*`) throughout all components, ensuring seamless alignment with your ERP application's design system:
|
|
462
528
|
|
|
@@ -490,40 +556,7 @@ If not provided, the built-in SVG visual chart renderer outputs crisp, responsiv
|
|
|
490
556
|
|
|
491
557
|
---
|
|
492
558
|
|
|
493
|
-
##
|
|
494
|
-
|
|
495
|
-
You can register custom Angular components (e.g., custom slider, multi-select, rich customer picker) into the `ComponentRegistry` so they appear in the Visual Designer palette and render dynamically at runtime:
|
|
496
|
-
|
|
497
|
-
```typescript
|
|
498
|
-
import { ComponentRegistry, ComponentMetadata } from 'bways-report';
|
|
499
|
-
import { MyCustomPickerComponent } from './my-custom-picker.component';
|
|
500
|
-
|
|
501
|
-
export function configureCustomControls(registry: ComponentRegistry): void {
|
|
502
|
-
registry.register({
|
|
503
|
-
type: 'customer-picker',
|
|
504
|
-
displayName: 'Customer Picker',
|
|
505
|
-
category: 'input',
|
|
506
|
-
icon: 'person_search',
|
|
507
|
-
component: MyCustomPickerComponent,
|
|
508
|
-
createDefaultConfig: () => ({
|
|
509
|
-
id: 'cust-picker',
|
|
510
|
-
type: 'customer-picker',
|
|
511
|
-
label: 'Select Customer',
|
|
512
|
-
properties: { placeholder: 'Search customer...' },
|
|
513
|
-
layout: { columnSpan: 4 },
|
|
514
|
-
}),
|
|
515
|
-
propertySchema: [
|
|
516
|
-
{ key: 'label', label: 'Label', type: 'string', required: true, group: 'General' },
|
|
517
|
-
{ key: 'key', label: 'Field Name (Key)', type: 'string', required: true, group: 'General' },
|
|
518
|
-
{ key: 'required', label: 'Required', type: 'boolean', group: 'Validation' },
|
|
519
|
-
],
|
|
520
|
-
});
|
|
521
|
-
}
|
|
522
|
-
```
|
|
523
|
-
|
|
524
|
-
---
|
|
525
|
-
|
|
526
|
-
## 9. Exporting Data (CSV & JSON)
|
|
559
|
+
## 11. Exporting Data (CSV & JSON)
|
|
527
560
|
|
|
528
561
|
Use `ReportExportService` for one-click file generation:
|
|
529
562
|
|
|
@@ -574,6 +607,13 @@ export class ExportActionsComponent {
|
|
|
574
607
|
|
|
575
608
|
---
|
|
576
609
|
|
|
610
|
+
## 12. Changelog & Version History
|
|
611
|
+
|
|
612
|
+
For a complete record of releases, breaking changes, and bug fixes, refer to the **[Changelog](CHANGELOG.md)**.
|
|
613
|
+
|
|
614
|
+
---
|
|
615
|
+
|
|
577
616
|
## License
|
|
578
617
|
|
|
579
618
|
MIT © BWays Technologies
|
|
619
|
+
|
|
@@ -1,3 +1,5 @@
|
|
|
1
1
|
export { DynamicFormBuilder } from './dynamic-form-builder.service';
|
|
2
2
|
export { ReportSessionContextService } from './report-session-context.service';
|
|
3
|
-
|
|
3
|
+
export { ReportStorageService } from './report-storage.service';
|
|
4
|
+
export { ReportDataDiscoveryService } from './report-data-discovery.service';
|
|
5
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9id2F5cy1yZXBvcnQvc3JjL2xpYi9jb3JlL3NlcnZpY2VzL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBQ3BFLE9BQU8sRUFBRSwyQkFBMkIsRUFBRSxNQUFNLGtDQUFrQyxDQUFDO0FBSy9FLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQ2hFLE9BQU8sRUFBRSwwQkFBMEIsRUFBRSxNQUFNLGlDQUFpQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IHsgRHluYW1pY0Zvcm1CdWlsZGVyIH0gZnJvbSAnLi9keW5hbWljLWZvcm0tYnVpbGRlci5zZXJ2aWNlJztcbmV4cG9ydCB7IFJlcG9ydFNlc3Npb25Db250ZXh0U2VydmljZSB9IGZyb20gJy4vcmVwb3J0LXNlc3Npb24tY29udGV4dC5zZXJ2aWNlJztcbmV4cG9ydCB0eXBlIHtcbiAgU2Vzc2lvblBhcmFtTWF0Y2gsXG4gIERlcml2ZWRQYXJhbWV0ZXJzUmVzdWx0LFxufSBmcm9tICcuL3JlcG9ydC1zZXNzaW9uLWNvbnRleHQuc2VydmljZSc7XG5leHBvcnQgeyBSZXBvcnRTdG9yYWdlU2VydmljZSB9IGZyb20gJy4vcmVwb3J0LXN0b3JhZ2Uuc2VydmljZSc7XG5leHBvcnQgeyBSZXBvcnREYXRhRGlzY292ZXJ5U2VydmljZSB9IGZyb20gJy4vcmVwb3J0LWRhdGEtZGlzY292ZXJ5LnNlcnZpY2UnO1xuIl19
|
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
import { inject, Injectable } from '@angular/core';
|
|
2
|
+
import { of } from 'rxjs';
|
|
3
|
+
import { catchError, map } from 'rxjs/operators';
|
|
4
|
+
import { ReportSchemaDiscoveryAdapter, } from '../../data-access/contracts/schema-discovery.contract';
|
|
5
|
+
import { ReportLookupAdapter } from '../../data-access/contracts/lookup.contract';
|
|
6
|
+
import { ReportSessionContextService } from './report-session-context.service';
|
|
7
|
+
import { resolveParameterMappings } from '../utils/report-parameter.util';
|
|
8
|
+
import { humanizeIdentifier } from '../utils/identifier-humanizer';
|
|
9
|
+
import * as i0 from "@angular/core";
|
|
10
|
+
/**
|
|
11
|
+
* Centralized service for discovering database schema entities, parameters,
|
|
12
|
+
* and column definitions.
|
|
13
|
+
*
|
|
14
|
+
* Provides a unified static + dynamic detection pipeline:
|
|
15
|
+
* If static schema metadata discovery fails (e.g. SQL Server stored procedures
|
|
16
|
+
* using #temp tables that cannot be analyzed statically), it automatically
|
|
17
|
+
* falls back to executing a safe dynamic sample query with the active parameter
|
|
18
|
+
* values and extracting column definitions from the result dataset.
|
|
19
|
+
*/
|
|
20
|
+
export class ReportDataDiscoveryService {
|
|
21
|
+
discoveryAdapter = inject(ReportSchemaDiscoveryAdapter, { optional: true });
|
|
22
|
+
lookupAdapter = inject(ReportLookupAdapter, { optional: true });
|
|
23
|
+
sessionService = inject(ReportSessionContextService, { optional: true });
|
|
24
|
+
/**
|
|
25
|
+
* Retrieves all database tables, views, and stored procedures.
|
|
26
|
+
*/
|
|
27
|
+
getEntities(types) {
|
|
28
|
+
if (!this.discoveryAdapter) {
|
|
29
|
+
return of([]);
|
|
30
|
+
}
|
|
31
|
+
return this.discoveryAdapter.getEntities(types).pipe(catchError((err) => {
|
|
32
|
+
console.warn('[ReportDataDiscoveryService] Failed to get entities:', err);
|
|
33
|
+
return of([]);
|
|
34
|
+
}));
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Retrieves stored procedure parameter metadata.
|
|
38
|
+
*/
|
|
39
|
+
getParameters(procedureName, schema = 'dbo') {
|
|
40
|
+
if (!procedureName || !this.discoveryAdapter) {
|
|
41
|
+
return of([]);
|
|
42
|
+
}
|
|
43
|
+
return this.discoveryAdapter.getParameters(procedureName, schema).pipe(catchError((err) => {
|
|
44
|
+
console.warn(`[ReportDataDiscoveryService] Failed to get parameters for ${procedureName}:`, err);
|
|
45
|
+
return of([]);
|
|
46
|
+
}));
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Unified column detection:
|
|
50
|
+
* 1. Attempts static schema discovery via ReportSchemaDiscoveryAdapter.
|
|
51
|
+
* 2. If static discovery returns 0 columns or throws an error (e.g. SQL Error 11526 with #temp tables),
|
|
52
|
+
* automatically runs dynamic sample query via ReportLookupAdapter using resolved parameters.
|
|
53
|
+
*/
|
|
54
|
+
autoDetectColumns(entityName, entityType = 'stored_procedure', mappings = {}, schema = 'dbo') {
|
|
55
|
+
if (!entityName) {
|
|
56
|
+
return of([]);
|
|
57
|
+
}
|
|
58
|
+
// Try static discovery first
|
|
59
|
+
if (this.discoveryAdapter) {
|
|
60
|
+
return this.discoveryAdapter.getColumns(entityName, schema, entityType).pipe(map((cols) => {
|
|
61
|
+
if (cols && cols.length > 0) {
|
|
62
|
+
return this.mapStaticColumnsToGrid(cols);
|
|
63
|
+
}
|
|
64
|
+
throw new Error('STATIC_EMPTY');
|
|
65
|
+
}), catchError(() => {
|
|
66
|
+
// Fallback to dynamic execution
|
|
67
|
+
return this.fallbackDynamicDetection(entityName, entityType, mappings, schema);
|
|
68
|
+
}));
|
|
69
|
+
}
|
|
70
|
+
return this.fallbackDynamicDetection(entityName, entityType, mappings, schema);
|
|
71
|
+
}
|
|
72
|
+
mapStaticColumnsToGrid(cols) {
|
|
73
|
+
return cols.map((c) => ({
|
|
74
|
+
field: c.field,
|
|
75
|
+
label: humanizeIdentifier(c.label || c.field),
|
|
76
|
+
dataType: c.dataType || 'string',
|
|
77
|
+
visible: true,
|
|
78
|
+
sortable: true,
|
|
79
|
+
align: c.dataType === 'number' ? 'right' : 'left',
|
|
80
|
+
}));
|
|
81
|
+
}
|
|
82
|
+
fallbackDynamicDetection(entityName, sourceType, mappings, schema = 'dbo') {
|
|
83
|
+
if (!this.lookupAdapter) {
|
|
84
|
+
return of([]);
|
|
85
|
+
}
|
|
86
|
+
const session = this.sessionService?.getCurrentSessionContext() ?? {};
|
|
87
|
+
const resolvedParams = resolveParameterMappings(mappings, session, {});
|
|
88
|
+
return this.lookupAdapter
|
|
89
|
+
.fetchOptions({
|
|
90
|
+
sourceType: (sourceType === 'stored_procedure' ? 'procedure' : sourceType),
|
|
91
|
+
entityName,
|
|
92
|
+
schema,
|
|
93
|
+
valueField: '',
|
|
94
|
+
displayField: '',
|
|
95
|
+
parameters: resolvedParams,
|
|
96
|
+
})
|
|
97
|
+
.pipe(map((items) => {
|
|
98
|
+
if (items && items.length > 0 && items[0].raw) {
|
|
99
|
+
const sampleRow = items[0].raw;
|
|
100
|
+
const keys = Object.keys(sampleRow);
|
|
101
|
+
if (keys.length > 0) {
|
|
102
|
+
return keys.map((key) => {
|
|
103
|
+
const val = sampleRow[key];
|
|
104
|
+
let type = 'string';
|
|
105
|
+
if (typeof val === 'number')
|
|
106
|
+
type = 'number';
|
|
107
|
+
else if (typeof val === 'boolean')
|
|
108
|
+
type = 'boolean';
|
|
109
|
+
else if (typeof val === 'string' && /^\d{4}-\d{2}-\d{2}/.test(val))
|
|
110
|
+
type = 'date';
|
|
111
|
+
return {
|
|
112
|
+
field: key,
|
|
113
|
+
label: humanizeIdentifier(key),
|
|
114
|
+
dataType: type,
|
|
115
|
+
visible: true,
|
|
116
|
+
sortable: true,
|
|
117
|
+
align: (type === 'number' ? 'right' : 'left'),
|
|
118
|
+
};
|
|
119
|
+
});
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
return [];
|
|
123
|
+
}), catchError((err) => {
|
|
124
|
+
console.warn(`[ReportDataDiscoveryService] Dynamic sample detection failed for ${entityName}:`, err);
|
|
125
|
+
return of([]);
|
|
126
|
+
}));
|
|
127
|
+
}
|
|
128
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ReportDataDiscoveryService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
|
|
129
|
+
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ReportDataDiscoveryService, providedIn: 'root' });
|
|
130
|
+
}
|
|
131
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ReportDataDiscoveryService, decorators: [{
|
|
132
|
+
type: Injectable,
|
|
133
|
+
args: [{ providedIn: 'root' }]
|
|
134
|
+
}] });
|
|
135
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVwb3J0LWRhdGEtZGlzY292ZXJ5LnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9id2F5cy1yZXBvcnQvc3JjL2xpYi9jb3JlL3NlcnZpY2VzL3JlcG9ydC1kYXRhLWRpc2NvdmVyeS5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ25ELE9BQU8sRUFBYyxFQUFFLEVBQWMsTUFBTSxNQUFNLENBQUM7QUFDbEQsT0FBTyxFQUFFLFVBQVUsRUFBRSxHQUFHLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNqRCxPQUFPLEVBS0wsNEJBQTRCLEdBQzdCLE1BQU0sdURBQXVELENBQUM7QUFDL0QsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sNkNBQTZDLENBQUM7QUFDbEYsT0FBTyxFQUFFLDJCQUEyQixFQUFFLE1BQU0sa0NBQWtDLENBQUM7QUFHL0UsT0FBTyxFQUFFLHdCQUF3QixFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFDMUUsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sK0JBQStCLENBQUM7O0FBRW5FOzs7Ozs7Ozs7R0FTRztBQUVILE1BQU0sT0FBTywwQkFBMEI7SUFDcEIsZ0JBQWdCLEdBQUcsTUFBTSxDQUFDLDRCQUE0QixFQUFFLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7SUFDNUUsYUFBYSxHQUFHLE1BQU0sQ0FBQyxtQkFBbUIsRUFBRSxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO0lBQ2hFLGNBQWMsR0FBRyxNQUFNLENBQUMsMkJBQTJCLEVBQUUsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztJQUUxRjs7T0FFRztJQUNILFdBQVcsQ0FBQyxLQUE0QjtRQUN0QyxJQUFJLENBQUMsSUFBSSxDQUFDLGdCQUFn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b3JlJztcbmltcG9ydCB7IE9ic2VydmFibGUsIG9mLCB0aHJvd0Vycm9yIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBjYXRjaEVycm9yLCBtYXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQge1xuICBEYXRhYmFzZUVudGl0eU1ldGFkYXRhLFxuICBEYXRhYmFzZUVudGl0eVR5cGUsXG4gIEVudGl0eUNvbHVtbk1ldGFkYXRhLFxuICBQcm9jZWR1cmVQYXJhbWV0ZXJNZXRhZGF0YSxcbiAgUmVwb3J0U2NoZW1hRGlzY292ZXJ5QWRhcHRlcixcbn0gZnJvbSAnLi4vLi4vZGF0YS1hY2Nlc3MvY29udHJhY3RzL3NjaGVtYS1kaXNjb3ZlcnkuY29udHJhY3QnO1xuaW1wb3J0IHsgUmVwb3J0TG9va3VwQWRhcHRlciB9IGZyb20gJy4uLy4uL2RhdGEtYWNjZXNzL2NvbnRyYWN0cy9sb29rdXAuY29udHJhY3QnO1xuaW1wb3J0IHsgUmVwb3J0U2Vzc2lvbkNvbnRleHRTZXJ2aWNlIH0gZnJvbSAnLi9yZXBvcnQtc2Vzc2lvbi1jb250ZXh0LnNlcnZpY2UnO1xuaW1wb3J0IHsgR3JpZENvbHVtbkRlZmluaXRpb24gfSBmcm9tICcuLi9tb2RlbHMvcmVwb3J0LWdyaWQubW9kZWwnO1xuaW1wb3J0IHsgRHJvcGRvd25Tb3VyY2VUeXBlIH0gZnJvbSAnLi4vbW9kZWxzL3JlcG9ydC1jb21wb25lbnQubW9kZWwnO1xuaW1wb3J0IHsgcmVzb2x2ZVBhcmFtZXRlck1hcHBpbmdzIH0gZnJvbSAnLi4vdXRpbHMvcmVwb3J0LXBhcmFtZXRlci51dGlsJztcbmltcG9ydCB7IGh1bWFuaXplSWRlbnRpZmllciB9IGZyb20gJy4uL3V0aWxzL2lkZW50aWZpZXItaHVtYW5pemVyJztcblxuLyoqXG4gKiBDZW50cmFsaXplZCBzZXJ2aWNlIGZvciBkaXNjb3ZlcmluZyBkYXRhYmFzZSBzY2hlbWEgZW50aXRpZXMsIHBhcmFtZXRlcnMsXG4gKiBhbmQgY29sdW1uIGRlZmluaXRpb25zLlxuICpcbiAqIFByb3ZpZGVzIGEgdW5pZmllZCBzdGF0aWMgKyBkeW5hbWljIGRldGVjdGlvbiBwaXBlbGluZTpcbiAqIElmIHN0YXRpYyBzY2hlbWEgbWV0YWRhdGEgZGlzY292ZXJ5IGZhaWxzIChlLmcuIFNRTCBTZXJ2ZXIgc3RvcmVkIHByb2NlZHVyZXNcbiAqIHVzaW5nICN0ZW1wIHRhYmxlcyB0aGF0IGNhbm5vdCBiZSBhbmFseXplZCBzdGF0aWNhbGx5KSwgaXQgYXV0b21hdGljYWxseVxuICogZmFsbHMgYmFjayB0byBleGVjdXRpbmcgYSBzYWZlIGR5bmFtaWMgc2FtcGxlIHF1ZXJ5IHdpdGggdGhlIGFjdGl2ZSBwYXJhbWV0ZXJcbiAqIHZhbHVlcyBhbmQgZXh0cmFjdGluZyBjb2x1bW4gZGVmaW5pdGlvbnMgZnJvbSB0aGUgcmVzdWx0IGRhdGFzZXQuXG4gKi9cbkBJbmplY3RhYmxlKHsgcHJvdmlkZWRJbjogJ3Jvb3QnIH0pXG5leHBvcnQgY2xhc3MgUmVwb3J0RGF0YURpc2NvdmVyeVNlcnZpY2Uge1xuICBwcml2YXRlIHJlYWRvbmx5IGRpc2NvdmVyeUFkYXB0ZXIgPSBpbmplY3QoUmVwb3J0U2NoZW1hRGlzY292ZXJ5QWRhcHRlciwgeyBvcHRpb25hbDogdHJ1ZSB9KTtcbiAgcHJpdmF0ZSByZWFkb25seSBsb29rdXBBZGFwdGVyID0gaW5qZWN0KFJlcG9ydExvb2t1cEFkYXB0ZXIsIHsgb3B0aW9uYWw6IHRydWUgfSk7XG4gIHByaXZhdGUgcmVhZG9ubHkgc2Vzc2lvblNlcnZpY2UgPSBpbmplY3QoUmVwb3J0U2Vzc2lvbkNvbnRleHRTZXJ2aWNlLCB7IG9wdGlvbmFsOiB0cnVlIH0pO1xuXG4gIC8qKlxuICAgKiBSZXRyaWV2ZXMgYWxsIGRhdGFiYXNlIHRhYmxlcywgdmlld3MsIGFuZCBzdG9yZWQgcHJvY2VkdXJlcy5cbiAgICovXG4gIGdldEVudGl0aWVzKHR5cGVzPzogRGF0YWJhc2VFbnRpdHlUeXBlW10pOiBPYnNlcnZhYmxlPERhdGFiYXNlRW50aXR5TWV0YWRhdGFbXT4ge1xuICAgIGlmICghdGhpcy5kaXNjb3ZlcnlBZGFwdGVyKSB7XG4gICAgICByZXR1cm4gb2YoW10pO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5kaXNjb3ZlcnlBZGFwdGVyLmdldEVudGl0aWVzKHR5cGVzKS5waXBlKFxuICAgICAgY2F0Y2hFcnJvcigoZXJyKSA9PiB7XG4gICAgICAgIGNvbnNvbGUud2FybignW1JlcG9ydERhdGFEaXNjb3ZlcnlTZXJ2aWNlXSBGYWlsZWQgdG8gZ2V0IGVudGl0aWVzOicsIGVycik7XG4gICAgICAgIHJldHVybiBvZihbXSk7XG4gICAgICB9KVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogUmV0cmlldmVzIHN0b3JlZCBwcm9jZWR1cmUgcGFyYW1ldGVyIG1ldGFkYXRhLlxuICAgKi9cbiAgZ2V0UGFyYW1ldGVycyhwcm9jZWR1cmVOYW1lOiBzdHJpbmcsIHNjaGVtYSA9ICdkYm8nKTogT2JzZXJ2YWJsZTxQcm9jZWR1cmVQYXJhbWV0ZXJNZXRhZGF0YVtdPiB7XG4gICAgaWYgKCFwcm9jZWR1cmVOYW1lIHx8ICF0aGlzLmRpc2NvdmVyeUFkYXB0ZXIpIHtcbiAgICAgIHJldHVybiBvZihbXSk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmRpc2NvdmVyeUFkYXB0ZXIuZ2V0UGFyYW1ldGVycyhwcm9jZWR1cmVOYW1lLCBzY2hlbWEpLnBpcGUoXG4gICAgICBjYXRjaEVycm9yKChlcnIpID0+IHtcbiAgICAgICAgY29uc29sZS53YXJuKGBbUmVwb3J0RGF0YURpc2NvdmVyeVNlcnZpY2VdIEZhaWxlZCB0byBnZXQgcGFyYW1ldGVycyBmb3IgJHtwcm9jZWR1cmVOYW1lfTpgLCBlcnIpO1xuICAgICAgICByZXR1cm4gb2YoW10pO1xuICAgICAgfSlcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIFVuaWZpZWQgY29sdW1uIGRldGVjdGlvbjpcbiAgICogMS4gQXR0ZW1wdHMgc3RhdGljIHNjaGVtYSBkaXNjb3ZlcnkgdmlhIFJlcG9ydFNjaGVtYURpc2NvdmVyeUFkYXB0ZXIuXG4gICAqIDIuIElmIHN0YXRpYyBkaXNjb3ZlcnkgcmV0dXJucyAwIGNvbHVtbnMgb3IgdGhyb3dzIGFuIGVycm9yIChlLmcuIFNRTCBFcnJvciAxMTUyNiB3aXRoICN0ZW1wIHRhYmxlcyksXG4gICAqICAgIGF1dG9tYXRpY2FsbHkgcnVucyBkeW5hbWljIHNhbXBsZSBxdWVyeSB2aWEgUmVwb3J0TG9va3VwQWRhcHRlciB1c2luZyByZXNvbHZlZCBwYXJhbWV0ZXJzLlxuICAgKi9cbiAgYXV0b0RldGVjdENvbHVtbnMoXG4gICAgZW50aXR5TmFtZTogc3RyaW5nLFxuICAgIGVudGl0eVR5cGU6ICd0YWJsZScgfCAnc3RvcmVkX3Byb2NlZHVyZScgPSAnc3RvcmVkX3Byb2NlZHVyZScsXG4gICAgbWFwcGluZ3M6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0ge30sXG4gICAgc2NoZW1hID0gJ2RibydcbiAgKTogT2JzZXJ2YWJsZTxHcmlkQ29sdW1uRGVmaW5pdGlvbltdPiB7XG4gICAgaWYgKCFlbnRpdHlOYW1lKSB7XG4gICAgICByZXR1cm4gb2YoW10pO1xuICAgIH1cblxuICAgIC8vIFRyeSBzdGF0aWMgZGlzY292ZXJ5IGZpcnN0XG4gICAgaWYgKHRoaXMuZGlzY292ZXJ5QWRhcHRlcikge1xuICAgICAgcmV0dXJuIHRoaXMuZGlzY292ZXJ5QWRhcHRlci5nZXRDb2x1bW5zKGVudGl0eU5hbWUsIHNjaGVtYSwgZW50aXR5VHlwZSkucGlwZShcbiAgICAgICAgbWFwKChjb2xzKSA9PiB7XG4gICAgICAgICAgaWYgKGNvbHMgJiYgY29scy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5tYXBTdGF0aWNDb2x1bW5zVG9HcmlkKGNvbHMpO1xuICAgICAgICAgIH1cbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1NUQVRJQ19FTVBUWScpO1xuICAgICAgICB9KSxcbiAgICAgICAgY2F0Y2hFcnJvcigoKSA9PiB7XG4gICAgICAgICAgLy8gRmFsbGJhY2sgdG8gZHluYW1pYyBleGVjdXRpb25cbiAgICAgICAgICByZXR1cm4gdGhpcy5mYWxsYmFja0R5bmFtaWNEZXRlY3Rpb24oZW50aXR5TmFtZSwgZW50aXR5VHlwZSwgbWFwcGluZ3MsIHNjaGVtYSk7XG4gICAgICAgIH0pXG4gICAgICApO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLmZhbGxiYWNrRHluYW1pY0RldGVjdGlvbihlbnRpdHlOYW1lLCBlbnRpdHlUeXBlLCBtYXBwaW5ncywgc2NoZW1hKTtcbiAgfVxuXG4gIHByaXZhdGUgbWFwU3RhdGljQ29sdW1uc1RvR3JpZChjb2xzOiBFbnRpdHlDb2x1bW5NZXRhZGF0YVtdKTogR3JpZENvbHVtbkRlZmluaXRpb25bXSB7XG4gICAgcmV0dXJuIGNvbHMubWFwKChjKSA9PiAoe1xuICAgICAgZmllbGQ6IGMuZmllbGQsXG4gICAgICBsYWJlbDogaHVtYW5pemVJZGVudGlmaWVyKGMubGFiZWwgfHwgYy5maWVsZCksXG4gICAgICBkYXRhVHlwZTogKGMuZGF0YVR5cGUgYXMgYW55KSB8fCAnc3RyaW5nJyxcbiAgICAgIHZpc2libGU6IHRydWUsXG4gICAgICBzb3J0YWJsZTogdHJ1ZSxcbiAgICAgIGFsaWduOiBjLmRhdGFUeXBlID09PSAnbnVtYmVyJyA/ICdyaWdodCcgOiAnbGVmdCcsXG4gICAgfSkpO1xuICB9XG5cbiAgcHJpdmF0ZSBmYWxsYmFja0R5bmFtaWNEZXRlY3Rpb24oXG4gICAgZW50aXR5TmFtZTogc3RyaW5nLFxuICAgIHNvdXJjZVR5cGU6ICd0YWJsZScgfCAnc3RvcmVkX3Byb2NlZHVyZScsXG4gICAgbWFwcGluZ3M6IFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuICAgIHNjaGVtYSA9ICdkYm8nXG4gICk6IE9ic2VydmFibGU8R3JpZENvbHVtbkRlZmluaXRpb25bXT4ge1xuICAgIGlmICghdGhpcy5sb29rdXBBZGFwdGVyKSB7XG4gICAgICByZXR1cm4gb2YoW10pO1xuICAgIH1cblxuICAgIGNvbnN0IHNlc3Npb24gPSB0aGlzLnNlc3Npb25TZXJ2aWNlPy5nZXRDdXJyZW50U2Vzc2lvbkNvbnRleHQoKSA/PyB7fTtcbiAgICBjb25zdCByZXNvbHZlZFBhcmFtcyA9IHJlc29sdmVQYXJhbWV0ZXJNYXBwaW5ncyhtYXBwaW5ncyBhcyBhbnksIHNlc3Npb24sIHt9KTtcblxuICAgIHJldHVybiB0aGlzLmxvb2t1cEFkYXB0ZXJcbiAgICAgIC5mZXRjaE9wdGlvbnMoe1xuICAgICAgICBzb3VyY2VUeXBlOiAoc291cmNlVHlwZSA9PT0gJ3N0b3JlZF9wcm9jZWR1cmUnID8gJ3Byb2NlZHVyZScgOiBzb3VyY2VUeXBlKSBhcyBEcm9wZG93blNvdXJjZVR5cGUsXG4gICAgICAgIGVudGl0eU5hbWUsXG4gICAgICAgIHNjaGVtYSxcbiAgICAgICAgdmFsdWVGaWVsZDogJycsXG4gICAgICAgIGRpc3BsYXlGaWVsZDogJycsXG4gICAgICAgIHBhcmFtZXRlcnM6IHJlc29sdmVkUGFyYW1zLFxuICAgICAgfSlcbiAgICAgIC5waXBlKFxuICAgICAgICBtYXAoKGl0ZW1zKSA9PiB7XG4gICAgICAgICAgaWYgKGl0ZW1zICYmIGl0ZW1zLmxlbmd0aCA+IDAgJiYgaXRlbXNbMF0ucmF3KSB7XG4gICAgICAgICAgICBjb25zdCBzYW1wbGVSb3cgPSBpdGVtc1swXS5yYXcgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gICAgICAgICAgICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXMoc2FtcGxlUm93KTtcbiAgICAgICAgICAgIGlmIChrZXlzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGtleXMubWFwKChrZXkpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCB2YWwgPSBzYW1wbGVSb3dba2V5XTtcbiAgICAgICAgICAgICAgICBsZXQgdHlwZTogJ3N0cmluZycgfCAnbnVtYmVyJyB8ICdkYXRlJyB8ICdib29sZWFuJyA9ICdzdHJpbmcnO1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgdmFsID09PSAnbnVtYmVyJykgdHlwZSA9ICdudW1iZXInO1xuICAgICAgICAgICAgICAgIGVsc2UgaWYgKHR5cGVvZiB2YWwgPT09ICdib29sZWFuJykgdHlwZSA9ICdib29sZWFuJztcbiAgICAgICAgICAgICAgICBlbHNlIGlmICh0eXBlb2YgdmFsID09PSAnc3RyaW5nJyAmJiAvXlxcZHs0fS1cXGR7Mn0tXFxkezJ9Ly50ZXN0KHZhbCkpIHR5cGUgPSAnZGF0ZSc7XG5cbiAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgZmllbGQ6IGtleSxcbiAgICAgICAgICAgICAgICAgIGxhYmVsOiBodW1hbml6ZUlkZW50aWZpZXIoa2V5KSxcbiAgICAgICAgICAgICAgICAgIGRhdGFUeXBlOiB0eXBlLFxuICAgICAgICAgICAgICAgICAgdmlzaWJsZTogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgIHNvcnRhYmxlOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgYWxpZ246ICh0eXBlID09PSAnbnVtYmVyJyA/ICdyaWdodCcgOiAnbGVmdCcpIGFzICdyaWdodCcgfCAnbGVmdCcsXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBbXTtcbiAgICAgICAgfSksXG4gICAgICAgIGNhdGNoRXJyb3IoKGVycikgPT4ge1xuICAgICAgICAgIGNvbnNvbGUud2FybihgW1JlcG9ydERhdGFEaXNjb3ZlcnlTZXJ2aWNlXSBEeW5hbWljIHNhbXBsZSBkZXRlY3Rpb24gZmFpbGVkIGZvciAke2VudGl0eU5hbWV9OmAsIGVycik7XG4gICAgICAgICAgcmV0dXJuIG9mKFtdKTtcbiAgICAgICAgfSlcbiAgICAgICk7XG4gIH1cbn1cbiJdfQ==
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import { Injectable, inject } from '@angular/core';
|
|
2
|
+
import { REPORT_STORAGE } from '../tokens/storage.token';
|
|
3
|
+
import * as i0 from "@angular/core";
|
|
4
|
+
/**
|
|
5
|
+
* Angular injectable service wrapping report storage operations.
|
|
6
|
+
* Provides type-safe JSON serialization/deserialization and environment-agnostic access.
|
|
7
|
+
*/
|
|
8
|
+
export class ReportStorageService {
|
|
9
|
+
storage = inject(REPORT_STORAGE);
|
|
10
|
+
getItem(key) {
|
|
11
|
+
return this.storage.getItem(key);
|
|
12
|
+
}
|
|
13
|
+
setItem(key, value) {
|
|
14
|
+
this.storage.setItem(key, value);
|
|
15
|
+
}
|
|
16
|
+
removeItem(key) {
|
|
17
|
+
this.storage.removeItem(key);
|
|
18
|
+
}
|
|
19
|
+
clear() {
|
|
20
|
+
this.storage.clear();
|
|
21
|
+
}
|
|
22
|
+
key(index) {
|
|
23
|
+
return this.storage.key ? this.storage.key(index) : null;
|
|
24
|
+
}
|
|
25
|
+
get length() {
|
|
26
|
+
return this.storage.length ?? 0;
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Safely retrieves and parses a JSON value from storage.
|
|
30
|
+
* Returns fallback if key is missing or parsing fails.
|
|
31
|
+
*/
|
|
32
|
+
getJSON(key, fallback) {
|
|
33
|
+
const raw = this.getItem(key);
|
|
34
|
+
if (!raw)
|
|
35
|
+
return fallback;
|
|
36
|
+
try {
|
|
37
|
+
return JSON.parse(raw);
|
|
38
|
+
}
|
|
39
|
+
catch {
|
|
40
|
+
return fallback;
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Safely serializes and stores a JSON value in storage.
|
|
45
|
+
*/
|
|
46
|
+
setJSON(key, value) {
|
|
47
|
+
try {
|
|
48
|
+
this.setItem(key, JSON.stringify(value));
|
|
49
|
+
}
|
|
50
|
+
catch {
|
|
51
|
+
// Storage error or circular structure handled gracefully
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ReportStorageService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
|
|
55
|
+
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ReportStorageService, providedIn: 'root' });
|
|
56
|
+
}
|
|
57
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ReportStorageService, decorators: [{
|
|
58
|
+
type: Injectable,
|
|
59
|
+
args: [{
|
|
60
|
+
providedIn: 'root',
|
|
61
|
+
}]
|
|
62
|
+
}] });
|
|
63
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVwb3J0LXN0b3JhZ2Uuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2J3YXlzLXJlcG9ydC9zcmMvbGliL2NvcmUvc2VydmljZXMvcmVwb3J0LXN0b3JhZ2Uuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNuRCxPQUFPLEVBQUUsY0FBYyxFQUFpQixNQUFNLHlCQUF5QixDQUFDOztBQUV4RTs7O0dBR0c7QUFJSCxNQUFNLE9BQU8sb0JBQW9CO0lBQ2QsT0FBTyxHQUFHLE1BQU0sQ0FBQyxjQUFjLENBQUMsQ0FBQztJQUVsRCxPQUFPLENBQUMsR0FBVztRQUNqQixPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ25DLENBQUM7SUFFRCxPQUFPLENBQUMsR0FBVyxFQUFFLEtBQWE7UUFDaEMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBQ25DLENBQUM7SUFFRCxVQUFVLENBQUMsR0FBVztRQUNwQixJQUFJLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUMvQixDQUFDO0lBRUQsS0FBSztRQUNILElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLENBQUM7SUFDdkIsQ0FBQztJQUVELEdBQUcsQ0FBQyxLQUFhO1FBQ2YsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztJQUMzRCxDQUFDO0lBRUQsSUFBSSxNQUFNO1FBQ1IsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sSUFBSSxDQUFDLENBQUM7SUFDbEMsQ0FBQztJQUVEOzs7T0FHRztJQUNILE9BQU8sQ0FBSSxHQUFXLEVBQUUsUUFBVztRQUNqQyxNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQzlCLElBQUksQ0FBQyxHQUFHO1lBQUUsT0FBTyxRQUFRLENBQUM7UUFDMUIsSUFBSSxDQUFDO1lBQ0gsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBTSxDQUFDO1FBQzlCLENBQUM7UUFBQyxNQUFNLENBQUM7WUFDUCxPQUFPLFFBQVEsQ0FBQztRQUNsQixDQUFDO0lBQ0gsQ0FBQztJQUVEOztPQUVHO0lBQ0gsT0FBTyxDQUFJLEdBQVcsRUFBRSxLQUFRO1FBQzlCLElBQUksQ0FBQztZQUNILElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztRQUMzQyxDQUFDO1FBQUMsTUFBTSxDQUFDO1lBQ1AseURBQXlEO1FBQzNELENBQUM7SUFDSCxDQUFDO3dHQWxEVSxvQkFBb0I7NEdBQXBCLG9CQUFvQixjQUZuQixNQUFNOzs0RkFFUCxvQkFBb0I7a0JBSGhDLFVBQVU7bUJBQUM7b0JBQ1YsVUFBVSxFQUFFLE1BQU07aUJBQ25CIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSwgaW5qZWN0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBSRVBPUlRfU1RPUkFHRSwgUmVwb3J0U3RvcmFnZSB9IGZyb20gJy4uL3Rva2Vucy9zdG9yYWdlLnRva2VuJztcblxuLyoqXG4gKiBBbmd1bGFyIGluamVjdGFibGUgc2VydmljZSB3cmFwcGluZyByZXBvcnQgc3RvcmFnZSBvcGVyYXRpb25zLlxuICogUHJvdmlkZXMgdHlwZS1zYWZlIEpTT04gc2VyaWFsaXphdGlvbi9kZXNlcmlhbGl6YXRpb24gYW5kIGVudmlyb25tZW50LWFnbm9zdGljIGFjY2Vzcy5cbiAqL1xuQEluamVjdGFibGUoe1xuICBwcm92aWRlZEluOiAncm9vdCcsXG59KVxuZXhwb3J0IGNsYXNzIFJlcG9ydFN0b3JhZ2VTZXJ2aWNlIGltcGxlbWVudHMgUmVwb3J0U3RvcmFnZSB7XG4gIHByaXZhdGUgcmVhZG9ubHkgc3RvcmFnZSA9IGluamVjdChSRVBPUlRfU1RPUkFHRSk7XG5cbiAgZ2V0SXRlbShrZXk6IHN0cmluZyk6IHN0cmluZyB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLnN0b3JhZ2UuZ2V0SXRlbShrZXkpO1xuICB9XG5cbiAgc2V0SXRlbShrZXk6IHN0cmluZywgdmFsdWU6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMuc3RvcmFnZS5zZXRJdGVtKGtleSwgdmFsdWUpO1xuICB9XG5cbiAgcmVtb3ZlSXRlbShrZXk6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMuc3RvcmFnZS5yZW1vdmVJdGVtKGtleSk7XG4gIH1cblxuICBjbGVhcigpOiB2b2lkIHtcbiAgICB0aGlzLnN0b3JhZ2UuY2xlYXIoKTtcbiAgfVxuXG4gIGtleShpbmRleDogbnVtYmVyKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMuc3RvcmFnZS5rZXkgPyB0aGlzLnN0b3JhZ2Uua2V5KGluZGV4KSA6IG51bGw7XG4gIH1cblxuICBnZXQgbGVuZ3RoKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuc3RvcmFnZS5sZW5ndGggPz8gMDtcbiAgfVxuXG4gIC8qKlxuICAgKiBTYWZlbHkgcmV0cmlldmVzIGFuZCBwYXJzZXMgYSBKU09OIHZhbHVlIGZyb20gc3RvcmFnZS5cbiAgICogUmV0dXJucyBmYWxsYmFjayBpZiBrZXkgaXMgbWlzc2luZyBvciBwYXJzaW5nIGZhaWxzLlxuICAgKi9cbiAgZ2V0SlNPTjxUPihrZXk6IHN0cmluZywgZmFsbGJhY2s6IFQpOiBUIHtcbiAgICBjb25zdCByYXcgPSB0aGlzLmdldEl0ZW0oa2V5KTtcbiAgICBpZiAoIXJhdykgcmV0dXJuIGZhbGxiYWNrO1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gSlNPTi5wYXJzZShyYXcpIGFzIFQ7XG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm4gZmFsbGJhY2s7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFNhZmVseSBzZXJpYWxpemVzIGFuZCBzdG9yZXMgYSBKU09OIHZhbHVlIGluIHN0b3JhZ2UuXG4gICAqL1xuICBzZXRKU09OPFQ+KGtleTogc3RyaW5nLCB2YWx1ZTogVCk6IHZvaWQge1xuICAgIHRyeSB7XG4gICAgICB0aGlzLnNldEl0ZW0oa2V5LCBKU09OLnN0cmluZ2lmeSh2YWx1ZSkpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gU3RvcmFnZSBlcnJvciBvciBjaXJjdWxhciBzdHJ1Y3R1cmUgaGFuZGxlZCBncmFjZWZ1bGx5XG4gICAgfVxuICB9XG59XG4iXX0=
|
|
@@ -1,3 +1,4 @@
|
|
|
1
1
|
export { REPORTING_CONFIG, GRID_COMPONENT, CHART_COMPONENT, } from './reporting-config.token';
|
|
2
2
|
export { REPORT_SESSION_CONTEXT, REPORT_SESSION_PROVIDER, SessionContextProvider, } from './session-context.token';
|
|
3
|
-
|
|
3
|
+
export { REPORT_STORAGE, BrowserReportStorage, MemoryReportStorage, } from './storage.token';
|
|
4
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9id2F5cy1yZXBvcnQvc3JjL2xpYi9jb3JlL3Rva2Vucy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsZ0JBQWdCLEVBQ2hCLGNBQWMsRUFDZCxlQUFlLEdBQ2hCLE1BQU0sMEJBQTBCLENBQUM7QUFNbEMsT0FBTyxFQUNMLHNCQUFzQixFQUN0Qix1QkFBdUIsRUFDdkIsc0JBQXNCLEdBQ3ZCLE1BQU0seUJBQXlCLENBQUM7QUFTakMsT0FBTyxFQUNMLGNBQWMsRUFDZCxvQkFBb0IsRUFDcEIsbUJBQW1CLEdBQ3BCLE1BQU0saUJBQWlCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQge1xuICBSRVBPUlRJTkdfQ09ORklHLFxuICBHUklEX0NPTVBPTkVOVCxcbiAgQ0hBUlRfQ09NUE9ORU5ULFxufSBmcm9tICcuL3JlcG9ydGluZy1jb25maWcudG9rZW4nO1xuXG5leHBvcnQgdHlwZSB7XG4gIFJlcG9ydGluZ0NvbmZpZyxcbn0gZnJvbSAnLi9yZXBvcnRpbmctY29uZmlnLnRva2VuJztcblxuZXhwb3J0IHtcbiAgUkVQT1JUX1NFU1NJT05fQ09OVEVYVCxcbiAgUkVQT1JUX1NFU1NJT05fUFJPVklERVIsXG4gIFNlc3Npb25Db250ZXh0UHJvdmlkZXIsXG59IGZyb20gJy4vc2Vzc2lvbi1jb250ZXh0LnRva2VuJztcblxuZXhwb3J0IHR5cGUge1xuICBTZXNzaW9uUGFyYW1QcmltaXRpdmUsXG4gIFNlc3Npb25Db250ZXh0TWFwLFxuICBTZXNzaW9uQ29udGV4dFByb3ZpZGVyRm4sXG4gIFNlc3Npb25Db250ZXh0U291cmNlLFxufSBmcm9tICcuL3Nlc3Npb24tY29udGV4dC50b2tlbic7XG5cbmV4cG9ydCB7XG4gIFJFUE9SVF9TVE9SQUdFLFxuICBCcm93c2VyUmVwb3J0U3RvcmFnZSxcbiAgTWVtb3J5UmVwb3J0U3RvcmFnZSxcbn0gZnJvbSAnLi9zdG9yYWdlLnRva2VuJztcblxuZXhwb3J0IHR5cGUge1xuICBSZXBvcnRTdG9yYWdlLFxufSBmcm9tICcuL3N0b3JhZ2UudG9rZW4nO1xuIl19
|
|
@@ -23,4 +23,4 @@ export const CHART_COMPONENT = new InjectionToken('CHART_COMPONENT');
|
|
|
23
23
|
* Injection token for the reporting library configuration.
|
|
24
24
|
*/
|
|
25
25
|
export const REPORTING_CONFIG = new InjectionToken('REPORTING_CONFIG');
|
|
26
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
26
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVwb3J0aW5nLWNvbmZpZy50b2tlbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2J3YXlzLXJlcG9ydC9zcmMvbGliL2NvcmUvdG9rZW5zL3JlcG9ydGluZy1jb25maWcudG9rZW4udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7O0dBS0c7QUFFSCxPQUFPLEVBQUUsY0FBYyxFQUFRLE1BQU0sZUFBZSxDQUFDO0FBNEJyRDs7Ozs7R0FLRztBQUNILE1BQU0sQ0FBQyxNQUFNLGNBQWMsR0FBRyxJQUFJLGNBQWMsQ0FBZ0IsZ0JBQWdCLENBQUMsQ0FBQztBQUVsRjs7Ozs7R0FLRztBQUNILE1BQU0sQ0FBQyxNQUFNLGVBQWUsR0FBRyxJQUFJLGNBQWMsQ0FBZ0IsaUJBQWlCLENBQUMsQ0FBQztBQUVwRjs7R0FFRztBQUNILE1BQU0sQ0FBQyxNQUFNLGdCQUFnQixHQUFHLElBQUksY0FBYyxDQUFrQixrQkFBa0IsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBSZXBvcnRpbmcgbGlicmFyeSBjb25maWd1cmF0aW9uIHRva2Vucy5cbiAqXG4gKiBDb3JlIGNvbmZpZ3VyYXRpb24gbW9kZWxzIGFuZCBpbmplY3Rpb24gdG9rZW5zLlxuICogRGVjb3VwbGVkIGZyb20gVUkgcHJpbWl0aXZlcyBhbmQgZGF0YS1hY2Nlc3MgYWRhcHRlcnMuXG4gKi9cblxuaW1wb3J0IHsgSW5qZWN0aW9uVG9rZW4sIFR5cGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuLyoqXG4gKiBMaWJyYXJ5IGNvbmZpZ3VyYXRpb24gb3B0aW9ucy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBSZXBvcnRpbmdDb25maWcge1xuICAvKiogRGVmYXVsdCBwYWdlIHNpemUgZm9yIGdyaWRzLiAqL1xuICBkZWZhdWx0UGFnZVNpemU6IG51bWJlcjtcblxuICAvKiogRGF0ZSBmb3JtYXQgc3RyaW5nIHVzZWQgYWNyb3NzIHRoZSBsaWJyYXJ5LiAqL1xuICBkYXRlRm9ybWF0OiBzdHJpbmc7XG5cbiAgLyoqIFdoZXRoZXIgdGhlIERlc2lnbmVyIGZlYXR1cmUgaXMgZW5hYmxlZC4gKi9cbiAgZW5hYmxlRGVzaWduZXI6IGJvb2xlYW47XG5cbiAgLyoqIEN1cnJlbnQgc2NoZW1hIHZlcnNpb24gZm9yIG5ldyByZXBvcnRzLiAqL1xuICBzY2hlbWFWZXJzaW9uOiBudW1iZXI7XG5cbiAgLyoqIEJhc2UgVVJMIGZvciBiYWNrZW5kIHJlcG9ydGluZyBlbmRwb2ludHMgKE5lc3RKUyAvIC5ORVQgLyBSRVNUIEFQSSkuICovXG4gIGFwaUJhc2VVcmw/OiBzdHJpbmc7XG5cbiAgLyoqIFdoZXRoZXIgYXV0b21hdGljIGJhY2tlbmQgc2NoZW1hIGRpc2NvdmVyeSAoU1BzICYgVGFibGVzKSBpcyBlbmFibGVkLiAqL1xuICBlbmFibGVTY2hlbWFEaXNjb3Zlcnk/OiBib29sZWFuO1xuXG4gIC8qKiBPcHRpb25hbCB0aW1lb3V0IGluIG1pbGxpc2Vjb25kcyBmb3IgZHJvcGRvd24gbG9va3VwIHF1ZXJpZXMgKGRlZmF1bHRzIHRvIDMwMDAwMG1zIC8gNSBtaW51dGVzKS4gKi9cbiAgbG9va3VwVGltZW91dE1zPzogbnVtYmVyO1xufVxuXG4vKipcbiAqIEluamVjdGlvbiB0b2tlbiBmb3IgdGhlIGdyaWQgY29tcG9uZW50LlxuICpcbiAqIFRoZSBob3N0IHByb3ZpZGVzIHRoZWlyIGdyaWQgY29tcG9uZW50IChCV2F5cy1ncmlkLCBBRyBHcmlkIHdyYXBwZXIsIGV0Yy4pXG4gKiBhbmQgdGhlIGBSZXBvcnRHcmlkQnJpZGdlQ29tcG9uZW50YCByZXNvbHZlcyBpdCBhdCBydW50aW1lLlxuICovXG5leHBvcnQgY29uc3QgR1JJRF9DT01QT05FTlQgPSBuZXcgSW5qZWN0aW9uVG9rZW48VHlwZTx1bmtub3duPj4oJ0dSSURfQ09NUE9ORU5UJyk7XG5cbi8qKlxuICogSW5qZWN0aW9uIHRva2VuIGZvciB0aGUgY2hhcnQgY29tcG9uZW50LlxuICpcbiAqIFRoZSBob3N0IGNhbiBwcm92aWRlIHRoZWlyIHByZWZlcnJlZCBjaGFydCBjb21wb25lbnQgKENoYXJ0LmpzLCBIaWdoY2hhcnRzLCBBcGV4Q2hhcnRzIHdyYXBwZXIsIGV0Yy4pXG4gKiBhbmQgdGhlIGBSZXBvcnRDaGFydEJyaWRnZUNvbXBvbmVudGAgZGVsZWdhdGVzIHJlbmRlcmluZyB0byBpdCwgb3IgZmFsbHMgYmFjayB0byBidWlsdC1pbiBTVkcgY2hhcnRzLlxuICovXG5leHBvcnQgY29uc3QgQ0hBUlRfQ09NUE9ORU5UID0gbmV3IEluamVjdGlvblRva2VuPFR5cGU8dW5rbm93bj4+KCdDSEFSVF9DT01QT05FTlQnKTtcblxuLyoqXG4gKiBJbmplY3Rpb24gdG9rZW4gZm9yIHRoZSByZXBvcnRpbmcgbGlicmFyeSBjb25maWd1cmF0aW9uLlxuICovXG5leHBvcnQgY29uc3QgUkVQT1JUSU5HX0NPTkZJRyA9IG5ldyBJbmplY3Rpb25Ub2tlbjxSZXBvcnRpbmdDb25maWc+KCdSRVBPUlRJTkdfQ09ORklHJyk7XG4iXX0=
|
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
import { InjectionToken } from '@angular/core';
|
|
2
|
+
/**
|
|
3
|
+
* In-memory fallback implementation of ReportStorage.
|
|
4
|
+
* Safe for SSR, unit tests, and sandboxed iframes where localStorage access is denied.
|
|
5
|
+
*/
|
|
6
|
+
export class MemoryReportStorage {
|
|
7
|
+
store = new Map();
|
|
8
|
+
getItem(key) {
|
|
9
|
+
return this.store.get(key) ?? null;
|
|
10
|
+
}
|
|
11
|
+
setItem(key, value) {
|
|
12
|
+
this.store.set(key, value);
|
|
13
|
+
}
|
|
14
|
+
removeItem(key) {
|
|
15
|
+
this.store.delete(key);
|
|
16
|
+
}
|
|
17
|
+
clear() {
|
|
18
|
+
this.store.clear();
|
|
19
|
+
}
|
|
20
|
+
key(index) {
|
|
21
|
+
const keys = Array.from(this.store.keys());
|
|
22
|
+
return keys[index] ?? null;
|
|
23
|
+
}
|
|
24
|
+
get length() {
|
|
25
|
+
return this.store.size;
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Browser localStorage-backed implementation of ReportStorage
|
|
30
|
+
* with transparent in-memory fallback on DOMException or SSR.
|
|
31
|
+
*/
|
|
32
|
+
export class BrowserReportStorage {
|
|
33
|
+
memory = new MemoryReportStorage();
|
|
34
|
+
isSupported;
|
|
35
|
+
constructor() {
|
|
36
|
+
this.isSupported = this.checkStorageSupport();
|
|
37
|
+
}
|
|
38
|
+
checkStorageSupport() {
|
|
39
|
+
if (typeof window === 'undefined')
|
|
40
|
+
return false;
|
|
41
|
+
try {
|
|
42
|
+
const probe = '__bways_storage_probe__';
|
|
43
|
+
window.localStorage.setItem(probe, probe);
|
|
44
|
+
window.localStorage.removeItem(probe);
|
|
45
|
+
return true;
|
|
46
|
+
}
|
|
47
|
+
catch {
|
|
48
|
+
return false;
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
getItem(key) {
|
|
52
|
+
if (this.isSupported) {
|
|
53
|
+
try {
|
|
54
|
+
return window.localStorage.getItem(key);
|
|
55
|
+
}
|
|
56
|
+
catch {
|
|
57
|
+
return this.memory.getItem(key);
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
return this.memory.getItem(key);
|
|
61
|
+
}
|
|
62
|
+
setItem(key, value) {
|
|
63
|
+
if (this.isSupported) {
|
|
64
|
+
try {
|
|
65
|
+
window.localStorage.setItem(key, value);
|
|
66
|
+
return;
|
|
67
|
+
}
|
|
68
|
+
catch {
|
|
69
|
+
// Fall back to in-memory on quota or security exceptions
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
this.memory.setItem(key, value);
|
|
73
|
+
}
|
|
74
|
+
removeItem(key) {
|
|
75
|
+
if (this.isSupported) {
|
|
76
|
+
try {
|
|
77
|
+
window.localStorage.removeItem(key);
|
|
78
|
+
}
|
|
79
|
+
catch {
|
|
80
|
+
// Ignore
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
this.memory.removeItem(key);
|
|
84
|
+
}
|
|
85
|
+
clear() {
|
|
86
|
+
if (this.isSupported) {
|
|
87
|
+
try {
|
|
88
|
+
window.localStorage.clear();
|
|
89
|
+
}
|
|
90
|
+
catch {
|
|
91
|
+
// Ignore
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
this.memory.clear();
|
|
95
|
+
}
|
|
96
|
+
key(index) {
|
|
97
|
+
if (this.isSupported) {
|
|
98
|
+
try {
|
|
99
|
+
return window.localStorage.key(index);
|
|
100
|
+
}
|
|
101
|
+
catch {
|
|
102
|
+
return this.memory.key(index);
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
return this.memory.key(index);
|
|
106
|
+
}
|
|
107
|
+
get length() {
|
|
108
|
+
if (this.isSupported) {
|
|
109
|
+
try {
|
|
110
|
+
return window.localStorage.length;
|
|
111
|
+
}
|
|
112
|
+
catch {
|
|
113
|
+
return this.memory.length;
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
return this.memory.length;
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
/**
|
|
120
|
+
* Injection token for the report storage engine.
|
|
121
|
+
* Defaults to `BrowserReportStorage`, which transparently falls back to
|
|
122
|
+
* `MemoryReportStorage` when browser localStorage is unavailable or restricted.
|
|
123
|
+
*/
|
|
124
|
+
export const REPORT_STORAGE = new InjectionToken('REPORT_STORAGE', {
|
|
125
|
+
providedIn: 'root',
|
|
126
|
+
factory: () => new BrowserReportStorage(),
|
|
127
|
+
});
|
|
128
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RvcmFnZS50b2tlbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2J3YXlzLXJlcG9ydC9zcmMvbGliL2NvcmUvdG9rZW5zL3N0b3JhZ2UudG9rZW4udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQWUvQzs7O0dBR0c7QUFDSCxNQUFNLE9BQU8sbUJBQW1CO0lBQ2IsS0FBSyxHQUFHLElBQUksR0FBRyxFQUFrQixDQUFDO0lBRW5ELE9BQU8sQ0FBQyxHQUFXO1FBQ2pCLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLElBQUksSUFBSSxDQUFDO0lBQ3JDLENBQUM7SUFFRCxPQUFPLENBQUMsR0FBVyxFQUFFLEtBQWE7UUFDaEMsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBQzdCLENBQUM7SUFFRCxVQUFVLENBQUMsR0FBVztRQUNwQixJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUN6QixDQUFDO0lBRUQsS0FBSztRQUNILElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxFQUFFLENBQUM7SUFDckIsQ0FBQztJQUVELEdBQUcsQ0FBQyxLQUFhO1FBQ2YsTUFBTSxJQUFJLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUM7UUFDM0MsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksSUFBSSxDQUFDO0lBQzdCLENBQUM7SUFFRCxJQUFJLE1BQU07UUFDUixPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDO0lBQ3pCLENBQUM7Q0FDRjtBQUVEOzs7R0FHRztBQUNILE1BQU0sT0FBTyxvQkFBb0I7SUFDZCxNQUFNLEdBQUcs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LElBQUksQ0FBQztnQkFDSCxPQUFPLE1BQU0sQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDO1lBQ3BDLENBQUM7WUFBQyxNQUFNLENBQUM7Z0JBQ1AsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQztZQUM1QixDQUFDO1FBQ0gsQ0FBQztRQUNELE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUM7SUFDNUIsQ0FBQztDQUNGO0FBRUQ7Ozs7R0FJRztBQUNILE1BQU0sQ0FBQyxNQUFNLGNBQWMsR0FBRyxJQUFJLGNBQWMsQ0FBZ0IsZ0JBQWdCLEVBQUU7SUFDaEYsVUFBVSxFQUFFLE1BQU07SUFDbEIsT0FBTyxFQUFFLEdBQUcsRUFBRSxDQUFDLElBQUksb0JBQW9CLEVBQUU7Q0FDMUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0aW9uVG9rZW4gfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuLyoqXG4gKiBTdG9yYWdlIGNvbnRyYWN0IGZvciByZWFkaW5nIGFuZCB3cml0aW5nIHJlcG9ydCBjb25maWd1cmF0aW9ucyxcbiAqIHByZXNldHMsIGFuZCBsYXlvdXQgc3RhdGVzIGFjcm9zcyBlbnZpcm9ubWVudHMgKEJyb3dzZXIsIFNTUiwgc2FuZGJveGVkIGlmcmFtZXMpLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFJlcG9ydFN0b3JhZ2Uge1xuICBnZXRJdGVtKGtleTogc3RyaW5nKTogc3RyaW5nIHwgbnVsbDtcbiAgc2V0SXRlbShrZXk6IHN0cmluZywgdmFsdWU6IHN0cmluZyk6IHZvaWQ7XG4gIHJlbW92ZUl0ZW0oa2V5OiBzdHJpbmcpOiB2b2lkO1xuICBjbGVhcigpOiB2b2lkO1xuICBrZXk/KGluZGV4OiBudW1iZXIpOiBzdHJpbmcgfCBudWxsO1xuICByZWFkb25seSBsZW5ndGg/OiBudW1iZXI7XG59XG5cbi8qKlxuICogSW4tbWVtb3J5IGZhbGxiYWNrIGltcGxlbWVudGF0aW9uIG9mIFJlcG9ydFN0b3JhZ2UuXG4gKiBTYWZlIGZvciBTU1IsIHVuaXQgdGVzdHMsIGFuZCBzYW5kYm94ZWQgaWZyYW1lcyB3aGVyZSBsb2NhbFN0b3JhZ2UgYWNjZXNzIGlzIGRlbmllZC5cbiAqL1xuZXhwb3J0IGNsYXNzIE1lbW9yeVJlcG9ydFN0b3JhZ2UgaW1wbGVtZW50cyBSZXBvcnRTdG9yYWdlIHtcbiAgcHJpdmF0ZSByZWFkb25seSBzdG9yZSA9IG5ldyBNYXA8c3RyaW5nLCBzdHJpbmc+KCk7XG5cbiAgZ2V0SXRlbShrZXk6IHN0cmluZyk6IHN0cmluZyB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLnN0b3JlLmdldChrZXkpID8/IG51bGw7XG4gIH1cblxuICBzZXRJdGVtKGtleTogc3RyaW5nLCB2YWx1ZTogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5zdG9yZS5zZXQoa2V5LCB2YWx1ZSk7XG4gIH1cblxuICByZW1vdmVJdGVtKGtleTogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5zdG9yZS5kZWxldGUoa2V5KTtcbiAgfVxuXG4gIGNsZWFyKCk6IHZvaWQge1xuICAgIHRoaXMuc3RvcmUuY2xlYXIoKTtcbiAgfVxuXG4gIGtleShpbmRleDogbnVtYmVyKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgY29uc3Qga2V5cyA9IEFycmF5LmZyb20odGhpcy5zdG9yZS5rZXlzKCkpO1xuICAgIHJldHVybiBrZXlzW2luZGV4XSA/PyBudWxsO1xuICB9XG5cbiAgZ2V0IGxlbmd0aCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLnN0b3JlLnNpemU7XG4gIH1cbn1cblxuLyoqXG4gKiBCcm93c2VyIGxvY2FsU3RvcmFnZS1iYWNrZWQgaW1wbGVtZW50YXRpb24gb2YgUmVwb3J0U3RvcmFnZVxuICogd2l0aCB0cmFuc3BhcmVudCBpbi1tZW1vcnkgZmFsbGJhY2sgb24gRE9NRXhjZXB0aW9uIG9yIFNTUi5cbiAqL1xuZXhwb3J0IGNsYXNzIEJyb3dzZXJSZXBvcnRTdG9yYWdlIGltcGxlbWVudHMgUmVwb3J0U3RvcmFnZSB7XG4gIHByaXZhdGUgcmVhZG9ubHkgbWVtb3J5ID0gbmV3IE1lbW9yeVJlcG9ydFN0b3JhZ2UoKTtcbiAgcHJpdmF0ZSByZWFkb25seSBpc1N1cHBvcnRlZDogYm9vbGVhbjtcblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICB0aGlzLmlzU3VwcG9ydGVkID0gdGhpcy5jaGVja1N0b3JhZ2VTdXBwb3J0KCk7XG4gIH1cblxuICBwcml2YXRlIGNoZWNrU3RvcmFnZVN1cHBvcnQoKTogYm9vbGVhbiB7XG4gICAgaWYgKHR5cGVvZiB3aW5kb3cgPT09ICd1bmRlZmluZWQnKSByZXR1cm4gZmFsc2U7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHByb2JlID0gJ19fYndheXNfc3RvcmFnZV9wcm9iZV9fJztcbiAgICAgIHdpbmRvdy5sb2NhbFN0b3JhZ2Uuc2V0SXRlbShwcm9iZSwgcHJvYmUpO1xuICAgICAgd2luZG93LmxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKHByb2JlKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIGdldEl0ZW0oa2V5OiBzdHJpbmcpOiBzdHJpbmcgfCBudWxsIHtcbiAgICBpZiAodGhpcy5pc1N1cHBvcnRlZCkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIHdpbmRvdy5sb2NhbFN0b3JhZ2UuZ2V0SXRlbShrZXkpO1xuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIHJldHVybiB0aGlzLm1lbW9yeS5nZXRJdGVtKGtleSk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0aGlzLm1lbW9yeS5nZXRJdGVtKGtleSk7XG4gIH1cblxuICBzZXRJdGVtKGtleTogc3RyaW5nLCB2YWx1ZTogc3RyaW5nKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuaXNTdXBwb3J0ZWQpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHdpbmRvdy5sb2NhbFN0b3JhZ2Uuc2V0SXRlbShrZXksIHZhbHVlKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIC8vIEZhbGwgYmFjayB0byBpbi1tZW1vcnkgb24gcXVvdGEgb3Igc2VjdXJpdHkgZXhjZXB0aW9uc1xuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLm1lbW9yeS5zZXRJdGVtKGtleSwgdmFsdWUpO1xuICB9XG5cbiAgcmVtb3ZlSXRlbShrZXk6IHN0cmluZyk6IHZvaWQge1xuICAgIGlmICh0aGlzLmlzU3VwcG9ydGVkKSB7XG4gICAgICB0cnkge1xuICAgICAgICB3aW5kb3cubG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0oa2V5KTtcbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICAvLyBJZ25vcmVcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5tZW1vcnkucmVtb3ZlSXRlbShrZXkpO1xuICB9XG5cbiAgY2xlYXIoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuaXNTdXBwb3J0ZWQpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHdpbmRvdy5sb2NhbFN0b3JhZ2UuY2xlYXIoKTtcbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICAvLyBJZ25vcmVcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5tZW1vcnkuY2xlYXIoKTtcbiAgfVxuXG4gIGtleShpbmRleDogbnVtYmVyKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgaWYgKHRoaXMuaXNTdXBwb3J0ZWQpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiB3aW5kb3cubG9jYWxTdG9yYWdlLmtleShpbmRleCk7XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubWVtb3J5LmtleShpbmRleCk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0aGlzLm1lbW9yeS5rZXkoaW5kZXgpO1xuICB9XG5cbiAgZ2V0IGxlbmd0aCgpOiBudW1iZXIge1xuICAgIGlmICh0aGlzLmlzU3VwcG9ydGVkKSB7XG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gd2luZG93LmxvY2FsU3RvcmFnZS5sZW5ndGg7XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubWVtb3J5Lmxlbmd0aDtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRoaXMubWVtb3J5Lmxlbmd0aDtcbiAgfVxufVxuXG4vKipcbiAqIEluamVjdGlvbiB0b2tlbiBmb3IgdGhlIHJlcG9ydCBzdG9yYWdlIGVuZ2luZS5cbiAqIERlZmF1bHRzIHRvIGBCcm93c2VyUmVwb3J0U3RvcmFnZWAsIHdoaWNoIHRyYW5zcGFyZW50bHkgZmFsbHMgYmFjayB0b1xuICogYE1lbW9yeVJlcG9ydFN0b3JhZ2VgIHdoZW4gYnJvd3NlciBsb2NhbFN0b3JhZ2UgaXMgdW5hdmFpbGFibGUgb3IgcmVzdHJpY3RlZC5cbiAqL1xuZXhwb3J0IGNvbnN0IFJFUE9SVF9TVE9SQUdFID0gbmV3IEluamVjdGlvblRva2VuPFJlcG9ydFN0b3JhZ2U+KCdSRVBPUlRfU1RPUkFHRScsIHtcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnLFxuICBmYWN0b3J5OiAoKSA9PiBuZXcgQnJvd3NlclJlcG9ydFN0b3JhZ2UoKSxcbn0pO1xuIl19
|
|
@@ -51,14 +51,25 @@ export function detectDefaultValueField(columns) {
|
|
|
51
51
|
const exactMatch = columns.find((c) => ['id', 'key', 'code', 'guid', 'uuid'].includes(c.field.toLowerCase()));
|
|
52
52
|
if (exactMatch)
|
|
53
53
|
return exactMatch.field;
|
|
54
|
-
// 2. Check columns ending with '
|
|
54
|
+
// 2. Check columns ending with 'acno', 'glacno', 'account_no', 'accountno', '_id', 'id'
|
|
55
|
+
const primaryIdMatch = columns.find((c) => {
|
|
56
|
+
const f = c.field.toLowerCase();
|
|
57
|
+
return (f.endsWith('_acno') ||
|
|
58
|
+
f.endsWith('acno') ||
|
|
59
|
+
f.includes('glacno') ||
|
|
60
|
+
f.endsWith('_id') ||
|
|
61
|
+
f.endsWith('id'));
|
|
62
|
+
});
|
|
63
|
+
if (primaryIdMatch)
|
|
64
|
+
return primaryIdMatch.field;
|
|
65
|
+
// 3. Check columns ending with 'code' or 'key'
|
|
55
66
|
const suffixMatch = columns.find((c) => {
|
|
56
67
|
const f = c.field.toLowerCase();
|
|
57
|
-
return f.endsWith('
|
|
68
|
+
return f.endsWith('_code') || f.endsWith('code') || f.endsWith('_key') || f.endsWith('key');
|
|
58
69
|
});
|
|
59
70
|
if (suffixMatch)
|
|
60
71
|
return suffixMatch.field;
|
|
61
|
-
//
|
|
72
|
+
// 4. Fallback to first column
|
|
62
73
|
return columns[0]?.field;
|
|
63
74
|
}
|
|
64
75
|
/**
|
|
@@ -85,4 +96,4 @@ export function detectDefaultDisplayField(columns) {
|
|
|
85
96
|
// 3. Fallback to second column or first column
|
|
86
97
|
return columns.length > 1 ? columns[1].field : columns[0]?.field;
|
|
87
98
|
}
|
|
88
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaWRlbnRpZmllci1odW1hbml6ZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9id2F5cy1yZXBvcnQvc3JjL2xpYi9jb3JlL3V0aWxzL2lkZW50aWZpZXItaHVtYW5pemVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUVBOzs7Ozs7Ozs7OztHQVdHO0FBQ0gsTUFBTSxVQUFVLGtCQUFrQixDQUFDLEdBQVc7SUFDNUMsSUFBSSxDQUFDLEdBQUcsSUFBSSxPQUFPLEdBQUcsS0FBSyxRQUFRO1FBQUUsT0FBTyxFQUFFLENBQUM7SUFFL0MsaUNBQWlDO0lBQ2pDLElBQUksSUFBSSxHQUFHLEdBQUcsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxFQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQztJQUUzRCwrRUFBK0U7SUFDL0UsSUFBSSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDO0lBQy9CLE9BQU8sNEJBQTRCLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7UUFDL0MsSUFBSSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsNEJBQTRCLEVBQUUsRUFBRSxDQUFDLENBQUM7SUFDeEQsQ0FBQztJQUVELHlGQUF5RjtJQUN6RixJQUFJLFlBQVksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQztRQUM1QixJQUFJLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUN2QixDQUFDO0lBRUQscUNBQXFDO0lBQ3JDLElBQUksR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsRUFBRSxHQUFHLENBQUMsQ0FBQztJQUVuQyx3R0FBd0c7SUFDeEcsSUFBSSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsb0JB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QUFDLEtBQUssQ0FBQztJQUV0Qyx5Q0FBeUM7SUFDekMsTUFBTSxXQUFXLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLFFBQVEsS0FBSyxRQUFRLENBQUMsQ0FBQztJQUNqRSxJQUFJLFdBQVc7UUFBRSxPQUFPLFdBQVcsQ0FBQyxLQUFLLENBQUM7SUFFMUMsK0NBQStDO0lBQy9DLE9BQU8sT0FBTyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxLQUFLLENBQUM7QUFDbkUsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEVudGl0eUNvbHVtbk1ldGFkYXRhIH0gZnJvbSAnLi4vLi4vZGF0YS1hY2Nlc3MvY29udHJhY3RzL3NjaGVtYS1kaXNjb3ZlcnkuY29udHJhY3QnO1xuXG4vKipcbiAqIFN0cmlwcyB0ZWNobmljYWwgU1FMIHByZWZpeGVzICh1c3BfLCBzcF8sIHRibF8sIHZ3XywgQCksIHJlbW92ZXMgc2NoZW1hIGlmIHByZXNlbnQsXG4gKiBhbmQgY29udmVydHMgc25ha2VfY2FzZSwgUGFzY2FsQ2FzZSwgb3IgY2FtZWxDYXNlIGludG8gY2xlYW4sIGh1bWFuLXJlYWRhYmxlIFRpdGxlIENhc2UuXG4gKlxuICogRXhhbXBsZXM6XG4gKiAtICdkYm8udXNwX0dldEN1c3RvbWVyTGlzdCcgLT4gJ0N1c3RvbWVyIExpc3QnXG4gKiAtICd1c3BfR2V0QnJhbmNoZXMnIC0+ICdCcmFuY2hlcydcbiAqIC0gJ0BCcmFuY2hJZCcgLT4gJ0JyYW5jaCdcbiAqIC0gJ0BBY3RpdmVPbmx5JyAtPiAnQWN0aXZlIE9ubHknXG4gKiAtICd0YmxfUHJvZHVjdHMnIC0+ICdQcm9kdWN0cydcbiAqIC0gJ2N1c3RvbWVyX25hbWVfZW4nIC0+ICdDdXN0b21lciBOYW1lIEVuJ1xuICovXG5leHBvcnQgZnVuY3Rpb24gaHVtYW5pemVJZGVudGlmaWVyKHJhdzogc3RyaW5nKTogc3RyaW5nIHtcbiAgaWYgKCFyYXcgfHwgdHlwZW9mIHJhdyAhPT0gJ3N0cmluZycpIHJldHVybiAnJztcblxuICAvLyAxLiBSZW1vdmUgc2NoZW1hIChlLmcuICdkYm8uJylcbiAgbGV0IHRleHQgPSByYXcuaW5jbHVkZXMoJy4nKSA/IHJhdy5zcGxpdCgnLicpLnBvcCgpISA6IHJhdztcblxuICAvLyAyLiBSZW1vdmUgbGVhZGluZyBALCBhbmQgcHJlZml4ZXMgbGlrZSBzcF8sIHVzcF8sIHRibF8sIHZ3XywgZ2V0XyByZXBlYXRlZGx5XG4gIHRleHQgPSB0ZXh0LnJlcGxhY2UoL15AKy8sICcnKTtcbiAgd2hpbGUgKC9eKHVzcF98c3BffHRibF98dndffGdldF8pL2kudGVzdCh0ZXh0KSkge1xuICAgIHRleHQgPSB0ZXh0LnJlcGxhY2UoL14odXNwX3xzcF98dGJsX3x2d198Z2V0XykvaSwgJycpO1xuICB9XG5cbiAgLy8gMy4gSWYgaXQgc3RhcnRzIHdpdGggJ0dldCcgZm9sbG93ZWQgYnkgdXBwZXJjYXNlIChlLmcuICdHZXRDdXN0b21lckxpc3QnKSwgc3RyaXAgJ0dldCdcbiAgaWYgKC9eZ2V0W0EtWl0vaS50ZXN0KHRleHQpKSB7XG4gICAgdGV4dCA9IHRleHQuc2xpY2UoMyk7XG4gIH1cblxuICAvLyA0LiBTcGxpdCBzbmFrZV9jYXNlIGFuZCBrZWJhYi1jYXNlXG4gIHRleHQgPSB0ZXh0LnJlcGxhY2UoL1tfLV0rL2csICcgJyk7XG5cbiAgLy8gNS4gU3BsaXQgUGFzY2FsQ2FzZSBhbmQgY2FtZWxDYXNlIChlLmcuICdDdXN0b21lckxpc3QnIC0+ICdDdXN0b21lciBMaXN0JywgJ0JyYW5jaElkJyAtPiAnQnJhbmNoIElkJylcbiAgdGV4dCA9IHRleHQucmVwbGFjZSgvKFthLXowLTldKShbQS1aXSkvZywgJyQxICQyJyk7XG4gIHRleHQgPSB0ZXh0LnJlcGxhY2UoLyhbQS1aXSspKFtBLVpdW2Etel0pL2csICckMSAkMicpO1xuXG4gIC8vIDYuIENsZWFuIHVwIHRyYWlsaW5nICcgSWQnIGlmIGl0J3MgYSBwYXJhbWV0ZXIgbGFiZWwgKGUuZy4gJ0JyYW5jaCBJZCcgLT4gJ0JyYW5jaCcpXG4gIC8vIFdlIGtlZXAgaXQgbmF0dXJhbCBmb3IgcGFyYW1ldGVyczogJ0JyYW5jaCcgaXMgY2xlYXJlciB0aGFuICdCcmFuY2ggSWQnIGZvciBub24tdGVjaG5pY2FsIHVzZXJzXG4gIGlmICh0ZXh0LmVuZHNXaXRoKCcgSWQnKSAmJiB0ZXh0Lmxlbmd0aCA+IDMpIHtcbiAgICB0ZXh0ID0gdGV4dC5zbGljZSgwLCAtMyk7XG4gIH1cblxuICAvLyA3LiBUaXRsZS1jYXNlIGVhY2ggd29yZFxuICByZXR1cm4gdGV4dFxuICAgIC5zcGxpdCgnICcpXG4gICAgLmZpbHRlcihCb29sZWFuKVxuICAgIC5tYXAoKHcpID0+IHcuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkgKyB3LnNsaWNlKDEpLnRvTG93ZXJDYXNlKCkpXG4gICAgLmpvaW4oJyAnKTtcbn1cblxuLyoqXG4gKiBEZXRlY3RzIHRoZSBtb3N0IHByb2JhYmxlIGNvbHVtbiB0byB1c2UgYXMgdGhlIHZhbHVlL2tleSAoZS5nLiBJRCwgQ29kZSwgS2V5LCBHdWlkKS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRldGVjdERlZmF1bHRWYWx1ZUZpZWxkKGNvbHVtbnM6IEVudGl0eUNvbHVtbk1ldGFkYXRhW10pOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBpZiAoIWNvbHVtbnMgfHwgY29sdW1ucy5sZW5ndGggPT09IDApIHJldHVybiB1bmRlZmluZWQ7XG5cbiAgLy8gMS4gQ2hlY2sgZXhhY3QgbWF0Y2hlcyBmb3IgJ2lkJyBvciAna2V5JyBvciAnY29kZSdcbiAgY29uc3QgZXhhY3RNYXRjaCA9IGNvbHVtbnMuZmluZCgoYykgPT5cbiAgICBbJ2lkJywgJ2tleScsICdjb2RlJywgJ2d1aWQnLCAndXVpZCddLmluY2x1ZGVzKGMuZmllbGQudG9Mb3dlckNhc2UoKSlcbiAgKTtcbiAgaWYgKGV4YWN0TWF0Y2gpIHJldHVybiBleGFjdE1hdGNoLmZpZWxkO1xuXG4gIC8vIDIuIENoZWNrIGNvbHVtbnMgZW5kaW5nIHdpdGggJ2lkJyBvciAnY29kZScgb3IgJ2tleSdcbiAgY29uc3Qgc3VmZml4TWF0Y2ggPSBjb2x1bW5zLmZpbmQoKGMpID0+IHtcbiAgICBjb25zdCBmID0gYy5maWVsZC50b0xvd2VyQ2FzZSgpO1xuICAgIHJldHVybiBmLmVuZHNXaXRoKCdfaWQnKSB8fCBmLmVuZHNXaXRoKCdpZCcpIHx8IGYuZW5kc1dpdGgoJ19jb2RlJykgfHwgZi5lbmRzV2l0aCgnY29kZScpO1xuICB9KTtcbiAgaWYgKHN1ZmZpeE1hdGNoKSByZXR1cm4gc3VmZml4TWF0Y2guZmllbGQ7XG5cbiAgLy8gMy4gRmFsbGJhY2sgdG8gZmlyc3QgY29sdW1uXG4gIHJldHVybiBjb2x1bW5zWzBdPy5maWVsZDtcbn1cblxuLyoqXG4gKiBEZXRlY3RzIHRoZSBtb3N0IHByb2JhYmxlIGNvbHVtbiB0byB1c2UgYXMgdGhlIGRpc3BsYXkgdGV4dCAoZS5nLiBOYW1lLCBUaXRsZSwgTGFiZWwsIERlc2NyaXB0aW9uKS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRldGVjdERlZmF1bHREaXNwbGF5RmllbGQoY29sdW1uczogRW50aXR5Q29sdW1uTWV0YWRhdGFbXSk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGlmICghY29sdW1ucyB8fCBjb2x1bW5zLmxlbmd0aCA9PT0gMCkgcmV0dXJuIHVuZGVmaW5lZDtcblxuICAvLyAxLiBMb29rIGZvciB0ZXh0IGZpZWxkcyBjb250YWluaW5nICduYW1lJywgJ3RpdGxlJywgJ2xhYmVsJywgJ2Rlc2MnXG4gIGNvbnN0IG5hbWVNYXRjaCA9IGNvbHVtbnMuZmluZCgoYykgPT4ge1xuICAgIGNvbnN0IGYgPSBjLmZpZWxkLnRvTG93ZXJDYXNlKCk7XG4gICAgcmV0dXJuIChcbiAgICAgIGYuaW5jbHVkZXMoJ25hbWUnKSB8fFxuICAgICAgZi5pbmNsdWRlcygndGl0bGUnKSB8fFxuICAgICAgZi5pbmNsdWRlcygnbGFiZWwnKSB8fFxuICAgICAgZi5pbmNsdWRlcygnZGVzY3JpcHRpb24nKSB8fFxuICAgICAgZi5pbmNsdWRlcygnZGVzYycpXG4gICAgKTtcbiAgfSk7XG4gIGlmIChuYW1lTWF0Y2gpIHJldHVybiBuYW1lTWF0Y2guZmllbGQ7XG5cbiAgLy8gMi4gTG9vayBmb3IgYW55IHN0cmluZyBkYXRhVHlwZSBjb2x1bW5cbiAgY29uc3Qgc3RyaW5nTWF0Y2ggPSBjb2x1bW5zLmZpbmQoKGMpID0+IGMuZGF0YVR5cGUgPT09ICdzdHJpbmcnKTtcbiAgaWYgKHN0cmluZ01hdGNoKSByZXR1cm4gc3RyaW5nTWF0Y2guZmllbGQ7XG5cbiAgLy8gMy4gRmFsbGJhY2sgdG8gc2Vjb25kIGNvbHVtbiBvciBmaXJzdCBjb2x1bW5cbiAgcmV0dXJuIGNvbHVtbnMubGVuZ3RoID4gMSA/IGNvbHVtbnNbMV0uZmllbGQgOiBjb2x1bW5zWzBdPy5maWVsZDtcbn1cbiJdfQ==
|
|
99
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaWRlbnRpZmllci1odW1hbml6ZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9id2F5cy1yZXBvcnQvc3JjL2xpYi9jb3JlL3V0aWxzL2lkZW50aWZpZXItaHVtYW5pemVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUVBOzs7Ozs7Ozs7OztHQVdHO0FBQ0gsTUFBTSxVQUFVLGtCQUFrQixDQUFDLEdBQVc7SUFDNUMsSUFBSSxDQUFDLEdBQUcsSUFBSSxPQUFPLEdBQUcsS0FBSyxRQUFRO1FBQUUsT0FBTyxFQUFFLENBQUM7SUFFL0MsaUNBQWlDO0lBQ2pDLElBQUksSUFBSSxHQUFHLEdBQUcsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxFQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQztJQUUzRCwrRUFBK0U7SUFDL0UsSUFBSSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDO0lBQy9CLE9BQU8sNEJBQTRCLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7UUFDL0MsSUFBSSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsNEJBQTRCLEVBQUUsRUFBRSxDQUFDLENBQUM7SUFDeEQsQ0FBQztJQUVELHlGQUF5RjtJQUN6RixJQUFJLFlBQVksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQztRQUM1QixJQUFJLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUN2QixDQUFDO0lBRUQscUNBQXFDO0lBQ3JDLElBQUksR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsRUFBRSxHQUFHLENBQUMsQ0FBQztJQUVuQyx3R0FBd0c7SUFDeEcsSUFBSSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsb0JB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QUFPLFNBQVMsQ0FBQztJQUV2RCxzRUFBc0U7SUFDdEUsTUFBTSxTQUFTLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFO1FBQ25DLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxLQUFLLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDaEMsT0FBTyxDQUNMLENBQUMsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDO1lBQ2xCLENBQUMsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDO1lBQ25CLENBQUMsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDO1lBQ25CLENBQUMsQ0FBQyxRQUFRLENBQUMsYUFBYSxDQUFDO1lBQ3pCLENBQUMsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQ25CLENBQUM7SUFDSixDQUFDLENBQUMsQ0FBQztJQUNILElBQUksU0FBUztRQUFFLE9BQU8sU0FBUyxDQUFDLEtBQUssQ0FBQztJQUV0Qyx5Q0FBeUM7SUFDekMsTUFBTSxXQUFXLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLFFBQVEsS0FBSyxRQUFRLENBQUMsQ0FBQztJQUNqRSxJQUFJLFdBQVc7UUFBRSxPQUFPLFdBQVcsQ0FBQyxLQUFLLENBQUM7SUFFMUMsK0NBQStDO0lBQy9DLE9BQU8sT0FBTyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxLQUFLLENBQUM7QUFDbkUsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEVudGl0eUNvbHVtbk1ldGFkYXRhIH0gZnJvbSAnLi4vLi4vZGF0YS1hY2Nlc3MvY29udHJhY3RzL3NjaGVtYS1kaXNjb3ZlcnkuY29udHJhY3QnO1xuXG4vKipcbiAqIFN0cmlwcyB0ZWNobmljYWwgU1FMIHByZWZpeGVzICh1c3BfLCBzcF8sIHRibF8sIHZ3XywgQCksIHJlbW92ZXMgc2NoZW1hIGlmIHByZXNlbnQsXG4gKiBhbmQgY29udmVydHMgc25ha2VfY2FzZSwgUGFzY2FsQ2FzZSwgb3IgY2FtZWxDYXNlIGludG8gY2xlYW4sIGh1bWFuLXJlYWRhYmxlIFRpdGxlIENhc2UuXG4gKlxuICogRXhhbXBsZXM6XG4gKiAtICdkYm8udXNwX0dldEN1c3RvbWVyTGlzdCcgLT4gJ0N1c3RvbWVyIExpc3QnXG4gKiAtICd1c3BfR2V0QnJhbmNoZXMnIC0+ICdCcmFuY2hlcydcbiAqIC0gJ0BCcmFuY2hJZCcgLT4gJ0JyYW5jaCdcbiAqIC0gJ0BBY3RpdmVPbmx5JyAtPiAnQWN0aXZlIE9ubHknXG4gKiAtICd0YmxfUHJvZHVjdHMnIC0+ICdQcm9kdWN0cydcbiAqIC0gJ2N1c3RvbWVyX25hbWVfZW4nIC0+ICdDdXN0b21lciBOYW1lIEVuJ1xuICovXG5leHBvcnQgZnVuY3Rpb24gaHVtYW5pemVJZGVudGlmaWVyKHJhdzogc3RyaW5nKTogc3RyaW5nIHtcbiAgaWYgKCFyYXcgfHwgdHlwZW9mIHJhdyAhPT0gJ3N0cmluZycpIHJldHVybiAnJztcblxuICAvLyAxLiBSZW1vdmUgc2NoZW1hIChlLmcuICdkYm8uJylcbiAgbGV0IHRleHQgPSByYXcuaW5jbHVkZXMoJy4nKSA/IHJhdy5zcGxpdCgnLicpLnBvcCgpISA6IHJhdztcblxuICAvLyAyLiBSZW1vdmUgbGVhZGluZyBALCBhbmQgcHJlZml4ZXMgbGlrZSBzcF8sIHVzcF8sIHRibF8sIHZ3XywgZ2V0XyByZXBlYXRlZGx5XG4gIHRleHQgPSB0ZXh0LnJlcGxhY2UoL15AKy8sICcnKTtcbiAgd2hpbGUgKC9eKHVzcF98c3BffHRibF98dndffGdldF8pL2kudGVzdCh0ZXh0KSkge1xuICAgIHRleHQgPSB0ZXh0LnJlcGxhY2UoL14odXNwX3xzcF98dGJsX3x2d198Z2V0XykvaSwgJycpO1xuICB9XG5cbiAgLy8gMy4gSWYgaXQgc3RhcnRzIHdpdGggJ0dldCcgZm9sbG93ZWQgYnkgdXBwZXJjYXNlIChlLmcuICdHZXRDdXN0b21lckxpc3QnKSwgc3RyaXAgJ0dldCdcbiAgaWYgKC9eZ2V0W0EtWl0vaS50ZXN0KHRleHQpKSB7XG4gICAgdGV4dCA9IHRleHQuc2xpY2UoMyk7XG4gIH1cblxuICAvLyA0LiBTcGxpdCBzbmFrZV9jYXNlIGFuZCBrZWJhYi1jYXNlXG4gIHRleHQgPSB0ZXh0LnJlcGxhY2UoL1tfLV0rL2csICcgJyk7XG5cbiAgLy8gNS4gU3BsaXQgUGFzY2FsQ2FzZSBhbmQgY2FtZWxDYXNlIChlLmcuICdDdXN0b21lckxpc3QnIC0+ICdDdXN0b21lciBMaXN0JywgJ0JyYW5jaElkJyAtPiAnQnJhbmNoIElkJylcbiAgdGV4dCA9IHRleHQucmVwbGFjZSgvKFthLXowLTldKShbQS1aXSkvZywgJyQxICQyJyk7XG4gIHRleHQgPSB0ZXh0LnJlcGxhY2UoLyhbQS1aXSspKFtBLVpdW2Etel0pL2csICckMSAkMicpO1xuXG4gIC8vIDYuIENsZWFuIHVwIHRyYWlsaW5nICcgSWQnIGlmIGl0J3MgYSBwYXJhbWV0ZXIgbGFiZWwgKGUuZy4gJ0JyYW5jaCBJZCcgLT4gJ0JyYW5jaCcpXG4gIC8vIFdlIGtlZXAgaXQgbmF0dXJhbCBmb3IgcGFyYW1ldGVyczogJ0JyYW5jaCcgaXMgY2xlYXJlciB0aGFuICdCcmFuY2ggSWQnIGZvciBub24tdGVjaG5pY2FsIHVzZXJzXG4gIGlmICh0ZXh0LmVuZHNXaXRoKCcgSWQnKSAmJiB0ZXh0Lmxlbmd0aCA+IDMpIHtcbiAgICB0ZXh0ID0gdGV4dC5zbGljZSgwLCAtMyk7XG4gIH1cblxuICAvLyA3LiBUaXRsZS1jYXNlIGVhY2ggd29yZFxuICByZXR1cm4gdGV4dFxuICAgIC5zcGxpdCgnICcpXG4gICAgLmZpbHRlcihCb29sZWFuKVxuICAgIC5tYXAoKHcpID0+IHcuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkgKyB3LnNsaWNlKDEpLnRvTG93ZXJDYXNlKCkpXG4gICAgLmpvaW4oJyAnKTtcbn1cblxuLyoqXG4gKiBEZXRlY3RzIHRoZSBtb3N0IHByb2JhYmxlIGNvbHVtbiB0byB1c2UgYXMgdGhlIHZhbHVlL2tleSAoZS5nLiBJRCwgQ29kZSwgS2V5LCBHdWlkKS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRldGVjdERlZmF1bHRWYWx1ZUZpZWxkKGNvbHVtbnM6IEVudGl0eUNvbHVtbk1ldGFkYXRhW10pOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBpZiAoIWNvbHVtbnMgfHwgY29sdW1ucy5sZW5ndGggPT09IDApIHJldHVybiB1bmRlZmluZWQ7XG5cbiAgLy8gMS4gQ2hlY2sgZXhhY3QgbWF0Y2hlcyBmb3IgJ2lkJyBvciAna2V5JyBvciAnY29kZSdcbiAgY29uc3QgZXhhY3RNYXRjaCA9IGNvbHVtbnMuZmluZCgoYykgPT5cbiAgICBbJ2lkJywgJ2tleScsICdjb2RlJywgJ2d1aWQnLCAndXVpZCddLmluY2x1ZGVzKGMuZmllbGQudG9Mb3dlckNhc2UoKSlcbiAgKTtcbiAgaWYgKGV4YWN0TWF0Y2gpIHJldHVybiBleGFjdE1hdGNoLmZpZWxkO1xuXG4gIC8vIDIuIENoZWNrIGNvbHVtbnMgZW5kaW5nIHdpdGggJ2Fjbm8nLCAnZ2xhY25vJywgJ2FjY291bnRfbm8nLCAnYWNjb3VudG5vJywgJ19pZCcsICdpZCdcbiAgY29uc3QgcHJpbWFyeUlkTWF0Y2ggPSBjb2x1bW5zLmZpbmQoKGMpID0+IHtcbiAgICBjb25zdCBmID0gYy5maWVsZC50b0xvd2VyQ2FzZSgpO1xuICAgIHJldHVybiAoXG4gICAgICBmLmVuZHNXaXRoKCdfYWNubycpIHx8XG4gICAgICBmLmVuZHNXaXRoKCdhY25vJykgfHxcbiAgICAgIGYuaW5jbHVkZXMoJ2dsYWNubycpIHx8XG4gICAgICBmLmVuZHNXaXRoKCdfaWQnKSB8fFxuICAgICAgZi5lbmRzV2l0aCgnaWQnKVxuICAgICk7XG4gIH0pO1xuICBpZiAocHJpbWFyeUlkTWF0Y2gpIHJldHVybiBwcmltYXJ5SWRNYXRjaC5maWVsZDtcblxuICAvLyAzLiBDaGVjayBjb2x1bW5zIGVuZGluZyB3aXRoICdjb2RlJyBvciAna2V5J1xuICBjb25zdCBzdWZmaXhNYXRjaCA9IGNvbHVtbnMuZmluZCgoYykgPT4ge1xuICAgIGNvbnN0IGYgPSBjLmZpZWxkLnRvTG93ZXJDYXNlKCk7XG4gICAgcmV0dXJuIGYuZW5kc1dpdGgoJ19jb2RlJykgfHwgZi5lbmRzV2l0aCgnY29kZScpIHx8IGYuZW5kc1dpdGgoJ19rZXknKSB8fCBmLmVuZHNXaXRoKCdrZXknKTtcbiAgfSk7XG4gIGlmIChzdWZmaXhNYXRjaCkgcmV0dXJuIHN1ZmZpeE1hdGNoLmZpZWxkO1xuXG4gIC8vIDQuIEZhbGxiYWNrIHRvIGZpcnN0IGNvbHVtblxuICByZXR1cm4gY29sdW1uc1swXT8uZmllbGQ7XG59XG5cbi8qKlxuICogRGV0ZWN0cyB0aGUgbW9zdCBwcm9iYWJsZSBjb2x1bW4gdG8gdXNlIGFzIHRoZSBkaXNwbGF5IHRleHQgKGUuZy4gTmFtZSwgVGl0bGUsIExhYmVsLCBEZXNjcmlwdGlvbikuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkZXRlY3REZWZhdWx0RGlzcGxheUZpZWxkKGNvbHVtbnM6IEVudGl0eUNvbHVtbk1ldGFkYXRhW10pOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBpZiAoIWNvbHVtbnMgfHwgY29sdW1ucy5sZW5ndGggPT09IDApIHJldHVybiB1bmRlZmluZWQ7XG5cbiAgLy8gMS4gTG9vayBmb3IgdGV4dCBmaWVsZHMgY29udGFpbmluZyAnbmFtZScsICd0aXRsZScsICdsYWJlbCcsICdkZXNjJ1xuICBjb25zdCBuYW1lTWF0Y2ggPSBjb2x1bW5zLmZpbmQoKGMpID0+IHtcbiAgICBjb25zdCBmID0gYy5maWVsZC50b0xvd2VyQ2FzZSgpO1xuICAgIHJldHVybiAoXG4gICAgICBmLmluY2x1ZGVzKCduYW1lJykgfHxcbiAgICAgIGYuaW5jbHVkZXMoJ3RpdGxlJykgfHxcbiAgICAgIGYuaW5jbHVkZXMoJ2xhYmVsJykgfHxcbiAgICAgIGYuaW5jbHVkZXMoJ2Rlc2NyaXB0aW9uJykgfHxcbiAgICAgIGYuaW5jbHVkZXMoJ2Rlc2MnKVxuICAgICk7XG4gIH0pO1xuICBpZiAobmFtZU1hdGNoKSByZXR1cm4gbmFtZU1hdGNoLmZpZWxkO1xuXG4gIC8vIDIuIExvb2sgZm9yIGFueSBzdHJpbmcgZGF0YVR5cGUgY29sdW1uXG4gIGNvbnN0IHN0cmluZ01hdGNoID0gY29sdW1ucy5maW5kKChjKSA9PiBjLmRhdGFUeXBlID09PSAnc3RyaW5nJyk7XG4gIGlmIChzdHJpbmdNYXRjaCkgcmV0dXJuIHN0cmluZ01hdGNoLmZpZWxkO1xuXG4gIC8vIDMuIEZhbGxiYWNrIHRvIHNlY29uZCBjb2x1bW4gb3IgZmlyc3QgY29sdW1uXG4gIHJldHVybiBjb2x1bW5zLmxlbmd0aCA+IDEgPyBjb2x1bW5zWzFdLmZpZWxkIDogY29sdW1uc1swXT8uZmllbGQ7XG59XG4iXX0=
|