UNPKG

@taiga-ui/kit

Version:
247 lines • 34.3 kB
import { __decorate, __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 const SLIDER_KEYBOARD_STEP = 0.05; export const DOT_WIDTH = { s: 8, m: 16, }; /** * @awful TODO: refactor * @internal * @dynamic */ let AbstractTuiSlider = class AbstractTuiSlider extends AbstractTuiControl { constructor(ngControl, changeDetectorRef, documentRef, fromToTexts$) { super(ngControl, changeDetectorRef); 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(); } get segmented() { return this.segments > 0; } get discrete() { return this.steps > 0; } get length() { return this.max - this.min; } get isLeftFocusable() { return !this.disabled && this.focusable && this.right !== 100; } get isRightFocusable() { return !this.disabled && this.focusable && this.left !== 100; } ngOnInit() { super.ngOnInit(); const mouseMoves$ = typedFromEvent(this.documentRef, 'mousemove'); const mouseUps$ = typedFromEvent(this.documentRef, 'mouseup'); const touchMoves$ = typedFromEvent(this.documentRef, 'touchmove'); const touchEnds$ = typedFromEvent(this.documentRef, 'touchend'); let isPointerDownRight; this.pointerDown$ .pipe(map((event) => { const rect = event.currentTarget.getBoundingClientRect(); const clientX = event instanceof MouseEvent ? event.clientX : event.touches[0].clientX; const fraction = clamp(this.getFractionFromEvents(rect, clientX), 0, 1); const deltaLeft = fraction * 100 - this.left; const deltaRight = fraction * 100 - 100 + this.right; isPointerDownRight = Math.abs(deltaLeft) > Math.abs(deltaRight) || deltaRight > 0 || (this.left === 0 && this.right === 100); const calibratedFraction = clamp(this.getCalibratedFractionFromEvents(rect, clientX, isPointerDownRight), 0, 1); const value = this.getValueFromFraction(this.fractionGuard(calibratedFraction)); this.processValue(value, isPointerDownRight); this.processFocus(isPointerDownRight); return rect; }), switchMap(rect => race([touchMoves$, mouseMoves$]).pipe(map((event) => this.getCalibratedFractionFromEvents(rect, event instanceof MouseEvent ? event.clientX : event.touches[0].clientX, isPointerDownRight)), takeUntil(race([mouseUps$, touchEnds$])))), map(fraction => this.fractionGuard(fraction))) .subscribe(fraction => { this.processValue(this.getValueFromFraction(fraction), isPointerDownRight); }); } ngOnDestroy() { super.ngOnDestroy(); this.pointerDown$.complete(); } onMouseDown(event) { if (this.disabled) { return; } event.preventDefault(); this.pointerDown$.next(event); } onTouchStart(event) { if (this.disabled) { return; } event.preventDefault(); this.pointerDown$.next(event); } isPluralized(pluralize) { return pluralize !== null && pluralize.length === 3; } decrement(right) { this.processStep(false, right); } increment(right) { this.processStep(true, right); } getSegmentLabel(segment) { return round(this.getValueFromFraction(segment / this.segments), 2); } getSegmentPrefix(segment, texts) { if (this.segments !== 1) { return ''; } if (segment === 0) { return `${texts[0]} `; } return `${texts[1]} `; } onActiveZone(active) { this.updateFocused(active); } onLeftFocusVisible(focusVisible) { this.focusVisibleLeft = focusVisible; } onRightFocusVisible(focusVisible) { this.focusVisibleRight = focusVisible; } getFractionFromValue(value) { const fraction = (value - this.min) / this.length; return this.keySteps !== null ? this.fractionValueKeyStepConverter(value, false) : clamp(Number.isFinite(fraction) ? fraction : 1, 0, 1); } getValueFromFraction(fraction) { return this.keySteps !== null ? this.fractionValueKeyStepConverter(fraction, true) : round(this.fractionGuard(fraction) * this.length + this.min, TUI_FLOATING_PRECISION); } getCalibratedFractionFromEvents(rect, clientX, _) { return this.getFractionFromEvents(rect, clientX); } processFocus(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 */ fractionValueKeyStepConverter(value, isFraction) { const steps = [[0, this.min]].concat(this.keySteps, [ [100, this.max], ]); let prevFraction = 0; let nextFraction = 100; let prevValue = this.min; let nextValue = this.max; for (let 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; } } const deltaFraction = nextFraction - prevFraction; const deltaValue = nextValue - prevValue; return isFraction ? round(((value * 100 - prevFraction) / deltaFraction) * deltaValue + prevValue, TUI_FLOATING_PRECISION) : clamp(((value - prevValue) / deltaValue) * deltaFraction + prevFraction, 0, 100) / 100; } fractionGuard(fraction) { return this.discrete ? clamp(quantize(fraction, 1 / this.steps), 0, 1) : clamp(fraction, 0, 1); } getFractionFromEvents(rect, clientX) { const value = clientX - rect.left - DOT_WIDTH[this.size] / 2; const total = rect.width - DOT_WIDTH[this.size]; return round(value / total, TUI_FLOATING_PRECISION); } }; AbstractTuiSlider.ctorParameters = () => [ { 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); export { AbstractTuiSlider }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2xpZGVyLmpzIiwic291cmNlUm9vdCI6Im5nOi8vQHRhaWdhLXVpL2tpdC9hYnN0cmFjdC8iLCJzb3VyY2VzIjpbInNsaWRlci9zbGlkZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sRUFDSCxpQkFBaUIsRUFDakIsU0FBUyxFQUNULFVBQVUsRUFDVixXQUFXLEVBQ1gsTUFBTSxFQUNOLEtBQUssRUFDTCxTQUFTLEdBQ1osTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFDLFNBQVMsRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBQ3pDLE9BQU8sRUFDSCxrQkFBa0IsRUFDbEIsS0FBSyxFQUNMLFFBQVEsRUFDUixLQUFLLEVBQ0wsZ0JBQWdCLEVBQ2hCLGNBQWMsRUFHZCxjQUFjLEdBQ2pCLE1BQU0sZUFBZSxDQUFDO0FBRXZCLE9BQU8sRUFBQyxzQkFBc0IsRUFBQyxNQUFNLHlCQUF5QixDQUFDO0FBQy9ELE9BQU8sRUFBQyxpQkFBaUIsRUFBQyxNQUFNLHNCQUFzQixDQUFDO0FBRXZELE9BQU8sRUFBQyxVQUFVLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBQyxNQUFNLE1BQU0sQ0FBQztBQUMvQyxPQUFPLEVBQUMsR0FBRyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUV6RCxNQUFNLENBQUMsTUFBTSxvQkFBb0IsR0FBRyxJQUFJLENBQUM7QUFDekMsTUFBTSxDQUFDLE1BQU0sU0FBUyxHQUE0QjtJQUM5QyxDQUFDLEVBQUUsQ0FBQztJQUNKLENBQUMsRUFBRSxFQUFFO0NBQ1IsQ0FBQztBQUVGOzs7O0dBSUc7QUFFSCxJQUFzQixpQkFBaUIsR0FBdkMsTUFBc0IsaUJBQ2xCLFNBQVEsa0JBQXFCO0lBOEM3QixZQUNJLFNBQTJCLEVBQzNCLGlCQUFvQyxFQUNuQixXQUFxQixFQUU3QixZQUEwQztRQUVuRCxLQUFLLENBQUMsU0FBUyxFQUFFLGlCQUFpQixDQUFDLENBQUM7UUFKbkIsZ0JBQVcsR0FB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Q0FBQyxDQUFBO0dBbkRaLGlCQUFpQixDQTJUdEM7U0EzVHFCLGlCQUFpQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gICAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gICAgRGlyZWN0aXZlLFxuICAgIEVsZW1lbnRSZWYsXG4gICAgSG9zdEJpbmRpbmcsXG4gICAgSW5qZWN0LFxuICAgIElucHV0LFxuICAgIFZpZXdDaGlsZCxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge05nQ29udHJvbH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHtcbiAgICBBYnN0cmFjdFR1aUNvbnRyb2wsXG4gICAgY2xhbXAsXG4gICAgcXVhbnRpemUsXG4gICAgcm91bmQsXG4gICAgc2V0TmF0aXZlRm9jdXNlZCxcbiAgICB0dWlEZWZhdWx0UHJvcCxcbiAgICBUdWlFdmVudFdpdGgsXG4gICAgVHVpTmF0aXZlRm9jdXNhYmxlRWxlbWVudCxcbiAgICB0eXBlZEZyb21FdmVudCxcbn0gZnJvbSAnQHRhaWdhLXVpL2Nkayc7XG5pbXBvcnQge1R1aVBsdXJhbGl6ZSwgVHVpU2l6ZVMsIFR1aVdpdGhPcHRpb25hbE1pbk1heH0gZnJvbSAnQHRhaWdhLXVpL2NvcmUnO1xuaW1wb3J0IHtUVUlfRkxPQVRJTkdfUFJFQ0lTSU9OfSBmcm9tICdAdGFpZ2EtdWkva2l0L2NvbnN0YW50cyc7XG5pbXBvcnQge1RVSV9GUk9NX1RPX1RFWFRTfSBmcm9tICdAdGFpZ2EtdWkva2l0L3Rva2Vucyc7XG5pbXBvcnQge1R1aUtleVN0ZXBzfSBmcm9tICdAdGFpZ2EtdWkva2l0L3R5cGVzJztcbmltcG9ydCB7T2JzZXJ2YWJsZSwgcmFjZSwgU3ViamVjdH0gZnJvbSAncnhqcyc7XG5pbXBvcnQge21hcCwgc3dpdGNoTWFwLCB0YWtlVW50aWx9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcblxuZXhwb3J0IGNvbnN0IFNMSURFUl9LRVlCT0FSRF9TVEVQID0gMC4wNTtcbmV4cG9ydCBjb25zdCBET1RfV0lEVEg6IHtba2V5OiBzdHJpbmddOiBudW1iZXJ9ID0ge1xuICAgIHM6IDgsXG4gICAgbTogMTYsXG59O1xuXG4vKipcbiAqIEBhd2Z1bCBUT0RPOiByZWZhY3RvclxuICogQGludGVybmFsXG4gKiBAZHluYW1pY1xuICovXG5ARGlyZWN0aXZlKClcbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdFR1aVNsaWRlcjxUPlxuICAgIGV4dGVuZHMgQWJzdHJhY3RUdWlDb250cm9sPFQ+XG4gICAgaW1wbGVtZW50cyBUdWlXaXRoT3B0aW9uYWxNaW5NYXg8bnVtYmVyPiB7XG4gICAgQElucHV0KClcbiAgICBAdHVpRGVmYXVsdFByb3AoKVxuICAgIG1pbiA9IDA7XG5cbiAgICBASW5wdXQoKVxuICAgIEB0dWlEZWZhdWx0UHJvcCgpXG4gICAgbWF4ID0gSW5maW5pdHk7XG5cbiAgICBASW5wdXQoKVxuICAgIEB0dWlEZWZhdWx0UHJvcCgpXG4gICAgc2VnbWVudHMgPSAwO1xuXG4gICAgQElucHV0KClcbiAgICBAdHVpRGVmYXVsdFByb3AoKVxuICAgIHN0ZXBzID0gMDtcblxuICAgIEBJbnB1dCgpXG4gICAgQHR1aURlZmF1bHRQcm9wKClcbiAgICBwbHVyYWxpemU6IFR1aVBsdXJhbGl6ZSB8IG51bGwgPSBudWxsO1xuXG4gICAgQElucHV0KClcbiAgICBASG9zdEJpbmRpbmcoJ2F0dHIuZGF0YS10dWktaG9zdC1zaXplJylcbiAgICBAdHVpRGVmYXVsdFByb3AoKVxuICAgIHNpemU6IFR1aVNpemVTID0gJ20nO1xuXG4gICAgQElucHV0KClcbiAgICBAdHVpRGVmYXVsdFByb3AoKVxuICAgIGtleVN0ZXBzOiBUdWlLZXlTdGVwcyB8IG51bGwgPSBudWxsO1xuXG4gICAgZm9jdXNWaXNpYmxlTGVmdCA9IGZhbHNlO1xuXG4gICAgZm9jdXNWaXNpYmxlUmlnaHQgPSBmYWxzZTtcblxuICAgIEBWaWV3Q2hpbGQoJ2RvdExlZnQnKVxuICAgIHByb3RlY3RlZCBkb3RMZWZ0PzogRWxlbWVudFJlZjxUdWlOYXRpdmVGb2N1c2FibGVFbGVtZW50PjtcblxuICAgIEBWaWV3Q2hpbGQoJ2RvdFJpZ2h0JylcbiAgICBwcm90ZWN0ZWQgZG90UmlnaHQ/OiBFbGVtZW50UmVmPFR1aU5hdGl2ZUZvY3VzYWJsZUVsZW1lbnQ+O1xuXG4gICAgLy8gQGJhZCBUT0RPOiBoYW5kbGUgcG9pbnRlciBldmVudHMgaW5zdGVhZCBvZiBtb3VzZSBhbmQgdG91Y2ggZXZlbnRzXG4gICAgcHJpdmF0ZSBwb2ludGVyRG93biQgPSBuZXcgU3ViamVjdDxcbiAgICAgICAgVHVpRXZlbnRXaXRoPE1vdXNlRXZlbnQgfCBUb3VjaEV2ZW50LCBIVE1MRWxlbWVudD5cbiAgICA+KCk7XG5cbiAgICBwcm90ZWN0ZWQgY29uc3RydWN0b3IoXG4gICAgICAgIG5nQ29udHJvbDogTmdDb250cm9sIHwgbnVsbCxcbiAgICAgICAgY2hhbmdlRGV0ZWN0b3JSZWY6IENoYW5nZURldGVjdG9yUmVmLFxuICAgICAgICBwcml2YXRlIHJlYWRvbmx5IGRvY3VtZW50UmVmOiBEb2N1bWVudCxcbiAgICAgICAgQEluamVjdChUVUlfRlJPTV9UT19URVhUUylcbiAgICAgICAgcmVhZG9ubHkgZnJvbVRvVGV4dHMkOiBPYnNlcnZhYmxlPFtzdHJpbmcsIHN0cmluZ10+LFxuICAgICkge1xuICAgICAgICBzdXBlcihuZ0NvbnRyb2wsIGNoYW5nZURldGVjdG9yUmVmKTtcbiAgICB9XG5cbiAgICBASG9zdEJpbmRpbmcoJ2NsYXNzLl9zZWdtZW50ZWQnKVxuICAgIGdldCBzZWdtZW50ZWQoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLnNlZ21lbnRzID4gMDtcbiAgICB9XG5cbiAgICBnZXQgZGlzY3JldGUoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLnN0ZXBzID4gMDtcbiAgICB9XG5cbiAgICBnZXQgbGVuZ3RoKCk6IG51bWJlciB7XG4gICAgICAgIHJldHVybiB0aGlzLm1heCAtIHRoaXMubWluO1xuICAgIH1cblxuICAgIGdldCBpc0xlZnRGb2N1c2FibGUoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiAhdGhpcy5kaXNhYmxlZCAmJiB0aGlzLmZvY3VzYWJsZSAmJiB0aGlzLnJpZ2h0ICE9PSAxMDA7XG4gICAgfVxuXG4gICAgZ2V0IGlzUmlnaHRGb2N1c2FibGUoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiAhdGhpcy5kaXNhYmxlZCAmJiB0aGlzLmZvY3VzYWJsZSAmJiB0aGlzLmxlZnQgIT09IDEwMDtcbiAgICB9XG5cbiAgICBhYnN0cmFjdCBnZXQgbGVmdCgpOiBudW1iZXI7XG5cbiAgICBhYnN0cmFjdCBnZXQgcmlnaHQoKTogbnVtYmVyO1xuXG4gICAgbmdPbkluaXQoKSB7XG4gICAgICAgIHN1cGVyLm5nT25Jbml0KCk7XG5cbiAgICAgICAgY29uc3QgbW91c2VNb3ZlcyQgPSB0eXBlZEZyb21FdmVudCh0aGlzLmRvY3VtZW50UmVmLCAnbW91c2Vtb3ZlJyk7XG4gICAgICAgIGNvbnN0IG1vdXNlVXBzJCA9IHR5cGVkRnJvbUV2ZW50KHRoaXMuZG9jdW1lbnRSZWYsICdtb3VzZXVwJyk7XG4gICAgICAgIGNvbnN0IHRvdWNoTW92ZXMkID0gdHlwZWRGcm9tRXZlbnQodGhpcy5kb2N1bWVudFJlZiwgJ3RvdWNobW92ZScpO1xuICAgICAgICBjb25zdCB0b3VjaEVuZHMkID0gdHlwZWRGcm9tRXZlbnQodGhpcy5kb2N1bWVudFJlZiwgJ3RvdWNoZW5kJyk7XG4gICAgICAgIGxldCBpc1BvaW50ZXJEb3duUmlnaHQ6IGJvb2xlYW47XG5cbiAgICAgICAgdGhpcy5wb2ludGVyRG93biRcbiAgICAgICAgICAgIC5waXBlKFxuICAgICAgICAgICAgICAgIG1hcCgoZXZlbnQ6IE1vdXNlRXZlbnQgfCBUb3VjaEV2ZW50KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlY3QgPSAoZXZlbnQuY3VycmVudFRhcmdldCBhcyBIVE1MRWxlbWVudCkuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGNsaWVudFggPVxuICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnQgaW5zdGFuY2VvZiBNb3VzZUV2ZW50XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBldmVudC5jbGllbnRYXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBldmVudC50b3VjaGVzWzBdLmNsaWVudFg7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGZyYWN0aW9uID0gY2xhbXAoXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmdldEZyYWN0aW9uRnJvbUV2ZW50cyhyZWN0LCBjbGllbnRYKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIDAsXG4gICAgICAgICAgICAgICAgICAgICAgICAxLFxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBkZWx0YUxlZnQgPSBmcmFjdGlvbiAqIDEwMCAtIHRoaXMubGVmdDtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZGVsdGFSaWdodCA9IGZyYWN0aW9uICogMTAwIC0gMTAwICsgdGhpcy5yaWdodDtcblxuICAgICAgICAgICAgICAgICAgICBpc1BvaW50ZXJEb3duUmlnaHQgPVxuICAgICAgICAgICAgICAgICAgICAgICAgTWF0aC5hYnMoZGVsdGFMZWZ0KSA+IE1hdGguYWJzKGRlbHRhUmlnaHQpIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICBkZWx0YVJpZ2h0ID4gMCB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgKHRoaXMubGVmdCA9PT0gMCAmJiB0aGlzLnJpZ2h0ID09PSAxMDApO1xuXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGNhbGlicmF0ZWRGcmFjdGlvbiA9IGNsYW1wKFxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5nZXRDYWxpYnJhdGVkRnJhY3Rpb25Gcm9tRXZlbnRzKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlY3QsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xpZW50WCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc1BvaW50ZXJEb3duUmlnaHQsXG4gICAgICAgICAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgICAgICAgICAgMCxcbiAgICAgICAgICAgICAgICAgICAgICAgIDEsXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gdGhpcy5nZXRWYWx1ZUZyb21GcmFjdGlvbihcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZnJhY3Rpb25HdWFyZChjYWxpYnJhdGVkRnJhY3Rpb24pLFxuICAgICAgICAgICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucHJvY2Vzc1ZhbHVlKHZhbHVlLCBpc1BvaW50ZXJEb3duUmlnaHQpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnByb2Nlc3NGb2N1cyhpc1BvaW50ZXJEb3duUmlnaHQpO1xuXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiByZWN0O1xuICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAgIHN3aXRjaE1hcChyZWN0ID0+XG4gICAgICAgICAgICAgICAgICAgIHJhY2UoW3RvdWNoTW92ZXMkLCBtb3VzZU1vdmVzJF0pLnBpcGUoXG4gICAgICAgICAgICAgICAgICAgICAgICBtYXAoKGV2ZW50OiBhbnkpID0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5nZXRDYWxpYnJhdGVkRnJhY3Rpb25Gcm9tRXZlbnRzKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWN0LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudCBpbnN0YW5jZW9mIE1vdXNlRXZlbnRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gZXZlbnQuY2xpZW50WFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBldmVudC50b3VjaGVzWzBdLmNsaWVudFgsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzUG9pbnRlckRvd25SaWdodCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRha2VVbnRpbChyYWNlKFttb3VzZVVwcyQsIHRvdWNoRW5kcyRdKSksXG4gICAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICBtYXAoZnJhY3Rpb24gPT4gdGhpcy5mcmFjdGlvbkd1YXJkKGZyYWN0aW9uKSksXG4gICAgICAgICAgICApXG4gICAgICAgICAgICAuc3Vic2NyaWJlKGZyYWN0aW9uID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLnByb2Nlc3NWYWx1ZShcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5nZXRWYWx1ZUZyb21GcmFjdGlvbihmcmFjdGlvbiksXG4gICAgICAgICAgICAgICAgICAgIGlzUG9pbnRlckRvd25SaWdodCxcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgbmdPbkRlc3Ryb3koKSB7XG4gICAgICAgIHN1cGVyLm5nT25EZXN0cm95KCk7XG4gICAgICAgIHRoaXMucG9pbnRlckRvd24kLmNvbXBsZXRlKCk7XG4gICAgfVxuXG4gICAgb25Nb3VzZURvd24oZXZlbnQ6IFR1aUV2ZW50V2l0aDxNb3VzZUV2ZW50LCBIVE1MRWxlbWVudD4pIHtcbiAgICAgICAgaWYgKHRoaXMuZGlzYWJsZWQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIHRoaXMucG9pbnRlckRvd24kLm5leHQoZXZlbnQpO1xuICAgIH1cblxuICAgIG9uVG91Y2hTdGFydChldmVudDogVHVpRXZlbnRXaXRoPFRvdWNoRXZlbnQsIEhUTUxFbGVtZW50Pikge1xuICAgICAgICBpZiAodGhpcy5kaXNhYmxlZCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgdGhpcy5wb2ludGVyRG93biQubmV4dChldmVudCk7XG4gICAgfVxuXG4gICAgaXNQbHVyYWxpemVkKHBsdXJhbGl6ZTogVHVpUGx1cmFsaXplIHwgbnVsbCk6IHBsdXJhbGl6ZSBpcyBUdWlQbHVyYWxpemUge1xuICAgICAgICByZXR1cm4gcGx1cmFsaXplICE9PSBudWxsICYmIHBsdXJhbGl6ZS5sZW5ndGggPT09IDM7XG4gICAgfVxuXG4gICAgZGVjcmVtZW50KHJpZ2h0OiBib29sZWFuKSB7XG4gICAgICAgIHRoaXMucHJvY2Vzc1N0ZXAoZmFsc2UsIHJpZ2h0KTtcbiAgICB9XG5cbiAgICBpbmNyZW1lbnQocmlnaHQ6IGJvb2xlYW4pIHtcbiAgICAgICAgdGhpcy5wcm9jZXNzU3RlcCh0cnVlLCByaWdodCk7XG4gICAgfVxuXG4gICAgZ2V0U2VnbWVudExhYmVsKHNlZ21lbnQ6IG51bWJlcik6IG51bWJlciB7XG4gICAgICAgIHJldHVybiByb3VuZCh0aGlzLmdldFZhbHVlRnJvbUZyYWN0aW9uKHNlZ21lbnQgLyB0aGlzLnNlZ21lbnRzKSwgMik7XG4gICAgfVxuXG4gICAgZ2V0U2VnbWVudFByZWZpeChzZWdtZW50OiBudW1iZXIsIHRleHRzOiBbc3RyaW5nLCBzdHJpbmddKTogc3RyaW5nIHtcbiAgICAgICAgaWYgKHRoaXMuc2VnbWVudHMgIT09IDEpIHtcbiAgICAgICAgICAgIHJldHVybiAnJztcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChzZWdtZW50ID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gYCR7dGV4dHNbMF19IGA7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gYCR7dGV4dHNbMV19IGA7XG4gICAgfVxuXG4gICAgb25BY3RpdmVab25lKGFjdGl2ZTogYm9vbGVhbikge1xuICAgICAgICB0aGlzLnVwZGF0ZUZvY3VzZWQoYWN0aXZlKTtcbiAgICB9XG5cbiAgICBvbkxlZnRGb2N1c1Zpc2libGUoZm9jdXNWaXNpYmxlOiBib29sZWFuKSB7XG4gICAgICAgIHRoaXMuZm9jdXNWaXNpYmxlTGVmdCA9IGZvY3VzVmlzaWJsZTtcbiAgICB9XG5cbiAgICBvblJpZ2h0Rm9jdXNWaXNpYmxlKGZvY3VzVmlzaWJsZTogYm9vbGVhbikge1xuICAgICAgICB0aGlzLmZvY3VzVmlzaWJsZVJpZ2h0ID0gZm9jdXNWaXNpYmxlO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBhYnN0cmFjdCBwcm9jZXNzVmFsdWUodmFsdWU6IG51bWJlciwgcmlnaHQ/OiBib29sZWFuKTogdm9pZDtcblxuICAgIHByb3RlY3RlZCBhYnN0cmFjdCBwcm9jZXNzU3RlcChpbmNyZW1lbnQ6IGJvb2xlYW4sIHJpZ2h0PzogYm9vbGVhbik6IHZvaWQ7XG5cbiAgICBwcm90ZWN0ZWQgZ2V0RnJhY3Rpb25Gcm9tVmFsdWUodmFsdWU6IG51bWJlcik6IG51bWJlciB7XG4gICAgICAgIGNvbnN0IGZyYWN0aW9uID0gKHZhbHVlIC0gdGhpcy5taW4pIC8gdGhpcy5sZW5ndGg7XG5cbiAgICAgICAgcmV0dXJuIHRoaXMua2V5U3RlcHMgIT09IG51bGxcbiAgICAgICAgICAgID8gdGhpcy5mcmFjdGlvblZhbHVlS2V5U3RlcENvbnZlcnRlcih2YWx1ZSwgZmFsc2UpXG4gICAgICAgICAgICA6IGNsYW1wKE51bWJlci5pc0Zpbml0ZShmcmFjdGlvbikgPyBmcmFjdGlvbiA6IDEsIDAsIDEpO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBnZXRWYWx1ZUZyb21GcmFjdGlvbihmcmFjdGlvbjogbnVtYmVyKTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuIHRoaXMua2V5U3RlcHMgIT09IG51bGxcbiAgICAgICAgICAgID8gdGhpcy5mcmFjdGlvblZhbHVlS2V5U3RlcENvbnZlcnRlcihmcmFjdGlvbiwgdHJ1ZSlcbiAgICAgICAgICAgIDogcm91bmQoXG4gICAgICAgICAgICAgICAgICB0aGlzLmZyYWN0aW9uR3VhcmQoZnJhY3Rpb24pICogdGhpcy5sZW5ndGggKyB0aGlzLm1pbixcbiAgICAgICAgICAgICAgICAgIFRVSV9GTE9BVElOR19QUkVDSVNJT04sXG4gICAgICAgICAgICAgICk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGdldENhbGlicmF0ZWRGcmFjdGlvbkZyb21FdmVudHMoXG4gICAgICAgIHJlY3Q6IENsaWVudFJlY3QsXG4gICAgICAgIGNsaWVudFg6IG51bWJlcixcbiAgICAgICAgXzogYm9vbGVhbixcbiAgICApOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRGcmFjdGlvbkZyb21FdmVudHMocmVjdCwgY2xpZW50WCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBwcm9jZXNzRm9jdXMocmlnaHQ6IGJvb2xlYW4pIHtcbiAgICAgICAgaWYgKCF0aGlzLmZvY3VzYWJsZSB8fCAhdGhpcy5kb3RSaWdodCB8fCAhdGhpcy5kb3RMZWZ0KSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocmlnaHQpIHtcbiAgICAgICAgICAgIHNldE5hdGl2ZUZvY3VzZWQodGhpcy5kb3RSaWdodC5uYXRpdmVFbGVtZW50KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHNldE5hdGl2ZUZvY3VzZWQodGhpcy5kb3RMZWZ0Lm5hdGl2ZUVsZW1lbnQpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRnVuY3Rpb24gZm9yIGNvbnZlcnRpbmcgdGhlIGZ1bGxuZXNzIG9mIHRoZSBzbGlkZXIgdG8gYSB2YWx1ZSBhbmQgdmljZSB2ZXJzYVxuICAgICAqIHRha2luZyBpbnRvIGFjY291bnQgdGhlIHN0ZXBzIG9mIGxpbmVhciBkZXBlbmRlbmNlLlxuICAgICAqXG4gICAgICogQHBhcmFtIHZhbHVlIHBhc3NlZCB2YWx1ZVxuICAgICAqIEBwYXJhbSBpc0ZyYWN0aW9uIHRyYW5zbGF0aW9uIGlzIGNhcnJpZWQgb3V0IGZyb20gZnVsbG5lc3MgdG8gdmFsdWVcbiAgICAgKi9cbiAgICBwcml2YXRlIGZyYWN0aW9uVmFsdWVLZXlTdGVwQ29udmVydGVyKHZhbHVlOiBudW1iZXIsIGlzRnJhY3Rpb246IGJvb2xlYW4pOiBudW1iZXIge1xuICAgICAgICBjb25zdCBzdGVwcyA9IFtbMCwgdGhpcy5taW5dXS5jb25jYXQodGhpcy5rZXlTdGVwcyBhcyBUdWlLZXlTdGVwcywgW1xuICAgICAgICAgICAgWzEwMCwgdGhpcy5tYXhdLFxuICAgICAgICBdKTtcblxuICAgICAgICBsZXQgcHJldkZyYWN0aW9uID0gMDtcbiAgICAgICAgbGV0IG5leHRGcmFjdGlvbiA9IDEwMDtcbiAgICAgICAgbGV0IHByZXZWYWx1ZSA9IHRoaXMubWluO1xuICAgICAgICBsZXQgbmV4dFZhbHVlID0gdGhpcy5tYXg7XG5cbiAgICAgICAgZm9yIChsZXQgaSA9IDE7IGkgPCBzdGVwcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgIChpc0ZyYWN0aW9uICYmIHN0ZXBzW2ldWzBdIC8gMTAwID4gdmFsdWUpIHx8XG4gICAgICAgICAgICAgICAgKCFpc0ZyYWN0aW9uICYmIHN0ZXBzW2ldWzFdID4gdmFsdWUpXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICBwcmV2RnJhY3Rpb24gPSBzdGVwc1tpIC0gMV1bMF0gfHwgMDtcbiAgICAgICAgICAgICAgICBuZXh0RnJhY3Rpb24gPSBzdGVwc1tpXVswXTtcbiAgICAgICAgICAgICAgICBwcmV2VmFsdWUgPSBzdGVwc1tpIC0gMV1bMV07XG4gICAgICAgICAgICAgICAgbmV4dFZhbHVlID0gc3RlcHNbaV1bMV07XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBkZWx0YUZyYWN0aW9uID0gbmV4dEZyYWN0aW9uIC0gcHJldkZyYWN0aW9uO1xuICAgICAgICBjb25zdCBkZWx0YVZhbHVlID0gbmV4dFZhbHVlIC0gcHJldlZhbHVlO1xuXG4gICAgICAgIHJldHVybiBpc0ZyYWN0aW9uXG4gICAgICAgICAgICA/IHJvdW5kKFxuICAgICAgICAgICAgICAgICAgKCh2YWx1ZSAqIDEwMCAtIHByZXZGcmFjdGlvbikgLyBkZWx0YUZyYWN0aW9uKSAqIGRlbHRhVmFsdWUgKyBwcmV2VmFsdWUsXG4gICAgICAgICAgICAgICAgICBUVUlfRkxPQVRJTkdfUFJFQ0lTSU9OLFxuICAgICAgICAgICAgICApXG4gICAgICAgICAgICA6IGNsYW1wKFxuICAgICAgICAgICAgICAgICAgKCh2YWx1ZSAtIHByZXZWYWx1ZSkgLyBkZWx0YVZhbHVlKSAqIGRlbHRhRnJhY3Rpb24gKyBwcmV2RnJhY3Rpb24sXG4gICAgICAgICAgICAgICAgICAwLFxuICAgICAgICAgICAgICAgICAgMTAwLFxuICAgICAgICAgICAgICApIC8gMTAwO1xuICAgIH1cblxuICAgIHByaXZhdGUgZnJhY3Rpb25HdWFyZChmcmFjdGlvbjogbnVtYmVyKTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZGlzY3JldGVcbiAgICAgICAgICAgID8gY2xhbXAocXVhbnRpemUoZnJhY3Rpb24sIDEgLyB0aGlzLnN0ZXBzKSwgMCwgMSlcbiAgICAgICAgICAgIDogY2xhbXAoZnJhY3Rpb24sIDAsIDEpO1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0RnJhY3Rpb25Gcm9tRXZlbnRzKHJlY3Q6IENsaWVudFJlY3QsIGNsaWVudFg6IG51bWJlcik6IG51bWJlciB7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gY2xpZW50WCAtIHJlY3QubGVmdCAtIERPVF9XSURUSFt0aGlzLnNpemVdIC8gMjtcbiAgICAgICAgY29uc3QgdG90YWwgPSByZWN0LndpZHRoIC0gRE9UX1dJRFRIW3RoaXMuc2l6ZV07XG5cbiAgICAgICAgcmV0dXJuIHJvdW5kKHZhbHVlIC8gdG90YWwsIFRVSV9GTE9BVElOR19QUkVDSVNJT04pO1xuICAgIH1cbn1cbiJdfQ==