UNPKG

ngx-scrollbar-v8

Version:

Custom overlay-scrollbars with native scrolling mechanism.

282 lines 20.9 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ import { Directive, ElementRef, Inject, PLATFORM_ID } from '@angular/core'; import { isPlatformBrowser } from '@angular/common'; import { supportsScrollBehavior } from '@angular/cdk/platform'; import { from, of, animationFrameScheduler } from 'rxjs'; /** * @record */ export function SmoothScrollOptions() { } if (false) { /** @type {?|undefined} */ SmoothScrollOptions.prototype.top; /** @type {?|undefined} */ SmoothScrollOptions.prototype.left; /** @type {?} */ SmoothScrollOptions.prototype.offsetTop; /** @type {?} */ SmoothScrollOptions.prototype.offsetLeft; /** @type {?} */ SmoothScrollOptions.prototype.duration; /** @type {?} */ SmoothScrollOptions.prototype.scrollFunc; /** @type {?} */ SmoothScrollOptions.prototype.easeFunc; } /** * @record */ export function ScrollToOptions() { } if (false) { /** @type {?|undefined} */ ScrollToOptions.prototype.top; /** @type {?|undefined} */ ScrollToOptions.prototype.left; /** @type {?|undefined} */ ScrollToOptions.prototype.duration; /** @type {?|undefined} */ ScrollToOptions.prototype.easeFunc; } export class SmoothScroll { /** * @param {?} _platform * @param {?} el */ constructor(_platform, el) { this._platform = _platform; this.view = el.nativeElement; } /** * @private * @param {?} left * @param {?} top * @return {?} */ scrollFunc(left, top) { if (supportsScrollBehavior()) { this.view.scrollTo({ top, left }); } else { this.view.scrollTop = top; this.view.scrollLeft = left; } } /** * @param {?} options * @return {?} */ scrollTo(options) { // Avoid SSR error if (isPlatformBrowser(this._platform)) { /** @type {?} */ const scrollFunc = (/** * @param {?} left * @param {?} top * @return {?} */ (left, top) => { if (supportsScrollBehavior()) { this.view.scrollTo({ top, left }); } else { this.view.scrollTop = top; this.view.scrollLeft = left; } }); if (options.duration) { /** @type {?} */ const smoothScrollOptions = { top: options.top, left: options.left, duration: options.duration, easeFunc: options.easeFunc || easeInOutQuad, offsetTop: this.view.scrollTop, offsetLeft: this.view.scrollLeft, scrollFunc }; return from(smoothScroll(smoothScrollOptions)); } this.scrollFunc(options.left, options.top); } return of(); } /** * @param {?} selector * @param {?=} offset * @param {?=} duration * @param {?=} easeFunc * @return {?} */ scrollToElement(selector, offset = 0, duration, easeFunc) { /** @type {?} */ const target = this.view.querySelector(selector); return target ? this.scrollTo({ left: target.offsetLeft, top: target.offsetTop - offset, duration, easeFunc }) : of(); } /** * @param {?} left * @param {?=} duration * @param {?=} easeFunc * @return {?} */ scrollXTo(left, duration, easeFunc) { return this.scrollTo({ left, duration, easeFunc }); } /** * @param {?} top * @param {?=} duration * @param {?=} easeFunc * @return {?} */ scrollYTo(top, duration, easeFunc) { return this.scrollTo({ top, duration, easeFunc }); } /** * @param {?=} duration * @param {?=} easeFunc * @return {?} */ scrollToTop(duration, easeFunc) { return this.scrollYTo(0, duration, easeFunc); } /** * @param {?=} duration * @param {?=} easeFunc * @return {?} */ scrollToBottom(duration, easeFunc) { return this.scrollYTo(this.view.scrollHeight - this.view.clientHeight, duration, easeFunc); } /** * @param {?=} duration * @param {?=} easeFunc * @return {?} */ scrollToRight(duration, easeFunc) { return this.scrollXTo(this.view.scrollWidth, duration, easeFunc); } /** * @param {?=} duration * @param {?=} easeFunc * @return {?} */ scrollToLeft(duration, easeFunc) { return this.scrollXTo(0, duration, easeFunc); } } SmoothScroll.decorators = [ { type: Directive, args: [{ selector: '[smoothScroll], [smooth-scroll]' },] } ]; /** @nocollapse */ SmoothScroll.ctorParameters = () => [ { type: Object, decorators: [{ type: Inject, args: [PLATFORM_ID,] }] }, { type: ElementRef } ]; if (false) { /** * @type {?} * @private */ SmoothScroll.prototype.view; /** * @type {?} * @private */ SmoothScroll.prototype._platform; } /** * @param {?} options * @return {?} */ export function smoothScroll(options) { return new Promise((/** * @param {?} resolve * @return {?} */ resolve => { /** @type {?} */ let currentTime = 0; /** @type {?} */ const increment = 10; /** @type {?} */ let valX = options.offsetLeft; /** @type {?} */ let valY = options.offsetTop; /** @type {?} */ const animateScroll = (/** * @return {?} */ () => { // increment the time currentTime += increment; // find the value with the easing function if (typeof options.left !== 'undefined') { /** @type {?} */ const deltaX = options.left - options.offsetLeft; valX = options.easeFunc(currentTime, options.offsetLeft, deltaX, options.duration); } if (typeof options.top !== 'undefined') { /** @type {?} */ const deltaY = options.top - options.offsetTop; valY = options.easeFunc(currentTime, options.offsetTop, deltaY, options.duration); } // scroll to position options.scrollFunc(valX, valY); // do the animation unless its over if (currentTime < options.duration) { animationFrameScheduler.schedule(animateScroll); } else { resolve(); } }); animateScroll(); })); } // easing functions http://goo.gl/5HLl8 /** * @param {?} t * @param {?} b * @param {?} c * @param {?} d * @return {?} */ export function easeInOutQuad(t, b, c, d) { t /= d / 2; if (t < 1) { return (c / 2) * t * t + b; } t--; return (-c / 2) * (t * (t - 2) - 1) + b; } /** * @param {?} t * @param {?} b * @param {?} c * @param {?} d * @return {?} */ export function easeInCubic(t, b, c, d) { /** @type {?} */ const tc = (t /= d) * t * t; return b + c * tc; } /** * @param {?} t * @param {?} b * @param {?} c * @param {?} d * @return {?} */ export function inOutQuintic(t, b, c, d) { /** @type {?} */ const ts = (t /= d) * t; /** @type {?} */ const tc = ts * t; return b + c * (6 * tc * ts + -15 * ts * ts + 10 * tc); } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic21vb3RoLXNjcm9sbC5qcyIsInNvdXJjZVJvb3QiOiJuZzovL25neC1zY3JvbGxiYXIvIiwic291cmNlcyI6WyJzbW9vdGgtc2Nyb2xsL3Ntb290aC1zY3JvbGwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7OztBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxXQUFXLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDM0UsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDcEQsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDL0QsT0FBTyxFQUFjLElBQUksRUFBRSxFQUFFLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSxNQUFNLENBQUM7Ozs7QUFJckUseUNBUUM7OztJQVBDLGtDQUFhOztJQUNiLG1DQUFjOztJQUNkLHdDQUFrQjs7SUFDbEIseUNBQW1COztJQUNuQix1Q0FBaUI7O0lBQ2pCLHlDQUFnRDs7SUFDaEQsdUNBQStCOzs7OztBQUdqQyxxQ0FLQzs7O0lBSkMsOEJBQWE7O0lBQ2IsK0JBQWM7O0lBQ2QsbUNBQWtCOztJQUNsQixtQ0FBZ0M7O0FBTWxDLE1BQU0sT0FBTyxZQUFZOzs7OztJQUl2QixZQUF5QyxTQUFpQixFQUM5QyxFQUFjO1FBRGUsY0FBUyxHQUFULFNBQVMsQ0FBUTtRQUV4RCxJQUFJLENBQUMsSUFBSSxHQUFHLEVBQUUsQ0FBQyxhQUFhLENBQUM7SUFDL0IsQ0FBQzs7Ozs7OztJQUVPLFVBQVUsQ0FBQyxJQUFZLEVBQUUsR0FBVztRQUMxQyxJQUFJLHNCQUFzQixFQUFFLEVBQUU7WUFDNUIsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsRUFBQyxHQUFHLEVBQUUsSUFBSSxFQUFDLENBQUMsQ0FBQztTQUNqQzthQUFNO1lBQ0wsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLEdBQUcsR0FBRyxDQUFDO1lBQzFCLElBQUksQ0FBQyxJQUFJLENBQUMs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Ozs7QUFFRCxNQUFNLFVBQVUsWUFBWSxDQUFDLENBQVMsRUFBRSxDQUFTLEVBQUUsQ0FBUyxFQUFFLENBQVM7O1VBQy9ELEVBQUUsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDOztVQUNyQixFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUM7SUFDYixPQUFPLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQztBQUN6RCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRGlyZWN0aXZlLCBFbGVtZW50UmVmLCBJbmplY3QsIFBMQVRGT1JNX0lEIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBpc1BsYXRmb3JtQnJvd3NlciB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBzdXBwb3J0c1Njcm9sbEJlaGF2aW9yIH0gZnJvbSAnQGFuZ3VsYXIvY2RrL3BsYXRmb3JtJztcbmltcG9ydCB7IE9ic2VydmFibGUsIGZyb20sIG9mLCBhbmltYXRpb25GcmFtZVNjaGVkdWxlciB9IGZyb20gJ3J4anMnO1xuXG5leHBvcnQgdHlwZSBTbW9vdGhTY3JvbGxFYXNlRnVuYyA9ICh0OiBudW1iZXIsIHM6IG51bWJlciwgYzogbnVtYmVyLCBkOiBudW1iZXIpID0+IG51bWJlcjtcblxuZXhwb3J0IGludGVyZmFjZSBTbW9vdGhTY3JvbGxPcHRpb25zIHtcbiAgdG9wPzogbnVtYmVyO1xuICBsZWZ0PzogbnVtYmVyO1xuICBvZmZzZXRUb3A6IG51bWJlcjtcbiAgb2Zmc2V0TGVmdDogbnVtYmVyO1xuICBkdXJhdGlvbjogbnVtYmVyO1xuICBzY3JvbGxGdW5jOiAodG9wOiBudW1iZXIsIGxlZnQ6IG51bWJlcikgPT4gdm9pZDtcbiAgZWFzZUZ1bmM6IFNtb290aFNjcm9sbEVhc2VGdW5jO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFNjcm9sbFRvT3B0aW9ucyB7XG4gIHRvcD86IG51bWJlcjtcbiAgbGVmdD86IG51bWJlcjtcbiAgZHVyYXRpb24/OiBudW1iZXI7XG4gIGVhc2VGdW5jPzogU21vb3RoU2Nyb2xsRWFzZUZ1bmM7XG59XG5cbkBEaXJlY3RpdmUoe1xuICBzZWxlY3RvcjogJ1tzbW9vdGhTY3JvbGxdLCBbc21vb3RoLXNjcm9sbF0nXG59KVxuZXhwb3J0IGNsYXNzIFNtb290aFNjcm9sbCB7XG5cbiAgcHJpdmF0ZSByZWFkb25seSB2aWV3OiBIVE1MRWxlbWVudDtcblxuICBjb25zdHJ1Y3RvcihASW5qZWN0KFBMQVRGT1JNX0lEKSBwcml2YXRlIF9wbGF0Zm9ybTogT2JqZWN0LFxuICAgICAgICAgICAgICBlbDogRWxlbWVudFJlZikge1xuICAgIHRoaXMudmlldyA9IGVsLm5hdGl2ZUVsZW1lbnQ7XG4gIH1cblxuICBwcml2YXRlIHNjcm9sbEZ1bmMobGVmdDogbnVtYmVyLCB0b3A6IG51bWJlcikge1xuICAgIGlmIChzdXBwb3J0c1Njcm9sbEJlaGF2aW9yKCkpIHtcbiAgICAgIHRoaXMudmlldy5zY3JvbGxUbyh7dG9wLCBsZWZ0fSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMudmlldy5zY3JvbGxUb3AgPSB0b3A7XG4gICAgICB0aGlzLnZpZXcuc2Nyb2xsTGVmdCA9IGxlZnQ7XG4gICAgfVxuICB9XG5cbiAgc2Nyb2xsVG8ob3B0aW9uczogU2Nyb2xsVG9PcHRpb25zKTogT2JzZXJ2YWJsZTx2b2lkPiB7XG4gICAgLy8gQXZvaWQgU1NSIGVycm9yXG4gICAgaWYgKGlzUGxhdGZvcm1Ccm93c2VyKHRoaXMuX3BsYXRmb3JtKSkge1xuICAgICAgY29uc3Qgc2Nyb2xsRnVuYyA9IChsZWZ0OiBudW1iZXIsIHRvcDogbnVtYmVyKSA9PiB7XG4gICAgICAgIGlmIChzdXBwb3J0c1Njcm9sbEJlaGF2aW9yKCkpIHtcbiAgICAgICAgICB0aGlzLnZpZXcuc2Nyb2xsVG8oe3RvcCwgbGVmdH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMudmlldy5zY3JvbGxUb3AgPSB0b3A7XG4gICAgICAgICAgdGhpcy52aWV3LnNjcm9sbExlZnQgPSBsZWZ0O1xuICAgICAgICB9XG4gICAgICB9O1xuICAgICAgaWYgKG9wdGlvbnMuZHVyYXRpb24pIHtcbiAgICAgICAgY29uc3Qgc21vb3RoU2Nyb2xsT3B0aW9uczogU21vb3RoU2Nyb2xsT3B0aW9ucyA9IHtcbiAgICAgICAgICB0b3A6IG9wdGlvbnMudG9wLFxuICAgICAgICAgIGxlZnQ6IG9wdGlvbnMubGVmdCxcbiAgICAgICAgICBkdXJhdGlvbjogb3B0aW9ucy5kdXJhdGlvbixcbiAgICAgICAgICBlYXNlRnVuYzogb3B0aW9ucy5lYXNlRnVuYyB8fCBlYXNlSW5PdXRRdWFkLFxuICAgICAgICAgIG9mZnNldFRvcDogdGhpcy52aWV3LnNjcm9sbFRvcCxcbiAgICAgICAgICBvZmZzZXRMZWZ0OiB0aGlzLnZpZXcuc2Nyb2xsTGVmdCxcbiAgICAgICAgICBzY3JvbGxGdW5jXG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiBmcm9tKHNtb290aFNjcm9sbChzbW9vdGhTY3JvbGxPcHRpb25zKSk7XG4gICAgICB9XG4gICAgICB0aGlzLnNjcm9sbEZ1bmMob3B0aW9ucy5sZWZ0LCBvcHRpb25zLnRvcCk7XG4gICAgfVxuICAgIHJldHVybiBvZjx2b2lkPigpO1xuICB9XG5cbiAgc2Nyb2xsVG9FbGVtZW50KHNlbGVjdG9yOiBzdHJpbmcsIG9mZnNldCA9IDAsIGR1cmF0aW9uPzogbnVtYmVyLCBlYXNlRnVuYz86IFNtb290aFNjcm9sbEVhc2VGdW5jKTogT2JzZXJ2YWJsZTx2b2lkPiB7XG4gICAgY29uc3QgdGFyZ2V0OiBIVE1MRWxlbWVudCA9IHRoaXMudmlldy5xdWVyeVNlbGVjdG9yKHNlbGVjdG9yKTtcbiAgICByZXR1cm4gdGFyZ2V0ID8gdGhpcy5zY3JvbGxUbyh7bGVmdDogdGFyZ2V0Lm9mZnNldExlZnQsIHRvcDogdGFyZ2V0Lm9mZnNldFRvcCAtIG9mZnNldCwgZHVyYXRpb24sIGVhc2VGdW5jfSkgOiBvZjx2b2lkPigpO1xuICB9XG5cbiAgc2Nyb2xsWFRvKGxlZnQ6IG51bWJlciwgZHVyYXRpb24/OiBudW1iZXIsIGVhc2VGdW5jPzogU21vb3RoU2Nyb2xsRWFzZUZ1bmMpOiBPYnNlcnZhYmxlPHZvaWQ+IHtcbiAgICByZXR1cm4gdGhpcy5zY3JvbGxUbyh7bGVmdCwgZHVyYXRpb24sIGVhc2VGdW5jfSk7XG4gIH1cblxuICBzY3JvbGxZVG8odG9wOiBudW1iZXIsIGR1cmF0aW9uPzogbnVtYmVyLCBlYXNlRnVuYz86IFNtb290aFNjcm9sbEVhc2VGdW5jKTogT2JzZXJ2YWJsZTx2b2lkPiB7XG4gICAgcmV0dXJuIHRoaXMuc2Nyb2xsVG8oe3RvcCwgZHVyYXRpb24sIGVhc2VGdW5jfSk7XG4gIH1cblxuICBzY3JvbGxUb1RvcChkdXJhdGlvbj86IG51bWJlciwgZWFzZUZ1bmM/OiBTbW9vdGhTY3JvbGxFYXNlRnVuYyk6IE9ic2VydmFibGU8dm9pZD4ge1xuICAgIHJldHVybiB0aGlzLnNjcm9sbFlUbygwLCBkdXJhdGlvbiwgZWFzZUZ1bmMpO1xuICB9XG5cbiAgc2Nyb2xsVG9Cb3R0b20oZHVyYXRpb24/OiBudW1iZXIsIGVhc2VGdW5jPzogU21vb3RoU2Nyb2xsRWFzZUZ1bmMpOiBPYnNlcnZhYmxlPHZvaWQ+IHtcbiAgICByZXR1cm4gdGhpcy5zY3JvbGxZVG8odGhpcy52aWV3LnNjcm9sbEhlaWdodCAtIHRoaXMudmlldy5jbGllbnRIZWlnaHQsIGR1cmF0aW9uLCBlYXNlRnVuYyk7XG4gIH1cblxuICBzY3JvbGxUb1JpZ2h0KGR1cmF0aW9uPzogbnVtYmVyLCBlYXNlRnVuYz86IFNtb290aFNjcm9sbEVhc2VGdW5jKTogT2JzZXJ2YWJsZTx2b2lkPiB7XG4gICAgcmV0dXJuIHRoaXMuc2Nyb2xsWFRvKHRoaXMudmlldy5zY3JvbGxXaWR0aCwgZHVyYXRpb24sIGVhc2VGdW5jKTtcbiAgfVxuXG4gIHNjcm9sbFRvTGVmdChkdXJhdGlvbj86IG51bWJlciwgZWFzZUZ1bmM/OiBTbW9vdGhTY3JvbGxFYXNlRnVuYyk6IE9ic2VydmFibGU8dm9pZD4ge1xuICAgIHJldHVybiB0aGlzLnNjcm9sbFhUbygwLCBkdXJhdGlvbiwgZWFzZUZ1bmMpO1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzbW9vdGhTY3JvbGwob3B0aW9uczogU21vb3RoU2Nyb2xsT3B0aW9ucyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbmV3IFByb21pc2UocmVzb2x2ZSA9PiB7XG4gICAgbGV0IGN1cnJlbnRUaW1lID0gMDtcbiAgICBjb25zdCBpbmNyZW1lbnQgPSAxMDtcbiAgICBsZXQgdmFsWCA9IG9wdGlvbnMub2Zmc2V0TGVmdDtcbiAgICBsZXQgdmFsWSA9IG9wdGlvbnMub2Zmc2V0VG9wO1xuXG4gICAgY29uc3QgYW5pbWF0ZVNjcm9sbCA9ICgpID0+IHtcbiAgICAgIC8vIGluY3JlbWVudCB0aGUgdGltZVxuICAgICAgY3VycmVudFRpbWUgKz0gaW5jcmVtZW50O1xuICAgICAgLy8gZmluZCB0aGUgdmFsdWUgd2l0aCB0aGUgZWFzaW5nIGZ1bmN0aW9uXG4gICAgICBpZiAodHlwZW9mIG9wdGlvbnMubGVmdCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgY29uc3QgZGVsdGFYID0gb3B0aW9ucy5sZWZ0IC0gb3B0aW9ucy5vZmZzZXRMZWZ0O1xuICAgICAgICB2YWxYID0gb3B0aW9ucy5lYXNlRnVuYyhjdXJyZW50VGltZSwgb3B0aW9ucy5vZmZzZXRMZWZ0LCBkZWx0YVgsIG9wdGlvbnMuZHVyYXRpb24pO1xuICAgICAgfVxuICAgICAgaWYgKHR5cGVvZiBvcHRpb25zLnRvcCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgY29uc3QgZGVsdGFZID0gb3B0aW9ucy50b3AgLSBvcHRpb25zLm9mZnNldFRvcDtcbiAgICAgICAgdmFsWSA9IG9wdGlvbnMuZWFzZUZ1bmMoY3VycmVudFRpbWUsIG9wdGlvbnMub2Zmc2V0VG9wLCBkZWx0YVksIG9wdGlvbnMuZHVyYXRpb24pO1xuICAgICAgfVxuICAgICAgLy8gc2Nyb2xsIHRvIHBvc2l0aW9uXG4gICAgICBvcHRpb25zLnNjcm9sbEZ1bmModmFsWCwgdmFsWSk7XG4gICAgICAvLyBkbyB0aGUgYW5pbWF0aW9uIHVubGVzcyBpdHMgb3ZlclxuICAgICAgaWYgKGN1cnJlbnRUaW1lIDwgb3B0aW9ucy5kdXJhdGlvbikge1xuICAgICAgICBhbmltYXRpb25GcmFtZVNjaGVkdWxlci5zY2hlZHVsZShhbmltYXRlU2Nyb2xsKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJlc29sdmUoKTtcbiAgICAgIH1cbiAgICB9O1xuICAgIGFuaW1hdGVTY3JvbGwoKTtcbiAgfSk7XG59XG5cbi8vIGVhc2luZyBmdW5jdGlvbnMgaHR0cDovL2dvby5nbC81SExsOFxuZXhwb3J0IGZ1bmN0aW9uIGVhc2VJbk91dFF1YWQodDogbnVtYmVyLCBiOiBudW1iZXIsIGM6IG51bWJlciwgZDogbnVtYmVyKSB7XG4gIHQgLz0gZCAvIDI7XG4gIGlmICh0IDwgMSkge1xuICAgIHJldHVybiAoYyAvIDIpICogdCAqIHQgKyBiO1xuICB9XG4gIHQtLTtcbiAgcmV0dXJuICgtYyAvIDIpICogKHQgKiAodCAtIDIpIC0gMSkgKyBiO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZWFzZUluQ3ViaWModDogbnVtYmVyLCBiOiBudW1iZXIsIGM6IG51bWJlciwgZDogbnVtYmVyKSB7XG4gIGNvbnN0IHRjID0gKHQgLz0gZCkgKiB0ICogdDtcbiAgcmV0dXJuIGIgKyBjICogdGM7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpbk91dFF1aW50aWModDogbnVtYmVyLCBiOiBudW1iZXIsIGM6IG51bWJlciwgZDogbnVtYmVyKSB7XG4gIGNvbnN0IHRzID0gKHQgLz0gZCkgKiB0LFxuICAgIHRjID0gdHMgKiB0O1xuICByZXR1cm4gYiArIGMgKiAoNiAqIHRjICogdHMgKyAtMTUgKiB0cyAqIHRzICsgMTAgKiB0Yyk7XG59XG4iXX0=