keevo-components 2.0.257 → 2.0.259

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.
@@ -0,0 +1,2 @@
1
+ export * from './public-api';
2
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9wcm9qZWN0cy9rZWV2by1jb21wb25lbnRzL3NyYy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxjQUFjLGNBQWMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCAqIGZyb20gJy4vcHVibGljLWFwaSc7XHJcbiJdfQ==
@@ -0,0 +1,205 @@
1
+ import { Component, Input, Output, EventEmitter, ViewChild, input, computed } from '@angular/core';
2
+ import { CommonModule } from '@angular/common';
3
+ import { ButtonModule } from 'primeng/button';
4
+ import { KvProgressBarModule } from 'projects/keevo-components/src';
5
+ import * as i0 from "@angular/core";
6
+ import * as i1 from "../../api/services/notification.service";
7
+ import * as i2 from "@angular/common";
8
+ import * as i3 from "primeng/button";
9
+ export class KvFileUploadNewComponent {
10
+ // No topo da classe
11
+ constructor(notificationService) {
12
+ this.notificationService = notificationService;
13
+ this.widthComponent = '400px';
14
+ this.heightComponent = 'auto';
15
+ this.validFileTypes = ['image/', 'application/pdf', 'text/html', 'text/xml', 'application/xml', 'text/plain'];
16
+ this.tamanhoMaximoPermitido = '';
17
+ this.includeOfficeTypes = false; // Propriedade para controlar os tipos de Office
18
+ this.maxSizeFile = input(10);
19
+ this.fileEmit = new EventEmitter();
20
+ this.removeFileEmit = new EventEmitter();
21
+ // returnMbSize = computed(() => (bytes: any) => {
22
+ // if (bytes === null || bytes === undefined) {
23
+ // return '0 MB';
24
+ // }
25
+ // const mbSize = bytes / (1024 * 1024);
26
+ // return this.formatBytes(mbSize, 2);
27
+ // });
28
+ this.progressValue = computed(() => (bytes) => {
29
+ if (bytes === null || bytes === undefined) {
30
+ return 0;
31
+ }
32
+ const mbSize = bytes / (1024 * 1024);
33
+ let progressValue = (Number(mbSize) / this.maxSizeFile()) * 100;
34
+ // Limita o valor do progresso entre 0 e 100
35
+ return Math.min(Math.max(progressValue, 0), 100);
36
+ });
37
+ this.returnProgressLabel = computed(() => (bytes) => {
38
+ if (bytes === null || bytes === undefined) {
39
+ return '0 MB';
40
+ }
41
+ const mbSize = bytes / (1024 * 1024);
42
+ // let progressValue = (Number(mbSize) / this.maxSizeFile()) * 100;
43
+ // this.progressValue.set(progressValue);
44
+ // this.progressValue.set((mbSize / this.maxSizeFile())*100);
45
+ return `${mbSize.toFixed(2)}/${this.maxSizeFile()} MB`;
46
+ });
47
+ }
48
+ // Método para disparar o clique sem erro de propriedade
49
+ triggerClick() {
50
+ if (!this.formGroup.get(this.formControlName)?.value) {
51
+ this.fileInput.nativeElement.click();
52
+ }
53
+ }
54
+ onFileSelected(event) {
55
+ let validTypes = [...this.validFileTypes];
56
+ if (this.includeOfficeTypes) {
57
+ validTypes.push('application/msword', // .doc
58
+ 'application/vnd.openxmlformats-officedocument.wordprocessingml.document', // .docx
59
+ 'application/vnd.ms-powerpoint', // .ppt
60
+ 'application/vnd.openxmlformats-officedocument.presentationml.presentation' // .pptx
61
+ );
62
+ }
63
+ if (event.target.files.length == 0)
64
+ return;
65
+ const isValidFileType = validTypes.some(type => event.target.files[0].type.startsWith(type) ||
66
+ (type === 'application/xml' && event.target.files[0].type === 'application/xml') ||
67
+ (type === 'text/xml' && event.target.files[0].type === 'text/xml'));
68
+ if (!isValidFileType) {
69
+ this.notificationService.toastError('Tipo de arquivo inválido');
70
+ this.formGroup.controls[this.formControlName].setValue(null);
71
+ event.target.value = '';
72
+ return;
73
+ }
74
+ this.formGroup.controls[this.formControlName].setValue(event.target.files[0]);
75
+ this.fileEmit.emit(event.target.files[0]);
76
+ }
77
+ deleteFile() {
78
+ this.formGroup.controls[this.formControlName].setValue(null);
79
+ this.fileInput.nativeElement.value = '';
80
+ this.removeFileEmit.emit();
81
+ }
82
+ formatBytes(bytes, decimals = 2) {
83
+ if (!bytes) {
84
+ return "0 Bytes";
85
+ }
86
+ const k = 1024;
87
+ const dm = decimals <= 0 ? 0 : decimals;
88
+ const sizes = ["Bytes", "KB", "MB", "GB", "TB", "PB", "EB", "ZB", "YB"];
89
+ const i = Math.floor(Math.log(bytes) / Math.log(k));
90
+ return parseFloat((bytes / Math.pow(k, i)).toFixed(dm)) + " " + sizes[i];
91
+ }
92
+ addDragOverClass(event) {
93
+ const container = event.target;
94
+ container.classList.add('dragover');
95
+ }
96
+ removeDragOverClass(event) {
97
+ const container = event.target;
98
+ container.classList.remove('dragover');
99
+ }
100
+ handleFile(file) {
101
+ if (this.includeOfficeTypes) {
102
+ let validTypes = [...this.validFileTypes];
103
+ validTypes.push('application/msword', // .doc
104
+ 'application/vnd.openxmlformats-officedocument.wordprocessingml.document', // .docx
105
+ 'application/vnd.ms-powerpoint', // .ppt
106
+ 'application/vnd.openxmlformats-officedocument.presentationml.presentation' // .pptx
107
+ );
108
+ }
109
+ const isValidFileType = this.validFileTypes.some(type => file.type.startsWith(type) ||
110
+ file.type === 'application/xml' ||
111
+ file.type === 'text/xml');
112
+ if (!isValidFileType) {
113
+ this.notificationService.toastError('Tipo de arquivo inválido');
114
+ this.formGroup.controls[this.formControlName].setValue(null);
115
+ return;
116
+ }
117
+ this.formGroup.controls[this.formControlName].setValue(file);
118
+ const reader = new FileReader();
119
+ if (file.type.startsWith('image/')) {
120
+ reader.readAsDataURL(file);
121
+ }
122
+ else if (file.type === 'application/xml' || file.type === 'text/xml') {
123
+ reader.readAsText(file);
124
+ }
125
+ else {
126
+ reader.readAsArrayBuffer(file);
127
+ }
128
+ this.fileEmit.emit(file);
129
+ }
130
+ onDragOver(event) {
131
+ event.preventDefault();
132
+ event.stopPropagation();
133
+ this.addDragOverClass(event);
134
+ }
135
+ onDragLeave(event) {
136
+ event.preventDefault();
137
+ event.stopPropagation();
138
+ this.removeDragOverClass(event);
139
+ }
140
+ onDrop(event) {
141
+ event.preventDefault();
142
+ event.stopPropagation();
143
+ this.removeDragOverClass(event);
144
+ if (event.dataTransfer && event.dataTransfer.files.length > 0) {
145
+ this.handleFile(event.dataTransfer.files[0]);
146
+ }
147
+ }
148
+ setAccept() {
149
+ let types = '';
150
+ this.validFileTypes.forEach(type => {
151
+ if (type.includes('image'))
152
+ types += '.jpg, .png, .bmp, ';
153
+ if (type.includes('html'))
154
+ types += '.html, ';
155
+ if (type.includes('pdf'))
156
+ types += '.pdf, ';
157
+ if (type.includes('xml'))
158
+ types += '.xml, ';
159
+ if (type.includes('plain'))
160
+ types += '.txt, ';
161
+ });
162
+ // Adiciona tipos de arquivos do Office se includeOfficeTypes for true
163
+ if (this.includeOfficeTypes) {
164
+ types += '.doc, .docx, .ppt, .pptx, ';
165
+ }
166
+ return types.slice(0, -2); // Remove a última vírgula e espaço
167
+ }
168
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.8", ngImport: i0, type: KvFileUploadNewComponent, deps: [{ token: i1.NotificationService }], target: i0.ɵɵFactoryTarget.Component }); }
169
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "17.3.8", type: KvFileUploadNewComponent, isStandalone: true, selector: "kv-file-upload-new", inputs: { formGroup: { classPropertyName: "formGroup", publicName: "formGroup", isSignal: false, isRequired: false, transformFunction: null }, formControlName: { classPropertyName: "formControlName", publicName: "formControlName", 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 }, description: { classPropertyName: "description", publicName: "description", isSignal: false, isRequired: false, transformFunction: null }, validFileTypes: { classPropertyName: "validFileTypes", publicName: "validFileTypes", isSignal: false, isRequired: false, transformFunction: null }, tamanhoMaximoPermitido: { classPropertyName: "tamanhoMaximoPermitido", publicName: "tamanhoMaximoPermitido", isSignal: false, isRequired: false, transformFunction: null }, includeOfficeTypes: { classPropertyName: "includeOfficeTypes", publicName: "includeOfficeTypes", isSignal: false, isRequired: false, transformFunction: null }, maxSizeFile: { classPropertyName: "maxSizeFile", publicName: "maxSizeFile", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { fileEmit: "fileEmit", removeFileEmit: "removeFileEmit" }, viewQueries: [{ propertyName: "fileInput", first: true, predicate: ["fileInput"], descendants: true }, { propertyName: "inputUpload", first: true, predicate: ["inputUpload"], descendants: true }], ngImport: i0, template: "<div\r\n *ngIf=\"formGroup\"\r\n class=\"file-upload-container w-full\"\r\n [ngClass]=\"{\r\n 'invalid-border':\r\n formGroup.get(formControlName)?.invalid &&\r\n formGroup.get(formControlName)?.touched,\r\n 'has-file': formGroup.get(formControlName)?.value,\r\n }\"\r\n (dragover)=\"onDragOver($event)\"\r\n (dragleave)=\"onDragLeave($event)\"\r\n (drop)=\"onDrop($event)\"\r\n (click)=\"triggerClick()\"\r\n [style.width]=\"widthComponent\"\r\n>\r\n <input\r\n type=\"file\"\r\n #fileInput\r\n (change)=\"onFileSelected($event)\"\r\n [accept]=\"setAccept()\"\r\n hidden\r\n />\r\n\r\n <div *ngIf=\"!formGroup.get(formControlName)?.value\" class=\"dropzone-content\">\r\n <div class=\"cloud-icon-wrapper\">\r\n <span class=\"material-symbols-outlined\">cloud_upload</span>\r\n </div>\r\n <div class=\"text-center\">\r\n <p class=\"main-text\">\r\n <span class=\"blue-text\">Clique para selecionar</span> ou arraste aqui\r\n </p>\r\n <p class=\"sub-text\">PDF, Imagens (max. {{ maxSizeFile() }}MB)</p>\r\n </div>\r\n </div>\r\n\r\n <div\r\n *ngIf=\"formGroup.get(formControlName)?.value as file\"\r\n class=\"selected-file-card\"\r\n >\r\n <div class=\"card-header\">\r\n <div class=\"file-info\">\r\n <span class=\"material-symbols-outlined file-icon\">description</span>\r\n <span class=\"file-name\" [title]=\"file.name\">{{ file.name }}</span>\r\n </div>\r\n <button\r\n pButton\r\n icon=\"pi pi-times\"\r\n class=\"p-button-rounded p-button-text p-button-danger close-btn\"\r\n (click)=\"deleteFile(); $event.stopPropagation()\"\r\n ></button>\r\n </div>\r\n\r\n <div class=\"card-footer\">\r\n <div class=\"progress-container\">\r\n <div\r\n class=\"progress-bar\"\r\n [style.width.%]=\"progressValue()(file.size)\"\r\n [class.limit-exceeded]=\"progressValue()(file.size) >= 100\"\r\n ></div>\r\n </div>\r\n <div class=\"flex justify-content-between align-items-center mt-1\">\r\n <small class=\"error-text\" *ngIf=\"progressValue()(file.size) >= 100\"\r\n >Limite excedido</small\r\n >\r\n <span class=\"file-size-label ml-auto\">{{\r\n formatBytes(file.size)\r\n }}</span>\r\n </div>\r\n </div>\r\n </div>\r\n</div>\r\n\r\n<p\r\n *ngIf=\"\r\n formGroup.get(formControlName)?.invalid &&\r\n formGroup.get(formControlName)?.touched\r\n \"\r\n class=\"error-message\"\r\n>\r\n Campo obrigat\u00F3rio\r\n</p>\r\n", styles: [".file-upload-container{border:2px dashed #cbd5e1;border-radius:1.25rem;background-color:#f8fafc;min-height:160px;display:flex;align-items:center;justify-content:center;cursor:pointer;transition:all .2s ease-in-out;position:relative}.file-upload-container:hover,.file-upload-container.dragover{border-color:#3b82f6;background-color:#eff6ff}.file-upload-container.has-file{cursor:default;background-color:#f1f5f9;padding:0;border-style:solid}.selected-file-card{background:#fff;border-radius:1.25rem;padding:1.5rem;width:100%;height:100%;min-height:160px;box-shadow:0 10px 15px -3px #0000001a,0 4px 6px -2px #0000000d;display:flex;flex-direction:column;justify-content:center;gap:1rem;animation:fadeIn .3s ease-out;box-sizing:border-box}.selected-file-card .card-header{display:flex;justify-content:space-between;align-items:center}.selected-file-card .card-header .file-info{display:flex;align-items:center;gap:.75rem;overflow:hidden}.selected-file-card .card-header .file-info .file-icon{color:#64748b;font-size:24px}.selected-file-card .card-header .file-info .file-name{font-size:1rem;font-weight:500;color:#334155;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.selected-file-card .card-header .close-btn{width:32px!important;height:32px!important;padding:0!important}.selected-file-card .card-header .close-btn ::ng-deep .p-button-icon{font-size:1rem}.selected-file-card .card-footer .progress-container{height:8px;background:#e2e8f0;border-radius:10px;overflow:hidden}.selected-file-card .card-footer .progress-container .progress-bar{height:100%;background:#3b82f6;transition:width .4s cubic-bezier(.4,0,.2,1)}.selected-file-card .card-footer .progress-container .progress-bar.limit-exceeded{background:#ef4444}.selected-file-card .card-footer .file-size-label{font-size:.85rem;color:#94a3b8;font-weight:500}.selected-file-card .card-footer .error-text{color:#ef4444;font-size:.75rem;font-weight:600}@keyframes fadeIn{0%{opacity:0;transform:translateY(10px)}to{opacity:1;transform:translateY(0)}}::ng-deep .file-upload-container .p-button.p-button-text{background-color:transparent!important;border:none}::ng-deep .file-upload-container .p-button.p-button-text:hover{background-color:#fee2e2!important}.cloud-icon-wrapper{background-color:#e0f2fe;color:#3b82f6;width:48px;height:48px;border-radius:50%;display:flex;align-items:center;justify-content:center;margin:0 auto .75rem}.cloud-icon-wrapper span{font-size:24px}.main-text{font-size:.9rem;color:#334155}.main-text .blue-text{color:#3b82f6;font-weight:600}.sub-text{color:#64748b;font-size:.8rem}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: KvProgressBarModule }, { kind: "ngmodule", type: ButtonModule }, { kind: "directive", type: i3.ButtonDirective, selector: "[pButton]", inputs: ["iconPos", "loadingIcon", "label", "icon", "loading", "severity", "raised", "rounded", "text", "outlined", "size", "plain"] }] }); }
170
+ }
171
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.8", ngImport: i0, type: KvFileUploadNewComponent, decorators: [{
172
+ type: Component,
173
+ args: [{ selector: 'kv-file-upload-new', standalone: true, imports: [
174
+ CommonModule,
175
+ KvProgressBarModule,
176
+ ButtonModule
177
+ ], template: "<div\r\n *ngIf=\"formGroup\"\r\n class=\"file-upload-container w-full\"\r\n [ngClass]=\"{\r\n 'invalid-border':\r\n formGroup.get(formControlName)?.invalid &&\r\n formGroup.get(formControlName)?.touched,\r\n 'has-file': formGroup.get(formControlName)?.value,\r\n }\"\r\n (dragover)=\"onDragOver($event)\"\r\n (dragleave)=\"onDragLeave($event)\"\r\n (drop)=\"onDrop($event)\"\r\n (click)=\"triggerClick()\"\r\n [style.width]=\"widthComponent\"\r\n>\r\n <input\r\n type=\"file\"\r\n #fileInput\r\n (change)=\"onFileSelected($event)\"\r\n [accept]=\"setAccept()\"\r\n hidden\r\n />\r\n\r\n <div *ngIf=\"!formGroup.get(formControlName)?.value\" class=\"dropzone-content\">\r\n <div class=\"cloud-icon-wrapper\">\r\n <span class=\"material-symbols-outlined\">cloud_upload</span>\r\n </div>\r\n <div class=\"text-center\">\r\n <p class=\"main-text\">\r\n <span class=\"blue-text\">Clique para selecionar</span> ou arraste aqui\r\n </p>\r\n <p class=\"sub-text\">PDF, Imagens (max. {{ maxSizeFile() }}MB)</p>\r\n </div>\r\n </div>\r\n\r\n <div\r\n *ngIf=\"formGroup.get(formControlName)?.value as file\"\r\n class=\"selected-file-card\"\r\n >\r\n <div class=\"card-header\">\r\n <div class=\"file-info\">\r\n <span class=\"material-symbols-outlined file-icon\">description</span>\r\n <span class=\"file-name\" [title]=\"file.name\">{{ file.name }}</span>\r\n </div>\r\n <button\r\n pButton\r\n icon=\"pi pi-times\"\r\n class=\"p-button-rounded p-button-text p-button-danger close-btn\"\r\n (click)=\"deleteFile(); $event.stopPropagation()\"\r\n ></button>\r\n </div>\r\n\r\n <div class=\"card-footer\">\r\n <div class=\"progress-container\">\r\n <div\r\n class=\"progress-bar\"\r\n [style.width.%]=\"progressValue()(file.size)\"\r\n [class.limit-exceeded]=\"progressValue()(file.size) >= 100\"\r\n ></div>\r\n </div>\r\n <div class=\"flex justify-content-between align-items-center mt-1\">\r\n <small class=\"error-text\" *ngIf=\"progressValue()(file.size) >= 100\"\r\n >Limite excedido</small\r\n >\r\n <span class=\"file-size-label ml-auto\">{{\r\n formatBytes(file.size)\r\n }}</span>\r\n </div>\r\n </div>\r\n </div>\r\n</div>\r\n\r\n<p\r\n *ngIf=\"\r\n formGroup.get(formControlName)?.invalid &&\r\n formGroup.get(formControlName)?.touched\r\n \"\r\n class=\"error-message\"\r\n>\r\n Campo obrigat\u00F3rio\r\n</p>\r\n", styles: [".file-upload-container{border:2px dashed #cbd5e1;border-radius:1.25rem;background-color:#f8fafc;min-height:160px;display:flex;align-items:center;justify-content:center;cursor:pointer;transition:all .2s ease-in-out;position:relative}.file-upload-container:hover,.file-upload-container.dragover{border-color:#3b82f6;background-color:#eff6ff}.file-upload-container.has-file{cursor:default;background-color:#f1f5f9;padding:0;border-style:solid}.selected-file-card{background:#fff;border-radius:1.25rem;padding:1.5rem;width:100%;height:100%;min-height:160px;box-shadow:0 10px 15px -3px #0000001a,0 4px 6px -2px #0000000d;display:flex;flex-direction:column;justify-content:center;gap:1rem;animation:fadeIn .3s ease-out;box-sizing:border-box}.selected-file-card .card-header{display:flex;justify-content:space-between;align-items:center}.selected-file-card .card-header .file-info{display:flex;align-items:center;gap:.75rem;overflow:hidden}.selected-file-card .card-header .file-info .file-icon{color:#64748b;font-size:24px}.selected-file-card .card-header .file-info .file-name{font-size:1rem;font-weight:500;color:#334155;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.selected-file-card .card-header .close-btn{width:32px!important;height:32px!important;padding:0!important}.selected-file-card .card-header .close-btn ::ng-deep .p-button-icon{font-size:1rem}.selected-file-card .card-footer .progress-container{height:8px;background:#e2e8f0;border-radius:10px;overflow:hidden}.selected-file-card .card-footer .progress-container .progress-bar{height:100%;background:#3b82f6;transition:width .4s cubic-bezier(.4,0,.2,1)}.selected-file-card .card-footer .progress-container .progress-bar.limit-exceeded{background:#ef4444}.selected-file-card .card-footer .file-size-label{font-size:.85rem;color:#94a3b8;font-weight:500}.selected-file-card .card-footer .error-text{color:#ef4444;font-size:.75rem;font-weight:600}@keyframes fadeIn{0%{opacity:0;transform:translateY(10px)}to{opacity:1;transform:translateY(0)}}::ng-deep .file-upload-container .p-button.p-button-text{background-color:transparent!important;border:none}::ng-deep .file-upload-container .p-button.p-button-text:hover{background-color:#fee2e2!important}.cloud-icon-wrapper{background-color:#e0f2fe;color:#3b82f6;width:48px;height:48px;border-radius:50%;display:flex;align-items:center;justify-content:center;margin:0 auto .75rem}.cloud-icon-wrapper span{font-size:24px}.main-text{font-size:.9rem;color:#334155}.main-text .blue-text{color:#3b82f6;font-weight:600}.sub-text{color:#64748b;font-size:.8rem}\n"] }]
178
+ }], ctorParameters: () => [{ type: i1.NotificationService }], propDecorators: { formGroup: [{
179
+ type: Input
180
+ }], formControlName: [{
181
+ type: Input
182
+ }], widthComponent: [{
183
+ type: Input
184
+ }], heightComponent: [{
185
+ type: Input
186
+ }], description: [{
187
+ type: Input
188
+ }], validFileTypes: [{
189
+ type: Input
190
+ }], tamanhoMaximoPermitido: [{
191
+ type: Input
192
+ }], includeOfficeTypes: [{
193
+ type: Input
194
+ }], fileEmit: [{
195
+ type: Output
196
+ }], removeFileEmit: [{
197
+ type: Output
198
+ }], fileInput: [{
199
+ type: ViewChild,
200
+ args: ['fileInput']
201
+ }], inputUpload: [{
202
+ type: ViewChild,
203
+ args: ['inputUpload']
204
+ }] } });
205
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoia3YtZmlsZS11cGxvYWQtbmV3LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2tlZXZvLWNvbXBvbmVudHMvc3JjL2xpYi9jb21wb25lbnRzL2t2LWZpbGUtdXBsb2FkLW5ldy9rdi1maWxlLXVwbG9hZC1uZXcuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMva2Vldm8tY29tcG9uZW50cy9zcmMvbGliL2NvbXBvbmVudHMva3YtZmlsZS11cGxvYWQtbmV3L2t2LWZpbGUtdXBsb2FkLW5ldy5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsWUFBWSxFQUFFLFNBQVMsRUFBYyxLQUFLLEVBQUUsUUFBUSxFQUFVLE1BQU0sZUFBZSxDQUFDO0FBR3ZILE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDOUMsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sK0JBQStCLENBQUM7Ozs7O0FBYXBFLE1BQU0sT0FBTyx3QkFBd0I7SUFpQm5DLG9CQUFvQjtJQUVwQixZQUFvQixtQkFBd0M7UUFBeEMsd0JBQW1CLEdBQW5CLG1CQUFtQixDQUFxQjtRQWhCbkQsbUJBQWMsR0FBVyxPQUFPLENBQUM7UUFDakMsb0JBQWUsR0FBVyxNQUFNLENBQUM7UUFFakMsbUJBQWMsR0FBYSxDQUFDLFFBQVEsRUFBRSxpQkFBaUIsRUFBRSxXQUFXLEVBQUUsVUFBVSxFQUFFLGlCQUFpQixFQUFFLFlBQVksQ0FBQyxDQUFDO1FBQ25ILDJCQUFzQixHQUFXLEVBQUUsQ0FBQztRQUNwQyx1QkFBa0IsR0FBWSxLQUFLLENBQUMsQ0FBQyxnREFBZ0Q7UUFFOUYsZ0JBQVcsR0FBRyxLQUFLLENB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SUFBSSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUM7Z0JBQUUsS0FBSyxJQUFJLFFBQVEsQ0FBQztRQUNoRCxDQUFDLENBQUMsQ0FBQztRQUVILHNFQUFzRTtRQUN0RSxJQUFJLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO1lBQzVCLEtBQUssSUFBSSw0QkFBNEIsQ0FBQztRQUN4QyxDQUFDO1FBRUQsT0FBTyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsbUNBQW1DO0lBQ2hFLENBQUM7OEdBek1VLHdCQUF3QjtrR0FBeEIsd0JBQXdCLGdxRENsQnJDLHlpRkFpRkEsbWtGRHRFSSxZQUFZLGdPQUNaLG1CQUFtQiw4QkFDbkIsWUFBWTs7MkZBS0gsd0JBQXdCO2tCQVhwQyxTQUFTOytCQUNFLG9CQUFvQixjQUNsQixJQUFJLFdBQ1A7d0JBQ1AsWUFBWTt3QkFDWixtQkFBbUI7d0JBQ25CLFlBQVk7cUJBQ2I7d0ZBS1EsU0FBUztzQkFBakIsS0FBSztnQkFDRyxlQUFlO3NCQUF2QixLQUFLO2dCQUNHLGNBQWM7c0JBQXRCLEtBQUs7Z0JBQ0csZUFBZTtzQkFBdkIsS0FBSztnQkFDRyxXQUFXO3NCQUFuQixLQUFLO2dCQUNHLGNBQWM7c0JBQXRCLEtBQUs7Z0JBQ0csc0JBQXNCO3NCQUE5QixLQUFLO2dCQUNHLGtCQUFrQjtzQkFBMUIsS0FBSztnQkFJSSxRQUFRO3NCQUFqQixNQUFNO2dCQUNHLGNBQWM7c0JBQXZCLE1BQU07Z0JBRWlCLFNBQVM7c0JBQWhDLFNBQVM7dUJBQUMsV0FBVztnQkFDSSxXQUFXO3NCQUFwQyxTQUFTO3VCQUFDLGFBQWEiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIElucHV0LCBPdXRwdXQsIEV2ZW50RW1pdHRlciwgVmlld0NoaWxkLCBFbGVtZW50UmVmLCBpbnB1dCwgY29tcHV0ZWQsIHNpZ25hbCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBGb3JtR3JvdXAgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XHJcbmltcG9ydCB7IE5vdGlmaWNhdGlvblNlcnZpY2UgfSBmcm9tICcuLi8uLi9hcGkvc2VydmljZXMvbm90aWZpY2F0aW9uLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xyXG5pbXBvcnQgeyBCdXR0b25Nb2R1bGUgfSBmcm9tICdwcmltZW5nL2J1dHRvbic7XHJcbmltcG9ydCB7IEt2UHJvZ3Jlc3NCYXJNb2R1bGUgfSBmcm9tICdwcm9qZWN0cy9rZWV2by1jb21wb25lbnRzL3NyYyc7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ2t2LWZpbGUtdXBsb2FkLW5ldycsXHJcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcclxuICBpbXBvcnRzOiBbXHJcbiAgICBDb21tb25Nb2R1bGUsXHJcbiAgICBLdlByb2dyZXNzQmFyTW9kdWxlLCBcclxuICAgIEJ1dHRvbk1vZHVsZVxyXG4gIF0sXHJcbiAgdGVtcGxhdGVVcmw6ICcuL2t2LWZpbGUtdXBsb2FkLW5ldy5jb21wb25lbnQuaHRtbCcsXHJcbiAgc3R5bGVVcmw6ICcuL2t2LWZpbGUtdXBsb2FkLW5ldy5jb21wb25lbnQuc2NzcydcclxufSlcclxuZXhwb3J0IGNsYXNzIEt2RmlsZVVwbG9hZE5ld0NvbXBvbmVudCB7XHJcbiAgQElucHV0KCkgZm9ybUdyb3VwITogRm9ybUdyb3VwO1xyXG4gIEBJbnB1dCgpIGZvcm1Db250cm9sTmFtZSE6IHN0cmluZztcclxuICBASW5wdXQoKSB3aWR0aENvbXBvbmVudDogc3RyaW5nID0gJzQwMHB4JztcclxuICBASW5wdXQoKSBoZWlnaHRDb21wb25lbnQ6IHN0cmluZyA9ICdhdXRvJztcclxuICBASW5wdXQoKSBkZXNjcmlwdGlvbiE6IHN0cmluZztcclxuICBASW5wdXQoKSB2YWxpZEZpbGVUeXBlczogc3RyaW5nW10gPSBbJ2ltYWdlLycsICdhcHBsaWNhdGlvbi9wZGYnLCAndGV4dC9odG1sJywgJ3RleHQveG1sJywgJ2FwcGxpY2F0aW9uL3htbCcsICd0ZXh0L3BsYWluJ107XHJcbiAgQElucHV0KCkgdGFtYW5ob01heGltb1Blcm1pdGlkbzogc3RyaW5nID0gJyc7XHJcbiAgQElucHV0KCkgaW5jbHVkZU9mZmljZVR5cGVzOiBib29sZWFuID0gZmFsc2U7IC8vIFByb3ByaWVkYWRlIHBhcmEgY29udHJvbGFyIG9zIHRpcG9zIGRlIE9mZmljZVxyXG5cclxuICBtYXhTaXplRmlsZSA9IGlucHV0PG51bWJlcj4oMTApXHJcblxyXG4gIEBPdXRwdXQoKSBmaWxlRW1pdDogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XHJcbiAgQE91dHB1dCgpIHJlbW92ZUZpbGVFbWl0OiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcclxuXHJcbiAgQFZpZXdDaGlsZCgnZmlsZUlucHV0JykgZmlsZUlucHV0ITogRWxlbWVudFJlZjxIVE1MSW5wdXRFbGVtZW50PjtcclxuICBAVmlld0NoaWxkKCdpbnB1dFVwbG9hZCcpIGlucHV0VXBsb2FkITogRWxlbWVudFJlZjtcclxuICAvLyBObyB0b3BvIGRhIGNsYXNzZVxyXG5cclxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIG5vdGlmaWNhdGlvblNlcnZpY2U6IE5vdGlmaWNhdGlvblNlcnZpY2UpIHsgfVxyXG5cclxuICAvLyBNw6l0b2RvIHBhcmEgZGlzcGFyYXIgbyBjbGlxdWUgc2VtIGVycm8gZGUgcHJvcHJpZWRhZGVcclxuICB0cmlnZ2VyQ2xpY2soKSB7XHJcbiAgICBpZiAoIXRoaXMuZm9ybUdyb3VwLmdldCh0aGlzLmZvcm1Db250cm9sTmFtZSk/LnZhbHVlKSB7XHJcbiAgICAgIHRoaXMuZmlsZUlucHV0Lm5hdGl2ZUVsZW1lbnQuY2xpY2soKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIG9uRmlsZVNlbGVjdGVkKGV2ZW50OiBhbnkpOiB2b2lkIHtcclxuICAgIGxldCB2YWxpZFR5cGVzID0gWy4uLnRoaXMudmFsaWRGaWxlVHlwZXNdO1xyXG5cclxuICAgIGlmICh0aGlzLmluY2x1ZGVPZmZpY2VUeXBlcykge1xyXG5cclxuICAgICAgdmFsaWRUeXBlcy5wdXNoKFxyXG4gICAgICAgICdhcHBsaWNhdGlvbi9tc3dvcmQnLCAvLyAuZG9jXHJcbiAgICAgICAgJ2FwcGxpY2F0aW9uL3ZuZC5vcGVueG1sZm9ybWF0cy1vZmZpY2Vkb2N1bWVudC53b3JkcHJvY2Vzc2luZ21sLmRvY3VtZW50JywgLy8gLmRvY3hcclxuICAgICAgICAnYXBwbGljYXRpb24vdm5kLm1zLXBvd2VycG9pbnQnLCAvLyAucHB0XHJcbiAgICAgICAgJ2FwcGxpY2F0aW9uL3ZuZC5vcGVueG1sZm9ybWF0cy1vZmZpY2Vkb2N1bWVudC5wcmVzZW50YXRpb25tbC5wcmVzZW50YXRpb24nIC8vIC5wcHR4XHJcbiAgICAgICk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKGV2ZW50LnRhcmdldC5maWxlcy5sZW5ndGggPT0gMCkgcmV0dXJuO1xyXG5cclxuICAgIGNvbnN0IGlzVmFsaWRGaWxlVHlwZSA9IHZhbGlkVHlwZXMuc29tZSh0eXBlID0+IGV2ZW50LnRhcmdldC5maWxlc1swXS50eXBlLnN0YXJ0c1dpdGgodHlwZSkgfHxcclxuICAgICAgKHR5cGUgPT09ICdhcHBsaWNhdGlvbi94bWwnICYmIGV2ZW50LnRhcmdldC5maWxlc1swXS50eXBlID09PSAnYXBwbGljYXRpb24veG1sJykgfHxcclxuICAgICAgKHR5cGUgPT09ICd0ZXh0L3htbCcgJiYgZXZlbnQudGFyZ2V0LmZpbGVzWzBdLnR5cGUgPT09ICd0ZXh0L3htbCcpXHJcbiAgICApO1xyXG5cclxuICAgIGlmICghaXNWYWxpZEZpbGVUeXBlKSB7XHJcbiAgICAgIHRoaXMubm90aWZpY2F0aW9uU2VydmljZS50b2FzdEVycm9yKCdUaXBvIGRlIGFycXVpdm8gaW52w6FsaWRvJyk7XHJcbiAgICAgIHRoaXMuZm9ybUdyb3VwLmNvbnRyb2xzW3RoaXMuZm9ybUNvbnRyb2xOYW1lXS5zZXRWYWx1ZShudWxsKTtcclxuXHJcbiAgICAgIGV2ZW50LnRhcmdldC52YWx1ZSA9ICcnO1xyXG5cclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuZm9ybUdyb3VwLmNvbnRyb2xzW3RoaXMuZm9ybUNvbnRyb2xOYW1lXS5zZXRWYWx1ZShldmVudC50YXJnZXQuZmlsZXNbMF0pO1xyXG4gICAgdGhpcy5maWxlRW1pdC5lbWl0KGV2ZW50LnRhcmdldC5maWxlc1swXSk7XHJcbiAgfVxyXG5cclxuICBkZWxldGVGaWxlKCkge1xyXG4gICAgdGhpcy5mb3JtR3JvdXAuY29udHJvbHNbdGhpcy5mb3JtQ29udHJvbE5hbWVdLnNldFZhbHVlKG51bGwpO1xyXG4gICAgdGhpcy5maWxlSW5wdXQubmF0aXZlRWxlbWVudC52YWx1ZSA9ICcnO1xyXG4gICAgdGhpcy5yZW1vdmVGaWxlRW1pdC5lbWl0KCk7XHJcbiAgfVxyXG5cclxuICAvLyByZXR1cm5NYlNpemUgPSBjb21wdXRlZCgoKSA9PiAoYnl0ZXM6IGFueSkgPT4ge1xyXG4gIC8vICAgaWYgKGJ5dGVzID09PSBudWxsIHx8IGJ5dGVzID09PSB1bmRlZmluZWQpIHtcclxuICAvLyAgICAgcmV0dXJuICcwIE1CJztcclxuICAvLyAgIH1cclxuXHJcbiAgLy8gICBjb25zdCBtYlNpemUgPSBieXRlcyAvICgxMDI0ICogMTAyNCk7XHJcblxyXG4gIC8vICAgcmV0dXJuIHRoaXMuZm9ybWF0Qnl0ZXMobWJTaXplLCAyKTtcclxuICAvLyB9KTtcclxuXHJcbiAgcHJvZ3Jlc3NWYWx1ZSA9IGNvbXB1dGVkKCgpID0+IChieXRlczogYW55KSA9PiB7XHJcbiAgICBpZiAoYnl0ZXMgPT09IG51bGwgfHwgYnl0ZXMgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICByZXR1cm4gMDtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBtYlNpemUgPSBieXRlcyAvICgxMDI0ICogMTAyNCk7XHJcbiAgICBsZXQgcHJvZ3Jlc3NWYWx1ZSA9IChOdW1iZXIobWJTaXplKSAvIHRoaXMubWF4U2l6ZUZpbGUoKSkgKiAxMDA7XHJcblxyXG4gICAgLy8gTGltaXRhIG8gdmFsb3IgZG8gcHJvZ3Jlc3NvIGVudHJlIDAgZSAxMDBcclxuICAgIHJldHVybiBNYXRoLm1pbihNYXRoLm1heChwcm9ncmVzc1ZhbHVlLCAwKSwgMTAwKTtcclxuICB9KTtcclxuXHJcbiAgcmV0dXJuUHJvZ3Jlc3NMYWJlbCA9IGNvbXB1dGVkKCgpID0+IChieXRlczogYW55KSA9PiB7XHJcbiAgICBpZiAoYnl0ZXMgPT09IG51bGwgfHwgYnl0ZXMgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICByZXR1cm4gJzAgTUInO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IG1iU2l6ZSA9IGJ5dGVzIC8gKDEwMjQgKiAxMDI0KTtcclxuICAgIC8vIGxldCBwcm9ncmVzc1ZhbHVlID0gKE51bWJlcihtYlNpemUpIC8gdGhpcy5tYXhTaXplRmlsZSgpKSAqIDEwMDtcclxuICAgIC8vIHRoaXMucHJvZ3Jlc3NWYWx1ZS5zZXQocHJvZ3Jlc3NWYWx1ZSk7XHJcbiAgICAvLyB0aGlzLnByb2dyZXNzVmFsdWUuc2V0KChtYlNpemUgLyB0aGlzLm1heFNpemVGaWxlKCkpKjEwMCk7XHJcbiAgICByZXR1cm4gYCR7bWJTaXplLnRvRml4ZWQoMil9LyR7dGhpcy5tYXhTaXplRmlsZSgpfSBNQmA7XHJcbiAgfSlcclxuXHJcbiAgZm9ybWF0Qnl0ZXMoYnl0ZXM6IGFueSwgZGVjaW1hbHMgPSAyKSB7XHJcbiAgICBpZiAoIWJ5dGVzKSB7XHJcbiAgICAgIHJldHVybiBcIjAgQnl0ZXNcIjtcclxuICAgIH1cclxuICAgIGNvbnN0IGsgPSAxMDI0O1xyXG4gICAgY29uc3QgZG0gPSBkZWNpbWFscyA8PSAwID8gMCA6IGRlY2ltYWxzO1xyXG4gICAgY29uc3Qgc2l6ZXMgPSBbXCJCeXRlc1wiLCBcIktCXCIsIFwiTUJcIiwgXCJHQlwiLCBcIlRCXCIsIFwiUEJcIiwgXCJFQlwiLCBcIlpCXCIsIFwiWUJcIl07XHJcbiAgICBjb25zdCBpID0gTWF0aC5mbG9vcihNYXRoLmxvZyhieXRlcykgLyBNYXRoLmxvZyhrKSk7XHJcbiAgICByZXR1cm4gcGFyc2VGbG9hdCgoYnl0ZXMgLyBNYXRoLnBvdyhrLCBpKSkudG9GaXhlZChkbSkpICsgXCIgXCIgKyBzaXplc1tpXTtcclxuICB9XHJcblxyXG4gIGFkZERyYWdPdmVyQ2xhc3MoZXZlbnQ6IERyYWdFdmVudCkge1xyXG4gICAgY29uc3QgY29udGFpbmVyID0gZXZlbnQudGFyZ2V0IGFzIEhUTUxFbGVtZW50O1xyXG4gICAgY29udGFpbmVyLmNsYXNzTGlzdC5hZGQoJ2RyYWdvdmVyJyk7XHJcbiAgfVxyXG5cclxuICByZW1vdmVEcmFnT3ZlckNsYXNzKGV2ZW50OiBEcmFnRXZlbnQpIHtcclxuICAgIGNvbnN0IGNvbnRhaW5lciA9IGV2ZW50LnRhcmdldCBhcyBIVE1MRWxlbWVudDtcclxuICAgIGNvbnRhaW5lci5jbGFzc0xpc3QucmVtb3ZlKCdkcmFnb3ZlcicpO1xyXG4gIH1cclxuXHJcbiAgaGFuZGxlRmlsZShmaWxlOiBGaWxlKSB7XHJcblxyXG4gICAgaWYgKHRoaXMuaW5jbHVkZU9mZmljZVR5cGVzKSB7XHJcbiAgICAgIGxldCB2YWxpZFR5cGVzID0gWy4uLnRoaXMudmFsaWRGaWxlVHlwZXNdO1xyXG5cclxuICAgICAgdmFsaWRUeXBlcy5wdXNoKFxyXG4gICAgICAgICdhcHBsaWNhdGlvbi9tc3dvcmQnLCAvLyAuZG9jXHJcbiAgICAgICAgJ2FwcGxpY2F0aW9uL3ZuZC5vcGVueG1sZm9ybWF0cy1vZmZpY2Vkb2N1bWVudC53b3JkcHJvY2Vzc2luZ21sLmRvY3VtZW50JywgLy8gLmRvY3hcclxuICAgICAgICAnYXBwbGljYXRpb24vdm5kLm1zLXBvd2VycG9pbnQnLCAvLyAucHB0XHJcbiAgICAgICAgJ2FwcGxpY2F0aW9uL3ZuZC5vcGVueG1sZm9ybWF0cy1vZmZpY2Vkb2N1bWVudC5wcmVzZW50YXRpb25tbC5wcmVzZW50YXRpb24nIC8vIC5wcHR4XHJcbiAgICAgICk7XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgaXNWYWxpZEZpbGVUeXBlID0gdGhpcy52YWxpZEZpbGVUeXBlcy5zb21lKHR5cGUgPT5cclxuICAgICAgZmlsZS50eXBlLnN0YXJ0c1dpdGgodHlwZSkgfHxcclxuICAgICAgZmlsZS50eXBlID09PSAnYXBwbGljYXRpb24veG1sJyB8fFxyXG4gICAgICBmaWxlLnR5cGUgPT09ICd0ZXh0L3htbCdcclxuICAgICk7XHJcblxyXG4gICAgaWYgKCFpc1ZhbGlkRmlsZVR5cGUpIHtcclxuICAgICAgdGhpcy5ub3RpZmljYXRpb25TZXJ2aWNlLnRvYXN0RXJyb3IoJ1RpcG8gZGUgYXJxdWl2byBpbnbDoWxpZG8nKTtcclxuICAgICAgdGhpcy5mb3JtR3JvdXAuY29udHJvbHNbdGhpcy5mb3JtQ29udHJvbE5hbWVdLnNldFZhbHVlKG51bGwpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5mb3JtR3JvdXAuY29udHJvbHNbdGhpcy5mb3JtQ29udHJvbE5hbWVdLnNldFZhbHVlKGZpbGUpO1xyXG5cclxuICAgIGNvbnN0IHJlYWRlciA9IG5ldyBGaWxlUmVhZGVyKCk7XHJcblxyXG4gICAgaWYgKGZpbGUudHlwZS5zdGFydHNXaXRoKCdpbWFnZS8nKSkge1xyXG4gICAgICByZWFkZXIucmVhZEFzRGF0YVVSTChmaWxlKTtcclxuICAgIH0gZWxzZSBpZiAoZmlsZS50eXBlID09PSAnYXBwbGljYXRpb24veG1sJyB8fCBmaWxlLnR5cGUgPT09ICd0ZXh0L3htbCcpIHtcclxuICAgICAgcmVhZGVyLnJlYWRBc1RleHQoZmlsZSk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICByZWFkZXIucmVhZEFzQXJyYXlCdWZmZXIoZmlsZSk7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5maWxlRW1pdC5lbWl0KGZpbGUpO1xyXG4gIH1cclxuXHJcbiAgb25EcmFnT3ZlcihldmVudDogRHJhZ0V2ZW50KSB7XHJcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XHJcbiAgICB0aGlzLmFkZERyYWdPdmVyQ2xhc3MoZXZlbnQpO1xyXG4gIH1cclxuXHJcbiAgb25EcmFnTGVhdmUoZXZlbnQ6IERyYWdFdmVudCkge1xyXG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xyXG4gICAgdGhpcy5yZW1vdmVEcmFnT3ZlckNsYXNzKGV2ZW50KTtcclxuICB9XHJcblxyXG4gIG9uRHJvcChldmVudDogRHJhZ0V2ZW50KSB7XHJcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XHJcbiAgICB0aGlzLnJlbW92ZURyYWdPdmVyQ2xhc3MoZXZlbnQpO1xyXG5cclxuICAgIGlmIChldmVudC5kYXRhVHJhbnNmZXIgJiYgZXZlbnQuZGF0YVRyYW5zZmVyLmZpbGVzLmxlbmd0aCA+IDApIHtcclxuICAgICAgdGhpcy5oYW5kbGVGaWxlKGV2ZW50LmRhdGFUcmFuc2Zlci5maWxlc1swXSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBzZXRBY2NlcHQoKTogc3RyaW5nIHtcclxuICAgIGxldCB0eXBlcyA9ICcnXHJcblxyXG4gICAgdGhpcy52YWxpZEZpbGVUeXBlcy5mb3JFYWNoKHR5cGUgPT4ge1xyXG4gICAgICBpZiAodHlwZS5pbmNsdWRlcygnaW1hZ2UnKSkgdHlwZXMgKz0gJy5qcGcsIC5wbmcsIC5ibXAsICc7XHJcbiAgICAgIGlmICh0eXBlLmluY2x1ZGVzKCdodG1sJykpIHR5cGVzICs9ICcuaHRtbCwgJztcclxuICAgICAgaWYgKHR5cGUuaW5jbHVkZXMoJ3BkZicpKSB0eXBlcyArPSAnLnBkZiwgJztcclxuICAgICAgaWYgKHR5cGUuaW5jbHVkZXMoJ3htbCcpKSB0eXBlcyArPSAnLnhtbCwgJztcclxuICAgICAgaWYgKHR5cGUuaW5jbHVkZXMoJ3BsYWluJykpIHR5cGVzICs9ICcudHh0LCAnO1xyXG4gICAgfSk7XHJcblxyXG4gICAgLy8gQWRpY2lvbmEgdGlwb3MgZGUgYXJxdWl2b3MgZG8gT2ZmaWNlIHNlIGluY2x1ZGVPZmZpY2VUeXBlcyBmb3IgdHJ1ZVxyXG4gICAgaWYgKHRoaXMuaW5jbHVkZU9mZmljZVR5cGVzKSB7XHJcbiAgICAgIHR5cGVzICs9ICcuZG9jLCAuZG9jeCwgLnBwdCwgLnBwdHgsICc7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHR5cGVzLnNsaWNlKDAsIC0yKTsgLy8gUmVtb3ZlIGEgw7psdGltYSB2w61yZ3VsYSBlIGVzcGHDp29cclxuICB9XHJcbn1cclxuIiwiPGRpdlxyXG4gICpuZ0lmPVwiZm9ybUdyb3VwXCJcclxuICBjbGFzcz1cImZpbGUtdXBsb2FkLWNvbnRhaW5lciB3LWZ1bGxcIlxyXG4gIFtuZ0NsYXNzXT1cIntcclxuICAgICdpbnZhbGlkLWJvcmRlcic6XHJcbiAgICAgIGZvcm1Hcm91cC5nZXQoZm9ybUNvbnRyb2xOYW1lKT8uaW52YWxpZCAmJlxyXG4gICAgICBmb3JtR3JvdXAuZ2V0KGZvcm1Db250cm9sTmFtZSk/LnRvdWNoZWQsXHJcbiAgICAnaGFzLWZpbGUnOiBmb3JtR3JvdXAuZ2V0KGZvcm1Db250cm9sTmFtZSk/LnZhbHVlLFxyXG4gIH1cIlxyXG4gIChkcmFnb3Zlcik9XCJvbkRyYWdPdmVyKCRldmVudClcIlxyXG4gIChkcmFnbGVhdmUpPVwib25EcmFnTGVhdmUoJGV2ZW50KVwiXHJcbiAgKGRyb3ApPVwib25Ecm9wKCRldmVudClcIlxyXG4gIChjbGljayk9XCJ0cmlnZ2VyQ2xpY2soKVwiXHJcbiAgW3N0eWxlLndpZHRoXT1cIndpZHRoQ29tcG9uZW50XCJcclxuPlxyXG4gIDxpbnB1dFxyXG4gICAgdHlwZT1cImZpbGVcIlxyXG4gICAgI2ZpbGVJbnB1dFxyXG4gICAgKGNoYW5nZSk9XCJvbkZpbGVTZWxlY3RlZCgkZXZlbnQpXCJcclxuICAgIFthY2NlcHRdPVwic2V0QWNjZXB0KClcIlxyXG4gICAgaGlkZGVuXHJcbiAgLz5cclxuXHJcbiAgPGRpdiAqbmdJZj1cIiFmb3JtR3JvdXAuZ2V0KGZvcm1Db250cm9sTmFtZSk/LnZhbHVlXCIgY2xhc3M9XCJkcm9wem9uZS1jb250ZW50XCI+XHJcbiAgICA8ZGl2IGNsYXNzPVwiY2xvdWQtaWNvbi13cmFwcGVyXCI+XHJcbiAgICAgIDxzcGFuIGNsYXNzPVwibWF0ZXJpYWwtc3ltYm9scy1vdXRsaW5lZFwiPmNsb3VkX3VwbG9hZDwvc3Bhbj5cclxuICAgIDwvZGl2PlxyXG4gICAgPGRpdiBjbGFzcz1cInRleHQtY2VudGVyXCI+XHJcbiAgICAgIDxwIGNsYXNzPVwibWFpbi10ZXh0XCI+XHJcbiAgICAgICAgPHNwYW4gY2xhc3M9XCJibHVlLXRleHRcIj5DbGlxdWUgcGFyYSBzZWxlY2lvbmFyPC9zcGFuPiBvdSBhcnJhc3RlIGFxdWlcclxuICAgICAgPC9wPlxyXG4gICAgICA8cCBjbGFzcz1cInN1Yi10ZXh0XCI+UERGLCBJbWFnZW5zIChtYXguIHt7IG1heFNpemVGaWxlKCkgfX1NQik8L3A+XHJcbiAgICA8L2Rpdj5cclxuICA8L2Rpdj5cclxuXHJcbiAgPGRpdlxyXG4gICAgKm5nSWY9XCJmb3JtR3JvdXAuZ2V0KGZvcm1Db250cm9sTmFtZSk/LnZhbHVlIGFzIGZpbGVcIlxyXG4gICAgY2xhc3M9XCJzZWxlY3RlZC1maWxlLWNhcmRcIlxyXG4gID5cclxuICAgIDxkaXYgY2xhc3M9XCJjYXJkLWhlYWRlclwiPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwiZmlsZS1pbmZvXCI+XHJcbiAgICAgICAgPHNwYW4gY2xhc3M9XCJtYXRlcmlhbC1zeW1ib2xzLW91dGxpbmVkIGZpbGUtaWNvblwiPmRlc2NyaXB0aW9uPC9zcGFuPlxyXG4gICAgICAgIDxzcGFuIGNsYXNzPVwiZmlsZS1uYW1lXCIgW3RpdGxlXT1cImZpbGUubmFtZVwiPnt7IGZpbGUubmFtZSB9fTwvc3Bhbj5cclxuICAgICAgPC9kaXY+XHJcbiAgICAgIDxidXR0b25cclxuICAgICAgICBwQnV0dG9uXHJcbiAgICAgICAgaWNvbj1cInBpIHBpLXRpbWVzXCJcclxuICAgICAgICBjbGFzcz1cInAtYnV0dG9uLXJvdW5kZWQgcC1idXR0b24tdGV4dCBwLWJ1dHRvbi1kYW5nZXIgY2xvc2UtYnRuXCJcclxuICAgICAgICAoY2xpY2spPVwiZGVsZXRlRmlsZSgpOyAkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIlxyXG4gICAgICA+PC9idXR0b24+XHJcbiAgICA8L2Rpdj5cclxuXHJcbiAgICA8ZGl2IGNsYXNzPVwiY2FyZC1mb290ZXJcIj5cclxuICAgICAgPGRpdiBjbGFzcz1cInByb2dyZXNzLWNvbnRhaW5lclwiPlxyXG4gICAgICAgIDxkaXZcclxuICAgICAgICAgIGNsYXNzPVwicHJvZ3Jlc3MtYmFyXCJcclxuICAgICAgICAgIFtzdHlsZS53aWR0aC4lXT1cInByb2dyZXNzVmFsdWUoKShmaWxlLnNpemUpXCJcclxuICAgICAgICAgIFtjbGFzcy5saW1pdC1leGNlZWRlZF09XCJwcm9ncmVzc1ZhbHVlKCkoZmlsZS5zaXplKSA+PSAxMDBcIlxyXG4gICAgICAgID48L2Rpdj5cclxuICAgICAgPC9kaXY+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGp1c3RpZnktY29udGVudC1iZXR3ZWVuIGFsaWduLWl0ZW1zLWNlbnRlciBtdC0xXCI+XHJcbiAgICAgICAgPHNtYWxsIGNsYXNzPVwiZXJyb3ItdGV4dFwiICpuZ0lmPVwicHJvZ3Jlc3NWYWx1ZSgpKGZpbGUuc2l6ZSkgPj0gMTAwXCJcclxuICAgICAgICAgID5MaW1pdGUgZXhjZWRpZG88L3NtYWxsXHJcbiAgICAgICAgPlxyXG4gICAgICAgIDxzcGFuIGNsYXNzPVwiZmlsZS1zaXplLWxhYmVsIG1sLWF1dG9cIj57e1xyXG4gICAgICAgICAgZm9ybWF0Qnl0ZXMoZmlsZS5zaXplKVxyXG4gICAgICAgIH19PC9zcGFuPlxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG4gIDwvZGl2PlxyXG48L2Rpdj5cclxuXHJcbjxwXHJcbiAgKm5nSWY9XCJcclxuICAgIGZvcm1Hcm91cC5nZXQoZm9ybUNvbnRyb2xOYW1lKT8uaW52YWxpZCAmJlxyXG4gICAgZm9ybUdyb3VwLmdldChmb3JtQ29udHJvbE5hbWUpPy50b3VjaGVkXHJcbiAgXCJcclxuICBjbGFzcz1cImVycm9yLW1lc3NhZ2VcIlxyXG4+XHJcbiAgQ2FtcG8gb2JyaWdhdMOzcmlvXHJcbjwvcD5cclxuIl19
@@ -48,10 +48,10 @@ export class KvChipsComponent {
48
48
  this.selectionChange.emit(val);
49
49
  }
50
50
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.8", ngImport: i0, type: KvChipsComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
51
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.8", type: KvChipsComponent, isStandalone: true, selector: "kv-chips", inputs: { options: { classPropertyName: "options", publicName: "options", isSignal: true, isRequired: true, transformFunction: null }, multiple: { classPropertyName: "multiple", publicName: "multiple", isSignal: true, isRequired: false, transformFunction: null }, selection: { classPropertyName: "selection", publicName: "selection", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { selection: "selectionChange", selectionChange: "selectionChange" }, ngImport: i0, template: "<div class=\"chip-container\">\r\n @for (option of options(); track option.value) {\r\n <button\r\n type=\"button\"\r\n class=\"chip\"\r\n [class.selected]=\"isActive(option)\"\r\n (click)=\"toggle(option)\"\r\n >\r\n {{ option.label }}\r\n </button>\r\n }\r\n</div>\r\n", styles: [".chip-container{display:flex;flex-wrap:wrap;gap:.75rem;align-items:center}.chip{all:unset;box-sizing:border-box;display:inline-flex;align-items:center;justify-content:center;padding:.25rem 1rem;background-color:#f8fafc;border:1px solid #cbd5e1;border-radius:999px;color:#64748b;font-family:inherit;font-size:.875rem;font-weight:500;white-space:nowrap;cursor:pointer;transition:all .2s ease-in-out;-webkit-user-select:none;user-select:none}.chip:hover{border-color:#abbbce;color:#4f5b6d}.chip.selected{background-color:#e0f2fe;border-color:#0ea5e9;color:#0b83b9}.chip:focus-visible{outline:2px solid #0ea5e9;outline-offset:2px}\n"] }); }
51
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.8", type: KvChipsComponent, isStandalone: true, selector: "kv-chips", inputs: { options: { classPropertyName: "options", publicName: "options", isSignal: true, isRequired: true, transformFunction: null }, multiple: { classPropertyName: "multiple", publicName: "multiple", isSignal: true, isRequired: false, transformFunction: null }, selection: { classPropertyName: "selection", publicName: "selection", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { selection: "selectionChange", selectionChange: "selectionChange" }, ngImport: i0, template: "<div class=\"chip-container\">\r\n @for (option of options(); track option.value) {\r\n <button\r\n type=\"button\"\r\n class=\"chip\"\r\n [class.selected]=\"isActive(option)\"\r\n (click)=\"toggle(option)\"\r\n >\r\n {{ option.label }}\r\n </button>\r\n }\r\n</div>\r\n", styles: [".chip-container{display:flex;flex-wrap:wrap;gap:.75rem;align-items:center}.chip{all:unset;box-sizing:border-box;display:inline-flex;align-items:center;justify-content:center;padding:.25rem 1rem;background-color:#f8fafc;border:1px solid #cbd5e1;border-radius:.5rem;color:#64748b;font-family:inherit;font-size:.875rem;font-weight:500;white-space:nowrap;cursor:pointer;transition:all .2s ease-in-out;-webkit-user-select:none;user-select:none}.chip:hover{border-color:#abbbce;color:#4f5b6d}.chip.selected{background-color:#e0f2fe;border-color:#3b82f6;color:#0b63f3}.chip:focus-visible{outline:2px solid #3b82f6;outline-offset:2px}\n"] }); }
52
52
  }
53
53
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.8", ngImport: i0, type: KvChipsComponent, decorators: [{
54
54
  type: Component,
55
- args: [{ selector: 'kv-chips', standalone: true, imports: [], template: "<div class=\"chip-container\">\r\n @for (option of options(); track option.value) {\r\n <button\r\n type=\"button\"\r\n class=\"chip\"\r\n [class.selected]=\"isActive(option)\"\r\n (click)=\"toggle(option)\"\r\n >\r\n {{ option.label }}\r\n </button>\r\n }\r\n</div>\r\n", styles: [".chip-container{display:flex;flex-wrap:wrap;gap:.75rem;align-items:center}.chip{all:unset;box-sizing:border-box;display:inline-flex;align-items:center;justify-content:center;padding:.25rem 1rem;background-color:#f8fafc;border:1px solid #cbd5e1;border-radius:999px;color:#64748b;font-family:inherit;font-size:.875rem;font-weight:500;white-space:nowrap;cursor:pointer;transition:all .2s ease-in-out;-webkit-user-select:none;user-select:none}.chip:hover{border-color:#abbbce;color:#4f5b6d}.chip.selected{background-color:#e0f2fe;border-color:#0ea5e9;color:#0b83b9}.chip:focus-visible{outline:2px solid #0ea5e9;outline-offset:2px}\n"] }]
55
+ args: [{ selector: 'kv-chips', standalone: true, imports: [], template: "<div class=\"chip-container\">\r\n @for (option of options(); track option.value) {\r\n <button\r\n type=\"button\"\r\n class=\"chip\"\r\n [class.selected]=\"isActive(option)\"\r\n (click)=\"toggle(option)\"\r\n >\r\n {{ option.label }}\r\n </button>\r\n }\r\n</div>\r\n", styles: [".chip-container{display:flex;flex-wrap:wrap;gap:.75rem;align-items:center}.chip{all:unset;box-sizing:border-box;display:inline-flex;align-items:center;justify-content:center;padding:.25rem 1rem;background-color:#f8fafc;border:1px solid #cbd5e1;border-radius:.5rem;color:#64748b;font-family:inherit;font-size:.875rem;font-weight:500;white-space:nowrap;cursor:pointer;transition:all .2s ease-in-out;-webkit-user-select:none;user-select:none}.chip:hover{border-color:#abbbce;color:#4f5b6d}.chip.selected{background-color:#e0f2fe;border-color:#3b82f6;color:#0b63f3}.chip:focus-visible{outline:2px solid #3b82f6;outline-offset:2px}\n"] }]
56
56
  }] });
57
57
  //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoia3YtY2hpcHMuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMva2Vldm8tY29tcG9uZW50cy9zcmMvbGliL2NvbXBvbmVudHMva3YtaW5wdXRzL2t2LWNoaXBzL2t2LWNoaXBzLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2tlZXZvLWNvbXBvbmVudHMvc3JjL2xpYi9jb21wb25lbnRzL2t2LWlucHV0cy9rdi1jaGlwcy9rdi1jaGlwcy5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDOztBQWNoRSxNQUFNLE9BQU8sZ0JBQWdCO0lBUDdCO1FBUUUsZ0VBQWdFO1FBQ2hFLFlBQU8sR0FBRyxLQUFLLENBQUMsUUFBUSxFQUFnQixDQUFDO1FBRXpDLGlFQUFpRTtRQUNqRSxhQUFRLEdBQUcsS0FBSyxDQUFVLEtBQUssQ0FBQyxDQUFDO1FBRWpDLGdEQUFnRDtRQUNoRCxrRUFBa0U7UUFDbEUsY0FBUyxHQUFHLEtBQUssQ0FBTSxJQUFJLENBQUMsQ0FBQztRQUU3Qiw2QkFBNkI7UUFDN0Isb0JBQWUsR0FBRyxNQUFNLEVBQU8sQ0FBQztLQXdDakM7SUF0Q0MsTUFBTSxDQUFDLE1BQWtCO1FBQ3ZCLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUNoQyxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7UUFDakMsTUFBTSxLQUFLLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQztRQUUzQixJQUFJLE9BQU8sRUFBRSxDQUFDO1lBQ1osdUNBQXVDO1lBQ3ZDLElBQUksUUFBUSxHQUFVLEtBQUssQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1lBRWpFLElBQUksUUFBUSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO2dCQUM3QixRQUFRLEdBQUcsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsS0FBSyxLQUFLLENBQUMsQ0FBQyxDQUFDLFNBQVM7WUFDekQsQ0FBQztpQkFBTSxDQUFDO2dCQUNOLFFBQVEsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxXQUFXO1lBQ25DLENBQUM7WUFDRCxJQUFJLENBQUMsZUFBZSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBRWpDLENBQUM7YUFBTSxDQUFDO1lBQ04sNENBQTRDO1lBQzVDLDRFQUE0RTtZQUM1RSxJQUFJLE9BQU8sS0FBSyxLQUFLLEVBQUUsQ0FBQztnQkFDdEIsSUFBSSxDQUFDLGVBQWUsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUM5QixDQUFDO1FBQ0gsQ0FBQztJQUNILENBQUM7SUFFRCxtREFBbUQ7SUFDbkQsUUFBUSxDQUFDLE1BQWtCO1FBQ3pCLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztRQUNqQyxJQUFJLElBQUksQ0FBQyxRQUFRLEVBQUUsRUFBRSxDQUFDO1lBQ3BCLE9BQU8sS0FBSyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsSUFBSSxPQUFPLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNsRSxDQUFDO1FBQ0QsT0FBTyxPQUFPLEtBQUssTUFBTSxDQUFDLEtBQUssQ0FBQztJQUNsQyxDQUFDO0lBRU8sZUFBZSxDQUFDLEdBQVE7UUFDOUIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDeEIsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDakMsQ0FBQzs4R0FuRFUsZ0JBQWdCO2tHQUFoQixnQkFBZ0IsaWlCQ2Q3QixvVEFZQTs7MkZERWEsZ0JBQWdCO2tCQVA1QixTQUFTOytCQUNFLFVBQVUsY0FDUixJQUFJLFdBQ1AsRUFBRSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgaW5wdXQsIG1vZGVsLCBvdXRwdXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgQ2hpcE9wdGlvbiB7XHJcbiAgbGFiZWw6IHN0cmluZztcclxuICB2YWx1ZTogYW55O1xyXG59XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ2t2LWNoaXBzJyxcclxuICBzdGFuZGFsb25lOiB0cnVlLFxyXG4gIGltcG9ydHM6IFtdLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi9rdi1jaGlwcy5jb21wb25lbnQuaHRtbCcsXHJcbiAgc3R5bGVVcmw6ICcuL2t2LWNoaXBzLmNvbXBvbmVudC5zY3NzJ1xyXG59KVxyXG5leHBvcnQgY2xhc3MgS3ZDaGlwc0NvbXBvbmVudCB7XHJcbiAgLy8gUmVjZWJlIGFzIG9ww6fDtWVzIChleDogW3tsYWJlbDogJ1BvciBmaWxpYWwnLCB2YWx1ZTogMX0sIC4uLl0pXHJcbiAgb3B0aW9ucyA9IGlucHV0LnJlcXVpcmVkPENoaXBPcHRpb25bXT4oKTtcclxuXHJcbiAgLy8gRGVmaW5lIHNlIGFjZWl0YSBtw7psdGlwbG9zIG91IGFwZW5hcyB1bSAocGFkcsOjbzogZmFsc2Uvc2luZ2xlKVxyXG4gIG11bHRpcGxlID0gaW5wdXQ8Ym9vbGVhbj4oZmFsc2UpO1xyXG5cclxuICAvLyBPIHZhbG9yIHNlbGVjaW9uYWRvIChwb2RlIHNlciDDum5pY28gb3UgYXJyYXkpXHJcbiAgLy8gVXNhbW9zICdtb2RlbCcgcGFyYSB0d28td2F5IGJpbmRpbmcgZsOhY2lsIFsoc2VsZWN0aW9uKV09XCJ2YWxvclwiXHJcbiAgc2VsZWN0aW9uID0gbW9kZWw8YW55PihudWxsKTtcclxuXHJcbiAgLy8gRXZlbnRvIG9wY2lvbmFsIGRlIG11ZGFuw6dhXHJcbiAgc2VsZWN0aW9uQ2hhbmdlID0gb3V0cHV0PGFueT4oKTtcclxuXHJcbiAgdG9nZ2xlKG9wdGlvbjogQ2hpcE9wdGlvbikge1xyXG4gICAgY29uc3QgaXNNdWx0aSA9IHRoaXMubXVsdGlwbGUoKTtcclxuICAgIGNvbnN0IGN1cnJlbnQgPSB0aGlzLnNlbGVjdGlvbigpO1xyXG4gICAgY29uc3QgdmFsdWUgPSBvcHRpb24udmFsdWU7XHJcblxyXG4gICAgaWYgKGlzTXVsdGkpIHtcclxuICAgICAgLy8gTMOzZ2ljYSBwYXJhIE3Dumx0aXBsYSBTZWxlw6fDo28gKEFycmF5KVxyXG4gICAgICBsZXQgbmV3VmFsdWU6IGFueVtdID0gQXJyYXkuaXNBcnJheShjdXJyZW50KSA/IFsuLi5jdXJyZW50XSA6IFtdO1xyXG5cclxuICAgICAgaWYgKG5ld1ZhbHVlLmluY2x1ZGVzKHZhbHVlKSkge1xyXG4gICAgICAgIG5ld1ZhbHVlID0gbmV3VmFsdWUuZmlsdGVyKHYgPT4gdiAhPT0gdmFsdWUpOyAvLyBSZW1vdmVcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBuZXdWYWx1ZS5wdXNoKHZhbHVlKTsgLy8gQWRpY2lvbmFcclxuICAgICAgfVxyXG4gICAgICB0aGlzLnVwZGF0ZVNlbGVjdGlvbihuZXdWYWx1ZSk7XHJcblxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgLy8gTMOzZ2ljYSBwYXJhIFNlbGXDp8OjbyDDmm5pY2EgKFZhbG9yIHNpbXBsZXMpXHJcbiAgICAgIC8vIFNlIGNsaWNhciBubyBtZXNtbywgbsOjbyBmYXogbmFkYSAob3UgcG9kZXJpYSBkZXNtYXJjYXIsIGRlcGVuZGUgZGEgcmVncmEpXHJcbiAgICAgIGlmIChjdXJyZW50ICE9PSB2YWx1ZSkge1xyXG4gICAgICAgIHRoaXMudXBkYXRlU2VsZWN0aW9uKHZhbHVlKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8gVmVyaWZpY2Egc2UgZXN0w6EgYXRpdm8gcGFyYSBhcGxpY2FyIGEgY2xhc3NlIENTU1xyXG4gIGlzQWN0aXZlKG9wdGlvbjogQ2hpcE9wdGlvbik6IGJvb2xlYW4ge1xyXG4gICAgY29uc3QgY3VycmVudCA9IHRoaXMuc2VsZWN0aW9uKCk7XHJcbiAgICBpZiAodGhpcy5tdWx0aXBsZSgpKSB7XHJcbiAgICAgIHJldHVybiBBcnJheS5pc0FycmF5KGN1cnJlbnQpICYmIGN1cnJlbnQuaW5jbHVkZXMob3B0aW9uLnZhbHVlKTtcclxuICAgIH1cclxuICAgIHJldHVybiBjdXJyZW50ID09PSBvcHRpb24udmFsdWU7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHVwZGF0ZVNlbGVjdGlvbih2YWw6IGFueSkge1xyXG4gICAgdGhpcy5zZWxlY3Rpb24uc2V0KHZhbCk7XHJcbiAgICB0aGlzLnNlbGVjdGlvbkNoYW5nZS5lbWl0KHZhbCk7XHJcbiAgfVxyXG59XHJcbiIsIjxkaXYgY2xhc3M9XCJjaGlwLWNvbnRhaW5lclwiPlxyXG4gIEBmb3IgKG9wdGlvbiBvZiBvcHRpb25zKCk7IHRyYWNrIG9wdGlvbi52YWx1ZSkge1xyXG4gICAgPGJ1dHRvblxyXG4gICAgICB0eXBlPVwiYnV0dG9uXCJcclxuICAgICAgY2xhc3M9XCJjaGlwXCJcclxuICAgICAgW2NsYXNzLnNlbGVjdGVkXT1cImlzQWN0aXZlKG9wdGlvbilcIlxyXG4gICAgICAoY2xpY2spPVwidG9nZ2xlKG9wdGlvbilcIlxyXG4gICAgPlxyXG4gICAgICB7eyBvcHRpb24ubGFiZWwgfX1cclxuICAgIDwvYnV0dG9uPlxyXG4gIH1cclxuPC9kaXY+XHJcbiJdfQ==