ng-zorro-antd
Version:
An enterprise-class UI components based on Ant Design and Angular
161 lines • 21.7 kB
JavaScript
/**
* Use of this source code is governed by an MIT-style license that can be
* found in the LICENSE file at https://github.com/NG-ZORRO/ng-zorro-antd/blob/master/LICENSE
*/
import { Directive, EventEmitter, Output } from '@angular/core';
import { fromEvent, Subscription } from 'rxjs';
import * as i0 from "@angular/core";
const MIN_SWIPE_DISTANCE = 0.1;
const STOP_SWIPE_DISTANCE = 0.01;
const REFRESH_INTERVAL = 20;
const SPEED_OFF_MULTIPLE = 0.995 ** REFRESH_INTERVAL;
export class NzTabScrollListDirective {
constructor(ngZone, elementRef) {
this.ngZone = ngZone;
this.elementRef = elementRef;
this.lastWheelDirection = null;
this.lastWheelTimestamp = 0;
this.lastTimestamp = 0;
this.lastTimeDiff = 0;
this.lastMixedWheel = 0;
this.lastWheelPrevent = false;
this.touchPosition = null;
this.lastOffset = null;
this.motion = -1;
this.unsubscribe = () => void 0;
this.offsetChange = new EventEmitter();
this.tabScroll = new EventEmitter();
this.onTouchEnd = (e) => {
if (!this.touchPosition) {
return;
}
const lastOffset = this.lastOffset;
const lastTimeDiff = this.lastTimeDiff;
this.lastOffset = this.touchPosition = null;
if (lastOffset) {
const distanceX = lastOffset.x / lastTimeDiff;
const distanceY = lastOffset.y / lastTimeDiff;
const absX = Math.abs(distanceX);
const absY = Math.abs(distanceY);
// Skip swipe if low distance
if (Math.max(absX, absY) < MIN_SWIPE_DISTANCE) {
return;
}
let currentX = distanceX;
let currentY = distanceY;
this.motion = window.setInterval(() => {
if (Math.abs(currentX) < STOP_SWIPE_DISTANCE && Math.abs(currentY) < STOP_SWIPE_DISTANCE) {
window.clearInterval(this.motion);
return;
}
currentX *= SPEED_OFF_MULTIPLE;
currentY *= SPEED_OFF_MULTIPLE;
this.onOffset(currentX * REFRESH_INTERVAL, currentY * REFRESH_INTERVAL, e);
}, REFRESH_INTERVAL);
}
};
this.onTouchMove = (e) => {
if (!this.touchPosition) {
return;
}
e.preventDefault();
const { screenX, screenY } = e.touches[0];
const offsetX = screenX - this.touchPosition.x;
const offsetY = screenY - this.touchPosition.y;
this.onOffset(offsetX, offsetY, e);
const now = Date.now();
this.lastTimeDiff = now - this.lastTimestamp;
this.lastTimestamp = now;
this.lastOffset = { x: offsetX, y: offsetY };
this.touchPosition = { x: screenX, y: screenY };
};
this.onTouchStart = (e) => {
const { screenX, screenY } = e.touches[0];
this.touchPosition = { x: screenX, y: screenY };
window.clearInterval(this.motion);
};
this.onWheel = (e) => {
const { deltaX, deltaY } = e;
let mixed;
const absX = Math.abs(deltaX);
const absY = Math.abs(deltaY);
if (absX === absY) {
mixed = this.lastWheelDirection === 'x' ? deltaX : deltaY;
}
else if (absX > absY) {
mixed = deltaX;
this.lastWheelDirection = 'x';
}
else {
mixed = deltaY;
this.lastWheelDirection = 'y';
}
// Optimize mac touch scroll
const now = Date.now();
const absMixed = Math.abs(mixed);
if (now - this.lastWheelTimestamp > 100 || absMixed - this.lastMixedWheel > 10) {
this.lastWheelPrevent = false;
}
this.onOffset(-mixed, -mixed, e);
if (e.defaultPrevented || this.lastWheelPrevent) {
this.lastWheelPrevent = true;
}
this.lastWheelTimestamp = now;
this.lastMixedWheel = absMixed;
};
}
ngOnInit() {
this.unsubscribe = this.ngZone.runOutsideAngular(() => {
const el = this.elementRef.nativeElement;
const wheel$ = fromEvent(el, 'wheel');
const touchstart$ = fromEvent(el, 'touchstart');
const touchmove$ = fromEvent(el, 'touchmove');
const touchend$ = fromEvent(el, 'touchend');
const subscription = new Subscription();
subscription.add(this.subscribeWrap('wheel', wheel$, this.onWheel));
subscription.add(this.subscribeWrap('touchstart', touchstart$, this.onTouchStart));
subscription.add(this.subscribeWrap('touchmove', touchmove$, this.onTouchMove));
subscription.add(this.subscribeWrap('touchend', touchend$, this.onTouchEnd));
return () => {
subscription.unsubscribe();
};
});
}
subscribeWrap(type, observable, handler) {
return observable.subscribe(event => {
this.tabScroll.emit({
type,
event
});
if (!event.defaultPrevented) {
handler(event);
}
});
}
onOffset(x, y, event) {
this.ngZone.run(() => {
this.offsetChange.emit({
x,
y,
event
});
});
}
ngOnDestroy() {
this.unsubscribe();
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.0.7", ngImport: i0, type: NzTabScrollListDirective, deps: [{ token: i0.NgZone }, { token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Directive }); }
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "17.0.7", type: NzTabScrollListDirective, isStandalone: true, selector: "[nzTabScrollList]", outputs: { offsetChange: "offsetChange", tabScroll: "tabScroll" }, ngImport: i0 }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.0.7", ngImport: i0, type: NzTabScrollListDirective, decorators: [{
type: Directive,
args: [{
selector: '[nzTabScrollList]',
standalone: true
}]
}], ctorParameters: () => [{ type: i0.NgZone }, { type: i0.ElementRef }], propDecorators: { offsetChange: [{
type: Output
}], tabScroll: [{
type: Output
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFiLXNjcm9sbC1saXN0LmRpcmVjdGl2ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL2NvbXBvbmVudHMvdGFicy90YWItc2Nyb2xsLWxpc3QuZGlyZWN0aXZlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7R0FHRztBQUVILE9BQU8sRUFBRSxTQUFTLEVBQWMsWUFBWSxFQUE2QixNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDdkcsT0FBTyxFQUFFLFNBQVMsRUFBYyxZQUFZLEVBQUUsTUFBTSxNQUFNLENBQUM7O0FBUzNELE1BQU0sa0JBQWtCLEdBQUcsR0FBRyxDQUFDO0FBQy9CLE1BQU0sbUJBQW1CLEdBQUcsSUFBSSxDQUFDO0FBQ2pDLE1BQU0sZ0JBQWdCLEdBQUcsRUFBRSxDQUFDO0FBQzVCLE1BQU0sa0JBQWtCLEdBQUcsS0FBSyxJQUFJLGdCQUFnQixDQUFDO0FBTXJELE1BQU0sT0FBTyx3QkFBd0I7SUFnQm5DLFlBQ1UsTUFBYyxFQUNkLFVBQW1DO1FBRG5DLFdBQU0sR0FBTixNQUFNLENBQVE7UUFDZCxlQUFVLEdBQVYsVUFBVSxDQUF5QjtRQWpCN0MsdUJBQWtCLEdBQXFCLElBQUksQ0FBQztRQUM1Qyx1QkFBa0IsR0FBRyxDQUFDLENBQUM7UUFDdkIsa0JBQWEsR0FBRyxDQUFDLENBQUM7UUFDbEIsaUJBQVksR0FBRyxDQUFDLENBQUM7UUFDakIsbUJBQWMsR0FBRyxDQUFDLENBQUM7UUFDbkIscUJBQWdCLEdBQUcsS0FBSyxDQUFDO1FBQ3pCLGtCQUFhLEdBQWlDLElBQUksQ0FBQztRQUNuRCxlQUFVLEdBQWlDLElBQUksQ0FBQztRQUNoRCxXQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFFWixnQkFBVyxHQUFlLEdBQUcsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBRXBCLGlCQUFZLEdBQUcsSUFBSSxZQUFZLEVBQThCLENBQUM7UUFDOUQsY0FBUyxHQUFHLElBQUksWUFBWSxFQUFvQixD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UzttQkFBQztvQkFDVCxRQUFRLEVBQUUsbUJBQW1CO29CQUM3QixVQUFVLEVBQUUsSUFBSTtpQkFDakI7b0dBY29CLFlBQVk7c0JBQTlCLE1BQU07Z0JBQ1ksU0FBUztzQkFBM0IsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmVcbiAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9naXRodWIuY29tL05HLVpPUlJPL25nLXpvcnJvLWFudGQvYmxvYi9tYXN0ZXIvTElDRU5TRVxuICovXG5cbmltcG9ydCB7IERpcmVjdGl2ZSwgRWxlbWVudFJlZiwgRXZlbnRFbWl0dGVyLCBOZ1pvbmUsIE9uRGVzdHJveSwgT25Jbml0LCBPdXRwdXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IGZyb21FdmVudCwgT2JzZXJ2YWJsZSwgU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcyc7XG5cbmltcG9ydCB7XG4gIE56VGFiU2Nyb2xsRXZlbnQsXG4gIE56VGFiU2Nyb2xsRXZlbnRIYW5kbGVyRnVuLFxuICBOelRhYlNjcm9sbExpc3RPZmZzZXQsXG4gIE56VGFiU2Nyb2xsTGlzdE9mZnNldEV2ZW50XG59IGZyb20gJy4vaW50ZXJmYWNlcyc7XG5cbmNvbnN0IE1JTl9TV0lQRV9ESVNUQU5DRSA9IDAuMTtcbmNvbnN0IFNUT1BfU1dJUEVfRElTVEFOQ0UgPSAwLjAxO1xuY29uc3QgUkVGUkVTSF9JTlRFUlZBTCA9IDIwO1xuY29uc3QgU1BFRURfT0ZGX01VTFRJUExFID0gMC45OTUgKiogUkVGUkVTSF9JTlRFUlZBTDtcblxuQERpcmVjdGl2ZSh7XG4gIHNlbGVjdG9yOiAnW256VGFiU2Nyb2xsTGlzdF0nLFxuICBzdGFuZGFsb25lOiB0cnVlXG59KVxuZXhwb3J0IGNsYXNzIE56VGFiU2Nyb2xsTGlzdERpcmVjdGl2ZSBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95IHtcbiAgbGFzdFdoZWVsRGlyZWN0aW9uOiAneCcgfCAneScgfCBudWxsID0gbnVsbDtcbiAgbGFzdFdoZWVsVGltZXN0YW1wID0gMDtcbiAgbGFzdFRpbWVzdGFtcCA9IDA7XG4gIGxhc3RUaW1lRGlmZiA9IDA7XG4gIGxhc3RNaXhlZFdoZWVsID0gMDtcbiAgbGFzdFdoZWVsUHJldmVudCA9IGZhbHNlO1xuICB0b3VjaFBvc2l0aW9uOiBOelRhYlNjcm9sbExpc3RPZmZzZXQgfCBudWxsID0gbnVsbDtcbiAgbGFzdE9mZnNldDogTnpUYWJTY3JvbGxMaXN0T2Zmc2V0IHwgbnVsbCA9IG51bGw7XG4gIG1vdGlvbiA9IC0xO1xuXG4gIHVuc3Vic2NyaWJlOiAoKSA9PiB2b2lkID0gKCkgPT4gdm9pZCAwO1xuXG4gIEBPdXRwdXQoKSByZWFkb25seSBvZmZzZXRDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPE56VGFiU2Nyb2xsTGlzdE9mZnNldEV2ZW50PigpO1xuICBAT3V0cHV0KCkgcmVhZG9ubHkgdGFiU2Nyb2xsID0gbmV3IEV2ZW50RW1pdHRlcjxOelRhYlNjcm9sbEV2ZW50PigpO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgbmdab25lOiBOZ1pvbmUsXG4gICAgcHJpdmF0ZSBlbGVtZW50UmVmOiBFbGVtZW50UmVmPEhUTUxFbGVtZW50PlxuICApIHt9XG5cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgdGhpcy51bnN1YnNjcmliZSA9IHRoaXMubmdab25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+IHtcbiAgICAgIGNvbnN0IGVsID0gdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQ7XG5cbiAgICAgIGNvbnN0IHdoZWVsJCA9IGZyb21FdmVudDxXaGVlbEV2ZW50PihlbCwgJ3doZWVsJyk7XG4gICAgICBjb25zdCB0b3VjaHN0YXJ0JCA9IGZyb21FdmVudDxUb3VjaEV2ZW50PihlbCwgJ3RvdWNoc3RhcnQnKTtcbiAgICAgIGNvbnN0IHRvdWNobW92ZSQgPSBmcm9tRXZlbnQ8VG91Y2hFdmVudD4oZWwsICd0b3VjaG1vdmUnKTtcbiAgICAgIGNvbnN0IHRvdWNoZW5kJCA9IGZyb21FdmVudDxUb3VjaEV2ZW50PihlbCwgJ3RvdWNoZW5kJyk7XG5cbiAgICAgIGNvbnN0IHN1YnNjcmlwdGlvbiA9IG5ldyBTdWJzY3JpcHRpb24oKTtcbiAgICAgIHN1YnNjcmlwdGlvbi5hZGQodGhpcy5zdWJzY3JpYmVXcmFwKCd3aGVlbCcsIHdoZWVsJCwgdGhpcy5vbldoZWVsKSk7XG4gICAgICBzdWJzY3JpcHRpb24uYWRkKHRoaXMuc3Vic2NyaWJlV3JhcCgndG91Y2hzdGFydCcsIHRvdWNoc3RhcnQkLCB0aGlzLm9uVG91Y2hTdGFydCkpO1xuICAgICAgc3Vic2NyaXB0aW9uLmFkZCh0aGlzLnN1YnNjcmliZVdyYXAoJ3RvdWNobW92ZScsIHRvdWNobW92ZSQsIHRoaXMub25Ub3VjaE1vdmUpKTtcbiAgICAgIHN1YnNjcmlwdGlvbi5hZGQodGhpcy5zdWJzY3JpYmVXcmFwKCd0b3VjaGVuZCcsIHRvdWNoZW5kJCwgdGhpcy5vblRvdWNoRW5kKSk7XG5cbiAgICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgIHN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICAgICAgfTtcbiAgICB9KTtcbiAgfVxuXG4gIHN1YnNjcmliZVdyYXA8VCBleHRlbmRzIE56VGFiU2Nyb2xsRXZlbnRbJ2V2ZW50J10+KFxuICAgIHR5cGU6IE56VGFiU2Nyb2xsRXZlbnRbJ3R5cGUnXSxcbiAgICBvYnNlcnZhYmxlOiBPYnNlcnZhYmxlPFQ+LFxuICAgIGhhbmRsZXI6IE56VGFiU2Nyb2xsRXZlbnRIYW5kbGVyRnVuPFQ+XG4gICk6IFN1YnNjcmlwdGlvbiB7XG4gICAgcmV0dXJuIG9ic2VydmFibGUuc3Vic2NyaWJlKGV2ZW50ID0+IHtcbiAgICAgIHRoaXMudGFiU2Nyb2xsLmVtaXQoe1xuICAgICAgICB0eXBlLFxuICAgICAgICBldmVudFxuICAgICAgfSBhcyBOelRhYlNjcm9sbEV2ZW50KTtcbiAgICAgIGlmICghZXZlbnQuZGVmYXVsdFByZXZlbnRlZCkge1xuICAgICAgICBoYW5kbGVyKGV2ZW50KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIG9uVG91Y2hFbmQgPSAoZTogVG91Y2hFdmVudCk6IHZvaWQgPT4ge1xuICAgIGlmICghdGhpcy50b3VjaFBvc2l0aW9uKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGxhc3RPZmZzZXQgPSB0aGlzLmxhc3RPZmZzZXQ7XG4gICAgY29uc3QgbGFzdFRpbWVEaWZmID0gdGhpcy5sYXN0VGltZURpZmY7XG5cbiAgICB0aGlzLmxhc3RPZmZzZXQgPSB0aGlzLnRvdWNoUG9zaXRpb24gPSBudWxsO1xuXG4gICAgaWYgKGxhc3RPZmZzZXQpIHtcbiAgICAgIGNvbnN0IGRpc3RhbmNlWCA9IGxhc3RPZmZzZXQueCAvIGxhc3RUaW1lRGlmZjtcbiAgICAgIGNvbnN0IGRpc3RhbmNlWSA9IGxhc3RPZmZzZXQueSAvIGxhc3RUaW1lRGlmZjtcbiAgICAgIGNvbnN0IGFic1ggPSBNYXRoLmFicyhkaXN0YW5jZVgpO1xuICAgICAgY29uc3QgYWJzWSA9IE1hdGguYWJzKGRpc3RhbmNlWSk7XG5cbiAgICAgIC8vIFNraXAgc3dpcGUgaWYgbG93IGRpc3RhbmNlXG4gICAgICBpZiAoTWF0aC5tYXgoYWJzWCwgYWJzWSkgPCBNSU5fU1dJUEVfRElTVEFOQ0UpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBsZXQgY3VycmVudFggPSBkaXN0YW5jZVg7XG4gICAgICBsZXQgY3VycmVudFkgPSBkaXN0YW5jZVk7XG5cbiAgICAgIHRoaXMubW90aW9uID0gd2luZG93LnNldEludGVydmFsKCgpID0+IHtcbiAgICAgICAgaWYgKE1hdGguYWJzKGN1cnJlbnRYKSA8IFNUT1BfU1dJUEVfRElTVEFOQ0UgJiYgTWF0aC5hYnMoY3VycmVudFkpIDwgU1RPUF9TV0lQRV9ESVNUQU5DRSkge1xuICAgICAgICAgIHdpbmRvdy5jbGVhckludGVydmFsKHRoaXMubW90aW9uKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjdXJyZW50WCAqPSBTUEVFRF9PRkZfTVVMVElQTEU7XG4gICAgICAgIGN1cnJlbnRZICo9IFNQRUVEX09GRl9NVUxUSVBMRTtcbiAgICAgICAgdGhpcy5vbk9mZnNldChjdXJyZW50WCAqIFJFRlJFU0hfSU5URVJWQUwsIGN1cnJlbnRZICogUkVGUkVTSF9JTlRFUlZBTCwgZSk7XG4gICAgICB9LCBSRUZSRVNIX0lOVEVSVkFMKTtcbiAgICB9XG4gIH07XG5cbiAgb25Ub3VjaE1vdmUgPSAoZTogVG91Y2hFdmVudCk6IHZvaWQgPT4ge1xuICAgIGlmICghdGhpcy50b3VjaFBvc2l0aW9uKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIGNvbnN0IHsgc2NyZWVuWCwgc2NyZWVuWSB9ID0gZS50b3VjaGVzWzBdO1xuXG4gICAgY29uc3Qgb2Zmc2V0WCA9IHNjcmVlblggLSB0aGlzLnRvdWNoUG9zaXRpb24ueDtcbiAgICBjb25zdCBvZmZzZXRZID0gc2NyZWVuWSAtIHRoaXMudG91Y2hQb3NpdGlvbi55O1xuICAgIHRoaXMub25PZmZzZXQob2Zmc2V0WCwgb2Zmc2V0WSwgZSk7XG4gICAgY29uc3Qgbm93ID0gRGF0ZS5ub3coKTtcblxuICAgIHRoaXMubGFzdFRpbWVEaWZmID0gbm93IC0gdGhpcy5sYXN0VGltZXN0YW1wO1xuICAgIHRoaXMubGFzdFRpbWVzdGFtcCA9IG5vdztcbiAgICB0aGlzLmxhc3RPZmZzZXQgPSB7IHg6IG9mZnNldFgsIHk6IG9mZnNldFkgfTtcbiAgICB0aGlzLnRvdWNoUG9zaXRpb24gPSB7IHg6IHNjcmVlblgsIHk6IHNjcmVlblkgfTtcbiAgfTtcblxuICBvblRvdWNoU3RhcnQgPSAoZTogVG91Y2hFdmVudCk6IHZvaWQgPT4ge1xuICAgIGNvbnN0IHsgc2NyZWVuWCwgc2NyZWVuWSB9ID0gZS50b3VjaGVzWzBdO1xuICAgIHRoaXMudG91Y2hQb3NpdGlvbiA9IHsgeDogc2NyZWVuWCwgeTogc2NyZWVuWSB9O1xuICAgIHdpbmRvdy5jbGVhckludGVydmFsKHRoaXMubW90aW9uKTtcbiAgfTtcblxuICBvbldoZWVsID0gKGU6IFdoZWVsRXZlbnQpOiB2b2lkID0+IHtcbiAgICBjb25zdCB7IGRlbHRhWCwgZGVsdGFZIH0gPSBlO1xuICAgIGxldCBtaXhlZDogbnVtYmVyO1xuICAgIGNvbnN0IGFic1ggPSBNYXRoLmFicyhkZWx0YVgpO1xuICAgIGNvbnN0IGFic1kgPSBNYXRoLmFicyhkZWx0YVkpO1xuXG4gICAgaWYgKGFic1ggPT09IGFic1kpIHtcbiAgICAgIG1peGVkID0gdGhpcy5sYXN0V2hlZWxEaXJlY3Rpb24gPT09ICd4JyA/IGRlbHRhWCA6IGRlbHRhWTtcbiAgICB9IGVsc2UgaWYgKGFic1ggPiBhYnNZKSB7XG4gICAgICBtaXhlZCA9IGRlbHRhWDtcbiAgICAgIHRoaXMubGFzdFdoZWVsRGlyZWN0aW9uID0gJ3gnO1xuICAgIH0gZWxzZSB7XG4gICAgICBtaXhlZCA9IGRlbHRhWTtcbiAgICAgIHRoaXMubGFzdFdoZWVsRGlyZWN0aW9uID0gJ3knO1xuICAgIH1cblxuICAgIC8vIE9wdGltaXplIG1hYyB0b3VjaCBzY3JvbGxcbiAgICBjb25zdCBub3cgPSBEYXRlLm5vdygpO1xuICAgIGNvbnN0IGFic01peGVkID0gTWF0aC5hYnMobWl4ZWQpO1xuXG4gICAgaWYgKG5vdyAtIHRoaXMubGFzdFdoZWVsVGltZXN0YW1wID4gMTAwIHx8IGFic01peGVkIC0gdGhpcy5sYXN0TWl4ZWRXaGVlbCA+IDEwKSB7XG4gICAgICB0aGlzLmxhc3RXaGVlbFByZXZlbnQgPSBmYWxzZTtcbiAgICB9XG4gICAgdGhpcy5vbk9mZnNldCgtbWl4ZWQsIC1taXhlZCwgZSk7XG4gICAgaWYgKGUuZGVmYXVsdFByZXZlbnRlZCB8fCB0aGlzLmxhc3RXaGVlbFByZXZlbnQpIHtcbiAgICAgIHRoaXMubGFzdFdoZWVsUHJldmVudCA9IHRydWU7XG4gICAgfVxuXG4gICAgdGhpcy5sYXN0V2hlZWxUaW1lc3RhbXAgPSBub3c7XG4gICAgdGhpcy5sYXN0TWl4ZWRXaGVlbCA9IGFic01peGVkO1xuICB9O1xuXG4gIG9uT2Zmc2V0KHg6IG51bWJlciwgeTogbnVtYmVyLCBldmVudDogRXZlbnQpOiB2b2lkIHtcbiAgICB0aGlzLm5nWm9uZS5ydW4oKCkgPT4ge1xuICAgICAgdGhpcy5vZmZzZXRDaGFuZ2UuZW1pdCh7XG4gICAgICAgIHgsXG4gICAgICAgIHksXG4gICAgICAgIGV2ZW50XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMudW5zdWJzY3JpYmUoKTtcbiAgfVxufVxuIl19