tango-app-ui-manage-settings 3.7.5 → 3.7.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/esm2022/lib/components/configurations/zone-configuration/create-single-zone-group/create-single-zone-group.component.mjs +25 -8
- package/esm2022/lib/components/configurations/zone-configuration/zone-configuration.component.mjs +61 -27
- package/fesm2022/tango-app-ui-manage-settings.mjs +84 -33
- package/fesm2022/tango-app-ui-manage-settings.mjs.map +1 -1
- package/lib/components/configurations/zone-configuration/zone-configuration.component.d.ts +2 -0
- package/package.json +1 -1
|
@@ -328,18 +328,35 @@ export class CreateSingleZoneGroupComponent {
|
|
|
328
328
|
toggleSelectAll(event) {
|
|
329
329
|
const checked = event.target.checked;
|
|
330
330
|
if (checked) {
|
|
331
|
-
//
|
|
331
|
+
// First, collect all zones that are already tagged to other groups
|
|
332
|
+
const conflictingZones = [];
|
|
333
|
+
const validZones = [];
|
|
332
334
|
this.filteredZones.forEach(zone => {
|
|
333
335
|
const zoneName = zone?.tagName?.trim();
|
|
334
336
|
if (!zoneName) {
|
|
335
337
|
return;
|
|
336
338
|
}
|
|
337
|
-
//
|
|
339
|
+
// Check if zone is already selected
|
|
340
|
+
if (this.selectedZones.some(z => z.tagName === zoneName)) {
|
|
341
|
+
return; // Skip already selected zones
|
|
342
|
+
}
|
|
343
|
+
// Check if zone is already tagged to another group
|
|
338
344
|
if (this.isZoneTaggedToOtherGroup(zone)) {
|
|
339
|
-
|
|
340
|
-
|
|
345
|
+
conflictingZones.push(zone);
|
|
346
|
+
}
|
|
347
|
+
else {
|
|
348
|
+
validZones.push(zone);
|
|
341
349
|
}
|
|
342
|
-
|
|
350
|
+
});
|
|
351
|
+
// If there are conflicting zones, show popup once with the first conflict
|
|
352
|
+
if (conflictingZones.length > 0) {
|
|
353
|
+
const firstConflict = conflictingZones[0];
|
|
354
|
+
this.showZoneAlreadyTaggedPopup(firstConflict.tagName, firstConflict.groupName);
|
|
355
|
+
}
|
|
356
|
+
// Add only valid zones (not already tagged to other groups)
|
|
357
|
+
validZones.forEach(zone => {
|
|
358
|
+
const zoneName = zone?.tagName?.trim();
|
|
359
|
+
if (zoneName && !this.selectedZones.some(z => z.tagName === zoneName)) {
|
|
343
360
|
this.selectedZones.push({
|
|
344
361
|
name: zoneName,
|
|
345
362
|
tagName: zoneName
|
|
@@ -545,11 +562,11 @@ export class CreateSingleZoneGroupComponent {
|
|
|
545
562
|
}
|
|
546
563
|
}
|
|
547
564
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: CreateSingleZoneGroupComponent, deps: [{ token: i1.FormBuilder }, { token: i2.NgbActiveModal }, { token: i2.NgbModal }, { token: i3.ClientApiService }, { token: i4.ToastService }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
|
|
548
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: CreateSingleZoneGroupComponent, selector: "lib-create-single-zone-group", host: { listeners: { "document:click": "onDocumentClick($event)" } }, viewQueries: [{ propertyName: "zoneInputRef", first: true, predicate: ["zoneInput"], descendants: true }, { propertyName: "zoneTaggedModal", first: true, predicate: ["zoneTaggedModal"], descendants: true }], ngImport: i0, template: "<div class=\"create-zone-group-modal\">\r\n <form [formGroup]=\"createZoneGroupForm\" autocomplete=\"off\">\r\n <!-- Header -->\r\n <div class=\"modal-header-custom mb-4\">\r\n <div class=\"d-flex align-items-center\">\r\n <div class=\"header-icon me-3\">\r\n <svg *ngIf=\"!isEditMode\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\">\r\n <circle cx=\"12\" cy=\"12\" r=\"10\" fill=\"#00A3FF\" />\r\n <path d=\"M12 8V16M8 12H16\" stroke=\"white\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n <svg *ngIf=\"isEditMode\" width=\"56\" height=\"56\" viewBox=\"0 0 56 56\" fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\">\r\n <rect x=\"4\" y=\"4\" width=\"48\" height=\"48\" rx=\"24\" fill=\"#DAF1FF\" />\r\n <rect x=\"4\" y=\"4\" width=\"48\" height=\"48\" rx=\"24\" stroke=\"#EAF8FF\" stroke-width=\"8\" />\r\n <path\r\n d=\"M27 20.0002H20C19.4696 20.0002 18.9609 20.2109 18.5858 20.586C18.2107 20.9611 18 21.4698 18 22.0002V36.0002C18 36.5307 18.2107 37.0394 18.5858 37.4144C18.9609 37.7895 19.4696 38.0002 20 38.0002H34C34.5304 38.0002 35.0391 37.7895 35.4142 37.4144C35.7893 37.0394 36 36.5307 36 36.0002V29.0002M34.5 18.5002C34.8978 18.1024 35.4374 17.8789 36 17.8789C36.5626 17.8789 37.1022 18.1024 37.5 18.5002C37.8978 18.8981 38.1213 19.4376 38.1213 20.0002C38.1213 20.5628 37.8978 21.1024 37.5 21.5002L28 31.0002L24 32.0002L25 28.0002L34.5 18.5002Z\"\r\n stroke=\"#00A3FF\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n </div>\r\n <h4 class=\"modal-title mb-0\">{{ isEditMode ? 'Edit' : 'Create' }}</h4>\r\n </div>\r\n </div>\r\n\r\n <!-- Zone Group Name Input -->\r\n <div class=\"form-group mb-4\">\r\n <!-- <span class=\"text-danger\">*</span> -->\r\n <label for=\"groupName\" class=\"form-label\">Zone Group Name</label>\r\n <input type=\"text\" class=\"form-control\" id=\"groupName\" formControlName=\"groupName\"\r\n placeholder=\"Enter zone group name\" autocomplete=\"off\"\r\n [class.is-invalid]=\"createZoneGroupForm.get('groupName')?.invalid && createZoneGroupForm.get('groupName')?.touched && !createZoneGroupForm.get('groupName')?.pristine\">\r\n <div class=\"invalid-feedback\"\r\n *ngIf=\"createZoneGroupForm.get('groupName')?.invalid && createZoneGroupForm.get('groupName')?.touched && !createZoneGroupForm.get('groupName')?.pristine\">\r\n <span *ngIf=\"createZoneGroupForm.get('groupName')?.errors?.['required']\">GroupName is required</span>\r\n <span *ngIf=\"createZoneGroupForm.get('groupName')?.errors?.['minlength']\">GroupName must be at least 1\r\n characters</span>\r\n <span *ngIf=\"createZoneGroupForm.get('groupName')?.errors?.['pattern']\">\r\n Special characters are not allowed\r\n </span>\r\n </div>\r\n </div>\r\n\r\n <!-- Zones Tagged Input -->\r\n <div class=\"form-group mb-4\">\r\n <label for=\"zonesTagged\" class=\"form-label\" (mousedown)=\"$event.preventDefault()\"\r\n (click)=\"$event.stopPropagation()\">Zones Tagged</label>\r\n <div class=\"zones-tagged-container\" [class.has-dropdown]=\"showDropdown\">\r\n <div class=\"zones-input-wrapper\" [class.has-tags]=\"selectedZones.length > 0\" (click)=\"focusZoneInput()\">\r\n <!-- Selected Zone Tags -->\r\n <ng-container *ngFor=\"let zone of selectedZones; let i = index\">\r\n <span class=\"zone-tag\">\r\n <span class=\"zone-tag-name\">{{ zone.tagName }}</span>\r\n <span class=\"zone-tag-remove\" (click)=\"removeZone(i)\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\">\r\n <path d=\"M9 3L3 9M3 3L9 9\" stroke=\"#667085\" stroke-width=\"1.5\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg>\r\n </span>\r\n </span>\r\n </ng-container>\r\n\r\n <!-- Input Field -->\r\n <input #zoneInput type=\"text\" class=\"zones-input\" id=\"zonesTagged\" formControlName=\"zoneName\"\r\n (keydown)=\"onKeyDown($event)\" (focus)=\"onInputFocus()\" (blur)=\"onInputBlur()\" autocomplete=\"off\"\r\n [disabled]=\"zonesNotAvailable && availableZones.length === 0\">\r\n </div>\r\n\r\n <!-- Autocomplete Dropdown (shown when typing and matches found) -->\r\n <div class=\"autocomplete-dropdown\" *ngIf=\"showDropdown && filteredZones.length > 0\">\r\n <div class=\"zones-list\">\r\n <!-- Select All Option -->\r\n <div class=\"form-check d-flex align-items-center pt-3 px-5 select-all-option\" (mousedown)=\"$event.preventDefault()\">\r\n <input class=\"form-check-input\" type=\"checkbox\" [checked]=\"areAllFilteredZonesSelected()\"\r\n (click)=\"$event.stopPropagation()\" (change)=\"toggleSelectAll($event)\" id=\"selectAllZones\">\r\n <label class=\"form-check-label px-3\" for=\"selectAllZones\">\r\n Select All\r\n </label>\r\n </div>\r\n <div class=\"border border-gray mt-3\"></div>\r\n <!-- Zone Options -->\r\n <div *ngFor=\"let zone of filteredZones\" class=\"form-check d-flex align-items-center py-3 px-5 zone-option\"\r\n (mousedown)=\"$event.preventDefault()\">\r\n <input class=\"form-check-input cursor-pointer\" type=\"checkbox\" [checked]=\"isZoneSelected(zone)\"\r\n (click)=\"$event.stopPropagation()\" (change)=\"toggleZoneSelection(zone, $event)\" [id]=\"'zone-' + zone.tagName\">\r\n <label class=\"form-check-label px-3 cursor-pointer\" [for]=\"'zone-' + zone.tagName\">\r\n {{ zone.tagName }}\r\n </label>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Action Buttons -->\r\n <div class=\"modal-footer-custom mt-4\">\r\n <div class=\"d-flex gap-3 justify-content-end\">\r\n <button type=\"button\" class=\"btn btn-outline\" (click)=\"onCancel()\">Cancel</button>\r\n <button type=\"button\" class=\"btn btn-primary\" (click)=\"onCreate()\" [disabled]=\"createZoneGroupForm.invalid\">\r\n {{ isEditMode ? 'Update' : 'Create' }}\r\n </button>\r\n </div>\r\n </div>\r\n </form>\r\n</div>\r\n\r\n<!-- Zone Already Tagged Modal -->\r\n<ng-template #zoneTaggedModal let-modal>\r\n <div class=\"modal-header border-0 pb-0\">\r\n <button type=\"button\" class=\"btn-close\" aria-label=\"Close\" (click)=\"onCloseZoneTaggedModal()\"></button>\r\n </div>\r\n <div class=\"modal-body delete-zone-modal-body\" style=\"bottom: 13px;\">\r\n <div class=\"delete-zone-icon mb-4\">\r\n <svg width=\"56\" height=\"56\" viewBox=\"0 0 56 56\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <rect x=\"4\" y=\"4\" width=\"48\" height=\"48\" rx=\"24\" fill=\"#FEF0C7\" />\r\n <rect x=\"4\" y=\"4\" width=\"48\" height=\"48\" rx=\"24\" stroke=\"#FFFAEB\" stroke-width=\"8\" />\r\n <path\r\n d=\"M27.9988 24.0002V28.0002M27.9988 32.0002H28.0088M26.2888 18.8602L17.8188 33.0002C17.6442 33.3026 17.5518 33.6455 17.5508 33.9947C17.5498 34.3439 17.6403 34.6873 17.8132 34.9907C17.9862 35.2941 18.2355 35.547 18.5365 35.7241C18.8375 35.9012 19.1796 35.9964 19.5288 36.0002H36.4688C36.818 35.9964 37.1601 35.9012 37.4611 35.7241C37.7621 35.547 38.0114 35.2941 38.1844 34.9907C38.3573 34.6873 38.4478 34.3439 38.4468 33.9947C38.4458 33.6455 38.3534 33.3026 38.1788 33.0002L29.7088 18.8602C29.5305 18.5663 29.2795 18.3233 28.98 18.1547C28.6805 17.9861 28.3425 17.8975 27.9988 17.8975C27.6551 17.8975 27.3171 17.9861 27.0176 18.1547C26.7181 18.3233 26.4671 18.5663 26.2888 18.8602Z\"\r\n stroke=\"#DC6803\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n </div>\r\n\r\n <h4 class=\"delete-zone-title mb-3\">\r\n Zone Already Tagged\r\n </h4>\r\n\r\n <p class=\"delete-zone-description text-center mb-4\">\r\n The selected zone <span class=\"delete-zone-name\">{{ conflictZoneName || 'Zone Name' }}</span>\r\n is already tagged to another group\r\n <span class=\"delete-zone-name\">{{ conflictGroupName || 'Group Name' }}</span>.\r\n If you want to add this to the group, you need to remove the zone from the other group.\r\n </p>\r\n\r\n <div class=\"modal-footer-custom mt-4\">\r\n <div class=\"d-flex gap-3 justify-content-center\">\r\n <button type=\"button\" class=\"btn btn-outline\" (click)=\"onCloseZoneTaggedModal()\">Cancel</button>\r\n <button type=\"button\" class=\"btn btn-primary\" (click)=\"onCloseZoneTaggedModal()\">Okay</button>\r\n </div>\r\n </div>\r\n </div>\r\n</ng-template>", styles: [".create-zone-group-modal{padding:24px}.modal-header-custom .header-icon{width:40px;height:40px;border-radius:50%;background-color:#daf1ff;display:flex;align-items:center;justify-content:center;flex-shrink:0}.modal-header-custom .modal-title{font-size:18px;font-weight:600;color:#101828;line-height:28px}.form-group .form-label{font-size:14px;font-weight:500;color:#344054;margin-bottom:8px;display:block}.form-group .form-label .text-danger{color:#f04438;margin-left:2px}.form-group .form-control{border:1px solid #D0D5DD;border-radius:8px;padding:10px 14px;font-size:14px;color:#344054;height:44px;transition:all .2s ease}.form-group .form-control:focus{border-color:#009bf3;box-shadow:0 0 0 3px #009bf31a;outline:none}.form-group .form-control.is-invalid{border-color:#f04438}.form-group .form-control.is-invalid:focus{border-color:#f04438;box-shadow:0 0 0 3px #f044381a}.form-group .form-control::placeholder{color:#98a2b3}.form-group .invalid-feedback{display:block;width:100%;margin-top:6px;font-size:12px;color:#f04438}.zones-tagged-container{position:relative}.zones-tagged-container .zones-input-wrapper{display:flex;flex-wrap:wrap;align-items:flex-start;gap:8px;min-height:108px;max-height:120px;padding:12px 14px;cursor:text;align-content:flex-start;position:relative;overflow-y:auto;overflow-x:hidden;border:1px solid #D0D5DD;border-radius:8px;background-color:#fff;scrollbar-width:thin;scrollbar-color:#D0D5DD transparent}.zones-tagged-container .zones-input-wrapper.has-tags{padding:12px 14px;min-height:108px;max-height:120px}.zones-tagged-container .zones-input-wrapper:focus-within{border-color:#009bf3;box-shadow:0 0 0 3px #009bf31a}.zones-tagged-container .zones-input-wrapper::-webkit-scrollbar{width:6px}.zones-tagged-container .zones-input-wrapper::-webkit-scrollbar-track{background:transparent;border-radius:3px}.zones-tagged-container .zones-input-wrapper::-webkit-scrollbar-thumb{background:#d0d5dd;border-radius:3px;transition:background .2s ease}.zones-tagged-container .zones-input-wrapper::-webkit-scrollbar-thumb:hover{background:#98a2b3}.zones-tagged-container .zones-input-wrapper:focus-within{border-color:#344054;box-shadow:0 0 0 3px #009bf31a}.zones-tagged-container .zones-input-wrapper .zones-input{flex:1 1 100%;border:none!important;outline:none!important;padding:0;font-size:14px;color:#344054;min-width:100%;width:100%;max-width:100%;background:transparent;margin-top:2px;height:20px;line-height:20px;display:inline-block;visibility:visible;box-shadow:none!important}.zones-tagged-container .zones-input-wrapper .zones-input::placeholder{color:#98a2b3;opacity:1}.zones-tagged-container .zones-input-wrapper .zones-input:disabled{background:transparent;cursor:not-allowed;opacity:.6}.zones-tagged-container .zones-input-wrapper .zones-input:focus{outline:none!important;border:none!important;box-shadow:none!important}.zones-tagged-container .zones-input-wrapper .zones-input::-webkit-input-placeholder{color:#98a2b3;opacity:1}.zones-tagged-container .zones-input-wrapper .zones-input::-moz-placeholder{color:#98a2b3;opacity:1}.zones-tagged-container .zones-input-wrapper .zones-input:-ms-input-placeholder{color:#98a2b3;opacity:1}.zones-tagged-container .zones-input-wrapper .zone-tag{display:inline-flex;align-items:center;gap:6px;background-color:#f2f4f7;border-radius:6px;padding:6px 10px;font-size:14px;color:#344054;line-height:1.4;margin-top:2px}.zones-tagged-container .zones-input-wrapper .zone-tag .zone-tag-name{font-weight:500}.zones-tagged-container .zones-input-wrapper .zone-tag .zone-tag-remove{display:flex;align-items:center;justify-content:center;cursor:pointer;padding:2px;border-radius:4px;transition:background-color .2s ease}.zones-tagged-container .zones-input-wrapper .zone-tag .zone-tag-remove:hover{background-color:#e4e7ec}.zones-tagged-container .zones-input-wrapper .zone-tag .zone-tag-remove svg{display:block}.zones-tagged-container .autocomplete-dropdown{position:absolute;top:100%;left:0;right:0;margin-top:4px;background-color:#fff;border:1px solid #D0D5DD;border-radius:8px;box-shadow:0 4px 6px -2px #10182808,0 12px 16px -4px #10182814;z-index:1000;max-height:200px;overflow-y:auto}.zones-tagged-container .autocomplete-dropdown .zones-list{padding:4px 0}.zones-tagged-container .autocomplete-dropdown .zone-option{display:block;cursor:pointer;transition:background-color .2s ease}.zones-tagged-container .autocomplete-dropdown .zone-option:hover{background-color:#f9fafb}.zones-tagged-container .autocomplete-dropdown .select-all-option{border-bottom:1px solid #EAECF0;font-weight:500;background-color:#f9fafb;border-top-left-radius:8px;border-top-right-radius:8px}.zones-tagged-container .autocomplete-dropdown .select-all-option:hover{background-color:#f2f4f7}.zones-tagged-container .autocomplete-dropdown .form-check{margin:0}.zones-tagged-container .autocomplete-dropdown .form-check-label{color:#344054;font-size:14px;font-weight:500;line-height:20px;margin:0;cursor:pointer}.zones-tagged-container .autocomplete-dropdown input[type=checkbox]{width:16px!important;height:16px!important;margin:-3px 5px;border-radius:4px!important;-webkit-appearance:none;-moz-appearance:none;-o-appearance:none;appearance:none;outline:1px solid #D0D5DD;box-shadow:none;font-size:.8em;text-align:center;line-height:1em;background:#fff;cursor:pointer}.zones-tagged-container .autocomplete-dropdown input[type=checkbox]:checked{outline:1px solid #00A3FF;background-color:#eaf8ff}.zones-tagged-container .autocomplete-dropdown input[type=checkbox]:checked:after{content:\"\";transform:rotate(45deg);border-bottom:2px solid #00A3FF;border-right:2px solid #00A3FF;display:inline-block;width:.2em;padding-left:0;padding-top:9px;padding-right:4px}.zones-tagged-container .autocomplete-dropdown .border-gray{border-color:#eaecf0!important}.modal-footer-custom{padding-top:16px;border-top:1px solid #EAECF0}.modal-footer-custom .btn{min-width:100px;height:44px;font-size:14px;font-weight:500;border-radius:8px;padding:10px 18px;transition:all .2s ease}.modal-footer-custom .btn.btn-outline{border:1px solid #D0D5DD;background-color:#fff;color:#344054}.modal-footer-custom .btn.btn-outline:hover{background-color:#f9fafb;border-color:#d0d5dd}.modal-footer-custom .btn.btn-primary{background-color:#009bf3;border-color:#009bf3;color:#fff}.modal-footer-custom .btn.btn-primary:hover:not(:disabled){background-color:#0085d1;border-color:#0085d1}.modal-footer-custom .btn.btn-primary:disabled{opacity:.6;cursor:not-allowed}.delete-zone-description{text-align:center;font-size:14px;font-weight:400;color:#344054;line-height:20px}.delete-zone-name{font-weight:700}\n"], dependencies: [{ kind: "directive", type: i5.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i1.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }] });
|
|
565
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: CreateSingleZoneGroupComponent, selector: "lib-create-single-zone-group", host: { listeners: { "document:click": "onDocumentClick($event)" } }, viewQueries: [{ propertyName: "zoneInputRef", first: true, predicate: ["zoneInput"], descendants: true }, { propertyName: "zoneTaggedModal", first: true, predicate: ["zoneTaggedModal"], descendants: true }], ngImport: i0, template: "<div class=\"create-zone-group-modal\">\r\n <form [formGroup]=\"createZoneGroupForm\" autocomplete=\"off\">\r\n <!-- Header -->\r\n <div class=\"modal-header-custom mb-4\">\r\n <div class=\"d-flex align-items-center\">\r\n <div class=\"header-icon me-3\">\r\n <svg *ngIf=\"!isEditMode\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\">\r\n <circle cx=\"12\" cy=\"12\" r=\"10\" fill=\"#00A3FF\" />\r\n <path d=\"M12 8V16M8 12H16\" stroke=\"white\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n <svg *ngIf=\"isEditMode\" width=\"56\" height=\"56\" viewBox=\"0 0 56 56\" fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\">\r\n <rect x=\"4\" y=\"4\" width=\"48\" height=\"48\" rx=\"24\" fill=\"#DAF1FF\" />\r\n <rect x=\"4\" y=\"4\" width=\"48\" height=\"48\" rx=\"24\" stroke=\"#EAF8FF\" stroke-width=\"8\" />\r\n <path\r\n d=\"M27 20.0002H20C19.4696 20.0002 18.9609 20.2109 18.5858 20.586C18.2107 20.9611 18 21.4698 18 22.0002V36.0002C18 36.5307 18.2107 37.0394 18.5858 37.4144C18.9609 37.7895 19.4696 38.0002 20 38.0002H34C34.5304 38.0002 35.0391 37.7895 35.4142 37.4144C35.7893 37.0394 36 36.5307 36 36.0002V29.0002M34.5 18.5002C34.8978 18.1024 35.4374 17.8789 36 17.8789C36.5626 17.8789 37.1022 18.1024 37.5 18.5002C37.8978 18.8981 38.1213 19.4376 38.1213 20.0002C38.1213 20.5628 37.8978 21.1024 37.5 21.5002L28 31.0002L24 32.0002L25 28.0002L34.5 18.5002Z\"\r\n stroke=\"#00A3FF\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n </div>\r\n <h4 class=\"modal-title mb-0\">{{ isEditMode ? 'Edit' : 'Create' }}</h4>\r\n </div>\r\n </div>\r\n\r\n <!-- Zone Group Name Input -->\r\n <div class=\"form-group mb-4\">\r\n <!-- <span class=\"text-danger\">*</span> -->\r\n <label for=\"groupName\" class=\"form-label\">Zone Group Name</label>\r\n <input type=\"text\" class=\"form-control\" id=\"groupName\" formControlName=\"groupName\"\r\n placeholder=\"Enter zone group name\" autocomplete=\"off\"\r\n [class.is-invalid]=\"createZoneGroupForm.get('groupName')?.invalid && createZoneGroupForm.get('groupName')?.touched && !createZoneGroupForm.get('groupName')?.pristine\">\r\n <div class=\"invalid-feedback\"\r\n *ngIf=\"createZoneGroupForm.get('groupName')?.invalid && createZoneGroupForm.get('groupName')?.touched && !createZoneGroupForm.get('groupName')?.pristine\">\r\n <span *ngIf=\"createZoneGroupForm.get('groupName')?.errors?.['required']\">GroupName is required</span>\r\n <span *ngIf=\"createZoneGroupForm.get('groupName')?.errors?.['minlength']\">GroupName must be at least 1\r\n characters</span>\r\n <span *ngIf=\"createZoneGroupForm.get('groupName')?.errors?.['pattern']\">\r\n Special characters are not allowed\r\n </span>\r\n </div>\r\n </div>\r\n\r\n <!-- Zones Tagged Input -->\r\n <div class=\"form-group mb-4\">\r\n <label for=\"zonesTagged\" class=\"form-label\" (mousedown)=\"$event.preventDefault()\"\r\n (click)=\"$event.stopPropagation()\">Zones Tagged</label>\r\n <div class=\"zones-tagged-container\" [class.has-dropdown]=\"showDropdown\">\r\n <div class=\"zones-input-wrapper\" [class.has-tags]=\"selectedZones.length > 0\" (click)=\"focusZoneInput()\">\r\n <!-- Selected Zone Tags -->\r\n <ng-container *ngFor=\"let zone of selectedZones; let i = index\">\r\n <span class=\"zone-tag\">\r\n <span class=\"zone-tag-name\">{{ zone.tagName }}</span>\r\n <span class=\"zone-tag-remove\" (click)=\"removeZone(i)\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\">\r\n <path d=\"M9 3L3 9M3 3L9 9\" stroke=\"#667085\" stroke-width=\"1.5\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg>\r\n </span>\r\n </span>\r\n </ng-container>\r\n\r\n <!-- Input Field -->\r\n <input #zoneInput type=\"text\" class=\"zones-input\" id=\"zonesTagged\" formControlName=\"zoneName\"\r\n (keydown)=\"onKeyDown($event)\" (focus)=\"onInputFocus()\" (blur)=\"onInputBlur()\" autocomplete=\"off\"\r\n [disabled]=\"zonesNotAvailable && availableZones.length === 0\">\r\n </div>\r\n\r\n <!-- Autocomplete Dropdown (shown when typing and matches found) -->\r\n <div class=\"autocomplete-dropdown\" *ngIf=\"showDropdown && filteredZones.length > 0\">\r\n <div class=\"zones-list\">\r\n <!-- Select All Option -->\r\n <div class=\"form-check d-flex align-items-center pt-3 px-5 select-all-option\" (mousedown)=\"$event.preventDefault()\">\r\n <input class=\"form-check-input\" type=\"checkbox\" [checked]=\"areAllFilteredZonesSelected()\"\r\n (click)=\"$event.stopPropagation()\" (change)=\"toggleSelectAll($event)\" id=\"selectAllZones\">\r\n <label class=\"form-check-label px-3\" for=\"selectAllZones\">\r\n Select All\r\n </label>\r\n </div>\r\n <div class=\"border border-gray mt-3\"></div>\r\n <!-- Zone Options -->\r\n <div *ngFor=\"let zone of filteredZones\" class=\"form-check d-flex align-items-center py-3 px-5 zone-option\"\r\n (mousedown)=\"$event.preventDefault()\">\r\n <input class=\"form-check-input cursor-pointer\" type=\"checkbox\" [checked]=\"isZoneSelected(zone)\"\r\n (click)=\"$event.stopPropagation()\" (change)=\"toggleZoneSelection(zone, $event)\" [id]=\"'zone-' + zone.tagName\">\r\n <label class=\"form-check-label px-3 cursor-pointer\" [for]=\"'zone-' + zone.tagName\">\r\n {{ zone.tagName }}\r\n </label>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Action Buttons -->\r\n <div class=\"modal-footer-custom mt-4\">\r\n <div class=\"d-flex gap-3 justify-content-end\">\r\n <button type=\"button\" class=\"btn btn-outline\" (click)=\"onCancel()\">Cancel</button>\r\n <button type=\"button\" class=\"btn btn-primary\" (click)=\"onCreate()\" [disabled]=\"createZoneGroupForm.invalid\">\r\n {{ isEditMode ? 'Update' : 'Create' }}\r\n </button>\r\n </div>\r\n </div>\r\n </form>\r\n</div>\r\n\r\n<!-- Zone Already Tagged Modal -->\r\n<ng-template #zoneTaggedModal let-modal>\r\n <!-- <div class=\"modal-header border-0 pb-0\">\r\n <button type=\"button\" class=\"btn-close\" aria-label=\"Close\" (click)=\"onCloseZoneTaggedModal()\"></button>\r\n </div> -->\r\n <div class=\"modal-body delete-zone-modal-body\" style=\"bottom: 13px;\">\r\n <div class=\"delete-zone-icon mb-4\">\r\n <svg width=\"56\" height=\"56\" viewBox=\"0 0 56 56\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <rect x=\"4\" y=\"4\" width=\"48\" height=\"48\" rx=\"24\" fill=\"#FEF0C7\" />\r\n <rect x=\"4\" y=\"4\" width=\"48\" height=\"48\" rx=\"24\" stroke=\"#FFFAEB\" stroke-width=\"8\" />\r\n <path\r\n d=\"M27.9988 24.0002V28.0002M27.9988 32.0002H28.0088M26.2888 18.8602L17.8188 33.0002C17.6442 33.3026 17.5518 33.6455 17.5508 33.9947C17.5498 34.3439 17.6403 34.6873 17.8132 34.9907C17.9862 35.2941 18.2355 35.547 18.5365 35.7241C18.8375 35.9012 19.1796 35.9964 19.5288 36.0002H36.4688C36.818 35.9964 37.1601 35.9012 37.4611 35.7241C37.7621 35.547 38.0114 35.2941 38.1844 34.9907C38.3573 34.6873 38.4478 34.3439 38.4468 33.9947C38.4458 33.6455 38.3534 33.3026 38.1788 33.0002L29.7088 18.8602C29.5305 18.5663 29.2795 18.3233 28.98 18.1547C28.6805 17.9861 28.3425 17.8975 27.9988 17.8975C27.6551 17.8975 27.3171 17.9861 27.0176 18.1547C26.7181 18.3233 26.4671 18.5663 26.2888 18.8602Z\"\r\n stroke=\"#DC6803\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n </div>\r\n\r\n <h4 class=\"delete-zone-title mb-3\">\r\n Zone Already Tagged\r\n </h4>\r\n\r\n <p class=\"delete-zone-description text-center mb-4\">\r\n The selected zone <span class=\"delete-zone-name\">{{ conflictZoneName || 'Zone Name' }}</span>\r\n is already tagged to another group\r\n <span class=\"delete-zone-name\">{{ conflictGroupName || 'Group Name' }}</span>.\r\n If you want to add this to the group, you need to remove the zone from the other group.\r\n </p>\r\n\r\n <div class=\"modal-footer-custom mt-4\">\r\n <div class=\"d-flex gap-3 justify-content-center\">\r\n <button type=\"button\" class=\"btn btn-primary\" (click)=\"onCloseZoneTaggedModal()\">Okay</button>\r\n </div>\r\n </div>\r\n </div>\r\n</ng-template>", styles: [".create-zone-group-modal{padding:24px}.modal-header-custom .header-icon{width:40px;height:40px;border-radius:50%;background-color:#daf1ff;display:flex;align-items:center;justify-content:center;flex-shrink:0}.modal-header-custom .modal-title{font-size:18px;font-weight:600;color:#101828;line-height:28px}.form-group .form-label{font-size:14px;font-weight:500;color:#344054;margin-bottom:8px;display:block}.form-group .form-label .text-danger{color:#f04438;margin-left:2px}.form-group .form-control{border:1px solid #D0D5DD;border-radius:8px;padding:10px 14px;font-size:14px;color:#344054;height:44px;transition:all .2s ease}.form-group .form-control:focus{border-color:#009bf3;box-shadow:0 0 0 3px #009bf31a;outline:none}.form-group .form-control.is-invalid{border-color:#f04438}.form-group .form-control.is-invalid:focus{border-color:#f04438;box-shadow:0 0 0 3px #f044381a}.form-group .form-control::placeholder{color:#98a2b3}.form-group .invalid-feedback{display:block;width:100%;margin-top:6px;font-size:12px;color:#f04438}.zones-tagged-container{position:relative}.zones-tagged-container .zones-input-wrapper{display:flex;flex-wrap:wrap;align-items:flex-start;gap:8px;min-height:108px;max-height:120px;padding:12px 14px;cursor:text;align-content:flex-start;position:relative;overflow-y:auto;overflow-x:hidden;border:1px solid #D0D5DD;border-radius:8px;background-color:#fff;scrollbar-width:thin;scrollbar-color:#D0D5DD transparent}.zones-tagged-container .zones-input-wrapper.has-tags{padding:12px 14px;min-height:108px;max-height:120px}.zones-tagged-container .zones-input-wrapper:focus-within{border-color:#009bf3;box-shadow:0 0 0 3px #009bf31a}.zones-tagged-container .zones-input-wrapper::-webkit-scrollbar{width:6px}.zones-tagged-container .zones-input-wrapper::-webkit-scrollbar-track{background:transparent;border-radius:3px}.zones-tagged-container .zones-input-wrapper::-webkit-scrollbar-thumb{background:#d0d5dd;border-radius:3px;transition:background .2s ease}.zones-tagged-container .zones-input-wrapper::-webkit-scrollbar-thumb:hover{background:#98a2b3}.zones-tagged-container .zones-input-wrapper:focus-within{border-color:#344054;box-shadow:0 0 0 3px #009bf31a}.zones-tagged-container .zones-input-wrapper .zones-input{flex:1 1 100%;border:none!important;outline:none!important;padding:0;font-size:14px;color:#344054;min-width:100%;width:100%;max-width:100%;background:transparent;margin-top:2px;height:20px;line-height:20px;display:inline-block;visibility:visible;box-shadow:none!important}.zones-tagged-container .zones-input-wrapper .zones-input::placeholder{color:#98a2b3;opacity:1}.zones-tagged-container .zones-input-wrapper .zones-input:disabled{background:transparent;cursor:not-allowed;opacity:.6}.zones-tagged-container .zones-input-wrapper .zones-input:focus{outline:none!important;border:none!important;box-shadow:none!important}.zones-tagged-container .zones-input-wrapper .zones-input::-webkit-input-placeholder{color:#98a2b3;opacity:1}.zones-tagged-container .zones-input-wrapper .zones-input::-moz-placeholder{color:#98a2b3;opacity:1}.zones-tagged-container .zones-input-wrapper .zones-input:-ms-input-placeholder{color:#98a2b3;opacity:1}.zones-tagged-container .zones-input-wrapper .zone-tag{display:inline-flex;align-items:center;gap:6px;background-color:#f2f4f7;border-radius:6px;padding:6px 10px;font-size:14px;color:#344054;line-height:1.4;margin-top:2px}.zones-tagged-container .zones-input-wrapper .zone-tag .zone-tag-name{font-weight:500}.zones-tagged-container .zones-input-wrapper .zone-tag .zone-tag-remove{display:flex;align-items:center;justify-content:center;cursor:pointer;padding:2px;border-radius:4px;transition:background-color .2s ease}.zones-tagged-container .zones-input-wrapper .zone-tag .zone-tag-remove:hover{background-color:#e4e7ec}.zones-tagged-container .zones-input-wrapper .zone-tag .zone-tag-remove svg{display:block}.zones-tagged-container .autocomplete-dropdown{position:absolute;top:100%;left:0;right:0;margin-top:4px;background-color:#fff;border:1px solid #D0D5DD;border-radius:8px;box-shadow:0 4px 6px -2px #10182808,0 12px 16px -4px #10182814;z-index:1000;max-height:200px;overflow-y:auto}.zones-tagged-container .autocomplete-dropdown .zones-list{padding:4px 0}.zones-tagged-container .autocomplete-dropdown .zone-option{display:block;cursor:pointer;transition:background-color .2s ease}.zones-tagged-container .autocomplete-dropdown .zone-option:hover{background-color:#f9fafb}.zones-tagged-container .autocomplete-dropdown .select-all-option{border-bottom:1px solid #EAECF0;font-weight:500;background-color:#f9fafb;border-top-left-radius:8px;border-top-right-radius:8px}.zones-tagged-container .autocomplete-dropdown .select-all-option:hover{background-color:#f2f4f7}.zones-tagged-container .autocomplete-dropdown .form-check{margin:0}.zones-tagged-container .autocomplete-dropdown .form-check-label{color:#344054;font-size:14px;font-weight:500;line-height:20px;margin:0;cursor:pointer}.zones-tagged-container .autocomplete-dropdown input[type=checkbox]{width:16px!important;height:16px!important;margin:-3px 5px;border-radius:4px!important;-webkit-appearance:none;-moz-appearance:none;-o-appearance:none;appearance:none;outline:1px solid #D0D5DD;box-shadow:none;font-size:.8em;text-align:center;line-height:1em;background:#fff;cursor:pointer}.zones-tagged-container .autocomplete-dropdown input[type=checkbox]:checked{outline:1px solid #00A3FF;background-color:#eaf8ff}.zones-tagged-container .autocomplete-dropdown input[type=checkbox]:checked:after{content:\"\";transform:rotate(45deg);border-bottom:2px solid #00A3FF;border-right:2px solid #00A3FF;display:inline-block;width:.2em;padding-left:0;padding-top:9px;padding-right:4px}.zones-tagged-container .autocomplete-dropdown .border-gray{border-color:#eaecf0!important}.modal-footer-custom{padding-top:16px;border-top:1px solid #EAECF0}.modal-footer-custom .btn{min-width:100px;height:44px;font-size:14px;font-weight:500;border-radius:8px;padding:10px 18px;transition:all .2s ease}.modal-footer-custom .btn.btn-outline{border:1px solid #D0D5DD;background-color:#fff;color:#344054}.modal-footer-custom .btn.btn-outline:hover{background-color:#f9fafb;border-color:#d0d5dd}.modal-footer-custom .btn.btn-primary{background-color:#009bf3;border-color:#009bf3;color:#fff}.modal-footer-custom .btn.btn-primary:hover:not(:disabled){background-color:#0085d1;border-color:#0085d1}.modal-footer-custom .btn.btn-primary:disabled{opacity:.6;cursor:not-allowed}.delete-zone-description{text-align:center;font-size:14px;font-weight:400;color:#344054;line-height:20px}.delete-zone-name{font-weight:700}\n"], dependencies: [{ kind: "directive", type: i5.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i1.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }] });
|
|
549
566
|
}
|
|
550
567
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: CreateSingleZoneGroupComponent, decorators: [{
|
|
551
568
|
type: Component,
|
|
552
|
-
args: [{ selector: 'lib-create-single-zone-group', template: "<div class=\"create-zone-group-modal\">\r\n <form [formGroup]=\"createZoneGroupForm\" autocomplete=\"off\">\r\n <!-- Header -->\r\n <div class=\"modal-header-custom mb-4\">\r\n <div class=\"d-flex align-items-center\">\r\n <div class=\"header-icon me-3\">\r\n <svg *ngIf=\"!isEditMode\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\">\r\n <circle cx=\"12\" cy=\"12\" r=\"10\" fill=\"#00A3FF\" />\r\n <path d=\"M12 8V16M8 12H16\" stroke=\"white\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n <svg *ngIf=\"isEditMode\" width=\"56\" height=\"56\" viewBox=\"0 0 56 56\" fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\">\r\n <rect x=\"4\" y=\"4\" width=\"48\" height=\"48\" rx=\"24\" fill=\"#DAF1FF\" />\r\n <rect x=\"4\" y=\"4\" width=\"48\" height=\"48\" rx=\"24\" stroke=\"#EAF8FF\" stroke-width=\"8\" />\r\n <path\r\n d=\"M27 20.0002H20C19.4696 20.0002 18.9609 20.2109 18.5858 20.586C18.2107 20.9611 18 21.4698 18 22.0002V36.0002C18 36.5307 18.2107 37.0394 18.5858 37.4144C18.9609 37.7895 19.4696 38.0002 20 38.0002H34C34.5304 38.0002 35.0391 37.7895 35.4142 37.4144C35.7893 37.0394 36 36.5307 36 36.0002V29.0002M34.5 18.5002C34.8978 18.1024 35.4374 17.8789 36 17.8789C36.5626 17.8789 37.1022 18.1024 37.5 18.5002C37.8978 18.8981 38.1213 19.4376 38.1213 20.0002C38.1213 20.5628 37.8978 21.1024 37.5 21.5002L28 31.0002L24 32.0002L25 28.0002L34.5 18.5002Z\"\r\n stroke=\"#00A3FF\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n </div>\r\n <h4 class=\"modal-title mb-0\">{{ isEditMode ? 'Edit' : 'Create' }}</h4>\r\n </div>\r\n </div>\r\n\r\n <!-- Zone Group Name Input -->\r\n <div class=\"form-group mb-4\">\r\n <!-- <span class=\"text-danger\">*</span> -->\r\n <label for=\"groupName\" class=\"form-label\">Zone Group Name</label>\r\n <input type=\"text\" class=\"form-control\" id=\"groupName\" formControlName=\"groupName\"\r\n placeholder=\"Enter zone group name\" autocomplete=\"off\"\r\n [class.is-invalid]=\"createZoneGroupForm.get('groupName')?.invalid && createZoneGroupForm.get('groupName')?.touched && !createZoneGroupForm.get('groupName')?.pristine\">\r\n <div class=\"invalid-feedback\"\r\n *ngIf=\"createZoneGroupForm.get('groupName')?.invalid && createZoneGroupForm.get('groupName')?.touched && !createZoneGroupForm.get('groupName')?.pristine\">\r\n <span *ngIf=\"createZoneGroupForm.get('groupName')?.errors?.['required']\">GroupName is required</span>\r\n <span *ngIf=\"createZoneGroupForm.get('groupName')?.errors?.['minlength']\">GroupName must be at least 1\r\n characters</span>\r\n <span *ngIf=\"createZoneGroupForm.get('groupName')?.errors?.['pattern']\">\r\n Special characters are not allowed\r\n </span>\r\n </div>\r\n </div>\r\n\r\n <!-- Zones Tagged Input -->\r\n <div class=\"form-group mb-4\">\r\n <label for=\"zonesTagged\" class=\"form-label\" (mousedown)=\"$event.preventDefault()\"\r\n (click)=\"$event.stopPropagation()\">Zones Tagged</label>\r\n <div class=\"zones-tagged-container\" [class.has-dropdown]=\"showDropdown\">\r\n <div class=\"zones-input-wrapper\" [class.has-tags]=\"selectedZones.length > 0\" (click)=\"focusZoneInput()\">\r\n <!-- Selected Zone Tags -->\r\n <ng-container *ngFor=\"let zone of selectedZones; let i = index\">\r\n <span class=\"zone-tag\">\r\n <span class=\"zone-tag-name\">{{ zone.tagName }}</span>\r\n <span class=\"zone-tag-remove\" (click)=\"removeZone(i)\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\">\r\n <path d=\"M9 3L3 9M3 3L9 9\" stroke=\"#667085\" stroke-width=\"1.5\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg>\r\n </span>\r\n </span>\r\n </ng-container>\r\n\r\n <!-- Input Field -->\r\n <input #zoneInput type=\"text\" class=\"zones-input\" id=\"zonesTagged\" formControlName=\"zoneName\"\r\n (keydown)=\"onKeyDown($event)\" (focus)=\"onInputFocus()\" (blur)=\"onInputBlur()\" autocomplete=\"off\"\r\n [disabled]=\"zonesNotAvailable && availableZones.length === 0\">\r\n </div>\r\n\r\n <!-- Autocomplete Dropdown (shown when typing and matches found) -->\r\n <div class=\"autocomplete-dropdown\" *ngIf=\"showDropdown && filteredZones.length > 0\">\r\n <div class=\"zones-list\">\r\n <!-- Select All Option -->\r\n <div class=\"form-check d-flex align-items-center pt-3 px-5 select-all-option\" (mousedown)=\"$event.preventDefault()\">\r\n <input class=\"form-check-input\" type=\"checkbox\" [checked]=\"areAllFilteredZonesSelected()\"\r\n (click)=\"$event.stopPropagation()\" (change)=\"toggleSelectAll($event)\" id=\"selectAllZones\">\r\n <label class=\"form-check-label px-3\" for=\"selectAllZones\">\r\n Select All\r\n </label>\r\n </div>\r\n <div class=\"border border-gray mt-3\"></div>\r\n <!-- Zone Options -->\r\n <div *ngFor=\"let zone of filteredZones\" class=\"form-check d-flex align-items-center py-3 px-5 zone-option\"\r\n (mousedown)=\"$event.preventDefault()\">\r\n <input class=\"form-check-input cursor-pointer\" type=\"checkbox\" [checked]=\"isZoneSelected(zone)\"\r\n (click)=\"$event.stopPropagation()\" (change)=\"toggleZoneSelection(zone, $event)\" [id]=\"'zone-' + zone.tagName\">\r\n <label class=\"form-check-label px-3 cursor-pointer\" [for]=\"'zone-' + zone.tagName\">\r\n {{ zone.tagName }}\r\n </label>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Action Buttons -->\r\n <div class=\"modal-footer-custom mt-4\">\r\n <div class=\"d-flex gap-3 justify-content-end\">\r\n <button type=\"button\" class=\"btn btn-outline\" (click)=\"onCancel()\">Cancel</button>\r\n <button type=\"button\" class=\"btn btn-primary\" (click)=\"onCreate()\" [disabled]=\"createZoneGroupForm.invalid\">\r\n {{ isEditMode ? 'Update' : 'Create' }}\r\n </button>\r\n </div>\r\n </div>\r\n </form>\r\n</div>\r\n\r\n<!-- Zone Already Tagged Modal -->\r\n<ng-template #zoneTaggedModal let-modal>\r\n <div class=\"modal-header border-0 pb-0\">\r\n <button type=\"button\" class=\"btn-close\" aria-label=\"Close\" (click)=\"onCloseZoneTaggedModal()\"></button>\r\n </div>\r\n <div class=\"modal-body delete-zone-modal-body\" style=\"bottom: 13px;\">\r\n <div class=\"delete-zone-icon mb-4\">\r\n <svg width=\"56\" height=\"56\" viewBox=\"0 0 56 56\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <rect x=\"4\" y=\"4\" width=\"48\" height=\"48\" rx=\"24\" fill=\"#FEF0C7\" />\r\n <rect x=\"4\" y=\"4\" width=\"48\" height=\"48\" rx=\"24\" stroke=\"#FFFAEB\" stroke-width=\"8\" />\r\n <path\r\n d=\"M27.9988 24.0002V28.0002M27.9988 32.0002H28.0088M26.2888 18.8602L17.8188 33.0002C17.6442 33.3026 17.5518 33.6455 17.5508 33.9947C17.5498 34.3439 17.6403 34.6873 17.8132 34.9907C17.9862 35.2941 18.2355 35.547 18.5365 35.7241C18.8375 35.9012 19.1796 35.9964 19.5288 36.0002H36.4688C36.818 35.9964 37.1601 35.9012 37.4611 35.7241C37.7621 35.547 38.0114 35.2941 38.1844 34.9907C38.3573 34.6873 38.4478 34.3439 38.4468 33.9947C38.4458 33.6455 38.3534 33.3026 38.1788 33.0002L29.7088 18.8602C29.5305 18.5663 29.2795 18.3233 28.98 18.1547C28.6805 17.9861 28.3425 17.8975 27.9988 17.8975C27.6551 17.8975 27.3171 17.9861 27.0176 18.1547C26.7181 18.3233 26.4671 18.5663 26.2888 18.8602Z\"\r\n stroke=\"#DC6803\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n </div>\r\n\r\n <h4 class=\"delete-zone-title mb-3\">\r\n Zone Already Tagged\r\n </h4>\r\n\r\n <p class=\"delete-zone-description text-center mb-4\">\r\n The selected zone <span class=\"delete-zone-name\">{{ conflictZoneName || 'Zone Name' }}</span>\r\n is already tagged to another group\r\n <span class=\"delete-zone-name\">{{ conflictGroupName || 'Group Name' }}</span>.\r\n If you want to add this to the group, you need to remove the zone from the other group.\r\n </p>\r\n\r\n <div class=\"modal-footer-custom mt-4\">\r\n <div class=\"d-flex gap-3 justify-content-center\">\r\n <button type=\"button\" class=\"btn btn-outline\" (click)=\"onCloseZoneTaggedModal()\">Cancel</button>\r\n <button type=\"button\" class=\"btn btn-primary\" (click)=\"onCloseZoneTaggedModal()\">Okay</button>\r\n </div>\r\n </div>\r\n </div>\r\n</ng-template>", styles: [".create-zone-group-modal{padding:24px}.modal-header-custom .header-icon{width:40px;height:40px;border-radius:50%;background-color:#daf1ff;display:flex;align-items:center;justify-content:center;flex-shrink:0}.modal-header-custom .modal-title{font-size:18px;font-weight:600;color:#101828;line-height:28px}.form-group .form-label{font-size:14px;font-weight:500;color:#344054;margin-bottom:8px;display:block}.form-group .form-label .text-danger{color:#f04438;margin-left:2px}.form-group .form-control{border:1px solid #D0D5DD;border-radius:8px;padding:10px 14px;font-size:14px;color:#344054;height:44px;transition:all .2s ease}.form-group .form-control:focus{border-color:#009bf3;box-shadow:0 0 0 3px #009bf31a;outline:none}.form-group .form-control.is-invalid{border-color:#f04438}.form-group .form-control.is-invalid:focus{border-color:#f04438;box-shadow:0 0 0 3px #f044381a}.form-group .form-control::placeholder{color:#98a2b3}.form-group .invalid-feedback{display:block;width:100%;margin-top:6px;font-size:12px;color:#f04438}.zones-tagged-container{position:relative}.zones-tagged-container .zones-input-wrapper{display:flex;flex-wrap:wrap;align-items:flex-start;gap:8px;min-height:108px;max-height:120px;padding:12px 14px;cursor:text;align-content:flex-start;position:relative;overflow-y:auto;overflow-x:hidden;border:1px solid #D0D5DD;border-radius:8px;background-color:#fff;scrollbar-width:thin;scrollbar-color:#D0D5DD transparent}.zones-tagged-container .zones-input-wrapper.has-tags{padding:12px 14px;min-height:108px;max-height:120px}.zones-tagged-container .zones-input-wrapper:focus-within{border-color:#009bf3;box-shadow:0 0 0 3px #009bf31a}.zones-tagged-container .zones-input-wrapper::-webkit-scrollbar{width:6px}.zones-tagged-container .zones-input-wrapper::-webkit-scrollbar-track{background:transparent;border-radius:3px}.zones-tagged-container .zones-input-wrapper::-webkit-scrollbar-thumb{background:#d0d5dd;border-radius:3px;transition:background .2s ease}.zones-tagged-container .zones-input-wrapper::-webkit-scrollbar-thumb:hover{background:#98a2b3}.zones-tagged-container .zones-input-wrapper:focus-within{border-color:#344054;box-shadow:0 0 0 3px #009bf31a}.zones-tagged-container .zones-input-wrapper .zones-input{flex:1 1 100%;border:none!important;outline:none!important;padding:0;font-size:14px;color:#344054;min-width:100%;width:100%;max-width:100%;background:transparent;margin-top:2px;height:20px;line-height:20px;display:inline-block;visibility:visible;box-shadow:none!important}.zones-tagged-container .zones-input-wrapper .zones-input::placeholder{color:#98a2b3;opacity:1}.zones-tagged-container .zones-input-wrapper .zones-input:disabled{background:transparent;cursor:not-allowed;opacity:.6}.zones-tagged-container .zones-input-wrapper .zones-input:focus{outline:none!important;border:none!important;box-shadow:none!important}.zones-tagged-container .zones-input-wrapper .zones-input::-webkit-input-placeholder{color:#98a2b3;opacity:1}.zones-tagged-container .zones-input-wrapper .zones-input::-moz-placeholder{color:#98a2b3;opacity:1}.zones-tagged-container .zones-input-wrapper .zones-input:-ms-input-placeholder{color:#98a2b3;opacity:1}.zones-tagged-container .zones-input-wrapper .zone-tag{display:inline-flex;align-items:center;gap:6px;background-color:#f2f4f7;border-radius:6px;padding:6px 10px;font-size:14px;color:#344054;line-height:1.4;margin-top:2px}.zones-tagged-container .zones-input-wrapper .zone-tag .zone-tag-name{font-weight:500}.zones-tagged-container .zones-input-wrapper .zone-tag .zone-tag-remove{display:flex;align-items:center;justify-content:center;cursor:pointer;padding:2px;border-radius:4px;transition:background-color .2s ease}.zones-tagged-container .zones-input-wrapper .zone-tag .zone-tag-remove:hover{background-color:#e4e7ec}.zones-tagged-container .zones-input-wrapper .zone-tag .zone-tag-remove svg{display:block}.zones-tagged-container .autocomplete-dropdown{position:absolute;top:100%;left:0;right:0;margin-top:4px;background-color:#fff;border:1px solid #D0D5DD;border-radius:8px;box-shadow:0 4px 6px -2px #10182808,0 12px 16px -4px #10182814;z-index:1000;max-height:200px;overflow-y:auto}.zones-tagged-container .autocomplete-dropdown .zones-list{padding:4px 0}.zones-tagged-container .autocomplete-dropdown .zone-option{display:block;cursor:pointer;transition:background-color .2s ease}.zones-tagged-container .autocomplete-dropdown .zone-option:hover{background-color:#f9fafb}.zones-tagged-container .autocomplete-dropdown .select-all-option{border-bottom:1px solid #EAECF0;font-weight:500;background-color:#f9fafb;border-top-left-radius:8px;border-top-right-radius:8px}.zones-tagged-container .autocomplete-dropdown .select-all-option:hover{background-color:#f2f4f7}.zones-tagged-container .autocomplete-dropdown .form-check{margin:0}.zones-tagged-container .autocomplete-dropdown .form-check-label{color:#344054;font-size:14px;font-weight:500;line-height:20px;margin:0;cursor:pointer}.zones-tagged-container .autocomplete-dropdown input[type=checkbox]{width:16px!important;height:16px!important;margin:-3px 5px;border-radius:4px!important;-webkit-appearance:none;-moz-appearance:none;-o-appearance:none;appearance:none;outline:1px solid #D0D5DD;box-shadow:none;font-size:.8em;text-align:center;line-height:1em;background:#fff;cursor:pointer}.zones-tagged-container .autocomplete-dropdown input[type=checkbox]:checked{outline:1px solid #00A3FF;background-color:#eaf8ff}.zones-tagged-container .autocomplete-dropdown input[type=checkbox]:checked:after{content:\"\";transform:rotate(45deg);border-bottom:2px solid #00A3FF;border-right:2px solid #00A3FF;display:inline-block;width:.2em;padding-left:0;padding-top:9px;padding-right:4px}.zones-tagged-container .autocomplete-dropdown .border-gray{border-color:#eaecf0!important}.modal-footer-custom{padding-top:16px;border-top:1px solid #EAECF0}.modal-footer-custom .btn{min-width:100px;height:44px;font-size:14px;font-weight:500;border-radius:8px;padding:10px 18px;transition:all .2s ease}.modal-footer-custom .btn.btn-outline{border:1px solid #D0D5DD;background-color:#fff;color:#344054}.modal-footer-custom .btn.btn-outline:hover{background-color:#f9fafb;border-color:#d0d5dd}.modal-footer-custom .btn.btn-primary{background-color:#009bf3;border-color:#009bf3;color:#fff}.modal-footer-custom .btn.btn-primary:hover:not(:disabled){background-color:#0085d1;border-color:#0085d1}.modal-footer-custom .btn.btn-primary:disabled{opacity:.6;cursor:not-allowed}.delete-zone-description{text-align:center;font-size:14px;font-weight:400;color:#344054;line-height:20px}.delete-zone-name{font-weight:700}\n"] }]
|
|
569
|
+
args: [{ selector: 'lib-create-single-zone-group', template: "<div class=\"create-zone-group-modal\">\r\n <form [formGroup]=\"createZoneGroupForm\" autocomplete=\"off\">\r\n <!-- Header -->\r\n <div class=\"modal-header-custom mb-4\">\r\n <div class=\"d-flex align-items-center\">\r\n <div class=\"header-icon me-3\">\r\n <svg *ngIf=\"!isEditMode\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\">\r\n <circle cx=\"12\" cy=\"12\" r=\"10\" fill=\"#00A3FF\" />\r\n <path d=\"M12 8V16M8 12H16\" stroke=\"white\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n <svg *ngIf=\"isEditMode\" width=\"56\" height=\"56\" viewBox=\"0 0 56 56\" fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\">\r\n <rect x=\"4\" y=\"4\" width=\"48\" height=\"48\" rx=\"24\" fill=\"#DAF1FF\" />\r\n <rect x=\"4\" y=\"4\" width=\"48\" height=\"48\" rx=\"24\" stroke=\"#EAF8FF\" stroke-width=\"8\" />\r\n <path\r\n d=\"M27 20.0002H20C19.4696 20.0002 18.9609 20.2109 18.5858 20.586C18.2107 20.9611 18 21.4698 18 22.0002V36.0002C18 36.5307 18.2107 37.0394 18.5858 37.4144C18.9609 37.7895 19.4696 38.0002 20 38.0002H34C34.5304 38.0002 35.0391 37.7895 35.4142 37.4144C35.7893 37.0394 36 36.5307 36 36.0002V29.0002M34.5 18.5002C34.8978 18.1024 35.4374 17.8789 36 17.8789C36.5626 17.8789 37.1022 18.1024 37.5 18.5002C37.8978 18.8981 38.1213 19.4376 38.1213 20.0002C38.1213 20.5628 37.8978 21.1024 37.5 21.5002L28 31.0002L24 32.0002L25 28.0002L34.5 18.5002Z\"\r\n stroke=\"#00A3FF\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n </div>\r\n <h4 class=\"modal-title mb-0\">{{ isEditMode ? 'Edit' : 'Create' }}</h4>\r\n </div>\r\n </div>\r\n\r\n <!-- Zone Group Name Input -->\r\n <div class=\"form-group mb-4\">\r\n <!-- <span class=\"text-danger\">*</span> -->\r\n <label for=\"groupName\" class=\"form-label\">Zone Group Name</label>\r\n <input type=\"text\" class=\"form-control\" id=\"groupName\" formControlName=\"groupName\"\r\n placeholder=\"Enter zone group name\" autocomplete=\"off\"\r\n [class.is-invalid]=\"createZoneGroupForm.get('groupName')?.invalid && createZoneGroupForm.get('groupName')?.touched && !createZoneGroupForm.get('groupName')?.pristine\">\r\n <div class=\"invalid-feedback\"\r\n *ngIf=\"createZoneGroupForm.get('groupName')?.invalid && createZoneGroupForm.get('groupName')?.touched && !createZoneGroupForm.get('groupName')?.pristine\">\r\n <span *ngIf=\"createZoneGroupForm.get('groupName')?.errors?.['required']\">GroupName is required</span>\r\n <span *ngIf=\"createZoneGroupForm.get('groupName')?.errors?.['minlength']\">GroupName must be at least 1\r\n characters</span>\r\n <span *ngIf=\"createZoneGroupForm.get('groupName')?.errors?.['pattern']\">\r\n Special characters are not allowed\r\n </span>\r\n </div>\r\n </div>\r\n\r\n <!-- Zones Tagged Input -->\r\n <div class=\"form-group mb-4\">\r\n <label for=\"zonesTagged\" class=\"form-label\" (mousedown)=\"$event.preventDefault()\"\r\n (click)=\"$event.stopPropagation()\">Zones Tagged</label>\r\n <div class=\"zones-tagged-container\" [class.has-dropdown]=\"showDropdown\">\r\n <div class=\"zones-input-wrapper\" [class.has-tags]=\"selectedZones.length > 0\" (click)=\"focusZoneInput()\">\r\n <!-- Selected Zone Tags -->\r\n <ng-container *ngFor=\"let zone of selectedZones; let i = index\">\r\n <span class=\"zone-tag\">\r\n <span class=\"zone-tag-name\">{{ zone.tagName }}</span>\r\n <span class=\"zone-tag-remove\" (click)=\"removeZone(i)\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\">\r\n <path d=\"M9 3L3 9M3 3L9 9\" stroke=\"#667085\" stroke-width=\"1.5\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg>\r\n </span>\r\n </span>\r\n </ng-container>\r\n\r\n <!-- Input Field -->\r\n <input #zoneInput type=\"text\" class=\"zones-input\" id=\"zonesTagged\" formControlName=\"zoneName\"\r\n (keydown)=\"onKeyDown($event)\" (focus)=\"onInputFocus()\" (blur)=\"onInputBlur()\" autocomplete=\"off\"\r\n [disabled]=\"zonesNotAvailable && availableZones.length === 0\">\r\n </div>\r\n\r\n <!-- Autocomplete Dropdown (shown when typing and matches found) -->\r\n <div class=\"autocomplete-dropdown\" *ngIf=\"showDropdown && filteredZones.length > 0\">\r\n <div class=\"zones-list\">\r\n <!-- Select All Option -->\r\n <div class=\"form-check d-flex align-items-center pt-3 px-5 select-all-option\" (mousedown)=\"$event.preventDefault()\">\r\n <input class=\"form-check-input\" type=\"checkbox\" [checked]=\"areAllFilteredZonesSelected()\"\r\n (click)=\"$event.stopPropagation()\" (change)=\"toggleSelectAll($event)\" id=\"selectAllZones\">\r\n <label class=\"form-check-label px-3\" for=\"selectAllZones\">\r\n Select All\r\n </label>\r\n </div>\r\n <div class=\"border border-gray mt-3\"></div>\r\n <!-- Zone Options -->\r\n <div *ngFor=\"let zone of filteredZones\" class=\"form-check d-flex align-items-center py-3 px-5 zone-option\"\r\n (mousedown)=\"$event.preventDefault()\">\r\n <input class=\"form-check-input cursor-pointer\" type=\"checkbox\" [checked]=\"isZoneSelected(zone)\"\r\n (click)=\"$event.stopPropagation()\" (change)=\"toggleZoneSelection(zone, $event)\" [id]=\"'zone-' + zone.tagName\">\r\n <label class=\"form-check-label px-3 cursor-pointer\" [for]=\"'zone-' + zone.tagName\">\r\n {{ zone.tagName }}\r\n </label>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Action Buttons -->\r\n <div class=\"modal-footer-custom mt-4\">\r\n <div class=\"d-flex gap-3 justify-content-end\">\r\n <button type=\"button\" class=\"btn btn-outline\" (click)=\"onCancel()\">Cancel</button>\r\n <button type=\"button\" class=\"btn btn-primary\" (click)=\"onCreate()\" [disabled]=\"createZoneGroupForm.invalid\">\r\n {{ isEditMode ? 'Update' : 'Create' }}\r\n </button>\r\n </div>\r\n </div>\r\n </form>\r\n</div>\r\n\r\n<!-- Zone Already Tagged Modal -->\r\n<ng-template #zoneTaggedModal let-modal>\r\n <!-- <div class=\"modal-header border-0 pb-0\">\r\n <button type=\"button\" class=\"btn-close\" aria-label=\"Close\" (click)=\"onCloseZoneTaggedModal()\"></button>\r\n </div> -->\r\n <div class=\"modal-body delete-zone-modal-body\" style=\"bottom: 13px;\">\r\n <div class=\"delete-zone-icon mb-4\">\r\n <svg width=\"56\" height=\"56\" viewBox=\"0 0 56 56\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <rect x=\"4\" y=\"4\" width=\"48\" height=\"48\" rx=\"24\" fill=\"#FEF0C7\" />\r\n <rect x=\"4\" y=\"4\" width=\"48\" height=\"48\" rx=\"24\" stroke=\"#FFFAEB\" stroke-width=\"8\" />\r\n <path\r\n d=\"M27.9988 24.0002V28.0002M27.9988 32.0002H28.0088M26.2888 18.8602L17.8188 33.0002C17.6442 33.3026 17.5518 33.6455 17.5508 33.9947C17.5498 34.3439 17.6403 34.6873 17.8132 34.9907C17.9862 35.2941 18.2355 35.547 18.5365 35.7241C18.8375 35.9012 19.1796 35.9964 19.5288 36.0002H36.4688C36.818 35.9964 37.1601 35.9012 37.4611 35.7241C37.7621 35.547 38.0114 35.2941 38.1844 34.9907C38.3573 34.6873 38.4478 34.3439 38.4468 33.9947C38.4458 33.6455 38.3534 33.3026 38.1788 33.0002L29.7088 18.8602C29.5305 18.5663 29.2795 18.3233 28.98 18.1547C28.6805 17.9861 28.3425 17.8975 27.9988 17.8975C27.6551 17.8975 27.3171 17.9861 27.0176 18.1547C26.7181 18.3233 26.4671 18.5663 26.2888 18.8602Z\"\r\n stroke=\"#DC6803\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n </div>\r\n\r\n <h4 class=\"delete-zone-title mb-3\">\r\n Zone Already Tagged\r\n </h4>\r\n\r\n <p class=\"delete-zone-description text-center mb-4\">\r\n The selected zone <span class=\"delete-zone-name\">{{ conflictZoneName || 'Zone Name' }}</span>\r\n is already tagged to another group\r\n <span class=\"delete-zone-name\">{{ conflictGroupName || 'Group Name' }}</span>.\r\n If you want to add this to the group, you need to remove the zone from the other group.\r\n </p>\r\n\r\n <div class=\"modal-footer-custom mt-4\">\r\n <div class=\"d-flex gap-3 justify-content-center\">\r\n <button type=\"button\" class=\"btn btn-primary\" (click)=\"onCloseZoneTaggedModal()\">Okay</button>\r\n </div>\r\n </div>\r\n </div>\r\n</ng-template>", styles: [".create-zone-group-modal{padding:24px}.modal-header-custom .header-icon{width:40px;height:40px;border-radius:50%;background-color:#daf1ff;display:flex;align-items:center;justify-content:center;flex-shrink:0}.modal-header-custom .modal-title{font-size:18px;font-weight:600;color:#101828;line-height:28px}.form-group .form-label{font-size:14px;font-weight:500;color:#344054;margin-bottom:8px;display:block}.form-group .form-label .text-danger{color:#f04438;margin-left:2px}.form-group .form-control{border:1px solid #D0D5DD;border-radius:8px;padding:10px 14px;font-size:14px;color:#344054;height:44px;transition:all .2s ease}.form-group .form-control:focus{border-color:#009bf3;box-shadow:0 0 0 3px #009bf31a;outline:none}.form-group .form-control.is-invalid{border-color:#f04438}.form-group .form-control.is-invalid:focus{border-color:#f04438;box-shadow:0 0 0 3px #f044381a}.form-group .form-control::placeholder{color:#98a2b3}.form-group .invalid-feedback{display:block;width:100%;margin-top:6px;font-size:12px;color:#f04438}.zones-tagged-container{position:relative}.zones-tagged-container .zones-input-wrapper{display:flex;flex-wrap:wrap;align-items:flex-start;gap:8px;min-height:108px;max-height:120px;padding:12px 14px;cursor:text;align-content:flex-start;position:relative;overflow-y:auto;overflow-x:hidden;border:1px solid #D0D5DD;border-radius:8px;background-color:#fff;scrollbar-width:thin;scrollbar-color:#D0D5DD transparent}.zones-tagged-container .zones-input-wrapper.has-tags{padding:12px 14px;min-height:108px;max-height:120px}.zones-tagged-container .zones-input-wrapper:focus-within{border-color:#009bf3;box-shadow:0 0 0 3px #009bf31a}.zones-tagged-container .zones-input-wrapper::-webkit-scrollbar{width:6px}.zones-tagged-container .zones-input-wrapper::-webkit-scrollbar-track{background:transparent;border-radius:3px}.zones-tagged-container .zones-input-wrapper::-webkit-scrollbar-thumb{background:#d0d5dd;border-radius:3px;transition:background .2s ease}.zones-tagged-container .zones-input-wrapper::-webkit-scrollbar-thumb:hover{background:#98a2b3}.zones-tagged-container .zones-input-wrapper:focus-within{border-color:#344054;box-shadow:0 0 0 3px #009bf31a}.zones-tagged-container .zones-input-wrapper .zones-input{flex:1 1 100%;border:none!important;outline:none!important;padding:0;font-size:14px;color:#344054;min-width:100%;width:100%;max-width:100%;background:transparent;margin-top:2px;height:20px;line-height:20px;display:inline-block;visibility:visible;box-shadow:none!important}.zones-tagged-container .zones-input-wrapper .zones-input::placeholder{color:#98a2b3;opacity:1}.zones-tagged-container .zones-input-wrapper .zones-input:disabled{background:transparent;cursor:not-allowed;opacity:.6}.zones-tagged-container .zones-input-wrapper .zones-input:focus{outline:none!important;border:none!important;box-shadow:none!important}.zones-tagged-container .zones-input-wrapper .zones-input::-webkit-input-placeholder{color:#98a2b3;opacity:1}.zones-tagged-container .zones-input-wrapper .zones-input::-moz-placeholder{color:#98a2b3;opacity:1}.zones-tagged-container .zones-input-wrapper .zones-input:-ms-input-placeholder{color:#98a2b3;opacity:1}.zones-tagged-container .zones-input-wrapper .zone-tag{display:inline-flex;align-items:center;gap:6px;background-color:#f2f4f7;border-radius:6px;padding:6px 10px;font-size:14px;color:#344054;line-height:1.4;margin-top:2px}.zones-tagged-container .zones-input-wrapper .zone-tag .zone-tag-name{font-weight:500}.zones-tagged-container .zones-input-wrapper .zone-tag .zone-tag-remove{display:flex;align-items:center;justify-content:center;cursor:pointer;padding:2px;border-radius:4px;transition:background-color .2s ease}.zones-tagged-container .zones-input-wrapper .zone-tag .zone-tag-remove:hover{background-color:#e4e7ec}.zones-tagged-container .zones-input-wrapper .zone-tag .zone-tag-remove svg{display:block}.zones-tagged-container .autocomplete-dropdown{position:absolute;top:100%;left:0;right:0;margin-top:4px;background-color:#fff;border:1px solid #D0D5DD;border-radius:8px;box-shadow:0 4px 6px -2px #10182808,0 12px 16px -4px #10182814;z-index:1000;max-height:200px;overflow-y:auto}.zones-tagged-container .autocomplete-dropdown .zones-list{padding:4px 0}.zones-tagged-container .autocomplete-dropdown .zone-option{display:block;cursor:pointer;transition:background-color .2s ease}.zones-tagged-container .autocomplete-dropdown .zone-option:hover{background-color:#f9fafb}.zones-tagged-container .autocomplete-dropdown .select-all-option{border-bottom:1px solid #EAECF0;font-weight:500;background-color:#f9fafb;border-top-left-radius:8px;border-top-right-radius:8px}.zones-tagged-container .autocomplete-dropdown .select-all-option:hover{background-color:#f2f4f7}.zones-tagged-container .autocomplete-dropdown .form-check{margin:0}.zones-tagged-container .autocomplete-dropdown .form-check-label{color:#344054;font-size:14px;font-weight:500;line-height:20px;margin:0;cursor:pointer}.zones-tagged-container .autocomplete-dropdown input[type=checkbox]{width:16px!important;height:16px!important;margin:-3px 5px;border-radius:4px!important;-webkit-appearance:none;-moz-appearance:none;-o-appearance:none;appearance:none;outline:1px solid #D0D5DD;box-shadow:none;font-size:.8em;text-align:center;line-height:1em;background:#fff;cursor:pointer}.zones-tagged-container .autocomplete-dropdown input[type=checkbox]:checked{outline:1px solid #00A3FF;background-color:#eaf8ff}.zones-tagged-container .autocomplete-dropdown input[type=checkbox]:checked:after{content:\"\";transform:rotate(45deg);border-bottom:2px solid #00A3FF;border-right:2px solid #00A3FF;display:inline-block;width:.2em;padding-left:0;padding-top:9px;padding-right:4px}.zones-tagged-container .autocomplete-dropdown .border-gray{border-color:#eaecf0!important}.modal-footer-custom{padding-top:16px;border-top:1px solid #EAECF0}.modal-footer-custom .btn{min-width:100px;height:44px;font-size:14px;font-weight:500;border-radius:8px;padding:10px 18px;transition:all .2s ease}.modal-footer-custom .btn.btn-outline{border:1px solid #D0D5DD;background-color:#fff;color:#344054}.modal-footer-custom .btn.btn-outline:hover{background-color:#f9fafb;border-color:#d0d5dd}.modal-footer-custom .btn.btn-primary{background-color:#009bf3;border-color:#009bf3;color:#fff}.modal-footer-custom .btn.btn-primary:hover:not(:disabled){background-color:#0085d1;border-color:#0085d1}.modal-footer-custom .btn.btn-primary:disabled{opacity:.6;cursor:not-allowed}.delete-zone-description{text-align:center;font-size:14px;font-weight:400;color:#344054;line-height:20px}.delete-zone-name{font-weight:700}\n"] }]
|
|
553
570
|
}], ctorParameters: () => [{ type: i1.FormBuilder }, { type: i2.NgbActiveModal }, { type: i2.NgbModal }, { type: i3.ClientApiService }, { type: i4.ToastService }, { type: i0.ChangeDetectorRef }], propDecorators: { zoneInputRef: [{
|
|
554
571
|
type: ViewChild,
|
|
555
572
|
args: ['zoneInput']
|
|
@@ -560,4 +577,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
|
|
|
560
577
|
type: HostListener,
|
|
561
578
|
args: ['document:click', ['$event']]
|
|
562
579
|
}] } });
|
|
563
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3JlYXRlLXNpbmdsZS16b25lLWdyb3VwLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3RhbmdvLW1hbmFnZS1zZXR0aW5ncy9zcmMvbGliL2NvbXBvbmVudHMvY29uZmlndXJhdGlvbnMvem9uZS1jb25maWd1cmF0aW9uL2NyZWF0ZS1zaW5nbGUtem9uZS1ncm91cC9jcmVhdGUtc2luZ2xlLXpvbmUtZ3JvdXAuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdGFuZ28tbWFuYWdlLXNldHRpbmdzL3NyYy9saWIvY29tcG9uZW50cy9jb25maWd1cmF0aW9ucy96b25lLWNvbmZpZ3VyYXRpb24vY3JlYXRlLXNpbmdsZS16b25lLWdyb3VwL2NyZWF0ZS1zaW5nbGUtem9uZS1ncm91cC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQXFCLFNBQVMsRUFBcUIsWUFBWSxFQUFlLE1BQU0sZUFBZSxDQUFDO0FBQzNHLE9BQU8sRUFBMEIsVUFBVSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFHcEUsT0FBTyxFQUFFLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFFMUMsT0FBTyxFQUFjLFNBQVMsRUFBRSxNQUFNLGVBQWUsQ0FBQzs7Ozs7OztBQU90RCxNQUFNLE9BQU8sOEJBQThCO0lBb0IvQjtJQUNEO0lBQ0M7SUFDQTtJQUNBO0lBQ0E7SUF4QlYsbUJBQW1CLENBQVk7SUFDL0IsY0FBYyxHQUFVLEVBQUUsQ0FBQztJQUMzQixhQUFhLEdBQVUsRUFBRSxDQUFDO0lBQzFCLGFBQWEsR0FBVSxFQUFFLENBQUM7SUFDMUIsaUJBQWlCLEdBQVksS0FBSyxDQUFDO0lBQ25DLFFBQVEsR0FBVyxFQUFFLENBQUM7SUFDdEIsVUFBVSxHQUFZLEtBQUssQ0FBQztJQUM1QixhQUFhLEdBQVEs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Q0FBQztxQkFDMUQ7Z0JBQ0gsQ0FBQztnQkFDRCxLQUFLLEVBQUUsQ0FBQyxHQUFRLEVBQUUsRUFBRTtvQkFDbEIsSUFBSSxDQUFDLFlBQVksQ0FBQyxhQUFhLENBQUMsR0FBRyxDQUFDLEtBQUssRUFBRSxLQUFLLElBQUksUUFBUSxDQUFDLENBQUM7Z0JBQ2hFLENBQUM7YUFDRixDQUFDLENBQUM7U0FDSjtJQUNILENBQUM7d0dBOWxCVSw4QkFBOEI7NEZBQTlCLDhCQUE4QiwwVkNiM0MseTdSQTJJYzs7NEZEOUhELDhCQUE4QjtrQkFMMUMsU0FBUzsrQkFDRSw4QkFBOEI7OE5BZ0JoQixZQUFZO3NCQUFuQyxTQUFTO3VCQUFDLFdBQVc7Z0JBQzJCLGVBQWU7c0JBQS9ELFNBQVM7dUJBQUMsaUJBQWlCLEVBQUUsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFO2dCQWthL0MsZUFBZTtzQkFEZCxZQUFZO3VCQUFDLGdCQUFnQixFQUFFLENBQUMsUUFBUSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ2hhbmdlRGV0ZWN0b3JSZWYsIENvbXBvbmVudCwgT25EZXN0cm95LCBPbkluaXQsIEhvc3RMaXN0ZW5lciwgVGVtcGxhdGVSZWYgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgRm9ybUJ1aWxkZXIsIEZvcm1Hcm91cCwgVmFsaWRhdG9ycyB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcclxuaW1wb3J0IHsgTmdiQWN0aXZlTW9kYWwsIE5nYk1vZGFsIH0gZnJvbSAnQG5nLWJvb3RzdHJhcC9uZy1ib290c3RyYXAnO1xyXG5pbXBvcnQgeyBDbGllbnRBcGlTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vLi4vc2VydmljZXMvY2xpZW50LWFwaS5zZXJ2aWNlJztcclxuaW1wb3J0IHsgU3ViamVjdCwgdGFrZVVudGlsIH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IFRvYXN0U2VydmljZSB9IGZyb20gJ3RhbmdvLWFwcC11aS1zaGFyZWQnO1xyXG5pbXBvcnQgeyBFbGVtZW50UmVmLCBWaWV3Q2hpbGQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnbGliLWNyZWF0ZS1zaW5nbGUtem9uZS1ncm91cCcsXHJcbiAgdGVtcGxhdGVVcmw6ICcuL2NyZWF0ZS1zaW5nbGUtem9uZS1ncm91cC5jb21wb25lbnQuaHRtbCcsXHJcbiAgc3R5bGVVcmw6ICcuL2NyZWF0ZS1zaW5nbGUtem9uZS1ncm91cC5jb21wb25lbnQuc2NzcydcclxufSlcclxuZXhwb3J0IGNsYXNzIENyZWF0ZVNpbmdsZVpvbmVHcm91cENvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95IHtcclxuICBjcmVhdGVab25lR3JvdXBGb3JtOiBGb3JtR3JvdXA7XHJcbiAgYXZhaWxhYmxlWm9uZXM6IGFueVtdID0gW107XHJcbiAgc2VsZWN0ZWRab25lczogYW55W10gPSBbXTtcclxuICBmaWx0ZXJlZFpvbmVzOiBhbnlbXSA9IFtdO1xyXG4gIHpvbmVzTm90QXZhaWxhYmxlOiBib29sZWFuID0gZmFsc2U7XHJcbiAgY2xpZW50SWQ6IHN0cmluZyA9ICcnO1xyXG4gIGlzRWRpdE1vZGU6IGJvb2xlYW4gPSBmYWxzZTtcclxuICB6b25lR3JvdXBEYXRhOiBhbnkgPSBudWxsO1xyXG4gIHNob3dEcm9wZG93bjogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIHByaXZhdGUgaXNUb2dnbGluZzogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgZGVzdHJveSQgPSBuZXcgU3ViamVjdCgpO1xyXG4gIEBWaWV3Q2hpbGQoJ3pvbmVJbnB1dCcpIHpvbmVJbnB1dFJlZiE6IEVsZW1lbnRSZWY8SFRNTElucHV0RWxlbWVudD47XHJcbiAgQFZpZXdDaGlsZCgnem9uZVRhZ2dlZE1vZGFsJywgeyBzdGF0aWM6IGZhbHNlIH0pIHpvbmVUYWdnZWRNb2RhbCE6IFRlbXBsYXRlUmVmPGFueT47XHJcbiAgem9uZVRhZ2dlZE1vZGFsUmVmOiBhbnkgPSBudWxsO1xyXG4gIGNvbmZsaWN0Wm9uZU5hbWU6IHN0cmluZyA9ICcnO1xyXG4gIGNvbmZsaWN0R3JvdXBOYW1lOiBzdHJpbmcgPSAnJztcclxuXHJcblxyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgcHJpdmF0ZSBmYjogRm9ybUJ1aWxkZXIsXHJcbiAgICBwdWJsaWMgYWN0aXZlTW9kYWw6IE5nYkFjdGl2ZU1vZGFsLFxyXG4gICAgcHJpdmF0ZSBtb2RhbFNlcnZpY2U6IE5nYk1vZGFsLFxyXG4gICAgcHJpdmF0ZSBjbGllbnRBcGlTZXJ2aWNlOiBDbGllbnRBcGlTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSB0b2FzdFNlcnZpY2U6IFRvYXN0U2VydmljZSxcclxuICAgIHByaXZhdGUgY2RyOiBDaGFuZ2VEZXRlY3RvclJlZlxyXG4gICkge1xyXG4gICAgdGhpcy5jcmVhdGVab25lR3JvdXBGb3JtID0gdGhpcy5mYi5ncm91cCh7XHJcbiAgICAgIGdyb3VwTmFtZTogWycnLCBbXHJcbiAgICAgICAgVmFsaWRhdG9ycy5yZXF1aXJlZCxcclxuICAgICAgICBWYWxpZGF0b3JzLm1pbkxlbmd0aCgxKSxcclxuICAgICAgICBWYWxpZGF0b3JzLnBhdHRlcm4oL14oPyFcXHMqJClbYS16QS1aMC05XFxzXFwvXSokLylcclxuICAgICAgXV0sXHJcbiAgICAgIHpvbmVOYW1lOiBbJyddLFxyXG4gICAgICB6b25lc1RhZ2dlZDogW1tdXVxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBuZ09uSW5pdCgpOiB2b2lkIHtcclxuICAgIC8vIEVuc3VyZSBmb3JtIGNvbnRyb2xzIGFyZSBtYXJrZWQgYXMgdW50b3VjaGVkIHdoZW4gbW9kYWwgb3BlbnNcclxuICAgIHRoaXMuY3JlYXRlWm9uZUdyb3VwRm9ybS5tYXJrQXNVbnRvdWNoZWQoKTtcclxuICAgIHRoaXMuY3JlYXRlWm9uZUdyb3VwRm9ybS5nZXQoJ2dyb3VwTmFtZScpPy5tYXJrQXNVbnRvdWNoZWQoKTtcclxuICAgIHRoaXMuY3JlYXRlWm9uZUdyb3VwRm9ybS5nZXQoJ3pvbmVOYW1lJyk/Lm1hcmtBc1VudG91Y2hlZCgpO1xyXG4gICAgLy8gR2V0IGNsaWVudCBJRFxyXG4gICAgdGhpcy5jbGllbnRBcGlTZXJ2aWNlLmNsaWVudERhdGEucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpLnN1YnNjcmliZSgoZSkgPT4ge1xyXG4gICAgICBpZiAoZSkge1xyXG4gICAgICAgIHRoaXMuY2xpZW50SWQgPSBlLmNsaWVudElkO1xyXG4gICAgICAgIHRoaXMubG9hZFpvbmVzKCk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG5cclxuICAgIC8vIFdhdGNoIGZvciB6b25lIGlucHV0IGNoYW5nZXMgdG8gZmlsdGVyIHpvbmVzXHJcbiAgICB0aGlzLmNyZWF0ZVpvbmVHcm91cEZvcm0uZ2V0KCd6b25lTmFtZScpPy52YWx1ZUNoYW5nZXMucGlwZShcclxuICAgICAgdGFrZVVudGlsKHRoaXMuZGVzdHJveSQpXHJcbiAgICApLnN1YnNjcmliZSgodmFsdWU6IHN0cmluZykgPT4ge1xyXG4gICAgICB0aGlzLmZpbHRlclpvbmVzKHZhbHVlIHx8ICcnKTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XHJcbiAgICB0aGlzLmRlc3Ryb3kkLm5leHQodHJ1ZSk7XHJcbiAgICB0aGlzLmRlc3Ryb3kkLmNvbXBsZXRlKCk7XHJcbiAgfVxyXG5cclxuICAvLyBNZXRob2QgdG8gaW5pdGlhbGl6ZSBjb21wb25lbnQgaW4gZWRpdCBtb2RlXHJcbiAgc2V0Wm9uZUdyb3VwRGF0YUZvckVkaXQoZ3JvdXA6IGFueSk6IHZvaWQge1xyXG4gICAgY29uc29sZS5sb2coJ3NldFpvbmVHcm91cERhdGFGb3JFZGl0IDonLCBncm91cCk7XHJcbiAgICB0aGlzLmlzRWRpdE1vZGUgPSB0cnVlO1xyXG4gICAgdGhpcy56b25lR3JvdXBEYXRhID0gZ3JvdXA7XHJcblxyXG4gICAgLy8gRW5zdXJlIGZvcm0gY29udHJvbHMgYXJlIG1hcmtlZCBhcyB1bnRvdWNoZWQgYmVmb3JlIHNldHRpbmcgdmFsdWVzXHJcbiAgICB0aGlzLmNyZWF0ZVpvbmVHcm91cEZvcm0ubWFya0FzVW50b3VjaGVkKCk7XHJcbiAgICB0aGlzLmNyZWF0ZVpvbmVHcm91cEZvcm0uZ2V0KCdncm91cE5hbWUnKT8ubWFya0FzVW50b3VjaGVkKCk7XHJcbiAgICB0aGlzLmNyZWF0ZVpvbmVHcm91cEZvcm0uZ2V0KCd6b25lTmFtZScpPy5tYXJrQXNVbnRvdWNoZWQoKTtcclxuXHJcbiAgICAvLyBSZXNldCBmb3JtIGNsZWFubHkgd2l0aCBncm91cCBuYW1lXHJcbiAgICB0aGlzLmNyZWF0ZVpvbmVHcm91cEZvcm0ucmVzZXQoe1xyXG4gICAgICBncm91cE5hbWU6IGdyb3VwLmdyb3VwTmFtZSxcclxuICAgICAgem9uZU5hbWU6ICcnLFxyXG4gICAgICB6b25lc1RhZ2dlZDogW11cclxuICAgIH0sIHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcclxuXHJcbiAgICAvLyBQcmVwb3B1bGF0ZSBzZWxlY3RlZCB6b25lcyBmcm9tIHRoZSBncm91cCBkYXRhXHJcbiAgICB0aGlzLnNlbGVjdGVkWm9uZXMgPSBbXTtcclxuICAgIGNvbnN0IHpvbmVzTGlzdCA9IHRoaXMuZ2V0Wm9uZXNGcm9tR3JvdXAoZ3JvdXApO1xyXG5cclxuICAgIGlmICh6b25lc0xpc3QgJiYgem9uZXNMaXN0Lmxlbmd0aCA+IDApIHtcclxuICAgICAgem9uZXNMaXN0LmZvckVhY2goKHpvbmU6IGFueSkgPT4ge1xyXG4gICAgICAgIGxldCB6b25lTmFtZTogc3RyaW5nID0gJyc7XHJcblxyXG4gICAgICAgIC8vIEhhbmRsZSBkaWZmZXJlbnQgZGF0YSBzdHJ1Y3R1cmVzOiBzdHJpbmcsIG9yIG9iamVjdCB3aXRoIHRhZ05hbWUvbmFtZS96b25lTmFtZVxyXG4gICAgICAgIGlmICh0eXBlb2Ygem9uZSA9PT0gJ3N0cmluZycpIHtcclxuICAgICAgICAgIHpvbmVOYW1lID0gem9uZS50cmltKCk7XHJcbiAgICAgICAgfSBlbHNlIGlmICh6b25lICYmIHR5cGVvZiB6b25lID09PSAnb2JqZWN0Jykge1xyXG4gICAgICAgICAgY29uc3QgdGFnTmFtZSA9IHpvbmUudGFnTmFtZTtcclxuICAgICAgICAgIC8vIGNvbnN0IG5hbWUgPSB6b25lLm5hbWU7XHJcbiAgICAgICAgICAvLyBjb25zdCB6b25lTmFtZVByb3AgPSB6b25lLnpvbmVOYW1lO1xyXG5cclxuICAgICAgICAgIC8vIEdldCB0aGUgZmlyc3QgYXZhaWxhYmxlIHByb3BlcnR5IHZhbHVlIGFuZCBjb252ZXJ0IHRvIHN0cmluZ1xyXG4gICAgICAgICAgY29uc3QgdmFsdWUgPSB0YWdOYW1lO1xyXG4gICAgICAgICAgaWYgKHZhbHVlICE9IG51bGwpIHtcclxuICAgICAgICAgICAgem9uZU5hbWUgPSB0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnID8gdmFsdWUgOiBTdHJpbmcodmFsdWUpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHpvbmVOYW1lICYmIHpvbmVOYW1lICE9PSAnJykge1xyXG4gICAgICAgICAgdGhpcy5zZWxlY3RlZFpvbmVzLnB1c2goe1xyXG4gICAgICAgICAgICBuYW1lOiB6b25lTmFtZSxcclxuICAgICAgICAgICAgdGFnTmFtZTogem9uZU5hbWVcclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gVXBkYXRlIGZvcm0gY29udHJvbCBmb3Igem9uZXNUYWdnZWRcclxuICAgIHRoaXMuY3JlYXRlWm9uZUdyb3VwRm9ybS5nZXQoJ3pvbmVzVGFnZ2VkJyk/LnNldFZhbHVlKHRoaXMuc2VsZWN0ZWRab25lcywgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xyXG5cclxuICAgIC8vIFJlc2V0IGZpbHRlcmVkIHpvbmVzIGFuZCBkcm9wZG93blxyXG4gICAgdGhpcy5maWx0ZXJlZFpvbmVzID0gW107XHJcbiAgICB0aGlzLnNob3dEcm9wZG93biA9IGZhbHNlO1xyXG5cclxuICAgIC8vIE1hcmsgZm9ybSBhcyB1bnRvdWNoZWRcclxuICAgIHRoaXMuY3JlYXRlWm9uZUdyb3VwRm9ybS5tYXJrQXNVbnRvdWNoZWQoKTtcclxuXHJcbiAgICAvLyBGb3JjZSBVSSB1cGRhdGVcclxuICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcclxuICB9XHJcblxyXG4gIC8vIEhlbHBlciBtZXRob2QgdG8gZXh0cmFjdCB6b25lcyBmcm9tIGdyb3VwIGRhdGEgKGhhbmRsZXMgZGlmZmVyZW50IGRhdGEgc3RydWN0dXJlcylcclxuICBwcml2YXRlIGdldFpvbmVzRnJvbUdyb3VwKGdyb3VwOiBhbnkpOiBhbnlbXSB7XHJcbiAgICBpZiAoIWdyb3VwKSByZXR1cm4gW107XHJcblxyXG4gICAgLy8gQ2hlY2sgZm9yIHpvbmVzVGFnZ2VkIGZpcnN0IGFzIGl0J3MgdGhlIG1vc3QgY29tbW9uIHByb3BlcnR5IG5hbWVcclxuICAgIGlmIChBcnJheS5pc0FycmF5KGdyb3VwLnpvbmVzVGFnZ2VkKSkge1xyXG4gICAgICByZXR1cm4gZ3JvdXAuem9uZXNUYWdnZWQ7XHJcbiAgICB9XHJcbiAgICBpZiAoQXJyYXkuaXNBcnJheShncm91cC56b25lcykpIHtcclxuICAgICAgcmV0dXJuIGdyb3VwLnpvbmVzO1xyXG4gICAgfVxyXG4gICAgaWYgKEFycmF5LmlzQXJyYXkoZ3JvdXAuem9uZUxpc3QpKSB7XHJcbiAgICAgIHJldHVybiBncm91cC56b25lTGlzdDtcclxuICAgIH1cclxuICAgIC8vIElmIHpvbmVzIGFyZSBzdG9yZWQgYXMgYW4gYXJyYXkgb2Ygem9uZSBuYW1lc1xyXG4gICAgaWYgKGdyb3VwLnpvbmVOYW1lcyAmJiBBcnJheS5pc0FycmF5KGdyb3VwLnpvbmVOYW1lcykpIHtcclxuICAgICAgcmV0dXJuIGdyb3VwLnpvbmVOYW1lcztcclxuICAgIH1cclxuICAgIHJldHVybiBbXTtcclxuICB9XHJcblxyXG4gIGxvYWRab25lcygpOiB2b2lkIHtcclxuICAgIGlmICghdGhpcy5jbGllbnRJZCkgcmV0dXJuO1xyXG4gICAgdGhpcy5jbGllbnRBcGlTZXJ2aWNlLmdldFpvbmVDb25maWdUYWdnaW5nRGV0YWlscyh7IFxyXG4gICAgICBjbGllbnRJZDogdGhpcy5jbGllbnRJZCxcclxuICAgICAgbGltaXQ6IDEwMDAwXHJcbiAgICB9KS5waXBlKFxyXG4gICAgICB0YWtlVW50aWwodGhpcy5kZXN0cm95JClcclxuICAgICkuc3Vic2NyaWJlKHtcclxuICAgICAgbmV4dDogKHJlczogYW55KSA9PiB7XHJcbiAgICAgICAgaWYgKHJlcyAmJiByZXMuY29kZSA9PT0gMjAwKSB7XHJcbiAgICAgICAgICB0aGlzLmF2YWlsYWJsZVpvbmVzID0gcmVzPy5kYXRhPy5yZXN1bHQuZmlsdGVyKCh6b25lOiBhbnkpID0+IHpvbmUudGFnTmFtZSAmJiB6b25lLnRhZ05hbWUgIT09ICcnKSB8fCBbXTtcclxuICAgICAgICAgIHRoaXMuem9uZXNOb3RBdmFpbGFibGUgPSB0aGlzLmF2YWlsYWJsZVpvbmVzLmxlbmd0aCA9PT0gMDtcclxuICAgICAgICAgIHRoaXMuZmlsdGVyZWRab25lcyA9IFtdO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICB0aGlzLnpvbmVzTm90QXZhaWxhYmxlID0gdHJ1ZTtcclxuICAgICAgICAgIHRoaXMuYXZhaWxhYmxlWm9uZXMgPSBbXTtcclxuICAgICAgICAgIHRoaXMuZmlsdGVyZWRab25lcyA9IFtdO1xyXG4gICAgICAgIH1cclxuICAgICAgfSxcclxuICAgICAgZXJyb3I6IChlcnI6IGFueSkgPT4ge1xyXG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yIGxvYWRpbmcgem9uZXMgdGFnOicsIGVycik7XHJcbiAgICAgICAgdGhpcy56b25lc05vdEF2YWlsYWJsZSA9IHRydWU7XHJcbiAgICAgICAgdGhpcy5hdmFpbGFibGVab25lcyA9IFtdO1xyXG4gICAgICAgIHRoaXMuZmlsdGVyZWRab25lcyA9IFtdO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIC8vIGZpbHRlclpvbmVzKHNlYXJjaFRlcm06IHN0cmluZyk6IHZvaWQge1xyXG4gIC8vICAgY29uc3QgdHJpbW1lZFNlYXJjaCA9IHNlYXJjaFRlcm0udHJpbSgpLnRvTG93ZXJDYXNlKCk7XHJcblxyXG4gIC8vICAgLy8gRmlsdGVyIHpvbmVzIHRoYXQgbWF0Y2ggdGhlIHNlYXJjaCB0ZXJtIGFuZCBhcmUgbm90IGFscmVhZHkgc2VsZWN0ZWRcclxuICAvLyAgIC8vIElmIHNlYXJjaCB0ZXJtIGlzIGVtcHR5LCBzaG93IGFsbCBhdmFpbGFibGUgem9uZXMgKGV4Y2x1ZGluZyBzZWxlY3RlZCBvbmVzKVxyXG4gIC8vICAgdGhpcy5maWx0ZXJlZFpvbmVzID0gdGhpcy5hdmFpbGFibGVab25lcy5maWx0ZXIoem9uZSA9PiB7XHJcbiAgLy8gICAgIGNvbnN0IHpvbmVOYW1lID0gKHpvbmUudGFnTmFtZSB8fCAnJykudG9Mb3dlckNhc2UoKTtcclxuICAvLyAgICAgY29uc3QgaXNNYXRjaCA9ICF0cmltbWVkU2VhcmNoIHx8IHpvbmVOYW1lLmluY2x1ZGVzKHRyaW1tZWRTZWFyY2gpO1xyXG4gIC8vICAgICBjb25zdCBpc05vdFNlbGVjdGVkID0gIXRoaXMuc2VsZWN0ZWRab25lcy5zb21lKFxyXG4gIC8vICAgICAgIHNlbGVjdGVkID0+IHtcclxuICAvLyAgICAgICAgIGNvbnN0IHNlbGVjdGVkTmFtZSA9IChzZWxlY3RlZC5uYW1lIHx8ICcnKS50b0xvd2VyQ2FzZSgpO1xyXG4gIC8vICAgICAgICAgY29uc3Qgc2VsZWN0ZWRUYWdOYW1lID0gKHNlbGVjdGVkLnRhZ05hbWUgfHwgJycpLnRvTG93ZXJDYXNlKCk7XHJcbiAgLy8gICAgICAgICByZXR1cm4gc2VsZWN0ZWROYW1lID09PSB6b25lTmFtZSB8fCBzZWxlY3RlZFRhZ05hbWUgPT09IHpvbmVOYW1lO1xyXG4gIC8vICAgICAgIH1cclxuICAvLyAgICAgKTtcclxuICAvLyAgICAgcmV0dXJuIGlzTWF0Y2ggJiYgaXNOb3RTZWxlY3RlZDtcclxuICAvLyAgIH0pO1xyXG5cclxuICAvLyAgIHRoaXMuc2hvd0Ryb3Bkb3duID0gdGhpcy5maWx0ZXJlZFpvbmVzLmxlbmd0aCA+IDA7XHJcbiAgLy8gfVxyXG5cclxuICBmaWx0ZXJab25lcyhzZWFyY2hUZXJtOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgIGNvbnN0IHZhbHVlID0gKHNlYXJjaFRlcm0gfHwgJycpLnRvTG93ZXJDYXNlKCk7XHJcblxyXG4gICAgdGhpcy5maWx0ZXJlZFpvbmVzID0gdGhpcy5hdmFpbGFibGVab25lcy5maWx0ZXIoem9uZSA9PlxyXG4gICAgICB6b25lLnRhZ05hbWU/LnRvTG93ZXJDYXNlKCkuaW5jbHVkZXModmFsdWUpXHJcbiAgICApO1xyXG5cclxuICAgIHRoaXMuc2hvd0Ryb3Bkb3duID0gdGhpcy5maWx0ZXJlZFpvbmVzLmxlbmd0aCA+IDA7XHJcbiAgfVxyXG5cclxuXHJcbiAgYWRkWm9uZSh6b25lTmFtZU9yT2JqZWN0Pzogc3RyaW5nIHwgYW55KTogdm9pZCB7XHJcbiAgICBsZXQgem9uZU5hbWU6IHN0cmluZztcclxuICAgIGxldCB6b25lT2JqZWN0OiBhbnkgPSBudWxsO1xyXG5cclxuICAgIC8vIEhhbmRsZSBib3RoIHN0cmluZyBhbmQgb2JqZWN0IGlucHV0XHJcbiAgICBpZiAodHlwZW9mIHpvbmVOYW1lT3JPYmplY3QgPT09ICdzdHJpbmcnKSB7XHJcbiAgICAgIHpvbmVOYW1lID0gem9uZU5hbWVPck9iamVjdC50cmltKCk7XHJcbiAgICB9IGVsc2UgaWYgKHpvbmVOYW1lT3JPYmplY3QgJiYgem9uZU5hbWVPck9iamVjdC50YWdOYW1lKSB7XHJcbiAgICAgIHpvbmVPYmplY3QgPSB6b25lTmFtZU9yT2JqZWN0O1xyXG4gICAgICB6b25lTmFtZSA9IHpvbmVOYW1lT3JPYmplY3QudGFnTmFtZS50cmltKCk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICAvLyBUcnkgdG8gZ2V0IGZyb20gZm9ybSBpbnB1dFxyXG4gICAgICBjb25zdCBpbnB1dFZhbHVlID0gdGhpcy5jcmVhdGVab25lR3JvdXBGb3JtLmdldCgnem9uZU5hbWUnKT8udmFsdWU7XHJcbiAgICAgIGlmICghaW5wdXRWYWx1ZSB8fCAhaW5wdXRWYWx1ZS50cmltKCkpIHJldHVybjtcclxuICAgICAgem9uZU5hbWUgPSBpbnB1dFZhbHVlLnRyaW0oKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoIXpvbmVOYW1lIHx8IHpvbmVOYW1lID09PSAnJykgcmV0dXJuO1xyXG5cclxuICAgIC8vIENoZWNrIGlmIHpvbmUgYWxyZWFkeSBleGlzdHMgaW4gc2VsZWN0ZWQgem9uZXNcclxuICAgIGNvbnN0IGV4aXN0cyA9IHRoaXMuc2VsZWN0ZWRab25lcy5zb21lKHogPT5cclxuICAgICAgKHoubmFtZT8udG9Mb3dlckNhc2UoKSA9PT0gem9uZU5hbWUudG9Mb3dlckNhc2UoKSkgfHxcclxuICAgICAgKHoudGFnTmFtZT8udG9Mb3dlckNhc2UoKSA9PT0gem9uZU5hbWUudG9Mb3dlckNhc2UoKSlcclxuICAgICk7XHJcblxyXG4gICAgaWYgKGV4aXN0cykge1xyXG4gICAgICB0aGlzLnRvYXN0U2VydmljZS5nZXRFcnJvclRvYXN0KCdab25lIGFscmVhZHkgYWRkZWQnKTtcclxuICAgICAgdGhpcy5jcmVhdGVab25lR3JvdXBGb3JtLmdldCgnem9uZU5hbWUnKT8uc2V0VmFsdWUoJycsIHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcclxuICAgICAgdGhpcy5zaG93RHJvcGRvd24gPSBmYWxzZTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIElmIHpvbmUgb2JqZWN0IGlzIHByb3ZpZGVkLCB1c2UgaXQ7IG90aGVyd2lzZSBmaW5kIGluIGF2YWlsYWJsZSB6b25lc1xyXG4gICAgaWYgKCF6b25lT2JqZWN0KSB7XHJcbiAgICAgIHpvbmVPYmplY3QgPSB0aGlzLmF2YWlsYWJsZVpvbmVzLmZpbmQoeiA9PlxyXG4gICAgICAgICh6LnRhZ05hbWU/LnRvTG93ZXJDYXNlKCkgPT09IHpvbmVOYW1lLnRvTG93ZXJDYXNlKCkpIHx8XHJcbiAgICAgICAgKHoubmFtZT8udG9Mb3dlckNhc2UoKSA9PT0gem9uZU5hbWUudG9Mb3dlckNhc2UoKSkgfHxcclxuICAgICAgICAoei56b25lTmFtZT8udG9Mb3dlckNhc2UoKSA9PT0gem9uZU5hbWUudG9Mb3dlckNhc2UoKSlcclxuICAgICAgKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBPbmx5IGFkZCB6b25lIGlmIGl0IGV4aXN0cyBpbiBhdmFpbGFibGUgem9uZXMgbGlzdFxyXG4gICAgaWYgKHpvbmVPYmplY3QpIHtcclxuICAgICAgLy8gQ2hlY2sgaWYgdGhpcyB6b25lIGlzIGFscmVhZHkgdGFnZ2VkIHRvIGFub3RoZXIgZ3JvdXBcclxuICAgICAgaWYgKHRoaXMuaXNab25lVGFnZ2VkVG9PdGhlckdyb3VwKHpvbmVPYmplY3QpKSB7XHJcbiAgICAgICAgdGhpcy5zaG93Wm9uZUFscmVhZHlUYWdnZWRQb3B1cChcclxuICAgICAgICAgIHpvbmVPYmplY3QudGFnTmFtZSxcclxuICAgICAgICAgIHpvbmVPYmplY3QuZ3JvdXBOYW1lXHJcbiAgICAgICAgKTtcclxuICAgICAgICB0aGlzLmNyZWF0ZVpvbmVHcm91cEZvcm0uZ2V0KCd6b25lTmFtZScpPy5zZXRWYWx1ZSgnJywgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xyXG4gICAgICAgIHRoaXMuZmlsdGVyZWRab25lcyA9IFtdO1xyXG4gICAgICAgIHRoaXMuc2hvd0Ryb3Bkb3duID0gZmFsc2U7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9XHJcblxyXG4gICAgICB0aGlzLnNlbGVjdGVkWm9uZXMucHVzaCh7XHJcbiAgICAgICAgbmFtZTogem9uZU9iamVjdC50YWdOYW1lIHx8IHpvbmVPYmplY3QubmFtZSB8fCB6b25lT2JqZWN0LnpvbmVOYW1lLFxyXG4gICAgICAgIHRhZ05hbWU6IHpvbmVPYmplY3QudGFnTmFtZVxyXG4gICAgICB9KTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIC8vIFpvbmUgbm90IGZvdW5kIGluIGF2YWlsYWJsZSBsaXN0IC0gc2hvdyBlcnJvciBhbmQgZG9uJ3QgYWRkXHJcbiAgICAgIHRoaXMudG9hc3RTZXJ2aWNlLmdldEVycm9yVG9hc3QoJ1pvbmUgbm90IGZvdW5kIGluIGF2YWlsYWJsZSB6b25lcycpO1xyXG4gICAgICB0aGlzLmNyZWF0ZVpvbmVHcm91cEZvcm0uZ2V0KCd6b25lTmFtZScpPy5zZXRWYWx1ZSgnJywgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xyXG4gICAgICB0aGlzLnNob3dEcm9wZG93biA9IGZhbHNlO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgLy8gQ2xlYXIgaW5wdXQgYW5kIGhpZGUgZHJvcGRvd25cclxuICAgIHRoaXMuY3JlYXRlWm9uZUdyb3VwRm9ybS5nZXQoJ3pvbmVOYW1lJyk/LnNldFZhbHVlKCcnLCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XHJcbiAgICB0aGlzLmZpbHRlcmVkWm9uZXMgPSBbXTtcclxuICAgIHRoaXMuc2hvd0Ryb3Bkb3duID0gZmFsc2U7XHJcblxyXG4gICAgLy8gVXBkYXRlIGZvcm0gY29udHJvbCBmb3Igem9uZXNUYWdnZWRcclxuICAgIHRoaXMuY3JlYXRlWm9uZUdyb3VwRm9ybS5nZXQoJ3pvbmVzVGFnZ2VkJyk/LnNldFZhbHVlKHRoaXMuc2VsZWN0ZWRab25lcywgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xyXG4gIH1cclxuXHJcbiAgcmVtb3ZlWm9uZShpbmRleDogbnVtYmVyKTogdm9pZCB7XHJcbiAgICB0aGlzLnNlbGVjdGVkWm9uZXMuc3BsaWNlKGluZGV4LCAxKTtcclxuICAgIC8vIFVwZGF0ZSBmb3JtIGNvbnRyb2wgZm9yIHpvbmVzVGFnZ2VkXHJcbiAgICB0aGlzLmNyZWF0ZVpvbmVHcm91cEZvcm0uZ2V0KCd6b25lc1RhZ2dlZCcpPy5zZXRWYWx1ZSh0aGlzLnNlbGVjdGVkWm9uZXMsIHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcclxuICB9XHJcblxyXG4gIG9uS2V5RG93bihldmVudDogS2V5Ym9hcmRFdmVudCk6IHZvaWQge1xyXG4gICAgaWYgKGV2ZW50LmtleSA9PT0gJ0VudGVyJykge1xyXG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICBjb25zdCB2YWx1ZSA9IHRoaXMuY3JlYXRlWm9uZUdyb3VwRm9ybS5nZXQoJ3pvbmVOYW1lJyk/LnZhbHVlO1xyXG4gICAgICBpZiAodmFsdWUgJiYgdmFsdWUudHJpbSgpKSB7XHJcbiAgICAgICAgLy8gT25seSBhbGxvdyBhZGRpbmcgaWYgdGhlcmUncyBhIGZpbHRlcmVkIG1hdGNoXHJcbiAgICAgICAgaWYgKHRoaXMuZmlsdGVyZWRab25lcy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICB0aGlzLmFkZFpvbmUodGhpcy5maWx0ZXJlZFpvbmVzWzBdKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgLy8gTm8gbWF0Y2ggZm91bmQgLSBzaG93IGVycm9yXHJcbiAgICAgICAgICB0aGlzLnRvYXN0U2VydmljZS5nZXRFcnJvclRvYXN0KCdQbGVhc2Ugc2VsZWN0IGEgem9uZSBmcm9tIHRoZSBsaXN0Jyk7XHJcbiAgICAgICAgICB0aGlzLmNyZWF0ZVpvbmVHcm91cEZvcm0uZ2V0KCd6b25lTmFtZScpPy5zZXRWYWx1ZSgnJywgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfSBlbHNlIGlmIChldmVudC5rZXkgPT09ICdFc2NhcGUnKSB7XHJcbiAgICAgIHRoaXMuc2hvd0Ryb3Bkb3duID0gZmFsc2U7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBvbklucHV0Rm9jdXMoKTogdm9pZCB7XHJcbiAgICAvLyBTaG93IGRyb3Bkb3duIHdoZW4gaW5wdXQgaXMgZm9jdXNlZCwgYnV0IG5vdCBpZiB3ZSdyZSBtYW51YWxseSB0b2dnbGluZyB0byBjbG9zZVxyXG4gICAgLy8gSWYgaXNUb2dnbGluZyBpcyB0cnVlIGFuZCBzaG93RHJvcGRvd24gaXMgZmFsc2UsIGl0IG1lYW5zIHdlIGp1c3QgY2xvc2VkIGl0LCBzbyBkb24ndCByZW9wZW5cclxuICAgIGlmICh0aGlzLmlzVG9nZ2xpbmcgJiYgIXRoaXMuc2hvd0Ryb3Bkb3duKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIC8vIE90aGVyd2lzZSwgc2hvdyBkcm9wZG93biBub3JtYWxseVxyXG4gICAgY29uc3QgdmFsdWUgPSB0aGlzLmNyZWF0ZVpvbmVHcm91cEZvcm0uZ2V0KCd6b25lTmFtZScpPy52YWx1ZSB8fCAnJztcclxuICAgIGlmICh2YWx1ZSAmJiB2YWx1ZS50cmltKCkpIHtcclxuICAgICAgdGhpcy5maWx0ZXJab25lcyh2YWx1ZSk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLmZpbHRlclpvbmVzKCcnKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vIG9uSW5wdXRCbHVyKCk6IHZvaWQge1xyXG4gIC8vICAgLy8gRGVsYXkgaGlkaW5nIGRyb3Bkb3duIHRvIGFsbG93IGNsaWNrIGV2ZW50cyB0byBmaXJlXHJcbiAgLy8gICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAvLyAgICAgdGhpcy5zaG93RHJvcGRvd24gPSBmYWxzZTtcclxuICAvLyAgIH0sIDIwMCk7XHJcbiAgLy8gfVxyXG5cclxuICBvbklucHV0Qmx1cigpOiB2b2lkIHtcclxuICAgIC8vIE9ubHkgY2xvc2UgZHJvcGRvd24gb24gYmx1ciBpZiBpdCdzIHN0aWxsIG9wZW4gYW5kIHVzZXIgY2xpY2tlZCBvdXRzaWRlXHJcbiAgICAvLyBEb24ndCBpbnRlcmZlcmUgd2l0aCBtYW51YWwgdG9nZ2xlIGluIGZvY3VzWm9uZUlucHV0KClcclxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICBpZiAodGhpcy5zaG93RHJvcGRvd24gJiYgIWRvY3VtZW50LmFjdGl2ZUVsZW1lbnQ/LmNsb3Nlc3QoJy5hdXRvY29tcGxldGUtZHJvcGRvd24nKSAmJiBcclxuICAgICAgICAgICFkb2N1bWVudC5hY3RpdmVFbGVtZW50Py5jbG9zZXN0KCcuem9uZXMtdGFnZ2VkLWNvbnRhaW5lcicpKSB7XHJcbiAgICAgICAgdGhpcy5zaG93RHJvcGRvd24gPSBmYWxzZTtcclxuICAgICAgfVxyXG4gICAgfSwgMjAwKTtcclxuICB9XHJcblxyXG5cclxuICBzZWxlY3Rab25lRnJvbURyb3Bkb3duKHpvbmU6IGFueSk6IHZvaWQge1xyXG4gICAgdGhpcy5hZGRab25lKHpvbmUpO1xyXG4gIH1cclxuXHJcbiAgaXNab25lU2VsZWN0ZWQoem9uZTogYW55KTogYm9vbGVhbiB7XHJcbiAgICBjb25zdCB6b25lTmFtZSA9IHpvbmUudGFnTmFtZSB8fCAnJztcclxuICAgIHJldHVybiB0aGlzLnNlbGVjdGVkWm9uZXMuc29tZSh6ID0+XHJcbiAgICAgICh6LnRhZ05hbWU/LnRvTG93ZXJDYXNlKCkgPT09IHpvbmVOYW1lLnRvTG93ZXJDYXNlKCkpIHx8XHJcbiAgICAgICh6Lm5hbWU/LnRvTG93ZXJDYXNlKCkgPT09IHpvbmVOYW1lLnRvTG93ZXJDYXNlKCkpXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgYXJlQWxsRmlsdGVyZWRab25lc1NlbGVjdGVkKCk6IGJvb2xlYW4ge1xyXG4gICAgaWYgKHRoaXMuZmlsdGVyZWRab25lcy5sZW5ndGggPT09IDApIHJldHVybiBmYWxzZTtcclxuICAgIHJldHVybiB0aGlzLmZpbHRlcmVkWm9uZXMuZXZlcnkoem9uZSA9PiB0aGlzLmlzWm9uZVNlbGVjdGVkKHpvbmUpKTtcclxuICB9XHJcblxyXG4gIHRvZ2dsZVNlbGVjdEFsbChldmVudDogRXZlbnQpOiB2b2lkIHtcclxuICAgIGNvbnN0IGNoZWNrZWQgPSAoZXZlbnQudGFyZ2V0IGFzIEhUTUxJbnB1dEVsZW1lbnQpLmNoZWNrZWQ7XHJcbiAgICBcclxuICAgIGlmIChjaGVja2VkKSB7XHJcbiAgICAgIC8vIFNlbGVjdCBhbGwgZmlsdGVyZWQgem9uZXMgdGhhdCBhcmUgbm90IGFscmVhZHkgc2VsZWN0ZWRcclxuICAgICAgdGhpcy5maWx0ZXJlZFpvbmVzLmZvckVhY2goem9uZSA9PiB7XHJcbiAgICAgICAgY29uc3Qgem9uZU5hbWUgPSB6b25lPy50YWdOYW1lPy50cmltKCk7XHJcbiAgICAgICAgaWYgKCF6b25lTmFtZSkge1xyXG4gICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gU2tpcCB6b25lcyB0aGF0IGFyZSBhbHJlYWR5IHRhZ2dlZCB0byBhbm90aGVyIGdyb3VwXHJcbiAgICAgICAgaWYgKHRoaXMuaXNab25lVGFnZ2VkVG9PdGhlckdyb3VwKHpvbmUpKSB7XHJcbiAgICAgICAgICB0aGlzLnNob3dab25lQWxyZWFkeVRhZ2dlZFBvcHVwKHpvbmVOYW1lLCB6b25lLmdyb3VwTmFtZSk7XHJcbiAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoIXRoaXMuc2VsZWN0ZWRab25lcy5zb21lKHogPT4gei50YWdOYW1lID09PSB6b25lTmFtZSkpIHtcclxuICAgICAgICAgIHRoaXMuc2VsZWN0ZWRab25lcy5wdXNoKHtcclxuICAgICAgICAgICAgbmFtZTogem9uZU5hbWUsXHJcbiAgICAgICAgICAgIHRhZ05hbWU6IHpvbmVOYW1lXHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgLy8gRGVzZWxlY3QgYWxsIGZpbHRlcmVkIHpvbmVzXHJcbiAgICAgIGNvbnN0IGZpbHRlcmVkWm9uZU5hbWVzID0gdGhpcy5maWx0ZXJlZFpvbmVzLm1hcCh6ID0+IHoudGFnTmFtZT8udG9Mb3dlckNhc2UoKSk7XHJcbiAgICAgIHRoaXMuc2VsZWN0ZWRab25lcyA9IHRoaXMuc2VsZWN0ZWRab25lcy5maWx0ZXIoXHJcbiAgICAgICAgeiA9PiAhZmlsdGVyZWRab25lTmFtZXMuaW5jbHVkZXMoei50YWdOYW1lPy50b0xvd2VyQ2FzZSgpKVxyXG4gICAgICApO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIFN5bmMgd2l0aCBmb3JtXHJcbiAgICB0aGlzLmNyZWF0ZVpvbmVHcm91cEZvcm1cclxuICAgICAgLmdldCgnem9uZXNUYWdnZWQnKVxyXG4gICAgICA/LnNldFZhbHVlKHRoaXMuc2VsZWN0ZWRab25lcywgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xyXG4gIH1cclxuXHJcbiAgb25DYW5jZWwoKTogdm9pZCB7XHJcbiAgICAvLyBSZXNldCBmb3JtIHN0YXRlIHdoZW4gY2FuY2VsaW5nXHJcbiAgICB0aGlzLmNyZWF0ZVpvbmVHcm91cEZvcm0ucmVzZXQoKTtcclxuICAgIHRoaXMuY3JlYXRlWm9uZUdyb3VwRm9ybS5tYXJrQXNVbnRvdWNoZWQoKTtcclxuICAgIHRoaXMuYWN0aXZlTW9kYWwuY2xvc2UoKTtcclxuICB9XHJcblxyXG4gIGZvY3VzWm9uZUlucHV0KCk6IHZvaWQge1xyXG4gICAgaWYgKCF0aGlzLnpvbmVJbnB1dFJlZikgcmV0dXJuO1xyXG4gICAgXHJcbiAgICAvLyBUb2dnbGUgZHJvcGRvd246IGZpcnN0IGNsaWNrIHNob3dzLCBzZWNvbmQgY2xpY2sgY2xvc2VzXHJcbiAgICB0aGlzLmlzVG9nZ2xpbmcgPSB0cnVlO1xyXG4gICAgaWYgKHRoaXMuc2hvd0Ryb3Bkb3duKSB7XHJcbiAgICAgIC8vIElmIGRyb3Bkb3duIGlzIG9wZW4sIGNsb3NlIGl0XHJcbiAgICAgIHRoaXMuc2hvd0Ryb3Bkb3duID0gZmFsc2U7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICAvLyBJZiBkcm9wZG93biBpcyBjbG9zZWQsIG9wZW4gaXQgYW5kIGZvY3VzIGlucHV0XHJcbiAgICAgIHRoaXMuem9uZUlucHV0UmVmLm5hdGl2ZUVsZW1lbnQuZm9jdXMoKTtcclxuICAgICAgY29uc3QgdmFsdWUgPSB0aGlzLmNyZWF0ZVpvbmVHcm91cEZvcm0uZ2V0KCd6b25lTmFtZScpPy52YWx1ZSB8fCAnJztcclxuICAgICAgaWYgKHZhbHVlICYmIHZhbHVlLnRyaW0oKSkge1xyXG4gICAgICAgIHRoaXMuZmlsdGVyWm9uZXModmFsdWUpO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHRoaXMuZmlsdGVyWm9uZXMoJycpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICAvLyBSZXNldCBmbGFnIGFmdGVyIGEgc2hvcnQgZGVsYXkgdG8gYWxsb3cgZm9jdXMgZXZlbnQgdG8gY29tcGxldGVcclxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICB0aGlzLmlzVG9nZ2xpbmcgPSBmYWxzZTtcclxuICAgIH0sIDEwMCk7XHJcbiAgfVxyXG5cclxuICBASG9zdExpc3RlbmVyKCdkb2N1bWVudDpjbGljaycsIFsnJGV2ZW50J10pXHJcbiAgb25Eb2N1bWVudENsaWNrKGV2ZW50OiBNb3VzZUV2ZW50KTogdm9pZCB7XHJcbiAgICAvLyBDbG9zZSBkcm9wZG93biBpZiBjbGlja2luZyBvdXRzaWRlIHRoZSB6b25lcy10YWdnZWQtY29udGFpbmVyXHJcbiAgICBjb25zdCB0YXJnZXQgPSBldmVudC50YXJnZXQgYXMgSFRNTEVsZW1lbnQ7XHJcbiAgICBjb25zdCBjb250YWluZXIgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcuem9uZXMtdGFnZ2VkLWNvbnRhaW5lcicpO1xyXG4gICAgXHJcbiAgICBpZiAoY29udGFpbmVyICYmICFjb250YWluZXIuY29udGFpbnModGFyZ2V0KSkge1xyXG4gICAgICB0aGlzLnNob3dEcm9wZG93biA9IGZhbHNlO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgdG9nZ2xlWm9uZVNlbGVjdGlvbih6b25lOiBhbnksIGV2ZW50OiBFdmVudCk6IHZvaWQge1xyXG4gICAgY29uc3QgY2hlY2tlZCA9IChldmVudC50YXJnZXQgYXMgSFRNTElucHV0RWxlbWVudCkuY2hlY2tlZDtcclxuICAgIGNvbnN0IHpvbmVOYW1lID0gem9uZT8udGFnTmFtZT8udHJpbSgpO1xyXG5cclxuICAgIGlmICghem9uZU5hbWUpIHJldHVybjtcclxuXHJcbiAgICBpZiAoY2hlY2tlZCkge1xyXG4gICAgICAvLyBCbG9jayBzZWxlY3Rpb24gaWYgem9uZSBpcyBhbHJlYWR5IHRhZ2dlZCB0byBhbm90aGVyIGdyb3VwXHJcbiAgICAgIGlmICh0aGlzLmlzWm9uZVRhZ2dlZFRvT3RoZXJHcm91cCh6b25lKSkge1xyXG4gICAgICAgIChldmVudC50YXJnZXQgYXMgSFRNTElucHV0RWxlbWVudCkuY2hlY2tlZCA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMuc2hvd1pvbmVBbHJlYWR5VGFnZ2VkUG9wdXAoem9uZU5hbWUsIHpvbmUuZ3JvdXBOYW1lKTtcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIC8vIEFERFxyXG4gICAgICBpZiAoIXRoaXMuc2VsZWN0ZWRab25lcy5zb21lKHogPT4gei50YWdOYW1lID09PSB6b25lTmFtZSkpIHtcclxuICAgICAgICB0aGlzLnNlbGVjdGVkWm9uZXMucHVzaCh7XHJcbiAgICAgICAgICBuYW1lOiB6b25lTmFtZSxcclxuICAgICAgICAgIHRhZ05hbWU6IHpvbmVOYW1lXHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH1cclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIC8vIFJFTU9WRVxyXG4gICAgICB0aGlzLnNlbGVjdGVkWm9uZXMgPSB0aGlzLnNlbGVjdGVkWm9uZXMuZmlsdGVyKFxyXG4gICAgICAgIHogPT4gei50YWdOYW1lICE9PSB6b25lTmFtZVxyXG4gICAgICApO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIFN5bmMgd2l0aCBmb3JtXHJcbiAgICB0aGlzLmNyZWF0ZVpvbmVHcm91cEZvcm1cclxuICAgICAgLmdldCgnem9uZXNUYWdnZWQnKVxyXG4gICAgICA/LnNldFZhbHVlKHRoaXMuc2VsZWN0ZWRab25lcywgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQ2hlY2sgaWYgdGhlIGdpdmVuIHpvbmUgaXMgYWxyZWFkeSB0YWdnZWQgdG8gYW5vdGhlciBncm91cC5cclxuICAgKiBXaGlsZSBjcmVhdGluZyBhIG5ldyBncm91cCwgYW55IGV4aXN0aW5nIGdyb3VwTmFtZSBvbiB0aGUgem9uZSBibG9ja3Mgc2VsZWN0aW9uLlxyXG4gICAqIFdoaWxlIGVkaXRpbmcsIHdlIGFsbG93IHpvbmVzIHRoYXQgYWxyZWFkeSBiZWxvbmcgdG8gdGhlIHNhbWUgZ3JvdXAgYnV0IGJsb2NrIG90aGVycy5cclxuICAgKi9cclxuICBwcml2YXRlIGlzWm9uZVRhZ2dlZFRvT3RoZXJHcm91cCh6b25lOiBhbnkpOiBib29sZWFuIHtcclxuICAgIGNvbnN0IGV4aXN0aW5nR3JvdXBOYW1lID0gKHpvbmU/Lmdyb3VwTmFtZSB8fCAnJykudHJpbSgpO1xyXG4gICAgaWYgKCFleGlzdGluZ0dyb3VwTmFtZSkge1xyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgY3VycmVudEdyb3VwTmFtZSA9ICh0aGlzLmNyZWF0ZVpvbmVHcm91cEZvcm0uZ2V0KCdncm91cE5hbWUnKT8udmFsdWUgfHwgJycpLnRyaW0oKTtcclxuICAgIGNvbnN0IG9yaWdpbmFsR3JvdXBOYW1lID0gKHRoaXMuem9uZUdyb3VwRGF0YT8uZ3JvdXBOYW1lIHx8ICcnKS50cmltKCk7XHJcblxyXG4gICAgLy8gSWYgY3JlYXRpbmcgYSBuZXcgZ3JvdXAsIGFueSBleGlzdGluZyBtYXBwaW5nIHNob3VsZCBibG9ja1xyXG4gICAgaWYgKCF0aGlzLmlzRWRpdE1vZGUpIHtcclxuICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gSW4gZWRpdCBtb2RlLCBhbGxvdyB6b25lcyB0aGF0IGFyZSBhbHJlYWR5IG1hcHBlZCB0byB0aGlzIHNhbWUgZ3JvdXBcclxuICAgIGlmIChvcmlnaW5hbEdyb3VwTmFtZSAmJlxyXG4gICAgICBleGlzdGluZ0dyb3VwTmFtZS50b0xvd2VyQ2FzZSgpID09PSBvcmlnaW5hbEdyb3VwTmFtZS50b0xvd2VyQ2FzZSgpKSB7XHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBPdGhlcndpc2UsIGl0J3MgbWFwcGVkIHRvIHNvbWUgb3RoZXIgZ3JvdXAgYW5kIHNob3VsZCBiZSBibG9ja2VkXHJcbiAgICAvLyAoZXZlbiBpZiBjdXJyZW50R3JvdXBOYW1lIHdhcyBjaGFuZ2VkIHdoaWxlIGVkaXRpbmcpXHJcbiAgICByZXR1cm4gdHJ1ZTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFNob3cgcG9wdXAgd2hlbiB1c2VyIHRyaWVzIHRvIG1hcCBhIHpvbmUgdGhhdCBpcyBhbHJlYWR5IHRhZ2dlZCB0byBhbm90aGVyIGdyb3VwLlxyXG4gICAqL1xyXG4gIHByaXZhdGUgc2hvd1pvbmVBbHJlYWR5VGFnZ2VkUG9wdXAoem9uZU5hbWU6IHN0cmluZywgZ3JvdXBOYW1lOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgIHRoaXMuY29uZmxpY3Rab25lTmFtZSA9IHpvbmVOYW1lIHx8ICcnO1xyXG4gICAgdGhpcy5jb25mbGljdEdyb3VwTmFtZSA9IGdyb3VwTmFtZSB8fCAnJztcclxuXHJcbiAgICBpZiAodGhpcy56b25lVGFnZ2VkTW9kYWwpIHtcclxuICAgICAgdGhpcy56b25lVGFnZ2VkTW9kYWxSZWYgPSB0aGlzLm1vZGFsU2VydmljZS5vcGVuKHRoaXMuem9uZVRhZ2dlZE1vZGFsLCB7XHJcbiAgICAgICAgc2l6ZTogJ21kJyxcclxuICAgICAgICBjZW50ZXJlZDogdHJ1ZSxcclxuICAgICAgICBiYWNrZHJvcDogJ3N0YXRpYydcclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBvbkNsb3NlWm9uZVRhZ2dlZE1vZGFsKCk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuem9uZVRhZ2dlZE1vZGFsUmVmKSB7XHJcbiAgICAgIHRoaXMuem9uZVRhZ2dlZE1vZGFsUmVmLmNsb3NlKCk7XHJcbiAgICAgIHRoaXMuem9uZVRhZ2dlZE1vZGFsUmVmID0gbnVsbDtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIG9uQ3JlYXRlKCk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuY3JlYXRlWm9uZUdyb3VwRm9ybS5pbnZhbGlkKSB7XHJcbiAgICAgIHRoaXMuY3JlYXRlWm9uZUdyb3VwRm9ybS5tYXJrQWxsQXNUb3VjaGVkKCk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBmb3JtVmFsdWUgPSB0aGlzLmNyZWF0ZVpvbmVHcm91cEZvcm0udmFsdWU7XHJcbiAgICBcclxuICAgIC8vIFZhbGlkYXRlIGdyb3VwTmFtZSBwYXR0ZXJuXHJcbiAgICBsZXQgcGF0dGVybiA9IC9eW2EtekEtWjAtOVxcc1xcL10qJC87XHJcbiAgICBpZiAoIWZvcm1WYWx1ZS5ncm91cE5hbWUubWF0Y2gocGF0dGVybikpIHtcclxuICAgICAgdGhpcy50b2FzdFNlcnZpY2UuZ2V0RXJyb3JUb2FzdCgnU3BlY2lhbCBjaGFyYWN0ZXJzIGFyZSBub3QgYWxsb3dlZCcpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBcclxuICAgIGNvbnN0IHBheWxvYWQ6IGFueSA9IHtcclxuICAgICAgY2xpZW50SWQ6IHRoaXMuY2xpZW50SWQsXHJcbiAgICAgIGdyb3VwTmFtZTogZm9ybVZhbHVlLmdyb3VwTmFtZS50cmltKCksXHJcbiAgICAgIHpvbmVzVGFnZ2VkOiB0aGlzLnNlbGVjdGVkWm9uZXMubWFwKHpvbmUgPT4gem9uZS50YWdOYW1lKSxcclxuICAgICAgcHJvZHVjdE5hbWU6ICd0YW5nb1pvbmUnLFxyXG4gICAgfTtcclxuXHJcbiAgICAvLyBJZiBpbiBlZGl0IG1vZGUsIGluY2x1ZGUgdGhlIG9sZCBncm91cCBuYW1lIGZvciB1cGRhdGVcclxuICAgIGlmICh0aGlzLmlzRWRpdE1vZGUgJiYgdGhpcy56b25lR3JvdXBEYXRhKSB7XHJcbiAgICAgIGNvbnN0IG9sZEdyb3VwTmFtZSA9IHRoaXMuem9uZUdyb3VwRGF0YS5ncm91cE5hbWU7XHJcbiAgICAgIHBheWxvYWQuX2lkID0gdGhpcy56b25lR3JvdXBEYXRhPy5faWQ7XHJcbiAgICAgIGlmIChvbGRHcm91cE5hbWUgJiYgb2xkR3JvdXBOYW1lICE9PSBmb3JtVmFsdWUuZ3JvdXBOYW1lKSB7XHJcbiAgICAgICAgcGF5bG9hZC5vbGRHcm91cE5hbWUgPSBvbGRHcm91cE5hbWU7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBtZXNzYWdlID0gdGhpcy5pc0VkaXRNb2RlID8gJ1pvbmUgZ3JvdXAgdXBkYXRlZCBzdWNjZXNzZnVsbHknIDogJ1pvbmUgZ3JvdXAgY3JlYXRlZCBzdWNjZXNzZnVsbHknO1xyXG4gICAgY29uc3QgZXJyb3JNc2cgPSB0aGlzLmlzRWRpdE1vZGUgPyAnRmFpbGVkIHRvIHVwZGF0ZSB6b25lIGdyb3VwJyA6ICdGYWlsZWQgdG8gY3JlYXRlIHpvbmUgZ3JvdXAnO1xyXG4gICAgY29uc3QgcmVzdWx0VHlwZSA9IHRoaXMuaXNFZGl0TW9kZSA/ICd1cGRhdGVkJyA6ICdjcmVhdGVkJztcclxuXHJcbiAgICBpZiAoIXRoaXMuaXNFZGl0TW9kZSkge1xyXG4gICAgICB0aGlzLmNsaWVudEFwaVNlcnZpY2UuYWRkWm9uZUdyb3VwKHBheWxvYWQpLnBpcGUoXHJcbiAgICAgICAgdGFrZVVudGlsKHRoaXMuZGVzdHJveSQpXHJcbiAgICAgICkuc3Vic2NyaWJlKHtcclxuICAgICAgICBuZXh0OiAocmVzOiBhbnkpID0+IHtcclxuICAgICAgICAgIGlmIChyZXMgJiYgcmVzLmNvZGUgPT09IDIwMCkge1xyXG4gICAgICAgICAgICB0aGlzLnRvYXN0U2VydmljZS5nZXRTdWNjZXNzVG9hc3QobWVzc2FnZSk7XHJcbiAgICAgICAgICAgIHRoaXMuYWN0aXZlTW9kYWwuY2xvc2Uoe1xyXG4gICAgICAgICAgICAgIHR5cGU6IHJlc3VsdFR5cGUsXHJcbiAgICAgICAgICAgICAgZGF0YTogcmVzLmRhdGFcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLmlzRWRpdE1vZGUpIHtcclxuICAgICAgICAgICAgICB0aGlzLmlzRWRpdE1vZGUgPSBmYWxzZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy50b2FzdFNlcnZpY2UuZ2V0RXJyb3JUb2FzdChyZXMubWVzc2FnZSB8fCBlcnJvck1zZyk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSxcclxuICAgICAgICBlcnJvcjogKGVycjogYW55KSA9PiB7XHJcbiAgICAgICAgICB0aGlzLnRvYXN0U2VydmljZS5nZXRFcnJvclRvYXN0KGVyci5lcnJvcj8uZXJyb3IgfHwgZXJyb3JNc2cpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgICB9IGVsc2UgaWYgKHRoaXMuaXNFZGl0TW9kZSkge1xyXG4gICAgICB0aGlzLmNsaWVudEFwaVNlcnZpY2UudXBkYXRlWm9uZUdyb3VwKHBheWxvYWQpLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKS5zdWJzY3JpYmUoe1xyXG4gICAgICAgIG5leHQ6IChyZXM6IGFueSkgPT4ge1xyXG4gICAgICAgICAgaWYgKHJlcyAmJiByZXMuY29kZSA9PT0gMjAwKSB7XHJcbiAgICAgICAgICAgIHRoaXMudG9hc3RTZXJ2aWNlLmdldFN1Y2Nlc3NUb2FzdChtZXNzYWdlKTtcclxuICAgICAgICAgICAgdGhpcy5hY3RpdmVNb2RhbC5jbG9zZSh7XHJcbiAgICAgICAgICAgICAgdHlwZTogcmVzdWx0VHlwZSxcclxuICAgICAgICAgICAgICBkYXRhOiByZXMuZGF0YVxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgaWYgKHRoaXMuaXNFZGl0TW9kZSkge1xyXG4gICAgICAgICAgICAgIHRoaXMuaXNFZGl0TW9kZSA9IGZhbHNlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLnRvYXN0U2VydmljZS5nZXRFcnJvclRvYXN0KHJlcy5tZXNzYWdlIHx8IGVycm9yTXNnKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9LFxyXG4gICAgICAgIGVycm9yOiAoZXJyOiBhbnkpID0+IHtcclxuICAgICAgICAgIHRoaXMudG9hc3RTZXJ2aWNlLmdldEVycm9yVG9hc3QoZXJyLmVycm9yPy5lcnJvciB8fCBlcnJvck1zZyk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgIH1cclxuICB9XHJcbn1cclxuXHJcbiIsIjxkaXYgY2xhc3M9XCJjcmVhdGUtem9uZS1ncm91cC1tb2RhbFwiPlxyXG4gIDxmb3JtIFtmb3JtR3JvdXBdPVwiY3JlYXRlWm9uZUdyb3VwRm9ybVwiIGF1dG9jb21wbGV0ZT1cIm9mZlwiPlxyXG4gICAgPCEtLSBIZWFkZXIgLS0+XHJcbiAgICA8ZGl2IGNsYXNzPVwibW9kYWwtaGVhZGVyLWN1c3RvbSBtYi00XCI+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyXCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImhlYWRlci1pY29uIG1lLTNcIj5cclxuICAgICAgICAgIDxzdmcgKm5nSWY9XCIhaXNFZGl0TW9kZVwiIHdpZHRoPVwiMjRcIiBoZWlnaHQ9XCIyNFwiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiBmaWxsPVwibm9uZVwiXHJcbiAgICAgICAgICAgIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj5cclxuICAgICAgICAgICAgPGNpcmNsZSBjeD1cIjEyXCIgY3k9XCIxMlwiIHI9XCIxMFwiIGZpbGw9XCIjMDBBM0ZGXCIgLz5cclxuICAgICAgICAgICAgPHBhdGggZD1cIk0xMiA4VjE2TTggMTJIMTZcIiBzdHJva2U9XCJ3aGl0ZVwiIHN0cm9rZS13aWR0aD1cIjJcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxyXG4gICAgICAgICAgPC9zdmc+XHJcbiAgICAgICAgICA8c3ZnICpuZ0lmPVwiaXNFZGl0TW9kZVwiIHdpZHRoPVwiNTZcIiBoZWlnaHQ9XCI1NlwiIHZpZXdCb3g9XCIwIDAgNTYgNTZcIiBmaWxsPVwibm9uZVwiXHJcbiAgICAgICAgICAgIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj5cclxuICAgICAgICAgICAgPHJlY3QgeD1cIjRcIiB5PVwiNFwiIHdpZHRoPVwiNDhcIiBoZWlnaHQ9XCI0OFwiIHJ4PVwiMjRcIiBmaWxsPVwiI0RBRjFGRlwiIC8+XHJcbiAgICAgICAgICAgIDxyZWN0IHg9XCI0XCIgeT1cIjRcIiB3aWR0aD1cIjQ4XCIgaGVpZ2h0PVwiNDhcIiByeD1cIjI0XCIgc3Ryb2tlPVwiI0VBRjhGRlwiIHN0cm9rZS13aWR0aD1cIjhcIiAvPlxyXG4gICAgICAgICAgICA8cGF0aFxyXG4gICAgICAgICAgICAgIGQ9XCJNMjcgMjAuMDAwMkgyMEMxOS40Njk2IDIwLjAwMDIgMTguOTYwOSAyMC4yMTA5IDE4LjU4NTggMjAuNTg2QzE4LjIxMDcgMjAuOTYxMSAxOCAyMS40Njk4IDE4IDIyLjAwMDJWMzYuMDAwMkMxOCAzNi41MzA3IDE4LjIxMDcgMzcuMDM5NCAxOC41ODU4IDM3LjQxNDRDMTguOTYwOSAzNy43ODk1IDE5LjQ2OTYgMzguMDAwMiAyMCAzOC4wMDAySDM0QzM0LjUzMDQgMzguMDAwMiAzNS4wMzkxIDM3Ljc4OTUgMzUuNDE0MiAzNy40MTQ0QzM1Ljc4OTMgMzcuMDM5NCAzNiAzNi41MzA3IDM2IDM2LjAwMDJWMjkuMDAwMk0zNC41IDE4LjUwMDJDMzQuODk3OCAxOC4xMDI0IDM1LjQzNzQgMTcuODc4OSAzNiAxNy44Nzg5QzM2LjU2MjYgMTcuODc4OSAzNy4xMDIyIDE4LjEwMjQgMzcuNSAxOC41MDAyQzM3Ljg5NzggMTguODk4MSAzOC4xMjEzIDE5LjQzNzYgMzguMTIxMyAyMC4wMDAyQzM4LjEyMTMgMjAuNTYyOCAzNy44OTc4IDIxLjEwMjQgMzcuNSAyMS41MDAyTDI4IDMxLjAwMDJMMjQgMzIuMDAwMkwyNSAyOC4wMDAyTDM0LjUgMTguNTAwMlpcIlxyXG4gICAgICAgICAgICAgIHN0cm9rZT1cIiMwMEEzRkZcIiBzdHJva2Utd2lkdGg9XCIyXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cclxuICAgICAgICAgIDwvc3ZnPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxoNCBjbGFzcz1cIm1vZGFsLXRpdGxlIG1iLTBcIj57eyBpc0VkaXRNb2RlID8gJ0VkaXQnIDogJ0NyZWF0ZScgfX08L2g0PlxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG5cclxuICAgIDwhLS0gWm9uZSBHcm91cCBOYW1lIElucHV0IC0tPlxyXG4gICAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXAgbWItNFwiPlxyXG4gICAgICA8IS0tIDxzcGFuIGNsYXNzPVwidGV4dC1kYW5nZXJcIj4qPC9zcGFuPiAtLT5cclxuICAgICAgPGxhYmVsIGZvcj1cImdyb3VwTmFtZVwiIGNsYXNzPVwiZm9ybS1sYWJlbFwiPlpvbmUgR3JvdXAgTmFtZTwvbGFiZWw+XHJcbiAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGNsYXNzPVwiZm9ybS1jb250cm9sXCIgaWQ9XCJncm91cE5hbWVcIiBmb3JtQ29udHJvbE5hbWU9XCJncm91cE5hbWVcIlxyXG4gICAgICAgIHBsYWNlaG9sZGVyPVwiRW50ZXIgem9uZSBncm91cCBuYW1lXCIgYXV0b2NvbXBsZXRlPVwib2ZmXCJcclxuICAgICAgICBbY2xhc3MuaXMtaW52YWxpZF09XCJjcmVhdGVab25lR3JvdXBGb3JtLmdldCgnZ3JvdXBOYW1lJyk/LmludmFsaWQgJiYgY3JlYXRlWm9uZUdyb3VwRm9ybS5nZXQoJ2dyb3VwTmFtZScpPy50b3VjaGVkICYmICFjcmVhdGVab25lR3JvdXBGb3JtLmdldCgnZ3JvdXBOYW1lJyk/LnByaXN0aW5lXCI+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJpbnZhbGlkLWZlZWRiYWNrXCJcclxuICAgICAgICAqbmdJZj1cImNyZWF0ZVpvbmVHcm91cEZvcm0uZ2V0KCdncm91cE5hbWUnKT8uaW52YWxpZCAmJiBjcmVhdGVab25lR3JvdXBGb3JtLmdldCgnZ3JvdXBOYW1lJyk/LnRvdWNoZWQgJiYgIWNyZWF0ZVpvbmVHcm91cEZvcm0uZ2V0KCdncm91cE5hbWUnKT8ucHJpc3RpbmVcIj5cclxuICAgICAgICA8c3BhbiAqbmdJZj1cImNyZWF0ZVpvbmVHcm91cEZvcm0uZ2V0KCdncm91cE5hbWUnKT8uZXJyb3JzPy5bJ3JlcXVpcmVkJ11cIj5Hcm91cE5hbWUgaXMgcmVxdWlyZWQ8L3NwYW4+XHJcbiAgICAgICAgPHNwYW4gKm5nSWY9XCJjcmVhdGVab25lR3JvdXBGb3JtLmdldCgnZ3JvdXBOYW1lJyk/LmVycm9ycz8uWydtaW5sZW5ndGgnXVwiPkdyb3VwTmFtZSBtdXN0IGJlIGF0IGxlYXN0IDFcclxuICAgICAgICAgIGNoYXJhY3RlcnM8L3NwYW4+XHJcbiAgICAgICAgPHNwYW4gKm5nSWY9XCJjcmVhdGVab25lR3JvdXBGb3JtLmdldCgnZ3JvdXBOYW1lJyk/LmVycm9ycz8uWydwYXR0ZXJuJ11cIj5cclxuICAgICAgICAgIFNwZWNpYWwgY2hhcmFjdGVycyBhcmUgbm90IGFsbG93ZWRcclxuICAgICAgICA8L3NwYW4+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcblxyXG4gICAgPCEtLSBab25lcyBUYWdnZWQgSW5wdXQgLS0+XHJcbiAgICA8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cCBtYi00XCI+XHJcbiAgICAgIDxsYWJlbCBmb3I9XCJ6b25lc1RhZ2dlZFwiIGNsYXNzPVwiZm9ybS1sYWJlbFwiIChtb3VzZWRvd24pPVwiJGV2ZW50LnByZXZlbnREZWZhdWx0KClcIlxyXG4gICAgICAgIChjbGljayk9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIj5ab25lcyBUYWdnZWQ8L2xhYmVsPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwiem9uZXMtdGFnZ2VkLWNvbnRhaW5lclwiIFtjbGFzcy5oYXMtZHJvcGRvd25dPVwic2hvd0Ryb3Bkb3duXCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cInpvbmVzLWlucHV0LXdyYXBwZXJcIiBbY2xhc3MuaGFzLXRhZ3NdPVwic2VsZWN0ZWRab25lcy5sZW5ndGggPiAwXCIgKGNsaWNrKT1cImZvY3VzWm9uZUlucHV0KClcIj5cclxuICAgICAgICAgIDwhLS0gU2VsZWN0ZWQgWm9uZSBUYWdzIC0tPlxyXG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgem9uZSBvZiBzZWxlY3RlZFpvbmVzOyBsZXQgaSA9IGluZGV4XCI+XHJcbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiem9uZS10YWdcIj5cclxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInpvbmUtdGFnLW5hbWVcIj57eyB6b25lLnRhZ05hbWUgfX08L3NwYW4+XHJcbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ6b25lLXRhZy1yZW1vdmVcIiAoY2xpY2spPVwicmVtb3ZlWm9uZShpKVwiPlxyXG4gICAgICAgICAgICAgICAgPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCIxMlwiIGhlaWdodD1cIjEyXCIgdmlld0JveD1cIjAgMCAxMiAxMlwiIGZpbGw9XCJub25lXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNOSAzTDMgOU0zIDNMOSA5XCIgc3Ryb2tlPVwiIzY2NzA4NVwiIHN0cm9rZS13aWR0aD1cIjEuNVwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIlxyXG4gICAgICAgICAgICAgICAgICAgIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cclxuICAgICAgICAgICAgICAgIDwvc3ZnPlxyXG4gICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcblxyXG4gICAgICAgICAgPCEtLSBJbnB1dCBGaWVsZCAtLT5cclxuICAgICAgICAgIDxpbnB1dCAjem9uZUlucHV0IHR5cGU9XCJ0ZXh0XCIgY2xhc3M9XCJ6b25lcy1pbnB1dFwiIGlkPVwiem9uZXNUYWdnZWRcIiBmb3JtQ29udHJvbE5hbWU9XCJ6b25lTmFtZVwiXHJcbiAgICAgICAgICAgIChrZXlkb3duKT1cIm9uS2V5RG93bigkZXZlbnQpXCIgKGZvY3VzKT1cIm9uSW5wdXRGb2N1cygpXCIgKGJsdXIpPVwib25JbnB1dEJsdXIoKVwiIGF1dG9jb21wbGV0ZT1cIm9mZlwiXHJcbiAgICAgICAgICAgIFtkaXNhYmxlZF09XCJ6b25lc05vdEF2YWlsYWJsZSAmJiBhdmFpbGFibGVab25lcy5sZW5ndGggPT09IDBcIj5cclxuICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgPCEtLSBBdXRvY29tcGxldGUgRHJvcGRvd24gKHNob3duIHdoZW4gdHlwaW5nIGFuZCBtYXRjaGVzIGZvdW5kKSAtLT5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiYXV0b2NvbXBsZXRlLWRyb3Bkb3duXCIgKm5nSWY9XCJzaG93RHJvcGRvd24gJiYgZmlsdGVyZWRab25lcy5sZW5ndGggPiAwXCI+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiem9uZXMtbGlzdFwiPlxyXG4gICAgICAgICAgICA8IS0tIFNlbGVjdCBBbGwgT3B0aW9uIC0tPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1jaGVjayBkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyIHB0LTMgcHgtNSBzZWxlY3QtYWxsLW9wdGlvblwiIChtb3VzZWRvd24pPVwiJGV2ZW50LnByZXZlbnREZWZhdWx0KClcIj5cclxuICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9XCJmb3JtLWNoZWNrLWlucHV0XCIgdHlwZT1cImNoZWNrYm94XCIgW2NoZWNrZWRdPVwiYXJlQWxsRmlsdGVyZWRab25lc1NlbGVjdGVkKClcIlxyXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiIChjaGFuZ2UpPVwidG9nZ2xlU2VsZWN0QWxsKCRldmVudClcIiBpZD1cInNlbGVjdEFsbFpvbmVzXCI+XHJcbiAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZm9ybS1jaGVjay1sYWJlbCBweC0zXCIgZm9yPVwic2VsZWN0QWxsWm9uZXNcIj5cclxuICAgICAgICAgICAgICAgIFNlbGVjdCBBbGxcclxuICAgICAgICAgICAgICA8L2xhYmVsPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImJvcmRlciBib3JkZXItZ3JheSBtdC0zXCI+PC9kaXY+XHJcbiAgICAgICAgICAgIDwhLS0gWm9uZSBPcHRpb25zIC0tPlxyXG4gICAgICAgICAgICA8ZGl2ICpuZ0Zvcj1cImxldCB6b25lIG9mIGZpbHRlcmVkWm9uZXNcIiBjbGFzcz1cImZvcm0tY2hlY2sgZC1mbGV4IGFsaWduLWl0ZW1zLWNlbnRlciBweS0zIHB4LTUgem9uZS1vcHRpb25cIlxyXG4gICAgICAgICAgICAgIChtb3VzZWRvd24pPVwiJGV2ZW50LnByZXZlbnREZWZhdWx0KClcIj5cclxuICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9XCJmb3JtLWNoZWNrLWlucHV0IGN1cnNvci1wb2ludGVyXCIgdHlwZT1cImNoZWNrYm94XCIgW2NoZWNrZWRdPVwiaXNab25lU2VsZWN0ZWQoem9uZSlcIlxyXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiIChjaGFuZ2UpPVwidG9nZ2xlWm9uZVNlbGVjdGlvbih6b25lLCAkZXZlbnQpXCIgW2lkXT1cIid6b25lLScgKyB6b25lLnRhZ05hbWVcIj5cclxuICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJmb3JtLWNoZWNrLWxhYmVsIHB4LTMgY3Vyc29yLXBvaW50ZXJcIiBbZm9yXT1cIid6b25lLScgKyB6b25lLnRhZ05hbWVcIj5cclxuICAgICAgICAgICAgICAgIHt7IHpvbmUudGFnTmFtZSB9fVxyXG4gICAgICAgICAgICAgIDwvbGFiZWw+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcblxyXG4gICAgPCEtLSBBY3Rpb24gQnV0dG9ucyAtLT5cclxuICAgIDxkaXYgY2xhc3M9XCJtb2RhbC1mb290ZXItY3VzdG9tIG10LTRcIj5cclxuICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBnYXAtMyBqdXN0aWZ5LWNvbnRlbnQtZW5kXCI+XHJcbiAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4gYnRuLW91dGxpbmVcIiAoY2xpY2spPVwib25DYW5jZWwoKVwiPkNhbmNlbDwvYnV0dG9uPlxyXG4gICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuIGJ0bi1wcmltYXJ5XCIgKGNsaWNrKT1cIm9uQ3JlYXRlKClcIiBbZGlzYWJsZWRdPVwiY3JlYXRlWm9uZUdyb3VwRm9ybS5pbnZhbGlkXCI+XHJcbiAgICAgICAgICB7eyBpc0VkaXRNb2RlID8gJ1VwZGF0ZScgOiAnQ3JlYXRlJyB9fVxyXG4gICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG4gIDwvZm9ybT5cclxuPC9kaXY+XHJcblxyXG48IS0tIFpvbmUgQWxyZWFkeSBUYWdnZWQgTW9kYWwgLS0+XHJcbjxuZy10ZW1wbGF0ZSAjem9uZVRhZ2dlZE1vZGFsIGxldC1tb2RhbD5cclxuICA8ZGl2IGNsYXNzPVwibW9kYWwtaGVhZGVyIGJvcmRlci0wIHBiLTBcIj5cclxuICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuLWNsb3NlXCIgYXJpYS1sYWJlbD1cIkNsb3NlXCIgKGNsaWNrKT1cIm9uQ2xvc2Vab25lVGFnZ2VkTW9kYWwoKVwiPjwvYnV0dG9uPlxyXG4gIDwvZGl2PlxyXG4gIDxkaXYgY2xhc3M9XCJtb2RhbC1ib2R5IGRlbGV0ZS16b25lLW1vZGFsLWJvZHlcIiBzdHlsZT1cImJvdHRvbTogMTNweDtcIj5cclxuICAgIDxkaXYgY2xhc3M9XCJkZWxldGUtem9uZS1pY29uIG1iLTRcIj5cclxuICAgICAgPHN2ZyB3aWR0aD1cIjU2XCIgaGVpZ2h0PVwiNTZcIiB2aWV3Qm94PVwiMCAwIDU2IDU2XCIgZmlsbD1cIm5vbmVcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCI+XHJcbiAgICAgICAgPHJlY3QgeD1cIjRcIiB5PVwiNFwiIHdpZHRoPVwiNDhcIiBoZWlnaHQ9XCI0OFwiIHJ4PVwiMjRcIiBmaWxsPVwiI0ZFRjBDN1wiIC8+XHJcbiAgICAgICAgPHJlY3QgeD1cIjRcIiB5PVwiNFwiIHdpZHRoPVwiNDhcIiBoZWlnaHQ9XCI0OFwiIHJ4PVwiMjRcIiBzdHJva2U9XCIjRkZGQUVCXCIgc3Ryb2tlLXdpZHRoPVwiOFwiIC8+XHJcbiAgICAgICAgPHBhdGhcclxuICAgICAgICAgIGQ9XCJNMjcuOTk4OCAyNC4wMDAyVjI4LjAwMDJNMjcuOTk4OCAzMi4wMDAySDI4LjAwODhNMjYuMjg4OCAxOC44NjAyTDE3LjgxODggMzMuMDAwMkMxNy42NDQyIDMzLjMwMjYgMTcuNTUxOCAzMy42NDU1IDE3LjU1MDggMzMuOTk0N0MxNy41NDk4IDM0LjM0MzkgMTcuNjQwMyAzNC42ODczIDE3LjgxMzIgMzQuOTkwN0MxNy45ODYyIDM1LjI5NDEgMTguMjM1NSAzNS41NDcgMTguNTM2NSAzNS43MjQxQzE4LjgzNzUgMzUuOTAxMiAxOS4xNzk2IDM1Ljk5NjQgMTkuNTI4OCAzNi4wMDAySDM2LjQ2ODhDMzYuODE4IDM1Ljk5NjQgMzcuMTYwMSAzNS45MDEyIDM3LjQ2MTEgMzUuNzI0MUMzNy43NjIxIDM1LjU0NyAzOC4wMTE0IDM1LjI5NDEgMzguMTg0NCAzNC45OTA3QzM4LjM1NzMgMzQuNjg3MyAzOC40NDc4IDM0LjM0MzkgMzguNDQ2OCAzMy45OTQ3QzM4LjQ0NTggMzMuNjQ1NSAzOC4zNTM0IDMzLjMwMjYgMzguMTc4OCAzMy4wMDAyTDI5LjcwODggMTguODYwMkMyOS41MzA1IDE4LjU2NjMgMjkuMjc5NSAxOC4zMjMzIDI4Ljk4IDE4LjE1NDdDMjguNjgwNSAxNy45ODYxIDI4LjM0MjUgMTcuODk3NSAyNy45OTg4IDE3Ljg5NzVDMjcuNjU1MSAxNy44OTc1IDI3LjMxNzEgMTcuOTg2MSAyNy4wMTc2IDE4LjE1NDdDMjYuNzE4MSAxOC4zMjMzIDI2LjQ2NzEgMTguNTY2MyAyNi4yODg4IDE4Ljg2MDJaXCJcclxuICAgICAgICAgIHN0cm9rZT1cIiNEQzY4MDNcIiBzdHJva2Utd2lkdGg9XCIyXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cclxuICAgICAgPC9zdmc+XHJcbiAgICA8L2Rpdj5cclxuXHJcbiAgICA8aDQgY2xhc3M9XCJkZWxldGUtem9uZS10aXRsZSBtYi0zXCI+XHJcbiAgICAgIFpvbmUgQWxyZWFkeSBUYWdnZWRcclxuICAgIDwvaDQ+XHJcblxyXG4gICAgPHAgY2xhc3M9XCJkZWxldGUtem9uZS1kZXNjcmlwdGlvbiB0ZXh0LWNlbnRlciBtYi00XCI+XHJcbiAgICAgIFRoZSBzZWxlY3RlZCB6b25lIDxzcGFuIGNsYXNzPVwiZGVsZXRlLXpvbmUtbmFtZVwiPnt7IGNvbmZsaWN0Wm9uZU5hbWUgfHwgJ1pvbmUgTmFtZScgfX08L3NwYW4+XHJcbiAgICAgIGlzIGFscmVhZHkgdGFnZ2VkIHRvIGFub3RoZXIgZ3JvdXBcclxuICAgICAgPHNwYW4gY2xhc3M9XCJkZWxldGUtem9uZS1uYW1lXCI+e3sgY29uZmxpY3RHcm91cE5hbWUgfHwgJ0dyb3VwIE5hbWUnIH19PC9zcGFuPi5cclxuICAgICAgSWYgeW91IHdhbnQgdG8gYWRkIHRoaXMgdG8gdGhlIGdyb3VwLCB5b3UgbmVlZCB0byByZW1vdmUgdGhlIHpvbmUgZnJvbSB0aGUgb3RoZXIgZ3JvdXAuXHJcbiAgICA8L3A+XHJcblxyXG4gICAgPGRpdiBjbGFzcz1cIm1vZGFsLWZvb3Rlci1jdXN0b20gbXQtNFwiPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGdhcC0zIGp1c3RpZnktY29udGVudC1jZW50ZXJcIj5cclxuICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0biBidG4tb3V0bGluZVwiIChjbGljayk9XCJvbkNsb3NlWm9uZVRhZ2dlZE1vZGFsKClcIj5DYW5jZWw8L2J1dHRvbj5cclxuICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0biBidG4tcHJpbWFyeVwiIChjbGljayk9XCJvbkNsb3NlWm9uZVRhZ2dlZE1vZGFsKClcIj5Pa2F5PC9idXR0b24+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbiAgPC9kaXY+XHJcbjwvbmctdGVtcGxhdGU+Il19
|
|
580
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3JlYXRlLXNpbmdsZS16b25lLWdyb3VwLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3RhbmdvLW1hbmFnZS1zZXR0aW5ncy9zcmMvbGliL2NvbXBvbmVudHMvY29uZmlndXJhdGlvbnMvem9uZS1jb25maWd1cmF0aW9uL2NyZWF0ZS1zaW5nbGUtem9uZS1ncm91cC9jcmVhdGUtc2luZ2xlLXpvbmUtZ3JvdXAuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdGFuZ28tbWFuYWdlLXNldHRpbmdzL3NyYy9saWIvY29tcG9uZW50cy9jb25maWd1cmF0aW9ucy96b25lLWNvbmZpZ3VyYXRpb24vY3JlYXRlLXNpbmdsZS16b25lLWdyb3VwL2NyZWF0ZS1zaW5nbGUtem9uZS1ncm91cC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQXFCLFNBQVMsRUFBcUIsWUFBWSxFQUFlLE1BQU0sZUFBZSxDQUFDO0FBQzNHLE9BQU8sRUFBMEIsVUFBVSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFHcEUsT0FBTyxFQUFFLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFFMUMsT0FBTyxFQUFjLFNBQVMsRUFBRSxNQUFNLGVBQWUsQ0FBQzs7Ozs7OztBQU90RCxNQUFNLE9BQU8sOEJBQThCO0lBb0IvQjtJQUNEO0lBQ0M7SUFDQTtJQUNBO0lBQ0E7SUF4QlYsbUJBQW1CLENBQVk7SUFDL0IsY0FBYyxHQUFVLEVBQUUsQ0FBQztJQUMzQixhQUFhLEdBQVUsRUFBRSxDQUFDO0lBQzFCLGFBQWEsR0FBVSxFQUFFLENBQUM7SUFDMUIsaUJBQWlCLEdBQVksS0FBSyxDQUFDO0lBQ25DLFFBQVEsR0FBVyxFQUFFLENBQUM7SUFDdEIsVUFBVSxHQUFZLEtBQUssQ0FBQztJQUM1QixhQUFhLEdBQVEs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RUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFO2dCQXdiL0MsZUFBZTtzQkFEZCxZQUFZO3VCQUFDLGdCQUFnQixFQUFFLENBQUMsUUFBUSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ2hhbmdlRGV0ZWN0b3JSZWYsIENvbXBvbmVudCwgT25EZXN0cm95LCBPbkluaXQsIEhvc3RMaXN0ZW5lciwgVGVtcGxhdGVSZWYgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgRm9ybUJ1aWxkZXIsIEZvcm1Hcm91cCwgVmFsaWRhdG9ycyB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcclxuaW1wb3J0IHsgTmdiQWN0aXZlTW9kYWwsIE5nYk1vZGFsIH0gZnJvbSAnQG5nLWJvb3RzdHJhcC9uZy1ib290c3RyYXAnO1xyXG5pbXBvcnQgeyBDbGllbnRBcGlTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vLi4vc2VydmljZXMvY2xpZW50LWFwaS5zZXJ2aWNlJztcclxuaW1wb3J0IHsgU3ViamVjdCwgdGFrZVVudGlsIH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IFRvYXN0U2VydmljZSB9IGZyb20gJ3RhbmdvLWFwcC11aS1zaGFyZWQnO1xyXG5pbXBvcnQgeyBFbGVtZW50UmVmLCBWaWV3Q2hpbGQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnbGliLWNyZWF0ZS1zaW5nbGUtem9uZS1ncm91cCcsXHJcbiAgdGVtcGxhdGVVcmw6ICcuL2NyZWF0ZS1zaW5nbGUtem9uZS1ncm91cC5jb21wb25lbnQuaHRtbCcsXHJcbiAgc3R5bGVVcmw6ICcuL2NyZWF0ZS1zaW5nbGUtem9uZS1ncm91cC5jb21wb25lbnQuc2NzcydcclxufSlcclxuZXhwb3J0IGNsYXNzIENyZWF0ZVNpbmdsZVpvbmVHcm91cENvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95IHtcclxuICBjcmVhdGVab25lR3JvdXBGb3JtOiBGb3JtR3JvdXA7XHJcbiAgYXZhaWxhYmxlWm9uZXM6IGFueVtdID0gW107XHJcbiAgc2VsZWN0ZWRab25lczogYW55W10gPSBbXTtcclxuICBmaWx0ZXJlZFpvbmVzOiBhbnlbXSA9IFtdO1xyXG4gIHpvbmVzTm90QXZhaWxhYmxlOiBib29sZWFuID0gZmFsc2U7XHJcbiAgY2xpZW50SWQ6IHN0cmluZyA9ICcnO1xyXG4gIGlzRWRpdE1vZGU6IGJvb2xlYW4gPSBmYWxzZTtcclxuICB6b25lR3JvdXBEYXRhOiBhbnkgPSBudWxsO1xyXG4gIHNob3dEcm9wZG93bjogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIHByaXZhdGUgaXNUb2dnbGluZzogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgZGVzdHJveSQgPSBuZXcgU3ViamVjdCgpO1xyXG4gIEBWaWV3Q2hpbGQoJ3pvbmVJbnB1dCcpIHpvbmVJbnB1dFJlZiE6IEVsZW1lbnRSZWY8SFRNTElucHV0RWxlbWVudD47XHJcbiAgQFZpZXdDaGlsZCgnem9uZVRhZ2dlZE1vZGFsJywgeyBzdGF0aWM6IGZhbHNlIH0pIHpvbmVUYWdnZWRNb2RhbCE6IFRlbXBsYXRlUmVmPGFueT47XHJcbiAgem9uZVRhZ2dlZE1vZGFsUmVmOiBhbnkgPSBudWxsO1xyXG4gIGNvbmZsaWN0Wm9uZU5hbWU6IHN0cmluZyA9ICcnO1xyXG4gIGNvbmZsaWN0R3JvdXBOYW1lOiBzdHJpbmcgPSAnJztcclxuXHJcblxyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgcHJpdmF0ZSBmYjogRm9ybUJ1aWxkZXIsXHJcbiAgICBwdWJsaWMgYWN0aXZlTW9kYWw6IE5nYkFjdGl2ZU1vZGFsLFxyXG4gICAgcHJpdmF0ZSBtb2RhbFNlcnZpY2U6IE5nYk1vZGFsLFxyXG4gICAgcHJpdmF0ZSBjbGllbnRBcGlTZXJ2aWNlOiBDbGllbnRBcGlTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSB0b2FzdFNlcnZpY2U6IFRvYXN0U2VydmljZSxcclxuICAgIHByaXZhdGUgY2RyOiBDaGFuZ2VEZXRlY3RvclJlZlxyXG4gICkge1xyXG4gICAgdGhpcy5jcmVhdGVab25lR3JvdXBGb3JtID0gdGhpcy5mYi5ncm91cCh7XHJcbiAgICAgIGdyb3VwTmFtZTogWycnLCBbXHJcbiAgICAgICAgVmFsaWRhdG9ycy5yZXF1aXJlZCxcclxuICAgICAgICBWYWxpZGF0b3JzLm1pbkxlbmd0aCgxKSxcclxuICAgICAgICBWYWxpZGF0b3JzLnBhdHRlcm4oL14oPyFcXHMqJClbYS16QS1aMC05XFxzXFwvXSokLylcclxuICAgICAgXV0sXHJcbiAgICAgIHpvbmVOYW1lOiBbJyddLFxyXG4gICAgICB6b25lc1RhZ2dlZDogW1tdXVxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBuZ09uSW5pdCgpOiB2b2lkIHtcclxuICAgIC8vIEVuc3VyZSBmb3JtIGNvbnRyb2xzIGFyZSBtYXJrZWQgYXMgdW50b3VjaGVkIHdoZW4gbW9kYWwgb3BlbnNcclxuICAgIHRoaXMuY3JlYXRlWm9uZUdyb3VwRm9ybS5tYXJrQXNVbnRvdWNoZWQoKTtcclxuICAgIHRoaXMuY3JlYXRlWm9uZUdyb3VwRm9ybS5nZXQoJ2dyb3VwTmFtZScpPy5tYXJrQXNVbnRvdWNoZWQoKTtcclxuICAgIHRoaXMuY3JlYXRlWm9uZUdyb3VwRm9ybS5nZXQoJ3pvbmVOYW1lJyk/Lm1hcmtBc1VudG91Y2hlZCgpO1xyXG4gICAgLy8gR2V0IGNsaWVudCBJRFxyXG4gICAgdGhpcy5jbGllbnRBcGlTZXJ2aWNlLmNsaWVudERhdGEucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpLnN1YnNjcmliZSgoZSkgPT4ge1xyXG4gICAgICBpZiAoZSkge1xyXG4gICAgICAgIHRoaXMuY2xpZW50SWQgPSBlLmNsaWVudElkO1xyXG4gICAgICAgIHRoaXMubG9hZFpvbmVzKCk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG5cclxuICAgIC8vIFdhdGNoIGZvciB6b25lIGlucHV0IGNoYW5nZXMgdG8gZmlsdGVyIHpvbmVzXHJcbiAgICB0aGlzLmNyZWF0ZVpvbmVHcm91cEZvcm0uZ2V0KCd6b25lTmFtZScpPy52YWx1ZUNoYW5nZXMucGlwZShcclxuICAgICAgdGFrZVVudGlsKHRoaXMuZGVzdHJveSQpXHJcbiAgICApLnN1YnNjcmliZSgodmFsdWU6IHN0cmluZykgPT4ge1xyXG4gICAgICB0aGlzLmZpbHRlclpvbmVzKHZhbHVlIHx8ICcnKTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XHJcbiAgICB0aGlzLmRlc3Ryb3kkLm5leHQodHJ1ZSk7XHJcbiAgICB0aGlzLmRlc3Ryb3kkLmNvbXBsZXRlKCk7XHJcbiAgfVxyXG5cclxuICAvLyBNZXRob2QgdG8gaW5pdGlhbGl6ZSBjb21wb25lbnQgaW4gZWRpdCBtb2RlXHJcbiAgc2V0Wm9uZUdyb3VwRGF0YUZvckVkaXQoZ3JvdXA6IGFueSk6IHZvaWQge1xyXG4gICAgY29uc29sZS5sb2coJ3NldFpvbmVHcm91cERhdGFGb3JFZGl0IDonLCBncm91cCk7XHJcbiAgICB0aGlzLmlzRWRpdE1vZGUgPSB0cnVlO1xyXG4gICAgdGhpcy56b25lR3JvdXBEYXRhID0gZ3JvdXA7XHJcblxyXG4gICAgLy8gRW5zdXJlIGZvcm0gY29udHJvbHMgYXJlIG1hcmtlZCBhcyB1bnRvdWNoZWQgYmVmb3JlIHNldHRpbmcgdmFsdWVzXHJcbiAgICB0aGlzLmNyZWF0ZVpvbmVHcm91cEZvcm0ubWFya0FzVW50b3VjaGVkKCk7XHJcbiAgICB0aGlzLmNyZWF0ZVpvbmVHcm91cEZvcm0uZ2V0KCdncm91cE5hbWUnKT8ubWFya0FzVW50b3VjaGVkKCk7XHJcbiAgICB0aGlzLmNyZWF0ZVpvbmVHcm91cEZvcm0uZ2V0KCd6b25lTmFtZScpPy5tYXJrQXNVbnRvdWNoZWQoKTtcclxuXHJcbiAgICAvLyBSZXNldCBmb3JtIGNsZWFubHkgd2l0aCBncm91cCBuYW1lXHJcbiAgICB0aGlzLmNyZWF0ZVpvbmVHcm91cEZvcm0ucmVzZXQoe1xyXG4gICAgICBncm91cE5hbWU6IGdyb3VwLmdyb3VwTmFtZSxcclxuICAgICAgem9uZU5hbWU6ICcnLFxyXG4gICAgICB6b25lc1RhZ2dlZDogW11cclxuICAgIH0sIHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcclxuXHJcbiAgICAvLyBQcmVwb3B1bGF0ZSBzZWxlY3RlZCB6b25lcyBmcm9tIHRoZSBncm91cCBkYXRhXHJcbiAgICB0aGlzLnNlbGVjdGVkWm9uZXMgPSBbXTtcclxuICAgIGNvbnN0IHpvbmVzTGlzdCA9IHRoaXMuZ2V0Wm9uZXNGcm9tR3JvdXAoZ3JvdXApO1xyXG5cclxuICAgIGlmICh6b25lc0xpc3QgJiYgem9uZXNMaXN0Lmxlbmd0aCA+IDApIHtcclxuICAgICAgem9uZXNMaXN0LmZvckVhY2goKHpvbmU6IGFueSkgPT4ge1xyXG4gICAgICAgIGxldCB6b25lTmFtZTogc3RyaW5nID0gJyc7XHJcblxyXG4gICAgICAgIC8vIEhhbmRsZSBkaWZmZXJlbnQgZGF0YSBzdHJ1Y3R1cmVzOiBzdHJpbmcsIG9yIG9iamVjdCB3aXRoIHRhZ05hbWUvbmFtZS96b25lTmFtZVxyXG4gICAgICAgIGlmICh0eXBlb2Ygem9uZSA9PT0gJ3N0cmluZycpIHtcclxuICAgICAgICAgIHpvbmVOYW1lID0gem9uZS50cmltKCk7XHJcbiAgICAgICAgfSBlbHNlIGlmICh6b25lICYmIHR5cGVvZiB6b25lID09PSAnb2JqZWN0Jykge1xyXG4gICAgICAgICAgY29uc3QgdGFnTmFtZSA9IHpvbmUudGFnTmFtZTtcclxuICAgICAgICAgIC8vIGNvbnN0IG5hbWUgPSB6b25lLm5hbWU7XHJcbiAgICAgICAgICAvLyBjb25zdCB6b25lTmFtZVByb3AgPSB6b25lLnpvbmVOYW1lO1xyXG5cclxuICAgICAgICAgIC8vIEdldCB0aGUgZmlyc3QgYXZhaWxhYmxlIHByb3BlcnR5IHZhbHVlIGFuZCBjb252ZXJ0IHRvIHN0cmluZ1xyXG4gICAgICAgICAgY29uc3QgdmFsdWUgPSB0YWdOYW1lO1xyXG4gICAgICAgICAgaWYgKHZhbHVlICE9IG51bGwpIHtcclxuICAgICAgICAgICAgem9uZU5hbWUgPSB0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnID8gdmFsdWUgOiBTdHJpbmcodmFsdWUpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHpvbmVOYW1lICYmIHpvbmVOYW1lICE9PSAnJykge1xyXG4gICAgICAgICAgdGhpcy5zZWxlY3RlZFpvbmVzLnB1c2goe1xyXG4gICAgICAgICAgICBuYW1lOiB6b25lTmFtZSxcclxuICAgICAgICAgICAgdGFnTmFtZTogem9uZU5hbWVcclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gVXBkYXRlIGZvcm0gY29udHJvbCBmb3Igem9uZXNUYWdnZWRcclxuICAgIHRoaXMuY3JlYXRlWm9uZUdyb3VwRm9ybS5nZXQoJ3pvbmVzVGFnZ2VkJyk/LnNldFZhbHVlKHRoaXMuc2VsZWN0ZWRab25lcywgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xyXG5cclxuICAgIC8vIFJlc2V0IGZpbHRlcmVkIHpvbmVzIGFuZCBkcm9wZG93blxyXG4gICAgdGhpcy5maWx0ZXJlZFpvbmVzID0gW107XHJcbiAgICB0aGlzLnNob3dEcm9wZG93biA9IGZhbHNlO1xyXG5cclxuICAgIC8vIE1hcmsgZm9ybSBhcyB1bnRvdWNoZWRcclxuICAgIHRoaXMuY3JlYXRlWm9uZUdyb3VwRm9ybS5tYXJrQXNVbnRvdWNoZWQoKTtcclxuXHJcbiAgICAvLyBGb3JjZSBVSSB1cGRhdGVcclxuICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcclxuICB9XHJcblxyXG4gIC8vIEhlbHBlciBtZXRob2QgdG8gZXh0cmFjdCB6b25lcyBmcm9tIGdyb3VwIGRhdGEgKGhhbmRsZXMgZGlmZmVyZW50IGRhdGEgc3RydWN0dXJlcylcclxuICBwcml2YXRlIGdldFpvbmVzRnJvbUdyb3VwKGdyb3VwOiBhbnkpOiBhbnlbXSB7XHJcbiAgICBpZiAoIWdyb3VwKSByZXR1cm4gW107XHJcblxyXG4gICAgLy8gQ2hlY2sgZm9yIHpvbmVzVGFnZ2VkIGZpcnN0IGFzIGl0J3MgdGhlIG1vc3QgY29tbW9uIHByb3BlcnR5IG5hbWVcclxuICAgIGlmIChBcnJheS5pc0FycmF5KGdyb3VwLnpvbmVzVGFnZ2VkKSkge1xyXG4gICAgICByZXR1cm4gZ3JvdXAuem9uZXNUYWdnZWQ7XHJcbiAgICB9XHJcbiAgICBpZiAoQXJyYXkuaXNBcnJheShncm91cC56b25lcykpIHtcclxuICAgICAgcmV0dXJuIGdyb3VwLnpvbmVzO1xyXG4gICAgfVxyXG4gICAgaWYgKEFycmF5LmlzQXJyYXkoZ3JvdXAuem9uZUxpc3QpKSB7XHJcbiAgICAgIHJldHVybiBncm91cC56b25lTGlzdDtcclxuICAgIH1cclxuICAgIC8vIElmIHpvbmVzIGFyZSBzdG9yZWQgYXMgYW4gYXJyYXkgb2Ygem9uZSBuYW1lc1xyXG4gICAgaWYgKGdyb3VwLnpvbmVOYW1lcyAmJiBBcnJheS5pc0FycmF5KGdyb3VwLnpvbmVOYW1lcykpIHtcclxuICAgICAgcmV0dXJuIGdyb3VwLnpvbmVOYW1lcztcclxuICAgIH1cclxuICAgIHJldHVybiBbXTtcclxuICB9XHJcblxyXG4gIGxvYWRab25lcygpOiB2b2lkIHtcclxuICAgIGlmICghdGhpcy5jbGllbnRJZCkgcmV0dXJuO1xyXG4gICAgdGhpcy5jbGllbnRBcGlTZXJ2aWNlLmdldFpvbmVDb25maWdUYWdnaW5nRGV0YWlscyh7IFxyXG4gICAgICBjbGllbnRJZDogdGhpcy5jbGllbnRJZCxcclxuICAgICAgbGltaXQ6IDEwMDAwXHJcbiAgICB9KS5waXBlKFxyXG4gICAgICB0YWtlVW50aWwodGhpcy5kZXN0cm95JClcclxuICAgICkuc3Vic2NyaWJlKHtcclxuICAgICAgbmV4dDogKHJlczogYW55KSA9PiB7XHJcbiAgICAgICAgaWYgKHJlcyAmJiByZXMuY29kZSA9PT0gMjAwKSB7XHJcbiAgICAgICAgICB0aGlzLmF2YWlsYWJsZVpvbmVzID0gcmVzPy5kYXRhPy5yZXN1bHQuZmlsdGVyKCh6b25lOiBhbnkpID0+IHpvbmUudGFnTmFtZSAmJiB6b25lLnRhZ05hbWUgIT09ICcnKSB8fCBbXTtcclxuICAgICAgICAgIHRoaXMuem9uZXNOb3RBdmFpbGFibGUgPSB0aGlzLmF2YWlsYWJsZVpvbmVzLmxlbmd0aCA9PT0gMDtcclxuICAgICAgICAgIHRoaXMuZmlsdGVyZWRab25lcyA9IFtdO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICB0aGlzLnpvbmVzTm90QXZhaWxhYmxlID0gdHJ1ZTtcclxuICAgICAgICAgIHRoaXMuYXZhaWxhYmxlWm9uZXMgPSBbXTtcclxuICAgICAgICAgIHRoaXMuZmlsdGVyZWRab25lcyA9IFtdO1xyXG4gICAgICAgIH1cclxuICAgICAgfSxcclxuICAgICAgZXJyb3I6IChlcnI6IGFueSkgPT4ge1xyXG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yIGxvYWRpbmcgem9uZXMgdGFnOicsIGVycik7XHJcbiAgICAgICAgdGhpcy56b25lc05vdEF2YWlsYWJsZSA9IHRydWU7XHJcbiAgICAgICAgdGhpcy5hdmFpbGFibGVab25lcyA9IFtdO1xyXG4gICAgICAgIHRoaXMuZmlsdGVyZWRab25lcyA9IFtdO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIC8vIGZpbHRlclpvbmVzKHNlYXJjaFRlcm06IHN0cmluZyk6IHZvaWQge1xyXG4gIC8vICAgY29uc3QgdHJpbW1lZFNlYXJjaCA9IHNlYXJjaFRlcm0udHJpbSgpLnRvTG93ZXJDYXNlKCk7XHJcblxyXG4gIC8vICAgLy8gRmlsdGVyIHpvbmVzIHRoYXQgbWF0Y2ggdGhlIHNlYXJjaCB0ZXJtIGFuZCBhcmUgbm90IGFscmVhZHkgc2VsZWN0ZWRcclxuICAvLyAgIC8vIElmIHNlYXJjaCB0ZXJtIGlzIGVtcHR5LCBzaG93IGFsbCBhdmFpbGFibGUgem9uZXMgKGV4Y2x1ZGluZyBzZWxlY3RlZCBvbmVzKVxyXG4gIC8vICAgdGhpcy5maWx0ZXJlZFpvbmVzID0gdGhpcy5hdmFpbGFibGVab25lcy5maWx0ZXIoem9uZSA9PiB7XHJcbiAgLy8gICAgIGNvbnN0IHpvbmVOYW1lID0gKHpvbmUudGFnTmFtZSB8fCAnJykudG9Mb3dlckNhc2UoKTtcclxuICAvLyAgICAgY29uc3QgaXNNYXRjaCA9ICF0cmltbWVkU2VhcmNoIHx8IHpvbmVOYW1lLmluY2x1ZGVzKHRyaW1tZWRTZWFyY2gpO1xyXG4gIC8vICAgICBjb25zdCBpc05vdFNlbGVjdGVkID0gIXRoaXMuc2VsZWN0ZWRab25lcy5zb21lKFxyXG4gIC8vICAgICAgIHNlbGVjdGVkID0+IHtcclxuICAvLyAgICAgICAgIGNvbnN0IHNlbGVjdGVkTmFtZSA9IChzZWxlY3RlZC5uYW1lIHx8ICcnKS50b0xvd2VyQ2FzZSgpO1xyXG4gIC8vICAgICAgICAgY29uc3Qgc2VsZWN0ZWRUYWdOYW1lID0gKHNlbGVjdGVkLnRhZ05hbWUgfHwgJycpLnRvTG93ZXJDYXNlKCk7XHJcbiAgLy8gICAgICAgICByZXR1cm4gc2VsZWN0ZWROYW1lID09PSB6b25lTmFtZSB8fCBzZWxlY3RlZFRhZ05hbWUgPT09IHpvbmVOYW1lO1xyXG4gIC8vICAgICAgIH1cclxuICAvLyAgICAgKTtcclxuICAvLyAgICAgcmV0dXJuIGlzTWF0Y2ggJiYgaXNOb3RTZWxlY3RlZDtcclxuICAvLyAgIH0pO1xyXG5cclxuICAvLyAgIHRoaXMuc2hvd0Ryb3Bkb3duID0gdGhpcy5maWx0ZXJlZFpvbmVzLmxlbmd0aCA+IDA7XHJcbiAgLy8gfVxyXG5cclxuICBmaWx0ZXJab25lcyhzZWFyY2hUZXJtOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgIGNvbnN0IHZhbHVlID0gKHNlYXJjaFRlcm0gfHwgJycpLnRvTG93ZXJDYXNlKCk7XHJcblxyXG4gICAgdGhpcy5maWx0ZXJlZFpvbmVzID0gdGhpcy5hdmFpbGFibGVab25lcy5maWx0ZXIoem9uZSA9PlxyXG4gICAgICB6b25lLnRhZ05hbWU/LnRvTG93ZXJDYXNlKCkuaW5jbHVkZXModmFsdWUpXHJcbiAgICApO1xyXG5cclxuICAgIHRoaXMuc2hvd0Ryb3Bkb3duID0gdGhpcy5maWx0ZXJlZFpvbmVzLmxlbmd0aCA+IDA7XHJcbiAgfVxyXG5cclxuXHJcbiAgYWRkWm9uZSh6b25lTmFtZU9yT2JqZWN0Pzogc3RyaW5nIHwgYW55KTogdm9pZCB7XHJcbiAgICBsZXQgem9uZU5hbWU6IHN0cmluZztcclxuICAgIGxldCB6b25lT2JqZWN0OiBhbnkgPSBudWxsO1xyXG5cclxuICAgIC8vIEhhbmRsZSBib3RoIHN0cmluZyBhbmQgb2JqZWN0IGlucHV0XHJcbiAgICBpZiAodHlwZW9mIHpvbmVOYW1lT3JPYmplY3QgPT09ICdzdHJpbmcnKSB7XHJcbiAgICAgIHpvbmVOYW1lID0gem9uZU5hbWVPck9iamVjdC50cmltKCk7XHJcbiAgICB9IGVsc2UgaWYgKHpvbmVOYW1lT3JPYmplY3QgJiYgem9uZU5hbWVPck9iamVjdC50YWdOYW1lKSB7XHJcbiAgICAgIHpvbmVPYmplY3QgPSB6b25lTmFtZU9yT2JqZWN0O1xyXG4gICAgICB6b25lTmFtZSA9IHpvbmVOYW1lT3JPYmplY3QudGFnTmFtZS50cmltKCk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICAvLyBUcnkgdG8gZ2V0IGZyb20gZm9ybSBpbnB1dFxyXG4gICAgICBjb25zdCBpbnB1dFZhbHVlID0gdGhpcy5jcmVhdGVab25lR3JvdXBGb3JtLmdldCgnem9uZU5hbWUnKT8udmFsdWU7XHJcbiAgICAgIGlmICghaW5wdXRWYWx1ZSB8fCAhaW5wdXRWYWx1ZS50cmltKCkpIHJldHVybjtcclxuICAgICAgem9uZU5hbWUgPSBpbnB1dFZhbHVlLnRyaW0oKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoIXpvbmVOYW1lIHx8IHpvbmVOYW1lID09PSAnJykgcmV0dXJuO1xyXG5cclxuICAgIC8vIENoZWNrIGlmIHpvbmUgYWxyZWFkeSBleGlzdHMgaW4gc2VsZWN0ZWQgem9uZXNcclxuICAgIGNvbnN0IGV4aXN0cyA9IHRoaXMuc2VsZWN0ZWRab25lcy5zb21lKHogPT5cclxuICAgICAgKHoubmFtZT8udG9Mb3dlckNhc2UoKSA9PT0gem9uZU5hbWUudG9Mb3dlckNhc2UoKSkgfHxcclxuICAgICAgKHoudGFnTmFtZT8udG9Mb3dlckNhc2UoKSA9PT0gem9uZU5hbWUudG9Mb3dlckNhc2UoKSlcclxuICAgICk7XHJcblxyXG4gICAgaWYgKGV4aXN0cykge1xyXG4gICAgICB0aGlzLnRvYXN0U2VydmljZS5nZXRFcnJvclRvYXN0KCdab25lIGFscmVhZHkgYWRkZWQnKTtcclxuICAgICAgdGhpcy5jcmVhdGVab25lR3JvdXBGb3JtLmdldCgnem9uZU5hbWUnKT8uc2V0VmFsdWUoJycsIHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcclxuICAgICAgdGhpcy5zaG93RHJvcGRvd24gPSBmYWxzZTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIElmIHpvbmUgb2JqZWN0IGlzIHByb3ZpZGVkLCB1c2UgaXQ7IG90aGVyd2lzZSBmaW5kIGluIGF2YWlsYWJsZSB6b25lc1xyXG4gICAgaWYgKCF6b25lT2JqZWN0KSB7XHJcbiAgICAgIHpvbmVPYmplY3QgPSB0aGlzLmF2YWlsYWJsZVpvbmVzLmZpbmQoeiA9PlxyXG4gICAgICAgICh6LnRhZ05hbWU/LnRvTG93ZXJDYXNlKCkgPT09IHpvbmVOYW1lLnRvTG93ZXJDYXNlKCkpIHx8XHJcbiAgICAgICAgKHoubmFtZT8udG9Mb3dlckNhc2UoKSA9PT0gem9uZU5hbWUudG9Mb3dlckNhc2UoKSkgfHxcclxuICAgICAgICAoei56b25lTmFtZT8udG9Mb3dlckNhc2UoKSA9PT0gem9uZU5hbWUudG9Mb3dlckNhc2UoKSlcclxuICAgICAgKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBPbmx5IGFkZCB6b25lIGlmIGl0IGV4aXN0cyBpbiBhdmFpbGFibGUgem9uZXMgbGlzdFxyXG4gICAgaWYgKHpvbmVPYmplY3QpIHtcclxuICAgICAgLy8gQ2hlY2sgaWYgdGhpcyB6b25lIGlzIGFscmVhZHkgdGFnZ2VkIHRvIGFub3RoZXIgZ3JvdXBcclxuICAgICAgaWYgKHRoaXMuaXNab25lVGFnZ2VkVG9PdGhlckdyb3VwKHpvbmVPYmplY3QpKSB7XHJcbiAgICAgICAgdGhpcy5zaG93Wm9uZUFscmVhZHlUYWdnZWRQb3B1cChcclxuICAgICAgICAgIHpvbmVPYmplY3QudGFnTmFtZSxcclxuICAgICAgICAgIHpvbmVPYmplY3QuZ3JvdXBOYW1lXHJcbiAgICAgICAgKTtcclxuICAgICAgICB0aGlzLmNyZWF0ZVpvbmVHcm91cEZvcm0uZ2V0KCd6b25lTmFtZScpPy5zZXRWYWx1ZSgnJywgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xyXG4gICAgICAgIHRoaXMuZmlsdGVyZWRab25lcyA9IFtdO1xyXG4gICAgICAgIHRoaXMuc2hvd0Ryb3Bkb3duID0gZmFsc2U7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9XHJcblxyXG4gICAgICB0aGlzLnNlbGVjdGVkWm9uZXMucHVzaCh7XHJcbiAgICAgICAgbmFtZTogem9uZU9iamVjdC50YWdOYW1lIHx8IHpvbmVPYmplY3QubmFtZSB8fCB6b25lT2JqZWN0LnpvbmVOYW1lLFxyXG4gICAgICAgIHRhZ05hbWU6IHpvbmVPYmplY3QudGFnTmFtZVxyXG4gICAgICB9KTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIC8vIFpvbmUgbm90IGZvdW5kIGluIGF2YWlsYWJsZSBsaXN0IC0gc2hvdyBlcnJvciBhbmQgZG9uJ3QgYWRkXHJcbiAgICAgIHRoaXMudG9hc3RTZXJ2aWNlLmdldEVycm9yVG9hc3QoJ1pvbmUgbm90IGZvdW5kIGluIGF2YWlsYWJsZSB6b25lcycpO1xyXG4gICAgICB0aGlzLmNyZWF0ZVpvbmVHcm91cEZvcm0uZ2V0KCd6b25lTmFtZScpPy5zZXRWYWx1ZSgnJywgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xyXG4gICAgICB0aGlzLnNob3dEcm9wZG93biA9IGZhbHNlO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgLy8gQ2xlYXIgaW5wdXQgYW5kIGhpZGUgZHJvcGRvd25cclxuICAgIHRoaXMuY3JlYXRlWm9uZUdyb3VwRm9ybS5nZXQoJ3pvbmVOYW1lJyk/LnNldFZhbHVlKCcnLCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XHJcbiAgICB0aGlzLmZpbHRlcmVkWm9uZXMgPSBbXTtcclxuICAgIHRoaXMuc2hvd0Ryb3Bkb3duID0gZmFsc2U7XHJcblxyXG4gICAgLy8gVXBkYXRlIGZvcm0gY29udHJvbCBmb3Igem9uZXNUYWdnZWRcclxuICAgIHRoaXMuY3JlYXRlWm9uZUdyb3VwRm9ybS5nZXQoJ3pvbmVzVGFnZ2VkJyk/LnNldFZhbHVlKHRoaXMuc2VsZWN0ZWRab25lcywgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xyXG4gIH1cclxuXHJcbiAgcmVtb3ZlWm9uZShpbmRleDogbnVtYmVyKTogdm9pZCB7XHJcbiAgICB0aGlzLnNlbGVjdGVkWm9uZXMuc3BsaWNlKGluZGV4LCAxKTtcclxuICAgIC8vIFVwZGF0ZSBmb3JtIGNvbnRyb2wgZm9yIHpvbmVzVGFnZ2VkXHJcbiAgICB0aGlzLmNyZWF0ZVpvbmVHcm91cEZvcm0uZ2V0KCd6b25lc1RhZ2dlZCcpPy5zZXRWYWx1ZSh0aGlzLnNlbGVjdGVkWm9uZXMsIHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcclxuICB9XHJcblxyXG4gIG9uS2V5RG93bihldmVudDogS2V5Ym9hcmRFdmVudCk6IHZvaWQge1xyXG4gICAgaWYgKGV2ZW50LmtleSA9PT0gJ0VudGVyJykge1xyXG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICBjb25zdCB2YWx1ZSA9IHRoaXMuY3JlYXRlWm9uZUdyb3VwRm9ybS5nZXQoJ3pvbmVOYW1lJyk/LnZhbHVlO1xyXG4gICAgICBpZiAodmFsdWUgJiYgdmFsdWUudHJpbSgpKSB7XHJcbiAgICAgICAgLy8gT25seSBhbGxvdyBhZGRpbmcgaWYgdGhlcmUncyBhIGZpbHRlcmVkIG1hdGNoXHJcbiAgICAgICAgaWYgKHRoaXMuZmlsdGVyZWRab25lcy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICB0aGlzLmFkZFpvbmUodGhpcy5maWx0ZXJlZFpvbmVzWzBdKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgLy8gTm8gbWF0Y2ggZm91bmQgLSBzaG93IGVycm9yXHJcbiAgICAgICAgICB0aGlzLnRvYXN0U2VydmljZS5nZXRFcnJvclRvYXN0KCdQbGVhc2Ugc2VsZWN0IGEgem9uZSBmcm9tIHRoZSBsaXN0Jyk7XHJcbiAgICAgICAgICB0aGlzLmNyZWF0ZVpvbmVHcm91cEZvcm0uZ2V0KCd6b25lTmFtZScpPy5zZXRWYWx1ZSgnJywgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfSBlbHNlIGlmIChldmVudC5rZXkgPT09ICdFc2NhcGUnKSB7XHJcbiAgICAgIHRoaXMuc2hvd0Ryb3Bkb3duID0gZmFsc2U7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBvbklucHV0Rm9jdXMoKTogdm9pZCB7XHJcbiAgICAvLyBTaG93IGRyb3Bkb3duIHdoZW4gaW5wdXQgaXMgZm9jdXNlZCwgYnV0IG5vdCBpZiB3ZSdyZSBtYW51YWxseSB0b2dnbGluZyB0byBjbG9zZVxyXG4gICAgLy8gSWYgaXNUb2dnbGluZyBpcyB0cnVlIGFuZCBzaG93RHJvcGRvd24gaXMgZmFsc2UsIGl0IG1lYW5zIHdlIGp1c3QgY2xvc2VkIGl0LCBzbyBkb24ndCByZW9wZW5cclxuICAgIGlmICh0aGlzLmlzVG9nZ2xpbmcgJiYgIXRoaXMuc2hvd0Ryb3Bkb3duKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIC8vIE90aGVyd2lzZSwgc2hvdyBkcm9wZG93biBub3JtYWxseVxyXG4gICAgY29uc3QgdmFsdWUgPSB0aGlzLmNyZWF0ZVpvbmVHcm91cEZvcm0uZ2V0KCd6b25lTmFtZScpPy52YWx1ZSB8fCAnJztcclxuICAgIGlmICh2YWx1ZSAmJiB2YWx1ZS50cmltKCkpIHtcclxuICAgICAgdGhpcy5maWx0ZXJab25lcyh2YWx1ZSk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLmZpbHRlclpvbmVzKCcnKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vIG9uSW5wdXRCbHVyKCk6IHZvaWQge1xyXG4gIC8vICAgLy8gRGVsYXkgaGlkaW5nIGRyb3Bkb3duIHRvIGFsbG93IGNsaWNrIGV2ZW50cyB0byBmaXJlXHJcbiAgLy8gICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAvLyAgICAgdGhpcy5zaG93RHJvcGRvd24gPSBmYWxzZTtcclxuICAvLyAgIH0sIDIwMCk7XHJcbiAgLy8gfVxyXG5cclxuICBvbklucHV0Qmx1cigpOiB2b2lkIHtcclxuICAgIC8vIE9ubHkgY2xvc2UgZHJvcGRvd24gb24gYmx1ciBpZiBpdCdzIHN0aWxsIG9wZW4gYW5kIHVzZXIgY2xpY2tlZCBvdXRzaWRlXHJcbiAgICAvLyBEb24ndCBpbnRlcmZlcmUgd2l0aCBtYW51YWwgdG9nZ2xlIGluIGZvY3VzWm9uZUlucHV0KClcclxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICBpZiAodGhpcy5zaG93RHJvcGRvd24gJiYgIWRvY3VtZW50LmFjdGl2ZUVsZW1lbnQ/LmNsb3Nlc3QoJy5hdXRvY29tcGxldGUtZHJvcGRvd24nKSAmJiBcclxuICAgICAgICAgICFkb2N1bWVudC5hY3RpdmVFbGVtZW50Py5jbG9zZXN0KCcuem9uZXMtdGFnZ2VkLWNvbnRhaW5lcicpKSB7XHJcbiAgICAgICAgdGhpcy5zaG93RHJvcGRvd24gPSBmYWxzZTtcclxuICAgICAgfVxyXG4gICAgfSwgMjAwKTtcclxuICB9XHJcblxyXG5cclxuICBzZWxlY3Rab25lRnJvbURyb3Bkb3duKHpvbmU6IGFueSk6IHZvaWQge1xyXG4gICAgdGhpcy5hZGRab25lKHpvbmUpO1xyXG4gIH1cclxuXHJcbiAgaXNab25lU2VsZWN0ZWQoem9uZTogYW55KTogYm9vbGVhbiB7XHJcbiAgICBjb25zdCB6b25lTmFtZSA9IHpvbmUudGFnTmFtZSB8fCAnJztcclxuICAgIHJldHVybiB0aGlzLnNlbGVjdGVkWm9uZXMuc29tZSh6ID0+XHJcbiAgICAgICh6LnRhZ05hbWU/LnRvTG93ZXJDYXNlKCkgPT09IHpvbmVOYW1lLnRvTG93ZXJDYXNlKCkpIHx8XHJcbiAgICAgICh6Lm5hbWU/LnRvTG93ZXJDYXNlKCkgPT09IHpvbmVOYW1lLnRvTG93ZXJDYXNlKCkpXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgYXJlQWxsRmlsdGVyZWRab25lc1NlbGVjdGVkKCk6IGJvb2xlYW4ge1xyXG4gICAgaWYgKHRoaXMuZmlsdGVyZWRab25lcy5sZW5ndGggPT09IDApIHJldHVybiBmYWxzZTtcclxuICAgIHJldHVybiB0aGlzLmZpbHRlcmVkWm9uZXMuZXZlcnkoem9uZSA9PiB0aGlzLmlzWm9uZVNlbGVjdGVkKHpvbmUpKTtcclxuICB9XHJcblxyXG4gIHRvZ2dsZVNlbGVjdEFsbChldmVudDogRXZlbnQpOiB2b2lkIHtcclxuICAgIGNvbnN0IGNoZWNrZWQgPSAoZXZlbnQudGFyZ2V0IGFzIEhUTUxJbnB1dEVsZW1lbnQpLmNoZWNrZWQ7XHJcbiAgICBcclxuICAgIGlmIChjaGVja2VkKSB7XHJcbiAgICAgIC8vIEZpcnN0LCBjb2xsZWN0IGFsbCB6b25lcyB0aGF0IGFyZSBhbHJlYWR5IHRhZ2dlZCB0byBvdGhlciBncm91cHNcclxuICAgICAgY29uc3QgY29uZmxpY3Rpbmdab25lczogYW55W10gPSBbXTtcclxuICAgICAgY29uc3QgdmFsaWRab25lczogYW55W10gPSBbXTtcclxuXHJcbiAgICAgIHRoaXMuZmlsdGVyZWRab25lcy5mb3JFYWNoKHpvbmUgPT4ge1xyXG4gICAgICAgIGNvbnN0IHpvbmVOYW1lID0gem9uZT8udGFnTmFtZT8udHJpbSgpO1xyXG4gICAgICAgIGlmICghem9uZU5hbWUpIHtcclxuICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIENoZWNrIGlmIHpvbmUgaXMgYWxyZWFkeSBzZWxlY3RlZFxyXG4gICAgICAgIGlmICh0aGlzLnNlbGVjdGVkWm9uZXMuc29tZSh6ID0+IHoudGFnTmFtZSA9PT0gem9uZU5hbWUpKSB7XHJcbiAgICAgICAgICByZXR1cm47IC8vIFNraXAgYWxyZWFkeSBzZWxlY3RlZCB6b25lc1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gQ2hlY2sgaWYgem9uZSBpcyBhbHJlYWR5IHRhZ2dlZCB0byBhbm90aGVyIGdyb3VwXHJcbiAgICAgICAgaWYgKHRoaXMuaXNab25lVGFnZ2VkVG9PdGhlckdyb3VwKHpvbmUpKSB7XHJcbiAgICAgICAgICBjb25mbGljdGluZ1pvbmVzLnB1c2goem9uZSk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIHZhbGlkWm9uZXMucHVzaCh6b25lKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG5cclxuICAgICAgLy8gSWYgdGhlcmUgYXJlIGNvbmZsaWN0aW5nIHpvbmVzLCBzaG93IHBvcHVwIG9uY2Ugd2l0aCB0aGUgZmlyc3QgY29uZmxpY3RcclxuICAgICAgaWYgKGNvbmZsaWN0aW5nWm9uZXMubGVuZ3RoID4gMCkge1xyXG4gICAgICAgIGNvbnN0IGZpcnN0Q29uZmxpY3QgPSBjb25mbGljdGluZ1pvbmVzWzBdO1xyXG4gICAgICAgIHRoaXMuc2hvd1pvbmVBbHJlYWR5VGFnZ2VkUG9wdXAoXHJcbiAgICAgICAgICBmaXJzdENvbmZsaWN0LnRhZ05hbWUsXHJcbiAgICAgICAgICBmaXJzdENvbmZsaWN0Lmdyb3VwTmFtZVxyXG4gICAgICAgICk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIC8vIEFkZCBvbmx5IHZhbGlkIHpvbmVzIChub3QgYWxyZWFkeSB0YWdnZWQgdG8gb3RoZXIgZ3JvdXBzKVxyXG4gICAgICB2YWxpZFpvbmVzLmZvckVhY2goem9uZSA9PiB7XHJcbiAgICAgICAgY29uc3Qgem9uZU5hbWUgPSB6b25lPy50YWdOYW1lPy50cmltKCk7XHJcbiAgICAgICAgaWYgKHpvbmVOYW1lICYmICF0aGlzLnNlbGVjdGVkWm9uZXMuc29tZSh6ID0+IHoudGFnTmFtZSA9PT0gem9uZU5hbWUpKSB7XHJcbiAgICAgICAgICB0aGlzLnNlbGVjdGVkWm9uZXMucHVzaCh7XHJcbiAgICAgICAgICAgIG5hbWU6IHpvbmVOYW1lLFxyXG4gICAgICAgICAgICB0YWdOYW1lOiB6b25lTmFtZVxyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIC8vIERlc2VsZWN0IGFsbCBmaWx0ZXJlZCB6b25lc1xyXG4gICAgICBjb25zdCBmaWx0ZXJlZFpvbmVOYW1lcyA9IHRoaXMuZmlsdGVyZWRab25lcy5tYXAoeiA9PiB6LnRhZ05hbWU/LnRvTG93ZXJDYXNlKCkpO1xyXG4gICAgICB0aGlzLnNlbGVjdGVkWm9uZXMgPSB0aGlzLnNlbGVjdGVkWm9uZXMuZmlsdGVyKFxyXG4gICAgICAgIHogPT4gIWZpbHRlcmVkWm9uZU5hbWVzLmluY2x1ZGVzKHoudGFnTmFtZT8udG9Mb3dlckNhc2UoKSlcclxuICAgICAgKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBTeW5jIHdpdGggZm9ybVxyXG4gICAgdGhpcy5jcmVhdGVab25lR3JvdXBGb3JtXHJcbiAgICAgIC5nZXQoJ3pvbmVzVGFnZ2VkJylcclxuICAgICAgPy5zZXRWYWx1ZSh0aGlzLnNlbGVjdGVkWm9uZXMsIHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcclxuICB9XHJcblxyXG4gIG9uQ2FuY2VsKCk6IHZvaWQge1xyXG4gICAgLy8gUmVzZXQgZm9ybSBzdGF0ZSB3aGVuIGNhbmNlbGluZ1xyXG4gICAgdGhpcy5jcmVhdGVab25lR3JvdXBGb3JtLnJlc2V0KCk7XHJcbiAgICB0aGlzLmNyZWF0ZVpvbmVHcm91cEZvcm0ubWFya0FzVW50b3VjaGVkKCk7XHJcbiAgICB0aGlzLmFjdGl2ZU1vZGFsLmNsb3NlKCk7XHJcbiAgfVxyXG5cclxuICBmb2N1c1pvbmVJbnB1dCgpOiB2b2lkIHtcclxuICAgIGlmICghdGhpcy56b25lSW5wdXRSZWYpIHJldHVybjtcclxuICAgIFxyXG4gICAgLy8gVG9nZ2xlIGRyb3Bkb3duOiBmaXJzdCBjbGljayBzaG93cywgc2Vjb25kIGNsaWNrIGNsb3Nlc1xyXG4gICAgdGhpcy5pc1RvZ2dsaW5nID0gdHJ1ZTtcclxuICAgIGlmICh0aGlzLnNob3dEcm9wZG93bikge1xyXG4gICAgICAvLyBJZiBkcm9wZG93biBpcyBvcGVuLCBjbG9zZSBpdFxyXG4gICAgICB0aGlzLnNob3dEcm9wZG93biA9IGZhbHNlO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgLy8gSWYgZHJvcGRvd24gaXMgY2xvc2VkLCBvcGVuIGl0IGFuZCBmb2N1cyBpbnB1dFxyXG4gICAgICB0aGlzLnpvbmVJbnB1dFJlZi5uYXRpdmVFbGVtZW50LmZvY3VzKCk7XHJcbiAgICAgIGNvbnN0IHZhbHVlID0gdGhpcy5jcmVhdGVab25lR3JvdXBGb3JtLmdldCgnem9uZU5hbWUnKT8udmFsdWUgfHwgJyc7XHJcbiAgICAgIGlmICh2YWx1ZSAmJiB2YWx1ZS50cmltKCkpIHtcclxuICAgICAgICB0aGlzLmZpbHRlclpvbmVzKHZhbHVlKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICB0aGlzLmZpbHRlclpvbmVzKCcnKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgLy8gUmVzZXQgZmxhZyBhZnRlciBhIHNob3J0IGRlbGF5IHRvIGFsbG93IGZvY3VzIGV2ZW50IHRvIGNvbXBsZXRlXHJcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgdGhpcy5pc1RvZ2dsaW5nID0gZmFsc2U7XHJcbiAgICB9LCAxMDApO1xyXG4gIH1cclxuXHJcbiAgQEhvc3RMaXN0ZW5lcignZG9jdW1lbnQ6Y2xpY2snLCBbJyRldmVudCddKVxyXG4gIG9uRG9jdW1lbnRDbGljayhldmVudDogTW91c2VFdmVudCk6IHZvaWQge1xyXG4gICAgLy8gQ2xvc2UgZHJvcGRvd24gaWYgY2xpY2tpbmcgb3V0c2lkZSB0aGUgem9uZXMtdGFnZ2VkLWNvbnRhaW5lclxyXG4gICAgY29uc3QgdGFyZ2V0ID0gZXZlbnQudGFyZ2V0IGFzIEhUTUxFbGVtZW50O1xyXG4gICAgY29uc3QgY29udGFpbmVyID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLnpvbmVzLXRhZ2dlZC1jb250YWluZXInKTtcclxuICAgIFxyXG4gICAgaWYgKGNvbnRhaW5lciAmJiAhY29udGFpbmVyLmNvbnRhaW5zKHRhcmdldCkpIHtcclxuICAgICAgdGhpcy5zaG93RHJvcGRvd24gPSBmYWxzZTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHRvZ2dsZVpvbmVTZWxlY3Rpb24oem9uZTogYW55LCBldmVudDogRXZlbnQpOiB2b2lkIHtcclxuICAgIGNvbnN0IGNoZWNrZWQgPSAoZXZlbnQudGFyZ2V0IGFzIEhUTUxJbnB1dEVsZW1lbnQpLmNoZWNrZWQ7XHJcbiAgICBjb25zdCB6b25lTmFtZSA9IHpvbmU/LnRhZ05hbWU/LnRyaW0oKTtcclxuXHJcbiAgICBpZiAoIXpvbmVOYW1lKSByZXR1cm47XHJcblxyXG4gICAgaWYgKGNoZWNrZWQpIHtcclxuICAgICAgLy8gQmxvY2sgc2VsZWN0aW9uIGlmIHpvbmUgaXMgYWxyZWFkeSB0YWdnZWQgdG8gYW5vdGhlciBncm91cFxyXG4gICAgICBpZiAodGhpcy5pc1pvbmVUYWdnZWRUb090aGVyR3JvdXAoem9uZSkpIHtcclxuICAgICAgICAoZXZlbnQudGFyZ2V0IGFzIEhUTUxJbnB1dEVsZW1lbnQpLmNoZWNrZWQgPSBmYWxzZTtcclxuICAgICAgICB0aGlzLnNob3dab25lQWxyZWFkeVRhZ2dlZFBvcHVwKHpvbmVOYW1lLCB6b25lLmdyb3VwTmFtZSk7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9XHJcblxyXG4gICAgICAvLyBBRERcclxuICAgICAgaWYgKCF0aGlzLnNlbGVjdGVkWm9uZXMuc29tZSh6ID0+IHoudGFnTmFtZSA9PT0gem9uZU5hbWUpKSB7XHJcbiAgICAgICAgdGhpcy5zZWxlY3RlZFpvbmVzLnB1c2goe1xyXG4gICAgICAgICAgbmFtZTogem9uZU5hbWUsXHJcbiAgICAgICAgICB0YWdOYW1lOiB6b25lTmFtZVxyXG4gICAgICAgIH0pO1xyXG4gICAgICB9XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICAvLyBSRU1PVkVcclxuICAgICAgdGhpcy5zZWxlY3RlZFpvbmVzID0gdGhpcy5zZWxlY3RlZFpvbmVzLmZpbHRlcihcclxuICAgICAgICB6ID0+IHoudGFnTmFtZSAhPT0gem9uZU5hbWVcclxuICAgICAgKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBTeW5jIHdpdGggZm9ybVxyXG4gICAgdGhpcy5jcmVhdGVab25lR3JvdXBGb3JtXHJcbiAgICAgIC5nZXQoJ3pvbmVzVGFnZ2VkJylcclxuICAgICAgPy5zZXRWYWx1ZSh0aGlzLnNlbGVjdGVkWm9uZXMsIHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIENoZWNrIGlmIHRoZSBnaXZlbiB6b25lIGlzIGFscmVhZHkgdGFnZ2VkIHRvIGFub3RoZXIgZ3JvdXAuXHJcbiAgICogV2hpbGUgY3JlYXRpbmcgYSBuZXcgZ3JvdXAsIGFueSBleGlzdGluZyBncm91cE5hbWUgb24gdGhlIHpvbmUgYmxvY2tzIHNlbGVjdGlvbi5cclxuICAgKiBXaGlsZSBlZGl0aW5nLCB3ZSBhbGxvdyB6b25lcyB0aGF0IGFscmVhZHkgYmVsb25nIHRvIHRoZSBzYW1lIGdyb3VwIGJ1dCBibG9jayBvdGhlcnMuXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBpc1pvbmVUYWdnZWRUb090aGVyR3JvdXAoem9uZTogYW55KTogYm9vbGVhbiB7XHJcbiAgICBjb25zdCBleGlzdGluZ0dyb3VwTmFtZSA9ICh6b25lPy5ncm91cE5hbWUgfHwgJycpLnRyaW0oKTtcclxuICAgIGlmICghZXhpc3RpbmdHcm91cE5hbWUpIHtcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IGN1cnJlbnRHcm91cE5hbWUgPSAodGhpcy5jcmVhdGVab25lR3JvdXBGb3JtLmdldCgnZ3JvdXBOYW1lJyk/LnZhbHVlIHx8ICcnKS50cmltKCk7XHJcbiAgICBjb25zdCBvcmlnaW5hbEdyb3VwTmFtZSA9ICh0aGlzLnpvbmVHcm91cERhdGE/Lmdyb3VwTmFtZSB8fCAnJykudHJpbSgpO1xyXG5cclxuICAgIC8vIElmIGNyZWF0aW5nIGEgbmV3IGdyb3VwLCBhbnkgZXhpc3RpbmcgbWFwcGluZyBzaG91bGQgYmxvY2tcclxuICAgIGlmICghdGhpcy5pc0VkaXRNb2RlKSB7XHJcbiAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIEluIGVkaXQgbW9kZSwgYWxsb3cgem9uZXMgdGhhdCBhcmUgYWxyZWFkeSBtYXBwZWQgdG8gdGhpcyBzYW1lIGdyb3VwXHJcbiAgICBpZiAob3JpZ2luYWxHcm91cE5hbWUgJiZcclxuICAgICAgZXhpc3RpbmdHcm91cE5hbWUudG9Mb3dlckNhc2UoKSA9PT0gb3JpZ2luYWxHcm91cE5hbWUudG9Mb3dlckNhc2UoKSkge1xyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gT3RoZXJ3aXNlLCBpdCdzIG1hcHBlZCB0byBzb21lIG90aGVyIGdyb3VwIGFuZCBzaG91bGQgYmUgYmxvY2tlZFxyXG4gICAgLy8gKGV2ZW4gaWYgY3VycmVudEdyb3VwTmFtZSB3YXMgY2hhbmdlZCB3aGlsZSBlZGl0aW5nKVxyXG4gICAgcmV0dXJuIHRydWU7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBTaG93IHBvcHVwIHdoZW4gdXNlciB0cmllcyB0byBtYXAgYSB6b25lIHRoYXQgaXMgYWxyZWFkeSB0YWdnZWQgdG8gYW5vdGhlciBncm91cC5cclxuICAgKi9cclxuICBwcml2YXRlIHNob3dab25lQWxyZWFkeVRhZ2dlZFBvcHVwKHpvbmVOYW1lOiBzdHJpbmcsIGdyb3VwTmFtZTogc3RyaW5nKTogdm9pZCB7XHJcbiAgICB0aGlzLmNvbmZsaWN0Wm9uZU5hbWUgPSB6b25lTmFtZSB8fCAnJztcclxuICAgIHRoaXMuY29uZmxpY3RHcm91cE5hbWUgPSBncm91cE5hbWUgfHwgJyc7XHJcblxyXG4gICAgaWYgKHRoaXMuem9uZVRhZ2dlZE1vZGFsKSB7XHJcbiAgICAgIHRoaXMuem9uZVRhZ2dlZE1vZGFsUmVmID0gdGhpcy5tb2RhbFNlcnZpY2Uub3Blbih0aGlzLnpvbmVUYWdnZWRNb2RhbCwge1xyXG4gICAgICAgIHNpemU6ICdtZCcsXHJcbiAgICAgICAgY2VudGVyZWQ6IHRydWUsXHJcbiAgICAgICAgYmFja2Ryb3A6ICdzdGF0aWMnXHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgb25DbG9zZVpvbmVUYWdnZWRNb2RhbCgpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLnpvbmVUYWdnZWRNb2RhbFJlZikge1xyXG4gICAgICB0aGlzLnpvbmVUYWdnZWRNb2RhbFJlZi5jbG9zZSgpO1xyXG4gICAgICB0aGlzLnpvbmVUYWdnZWRNb2RhbFJlZiA9IG51bGw7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBvbkNyZWF0ZSgpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLmNyZWF0ZVpvbmVHcm91cEZvcm0uaW52YWxpZCkge1xyXG4gICAgICB0aGlzLmNyZWF0ZVpvbmVHcm91cEZvcm0ubWFya0FsbEFzVG91Y2hlZCgpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgZm9ybVZhbHVlID0gdGhpcy5jcmVhdGVab25lR3JvdXBGb3JtLnZhbHVlO1xyXG4gICAgXHJcbiAgICAvLyBWYWxpZGF0ZSBncm91cE5hbWUgcGF0dGVyblxyXG4gICAgbGV0IHBhdHRlcm4gPSAvXlthLXpBLVowLTlcXHNcXC9dKiQvO1xyXG4gICAgaWYgKCFmb3JtVmFsdWUuZ3JvdXBOYW1lLm1hdGNoKHBhdHRlcm4pKSB7XHJcbiAgICAgIHRoaXMudG9hc3RTZXJ2aWNlLmdldEVycm9yVG9hc3QoJ1NwZWNpYWwgY2hhcmFjdGVycyBhcmUgbm90IGFsbG93ZWQnKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgXHJcbiAgICBjb25zdCBwYXlsb2FkOiBhbnkgPSB7XHJcbiAgICAgIGNsaWVudElkOiB0aGlzLmNsaWVudElkLFxyXG4gICAgICBncm91cE5hbWU6IGZvcm1WYWx1ZS5ncm91cE5hbWUudHJpbSgpLFxyXG4gICAgICB6b25lc1RhZ2dlZDogdGhpcy5zZWxlY3RlZFpvbmVzLm1hcCh6b25lID0+IHpvbmUudGFnTmFtZSksXHJcbiAgICAgIHByb2R1Y3ROYW1lOiAndGFuZ29ab25lJyxcclxuICAgIH07XHJcblxyXG4gICAgLy8gSWYgaW4gZWRpdCBtb2RlLCBpbmNsdWRlIHRoZSBvbGQgZ3JvdXAgbmFtZSBmb3IgdXBkYXRlXHJcbiAgICBpZiAodGhpcy5pc0VkaXRNb2RlICYmIHRoaXMuem9uZUdyb3VwRGF0YSkge1xyXG4gICAgICBjb25zdCBvbGRHcm91cE5hbWUgPSB0aGlzLnpvbmVHcm91cERhdGEuZ3JvdXBOYW1lO1xyXG4gICAgICBwYXlsb2FkLl9pZCA9IHRoaXMuem9uZUdyb3VwRGF0YT8uX2lkO1xyXG4gICAgICBpZiAob2xkR3JvdXBOYW1lICYmIG9sZEdyb3VwTmFtZSAhPT0gZm9ybVZhbHVlLmdyb3VwTmFtZSkge1xyXG4gICAgICAgIHBheWxvYWQub2xkR3JvdXBOYW1lID0gb2xkR3JvdXBOYW1lO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgbWVzc2FnZSA9IHRoaXMuaXNFZGl0TW9kZSA/ICdab25lIGdyb3VwIHVwZGF0ZWQgc3VjY2Vzc2Z1bGx5JyA6ICdab25lIGdyb3VwIGNyZWF0ZWQgc3VjY2Vzc2Z1bGx5JztcclxuICAgIGNvbnN0IGVycm9yTXNnID0gdGhpcy5pc0VkaXRNb2RlID8gJ0ZhaWxlZCB0byB1cGRhdGUgem9uZSBncm91cCcgOiAnRmFpbGVkIHRvIGNyZWF0ZSB6b25lIGdyb3VwJztcclxuICAgIGNvbnN0IHJlc3VsdFR5cGUgPSB0aGlzLmlzRWRpdE1vZGUgPyAndXBkYXRlZCcgOiAnY3JlYXRlZCc7XHJcblxyXG4gICAgaWYgKCF0aGlzLmlzRWRpdE1vZGUpIHtcclxuICAgICAgdGhpcy5jbGllbnRBcGlTZXJ2aWNlLmFkZFpvbmVHcm91cChwYXlsb2FkKS5waXBlKFxyXG4gICAgICAgIHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKVxyXG4gICAgICApLnN1YnNjcmliZSh7XHJcbiAgICAgICAgbmV4dDogKHJlczogYW55KSA9PiB7XHJcbiAgICAgICAgICBpZiAocmVzICYmIHJlcy5jb2RlID09PSAyMDApIHtcclxuICAgICAgICAgICAgdGhpcy50b2FzdFNlcnZpY2UuZ2V0U3VjY2Vzc1RvYXN0KG1lc3NhZ2UpO1xyXG4gICAgICAgICAgICB0aGlzLmFjdGl2ZU1vZGFsLmNsb3NlKHtcclxuICAgICAgICAgICAgICB0eXBlOiByZXN1bHRUeXBlLFxyXG4gICAgICAgICAgICAgIGRhdGE6IHJlcy5kYXRhXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICBpZiAodGhpcy5pc0VkaXRNb2RlKSB7XHJcbiAgICAgICAgICAgICAgdGhpcy5pc0VkaXRNb2RlID0gZmFsc2U7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMudG9hc3RTZXJ2aWNlLmdldEVycm9yVG9hc3QocmVzLm1lc3NhZ2UgfHwgZXJyb3JNc2cpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgZXJyb3I6IChlcnI6IGFueSkgPT4ge1xyXG4gICAgICAgICAgdGhpcy50b2FzdFNlcnZpY2UuZ2V0RXJyb3JUb2FzdChlcnIuZXJyb3I/LmVycm9yIHx8IGVycm9yTXNnKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gICAgfSBlbHNlIGlmICh0aGlzLmlzRWRpdE1vZGUpIHtcclxuICAgICAgdGhpcy5jbGllbnRBcGlTZXJ2aWNlLnVwZGF0ZVpvbmVHcm91cChwYXlsb2FkKS5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSkuc3Vic2NyaWJlKHtcclxuICAgICAgICBuZXh0OiAocmVzOiBhbnkpID0+IHtcclxuICAgICAgICAgIGlmIChyZXMgJiYgcmVzLmNvZGUgPT09IDIwMCkge1xyXG4gICAgICAgICAgICB0aGlzLnRvYXN0U2VydmljZS5nZXRTdWNjZXNzVG9hc3QobWVzc2FnZSk7XHJcbiAgICAgICAgICAgIHRoaXMuYWN0aXZlTW9kYWwuY2xvc2Uoe1xyXG4gICAgICAgICAgICAgIHR5cGU6IHJlc3VsdFR5cGUsXHJcbiAgICAgICAgICAgICAgZGF0YTogcmVzLmRhdGFcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLmlzRWRpdE1vZGUpIHtcclxuICAgICAgICAgICAgICB0aGlzLmlzRWRpdE1vZGUgPSBmYWxzZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy50b2FzdFNlcnZpY2UuZ2V0RXJyb3JUb2FzdChyZXMubWVzc2FnZSB8fCBlcnJvck1zZyk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSxcclxuICAgICAgICBlcnJvcjogKGVycjogYW55KSA9PiB7XHJcbiAgICAgICAgICB0aGlzLnRvYXN0U2VydmljZS5nZXRFcnJvclRvYXN0KGVyci5lcnJvcj8uZXJyb3IgfHwgZXJyb3JNc2cpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgfVxyXG59XHJcblxyXG4iLCI8ZGl2IGNsYXNzPVwiY3JlYXRlLXpvbmUtZ3JvdXAtbW9kYWxcIj5cclxuICA8Zm9ybSBbZm9ybUdyb3VwXT1cImNyZWF0ZVpvbmVHcm91cEZvcm1cIiBhdXRvY29tcGxldGU9XCJvZmZcIj5cclxuICAgIDwhLS0gSGVhZGVyIC0tPlxyXG4gICAgPGRpdiBjbGFzcz1cIm1vZGFsLWhlYWRlci1jdXN0b20gbWItNFwiPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGFsaWduLWl0ZW1zLWNlbnRlclwiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJoZWFkZXItaWNvbiBtZS0zXCI+XHJcbiAgICAgICAgICA8c3ZnICpuZ0lmPVwiIWlzRWRpdE1vZGVcIiB3aWR0aD1cIjI0XCIgaGVpZ2h0PVwiMjRcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgZmlsbD1cIm5vbmVcIlxyXG4gICAgICAgICAgICB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCI+XHJcbiAgICAgICAgICAgIDxjaXJjbGUgY3g9XCIxMlwiIGN5PVwiMTJcIiByPVwiMTBcIiBmaWxsPVwiIzAwQTNGRlwiIC8+XHJcbiAgICAgICAgICAgIDxwYXRoIGQ9XCJNMTIgOFYxNk04IDEySDE2XCIgc3Ryb2tlPVwid2hpdGVcIiBzdHJva2Utd2lkdGg9XCIyXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cclxuICAgICAgICAgIDwvc3ZnPlxyXG4gICAgICAgICAgPHN2ZyAqbmdJZj1cImlzRWRpdE1vZGVcIiB3aWR0aD1cIjU2XCIgaGVpZ2h0PVwiNTZcIiB2aWV3Qm94PVwiMCAwIDU2IDU2XCIgZmlsbD1cIm5vbmVcIlxyXG4gICAgICAgICAgICB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCI+XHJcbiAgICAgICAgICAgIDxyZWN0IHg9XCI0XCIgeT1cIjRcIiB3aWR0aD1cIjQ4XCIgaGVpZ2h0PVwiNDhcIiByeD1cIjI0XCIgZmlsbD1cIiNEQUYxRkZcIiAvPlxyXG4gICAgICAgICAgICA8cmVjdCB4PVwiNFwiIHk9XCI0XCIgd2lkdGg9XCI0OFwiIGhlaWdodD1cIjQ4XCIgcng9XCIyNFwiIHN0cm9rZT1cIiNFQUY4RkZcIiBzdHJva2Utd2lkdGg9XCI4XCIgLz5cclxuICAgICAgICAgICAgPHBhdGhcclxuICAgICAgICAgICAgICBkPVwiTTI3IDIwLjAwMDJIMjBDMTkuNDY5NiAyMC4wMDAyIDE4Ljk2MDkgMjAuMjEwOSAxOC41ODU4IDIwLjU4NkMxOC4yMTA3IDIwLjk2MTEgMTggMjEuNDY5OCAxOCAyMi4wMDAyVjM2LjAwMDJDMTggMzYuNTMwNyAxOC4yMTA3IDM3LjAzOTQgMTguNTg1OCAzNy40MTQ0QzE4Ljk2MDkgMzcuNzg5NSAxOS40Njk2IDM4LjAwMDIgMjAgMzguMDAwMkgzNEMzNC41MzA0IDM4LjAwMDIgMzUuMDM5MSAzNy43ODk1IDM1LjQxNDIgMzcuNDE0NEMzNS43ODkzIDM3LjAzOTQgMzYgMzYuNTMwNyAzNiAzNi4wMDAyVjI5LjAwMDJNMzQuNSAxOC41MDAyQzM0Ljg5NzggMTguMTAyNCAzNS40Mzc0IDE3Ljg3ODkgMzYgMTcuODc4OUMzNi41NjI2IDE3Ljg3ODkgMzcuMTAyMiAxOC4xMDI0IDM3LjUgMTguNTAwMkMzNy44OTc4IDE4Ljg5ODEgMzguMTIxMyAxOS40Mzc2IDM4LjEyMTMgMjAuMDAwMkMzOC4xMjEzIDIwLjU2MjggMzcuODk3OCAyMS4xMDI0IDM3LjUgMjEuNTAwMkwyOCAzMS4wMDAyTDI0IDMyLjAwMDJMMjUgMjguMDAwMkwzNC41IDE4LjUwMDJaXCJcclxuICAgICAgICAgICAgICBzdHJva2U9XCIjMDBBM0ZGXCIgc3Ryb2tlLXdpZHRoPVwiMlwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XHJcbiAgICAgICAgICA8L3N2Zz5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8aDQgY2xhc3M9XCJtb2RhbC10aXRsZSBtYi0wXCI+e3sgaXNFZGl0TW9kZSA/ICdFZGl0JyA6ICdDcmVhdGUnIH19PC9oND5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuXHJcbiAgICA8IS0tIFpvbmUgR3JvdXAgTmFtZSBJbnB1dCAtLT5cclxuICAgIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwIG1iLTRcIj5cclxuICAgICAgPCEtLSA8c3BhbiBjbGFzcz1cInRleHQtZGFuZ2VyXCI+Kjwvc3Bhbj4gLS0+XHJcbiAgICAgIDxsYWJlbCBmb3I9XCJncm91cE5hbWVcIiBjbGFzcz1cImZvcm0tbGFiZWxcIj5ab25lIEdyb3VwIE5hbWU8L2xhYmVsPlxyXG4gICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBjbGFzcz1cImZvcm0tY29udHJvbFwiIGlkPVwiZ3JvdXBOYW1lXCIgZm9ybUNvbnRyb2xOYW1lPVwiZ3JvdXBOYW1lXCJcclxuICAgICAgICBwbGFjZWhvbGRlcj1cIkVudGVyIHpvbmUgZ3JvdXAgbmFtZVwiIGF1dG9jb21wbGV0ZT1cIm9mZlwiXHJcbiAgICAgICAgW2NsYXNzLmlzLWludmFsaWRdPVwiY3JlYXRlWm9uZUdyb3VwRm9ybS5nZXQoJ2dyb3VwTmFtZScpPy5pbnZhbGlkICYmIGNyZWF0ZVpvbmVHcm91cEZvcm0uZ2V0KCdncm91cE5hbWUnKT8udG91Y2hlZCAmJiAhY3JlYXRlWm9uZUdyb3VwRm9ybS5nZXQoJ2dyb3VwTmFtZScpPy5wcmlzdGluZVwiPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwiaW52YWxpZC1mZWVkYmFja1wiXHJcbiAgICAgICAgKm5nSWY9XCJjcmVhdGVab25lR3JvdXBGb3JtLmdldCgnZ3JvdXBOYW1lJyk/LmludmFsaWQgJiYgY3JlYXRlWm9uZUdyb3VwRm9ybS5nZXQoJ2dyb3VwTmFtZScpPy50b3VjaGVkICYmICFjcmVhdGVab25lR3JvdXBGb3JtLmdldCgnZ3JvdXBOYW1lJyk/LnByaXN0aW5lXCI+XHJcbiAgICAgICAgPHNwYW4gKm5nSWY9XCJjcmVhdGVab25lR3JvdXBGb3JtLmdldCgnZ3JvdXBOYW1lJyk/LmVycm9ycz8uWydyZXF1aXJlZCddXCI+R3JvdXBOYW1lIGlzIHJlcXVpcmVkPC9zcGFuPlxyXG4gICAgICAgIDxzcGFuICpuZ0lmPVwiY3JlYXRlWm9uZUdyb3VwRm9ybS5nZXQoJ2dyb3VwTmFtZScpPy5lcnJvcnM/LlsnbWlubGVuZ3RoJ11cIj5Hcm91cE5hbWUgbXVzdCBiZSBhdCBsZWFzdCAxXHJcbiAgICAgICAgICBjaGFyYWN0ZXJzPC9zcGFuPlxyXG4gICAgICAgIDxzcGFuICpuZ0lmPVwiY3JlYXRlWm9uZUdyb3VwRm9ybS5nZXQoJ2dyb3VwTmFtZScpPy5lcnJvcnM/LlsncGF0dGVybiddXCI+XHJcbiAgICAgICAgICBTcGVjaWFsIGNoYXJhY3RlcnMgYXJlIG5vdCBhbGxvd2VkXHJcbiAgICAgICAgPC9zcGFuPlxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG5cclxuICAgIDwhLS0gWm9uZXMgVGFnZ2VkIElucHV0IC0tPlxyXG4gICAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXAgbWItNFwiPlxyXG4gICAgICA8bGFiZWwgZm9yPVwiem9uZXNUYWdnZWRcIiBjbGFzcz1cImZvcm0tbGFiZWxcIiAobW91c2Vkb3duKT1cIiRldmVudC5wcmV2ZW50RGVmYXVsdCgpXCJcclxuICAgICAgICAoY2xpY2spPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXCI+Wm9uZXMgVGFnZ2VkPC9sYWJlbD5cclxuICAgICAgPGRpdiBjbGFzcz1cInpvbmVzLXRhZ2dlZC1jb250YWluZXJcIiBbY2xhc3MuaGFzLWRyb3Bkb3duXT1cInNob3dEcm9wZG93blwiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJ6b25lcy1pbnB1dC13cmFwcGVyXCIgW2NsYXNzLmhhcy10YWdzXT1cInNlbGVjdGVkWm9uZXMubGVuZ3RoID4gMFwiIChjbGljayk9XCJmb2N1c1pvbmVJbnB1dCgpXCI+XHJcbiAgICAgICAgICA8IS0tIFNlbGVjdGVkIFpvbmUgVGFncyAtLT5cclxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IHpvbmUgb2Ygc2VsZWN0ZWRab25lczsgbGV0IGkgPSBpbmRleFwiPlxyXG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cInpvbmUtdGFnXCI+XHJcbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ6b25lLXRhZy1uYW1lXCI+e3sgem9uZS50YWdOYW1lIH19PC9zcGFuPlxyXG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiem9uZS10YWctcmVtb3ZlXCIgKGNsaWNrKT1cInJlbW92ZVpvbmUoaSlcIj5cclxuICAgICAgICAgICAgICAgIDxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHdpZHRoPVwiMTJcIiBoZWlnaHQ9XCIxMlwiIHZpZXdCb3g9XCIwIDAgMTIgMTJcIiBmaWxsPVwibm9uZVwiPlxyXG4gICAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTkgM0wzIDlNMyAzTDkgOVwiIHN0cm9rZT1cIiM2NjcwODVcIiBzdHJva2Utd2lkdGg9XCIxLjVcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCJcclxuICAgICAgICAgICAgICAgICAgICBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XHJcbiAgICAgICAgICAgICAgICA8L3N2Zz5cclxuICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG5cclxuICAgICAgICAgIDwhLS0gSW5wdXQgRmllbGQgLS0+XHJcbiAgICAgICAgICA8aW5wdXQgI3pvbmVJbnB1dCB0eXBlPVwidGV4dFwiIGNsYXNzPVwiem9uZXMtaW5wdXRcIiBpZD1cInpvbmVzVGFnZ2VkXCIgZm9ybUNvbnRyb2xOYW1lPVwiem9uZU5hbWVcIlxyXG4gICAgICAgICAgICAoa2V5ZG93bik9XCJvbktleURvd24oJGV2ZW50KVwiIChmb2N1cyk9XCJvbklucHV0Rm9jdXMoKVwiIChibHVyKT1cIm9uSW5wdXRCbHVyKClcIiBhdXRvY29tcGxldGU9XCJvZmZcIlxyXG4gICAgICAgICAgICBbZGlzYWJsZWRdPVwiem9uZXNOb3RBdmFpbGFibGUgJiYgYXZhaWxhYmxlWm9uZXMubGVuZ3RoID09PSAwXCI+XHJcbiAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgIDwhLS0gQXV0b2NvbXBsZXRlIERyb3Bkb3duIChzaG93biB3aGVuIHR5cGluZyBhbmQgbWF0Y2hlcyBmb3VuZCkgLS0+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImF1dG9jb21wbGV0ZS1kcm9wZG93blwiICpuZ0lmPVwic2hvd0Ryb3Bkb3duICYmIGZpbHRlcmVkWm9uZXMubGVuZ3RoID4gMFwiPlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cInpvbmVzLWxpc3RcIj5cclxuICAgICAgICAgICAgPCEtLSBTZWxlY3QgQWxsIE9wdGlvbiAtLT5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tY2hlY2sgZC1mbGV4IGFsaWduLWl0ZW1zLWNlbnRlciBwdC0zIHB4LTUgc2VsZWN0LWFsbC1vcHRpb25cIiAobW91c2Vkb3duKT1cIiRldmVudC5wcmV2ZW50RGVmYXVsdCgpXCI+XHJcbiAgICAgICAgICAgICAgPGlucHV0IGNsYXNzPVwiZm9ybS1jaGVjay1pbnB1dFwiIHR5cGU9XCJjaGVja2JveFwiIFtjaGVja2VkXT1cImFyZUFsbEZpbHRlcmVkWm9uZXNTZWxlY3RlZCgpXCJcclxuICAgICAgICAgICAgICAgIChjbGljayk9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIiAoY2hhbmdlKT1cInRvZ2dsZVNlbGVjdEFsbCgkZXZlbnQpXCIgaWQ9XCJzZWxlY3RBbGxab25lc1wiPlxyXG4gICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImZvcm0tY2hlY2stbGFiZWwgcHgtM1wiIGZvcj1cInNlbGVjdEFsbFpvbmVzXCI+XHJcbiAgICAgICAgICAgICAgICBTZWxlY3QgQWxsXHJcbiAgICAgICAgICAgICAgPC9sYWJlbD5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJib3JkZXIgYm9yZGVyLWdyYXkgbXQtM1wiPjwvZGl2PlxyXG4gICAgICAgICAgICA8IS0tIFpvbmUgT3B0aW9ucyAtLT5cclxuICAgICAgICAgICAgPGRpdiAqbmdGb3I9XCJsZXQgem9uZSBvZiBmaWx0ZXJlZFpvbmVzXCIgY2xhc3M9XCJmb3JtLWNoZWNrIGQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXIgcHktMyBweC01IHpvbmUtb3B0aW9uXCJcclxuICAgICAgICAgICAgICAobW91c2Vkb3duKT1cIiRldmVudC5wcmV2ZW50RGVmYXVsdCgpXCI+XHJcbiAgICAgICAgICAgICAgPGlucHV0IGNsYXNzPVwiZm9ybS1jaGVjay1pbnB1dCBjdXJzb3ItcG9pbnRlclwiIHR5cGU9XCJjaGVja2JveFwiIFtjaGVja2VkXT1cImlzWm9uZVNlbGVjdGVkKHpvbmUpXCJcclxuICAgICAgICAgICAgICAgIChjbGljayk9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIiAoY2hhbmdlKT1cInRvZ2dsZVpvbmVTZWxlY3Rpb24oem9uZSwgJGV2ZW50KVwiIFtpZF09XCInem9uZS0nICsgem9uZS50YWdOYW1lXCI+XHJcbiAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZm9ybS1jaGVjay1sYWJlbCBweC0zIGN1cnNvci1wb2ludGVyXCIgW2Zvcl09XCInem9uZS0nICsgem9uZS50YWdOYW1lXCI+XHJcbiAgICAgICAgICAgICAgICB7eyB6b25lLnRhZ05hbWUgfX1cclxuICAgICAgICAgICAgICA8L2xhYmVsPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG5cclxuICAgIDwhLS0gQWN0aW9uIEJ1dHRvbnMgLS0+XHJcbiAgICA8ZGl2IGNsYXNzPVwibW9kYWwtZm9vdGVyLWN1c3RvbSBtdC00XCI+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXggZ2FwLTMganVzdGlmeS1jb250ZW50LWVuZFwiPlxyXG4gICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuIGJ0bi1vdXRsaW5lXCIgKGNsaWNrKT1cIm9uQ2FuY2VsKClcIj5DYW5jZWw8L2J1dHRvbj5cclxuICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0biBidG4tcHJpbWFyeVwiIChjbGljayk9XCJvbkNyZWF0ZSgpXCIgW2Rpc2FibGVkXT1cImNyZWF0ZVpvbmVHcm91cEZvcm0uaW52YWxpZFwiPlxyXG4gICAgICAgICAge3sgaXNFZGl0TW9kZSA/ICdVcGRhdGUnIDogJ0NyZWF0ZScgfX1cclxuICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuICA8L2Zvcm0+XHJcbjwvZGl2PlxyXG5cclxuPCEtLSBab25lIEFscmVhZHkgVGFnZ2VkIE1vZGFsIC0tPlxyXG48bmctdGVtcGxhdGUgI3pvbmVUYWdnZWRNb2RhbCBsZXQtbW9kYWw+XHJcbiAgPCEtLSA8ZGl2IGNsYXNzPVwibW9kYWwtaGVhZGVyIGJvcmRlci0wIHBiLTBcIj5cclxuICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuLWNsb3NlXCIgYXJpYS1sYWJlbD1cIkNsb3NlXCIgKGNsaWNrKT1cIm9uQ2xvc2Vab25lVGFnZ2VkTW9kYWwoKVwiPjwvYnV0dG9uPlxyXG4gIDwvZGl2PiAtLT5cclxuICA8ZGl2IGNsYXNzPVwibW9kYWwtYm9keSBkZWxldGUtem9uZS1tb2RhbC1ib2R5XCIgc3R5bGU9XCJib3R0b206IDEzcHg7XCI+XHJcbiAgICA8ZGl2IGNsYXNzPVwiZGVsZXRlLXpvbmUtaWNvbiBtYi00XCI+XHJcbiAgICAgIDxzdmcgd2lkdGg9XCI1NlwiIGhlaWdodD1cIjU2XCIgdmlld0JveD1cIjAgMCA1NiA1NlwiIGZpbGw9XCJub25lXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPlxyXG4gICAgICAgIDxyZWN0IHg9XCI0XCIgeT1cIjRcIiB3aWR0aD1cIjQ4XCIgaGVpZ2h0PVwiNDhcIiByeD1cIjI0XCIgZmlsbD1cIiNGRUYwQzdcIiAvPlxyXG4gICAgICAgIDxyZWN0IHg9XCI0XCIgeT1cIjRcIiB3aWR0aD1cIjQ4XCIgaGVpZ2h0PVwiNDhcIiByeD1cIjI0XCIgc3Ryb2tlPVwiI0ZGRkFFQlwiIHN0cm9rZS13aWR0aD1cIjhcIiAvPlxyXG4gICAgICAgIDxwYXRoXHJcbiAgICAgICAgICBkPVwiTTI3Ljk5ODggMjQuMDAwMlYyOC4wMDAyTTI3Ljk5ODggMzIuMDAwMkgyOC4wMDg4TTI2LjI4ODggMTguODYwMkwxNy44MTg4IDMzLjAwMDJDMTcuNjQ0MiAzMy4zMDI2IDE3LjU1MTggMzMuNjQ1NSAxNy41NTA4IDMzLjk5NDdDMTcuNTQ5OCAzNC4zNDM5IDE3LjY0MDMgMzQuNjg3MyAxNy44MTMyIDM0Ljk5MDdDMTcuOTg2MiAzNS4yOTQxIDE4LjIzNTUgMzUuNTQ3IDE4LjUzNjUgMzUuNzI0MUMxOC44Mzc1IDM1LjkwMTIgMTkuMTc5NiAzNS45OTY0IDE5LjUyODggMzYuMDAwMkgzNi40Njg4QzM2LjgxOCAzNS45OTY0IDM3LjE2MDEgMzUuOTAxMiAzNy40NjExIDM1LjcyNDFDMzcuNzYyMSAzNS41NDcgMzguMDExNCAzNS4yOTQxIDM4LjE4NDQgMzQuOTkwN0MzOC4zNTczIDM0LjY4NzMgMzguNDQ3OCAzNC4zNDM5IDM4LjQ0NjggMzMuOTk0N0MzOC40NDU4IDMzLjY0NTUgMzguMzUzNCAzMy4zMDI2IDM4LjE3ODggMzMuMDAwMkwyOS43MDg4IDE4Ljg2MDJDMjkuNTMwNSAxOC41NjYzIDI5LjI3OTUgMTguMzIzMyAyOC45OCAxOC4xNTQ3QzI4LjY4MDUgMTcuOTg2MSAyOC4zNDI1IDE3Ljg5NzUgMjcuOTk4OCAxNy44OTc1QzI3LjY1NTEgMTcuODk3NSAyNy4zMTcxIDE3Ljk4NjEgMjcuMDE3NiAxOC4xNTQ3QzI2LjcxODEgMTguMzIzMyAyNi40NjcxIDE4LjU2NjMgMjYuMjg4OCAxOC44NjAyWlwiXHJcbiAgICAgICAgICBzdHJva2U9XCIjREM2ODAzXCIgc3Ryb2tlLXdpZHRoPVwiMlwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XHJcbiAgICAgIDwvc3ZnPlxyXG4gICAgPC9kaXY+XHJcblxyXG4gICAgPGg0IGNsYXNzPVwiZGVsZXRlLXpvbmUtdGl0bGUgbWItM1wiPlxyXG4gICAgICBab25lIEFscmVhZHkgVGFnZ2VkXHJcbiAgICA8L2g0PlxyXG5cclxuICAgIDxwIGNsYXNzPVwiZGVsZXRlLXpvbmUtZGVzY3JpcHRpb24gdGV4dC1jZW50ZXIgbWItNFwiPlxyXG4gICAgICBUaGUgc2VsZWN0ZWQgem9uZSA8c3BhbiBjbGFzcz1cImRlbGV0ZS16b25lLW5hbWVcIj57eyBjb25mbGljdFpvbmVOYW1lIHx8ICdab25lIE5hbWUnIH19PC9zcGFuPlxyXG4gICAgICBpcyBhbHJlYWR5IHRhZ2dlZCB0byBhbm90aGVyIGdyb3VwXHJcbiAgICAgIDxzcGFuIGNsYXNzPVwiZGVsZXRlLXpvbmUtbmFtZVwiPnt7IGNvbmZsaWN0R3JvdXBOYW1lIHx8ICdHcm91cCBOYW1lJyB9fTwvc3Bhbj4uXHJcbiAgICAgIElmIHlvdSB3YW50IHRvIGFkZCB0aGlzIHRvIHRoZSBncm91cCwgeW91IG5lZWQgdG8gcmVtb3ZlIHRoZSB6b25lIGZyb20gdGhlIG90aGVyIGdyb3VwLlxyXG4gICAgPC9wPlxyXG5cclxuICAgIDxkaXYgY2xhc3M9XCJtb2RhbC1mb290ZXItY3VzdG9tIG10LTRcIj5cclxuICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBnYXAtMyBqdXN0aWZ5LWNvbnRlbnQtY2VudGVyXCI+XHJcbiAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4gYnRuLXByaW1hcnlcIiAoY2xpY2spPVwib25DbG9zZVpvbmVUYWdnZWRNb2RhbCgpXCI+T2theTwvYnV0dG9uPlxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG4gIDwvZGl2PlxyXG48L25nLXRlbXBsYXRlPiJdfQ==
|