ng-configcat-publicapi-ui 4.0.2 → 4.0.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/esm2022/lib/v2/feature-flag/evaluation-formula/targeting-rule/conditions/prerequisite-flag-condition/prerequisite-flag-condition.component.mjs +3 -3
- package/esm2022/lib/v2/feature-flag/evaluation-formula/targeting-rule/conditions/segment-condition/segment-condition.component.mjs +3 -3
- package/esm2022/lib/v2/feature-flag/evaluation-formula/targeting-rule/conditions/user-condition/comparator-dialog/comparator-dialog.component.mjs +3 -3
- package/esm2022/lib/v2/feature-flag/evaluation-formula/targeting-rule/conditions/user-condition/user-condition.component.mjs +4 -4
- package/esm2022/lib/v2/feature-flag/evaluation-formula/targeting-rule/percentage-options/percentage-options.component.mjs +3 -3
- package/esm2022/lib/v2/feature-flag/percentage-evaluation-attribute-dialog/percentage-evaluation-attribute-dialog.component.mjs +3 -3
- package/fesm2022/ng-configcat-publicapi-ui.mjs +13 -13
- package/fesm2022/ng-configcat-publicapi-ui.mjs.map +1 -1
- package/package.json +1 -1
|
@@ -411,7 +411,7 @@ export class UserConditionComponent {
|
|
|
411
411
|
title: `Consider using confidential comparators`,
|
|
412
412
|
body: `Comparison value will be presented as plain text
|
|
413
413
|
in the <i>config JSON</i>. If you have sensitive data, consider using one of the confidential (hashed) comparators.<br/><br/>
|
|
414
|
-
See the <a href="https://configcat.com/docs/
|
|
414
|
+
See the <a href="https://configcat.com/docs/targeting/targeting-rule/user-condition/#confidential-text-comparators" target="_blank">documentation</a> for more information.`,
|
|
415
415
|
secondaryButtonLabel: 'Open comparator selector',
|
|
416
416
|
secondaryButtonAction: () => this.compDialog()
|
|
417
417
|
}
|
|
@@ -420,13 +420,13 @@ export class UserConditionComponent {
|
|
|
420
420
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.1", ngImport: i0, type: UserConditionComponent, deps: [{ token: i1.FormGenerator }, { token: i2.MatDialog }, { token: i1.ComparisonValueListHelper }, { token: i3.Clipboard }, { token: i1.MessagingService }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
421
421
|
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.1", type: UserConditionComponent, selector: "app-user-condition", inputs: { targetingRuleIndex: "targetingRuleIndex", conditionIndex: "conditionIndex", readOnly: "readOnly", featureFlagLimitations: "featureFlagLimitations", formGroup: "formGroup" }, providers: [
|
|
422
422
|
{ provide: DateAdapter, useClass: AppDateAdapter }
|
|
423
|
-
], viewQueries: [{ propertyName: "setMatChipGrid", first: true, predicate: ["chipGrid"], descendants: true }], ngImport: i0, template: "<div class=\"targeting-rule-line smallest-form-field\">\n <div class=\"explanation-wrapper\">\n <app-condition-chip [targetingRuleIndex]=\"targetingRuleIndex\"\n [conditionIndex]=\"conditionIndex\"></app-condition-chip>\n\n <div class=\"explanation\"><a href=\"https://configcat.com/docs/V2/targeting/targeting-rule/user-condition/\"\n target=\"_blank\" rel=\"noopener noreferrer\" class=\"user-link\">user's</a></div>\n </div>\n\n <div class=\"wrapper-group\">\n <div class=\"wrapper-group\">\n <div class=\"targeting-rule-component pad-right\"\n [ngClass]=\"{'small': defaultComparisonAttributes.indexOf(formGroup.controls.comparisonAttribute.value) === -1}\">\n <mat-form-field appearance=\"outline\" subscriptSizing=\"dynamic\">\n <select matNativeControl (change)=\"attributeChanged($event)\"\n [disabled]=\"formGroup.controls.comparisonAttribute.disabled\" matTooltip=\"Comparison attribute\">\n <option *ngFor=\"let comparisonAttribute of defaultComparisonAttributes\"\n [selected]=\"comparisonAttribute === formGroup.controls.comparisonAttribute.value\">\n {{comparisonAttribute}}</option>\n <option\n [selected]=\"defaultComparisonAttributes.indexOf(formGroup.controls.comparisonAttribute.value) === -1\">\n Custom\n </option>\n </select>\n </mat-form-field>\n </div>\n <div class=\"targeting-rule-component pad-right small\"\n [hidden]=\"defaultComparisonAttributes.indexOf(formGroup.controls.comparisonAttribute.value) !== -1\">\n <mat-form-field appearance=\"outline\" subscriptSizing=\"dynamic\">\n <input matInput type=\"text\" (blur)=\"calcComparators(true)\"\n [formControl]=\"formGroup.controls.comparisonAttribute\" matTooltip=\"Custom comparison attribute\">\n <mat-error *ngIf=\"formGroup.controls.comparisonAttribute.invalid\">\n {{FormHelper.getErrorMessage(formGroup.controls.comparisonAttribute)}}\n </mat-error>\n </mat-form-field>\n </div>\n </div>\n\n <div class=\"targeting-rule-component pad-right comparator\">\n <mat-form-field appearance=\"outline\" subscriptSizing=\"dynamic\">\n <select matNativeControl (change)=\"comparatorChanged(selectedComparator)\"\n [(ngModel)]=\"selectedComparator\" [disabled]=\"readOnly\" matTooltip=\"Comparator\">\n <optgroup *ngFor=\"let group of comparatorSuggestions | keyvalue: keepOrder\"\n [label]=\"' ' + group.key\">\n <option *ngFor=\"let comparator of group.value\" [ngValue]=\"comparator.value\">\n {{comparator.label}}\n </option>\n </optgroup>\n <optgroup [label]=\"comparatorSeparator\"></optgroup>\n <option value=\"showall\"> SHOW ALL COMPARATORS </option>\n </select>\n <button matSuffix class=\"input-button\" type=\"button\" mat-icon-button matTooltip=\"All comparators\"\n (click)=\"compDialog()\"><mat-icon>list_alt</mat-icon></button>\n <mat-error *ngIf=\"formGroup.controls.comparator.invalid\">\n {{FormHelper.getErrorMessage(formGroup.controls.comparator)}}\n </mat-error>\n </mat-form-field>\n </div>\n </div>\n <ng-container [ngSwitch]=\"rolloutRuleComparatorType\">\n <ng-container *ngSwitchCase=\"RolloutRuleComparatorV2Type.String\"\n [ngTemplateOutlet]=\"textTemplate\"></ng-container>\n <ng-container *ngSwitchCase=\"RolloutRuleComparatorV2Type.Semver\"\n [ngTemplateOutlet]=\"semverTemplate\"></ng-container>\n <ng-container *ngSwitchCase=\"RolloutRuleComparatorV2Type.StringList\"\n [ngTemplateOutlet]=\"listTemplate\"></ng-container>\n <ng-container *ngSwitchCase=\"RolloutRuleComparatorV2Type.SemverList\"\n [ngTemplateOutlet]=\"listTemplate\"></ng-container>\n <ng-container *ngSwitchCase=\"RolloutRuleComparatorV2Type.Number\"\n [ngTemplateOutlet]=\"numberTemplate\"></ng-container>\n <ng-container *ngSwitchCase=\"RolloutRuleComparatorV2Type.DateTime\"\n [ngTemplateOutlet]=\"dateTimeTemplate\"></ng-container>\n </ng-container>\n\n</div>\n\n<ng-template #textTemplate>\n <div *ngIf=\"formGroup.controls.comparisonValue.controls.stringValue\" class=\"targeting-rule-component grow\">\n <mat-form-field appearance=\"outline\" subscriptSizing=\"dynamic\">\n <input matInput type=\"text\" [formControl]=\"formGroup.controls.comparisonValue.controls.stringValue\"\n matTooltip=\"Comparison value (text)\" placeholder=\"Add text ...\" />\n <button matPrefix class=\"prefix-button\" type=\"button\" mat-icon-button *ngIf=\"isClearTextComparatorSelected\"\n (click)=\"openCleartextInfoDialog()\"\n matTooltip=\"This comparison value won't be hashed. Click for more info.\"><mat-icon>lock_open_right</mat-icon></button>\n <button matSuffix class=\"input-button\" type=\"button\" mat-icon-button matTooltip=\"Advanced editor\"\n (click)=\"expandText()\"><mat-icon>edit_note</mat-icon></button>\n <mat-error *ngIf=\"formGroup.controls.comparisonValue.controls.stringValue.invalid\">\n {{FormHelper.getErrorMessage(formGroup.controls.comparisonValue.controls.stringValue)}}\n </mat-error>\n </mat-form-field>\n </div>\n</ng-template>\n\n\n<ng-template #semverTemplate>\n <div *ngIf=\"formGroup.controls.comparisonValue.controls.stringValue\" class=\"targeting-rule-component grow\">\n <mat-form-field appearance=\"outline\" subscriptSizing=\"dynamic\">\n <input matInput type=\"text\" [formControl]=\"formGroup.controls.comparisonValue.controls.stringValue\"\n matTooltip=\"Comparison value (semantic version)\" placeholder=\"Add semantic version ... (1.2.3)\" />\n <mat-error *ngIf=\"formGroup.controls.comparisonValue.controls.stringValue.invalid\">\n {{FormHelper.getErrorMessage(formGroup.controls.comparisonValue.controls.stringValue)}}\n </mat-error>\n </mat-form-field>\n </div>\n</ng-template>\n\n<ng-template #listTemplate>\n <div *ngIf=\"formGroup.controls.comparisonValue.controls.listValue\"\n class=\"targeting-rule-component grow small-chip-input top-icon-suffix\">\n <mat-form-field appearance=\"outline\" subscriptSizing=\"dynamic\">\n <mat-chip-grid #chipGrid [formControl]=\"fakeFormControl\" [errorStateMatcher]=\"errorStateMatcher\">\n <span class=\"chip-container\"\n *ngFor=\"let listValueItem of formGroup.controls.comparisonValue.controls.listValue.controls | slice:0:20; let i = index\"\n [matTooltip]=\"getListValueItemTooltipMessage(listValueItem)\">\n <mat-chip-row (removed)=\"remove(i)\" [disabled]=\"readOnly\" [removable]=\"!readOnly\" class=\"chip\"\n [editable]=\"!readOnly\" (edited)=\"edit(i, $event)\"\n [ngClass]=\"{'invalid': isListValueItemInvalid(listValueItem)}\">\n\n {{listValueItem.controls.value.value}}\n\n <button type=\"button\" matChipRemove *ngIf=\"!readOnly\">\n <mat-icon>cancel</mat-icon>\n </button>\n </mat-chip-row>\n </span>\n <button mat-stroked-button class=\"show-all\" type=\"button\"\n *ngIf=\"formGroup.controls.comparisonValue.controls.listValue.controls.length > 20\"\n (click)=\"expandList()\">\n show all {{formGroup.controls.comparisonValue.controls.listValue.controls.length}}\n items</button>\n <input [disabled]=\"readOnly\" [placeholder]=\"!readOnly ? 'Add item to list ...' : ''\"\n [matChipInputFor]=\"chipGrid\" [matChipInputSeparatorKeyCodes]=\"separatorKeysCodes\"\n matChipInputAddOnBlur (matChipInputTokenEnd)=\"add($event)\" matTooltip=\"Comparison values (list)\" />\n </mat-chip-grid>\n <button matIconPrefix class=\"prefix-button\" type=\"button\" mat-icon-button *ngIf=\"isClearTextComparatorSelected\"\n (click)=\"openCleartextInfoDialog()\"\n matTooltip=\"This comparison value won't be hashed. Click for more info.\"><mat-icon>lock_open_right</mat-icon></button>\n <button matIconSuffix class=\"input-button\" type=\"button\" mat-icon-button matTooltip=\"More...\"\n [matMenuTriggerFor]=\"moreMenu\"><mat-icon>more_vert</mat-icon></button>\n <button matIconSuffix class=\"input-button\" type=\"button\" mat-icon-button matTooltip=\"Advanced editor\"\n (click)=\"expandList()\"><mat-icon>edit_note</mat-icon></button>\n <mat-error\n *ngIf=\"formGroup.controls.comparisonValue.controls.listValue.invalid && formGroup.controls.comparisonValue.controls.listValue.errors\">\n {{FormHelper.getErrorMessage(formGroup.controls.comparisonValue.controls.listValue)}}\n </mat-error>\n <mat-error\n *ngIf=\"formGroup.controls.comparisonValue.controls.listValue.invalid && !formGroup.controls.comparisonValue.controls.listValue.errors\">\n Invalid items\n </mat-error>\n </mat-form-field>\n </div>\n</ng-template>\n\n<ng-template #numberTemplate>\n <div *ngIf=\"formGroup.controls.comparisonValue.controls.doubleValue\" class=\"targeting-rule-component grow\">\n <mat-form-field appearance=\"outline\" subscriptSizing=\"dynamic\">\n <input matInput type=\"number\" [formControl]=\"formGroup.controls.comparisonValue.controls.doubleValue\"\n matTooltip=\"Comparison value (number)\" placeholder=\"Add number ...\" inputDisplayNormalizer />\n <mat-error *ngIf=\"formGroup.controls.comparisonValue.controls.doubleValue.invalid\">\n {{FormHelper.getErrorMessage(formGroup.controls.comparisonValue.controls.doubleValue)}}\n </mat-error>\n </mat-form-field>\n </div>\n</ng-template>\n\n<ng-template #dateTimeTemplate>\n <div *ngIf=\"formGroup.controls.comparisonValue.controls.doubleValue\" class=\"targeting-rule-component datetime\">\n <app-date-time-picker [formControl]=\"formGroup.controls.comparisonValue.controls.doubleValue\"\n dateTooltip=\"Comparison value (date)\" timeTooltip=\"Comparison value (time)\" />\n </div>\n</ng-template>\n\n\n<mat-menu #moreMenu>\n <a mat-menu-item (click)=\"expandList()\"><mat-icon>edit_note</mat-icon>Advanced editor</a>\n <a mat-menu-item (click)=\"copyValuesAsCsv()\"><mat-icon>content_copy</mat-icon>Copy as CSV (values only)</a>\n <a mat-menu-item (click)=\"removeAll()\" [disabled]=\"readOnly\"><mat-icon>delete_outline</mat-icon>Remove\n all</a>\n</mat-menu>", styles: [".targeting-rule-line{display:flex;flex-wrap:wrap;margin:2px 0}.targeting-rule-line .wrapper-group{display:flex;flex-wrap:wrap}.targeting-rule-line .wrapper-group.grow{flex-grow:1}.targeting-rule-component{margin:2px 0;width:212px}.targeting-rule-component[hidden]{display:none}.targeting-rule-component.small{width:102px}.targeting-rule-component.grow{flex-grow:1}.targeting-rule-component.pad-right{margin-right:8px}.targeting-rule-component mat-form-field{width:100%;font-size:12px}.delete-button{margin-top:4px;color:#b1b1b1}.delete-button mat-icon{font-size:18px;height:18px;width:18px}.explanation-wrapper{display:flex;margin-top:2px}.explanation-wrapper .explanation{min-width:44px;margin-top:6px;margin-right:8px}@media (max-width: 500px){.targeting-rule-component{max-width:calc(100% - 4px);width:160px}.targeting-rule-component.small{width:78px}.targeting-rule-component.pad-right{margin-right:4px}}\n", ".mat-mdc-chip.mat-mdc-standard-chip{--mdc-chip-container-height: 24px}.targeting-rule-line{--mdc-text-button-container-height: 24px;--mdc-filled-button-container-height: 24px;--mdc-outlined-button-container-height: 24px;--mdc-protected-button-container-height: 24px;--mat-text-button-touch-target-display: none;--mat-filled-button-touch-target-display: none;--mat-protected-button-touch-target-display: none;--mat-outlined-button-touch-target-display: none}.targeting-rule-component.datetime{width:auto;margin:0}mat-chip-row.invalid{background-color:red}.show-all{font-size:.8em;margin-left:4px}.input-button{--mat-icon-button-touch-target-display: none;color:#00000070;margin-right:4px;padding:0;height:24px;width:24px;line-height:1;display:inline-flex;align-items:center;justify-content:center}.input-button .mat-mdc-icon-button.mat-mdc-button-base{--mdc-icon-button-state-layer-size: 28px;width:var(--mdc-icon-button-state-layer-size);height:var(--mdc-icon-button-state-layer-size);padding:2px}.input-button mat-icon{font-size:20px;height:20px;width:20px}.prefix-button{--mat-icon-button-touch-target-display: none;color:#00000070;margin-left:4px;margin-right:2px;height:20px;width:20px;padding:0;line-height:1;display:inline-flex;align-items:center;justify-content:center}.prefix-button .mat-mdc-icon-button.mat-mdc-button-base{--mdc-icon-button-state-layer-size: 28px;width:var(--mdc-icon-button-state-layer-size);height:var(--mdc-icon-button-state-layer-size);padding:2px}.prefix-button mat-icon{font-size:18px;height:18px;width:18px}.chip{background-color:#f1f1f1}.chip mat-icon{color:#8d8d8d}\n"], dependencies: [{ kind: "directive", type: i4.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i4.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i4.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { kind: "directive", type: i4.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { kind: "directive", type: i5.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i5.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i5.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i5.NumberValueAccessor, selector: "input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]" }, { kind: "directive", type: i5.SelectControlValueAccessor, selector: "select:not([multiple])[formControlName],select:not([multiple])[formControl],select:not([multiple])[ngModel]", inputs: ["compareWith"] }, { kind: "directive", type: i5.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i5.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i5.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "component", type: i6.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i6.MatError, selector: "mat-error, [matError]", inputs: ["id"] }, { kind: "directive", type: i6.MatPrefix, selector: "[matPrefix], [matIconPrefix], [matTextPrefix]", inputs: ["matTextPrefix"] }, { kind: "directive", type: i6.MatSuffix, selector: "[matSuffix], [matIconSuffix], [matTextSuffix]", inputs: ["matTextSuffix"] }, { kind: "component", type: i7.MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", exportAs: ["matButton"] }, { kind: "component", type: i7.MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }, { kind: "directive", type: i8.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { kind: "component", type: i9.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: i10.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "component", type: i11.MatChipGrid, selector: "mat-chip-grid", inputs: ["disabled", "placeholder", "required", "value", "errorStateMatcher"], outputs: ["change", "valueChange"] }, { kind: "directive", type: i11.MatChipInput, selector: "input[matChipInputFor]", inputs: ["matChipInputFor", "matChipInputAddOnBlur", "matChipInputSeparatorKeyCodes", "placeholder", "id", "disabled"], outputs: ["matChipInputTokenEnd"], exportAs: ["matChipInput", "matChipInputFor"] }, { kind: "directive", type: i11.MatChipRemove, selector: "[matChipRemove]" }, { kind: "component", type: i11.MatChipRow, selector: "mat-chip-row, [mat-chip-row], mat-basic-chip-row, [mat-basic-chip-row]", inputs: ["editable"], outputs: ["edited"] }, { kind: "component", type: i12.MatMenu, selector: "mat-menu", inputs: ["backdropClass", "aria-label", "aria-labelledby", "aria-describedby", "xPosition", "yPosition", "overlapTrigger", "hasBackdrop", "class", "classList"], outputs: ["closed", "close"], exportAs: ["matMenu"] }, { kind: "component", type: i12.MatMenuItem, selector: "[mat-menu-item]", inputs: ["role", "disabled", "disableRipple"], exportAs: ["matMenuItem"] }, { kind: "directive", type: i12.MatMenuTrigger, selector: "[mat-menu-trigger-for], [matMenuTriggerFor]", inputs: ["mat-menu-trigger-for", "matMenuTriggerFor", "matMenuTriggerData", "matMenuTriggerRestoreFocus"], outputs: ["menuOpened", "onMenuOpen", "menuClosed", "onMenuClose"], exportAs: ["matMenuTrigger"] }, { kind: "directive", type: i13.InputDisplayNormalizerDirective, selector: "input[inputDisplayNormalizer]" }, { kind: "component", type: i14.ConditionChipComponent, selector: "app-condition-chip", inputs: ["targetingRuleIndex", "conditionIndex"] }, { kind: "component", type: i15.DateTimePickerComponent, selector: "app-date-time-picker", inputs: ["dateTooltip", "timeTooltip"] }, { kind: "pipe", type: i4.SlicePipe, name: "slice" }, { kind: "pipe", type: i4.KeyValuePipe, name: "keyvalue" }] }); }
|
|
423
|
+
], viewQueries: [{ propertyName: "setMatChipGrid", first: true, predicate: ["chipGrid"], descendants: true }], ngImport: i0, template: "<div class=\"targeting-rule-line smallest-form-field\">\n <div class=\"explanation-wrapper\">\n <app-condition-chip [targetingRuleIndex]=\"targetingRuleIndex\"\n [conditionIndex]=\"conditionIndex\"></app-condition-chip>\n\n <div class=\"explanation\"><a href=\"https://configcat.com/docs/targeting/targeting-rule/user-condition/\"\n target=\"_blank\" rel=\"noopener noreferrer\" class=\"user-link\">user's</a></div>\n </div>\n\n <div class=\"wrapper-group\">\n <div class=\"wrapper-group\">\n <div class=\"targeting-rule-component pad-right\"\n [ngClass]=\"{'small': defaultComparisonAttributes.indexOf(formGroup.controls.comparisonAttribute.value) === -1}\">\n <mat-form-field appearance=\"outline\" subscriptSizing=\"dynamic\">\n <select matNativeControl (change)=\"attributeChanged($event)\"\n [disabled]=\"formGroup.controls.comparisonAttribute.disabled\" matTooltip=\"Comparison attribute\">\n <option *ngFor=\"let comparisonAttribute of defaultComparisonAttributes\"\n [selected]=\"comparisonAttribute === formGroup.controls.comparisonAttribute.value\">\n {{comparisonAttribute}}</option>\n <option\n [selected]=\"defaultComparisonAttributes.indexOf(formGroup.controls.comparisonAttribute.value) === -1\">\n Custom\n </option>\n </select>\n </mat-form-field>\n </div>\n <div class=\"targeting-rule-component pad-right small\"\n [hidden]=\"defaultComparisonAttributes.indexOf(formGroup.controls.comparisonAttribute.value) !== -1\">\n <mat-form-field appearance=\"outline\" subscriptSizing=\"dynamic\">\n <input matInput type=\"text\" (blur)=\"calcComparators(true)\"\n [formControl]=\"formGroup.controls.comparisonAttribute\" matTooltip=\"Custom comparison attribute\">\n <mat-error *ngIf=\"formGroup.controls.comparisonAttribute.invalid\">\n {{FormHelper.getErrorMessage(formGroup.controls.comparisonAttribute)}}\n </mat-error>\n </mat-form-field>\n </div>\n </div>\n\n <div class=\"targeting-rule-component pad-right comparator\">\n <mat-form-field appearance=\"outline\" subscriptSizing=\"dynamic\">\n <select matNativeControl (change)=\"comparatorChanged(selectedComparator)\"\n [(ngModel)]=\"selectedComparator\" [disabled]=\"readOnly\" matTooltip=\"Comparator\">\n <optgroup *ngFor=\"let group of comparatorSuggestions | keyvalue: keepOrder\"\n [label]=\"' ' + group.key\">\n <option *ngFor=\"let comparator of group.value\" [ngValue]=\"comparator.value\">\n {{comparator.label}}\n </option>\n </optgroup>\n <optgroup [label]=\"comparatorSeparator\"></optgroup>\n <option value=\"showall\"> SHOW ALL COMPARATORS </option>\n </select>\n <button matSuffix class=\"input-button\" type=\"button\" mat-icon-button matTooltip=\"All comparators\"\n (click)=\"compDialog()\"><mat-icon>list_alt</mat-icon></button>\n <mat-error *ngIf=\"formGroup.controls.comparator.invalid\">\n {{FormHelper.getErrorMessage(formGroup.controls.comparator)}}\n </mat-error>\n </mat-form-field>\n </div>\n </div>\n <ng-container [ngSwitch]=\"rolloutRuleComparatorType\">\n <ng-container *ngSwitchCase=\"RolloutRuleComparatorV2Type.String\"\n [ngTemplateOutlet]=\"textTemplate\"></ng-container>\n <ng-container *ngSwitchCase=\"RolloutRuleComparatorV2Type.Semver\"\n [ngTemplateOutlet]=\"semverTemplate\"></ng-container>\n <ng-container *ngSwitchCase=\"RolloutRuleComparatorV2Type.StringList\"\n [ngTemplateOutlet]=\"listTemplate\"></ng-container>\n <ng-container *ngSwitchCase=\"RolloutRuleComparatorV2Type.SemverList\"\n [ngTemplateOutlet]=\"listTemplate\"></ng-container>\n <ng-container *ngSwitchCase=\"RolloutRuleComparatorV2Type.Number\"\n [ngTemplateOutlet]=\"numberTemplate\"></ng-container>\n <ng-container *ngSwitchCase=\"RolloutRuleComparatorV2Type.DateTime\"\n [ngTemplateOutlet]=\"dateTimeTemplate\"></ng-container>\n </ng-container>\n\n</div>\n\n<ng-template #textTemplate>\n <div *ngIf=\"formGroup.controls.comparisonValue.controls.stringValue\" class=\"targeting-rule-component grow\">\n <mat-form-field appearance=\"outline\" subscriptSizing=\"dynamic\">\n <input matInput type=\"text\" [formControl]=\"formGroup.controls.comparisonValue.controls.stringValue\"\n matTooltip=\"Comparison value (text)\" placeholder=\"Add text ...\" />\n <button matPrefix class=\"prefix-button\" type=\"button\" mat-icon-button *ngIf=\"isClearTextComparatorSelected\"\n (click)=\"openCleartextInfoDialog()\"\n matTooltip=\"This comparison value won't be hashed. Click for more info.\"><mat-icon>lock_open_right</mat-icon></button>\n <button matSuffix class=\"input-button\" type=\"button\" mat-icon-button matTooltip=\"Advanced editor\"\n (click)=\"expandText()\"><mat-icon>edit_note</mat-icon></button>\n <mat-error *ngIf=\"formGroup.controls.comparisonValue.controls.stringValue.invalid\">\n {{FormHelper.getErrorMessage(formGroup.controls.comparisonValue.controls.stringValue)}}\n </mat-error>\n </mat-form-field>\n </div>\n</ng-template>\n\n\n<ng-template #semverTemplate>\n <div *ngIf=\"formGroup.controls.comparisonValue.controls.stringValue\" class=\"targeting-rule-component grow\">\n <mat-form-field appearance=\"outline\" subscriptSizing=\"dynamic\">\n <input matInput type=\"text\" [formControl]=\"formGroup.controls.comparisonValue.controls.stringValue\"\n matTooltip=\"Comparison value (semantic version)\" placeholder=\"Add semantic version ... (1.2.3)\" />\n <mat-error *ngIf=\"formGroup.controls.comparisonValue.controls.stringValue.invalid\">\n {{FormHelper.getErrorMessage(formGroup.controls.comparisonValue.controls.stringValue)}}\n </mat-error>\n </mat-form-field>\n </div>\n</ng-template>\n\n<ng-template #listTemplate>\n <div *ngIf=\"formGroup.controls.comparisonValue.controls.listValue\"\n class=\"targeting-rule-component grow small-chip-input top-icon-suffix\">\n <mat-form-field appearance=\"outline\" subscriptSizing=\"dynamic\">\n <mat-chip-grid #chipGrid [formControl]=\"fakeFormControl\" [errorStateMatcher]=\"errorStateMatcher\">\n <span class=\"chip-container\"\n *ngFor=\"let listValueItem of formGroup.controls.comparisonValue.controls.listValue.controls | slice:0:20; let i = index\"\n [matTooltip]=\"getListValueItemTooltipMessage(listValueItem)\">\n <mat-chip-row (removed)=\"remove(i)\" [disabled]=\"readOnly\" [removable]=\"!readOnly\" class=\"chip\"\n [editable]=\"!readOnly\" (edited)=\"edit(i, $event)\"\n [ngClass]=\"{'invalid': isListValueItemInvalid(listValueItem)}\">\n\n {{listValueItem.controls.value.value}}\n\n <button type=\"button\" matChipRemove *ngIf=\"!readOnly\">\n <mat-icon>cancel</mat-icon>\n </button>\n </mat-chip-row>\n </span>\n <button mat-stroked-button class=\"show-all\" type=\"button\"\n *ngIf=\"formGroup.controls.comparisonValue.controls.listValue.controls.length > 20\"\n (click)=\"expandList()\">\n show all {{formGroup.controls.comparisonValue.controls.listValue.controls.length}}\n items</button>\n <input [disabled]=\"readOnly\" [placeholder]=\"!readOnly ? 'Add item to list ...' : ''\"\n [matChipInputFor]=\"chipGrid\" [matChipInputSeparatorKeyCodes]=\"separatorKeysCodes\"\n matChipInputAddOnBlur (matChipInputTokenEnd)=\"add($event)\" matTooltip=\"Comparison values (list)\" />\n </mat-chip-grid>\n <button matIconPrefix class=\"prefix-button\" type=\"button\" mat-icon-button *ngIf=\"isClearTextComparatorSelected\"\n (click)=\"openCleartextInfoDialog()\"\n matTooltip=\"This comparison value won't be hashed. Click for more info.\"><mat-icon>lock_open_right</mat-icon></button>\n <button matIconSuffix class=\"input-button\" type=\"button\" mat-icon-button matTooltip=\"More...\"\n [matMenuTriggerFor]=\"moreMenu\"><mat-icon>more_vert</mat-icon></button>\n <button matIconSuffix class=\"input-button\" type=\"button\" mat-icon-button matTooltip=\"Advanced editor\"\n (click)=\"expandList()\"><mat-icon>edit_note</mat-icon></button>\n <mat-error\n *ngIf=\"formGroup.controls.comparisonValue.controls.listValue.invalid && formGroup.controls.comparisonValue.controls.listValue.errors\">\n {{FormHelper.getErrorMessage(formGroup.controls.comparisonValue.controls.listValue)}}\n </mat-error>\n <mat-error\n *ngIf=\"formGroup.controls.comparisonValue.controls.listValue.invalid && !formGroup.controls.comparisonValue.controls.listValue.errors\">\n Invalid items\n </mat-error>\n </mat-form-field>\n </div>\n</ng-template>\n\n<ng-template #numberTemplate>\n <div *ngIf=\"formGroup.controls.comparisonValue.controls.doubleValue\" class=\"targeting-rule-component grow\">\n <mat-form-field appearance=\"outline\" subscriptSizing=\"dynamic\">\n <input matInput type=\"number\" [formControl]=\"formGroup.controls.comparisonValue.controls.doubleValue\"\n matTooltip=\"Comparison value (number)\" placeholder=\"Add number ...\" inputDisplayNormalizer />\n <mat-error *ngIf=\"formGroup.controls.comparisonValue.controls.doubleValue.invalid\">\n {{FormHelper.getErrorMessage(formGroup.controls.comparisonValue.controls.doubleValue)}}\n </mat-error>\n </mat-form-field>\n </div>\n</ng-template>\n\n<ng-template #dateTimeTemplate>\n <div *ngIf=\"formGroup.controls.comparisonValue.controls.doubleValue\" class=\"targeting-rule-component datetime\">\n <app-date-time-picker [formControl]=\"formGroup.controls.comparisonValue.controls.doubleValue\"\n dateTooltip=\"Comparison value (date)\" timeTooltip=\"Comparison value (time)\" />\n </div>\n</ng-template>\n\n\n<mat-menu #moreMenu>\n <a mat-menu-item (click)=\"expandList()\"><mat-icon>edit_note</mat-icon>Advanced editor</a>\n <a mat-menu-item (click)=\"copyValuesAsCsv()\"><mat-icon>content_copy</mat-icon>Copy as CSV (values only)</a>\n <a mat-menu-item (click)=\"removeAll()\" [disabled]=\"readOnly\"><mat-icon>delete_outline</mat-icon>Remove\n all</a>\n</mat-menu>", styles: [".targeting-rule-line{display:flex;flex-wrap:wrap;margin:2px 0}.targeting-rule-line .wrapper-group{display:flex;flex-wrap:wrap}.targeting-rule-line .wrapper-group.grow{flex-grow:1}.targeting-rule-component{margin:2px 0;width:212px}.targeting-rule-component[hidden]{display:none}.targeting-rule-component.small{width:102px}.targeting-rule-component.grow{flex-grow:1}.targeting-rule-component.pad-right{margin-right:8px}.targeting-rule-component mat-form-field{width:100%;font-size:12px}.delete-button{margin-top:4px;color:#b1b1b1}.delete-button mat-icon{font-size:18px;height:18px;width:18px}.explanation-wrapper{display:flex;margin-top:2px}.explanation-wrapper .explanation{min-width:44px;margin-top:6px;margin-right:8px}@media (max-width: 500px){.targeting-rule-component{max-width:calc(100% - 4px);width:160px}.targeting-rule-component.small{width:78px}.targeting-rule-component.pad-right{margin-right:4px}}\n", ".mat-mdc-chip.mat-mdc-standard-chip{--mdc-chip-container-height: 24px}.targeting-rule-line{--mdc-text-button-container-height: 24px;--mdc-filled-button-container-height: 24px;--mdc-outlined-button-container-height: 24px;--mdc-protected-button-container-height: 24px;--mat-text-button-touch-target-display: none;--mat-filled-button-touch-target-display: none;--mat-protected-button-touch-target-display: none;--mat-outlined-button-touch-target-display: none}.targeting-rule-component.datetime{width:auto;margin:0}mat-chip-row.invalid{background-color:red}.show-all{font-size:.8em;margin-left:4px}.input-button{--mat-icon-button-touch-target-display: none;color:#00000070;margin-right:4px;padding:0;height:24px;width:24px;line-height:1;display:inline-flex;align-items:center;justify-content:center}.input-button .mat-mdc-icon-button.mat-mdc-button-base{--mdc-icon-button-state-layer-size: 28px;width:var(--mdc-icon-button-state-layer-size);height:var(--mdc-icon-button-state-layer-size);padding:2px}.input-button mat-icon{font-size:20px;height:20px;width:20px}.prefix-button{--mat-icon-button-touch-target-display: none;color:#00000070;margin-left:4px;margin-right:2px;height:20px;width:20px;padding:0;line-height:1;display:inline-flex;align-items:center;justify-content:center}.prefix-button .mat-mdc-icon-button.mat-mdc-button-base{--mdc-icon-button-state-layer-size: 28px;width:var(--mdc-icon-button-state-layer-size);height:var(--mdc-icon-button-state-layer-size);padding:2px}.prefix-button mat-icon{font-size:18px;height:18px;width:18px}.chip{background-color:#f1f1f1}.chip mat-icon{color:#8d8d8d}\n"], dependencies: [{ kind: "directive", type: i4.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i4.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i4.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { kind: "directive", type: i4.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { kind: "directive", type: i5.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i5.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i5.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i5.NumberValueAccessor, selector: "input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]" }, { kind: "directive", type: i5.SelectControlValueAccessor, selector: "select:not([multiple])[formControlName],select:not([multiple])[formControl],select:not([multiple])[ngModel]", inputs: ["compareWith"] }, { kind: "directive", type: i5.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i5.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i5.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "component", type: i6.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i6.MatError, selector: "mat-error, [matError]", inputs: ["id"] }, { kind: "directive", type: i6.MatPrefix, selector: "[matPrefix], [matIconPrefix], [matTextPrefix]", inputs: ["matTextPrefix"] }, { kind: "directive", type: i6.MatSuffix, selector: "[matSuffix], [matIconSuffix], [matTextSuffix]", inputs: ["matTextSuffix"] }, { kind: "component", type: i7.MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", exportAs: ["matButton"] }, { kind: "component", type: i7.MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }, { kind: "directive", type: i8.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { kind: "component", type: i9.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: i10.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "component", type: i11.MatChipGrid, selector: "mat-chip-grid", inputs: ["disabled", "placeholder", "required", "value", "errorStateMatcher"], outputs: ["change", "valueChange"] }, { kind: "directive", type: i11.MatChipInput, selector: "input[matChipInputFor]", inputs: ["matChipInputFor", "matChipInputAddOnBlur", "matChipInputSeparatorKeyCodes", "placeholder", "id", "disabled"], outputs: ["matChipInputTokenEnd"], exportAs: ["matChipInput", "matChipInputFor"] }, { kind: "directive", type: i11.MatChipRemove, selector: "[matChipRemove]" }, { kind: "component", type: i11.MatChipRow, selector: "mat-chip-row, [mat-chip-row], mat-basic-chip-row, [mat-basic-chip-row]", inputs: ["editable"], outputs: ["edited"] }, { kind: "component", type: i12.MatMenu, selector: "mat-menu", inputs: ["backdropClass", "aria-label", "aria-labelledby", "aria-describedby", "xPosition", "yPosition", "overlapTrigger", "hasBackdrop", "class", "classList"], outputs: ["closed", "close"], exportAs: ["matMenu"] }, { kind: "component", type: i12.MatMenuItem, selector: "[mat-menu-item]", inputs: ["role", "disabled", "disableRipple"], exportAs: ["matMenuItem"] }, { kind: "directive", type: i12.MatMenuTrigger, selector: "[mat-menu-trigger-for], [matMenuTriggerFor]", inputs: ["mat-menu-trigger-for", "matMenuTriggerFor", "matMenuTriggerData", "matMenuTriggerRestoreFocus"], outputs: ["menuOpened", "onMenuOpen", "menuClosed", "onMenuClose"], exportAs: ["matMenuTrigger"] }, { kind: "directive", type: i13.InputDisplayNormalizerDirective, selector: "input[inputDisplayNormalizer]" }, { kind: "component", type: i14.ConditionChipComponent, selector: "app-condition-chip", inputs: ["targetingRuleIndex", "conditionIndex"] }, { kind: "component", type: i15.DateTimePickerComponent, selector: "app-date-time-picker", inputs: ["dateTooltip", "timeTooltip"] }, { kind: "pipe", type: i4.SlicePipe, name: "slice" }, { kind: "pipe", type: i4.KeyValuePipe, name: "keyvalue" }] }); }
|
|
424
424
|
}
|
|
425
425
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.1", ngImport: i0, type: UserConditionComponent, decorators: [{
|
|
426
426
|
type: Component,
|
|
427
427
|
args: [{ selector: 'app-user-condition', providers: [
|
|
428
428
|
{ provide: DateAdapter, useClass: AppDateAdapter }
|
|
429
|
-
], template: "<div class=\"targeting-rule-line smallest-form-field\">\n <div class=\"explanation-wrapper\">\n <app-condition-chip [targetingRuleIndex]=\"targetingRuleIndex\"\n [conditionIndex]=\"conditionIndex\"></app-condition-chip>\n\n <div class=\"explanation\"><a href=\"https://configcat.com/docs/V2/targeting/targeting-rule/user-condition/\"\n target=\"_blank\" rel=\"noopener noreferrer\" class=\"user-link\">user's</a></div>\n </div>\n\n <div class=\"wrapper-group\">\n <div class=\"wrapper-group\">\n <div class=\"targeting-rule-component pad-right\"\n [ngClass]=\"{'small': defaultComparisonAttributes.indexOf(formGroup.controls.comparisonAttribute.value) === -1}\">\n <mat-form-field appearance=\"outline\" subscriptSizing=\"dynamic\">\n <select matNativeControl (change)=\"attributeChanged($event)\"\n [disabled]=\"formGroup.controls.comparisonAttribute.disabled\" matTooltip=\"Comparison attribute\">\n <option *ngFor=\"let comparisonAttribute of defaultComparisonAttributes\"\n [selected]=\"comparisonAttribute === formGroup.controls.comparisonAttribute.value\">\n {{comparisonAttribute}}</option>\n <option\n [selected]=\"defaultComparisonAttributes.indexOf(formGroup.controls.comparisonAttribute.value) === -1\">\n Custom\n </option>\n </select>\n </mat-form-field>\n </div>\n <div class=\"targeting-rule-component pad-right small\"\n [hidden]=\"defaultComparisonAttributes.indexOf(formGroup.controls.comparisonAttribute.value) !== -1\">\n <mat-form-field appearance=\"outline\" subscriptSizing=\"dynamic\">\n <input matInput type=\"text\" (blur)=\"calcComparators(true)\"\n [formControl]=\"formGroup.controls.comparisonAttribute\" matTooltip=\"Custom comparison attribute\">\n <mat-error *ngIf=\"formGroup.controls.comparisonAttribute.invalid\">\n {{FormHelper.getErrorMessage(formGroup.controls.comparisonAttribute)}}\n </mat-error>\n </mat-form-field>\n </div>\n </div>\n\n <div class=\"targeting-rule-component pad-right comparator\">\n <mat-form-field appearance=\"outline\" subscriptSizing=\"dynamic\">\n <select matNativeControl (change)=\"comparatorChanged(selectedComparator)\"\n [(ngModel)]=\"selectedComparator\" [disabled]=\"readOnly\" matTooltip=\"Comparator\">\n <optgroup *ngFor=\"let group of comparatorSuggestions | keyvalue: keepOrder\"\n [label]=\"' ' + group.key\">\n <option *ngFor=\"let comparator of group.value\" [ngValue]=\"comparator.value\">\n {{comparator.label}}\n </option>\n </optgroup>\n <optgroup [label]=\"comparatorSeparator\"></optgroup>\n <option value=\"showall\"> SHOW ALL COMPARATORS </option>\n </select>\n <button matSuffix class=\"input-button\" type=\"button\" mat-icon-button matTooltip=\"All comparators\"\n (click)=\"compDialog()\"><mat-icon>list_alt</mat-icon></button>\n <mat-error *ngIf=\"formGroup.controls.comparator.invalid\">\n {{FormHelper.getErrorMessage(formGroup.controls.comparator)}}\n </mat-error>\n </mat-form-field>\n </div>\n </div>\n <ng-container [ngSwitch]=\"rolloutRuleComparatorType\">\n <ng-container *ngSwitchCase=\"RolloutRuleComparatorV2Type.String\"\n [ngTemplateOutlet]=\"textTemplate\"></ng-container>\n <ng-container *ngSwitchCase=\"RolloutRuleComparatorV2Type.Semver\"\n [ngTemplateOutlet]=\"semverTemplate\"></ng-container>\n <ng-container *ngSwitchCase=\"RolloutRuleComparatorV2Type.StringList\"\n [ngTemplateOutlet]=\"listTemplate\"></ng-container>\n <ng-container *ngSwitchCase=\"RolloutRuleComparatorV2Type.SemverList\"\n [ngTemplateOutlet]=\"listTemplate\"></ng-container>\n <ng-container *ngSwitchCase=\"RolloutRuleComparatorV2Type.Number\"\n [ngTemplateOutlet]=\"numberTemplate\"></ng-container>\n <ng-container *ngSwitchCase=\"RolloutRuleComparatorV2Type.DateTime\"\n [ngTemplateOutlet]=\"dateTimeTemplate\"></ng-container>\n </ng-container>\n\n</div>\n\n<ng-template #textTemplate>\n <div *ngIf=\"formGroup.controls.comparisonValue.controls.stringValue\" class=\"targeting-rule-component grow\">\n <mat-form-field appearance=\"outline\" subscriptSizing=\"dynamic\">\n <input matInput type=\"text\" [formControl]=\"formGroup.controls.comparisonValue.controls.stringValue\"\n matTooltip=\"Comparison value (text)\" placeholder=\"Add text ...\" />\n <button matPrefix class=\"prefix-button\" type=\"button\" mat-icon-button *ngIf=\"isClearTextComparatorSelected\"\n (click)=\"openCleartextInfoDialog()\"\n matTooltip=\"This comparison value won't be hashed. Click for more info.\"><mat-icon>lock_open_right</mat-icon></button>\n <button matSuffix class=\"input-button\" type=\"button\" mat-icon-button matTooltip=\"Advanced editor\"\n (click)=\"expandText()\"><mat-icon>edit_note</mat-icon></button>\n <mat-error *ngIf=\"formGroup.controls.comparisonValue.controls.stringValue.invalid\">\n {{FormHelper.getErrorMessage(formGroup.controls.comparisonValue.controls.stringValue)}}\n </mat-error>\n </mat-form-field>\n </div>\n</ng-template>\n\n\n<ng-template #semverTemplate>\n <div *ngIf=\"formGroup.controls.comparisonValue.controls.stringValue\" class=\"targeting-rule-component grow\">\n <mat-form-field appearance=\"outline\" subscriptSizing=\"dynamic\">\n <input matInput type=\"text\" [formControl]=\"formGroup.controls.comparisonValue.controls.stringValue\"\n matTooltip=\"Comparison value (semantic version)\" placeholder=\"Add semantic version ... (1.2.3)\" />\n <mat-error *ngIf=\"formGroup.controls.comparisonValue.controls.stringValue.invalid\">\n {{FormHelper.getErrorMessage(formGroup.controls.comparisonValue.controls.stringValue)}}\n </mat-error>\n </mat-form-field>\n </div>\n</ng-template>\n\n<ng-template #listTemplate>\n <div *ngIf=\"formGroup.controls.comparisonValue.controls.listValue\"\n class=\"targeting-rule-component grow small-chip-input top-icon-suffix\">\n <mat-form-field appearance=\"outline\" subscriptSizing=\"dynamic\">\n <mat-chip-grid #chipGrid [formControl]=\"fakeFormControl\" [errorStateMatcher]=\"errorStateMatcher\">\n <span class=\"chip-container\"\n *ngFor=\"let listValueItem of formGroup.controls.comparisonValue.controls.listValue.controls | slice:0:20; let i = index\"\n [matTooltip]=\"getListValueItemTooltipMessage(listValueItem)\">\n <mat-chip-row (removed)=\"remove(i)\" [disabled]=\"readOnly\" [removable]=\"!readOnly\" class=\"chip\"\n [editable]=\"!readOnly\" (edited)=\"edit(i, $event)\"\n [ngClass]=\"{'invalid': isListValueItemInvalid(listValueItem)}\">\n\n {{listValueItem.controls.value.value}}\n\n <button type=\"button\" matChipRemove *ngIf=\"!readOnly\">\n <mat-icon>cancel</mat-icon>\n </button>\n </mat-chip-row>\n </span>\n <button mat-stroked-button class=\"show-all\" type=\"button\"\n *ngIf=\"formGroup.controls.comparisonValue.controls.listValue.controls.length > 20\"\n (click)=\"expandList()\">\n show all {{formGroup.controls.comparisonValue.controls.listValue.controls.length}}\n items</button>\n <input [disabled]=\"readOnly\" [placeholder]=\"!readOnly ? 'Add item to list ...' : ''\"\n [matChipInputFor]=\"chipGrid\" [matChipInputSeparatorKeyCodes]=\"separatorKeysCodes\"\n matChipInputAddOnBlur (matChipInputTokenEnd)=\"add($event)\" matTooltip=\"Comparison values (list)\" />\n </mat-chip-grid>\n <button matIconPrefix class=\"prefix-button\" type=\"button\" mat-icon-button *ngIf=\"isClearTextComparatorSelected\"\n (click)=\"openCleartextInfoDialog()\"\n matTooltip=\"This comparison value won't be hashed. Click for more info.\"><mat-icon>lock_open_right</mat-icon></button>\n <button matIconSuffix class=\"input-button\" type=\"button\" mat-icon-button matTooltip=\"More...\"\n [matMenuTriggerFor]=\"moreMenu\"><mat-icon>more_vert</mat-icon></button>\n <button matIconSuffix class=\"input-button\" type=\"button\" mat-icon-button matTooltip=\"Advanced editor\"\n (click)=\"expandList()\"><mat-icon>edit_note</mat-icon></button>\n <mat-error\n *ngIf=\"formGroup.controls.comparisonValue.controls.listValue.invalid && formGroup.controls.comparisonValue.controls.listValue.errors\">\n {{FormHelper.getErrorMessage(formGroup.controls.comparisonValue.controls.listValue)}}\n </mat-error>\n <mat-error\n *ngIf=\"formGroup.controls.comparisonValue.controls.listValue.invalid && !formGroup.controls.comparisonValue.controls.listValue.errors\">\n Invalid items\n </mat-error>\n </mat-form-field>\n </div>\n</ng-template>\n\n<ng-template #numberTemplate>\n <div *ngIf=\"formGroup.controls.comparisonValue.controls.doubleValue\" class=\"targeting-rule-component grow\">\n <mat-form-field appearance=\"outline\" subscriptSizing=\"dynamic\">\n <input matInput type=\"number\" [formControl]=\"formGroup.controls.comparisonValue.controls.doubleValue\"\n matTooltip=\"Comparison value (number)\" placeholder=\"Add number ...\" inputDisplayNormalizer />\n <mat-error *ngIf=\"formGroup.controls.comparisonValue.controls.doubleValue.invalid\">\n {{FormHelper.getErrorMessage(formGroup.controls.comparisonValue.controls.doubleValue)}}\n </mat-error>\n </mat-form-field>\n </div>\n</ng-template>\n\n<ng-template #dateTimeTemplate>\n <div *ngIf=\"formGroup.controls.comparisonValue.controls.doubleValue\" class=\"targeting-rule-component datetime\">\n <app-date-time-picker [formControl]=\"formGroup.controls.comparisonValue.controls.doubleValue\"\n dateTooltip=\"Comparison value (date)\" timeTooltip=\"Comparison value (time)\" />\n </div>\n</ng-template>\n\n\n<mat-menu #moreMenu>\n <a mat-menu-item (click)=\"expandList()\"><mat-icon>edit_note</mat-icon>Advanced editor</a>\n <a mat-menu-item (click)=\"copyValuesAsCsv()\"><mat-icon>content_copy</mat-icon>Copy as CSV (values only)</a>\n <a mat-menu-item (click)=\"removeAll()\" [disabled]=\"readOnly\"><mat-icon>delete_outline</mat-icon>Remove\n all</a>\n</mat-menu>", styles: [".targeting-rule-line{display:flex;flex-wrap:wrap;margin:2px 0}.targeting-rule-line .wrapper-group{display:flex;flex-wrap:wrap}.targeting-rule-line .wrapper-group.grow{flex-grow:1}.targeting-rule-component{margin:2px 0;width:212px}.targeting-rule-component[hidden]{display:none}.targeting-rule-component.small{width:102px}.targeting-rule-component.grow{flex-grow:1}.targeting-rule-component.pad-right{margin-right:8px}.targeting-rule-component mat-form-field{width:100%;font-size:12px}.delete-button{margin-top:4px;color:#b1b1b1}.delete-button mat-icon{font-size:18px;height:18px;width:18px}.explanation-wrapper{display:flex;margin-top:2px}.explanation-wrapper .explanation{min-width:44px;margin-top:6px;margin-right:8px}@media (max-width: 500px){.targeting-rule-component{max-width:calc(100% - 4px);width:160px}.targeting-rule-component.small{width:78px}.targeting-rule-component.pad-right{margin-right:4px}}\n", ".mat-mdc-chip.mat-mdc-standard-chip{--mdc-chip-container-height: 24px}.targeting-rule-line{--mdc-text-button-container-height: 24px;--mdc-filled-button-container-height: 24px;--mdc-outlined-button-container-height: 24px;--mdc-protected-button-container-height: 24px;--mat-text-button-touch-target-display: none;--mat-filled-button-touch-target-display: none;--mat-protected-button-touch-target-display: none;--mat-outlined-button-touch-target-display: none}.targeting-rule-component.datetime{width:auto;margin:0}mat-chip-row.invalid{background-color:red}.show-all{font-size:.8em;margin-left:4px}.input-button{--mat-icon-button-touch-target-display: none;color:#00000070;margin-right:4px;padding:0;height:24px;width:24px;line-height:1;display:inline-flex;align-items:center;justify-content:center}.input-button .mat-mdc-icon-button.mat-mdc-button-base{--mdc-icon-button-state-layer-size: 28px;width:var(--mdc-icon-button-state-layer-size);height:var(--mdc-icon-button-state-layer-size);padding:2px}.input-button mat-icon{font-size:20px;height:20px;width:20px}.prefix-button{--mat-icon-button-touch-target-display: none;color:#00000070;margin-left:4px;margin-right:2px;height:20px;width:20px;padding:0;line-height:1;display:inline-flex;align-items:center;justify-content:center}.prefix-button .mat-mdc-icon-button.mat-mdc-button-base{--mdc-icon-button-state-layer-size: 28px;width:var(--mdc-icon-button-state-layer-size);height:var(--mdc-icon-button-state-layer-size);padding:2px}.prefix-button mat-icon{font-size:18px;height:18px;width:18px}.chip{background-color:#f1f1f1}.chip mat-icon{color:#8d8d8d}\n"] }]
|
|
429
|
+
], template: "<div class=\"targeting-rule-line smallest-form-field\">\n <div class=\"explanation-wrapper\">\n <app-condition-chip [targetingRuleIndex]=\"targetingRuleIndex\"\n [conditionIndex]=\"conditionIndex\"></app-condition-chip>\n\n <div class=\"explanation\"><a href=\"https://configcat.com/docs/targeting/targeting-rule/user-condition/\"\n target=\"_blank\" rel=\"noopener noreferrer\" class=\"user-link\">user's</a></div>\n </div>\n\n <div class=\"wrapper-group\">\n <div class=\"wrapper-group\">\n <div class=\"targeting-rule-component pad-right\"\n [ngClass]=\"{'small': defaultComparisonAttributes.indexOf(formGroup.controls.comparisonAttribute.value) === -1}\">\n <mat-form-field appearance=\"outline\" subscriptSizing=\"dynamic\">\n <select matNativeControl (change)=\"attributeChanged($event)\"\n [disabled]=\"formGroup.controls.comparisonAttribute.disabled\" matTooltip=\"Comparison attribute\">\n <option *ngFor=\"let comparisonAttribute of defaultComparisonAttributes\"\n [selected]=\"comparisonAttribute === formGroup.controls.comparisonAttribute.value\">\n {{comparisonAttribute}}</option>\n <option\n [selected]=\"defaultComparisonAttributes.indexOf(formGroup.controls.comparisonAttribute.value) === -1\">\n Custom\n </option>\n </select>\n </mat-form-field>\n </div>\n <div class=\"targeting-rule-component pad-right small\"\n [hidden]=\"defaultComparisonAttributes.indexOf(formGroup.controls.comparisonAttribute.value) !== -1\">\n <mat-form-field appearance=\"outline\" subscriptSizing=\"dynamic\">\n <input matInput type=\"text\" (blur)=\"calcComparators(true)\"\n [formControl]=\"formGroup.controls.comparisonAttribute\" matTooltip=\"Custom comparison attribute\">\n <mat-error *ngIf=\"formGroup.controls.comparisonAttribute.invalid\">\n {{FormHelper.getErrorMessage(formGroup.controls.comparisonAttribute)}}\n </mat-error>\n </mat-form-field>\n </div>\n </div>\n\n <div class=\"targeting-rule-component pad-right comparator\">\n <mat-form-field appearance=\"outline\" subscriptSizing=\"dynamic\">\n <select matNativeControl (change)=\"comparatorChanged(selectedComparator)\"\n [(ngModel)]=\"selectedComparator\" [disabled]=\"readOnly\" matTooltip=\"Comparator\">\n <optgroup *ngFor=\"let group of comparatorSuggestions | keyvalue: keepOrder\"\n [label]=\"' ' + group.key\">\n <option *ngFor=\"let comparator of group.value\" [ngValue]=\"comparator.value\">\n {{comparator.label}}\n </option>\n </optgroup>\n <optgroup [label]=\"comparatorSeparator\"></optgroup>\n <option value=\"showall\"> SHOW ALL COMPARATORS </option>\n </select>\n <button matSuffix class=\"input-button\" type=\"button\" mat-icon-button matTooltip=\"All comparators\"\n (click)=\"compDialog()\"><mat-icon>list_alt</mat-icon></button>\n <mat-error *ngIf=\"formGroup.controls.comparator.invalid\">\n {{FormHelper.getErrorMessage(formGroup.controls.comparator)}}\n </mat-error>\n </mat-form-field>\n </div>\n </div>\n <ng-container [ngSwitch]=\"rolloutRuleComparatorType\">\n <ng-container *ngSwitchCase=\"RolloutRuleComparatorV2Type.String\"\n [ngTemplateOutlet]=\"textTemplate\"></ng-container>\n <ng-container *ngSwitchCase=\"RolloutRuleComparatorV2Type.Semver\"\n [ngTemplateOutlet]=\"semverTemplate\"></ng-container>\n <ng-container *ngSwitchCase=\"RolloutRuleComparatorV2Type.StringList\"\n [ngTemplateOutlet]=\"listTemplate\"></ng-container>\n <ng-container *ngSwitchCase=\"RolloutRuleComparatorV2Type.SemverList\"\n [ngTemplateOutlet]=\"listTemplate\"></ng-container>\n <ng-container *ngSwitchCase=\"RolloutRuleComparatorV2Type.Number\"\n [ngTemplateOutlet]=\"numberTemplate\"></ng-container>\n <ng-container *ngSwitchCase=\"RolloutRuleComparatorV2Type.DateTime\"\n [ngTemplateOutlet]=\"dateTimeTemplate\"></ng-container>\n </ng-container>\n\n</div>\n\n<ng-template #textTemplate>\n <div *ngIf=\"formGroup.controls.comparisonValue.controls.stringValue\" class=\"targeting-rule-component grow\">\n <mat-form-field appearance=\"outline\" subscriptSizing=\"dynamic\">\n <input matInput type=\"text\" [formControl]=\"formGroup.controls.comparisonValue.controls.stringValue\"\n matTooltip=\"Comparison value (text)\" placeholder=\"Add text ...\" />\n <button matPrefix class=\"prefix-button\" type=\"button\" mat-icon-button *ngIf=\"isClearTextComparatorSelected\"\n (click)=\"openCleartextInfoDialog()\"\n matTooltip=\"This comparison value won't be hashed. Click for more info.\"><mat-icon>lock_open_right</mat-icon></button>\n <button matSuffix class=\"input-button\" type=\"button\" mat-icon-button matTooltip=\"Advanced editor\"\n (click)=\"expandText()\"><mat-icon>edit_note</mat-icon></button>\n <mat-error *ngIf=\"formGroup.controls.comparisonValue.controls.stringValue.invalid\">\n {{FormHelper.getErrorMessage(formGroup.controls.comparisonValue.controls.stringValue)}}\n </mat-error>\n </mat-form-field>\n </div>\n</ng-template>\n\n\n<ng-template #semverTemplate>\n <div *ngIf=\"formGroup.controls.comparisonValue.controls.stringValue\" class=\"targeting-rule-component grow\">\n <mat-form-field appearance=\"outline\" subscriptSizing=\"dynamic\">\n <input matInput type=\"text\" [formControl]=\"formGroup.controls.comparisonValue.controls.stringValue\"\n matTooltip=\"Comparison value (semantic version)\" placeholder=\"Add semantic version ... (1.2.3)\" />\n <mat-error *ngIf=\"formGroup.controls.comparisonValue.controls.stringValue.invalid\">\n {{FormHelper.getErrorMessage(formGroup.controls.comparisonValue.controls.stringValue)}}\n </mat-error>\n </mat-form-field>\n </div>\n</ng-template>\n\n<ng-template #listTemplate>\n <div *ngIf=\"formGroup.controls.comparisonValue.controls.listValue\"\n class=\"targeting-rule-component grow small-chip-input top-icon-suffix\">\n <mat-form-field appearance=\"outline\" subscriptSizing=\"dynamic\">\n <mat-chip-grid #chipGrid [formControl]=\"fakeFormControl\" [errorStateMatcher]=\"errorStateMatcher\">\n <span class=\"chip-container\"\n *ngFor=\"let listValueItem of formGroup.controls.comparisonValue.controls.listValue.controls | slice:0:20; let i = index\"\n [matTooltip]=\"getListValueItemTooltipMessage(listValueItem)\">\n <mat-chip-row (removed)=\"remove(i)\" [disabled]=\"readOnly\" [removable]=\"!readOnly\" class=\"chip\"\n [editable]=\"!readOnly\" (edited)=\"edit(i, $event)\"\n [ngClass]=\"{'invalid': isListValueItemInvalid(listValueItem)}\">\n\n {{listValueItem.controls.value.value}}\n\n <button type=\"button\" matChipRemove *ngIf=\"!readOnly\">\n <mat-icon>cancel</mat-icon>\n </button>\n </mat-chip-row>\n </span>\n <button mat-stroked-button class=\"show-all\" type=\"button\"\n *ngIf=\"formGroup.controls.comparisonValue.controls.listValue.controls.length > 20\"\n (click)=\"expandList()\">\n show all {{formGroup.controls.comparisonValue.controls.listValue.controls.length}}\n items</button>\n <input [disabled]=\"readOnly\" [placeholder]=\"!readOnly ? 'Add item to list ...' : ''\"\n [matChipInputFor]=\"chipGrid\" [matChipInputSeparatorKeyCodes]=\"separatorKeysCodes\"\n matChipInputAddOnBlur (matChipInputTokenEnd)=\"add($event)\" matTooltip=\"Comparison values (list)\" />\n </mat-chip-grid>\n <button matIconPrefix class=\"prefix-button\" type=\"button\" mat-icon-button *ngIf=\"isClearTextComparatorSelected\"\n (click)=\"openCleartextInfoDialog()\"\n matTooltip=\"This comparison value won't be hashed. Click for more info.\"><mat-icon>lock_open_right</mat-icon></button>\n <button matIconSuffix class=\"input-button\" type=\"button\" mat-icon-button matTooltip=\"More...\"\n [matMenuTriggerFor]=\"moreMenu\"><mat-icon>more_vert</mat-icon></button>\n <button matIconSuffix class=\"input-button\" type=\"button\" mat-icon-button matTooltip=\"Advanced editor\"\n (click)=\"expandList()\"><mat-icon>edit_note</mat-icon></button>\n <mat-error\n *ngIf=\"formGroup.controls.comparisonValue.controls.listValue.invalid && formGroup.controls.comparisonValue.controls.listValue.errors\">\n {{FormHelper.getErrorMessage(formGroup.controls.comparisonValue.controls.listValue)}}\n </mat-error>\n <mat-error\n *ngIf=\"formGroup.controls.comparisonValue.controls.listValue.invalid && !formGroup.controls.comparisonValue.controls.listValue.errors\">\n Invalid items\n </mat-error>\n </mat-form-field>\n </div>\n</ng-template>\n\n<ng-template #numberTemplate>\n <div *ngIf=\"formGroup.controls.comparisonValue.controls.doubleValue\" class=\"targeting-rule-component grow\">\n <mat-form-field appearance=\"outline\" subscriptSizing=\"dynamic\">\n <input matInput type=\"number\" [formControl]=\"formGroup.controls.comparisonValue.controls.doubleValue\"\n matTooltip=\"Comparison value (number)\" placeholder=\"Add number ...\" inputDisplayNormalizer />\n <mat-error *ngIf=\"formGroup.controls.comparisonValue.controls.doubleValue.invalid\">\n {{FormHelper.getErrorMessage(formGroup.controls.comparisonValue.controls.doubleValue)}}\n </mat-error>\n </mat-form-field>\n </div>\n</ng-template>\n\n<ng-template #dateTimeTemplate>\n <div *ngIf=\"formGroup.controls.comparisonValue.controls.doubleValue\" class=\"targeting-rule-component datetime\">\n <app-date-time-picker [formControl]=\"formGroup.controls.comparisonValue.controls.doubleValue\"\n dateTooltip=\"Comparison value (date)\" timeTooltip=\"Comparison value (time)\" />\n </div>\n</ng-template>\n\n\n<mat-menu #moreMenu>\n <a mat-menu-item (click)=\"expandList()\"><mat-icon>edit_note</mat-icon>Advanced editor</a>\n <a mat-menu-item (click)=\"copyValuesAsCsv()\"><mat-icon>content_copy</mat-icon>Copy as CSV (values only)</a>\n <a mat-menu-item (click)=\"removeAll()\" [disabled]=\"readOnly\"><mat-icon>delete_outline</mat-icon>Remove\n all</a>\n</mat-menu>", styles: [".targeting-rule-line{display:flex;flex-wrap:wrap;margin:2px 0}.targeting-rule-line .wrapper-group{display:flex;flex-wrap:wrap}.targeting-rule-line .wrapper-group.grow{flex-grow:1}.targeting-rule-component{margin:2px 0;width:212px}.targeting-rule-component[hidden]{display:none}.targeting-rule-component.small{width:102px}.targeting-rule-component.grow{flex-grow:1}.targeting-rule-component.pad-right{margin-right:8px}.targeting-rule-component mat-form-field{width:100%;font-size:12px}.delete-button{margin-top:4px;color:#b1b1b1}.delete-button mat-icon{font-size:18px;height:18px;width:18px}.explanation-wrapper{display:flex;margin-top:2px}.explanation-wrapper .explanation{min-width:44px;margin-top:6px;margin-right:8px}@media (max-width: 500px){.targeting-rule-component{max-width:calc(100% - 4px);width:160px}.targeting-rule-component.small{width:78px}.targeting-rule-component.pad-right{margin-right:4px}}\n", ".mat-mdc-chip.mat-mdc-standard-chip{--mdc-chip-container-height: 24px}.targeting-rule-line{--mdc-text-button-container-height: 24px;--mdc-filled-button-container-height: 24px;--mdc-outlined-button-container-height: 24px;--mdc-protected-button-container-height: 24px;--mat-text-button-touch-target-display: none;--mat-filled-button-touch-target-display: none;--mat-protected-button-touch-target-display: none;--mat-outlined-button-touch-target-display: none}.targeting-rule-component.datetime{width:auto;margin:0}mat-chip-row.invalid{background-color:red}.show-all{font-size:.8em;margin-left:4px}.input-button{--mat-icon-button-touch-target-display: none;color:#00000070;margin-right:4px;padding:0;height:24px;width:24px;line-height:1;display:inline-flex;align-items:center;justify-content:center}.input-button .mat-mdc-icon-button.mat-mdc-button-base{--mdc-icon-button-state-layer-size: 28px;width:var(--mdc-icon-button-state-layer-size);height:var(--mdc-icon-button-state-layer-size);padding:2px}.input-button mat-icon{font-size:20px;height:20px;width:20px}.prefix-button{--mat-icon-button-touch-target-display: none;color:#00000070;margin-left:4px;margin-right:2px;height:20px;width:20px;padding:0;line-height:1;display:inline-flex;align-items:center;justify-content:center}.prefix-button .mat-mdc-icon-button.mat-mdc-button-base{--mdc-icon-button-state-layer-size: 28px;width:var(--mdc-icon-button-state-layer-size);height:var(--mdc-icon-button-state-layer-size);padding:2px}.prefix-button mat-icon{font-size:18px;height:18px;width:18px}.chip{background-color:#f1f1f1}.chip mat-icon{color:#8d8d8d}\n"] }]
|
|
430
430
|
}], ctorParameters: () => [{ type: i1.FormGenerator }, { type: i2.MatDialog }, { type: i1.ComparisonValueListHelper }, { type: i3.Clipboard }, { type: i1.MessagingService }, { type: i0.ChangeDetectorRef }], propDecorators: { targetingRuleIndex: [{
|
|
431
431
|
type: Input
|
|
432
432
|
}], conditionIndex: [{
|
|
@@ -441,4 +441,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.1", ngImpor
|
|
|
441
441
|
type: ViewChild,
|
|
442
442
|
args: ["chipGrid", { static: false }]
|
|
443
443
|
}] } });
|
|
444
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXNlci1jb25kaXRpb24uY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmctY29uZmlnY2F0LXB1YmxpY2FwaS11aS9zcmMvbGliL3YyL2ZlYXR1cmUtZmxhZy9ldmFsdWF0aW9uLWZvcm11bGEvdGFyZ2V0aW5nLXJ1bGUvY29uZGl0aW9ucy91c2VyLWNvbmRpdGlvbi91c2VyLWNvbmRpdGlvbi5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZy1jb25maWdjYXQtcHVibGljYXBpLXVpL3NyYy9saWIvdjIvZmVhdHVyZS1mbGFnL2V2YWx1YXRpb24tZm9ybXVsYS90YXJnZXRpbmctcnVsZS9jb25kaXRpb25zL3VzZXItY29uZGl0aW9uL3VzZXItY29uZGl0aW9uLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDckQsT0FBTyxFQUFxQixTQUFTLEVBQUUsS0FBSyxFQUFVLFNBQVMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUN2RixPQUFPLEVBQUUsV0FBVyxFQUFhLE1BQU0sZ0JBQWdCLENBQUM7QUFHeEQsT0FBTyxFQUFFLFdBQVcsRUFBcUIsTUFBTSx3QkFBd0IsQ0FBQztBQUV4RSxPQUFPLEVBQ0wsVUFBVSxFQUNWLGNBQWMsRUFBRSxrQkFBa0IsRUFBRSxrQkFBa0IsRUFDSixjQUFjLEVBQ3ZDLDJCQUEyQixFQUErQyxtQkFBbUIsRUFDdkgsTUFBTSw2QkFBNkIsQ0FBQztBQUNyQyxPQUFPLEVBQUUseUJBQXlCLEVBQUUsTUFBTSxpREFBaUQsQ0FBQztBQUM1RixPQUFPLEVBQUUsK0JBQStCLEVBQThCLE1BQU0saUVBQWlFLENBQUM7QUFDOUksT0FBTyxFQUFFLCtCQUErQixFQUE4QixNQUFN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VyxFQUFFLFFBQVEsRUFBRSxjQUFjLEVBQUU7U0FDbkQsc0lDM0ZILGkwV0FrTFc7OzJGRHJGRSxzQkFBc0I7a0JBWGxDLFNBQVM7K0JBQ0Usb0JBQW9CLGFBTW5CO3dCQUNULEVBQUUsT0FBTyxFQUFFLFdBQVcsRUFBRSxRQUFRLEVBQUUsY0FBYyxFQUFFO3FCQUNuRDt5T0FPUSxrQkFBa0I7c0JBQTFCLEtBQUs7Z0JBQ0csY0FBYztzQkFBdEIsS0FBSztnQkFDRyxRQUFRO3NCQUFoQixLQUFLO2dCQUNHLHNCQUFzQjtzQkFBOUIsS0FBSztnQkFDRyxTQUFTO3NCQUFqQixLQUFLO2dCQUd3QyxjQUFjO3NCQUEzRCxTQUFTO3VCQUFDLFVBQVUsRUFBRSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBFTlRFUiwgQ09NTUEgfSBmcm9tICdAYW5ndWxhci9jZGsva2V5Y29kZXMnO1xuaW1wb3J0IHsgQ2hhbmdlRGV0ZWN0b3JSZWYsIENvbXBvbmVudCwgSW5wdXQsIE9uSW5pdCwgVmlld0NoaWxkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBGb3JtQ29udHJvbCwgRm9ybUdyb3VwIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgTWF0Q2hpcElucHV0RXZlbnQsIE1hdENoaXBFZGl0ZWRFdmVudCwgTWF0Q2hpcEdyaWQsIE1hdENoaXBSb3cgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9jaGlwcyc7XG5pbXBvcnQgeyBNYXREaWFsb2cgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9kaWFsb2cnO1xuaW1wb3J0IHsgRGF0ZUFkYXB0ZXIsIEVycm9yU3RhdGVNYXRjaGVyIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvY29yZSc7XG5pbXBvcnQgeyBDbGlwYm9hcmQgfSBmcm9tICdAYW5ndWxhci9jZGsvY2xpcGJvYXJkJztcbmltcG9ydCB7XG4gIEZvcm1IZWxwZXIsIENvbXBhcmlzb25WYWx1ZUxpc3RGb3JtLCBVc2VyQ29uZGl0aW9uRm9ybSwgRm9ybUdlbmVyYXRvcixcbiAgVXNlckNvbXBhcmF0b3IsIFVzZXJDb21wYXJhdG9yVGV4dCwgVXNlckNvbXBhcmF0b3JUeXBlLFxuICBJQ29tcGFyaXNvblZhbHVlTGlzdE1vZGVsLCBJQ29tcGFyaXNvblZhbHVlTW9kZWwsIEFwcERhdGVBZGFwdGVyLFxuICBJRmVhdHVyZUZsYWdMaW1pdGF0aW9ucywgQ29uZmlybWF0aW9uRGlhbG9nQ29tcG9uZW50LCBDb21wYXJpc29uVmFsdWVMaXN0SGVscGVyLCBNZXNzYWdpbmdTZXJ2aWNlLCBJbmZvRGlhbG9nQ29tcG9uZW50XG59IGZyb20gJy4uLy4uLy4uLy4uLy4uLy4uL2Jvb3RzdHJhcCc7XG5pbXBvcnQgeyBDb21wYXJhdG9yRGlhbG9nQ29tcG9uZW50IH0gZnJvbSAnLi9jb21wYXJhdG9yLWRpYWxvZy9jb21wYXJhdG9yLWRpYWxvZy5jb21wb25lbnQnO1xuaW1wb3J0IHsgUG9wb3V0TGlzdEVkaXRvckRpYWxvZ0NvbXBvbmVudCwgUG9wb3V0TGlzdEVkaXRvckRpYWxvZ0RhdGEgfSBmcm9tICcuL3BvcG91dC1saXN0LWVkaXRvci1kaWFsb2cvcG9wb3V0LWxpc3QtZWRpdG9yLWRpYWxvZy5jb21wb25lbnQnO1xuaW1wb3J0IHsgUG9wb3V0VGV4dEVkaXRvckRpYWxvZ0NvbXBvbmVudCwgUG9wb3V0VGV4dEVkaXRvckRpYWxvZ0RhdGEgfSBmcm9tICcuLi8uLi8uLi9wb3BvdXQtdGV4dC1lZGl0b3ItZGlhbG9nL3BvcG91dC10ZXh0LWVkaXRvci1kaWFsb2cuY29tcG9uZW50JztcblxuZXhwb3J0IGNsYXNzIExpc3RWYWx1ZUVycm9yU3RhdGVNYXRjaGVyIGltcGxlbWVudHMgRXJyb3JTdGF0ZU1hdGNoZXIge1xuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGZvcm1Hcm91cDogRm9ybUdyb3VwPFVzZXJDb25kaXRpb25Gb3JtPikgeyB9XG4gIGlzRXJyb3JTdGF0ZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5mb3JtR3JvdXAuY29udHJvbHMuY29tcGFyaXNvblZhbHVlLmNvbnRyb2xzLmxpc3RWYWx1ZT8udG91Y2hlZCAmJiB0aGlzLmZvcm1Hcm91cC5jb250cm9scy5jb21wYXJpc29uVmFsdWUuY29udHJvbHMubGlzdFZhbHVlPy5pbnZhbGlkO1xuICB9XG59XG5cbmVudW0gQ29tcGFyYXRvckdyb3VwIHtcbiAgQ29uZmlkZW50aWFsVGV4dCA9ICdDT05GSURFTlRJQUwgVEVYVCcsXG4gIFRleHQgPSAnVEVYVCcsXG4gIFNlbWFudGljVmVyc2lvbiA9ICdTRU1BTlRJQyBWRVJTSU9OJyxcbiAgTnVtYmVyID0gJ05VTUJFUicsXG4gIERhdGVUaW1lID0gJ0RBVEVUSU1FJyxcbiAgQ29uZmlkZW50aWFsQXJyYXkgPSAnQ09ORklERU5USUFMIEFSUkFZJyxcbiAgQXJyYXkgPSAnQVJSQVknXG59XG5cbmludGVyZmFjZSBJQ29tcGFyYXRvclZhbHVlIHtcbiAgdmFsdWU6IFVzZXJDb21wYXJhdG9yLFxuICBsYWJlbDogVXNlckNvbXBhcmF0b3JUZXh0LFxuICBncm91cDogQ29tcGFyYXRvckdyb3VwLFxuICBpbmRleDogbnVtYmVyLFxufVxuXG5jb25zdCBhbGxDb21wYXJhdG9yczogSUNvbXBhcmF0b3JWYWx1ZVtdID0gW1xuICB7IHZhbHVlOiBVc2VyQ29tcGFyYXRvci5Jc09uZU9mLCBsYWJlbDogVXNlckNvbXBhcmF0b3JUZXh0LklzT25lT2YsIGdyb3VwOiBDb21wYXJhdG9yR3JvdXAuVGV4dCwgaW5kZXg6IDAgfSxcbiAgeyB2YWx1ZTogVXNlckNvbXBhcmF0b3IuSXNOb3RPbmVPZiwgbGFiZWw6IFVzZXJDb21wYXJhdG9yVGV4dC5Jc05vdE9uZU9mLCBncm91cDogQ29tcGFyYXRvckdyb3VwLlRleHQsIGluZGV4OiAxIH0sXG4gIHsgdmFsdWU6IFVzZXJDb21wYXJhdG9yLkNvbnRhaW5zQW55T2YsIGxhYmVsOiBVc2VyQ29tcGFyYXRvclRleHQuQ29udGFpbnNBbnlPZiwgZ3JvdXA6IENvbXBhcmF0b3JHcm91cC5UZXh0LCBpbmRleDogMiB9LFxuICB7IHZhbHVlOiBVc2VyQ29tcGFyYXRvci5Eb2VzTm90Q29udGFpbkFueU9mLCBsYWJlbDogVXNlckNvbXBhcmF0b3JUZXh0LkRvZXNOb3RDb250YWluQW55T2YsIGdyb3VwOiBDb21wYXJhdG9yR3JvdXAuVGV4dCwgaW5kZXg6IDMgfSxcbiAgeyB2YWx1ZTogVXNlckNvbXBhcmF0b3IuU2VtVmVySXNPbmVPZiwgbGFiZWw6IFVzZXJDb21wYXJhdG9yVGV4dC5TZW1WZXJJc09uZU9mLCBncm91cDogQ29tcGFyYXRvckdyb3VwLlNlbWFudGljVmVyc2lvbiwgaW5kZXg6IDQgfSxcbiAgeyB2YWx1ZTogVXNlckNvbXBhcmF0b3IuU2VtVmVySXNOb3RPbmVPZiwgbGFiZWw6IFVzZXJDb21wYXJhdG9yVGV4dC5TZW1WZXJJc05vdE9uZU9mLCBncm91cDogQ29tcGFyYXRvckdyb3VwLlNlbWFudGljVmVyc2lvbiwgaW5kZXg6IDUgfSxcbiAgeyB2YWx1ZTogVXNlckNvbXBhcmF0b3IuU2VtVmVyTGVzcywgbGFiZWw6IFVzZXJDb21wYXJhdG9yVGV4dC5TZW1WZXJMZXNzLCBncm91cDogQ29tcGFyYXRvckdyb3VwLlNlbWFudGljVmVyc2lvbiwgaW5kZXg6IDYgfSxcbiAgeyB2YWx1ZTogVXNlckNvbXBhcmF0b3IuU2VtVmVyTGVzc09yRXF1YWxzLCBsYWJlbDogVXNlckNvbXBhcmF0b3JUZXh0LlNlbVZlckxlc3NPckVxdWFscywgZ3JvdXA6IENvbXBhcmF0b3JHcm91cC5TZW1hbnRpY1ZlcnNpb24sIGluZGV4OiA3IH0sXG4gIHsgdmFsdWU6IFVzZXJDb21wYXJhdG9yLlNlbVZlckdyZWF0ZXIsIGxhYmVsOiBVc2VyQ29tcGFyYXRvclRleHQuU2VtVmVyR3JlYXRlciwgZ3JvdXA6IENvbXBhcmF0b3JHcm91cC5TZW1hbnRpY1ZlcnNpb24sIGluZGV4OiA4IH0sXG4gIHsgdmFsdWU6IFVzZXJDb21wYXJhdG9yLlNlbVZlckdyZWF0ZXJPckVxdWFscywgbGFiZWw6IFVzZXJDb21wYXJhdG9yVGV4dC5TZW1WZXJHcmVhdGVyT3JFcXVhbHMsIGdyb3VwOiBDb21wYXJhdG9yR3JvdXAuU2VtYW50aWNWZXJzaW9uLCBpbmRleDogOSB9LFxuICB7IHZhbHVlOiBVc2VyQ29tcGFyYXRvci5OdW1iZXJFcXVhbHMsIGxhYmVsOiBVc2VyQ29tcGFyYXRvclRleHQuTnVtYmVyRXF1YWxzLCBncm91cDogQ29tcGFyYXRvckdyb3VwLk51bWJlciwgaW5kZXg6IDEwIH0sXG4gIHsgdmFsdWU6IFVzZXJDb21wYXJhdG9yLk51bWJlckRvZXNOb3RFcXVhbCwgbGFiZWw6IFVzZXJDb21wYXJhdG9yVGV4dC5OdW1iZXJEb2VzTm90RXF1YWwsIGdyb3VwOiBDb21wYXJhdG9yR3JvdXAuTnVtYmVyLCBpbmRleDogMTEgfSxcbiAgeyB2YWx1ZTogVXNlckNvbXBhcmF0b3IuTnVtYmVyTGVzcywgbGFiZWw6IFVzZXJDb21wYXJhdG9yVGV4dC5OdW1iZXJMZXNzLCBncm91cDogQ29tcGFyYXRvckdyb3VwLk51bWJlciwgaW5kZXg6IDEyIH0sXG4gIHsgdmFsdWU6IFVzZXJDb21wYXJhdG9yLk51bWJlckxlc3NPckVxdWFscywgbGFiZWw6IFVzZXJDb21wYXJhdG9yVGV4dC5OdW1iZXJMZXNzT3JFcXVhbHMsIGdyb3VwOiBDb21wYXJhdG9yR3JvdXAuTnVtYmVyLCBpbmRleDogMTMgfSxcbiAgeyB2YWx1ZTogVXNlckNvbXBhcmF0b3IuTnVtYmVyR3JlYXRlciwgbGFiZWw6IFVzZXJDb21wYXJhdG9yVGV4dC5OdW1iZXJHcmVhdGVyLCBncm91cDogQ29tcGFyYXRvckdyb3VwLk51bWJlciwgaW5kZXg6IDE0IH0sXG4gIHsgdmFsdWU6IFVzZXJDb21wYXJhdG9yLk51bWJlckdyZWF0ZXJPckVxdWFscywgbGFiZWw6IFVzZXJDb21wYXJhdG9yVGV4dC5OdW1iZXJHcmVhdGVyT3JFcXVhbHMsIGdyb3VwOiBDb21wYXJhdG9yR3JvdXAuTnVtYmVyLCBpbmRleDogMTUgfSxcbiAgeyB2YWx1ZTogVXNlckNvbXBhcmF0b3IuU2Vuc2l0aXZlSXNPbmVPZiwgbGFiZWw6IFVzZXJDb21wYXJhdG9yVGV4dC5TZW5zaXRpdmVJc09uZU9mLCBncm91cDogQ29tcGFyYXRvckdyb3VwLkNvbmZpZGVudGlhbFRleHQsIGluZGV4OiAxNiB9LFxuICB7IHZhbHVlOiBVc2VyQ29tcGFyYXRvci5TZW5zaXRpdmVJc05vdE9uZU9mLCBsYWJlbDogVXNlckNvbXBhcmF0b3JUZXh0LlNlbnNpdGl2ZUlzTm90T25lT2YsIGdyb3VwOiBDb21wYXJhdG9yR3JvdXAuQ29uZmlkZW50aWFsVGV4dCwgaW5kZXg6IDE3IH0sXG4gIHsgdmFsdWU6IFVzZXJDb21wYXJhdG9yLkRhdGVUaW1lQmVmb3JlLCBsYWJlbDogVXNlckNvbXBhcmF0b3JUZXh0LkRhdGVUaW1lQmVmb3JlLCBncm91cDogQ29tcGFyYXRvckdyb3VwLkRhdGVUaW1lLCBpbmRleDogMTggfSxcbiAgeyB2YWx1ZTogVXNlckNvbXBhcmF0b3IuRGF0ZVRpbWVBZnRlciwgbGFiZWw6IFVzZXJDb21wYXJhdG9yVGV4dC5EYXRlVGltZUFmdGVyLCBncm91cDogQ29tcGFyYXRvckdyb3VwLkRhdGVUaW1lLCBpbmRleDogMTkgfSxcbiAgeyB2YWx1ZTogVXNlckNvbXBhcmF0b3IuU2Vuc2l0aXZlVGV4dEVxdWFscywgbGFiZWw6IFVzZXJDb21wYXJhdG9yVGV4dC5TZW5zaXRpdmVUZXh0RXF1YWxzLCBncm91cDogQ29tcGFyYXRvckdyb3VwLkNvbmZpZGVudGlhbFRleHQsIGluZGV4OiAyMCB9LFxuICB7IHZhbHVlOiBVc2VyQ29tcGFyYXRvci5TZW5zaXRpdmVUZXh0RG9lc05vdEVxdWFsLCBsYWJlbDogVXNlckNvbXBhcmF0b3JUZXh0LlNlbnNpdGl2ZVRleHREb2VzTm90RXF1YWwsIGdyb3VwOiBDb21wYXJhdG9yR3JvdXAuQ29uZmlkZW50aWFsVGV4dCwgaW5kZXg6IDIxIH0sXG4gIHsgdmFsdWU6IFVzZXJDb21wYXJhdG9yLlNlbnNpdGl2ZVRleHRTdGFydHNXaXRoQW55T2YsIGxhYmVsOiBVc2VyQ29tcGFyYXRvclRleHQuU2Vuc2l0aXZlVGV4dFN0YXJ0c1dpdGhBbnlPZiwgZ3JvdXA6IENvbXBhcmF0b3JHcm91cC5Db25maWRlbnRpYWxUZXh0LCBpbmRleDogMjIgfSxcbiAgeyB2YWx1ZTogVXNlckNvbXBhcmF0b3IuU2Vuc2l0aXZlVGV4dE5vdFN0YXJ0c1dpdGhBbnlPZiwgbGFiZWw6IFVzZXJDb21wYXJhdG9yVGV4dC5TZW5zaXRpdmVUZXh0Tm90U3RhcnRzV2l0aEFueU9mLCBncm91cDogQ29tcGFyYXRvckdyb3VwLkNvbmZpZGVudGlhbFRleHQsIGluZGV4OiAyMyB9LFxuICB7IHZhbHVlOiBVc2VyQ29tcGFyYXRvci5TZW5zaXRpdmVUZXh0RW5kc1dpdGhBbnlPZiwgbGFiZWw6IFVzZXJDb21wYXJhdG9yVGV4dC5TZW5zaXRpdmVUZXh0RW5kc1dpdGhBbnlPZiwgZ3JvdXA6IENvbXBhcmF0b3JHcm91cC5Db25maWRlbnRpYWxUZXh0LCBpbmRleDogMjQgfSxcbiAgeyB2YWx1ZTogVXNlckNvbXBhcmF0b3IuU2Vuc2l0aXZlVGV4dE5vdEVuZHNXaXRoQW55T2YsIGxhYmVsOiBVc2VyQ29tcGFyYXRvclRleHQuU2Vuc2l0aXZlVGV4dE5vdEVuZHNXaXRoQW55T2YsIGdyb3VwOiBDb21wYXJhdG9yR3JvdXAuQ29uZmlkZW50aWFsVGV4dCwgaW5kZXg6IDI1IH0sXG4gIHsgdmFsdWU6IFVzZXJDb21wYXJhdG9yLlNlbnNpdGl2ZUFycmF5Q29udGFpbnNBbnlPZiwgbGFiZWw6IFVzZXJDb21wYXJhdG9yVGV4dC5TZW5zaXRpdmVBcnJheUNvbnRhaW5zQW55T2YsIGdyb3VwOiBDb21wYXJhdG9yR3JvdXAuQ29uZmlkZW50aWFsQXJyYXksIGluZGV4OiAyNiB9LFxuICB7IHZhbHVlOiBVc2VyQ29tcGFyYXRvci5TZW5zaXRpdmVBcnJheURvZXNOb3RDb250YWluQW55T2YsIGxhYmVsOiBVc2VyQ29tcGFyYXRvclRleHQuU2Vuc2l0aXZlQXJyYXlEb2VzTm90Q29udGFpbkFueU9mLCBncm91cDogQ29tcGFyYXRvckdyb3VwLkNvbmZpZGVudGlhbEFycmF5LCBpbmRleDogMjcgfSxcbiAgeyB2YWx1ZTogVXNlckNvbXBhcmF0b3IuVGV4dEVxdWFscywgbGFiZWw6IFVzZXJDb21wYXJhdG9yVGV4dC5UZXh0RXF1YWxzLCBncm91cDogQ29tcGFyYXRvckdyb3VwLlRleHQsIGluZGV4OiAyOCB9LFxuICB7IHZhbHVlOiBVc2VyQ29tcGFyYXRvci5UZXh0RG9lc05vdEVxdWFsLCBsYWJlbDogVXNlckNvbXBhcmF0b3JUZXh0LlRleHREb2VzTm90RXF1YWwsIGdyb3VwOiBDb21wYXJhdG9yR3JvdXAuVGV4dCwgaW5kZXg6IDI5IH0sXG4gIHsgdmFsdWU6IFVzZXJDb21wYXJhdG9yLlRleHRTdGFydHNXaXRoQW55T2YsIGxhYmVsOiBVc2VyQ29tcGFyYXRvclRleHQuVGV4dFN0YXJ0c1dpdGhBbnlPZiwgZ3JvdXA6IENvbXBhcmF0b3JHcm91cC5UZXh0LCBpbmRleDogMzAgfSxcbiAgeyB2YWx1ZTogVXNlckNvbXBhcmF0b3IuVGV4dE5vdFN0YXJ0c1dpdGhBbnlPZiwgbGFiZWw6IFVzZXJDb21wYXJhdG9yVGV4dC5UZXh0Tm90U3RhcnRzV2l0aEFueU9mLCBncm91cDogQ29tcGFyYXRvckdyb3VwLlRleHQsIGluZGV4OiAzMSB9LFxuICB7IHZhbHVlOiBVc2VyQ29tcGFyYXRvci5UZXh0RW5kc1dpdGhBbnlPZiwgbGFiZWw6IFVzZXJDb21wYXJhdG9yVGV4dC5UZXh0RW5kc1dpdGhBbnlPZiwgZ3JvdXA6IENvbXBhcmF0b3JHcm91cC5UZXh0LCBpbmRleDogMzIgfSxcbiAgeyB2YWx1ZTogVXNlckNvbXBhcmF0b3IuVGV4dE5vdEVuZHNXaXRoQW55T2YsIGxhYmVsOiBVc2VyQ29tcGFyYXRvclRleHQuVGV4dE5vdEVuZHNXaXRoQW55T2YsIGdyb3VwOiBDb21wYXJhdG9yR3JvdXAuVGV4dCwgaW5kZXg6IDMzIH0sXG4gIHsgdmFsdWU6IFVzZXJDb21wYXJhdG9yLkFycmF5Q29udGFpbnNBbnlPZiwgbGFiZWw6IFVzZXJDb21wYXJhdG9yVGV4dC5BcnJheUNvbnRhaW5zQW55T2YsIGdyb3VwOiBDb21wYXJhdG9yR3JvdXAuQXJyYXksIGluZGV4OiAzNCB9LFxuICB7IHZhbHVlOiBVc2VyQ29tcGFyYXRvci5BcnJheURvZXNOb3RDb250YWluQW55T2YsIGxhYmVsOiBVc2VyQ29tcGFyYXRvclRleHQuQXJyYXlEb2VzTm90Q29udGFpbkFueU9mLCBncm91cDogQ29tcGFyYXRvckdyb3VwLkFycmF5LCBpbmRleDogMzUgfSxcbl1cblxuY29uc3QgZGVmYXVsdENvbXBhcmF0b3JJZHMgPSBbMTYsIDE3LCAyMCwgMjEsIDIyLCAyMywgMjQsIDI1LCAyLCAzLCA0LCA1LCA2LCA3LCA4LCA5LCAxMCwgMTEsIDEyLCAxMywgMTQsIDE1LCAxOCwgMTldO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdhcHAtdXNlci1jb25kaXRpb24nLFxuICB0ZW1wbGF0ZVVybDogJy4vdXNlci1jb25kaXRpb24uY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFtcbiAgICAnLi4vLi4vLi4vY29tcG9uZW50cy5zY3NzJyxcbiAgICAnLi91c2VyLWNvbmRpdGlvbi5jb21wb25lbnQuc2NzcydcbiAgXSxcbiAgcHJvdmlkZXJzOiBbXG4gICAgeyBwcm92aWRlOiBEYXRlQWRhcHRlciwgdXNlQ2xhc3M6IEFwcERhdGVBZGFwdGVyIH1cbiAgXSxcbn0pXG5leHBvcnQgY2xhc3MgVXNlckNvbmRpdGlvbkNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XG4gIHJlYWRvbmx5IHNlcGFyYXRvcktleXNDb2RlcyA9IFtFTlRFUiwgQ09NTUFdIGFzIGNvbnN0O1xuXG4gIEZvcm1IZWxwZXIgPSBGb3JtSGVscGVyO1xuXG4gIEBJbnB1dCgpIHRhcmdldGluZ1J1bGVJbmRleDogbnVtYmVyO1xuICBASW5wdXQoKSBjb25kaXRpb25JbmRleDogbnVtYmVyO1xuICBASW5wdXQoKSByZWFkT25seTogYm9vbGVhbjtcbiAgQElucHV0KCkgZmVhdHVyZUZsYWdMaW1pdGF0aW9uczogSUZlYXR1cmVGbGFnTGltaXRhdGlvbnM7XG4gIEBJbnB1dCgpIGZvcm1Hcm91cDogRm9ybUdyb3VwPFVzZXJDb25kaXRpb25Gb3JtPjtcbiAgbWF0Q2hpcEdyaWQ6IE1hdENoaXBHcmlkO1xuXG4gIEBWaWV3Q2hpbGQoXCJjaGlwR3JpZFwiLCB7IHN0YXRpYzogZmFsc2UgfSkgc2V0IHNldE1hdENoaXBHcmlkKG1hdENoaXBHcmlkOiBNYXRDaGlwR3JpZCkge1xuICAgIHRoaXMubWF0Q2hpcEdyaWQgPSBtYXRDaGlwR3JpZDtcbiAgfVxuXG4gIGRlZmF1bHRDb21wYXJpc29uQXR0cmlidXRlcyA9IFsnSWRlbnRpZmllcicsICdFbWFpbCcsICdDb3VudHJ5J107XG5cbiAgZGF0ZVZhbHVlOiBEYXRlO1xuICB0aW1lVmFsdWU6IHN0cmluZztcblxuICBjb21wYXJhdG9yU3VnZ2VzdGlvbnMgPSBuZXcgTWFwPGFueSwgYW55PigpO1xuICBzZWxlY3RlZENvbXBhcmF0b3I6IFVzZXJDb21wYXJhdG9yO1xuICBjb21wYXJhdG9yU2VwYXJhdG9yID0gXCLilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcIjtcblxuICBrZWVwT3JkZXIgPSAoYTogYW55LCBfOiBhbnkpID0+IGE7XG5cbiAgUm9sbG91dFJ1bGVDb21wYXJhdG9yVjJUeXBlID0gVXNlckNvbXBhcmF0b3JUeXBlO1xuICByb2xsb3V0UnVsZUNvbXBhcmF0b3JUeXBlOiBVc2VyQ29tcGFyYXRvclR5cGU7XG4gIGlzQ2xlYXJUZXh0Q29tcGFyYXRvclNlbGVjdGVkOiBib29sZWFuO1xuXG4gIC8vIFRoZSBjaGlwIGdyaWQncyBbZm9ybUNvbnRyb2xdIG9ubHkgYWNjZXB0cyBhIEZvcm1Db250cm9sLiBXZSBoYXZlIGEgRm9ybUFycmF5IChiZWNhdXNlIG9mIHRoZSBuYW1lK2hpbnQpLlxuICAvLyBXZSBoYXZlIHRvIGZha2UgYSBGb3JtQ29udHJvbCBhbmQgbWF0Y2ggdGhhdCBmb3JtQ29udHJvbCdzIGVycm9yc3RhdGUgd2l0aCB0aGUgb3JpZ2luYWwgY29tcG9uZW50J3MgZXJyb3JTdGF0ZS5cbiAgZmFrZUZvcm1Db250cm9sID0gbmV3IEZvcm1Db250cm9sPHN0cmluZz4oJycpO1xuICBlcnJvclN0YXRlTWF0Y2hlcjogTGlzdFZhbHVlRXJyb3JTdGF0ZU1hdGNoZXI7XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBmb3JtR2VuZXJhdG9yOiBGb3JtR2VuZXJhdG9yLFxuICAgIHByaXZhdGUgZGlhbG9nOiBNYXREaWFsb2csXG4gICAgcHJpdmF0ZSBjb21wYXJpc29uVmFsdWVMaXN0SGVscGVyOiBDb21wYXJpc29uVmFsdWVMaXN0SGVscGVyLFxuICAgIHByaXZhdGUgY2xpcGJvYXJkOiBDbGlwYm9hcmQsXG4gICAgcHJpdmF0ZSBtZXNzYWdpbmdTZXJ2aWNlOiBNZXNzYWdpbmdTZXJ2aWNlLFxuICAgIHByaXZhdGUgY2hhbmdlRGV0ZWN0b3JSZWY6IENoYW5nZURldGVjdG9yUmVmKSB7IH1cblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLnJvbGxvdXRSdWxlQ29tcGFyYXRvclR5cGUgPSB0aGlzLmZvcm1HZW5lcmF0b3IuZ2V0Q29tcGFyaXNvblZhbHVlVHlwZSh0aGlzLmZvcm1Hcm91cC5jb250cm9scy5jb21wYXJhdG9yLnZhbHVlKTtcbiAgICB0aGlzLmlzQ2xlYXJUZXh0Q29tcGFyYXRvclNlbGVjdGVkID0gdGhpcy5pc0NsZWFyVGV4dENvbXBhcmF0b3IodGhpcy5mb3JtR3JvdXAuY29udHJvbHMuY29tcGFyYXRvci52YWx1ZSk7XG4gICAgdGhpcy5lcnJvclN0YXRlTWF0Y2hlciA9IG5ldyBMaXN0VmFsdWVFcnJvclN0YXRlTWF0Y2hlcih0aGlzLmZvcm1Hcm91cCk7XG4gICAgdGhpcy5zZWxlY3RlZENvbXBhcmF0b3IgPSB0aGlzLmZvcm1Hcm91cC5jb250cm9scy5jb21wYXJhdG9yLnZhbHVlO1xuICAgIHRoaXMuY2FsY0NvbXBhcmF0b3JzKCk7XG4gIH1cblxuICBhdHRyaWJ1dGVDaGFuZ2VkKGV2ZW50OiBFdmVudCk6IHZvaWQge1xuICAgIGNvbnN0IHZhbHVlID0gKDxIVE1MU2VsZWN0RWxlbWVudD5ldmVudC50YXJnZXQpLnZhbHVlO1xuICAgIGlmICh0aGlzLmRlZmF1bHRDb21wYXJpc29uQXR0cmlidXRlcy5pbmRleE9mKHZhbHVlKSAhPT0gLTEpIHtcbiAgICAgIGlmICh0aGlzLmZvcm1Hcm91cC5jb250cm9scy5jb21wYXJpc29uQXR0cmlidXRlLnZhbHVlICE9PSB2YWx1ZSkge1xuICAgICAgICB0aGlzLmZvcm1Hcm91cC5jb250cm9scy5jb21wYXJpc29uQXR0cmlidXRlLnNldFZhbHVlKHZhbHVlKTtcbiAgICAgICAgdGhpcy5mb3JtR3JvdXAubWFya0FzRGlydHkoKTtcbiAgICAgICAgdGhpcy5jYWxjQ29tcGFyYXRvcnModHJ1ZSk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmICh0aGlzLmZvcm1Hcm91cC5jb250cm9scy5jb21wYXJpc29uQXR0cmlidXRlLnZhbHVlICE9PSAnJykge1xuICAgICAgdGhpcy5mb3JtR3JvdXAuY29udHJvbHMuY29tcGFyaXNvbkF0dHJpYnV0ZS5zZXRWYWx1ZSgnJyk7XG4gICAgICB0aGlzLmZvcm1Hcm91cC5tYXJrQXNEaXJ0eSgpO1xuICAgICAgdGhpcy5jYWxjQ29tcGFyYXRvcnModHJ1ZSk7XG4gICAgfVxuICB9XG5cbiAgY29tcGFyYXRvckNoYW5nZWQodmFsdWU6IGFueSk6IHZvaWQge1xuICAgIGlmICh2YWx1ZSA9PT0gXCJzaG93YWxsXCIpIHtcbiAgICAgIHRoaXMuY2hhbmdlRGV0ZWN0b3JSZWYuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgdGhpcy5zZWxlY3RlZENvbXBhcmF0b3IgPSB0aGlzLmZvcm1Hcm91cC5jb250cm9scy5jb21wYXJhdG9yLnZhbHVlO1xuICAgICAgdGhpcy5jaGFuZ2VEZXRlY3RvclJlZi5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICB0aGlzLmNvbXBEaWFsb2coKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLmZvcm1Hcm91cC5jb250cm9scy5jb21wYXJhdG9yLnNldFZhbHVlKHZhbHVlKTtcbiAgICB0aGlzLmZvcm1Hcm91cC5tYXJrQXNEaXJ0eSgpO1xuICAgIHRoaXMuc2VsZWN0ZWRDb21wYXJhdG9yID0gdmFsdWU7XG4gICAgdGhpcy5pc0NsZWFyVGV4dENvbXBhcmF0b3JTZWxlY3RlZCA9IHRoaXMuaXNDbGVhclRleHRDb21wYXJhdG9yKHRoaXMuZm9ybUdyb3VwLmNvbnRyb2xzLmNvbXBhcmF0b3IudmFsdWUpO1xuXG4gICAgY29uc3Qgb2xkUm9sbG91dFJ1bGVDb21wYXJhdG9yVHlwZSA9IHRoaXMucm9sbG91dFJ1bGVDb21wYXJhdG9yVHlwZTtcbiAgICB0aGlzLnJvbGxvdXRSdWxlQ29tcGFyYXRvclR5cGUgPSB0aGlzLmZvcm1HZW5lcmF0b3IuZ2V0Q29tcGFyaXNvblZhbHVlVHlwZSh0aGlzLmZvcm1Hcm91cC5jb250cm9scy5jb21wYXJhdG9yLnZhbHVlKTtcbiAgICBpZiAob2xkUm9sbG91dFJ1bGVDb21wYXJhdG9yVHlwZSAhPT0gdGhpcy5yb2xsb3V0UnVsZUNvbXBhcmF0b3JUeXBlKSB7XG4gICAgICBjb25zdCBkZWZhdWx0VmFsdWU6IElDb21wYXJpc29uVmFsdWVNb2RlbCA9IHRoaXMucm9sbG91dFJ1bGVDb21wYXJhdG9yVHlwZSA9PT0gVXNlckNvbXBhcmF0b3JUeXBlLkRhdGVUaW1lID8ge1xuICAgICAgICBkb3VibGVWYWx1ZTogbmV3IERhdGUoKS5nZXRUaW1lKCkgLyAxMDAwLjBcbiAgICAgIH0gOiB7fTtcbiAgICAgIHRoaXMuZm9ybUdyb3VwLnNldENvbnRyb2woJ2NvbXBhcmlzb25WYWx1ZScsIHRoaXMuZm9ybUdlbmVyYXRvci5nZW5lcmF0ZUNvbXBhcmlzb25WYWx1ZUZvcm1Hcm91cChkZWZhdWx0VmFsdWUsIHRoaXMuZm9ybUdyb3VwLmNvbnRyb2xzLmNvbXBhcmF0b3IudmFsdWUsIGZhbHNlLCB0aGlzLmZlYXR1cmVGbGFnTGltaXRhdGlvbnMpKVxuICAgIH1cbiAgfVxuXG4gIGNvbXBEaWFsb2coKSB7XG4gICAgY29uc3QgZGlhbG9nUmVmID0gdGhpcy5kaWFsb2cub3BlbihDb21wYXJhdG9yRGlhbG9nQ29tcG9uZW50LCB7XG4gICAgICB3aWR0aDogJzExMzBweCcsXG4gICAgICBwb3NpdGlvbjoge1xuICAgICAgICB0b3A6IHdpbmRvdy5pbm5lckhlaWdodCA8IDc1MCA/ICcwcHgnIDogd2luZG93LmlubmVySGVpZ2h0IDwgOTUwID8gJzUwcHgnIDogJzEwMHB4JyxcbiAgICAgIH0sXG4gICAgICBkYXRhOiB7XG4gICAgICAgIHJlYWRPbmx5OiB0aGlzLnJlYWRPbmx5LFxuICAgICAgICBzZWxlY3RlZENvbXBhcmF0b3I6IHRoaXMuZm9ybUdyb3VwLmNvbnRyb2xzLmNvbXBhcmF0b3IudmFsdWVcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGRpYWxvZ1JlZi5hZnRlckNsb3NlZCgpLnN1YnNjcmliZShyZXN1bHQgPT4ge1xuICAgICAgaWYgKHJlc3VsdCAmJiByZXN1bHQgIT09IHRoaXMuZm9ybUdyb3VwLmNvbnRyb2xzLmNvbXBhcmF0b3IudmFsdWUpIHtcbiAgICAgICAgdGhpcy5jb21wYXJhdG9yQ2hhbmdlZChyZXN1bHQpO1xuICAgICAgICB0aGlzLmNhbGNDb21wYXJhdG9ycygpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgYWRkKGV2ZW50OiBNYXRDaGlwSW5wdXRFdmVudCk6IHZvaWQge1xuICAgIGNvbnN0IHZhbHVlID0gKGV2ZW50LnZhbHVlIHx8ICcnKS50cmltKCk7XG5cbiAgICBldmVudC5jaGlwSW5wdXQ/LmNsZWFyKCk7XG5cbiAgICBpZiAoIXZhbHVlKSB7IHJldHVybjsgfVxuXG4gICAgaWYgKHZhbHVlLmluZGV4T2YoJywnKSA9PT0gLTEpIHtcbiAgICAgIHRoaXMuZm9ybUdlbmVyYXRvci5hZGRDb21wYXJpc29uVmFsdWVMaXN0VmFsdWVJdGVtcyhcbiAgICAgICAgdGhpcy5mb3JtR3JvdXAuY29udHJvbHMuY29tcGFyYXRvci52YWx1ZSxcbiAgICAgICAgdGhpcy5mb3JtR3JvdXAuY29udHJvbHMuY29tcGFyaXNvblZhbHVlLmNvbnRyb2xzLmxpc3RWYWx1ZSxcbiAgICAgICAgW3sgdmFsdWUgfV0sXG4gICAgICAgIHRoaXMuZmVhdHVyZUZsYWdMaW1pdGF0aW9ucyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgZGlhbG9nUmVmID0gdGhpcy5kaWFsb2cub3BlbihDb25maXJtYXRpb25EaWFsb2dDb21wb25lbnQsIHtcbiAgICAgIGRhdGE6IHtcbiAgICAgICAgdGl0bGU6ICdIb3cgd291bGQgeW91IGxpa2UgdG8gYWRkIHRoZSBpdGVtcz8nLFxuICAgICAgICBib2R5OiBgV2UndmUgbm90aWNlZCBhIGNvbW1hIGluIHRoZSB2YWx1ZSB5b3Ugd2FudCB0byBhZGQuIDxici8+IERvIHlvdSB3YW50IHRvIGFkZCBpdCBhcyBhIHNpbmdsZSBpdGVtLCBvciB3b3VsZCB5b3UgcHJlZmVyIHRvIGluc2VydCBtdWx0aXBsZSBpdGVtcyBzZXBhcmF0ZWQgYnkgY29tbWFzP2AsXG4gICAgICAgIHllc0J1dHRvbkxhYmVsOiAnQWRkIG11bHRpcGxlIGl0ZW1zJyxcbiAgICAgICAgbm9CdXR0b25MYWJlbDogJ0FkZCBhcyBhIHNpbmdsZSBpdGVtJ1xuICAgICAgfSxcbiAgICAgIGRpc2FibGVDbG9zZTogdHJ1ZVxuICAgIH0pO1xuXG4gICAgZGlhbG9nUmVmLmFmdGVyQ2xvc2VkKClcbiAgICAgIC5zdWJzY3JpYmUocmVzdWx0ID0+IHtcbiAgICAgICAgaWYgKHJlc3VsdCA9PT0gJ3llcycpIHtcbiAgICAgICAgICBjb25zdCBjb21wYXJpc29uVmFsdWVMaXN0UGFyc2VSZXN1bHQgPSB0aGlzLmNvbXBhcmlzb25WYWx1ZUxpc3RIZWxwZXIucGFyc2VWYWx1ZXNGcm9tQ3N2KHZhbHVlKTtcbiAgICAgICAgICBpZiAoY29tcGFyaXNvblZhbHVlTGlzdFBhcnNlUmVzdWx0LmVycm9yKSB7XG4gICAgICAgICAgICB0aGlzLm1lc3NhZ2luZ1NlcnZpY2Uuc2hvd1dhcm5pbmdTbmFjaygnUGFyc2UgZXJyb3InKTtcbiAgICAgICAgICB9IGVsc2UgaWYgKGNvbXBhcmlzb25WYWx1ZUxpc3RQYXJzZVJlc3VsdC5jb21wYXJpc29uVmFsdWVMaXN0Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHRoaXMuZm9ybUdlbmVyYXRvci5hZGRDb21wYXJpc29uVmFsdWVMaXN0VmFsdWVJdGVtcyhcbiAgICAgICAgICAgICAgdGhpcy5mb3JtR3JvdXAuY29udHJvbHMuY29tcGFyYXRvci52YWx1ZSxcbiAgICAgICAgICAgICAgdGhpcy5mb3JtR3JvdXAuY29udHJvbHMuY29tcGFyaXNvblZhbHVlLmNvbnRyb2xzLmxpc3RWYWx1ZSxcbiAgICAgICAgICAgICAgY29tcGFyaXNvblZhbHVlTGlzdFBhcnNlUmVzdWx0LmNvbXBhcmlzb25WYWx1ZUxpc3QsXG4gICAgICAgICAgICAgIHRoaXMuZmVhdHVyZUZsYWdMaW1pdGF0aW9ucyk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMuZm9ybUdlbmVyYXRvci5hZGRDb21wYXJpc29uVmFsdWVMaXN0VmFsdWVJdGVtcyhcbiAgICAgICAgICAgIHRoaXMuZm9ybUdyb3VwLmNvbnRyb2xzLmNvbXBhcmF0b3IudmFsdWUsXG4gICAgICAgICAgICB0aGlzLmZvcm1Hcm91cC5jb250cm9scy5jb21wYXJpc29uVmFsdWUuY29udHJvbHMubGlzdFZhbHVlLFxuICAgICAgICAgICAgW3sgdmFsdWUgfV0sXG4gICAgICAgICAgICB0aGlzLmZlYXR1cmVGbGFnTGltaXRhdGlvbnMpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgfVxuXG4gIHJlbW92ZShpbmRleDogbnVtYmVyKTogdm9pZCB7XG4gICAgaWYgKGluZGV4ID49IDApIHtcbiAgICAgIHRoaXMuZm9ybUdyb3VwLmNvbnRyb2xzLmNvbXBhcmlzb25WYWx1ZS5jb250cm9scy5saXN0VmFsdWUuY29udHJvbHMuc3BsaWNlKGluZGV4LCAxKTtcbiAgICAgIHRoaXMuZm9ybUdyb3VwLmNvbnRyb2xzLmNvbXBhcmlzb25WYWx1ZS5jb250cm9scy5saXN0VmFsdWUudXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpO1xuICAgICAgdGhpcy5mb3JtR3JvdXAuY29udHJvbHMuY29tcGFyaXNvblZhbHVlLmNvbnRyb2xzLmxpc3RWYWx1ZS5tYXJrQWxsQXNUb3VjaGVkKCk7XG4gICAgICB0aGlzLmZvcm1Hcm91cC5jb250cm9scy5jb21wYXJpc29uVmFsdWUuY29udHJvbHMubGlzdFZhbHVlLm1hcmtBc0RpcnR5KCk7XG4gICAgfVxuICB9XG5cbiAgZWRpdChpbmRleDogbnVtYmVyLCBldmVudDogTWF0Q2hpcEVkaXRlZEV2ZW50KSB7XG4gICAgY29uc3QgdmFsdWUgPSBldmVudC52YWx1ZS50cmltKCk7XG5cbiAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vYW5ndWxhci9jb21wb25lbnRzL2lzc3Vlcy8yNjU4NCNpc3N1ZWNvbW1lbnQtMTY5OTQ2OTYwNVxuICAgIC8vIFRoZSBtYXQgY2hpcCBjb250cm9sIGRvZXMgbm90IHdvcmsgd2VsbCB3aXRoIGxvbmcgdmFsdWVzLiBUaGUgYmFzaWMgc2V0dXAgaXMgb3ZlcmZsb3c6IHZpc2libGUuXG4gICAgLy8gVGhlIG92ZXJmbG93OmhpZGRlbiwgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXMgaXMgc29sdmVkIGluIHRoZSBzdHlsZXMuc2NzczpcbiAgICAvLy5tZGMtZXZvbHV0aW9uLWNoaXAtc2V0IC5tZGMtZXZvbHV0aW9uLWNoaXAge1xuICAgIC8vICAubWRjLWV2b2x1dGlvbi1jaGlwX19jZWxsLS1wcmltYXJ5LFxuICAgIC8vICAubWRjLWV2b2x1dGlvbi1jaGlwX19hY3Rpb24tLXByaW1hcnksXG4gICAgLy8gIC5tYXQtbWRjLWNoaXAtYWN0aW9uLWxhYmVsIHtcbiAgICAvLyAgICB3aGl0ZS1zcGFjZTogbm93cmFwO1xuICAgIC8vICAgIG92ZXJmbG93OiBoaWRkZW47XG4gICAgLy8gICAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7XG4gICAgLy8gIH1cbiAgICAvLyB9XG4gICAgLy8gXG4gICAgLy8gVGhpcyB3b3JrcyB0b3RhbGx5IGZpbmUgdW50aWwgeW91IGVkaXQgYSBjaGlwJ3MgdmFsdWUgdGhhdCBpcyBsb25nIChkb3VibGUgY2xpY2sgb24gaXQpIFxuICAgIC8vIGFuZCBlLmcuIGluc2VydCBhIGNoYXJhY3RlciB0byB0aGUgZW5kIG9mIHRoZSB2YWx1ZS5cbiAgICAvLyBBZnRlciBmb2N1c2luZyBvdXQgZnJvbSB0aGUgaW5wdXQsIHRoZSBvcmlnaW5hbCBjaGlwJ3MgdmFsdWUgaXMgc2hpZnRlZCBvciBldmVuIG1pc3NpbmcgaWYgdGhlIHRleHQgaXMgbG9uZyBlbm91Z2guIFxuICAgIC8vIElmIHdlIHNldCB0aGUgaW5wdXQncyB2YWx1ZSB0byAnJyBoZXJlLCB0aGUgc2hpZnRpbmcgaXMgc29sdmVkIGFuZCBldmVyeXRoaW5nIHdvcmtzIGFzIGV4cGVjdGVkXG4gICAgKGV2ZW50LmNoaXAgYXMgTWF0Q2hpcFJvdykuZGVmYXVsdEVkaXRJbnB1dD8uc2V0VmFsdWUoJycpO1xuXG4gICAgaWYgKCF2YWx1ZSkge1xuICAgICAgdGhpcy5yZW1vdmUoaW5kZXgpO1xuICAgIH0gZWxzZSBpZiAoaW5kZXggPj0gMCkge1xuICAgICAgdGhpcy5mb3JtR3JvdXAuY29udHJvbHMuY29tcGFyaXNvblZhbHVlLmNvbnRyb2xzLmxpc3RWYWx1ZS5jb250cm9sc1tpbmRleF0ucGF0Y2hWYWx1ZSh7IHZhbHVlIH0pO1xuICAgICAgdGhpcy5mb3JtR3JvdXAuY29udHJvbHMuY29tcGFyaXNvblZhbHVlLmNvbnRyb2xzLmxpc3RWYWx1ZS5jb250cm9sc1tpbmRleF0udXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpO1xuICAgICAgdGhpcy5mb3JtR3JvdXAuY29udHJvbHMuY29tcGFyaXNvblZhbHVlLmNvbnRyb2xzLmxpc3RWYWx1ZS51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KCk7XG4gICAgICB0aGlzLmZvcm1Hcm91cC5jb250cm9scy5jb21wYXJpc29uVmFsdWUuY29udHJvbHMubGlzdFZhbHVlLm1hcmtBbGxBc1RvdWNoZWQoKTtcbiAgICAgIHRoaXMuZm9ybUdyb3VwLmNvbnRyb2xzLmNvbXBhcmlzb25WYWx1ZS5jb250cm9scy5saXN0VmFsdWUubWFya0FzRGlydHkoKTtcbiAgICB9XG4gIH1cblxuICBleHBhbmRUZXh0KCkge1xuICAgIGNvbnN0IGRpYWxvZ1JlZiA9IHRoaXMuZGlhbG9nLm9wZW4oUG9wb3V0VGV4dEVkaXRvckRpYWxvZ0NvbXBvbmVudCwge1xuICAgICAgd2lkdGg6ICc4MDBweCcsXG4gICAgICBkYXRhOiA8UG9wb3V0VGV4dEVkaXRvckRpYWxvZ0RhdGE+e1xuICAgICAgICB2YWx1ZTogdGhpcy5mb3JtR3JvdXAuY29udHJvbHMuY29tcGFyaXNvblZhbHVlLmNvbnRyb2xzLnN0cmluZ1ZhbHVlLnZhbHVlLFxuICAgICAgICByZWFkT25seTogdGhpcy5mb3JtR3JvdXAuY29udHJvbHMuY29tcGFyaXNvblZhbHVlLmNvbnRyb2xzLnN0cmluZ1ZhbHVlLmRpc2FibGVkLFxuICAgICAgICB2YWxpZGF0b3JzOiB0aGlzLnJvbGxvdXRSdWxlQ29tcGFyYXRvclR5cGUgPT09IFVzZXJDb21wYXJhdG9yVHlwZS5TZW12ZXJcbiAgICAgICAgICA/IHRoaXMuZm9ybUdlbmVyYXRvci5nZXRDb21wYXJpc29uVmFsdWVTZW12ZXJWYWxpZGF0b3JzKHRoaXMuZmVhdHVyZUZsYWdMaW1pdGF0aW9ucylcbiAgICAgICAgICA6IHRoaXMuZm9ybUdlbmVyYXRvci5nZXRDb21wYXJpc29uVmFsdWVTdHJpbmdWYWxpZGF0b3JzKHRoaXMuZmVhdHVyZUZsYWdMaW1pdGF0aW9ucyksXG4gICAgICAgIG1heFZhbHVlTGVuZ3RoOiB0aGlzLmZlYXR1cmVGbGFnTGltaXRhdGlvbnMubWF4Q29tcGFyaXNvblZhbHVlTGVuZ3RoLFxuICAgICAgICBkZXNjcmlwdGlvbjogJ01vZGlmeSB0aGUgdGV4dCB3aXRoaW4gdGhlIGVkaXRvciB0byBjaGFuZ2UgdGhlIGNvbXBhcmlzb24gdmFsdWUuIFRoZSBlZGl0b3Igc3VwcG9ydHMgSlNPTiBzeW50YXggaGlnaGxpZ2h0aW5nLidcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGRpYWxvZ1JlZi5hZnRlckNsb3NlZCgpLnN1YnNjcmliZShkYXRhID0+IHtcbiAgICAgIGlmIChkYXRhICYmIGRhdGEudmFsdWUgIT09IHRoaXMuZm9ybUdyb3VwLmNvbnRyb2xzLmNvbXBhcmlzb25WYWx1ZS5jb250cm9scy5zdHJpbmdWYWx1ZS52YWx1ZSkge1xuICAgICAgICB0aGlzLmZvcm1Hcm91cC5jb250cm9scy5jb21wYXJpc29uVmFsdWUuY29udHJvbHMuc3RyaW5nVmFsdWUuc2V0VmFsdWUoZGF0YS52YWx1ZSk7XG4gICAgICAgIHRoaXMuZm9ybUdyb3VwLmNvbnRyb2xzLmNvbXBhcmlzb25WYWx1ZS5jb250cm9scy5zdHJpbmdWYWx1ZS51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KCk7XG4gICAgICAgIHRoaXMuZm9ybUdyb3VwLmNvbnRyb2xzLmNvbXBhcmlzb25WYWx1ZS5jb250cm9scy5zdHJpbmdWYWx1ZS5tYXJrQXNUb3VjaGVkKCk7XG4gICAgICAgIHRoaXMuZm9ybUdyb3VwLmNvbnRyb2xzLmNvbXBhcmlzb25WYWx1ZS5jb250cm9scy5zdHJpbmdWYWx1ZS5tYXJrQXNEaXJ0eSgpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgZXhwYW5kTGlzdCgpIHtcbiAgICBjb25zdCBkaWFsb2dSZWYgPSB0aGlzLmRpYWxvZy5vcGVuKFBvcG91dExpc3RFZGl0b3JEaWFsb2dDb21wb25lbnQsIHtcbiAgICAgIHdpZHRoOiAnNjcwcHgnLFxuICAgICAgZGF0YTogPFBvcG91dExpc3RFZGl0b3JEaWFsb2dEYXRhPntcbiAgICAgICAgY29tcGFyaXNvblZhbHVlTGlzdDogdGhpcy5nZXRSYXdWYWx1ZSgpLFxuICAgICAgICBjb21wYXJhdG9yOiB0aGlzLmZvcm1Hcm91cC5jb250cm9scy5jb21wYXJhdG9yLnZhbHVlLFxuICAgICAgICBmZWF0dXJlRmxhZ0xpbWl0YXRpb25zOiB0aGlzLmZlYXR1cmVGbGFnTGltaXRhdGlvbnMsXG4gICAgICAgIHJlYWRPbmx5OiB0aGlzLnJlYWRPbmx5XG4gICAgICB9XG4gICAgfSk7XG4gICAgZGlhbG9nUmVmLmFmdGVyQ2xvc2VkKCkuc3Vic2NyaWJlKChkYXRhOiB7IGNvbXBhcmlzb25WYWx1ZUxpc3Q6IElDb21wYXJpc29uVmFsdWVMaXN0TW9kZWxbXSB9KSA9PiB7XG4gICAgICBpZiAoZGF0YT8uY29tcGFyaXNvblZhbHVlTGlzdCkge1xuICAgICAgICBjb25zdCBvbGRWYWx1ZSA9XG4gICAgICAgICAgdGhpcy5mb3JtR3JvdXAuY29udHJvbHMuY29tcGFyaXNvblZhbHVlLmNvbnRyb2xzLmxpc3RWYWx1ZS52YWx1ZVxuICAgICAgICAgICAgLm1hcChsID0+IHsgcmV0dXJuIHsgdmFsdWU6IGwudmFsdWUsIGhpbnQ6IGwuaGludCB9OyB9KTtcbiAgICAgICAgY29uc3QgbmV3VmFsdWUgPSBkYXRhLmNvbXBhcmlzb25WYWx1ZUxpc3RcbiAgICAgICAgICAubWFwKGwgPT4geyByZXR1cm4geyB2YWx1ZTogbC52YWx1ZSwgaGludDogbC5oaW50IH07IH0pO1xuICAgICAgICBpZiAoSlNPTi5zdHJpbmdpZnkob2xkVmFsdWUpID09PSBKU09OLnN0cmluZ2lmeShuZXdWYWx1ZSkpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgdmFsaWRhdG9ycyA9XG4gICAgICAgICAgdGhpcy5mb3JtR2VuZXJhdG9yLmdldENvbXBhcmlzb25WYWx1ZVR5cGUodGhpcy5mb3JtR3JvdXAuY29udHJvbHMuY29tcGFyYXRvci52YWx1ZSkgPT09IFVzZXJDb21wYXJhdG9yVHlwZS5TZW12ZXJMaXN0XG4gICAgICAgICAgICA/IHRoaXMuZm9ybUdlbmVyYXRvci5nZXRDb21wYXJpc29uVmFsdWVTZW12ZXJMaXN0SXRlbVZhbGlkYXRvcnModGhpcy5mZWF0dXJlRmxhZ0xpbWl0YXRpb25zKVxuICAgICAgICAgICAgOiB0aGlzLmZvcm1HZW5lcmF0b3IuZ2V0Q29tcGFyaXNvblZhbHVlU3RyaW5nTGlzdEl0ZW1WYWxpZGF0b3JzKHRoaXMuZmVhdHVyZUZsYWdMaW1pdGF0aW9ucyk7XG4gICAgICAgIGNvbnN0IGZvcm1BcnJheSA9IHRoaXMuZm9ybUdlbmVyYXRvci5nZW5lcmF0ZUNvbXBhcmlzb25WYWx1ZUxpc3RWYWx1ZUFycmF5KGRhdGEuY29tcGFyaXNvblZhbHVlTGlzdCwgdGhpcy5yZWFkT25seSwgdGhpcy5mZWF0dXJlRmxhZ0xpbWl0YXRpb25zLCB2YWxpZGF0b3JzKTtcbiAgICAgICAgdGhpcy5mb3JtR3JvdXAuY29udHJvbHMuY29tcGFyaXNvblZhbHVlLnNldENvbnRyb2woJ2xpc3RWYWx1ZScsIGZvcm1BcnJheSk7XG4gICAgICAgIHRoaXMuZm9ybUdyb3VwLmNvbnRyb2xzLmNvbXBhcmlzb25WYWx1ZS51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KCk7XG4gICAgICAgIHRoaXMuZm9ybUdyb3VwLmNvbnRyb2xzLmNvbXBhcmlzb25WYWx1ZS5tYXJrQWxsQXNUb3VjaGVkKCk7XG4gICAgICAgIHRoaXMuZm9ybUdyb3VwLmNvbnRyb2xzLmNvbXBhcmlzb25WYWx1ZS5tYXJrQXNEaXJ0eSgpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgcmVtb3ZlQWxsKCkge1xuICAgIHRoaXMuZm9ybUdyb3VwLmNvbnRyb2xzLmNvbXBhcmlzb25WYWx1ZS5jb250cm9scy5saXN0VmFsdWUuY29udHJvbHMuc3BsaWNlKDAsIHRoaXMuZm9ybUdyb3VwLmNvbnRyb2xzLmNvbXBhcmlzb25WYWx1ZS5jb250cm9scy5saXN0VmFsdWUuY29udHJvbHMubGVuZ3RoKTtcbiAgICB0aGlzLmZvcm1Hcm91cC5jb250cm9scy5jb21wYXJpc29uVmFsdWUuY29udHJvbHMubGlzdFZhbHVlLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoKTtcbiAgICB0aGlzLmZvcm1Hcm91cC5jb250cm9scy5jb21wYXJpc29uVmFsdWUuY29udHJvbHMubGlzdFZhbHVlLm1hcmtBbGxBc1RvdWNoZWQoKTtcbiAgICB0aGlzLmZvcm1Hcm91cC5jb250cm9scy5jb21wYXJpc29uVmFsdWUuY29udHJvbHMubGlzdFZhbHVlLm1hcmtBc0RpcnR5KCk7XG4gIH1cblxuICBjb3B5VmFsdWVzQXNDc3YoKSB7XG4gICAgdGhpcy5jb3B5VG9DbGlwYm9hcmQodGhpcy5jb21wYXJpc29uVmFsdWVMaXN0SGVscGVyLmZvcm1hdFZhbHVlc0FzQ3N2KHRoaXMuZ2V0UmF3VmFsdWUoKSkpO1xuICB9XG5cbiAgY29weVRvQ2xpcGJvYXJkKHZhbHVlOiBzdHJpbmcpIHtcbiAgICBpZiAodmFsdWUpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHRoaXMuY2xpcGJvYXJkLmNvcHkodmFsdWUpO1xuICAgICAgICB0aGlzLm1lc3NhZ2luZ1NlcnZpY2Uuc2hvd1N1Y2Nlc3NTbmFjayhcIkNvcGllZCB0byBjbGlwYm9hcmQuXCIpO1xuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIHRoaXMubWVzc2FnaW5nU2VydmljZS5zaG93U3VjY2Vzc1NuYWNrKFwiQ2xpcGJvYXJkIHVuYXZhaWxhYmxlLlwiKTtcbiAgICAgIH1cblxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLm1lc3NhZ2luZ1NlcnZpY2Uuc2hvd1dhcm5pbmdTbmFjayhcIk5vdGhpbmcgdG8gYmUgY29waWVkLlwiKTtcbiAgICB9XG4gIH1cblxuICBnZXRSYXdWYWx1ZSgpOiBJQ29tcGFyaXNvblZhbHVlTGlzdE1vZGVsW10ge1xuICAgIHJldHVybiB0aGlzLmZvcm1Hcm91cC5jb250cm9scy5jb21wYXJpc29uVmFsdWUuY29udHJvbHMubGlzdFZhbHVlLnZhbHVlLm1hcCh2ID0+IHsgcmV0dXJuIHsgdmFsdWU6IHYudmFsdWUsIGhpbnQ6IHYuaGludCB9IH0pO1xuICB9XG5cbiAgaXNWYWx1ZUludmFsaWQobGlzdFZhbHVlSXRlbUNvbnRyb2w6IEZvcm1Hcm91cDxDb21wYXJpc29uVmFsdWVMaXN0Rm9ybT4pIHtcbiAgICByZXR1cm4gbGlzdFZhbHVlSXRlbUNvbnRyb2wuY29udHJvbHMudmFsdWUudG91Y2hlZCAmJiBsaXN0VmFsdWVJdGVtQ29udHJvbC5jb250cm9scy52YWx1ZS5pbnZhbGlkO1xuICB9XG5cbiAgaXNIaW50SW52YWxpZChsaXN0VmFsdWVJdGVtQ29udHJvbDogRm9ybUdyb3VwPENvbXBhcmlzb25WYWx1ZUxpc3RGb3JtPikge1xuICAgIHJldHVybiBsaXN0VmFsdWVJdGVtQ29udHJvbC5jb250cm9scy5oaW50LnRvdWNoZWQgJiYgbGlzdFZhbHVlSXRlbUNvbnRyb2wuY29udHJvbHMuaGludC5pbnZhbGlkO1xuICB9XG5cbiAgaXNMaXN0VmFsdWVJdGVtSW52YWxpZChsaXN0VmFsdWVJdGVtQ29udHJvbDogRm9ybUdyb3VwPENvbXBhcmlzb25WYWx1ZUxpc3RGb3JtPikge1xuICAgIHJldHVybiB0aGlzLmlzVmFsdWVJbnZhbGlkKGxpc3RWYWx1ZUl0ZW1Db250cm9sKSB8fCB0aGlzLmlzSGludEludmFsaWQobGlzdFZhbHVlSXRlbUNvbnRyb2wpO1xuICB9XG5cbiAgZ2V0TGlzdFZhbHVlSXRlbVRvb2x0aXBNZXNzYWdlKGxpc3RWYWx1ZUl0ZW1Db250cm9sOiBGb3JtR3JvdXA8Q29tcGFyaXNvblZhbHVlTGlzdEZvcm0+KSB7XG4gICAgaWYgKHRoaXMuaXNWYWx1ZUludmFsaWQobGlzdFZhbHVlSXRlbUNvbnRyb2wpKSB7XG4gICAgICByZXR1cm4gRm9ybUhlbHBlci5nZXRFcnJvck1lc3NhZ2UobGlzdFZhbHVlSXRlbUNvbnRyb2wuY29udHJvbHMudmFsdWUpO1xuICAgIH0gZWxzZSBpZiAodGhpcy5pc0hpbnRJbnZhbGlkKGxpc3RWYWx1ZUl0ZW1Db250cm9sKSkge1xuICAgICAgcmV0dXJuIFwiSGludDpcIiArIEZvcm1IZWxwZXIuZ2V0RXJyb3JNZXNzYWdlKGxpc3RWYWx1ZUl0ZW1Db250cm9sLmNvbnRyb2xzLmhpbnQpO1xuICAgIH1cbiAgICBpZiAobGlzdFZhbHVlSXRlbUNvbnRyb2wuY29udHJvbHMuaGludC52YWx1ZSkge1xuICAgICAgcmV0dXJuIGxpc3RWYWx1ZUl0ZW1Db250cm9sLmNvbnRyb2xzLmhpbnQudmFsdWU7XG4gICAgfVxuICAgIHJldHVybiBcIk5vIGhpbnRcIjtcbiAgfVxuXG4gIGNhbGNDb21wYXJhdG9ycyhyZXNldFZhbCA9IGZhbHNlKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmZvcm1Hcm91cC5jb250cm9scy5jb21wYXJpc29uQXR0cmlidXRlLnZhbHVlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuYnVpbGRDb21wYXJhdG9yU3VnZ2VzdGlvbnMoZGVmYXVsdENvbXBhcmF0b3JJZHMsIHJlc2V0VmFsKTtcbiAgfVxuXG4gIGJ1aWxkQ29tcGFyYXRvclN1Z2dlc3Rpb25zKGlkczogbnVtYmVyW10sIHJlc2V0VmFsOiBib29sZWFuKTogdm9pZCB7XG4gICAgbGV0IGNvbXBzID0gaWRzLm1hcChpZCA9PiBhbGxDb21wYXJhdG9yc1tpZF0pO1xuICAgIGNvbnN0IHNlbGVjdGVkID0gYWxsQ29tcGFyYXRvcnMuZmluZCh2YWwgPT4gdmFsLnZhbHVlID09PSB0aGlzLmZvcm1Hcm91cC5jb250cm9scy5jb21wYXJhdG9yLnZhbHVlKTtcbiAgICBpZiAocmVzZXRWYWwgJiYgIWlkcy5pbmNsdWRlcyhzZWxlY3RlZC5pbmRleCkgJiYgdGhpcy5pc051bGxDb21wVmFsKHRoaXMuZm9ybUdyb3VwLmNvbnRyb2xzLmNvbXBhcmlzb25WYWx1ZS52YWx1ZSkpIHtcbiAgICAgIHRoaXMuY29tcGFyYXRvckNoYW5nZWQoY29tcHNbMF0udmFsdWUpO1xuICAgIH0gZWxzZSBpZiAoIWlkcy5pbmNsdWRlcyhzZWxlY3RlZC5pbmRleCkpIHtcbiAgICAgIGlmIChzZWxlY3RlZC52YWx1ZSA9PT0gVXNlckNvbXBhcmF0b3IuQ29udGFpbnNBbnlPZiB8fCBzZWxlY3RlZC52YWx1ZSA9PT0gVXNlckNvbXBhcmF0b3IuRG9lc05vdENvbnRhaW5BbnlPZikge1xuICAgICAgICBjb21wcyA9IFthbGxDb21wYXJhdG9yc1syXSwgYWxsQ29tcGFyYXRvcnNbM10sIC4uLmNvbXBzXVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3Qgc2VsZWN0ZWRHcm91cCA9IGFsbENvbXBhcmF0b3JzLmZpbHRlcih2YWwgPT4gdmFsLmdyb3VwID09PSBzZWxlY3RlZC5ncm91cCk7XG4gICAgICAgIGNvbXBzID0gWy4uLnNlbGVjdGVkR3JvdXAsIC4uLmNvbXBzXVxuICAgICAgfVxuICAgIH1cbiAgICBjb21wcyA9IHRoaXMuZGVkdXBDb21wcyhjb21wcyk7XG4gICAgdGhpcy5jb21wYXJhdG9yU3VnZ2VzdGlvbnMgPSBjb21wcy5yZWR1Y2UoKGVudHJ5TWFwLCBlKSA9PiBlbnRyeU1hcC5zZXQoZS5ncm91cCwgWy4uLmVudHJ5TWFwLmdldChlLmdyb3VwKSB8fCBbXSwgZV0pLCBuZXcgTWFwKCkpO1xuICAgIHRoaXMuY29tcGFyYXRvclNlcGFyYXRvciA9IHRoaXMuZ2VuU2VwYXJhdG9yKGNvbXBzKTtcbiAgfVxuXG4gIGRlZHVwQ29tcHMoY29tcHM6IElDb21wYXJhdG9yVmFsdWVbXSk6IElDb21wYXJhdG9yVmFsdWVbXSB7XG4gICAgY29uc3QgcmVzdWx0OiBJQ29tcGFyYXRvclZhbHVlW10gPSBbXTtcbiAgICBjb21wcy5mb3JFYWNoKHZhbCA9PiB7XG4gICAgICBpZiAoIXJlc3VsdC5maW5kKGUgPT4gZS5pbmRleCA9PT0gdmFsLmluZGV4KSkge1xuICAgICAgICByZXN1bHQucHVzaCh2YWwpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICBnZW5TZXBhcmF0b3IoY29tcHM6IElDb21wYXJhdG9yVmFsdWVbXSk6IHN0cmluZyB7XG4gICAgbGV0IG1heCA9IDA7XG4gICAgY29tcHMuZm9yRWFjaCh2YWwgPT4ge1xuICAgICAgaWYgKHZhbC5sYWJlbC5sZW5ndGggPiBtYXgpIHtcbiAgICAgICAgbWF4ID0gdmFsLmxhYmVsLmxlbmd0aDtcbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gQXJyYXkobWF4KS5qb2luKFwi4pSAXCIpO1xuICB9XG5cbiAgaXNOdW1iZXJBcnIodmFsOiBhbnkpOiBib29sZWFuIHtcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkodmFsKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHJldHVybiB2YWwubGVuZ3RoID4gMCAmJiB2YWwuZXZlcnkoaXRlbSA9PiB0eXBlb2YgaXRlbSA9PT0gJ251bWJlcicpO1xuICB9XG5cbiAgaXNOdWxsQ29tcFZhbChjb21wVmFsOiBQYXJ0aWFsPHsgc3RyaW5nVmFsdWU/OiBzdHJpbmc7IGRvdWJsZVZhbHVlPzogbnVtYmVyOyBsaXN0VmFsdWU/OiBQYXJ0aWFsPHsgdmFsdWU6IHN0cmluZzsgaGludD86IHN0cmluZzsgaW5kZXg6IG51bWJlcjsgfT5bXTsgfT4pOiBib29sZWFuIHtcbiAgICByZXR1cm4gIWNvbXBWYWwuZG91YmxlVmFsdWUgJiYgIWNvbXBWYWwubGlzdFZhbHVlICYmICFjb21wVmFsLnN0cmluZ1ZhbHVlO1xuICB9XG5cblxuICBpc0NsZWFyVGV4dENvbXBhcmF0b3IoY29tcGFyYXRvcjogVXNlckNvbXBhcmF0b3IpOiBib29sZWFuIHtcbiAgICBzd2l0Y2ggKGNvbXBhcmF0b3IpIHtcbiAgICAgIGNhc2UgVXNlckNvbXBhcmF0b3IuSXNPbmVPZjpcbiAgICAgIGNhc2UgVXNlckNvbXBhcmF0b3IuSXNOb3RPbmVPZjpcbiAgICAgIGNhc2UgVXNlckNvbXBhcmF0b3IuVGV4dFN0YXJ0c1dpdGhBbnlPZjpcbiAgICAgIGNhc2UgVXNlckNvbXBhcmF0b3IuVGV4dEVuZHNXaXRoQW55T2Y6XG4gICAgICBjYXNlIFVzZXJDb21wYXJhdG9yLlRleHROb3RTdGFydHNXaXRoQW55T2Y6XG4gICAgICBjYXNlIFVzZXJDb21wYXJhdG9yLlRleHROb3RFbmRzV2l0aEFueU9mOlxuICAgICAgY2FzZSBVc2VyQ29tcGFyYXRvci5BcnJheUNvbnRhaW5zQW55T2Y6XG4gICAgICBjYXNlIFVzZXJDb21wYXJhdG9yLkFycmF5RG9lc05vdENvbnRhaW5BbnlPZjpcbiAgICAgIGNhc2UgVXNlckNvbXBhcmF0b3IuQ29udGFpbnNBbnlPZjpcbiAgICAgIGNhc2UgVXNlckNvbXBhcmF0b3IuRG9lc05vdENvbnRhaW5BbnlPZjpcbiAgICAgIGNhc2UgVXNlckNvbXBhcmF0b3IuVGV4dEVxdWFsczpcbiAgICAgIGNhc2UgVXNlckNvbXBhcmF0b3IuVGV4dERvZXNOb3RFcXVhbDogcmV0dXJuIHRydWU7XG4gICAgICBkZWZhdWx0OiByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgb3BlbkNsZWFydGV4dEluZm9EaWFsb2coKSB7XG4gICAgdGhpcy5kaWFsb2cub3BlbihJbmZvRGlhbG9nQ29tcG9uZW50LCB7XG4gICAgICB3aWR0aDogJzYwMHB4JyxcbiAgICAgIGRhdGE6IHtcbiAgICAgICAgdGl0bGU6IGBDb25zaWRlciB1c2luZyBjb25maWRlbnRpYWwgY29tcGFyYXRvcnNgLFxuICAgICAgICBib2R5OiBgQ29tcGFyaXNvbiB2YWx1ZSB3aWxsIGJlIHByZXNlbnRlZCBhcyBwbGFpbiB0ZXh0IFxuICAgICAgICBpbiB0aGUgPGk+Y29uZmlnIEpTT048L2k+LiBJZiB5b3UgaGF2ZSBzZW5zaXRpdmUgZGF0YSwgY29uc2lkZXIgdXNpbmcgb25lIG9mIHRoZSBjb25maWRlbnRpYWwgKGhhc2hlZCkgY29tcGFyYXRvcnMuPGJyLz48YnIvPlxuICAgICAgICBTZWUgdGhlIDxhIGhyZWY9XCJodHRwczovL2NvbmZpZ2NhdC5jb20vZG9jcy9WMi90YXJnZXRpbmcvdGFyZ2V0aW5nLXJ1bGUvdXNlci1jb25kaXRpb24vI2NvbmZpZGVudGlhbC10ZXh0LWNvbXBhcmF0b3JzXCIgdGFyZ2V0PVwiX2JsYW5rXCI+ZG9jdW1lbnRhdGlvbjwvYT4gZm9yIG1vcmUgaW5mb3JtYXRpb24uYCxcbiAgICAgICAgc2Vjb25kYXJ5QnV0dG9uTGFiZWw6ICdPcGVuIGNvbXBhcmF0b3Igc2VsZWN0b3InLFxuICAgICAgICBzZWNvbmRhcnlCdXR0b25BY3Rpb246ICgpID0+IHRoaXMuY29tcERpYWxvZygpXG4gICAgICB9XG4gICAgfSk7XG4gIH1cbn1cbiIsIjxkaXYgY2xhc3M9XCJ0YXJnZXRpbmctcnVsZS1saW5lIHNtYWxsZXN0LWZvcm0tZmllbGRcIj5cbiAgICA8ZGl2IGNsYXNzPVwiZXhwbGFuYXRpb24td3JhcHBlclwiPlxuICAgICAgICA8YXBwLWNvbmRpdGlvbi1jaGlwIFt0YXJnZXRpbmdSdWxlSW5kZXhdPVwidGFyZ2V0aW5nUnVsZUluZGV4XCJcbiAgICAgICAgICAgIFtjb25kaXRpb25JbmRleF09XCJjb25kaXRpb25JbmRleFwiPjwvYXBwLWNvbmRpdGlvbi1jaGlwPlxuXG4gICAgICAgIDxkaXYgY2xhc3M9XCJleHBsYW5hdGlvblwiPjxhIGhyZWY9XCJodHRwczovL2NvbmZpZ2NhdC5jb20vZG9jcy9WMi90YXJnZXRpbmcvdGFyZ2V0aW5nLXJ1bGUvdXNlci1jb25kaXRpb24vXCJcbiAgICAgICAgICAgICAgICB0YXJnZXQ9XCJfYmxhbmtcIiByZWw9XCJub29wZW5lciBub3JlZmVycmVyXCIgY2xhc3M9XCJ1c2VyLWxpbmtcIj51c2VyJ3M8L2E+PC9kaXY+XG4gICAgPC9kaXY+XG5cbiAgICA8ZGl2IGNsYXNzPVwid3JhcHBlci1ncm91cFwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwid3JhcHBlci1ncm91cFwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRhcmdldGluZy1ydWxlLWNvbXBvbmVudCBwYWQtcmlnaHRcIlxuICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsnc21hbGwnOiBkZWZhdWx0Q29tcGFyaXNvbkF0dHJpYnV0ZXMuaW5kZXhPZihmb3JtR3JvdXAuY29udHJvbHMuY29tcGFyaXNvbkF0dHJpYnV0ZS52YWx1ZSkgPT09IC0xfVwiPlxuICAgICAgICAgICAgICAgIDxtYXQtZm9ybS1maWVsZCBhcHBlYXJhbmNlPVwib3V0bGluZVwiIHN1YnNjcmlwdFNpemluZz1cImR5bmFtaWNcIj5cbiAgICAgICAgICAgICAgICAgICAgPHNlbGVjdCBtYXROYXRpdmVDb250cm9sIChjaGFuZ2UpPVwiYXR0cmlidXRlQ2hhbmdlZCgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJmb3JtR3JvdXAuY29udHJvbHMuY29tcGFyaXNvbkF0dHJpYnV0ZS5kaXNhYmxlZFwiIG1hdFRvb2x0aXA9XCJDb21wYXJpc29uIGF0dHJpYnV0ZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiAqbmdGb3I9XCJsZXQgY29tcGFyaXNvbkF0dHJpYnV0ZSBvZiBkZWZhdWx0Q29tcGFyaXNvbkF0dHJpYnV0ZXNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzZWxlY3RlZF09XCJjb21wYXJpc29uQXR0cmlidXRlID09PSBmb3JtR3JvdXAuY29udHJvbHMuY29tcGFyaXNvbkF0dHJpYnV0ZS52YWx1ZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7Y29tcGFyaXNvbkF0dHJpYnV0ZX19PC9vcHRpb24+XG4gICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW3NlbGVjdGVkXT1cImRlZmF1bHRDb21wYXJpc29uQXR0cmlidXRlcy5pbmRleE9mKGZvcm1Hcm91cC5jb250cm9scy5jb21wYXJpc29uQXR0cmlidXRlLnZhbHVlKSA9PT0gLTFcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBDdXN0b21cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvb3B0aW9uPlxuICAgICAgICAgICAgICAgICAgICA8L3NlbGVjdD5cbiAgICAgICAgICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGFyZ2V0aW5nLXJ1bGUtY29tcG9uZW50IHBhZC1yaWdodCBzbWFsbFwiXG4gICAgICAgICAgICAgICAgW2hpZGRlbl09XCJkZWZhdWx0Q29tcGFyaXNvbkF0dHJpYnV0ZXMuaW5kZXhPZihmb3JtR3JvdXAuY29udHJvbHMuY29tcGFyaXNvbkF0dHJpYnV0ZS52YWx1ZSkgIT09IC0xXCI+XG4gICAgICAgICAgICAgICAgPG1hdC1mb3JtLWZpZWxkIGFwcGVhcmFuY2U9XCJvdXRsaW5lXCIgc3Vic2NyaXB0U2l6aW5nPVwiZHluYW1pY1wiPlxuICAgICAgICAgICAgICAgICAgICA8aW5wdXQgbWF0SW5wdXQgdHlwZT1cInRleHRcIiAoYmx1cik9XCJjYWxjQ29tcGFyYXRvcnModHJ1ZSlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2Zvcm1Db250cm9sXT1cImZvcm1Hcm91cC5jb250cm9scy5jb21wYXJpc29uQXR0cmlidXRlXCIgbWF0VG9vbHRpcD1cIkN1c3RvbSBjb21wYXJpc29uIGF0dHJpYnV0ZVwiPlxuICAgICAgICAgICAgICAgICAgICA8bWF0LWVycm9yICpuZ0lmPVwiZm9ybUdyb3VwLmNvbnRyb2xzLmNvbXBhcmlzb25BdHRyaWJ1dGUuaW52YWxpZFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAge3tGb3JtSGVscGVyLmdldEVycm9yTWVzc2FnZShmb3JtR3JvdXAuY29udHJvbHMuY29tcGFyaXNvbkF0dHJpYnV0ZSl9fVxuICAgICAgICAgICAgICAgICAgICA8L21hdC1lcnJvcj5cbiAgICAgICAgICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDxkaXYgY2xhc3M9XCJ0YXJnZXRpbmctcnVsZS1jb21wb25lbnQgcGFkLXJpZ2h0IGNvbXBhcmF0b3JcIj5cbiAgICAgICAgICAgIDxtYXQtZm9ybS1maWVsZCBhcHBlYXJhbmNlPVwib3V0bGluZVwiIHN1YnNjcmlwdFNpemluZz1cImR5bmFtaWNcIj5cbiAgICAgICAgICAgICAgICA8c2VsZWN0IG1hdE5hdGl2ZUNvbnRyb2wgKGNoYW5nZSk9XCJjb21wYXJhdG9yQ2hhbmdlZChzZWxlY3RlZENvbXBhcmF0b3IpXCJcbiAgICAgICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJzZWxlY3RlZENvbXBhcmF0b3JcIiBbZGlzYWJsZWRdPVwicmVhZE9ubHlcIiBtYXRUb29sdGlwPVwiQ29tcGFyYXRvclwiPlxuICAgICAgICAgICAgICAgICAgICA8b3B0Z3JvdXAgKm5nRm9yPVwibGV0IGdyb3VwIG9mIGNvbXBhcmF0b3JTdWdnZXN0aW9ucyB8IGtleXZhbHVlOiBrZWVwT3JkZXJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2xhYmVsXT1cIicmbmJzcDsnICsgZ3JvdXAua2V5XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uICpuZ0Zvcj1cImxldCBjb21wYXJhdG9yIG9mIGdyb3VwLnZhbHVlXCIgW25nVmFsdWVdPVwiY29tcGFyYXRvci52YWx1ZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7Y29tcGFyYXRvci5sYWJlbH19XG4gICAgICAgICAgICAgICAgICAgICAgICA8L29wdGlvbj5cbiAgICAgICAgICAgICAgICAgICAgPC9vcHRncm91cD5cbiAgICAgICAgICAgICAgICAgICAgPG9wdGdyb3VwIFtsYWJlbF09XCJjb21wYXJhdG9yU2VwYXJhdG9yXCI+PC9vcHRncm91cD5cbiAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cInNob3dhbGxcIj4mbmJzcDsmbmJzcDtTSE9XIEFMTCBDT01QQVJBVE9SUyZuYnNwOyZuYnNwOzwvb3B0aW9uPlxuICAgICAgICAgICAgICAgIDwvc2VsZWN0PlxuICAgICAgICAgICAgICAgIDxidXR0b24gbWF0U3VmZml4IGNsYXNzPVwiaW5wdXQtYnV0dG9uXCIgdHlwZT1cImJ1dHRvblwiIG1hdC1pY29uLWJ1dHRvbiBtYXRUb29sdGlwPVwiQWxsIGNvbXBhcmF0b3JzXCJcbiAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImNvbXBEaWFsb2coKVwiPjxtYXQtaWNvbj5saXN0X2FsdDwvbWF0LWljb24+PC9idXR0b24+XG4gICAgICAgICAgICAgICAgPG1hdC1lcnJvciAqbmdJZj1cImZvcm1Hcm91cC5jb250cm9scy5jb21wYXJhdG9yLmludmFsaWRcIj5cbiAgICAgICAgICAgICAgICAgICAge3tGb3JtSGVscGVyLmdldEVycm9yTWVzc2FnZShmb3JtR3JvdXAuY29udHJvbHMuY29tcGFyYXRvcil9fVxuICAgICAgICAgICAgICAgIDwvbWF0LWVycm9yPlxuICAgICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cbiAgICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gICAgPG5nLWNvbnRhaW5lciBbbmdTd2l0Y2hdPVwicm9sbG91dFJ1bGVDb21wYXJhdG9yVHlwZVwiPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCJSb2xsb3V0UnVsZUNvbXBhcmF0b3JWMlR5cGUuU3RyaW5nXCJcbiAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0XT1cInRleHRUZW1wbGF0ZVwiPjwvbmctY29udGFpbmVyPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCJSb2xsb3V0UnVsZUNvbXBhcmF0b3JWMlR5cGUuU2VtdmVyXCJcbiAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0XT1cInNlbXZlclRlbXBsYXRlXCI+PC9uZy1jb250YWluZXI+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIlJvbGxvdXRSdWxlQ29tcGFyYXRvclYyVHlwZS5TdHJpbmdMaXN0XCJcbiAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0XT1cImxpc3RUZW1wbGF0ZVwiPjwvbmctY29udGFpbmVyPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCJSb2xsb3V0UnVsZUNvbXBhcmF0b3JWMlR5cGUuU2VtdmVyTGlzdFwiXG4gICAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldF09XCJsaXN0VGVtcGxhdGVcIj48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiUm9sbG91dFJ1bGVDb21wYXJhdG9yVjJUeXBlLk51bWJlclwiXG4gICAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldF09XCJudW1iZXJUZW1wbGF0ZVwiPjwvbmctY29udGFpbmVyPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCJSb2xsb3V0UnVsZUNvbXBhcmF0b3JWMlR5cGUuRGF0ZVRpbWVcIlxuICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRdPVwiZGF0ZVRpbWVUZW1wbGF0ZVwiPjwvbmctY29udGFpbmVyPlxuICAgIDwvbmctY29udGFpbmVyPlxuXG48L2Rpdj5cblxuPG5nLXRlbXBsYXRlICN0ZXh0VGVtcGxhdGU+XG4gICAgPGRpdiAqbmdJZj1cImZvcm1Hcm91cC5jb250cm9scy5jb21wYXJpc29uVmFsdWUuY29udHJvbHMuc3RyaW5nVmFsdWVcIiBjbGFzcz1cInRhcmdldGluZy1ydWxlLWNvbXBvbmVudCBncm93XCI+XG4gICAgICAgIDxtYXQtZm9ybS1maWVsZCBhcHBlYXJhbmNlPVwib3V0bGluZVwiIHN1YnNjcmlwdFNpemluZz1cImR5bmFtaWNcIj5cbiAgICAgICAgICAgIDxpbnB1dCBtYXRJbnB1dCB0eXBlPVwidGV4dFwiIFtmb3JtQ29udHJvbF09XCJmb3JtR3JvdXAuY29udHJvbHMuY29tcGFyaXNvblZhbHVlLmNvbnRyb2xzLnN0cmluZ1ZhbHVlXCJcbiAgICAgICAgICAgICAgICBtYXRUb29sdGlwPVwiQ29tcGFyaXNvbiB2YWx1ZSAodGV4dClcIiBwbGFjZWhvbGRlcj1cIkFkZCB0ZXh0IC4uLlwiIC8+XG4gICAgICAgICAgICA8YnV0dG9uIG1hdFByZWZpeCBjbGFzcz1cInByZWZpeC1idXR0b25cIiB0eXBlPVwiYnV0dG9uXCIgbWF0LWljb24tYnV0dG9uICpuZ0lmPVwiaXNDbGVhclRleHRDb21wYXJhdG9yU2VsZWN0ZWRcIlxuICAgICAgICAgICAgICAgIChjbGljayk9XCJvcGVuQ2xlYXJ0ZXh0SW5mb0RpYWxvZygpXCJcbiAgICAgICAgICAgICAgICBtYXRUb29sdGlwPVwiVGhpcyBjb21wYXJpc29uIHZhbHVlIHdvbid0IGJlIGhhc2hlZC4gQ2xpY2sgZm9yIG1vcmUgaW5mby5cIj48bWF0LWljb24+bG9ja19vcGVuX3JpZ2h0PC9tYXQtaWNvbj48L2J1dHRvbj5cbiAgICAgICAgICAgIDxidXR0b24gbWF0U3VmZml4IGNsYXNzPVwiaW5wdXQtYnV0dG9uXCIgdHlwZT1cImJ1dHRvblwiIG1hdC1pY29uLWJ1dHRvbiBtYXRUb29sdGlwPVwiQWR2YW5jZWQgZWRpdG9yXCJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwiZXhwYW5kVGV4dCgpXCI+PG1hdC1pY29uPmVkaXRfbm90ZTwvbWF0LWljb24+PC9idXR0b24+XG4gICAgICAgICAgICA8bWF0LWVycm9yICpuZ0lmPVwiZm9ybUdyb3VwLmNvbnRyb2xzLmNvbXBhcmlzb25WYWx1ZS5jb250cm9scy5zdHJpbmdWYWx1ZS5pbnZhbGlkXCI+XG4gICAgICAgICAgICAgICAge3tGb3JtSGVscGVyLmdldEVycm9yTWVzc2FnZShmb3JtR3JvdXAuY29udHJvbHMuY29tcGFyaXNvblZhbHVlLmNvbnRyb2xzLnN0cmluZ1ZhbHVlKX19XG4gICAgICAgICAgICA8L21hdC1lcnJvcj5cbiAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cbiAgICA8L2Rpdj5cbjwvbmctdGVtcGxhdGU+XG5cblxuPG5nLXRlbXBsYXRlICNzZW12ZXJUZW1wbGF0ZT5cbiAgICA8ZGl2ICpuZ0lmPVwiZm9ybUdyb3VwLmNvbnRyb2xzLmNvbXBhcmlzb25WYWx1ZS5jb250cm9scy5zdHJpbmdWYWx1ZVwiIGNsYXNzPVwidGFyZ2V0aW5nLXJ1bGUtY29tcG9uZW50IGdyb3dcIj5cbiAgICAgICAgPG1hdC1mb3JtLWZpZWxkIGFwcGVhcmFuY2U9XCJvdXRsaW5lXCIgc3Vic2NyaXB0U2l6aW5nPVwiZHluYW1pY1wiPlxuICAgICAgICAgICAgPGlucHV0IG1hdElucHV0IHR5cGU9XCJ0ZXh0XCIgW2Zvcm1Db250cm9sXT1cImZvcm1Hcm91cC5jb250cm9scy5jb21wYXJpc29uVmFsdWUuY29udHJvbHMuc3RyaW5nVmFsdWVcIlxuICAgICAgICAgICAgICAgIG1hdFRvb2x0aXA9XCJDb21wYXJpc29uIHZhbHVlIChzZW1hbnRpYyB2ZXJzaW9uKVwiIHBsYWNlaG9sZGVyPVwiQWRkIHNlbWFudGljIHZlcnNpb24gLi4uICgxLjIuMylcIiAvPlxuICAgICAgICAgICAgPG1hdC1lcnJvciAqbmdJZj1cImZvcm1Hcm91cC5jb250cm9scy5jb21wYXJpc29uVmFsdWUuY29udHJvbHMuc3RyaW5nVmFsdWUuaW52YWxpZFwiPlxuICAgICAgICAgICAgICAgIHt7Rm9ybUhlbHBlci5nZXRFcnJvck1lc3NhZ2UoZm9ybUdyb3VwLmNvbnRyb2xzLmNvbXBhcmlzb25WYWx1ZS5jb250cm9scy5zdHJpbmdWYWx1ZSl9fVxuICAgICAgICAgICAgPC9tYXQtZXJyb3I+XG4gICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XG4gICAgPC9kaXY+XG48L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGUgI2xpc3RUZW1wbGF0ZT5cbiAgICA8ZGl2ICpuZ0lmPVwiZm9ybUdyb3VwLmNvbnRyb2xzLmNvbXBhcmlzb25WYWx1ZS5jb250cm9scy5saXN0VmFsdWVcIlxuICAgICAgICBjbGFzcz1cInRhcmdldGluZy1ydWxlLWNvbXBvbmVudCBncm93IHNtYWxsLWNoaXAtaW5wdXQgdG9wLWljb24tc3VmZml4XCI+XG4gICAgICAgIDxtYXQtZm9ybS1maWVsZCBhcHBlYXJhbmNlPVwib3V0bGluZVwiIHN1YnNjcmlwdFNpemluZz1cImR5bmFtaWNcIj5cbiAgICAgICAgICAgIDxtYXQtY2hpcC1ncmlkICNjaGlwR3JpZCBbZm9ybUNvbnRyb2xdPVwiZmFrZUZvcm1Db250cm9sXCIgW2Vycm9yU3RhdGVNYXRjaGVyXT1cImVycm9yU3RhdGVNYXRjaGVyXCI+XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjaGlwLWNvbnRhaW5lclwiXG4gICAgICAgICAgICAgICAgICAgICpuZ0Zvcj1cImxldCBsaXN0VmFsdWVJdGVtIG9mIGZvcm1Hcm91cC5jb250cm9scy5jb21wYXJpc29uVmFsdWUuY29udHJvbHMubGlzdFZhbHVlLmNvbnRyb2xzIHwgc2xpY2U6MDoyMDsgbGV0IGkgPSBpbmRleFwiXG4gICAgICAgICAgICAgICAgICAgIFttYXRUb29sdGlwXT1cImdldExpc3RWYWx1ZUl0ZW1Ub29sdGlwTWVzc2FnZShsaXN0VmFsdWVJdGVtKVwiPlxuICAgICAgICAgICAgICAgICAgICA8bWF0LWNoaXAtcm93IChyZW1vdmVkKT1cInJlbW92ZShpKVwiIFtkaXNhYmxlZF09XCJyZWFkT25seVwiIFtyZW1vdmFibGVdPVwiIXJlYWRPbmx5XCIgY2xhc3M9XCJjaGlwXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtlZGl0YWJsZV09XCIhcmVhZE9ubHlcIiAoZWRpdGVkKT1cImVkaXQoaSwgJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7J2ludmFsaWQnOiBpc0xpc3RWYWx1ZUl0ZW1JbnZhbGlkKGxpc3RWYWx1ZUl0ZW0pfVwiPlxuXG4gICAgICAgICAgICAgICAgICAgICAgICB7e2xpc3RWYWx1ZUl0ZW0uY29udHJvbHMudmFsdWUudmFsdWV9fVxuXG4gICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBtYXRDaGlwUmVtb3ZlICpuZ0lmPVwiIXJlYWRPbmx5XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1pY29uPmNhbmNlbDwvbWF0LWljb24+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgPC9tYXQtY2hpcC1yb3c+XG4gICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgIDxidXR0b24gbWF0LXN0cm9rZWQtYnV0dG9uIGNsYXNzPVwic2hvdy1hbGxcIiB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJmb3JtR3JvdXAuY29udHJvbHMuY29tcGFyaXNvblZhbHVlLmNvbnRyb2xzLmxpc3RWYWx1ZS5jb250cm9scy5sZW5ndGggPiAyMFwiXG4gICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJleHBhbmRMaXN0KClcIj5cbiAgICAgICAgICAgICAgICAgICAgc2hvdyBhbGwge3tmb3JtR3JvdXAuY29udHJvbHMuY29tcGFyaXNvblZhbHVlLmNvbnRyb2xzLmxpc3RWYWx1ZS5jb250cm9scy5sZW5ndGh9fVxuICAgICAgICAgICAgICAgICAgICBpdGVtczwvYnV0dG9uPlxuICAgICAgICAgICAgICAgIDxpbnB1dCBbZGlzYWJsZWRdPVwicmVhZE9ubHlcIiBbcGxhY2Vob2xkZXJdPVwiIXJlYWRPbmx5ID8gJ0FkZCBpdGVtIHRvIGxpc3QgLi4uJyA6ICcnXCJcbiAgICAgICAgICAgICAgICAgICAgW21hdENoaXBJbnB1dEZvcl09XCJjaGlwR3JpZFwiIFttYXRDaGlwSW5wdXRTZXBhcmF0b3JLZXlDb2Rlc109XCJzZXBhcmF0b3JLZXlzQ29kZXNcIlxuICAgICAgICAgICAgICAgICAgICBtYXRDaGlwSW5wdXRBZGRPbkJsdXIgKG1hdENoaXBJbnB1dFRva2VuRW5kKT1cImFkZCgkZXZlbnQpXCIgbWF0VG9vbHRpcD1cIkNvbXBhcmlzb24gdmFsdWVzIChsaXN0KVwiIC8+XG4gICAgICAgICAgICA8L21hdC1jaGlwLWdyaWQ+XG4gICAgICAgICAgICA8YnV0dG9uIG1hdEljb25QcmVmaXggY2xhc3M9XCJwcmVmaXgtYnV0dG9uXCIgdHlwZT1cImJ1dHRvblwiIG1hdC1pY29uLWJ1dHRvbiAqbmdJZj1cImlzQ2xlYXJUZXh0Q29tcGFyYXRvclNlbGVjdGVkXCJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwib3BlbkNsZWFydGV4dEluZm9EaWFsb2coKVwiXG4gICAgICAgICAgICAgICAgbWF0VG9vbHRpcD1cIlRoaXMgY29tcGFyaXNvbiB2YWx1ZSB3b24ndCBiZSBoYXNoZWQuIENsaWNrIGZvciBtb3JlIGluZm8uXCI+PG1hdC1pY29uPmxvY2tfb3Blbl9yaWdodDwvbWF0LWljb24+PC9idXR0b24+XG4gICAgICAgICAgICA8YnV0dG9uIG1hdEljb25TdWZmaXggY2xhc3M9XCJpbnB1dC1idXR0b25cIiB0eXBlPVwiYnV0dG9uXCIgbWF0LWljb24tYnV0dG9uIG1hdFRvb2x0aXA9XCJNb3JlLi4uXCJcbiAgICAgICAgICAgICAgICBbbWF0TWVudVRyaWdnZXJGb3JdPVwibW9yZU1lbnVcIj48bWF0LWljb24+bW9yZV92ZXJ0PC9tYXQtaWNvbj48L2J1dHRvbj5cbiAgICAgICAgICAgIDxidXR0b24gbWF0SWNvblN1ZmZpeCBjbGFzcz1cImlucHV0LWJ1dHRvblwiIHR5cGU9XCJidXR0b25cIiBtYXQtaWNvbi1idXR0b24gbWF0VG9vbHRpcD1cIkFkdmFuY2VkIGVkaXRvclwiXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cImV4cGFuZExpc3QoKVwiPjxtYXQtaWNvbj5lZGl0X25vdGU8L21hdC1pY29uPjwvYnV0dG9uPlxuICAgICAgICAgICAgPG1hdC1lcnJvclxuICAgICAgICAgICAgICAgICpuZ0lmPVwiZm9ybUdyb3VwLmNvbnRyb2xzLmNvbXBhcmlzb25WYWx1ZS5jb250cm9scy5saXN0VmFsdWUuaW52YWxpZCAmJiBmb3JtR3JvdXAuY29udHJvbHMuY29tcGFyaXNvblZhbHVlLmNvbnRyb2xzLmxpc3RWYWx1ZS5lcnJvcnNcIj5cbiAgICAgICAgICAgICAgICB7e0Zvcm1IZWxwZXIuZ2V0RXJyb3JNZXNzYWdlKGZvcm1Hcm91cC5jb250cm9scy5jb21wYXJpc29uVmFsdWUuY29udHJvbHMubGlzdFZhbHVlKX19XG4gICAgICAgICAgICA8L21hdC1lcnJvcj5cbiAgICAgICAgICAgIDxtYXQtZXJyb3JcbiAgICAgICAgICAgICAgICAqbmdJZj1cImZvcm1Hcm91cC5jb250cm9scy5jb21wYXJpc29uVmFsdWUuY29udHJvbHMubGlzdFZhbHVlLmludmFsaWQgJiYgIWZvcm1Hcm91cC5jb250cm9scy5jb21wYXJpc29uVmFsdWUuY29udHJvbHMubGlzdFZhbHVlLmVycm9yc1wiPlxuICAgICAgICAgICAgICAgIEludmFsaWQgaXRlbXNcbiAgICAgICAgICAgIDwvbWF0LWVycm9yPlxuICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxuICAgIDwvZGl2PlxuPC9uZy10ZW1wbGF0ZT5cblxuPG5nLXRlbXBsYXRlICNudW1iZXJUZW1wbGF0ZT5cbiAgICA8ZGl2ICpuZ0lmPVwiZm9ybUdyb3VwLmNvbnRyb2xzLmNvbXBhcmlzb25WYWx1ZS5jb250cm9scy5kb3VibGVWYWx1ZVwiIGNsYXNzPVwidGFyZ2V0aW5nLXJ1bGUtY29tcG9uZW50IGdyb3dcIj5cbiAgICAgICAgPG1hdC1mb3JtLWZpZWxkIGFwcGVhcmFuY2U9XCJvdXRsaW5lXCIgc3Vic2NyaXB0U2l6aW5nPVwiZHluYW1pY1wiPlxuICAgICAgICAgICAgPGlucHV0IG1hdElucHV0IHR5cGU9XCJudW1iZXJcIiBbZm9ybUNvbnRyb2xdPVwiZm9ybUdyb3VwLmNvbnRyb2xzLmNvbXBhcmlzb25WYWx1ZS5jb250cm9scy5kb3VibGVWYWx1ZVwiXG4gICAgICAgICAgICAgICAgbWF0VG9vbHRpcD1cIkNvbXBhcmlzb24gdmFsdWUgKG51bWJlcilcIiBwbGFjZWhvbGRlcj1cIkFkZCBudW1iZXIgLi4uXCIgaW5wdXREaXNwbGF5Tm9ybWFsaXplciAvPlxuICAgICAgICAgICAgPG1hdC1lcnJvciAqbmdJZj1cImZvcm1Hcm91cC5jb250cm9scy5jb21wYXJpc29uVmFsdWUuY29udHJvbHMuZG91YmxlVmFsdWUuaW52YWxpZFwiPlxuICAgICAgICAgICAgICAgIHt7Rm9ybUhlbHBlci5nZXRFcnJvck1lc3NhZ2UoZm9ybUdyb3VwLmNvbnRyb2xzLmNvbXBhcmlzb25WYWx1ZS5jb250cm9scy5kb3VibGVWYWx1ZSl9fVxuICAgICAgICAgICAgPC9tYXQtZXJyb3I+XG4gICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XG4gICAgPC9kaXY+XG48L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGUgI2RhdGVUaW1lVGVtcGxhdGU+XG4gICAgPGRpdiAqbmdJZj1cImZvcm1Hcm91cC5jb250cm9scy5jb21wYXJpc29uVmFsdWUuY29udHJvbHMuZG91YmxlVmFsdWVcIiBjbGFzcz1cInRhcmdldGluZy1ydWxlLWNvbXBvbmVudCBkYXRldGltZVwiPlxuICAgICAgICA8YXBwLWRhdGUtdGltZS1waWNrZXIgW2Zvcm1Db250cm9sXT1cImZvcm1Hcm91cC5jb250cm9scy5jb21wYXJpc29uVmFsdWUuY29udHJvbHMuZG91YmxlVmFsdWVcIlxuICAgICAgICAgICAgZGF0ZVRvb2x0aXA9XCJDb21wYXJpc29uIHZhbHVlIChkYXRlKVwiIHRpbWVUb29sdGlwPVwiQ29tcGFyaXNvbiB2YWx1ZSAodGltZSlcIiAvPlxuICAgIDwvZGl2PlxuPC9uZy10ZW1wbGF0ZT5cblxuXG48bWF0LW1lbnUgI21vcmVNZW51PlxuICAgIDxhIG1hdC1tZW51LWl0ZW0gKGNsaWNrKT1cImV4cGFuZExpc3QoKVwiPjxtYXQtaWNvbj5lZGl0X25vdGU8L21hdC1pY29uPkFkdmFuY2VkIGVkaXRvcjwvYT5cbiAgICA8YSBtYXQtbWVudS1pdGVtIChjbGljayk9XCJjb3B5VmFsdWVzQXNDc3YoKVwiPjxtYXQtaWNvbj5jb250ZW50X2NvcHk8L21hdC1pY29uPkNvcHkgYXMgQ1NWICh2YWx1ZXMgb25seSk8L2E+XG4gICAgPGEgbWF0LW1lbnUtaXRlbSAoY2xpY2spPVwicmVtb3ZlQWxsKClcIiBbZGlzYWJsZWRdPVwicmVhZE9ubHlcIj48bWF0LWljb24+ZGVsZXRlX291dGxpbmU8L21hdC1pY29uPlJlbW92ZVxuICAgICAgICBhbGw8L2E+XG48L21hdC1tZW51PiJdfQ==
|
|
444
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXNlci1jb25kaXRpb24uY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmctY29uZmlnY2F0LXB1YmxpY2FwaS11aS9zcmMvbGliL3YyL2ZlYXR1cmUtZmxhZy9ldmFsdWF0aW9uLWZvcm11bGEvdGFyZ2V0aW5nLXJ1bGUvY29uZGl0aW9ucy91c2VyLWNvbmRpdGlvbi91c2VyLWNvbmRpdGlvbi5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZy1jb25maWdjYXQtcHVibGljYXBpLXVpL3NyYy9saWIvdjIvZmVhdHVyZS1mbGFnL2V2YWx1YXRpb24tZm9ybXVsYS90YXJnZXRpbmctcnVsZS9jb25kaXRpb25zL3VzZXItY29uZGl0aW9uL3VzZXItY29uZGl0aW9uLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDckQsT0FBTyxFQUFxQixTQUFTLEVBQUUsS0FBSyxFQUFVLFNBQVMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUN2RixPQUFPLEVBQUUsV0FBVyxFQUFhLE1BQU0sZ0JBQWdCLENBQUM7QUFHeEQsT0FBTyxFQUFFLFdBQVcsRUFBcUIsTUFBTSx3QkFBd0IsQ0FBQztBQUV4RSxPQUFPLEVBQ0wsVUFBVSxFQUNWLGNBQWMsRUFBRSxrQkFBa0IsRUFBRSxrQkFBa0IsRUFDSixjQUFjLEVBQ3ZDLDJCQUEyQixFQUErQyxtQkFBbUIsRUFDdkgsTUFBTSw2QkFBNkIsQ0FBQztBQUNyQyxPQUFPLEVBQUUseUJBQXlCLEVBQUUsTUFBTSxpREFBaUQsQ0FBQztBQUM1RixPQUFPLEVBQUUsK0JBQStCLEVBQThCLE1BQU0saUVBQWlFLENBQUM7QUFDOUksT0FBTyxFQUFFLCtCQUErQixFQUE4QixNQUFN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VyxFQUFFLFFBQVEsRUFBRSxjQUFjLEVBQUU7U0FDbkQsc0lDM0ZILDh6V0FrTFc7OzJGRHJGRSxzQkFBc0I7a0JBWGxDLFNBQVM7K0JBQ0Usb0JBQW9CLGFBTW5CO3dCQUNULEVBQUUsT0FBTyxFQUFFLFdBQVcsRUFBRSxRQUFRLEVBQUUsY0FBYyxFQUFFO3FCQUNuRDt5T0FPUSxrQkFBa0I7c0JBQTFCLEtBQUs7Z0JBQ0csY0FBYztzQkFBdEIsS0FBSztnQkFDRyxRQUFRO3NCQUFoQixLQUFLO2dCQUNHLHNCQUFzQjtzQkFBOUIsS0FBSztnQkFDRyxTQUFTO3NCQUFqQixLQUFLO2dCQUd3QyxjQUFjO3NCQUEzRCxTQUFTO3VCQUFDLFVBQVUsRUFBRSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBFTlRFUiwgQ09NTUEgfSBmcm9tICdAYW5ndWxhci9jZGsva2V5Y29kZXMnO1xuaW1wb3J0IHsgQ2hhbmdlRGV0ZWN0b3JSZWYsIENvbXBvbmVudCwgSW5wdXQsIE9uSW5pdCwgVmlld0NoaWxkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBGb3JtQ29udHJvbCwgRm9ybUdyb3VwIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgTWF0Q2hpcElucHV0RXZlbnQsIE1hdENoaXBFZGl0ZWRFdmVudCwgTWF0Q2hpcEdyaWQsIE1hdENoaXBSb3cgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9jaGlwcyc7XG5pbXBvcnQgeyBNYXREaWFsb2cgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9kaWFsb2cnO1xuaW1wb3J0IHsgRGF0ZUFkYXB0ZXIsIEVycm9yU3RhdGVNYXRjaGVyIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvY29yZSc7XG5pbXBvcnQgeyBDbGlwYm9hcmQgfSBmcm9tICdAYW5ndWxhci9jZGsvY2xpcGJvYXJkJztcbmltcG9ydCB7XG4gIEZvcm1IZWxwZXIsIENvbXBhcmlzb25WYWx1ZUxpc3RGb3JtLCBVc2VyQ29uZGl0aW9uRm9ybSwgRm9ybUdlbmVyYXRvcixcbiAgVXNlckNvbXBhcmF0b3IsIFVzZXJDb21wYXJhdG9yVGV4dCwgVXNlckNvbXBhcmF0b3JUeXBlLFxuICBJQ29tcGFyaXNvblZhbHVlTGlzdE1vZGVsLCBJQ29tcGFyaXNvblZhbHVlTW9kZWwsIEFwcERhdGVBZGFwdGVyLFxuICBJRmVhdHVyZUZsYWdMaW1pdGF0aW9ucywgQ29uZmlybWF0aW9uRGlhbG9nQ29tcG9uZW50LCBDb21wYXJpc29uVmFsdWVMaXN0SGVscGVyLCBNZXNzYWdpbmdTZXJ2aWNlLCBJbmZvRGlhbG9nQ29tcG9uZW50XG59IGZyb20gJy4uLy4uLy4uLy4uLy4uLy4uL2Jvb3RzdHJhcCc7XG5pbXBvcnQgeyBDb21wYXJhdG9yRGlhbG9nQ29tcG9uZW50IH0gZnJvbSAnLi9jb21wYXJhdG9yLWRpYWxvZy9jb21wYXJhdG9yLWRpYWxvZy5jb21wb25lbnQnO1xuaW1wb3J0IHsgUG9wb3V0TGlzdEVkaXRvckRpYWxvZ0NvbXBvbmVudCwgUG9wb3V0TGlzdEVkaXRvckRpYWxvZ0RhdGEgfSBmcm9tICcuL3BvcG91dC1saXN0LWVkaXRvci1kaWFsb2cvcG9wb3V0LWxpc3QtZWRpdG9yLWRpYWxvZy5jb21wb25lbnQnO1xuaW1wb3J0IHsgUG9wb3V0VGV4dEVkaXRvckRpYWxvZ0NvbXBvbmVudCwgUG9wb3V0VGV4dEVkaXRvckRpYWxvZ0RhdGEgfSBmcm9tICcuLi8uLi8uLi9wb3BvdXQtdGV4dC1lZGl0b3ItZGlhbG9nL3BvcG91dC10ZXh0LWVkaXRvci1kaWFsb2cuY29tcG9uZW50JztcblxuZXhwb3J0IGNsYXNzIExpc3RWYWx1ZUVycm9yU3RhdGVNYXRjaGVyIGltcGxlbWVudHMgRXJyb3JTdGF0ZU1hdGNoZXIge1xuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGZvcm1Hcm91cDogRm9ybUdyb3VwPFVzZXJDb25kaXRpb25Gb3JtPikgeyB9XG4gIGlzRXJyb3JTdGF0ZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5mb3JtR3JvdXAuY29udHJvbHMuY29tcGFyaXNvblZhbHVlLmNvbnRyb2xzLmxpc3RWYWx1ZT8udG91Y2hlZCAmJiB0aGlzLmZvcm1Hcm91cC5jb250cm9scy5jb21wYXJpc29uVmFsdWUuY29udHJvbHMubGlzdFZhbHVlPy5pbnZhbGlkO1xuICB9XG59XG5cbmVudW0gQ29tcGFyYXRvckdyb3VwIHtcbiAgQ29uZmlkZW50aWFsVGV4dCA9ICdDT05GSURFTlRJQUwgVEVYVCcsXG4gIFRleHQgPSAnVEVYVCcsXG4gIFNlbWFudGljVmVyc2lvbiA9ICdTRU1BTlRJQyBWRVJTSU9OJyxcbiAgTnVtYmVyID0gJ05VTUJFUicsXG4gIERhdGVUaW1lID0gJ0RBVEVUSU1FJyxcbiAgQ29uZmlkZW50aWFsQXJyYXkgPSAnQ09ORklERU5USUFMIEFSUkFZJyxcbiAgQXJyYXkgPSAnQVJSQVknXG59XG5cbmludGVyZmFjZSBJQ29tcGFyYXRvclZhbHVlIHtcbiAgdmFsdWU6IFVzZXJDb21wYXJhdG9yLFxuICBsYWJlbDogVXNlckNvbXBhcmF0b3JUZXh0LFxuICBncm91cDogQ29tcGFyYXRvckdyb3VwLFxuICBpbmRleDogbnVtYmVyLFxufVxuXG5jb25zdCBhbGxDb21wYXJhdG9yczogSUNvbXBhcmF0b3JWYWx1ZVtdID0gW1xuICB7IHZhbHVlOiBVc2VyQ29tcGFyYXRvci5Jc09uZU9mLCBsYWJlbDogVXNlckNvbXBhcmF0b3JUZXh0LklzT25lT2YsIGdyb3VwOiBDb21wYXJhdG9yR3JvdXAuVGV4dCwgaW5kZXg6IDAgfSxcbiAgeyB2YWx1ZTogVXNlckNvbXBhcmF0b3IuSXNOb3RPbmVPZiwgbGFiZWw6IFVzZXJDb21wYXJhdG9yVGV4dC5Jc05vdE9uZU9mLCBncm91cDogQ29tcGFyYXRvckdyb3VwLlRleHQsIGluZGV4OiAxIH0sXG4gIHsgdmFsdWU6IFVzZXJDb21wYXJhdG9yLkNvbnRhaW5zQW55T2YsIGxhYmVsOiBVc2VyQ29tcGFyYXRvclRleHQuQ29udGFpbnNBbnlPZiwgZ3JvdXA6IENvbXBhcmF0b3JHcm91cC5UZXh0LCBpbmRleDogMiB9LFxuICB7IHZhbHVlOiBVc2VyQ29tcGFyYXRvci5Eb2VzTm90Q29udGFpbkFueU9mLCBsYWJlbDogVXNlckNvbXBhcmF0b3JUZXh0LkRvZXNOb3RDb250YWluQW55T2YsIGdyb3VwOiBDb21wYXJhdG9yR3JvdXAuVGV4dCwgaW5kZXg6IDMgfSxcbiAgeyB2YWx1ZTogVXNlckNvbXBhcmF0b3IuU2VtVmVySXNPbmVPZiwgbGFiZWw6IFVzZXJDb21wYXJhdG9yVGV4dC5TZW1WZXJJc09uZU9mLCBncm91cDogQ29tcGFyYXRvckdyb3VwLlNlbWFudGljVmVyc2lvbiwgaW5kZXg6IDQgfSxcbiAgeyB2YWx1ZTogVXNlckNvbXBhcmF0b3IuU2VtVmVySXNOb3RPbmVPZiwgbGFiZWw6IFVzZXJDb21wYXJhdG9yVGV4dC5TZW1WZXJJc05vdE9uZU9mLCBncm91cDogQ29tcGFyYXRvckdyb3VwLlNlbWFudGljVmVyc2lvbiwgaW5kZXg6IDUgfSxcbiAgeyB2YWx1ZTogVXNlckNvbXBhcmF0b3IuU2VtVmVyTGVzcywgbGFiZWw6IFVzZXJDb21wYXJhdG9yVGV4dC5TZW1WZXJMZXNzLCBncm91cDogQ29tcGFyYXRvckdyb3VwLlNlbWFudGljVmVyc2lvbiwgaW5kZXg6IDYgfSxcbiAgeyB2YWx1ZTogVXNlckNvbXBhcmF0b3IuU2VtVmVyTGVzc09yRXF1YWxzLCBsYWJlbDogVXNlckNvbXBhcmF0b3JUZXh0LlNlbVZlckxlc3NPckVxdWFscywgZ3JvdXA6IENvbXBhcmF0b3JHcm91cC5TZW1hbnRpY1ZlcnNpb24sIGluZGV4OiA3IH0sXG4gIHsgdmFsdWU6IFVzZXJDb21wYXJhdG9yLlNlbVZlckdyZWF0ZXIsIGxhYmVsOiBVc2VyQ29tcGFyYXRvclRleHQuU2VtVmVyR3JlYXRlciwgZ3JvdXA6IENvbXBhcmF0b3JHcm91cC5TZW1hbnRpY1ZlcnNpb24sIGluZGV4OiA4IH0sXG4gIHsgdmFsdWU6IFVzZXJDb21wYXJhdG9yLlNlbVZlckdyZWF0ZXJPckVxdWFscywgbGFiZWw6IFVzZXJDb21wYXJhdG9yVGV4dC5TZW1WZXJHcmVhdGVyT3JFcXVhbHMsIGdyb3VwOiBDb21wYXJhdG9yR3JvdXAuU2VtYW50aWNWZXJzaW9uLCBpbmRleDogOSB9LFxuICB7IHZhbHVlOiBVc2VyQ29tcGFyYXRvci5OdW1iZXJFcXVhbHMsIGxhYmVsOiBVc2VyQ29tcGFyYXRvclRleHQuTnVtYmVyRXF1YWxzLCBncm91cDogQ29tcGFyYXRvckdyb3VwLk51bWJlciwgaW5kZXg6IDEwIH0sXG4gIHsgdmFsdWU6IFVzZXJDb21wYXJhdG9yLk51bWJlckRvZXNOb3RFcXVhbCwgbGFiZWw6IFVzZXJDb21wYXJhdG9yVGV4dC5OdW1iZXJEb2VzTm90RXF1YWwsIGdyb3VwOiBDb21wYXJhdG9yR3JvdXAuTnVtYmVyLCBpbmRleDogMTEgfSxcbiAgeyB2YWx1ZTogVXNlckNvbXBhcmF0b3IuTnVtYmVyTGVzcywgbGFiZWw6IFVzZXJDb21wYXJhdG9yVGV4dC5OdW1iZXJMZXNzLCBncm91cDogQ29tcGFyYXRvckdyb3VwLk51bWJlciwgaW5kZXg6IDEyIH0sXG4gIHsgdmFsdWU6IFVzZXJDb21wYXJhdG9yLk51bWJlckxlc3NPckVxdWFscywgbGFiZWw6IFVzZXJDb21wYXJhdG9yVGV4dC5OdW1iZXJMZXNzT3JFcXVhbHMsIGdyb3VwOiBDb21wYXJhdG9yR3JvdXAuTnVtYmVyLCBpbmRleDogMTMgfSxcbiAgeyB2YWx1ZTogVXNlckNvbXBhcmF0b3IuTnVtYmVyR3JlYXRlciwgbGFiZWw6IFVzZXJDb21wYXJhdG9yVGV4dC5OdW1iZXJHcmVhdGVyLCBncm91cDogQ29tcGFyYXRvckdyb3VwLk51bWJlciwgaW5kZXg6IDE0IH0sXG4gIHsgdmFsdWU6IFVzZXJDb21wYXJhdG9yLk51bWJlckdyZWF0ZXJPckVxdWFscywgbGFiZWw6IFVzZXJDb21wYXJhdG9yVGV4dC5OdW1iZXJHcmVhdGVyT3JFcXVhbHMsIGdyb3VwOiBDb21wYXJhdG9yR3JvdXAuTnVtYmVyLCBpbmRleDogMTUgfSxcbiAgeyB2YWx1ZTogVXNlckNvbXBhcmF0b3IuU2Vuc2l0aXZlSXNPbmVPZiwgbGFiZWw6IFVzZXJDb21wYXJhdG9yVGV4dC5TZW5zaXRpdmVJc09uZU9mLCBncm91cDogQ29tcGFyYXRvckdyb3VwLkNvbmZpZGVudGlhbFRleHQsIGluZGV4OiAxNiB9LFxuICB7IHZhbHVlOiBVc2VyQ29tcGFyYXRvci5TZW5zaXRpdmVJc05vdE9uZU9mLCBsYWJlbDogVXNlckNvbXBhcmF0b3JUZXh0LlNlbnNpdGl2ZUlzTm90T25lT2YsIGdyb3VwOiBDb21wYXJhdG9yR3JvdXAuQ29uZmlkZW50aWFsVGV4dCwgaW5kZXg6IDE3IH0sXG4gIHsgdmFsdWU6IFVzZXJDb21wYXJhdG9yLkRhdGVUaW1lQmVmb3JlLCBsYWJlbDogVXNlckNvbXBhcmF0b3JUZXh0LkRhdGVUaW1lQmVmb3JlLCBncm91cDogQ29tcGFyYXRvckdyb3VwLkRhdGVUaW1lLCBpbmRleDogMTggfSxcbiAgeyB2YWx1ZTogVXNlckNvbXBhcmF0b3IuRGF0ZVRpbWVBZnRlciwgbGFiZWw6IFVzZXJDb21wYXJhdG9yVGV4dC5EYXRlVGltZUFmdGVyLCBncm91cDogQ29tcGFyYXRvckdyb3VwLkRhdGVUaW1lLCBpbmRleDogMTkgfSxcbiAgeyB2YWx1ZTogVXNlckNvbXBhcmF0b3IuU2Vuc2l0aXZlVGV4dEVxdWFscywgbGFiZWw6IFVzZXJDb21wYXJhdG9yVGV4dC5TZW5zaXRpdmVUZXh0RXF1YWxzLCBncm91cDogQ29tcGFyYXRvckdyb3VwLkNvbmZpZGVudGlhbFRleHQsIGluZGV4OiAyMCB9LFxuICB7IHZhbHVlOiBVc2VyQ29tcGFyYXRvci5TZW5zaXRpdmVUZXh0RG9lc05vdEVxdWFsLCBsYWJlbDogVXNlckNvbXBhcmF0b3JUZXh0LlNlbnNpdGl2ZVRleHREb2VzTm90RXF1YWwsIGdyb3VwOiBDb21wYXJhdG9yR3JvdXAuQ29uZmlkZW50aWFsVGV4dCwgaW5kZXg6IDIxIH0sXG4gIHsgdmFsdWU6IFVzZXJDb21wYXJhdG9yLlNlbnNpdGl2ZVRleHRTdGFydHNXaXRoQW55T2YsIGxhYmVsOiBVc2VyQ29tcGFyYXRvclRleHQuU2Vuc2l0aXZlVGV4dFN0YXJ0c1dpdGhBbnlPZiwgZ3JvdXA6IENvbXBhcmF0b3JHcm91cC5Db25maWRlbnRpYWxUZXh0LCBpbmRleDogMjIgfSxcbiAgeyB2YWx1ZTogVXNlckNvbXBhcmF0b3IuU2Vuc2l0aXZlVGV4dE5vdFN0YXJ0c1dpdGhBbnlPZiwgbGFiZWw6IFVzZXJDb21wYXJhdG9yVGV4dC5TZW5zaXRpdmVUZXh0Tm90U3RhcnRzV2l0aEFueU9mLCBncm91cDogQ29tcGFyYXRvckdyb3VwLkNvbmZpZGVudGlhbFRleHQsIGluZGV4OiAyMyB9LFxuICB7IHZhbHVlOiBVc2VyQ29tcGFyYXRvci5TZW5zaXRpdmVUZXh0RW5kc1dpdGhBbnlPZiwgbGFiZWw6IFVzZXJDb21wYXJhdG9yVGV4dC5TZW5zaXRpdmVUZXh0RW5kc1dpdGhBbnlPZiwgZ3JvdXA6IENvbXBhcmF0b3JHcm91cC5Db25maWRlbnRpYWxUZXh0LCBpbmRleDogMjQgfSxcbiAgeyB2YWx1ZTogVXNlckNvbXBhcmF0b3IuU2Vuc2l0aXZlVGV4dE5vdEVuZHNXaXRoQW55T2YsIGxhYmVsOiBVc2VyQ29tcGFyYXRvclRleHQuU2Vuc2l0aXZlVGV4dE5vdEVuZHNXaXRoQW55T2YsIGdyb3VwOiBDb21wYXJhdG9yR3JvdXAuQ29uZmlkZW50aWFsVGV4dCwgaW5kZXg6IDI1IH0sXG4gIHsgdmFsdWU6IFVzZXJDb21wYXJhdG9yLlNlbnNpdGl2ZUFycmF5Q29udGFpbnNBbnlPZiwgbGFiZWw6IFVzZXJDb21wYXJhdG9yVGV4dC5TZW5zaXRpdmVBcnJheUNvbnRhaW5zQW55T2YsIGdyb3VwOiBDb21wYXJhdG9yR3JvdXAuQ29uZmlkZW50aWFsQXJyYXksIGluZGV4OiAyNiB9LFxuICB7IHZhbHVlOiBVc2VyQ29tcGFyYXRvci5TZW5zaXRpdmVBcnJheURvZXNOb3RDb250YWluQW55T2YsIGxhYmVsOiBVc2VyQ29tcGFyYXRvclRleHQuU2Vuc2l0aXZlQXJyYXlEb2VzTm90Q29udGFpbkFueU9mLCBncm91cDogQ29tcGFyYXRvckdyb3VwLkNvbmZpZGVudGlhbEFycmF5LCBpbmRleDogMjcgfSxcbiAgeyB2YWx1ZTogVXNlckNvbXBhcmF0b3IuVGV4dEVxdWFscywgbGFiZWw6IFVzZXJDb21wYXJhdG9yVGV4dC5UZXh0RXF1YWxzLCBncm91cDogQ29tcGFyYXRvckdyb3VwLlRleHQsIGluZGV4OiAyOCB9LFxuICB7IHZhbHVlOiBVc2VyQ29tcGFyYXRvci5UZXh0RG9lc05vdEVxdWFsLCBsYWJlbDogVXNlckNvbXBhcmF0b3JUZXh0LlRleHREb2VzTm90RXF1YWwsIGdyb3VwOiBDb21wYXJhdG9yR3JvdXAuVGV4dCwgaW5kZXg6IDI5IH0sXG4gIHsgdmFsdWU6IFVzZXJDb21wYXJhdG9yLlRleHRTdGFydHNXaXRoQW55T2YsIGxhYmVsOiBVc2VyQ29tcGFyYXRvclRleHQuVGV4dFN0YXJ0c1dpdGhBbnlPZiwgZ3JvdXA6IENvbXBhcmF0b3JHcm91cC5UZXh0LCBpbmRleDogMzAgfSxcbiAgeyB2YWx1ZTogVXNlckNvbXBhcmF0b3IuVGV4dE5vdFN0YXJ0c1dpdGhBbnlPZiwgbGFiZWw6IFVzZXJDb21wYXJhdG9yVGV4dC5UZXh0Tm90U3RhcnRzV2l0aEFueU9mLCBncm91cDogQ29tcGFyYXRvckdyb3VwLlRleHQsIGluZGV4OiAzMSB9LFxuICB7IHZhbHVlOiBVc2VyQ29tcGFyYXRvci5UZXh0RW5kc1dpdGhBbnlPZiwgbGFiZWw6IFVzZXJDb21wYXJhdG9yVGV4dC5UZXh0RW5kc1dpdGhBbnlPZiwgZ3JvdXA6IENvbXBhcmF0b3JHcm91cC5UZXh0LCBpbmRleDogMzIgfSxcbiAgeyB2YWx1ZTogVXNlckNvbXBhcmF0b3IuVGV4dE5vdEVuZHNXaXRoQW55T2YsIGxhYmVsOiBVc2VyQ29tcGFyYXRvclRleHQuVGV4dE5vdEVuZHNXaXRoQW55T2YsIGdyb3VwOiBDb21wYXJhdG9yR3JvdXAuVGV4dCwgaW5kZXg6IDMzIH0sXG4gIHsgdmFsdWU6IFVzZXJDb21wYXJhdG9yLkFycmF5Q29udGFpbnNBbnlPZiwgbGFiZWw6IFVzZXJDb21wYXJhdG9yVGV4dC5BcnJheUNvbnRhaW5zQW55T2YsIGdyb3VwOiBDb21wYXJhdG9yR3JvdXAuQXJyYXksIGluZGV4OiAzNCB9LFxuICB7IHZhbHVlOiBVc2VyQ29tcGFyYXRvci5BcnJheURvZXNOb3RDb250YWluQW55T2YsIGxhYmVsOiBVc2VyQ29tcGFyYXRvclRleHQuQXJyYXlEb2VzTm90Q29udGFpbkFueU9mLCBncm91cDogQ29tcGFyYXRvckdyb3VwLkFycmF5LCBpbmRleDogMzUgfSxcbl1cblxuY29uc3QgZGVmYXVsdENvbXBhcmF0b3JJZHMgPSBbMTYsIDE3LCAyMCwgMjEsIDIyLCAyMywgMjQsIDI1LCAyLCAzLCA0LCA1LCA2LCA3LCA4LCA5LCAxMCwgMTEsIDEyLCAxMywgMTQsIDE1LCAxOCwgMTldO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdhcHAtdXNlci1jb25kaXRpb24nLFxuICB0ZW1wbGF0ZVVybDogJy4vdXNlci1jb25kaXRpb24uY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFtcbiAgICAnLi4vLi4vLi4vY29tcG9uZW50cy5zY3NzJyxcbiAgICAnLi91c2VyLWNvbmRpdGlvbi5jb21wb25lbnQuc2NzcydcbiAgXSxcbiAgcHJvdmlkZXJzOiBbXG4gICAgeyBwcm92aWRlOiBEYXRlQWRhcHRlciwgdXNlQ2xhc3M6IEFwcERhdGVBZGFwdGVyIH1cbiAgXSxcbn0pXG5leHBvcnQgY2xhc3MgVXNlckNvbmRpdGlvbkNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XG4gIHJlYWRvbmx5IHNlcGFyYXRvcktleXNDb2RlcyA9IFtFTlRFUiwgQ09NTUFdIGFzIGNvbnN0O1xuXG4gIEZvcm1IZWxwZXIgPSBGb3JtSGVscGVyO1xuXG4gIEBJbnB1dCgpIHRhcmdldGluZ1J1bGVJbmRleDogbnVtYmVyO1xuICBASW5wdXQoKSBjb25kaXRpb25JbmRleDogbnVtYmVyO1xuICBASW5wdXQoKSByZWFkT25seTogYm9vbGVhbjtcbiAgQElucHV0KCkgZmVhdHVyZUZsYWdMaW1pdGF0aW9uczogSUZlYXR1cmVGbGFnTGltaXRhdGlvbnM7XG4gIEBJbnB1dCgpIGZvcm1Hcm91cDogRm9ybUdyb3VwPFVzZXJDb25kaXRpb25Gb3JtPjtcbiAgbWF0Q2hpcEdyaWQ6IE1hdENoaXBHcmlkO1xuXG4gIEBWaWV3Q2hpbGQoXCJjaGlwR3JpZFwiLCB7IHN0YXRpYzogZmFsc2UgfSkgc2V0IHNldE1hdENoaXBHcmlkKG1hdENoaXBHcmlkOiBNYXRDaGlwR3JpZCkge1xuICAgIHRoaXMubWF0Q2hpcEdyaWQgPSBtYXRDaGlwR3JpZDtcbiAgfVxuXG4gIGRlZmF1bHRDb21wYXJpc29uQXR0cmlidXRlcyA9IFsnSWRlbnRpZmllcicsICdFbWFpbCcsICdDb3VudHJ5J107XG5cbiAgZGF0ZVZhbHVlOiBEYXRlO1xuICB0aW1lVmFsdWU6IHN0cmluZztcblxuICBjb21wYXJhdG9yU3VnZ2VzdGlvbnMgPSBuZXcgTWFwPGFueSwgYW55PigpO1xuICBzZWxlY3RlZENvbXBhcmF0b3I6IFVzZXJDb21wYXJhdG9yO1xuICBjb21wYXJhdG9yU2VwYXJhdG9yID0gXCLilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcIjtcblxuICBrZWVwT3JkZXIgPSAoYTogYW55LCBfOiBhbnkpID0+IGE7XG5cbiAgUm9sbG91dFJ1bGVDb21wYXJhdG9yVjJUeXBlID0gVXNlckNvbXBhcmF0b3JUeXBlO1xuICByb2xsb3V0UnVsZUNvbXBhcmF0b3JUeXBlOiBVc2VyQ29tcGFyYXRvclR5cGU7XG4gIGlzQ2xlYXJUZXh0Q29tcGFyYXRvclNlbGVjdGVkOiBib29sZWFuO1xuXG4gIC8vIFRoZSBjaGlwIGdyaWQncyBbZm9ybUNvbnRyb2xdIG9ubHkgYWNjZXB0cyBhIEZvcm1Db250cm9sLiBXZSBoYXZlIGEgRm9ybUFycmF5IChiZWNhdXNlIG9mIHRoZSBuYW1lK2hpbnQpLlxuICAvLyBXZSBoYXZlIHRvIGZha2UgYSBGb3JtQ29udHJvbCBhbmQgbWF0Y2ggdGhhdCBmb3JtQ29udHJvbCdzIGVycm9yc3RhdGUgd2l0aCB0aGUgb3JpZ2luYWwgY29tcG9uZW50J3MgZXJyb3JTdGF0ZS5cbiAgZmFrZUZvcm1Db250cm9sID0gbmV3IEZvcm1Db250cm9sPHN0cmluZz4oJycpO1xuICBlcnJvclN0YXRlTWF0Y2hlcjogTGlzdFZhbHVlRXJyb3JTdGF0ZU1hdGNoZXI7XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBmb3JtR2VuZXJhdG9yOiBGb3JtR2VuZXJhdG9yLFxuICAgIHByaXZhdGUgZGlhbG9nOiBNYXREaWFsb2csXG4gICAgcHJpdmF0ZSBjb21wYXJpc29uVmFsdWVMaXN0SGVscGVyOiBDb21wYXJpc29uVmFsdWVMaXN0SGVscGVyLFxuICAgIHByaXZhdGUgY2xpcGJvYXJkOiBDbGlwYm9hcmQsXG4gICAgcHJpdmF0ZSBtZXNzYWdpbmdTZXJ2aWNlOiBNZXNzYWdpbmdTZXJ2aWNlLFxuICAgIHByaXZhdGUgY2hhbmdlRGV0ZWN0b3JSZWY6IENoYW5nZURldGVjdG9yUmVmKSB7IH1cblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLnJvbGxvdXRSdWxlQ29tcGFyYXRvclR5cGUgPSB0aGlzLmZvcm1HZW5lcmF0b3IuZ2V0Q29tcGFyaXNvblZhbHVlVHlwZSh0aGlzLmZvcm1Hcm91cC5jb250cm9scy5jb21wYXJhdG9yLnZhbHVlKTtcbiAgICB0aGlzLmlzQ2xlYXJUZXh0Q29tcGFyYXRvclNlbGVjdGVkID0gdGhpcy5pc0NsZWFyVGV4dENvbXBhcmF0b3IodGhpcy5mb3JtR3JvdXAuY29udHJvbHMuY29tcGFyYXRvci52YWx1ZSk7XG4gICAgdGhpcy5lcnJvclN0YXRlTWF0Y2hlciA9IG5ldyBMaXN0VmFsdWVFcnJvclN0YXRlTWF0Y2hlcih0aGlzLmZvcm1Hcm91cCk7XG4gICAgdGhpcy5zZWxlY3RlZENvbXBhcmF0b3IgPSB0aGlzLmZvcm1Hcm91cC5jb250cm9scy5jb21wYXJhdG9yLnZhbHVlO1xuICAgIHRoaXMuY2FsY0NvbXBhcmF0b3JzKCk7XG4gIH1cblxuICBhdHRyaWJ1dGVDaGFuZ2VkKGV2ZW50OiBFdmVudCk6IHZvaWQge1xuICAgIGNvbnN0IHZhbHVlID0gKDxIVE1MU2VsZWN0RWxlbWVudD5ldmVudC50YXJnZXQpLnZhbHVlO1xuICAgIGlmICh0aGlzLmRlZmF1bHRDb21wYXJpc29uQXR0cmlidXRlcy5pbmRleE9mKHZhbHVlKSAhPT0gLTEpIHtcbiAgICAgIGlmICh0aGlzLmZvcm1Hcm91cC5jb250cm9scy5jb21wYXJpc29uQXR0cmlidXRlLnZhbHVlICE9PSB2YWx1ZSkge1xuICAgICAgICB0aGlzLmZvcm1Hcm91cC5jb250cm9scy5jb21wYXJpc29uQXR0cmlidXRlLnNldFZhbHVlKHZhbHVlKTtcbiAgICAgICAgdGhpcy5mb3JtR3JvdXAubWFya0FzRGlydHkoKTtcbiAgICAgICAgdGhpcy5jYWxjQ29tcGFyYXRvcnModHJ1ZSk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmICh0aGlzLmZvcm1Hcm91cC5jb250cm9scy5jb21wYXJpc29uQXR0cmlidXRlLnZhbHVlICE9PSAnJykge1xuICAgICAgdGhpcy5mb3JtR3JvdXAuY29udHJvbHMuY29tcGFyaXNvbkF0dHJpYnV0ZS5zZXRWYWx1ZSgnJyk7XG4gICAgICB0aGlzLmZvcm1Hcm91cC5tYXJrQXNEaXJ0eSgpO1xuICAgICAgdGhpcy5jYWxjQ29tcGFyYXRvcnModHJ1ZSk7XG4gICAgfVxuICB9XG5cbiAgY29tcGFyYXRvckNoYW5nZWQodmFsdWU6IGFueSk6IHZvaWQge1xuICAgIGlmICh2YWx1ZSA9PT0gXCJzaG93YWxsXCIpIHtcbiAgICAgIHRoaXMuY2hhbmdlRGV0ZWN0b3JSZWYuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgdGhpcy5zZWxlY3RlZENvbXBhcmF0b3IgPSB0aGlzLmZvcm1Hcm91cC5jb250cm9scy5jb21wYXJhdG9yLnZhbHVlO1xuICAgICAgdGhpcy5jaGFuZ2VEZXRlY3RvclJlZi5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICB0aGlzLmNvbXBEaWFsb2coKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLmZvcm1Hcm91cC5jb250cm9scy5jb21wYXJhdG9yLnNldFZhbHVlKHZhbHVlKTtcbiAgICB0aGlzLmZvcm1Hcm91cC5tYXJrQXNEaXJ0eSgpO1xuICAgIHRoaXMuc2VsZWN0ZWRDb21wYXJhdG9yID0gdmFsdWU7XG4gICAgdGhpcy5pc0NsZWFyVGV4dENvbXBhcmF0b3JTZWxlY3RlZCA9IHRoaXMuaXNDbGVhclRleHRDb21wYXJhdG9yKHRoaXMuZm9ybUdyb3VwLmNvbnRyb2xzLmNvbXBhcmF0b3IudmFsdWUpO1xuXG4gICAgY29uc3Qgb2xkUm9sbG91dFJ1bGVDb21wYXJhdG9yVHlwZSA9IHRoaXMucm9sbG91dFJ1bGVDb21wYXJhdG9yVHlwZTtcbiAgICB0aGlzLnJvbGxvdXRSdWxlQ29tcGFyYXRvclR5cGUgPSB0aGlzLmZvcm1HZW5lcmF0b3IuZ2V0Q29tcGFyaXNvblZhbHVlVHlwZSh0aGlzLmZvcm1Hcm91cC5jb250cm9scy5jb21wYXJhdG9yLnZhbHVlKTtcbiAgICBpZiAob2xkUm9sbG91dFJ1bGVDb21wYXJhdG9yVHlwZSAhPT0gdGhpcy5yb2xsb3V0UnVsZUNvbXBhcmF0b3JUeXBlKSB7XG4gICAgICBjb25zdCBkZWZhdWx0VmFsdWU6IElDb21wYXJpc29uVmFsdWVNb2RlbCA9IHRoaXMucm9sbG91dFJ1bGVDb21wYXJhdG9yVHlwZSA9PT0gVXNlckNvbXBhcmF0b3JUeXBlLkRhdGVUaW1lID8ge1xuICAgICAgICBkb3VibGVWYWx1ZTogbmV3IERhdGUoKS5nZXRUaW1lKCkgLyAxMDAwLjBcbiAgICAgIH0gOiB7fTtcbiAgICAgIHRoaXMuZm9ybUdyb3VwLnNldENvbnRyb2woJ2NvbXBhcmlzb25WYWx1ZScsIHRoaXMuZm9ybUdlbmVyYXRvci5nZW5lcmF0ZUNvbXBhcmlzb25WYWx1ZUZvcm1Hcm91cChkZWZhdWx0VmFsdWUsIHRoaXMuZm9ybUdyb3VwLmNvbnRyb2xzLmNvbXBhcmF0b3IudmFsdWUsIGZhbHNlLCB0aGlzLmZlYXR1cmVGbGFnTGltaXRhdGlvbnMpKVxuICAgIH1cbiAgfVxuXG4gIGNvbXBEaWFsb2coKSB7XG4gICAgY29uc3QgZGlhbG9nUmVmID0gdGhpcy5kaWFsb2cub3BlbihDb21wYXJhdG9yRGlhbG9nQ29tcG9uZW50LCB7XG4gICAgICB3aWR0aDogJzExMzBweCcsXG4gICAgICBwb3NpdGlvbjoge1xuICAgICAgICB0b3A6IHdpbmRvdy5pbm5lckhlaWdodCA8IDc1MCA/ICcwcHgnIDogd2luZG93LmlubmVySGVpZ2h0IDwgOTUwID8gJzUwcHgnIDogJzEwMHB4JyxcbiAgICAgIH0sXG4gICAgICBkYXRhOiB7XG4gICAgICAgIHJlYWRPbmx5OiB0aGlzLnJlYWRPbmx5LFxuICAgICAgICBzZWxlY3RlZENvbXBhcmF0b3I6IHRoaXMuZm9ybUdyb3VwLmNvbnRyb2xzLmNvbXBhcmF0b3IudmFsdWVcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGRpYWxvZ1JlZi5hZnRlckNsb3NlZCgpLnN1YnNjcmliZShyZXN1bHQgPT4ge1xuICAgICAgaWYgKHJlc3VsdCAmJiByZXN1bHQgIT09IHRoaXMuZm9ybUdyb3VwLmNvbnRyb2xzLmNvbXBhcmF0b3IudmFsdWUpIHtcbiAgICAgICAgdGhpcy5jb21wYXJhdG9yQ2hhbmdlZChyZXN1bHQpO1xuICAgICAgICB0aGlzLmNhbGNDb21wYXJhdG9ycygpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgYWRkKGV2ZW50OiBNYXRDaGlwSW5wdXRFdmVudCk6IHZvaWQge1xuICAgIGNvbnN0IHZhbHVlID0gKGV2ZW50LnZhbHVlIHx8ICcnKS50cmltKCk7XG5cbiAgICBldmVudC5jaGlwSW5wdXQ/LmNsZWFyKCk7XG5cbiAgICBpZiAoIXZhbHVlKSB7IHJldHVybjsgfVxuXG4gICAgaWYgKHZhbHVlLmluZGV4T2YoJywnKSA9PT0gLTEpIHtcbiAgICAgIHRoaXMuZm9ybUdlbmVyYXRvci5hZGRDb21wYXJpc29uVmFsdWVMaXN0VmFsdWVJdGVtcyhcbiAgICAgICAgdGhpcy5mb3JtR3JvdXAuY29udHJvbHMuY29tcGFyYXRvci52YWx1ZSxcbiAgICAgICAgdGhpcy5mb3JtR3JvdXAuY29udHJvbHMuY29tcGFyaXNvblZhbHVlLmNvbnRyb2xzLmxpc3RWYWx1ZSxcbiAgICAgICAgW3sgdmFsdWUgfV0sXG4gICAgICAgIHRoaXMuZmVhdHVyZUZsYWdMaW1pdGF0aW9ucyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgZGlhbG9nUmVmID0gdGhpcy5kaWFsb2cub3BlbihDb25maXJtYXRpb25EaWFsb2dDb21wb25lbnQsIHtcbiAgICAgIGRhdGE6IHtcbiAgICAgICAgdGl0bGU6ICdIb3cgd291bGQgeW91IGxpa2UgdG8gYWRkIHRoZSBpdGVtcz8nLFxuICAgICAgICBib2R5OiBgV2UndmUgbm90aWNlZCBhIGNvbW1hIGluIHRoZSB2YWx1ZSB5b3Ugd2FudCB0byBhZGQuIDxici8+IERvIHlvdSB3YW50IHRvIGFkZCBpdCBhcyBhIHNpbmdsZSBpdGVtLCBvciB3b3VsZCB5b3UgcHJlZmVyIHRvIGluc2VydCBtdWx0aXBsZSBpdGVtcyBzZXBhcmF0ZWQgYnkgY29tbWFzP2AsXG4gICAgICAgIHllc0J1dHRvbkxhYmVsOiAnQWRkIG11bHRpcGxlIGl0ZW1zJyxcbiAgICAgICAgbm9CdXR0b25MYWJlbDogJ0FkZCBhcyBhIHNpbmdsZSBpdGVtJ1xuICAgICAgfSxcbiAgICAgIGRpc2FibGVDbG9zZTogdHJ1ZVxuICAgIH0pO1xuXG4gICAgZGlhbG9nUmVmLmFmdGVyQ2xvc2VkKClcbiAgICAgIC5zdWJzY3JpYmUocmVzdWx0ID0+IHtcbiAgICAgICAgaWYgKHJlc3VsdCA9PT0gJ3llcycpIHtcbiAgICAgICAgICBjb25zdCBjb21wYXJpc29uVmFsdWVMaXN0UGFyc2VSZXN1bHQgPSB0aGlzLmNvbXBhcmlzb25WYWx1ZUxpc3RIZWxwZXIucGFyc2VWYWx1ZXNGcm9tQ3N2KHZhbHVlKTtcbiAgICAgICAgICBpZiAoY29tcGFyaXNvblZhbHVlTGlzdFBhcnNlUmVzdWx0LmVycm9yKSB7XG4gICAgICAgICAgICB0aGlzLm1lc3NhZ2luZ1NlcnZpY2Uuc2hvd1dhcm5pbmdTbmFjaygnUGFyc2UgZXJyb3InKTtcbiAgICAgICAgICB9IGVsc2UgaWYgKGNvbXBhcmlzb25WYWx1ZUxpc3RQYXJzZVJlc3VsdC5jb21wYXJpc29uVmFsdWVMaXN0Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHRoaXMuZm9ybUdlbmVyYXRvci5hZGRDb21wYXJpc29uVmFsdWVMaXN0VmFsdWVJdGVtcyhcbiAgICAgICAgICAgICAgdGhpcy5mb3JtR3JvdXAuY29udHJvbHMuY29tcGFyYXRvci52YWx1ZSxcbiAgICAgICAgICAgICAgdGhpcy5mb3JtR3JvdXAuY29udHJvbHMuY29tcGFyaXNvblZhbHVlLmNvbnRyb2xzLmxpc3RWYWx1ZSxcbiAgICAgICAgICAgICAgY29tcGFyaXNvblZhbHVlTGlzdFBhcnNlUmVzdWx0LmNvbXBhcmlzb25WYWx1ZUxpc3QsXG4gICAgICAgICAgICAgIHRoaXMuZmVhdHVyZUZsYWdMaW1pdGF0aW9ucyk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMuZm9ybUdlbmVyYXRvci5hZGRDb21wYXJpc29uVmFsdWVMaXN0VmFsdWVJdGVtcyhcbiAgICAgICAgICAgIHRoaXMuZm9ybUdyb3VwLmNvbnRyb2xzLmNvbXBhcmF0b3IudmFsdWUsXG4gICAgICAgICAgICB0aGlzLmZvcm1Hcm91cC5jb250cm9scy5jb21wYXJpc29uVmFsdWUuY29udHJvbHMubGlzdFZhbHVlLFxuICAgICAgICAgICAgW3sgdmFsdWUgfV0sXG4gICAgICAgICAgICB0aGlzLmZlYXR1cmVGbGFnTGltaXRhdGlvbnMpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgfVxuXG4gIHJlbW92ZShpbmRleDogbnVtYmVyKTogdm9pZCB7XG4gICAgaWYgKGluZGV4ID49IDApIHtcbiAgICAgIHRoaXMuZm9ybUdyb3VwLmNvbnRyb2xzLmNvbXBhcmlzb25WYWx1ZS5jb250cm9scy5saXN0VmFsdWUuY29udHJvbHMuc3BsaWNlKGluZGV4LCAxKTtcbiAgICAgIHRoaXMuZm9ybUdyb3VwLmNvbnRyb2xzLmNvbXBhcmlzb25WYWx1ZS5jb250cm9scy5saXN0VmFsdWUudXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpO1xuICAgICAgdGhpcy5mb3JtR3JvdXAuY29udHJvbHMuY29tcGFyaXNvblZhbHVlLmNvbnRyb2xzLmxpc3RWYWx1ZS5tYXJrQWxsQXNUb3VjaGVkKCk7XG4gICAgICB0aGlzLmZvcm1Hcm91cC5jb250cm9scy5jb21wYXJpc29uVmFsdWUuY29udHJvbHMubGlzdFZhbHVlLm1hcmtBc0RpcnR5KCk7XG4gICAgfVxuICB9XG5cbiAgZWRpdChpbmRleDogbnVtYmVyLCBldmVudDogTWF0Q2hpcEVkaXRlZEV2ZW50KSB7XG4gICAgY29uc3QgdmFsdWUgPSBldmVudC52YWx1ZS50cmltKCk7XG5cbiAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vYW5ndWxhci9jb21wb25lbnRzL2lzc3Vlcy8yNjU4NCNpc3N1ZWNvbW1lbnQtMTY5OTQ2OTYwNVxuICAgIC8vIFRoZSBtYXQgY2hpcCBjb250cm9sIGRvZXMgbm90IHdvcmsgd2VsbCB3aXRoIGxvbmcgdmFsdWVzLiBUaGUgYmFzaWMgc2V0dXAgaXMgb3ZlcmZsb3c6IHZpc2libGUuXG4gICAgLy8gVGhlIG92ZXJmbG93OmhpZGRlbiwgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXMgaXMgc29sdmVkIGluIHRoZSBzdHlsZXMuc2NzczpcbiAgICAvLy5tZGMtZXZvbHV0aW9uLWNoaXAtc2V0IC5tZGMtZXZvbHV0aW9uLWNoaXAge1xuICAgIC8vICAubWRjLWV2b2x1dGlvbi1jaGlwX19jZWxsLS1wcmltYXJ5LFxuICAgIC8vICAubWRjLWV2b2x1dGlvbi1jaGlwX19hY3Rpb24tLXByaW1hcnksXG4gICAgLy8gIC5tYXQtbWRjLWNoaXAtYWN0aW9uLWxhYmVsIHtcbiAgICAvLyAgICB3aGl0ZS1zcGFjZTogbm93cmFwO1xuICAgIC8vICAgIG92ZXJmbG93OiBoaWRkZW47XG4gICAgLy8gICAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7XG4gICAgLy8gIH1cbiAgICAvLyB9XG4gICAgLy8gXG4gICAgLy8gVGhpcyB3b3JrcyB0b3RhbGx5IGZpbmUgdW50aWwgeW91IGVkaXQgYSBjaGlwJ3MgdmFsdWUgdGhhdCBpcyBsb25nIChkb3VibGUgY2xpY2sgb24gaXQpIFxuICAgIC8vIGFuZCBlLmcuIGluc2VydCBhIGNoYXJhY3RlciB0byB0aGUgZW5kIG9mIHRoZSB2YWx1ZS5cbiAgICAvLyBBZnRlciBmb2N1c2luZyBvdXQgZnJvbSB0aGUgaW5wdXQsIHRoZSBvcmlnaW5hbCBjaGlwJ3MgdmFsdWUgaXMgc2hpZnRlZCBvciBldmVuIG1pc3NpbmcgaWYgdGhlIHRleHQgaXMgbG9uZyBlbm91Z2guIFxuICAgIC8vIElmIHdlIHNldCB0aGUgaW5wdXQncyB2YWx1ZSB0byAnJyBoZXJlLCB0aGUgc2hpZnRpbmcgaXMgc29sdmVkIGFuZCBldmVyeXRoaW5nIHdvcmtzIGFzIGV4cGVjdGVkXG4gICAgKGV2ZW50LmNoaXAgYXMgTWF0Q2hpcFJvdykuZGVmYXVsdEVkaXRJbnB1dD8uc2V0VmFsdWUoJycpO1xuXG4gICAgaWYgKCF2YWx1ZSkge1xuICAgICAgdGhpcy5yZW1vdmUoaW5kZXgpO1xuICAgIH0gZWxzZSBpZiAoaW5kZXggPj0gMCkge1xuICAgICAgdGhpcy5mb3JtR3JvdXAuY29udHJvbHMuY29tcGFyaXNvblZhbHVlLmNvbnRyb2xzLmxpc3RWYWx1ZS5jb250cm9sc1tpbmRleF0ucGF0Y2hWYWx1ZSh7IHZhbHVlIH0pO1xuICAgICAgdGhpcy5mb3JtR3JvdXAuY29udHJvbHMuY29tcGFyaXNvblZhbHVlLmNvbnRyb2xzLmxpc3RWYWx1ZS5jb250cm9sc1tpbmRleF0udXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpO1xuICAgICAgdGhpcy5mb3JtR3JvdXAuY29udHJvbHMuY29tcGFyaXNvblZhbHVlLmNvbnRyb2xzLmxpc3RWYWx1ZS51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KCk7XG4gICAgICB0aGlzLmZvcm1Hcm91cC5jb250cm9scy5jb21wYXJpc29uVmFsdWUuY29udHJvbHMubGlzdFZhbHVlLm1hcmtBbGxBc1RvdWNoZWQoKTtcbiAgICAgIHRoaXMuZm9ybUdyb3VwLmNvbnRyb2xzLmNvbXBhcmlzb25WYWx1ZS5jb250cm9scy5saXN0VmFsdWUubWFya0FzRGlydHkoKTtcbiAgICB9XG4gIH1cblxuICBleHBhbmRUZXh0KCkge1xuICAgIGNvbnN0IGRpYWxvZ1JlZiA9IHRoaXMuZGlhbG9nLm9wZW4oUG9wb3V0VGV4dEVkaXRvckRpYWxvZ0NvbXBvbmVudCwge1xuICAgICAgd2lkdGg6ICc4MDBweCcsXG4gICAgICBkYXRhOiA8UG9wb3V0VGV4dEVkaXRvckRpYWxvZ0RhdGE+e1xuICAgICAgICB2YWx1ZTogdGhpcy5mb3JtR3JvdXAuY29udHJvbHMuY29tcGFyaXNvblZhbHVlLmNvbnRyb2xzLnN0cmluZ1ZhbHVlLnZhbHVlLFxuICAgICAgICByZWFkT25seTogdGhpcy5mb3JtR3JvdXAuY29udHJvbHMuY29tcGFyaXNvblZhbHVlLmNvbnRyb2xzLnN0cmluZ1ZhbHVlLmRpc2FibGVkLFxuICAgICAgICB2YWxpZGF0b3JzOiB0aGlzLnJvbGxvdXRSdWxlQ29tcGFyYXRvclR5cGUgPT09IFVzZXJDb21wYXJhdG9yVHlwZS5TZW12ZXJcbiAgICAgICAgICA/IHRoaXMuZm9ybUdlbmVyYXRvci5nZXRDb21wYXJpc29uVmFsdWVTZW12ZXJWYWxpZGF0b3JzKHRoaXMuZmVhdHVyZUZsYWdMaW1pdGF0aW9ucylcbiAgICAgICAgICA6IHRoaXMuZm9ybUdlbmVyYXRvci5nZXRDb21wYXJpc29uVmFsdWVTdHJpbmdWYWxpZGF0b3JzKHRoaXMuZmVhdHVyZUZsYWdMaW1pdGF0aW9ucyksXG4gICAgICAgIG1heFZhbHVlTGVuZ3RoOiB0aGlzLmZlYXR1cmVGbGFnTGltaXRhdGlvbnMubWF4Q29tcGFyaXNvblZhbHVlTGVuZ3RoLFxuICAgICAgICBkZXNjcmlwdGlvbjogJ01vZGlmeSB0aGUgdGV4dCB3aXRoaW4gdGhlIGVkaXRvciB0byBjaGFuZ2UgdGhlIGNvbXBhcmlzb24gdmFsdWUuIFRoZSBlZGl0b3Igc3VwcG9ydHMgSlNPTiBzeW50YXggaGlnaGxpZ2h0aW5nLidcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGRpYWxvZ1JlZi5hZnRlckNsb3NlZCgpLnN1YnNjcmliZShkYXRhID0+IHtcbiAgICAgIGlmIChkYXRhICYmIGRhdGEudmFsdWUgIT09IHRoaXMuZm9ybUdyb3VwLmNvbnRyb2xzLmNvbXBhcmlzb25WYWx1ZS5jb250cm9scy5zdHJpbmdWYWx1ZS52YWx1ZSkge1xuICAgICAgICB0aGlzLmZvcm1Hcm91cC5jb250cm9scy5jb21wYXJpc29uVmFsdWUuY29udHJvbHMuc3RyaW5nVmFsdWUuc2V0VmFsdWUoZGF0YS52YWx1ZSk7XG4gICAgICAgIHRoaXMuZm9ybUdyb3VwLmNvbnRyb2xzLmNvbXBhcmlzb25WYWx1ZS5jb250cm9scy5zdHJpbmdWYWx1ZS51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KCk7XG4gICAgICAgIHRoaXMuZm9ybUdyb3VwLmNvbnRyb2xzLmNvbXBhcmlzb25WYWx1ZS5jb250cm9scy5zdHJpbmdWYWx1ZS5tYXJrQXNUb3VjaGVkKCk7XG4gICAgICAgIHRoaXMuZm9ybUdyb3VwLmNvbnRyb2xzLmNvbXBhcmlzb25WYWx1ZS5jb250cm9scy5zdHJpbmdWYWx1ZS5tYXJrQXNEaXJ0eSgpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgZXhwYW5kTGlzdCgpIHtcbiAgICBjb25zdCBkaWFsb2dSZWYgPSB0aGlzLmRpYWxvZy5vcGVuKFBvcG91dExpc3RFZGl0b3JEaWFsb2dDb21wb25lbnQsIHtcbiAgICAgIHdpZHRoOiAnNjcwcHgnLFxuICAgICAgZGF0YTogPFBvcG91dExpc3RFZGl0b3JEaWFsb2dEYXRhPntcbiAgICAgICAgY29tcGFyaXNvblZhbHVlTGlzdDogdGhpcy5nZXRSYXdWYWx1ZSgpLFxuICAgICAgICBjb21wYXJhdG9yOiB0aGlzLmZvcm1Hcm91cC5jb250cm9scy5jb21wYXJhdG9yLnZhbHVlLFxuICAgICAgICBmZWF0dXJlRmxhZ0xpbWl0YXRpb25zOiB0aGlzLmZlYXR1cmVGbGFnTGltaXRhdGlvbnMsXG4gICAgICAgIHJlYWRPbmx5OiB0aGlzLnJlYWRPbmx5XG4gICAgICB9XG4gICAgfSk7XG4gICAgZGlhbG9nUmVmLmFmdGVyQ2xvc2VkKCkuc3Vic2NyaWJlKChkYXRhOiB7IGNvbXBhcmlzb25WYWx1ZUxpc3Q6IElDb21wYXJpc29uVmFsdWVMaXN0TW9kZWxbXSB9KSA9PiB7XG4gICAgICBpZiAoZGF0YT8uY29tcGFyaXNvblZhbHVlTGlzdCkge1xuICAgICAgICBjb25zdCBvbGRWYWx1ZSA9XG4gICAgICAgICAgdGhpcy5mb3JtR3JvdXAuY29udHJvbHMuY29tcGFyaXNvblZhbHVlLmNvbnRyb2xzLmxpc3RWYWx1ZS52YWx1ZVxuICAgICAgICAgICAgLm1hcChsID0+IHsgcmV0dXJuIHsgdmFsdWU6IGwudmFsdWUsIGhpbnQ6IGwuaGludCB9OyB9KTtcbiAgICAgICAgY29uc3QgbmV3VmFsdWUgPSBkYXRhLmNvbXBhcmlzb25WYWx1ZUxpc3RcbiAgICAgICAgICAubWFwKGwgPT4geyByZXR1cm4geyB2YWx1ZTogbC52YWx1ZSwgaGludDogbC5oaW50IH07IH0pO1xuICAgICAgICBpZiAoSlNPTi5zdHJpbmdpZnkob2xkVmFsdWUpID09PSBKU09OLnN0cmluZ2lmeShuZXdWYWx1ZSkpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgdmFsaWRhdG9ycyA9XG4gICAgICAgICAgdGhpcy5mb3JtR2VuZXJhdG9yLmdldENvbXBhcmlzb25WYWx1ZVR5cGUodGhpcy5mb3JtR3JvdXAuY29udHJvbHMuY29tcGFyYXRvci52YWx1ZSkgPT09IFVzZXJDb21wYXJhdG9yVHlwZS5TZW12ZXJMaXN0XG4gICAgICAgICAgICA/IHRoaXMuZm9ybUdlbmVyYXRvci5nZXRDb21wYXJpc29uVmFsdWVTZW12ZXJMaXN0SXRlbVZhbGlkYXRvcnModGhpcy5mZWF0dXJlRmxhZ0xpbWl0YXRpb25zKVxuICAgICAgICAgICAgOiB0aGlzLmZvcm1HZW5lcmF0b3IuZ2V0Q29tcGFyaXNvblZhbHVlU3RyaW5nTGlzdEl0ZW1WYWxpZGF0b3JzKHRoaXMuZmVhdHVyZUZsYWdMaW1pdGF0aW9ucyk7XG4gICAgICAgIGNvbnN0IGZvcm1BcnJheSA9IHRoaXMuZm9ybUdlbmVyYXRvci5nZW5lcmF0ZUNvbXBhcmlzb25WYWx1ZUxpc3RWYWx1ZUFycmF5KGRhdGEuY29tcGFyaXNvblZhbHVlTGlzdCwgdGhpcy5yZWFkT25seSwgdGhpcy5mZWF0dXJlRmxhZ0xpbWl0YXRpb25zLCB2YWxpZGF0b3JzKTtcbiAgICAgICAgdGhpcy5mb3JtR3JvdXAuY29udHJvbHMuY29tcGFyaXNvblZhbHVlLnNldENvbnRyb2woJ2xpc3RWYWx1ZScsIGZvcm1BcnJheSk7XG4gICAgICAgIHRoaXMuZm9ybUdyb3VwLmNvbnRyb2xzLmNvbXBhcmlzb25WYWx1ZS51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KCk7XG4gICAgICAgIHRoaXMuZm9ybUdyb3VwLmNvbnRyb2xzLmNvbXBhcmlzb25WYWx1ZS5tYXJrQWxsQXNUb3VjaGVkKCk7XG4gICAgICAgIHRoaXMuZm9ybUdyb3VwLmNvbnRyb2xzLmNvbXBhcmlzb25WYWx1ZS5tYXJrQXNEaXJ0eSgpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgcmVtb3ZlQWxsKCkge1xuICAgIHRoaXMuZm9ybUdyb3VwLmNvbnRyb2xzLmNvbXBhcmlzb25WYWx1ZS5jb250cm9scy5saXN0VmFsdWUuY29udHJvbHMuc3BsaWNlKDAsIHRoaXMuZm9ybUdyb3VwLmNvbnRyb2xzLmNvbXBhcmlzb25WYWx1ZS5jb250cm9scy5saXN0VmFsdWUuY29udHJvbHMubGVuZ3RoKTtcbiAgICB0aGlzLmZvcm1Hcm91cC5jb250cm9scy5jb21wYXJpc29uVmFsdWUuY29udHJvbHMubGlzdFZhbHVlLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoKTtcbiAgICB0aGlzLmZvcm1Hcm91cC5jb250cm9scy5jb21wYXJpc29uVmFsdWUuY29udHJvbHMubGlzdFZhbHVlLm1hcmtBbGxBc1RvdWNoZWQoKTtcbiAgICB0aGlzLmZvcm1Hcm91cC5jb250cm9scy5jb21wYXJpc29uVmFsdWUuY29udHJvbHMubGlzdFZhbHVlLm1hcmtBc0RpcnR5KCk7XG4gIH1cblxuICBjb3B5VmFsdWVzQXNDc3YoKSB7XG4gICAgdGhpcy5jb3B5VG9DbGlwYm9hcmQodGhpcy5jb21wYXJpc29uVmFsdWVMaXN0SGVscGVyLmZvcm1hdFZhbHVlc0FzQ3N2KHRoaXMuZ2V0UmF3VmFsdWUoKSkpO1xuICB9XG5cbiAgY29weVRvQ2xpcGJvYXJkKHZhbHVlOiBzdHJpbmcpIHtcbiAgICBpZiAodmFsdWUpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHRoaXMuY2xpcGJvYXJkLmNvcHkodmFsdWUpO1xuICAgICAgICB0aGlzLm1lc3NhZ2luZ1NlcnZpY2Uuc2hvd1N1Y2Nlc3NTbmFjayhcIkNvcGllZCB0byBjbGlwYm9hcmQuXCIpO1xuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIHRoaXMubWVzc2FnaW5nU2VydmljZS5zaG93U3VjY2Vzc1NuYWNrKFwiQ2xpcGJvYXJkIHVuYXZhaWxhYmxlLlwiKTtcbiAgICAgIH1cblxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLm1lc3NhZ2luZ1NlcnZpY2Uuc2hvd1dhcm5pbmdTbmFjayhcIk5vdGhpbmcgdG8gYmUgY29waWVkLlwiKTtcbiAgICB9XG4gIH1cblxuICBnZXRSYXdWYWx1ZSgpOiBJQ29tcGFyaXNvblZhbHVlTGlzdE1vZGVsW10ge1xuICAgIHJldHVybiB0aGlzLmZvcm1Hcm91cC5jb250cm9scy5jb21wYXJpc29uVmFsdWUuY29udHJvbHMubGlzdFZhbHVlLnZhbHVlLm1hcCh2ID0+IHsgcmV0dXJuIHsgdmFsdWU6IHYudmFsdWUsIGhpbnQ6IHYuaGludCB9IH0pO1xuICB9XG5cbiAgaXNWYWx1ZUludmFsaWQobGlzdFZhbHVlSXRlbUNvbnRyb2w6IEZvcm1Hcm91cDxDb21wYXJpc29uVmFsdWVMaXN0Rm9ybT4pIHtcbiAgICByZXR1cm4gbGlzdFZhbHVlSXRlbUNvbnRyb2wuY29udHJvbHMudmFsdWUudG91Y2hlZCAmJiBsaXN0VmFsdWVJdGVtQ29udHJvbC5jb250cm9scy52YWx1ZS5pbnZhbGlkO1xuICB9XG5cbiAgaXNIaW50SW52YWxpZChsaXN0VmFsdWVJdGVtQ29udHJvbDogRm9ybUdyb3VwPENvbXBhcmlzb25WYWx1ZUxpc3RGb3JtPikge1xuICAgIHJldHVybiBsaXN0VmFsdWVJdGVtQ29udHJvbC5jb250cm9scy5oaW50LnRvdWNoZWQgJiYgbGlzdFZhbHVlSXRlbUNvbnRyb2wuY29udHJvbHMuaGludC5pbnZhbGlkO1xuICB9XG5cbiAgaXNMaXN0VmFsdWVJdGVtSW52YWxpZChsaXN0VmFsdWVJdGVtQ29udHJvbDogRm9ybUdyb3VwPENvbXBhcmlzb25WYWx1ZUxpc3RGb3JtPikge1xuICAgIHJldHVybiB0aGlzLmlzVmFsdWVJbnZhbGlkKGxpc3RWYWx1ZUl0ZW1Db250cm9sKSB8fCB0aGlzLmlzSGludEludmFsaWQobGlzdFZhbHVlSXRlbUNvbnRyb2wpO1xuICB9XG5cbiAgZ2V0TGlzdFZhbHVlSXRlbVRvb2x0aXBNZXNzYWdlKGxpc3RWYWx1ZUl0ZW1Db250cm9sOiBGb3JtR3JvdXA8Q29tcGFyaXNvblZhbHVlTGlzdEZvcm0+KSB7XG4gICAgaWYgKHRoaXMuaXNWYWx1ZUludmFsaWQobGlzdFZhbHVlSXRlbUNvbnRyb2wpKSB7XG4gICAgICByZXR1cm4gRm9ybUhlbHBlci5nZXRFcnJvck1lc3NhZ2UobGlzdFZhbHVlSXRlbUNvbnRyb2wuY29udHJvbHMudmFsdWUpO1xuICAgIH0gZWxzZSBpZiAodGhpcy5pc0hpbnRJbnZhbGlkKGxpc3RWYWx1ZUl0ZW1Db250cm9sKSkge1xuICAgICAgcmV0dXJuIFwiSGludDpcIiArIEZvcm1IZWxwZXIuZ2V0RXJyb3JNZXNzYWdlKGxpc3RWYWx1ZUl0ZW1Db250cm9sLmNvbnRyb2xzLmhpbnQpO1xuICAgIH1cbiAgICBpZiAobGlzdFZhbHVlSXRlbUNvbnRyb2wuY29udHJvbHMuaGludC52YWx1ZSkge1xuICAgICAgcmV0dXJuIGxpc3RWYWx1ZUl0ZW1Db250cm9sLmNvbnRyb2xzLmhpbnQudmFsdWU7XG4gICAgfVxuICAgIHJldHVybiBcIk5vIGhpbnRcIjtcbiAgfVxuXG4gIGNhbGNDb21wYXJhdG9ycyhyZXNldFZhbCA9IGZhbHNlKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmZvcm1Hcm91cC5jb250cm9scy5jb21wYXJpc29uQXR0cmlidXRlLnZhbHVlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuYnVpbGRDb21wYXJhdG9yU3VnZ2VzdGlvbnMoZGVmYXVsdENvbXBhcmF0b3JJZHMsIHJlc2V0VmFsKTtcbiAgfVxuXG4gIGJ1aWxkQ29tcGFyYXRvclN1Z2dlc3Rpb25zKGlkczogbnVtYmVyW10sIHJlc2V0VmFsOiBib29sZWFuKTogdm9pZCB7XG4gICAgbGV0IGNvbXBzID0gaWRzLm1hcChpZCA9PiBhbGxDb21wYXJhdG9yc1tpZF0pO1xuICAgIGNvbnN0IHNlbGVjdGVkID0gYWxsQ29tcGFyYXRvcnMuZmluZCh2YWwgPT4gdmFsLnZhbHVlID09PSB0aGlzLmZvcm1Hcm91cC5jb250cm9scy5jb21wYXJhdG9yLnZhbHVlKTtcbiAgICBpZiAocmVzZXRWYWwgJiYgIWlkcy5pbmNsdWRlcyhzZWxlY3RlZC5pbmRleCkgJiYgdGhpcy5pc051bGxDb21wVmFsKHRoaXMuZm9ybUdyb3VwLmNvbnRyb2xzLmNvbXBhcmlzb25WYWx1ZS52YWx1ZSkpIHtcbiAgICAgIHRoaXMuY29tcGFyYXRvckNoYW5nZWQoY29tcHNbMF0udmFsdWUpO1xuICAgIH0gZWxzZSBpZiAoIWlkcy5pbmNsdWRlcyhzZWxlY3RlZC5pbmRleCkpIHtcbiAgICAgIGlmIChzZWxlY3RlZC52YWx1ZSA9PT0gVXNlckNvbXBhcmF0b3IuQ29udGFpbnNBbnlPZiB8fCBzZWxlY3RlZC52YWx1ZSA9PT0gVXNlckNvbXBhcmF0b3IuRG9lc05vdENvbnRhaW5BbnlPZikge1xuICAgICAgICBjb21wcyA9IFthbGxDb21wYXJhdG9yc1syXSwgYWxsQ29tcGFyYXRvcnNbM10sIC4uLmNvbXBzXVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3Qgc2VsZWN0ZWRHcm91cCA9IGFsbENvbXBhcmF0b3JzLmZpbHRlcih2YWwgPT4gdmFsLmdyb3VwID09PSBzZWxlY3RlZC5ncm91cCk7XG4gICAgICAgIGNvbXBzID0gWy4uLnNlbGVjdGVkR3JvdXAsIC4uLmNvbXBzXVxuICAgICAgfVxuICAgIH1cbiAgICBjb21wcyA9IHRoaXMuZGVkdXBDb21wcyhjb21wcyk7XG4gICAgdGhpcy5jb21wYXJhdG9yU3VnZ2VzdGlvbnMgPSBjb21wcy5yZWR1Y2UoKGVudHJ5TWFwLCBlKSA9PiBlbnRyeU1hcC5zZXQoZS5ncm91cCwgWy4uLmVudHJ5TWFwLmdldChlLmdyb3VwKSB8fCBbXSwgZV0pLCBuZXcgTWFwKCkpO1xuICAgIHRoaXMuY29tcGFyYXRvclNlcGFyYXRvciA9IHRoaXMuZ2VuU2VwYXJhdG9yKGNvbXBzKTtcbiAgfVxuXG4gIGRlZHVwQ29tcHMoY29tcHM6IElDb21wYXJhdG9yVmFsdWVbXSk6IElDb21wYXJhdG9yVmFsdWVbXSB7XG4gICAgY29uc3QgcmVzdWx0OiBJQ29tcGFyYXRvclZhbHVlW10gPSBbXTtcbiAgICBjb21wcy5mb3JFYWNoKHZhbCA9PiB7XG4gICAgICBpZiAoIXJlc3VsdC5maW5kKGUgPT4gZS5pbmRleCA9PT0gdmFsLmluZGV4KSkge1xuICAgICAgICByZXN1bHQucHVzaCh2YWwpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICBnZW5TZXBhcmF0b3IoY29tcHM6IElDb21wYXJhdG9yVmFsdWVbXSk6IHN0cmluZyB7XG4gICAgbGV0IG1heCA9IDA7XG4gICAgY29tcHMuZm9yRWFjaCh2YWwgPT4ge1xuICAgICAgaWYgKHZhbC5sYWJlbC5sZW5ndGggPiBtYXgpIHtcbiAgICAgICAgbWF4ID0gdmFsLmxhYmVsLmxlbmd0aDtcbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gQXJyYXkobWF4KS5qb2luKFwi4pSAXCIpO1xuICB9XG5cbiAgaXNOdW1iZXJBcnIodmFsOiBhbnkpOiBib29sZWFuIHtcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkodmFsKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHJldHVybiB2YWwubGVuZ3RoID4gMCAmJiB2YWwuZXZlcnkoaXRlbSA9PiB0eXBlb2YgaXRlbSA9PT0gJ251bWJlcicpO1xuICB9XG5cbiAgaXNOdWxsQ29tcFZhbChjb21wVmFsOiBQYXJ0aWFsPHsgc3RyaW5nVmFsdWU/OiBzdHJpbmc7IGRvdWJsZVZhbHVlPzogbnVtYmVyOyBsaXN0VmFsdWU/OiBQYXJ0aWFsPHsgdmFsdWU6IHN0cmluZzsgaGludD86IHN0cmluZzsgaW5kZXg6IG51bWJlcjsgfT5bXTsgfT4pOiBib29sZWFuIHtcbiAgICByZXR1cm4gIWNvbXBWYWwuZG91YmxlVmFsdWUgJiYgIWNvbXBWYWwubGlzdFZhbHVlICYmICFjb21wVmFsLnN0cmluZ1ZhbHVlO1xuICB9XG5cblxuICBpc0NsZWFyVGV4dENvbXBhcmF0b3IoY29tcGFyYXRvcjogVXNlckNvbXBhcmF0b3IpOiBib29sZWFuIHtcbiAgICBzd2l0Y2ggKGNvbXBhcmF0b3IpIHtcbiAgICAgIGNhc2UgVXNlckNvbXBhcmF0b3IuSXNPbmVPZjpcbiAgICAgIGNhc2UgVXNlckNvbXBhcmF0b3IuSXNOb3RPbmVPZjpcbiAgICAgIGNhc2UgVXNlckNvbXBhcmF0b3IuVGV4dFN0YXJ0c1dpdGhBbnlPZjpcbiAgICAgIGNhc2UgVXNlckNvbXBhcmF0b3IuVGV4dEVuZHNXaXRoQW55T2Y6XG4gICAgICBjYXNlIFVzZXJDb21wYXJhdG9yLlRleHROb3RTdGFydHNXaXRoQW55T2Y6XG4gICAgICBjYXNlIFVzZXJDb21wYXJhdG9yLlRleHROb3RFbmRzV2l0aEFueU9mOlxuICAgICAgY2FzZSBVc2VyQ29tcGFyYXRvci5BcnJheUNvbnRhaW5zQW55T2Y6XG4gICAgICBjYXNlIFVzZXJDb21wYXJhdG9yLkFycmF5RG9lc05vdENvbnRhaW5BbnlPZjpcbiAgICAgIGNhc2UgVXNlckNvbXBhcmF0b3IuQ29udGFpbnNBbnlPZjpcbiAgICAgIGNhc2UgVXNlckNvbXBhcmF0b3IuRG9lc05vdENvbnRhaW5BbnlPZjpcbiAgICAgIGNhc2UgVXNlckNvbXBhcmF0b3IuVGV4dEVxdWFsczpcbiAgICAgIGNhc2UgVXNlckNvbXBhcmF0b3IuVGV4dERvZXNOb3RFcXVhbDogcmV0dXJuIHRydWU7XG4gICAgICBkZWZhdWx0OiByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgb3BlbkNsZWFydGV4dEluZm9EaWFsb2coKSB7XG4gICAgdGhpcy5kaWFsb2cub3BlbihJbmZvRGlhbG9nQ29tcG9uZW50LCB7XG4gICAgICB3aWR0aDogJzYwMHB4JyxcbiAgICAgIGRhdGE6IHtcbiAgICAgICAgdGl0bGU6IGBDb25zaWRlciB1c2luZyBjb25maWRlbnRpYWwgY29tcGFyYXRvcnNgLFxuICAgICAgICBib2R5OiBgQ29tcGFyaXNvbiB2YWx1ZSB3aWxsIGJlIHByZXNlbnRlZCBhcyBwbGFpbiB0ZXh0IFxuICAgICAgICBpbiB0aGUgPGk+Y29uZmlnIEpTT048L2k+LiBJZiB5b3UgaGF2ZSBzZW5zaXRpdmUgZGF0YSwgY29uc2lkZXIgdXNpbmcgb25lIG9mIHRoZSBjb25maWRlbnRpYWwgKGhhc2hlZCkgY29tcGFyYXRvcnMuPGJyLz48YnIvPlxuICAgICAgICBTZWUgdGhlIDxhIGhyZWY9XCJodHRwczovL2NvbmZpZ2NhdC5jb20vZG9jcy90YXJnZXRpbmcvdGFyZ2V0aW5nLXJ1bGUvdXNlci1jb25kaXRpb24vI2NvbmZpZGVudGlhbC10ZXh0LWNvbXBhcmF0b3JzXCIgdGFyZ2V0PVwiX2JsYW5rXCI+ZG9jdW1lbnRhdGlvbjwvYT4gZm9yIG1vcmUgaW5mb3JtYXRpb24uYCxcbiAgICAgICAgc2Vjb25kYXJ5QnV0dG9uTGFiZWw6ICdPcGVuIGNvbXBhcmF0b3Igc2VsZWN0b3InLFxuICAgICAgICBzZWNvbmRhcnlCdXR0b25BY3Rpb246ICgpID0+IHRoaXMuY29tcERpYWxvZygpXG4gICAgICB9XG4gICAgfSk7XG4gIH1cbn1cbiIsIjxkaXYgY2xhc3M9XCJ0YXJnZXRpbmctcnVsZS1saW5lIHNtYWxsZXN0LWZvcm0tZmllbGRcIj5cbiAgICA8ZGl2IGNsYXNzPVwiZXhwbGFuYXRpb24td3JhcHBlclwiPlxuICAgICAgICA8YXBwLWNvbmRpdGlvbi1jaGlwIFt0YXJnZXRpbmdSdWxlSW5kZXhdPVwidGFyZ2V0aW5nUnVsZUluZGV4XCJcbiAgICAgICAgICAgIFtjb25kaXRpb25JbmRleF09XCJjb25kaXRpb25JbmRleFwiPjwvYXBwLWNvbmRpdGlvbi1jaGlwPlxuXG4gICAgICAgIDxkaXYgY2xhc3M9XCJleHBsYW5hdGlvblwiPjxhIGhyZWY9XCJodHRwczovL2NvbmZpZ2NhdC5jb20vZG9jcy90YXJnZXRpbmcvdGFyZ2V0aW5nLXJ1bGUvdXNlci1jb25kaXRpb24vXCJcbiAgICAgICAgICAgICAgICB0YXJnZXQ9XCJfYmxhbmtcIiByZWw9XCJub29wZW5lciBub3JlZmVycmVyXCIgY2xhc3M9XCJ1c2VyLWxpbmtcIj51c2VyJ3M8L2E+PC9kaXY+XG4gICAgPC9kaXY+XG5cbiAgICA8ZGl2IGNsYXNzPVwid3JhcHBlci1ncm91cFwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwid3JhcHBlci1ncm91cFwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRhcmdldGluZy1ydWxlLWNvbXBvbmVudCBwYWQtcmlnaHRcIlxuICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsnc21hbGwnOiBkZWZhdWx0Q29tcGFyaXNvbkF0dHJpYnV0ZXMuaW5kZXhPZihmb3JtR3JvdXAuY29udHJvbHMuY29tcGFyaXNvbkF0dHJpYnV0ZS52YWx1ZSkgPT09IC0xfVwiPlxuICAgICAgICAgICAgICAgIDxtYXQtZm9ybS1maWVsZCBhcHBlYXJhbmNlPVwib3V0bGluZVwiIHN1YnNjcmlwdFNpemluZz1cImR5bmFtaWNcIj5cbiAgICAgICAgICAgICAgICAgICAgPHNlbGVjdCBtYXROYXRpdmVDb250cm9sIChjaGFuZ2UpPVwiYXR0cmlidXRlQ2hhbmdlZCgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJmb3JtR3JvdXAuY29udHJvbHMuY29tcGFyaXNvbkF0dHJpYnV0ZS5kaXNhYmxlZFwiIG1hdFRvb2x0aXA9XCJDb21wYXJpc29uIGF0dHJpYnV0ZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiAqbmdGb3I9XCJsZXQgY29tcGFyaXNvbkF0dHJpYnV0ZSBvZiBkZWZhdWx0Q29tcGFyaXNvbkF0dHJpYnV0ZXNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzZWxlY3RlZF09XCJjb21wYXJpc29uQXR0cmlidXRlID09PSBmb3JtR3JvdXAuY29udHJvbHMuY29tcGFyaXNvbkF0dHJpYnV0ZS52YWx1ZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7Y29tcGFyaXNvbkF0dHJpYnV0ZX19PC9vcHRpb24+XG4gICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW3NlbGVjdGVkXT1cImRlZmF1bHRDb21wYXJpc29uQXR0cmlidXRlcy5pbmRleE9mKGZvcm1Hcm91cC5jb250cm9scy5jb21wYXJpc29uQXR0cmlidXRlLnZhbHVlKSA9PT0gLTFcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBDdXN0b21cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvb3B0aW9uPlxuICAgICAgICAgICAgICAgICAgICA8L3NlbGVjdD5cbiAgICAgICAgICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGFyZ2V0aW5nLXJ1bGUtY29tcG9uZW50IHBhZC1yaWdodCBzbWFsbFwiXG4gICAgICAgICAgICAgICAgW2hpZGRlbl09XCJkZWZhdWx0Q29tcGFyaXNvbkF0dHJpYnV0ZXMuaW5kZXhPZihmb3JtR3JvdXAuY29udHJvbHMuY29tcGFyaXNvbkF0dHJpYnV0ZS52YWx1ZSkgIT09IC0xXCI+XG4gICAgICAgICAgICAgICAgPG1hdC1mb3JtLWZpZWxkIGFwcGVhcmFuY2U9XCJvdXRsaW5lXCIgc3Vic2NyaXB0U2l6aW5nPVwiZHluYW1pY1wiPlxuICAgICAgICAgICAgICAgICAgICA8aW5wdXQgbWF0SW5wdXQgdHlwZT1cInRleHRcIiAoYmx1cik9XCJjYWxjQ29tcGFyYXRvcnModHJ1ZSlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2Zvcm1Db250cm9sXT1cImZvcm1Hcm91cC5jb250cm9scy5jb21wYXJpc29uQXR0cmlidXRlXCIgbWF0VG9vbHRpcD1cIkN1c3RvbSBjb21wYXJpc29uIGF0dHJpYnV0ZVwiPlxuICAgICAgICAgICAgICAgICAgICA8bWF0LWVycm9yICpuZ0lmPVwiZm9ybUdyb3VwLmNvbnRyb2xzLmNvbXBhcmlzb25BdHRyaWJ1dGUuaW52YWxpZFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAge3tGb3JtSGVscGVyLmdldEVycm9yTWVzc2FnZShmb3JtR3JvdXAuY29udHJvbHMuY29tcGFyaXNvbkF0dHJpYnV0ZSl9fVxuICAgICAgICAgICAgICAgICAgICA8L21hdC1lcnJvcj5cbiAgICAgICAgICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDxkaXYgY2xhc3M9XCJ0YXJnZXRpbmctcnVsZS1jb21wb25lbnQgcGFkLXJpZ2h0IGNvbXBhcmF0b3JcIj5cbiAgICAgICAgICAgIDxtYXQtZm9ybS1maWVsZCBhcHBlYXJhbmNlPVwib3V0bGluZVwiIHN1YnNjcmlwdFNpemluZz1cImR5bmFtaWNcIj5cbiAgICAgICAgICAgICAgICA8c2VsZWN0IG1hdE5hdGl2ZUNvbnRyb2wgKGNoYW5nZSk9XCJjb21wYXJhdG9yQ2hhbmdlZChzZWxlY3RlZENvbXBhcmF0b3IpXCJcbiAgICAgICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJzZWxlY3RlZENvbXBhcmF0b3JcIiBbZGlzYWJsZWRdPVwicmVhZE9ubHlcIiBtYXRUb29sdGlwPVwiQ29tcGFyYXRvclwiPlxuICAgICAgICAgICAgICAgICAgICA8b3B0Z3JvdXAgKm5nRm9yPVwibGV0IGdyb3VwIG9mIGNvbXBhcmF0b3JTdWdnZXN0aW9ucyB8IGtleXZhbHVlOiBrZWVwT3JkZXJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2xhYmVsXT1cIicmbmJzcDsnICsgZ3JvdXAua2V5XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uICpuZ0Zvcj1cImxldCBjb21wYXJhdG9yIG9mIGdyb3VwLnZhbHVlXCIgW25nVmFsdWVdPVwiY29tcGFyYXRvci52YWx1ZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7Y29tcGFyYXRvci5sYWJlbH19XG4gICAgICAgICAgICAgICAgICAgICAgICA8L29wdGlvbj5cbiAgICAgICAgICAgICAgICAgICAgPC9vcHRncm91cD5cbiAgICAgICAgICAgICAgICAgICAgPG9wdGdyb3VwIFtsYWJlbF09XCJjb21wYXJhdG9yU2VwYXJhdG9yXCI+PC9vcHRncm91cD5cbiAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cInNob3dhbGxcIj4mbmJzcDsmbmJzcDtTSE9XIEFMTCBDT01QQVJBVE9SUyZuYnNwOyZuYnNwOzwvb3B0aW9uPlxuICAgICAgICAgICAgICAgIDwvc2VsZWN0PlxuICAgICAgICAgICAgICAgIDxidXR0b24gbWF0U3VmZml4IGNsYXNzPVwiaW5wdXQtYnV0dG9uXCIgdHlwZT1cImJ1dHRvblwiIG1hdC1pY29uLWJ1dHRvbiBtYXRUb29sdGlwPVwiQWxsIGNvbXBhcmF0b3JzXCJcbiAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImNvbXBEaWFsb2coKVwiPjxtYXQtaWNvbj5saXN0X2FsdDwvbWF0LWljb24+PC9idXR0b24+XG4gICAgICAgICAgICAgICAgPG1hdC1lcnJvciAqbmdJZj1cImZvcm1Hcm91cC5jb250cm9scy5jb21wYXJhdG9yLmludmFsaWRcIj5cbiAgICAgICAgICAgICAgICAgICAge3tGb3JtSGVscGVyLmdldEVycm9yTWVzc2FnZShmb3JtR3JvdXAuY29udHJvbHMuY29tcGFyYXRvcil9fVxuICAgICAgICAgICAgICAgIDwvbWF0LWVycm9yPlxuICAgICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cbiAgICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gICAgPG5nLWNvbnRhaW5lciBbbmdTd2l0Y2hdPVwicm9sbG91dFJ1bGVDb21wYXJhdG9yVHlwZVwiPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCJSb2xsb3V0UnVsZUNvbXBhcmF0b3JWMlR5cGUuU3RyaW5nXCJcbiAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0XT1cInRleHRUZW1wbGF0ZVwiPjwvbmctY29udGFpbmVyPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCJSb2xsb3V0UnVsZUNvbXBhcmF0b3JWMlR5cGUuU2VtdmVyXCJcbiAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0XT1cInNlbXZlclRlbXBsYXRlXCI+PC9uZy1jb250YWluZXI+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIlJvbGxvdXRSdWxlQ29tcGFyYXRvclYyVHlwZS5TdHJpbmdMaXN0XCJcbiAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0XT1cImxpc3RUZW1wbGF0ZVwiPjwvbmctY29udGFpbmVyPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCJSb2xsb3V0UnVsZUNvbXBhcmF0b3JWMlR5cGUuU2VtdmVyTGlzdFwiXG4gICAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldF09XCJsaXN0VGVtcGxhdGVcIj48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiUm9sbG91dFJ1bGVDb21wYXJhdG9yVjJUeXBlLk51bWJlclwiXG4gICAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldF09XCJudW1iZXJUZW1wbGF0ZVwiPjwvbmctY29udGFpbmVyPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCJSb2xsb3V0UnVsZUNvbXBhcmF0b3JWMlR5cGUuRGF0ZVRpbWVcIlxuICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRdPVwiZGF0ZVRpbWVUZW1wbGF0ZVwiPjwvbmctY29udGFpbmVyPlxuICAgIDwvbmctY29udGFpbmVyPlxuXG48L2Rpdj5cblxuPG5nLXRlbXBsYXRlICN0ZXh0VGVtcGxhdGU+XG4gICAgPGRpdiAqbmdJZj1cImZvcm1Hcm91cC5jb250cm9scy5jb21wYXJpc29uVmFsdWUuY29udHJvbHMuc3RyaW5nVmFsdWVcIiBjbGFzcz1cInRhcmdldGluZy1ydWxlLWNvbXBvbmVudCBncm93XCI+XG4gICAgICAgIDxtYXQtZm9ybS1maWVsZCBhcHBlYXJhbmNlPVwib3V0bGluZVwiIHN1YnNjcmlwdFNpemluZz1cImR5bmFtaWNcIj5cbiAgICAgICAgICAgIDxpbnB1dCBtYXRJbnB1dCB0eXBlPVwidGV4dFwiIFtmb3JtQ29udHJvbF09XCJmb3JtR3JvdXAuY29udHJvbHMuY29tcGFyaXNvblZhbHVlLmNvbnRyb2xzLnN0cmluZ1ZhbHVlXCJcbiAgICAgICAgICAgICAgICBtYXRUb29sdGlwPVwiQ29tcGFyaXNvbiB2YWx1ZSAodGV4dClcIiBwbGFjZWhvbGRlcj1cIkFkZCB0ZXh0IC4uLlwiIC8+XG4gICAgICAgICAgICA8YnV0dG9uIG1hdFByZWZpeCBjbGFzcz1cInByZWZpeC1idXR0b25cIiB0eXBlPVwiYnV0dG9uXCIgbWF0LWljb24tYnV0dG9uICpuZ0lmPVwiaXNDbGVhclRleHRDb21wYXJhdG9yU2VsZWN0ZWRcIlxuICAgICAgICAgICAgICAgIChjbGljayk9XCJvcGVuQ2xlYXJ0ZXh0SW5mb0RpYWxvZygpXCJcbiAgICAgICAgICAgICAgICBtYXRUb29sdGlwPVwiVGhpcyBjb21wYXJpc29uIHZhbHVlIHdvbid0IGJlIGhhc2hlZC4gQ2xpY2sgZm9yIG1vcmUgaW5mby5cIj48bWF0LWljb24+bG9ja19vcGVuX3JpZ2h0PC9tYXQtaWNvbj48L2J1dHRvbj5cbiAgICAgICAgICAgIDxidXR0b24gbWF0U3VmZml4IGNsYXNzPVwiaW5wdXQtYnV0dG9uXCIgdHlwZT1cImJ1dHRvblwiIG1hdC1pY29uLWJ1dHRvbiBtYXRUb29sdGlwPVwiQWR2YW5jZWQgZWRpdG9yXCJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwiZXhwYW5kVGV4dCgpXCI+PG1hdC1pY29uPmVkaXRfbm90ZTwvbWF0LWljb24+PC9idXR0b24+XG4gICAgICAgICAgICA8bWF0LWVycm9yICpuZ0lmPVwiZm9ybUdyb3VwLmNvbnRyb2xzLmNvbXBhcmlzb25WYWx1ZS5jb250cm9scy5zdHJpbmdWYWx1ZS5pbnZhbGlkXCI+XG4gICAgICAgICAgICAgICAge3tGb3JtSGVscGVyLmdldEVycm9yTWVzc2FnZShmb3JtR3JvdXAuY29udHJvbHMuY29tcGFyaXNvblZhbHVlLmNvbnRyb2xzLnN0cmluZ1ZhbHVlKX19XG4gICAgICAgICAgICA8L21hdC1lcnJvcj5cbiAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cbiAgICA8L2Rpdj5cbjwvbmctdGVtcGxhdGU+XG5cblxuPG5nLXRlbXBsYXRlICNzZW12ZXJUZW1wbGF0ZT5cbiAgICA8ZGl2ICpuZ0lmPVwiZm9ybUdyb3VwLmNvbnRyb2xzLmNvbXBhcmlzb25WYWx1ZS5jb250cm9scy5zdHJpbmdWYWx1ZVwiIGNsYXNzPVwidGFyZ2V0aW5nLXJ1bGUtY29tcG9uZW50IGdyb3dcIj5cbiAgICAgICAgPG1hdC1mb3JtLWZpZWxkIGFwcGVhcmFuY2U9XCJvdXRsaW5lXCIgc3Vic2NyaXB0U2l6aW5nPVwiZHluYW1pY1wiPlxuICAgICAgICAgICAgPGlucHV0IG1hdElucHV0IHR5cGU9XCJ0ZXh0XCIgW2Zvcm1Db250cm9sXT1cImZvcm1Hcm91cC5jb250cm9scy5jb21wYXJpc29uVmFsdWUuY29udHJvbHMuc3RyaW5nVmFsdWVcIlxuICAgICAgICAgICAgICAgIG1hdFRvb2x0aXA9XCJDb21wYXJpc29uIHZhbHVlIChzZW1hbnRpYyB2ZXJzaW9uKVwiIHBsYWNlaG9sZGVyPVwiQWRkIHNlbWFudGljIHZlcnNpb24gLi4uICgxLjIuMylcIiAvPlxuICAgICAgICAgICAgPG1hdC1lcnJvciAqbmdJZj1cImZvcm1Hcm91cC5jb250cm9scy5jb21wYXJpc29uVmFsdWUuY29udHJvbHMuc3RyaW5nVmFsdWUuaW52YWxpZFwiPlxuICAgICAgICAgICAgICAgIHt7Rm9ybUhlbHBlci5nZXRFcnJvck1lc3NhZ2UoZm9ybUdyb3VwLmNvbnRyb2xzLmNvbXBhcmlzb25WYWx1ZS5jb250cm9scy5zdHJpbmdWYWx1ZSl9fVxuICAgICAgICAgICAgPC9tYXQtZXJyb3I+XG4gICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XG4gICAgPC9kaXY+XG48L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGUgI2xpc3RUZW1wbGF0ZT5cbiAgICA8ZGl2ICpuZ0lmPVwiZm9ybUdyb3VwLmNvbnRyb2xzLmNvbXBhcmlzb25WYWx1ZS5jb250cm9scy5saXN0VmFsdWVcIlxuICAgICAgICBjbGFzcz1cInRhcmdldGluZy1ydWxlLWNvbXBvbmVudCBncm93IHNtYWxsLWNoaXAtaW5wdXQgdG9wLWljb24tc3VmZml4XCI+XG4gICAgICAgIDxtYXQtZm9ybS1maWVsZCBhcHBlYXJhbmNlPVwib3V0bGluZVwiIHN1YnNjcmlwdFNpemluZz1cImR5bmFtaWNcIj5cbiAgICAgICAgICAgIDxtYXQtY2hpcC1ncmlkICNjaGlwR3JpZCBbZm9ybUNvbnRyb2xdPVwiZmFrZUZvcm1Db250cm9sXCIgW2Vycm9yU3RhdGVNYXRjaGVyXT1cImVycm9yU3RhdGVNYXRjaGVyXCI+XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjaGlwLWNvbnRhaW5lclwiXG4gICAgICAgICAgICAgICAgICAgICpuZ0Zvcj1cImxldCBsaXN0VmFsdWVJdGVtIG9mIGZvcm1Hcm91cC5jb250cm9scy5jb21wYXJpc29uVmFsdWUuY29udHJvbHMubGlzdFZhbHVlLmNvbnRyb2xzIHwgc2xpY2U6MDoyMDsgbGV0IGkgPSBpbmRleFwiXG4gICAgICAgICAgICAgICAgICAgIFttYXRUb29sdGlwXT1cImdldExpc3RWYWx1ZUl0ZW1Ub29sdGlwTWVzc2FnZShsaXN0VmFsdWVJdGVtKVwiPlxuICAgICAgICAgICAgICAgICAgICA8bWF0LWNoaXAtcm93IChyZW1vdmVkKT1cInJlbW92ZShpKVwiIFtkaXNhYmxlZF09XCJyZWFkT25seVwiIFtyZW1vdmFibGVdPVwiIXJlYWRPbmx5XCIgY2xhc3M9XCJjaGlwXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtlZGl0YWJsZV09XCIhcmVhZE9ubHlcIiAoZWRpdGVkKT1cImVkaXQoaSwgJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7J2ludmFsaWQnOiBpc0xpc3RWYWx1ZUl0ZW1JbnZhbGlkKGxpc3RWYWx1ZUl0ZW0pfVwiPlxuXG4gICAgICAgICAgICAgICAgICAgICAgICB7e2xpc3RWYWx1ZUl0ZW0uY29udHJvbHMudmFsdWUudmFsdWV9fVxuXG4gICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBtYXRDaGlwUmVtb3ZlICpuZ0lmPVwiIXJlYWRPbmx5XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1pY29uPmNhbmNlbDwvbWF0LWljb24+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgPC9tYXQtY2hpcC1yb3c+XG4gICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgIDxidXR0b24gbWF0LXN0cm9rZWQtYnV0dG9uIGNsYXNzPVwic2hvdy1hbGxcIiB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJmb3JtR3JvdXAuY29udHJvbHMuY29tcGFyaXNvblZhbHVlLmNvbnRyb2xzLmxpc3RWYWx1ZS5jb250cm9scy5sZW5ndGggPiAyMFwiXG4gICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJleHBhbmRMaXN0KClcIj5cbiAgICAgICAgICAgICAgICAgICAgc2hvdyBhbGwge3tmb3JtR3JvdXAuY29udHJvbHMuY29tcGFyaXNvblZhbHVlLmNvbnRyb2xzLmxpc3RWYWx1ZS5jb250cm9scy5sZW5ndGh9fVxuICAgICAgICAgICAgICAgICAgICBpdGVtczwvYnV0dG9uPlxuICAgICAgICAgICAgICAgIDxpbnB1dCBbZGlzYWJsZWRdPVwicmVhZE9ubHlcIiBbcGxhY2Vob2xkZXJdPVwiIXJlYWRPbmx5ID8gJ0FkZCBpdGVtIHRvIGxpc3QgLi4uJyA6ICcnXCJcbiAgICAgICAgICAgICAgICAgICAgW21hdENoaXBJbnB1dEZvcl09XCJjaGlwR3JpZFwiIFttYXRDaGlwSW5wdXRTZXBhcmF0b3JLZXlDb2Rlc109XCJzZXBhcmF0b3JLZXlzQ29kZXNcIlxuICAgICAgICAgICAgICAgICAgICBtYXRDaGlwSW5wdXRBZGRPbkJsdXIgKG1hdENoaXBJbnB1dFRva2VuRW5kKT1cImFkZCgkZXZlbnQpXCIgbWF0VG9vbHRpcD1cIkNvbXBhcmlzb24gdmFsdWVzIChsaXN0KVwiIC8+XG4gICAgICAgICAgICA8L21hdC1jaGlwLWdyaWQ+XG4gICAgICAgICAgICA8YnV0dG9uIG1hdEljb25QcmVmaXggY2xhc3M9XCJwcmVmaXgtYnV0dG9uXCIgdHlwZT1cImJ1dHRvblwiIG1hdC1pY29uLWJ1dHRvbiAqbmdJZj1cImlzQ2xlYXJUZXh0Q29tcGFyYXRvclNlbGVjdGVkXCJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwib3BlbkNsZWFydGV4dEluZm9EaWFsb2coKVwiXG4gICAgICAgICAgICAgICAgbWF0VG9vbHRpcD1cIlRoaXMgY29tcGFyaXNvbiB2YWx1ZSB3b24ndCBiZSBoYXNoZWQuIENsaWNrIGZvciBtb3JlIGluZm8uXCI+PG1hdC1pY29uPmxvY2tfb3Blbl9yaWdodDwvbWF0LWljb24+PC9idXR0b24+XG4gICAgICAgICAgICA8YnV0dG9uIG1hdEljb25TdWZmaXggY2xhc3M9XCJpbnB1dC1idXR0b25cIiB0eXBlPVwiYnV0dG9uXCIgbWF0LWljb24tYnV0dG9uIG1hdFRvb2x0aXA9XCJNb3JlLi4uXCJcbiAgICAgICAgICAgICAgICBbbWF0TWVudVRyaWdnZXJGb3JdPVwibW9yZU1lbnVcIj48bWF0LWljb24+bW9yZV92ZXJ0PC9tYXQtaWNvbj48L2J1dHRvbj5cbiAgICAgICAgICAgIDxidXR0b24gbWF0SWNvblN1ZmZpeCBjbGFzcz1cImlucHV0LWJ1dHRvblwiIHR5cGU9XCJidXR0b25cIiBtYXQtaWNvbi1idXR0b24gbWF0VG9vbHRpcD1cIkFkdmFuY2VkIGVkaXRvclwiXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cImV4cGFuZExpc3QoKVwiPjxtYXQtaWNvbj5lZGl0X25vdGU8L21hdC1pY29uPjwvYnV0dG9uPlxuICAgICAgICAgICAgPG1hdC1lcnJvclxuICAgICAgICAgICAgICAgICpuZ0lmPVwiZm9ybUdyb3VwLmNvbnRyb2xzLmNvbXBhcmlzb25WYWx1ZS5jb250cm9scy5saXN0VmFsdWUuaW52YWxpZCAmJiBmb3JtR3JvdXAuY29udHJvbHMuY29tcGFyaXNvblZhbHVlLmNvbnRyb2xzLmxpc3RWYWx1ZS5lcnJvcnNcIj5cbiAgICAgICAgICAgICAgICB7e0Zvcm1IZWxwZXIuZ2V0RXJyb3JNZXNzYWdlKGZvcm1Hcm91cC5jb250cm9scy5jb21wYXJpc29uVmFsdWUuY29udHJvbHMubGlzdFZhbHVlKX19XG4gICAgICAgICAgICA8L21hdC1lcnJvcj5cbiAgICAgICAgICAgIDxtYXQtZXJyb3JcbiAgICAgICAgICAgICAgICAqbmdJZj1cImZvcm1Hcm91cC5jb250cm9scy5jb21wYXJpc29uVmFsdWUuY29udHJvbHMubGlzdFZhbHVlLmludmFsaWQgJiYgIWZvcm1Hcm91cC5jb250cm9scy5jb21wYXJpc29uVmFsdWUuY29udHJvbHMubGlzdFZhbHVlLmVycm9yc1wiPlxuICAgICAgICAgICAgICAgIEludmFsaWQgaXRlbXNcbiAgICAgICAgICAgIDwvbWF0LWVycm9yPlxuICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxuICAgIDwvZGl2PlxuPC9uZy10ZW1wbGF0ZT5cblxuPG5nLXRlbXBsYXRlICNudW1iZXJUZW1wbGF0ZT5cbiAgICA8ZGl2ICpuZ0lmPVwiZm9ybUdyb3VwLmNvbnRyb2xzLmNvbXBhcmlzb25WYWx1ZS5jb250cm9scy5kb3VibGVWYWx1ZVwiIGNsYXNzPVwidGFyZ2V0aW5nLXJ1bGUtY29tcG9uZW50IGdyb3dcIj5cbiAgICAgICAgPG1hdC1mb3JtLWZpZWxkIGFwcGVhcmFuY2U9XCJvdXRsaW5lXCIgc3Vic2NyaXB0U2l6aW5nPVwiZHluYW1pY1wiPlxuICAgICAgICAgICAgPGlucHV0IG1hdElucHV0IHR5cGU9XCJudW1iZXJcIiBbZm9ybUNvbnRyb2xdPVwiZm9ybUdyb3VwLmNvbnRyb2xzLmNvbXBhcmlzb25WYWx1ZS5jb250cm9scy5kb3VibGVWYWx1ZVwiXG4gICAgICAgICAgICAgICAgbWF0VG9vbHRpcD1cIkNvbXBhcmlzb24gdmFsdWUgKG51bWJlcilcIiBwbGFjZWhvbGRlcj1cIkFkZCBudW1iZXIgLi4uXCIgaW5wdXREaXNwbGF5Tm9ybWFsaXplciAvPlxuICAgICAgICAgICAgPG1hdC1lcnJvciAqbmdJZj1cImZvcm1Hcm91cC5jb250cm9scy5jb21wYXJpc29uVmFsdWUuY29udHJvbHMuZG91YmxlVmFsdWUuaW52YWxpZFwiPlxuICAgICAgICAgICAgICAgIHt7Rm9ybUhlbHBlci5nZXRFcnJvck1lc3NhZ2UoZm9ybUdyb3VwLmNvbnRyb2xzLmNvbXBhcmlzb25WYWx1ZS5jb250cm9scy5kb3VibGVWYWx1ZSl9fVxuICAgICAgICAgICAgPC9tYXQtZXJyb3I+XG4gICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XG4gICAgPC9kaXY+XG48L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGUgI2RhdGVUaW1lVGVtcGxhdGU+XG4gICAgPGRpdiAqbmdJZj1cImZvcm1Hcm91cC5jb250cm9scy5jb21wYXJpc29uVmFsdWUuY29udHJvbHMuZG91YmxlVmFsdWVcIiBjbGFzcz1cInRhcmdldGluZy1ydWxlLWNvbXBvbmVudCBkYXRldGltZVwiPlxuICAgICAgICA8YXBwLWRhdGUtdGltZS1waWNrZXIgW2Zvcm1Db250cm9sXT1cImZvcm1Hcm91cC5jb250cm9scy5jb21wYXJpc29uVmFsdWUuY29udHJvbHMuZG91YmxlVmFsdWVcIlxuICAgICAgICAgICAgZGF0ZVRvb2x0aXA9XCJDb21wYXJpc29uIHZhbHVlIChkYXRlKVwiIHRpbWVUb29sdGlwPVwiQ29tcGFyaXNvbiB2YWx1ZSAodGltZSlcIiAvPlxuICAgIDwvZGl2PlxuPC9uZy10ZW1wbGF0ZT5cblxuXG48bWF0LW1lbnUgI21vcmVNZW51PlxuICAgIDxhIG1hdC1tZW51LWl0ZW0gKGNsaWNrKT1cImV4cGFuZExpc3QoKVwiPjxtYXQtaWNvbj5lZGl0X25vdGU8L21hdC1pY29uPkFkdmFuY2VkIGVkaXRvcjwvYT5cbiAgICA8YSBtYXQtbWVudS1pdGVtIChjbGljayk9XCJjb3B5VmFsdWVzQXNDc3YoKVwiPjxtYXQtaWNvbj5jb250ZW50X2NvcHk8L21hdC1pY29uPkNvcHkgYXMgQ1NWICh2YWx1ZXMgb25seSk8L2E+XG4gICAgPGEgbWF0LW1lbnUtaXRlbSAoY2xpY2spPVwicmVtb3ZlQWxsKClcIiBbZGlzYWJsZWRdPVwicmVhZE9ubHlcIj48bWF0LWljb24+ZGVsZXRlX291dGxpbmU8L21hdC1pY29uPlJlbW92ZVxuICAgICAgICBhbGw8L2E+XG48L21hdC1tZW51PiJdfQ==
|