keevo-components 1.8.339 → 1.8.341

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 (24) hide show
  1. package/esm2022/lib/api/base-components/base-component-crud-form.mjs +17 -21
  2. package/esm2022/lib/api/base-components/base-component-crud-list.mjs +11 -14
  3. package/esm2022/lib/api/base-components/base-component-crud.mjs +6 -8
  4. package/esm2022/lib/api/services/image.cutter.service.mjs +564 -0
  5. package/esm2022/lib/components/kv-avatar/kv-avatar.component.mjs +54 -231
  6. package/esm2022/lib/components/kv-avatar/kv-avatar.module.mjs +7 -3
  7. package/esm2022/lib/components/kv-home-card/kv-home-card.module.mjs +1 -1
  8. package/esm2022/lib/components/kv-image-upload/kv-image-upload.component.mjs +46 -16
  9. package/esm2022/lib/components/kv-table/kv-table.component.mjs +11 -11
  10. package/esm2022/lib/components/kv-table-edit/kv-table-edit.component.mjs +3 -3
  11. package/esm2022/public-api.mjs +2 -1
  12. package/fesm2022/keevo-components.mjs +851 -451
  13. package/fesm2022/keevo-components.mjs.map +1 -1
  14. package/lib/api/base-components/base-component-crud-form.d.ts +15 -15
  15. package/lib/api/base-components/base-component-crud-list.d.ts +14 -14
  16. package/lib/api/base-components/base-component-crud.d.ts +5 -5
  17. package/lib/api/services/image.cutter.service.d.ts +15 -0
  18. package/lib/components/kv-avatar/kv-avatar.component.d.ts +12 -37
  19. package/lib/components/kv-avatar/kv-avatar.module.d.ts +2 -1
  20. package/lib/components/kv-image-upload/kv-image-upload.component.d.ts +10 -3
  21. package/lib/components/kv-table/kv-table.component.d.ts +1 -2
  22. package/lib/components/kv-table-expandable/kv-table-expandable.component.d.ts +1 -1
  23. package/package.json +1 -1
  24. package/public-api.d.ts +1 -0
@@ -1,15 +1,21 @@
1
- import { Component, EventEmitter, Input, Output } from '@angular/core';
1
+ import { Component, EventEmitter, input, Input, Output, ViewChild } from '@angular/core';
2
2
  import * as i0 from "@angular/core";
3
3
  import * as i1 from "../../api/services/notification.service";
4
- import * as i2 from "primeng/button";
5
- import * as i3 from "@angular/common";
4
+ import * as i2 from "./../../api/services/image.cutter.service";
5
+ import * as i3 from "primeng/button";
6
+ import * as i4 from "@angular/common";
6
7
  export class KvImageUploadComponent {
7
- constructor(notificationService) {
8
+ constructor(notificationService, imageCutterService) {
8
9
  this.notificationService = notificationService;
10
+ this.imageCutterService = imageCutterService;
9
11
  this.file = null;
10
12
  this.fileSrc = null;
11
13
  this.widthComponent = '400px';
12
14
  this.heightComponent = 'auto';
15
+ this.cutImage = input(false);
16
+ this.cutWidth = input(0);
17
+ this.cutHeight = input(0);
18
+ this.cutCircle = input(false);
13
19
  this.maxHeightImage = '400px';
14
20
  this.fileEmit = new EventEmitter();
15
21
  this.deleteEmit = new EventEmitter();
@@ -40,13 +46,31 @@ export class KvImageUploadComponent {
40
46
  }
41
47
  handleFile(file) {
42
48
  if (file.type.startsWith('image/')) {
43
- this.file = file;
44
- const reader = new FileReader();
45
- reader.onload = (e) => {
46
- this.fileSrc = reader.result;
47
- };
48
- reader.readAsDataURL(file);
49
- this.fileEmit.emit(file);
49
+ if (this.cutImage() == true) {
50
+ this.file = file;
51
+ const reader = new FileReader();
52
+ reader.onload = async () => {
53
+ try {
54
+ const result = await this.imageCutterService.cut(reader.result?.toString() ?? '', this.cutWidth(), this.cutHeight(), this.cutCircle());
55
+ this.fileSrc = result;
56
+ this.fileEmit.emit(result);
57
+ }
58
+ catch (error) {
59
+ this.deleteImage();
60
+ }
61
+ };
62
+ reader.readAsDataURL(file);
63
+ }
64
+ else {
65
+ // ?! Comportamneto padrão --> Preservar <-- !!!
66
+ this.file = file;
67
+ const reader = new FileReader();
68
+ reader.onload = (e) => {
69
+ this.fileSrc = reader.result;
70
+ };
71
+ reader.readAsDataURL(file);
72
+ this.fileEmit.emit(file);
73
+ }
50
74
  }
51
75
  else {
52
76
  this.notificationService.toastError('Apenas arquivos de imagem são permitidos.');
@@ -63,15 +87,18 @@ export class KvImageUploadComponent {
63
87
  deleteImage() {
64
88
  this.file = null;
65
89
  this.fileSrc = null;
90
+ if (this.fileInput) {
91
+ this.fileInput.nativeElement.value = '';
92
+ }
66
93
  this.deleteEmit.emit();
67
94
  }
68
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.8", ngImport: i0, type: KvImageUploadComponent, deps: [{ token: i1.NotificationService }], target: i0.ɵɵFactoryTarget.Component }); }
69
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.8", type: KvImageUploadComponent, selector: "kv-image-upload", inputs: { fileSrc: "fileSrc", widthComponent: "widthComponent", heightComponent: "heightComponent", maxHeightImage: "maxHeightImage", description: "description" }, outputs: { fileEmit: "fileEmit", deleteEmit: "deleteEmit" }, ngImport: i0, template: "<div\r\n (dragover)=\"onDragOver($event)\"\r\n (dragleave)=\"onDragLeave($event)\"\r\n (drop)=\"onDrop($event)\"\r\n class=\"relative overflow-hidden border-dashed border-2 border-round-lg border-gray-400 flex justify-content-end\"\r\n [style.width]=\"widthComponent\"\r\n [style.height]=\"heightComponent\"\r\n>\r\n\r\n <div\r\n class=\"w-full flex align-items-center justify-content-center\"\r\n style=\"cursor: pointer;\"\r\n (click)=\"fileInput.click()\"\r\n >\r\n <input\r\n type=\"file\"\r\n (change)=\"onFileSelected($event)\"\r\n #fileInput\r\n hidden\r\n accept=\"image/*\"\r\n >\r\n <div\r\n *ngIf=\"!fileSrc\"\r\n class=\"flex flex-column align-items-center justify-content-center\"\r\n >\r\n <span\r\n class=\"material-symbols-outlined mt-2\"\r\n style=\"font-size: 3rem;\"\r\n >\r\n cloud_upload\r\n </span>\r\n\r\n @if(description) {\r\n <p class=\"font-semibold\">{{description}}</p>\r\n } @else {\r\n <p class=\"font-semibold\">Arraste e solte uma imagem aqui, ou</p>\r\n <p class=\"font-semibold\">clique para selecion\u00E1-la</p>\r\n }\r\n\r\n </div>\r\n <div *ngIf=\"fileSrc || file\">\r\n <img\r\n [src]=\"fileSrc\"\r\n [alt]=\"file?.name\"\r\n class=\"w-full\"\r\n [style.maxHeight]=\"maxHeightImage\"\r\n >\r\n </div>\r\n </div>\r\n\r\n @if(fileSrc || file) {\r\n <button\r\n style=\"background-color: transparent;\"\r\n pButton\r\n (click)=\"deleteImage()\"\r\n class=\"absolute transition-colors transition-duration-500 text-red-700 hover:text-red-500 w-2rem h-2rem\"\r\n [text]=\"true\"\r\n [icon]=\"'pi pi-trash'\"\r\n >\r\n </button>\r\n }\r\n \r\n\r\n</div>", styles: [""], dependencies: [{ kind: "directive", type: i2.ButtonDirective, selector: "[pButton]", inputs: ["iconPos", "loadingIcon", "label", "icon", "loading", "severity", "raised", "rounded", "text", "outlined", "size", "plain"] }, { kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }] }); }
95
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.8", ngImport: i0, type: KvImageUploadComponent, deps: [{ token: i1.NotificationService }, { token: i2.ImageCutterService }], target: i0.ɵɵFactoryTarget.Component }); }
96
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.8", type: KvImageUploadComponent, selector: "kv-image-upload", inputs: { fileSrc: { classPropertyName: "fileSrc", publicName: "fileSrc", isSignal: false, isRequired: false, transformFunction: null }, widthComponent: { classPropertyName: "widthComponent", publicName: "widthComponent", isSignal: false, isRequired: false, transformFunction: null }, heightComponent: { classPropertyName: "heightComponent", publicName: "heightComponent", isSignal: false, isRequired: false, transformFunction: null }, cutImage: { classPropertyName: "cutImage", publicName: "cutImage", isSignal: true, isRequired: false, transformFunction: null }, cutWidth: { classPropertyName: "cutWidth", publicName: "cutWidth", isSignal: true, isRequired: false, transformFunction: null }, cutHeight: { classPropertyName: "cutHeight", publicName: "cutHeight", isSignal: true, isRequired: false, transformFunction: null }, cutCircle: { classPropertyName: "cutCircle", publicName: "cutCircle", isSignal: true, isRequired: false, transformFunction: null }, maxHeightImage: { classPropertyName: "maxHeightImage", publicName: "maxHeightImage", isSignal: false, isRequired: false, transformFunction: null }, description: { classPropertyName: "description", publicName: "description", isSignal: false, isRequired: false, transformFunction: null } }, outputs: { fileEmit: "fileEmit", deleteEmit: "deleteEmit" }, viewQueries: [{ propertyName: "fileInput", first: true, predicate: ["fileInput"], descendants: true }], ngImport: i0, template: "<div\r\n (dragover)=\"onDragOver($event)\"\r\n (dragleave)=\"onDragLeave($event)\"\r\n (drop)=\"onDrop($event)\"\r\n class=\"relative overflow-hidden border-dashed border-2 border-round-lg border-gray-400 flex justify-content-end\"\r\n [style.width]=\"widthComponent\"\r\n [style.height]=\"heightComponent\"\r\n>\r\n\r\n <div\r\n class=\"w-full flex align-items-center justify-content-center\"\r\n style=\"cursor: pointer;\"\r\n (click)=\"fileInput.click()\"\r\n >\r\n <input\r\n type=\"file\"\r\n (change)=\"onFileSelected($event)\"\r\n #fileInput\r\n hidden\r\n accept=\"image/*\"\r\n >\r\n <div\r\n *ngIf=\"!fileSrc\"\r\n class=\"flex flex-column align-items-center justify-content-center\"\r\n >\r\n <span\r\n class=\"material-symbols-outlined mt-2\"\r\n style=\"font-size: 3rem;\"\r\n >\r\n cloud_upload\r\n </span>\r\n\r\n @if(description) {\r\n <p class=\"font-semibold\">{{description}}</p>\r\n } @else {\r\n <p class=\"font-semibold\">Arraste e solte uma imagem aqui, ou</p>\r\n <p class=\"font-semibold\">clique para selecion\u00E1-la</p>\r\n }\r\n\r\n </div>\r\n <div *ngIf=\"fileSrc || file\">\r\n <img\r\n [src]=\"fileSrc\"\r\n [alt]=\"file?.name\"\r\n class=\"w-full\"\r\n [style.maxHeight]=\"maxHeightImage\"\r\n >\r\n </div>\r\n </div>\r\n\r\n @if(fileSrc || file) {\r\n <button\r\n style=\"background-color: transparent;\"\r\n pButton\r\n (click)=\"deleteImage()\"\r\n class=\"absolute transition-colors transition-duration-500 text-red-700 hover:text-red-500 w-2rem h-2rem\"\r\n [text]=\"true\"\r\n [icon]=\"'pi pi-trash'\"\r\n >\r\n </button>\r\n }\r\n\r\n\r\n</div>\r\n", styles: [""], dependencies: [{ kind: "directive", type: i3.ButtonDirective, selector: "[pButton]", inputs: ["iconPos", "loadingIcon", "label", "icon", "loading", "severity", "raised", "rounded", "text", "outlined", "size", "plain"] }, { kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }] }); }
70
97
  }
71
98
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.8", ngImport: i0, type: KvImageUploadComponent, decorators: [{
72
99
  type: Component,
73
- args: [{ selector: 'kv-image-upload', template: "<div\r\n (dragover)=\"onDragOver($event)\"\r\n (dragleave)=\"onDragLeave($event)\"\r\n (drop)=\"onDrop($event)\"\r\n class=\"relative overflow-hidden border-dashed border-2 border-round-lg border-gray-400 flex justify-content-end\"\r\n [style.width]=\"widthComponent\"\r\n [style.height]=\"heightComponent\"\r\n>\r\n\r\n <div\r\n class=\"w-full flex align-items-center justify-content-center\"\r\n style=\"cursor: pointer;\"\r\n (click)=\"fileInput.click()\"\r\n >\r\n <input\r\n type=\"file\"\r\n (change)=\"onFileSelected($event)\"\r\n #fileInput\r\n hidden\r\n accept=\"image/*\"\r\n >\r\n <div\r\n *ngIf=\"!fileSrc\"\r\n class=\"flex flex-column align-items-center justify-content-center\"\r\n >\r\n <span\r\n class=\"material-symbols-outlined mt-2\"\r\n style=\"font-size: 3rem;\"\r\n >\r\n cloud_upload\r\n </span>\r\n\r\n @if(description) {\r\n <p class=\"font-semibold\">{{description}}</p>\r\n } @else {\r\n <p class=\"font-semibold\">Arraste e solte uma imagem aqui, ou</p>\r\n <p class=\"font-semibold\">clique para selecion\u00E1-la</p>\r\n }\r\n\r\n </div>\r\n <div *ngIf=\"fileSrc || file\">\r\n <img\r\n [src]=\"fileSrc\"\r\n [alt]=\"file?.name\"\r\n class=\"w-full\"\r\n [style.maxHeight]=\"maxHeightImage\"\r\n >\r\n </div>\r\n </div>\r\n\r\n @if(fileSrc || file) {\r\n <button\r\n style=\"background-color: transparent;\"\r\n pButton\r\n (click)=\"deleteImage()\"\r\n class=\"absolute transition-colors transition-duration-500 text-red-700 hover:text-red-500 w-2rem h-2rem\"\r\n [text]=\"true\"\r\n [icon]=\"'pi pi-trash'\"\r\n >\r\n </button>\r\n }\r\n \r\n\r\n</div>" }]
74
- }], ctorParameters: () => [{ type: i1.NotificationService }], propDecorators: { fileSrc: [{
100
+ args: [{ selector: 'kv-image-upload', template: "<div\r\n (dragover)=\"onDragOver($event)\"\r\n (dragleave)=\"onDragLeave($event)\"\r\n (drop)=\"onDrop($event)\"\r\n class=\"relative overflow-hidden border-dashed border-2 border-round-lg border-gray-400 flex justify-content-end\"\r\n [style.width]=\"widthComponent\"\r\n [style.height]=\"heightComponent\"\r\n>\r\n\r\n <div\r\n class=\"w-full flex align-items-center justify-content-center\"\r\n style=\"cursor: pointer;\"\r\n (click)=\"fileInput.click()\"\r\n >\r\n <input\r\n type=\"file\"\r\n (change)=\"onFileSelected($event)\"\r\n #fileInput\r\n hidden\r\n accept=\"image/*\"\r\n >\r\n <div\r\n *ngIf=\"!fileSrc\"\r\n class=\"flex flex-column align-items-center justify-content-center\"\r\n >\r\n <span\r\n class=\"material-symbols-outlined mt-2\"\r\n style=\"font-size: 3rem;\"\r\n >\r\n cloud_upload\r\n </span>\r\n\r\n @if(description) {\r\n <p class=\"font-semibold\">{{description}}</p>\r\n } @else {\r\n <p class=\"font-semibold\">Arraste e solte uma imagem aqui, ou</p>\r\n <p class=\"font-semibold\">clique para selecion\u00E1-la</p>\r\n }\r\n\r\n </div>\r\n <div *ngIf=\"fileSrc || file\">\r\n <img\r\n [src]=\"fileSrc\"\r\n [alt]=\"file?.name\"\r\n class=\"w-full\"\r\n [style.maxHeight]=\"maxHeightImage\"\r\n >\r\n </div>\r\n </div>\r\n\r\n @if(fileSrc || file) {\r\n <button\r\n style=\"background-color: transparent;\"\r\n pButton\r\n (click)=\"deleteImage()\"\r\n class=\"absolute transition-colors transition-duration-500 text-red-700 hover:text-red-500 w-2rem h-2rem\"\r\n [text]=\"true\"\r\n [icon]=\"'pi pi-trash'\"\r\n >\r\n </button>\r\n }\r\n\r\n\r\n</div>\r\n" }]
101
+ }], ctorParameters: () => [{ type: i1.NotificationService }, { type: i2.ImageCutterService }], propDecorators: { fileSrc: [{
75
102
  type: Input
76
103
  }], widthComponent: [{
77
104
  type: Input
@@ -85,5 +112,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.8", ngImpor
85
112
  type: Output
86
113
  }], deleteEmit: [{
87
114
  type: Output
115
+ }], fileInput: [{
116
+ type: ViewChild,
117
+ args: ['fileInput']
88
118
  }] } });
89
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoia3YtaW1hZ2UtdXBsb2FkLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2tlZXZvLWNvbXBvbmVudHMvc3JjL2xpYi9jb21wb25lbnRzL2t2LWltYWdlLXVwbG9hZC9rdi1pbWFnZS11cGxvYWQuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMva2Vldm8tY29tcG9uZW50cy9zcmMvbGliL2NvbXBvbmVudHMva3YtaW1hZ2UtdXBsb2FkL2t2LWltYWdlLXVwbG9hZC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDOzs7OztBQVF2RSxNQUFNLE9BQU8sc0JBQXNCO0lBRWpDLFlBQW9CLG1CQUF3QztRQUF4Qyx3QkFBbUIsR0FBbkIsbUJBQW1CLENBQXFCO1FBRzVELFNBQUksR0FBZ0IsSUFBSSxDQUFDO1FBQ2hCLFlBQU8sR0FBZ0MsSUFBSSxDQUFDO1FBRTVDLG1CQUFjLEdBQVcsT0FBTyxDQUFDO1FBQ2pDLG9CQUFlLEdBQVcsTUFBTSxDQUFDO1FBQ2pDLG1CQUFjLEdBQVcsT0FBTyxDQUFDO1FBSWhDLGFBQVEsR0FBc0IsSUFBSSxZQUFZLEVBQUUsQ0FBQztRQUNqRCxlQUFVLEdBQXNCLElBQUksWUFBWSxFQUFFLENBQUM7SUFYN0QsQ0FBQztJQWFELFVBQVUsQ0FBQyxLQUFnQjtRQUN6QixLQUFLLENBQUMsY0FBYyxFQUFFLENBQUM7UUFDdkIsS0FBSyxDQUFDLGVBQWUsRUFBRSxDQUFDO1FBQ3hCLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUMvQixDQUFDO0lBRUQsV0FBVyxDQUFDLEtBQWdCO1FBQzFCLEtBQUssQ0FBQyxjQUFjLEVBQUUsQ0FBQztRQUN2QixLQUFLLENBQUMsZUFBZSxFQUFFLENBQUM7UUFDeEIsSUFBSSxDQUFDLG1CQUFtQixDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ2xDLENBQUM7SUFFRCxNQUFNLENBQUMsS0FBZ0I7UUFDckIsS0FBSyxDQUFDLGNBQWMsRUFBRSxDQUFDO1FBQ3ZCLEtBQUssQ0FBQyxlQUFlLEVBQUUsQ0FBQztRQUN4QixJQUFJLENBQUMsbUJBQW1CLENBQUMsS0FBSyxDQUFDLENBQUM7UUFFaEMsSUFBSSxLQUFLLENBQUMsWUFBWSxJQUFJLEtBQUssQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUM5RCxJQUFJLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDL0MsQ0FBQztJQUNILENBQUM7SUFFRCxjQUFjLENBQUMsS0FBWTtRQUN6QixNQUFNLEtBQUssR0FBRyxLQUFLLENBQUMsTUFBMEIsQ0FBQztRQUMvQyxJQUFJLEtBQUssQ0FBQyxLQUFLLElBQUksS0FBSyxDQUFDLEtBQUssQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDMUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDbEMsQ0FBQztJQUNILENBQUM7SUFFRCxVQUFVLENBQUMsSUFBVTtRQUNuQixJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUM7WUFDbkMsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUM7WUFDakIsTUFBTSxNQUFNLEdBQUcsSUFBSSxVQUFVLEVBQUUsQ0FBQztZQUNoQyxNQUFNLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxFQUFFLEVBQUU7Z0JBQ3BCLElBQUksQ0FBQyxPQUFPLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQztZQUMvQixDQUFDLENBQUM7WUFDRixNQUFNLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQzNCLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFBO1FBQzFCLENBQUM7YUFBTSxDQUFDO1lBQ04sSUFBSSxDQUFDLG1CQUFtQixDQUFDLFVBQVUsQ0FBQywyQ0FBMkMsQ0FBQyxDQUFBO1FBQ2xGLENBQUM7SUFDSCxDQUFDO0lBRUQsZ0JBQWdCLENBQUMsS0FBZ0I7UUFDL0IsTUFBTSxTQUFTLEdBQUcsS0FBSyxDQUFDLE1BQXFCLENBQUM7UUFDOUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLENBQUM7SUFDdEMsQ0FBQztJQUVELG1CQUFtQixDQUFDLEtBQWdCO1FBQ2xDLE1BQU0sU0FBUyxHQUFHLEtBQUssQ0FBQyxNQUFxQixDQUFDO1FBQzlDLFNBQVMsQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBQ3pDLENBQUM7SUFFRCxXQUFXO1FBQ1QsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUM7UUFDakIsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUM7UUFDcEIsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLEVBQUUsQ0FBQTtJQUN4QixDQUFDOzhHQTFFVSxzQkFBc0I7a0dBQXRCLHNCQUFzQix3UkNSbkMsd2lFQStETTs7MkZEdkRPLHNCQUFzQjtrQkFMbEMsU0FBUzsrQkFDRSxpQkFBaUI7d0ZBVWxCLE9BQU87c0JBQWYsS0FBSztnQkFFRyxjQUFjO3NCQUF0QixLQUFLO2dCQUNHLGVBQWU7c0JBQXZCLEtBQUs7Z0JBQ0csY0FBYztzQkFBdEIsS0FBSztnQkFFRyxXQUFXO3NCQUFuQixLQUFLO2dCQUVJLFFBQVE7c0JBQWpCLE1BQU07Z0JBQ0csVUFBVTtzQkFBbkIsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgRXZlbnRFbWl0dGVyLCBJbnB1dCwgT3V0cHV0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IE5vdGlmaWNhdGlvblNlcnZpY2UgfSBmcm9tICcuLi8uLi9hcGkvc2VydmljZXMvbm90aWZpY2F0aW9uLnNlcnZpY2UnO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdrdi1pbWFnZS11cGxvYWQnLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi9rdi1pbWFnZS11cGxvYWQuY29tcG9uZW50Lmh0bWwnLFxyXG4gIHN0eWxlVXJsOiAnLi9rdi1pbWFnZS11cGxvYWQuY29tcG9uZW50LnNjc3MnXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBLdkltYWdlVXBsb2FkQ29tcG9uZW50IHtcclxuXHJcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBub3RpZmljYXRpb25TZXJ2aWNlOiBOb3RpZmljYXRpb25TZXJ2aWNlKSB7XHJcblxyXG4gIH1cclxuICBmaWxlOiBGaWxlIHwgbnVsbCA9IG51bGw7XHJcbiAgQElucHV0KCkgZmlsZVNyYzogc3RyaW5nIHwgQXJyYXlCdWZmZXIgfCBudWxsID0gbnVsbDtcclxuXHJcbiAgQElucHV0KCkgd2lkdGhDb21wb25lbnQ6IHN0cmluZyA9ICc0MDBweCc7XHJcbiAgQElucHV0KCkgaGVpZ2h0Q29tcG9uZW50OiBzdHJpbmcgPSAnYXV0byc7XHJcbiAgQElucHV0KCkgbWF4SGVpZ2h0SW1hZ2U6IHN0cmluZyA9ICc0MDBweCc7XHJcblxyXG4gIEBJbnB1dCgpIGRlc2NyaXB0aW9uITogc3RyaW5nO1xyXG5cclxuICBAT3V0cHV0KCkgZmlsZUVtaXQ6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xyXG4gIEBPdXRwdXQoKSBkZWxldGVFbWl0OiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcclxuXHJcbiAgb25EcmFnT3ZlcihldmVudDogRHJhZ0V2ZW50KSB7XHJcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XHJcbiAgICB0aGlzLmFkZERyYWdPdmVyQ2xhc3MoZXZlbnQpO1xyXG4gIH1cclxuXHJcbiAgb25EcmFnTGVhdmUoZXZlbnQ6IERyYWdFdmVudCkge1xyXG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xyXG4gICAgdGhpcy5yZW1vdmVEcmFnT3ZlckNsYXNzKGV2ZW50KTtcclxuICB9XHJcblxyXG4gIG9uRHJvcChldmVudDogRHJhZ0V2ZW50KSB7XHJcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XHJcbiAgICB0aGlzLnJlbW92ZURyYWdPdmVyQ2xhc3MoZXZlbnQpO1xyXG5cclxuICAgIGlmIChldmVudC5kYXRhVHJhbnNmZXIgJiYgZXZlbnQuZGF0YVRyYW5zZmVyLmZpbGVzLmxlbmd0aCA+IDApIHtcclxuICAgICAgdGhpcy5oYW5kbGVGaWxlKGV2ZW50LmRhdGFUcmFuc2Zlci5maWxlc1swXSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBvbkZpbGVTZWxlY3RlZChldmVudDogRXZlbnQpIHtcclxuICAgIGNvbnN0IGlucHV0ID0gZXZlbnQudGFyZ2V0IGFzIEhUTUxJbnB1dEVsZW1lbnQ7XHJcbiAgICBpZiAoaW5wdXQuZmlsZXMgJiYgaW5wdXQuZmlsZXMubGVuZ3RoID4gMCkge1xyXG4gICAgICB0aGlzLmhhbmRsZUZpbGUoaW5wdXQuZmlsZXNbMF0pO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgaGFuZGxlRmlsZShmaWxlOiBGaWxlKSB7XHJcbiAgICBpZiAoZmlsZS50eXBlLnN0YXJ0c1dpdGgoJ2ltYWdlLycpKSB7XHJcbiAgICAgIHRoaXMuZmlsZSA9IGZpbGU7XHJcbiAgICAgIGNvbnN0IHJlYWRlciA9IG5ldyBGaWxlUmVhZGVyKCk7XHJcbiAgICAgIHJlYWRlci5vbmxvYWQgPSAoZSkgPT4ge1xyXG4gICAgICAgIHRoaXMuZmlsZVNyYyA9IHJlYWRlci5yZXN1bHQ7XHJcbiAgICAgIH07XHJcbiAgICAgIHJlYWRlci5yZWFkQXNEYXRhVVJMKGZpbGUpO1xyXG4gICAgICB0aGlzLmZpbGVFbWl0LmVtaXQoZmlsZSlcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMubm90aWZpY2F0aW9uU2VydmljZS50b2FzdEVycm9yKCdBcGVuYXMgYXJxdWl2b3MgZGUgaW1hZ2VtIHPDo28gcGVybWl0aWRvcy4nKVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgYWRkRHJhZ092ZXJDbGFzcyhldmVudDogRHJhZ0V2ZW50KSB7XHJcbiAgICBjb25zdCBjb250YWluZXIgPSBldmVudC50YXJnZXQgYXMgSFRNTEVsZW1lbnQ7XHJcbiAgICBjb250YWluZXIuY2xhc3NMaXN0LmFkZCgnZHJhZ292ZXInKTtcclxuICB9XHJcblxyXG4gIHJlbW92ZURyYWdPdmVyQ2xhc3MoZXZlbnQ6IERyYWdFdmVudCkge1xyXG4gICAgY29uc3QgY29udGFpbmVyID0gZXZlbnQudGFyZ2V0IGFzIEhUTUxFbGVtZW50O1xyXG4gICAgY29udGFpbmVyLmNsYXNzTGlzdC5yZW1vdmUoJ2RyYWdvdmVyJyk7XHJcbiAgfVxyXG5cclxuICBkZWxldGVJbWFnZSgpIHtcclxuICAgIHRoaXMuZmlsZSA9IG51bGw7XHJcbiAgICB0aGlzLmZpbGVTcmMgPSBudWxsO1xyXG4gICAgdGhpcy5kZWxldGVFbWl0LmVtaXQoKVxyXG4gIH1cclxufVxyXG4iLCI8ZGl2XHJcbiAgICAoZHJhZ292ZXIpPVwib25EcmFnT3ZlcigkZXZlbnQpXCJcclxuICAgIChkcmFnbGVhdmUpPVwib25EcmFnTGVhdmUoJGV2ZW50KVwiXHJcbiAgICAoZHJvcCk9XCJvbkRyb3AoJGV2ZW50KVwiXHJcbiAgICBjbGFzcz1cInJlbGF0aXZlIG92ZXJmbG93LWhpZGRlbiBib3JkZXItZGFzaGVkIGJvcmRlci0yIGJvcmRlci1yb3VuZC1sZyBib3JkZXItZ3JheS00MDAgZmxleCBqdXN0aWZ5LWNvbnRlbnQtZW5kXCJcclxuICAgIFtzdHlsZS53aWR0aF09XCJ3aWR0aENvbXBvbmVudFwiXHJcbiAgICBbc3R5bGUuaGVpZ2h0XT1cImhlaWdodENvbXBvbmVudFwiXHJcbj5cclxuXHJcbiAgICA8ZGl2XHJcbiAgICAgICAgY2xhc3M9XCJ3LWZ1bGwgZmxleCBhbGlnbi1pdGVtcy1jZW50ZXIganVzdGlmeS1jb250ZW50LWNlbnRlclwiXHJcbiAgICAgICAgc3R5bGU9XCJjdXJzb3I6IHBvaW50ZXI7XCJcclxuICAgICAgICAoY2xpY2spPVwiZmlsZUlucHV0LmNsaWNrKClcIlxyXG4gICAgPlxyXG4gICAgICAgIDxpbnB1dFxyXG4gICAgICAgICAgICB0eXBlPVwiZmlsZVwiXHJcbiAgICAgICAgICAgIChjaGFuZ2UpPVwib25GaWxlU2VsZWN0ZWQoJGV2ZW50KVwiXHJcbiAgICAgICAgICAgICNmaWxlSW5wdXRcclxuICAgICAgICAgICAgaGlkZGVuXHJcbiAgICAgICAgICAgIGFjY2VwdD1cImltYWdlLypcIlxyXG4gICAgICAgID5cclxuICAgICAgICA8ZGl2XHJcbiAgICAgICAgICAgICpuZ0lmPVwiIWZpbGVTcmNcIlxyXG4gICAgICAgICAgICBjbGFzcz1cImZsZXggZmxleC1jb2x1bW4gYWxpZ24taXRlbXMtY2VudGVyIGp1c3RpZnktY29udGVudC1jZW50ZXJcIlxyXG4gICAgICAgID5cclxuICAgICAgICAgICAgPHNwYW5cclxuICAgICAgICAgICAgICAgIGNsYXNzPVwibWF0ZXJpYWwtc3ltYm9scy1vdXRsaW5lZCBtdC0yXCJcclxuICAgICAgICAgICAgICAgIHN0eWxlPVwiZm9udC1zaXplOiAzcmVtO1wiXHJcbiAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgIGNsb3VkX3VwbG9hZFxyXG4gICAgICAgICAgICA8L3NwYW4+XHJcblxyXG4gICAgICAgICAgICBAaWYoZGVzY3JpcHRpb24pIHtcclxuICAgICAgICAgICAgPHAgY2xhc3M9XCJmb250LXNlbWlib2xkXCI+e3tkZXNjcmlwdGlvbn19PC9wPlxyXG4gICAgICAgICAgICB9IEBlbHNlIHtcclxuICAgICAgICAgICAgPHAgY2xhc3M9XCJmb250LXNlbWlib2xkXCI+QXJyYXN0ZSBlIHNvbHRlIHVtYSBpbWFnZW0gYXF1aSwgb3U8L3A+XHJcbiAgICAgICAgICAgIDxwIGNsYXNzPVwiZm9udC1zZW1pYm9sZFwiPmNsaXF1ZSBwYXJhIHNlbGVjaW9uw6EtbGE8L3A+XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGRpdiAqbmdJZj1cImZpbGVTcmMgfHwgZmlsZVwiPlxyXG4gICAgICAgICAgICA8aW1nXHJcbiAgICAgICAgICAgICAgICBbc3JjXT1cImZpbGVTcmNcIlxyXG4gICAgICAgICAgICAgICAgW2FsdF09XCJmaWxlPy5uYW1lXCJcclxuICAgICAgICAgICAgICAgIGNsYXNzPVwidy1mdWxsXCJcclxuICAgICAgICAgICAgICAgIFtzdHlsZS5tYXhIZWlnaHRdPVwibWF4SGVpZ2h0SW1hZ2VcIlxyXG4gICAgICAgICAgICA+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuXHJcbiAgICBAaWYoZmlsZVNyYyB8fCBmaWxlKSB7XHJcbiAgICAgICAgPGJ1dHRvblxyXG4gICAgICAgICAgICBzdHlsZT1cImJhY2tncm91bmQtY29sb3I6IHRyYW5zcGFyZW50O1wiXHJcbiAgICAgICAgICAgIHBCdXR0b25cclxuICAgICAgICAgICAgKGNsaWNrKT1cImRlbGV0ZUltYWdlKClcIlxyXG4gICAgICAgICAgICBjbGFzcz1cImFic29sdXRlIHRyYW5zaXRpb24tY29sb3JzIHRyYW5zaXRpb24tZHVyYXRpb24tNTAwIHRleHQtcmVkLTcwMCBob3Zlcjp0ZXh0LXJlZC01MDAgdy0ycmVtIGgtMnJlbVwiXHJcbiAgICAgICAgICAgIFt0ZXh0XT1cInRydWVcIlxyXG4gICAgICAgICAgICBbaWNvbl09XCIncGkgcGktdHJhc2gnXCJcclxuICAgICAgICA+XHJcbiAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgfVxyXG4gICAgXHJcblxyXG48L2Rpdj4iXX0=
119
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoia3YtaW1hZ2UtdXBsb2FkLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2tlZXZvLWNvbXBvbmVudHMvc3JjL2xpYi9jb21wb25lbnRzL2t2LWltYWdlLXVwbG9hZC9rdi1pbWFnZS11cGxvYWQuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMva2Vldm8tY29tcG9uZW50cy9zcmMvbGliL2NvbXBvbmVudHMva3YtaW1hZ2UtdXBsb2FkL2t2LWltYWdlLXVwbG9hZC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEVBQUUsU0FBUyxFQUFjLFlBQVksRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUM7Ozs7OztBQVFyRyxNQUFNLE9BQU8sc0JBQXNCO0lBRWpDLFlBQW9CLG1CQUF3QyxFQUFtQixrQkFBc0M7UUFBakcsd0JBQW1CLEdBQW5CLG1CQUFtQixDQUFxQjtRQUFtQix1QkFBa0IsR0FBbEIsa0JBQWtCLENBQW9CO1FBR3JILFNBQUksR0FBZ0IsSUFBSSxDQUFDO1FBQ2hCLFlBQU8sR0FBZ0MsSUFBSSxDQUFDO1FBRzVDLG1CQUFjLEdBQVcsT0FBTyxDQUFDO1FBQ2pDLG9CQUFlLEdBQVcsTUFBTSxDQUFDO1FBRzFDLGFBQVEsR0FBRyxLQUFLLENBQVUsS0FBSyxDQUFDLENBQUM7UUFDakMsYUFBUSxHQUFHLEtBQUssQ0FBUyxDQUFDLENBQUMsQ0FBQTtRQUMzQixjQUFTLEdBQUcsS0FBSyxDQUFTLENBQUMsQ0FBQyxDQUFBO1FBQzVCLGNBQVMsR0FBRyxLQUFLLENBQVUsS0FBSyxDQUFDLENBQUE7UUFHeEIsbUJBQWMsR0FBVyxPQUFPLENBQUM7UUFJaEMsYUFBUSxHQUFzQixJQUFJLFlBQVksRUFBRSxDQUFDO1FBQ2pELGVBQVUsR0FBc0IsSUFBSSxZQUFZ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QUMsV0FBVyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEltYWdlQ3V0dGVyU2VydmljZSB9IGZyb20gJy4vLi4vLi4vYXBpL3NlcnZpY2VzL2ltYWdlLmN1dHRlci5zZXJ2aWNlJztcclxuaW1wb3J0IHsgQ29tcG9uZW50LCBFbGVtZW50UmVmLCBFdmVudEVtaXR0ZXIsIGlucHV0LCBJbnB1dCwgT3V0cHV0LCBWaWV3Q2hpbGQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgTm90aWZpY2F0aW9uU2VydmljZSB9IGZyb20gJy4uLy4uL2FwaS9zZXJ2aWNlcy9ub3RpZmljYXRpb24uc2VydmljZSc7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ2t2LWltYWdlLXVwbG9hZCcsXHJcbiAgdGVtcGxhdGVVcmw6ICcuL2t2LWltYWdlLXVwbG9hZC5jb21wb25lbnQuaHRtbCcsXHJcbiAgc3R5bGVVcmw6ICcuL2t2LWltYWdlLXVwbG9hZC5jb21wb25lbnQuc2NzcydcclxufSlcclxuZXhwb3J0IGNsYXNzIEt2SW1hZ2VVcGxvYWRDb21wb25lbnQge1xyXG5cclxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIG5vdGlmaWNhdGlvblNlcnZpY2U6IE5vdGlmaWNhdGlvblNlcnZpY2UsIHByaXZhdGUgcmVhZG9ubHkgaW1hZ2VDdXR0ZXJTZXJ2aWNlOiBJbWFnZUN1dHRlclNlcnZpY2UpIHtcclxuXHJcbiAgfVxyXG4gIGZpbGU6IEZpbGUgfCBudWxsID0gbnVsbDtcclxuICBASW5wdXQoKSBmaWxlU3JjOiBzdHJpbmcgfCBBcnJheUJ1ZmZlciB8IG51bGwgPSBudWxsO1xyXG5cclxuXHJcbiAgQElucHV0KCkgd2lkdGhDb21wb25lbnQ6IHN0cmluZyA9ICc0MDBweCc7XHJcbiAgQElucHV0KCkgaGVpZ2h0Q29tcG9uZW50OiBzdHJpbmcgPSAnYXV0byc7XHJcblxyXG5cclxuICBjdXRJbWFnZSA9IGlucHV0PGJvb2xlYW4+KGZhbHNlKTtcclxuICBjdXRXaWR0aCA9IGlucHV0PG51bWJlcj4oMClcclxuICBjdXRIZWlnaHQgPSBpbnB1dDxudW1iZXI+KDApXHJcbiAgY3V0Q2lyY2xlID0gaW5wdXQ8Ym9vbGVhbj4oZmFsc2UpXHJcblxyXG5cclxuICBASW5wdXQoKSBtYXhIZWlnaHRJbWFnZTogc3RyaW5nID0gJzQwMHB4JztcclxuXHJcbiAgQElucHV0KCkgZGVzY3JpcHRpb24hOiBzdHJpbmc7XHJcblxyXG4gIEBPdXRwdXQoKSBmaWxlRW1pdDogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XHJcbiAgQE91dHB1dCgpIGRlbGV0ZUVtaXQ6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xyXG5cclxuICBAVmlld0NoaWxkKCdmaWxlSW5wdXQnKSBmaWxlSW5wdXQ/OiBFbGVtZW50UmVmO1xyXG5cclxuXHJcblxyXG5cclxuICBvbkRyYWdPdmVyKGV2ZW50OiBEcmFnRXZlbnQpIHtcclxuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcclxuICAgIHRoaXMuYWRkRHJhZ092ZXJDbGFzcyhldmVudCk7XHJcbiAgfVxyXG5cclxuICBvbkRyYWdMZWF2ZShldmVudDogRHJhZ0V2ZW50KSB7XHJcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XHJcbiAgICB0aGlzLnJlbW92ZURyYWdPdmVyQ2xhc3MoZXZlbnQpO1xyXG4gIH1cclxuXHJcbiAgb25Ecm9wKGV2ZW50OiBEcmFnRXZlbnQpIHtcclxuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcclxuICAgIHRoaXMucmVtb3ZlRHJhZ092ZXJDbGFzcyhldmVudCk7XHJcblxyXG4gICAgaWYgKGV2ZW50LmRhdGFUcmFuc2ZlciAmJiBldmVudC5kYXRhVHJhbnNmZXIuZmlsZXMubGVuZ3RoID4gMCkge1xyXG4gICAgICB0aGlzLmhhbmRsZUZpbGUoZXZlbnQuZGF0YVRyYW5zZmVyLmZpbGVzWzBdKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIG9uRmlsZVNlbGVjdGVkKGV2ZW50OiBFdmVudCkge1xyXG4gICAgY29uc3QgaW5wdXQgPSBldmVudC50YXJnZXQgYXMgSFRNTElucHV0RWxlbWVudDtcclxuXHJcbiAgICBpZiAoaW5wdXQuZmlsZXMgJiYgaW5wdXQuZmlsZXMubGVuZ3RoID4gMCkge1xyXG4gICAgICB0aGlzLmhhbmRsZUZpbGUoaW5wdXQuZmlsZXNbMF0pO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgaGFuZGxlRmlsZShmaWxlOiBGaWxlKSB7XHJcbiAgICBpZiAoZmlsZS50eXBlLnN0YXJ0c1dpdGgoJ2ltYWdlLycpKSB7XHJcblxyXG4gICAgICBpZih0aGlzLmN1dEltYWdlKCkgPT0gdHJ1ZSl7XHJcbiAgICAgICAgdGhpcy5maWxlID0gZmlsZTtcclxuXHJcbiAgICAgICAgY29uc3QgcmVhZGVyID0gbmV3IEZpbGVSZWFkZXIoKTtcclxuICAgICAgICAgIHJlYWRlci5vbmxvYWQgPSBhc3luYyAoKSA9PiB7XHJcbiAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLmltYWdlQ3V0dGVyU2VydmljZS5jdXQoXHJcbiAgICAgICAgICAgICAgICAgICAgcmVhZGVyLnJlc3VsdD8udG9TdHJpbmcoKSA/PyAnJyxcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmN1dFdpZHRoKCksXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jdXRIZWlnaHQoKSxcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmN1dENpcmNsZSgpXHJcbiAgICAgICAgICAgICAgICApO1xyXG5cclxuICAgICAgICAgICAgICAgIHRoaXMuZmlsZVNyYyA9IHJlc3VsdDtcclxuXHJcbiAgICAgICAgICAgICAgICB0aGlzLmZpbGVFbWl0LmVtaXQocmVzdWx0KVxyXG5cclxuICAgICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuZGVsZXRlSW1hZ2UoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH07XHJcbiAgICAgICAgcmVhZGVyLnJlYWRBc0RhdGFVUkwoZmlsZSk7XHJcblxyXG5cclxuXHJcblxyXG4gICAgICB9ZWxzZXtcclxuICAgICAgICAvLyA/ISBDb21wb3J0YW1uZXRvIHBhZHLDo28gLS0+IFByZXNlcnZhciA8LS0gISEhXHJcbiAgICAgICAgdGhpcy5maWxlID0gZmlsZTtcclxuICAgICAgICBjb25zdCByZWFkZXIgPSBuZXcgRmlsZVJlYWRlcigpO1xyXG4gICAgICAgIHJlYWRlci5vbmxvYWQgPSAoZSkgPT4ge1xyXG4gICAgICAgICAgdGhpcy5maWxlU3JjID0gcmVhZGVyLnJlc3VsdDtcclxuICAgICAgICB9O1xyXG4gICAgICAgIHJlYWRlci5yZWFkQXNEYXRhVVJMKGZpbGUpO1xyXG4gICAgICAgIHRoaXMuZmlsZUVtaXQuZW1pdChmaWxlKVxyXG5cclxuICAgICAgfVxyXG5cclxuXHJcblxyXG5cclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMubm90aWZpY2F0aW9uU2VydmljZS50b2FzdEVycm9yKCdBcGVuYXMgYXJxdWl2b3MgZGUgaW1hZ2VtIHPDo28gcGVybWl0aWRvcy4nKVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgYWRkRHJhZ092ZXJDbGFzcyhldmVudDogRHJhZ0V2ZW50KSB7XHJcbiAgICBjb25zdCBjb250YWluZXIgPSBldmVudC50YXJnZXQgYXMgSFRNTEVsZW1lbnQ7XHJcbiAgICBjb250YWluZXIuY2xhc3NMaXN0LmFkZCgnZHJhZ292ZXInKTtcclxuICB9XHJcblxyXG4gIHJlbW92ZURyYWdPdmVyQ2xhc3MoZXZlbnQ6IERyYWdFdmVudCkge1xyXG4gICAgY29uc3QgY29udGFpbmVyID0gZXZlbnQudGFyZ2V0IGFzIEhUTUxFbGVtZW50O1xyXG4gICAgY29udGFpbmVyLmNsYXNzTGlzdC5yZW1vdmUoJ2RyYWdvdmVyJyk7XHJcbiAgfVxyXG5cclxuICBkZWxldGVJbWFnZSgpIHtcclxuICAgIHRoaXMuZmlsZSA9IG51bGw7XHJcbiAgICB0aGlzLmZpbGVTcmMgPSBudWxsO1xyXG4gICAgaWYgKHRoaXMuZmlsZUlucHV0KSB7XHJcbiAgICAgIHRoaXMuZmlsZUlucHV0Lm5hdGl2ZUVsZW1lbnQudmFsdWUgPSAnJztcclxuICAgIH1cclxuICAgIHRoaXMuZGVsZXRlRW1pdC5lbWl0KCk7XHJcbiAgfVxyXG59XHJcbiIsIjxkaXZcclxuICAgIChkcmFnb3Zlcik9XCJvbkRyYWdPdmVyKCRldmVudClcIlxyXG4gICAgKGRyYWdsZWF2ZSk9XCJvbkRyYWdMZWF2ZSgkZXZlbnQpXCJcclxuICAgIChkcm9wKT1cIm9uRHJvcCgkZXZlbnQpXCJcclxuICAgIGNsYXNzPVwicmVsYXRpdmUgb3ZlcmZsb3ctaGlkZGVuIGJvcmRlci1kYXNoZWQgYm9yZGVyLTIgYm9yZGVyLXJvdW5kLWxnIGJvcmRlci1ncmF5LTQwMCBmbGV4IGp1c3RpZnktY29udGVudC1lbmRcIlxyXG4gICAgW3N0eWxlLndpZHRoXT1cIndpZHRoQ29tcG9uZW50XCJcclxuICAgIFtzdHlsZS5oZWlnaHRdPVwiaGVpZ2h0Q29tcG9uZW50XCJcclxuPlxyXG5cclxuICAgIDxkaXZcclxuICAgICAgICBjbGFzcz1cInctZnVsbCBmbGV4IGFsaWduLWl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNvbnRlbnQtY2VudGVyXCJcclxuICAgICAgICBzdHlsZT1cImN1cnNvcjogcG9pbnRlcjtcIlxyXG4gICAgICAgIChjbGljayk9XCJmaWxlSW5wdXQuY2xpY2soKVwiXHJcbiAgICA+XHJcbiAgICAgICAgPGlucHV0XHJcbiAgICAgICAgICAgIHR5cGU9XCJmaWxlXCJcclxuICAgICAgICAgICAgKGNoYW5nZSk9XCJvbkZpbGVTZWxlY3RlZCgkZXZlbnQpXCJcclxuICAgICAgICAgICAgI2ZpbGVJbnB1dFxyXG4gICAgICAgICAgICBoaWRkZW5cclxuICAgICAgICAgICAgYWNjZXB0PVwiaW1hZ2UvKlwiXHJcbiAgICAgICAgPlxyXG4gICAgICAgIDxkaXZcclxuICAgICAgICAgICAgKm5nSWY9XCIhZmlsZVNyY1wiXHJcbiAgICAgICAgICAgIGNsYXNzPVwiZmxleCBmbGV4LWNvbHVtbiBhbGlnbi1pdGVtcy1jZW50ZXIganVzdGlmeS1jb250ZW50LWNlbnRlclwiXHJcbiAgICAgICAgPlxyXG4gICAgICAgICAgICA8c3BhblxyXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJtYXRlcmlhbC1zeW1ib2xzLW91dGxpbmVkIG10LTJcIlxyXG4gICAgICAgICAgICAgICAgc3R5bGU9XCJmb250LXNpemU6IDNyZW07XCJcclxuICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgY2xvdWRfdXBsb2FkXHJcbiAgICAgICAgICAgIDwvc3Bhbj5cclxuXHJcbiAgICAgICAgICAgIEBpZihkZXNjcmlwdGlvbikge1xyXG4gICAgICAgICAgICA8cCBjbGFzcz1cImZvbnQtc2VtaWJvbGRcIj57e2Rlc2NyaXB0aW9ufX08L3A+XHJcbiAgICAgICAgICAgIH0gQGVsc2Uge1xyXG4gICAgICAgICAgICA8cCBjbGFzcz1cImZvbnQtc2VtaWJvbGRcIj5BcnJhc3RlIGUgc29sdGUgdW1hIGltYWdlbSBhcXVpLCBvdTwvcD5cclxuICAgICAgICAgICAgPHAgY2xhc3M9XCJmb250LXNlbWlib2xkXCI+Y2xpcXVlIHBhcmEgc2VsZWNpb27DoS1sYTwvcD5cclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8ZGl2ICpuZ0lmPVwiZmlsZVNyYyB8fCBmaWxlXCI+XHJcbiAgICAgICAgICAgIDxpbWdcclxuICAgICAgICAgICAgICAgIFtzcmNdPVwiZmlsZVNyY1wiXHJcbiAgICAgICAgICAgICAgICBbYWx0XT1cImZpbGU/Lm5hbWVcIlxyXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJ3LWZ1bGxcIlxyXG4gICAgICAgICAgICAgICAgW3N0eWxlLm1heEhlaWdodF09XCJtYXhIZWlnaHRJbWFnZVwiXHJcbiAgICAgICAgICAgID5cclxuICAgICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG5cclxuICAgIEBpZihmaWxlU3JjIHx8IGZpbGUpIHtcclxuICAgICAgICA8YnV0dG9uXHJcbiAgICAgICAgICAgIHN0eWxlPVwiYmFja2dyb3VuZC1jb2xvcjogdHJhbnNwYXJlbnQ7XCJcclxuICAgICAgICAgICAgcEJ1dHRvblxyXG4gICAgICAgICAgICAoY2xpY2spPVwiZGVsZXRlSW1hZ2UoKVwiXHJcbiAgICAgICAgICAgIGNsYXNzPVwiYWJzb2x1dGUgdHJhbnNpdGlvbi1jb2xvcnMgdHJhbnNpdGlvbi1kdXJhdGlvbi01MDAgdGV4dC1yZWQtNzAwIGhvdmVyOnRleHQtcmVkLTUwMCB3LTJyZW0gaC0ycmVtXCJcclxuICAgICAgICAgICAgW3RleHRdPVwidHJ1ZVwiXHJcbiAgICAgICAgICAgIFtpY29uXT1cIidwaSBwaS10cmFzaCdcIlxyXG4gICAgICAgID5cclxuICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICB9XHJcblxyXG5cclxuPC9kaXY+XHJcbiJdfQ==