UNPKG

@taiga-ui/kit

Version:
275 lines • 36.6 kB
import { __decorate, __extends, __param } from "tslib"; import { ChangeDetectorRef, Directive, ElementRef, HostBinding, Inject, Input, ViewChild, } from '@angular/core'; import { NgControl } from '@angular/forms'; import { AbstractTuiControl, clamp, quantize, round, setNativeFocused, tuiDefaultProp, typedFromEvent, } from '@taiga-ui/cdk'; import { TUI_FLOATING_PRECISION } from '@taiga-ui/kit/constants'; import { TUI_FROM_TO_TEXTS } from '@taiga-ui/kit/tokens'; import { Observable, race, Subject } from 'rxjs'; import { map, switchMap, takeUntil } from 'rxjs/operators'; export var SLIDER_KEYBOARD_STEP = 0.05; export var DOT_WIDTH = { s: 8, m: 16, }; /** * @awful TODO: refactor * @internal * @dynamic */ var AbstractTuiSlider = /** @class */ (function (_super) { __extends(AbstractTuiSlider, _super); function AbstractTuiSlider(ngControl, changeDetectorRef, documentRef, fromToTexts$) { var _this = _super.call(this, ngControl, changeDetectorRef) || this; _this.documentRef = documentRef; _this.fromToTexts$ = fromToTexts$; _this.min = 0; _this.max = Infinity; _this.segments = 0; _this.steps = 0; _this.pluralize = null; _this.size = 'm'; _this.keySteps = null; _this.focusVisibleLeft = false; _this.focusVisibleRight = false; // @bad TODO: handle pointer events instead of mouse and touch events _this.pointerDown$ = new Subject(); return _this; } Object.defineProperty(AbstractTuiSlider.prototype, "segmented", { get: function () { return this.segments > 0; }, enumerable: true, configurable: true }); Object.defineProperty(AbstractTuiSlider.prototype, "discrete", { get: function () { return this.steps > 0; }, enumerable: true, configurable: true }); Object.defineProperty(AbstractTuiSlider.prototype, "length", { get: function () { return this.max - this.min; }, enumerable: true, configurable: true }); Object.defineProperty(AbstractTuiSlider.prototype, "isLeftFocusable", { get: function () { return !this.disabled && this.focusable && this.right !== 100; }, enumerable: true, configurable: true }); Object.defineProperty(AbstractTuiSlider.prototype, "isRightFocusable", { get: function () { return !this.disabled && this.focusable && this.left !== 100; }, enumerable: true, configurable: true }); AbstractTuiSlider.prototype.ngOnInit = function () { var _this = this; _super.prototype.ngOnInit.call(this); var mouseMoves$ = typedFromEvent(this.documentRef, 'mousemove'); var mouseUps$ = typedFromEvent(this.documentRef, 'mouseup'); var touchMoves$ = typedFromEvent(this.documentRef, 'touchmove'); var touchEnds$ = typedFromEvent(this.documentRef, 'touchend'); var isPointerDownRight; this.pointerDown$ .pipe(map(function (event) { var rect = event.currentTarget.getBoundingClientRect(); var clientX = event instanceof MouseEvent ? event.clientX : event.touches[0].clientX; var fraction = clamp(_this.getFractionFromEvents(rect, clientX), 0, 1); var deltaLeft = fraction * 100 - _this.left; var deltaRight = fraction * 100 - 100 + _this.right; isPointerDownRight = Math.abs(deltaLeft) > Math.abs(deltaRight) || deltaRight > 0 || (_this.left === 0 && _this.right === 100); var calibratedFraction = clamp(_this.getCalibratedFractionFromEvents(rect, clientX, isPointerDownRight), 0, 1); var value = _this.getValueFromFraction(_this.fractionGuard(calibratedFraction)); _this.processValue(value, isPointerDownRight); _this.processFocus(isPointerDownRight); return rect; }), switchMap(function (rect) { return race([touchMoves$, mouseMoves$]).pipe(map(function (event) { return _this.getCalibratedFractionFromEvents(rect, event instanceof MouseEvent ? event.clientX : event.touches[0].clientX, isPointerDownRight); }), takeUntil(race([mouseUps$, touchEnds$]))); }), map(function (fraction) { return _this.fractionGuard(fraction); })) .subscribe(function (fraction) { _this.processValue(_this.getValueFromFraction(fraction), isPointerDownRight); }); }; AbstractTuiSlider.prototype.ngOnDestroy = function () { _super.prototype.ngOnDestroy.call(this); this.pointerDown$.complete(); }; AbstractTuiSlider.prototype.onMouseDown = function (event) { if (this.disabled) { return; } event.preventDefault(); this.pointerDown$.next(event); }; AbstractTuiSlider.prototype.onTouchStart = function (event) { if (this.disabled) { return; } event.preventDefault(); this.pointerDown$.next(event); }; AbstractTuiSlider.prototype.isPluralized = function (pluralize) { return pluralize !== null && pluralize.length === 3; }; AbstractTuiSlider.prototype.decrement = function (right) { this.processStep(false, right); }; AbstractTuiSlider.prototype.increment = function (right) { this.processStep(true, right); }; AbstractTuiSlider.prototype.getSegmentLabel = function (segment) { return round(this.getValueFromFraction(segment / this.segments), 2); }; AbstractTuiSlider.prototype.getSegmentPrefix = function (segment, texts) { if (this.segments !== 1) { return ''; } if (segment === 0) { return texts[0] + " "; } return texts[1] + " "; }; AbstractTuiSlider.prototype.onActiveZone = function (active) { this.updateFocused(active); }; AbstractTuiSlider.prototype.onLeftFocusVisible = function (focusVisible) { this.focusVisibleLeft = focusVisible; }; AbstractTuiSlider.prototype.onRightFocusVisible = function (focusVisible) { this.focusVisibleRight = focusVisible; }; AbstractTuiSlider.prototype.getFractionFromValue = function (value) { var fraction = (value - this.min) / this.length; return this.keySteps !== null ? this.fractionValueKeyStepConverter(value, false) : clamp(Number.isFinite(fraction) ? fraction : 1, 0, 1); }; AbstractTuiSlider.prototype.getValueFromFraction = function (fraction) { return this.keySteps !== null ? this.fractionValueKeyStepConverter(fraction, true) : round(this.fractionGuard(fraction) * this.length + this.min, TUI_FLOATING_PRECISION); }; AbstractTuiSlider.prototype.getCalibratedFractionFromEvents = function (rect, clientX, _) { return this.getFractionFromEvents(rect, clientX); }; AbstractTuiSlider.prototype.processFocus = function (right) { if (!this.focusable || !this.dotRight || !this.dotLeft) { return; } if (right) { setNativeFocused(this.dotRight.nativeElement); } else { setNativeFocused(this.dotLeft.nativeElement); } }; /** * Function for converting the fullness of the slider to a value and vice versa * taking into account the steps of linear dependence. * * @param value passed value * @param isFraction translation is carried out from fullness to value */ AbstractTuiSlider.prototype.fractionValueKeyStepConverter = function (value, isFraction) { var steps = [[0, this.min]].concat(this.keySteps, [ [100, this.max], ]); var prevFraction = 0; var nextFraction = 100; var prevValue = this.min; var nextValue = this.max; for (var i = 1; i < steps.length; i++) { if ((isFraction && steps[i][0] / 100 > value) || (!isFraction && steps[i][1] > value)) { prevFraction = steps[i - 1][0] || 0; nextFraction = steps[i][0]; prevValue = steps[i - 1][1]; nextValue = steps[i][1]; break; } } var deltaFraction = nextFraction - prevFraction; var deltaValue = nextValue - prevValue; return isFraction ? round(((value * 100 - prevFraction) / deltaFraction) * deltaValue + prevValue, TUI_FLOATING_PRECISION) : clamp(((value - prevValue) / deltaValue) * deltaFraction + prevFraction, 0, 100) / 100; }; AbstractTuiSlider.prototype.fractionGuard = function (fraction) { return this.discrete ? clamp(quantize(fraction, 1 / this.steps), 0, 1) : clamp(fraction, 0, 1); }; AbstractTuiSlider.prototype.getFractionFromEvents = function (rect, clientX) { var value = clientX - rect.left - DOT_WIDTH[this.size] / 2; var total = rect.width - DOT_WIDTH[this.size]; return round(value / total, TUI_FLOATING_PRECISION); }; AbstractTuiSlider.ctorParameters = function () { return [ { type: NgControl }, { type: ChangeDetectorRef }, { type: Document }, { type: Observable, decorators: [{ type: Inject, args: [TUI_FROM_TO_TEXTS,] }] } ]; }; __decorate([ Input(), tuiDefaultProp() ], AbstractTuiSlider.prototype, "min", void 0); __decorate([ Input(), tuiDefaultProp() ], AbstractTuiSlider.prototype, "max", void 0); __decorate([ Input(), tuiDefaultProp() ], AbstractTuiSlider.prototype, "segments", void 0); __decorate([ Input(), tuiDefaultProp() ], AbstractTuiSlider.prototype, "steps", void 0); __decorate([ Input(), tuiDefaultProp() ], AbstractTuiSlider.prototype, "pluralize", void 0); __decorate([ Input(), HostBinding('attr.data-tui-host-size'), tuiDefaultProp() ], AbstractTuiSlider.prototype, "size", void 0); __decorate([ Input(), tuiDefaultProp() ], AbstractTuiSlider.prototype, "keySteps", void 0); __decorate([ ViewChild('dotLeft') ], AbstractTuiSlider.prototype, "dotLeft", void 0); __decorate([ ViewChild('dotRight') ], AbstractTuiSlider.prototype, "dotRight", void 0); __decorate([ HostBinding('class._segmented') ], AbstractTuiSlider.prototype, "segmented", null); AbstractTuiSlider = __decorate([ Directive(), __param(3, Inject(TUI_FROM_TO_TEXTS)) ], AbstractTuiSlider); return AbstractTuiSlider; }(AbstractTuiControl)); export { AbstractTuiSlider }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2xpZGVyLmpzIiwic291cmNlUm9vdCI6Im5nOi8vQHRhaWdhLXVpL2tpdC9hYnN0cmFjdC8iLCJzb3VyY2VzIjpbInNsaWRlci9zbGlkZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sRUFDSCxpQkFBaUIsRUFDakIsU0FBUyxFQUNULFVBQVUsRUFDVixXQUFXLEVBQ1gsTUFBTSxFQUNOLEtBQUssRUFDTCxTQUFTLEdBQ1osTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFDLFNBQVMsRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBQ3pDLE9BQU8sRUFDSCxrQkFBa0IsRUFDbEIsS0FBSyxFQUNMLFFBQVEsRUFDUixLQUFLLEVBQ0wsZ0JBQWdCLEVBQ2hCLGNBQWMsRUFHZCxjQUFjLEdBQ2pCLE1BQU0sZUFBZSxDQUFDO0FBRXZCLE9BQU8sRUFBQyxzQkFBc0IsRUFBQyxNQUFNLHlCQUF5QixDQUFDO0FBQy9ELE9BQU8sRUFBQyxpQkFBaUIsRUFBQyxNQUFNLHNCQUFzQixDQUFDO0FBRXZELE9BQU8sRUFBQyxVQUFVLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBQyxNQUFNLE1BQU0sQ0FBQztBQUMvQyxPQUFPLEVBQUMsR0FBRyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUV6RCxNQUFNLENBQUMsSUFBTSxvQkFBb0IsR0FBRyxJQUFJLENBQUM7QUFDekMsTUFBTSxDQUFDLElBQU0sU0FBUyxHQUE0QjtJQUM5QyxDQUFDLEVBQUUsQ0FBQztJQUNKLENBQUMsRUFBRSxFQUFFO0NBQ1IsQ0FBQztBQUVGOzs7O0dBSUc7QUFFSDtJQUNZLHFDQUFxQjtJQThDN0IsMkJBQ0ksU0FBMkIsRUFDM0IsaUJBQW9DLEVBQ25CLFdBQXFCLEVBRTdCLFlBQTBDO1FBTHZELFlBT0ksa0JBQU0sU0FBUyxFQUFFLGlCQUFpQixDQUFDLFNBQ3RDO1FBTG9CLGlCQUFXLEdBQVgsV0FBVyxDQUFVO1FBRTdCLGtCQUFZLEdBQVosWUFBWSxDQUE4QjtRQS9DdkQsU0FBRyxHQUFHLENBQUMsQ0FBQztRQUlSLFNBQUcsR0FBRyxRQUFRLENBQUM7UUFJZixjQUFRLEdBQUcsQ0FBQyxDQUFDO1FBSWIsV0FBSyxHQUFHLENBQUMsQ0FBQztRQUlWLGVBQVMsR0FBd0IsSUFBSSxDQUFDO1FBS3RDLFVBQUksR0FBYSxHQUFHLENBQUM7UUFJckIsY0FBUSxHQUF1QixJQUFJLENBQUM7UUFFcEMsc0JBQWdCLEdBQUcsS0FBSyxDQUFDO1FBRXpCLHVCQUFpQixHQUFHLEtBQUssQ0FBQztRQVExQixxRUFBcUU7UUFDN0Qsa0JBQVksR0FBRyxJQUFJLE9BQU8sRUFFL0IsQ0FBQzs7SUFVSixDQUFDO0lBR0Qsc0JBQUksd0NBQVM7YUFBYjtZQUNJLE9BQU8sSUFBSSxDQUFDLFFBQVEsR0FBRyxDQUFDLENBQUM7UUFDN0IsQ0FBQzs7O09BQUE7SUFFRCxzQkFBSSx1Q0FBUTthQUFaO1lBQ0ksT0FBTyxJQUFJLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQztRQUMxQixDQUFDOzs7T0FBQTtJQUVELHNCQUFJLHFDQUFNO2FBQVY7WUFDSSxPQUFPLElBQUksQ0FBQyxHQUFHLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQztRQUMvQixDQUFDOzs7T0FBQTtJQUVELHNCQUFJLDhDQUFlO2FBQW5CO1lBQ0ksT0FBTyxDQUFDLElBQUksQ0FBQyxRQUFRLElBQUksSUFBSSxDQUFDLFNBQVMsSUFBSSxJQUFJLENBQUMsS0FBSyxLQUFLLEdBQUcsQ0FBQztRQUNsRSxDQUFDOzs7T0FBQTtJQUVELHNCQUFJLCtDQUFnQjthQUFwQjtZQUNJLE9BQU8sQ0FBQyxJQUFJLENBQUMsUUFBUSxJQUFJLElBQUksQ0FBQyxTQUFTLElBQUksSUFBSSxDQUFDLElBQUksS0FBSyxHQUFHLENBQUM7UUFDakUsQ0FBQzs7O09BQUE7SUFNRCxvQ0FBUSxHQUFSO1FBQUEsaUJBc0VDO1FBckVHLGlCQUFNLFFBQVEsV0FBRSxDQUFDO1FBRWpCLElBQU0sV0FBVyxHQUFHLGNBQWMsQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLFdBQVcsQ0FBQyxDQUFDO1FBQ2xFLElBQU0sU0FBUyxHQUFHLGNBQWMsQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLFNBQVMsQ0FBQyxDQUFDO1FBQzlELElBQU0sV0FBVyxHQUFHLGNBQWMsQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLFdBQVcsQ0FBQyxDQUFDO1FBQ2xFLElBQU0sVUFBVSxHQUFHLGNBQWMsQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLFVBQVUsQ0FBQyxDQUFDO1FBQ2hFLElBQUksa0JBQTJCLENBQUM7UUFFaEMsSUFBSSxDQUFDLFlBQVk7YUFDWixJQUFJLENBQ0QsR0FBRyxDQUFDLFVBQUMsS0FBOEI7WUFDL0IsSUFBTSxJQUFJLEdBQUksS0FBSyxDQUFDLGFBQTZCLENBQUMscUJBQXFCLEVBQUUsQ0FBQztZQUMxRSxJQUFNLE9BQU8sR0FDVCxLQUFLLFlBQVksVUFBVTtnQkFDdkIsQ0FBQyxDQUFDLEtBQUssQ0FBQyxPQUFPO2dCQUNmLENBQUMsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQztZQUNuQyxJQUFNLFFBQVEsR0FBRyxLQUFLLENBQ2xCLEtBQUksQ0FBQyxxQkFBcUIsQ0FBQyxJQUFJLEVBQUUsT0FBTyxDQUFDLEVBQ3pDLENBQUMsRUFDRCxDQUFDLENBQ0osQ0FBQztZQUNGLElBQU0sU0FBUyxHQUFHLFFBQVEsR0FBRyxHQUFHLEdBQUcsS0FBSSxDQUFDLElBQUksQ0FBQztZQUM3QyxJQUFNLFVBQVUsR0FBRyxRQUFRLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxLQUFJLENBQUMsS0FBSyxDQUFDO1lBRXJELGtCQUFrQjtnQkFDZCxJQUFJLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDO29CQUMxQyxVQUFVLEdBQUcsQ0FBQztvQkFDZCxDQUFDLEtBQUksQ0FBQyxJQUFJLEtBQUssQ0FBQyxJQUFJLEtBQUksQ0FBQyxLQUFLLEtBQUssR0FBRyxDQUFDLENBQUM7WUFFNUMsSUFBTSxrQkFBa0IsR0FBRyxLQUFLLENBQzVCLEtBQUksQ0FBQywrQkFBK0IsQ0FDaEMsSUFBSSxFQUNKLE9BQU8sRUFDUCxrQkFBa0IsQ0FDckIsRUFDRCxDQUFDLEVBQ0QsQ0FBQyxDQUNKLENBQUM7WUFDRixJQUFNLEtBQUssR0FBRyxLQUFJLENBQUMsb0JBQW9CLENBQ25DLEtBQUksQ0FBQyxhQUFhLENBQUMsa0JBQWtCLENBQUMsQ0FDekMsQ0FBQztZQUVGLEtBQUksQ0FBQyxZQUFZLENBQUMsS0FBSyxFQUFFLGtCQUFrQixDQUFDLENBQUM7WUFDN0MsS0FBSSxDQUFDLFlBQVksQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO1lBRXRDLE9BQU8sSUFBSSxDQUFDO1FBQ2hCLENBQUMsQ0FBQyxFQUNGLFNBQVMsQ0FBQyxVQUFBLElBQUk7WUFDVixPQUFBLElBQUksQ0FBQyxDQUFDLFdBQVcsRUFBRSxXQUFXLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FDakMsR0FBRyxDQUFDLFVBQUMsS0FBVTtnQkFDWCxPQUFBLEtBQUksQ0FBQywrQkFBK0IsQ0FDaEMsSUFBSSxFQUNKLEtBQUssWUFBWSxVQUFVO29CQUN2QixDQUFDLENBQUMsS0FBSyxDQUFDLE9BQU87b0JBQ2YsQ0FBQyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxFQUM5QixrQkFBa0IsQ0FDckI7WUFORCxDQU1DLENBQ0osRUFDRCxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUMsU0FBUyxFQUFFLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FDM0M7UUFYRCxDQVdDLENBQ0osRUFDRCxHQUFHLENBQUMsVUFBQSxRQUFRLElBQUksT0FBQSxLQUFJLENBQUMsYUFBYSxDQUFDLFFBQVEsQ0FBQyxFQUE1QixDQUE0QixDQUFDLENBQ2hEO2FBQ0EsU0FBUyxDQUFDLFVBQUEsUUFBUTtZQUNmLEtBQUksQ0FBQyxZQUFZLENBQ2IsS0FBSSxDQUFDLG9CQUFvQixDQUFDLFFBQVEsQ0FBQyxFQUNuQyxrQkFBa0IsQ0FDckIsQ0FBQztRQUNOLENBQUMsQ0FBQyxDQUFDO0lBQ1gsQ0FBQztJQUVELHVDQUFXLEdBQVg7UUFDSSxpQkFBTSxXQUFXLFdBQUUsQ0FBQztRQUNwQixJQUFJLENBQUMsWUFBWSxDQUFDLFFBQVEsRUFBRSxDQUFDO0lBQ2pDLENBQUM7SUFFRCx1Q0FBVyxHQUFYLFVBQVksS0FBNEM7UUFDcEQsSUFBSSxJQUFJLENBQUMsUUFBUSxFQUFFO1lBQ2YsT0FBTztTQUNWO1FBRUQsS0FBSyxDQUFDLGNBQWMsRUFBRSxDQUFDO1FBQ3ZCLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ2xDLENBQUM7SUFFRCx3Q0FBWSxHQUFaLFVBQWEsS0FBNEM7UUFDckQsSUFBSSxJQUFJLENBQUMsUUFBUSxFQUFFO1lBQ2YsT0FBTztTQUNWO1FBRUQsS0FBSyxDQUFDLGNBQWMsRUFBRSxDQUFDO1FBQ3ZCLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ2xDLENBQUM7SUFFRCx3Q0FBWSxHQUFaLFVBQWEsU0FBOEI7UUFDdkMsT0FBTyxTQUFTLEtBQUssSUFBSSxJQUFJLFNBQVMsQ0FBQyxNQUFNLEtBQUssQ0FBQyxDQUFDO0lBQ3hELENBQUM7SUFFRCxxQ0FBUyxHQUFULFVBQVUsS0FBYztRQUNwQixJQUFJLENBQUMsV0FBVyxDQUFDLEtBQUssRUFBRSxLQUFLLENBQUMsQ0FBQztJQUNuQyxDQUFDO0lBRUQscUNBQVMsR0FBVCxVQUFVLEtBQWM7UUFDcEIsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDbEMsQ0FBQztJQUVELDJDQUFlLEdBQWYsVUFBZ0IsT0FBZTtRQUMzQixPQUFPLEtBQUssQ0FBQyxJQUFJLENBQUMsb0JBQW9CLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUN4RSxDQUFDO0lBRUQsNENBQWdCLEdBQWhCLFVBQWlCLE9BQWUsRUFBRSxLQUF1QjtRQUNyRCxJQUFJLElBQUksQ0FBQyxRQUFRLEtBQUssQ0FBQyxFQUFFO1lBQ3JCLE9BQU8sRUFBRSxDQUFDO1NBQ2I7UUFFRCxJQUFJLE9BQU8sS0FBSyxDQUFDLEVBQUU7WUFDZixPQUFVLEtBQUssQ0FBQyxDQUFDLENBQUMsTUFBRyxDQUFDO1NBQ3pCO1FBRUQsT0FBVSxLQUFLLENBQUMsQ0FBQyxDQUFDLE1BQUcsQ0FBQztJQUMxQixDQUFDO0lBRUQsd0NBQVksR0FBWixVQUFhLE1BQWU7UUFDeEIsSUFBSSxDQUFDLGFBQWEsQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUMvQixDQUFDO0lBRUQsOENBQWtCLEdBQWxCLFVBQW1CLFlBQXFCO1FBQ3BDLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxZQUFZLENBQUM7SUFDekMsQ0FBQztJQUVELCtDQUFtQixHQUFuQixVQUFvQixZQUFxQjtRQUNyQyxJQUFJLENBQUMsaUJBQWlCLEdBQUcsWUFBWSxDQUFDO0lBQzFDLENBQUM7SUFNUyxnREFBb0IsR0FBOUIsVUFBK0IsS0FBYTtRQUN4QyxJQUFNLFFBQVEsR0FBRyxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQztRQUVsRCxPQUFPLElBQUksQ0FBQyxRQUFRLEtBQUssSUFBSTtZQUN6QixDQUFDLENBQUMsSUFBSSxDQUFDLDZCQUE2QixDQUFDLEtBQUssRUFBRSxLQUFLLENBQUM7WUFDbEQsQ0FBQyxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDaEUsQ0FBQztJQUVTLGdEQUFvQixHQUE5QixVQUErQixRQUFnQjtRQUMzQyxPQUFPLElBQUksQ0FBQyxRQUFRLEtBQUssSUFBSTtZQUN6QixDQUFDLENBQUMsSUFBSSxDQUFDLDZCQUE2QixDQUFDLFFBQVEsRUFBRSxJQUFJLENBQUM7WUFDcEQsQ0FBQyxDQUFDLEtBQUssQ0FDRCxJQUFJLENBQUMsYUFBYSxDQUFDLFFBQVEsQ0FBQyxHQUFHLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFDckQsc0JBQXNCLENBQ3pCLENBQUM7SUFDWixDQUFDO0lBRVMsMkRBQStCLEdBQXpDLFVBQ0ksSUFBZ0IsRUFDaEIsT0FBZSxFQUNmLENBQVU7UUFFVixPQUFPLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxJQUFJLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFDckQsQ0FBQztJQUVPLHdDQUFZLEdBQXBCLFVBQXFCLEtBQWM7UUFDL0IsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRTtZQUNwRCxPQUFPO1NBQ1Y7UUFFRCxJQUFJLEtBQUssRUFBRTtZQUNQLGdCQUFnQixDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsYUFBYSxDQUFDLENBQUM7U0FDakQ7YUFBTTtZQUNILGdCQUFnQixDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDLENBQUM7U0FDaEQ7SUFDTCxDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0sseURBQTZCLEdBQXJDLFVBQXNDLEtBQWEsRUFBRSxVQUFtQjtRQUNwRSxJQUFNLEtBQUssR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsUUFBdUIsRUFBRTtZQUMvRCxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDO1NBQ2xCLENBQUMsQ0FBQztRQUVILElBQUksWUFBWSxHQUFHLENBQUMsQ0FBQztRQUNyQixJQUFJLFlBQVksR0FBRyxHQUFHLENBQUM7UUFDdkIsSUFBSSxTQUFTLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQztRQUN6QixJQUFJLFNBQVMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDO1FBRXpCLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxLQUFLLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO1lBQ25DLElBQ0ksQ0FBQyxVQUFVLElBQUksS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsR0FBRyxLQUFLLENBQUM7Z0JBQ3pDLENBQUMsQ0FBQyxVQUFVLElBQUksS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxFQUN0QztnQkFDRSxZQUFZLEdBQUcsS0FBSyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUM7Z0JBQ3BDLFlBQVksR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQzNCLFNBQVMsR0FBRyxLQUFLLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUM1QixTQUFTLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUN4QixNQUFNO2FBQ1Q7U0FDSjtRQUVELElBQU0sYUFBYSxHQUFHLFlBQVksR0FBRyxZQUFZLENBQUM7UUFDbEQsSUFBTSxVQUFVLEdBQUcsU0FBUyxHQUFHLFNBQVMsQ0FBQztRQUV6QyxPQUFPLFVBQVU7WUFDYixDQUFDLENBQUMsS0FBSyxDQUNELENBQUMsQ0FBQyxLQUFLLEdBQUcsR0FBRyxHQUFHLFlBQVksQ0FBQyxHQUFHLGFBQWEsQ0FBQyxHQUFHLFVBQVUsR0FBRyxTQUFTLEVBQ3ZFLHNCQUFzQixDQUN6QjtZQUNILENBQUMsQ0FBQyxLQUFLLENBQ0QsQ0FBQyxDQUFDLEtBQUssR0FBRyxTQUFTLENBQUMsR0FBRyxVQUFVLENBQUMsR0FBRyxhQUFhLEdBQUcsWUFBWSxFQUNqRSxDQUFDLEVBQ0QsR0FBRyxDQUNOLEdBQUcsR0FBRyxDQUFDO0lBQ2xCLENBQUM7SUFFTyx5Q0FBYSxHQUFyQixVQUFzQixRQUFnQjtRQUNsQyxPQUFPLElBQUksQ0FBQyxRQUFRO1lBQ2hCLENBQUMsQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLFFBQVEsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDakQsQ0FBQyxDQUFDLEtBQUssQ0FBQyxRQUFRLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ2hDLENBQUM7SUFFTyxpREFBcUIsR0FBN0IsVUFBOEIsSUFBZ0IsRUFBRSxPQUFlO1FBQzNELElBQU0sS0FBSyxHQUFHLE9BQU8sR0FBRyxJQUFJLENBQUMsSUFBSSxHQUFHLFNBQVMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQzdELElBQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxLQUFLLEdBQUcsU0FBUyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUVoRCxPQUFPLEtBQUssQ0FBQyxLQUFLLEdBQUcsS0FBSyxFQUFFLHNCQUFzQixDQUFDLENBQUM7SUFDeEQsQ0FBQzs7Z0JBMVFjLFNBQVM7Z0JBQ0QsaUJBQWlCO2dCQUNOLFFBQVE7Z0JBRWYsVUFBVSx1QkFEaEMsTUFBTSxTQUFDLGlCQUFpQjs7SUE5QzdCO1FBRkMsS0FBSyxFQUFFO1FBQ1AsY0FBYyxFQUFFO2tEQUNUO0lBSVI7UUFGQyxLQUFLLEVBQUU7UUFDUCxjQUFjLEVBQUU7a0RBQ0Y7SUFJZjtRQUZDLEtBQUssRUFBRTtRQUNQLGNBQWMsRUFBRTt1REFDSjtJQUliO1FBRkMsS0FBSyxFQUFFO1FBQ1AsY0FBYyxFQUFFO29EQUNQO0lBSVY7UUFGQyxLQUFLLEVBQUU7UUFDUCxjQUFjLEVBQUU7d0RBQ3FCO0lBS3RDO1FBSEMsS0FBSyxFQUFFO1FBQ1AsV0FBVyxDQUFDLHlCQUF5QixDQUFDO1FBQ3RDLGNBQWMsRUFBRTttREFDSTtJQUlyQjtRQUZDLEtBQUssRUFBRTtRQUNQLGNBQWMsRUFBRTt1REFDbUI7SUFPcEM7UUFEQyxTQUFTLENBQUMsU0FBUyxDQUFDO3NEQUNxQztJQUcxRDtRQURDLFNBQVMsQ0FBQyxVQUFVLENBQUM7dURBQ3FDO0lBa0IzRDtRQURDLFdBQVcsQ0FBQyxrQkFBa0IsQ0FBQztzREFHL0I7SUE1RGlCLGlCQUFpQjtRQUR0QyxTQUFTLEVBQUU7UUFvREgsV0FBQSxNQUFNLENBQUMsaUJBQWlCLENBQUMsQ0FBQTtPQW5EWixpQkFBaUIsQ0EyVHRDO0lBQUQsd0JBQUM7Q0FBQSxBQTNURCxDQUNZLGtCQUFrQixHQTBUN0I7U0EzVHFCLGlCQUFpQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gICAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gICAgRGlyZWN0aXZlLFxuICAgIEVsZW1lbnRSZWYsXG4gICAgSG9zdEJpbmRpbmcsXG4gICAgSW5qZWN0LFxuICAgIElucHV0LFxuICAgIFZpZXdDaGlsZCxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge05nQ29udHJvbH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHtcbiAgICBBYnN0cmFjdFR1aUNvbnRyb2wsXG4gICAgY2xhbXAsXG4gICAgcXVhbnRpemUsXG4gICAgcm91bmQsXG4gICAgc2V0TmF0aXZlRm9jdXNlZCxcbiAgICB0dWlEZWZhdWx0UHJvcCxcbiAgICBUdWlFdmVudFdpdGgsXG4gICAgVHVpTmF0aXZlRm9jdXNhYmxlRWxlbWVudCxcbiAgICB0eXBlZEZyb21FdmVudCxcbn0gZnJvbSAnQHRhaWdhLXVpL2Nkayc7XG5pbXBvcnQge1R1aVBsdXJhbGl6ZSwgVHVpU2l6ZVMsIFR1aVdpdGhPcHRpb25hbE1pbk1heH0gZnJvbSAnQHRhaWdhLXVpL2NvcmUnO1xuaW1wb3J0IHtUVUlfRkxPQVRJTkdfUFJFQ0lTSU9OfSBmcm9tICdAdGFpZ2EtdWkva2l0L2NvbnN0YW50cyc7XG5pbXBvcnQge1RVSV9GUk9NX1RPX1RFWFRTfSBmcm9tICdAdGFpZ2EtdWkva2l0L3Rva2Vucyc7XG5pbXBvcnQge1R1aUtleVN0ZXBzfSBmcm9tICdAdGFpZ2EtdWkva2l0L3R5cGVzJztcbmltcG9ydCB7T2JzZXJ2YWJsZSwgcmFjZSwgU3ViamVjdH0gZnJvbSAncnhqcyc7XG5pbXBvcnQge21hcCwgc3dpdGNoTWFwLCB0YWtlVW50aWx9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcblxuZXhwb3J0IGNvbnN0IFNMSURFUl9LRVlCT0FSRF9TVEVQID0gMC4wNTtcbmV4cG9ydCBjb25zdCBET1RfV0lEVEg6IHtba2V5OiBzdHJpbmddOiBudW1iZXJ9ID0ge1xuICAgIHM6IDgsXG4gICAgbTogMTYsXG59O1xuXG4vKipcbiAqIEBhd2Z1bCBUT0RPOiByZWZhY3RvclxuICogQGludGVybmFsXG4gKiBAZHluYW1pY1xuICovXG5ARGlyZWN0aXZlKClcbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdFR1aVNsaWRlcjxUPlxuICAgIGV4dGVuZHMgQWJzdHJhY3RUdWlDb250cm9sPFQ+XG4gICAgaW1wbGVtZW50cyBUdWlXaXRoT3B0aW9uYWxNaW5NYXg8bnVtYmVyPiB7XG4gICAgQElucHV0KClcbiAgICBAdHVpRGVmYXVsdFByb3AoKVxuICAgIG1pbiA9IDA7XG5cbiAgICBASW5wdXQoKVxuICAgIEB0dWlEZWZhdWx0UHJvcCgpXG4gICAgbWF4ID0gSW5maW5pdHk7XG5cbiAgICBASW5wdXQoKVxuICAgIEB0dWlEZWZhdWx0UHJvcCgpXG4gICAgc2VnbWVudHMgPSAwO1xuXG4gICAgQElucHV0KClcbiAgICBAdHVpRGVmYXVsdFByb3AoKVxuICAgIHN0ZXBzID0gMDtcblxuICAgIEBJbnB1dCgpXG4gICAgQHR1aURlZmF1bHRQcm9wKClcbiAgICBwbHVyYWxpemU6IFR1aVBsdXJhbGl6ZSB8IG51bGwgPSBudWxsO1xuXG4gICAgQElucHV0KClcbiAgICBASG9zdEJpbmRpbmcoJ2F0dHIuZGF0YS10dWktaG9zdC1zaXplJylcbiAgICBAdHVpRGVmYXVsdFByb3AoKVxuICAgIHNpemU6IFR1aVNpemVTID0gJ20nO1xuXG4gICAgQElucHV0KClcbiAgICBAdHVpRGVmYXVsdFByb3AoKVxuICAgIGtleVN0ZXBzOiBUdWlLZXlTdGVwcyB8IG51bGwgPSBudWxsO1xuXG4gICAgZm9jdXNWaXNpYmxlTGVmdCA9IGZhbHNlO1xuXG4gICAgZm9jdXNWaXNpYmxlUmlnaHQgPSBmYWxzZTtcblxuICAgIEBWaWV3Q2hpbGQoJ2RvdExlZnQnKVxuICAgIHByb3RlY3RlZCBkb3RMZWZ0PzogRWxlbWVudFJlZjxUdWlOYXRpdmVGb2N1c2FibGVFbGVtZW50PjtcblxuICAgIEBWaWV3Q2hpbGQoJ2RvdFJpZ2h0JylcbiAgICBwcm90ZWN0ZWQgZG90UmlnaHQ/OiBFbGVtZW50UmVmPFR1aU5hdGl2ZUZvY3VzYWJsZUVsZW1lbnQ+O1xuXG4gICAgLy8gQGJhZCBUT0RPOiBoYW5kbGUgcG9pbnRlciBldmVudHMgaW5zdGVhZCBvZiBtb3VzZSBhbmQgdG91Y2ggZXZlbnRzXG4gICAgcHJpdmF0ZSBwb2ludGVyRG93biQgPSBuZXcgU3ViamVjdDxcbiAgICAgICAgVHVpRXZlbnRXaXRoPE1vdXNlRXZlbnQgfCBUb3VjaEV2ZW50LCBIVE1MRWxlbWVudD5cbiAgICA+KCk7XG5cbiAgICBwcm90ZWN0ZWQgY29uc3RydWN0b3IoXG4gICAgICAgIG5nQ29udHJvbDogTmdDb250cm9sIHwgbnVsbCxcbiAgICAgICAgY2hhbmdlRGV0ZWN0b3JSZWY6IENoYW5nZURldGVjdG9yUmVmLFxuICAgICAgICBwcml2YXRlIHJlYWRvbmx5IGRvY3VtZW50UmVmOiBEb2N1bWVudCxcbiAgICAgICAgQEluamVjdChUVUlfRlJPTV9UT19URVhUUylcbiAgICAgICAgcmVhZG9ubHkgZnJvbVRvVGV4dHMkOiBPYnNlcnZhYmxlPFtzdHJpbmcsIHN0cmluZ10+LFxuICAgICkge1xuICAgICAgICBzdXBlcihuZ0NvbnRyb2wsIGNoYW5nZURldGVjdG9yUmVmKTtcbiAgICB9XG5cbiAgICBASG9zdEJpbmRpbmcoJ2NsYXNzLl9zZWdtZW50ZWQnKVxuICAgIGdldCBzZWdtZW50ZWQoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLnNlZ21lbnRzID4gMDtcbiAgICB9XG5cbiAgICBnZXQgZGlzY3JldGUoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLnN0ZXBzID4gMDtcbiAgICB9XG5cbiAgICBnZXQgbGVuZ3RoKCk6IG51bWJlciB7XG4gICAgICAgIHJldHVybiB0aGlzLm1heCAtIHRoaXMubWluO1xuICAgIH1cblxuICAgIGdldCBpc0xlZnRGb2N1c2FibGUoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiAhdGhpcy5kaXNhYmxlZCAmJiB0aGlzLmZvY3VzYWJsZSAmJiB0aGlzLnJpZ2h0ICE9PSAxMDA7XG4gICAgfVxuXG4gICAgZ2V0IGlzUmlnaHRGb2N1c2FibGUoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiAhdGhpcy5kaXNhYmxlZCAmJiB0aGlzLmZvY3VzYWJsZSAmJiB0aGlzLmxlZnQgIT09IDEwMDtcbiAgICB9XG5cbiAgICBhYnN0cmFjdCBnZXQgbGVmdCgpOiBudW1iZXI7XG5cbiAgICBhYnN0cmFjdCBnZXQgcmlnaHQoKTogbnVtYmVyO1xuXG4gICAgbmdPbkluaXQoKSB7XG4gICAgICAgIHN1cGVyLm5nT25Jbml0KCk7XG5cbiAgICAgICAgY29uc3QgbW91c2VNb3ZlcyQgPSB0eXBlZEZyb21FdmVudCh0aGlzLmRvY3VtZW50UmVmLCAnbW91c2Vtb3ZlJyk7XG4gICAgICAgIGNvbnN0IG1vdXNlVXBzJCA9IHR5cGVkRnJvbUV2ZW50KHRoaXMuZG9jdW1lbnRSZWYsICdtb3VzZXVwJyk7XG4gICAgICAgIGNvbnN0IHRvdWNoTW92ZXMkID0gdHlwZWRGcm9tRXZlbnQodGhpcy5kb2N1bWVudFJlZiwgJ3RvdWNobW92ZScpO1xuICAgICAgICBjb25zdCB0b3VjaEVuZHMkID0gdHlwZWRGcm9tRXZlbnQodGhpcy5kb2N1bWVudFJlZiwgJ3RvdWNoZW5kJyk7XG4gICAgICAgIGxldCBpc1BvaW50ZXJEb3duUmlnaHQ6IGJvb2xlYW47XG5cbiAgICAgICAgdGhpcy5wb2ludGVyRG93biRcbiAgICAgICAgICAgIC5waXBlKFxuICAgICAgICAgICAgICAgIG1hcCgoZXZlbnQ6IE1vdXNlRXZlbnQgfCBUb3VjaEV2ZW50KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlY3QgPSAoZXZlbnQuY3VycmVudFRhcmdldCBhcyBIVE1MRWxlbWVudCkuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGNsaWVudFggPVxuICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnQgaW5zdGFuY2VvZiBNb3VzZUV2ZW50XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBldmVudC5jbGllbnRYXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBldmVudC50b3VjaGVzWzBdLmNsaWVudFg7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGZyYWN0aW9uID0gY2xhbXAoXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmdldEZyYWN0aW9uRnJvbUV2ZW50cyhyZWN0LCBjbGllbnRYKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIDAsXG4gICAgICAgICAgICAgICAgICAgICAgICAxLFxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBkZWx0YUxlZnQgPSBmcmFjdGlvbiAqIDEwMCAtIHRoaXMubGVmdDtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZGVsdGFSaWdodCA9IGZyYWN0aW9uICogMTAwIC0gMTAwICsgdGhpcy5yaWdodDtcblxuICAgICAgICAgICAgICAgICAgICBpc1BvaW50ZXJEb3duUmlnaHQgPVxuICAgICAgICAgICAgICAgICAgICAgICAgTWF0aC5hYnMoZGVsdGFMZWZ0KSA+IE1hdGguYWJzKGRlbHRhUmlnaHQpIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICBkZWx0YVJpZ2h0ID4gMCB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgKHRoaXMubGVmdCA9PT0gMCAmJiB0aGlzLnJpZ2h0ID09PSAxMDApO1xuXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGNhbGlicmF0ZWRGcmFjdGlvbiA9IGNsYW1wKFxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5nZXRDYWxpYnJhdGVkRnJhY3Rpb25Gcm9tRXZlbnRzKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlY3QsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xpZW50WCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc1BvaW50ZXJEb3duUmlnaHQsXG4gICAgICAgICAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgICAgICAgICAgMCxcbiAgICAgICAgICAgICAgICAgICAgICAgIDEsXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gdGhpcy5nZXRWYWx1ZUZyb21GcmFjdGlvbihcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZnJhY3Rpb25HdWFyZChjYWxpYnJhdGVkRnJhY3Rpb24pLFxuICAgICAgICAgICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucHJvY2Vzc1ZhbHVlKHZhbHVlLCBpc1BvaW50ZXJEb3duUmlnaHQpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnByb2Nlc3NGb2N1cyhpc1BvaW50ZXJEb3duUmlnaHQpO1xuXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiByZWN0O1xuICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAgIHN3aXRjaE1hcChyZWN0ID0+XG4gICAgICAgICAgICAgICAgICAgIHJhY2UoW3RvdWNoTW92ZXMkLCBtb3VzZU1vdmVzJF0pLnBpcGUoXG4gICAgICAgICAgICAgICAgICAgICAgICBtYXAoKGV2ZW50OiBhbnkpID0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5nZXRDYWxpYnJhdGVkRnJhY3Rpb25Gcm9tRXZlbnRzKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWN0LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudCBpbnN0YW5jZW9mIE1vdXNlRXZlbnRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gZXZlbnQuY2xpZW50WFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBldmVudC50b3VjaGVzWzBdLmNsaWVudFgsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzUG9pbnRlckRvd25SaWdodCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRha2VVbnRpbChyYWNlKFttb3VzZVVwcyQsIHRvdWNoRW5kcyRdKSksXG4gICAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICBtYXAoZnJhY3Rpb24gPT4gdGhpcy5mcmFjdGlvbkd1YXJkKGZyYWN0aW9uKSksXG4gICAgICAgICAgICApXG4gICAgICAgICAgICAuc3Vic2NyaWJlKGZyYWN0aW9uID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLnByb2Nlc3NWYWx1ZShcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5nZXRWYWx1ZUZyb21GcmFjdGlvbihmcmFjdGlvbiksXG4gICAgICAgICAgICAgICAgICAgIGlzUG9pbnRlckRvd25SaWdodCxcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgbmdPbkRlc3Ryb3koKSB7XG4gICAgICAgIHN1cGVyLm5nT25EZXN0cm95KCk7XG4gICAgICAgIHRoaXMucG9pbnRlckRvd24kLmNvbXBsZXRlKCk7XG4gICAgfVxuXG4gICAgb25Nb3VzZURvd24oZXZlbnQ6IFR1aUV2ZW50V2l0aDxNb3VzZUV2ZW50LCBIVE1MRWxlbWVudD4pIHtcbiAgICAgICAgaWYgKHRoaXMuZGlzYWJsZWQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIHRoaXMucG9pbnRlckRvd24kLm5leHQoZXZlbnQpO1xuICAgIH1cblxuICAgIG9uVG91Y2hTdGFydChldmVudDogVHVpRXZlbnRXaXRoPFRvdWNoRXZlbnQsIEhUTUxFbGVtZW50Pikge1xuICAgICAgICBpZiAodGhpcy5kaXNhYmxlZCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgdGhpcy5wb2ludGVyRG93biQubmV4dChldmVudCk7XG4gICAgfVxuXG4gICAgaXNQbHVyYWxpemVkKHBsdXJhbGl6ZTogVHVpUGx1cmFsaXplIHwgbnVsbCk6IHBsdXJhbGl6ZSBpcyBUdWlQbHVyYWxpemUge1xuICAgICAgICByZXR1cm4gcGx1cmFsaXplICE9PSBudWxsICYmIHBsdXJhbGl6ZS5sZW5ndGggPT09IDM7XG4gICAgfVxuXG4gICAgZGVjcmVtZW50KHJpZ2h0OiBib29sZWFuKSB7XG4gICAgICAgIHRoaXMucHJvY2Vzc1N0ZXAoZmFsc2UsIHJpZ2h0KTtcbiAgICB9XG5cbiAgICBpbmNyZW1lbnQocmlnaHQ6IGJvb2xlYW4pIHtcbiAgICAgICAgdGhpcy5wcm9jZXNzU3RlcCh0cnVlLCByaWdodCk7XG4gICAgfVxuXG4gICAgZ2V0U2VnbWVudExhYmVsKHNlZ21lbnQ6IG51bWJlcik6IG51bWJlciB7XG4gICAgICAgIHJldHVybiByb3VuZCh0aGlzLmdldFZhbHVlRnJvbUZyYWN0aW9uKHNlZ21lbnQgLyB0aGlzLnNlZ21lbnRzKSwgMik7XG4gICAgfVxuXG4gICAgZ2V0U2VnbWVudFByZWZpeChzZWdtZW50OiBudW1iZXIsIHRleHRzOiBbc3RyaW5nLCBzdHJpbmddKTogc3RyaW5nIHtcbiAgICAgICAgaWYgKHRoaXMuc2VnbWVudHMgIT09IDEpIHtcbiAgICAgICAgICAgIHJldHVybiAnJztcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChzZWdtZW50ID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gYCR7dGV4dHNbMF19IGA7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gYCR7dGV4dHNbMV19IGA7XG4gICAgfVxuXG4gICAgb25BY3RpdmVab25lKGFjdGl2ZTogYm9vbGVhbikge1xuICAgICAgICB0aGlzLnVwZGF0ZUZvY3VzZWQoYWN0aXZlKTtcbiAgICB9XG5cbiAgICBvbkxlZnRGb2N1c1Zpc2libGUoZm9jdXNWaXNpYmxlOiBib29sZWFuKSB7XG4gICAgICAgIHRoaXMuZm9jdXNWaXNpYmxlTGVmdCA9IGZvY3VzVmlzaWJsZTtcbiAgICB9XG5cbiAgICBvblJpZ2h0Rm9jdXNWaXNpYmxlKGZvY3VzVmlzaWJsZTogYm9vbGVhbikge1xuICAgICAgICB0aGlzLmZvY3VzVmlzaWJsZVJpZ2h0ID0gZm9jdXNWaXNpYmxlO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBhYnN0cmFjdCBwcm9jZXNzVmFsdWUodmFsdWU6IG51bWJlciwgcmlnaHQ/OiBib29sZWFuKTogdm9pZDtcblxuICAgIHByb3RlY3RlZCBhYnN0cmFjdCBwcm9jZXNzU3RlcChpbmNyZW1lbnQ6IGJvb2xlYW4sIHJpZ2h0PzogYm9vbGVhbik6IHZvaWQ7XG5cbiAgICBwcm90ZWN0ZWQgZ2V0RnJhY3Rpb25Gcm9tVmFsdWUodmFsdWU6IG51bWJlcik6IG51bWJlciB7XG4gICAgICAgIGNvbnN0IGZyYWN0aW9uID0gKHZhbHVlIC0gdGhpcy5taW4pIC8gdGhpcy5sZW5ndGg7XG5cbiAgICAgICAgcmV0dXJuIHRoaXMua2V5U3RlcHMgIT09IG51bGxcbiAgICAgICAgICAgID8gdGhpcy5mcmFjdGlvblZhbHVlS2V5U3RlcENvbnZlcnRlcih2YWx1ZSwgZmFsc2UpXG4gICAgICAgICAgICA6IGNsYW1wKE51bWJlci5pc0Zpbml0ZShmcmFjdGlvbikgPyBmcmFjdGlvbiA6IDEsIDAsIDEpO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBnZXRWYWx1ZUZyb21GcmFjdGlvbihmcmFjdGlvbjogbnVtYmVyKTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuIHRoaXMua2V5U3RlcHMgIT09IG51bGxcbiAgICAgICAgICAgID8gdGhpcy5mcmFjdGlvblZhbHVlS2V5U3RlcENvbnZlcnRlcihmcmFjdGlvbiwgdHJ1ZSlcbiAgICAgICAgICAgIDogcm91bmQoXG4gICAgICAgICAgICAgICAgICB0aGlzLmZyYWN0aW9uR3VhcmQoZnJhY3Rpb24pICogdGhpcy5sZW5ndGggKyB0aGlzLm1pbixcbiAgICAgICAgICAgICAgICAgIFRVSV9GTE9BVElOR19QUkVDSVNJT04sXG4gICAgICAgICAgICAgICk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGdldENhbGlicmF0ZWRGcmFjdGlvbkZyb21FdmVudHMoXG4gICAgICAgIHJlY3Q6IENsaWVudFJlY3QsXG4gICAgICAgIGNsaWVudFg6IG51bWJlcixcbiAgICAgICAgXzogYm9vbGVhbixcbiAgICApOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRGcmFjdGlvbkZyb21FdmVudHMocmVjdCwgY2xpZW50WCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBwcm9jZXNzRm9jdXMocmlnaHQ6IGJvb2xlYW4pIHtcbiAgICAgICAgaWYgKCF0aGlzLmZvY3VzYWJsZSB8fCAhdGhpcy5kb3RSaWdodCB8fCAhdGhpcy5kb3RMZWZ0KSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocmlnaHQpIHtcbiAgICAgICAgICAgIHNldE5hdGl2ZUZvY3VzZWQodGhpcy5kb3RSaWdodC5uYXRpdmVFbGVtZW50KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHNldE5hdGl2ZUZvY3VzZWQodGhpcy5kb3RMZWZ0Lm5hdGl2ZUVsZW1lbnQpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRnVuY3Rpb24gZm9yIGNvbnZlcnRpbmcgdGhlIGZ1bGxuZXNzIG9mIHRoZSBzbGlkZXIgdG8gYSB2YWx1ZSBhbmQgdmljZSB2ZXJzYVxuICAgICAqIHRha2luZyBpbnRvIGFjY291bnQgdGhlIHN0ZXBzIG9mIGxpbmVhciBkZXBlbmRlbmNlLlxuICAgICAqXG4gICAgICogQHBhcmFtIHZhbHVlIHBhc3NlZCB2YWx1ZVxuICAgICAqIEBwYXJhbSBpc0ZyYWN0aW9uIHRyYW5zbGF0aW9uIGlzIGNhcnJpZWQgb3V0IGZyb20gZnVsbG5lc3MgdG8gdmFsdWVcbiAgICAgKi9cbiAgICBwcml2YXRlIGZyYWN0aW9uVmFsdWVLZXlTdGVwQ29udmVydGVyKHZhbHVlOiBudW1iZXIsIGlzRnJhY3Rpb246IGJvb2xlYW4pOiBudW1iZXIge1xuICAgICAgICBjb25zdCBzdGVwcyA9IFtbMCwgdGhpcy5taW5dXS5jb25jYXQodGhpcy5rZXlTdGVwcyBhcyBUdWlLZXlTdGVwcywgW1xuICAgICAgICAgICAgWzEwMCwgdGhpcy5tYXhdLFxuICAgICAgICBdKTtcblxuICAgICAgICBsZXQgcHJldkZyYWN0aW9uID0gMDtcbiAgICAgICAgbGV0IG5leHRGcmFjdGlvbiA9IDEwMDtcbiAgICAgICAgbGV0IHByZXZWYWx1ZSA9IHRoaXMubWluO1xuICAgICAgICBsZXQgbmV4dFZhbHVlID0gdGhpcy5tYXg7XG5cbiAgICAgICAgZm9yIChsZXQgaSA9IDE7IGkgPCBzdGVwcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgIChpc0ZyYWN0aW9uICYmIHN0ZXBzW2ldWzBdIC8gMTAwID4gdmFsdWUpIHx8XG4gICAgICAgICAgICAgICAgKCFpc0ZyYWN0aW9uICYmIHN0ZXBzW2ldWzFdID4gdmFsdWUpXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICBwcmV2RnJhY3Rpb24gPSBzdGVwc1tpIC0gMV1bMF0gfHwgMDtcbiAgICAgICAgICAgICAgICBuZXh0RnJhY3Rpb24gPSBzdGVwc1tpXVswXTtcbiAgICAgICAgICAgICAgICBwcmV2VmFsdWUgPSBzdGVwc1tpIC0gMV1bMV07XG4gICAgICAgICAgICAgICAgbmV4dFZhbHVlID0gc3RlcHNbaV1bMV07XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBkZWx0YUZyYWN0aW9uID0gbmV4dEZyYWN0aW9uIC0gcHJldkZyYWN0aW9uO1xuICAgICAgICBjb25zdCBkZWx0YVZhbHVlID0gbmV4dFZhbHVlIC0gcHJldlZhbHVlO1xuXG4gICAgICAgIHJldHVybiBpc0ZyYWN0aW9uXG4gICAgICAgICAgICA/IHJvdW5kKFxuICAgICAgICAgICAgICAgICAgKCh2YWx1ZSAqIDEwMCAtIHByZXZGcmFjdGlvbikgLyBkZWx0YUZyYWN0aW9uKSAqIGRlbHRhVmFsdWUgKyBwcmV2VmFsdWUsXG4gICAgICAgICAgICAgICAgICBUVUlfRkxPQVRJTkdfUFJFQ0lTSU9OLFxuICAgICAgICAgICAgICApXG4gICAgICAgICAgICA6IGNsYW1wKFxuICAgICAgICAgICAgICAgICAgKCh2YWx1ZSAtIHByZXZWYWx1ZSkgLyBkZWx0YVZhbHVlKSAqIGRlbHRhRnJhY3Rpb24gKyBwcmV2RnJhY3Rpb24sXG4gICAgICAgICAgICAgICAgICAwLFxuICAgICAgICAgICAgICAgICAgMTAwLFxuICAgICAgICAgICAgICApIC8gMTAwO1xuICAgIH1cblxuICAgIHByaXZhdGUgZnJhY3Rpb25HdWFyZChmcmFjdGlvbjogbnVtYmVyKTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZGlzY3JldGVcbiAgICAgICAgICAgID8gY2xhbXAocXVhbnRpemUoZnJhY3Rpb24sIDEgLyB0aGlzLnN0ZXBzKSwgMCwgMSlcbiAgICAgICAgICAgIDogY2xhbXAoZnJhY3Rpb24sIDAsIDEpO1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0RnJhY3Rpb25Gcm9tRXZlbnRzKHJlY3Q6IENsaWVudFJlY3QsIGNsaWVudFg6IG51bWJlcik6IG51bWJlciB7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gY2xpZW50WCAtIHJlY3QubGVmdCAtIERPVF9XSURUSFt0aGlzLnNpemVdIC8gMjtcbiAgICAgICAgY29uc3QgdG90YWwgPSByZWN0LndpZHRoIC0gRE9UX1dJRFRIW3RoaXMuc2l6ZV07XG5cbiAgICAgICAgcmV0dXJuIHJvdW5kKHZhbHVlIC8gdG90YWwsIFRVSV9GTE9BVElOR19QUkVDSVNJT04pO1xuICAgIH1cbn1cbiJdfQ==