@aesys/ngx-rating
Version:
Angular Library for creating RATING elements.
153 lines (151 loc) • 41.4 kB
JavaScript
import { Component, Input } from '@angular/core';
import { NG_VALUE_ACCESSOR } from '@angular/forms';
import { BehaviorSubject } from 'rxjs';
import { getColorScale, toColorString } from './color-generator';
import * as i0 from "@angular/core";
import * as i1 from "@angular/common";
import * as i2 from "ng2-tooltip-directive";
export class NgxRatingComponent {
constructor() {
this.items = [];
this.theme = 'squares';
this.styles = [];
this.showTitle = false;
this.tooltip = false;
this.tooltipSettings = {};
this.titlePosition = 'top';
this.details = {};
this.style = [];
this.margin = 10;
this.autoMargin = false;
this.disabled = false;
this.showDescriptionBS = new BehaviorSubject('-');
this.showDescription$ = this.showDescriptionBS.asObservable();
this.actualDescription = '-';
this.showSelection = -1;
this.actualSelection = -1;
this.color = [];
this.onChange = (item) => { };
this.onTouch = (item) => { };
}
ngOnInit() {
this.items = this.settings.items || [];
this.items = getColorScale(this.items);
this.color = this.items.map(item => toColorString(item.color || {}));
this.theme = this.settings.theme || 'squares';
if ('images' in this.settings) {
this.images = this.settings.images;
}
this.showTitle = this.settings.showTitle;
if (this.settings.tooltip) {
this.tooltip = this.settings.tooltip;
this.tooltipSettings = {
'placement': this.titlePosition,
'delay': 200,
'theme': 'light'
};
}
else {
this.tooltip = false;
}
this.titlePosition = this.settings.titlePosition || 'top';
this.details = this.settings.itemDetail;
this.marginDetect();
}
writeValue(item) {
if (Object.keys(item).length !== 0) {
this.actualDescription = item.description;
this.showDescriptionBS.next(item.description);
this.actualSelection = this.items.indexOf(this.items.find(el => item.id === el.id) || {});
this.showSelection = this.actualSelection;
}
else {
this.actualDescription = '-';
this.showDescriptionBS.next('-');
}
}
registerOnChange(fn) {
this.onChange = fn;
}
registerOnTouched(fn) {
this.onTouch = fn;
}
setDisabledState(isDisabled) {
this.disabled = isDisabled;
}
mouseOver(selectedIdx, item) {
if (!this.disabled) {
this.showDescriptionBS.next(item.description);
this.showSelection = selectedIdx;
}
}
mouseLeave() {
this.showSelection = this.actualSelection;
this.showDescriptionBS.next(this.actualDescription);
}
getScaleItemChange(indexSelected, item) {
if (this.actualSelection !== indexSelected && !this.disabled) {
this.actualSelection = indexSelected;
this.showSelection = indexSelected;
this.actualDescription = item.description;
this.showDescriptionBS.next(item.description);
this.onChange(item);
}
}
marginDetect() {
if (this.settings.itemMargin) {
if (this.settings.itemMargin === 'auto') {
this.autoMargin = true;
}
else {
const parsed = Number.parseInt(this.settings.itemMargin);
if (!Number.isNaN(parsed)) {
this.margin = parsed;
this.autoMargin = false;
}
}
}
}
}
NgxRatingComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.0.5", ngImport: i0, type: NgxRatingComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
NgxRatingComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.0.5", type: NgxRatingComponent, selector: "ngx-rating", inputs: { settings: "settings" }, providers: [
{
provide: NG_VALUE_ACCESSOR,
multi: true,
useExisting: NgxRatingComponent
}
], ngImport: i0, template: "<div class=\"rating-container\"\n [ngStyle]=\"{'flex-direction': (titlePosition === 'top') ? 'column' : (titlePosition === 'left') ? 'row' : (titlePosition === 'right') ? 'row-reverse' : 'column-reverse'}\"\n>\n <div\n class=\"title\"\n *ngIf=\"showTitle && !tooltip\"\n [ngStyle]=\"{\n 'margin': titlePosition === 'top' ? '0 0 20px 0' :\n titlePosition === 'bottom' ? '20px 0 0 0' :\n titlePosition === 'left' ? '0 20px 0 0' :\n titlePosition === 'right' ? '0 0 0 20px' : ''\n }\"\n >\n {{showDescription$ | async}}\n </div>\n <div class=\"container-scale\" *ngIf=\"settings\"\n [ngStyle]=\"{\n 'justify-content': autoMargin ? 'space-between' : 'center'\n }\">\n <ng-container *ngFor=\"let item of items; let idx = index\">\n <div *ngIf=\"(tooltip && (!disabled || (disabled && actualSelection === idx))); else noTooltip\" tooltip={{item.description}} [options]=\"tooltipSettings\" >\n <div [ngSwitch]=\"theme\">\n <div\n *ngSwitchCase=\"'squares'\"\n (mouseover)=\"mouseOver(idx, item)\"\n (mouseleave)=\"mouseLeave()\"\n (click)=\"getScaleItemChange(idx, item)\"\n [style.width.px]=\"details.width\"\n [style.height.px]=\"details.height\"\n [style.marginRight.px]=\"!autoMargin ? margin : ''\"\n [ngStyle]=\"{\n 'background-color': (idx <= showSelection) ? color[idx] : 'grey'\n }\"\n >\n </div>\n <div\n *ngSwitchCase=\"'rounded_squares'\"\n (mouseover)=\"mouseOver(idx, item)\"\n (mouseleave)=\"mouseLeave()\"\n (click)=\"getScaleItemChange(idx, item)\"\n [style.width.px]=\"details.width\"\n [style.height.px]=\"details.height\"\n [style.marginRight.px]=\"!autoMargin ? margin : ''\"\n [ngStyle]=\"{\n 'background-color': (idx <= showSelection) ? color[idx] : 'grey',\n 'border-radius': idx === 0 ? '8px 0 0 8px' : idx === items.length-1 ? '0 8px 8px 0' : ''\n }\"\n >\n </div>\n\n <div\n *ngSwitchCase=\"'single_icon'\"\n (mouseover)=\"mouseOver(idx, item)\"\n (mouseleave)=\"mouseLeave()\"\n (click)=\"getScaleItemChange(idx, item)\"\n >\n <div\n *ngIf=\"images\"\n [style.width.px]=\"details.width\"\n [style.height.px]=\"details.height\"\n [style.mask.url]=\"images[0]\"\n [style.marginRight.px]=\"!autoMargin ? margin : ''\"\n style=\"\n mask-size: {{details.width}}px {{details.height}}px;\n -webkit-mask: url({{images[0]}}) no-repeat center;\n -webkit-mask-size: {{details.width}}px {{details.height}}px\"\n [ngStyle]=\"{\n 'background-color': (idx <= showSelection) ? color[idx] : 'grey'\n }\"\n >\n </div>\n </div>\n\n <div\n *ngSwitchCase=\"'multiple_icons'\"\n (mouseover)=\"mouseOver(idx, item)\"\n (mouseleave)=\"mouseLeave()\"\n (click)=\"getScaleItemChange(idx, item)\"\n >\n <div\n *ngIf=\"images\"\n >\n <div *ngIf=\"idx <= showSelection; else falseItems\"\n [style.width.px]=\"details.width\"\n [style.height.px]=\"details.height\"\n [style.backgroundColor]=\"color[idx]\"\n [style.marginRight.px]=\"!autoMargin ? margin : ''\"\n style=\"\n mask: url({{images[0]}});\n mask-size: {{details.width}}px {{details.height}}px;\n -webkit-mask: url({{images[0]}}) no-repeat center;\n -webkit-mask-size: {{details.width}}px {{details.height}}px;\"\n >\n </div>\n <ng-template #falseItems>\n <div\n [style.width.px]=\"details.width\"\n [style.height.px]=\"details.height\"\n [style.backgroundColor]=\"'grey'\"\n [style.marginRight.px]=\"!autoMargin ? margin : ''\"\n style=\"\n mask: url({{images[1]}});\n mask-size: {{details.width}}px {{details.height}}px;\n -webkit-mask: url({{images[1]}}) no-repeat center;\n -webkit-mask-size: {{details.width}}px {{details.height}}px;\"\n >\n </div>\n </ng-template>\n </div>\n </div>\n </div>\n </div>\n <ng-template #noTooltip>\n <div [ngSwitch]=\"theme\">\n <div\n *ngSwitchCase=\"'squares'\"\n (mouseover)=\"mouseOver(idx, item)\"\n (mouseleave)=\"mouseLeave()\"\n (click)=\"getScaleItemChange(idx, item)\"\n [style.width.px]=\"details.width\"\n [style.height.px]=\"details.height\"\n [style.marginRight.px]=\"!autoMargin ? margin : ''\"\n [ngStyle]=\"{\n 'background-color': (idx <= showSelection) ? color[idx] : 'grey'\n }\"\n >\n </div>\n <div\n *ngSwitchCase=\"'rounded_squares'\"\n (mouseover)=\"mouseOver(idx, item)\"\n (mouseleave)=\"mouseLeave()\"\n (click)=\"getScaleItemChange(idx, item)\"\n [style.width.px]=\"details.width\"\n [style.height.px]=\"details.height\"\n [style.marginRight.px]=\"!autoMargin ? margin : ''\"\n [ngStyle]=\"{\n 'background-color': (idx <= showSelection) ? color[idx] : 'grey',\n 'border-radius': idx === 0 ? '8px 0 0 8px' : idx === items.length-1 ? '0 8px 8px 0' : ''\n }\"\n >\n </div>\n\n <div\n *ngSwitchCase=\"'single_icon'\"\n (mouseover)=\"mouseOver(idx, item)\"\n (mouseleave)=\"mouseLeave()\"\n (click)=\"getScaleItemChange(idx, item)\"\n >\n <div\n *ngIf=\"images\"\n [style.width.px]=\"details.width\"\n [style.height.px]=\"details.height\"\n [style.mask.url]=\"images[0]\"\n [style.marginRight.px]=\"!autoMargin ? margin : ''\"\n style=\"\n mask-size: {{details.width}}px {{details.height}}px;\n -webkit-mask: url({{images[0]}}) no-repeat center;\n -webkit-mask-size: {{details.width}}px {{details.height}}px\"\n [ngStyle]=\"{\n 'background-color': (idx <= showSelection) ? color[idx] : 'grey'\n }\"\n >\n </div>\n </div>\n\n <div\n *ngSwitchCase=\"'multiple_icons'\"\n (mouseover)=\"mouseOver(idx, item)\"\n (mouseleave)=\"mouseLeave()\"\n (click)=\"getScaleItemChange(idx, item)\"\n >\n <div\n *ngIf=\"images\"\n >\n <div *ngIf=\"idx <= showSelection; else falseItems\"\n [style.width.px]=\"details.width\"\n [style.height.px]=\"details.height\"\n [style.backgroundColor]=\"color[idx]\"\n [style.marginRight.px]=\"!autoMargin ? margin : ''\"\n style=\"\n mask: url({{images[0]}});\n mask-size: {{details.width}}px {{details.height}}px;\n -webkit-mask: url({{images[0]}}) no-repeat center;\n -webkit-mask-size: {{details.width}}px {{details.height}}px;\"\n >\n </div>\n <ng-template #falseItems>\n <div\n [style.width.px]=\"details.width\"\n [style.height.px]=\"details.height\"\n [style.backgroundColor]=\"'grey'\"\n [style.marginRight.px]=\"!autoMargin ? margin : ''\"\n style=\"\n mask: url({{images[1]}});\n mask-size: {{details.width}}px {{details.height}}px;\n -webkit-mask: url({{images[1]}}) no-repeat center;\n -webkit-mask-size: {{details.width}}px {{details.height}}px;\"\n >\n </div>\n </ng-template>\n </div>\n </div>\n </div>\n </ng-template>\n\n </ng-container>\n </div>\n</div>\n", styles: ["\n .rating-container {\n display: flex;\n align-items: center;\n justify-content: center;\n }\n\n .title {\n text-transform: lowercase;\n }\n\n .container-scale {\n display: flex;\n align-items: center;\n width: 100%;\n }\n "], directives: [{ type: i1.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i2.TooltipDirective, selector: "[tooltip]", inputs: ["options", "tooltip", "placement", "autoPlacement", "content-type", "contentType", "hide-delay-mobile", "hideDelayTouchscreen", "z-index", "zIndex", "animation-duration", "animationDuration", "trigger", "tooltip-class", "tooltipClass", "display", "display-mobile", "displayTouchscreen", "shadow", "theme", "offset", "width", "max-width", "maxWidth", "id", "show-delay", "showDelay", "hide-delay", "hideDelay", "hideDelayAfterClick", "pointerEvents", "position"], outputs: ["events"], exportAs: ["tooltip"] }, { type: i1.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { type: i1.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }], pipes: { "async": i1.AsyncPipe } });
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.0.5", ngImport: i0, type: NgxRatingComponent, decorators: [{
type: Component,
args: [{
selector: 'ngx-rating',
templateUrl: './ngx-rating.component.html',
styles: [
`
.rating-container {
display: flex;
align-items: center;
justify-content: center;
}
.title {
text-transform: lowercase;
}
.container-scale {
display: flex;
align-items: center;
width: 100%;
}
`
],
providers: [
{
provide: NG_VALUE_ACCESSOR,
multi: true,
useExisting: NgxRatingComponent
}
]
}]
}], ctorParameters: function () { return []; }, propDecorators: { settings: [{
type: Input
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmd4LXJhdGluZy5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtcmF0aW5nL3NyYy9saWIvbmd4LXJhdGluZy5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtcmF0aW5nL3NyYy9saWIvbmd4LXJhdGluZy5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBVSxNQUFNLGVBQWUsQ0FBQztBQUN6RCxPQUFPLEVBQXdCLGlCQUFpQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDekUsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUN2QyxPQUFPLEVBQUUsYUFBYSxFQUFFLGFBQWEsRUFBRSxNQUFNLG1CQUFtQixDQUFDOzs7O0FBaUNqRSxNQUFNLE9BQU8sa0JBQWtCO0lBOEI3QjtRQTFCQSxVQUFLLEdBQVcsRUFBRSxDQUFBO1FBQ2xCLFVBQUssR0FBVyxTQUFTLENBQUM7UUFFMUIsV0FBTSxHQUFhLEVBQUUsQ0FBQztRQUN0QixjQUFTLEdBQVksS0FBSyxDQUFDO1FBQzNCLFlBQU8sR0FBWSxLQUFLLENBQUM7UUFDekIsb0JBQWUsR0FBRyxFQUFFLENBQUM7UUFDckIsa0JBQWEsR0FBVyxLQUFLLENBQUM7UUFDOUIsWUFBTyxHQUFlLEVBQWdCLENBQUM7UUFDdkMsVUFBSyxHQUFhLEVBQUUsQ0FBQztRQUNyQixXQUFNLEdBQVcsRUFBRSxDQUFDO1FBQ3BCLGVBQVUsR0FBWSxLQUFLLENBQUM7UUFDNUIsYUFBUSxHQUFZLEtBQUssQ0FBQztRQUUxQixzQkFBaUIsR0FBRyxJQUFJLGVBQWUsQ0FBUyxHQUFHLENBQUMsQ0FBQztRQUNyRCxxQkFBZ0IsR0FBRyxJQUFJLENBQUMsaUJBQWlCLENBQUMsWUFBWSxFQUFFLENBQUM7UUFDekQsc0JBQWlCLEdBQVcsR0FBRyxDQUFD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QyxRQUFRLENBQUMsVUFBVSxDQUFDLENBQUM7Z0JBQ3pELElBQUcsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxFQUFFO29CQUN4QixJQUFJLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQztvQkFDckIsSUFBSSxDQUFDLFVBQVUsR0FBRyxLQUFLLENBQUM7aUJBQ3pCO2FBQ0Y7U0FDRjtJQUNILENBQUM7OytHQXRIVSxrQkFBa0I7bUdBQWxCLGtCQUFrQix1RUFSbEI7UUFDVDtZQUNFLE9BQU8sRUFBRSxpQkFBaUI7WUFDMUIsS0FBSyxFQUFDLElBQUk7WUFDVixXQUFXLEVBQUUsa0JBQWtCO1NBQ2hDO0tBQ0YsMEJDbENILDB6VEFnTkE7MkZENUthLGtCQUFrQjtrQkE5QjlCLFNBQVM7bUJBQUM7b0JBQ1QsUUFBUSxFQUFFLFlBQVk7b0JBQ3RCLFdBQVcsRUFBRSw2QkFBNkI7b0JBQzFDLE1BQU0sRUFBRTt3QkFDTjs7Ozs7Ozs7Ozs7Ozs7OztLQWdCQztxQkFDRjtvQkFDRCxTQUFTLEVBQUU7d0JBQ1Q7NEJBQ0UsT0FBTyxFQUFFLGlCQUFpQjs0QkFDMUIsS0FBSyxFQUFDLElBQUk7NEJBQ1YsV0FBVyxvQkFBb0I7eUJBQ2hDO3FCQUNGO2lCQUNGOzBFQUdVLFFBQVE7c0JBQWhCLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIElucHV0LCBPbkluaXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IENvbnRyb2xWYWx1ZUFjY2Vzc29yLCBOR19WQUxVRV9BQ0NFU1NPUiB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IEJlaGF2aW9yU3ViamVjdCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgZ2V0Q29sb3JTY2FsZSwgdG9Db2xvclN0cmluZyB9IGZyb20gJy4vY29sb3ItZ2VuZXJhdG9yJztcbmltcG9ydCB7IENvbG9yLCBJdGVtLCBJdGVtRGV0YWlsLCBTZXR0aW5ncywgU2V0dGluZ3NJbWFnZSB9IGZyb20gJy4vbW9kZWwnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICduZ3gtcmF0aW5nJyxcbiAgdGVtcGxhdGVVcmw6ICcuL25neC1yYXRpbmcuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZXM6IFtcbiAgICBgXG4gICAgLnJhdGluZy1jb250YWluZXIge1xuICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcbiAgICB9XG5cbiAgICAudGl0bGUge1xuICAgICAgdGV4dC10cmFuc2Zvcm06IGxvd2VyY2FzZTtcbiAgICB9XG5cbiAgICAuY29udGFpbmVyLXNjYWxlIHtcbiAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgICAgd2lkdGg6IDEwMCU7XG4gICAgfVxuICAgIGBcbiAgXSxcbiAgcHJvdmlkZXJzOiBbXG4gICAge1xuICAgICAgcHJvdmlkZTogTkdfVkFMVUVfQUNDRVNTT1IsXG4gICAgICBtdWx0aTp0cnVlLFxuICAgICAgdXNlRXhpc3Rpbmc6IE5neFJhdGluZ0NvbXBvbmVudFxuICAgIH1cbiAgXVxufSlcbmV4cG9ydCBjbGFzcyBOZ3hSYXRpbmdDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIENvbnRyb2xWYWx1ZUFjY2Vzc29yIHtcblxuICBASW5wdXQoKSBzZXR0aW5ncyE6IFNldHRpbmdzO1xuXG4gIGl0ZW1zOiBJdGVtW10gPSBbXVxuICB0aGVtZTogc3RyaW5nID0gJ3NxdWFyZXMnO1xuICBpbWFnZXMhOiBzdHJpbmdbXTtcbiAgc3R5bGVzOiBzdHJpbmdbXSA9IFtdO1xuICBzaG93VGl0bGU6IGJvb2xlYW4gPSBmYWxzZTtcbiAgdG9vbHRpcDogYm9vbGVhbiA9IGZhbHNlO1xuICB0b29sdGlwU2V0dGluZ3MgPSB7fTtcbiAgdGl0bGVQb3NpdGlvbjogc3RyaW5nID0gJ3RvcCc7XG4gIGRldGFpbHM6IEl0ZW1EZXRhaWwgPSB7fSBhcyBJdGVtRGV0YWlsO1xuICBzdHlsZTogc3RyaW5nW10gPSBbXTtcbiAgbWFyZ2luOiBudW1iZXIgPSAxMDtcbiAgYXV0b01hcmdpbjogYm9vbGVhbiA9IGZhbHNlO1xuICBkaXNhYmxlZDogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIHNob3dEZXNjcmlwdGlvbkJTID0gbmV3IEJlaGF2aW9yU3ViamVjdDxzdHJpbmc+KCctJyk7XG4gIHNob3dEZXNjcmlwdGlvbiQgPSB0aGlzLnNob3dEZXNjcmlwdGlvbkJTLmFzT2JzZXJ2YWJsZSgpO1xuICBhY3R1YWxEZXNjcmlwdGlvbjogc3RyaW5nID0gJy0nO1xuXG4gIHNob3dTZWxlY3Rpb246IG51bWJlciA9IC0xO1xuICBhY3R1YWxTZWxlY3Rpb246IG51bWJlciA9IC0xO1xuICBwdWJsaWMgY29sb3I6IHN0cmluZ1tdID0gW107XG5cblxuICBvbkNoYW5nZSA9IChpdGVtOiBJdGVtKSA9PiB7fTtcbiAgb25Ub3VjaCA9IChpdGVtOiBJdGVtKSA9PiB7fTtcblxuICBjb25zdHJ1Y3RvcigpIHt9XG5cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgdGhpcy5pdGVtcyA9IHRoaXMuc2V0dGluZ3MuaXRlbXMgfHwgW107XG4gICAgdGhpcy5pdGVtcyA9IGdldENvbG9yU2NhbGUodGhpcy5pdGVtcyk7XG4gICAgdGhpcy5jb2xvciA9IHRoaXMuaXRlbXMubWFwKGl0ZW0gPT4gdG9Db2xvclN0cmluZyhpdGVtLmNvbG9yIHx8IHt9IGFzIENvbG9yKSk7XG4gICAgdGhpcy50aGVtZSA9IHRoaXMuc2V0dGluZ3MudGhlbWUgfHwgJ3NxdWFyZXMnO1xuICAgIGlmKCdpbWFnZXMnIGluIHRoaXMuc2V0dGluZ3MpIHtcbiAgICAgIHRoaXMuaW1hZ2VzID0gKDxTZXR0aW5nc0ltYWdlPnRoaXMuc2V0dGluZ3MpLmltYWdlcztcbiAgICB9XG4gICAgdGhpcy5zaG93VGl0bGUgPSB0aGlzLnNldHRpbmdzLnNob3dUaXRsZTtcbiAgICBpZih0aGlzLnNldHRpbmdzLnRvb2x0aXApIHtcbiAgICAgIHRoaXMudG9vbHRpcCA9IHRoaXMuc2V0dGluZ3MudG9vbHRpcDtcbiAgICAgIHRoaXMudG9vbHRpcFNldHRpbmdzID0ge1xuICAgICAgICAncGxhY2VtZW50JzogdGhpcy50aXRsZVBvc2l0aW9uLFxuICAgICAgICAnZGVsYXknOiAyMDAsXG4gICAgICAgICd0aGVtZSc6ICdsaWdodCdcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy50b29sdGlwID0gZmFsc2U7XG4gICAgfVxuICAgIHRoaXMudGl0bGVQb3NpdGlvbiA9IHRoaXMuc2V0dGluZ3MudGl0bGVQb3NpdGlvbiB8fCAndG9wJztcbiAgICB0aGlzLmRldGFpbHMgPSB0aGlzLnNldHRpbmdzLml0ZW1EZXRhaWw7XG4gICAgdGhpcy5tYXJnaW5EZXRlY3QoKTtcbiAgfVxuXG4gIHdyaXRlVmFsdWUoaXRlbTogSXRlbSk6IHZvaWQge1xuICAgIGlmKE9iamVjdC5rZXlzKGl0ZW0pLmxlbmd0aCAhPT0gMCkge1xuICAgICAgdGhpcy5hY3R1YWxEZXNjcmlwdGlvbiA9IGl0ZW0uZGVzY3JpcHRpb247XG4gICAgICB0aGlzLnNob3dEZXNjcmlwdGlvbkJTLm5leHQoaXRlbS5kZXNjcmlwdGlvbik7XG4gICAgICB0aGlzLmFjdHVhbFNlbGVjdGlvbiA9IHRoaXMuaXRlbXMuaW5kZXhPZihcbiAgICAgICAgdGhpcy5pdGVtcy5maW5kKGVsID0+IGl0ZW0uaWQgPT09IGVsLmlkKSB8fCB7fSBhcyBJdGVtXG4gICAgICApO1xuICAgICAgdGhpcy5zaG93U2VsZWN0aW9uID0gdGhpcy5hY3R1YWxTZWxlY3Rpb247XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgdGhpcy5hY3R1YWxEZXNjcmlwdGlvbiA9ICctJztcbiAgICAgIHRoaXMuc2hvd0Rlc2NyaXB0aW9uQlMubmV4dCgnLScpO1xuICAgIH1cblxuICB9XG5cbiAgcmVnaXN0ZXJPbkNoYW5nZShmbjogYW55KTogdm9pZCB7XG4gICAgdGhpcy5vbkNoYW5nZSA9IGZuO1xuICB9XG5cbiAgcmVnaXN0ZXJPblRvdWNoZWQoZm46IGFueSk6IHZvaWQge1xuICAgIHRoaXMub25Ub3VjaCA9IGZuO1xuICB9XG5cbiAgc2V0RGlzYWJsZWRTdGF0ZShpc0Rpc2FibGVkOiBib29sZWFuKTogdm9pZCB7XG4gICAgdGhpcy5kaXNhYmxlZCA9IGlzRGlzYWJsZWQ7XG4gIH1cblxuICBtb3VzZU92ZXIoc2VsZWN0ZWRJZHg6IG51bWJlciwgaXRlbTogSXRlbSl7XG4gICAgaWYoIXRoaXMuZGlzYWJsZWQpIHtcbiAgICAgIHRoaXMuc2hvd0Rlc2NyaXB0aW9uQlMubmV4dChpdGVtLmRlc2NyaXB0aW9uKTtcbiAgICAgIHRoaXMuc2hvd1NlbGVjdGlvbiA9IHNlbGVjdGVkSWR4O1xuICAgIH1cbiAgfVxuXG4gIG1vdXNlTGVhdmUoKXtcbiAgICB0aGlzLnNob3dTZWxlY3Rpb24gPSB0aGlzLmFjdHVhbFNlbGVjdGlvbjtcbiAgICB0aGlzLnNob3dEZXNjcmlwdGlvbkJTLm5leHQodGhpcy5hY3R1YWxEZXNjcmlwdGlvbik7XG4gIH1cblxuICBnZXRTY2FsZUl0ZW1DaGFuZ2UoaW5kZXhTZWxlY3RlZDogbnVtYmVyLCBpdGVtOiBJdGVtKXtcbiAgICBpZiAodGhpcy5hY3R1YWxTZWxlY3Rpb24gIT09IGluZGV4U2VsZWN0ZWQgJiYgIXRoaXMuZGlzYWJsZWQpIHtcbiAgICAgIHRoaXMuYWN0dWFsU2VsZWN0aW9uID0gaW5kZXhTZWxlY3RlZDtcbiAgICAgIHRoaXMuc2hvd1NlbGVjdGlvbiA9IGluZGV4U2VsZWN0ZWQ7XG4gICAgICB0aGlzLmFjdHVhbERlc2NyaXB0aW9uID0gaXRlbS5kZXNjcmlwdGlvbjtcbiAgICAgIHRoaXMuc2hvd0Rlc2NyaXB0aW9uQlMubmV4dChpdGVtLmRlc2NyaXB0aW9uKTtcbiAgICAgIHRoaXMub25DaGFuZ2UoaXRlbSk7XG4gICAgfVxuICB9XG5cbiAgbWFyZ2luRGV0ZWN0KCkge1xuICAgIGlmKHRoaXMuc2V0dGluZ3MuaXRlbU1hcmdpbikge1xuICAgICAgaWYodGhpcy5zZXR0aW5ncy5pdGVtTWFyZ2luID09PSAnYXV0bycpIHtcbiAgICAgICAgdGhpcy5hdXRvTWFyZ2luID0gdHJ1ZTtcbiAgICAgIH1lbHNlIHtcbiAgICAgICAgY29uc3QgcGFyc2VkID0gTnVtYmVyLnBhcnNlSW50KHRoaXMuc2V0dGluZ3MuaXRlbU1hcmdpbik7XG4gICAgICAgIGlmKCFOdW1iZXIuaXNOYU4ocGFyc2VkKSkge1xuICAgICAgICAgIHRoaXMubWFyZ2luID0gcGFyc2VkO1xuICAgICAgICAgIHRoaXMuYXV0b01hcmdpbiA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG59XG4iLCI8ZGl2IGNsYXNzPVwicmF0aW5nLWNvbnRhaW5lclwiXG4gICAgW25nU3R5bGVdPVwieydmbGV4LWRpcmVjdGlvbic6ICh0aXRsZVBvc2l0aW9uID09PSAndG9wJykgPyAnY29sdW1uJyA6ICh0aXRsZVBvc2l0aW9uID09PSAnbGVmdCcpID8gJ3JvdycgOiAodGl0bGVQb3NpdGlvbiA9PT0gJ3JpZ2h0JykgPyAncm93LXJldmVyc2UnIDogJ2NvbHVtbi1yZXZlcnNlJ31cIlxuPlxuICAgIDxkaXZcbiAgICAgICAgY2xhc3M9XCJ0aXRsZVwiXG4gICAgICAgICpuZ0lmPVwic2hvd1RpdGxlICYmICF0b29sdGlwXCJcbiAgICAgICAgW25nU3R5bGVdPVwie1xuICAgICAgICAgICAgJ21hcmdpbic6IHRpdGxlUG9zaXRpb24gPT09ICd0b3AnID8gJzAgMCAyMHB4IDAnIDpcbiAgICAgICAgICAgICAgICAgICAgdGl0bGVQb3NpdGlvbiA9PT0gJ2JvdHRvbScgPyAnMjBweCAwIDAgMCcgOlxuICAgICAgICAgICAgICAgICAgICB0aXRsZVBvc2l0aW9uID09PSAnbGVmdCcgPyAnMCAyMHB4IDAgMCcgOlxuICAgICAgICAgICAgICAgICAgICB0aXRsZVBvc2l0aW9uID09PSAncmlnaHQnID8gJzAgMCAwIDIwcHgnIDogJydcbiAgICAgICAgfVwiXG4gICAgPlxuICAgICAgICB7e3Nob3dEZXNjcmlwdGlvbiQgfCBhc3luY319XG4gICAgPC9kaXY+XG4gICAgPGRpdiBjbGFzcz1cImNvbnRhaW5lci1zY2FsZVwiICpuZ0lmPVwic2V0dGluZ3NcIlxuICAgICAgICBbbmdTdHlsZV09XCJ7XG4gICAgICAgICAgICAnanVzdGlmeS1jb250ZW50JzogYXV0b01hcmdpbiA/ICdzcGFjZS1iZXR3ZWVuJyA6ICdjZW50ZXInXG4gICAgICAgIH1cIj5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgaXRlbSBvZiBpdGVtczsgbGV0IGlkeCA9IGluZGV4XCI+XG4gICAgICAgICAgPGRpdiAqbmdJZj1cIih0b29sdGlwICYmICghZGlzYWJsZWQgfHwgKGRpc2FibGVkICYmIGFjdHVhbFNlbGVjdGlvbiA9PT0gaWR4KSkpOyBlbHNlIG5vVG9vbHRpcFwiIHRvb2x0aXA9e3tpdGVtLmRlc2NyaXB0aW9ufX0gW29wdGlvbnNdPVwidG9vbHRpcFNldHRpbmdzXCIgPlxuICAgICAgICAgICAgPGRpdiBbbmdTd2l0Y2hdPVwidGhlbWVcIj5cbiAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgICAgKm5nU3dpdGNoQ2FzZT1cIidzcXVhcmVzJ1wiXG4gICAgICAgICAgICAgICAgICAobW91c2VvdmVyKT1cIm1vdXNlT3ZlcihpZHgsIGl0ZW0pXCJcbiAgICAgICAgICAgICAgICAgIChtb3VzZWxlYXZlKT1cIm1vdXNlTGVhdmUoKVwiXG4gICAgICAgICAgICAgICAgICAoY2xpY2spPVwiZ2V0U2NhbGVJdGVtQ2hhbmdlKGlkeCwgaXRlbSlcIlxuICAgICAgICAgICAgICAgICAgW3N0eWxlLndpZHRoLnB4XT1cImRldGFpbHMud2lkdGhcIlxuICAgICAgICAgICAgICAgICAgW3N0eWxlLmhlaWdodC5weF09XCJkZXRhaWxzLmhlaWdodFwiXG4gICAgICAgICAgICAgICAgICBbc3R5bGUubWFyZ2luUmlnaHQucHhdPVwiIWF1dG9NYXJnaW4gPyBtYXJnaW4gOiAnJ1wiXG4gICAgICAgICAgICAgICAgICBbbmdTdHlsZV09XCJ7XG4gICAgICAgICAgICAgICAgICAgICAgJ2JhY2tncm91bmQtY29sb3InOiAoaWR4IDw9IHNob3dTZWxlY3Rpb24pID8gY29sb3JbaWR4XSA6ICdncmV5J1xuICAgICAgICAgICAgICAgICAgfVwiXG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICAgICpuZ1N3aXRjaENhc2U9XCIncm91bmRlZF9zcXVhcmVzJ1wiXG4gICAgICAgICAgICAgICAgICAobW91c2VvdmVyKT1cIm1vdXNlT3ZlcihpZHgsIGl0ZW0pXCJcbiAgICAgICAgICAgICAgICAgIChtb3VzZWxlYXZlKT1cIm1vdXNlTGVhdmUoKVwiXG4gICAgICAgICAgICAgICAgICAoY2xpY2spPVwiZ2V0U2NhbGVJdGVtQ2hhbmdlKGlkeCwgaXRlbSlcIlxuICAgICAgICAgICAgICAgICAgW3N0eWxlLndpZHRoLnB4XT1cImRldGFpbHMud2lkdGhcIlxuICAgICAgICAgICAgICAgICAgW3N0eWxlLmhlaWdodC5weF09XCJkZXRhaWxzLmhlaWdodFwiXG4gICAgICAgICAgICAgICAgICBbc3R5bGUubWFyZ2luUmlnaHQucHhdPVwiIWF1dG9NYXJnaW4gPyBtYXJnaW4gOiAnJ1wiXG4gICAgICAgICAgICAgICAgICBbbmdTdHlsZV09XCJ7XG4gICAgICAgICAgICAgICAgICAgICAgJ2JhY2tncm91bmQtY29sb3InOiAoaWR4IDw9IHNob3dTZWxlY3Rpb24pID8gY29sb3JbaWR4XSA6ICdncmV5JyxcbiAgICAgICAgICAgICAgICAgICAgICAnYm9yZGVyLXJhZGl1cyc6IGlkeCA9PT0gMCA/ICc4cHggMCAwIDhweCcgOiBpZHggPT09IGl0ZW1zLmxlbmd0aC0xID8gJzAgOHB4IDhweCAwJyA6ICcnXG4gICAgICAgICAgICAgICAgICB9XCJcbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICAqbmdTd2l0Y2hDYXNlPVwiJ3NpbmdsZV9pY29uJ1wiXG4gICAgICAgICAgICAgICAgICAobW91c2VvdmVyKT1cIm1vdXNlT3ZlcihpZHgsIGl0ZW0pXCJcbiAgICAgICAgICAgICAgICAgIChtb3VzZWxlYXZlKT1cIm1vdXNlTGVhdmUoKVwiXG4gICAgICAgICAgICAgICAgICAoY2xpY2spPVwiZ2V0U2NhbGVJdGVtQ2hhbmdlKGlkeCwgaXRlbSlcIlxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJpbWFnZXNcIlxuICAgICAgICAgICAgICAgICAgICAgIFtzdHlsZS53aWR0aC5weF09XCJkZXRhaWxzLndpZHRoXCJcbiAgICAgICAgICAgICAgICAgICAgICBbc3R5bGUuaGVpZ2h0LnB4XT1cImRldGFpbHMuaGVpZ2h0XCJcbiAgICAgICAgICAgICAgICAgICAgICBbc3R5bGUubWFzay51cmxdPVwiaW1hZ2VzWzBdXCJcbiAgICAgICAgICAgICAgICAgICAgICBbc3R5bGUubWFyZ2luUmlnaHQucHhdPVwiIWF1dG9NYXJnaW4gPyBtYXJnaW4gOiAnJ1wiXG4gICAgICAgICAgICAgICAgICAgICAgc3R5bGU9XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgbWFzay1zaXplOiB7e2RldGFpbHMud2lkdGh9fXB4IHt7ZGV0YWlscy5oZWlnaHR9fXB4O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAtd2Via2l0LW1hc2s6IHVybCh7e2ltYWdlc1swXX19KSBuby1yZXBlYXQgY2VudGVyO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAtd2Via2l0LW1hc2stc2l6ZToge3tkZXRhaWxzLndpZHRofX1weCB7e2RldGFpbHMuaGVpZ2h0fX1weFwiXG4gICAgICAgICAgICAgICAgICAgICAgW25nU3R5bGVdPVwie1xuICAgICAgICAgICAgICAgICAgICAgICAgICAnYmFja2dyb3VuZC1jb2xvcic6IChpZHggPD0gc2hvd1NlbGVjdGlvbikgPyBjb2xvcltpZHhdIDogJ2dyZXknXG4gICAgICAgICAgICAgICAgICAgICAgfVwiXG4gICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgICAgKm5nU3dpdGNoQ2FzZT1cIidtdWx0aXBsZV9pY29ucydcIlxuICAgICAgICAgICAgICAgICAgKG1vdXNlb3Zlcik9XCJtb3VzZU92ZXIoaWR4LCBpdGVtKVwiXG4gICAgICAgICAgICAgICAgICAobW91c2VsZWF2ZSk9XCJtb3VzZUxlYXZlKClcIlxuICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImdldFNjYWxlSXRlbUNoYW5nZShpZHgsIGl0ZW0pXCJcbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiaW1hZ2VzXCJcbiAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiaWR4IDw9IHNob3dTZWxlY3Rpb247IGVsc2UgZmFsc2VJdGVtc1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFtzdHlsZS53aWR0aC5weF09XCJkZXRhaWxzLndpZHRoXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW3N0eWxlLmhlaWdodC5weF09XCJkZXRhaWxzLmhlaWdodFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFtzdHlsZS5iYWNrZ3JvdW5kQ29sb3JdPVwiY29sb3JbaWR4XVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFtzdHlsZS5tYXJnaW5SaWdodC5weF09XCIhYXV0b01hcmdpbiA/IG1hcmdpbiA6ICcnXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGU9XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hc2s6IHVybCh7e2ltYWdlc1swXX19KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hc2stc2l6ZToge3tkZXRhaWxzLndpZHRofX1weCB7e2RldGFpbHMuaGVpZ2h0fX1weDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC13ZWJraXQtbWFzazogdXJsKHt7aW1hZ2VzWzBdfX0pIG5vLXJlcGVhdCBjZW50ZXI7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtd2Via2l0LW1hc2stc2l6ZToge3tkZXRhaWxzLndpZHRofX1weCB7e2RldGFpbHMuaGVpZ2h0fX1weDtcIlxuICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI2ZhbHNlSXRlbXM+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzdHlsZS53aWR0aC5weF09XCJkZXRhaWxzLndpZHRoXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzdHlsZS5oZWlnaHQucHhdPVwiZGV0YWlscy5oZWlnaHRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3N0eWxlLmJhY2tncm91bmRDb2xvcl09XCInZ3JleSdcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3N0eWxlLm1hcmdpblJpZ2h0LnB4XT1cIiFhdXRvTWFyZ2luID8gbWFyZ2luIDogJydcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGU9XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXNrOiB1cmwoe3tpbWFnZXNbMV19fSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFzay1zaXplOiB7e2RldGFpbHMud2lkdGh9fXB4IHt7ZGV0YWlscy5oZWlnaHR9fXB4O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC13ZWJraXQtbWFzazogdXJsKHt7aW1hZ2VzWzFdfX0pIG5vLXJlcGVhdCBjZW50ZXI7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLXdlYmtpdC1tYXNrLXNpemU6IHt7ZGV0YWlscy53aWR0aH19cHgge3tkZXRhaWxzLmhlaWdodH19cHg7XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjbm9Ub29sdGlwPlxuICAgICAgICAgICAgPGRpdiBbbmdTd2l0Y2hdPVwidGhlbWVcIj5cbiAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgICAgKm5nU3dpdGNoQ2FzZT1cIidzcXVhcmVzJ1wiXG4gICAgICAgICAgICAgICAgICAobW91c2VvdmVyKT1cIm1vdXNlT3ZlcihpZHgsIGl0ZW0pXCJcbiAgICAgICAgICAgICAgICAgIChtb3VzZWxlYXZlKT1cIm1vdXNlTGVhdmUoKVwiXG4gICAgICAgICAgICAgICAgICAoY2xpY2spPVwiZ2V0U2NhbGVJdGVtQ2hhbmdlKGlkeCwgaXRlbSlcIlxuICAgICAgICAgICAgICAgICAgW3N0eWxlLndpZHRoLnB4XT1cImRldGFpbHMud2lkdGhcIlxuICAgICAgICAgICAgICAgICAgW3N0eWxlLmhlaWdodC5weF09XCJkZXRhaWxzLmhlaWdodFwiXG4gICAgICAgICAgICAgICAgICBbc3R5bGUubWFyZ2luUmlnaHQucHhdPVwiIWF1dG9NYXJnaW4gPyBtYXJnaW4gOiAnJ1wiXG4gICAgICAgICAgICAgICAgICBbbmdTdHlsZV09XCJ7XG4gICAgICAgICAgICAgICAgICAgICAgJ2JhY2tncm91bmQtY29sb3InOiAoaWR4IDw9IHNob3dTZWxlY3Rpb24pID8gY29sb3JbaWR4XSA6ICdncmV5J1xuICAgICAgICAgICAgICAgICAgfVwiXG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICAgICpuZ1N3aXRjaENhc2U9XCIncm91bmRlZF9zcXVhcmVzJ1wiXG4gICAgICAgICAgICAgICAgICAobW91c2VvdmVyKT1cIm1vdXNlT3ZlcihpZHgsIGl0ZW0pXCJcbiAgICAgICAgICAgICAgICAgIChtb3VzZWxlYXZlKT1cIm1vdXNlTGVhdmUoKVwiXG4gICAgICAgICAgICAgICAgICAoY2xpY2spPVwiZ2V0U2NhbGVJdGVtQ2hhbmdlKGlkeCwgaXRlbSlcIlxuICAgICAgICAgICAgICAgICAgW3N0eWxlLndpZHRoLnB4XT1cImRldGFpbHMud2lkdGhcIlxuICAgICAgICAgICAgICAgICAgW3N0eWxlLmhlaWdodC5weF09XCJkZXRhaWxzLmhlaWdodFwiXG4gICAgICAgICAgICAgICAgICBbc3R5bGUubWFyZ2luUmlnaHQucHhdPVwiIWF1dG9NYXJnaW4gPyBtYXJnaW4gOiAnJ1wiXG4gICAgICAgICAgICAgICAgICBbbmdTdHlsZV09XCJ7XG4gICAgICAgICAgICAgICAgICAgICAgJ2JhY2tncm91bmQtY29sb3InOiAoaWR4IDw9IHNob3dTZWxlY3Rpb24pID8gY29sb3JbaWR4XSA6ICdncmV5JyxcbiAgICAgICAgICAgICAgICAgICAgICAnYm9yZGVyLXJhZGl1cyc6IGlkeCA9PT0gMCA/ICc4cHggMCAwIDhweCcgOiBpZHggPT09IGl0ZW1zLmxlbmd0aC0xID8gJzAgOHB4IDhweCAwJyA6ICcnXG4gICAgICAgICAgICAgICAgICB9XCJcbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICAqbmdTd2l0Y2hDYXNlPVwiJ3NpbmdsZV9pY29uJ1wiXG4gICAgICAgICAgICAgICAgICAobW91c2VvdmVyKT1cIm1vdXNlT3ZlcihpZHgsIGl0ZW0pXCJcbiAgICAgICAgICAgICAgICAgIChtb3VzZWxlYXZlKT1cIm1vdXNlTGVhdmUoKVwiXG4gICAgICAgICAgICAgICAgICAoY2xpY2spPVwiZ2V0U2NhbGVJdGVtQ2hhbmdlKGlkeCwgaXRlbSlcIlxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJpbWFnZXNcIlxuICAgICAgICAgICAgICAgICAgICAgIFtzdHlsZS53aWR0aC5weF09XCJkZXRhaWxzLndpZHRoXCJcbiAgICAgICAgICAgICAgICAgICAgICBbc3R5bGUuaGVpZ2h0LnB4XT1cImRldGFpbHMuaGVpZ2h0XCJcbiAgICAgICAgICAgICAgICAgICAgICBbc3R5bGUubWFzay51cmxdPVwiaW1hZ2VzWzBdXCJcbiAgICAgICAgICAgICAgICAgICAgICBbc3R5bGUubWFyZ2luUmlnaHQucHhdPVwiIWF1dG9NYXJnaW4gPyBtYXJnaW4gOiAnJ1wiXG4gICAgICAgICAgICAgICAgICAgICAgc3R5bGU9XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgbWFzay1zaXplOiB7e2RldGFpbHMud2lkdGh9fXB4IHt7ZGV0YWlscy5oZWlnaHR9fXB4O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAtd2Via2l0LW1hc2s6IHVybCh7e2ltYWdlc1swXX19KSBuby1yZXBlYXQgY2VudGVyO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAtd2Via2l0LW1hc2stc2l6ZToge3tkZXRhaWxzLndpZHRofX1weCB7e2RldGFpbHMuaGVpZ2h0fX1weFwiXG4gICAgICAgICAgICAgICAgICAgICAgW25nU3R5bGVdPVwie1xuICAgICAgICAgICAgICAgICAgICAgICAgICAnYmFja2dyb3VuZC1jb2xvcic6IChpZHggPD0gc2hvd1NlbGVjdGlvbikgPyBjb2xvcltpZHhdIDogJ2dyZXknXG4gICAgICAgICAgICAgICAgICAgICAgfVwiXG4gICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgICAgKm5nU3dpdGNoQ2FzZT1cIidtdWx0aXBsZV9pY29ucydcIlxuICAgICAgICAgICAgICAgICAgKG1vdXNlb3Zlcik9XCJtb3VzZU92ZXIoaWR4LCBpdGVtKVwiXG4gICAgICAgICAgICAgICAgICAobW91c2VsZWF2ZSk9XCJtb3VzZUxlYXZlKClcIlxuICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImdldFNjYWxlSXRlbUNoYW5nZShpZHgsIGl0ZW0pXCJcbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiaW1hZ2VzXCJcbiAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiaWR4IDw9IHNob3dTZWxlY3Rpb247IGVsc2UgZmFsc2VJdGVtc1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFtzdHlsZS53aWR0aC5weF09XCJkZXRhaWxzLndpZHRoXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW3N0eWxlLmhlaWdodC5weF09XCJkZXRhaWxzLmhlaWdodFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFtzdHlsZS5iYWNrZ3JvdW5kQ29sb3JdPVwiY29sb3JbaWR4XVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFtzdHlsZS5tYXJnaW5SaWdodC5weF09XCIhYXV0b01hcmdpbiA/IG1hcmdpbiA6ICcnXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGU9XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hc2s6IHVybCh7e2ltYWdlc1swXX19KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hc2stc2l6ZToge3tkZXRhaWxzLndpZHRofX1weCB7e2RldGFpbHMuaGVpZ2h0fX1weDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC13ZWJraXQtbWFzazogdXJsKHt7aW1hZ2VzWzBdfX0pIG5vLXJlcGVhdCBjZW50ZXI7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtd2Via2l0LW1hc2stc2l6ZToge3tkZXRhaWxzLndpZHRofX1weCB7e2RldGFpbHMuaGVpZ2h0fX1weDtcIlxuICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI2ZhbHNlSXRlbXM+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzdHlsZS53aWR0aC5weF09XCJkZXRhaWxzLndpZHRoXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzdHlsZS5oZWlnaHQucHhdPVwiZGV0YWlscy5oZWlnaHRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3N0eWxlLmJhY2tncm91bmRDb2xvcl09XCInZ3JleSdcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3N0eWxlLm1hcmdpblJpZ2h0LnB4XT1cIiFhdXRvTWFyZ2luID8gbWFyZ2luIDogJydcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGU9XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXNrOiB1cmwoe3tpbWFnZXNbMV19fSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFzay1zaXplOiB7e2RldGFpbHMud2lkdGh9fXB4IHt7ZGV0YWlscy5oZWlnaHR9fXB4O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC13ZWJraXQtbWFzazogdXJsKHt7aW1hZ2VzWzFdfX0pIG5vLXJlcGVhdCBjZW50ZXI7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLXdlYmtpdC1tYXNrLXNpemU6IHt7ZGV0YWlscy53aWR0aH19cHgge3tkZXRhaWxzLmhlaWdodH19cHg7XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgPC9kaXY+XG48L2Rpdj5cbiJdfQ==