@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.
Files changed (42) hide show
  1. package/alert/lib/alert/alert.component.d.ts +8 -1
  2. package/dynamic-form/dynamic-form/components/lookup/models/lookup-api.model.d.ts +7 -1
  3. package/dynamic-form/dynamic-form/form-field/configurations/fields/lookup-field.d.ts +1 -1
  4. package/dynamic-form/public-api.d.ts +1 -1
  5. package/esm2022/alert/lib/alert/alert.component.mjs +12 -6
  6. package/esm2022/dynamic-form/dynamic-form/components/lookup/lookup.component.mjs +2 -2
  7. package/esm2022/dynamic-form/dynamic-form/components/lookup/models/lookup-api.model.mjs +1 -1
  8. package/esm2022/dynamic-form/dynamic-form/form-field/configurations/fields/lookup-field.mjs +1 -1
  9. package/esm2022/dynamic-form/public-api.mjs +1 -1
  10. package/esm2022/panel/lib/panel/panel.component.mjs +3 -3
  11. package/fesm2022/seniorsistemas-angular-components-alert.mjs +12 -6
  12. package/fesm2022/seniorsistemas-angular-components-alert.mjs.map +1 -1
  13. package/fesm2022/seniorsistemas-angular-components-dynamic-form.mjs +1 -1
  14. package/fesm2022/seniorsistemas-angular-components-dynamic-form.mjs.map +1 -1
  15. package/fesm2022/seniorsistemas-angular-components-panel.mjs +2 -2
  16. package/fesm2022/seniorsistemas-angular-components-panel.mjs.map +1 -1
  17. package/package.json +13 -13
  18. package/schematics/migrations/migrate-steps-to-stepper/index.d.ts +2 -0
  19. package/schematics/migrations/migrate-steps-to-stepper/index.js +104 -0
  20. package/schematics/migrations/migrate-steps-to-stepper/index.js.map +1 -0
  21. package/schematics/migrations.json +5 -0
  22. package/schematics/utils/ast-utils.d.ts +13 -0
  23. package/schematics/utils/ast-utils.js +76 -0
  24. package/schematics/utils/ast-utils.js.map +1 -1
  25. package/schematics/migrations/migrate-dynamic-form-v19/index.test.d.ts +0 -1
  26. package/schematics/migrations/migrate-dynamic-form-v19/index.test.js +0 -888
  27. package/schematics/migrations/migrate-dynamic-form-v19/index.test.js.map +0 -1
  28. package/schematics/migrations/migrate-p-datepicker/index.test.d.ts +0 -1
  29. package/schematics/migrations/migrate-p-datepicker/index.test.js +0 -392
  30. package/schematics/migrations/migrate-p-datepicker/index.test.js.map +0 -1
  31. package/schematics/migrations/migrate-p-editor/index.test.d.ts +0 -1
  32. package/schematics/migrations/migrate-p-editor/index.test.js +0 -393
  33. package/schematics/migrations/migrate-p-editor/index.test.js.map +0 -1
  34. package/schematics/migrations/migrate-s-chips-outputs/index.test.d.ts +0 -1
  35. package/schematics/migrations/migrate-s-chips-outputs/index.test.js +0 -125
  36. package/schematics/migrations/migrate-s-chips-outputs/index.test.js.map +0 -1
  37. package/schematics/utils/ast-utils.test.d.ts +0 -1
  38. package/schematics/utils/ast-utils.test.js +0 -138
  39. package/schematics/utils/ast-utils.test.js.map +0 -1
  40. package/schematics/utils/workspace-utils.test.d.ts +0 -1
  41. package/schematics/utils/workspace-utils.test.js +0 -152
  42. 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": true; }; "closable": { "alias": "closable"; "required": false; }; }, { "closed": "closed"; }, never, never, true, never>;
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
- export type LookupSearchRequest = {
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 class=\"alert flex items-center justify-between gap-4 rounded-medium border-l-4 m-2 py-3 px-4 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 'bg-hippie-blue-50 border-primary': severity === 'info',\n 'bg-teal-50 border-criticality-green': severity === 'success',\n 'bg-buttercup-50 border-criticality-yellow': severity === 'warning',\n 'bg-sunset-orange-50 border-criticality-red': severity === 'error',\n }\"\n>\n <div class=\"content flex items-center gap-4\">\n <div\n class=\"icon-container inline-flex flex-shrink-0 items-center justify-center h-10 w-10 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 <span class=\"detail font-open-sans text-sm text-grayscale-90\">{{ detail }}</span>\n }\n </div>\n </div>\n </div>\n @if (closable) {\n <button\n class=\"close-option bg-transparent border-0 text-grayscale-90 cursor-pointer text-base p-1\"\n (click)=\"onClose()\"\n >\n <i class=\"fas fa-times\"></i>\n </button>\n }\n</div>\n}\n", dependencies: [{ kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }] });
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 class=\"alert flex items-center justify-between gap-4 rounded-medium border-l-4 m-2 py-3 px-4 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 'bg-hippie-blue-50 border-primary': severity === 'info',\n 'bg-teal-50 border-criticality-green': severity === 'success',\n 'bg-buttercup-50 border-criticality-yellow': severity === 'warning',\n 'bg-sunset-orange-50 border-criticality-red': severity === 'error',\n }\"\n>\n <div class=\"content flex items-center gap-4\">\n <div\n class=\"icon-container inline-flex flex-shrink-0 items-center justify-center h-10 w-10 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 <span class=\"detail font-open-sans text-sm text-grayscale-90\">{{ detail }}</span>\n }\n </div>\n </div>\n </div>\n @if (closable) {\n <button\n class=\"close-option bg-transparent border-0 text-grayscale-90 cursor-pointer text-base p-1\"\n (click)=\"onClose()\"\n >\n <i class=\"fas fa-times\"></i>\n </button>\n }\n</div>\n}\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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWxlcnQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvYW5ndWxhci1jb21wb25lbnRzL2FsZXJ0L3NyYy9saWIvYWxlcnQvYWxlcnQuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvYW5ndWxhci1jb21wb25lbnRzL2FsZXJ0L3NyYy9saWIvYWxlcnQvYWxlcnQuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUN2RSxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0saUJBQWlCLENBQUM7O0FBRTFDOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQU9ILE1BQU0sT0FBTyxjQUFjO0lBQ3ZCOzs7Ozs7OztPQVFHO0lBQ0gsc0VBQXNFO0lBRS9ELFFBQVEsR0FBNkMsTUFBTSxDQUFDO0lBRW5FOztPQUVHO0lBRUksT0FBTyxDQUFVO0lBRXhCOztPQUVHO0lBRUksTUFBTSxDQUFVO0lBRXZCOzs7OztPQUtHO0lBRUksUUFBUSxHQUFHLElBQUksQ0FBQztJQUV2Qjs7T0FFRztJQUVJLE1BQU0sR0FBRyxJQUFJLFlBQVksRUFBUSxDQUFDO0lBRXpDLElBQVcsTUFBTTtRQUNiLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQztJQUN4QixDQUFDO0lBRU0sVUFBVTtRQUNiLElBQUksQ0FBQyxPQUFPLEdBQUcsS0FBSyxDQUFDO0lBQ3pCLENBQUM7SUFFTSxTQUFTO1FBQ1osSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUM7SUFDeEIsQ0FBQztJQUVNLE9BQU87UUFDVixJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ25CLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztJQUN0QixDQUFDO0lBRU8sT0FBTyxHQUFHLElBQUksQ0FBQzt3R0ExRGQsY0FBYzs0RkFBZCxjQUFjLGdNQ3pCM0IsazRFQTBEQSw0Q0RuQ2MsT0FBTzs7NEZBRVIsY0FBYztrQkFOMUIsU0FBUzsrQkFDSSxTQUFTLGNBRVAsSUFBSSxXQUNQLENBQUMsT0FBTyxDQUFDOzhCQWNYLFFBQVE7c0JBRGQsS0FBSztnQkFPQyxPQUFPO3NCQURiLEtBQUs7dUJBQUMsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFO2dCQU9sQixNQUFNO3NCQURaLEtBQUs7dUJBQUMsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFO2dCQVVsQixRQUFRO3NCQURkLEtBQUs7Z0JBT0MsTUFBTTtzQkFEWixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBFdmVudEVtaXR0ZXIsIElucHV0LCBPdXRwdXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgTmdDbGFzcyB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XHJcblxyXG4vKipcclxuICogQGRlc2NyaXB0aW9uIENvbXBvbmVudGUgZGUgYWxlcnRhIHF1ZSBleGliZSBtZW5zYWdlbnMgaW5mb3JtYXRpdmFzLCBkZSBzdWNlc3NvLCBhdmlzbyBvdSBlcnJvLlxyXG4gKiBTdXBvcnRhIGZlY2hhbWVudG8gbWFudWFsIHBlbG8gdXN1w6FyaW8gZSBlbWl0ZSB1bSBldmVudG8gYW8gc2VyIGZlY2hhZG8uXHJcbiAqXHJcbiAqIEBleGFtcGxlXHJcbiAqIGBgYGh0bWxcclxuICogPHMtYWxlcnRcclxuICogICBzZXZlcml0eT1cIndhcm5pbmdcIlxyXG4gKiAgIHN1bW1hcnk9XCJBdGVuw6fDo29cIlxyXG4gKiAgIGRldGFpbD1cIlZlcmlmaXF1ZSBvcyBkYWRvcyBhbnRlcyBkZSBjb250aW51YXIuXCJcclxuICogICAoY2xvc2VkKT1cIm9uQWxlcnRDbG9zZWQoKVwiXHJcbiAqIC8+XHJcbiAqIGBgYFxyXG4gKlxyXG4gKiBAY2F0ZWdvcnkgRmVlZGJhY2tcclxuICovXHJcbkBDb21wb25lbnQoe1xyXG4gICAgc2VsZWN0b3I6ICdzLWFsZXJ0JyxcclxuICAgIHRlbXBsYXRlVXJsOiAnLi9hbGVydC5jb21wb25lbnQuaHRtbCcsXHJcbiAgICBzdGFuZGFsb25lOiB0cnVlLFxyXG4gICAgaW1wb3J0czogW05nQ2xhc3NdLFxyXG59KVxyXG5leHBvcnQgY2xhc3MgQWxlcnRDb21wb25lbnQge1xyXG4gICAgLyoqXHJcbiAgICAgKiBAZGVzY3JpcHRpb24gTsOtdmVsIGRlIHNldmVyaWRhZGUgZG8gYWxlcnRhLCBxdWUgZGVmaW5lIGEgY29yIGUgbyDDrWNvbmUgZXhpYmlkb3MuXHJcbiAgICAgKiAtIGAnaW5mbydgOiBhbGVydGEgaW5mb3JtYXRpdm8gKHBhZHLDo28pLlxyXG4gICAgICogLSBgJ3N1Y2Nlc3MnYDogYWxlcnRhIGRlIHN1Y2Vzc28uXHJcbiAgICAgKiAtIGAnd2FybmluZydgOiBhbGVydGEgZGUgYXZpc28uXHJcbiAgICAgKiAtIGAnZXJyb3InYDogYWxlcnRhIGRlIGVycm8uXHJcbiAgICAgKlxyXG4gICAgICogQGRlZmF1bHQgJ2luZm8nXHJcbiAgICAgKi9cclxuICAgIC8vIHNvbmFyLWlnbm9yZTogUmVmYWN0b3IgdGhpcyB1bmlvbiB0eXBlIHRvIGhhdmUgbGVzcyB0aGFuIDMgZWxlbWVudHNcclxuICAgIEBJbnB1dCgpXHJcbiAgICBwdWJsaWMgc2V2ZXJpdHk6ICdpbmZvJyB8ICdzdWNjZXNzJyB8ICd3YXJuaW5nJyB8ICdlcnJvcicgPSAnaW5mbyc7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAZGVzY3JpcHRpb24gVMOtdHVsbyBwcmluY2lwYWwgZG8gYWxlcnRhIGV4aWJpZG8gZW0gZGVzdGFxdWUuIENhbXBvIG9icmlnYXTDs3Jpby5cclxuICAgICAqL1xyXG4gICAgQElucHV0KHsgcmVxdWlyZWQ6IHRydWUgfSlcclxuICAgIHB1YmxpYyBzdW1tYXJ5ITogc3RyaW5nO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogQGRlc2NyaXB0aW9uIE1lbnNhZ2VtIGRldGFsaGFkYSBleGliaWRhIGFiYWl4byBkbyB0w610dWxvIGRvIGFsZXJ0YS4gQ2FtcG8gb2JyaWdhdMOzcmlvLlxyXG4gICAgICovXHJcbiAgICBASW5wdXQoeyByZXF1aXJlZDogdHJ1ZSB9KVxyXG4gICAgcHVibGljIGRldGFpbCE6IHN0cmluZztcclxuXHJcbiAgICAvKipcclxuICAgICAqIEBkZXNjcmlwdGlvbiBRdWFuZG8gYHRydWVgLCBleGliZSBvIGJvdMOjbyBkZSBmZWNoYXIgbyBhbGVydGEuXHJcbiAgICAgKiBRdWFuZG8gYGZhbHNlYCwgbyBhbGVydGEgbsOjbyBwb2RlIHNlciBkaXNwZW5zYWRvIHBlbG8gdXN1w6FyaW8uXHJcbiAgICAgKlxyXG4gICAgICogQGRlZmF1bHQgdHJ1ZVxyXG4gICAgICovXHJcbiAgICBASW5wdXQoKVxyXG4gICAgcHVibGljIGNsb3NhYmxlID0gdHJ1ZTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIEBkZXNjcmlwdGlvbiBFbWl0aWRvIHF1YW5kbyBvIHVzdcOhcmlvIGZlY2hhIG8gYWxlcnRhIGNsaWNhbmRvIG5vIGJvdMOjbyBkZSBmZWNoYXIuXHJcbiAgICAgKi9cclxuICAgIEBPdXRwdXQoKVxyXG4gICAgcHVibGljIGNsb3NlZCA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcclxuXHJcbiAgICBwdWJsaWMgZ2V0IGlzT3BlbigpOiBib29sZWFuIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5faXNPcGVuO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBjbG9zZUFsZXJ0KCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuX2lzT3BlbiA9IGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzaG93QWxlcnQoKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5faXNPcGVuID0gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgb25DbG9zZSgpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLmNsb3NlZC5lbWl0KCk7XHJcbiAgICAgICAgdGhpcy5jbG9zZUFsZXJ0KCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBfaXNPcGVuID0gdHJ1ZTtcclxufVxyXG4iLCJAaWYgKGlzT3Blbikge1xuPGRpdlxuICAgIGNsYXNzPVwiYWxlcnQgZmxleCBpdGVtcy1jZW50ZXIganVzdGlmeS1iZXR3ZWVuIGdhcC00IHJvdW5kZWQtbWVkaXVtIGJvcmRlci1sLTQgbS0yIHB5LTMgcHgtNCBzaGFkb3ctWzFweF8xcHhfMnB4X3JnYmEoMCwwLDAsMC4yKV1cIlxuICAgIFtuZ0NsYXNzXT1cIntcbiAgICAgICAgJ2FsZXJ0LS1pbmZvJzogc2V2ZXJpdHkgPT09ICdpbmZvJyxcbiAgICAgICAgJ2FsZXJ0LS1zdWNjZXNzJzogc2V2ZXJpdHkgPT09ICdzdWNjZXNzJyxcbiAgICAgICAgJ2FsZXJ0LS13YXJuaW5nJzogc2V2ZXJpdHkgPT09ICd3YXJuaW5nJyxcbiAgICAgICAgJ2FsZXJ0LS1lcnJvcic6IHNldmVyaXR5ID09PSAnZXJyb3InLFxuICAgICAgICAnYmctaGlwcGllLWJsdWUtNTAgYm9yZGVyLXByaW1hcnknOiBzZXZlcml0eSA9PT0gJ2luZm8nLFxuICAgICAgICAnYmctdGVhbC01MCBib3JkZXItY3JpdGljYWxpdHktZ3JlZW4nOiBzZXZlcml0eSA9PT0gJ3N1Y2Nlc3MnLFxuICAgICAgICAnYmctYnV0dGVyY3VwLTUwIGJvcmRlci1jcml0aWNhbGl0eS15ZWxsb3cnOiBzZXZlcml0eSA9PT0gJ3dhcm5pbmcnLFxuICAgICAgICAnYmctc3Vuc2V0LW9yYW5nZS01MCBib3JkZXItY3JpdGljYWxpdHktcmVkJzogc2V2ZXJpdHkgPT09ICdlcnJvcicsXG4gICAgfVwiXG4+XG4gICAgPGRpdiBjbGFzcz1cImNvbnRlbnQgZmxleCBpdGVtcy1jZW50ZXIgZ2FwLTRcIj5cbiAgICAgICAgPGRpdlxuICAgICAgICAgICAgY2xhc3M9XCJpY29uLWNvbnRhaW5lciBpbmxpbmUtZmxleCBmbGV4LXNocmluay0wIGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNlbnRlciBoLTEwIHctMTAgcm91bmRlZC1bNTAlXVwiXG4gICAgICAgICAgICBbbmdDbGFzc109XCJ7XG4gICAgICAgICAgICAgICAgJ2JnLXByaW1hcnknOiBzZXZlcml0eSA9PT0gJ2luZm8nLFxuICAgICAgICAgICAgICAgICdiZy1jcml0aWNhbGl0eS1ncmVlbic6IHNldmVyaXR5ID09PSAnc3VjY2VzcycsXG4gICAgICAgICAgICAgICAgJ2JnLWNyaXRpY2FsaXR5LXllbGxvdyc6IHNldmVyaXR5ID09PSAnd2FybmluZycsXG4gICAgICAgICAgICAgICAgJ2JnLWNyaXRpY2FsaXR5LXJlZCc6IHNldmVyaXR5ID09PSAnZXJyb3InLFxuICAgICAgICAgICAgfVwiXG4gICAgICAgID5cbiAgICAgICAgICAgIDxpXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJmYXNcIlxuICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cIntcbiAgICAgICAgICAgICAgICAgICAgJ2ZhLWluZm8nOiBzZXZlcml0eSA9PT0gJ2luZm8nLFxuICAgICAgICAgICAgICAgICAgICAnZmEtY2hlY2snOiBzZXZlcml0eSA9PT0gJ3N1Y2Nlc3MnLFxuICAgICAgICAgICAgICAgICAgICAnZmEtZXhjbGFtYXRpb24tdHJpYW5nbGUnOiBzZXZlcml0eSA9PT0gJ3dhcm5pbmcnLFxuICAgICAgICAgICAgICAgICAgICAnZmEtdGltZXMnOiBzZXZlcml0eSA9PT0gJ2Vycm9yJyxcbiAgICAgICAgICAgICAgICAgICAgJ3RleHQtZ3JheXNjYWxlLTAnOiBzZXZlcml0eSAhPT0gJ3dhcm5pbmcnLFxuICAgICAgICAgICAgICAgICAgICAndGV4dC1ncmF5c2NhbGUtOTAnOiBzZXZlcml0eSA9PT0gJ3dhcm5pbmcnLFxuICAgICAgICAgICAgICAgIH1cIlxuICAgICAgICAgICAgPjwvaT5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LWNvbnRhaW5lciBmbGV4IGZsZXgtY29sIGdhcC00XCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dCBmbGV4IGZsZXgtY29sIGp1c3RpZnktc3RhcnRcIj5cbiAgICAgICAgICAgICAgICBAaWYgKHN1bW1hcnkpIHtcbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzdW1tYXJ5IGZvbnQtb3Blbi1zYW5zIHRleHQtc20gZm9udC1ib2xkIHRleHQtZ3JheXNjYWxlLTkwXCI+e3sgc3VtbWFyeSB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBAaWYgKGRldGFpbCkge1xuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImRldGFpbCBmb250LW9wZW4tc2FucyB0ZXh0LXNtIHRleHQtZ3JheXNjYWxlLTkwXCI+e3sgZGV0YWlsIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgICBAaWYgKGNsb3NhYmxlKSB7XG4gICAgICAgIDxidXR0b25cbiAgICAgICAgICAgIGNsYXNzPVwiY2xvc2Utb3B0aW9uIGJnLXRyYW5zcGFyZW50IGJvcmRlci0wIHRleHQtZ3JheXNjYWxlLTkwIGN1cnNvci1wb2ludGVyIHRleHQtYmFzZSBwLTFcIlxuICAgICAgICAgICAgKGNsaWNrKT1cIm9uQ2xvc2UoKVwiXG4gICAgICAgID5cbiAgICAgICAgICAgIDxpIGNsYXNzPVwiZmFzIGZhLXRpbWVzXCI+PC9pPlxuICAgICAgICA8L2J1dHRvbj5cbiAgICB9XG48L2Rpdj5cbn1cbiJdfQ==
90
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWxlcnQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvYW5ndWxhci1jb21wb25lbnRzL2FsZXJ0L3NyYy9saWIvYWxlcnQvYWxlcnQuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvYW5ndWxhci1jb21wb25lbnRzL2FsZXJ0L3NyYy9saWIvYWxlcnQvYWxlcnQuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQzFDLE9BQU8sRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDOztBQUU5RTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFPSCxNQUFNLE9BQU8sY0FBYztJQUN2Qjs7Ozs7Ozs7T0FRRztJQUNILHNFQUFzRTtJQUUvRCxRQUFRLEdBQTZDLE1BQU0sQ0FBQztJQUVuRTs7T0FFRztJQUVJLE9BQU8sQ0FBVTtJQUV4Qjs7T0FFRztJQUVJLE1BQU0sQ0FBVTtJQUV2Qjs7Ozs7T0FLRztJQUVJLFFBQVEsR0FBRyxJQUFJLENBQUM7SUFFdkI7Ozs7O09BS0c7SUFDSCxNQUFNLEdBQUcsS0FBSyxDQUFVLElBQUksQ0FBQyxDQUFDO0lBRTlCOztPQUVHO0lBRUksTUFBTSxHQUFHLElBQUksWUFBWSxFQUFRLENBQUM7SUFFekMsSUFBVyxNQUFNO1FBQ2IsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDO0lBQ3hCLENBQUM7SUFFTSxVQUFVO1FBQ2IsSUFBSSxDQUFDLE9BQU8sR0FBRyxLQUFLLENBQUM7SUFDekIsQ0FBQztJQUVNLFNBQVM7UUFDWixJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQztJQUN4QixDQUFDO0lBRU0sT0FBTztRQUNWLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDbkIsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO0lBQ3RCLENBQUM7SUFFTyxPQUFPLEdBQUcsSUFBSSxDQUFDO3dHQWxFZCxjQUFjOzRGQUFkLGNBQWMsdXVCQ3pCM0IsOHFHQXdFQSw0Q0RqRGMsT0FBTzs7NEZBRVIsY0FBYztrQkFOMUIsU0FBUzsrQkFDSSxTQUFTLGNBRVAsSUFBSSxXQUNQLENBQUMsT0FBTyxDQUFDOzhCQWNYLFFBQVE7c0JBRGQsS0FBSztnQkFPQyxPQUFPO3NCQURiLEtBQUs7dUJBQUMsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFO2dCQU9sQixNQUFNO3NCQURaLEtBQUs7Z0JBVUMsUUFBUTtzQkFEZCxLQUFLO2dCQWVDLE1BQU07c0JBRFosTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IE5nQ2xhc3MgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xyXG5pbXBvcnQgeyBDb21wb25lbnQsIEV2ZW50RW1pdHRlciwgaW5wdXQsIElucHV0LCBPdXRwdXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuXHJcbi8qKlxyXG4gKiBAZGVzY3JpcHRpb24gQ29tcG9uZW50ZSBkZSBhbGVydGEgcXVlIGV4aWJlIG1lbnNhZ2VucyBpbmZvcm1hdGl2YXMsIGRlIHN1Y2Vzc28sIGF2aXNvIG91IGVycm8uXHJcbiAqIFN1cG9ydGEgZmVjaGFtZW50byBtYW51YWwgcGVsbyB1c3XDoXJpbyBlIGVtaXRlIHVtIGV2ZW50byBhbyBzZXIgZmVjaGFkby5cclxuICpcclxuICogQGV4YW1wbGVcclxuICogYGBgaHRtbFxyXG4gKiA8cy1hbGVydFxyXG4gKiAgIHNldmVyaXR5PVwid2FybmluZ1wiXHJcbiAqICAgc3VtbWFyeT1cIkF0ZW7Dp8Ojb1wiXHJcbiAqICAgZGV0YWlsPVwiVmVyaWZpcXVlIG9zIGRhZG9zIGFudGVzIGRlIGNvbnRpbnVhci5cIlxyXG4gKiAgIChjbG9zZWQpPVwib25BbGVydENsb3NlZCgpXCJcclxuICogLz5cclxuICogYGBgXHJcbiAqXHJcbiAqIEBjYXRlZ29yeSBGZWVkYmFja1xyXG4gKi9cclxuQENvbXBvbmVudCh7XHJcbiAgICBzZWxlY3RvcjogJ3MtYWxlcnQnLFxyXG4gICAgdGVtcGxhdGVVcmw6ICcuL2FsZXJ0LmNvbXBvbmVudC5odG1sJyxcclxuICAgIHN0YW5kYWxvbmU6IHRydWUsXHJcbiAgICBpbXBvcnRzOiBbTmdDbGFzc10sXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBBbGVydENvbXBvbmVudCB7XHJcbiAgICAvKipcclxuICAgICAqIEBkZXNjcmlwdGlvbiBOw612ZWwgZGUgc2V2ZXJpZGFkZSBkbyBhbGVydGEsIHF1ZSBkZWZpbmUgYSBjb3IgZSBvIMOtY29uZSBleGliaWRvcy5cclxuICAgICAqIC0gYCdpbmZvJ2A6IGFsZXJ0YSBpbmZvcm1hdGl2byAocGFkcsOjbykuXHJcbiAgICAgKiAtIGAnc3VjY2VzcydgOiBhbGVydGEgZGUgc3VjZXNzby5cclxuICAgICAqIC0gYCd3YXJuaW5nJ2A6IGFsZXJ0YSBkZSBhdmlzby5cclxuICAgICAqIC0gYCdlcnJvcidgOiBhbGVydGEgZGUgZXJyby5cclxuICAgICAqXHJcbiAgICAgKiBAZGVmYXVsdCAnaW5mbydcclxuICAgICAqL1xyXG4gICAgLy8gc29uYXItaWdub3JlOiBSZWZhY3RvciB0aGlzIHVuaW9uIHR5cGUgdG8gaGF2ZSBsZXNzIHRoYW4gMyBlbGVtZW50c1xyXG4gICAgQElucHV0KClcclxuICAgIHB1YmxpYyBzZXZlcml0eTogJ2luZm8nIHwgJ3N1Y2Nlc3MnIHwgJ3dhcm5pbmcnIHwgJ2Vycm9yJyA9ICdpbmZvJztcclxuXHJcbiAgICAvKipcclxuICAgICAqIEBkZXNjcmlwdGlvbiBUw610dWxvIHByaW5jaXBhbCBkbyBhbGVydGEgZXhpYmlkbyBlbSBkZXN0YXF1ZS4gQ2FtcG8gb2JyaWdhdMOzcmlvLlxyXG4gICAgICovXHJcbiAgICBASW5wdXQoeyByZXF1aXJlZDogdHJ1ZSB9KVxyXG4gICAgcHVibGljIHN1bW1hcnkhOiBzdHJpbmc7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAZGVzY3JpcHRpb24gTWVuc2FnZW0gZGV0YWxoYWRhIGV4aWJpZGEgYWJhaXhvIGRvIHTDrXR1bG8gZG8gYWxlcnRhLiBDYW1wbyBvYnJpZ2F0w7NyaW8uXHJcbiAgICAgKi9cclxuICAgIEBJbnB1dCgpXHJcbiAgICBwdWJsaWMgZGV0YWlsITogc3RyaW5nO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogQGRlc2NyaXB0aW9uIFF1YW5kbyBgdHJ1ZWAsIGV4aWJlIG8gYm90w6NvIGRlIGZlY2hhciBvIGFsZXJ0YS5cclxuICAgICAqIFF1YW5kbyBgZmFsc2VgLCBvIGFsZXJ0YSBuw6NvIHBvZGUgc2VyIGRpc3BlbnNhZG8gcGVsbyB1c3XDoXJpby5cclxuICAgICAqXHJcbiAgICAgKiBAZGVmYXVsdCB0cnVlXHJcbiAgICAgKi9cclxuICAgIEBJbnB1dCgpXHJcbiAgICBwdWJsaWMgY2xvc2FibGUgPSB0cnVlO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogQGRlc2NyaXB0aW9uIFF1YW5kbyBgdHJ1ZWAsIG8gY29udGXDumRvIGRvIGFsZXJ0YSDDqSBlc2NhcGFkbyBwYXJhIGV2aXRhciBhIGV4ZWN1w6fDo28gZGUgSFRNTCBvdSBzY3JpcHRzLlxyXG4gICAgICogUXVhbmRvIGBmYWxzZWAsIG8gY29udGXDumRvIGRvIGFsZXJ0YSDDqSByZW5kZXJpemFkbyBjb21vIEhUTUwsIHBlcm1pdGluZG8gYSBpbmNsdXPDo28gZGUgbGlua3MsIG5lZ3JpdG8sIGV0Yy5cclxuICAgICAqXHJcbiAgICAgKiBAZGVmYXVsdCB0cnVlXHJcbiAgICAgKi9cclxuICAgIGVzY2FwZSA9IGlucHV0PGJvb2xlYW4+KHRydWUpO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogQGRlc2NyaXB0aW9uIEVtaXRpZG8gcXVhbmRvIG8gdXN1w6FyaW8gZmVjaGEgbyBhbGVydGEgY2xpY2FuZG8gbm8gYm90w6NvIGRlIGZlY2hhci5cclxuICAgICAqL1xyXG4gICAgQE91dHB1dCgpXHJcbiAgICBwdWJsaWMgY2xvc2VkID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xyXG5cclxuICAgIHB1YmxpYyBnZXQgaXNPcGVuKCk6IGJvb2xlYW4ge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9pc09wZW47XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGNsb3NlQWxlcnQoKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5faXNPcGVuID0gZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHNob3dBbGVydCgpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLl9pc09wZW4gPSB0cnVlO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBvbkNsb3NlKCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuY2xvc2VkLmVtaXQoKTtcclxuICAgICAgICB0aGlzLmNsb3NlQWxlcnQoKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIF9pc09wZW4gPSB0cnVlO1xyXG59XHJcbiIsIkBpZiAoaXNPcGVuKSB7XG4gICAgPGRpdlxuICAgICAgICBjbGFzcz1cImFsZXJ0IG0tMiBmbGV4IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWJldHdlZW4gZ2FwLTQgcm91bmRlZC1tZWRpdW0gYm9yZGVyLWwtNCBweC00IHB5LTMgc2hhZG93LVsxcHhfMXB4XzJweF9yZ2JhKDAsMCwwLDAuMildXCJcbiAgICAgICAgW25nQ2xhc3NdPVwie1xuICAgICAgICAgICAgJ2FsZXJ0LS1pbmZvJzogc2V2ZXJpdHkgPT09ICdpbmZvJyxcbiAgICAgICAgICAgICdhbGVydC0tc3VjY2Vzcyc6IHNldmVyaXR5ID09PSAnc3VjY2VzcycsXG4gICAgICAgICAgICAnYWxlcnQtLXdhcm5pbmcnOiBzZXZlcml0eSA9PT0gJ3dhcm5pbmcnLFxuICAgICAgICAgICAgJ2FsZXJ0LS1lcnJvcic6IHNldmVyaXR5ID09PSAnZXJyb3InLFxuICAgICAgICAgICAgJ2JvcmRlci1wcmltYXJ5IGJnLWhpcHBpZS1ibHVlLTUwJzogc2V2ZXJpdHkgPT09ICdpbmZvJyxcbiAgICAgICAgICAgICdib3JkZXItY3JpdGljYWxpdHktZ3JlZW4gYmctdGVhbC01MCc6IHNldmVyaXR5ID09PSAnc3VjY2VzcycsXG4gICAgICAgICAgICAnYm9yZGVyLWNyaXRpY2FsaXR5LXllbGxvdyBiZy1idXR0ZXJjdXAtNTAnOiBzZXZlcml0eSA9PT0gJ3dhcm5pbmcnLFxuICAgICAgICAgICAgJ2JvcmRlci1jcml0aWNhbGl0eS1yZWQgYmctc3Vuc2V0LW9yYW5nZS01MCc6IHNldmVyaXR5ID09PSAnZXJyb3InLFxuICAgICAgICB9XCJcbiAgICA+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJjb250ZW50IGZsZXggaXRlbXMtY2VudGVyIGdhcC00XCI+XG4gICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgY2xhc3M9XCJpY29uLWNvbnRhaW5lciBpbmxpbmUtZmxleCBoLTEwIHctMTAgZmxleC1zaHJpbmstMCBpdGVtcy1jZW50ZXIganVzdGlmeS1jZW50ZXIgcm91bmRlZC1bNTAlXVwiXG4gICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwie1xuICAgICAgICAgICAgICAgICAgICAnYmctcHJpbWFyeSc6IHNldmVyaXR5ID09PSAnaW5mbycsXG4gICAgICAgICAgICAgICAgICAgICdiZy1jcml0aWNhbGl0eS1ncmVlbic6IHNldmVyaXR5ID09PSAnc3VjY2VzcycsXG4gICAgICAgICAgICAgICAgICAgICdiZy1jcml0aWNhbGl0eS15ZWxsb3cnOiBzZXZlcml0eSA9PT0gJ3dhcm5pbmcnLFxuICAgICAgICAgICAgICAgICAgICAnYmctY3JpdGljYWxpdHktcmVkJzogc2V2ZXJpdHkgPT09ICdlcnJvcicsXG4gICAgICAgICAgICAgICAgfVwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgPGlcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJmYXNcIlxuICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7XG4gICAgICAgICAgICAgICAgICAgICAgICAnZmEtaW5mbyc6IHNldmVyaXR5ID09PSAnaW5mbycsXG4gICAgICAgICAgICAgICAgICAgICAgICAnZmEtY2hlY2snOiBzZXZlcml0eSA9PT0gJ3N1Y2Nlc3MnLFxuICAgICAgICAgICAgICAgICAgICAgICAgJ2ZhLWV4Y2xhbWF0aW9uLXRyaWFuZ2xlJzogc2V2ZXJpdHkgPT09ICd3YXJuaW5nJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICdmYS10aW1lcyc6IHNldmVyaXR5ID09PSAnZXJyb3InLFxuICAgICAgICAgICAgICAgICAgICAgICAgJ3RleHQtZ3JheXNjYWxlLTAnOiBzZXZlcml0eSAhPT0gJ3dhcm5pbmcnLFxuICAgICAgICAgICAgICAgICAgICAgICAgJ3RleHQtZ3JheXNjYWxlLTkwJzogc2V2ZXJpdHkgPT09ICd3YXJuaW5nJyxcbiAgICAgICAgICAgICAgICAgICAgfVwiXG4gICAgICAgICAgICAgICAgPjwvaT5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtY29udGFpbmVyIGZsZXggZmxleC1jb2wgZ2FwLTRcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dCBmbGV4IGZsZXgtY29sIGp1c3RpZnktc3RhcnRcIj5cbiAgICAgICAgICAgICAgICAgICAgQGlmIChzdW1tYXJ5KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInN1bW1hcnkgZm9udC1vcGVuLXNhbnMgdGV4dC1zbSBmb250LWJvbGQgdGV4dC1ncmF5c2NhbGUtOTBcIj57eyBzdW1tYXJ5IH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgQGlmIChkZXRhaWwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIEBpZiAoZXNjYXBlKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImRldGFpbCBmb250LW9wZW4tc2FucyB0ZXh0LXNtIHRleHQtZ3JheXNjYWxlLTkwXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IGRldGFpbCB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIH0gQGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZGV0YWlsIGZvbnQtb3Blbi1zYW5zIHRleHQtc20gdGV4dC1ncmF5c2NhbGUtOTBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbaW5uZXJIVE1MXT1cImRldGFpbFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPjwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSBAZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImRldGFpbCBmb250LW9wZW4tc2FucyB0ZXh0LXNtIHRleHQtZ3JheXNjYWxlLTkwXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRlbnQgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICBAaWYgKGNsb3NhYmxlKSB7XG4gICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJjbG9zZS1vcHRpb24gY3Vyc29yLXBvaW50ZXIgYm9yZGVyLTAgYmctdHJhbnNwYXJlbnQgcC0xIHRleHQtYmFzZSB0ZXh0LWdyYXlzY2FsZS05MFwiXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cIm9uQ2xvc2UoKVwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJmYXMgZmEtdGltZXNcIj48L2k+XG4gICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgfVxuICAgIDwvZGl2PlxufVxuXG4iXX0=