ngx-scrollbar-v8
Version:
Custom overlay-scrollbars with native scrolling mechanism.
282 lines • 20.9 kB
JavaScript
/**
* @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=