@decaf-ts/for-angular 0.0.9 → 0.0.10
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/dist/{lib/components → components}/empty-state/empty-state.component.d.ts +3 -3
- package/dist/{lib/components → components}/fieldset/fieldset.component.d.ts +1 -1
- package/dist/{lib/components → components}/filter/filter.component.d.ts +2 -2
- package/dist/{lib/components → components}/layout/layout.component.d.ts +2 -2
- package/dist/{lib/components → components}/list/list.component.d.ts +3 -3
- package/dist/{lib/components → components}/list-item/list-item.component.d.ts +3 -3
- package/dist/{lib/components → components}/model-renderer/model-renderer.component.d.ts +1 -1
- package/dist/{lib/components → components}/pagination/constants.d.ts +1 -1
- package/dist/{lib/components → components}/pagination/pagination.component.d.ts +2 -2
- package/dist/{lib/components → components}/searchbar/searchbar.component.d.ts +2 -2
- package/dist/{lib/engine → engine}/NgxBaseComponent.d.ts +1 -1
- package/dist/{lib/esm2022 → esm2022}/components/component-renderer/component-renderer.component.mjs +3 -3
- package/dist/esm2022/components/crud-field/crud-field.component.mjs +301 -0
- package/dist/esm2022/components/crud-form/constants.mjs +14 -0
- package/dist/esm2022/components/crud-form/crud-form.component.mjs +139 -0
- package/dist/esm2022/components/crud-form/types.mjs +2 -0
- package/dist/esm2022/components/empty-state/empty-state.component.mjs +348 -0
- package/dist/esm2022/components/fieldset/fieldset.component.mjs +225 -0
- package/dist/esm2022/components/filter/filter.component.mjs +689 -0
- package/dist/esm2022/components/for-angular-components.module.mjs +71 -0
- package/dist/esm2022/components/index.mjs +20 -0
- package/dist/esm2022/components/layout/layout.component.mjs +176 -0
- package/dist/esm2022/components/list/constants.mjs +6 -0
- package/dist/esm2022/components/list/list.component.mjs +1236 -0
- package/dist/{lib/esm2022 → esm2022}/components/list-item/list-item.component.mjs +6 -6
- package/dist/esm2022/components/model-renderer/model-renderer.component.mjs +138 -0
- package/dist/esm2022/components/pagination/constants.mjs +2 -0
- package/dist/esm2022/components/pagination/pagination.component.mjs +323 -0
- package/dist/esm2022/components/searchbar/searchbar.component.mjs +493 -0
- package/dist/esm2022/decaf-ts-for-angular.mjs +5 -0
- package/dist/esm2022/directives/collapsable.directive.mjs +28 -0
- package/dist/esm2022/directives/index.mjs +2 -0
- package/dist/esm2022/engine/DynamicModule.mjs +18 -0
- package/dist/esm2022/engine/NgxBaseComponent.mjs +539 -0
- package/dist/esm2022/engine/NgxCrudFormField.mjs +125 -0
- package/dist/esm2022/engine/NgxFormService.mjs +315 -0
- package/dist/esm2022/engine/NgxRenderingEngine.mjs +192 -0
- package/dist/esm2022/engine/NgxRenderingEngine2.mjs +332 -0
- package/dist/esm2022/engine/ValidatorFactory.mjs +102 -0
- package/dist/esm2022/engine/constants.mjs +160 -0
- package/dist/esm2022/engine/decorators.mjs +38 -0
- package/dist/esm2022/engine/index.mjs +17 -0
- package/dist/esm2022/engine/types.mjs +4 -0
- package/dist/esm2022/for-angular.module.mjs +118 -0
- package/dist/esm2022/helpers/index.mjs +13 -0
- package/dist/esm2022/helpers/utils.mjs +415 -0
- package/dist/esm2022/interfaces.mjs +2 -0
- package/dist/esm2022/public-apis.mjs +14 -0
- package/dist/{lib/fesm2022 → fesm2022}/decaf-ts-for-angular.mjs +3029 -3036
- package/dist/fesm2022/decaf-ts-for-angular.mjs.map +1 -0
- package/package.json +4 -2
- package/dist/lib/esm2022/components/crud-field/crud-field.component.mjs +0 -301
- package/dist/lib/esm2022/components/crud-form/constants.mjs +0 -14
- package/dist/lib/esm2022/components/crud-form/crud-form.component.mjs +0 -139
- package/dist/lib/esm2022/components/crud-form/types.mjs +0 -2
- package/dist/lib/esm2022/components/empty-state/empty-state.component.mjs +0 -348
- package/dist/lib/esm2022/components/fieldset/fieldset.component.mjs +0 -225
- package/dist/lib/esm2022/components/filter/filter.component.mjs +0 -689
- package/dist/lib/esm2022/components/for-angular-components.module.mjs +0 -71
- package/dist/lib/esm2022/components/index.mjs +0 -20
- package/dist/lib/esm2022/components/layout/layout.component.mjs +0 -176
- package/dist/lib/esm2022/components/list/constants.mjs +0 -6
- package/dist/lib/esm2022/components/list/list.component.mjs +0 -1236
- package/dist/lib/esm2022/components/model-renderer/model-renderer.component.mjs +0 -138
- package/dist/lib/esm2022/components/pagination/constants.mjs +0 -2
- package/dist/lib/esm2022/components/pagination/pagination.component.mjs +0 -323
- package/dist/lib/esm2022/components/searchbar/searchbar.component.mjs +0 -493
- package/dist/lib/esm2022/decaf-ts-for-angular.mjs +0 -5
- package/dist/lib/esm2022/directives/collapsable.directive.mjs +0 -28
- package/dist/lib/esm2022/directives/index.mjs +0 -2
- package/dist/lib/esm2022/engine/DynamicModule.mjs +0 -18
- package/dist/lib/esm2022/engine/NgxBaseComponent.mjs +0 -540
- package/dist/lib/esm2022/engine/NgxCrudFormField.mjs +0 -125
- package/dist/lib/esm2022/engine/NgxFormService.mjs +0 -315
- package/dist/lib/esm2022/engine/NgxRenderingEngine.mjs +0 -192
- package/dist/lib/esm2022/engine/NgxRenderingEngine2.mjs +0 -332
- package/dist/lib/esm2022/engine/ValidatorFactory.mjs +0 -102
- package/dist/lib/esm2022/engine/constants.mjs +0 -160
- package/dist/lib/esm2022/engine/decorators.mjs +0 -38
- package/dist/lib/esm2022/engine/index.mjs +0 -17
- package/dist/lib/esm2022/engine/types.mjs +0 -4
- package/dist/lib/esm2022/for-angular.module.mjs +0 -118
- package/dist/lib/esm2022/helpers/index.mjs +0 -13
- package/dist/lib/esm2022/helpers/utils.mjs +0 -415
- package/dist/lib/esm2022/interfaces.mjs +0 -2
- package/dist/lib/esm2022/public-apis.mjs +0 -14
- package/dist/lib/fesm2022/decaf-ts-for-angular.mjs.map +0 -1
- /package/dist/{lib/README.md → README.md} +0 -0
- /package/dist/{lib/assets → assets}/i18n/en.json +0 -0
- /package/dist/{lib/assets → assets}/images/angular-logo.svg +0 -0
- /package/dist/{lib/assets → assets}/images/decaf-logo-black.svg +0 -0
- /package/dist/{lib/assets → assets}/images/decaf-logo-lw.svg +0 -0
- /package/dist/{lib/assets → assets}/images/decaf-logo-white.svg +0 -0
- /package/dist/{lib/assets → assets}/images/decaf-logo.svg +0 -0
- /package/dist/{lib/components → components}/component-renderer/component-renderer.component.d.ts +0 -0
- /package/dist/{lib/components → components}/crud-field/crud-field.component.d.ts +0 -0
- /package/dist/{lib/components → components}/crud-form/constants.d.ts +0 -0
- /package/dist/{lib/components → components}/crud-form/crud-form.component.d.ts +0 -0
- /package/dist/{lib/components → components}/crud-form/types.d.ts +0 -0
- /package/dist/{lib/components → components}/for-angular-components.module.d.ts +0 -0
- /package/dist/{lib/components → components}/index.d.ts +0 -0
- /package/dist/{lib/components → components}/list/constants.d.ts +0 -0
- /package/dist/{lib/directives → directives}/collapsable.directive.d.ts +0 -0
- /package/dist/{lib/directives → directives}/index.d.ts +0 -0
- /package/dist/{lib/engine → engine}/DynamicModule.d.ts +0 -0
- /package/dist/{lib/engine → engine}/NgxCrudFormField.d.ts +0 -0
- /package/dist/{lib/engine → engine}/NgxFormService.d.ts +0 -0
- /package/dist/{lib/engine → engine}/NgxRenderingEngine.d.ts +0 -0
- /package/dist/{lib/engine → engine}/NgxRenderingEngine2.d.ts +0 -0
- /package/dist/{lib/engine → engine}/ValidatorFactory.d.ts +0 -0
- /package/dist/{lib/engine → engine}/constants.d.ts +0 -0
- /package/dist/{lib/engine → engine}/decorators.d.ts +0 -0
- /package/dist/{lib/engine → engine}/index.d.ts +0 -0
- /package/dist/{lib/engine → engine}/types.d.ts +0 -0
- /package/dist/{lib/for-angular.module.d.ts → for-angular.module.d.ts} +0 -0
- /package/dist/{lib/helpers → helpers}/index.d.ts +0 -0
- /package/dist/{lib/helpers → helpers}/utils.d.ts +0 -0
- /package/dist/{lib/index.d.ts → index.d.ts} +0 -0
- /package/dist/{lib/interfaces.d.ts → interfaces.d.ts} +0 -0
- /package/dist/{lib/public-apis.d.ts → public-apis.d.ts} +0 -0
|
@@ -1,138 +0,0 @@
|
|
|
1
|
-
import { Component, EventEmitter, inject, Injector, Input, Output, TemplateRef, ViewChild, ViewContainerRef, } from '@angular/core';
|
|
2
|
-
import { Model, sf } from '@decaf-ts/decorator-validation';
|
|
3
|
-
import { NgComponentOutlet } from '@angular/common';
|
|
4
|
-
import { AngularEngineKeys, BaseComponentProps, NgxRenderingEngine2, } from '../../engine';
|
|
5
|
-
import { ForAngularModule } from 'src/lib/for-angular.module';
|
|
6
|
-
import { ComponentRendererComponent } from '../component-renderer/component-renderer.component';
|
|
7
|
-
import * as i0 from "@angular/core";
|
|
8
|
-
import * as i1 from "@angular/common";
|
|
9
|
-
/**
|
|
10
|
-
* @description Component for rendering dynamic models
|
|
11
|
-
* @summary This component is responsible for dynamically rendering models,
|
|
12
|
-
* handling model changes, and managing event subscriptions for the rendered components.
|
|
13
|
-
* It uses the NgxRenderingEngine2 to render the models and supports both string and Model inputs.
|
|
14
|
-
* @class
|
|
15
|
-
* @template M - Type extending Model
|
|
16
|
-
* @param {Injector} injector - Angular Injector for dependency injection
|
|
17
|
-
* @example
|
|
18
|
-
* <ngx-decaf-model-renderer
|
|
19
|
-
* [model]="myModel"
|
|
20
|
-
* [globals]="globalVariables"
|
|
21
|
-
* (listenEvent)="handleEvent($event)">
|
|
22
|
-
* </ngx-decaf-model-renderer>
|
|
23
|
-
* @mermaid
|
|
24
|
-
* sequenceDiagram
|
|
25
|
-
* participant App
|
|
26
|
-
* participant ModelRenderer
|
|
27
|
-
* participant RenderingEngine
|
|
28
|
-
* participant Model
|
|
29
|
-
* App->>ModelRenderer: Input model
|
|
30
|
-
* ModelRenderer->>Model: Parse if string
|
|
31
|
-
* Model-->>ModelRenderer: Parsed model
|
|
32
|
-
* ModelRenderer->>RenderingEngine: Render model
|
|
33
|
-
* RenderingEngine-->>ModelRenderer: Rendered output
|
|
34
|
-
* ModelRenderer->>ModelRenderer: Subscribe to events
|
|
35
|
-
* ModelRenderer-->>App: Emit events
|
|
36
|
-
*/
|
|
37
|
-
export class ModelRendererComponent {
|
|
38
|
-
constructor() {
|
|
39
|
-
/**
|
|
40
|
-
* @description Global variables to be passed to the rendered component
|
|
41
|
-
*/
|
|
42
|
-
this.globals = {};
|
|
43
|
-
/**
|
|
44
|
-
* @description Event emitter for custom events from the rendered component
|
|
45
|
-
*/
|
|
46
|
-
this.listenEvent = new EventEmitter();
|
|
47
|
-
this.injector = inject(Injector);
|
|
48
|
-
this.JSON = JSON;
|
|
49
|
-
}
|
|
50
|
-
// constructor() {}
|
|
51
|
-
/**
|
|
52
|
-
* @description Refreshes the rendered model
|
|
53
|
-
* @param {string | M} model - The model to be rendered
|
|
54
|
-
*/
|
|
55
|
-
refresh(model) {
|
|
56
|
-
model =
|
|
57
|
-
typeof model === 'string'
|
|
58
|
-
? Model.build({}, model)
|
|
59
|
-
: model;
|
|
60
|
-
this.output = model.render(this.globals || {}, this.vcr, this.injector, this.inner);
|
|
61
|
-
if (this.output?.inputs)
|
|
62
|
-
this.rendererId = sf(AngularEngineKeys.RENDERED_ID, this.output.inputs['rendererId']);
|
|
63
|
-
this.instance = this.output?.instance;
|
|
64
|
-
this.subscribeEvents();
|
|
65
|
-
}
|
|
66
|
-
/**
|
|
67
|
-
* @description Lifecycle hook that is called when data-bound properties of a directive change
|
|
68
|
-
* @param {SimpleChanges} changes - Object containing changes
|
|
69
|
-
*/
|
|
70
|
-
ngOnChanges(changes) {
|
|
71
|
-
if (changes[BaseComponentProps.MODEL]) {
|
|
72
|
-
const { currentValue } = changes[BaseComponentProps.MODEL];
|
|
73
|
-
this.refresh(currentValue);
|
|
74
|
-
}
|
|
75
|
-
}
|
|
76
|
-
/**
|
|
77
|
-
* @description Lifecycle hook that is called when a directive, pipe, or service is destroyed
|
|
78
|
-
* @return {Promise<void>}
|
|
79
|
-
*/
|
|
80
|
-
async ngOnDestroy() {
|
|
81
|
-
if (this.instance) {
|
|
82
|
-
this.unsubscribeEvents();
|
|
83
|
-
await NgxRenderingEngine2.destroy();
|
|
84
|
-
}
|
|
85
|
-
this.output = undefined;
|
|
86
|
-
}
|
|
87
|
-
subscribeEvents() {
|
|
88
|
-
if (this.instance) {
|
|
89
|
-
const componentKeys = Object.keys(this.instance);
|
|
90
|
-
for (const key of componentKeys) {
|
|
91
|
-
const value = this.instance[key];
|
|
92
|
-
if (value instanceof EventEmitter)
|
|
93
|
-
this.instance[key].subscribe((event) => {
|
|
94
|
-
this.listenEvent.emit({
|
|
95
|
-
component: this.output?.component.name || '',
|
|
96
|
-
name: key,
|
|
97
|
-
...event,
|
|
98
|
-
});
|
|
99
|
-
});
|
|
100
|
-
}
|
|
101
|
-
}
|
|
102
|
-
}
|
|
103
|
-
/**
|
|
104
|
-
* @description Unsubscribes from events emitted by the rendered component
|
|
105
|
-
*/
|
|
106
|
-
unsubscribeEvents() {
|
|
107
|
-
if (this.instance) {
|
|
108
|
-
const componentKeys = Object.keys(this.instance);
|
|
109
|
-
for (const key of componentKeys) {
|
|
110
|
-
const value = this.instance[key];
|
|
111
|
-
if (value instanceof EventEmitter)
|
|
112
|
-
this.instance[key].unsubscribe();
|
|
113
|
-
}
|
|
114
|
-
}
|
|
115
|
-
}
|
|
116
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: ModelRendererComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
117
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.13", type: ModelRendererComponent, isStandalone: true, selector: "ngx-decaf-model-renderer", inputs: { model: "model", globals: "globals", rendererId: "rendererId" }, outputs: { listenEvent: "listenEvent" }, viewQueries: [{ propertyName: "inner", first: true, predicate: ["inner"], descendants: true, read: TemplateRef, static: true }, { propertyName: "vcr", first: true, predicate: ["componentOuter"], descendants: true, read: ViewContainerRef, static: true }], usesOnChanges: true, ngImport: i0, template: " <ng-template #componentOuter></ng-template>\n <ng-template #inner>\n <div [id]=\"rendererId || null\">\n @for (child of output?.children; track child) {\n @if(child?.children?.length) {\n <ngx-decaf-component-renderer [parent]=\"child\" />\n } @else {\n <ng-container\n #childComponents\n *ngComponentOutlet=\"\n child.component;\n injector: child.injector;\n inputs: child.inputs;\n content:child.content;\n \"\n />\n }\n }\n </div>\n </ng-template>\n", styles: [""], dependencies: [{ kind: "ngmodule", type: ForAngularModule }, { kind: "directive", type: i1.NgComponentOutlet, selector: "[ngComponentOutlet]", inputs: ["ngComponentOutlet", "ngComponentOutletInputs", "ngComponentOutletInjector", "ngComponentOutletContent", "ngComponentOutletNgModule", "ngComponentOutletNgModuleFactory"] }, { kind: "component", type: ComponentRendererComponent, selector: "ngx-decaf-component-renderer", inputs: ["tag", "globals", "model", "parent"], outputs: ["listenEvent"] }] }); }
|
|
118
|
-
}
|
|
119
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: ModelRendererComponent, decorators: [{
|
|
120
|
-
type: Component,
|
|
121
|
-
args: [{ standalone: true, imports: [ForAngularModule, NgComponentOutlet, ComponentRendererComponent], selector: 'ngx-decaf-model-renderer', template: " <ng-template #componentOuter></ng-template>\n <ng-template #inner>\n <div [id]=\"rendererId || null\">\n @for (child of output?.children; track child) {\n @if(child?.children?.length) {\n <ngx-decaf-component-renderer [parent]=\"child\" />\n } @else {\n <ng-container\n #childComponents\n *ngComponentOutlet=\"\n child.component;\n injector: child.injector;\n inputs: child.inputs;\n content:child.content;\n \"\n />\n }\n }\n </div>\n </ng-template>\n" }]
|
|
122
|
-
}], propDecorators: { model: [{
|
|
123
|
-
type: Input,
|
|
124
|
-
args: [{ required: true }]
|
|
125
|
-
}], globals: [{
|
|
126
|
-
type: Input
|
|
127
|
-
}], inner: [{
|
|
128
|
-
type: ViewChild,
|
|
129
|
-
args: ['inner', { read: TemplateRef, static: true }]
|
|
130
|
-
}], rendererId: [{
|
|
131
|
-
type: Input
|
|
132
|
-
}], vcr: [{
|
|
133
|
-
type: ViewChild,
|
|
134
|
-
args: ['componentOuter', { static: true, read: ViewContainerRef }]
|
|
135
|
-
}], listenEvent: [{
|
|
136
|
-
type: Output
|
|
137
|
-
}] } });
|
|
138
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9kZWwtcmVuZGVyZXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi9jb21wb25lbnRzL21vZGVsLXJlbmRlcmVyL21vZGVsLXJlbmRlcmVyLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3NyYy9saWIvY29tcG9uZW50cy9tb2RlbC1yZW5kZXJlci9tb2RlbC1yZW5kZXJlci5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsU0FBUyxFQUNULFlBQVksRUFDWixNQUFNLEVBQ04sUUFBUSxFQUNSLEtBQUssRUFHTCxNQUFNLEVBRU4sV0FBVyxFQUNYLFNBQVMsRUFDVCxnQkFBZ0IsR0FDakIsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLEtBQUssRUFBRSxFQUFFLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUMzRCxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUNwRCxPQUFPLEVBRUwsaUJBQWlCLEVBQ2pCLGtCQUFrQixFQUVsQixtQkFBbUIsR0FFcEIsTUFBTSxjQUFjLENBQUM7QUFFdEIsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFFOUQsT0FBTyxFQUFFLDBCQUEwQixFQUFFLE1BQU0sb0RBQW9ELENBQUM7OztBQUVoRzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBMkJHO0FBUUgsTUFBTSxPQUFPLHNCQUFzQjtJQVBuQztRQWlCRTs7V0FFRztRQUVILFlBQU8sR0FBNEIsRUFBRSxDQUFDO1FBeUJ0Qzs7V0FFRztRQUVILGdCQUFXLEdBQUcsSUFBSSxZQUFZLEVBQXVCLENBQUM7UUFZOUMsYUFBUSxHQUFhLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQztRQWtGM0IsU0FBSSxHQUFHLElBQUksQ0FBQztLQUNoQztJQWpGQyxtQkFBbUI7SUFFbkI7OztPQUdHO0lB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QUFzQjttR0FBdEIsc0JBQXNCLGtSQW1CTCxXQUFXLDhHQWlCWSxnQkFBZ0IsZ0VDcEdyRSxnbUJBb0JBLHlERHVDWSxnQkFBZ0IsdVNBQXFCLDBCQUEwQjs7NEZBSzlELHNCQUFzQjtrQkFQbEMsU0FBUztpQ0FDSSxJQUFJLFdBQ1AsQ0FBQyxnQkFBZ0IsRUFBRSxpQkFBaUIsRUFBRSwwQkFBMEIsQ0FBQyxZQUNoRSwwQkFBMEI7OEJBWXBDLEtBQUs7c0JBREosS0FBSzt1QkFBQyxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUU7Z0JBT3pCLE9BQU87c0JBRE4sS0FBSztnQkFPTixLQUFLO3NCQURKLFNBQVM7dUJBQUMsT0FBTyxFQUFFLEVBQUUsSUFBSSxFQUFFLFdBQVcsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFO2dCQVl2RCxVQUFVO3NCQURULEtBQUs7Z0JBT04sR0FBRztzQkFERixTQUFTO3VCQUFDLGdCQUFnQixFQUFFLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsZ0JBQWdCLEVBQUU7Z0JBT3JFLFdBQVc7c0JBRFYsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIENvbXBvbmVudCxcbiAgRXZlbnRFbWl0dGVyLFxuICBpbmplY3QsXG4gIEluamVjdG9yLFxuICBJbnB1dCxcbiAgT25DaGFuZ2VzLFxuICBPbkRlc3Ryb3ksXG4gIE91dHB1dCxcbiAgU2ltcGxlQ2hhbmdlcyxcbiAgVGVtcGxhdGVSZWYsXG4gIFZpZXdDaGlsZCxcbiAgVmlld0NvbnRhaW5lclJlZixcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBNb2RlbCwgc2YgfSBmcm9tICdAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb24nO1xuaW1wb3J0IHsgTmdDb21wb25lbnRPdXRsZXQgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHtcbiAgQW5ndWxhckR5bmFtaWNPdXRwdXQsXG4gIEFuZ3VsYXJFbmdpbmVLZXlzLFxuICBCYXNlQ29tcG9uZW50UHJvcHMsXG4gIEJhc2VDdXN0b21FdmVudCxcbiAgTmd4UmVuZGVyaW5nRW5naW5lMixcbiAgUmVuZGVyZWRNb2RlbCxcbn0gZnJvbSAnLi4vLi4vZW5naW5lJztcbmltcG9ydCB7IEtleVZhbHVlLCBSZW5kZXJlckN1c3RvbUV2ZW50IH0gZnJvbSAnc3JjL2xpYi9lbmdpbmUvdHlwZXMnO1xuaW1wb3J0IHsgRm9yQW5ndWxhck1vZHVsZSB9IGZyb20gJ3NyYy9saWIvZm9yLWFuZ3VsYXIubW9kdWxlJztcbmltcG9ydCB7IFJlbmRlcmFibGUgfSBmcm9tICdAZGVjYWYtdHMvdWktZGVjb3JhdG9ycyc7XG5pbXBvcnQgeyBDb21wb25lbnRSZW5kZXJlckNvbXBvbmVudCB9IGZyb20gJy4uL2NvbXBvbmVudC1yZW5kZXJlci9jb21wb25lbnQtcmVuZGVyZXIuY29tcG9uZW50JztcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gQ29tcG9uZW50IGZvciByZW5kZXJpbmcgZHluYW1pYyBtb2RlbHNcbiAqIEBzdW1tYXJ5IFRoaXMgY29tcG9uZW50IGlzIHJlc3BvbnNpYmxlIGZvciBkeW5hbWljYWxseSByZW5kZXJpbmcgbW9kZWxzLFxuICogaGFuZGxpbmcgbW9kZWwgY2hhbmdlcywgYW5kIG1hbmFnaW5nIGV2ZW50IHN1YnNjcmlwdGlvbnMgZm9yIHRoZSByZW5kZXJlZCBjb21wb25lbnRzLlxuICogSXQgdXNlcyB0aGUgTmd4UmVuZGVyaW5nRW5naW5lMiB0byByZW5kZXIgdGhlIG1vZGVscyBhbmQgc3VwcG9ydHMgYm90aCBzdHJpbmcgYW5kIE1vZGVsIGlucHV0cy5cbiAqIEBjbGFzc1xuICogQHRlbXBsYXRlIE0gLSBUeXBlIGV4dGVuZGluZyBNb2RlbFxuICogQHBhcmFtIHtJbmplY3Rvcn0gaW5qZWN0b3IgLSBBbmd1bGFyIEluamVjdG9yIGZvciBkZXBlbmRlbmN5IGluamVjdGlvblxuICogQGV4YW1wbGVcbiAqIDxuZ3gtZGVjYWYtbW9kZWwtcmVuZGVyZXJcbiAqICAgW21vZGVsXT1cIm15TW9kZWxcIlxuICogICBbZ2xvYmFsc109XCJnbG9iYWxWYXJpYWJsZXNcIlxuICogICAobGlzdGVuRXZlbnQpPVwiaGFuZGxlRXZlbnQoJGV2ZW50KVwiPlxuICogPC9uZ3gtZGVjYWYtbW9kZWwtcmVuZGVyZXI+XG4gKiBAbWVybWFpZFxuICogc2VxdWVuY2VEaWFncmFtXG4gKiAgIHBhcnRpY2lwYW50IEFwcFxuICogICBwYXJ0aWNpcGFudCBNb2RlbFJlbmRlcmVyXG4gKiAgIHBhcnRpY2lwYW50IFJlbmRlcmluZ0VuZ2luZVxuICogICBwYXJ0aWNpcGFudCBNb2RlbFxuICogICBBcHAtPj5Nb2RlbFJlbmRlcmVyOiBJbnB1dCBtb2RlbFxuICogICBNb2RlbFJlbmRlcmVyLT4+TW9kZWw6IFBhcnNlIGlmIHN0cmluZ1xuICogICBNb2RlbC0tPj5Nb2RlbFJlbmRlcmVyOiBQYXJzZWQgbW9kZWxcbiAqICAgTW9kZWxSZW5kZXJlci0+PlJlbmRlcmluZ0VuZ2luZTogUmVuZGVyIG1vZGVsXG4gKiAgIFJlbmRlcmluZ0VuZ2luZS0tPj5Nb2RlbFJlbmRlcmVyOiBSZW5kZXJlZCBvdXRwdXRcbiAqICAgTW9kZWxSZW5kZXJlci0+Pk1vZGVsUmVuZGVyZXI6IFN1YnNjcmliZSB0byBldmVudHNcbiAqICAgTW9kZWxSZW5kZXJlci0tPj5BcHA6IEVtaXQgZXZlbnRzXG4gKi9cbkBDb21wb25lbnQoe1xuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbRm9yQW5ndWxhck1vZHVsZSwgTmdDb21wb25lbnRPdXRsZXQsIENvbXBvbmVudFJlbmRlcmVyQ29tcG9uZW50XSxcbiAgc2VsZWN0b3I6ICduZ3gtZGVjYWYtbW9kZWwtcmVuZGVyZXInLFxuICB0ZW1wbGF0ZVVybDogJy4vbW9kZWwtcmVuZGVyZXIuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybDogJy4vbW9kZWwtcmVuZGVyZXIuY29tcG9uZW50LnNjc3MnLFxufSlcbmV4cG9ydCBjbGFzcyBNb2RlbFJlbmRlcmVyQ29tcG9uZW50PE0gZXh0ZW5kcyBNb2RlbD5cbiAgaW1wbGVtZW50cyBPbkNoYW5nZXMsIE9uRGVzdHJveSwgUmVuZGVyZWRNb2RlbCB7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBJbnB1dCBtb2RlbCB0byBiZSByZW5kZXJlZFxuICAgKiBAc3VtbWFyeSBDYW4gYmUgYSBNb2RlbCBpbnN0YW5jZSBvciBhIEpTT04gc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIGEgbW9kZWxcbiAgICovXG4gIEBJbnB1dCh7IHJlcXVpcmVkOiB0cnVlIH0pXG4gIG1vZGVsITogTSB8IHN0cmluZyB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEdsb2JhbCB2YXJpYWJsZXMgdG8gYmUgcGFzc2VkIHRvIHRoZSByZW5kZXJlZCBjb21wb25lbnRcbiAgICovXG4gIEBJbnB1dCgpXG4gIGdsb2JhbHM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0ge307XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBUZW1wbGF0ZSByZWZlcmVuY2UgZm9yIGlubmVyIGNvbnRlbnRcbiAgICovXG4gIEBWaWV3Q2hpbGQoJ2lubmVyJywgeyByZWFkOiBUZW1wbGF0ZVJlZiwgc3RhdGljOiB0cnVlIH0pXG4gIGlubmVyPzogVGVtcGxhdGVSZWY8dW5rbm93bj47XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBPdXRwdXQgb2YgdGhlIHJlbmRlcmVkIG1vZGVsXG4gICAqL1xuICBvdXRwdXQ/OiBBbmd1bGFyRHluYW1pY091dHB1dDtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVuZGVyZXJcbiAgICovXG4gIEBJbnB1dCgpXG4gIHJlbmRlcmVySWQ/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBWaWV3IGNvbnRhaW5lciByZWZlcmVuY2UgZm9yIGR5bmFtaWMgY29tcG9uZW50IHJlbmRlcmluZ1xuICAgKi9cbiAgQFZpZXdDaGlsZCgnY29tcG9uZW50T3V0ZXInLCB7IHN0YXRpYzogdHJ1ZSwgcmVhZDogVmlld0NvbnRhaW5lclJlZiB9KVxuICB2Y3IhOiBWaWV3Q29udGFpbmVyUmVmO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gRXZlbnQgZW1pdHRlciBmb3IgY3VzdG9tIGV2ZW50cyBmcm9tIHRoZSByZW5kZXJlZCBjb21wb25lbnRcbiAgICovXG4gIEBPdXRwdXQoKVxuICBsaXN0ZW5FdmVudCA9IG5ldyBFdmVudEVtaXR0ZXI8UmVuZGVyZXJDdXN0b21FdmVudD4oKTtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEluc3RhbmNlIG9mIHRoZSBOZ3hSZW5kZXJpbmdFbmdpbmUyXG4gICAqL1xuICBwcml2YXRlIHJlbmRlciE6IE5neFJlbmRlcmluZ0VuZ2luZTI7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBJbnN0YW5jZSBvZiB0aGUgcmVuZGVyZWQgY29tcG9uZW50XG4gICAqL1xuICBwcml2YXRlIGluc3RhbmNlITogS2V5VmFsdWUgfCB1bmRlZmluZWQ7XG5cbiAgcHJpdmF0ZSBpbmplY3RvcjogSW5qZWN0b3IgPSBpbmplY3QoSW5qZWN0b3IpO1xuXG4gIC8vIGNvbnN0cnVjdG9yKCkge31cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFJlZnJlc2hlcyB0aGUgcmVuZGVyZWQgbW9kZWxcbiAgICogQHBhcmFtIHtzdHJpbmcgfCBNfSBtb2RlbCAtIFRoZSBtb2RlbCB0byBiZSByZW5kZXJlZFxuICAgKi9cbiAgcHJpdmF0ZSByZWZyZXNoKG1vZGVsOiBzdHJpbmcgfCBNKSB7XG4gICAgbW9kZWwgPVxuICAgICAgdHlwZW9mIG1vZGVsID09PSAnc3RyaW5nJ1xuICAgICAgICA/IChNb2RlbC5idWlsZCh7fSwgbW9kZWwpIGFzIE0pXG4gICAgICAgIDogbW9kZWw7XG4gICAgdGhpcy5vdXRwdXQgPSAobW9kZWwgYXMgdW5rbm93biBhcyBSZW5kZXJhYmxlKS5yZW5kZXI8QW5ndWxhckR5bmFtaWNPdXRwdXQ+KFxuICAgICAgdGhpcy5nbG9iYWxzIHx8IHt9LFxuICAgICAgdGhpcy52Y3IsXG4gICAgICB0aGlzLmluamVjdG9yLFxuICAgICAgdGhpcy5pbm5lcixcbiAgICApO1xuICAgIGlmICh0aGlzLm91dHB1dD8uaW5wdXRzKVxuICAgICAgdGhpcy5yZW5kZXJlcklkID0gc2YoXG4gICAgICAgIEFuZ3VsYXJFbmdpbmVLZXlzLlJFTkRFUkVEX0lELFxuICAgICAgICAodGhpcy5vdXRwdXQuaW5wdXRzIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KVsncmVuZGVyZXJJZCddIGFzIHN0cmluZyxcbiAgICAgICk7XG4gICAgdGhpcy5pbnN0YW5jZSA9IHRoaXMub3V0cHV0Py5pbnN0YW5jZTtcbiAgICB0aGlzLnN1YnNjcmliZUV2ZW50cygpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBMaWZlY3ljbGUgaG9vayB0aGF0IGlzIGNhbGxlZCB3aGVuIGRhdGEtYm91bmQgcHJvcGVydGllcyBvZiBhIGRpcmVjdGl2ZSBjaGFuZ2VcbiAgICogQHBhcmFtIHtTaW1wbGVDaGFuZ2VzfSBjaGFuZ2VzIC0gT2JqZWN0IGNvbnRhaW5pbmcgY2hhbmdlc1xuICAgKi9cbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xuICAgIGlmIChjaGFuZ2VzW0Jhc2VDb21wb25lbnRQcm9wcy5NT0RFTF0pIHtcbiAgICAgIGNvbnN0IHsgY3VycmVudFZhbHVlIH0gPSBjaGFuZ2VzW0Jhc2VDb21wb25lbnRQcm9wcy5NT0RFTF07XG4gICAgICB0aGlzLnJlZnJlc2goY3VycmVudFZhbHVlKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIExpZmVjeWNsZSBob29rIHRoYXQgaXMgY2FsbGVkIHdoZW4gYSBkaXJlY3RpdmUsIHBpcGUsIG9yIHNlcnZpY2UgaXMgZGVzdHJveWVkXG4gICAqIEByZXR1cm4ge1Byb21pc2U8dm9pZD59XG4gICAqL1xuICBhc3luYyBuZ09uRGVzdHJveSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAodGhpcy5pbnN0YW5jZSkge1xuICAgICAgdGhpcy51bnN1YnNjcmliZUV2ZW50cygpO1xuICAgICAgYXdhaXQgTmd4UmVuZGVyaW5nRW5naW5lMi5kZXN0cm95KCk7XG4gICAgfVxuICAgIHRoaXMub3V0cHV0ID0gdW5kZWZpbmVkO1xuICB9XG5cbiAgcHJpdmF0ZSBzdWJzY3JpYmVFdmVudHMoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuaW5zdGFuY2UpIHtcbiAgICAgIGNvbnN0IGNvbXBvbmVudEtleXMgPSBPYmplY3Qua2V5cyh0aGlzLmluc3RhbmNlKTtcbiAgICAgIGZvciAoY29uc3Qga2V5IG9mIGNvbXBvbmVudEtleXMpIHtcbiAgICAgICAgY29uc3QgdmFsdWUgPSB0aGlzLmluc3RhbmNlW2tleV07XG4gICAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIEV2ZW50RW1pdHRlcilcbiAgICAgICAgICAodGhpcy5pbnN0YW5jZSBhcyBLZXlWYWx1ZSlba2V5XS5zdWJzY3JpYmUoKGV2ZW50OiBQYXJ0aWFsPEJhc2VDdXN0b21FdmVudD4pID0+IHtcbiAgICAgICAgICAgIHRoaXMubGlzdGVuRXZlbnQuZW1pdCh7XG4gICAgICAgICAgICAgIGNvbXBvbmVudDogdGhpcy5vdXRwdXQ/LmNvbXBvbmVudC5uYW1lIHx8ICcnLFxuICAgICAgICAgICAgICBuYW1lOiBrZXksXG4gICAgICAgICAgICAgIC4uLmV2ZW50LFxuICAgICAgICAgICAgfSBhcyBSZW5kZXJlckN1c3RvbUV2ZW50KTtcbiAgICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFVuc3Vic2NyaWJlcyBmcm9tIGV2ZW50cyBlbWl0dGVkIGJ5IHRoZSByZW5kZXJlZCBjb21wb25lbnRcbiAgICovXG4gIHByaXZhdGUgdW5zdWJzY3JpYmVFdmVudHMoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuaW5zdGFuY2UpIHtcbiAgICAgIGNvbnN0IGNvbXBvbmVudEtleXMgPSBPYmplY3Qua2V5cyh0aGlzLmluc3RhbmNlKTtcbiAgICAgIGZvciAoY29uc3Qga2V5IG9mIGNvbXBvbmVudEtleXMpIHtcbiAgICAgICAgY29uc3QgdmFsdWUgPSB0aGlzLmluc3RhbmNlW2tleV07XG4gICAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIEV2ZW50RW1pdHRlcilcbiAgICAgICAgICB0aGlzLmluc3RhbmNlW2tleV0udW5zdWJzY3JpYmUoKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgcmVhZG9ubHkgSlNPTiA9IEpTT047XG59XG4iLCIgIDxuZy10ZW1wbGF0ZSAjY29tcG9uZW50T3V0ZXI+PC9uZy10ZW1wbGF0ZT5cbiAgPG5nLXRlbXBsYXRlICNpbm5lcj5cbiAgICA8ZGl2ICBbaWRdPVwicmVuZGVyZXJJZCB8fCBudWxsXCI+XG4gICAgICBAZm9yIChjaGlsZCBvZiBvdXRwdXQ/LmNoaWxkcmVuOyB0cmFjayBjaGlsZCkge1xuICAgICAgICBAaWYoY2hpbGQ/LmNoaWxkcmVuPy5sZW5ndGgpIHtcbiAgICAgICAgICA8bmd4LWRlY2FmLWNvbXBvbmVudC1yZW5kZXJlciBbcGFyZW50XT1cImNoaWxkXCIgLz5cbiAgICAgICAgfSBAZWxzZSB7XG4gICAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICAgI2NoaWxkQ29tcG9uZW50c1xuICAgICAgICAgICAgKm5nQ29tcG9uZW50T3V0bGV0PVwiXG4gICAgICAgICAgICAgIGNoaWxkLmNvbXBvbmVudDtcbiAgICAgICAgICAgICAgaW5qZWN0b3I6IGNoaWxkLmluamVjdG9yO1xuICAgICAgICAgICAgICBpbnB1dHM6IGNoaWxkLmlucHV0cztcbiAgICAgICAgICAgICAgY29udGVudDpjaGlsZC5jb250ZW50O1xuICAgICAgICAgICAgXCJcbiAgICAgICAgICAvPlxuICAgICAgICB9XG4gICAgICB9XG4gICAgPC9kaXY+XG4gIDwvbmctdGVtcGxhdGU+XG4iXX0=
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
export {};
|
|
2
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uc3RhbnRzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi9jb21wb25lbnRzL3BhZ2luYXRpb24vY29uc3RhbnRzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBCYXNlQ3VzdG9tRXZlbnQgfSBmcm9tIFwic3JjL2xpYi9lbmdpbmVcIlxuXG5leHBvcnQgdHlwZSBQYWdpbmF0aW9uQ3VzdG9tRXZlbnQgPSBCYXNlQ3VzdG9tRXZlbnQgJiB7XG4gIGRhdGE6IHtcbiAgICBwYWdlOiBudW1iZXIsXG4gICAgZGlyZWN0aW9uOiAnbmV4dCcgfCAncHJldmlvdXMnXG4gIH1cbn1cbiJdfQ==
|
|
@@ -1,323 +0,0 @@
|
|
|
1
|
-
import { Component, EventEmitter, Input, Output } from '@angular/core';
|
|
2
|
-
import { IonIcon } from '@ionic/angular/standalone';
|
|
3
|
-
import { addIcons } from 'ionicons';
|
|
4
|
-
import { chevronBackOutline, chevronForwardOutline } from 'ionicons/icons';
|
|
5
|
-
import { ForAngularModule } from 'src/lib/for-angular.module';
|
|
6
|
-
import { NgxBaseComponent } from 'src/lib/engine/NgxBaseComponent';
|
|
7
|
-
import { EventConstants } from 'src/lib/engine';
|
|
8
|
-
import * as i0 from "@angular/core";
|
|
9
|
-
import * as i1 from "@angular/common";
|
|
10
|
-
import * as i2 from "@ngx-translate/core";
|
|
11
|
-
/**
|
|
12
|
-
* @description A pagination component for navigating through multiple pages of content.
|
|
13
|
-
* @summary This component provides a user interface for paginated content navigation,
|
|
14
|
-
* displaying page numbers and navigation controls. It supports customizable page counts,
|
|
15
|
-
* current page tracking, and emits events when users navigate between pages.
|
|
16
|
-
*
|
|
17
|
-
* The component intelligently handles large numbers of pages by showing a subset of page
|
|
18
|
-
* numbers with ellipses to indicate skipped pages, ensuring the UI remains clean and usable
|
|
19
|
-
* even with many pages.
|
|
20
|
-
*
|
|
21
|
-
* @mermaid
|
|
22
|
-
* sequenceDiagram
|
|
23
|
-
* participant U as User
|
|
24
|
-
* participant P as PaginationComponent
|
|
25
|
-
* participant E as External Component
|
|
26
|
-
*
|
|
27
|
-
* U->>P: Click page number
|
|
28
|
-
* P->>P: navigate(page)
|
|
29
|
-
* P->>P: handleClick(direction, page)
|
|
30
|
-
* P->>E: Emit clickEvent with PaginationCustomEvent
|
|
31
|
-
*
|
|
32
|
-
* U->>P: Click next button
|
|
33
|
-
* P->>P: next()
|
|
34
|
-
* P->>P: handleClick('next')
|
|
35
|
-
* P->>E: Emit clickEvent with PaginationCustomEvent
|
|
36
|
-
*
|
|
37
|
-
* U->>P: Click previous button
|
|
38
|
-
* P->>P: previous()
|
|
39
|
-
* P->>P: handleClick('previous')
|
|
40
|
-
* P->>E: Emit clickEvent with PaginationCustomEvent
|
|
41
|
-
*
|
|
42
|
-
* @example
|
|
43
|
-
* <ngx-decaf-pagination
|
|
44
|
-
* [pages]="10"
|
|
45
|
-
* [current]="3"
|
|
46
|
-
* (clickEvent)="handlePageChange($event)">
|
|
47
|
-
* </ngx-decaf-pagination>
|
|
48
|
-
*
|
|
49
|
-
* @extends {NgxBaseComponent}
|
|
50
|
-
* @implements {OnInit}
|
|
51
|
-
*/
|
|
52
|
-
export class PaginationComponent extends NgxBaseComponent {
|
|
53
|
-
/**
|
|
54
|
-
* @constructor
|
|
55
|
-
* @description Initializes a new instance of the PaginationComponent.
|
|
56
|
-
* Calls the parent constructor with the component name for generate base locale string.
|
|
57
|
-
*/
|
|
58
|
-
constructor() {
|
|
59
|
-
super("PaginationComponent");
|
|
60
|
-
/**
|
|
61
|
-
* @description Controls whether the component uses translation services.
|
|
62
|
-
* @summary When set to true, the component will attempt to use translation services
|
|
63
|
-
* for any text content. This allows for internationalization of the pagination component.
|
|
64
|
-
*
|
|
65
|
-
* @type {StringOrBoolean}
|
|
66
|
-
* @default true
|
|
67
|
-
* @memberOf PaginationComponent
|
|
68
|
-
*/
|
|
69
|
-
this.translatable = true;
|
|
70
|
-
/**
|
|
71
|
-
* @description The currently active page number.
|
|
72
|
-
* @summary Specifies which page is currently active or selected. This value is used
|
|
73
|
-
* to highlight the current page in the UI and as a reference point for navigation.
|
|
74
|
-
*
|
|
75
|
-
* @type {number}
|
|
76
|
-
* @default 1
|
|
77
|
-
* @memberOf PaginationComponent
|
|
78
|
-
*/
|
|
79
|
-
this.current = 1;
|
|
80
|
-
/**
|
|
81
|
-
* @description Event emitter for pagination navigation events.
|
|
82
|
-
* @summary Emits a custom event when users navigate between pages, either by clicking
|
|
83
|
-
* on page numbers or using the next/previous buttons. The event contains information
|
|
84
|
-
* about the navigation direction and the target page number.
|
|
85
|
-
*
|
|
86
|
-
* @type {EventEmitter<PaginationCustomEvent>}
|
|
87
|
-
* @memberOf PaginationComponent
|
|
88
|
-
*/
|
|
89
|
-
this.clickEvent = new EventEmitter();
|
|
90
|
-
addIcons({ chevronBackOutline, chevronForwardOutline });
|
|
91
|
-
}
|
|
92
|
-
/**
|
|
93
|
-
* @description Initializes the component after Angular sets the input properties.
|
|
94
|
-
* @summary Sets up the component by initializing the locale settings based on the
|
|
95
|
-
* translatable property, generating the page numbers based on the total pages and
|
|
96
|
-
* current page, and storing the last page number for boundary checking.
|
|
97
|
-
*
|
|
98
|
-
* @mermaid
|
|
99
|
-
* sequenceDiagram
|
|
100
|
-
* participant A as Angular Lifecycle
|
|
101
|
-
* participant P as PaginationComponent
|
|
102
|
-
*
|
|
103
|
-
* A->>P: ngOnInit()
|
|
104
|
-
* P->>P: getLocale(translatable)
|
|
105
|
-
* P->>P: Set locale
|
|
106
|
-
* P->>P: getPages(data, current)
|
|
107
|
-
* P->>P: Set pages array
|
|
108
|
-
* P->>P: Set last page number
|
|
109
|
-
*
|
|
110
|
-
* @returns {void}
|
|
111
|
-
* @memberOf PaginationComponent
|
|
112
|
-
*/
|
|
113
|
-
ngOnInit() {
|
|
114
|
-
this.locale = this.getLocale(this.translatable);
|
|
115
|
-
this.pages = this.getPages(this.totalPages, this.current);
|
|
116
|
-
this.last = this.totalPages;
|
|
117
|
-
}
|
|
118
|
-
/**
|
|
119
|
-
* @description Handles click events on pagination controls.
|
|
120
|
-
* @summary Processes user interactions with the pagination component, updating the
|
|
121
|
-
* current page if specified and emitting an event with navigation details. This method
|
|
122
|
-
* is called when users click on page numbers or navigation buttons.
|
|
123
|
-
*
|
|
124
|
-
* @param {('next' | 'previous')} direction - The direction of navigation
|
|
125
|
-
* @param {number} [page] - Optional page number to navigate to directly
|
|
126
|
-
* @returns {void}
|
|
127
|
-
*
|
|
128
|
-
* @mermaid
|
|
129
|
-
* sequenceDiagram
|
|
130
|
-
* participant U as User
|
|
131
|
-
* participant P as PaginationComponent
|
|
132
|
-
* participant E as External Component
|
|
133
|
-
*
|
|
134
|
-
* U->>P: Click pagination control
|
|
135
|
-
* P->>P: handleClick(direction, page?)
|
|
136
|
-
* alt page is provided
|
|
137
|
-
* P->>P: Update current page
|
|
138
|
-
* end
|
|
139
|
-
* P->>E: Emit clickEvent with direction and page
|
|
140
|
-
*
|
|
141
|
-
* @memberOf PaginationComponent
|
|
142
|
-
*/
|
|
143
|
-
handleClick(direction, page) {
|
|
144
|
-
if (page)
|
|
145
|
-
this.current = page;
|
|
146
|
-
this.clickEvent.emit({
|
|
147
|
-
name: EventConstants.CLICK_EVENT,
|
|
148
|
-
data: {
|
|
149
|
-
direction,
|
|
150
|
-
page: this.current
|
|
151
|
-
},
|
|
152
|
-
component: this.componentName
|
|
153
|
-
});
|
|
154
|
-
}
|
|
155
|
-
/**
|
|
156
|
-
* @description Generates the array of page objects for display.
|
|
157
|
-
* @summary Creates an array of page objects based on the total number of pages and
|
|
158
|
-
* the current page. For small page counts (≤5), all pages are shown. For larger page
|
|
159
|
-
* counts, a subset is shown with ellipses to indicate skipped pages. This ensures
|
|
160
|
-
* the pagination UI remains clean and usable even with many pages.
|
|
161
|
-
*
|
|
162
|
-
* @param {number} total - The total number of pages
|
|
163
|
-
* @param {number} [current] - The current active page (defaults to this.current)
|
|
164
|
-
* @returns {KeyValue[]} Array of page objects with index and text properties
|
|
165
|
-
*
|
|
166
|
-
* @mermaid
|
|
167
|
-
* flowchart TD
|
|
168
|
-
* A[Start] --> B{total <= 5?}
|
|
169
|
-
* B -->|Yes| C[Show all pages]
|
|
170
|
-
* B -->|No| D[Show first page]
|
|
171
|
-
* D --> E[Show last pages]
|
|
172
|
-
* E --> F[Add ellipses for skipped pages]
|
|
173
|
-
* C --> G[Return pages array]
|
|
174
|
-
* F --> G
|
|
175
|
-
*
|
|
176
|
-
* @memberOf PaginationComponent
|
|
177
|
-
*/
|
|
178
|
-
getPages(total, current) {
|
|
179
|
-
if (!current)
|
|
180
|
-
current = this.current;
|
|
181
|
-
const pages = [];
|
|
182
|
-
function getPage(index, text = '') {
|
|
183
|
-
if (pages.some(item => item['index'] === index))
|
|
184
|
-
return;
|
|
185
|
-
pages.push({ index, text: index != null ? index.toString().padStart(2, '0') : text });
|
|
186
|
-
}
|
|
187
|
-
if (total <= 5) {
|
|
188
|
-
for (let i = 1; i <= total; i++)
|
|
189
|
-
getPage(i);
|
|
190
|
-
}
|
|
191
|
-
else {
|
|
192
|
-
// Adiciona os dois primeiros
|
|
193
|
-
getPage(1);
|
|
194
|
-
getPage(2);
|
|
195
|
-
// Adiciona "..." entre os blocos
|
|
196
|
-
if (current && current > 3)
|
|
197
|
-
getPage(null, '...');
|
|
198
|
-
// Adiciona a página atual (se estiver no meio)
|
|
199
|
-
if (current && current > 2 && current < total - 1)
|
|
200
|
-
getPage(current);
|
|
201
|
-
// Adiciona "..." entre os blocos
|
|
202
|
-
if (current && current < total - 2)
|
|
203
|
-
getPage(null, '...');
|
|
204
|
-
// Adiciona os dois últimos
|
|
205
|
-
getPage(total - 1);
|
|
206
|
-
getPage(total);
|
|
207
|
-
}
|
|
208
|
-
return pages;
|
|
209
|
-
}
|
|
210
|
-
/**
|
|
211
|
-
* @description Gets the current active page number.
|
|
212
|
-
* @summary Returns the current page number that is active in the pagination component.
|
|
213
|
-
* This method provides a way to access the current page state from outside the component.
|
|
214
|
-
*
|
|
215
|
-
* @returns {number} The current page number
|
|
216
|
-
* @memberOf PaginationComponent
|
|
217
|
-
*/
|
|
218
|
-
getCurrent() {
|
|
219
|
-
return this.current;
|
|
220
|
-
}
|
|
221
|
-
/**
|
|
222
|
-
* @description Navigates to the next page.
|
|
223
|
-
* @summary Increments the current page number if not at the last page and triggers
|
|
224
|
-
* the click event handler with 'next' direction. This method is typically called
|
|
225
|
-
* when the user clicks on the "next" button in the pagination UI.
|
|
226
|
-
*
|
|
227
|
-
* @returns {void}
|
|
228
|
-
*
|
|
229
|
-
* @mermaid
|
|
230
|
-
* sequenceDiagram
|
|
231
|
-
* participant U as User
|
|
232
|
-
* participant P as PaginationComponent
|
|
233
|
-
*
|
|
234
|
-
* U->>P: Click next button
|
|
235
|
-
* P->>P: next()
|
|
236
|
-
* alt page <= max pages
|
|
237
|
-
* P->>P: Increment current page
|
|
238
|
-
* P->>P: handleClick('next')
|
|
239
|
-
* end
|
|
240
|
-
*
|
|
241
|
-
* @memberOf PaginationComponent
|
|
242
|
-
*/
|
|
243
|
-
next() {
|
|
244
|
-
const page = this.current + 1;
|
|
245
|
-
if (page <= Object.keys(this.pages)?.length || 0) {
|
|
246
|
-
this.current = page;
|
|
247
|
-
this.handleClick('next');
|
|
248
|
-
}
|
|
249
|
-
}
|
|
250
|
-
/**
|
|
251
|
-
* @description Navigates to the previous page.
|
|
252
|
-
* @summary Decrements the current page number if not at the first page and triggers
|
|
253
|
-
* the click event handler with 'previous' direction. This method is typically called
|
|
254
|
-
* when the user clicks on the "previous" button in the pagination UI.
|
|
255
|
-
*
|
|
256
|
-
* @returns {void}
|
|
257
|
-
*
|
|
258
|
-
* @mermaid
|
|
259
|
-
* sequenceDiagram
|
|
260
|
-
* participant U as User
|
|
261
|
-
* participant P as PaginationComponent
|
|
262
|
-
*
|
|
263
|
-
* U->>P: Click previous button
|
|
264
|
-
* P->>P: previous()
|
|
265
|
-
* alt page > 0
|
|
266
|
-
* P->>P: Decrement current page
|
|
267
|
-
* P->>P: handleClick('previous')
|
|
268
|
-
* end
|
|
269
|
-
*
|
|
270
|
-
* @memberOf PaginationComponent
|
|
271
|
-
*/
|
|
272
|
-
previous() {
|
|
273
|
-
const page = this.current - 1;
|
|
274
|
-
if (page > 0) {
|
|
275
|
-
this.current = page;
|
|
276
|
-
this.handleClick('previous');
|
|
277
|
-
}
|
|
278
|
-
}
|
|
279
|
-
/**
|
|
280
|
-
* @description Navigates to a specific page number.
|
|
281
|
-
* @summary Updates the current page to the specified page number and triggers
|
|
282
|
-
* the click event handler with the appropriate direction. This method is typically
|
|
283
|
-
* called when the user clicks directly on a page number in the pagination UI.
|
|
284
|
-
*
|
|
285
|
-
* @param {number | null} page - The page number to navigate to
|
|
286
|
-
* @returns {void}
|
|
287
|
-
*
|
|
288
|
-
* @mermaid
|
|
289
|
-
* sequenceDiagram
|
|
290
|
-
* participant U as User
|
|
291
|
-
* participant P as PaginationComponent
|
|
292
|
-
*
|
|
293
|
-
* U->>P: Click page number
|
|
294
|
-
* P->>P: navigate(page)
|
|
295
|
-
* alt page is not null and different from current
|
|
296
|
-
* P->>P: Determine direction (next/previous)
|
|
297
|
-
* P->>P: handleClick(direction, page)
|
|
298
|
-
* end
|
|
299
|
-
*
|
|
300
|
-
* @memberOf PaginationComponent
|
|
301
|
-
*/
|
|
302
|
-
navigate(page) {
|
|
303
|
-
if (page !== null && this.current !== page)
|
|
304
|
-
this.handleClick(page > this.current ? 'next' : 'previous', page);
|
|
305
|
-
}
|
|
306
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: PaginationComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
307
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.13", type: PaginationComponent, isStandalone: true, selector: "ngx-decaf-pagination", inputs: { totalPages: "totalPages", current: "current" }, outputs: { clickEvent: "clickEvent" }, usesInheritance: true, ngImport: i0, template: " <div id=\"dcf-paginator-container\" class=\"dcf-flex dcf-flex-center\">\n <div class=\"dcf-width-1-1\">\n <div class=\"dcf-pagination-resume\" [innerHTML]=\"locale + '.resume' | translate: {value0: current, value1: last}\"></div>\n <div #paginationComponent class=\"dcf-pagination aeon-pagination dcf-flex-center\">\n <div\n aria-label=\"previous\"\n tabindex=\"0\"\n (click)=\"previous()\"\n (keydown.enter)=\"previous()\" [ngClass]=\"{'dcf-disabled': current === 1}\">\n <ion-icon name=\"chevron-back-outline\" aria-hidden=\"true\"></ion-icon>\n </div>\n @for(page of pages; track page) {\n <div tabindex=\"0\" (click)=\"navigate(page['index'])\"\n (keydown.enter)=\"navigate(page['index'])\"\n [ngClass]=\"{'dcf-active': current === page['index'], 'dcf-disabled': page['index'] === ndivl}\">\n <span class=\"page-item\">{{ page['text'] }}</span>\n </div>\n }\n <div\n tabindex=\"0\" (click)=\"next()\"\n (keydown.enter)=\"next()\"\n [ngClass]=\"{'dcf-disabled': current === last}\">\n <ion-icon name=\"chevron-forward-outline\" aria-hidden=\"true\"></ion-icon>\n </div>\n </div>\n </div>\n</div>\n", styles: ["#dcf-paginator-container{margin-bottom:1rem}.dcf-pagination{display:flex;flex-wrap:wrap;align-items:center;margin-left:0;padding:0;list-style:none}.dcf-pagination .page-item{display:flex;justify-content:center;align-items:top;color:var(--ion-color-gray-7);font-weight:600;width:36px;line-height:34px;padding:0!important;border-radius:50%;box-sizing:border-box}.dcf-pagination>*{flex:none;padding-left:0;position:relative;margin:0px .15rem}.dcf-pagination>*:not(.disabled){cursor:pointer}.dcf-pagination>*:hover .page-item{color:var(--ion-color-primary)}.dcf-pagination>* .page-item{color:var(--ion-color-gray-7);font-weight:600}.dcf-pagination>*.dcf-active .page-item{background:rgba(var(--ion-color-primary-rgb),.15)}.dcf-pagination>*>*{display:flex;align-items:center;column-gap:.25em;padding:5px 10px;color:var(--ion-color-gray-8);transition:color .1s ease-in-out}.dcf-pagination>*>:hover{color:var(--ion-color-gray-6);text-decoration:none}.dcf-pagination .dcf-disabled>*{opacity:.5;color:var(--ion-color-gray-6)}.dcf-pagination-resume{color:var(--ion-color-gray-8);margin:1rem 0px;text-align:center}\n"], dependencies: [{ kind: "ngmodule", type: ForAngularModule }, { kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "pipe", type: i2.TranslatePipe, name: "translate" }, { kind: "component", type: IonIcon, selector: "ion-icon", inputs: ["color", "flipRtl", "icon", "ios", "lazy", "md", "mode", "name", "sanitize", "size", "src"] }] }); }
|
|
308
|
-
}
|
|
309
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: PaginationComponent, decorators: [{
|
|
310
|
-
type: Component,
|
|
311
|
-
args: [{ selector: 'ngx-decaf-pagination', imports: [
|
|
312
|
-
ForAngularModule,
|
|
313
|
-
IonIcon
|
|
314
|
-
], standalone: true, template: " <div id=\"dcf-paginator-container\" class=\"dcf-flex dcf-flex-center\">\n <div class=\"dcf-width-1-1\">\n <div class=\"dcf-pagination-resume\" [innerHTML]=\"locale + '.resume' | translate: {value0: current, value1: last}\"></div>\n <div #paginationComponent class=\"dcf-pagination aeon-pagination dcf-flex-center\">\n <div\n aria-label=\"previous\"\n tabindex=\"0\"\n (click)=\"previous()\"\n (keydown.enter)=\"previous()\" [ngClass]=\"{'dcf-disabled': current === 1}\">\n <ion-icon name=\"chevron-back-outline\" aria-hidden=\"true\"></ion-icon>\n </div>\n @for(page of pages; track page) {\n <div tabindex=\"0\" (click)=\"navigate(page['index'])\"\n (keydown.enter)=\"navigate(page['index'])\"\n [ngClass]=\"{'dcf-active': current === page['index'], 'dcf-disabled': page['index'] === ndivl}\">\n <span class=\"page-item\">{{ page['text'] }}</span>\n </div>\n }\n <div\n tabindex=\"0\" (click)=\"next()\"\n (keydown.enter)=\"next()\"\n [ngClass]=\"{'dcf-disabled': current === last}\">\n <ion-icon name=\"chevron-forward-outline\" aria-hidden=\"true\"></ion-icon>\n </div>\n </div>\n </div>\n</div>\n", styles: ["#dcf-paginator-container{margin-bottom:1rem}.dcf-pagination{display:flex;flex-wrap:wrap;align-items:center;margin-left:0;padding:0;list-style:none}.dcf-pagination .page-item{display:flex;justify-content:center;align-items:top;color:var(--ion-color-gray-7);font-weight:600;width:36px;line-height:34px;padding:0!important;border-radius:50%;box-sizing:border-box}.dcf-pagination>*{flex:none;padding-left:0;position:relative;margin:0px .15rem}.dcf-pagination>*:not(.disabled){cursor:pointer}.dcf-pagination>*:hover .page-item{color:var(--ion-color-primary)}.dcf-pagination>* .page-item{color:var(--ion-color-gray-7);font-weight:600}.dcf-pagination>*.dcf-active .page-item{background:rgba(var(--ion-color-primary-rgb),.15)}.dcf-pagination>*>*{display:flex;align-items:center;column-gap:.25em;padding:5px 10px;color:var(--ion-color-gray-8);transition:color .1s ease-in-out}.dcf-pagination>*>:hover{color:var(--ion-color-gray-6);text-decoration:none}.dcf-pagination .dcf-disabled>*{opacity:.5;color:var(--ion-color-gray-6)}.dcf-pagination-resume{color:var(--ion-color-gray-8);margin:1rem 0px;text-align:center}\n"] }]
|
|
315
|
-
}], ctorParameters: () => [], propDecorators: { totalPages: [{
|
|
316
|
-
type: Input,
|
|
317
|
-
args: [{ required: true }]
|
|
318
|
-
}], current: [{
|
|
319
|
-
type: Input
|
|
320
|
-
}], clickEvent: [{
|
|
321
|
-
type: Output
|
|
322
|
-
}] } });
|
|
323
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFnaW5hdGlvbi5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvbGliL2NvbXBvbmVudHMvcGFnaW5hdGlvbi9wYWdpbmF0aW9uLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3NyYy9saWIvY29tcG9uZW50cy9wYWdpbmF0aW9uL3BhZ2luYXRpb24uY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFVLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMvRSxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDcEQsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLFVBQVUsQ0FBQztBQUNwQyxPQUFPLEVBQUUsa0JBQWtCLEVBQUUscUJBQXFCLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUMzRSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUM5RCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUNuRSxPQUFPLEVBQUUsY0FBYyxFQUE2QixNQUFNLGdCQUFnQixDQUFDOzs7O0FBRzNFOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBd0NHO0FBWUgsTUFBTSxPQUFPLG1CQUFvQixTQUFRLGdCQUFnQjtJQW9FdkQ7Ozs7T0FJRztJQUNIO1FBQ0UsS0FBSyxDQUFDLHFCQUFxQixDQUFDLENBQUM7UUF4RS9COzs7Ozs7OztXQVFHO1FBQ00saUJBQVksR0FBb0IsSUFBSSxDQUFDO1FBYzlDOzs7Ozs7OztXQVFHO1FBRUgsWUFBTyxHQUFHLENBQUMsQ0FBQztRQXFCWjs7Ozs7Ozs7V0FRRztRQUVILGVBQVUsR0FBd0MsSUFBSSxZQUFZLEVBQXlCLENBQUM7UUFTekYsUUFBUSxDQUFDLEVBQUMsa0JBQWtCLEVB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LEtBQUs7dUJBQUMsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFO2dCQWF6QixPQUFPO3NCQUROLEtBQUs7Z0JBZ0NOLFVBQVU7c0JBRFQsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgRXZlbnRFbWl0dGVyLCBJbnB1dCwgT25Jbml0LCBPdXRwdXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IElvbkljb24gfSBmcm9tICdAaW9uaWMvYW5ndWxhci9zdGFuZGFsb25lJztcbmltcG9ydCB7IGFkZEljb25zIH0gZnJvbSAnaW9uaWNvbnMnO1xuaW1wb3J0IHsgY2hldnJvbkJhY2tPdXRsaW5lLCBjaGV2cm9uRm9yd2FyZE91dGxpbmUgfSBmcm9tICdpb25pY29ucy9pY29ucyc7XG5pbXBvcnQgeyBGb3JBbmd1bGFyTW9kdWxlIH0gZnJvbSAnc3JjL2xpYi9mb3ItYW5ndWxhci5tb2R1bGUnO1xuaW1wb3J0IHsgTmd4QmFzZUNvbXBvbmVudCB9IGZyb20gJ3NyYy9saWIvZW5naW5lL05neEJhc2VDb21wb25lbnQnO1xuaW1wb3J0IHsgRXZlbnRDb25zdGFudHMsIEtleVZhbHVlLCBTdHJpbmdPckJvb2xlYW4gfSBmcm9tICdzcmMvbGliL2VuZ2luZSc7XG5pbXBvcnQgeyBQYWdpbmF0aW9uQ3VzdG9tRXZlbnQgfSBmcm9tICcuL2NvbnN0YW50cyc7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIEEgcGFnaW5hdGlvbiBjb21wb25lbnQgZm9yIG5hdmlnYXRpbmcgdGhyb3VnaCBtdWx0aXBsZSBwYWdlcyBvZiBjb250ZW50LlxuICogQHN1bW1hcnkgVGhpcyBjb21wb25lbnQgcHJvdmlkZXMgYSB1c2VyIGludGVyZmFjZSBmb3IgcGFnaW5hdGVkIGNvbnRlbnQgbmF2aWdhdGlvbixcbiAqIGRpc3BsYXlpbmcgcGFnZSBudW1iZXJzIGFuZCBuYXZpZ2F0aW9uIGNvbnRyb2xzLiBJdCBzdXBwb3J0cyBjdXN0b21pemFibGUgcGFnZSBjb3VudHMsXG4gKiBjdXJyZW50IHBhZ2UgdHJhY2tpbmcsIGFuZCBlbWl0cyBldmVudHMgd2hlbiB1c2VycyBuYXZpZ2F0ZSBiZXR3ZWVuIHBhZ2VzLlxuICpcbiAqIFRoZSBjb21wb25lbnQgaW50ZWxsaWdlbnRseSBoYW5kbGVzIGxhcmdlIG51bWJlcnMgb2YgcGFnZXMgYnkgc2hvd2luZyBhIHN1YnNldCBvZiBwYWdlXG4gKiBudW1iZXJzIHdpdGggZWxsaXBzZXMgdG8gaW5kaWNhdGUgc2tpcHBlZCBwYWdlcywgZW5zdXJpbmcgdGhlIFVJIHJlbWFpbnMgY2xlYW4gYW5kIHVzYWJsZVxuICogZXZlbiB3aXRoIG1hbnkgcGFnZXMuXG4gKlxuICogQG1lcm1haWRcbiAqIHNlcXVlbmNlRGlhZ3JhbVxuICogICBwYXJ0aWNpcGFudCBVIGFzIFVzZXJcbiAqICAgcGFydGljaXBhbnQgUCBhcyBQYWdpbmF0aW9uQ29tcG9uZW50XG4gKiAgIHBhcnRpY2lwYW50IEUgYXMgRXh0ZXJuYWwgQ29tcG9uZW50XG4gKlxuICogICBVLT4+UDogQ2xpY2sgcGFnZSBudW1iZXJcbiAqICAgUC0+PlA6IG5hdmlnYXRlKHBhZ2UpXG4gKiAgIFAtPj5QOiBoYW5kbGVDbGljayhkaXJlY3Rpb24sIHBhZ2UpXG4gKiAgIFAtPj5FOiBFbWl0IGNsaWNrRXZlbnQgd2l0aCBQYWdpbmF0aW9uQ3VzdG9tRXZlbnRcbiAqXG4gKiAgIFUtPj5QOiBDbGljayBuZXh0IGJ1dHRvblxuICogICBQLT4+UDogbmV4dCgpXG4gKiAgIFAtPj5QOiBoYW5kbGVDbGljaygnbmV4dCcpXG4gKiAgIFAtPj5FOiBFbWl0IGNsaWNrRXZlbnQgd2l0aCBQYWdpbmF0aW9uQ3VzdG9tRXZlbnRcbiAqXG4gKiAgIFUtPj5QOiBDbGljayBwcmV2aW91cyBidXR0b25cbiAqICAgUC0+PlA6IHByZXZpb3VzKClcbiAqICAgUC0+PlA6IGhhbmRsZUNsaWNrKCdwcmV2aW91cycpXG4gKiAgIFAtPj5FOiBFbWl0IGNsaWNrRXZlbnQgd2l0aCBQYWdpbmF0aW9uQ3VzdG9tRXZlbnRcbiAqXG4gKiBAZXhhbXBsZVxuICogPG5neC1kZWNhZi1wYWdpbmF0aW9uXG4gKiAgIFtwYWdlc109XCIxMFwiXG4gKiAgIFtjdXJyZW50XT1cIjNcIlxuICogICAoY2xpY2tFdmVudCk9XCJoYW5kbGVQYWdlQ2hhbmdlKCRldmVudClcIj5cbiAqIDwvbmd4LWRlY2FmLXBhZ2luYXRpb24+XG4gKlxuICogQGV4dGVuZHMge05neEJhc2VDb21wb25lbnR9XG4gKiBAaW1wbGVtZW50cyB7T25Jbml0fVxuICovXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICduZ3gtZGVjYWYtcGFnaW5hdGlvbicsXG4gIHRlbXBsYXRlVXJsOiAnLi9wYWdpbmF0aW9uLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vcGFnaW5hdGlvbi5jb21wb25lbnQuc2NzcyddLFxuICBpbXBvcnRzOiBbXG4gICAgRm9yQW5ndWxhck1vZHVsZSxcbiAgICBJb25JY29uXG4gIF0sXG4gIHN0YW5kYWxvbmU6IHRydWUsXG5cbn0pXG5leHBvcnQgY2xhc3MgUGFnaW5hdGlvbkNvbXBvbmVudCBleHRlbmRzIE5neEJhc2VDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ29udHJvbHMgd2hldGhlciB0aGUgY29tcG9uZW50IHVzZXMgdHJhbnNsYXRpb24gc2VydmljZXMuXG4gICAqIEBzdW1tYXJ5IFdoZW4gc2V0IHRvIHRydWUsIHRoZSBjb21wb25lbnQgd2lsbCBhdHRlbXB0IHRvIHVzZSB0cmFuc2xhdGlvbiBzZXJ2aWNlc1xuICAgKiBmb3IgYW55IHRleHQgY29udGVudC4gVGhpcyBhbGxvd3MgZm9yIGludGVybmF0aW9uYWxpemF0aW9uIG9mIHRoZSBwYWdpbmF0aW9uIGNvbXBvbmVudC5cbiAgICpcbiAgICogQHR5cGUge1N0cmluZ09yQm9vbGVhbn1cbiAgICogQGRlZmF1bHQgdHJ1ZVxuICAgKiBAbWVtYmVyT2YgUGFnaW5hdGlvbkNvbXBvbmVudFxuICAgKi9cbiAgb3ZlcnJpZGUgdHJhbnNsYXRhYmxlOiBTdHJpbmdPckJvb2xlYW4gPSB0cnVlO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gVGhlIHRvdGFsIG51bWJlciBvZiBwYWdlcyB0byBkaXNwbGF5IGluIHRoZSBwYWdpbmF0aW9uIGNvbXBvbmVudC5cbiAgICogQHN1bW1hcnkgU3BlY2lmaWVzIHRoZSB0b3RhbCBudW1iZXIgb2YgcGFnZXMgYXZhaWxhYmxlIGZvciBuYXZpZ2F0aW9uLiBUaGlzIGlzIGEgcmVxdWlyZWRcbiAgICogaW5wdXQgdGhhdCBkZXRlcm1pbmVzIGhvdyBtYW55IHBhZ2UgbnVtYmVycyB3aWxsIGJlIGdlbmVyYXRlZCBhbmQgZGlzcGxheWVkLlxuICAgKlxuICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgKiBAcmVxdWlyZWRcbiAgICogQG1lbWJlck9mIFBhZ2luYXRpb25Db21wb25lbnRcbiAgICovXG4gIEBJbnB1dCh7IHJlcXVpcmVkOiB0cnVlIH0pXG4gIHRvdGFsUGFnZXMhOiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBUaGUgY3VycmVudGx5IGFjdGl2ZSBwYWdlIG51bWJlci5cbiAgICogQHN1bW1hcnkgU3BlY2lmaWVzIHdoaWNoIHBhZ2UgaXMgY3VycmVudGx5IGFjdGl2ZSBvciBzZWxlY3RlZC4gVGhpcyB2YWx1ZSBpcyB1c2VkXG4gICAqIHRvIGhpZ2hsaWdodCB0aGUgY3VycmVudCBwYWdlIGluIHRoZSBVSSBhbmQgYXMgYSByZWZlcmVuY2UgcG9pbnQgZm9yIG5hdmlnYXRpb24uXG4gICAqXG4gICAqIEB0eXBlIHtudW1iZXJ9XG4gICAqIEBkZWZhdWx0IDFcbiAgICogQG1lbWJlck9mIFBhZ2luYXRpb25Db21wb25lbnRcbiAgICovXG4gIEBJbnB1dCgpXG4gIGN1cnJlbnQgPSAxO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQXJyYXkgb2YgcGFnZSBvYmplY3RzIGZvciByZW5kZXJpbmcgaW4gdGhlIHRlbXBsYXRlLlxuICAgKiBAc3VtbWFyeSBDb250YWlucyB0aGUgcHJvY2Vzc2VkIHBhZ2UgZGF0YSB1c2VkIGZvciByZW5kZXJpbmcgdGhlIHBhZ2luYXRpb24gVUkuXG4gICAqIEVhY2ggb2JqZWN0IGluY2x1ZGVzIGFuIGluZGV4IChwYWdlIG51bWJlcikgYW5kIHRleHQgcmVwcmVzZW50YXRpb24uXG4gICAqXG4gICAqIEB0eXBlIHtLZXlWYWx1ZVtdfVxuICAgKiBAbWVtYmVyT2YgUGFnaW5hdGlvbkNvbXBvbmVudFxuICAgKi9cbiAgcGFnZXMhOiBLZXlWYWx1ZVtdO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gVGhlIGxhc3QgcGFnZSBudW1iZXIgaW4gdGhlIHBhZ2luYXRpb24uXG4gICAqIEBzdW1tYXJ5IFN0b3JlcyB0aGUgbnVtYmVyIG9mIHRoZSBsYXN0IHBhZ2UgZm9yIGJvdW5kYXJ5IGNoZWNraW5nIGR1cmluZyBuYXZpZ2F0aW9uLlxuICAgKlxuICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgKiBAbWVtYmVyT2YgUGFnaW5hdGlvbkNvbXBvbmVudFxuICAgKi9cbiAgbGFzdCE6IG51bWJlcjtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEV2ZW50IGVtaXR0ZXIgZm9yIHBhZ2luYXRpb24gbmF2aWdhdGlvbiBldmVudHMuXG4gICAqIEBzdW1tYXJ5IEVtaXRzIGEgY3VzdG9tIGV2ZW50IHdoZW4gdXNlcnMgbmF2aWdhdGUgYmV0d2VlbiBwYWdlcywgZWl0aGVyIGJ5IGNsaWNraW5nXG4gICAqIG9uIHBhZ2UgbnVtYmVycyBvciB1c2luZyB0aGUgbmV4dC9wcmV2aW91cyBidXR0b25zLiBUaGUgZXZlbnQgY29udGFpbnMgaW5mb3JtYXRpb25cbiAgICogYWJvdXQgdGhlIG5hdmlnYXRpb24gZGlyZWN0aW9uIGFuZCB0aGUgdGFyZ2V0IHBhZ2UgbnVtYmVyLlxuICAgKlxuICAgKiBAdHlwZSB7RXZlbnRFbWl0dGVyPFBhZ2luYXRpb25DdXN0b21FdmVudD59XG4gICAqIEBtZW1iZXJPZiBQYWdpbmF0aW9uQ29tcG9uZW50XG4gICAqL1xuICBAT3V0cHV0KClcbiAgY2xpY2tFdmVudDogRXZlbnRFbWl0dGVyPFBhZ2luYXRpb25DdXN0b21FdmVudD4gPSBuZXcgRXZlbnRFbWl0dGVyPFBhZ2luYXRpb25DdXN0b21FdmVudD4oKTtcblxuICAvKipcbiAgICogQGNvbnN0cnVjdG9yXG4gICAqIEBkZXNjcmlwdGlvbiBJbml0aWFsaXplcyBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgUGFnaW5hdGlvbkNvbXBvbmVudC5cbiAgICogQ2FsbHMgdGhlIHBhcmVudCBjb25zdHJ1Y3RvciB3aXRoIHRoZSBjb21wb25lbnQgbmFtZSBmb3IgZ2VuZXJhdGUgYmFzZSBsb2NhbGUgc3RyaW5nLlxuICAgKi9cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoXCJQYWdpbmF0aW9uQ29tcG9uZW50XCIpO1xuICAgICBhZGRJY29ucyh7Y2hldnJvbkJhY2tPdXRsaW5lLCBjaGV2cm9uRm9yd2FyZE91dGxpbmV9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gSW5pdGlhbGl6ZXMgdGhlIGNvbXBvbmVudCBhZnRlciBBbmd1bGFyIHNldHMgdGhlIGlucHV0IHByb3BlcnRpZXMuXG4gICAqIEBzdW1tYXJ5IFNldHMgdXAgdGhlIGNvbXBvbmVudCBieSBpbml0aWFsaXppbmcgdGhlIGxvY2FsZSBzZXR0aW5ncyBiYXNlZCBvbiB0aGVcbiAgICogdHJhbnNsYXRhYmxlIHByb3BlcnR5LCBnZW5lcmF0aW5nIHRoZSBwYWdlIG51bWJlcnMgYmFzZWQgb24gdGhlIHRvdGFsIHBhZ2VzIGFuZFxuICAgKiBjdXJyZW50IHBhZ2UsIGFuZCBzdG9yaW5nIHRoZSBsYXN0IHBhZ2UgbnVtYmVyIGZvciBib3VuZGFyeSBjaGVja2luZy5cbiAgICpcbiAgICogQG1lcm1haWRcbiAgICogc2VxdWVuY2VEaWFncmFtXG4gICAqICAgcGFydGljaXBhbnQgQSBhcyBBbmd1bGFyIExpZmVjeWNsZVxuICAgKiAgIHBhcnRpY2lwYW50IFAgYXMgUGFnaW5hdGlvbkNvbXBvbmVudFxuICAgKlxuICAgKiAgIEEtPj5QOiBuZ09uSW5pdCgpXG4gICAqICAgUC0+PlA6IGdldExvY2FsZSh0cmFuc2xhdGFibGUpXG4gICAqICAgUC0+PlA6IFNldCBsb2NhbGVcbiAgICogICBQLT4+UDogZ2V0UGFnZXMoZGF0YSwgY3VycmVudClcbiAgICogICBQLT4+UDogU2V0IHBhZ2VzIGFycmF5XG4gICAqICAgUC0+PlA6IFNldCBsYXN0IHBhZ2UgbnVtYmVyXG4gICAqXG4gICAqIEByZXR1cm5zIHt2b2lkfVxuICAgKiBAbWVtYmVyT2YgUGFnaW5hdGlvbkNvbXBvbmVudFxuICAgKi9cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgdGhpcy5sb2NhbGUgPSB0aGlzLmdldExvY2FsZSh0aGlzLnRyYW5zbGF0YWJsZSk7XG4gICAgdGhpcy5wYWdlcyA9IHRoaXMuZ2V0UGFnZXModGhpcy50b3RhbFBhZ2VzLCB0aGlzLmN1cnJlbnQpIGFzIEtleVZhbHVlW107XG4gICAgdGhpcy5sYXN0ID0gdGhpcy50b3RhbFBhZ2VzO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBIYW5kbGVzIGNsaWNrIGV2ZW50cyBvbiBwYWdpbmF0aW9uIGNvbnRyb2xzLlxuICAgKiBAc3VtbWFyeSBQcm9jZXNzZXMgdXNlciBpbnRlcmFjdGlvbnMgd2l0aCB0aGUgcGFnaW5hdGlvbiBjb21wb25lbnQsIHVwZGF0aW5nIHRoZVxuICAgKiBjdXJyZW50IHBhZ2UgaWYgc3BlY2lmaWVkIGFuZCBlbWl0dGluZyBhbiBldmVudCB3aXRoIG5hdmlnYXRpb24gZGV0YWlscy4gVGhpcyBtZXRob2RcbiAgICogaXMgY2FsbGVkIHdoZW4gdXNlcnMgY2xpY2sgb24gcGFnZSBudW1iZXJzIG9yIG5hdmlnYXRpb24gYnV0dG9ucy5cbiAgICpcbiAgICogQHBhcmFtIHsoJ25leHQnIHwgJ3ByZXZpb3VzJyl9IGRpcmVjdGlvbiAtIFRoZSBkaXJlY3Rpb24gb2YgbmF2aWdhdGlvblxuICAgKiBAcGFyYW0ge251bWJlcn0gW3BhZ2VdIC0gT3B0aW9uYWwgcGFnZSBudW1iZXIgdG8gbmF2aWdhdGUgdG8gZGlyZWN0bHlcbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqXG4gICAqIEBtZXJtYWlkXG4gICAqIHNlcXVlbmNlRGlhZ3JhbVxuICAgKiAgIHBhcnRpY2lwYW50IFUgYXMgVXNlclxuICAgKiAgIHBhcnRpY2lwYW50IFAgYXMgUGFnaW5hdGlvbkNvbXBvbmVudFxuICAgKiAgIHBhcnRpY2lwYW50IEUgYXMgRXh0ZXJuYWwgQ29tcG9uZW50XG4gICAqXG4gICAqICAgVS0+PlA6IENsaWNrIHBhZ2luYXRpb24gY29udHJvbFxuICAgKiAgIFAtPj5QOiBoYW5kbGVDbGljayhkaXJlY3Rpb24sIHBhZ2U/KVxuICAgKiAgIGFsdCBwYWdlIGlzIHByb3ZpZGVkXG4gICAqICAgICBQLT4+UDogVXBkYXRlIGN1cnJlbnQgcGFnZVxuICAgKiAgIGVuZFxuICAgKiAgIFAtPj5FOiBFbWl0IGNsaWNrRXZlbnQgd2l0aCBkaXJlY3Rpb24gYW5kIHBhZ2VcbiAgICpcbiAgICogQG1lbWJlck9mIFBhZ2luYXRpb25Db21wb25lbnRcbiAgICovXG4gIGhhbmRsZUNsaWNrKGRpcmVjdGlvbjogJ25leHQnIHwgJ3ByZXZpb3VzJywgcGFnZT86IG51bWJlcik6IHZvaWQge1xuICAgIGlmKHBhZ2UpXG4gICAgICB0aGlzLmN1cnJlbnQgPSBwYWdlO1xuICAgIHRoaXMuY2xpY2tFdmVudC5lbWl0KHtcbiAgICAgIG5hbWU6IEV2ZW50Q29uc3RhbnRzLkNMSUNLX0VWRU5ULFxuICAgICAgZGF0YToge1xuICAgICAgICBkaXJlY3Rpb24sXG4gICAgICAgIHBhZ2U6IHRoaXMuY3VycmVudFxuICAgICAgfSxcbiAgICAgIGNvbXBvbmVudDogdGhpcy5jb21wb25lbnROYW1lXG4gICAgfSBhcyBQYWdpbmF0aW9uQ3VzdG9tRXZlbnQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBHZW5lcmF0ZXMgdGhlIGFycmF5IG9mIHBhZ2Ugb2JqZWN0cyBmb3IgZGlzcGxheS5cbiAgICogQHN1bW1hcnkgQ3JlYXRlcyBhbiBhcnJheSBvZiBwYWdlIG9iamVjdHMgYmFzZWQgb24gdGhlIHRvdGFsIG51bWJlciBvZiBwYWdlcyBhbmRcbiAgICogdGhlIGN1cnJlbnQgcGFnZS4gRm9yIHNtYWxsIHBhZ2UgY291bnRzICjiiaQ1KSwgYWxsIHBhZ2VzIGFyZSBzaG93bi4gRm9yIGxhcmdlciBwYWdlXG4gICAqIGNvdW50cywgYSBzdWJzZXQgaXMgc2hvd24gd2l0aCBlbGxpcHNlcyB0byBpbmRpY2F0ZSBza2lwcGVkIHBhZ2VzLiBUaGlzIGVuc3VyZXNcbiAgICogdGhlIHBhZ2luYXRpb24gVUkgcmVtYWlucyBjbGVhbiBhbmQgdXNhYmxlIGV2ZW4gd2l0aCBtYW55IHBhZ2VzLlxuICAgKlxuICAgKiBAcGFyYW0ge251bWJlcn0gdG90YWwgLSBUaGUgdG90YWwgbnVtYmVyIG9mIHBhZ2VzXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbY3VycmVudF0gLSBUaGUgY3VycmVudCBhY3RpdmUgcGFnZSAoZGVmYXVsdHMgdG8gdGhpcy5jdXJyZW50KVxuICAgKiBAcmV0dXJucyB7S2V5VmFsdWVbXX0gQXJyYXkgb2YgcGFnZSBvYmplY3RzIHdpdGggaW5kZXggYW5kIHRleHQgcHJvcGVydGllc1xuICAgKlxuICAgKiBAbWVybWFpZFxuICAgKiBmbG93Y2hhcnQgVERcbiAgICogICBBW1N0YXJ0XSAtLT4gQnt0b3RhbCA8PSA1P31cbiAgICogICBCIC0tPnxZZXN8IENbU2hvdyBhbGwgcGFnZXNdXG4gICAqICAgQiAtLT58Tm98IERbU2hvdyBmaXJzdCBwYWdlXVxuICAgKiAgIEQgLS0+IEVbU2hvdyBsYXN0IHBhZ2VzXVxuICAgKiAgIEUgLS0+IEZbQWRkIGVsbGlwc2VzIGZvciBza2lwcGVkIHBhZ2VzXVxuICAgKiAgIEMgLS0+IEdbUmV0dXJuIHBhZ2VzIGFycmF5XVxuICAgKiAgIEYgLS0+IEdcbiAgICpcbiAgICogQG1lbWJlck9mIFBhZ2luYXRpb25Db21wb25lbnRcbiAgICovXG4gIGdldFBhZ2VzKHRvdGFsOiBudW1iZXIsIGN1cnJlbnQ/OiBudW1iZXIpOiBLZXlWYWx1ZVtdIHtcbiAgICBpZiAoIWN1cnJlbnQpIGN1cnJlbnQgPSB0aGlzLmN1cnJlbnQ7XG5cbiAgICBjb25zdCBwYWdlczogS2V5VmFsdWVbXSA9IFtdO1xuXG4gICAgZnVuY3Rpb24gZ2V0UGFnZShpbmRleDogbnVtYmVyIHwgbnVsbCwgdGV4dCA9ICcnKSB7XG4gICAgICAgIGlmIChwYWdlcy5zb21lKGl0ZW0gPT4gaXRlbVsnaW5kZXgnXSA9PT0gaW5kZXgpKSByZXR1cm47XG4gICAgICAgIHBhZ2VzLnB1c2goeyBpbmRleCwgdGV4dDogaW5kZXggIT0gbnVsbCA/IGluZGV4LnRvU3RyaW5nKCkucGFkU3RhcnQoMiwgJzAnKSA6IHRleHQgfSk7XG4gICAgfVxuXG4gICAgaWYgKHRvdGFsIDw9IDUpIHtcbiAgICAgICAgZm9yIChsZXQgaSA9IDE7IGkgPD0gdG90YWw7IGkrKykgZ2V0UGFnZShpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gQWRpY2lvbmEgb3MgZG9pcyBwcmltZWlyb3NcbiAgICAgIGdldFBhZ2UoMSk7XG4gICAgICBnZXRQYWdlKDIpO1xuXG4gICAgICAvLyBBZGljaW9uYSBcIi4uLlwiIGVudHJlIG9zIGJsb2Nvc1xuICAgICAgaWYgKGN1cnJlbnQgJiYgY3VycmVudCA+IDMpIGdldFBhZ2UobnVsbCwgJy4uLicpO1xuXG4gICAgICAvLyBBZGljaW9uYSBhIHDDoWdpbmEgYXR1YWwgKHNlIGVzdGl2ZXIgbm8gbWVpbylcbiAgICAgIGlmIChjdXJyZW50ICYmIGN1cnJlbnQgPiAyICYmIGN1cnJlbnQgPCB0b3RhbCAtIDEpIGdldFBhZ2UoY3VycmVudCk7XG5cbiAgICAgIC8vIEFkaWNpb25hIFwiLi4uXCIgZW50cmUgb3MgYmxvY29zXG4gICAgICBpZiAoY3VycmVudCAmJiBjdXJyZW50IDwgdG90YWwgLSAyKSBnZXRQYWdlKG51bGwsICcuLi4nKTtcblxuICAgICAgLy8gQWRpY2lvbmEgb3MgZG9pcyDDumx0aW1vc1xuICAgICAgZ2V0UGFnZSh0b3RhbCAtIDEpO1xuICAgICAgZ2V0UGFnZSh0b3RhbCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHBhZ2VzO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBHZXRzIHRoZSBjdXJyZW50IGFjdGl2ZSBwYWdlIG51bWJlci5cbiAgICogQHN1bW1hcnkgUmV0dXJucyB0aGUgY3VycmVudCBwYWdlIG51bWJlciB0aGF0IGlzIGFjdGl2ZSBpbiB0aGUgcGFnaW5hdGlvbiBjb21wb25lbnQuXG4gICAqIFRoaXMgbWV0aG9kIHByb3ZpZGVzIGEgd2F5IHRvIGFjY2VzcyB0aGUgY3VycmVudCBwYWdlIHN0YXRlIGZyb20gb3V0c2lkZSB0aGUgY29tcG9uZW50LlxuICAgKlxuICAgKiBAcmV0dXJucyB7bnVtYmVyfSBUaGUgY3VycmVudCBwYWdlIG51bWJlclxuICAgKiBAbWVtYmVyT2YgUGFnaW5hdGlvbkNvbXBvbmVudFxuICAgKi9cbiAgZ2V0Q3VycmVudCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLmN1cnJlbnQ7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIE5hdmlnYXRlcyB0byB0aGUgbmV4dCBwYWdlLlxuICAgKiBAc3VtbWFyeSBJbmNyZW1lbnRzIHRoZSBjdXJyZW50IHBhZ2UgbnVtYmVyIGlmIG5vdCBhdCB0aGUgbGFzdCBwYWdlIGFuZCB0cmlnZ2Vyc1xuICAgKiB0aGUgY2xpY2sgZXZlbnQgaGFuZGxlciB3aXRoICduZXh0JyBkaXJlY3Rpb24uIFRoaXMgbWV0aG9kIGlzIHR5cGljYWxseSBjYWxsZWRcbiAgICogd2hlbiB0aGUgdXNlciBjbGlja3Mgb24gdGhlIFwibmV4dFwiIGJ1dHRvbiBpbiB0aGUgcGFnaW5hdGlvbiBVSS5cbiAgICpcbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqXG4gICAqIEBtZXJtYWlkXG4gICAqIHNlcXVlbmNlRGlhZ3JhbVxuICAgKiAgIHBhcnRpY2lwYW50IFUgYXMgVXNlclxuICAgKiAgIHBhcnRpY2lwYW50IFAgYXMgUGFnaW5hdGlvbkNvbXBvbmVudFxuICAgKlxuICAgKiAgIFUtPj5QOiBDbGljayBuZXh0IGJ1dHRvblxuICAgKiAgIFAtPj5QOiBuZXh0KClcbiAgICogICBhbHQgcGFnZSA8PSBtYXggcGFnZXNcbiAgICogICAgIFAtPj5QOiBJbmNyZW1lbnQgY3VycmVudCBwYWdlXG4gICAqICAgICBQLT4+UDogaGFuZGxlQ2xpY2soJ25leHQnKVxuICAgKiAgIGVuZFxuICAgKlxuICAgKiBAbWVtYmVyT2YgUGFnaW5hdGlvbkNvbXBvbmVudFxuICAgKi9cbiAgbmV4dCgpOiB2b2lkIHtcbiAgICBjb25zdCBwYWdlID0gdGhpcy5jdXJyZW50ICsgMTtcbiAgICBpZihwYWdlIDw9IE9iamVjdC5rZXlzKHRoaXMucGFnZXMpPy5sZW5ndGggfHwgMCkge1xuICAgICAgdGhpcy5jdXJyZW50ID0gcGFnZTtcbiAgICAgIHRoaXMuaGFuZGxlQ2xpY2soJ25leHQnKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIE5hdmlnYXRlcyB0byB0aGUgcHJldmlvdXMgcGFnZS5cbiAgICogQHN1bW1hcnkgRGVjcmVtZW50cyB0aGUgY3VycmVudCBwYWdlIG51bWJlciBpZiBub3QgYXQgdGhlIGZpcnN0IHBhZ2UgYW5kIHRyaWdnZXJzXG4gICAqIHRoZSBjbGljayBldmVudCBoYW5kbGVyIHdpdGggJ3ByZXZpb3VzJyBkaXJlY3Rpb24uIFRoaXMgbWV0aG9kIGlzIHR5cGljYWxseSBjYWxsZWRcbiAgICogd2hlbiB0aGUgdXNlciBjbGlja3Mgb24gdGhlIFwicHJldmlvdXNcIiBidXR0b24gaW4gdGhlIHBhZ2luYXRpb24gVUkuXG4gICAqXG4gICAqIEByZXR1cm5zIHt2b2lkfVxuICAgKlxuICAgKiBAbWVybWFpZFxuICAgKiBzZXF1ZW5jZURpYWdyYW1cbiAgICogICBwYXJ0aWNpcGFudCBVIGFzIFVzZXJcbiAgICogICBwYXJ0aWNpcGFudCBQIGFzIFBhZ2luYXRpb25Db21wb25lbnRcbiAgICpcbiAgICogICBVLT4+UDogQ2xpY2sgcHJldmlvdXMgYnV0dG9uXG4gICAqICAgUC0+PlA6IHByZXZpb3VzKClcbiAgICogICBhbHQgcGFnZSA+IDBcbiAgICogICAgIFAtPj5QOiBEZWNyZW1lbnQgY3VycmVudCBwYWdlXG4gICAqICAgICBQLT4+UDogaGFuZGxlQ2xpY2soJ3ByZXZpb3VzJylcbiAgICogICBlbmRcbiAgICpcbiAgICogQG1lbWJlck9mIFBhZ2luYXRpb25Db21wb25lbnRcbiAgICovXG4gIHByZXZpb3VzKCk6IHZvaWQge1xuICAgIGNvbnN0IHBhZ2UgPSB0aGlzLmN1cnJlbnQgLSAxO1xuICAgIGlmKHBhZ2UgPiAwKSB7XG4gICAgICB0aGlzLmN1cnJlbnQgPSBwYWdlO1xuICAgICAgdGhpcy5oYW5kbGVDbGljaygncHJldmlvdXMnKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIE5hdmlnYXRlcyB0byBhIHNwZWNpZmljIHBhZ2UgbnVtYmVyLlxuICAgKiBAc3VtbWFyeSBVcGRhdGVzIHRoZSBjdXJyZW50IHBhZ2UgdG8gdGhlIHNwZWNpZmllZCBwYWdlIG51bWJlciBhbmQgdHJpZ2dlcnNcbiAgICogdGhlIGNsaWNrIGV2ZW50IGhhbmRsZXIgd2l0aCB0aGUgYXBwcm9wcmlhdGUgZGlyZWN0aW9uLiBUaGlzIG1ldGhvZCBpcyB0eXBpY2FsbHlcbiAgICogY2FsbGVkIHdoZW4gdGhlIHVzZXIgY2xpY2tzIGRpcmVjdGx5IG9uIGEgcGFnZSBudW1iZXIgaW4gdGhlIHBhZ2luYXRpb24gVUkuXG4gICAqXG4gICAqIEBwYXJhbSB7bnVtYmVyIHwgbnVsbH0gcGFnZSAtIFRoZSBwYWdlIG51bWJlciB0byBuYXZpZ2F0ZSB0b1xuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICpcbiAgICogQG1lcm1haWRcbiAgICogc2VxdWVuY2VEaWFncmFtXG4gICAqICAgcGFydGljaXBhbnQgVSBhcyBVc2VyXG4gICAqICAgcGFydGljaXBhbnQgUCBhcyBQYWdpbmF0aW9uQ29tcG9uZW50XG4gICAqXG4gICAqICAgVS0+PlA6IENsaWNrIHBhZ2UgbnVtYmVyXG4gICAqICAgUC0+PlA6IG5hdmlnYXRlKHBhZ2UpXG4gICAqICAgYWx0IHBhZ2UgaXMgbm90IG51bGwgYW5kIGRpZmZlcmVudCBmcm9tIGN1cnJlbnRcbiAgICogICAgIFAtPj5QOiBEZXRlcm1pbmUgZGlyZWN0aW9uIChuZXh0L3ByZXZpb3VzKVxuICAgKiAgICAgUC0+PlA6IGhhbmRsZUNsaWNrKGRpcmVjdGlvbiwgcGFnZSlcbiAgICogICBlbmRcbiAgICpcbiAgICogQG1lbWJlck9mIFBhZ2luYXRpb25Db21wb25lbnRcbiAgICovXG4gIG5hdmlnYXRlKHBhZ2U6IG51bWJlciB8IG51bGwpOiB2b2lkIHtcbiAgICBpZihwYWdlICE9PSBudWxsICYmIHRoaXMuY3VycmVudCAhPT0gcGFnZSBhcyBudW1iZXIpXG4gICAgICB0aGlzLmhhbmRsZUNsaWNrKHBhZ2UgPiB0aGlzLmN1cnJlbnQgPyAnbmV4dCcgOiAncHJldmlvdXMnLCBwYWdlKTtcbiAgfVxufVxuIiwiIDxkaXYgaWQ9XCJkY2YtcGFnaW5hdG9yLWNvbnRhaW5lclwiIGNsYXNzPVwiZGNmLWZsZXggZGNmLWZsZXgtY2VudGVyXCI+XG4gIDxkaXYgY2xhc3M9XCJkY2Ytd2lkdGgtMS0xXCI+XG4gICAgPGRpdiBjbGFzcz1cImRjZi1wYWdpbmF0aW9uLXJlc3VtZVwiIFtpbm5lckhUTUxdPVwibG9jYWxlICsgJy5yZXN1bWUnIHwgdHJhbnNsYXRlOiB7dmFsdWUwOiBjdXJyZW50LCB2YWx1ZTE6IGxhc3R9XCI+PC9kaXY+XG4gICAgPGRpdiAjcGFnaW5hdGlvbkNvbXBvbmVudCBjbGFzcz1cImRjZi1wYWdpbmF0aW9uIGFlb24tcGFnaW5hdGlvbiBkY2YtZmxleC1jZW50ZXJcIj5cbiAgICAgIDxkaXZcbiAgICAgICAgYXJpYS1sYWJlbD1cInByZXZpb3VzXCJcbiAgICAgICAgdGFiaW5kZXg9XCIwXCJcbiAgICAgICAgKGNsaWNrKT1cInByZXZpb3VzKClcIlxuICAgICAgICAoa2V5ZG93bi5lbnRlcik9XCJwcmV2aW91cygpXCIgW25nQ2xhc3NdPVwieydkY2YtZGlzYWJsZWQnOiBjdXJyZW50ID09PSAxfVwiPlxuICAgICAgICA8aW9uLWljb24gbmFtZT1cImNoZXZyb24tYmFjay1vdXRsaW5lXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+PC9pb24taWNvbj5cbiAgICAgIDwvZGl2PlxuICAgICAgQGZvcihwYWdlIG9mIHBhZ2VzOyB0cmFjayBwYWdlKSB7XG4gICAgICAgIDxkaXYgdGFiaW5kZXg9XCIwXCIgKGNsaWNrKT1cIm5hdmlnYXRlKHBhZ2VbJ2luZGV4J10pXCJcbiAgICAgICAgICAoa2V5ZG93bi5lbnRlcik9XCJuYXZpZ2F0ZShwYWdlWydpbmRleCddKVwiXG4gICAgICAgICAgW25nQ2xhc3NdPVwieydkY2YtYWN0aXZlJzogY3VycmVudCA9PT0gcGFnZVsnaW5kZXgnXSwgJ2RjZi1kaXNhYmxlZCc6IHBhZ2VbJ2luZGV4J10gPT09IG5kaXZsfVwiPlxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwicGFnZS1pdGVtXCI+e3sgcGFnZVsndGV4dCddIH19PC9zcGFuPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIH1cbiAgICAgIDxkaXZcbiAgICAgICAgdGFiaW5kZXg9XCIwXCIgKGNsaWNrKT1cIm5leHQoKVwiXG4gICAgICAgIChrZXlkb3duLmVudGVyKT1cIm5leHQoKVwiXG4gICAgICAgIFtuZ0NsYXNzXT1cInsnZGNmLWRpc2FibGVkJzogY3VycmVudCA9PT0gbGFzdH1cIj5cbiAgICAgICAgPGlvbi1pY29uIG5hbWU9XCJjaGV2cm9uLWZvcndhcmQtb3V0bGluZVwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvaW9uLWljb24+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG48L2Rpdj5cbiJdfQ==
|