@taiga-ui/kit
Version:
Taiga UI Angular main components kit
275 lines • 36.6 kB
JavaScript
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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2xpZGVyLmpzIiwic291cmNlUm9vdCI6Im5nOi8vQHRhaWdhLXVpL2tpdC9hYnN0cmFjdC8iLCJzb3VyY2VzIjpbInNsaWRlci9zbGlkZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sRUFDSCxpQkFBaUIsRUFDakIsU0FBUyxFQUNULFVBQVUsRUFDVixXQUFXLEVBQ1gsTUFBTSxFQUNOLEtBQUssRUFDTCxTQUFTLEdBQ1osTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFDLFNBQVMsRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBQ3pDLE9BQU8sRUFDSCxrQkFBa0IsRUFDbEIsS0FBSyxFQUNMLFFBQVEsRUFDUixLQUFLLEVBQ0wsZ0JBQWdCLEVBQ2hCLGNBQWMsRUFHZCxjQUFjLEdBQ2pCLE1BQU0sZUFBZSxDQUFDO0FBRXZCLE9BQU8sRUFBQyxzQkFBc0IsRUFBQyxNQUFNLHlCQUF5QixDQUFDO0FBQy9ELE9BQU8sRUFBQyxpQkFBaUIsRUFBQyxNQUFNLHNCQUFzQixDQUFDO0FBRXZELE9BQU8sRUFBQyxVQUFVLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBQyxNQUFNLE1BQU0sQ0FBQztBQUMvQyxPQUFPLEVBQUMsR0FBRyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUV6RCxNQUFNLENBQUMsSUFBTSxvQkFBb0IsR0FBRyxJQUFJLENBQUM7QUFDekMsTUFBTSxDQUFDLElBQU0sU0FBUyxHQUE0QjtJQUM5QyxDQUFDLEVBQUUsQ0FBQztJQUNKLENBQUMsRUFBRSxFQUFFO0NBQ1IsQ0FBQztBQUVGOzs7O0dBSUc7QUFFSDtJQUNZLHFDQUFxQjtJQThDN0IsMkJBQ0ksU0FBMkIsRUFDM0IsaUJBQW9DLEVBQ25CLFdBQXFCLEVBRTdCLFlBQTBDO1FBTHZELFlBT0ksa0JBQU0sU0FBUyxFQUFFLGlCQUFpQixDQUFDLFNBQ3RDO1FBTG9CLGlCQUFXLEdBQVgsV0FBVyxDQUFVO1FBRTdCLGtCQUFZLEdBQVos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UUFEQyxTQUFTLENBQUMsU0FBUyxDQUFDO3NEQUNxQztJQUcxRDtRQURDLFNBQVMsQ0FBQyxVQUFVLENBQUM7dURBQ3FDO0lBa0IzRDtRQURDLFdBQVcsQ0FBQyxrQkFBa0IsQ0FBQztzREFHL0I7SUE1RGlCLGlCQUFpQjtRQUR0QyxTQUFTLEVBQUU7UUFvREgsV0FBQSxNQUFNLENBQUMsaUJBQWlCLENBQUMsQ0FBQTtPQW5EWixpQkFBaUIsQ0EyVHRDO0lBQUQsd0JBQUM7Q0FBQSxBQTNURCxDQUNZLGtCQUFrQixHQTBUN0I7U0EzVHFCLGlCQUFpQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gICAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gICAgRGlyZWN0aXZlLFxuICAgIEVsZW1lbnRSZWYsXG4gICAgSG9zdEJpbmRpbmcsXG4gICAgSW5qZWN0LFxuICAgIElucHV0LFxuICAgIFZpZXdDaGlsZCxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge05nQ29udHJvbH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHtcbiAgICBBYnN0cmFjdFR1aUNvbnRyb2wsXG4gICAgY2xhbXAsXG4gICAgcXVhbnRpemUsXG4gICAgcm91bmQsXG4gICAgc2V0TmF0aXZlRm9jdXNlZCxcbiAgICB0dWlEZWZhdWx0UHJvcCxcbiAgICBUdWlFdmVudFdpdGgsXG4gICAgVHVpTmF0aXZlRm9jdXNhYmxlRWxlbWVudCxcbiAgICB0eXBlZEZyb21FdmVudCxcbn0gZnJvbSAnQHRhaWdhLXVpL2Nkayc7XG5pbXBvcnQge1R1aVBsdXJhbGl6ZSwgVHVpU2l6ZVMsIFR1aVdpdGhPcHRpb25hbE1pbk1heH0gZnJvbSAnQHRhaWdhLXVpL2NvcmUnO1xuaW1wb3J0IHtUVUlfRkxPQVRJTkdfUFJFQ0lTSU9OfSBmcm9tICdAdGFpZ2EtdWkva2l0L2NvbnN0YW50cyc7XG5pbXBvcnQge1RVSV9GUk9NX1RPX1RFWFRTfSBmcm9tICdAdGFpZ2EtdWkva2l0L3Rva2Vucyc7XG5pbXBvcnQge1R1aUtleVN0ZXBzfSBmcm9tICdAdGFpZ2EtdWkva2l0L3R5cGVzJztcbmltcG9ydCB7T2JzZXJ2YWJsZSwgcmFjZSwgU3ViamVjdH0gZnJvbSAncnhqcyc7XG5pbXBvcnQge21hcCwgc3dpdGNoTWFwLCB0YWtlVW50aWx9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcblxuZXhwb3J0IGNvbnN0IFNMSURFUl9LRVlCT0FSRF9TVEVQID0gMC4wNTtcbmV4cG9ydCBjb25zdCBET1RfV0lEVEg6IHtba2V5OiBzdHJpbmddOiBudW1iZXJ9ID0ge1xuICAgIHM6IDgsXG4gICAgbTogMTYsXG59O1xuXG4vKipcbiAqIEBhd2Z1bCBUT0RPOiByZWZhY3RvclxuICogQGludGVybmFsXG4gKiBAZHluYW1pY1xuICovXG5ARGlyZWN0aXZlKClcbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdFR1aVNsaWRlcjxUPlxuICAgIGV4dGVuZHMgQWJzdHJhY3RUdWlDb250cm9sPFQ+XG4gICAgaW1wbGVtZW50cyBUdWlXaXRoT3B0aW9uYWxNaW5NYXg8bnVtYmVyPiB7XG4gICAgQElucHV0KClcbiAgICBAdHVpRGVmYXVsdFByb3AoKVxuICAgIG1pbiA9IDA7XG5cbiAgICBASW5wdXQoKVxuICAgIEB0dWlEZWZhdWx0UHJvcCgpXG4gICAgbWF4ID0gSW5maW5pdHk7XG5cbiAgICBASW5wdXQoKVxuICAgIEB0dWlEZWZhdWx0UHJvcCgpXG4gICAgc2VnbWVudHMgPSAwO1xuXG4gICAgQElucHV0KClcbiAgICBAdHVpRGVmYXVsdFByb3AoKVxuICAgIHN0ZXBzID0gMDtcblxuICAgIEBJbnB1dCgpXG4gICAgQHR1aURlZmF1bHRQcm9wKClcbiAgICBwbHVyYWxpemU6IFR1aVBsdXJhbGl6ZSB8IG51bGwgPSBudWxsO1xuXG4gICAgQElucHV0KClcbiAgICBASG9zdEJpbmRpbmcoJ2F0dHIuZGF0YS10dWktaG9zdC1zaXplJylcbiAgICBAdHVpRGVmYXVsdFByb3AoKVxuICAgIHNpemU6IFR1aVNpemVTID0gJ20nO1xuXG4gICAgQElucHV0KClcbiAgICBAdHVpRGVmYXVsdFByb3AoKVxuICAgIGtleVN0ZXBzOiBUdWlLZXlTdGVwcyB8IG51bGwgPSBudWxsO1xuXG4gICAgZm9jdXNWaXNpYmxlTGVmdCA9IGZhbHNlO1xuXG4gICAgZm9jdXNWaXNpYmxlUmlnaHQgPSBmYWxzZTtcblxuICAgIEBWaWV3Q2hpbGQoJ2RvdExlZnQnKVxuICAgIHByb3RlY3RlZCBkb3RMZWZ0PzogRWxlbWVudFJlZjxUdWlOYXRpdmVGb2N1c2FibGVFbGVtZW50PjtcblxuICAgIEBWaWV3Q2hpbGQoJ2RvdFJpZ2h0JylcbiAgICBwcm90ZWN0ZWQgZG90UmlnaHQ/OiBFbGVtZW50UmVmPFR1aU5hdGl2ZUZvY3VzYWJsZUVsZW1lbnQ+O1xuXG4gICAgLy8gQGJhZCBUT0RPOiBoYW5kbGUgcG9pbnRlciBldmVudHMgaW5zdGVhZCBvZiBtb3VzZSBhbmQgdG91Y2ggZXZlbnRzXG4gICAgcHJpdmF0ZSBwb2ludGVyRG93biQgPSBuZXcgU3ViamVjdDxcbiAgICAgICAgVHVpRXZlbnRXaXRoPE1vdXNlRXZlbnQgfCBUb3VjaEV2ZW50LCBIVE1MRWxlbWVudD5cbiAgICA+KCk7XG5cbiAgICBwcm90ZWN0ZWQgY29uc3RydWN0b3IoXG4gICAgICAgIG5nQ29udHJvbDogTmdDb250cm9sIHwgbnVsbCxcbiAgICAgICAgY2hhbmdlRGV0ZWN0b3JSZWY6IENoYW5nZURldGVjdG9yUmVmLFxuICAgICAgICBwcml2YXRlIHJlYWRvbmx5IGRvY3VtZW50UmVmOiBEb2N1bWVudCxcbiAgICAgICAgQEluamVjdChUVUlfRlJPTV9UT19URVhUUylcbiAgICAgICAgcmVhZG9ubHkgZnJvbVRvVGV4dHMkOiBPYnNlcnZhYmxlPFtzdHJpbmcsIHN0cmluZ10+LFxuICAgICkge1xuICAgICAgICBzdXBlcihuZ0NvbnRyb2wsIGNoYW5nZURldGVjdG9yUmVmKTtcbiAgICB9XG5cbiAgICBASG9zdEJpbmRpbmcoJ2NsYXNzLl9zZWdtZW50ZWQnKVxuICAgIGdldCBzZWdtZW50ZWQoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLnNlZ21lbnRzID4gMDtcbiAgICB9XG5cbiAgICBnZXQgZGlzY3JldGUoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLnN0ZXBzID4gMDtcbiAgICB9XG5cbiAgICBnZXQgbGVuZ3RoKCk6IG51bWJlciB7XG4gICAgICAgIHJldHVybiB0aGlzLm1heCAtIHRoaXMubWluO1xuICAgIH1cblxuICAgIGdldCBpc0xlZnRGb2N1c2FibGUoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiAhdGhpcy5kaXNhYmxlZCAmJiB0aGlzLmZvY3VzYWJsZSAmJiB0aGlzLnJpZ2h0ICE9PSAxMDA7XG4gICAgfVxuXG4gICAgZ2V0IGlzUmlnaHRGb2N1c2FibGUoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiAhdGhpcy5kaXNhYmxlZCAmJiB0aGlzLmZvY3VzYWJsZSAmJiB0aGlzLmxlZnQgIT09IDEwMDtcbiAgICB9XG5cbiAgICBhYnN0cmFjdCBnZXQgbGVmdCgpOiBudW1iZXI7XG5cbiAgICBhYnN0cmFjdCBnZXQgcmlnaHQoKTogbnVtYmVyO1xuXG4gICAgbmdPbkluaXQoKSB7XG4gICAgICAgIHN1cGVyLm5nT25Jbml0KCk7XG5cbiAgICAgICAgY29uc3QgbW91c2VNb3ZlcyQgPSB0eXBlZEZyb21FdmVudCh0aGlzLmRvY3VtZW50UmVmLCAnbW91c2Vtb3ZlJyk7XG4gICAgICAgIGNvbnN0IG1vdXNlVXBzJCA9IHR5cGVkRnJvbUV2ZW50KHRoaXMuZG9jdW1lbnRSZWYsICdtb3VzZXVwJyk7XG4gICAgICAgIGNvbnN0IHRvdWNoTW92ZXMkID0gdHlwZWRGcm9tRXZlbnQodGhpcy5kb2N1bWVudFJlZiwgJ3RvdWNobW92ZScpO1xuICAgICAgICBjb25zdCB0b3VjaEVuZHMkID0gdHlwZWRGcm9tRXZlbnQodGhpcy5kb2N1bWVudFJlZiwgJ3RvdWNoZW5kJyk7XG4gICAgICAgIGxldCBpc1BvaW50ZXJEb3duUmlnaHQ6IGJvb2xlYW47XG5cbiAgICAgICAgdGhpcy5wb2ludGVyRG93biRcbiAgICAgICAgICAgIC5waXBlKFxuICAgICAgICAgICAgICAgIG1hcCgoZXZlbnQ6IE1vdXNlRXZlbnQgfCBUb3VjaEV2ZW50KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlY3QgPSAoZXZlbnQuY3VycmVudFRhcmdldCBhcyBIVE1MRWxlbWVudCkuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGNsaWVudFggPVxuICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnQgaW5zdGFuY2VvZiBNb3VzZUV2ZW50XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBldmVudC5jbGllbnRYXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBldmVudC50b3VjaGVzWzBdLmNsaWVudFg7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGZyYWN0aW9uID0gY2xhbXAoXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmdldEZyYWN0aW9uRnJvbUV2ZW50cyhyZWN0LCBjbGllbnRYKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIDAsXG4gICAgICAgICAgICAgICAgICAgICAgICAxLFxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBkZWx0YUxlZnQgPSBmcmFjdGlvbiAqIDEwMCAtIHRoaXMubGVmdDtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZGVsdGFSaWdodCA9IGZyYWN0aW9uICogMTAwIC0gMTAwICsgdGhpcy5yaWdodDtcblxuICAgICAgICAgICAgICAgICAgICBpc1BvaW50ZXJEb3duUmlnaHQgPVxuICAgICAgICAgICAgICAgICAgICAgICAgTWF0aC5hYnMoZGVsdGFMZWZ0KSA+IE1hdGguYWJzKGRlbHRhUmlnaHQpIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICBkZWx0YVJpZ2h0ID4gMCB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgKHRoaXMubGVmdCA9PT0gMCAmJiB0aGlzLnJpZ2h0ID09PSAxMDApO1xuXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGNhbGlicmF0ZWRGcmFjdGlvbiA9IGNsYW1wKFxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5nZXRDYWxpYnJhdGVkRnJhY3Rpb25Gcm9tRXZlbnRzKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlY3QsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xpZW50WCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc1BvaW50ZXJEb3duUmlnaHQsXG4gICAgICAgICAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgICAgICAgICAgMCxcbiAgICAgICAgICAgICAgICAgICAgICAgIDEsXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gdGhpcy5nZXRWYWx1ZUZyb21GcmFjdGlvbihcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZnJhY3Rpb25HdWFyZChjYWxpYnJhdGVkRnJhY3Rpb24pLFxuICAgICAgICAgICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucHJvY2Vzc1ZhbHVlKHZhbHVlLCBpc1BvaW50ZXJEb3duUmlnaHQpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnByb2Nlc3NGb2N1cyhpc1BvaW50ZXJEb3duUmlnaHQpO1xuXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiByZWN0O1xuICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAgIHN3aXRjaE1hcChyZWN0ID0+XG4gICAgICAgICAgICAgICAgICAgIHJhY2UoW3RvdWNoTW92ZXMkLCBtb3VzZU1vdmVzJF0pLnBpcGUoXG4gICAgICAgICAgICAgICAgICAgICAgICBtYXAoKGV2ZW50OiBhbnkpID0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5nZXRDYWxpYnJhdGVkRnJhY3Rpb25Gcm9tRXZlbnRzKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWN0LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudCBpbnN0YW5jZW9mIE1vdXNlRXZlbnRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gZXZlbnQuY2xpZW50WFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBldmVudC50b3VjaGVzWzBdLmNsaWVudFgsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzUG9pbnRlckRvd25SaWdodCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRha2VVbnRpbChyYWNlKFttb3VzZVVwcyQsIHRvdWNoRW5kcyRdKSksXG4gICAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICBtYXAoZnJhY3Rpb24gPT4gdGhpcy5mcmFjdGlvbkd1YXJkKGZyYWN0aW9uKSksXG4gICAgICAgICAgICApXG4gICAgICAgICAgICAuc3Vic2NyaWJlKGZyYWN0aW9uID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLnByb2Nlc3NWYWx1ZShcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5nZXRWYWx1ZUZyb21GcmFjdGlvbihmcmFjdGlvbiksXG4gICAgICAgICAgICAgICAgICAgIGlzUG9pbnRlckRvd25SaWdodCxcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgbmdPbkRlc3Ryb3koKSB7XG4gICAgICAgIHN1cGVyLm5nT25EZXN0cm95KCk7XG4gICAgICAgIHRoaXMucG9pbnRlckRvd24kLmNvbXBsZXRlKCk7XG4gICAgfVxuXG4gICAgb25Nb3VzZURvd24oZXZlbnQ6IFR1aUV2ZW50V2l0aDxNb3VzZUV2ZW50LCBIVE1MRWxlbWVudD4pIHtcbiAgICAgICAgaWYgKHRoaXMuZGlzYWJsZWQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIHRoaXMucG9pbnRlckRvd24kLm5leHQoZXZlbnQpO1xuICAgIH1cblxuICAgIG9uVG91Y2hTdGFydChldmVudDogVHVpRXZlbnRXaXRoPFRvdWNoRXZlbnQsIEhUTUxFbGVtZW50Pikge1xuICAgICAgICBpZiAodGhpcy5kaXNhYmxlZCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgdGhpcy5wb2ludGVyRG93biQubmV4dChldmVudCk7XG4gICAgfVxuXG4gICAgaXNQbHVyYWxpemVkKHBsdXJhbGl6ZTogVHVpUGx1cmFsaXplIHwgbnVsbCk6IHBsdXJhbGl6ZSBpcyBUdWlQbHVyYWxpemUge1xuICAgICAgICByZXR1cm4gcGx1cmFsaXplICE9PSBudWxsICYmIHBsdXJhbGl6ZS5sZW5ndGggPT09IDM7XG4gICAgfVxuXG4gICAgZGVjcmVtZW50KHJpZ2h0OiBib29sZWFuKSB7XG4gICAgICAgIHRoaXMucHJvY2Vzc1N0ZXAoZmFsc2UsIHJpZ2h0KTtcbiAgICB9XG5cbiAgICBpbmNyZW1lbnQocmlnaHQ6IGJvb2xlYW4pIHtcbiAgICAgICAgdGhpcy5wcm9jZXNzU3RlcCh0cnVlLCByaWdodCk7XG4gICAgfVxuXG4gICAgZ2V0U2VnbWVudExhYmVsKHNlZ21lbnQ6IG51bWJlcik6IG51bWJlciB7XG4gICAgICAgIHJldHVybiByb3VuZCh0aGlzLmdldFZhbHVlRnJvbUZyYWN0aW9uKHNlZ21lbnQgLyB0aGlzLnNlZ21lbnRzKSwgMik7XG4gICAgfVxuXG4gICAgZ2V0U2VnbWVudFByZWZpeChzZWdtZW50OiBudW1iZXIsIHRleHRzOiBbc3RyaW5nLCBzdHJpbmddKTogc3RyaW5nIHtcbiAgICAgICAgaWYgKHRoaXMuc2VnbWVudHMgIT09IDEpIHtcbiAgICAgICAgICAgIHJldHVybiAnJztcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChzZWdtZW50ID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gYCR7dGV4dHNbMF19IGA7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gYCR7dGV4dHNbMV19IGA7XG4gICAgfVxuXG4gICAgb25BY3RpdmVab25lKGFjdGl2ZTogYm9vbGVhbikge1xuICAgICAgICB0aGlzLnVwZGF0ZUZvY3VzZWQoYWN0aXZlKTtcbiAgICB9XG5cbiAgICBvbkxlZnRGb2N1c1Zpc2libGUoZm9jdXNWaXNpYmxlOiBib29sZWFuKSB7XG4gICAgICAgIHRoaXMuZm9jdXNWaXNpYmxlTGVmdCA9IGZvY3VzVmlzaWJsZTtcbiAgICB9XG5cbiAgICBvblJpZ2h0Rm9jdXNWaXNpYmxlKGZvY3VzVmlzaWJsZTogYm9vbGVhbikge1xuICAgICAgICB0aGlzLmZvY3VzVmlzaWJsZVJpZ2h0ID0gZm9jdXNWaXNpYmxlO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBhYnN0cmFjdCBwcm9jZXNzVmFsdWUodmFsdWU6IG51bWJlciwgcmlnaHQ/OiBib29sZWFuKTogdm9pZDtcblxuICAgIHByb3RlY3RlZCBhYnN0cmFjdCBwcm9jZXNzU3RlcChpbmNyZW1lbnQ6IGJvb2xlYW4sIHJpZ2h0PzogYm9vbGVhbik6IHZvaWQ7XG5cbiAgICBwcm90ZWN0ZWQgZ2V0RnJhY3Rpb25Gcm9tVmFsdWUodmFsdWU6IG51bWJlcik6IG51bWJlciB7XG4gICAgICAgIGNvbnN0IGZyYWN0aW9uID0gKHZhbHVlIC0gdGhpcy5taW4pIC8gdGhpcy5sZW5ndGg7XG5cbiAgICAgICAgcmV0dXJuIHRoaXMua2V5U3RlcHMgIT09IG51bGxcbiAgICAgICAgICAgID8gdGhpcy5mcmFjdGlvblZhbHVlS2V5U3RlcENvbnZlcnRlcih2YWx1ZSwgZmFsc2UpXG4gICAgICAgICAgICA6IGNsYW1wKE51bWJlci5pc0Zpbml0ZShmcmFjdGlvbikgPyBmcmFjdGlvbiA6IDEsIDAsIDEpO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBnZXRWYWx1ZUZyb21GcmFjdGlvbihmcmFjdGlvbjogbnVtYmVyKTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuIHRoaXMua2V5U3RlcHMgIT09IG51bGxcbiAgICAgICAgICAgID8gdGhpcy5mcmFjdGlvblZhbHVlS2V5U3RlcENvbnZlcnRlcihmcmFjdGlvbiwgdHJ1ZSlcbiAgICAgICAgICAgIDogcm91bmQoXG4gICAgICAgICAgICAgICAgICB0aGlzLmZyYWN0aW9uR3VhcmQoZnJhY3Rpb24pICogdGhpcy5sZW5ndGggKyB0aGlzLm1pbixcbiAgICAgICAgICAgICAgICAgIFRVSV9GTE9BVElOR19QUkVDSVNJT04sXG4gICAgICAgICAgICAgICk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGdldENhbGlicmF0ZWRGcmFjdGlvbkZyb21FdmVudHMoXG4gICAgICAgIHJlY3Q6IENsaWVudFJlY3QsXG4gICAgICAgIGNsaWVudFg6IG51bWJlcixcbiAgICAgICAgXzogYm9vbGVhbixcbiAgICApOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRGcmFjdGlvbkZyb21FdmVudHMocmVjdCwgY2xpZW50WCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBwcm9jZXNzRm9jdXMocmlnaHQ6IGJvb2xlYW4pIHtcbiAgICAgICAgaWYgKCF0aGlzLmZvY3VzYWJsZSB8fCAhdGhpcy5kb3RSaWdodCB8fCAhdGhpcy5kb3RMZWZ0KSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocmlnaHQpIHtcbiAgICAgICAgICAgIHNldE5hdGl2ZUZvY3VzZWQodGhpcy5kb3RSaWdodC5uYXRpdmVFbGVtZW50KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHNldE5hdGl2ZUZvY3VzZWQodGhpcy5kb3RMZWZ0Lm5hdGl2ZUVsZW1lbnQpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRnVuY3Rpb24gZm9yIGNvbnZlcnRpbmcgdGhlIGZ1bGxuZXNzIG9mIHRoZSBzbGlkZXIgdG8gYSB2YWx1ZSBhbmQgdmljZSB2ZXJzYVxuICAgICAqIHRha2luZyBpbnRvIGFjY291bnQgdGhlIHN0ZXBzIG9mIGxpbmVhciBkZXBlbmRlbmNlLlxuICAgICAqXG4gICAgICogQHBhcmFtIHZhbHVlIHBhc3NlZCB2YWx1ZVxuICAgICAqIEBwYXJhbSBpc0ZyYWN0aW9uIHRyYW5zbGF0aW9uIGlzIGNhcnJpZWQgb3V0IGZyb20gZnVsbG5lc3MgdG8gdmFsdWVcbiAgICAgKi9cbiAgICBwcml2YXRlIGZyYWN0aW9uVmFsdWVLZXlTdGVwQ29udmVydGVyKHZhbHVlOiBudW1iZXIsIGlzRnJhY3Rpb246IGJvb2xlYW4pOiBudW1iZXIge1xuICAgICAgICBjb25zdCBzdGVwcyA9IFtbMCwgdGhpcy5taW5dXS5jb25jYXQodGhpcy5rZXlTdGVwcyBhcyBUdWlLZXlTdGVwcywgW1xuICAgICAgICAgICAgWzEwMCwgdGhpcy5tYXhdLFxuICAgICAgICBdKTtcblxuICAgICAgICBsZXQgcHJldkZyYWN0aW9uID0gMDtcbiAgICAgICAgbGV0IG5leHRGcmFjdGlvbiA9IDEwMDtcbiAgICAgICAgbGV0IHByZXZWYWx1ZSA9IHRoaXMubWluO1xuICAgICAgICBsZXQgbmV4dFZhbHVlID0gdGhpcy5tYXg7XG5cbiAgICAgICAgZm9yIChsZXQgaSA9IDE7IGkgPCBzdGVwcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgIChpc0ZyYWN0aW9uICYmIHN0ZXBzW2ldWzBdIC8gMTAwID4gdmFsdWUpIHx8XG4gICAgICAgICAgICAgICAgKCFpc0ZyYWN0aW9uICYmIHN0ZXBzW2ldWzFdID4gdmFsdWUpXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICBwcmV2RnJhY3Rpb24gPSBzdGVwc1tpIC0gMV1bMF0gfHwgMDtcbiAgICAgICAgICAgICAgICBuZXh0RnJhY3Rpb24gPSBzdGVwc1tpXVswXTtcbiAgICAgICAgICAgICAgICBwcmV2VmFsdWUgPSBzdGVwc1tpIC0gMV1bMV07XG4gICAgICAgICAgICAgICAgbmV4dFZhbHVlID0gc3RlcHNbaV1bMV07XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBkZWx0YUZyYWN0aW9uID0gbmV4dEZyYWN0aW9uIC0gcHJldkZyYWN0aW9uO1xuICAgICAgICBjb25zdCBkZWx0YVZhbHVlID0gbmV4dFZhbHVlIC0gcHJldlZhbHVlO1xuXG4gICAgICAgIHJldHVybiBpc0ZyYWN0aW9uXG4gICAgICAgICAgICA/IHJvdW5kKFxuICAgICAgICAgICAgICAgICAgKCh2YWx1ZSAqIDEwMCAtIHByZXZGcmFjdGlvbikgLyBkZWx0YUZyYWN0aW9uKSAqIGRlbHRhVmFsdWUgKyBwcmV2VmFsdWUsXG4gICAgICAgICAgICAgICAgICBUVUlfRkxPQVRJTkdfUFJFQ0lTSU9OLFxuICAgICAgICAgICAgICApXG4gICAgICAgICAgICA6IGNsYW1wKFxuICAgICAgICAgICAgICAgICAgKCh2YWx1ZSAtIHByZXZWYWx1ZSkgLyBkZWx0YVZhbHVlKSAqIGRlbHRhRnJhY3Rpb24gKyBwcmV2RnJhY3Rpb24sXG4gICAgICAgICAgICAgICAgICAwLFxuICAgICAgICAgICAgICAgICAgMTAwLFxuICAgICAgICAgICAgICApIC8gMTAwO1xuICAgIH1cblxuICAgIHByaXZhdGUgZnJhY3Rpb25HdWFyZChmcmFjdGlvbjogbnVtYmVyKTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZGlzY3JldGVcbiAgICAgICAgICAgID8gY2xhbXAocXVhbnRpemUoZnJhY3Rpb24sIDEgLyB0aGlzLnN0ZXBzKSwgMCwgMSlcbiAgICAgICAgICAgIDogY2xhbXAoZnJhY3Rpb24sIDAsIDEpO1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0RnJhY3Rpb25Gcm9tRXZlbnRzKHJlY3Q6IENsaWVudFJlY3QsIGNsaWVudFg6IG51bWJlcik6IG51bWJlciB7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gY2xpZW50WCAtIHJlY3QubGVmdCAtIERPVF9XSURUSFt0aGlzLnNpemVdIC8gMjtcbiAgICAgICAgY29uc3QgdG90YWwgPSByZWN0LndpZHRoIC0gRE9UX1dJRFRIW3RoaXMuc2l6ZV07XG5cbiAgICAgICAgcmV0dXJuIHJvdW5kKHZhbHVlIC8gdG90YWwsIFRVSV9GTE9BVElOR19QUkVDSVNJT04pO1xuICAgIH1cbn1cbiJdfQ==