@seniorsistemas/angular-components 19.7.4 → 19.7.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/alert/lib/alert/alert.component.d.ts +8 -1
- package/dynamic-form/dynamic-form/components/lookup/models/lookup-api.model.d.ts +7 -1
- package/dynamic-form/dynamic-form/form-field/configurations/fields/lookup-field.d.ts +1 -1
- package/dynamic-form/public-api.d.ts +1 -1
- package/esm2022/alert/lib/alert/alert.component.mjs +12 -6
- package/esm2022/dynamic-form/dynamic-form/components/lookup/lookup.component.mjs +2 -2
- package/esm2022/dynamic-form/dynamic-form/components/lookup/models/lookup-api.model.mjs +1 -1
- package/esm2022/dynamic-form/dynamic-form/form-field/configurations/fields/lookup-field.mjs +1 -1
- package/esm2022/dynamic-form/public-api.mjs +1 -1
- package/esm2022/panel/lib/panel/panel.component.mjs +3 -3
- package/fesm2022/seniorsistemas-angular-components-alert.mjs +12 -6
- package/fesm2022/seniorsistemas-angular-components-alert.mjs.map +1 -1
- package/fesm2022/seniorsistemas-angular-components-dynamic-form.mjs +1 -1
- package/fesm2022/seniorsistemas-angular-components-dynamic-form.mjs.map +1 -1
- package/fesm2022/seniorsistemas-angular-components-panel.mjs +2 -2
- package/fesm2022/seniorsistemas-angular-components-panel.mjs.map +1 -1
- package/package.json +13 -13
- package/schematics/migrations/migrate-steps-to-stepper/index.d.ts +2 -0
- package/schematics/migrations/migrate-steps-to-stepper/index.js +104 -0
- package/schematics/migrations/migrate-steps-to-stepper/index.js.map +1 -0
- package/schematics/migrations.json +5 -0
- package/schematics/utils/ast-utils.d.ts +13 -0
- package/schematics/utils/ast-utils.js +76 -0
- package/schematics/utils/ast-utils.js.map +1 -1
- package/schematics/migrations/migrate-dynamic-form-v19/index.test.d.ts +0 -1
- package/schematics/migrations/migrate-dynamic-form-v19/index.test.js +0 -888
- package/schematics/migrations/migrate-dynamic-form-v19/index.test.js.map +0 -1
- package/schematics/migrations/migrate-p-datepicker/index.test.d.ts +0 -1
- package/schematics/migrations/migrate-p-datepicker/index.test.js +0 -392
- package/schematics/migrations/migrate-p-datepicker/index.test.js.map +0 -1
- package/schematics/migrations/migrate-p-editor/index.test.d.ts +0 -1
- package/schematics/migrations/migrate-p-editor/index.test.js +0 -393
- package/schematics/migrations/migrate-p-editor/index.test.js.map +0 -1
- package/schematics/migrations/migrate-s-chips-outputs/index.test.d.ts +0 -1
- package/schematics/migrations/migrate-s-chips-outputs/index.test.js +0 -125
- package/schematics/migrations/migrate-s-chips-outputs/index.test.js.map +0 -1
- package/schematics/utils/ast-utils.test.d.ts +0 -1
- package/schematics/utils/ast-utils.test.js +0 -138
- package/schematics/utils/ast-utils.test.js.map +0 -1
- package/schematics/utils/workspace-utils.test.d.ts +0 -1
- package/schematics/utils/workspace-utils.test.js +0 -152
- package/schematics/utils/workspace-utils.test.js.map +0 -1
|
@@ -42,6 +42,13 @@ export declare class AlertComponent {
|
|
|
42
42
|
* @default true
|
|
43
43
|
*/
|
|
44
44
|
closable: boolean;
|
|
45
|
+
/**
|
|
46
|
+
* @description Quando `true`, o conteúdo do alerta é escapado para evitar a execução de HTML ou scripts.
|
|
47
|
+
* Quando `false`, o conteúdo do alerta é renderizado como HTML, permitindo a inclusão de links, negrito, etc.
|
|
48
|
+
*
|
|
49
|
+
* @default true
|
|
50
|
+
*/
|
|
51
|
+
escape: import("@angular/core").InputSignal<boolean>;
|
|
45
52
|
/**
|
|
46
53
|
* @description Emitido quando o usuário fecha o alerta clicando no botão de fechar.
|
|
47
54
|
*/
|
|
@@ -52,5 +59,5 @@ export declare class AlertComponent {
|
|
|
52
59
|
onClose(): void;
|
|
53
60
|
private _isOpen;
|
|
54
61
|
static ɵfac: i0.ɵɵFactoryDeclaration<AlertComponent, never>;
|
|
55
|
-
static ɵcmp: i0.ɵɵComponentDeclaration<AlertComponent, "s-alert", never, { "severity": { "alias": "severity"; "required": false; }; "summary": { "alias": "summary"; "required": true; }; "detail": { "alias": "detail"; "required":
|
|
62
|
+
static ɵcmp: i0.ɵɵComponentDeclaration<AlertComponent, "s-alert", never, { "severity": { "alias": "severity"; "required": false; }; "summary": { "alias": "summary"; "required": true; }; "detail": { "alias": "detail"; "required": false; }; "closable": { "alias": "closable"; "required": false; }; "escape": { "alias": "escape"; "required": false; "isSignal": true; }; }, { "closed": "closed"; }, never, ["*"], true, never>;
|
|
56
63
|
}
|
|
@@ -1,5 +1,11 @@
|
|
|
1
|
-
|
|
1
|
+
import { TableLazyLoadEvent } from 'primeng/table';
|
|
2
|
+
export type SortMeta = {
|
|
3
|
+
field: string;
|
|
4
|
+
order: number;
|
|
5
|
+
};
|
|
6
|
+
export type LookupSearchRequest = TableLazyLoadEvent & {
|
|
2
7
|
filterData: Record<string, any>;
|
|
3
8
|
first: number;
|
|
4
9
|
rows: number;
|
|
10
|
+
multiSortMeta?: SortMeta[] | undefined | null;
|
|
5
11
|
};
|
|
@@ -133,7 +133,7 @@ export interface LookupFieldConfig extends FieldConfig {
|
|
|
133
133
|
* Callback chamado quando o usuário realiza uma pesquisa no diálogo avançado.
|
|
134
134
|
* Deve atualizar o `searchObservable` com os resultados paginados.
|
|
135
135
|
*
|
|
136
|
-
* Estrutura de `LookupSearchRequest`: `{ filterData: Record<string, any>; first: number; rows: number; }`
|
|
136
|
+
* Estrutura de `LookupSearchRequest`: `{ filterData: Record<string, any>; first: number; rows: number; multiSortMeta?: SortMeta[] | undefined | null; }`
|
|
137
137
|
* @typeImport import { LookupSearchRequest } from '@seniorsistemas/angular-components/dynamic-form';
|
|
138
138
|
*/
|
|
139
139
|
onSearchRequest: (event: LookupSearchRequest) => void;
|
|
@@ -4,7 +4,7 @@ export type { SectionConfig } from './dynamic-form/configurations/structure/sect
|
|
|
4
4
|
export { FieldLabelComponent } from './dynamic-form/components/field-label/field-label.component';
|
|
5
5
|
export { LookupComponent } from './dynamic-form/components/lookup/lookup.component';
|
|
6
6
|
export type { LookupAlertConfig } from './dynamic-form/components/lookup/models/lookup-alert-config';
|
|
7
|
-
export type { LookupSearchRequest } from './dynamic-form/components/lookup/models/lookup-api.model';
|
|
7
|
+
export type { LookupSearchRequest, SortMeta } from './dynamic-form/components/lookup/models/lookup-api.model';
|
|
8
8
|
export type { BaseFieldComponentConfig } from './dynamic-form/form-field/fields/base-field-component';
|
|
9
9
|
export { type ExpandedDynamicType } from './dynamic-form/configurations/structure/row';
|
|
10
10
|
export { DynamicFormComponent, dynamicTypeToDynamicStructure } from './dynamic-form/dynamic-form.component';
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { Component, EventEmitter, Input, Output } from '@angular/core';
|
|
2
1
|
import { NgClass } from '@angular/common';
|
|
2
|
+
import { Component, EventEmitter, input, Input, Output } from '@angular/core';
|
|
3
3
|
import * as i0 from "@angular/core";
|
|
4
4
|
/**
|
|
5
5
|
* @description Componente de alerta que exibe mensagens informativas, de sucesso, aviso ou erro.
|
|
@@ -44,6 +44,13 @@ export class AlertComponent {
|
|
|
44
44
|
* @default true
|
|
45
45
|
*/
|
|
46
46
|
closable = true;
|
|
47
|
+
/**
|
|
48
|
+
* @description Quando `true`, o conteúdo do alerta é escapado para evitar a execução de HTML ou scripts.
|
|
49
|
+
* Quando `false`, o conteúdo do alerta é renderizado como HTML, permitindo a inclusão de links, negrito, etc.
|
|
50
|
+
*
|
|
51
|
+
* @default true
|
|
52
|
+
*/
|
|
53
|
+
escape = input(true);
|
|
47
54
|
/**
|
|
48
55
|
* @description Emitido quando o usuário fecha o alerta clicando no botão de fechar.
|
|
49
56
|
*/
|
|
@@ -63,22 +70,21 @@ export class AlertComponent {
|
|
|
63
70
|
}
|
|
64
71
|
_isOpen = true;
|
|
65
72
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: AlertComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
66
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: AlertComponent, isStandalone: true, selector: "s-alert", inputs: { severity: "severity", summary: "summary", detail: "detail", closable: "closable" }, outputs: { closed: "closed" }, ngImport: i0, template: "@if (isOpen) {\n<div\n
|
|
73
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: AlertComponent, isStandalone: true, selector: "s-alert", inputs: { severity: { classPropertyName: "severity", publicName: "severity", isSignal: false, isRequired: false, transformFunction: null }, summary: { classPropertyName: "summary", publicName: "summary", isSignal: false, isRequired: true, transformFunction: null }, detail: { classPropertyName: "detail", publicName: "detail", isSignal: false, isRequired: false, transformFunction: null }, closable: { classPropertyName: "closable", publicName: "closable", isSignal: false, isRequired: false, transformFunction: null }, escape: { classPropertyName: "escape", publicName: "escape", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { closed: "closed" }, ngImport: i0, template: "@if (isOpen) {\n <div\n class=\"alert m-2 flex items-center justify-between gap-4 rounded-medium border-l-4 px-4 py-3 shadow-[1px_1px_2px_rgba(0,0,0,0.2)]\"\n [ngClass]=\"{\n 'alert--info': severity === 'info',\n 'alert--success': severity === 'success',\n 'alert--warning': severity === 'warning',\n 'alert--error': severity === 'error',\n 'border-primary bg-hippie-blue-50': severity === 'info',\n 'border-criticality-green bg-teal-50': severity === 'success',\n 'border-criticality-yellow bg-buttercup-50': severity === 'warning',\n 'border-criticality-red bg-sunset-orange-50': severity === 'error',\n }\"\n >\n <div class=\"content flex items-center gap-4\">\n <div\n class=\"icon-container inline-flex h-10 w-10 flex-shrink-0 items-center justify-center rounded-[50%]\"\n [ngClass]=\"{\n 'bg-primary': severity === 'info',\n 'bg-criticality-green': severity === 'success',\n 'bg-criticality-yellow': severity === 'warning',\n 'bg-criticality-red': severity === 'error',\n }\"\n >\n <i\n class=\"fas\"\n [ngClass]=\"{\n 'fa-info': severity === 'info',\n 'fa-check': severity === 'success',\n 'fa-exclamation-triangle': severity === 'warning',\n 'fa-times': severity === 'error',\n 'text-grayscale-0': severity !== 'warning',\n 'text-grayscale-90': severity === 'warning',\n }\"\n ></i>\n </div>\n <div class=\"text-container flex flex-col gap-4\">\n <div class=\"text flex flex-col justify-start\">\n @if (summary) {\n <span class=\"summary font-open-sans text-sm font-bold text-grayscale-90\">{{ summary }}</span>\n }\n\n @if (detail) {\n @if (escape()) {\n <span class=\"detail font-open-sans text-sm text-grayscale-90\">\n {{ detail }}\n </span>\n } @else {\n <span\n class=\"detail font-open-sans text-sm text-grayscale-90\"\n [innerHTML]=\"detail\"\n ></span>\n }\n } @else {\n <span class=\"detail font-open-sans text-sm text-grayscale-90\">\n <ng-content />\n </span>\n }\n </div>\n </div>\n </div>\n @if (closable) {\n <button\n class=\"close-option cursor-pointer border-0 bg-transparent p-1 text-base text-grayscale-90\"\n (click)=\"onClose()\"\n >\n <i class=\"fas fa-times\"></i>\n </button>\n }\n </div>\n}\n\n", dependencies: [{ kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }] });
|
|
67
74
|
}
|
|
68
75
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: AlertComponent, decorators: [{
|
|
69
76
|
type: Component,
|
|
70
|
-
args: [{ selector: 's-alert', standalone: true, imports: [NgClass], template: "@if (isOpen) {\n<div\n
|
|
77
|
+
args: [{ selector: 's-alert', standalone: true, imports: [NgClass], template: "@if (isOpen) {\n <div\n class=\"alert m-2 flex items-center justify-between gap-4 rounded-medium border-l-4 px-4 py-3 shadow-[1px_1px_2px_rgba(0,0,0,0.2)]\"\n [ngClass]=\"{\n 'alert--info': severity === 'info',\n 'alert--success': severity === 'success',\n 'alert--warning': severity === 'warning',\n 'alert--error': severity === 'error',\n 'border-primary bg-hippie-blue-50': severity === 'info',\n 'border-criticality-green bg-teal-50': severity === 'success',\n 'border-criticality-yellow bg-buttercup-50': severity === 'warning',\n 'border-criticality-red bg-sunset-orange-50': severity === 'error',\n }\"\n >\n <div class=\"content flex items-center gap-4\">\n <div\n class=\"icon-container inline-flex h-10 w-10 flex-shrink-0 items-center justify-center rounded-[50%]\"\n [ngClass]=\"{\n 'bg-primary': severity === 'info',\n 'bg-criticality-green': severity === 'success',\n 'bg-criticality-yellow': severity === 'warning',\n 'bg-criticality-red': severity === 'error',\n }\"\n >\n <i\n class=\"fas\"\n [ngClass]=\"{\n 'fa-info': severity === 'info',\n 'fa-check': severity === 'success',\n 'fa-exclamation-triangle': severity === 'warning',\n 'fa-times': severity === 'error',\n 'text-grayscale-0': severity !== 'warning',\n 'text-grayscale-90': severity === 'warning',\n }\"\n ></i>\n </div>\n <div class=\"text-container flex flex-col gap-4\">\n <div class=\"text flex flex-col justify-start\">\n @if (summary) {\n <span class=\"summary font-open-sans text-sm font-bold text-grayscale-90\">{{ summary }}</span>\n }\n\n @if (detail) {\n @if (escape()) {\n <span class=\"detail font-open-sans text-sm text-grayscale-90\">\n {{ detail }}\n </span>\n } @else {\n <span\n class=\"detail font-open-sans text-sm text-grayscale-90\"\n [innerHTML]=\"detail\"\n ></span>\n }\n } @else {\n <span class=\"detail font-open-sans text-sm text-grayscale-90\">\n <ng-content />\n </span>\n }\n </div>\n </div>\n </div>\n @if (closable) {\n <button\n class=\"close-option cursor-pointer border-0 bg-transparent p-1 text-base text-grayscale-90\"\n (click)=\"onClose()\"\n >\n <i class=\"fas fa-times\"></i>\n </button>\n }\n </div>\n}\n\n" }]
|
|
71
78
|
}], propDecorators: { severity: [{
|
|
72
79
|
type: Input
|
|
73
80
|
}], summary: [{
|
|
74
81
|
type: Input,
|
|
75
82
|
args: [{ required: true }]
|
|
76
83
|
}], detail: [{
|
|
77
|
-
type: Input
|
|
78
|
-
args: [{ required: true }]
|
|
84
|
+
type: Input
|
|
79
85
|
}], closable: [{
|
|
80
86
|
type: Input
|
|
81
87
|
}], closed: [{
|
|
82
88
|
type: Output
|
|
83
89
|
}] } });
|
|
84
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
90
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWxlcnQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvYW5ndWxhci1jb21wb25lbnRzL2FsZXJ0L3NyYy9saWIvYWxlcnQvYWxlcnQuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvYW5ndWxhci1jb21wb25lbnRzL2FsZXJ0L3NyYy9saWIvYWxlcnQvYWxlcnQuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQzFDLE9BQU8sRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDOztBQUU5RTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFPSCxNQUFNLE9BQU8sY0FBYztJQUN2Qjs7Ozs7Ozs7T0FRRztJQUNILHNFQUFzRTtJQUUvRCxRQUFRLEdBQTZDLE1BQU0sQ0FBQztJQUVuRTs7T0FFRztJQUVJLE9BQU8sQ0FBVTtJQUV4Qjs7T0FFRztJQUVJLE1BQU0sQ0FBVTtJQUV2Qjs7Ozs7T0FLRztJQUVJLFFBQVEsR0FBRyxJQUFJLENBQUM7SUFFdkI7Ozs7O09BS0c7SUFDSCxNQUFNLEdBQUcsS0FBSyxDQUFVLElBQUksQ0FBQyxDQUFDO0lBRTlCOztPQUVHO0lBRUksTUFBTSxHQUFHLElBQUksWUFBWSxFQUFRLENBQUM7SUFFekMsSUFBVyxNQUFNO1FBQ2IsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDO0lBQ3hCLENBQUM7SUFFTSxVQUFVO1FBQ2IsSUFBSSxDQUFDLE9BQU8sR0FBRyxLQUFLLENBQUM7SUFDekIsQ0FBQztJQUVNLFNBQVM7UUFDWixJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQztJQUN4QixDQUFDO0lBRU0sT0FBTztRQUNWLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDbkIsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO0lBQ3RCLENBQUM7SUFFTyxPQUFPLEdBQUcsSUFBSSxDQUFDO3dHQWxFZCxjQUFjOzRGQUFkLGNBQWMsdXVCQ3pCM0IsOHFHQXdFQSw0Q0RqRGMsT0FBTzs7NEZBRVIsY0FBYztrQkFOMUIsU0FBUzsrQkFDSSxTQUFTLGNBRVAsSUFBSSxXQUNQLENBQUMsT0FBTyxDQUFDOzhCQWNYLFFBQVE7c0JBRGQsS0FBSztnQkFPQyxPQUFPO3NCQURiLEtBQUs7dUJBQUMsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFO2dCQU9sQixNQUFNO3NCQURaLEtBQUs7Z0JBVUMsUUFBUTtzQkFEZCxLQUFLO2dCQWVDLE1BQU07c0JBRFosTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IE5nQ2xhc3MgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xyXG5pbXBvcnQgeyBDb21wb25lbnQsIEV2ZW50RW1pdHRlciwgaW5wdXQsIElucHV0LCBPdXRwdXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuXHJcbi8qKlxyXG4gKiBAZGVzY3JpcHRpb24gQ29tcG9uZW50ZSBkZSBhbGVydGEgcXVlIGV4aWJlIG1lbnNhZ2VucyBpbmZvcm1hdGl2YXMsIGRlIHN1Y2Vzc28sIGF2aXNvIG91IGVycm8uXHJcbiAqIFN1cG9ydGEgZmVjaGFtZW50byBtYW51YWwgcGVsbyB1c3XDoXJpbyBlIGVtaXRlIHVtIGV2ZW50byBhbyBzZXIgZmVjaGFkby5cclxuICpcclxuICogQGV4YW1wbGVcclxuICogYGBgaHRtbFxyXG4gKiA8cy1hbGVydFxyXG4gKiAgIHNldmVyaXR5PVwid2FybmluZ1wiXHJcbiAqICAgc3VtbWFyeT1cIkF0ZW7Dp8Ojb1wiXHJcbiAqICAgZGV0YWlsPVwiVmVyaWZpcXVlIG9zIGRhZG9zIGFudGVzIGRlIGNvbnRpbnVhci5cIlxyXG4gKiAgIChjbG9zZWQpPVwib25BbGVydENsb3NlZCgpXCJcclxuICogLz5cclxuICogYGBgXHJcbiAqXHJcbiAqIEBjYXRlZ29yeSBGZWVkYmFja1xyXG4gKi9cclxuQENvbXBvbmVudCh7XHJcbiAgICBzZWxlY3RvcjogJ3MtYWxlcnQnLFxyXG4gICAgdGVtcGxhdGVVcmw6ICcuL2FsZXJ0LmNvbXBvbmVudC5odG1sJyxcclxuICAgIHN0YW5kYWxvbmU6IHRydWUsXHJcbiAgICBpbXBvcnRzOiBbTmdDbGFzc10sXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBBbGVydENvbXBvbmVudCB7XHJcbiAgICAvKipcclxuICAgICAqIEBkZXNjcmlwdGlvbiBOw612ZWwgZGUgc2V2ZXJpZGFkZSBkbyBhbGVydGEsIHF1ZSBkZWZpbmUgYSBjb3IgZSBvIMOtY29uZSBleGliaWRvcy5cclxuICAgICAqIC0gYCdpbmZvJ2A6IGFsZXJ0YSBpbmZvcm1hdGl2byAocGFkcsOjbykuXHJcbiAgICAgKiAtIGAnc3VjY2VzcydgOiBhbGVydGEgZGUgc3VjZXNzby5cclxuICAgICAqIC0gYCd3YXJuaW5nJ2A6IGFsZXJ0YSBkZSBhdmlzby5cclxuICAgICAqIC0gYCdlcnJvcidgOiBhbGVydGEgZGUgZXJyby5cclxuICAgICAqXHJcbiAgICAgKiBAZGVmYXVsdCAnaW5mbydcclxuICAgICAqL1xyXG4gICAgLy8gc29uYXItaWdub3JlOiBSZWZhY3RvciB0aGlzIHVuaW9uIHR5cGUgdG8gaGF2ZSBsZXNzIHRoYW4gMyBlbGVtZW50c1xyXG4gICAgQElucHV0KClcclxuICAgIHB1YmxpYyBzZXZlcml0eTogJ2luZm8nIHwgJ3N1Y2Nlc3MnIHwgJ3dhcm5pbmcnIHwgJ2Vycm9yJyA9ICdpbmZvJztcclxuXHJcbiAgICAvKipcclxuICAgICAqIEBkZXNjcmlwdGlvbiBUw610dWxvIHByaW5jaXBhbCBkbyBhbGVydGEgZXhpYmlkbyBlbSBkZXN0YXF1ZS4gQ2FtcG8gb2JyaWdhdMOzcmlvLlxyXG4gICAgICovXHJcbiAgICBASW5wdXQoeyByZXF1aXJlZDogdHJ1ZSB9KVxyXG4gICAgcHVibGljIHN1bW1hcnkhOiBzdHJpbmc7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAZGVzY3JpcHRpb24gTWVuc2FnZW0gZGV0YWxoYWRhIGV4aWJpZGEgYWJhaXhvIGRvIHTDrXR1bG8gZG8gYWxlcnRhLiBDYW1wbyBvYnJpZ2F0w7NyaW8uXHJcbiAgICAgKi9cclxuICAgIEBJbnB1dCgpXHJcbiAgICBwdWJsaWMgZGV0YWlsITogc3RyaW5nO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogQGRlc2NyaXB0aW9uIFF1YW5kbyBgdHJ1ZWAsIGV4aWJlIG8gYm90w6NvIGRlIGZlY2hhciBvIGFsZXJ0YS5cclxuICAgICAqIFF1YW5kbyBgZmFsc2VgLCBvIGFsZXJ0YSBuw6NvIHBvZGUgc2VyIGRpc3BlbnNhZG8gcGVsbyB1c3XDoXJpby5cclxuICAgICAqXHJcbiAgICAgKiBAZGVmYXVsdCB0cnVlXHJcbiAgICAgKi9cclxuICAgIEBJbnB1dCgpXHJcbiAgICBwdWJsaWMgY2xvc2FibGUgPSB0cnVlO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogQGRlc2NyaXB0aW9uIFF1YW5kbyBgdHJ1ZWAsIG8gY29udGXDumRvIGRvIGFsZXJ0YSDDqSBlc2NhcGFkbyBwYXJhIGV2aXRhciBhIGV4ZWN1w6fDo28gZGUgSFRNTCBvdSBzY3JpcHRzLlxyXG4gICAgICogUXVhbmRvIGBmYWxzZWAsIG8gY29udGXDumRvIGRvIGFsZXJ0YSDDqSByZW5kZXJpemFkbyBjb21vIEhUTUwsIHBlcm1pdGluZG8gYSBpbmNsdXPDo28gZGUgbGlua3MsIG5lZ3JpdG8sIGV0Yy5cclxuICAgICAqXHJcbiAgICAgKiBAZGVmYXVsdCB0cnVlXHJcbiAgICAgKi9cclxuICAgIGVzY2FwZSA9IGlucHV0PGJvb2xlYW4+KHRydWUpO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogQGRlc2NyaXB0aW9uIEVtaXRpZG8gcXVhbmRvIG8gdXN1w6FyaW8gZmVjaGEgbyBhbGVydGEgY2xpY2FuZG8gbm8gYm90w6NvIGRlIGZlY2hhci5cclxuICAgICAqL1xyXG4gICAgQE91dHB1dCgpXHJcbiAgICBwdWJsaWMgY2xvc2VkID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xyXG5cclxuICAgIHB1YmxpYyBnZXQgaXNPcGVuKCk6IGJvb2xlYW4ge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9pc09wZW47XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGNsb3NlQWxlcnQoKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5faXNPcGVuID0gZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHNob3dBbGVydCgpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLl9pc09wZW4gPSB0cnVlO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBvbkNsb3NlKCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuY2xvc2VkLmVtaXQoKTtcclxuICAgICAgICB0aGlzLmNsb3NlQWxlcnQoKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIF9pc09wZW4gPSB0cnVlO1xyXG59XHJcbiIsIkBpZiAoaXNPcGVuKSB7XG4gICAgPGRpdlxuICAgICAgICBjbGFzcz1cImFsZXJ0IG0tMiBmbGV4IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWJldHdlZW4gZ2FwLTQgcm91bmRlZC1tZWRpdW0gYm9yZGVyLWwtNCBweC00IHB5LTMgc2hhZG93LVsxcHhfMXB4XzJweF9yZ2JhKDAsMCwwLDAuMildXCJcbiAgICAgICAgW25nQ2xhc3NdPVwie1xuICAgICAgICAgICAgJ2FsZXJ0LS1pbmZvJzogc2V2ZXJpdHkgPT09ICdpbmZvJyxcbiAgICAgICAgICAgICdhbGVydC0tc3VjY2Vzcyc6IHNldmVyaXR5ID09PSAnc3VjY2VzcycsXG4gICAgICAgICAgICAnYWxlcnQtLXdhcm5pbmcnOiBzZXZlcml0eSA9PT0gJ3dhcm5pbmcnLFxuICAgICAgICAgICAgJ2FsZXJ0LS1lcnJvcic6IHNldmVyaXR5ID09PSAnZXJyb3InLFxuICAgICAgICAgICAgJ2JvcmRlci1wcmltYXJ5IGJnLWhpcHBpZS1ibHVlLTUwJzogc2V2ZXJpdHkgPT09ICdpbmZvJyxcbiAgICAgICAgICAgICdib3JkZXItY3JpdGljYWxpdHktZ3JlZW4gYmctdGVhbC01MCc6IHNldmVyaXR5ID09PSAnc3VjY2VzcycsXG4gICAgICAgICAgICAnYm9yZGVyLWNyaXRpY2FsaXR5LXllbGxvdyBiZy1idXR0ZXJjdXAtNTAnOiBzZXZlcml0eSA9PT0gJ3dhcm5pbmcnLFxuICAgICAgICAgICAgJ2JvcmRlci1jcml0aWNhbGl0eS1yZWQgYmctc3Vuc2V0LW9yYW5nZS01MCc6IHNldmVyaXR5ID09PSAnZXJyb3InLFxuICAgICAgICB9XCJcbiAgICA+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJjb250ZW50IGZsZXggaXRlbXMtY2VudGVyIGdhcC00XCI+XG4gICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgY2xhc3M9XCJpY29uLWNvbnRhaW5lciBpbmxpbmUtZmxleCBoLTEwIHctMTAgZmxleC1zaHJpbmstMCBpdGVtcy1jZW50ZXIganVzdGlmeS1jZW50ZXIgcm91bmRlZC1bNTAlXVwiXG4gICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwie1xuICAgICAgICAgICAgICAgICAgICAnYmctcHJpbWFyeSc6IHNldmVyaXR5ID09PSAnaW5mbycsXG4gICAgICAgICAgICAgICAgICAgICdiZy1jcml0aWNhbGl0eS1ncmVlbic6IHNldmVyaXR5ID09PSAnc3VjY2VzcycsXG4gICAgICAgICAgICAgICAgICAgICdiZy1jcml0aWNhbGl0eS15ZWxsb3cnOiBzZXZlcml0eSA9PT0gJ3dhcm5pbmcnLFxuICAgICAgICAgICAgICAgICAgICAnYmctY3JpdGljYWxpdHktcmVkJzogc2V2ZXJpdHkgPT09ICdlcnJvcicsXG4gICAgICAgICAgICAgICAgfVwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgPGlcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJmYXNcIlxuICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7XG4gICAgICAgICAgICAgICAgICAgICAgICAnZmEtaW5mbyc6IHNldmVyaXR5ID09PSAnaW5mbycsXG4gICAgICAgICAgICAgICAgICAgICAgICAnZmEtY2hlY2snOiBzZXZlcml0eSA9PT0gJ3N1Y2Nlc3MnLFxuICAgICAgICAgICAgICAgICAgICAgICAgJ2ZhLWV4Y2xhbWF0aW9uLXRyaWFuZ2xlJzogc2V2ZXJpdHkgPT09ICd3YXJuaW5nJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICdmYS10aW1lcyc6IHNldmVyaXR5ID09PSAnZXJyb3InLFxuICAgICAgICAgICAgICAgICAgICAgICAgJ3RleHQtZ3JheXNjYWxlLTAnOiBzZXZlcml0eSAhPT0gJ3dhcm5pbmcnLFxuICAgICAgICAgICAgICAgICAgICAgICAgJ3RleHQtZ3JheXNjYWxlLTkwJzogc2V2ZXJpdHkgPT09ICd3YXJuaW5nJyxcbiAgICAgICAgICAgICAgICAgICAgfVwiXG4gICAgICAgICAgICAgICAgPjwvaT5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtY29udGFpbmVyIGZsZXggZmxleC1jb2wgZ2FwLTRcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dCBmbGV4IGZsZXgtY29sIGp1c3RpZnktc3RhcnRcIj5cbiAgICAgICAgICAgICAgICAgICAgQGlmIChzdW1tYXJ5KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInN1bW1hcnkgZm9udC1vcGVuLXNhbnMgdGV4dC1zbSBmb250LWJvbGQgdGV4dC1ncmF5c2NhbGUtOTBcIj57eyBzdW1tYXJ5IH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgQGlmIChkZXRhaWwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIEBpZiAoZXNjYXBlKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImRldGFpbCBmb250LW9wZW4tc2FucyB0ZXh0LXNtIHRleHQtZ3JheXNjYWxlLTkwXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IGRldGFpbCB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIH0gQGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZGV0YWlsIGZvbnQtb3Blbi1zYW5zIHRleHQtc20gdGV4dC1ncmF5c2NhbGUtOTBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbaW5uZXJIVE1MXT1cImRldGFpbFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPjwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSBAZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImRldGFpbCBmb250LW9wZW4tc2FucyB0ZXh0LXNtIHRleHQtZ3JheXNjYWxlLTkwXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRlbnQgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICBAaWYgKGNsb3NhYmxlKSB7XG4gICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJjbG9zZS1vcHRpb24gY3Vyc29yLXBvaW50ZXIgYm9yZGVyLTAgYmctdHJhbnNwYXJlbnQgcC0xIHRleHQtYmFzZSB0ZXh0LWdyYXlzY2FsZS05MFwiXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cIm9uQ2xvc2UoKVwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJmYXMgZmEtdGltZXNcIj48L2k+XG4gICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgfVxuICAgIDwvZGl2PlxufVxuXG4iXX0=
|