@smarterplan/ngx-smarterplan-locations 0.2.40 → 0.2.42
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/esm2020/lib/components/visits/visits.component.mjs +3 -3
- package/esm2020/lib/components/zones/add-zone/add-zone.component.mjs +6 -7
- package/esm2020/lib/components/zones/zones.component.mjs +3 -3
- package/fesm2015/smarterplan-ngx-smarterplan-locations.mjs +9 -10
- package/fesm2015/smarterplan-ngx-smarterplan-locations.mjs.map +1 -1
- package/fesm2020/smarterplan-ngx-smarterplan-locations.mjs +9 -10
- package/fesm2020/smarterplan-ngx-smarterplan-locations.mjs.map +1 -1
- package/package.json +2 -2
|
@@ -94,12 +94,8 @@ export class AddZoneComponent {
|
|
|
94
94
|
formValue.layerID = layer.id;
|
|
95
95
|
});
|
|
96
96
|
}
|
|
97
|
-
if (!formValue.code_ref) {
|
|
98
|
-
formValue.code_ref = null;
|
|
99
|
-
}
|
|
100
97
|
const zoneInput = {
|
|
101
98
|
name: formValue.name,
|
|
102
|
-
code_ref: formValue.code_ref,
|
|
103
99
|
surface: Math.round(formValue.surface * 100) / 100,
|
|
104
100
|
spaceID: this.spaceID,
|
|
105
101
|
layerID: formValue.layerID,
|
|
@@ -109,6 +105,9 @@ export class AddZoneComponent {
|
|
|
109
105
|
sweepIDs: [],
|
|
110
106
|
startSweepID: formValue.startSweepID,
|
|
111
107
|
};
|
|
108
|
+
if (formValue.code_ref) {
|
|
109
|
+
zoneInput.code_ref = formValue.code_ref;
|
|
110
|
+
}
|
|
112
111
|
try {
|
|
113
112
|
this.zoneForm = null;
|
|
114
113
|
this.isSubmitted = false;
|
|
@@ -288,10 +287,10 @@ export class AddZoneComponent {
|
|
|
288
287
|
}
|
|
289
288
|
}
|
|
290
289
|
AddZoneComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.2.7", ngImport: i0, type: AddZoneComponent, deps: [{ token: i1.FormBuilder }, { token: i2.ZoneService }, { token: i2.LayerService }, { token: i2.BaseUserService }, { token: i2.NavigationService }], target: i0.ɵɵFactoryTarget.Component });
|
|
291
|
-
AddZoneComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.2.7", type: AddZoneComponent, selector: "lib-add-zone", inputs: { zoneEdit: "zoneEdit", spaceID: "spaceID", images360: "images360", navigationIDs: "navigationIDs", zones: "zones", newZoneDataFromEditor: "newZoneDataFromEditor", chosenPlan: "chosenPlan", isMuseumVisit: "isMuseumVisit", defaultZone: "defaultZone" }, outputs: { updatedZone: "updatedZone" }, ngImport: i0, template: "<div class=\"main-container\" *ngIf=\"zoneForm\">\r\n <div class=\"col-7\">\r\n <form (ngSubmit)=\"onSubmitZone()\" [formGroup]=\"zoneForm\">\r\n <div class=\"mb-3 row\">\r\n <label class=\"col-sm-2 col-form-label\">{{'Name' | translate}} *</label>\r\n <div class=\"col-sm-10\">\r\n <input type=\"text\" class=\"form-control\" required formControlName=\"name\">\r\n <!-- <div class=\"invalid-feedback\">\r\n {{'A name is required' | translate}}\r\n </div> -->\r\n </div>\r\n </div>\r\n <div class=\"mb-3 row\">\r\n <label class=\"col-sm-2 col-form-label\">{{'codeRef' | translate}}</label>\r\n <div class=\"col-sm-10\">\r\n <input type=\"text\" class=\"form-control\" required formControlName=\"code_ref\">\r\n </div>\r\n </div>\r\n <div class=\"mb-3 row\" *ngIf=\"!isMuseumVisit && !zoneIsMatterportFloor\">\r\n <label class=\"col-sm-2 col-form-label\">{{'Type of zone' | translate}}</label>\r\n <div class=\"col-sm-10\">\r\n <select class=\"form-control\" formControlName=\"layerID\">\r\n <option value=\"null\" selected disabled hidden> {{ zoneEdit && zoneEdit.layer ?\r\n zoneEdit.layer.name : 'Choose type'}}</option>\r\n <option *ngFor=\"let layer of layers\" [value]=\"layer.id\">\r\n {{ layer.name }}\r\n </option>\r\n </select>\r\n <p class=\"mt-1 new-type-text\">{{'or add new type of zone' | translate }}</p>\r\n <input type=\"text\" class=\"form-control new-type-input\" formControlName=\"newLayer\">\r\n <div *ngIf=\"newLayer.invalid && (newLayer.dirty || newLayer.touched)\" class=\"text-danger\">\r\n <div *ngIf=\"newLayer.errors?.['forbiddenName']\">\r\n {{'Layer exists already' | translate}}\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <!--If Editing Zone possibility to assign it to museum itinerary-->\r\n <div class=\"mb-3 row\" *ngIf=\"zoneEdit && !zoneIsMatterportFloor\">\r\n <label class=\"col-sm-2 col-form-label\">{{ 'Museum Itinerary' | translate }}</label>\r\n <div class=\"col-sm-10\">\r\n <input class=\"checkbox-apply mt-3\" type=\"checkbox\" [(ngModel)]=\"isMuseumVisit\"\r\n [ngModelOptions]=\"{standalone: true}\">\r\n </div>\r\n </div>\r\n\r\n <div class=\"mb-3 row\" *ngIf=\"!zoneEdit || zoneEdit.isMultipleFloorZone\">\r\n <label class=\"col-sm-2 col-form-label\">{{ 'Multiple Floors' | translate }}</label>\r\n <div class=\"col-sm-10\">\r\n <input class=\"checkbox-apply mt-3\" type=\"checkbox\" [(ngModel)]=\"multipleFloors\"\r\n [disabled]=\"zoneEdit !== undefined && zoneEdit !== null\" (change)=\"onChangeMultipleFloors()\"\r\n [ngModelOptions]=\"{standalone: true}\">\r\n <div class='text-danger' *ngIf=\"zoneEdit\">\r\n {{'cannotChangeMultifloor' | translate}}\r\n </div>\r\n </div>\r\n\r\n </div>\r\n\r\n <div class=\"mb-3 row\">\r\n <label class=\"col-sm-2 col-form-label\">{{'Surface' | translate}}</label>\r\n <div class=\"col-sm-10\">\r\n <input type=\"text\" class=\"form-control\" formControlName=\"surface\">\r\n </div>\r\n </div>\r\n\r\n <div class=\"mb-3 row\" *ngIf=\"!zoneIsMatterportFloor\">\r\n <label class=\"col-sm-2 col-form-label\">{{'Parent zone' | translate}}</label>\r\n <div class=\"col-sm-10\">\r\n <input *ngIf=\"zoneEdit\" type=\"text\" class=\"form-control\" formControlName=\"parent\">\r\n <div class=\"text-danger\" *ngIf=\"zoneEdit\">\r\n {{'cannotChangeParent' | translate}}\r\n </div>\r\n <select *ngIf=\"!zoneEdit\" class=\"form-control\" formControlName=\"parentID\">\r\n <option *ngFor=\"let zone of parentZones\" [ngValue]=\"zone.id\">\r\n {{ zone.name }}\r\n </option>\r\n </select>\r\n\r\n </div>\r\n </div>\r\n\r\n <div class=\"mb-3 row\" style=\"max-height: 200px; overflow: auto;\" *ngIf=\"!zoneIsMatterportFloor\">\r\n <label class=\"col-sm-2 col-form-label\">{{'Scan Points' | translate}}</label>\r\n <!-- <p class=\"col-sm-2\" *ngIf=\"zoneEdit\">{{ zoneEdit.sweepIDs.length }} scans</p> -->\r\n <p class=\"col\" *ngIf=\"chosenScansOnPlan.length === 0 && chosenScans.length === 0\">\r\n {{'No scan points chosen' | translate}}</p>\r\n <div class=\"col-sm-5\" *ngIf=\"chosenScansOnPlan && chosenScansOnPlan.length > 0\">\r\n <p>{{ chosenScansOnPlan.length }} {{'scan points chosen' | translate}}</p>\r\n <!-- <div *ngFor=\"let scan of chosenScansOnPlan\">\r\n <div class=\"row\">\r\n <p class=\"me-2\">{{ scan | slice:0:8 }}</p>\r\n <div (click)=\"onRemoveScanPlan(scan)\" [style.cursor]=\"'pointer'\">\r\n <span class=\"iconify\" data-icon=\"mdi:trash-can-outline\"></span>\r\n </div>\r\n </div>\r\n </div> -->\r\n </div>\r\n <div class=\"col-sm-5\" *ngIf=\"carouselIsVisible && chosenScans && chosenScans.length > 0\">\r\n <p>{{ chosenScans.length }} {{'scan points chosen' | translate}}</p>\r\n <div *ngFor=\"let scan of chosenScans\">\r\n <div class=\"row\">\r\n <p class=\"me-2\">{{ images360[scan].filename }}</p>\r\n <div (click)=\"onRemoveScanImage(scan)\" [style.cursor]=\"'pointer'\">\r\n <span class=\"iconify\" data-icon=\"mdi:trash-can-outline\"></span>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"row mb-3 mt-3\" *ngIf=\"!zoneIsMatterportFloor\">\r\n <div class=\"col\">\r\n <button type=\"button\" class=\"btn btn-outline-primary rounded-pill me-2\"\r\n (click)=\"togglePlan()\">{{'Choose scan points on plan' |\r\n translate}}</button>\r\n <button type=\"button\" class=\"btn btn-outline-primary rounded-pill me-2\" (click)=\"toggleCarousel()\"\r\n [disabled]=\"fromPlan || !images360 || images360.length === 0\">\r\n {{'Choose scan points from gallery' | translate}}</button>\r\n <button type=\"button\" class=\"btn btn-outline-primary rounded-pill me-2\" (click)=\"onAddAll()\"\r\n [disabled]=\"fromPlan || !images360 || images360.length === 0\">\r\n {{'add-all-scans' | translate}}</button>\r\n </div>\r\n </div>\r\n\r\n <!-- <div class=\"mb-3 row\">\r\n <label class=\"col-sm-3 col-form-label\">{{'No visible scan points' | translate}}</label>\r\n <div class=\"col-sm-3\">\r\n <input class=\"checkbox-apply mt-3\" type=\"checkbox\" [(ngModel)]=\"noScanPoints\"\r\n [ngModelOptions]=\"{standalone: true}\">\r\n </div>\r\n </div> -->\r\n\r\n <div *ngIf=\"carouselIsVisible\" class=\"mb-2\">\r\n <lib-carousel *ngIf=\"images360 && images360.length > 0\" [images]=\"images360\"\r\n (currentScan)=\"currentScanShowing=$event\"></lib-carousel>\r\n <button type=\"button\" class=\"btn btn-outline-primary rounded-pill me-2 mt-3\"\r\n (click)=\"onAddScan()\">{{'Add to zone' | translate}}</button>\r\n </div>\r\n <div class=\"mt-3\">\r\n <button type=\"submit\" class=\"btn btn-primary rounded-pill me-2\"\r\n [disabled]=\"fromPlan || !zoneForm.valid\">{{'Save' | translate}}</button>\r\n <button type=\"button\" (click)=\"onCancel()\" class=\"btn btn-outline-primary rounded-pill me-2\">\r\n {{'Cancel' | translate}}</button>\r\n </div>\r\n </form>\r\n </div>\r\n <div class=\"edit-plan\" *ngIf=\"fromPlan\">\r\n <lib-sweep-plan-selection style=\"width: 100%;\" [newZoneData]=\"newZoneDataFromEditor\" [spaceID]=\"spaceID\"\r\n [multipleFloors]=\"multipleFloors\" [inputZone]=\"zoneEdit\"\r\n (sweepsSelected)=\"onSelectedSweepsFromPlan($event)\"></lib-sweep-plan-selection>\r\n </div>\r\n</div>", styles: [".main-container{display:flex;flex-direction:column}.edit-plan{display:flex;margin:8px 0}.form-range{width:100%}h2{color:var(--smarterplan-primary);padding:0}.col-form-label{margin-bottom:1rem}.btn-outline-primary{margin-right:1rem}.new-type-input{margin-bottom:1rem}.new-type-text{margin-bottom:.5rem}.row{margin:0}p{margin:0;padding-top:calc(.375rem + 1px);padding-bottom:calc(.375rem + 1px)}button{min-width:80px}\n"], components: [{ type: i3.CarouselComponent, selector: "lib-carousel", inputs: ["images"], outputs: ["currentScan"] }, { type: i4.SweepPlanSelectionComponent, selector: "lib-sweep-plan-selection", inputs: ["spaceID", "chosenScansOnPlan", "newZoneData", "occupiedSweeps", "unavailableSweeps", "editingAudioZone", "inputZone", "multipleFloors"], outputs: ["sweepsSelected"] }], directives: [{ type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { 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]" }, { type: i1.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { type: i1.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { type: i1.SelectControlValueAccessor, selector: "select:not([multiple])[formControlName],select:not([multiple])[formControl],select:not([multiple])[ngModel]", inputs: ["compareWith"] }, { type: i1.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { type: i1.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { type: i5.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i1.CheckboxControlValueAccessor, selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]" }, { type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }], pipes: { "translate": i6.TranslatePipe } });
|
|
290
|
+
AddZoneComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.2.7", type: AddZoneComponent, selector: "lib-add-zone", inputs: { zoneEdit: "zoneEdit", spaceID: "spaceID", images360: "images360", navigationIDs: "navigationIDs", zones: "zones", newZoneDataFromEditor: "newZoneDataFromEditor", chosenPlan: "chosenPlan", isMuseumVisit: "isMuseumVisit", defaultZone: "defaultZone" }, outputs: { updatedZone: "updatedZone" }, ngImport: i0, template: "<div class=\"main-container\" *ngIf=\"zoneForm\">\r\n <div class=\"col-7\">\r\n <form (ngSubmit)=\"onSubmitZone()\" [formGroup]=\"zoneForm\">\r\n <div class=\"mb-3 row\">\r\n <label class=\"col-sm-2 col-form-label\">{{'Name' | translate}} *</label>\r\n <div class=\"col-sm-10\">\r\n <input type=\"text\" class=\"form-control\" required formControlName=\"name\">\r\n <!-- <div class=\"invalid-feedback\">\r\n {{'A name is required' | translate}}\r\n </div> -->\r\n </div>\r\n </div>\r\n <div class=\"mb-3 row\">\r\n <label class=\"col-sm-2 col-form-label\">{{'codeRef' | translate}}</label>\r\n <div class=\"col-sm-10\">\r\n <input type=\"text\" class=\"form-control\" formControlName=\"code_ref\">\r\n </div>\r\n </div>\r\n <div class=\"mb-3 row\" *ngIf=\"!isMuseumVisit && !zoneIsMatterportFloor\">\r\n <label class=\"col-sm-2 col-form-label\">{{'Type of zone' | translate}}</label>\r\n <div class=\"col-sm-10\">\r\n <select class=\"form-control\" formControlName=\"layerID\">\r\n <option value=\"null\" selected disabled hidden> {{ zoneEdit && zoneEdit.layer ?\r\n zoneEdit.layer.name : 'Choose type'}}</option>\r\n <option *ngFor=\"let layer of layers\" [value]=\"layer.id\">\r\n {{ layer.name }}\r\n </option>\r\n </select>\r\n <p class=\"mt-1 new-type-text\">{{'or add new type of zone' | translate }}</p>\r\n <input type=\"text\" class=\"form-control new-type-input\" formControlName=\"newLayer\">\r\n <div *ngIf=\"newLayer.invalid && (newLayer.dirty || newLayer.touched)\" class=\"text-danger\">\r\n <div *ngIf=\"newLayer.errors?.['forbiddenName']\">\r\n {{'Layer exists already' | translate}}\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <!--If Editing Zone possibility to assign it to museum itinerary-->\r\n <div class=\"mb-3 row\" *ngIf=\"zoneEdit && !zoneIsMatterportFloor\">\r\n <label class=\"col-sm-2 col-form-label\">{{ 'Museum Itinerary' | translate }}</label>\r\n <div class=\"col-sm-10\">\r\n <input class=\"checkbox-apply mt-3\" type=\"checkbox\" [(ngModel)]=\"isMuseumVisit\"\r\n [ngModelOptions]=\"{standalone: true}\">\r\n </div>\r\n </div>\r\n\r\n <div class=\"mb-3 row\" *ngIf=\"!zoneEdit || zoneEdit.isMultipleFloorZone\">\r\n <label class=\"col-sm-2 col-form-label\">{{ 'Multiple Floors' | translate }}</label>\r\n <div class=\"col-sm-10\">\r\n <input class=\"checkbox-apply mt-3\" type=\"checkbox\" [(ngModel)]=\"multipleFloors\"\r\n [disabled]=\"zoneEdit !== undefined && zoneEdit !== null\" (change)=\"onChangeMultipleFloors()\"\r\n [ngModelOptions]=\"{standalone: true}\">\r\n <div class='text-danger' *ngIf=\"zoneEdit\">\r\n {{'cannotChangeMultifloor' | translate}}\r\n </div>\r\n </div>\r\n\r\n </div>\r\n\r\n <div class=\"mb-3 row\">\r\n <label class=\"col-sm-2 col-form-label\">{{'Surface' | translate}}</label>\r\n <div class=\"col-sm-10\">\r\n <input type=\"text\" class=\"form-control\" formControlName=\"surface\">\r\n </div>\r\n </div>\r\n\r\n <div class=\"mb-3 row\" *ngIf=\"!zoneIsMatterportFloor\">\r\n <label class=\"col-sm-2 col-form-label\">{{'Parent zone' | translate}}</label>\r\n <div class=\"col-sm-10\">\r\n <input *ngIf=\"zoneEdit\" type=\"text\" class=\"form-control\" formControlName=\"parent\">\r\n <div class=\"text-danger\" *ngIf=\"zoneEdit\">\r\n {{'cannotChangeParent' | translate}}\r\n </div>\r\n <select *ngIf=\"!zoneEdit\" class=\"form-control\" formControlName=\"parentID\">\r\n <option *ngFor=\"let zone of parentZones\" [ngValue]=\"zone.id\">\r\n {{ zone.name }}\r\n </option>\r\n </select>\r\n\r\n </div>\r\n </div>\r\n\r\n <div class=\"mb-3 row\" style=\"max-height: 200px; overflow: auto;\" *ngIf=\"!zoneIsMatterportFloor\">\r\n <label class=\"col-sm-2 col-form-label\">{{'Scan Points' | translate}}</label>\r\n <!-- <p class=\"col-sm-2\" *ngIf=\"zoneEdit\">{{ zoneEdit.sweepIDs.length }} scans</p> -->\r\n <p class=\"col\" *ngIf=\"chosenScansOnPlan.length === 0 && chosenScans.length === 0\">\r\n {{'No scan points chosen' | translate}}</p>\r\n <div class=\"col-sm-5\" *ngIf=\"chosenScansOnPlan && chosenScansOnPlan.length > 0\">\r\n <p>{{ chosenScansOnPlan.length }} {{'scan points chosen' | translate}}</p>\r\n <!-- <div *ngFor=\"let scan of chosenScansOnPlan\">\r\n <div class=\"row\">\r\n <p class=\"me-2\">{{ scan | slice:0:8 }}</p>\r\n <div (click)=\"onRemoveScanPlan(scan)\" [style.cursor]=\"'pointer'\">\r\n <span class=\"iconify\" data-icon=\"mdi:trash-can-outline\"></span>\r\n </div>\r\n </div>\r\n </div> -->\r\n </div>\r\n <div class=\"col-sm-5\" *ngIf=\"carouselIsVisible && chosenScans && chosenScans.length > 0\">\r\n <p>{{ chosenScans.length }} {{'scan points chosen' | translate}}</p>\r\n <div *ngFor=\"let scan of chosenScans\">\r\n <div class=\"row\">\r\n <p class=\"me-2\">{{ images360[scan].filename }}</p>\r\n <div (click)=\"onRemoveScanImage(scan)\" [style.cursor]=\"'pointer'\">\r\n <span class=\"iconify\" data-icon=\"mdi:trash-can-outline\"></span>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"row mb-3 mt-3\" *ngIf=\"!zoneIsMatterportFloor\">\r\n <div class=\"col\">\r\n <button type=\"button\" class=\"btn btn-outline-primary rounded-pill me-2\"\r\n (click)=\"togglePlan()\">{{'Choose scan points on plan' |\r\n translate}}</button>\r\n <button type=\"button\" class=\"btn btn-outline-primary rounded-pill me-2\" (click)=\"toggleCarousel()\"\r\n [disabled]=\"fromPlan || !images360 || images360.length === 0\">\r\n {{'Choose scan points from gallery' | translate}}</button>\r\n <button type=\"button\" class=\"btn btn-outline-primary rounded-pill me-2\" (click)=\"onAddAll()\"\r\n [disabled]=\"fromPlan || !images360 || images360.length === 0\">\r\n {{'add-all-scans' | translate}}</button>\r\n </div>\r\n </div>\r\n\r\n <!-- <div class=\"mb-3 row\">\r\n <label class=\"col-sm-3 col-form-label\">{{'No visible scan points' | translate}}</label>\r\n <div class=\"col-sm-3\">\r\n <input class=\"checkbox-apply mt-3\" type=\"checkbox\" [(ngModel)]=\"noScanPoints\"\r\n [ngModelOptions]=\"{standalone: true}\">\r\n </div>\r\n </div> -->\r\n\r\n <div *ngIf=\"carouselIsVisible\" class=\"mb-2\">\r\n <lib-carousel *ngIf=\"images360 && images360.length > 0\" [images]=\"images360\"\r\n (currentScan)=\"currentScanShowing=$event\"></lib-carousel>\r\n <button type=\"button\" class=\"btn btn-outline-primary rounded-pill me-2 mt-3\"\r\n (click)=\"onAddScan()\">{{'Add to zone' | translate}}</button>\r\n </div>\r\n <div class=\"mt-3\">\r\n <button type=\"submit\" class=\"btn btn-primary rounded-pill me-2\"\r\n [disabled]=\"fromPlan || !zoneForm.valid\">{{'Save' | translate}}</button>\r\n <button type=\"button\" (click)=\"onCancel()\" class=\"btn btn-outline-primary rounded-pill me-2\">\r\n {{'Cancel' | translate}}</button>\r\n </div>\r\n </form>\r\n </div>\r\n <div class=\"edit-plan\" *ngIf=\"fromPlan\">\r\n <lib-sweep-plan-selection style=\"width: 100%;\" [newZoneData]=\"newZoneDataFromEditor\" [spaceID]=\"spaceID\"\r\n [multipleFloors]=\"multipleFloors\" [inputZone]=\"zoneEdit\"\r\n (sweepsSelected)=\"onSelectedSweepsFromPlan($event)\"></lib-sweep-plan-selection>\r\n </div>\r\n</div>", styles: [".main-container{display:flex;flex-direction:column}.edit-plan{display:flex;margin:8px 0}.form-range{width:100%}h2{color:var(--smarterplan-primary);padding:0}.col-form-label{margin-bottom:1rem}.btn-outline-primary{margin-right:1rem}.new-type-input{margin-bottom:1rem}.new-type-text{margin-bottom:.5rem}.row{margin:0}p{margin:0;padding-top:calc(.375rem + 1px);padding-bottom:calc(.375rem + 1px)}button{min-width:80px}\n"], components: [{ type: i3.CarouselComponent, selector: "lib-carousel", inputs: ["images"], outputs: ["currentScan"] }, { type: i4.SweepPlanSelectionComponent, selector: "lib-sweep-plan-selection", inputs: ["spaceID", "chosenScansOnPlan", "newZoneData", "occupiedSweeps", "unavailableSweeps", "editingAudioZone", "inputZone", "multipleFloors"], outputs: ["sweepsSelected"] }], directives: [{ type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { 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]" }, { type: i1.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { type: i1.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { type: i1.SelectControlValueAccessor, selector: "select:not([multiple])[formControlName],select:not([multiple])[formControl],select:not([multiple])[ngModel]", inputs: ["compareWith"] }, { type: i1.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { type: i1.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { type: i5.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i1.CheckboxControlValueAccessor, selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]" }, { type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }], pipes: { "translate": i6.TranslatePipe } });
|
|
292
291
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.7", ngImport: i0, type: AddZoneComponent, decorators: [{
|
|
293
292
|
type: Component,
|
|
294
|
-
args: [{ selector: 'lib-add-zone', template: "<div class=\"main-container\" *ngIf=\"zoneForm\">\r\n <div class=\"col-7\">\r\n <form (ngSubmit)=\"onSubmitZone()\" [formGroup]=\"zoneForm\">\r\n <div class=\"mb-3 row\">\r\n <label class=\"col-sm-2 col-form-label\">{{'Name' | translate}} *</label>\r\n <div class=\"col-sm-10\">\r\n <input type=\"text\" class=\"form-control\" required formControlName=\"name\">\r\n <!-- <div class=\"invalid-feedback\">\r\n {{'A name is required' | translate}}\r\n </div> -->\r\n </div>\r\n </div>\r\n <div class=\"mb-3 row\">\r\n <label class=\"col-sm-2 col-form-label\">{{'codeRef' | translate}}</label>\r\n <div class=\"col-sm-10\">\r\n <input type=\"text\" class=\"form-control\"
|
|
293
|
+
args: [{ selector: 'lib-add-zone', template: "<div class=\"main-container\" *ngIf=\"zoneForm\">\r\n <div class=\"col-7\">\r\n <form (ngSubmit)=\"onSubmitZone()\" [formGroup]=\"zoneForm\">\r\n <div class=\"mb-3 row\">\r\n <label class=\"col-sm-2 col-form-label\">{{'Name' | translate}} *</label>\r\n <div class=\"col-sm-10\">\r\n <input type=\"text\" class=\"form-control\" required formControlName=\"name\">\r\n <!-- <div class=\"invalid-feedback\">\r\n {{'A name is required' | translate}}\r\n </div> -->\r\n </div>\r\n </div>\r\n <div class=\"mb-3 row\">\r\n <label class=\"col-sm-2 col-form-label\">{{'codeRef' | translate}}</label>\r\n <div class=\"col-sm-10\">\r\n <input type=\"text\" class=\"form-control\" formControlName=\"code_ref\">\r\n </div>\r\n </div>\r\n <div class=\"mb-3 row\" *ngIf=\"!isMuseumVisit && !zoneIsMatterportFloor\">\r\n <label class=\"col-sm-2 col-form-label\">{{'Type of zone' | translate}}</label>\r\n <div class=\"col-sm-10\">\r\n <select class=\"form-control\" formControlName=\"layerID\">\r\n <option value=\"null\" selected disabled hidden> {{ zoneEdit && zoneEdit.layer ?\r\n zoneEdit.layer.name : 'Choose type'}}</option>\r\n <option *ngFor=\"let layer of layers\" [value]=\"layer.id\">\r\n {{ layer.name }}\r\n </option>\r\n </select>\r\n <p class=\"mt-1 new-type-text\">{{'or add new type of zone' | translate }}</p>\r\n <input type=\"text\" class=\"form-control new-type-input\" formControlName=\"newLayer\">\r\n <div *ngIf=\"newLayer.invalid && (newLayer.dirty || newLayer.touched)\" class=\"text-danger\">\r\n <div *ngIf=\"newLayer.errors?.['forbiddenName']\">\r\n {{'Layer exists already' | translate}}\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <!--If Editing Zone possibility to assign it to museum itinerary-->\r\n <div class=\"mb-3 row\" *ngIf=\"zoneEdit && !zoneIsMatterportFloor\">\r\n <label class=\"col-sm-2 col-form-label\">{{ 'Museum Itinerary' | translate }}</label>\r\n <div class=\"col-sm-10\">\r\n <input class=\"checkbox-apply mt-3\" type=\"checkbox\" [(ngModel)]=\"isMuseumVisit\"\r\n [ngModelOptions]=\"{standalone: true}\">\r\n </div>\r\n </div>\r\n\r\n <div class=\"mb-3 row\" *ngIf=\"!zoneEdit || zoneEdit.isMultipleFloorZone\">\r\n <label class=\"col-sm-2 col-form-label\">{{ 'Multiple Floors' | translate }}</label>\r\n <div class=\"col-sm-10\">\r\n <input class=\"checkbox-apply mt-3\" type=\"checkbox\" [(ngModel)]=\"multipleFloors\"\r\n [disabled]=\"zoneEdit !== undefined && zoneEdit !== null\" (change)=\"onChangeMultipleFloors()\"\r\n [ngModelOptions]=\"{standalone: true}\">\r\n <div class='text-danger' *ngIf=\"zoneEdit\">\r\n {{'cannotChangeMultifloor' | translate}}\r\n </div>\r\n </div>\r\n\r\n </div>\r\n\r\n <div class=\"mb-3 row\">\r\n <label class=\"col-sm-2 col-form-label\">{{'Surface' | translate}}</label>\r\n <div class=\"col-sm-10\">\r\n <input type=\"text\" class=\"form-control\" formControlName=\"surface\">\r\n </div>\r\n </div>\r\n\r\n <div class=\"mb-3 row\" *ngIf=\"!zoneIsMatterportFloor\">\r\n <label class=\"col-sm-2 col-form-label\">{{'Parent zone' | translate}}</label>\r\n <div class=\"col-sm-10\">\r\n <input *ngIf=\"zoneEdit\" type=\"text\" class=\"form-control\" formControlName=\"parent\">\r\n <div class=\"text-danger\" *ngIf=\"zoneEdit\">\r\n {{'cannotChangeParent' | translate}}\r\n </div>\r\n <select *ngIf=\"!zoneEdit\" class=\"form-control\" formControlName=\"parentID\">\r\n <option *ngFor=\"let zone of parentZones\" [ngValue]=\"zone.id\">\r\n {{ zone.name }}\r\n </option>\r\n </select>\r\n\r\n </div>\r\n </div>\r\n\r\n <div class=\"mb-3 row\" style=\"max-height: 200px; overflow: auto;\" *ngIf=\"!zoneIsMatterportFloor\">\r\n <label class=\"col-sm-2 col-form-label\">{{'Scan Points' | translate}}</label>\r\n <!-- <p class=\"col-sm-2\" *ngIf=\"zoneEdit\">{{ zoneEdit.sweepIDs.length }} scans</p> -->\r\n <p class=\"col\" *ngIf=\"chosenScansOnPlan.length === 0 && chosenScans.length === 0\">\r\n {{'No scan points chosen' | translate}}</p>\r\n <div class=\"col-sm-5\" *ngIf=\"chosenScansOnPlan && chosenScansOnPlan.length > 0\">\r\n <p>{{ chosenScansOnPlan.length }} {{'scan points chosen' | translate}}</p>\r\n <!-- <div *ngFor=\"let scan of chosenScansOnPlan\">\r\n <div class=\"row\">\r\n <p class=\"me-2\">{{ scan | slice:0:8 }}</p>\r\n <div (click)=\"onRemoveScanPlan(scan)\" [style.cursor]=\"'pointer'\">\r\n <span class=\"iconify\" data-icon=\"mdi:trash-can-outline\"></span>\r\n </div>\r\n </div>\r\n </div> -->\r\n </div>\r\n <div class=\"col-sm-5\" *ngIf=\"carouselIsVisible && chosenScans && chosenScans.length > 0\">\r\n <p>{{ chosenScans.length }} {{'scan points chosen' | translate}}</p>\r\n <div *ngFor=\"let scan of chosenScans\">\r\n <div class=\"row\">\r\n <p class=\"me-2\">{{ images360[scan].filename }}</p>\r\n <div (click)=\"onRemoveScanImage(scan)\" [style.cursor]=\"'pointer'\">\r\n <span class=\"iconify\" data-icon=\"mdi:trash-can-outline\"></span>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"row mb-3 mt-3\" *ngIf=\"!zoneIsMatterportFloor\">\r\n <div class=\"col\">\r\n <button type=\"button\" class=\"btn btn-outline-primary rounded-pill me-2\"\r\n (click)=\"togglePlan()\">{{'Choose scan points on plan' |\r\n translate}}</button>\r\n <button type=\"button\" class=\"btn btn-outline-primary rounded-pill me-2\" (click)=\"toggleCarousel()\"\r\n [disabled]=\"fromPlan || !images360 || images360.length === 0\">\r\n {{'Choose scan points from gallery' | translate}}</button>\r\n <button type=\"button\" class=\"btn btn-outline-primary rounded-pill me-2\" (click)=\"onAddAll()\"\r\n [disabled]=\"fromPlan || !images360 || images360.length === 0\">\r\n {{'add-all-scans' | translate}}</button>\r\n </div>\r\n </div>\r\n\r\n <!-- <div class=\"mb-3 row\">\r\n <label class=\"col-sm-3 col-form-label\">{{'No visible scan points' | translate}}</label>\r\n <div class=\"col-sm-3\">\r\n <input class=\"checkbox-apply mt-3\" type=\"checkbox\" [(ngModel)]=\"noScanPoints\"\r\n [ngModelOptions]=\"{standalone: true}\">\r\n </div>\r\n </div> -->\r\n\r\n <div *ngIf=\"carouselIsVisible\" class=\"mb-2\">\r\n <lib-carousel *ngIf=\"images360 && images360.length > 0\" [images]=\"images360\"\r\n (currentScan)=\"currentScanShowing=$event\"></lib-carousel>\r\n <button type=\"button\" class=\"btn btn-outline-primary rounded-pill me-2 mt-3\"\r\n (click)=\"onAddScan()\">{{'Add to zone' | translate}}</button>\r\n </div>\r\n <div class=\"mt-3\">\r\n <button type=\"submit\" class=\"btn btn-primary rounded-pill me-2\"\r\n [disabled]=\"fromPlan || !zoneForm.valid\">{{'Save' | translate}}</button>\r\n <button type=\"button\" (click)=\"onCancel()\" class=\"btn btn-outline-primary rounded-pill me-2\">\r\n {{'Cancel' | translate}}</button>\r\n </div>\r\n </form>\r\n </div>\r\n <div class=\"edit-plan\" *ngIf=\"fromPlan\">\r\n <lib-sweep-plan-selection style=\"width: 100%;\" [newZoneData]=\"newZoneDataFromEditor\" [spaceID]=\"spaceID\"\r\n [multipleFloors]=\"multipleFloors\" [inputZone]=\"zoneEdit\"\r\n (sweepsSelected)=\"onSelectedSweepsFromPlan($event)\"></lib-sweep-plan-selection>\r\n </div>\r\n</div>", styles: [".main-container{display:flex;flex-direction:column}.edit-plan{display:flex;margin:8px 0}.form-range{width:100%}h2{color:var(--smarterplan-primary);padding:0}.col-form-label{margin-bottom:1rem}.btn-outline-primary{margin-right:1rem}.new-type-input{margin-bottom:1rem}.new-type-text{margin-bottom:.5rem}.row{margin:0}p{margin:0;padding-top:calc(.375rem + 1px);padding-bottom:calc(.375rem + 1px)}button{min-width:80px}\n"] }]
|
|
295
294
|
}], ctorParameters: function () { return [{ type: i1.FormBuilder }, { type: i2.ZoneService }, { type: i2.LayerService }, { type: i2.BaseUserService }, { type: i2.NavigationService }]; }, propDecorators: { zoneEdit: [{
|
|
296
295
|
type: Input
|
|
297
296
|
}], spaceID: [{
|
|
@@ -313,4 +312,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.7", ngImpor
|
|
|
313
312
|
}], defaultZone: [{
|
|
314
313
|
type: Input
|
|
315
314
|
}] } });
|
|
316
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWRkLXpvbmUuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LXNtYXJ0ZXJwbGFuLWxvY2F0aW9ucy9zcmMvbGliL2NvbXBvbmVudHMvem9uZXMvYWRkLXpvbmUvYWRkLXpvbmUuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LXNtYXJ0ZXJwbGFuLWxvY2F0aW9ucy9zcmMvbGliL2NvbXBvbmVudHMvem9uZXMvYWRkLXpvbmUvYWRkLXpvbmUuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFVLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMvRSxPQUFPLEVBR0wsVUFBVSxHQUlYLE1BQU0sZ0JBQWdCLENBQUM7Ozs7Ozs7O0FBZXhCLE1BQU0sT0FBTyxnQkFBZ0I7SUErQzNCLFlBQ1UsRUFBZSxFQUNmLFdBQXdCLEVBQ3hCLFlBQTBCLEVBQzFCLFdBQTRCLEVBQzVCLGlCQUFvQztRQUpwQyxPQUFFLEdBQUYsRUFBRSxDQUFhO1FBQ2YsZ0JBQVcsR0FBWCxXQUFXLENBQWE7UUFDeEIsaUJBQVksR0FBWixZQUFZLENBQWM7UUFDMUIsZ0JBQVcsR0FBWCxXQUFXLENBQWlCO1FBQzVCLHNCQUFpQixHQUFqQixpQkFBaUIsQ0FBbUI7UUF2Q3BDLGdCQUFXLEdBQUcsSUFBSSxZQUFZLEVBQU8sQ0FBQztRQUl2QyxrQkFBYSxHQUFZLEtBQUssQ0FBQztRQUl4QyxnQkFBVyxHQUFXLEVBQUUsQ0FBQztRQUV6QixzQkFBaUIsR0FBRyxLQUFLLENBQUM7UUFJMUIsZ0JBQVcsR0FBRyxLQUFLLENBQUM7UUFJcEIsZ0JBQVcsR0FBYSxFQUFFLENBQUM7UUFJM0IsYUFBUSxHQUFZLEtBQUssQ0FBQztRQUUxQixzQkFBaUIsR0FBYSxFQUFFLENBQUM7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QUFLLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQztZQUN6QyxPQUFPLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBRSxhQUFhLEVBQUUsRUFBRSxLQUFLLEVBQUUsT0FBTyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztRQUN4RSxDQUFDLENBQUM7SUFDSixDQUFDOzs2R0EvVlUsZ0JBQWdCO2lHQUFoQixnQkFBZ0IsaVdDdkI3QiwwdlNBd0pNOzJGRGpJTyxnQkFBZ0I7a0JBTDVCLFNBQVM7K0JBQ0UsY0FBYztxTkFLZixRQUFRO3NCQUFoQixLQUFLO2dCQUVHLE9BQU87c0JBQWYsS0FBSztnQkFFRyxTQUFTO3NCQUFqQixLQUFLO2dCQUVHLGFBQWE7c0JBQXJCLEtBQUs7Z0JBRUcsS0FBSztzQkFBYixLQUFLO2dCQUVHLHFCQUFxQjtzQkFBN0IsS0FBSztnQkFFSSxXQUFXO3NCQUFwQixNQUFNO2dCQUVFLFVBQVU7c0JBQWxCLEtBQUs7Z0JBRUcsYUFBYTtzQkFBckIsS0FBSztnQkFFRyxXQUFXO3NCQUFuQixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBFdmVudEVtaXR0ZXIsIElucHV0LCBPbkluaXQsIE91dHB1dCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQge1xyXG4gIEZvcm1Hcm91cCxcclxuICBGb3JtQnVpbGRlcixcclxuICBWYWxpZGF0b3JzLFxyXG4gIEFic3RyYWN0Q29udHJvbCxcclxuICBWYWxpZGF0b3JGbixcclxuICBWYWxpZGF0aW9uRXJyb3JzLFxyXG59IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcclxuaW1wb3J0IHtcclxuICBab25lLFxyXG4gIFBsYW4sXHJcbiAgTGF5ZXIsXHJcbiAgWm9uZVNlcnZpY2UsXHJcbiAgTGF5ZXJTZXJ2aWNlLFxyXG4gIEJhc2VVc2VyU2VydmljZSxcclxuICBOYXZpZ2F0aW9uU2VydmljZSxcclxufSBmcm9tICdAc21hcnRlcnBsYW4vbmd4LXNtYXJ0ZXJwbGFuLWNvcmUnO1xyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ2xpYi1hZGQtem9uZScsXHJcbiAgdGVtcGxhdGVVcmw6ICcuL2FkZC16b25lLmNvbXBvbmVudC5odG1sJyxcclxuICBzdHlsZVVybHM6IFsnLi9hZGQtem9uZS5jb21wb25lbnQuc2NzcyddLFxyXG59KVxyXG5leHBvcnQgY2xhc3MgQWRkWm9uZUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XHJcbiAgQElucHV0KCkgem9uZUVkaXQ6IFpvbmU7XHJcblxyXG4gIEBJbnB1dCgpIHNwYWNlSUQ6IHN0cmluZztcclxuXHJcbiAgQElucHV0KCkgaW1hZ2VzMzYwOiB7IHBhdGg6IHN0cmluZzsgZmlsZW5hbWU6IHN0cmluZyB9W107XHJcblxyXG4gIEBJbnB1dCgpIG5hdmlnYXRpb25JRHM6IHN0cmluZ1tdO1xyXG5cclxuICBASW5wdXQoKSB6b25lczogWm9uZVtdO1xyXG5cclxuICBASW5wdXQoKSBuZXdab25lRGF0YUZyb21FZGl0b3I6IGFueTtcclxuXHJcbiAgQE91dHB1dCgpIHVwZGF0ZWRab25lID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XHJcblxyXG4gIEBJbnB1dCgpIGNob3NlblBsYW46IFBsYW47XHJcblxyXG4gIEBJbnB1dCgpIGlzTXVzZXVtVmlzaXQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgQElucHV0KCkgZGVmYXVsdFpvbmU6IFpvbmU7XHJcblxyXG4gIHBhcmVudFpvbmVzOiBab25lW10gPSBbXTtcclxuXHJcbiAgY2Fyb3VzZWxJc1Zpc2libGUgPSBmYWxzZTtcclxuXHJcbiAgem9uZUZvcm06IEZvcm1Hcm91cDtcclxuXHJcbiAgaXNTdWJtaXR0ZWQgPSBmYWxzZTtcclxuXHJcbiAgY3VycmVudFNjYW5TaG93aW5nOiBudW1iZXI7XHJcblxyXG4gIGNob3NlblNjYW5zOiBudW1iZXJbXSA9IFtdO1xyXG5cclxuICBsYXllcnM6IExheWVyW107XHJcblxyXG4gIGZyb21QbGFuOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gIGNob3NlblNjYW5zT25QbGFuOiBzdHJpbmdbXSA9IFtdO1xyXG5cclxuICBjdXJyZW50T3JnSWQ6IHN0cmluZztcclxuXHJcbiAgem9uZUluaXRpYWxOYXZDb3VudCA9IDA7XHJcblxyXG4gIHpvbmVJc01hdHRlcnBvcnRGbG9vciA9IGZhbHNlO1xyXG5cclxuICBtdWx0aXBsZUZsb29ycyA9IGZhbHNlO1xyXG5cclxuICBjb25zdHJ1Y3RvcihcclxuICAgIHByaXZhdGUgZmI6IEZvcm1CdWlsZGVyLFxyXG4gICAgcHJpdmF0ZSB6b25lU2VydmljZTogWm9uZVNlcnZpY2UsXHJcbiAgICBwcml2YXRlIGxheWVyU2VydmljZTogTGF5ZXJTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSB1c2VyU2VydmljZTogQmFzZVVzZXJTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBuYXZpZ2F0aW9uU2VydmljZTogTmF2aWdhdGlvblNlcnZpY2VcclxuICApIHt9XHJcblxyXG4gIGFzeW5jIG5nT25Jbml0KCkge1xyXG4gICAgdGhpcy5wYXJlbnRab25lcyA9IHRoaXMuem9uZXMuZmlsdGVyKFxyXG4gICAgICAoem9uZSkgPT4gem9uZS5sYXllciAmJiB6b25lLmxheWVyLm5hbWUgPT09ICdGTE9PUidcclxuICAgICk7XHJcbiAgICBpZiAoIXRoaXMuZGVmYXVsdFpvbmUpIHtcclxuICAgICAgdGhpcy5kZWZhdWx0Wm9uZSA9IHRoaXMuZ2V0RGVmYXVsdFpvbmUoKTtcclxuICAgIH1cclxuICAgIHRoaXMucGFyZW50Wm9uZXMudW5zaGlmdCh0aGlzLmRlZmF1bHRab25lKTtcclxuICAgIGF3YWl0IHRoaXMudXBkYXRlTGF5ZXJzKCk7XHJcbiAgICB0aGlzLmluaXRab25lRm9ybSgpO1xyXG4gIH1cclxuXHJcbiAgYXN5bmMgdXBkYXRlTGF5ZXJzKCkge1xyXG4gICAgdGhpcy5jdXJyZW50T3JnSWQgPSB0aGlzLnVzZXJTZXJ2aWNlLmN1cnJlbnRPcmdhbmlzYXRpb24odGhpcy5zcGFjZUlEKS5pZDtcclxuICAgIGNvbnN0IGxheWVycyA9IGF3YWl0IHRoaXMubGF5ZXJTZXJ2aWNlLmdldExheWVyRm9yT3JnYW5pc2F0aW9uKFxyXG4gICAgICB0aGlzLmN1cnJlbnRPcmdJZFxyXG4gICAgKTtcclxuICAgIC8vIGZpbHRlciBvdXQgbGF5ZXJzIGNyZWF0ZWQgYnkgdGhlIHN5c3RlbVxyXG4gICAgdGhpcy5sYXllcnMgPSBsYXllcnMuZmlsdGVyKFxyXG4gICAgICAobCkgPT4gbC5uYW1lICE9PSAnQlVJTERJTkcnICYmIGwubmFtZSAhPT0gJ0ZMT09SJ1xyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIGFzeW5jIGluaXRab25lRm9ybSgpIHtcclxuICAgIGlmICh0aGlzLnpvbmVFZGl0KSB7XHJcbiAgICAgIGlmICh0aGlzLnpvbmVFZGl0Lm1ldGFkYXRhKSB7XHJcbiAgICAgICAgY29uc3QgbWV0YWRhdGEgPSBKU09OLnBhcnNlKHRoaXMuem9uZUVkaXQubWV0YWRhdGEpO1xyXG4gICAgICAgIHRoaXMuem9uZUlzTWF0dGVycG9ydEZsb29yID0gbWV0YWRhdGEuaGFzT3duUHJvcGVydHkoXHJcbiAgICAgICAgICAnbWF0dGVycG9ydEZsb29yU2VxdWVuY2UnXHJcbiAgICAgICAgKTtcclxuICAgICAgfVxyXG4gICAgICBjb25zdCBpc1ZpcnR1YWwgPSB0aGlzLnpvbmVTZXJ2aWNlLnpvbmVJc1ZpcnR1YWwodGhpcy56b25lRWRpdCk7XHJcbiAgICAgIGlmICghaXNWaXJ0dWFsKSB7XHJcbiAgICAgICAgYXdhaXQgdGhpcy5sb2FkTmF2aWdhdGlvbnMoKTtcclxuICAgICAgfVxyXG4gICAgICB0aGlzLmlzTXVzZXVtVmlzaXQgPSB0aGlzLnpvbmVFZGl0LmlzTXVzZXVtVmlzaXRab25lID09PSB0cnVlO1xyXG4gICAgICB0aGlzLm11bHRpcGxlRmxvb3JzID0gdGhpcy56b25lRWRpdC5pc011bHRpcGxlRmxvb3Jab25lID09PSB0cnVlO1xyXG4gICAgICB0aGlzLnpvbmVGb3JtID0gdGhpcy5mYi5ncm91cCh7XHJcbiAgICAgICAgaWQ6IHRoaXMuem9uZUVkaXQuaWQsXHJcbiAgICAgICAgbmFtZTogW3RoaXMuem9uZUVkaXQubmFtZSwgW1ZhbGlkYXRvcnMucmVxdWlyZWRdXSxcclxuICAgICAgICBjb2RlX3JlZjogdGhpcy56b25lRWRpdC5jb2RlX3JlZiA/IHRoaXMuem9uZUVkaXQuY29kZV9yZWYgOiBudWxsLFxyXG4gICAgICAgIGxheWVySUQ6IHRoaXMuem9uZUVkaXQubGF5ZXIgPyB0aGlzLnpvbmVFZGl0LmxheWVyLmlkIDogbnVsbCxcclxuICAgICAgICBzdXJmYWNlOiB0aGlzLnpvbmVFZGl0LnN1cmZhY2UgPyB0aGlzLnpvbmVFZGl0LnN1cmZhY2UgOiAwLFxyXG4gICAgICAgIHBhcmVudElEOiB0aGlzLnpvbmVFZGl0LnBhcmVudElELFxyXG4gICAgICAgIHBhcmVudDogeyB2YWx1ZTogdGhpcy56b25lRWRpdC5wYXJlbnQubmFtZSwgZGlzYWJsZWQ6IHRydWUgfSxcclxuICAgICAgICBuZXdMYXllcjogW251bGwsIFt0aGlzLmxheWVyTmFtZVZhbGlkYXRvcigpXV0sXHJcbiAgICAgICAgaXNNdXNldW1WaXNpdFpvbmU6IHRoaXMuaXNNdXNldW1WaXNpdCxcclxuICAgICAgICBzdGFydFN3ZWVwSUQ6IHRoaXMuem9uZUVkaXQuc3RhcnRTd2VlcElELFxyXG4gICAgICB9KTtcclxuICAgICAgdGhpcy5vbkNoYW5nZU11bHRpcGxlRmxvb3JzKCk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLnpvbmVGb3JtID0gdGhpcy5mYi5ncm91cCh7XHJcbiAgICAgICAgbmFtZTogW1xyXG4gICAgICAgICAgdGhpcy5uZXdab25lRGF0YUZyb21FZGl0b3IgPyB0aGlzLm5ld1pvbmVEYXRhRnJvbUVkaXRvci5uYW1lIDogJycsXHJcbiAgICAgICAgICBbVmFsaWRhdG9ycy5yZXF1aXJlZF0sXHJcbiAgICAgICAgXSxcclxuICAgICAgICBjb2RlX3JlZjogbnVsbCxcclxuICAgICAgICBsYXllcklEOiBudWxsLFxyXG4gICAgICAgIHN1cmZhY2U6IDAsXHJcbiAgICAgICAgcGFyZW50SUQ6IHRoaXMuZGVmYXVsdFpvbmUuaWQsXHJcbiAgICAgICAgbmV3TGF5ZXI6IFtudWxsLCBbdGhpcy5sYXllck5hbWVWYWxpZGF0b3IoKV1dLFxyXG4gICAgICAgIGlzTXVzZXVtVmlzaXRab25lOiB0aGlzLmlzTXVzZXVtVmlzaXQsXHJcbiAgICAgICAgc3RhcnRTd2VlcElEOiBudWxsLFxyXG4gICAgICB9KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGFzeW5jIG9uU3VibWl0Wm9uZSgpIHtcclxuICAgIHRoaXMuaXNTdWJtaXR0ZWQgPSB0cnVlO1xyXG4gICAgaWYgKCF0aGlzLnpvbmVGb3JtLnZhbGlkKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIGNvbnN0IGZvcm1WYWx1ZSA9IHRoaXMuem9uZUZvcm0uZ2V0UmF3VmFsdWUoKTsgLy9iZWNhdXNlIHdlIG5lZWQgdmFsdWVzIG9mIGRpc2FibGVzIGNvbnRyb2xzIGFzIHdlbGxcclxuICAgIGlmIChmb3JtVmFsdWUubmV3TGF5ZXIpIHtcclxuICAgICAgYXdhaXQgdGhpcy5jcmVhdGVMYXllcihmb3JtVmFsdWUubmV3TGF5ZXIpLnRoZW4oKGxheWVyKSA9PiB7XHJcbiAgICAgICAgZm9ybVZhbHVlLmxheWVySUQgPSBsYXllci5pZDtcclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgICBpZiAoIWZvcm1WYWx1ZS5jb2RlX3JlZikge1xyXG4gICAgICBmb3JtVmFsdWUuY29kZV9yZWYgPSBudWxsO1xyXG4gICAgfVxyXG4gICAgY29uc3Qgem9uZUlucHV0ID0ge1xyXG4gICAgICBuYW1lOiBmb3JtVmFsdWUubmFtZSxcclxuICAgICAgY29kZV9yZWY6IGZvcm1WYWx1ZS5jb2RlX3JlZixcclxuICAgICAgc3VyZmFjZTogTWF0aC5yb3VuZChmb3JtVmFsdWUuc3VyZmFjZSAqIDEwMCkgLyAxMDAsXHJcbiAgICAgIHNwYWNlSUQ6IHRoaXMuc3BhY2VJRCxcclxuICAgICAgbGF5ZXJJRDogZm9ybVZhbHVlLmxheWVySUQsXHJcbiAgICAgIHBhcmVudElEOiBmb3JtVmFsdWUucGFyZW50SUQsXHJcbiAgICAgIGlzTXVzZXVtVmlzaXRab25lOiB0aGlzLmlzTXVzZXVtVmlzaXQsXHJcbiAgICAgIGlzTXVsdGlwbGVGbG9vclpvbmU6IHRoaXMubXVsdGlwbGVGbG9vcnMsXHJcbiAgICAgIHN3ZWVwSURzOiBbXSxcclxuICAgICAgc3RhcnRTd2VlcElEOiBmb3JtVmFsdWUuc3RhcnRTd2VlcElELFxyXG4gICAgfSBhcyBab25lO1xyXG5cclxuICAgIHRyeSB7XHJcbiAgICAgIHRoaXMuem9uZUZvcm0gPSBudWxsO1xyXG4gICAgICB0aGlzLmlzU3VibWl0dGVkID0gZmFsc2U7XHJcbiAgICAgIGlmICh0aGlzLnpvbmVFZGl0KSB7XHJcbiAgICAgICAgY29uc3Qgem9uZVVwZGF0ZSA9IHpvbmVJbnB1dDtcclxuICAgICAgICB6b25lVXBkYXRlLnN3ZWVwSURzID0gdGhpcy56b25lRWRpdC5zd2VlcElEcztcclxuICAgICAgICB6b25lVXBkYXRlLmlkID0gZm9ybVZhbHVlLmlkO1xyXG4gICAgICAgIGF3YWl0IHRoaXMuc2V0U3dlZXBzQW5kTm9kZUZvclpvbmVJbnB1dCh6b25lVXBkYXRlKTtcclxuICAgICAgICBhd2FpdCB0aGlzLnpvbmVTZXJ2aWNlLnVwZGF0ZVpvbmUoem9uZVVwZGF0ZSk7XHJcbiAgICAgICAgdGhpcy56b25lRWRpdCA9IG51bGw7XHJcbiAgICAgICAgdGhpcy51cGRhdGVkWm9uZS5lbWl0KHpvbmVVcGRhdGUuaWQpO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGF3YWl0IHRoaXMuc2V0U3dlZXBzQW5kTm9kZUZvclpvbmVJbnB1dCh6b25lSW5wdXQpO1xyXG4gICAgICAgIGlmICghem9uZUlucHV0LnBhcmVudElEKSB7XHJcbiAgICAgICAgICAvLyBzZXQgYnVpbGRpbmcgYXMgcGFyZW50XHJcbiAgICAgICAgICB6b25lSW5wdXQucGFyZW50SUQgPSB0aGlzLmRlZmF1bHRab25lLmlkO1xyXG4gICAgICAgIH1cclxuICAgICAgICBhd2FpdCB0aGlzLnpvbmVTZXJ2aWNlLmNyZWF0ZSh6b25lSW5wdXQpLnRoZW4oKHpvbmVDcmVhdGVkKSA9PiB7XHJcbiAgICAgICAgICB0aGlzLnVwZGF0ZWRab25lLmVtaXQoem9uZUNyZWF0ZWQuaWQpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICB9XHJcbiAgICB9IGNhdGNoIChlcnJvcikge1xyXG4gICAgICBjb25zb2xlLmVycm9yKGVycm9yKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIG9uQ2FuY2VsKCkge1xyXG4gICAgdGhpcy5pc1N1Ym1pdHRlZCA9IGZhbHNlO1xyXG4gICAgdGhpcy56b25lRm9ybSA9IG51bGw7XHJcbiAgICB0aGlzLmNob3NlblNjYW5zT25QbGFuID0gW107XHJcbiAgICB0aGlzLmNob3NlblNjYW5zID0gW107XHJcbiAgICB0aGlzLnVwZGF0ZWRab25lLmVtaXQoZmFsc2UpO1xyXG4gIH1cclxuXHJcbiAgZ2V0IG5hbWUoKTogQWJzdHJhY3RDb250cm9sIHtcclxuICAgIHJldHVybiB0aGlzLnpvbmVGb3JtLmdldCgnbmFtZScpO1xyXG4gIH1cclxuXHJcbiAgZ2V0IG5ld0xheWVyKCk6IEFic3RyYWN0Q29udHJvbCB7XHJcbiAgICByZXR1cm4gdGhpcy56b25lRm9ybS5nZXQoJ25ld0xheWVyJyk7XHJcbiAgfVxyXG5cclxuICB0b2dnbGVDYXJvdXNlbCgpIHtcclxuICAgIHRoaXMuY2Fyb3VzZWxJc1Zpc2libGUgPSB0cnVlO1xyXG4gICAgdGhpcy5jaG9zZW5TY2Fuc09uUGxhbiA9IFtdO1xyXG4gIH1cclxuXHJcbiAgdG9nZ2xlUGxhbigpIHtcclxuICAgIHRoaXMuZnJvbVBsYW4gPSB0cnVlO1xyXG4gICAgdGhpcy5jaG9zZW5TY2FucyA9IFtdO1xyXG4gIH1cclxuXHJcbiAgb25BZGRTY2FuKCkge1xyXG4gICAgaWYgKCF0aGlzLmNob3NlblNjYW5zLmluY2x1ZGVzKHRoaXMuY3VycmVudFNjYW5TaG93aW5nKSkge1xyXG4gICAgICAvLyBjb25zb2xlLmxvZyhcImFkZGluZyBzY2FuXCIsIHRoaXMuY3VycmVudFNjYW5TaG93aW5nKTtcclxuICAgICAgdGhpcy5jaG9zZW5TY2Fucy5wdXNoKHRoaXMuY3VycmVudFNjYW5TaG93aW5nKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGFsZXJ0KCdTY2FuIGFscmVhZHkgYWRkZWQhJyk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBvblJlbW92ZVNjYW5JbWFnZShzY2FuOiBhbnkpIHtcclxuICAgIGNvbnN0IGluZGV4ID0gdGhpcy5jaG9zZW5TY2Fucy5pbmRleE9mKHNjYW4pO1xyXG4gICAgdGhpcy5jaG9zZW5TY2Fucy5zcGxpY2UoaW5kZXgsIDEpO1xyXG4gIH1cclxuXHJcbiAgb25SZW1vdmVTY2FuUGxhbihzY2FuOiBhbnkpIHtcclxuICAgIGNvbnN0IGluZGV4ID0gdGhpcy5jaG9zZW5TY2Fuc09uUGxhbi5pbmRleE9mKHNjYW4pO1xyXG4gICAgdGhpcy5jaG9zZW5TY2Fuc09uUGxhbi5zcGxpY2UoaW5kZXgsIDEpO1xyXG4gIH1cclxuXHJcbiAgYXN5bmMgc2V0U3dlZXBzQW5kTm9kZUZvclpvbmVJbnB1dCh6b25lSW5wdXQ6IFpvbmUpIHtcclxuICAgIGlmIChcclxuICAgICAgdGhpcy5jaG9zZW5TY2Fucy5sZW5ndGggPiAwICYmXHJcbiAgICAgIHRoaXMuY2hvc2VuU2NhbnMubGVuZ3RoICE9PSB0aGlzLnpvbmVJbml0aWFsTmF2Q291bnQgJiZcclxuICAgICAgIXRoaXMuZnJvbVBsYW5cclxuICAgICkge1xyXG4gICAgICAvLyBpZiB3ZSBjaG9zZSBzY2FucyBmcm9tIHRoZSBjYXJvdXNlbFxyXG4gICAgICBjb25zdCBzd2VlcElEczogc3RyaW5nW10gPSBbXTtcclxuICAgICAgdGhpcy5jaG9zZW5TY2Fucy5tYXAoYXN5bmMgKHNjYW4pID0+IHtcclxuICAgICAgICBjb25zdCBpbWFnZVV1aWQgPSB0aGlzLmltYWdlczM2MFtzY2FuXS5maWxlbmFtZS5zcGxpdCgnXycpWzBdO1xyXG4gICAgICAgIGNvbnN0IHN3ZWVwSUQgPSB0aGlzLm5hdmlnYXRpb25JRHMuZmluZCgobmF2KSA9PiB7XHJcbiAgICAgICAgICByZXR1cm4gbmF2LmluY2x1ZGVzKGltYWdlVXVpZCk7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgaWYgKHN3ZWVwSUQpIHtcclxuICAgICAgICAgIHN3ZWVwSURzLnB1c2goc3dlZXBJRCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgICAgem9uZUlucHV0LnN3ZWVwSURzID0gc3dlZXBJRHM7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICAvLyB3ZSBhcmUgbm90IGNvbWluZyBmcm9tIGdhbGxlcnkgY2hvaWNlXHJcbiAgICAgIGlmICh0aGlzLmNob3NlblNjYW5zT25QbGFuLmxlbmd0aCA+IDApIHtcclxuICAgICAgICB6b25lSW5wdXQuc3dlZXBJRHMgPSB0aGlzLmNob3NlblNjYW5zT25QbGFuO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHpvbmVJbnB1dC5zd2VlcElEcyAmJiB6b25lSW5wdXQuc3dlZXBJRHMubGVuZ3RoID4gMCkge1xyXG4gICAgICBjb25zdCBuYXZGb3JTd2VlcCA9XHJcbiAgICAgICAgYXdhaXQgdGhpcy5uYXZpZ2F0aW9uU2VydmljZS5nZXROYXZpZ2F0aW9uc0Zvck1hdHRlcnBvcnRJREZvclNwYWNlKFxyXG4gICAgICAgICAgem9uZUlucHV0LnN3ZWVwSURzWzBdLFxyXG4gICAgICAgICAgdGhpcy5zcGFjZUlEXHJcbiAgICAgICAgKTtcclxuICAgICAgem9uZUlucHV0Lm5vZGVJRHMgPSBbbmF2Rm9yU3dlZXBbMF0ubm9kZUlEXTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGFzeW5jIGNyZWF0ZUxheWVyKG5hbWU6IHN0cmluZyk6IFByb21pc2U8TGF5ZXI+IHtcclxuICAgIHJldHVybiB0aGlzLmxheWVyU2VydmljZS5jcmVhdGVMYXllckZvck9yZ2FuaXNhdGlvbihcclxuICAgICAgbmFtZSxcclxuICAgICAgdGhpcy5jdXJyZW50T3JnSWRcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICBhc3luYyBsb2FkTmF2aWdhdGlvbnMoKTogUHJvbWlzZTxhbnk+IHtcclxuICAgIGlmICh0aGlzLnpvbmVFZGl0LnN3ZWVwSURzLmxlbmd0aCA+IDApIHtcclxuICAgICAgdGhpcy56b25lSW5pdGlhbE5hdkNvdW50ID0gdGhpcy56b25lRWRpdC5zd2VlcElEcy5sZW5ndGg7XHJcbiAgICAgIGNvbnN0IG5hdkxpc3Q6IG51bWJlcltdID0gW107XHJcbiAgICAgIGNvbnN0IHNjYW5zWm9uZUVkaXQ6IHN0cmluZ1tdID0gW107XHJcbiAgICAgIGF3YWl0IFByb21pc2UuYWxsKFxyXG4gICAgICAgIHRoaXMuem9uZUVkaXQuc3dlZXBJRHMubWFwKGFzeW5jIChzd2VlcElEOiBzdHJpbmcpID0+IHtcclxuICAgICAgICAgIHNjYW5zWm9uZUVkaXQucHVzaChzd2VlcElEKTtcclxuICAgICAgICAgIGNvbnN0IGluZGV4ID0gdGhpcy5pbWFnZXMzNjAuZmluZEluZGV4KChpbSkgPT4ge1xyXG4gICAgICAgICAgICByZXR1cm4gaW0uZmlsZW5hbWUuaW5jbHVkZXMoc3dlZXBJRC5zbGljZSgwLCA4KSk7XHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICAgIGlmIChpbmRleCAhPT0gLTEpIHtcclxuICAgICAgICAgICAgbmF2TGlzdC5wdXNoKGluZGV4KTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9KVxyXG4gICAgICApO1xyXG4gICAgICB0aGlzLmNob3NlblNjYW5zID0gbmF2TGlzdDtcclxuICAgICAgdGhpcy5jaG9zZW5TY2Fuc09uUGxhbiA9IHNjYW5zWm9uZUVkaXQ7XHJcbiAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcclxuICAgIH1cclxuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcclxuICB9XHJcblxyXG4gIC8vIGluaVBsYW5Gb3JEcmF3KCkge1xyXG4gIC8vICAgICB0aGlzLnRvZ2dsZVBsYW4oKTtcclxuICAvLyAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgLy8gICAgICAgICB0aGlzLm9uUGxhbkNsaWNrKCk7XHJcbiAgLy8gICAgIH0sIDUwMCk7XHJcbiAgLy8gfVxyXG5cclxuICAvKipcclxuICAgKiBBZGRzIGFsbCBzd2VlcHMgb2YgdGhlIHNwYWNlXHJcbiAgICovXHJcbiAgb25BZGRBbGwoKSB7XHJcbiAgICBjb25zdCBkZWZhdWx0Wm9uZSA9IHRoaXMuZ2V0RGVmYXVsdFpvbmUoKTtcclxuICAgIGlmIChkZWZhdWx0Wm9uZSkge1xyXG4gICAgICB0aGlzLmNob3NlblNjYW5zT25QbGFuID0gZGVmYXVsdFpvbmUuc3dlZXBJRHM7XHJcbiAgICAgIHRoaXMuem9uZUZvcm0uZ2V0KCdwYXJlbnRJRCcpLnNldFZhbHVlKGRlZmF1bHRab25lLmlkKTtcclxuICAgICAgdGhpcy56b25lRm9ybS5nZXQoJ3BhcmVudElEJykuZGlzYWJsZSgpO1xyXG4gICAgICB0aGlzLm11bHRpcGxlRmxvb3JzID0gdHJ1ZTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGdldERlZmF1bHRab25lKCk6IFpvbmUge1xyXG4gICAgcmV0dXJuIHRoaXMuem9uZXMuZmluZChcclxuICAgICAgKHpvbmUpID0+XHJcbiAgICAgICAgem9uZS5sYXllciAmJlxyXG4gICAgICAgIHpvbmUubGF5ZXIubmFtZSA9PT0gJ0JVSUxESU5HJyAmJlxyXG4gICAgICAgIHpvbmUuc3dlZXBJRHMgJiZcclxuICAgICAgICB6b25lLnN3ZWVwSURzLmxlbmd0aCA+IDBcclxuICAgICk7XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIE11bHRpcGxlIGZsb29yc1xyXG4gICAqL1xyXG4gIG9uQ2hhbmdlTXVsdGlwbGVGbG9vcnMoKSB7XHJcbiAgICBpZiAodGhpcy5tdWx0aXBsZUZsb29ycykge1xyXG4gICAgICBjb25zdCBkZWZhdWx0Wm9uZSA9IHRoaXMuZ2V0RGVmYXVsdFpvbmUoKTtcclxuICAgICAgaWYgKGRlZmF1bHRab25lKSB7XHJcbiAgICAgICAgdGhpcy56b25lRm9ybS5nZXQoJ3BhcmVudElEJykuc2V0VmFsdWUoZGVmYXVsdFpvbmUuaWQpO1xyXG4gICAgICAgIHRoaXMuem9uZUZvcm0uZ2V0KCdwYXJlbnRJRCcpLmRpc2FibGUoKTtcclxuICAgICAgfVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy56b25lRm9ybS5nZXQoJ3BhcmVudElEJykuZW5hYmxlKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBvblNlbGVjdGVkU3dlZXBzRnJvbVBsYW4ocmVzdWx0OiB7IHN3ZWVwczogc3RyaW5nW107IHN0YXJ0U3dlZXBJRDogc3RyaW5nIH0pIHtcclxuICAgIGlmIChyZXN1bHQpIHtcclxuICAgICAgaWYgKHJlc3VsdC5zd2VlcHMpIHtcclxuICAgICAgICB0aGlzLmNob3NlblNjYW5zT25QbGFuID0gcmVzdWx0LnN3ZWVwcztcclxuICAgICAgfVxyXG4gICAgICBpZiAocmVzdWx0LnN0YXJ0U3dlZXBJRCkge1xyXG4gICAgICAgIHRoaXMuem9uZUZvcm0uY29udHJvbHMuc3RhcnRTd2VlcElELnNldFZhbHVlKHJlc3VsdC5zdGFydFN3ZWVwSUQpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICB0aGlzLmZyb21QbGFuID0gZmFsc2U7XHJcbiAgfVxyXG5cclxuICBsYXllck5hbWVWYWxpZGF0b3IoKTogVmFsaWRhdG9yRm4ge1xyXG4gICAgcmV0dXJuIChjb250cm9sOiBBYnN0cmFjdENvbnRyb2wpOiBWYWxpZGF0aW9uRXJyb3JzIHwgbnVsbCA9PiB7XHJcbiAgICAgIGlmICghY29udHJvbC52YWx1ZSkge1xyXG4gICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICB9XHJcbiAgICAgIGNvbnN0IGZvcmJpZGRlbiA9IHRoaXMubGF5ZXJzXHJcbiAgICAgICAgLm1hcCgobCkgPT4gbC5uYW1lLnRvTG93ZXJDYXNlKCkpXHJcbiAgICAgICAgLmluY2x1ZGVzKGNvbnRyb2wudmFsdWUudG9Mb3dlckNhc2UoKSk7XHJcbiAgICAgIHJldHVybiBmb3JiaWRkZW4gPyB7IGZvcmJpZGRlbk5hbWU6IHsgdmFsdWU6IGNvbnRyb2wudmFsdWUgfSB9IDogbnVsbDtcclxuICAgIH07XHJcbiAgfVxyXG59XHJcbiIsIjxkaXYgY2xhc3M9XCJtYWluLWNvbnRhaW5lclwiICpuZ0lmPVwiem9uZUZvcm1cIj5cclxuICAgIDxkaXYgY2xhc3M9XCJjb2wtN1wiPlxyXG4gICAgICAgIDxmb3JtIChuZ1N1Ym1pdCk9XCJvblN1Ym1pdFpvbmUoKVwiIFtmb3JtR3JvdXBdPVwiem9uZUZvcm1cIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1iLTMgcm93XCI+XHJcbiAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJjb2wtc20tMiBjb2wtZm9ybS1sYWJlbFwiPnt7J05hbWUnIHwgdHJhbnNsYXRlfX0gKjwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLXNtLTEwXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiByZXF1aXJlZCBmb3JtQ29udHJvbE5hbWU9XCJuYW1lXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPCEtLSA8ZGl2IGNsYXNzPVwiaW52YWxpZC1mZWVkYmFja1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICB7eydBIG5hbWUgaXMgcmVxdWlyZWQnIHwgdHJhbnNsYXRlfX1cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj4gLS0+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtYi0zIHJvd1wiPlxyXG4gICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiY29sLXNtLTIgY29sLWZvcm0tbGFiZWxcIj57eydjb2RlUmVmJyB8IHRyYW5zbGF0ZX19PC9sYWJlbD5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtc20tMTBcIj5cclxuICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBjbGFzcz1cImZvcm0tY29udHJvbFwiIHJlcXVpcmVkIGZvcm1Db250cm9sTmFtZT1cImNvZGVfcmVmXCI+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtYi0zIHJvd1wiICpuZ0lmPVwiIWlzTXVzZXVtVmlzaXQgJiYgIXpvbmVJc01hdHRlcnBvcnRGbG9vclwiPlxyXG4gICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiY29sLXNtLTIgY29sLWZvcm0tbGFiZWxcIj57eydUeXBlIG9mIHpvbmUnIHwgdHJhbnNsYXRlfX08L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1zbS0xMFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxzZWxlY3QgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiBmb3JtQ29udHJvbE5hbWU9XCJsYXllcklEXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJudWxsXCIgc2VsZWN0ZWQgZGlzYWJsZWQgaGlkZGVuPiB7eyB6b25lRWRpdCAmJiB6b25lRWRpdC5sYXllciA/XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB6b25lRWRpdC5sYXllci5uYW1lIDogJ0Nob29zZSB0eXBlJ319PC9vcHRpb24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gKm5nRm9yPVwibGV0IGxheWVyIG9mIGxheWVyc1wiIFt2YWx1ZV09XCJsYXllci5pZFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgbGF5ZXIubmFtZSB9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L29wdGlvbj5cclxuICAgICAgICAgICAgICAgICAgICA8L3NlbGVjdD5cclxuICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz1cIm10LTEgbmV3LXR5cGUtdGV4dFwiPnt7J29yIGFkZCBuZXcgdHlwZSBvZiB6b25lJyB8IHRyYW5zbGF0ZSB9fTwvcD5cclxuICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBjbGFzcz1cImZvcm0tY29udHJvbCBuZXctdHlwZS1pbnB1dFwiIGZvcm1Db250cm9sTmFtZT1cIm5ld0xheWVyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cIm5ld0xheWVyLmludmFsaWQgJiYgKG5ld0xheWVyLmRpcnR5IHx8IG5ld0xheWVyLnRvdWNoZWQpXCIgY2xhc3M9XCJ0ZXh0LWRhbmdlclwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwibmV3TGF5ZXIuZXJyb3JzPy5bJ2ZvcmJpZGRlbk5hbWUnXVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge3snTGF5ZXIgZXhpc3RzIGFscmVhZHknIHwgdHJhbnNsYXRlfX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwhLS1JZiBFZGl0aW5nIFpvbmUgcG9zc2liaWxpdHkgdG8gYXNzaWduIGl0IHRvIG11c2V1bSBpdGluZXJhcnktLT5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1iLTMgcm93XCIgKm5nSWY9XCJ6b25lRWRpdCAmJiAhem9uZUlzTWF0dGVycG9ydEZsb29yXCI+XHJcbiAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJjb2wtc20tMiBjb2wtZm9ybS1sYWJlbFwiPnt7ICdNdXNldW0gSXRpbmVyYXJ5JyB8IHRyYW5zbGF0ZSB9fTwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLXNtLTEwXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGlucHV0IGNsYXNzPVwiY2hlY2tib3gtYXBwbHkgbXQtM1wiIHR5cGU9XCJjaGVja2JveFwiIFsobmdNb2RlbCldPVwiaXNNdXNldW1WaXNpdFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtuZ01vZGVsT3B0aW9uc109XCJ7c3RhbmRhbG9uZTogdHJ1ZX1cIj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtYi0zIHJvd1wiICpuZ0lmPVwiIXpvbmVFZGl0IHx8IHpvbmVFZGl0LmlzTXVsdGlwbGVGbG9vclpvbmVcIj5cclxuICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImNvbC1zbS0yIGNvbC1mb3JtLWxhYmVsXCI+e3sgJ011bHRpcGxlIEZsb29ycycgfCB0cmFuc2xhdGUgfX08L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1zbS0xMFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxpbnB1dCBjbGFzcz1cImNoZWNrYm94LWFwcGx5IG10LTNcIiB0eXBlPVwiY2hlY2tib3hcIiBbKG5nTW9kZWwpXT1cIm11bHRpcGxlRmxvb3JzXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cInpvbmVFZGl0ICE9PSB1bmRlZmluZWQgJiYgem9uZUVkaXQgIT09IG51bGxcIiAoY2hhbmdlKT1cIm9uQ2hhbmdlTXVsdGlwbGVGbG9vcnMoKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtuZ01vZGVsT3B0aW9uc109XCJ7c3RhbmRhbG9uZTogdHJ1ZX1cIj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSd0ZXh0LWRhbmdlcicgKm5nSWY9XCJ6b25lRWRpdFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICB7eydjYW5ub3RDaGFuZ2VNdWx0aWZsb29yJyB8IHRyYW5zbGF0ZX19XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1iLTMgcm93XCI+XHJcbiAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJjb2wtc20tMiBjb2wtZm9ybS1sYWJlbFwiPnt7J1N1cmZhY2UnIHwgdHJhbnNsYXRlfX08L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1zbS0xMFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGNsYXNzPVwiZm9ybS1jb250cm9sXCIgZm9ybUNvbnRyb2xOYW1lPVwic3VyZmFjZVwiPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1iLTMgcm93XCIgKm5nSWY9XCIhem9uZUlzTWF0dGVycG9ydEZsb29yXCI+XHJcbiAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJjb2wtc20tMiBjb2wtZm9ybS1sYWJlbFwiPnt7J1BhcmVudCB6b25lJyB8IHRyYW5zbGF0ZX19PC9sYWJlbD5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtc20tMTBcIj5cclxuICAgICAgICAgICAgICAgICAgICA8aW5wdXQgKm5nSWY9XCJ6b25lRWRpdFwiIHR5cGU9XCJ0ZXh0XCIgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiBmb3JtQ29udHJvbE5hbWU9XCJwYXJlbnRcIj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC1kYW5nZXJcIiAqbmdJZj1cInpvbmVFZGl0XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHt7J2Nhbm5vdENoYW5nZVBhcmVudCcgfCB0cmFuc2xhdGV9fVxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDxzZWxlY3QgKm5nSWY9XCIhem9uZUVkaXRcIiBjbGFzcz1cImZvcm0tY29udHJvbFwiIGZvcm1Db250cm9sTmFtZT1cInBhcmVudElEXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gKm5nRm9yPVwibGV0IHpvbmUgb2YgcGFyZW50Wm9uZXNcIiBbbmdWYWx1ZV09XCJ6b25lLmlkXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyB6b25lLm5hbWUgfX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9vcHRpb24+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9zZWxlY3Q+XHJcblxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1iLTMgcm93XCIgc3R5bGU9XCJtYXgtaGVpZ2h0OiAyMDBweDsgb3ZlcmZsb3c6IGF1dG87XCIgKm5nSWY9XCIhem9uZUlzTWF0dGVycG9ydEZsb29yXCI+XHJcbiAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJjb2wtc20tMiBjb2wtZm9ybS1sYWJlbFwiPnt7J1NjYW4gUG9pbnRzJyB8IHRyYW5zbGF0ZX19PC9sYWJlbD5cclxuICAgICAgICAgICAgICAgIDwhLS0gPHAgY2xhc3M9XCJjb2wtc20tMlwiICpuZ0lmPVwiem9uZUVkaXRcIj57eyB6b25lRWRpdC5zd2VlcElEcy5sZW5ndGggfX0gc2NhbnM8L3A+IC0tPlxyXG4gICAgICAgICAgICAgICAgPHAgY2xhc3M9XCJjb2xcIiAqbmdJZj1cImNob3NlblNjYW5zT25QbGFuLmxlbmd0aCA9PT0gMCAmJiBjaG9zZW5TY2Fucy5sZW5ndGggPT09IDBcIj5cclxuICAgICAgICAgICAgICAgICAgICB7eydObyBzY2FuIHBvaW50cyBjaG9zZW4nIHwgdHJhbnNsYXRlfX08L3A+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLXNtLTVcIiAqbmdJZj1cImNob3NlblNjYW5zT25QbGFuICYmIGNob3NlblNjYW5zT25QbGFuLmxlbmd0aCA+IDBcIj5cclxuICAgICAgICAgICAgICAgICAgICA8cD57eyBjaG9zZW5TY2Fuc09uUGxhbi5sZW5ndGggfX0ge3snc2NhbiBwb2ludHMgY2hvc2VuJyB8IHRyYW5zbGF0ZX19PC9wPlxyXG4gICAgICAgICAgICAgICAgICAgIDwhLS0gPGRpdiAqbmdGb3I9XCJsZXQgc2NhbiBvZiBjaG9zZW5TY2Fuc09uUGxhblwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicm93XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz1cIm1lLTJcIj57eyBzY2FuIHwgc2xpY2U6MDo4IH19PC9wPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiAoY2xpY2spPVwib25SZW1vdmVTY2FuUGxhbihzY2FuKVwiIFtzdHlsZS5jdXJzb3JdPVwiJ3BvaW50ZXInXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJpY29uaWZ5XCIgZGF0YS1pY29uPVwibWRpOnRyYXNoLWNhbi1vdXRsaW5lXCI+PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PiAtLT5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1zbS01XCIgKm5nSWY9XCJjYXJvdXNlbElzVmlzaWJsZSAmJiBjaG9zZW5TY2FucyAmJiBjaG9zZW5TY2Fucy5sZW5ndGggPiAwXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPHA+e3sgY2hvc2VuU2NhbnMubGVuZ3RoIH19IHt7J3NjYW4gcG9pbnRzIGNob3NlbicgfCB0cmFuc2xhdGV9fTwvcD5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0Zvcj1cImxldCBzY2FuIG9mIGNob3NlblNjYW5zXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3dcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPVwibWUtMlwiPnt7IGltYWdlczM2MFtzY2FuXS5maWxlbmFtZSB9fTwvcD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgKGNsaWNrKT1cIm9uUmVtb3ZlU2NhbkltYWdlKHNjYW4pXCIgW3N0eWxlLmN1cnNvcl09XCIncG9pbnRlcidcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImljb25pZnlcIiBkYXRhLWljb249XCJtZGk6dHJhc2gtY2FuLW91dGxpbmVcIj48L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwicm93IG1iLTMgbXQtM1wiICpuZ0lmPVwiIXpvbmVJc01hdHRlcnBvcnRGbG9vclwiPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuIGJ0bi1vdXRsaW5lLXByaW1hcnkgcm91bmRlZC1waWxsIG1lLTJcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwidG9nZ2xlUGxhbigpXCI+e3snQ2hvb3NlIHNjYW4gcG9pbnRzIG9uIHBsYW4nIHxcclxuICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNsYXRlfX08L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0biBidG4tb3V0bGluZS1wcmltYXJ5IHJvdW5kZWQtcGlsbCBtZS0yXCIgKGNsaWNrKT1cInRvZ2dsZUNhcm91c2VsKClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiZnJvbVBsYW4gfHwgIWltYWdlczM2MCB8fCBpbWFnZXMzNjAubGVuZ3RoID09PSAwXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHt7J0Nob29zZSBzY2FuIHBvaW50cyBmcm9tIGdhbGxlcnknIHwgdHJhbnNsYXRlfX08L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0biBidG4tb3V0bGluZS1wcmltYXJ5IHJvdW5kZWQtcGlsbCBtZS0yXCIgKGNsaWNrKT1cIm9uQWRkQWxsKClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiZnJvbVBsYW4gfHwgIWltYWdlczM2MCB8fCBpbWFnZXMzNjAubGVuZ3RoID09PSAwXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHt7J2FkZC1hbGwtc2NhbnMnIHwgdHJhbnNsYXRlfX08L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgIDwhLS0gPGRpdiBjbGFzcz1cIm1iLTMgcm93XCI+XHJcbiAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJjb2wtc20tMyBjb2wtZm9ybS1sYWJlbFwiPnt7J05vIHZpc2libGUgc2NhbiBwb2ludHMnIHwgdHJhbnNsYXRlfX08L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1zbS0zXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGlucHV0IGNsYXNzPVwiY2hlY2tib3gtYXBwbHkgbXQtM1wiIHR5cGU9XCJjaGVja2JveFwiIFsobmdNb2RlbCldPVwibm9TY2FuUG9pbnRzXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW25nTW9kZWxPcHRpb25zXT1cIntzdGFuZGFsb25lOiB0cnVlfVwiPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PiAtLT5cclxuXHJcbiAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJjYXJvdXNlbElzVmlzaWJsZVwiIGNsYXNzPVwibWItMlwiPlxyXG4gICAgICAgICAgICAgICAgPGxpYi1jYXJvdXNlbCAqbmdJZj1cImltYWdlczM2MCAmJiBpbWFnZXMzNjAubGVuZ3RoID4gMFwiIFtpbWFnZXNdPVwiaW1hZ2VzMzYwXCJcclxuICAgICAgICAgICAgICAgICAgICAoY3VycmVudFNjYW4pPVwiY3VycmVudFNjYW5TaG93aW5nPSRldmVudFwiPjwvbGliLWNhcm91c2VsPlxyXG4gICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4gYnRuLW91dGxpbmUtcHJpbWFyeSByb3VuZGVkLXBpbGwgbWUtMiBtdC0zXCJcclxuICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwib25BZGRTY2FuKClcIj57eydBZGQgdG8gem9uZScgfCB0cmFuc2xhdGV9fTwvYnV0dG9uPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm10LTNcIj5cclxuICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cInN1Ym1pdFwiIGNsYXNzPVwiYnRuIGJ0bi1wcmltYXJ5IHJvdW5kZWQtcGlsbCBtZS0yXCJcclxuICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiZnJvbVBsYW4gfHwgIXpvbmVGb3JtLnZhbGlkXCI+e3snU2F2ZScgfCB0cmFuc2xhdGV9fTwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgKGNsaWNrKT1cIm9uQ2FuY2VsKClcIiBjbGFzcz1cImJ0biBidG4tb3V0bGluZS1wcmltYXJ5IHJvdW5kZWQtcGlsbCBtZS0yXCI+XHJcbiAgICAgICAgICAgICAgICAgICAge3snQ2FuY2VsJyB8IHRyYW5zbGF0ZX19PC9idXR0b24+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZm9ybT5cclxuICAgIDwvZGl2PlxyXG4gICAgPGRpdiBjbGFzcz1cImVkaXQtcGxhblwiICpuZ0lmPVwiZnJvbVBsYW5cIj5cclxuICAgICAgICA8bGliLXN3ZWVwLXBsYW4tc2VsZWN0aW9uIHN0eWxlPVwid2lkdGg6IDEwMCU7XCIgW25ld1pvbmVEYXRhXT1cIm5ld1pvbmVEYXRhRnJvbUVkaXRvclwiIFtzcGFjZUlEXT1cInNwYWNlSURcIlxyXG4gICAgICAgICAgICBbbXVsdGlwbGVGbG9vcnNdPVwibXVsdGlwbGVGbG9vcnNcIiBbaW5wdXRab25lXT1cInpvbmVFZGl0XCJcclxuICAgICAgICAgICAgKHN3ZWVwc1NlbGVjdGVkKT1cIm9uU2VsZWN0ZWRTd2VlcHNGcm9tUGxhbigkZXZlbnQpXCI+PC9saWItc3dlZXAtcGxhbi1zZWxlY3Rpb24+XHJcbiAgICA8L2Rpdj5cclxuPC9kaXY+Il19
|
|
315
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWRkLXpvbmUuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LXNtYXJ0ZXJwbGFuLWxvY2F0aW9ucy9zcmMvbGliL2NvbXBvbmVudHMvem9uZXMvYWRkLXpvbmUvYWRkLXpvbmUuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LXNtYXJ0ZXJwbGFuLWxvY2F0aW9ucy9zcmMvbGliL2NvbXBvbmVudHMvem9uZXMvYWRkLXpvbmUvYWRkLXpvbmUuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFVLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMvRSxPQUFPLEVBR0wsVUFBVSxHQUlYLE1BQU0sZ0JBQWdCLENBQUM7Ozs7Ozs7O0FBZXhCLE1BQU0sT0FBTyxnQkFBZ0I7SUErQzNCLFlBQ1UsRUFBZSxFQUNmLFdBQXdCLEVBQ3hCLFlBQTBCLEVBQzFCLFdBQTRCLEVBQzVCLGlCQUFvQztRQUpwQyxPQUFFLEdBQUYsRUFBRSxDQUFhO1FBQ2YsZ0JBQVcsR0FBWCxXQUFXLENBQWE7UUFDeEIsaUJBQVksR0FBWixZQUFZLENBQWM7UUFDMUIsZ0JBQVcsR0FBWCxXQUFXLENBQWlCO1FBQzVCLHNCQUFpQixHQUFqQixpQkFBaUIsQ0FBbUI7UUF2Q3BDLGdCQUFXLEdBQUcsSUFBSSxZQUFZLEVBQU8sQ0FBQztRQUl2QyxrQkFBYSxHQUFZLEtBQUssQ0FBQztRQUl4QyxnQkFBVyxHQUFXLEVBQUUsQ0FBQztRQUV6QixzQkFBaUIsR0FBRyxLQUFLLENBQUM7UUFJMUIsZ0JBQVcsR0FBRyxLQUFLLENBQUM7UUFJcEIsZ0JBQVcsR0FBYSxFQUFFLENBQUM7UUFJM0IsYUFBUSxHQUFZLEtBQUssQ0FBQztRQUUxQixzQkFBaUIsR0FBYSxFQUFFLENBQUM7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QUM7WUFDekMsT0FBTyxTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUUsYUFBYSxFQUFFLEVBQUUsS0FBSyxFQUFFLE9BQU8sQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7UUFDeEUsQ0FBQyxDQUFDO0lBQ0osQ0FBQzs7NkdBaFdVLGdCQUFnQjtpR0FBaEIsZ0JBQWdCLGlXQ3ZCN0IsaXZTQXdKTTsyRkRqSU8sZ0JBQWdCO2tCQUw1QixTQUFTOytCQUNFLGNBQWM7cU5BS2YsUUFBUTtzQkFBaEIsS0FBSztnQkFFRyxPQUFPO3NCQUFmLEtBQUs7Z0JBRUcsU0FBUztzQkFBakIsS0FBSztnQkFFRyxhQUFhO3NCQUFyQixLQUFLO2dCQUVHLEtBQUs7c0JBQWIsS0FBSztnQkFFRyxxQkFBcUI7c0JBQTdCLEtBQUs7Z0JBRUksV0FBVztzQkFBcEIsTUFBTTtnQkFFRSxVQUFVO3NCQUFsQixLQUFLO2dCQUVHLGFBQWE7c0JBQXJCLEtBQUs7Z0JBRUcsV0FBVztzQkFBbkIsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgRXZlbnRFbWl0dGVyLCBJbnB1dCwgT25Jbml0LCBPdXRwdXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHtcclxuICBGb3JtR3JvdXAsXHJcbiAgRm9ybUJ1aWxkZXIsXHJcbiAgVmFsaWRhdG9ycyxcclxuICBBYnN0cmFjdENvbnRyb2wsXHJcbiAgVmFsaWRhdG9yRm4sXHJcbiAgVmFsaWRhdGlvbkVycm9ycyxcclxufSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XHJcbmltcG9ydCB7XHJcbiAgWm9uZSxcclxuICBQbGFuLFxyXG4gIExheWVyLFxyXG4gIFpvbmVTZXJ2aWNlLFxyXG4gIExheWVyU2VydmljZSxcclxuICBCYXNlVXNlclNlcnZpY2UsXHJcbiAgTmF2aWdhdGlvblNlcnZpY2UsXHJcbn0gZnJvbSAnQHNtYXJ0ZXJwbGFuL25neC1zbWFydGVycGxhbi1jb3JlJztcclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdsaWItYWRkLXpvbmUnLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi9hZGQtem9uZS5jb21wb25lbnQuaHRtbCcsXHJcbiAgc3R5bGVVcmxzOiBbJy4vYWRkLXpvbmUuY29tcG9uZW50LnNjc3MnXSxcclxufSlcclxuZXhwb3J0IGNsYXNzIEFkZFpvbmVDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xyXG4gIEBJbnB1dCgpIHpvbmVFZGl0OiBab25lO1xyXG5cclxuICBASW5wdXQoKSBzcGFjZUlEOiBzdHJpbmc7XHJcblxyXG4gIEBJbnB1dCgpIGltYWdlczM2MDogeyBwYXRoOiBzdHJpbmc7IGZpbGVuYW1lOiBzdHJpbmcgfVtdO1xyXG5cclxuICBASW5wdXQoKSBuYXZpZ2F0aW9uSURzOiBzdHJpbmdbXTtcclxuXHJcbiAgQElucHV0KCkgem9uZXM6IFpvbmVbXTtcclxuXHJcbiAgQElucHV0KCkgbmV3Wm9uZURhdGFGcm9tRWRpdG9yOiBhbnk7XHJcblxyXG4gIEBPdXRwdXQoKSB1cGRhdGVkWm9uZSA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xyXG5cclxuICBASW5wdXQoKSBjaG9zZW5QbGFuOiBQbGFuO1xyXG5cclxuICBASW5wdXQoKSBpc011c2V1bVZpc2l0OiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gIEBJbnB1dCgpIGRlZmF1bHRab25lOiBab25lO1xyXG5cclxuICBwYXJlbnRab25lczogWm9uZVtdID0gW107XHJcblxyXG4gIGNhcm91c2VsSXNWaXNpYmxlID0gZmFsc2U7XHJcblxyXG4gIHpvbmVGb3JtOiBGb3JtR3JvdXA7XHJcblxyXG4gIGlzU3VibWl0dGVkID0gZmFsc2U7XHJcblxyXG4gIGN1cnJlbnRTY2FuU2hvd2luZzogbnVtYmVyO1xyXG5cclxuICBjaG9zZW5TY2FuczogbnVtYmVyW10gPSBbXTtcclxuXHJcbiAgbGF5ZXJzOiBMYXllcltdO1xyXG5cclxuICBmcm9tUGxhbjogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICBjaG9zZW5TY2Fuc09uUGxhbjogc3RyaW5nW10gPSBbXTtcclxuXHJcbiAgY3VycmVudE9yZ0lkOiBzdHJpbmc7XHJcblxyXG4gIHpvbmVJbml0aWFsTmF2Q291bnQgPSAwO1xyXG5cclxuICB6b25lSXNNYXR0ZXJwb3J0Rmxvb3IgPSBmYWxzZTtcclxuXHJcbiAgbXVsdGlwbGVGbG9vcnMgPSBmYWxzZTtcclxuXHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICBwcml2YXRlIGZiOiBGb3JtQnVpbGRlcixcclxuICAgIHByaXZhdGUgem9uZVNlcnZpY2U6IFpvbmVTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBsYXllclNlcnZpY2U6IExheWVyU2VydmljZSxcclxuICAgIHByaXZhdGUgdXNlclNlcnZpY2U6IEJhc2VVc2VyU2VydmljZSxcclxuICAgIHByaXZhdGUgbmF2aWdhdGlvblNlcnZpY2U6IE5hdmlnYXRpb25TZXJ2aWNlXHJcbiAgKSB7fVxyXG5cclxuICBhc3luYyBuZ09uSW5pdCgpIHtcclxuICAgIHRoaXMucGFyZW50Wm9uZXMgPSB0aGlzLnpvbmVzLmZpbHRlcihcclxuICAgICAgKHpvbmUpID0+IHpvbmUubGF5ZXIgJiYgem9uZS5sYXllci5uYW1lID09PSAnRkxPT1InXHJcbiAgICApO1xyXG4gICAgaWYgKCF0aGlzLmRlZmF1bHRab25lKSB7XHJcbiAgICAgIHRoaXMuZGVmYXVsdFpvbmUgPSB0aGlzLmdldERlZmF1bHRab25lKCk7XHJcbiAgICB9XHJcbiAgICB0aGlzLnBhcmVudFpvbmVzLnVuc2hpZnQodGhpcy5kZWZhdWx0Wm9uZSk7XHJcbiAgICBhd2FpdCB0aGlzLnVwZGF0ZUxheWVycygpO1xyXG4gICAgdGhpcy5pbml0Wm9uZUZvcm0oKTtcclxuICB9XHJcblxyXG4gIGFzeW5jIHVwZGF0ZUxheWVycygpIHtcclxuICAgIHRoaXMuY3VycmVudE9yZ0lkID0gdGhpcy51c2VyU2VydmljZS5jdXJyZW50T3JnYW5pc2F0aW9uKHRoaXMuc3BhY2VJRCkuaWQ7XHJcbiAgICBjb25zdCBsYXllcnMgPSBhd2FpdCB0aGlzLmxheWVyU2VydmljZS5nZXRMYXllckZvck9yZ2FuaXNhdGlvbihcclxuICAgICAgdGhpcy5jdXJyZW50T3JnSWRcclxuICAgICk7XHJcbiAgICAvLyBmaWx0ZXIgb3V0IGxheWVycyBjcmVhdGVkIGJ5IHRoZSBzeXN0ZW1cclxuICAgIHRoaXMubGF5ZXJzID0gbGF5ZXJzLmZpbHRlcihcclxuICAgICAgKGwpID0+IGwubmFtZSAhPT0gJ0JVSUxESU5HJyAmJiBsLm5hbWUgIT09ICdGTE9PUidcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICBhc3luYyBpbml0Wm9uZUZvcm0oKSB7XHJcbiAgICBpZiAodGhpcy56b25lRWRpdCkge1xyXG4gICAgICBpZiAodGhpcy56b25lRWRpdC5tZXRhZGF0YSkge1xyXG4gICAgICAgIGNvbnN0IG1ldGFkYXRhID0gSlNPTi5wYXJzZSh0aGlzLnpvbmVFZGl0Lm1ldGFkYXRhKTtcclxuICAgICAgICB0aGlzLnpvbmVJc01hdHRlcnBvcnRGbG9vciA9IG1ldGFkYXRhLmhhc093blByb3BlcnR5KFxyXG4gICAgICAgICAgJ21hdHRlcnBvcnRGbG9vclNlcXVlbmNlJ1xyXG4gICAgICAgICk7XHJcbiAgICAgIH1cclxuICAgICAgY29uc3QgaXNWaXJ0dWFsID0gdGhpcy56b25lU2VydmljZS56b25lSXNWaXJ0dWFsKHRoaXMuem9uZUVkaXQpO1xyXG4gICAgICBpZiAoIWlzVmlydHVhbCkge1xyXG4gICAgICAgIGF3YWl0IHRoaXMubG9hZE5hdmlnYXRpb25zKCk7XHJcbiAgICAgIH1cclxuICAgICAgdGhpcy5pc011c2V1bVZpc2l0ID0gdGhpcy56b25lRWRpdC5pc011c2V1bVZpc2l0Wm9uZSA9PT0gdHJ1ZTtcclxuICAgICAgdGhpcy5tdWx0aXBsZUZsb29ycyA9IHRoaXMuem9uZUVkaXQuaXNNdWx0aXBsZUZsb29yWm9uZSA9PT0gdHJ1ZTtcclxuICAgICAgdGhpcy56b25lRm9ybSA9IHRoaXMuZmIuZ3JvdXAoe1xyXG4gICAgICAgIGlkOiB0aGlzLnpvbmVFZGl0LmlkLFxyXG4gICAgICAgIG5hbWU6IFt0aGlzLnpvbmVFZGl0Lm5hbWUsIFtWYWxpZGF0b3JzLnJlcXVpcmVkXV0sXHJcbiAgICAgICAgY29kZV9yZWY6IHRoaXMuem9uZUVkaXQuY29kZV9yZWYgPyB0aGlzLnpvbmVFZGl0LmNvZGVfcmVmIDogbnVsbCxcclxuICAgICAgICBsYXllcklEOiB0aGlzLnpvbmVFZGl0LmxheWVyID8gdGhpcy56b25lRWRpdC5sYXllci5pZCA6IG51bGwsXHJcbiAgICAgICAgc3VyZmFjZTogdGhpcy56b25lRWRpdC5zdXJmYWNlID8gdGhpcy56b25lRWRpdC5zdXJmYWNlIDogMCxcclxuICAgICAgICBwYXJlbnRJRDogdGhpcy56b25lRWRpdC5wYXJlbnRJRCxcclxuICAgICAgICBwYXJlbnQ6IHsgdmFsdWU6IHRoaXMuem9uZUVkaXQucGFyZW50Lm5hbWUsIGRpc2FibGVkOiB0cnVlIH0sXHJcbiAgICAgICAgbmV3TGF5ZXI6IFtudWxsLCBbdGhpcy5sYXllck5hbWVWYWxpZGF0b3IoKV1dLFxyXG4gICAgICAgIGlzTXVzZXVtVmlzaXRab25lOiB0aGlzLmlzTXVzZXVtVmlzaXQsXHJcbiAgICAgICAgc3RhcnRTd2VlcElEOiB0aGlzLnpvbmVFZGl0LnN0YXJ0U3dlZXBJRCxcclxuICAgICAgfSk7XHJcbiAgICAgIHRoaXMub25DaGFuZ2VNdWx0aXBsZUZsb29ycygpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy56b25lRm9ybSA9IHRoaXMuZmIuZ3JvdXAoe1xyXG4gICAgICAgIG5hbWU6IFtcclxuICAgICAgICAgIHRoaXMubmV3Wm9uZURhdGFGcm9tRWRpdG9yID8gdGhpcy5uZXdab25lRGF0YUZyb21FZGl0b3IubmFtZSA6ICcnLFxyXG4gICAgICAgICAgW1ZhbGlkYXRvcnMucmVxdWlyZWRdLFxyXG4gICAgICAgIF0sXHJcbiAgICAgICAgY29kZV9yZWY6IG51bGwsXHJcbiAgICAgICAgbGF5ZXJJRDogbnVsbCxcclxuICAgICAgICBzdXJmYWNlOiAwLFxyXG4gICAgICAgIHBhcmVudElEOiB0aGlzLmRlZmF1bHRab25lLmlkLFxyXG4gICAgICAgIG5ld0xheWVyOiBbbnVsbCwgW3RoaXMubGF5ZXJOYW1lVmFsaWRhdG9yKCldXSxcclxuICAgICAgICBpc011c2V1bVZpc2l0Wm9uZTogdGhpcy5pc011c2V1bVZpc2l0LFxyXG4gICAgICAgIHN0YXJ0U3dlZXBJRDogbnVsbCxcclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBhc3luYyBvblN1Ym1pdFpvbmUoKSB7XHJcbiAgICB0aGlzLmlzU3VibWl0dGVkID0gdHJ1ZTtcclxuICAgIGlmICghdGhpcy56b25lRm9ybS52YWxpZCkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBjb25zdCBmb3JtVmFsdWUgPSB0aGlzLnpvbmVGb3JtLmdldFJhd1ZhbHVlKCk7IC8vYmVjYXVzZSB3ZSBuZWVkIHZhbHVlcyBvZiBkaXNhYmxlcyBjb250cm9scyBhcyB3ZWxsXHJcbiAgICBpZiAoZm9ybVZhbHVlLm5ld0xheWVyKSB7XHJcbiAgICAgIGF3YWl0IHRoaXMuY3JlYXRlTGF5ZXIoZm9ybVZhbHVlLm5ld0xheWVyKS50aGVuKChsYXllcikgPT4ge1xyXG4gICAgICAgIGZvcm1WYWx1ZS5sYXllcklEID0gbGF5ZXIuaWQ7XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IHpvbmVJbnB1dCA9IHtcclxuICAgICAgbmFtZTogZm9ybVZhbHVlLm5hbWUsXHJcbiAgICAgIHN1cmZhY2U6IE1hdGgucm91bmQoZm9ybVZhbHVlLnN1cmZhY2UgKiAxMDApIC8gMTAwLFxyXG4gICAgICBzcGFjZUlEOiB0aGlzLnNwYWNlSUQsXHJcbiAgICAgIGxheWVySUQ6IGZvcm1WYWx1ZS5sYXllcklELFxyXG4gICAgICBwYXJlbnRJRDogZm9ybVZhbHVlLnBhcmVudElELFxyXG4gICAgICBpc011c2V1bVZpc2l0Wm9uZTogdGhpcy5pc011c2V1bVZpc2l0LFxyXG4gICAgICBpc011bHRpcGxlRmxvb3Jab25lOiB0aGlzLm11bHRpcGxlRmxvb3JzLFxyXG4gICAgICBzd2VlcElEczogW10sXHJcbiAgICAgIHN0YXJ0U3dlZXBJRDogZm9ybVZhbHVlLnN0YXJ0U3dlZXBJRCxcclxuICAgIH0gYXMgWm9uZTtcclxuXHJcbiAgICBpZiAoZm9ybVZhbHVlLmNvZGVfcmVmKSB7XHJcbiAgICAgIHpvbmVJbnB1dC5jb2RlX3JlZiA9IGZvcm1WYWx1ZS5jb2RlX3JlZjtcclxuICAgIH1cclxuXHJcbiAgICB0cnkge1xyXG4gICAgICB0aGlzLnpvbmVGb3JtID0gbnVsbDtcclxuICAgICAgdGhpcy5pc1N1Ym1pdHRlZCA9IGZhbHNlO1xyXG4gICAgICBpZiAodGhpcy56b25lRWRpdCkge1xyXG4gICAgICAgIGNvbnN0IHpvbmVVcGRhdGUgPSB6b25lSW5wdXQ7XHJcbiAgICAgICAgem9uZVVwZGF0ZS5zd2VlcElEcyA9IHRoaXMuem9uZUVkaXQuc3dlZXBJRHM7XHJcbiAgICAgICAgem9uZVVwZGF0ZS5pZCA9IGZvcm1WYWx1ZS5pZDtcclxuICAgICAgICBhd2FpdCB0aGlzLnNldFN3ZWVwc0FuZE5vZGVGb3Jab25lSW5wdXQoem9uZVVwZGF0ZSk7XHJcbiAgICAgICAgYXdhaXQgdGhpcy56b25lU2VydmljZS51cGRhdGVab25lKHpvbmVVcGRhdGUpO1xyXG4gICAgICAgIHRoaXMuem9uZUVkaXQgPSBudWxsO1xyXG4gICAgICAgIHRoaXMudXBkYXRlZFpvbmUuZW1pdCh6b25lVXBkYXRlLmlkKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBhd2FpdCB0aGlzLnNldFN3ZWVwc0FuZE5vZGVGb3Jab25lSW5wdXQoem9uZUlucHV0KTtcclxuICAgICAgICBpZiAoIXpvbmVJbnB1dC5wYXJlbnRJRCkge1xyXG4gICAgICAgICAgLy8gc2V0IGJ1aWxkaW5nIGFzIHBhcmVudFxyXG4gICAgICAgICAgem9uZUlucHV0LnBhcmVudElEID0gdGhpcy5kZWZhdWx0Wm9uZS5pZDtcclxuICAgICAgICB9XHJcbiAgICAgICAgYXdhaXQgdGhpcy56b25lU2VydmljZS5jcmVhdGUoem9uZUlucHV0KS50aGVuKCh6b25lQ3JlYXRlZCkgPT4ge1xyXG4gICAgICAgICAgdGhpcy51cGRhdGVkWm9uZS5lbWl0KHpvbmVDcmVhdGVkLmlkKTtcclxuICAgICAgICB9KTtcclxuICAgICAgfVxyXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgY29uc29sZS5lcnJvcihlcnJvcik7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBvbkNhbmNlbCgpIHtcclxuICAgIHRoaXMuaXNTdWJtaXR0ZWQgPSBmYWxzZTtcclxuICAgIHRoaXMuem9uZUZvcm0gPSBudWxsO1xyXG4gICAgdGhpcy5jaG9zZW5TY2Fuc09uUGxhbiA9IFtdO1xyXG4gICAgdGhpcy5jaG9zZW5TY2FucyA9IFtdO1xyXG4gICAgdGhpcy51cGRhdGVkWm9uZS5lbWl0KGZhbHNlKTtcclxuICB9XHJcblxyXG4gIGdldCBuYW1lKCk6IEFic3RyYWN0Q29udHJvbCB7XHJcbiAgICByZXR1cm4gdGhpcy56b25lRm9ybS5nZXQoJ25hbWUnKTtcclxuICB9XHJcblxyXG4gIGdldCBuZXdMYXllcigpOiBBYnN0cmFjdENvbnRyb2wge1xyXG4gICAgcmV0dXJuIHRoaXMuem9uZUZvcm0uZ2V0KCduZXdMYXllcicpO1xyXG4gIH1cclxuXHJcbiAgdG9nZ2xlQ2Fyb3VzZWwoKSB7XHJcbiAgICB0aGlzLmNhcm91c2VsSXNWaXNpYmxlID0gdHJ1ZTtcclxuICAgIHRoaXMuY2hvc2VuU2NhbnNPblBsYW4gPSBbXTtcclxuICB9XHJcblxyXG4gIHRvZ2dsZVBsYW4oKSB7XHJcbiAgICB0aGlzLmZyb21QbGFuID0gdHJ1ZTtcclxuICAgIHRoaXMuY2hvc2VuU2NhbnMgPSBbXTtcclxuICB9XHJcblxyXG4gIG9uQWRkU2NhbigpIHtcclxuICAgIGlmICghdGhpcy5jaG9zZW5TY2Fucy5pbmNsdWRlcyh0aGlzLmN1cnJlbnRTY2FuU2hvd2luZykpIHtcclxuICAgICAgLy8gY29uc29sZS5sb2coXCJhZGRpbmcgc2NhblwiLCB0aGlzLmN1cnJlbnRTY2FuU2hvd2luZyk7XHJcbiAgICAgIHRoaXMuY2hvc2VuU2NhbnMucHVzaCh0aGlzLmN1cnJlbnRTY2FuU2hvd2luZyk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBhbGVydCgnU2NhbiBhbHJlYWR5IGFkZGVkIScpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgb25SZW1vdmVTY2FuSW1hZ2Uoc2NhbjogYW55KSB7XHJcbiAgICBjb25zdCBpbmRleCA9IHRoaXMuY2hvc2VuU2NhbnMuaW5kZXhPZihzY2FuKTtcclxuICAgIHRoaXMuY2hvc2VuU2NhbnMuc3BsaWNlKGluZGV4LCAxKTtcclxuICB9XHJcblxyXG4gIG9uUmVtb3ZlU2NhblBsYW4oc2NhbjogYW55KSB7XHJcbiAgICBjb25zdCBpbmRleCA9IHRoaXMuY2hvc2VuU2NhbnNPblBsYW4uaW5kZXhPZihzY2FuKTtcclxuICAgIHRoaXMuY2hvc2VuU2NhbnNPblBsYW4uc3BsaWNlKGluZGV4LCAxKTtcclxuICB9XHJcblxyXG4gIGFzeW5jIHNldFN3ZWVwc0FuZE5vZGVGb3Jab25lSW5wdXQoem9uZUlucHV0OiBab25lKSB7XHJcbiAgICBpZiAoXHJcbiAgICAgIHRoaXMuY2hvc2VuU2NhbnMubGVuZ3RoID4gMCAmJlxyXG4gICAgICB0aGlzLmNob3NlblNjYW5zLmxlbmd0aCAhPT0gdGhpcy56b25lSW5pdGlhbE5hdkNvdW50ICYmXHJcbiAgICAgICF0aGlzLmZyb21QbGFuXHJcbiAgICApIHtcclxuICAgICAgLy8gaWYgd2UgY2hvc2Ugc2NhbnMgZnJvbSB0aGUgY2Fyb3VzZWxcclxuICAgICAgY29uc3Qgc3dlZXBJRHM6IHN0cmluZ1tdID0gW107XHJcbiAgICAgIHRoaXMuY2hvc2VuU2NhbnMubWFwKGFzeW5jIChzY2FuKSA9PiB7XHJcbiAgICAgICAgY29uc3QgaW1hZ2VVdWlkID0gdGhpcy5pbWFnZXMzNjBbc2Nhbl0uZmlsZW5hbWUuc3BsaXQoJ18nKVswXTtcclxuICAgICAgICBjb25zdCBzd2VlcElEID0gdGhpcy5uYXZpZ2F0aW9uSURzLmZpbmQoKG5hdikgPT4ge1xyXG4gICAgICAgICAgcmV0dXJuIG5hdi5pbmNsdWRlcyhpbWFnZVV1aWQpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIGlmIChzd2VlcElEKSB7XHJcbiAgICAgICAgICBzd2VlcElEcy5wdXNoKHN3ZWVwSUQpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgICAgIHpvbmVJbnB1dC5zd2VlcElEcyA9IHN3ZWVwSURzO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgLy8gd2UgYXJlIG5vdCBjb21pbmcgZnJvbSBnYWxsZXJ5IGNob2ljZVxyXG4gICAgICBpZiAodGhpcy5jaG9zZW5TY2Fuc09uUGxhbi5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgem9uZUlucHV0LnN3ZWVwSURzID0gdGhpcy5jaG9zZW5TY2Fuc09uUGxhbjtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGlmICh6b25lSW5wdXQuc3dlZXBJRHMgJiYgem9uZUlucHV0LnN3ZWVwSURzLmxlbmd0aCA+IDApIHtcclxuICAgICAgY29uc3QgbmF2Rm9yU3dlZXAgPVxyXG4gICAgICAgIGF3YWl0IHRoaXMubmF2aWdhdGlvblNlcnZpY2UuZ2V0TmF2aWdhdGlvbnNGb3JNYXR0ZXJwb3J0SURGb3JTcGFjZShcclxuICAgICAgICAgIHpvbmVJbnB1dC5zd2VlcElEc1swXSxcclxuICAgICAgICAgIHRoaXMuc3BhY2VJRFxyXG4gICAgICAgICk7XHJcbiAgICAgIHpvbmVJbnB1dC5ub2RlSURzID0gW25hdkZvclN3ZWVwWzBdLm5vZGVJRF07XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBhc3luYyBjcmVhdGVMYXllcihuYW1lOiBzdHJpbmcpOiBQcm9taXNlPExheWVyPiB7XHJcbiAgICByZXR1cm4gdGhpcy5sYXllclNlcnZpY2UuY3JlYXRlTGF5ZXJGb3JPcmdhbmlzYXRpb24oXHJcbiAgICAgIG5hbWUsXHJcbiAgICAgIHRoaXMuY3VycmVudE9yZ0lkXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgYXN5bmMgbG9hZE5hdmlnYXRpb25zKCk6IFByb21pc2U8YW55PiB7XHJcbiAgICBpZiAodGhpcy56b25lRWRpdC5zd2VlcElEcy5sZW5ndGggPiAwKSB7XHJcbiAgICAgIHRoaXMuem9uZUluaXRpYWxOYXZDb3VudCA9IHRoaXMuem9uZUVkaXQuc3dlZXBJRHMubGVuZ3RoO1xyXG4gICAgICBjb25zdCBuYXZMaXN0OiBudW1iZXJbXSA9IFtdO1xyXG4gICAgICBjb25zdCBzY2Fuc1pvbmVFZGl0OiBzdHJpbmdbXSA9IFtdO1xyXG4gICAgICBhd2FpdCBQcm9taXNlLmFsbChcclxuICAgICAgICB0aGlzLnpvbmVFZGl0LnN3ZWVwSURzLm1hcChhc3luYyAoc3dlZXBJRDogc3RyaW5nKSA9PiB7XHJcbiAgICAgICAgICBzY2Fuc1pvbmVFZGl0LnB1c2goc3dlZXBJRCk7XHJcbiAgICAgICAgICBjb25zdCBpbmRleCA9IHRoaXMuaW1hZ2VzMzYwLmZpbmRJbmRleCgoaW0pID0+IHtcclxuICAgICAgICAgICAgcmV0dXJuIGltLmZpbGVuYW1lLmluY2x1ZGVzKHN3ZWVwSUQuc2xpY2UoMCwgOCkpO1xyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgICBpZiAoaW5kZXggIT09IC0xKSB7XHJcbiAgICAgICAgICAgIG5hdkxpc3QucHVzaChpbmRleCk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSlcclxuICAgICAgKTtcclxuICAgICAgdGhpcy5jaG9zZW5TY2FucyA9IG5hdkxpc3Q7XHJcbiAgICAgIHRoaXMuY2hvc2VuU2NhbnNPblBsYW4gPSBzY2Fuc1pvbmVFZGl0O1xyXG4gICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XHJcbiAgfVxyXG5cclxuICAvLyBpbmlQbGFuRm9yRHJhdygpIHtcclxuICAvLyAgICAgdGhpcy50b2dnbGVQbGFuKCk7XHJcbiAgLy8gICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gIC8vICAgICAgICAgdGhpcy5vblBsYW5DbGljaygpO1xyXG4gIC8vICAgICB9LCA1MDApO1xyXG4gIC8vIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQWRkcyBhbGwgc3dlZXBzIG9mIHRoZSBzcGFjZVxyXG4gICAqL1xyXG4gIG9uQWRkQWxsKCkge1xyXG4gICAgY29uc3QgZGVmYXVsdFpvbmUgPSB0aGlzLmdldERlZmF1bHRab25lKCk7XHJcbiAgICBpZiAoZGVmYXVsdFpvbmUpIHtcclxuICAgICAgdGhpcy5jaG9zZW5TY2Fuc09uUGxhbiA9IGRlZmF1bHRab25lLnN3ZWVwSURzO1xyXG4gICAgICB0aGlzLnpvbmVGb3JtLmdldCgncGFyZW50SUQnKS5zZXRWYWx1ZShkZWZhdWx0Wm9uZS5pZCk7XHJcbiAgICAgIHRoaXMuem9uZUZvcm0uZ2V0KCdwYXJlbnRJRCcpLmRpc2FibGUoKTtcclxuICAgICAgdGhpcy5tdWx0aXBsZUZsb29ycyA9IHRydWU7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBnZXREZWZhdWx0Wm9uZSgpOiBab25lIHtcclxuICAgIHJldHVybiB0aGlzLnpvbmVzLmZpbmQoXHJcbiAgICAgICh6b25lKSA9PlxyXG4gICAgICAgIHpvbmUubGF5ZXIgJiZcclxuICAgICAgICB6b25lLmxheWVyLm5hbWUgPT09ICdCVUlMRElORycgJiZcclxuICAgICAgICB6b25lLnN3ZWVwSURzICYmXHJcbiAgICAgICAgem9uZS5zd2VlcElEcy5sZW5ndGggPiAwXHJcbiAgICApO1xyXG4gIH1cclxuICAvKipcclxuICAgKiBNdWx0aXBsZSBmbG9vcnNcclxuICAgKi9cclxuICBvbkNoYW5nZU11bHRpcGxlRmxvb3JzKCkge1xyXG4gICAgaWYgKHRoaXMubXVsdGlwbGVGbG9vcnMpIHtcclxuICAgICAgY29uc3QgZGVmYXVsdFpvbmUgPSB0aGlzLmdldERlZmF1bHRab25lKCk7XHJcbiAgICAgIGlmIChkZWZhdWx0Wm9uZSkge1xyXG4gICAgICAgIHRoaXMuem9uZUZvcm0uZ2V0KCdwYXJlbnRJRCcpLnNldFZhbHVlKGRlZmF1bHRab25lLmlkKTtcclxuICAgICAgICB0aGlzLnpvbmVGb3JtLmdldCgncGFyZW50SUQnKS5kaXNhYmxlKCk7XHJcbiAgICAgIH1cclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuem9uZUZvcm0uZ2V0KCdwYXJlbnRJRCcpLmVuYWJsZSgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgb25TZWxlY3RlZFN3ZWVwc0Zyb21QbGFuKHJlc3VsdDogeyBzd2VlcHM6IHN0cmluZ1tdOyBzdGFydFN3ZWVwSUQ6IHN0cmluZyB9KSB7XHJcbiAgICBpZiAocmVzdWx0KSB7XHJcbiAgICAgIGlmIChyZXN1bHQuc3dlZXBzKSB7XHJcbiAgICAgICAgdGhpcy5jaG9zZW5TY2Fuc09uUGxhbiA9IHJlc3VsdC5zd2VlcHM7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKHJlc3VsdC5zdGFydFN3ZWVwSUQpIHtcclxuICAgICAgICB0aGlzLnpvbmVGb3JtLmNvbnRyb2xzLnN0YXJ0U3dlZXBJRC5zZXRWYWx1ZShyZXN1bHQuc3RhcnRTd2VlcElEKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgdGhpcy5mcm9tUGxhbiA9IGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgbGF5ZXJOYW1lVmFsaWRhdG9yKCk6IFZhbGlkYXRvckZuIHtcclxuICAgIHJldHVybiAoY29udHJvbDogQWJzdHJhY3RDb250cm9sKTogVmFsaWRhdGlvbkVycm9ycyB8IG51bGwgPT4ge1xyXG4gICAgICBpZiAoIWNvbnRyb2wudmFsdWUpIHtcclxuICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgfVxyXG4gICAgICBjb25zdCBmb3JiaWRkZW4gPSB0aGlzLmxheWVyc1xyXG4gICAgICAgIC5tYXAoKGwpID0+IGwubmFtZS50b0xvd2VyQ2FzZSgpKVxyXG4gICAgICAgIC5pbmNsdWRlcyhjb250cm9sLnZhbHVlLnRvTG93ZXJDYXNlKCkpO1xyXG4gICAgICByZXR1cm4gZm9yYmlkZGVuID8geyBmb3JiaWRkZW5OYW1lOiB7IHZhbHVlOiBjb250cm9sLnZhbHVlIH0gfSA6IG51bGw7XHJcbiAgICB9O1xyXG4gIH1cclxufVxyXG4iLCI8ZGl2IGNsYXNzPVwibWFpbi1jb250YWluZXJcIiAqbmdJZj1cInpvbmVGb3JtXCI+XHJcbiAgICA8ZGl2IGNsYXNzPVwiY29sLTdcIj5cclxuICAgICAgICA8Zm9ybSAobmdTdWJtaXQpPVwib25TdWJtaXRab25lKClcIiBbZm9ybUdyb3VwXT1cInpvbmVGb3JtXCI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtYi0zIHJvd1wiPlxyXG4gICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiY29sLXNtLTIgY29sLWZvcm0tbGFiZWxcIj57eydOYW1lJyB8IHRyYW5zbGF0ZX19ICo8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1zbS0xMFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGNsYXNzPVwiZm9ybS1jb250cm9sXCIgcmVxdWlyZWQgZm9ybUNvbnRyb2xOYW1lPVwibmFtZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDwhLS0gPGRpdiBjbGFzcz1cImludmFsaWQtZmVlZGJhY2tcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAge3snQSBuYW1lIGlzIHJlcXVpcmVkJyB8IHRyYW5zbGF0ZX19XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+IC0tPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWItMyByb3dcIj5cclxuICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImNvbC1zbS0yIGNvbC1mb3JtLWxhYmVsXCI+e3snY29kZVJlZicgfCB0cmFuc2xhdGV9fTwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLXNtLTEwXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiBmb3JtQ29udHJvbE5hbWU9XCJjb2RlX3JlZlwiPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWItMyByb3dcIiAqbmdJZj1cIiFpc011c2V1bVZpc2l0ICYmICF6b25lSXNNYXR0ZXJwb3J0Rmxvb3JcIj5cclxuICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImNvbC1zbS0yIGNvbC1mb3JtLWxhYmVsXCI+e3snVHlwZSBvZiB6b25lJyB8IHRyYW5zbGF0ZX19PC9sYWJlbD5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtc20tMTBcIj5cclxuICAgICAgICAgICAgICAgICAgICA8c2VsZWN0IGNsYXNzPVwiZm9ybS1jb250cm9sXCIgZm9ybUNvbnRyb2xOYW1lPVwibGF5ZXJJRFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwibnVsbFwiIHNlbGVjdGVkIGRpc2FibGVkIGhpZGRlbj4ge3sgem9uZUVkaXQgJiYgem9uZUVkaXQubGF5ZXIgP1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgem9uZUVkaXQubGF5ZXIubmFtZSA6ICdDaG9vc2UgdHlwZSd9fTwvb3B0aW9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uICpuZ0Zvcj1cImxldCBsYXllciBvZiBsYXllcnNcIiBbdmFsdWVdPVwibGF5ZXIuaWRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IGxheWVyLm5hbWUgfX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9vcHRpb24+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9zZWxlY3Q+XHJcbiAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9XCJtdC0xIG5ldy10eXBlLXRleHRcIj57eydvciBhZGQgbmV3IHR5cGUgb2Ygem9uZScgfCB0cmFuc2xhdGUgfX08L3A+XHJcbiAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgY2xhc3M9XCJmb3JtLWNvbnRyb2wgbmV3LXR5cGUtaW5wdXRcIiBmb3JtQ29udHJvbE5hbWU9XCJuZXdMYXllclwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJuZXdMYXllci5pbnZhbGlkICYmIChuZXdMYXllci5kaXJ0eSB8fCBuZXdMYXllci50b3VjaGVkKVwiIGNsYXNzPVwidGV4dC1kYW5nZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cIm5ld0xheWVyLmVycm9ycz8uWydmb3JiaWRkZW5OYW1lJ11cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7J0xheWVyIGV4aXN0cyBhbHJlYWR5JyB8IHRyYW5zbGF0ZX19XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8IS0tSWYgRWRpdGluZyBab25lIHBvc3NpYmlsaXR5IHRvIGFzc2lnbiBpdCB0byBtdXNldW0gaXRpbmVyYXJ5LS0+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtYi0zIHJvd1wiICpuZ0lmPVwiem9uZUVkaXQgJiYgIXpvbmVJc01hdHRlcnBvcnRGbG9vclwiPlxyXG4gICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiY29sLXNtLTIgY29sLWZvcm0tbGFiZWxcIj57eyAnTXVzZXVtIEl0aW5lcmFyeScgfCB0cmFuc2xhdGUgfX08L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1zbS0xMFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxpbnB1dCBjbGFzcz1cImNoZWNrYm94LWFwcGx5IG10LTNcIiB0eXBlPVwiY2hlY2tib3hcIiBbKG5nTW9kZWwpXT1cImlzTXVzZXVtVmlzaXRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbbmdNb2RlbE9wdGlvbnNdPVwie3N0YW5kYWxvbmU6IHRydWV9XCI+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWItMyByb3dcIiAqbmdJZj1cIiF6b25lRWRpdCB8fCB6b25lRWRpdC5pc011bHRpcGxlRmxvb3Jab25lXCI+XHJcbiAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJjb2wtc20tMiBjb2wtZm9ybS1sYWJlbFwiPnt7ICdNdWx0aXBsZSBGbG9vcnMnIHwgdHJhbnNsYXRlIH19PC9sYWJlbD5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtc20tMTBcIj5cclxuICAgICAgICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9XCJjaGVja2JveC1hcHBseSBtdC0zXCIgdHlwZT1cImNoZWNrYm94XCIgWyhuZ01vZGVsKV09XCJtdWx0aXBsZUZsb29yc1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJ6b25lRWRpdCAhPT0gdW5kZWZpbmVkICYmIHpvbmVFZGl0ICE9PSBudWxsXCIgKGNoYW5nZSk9XCJvbkNoYW5nZU11bHRpcGxlRmxvb3JzKClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbbmdNb2RlbE9wdGlvbnNdPVwie3N0YW5kYWxvbmU6IHRydWV9XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ndGV4dC1kYW5nZXInICpuZ0lmPVwiem9uZUVkaXRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAge3snY2Fubm90Q2hhbmdlTXVsdGlmbG9vcicgfCB0cmFuc2xhdGV9fVxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtYi0zIHJvd1wiPlxyXG4gICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiY29sLXNtLTIgY29sLWZvcm0tbGFiZWxcIj57eydTdXJmYWNlJyB8IHRyYW5zbGF0ZX19PC9sYWJlbD5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtc20tMTBcIj5cclxuICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBjbGFzcz1cImZvcm0tY29udHJvbFwiIGZvcm1Db250cm9sTmFtZT1cInN1cmZhY2VcIj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtYi0zIHJvd1wiICpuZ0lmPVwiIXpvbmVJc01hdHRlcnBvcnRGbG9vclwiPlxyXG4gICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiY29sLXNtLTIgY29sLWZvcm0tbGFiZWxcIj57eydQYXJlbnQgem9uZScgfCB0cmFuc2xhdGV9fTwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLXNtLTEwXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGlucHV0ICpuZ0lmPVwiem9uZUVkaXRcIiB0eXBlPVwidGV4dFwiIGNsYXNzPVwiZm9ybS1jb250cm9sXCIgZm9ybUNvbnRyb2xOYW1lPVwicGFyZW50XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtZGFuZ2VyXCIgKm5nSWY9XCJ6b25lRWRpdFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICB7eydjYW5ub3RDaGFuZ2VQYXJlbnQnIHwgdHJhbnNsYXRlfX1cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8c2VsZWN0ICpuZ0lmPVwiIXpvbmVFZGl0XCIgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiBmb3JtQ29udHJvbE5hbWU9XCJwYXJlbnRJRFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uICpuZ0Zvcj1cImxldCB6b25lIG9mIHBhcmVudFpvbmVzXCIgW25nVmFsdWVdPVwiem9uZS5pZFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgem9uZS5uYW1lIH19XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvb3B0aW9uPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvc2VsZWN0PlxyXG5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtYi0zIHJvd1wiIHN0eWxlPVwibWF4LWhlaWdodDogMjAwcHg7IG92ZXJmbG93OiBhdXRvO1wiICpuZ0lmPVwiIXpvbmVJc01hdHRlcnBvcnRGbG9vclwiPlxyXG4gICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiY29sLXNtLTIgY29sLWZvcm0tbGFiZWxcIj57eydTY2FuIFBvaW50cycgfCB0cmFuc2xhdGV9fTwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICA8IS0tIDxwIGNsYXNzPVwiY29sLXNtLTJcIiAqbmdJZj1cInpvbmVFZGl0XCI+e3sgem9uZUVkaXQuc3dlZXBJRHMubGVuZ3RoIH19IHNjYW5zPC9wPiAtLT5cclxuICAgICAgICAgICAgICAgIDxwIGNsYXNzPVwiY29sXCIgKm5nSWY9XCJjaG9zZW5TY2Fuc09uUGxhbi5sZW5ndGggPT09IDAgJiYgY2hvc2VuU2NhbnMubGVuZ3RoID09PSAwXCI+XHJcbiAgICAgICAgICAgICAgICAgICAge3snTm8gc2NhbiBwb2ludHMgY2hvc2VuJyB8IHRyYW5zbGF0ZX19PC9wPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1zbS01XCIgKm5nSWY9XCJjaG9zZW5TY2Fuc09uUGxhbiAmJiBjaG9zZW5TY2Fuc09uUGxhbi5sZW5ndGggPiAwXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPHA+e3sgY2hvc2VuU2NhbnNPblBsYW4ubGVuZ3RoIH19IHt7J3NjYW4gcG9pbnRzIGNob3NlbicgfCB0cmFuc2xhdGV9fTwvcD5cclxuICAgICAgICAgICAgICAgICAgICA8IS0tIDxkaXYgKm5nRm9yPVwibGV0IHNjYW4gb2YgY2hvc2VuU2NhbnNPblBsYW5cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJvd1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9XCJtZS0yXCI+e3sgc2NhbiB8IHNsaWNlOjA6OCB9fTwvcD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgKGNsaWNrKT1cIm9uUmVtb3ZlU2NhblBsYW4oc2NhbilcIiBbc3R5bGUuY3Vyc29yXT1cIidwb2ludGVyJ1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiaWNvbmlmeVwiIGRhdGEtaWNvbj1cIm1kaTp0cmFzaC1jYW4tb3V0bGluZVwiPjwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj4gLS0+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtc20tNVwiICpuZ0lmPVwiY2Fyb3VzZWxJc1Zpc2libGUgJiYgY2hvc2VuU2NhbnMgJiYgY2hvc2VuU2NhbnMubGVuZ3RoID4gMFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxwPnt7IGNob3NlblNjYW5zLmxlbmd0aCB9fSB7eydzY2FuIHBvaW50cyBjaG9zZW4nIHwgdHJhbnNsYXRlfX08L3A+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdGb3I9XCJsZXQgc2NhbiBvZiBjaG9zZW5TY2Fuc1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicm93XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz1cIm1lLTJcIj57eyBpbWFnZXMzNjBbc2Nhbl0uZmlsZW5hbWUgfX08L3A+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IChjbGljayk9XCJvblJlbW92ZVNjYW5JbWFnZShzY2FuKVwiIFtzdHlsZS5jdXJzb3JdPVwiJ3BvaW50ZXInXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJpY29uaWZ5XCIgZGF0YS1pY29uPVwibWRpOnRyYXNoLWNhbi1vdXRsaW5lXCI+PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJvdyBtYi0zIG10LTNcIiAqbmdJZj1cIiF6b25lSXNNYXR0ZXJwb3J0Rmxvb3JcIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2xcIj5cclxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0biBidG4tb3V0bGluZS1wcmltYXJ5IHJvdW5kZWQtcGlsbCBtZS0yXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInRvZ2dsZVBsYW4oKVwiPnt7J0Nob29zZSBzY2FuIHBvaW50cyBvbiBwbGFuJyB8XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zbGF0ZX19PC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4gYnRuLW91dGxpbmUtcHJpbWFyeSByb3VuZGVkLXBpbGwgbWUtMlwiIChjbGljayk9XCJ0b2dnbGVDYXJvdXNlbCgpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImZyb21QbGFuIHx8ICFpbWFnZXMzNjAgfHwgaW1hZ2VzMzYwLmxlbmd0aCA9PT0gMFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICB7eydDaG9vc2Ugc2NhbiBwb2ludHMgZnJvbSBnYWxsZXJ5JyB8IHRyYW5zbGF0ZX19PC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4gYnRuLW91dGxpbmUtcHJpbWFyeSByb3VuZGVkLXBpbGwgbWUtMlwiIChjbGljayk9XCJvbkFkZEFsbCgpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImZyb21QbGFuIHx8ICFpbWFnZXMzNjAgfHwgaW1hZ2VzMzYwLmxlbmd0aCA9PT0gMFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICB7eydhZGQtYWxsLXNjYW5zJyB8IHRyYW5zbGF0ZX19PC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICA8IS0tIDxkaXYgY2xhc3M9XCJtYi0zIHJvd1wiPlxyXG4gICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiY29sLXNtLTMgY29sLWZvcm0tbGFiZWxcIj57eydObyB2aXNpYmxlIHNjYW4gcG9pbnRzJyB8IHRyYW5zbGF0ZX19PC9sYWJlbD5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtc20tM1wiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxpbnB1dCBjbGFzcz1cImNoZWNrYm94LWFwcGx5IG10LTNcIiB0eXBlPVwiY2hlY2tib3hcIiBbKG5nTW9kZWwpXT1cIm5vU2NhblBvaW50c1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtuZ01vZGVsT3B0aW9uc109XCJ7c3RhbmRhbG9uZTogdHJ1ZX1cIj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj4gLS0+XHJcblxyXG4gICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiY2Fyb3VzZWxJc1Zpc2libGVcIiBjbGFzcz1cIm1iLTJcIj5cclxuICAgICAgICAgICAgICAgIDxsaWItY2Fyb3VzZWwgKm5nSWY9XCJpbWFnZXMzNjAgJiYgaW1hZ2VzMzYwLmxlbmd0aCA+IDBcIiBbaW1hZ2VzXT1cImltYWdlczM2MFwiXHJcbiAgICAgICAgICAgICAgICAgICAgKGN1cnJlbnRTY2FuKT1cImN1cnJlbnRTY2FuU2hvd2luZz0kZXZlbnRcIj48L2xpYi1jYXJvdXNlbD5cclxuICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuIGJ0bi1vdXRsaW5lLXByaW1hcnkgcm91bmRlZC1waWxsIG1lLTIgbXQtM1wiXHJcbiAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIm9uQWRkU2NhbigpXCI+e3snQWRkIHRvIHpvbmUnIHwgdHJhbnNsYXRlfX08L2J1dHRvbj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtdC0zXCI+XHJcbiAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJzdWJtaXRcIiBjbGFzcz1cImJ0biBidG4tcHJpbWFyeSByb3VuZGVkLXBpbGwgbWUtMlwiXHJcbiAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImZyb21QbGFuIHx8ICF6b25lRm9ybS52YWxpZFwiPnt7J1NhdmUnIHwgdHJhbnNsYXRlfX08L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIChjbGljayk9XCJvbkNhbmNlbCgpXCIgY2xhc3M9XCJidG4gYnRuLW91dGxpbmUtcHJpbWFyeSByb3VuZGVkLXBpbGwgbWUtMlwiPlxyXG4gICAgICAgICAgICAgICAgICAgIHt7J0NhbmNlbCcgfCB0cmFuc2xhdGV9fTwvYnV0dG9uPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Zvcm0+XHJcbiAgICA8L2Rpdj5cclxuICAgIDxkaXYgY2xhc3M9XCJlZGl0LXBsYW5cIiAqbmdJZj1cImZyb21QbGFuXCI+XHJcbiAgICAgICAgPGxpYi1zd2VlcC1wbGFuLXNlbGVjdGlvbiBzdHlsZT1cIndpZHRoOiAxMDAlO1wiIFtuZXdab25lRGF0YV09XCJuZXdab25lRGF0YUZyb21FZGl0b3JcIiBbc3BhY2VJRF09XCJzcGFjZUlEXCJcclxuICAgICAgICAgICAgW211bHRpcGxlRmxvb3JzXT1cIm11bHRpcGxlRmxvb3JzXCIgW2lucHV0Wm9uZV09XCJ6b25lRWRpdFwiXHJcbiAgICAgICAgICAgIChzd2VlcHNTZWxlY3RlZCk9XCJvblNlbGVjdGVkU3dlZXBzRnJvbVBsYW4oJGV2ZW50KVwiPjwvbGliLXN3ZWVwLXBsYW4tc2VsZWN0aW9uPlxyXG4gICAgPC9kaXY+XHJcbjwvZGl2PiJdfQ==
|