raain-app 1.5.35 → 1.5.36

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/CHANGELOG.md CHANGED
@@ -7,6 +7,12 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
7
7
 
8
8
  ## [Unreleased]
9
9
 
10
+ ### Changed
11
+
12
+ - 24h period added for admin
13
+
14
+ ## [1.5.35] - 2025-08-07
15
+
10
16
  ### Fixed
11
17
 
12
18
  - RAD-136: RefreshManager build current Frameset
@@ -282,6 +282,7 @@ export class RaainDetailsComponent {
282
282
  }
283
283
  cleanAll() {
284
284
  this.borders = [];
285
+ this.isAdmin = false;
285
286
  this.timeframeContainers = new TimeframeContainers([]);
286
287
  this.currentTimeframeTarget = null;
287
288
  this.timeframeDates = [];
@@ -312,6 +313,7 @@ export class RaainDetailsComponent {
312
313
  if (!this.rainNode) {
313
314
  return;
314
315
  }
316
+ this.isAdmin = this.profileService.isAdmin();
315
317
  this.refreshManager.rainNode = this.rainNode;
316
318
  this.compareManager.rainNode = this.rainNode;
317
319
  this.refreshManager.setMethods(this.onRefreshInProgress.bind(this), this.onRefreshDone.bind(this), this.onFetchDone.bind(this));
@@ -340,10 +342,10 @@ export class RaainDetailsComponent {
340
342
  }
341
343
  }
342
344
  RaainDetailsComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: RaainDetailsComponent, deps: [{ token: i1.Storage }], target: i0.ɵɵFactoryTarget.Component });
343
- RaainDetailsComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.10", type: RaainDetailsComponent, selector: "raain-details", inputs: { toggleAdmin: "toggleAdmin", rainNode: "rainNode", compareManager: "compareManager", refreshManager: "refreshManager", profileService: "profileService", radarService: "radarService", toggleCumulative: "toggleCumulative" }, usesOnChanges: true, ngImport: i0, template: "<!-- Main content container -->\n<div *ngIf=\"rainNode\" class=\"raain-details-container\">\n\n <!-- Header section with node info\n <ion-card class=\"node-info-card\">\n <ion-card-content>\n <div class=\"node-header\">\n <div class=\"node-status\">\n <ion-icon *ngIf=\"(rainNode | hasGoodQuality)\" color=\"success\" name=\"checkmark-circle\"></ion-icon>\n <ion-icon *ngIf=\"!(rainNode | hasGoodQuality)\" color=\"warning\" name=\"alert-circle\"></ion-icon>\n </div>\n <div class=\"node-titles\">\n <ion-card-title>{{ rainNode.name }}</ion-card-title>\n <ion-card-subtitle>by {{ teamNode?.name }}</ion-card-subtitle>\n </div>\n <div class=\"node-controls\">\n <ion-label class=\"toggle-label\">History</ion-label>\n <ion-toggle (ionChange)=\"onEnableCountHistoryTab(rainNode)\"\n [(ngModel)]=\"toggleHistory\"\n [checked]=\"toggleHistory\">\n </ion-toggle>\n </div>\n </div>\n </ion-card-content>\n </ion-card>\n-->\n\n <!-- Period selection section -->\n <ion-card class=\"period-card\">\n <ion-card-content>\n <div class=\"period-controls\">\n <div class=\"period-row\">\n <ion-button (click)=\"setPeriodOfNow()\" class=\"now-button\" fill=\"outline\">\n <ion-icon name=\"time-outline\" slot=\"start\"></ion-icon>\n Now\n </ion-button>\n\n <div class=\"period-start ion-hide-md-down\">\n <ion-label>Start:</ion-label>\n <input (change)=\"onPeriodBeginChange($event)\"\n [value]=\"periodBeginAsString\"\n class=\"datetime-input\"\n type=\"datetime-local\">\n </div>\n\n <div class=\"period-duration ion-hide-md-down\">\n <ion-label>Duration:</ion-label>\n <ion-select (ionDismiss)=\"onPeriodDurationChange($event)\"\n [(ngModel)]=\"periodDurationAsString\"\n class=\"duration-select\"\n id=\"periodDuration\"\n interface=\"popover\">\n <ion-select-option value=\"0.25\">15 minutes</ion-select-option>\n <ion-select-option value=\"0.5\">30 minutes</ion-select-option>\n <ion-select-option value=\"1\">1 hour</ion-select-option>\n <ion-select-option value=\"2\">2 hours</ion-select-option>\n <ion-select-option value=\"3\">3 hours</ion-select-option>\n <ion-select-option value=\"4\">4 hours</ion-select-option>\n <ion-select-option value=\"5\">5 hours</ion-select-option>\n <ion-select-option value=\"6\">6 hours</ion-select-option>\n </ion-select>\n </div>\n\n <div id=\"all-dates\" slot=\"end\">\n <ion-label class=\"toggle-label\">All dates</ion-label>\n <ion-toggle (ionChange)=\"onEnableCountHistoryTab(rainNode)\"\n [(ngModel)]=\"toggleHistory\"\n [checked]=\"toggleHistory\">\n </ion-toggle>\n </div>\n </div>\n\n <!-- Hidden label for change detection -->\n <div class=\"hidden-label\">{{ onChangeDetectionTest(rainNode) }}</div>\n </div>\n\n <!-- Historical map section -->\n <div *ngIf=\"toggleHistory\" class=\"period-controls\">\n <raain-date-dynamic (changedDate)=\"onDateChangeInCount($event)\"\n [currentHeight]=\"300\"\n [fetchData]=\"fetchDataWrapper\"\n [points]=\"countPoints\">\n </raain-date-dynamic>\n </div>\n </ion-card-content>\n </ion-card>\n\n\n <!-- Map section -->\n <ion-card class=\"map-card\">\n <ion-card-content class=\"map-content\">\n <ion-grid>\n <ion-row id=\"progressAndRefresh\">\n <ion-label>\n <span *ngIf=\"getPercentOfComputations()\" class=\"map-stats\">\n {{ getPercentOfComputations() }}% Images\n <i *ngIf=\"countsPeriod.progress\" class=\"progress-indicator\">\n In Progress: {{ countsPeriod.progress }}...\n </i>\n </span>\n <span *ngIf=\"!getPercentOfComputations()\" class=\"no-data\">\n No image available\n </span>\n </ion-label>\n\n <ion-button (click)=\"refreshMap()\" *ngIf=\"!refreshInProgress\" class=\"refresh-button\">\n <ion-icon name=\"refresh-outline\" slot=\"start\"></ion-icon>\n Refresh Map\n </ion-button>\n\n <!-- Progress indicator -->\n <ion-progress-bar *ngIf=\"refreshInProgress\"\n [buffer]=\"(countsPeriod.progress / ((timeframeDates?.length || 10) +3))+0.01\"\n [value]=\"countsPeriod.progress / ((timeframeDates?.length || 10) +3)\"\n color=\"primary\">\n </ion-progress-bar>\n </ion-row>\n <ion-row *ngIf=\"toggleMap && getPercentOfImages()\">\n <!-- Map component -->\n <ion-col class=\"map-column\" size-lg=\"7\">\n <div class=\"map-container\">\n <raain-map\n (changedDate)=\"onDateChangeInMap($event)\"\n (changedSum)=\"onSumChangeInMap($event)\"\n (selectedMarker)=\"onGaugeSelectInMap($event)\"\n [coordinates]=\"coordinates\"\n [currentHeight]=\"500\"\n [defaultDate]=\"dateShown\"\n [markers]=\"{\n borders,\n gauges: compareManager.gaugesInMap,\n gaugesInCompare: compareManager.gaugesInCompare,\n selectedGauges: compareManager.selectedGauges,\n pixels: compareManager.selectedPixels,\n pixelsSolution: compareManager.pixelsSolutions?.length ? compareManager.pixelsSolutions[0] : []\n }\"\n [showCumulative]=\"toggleCumulative\"\n [sumFn]=\"refreshManager.sumFn\"\n [sumValues]=\"refreshManager.sumValues\"\n [timeframeContainers]=\"timeframeContainers\"\n [timeframeDates]=\"timeframeDates\">\n </raain-map>\n </div>\n\n <div class=\"data-column\">\n <!-- Technical details (collapsible for cleaner UI) -->\n <details class=\"technical-details\">\n <summary>Image Details</summary>\n <div class=\"details-content\">\n <div class=\"detail-row\">\n <span class=\"detail-label\">Computed:</span>\n <span class=\"detail-value\">{{ refreshManager.rainComputationMapDoneDate | date:'yyyy-MM-dd HH:mm' }}</span>\n </div>\n <div class=\"detail-row\">\n <span class=\"detail-label\">Version:</span>\n <span class=\"detail-value\">{{ refreshManager.rainComputationMapVersion }}</span>\n </div>\n <div class=\"detail-row\">\n <span class=\"detail-label\">Launched by:</span>\n <span class=\"detail-value\">{{ refreshManager.rainComputationMapLaunchedBy }}</span>\n </div>\n <div class=\"detail-row\">\n <span class=\"detail-label\">Time spent:</span>\n <span class=\"detail-value\">{{ refreshManager.rainComputationMapTimeSpentInMs }}\n ms</span>\n </div>\n <div class=\"detail-row\">\n <span class=\"detail-label\">Date:</span>\n <span class=\"detail-value\">{{ refreshManager.rainComputationMapDate?.toISOString() }}\n | {{ refreshManager.rainComputationMapDate | date:'yyyy-MM-dd HH:mm' }}</span>\n </div>\n <div class=\"detail-row\">\n <span class=\"detail-label\">Water in the map:</span>\n <span class=\"detail-value\">{{ sumDetails }}</span>\n </div>\n <div class=\"detail-row\">\n <span class=\"detail-label\">Source DBZ min:</span>\n <span class=\"detail-value\">{{ refreshManager.rainComputationMapOriginalMin }}</span>\n </div>\n <div class=\"detail-row\">\n <span class=\"detail-label\">Source DBZ max:</span>\n <span class=\"detail-value\">{{ refreshManager.rainComputationMapOriginalMax }}</span>\n </div>\n </div>\n </details>\n </div>\n </ion-col>\n\n <!-- Data panel -->\n <ion-col class=\"data-column\" size-lg=\"5\">\n <div class=\"data-panel\">\n <!-- Compare stack component -->\n <div class=\"compare-stack\">\n <raain-compare-stack\n (selectedPoint)=\"onGaugeSelectInCompare($event)\"\n [compareManager]=\"compareManager\"\n [cumulative]=\"toggleCumulative\">\n </raain-compare-stack>\n </div>\n\n <!-- Technical details (collapsible for cleaner UI) -->\n <details class=\"technical-details\">\n <summary>Compare Details</summary>\n <div class=\"details-content\">\n <div [ngClass]=\"{'warning': refreshManager.rainComputationMapDoneDate?.getTime() > compareManager.currentQualityDoneDate?.getTime() + 60000}\"\n class=\"detail-row\">\n <span class=\"detail-label\">Computed:</span>\n <span class=\"detail-value\">{{ compareManager.currentQualityDoneDate | date:'yyyy-MM-dd HH:mm' }}</span>\n </div>\n <div class=\"detail-row\">\n <span class=\"detail-label\">Version:</span>\n <span class=\"detail-value\">{{ compareManager.compareVersion }}</span>\n </div>\n <div class=\"detail-row\">\n <span class=\"detail-label\">Launched by:</span>\n <span class=\"detail-value\">{{ compareManager.currentQualityLaunchedBy }}</span>\n </div>\n <div class=\"detail-row\">\n <span class=\"detail-label\">Time spent:</span>\n <span class=\"detail-value\">{{ compareManager.currentQualityTimeSpentInMs }}\n ms</span>\n </div>\n <div class=\"detail-row\">\n <span class=\"detail-label\">Gauges:</span>\n <span class=\"detail-value\">{{ compareManager.gaugesInCompare.length }}</span>\n </div>\n <div class=\"detail-row\">\n <span class=\"detail-label\">Points:</span>\n <span class=\"detail-value\">{{ compareManager.globalComparePoints.length }}</span>\n </div>\n </div>\n </details>\n </div>\n </ion-col>\n </ion-row>\n <ion-row>\n <!-- Bottom progress bar -->\n <ion-progress-bar *ngIf=\"refreshInProgress\"\n [buffer]=\"(countsPeriod.progress / ((timeframeDates?.length || 10) +3))+0.01\"\n [value]=\"countsPeriod.progress / ((timeframeDates?.length || 10) +3)\"\n color=\"primary\">\n </ion-progress-bar>\n </ion-row>\n </ion-grid>\n </ion-card-content>\n </ion-card>\n\n <!-- Gauge values section -->\n <ion-card *ngIf=\"gaugeSelectedPoints.length && gaugeSelectedPoints[0].values.length\" class=\"gauge-card\">\n <ion-card-header>\n <ion-card-title>\n <ion-icon name=\"analytics-outline\"></ion-icon>\n Selected Gauge Data\n </ion-card-title>\n </ion-card-header>\n <ion-card-content>\n <raain-date-focus\n [currentHeight]=\"300\"\n [focusDate]=\"periodBegin\"\n [focusRange]=\"DateRange.DAY\"\n [points]=\"gaugeSelectedPoints\"\n [withoutAll]=\"true\">\n </raain-date-focus>\n </ion-card-content>\n </ion-card>\n\n</div>\n", styles: [".raain-details-container{max-width:var(--app-max-width);margin:0 auto;padding:0 0 24px}.raain-details-card{width:100%;margin-bottom:20px}.raain-details-card ion-card-header{border-bottom:1px solid rgba(var(--ion-color-medium-rgb),.2)}.raain-details-card ion-card-header ion-card-title{display:flex;align-items:center}.raain-details-card ion-card-header ion-card-title ion-icon{margin-right:8px;color:var(--ion-color-primary)}.node-info-card{background-color:var(--ion-color-light)}.node-info-card .node-header{display:flex;align-items:center}.node-info-card .node-header .node-status{margin-right:16px}.node-info-card .node-header .node-status ion-icon{font-size:24px}.node-info-card .node-header .node-titles{flex:1}.node-info-card .node-header .node-titles ion-card-title{margin:0;font-size:1.4rem;font-weight:600;color:var(--ion-color-dark)}.node-info-card .node-header .node-titles ion-card-subtitle{padding-left:0;margin:4px 0 0;font-size:.9rem;color:var(--ion-color-medium)}.count-map-card,.period-card{background-color:var(--ion-color-light)}.period-card ion-card-title{display:flex;align-items:center}.period-card ion-card-title ion-icon{margin-right:8px;color:var(--ion-color-primary);font-size:20px}.period-row{display:flex;flex-wrap:wrap;align-items:center;gap:16px;position:relative}.now-button{min-width:100px}#all-dates{display:flex;align-items:center;margin-left:auto}#all-dates .toggle-label{margin-right:8px;white-space:nowrap}.refresh-button ion-icon{margin-right:4px;color:var(--ion-color-light)}.period-start,.period-duration{display:flex;align-items:center}.hidden-label{display:none}.datetime-input,#periodDuration,.duration-select{padding:8px 12px;border:1px solid rgba(var(--ion-color-medium-rgb),.3);border-radius:var(--ion-border-radius);background-color:var(--ion-color-light);font-family:var(--ion-font-family)}.datetime-input:focus,#periodDuration:focus,.duration-select:focus{outline:none;border-color:var(--ion-color-primary)}#periodDuration,.duration-select{min-width:150px}.map-card{background-color:var(--ion-color-light)}.map-card .map-header{display:flex;justify-content:space-between;align-items:center;flex-direction:row;gap:16px}.map-card .map-stats,.map-card .no-data{font-size:.8rem;font-weight:400;color:var(--ion-color-medium);margin-left:8px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.map-card .progress-indicator{color:var(--ion-color-primary)}.map-card .map-toggle{display:flex;align-items:center}.map-card .map-content{padding:0}.map-card .map-content ion-grid,.map-card .map-content ion-row{padding:0;margin:0}.map-card .map-content #progressAndRefresh{display:flex;justify-content:flex-end;align-items:center;padding:8px 16px}.map-card .map-content #progressAndRefresh ion-label{margin-right:16px}.map-card .map-content .map-column{padding:0}.map-card .map-content .map-column .map-container{border-radius:var(--ion-border-radius);overflow:visible}.map-card .map-content .data-column{padding:16px}.map-card .map-content .data-column .data-panel{height:100%;display:flex;flex-direction:column}.map-card .map-content .data-column .panel-header{display:flex;justify-content:space-between;align-items:center;margin-bottom:16px}.map-card .map-content .data-column .panel-header h3{margin:0;font-size:1.2rem;font-weight:600}.map-card .map-content .data-column .computation-info,.map-card .map-content .data-column .technical-details{background-color:rgba(var(--ion-color-light-rgb),.5);border-radius:var(--ion-border-radius);padding:12px;margin-bottom:16px}.map-card .map-content .data-column .info-row,.map-card .map-content .data-column .detail-row{display:flex;margin-bottom:4px;font-size:.9rem}.map-card .map-content .data-column .info-row:last-child,.map-card .map-content .data-column .detail-row:last-child{margin-bottom:0}.map-card .map-content .data-column .compare-stack{flex:1;margin-bottom:16px}.map-card .map-content .data-column .technical-details{background-color:rgba(var(--ion-color-light-rgb),.5);border-radius:var(--ion-border-radius);padding:12px}.map-card .map-content .data-column .technical-details summary{font-weight:500;color:var(--ion-color-medium);cursor:pointer}.map-card .map-content .data-column .technical-details summary:hover{color:var(--ion-color-primary)}.map-card .map-content .data-column .technical-details .details-content{margin-top:8px;font-size:.85rem}.map-card .map-content .data-column .technical-details .details-content .detail-row{display:flex;flex-wrap:wrap;margin-bottom:4px}.map-card .map-content .data-column .technical-details .details-content .detail-row:last-child{margin-bottom:0}.map-card .map-content .data-column .technical-details .details-content .detail-row.warning{color:var(--ion-color-warning)}.map-card .map-content .data-column .technical-details .details-content .detail-row .detail-label{font-weight:500;color:var(--ion-color-dark);width:140px}.map-card .map-content .data-column .technical-details .details-content .detail-row .detail-value{color:var(--ion-color-medium)}.map-card .map-content .data-column .technical-details .details-content .detail-row .warning-text{color:var(--ion-color-danger);margin-left:8px}.gauge-card{background-color:var(--ion-color-light)}.gauge-card ion-card-title{display:flex;align-items:center}.gauge-card ion-card-title ion-icon{margin-right:8px;color:var(--ion-color-primary);font-size:20px}raain-compare-stack{width:100%;display:block}@media (max-width: 768px){.period-row{flex-direction:row;justify-content:space-between;align-items:center}#all-dates{margin-left:auto;padding-left:8px}#all-dates .toggle-label{font-size:.9rem}.map-header{flex-direction:row;justify-content:space-between;align-items:center;gap:16px}}\n"], dependencies: [{ kind: "directive", type: i2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i3.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i4.IonButton, selector: "ion-button", inputs: ["buttonType", "color", "disabled", "download", "expand", "fill", "form", "href", "mode", "rel", "routerAnimation", "routerDirection", "shape", "size", "strong", "target", "type"] }, { kind: "component", type: i4.IonCard, selector: "ion-card", inputs: ["button", "color", "disabled", "download", "href", "mode", "rel", "routerAnimation", "routerDirection", "target", "type"] }, { kind: "component", type: i4.IonCardContent, selector: "ion-card-content", inputs: ["mode"] }, { kind: "component", type: i4.IonCardHeader, selector: "ion-card-header", inputs: ["color", "mode", "translucent"] }, { kind: "component", type: i4.IonCardTitle, selector: "ion-card-title", inputs: ["color", "mode"] }, { kind: "component", type: i4.IonCol, selector: "ion-col", inputs: ["offset", "offsetLg", "offsetMd", "offsetSm", "offsetXl", "offsetXs", "pull", "pullLg", "pullMd", "pullSm", "pullXl", "pullXs", "push", "pushLg", "pushMd", "pushSm", "pushXl", "pushXs", "size", "sizeLg", "sizeMd", "sizeSm", "sizeXl", "sizeXs"] }, { kind: "component", type: i4.IonGrid, selector: "ion-grid", inputs: ["fixed"] }, { kind: "component", type: i4.IonIcon, selector: "ion-icon", inputs: ["color", "flipRtl", "icon", "ios", "lazy", "md", "mode", "name", "sanitize", "size", "src"] }, { kind: "component", type: i4.IonLabel, selector: "ion-label", inputs: ["color", "mode", "position"] }, { kind: "component", type: i4.IonProgressBar, selector: "ion-progress-bar", inputs: ["buffer", "color", "mode", "reversed", "type", "value"] }, { kind: "component", type: i4.IonRow, selector: "ion-row" }, { kind: "component", type: i4.IonSelect, selector: "ion-select", inputs: ["cancelText", "compareWith", "disabled", "interface", "interfaceOptions", "mode", "multiple", "name", "okText", "placeholder", "selectedText", "value"] }, { kind: "component", type: i4.IonSelectOption, selector: "ion-select-option", inputs: ["disabled", "value"] }, { kind: "component", type: i4.IonToggle, selector: "ion-toggle", inputs: ["checked", "color", "disabled", "enableOnOffLabels", "mode", "name", "value"] }, { kind: "directive", type: i4.BooleanValueAccessor, selector: "ion-checkbox,ion-toggle" }, { kind: "directive", type: i4.SelectValueAccessor, selector: "ion-range, ion-select, ion-radio-group, ion-segment, ion-datetime" }, { kind: "component", type: i5.RaainMapComponent, selector: "raain-map", inputs: ["coordinates", "markers", "timeframeContainers", "autoplay", "showMarkers", "showCumulative", "currentHeight", "timeframeDates", "defaultDate", "sumValues", "sumFn"], outputs: ["selectedMarker", "changedDate", "changedSum"] }, { kind: "component", type: i6.RaainCompareStackComponent, selector: "raain-compare-stack", inputs: ["compareManager", "currentHeight", "cumulative"], outputs: ["selectedPoint"] }, { kind: "component", type: i7.RaainDateFocusComponent, selector: "raain-date-focus", inputs: ["points", "focusDate", "focusRange", "withoutAll", "currentHeight"] }, { kind: "component", type: i8.RaainDateDynamicComponent, selector: "raain-date-dynamic", inputs: ["points", "focusDate", "focusRange", "withoutAll", "currentHeight", "fetchData"], outputs: ["changedDate"] }, { kind: "pipe", type: i2.DatePipe, name: "date" }] });
345
+ RaainDetailsComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.10", type: RaainDetailsComponent, selector: "raain-details", inputs: { toggleAdmin: "toggleAdmin", rainNode: "rainNode", compareManager: "compareManager", refreshManager: "refreshManager", profileService: "profileService", radarService: "radarService", toggleCumulative: "toggleCumulative" }, usesOnChanges: true, ngImport: i0, template: "<!-- Main content container -->\n<div *ngIf=\"rainNode\" class=\"raain-details-container\">\n\n <!-- Header section with node info\n <ion-card class=\"node-info-card\">\n <ion-card-content>\n <div class=\"node-header\">\n <div class=\"node-status\">\n <ion-icon *ngIf=\"(rainNode | hasGoodQuality)\" color=\"success\" name=\"checkmark-circle\"></ion-icon>\n <ion-icon *ngIf=\"!(rainNode | hasGoodQuality)\" color=\"warning\" name=\"alert-circle\"></ion-icon>\n </div>\n <div class=\"node-titles\">\n <ion-card-title>{{ rainNode.name }}</ion-card-title>\n <ion-card-subtitle>by {{ teamNode?.name }}</ion-card-subtitle>\n </div>\n <div class=\"node-controls\">\n <ion-label class=\"toggle-label\">History</ion-label>\n <ion-toggle (ionChange)=\"onEnableCountHistoryTab(rainNode)\"\n [(ngModel)]=\"toggleHistory\"\n [checked]=\"toggleHistory\">\n </ion-toggle>\n </div>\n </div>\n </ion-card-content>\n </ion-card>\n-->\n\n <!-- Period selection section -->\n <ion-card class=\"period-card\">\n <ion-card-content>\n <div class=\"period-controls\">\n <div class=\"period-row\">\n <ion-button (click)=\"setPeriodOfNow()\" class=\"now-button\" fill=\"outline\">\n <ion-icon name=\"time-outline\" slot=\"start\"></ion-icon>\n Now\n </ion-button>\n\n <div class=\"period-start ion-hide-md-down\">\n <ion-label>Start:</ion-label>\n <input (change)=\"onPeriodBeginChange($event)\"\n [value]=\"periodBeginAsString\"\n class=\"datetime-input\"\n type=\"datetime-local\">\n </div>\n\n <div class=\"period-duration ion-hide-md-down\">\n <ion-label>Duration:</ion-label>\n <ion-select (ionDismiss)=\"onPeriodDurationChange($event)\"\n [(ngModel)]=\"periodDurationAsString\"\n class=\"duration-select\"\n id=\"periodDuration\"\n interface=\"popover\">\n <ion-select-option value=\"0.25\">15 minutes</ion-select-option>\n <ion-select-option value=\"0.5\">30 minutes</ion-select-option>\n <ion-select-option value=\"1\">1 hour</ion-select-option>\n <ion-select-option value=\"2\">2 hours</ion-select-option>\n <ion-select-option value=\"3\">3 hours</ion-select-option>\n <ion-select-option value=\"4\">4 hours</ion-select-option>\n <ion-select-option value=\"5\">5 hours</ion-select-option>\n <ion-select-option value=\"6\">6 hours</ion-select-option>\n <ion-select-option *ngIf=\"isAdmin\" value=\"24\">24 hours</ion-select-option>\n </ion-select>\n </div>\n\n <div id=\"all-dates\" slot=\"end\">\n <ion-label class=\"toggle-label\">All dates</ion-label>\n <ion-toggle (ionChange)=\"onEnableCountHistoryTab(rainNode)\"\n [(ngModel)]=\"toggleHistory\"\n [checked]=\"toggleHistory\">\n </ion-toggle>\n </div>\n </div>\n\n <!-- Hidden label for change detection -->\n <div class=\"hidden-label\">{{ onChangeDetectionTest(rainNode) }}</div>\n </div>\n\n <!-- Historical map section -->\n <div *ngIf=\"toggleHistory\" class=\"period-controls\">\n <raain-date-dynamic (changedDate)=\"onDateChangeInCount($event)\"\n [currentHeight]=\"300\"\n [fetchData]=\"fetchDataWrapper\"\n [points]=\"countPoints\">\n </raain-date-dynamic>\n </div>\n </ion-card-content>\n </ion-card>\n\n\n <!-- Map section -->\n <ion-card class=\"map-card\">\n <ion-card-content class=\"map-content\">\n <ion-grid>\n <ion-row id=\"progressAndRefresh\">\n <ion-label>\n <span *ngIf=\"getPercentOfComputations()\" class=\"map-stats\">\n {{ getPercentOfComputations() }}% Images\n <i *ngIf=\"countsPeriod.progress\" class=\"progress-indicator\">\n In Progress: {{ countsPeriod.progress }}...\n </i>\n </span>\n <span *ngIf=\"!getPercentOfComputations()\" class=\"no-data\">\n No image available\n </span>\n </ion-label>\n\n <ion-button (click)=\"refreshMap()\" *ngIf=\"!refreshInProgress\" class=\"refresh-button\">\n <ion-icon name=\"refresh-outline\" slot=\"start\"></ion-icon>\n Refresh Map\n </ion-button>\n\n <!-- Progress indicator -->\n <ion-progress-bar *ngIf=\"refreshInProgress\"\n [buffer]=\"(countsPeriod.progress / ((timeframeDates?.length || 10) +3))+0.01\"\n [value]=\"countsPeriod.progress / ((timeframeDates?.length || 10) +3)\"\n color=\"primary\">\n </ion-progress-bar>\n </ion-row>\n <ion-row *ngIf=\"toggleMap && getPercentOfImages()\">\n <!-- Map component -->\n <ion-col class=\"map-column\" size-lg=\"7\">\n <div class=\"map-container\">\n <raain-map\n (changedDate)=\"onDateChangeInMap($event)\"\n (changedSum)=\"onSumChangeInMap($event)\"\n (selectedMarker)=\"onGaugeSelectInMap($event)\"\n [coordinates]=\"coordinates\"\n [currentHeight]=\"500\"\n [defaultDate]=\"dateShown\"\n [markers]=\"{\n borders,\n gauges: compareManager.gaugesInMap,\n gaugesInCompare: compareManager.gaugesInCompare,\n selectedGauges: compareManager.selectedGauges,\n pixels: compareManager.selectedPixels,\n pixelsSolution: compareManager.pixelsSolutions?.length ? compareManager.pixelsSolutions[0] : []\n }\"\n [showCumulative]=\"toggleCumulative\"\n [sumFn]=\"refreshManager.sumFn\"\n [sumValues]=\"refreshManager.sumValues\"\n [timeframeContainers]=\"timeframeContainers\"\n [timeframeDates]=\"timeframeDates\">\n </raain-map>\n </div>\n\n <div class=\"data-column\">\n <!-- Technical details (collapsible for cleaner UI) -->\n <details class=\"technical-details\">\n <summary>Image Details</summary>\n <div class=\"details-content\">\n <div class=\"detail-row\">\n <span class=\"detail-label\">Computed:</span>\n <span class=\"detail-value\">{{ refreshManager.rainComputationMapDoneDate | date:'yyyy-MM-dd HH:mm' }}</span>\n </div>\n <div class=\"detail-row\">\n <span class=\"detail-label\">Version:</span>\n <span class=\"detail-value\">{{ refreshManager.rainComputationMapVersion }}</span>\n </div>\n <div class=\"detail-row\">\n <span class=\"detail-label\">Launched by:</span>\n <span class=\"detail-value\">{{ refreshManager.rainComputationMapLaunchedBy }}</span>\n </div>\n <div class=\"detail-row\">\n <span class=\"detail-label\">Time spent:</span>\n <span class=\"detail-value\">{{ refreshManager.rainComputationMapTimeSpentInMs }}\n ms</span>\n </div>\n <div class=\"detail-row\">\n <span class=\"detail-label\">Date:</span>\n <span class=\"detail-value\">{{ refreshManager.rainComputationMapDate?.toISOString() }}\n | {{ refreshManager.rainComputationMapDate | date:'yyyy-MM-dd HH:mm' }}</span>\n </div>\n <div class=\"detail-row\">\n <span class=\"detail-label\">Water in the map:</span>\n <span class=\"detail-value\">{{ sumDetails }}</span>\n </div>\n <div class=\"detail-row\">\n <span class=\"detail-label\">Source DBZ min:</span>\n <span class=\"detail-value\">{{ refreshManager.rainComputationMapOriginalMin }}</span>\n </div>\n <div class=\"detail-row\">\n <span class=\"detail-label\">Source DBZ max:</span>\n <span class=\"detail-value\">{{ refreshManager.rainComputationMapOriginalMax }}</span>\n </div>\n </div>\n </details>\n </div>\n </ion-col>\n\n <!-- Data panel -->\n <ion-col class=\"data-column\" size-lg=\"5\">\n <div class=\"data-panel\">\n <!-- Compare stack component -->\n <div class=\"compare-stack\">\n <raain-compare-stack\n (selectedPoint)=\"onGaugeSelectInCompare($event)\"\n [compareManager]=\"compareManager\"\n [cumulative]=\"toggleCumulative\">\n </raain-compare-stack>\n </div>\n\n <!-- Technical details (collapsible for cleaner UI) -->\n <details class=\"technical-details\">\n <summary>Compare Details</summary>\n <div class=\"details-content\">\n <div [ngClass]=\"{'warning': refreshManager.rainComputationMapDoneDate?.getTime() > compareManager.currentQualityDoneDate?.getTime() + 60000}\"\n class=\"detail-row\">\n <span class=\"detail-label\">Computed:</span>\n <span class=\"detail-value\">{{ compareManager.currentQualityDoneDate | date:'yyyy-MM-dd HH:mm' }}</span>\n </div>\n <div class=\"detail-row\">\n <span class=\"detail-label\">Version:</span>\n <span class=\"detail-value\">{{ compareManager.compareVersion }}</span>\n </div>\n <div class=\"detail-row\">\n <span class=\"detail-label\">Launched by:</span>\n <span class=\"detail-value\">{{ compareManager.currentQualityLaunchedBy }}</span>\n </div>\n <div class=\"detail-row\">\n <span class=\"detail-label\">Time spent:</span>\n <span class=\"detail-value\">{{ compareManager.currentQualityTimeSpentInMs }}\n ms</span>\n </div>\n <div class=\"detail-row\">\n <span class=\"detail-label\">Gauges:</span>\n <span class=\"detail-value\">{{ compareManager.gaugesInCompare.length }}</span>\n </div>\n <div class=\"detail-row\">\n <span class=\"detail-label\">Points:</span>\n <span class=\"detail-value\">{{ compareManager.globalComparePoints.length }}</span>\n </div>\n </div>\n </details>\n </div>\n </ion-col>\n </ion-row>\n <ion-row>\n <!-- Bottom progress bar -->\n <ion-progress-bar *ngIf=\"refreshInProgress\"\n [buffer]=\"(countsPeriod.progress / ((timeframeDates?.length || 10) +3))+0.01\"\n [value]=\"countsPeriod.progress / ((timeframeDates?.length || 10) +3)\"\n color=\"primary\">\n </ion-progress-bar>\n </ion-row>\n </ion-grid>\n </ion-card-content>\n </ion-card>\n\n <!-- Gauge values section -->\n <ion-card *ngIf=\"gaugeSelectedPoints.length && gaugeSelectedPoints[0].values.length\" class=\"gauge-card\">\n <ion-card-header>\n <ion-card-title>\n <ion-icon name=\"analytics-outline\"></ion-icon>\n Selected Gauge Data\n </ion-card-title>\n </ion-card-header>\n <ion-card-content>\n <raain-date-focus\n [currentHeight]=\"300\"\n [focusDate]=\"periodBegin\"\n [focusRange]=\"DateRange.DAY\"\n [points]=\"gaugeSelectedPoints\"\n [withoutAll]=\"true\">\n </raain-date-focus>\n </ion-card-content>\n </ion-card>\n\n</div>\n", styles: [".raain-details-container{max-width:var(--app-max-width);margin:0 auto;padding:0 0 24px}.raain-details-card{width:100%;margin-bottom:20px}.raain-details-card ion-card-header{border-bottom:1px solid rgba(var(--ion-color-medium-rgb),.2)}.raain-details-card ion-card-header ion-card-title{display:flex;align-items:center}.raain-details-card ion-card-header ion-card-title ion-icon{margin-right:8px;color:var(--ion-color-primary)}.node-info-card{background-color:var(--ion-color-light)}.node-info-card .node-header{display:flex;align-items:center}.node-info-card .node-header .node-status{margin-right:16px}.node-info-card .node-header .node-status ion-icon{font-size:24px}.node-info-card .node-header .node-titles{flex:1}.node-info-card .node-header .node-titles ion-card-title{margin:0;font-size:1.4rem;font-weight:600;color:var(--ion-color-dark)}.node-info-card .node-header .node-titles ion-card-subtitle{padding-left:0;margin:4px 0 0;font-size:.9rem;color:var(--ion-color-medium)}.count-map-card,.period-card{background-color:var(--ion-color-light)}.period-card ion-card-title{display:flex;align-items:center}.period-card ion-card-title ion-icon{margin-right:8px;color:var(--ion-color-primary);font-size:20px}.period-row{display:flex;flex-wrap:wrap;align-items:center;gap:16px;position:relative}.now-button{min-width:100px}#all-dates{display:flex;align-items:center;margin-left:auto}#all-dates .toggle-label{margin-right:8px;white-space:nowrap}.refresh-button ion-icon{margin-right:4px;color:var(--ion-color-light)}.period-start,.period-duration{display:flex;align-items:center}.hidden-label{display:none}.datetime-input,#periodDuration,.duration-select{padding:8px 12px;border:1px solid rgba(var(--ion-color-medium-rgb),.3);border-radius:var(--ion-border-radius);background-color:var(--ion-color-light);font-family:var(--ion-font-family)}.datetime-input:focus,#periodDuration:focus,.duration-select:focus{outline:none;border-color:var(--ion-color-primary)}#periodDuration,.duration-select{min-width:150px}.map-card{background-color:var(--ion-color-light)}.map-card .map-header{display:flex;justify-content:space-between;align-items:center;flex-direction:row;gap:16px}.map-card .map-stats,.map-card .no-data{font-size:.8rem;font-weight:400;color:var(--ion-color-medium);margin-left:8px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.map-card .progress-indicator{color:var(--ion-color-primary)}.map-card .map-toggle{display:flex;align-items:center}.map-card .map-content{padding:0}.map-card .map-content ion-grid,.map-card .map-content ion-row{padding:0;margin:0}.map-card .map-content #progressAndRefresh{display:flex;justify-content:flex-end;align-items:center;padding:8px 16px}.map-card .map-content #progressAndRefresh ion-label{margin-right:16px}.map-card .map-content .map-column{padding:0}.map-card .map-content .map-column .map-container{border-radius:var(--ion-border-radius);overflow:visible}.map-card .map-content .data-column{padding:16px}.map-card .map-content .data-column .data-panel{height:100%;display:flex;flex-direction:column}.map-card .map-content .data-column .panel-header{display:flex;justify-content:space-between;align-items:center;margin-bottom:16px}.map-card .map-content .data-column .panel-header h3{margin:0;font-size:1.2rem;font-weight:600}.map-card .map-content .data-column .computation-info,.map-card .map-content .data-column .technical-details{background-color:rgba(var(--ion-color-light-rgb),.5);border-radius:var(--ion-border-radius);padding:12px;margin-bottom:16px}.map-card .map-content .data-column .info-row,.map-card .map-content .data-column .detail-row{display:flex;margin-bottom:4px;font-size:.9rem}.map-card .map-content .data-column .info-row:last-child,.map-card .map-content .data-column .detail-row:last-child{margin-bottom:0}.map-card .map-content .data-column .compare-stack{flex:1;margin-bottom:16px}.map-card .map-content .data-column .technical-details{background-color:rgba(var(--ion-color-light-rgb),.5);border-radius:var(--ion-border-radius);padding:12px}.map-card .map-content .data-column .technical-details summary{font-weight:500;color:var(--ion-color-medium);cursor:pointer}.map-card .map-content .data-column .technical-details summary:hover{color:var(--ion-color-primary)}.map-card .map-content .data-column .technical-details .details-content{margin-top:8px;font-size:.85rem}.map-card .map-content .data-column .technical-details .details-content .detail-row{display:flex;flex-wrap:wrap;margin-bottom:4px}.map-card .map-content .data-column .technical-details .details-content .detail-row:last-child{margin-bottom:0}.map-card .map-content .data-column .technical-details .details-content .detail-row.warning{color:var(--ion-color-warning)}.map-card .map-content .data-column .technical-details .details-content .detail-row .detail-label{font-weight:500;color:var(--ion-color-dark);width:140px}.map-card .map-content .data-column .technical-details .details-content .detail-row .detail-value{color:var(--ion-color-medium)}.map-card .map-content .data-column .technical-details .details-content .detail-row .warning-text{color:var(--ion-color-danger);margin-left:8px}.gauge-card{background-color:var(--ion-color-light)}.gauge-card ion-card-title{display:flex;align-items:center}.gauge-card ion-card-title ion-icon{margin-right:8px;color:var(--ion-color-primary);font-size:20px}raain-compare-stack{width:100%;display:block}@media (max-width: 768px){.period-row{flex-direction:row;justify-content:space-between;align-items:center}#all-dates{margin-left:auto;padding-left:8px}#all-dates .toggle-label{font-size:.9rem}.map-header{flex-direction:row;justify-content:space-between;align-items:center;gap:16px}}\n"], dependencies: [{ kind: "directive", type: i2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i3.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i4.IonButton, selector: "ion-button", inputs: ["buttonType", "color", "disabled", "download", "expand", "fill", "form", "href", "mode", "rel", "routerAnimation", "routerDirection", "shape", "size", "strong", "target", "type"] }, { kind: "component", type: i4.IonCard, selector: "ion-card", inputs: ["button", "color", "disabled", "download", "href", "mode", "rel", "routerAnimation", "routerDirection", "target", "type"] }, { kind: "component", type: i4.IonCardContent, selector: "ion-card-content", inputs: ["mode"] }, { kind: "component", type: i4.IonCardHeader, selector: "ion-card-header", inputs: ["color", "mode", "translucent"] }, { kind: "component", type: i4.IonCardTitle, selector: "ion-card-title", inputs: ["color", "mode"] }, { kind: "component", type: i4.IonCol, selector: "ion-col", inputs: ["offset", "offsetLg", "offsetMd", "offsetSm", "offsetXl", "offsetXs", "pull", "pullLg", "pullMd", "pullSm", "pullXl", "pullXs", "push", "pushLg", "pushMd", "pushSm", "pushXl", "pushXs", "size", "sizeLg", "sizeMd", "sizeSm", "sizeXl", "sizeXs"] }, { kind: "component", type: i4.IonGrid, selector: "ion-grid", inputs: ["fixed"] }, { kind: "component", type: i4.IonIcon, selector: "ion-icon", inputs: ["color", "flipRtl", "icon", "ios", "lazy", "md", "mode", "name", "sanitize", "size", "src"] }, { kind: "component", type: i4.IonLabel, selector: "ion-label", inputs: ["color", "mode", "position"] }, { kind: "component", type: i4.IonProgressBar, selector: "ion-progress-bar", inputs: ["buffer", "color", "mode", "reversed", "type", "value"] }, { kind: "component", type: i4.IonRow, selector: "ion-row" }, { kind: "component", type: i4.IonSelect, selector: "ion-select", inputs: ["cancelText", "compareWith", "disabled", "interface", "interfaceOptions", "mode", "multiple", "name", "okText", "placeholder", "selectedText", "value"] }, { kind: "component", type: i4.IonSelectOption, selector: "ion-select-option", inputs: ["disabled", "value"] }, { kind: "component", type: i4.IonToggle, selector: "ion-toggle", inputs: ["checked", "color", "disabled", "enableOnOffLabels", "mode", "name", "value"] }, { kind: "directive", type: i4.BooleanValueAccessor, selector: "ion-checkbox,ion-toggle" }, { kind: "directive", type: i4.SelectValueAccessor, selector: "ion-range, ion-select, ion-radio-group, ion-segment, ion-datetime" }, { kind: "component", type: i5.RaainMapComponent, selector: "raain-map", inputs: ["coordinates", "markers", "timeframeContainers", "autoplay", "showMarkers", "showCumulative", "currentHeight", "timeframeDates", "defaultDate", "sumValues", "sumFn"], outputs: ["selectedMarker", "changedDate", "changedSum"] }, { kind: "component", type: i6.RaainCompareStackComponent, selector: "raain-compare-stack", inputs: ["compareManager", "currentHeight", "cumulative"], outputs: ["selectedPoint"] }, { kind: "component", type: i7.RaainDateFocusComponent, selector: "raain-date-focus", inputs: ["points", "focusDate", "focusRange", "withoutAll", "currentHeight"] }, { kind: "component", type: i8.RaainDateDynamicComponent, selector: "raain-date-dynamic", inputs: ["points", "focusDate", "focusRange", "withoutAll", "currentHeight", "fetchData"], outputs: ["changedDate"] }, { kind: "pipe", type: i2.DatePipe, name: "date" }] });
344
346
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: RaainDetailsComponent, decorators: [{
345
347
  type: Component,
346
- args: [{ selector: 'raain-details', template: "<!-- Main content container -->\n<div *ngIf=\"rainNode\" class=\"raain-details-container\">\n\n <!-- Header section with node info\n <ion-card class=\"node-info-card\">\n <ion-card-content>\n <div class=\"node-header\">\n <div class=\"node-status\">\n <ion-icon *ngIf=\"(rainNode | hasGoodQuality)\" color=\"success\" name=\"checkmark-circle\"></ion-icon>\n <ion-icon *ngIf=\"!(rainNode | hasGoodQuality)\" color=\"warning\" name=\"alert-circle\"></ion-icon>\n </div>\n <div class=\"node-titles\">\n <ion-card-title>{{ rainNode.name }}</ion-card-title>\n <ion-card-subtitle>by {{ teamNode?.name }}</ion-card-subtitle>\n </div>\n <div class=\"node-controls\">\n <ion-label class=\"toggle-label\">History</ion-label>\n <ion-toggle (ionChange)=\"onEnableCountHistoryTab(rainNode)\"\n [(ngModel)]=\"toggleHistory\"\n [checked]=\"toggleHistory\">\n </ion-toggle>\n </div>\n </div>\n </ion-card-content>\n </ion-card>\n-->\n\n <!-- Period selection section -->\n <ion-card class=\"period-card\">\n <ion-card-content>\n <div class=\"period-controls\">\n <div class=\"period-row\">\n <ion-button (click)=\"setPeriodOfNow()\" class=\"now-button\" fill=\"outline\">\n <ion-icon name=\"time-outline\" slot=\"start\"></ion-icon>\n Now\n </ion-button>\n\n <div class=\"period-start ion-hide-md-down\">\n <ion-label>Start:</ion-label>\n <input (change)=\"onPeriodBeginChange($event)\"\n [value]=\"periodBeginAsString\"\n class=\"datetime-input\"\n type=\"datetime-local\">\n </div>\n\n <div class=\"period-duration ion-hide-md-down\">\n <ion-label>Duration:</ion-label>\n <ion-select (ionDismiss)=\"onPeriodDurationChange($event)\"\n [(ngModel)]=\"periodDurationAsString\"\n class=\"duration-select\"\n id=\"periodDuration\"\n interface=\"popover\">\n <ion-select-option value=\"0.25\">15 minutes</ion-select-option>\n <ion-select-option value=\"0.5\">30 minutes</ion-select-option>\n <ion-select-option value=\"1\">1 hour</ion-select-option>\n <ion-select-option value=\"2\">2 hours</ion-select-option>\n <ion-select-option value=\"3\">3 hours</ion-select-option>\n <ion-select-option value=\"4\">4 hours</ion-select-option>\n <ion-select-option value=\"5\">5 hours</ion-select-option>\n <ion-select-option value=\"6\">6 hours</ion-select-option>\n </ion-select>\n </div>\n\n <div id=\"all-dates\" slot=\"end\">\n <ion-label class=\"toggle-label\">All dates</ion-label>\n <ion-toggle (ionChange)=\"onEnableCountHistoryTab(rainNode)\"\n [(ngModel)]=\"toggleHistory\"\n [checked]=\"toggleHistory\">\n </ion-toggle>\n </div>\n </div>\n\n <!-- Hidden label for change detection -->\n <div class=\"hidden-label\">{{ onChangeDetectionTest(rainNode) }}</div>\n </div>\n\n <!-- Historical map section -->\n <div *ngIf=\"toggleHistory\" class=\"period-controls\">\n <raain-date-dynamic (changedDate)=\"onDateChangeInCount($event)\"\n [currentHeight]=\"300\"\n [fetchData]=\"fetchDataWrapper\"\n [points]=\"countPoints\">\n </raain-date-dynamic>\n </div>\n </ion-card-content>\n </ion-card>\n\n\n <!-- Map section -->\n <ion-card class=\"map-card\">\n <ion-card-content class=\"map-content\">\n <ion-grid>\n <ion-row id=\"progressAndRefresh\">\n <ion-label>\n <span *ngIf=\"getPercentOfComputations()\" class=\"map-stats\">\n {{ getPercentOfComputations() }}% Images\n <i *ngIf=\"countsPeriod.progress\" class=\"progress-indicator\">\n In Progress: {{ countsPeriod.progress }}...\n </i>\n </span>\n <span *ngIf=\"!getPercentOfComputations()\" class=\"no-data\">\n No image available\n </span>\n </ion-label>\n\n <ion-button (click)=\"refreshMap()\" *ngIf=\"!refreshInProgress\" class=\"refresh-button\">\n <ion-icon name=\"refresh-outline\" slot=\"start\"></ion-icon>\n Refresh Map\n </ion-button>\n\n <!-- Progress indicator -->\n <ion-progress-bar *ngIf=\"refreshInProgress\"\n [buffer]=\"(countsPeriod.progress / ((timeframeDates?.length || 10) +3))+0.01\"\n [value]=\"countsPeriod.progress / ((timeframeDates?.length || 10) +3)\"\n color=\"primary\">\n </ion-progress-bar>\n </ion-row>\n <ion-row *ngIf=\"toggleMap && getPercentOfImages()\">\n <!-- Map component -->\n <ion-col class=\"map-column\" size-lg=\"7\">\n <div class=\"map-container\">\n <raain-map\n (changedDate)=\"onDateChangeInMap($event)\"\n (changedSum)=\"onSumChangeInMap($event)\"\n (selectedMarker)=\"onGaugeSelectInMap($event)\"\n [coordinates]=\"coordinates\"\n [currentHeight]=\"500\"\n [defaultDate]=\"dateShown\"\n [markers]=\"{\n borders,\n gauges: compareManager.gaugesInMap,\n gaugesInCompare: compareManager.gaugesInCompare,\n selectedGauges: compareManager.selectedGauges,\n pixels: compareManager.selectedPixels,\n pixelsSolution: compareManager.pixelsSolutions?.length ? compareManager.pixelsSolutions[0] : []\n }\"\n [showCumulative]=\"toggleCumulative\"\n [sumFn]=\"refreshManager.sumFn\"\n [sumValues]=\"refreshManager.sumValues\"\n [timeframeContainers]=\"timeframeContainers\"\n [timeframeDates]=\"timeframeDates\">\n </raain-map>\n </div>\n\n <div class=\"data-column\">\n <!-- Technical details (collapsible for cleaner UI) -->\n <details class=\"technical-details\">\n <summary>Image Details</summary>\n <div class=\"details-content\">\n <div class=\"detail-row\">\n <span class=\"detail-label\">Computed:</span>\n <span class=\"detail-value\">{{ refreshManager.rainComputationMapDoneDate | date:'yyyy-MM-dd HH:mm' }}</span>\n </div>\n <div class=\"detail-row\">\n <span class=\"detail-label\">Version:</span>\n <span class=\"detail-value\">{{ refreshManager.rainComputationMapVersion }}</span>\n </div>\n <div class=\"detail-row\">\n <span class=\"detail-label\">Launched by:</span>\n <span class=\"detail-value\">{{ refreshManager.rainComputationMapLaunchedBy }}</span>\n </div>\n <div class=\"detail-row\">\n <span class=\"detail-label\">Time spent:</span>\n <span class=\"detail-value\">{{ refreshManager.rainComputationMapTimeSpentInMs }}\n ms</span>\n </div>\n <div class=\"detail-row\">\n <span class=\"detail-label\">Date:</span>\n <span class=\"detail-value\">{{ refreshManager.rainComputationMapDate?.toISOString() }}\n | {{ refreshManager.rainComputationMapDate | date:'yyyy-MM-dd HH:mm' }}</span>\n </div>\n <div class=\"detail-row\">\n <span class=\"detail-label\">Water in the map:</span>\n <span class=\"detail-value\">{{ sumDetails }}</span>\n </div>\n <div class=\"detail-row\">\n <span class=\"detail-label\">Source DBZ min:</span>\n <span class=\"detail-value\">{{ refreshManager.rainComputationMapOriginalMin }}</span>\n </div>\n <div class=\"detail-row\">\n <span class=\"detail-label\">Source DBZ max:</span>\n <span class=\"detail-value\">{{ refreshManager.rainComputationMapOriginalMax }}</span>\n </div>\n </div>\n </details>\n </div>\n </ion-col>\n\n <!-- Data panel -->\n <ion-col class=\"data-column\" size-lg=\"5\">\n <div class=\"data-panel\">\n <!-- Compare stack component -->\n <div class=\"compare-stack\">\n <raain-compare-stack\n (selectedPoint)=\"onGaugeSelectInCompare($event)\"\n [compareManager]=\"compareManager\"\n [cumulative]=\"toggleCumulative\">\n </raain-compare-stack>\n </div>\n\n <!-- Technical details (collapsible for cleaner UI) -->\n <details class=\"technical-details\">\n <summary>Compare Details</summary>\n <div class=\"details-content\">\n <div [ngClass]=\"{'warning': refreshManager.rainComputationMapDoneDate?.getTime() > compareManager.currentQualityDoneDate?.getTime() + 60000}\"\n class=\"detail-row\">\n <span class=\"detail-label\">Computed:</span>\n <span class=\"detail-value\">{{ compareManager.currentQualityDoneDate | date:'yyyy-MM-dd HH:mm' }}</span>\n </div>\n <div class=\"detail-row\">\n <span class=\"detail-label\">Version:</span>\n <span class=\"detail-value\">{{ compareManager.compareVersion }}</span>\n </div>\n <div class=\"detail-row\">\n <span class=\"detail-label\">Launched by:</span>\n <span class=\"detail-value\">{{ compareManager.currentQualityLaunchedBy }}</span>\n </div>\n <div class=\"detail-row\">\n <span class=\"detail-label\">Time spent:</span>\n <span class=\"detail-value\">{{ compareManager.currentQualityTimeSpentInMs }}\n ms</span>\n </div>\n <div class=\"detail-row\">\n <span class=\"detail-label\">Gauges:</span>\n <span class=\"detail-value\">{{ compareManager.gaugesInCompare.length }}</span>\n </div>\n <div class=\"detail-row\">\n <span class=\"detail-label\">Points:</span>\n <span class=\"detail-value\">{{ compareManager.globalComparePoints.length }}</span>\n </div>\n </div>\n </details>\n </div>\n </ion-col>\n </ion-row>\n <ion-row>\n <!-- Bottom progress bar -->\n <ion-progress-bar *ngIf=\"refreshInProgress\"\n [buffer]=\"(countsPeriod.progress / ((timeframeDates?.length || 10) +3))+0.01\"\n [value]=\"countsPeriod.progress / ((timeframeDates?.length || 10) +3)\"\n color=\"primary\">\n </ion-progress-bar>\n </ion-row>\n </ion-grid>\n </ion-card-content>\n </ion-card>\n\n <!-- Gauge values section -->\n <ion-card *ngIf=\"gaugeSelectedPoints.length && gaugeSelectedPoints[0].values.length\" class=\"gauge-card\">\n <ion-card-header>\n <ion-card-title>\n <ion-icon name=\"analytics-outline\"></ion-icon>\n Selected Gauge Data\n </ion-card-title>\n </ion-card-header>\n <ion-card-content>\n <raain-date-focus\n [currentHeight]=\"300\"\n [focusDate]=\"periodBegin\"\n [focusRange]=\"DateRange.DAY\"\n [points]=\"gaugeSelectedPoints\"\n [withoutAll]=\"true\">\n </raain-date-focus>\n </ion-card-content>\n </ion-card>\n\n</div>\n", styles: [".raain-details-container{max-width:var(--app-max-width);margin:0 auto;padding:0 0 24px}.raain-details-card{width:100%;margin-bottom:20px}.raain-details-card ion-card-header{border-bottom:1px solid rgba(var(--ion-color-medium-rgb),.2)}.raain-details-card ion-card-header ion-card-title{display:flex;align-items:center}.raain-details-card ion-card-header ion-card-title ion-icon{margin-right:8px;color:var(--ion-color-primary)}.node-info-card{background-color:var(--ion-color-light)}.node-info-card .node-header{display:flex;align-items:center}.node-info-card .node-header .node-status{margin-right:16px}.node-info-card .node-header .node-status ion-icon{font-size:24px}.node-info-card .node-header .node-titles{flex:1}.node-info-card .node-header .node-titles ion-card-title{margin:0;font-size:1.4rem;font-weight:600;color:var(--ion-color-dark)}.node-info-card .node-header .node-titles ion-card-subtitle{padding-left:0;margin:4px 0 0;font-size:.9rem;color:var(--ion-color-medium)}.count-map-card,.period-card{background-color:var(--ion-color-light)}.period-card ion-card-title{display:flex;align-items:center}.period-card ion-card-title ion-icon{margin-right:8px;color:var(--ion-color-primary);font-size:20px}.period-row{display:flex;flex-wrap:wrap;align-items:center;gap:16px;position:relative}.now-button{min-width:100px}#all-dates{display:flex;align-items:center;margin-left:auto}#all-dates .toggle-label{margin-right:8px;white-space:nowrap}.refresh-button ion-icon{margin-right:4px;color:var(--ion-color-light)}.period-start,.period-duration{display:flex;align-items:center}.hidden-label{display:none}.datetime-input,#periodDuration,.duration-select{padding:8px 12px;border:1px solid rgba(var(--ion-color-medium-rgb),.3);border-radius:var(--ion-border-radius);background-color:var(--ion-color-light);font-family:var(--ion-font-family)}.datetime-input:focus,#periodDuration:focus,.duration-select:focus{outline:none;border-color:var(--ion-color-primary)}#periodDuration,.duration-select{min-width:150px}.map-card{background-color:var(--ion-color-light)}.map-card .map-header{display:flex;justify-content:space-between;align-items:center;flex-direction:row;gap:16px}.map-card .map-stats,.map-card .no-data{font-size:.8rem;font-weight:400;color:var(--ion-color-medium);margin-left:8px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.map-card .progress-indicator{color:var(--ion-color-primary)}.map-card .map-toggle{display:flex;align-items:center}.map-card .map-content{padding:0}.map-card .map-content ion-grid,.map-card .map-content ion-row{padding:0;margin:0}.map-card .map-content #progressAndRefresh{display:flex;justify-content:flex-end;align-items:center;padding:8px 16px}.map-card .map-content #progressAndRefresh ion-label{margin-right:16px}.map-card .map-content .map-column{padding:0}.map-card .map-content .map-column .map-container{border-radius:var(--ion-border-radius);overflow:visible}.map-card .map-content .data-column{padding:16px}.map-card .map-content .data-column .data-panel{height:100%;display:flex;flex-direction:column}.map-card .map-content .data-column .panel-header{display:flex;justify-content:space-between;align-items:center;margin-bottom:16px}.map-card .map-content .data-column .panel-header h3{margin:0;font-size:1.2rem;font-weight:600}.map-card .map-content .data-column .computation-info,.map-card .map-content .data-column .technical-details{background-color:rgba(var(--ion-color-light-rgb),.5);border-radius:var(--ion-border-radius);padding:12px;margin-bottom:16px}.map-card .map-content .data-column .info-row,.map-card .map-content .data-column .detail-row{display:flex;margin-bottom:4px;font-size:.9rem}.map-card .map-content .data-column .info-row:last-child,.map-card .map-content .data-column .detail-row:last-child{margin-bottom:0}.map-card .map-content .data-column .compare-stack{flex:1;margin-bottom:16px}.map-card .map-content .data-column .technical-details{background-color:rgba(var(--ion-color-light-rgb),.5);border-radius:var(--ion-border-radius);padding:12px}.map-card .map-content .data-column .technical-details summary{font-weight:500;color:var(--ion-color-medium);cursor:pointer}.map-card .map-content .data-column .technical-details summary:hover{color:var(--ion-color-primary)}.map-card .map-content .data-column .technical-details .details-content{margin-top:8px;font-size:.85rem}.map-card .map-content .data-column .technical-details .details-content .detail-row{display:flex;flex-wrap:wrap;margin-bottom:4px}.map-card .map-content .data-column .technical-details .details-content .detail-row:last-child{margin-bottom:0}.map-card .map-content .data-column .technical-details .details-content .detail-row.warning{color:var(--ion-color-warning)}.map-card .map-content .data-column .technical-details .details-content .detail-row .detail-label{font-weight:500;color:var(--ion-color-dark);width:140px}.map-card .map-content .data-column .technical-details .details-content .detail-row .detail-value{color:var(--ion-color-medium)}.map-card .map-content .data-column .technical-details .details-content .detail-row .warning-text{color:var(--ion-color-danger);margin-left:8px}.gauge-card{background-color:var(--ion-color-light)}.gauge-card ion-card-title{display:flex;align-items:center}.gauge-card ion-card-title ion-icon{margin-right:8px;color:var(--ion-color-primary);font-size:20px}raain-compare-stack{width:100%;display:block}@media (max-width: 768px){.period-row{flex-direction:row;justify-content:space-between;align-items:center}#all-dates{margin-left:auto;padding-left:8px}#all-dates .toggle-label{font-size:.9rem}.map-header{flex-direction:row;justify-content:space-between;align-items:center;gap:16px}}\n"] }]
348
+ args: [{ selector: 'raain-details', template: "<!-- Main content container -->\n<div *ngIf=\"rainNode\" class=\"raain-details-container\">\n\n <!-- Header section with node info\n <ion-card class=\"node-info-card\">\n <ion-card-content>\n <div class=\"node-header\">\n <div class=\"node-status\">\n <ion-icon *ngIf=\"(rainNode | hasGoodQuality)\" color=\"success\" name=\"checkmark-circle\"></ion-icon>\n <ion-icon *ngIf=\"!(rainNode | hasGoodQuality)\" color=\"warning\" name=\"alert-circle\"></ion-icon>\n </div>\n <div class=\"node-titles\">\n <ion-card-title>{{ rainNode.name }}</ion-card-title>\n <ion-card-subtitle>by {{ teamNode?.name }}</ion-card-subtitle>\n </div>\n <div class=\"node-controls\">\n <ion-label class=\"toggle-label\">History</ion-label>\n <ion-toggle (ionChange)=\"onEnableCountHistoryTab(rainNode)\"\n [(ngModel)]=\"toggleHistory\"\n [checked]=\"toggleHistory\">\n </ion-toggle>\n </div>\n </div>\n </ion-card-content>\n </ion-card>\n-->\n\n <!-- Period selection section -->\n <ion-card class=\"period-card\">\n <ion-card-content>\n <div class=\"period-controls\">\n <div class=\"period-row\">\n <ion-button (click)=\"setPeriodOfNow()\" class=\"now-button\" fill=\"outline\">\n <ion-icon name=\"time-outline\" slot=\"start\"></ion-icon>\n Now\n </ion-button>\n\n <div class=\"period-start ion-hide-md-down\">\n <ion-label>Start:</ion-label>\n <input (change)=\"onPeriodBeginChange($event)\"\n [value]=\"periodBeginAsString\"\n class=\"datetime-input\"\n type=\"datetime-local\">\n </div>\n\n <div class=\"period-duration ion-hide-md-down\">\n <ion-label>Duration:</ion-label>\n <ion-select (ionDismiss)=\"onPeriodDurationChange($event)\"\n [(ngModel)]=\"periodDurationAsString\"\n class=\"duration-select\"\n id=\"periodDuration\"\n interface=\"popover\">\n <ion-select-option value=\"0.25\">15 minutes</ion-select-option>\n <ion-select-option value=\"0.5\">30 minutes</ion-select-option>\n <ion-select-option value=\"1\">1 hour</ion-select-option>\n <ion-select-option value=\"2\">2 hours</ion-select-option>\n <ion-select-option value=\"3\">3 hours</ion-select-option>\n <ion-select-option value=\"4\">4 hours</ion-select-option>\n <ion-select-option value=\"5\">5 hours</ion-select-option>\n <ion-select-option value=\"6\">6 hours</ion-select-option>\n <ion-select-option *ngIf=\"isAdmin\" value=\"24\">24 hours</ion-select-option>\n </ion-select>\n </div>\n\n <div id=\"all-dates\" slot=\"end\">\n <ion-label class=\"toggle-label\">All dates</ion-label>\n <ion-toggle (ionChange)=\"onEnableCountHistoryTab(rainNode)\"\n [(ngModel)]=\"toggleHistory\"\n [checked]=\"toggleHistory\">\n </ion-toggle>\n </div>\n </div>\n\n <!-- Hidden label for change detection -->\n <div class=\"hidden-label\">{{ onChangeDetectionTest(rainNode) }}</div>\n </div>\n\n <!-- Historical map section -->\n <div *ngIf=\"toggleHistory\" class=\"period-controls\">\n <raain-date-dynamic (changedDate)=\"onDateChangeInCount($event)\"\n [currentHeight]=\"300\"\n [fetchData]=\"fetchDataWrapper\"\n [points]=\"countPoints\">\n </raain-date-dynamic>\n </div>\n </ion-card-content>\n </ion-card>\n\n\n <!-- Map section -->\n <ion-card class=\"map-card\">\n <ion-card-content class=\"map-content\">\n <ion-grid>\n <ion-row id=\"progressAndRefresh\">\n <ion-label>\n <span *ngIf=\"getPercentOfComputations()\" class=\"map-stats\">\n {{ getPercentOfComputations() }}% Images\n <i *ngIf=\"countsPeriod.progress\" class=\"progress-indicator\">\n In Progress: {{ countsPeriod.progress }}...\n </i>\n </span>\n <span *ngIf=\"!getPercentOfComputations()\" class=\"no-data\">\n No image available\n </span>\n </ion-label>\n\n <ion-button (click)=\"refreshMap()\" *ngIf=\"!refreshInProgress\" class=\"refresh-button\">\n <ion-icon name=\"refresh-outline\" slot=\"start\"></ion-icon>\n Refresh Map\n </ion-button>\n\n <!-- Progress indicator -->\n <ion-progress-bar *ngIf=\"refreshInProgress\"\n [buffer]=\"(countsPeriod.progress / ((timeframeDates?.length || 10) +3))+0.01\"\n [value]=\"countsPeriod.progress / ((timeframeDates?.length || 10) +3)\"\n color=\"primary\">\n </ion-progress-bar>\n </ion-row>\n <ion-row *ngIf=\"toggleMap && getPercentOfImages()\">\n <!-- Map component -->\n <ion-col class=\"map-column\" size-lg=\"7\">\n <div class=\"map-container\">\n <raain-map\n (changedDate)=\"onDateChangeInMap($event)\"\n (changedSum)=\"onSumChangeInMap($event)\"\n (selectedMarker)=\"onGaugeSelectInMap($event)\"\n [coordinates]=\"coordinates\"\n [currentHeight]=\"500\"\n [defaultDate]=\"dateShown\"\n [markers]=\"{\n borders,\n gauges: compareManager.gaugesInMap,\n gaugesInCompare: compareManager.gaugesInCompare,\n selectedGauges: compareManager.selectedGauges,\n pixels: compareManager.selectedPixels,\n pixelsSolution: compareManager.pixelsSolutions?.length ? compareManager.pixelsSolutions[0] : []\n }\"\n [showCumulative]=\"toggleCumulative\"\n [sumFn]=\"refreshManager.sumFn\"\n [sumValues]=\"refreshManager.sumValues\"\n [timeframeContainers]=\"timeframeContainers\"\n [timeframeDates]=\"timeframeDates\">\n </raain-map>\n </div>\n\n <div class=\"data-column\">\n <!-- Technical details (collapsible for cleaner UI) -->\n <details class=\"technical-details\">\n <summary>Image Details</summary>\n <div class=\"details-content\">\n <div class=\"detail-row\">\n <span class=\"detail-label\">Computed:</span>\n <span class=\"detail-value\">{{ refreshManager.rainComputationMapDoneDate | date:'yyyy-MM-dd HH:mm' }}</span>\n </div>\n <div class=\"detail-row\">\n <span class=\"detail-label\">Version:</span>\n <span class=\"detail-value\">{{ refreshManager.rainComputationMapVersion }}</span>\n </div>\n <div class=\"detail-row\">\n <span class=\"detail-label\">Launched by:</span>\n <span class=\"detail-value\">{{ refreshManager.rainComputationMapLaunchedBy }}</span>\n </div>\n <div class=\"detail-row\">\n <span class=\"detail-label\">Time spent:</span>\n <span class=\"detail-value\">{{ refreshManager.rainComputationMapTimeSpentInMs }}\n ms</span>\n </div>\n <div class=\"detail-row\">\n <span class=\"detail-label\">Date:</span>\n <span class=\"detail-value\">{{ refreshManager.rainComputationMapDate?.toISOString() }}\n | {{ refreshManager.rainComputationMapDate | date:'yyyy-MM-dd HH:mm' }}</span>\n </div>\n <div class=\"detail-row\">\n <span class=\"detail-label\">Water in the map:</span>\n <span class=\"detail-value\">{{ sumDetails }}</span>\n </div>\n <div class=\"detail-row\">\n <span class=\"detail-label\">Source DBZ min:</span>\n <span class=\"detail-value\">{{ refreshManager.rainComputationMapOriginalMin }}</span>\n </div>\n <div class=\"detail-row\">\n <span class=\"detail-label\">Source DBZ max:</span>\n <span class=\"detail-value\">{{ refreshManager.rainComputationMapOriginalMax }}</span>\n </div>\n </div>\n </details>\n </div>\n </ion-col>\n\n <!-- Data panel -->\n <ion-col class=\"data-column\" size-lg=\"5\">\n <div class=\"data-panel\">\n <!-- Compare stack component -->\n <div class=\"compare-stack\">\n <raain-compare-stack\n (selectedPoint)=\"onGaugeSelectInCompare($event)\"\n [compareManager]=\"compareManager\"\n [cumulative]=\"toggleCumulative\">\n </raain-compare-stack>\n </div>\n\n <!-- Technical details (collapsible for cleaner UI) -->\n <details class=\"technical-details\">\n <summary>Compare Details</summary>\n <div class=\"details-content\">\n <div [ngClass]=\"{'warning': refreshManager.rainComputationMapDoneDate?.getTime() > compareManager.currentQualityDoneDate?.getTime() + 60000}\"\n class=\"detail-row\">\n <span class=\"detail-label\">Computed:</span>\n <span class=\"detail-value\">{{ compareManager.currentQualityDoneDate | date:'yyyy-MM-dd HH:mm' }}</span>\n </div>\n <div class=\"detail-row\">\n <span class=\"detail-label\">Version:</span>\n <span class=\"detail-value\">{{ compareManager.compareVersion }}</span>\n </div>\n <div class=\"detail-row\">\n <span class=\"detail-label\">Launched by:</span>\n <span class=\"detail-value\">{{ compareManager.currentQualityLaunchedBy }}</span>\n </div>\n <div class=\"detail-row\">\n <span class=\"detail-label\">Time spent:</span>\n <span class=\"detail-value\">{{ compareManager.currentQualityTimeSpentInMs }}\n ms</span>\n </div>\n <div class=\"detail-row\">\n <span class=\"detail-label\">Gauges:</span>\n <span class=\"detail-value\">{{ compareManager.gaugesInCompare.length }}</span>\n </div>\n <div class=\"detail-row\">\n <span class=\"detail-label\">Points:</span>\n <span class=\"detail-value\">{{ compareManager.globalComparePoints.length }}</span>\n </div>\n </div>\n </details>\n </div>\n </ion-col>\n </ion-row>\n <ion-row>\n <!-- Bottom progress bar -->\n <ion-progress-bar *ngIf=\"refreshInProgress\"\n [buffer]=\"(countsPeriod.progress / ((timeframeDates?.length || 10) +3))+0.01\"\n [value]=\"countsPeriod.progress / ((timeframeDates?.length || 10) +3)\"\n color=\"primary\">\n </ion-progress-bar>\n </ion-row>\n </ion-grid>\n </ion-card-content>\n </ion-card>\n\n <!-- Gauge values section -->\n <ion-card *ngIf=\"gaugeSelectedPoints.length && gaugeSelectedPoints[0].values.length\" class=\"gauge-card\">\n <ion-card-header>\n <ion-card-title>\n <ion-icon name=\"analytics-outline\"></ion-icon>\n Selected Gauge Data\n </ion-card-title>\n </ion-card-header>\n <ion-card-content>\n <raain-date-focus\n [currentHeight]=\"300\"\n [focusDate]=\"periodBegin\"\n [focusRange]=\"DateRange.DAY\"\n [points]=\"gaugeSelectedPoints\"\n [withoutAll]=\"true\">\n </raain-date-focus>\n </ion-card-content>\n </ion-card>\n\n</div>\n", styles: [".raain-details-container{max-width:var(--app-max-width);margin:0 auto;padding:0 0 24px}.raain-details-card{width:100%;margin-bottom:20px}.raain-details-card ion-card-header{border-bottom:1px solid rgba(var(--ion-color-medium-rgb),.2)}.raain-details-card ion-card-header ion-card-title{display:flex;align-items:center}.raain-details-card ion-card-header ion-card-title ion-icon{margin-right:8px;color:var(--ion-color-primary)}.node-info-card{background-color:var(--ion-color-light)}.node-info-card .node-header{display:flex;align-items:center}.node-info-card .node-header .node-status{margin-right:16px}.node-info-card .node-header .node-status ion-icon{font-size:24px}.node-info-card .node-header .node-titles{flex:1}.node-info-card .node-header .node-titles ion-card-title{margin:0;font-size:1.4rem;font-weight:600;color:var(--ion-color-dark)}.node-info-card .node-header .node-titles ion-card-subtitle{padding-left:0;margin:4px 0 0;font-size:.9rem;color:var(--ion-color-medium)}.count-map-card,.period-card{background-color:var(--ion-color-light)}.period-card ion-card-title{display:flex;align-items:center}.period-card ion-card-title ion-icon{margin-right:8px;color:var(--ion-color-primary);font-size:20px}.period-row{display:flex;flex-wrap:wrap;align-items:center;gap:16px;position:relative}.now-button{min-width:100px}#all-dates{display:flex;align-items:center;margin-left:auto}#all-dates .toggle-label{margin-right:8px;white-space:nowrap}.refresh-button ion-icon{margin-right:4px;color:var(--ion-color-light)}.period-start,.period-duration{display:flex;align-items:center}.hidden-label{display:none}.datetime-input,#periodDuration,.duration-select{padding:8px 12px;border:1px solid rgba(var(--ion-color-medium-rgb),.3);border-radius:var(--ion-border-radius);background-color:var(--ion-color-light);font-family:var(--ion-font-family)}.datetime-input:focus,#periodDuration:focus,.duration-select:focus{outline:none;border-color:var(--ion-color-primary)}#periodDuration,.duration-select{min-width:150px}.map-card{background-color:var(--ion-color-light)}.map-card .map-header{display:flex;justify-content:space-between;align-items:center;flex-direction:row;gap:16px}.map-card .map-stats,.map-card .no-data{font-size:.8rem;font-weight:400;color:var(--ion-color-medium);margin-left:8px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.map-card .progress-indicator{color:var(--ion-color-primary)}.map-card .map-toggle{display:flex;align-items:center}.map-card .map-content{padding:0}.map-card .map-content ion-grid,.map-card .map-content ion-row{padding:0;margin:0}.map-card .map-content #progressAndRefresh{display:flex;justify-content:flex-end;align-items:center;padding:8px 16px}.map-card .map-content #progressAndRefresh ion-label{margin-right:16px}.map-card .map-content .map-column{padding:0}.map-card .map-content .map-column .map-container{border-radius:var(--ion-border-radius);overflow:visible}.map-card .map-content .data-column{padding:16px}.map-card .map-content .data-column .data-panel{height:100%;display:flex;flex-direction:column}.map-card .map-content .data-column .panel-header{display:flex;justify-content:space-between;align-items:center;margin-bottom:16px}.map-card .map-content .data-column .panel-header h3{margin:0;font-size:1.2rem;font-weight:600}.map-card .map-content .data-column .computation-info,.map-card .map-content .data-column .technical-details{background-color:rgba(var(--ion-color-light-rgb),.5);border-radius:var(--ion-border-radius);padding:12px;margin-bottom:16px}.map-card .map-content .data-column .info-row,.map-card .map-content .data-column .detail-row{display:flex;margin-bottom:4px;font-size:.9rem}.map-card .map-content .data-column .info-row:last-child,.map-card .map-content .data-column .detail-row:last-child{margin-bottom:0}.map-card .map-content .data-column .compare-stack{flex:1;margin-bottom:16px}.map-card .map-content .data-column .technical-details{background-color:rgba(var(--ion-color-light-rgb),.5);border-radius:var(--ion-border-radius);padding:12px}.map-card .map-content .data-column .technical-details summary{font-weight:500;color:var(--ion-color-medium);cursor:pointer}.map-card .map-content .data-column .technical-details summary:hover{color:var(--ion-color-primary)}.map-card .map-content .data-column .technical-details .details-content{margin-top:8px;font-size:.85rem}.map-card .map-content .data-column .technical-details .details-content .detail-row{display:flex;flex-wrap:wrap;margin-bottom:4px}.map-card .map-content .data-column .technical-details .details-content .detail-row:last-child{margin-bottom:0}.map-card .map-content .data-column .technical-details .details-content .detail-row.warning{color:var(--ion-color-warning)}.map-card .map-content .data-column .technical-details .details-content .detail-row .detail-label{font-weight:500;color:var(--ion-color-dark);width:140px}.map-card .map-content .data-column .technical-details .details-content .detail-row .detail-value{color:var(--ion-color-medium)}.map-card .map-content .data-column .technical-details .details-content .detail-row .warning-text{color:var(--ion-color-danger);margin-left:8px}.gauge-card{background-color:var(--ion-color-light)}.gauge-card ion-card-title{display:flex;align-items:center}.gauge-card ion-card-title ion-icon{margin-right:8px;color:var(--ion-color-primary);font-size:20px}raain-compare-stack{width:100%;display:block}@media (max-width: 768px){.period-row{flex-direction:row;justify-content:space-between;align-items:center}#all-dates{margin-left:auto;padding-left:8px}#all-dates .toggle-label{font-size:.9rem}.map-header{flex-direction:row;justify-content:space-between;align-items:center;gap:16px}}\n"] }]
347
349
  }], ctorParameters: function () { return [{ type: i1.Storage }]; }, propDecorators: { toggleAdmin: [{
348
350
  type: Input
349
351
  }], rainNode: [{
@@ -359,4 +361,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImpo
359
361
  }], toggleCumulative: [{
360
362
  type: Input
361
363
  }] } });
362
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmFhaW4tZGV0YWlscy5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvY29yZS9zaGFyZWQvcmFhaW4tZGV0YWlscy9yYWFpbi1kZXRhaWxzLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uL3NyYy9jb3JlL3NoYXJlZC9yYWFpbi1kZXRhaWxzL3JhYWluLWRldGFpbHMuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFDLFNBQVMsRUFBRSxLQUFLLEVBQXNDLE1BQU0sZUFBZSxDQUFDO0FBRXBGLE9BQU8sRUFBQyxxQkFBcUIsRUFBcUIsTUFBTSxhQUFhLENBQUM7QUFDdEUsT0FBTyxFQUFDLFNBQVMsRUFBRSxTQUFTLEVBQUUsbUJBQW1CLEVBQUMsTUFBTSxVQUFVLENBQUM7QUFDbkUsT0FBTyxFQUEyQixvQkFBb0IsRUFBaUIsTUFBTSxVQUFVLENBQUM7Ozs7Ozs7Ozs7QUFVeEYsTUFBTSxPQUFPLHFCQUFxQjtJQXVEOUIsWUFBc0IsT0FBZ0I7UUFBaEIsWUFBTyxHQUFQLE9BQU8sQ0FBUztRQUZuQixjQUFTLEdBQUcsU0FBUyxDQUFDO1FBMEl6QyxnRUFBZ0U7UUFDekQscUJBQWdCLEdBQUcsS0FBSyxFQUFFLFNBQWUsRUFBRSxVQUFxQixFQUFFLEVBQUU7WUFDdkUsT0FBTyxNQUFNLElBQUksQ0FBQyxTQUFTLENBQUMsU0FBUyxFQUFFLFVBQVUsQ0FBQyxDQUFDO1FBQ3ZELENBQUMsQ0FBQztJQTNJdUMsQ0FBQztJQUVsQyxNQUFNLENBQUMsYUFBYSxDQUFDLElBQW1CO1FBQzVDLElBQUksQ0FBQyxHQUFHLElBQUksSUFBSSxFQUFFLENBQUM7UUFDbkIsSUFBSSxJQUFJLEVBQUU7WUFDTixDQUFDLEdBQUcsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDbkIsTUFBTSxrQkFBa0IsR0FBRyxDQUFDLENBQUMsaUJBQWlCLEVBQUUsR0FBRyxLQUFLLENBQUM7WUFDekQsQ0FBQyxHQUFHLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxPQUFPLEVBQUUsR0FBRyxrQkFBa0IsQ0FBQyxDQUFDO1NBQ2xEO1FBQ0QsTUFBTSxvQkFBb0IsR0FBRyxrQkFBa0IsQ0FBQztRQUNoRCxPQUFPLENBQUMsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxFQUFFLG9CQUFvQixDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ3JFLENBQUM7SUFFTyxNQUFNLENBQUMsT0FBTyxDQUFDLElBQVk7UUFDL0IsTUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQywrQ0FBK0MsQ0FBQyxDQUFDO1FBQ2pGLElBQUksQ0FBQyxHQUFHLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3ZCLElBQUksQ0FBQyxZQUFZLEVBQUU7WUFDZixNQUFNLGtCQUFrQixHQUFHLENBQUMsQ0FBQyxpQkFBaUIsRUFBRSxHQUFHLEtBQUssQ0FBQztZQUN6RCxDQUFDLEdBQUcsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLE9BQU8sRUFBRSxHQUFHLGtCQUFrQixDQUFDLENBQUM7U0FDbEQ7UUFDRCxPQUFPLENBQUMsQ0FBQztJQUNiLENBQUM7SUFFTSxLQUFLLENBQUMsU0FBUyxDQUFDLFNBQWUsRUFBRSxVQUFxQjtRQUN6RCxNQUFNLE1BQU0sR0FBRyxFQUFFLENBQUM7UUFDbEIsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRTtZQUN6QixNQUFNLENBQUMsSUFBSSxDQUFDLEVBQUMsSUFBSSxFQUFFLElBQUksSUFBSSxDQUFDLElBQUksR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsS0FBSyxFQUFFLEVBQUUsRUFBQyxDQUFDLENBQUM7U0FDekQ7UUFDRCxNQUFNLFFBQVEsR0FBRztZQUNiO2dCQUNJLEtBQUssRUFBRSxTQUFTO2dCQUNoQixLQUFLLEVBQUUsS0FBSztnQkFDWixNQUFNO2FBQ1Q7WUFDRDtnQkFDSSxLQUFLLEVBQUUsVUFBVTtnQkFDakIsS0FBSyxFQUFFLEtBQUs7Z0JBQ1osTUFBTTthQUNUO1lBQ0QsS0FBSztZQUNMLDJCQUEyQjtZQUMzQixzQkFBc0I7WUFDdEIsZUFBZTtZQUNmLE1BQU07U0FDVCxDQUFDO1FBRUYsTUFBTSxLQUFLLEdBQUcsb0JBQW9CLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDL0MsSUFBSSxJQUFJLEdBQUcsUUFBUSxDQUFDO1FBQ3BCLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFO1lBQ2hCLE9BQU8sSUFBSSxDQUFDO1NBQ2Y7UUFFRCxJQUFJLFVBQVUsS0FBSyxTQUFTLENBQUMsT0FBTyxFQUFFO1lBQ2xDLE9BQU87U0FDVjthQUFNLElBQUksVUFBVSxLQUFLLFNBQVMsQ0FBQyxJQUFJLEVBQUU7WUFDdEMsTUFBTSxVQUFVLEdBQUcsTUFBTSxJQUFJLENBQUMsY0FBYyxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLEVBQUUsRUFBRTtnQkFDekUsV0FBVyxFQUFFLFNBQVM7YUFDekIsQ0FBQyxDQUFDO1lBRUgsSUFBSSxHQUFHO2dCQUNIO29CQUNJLEtBQUssRUFBRSxhQUFhO29CQUNwQixLQUFLLEVBQUUsTUFBTTtvQkFDYixNQUFNLEVBQUUsVUFBVSxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRTt3QkFDcEMsT0FBTzs0QkFDSCxJQUFJLEVBQUUscUJBQXFCLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7NEJBQzNDLEtBQUssRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO3lCQUM1QixDQUFDO29CQUNOLENBQUMsQ0FBQztpQkFDTDtnQkFDRDtvQkFDSSxLQUFLLEVBQUUsVUFBVTtvQkFDakIsS0FBSyxFQUFFLEtBQUs7b0JBQ1osTUFBTSxFQUFFLFVBQVUsQ0FBQyxhQUFhLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUU7d0JBQ3ZDLE9BQU87NEJBQ0gsSUFBSSxFQUFFLHFCQUFxQixDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDOzRCQUMzQyxLQUFLLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQzt5QkFDNUIsQ0FBQztvQkFDTixDQUFDLENBQUM7aUJBQ0w7Z0JBQ0Q7b0JBQ0ksS0FBSyxFQUFFLFdBQVc7b0JBQ2xCLEtBQUssRUFBRSxNQUFNO29CQUNiLE1BQU0sRUFBRSxVQUFVLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFO3dCQUNsQyxPQUFPOzRCQUNILElBQUksRUFBRSxxQkFBcUIsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQzs0QkFDM0MsS0FBSyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7eUJBQzVCLENBQUM7b0JBQ04sQ0FBQyxDQUFDO2lCQUNMO2FBQ0osQ0FBQztTQUNMO2FBQU07WUFDSCxPQUFPLENBQUMsR0FBRyxDQUFDLGlCQUFpQixFQUFFLFNBQVMsQ0FBQyxXQUFXLEVBQUUsRUFBRSxLQUFLLENBQUMsQ0FBQztZQUMvRCxNQUFNLE1BQU0sR0FBRyxNQUFNLElBQUksQ0FBQyxjQUFjLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsRUFBRSxFQUFFO2dCQUNqRSxLQUFLO2dCQUNMLFdBQVcsRUFBRSxTQUFTO2FBQ3pCLENBQUMsQ0FBQztZQUVILElBQUksR0FBRztnQkFDSDtvQkFDSSxLQUFLLEVBQUUsU0FBUztvQkFDaEIsS0FBSyxFQUFFLEtBQUs7b0JBQ1osTUFBTSxFQUFFLE1BQU0sQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUU7d0JBQ2xDLE9BQU87NEJBQ0gsSUFBSSxFQUFFLHFCQUFxQixDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDOzRCQUMzQyxLQUFLLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQzt5QkFDNUIsQ0FBQztvQkFDTixDQUFDLENBQUM7aUJBQ0w7Z0JBQ0Q7b0JBQ0ksS0FBSyxFQUFFLFVBQVU7b0JBQ2pCLEtBQUssRUFBRSxLQUFLO29CQUNaLE1BQU0sRUFBRSxNQUFNLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFO3dCQUNuQyxPQUFPOzRCQUNILElBQUksRUFBRSxxQkFBcUIsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQzs0QkFDM0MsS0FBSyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7eUJBQzVCLENBQUM7b0JBQ04sQ0FBQyxDQUFDO2lCQUNMO2dCQUNELEtBQUs7Z0JBQ0wsMkJBQTJCO2dCQUMzQixzQkFBc0I7Z0JBQ3RCLDRDQUE0QztnQkFDNUMsb0JBQW9CO2dCQUNwQiw0REFBNEQ7Z0JBQzVELDBDQUEwQztnQkFDMUMsY0FBYztnQkFDZCxXQUFXO2dCQUNYLE1BQU07YUFDVCxDQUFDO1NBQ0w7UUFFRCxPQUFPLENBQUMsR0FBRyxDQUFDLGtCQUFrQixLQUFLLEVBQUUsRUFBRSxJQUFJLENBQUMsQ0FBQztRQUM3QyxPQUFPLElBQUksQ0FBQztJQUNoQixDQUFDO0lBT00sV0FBVyxDQUFDLE9BQXNCO1FBQ3JDLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsT0FBTyxFQUFFLEVBQUUsR0FBRSxDQUFDLENBQUMsQ0FBQztJQUMvQyxDQUFDO0lBRUQsV0FBVztRQUNQLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztJQUNwQixDQUFDO0lBRUQsS0FBSyxDQUFDLHVCQUF1QixDQUFDLElBQWM7UUFDeEMsSUFBSSxDQUFDLElBQUksQ0FBQyxhQUFhLEVBQUU7WUFDckIsSUFBSSxDQUFDLFdBQVcsR0FBRyxFQUFFLENBQUM7U0FDekI7SUFDTCxDQUFDO0lBRUQsS0FBSyxDQUFDLG1CQUFtQixDQUFDLEtBQVU7UUFDaEMsTUFBTSxRQUFRLEdBQUcsS0FBSyxFQUFFLE1BQU0sRUFBRSxLQUFLLElBQUksSUFBSSxDQUFDLG1CQUFtQixDQUFDO1FBQ2xFLElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDdEMsSUFBSSxDQUFDLG1CQUFtQixHQUFHLFFBQVEsQ0FBQztRQUNwQyxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxtQkFBbUIsRUFBRSxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7UUFFeEQsTUFBTSxJQUFJLENBQUMsc0JBQXNCLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDN0MsQ0FBQztJQUVELEtBQUssQ0FBQyxzQkFBc0IsQ0FBQyxNQUFhO1FBQ3RDLE1BQU0sY0FBYyxHQUFHLFVBQVUsQ0FBQyxJQUFJLENBQUMsc0JBQXNCLENBQUMsQ0FBQztRQUMvRCxJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsT0FBTyxFQUFFLEdBQUcsY0FBYyxHQUFHLENBQUMsRUFBRSxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUM7UUFDdEYsSUFBSSxDQUFDLGlCQUFpQixHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDdEQsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsaUJBQWlCLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ3BELElBQUksQ0FBQyxjQUFjLENBQUMsTUFBTSxHQUFHLEVBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxXQUFXLEVBQUUsR0FBRyxFQUFFLElBQUksQ0FBQyxTQUFTLEVBQUMsQ0FBQztJQUNoRixDQUFDO0lBRUQsS0FBSyxDQUFDLG1CQUFtQixDQUFDLFdBQWlCO1FBQ3ZDLE9BQU8sQ0FBQyxHQUFHLENBQUMscUJBQXFCLEVBQUUsV0FBVyxDQUFDLENBQUM7UUFDaEQsSUFBSSxDQUFDLG1CQUFtQjtZQUNwQixXQUFXLENBQUMsV0FBVyxFQUFFLENBQUMsU0FBUyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUM7Z0JBQzFDLFdBQVcsQ0FBQyxrQkFBa0IsRUFBRSxDQUFDLFNBQVMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDckQsSUFBSSxDQUFDLHNCQUFzQixHQUFHLEdBQUcsQ0FBQztRQUNsQyxNQUFNLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNyQyxJQUFJLENBQUMsY0FBYyxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDN0MsQ0FBQztJQUVELEtBQUssQ0FBQyxpQkFBaUIsQ0FBQyxTQUFlO1FBQ25DLCtDQUErQztRQUMvQyxJQUFJLENBQUMsU0FBUyxHQUFHLFNBQVMsQ0FBQztRQUMzQixNQUFNLGVBQWUsR0FBVyxDQUFDLElBQUksQ0FBQyxnQkFBZ0I7WUFDbEQsQ0FBQyxDQUFDLENBQUM7WUFDSCxDQUFDLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDO1FBQzlDLE1BQU0sSUFBSSxDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxJQUFJLENBQUMsbUJBQW1CLEVBQUUsZUFBZSxDQUFDLENBQUM7UUFDM0YsSUFBSSxDQUFDLHNCQUFzQixHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsMkJBQTJCLEVBQUUsQ0FBQztRQUNoRixNQUFNLElBQUksQ0FBQyxjQUFjLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUM5RCxDQUFDO0lBRUQsS0FBSyxDQUFDLGdCQUFnQixDQUFDLEdBQVc7UUFDOUIsSUFBSSxDQUFDLFVBQVUsR0FBRyxHQUFHLENBQUM7SUFDMUIsQ0FBQztJQUVELEtBQUssQ0FBQyxrQkFBa0IsQ0FBQyxTQUFvQjtRQUN6QyxNQUFNLGNBQWMsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQ3pELENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLFNBQVMsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLEdBQUcsS0FBSyxTQUFTLENBQUMsR0FBRyxDQUM1RCxDQUFDO1FBQ0YsSUFBSSxjQUFjLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRTtZQUM3QixPQUFPO1NBQ1Y7UUFDRCxNQUFNLGFBQWEsR0FBRyxjQUFjLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFFeEMsTUFBTSxJQUFJLENBQUMsa0JBQWtCLENBQUMsRUFBQyxFQUFFLEVBQUUsYUFBYSxDQUFDLEVBQUUsRUFBRSxJQUFJLEVBQUUsYUFBYSxDQUFDLElBQUksRUFBQyxDQUFDLENBQUM7UUFFaEYsTUFBTSxJQUFJLENBQUMsY0FBYyxDQUFDLFdBQVcsQ0FBQyxhQUFhLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQy9ELENBQUM7SUFFRCxLQUFLLENBQUMsa0JBQWtCLENBQUMsYUFBeUM7UUFDOUQsTUFBTSxRQUFRLEdBQUcsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDM0UsTUFBTSxNQUFNLEdBQUcsSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLE9BQU8sRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQztRQUN0RSxNQUFNLGFBQWEsR0FBRyxNQUFNLElBQUksQ0FBQyxjQUFjLENBQUMsZ0JBQWdCLENBQzVELGFBQWEsQ0FBQyxFQUFFLEVBQ2hCLFFBQVEsRUFDUixNQUFNLENBQ1QsQ0FBQztRQUNGLE1BQU0sV0FBVyxHQUFrQyxhQUFhLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUU7WUFDeEUsTUFBTSxxQkFBcUIsR0FBRyxJQUFJLHFCQUFxQixDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFRLENBQUMsQ0FBQztZQUM3RSxNQUFNLEtBQUssR0FBRyxxQkFBcUIsQ0FBQyxrQkFBa0IsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQztZQUNsRSxPQUFPLEVBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxJQUFJLEVBQUUsS0FBSyxFQUFDLENBQUM7UUFDbEMsQ0FBQyxDQUFDLENBQUM7UUFDSCxJQUFJLENBQUMsbUJBQW1CLEdBQUc7WUFDdkI7Z0JBQ0ksS0FBSyxFQUFFLGFBQWEsQ0FBQyxJQUFJO2dCQUN6QixLQUFLLEVBQUUsS0FBSztnQkFDWixNQUFNLEVBQUUsV0FBVzthQUN0QjtTQUNKLENBQUM7UUFDRixPQUFPLENBQUMsR0FBRyxDQUFDLDJCQUEyQixFQUFFLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO0lBQ3ZFLENBQUM7SUFFRCxLQUFLLENBQUMsc0JBQXNCLENBQUMsQ0FBd0M7UUFDakUsTUFBTSxJQUFJLENBQUMsa0JBQWtCLENBQUMsRUFBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxFQUFFLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFDLENBQUMsQ0FBQztRQUVwRSxNQUFNLElBQUksQ0FBQyxjQUFjLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQztJQUN0RSxDQUFDO0lBRUQsS0FBSyxDQUFDLFdBQVcsQ0FBQyxNQUFhO1FBQzNCLHdCQUF3QjtRQUN4Qiw4QkFBOEI7UUFDOUIsSUFBSTtJQUNSLENBQUM7SUFFRCxxQkFBcUIsQ0FBQyxRQUFrQjtRQUNwQywrREFBK0Q7UUFDL0QsT0FBTyxFQUFFLENBQUM7SUFDZCxDQUFDO0lBRUQsS0FBSyxDQUFDLFVBQVU7UUFDWixJQUFJLENBQUMsbUJBQW1CLEdBQUcsRUFBRSxDQUFDO1FBQzlCLHNGQUFzRjtRQUN0RiwrRkFBK0Y7UUFDL0YsSUFBSSxDQUFDLE9BQU8sR0FBRztRQUNYLHVFQUF1RTtRQUN2RSx1RUFBdUU7UUFDdkUsdUVBQXVFO1FBQ3ZFLHVFQUF1RTtTQUMxRSxDQUFDO1FBRUYsSUFBSSxDQUFDLGNBQWMsQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUMvQixNQUFNLElBQUksQ0FBQyxjQUFjLENBQUMsY0FBYyxFQUFFLENBQUM7UUFDM0MsSUFBSSxDQUFDLGNBQWMsQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQztJQUN6RCxDQUFDO0lBRUQsS0FBSyxDQUFDLGlCQUFpQjtRQUNuQixNQUFNLElBQUksQ0FBQyxjQUFjLENBQUMscUJBQXFCLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxFQUFFLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQ3RGLENBQUM7SUFFRCxLQUFLLENBQUMsY0FBYztRQUNoQix1Q0FBdUM7UUFDdkMsTUFBTSxRQUFRLEdBQUcsSUFBSSxJQUFJLEVBQUUsQ0FBQztRQUM1QixRQUFRLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxVQUFVLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQztRQUNoRCxJQUFJLENBQUMsbUJBQW1CO1lBQ3BCLFFBQVEsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxHQUFHLFFBQVEsQ0FBQyxrQkFBa0IsRUFBRSxDQUFDLFNBQVMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDNUYsSUFBSSxDQUFDLHNCQUFzQixHQUFHLEdBQUcsQ0FBQztRQUNsQyxNQUFNLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNyQyxJQUFJLENBQUMsY0FBYyxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDN0MsQ0FBQztJQUVELGtCQUFrQjtRQUNkLElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLGFBQWEsRUFBRSxNQUFNLEVBQUU7WUFDMUMsT0FBTyxDQUFDLENBQUM7U0FDWjtRQUVELE1BQU0sWUFBWSxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FDdkQsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUNGLElBQUksQ0FBQyxXQUFXLENBQUMsT0FBTyxFQUFFLElBQUksSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLE9BQU8sRUFBRTtZQUN4RCxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsT0FBTyxFQUFFLElBQUksSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLEVBQUUsQ0FDN0QsQ0FBQztRQUNGLE1BQU0sTUFBTSxHQUFHLFlBQVksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQ2hFLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLEdBQUcsWUFBWSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ3BELENBQUM7SUFFRCx3QkFBd0I7UUFDcEIsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxtQkFBbUIsRUFBRSxDQUFDO1FBQzNELElBQUksQ0FBQyxRQUFRLEVBQUUsTUFBTSxFQUFFO1lBQ25CLE9BQU8sQ0FBQyxDQUFDO1NBQ1o7UUFFRCxNQUFNLHVCQUF1QixHQUFHLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsaUJBQWlCLENBQUMsQ0FBQztRQUM5RSxNQUFNLEtBQUssR0FBRyx1QkFBdUIsQ0FBQyxNQUFNLEdBQUcsUUFBUSxDQUFDLE1BQU0sQ0FBQztRQUMvRCxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxHQUFHLEdBQUcsQ0FBQyxDQUFDO0lBQ25DLENBQUM7SUFFTyxRQUFRO1FBQ1osSUFBSSxDQUFDLE9BQU8sR0FBRyxFQUFFLENBQUM7UUFFbEIsSUFBSSxDQUFDLG1CQUFtQixHQUFHLElBQUksbUJBQW1CLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDdkQsSUFBSSxDQUFDLHNCQUFzQixHQUFHLElBQUksQ0FBQztRQUNuQyxJQUFJLENBQUMsY0FBYyxHQUFHLEVBQUUsQ0FBQztRQUN6QixJQUFJLENBQUMsV0FBVyxHQUFHLEVBQUUsQ0FBQztRQUN0QixJQUFJLENBQUMsWUFBWSxHQUFHLEVBQUMsUUFBUSxFQUFFLENBQUMsRUFBRSxZQUFZLEVBQUUsQ0FBQyxFQUFFLGFBQWEsRUFBRSxFQUFFLEVBQUMsQ0FBQztRQUN0RSxJQUFJLENBQUMsbUJBQW1CLEdBQUcsRUFBRSxDQUFDO1FBRTlCLElBQUksQ0FBQyxhQUFhLEdBQUcsS0FBSyxDQUFDO1FBQzNCLElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDO1FBQ3RCLElBQUksQ0FBQyxhQUFhLEdBQUcsS0FBSyxDQUFDO1FBQzNCLElBQUksQ0FBQyxtQkFBbUIsR0FBRyxLQUFLLENBQUM7UUFDakMsSUFBSSxDQUFDLDRCQUE0QixHQUFHLElBQUksQ0FBQztRQUV6QyxJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLG1CQUFtQixDQUFDLENBQUMsQ0FBQztRQUNuRSxJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLGlCQUFpQixDQUFDLENBQUMsQ0FBQztRQUMvRCxJQUFJLENBQUMsbUJBQW1CLEdBQUcscUJBQXFCLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUNqRixJQUFJLENBQUMsaUJBQWlCLEdBQUcscUJBQXFCLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUM3RSxJQUFJLENBQUMsc0JBQXNCO1lBQ3ZCLEVBQUUsR0FBRyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxFQUFFLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxHQUFHLEtBQUssQ0FBQyxDQUFDO1FBRWhGLElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQztRQUVsQyxJQUFJLENBQUMsaUJBQWlCLEdBQUcsS0FBSyxDQUFDO1FBRS9CLElBQUksQ0FBQyxjQUFjLEVBQUUsUUFBUSxFQUFFLENBQUM7UUFDaEMsSUFBSSxDQUFDLGNBQWMsRUFBRSxRQUFRLEVBQUUsQ0FBQztJQUNwQyxDQUFDO0lBRU8sS0FBSyxDQUFDLElBQUk7UUFDZCxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7UUFDaEIsTUFBTSxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7SUFDMUIsQ0FBQztJQUVPLEtBQUssQ0FBQyxRQUFRO1FBQ2xCLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFO1lBQ2hCLE9BQU87U0FDVjtRQUVELElBQUksQ0FBQyxjQUFjLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUM7UUFDN0MsSUFBSSxDQUFDLGNBQWMsQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQztRQUU3QyxJQUFJLENBQUMsY0FBYyxDQUFDLFVBQVUsQ0FDMUIsSUFBSSxDQUFDLG1CQUFtQixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsRUFDbkMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQzdCLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUM5QixDQUFDO1FBRUYsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxTQUFTLEVBQUUsQ0FBQztRQUN6QyxJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksU0FBUyxDQUFDLE1BQU0sQ0FBQyxHQUFHLEVBQUUsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ3pELElBQUksQ0FBQyxRQUFRLEdBQUcsTUFBTSxJQUFJLENBQUMsY0FBYyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDO1FBRXpGLElBQUksSUFBSSxDQUFDLFdBQVcsSUFBSSxJQUFJLENBQUMsU0FBUyxFQUFFO1lBQ3BDLElBQUksQ0FBQyxjQUFjLENBQUMsTUFBTSxHQUFHLEVBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxXQUFXLEVBQUUsR0FBRyxFQUFFLElBQUksQ0FBQyxTQUFTLEVBQUMsQ0FBQztZQUM1RSxNQUFNLElBQUksQ0FBQyxjQUFjLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7U0FDOUQ7SUFDTCxDQUFDO0lBRU8sS0FBSyxDQUFDLG1CQUFtQixDQUM3QixZQUlDLEVBQ0QsY0FBc0I7UUFFdEIsSUFBSSxDQUFDLGlCQUFpQixHQUFHLElBQUksQ0FBQztRQUM5QixJQUFJLENBQUMsWUFBWSxHQUFHLFlBQVksQ0FBQztRQUNqQyxJQUFJLENBQUMsY0FBYyxHQUFHLGNBQWMsQ0FBQztJQUN6QyxDQUFDO0lBRU8sS0FBSyxDQUFDLGFBQWEsQ0FBQyxjQUFzQjtRQUM5QyxJQUFJLENBQUMsY0FBYyxHQUFHLGNBQWMsQ0FBQztRQUNyQyxJQUFJLENBQUMsaUJBQWlCLEdBQUcsS0FBSyxDQUFDO0lBQ25DLENBQUM7SUFFTyxLQUFLLENBQUMsV0FBVyxDQUFDLG1CQUF3QztRQUM5RCxJQUFJLENBQUMsbUJBQW1CLEdBQUcsbUJBQW1CLENBQUM7SUFDbkQsQ0FBQztJQUVPLEtBQUssQ0FBQyxNQUFNLENBQUMsT0FBc0I7UUFDdkMsTUFBTSxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7SUFDdEIsQ0FBQzs7bUhBOWJRLHFCQUFxQjt1R0FBckIscUJBQXFCLGtUQ2RsQyxremVBMlFBOzRGRDdQYSxxQkFBcUI7a0JBTGpDLFNBQVM7K0JBQ0ksZUFBZTs4RkFNbEIsV0FBVztzQkFEakIsS0FBSztnQkFHQyxRQUFRO3NCQURkLEtBQUs7Z0JBR0MsY0FBYztzQkFEcEIsS0FBSztnQkFHQyxjQUFjO3NCQURwQixLQUFLO2dCQUdDLGNBQWM7c0JBRHBCLEtBQUs7Z0JBR0MsWUFBWTtzQkFEbEIsS0FBSztnQkFHQyxnQkFBZ0I7c0JBRHRCLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0NvbXBvbmVudCwgSW5wdXQsIE9uQ2hhbmdlcywgT25EZXN0cm95LCBTaW1wbGVDaGFuZ2VzfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7UHJvZmlsZVNlcnZpY2V9IGZyb20gJy4uL3Byb2ZpbGUuc2VydmljZSc7XG5pbXBvcnQge0NhcnRlc2lhbk1lYXN1cmVWYWx1ZSwgUmFpbk5vZGUsIFRlYW1Ob2RlfSBmcm9tICdyYWFpbi1tb2RlbCc7XG5pbXBvcnQge0RhdGVSYW5nZSwgTWFwTGF0TG5nLCBUaW1lZnJhbWVDb250YWluZXJzfSBmcm9tICdyYWFpbi11aSc7XG5pbXBvcnQge0NvbXBhcmVNYW5hZ2VyLCBGcmFtZVNldCwgbWFwRGF0ZVJhbmdlVG9TdHJpbmcsIFJlZnJlc2hNYW5hZ2VyfSBmcm9tICcuLi90b29scyc7XG5pbXBvcnQge1hZVHlwZX0gZnJvbSAnLi4veHl0eXBlJztcbmltcG9ydCB7UmFkYXJTZXJ2aWNlfSBmcm9tICcuLi9yYWRhci5zZXJ2aWNlJztcbmltcG9ydCB7U3RvcmFnZX0gZnJvbSAnLi4vc3RvcmFnZS5zZXJ2aWNlJztcblxuQENvbXBvbmVudCh7XG4gICAgc2VsZWN0b3I6ICdyYWFpbi1kZXRhaWxzJyxcbiAgICB0ZW1wbGF0ZVVybDogJ3JhYWluLWRldGFpbHMuY29tcG9uZW50Lmh0bWwnLFxuICAgIHN0eWxlVXJsczogWydyYWFpbi1kZXRhaWxzLmNvbXBvbmVudC5zY3NzJ10sXG59KVxuZXhwb3J0IGNsYXNzIFJhYWluRGV0YWlsc0NvbXBvbmVudCBpbXBsZW1lbnRzIE9uRGVzdHJveSwgT25DaGFuZ2VzIHtcbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyB0b2dnbGVBZG1pbjogYm9vbGVhbjtcbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyByYWluTm9kZTogUmFpbk5vZGU7XG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgY29tcGFyZU1hbmFnZXI6IENvbXBhcmVNYW5hZ2VyO1xuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIHJlZnJlc2hNYW5hZ2VyOiBSZWZyZXNoTWFuYWdlcjtcbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBwcm9maWxlU2VydmljZTogUHJvZmlsZVNlcnZpY2U7XG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgcmFkYXJTZXJ2aWNlOiBSYWRhclNlcnZpY2U7XG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgdG9nZ2xlQ3VtdWxhdGl2ZTogYm9vbGVhbjtcblxuICAgIHB1YmxpYyBwZXJpb2RCZWdpbjogRGF0ZTtcbiAgICBwdWJsaWMgcGVyaW9kRW5kOiBEYXRlO1xuXG4gICAgLy8gcHVibGljIFVJIHZhcmlhYmxlc1xuICAgIHB1YmxpYyB0ZWFtTm9kZTogVGVhbU5vZGU7XG4gICAgcHVibGljIHBlcmlvZEJlZ2luQXNTdHJpbmc6IHN0cmluZztcbiAgICBwdWJsaWMgcGVyaW9kRW5kQXNTdHJpbmc6IHN0cmluZztcbiAgICBwdWJsaWMgcGVyaW9kRHVyYXRpb25Bc1N0cmluZzogc3RyaW5nO1xuICAgIHB1YmxpYyBkYXRlU2hvd246IERhdGU7XG4gICAgcHVibGljIGNvb3JkaW5hdGVzOiBNYXBMYXRMbmc7XG4gICAgcHVibGljIGJvcmRlcnM6IE1hcExhdExuZ1tdO1xuICAgIHB1YmxpYyB0aW1lZnJhbWVDb250YWluZXJzOiBUaW1lZnJhbWVDb250YWluZXJzO1xuICAgIHB1YmxpYyBjdXJyZW50VGltZWZyYW1lVGFyZ2V0OiBGcmFtZVNldDtcbiAgICBwdWJsaWMgdGltZWZyYW1lRGF0ZXM6IERhdGVbXTtcbiAgICBwdWJsaWMgY291bnRQb2ludHM6IHtcbiAgICAgICAgbGFiZWw6IHN0cmluZztcbiAgICAgICAgc3R5bGU6IHN0cmluZztcbiAgICAgICAgdmFsdWVzOiB7ZGF0ZTogRGF0ZTsgdmFsdWU6IG51bWJlcn1bXTtcbiAgICB9W107XG4gICAgcHVibGljIGNvdW50c1BlcmlvZDoge1xuICAgICAgICBwZXJjZW50SW1hZ2VzPzogWFlUeXBlW107XG4gICAgICAgIHF1ZXVlUnVubmluZz86IG51bWJlcjtcbiAgICAgICAgcHJvZ3Jlc3M/OiBudW1iZXI7XG4gICAgfTtcblxuICAgIHB1YmxpYyBnYXVnZVNlbGVjdGVkUG9pbnRzOiB7XG4gICAgICAgIGxhYmVsOiBzdHJpbmc7XG4gICAgICAgIHN0eWxlOiBzdHJpbmc7XG4gICAgICAgIHZhbHVlczoge2RhdGU6IERhdGU7IHZhbHVlOiBudW1iZXJ9W107XG4gICAgfVtdO1xuICAgIHB1YmxpYyB0b2dnbGVIaXN0b3J5OiBib29sZWFuO1xuICAgIHB1YmxpYyB0b2dnbGVNYXA6IGJvb2xlYW47XG4gICAgcHVibGljIHRvZ2dsZUNvbXBhcmU6IGJvb2xlYW47XG4gICAgcHVibGljIHRvZ2dsZUdhdWdlTWVhc3VyZXM6IGJvb2xlYW47XG4gICAgcHVibGljIHRvZ2dsZVJlbW92ZUNvbXBhcmVEdXBsaWNhdGU6IGJvb2xlYW47XG4gICAgcHVibGljIHJlZnJlc2hJblByb2dyZXNzOiBib29sZWFuO1xuICAgIHB1YmxpYyBzdW1EZXRhaWxzOiBzdHJpbmc7XG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IERhdGVSYW5nZSA9IERhdGVSYW5nZTtcblxuICAgIGNvbnN0cnVjdG9yKHByb3RlY3RlZCBzdG9yYWdlOiBTdG9yYWdlKSB7fVxuXG4gICAgcHJpdmF0ZSBzdGF0aWMgUGVyaW9kRGlzcGxheShkYXRlOiBEYXRlIHwgc3RyaW5nKSB7XG4gICAgICAgIGxldCBkID0gbmV3IERhdGUoKTtcbiAgICAgICAgaWYgKGRhdGUpIHtcbiAgICAgICAgICAgIGQgPSBuZXcgRGF0ZShkYXRlKTtcbiAgICAgICAgICAgIGNvbnN0IHVzZXJUaW1lem9uZU9mZnNldCA9IGQuZ2V0VGltZXpvbmVPZmZzZXQoKSAqIDYwMDAwO1xuICAgICAgICAgICAgZCA9IG5ldyBEYXRlKGQuZ2V0VGltZSgpIC0gdXNlclRpbWV6b25lT2Zmc2V0KTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBleGFtcGxlRm9ybWF0dGVkRGF0ZSA9ICcyMDE3LTA2LTAxVDA4OjMwJztcbiAgICAgICAgcmV0dXJuIGQudG9JU09TdHJpbmcoKS5zdWJzdHJpbmcoMCwgZXhhbXBsZUZvcm1hdHRlZERhdGUubGVuZ3RoKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHN0YXRpYyBEYXRlVVRDKGRhdGU6IHN0cmluZykge1xuICAgICAgICBjb25zdCBoYXNJU09Gb3JtYXQgPSBkYXRlLm1hdGNoKC9eXFxkezR9LVxcZHsyfS1cXGR7Mn1UXFxkezJ9OlxcZHsyfTpcXGR7Mn1cXC5cXGR7M31aJC8pO1xuICAgICAgICBsZXQgZCA9IG5ldyBEYXRlKGRhdGUpO1xuICAgICAgICBpZiAoIWhhc0lTT0Zvcm1hdCkge1xuICAgICAgICAgICAgY29uc3QgdXNlclRpbWV6b25lT2Zmc2V0ID0gZC5nZXRUaW1lem9uZU9mZnNldCgpICogNjAwMDA7XG4gICAgICAgICAgICBkID0gbmV3IERhdGUoZC5nZXRUaW1lKCkgLSB1c2VyVGltZXpvbmVPZmZzZXQpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBkO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBmZXRjaERhdGEoZm9jdXNEYXRlOiBEYXRlLCBmb2N1c1JhbmdlOiBEYXRlUmFuZ2UpIHtcbiAgICAgICAgY29uc3QgdmFsdWVzID0gW107XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgMTA7IGkrKykge1xuICAgICAgICAgICAgdmFsdWVzLnB1c2goe2RhdGU6IG5ldyBEYXRlKDIwMjAgKyBpLCAwKSwgdmFsdWU6IDEwfSk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZmFrZURhdGEgPSBbXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgbGFiZWw6ICclIFJhaW55JyxcbiAgICAgICAgICAgICAgICBzdHlsZTogJ2JhcicsXG4gICAgICAgICAgICAgICAgdmFsdWVzLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBsYWJlbDogJyUgSW1hZ2VzJyxcbiAgICAgICAgICAgICAgICBzdHlsZTogJ2JhcicsXG4gICAgICAgICAgICAgICAgdmFsdWVzLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIC8vICB7XG4gICAgICAgICAgICAvLyAgICAgIGxhYmVsOiAnJSBRdWFsaXR5JyxcbiAgICAgICAgICAgIC8vICAgICAgc3R5bGU6ICdsaW5lJyxcbiAgICAgICAgICAgIC8vICAgICAgdmFsdWVzLFxuICAgICAgICAgICAgLy8gIH0sXG4gICAgICAgIF07XG5cbiAgICAgICAgY29uc3QgcmFuZ2UgPSBtYXBEYXRlUmFuZ2VUb1N0cmluZyhmb2N1c1JhbmdlKTtcbiAgICAgICAgbGV0IGRhdGEgPSBmYWtlRGF0YTtcbiAgICAgICAgaWYgKCF0aGlzLnJhaW5Ob2RlKSB7XG4gICAgICAgICAgICByZXR1cm4gZGF0YTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChmb2N1c1JhbmdlID09PSBEYXRlUmFuZ2UuQ0VOVFVSWSkge1xuICAgICAgICAgICAgLy8gZmFrZVxuICAgICAgICB9IGVsc2UgaWYgKGZvY3VzUmFuZ2UgPT09IERhdGVSYW5nZS5IT1VSKSB7XG4gICAgICAgICAgICBjb25zdCBob3VyQ291bnRzID0gYXdhaXQgdGhpcy5wcm9maWxlU2VydmljZS5nZXRDb3VudHNIb3VyKHRoaXMucmFpbk5vZGUuaWQsIHtcbiAgICAgICAgICAgICAgICBwZXJpb2RCZWdpbjogZm9jdXNEYXRlLFxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIGRhdGEgPSBbXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBsYWJlbDogJ1JhaW55IENvdW50JyxcbiAgICAgICAgICAgICAgICAgICAgc3R5bGU6ICdsaW5lJyxcbiAgICAgICAgICAgICAgICAgICAgdmFsdWVzOiBob3VyQ291bnRzLnJhaW55Q291bnQubWFwKChjKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGU6IFJhYWluRGV0YWlsc0NvbXBvbmVudC5EYXRlVVRDKGMubmFtZSksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IE1hdGgubWluKDEwMCwgYy54KSxcbiAgICAgICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBsYWJlbDogJyUgSW1hZ2VzJyxcbiAgICAgICAgICAgICAgICAgICAgc3R5bGU6ICdiYXInLFxuICAgICAgICAgICAgICAgICAgICB2YWx1ZXM6IGhvdXJDb3VudHMucGVyY2VudEltYWdlcy5tYXAoKGMpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0ZTogUmFhaW5EZXRhaWxzQ29tcG9uZW50LkRhdGVVVEMoYy5uYW1lKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogTWF0aC5taW4oMTAwLCBjLngpLFxuICAgICAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIGxhYmVsOiAnUmFpbnkgU3VtJyxcbiAgICAgICAgICAgICAgICAgICAgc3R5bGU6ICdsaW5lJyxcbiAgICAgICAgICAgICAgICAgICAgdmFsdWVzOiBob3VyQ291bnRzLnJhaW55U3VtLm1hcCgoYykgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRlOiBSYWFpbkRldGFpbHNDb21wb25lbnQuRGF0ZVVUQyhjLm5hbWUpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiBNYXRoLm1pbigxMDAsIGMueCksXG4gICAgICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgXTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdmZXRjaERhdGEgVE9ETzonLCBmb2N1c0RhdGUudG9JU09TdHJpbmcoKSwgcmFuZ2UpO1xuICAgICAgICAgICAgY29uc3QgY291bnRzID0gYXdhaXQgdGhpcy5wcm9maWxlU2VydmljZS5nZXRDb3VudHModGhpcy5yYWluTm9kZS5pZCwge1xuICAgICAgICAgICAgICAgIHJhbmdlLFxuICAgICAgICAgICAgICAgIHBlcmlvZEJlZ2luOiBmb2N1c0RhdGUsXG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgZGF0YSA9IFtcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIGxhYmVsOiAnJSBSYWlueScsXG4gICAgICAgICAgICAgICAgICAgIHN0eWxlOiAnYmFyJyxcbiAgICAgICAgICAgICAgICAgICAgdmFsdWVzOiBjb3VudHMucGVyY2VudFJhaW55Lm1hcCgoYykgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRlOiBSYWFpbkRldGFpbHNDb21wb25lbnQuRGF0ZVVUQyhjLm5hbWUpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiBNYXRoLm1pbigxMDAsIGMueCksXG4gICAgICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgbGFiZWw6ICclIEltYWdlcycsXG4gICAgICAgICAgICAgICAgICAgIHN0eWxlOiAnYmFyJyxcbiAgICAgICAgICAgICAgICAgICAgdmFsdWVzOiBjb3VudHMucGVyY2VudEltYWdlcy5tYXAoKGMpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0ZTogUmFhaW5EZXRhaWxzQ29tcG9uZW50LkRhdGVVVEMoYy5uYW1lKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogTWF0aC5taW4oMTAwLCBjLngpLFxuICAgICAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAvLyAge1xuICAgICAgICAgICAgICAgIC8vICAgICAgbGFiZWw6ICclIFF1YWxpdHknLFxuICAgICAgICAgICAgICAgIC8vICAgICAgc3R5bGU6ICdsaW5lJyxcbiAgICAgICAgICAgICAgICAvLyAgICAgIHZhbHVlczogY291bnRzLnBlcmNlbnRRLm1hcCgoYykgPT4ge1xuICAgICAgICAgICAgICAgIC8vICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgLy8gICAgICAgICAgICAgIGRhdGU6IFJhYWluRGV0YWlsc0NvbXBvbmVudC5EYXRlVVRDKGMubmFtZSksXG4gICAgICAgICAgICAgICAgLy8gICAgICAgICAgICAgIHZhbHVlOiBNYXRoLm1pbigxMDAsIGMueCksXG4gICAgICAgICAgICAgICAgLy8gICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAvLyAgICAgIH0pLFxuICAgICAgICAgICAgICAgIC8vICB9LFxuICAgICAgICAgICAgXTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnNvbGUubG9nKGBmZXRjaERhdGEgRE9ORSAke3JhbmdlfWAsIGRhdGEpO1xuICAgICAgICByZXR1cm4gZGF0YTtcbiAgICB9XG5cbiAgICAvLyBXcmFwcGVyIGZ1bmN0aW9uIHRoYXQgcHJlc2VydmVzIHRoZSBhc3luYyBuYXR1cmUgb2YgZmV0Y2hEYXRhXG4gICAgcHVibGljIGZldGNoRGF0YVdyYXBwZXIgPSBhc3luYyAoZm9jdXNEYXRlOiBEYXRlLCBmb2N1c1JhbmdlOiBEYXRlUmFuZ2UpID0+IHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuZmV0Y2hEYXRhKGZvY3VzRGF0ZSwgZm9jdXNSYW5nZSk7XG4gICAgfTtcblxuICAgIHB1YmxpYyBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XG4gICAgICAgIHRoaXMuY2hhbmdlKGNoYW5nZXMpLnRoZW4oKGlnbm9yZWQpID0+IHt9KTtcbiAgICB9XG5cbiAgICBuZ09uRGVzdHJveSgpIHtcbiAgICAgICAgdGhpcy5jbGVhbkFsbCgpO1xuICAgIH1cblxuICAgIGFzeW5jIG9uRW5hYmxlQ291bnRIaXN0b3J5VGFiKHJhaW46IFJhaW5Ob2RlKSB7XG4gICAgICAgIGlmICghdGhpcy50b2dnbGVIaXN0b3J5KSB7XG4gICAgICAgICAgICB0aGlzLmNvdW50UG9pbnRzID0gW107XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBhc3luYyBvblBlcmlvZEJlZ2luQ2hhbmdlKGV2ZW50OiBhbnkpIHtcbiAgICAgICAgY29uc3QgbmV3VmFsdWUgPSBldmVudD8udGFyZ2V0Py52YWx1ZSA/PyB0aGlzLnBlcmlvZEJlZ2luQXNTdHJpbmc7XG4gICAgICAgIHRoaXMucGVyaW9kQmVnaW4gPSBuZXcgRGF0ZShuZXdWYWx1ZSk7XG4gICAgICAgIHRoaXMucGVyaW9kQmVnaW5Bc1N0cmluZyA9IG5ld1ZhbHVlO1xuICAgICAgICB0aGlzLnN0b3JhZ2Uuc2V0KCdyYWFpbi1wZXJpb2RCZWdpbicsIHRoaXMucGVyaW9kQmVnaW4pO1xuXG4gICAgICAgIGF3YWl0IHRoaXMub25QZXJpb2REdXJhdGlvbkNoYW5nZShldmVudCk7XG4gICAgfVxuXG4gICAgYXN5bmMgb25QZXJpb2REdXJhdGlvbkNoYW5nZShfZXZlbnQ6IEV2ZW50KSB7XG4gICAgICAgIGNvbnN0IGR1cmF0aW9uSW5Ib3VyID0gcGFyc2VGbG9hdCh0aGlzLnBlcmlvZER1cmF0aW9uQXNTdHJpbmcpO1xuICAgICAgICB0aGlzLnBlcmlvZEVuZCA9IG5ldyBEYXRlKHRoaXMucGVyaW9kQmVnaW4uZ2V0VGltZSgpICsgZHVyYXRpb25JbkhvdXIgKiAoNjAgKiA2MDAwMCkpO1xuICAgICAgICB0aGlzLnBlcmlvZEVuZEFzU3RyaW5nID0gdGhpcy5wZXJpb2RFbmQudG9JU09TdHJpbmcoKTtcbiAgICAgICAgdGhpcy5zdG9yYWdlLnNldCgncmFhaW4tcGVyaW9kRW5kJywgdGhpcy5wZXJpb2RFbmQpO1xuICAgICAgICB0aGlzLnJlZnJlc2hNYW5hZ2VyLnBlcmlvZCA9IHtiZWdpbjogdGhpcy5wZXJpb2RCZWdpbiwgZW5kOiB0aGlzLnBlcmlvZEVuZH07XG4gICAgfVxuXG4gICAgYXN5bmMgb25EYXRlQ2hhbmdlSW5Db3VudChkYXRlQ2hhbmdlZDogRGF0ZSkge1xuICAgICAgICBjb25zb2xlLmxvZygnb25EYXRlQ2hhbmdlSW5Db3VudCcsIGRhdGVDaGFuZ2VkKTtcbiAgICAgICAgdGhpcy5wZXJpb2RCZWdpbkFzU3RyaW5nID1cbiAgICAgICAgICAgIGRhdGVDaGFuZ2VkLnRvSVNPU3RyaW5nKCkuc3Vic3RyaW5nKDAsIDExKSArXG4gICAgICAgICAgICBkYXRlQ2hhbmdlZC50b0xvY2FsZVRpbWVTdHJpbmcoKS5zdWJzdHJpbmcoMCwgNSk7XG4gICAgICAgIHRoaXMucGVyaW9kRHVyYXRpb25Bc1N0cmluZyA9ICcxJztcbiAgICAgICAgYXdhaXQgdGhpcy5vblBlcmlvZEJlZ2luQ2hhbmdlKG51bGwpO1xuICAgICAgICB0aGlzLnJlZnJlc2hNYW5hZ2VyLnJlZnJlc2goZmFsc2UsIHRydWUpO1xuICAgIH1cblxuICAgIGFzeW5jIG9uRGF0ZUNoYW5nZUluTWFwKGRhdGVTaG93bjogRGF0ZSkge1xuICAgICAgICAvLyBjb25zb2xlLmxvZygnb25EYXRlQ2hhbmdlSW5NYXAnLCBkYXRlU2hvd24pO1xuICAgICAgICB0aGlzLmRhdGVTaG93biA9IGRhdGVTaG93bjtcbiAgICAgICAgY29uc3QgY3VtdWxhdGl2ZUhvdXJzOiBudW1iZXIgPSAhdGhpcy50b2dnbGVDdW11bGF0aXZlXG4gICAgICAgICAgICA/IDBcbiAgICAgICAgICAgIDogcGFyc2VGbG9hdCh0aGlzLnBlcmlvZER1cmF0aW9uQXNTdHJpbmcpO1xuICAgICAgICBhd2FpdCB0aGlzLnJlZnJlc2hNYW5hZ2VyLmZldGNoKHRoaXMuZGF0ZVNob3duLCB0aGlzLnRvZ2dsZUdhdWdlTWVhc3VyZXMsIGN1bXVsYXRpdmVIb3Vycyk7XG4gICAgICAgIHRoaXMuY3VycmVudFRpbWVmcmFtZVRhcmdldCA9IHRoaXMucmVmcmVzaE1hbmFnZXIuZ2V0VGltZWxpbmVTZWxlY3RlZEZyYW1lU2V0KCk7XG4gICAgICAgIGF3YWl0IHRoaXMucmVmcmVzaE1hbmFnZXIuc2V0UmVwb3J0UGVyaW9kKHRoaXMuZGF0ZVNob3duKTtcbiAgICB9XG5cbiAgICBhc3luYyBvblN1bUNoYW5nZUluTWFwKHN1bTogc3RyaW5nKSB7XG4gICAgICAgIHRoaXMuc3VtRGV0YWlscyA9IHN1bTtcbiAgICB9XG5cbiAgICBhc3luYyBvbkdhdWdlU2VsZWN0SW5NYXAobWFwTGF0TG5nOiBNYXBMYXRMbmcpIHtcbiAgICAgICAgY29uc3QgZ2F1Z2VzRmlsdGVyZWQgPSB0aGlzLmNvbXBhcmVNYW5hZ2VyLmdhdWdlc0luTWFwLmZpbHRlcihcbiAgICAgICAgICAgIChnKSA9PiBnLmxhdCA9PT0gbWFwTGF0TG5nLmxhdCAmJiBnLmxuZyA9PT0gbWFwTGF0TG5nLmxuZ1xuICAgICAgICApO1xuICAgICAgICBpZiAoZ2F1Z2VzRmlsdGVyZWQubGVuZ3RoICE9PSAxKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZ2F1Z2VTZWxlY3RlZCA9IGdhdWdlc0ZpbHRlcmVkWzBdO1xuXG4gICAgICAgIGF3YWl0IHRoaXMucmVmcmVzaEdhdWdlVmFsdWVzKHtpZDogZ2F1Z2VTZWxlY3RlZC5pZCwgbmFtZTogZ2F1Z2VTZWxlY3RlZC5uYW1lfSk7XG5cbiAgICAgICAgYXdhaXQgdGhpcy5jb21wYXJlTWFuYWdlci5zZWxlY3RHYXVnZShnYXVnZVNlbGVjdGVkLmlkLCAwKTtcbiAgICB9XG5cbiAgICBhc3luYyByZWZyZXNoR2F1Z2VWYWx1ZXMoZ2F1Z2VTZWxlY3RlZDoge2lkOiBzdHJpbmc7IG5hbWU6IHN0cmluZ30pIHtcbiAgICAgICAgY29uc3QgZGF5QmVnaW4gPSBuZXcgRGF0ZSh0aGlzLnBlcmlvZEJlZ2luLnRvSVNPU3RyaW5nKCkuc3Vic3RyaW5nKDAsIDEwKSk7XG4gICAgICAgIGNvbnN0IGRheUVuZCA9IG5ldyBEYXRlKGRheUJlZ2luLmdldFRpbWUoKSArIDI0ICogNjAgKiA2MCAqIDEwMDAgLSAxKTtcbiAgICAgICAgY29uc3QgZ2F1Z2VNZWFzdXJlcyA9IGF3YWl0IHRoaXMucHJvZmlsZVNlcnZpY2UuZ2V0R2F1Z2VNZWFzdXJlcyhcbiAgICAgICAgICAgIGdhdWdlU2VsZWN0ZWQuaWQsXG4gICAgICAgICAgICBkYXlCZWdpbixcbiAgICAgICAgICAgIGRheUVuZFxuICAgICAgICApO1xuICAgICAgICBjb25zdCBnYXVnZVZhbHVlczoge2RhdGU6IERhdGU7IHZhbHVlOiBudW1iZXJ9W10gPSBnYXVnZU1lYXN1cmVzLm1hcCgoZ20pID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGNhcnRlc2lhbk1lYXN1cmVWYWx1ZSA9IG5ldyBDYXJ0ZXNpYW5NZWFzdXJlVmFsdWUoZ20udmFsdWVzWzBdIGFzIGFueSk7XG4gICAgICAgICAgICBjb25zdCB2YWx1ZSA9IGNhcnRlc2lhbk1lYXN1cmVWYWx1ZS5nZXRDYXJ0ZXNpYW5WYWx1ZXMoKVswXS52YWx1ZTtcbiAgICAgICAgICAgIHJldHVybiB7ZGF0ZTogZ20uZGF0ZSwgdmFsdWV9O1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5nYXVnZVNlbGVjdGVkUG9pbnRzID0gW1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGxhYmVsOiBnYXVnZVNlbGVjdGVkLm5hbWUsXG4gICAgICAgICAgICAgICAgc3R5bGU6ICdiYXInLFxuICAgICAgICAgICAgICAgIHZhbHVlczogZ2F1Z2VWYWx1ZXMsXG4gICAgICAgICAgICB9LFxuICAgICAgICBdO1xuICAgICAgICBjb25zb2xlLmxvZygndGhpcy5nYXVnZVNlbGVjdGVkUG9pbnRzOicsIHRoaXMuZ2F1Z2VTZWxlY3RlZFBvaW50cyk7XG4gICAgfVxuXG4gICAgYXN5bmMgb25HYXVnZVNlbGVjdEluQ29tcGFyZShlOiB7cG9pbnQ6IFhZVHlwZTsgY29tcGFyZUluZGV4OiBudW1iZXJ9KSB7XG4gICAgICAgIGF3YWl0IHRoaXMucmVmcmVzaEdhdWdlVmFsdWVzKHtpZDogZS5wb2ludC5pZCwgbmFtZTogZS5wb2ludC5uYW1lfSk7XG5cbiAgICAgICAgYXdhaXQgdGhpcy5jb21wYXJlTWFuYWdlci5zZWxlY3RHYXVnZShlLnBvaW50LmlkLCBlLmNvbXBhcmVJbmRleCk7XG4gICAgfVxuXG4gICAgYXN5bmMgb25Ub2dnbGVNYXAoJGV2ZW50OiBFdmVudCkge1xuICAgICAgICAvLyBpZiAodGhpcy50b2dnbGVNYXApIHtcbiAgICAgICAgLy8gICAgYXdhaXQgdGhpcy5yZWZyZXNoTWFwKCk7XG4gICAgICAgIC8vIH1cbiAgICB9XG5cbiAgICBvbkNoYW5nZURldGVjdGlvblRlc3QocmFpbk5vZGU6IFJhaW5Ob2RlKSB7XG4gICAgICAgIC8vIFRPRE8gY29uc29sZS5sb2coVEVTVF9ERVRFQ1RJT04rKywgJ29uQ2hhbmdlRGV0ZWN0aW9uVGVzdCcpO1xuICAgICAgICByZXR1cm4gJyc7XG4gICAgfVxuXG4gICAgYXN5bmMgcmVmcmVzaE1hcCgpIHtcbiAgICAgICAgdGhpcy5nYXVnZVNlbGVjdGVkUG9pbnRzID0gW107XG4gICAgICAgIC8vIHRoaXMucXVhbGl0eUNvbmYudHJ1c3RmdWxHYXVnZUlkcyA9IHRoaXMucXVhbGl0eUNvbmYudHJ1c3RmdWxHYXVnZUlkcz8ubGVuZ3RoID4gMCA/XG4gICAgICAgIC8vICB0aGlzLnF1YWxpdHlDb25mLnRydXN0ZnVsR2F1Z2VJZHMgOiB0aGlzLmdhdWdlc1RvRmlsdGVyLmZpbHRlcihnID0+IGcuaXNJbikubWFwKGcgPT4gZy5pZCk7XG4gICAgICAgIHRoaXMuYm9yZGVycyA9IFtcbiAgICAgICAgICAgIC8vICBuZXcgTWFwTGF0TG5nKHJhaW5Ob2RlLmxhdGl0dWRlIC0gMjUwICogMC4wMDgsIHJhaW5Ob2RlLmxvbmdpdHVkZSksXG4gICAgICAgICAgICAvLyAgbmV3IE1hcExhdExuZyhyYWluTm9kZS5sYXRpdHVkZSwgcmFpbk5vZGUubG9uZ2l0dWRlIC0gMjUwICogMC4wMTMpLFxuICAgICAgICAgICAgLy8gIG5ldyBNYXBMYXRMbmcocmFpbk5vZGUubGF0aXR1ZGUsIHJhaW5Ob2RlLmxvbmdpdHVkZSArIDI1MCAqIDAuMDEzKSxcbiAgICAgICAgICAgIC8vICBuZXcgTWFwTGF0TG5nKHJhaW5Ob2RlLmxhdGl0dWRlICsgMjUwICogMC4wMDgsIHJhaW5Ob2RlLmxvbmdpdHVkZSksXG4gICAgICAgIF07XG5cbiAgICAgICAgdGhpcy5jb21wYXJlTWFuYWdlci5jbGVhbkFsbCgpO1xuICAgICAgICBhd2FpdCB0aGlzLmNvbXBhcmVNYW5hZ2VyLnNldEdhdWdlc0luTWFwKCk7XG4gICAgICAgIHRoaXMucmVmcmVzaE1hbmFnZXIucmVmcmVzaChmYWxzZSwgdGhpcy50b2dnbGVBZG1pbik7XG4gICAgfVxuXG4gICAgYXN5bmMgbGF1bmNoQ29tcHV0YXRpb24oKSB7XG4gICAgICAgIGF3YWl0IHRoaXMucHJvZmlsZVNlcnZpY2UubGF1bmNoUmFpbkNvbXB1dGF0aW9uKHRoaXMucmFpbk5vZGUuaWQsIHRoaXMuZGF0ZVNob3duKTtcbiAgICB9XG5cbiAgICBhc3luYyBzZXRQZXJpb2RPZk5vdygpIHtcbiAgICAgICAgLy8gc2hvdWxkIGxvb2sgbGlrZTogXCIyMDI0LTA4LTI2VDEyOjEzXCJcbiAgICAgICAgY29uc3QgbGFzdDMwbW4gPSBuZXcgRGF0ZSgpO1xuICAgICAgICBsYXN0MzBtbi5zZXRNaW51dGVzKGxhc3QzMG1uLmdldE1pbnV0ZXMoKSAtIDMwKTtcbiAgICAgICAgdGhpcy5wZXJpb2RCZWdpbkFzU3RyaW5nID1cbiAgICAgICAgICAgIGxhc3QzMG1uLnRvSVNPU3RyaW5nKCkuc3Vic3RyaW5nKDAsIDExKSArIGxhc3QzMG1uLnRvTG9jYWxlVGltZVN0cmluZygpLnN1YnN0cmluZygwLCA1KTtcbiAgICAgICAgdGhpcy5wZXJpb2REdXJhdGlvbkFzU3RyaW5nID0gJzEnO1xuICAgICAgICBhd2FpdCB0aGlzLm9uUGVyaW9kQmVnaW5DaGFuZ2UobnVsbCk7XG4gICAgICAgIHRoaXMucmVmcmVzaE1hbmFnZXIucmVmcmVzaChmYWxzZSwgdHJ1ZSk7XG4gICAgfVxuXG4gICAgZ2V0UGVyY2VudE9mSW1hZ2VzKCkge1xuICAgICAgICBpZiAoIXRoaXMuY291bnRzUGVyaW9kLnBlcmNlbnRJbWFnZXM/Lmxlbmd0aCkge1xuICAgICAgICAgICAgcmV0dXJuIDA7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBkdXJpbmdQZXJpb2QgPSB0aGlzLmNvdW50c1BlcmlvZC5wZXJjZW50SW1hZ2VzLmZpbHRlcihcbiAgICAgICAgICAgIChhKSA9PlxuICAgICAgICAgICAgICAgIHRoaXMucGVyaW9kQmVnaW4uZ2V0VGltZSgpIDw9IG5ldyBEYXRlKGEubmFtZSkuZ2V0VGltZSgpICYmXG4gICAgICAgICAgICAgICAgbmV3IERhdGUoYS5uYW1lKS5nZXRUaW1lKCkgPD0gdGhpcy5wZXJpb2RFbmQuZ2V0VGltZSgpXG4gICAgICAgICk7XG4gICAgICAgIGNvbnN0IHN1bW1lZCA9IGR1cmluZ1BlcmlvZC5yZWR1Y2UoKGEsIGIpID0+IGEgKyAoYi54ID8/IDApLCAwKTtcbiAgICAgICAgcmV0dXJuIE1hdGgucm91bmQoc3VtbWVkIC8gZHVyaW5nUGVyaW9kLmxlbmd0aCk7XG4gICAgfVxuXG4gICAgZ2V0UGVyY2VudE9mQ29tcHV0YXRpb25zKCkge1xuICAgICAgICBjb25zdCB0aW1lbGluZSA9IHRoaXMucmVmcmVzaE1hbmFnZXIuZ2V0VGltZWxpbmVGcmFtZVNldCgpO1xuICAgICAgICBpZiAoIXRpbWVsaW5lPy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHJldHVybiAwO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgdGltZWxpbmVXaXRoQ29tcHV0YXRpb24gPSB0aW1lbGluZS5maWx0ZXIoKGEpID0+ICEhYS5yYWluQ29tcHV0YXRpb25JZCk7XG4gICAgICAgIGNvbnN0IHJhdGlvID0gdGltZWxpbmVXaXRoQ29tcHV0YXRpb24ubGVuZ3RoIC8gdGltZWxpbmUubGVuZ3RoO1xuICAgICAgICByZXR1cm4gTWF0aC5yb3VuZChyYXRpbyAqIDEwMCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBjbGVhbkFsbCgpIHtcbiAgICAgICAgdGhpcy5ib3JkZXJzID0gW107XG5cbiAgICAgICAgdGhpcy50aW1lZnJhbWVDb250YWluZXJzID0gbmV3IFRpbWVmcmFtZUNvbnRhaW5lcnMoW10pO1xuICAgICAgICB0aGlzLmN1cnJlbnRUaW1lZnJhbWVUYXJnZXQgPSBudWxsO1xuICAgICAgICB0aGlzLnRpbWVmcmFtZURhdGVzID0gW107XG4gICAgICAgIHRoaXMuY291bnRQb2ludHMgPSBbXTtcbiAgICAgICAgdGhpcy5jb3VudHNQZXJpb2QgPSB7cHJvZ3Jlc3M6IDAsIHF1ZXVlUnVubmluZzogMCwgcGVyY2VudEltYWdlczogW119O1xuICAgICAgICB0aGlzLmdhdWdlU2VsZWN0ZWRQb2ludHMgPSBbXTtcblxuICAgICAgICB0aGlzLnRvZ2dsZUhpc3RvcnkgPSBmYWxzZTtcbiAgICAgICAgdGhpcy50b2dnbGVNYXAgPSB0cnVlO1xuICAgICAgICB0aGlzLnRvZ2dsZUNvbXBhcmUgPSBmYWxzZTtcbiAgICAgICAgdGhpcy50b2dnbGVHYXVnZU1lYXN1cmVzID0gZmFsc2U7XG4gICAgICAgIHRoaXMudG9nZ2xlUmVtb3ZlQ29tcGFyZUR1cGxpY2F0ZSA9IHRydWU7XG5cbiAgICAgICAgdGhpcy5wZXJpb2RCZWdpbiA9IG5ldyBEYXRlKHRoaXMuc3RvcmFnZS5nZXQoJ3JhYWluLXBlcmlvZEJlZ2luJykpO1xuICAgICAgICB0aGlzLnBlcmlvZEVuZCA9IG5ldyBEYXRlKHRoaXMuc3RvcmFnZS5nZXQoJ3JhYWluLXBlcmlvZEVuZCcpKTtcbiAgICAgICAgdGhpcy5wZXJpb2RCZWdpbkFzU3RyaW5nID0gUmFhaW5EZXRhaWxzQ29tcG9uZW50LlBlcmlvZERpc3BsYXkodGhpcy5wZXJpb2RCZWdpbik7XG4gICAgICAgIHRoaXMucGVyaW9kRW5kQXNTdHJpbmcgPSBSYWFpbkRldGFpbHNDb21wb25lbnQuUGVyaW9kRGlzcGxheSh0aGlzLnBlcmlvZEVuZCk7XG4gICAgICAgIHRoaXMucGVyaW9kRHVyYXRpb25Bc1N0cmluZyA9XG4gICAgICAgICAgICAnJyArICh0aGlzLnBlcmlvZEVuZC5nZXRUaW1lKCkgLSB0aGlzLnBlcmlvZEJlZ2luLmdldFRpbWUoKSkgLyAoNjAgKiA2MDAwMCk7XG5cbiAgICAgICAgdGhpcy5kYXRlU2hvd24gPSB0aGlzLnBlcmlvZEJlZ2luO1xuXG4gICAgICAgIHRoaXMucmVmcmVzaEluUHJvZ3Jlc3MgPSBmYWxzZTtcblxuICAgICAgICB0aGlzLmNvbXBhcmVNYW5hZ2VyPy5jbGVhbkFsbCgpO1xuICAgICAgICB0aGlzLnJlZnJlc2hNYW5hZ2VyPy5jbGVhbkFsbCgpO1xuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgaW5pdCgpIHtcbiAgICAgICAgdGhpcy5jbGVhbkFsbCgpO1xuICAgICAgICBhd2FpdCB0aGlzLmluaXRSYWluKCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBpbml0UmFpbigpIHtcbiAgICAgICAgaWYgKCF0aGlzLnJhaW5Ob2RlKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnJlZnJlc2hNYW5hZ2VyLnJhaW5Ob2RlID0gdGhpcy5yYWluTm9kZTtcbiAgICAgICAgdGhpcy5jb21wYXJlTWFuYWdlci5yYWluTm9kZSA9IHRoaXMucmFpbk5vZGU7XG5cbiAgICAgICAgdGhpcy5yZWZyZXNoTWFuYWdlci5zZXRNZXRob2RzKFxuICAgICAgICAgICAgdGhpcy5vblJlZnJlc2hJblByb2dyZXNzLmJpbmQodGhpcyksXG4gICAgICAgICAgICB0aGlzLm9uUmVmcmVzaERvbmUuYmluZCh0aGlzKSxcbiAgICAgICAgICAgIHRoaXMub25GZXRjaERvbmUuYmluZCh0aGlzKVxuICAgICAgICApO1xuXG4gICAgICAgIGNvbnN0IGNlbnRlciA9IHRoaXMucmFpbk5vZGUuZ2V0Q2VudGVyKCk7XG4gICAgICAgIHRoaXMuY29vcmRpbmF0ZXMgPSBuZXcgTWFwTGF0TG5nKGNlbnRlci5sYXQsIGNlbnRlci5sbmcpO1xuICAgICAgICB0aGlzLnRlYW1Ob2RlID0gYXdhaXQgdGhpcy5wcm9maWxlU2VydmljZS5nZXRUZWFtKHRoaXMucmFpbk5vZGUuZ2V0TGluaygndGVhbScpLmdldElkKCkpO1xuXG4gICAgICAgIGlmICh0aGlzLnBlcmlvZEJlZ2luICYmIHRoaXMucGVyaW9kRW5kKSB7XG4gICAgICAgICAgICB0aGlzLnJlZnJlc2hNYW5hZ2VyLnBlcmlvZCA9IHtiZWdpbjogdGhpcy5wZXJpb2RCZWdpbiwgZW5kOiB0aGlzLnBlcmlvZEVuZH07XG4gICAgICAgICAgICBhd2FpdCB0aGlzLnJlZnJlc2hNYW5hZ2VyLnJlZnJlc2goZmFsc2UsIHRoaXMudG9nZ2xlQWRtaW4pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBvblJlZnJlc2hJblByb2dyZXNzKFxuICAgICAgICBjb3VudFBlcmlvZHM6IHtcbiAgICAgICAgICAgIHBlcmNlbnRJbWFnZXM/OiBYWVR5cGVbXTtcbiAgICAgICAgICAgIHF1ZXVlUnVubmluZz86IG51bWJlcjtcbiAgICAgICAgICAgIHByb2dyZXNzPzogbnVtYmVyO1xuICAgICAgICB9LFxuICAgICAgICB0aW1lZnJhbWVEYXRlczogRGF0ZVtdXG4gICAgKSB7XG4gICAgICAgIHRoaXMucmVmcmVzaEluUHJvZ3Jlc3MgPSB0cnVlO1xuICAgICAgICB0aGlzLmNvdW50c1BlcmlvZCA9IGNvdW50UGVyaW9kcztcbiAgICAgICAgdGhpcy50aW1lZnJhbWVEYXRlcyA9IHRpbWVmcmFtZURhdGVzO1xuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgb25SZWZyZXNoRG9uZSh0aW1lZnJhbWVEYXRlczogRGF0ZVtdKSB7XG4gICAgICAgIHRoaXMudGltZWZyYW1lRGF0ZXMgPSB0aW1lZnJhbWVEYXRlcztcbiAgICAgICAgdGhpcy5yZWZyZXNoSW5Qcm9ncmVzcyA9IGZhbHNlO1xuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgb25GZXRjaERvbmUodGltZWZyYW1lQ29udGFpbmVyczogVGltZWZyYW1lQ29udGFpbmVycykge1xuICAgICAgICB0aGlzLnRpbWVmcmFtZUNvbnRhaW5lcnMgPSB0aW1lZnJhbWVDb250YWluZXJzO1xuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgY2hhbmdlKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpIHtcbiAgICAgICAgYXdhaXQgdGhpcy5pbml0KCk7XG4gICAgfVxufVxuIiwiPCEtLSBNYWluIGNvbnRlbnQgY29udGFpbmVyIC0tPlxuPGRpdiAqbmdJZj1cInJhaW5Ob2RlXCIgY2xhc3M9XCJyYWFpbi1kZXRhaWxzLWNvbnRhaW5lclwiPlxuXG4gICAgPCEtLSBIZWFkZXIgc2VjdGlvbiB3aXRoIG5vZGUgaW5mb1xuICAgIDxpb24tY2FyZCBjbGFzcz1cIm5vZGUtaW5mby1jYXJkXCI+XG4gICAgICAgIDxpb24tY2FyZC1jb250ZW50PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm5vZGUtaGVhZGVyXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm5vZGUtc3RhdHVzXCI+XG4gICAgICAgICAgICAgICAgICAgIDxpb24taWNvbiAqbmdJZj1cIihyYWluTm9kZSB8IGhhc0dvb2RRdWFsaXR5KVwiIGNvbG9yPVwic3VjY2Vzc1wiIG5hbWU9XCJjaGVja21hcmstY2lyY2xlXCI+PC9pb24taWNvbj5cbiAgICAgICAgICAgICAgICAgICAgPGlvbi1pY29uICpuZ0lmPVwiIShyYWluTm9kZSB8IGhhc0dvb2RRdWFsaXR5KVwiIGNvbG9yPVwid2FybmluZ1wiIG5hbWU9XCJhbGVydC1jaXJjbGVcIj48L2lvbi1pY29uPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJub2RlLXRpdGxlc1wiPlxuICAgICAgICAgICAgICAgICAgICA8aW9uLWNhcmQtdGl0bGU+e3sgcmFpbk5vZGUubmFtZSB9fTwvaW9uLWNhcmQtdGl0bGU+XG4gICAgICAgICAgICAgICAgICAgIDxpb24tY2FyZC1zdWJ0aXRsZT5ieSB7eyB0ZWFtTm9kZT8ubmFtZSB9fTwvaW9uLWNhcmQtc3VidGl0bGU+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm5vZGUtY29udHJvbHNcIj5cbiAgICAgICAgICAgICAgICAgICAgPGlvbi1sYWJlbCBjbGFzcz1cInRvZ2dsZS1sYWJlbFwiPkhpc3Rvcnk8L2lvbi1sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgPGlvbi10b2dnbGUgKGlvbkNoYW5nZSk9XCJvbkVuYWJsZUNvdW50SGlzdG9yeVRhYihyYWluTm9kZSlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cInRvZ2dsZUhpc3RvcnlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2hlY2tlZF09XCJ0b2dnbGVIaXN0b3J5XCI+XG4gICAgICAgICAgICAgICAgICAgIDwvaW9uLXRvZ2dsZT5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2lvbi1jYXJkLWNvbnRlbnQ+XG4gICAgPC9pb24tY2FyZD5cbi0tPlxuXG4gICAgPCEtLSBQZXJpb2Qgc2VsZWN0aW9uIHNlY3Rpb24gLS0+XG4gICAgPGlvbi1jYXJkIGNsYXNzPVwicGVyaW9kLWNhcmRcIj5cbiAgICAgICAgPGlvbi1jYXJkLWNvbnRlbnQ+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwicGVyaW9kLWNvbnRyb2xzXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInBlcmlvZC1yb3dcIj5cbiAgICAgICAgICAgICAgICAgICAgPGlvbi1idXR0b24gKGNsaWNrKT1cInNldFBlcmlvZE9mTm93KClcIiBjbGFzcz1cIm5vdy1idXR0b25cIiBmaWxsPVwib3V0bGluZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGlvbi1pY29uIG5hbWU9XCJ0aW1lLW91dGxpbmVcIiBzbG90PVwic3RhcnRcIj48L2lvbi1pY29uPlxuICAgICAgICAgICAgICAgICAgICAgICAgTm93XG4gICAgICAgICAgICAgICAgICAgIDwvaW9uLWJ1dHRvbj5cblxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicGVyaW9kLXN0YXJ0IGlvbi1oaWRlLW1kLWRvd25cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxpb24tbGFiZWw+U3RhcnQ6PC9pb24tbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgKGNoYW5nZSk9XCJvblBlcmlvZEJlZ2luQ2hhbmdlKCRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFt2YWx1ZV09XCJwZXJpb2RCZWdpbkFzU3RyaW5nXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImRhdGV0aW1lLWlucHV0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwiZGF0ZXRpbWUtbG9jYWxcIj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInBlcmlvZC1kdXJhdGlvbiBpb24taGlkZS1tZC1kb3duXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8aW9uLWxhYmVsPkR1cmF0aW9uOjwvaW9uLWxhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGlvbi1zZWxlY3QgKGlvbkRpc21pc3MpPVwib25QZXJpb2REdXJhdGlvbkNoYW5nZSgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwicGVyaW9kRHVyYXRpb25Bc1N0cmluZ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImR1cmF0aW9uLXNlbGVjdFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZD1cInBlcmlvZER1cmF0aW9uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVyZmFjZT1cInBvcG92ZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW9uLXNlbGVjdC1vcHRpb24gdmFsdWU9XCIwLjI1XCI+MTUgbWludXRlczwvaW9uLXNlbGVjdC1vcHRpb24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlvbi1zZWxlY3Qtb3B0aW9uIHZhbHVlPVwiMC41XCI+MzAgbWludXRlczwvaW9uLXNlbGVjdC1vcHRpb24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlvbi1zZWxlY3Qtb3B0aW9uIHZhbHVlPVwiMVwiPjEgaG91cjwvaW9uLXNlbGVjdC1vcHRpb24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlvbi1zZWxlY3Qtb3B0aW9uIHZhbHVlPVwiMlwiPjIgaG91cnM8L2lvbi1zZWxlY3Qtb3B0aW9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpb24tc2VsZWN0LW9wdGlvbiB2YWx1ZT1cIjNcIj4zIGhvdXJzPC9pb24tc2VsZWN0LW9wdGlvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW9uLXNlbGVjdC1vcHRpb24gdmFsdWU9XCI0XCI+NCBob3VyczwvaW9uLXNlbGVjdC1vcHRpb24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlvbi1zZWxlY3Qtb3B0aW9uIHZhbHVlPVwiNVwiPjUgaG91cnM8L2lvbi1zZWxlY3Qtb3B0aW9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpb24tc2VsZWN0LW9wdGlvbiB2YWx1ZT1cIjZcIj42IGhvdXJzPC9pb24tc2VsZWN0LW9wdGlvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvaW9uLXNlbGVjdD5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD1cImFsbC1kYXRlc1wiIHNsb3Q9XCJlbmRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxpb24tbGFiZWwgY2xhc3M9XCJ0b2dnbGUtbGFiZWxcIj5BbGwgZGF0ZXM8L2lvbi1sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxpb24tdG9nZ2xlIChpb25DaGFuZ2UpPVwib25FbmFibGVDb3VudEhpc3RvcnlUYWIocmFpbk5vZGUpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwidG9nZ2xlSGlzdG9yeVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2hlY2tlZF09XCJ0b2dnbGVIaXN0b3J5XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2lvbi10b2dnbGU+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgPCEtLSBIaWRkZW4gbGFiZWwgZm9yIGNoYW5nZSBkZXRlY3Rpb24gLS0+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImhpZGRlbi1sYWJlbFwiPnt7IG9uQ2hhbmdlRGV0ZWN0aW9uVGVzdChyYWluTm9kZSkgfX08L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICA8IS0tIEhpc3RvcmljYWwgbWFwIHNlY3Rpb24gLS0+XG4gICAgICAgICAgICA8ZGl2ICpuZ0lmPVwidG9nZ2xlSGlzdG9yeVwiIGNsYXNzPVwicGVyaW9kLWNvbnRyb2xzXCI+XG4gICAgICAgICAgICAgICAgPHJhYWluLWRhdGUtZHluYW1pYyAoY2hhbmdlZERhdGUpPVwib25EYXRlQ2hhbmdlSW5Db3VudCgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjdXJyZW50SGVpZ2h0XT1cIjMwMFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZmV0Y2hEYXRhXT1cImZldGNoRGF0YVdyYXBwZXJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3BvaW50c109XCJjb3VudFBvaW50c1wiPlxuICAgICAgICAgICAgICAgIDwvcmFhaW4tZGF0ZS1keW5hbWljPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvaW9uLWNhcmQtY29udGVudD5cbiAgICA8L2lvbi1jYXJkPlxuXG5cbiAgICA8IS0tIE1hcCBzZWN0aW9uIC0tPlxuICAgIDxpb24tY2FyZCBjbGFzcz1cIm1hcC1jYXJkXCI+XG4gICAgICAgIDxpb24tY2FyZC1jb250ZW50IGNsYXNzPVwibWFwLWNvbnRlbnRcIj5cbiAgICAgICAgICAgIDxpb24tZ3JpZD5cbiAgICAgICAgICAgICAgICA8aW9uLXJvdyBpZD1cInByb2dyZXNzQW5kUmVmcmVzaFwiPlxuICAgICAgICAgICAgICAgICAgICA8aW9uLWxhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJnZXRQZXJjZW50T2ZDb21wdXRhdGlvbnMoKVwiIGNsYXNzPVwibWFwLXN0YXRzXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgZ2V0UGVyY2VudE9mQ29tcHV0YXRpb25zKCkgfX0lIEltYWdlc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpICpuZ0lmPVwiY291bnRzUGVyaW9kLnByb2dyZXNzXCIgY2xhc3M9XCJwcm9ncmVzcy1pbmRpY2F0b3JcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW4gUHJvZ3Jlc3M6IHt7IGNvdW50c1BlcmlvZC5wcm9ncmVzcyB9fS4uLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvaT5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiIWdldFBlcmNlbnRPZkNvbXB1dGF0aW9ucygpXCIgY2xhc3M9XCJuby1kYXRhXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgTm8gaW1hZ2UgYXZhaWxhYmxlXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDwvaW9uLWxhYmVsPlxuXG4gICAgICAgICAgICAgICAgICAgIDxpb24tYnV0dG9uIChjbGljayk9XCJyZWZyZXNoTWFwKClcIiAqbmdJZj1cIiFyZWZyZXNoSW5Qcm9ncmVzc1wiIGNsYXNzPVwicmVmcmVzaC1idXR0b25cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxpb24taWNvbiBuYW1lPVwicmVmcmVzaC1vdXRsaW5lXCIgc2xvdD1cInN0YXJ0XCI+PC9pb24taWNvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIFJlZnJlc2ggTWFwXG4gICAgICAgICAgICAgICAgICAgIDwvaW9uLWJ1dHRvbj5cblxuICAgICAgICAgICAgICAgICAgICA8IS0tIFByb2dyZXNzIGluZGljYXRvciAtLT5cbiAgICAgICAgICAgICAgICAgICAgPGlvbi1wcm9ncmVzcy1iYXIgKm5nSWY9XCJyZWZyZXNoSW5Qcm9ncmVzc1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtidWZmZXJdPVwiKGNvdW50c1BlcmlvZC5wcm9ncmVzcyAvICgodGltZWZyYW1lRGF0ZXM/Lmxlbmd0aCB8fCAxMCkgKzMpKSswLjAxXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3ZhbHVlXT1cImNvdW50c1BlcmlvZC5wcm9ncmVzcyAvICgodGltZWZyYW1lRGF0ZXM/Lmxlbmd0aCB8fCAxMCkgKzMpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sb3I9XCJwcmltYXJ5XCI+XG4gICAgICAgICAgICAgICAgICAgIDwvaW9uLXByb2dyZXNzLWJhcj5cbiAgICAgICAgICAgICAgICA8L2lvbi1yb3c+XG4gICAgICAgICAgICAgICAgPGlvbi1yb3cgKm5nSWY9XCJ0b2dnbGVNYXAgJiYgZ2V0UGVyY2VudE9mSW1hZ2VzKClcIj5cbiAgICAgICAgICAgICAgICAgICAgPCEtLSBNYXAgY29tcG9uZW50IC0tPlxuICAgICAgICAgICAgICAgICAgICA8aW9uLWNvbCBjbGFzcz1cIm1hcC1jb2x1bW5cIiBzaXplLWxnPVwiN1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1hcC1jb250YWluZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmFhaW4tbWFwXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2hhbmdlZERhdGUpPVwib25EYXRlQ2hhbmdlSW5NYXAoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2hhbmdlZFN1bSk9XCJvblN1bUNoYW5nZUluTWFwKCRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHNlbGVjdGVkTWFya2VyKT1cIm9uR2F1Z2VTZWxlY3RJbk1hcCgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjb29yZGluYXRlc109XCJjb29yZGluYXRlc1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY3VycmVudEhlaWdodF09XCI1MDBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2RlZmF1bHREYXRlXT1cImRhdGVTaG93blwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbWFya2Vyc109XCJ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib3JkZXJzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2F1Z2VzOiBjb21wYXJlTWFuYWdlci5nYXVnZXNJbk1hcCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdhdWdlc0luQ29tcGFyZTogY29tcGFyZU1hbmFnZXIuZ2F1Z2VzSW5Db21wYXJlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWRHYXVnZXM6IGNvbXBhcmVNYW5hZ2VyLnNlbGVjdGVkR2F1Z2VzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGl4ZWxzOiBjb21wYXJlTWFuYWdlci5zZWxlY3RlZFBpeGVscyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpeGVsc1NvbHV0aW9uOiBjb21wYXJlTWFuYWdlci5waXhlbHNTb2x1dGlvbnM/Lmxlbmd0aCA/IGNvbXBhcmVNYW5hZ2VyLnBpeGVsc1NvbHV0aW9uc1swXSA6IFtdXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3Nob3dDdW11bGF0aXZlXT1cInRvZ2dsZUN1bXVsYXRpdmVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3N1bUZuXT1cInJlZnJlc2hNYW5hZ2VyLnN1bUZuXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzdW1WYWx1ZXNdPVwicmVmcmVzaE1hbmFnZXIuc3VtVmFsdWVzXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFt0aW1lZnJhbWVDb250YWluZXJzXT1cInRpbWVmcmFtZUNvbnRhaW5lcnNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3RpbWVmcmFtZURhdGVzXT1cInRpbWVmcmFtZURhdGVzXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9yYWFpbi1tYXA+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRhdGEtY29sdW1uXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBUZWNobmljYWwgZGV0YWlscyAoY29sbGFwc2libGUgZm9yIGNsZWFuZXIgVUkpIC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkZXRhaWxzIGNsYXNzPVwidGVjaG5pY2FsLWRldGFpbHNcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN1bW1hcnk+SW1hZ2UgRGV0YWlsczwvc3VtbWFyeT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRldGFpbHMtY29udGVudFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRldGFpbC1yb3dcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImRldGFpbC1sYWJlbFwiPkNvbXB1dGVkOjwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImRldGFpbC12YWx1ZVwiPnt7IHJlZnJlc2hNYW5hZ2VyLnJhaW5Db21wdXRhdGlvbk1hcERvbmVEYXRlIHwgZGF0ZToneXl5eS1NTS1kZCBISDptbScgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkZXRhaWwtcm93XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJkZXRhaWwtbGFiZWxcIj5WZXJzaW9uOjwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImRldGFpbC12YWx1ZVwiPnt7IHJlZnJlc2hNYW5hZ2VyLnJhaW5Db21wdXRhdGlvbk1hcFZlcnNpb24gfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkZXRhaWwtcm93XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJkZXRhaWwtbGFiZWxcIj5MYXVuY2hlZCBieTo8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJkZXRhaWwtdmFsdWVcIj57eyByZWZyZXNoTWFuYWdlci5yYWluQ29tcHV0YXRpb25NYXBMYXVuY2hlZEJ5IH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGV0YWlsLXJvd1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZGV0YWlsLWxhYmVsXCI+VGltZSBzcGVudDo8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJkZXRhaWwtdmFsdWVcIj57eyByZWZyZXNoTWFuYWdlci5yYWluQ29tcHV0YXRpb25NYXBUaW1lU3BlbnRJbk1zIH19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1zPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGV0YWlsLXJvd1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZGV0YWlsLWxhYmVsXCI+RGF0ZTo8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJkZXRhaWwtdmFsdWVcIj57eyByZWZyZXNoTWFuYWdlci5yYWluQ29tcHV0YXRpb25NYXBEYXRlPy50b0lTT1N0cmluZygpIH19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwge3sgcmVmcmVzaE1hbmFnZXIucmFpbkNvbXB1dGF0aW9uTWFwRGF0ZSB8IGRhdGU6J3l5eXktTU0tZGQgSEg6bW0nIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGV0YWlsLXJvd1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZGV0YWlsLWxhYmVsXCI+V2F0ZXIgaW4gdGhlIG1hcDo8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJkZXRhaWwtdmFsdWVcIj57eyBzdW1EZXRhaWxzIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGV0YWlsLXJvd1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZGV0YWlsLWxhYmVsXCI+U291cmNlIERCWiBtaW46PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZGV0YWlsLXZhbHVlXCI+e3sgcmVmcmVzaE1hbmFnZXIucmFpbkNvbXB1dGF0aW9uTWFwT3JpZ2luYWxNaW4gfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkZXRhaWwtcm93XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJkZXRhaWwtbGFiZWxcIj5Tb3VyY2UgREJaIG1heDo8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJkZXRhaWwtdmFsdWVcIj57eyByZWZyZXNoTWFuYWdlci5yYWluQ29tcHV0YXRpb25NYXBPcmlnaW5hbE1heCB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2RldGFpbHM+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC9pb24tY29sPlxuXG4gICAgICAgICAgICAgICAgICAgIDwhLS0gRGF0YSBwYW5lbCAtLT5cbiAgICAgICAgICAgICAgICAgICAgPGlvbi1jb2wgY2xhc3M9XCJkYXRhLWNvbHVtblwiIHNpemUtbGc9XCI1XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGF0YS1wYW5lbFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gQ29tcGFyZSBzdGFjayBjb21wb25lbnQgLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbXBhcmUtc3RhY2tcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJhYWluLWNvbXBhcmUtc3RhY2tcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc2VsZWN0ZWRQb2ludCk9XCJvbkdhdWdlU2VsZWN0SW5Db21wYXJlKCRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjb21wYXJlTWFuYWdlcl09XCJjb21wYXJlTWFuYWdlclwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2N1bXVsYXRpdmVdPVwidG9nZ2xlQ3VtdWxhdGl2ZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3JhYWluLWNvbXBhcmUtc3RhY2s+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIFRlY2huaWNhbCBkZXRhaWxzIChjb2xsYXBzaWJsZSBmb3IgY2xlYW5lciBVSSkgLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRldGFpbHMgY2xhc3M9XCJ0ZWNobmljYWwtZGV0YWlsc1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3VtbWFyeT5Db21wYXJlIERldGFpbHM8L3N1bW1hcnk+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkZXRhaWxzLWNvbnRlbnRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgW25nQ2xhc3NdPVwieyd3YXJuaW5nJzogcmVmcmVzaE1hbmFnZXIucmFpbkNvbXB1dGF0aW9uTWFwRG9uZURhdGU/LmdldFRpbWUoKSA+IGNvbXBhcmVNYW5hZ2VyLmN1cnJlbnRRdWFsaXR5RG9uZURhdGU/LmdldFRpbWUoKSArIDYwMDAwfVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZGV0YWlsLXJvd1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZGV0YWlsLWxhYmVsXCI+Q29tcHV0ZWQ6PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZGV0YWlsLXZhbHVlXCI+e3sgY29tcGFyZU1hbmFnZXIuY3VycmVudFF1YWxpdHlEb25lRGF0ZSB8IGRhdGU6J3l5eXktTU0tZGQgSEg6bW0nIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGV0YWlsLXJvd1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZGV0YWlsLWxhYmVsXCI+VmVyc2lvbjo8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJkZXRhaWwtdmFsdWVcIj57eyBjb21wYXJlTWFuYWdlci5jb21wYXJlVmVyc2lvbiB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRldGFpbC1yb3dcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImRldGFpbC1sYWJlbFwiPkxhdW5jaGVkIGJ5Ojwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImRldGFpbC12YWx1ZVwiPnt7IGNvbXBhcmVNYW5hZ2VyLmN1cnJlbnRRdWFsaXR5TGF1bmNoZWRCeSB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRldGFpbC1yb3dcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImRldGFpbC1sYWJlbFwiPlRpbWUgc3BlbnQ6PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZGV0YWlsLXZhbHVlXCI+e3sgY29tcGFyZU1hbmFnZXIuY3VycmVudFF1YWxpdHlUaW1lU3BlbnRJbk1zIH19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1zPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGV0YWlsLXJvd1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZGV0YWlsLWxhYmVsXCI+R2F1Z2VzOjwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImRldGFpbC12YWx1ZVwiPnt7IGNvbXBhcmVNYW5hZ2VyLmdhdWdlc0luQ29tcGFyZS5sZW5ndGggfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkZXRhaWwtcm93XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJkZXRhaWwtbGFiZWxcIj5Qb2ludHM6PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZGV0YWlsLXZhbHVlXCI+e3sgY29tcGFyZU1hbmFnZXIuZ2xvYmFsQ29tcGFyZVBvaW50cy5sZW5ndGggfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kZXRhaWxzPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvaW9uLWNvbD5cbiAgICAgICAgICAgICAgICA8L2lvbi1yb3c+XG4gICAgICAgICAgICAgICAgPGlvbi1yb3c+XG4gICAgICAgICAgICAgICAgICAgIDwhLS0gQm90dG9tIHByb2dyZXNzIGJhciAtLT5cbiAgICAgICAgICAgICAgICAgICAgPGlvbi1wcm9ncmVzcy1iYXIgKm5nSWY9XCJyZWZyZXNoSW5Qcm9ncmVzc1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtidWZmZXJdPVwiKGNvdW50c1BlcmlvZC5wcm9ncmVzcyAvICgodGltZWZyYW1lRGF0ZXM/Lmxlbmd0aCB8fCAxMCkgKzMpKSswLjAxXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3ZhbHVlXT1cImNvdW50c1BlcmlvZC5wcm9ncmVzcyAvICgodGltZWZyYW1lRGF0ZXM/Lmxlbmd0aCB8fCAxMCkgKzMpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sb3I9XCJwcmltYXJ5XCI+XG4gICAgICAgICAgICAgICAgICAgIDwvaW9uLXByb2dyZXNzLWJhcj5cbiAgICAgICAgICAgICAgICA8L2lvbi1yb3c+XG4gICAgICAgICAgICA8L2lvbi1ncmlkPlxuICAgICAgICA8L2lvbi1jYXJkLWNvbnRlbnQ+XG4gICAgPC9pb24tY2FyZD5cblxuICAgIDwhLS0gR2F1Z2UgdmFsdWVzIHNlY3Rpb24gLS0+XG4gICAgPGlvbi1jYXJkICpuZ0lmPVwiZ2F1Z2VTZWxlY3RlZFBvaW50cy5sZW5ndGggJiYgZ2F1Z2VTZWxlY3RlZFBvaW50c1swXS52YWx1ZXMubGVuZ3RoXCIgY2xhc3M9XCJnYXVnZS1jYXJkXCI+XG4gICAgICAgIDxpb24tY2FyZC1oZWFkZXI+XG4gICAgICAgICAgICA8aW9uLWNhcmQtdGl0bGU+XG4gICAgICAgICAgICAgICAgPGlvbi1pY29uIG5hbWU9XCJhbmFseXRpY3Mtb3V0bGluZVwiPjwvaW9uLWljb24+XG4gICAgICAgICAgICAgICAgU2VsZWN0ZWQgR2F1Z2UgRGF0YVxuICAgICAgICAgICAgPC9pb24tY2FyZC10aXRsZT5cbiAgICAgICAgPC9pb24tY2FyZC1oZWFkZXI+XG4gICAgICAgIDxpb24tY2FyZC1jb250ZW50PlxuICAgICAgICAgICAgPHJhYWluLWRhdGUtZm9jdXNcbiAgICAgICAgICAgICAgICAgICAgW2N1cnJlbnRIZWlnaHRdPVwiMzAwXCJcbiAgICAgICAgICAgICAgICAgICAgW2ZvY3VzRGF0ZV09XCJwZXJpb2RCZWdpblwiXG4gICAgICAgICAgICAgICAgICAgIFtmb2N1c1JhbmdlXT1cIkRhdGVSYW5nZS5EQVlcIlxuICAgICAgICAgICAgICAgICAgICBbcG9pbnRzXT1cImdhdWdlU2VsZWN0ZWRQb2ludHNcIlxuICAgICAgICAgICAgICAgICAgICBbd2l0aG91dEFsbF09XCJ0cnVlXCI+XG4gICAgICAgICAgICA8L3JhYWluLWRhdGUtZm9jdXM+XG4gICAgICAgIDwvaW9uLWNhcmQtY29udGVudD5cbiAgICA8L2lvbi1jYXJkPlxuXG48L2Rpdj5cbiJdfQ==
364
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmFhaW4tZGV0YWlscy5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvY29yZS9zaGFyZWQvcmFhaW4tZGV0YWlscy9yYWFpbi1kZXRhaWxzLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uL3NyYy9jb3JlL3NoYXJlZC9yYWFpbi1kZXRhaWxzL3JhYWluLWRldGFpbHMuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFDLFNBQVMsRUFBRSxLQUFLLEVBQXNDLE1BQU0sZUFBZSxDQUFDO0FBRXBGLE9BQU8sRUFBQyxxQkFBcUIsRUFBcUIsTUFBTSxhQUFhLENBQUM7QUFDdEUsT0FBTyxFQUFDLFNBQVMsRUFBRSxTQUFTLEVBQUUsbUJBQW1CLEVBQUMsTUFBTSxVQUFVLENBQUM7QUFDbkUsT0FBTyxFQUEyQixvQkFBb0IsRUFBaUIsTUFBTSxVQUFVLENBQUM7Ozs7Ozs7Ozs7QUFVeEYsTUFBTSxPQUFPLHFCQUFxQjtJQXdEOUIsWUFBc0IsT0FBZ0I7UUFBaEIsWUFBTyxHQUFQLE9BQU8sQ0FBUztRQUZuQixjQUFTLEdBQUcsU0FBUyxDQUFDO1FBMEl6QyxnRUFBZ0U7UUFDekQscUJBQWdCLEdBQUcsS0FBSyxFQUFFLFNBQWUsRUFBRSxVQUFxQixFQUFFLEVBQUU7WUFDdkUsT0FBTyxNQUFNLElBQUksQ0FBQyxTQUFTLENBQUMsU0FBUyxFQUFFLFVBQVUsQ0FBQyxDQUFDO1FBQ3ZELENBQUMsQ0FBQztJQTNJdUMsQ0FBQztJQUVsQyxNQUFNLENBQUMsYUFBYSxDQUFDLElBQW1CO1FBQzVDLElBQUksQ0FBQyxHQUFHLElBQUksSUFBSSxFQUFFLENBQUM7UUFDbkIsSUFBSSxJQUFJLEVBQUU7WUFDTixDQUFDLEdBQUcsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDbkIsTUFBTSxrQkFBa0IsR0FBRyxDQUFDLENBQUMsaUJBQWlCLEVBQUUsR0FBRyxLQUFLLENBQUM7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VENkbEMsODVlQTRRQTs0RkQ5UGEscUJBQXFCO2tCQUxqQyxTQUFTOytCQUNJLGVBQWU7OEZBTWxCLFdBQVc7c0JBRGpCLEtBQUs7Z0JBR0MsUUFBUTtzQkFEZCxLQUFLO2dCQUdDLGNBQWM7c0JBRHBCLEtBQUs7Z0JBR0MsY0FBYztzQkFEcEIsS0FBSztnQkFHQyxjQUFjO3NCQURwQixLQUFLO2dCQUdDLFlBQVk7c0JBRGxCLEtBQUs7Z0JBR0MsZ0JBQWdCO3NCQUR0QixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtDb21wb25lbnQsIElucHV0LCBPbkNoYW5nZXMsIE9uRGVzdHJveSwgU2ltcGxlQ2hhbmdlc30gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge1Byb2ZpbGVTZXJ2aWNlfSBmcm9tICcuLi9wcm9maWxlLnNlcnZpY2UnO1xuaW1wb3J0IHtDYXJ0ZXNpYW5NZWFzdXJlVmFsdWUsIFJhaW5Ob2RlLCBUZWFtTm9kZX0gZnJvbSAncmFhaW4tbW9kZWwnO1xuaW1wb3J0IHtEYXRlUmFuZ2UsIE1hcExhdExuZywgVGltZWZyYW1lQ29udGFpbmVyc30gZnJvbSAncmFhaW4tdWknO1xuaW1wb3J0IHtDb21wYXJlTWFuYWdlciwgRnJhbWVTZXQsIG1hcERhdGVSYW5nZVRvU3RyaW5nLCBSZWZyZXNoTWFuYWdlcn0gZnJvbSAnLi4vdG9vbHMnO1xuaW1wb3J0IHtYWVR5cGV9IGZyb20gJy4uL3h5dHlwZSc7XG5pbXBvcnQge1JhZGFyU2VydmljZX0gZnJvbSAnLi4vcmFkYXIuc2VydmljZSc7XG5pbXBvcnQge1N0b3JhZ2V9IGZyb20gJy4uL3N0b3JhZ2Uuc2VydmljZSc7XG5cbkBDb21wb25lbnQoe1xuICAgIHNlbGVjdG9yOiAncmFhaW4tZGV0YWlscycsXG4gICAgdGVtcGxhdGVVcmw6ICdyYWFpbi1kZXRhaWxzLmNvbXBvbmVudC5odG1sJyxcbiAgICBzdHlsZVVybHM6IFsncmFhaW4tZGV0YWlscy5jb21wb25lbnQuc2NzcyddLFxufSlcbmV4cG9ydCBjbGFzcyBSYWFpbkRldGFpbHNDb21wb25lbnQgaW1wbGVtZW50cyBPbkRlc3Ryb3ksIE9uQ2hhbmdlcyB7XG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgdG9nZ2xlQWRtaW46IGJvb2xlYW47XG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgcmFpbk5vZGU6IFJhaW5Ob2RlO1xuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIGNvbXBhcmVNYW5hZ2VyOiBDb21wYXJlTWFuYWdlcjtcbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyByZWZyZXNoTWFuYWdlcjogUmVmcmVzaE1hbmFnZXI7XG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgcHJvZmlsZVNlcnZpY2U6IFByb2ZpbGVTZXJ2aWNlO1xuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIHJhZGFyU2VydmljZTogUmFkYXJTZXJ2aWNlO1xuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIHRvZ2dsZUN1bXVsYXRpdmU6IGJvb2xlYW47XG5cbiAgICBwdWJsaWMgcGVyaW9kQmVnaW46IERhdGU7XG4gICAgcHVibGljIHBlcmlvZEVuZDogRGF0ZTtcblxuICAgIC8vIHB1YmxpYyBVSSB2YXJpYWJsZXNcbiAgICBwdWJsaWMgdGVhbU5vZGU6IFRlYW1Ob2RlO1xuICAgIHB1YmxpYyBwZXJpb2RCZWdpbkFzU3RyaW5nOiBzdHJpbmc7XG4gICAgcHVibGljIHBlcmlvZEVuZEFzU3RyaW5nOiBzdHJpbmc7XG4gICAgcHVibGljIHBlcmlvZER1cmF0aW9uQXNTdHJpbmc6IHN0cmluZztcbiAgICBwdWJsaWMgZGF0ZVNob3duOiBEYXRlO1xuICAgIHB1YmxpYyBjb29yZGluYXRlczogTWFwTGF0TG5nO1xuICAgIHB1YmxpYyBib3JkZXJzOiBNYXBMYXRMbmdbXTtcbiAgICBwdWJsaWMgdGltZWZyYW1lQ29udGFpbmVyczogVGltZWZyYW1lQ29udGFpbmVycztcbiAgICBwdWJsaWMgY3VycmVudFRpbWVmcmFtZVRhcmdldDogRnJhbWVTZXQ7XG4gICAgcHVibGljIHRpbWVmcmFtZURhdGVzOiBEYXRlW107XG4gICAgcHVibGljIGNvdW50UG9pbnRzOiB7XG4gICAgICAgIGxhYmVsOiBzdHJpbmc7XG4gICAgICAgIHN0eWxlOiBzdHJpbmc7XG4gICAgICAgIHZhbHVlczoge2RhdGU6IERhdGU7IHZhbHVlOiBudW1iZXJ9W107XG4gICAgfVtdO1xuICAgIHB1YmxpYyBjb3VudHNQZXJpb2Q6IHtcbiAgICAgICAgcGVyY2VudEltYWdlcz86IFhZVHlwZVtdO1xuICAgICAgICBxdWV1ZVJ1bm5pbmc/OiBudW1iZXI7XG4gICAgICAgIHByb2dyZXNzPzogbnVtYmVyO1xuICAgIH07XG5cbiAgICBwdWJsaWMgZ2F1Z2VTZWxlY3RlZFBvaW50czoge1xuICAgICAgICBsYWJlbDogc3RyaW5nO1xuICAgICAgICBzdHlsZTogc3RyaW5nO1xuICAgICAgICB2YWx1ZXM6IHtkYXRlOiBEYXRlOyB2YWx1ZTogbnVtYmVyfVtdO1xuICAgIH1bXTtcbiAgICBwdWJsaWMgdG9nZ2xlSGlzdG9yeTogYm9vbGVhbjtcbiAgICBwdWJsaWMgdG9nZ2xlTWFwOiBib29sZWFuO1xuICAgIHB1YmxpYyB0b2dnbGVDb21wYXJlOiBib29sZWFuO1xuICAgIHB1YmxpYyB0b2dnbGVHYXVnZU1lYXN1cmVzOiBib29sZWFuO1xuICAgIHB1YmxpYyB0b2dnbGVSZW1vdmVDb21wYXJlRHVwbGljYXRlOiBib29sZWFuO1xuICAgIHB1YmxpYyByZWZyZXNoSW5Qcm9ncmVzczogYm9vbGVhbjtcbiAgICBwdWJsaWMgc3VtRGV0YWlsczogc3RyaW5nO1xuICAgIHB1YmxpYyBpc0FkbWluOiBib29sZWFuO1xuICAgIHByb3RlY3RlZCByZWFkb25seSBEYXRlUmFuZ2UgPSBEYXRlUmFuZ2U7XG5cbiAgICBjb25zdHJ1Y3Rvcihwcm90ZWN0ZWQgc3RvcmFnZTogU3RvcmFnZSkge31cblxuICAgIHByaXZhdGUgc3RhdGljIFBlcmlvZERpc3BsYXkoZGF0ZTogRGF0ZSB8IHN0cmluZykge1xuICAgICAgICBsZXQgZCA9IG5ldyBEYXRlKCk7XG4gICAgICAgIGlmIChkYXRlKSB7XG4gICAgICAgICAgICBkID0gbmV3IERhdGUoZGF0ZSk7XG4gICAgICAgICAgICBjb25zdCB1c2VyVGltZXpvbmVPZmZzZXQgPSBkLmdldFRpbWV6b25lT2Zmc2V0KCkgKiA2MDAwMDtcbiAgICAgICAgICAgIGQgPSBuZXcgRGF0ZShkLmdldFRpbWUoKSAtIHVzZXJUaW1lem9uZU9mZnNldCk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZXhhbXBsZUZvcm1hdHRlZERhdGUgPSAnMjAxNy0wNi0wMVQwODozMCc7XG4gICAgICAgIHJldHVybiBkLnRvSVNPU3RyaW5nKCkuc3Vic3RyaW5nKDAsIGV4YW1wbGVGb3JtYXR0ZWREYXRlLmxlbmd0aCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzdGF0aWMgRGF0ZVVUQyhkYXRlOiBzdHJpbmcpIHtcbiAgICAgICAgY29uc3QgaGFzSVNPRm9ybWF0ID0gZGF0ZS5tYXRjaCgvXlxcZHs0fS1cXGR7Mn0tXFxkezJ9VFxcZHsyfTpcXGR7Mn06XFxkezJ9XFwuXFxkezN9WiQvKTtcbiAgICAgICAgbGV0IGQgPSBuZXcgRGF0ZShkYXRlKTtcbiAgICAgICAgaWYgKCFoYXNJU09Gb3JtYXQpIHtcbiAgICAgICAgICAgIGNvbnN0IHVzZXJUaW1lem9uZU9mZnNldCA9IGQuZ2V0VGltZXpvbmVPZmZzZXQoKSAqIDYwMDAwO1xuICAgICAgICAgICAgZCA9IG5ldyBEYXRlKGQuZ2V0VGltZSgpIC0gdXNlclRpbWV6b25lT2Zmc2V0KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZDtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgZmV0Y2hEYXRhKGZvY3VzRGF0ZTogRGF0ZSwgZm9jdXNSYW5nZTogRGF0ZVJhbmdlKSB7XG4gICAgICAgIGNvbnN0IHZhbHVlcyA9IFtdO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IDEwOyBpKyspIHtcbiAgICAgICAgICAgIHZhbHVlcy5wdXNoKHtkYXRlOiBuZXcgRGF0ZSgyMDIwICsgaSwgMCksIHZhbHVlOiAxMH0pO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGZha2VEYXRhID0gW1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGxhYmVsOiAnJSBSYWlueScsXG4gICAgICAgICAgICAgICAgc3R5bGU6ICdiYXInLFxuICAgICAgICAgICAgICAgIHZhbHVlcyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgbGFiZWw6ICclIEltYWdlcycsXG4gICAgICAgICAgICAgICAgc3R5bGU6ICdiYXInLFxuICAgICAgICAgICAgICAgIHZhbHVlcyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAvLyAge1xuICAgICAgICAgICAgLy8gICAgICBsYWJlbDogJyUgUXVhbGl0eScsXG4gICAgICAgICAgICAvLyAgICAgIHN0eWxlOiAnbGluZScsXG4gICAgICAgICAgICAvLyAgICAgIHZhbHVlcyxcbiAgICAgICAgICAgIC8vICB9LFxuICAgICAgICBdO1xuXG4gICAgICAgIGNvbnN0IHJhbmdlID0gbWFwRGF0ZVJhbmdlVG9TdHJpbmcoZm9jdXNSYW5nZSk7XG4gICAgICAgIGxldCBkYXRhID0gZmFrZURhdGE7XG4gICAgICAgIGlmICghdGhpcy5yYWluTm9kZSkge1xuICAgICAgICAgICAgcmV0dXJuIGRhdGE7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZm9jdXNSYW5nZSA9PT0gRGF0ZVJhbmdlLkNFTlRVUlkpIHtcbiAgICAgICAgICAgIC8vIGZha2VcbiAgICAgICAgfSBlbHNlIGlmIChmb2N1c1JhbmdlID09PSBEYXRlUmFuZ2UuSE9VUikge1xuICAgICAgICAgICAgY29uc3QgaG91ckNvdW50cyA9IGF3YWl0IHRoaXMucHJvZmlsZVNlcnZpY2UuZ2V0Q291bnRzSG91cih0aGlzLnJhaW5Ob2RlLmlkLCB7XG4gICAgICAgICAgICAgICAgcGVyaW9kQmVnaW46IGZvY3VzRGF0ZSxcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBkYXRhID0gW1xuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgbGFiZWw6ICdSYWlueSBDb3VudCcsXG4gICAgICAgICAgICAgICAgICAgIHN0eWxlOiAnbGluZScsXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlczogaG91ckNvdW50cy5yYWlueUNvdW50Lm1hcCgoYykgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRlOiBSYWFpbkRldGFpbHNDb21wb25lbnQuRGF0ZVVUQyhjLm5hbWUpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiBNYXRoLm1pbigxMDAsIGMueCksXG4gICAgICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgbGFiZWw6ICclIEltYWdlcycsXG4gICAgICAgICAgICAgICAgICAgIHN0eWxlOiAnYmFyJyxcbiAgICAgICAgICAgICAgICAgICAgdmFsdWVzOiBob3VyQ291bnRzLnBlcmNlbnRJbWFnZXMubWFwKChjKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGU6IFJhYWluRGV0YWlsc0NvbXBvbmVudC5EYXRlVVRDKGMubmFtZSksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IE1hdGgubWluKDEwMCwgYy54KSxcbiAgICAgICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBsYWJlbDogJ1JhaW55IFN1bScsXG4gICAgICAgICAgICAgICAgICAgIHN0eWxlOiAnbGluZScsXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlczogaG91ckNvdW50cy5yYWlueVN1bS5tYXAoKGMpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0ZTogUmFhaW5EZXRhaWxzQ29tcG9uZW50LkRhdGVVVEMoYy5uYW1lKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogTWF0aC5taW4oMTAwLCBjLngpLFxuICAgICAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIF07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZygnZmV0Y2hEYXRhIFRPRE86JywgZm9jdXNEYXRlLnRvSVNPU3RyaW5nKCksIHJhbmdlKTtcbiAgICAgICAgICAgIGNvbnN0IGNvdW50cyA9IGF3YWl0IHRoaXMucHJvZmlsZVNlcnZpY2UuZ2V0Q291bnRzKHRoaXMucmFpbk5vZGUuaWQsIHtcbiAgICAgICAgICAgICAgICByYW5nZSxcbiAgICAgICAgICAgICAgICBwZXJpb2RCZWdpbjogZm9jdXNEYXRlLFxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIGRhdGEgPSBbXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBsYWJlbDogJyUgUmFpbnknLFxuICAgICAgICAgICAgICAgICAgICBzdHlsZTogJ2JhcicsXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlczogY291bnRzLnBlcmNlbnRSYWlueS5tYXAoKGMpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0ZTogUmFhaW5EZXRhaWxzQ29tcG9uZW50LkRhdGVVVEMoYy5uYW1lKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogTWF0aC5taW4oMTAwLCBjLngpLFxuICAgICAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIGxhYmVsOiAnJSBJbWFnZXMnLFxuICAgICAgICAgICAgICAgICAgICBzdHlsZTogJ2JhcicsXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlczogY291bnRzLnBlcmNlbnRJbWFnZXMubWFwKChjKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGU6IFJhYWluRGV0YWlsc0NvbXBvbmVudC5EYXRlVVRDKGMubmFtZSksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IE1hdGgubWluKDEwMCwgYy54KSxcbiAgICAgICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgLy8gIHtcbiAgICAgICAgICAgICAgICAvLyAgICAgIGxhYmVsOiAnJSBRdWFsaXR5JyxcbiAgICAgICAgICAgICAgICAvLyAgICAgIHN0eWxlOiAnbGluZScsXG4gICAgICAgICAgICAgICAgLy8gICAgICB2YWx1ZXM6IGNvdW50cy5wZXJjZW50US5tYXAoKGMpID0+IHtcbiAgICAgICAgICAgICAgICAvLyAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIC8vICAgICAgICAgICAgICBkYXRlOiBSYWFpbkRldGFpbHNDb21wb25lbnQuRGF0ZVVUQyhjLm5hbWUpLFxuICAgICAgICAgICAgICAgIC8vICAgICAgICAgICAgICB2YWx1ZTogTWF0aC5taW4oMTAwLCBjLngpLFxuICAgICAgICAgICAgICAgIC8vICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgLy8gICAgICB9KSxcbiAgICAgICAgICAgICAgICAvLyAgfSxcbiAgICAgICAgICAgIF07XG4gICAgICAgIH1cblxuICAgICAgICBjb25zb2xlLmxvZyhgZmV0Y2hEYXRhIERPTkUgJHtyYW5nZX1gLCBkYXRhKTtcbiAgICAgICAgcmV0dXJuIGRhdGE7XG4gICAgfVxuXG4gICAgLy8gV3JhcHBlciBmdW5jdGlvbiB0aGF0IHByZXNlcnZlcyB0aGUgYXN5bmMgbmF0dXJlIG9mIGZldGNoRGF0YVxuICAgIHB1YmxpYyBmZXRjaERhdGFXcmFwcGVyID0gYXN5bmMgKGZvY3VzRGF0ZTogRGF0ZSwgZm9jdXNSYW5nZTogRGF0ZVJhbmdlKSA9PiB7XG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLmZldGNoRGF0YShmb2N1c0RhdGUsIGZvY3VzUmFuZ2UpO1xuICAgIH07XG5cbiAgICBwdWJsaWMgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xuICAgICAgICB0aGlzLmNoYW5nZShjaGFuZ2VzKS50aGVuKChpZ25vcmVkKSA9PiB7fSk7XG4gICAgfVxuXG4gICAgbmdPbkRlc3Ryb3koKSB7XG4gICAgICAgIHRoaXMuY2xlYW5BbGwoKTtcbiAgICB9XG5cbiAgICBhc3luYyBvbkVuYWJsZUNvdW50SGlzdG9yeVRhYihyYWluOiBSYWluTm9kZSkge1xuICAgICAgICBpZiAoIXRoaXMudG9nZ2xlSGlzdG9yeSkge1xuICAgICAgICAgICAgdGhpcy5jb3VudFBvaW50cyA9IFtdO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgYXN5bmMgb25QZXJpb2RCZWdpbkNoYW5nZShldmVudDogYW55KSB7XG4gICAgICAgIGNvbnN0IG5ld1ZhbHVlID0gZXZlbnQ/LnRhcmdldD8udmFsdWUgPz8gdGhpcy5wZXJpb2RCZWdpbkFzU3RyaW5nO1xuICAgICAgICB0aGlzLnBlcmlvZEJlZ2luID0gbmV3IERhdGUobmV3VmFsdWUpO1xuICAgICAgICB0aGlzLnBlcmlvZEJlZ2luQXNTdHJpbmcgPSBuZXdWYWx1ZTtcbiAgICAgICAgdGhpcy5zdG9yYWdlLnNldCgncmFhaW4tcGVyaW9kQmVnaW4nLCB0aGlzLnBlcmlvZEJlZ2luKTtcblxuICAgICAgICBhd2FpdCB0aGlzLm9uUGVyaW9kRHVyYXRpb25DaGFuZ2UoZXZlbnQpO1xuICAgIH1cblxuICAgIGFzeW5jIG9uUGVyaW9kRHVyYXRpb25DaGFuZ2UoX2V2ZW50OiBFdmVudCkge1xuICAgICAgICBjb25zdCBkdXJhdGlvbkluSG91ciA9IHBhcnNlRmxvYXQodGhpcy5wZXJpb2REdXJhdGlvbkFzU3RyaW5nKTtcbiAgICAgICAgdGhpcy5wZXJpb2RFbmQgPSBuZXcgRGF0ZSh0aGlzLnBlcmlvZEJlZ2luLmdldFRpbWUoKSArIGR1cmF0aW9uSW5Ib3VyICogKDYwICogNjAwMDApKTtcbiAgICAgICAgdGhpcy5wZXJpb2RFbmRBc1N0cmluZyA9IHRoaXMucGVyaW9kRW5kLnRvSVNPU3RyaW5nKCk7XG4gICAgICAgIHRoaXMuc3RvcmFnZS5zZXQoJ3JhYWluLXBlcmlvZEVuZCcsIHRoaXMucGVyaW9kRW5kKTtcbiAgICAgICAgdGhpcy5yZWZyZXNoTWFuYWdlci5wZXJpb2QgPSB7YmVnaW46IHRoaXMucGVyaW9kQmVnaW4sIGVuZDogdGhpcy5wZXJpb2RFbmR9O1xuICAgIH1cblxuICAgIGFzeW5jIG9uRGF0ZUNoYW5nZUluQ291bnQoZGF0ZUNoYW5nZWQ6IERhdGUpIHtcbiAgICAgICAgY29uc29sZS5sb2coJ29uRGF0ZUNoYW5nZUluQ291bnQnLCBkYXRlQ2hhbmdlZCk7XG4gICAgICAgIHRoaXMucGVyaW9kQmVnaW5Bc1N0cmluZyA9XG4gICAgICAgICAgICBkYXRlQ2hhbmdlZC50b0lTT1N0cmluZygpLnN1YnN0cmluZygwLCAxMSkgK1xuICAgICAgICAgICAgZGF0ZUNoYW5nZWQudG9Mb2NhbGVUaW1lU3RyaW5nKCkuc3Vic3RyaW5nKDAsIDUpO1xuICAgICAgICB0aGlzLnBlcmlvZER1cmF0aW9uQXNTdHJpbmcgPSAnMSc7XG4gICAgICAgIGF3YWl0IHRoaXMub25QZXJpb2RCZWdpbkNoYW5nZShudWxsKTtcbiAgICAgICAgdGhpcy5yZWZyZXNoTWFuYWdlci5yZWZyZXNoKGZhbHNlLCB0cnVlKTtcbiAgICB9XG5cbiAgICBhc3luYyBvbkRhdGVDaGFuZ2VJbk1hcChkYXRlU2hvd246IERhdGUpIHtcbiAgICAgICAgLy8gY29uc29sZS5sb2coJ29uRGF0ZUNoYW5nZUluTWFwJywgZGF0ZVNob3duKTtcbiAgICAgICAgdGhpcy5kYXRlU2hvd24gPSBkYXRlU2hvd247XG4gICAgICAgIGNvbnN0IGN1bXVsYXRpdmVIb3VyczogbnVtYmVyID0gIXRoaXMudG9nZ2xlQ3VtdWxhdGl2ZVxuICAgICAgICAgICAgPyAwXG4gICAgICAgICAgICA6IHBhcnNlRmxvYXQodGhpcy5wZXJpb2REdXJhdGlvbkFzU3RyaW5nKTtcbiAgICAgICAgYXdhaXQgdGhpcy5yZWZyZXNoTWFuYWdlci5mZXRjaCh0aGlzLmRhdGVTaG93biwgdGhpcy50b2dnbGVHYXVnZU1lYXN1cmVzLCBjdW11bGF0aXZlSG91cnMpO1xuICAgICAgICB0aGlzLmN1cnJlbnRUaW1lZnJhbWVUYXJnZXQgPSB0aGlzLnJlZnJlc2hNYW5hZ2VyLmdldFRpbWVsaW5lU2VsZWN0ZWRGcmFtZVNldCgpO1xuICAgICAgICBhd2FpdCB0aGlzLnJlZnJlc2hNYW5hZ2VyLnNldFJlcG9ydFBlcmlvZCh0aGlzLmRhdGVTaG93bik7XG4gICAgfVxuXG4gICAgYXN5bmMgb25TdW1DaGFuZ2VJbk1hcChzdW06IHN0cmluZykge1xuICAgICAgICB0aGlzLnN1bURldGFpbHMgPSBzdW07XG4gICAgfVxuXG4gICAgYXN5bmMgb25HYXVnZVNlbGVjdEluTWFwKG1hcExhdExuZzogTWFwTGF0TG5nKSB7XG4gICAgICAgIGNvbnN0IGdhdWdlc0ZpbHRlcmVkID0gdGhpcy5jb21wYXJlTWFuYWdlci5nYXVnZXNJbk1hcC5maWx0ZXIoXG4gICAgICAgICAgICAoZykgPT4gZy5sYXQgPT09IG1hcExhdExuZy5sYXQgJiYgZy5sbmcgPT09IG1hcExhdExuZy5sbmdcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKGdhdWdlc0ZpbHRlcmVkLmxlbmd0aCAhPT0gMSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGdhdWdlU2VsZWN0ZWQgPSBnYXVnZXNGaWx0ZXJlZFswXTtcblxuICAgICAgICBhd2FpdCB0aGlzLnJlZnJlc2hHYXVnZVZhbHVlcyh7aWQ6IGdhdWdlU2VsZWN0ZWQuaWQsIG5hbWU6IGdhdWdlU2VsZWN0ZWQubmFtZX0pO1xuXG4gICAgICAgIGF3YWl0IHRoaXMuY29tcGFyZU1hbmFnZXIuc2VsZWN0R2F1Z2UoZ2F1Z2VTZWxlY3RlZC5pZCwgMCk7XG4gICAgfVxuXG4gICAgYXN5bmMgcmVmcmVzaEdhdWdlVmFsdWVzKGdhdWdlU2VsZWN0ZWQ6IHtpZDogc3RyaW5nOyBuYW1lOiBzdHJpbmd9KSB7XG4gICAgICAgIGNvbnN0IGRheUJlZ2luID0gbmV3IERhdGUodGhpcy5wZXJpb2RCZWdpbi50b0lTT1N0cmluZygpLnN1YnN0cmluZygwLCAxMCkpO1xuICAgICAgICBjb25zdCBkYXlFbmQgPSBuZXcgRGF0ZShkYXlCZWdpbi5nZXRUaW1lKCkgKyAyNCAqIDYwICogNjAgKiAxMDAwIC0gMSk7XG4gICAgICAgIGNvbnN0IGdhdWdlTWVhc3VyZXMgPSBhd2FpdCB0aGlzLnByb2ZpbGVTZXJ2aWNlLmdldEdhdWdlTWVhc3VyZXMoXG4gICAgICAgICAgICBnYXVnZVNlbGVjdGVkLmlkLFxuICAgICAgICAgICAgZGF5QmVnaW4sXG4gICAgICAgICAgICBkYXlFbmRcbiAgICAgICAgKTtcbiAgICAgICAgY29uc3QgZ2F1Z2VWYWx1ZXM6IHtkYXRlOiBEYXRlOyB2YWx1ZTogbnVtYmVyfVtdID0gZ2F1Z2VNZWFzdXJlcy5tYXAoKGdtKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBjYXJ0ZXNpYW5NZWFzdXJlVmFsdWUgPSBuZXcgQ2FydGVzaWFuTWVhc3VyZVZhbHVlKGdtLnZhbHVlc1swXSBhcyBhbnkpO1xuICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBjYXJ0ZXNpYW5NZWFzdXJlVmFsdWUuZ2V0Q2FydGVzaWFuVmFsdWVzKClbMF0udmFsdWU7XG4gICAgICAgICAgICByZXR1cm4ge2RhdGU6IGdtLmRhdGUsIHZhbHVlfTtcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuZ2F1Z2VTZWxlY3RlZFBvaW50cyA9IFtcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBsYWJlbDogZ2F1Z2VTZWxlY3RlZC5uYW1lLFxuICAgICAgICAgICAgICAgIHN0eWxlOiAnYmFyJyxcbiAgICAgICAgICAgICAgICB2YWx1ZXM6IGdhdWdlVmFsdWVzLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgXTtcbiAgICAgICAgY29uc29sZS5sb2coJ3RoaXMuZ2F1Z2VTZWxlY3RlZFBvaW50czonLCB0aGlzLmdhdWdlU2VsZWN0ZWRQb2ludHMpO1xuICAgIH1cblxuICAgIGFzeW5jIG9uR2F1Z2VTZWxlY3RJbkNvbXBhcmUoZToge3BvaW50OiBYWVR5cGU7IGNvbXBhcmVJbmRleDogbnVtYmVyfSkge1xuICAgICAgICBhd2FpdCB0aGlzLnJlZnJlc2hHYXVnZVZhbHVlcyh7aWQ6IGUucG9pbnQuaWQsIG5hbWU6IGUucG9pbnQubmFtZX0pO1xuXG4gICAgICAgIGF3YWl0IHRoaXMuY29tcGFyZU1hbmFnZXIuc2VsZWN0R2F1Z2UoZS5wb2ludC5pZCwgZS5jb21wYXJlSW5kZXgpO1xuICAgIH1cblxuICAgIGFzeW5jIG9uVG9nZ2xlTWFwKCRldmVudDogRXZlbnQpIHtcbiAgICAgICAgLy8gaWYgKHRoaXMudG9nZ2xlTWFwKSB7XG4gICAgICAgIC8vICAgIGF3YWl0IHRoaXMucmVmcmVzaE1hcCgpO1xuICAgICAgICAvLyB9XG4gICAgfVxuXG4gICAgb25DaGFuZ2VEZXRlY3Rpb25UZXN0KHJhaW5Ob2RlOiBSYWluTm9kZSkge1xuICAgICAgICAvLyBUT0RPIGNvbnNvbGUubG9nKFRFU1RfREVURUNUSU9OKyssICdvbkNoYW5nZURldGVjdGlvblRlc3QnKTtcbiAgICAgICAgcmV0dXJuICcnO1xuICAgIH1cblxuICAgIGFzeW5jIHJlZnJlc2hNYXAoKSB7XG4gICAgICAgIHRoaXMuZ2F1Z2VTZWxlY3RlZFBvaW50cyA9IFtdO1xuICAgICAgICAvLyB0aGlzLnF1YWxpdHlDb25mLnRydXN0ZnVsR2F1Z2VJZHMgPSB0aGlzLnF1YWxpdHlDb25mLnRydXN0ZnVsR2F1Z2VJZHM/Lmxlbmd0aCA+IDAgP1xuICAgICAgICAvLyAgdGhpcy5xdWFsaXR5Q29uZi50cnVzdGZ1bEdhdWdlSWRzIDogdGhpcy5nYXVnZXNUb0ZpbHRlci5maWx0ZXIoZyA9PiBnLmlzSW4pLm1hcChnID0+IGcuaWQpO1xuICAgICAgICB0aGlzLmJvcmRlcnMgPSBbXG4gICAgICAgICAgICAvLyAgbmV3IE1hcExhdExuZyhyYWluTm9kZS5sYXRpdHVkZSAtIDI1MCAqIDAuMDA4LCByYWluTm9kZS5sb25naXR1ZGUpLFxuICAgICAgICAgICAgLy8gIG5ldyBNYXBMYXRMbmcocmFpbk5vZGUubGF0aXR1ZGUsIHJhaW5Ob2RlLmxvbmdpdHVkZSAtIDI1MCAqIDAuMDEzKSxcbiAgICAgICAgICAgIC8vICBuZXcgTWFwTGF0TG5nKHJhaW5Ob2RlLmxhdGl0dWRlLCByYWluTm9kZS5sb25naXR1ZGUgKyAyNTAgKiAwLjAxMyksXG4gICAgICAgICAgICAvLyAgbmV3IE1hcExhdExuZyhyYWluTm9kZS5sYXRpdHVkZSArIDI1MCAqIDAuMDA4LCByYWluTm9kZS5sb25naXR1ZGUpLFxuICAgICAgICBdO1xuXG4gICAgICAgIHRoaXMuY29tcGFyZU1hbmFnZXIuY2xlYW5BbGwoKTtcbiAgICAgICAgYXdhaXQgdGhpcy5jb21wYXJlTWFuYWdlci5zZXRHYXVnZXNJbk1hcCgpO1xuICAgICAgICB0aGlzLnJlZnJlc2hNYW5hZ2VyLnJlZnJlc2goZmFsc2UsIHRoaXMudG9nZ2xlQWRtaW4pO1xuICAgIH1cblxuICAgIGFzeW5jIGxhdW5jaENvbXB1dGF0aW9uKCkge1xuICAgICAgICBhd2FpdCB0aGlzLnByb2ZpbGVTZXJ2aWNlLmxhdW5jaFJhaW5Db21wdXRhdGlvbih0aGlzLnJhaW5Ob2RlLmlkLCB0aGlzLmRhdGVTaG93bik7XG4gICAgfVxuXG4gICAgYXN5bmMgc2V0UGVyaW9kT2ZOb3coKSB7XG4gICAgICAgIC8vIHNob3VsZCBsb29rIGxpa2U6IFwiMjAyNC0wOC0yNlQxMjoxM1wiXG4gICAgICAgIGNvbnN0IGxhc3QzMG1uID0gbmV3IERhdGUoKTtcbiAgICAgICAgbGFzdDMwbW4uc2V0TWludXRlcyhsYXN0MzBtbi5nZXRNaW51dGVzKCkgLSAzMCk7XG4gICAgICAgIHRoaXMucGVyaW9kQmVnaW5Bc1N0cmluZyA9XG4gICAgICAgICAgICBsYXN0MzBtbi50b0lTT1N0cmluZygpLnN1YnN0cmluZygwLCAxMSkgKyBsYXN0MzBtbi50b0xvY2FsZVRpbWVTdHJpbmcoKS5zdWJzdHJpbmcoMCwgNSk7XG4gICAgICAgIHRoaXMucGVyaW9kRHVyYXRpb25Bc1N0cmluZyA9ICcxJztcbiAgICAgICAgYXdhaXQgdGhpcy5vblBlcmlvZEJlZ2luQ2hhbmdlKG51bGwpO1xuICAgICAgICB0aGlzLnJlZnJlc2hNYW5hZ2VyLnJlZnJlc2goZmFsc2UsIHRydWUpO1xuICAgIH1cblxuICAgIGdldFBlcmNlbnRPZkltYWdlcygpIHtcbiAgICAgICAgaWYgKCF0aGlzLmNvdW50c1BlcmlvZC5wZXJjZW50SW1hZ2VzPy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHJldHVybiAwO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZHVyaW5nUGVyaW9kID0gdGhpcy5jb3VudHNQZXJpb2QucGVyY2VudEltYWdlcy5maWx0ZXIoXG4gICAgICAgICAgICAoYSkgPT5cbiAgICAgICAgICAgICAgICB0aGlzLnBlcmlvZEJlZ2luLmdldFRpbWUoKSA8PSBuZXcgRGF0ZShhLm5hbWUpLmdldFRpbWUoKSAmJlxuICAgICAgICAgICAgICAgIG5ldyBEYXRlKGEubmFtZSkuZ2V0VGltZSgpIDw9IHRoaXMucGVyaW9kRW5kLmdldFRpbWUoKVxuICAgICAgICApO1xuICAgICAgICBjb25zdCBzdW1tZWQgPSBkdXJpbmdQZXJpb2QucmVkdWNlKChhLCBiKSA9PiBhICsgKGIueCA/PyAwKSwgMCk7XG4gICAgICAgIHJldHVybiBNYXRoLnJvdW5kKHN1bW1lZCAvIGR1cmluZ1BlcmlvZC5sZW5ndGgpO1xuICAgIH1cblxuICAgIGdldFBlcmNlbnRPZkNvbXB1dGF0aW9ucygpIHtcbiAgICAgICAgY29uc3QgdGltZWxpbmUgPSB0aGlzLnJlZnJlc2hNYW5hZ2VyLmdldFRpbWVsaW5lRnJhbWVTZXQoKTtcbiAgICAgICAgaWYgKCF0aW1lbGluZT8ubGVuZ3RoKSB7XG4gICAgICAgICAgICByZXR1cm4gMDtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHRpbWVsaW5lV2l0aENvbXB1dGF0aW9uID0gdGltZWxpbmUuZmlsdGVyKChhKSA9PiAhIWEucmFpbkNvbXB1dGF0aW9uSWQpO1xuICAgICAgICBjb25zdCByYXRpbyA9IHRpbWVsaW5lV2l0aENvbXB1dGF0aW9uLmxlbmd0aCAvIHRpbWVsaW5lLmxlbmd0aDtcbiAgICAgICAgcmV0dXJuIE1hdGgucm91bmQocmF0aW8gKiAxMDApO1xuICAgIH1cblxuICAgIHByaXZhdGUgY2xlYW5BbGwoKSB7XG4gICAgICAgIHRoaXMuYm9yZGVycyA9IFtdO1xuXG4gICAgICAgIHRoaXMuaXNBZG1pbiA9IGZhbHNlO1xuICAgICAgICB0aGlzLnRpbWVmcmFtZUNvbnRhaW5lcnMgPSBuZXcgVGltZWZyYW1lQ29udGFpbmVycyhbXSk7XG4gICAgICAgIHRoaXMuY3VycmVudFRpbWVmcmFtZVRhcmdldCA9IG51bGw7XG4gICAgICAgIHRoaXMudGltZWZyYW1lRGF0ZXMgPSBbXTtcbiAgICAgICAgdGhpcy5jb3VudFBvaW50cyA9IFtdO1xuICAgICAgICB0aGlzLmNvdW50c1BlcmlvZCA9IHtwcm9ncmVzczogMCwgcXVldWVSdW5uaW5nOiAwLCBwZXJjZW50SW1hZ2VzOiBbXX07XG4gICAgICAgIHRoaXMuZ2F1Z2VTZWxlY3RlZFBvaW50cyA9IFtdO1xuXG4gICAgICAgIHRoaXMudG9nZ2xlSGlzdG9yeSA9IGZhbHNlO1xuICAgICAgICB0aGlzLnRvZ2dsZU1hcCA9IHRydWU7XG4gICAgICAgIHRoaXMudG9nZ2xlQ29tcGFyZSA9IGZhbHNlO1xuICAgICAgICB0aGlzLnRvZ2dsZUdhdWdlTWVhc3VyZXMgPSBmYWxzZTtcbiAgICAgICAgdGhpcy50b2dnbGVSZW1vdmVDb21wYXJlRHVwbGljYXRlID0gdHJ1ZTtcblxuICAgICAgICB0aGlzLnBlcmlvZEJlZ2luID0gbmV3IERhdGUodGhpcy5zdG9yYWdlLmdldCgncmFhaW4tcGVyaW9kQmVnaW4nKSk7XG4gICAgICAgIHRoaXMucGVyaW9kRW5kID0gbmV3IERhdGUodGhpcy5zdG9yYWdlLmdldCgncmFhaW4tcGVyaW9kRW5kJykpO1xuICAgICAgICB0aGlzLnBlcmlvZEJlZ2luQXNTdHJpbmcgPSBSYWFpbkRldGFpbHNDb21wb25lbnQuUGVyaW9kRGlzcGxheSh0aGlzLnBlcmlvZEJlZ2luKTtcbiAgICAgICAgdGhpcy5wZXJpb2RFbmRBc1N0cmluZyA9IFJhYWluRGV0YWlsc0NvbXBvbmVudC5QZXJpb2REaXNwbGF5KHRoaXMucGVyaW9kRW5kKTtcbiAgICAgICAgdGhpcy5wZXJpb2REdXJhdGlvbkFzU3RyaW5nID1cbiAgICAgICAgICAgICcnICsgKHRoaXMucGVyaW9kRW5kLmdldFRpbWUoKSAtIHRoaXMucGVyaW9kQmVnaW4uZ2V0VGltZSgpKSAvICg2MCAqIDYwMDAwKTtcblxuICAgICAgICB0aGlzLmRhdGVTaG93biA9IHRoaXMucGVyaW9kQmVnaW47XG5cbiAgICAgICAgdGhpcy5yZWZyZXNoSW5Qcm9ncmVzcyA9IGZhbHNlO1xuXG4gICAgICAgIHRoaXMuY29tcGFyZU1hbmFnZXI/LmNsZWFuQWxsKCk7XG4gICAgICAgIHRoaXMucmVmcmVzaE1hbmFnZXI/LmNsZWFuQWxsKCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBpbml0KCkge1xuICAgICAgICB0aGlzLmNsZWFuQWxsKCk7XG4gICAgICAgIGF3YWl0IHRoaXMuaW5pdFJhaW4oKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIGluaXRSYWluKCkge1xuICAgICAgICBpZiAoIXRoaXMucmFpbk5vZGUpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuaXNBZG1pbiA9IHRoaXMucHJvZmlsZVNlcnZpY2UuaXNBZG1pbigpO1xuXG4gICAgICAgIHRoaXMucmVmcmVzaE1hbmFnZXIucmFpbk5vZGUgPSB0aGlzLnJhaW5Ob2RlO1xuICAgICAgICB0aGlzLmNvbXBhcmVNYW5hZ2VyLnJhaW5Ob2RlID0gdGhpcy5yYWluTm9kZTtcblxuICAgICAgICB0aGlzLnJlZnJlc2hNYW5hZ2VyLnNldE1ldGhvZHMoXG4gICAgICAgICAgICB0aGlzLm9uUmVmcmVzaEluUHJvZ3Jlc3MuYmluZCh0aGlzKSxcbiAgICAgICAgICAgIHRoaXMub25SZWZyZXNoRG9uZS5iaW5kKHRoaXMpLFxuICAgICAgICAgICAgdGhpcy5vbkZldGNoRG9uZS5iaW5kKHRoaXMpXG4gICAgICAgICk7XG5cbiAgICAgICAgY29uc3QgY2VudGVyID0gdGhpcy5yYWluTm9kZS5nZXRDZW50ZXIoKTtcbiAgICAgICAgdGhpcy5jb29yZGluYXRlcyA9IG5ldyBNYXBMYXRMbmcoY2VudGVyLmxhdCwgY2VudGVyLmxuZyk7XG4gICAgICAgIHRoaXMudGVhbU5vZGUgPSBhd2FpdCB0aGlzLnByb2ZpbGVTZXJ2aWNlLmdldFRlYW0odGhpcy5yYWluTm9kZS5nZXRMaW5rKCd0ZWFtJykuZ2V0SWQoKSk7XG5cbiAgICAgICAgaWYgKHRoaXMucGVyaW9kQmVnaW4gJiYgdGhpcy5wZXJpb2RFbmQpIHtcbiAgICAgICAgICAgIHRoaXMucmVmcmVzaE1hbmFnZXIucGVyaW9kID0ge2JlZ2luOiB0aGlzLnBlcmlvZEJlZ2luLCBlbmQ6IHRoaXMucGVyaW9kRW5kfTtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMucmVmcmVzaE1hbmFnZXIucmVmcmVzaChmYWxzZSwgdGhpcy50b2dnbGVBZG1pbik7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIG9uUmVmcmVzaEluUHJvZ3Jlc3MoXG4gICAgICAgIGNvdW50UGVyaW9kczoge1xuICAgICAgICAgICAgcGVyY2VudEltYWdlcz86IFhZVHlwZVtdO1xuICAgICAgICAgICAgcXVldWVSdW5uaW5nPzogbnVtYmVyO1xuICAgICAgICAgICAgcHJvZ3Jlc3M/OiBudW1iZXI7XG4gICAgICAgIH0sXG4gICAgICAgIHRpbWVmcmFtZURhdGVzOiBEYXRlW11cbiAgICApIHtcbiAgICAgICAgdGhpcy5yZWZyZXNoSW5Qcm9ncmVzcyA9IHRydWU7XG4gICAgICAgIHRoaXMuY291bnRzUGVyaW9kID0gY291bnRQZXJpb2RzO1xuICAgICAgICB0aGlzLnRpbWVmcmFtZURhdGVzID0gdGltZWZyYW1lRGF0ZXM7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBvblJlZnJlc2hEb25lKHRpbWVmcmFtZURhdGVzOiBEYXRlW10pIHtcbiAgICAgICAgdGhpcy50aW1lZnJhbWVEYXRlcyA9IHRpbWVmcmFtZURhdGVzO1xuICAgICAgICB0aGlzLnJlZnJlc2hJblByb2dyZXNzID0gZmFsc2U7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBvbkZldGNoRG9uZSh0aW1lZnJhbWVDb250YWluZXJzOiBUaW1lZnJhbWVDb250YWluZXJzKSB7XG4gICAgICAgIHRoaXMudGltZWZyYW1lQ29udGFpbmVycyA9IHRpbWVmcmFtZUNvbnRhaW5lcnM7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBjaGFuZ2UoY2hhbmdlczogU2ltcGxlQ2hhbmdlcykge1xuICAgICAgICBhd2FpdCB0aGlzLmluaXQoKTtcbiAgICB9XG59XG4iLCI8IS0tIE1haW4gY29udGVudCBjb250YWluZXIgLS0+XG48ZGl2ICpuZ0lmPVwicmFpbk5vZGVcIiBjbGFzcz1cInJhYWluLWRldGFpbHMtY29udGFpbmVyXCI+XG5cbiAgICA8IS0tIEhlYWRlciBzZWN0aW9uIHdpdGggbm9kZSBpbmZvXG4gICAgPGlvbi1jYXJkIGNsYXNzPVwibm9kZS1pbmZvLWNhcmRcIj5cbiAgICAgICAgPGlvbi1jYXJkLWNvbnRlbnQ+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwibm9kZS1oZWFkZXJcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibm9kZS1zdGF0dXNcIj5cbiAgICAgICAgICAgICAgICAgICAgPGlvbi1pY29uICpuZ0lmPVwiKHJhaW5Ob2RlIHwgaGFzR29vZFF1YWxpdHkpXCIgY29sb3I9XCJzdWNjZXNzXCIgbmFtZT1cImNoZWNrbWFyay1jaXJjbGVcIj48L2lvbi1pY29uPlxuICAgICAgICAgICAgICAgICAgICA8aW9uLWljb24gKm5nSWY9XCIhKHJhaW5Ob2RlIHwgaGFzR29vZFF1YWxpdHkpXCIgY29sb3I9XCJ3YXJuaW5nXCIgbmFtZT1cImFsZXJ0LWNpcmNsZVwiPjwvaW9uLWljb24+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm5vZGUtdGl0bGVzXCI+XG4gICAgICAgICAgICAgICAgICAgIDxpb24tY2FyZC10aXRsZT57eyByYWluTm9kZS5uYW1lIH19PC9pb24tY2FyZC10aXRsZT5cbiAgICAgICAgICAgICAgICAgICAgPGlvbi1jYXJkLXN1YnRpdGxlPmJ5IHt7IHRlYW1Ob2RlPy5uYW1lIH19PC9pb24tY2FyZC1zdWJ0aXRsZT5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibm9kZS1jb250cm9sc1wiPlxuICAgICAgICAgICAgICAgICAgICA8aW9uLWxhYmVsIGNsYXNzPVwidG9nZ2xlLWxhYmVsXCI+SGlzdG9yeTwvaW9uLWxhYmVsPlxuICAgICAgICAgICAgICAgICAgICA8aW9uLXRvZ2dsZSAoaW9uQ2hhbmdlKT1cIm9uRW5hYmxlQ291bnRIaXN0b3J5VGFiKHJhaW5Ob2RlKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwidG9nZ2xlSGlzdG9yeVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjaGVja2VkXT1cInRvZ2dsZUhpc3RvcnlcIj5cbiAgICAgICAgICAgICAgICAgICAgPC9pb24tdG9nZ2xlPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvaW9uLWNhcmQtY29udGVudD5cbiAgICA8L2lvbi1jYXJkPlxuLS0+XG5cbiAgICA8IS0tIFBlcmlvZCBzZWxlY3Rpb24gc2VjdGlvbiAtLT5cbiAgICA8aW9uLWNhcmQgY2xhc3M9XCJwZXJpb2QtY2FyZFwiPlxuICAgICAgICA8aW9uLWNhcmQtY29udGVudD5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwZXJpb2QtY29udHJvbHNcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicGVyaW9kLXJvd1wiPlxuICAgICAgICAgICAgICAgICAgICA8aW9uLWJ1dHRvbiAoY2xpY2spPVwic2V0UGVyaW9kT2ZOb3coKVwiIGNsYXNzPVwibm93LWJ1dHRvblwiIGZpbGw9XCJvdXRsaW5lXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8aW9uLWljb24gbmFtZT1cInRpbWUtb3V0bGluZVwiIHNsb3Q9XCJzdGFydFwiPjwvaW9uLWljb24+XG4gICAgICAgICAgICAgICAgICAgICAgICBOb3dcbiAgICAgICAgICAgICAgICAgICAgPC9pb24tYnV0dG9uPlxuXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwZXJpb2Qtc3RhcnQgaW9uLWhpZGUtbWQtZG93blwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGlvbi1sYWJlbD5TdGFydDo8L2lvbi1sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCAoY2hhbmdlKT1cIm9uUGVyaW9kQmVnaW5DaGFuZ2UoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3ZhbHVlXT1cInBlcmlvZEJlZ2luQXNTdHJpbmdcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZGF0ZXRpbWUtaW5wdXRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJkYXRldGltZS1sb2NhbFwiPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicGVyaW9kLWR1cmF0aW9uIGlvbi1oaWRlLW1kLWRvd25cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxpb24tbGFiZWw+RHVyYXRpb246PC9pb24tbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICA8aW9uLXNlbGVjdCAoaW9uRGlzbWlzcyk9XCJvblBlcmlvZER1cmF0aW9uQ2hhbmdlKCRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJwZXJpb2REdXJhdGlvbkFzU3RyaW5nXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZHVyYXRpb24tc2VsZWN0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkPVwicGVyaW9kRHVyYXRpb25cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJmYWNlPVwicG9wb3ZlclwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpb24tc2VsZWN0LW9wdGlvbiB2YWx1ZT1cIjAuMjVcIj4xNSBtaW51dGVzPC9pb24tc2VsZWN0LW9wdGlvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW9uLXNlbGVjdC1vcHRpb24gdmFsdWU9XCIwLjVcIj4zMCBtaW51dGVzPC9pb24tc2VsZWN0LW9wdGlvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW9uLXNlbGVjdC1vcHRpb24gdmFsdWU9XCIxXCI+MSBob3VyPC9pb24tc2VsZWN0LW9wdGlvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW9uLXNlbGVjdC1vcHRpb24gdmFsdWU9XCIyXCI+MiBob3VyczwvaW9uLXNlbGVjdC1vcHRpb24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlvbi1zZWxlY3Qtb3B0aW9uIHZhbHVlPVwiM1wiPjMgaG91cnM8L2lvbi1zZWxlY3Qtb3B0aW9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpb24tc2VsZWN0LW9wdGlvbiB2YWx1ZT1cIjRcIj40IGhvdXJzPC9pb24tc2VsZWN0LW9wdGlvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW9uLXNlbGVjdC1vcHRpb24gdmFsdWU9XCI1XCI+NSBob3VyczwvaW9uLXNlbGVjdC1vcHRpb24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlvbi1zZWxlY3Qtb3B0aW9uIHZhbHVlPVwiNlwiPjYgaG91cnM8L2lvbi1zZWxlY3Qtb3B0aW9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpb24tc2VsZWN0LW9wdGlvbiAqbmdJZj1cImlzQWRtaW5cIiB2YWx1ZT1cIjI0XCI+MjQgaG91cnM8L2lvbi1zZWxlY3Qtb3B0aW9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9pb24tc2VsZWN0PlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGlkPVwiYWxsLWRhdGVzXCIgc2xvdD1cImVuZFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGlvbi1sYWJlbCBjbGFzcz1cInRvZ2dsZS1sYWJlbFwiPkFsbCBkYXRlczwvaW9uLWxhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGlvbi10b2dnbGUgKGlvbkNoYW5nZSk9XCJvbkVuYWJsZUNvdW50SGlzdG9yeVRhYihyYWluTm9kZSlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJ0b2dnbGVIaXN0b3J5XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjaGVja2VkXT1cInRvZ2dsZUhpc3RvcnlcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvaW9uLXRvZ2dsZT5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICA8IS0tIEhpZGRlbiBsYWJlbCBmb3IgY2hhbmdlIGRldGVjdGlvbiAtLT5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaGlkZGVuLWxhYmVsXCI+e3sgb25DaGFuZ2VEZXRlY3Rpb25UZXN0KHJhaW5Ob2RlKSB9fTwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgIDwhLS0gSGlzdG9yaWNhbCBtYXAgc2VjdGlvbiAtLT5cbiAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJ0b2dnbGVIaXN0b3J5XCIgY2xhc3M9XCJwZXJpb2QtY29udHJvbHNcIj5cbiAgICAgICAgICAgICAgICA8cmFhaW4tZGF0ZS1keW5hbWljIChjaGFuZ2VkRGF0ZSk9XCJvbkRhdGVDaGFuZ2VJbkNvdW50KCRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2N1cnJlbnRIZWlnaHRdPVwiMzAwXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtmZXRjaERhdGFdPVwiZmV0Y2hEYXRhV3JhcHBlclwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcG9pbnRzXT1cImNvdW50UG9pbnRzXCI+XG4gICAgICAgICAgICAgICAgPC9yYWFpbi1kYXRlLWR5bmFtaWM+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9pb24tY2FyZC1jb250ZW50PlxuICAgIDwvaW9uLWNhcmQ+XG5cblxuICAgIDwhLS0gTWFwIHNlY3Rpb24gLS0+XG4gICAgPGlvbi1jYXJkIGNsYXNzPVwibWFwLWNhcmRcIj5cbiAgICAgICAgPGlvbi1jYXJkLWNvbnRlbnQgY2xhc3M9XCJtYXAtY29udGVudFwiPlxuICAgICAgICAgICAgPGlvbi1ncmlkPlxuICAgICAgICAgICAgICAgIDxpb24tcm93IGlkPVwicHJvZ3Jlc3NBbmRSZWZyZXNoXCI+XG4gICAgICAgICAgICAgICAgICAgIDxpb24tbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cImdldFBlcmNlbnRPZkNvbXB1dGF0aW9ucygpXCIgY2xhc3M9XCJtYXAtc3RhdHNcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBnZXRQZXJjZW50T2ZDb21wdXRhdGlvbnMoKSB9fSUgSW1hZ2VzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGkgKm5nSWY9XCJjb3VudHNQZXJpb2QucHJvZ3Jlc3NcIiBjbGFzcz1cInByb2dyZXNzLWluZGljYXRvclwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbiBQcm9ncmVzczoge3sgY291bnRzUGVyaW9kLnByb2dyZXNzIH19Li4uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9pPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCIhZ2V0UGVyY2VudE9mQ29tcHV0YXRpb25zKClcIiBjbGFzcz1cIm5vLWRhdGFcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBObyBpbWFnZSBhdmFpbGFibGVcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPC9pb24tbGFiZWw+XG5cbiAgICAgICAgICAgICAgICAgICAgPGlvbi1idXR0b24gKGNsaWNrKT1cInJlZnJlc2hNYXAoKVwiICpuZ0lmPVwiIXJlZnJlc2hJblByb2dyZXNzXCIgY2xhc3M9XCJyZWZyZXNoLWJ1dHRvblwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGlvbi1pY29uIG5hbWU9XCJyZWZyZXNoLW91dGxpbmVcIiBzbG90PVwic3RhcnRcIj48L2lvbi1pY29uPlxuICAgICAgICAgICAgICAgICAgICAgICAgUmVmcmVzaCBNYXBcbiAgICAgICAgICAgICAgICAgICAgPC9pb24tYnV0dG9uPlxuXG4gICAgICAgICAgICAgICAgICAgIDwhLS0gUHJvZ3Jlc3MgaW5kaWNhdG9yIC0tPlxuICAgICAgICAgICAgICAgICAgICA8aW9uLXByb2dyZXNzLWJhciAqbmdJZj1cInJlZnJlc2hJblByb2dyZXNzXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2J1ZmZlcl09XCIoY291bnRzUGVyaW9kLnByb2dyZXNzIC8gKCh0aW1lZnJhbWVEYXRlcz8ubGVuZ3RoIHx8IDEwKSArMykpKzAuMDFcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbdmFsdWVdPVwiY291bnRzUGVyaW9kLnByb2dyZXNzIC8gKCh0aW1lZnJhbWVEYXRlcz8ubGVuZ3RoIHx8IDEwKSArMylcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvcj1cInByaW1hcnlcIj5cbiAgICAgICAgICAgICAgICAgICAgPC9pb24tcHJvZ3Jlc3MtYmFyPlxuICAgICAgICAgICAgICAgIDwvaW9uLXJvdz5cbiAgICAgICAgICAgICAgICA8aW9uLXJvdyAqbmdJZj1cInRvZ2dsZU1hcCAmJiBnZXRQZXJjZW50T2ZJbWFnZXMoKVwiPlxuICAgICAgICAgICAgICAgICAgICA8IS0tIE1hcCBjb21wb25lbnQgLS0+XG4gICAgICAgICAgICAgICAgICAgIDxpb24tY29sIGNsYXNzPVwibWFwLWNvbHVtblwiIHNpemUtbGc9XCI3XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWFwLWNvbnRhaW5lclwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyYWFpbi1tYXBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjaGFuZ2VkRGF0ZSk9XCJvbkRhdGVDaGFuZ2VJbk1hcCgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjaGFuZ2VkU3VtKT1cIm9uU3VtQ2hhbmdlSW5NYXAoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc2VsZWN0ZWRNYXJrZXIpPVwib25HYXVnZVNlbGVjdEluTWFwKCRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2Nvb3JkaW5hdGVzXT1cImNvb3JkaW5hdGVzXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjdXJyZW50SGVpZ2h0XT1cIjUwMFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZGVmYXVsdERhdGVdPVwiZGF0ZVNob3duXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFttYXJrZXJzXT1cIntcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvcmRlcnMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnYXVnZXM6IGNvbXBhcmVNYW5hZ2VyLmdhdWdlc0luTWFwLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2F1Z2VzSW5Db21wYXJlOiBjb21wYXJlTWFuYWdlci5nYXVnZXNJbkNvbXBhcmUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZEdhdWdlczogY29tcGFyZU1hbmFnZXIuc2VsZWN0ZWRHYXVnZXMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaXhlbHM6IGNvbXBhcmVNYW5hZ2VyLnNlbGVjdGVkUGl4ZWxzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGl4ZWxzU29sdXRpb246IGNvbXBhcmVNYW5hZ2VyLnBpeGVsc1NvbHV0aW9ucz8ubGVuZ3RoID8gY29tcGFyZU1hbmFnZXIucGl4ZWxzU29sdXRpb25zWzBdIDogW11cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc2hvd0N1bXVsYXRpdmVdPVwidG9nZ2xlQ3VtdWxhdGl2ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc3VtRm5dPVwicmVmcmVzaE1hbmFnZXIuc3VtRm5cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3N1bVZhbHVlc109XCJyZWZyZXNoTWFuYWdlci5zdW1WYWx1ZXNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3RpbWVmcmFtZUNvbnRhaW5lcnNdPVwidGltZWZyYW1lQ29udGFpbmVyc1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbdGltZWZyYW1lRGF0ZXNdPVwidGltZWZyYW1lRGF0ZXNcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3JhYWluLW1hcD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGF0YS1jb2x1bW5cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIFRlY2huaWNhbCBkZXRhaWxzIChjb2xsYXBzaWJsZSBmb3IgY2xlYW5lciBVSSkgLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRldGFpbHMgY2xhc3M9XCJ0ZWNobmljYWwtZGV0YWlsc1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3VtbWFyeT5JbWFnZSBEZXRhaWxzPC9zdW1tYXJ5PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGV0YWlscy1jb250ZW50XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGV0YWlsLXJvd1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZGV0YWlsLWxhYmVsXCI+Q29tcHV0ZWQ6PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZGV0YWlsLXZhbHVlXCI+e3sgcmVmcmVzaE1hbmFnZXIucmFpbkNvbXB1dGF0aW9uTWFwRG9uZURhdGUgfCBkYXRlOid5eXl5LU1NLWRkIEhIOm1tJyB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRldGFpbC1yb3dcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImRldGFpbC1sYWJlbFwiPlZlcnNpb246PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZGV0YWlsLXZhbHVlXCI+e3sgcmVmcmVzaE1hbmFnZXIucmFpbkNvbXB1dGF0aW9uTWFwVmVyc2lvbiB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRldGFpbC1yb3dcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImRldGFpbC1sYWJlbFwiPkxhdW5jaGVkIGJ5Ojwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImRldGFpbC12YWx1ZVwiPnt7IHJlZnJlc2hNYW5hZ2VyLnJhaW5Db21wdXRhdGlvbk1hcExhdW5jaGVkQnkgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkZXRhaWwtcm93XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJkZXRhaWwtbGFiZWxcIj5UaW1lIHNwZW50Ojwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImRldGFpbC12YWx1ZVwiPnt7IHJlZnJlc2hNYW5hZ2VyLnJhaW5Db21wdXRhdGlvbk1hcFRpbWVTcGVudEluTXMgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXM8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkZXRhaWwtcm93XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJkZXRhaWwtbGFiZWxcIj5EYXRlOjwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImRldGFpbC12YWx1ZVwiPnt7IHJlZnJlc2hNYW5hZ2VyLnJhaW5Db21wdXRhdGlvbk1hcERhdGU/LnRvSVNPU3RyaW5nKCkgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB7eyByZWZyZXNoTWFuYWdlci5yYWluQ29tcHV0YXRpb25NYXBEYXRlIHwgZGF0ZToneXl5eS1NTS1kZCBISDptbScgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkZXRhaWwtcm93XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJkZXRhaWwtbGFiZWxcIj5XYXRlciBpbiB0aGUgbWFwOjwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImRldGFpbC12YWx1ZVwiPnt7IHN1bURldGFpbHMgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkZXRhaWwtcm93XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJkZXRhaWwtbGFiZWxcIj5Tb3VyY2UgREJaIG1pbjo8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJkZXRhaWwtdmFsdWVcIj57eyByZWZyZXNoTWFuYWdlci5yYWluQ29tcHV0YXRpb25NYXBPcmlnaW5hbE1pbiB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRldGFpbC1yb3dcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImRldGFpbC1sYWJlbFwiPlNvdXJjZSBEQlogbWF4Ojwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImRldGFpbC12YWx1ZVwiPnt7IHJlZnJlc2hNYW5hZ2VyLnJhaW5Db21wdXRhdGlvbk1hcE9yaWdpbmFsTWF4IH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGV0YWlscz5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8L2lvbi1jb2w+XG5cbiAgICAgICAgICAgICAgICAgICAgPCEtLSBEYXRhIHBhbmVsIC0tPlxuICAgICAgICAgICAgICAgICAgICA8aW9uLWNvbCBjbGFzcz1cImRhdGEtY29sdW1uXCIgc2l6ZS1sZz1cIjVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkYXRhLXBhbmVsXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBDb21wYXJlIHN0YWNrIGNvbXBvbmVudCAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29tcGFyZS1zdGFja1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmFhaW4tY29tcGFyZS1zdGFja1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzZWxlY3RlZFBvaW50KT1cIm9uR2F1Z2VTZWxlY3RJbkNvbXBhcmUoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NvbXBhcmVNYW5hZ2VyXT1cImNvbXBhcmVNYW5hZ2VyXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY3VtdWxhdGl2ZV09XCJ0b2dnbGVDdW11bGF0aXZlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcmFhaW4tY29tcGFyZS1zdGFjaz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gVGVjaG5pY2FsIGRldGFpbHMgKGNvbGxhcHNpYmxlIGZvciBjbGVhbmVyIFVJKSAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGV0YWlscyBjbGFzcz1cInRlY2huaWNhbC1kZXRhaWxzXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdW1tYXJ5PkNvbXBhcmUgRGV0YWlsczwvc3VtbWFyeT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRldGFpbHMtY29udGVudFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBbbmdDbGFzc109XCJ7J3dhcm5pbmcnOiByZWZyZXNoTWFuYWdlci5yYWluQ29tcHV0YXRpb25NYXBEb25lRGF0ZT8uZ2V0VGltZSgpID4gY29tcGFyZU1hbmFnZXIuY3VycmVudFF1YWxpdHlEb25lRGF0ZT8uZ2V0VGltZSgpICsgNjAwMDB9XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJkZXRhaWwtcm93XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJkZXRhaWwtbGFiZWxcIj5Db21wdXRlZDo8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJkZXRhaWwtdmFsdWVcIj57eyBjb21wYXJlTWFuYWdlci5jdXJyZW50UXVhbGl0eURvbmVEYXRlIHwgZGF0ZToneXl5eS1NTS1kZCBISDptbScgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkZXRhaWwtcm93XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJkZXRhaWwtbGFiZWxcIj5WZXJzaW9uOjwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImRldGFpbC12YWx1ZVwiPnt7IGNvbXBhcmVNYW5hZ2VyLmNvbXBhcmVWZXJzaW9uIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGV0YWlsLXJvd1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZGV0YWlsLWxhYmVsXCI+TGF1bmNoZWQgYnk6PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZGV0YWlsLXZhbHVlXCI+e3sgY29tcGFyZU1hbmFnZXIuY3VycmVudFF1YWxpdHlMYXVuY2hlZEJ5IH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGV0YWlsLXJvd1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZGV0YWlsLWxhYmVsXCI+VGltZSBzcGVudDo8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJkZXRhaWwtdmFsdWVcIj57eyBjb21wYXJlTWFuYWdlci5jdXJyZW50UXVhbGl0eVRpbWVTcGVudEluTXMgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXM8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkZXRhaWwtcm93XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJkZXRhaWwtbGFiZWxcIj5HYXVnZXM6PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZGV0YWlsLXZhbHVlXCI+e3sgY29tcGFyZU1hbmFnZXIuZ2F1Z2VzSW5Db21wYXJlLmxlbmd0aCB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRldGFpbC1yb3dcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImRldGFpbC1sYWJlbFwiPlBvaW50czo8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJkZXRhaWwtdmFsdWVcIj57eyBjb21wYXJlTWFuYWdlci5nbG9iYWxDb21wYXJlUG9pbnRzLmxlbmd0aCB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2RldGFpbHM+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC9pb24tY29sPlxuICAgICAgICAgICAgICAgIDwvaW9uLXJvdz5cbiAgICAgICAgICAgICAgICA8aW9uLXJvdz5cbiAgICAgICAgICAgICAgICAgICAgPCEtLSBCb3R0b20gcHJvZ3Jlc3MgYmFyIC0tPlxuICAgICAgICAgICAgICAgICAgICA8aW9uLXByb2dyZXNzLWJhciAqbmdJZj1cInJlZnJlc2hJblByb2dyZXNzXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2J1ZmZlcl09XCIoY291bnRzUGVyaW9kLnByb2dyZXNzIC8gKCh0aW1lZnJhbWVEYXRlcz8ubGVuZ3RoIHx8IDEwKSArMykpKzAuMDFcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbdmFsdWVdPVwiY291bnRzUGVyaW9kLnByb2dyZXNzIC8gKCh0aW1lZnJhbWVEYXRlcz8ubGVuZ3RoIHx8IDEwKSArMylcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvcj1cInByaW1hcnlcIj5cbiAgICAgICAgICAgICAgICAgICAgPC9pb24tcHJvZ3Jlc3MtYmFyPlxuICAgICAgICAgICAgICAgIDwvaW9uLXJvdz5cbiAgICAgICAgICAgIDwvaW9uLWdyaWQ+XG4gICAgICAgIDwvaW9uLWNhcmQtY29udGVudD5cbiAgICA8L2lvbi1jYXJkPlxuXG4gICAgPCEtLSBHYXVnZSB2YWx1ZXMgc2VjdGlvbiAtLT5cbiAgICA8aW9uLWNhcmQgKm5nSWY9XCJnYXVnZVNlbGVjdGVkUG9pbnRzLmxlbmd0aCAmJiBnYXVnZVNlbGVjdGVkUG9pbnRzWzBdLnZhbHVlcy5sZW5ndGhcIiBjbGFzcz1cImdhdWdlLWNhcmRcIj5cbiAgICAgICAgPGlvbi1jYXJkLWhlYWRlcj5cbiAgICAgICAgICAgIDxpb24tY2FyZC10aXRsZT5cbiAgICAgICAgICAgICAgICA8aW9uLWljb24gbmFtZT1cImFuYWx5dGljcy1vdXRsaW5lXCI+PC9pb24taWNvbj5cbiAgICAgICAgICAgICAgICBTZWxlY3RlZCBHYXVnZSBEYXRhXG4gICAgICAgICAgICA8L2lvbi1jYXJkLXRpdGxlPlxuICAgICAgICA8L2lvbi1jYXJkLWhlYWRlcj5cbiAgICAgICAgPGlvbi1jYXJkLWNvbnRlbnQ+XG4gICAgICAgICAgICA8cmFhaW4tZGF0ZS1mb2N1c1xuICAgICAgICAgICAgICAgICAgICBbY3VycmVudEhlaWdodF09XCIzMDBcIlxuICAgICAgICAgICAgICAgICAgICBbZm9jdXNEYXRlXT1cInBlcmlvZEJlZ2luXCJcbiAgICAgICAgICAgICAgICAgICAgW2ZvY3VzUmFuZ2VdPVwiRGF0ZVJhbmdlLkRBWVwiXG4gICAgICAgICAgICAgICAgICAgIFtwb2ludHNdPVwiZ2F1Z2VTZWxlY3RlZFBvaW50c1wiXG4gICAgICAgICAgICAgICAgICAgIFt3aXRob3V0QWxsXT1cInRydWVcIj5cbiAgICAgICAgICAgIDwvcmFhaW4tZGF0ZS1mb2N1cz5cbiAgICAgICAgPC9pb24tY2FyZC1jb250ZW50PlxuICAgIDwvaW9uLWNhcmQ+XG5cbjwvZGl2PlxuIl19