UNPKG

theme-lib

Version:

This is a simple example Angular Library published to npm.

263 lines 24 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ import * as tslib_1 from "tslib"; import { Directive, Input, HostListener, ElementRef, EventEmitter, Output, ContentChildren, QueryList, } from '@angular/core'; import { forkJoin, of as observableOf, interval, timer } from 'rxjs'; import { takeWhile, filter, switchMap, map, takeUntil, take } from 'rxjs/operators'; import { convertToBoolProperty } from '../helpers'; import { NbLayoutScrollService } from '../../services/scroll.service'; import { NbLayoutRulerService } from '../../services/ruler.service'; import { NbListItemComponent } from './list.component'; var NbScrollableContainerDimentions = /** @class */ (function () { function NbScrollableContainerDimentions() { } return NbScrollableContainerDimentions; }()); export { NbScrollableContainerDimentions }; if (false) { /** @type {?} */ NbScrollableContainerDimentions.prototype.scrollTop; /** @type {?} */ NbScrollableContainerDimentions.prototype.scrollHeight; /** @type {?} */ NbScrollableContainerDimentions.prototype.clientHeight; } /* * Infinite List Directive * * ```html * <nb-list nbInfiniteList [threshold]="500" (bottomThreshold)="loadNext()"> * <nb-list-item *ngFor="let item of items"></nb-list-item> * </nb-list> * ``` * * @stacked-example(Simple infinite list, infinite-list/infinite-list-showcase.component) * * Directive will notify when list scrolled up or down to given a threshold. * By default it listen to scroll of list on which applied, but also can be set to listen to window scroll. * * @stacked-example(Scroll modes, infinite-list/infinite-list-scroll-modes.component) * * To improve UX of infinite lists, it's better to keep current page in url, * so user able to return to the last viewed page or to share a link to this page. * `nbListPageTracker` directive will help you to know, what page user currently viewing. * Just put it on a list, set page size and it will calculate page that currently in viewport. * You can [open the example](example/infinite-list/infinite-news-list.component) * in a new tab to check out this feature. * * @stacked-example(Infinite list with pager, infinite-list/infinite-news-list.component) * * @stacked-example(Infinite list with placeholders at the top, infinite-list/infinite-list-placeholders.component) * */ var NbInfiniteListDirective = /** @class */ (function () { function NbInfiniteListDirective(elementRef, scrollService, dimensionsService) { this.elementRef = elementRef; this.scrollService = scrollService; this.dimensionsService = dimensionsService; this.alive = true; this.windowScroll = false; /* * Emits when distance between list bottom and current scroll position is less than threshold. */ this.bottomThreshold = new EventEmitter(true); /* * Emits when distance between list top and current scroll position is less than threshold. */ this.topThreshold = new EventEmitter(true); } Object.defineProperty(NbInfiniteListDirective.prototype, "elementScroll", { get: /** * @private * @return {?} */ function () { return !this.windowScroll; }, enumerable: true, configurable: true }); Object.defineProperty(NbInfiniteListDirective.prototype, "listenWindowScroll", { /* * By default component observes list scroll position. * If set to `true`, component will observe position of page scroll instead. */ set: /* * By default component observes list scroll position. * If set to `true`, component will observe position of page scroll instead. */ /** * @param {?} value * @return {?} */ function (value) { this.windowScroll = convertToBoolProperty(value); }, enumerable: true, configurable: true }); /** * @return {?} */ NbInfiniteListDirective.prototype.onElementScroll = /** * @return {?} */ function () { if (this.elementScroll) { this.checkPosition(this.elementRef.nativeElement); } }; /** * @return {?} */ NbInfiniteListDirective.prototype.ngAfterViewInit = /** * @return {?} */ function () { var _this = this; this.scrollService.onScroll() .pipe(takeWhile(function () { return _this.alive; }), filter(function () { return _this.windowScroll; }), switchMap(function () { return _this.getContainerDimensions(); })) .subscribe(function (dimentions) { return _this.checkPosition(dimentions); }); this.listItems.changes .pipe(takeWhile(function () { return _this.alive; }), // For some reason, changes are emitted before list item removed from dom, // so dimensions will be incorrect. // Check every 50ms for a second if dom and query are in sync. // Once they synchronized, we can get proper dimensions. switchMap(function () { return interval(50).pipe(takeUntil(timer(1000)), filter(function () { return _this.inSyncWithDom(); }), take(1)); }), switchMap(function () { return _this.getContainerDimensions(); })) .subscribe(function (dimentions) { return _this.checkPosition(dimentions); }); this.getContainerDimensions().subscribe(function (dimentions) { return _this.checkPosition(dimentions); }); }; /** * @return {?} */ NbInfiniteListDirective.prototype.ngOnDestroy = /** * @return {?} */ function () { this.alive = false; }; /** * @param {?} __0 * @return {?} */ NbInfiniteListDirective.prototype.checkPosition = /** * @param {?} __0 * @return {?} */ function (_a) { var scrollHeight = _a.scrollHeight, scrollTop = _a.scrollTop, clientHeight = _a.clientHeight; /** @type {?} */ var initialCheck = this.lastScrollPosition == null; /** @type {?} */ var manualCheck = this.lastScrollPosition === scrollTop; /** @type {?} */ var scrollUp = scrollTop < this.lastScrollPosition; /** @type {?} */ var scrollDown = scrollTop > this.lastScrollPosition; /** @type {?} */ var distanceToBottom = scrollHeight - scrollTop - clientHeight; if ((initialCheck || manualCheck || scrollDown) && distanceToBottom <= this.threshold) { this.bottomThreshold.emit(); } if ((initialCheck || scrollUp) && scrollTop <= this.threshold) { this.topThreshold.emit(); } this.lastScrollPosition = scrollTop; }; /** * @private * @return {?} */ NbInfiniteListDirective.prototype.getContainerDimensions = /** * @private * @return {?} */ function () { if (this.elementScroll) { var _a = this.elementRef.nativeElement, scrollTop = _a.scrollTop, scrollHeight = _a.scrollHeight, clientHeight = _a.clientHeight; return observableOf({ scrollTop: scrollTop, scrollHeight: scrollHeight, clientHeight: clientHeight }); } return forkJoin(this.scrollService.getPosition(), this.dimensionsService.getDimensions()) .pipe(map(function (_a) { var _b = tslib_1.__read(_a, 2), scrollPosition = _b[0], dimensions = _b[1]; return ({ scrollTop: scrollPosition.y, scrollHeight: dimensions.scrollHeight, clientHeight: dimensions.clientHeight, }); })); }; /** * @private * @return {?} */ NbInfiniteListDirective.prototype.inSyncWithDom = /** * @private * @return {?} */ function () { return this.elementRef.nativeElement.children.length === this.listItems.length; }; NbInfiniteListDirective.decorators = [ { type: Directive, args: [{ selector: '[nbInfiniteList]', },] } ]; /** @nocollapse */ NbInfiniteListDirective.ctorParameters = function () { return [ { type: ElementRef }, { type: NbLayoutScrollService }, { type: NbLayoutRulerService } ]; }; NbInfiniteListDirective.propDecorators = { threshold: [{ type: Input }], listenWindowScroll: [{ type: Input }], bottomThreshold: [{ type: Output }], topThreshold: [{ type: Output }], onElementScroll: [{ type: HostListener, args: ['scroll',] }], listItems: [{ type: ContentChildren, args: [NbListItemComponent,] }] }; return NbInfiniteListDirective; }()); export { NbInfiniteListDirective }; if (false) { /** * @type {?} * @private */ NbInfiniteListDirective.prototype.alive; /** * @type {?} * @private */ NbInfiniteListDirective.prototype.lastScrollPosition; /** @type {?} */ NbInfiniteListDirective.prototype.windowScroll; /** @type {?} */ NbInfiniteListDirective.prototype.threshold; /** @type {?} */ NbInfiniteListDirective.prototype.bottomThreshold; /** @type {?} */ NbInfiniteListDirective.prototype.topThreshold; /** @type {?} */ NbInfiniteListDirective.prototype.listItems; /** * @type {?} * @private */ NbInfiniteListDirective.prototype.elementRef; /** * @type {?} * @private */ NbInfiniteListDirective.prototype.scrollService; /** * @type {?} * @private */ NbInfiniteListDirective.prototype.dimensionsService; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5maW5pdGUtbGlzdC5kaXJlY3RpdmUuanMiLCJzb3VyY2VSb290Ijoibmc6Ly90aGVtZS1saWIvIiwic291cmNlcyI6WyJsaWIvY29tcG9uZW50cy9saXN0L2luZmluaXRlLWxpc3QuZGlyZWN0aXZlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsT0FBTyxFQUNMLFNBQVMsRUFDVCxLQUFLLEVBQ0wsWUFBWSxFQUNaLFVBQVUsRUFDVixZQUFZLEVBQ1osTUFBTSxFQUdOLGVBQWUsRUFDZixTQUFTLEdBQ1YsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFjLFFBQVEsRUFBRSxFQUFFLElBQUksWUFBWSxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDakYsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLEdBQUcsRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDcEYsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sWUFBWSxDQUFDO0FBQ25ELE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLCtCQUErQixDQUFDO0FBQ3RFLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBQ3BFLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBRXZEO0lBQUE7SUFJQSxDQUFDO0lBQUQsc0NBQUM7QUFBRCxDQUFDLEFBSkQsSUFJQzs7OztJQUhDLG9EQUFrQjs7SUFDbEIsdURBQXFCOztJQUNyQix1REFBcUI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQStCdkI7SUFpREUsaUNBQ1UsVUFBc0IsRUFDdEIsYUFBb0MsRUFDcEMsaUJBQXVDO1FBRnZDLGVBQVUsR0FBVixVQUFVLENBQVk7UUFDdEIsa0JBQWEsR0FBYixhQUFhLENBQXVCO1FBQ3BDLHNCQUFpQixHQUFqQixpQkFBaUIsQ0FBc0I7UUEvQ3pDLFVB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Q0FBQyxhQUFhLENBQUMsUUFBUSxDQUFDLE1BQU0sS0FBSyxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQztJQUNqRixDQUFDOztnQkExSEYsU0FBUyxTQUFDO29CQUNULFFBQVEsRUFBRSxrQkFBa0I7aUJBQzdCOzs7O2dCQW5EQyxVQUFVO2dCQVdILHFCQUFxQjtnQkFDckIsb0JBQW9COzs7NEJBcUQxQixLQUFLO3FDQU9MLEtBQUs7a0NBUUwsTUFBTTsrQkFNTixNQUFNO2tDQUdOLFlBQVksU0FBQyxRQUFROzRCQU9yQixlQUFlLFNBQUMsbUJBQW1COztJQTRFdEMsOEJBQUM7Q0FBQSxBQTNIRCxJQTJIQztTQXhIWSx1QkFBdUI7Ozs7OztJQUVsQyx3Q0FBcUI7Ozs7O0lBQ3JCLHFEQUEyQjs7SUFDM0IsK0NBQXFCOztJQVNyQiw0Q0FDa0I7O0lBY2xCLGtEQUN5Qzs7SUFLekMsK0NBQ3NDOztJQVN0Qyw0Q0FBZ0Y7Ozs7O0lBRzlFLDZDQUE4Qjs7Ozs7SUFDOUIsZ0RBQTRDOzs7OztJQUM1QyxvREFBK0MiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xyXG4gIERpcmVjdGl2ZSxcclxuICBJbnB1dCxcclxuICBIb3N0TGlzdGVuZXIsXHJcbiAgRWxlbWVudFJlZixcclxuICBFdmVudEVtaXR0ZXIsXHJcbiAgT3V0cHV0LFxyXG4gIE9uRGVzdHJveSxcclxuICBBZnRlclZpZXdJbml0LFxyXG4gIENvbnRlbnRDaGlsZHJlbixcclxuICBRdWVyeUxpc3QsXHJcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IE9ic2VydmFibGUsIGZvcmtKb2luLCBvZiBhcyBvYnNlcnZhYmxlT2YsIGludGVydmFsLCB0aW1lciB9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQgeyB0YWtlV2hpbGUsIGZpbHRlciwgc3dpdGNoTWFwLCBtYXAsIHRha2VVbnRpbCwgdGFrZSB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcclxuaW1wb3J0IHsgY29udmVydFRvQm9vbFByb3BlcnR5IH0gZnJvbSAnLi4vaGVscGVycyc7XHJcbmltcG9ydCB7IE5iTGF5b3V0U2Nyb2xsU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL3Njcm9sbC5zZXJ2aWNlJztcclxuaW1wb3J0IHsgTmJMYXlvdXRSdWxlclNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9ydWxlci5zZXJ2aWNlJztcclxuaW1wb3J0IHsgTmJMaXN0SXRlbUNvbXBvbmVudCB9IGZyb20gJy4vbGlzdC5jb21wb25lbnQnO1xyXG5cclxuZXhwb3J0IGNsYXNzIE5iU2Nyb2xsYWJsZUNvbnRhaW5lckRpbWVudGlvbnMge1xyXG4gIHNjcm9sbFRvcDogbnVtYmVyO1xyXG4gIHNjcm9sbEhlaWdodDogbnVtYmVyO1xyXG4gIGNsaWVudEhlaWdodDogbnVtYmVyO1xyXG59XHJcblxyXG4vKlxyXG4gKiBJbmZpbml0ZSBMaXN0IERpcmVjdGl2ZVxyXG4gKlxyXG4gKiBgYGBodG1sXHJcbiAqICA8bmItbGlzdCBuYkluZmluaXRlTGlzdCBbdGhyZXNob2xkXT1cIjUwMFwiIChib3R0b21UaHJlc2hvbGQpPVwibG9hZE5leHQoKVwiPlxyXG4gKiAgICA8bmItbGlzdC1pdGVtICpuZ0Zvcj1cImxldCBpdGVtIG9mIGl0ZW1zXCI+PC9uYi1saXN0LWl0ZW0+XHJcbiAqICA8L25iLWxpc3Q+XHJcbiAqIGBgYFxyXG4gKlxyXG4gKiBAc3RhY2tlZC1leGFtcGxlKFNpbXBsZSBpbmZpbml0ZSBsaXN0LCBpbmZpbml0ZS1saXN0L2luZmluaXRlLWxpc3Qtc2hvd2Nhc2UuY29tcG9uZW50KVxyXG4gKlxyXG4gKiBEaXJlY3RpdmUgd2lsbCBub3RpZnkgd2hlbiBsaXN0IHNjcm9sbGVkIHVwIG9yIGRvd24gdG8gZ2l2ZW4gYSB0aHJlc2hvbGQuXHJcbiAqIEJ5IGRlZmF1bHQgaXQgbGlzdGVuIHRvIHNjcm9sbCBvZiBsaXN0IG9uIHdoaWNoIGFwcGxpZWQsIGJ1dCBhbHNvIGNhbiBiZSBzZXQgdG8gbGlzdGVuIHRvIHdpbmRvdyBzY3JvbGwuXHJcbiAqXHJcbiAqIEBzdGFja2VkLWV4YW1wbGUoU2Nyb2xsIG1vZGVzLCBpbmZpbml0ZS1saXN0L2luZmluaXRlLWxpc3Qtc2Nyb2xsLW1vZGVzLmNvbXBvbmVudClcclxuICpcclxuICogVG8gaW1wcm92ZSBVWCBvZiBpbmZpbml0ZSBsaXN0cywgaXQncyBiZXR0ZXIgdG8ga2VlcCBjdXJyZW50IHBhZ2UgaW4gdXJsLFxyXG4gKiBzbyB1c2VyIGFibGUgdG8gcmV0dXJuIHRvIHRoZSBsYXN0IHZpZXdlZCBwYWdlIG9yIHRvIHNoYXJlIGEgbGluayB0byB0aGlzIHBhZ2UuXHJcbiAqIGBuYkxpc3RQYWdlVHJhY2tlcmAgZGlyZWN0aXZlIHdpbGwgaGVscCB5b3UgdG8ga25vdywgd2hhdCBwYWdlIHVzZXIgY3VycmVudGx5IHZpZXdpbmcuXHJcbiAqIEp1c3QgcHV0IGl0IG9uIGEgbGlzdCwgc2V0IHBhZ2Ugc2l6ZSBhbmQgaXQgd2lsbCBjYWxjdWxhdGUgcGFnZSB0aGF0IGN1cnJlbnRseSBpbiB2aWV3cG9ydC5cclxuICogWW91IGNhbiBbb3BlbiB0aGUgZXhhbXBsZV0oZXhhbXBsZS9pbmZpbml0ZS1saXN0L2luZmluaXRlLW5ld3MtbGlzdC5jb21wb25lbnQpXHJcbiAqIGluIGEgbmV3IHRhYiB0byBjaGVjayBvdXQgdGhpcyBmZWF0dXJlLlxyXG4gKlxyXG4gKiBAc3RhY2tlZC1leGFtcGxlKEluZmluaXRlIGxpc3Qgd2l0aCBwYWdlciwgaW5maW5pdGUtbGlzdC9pbmZpbml0ZS1uZXdzLWxpc3QuY29tcG9uZW50KVxyXG4gKlxyXG4gKiBAc3RhY2tlZC1leGFtcGxlKEluZmluaXRlIGxpc3Qgd2l0aCBwbGFjZWhvbGRlcnMgYXQgdGhlIHRvcCwgaW5maW5pdGUtbGlzdC9pbmZpbml0ZS1saXN0LXBsYWNlaG9sZGVycy5jb21wb25lbnQpXHJcbiAqXHJcbiAqL1xyXG5ARGlyZWN0aXZlKHtcclxuICBzZWxlY3RvcjogJ1tuYkluZmluaXRlTGlzdF0nLFxyXG59KVxyXG5leHBvcnQgY2xhc3MgTmJJbmZpbml0ZUxpc3REaXJlY3RpdmUgaW1wbGVtZW50cyBBZnRlclZpZXdJbml0LCBPbkRlc3Ryb3kge1xyXG5cclxuICBwcml2YXRlIGFsaXZlID0gdHJ1ZTtcclxuICBwcml2YXRlIGxhc3RTY3JvbGxQb3NpdGlvbjtcclxuICB3aW5kb3dTY3JvbGwgPSBmYWxzZTtcclxuICBwcml2YXRlIGdldCBlbGVtZW50U2Nyb2xsKCkge1xyXG4gICAgcmV0dXJuICF0aGlzLndpbmRvd1Njcm9sbDtcclxuICB9XHJcblxyXG4gIC8qXHJcbiAgICogVGhyZXNob2xkIGFmdGVyIHdoaWNoIGV2ZW50IGxvYWQgbW9yZSBldmVudCB3aWxsIGJlIGVtaXRlZC5cclxuICAgKiBJbiBwaXhlbHMuXHJcbiAgICovXHJcbiAgQElucHV0KClcclxuICB0aHJlc2hvbGQ6IG51bWJlcjtcclxuXHJcbiAgLypcclxuICAgKiBCeSBkZWZhdWx0IGNvbXBvbmVudCBvYnNlcnZlcyBsaXN0IHNjcm9sbCBwb3NpdGlvbi5cclxuICAgKiBJZiBzZXQgdG8gYHRydWVgLCBjb21wb25lbnQgd2lsbCBvYnNlcnZlIHBvc2l0aW9uIG9mIHBhZ2Ugc2Nyb2xsIGluc3RlYWQuXHJcbiAgICovXHJcbiAgQElucHV0KClcclxuICBzZXQgbGlzdGVuV2luZG93U2Nyb2xsKHZhbHVlKSB7XHJcbiAgICB0aGlzLndpbmRvd1Njcm9sbCA9IGNvbnZlcnRUb0Jvb2xQcm9wZXJ0eSh2YWx1ZSk7XHJcbiAgfVxyXG5cclxuICAvKlxyXG4gICAqIEVtaXRzIHdoZW4gZGlzdGFuY2UgYmV0d2VlbiBsaXN0IGJvdHRvbSBhbmQgY3VycmVudCBzY3JvbGwgcG9zaXRpb24gaXMgbGVzcyB0aGFuIHRocmVzaG9sZC5cclxuICAgKi9cclxuICBAT3V0cHV0KClcclxuICBib3R0b21UaHJlc2hvbGQgPSBuZXcgRXZlbnRFbWl0dGVyKHRydWUpO1xyXG5cclxuICAvKlxyXG4gICAqIEVtaXRzIHdoZW4gZGlzdGFuY2UgYmV0d2VlbiBsaXN0IHRvcCBhbmQgY3VycmVudCBzY3JvbGwgcG9zaXRpb24gaXMgbGVzcyB0aGFuIHRocmVzaG9sZC5cclxuICAgKi9cclxuICBAT3V0cHV0KClcclxuICB0b3BUaHJlc2hvbGQgPSBuZXcgRXZlbnRFbWl0dGVyKHRydWUpO1xyXG5cclxuICBASG9zdExpc3RlbmVyKCdzY3JvbGwnKVxyXG4gIG9uRWxlbWVudFNjcm9sbCgpIHtcclxuICAgIGlmICh0aGlzLmVsZW1lbnRTY3JvbGwpIHtcclxuICAgICAgdGhpcy5jaGVja1Bvc2l0aW9uKHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIEBDb250ZW50Q2hpbGRyZW4oTmJMaXN0SXRlbUNvbXBvbmVudCkgbGlzdEl0ZW1zOiBRdWVyeUxpc3Q8TmJMaXN0SXRlbUNvbXBvbmVudD47XHJcblxyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgcHJpdmF0ZSBlbGVtZW50UmVmOiBFbGVtZW50UmVmLFxyXG4gICAgcHJpdmF0ZSBzY3JvbGxTZXJ2aWNlOiBOYkxheW91dFNjcm9sbFNlcnZpY2UsXHJcbiAgICBwcml2YXRlIGRpbWVuc2lvbnNTZXJ2aWNlOiBOYkxheW91dFJ1bGVyU2VydmljZSxcclxuICApIHt9XHJcblxyXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpIHtcclxuICAgIHRoaXMuc2Nyb2xsU2VydmljZS5vblNjcm9sbCgpXHJcbiAgICAgIC5waXBlKFxyXG4gICAgICAgIHRha2VXaGlsZSgoKSA9PiB0aGlzLmFsaXZlKSxcclxuICAgICAgICBmaWx0ZXIoKCkgPT4gdGhpcy53aW5kb3dTY3JvbGwpLFxyXG4gICAgICAgIHN3aXRjaE1hcCgoKSA9PiB0aGlzLmdldENvbnRhaW5lckRpbWVuc2lvbnMoKSksXHJcbiAgICAgIClcclxuICAgICAgLnN1YnNjcmliZShkaW1lbnRpb25zID0+IHRoaXMuY2hlY2tQb3NpdGlvbihkaW1lbnRpb25zKSk7XHJcblxyXG4gICAgdGhpcy5saXN0SXRlbXMuY2hhbmdlc1xyXG4gICAgICAucGlwZShcclxuICAgICAgICB0YWtlV2hpbGUoKCkgPT4gdGhpcy5hbGl2ZSksXHJcbiAgICAgICAgLy8gRm9yIHNvbWUgcmVhc29uLCBjaGFuZ2VzIGFyZSBlbWl0dGVkIGJlZm9yZSBsaXN0IGl0ZW0gcmVtb3ZlZCBmcm9tIGRvbSxcclxuICAgICAgICAvLyBzbyBkaW1lbnNpb25zIHdpbGwgYmUgaW5jb3JyZWN0LlxyXG4gICAgICAgIC8vIENoZWNrIGV2ZXJ5IDUwbXMgZm9yIGEgc2Vjb25kIGlmIGRvbSBhbmQgcXVlcnkgYXJlIGluIHN5bmMuXHJcbiAgICAgICAgLy8gT25jZSB0aGV5IHN5bmNocm9uaXplZCwgd2UgY2FuIGdldCBwcm9wZXIgZGltZW5zaW9ucy5cclxuICAgICAgICBzd2l0Y2hNYXAoKCkgPT4gaW50ZXJ2YWwoNTApLnBpcGUoXHJcbiAgICAgICAgICB0YWtlVW50aWwodGltZXIoMTAwMCkpLFxyXG4gICAgICAgICAgZmlsdGVyKCgpID0+IHRoaXMuaW5TeW5jV2l0aERvbSgpKSxcclxuICAgICAgICAgIHRha2UoMSksXHJcbiAgICAgICAgKSksXHJcbiAgICAgICAgc3dpdGNoTWFwKCgpID0+IHRoaXMuZ2V0Q29udGFpbmVyRGltZW5zaW9ucygpKSxcclxuICAgICAgKVxyXG4gICAgICAuc3Vic2NyaWJlKGRpbWVudGlvbnMgPT4gdGhpcy5jaGVja1Bvc2l0aW9uKGRpbWVudGlvbnMpKTtcclxuXHJcbiAgICAgIHRoaXMuZ2V0Q29udGFpbmVyRGltZW5zaW9ucygpLnN1YnNjcmliZShkaW1lbnRpb25zID0+IHRoaXMuY2hlY2tQb3NpdGlvbihkaW1lbnRpb25zKSk7XHJcbiAgfVxyXG5cclxuICBuZ09uRGVzdHJveSgpIHtcclxuICAgIHRoaXMuYWxpdmUgPSBmYWxzZTtcclxuICB9XHJcblxyXG4gIGNoZWNrUG9zaXRpb24oeyBzY3JvbGxIZWlnaHQsIHNjcm9sbFRvcCwgY2xpZW50SGVpZ2h0IH06IE5iU2Nyb2xsYWJsZUNvbnRhaW5lckRpbWVudGlvbnMpIHtcclxuICAgIGNvbnN0IGluaXRpYWxDaGVjayA9IHRoaXMubGFzdFNjcm9sbFBvc2l0aW9uID09IG51bGw7XHJcbiAgICBjb25zdCBtYW51YWxDaGVjayA9IHRoaXMubGFzdFNjcm9sbFBvc2l0aW9uID09PSBzY3JvbGxUb3A7XHJcbiAgICBjb25zdCBzY3JvbGxVcCA9IHNjcm9sbFRvcCA8IHRoaXMubGFzdFNjcm9sbFBvc2l0aW9uO1xyXG4gICAgY29uc3Qgc2Nyb2xsRG93biA9IHNjcm9sbFRvcCA+IHRoaXMubGFzdFNjcm9sbFBvc2l0aW9uO1xyXG4gICAgY29uc3QgZGlzdGFuY2VUb0JvdHRvbSA9IHNjcm9sbEhlaWdodCAtIHNjcm9sbFRvcCAtIGNsaWVudEhlaWdodDtcclxuXHJcbiAgICBpZiAoKGluaXRpYWxDaGVjayB8fCAgbWFudWFsQ2hlY2sgfHwgc2Nyb2xsRG93bikgJiYgZGlzdGFuY2VUb0JvdHRvbSA8PSB0aGlzLnRocmVzaG9sZCkge1xyXG4gICAgICB0aGlzLmJvdHRvbVRocmVzaG9sZC5lbWl0KCk7XHJcbiAgICB9XHJcbiAgICBpZiAoKGluaXRpYWxDaGVjayB8fCBzY3JvbGxVcCkgJiYgc2Nyb2xsVG9wIDw9IHRoaXMudGhyZXNob2xkKSB7XHJcbiAgICAgIHRoaXMudG9wVGhyZXNob2xkLmVtaXQoKTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLmxhc3RTY3JvbGxQb3NpdGlvbiA9IHNjcm9sbFRvcDtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZ2V0Q29udGFpbmVyRGltZW5zaW9ucygpOiBPYnNlcnZhYmxlPE5iU2Nyb2xsYWJsZUNvbnRhaW5lckRpbWVudGlvbnM+IHtcclxuICAgIGlmICh0aGlzLmVsZW1lbnRTY3JvbGwpIHtcclxuICAgICAgY29uc3QgeyBzY3JvbGxUb3AsIHNjcm9sbEhlaWdodCwgY2xpZW50SGVpZ2h0IH0gPSB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudDtcclxuICAgICAgcmV0dXJuIG9ic2VydmFibGVPZih7IHNjcm9sbFRvcCwgc2Nyb2xsSGVpZ2h0LCBjbGllbnRIZWlnaHQgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIGZvcmtKb2luKHRoaXMuc2Nyb2xsU2VydmljZS5nZXRQb3NpdGlvbigpLCB0aGlzLmRpbWVuc2lvbnNTZXJ2aWNlLmdldERpbWVuc2lvbnMoKSlcclxuICAgICAgLnBpcGUoXHJcbiAgICAgICAgICBtYXAoKFtzY3JvbGxQb3NpdGlvbiwgZGltZW5zaW9uc10pID0+ICh7XHJcbiAgICAgICAgICAgIHNjcm9sbFRvcDogc2Nyb2xsUG9zaXRpb24ueSxcclxuICAgICAgICAgICAgc2Nyb2xsSGVpZ2h0OiBkaW1lbnNpb25zLnNjcm9sbEhlaWdodCxcclxuICAgICAgICAgICAgY2xpZW50SGVpZ2h0OiBkaW1lbnNpb25zLmNsaWVudEhlaWdodCxcclxuICAgICAgICAgIH0pKSxcclxuICAgICAgKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgaW5TeW5jV2l0aERvbSgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5jaGlsZHJlbi5sZW5ndGggPT09IHRoaXMubGlzdEl0ZW1zLmxlbmd0aDtcclxuICB9XHJcbn1cclxuIl19