UNPKG

ng-zorro-antd-mobile

Version:

An enterprise-class mobile UI components based on Ant Design and Angular

292 lines 36.4 kB
import { Component, Input, Output, EventEmitter, ElementRef, HostBinding, forwardRef } from '@angular/core'; import { NG_VALUE_ACCESSOR } from '@angular/forms'; import * as i0 from "@angular/core"; import * as i1 from "@angular/common"; import * as i2 from "ng-zorro-antd-mobile/slider"; export class RangeComponent { get min() { return this._min; } set min(value) { this._min = value; } get max() { return this._max; } set max(value) { this._max = value; } get step() { return this._step; } set step(value) { this._step = value; } get value() { return this._value; } set value(value) { this.setValue(value); } set defaultValue(value) { this._defaultValue = value; this._value = this._defaultValue; this.setValue(value); } get disabled() { return this._disabled; } set disabled(value) { this._disabled = value; } get marks() { return this._marks; } set marks(value) { this._marks = value; } get dots() { return this._dots; } set dots(value) { this._dots = value; } get included() { return this._included; } set included(value) { this._included = value; } set count(value) { this._count = value; } set allowCross(value) { this._allowCross = value; this.setValueBound(); } set pushable(value) { this._pushable = value; if (this.verifyPushable()) { this.setValueBound(); } } get handleStyle() { return this._handleStyle; } set handleStyle(value) { this._handleStyle = value; } get trackStyle() { return this._trackStyle; } set trackStyle(value) { this._trackStyle = value; } get railStyle() { return this._railStyle; } set railStyle(value) { this._railStyle = value; } constructor(_elf) { this._elf = _elf; this.prefixCls = 'am-slider'; this.offset = []; this.length = []; this._min = 0; this._max = 100; this._step = 1; this._defaultValue = [0, 0, 0]; this._disabled = false; this._marks = {}; this._dots = false; this._included = true; this._count = 1; this._allowCross = true; this._handleStyle = []; this._trackStyle = []; this.onChange = new EventEmitter(); this.onAfterChange = new EventEmitter(); this.amWrapper = true; this._ngModelOnChange = () => { }; this._ngModelOnTouched = () => { }; } setCls() { this.sliderCls = { [`${this.prefixCls}-disabled`]: this._disabled }; } initialValue() { const minTemp = this._min; if (!this.verifyPushable()) { this._pushable = 0; console.warn('pushable设置无效,已大于有些value间隔,被强制设为0'); } const initialValue = Array.apply(null, Array(this._count + 1)).map(function () { return minTemp; }); this._defaultValue = this._defaultValue !== undefined ? this._defaultValue : initialValue; this._value = this._value !== undefined ? this._value : this._defaultValue; // 验证count值 this._count = this._value.length - 1; // 验证value区间 for (let i = 0; i < this._value.length; i++) { if (this._value[i] < this._min) { this._value[i] = this._min; } else if (this._value[i] > this._max) { this._value[i] = this._max; } } if (this._count > 0) { this.upperBound = Math.max(...this._value); this.lowerBound = Math.min(...this._value); } } handleChange(e, i) { let temp = [...this._value]; temp[i] = e; this.upperBound = Math.max(...temp); this.lowerBound = Math.min(...temp); this.setTrackStyle(temp); this.onChange.emit(temp); } handleAfterChange(e, i) { setTimeout(() => { this._value[i] = e; this.upperBound = Math.max(...this._value); this.lowerBound = Math.min(...this._value); this.setTrackStyle(this._value); this.onAfterChange.emit(this._value); this._ngModelOnChange(this._value); this.setValueBound(); }, 0); } setTrackStyle(value) { if (value && value.length === this._count + 1) { value.sort((a, b) => a - b); for (let i = 0; i < this._count; i++) { this.offset[i] = (value[i] * 100) / (this._max - this._min); this.length[i] = ((value[i + 1] - value[i]) * 100) / (this._max - this._min); } } } setValueBound() { this.maxBound = []; this.minBound = []; if ((this._allowCross && this._pushable === undefined) || this._handleCount <= 1) { for (let i = 0; i < this._handleCount; i++) { this.maxBound[i] = this._max; this.minBound[i] = this._min; } } else { if (this._pushable === undefined) { this._pushable = 0; } for (let i = 0; i < this._handleCount; i++) { this.maxBound[i] = i === this._handleCount - 1 ? this._max : this._value[i + 1] - this._pushable; this.minBound[i] = i === 0 ? this._min : this._value[i - 1] + this._pushable; } } } verifyPushable() { for (let i = 1; i < this._handleCount; i++) { const diff = this._value[i] - this._value[i - 1]; if (diff < this._pushable) { return false; } } return true; } writeValue(value) { this.setValue(value, true); } setValue(value, isWriteValue = false) { if (value) { this._value = value; this._handleCount = this._value.length + 1; this.initialValue(); this.setValueBound(); this.setCls(); this.setTrackStyle(this._value); if (isWriteValue) { this._ngModelOnChange(this._value); } else { this.onAfterChange.emit(this._value); } } } registerOnChange(fn) { this._ngModelOnChange = fn; } registerOnTouched(fn) { this._ngModelOnTouched = fn; } ngOnInit() { this.initialValue(); this.setValueBound(); this._handleCount = this._count + 1; this.setCls(); const sliderCoords = this._elf.nativeElement.getElementsByClassName('am-slider')[0].getBoundingClientRect(); this.sliderLength = sliderCoords.width; this.sliderStart = sliderCoords.left; } static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.0.8", ngImport: i0, type: RangeComponent, deps: [{ token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Component }); } static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.0.8", type: RangeComponent, selector: "Range , nzm-range", inputs: { min: "min", max: "max", step: "step", value: "value", defaultValue: "defaultValue", disabled: "disabled", marks: "marks", dots: "dots", included: "included", count: "count", allowCross: "allowCross", pushable: "pushable", handleStyle: "handleStyle", trackStyle: "trackStyle", railStyle: "railStyle" }, outputs: { onChange: "onChange", onAfterChange: "onAfterChange" }, host: { properties: { "class.am-slider-wrapper": "this.amWrapper" } }, providers: [ { provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => RangeComponent), multi: true } ], ngImport: i0, template: "<div class=\"am-slider\" [ngClass]=\"sliderCls\">\n <div class=\"am-slider-rail\" [ngStyle]=\"railStyle\"></div>\n <SliderTrack\n *ngFor=\"let off of offset; let i = index\"\n [className]=\"'am-slider-track'\"\n [included]=\"included\"\n [style]=\"trackStyle[i]\"\n [offset]=\"off\"\n [length]=\"length[i]\"\n ></SliderTrack>\n <SliderSteps\n [max]=\"max\"\n [min]=\"min\"\n [dots]=\"dots\"\n [step]=\"step\"\n [marks]=\"marks\"\n [upperBound]=\"upperBound\"\n [lowerBound]=\"lowerBound\"\n ></SliderSteps>\n <SliderHandle\n *ngFor=\"let val of value; let i = index\"\n [max]=\"max\"\n [min]=\"min\"\n [maxBound]=\"maxBound[i]\"\n [minBound]=\"minBound[i]\"\n [value]=\"val\"\n [step]=\"step\"\n [disabled]=\"disabled\"\n [sliderLength]=\"sliderLength\"\n [sliderStart]=\"sliderStart\"\n [handleStyle]=\"handleStyle[i]\"\n (onChange)=\"handleChange($event, i)\"\n (onAfterChange)=\"handleAfterChange($event, i)\"\n ></SliderHandle>\n <SliderMarks\n [max]=\"max\"\n [min]=\"min\"\n [marks]=\"marks\"\n [upperBound]=\"upperBound\"\n [lowerBound]=\"lowerBound\"\n ></SliderMarks>\n</div>\n", dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "component", type: i2.SliderHandleComponent, selector: "SliderHandle, nzm-slider-handle", inputs: ["min", "max", "minBound", "maxBound", "step", "value", "disabled", "sliderLength", "sliderStart", "handleStyle"], outputs: ["onChange", "onAfterChange"] }, { kind: "component", type: i2.SliderMarksComponent, selector: "SliderMarks, nzm-slider-marks", inputs: ["min", "max", "marks", "included", "upperBound", "lowerBound"], outputs: ["onChange", "onAfterChange"] }, { kind: "component", type: i2.SliderStepsComponent, selector: "SliderSteps, nzm-slider-steps", inputs: ["min", "max", "marks", "step", "included", "dots", "upperBound", "lowerBound"] }, { kind: "component", type: i2.SliderTrackComponent, selector: "SliderTrack, nzm-slider-track", inputs: ["className", "included", "offset", "length", "style"] }] }); } } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.0.8", ngImport: i0, type: RangeComponent, decorators: [{ type: Component, args: [{ selector: 'Range , nzm-range', providers: [ { provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => RangeComponent), multi: true } ], template: "<div class=\"am-slider\" [ngClass]=\"sliderCls\">\n <div class=\"am-slider-rail\" [ngStyle]=\"railStyle\"></div>\n <SliderTrack\n *ngFor=\"let off of offset; let i = index\"\n [className]=\"'am-slider-track'\"\n [included]=\"included\"\n [style]=\"trackStyle[i]\"\n [offset]=\"off\"\n [length]=\"length[i]\"\n ></SliderTrack>\n <SliderSteps\n [max]=\"max\"\n [min]=\"min\"\n [dots]=\"dots\"\n [step]=\"step\"\n [marks]=\"marks\"\n [upperBound]=\"upperBound\"\n [lowerBound]=\"lowerBound\"\n ></SliderSteps>\n <SliderHandle\n *ngFor=\"let val of value; let i = index\"\n [max]=\"max\"\n [min]=\"min\"\n [maxBound]=\"maxBound[i]\"\n [minBound]=\"minBound[i]\"\n [value]=\"val\"\n [step]=\"step\"\n [disabled]=\"disabled\"\n [sliderLength]=\"sliderLength\"\n [sliderStart]=\"sliderStart\"\n [handleStyle]=\"handleStyle[i]\"\n (onChange)=\"handleChange($event, i)\"\n (onAfterChange)=\"handleAfterChange($event, i)\"\n ></SliderHandle>\n <SliderMarks\n [max]=\"max\"\n [min]=\"min\"\n [marks]=\"marks\"\n [upperBound]=\"upperBound\"\n [lowerBound]=\"lowerBound\"\n ></SliderMarks>\n</div>\n" }] }], ctorParameters: () => [{ type: i0.ElementRef }], propDecorators: { min: [{ type: Input }], max: [{ type: Input }], step: [{ type: Input }], value: [{ type: Input }], defaultValue: [{ type: Input }], disabled: [{ type: Input }], marks: [{ type: Input }], dots: [{ type: Input }], included: [{ type: Input }], count: [{ type: Input }], allowCross: [{ type: Input }], pushable: [{ type: Input }], handleStyle: [{ type: Input }], trackStyle: [{ type: Input }], railStyle: [{ type: Input }], onChange: [{ type: Output }], onAfterChange: [{ type: Output }], amWrapper: [{ type: HostBinding, args: ['class.am-slider-wrapper'] }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmFuZ2UuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vY29tcG9uZW50cy9yYW5nZS9yYW5nZS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi9jb21wb25lbnRzL3JhbmdlL3JhbmdlLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQVUsS0FBSyxFQUFFLE1BQU0sRUFBRSxZQUFZLEVBQUUsVUFBVSxFQUFFLFdBQVcsRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDcEgsT0FBTyxFQUF3QixpQkFBaUIsRUFBRSxNQUFNLGdCQUFnQixDQUFDOzs7O0FBYXpFLE1BQU0sT0FBTyxjQUFjO0lBNkJ6QixJQUNJLEdBQUc7UUFDTCxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUM7SUFDbkIsQ0FBQztJQUNELElBQUksR0FBRyxDQUFDLEtBQWE7UUFDbkIsSUFBSSxDQUFDLElBQUksR0FBRyxLQUFLLENBQUM7SUFDcEIsQ0FBQztJQUNELElBQ0ksR0FBRztRQUNMLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQztJQUNuQixDQUFDO0lBQ0QsSUFBSSxHQUFHLENBQUMsS0FBYTtRQUNuQixJQUFJLENBQUMsSUFBSSxHQUFHLEtBQUssQ0FBQztJQUNwQixDQUFDO0lBQ0QsSUFDSSxJQUFJO1FBQ04sT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDO0lBQ3BCLENBQUM7SUFDRCxJQUFJLElBQUksQ0FBQyxLQUFhO1FBQ3BCLElBQUksQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDO0lBQ3JCLENBQUM7SUFDRCxJQUNJLEtBQUs7UUFDUCxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUM7SUFDckIsQ0FBQztJQUNELElBQUksS0FBSyxDQUFDLEtBQWU7UUFDdkIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUN2QixDQUFDO0lBQ0QsSUFDSSxZQUFZLENBQUMsS0FBSztRQUNwQixJQUFJLENBQUMsYUFBYSxHQUFHLEtBQUssQ0FBQztRQUMzQixJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUM7UUFDakMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUN2QixDQUFDO0lBQ0QsSUFDSSxRQUFRO1FBQ1YsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDO0lBQ3hCLENBQUM7SUFDRCxJQUFJLFFBQVEsQ0FBQyxLQUFjO1FBQ3pCLElBQUksQ0FBQyxTQUFTLEdBQUcsS0FBSyxDQUFDO0lBQ3pCLENBQUM7SUFDRCxJQUNJLEtBQUs7UUFDUCxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUM7SUFDckIsQ0FBQztJQUNELElBQUksS0FBSyxDQUFDLEtBQWE7UUFDckIsSUFBSSxDQUFDLE1BQU0sR0FBRyxLQUFLLENBQUM7SUFDdEIsQ0FBQztJQUNELElBQ0ksSUFBSTtRQUNOLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQztJQUNwQixDQUFDO0lBQ0QsSUFBSSxJQUFJLENBQUMsS0FBYztRQUNyQixJQUFJLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQztJQUNyQixDQUFDO0lBQ0QsSUFDSSxRQUFRO1FBQ1YsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDO0lBQ3hCLENBQUM7SUFDRCxJQUFJLFFBQVEsQ0FBQyxLQUFjO1FBQ3pCLElBQUksQ0FBQyxTQUFTLEdBQUcsS0FBSyxDQUFDO0lBQ3pCLENBQUM7SUFDRCxJQUNJLEtBQUssQ0FBQyxLQUFhO1FBQ3JCLElBQUksQ0FBQyxNQUFNLEdBQUcsS0FBSyxDQUFDO0lBQ3RCLENBQUM7SUFDRCxJQUNJLFVBQVUsQ0FBQyxLQUFjO1FBQzNCLElBQUksQ0FBQyxXQUFXLEdBQUcsS0FBSyxDQUFDO1FBQ3pCLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztJQUN2QixDQUFDO0lBQ0QsSUFDSSxRQUFRLENBQUMsS0FBYTtRQUN4QixJQUFJLENBQUMsU0FBUyxHQUFHLEtBQUssQ0FBQztRQUN2QixJQUFJLElBQUksQ0FBQyxjQUFjLEVBQUUsRUFBRTtZQUN6QixJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7U0FDdEI7SUFDSCxDQUFDO0lBQ0QsSUFDSSxXQUFXO1FBQ2IsT0FBTyxJQUFJLENBQUMsWUFBWSxDQUFDO0lBQzNCLENBQUM7SUFDRCxJQUFJLFdBQVcsQ0FBQyxLQUFZO1FBQzFCLElBQUksQ0FBQyxZQUFZLEdBQUcsS0FBSyxDQUFDO0lBQzVCLENBQUM7SUFDRCxJQUNJLFVBQVU7UUFDWixPQUFPLElBQUksQ0FBQyxXQUFXLENBQUM7SUFDMUIsQ0FBQztJQUNELElBQUksVUFBVSxDQUFDLEtBQVk7UUFDekIsSUFBSSxDQUFDLFdBQVcsR0FBRyxLQUFLLENBQUM7SUFDM0IsQ0FBQztJQUNELElBQ0ksU0FBUztRQUNYLE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQztJQUN6QixDQUFDO0lBQ0QsSUFBSSxTQUFTLENBQUMsS0FBWTtRQUN4QixJQUFJLENBQUMsVUFBVSxHQUFHLEtBQUssQ0FBQztJQUMxQixDQUFDO0lBWUQsWUFBb0IsSUFBZ0I7UUFBaEIsU0FBSSxHQUFKLElBQUksQ0FBWTtRQTFJcEMsY0FBUyxHQUFXLFdBQVcsQ0FBQztRQUNoQyxXQUFNLEdBQVUsRUFBRSxDQUFDO1FBQ25CLFdBQU0sR0FBVSxFQUFFLENBQUM7UUFTWCxTQUFJLEdBQUcsQ0FBQyxDQUFDO1FBQ1QsU0FBSSxHQUFHLEdBQUcsQ0FBQztRQUNYLFVBQUssR0FBRyxDQUFDLENBQUM7UUFFVixrQkFBYSxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUMxQixjQUFTLEdBQUcsS0FBSyxDQUFDO1FBQ2xCLFdBQU0sR0FBRyxFQUFFLENBQUM7UUFDWixVQUFLLEdBQUcsS0FBSyxDQUFDO1FBQ2QsY0FBUyxHQUFHLElBQUksQ0FBQztRQUNqQixXQUFNLEdBQUcsQ0FBQyxDQUFDO1FBQ1gsZ0JBQVcsR0FBRyxJQUFJLENBQUM7UUFFbkIsaUJBQVksR0FBRyxFQUFFLENBQUM7UUFDbEIsZ0JBQVcsR0FBRyxFQUFFLENBQUM7UUF3R3pCLGFBQVEsR0FBRyxJQUFJLFlBQVksRUFBTyxDQUFDO1FBRW5DLGtCQUFhLEdBQUcsSUFBSSxZQUFZLEVBQU8sQ0FBQztRQUd4QyxjQUFTLEdBQVksSUFBSSxDQUFDO1FBRWxCLHFCQUFnQixHQUE4QixHQUFHLEVBQUUsR0FBRSxDQUFDLENBQUM7UUFDdkQsc0JBQWlCLEdBQTRCLEdBQUcsRUFBRSxHQUFFLENBQUMsQ0FBQztJQUV2QixDQUFDO0lBRXhDLE1BQU07UUFDSixJQUFJLENBQUMsU0FBUyxHQUFHO1lBQ2YsQ0FBQyxHQUFHLElBQUksQ0FBQyxTQUFTLFdBQVcsQ0FBQyxFQUFFLElBQUksQ0FBQyxTQUFTO1NBQy9DLENBQUM7SUFDSixDQUFDO0lBRUQsWUFBWTtRQUNWLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUM7UUFDMUIsSUFBSSxDQUFDLElBQUksQ0FBQyxjQUFjLEVBQUUsRUFBRTtZQUMxQixJQUFJLENBQUMsU0FBUyxHQUFHLENBQUMsQ0FBQztZQUNuQixPQUFPLENBQUMsSUFBSSxDQUFDLGtDQUFrQyxDQUFDLENBQUM7U0FDbEQ7UUFDRCxNQUFNLFlBQVksR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxLQUFLLENBQUMsSUFBSSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQztZQUNqRSxPQUFPLE9BQU8sQ0FBQztRQUNqQixDQUFDLENBQUMsQ0FBQztRQUNILElBQUksQ0FBQyxhQUFhLEdBQUcsSUFBSSxDQUFDLGFBQWEsS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQztRQUMxRixJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxNQUFNLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDO1FBQzNFLFdBQVc7UUFDWCxJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQztRQUNyQyxZQUFZO1FBQ1osS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO1lBQzNDLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsSUFBSSxFQUFFO2dCQUM5QixJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUM7YUFDNUI7aUJBQU0sSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxJQUFJLEVBQUU7Z0JBQ3JDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQzthQUM1QjtTQUNGO1FBQ0QsSUFBSSxJQUFJLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtZQUNuQixJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDM0MsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1NBQzVDO0lBQ0gsQ0FBQztJQUVELFlBQVksQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUNmLElBQUksSUFBSSxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDNUIsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNaLElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDO1FBQ3BDLElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDO1FBQ3BDLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDekIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDM0IsQ0FBQztJQUVELGlCQUFpQixDQUFDLENBQUMsRUFBRSxDQUFDO1FBQ3BCLFVBQVUsQ0FBQyxHQUFHLEVBQUU7WUFDZCxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUNuQixJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDM0MsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQzNDLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQ2hDLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUNyQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQ25DLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztRQUN2QixDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDUixDQUFDO0lBRUQsYUFBYSxDQUFDLEtBQUs7UUFDakIsSUFBSSxLQUFLLElBQUksS0FBSyxDQUFDLE1BQU0sS0FBSyxJQUFJLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtZQUM3QyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO1lBQzVCLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO2dCQUNwQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7Z0JBQzVELElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQzthQUM5RTtTQUNGO0lBQ0gsQ0FBQztJQUVELGFBQWE7UUFDWCxJQUFJLENBQUMsUUFBUSxHQUFHLEVBQUUsQ0FBQztRQUNuQixJQUFJLENBQUMsUUFBUSxHQUFHLEVBQUUsQ0FBQztRQUNuQixJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsSUFBSSxJQUFJLENBQUMsU0FBUyxLQUFLLFNBQVMsQ0FBQyxJQUFJLElBQUksQ0FBQyxZQUFZLElBQUksQ0FBQyxFQUFFO1lBQ2hGLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUMsRUFBRSxFQUFFO2dCQUMxQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUM7Z0JBQzdCLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQzthQUM5QjtTQUNGO2FBQU07WUFDTCxJQUFJLElBQUksQ0FBQyxTQUFTLEtBQUssU0FBUyxFQUFFO2dCQUNoQyxJQUFJLENBQUMsU0FBUyxHQUFHLENBQUMsQ0FBQzthQUNwQjtZQUNELEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUMsRUFBRSxFQUFFO2dCQUMxQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsS0FBSyxJQUFJLENBQUMsWUFBWSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQztnQkFDakcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDO2FBQzlFO1NBQ0Y7SUFDSCxDQUFDO0lBRUQsY0FBYztRQUNaLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUMsRUFBRSxFQUFFO1lBQzFDLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7WUFDakQsSUFBSSxJQUFJLEdBQUcsSUFBSSxDQUFDLFNBQVMsRUFBRTtnQkFDekIsT0FBTyxLQUFLLENBQUM7YUFDZDtTQUNGO1FBQ0QsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRUQsVUFBVSxDQUFDLEtBQWU7UUFDeEIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDN0IsQ0FBQztJQUVELFFBQVEsQ0FBQyxLQUFlLEVBQUUsWUFBWSxHQUFHLEtBQUs7UUFDNUMsSUFBSSxLQUFLLEVBQUU7WUFDVCxJQUFJLENBQUMsTUFBTSxHQUFHLEtBQUssQ0FBQztZQUNwQixJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQztZQUMzQyxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7WUFDcEIsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO1lBQ3JCLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUNkLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQ2hDLElBQUksWUFBWSxFQUFFO2dCQUNoQixJQUFJLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO2FBQ3BDO2lCQUFNO2dCQUNMLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQzthQUN0QztTQUNGO0lBQ0gsQ0FBQztJQUVELGdCQUFnQixDQUFDLEVBQTZCO1FBQzVDLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxFQUFFLENBQUM7SUFDN0IsQ0FBQztJQUVELGlCQUFpQixDQUFDLEVBQTJCO1FBQzNDLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxFQUFFLENBQUM7SUFDOUIsQ0FBQztJQUVELFFBQVE7UUFDTixJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7UUFDcEIsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO1FBQ3JCLElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUM7UUFDcEMsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBQ2QsTUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsc0JBQXNCLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMscUJBQXFCLEVBQUUsQ0FBQztRQUM1RyxJQUFJLENBQUMsWUFBWSxHQUFHLFlBQVksQ0FBQyxLQUFLLENBQUM7UUFDdkMsSUFBSSxDQUFDLFdBQVcsR0FBRyxZQUFZLENBQUMsSUFBSSxDQUFDO0lBQ3ZDLENBQUM7OEdBOVFVLGNBQWM7a0dBQWQsY0FBYyw4ZUFSZDtZQUNUO2dCQUNFLE9BQU8sRUFBRSxpQkFBaUI7Z0JBQzFCLFdBQVcsRUFBRSxVQUFVLENBQUMsR0FBRyxFQUFFLENBQUMsY0FBYyxDQUFDO2dCQUM3QyxLQUFLLEVBQUUsSUFBSTthQUNaO1NBQ0YsMEJDWkgsc3FDQTBDQTs7MkZENUJhLGNBQWM7a0JBWDFCLFNBQVM7K0JBQ0UsbUJBQW1CLGFBRWxCO3dCQUNUOzRCQUNFLE9BQU8sRUFBRSxpQkFBaUI7NEJBQzFCLFdBQVcsRUFBRSxVQUFVLENBQUMsR0FBRyxFQUFFLGVBQWUsQ0FBQzs0QkFDN0MsS0FBSyxFQUFFLElBQUk7eUJBQ1o7cUJBQ0Y7K0VBZ0NHLEdBQUc7c0JBRE4sS0FBSztnQkFRRixHQUFHO3NCQUROLEtBQUs7Z0JBUUYsSUFBSTtzQkFEUCxLQUFLO2dCQVFGLEtBQUs7c0JBRFIsS0FBSztnQkFRRixZQUFZO3NCQURmLEtBQUs7Z0JBT0YsUUFBUTtzQkFEWCxLQUFLO2dCQVFGLEtBQUs7c0JBRFIsS0FBSztnQkFRRixJQUFJO3NCQURQLEtBQUs7Z0JBUUYsUUFBUTtzQkFEWCxLQUFLO2dCQVFGLEtBQUs7c0JBRFIsS0FBSztnQkFLRixVQUFVO3NCQURiLEtBQUs7Z0JBTUYsUUFBUTtzQkFEWCxLQUFLO2dCQVFGLFdBQVc7c0JBRGQsS0FBSztnQkFRRixVQUFVO3NCQURiLEtBQUs7Z0JBUUYsU0FBUztzQkFEWixLQUFLO2dCQVFOLFFBQVE7c0JBRFAsTUFBTTtnQkFHUCxhQUFhO3NCQURaLE1BQU07Z0JBSVAsU0FBUztzQkFEUixXQUFXO3VCQUFDLHlCQUF5QiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgT25Jbml0LCBJbnB1dCwgT3V0cHV0LCBFdmVudEVtaXR0ZXIsIEVsZW1lbnRSZWYsIEhvc3RCaW5kaW5nLCBmb3J3YXJkUmVmIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBDb250cm9sVmFsdWVBY2Nlc3NvciwgTkdfVkFMVUVfQUNDRVNTT1IgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ1JhbmdlICwgbnptLXJhbmdlJyxcbiAgdGVtcGxhdGVVcmw6ICcuL3JhbmdlLmNvbXBvbmVudC5odG1sJyxcbiAgcHJvdmlkZXJzOiBbXG4gICAge1xuICAgICAgcHJvdmlkZTogTkdfVkFMVUVfQUNDRVNTT1IsXG4gICAgICB1c2VFeGlzdGluZzogZm9yd2FyZFJlZigoKSA9PiBSYW5nZUNvbXBvbmVudCksXG4gICAgICBtdWx0aTogdHJ1ZVxuICAgIH1cbiAgXVxufSlcbmV4cG9ydCBjbGFzcyBSYW5nZUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgQ29udHJvbFZhbHVlQWNjZXNzb3Ige1xuICBwcmVmaXhDbHM6IHN0cmluZyA9ICdhbS1zbGlkZXInO1xuICBvZmZzZXQ6IGFueVtdID0gW107XG4gIGxlbmd0aDogYW55W10gPSBbXTtcbiAgdXBwZXJCb3VuZDogbnVtYmVyO1xuICBsb3dlckJvdW5kOiBudW1iZXI7XG4gIG1heEJvdW5kOiBudW1iZXJbXTtcbiAgbWluQm91bmQ6IG51bWJlcltdO1xuICBzbGlkZXJDbHM6IG9iamVjdDtcbiAgc2xpZGVyTGVuZ3RoOiBudW1iZXI7XG4gIHNsaWRlclN0YXJ0OiBudW1iZXI7XG5cbiAgcHJpdmF0ZSBfbWluID0gMDtcbiAgcHJpdmF0ZSBfbWF4ID0gMTAwO1xuICBwcml2YXRlIF9zdGVwID0gMTtcbiAgcHJpdmF0ZSBfdmFsdWU7XG4gIHByaXZhdGUgX2RlZmF1bHRWYWx1ZSA9IFswLCAwLCAwXTtcbiAgcHJpdmF0ZSBfZGlzYWJsZWQgPSBmYWxzZTtcbiAgcHJpdmF0ZSBfbWFya3MgPSB7fTtcbiAgcHJpdmF0ZSBfZG90cyA9IGZhbHNlO1xuICBwcml2YXRlIF9pbmNsdWRlZCA9IHRydWU7XG4gIHByaXZhdGUgX2NvdW50ID0gMTtcbiAgcHJpdmF0ZSBfYWxsb3dDcm9zcyA9IHRydWU7XG4gIHByaXZhdGUgX3B1c2hhYmxlO1xuICBwcml2YXRlIF9oYW5kbGVTdHlsZSA9IFtdO1xuICBwcml2YXRlIF90cmFja1N0eWxlID0gW107XG4gIHByaXZhdGUgX3JhaWxTdHlsZTtcbiAgcHJpdmF0ZSBfaGFuZGxlQ291bnQ7XG5cbiAgQElucHV0KClcbiAgZ2V0IG1pbigpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLl9taW47XG4gIH1cbiAgc2V0IG1pbih2YWx1ZTogbnVtYmVyKSB7XG4gICAgdGhpcy5fbWluID0gdmFsdWU7XG4gIH1cbiAgQElucHV0KClcbiAgZ2V0IG1heCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLl9tYXg7XG4gIH1cbiAgc2V0IG1heCh2YWx1ZTogbnVtYmVyKSB7XG4gICAgdGhpcy5fbWF4ID0gdmFsdWU7XG4gIH1cbiAgQElucHV0KClcbiAgZ2V0IHN0ZXAoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5fc3RlcDtcbiAgfVxuICBzZXQgc3RlcCh2YWx1ZTogbnVtYmVyKSB7XG4gICAgdGhpcy5fc3RlcCA9IHZhbHVlO1xuICB9XG4gIEBJbnB1dCgpXG4gIGdldCB2YWx1ZSgpOiBbbnVtYmVyXSB7XG4gICAgcmV0dXJuIHRoaXMuX3ZhbHVlO1xuICB9XG4gIHNldCB2YWx1ZSh2YWx1ZTogW251bWJlcl0pIHtcbiAgICB0aGlzLnNldFZhbHVlKHZhbHVlKTtcbiAgfVxuICBASW5wdXQoKVxuICBzZXQgZGVmYXVsdFZhbHVlKHZhbHVlKSB7XG4gICAgdGhpcy5fZGVmYXVsdFZhbHVlID0gdmFsdWU7XG4gICAgdGhpcy5fdmFsdWUgPSB0aGlzLl9kZWZhdWx0VmFsdWU7XG4gICAgdGhpcy5zZXRWYWx1ZSh2YWx1ZSk7XG4gIH1cbiAgQElucHV0KClcbiAgZ2V0IGRpc2FibGVkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9kaXNhYmxlZDtcbiAgfVxuICBzZXQgZGlzYWJsZWQodmFsdWU6IGJvb2xlYW4pIHtcbiAgICB0aGlzLl9kaXNhYmxlZCA9IHZhbHVlO1xuICB9XG4gIEBJbnB1dCgpXG4gIGdldCBtYXJrcygpOiBvYmplY3Qge1xuICAgIHJldHVybiB0aGlzLl9tYXJrcztcbiAgfVxuICBzZXQgbWFya3ModmFsdWU6IG9iamVjdCkge1xuICAgIHRoaXMuX21hcmtzID0gdmFsdWU7XG4gIH1cbiAgQElucHV0KClcbiAgZ2V0IGRvdHMoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX2RvdHM7XG4gIH1cbiAgc2V0IGRvdHModmFsdWU6IGJvb2xlYW4pIHtcbiAgICB0aGlzLl9kb3RzID0gdmFsdWU7XG4gIH1cbiAgQElucHV0KClcbiAgZ2V0IGluY2x1ZGVkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9pbmNsdWRlZDtcbiAgfVxuICBzZXQgaW5jbHVkZWQodmFsdWU6IGJvb2xlYW4pIHtcbiAgICB0aGlzLl9pbmNsdWRlZCA9IHZhbHVlO1xuICB9XG4gIEBJbnB1dCgpXG4gIHNldCBjb3VudCh2YWx1ZTogbnVtYmVyKSB7XG4gICAgdGhpcy5fY291bnQgPSB2YWx1ZTtcbiAgfVxuICBASW5wdXQoKVxuICBzZXQgYWxsb3dDcm9zcyh2YWx1ZTogYm9vbGVhbikge1xuICAgIHRoaXMuX2FsbG93Q3Jvc3MgPSB2YWx1ZTtcbiAgICB0aGlzLnNldFZhbHVlQm91bmQoKTtcbiAgfVxuICBASW5wdXQoKVxuICBzZXQgcHVzaGFibGUodmFsdWU6IG51bWJlcikge1xuICAgIHRoaXMuX3B1c2hhYmxlID0gdmFsdWU7XG4gICAgaWYgKHRoaXMudmVyaWZ5UHVzaGFibGUoKSkge1xuICAgICAgdGhpcy5zZXRWYWx1ZUJvdW5kKCk7XG4gICAgfVxuICB9XG4gIEBJbnB1dCgpXG4gIGdldCBoYW5kbGVTdHlsZSgpOiBhbnlbXSB7XG4gICAgcmV0dXJuIHRoaXMuX2hhbmRsZVN0eWxlO1xuICB9XG4gIHNldCBoYW5kbGVTdHlsZSh2YWx1ZTogYW55W10pIHtcbiAgICB0aGlzLl9oYW5kbGVTdHlsZSA9IHZhbHVlO1xuICB9XG4gIEBJbnB1dCgpXG4gIGdldCB0cmFja1N0eWxlKCk6IGFueVtdIHtcbiAgICByZXR1cm4gdGhpcy5fdHJhY2tTdHlsZTtcbiAgfVxuICBzZXQgdHJhY2tTdHlsZSh2YWx1ZTogYW55W10pIHtcbiAgICB0aGlzLl90cmFja1N0eWxlID0gdmFsdWU7XG4gIH1cbiAgQElucHV0KClcbiAgZ2V0IHJhaWxTdHlsZSgpOiBhbnlbXSB7XG4gICAgcmV0dXJuIHRoaXMuX3JhaWxTdHlsZTtcbiAgfVxuICBzZXQgcmFpbFN0eWxlKHZhbHVlOiBhbnlbXSkge1xuICAgIHRoaXMuX3JhaWxTdHlsZSA9IHZhbHVlO1xuICB9XG4gIEBPdXRwdXQoKVxuICBvbkNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xuICBAT3V0cHV0KClcbiAgb25BZnRlckNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xuXG4gIEBIb3N0QmluZGluZygnY2xhc3MuYW0tc2xpZGVyLXdyYXBwZXInKVxuICBhbVdyYXBwZXI6IGJvb2xlYW4gPSB0cnVlO1xuXG4gIHByaXZhdGUgX25nTW9kZWxPbkNoYW5nZTogKHZhbHVlOiBudW1iZXJbXSkgPT4gdm9pZCA9ICgpID0+IHt9O1xuICBwcml2YXRlIF9uZ01vZGVsT25Ub3VjaGVkOiAodmFsdWU6IG51bWJlcikgPT4gdm9pZCA9ICgpID0+IHt9O1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgX2VsZjogRWxlbWVudFJlZikge31cblxuICBzZXRDbHMoKSB7XG4gICAgdGhpcy5zbGlkZXJDbHMgPSB7XG4gICAgICBbYCR7dGhpcy5wcmVmaXhDbHN9LWRpc2FibGVkYF06IHRoaXMuX2Rpc2FibGVkXG4gICAgfTtcbiAgfVxuXG4gIGluaXRpYWxWYWx1ZSgpIHtcbiAgICBjb25zdCBtaW5UZW1wID0gdGhpcy5fbWluO1xuICAgIGlmICghdGhpcy52ZXJpZnlQdXNoYWJsZSgpKSB7XG4gICAgICB0aGlzLl9wdXNoYWJsZSA9IDA7XG4gICAgICBjb25zb2xlLndhcm4oJ3B1c2hhYmxl6K6+572u5peg5pWI77yM5bey5aSn5LqO5pyJ5LqbdmFsdWXpl7TpmpTvvIzooqvlvLrliLborr7kuLowJyk7XG4gICAgfVxuICAgIGNvbnN0IGluaXRpYWxWYWx1ZSA9IEFycmF5LmFwcGx5KG51bGwsIEFycmF5KHRoaXMuX2NvdW50ICsgMSkpLm1hcChmdW5jdGlvbigpIHtcbiAgICAgIHJldHVybiBtaW5UZW1wO1xuICAgIH0pO1xuICAgIHRoaXMuX2RlZmF1bHRWYWx1ZSA9IHRoaXMuX2RlZmF1bHRWYWx1ZSAhPT0gdW5kZWZpbmVkID8gdGhpcy5fZGVmYXVsdFZhbHVlIDogaW5pdGlhbFZhbHVlO1xuICAgIHRoaXMuX3ZhbHVlID0gdGhpcy5fdmFsdWUgIT09IHVuZGVmaW5lZCA/IHRoaXMuX3ZhbHVlIDogdGhpcy5fZGVmYXVsdFZhbHVlO1xuICAgIC8vIOmqjOivgWNvdW505YC8XG4gICAgdGhpcy5fY291bnQgPSB0aGlzLl92YWx1ZS5sZW5ndGggLSAxO1xuICAgIC8vIOmqjOivgXZhbHVl5Yy66Ze0XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLl92YWx1ZS5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKHRoaXMuX3ZhbHVlW2ldIDwgdGhpcy5fbWluKSB7XG4gICAgICAgIHRoaXMuX3ZhbHVlW2ldID0gdGhpcy5fbWluO1xuICAgICAgfSBlbHNlIGlmICh0aGlzLl92YWx1ZVtpXSA+IHRoaXMuX21heCkge1xuICAgICAgICB0aGlzLl92YWx1ZVtpXSA9IHRoaXMuX21heDtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHRoaXMuX2NvdW50ID4gMCkge1xuICAgICAgdGhpcy51cHBlckJvdW5kID0gTWF0aC5tYXgoLi4udGhpcy5fdmFsdWUpO1xuICAgICAgdGhpcy5sb3dlckJvdW5kID0gTWF0aC5taW4oLi4udGhpcy5fdmFsdWUpO1xuICAgIH1cbiAgfVxuXG4gIGhhbmRsZUNoYW5nZShlLCBpKSB7XG4gICAgbGV0IHRlbXAgPSBbLi4udGhpcy5fdmFsdWVdO1xuICAgIHRlbXBbaV0gPSBlO1xuICAgIHRoaXMudXBwZXJCb3VuZCA9IE1hdGgubWF4KC4uLnRlbXApO1xuICAgIHRoaXMubG93ZXJCb3VuZCA9IE1hdGgubWluKC4uLnRlbXApO1xuICAgIHRoaXMuc2V0VHJhY2tTdHlsZSh0ZW1wKTtcbiAgICB0aGlzLm9uQ2hhbmdlLmVtaXQodGVtcCk7XG4gIH1cblxuICBoYW5kbGVBZnRlckNoYW5nZShlLCBpKSB7XG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICB0aGlzLl92YWx1ZVtpXSA9IGU7XG4gICAgICB0aGlzLnVwcGVyQm91bmQgPSBNYXRoLm1heCguLi50aGlzLl92YWx1ZSk7XG4gICAgICB0aGlzLmxvd2VyQm91bmQgPSBNYXRoLm1pbiguLi50aGlzLl92YWx1ZSk7XG4gICAgICB0aGlzLnNldFRyYWNrU3R5bGUodGhpcy5fdmFsdWUpO1xuICAgICAgdGhpcy5vbkFmdGVyQ2hhbmdlLmVtaXQodGhpcy5fdmFsdWUpO1xuICAgICAgdGhpcy5fbmdNb2RlbE9uQ2hhbmdlKHRoaXMuX3ZhbHVlKTtcbiAgICAgIHRoaXMuc2V0VmFsdWVCb3VuZCgpO1xuICAgIH0sIDApO1xuICB9XG5cbiAgc2V0VHJhY2tTdHlsZSh2YWx1ZSkge1xuICAgIGlmICh2YWx1ZSAmJiB2YWx1ZS5sZW5ndGggPT09IHRoaXMuX2NvdW50ICsgMSkge1xuICAgICAgdmFsdWUuc29ydCgoYSwgYikgPT4gYSAtIGIpO1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLl9jb3VudDsgaSsrKSB7XG4gICAgICAgIHRoaXMub2Zmc2V0W2ldID0gKHZhbHVlW2ldICogMTAwKSAvICh0aGlzLl9tYXggLSB0aGlzLl9taW4pO1xuICAgICAgICB0aGlzLmxlbmd0aFtpXSA9ICgodmFsdWVbaSArIDFdIC0gdmFsdWVbaV0pICogMTAwKSAvICh0aGlzLl9tYXggLSB0aGlzLl9taW4pO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHNldFZhbHVlQm91bmQoKSB7XG4gICAgdGhpcy5tYXhCb3VuZCA9IFtdO1xuICAgIHRoaXMubWluQm91bmQgPSBbXTtcbiAgICBpZiAoKHRoaXMuX2FsbG93Q3Jvc3MgJiYgdGhpcy5fcHVzaGFibGUgPT09IHVuZGVmaW5lZCkgfHwgdGhpcy5faGFuZGxlQ291bnQgPD0gMSkge1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLl9oYW5kbGVDb3VudDsgaSsrKSB7XG4gICAgICAgIHRoaXMubWF4Qm91bmRbaV0gPSB0aGlzLl9tYXg7XG4gICAgICAgIHRoaXMubWluQm91bmRbaV0gPSB0aGlzLl9taW47XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICh0aGlzLl9wdXNoYWJsZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHRoaXMuX3B1c2hhYmxlID0gMDtcbiAgICAgIH1cbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5faGFuZGxlQ291bnQ7IGkrKykge1xuICAgICAgICB0aGlzLm1heEJvdW5kW2ldID0gaSA9PT0gdGhpcy5faGFuZGxlQ291bnQgLSAxID8gdGhpcy5fbWF4IDogdGhpcy5fdmFsdWVbaSArIDFdIC0gdGhpcy5fcHVzaGFibGU7XG4gICAgICAgIHRoaXMubWluQm91bmRbaV0gPSBpID09PSAwID8gdGhpcy5fbWluIDogdGhpcy5fdmFsdWVbaSAtIDFdICsgdGhpcy5fcHVzaGFibGU7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgdmVyaWZ5UHVzaGFibGUoKSB7XG4gICAgZm9yIChsZXQgaSA9IDE7IGkgPCB0aGlzLl9oYW5kbGVDb3VudDsgaSsrKSB7XG4gICAgICBjb25zdCBkaWZmID0gdGhpcy5fdmFsdWVbaV0gLSB0aGlzLl92YWx1ZVtpIC0gMV07XG4gICAgICBpZiAoZGlmZiA8IHRoaXMuX3B1c2hhYmxlKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICB3cml0ZVZhbHVlKHZhbHVlOiBudW1iZXJbXSk6IHZvaWQge1xuICAgIHRoaXMuc2V0VmFsdWUodmFsdWUsIHRydWUpO1xuICB9XG5cbiAgc2V0VmFsdWUodmFsdWU6IG51bWJlcltdLCBpc1dyaXRlVmFsdWUgPSBmYWxzZSkge1xuICAgIGlmICh2YWx1ZSkge1xuICAgICAgdGhpcy5fdmFsdWUgPSB2YWx1ZTtcbiAgICAgIHRoaXMuX2hhbmRsZUNvdW50ID0gdGhpcy5fdmFsdWUubGVuZ3RoICsgMTtcbiAgICAgIHRoaXMuaW5pdGlhbFZhbHVlKCk7XG4gICAgICB0aGlzLnNldFZhbHVlQm91bmQoKTtcbiAgICAgIHRoaXMuc2V0Q2xzKCk7XG4gICAgICB0aGlzLnNldFRyYWNrU3R5bGUodGhpcy5fdmFsdWUpO1xuICAgICAgaWYgKGlzV3JpdGVWYWx1ZSkge1xuICAgICAgICB0aGlzLl9uZ01vZGVsT25DaGFuZ2UodGhpcy5fdmFsdWUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5vbkFmdGVyQ2hhbmdlLmVtaXQodGhpcy5fdmFsdWUpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJlZ2lzdGVyT25DaGFuZ2UoZm46ICh2YWx1ZTogbnVtYmVyW10pID0+IHZvaWQpOiB2b2lkIHtcbiAgICB0aGlzLl9uZ01vZGVsT25DaGFuZ2UgPSBmbjtcbiAgfVxuXG4gIHJlZ2lzdGVyT25Ub3VjaGVkKGZuOiAodmFsdWU6IG51bWJlcikgPT4gdm9pZCk6IHZvaWQge1xuICAgIHRoaXMuX25nTW9kZWxPblRvdWNoZWQgPSBmbjtcbiAgfVxuXG4gIG5nT25Jbml0KCkge1xuICAgIHRoaXMuaW5pdGlhbFZhbHVlKCk7XG4gICAgdGhpcy5zZXRWYWx1ZUJvdW5kKCk7XG4gICAgdGhpcy5faGFuZGxlQ291bnQgPSB0aGlzLl9jb3VudCArIDE7XG4gICAgdGhpcy5zZXRDbHMoKTtcbiAgICBjb25zdCBzbGlkZXJDb29yZHMgPSB0aGlzLl9lbGYubmF0aXZlRWxlbWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdhbS1zbGlkZXInKVswXS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICB0aGlzLnNsaWRlckxlbmd0aCA9IHNsaWRlckNvb3Jkcy53aWR0aDtcbiAgICB0aGlzLnNsaWRlclN0YXJ0ID0gc2xpZGVyQ29vcmRzLmxlZnQ7XG4gIH1cbn1cbiIsIjxkaXYgY2xhc3M9XCJhbS1zbGlkZXJcIiBbbmdDbGFzc109XCJzbGlkZXJDbHNcIj5cbiAgPGRpdiBjbGFzcz1cImFtLXNsaWRlci1yYWlsXCIgW25nU3R5bGVdPVwicmFpbFN0eWxlXCI+PC9kaXY+XG4gIDxTbGlkZXJUcmFja1xuICAgICpuZ0Zvcj1cImxldCBvZmYgb2Ygb2Zmc2V0OyBsZXQgaSA9IGluZGV4XCJcbiAgICBbY2xhc3NOYW1lXT1cIidhbS1zbGlkZXItdHJhY2snXCJcbiAgICBbaW5jbHVkZWRdPVwiaW5jbHVkZWRcIlxuICAgIFtzdHlsZV09XCJ0cmFja1N0eWxlW2ldXCJcbiAgICBbb2Zmc2V0XT1cIm9mZlwiXG4gICAgW2xlbmd0aF09XCJsZW5ndGhbaV1cIlxuICA+PC9TbGlkZXJUcmFjaz5cbiAgPFNsaWRlclN0ZXBzXG4gICAgW21heF09XCJtYXhcIlxuICAgIFttaW5dPVwibWluXCJcbiAgICBbZG90c109XCJkb3RzXCJcbiAgICBbc3RlcF09XCJzdGVwXCJcbiAgICBbbWFya3NdPVwibWFya3NcIlxuICAgIFt1cHBlckJvdW5kXT1cInVwcGVyQm91bmRcIlxuICAgIFtsb3dlckJvdW5kXT1cImxvd2VyQm91bmRcIlxuICA+PC9TbGlkZXJTdGVwcz5cbiAgPFNsaWRlckhhbmRsZVxuICAgICpuZ0Zvcj1cImxldCB2YWwgb2YgdmFsdWU7IGxldCBpID0gaW5kZXhcIlxuICAgIFttYXhdPVwibWF4XCJcbiAgICBbbWluXT1cIm1pblwiXG4gICAgW21heEJvdW5kXT1cIm1heEJvdW5kW2ldXCJcbiAgICBbbWluQm91bmRdPVwibWluQm91bmRbaV1cIlxuICAgIFt2YWx1ZV09XCJ2YWxcIlxuICAgIFtzdGVwXT1cInN0ZXBcIlxuICAgIFtkaXNhYmxlZF09XCJkaXNhYmxlZFwiXG4gICAgW3NsaWRlckxlbmd0aF09XCJzbGlkZXJMZW5ndGhcIlxuICAgIFtzbGlkZXJTdGFydF09XCJzbGlkZXJTdGFydFwiXG4gICAgW2hhbmRsZVN0eWxlXT1cImhhbmRsZVN0eWxlW2ldXCJcbiAgICAob25DaGFuZ2UpPVwiaGFuZGxlQ2hhbmdlKCRldmVudCwgaSlcIlxuICAgIChvbkFmdGVyQ2hhbmdlKT1cImhhbmRsZUFmdGVyQ2hhbmdlKCRldmVudCwgaSlcIlxuICA+PC9TbGlkZXJIYW5kbGU+XG4gIDxTbGlkZXJNYXJrc1xuICAgIFttYXhdPVwibWF4XCJcbiAgICBbbWluXT1cIm1pblwiXG4gICAgW21hcmtzXT1cIm1hcmtzXCJcbiAgICBbdXBwZXJCb3VuZF09XCJ1cHBlckJvdW5kXCJcbiAgICBbbG93ZXJCb3VuZF09XCJsb3dlckJvdW5kXCJcbiAgPjwvU2xpZGVyTWFya3M+XG48L2Rpdj5cbiJdfQ==