UNPKG

@fivethree/core

Version:
346 lines 29.7 kB
/** * @fileoverview added by tsickle * Generated from: lib/refresher/refresher.component.ts * @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ import * as tslib_1 from "tslib"; import { takeUntil, tap, filter, map } from 'rxjs/operators'; import { FivPull } from './../pull/pull.directive'; import { FivRefresherContent } from './refresher-content/refresher-content.component'; import { Component, Output, EventEmitter, ViewChild, ElementRef, Input, Renderer2 } from '@angular/core'; import { animate, style, transition, trigger, AnimationBuilder } from '@angular/animations'; import { Platform } from '@ionic/angular'; import { Subject } from 'rxjs'; import { easeOutSine, tween, reverse } from '@fivethree/ngx-rxjs-animations'; export class FivRefresher { /** * @param {?} builder * @param {?} refresher * @param {?} renderer * @param {?} platform */ constructor(builder, refresher, renderer, platform) { this.builder = builder; this.refresher = refresher; this.renderer = renderer; this.platform = platform; this.hintText = 'new posts'; this.maxPullHeight = 168; this.minPullHeight = 112; this.fivProgressChanged = new EventEmitter(); this.fivRefresh = new EventEmitter(); this.hintVisible = false; this.currentProgress = 0; this.refreshing = false; this.$onDestroy = new Subject(); } /** * @return {?} */ ngOnInit() { return tslib_1.__awaiter(this, void 0, void 0, function* () { yield this.attachPullDirective(); }); } /** * @return {?} */ ngOnDestroy() { this.$onDestroy.next(); } /** * @private * @return {?} */ attachPullDirective() { return tslib_1.__awaiter(this, void 0, void 0, function* () { /** @type {?} */ const content = this.refresher.nativeElement.closest('ion-content'); if (!content) { throw new Error('The fiv-refresher component needs to be inside of an ion-content.'); } content.scrollEvents = true; /** @type {?} */ const scroll = yield content.getScrollElement(); /** @type {?} */ const pull = new FivPull(new ElementRef(content), this.platform, content); pull.init(); pull.fivPull .pipe(filter((/** * @return {?} */ () => !this.refreshing && !this.hintVisible)), tap((/** * @param {?} progress * @return {?} */ progress => this.fivPull(progress))), takeUntil(this.$onDestroy)) .subscribe(); pull.fivRefresh .pipe(tap((/** * @return {?} */ () => this.refresh())), takeUntil(this.$onDestroy)) .subscribe(); pull.fivCancel .pipe(tap((/** * @return {?} */ () => this.moveBack())), takeUntil(this.$onDestroy)) .subscribe(); this.spinner.fivComplete.pipe(takeUntil(this.$onDestroy)).subscribe(); this.fivRefresh .pipe(tap((/** * @return {?} */ () => scroll.scrollTo({ top: 0, behavior: 'smooth' }))), takeUntil(this.$onDestroy)) .subscribe(); }); } /** * @return {?} */ refresh() { if (this.refreshing) { return; } this.refreshing = true; this.spinner.load(); this.setPullAnimationProgress(112 / 168); this.fivRefresh.emit(this); } /** * @return {?} */ complete() { if (!this.refreshing) { return; } this.spinner.complete(); } /** * @return {?} */ onDone() { this.spinner.hide(); } /** * @return {?} */ onHidden() { this.refreshing = false; this.setPullAnimationProgress(0); } /** * @return {?} */ showHint() { this.hintVisible = true; } /** * @return {?} */ onHintClicked() { this.hintVisible = false; } /** * @param {?} event * @return {?} */ postHint(event) { if (!event.fromState && event.toState === 'void') { this.refresh(); } } /** * @param {?} progress * @return {?} */ setPullAnimationProgress(progress) { this.currentProgress = progress; if (progress < 1) { this.renderer.setStyle(this.spinner.element.nativeElement, 'transform', `translateY(${this.minPullHeight * progress}px)`); } } /** * @param {?} progress * @return {?} */ changeAnimationToProgress(progress) { return new Promise((/** * @param {?} resolve * @return {?} */ resolve => { /** @type {?} */ const animation = this.builder.build([ style({ transform: `translateY(${100 * this.currentProgress}px) rotateZ(${360 * this.currentProgress}deg)` }), animate('85ms ease-in', style({ transform: `translateY(${100 * progress}px) rotateZ(${360 * progress}deg)` })) ]); /** @type {?} */ const player = animation.create(this.spinner.element.nativeElement); player.play(); player.onDone((/** * @return {?} */ () => { this.setPullAnimationProgress(progress); player.destroy(); resolve(); })); })); } /** * @param {?} progress * @return {?} */ fivPull(progress) { this.setPullAnimationProgress(progress); this.spinner.show(); /** @type {?} */ const value = Math.max(0, Math.min(100, (progress * 100 * this.maxPullHeight) / this.minPullHeight)); this.spinner.setValue(value * 0.84); } /** * @return {?} */ moveBack() { /** @type {?} */ const animation = this.builder.build([ style({ transform: `translateY(${this.currentProgress * this.minPullHeight}px) rotateZ(${360 * this.currentProgress}deg)` }), animate('205ms ease-in', style({ transform: 'translateY(0) rotateZ(0)' })) ]); /** @type {?} */ const player = animation.create(this.spinner.element.nativeElement); tween(easeOutSine, 145) .pipe(reverse(), map((/** * @param {?} n * @return {?} */ n => Math.max(0, Math.min(100, (this.currentProgress * n * 100 * this.maxPullHeight) / this.minPullHeight)))), tap((/** * @param {?} value * @return {?} */ value => this.spinner.setValue(value)))) .subscribe(); player.play(); player.onDone((/** * @return {?} */ () => { this.setPullAnimationProgress(0); this.spinner.visible = false; player.destroy(); })); } /** * @param {?} progress * @return {?} */ onSpinnerProgress(progress) { this.fivProgressChanged.emit(progress); this.renderer // tslint:disable-next-line:max-line-length .setStyle(this.spinner.element.nativeElement, 'transform', `translateY(${this.maxPullHeight * this.currentProgress}px) rotateZ(${(360 * progress) / 200}deg)`); } } FivRefresher.decorators = [ { type: Component, args: [{ selector: 'fiv-refresher', template: "<fiv-refresher-content [progress]=\"currentProgress\" (fivProgress)=\"onSpinnerProgress($event)\" (fivComplete)=\"onDone()\"\n (fivHidden)=\"onHidden()\" #spinner>\n</fiv-refresher-content>\n\n<ion-chip class=\"gg-hint-wrapper\" *ngIf=\"hintVisible\" [@hintAnim] (@hintAnim.done)=\"postHint($event)\"\n (click)=\"onHintClicked()\" #hint>\n <ion-icon class=\"icon\" name=\"arrow-up\"></ion-icon>\n <ion-label [ngClass]=\"{'hidden': !hintVisible}\" class=\"text\">{{hintText}}</ion-label>\n</ion-chip>", animations: [ trigger('hintAnim', [ transition('void => *', [ style({ transform: 'translateY(0px) translateX(-50%)' }), animate('150ms ease-in', style({ opacity: 1, transform: 'translateY(72px) translateX(-50%)' })) ]), transition('* => void', [ style({ width: '*', opacity: 1, transform: 'translateY(72px) translateX(-50%)' }), animate('150ms 125ms ease-out', style({ width: '40px', transform: 'translateY(72px) translateX(-50%)' })) ]) ]) ], styles: [":host{--fiv-spin-color:var(--ion-color-primary);--fiv-hint-color:var(--fiv-spin-color, var(--ion-color-primary));--fiv-spin-background:var(--ion-color-light)}.icon{height:20px;width:20px;background:0 0;color:var(--fiv-hint-color)}.text{font-size:1em;color:var(--fiv-hint-color)}.text.hidden{opacity:0}.gg-hint-wrapper{position:absolute;z-index:8;opacity:1;left:50%;top:-40px;transform:translateY(72px) translateX(-50%);height:40px;padding-left:8px;padding-right:8px;background:var(--fiv-spin-background);border-radius:40px;box-shadow:0 4px 6px 0 rgba(0,0,0,.14),0 4px 5px rgba(0,0,0,.1);margin:0}"] }] } ]; /** @nocollapse */ FivRefresher.ctorParameters = () => [ { type: AnimationBuilder }, { type: ElementRef }, { type: Renderer2 }, { type: Platform } ]; FivRefresher.propDecorators = { hintText: [{ type: Input }], maxPullHeight: [{ type: Input }], minPullHeight: [{ type: Input }], fivProgressChanged: [{ type: Output }], fivRefresh: [{ type: Output }], spinner: [{ type: ViewChild, args: ['spinner', { static: false },] }] }; if (false) { /** @type {?} */ FivRefresher.prototype.hintText; /** @type {?} */ FivRefresher.prototype.maxPullHeight; /** @type {?} */ FivRefresher.prototype.minPullHeight; /** @type {?} */ FivRefresher.prototype.fivProgressChanged; /** @type {?} */ FivRefresher.prototype.fivRefresh; /** @type {?} */ FivRefresher.prototype.spinner; /** @type {?} */ FivRefresher.prototype.hintVisible; /** @type {?} */ FivRefresher.prototype.currentProgress; /** @type {?} */ FivRefresher.prototype.refreshing; /** * @type {?} * @private */ FivRefresher.prototype.$onDestroy; /** * @type {?} * @private */ FivRefresher.prototype.builder; /** * @type {?} * @private */ FivRefresher.prototype.refresher; /** * @type {?} * @private */ FivRefresher.prototype.renderer; /** * @type {?} * @private */ FivRefresher.prototype.platform; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVmcmVzaGVyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiJuZzovL0BmaXZldGhyZWUvY29yZS8iLCJzb3VyY2VzIjpbImxpYi9yZWZyZXNoZXIvcmVmcmVzaGVyLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLEdBQUcsRUFBRSxNQUFNLEVBQUUsR0FBRyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDN0QsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQ25ELE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLGlEQUFpRCxDQUFDO0FBQ3RGLE9BQU8sRUFDTCxTQUFTLEVBRVQsTUFBTSxFQUNOLFlBQVksRUFDWixTQUFTLEVBQ1QsVUFBVSxFQUNWLEtBQUssRUFDTCxTQUFTLEVBRVYsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUNMLE9BQU8sRUFDUCxLQUFLLEVBQ0wsVUFBVSxFQUNWLE9BQU8sRUFDUCxnQkFBZ0IsRUFDakIsTUFBTSxxQkFBcUIsQ0FBQztBQUM3QixPQUFPLEVBQWMsUUFBUSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDdEQsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUMvQixPQUFPLEVBQUUsV0FBVyxFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQW1DN0UsTUFBTSxPQUFPLFlBQVk7Ozs7Ozs7SUFjdkIsWUFDVSxPQUF5QixFQUN6QixTQUFxQixFQUNyQixRQUFtQixFQUNuQixRQUFrQjtRQUhsQixZQUFPLEdBQVAsT0FBTyxDQUFrQjtRQUN6QixjQUFTLEdBQVQsU0FBUyxDQUFZO1FBQ3JCLGFBQVEsR0FBUixRQUFRLENBQVc7UUFDbkIsYUFBUSxHQUFSLFFBQVEsQ0FBVTtRQWpCbkIsYUFBUSxHQUFHLFdBQVcsQ0FBQztRQUN2QixrQkFBYSxHQUFHLEdBQUcsQ0FBQztRQUNw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dUJBc0MxQixLQUFLOzRCQUNMLEtBQUs7NEJBQ0wsS0FBSztpQ0FDTCxNQUFNO3lCQUNOLE1BQU07c0JBQ04sU0FBUyxTQUFDLFNBQVMsRUFBRSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUU7Ozs7SUFMdkMsZ0NBQWdDOztJQUNoQyxxQ0FBNkI7O0lBQzdCLHFDQUE2Qjs7SUFDN0IsMENBQXdFOztJQUN4RSxrQ0FBc0U7O0lBQ3RFLCtCQUFzRTs7SUFDdEUsbUNBQW9COztJQUNwQix1Q0FBb0I7O0lBRXBCLGtDQUFtQjs7Ozs7SUFFbkIsa0NBQW1DOzs7OztJQUdqQywrQkFBaUM7Ozs7O0lBQ2pDLGlDQUE2Qjs7Ozs7SUFDN0IsZ0NBQTJCOzs7OztJQUMzQixnQ0FBMEIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyB0YWtlVW50aWwsIHRhcCwgZmlsdGVyLCBtYXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBGaXZQdWxsIH0gZnJvbSAnLi8uLi9wdWxsL3B1bGwuZGlyZWN0aXZlJztcbmltcG9ydCB7IEZpdlJlZnJlc2hlckNvbnRlbnQgfSBmcm9tICcuL3JlZnJlc2hlci1jb250ZW50L3JlZnJlc2hlci1jb250ZW50LmNvbXBvbmVudCc7XG5pbXBvcnQge1xuICBDb21wb25lbnQsXG4gIE9uSW5pdCxcbiAgT3V0cHV0LFxuICBFdmVudEVtaXR0ZXIsXG4gIFZpZXdDaGlsZCxcbiAgRWxlbWVudFJlZixcbiAgSW5wdXQsXG4gIFJlbmRlcmVyMixcbiAgT25EZXN0cm95XG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtcbiAgYW5pbWF0ZSxcbiAgc3R5bGUsXG4gIHRyYW5zaXRpb24sXG4gIHRyaWdnZXIsXG4gIEFuaW1hdGlvbkJ1aWxkZXJcbn0gZnJvbSAnQGFuZ3VsYXIvYW5pbWF0aW9ucyc7XG5pbXBvcnQgeyBJb25Db250ZW50LCBQbGF0Zm9ybSB9IGZyb20gJ0Bpb25pYy9hbmd1bGFyJztcbmltcG9ydCB7IFN1YmplY3QgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IGVhc2VPdXRTaW5lLCB0d2VlbiwgcmV2ZXJzZSB9IGZyb20gJ0BmaXZldGhyZWUvbmd4LXJ4anMtYW5pbWF0aW9ucyc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2Zpdi1yZWZyZXNoZXInLFxuICB0ZW1wbGF0ZVVybDogJy4vcmVmcmVzaGVyLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vcmVmcmVzaGVyLmNvbXBvbmVudC5zY3NzJ10sXG4gIGFuaW1hdGlvbnM6IFtcbiAgICB0cmlnZ2VyKCdoaW50QW5pbScsIFtcbiAgICAgIHRyYW5zaXRpb24oJ3ZvaWQgPT4gKicsIFtcbiAgICAgICAgc3R5bGUoeyB0cmFuc2Zvcm06ICd0cmFuc2xhdGVZKDBweCkgdHJhbnNsYXRlWCgtNTAlKScgfSksXG4gICAgICAgIGFuaW1hdGUoXG4gICAgICAgICAgJzE1MG1zIGVhc2UtaW4nLFxuICAgICAgICAgIHN0eWxlKHtcbiAgICAgICAgICAgIG9wYWNpdHk6IDEsXG4gICAgICAgICAgICB0cmFuc2Zvcm06ICd0cmFuc2xhdGVZKDcycHgpIHRyYW5zbGF0ZVgoLTUwJSknXG4gICAgICAgICAgfSlcbiAgICAgICAgKVxuICAgICAgXSksXG4gICAgICB0cmFuc2l0aW9uKCcqID0+IHZvaWQnLCBbXG4gICAgICAgIHN0eWxlKHtcbiAgICAgICAgICB3aWR0aDogJyonLFxuICAgICAgICAgIG9wYWNpdHk6IDEsXG4gICAgICAgICAgdHJhbnNmb3JtOiAndHJhbnNsYXRlWSg3MnB4KSB0cmFuc2xhdGVYKC01MCUpJ1xuICAgICAgICB9KSxcbiAgICAgICAgYW5pbWF0ZShcbiAgICAgICAgICAnMTUwbXMgMTI1bXMgZWFzZS1vdXQnLFxuICAgICAgICAgIHN0eWxlKHtcbiAgICAgICAgICAgIHdpZHRoOiAnNDBweCcsXG4gICAgICAgICAgICB0cmFuc2Zvcm06ICd0cmFuc2xhdGVZKDcycHgpIHRyYW5zbGF0ZVgoLTUwJSknXG4gICAgICAgICAgfSlcbiAgICAgICAgKVxuICAgICAgXSlcbiAgICBdKVxuICBdXG59KVxuZXhwb3J0IGNsYXNzIEZpdlJlZnJlc2hlciBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95IHtcbiAgQElucHV0KCkgaGludFRleHQgPSAnbmV3IHBvc3RzJztcbiAgQElucHV0KCkgbWF4UHVsbEhlaWdodCA9IDE2ODtcbiAgQElucHV0KCkgbWluUHVsbEhlaWdodCA9IDExMjtcbiAgQE91dHB1dCgpIGZpdlByb2dyZXNzQ2hhbmdlZDogRXZlbnRFbWl0dGVyPG51bWJlcj4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gIEBPdXRwdXQoKSBmaXZSZWZyZXNoOiBFdmVudEVtaXR0ZXI8Rml2UmVmcmVzaGVyPiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgQFZpZXdDaGlsZCgnc3Bpbm5lcicsIHsgc3RhdGljOiBmYWxzZSB9KSBzcGlubmVyOiBGaXZSZWZyZXNoZXJDb250ZW50O1xuICBoaW50VmlzaWJsZSA9IGZhbHNlO1xuICBjdXJyZW50UHJvZ3Jlc3MgPSAwO1xuXG4gIHJlZnJlc2hpbmcgPSBmYWxzZTtcblxuICBwcml2YXRlICRvbkRlc3Ryb3kgPSBuZXcgU3ViamVjdCgpO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgYnVpbGRlcjogQW5pbWF0aW9uQnVpbGRlcixcbiAgICBwcml2YXRlIHJlZnJlc2hlcjogRWxlbWVudFJlZixcbiAgICBwcml2YXRlIHJlbmRlcmVyOiBSZW5kZXJlcjIsXG4gICAgcHJpdmF0ZSBwbGF0Zm9ybTogUGxhdGZvcm1cbiAgKSB7fVxuXG4gIGFzeW5jIG5nT25Jbml0KCkge1xuICAgIGF3YWl0IHRoaXMuYXR0YWNoUHVsbERpcmVjdGl2ZSgpO1xuICB9XG5cbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgdGhpcy4kb25EZXN0cm95Lm5leHQoKTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgYXR0YWNoUHVsbERpcmVjdGl2ZSgpIHtcbiAgICBjb25zdCBjb250ZW50OiBJb25Db250ZW50ID0gdGhpcy5yZWZyZXNoZXIubmF0aXZlRWxlbWVudC5jbG9zZXN0KFxuICAgICAgJ2lvbi1jb250ZW50J1xuICAgICk7XG5cbiAgICBpZiAoIWNvbnRlbnQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgJ1RoZSBmaXYtcmVmcmVzaGVyIGNvbXBvbmVudCBuZWVkcyB0byBiZSBpbnNpZGUgb2YgYW4gaW9uLWNvbnRlbnQuJ1xuICAgICAgKTtcbiAgICB9XG4gICAgY29udGVudC5zY3JvbGxFdmVudHMgPSB0cnVlO1xuICAgIGNvbnN0IHNjcm9sbCA9IGF3YWl0IGNvbnRlbnQuZ2V0U2Nyb2xsRWxlbWVudCgpO1xuICAgIGNvbnN0IHB1bGwgPSBuZXcgRml2UHVsbChuZXcgRWxlbWVudFJlZihjb250ZW50KSwgdGhpcy5wbGF0Zm9ybSwgY29udGVudCk7XG4gICAgcHVsbC5pbml0KCk7XG5cbiAgICBwdWxsLmZpdlB1bGxcbiAgICAgIC5waXBlKFxuICAgICAgICBmaWx0ZXIoKCkgPT4gIXRoaXMucmVmcmVzaGluZyAmJiAhdGhpcy5oaW50VmlzaWJsZSksXG4gICAgICAgIHRhcChwcm9ncmVzcyA9PiB0aGlzLmZpdlB1bGwocHJvZ3Jlc3MpKSxcbiAgICAgICAgdGFrZVVudGlsKHRoaXMuJG9uRGVzdHJveSlcbiAgICAgIClcbiAgICAgIC5zdWJzY3JpYmUoKTtcblxuICAgIHB1bGwuZml2UmVmcmVzaFxuICAgICAgLnBpcGUoXG4gICAgICAgIHRhcCgoKSA9PiB0aGlzLnJlZnJlc2goKSksXG4gICAgICAgIHRha2VVbnRpbCh0aGlzLiRvbkRlc3Ryb3kpXG4gICAgICApXG4gICAgICAuc3Vic2NyaWJlKCk7XG5cbiAgICBwdWxsLmZpdkNhbmNlbFxuICAgICAgLnBpcGUoXG4gICAgICAgIHRhcCgoKSA9PiB0aGlzLm1vdmVCYWNrKCkpLFxuICAgICAgICB0YWtlVW50aWwodGhpcy4kb25EZXN0cm95KVxuICAgICAgKVxuICAgICAgLnN1YnNjcmliZSgpO1xuXG4gICAgdGhpcy5zcGlubmVyLmZpdkNvbXBsZXRlLnBpcGUodGFrZVVudGlsKHRoaXMuJG9uRGVzdHJveSkpLnN1YnNjcmliZSgpO1xuXG4gICAgdGhpcy5maXZSZWZyZXNoXG4gICAgICAucGlwZShcbiAgICAgICAgdGFwKCgpID0+IHNjcm9sbC5zY3JvbGxUbyh7IHRvcDogMCwgYmVoYXZpb3I6ICdzbW9vdGgnIH0pKSxcbiAgICAgICAgdGFrZVVudGlsKHRoaXMuJG9uRGVzdHJveSlcbiAgICAgIClcbiAgICAgIC5zdWJzY3JpYmUoKTtcbiAgfVxuXG4gIHJlZnJlc2goKSB7XG4gICAgaWYgKHRoaXMucmVmcmVzaGluZykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLnJlZnJlc2hpbmcgPSB0cnVlO1xuICAgIHRoaXMuc3Bpbm5lci5sb2FkKCk7XG4gICAgdGhpcy5zZXRQdWxsQW5pbWF0aW9uUHJvZ3Jlc3MoMTEyIC8gMTY4KTtcbiAgICB0aGlzLmZpdlJlZnJlc2guZW1pdCh0aGlzKTtcbiAgfVxuXG4gIGNvbXBsZXRlKCkge1xuICAgIGlmICghdGhpcy5yZWZyZXNoaW5nKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuc3Bpbm5lci5jb21wbGV0ZSgpO1xuICB9XG5cbiAgb25Eb25lKCkge1xuICAgIHRoaXMuc3Bpbm5lci5oaWRlKCk7XG4gIH1cblxuICBvbkhpZGRlbigpIHtcbiAgICB0aGlzLnJlZnJlc2hpbmcgPSBmYWxzZTtcbiAgICB0aGlzLnNldFB1bGxBbmltYXRpb25Qcm9ncmVzcygwKTtcbiAgfVxuXG4gIHNob3dIaW50KCkge1xuICAgIHRoaXMuaGludFZpc2libGUgPSB0cnVlO1xuICB9XG5cbiAgb25IaW50Q2xpY2tlZCgpIHtcbiAgICB0aGlzLmhpbnRWaXNpYmxlID0gZmFsc2U7XG4gIH1cblxuICBwb3N0SGludChldmVudCkge1xuICAgIGlmICghZXZlbnQuZnJvbVN0YXRlICYmIGV2ZW50LnRvU3RhdGUgPT09ICd2b2lkJykge1xuICAgICAgdGhpcy5yZWZyZXNoKCk7XG4gICAgfVxuICB9XG5cbiAgc2V0UHVsbEFuaW1hdGlvblByb2dyZXNzKHByb2dyZXNzOiBudW1iZXIpIHtcbiAgICB0aGlzLmN1cnJlbnRQcm9ncmVzcyA9IHByb2dyZXNzO1xuXG4gICAgaWYgKHByb2dyZXNzIDwgMSkge1xuICAgICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZShcbiAgICAgICAgdGhpcy5zcGlubmVyLmVsZW1lbnQubmF0aXZlRWxlbWVudCxcbiAgICAgICAgJ3RyYW5zZm9ybScsXG4gICAgICAgIGB0cmFuc2xhdGVZKCR7dGhpcy5taW5QdWxsSGVpZ2h0ICogcHJvZ3Jlc3N9cHgpYFxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICBjaGFuZ2VBbmltYXRpb25Ub1Byb2dyZXNzKHByb2dyZXNzOiBudW1iZXIpOiBQcm9taXNlPGFueT4ge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHtcbiAgICAgIGNvbnN0IGFuaW1hdGlvbiA9IHRoaXMuYnVpbGRlci5idWlsZChbXG4gICAgICAgIHN0eWxlKHtcbiAgICAgICAgICB0cmFuc2Zvcm06IGB0cmFuc2xhdGVZKCR7MTAwICpcbiAgICAgICAgICAgIHRoaXMuY3VycmVudFByb2dyZXNzfXB4KSByb3RhdGVaKCR7MzYwICogdGhpcy5jdXJyZW50UHJvZ3Jlc3N9ZGVnKWBcbiAgICAgICAgfSksXG4gICAgICAgIGFuaW1hdGUoXG4gICAgICAgICAgJzg1bXMgZWFzZS1pbicsXG4gICAgICAgICAgc3R5bGUoe1xuICAgICAgICAgICAgdHJhbnNmb3JtOiBgdHJhbnNsYXRlWSgkezEwMCAqIHByb2dyZXNzfXB4KSByb3RhdGVaKCR7MzYwICpcbiAgICAgICAgICAgICAgcHJvZ3Jlc3N9ZGVnKWBcbiAgICAgICAgICB9KVxuICAgICAgICApXG4gICAgICBdKTtcblxuICAgICAgY29uc3QgcGxheWVyID0gYW5pbWF0aW9uLmNyZWF0ZSh0aGlzLnNwaW5uZXIuZWxlbWVudC5uYXRpdmVFbGVtZW50KTtcbiAgICAgIHBsYXllci5wbGF5KCk7XG4gICAgICBwbGF5ZXIub25Eb25lKCgpID0+IHtcbiAgICAgICAgdGhpcy5zZXRQdWxsQW5pbWF0aW9uUHJvZ3Jlc3MocHJvZ3Jlc3MpO1xuICAgICAgICBwbGF5ZXIuZGVzdHJveSgpO1xuICAgICAgICByZXNvbHZlKCk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIGZpdlB1bGwocHJvZ3Jlc3M6IG51bWJlcikge1xuICAgIHRoaXMuc2V0UHVsbEFuaW1hdGlvblByb2dyZXNzKHByb2dyZXNzKTtcbiAgICB0aGlzLnNwaW5uZXIuc2hvdygpO1xuICAgIGNvbnN0IHZhbHVlID0gTWF0aC5tYXgoXG4gICAgICAwLFxuICAgICAgTWF0aC5taW4oMTAwLCAocHJvZ3Jlc3MgKiAxMDAgKiB0aGlzLm1heFB1bGxIZWlnaHQpIC8gdGhpcy5taW5QdWxsSGVpZ2h0KVxuICAgICk7XG4gICAgdGhpcy5zcGlubmVyLnNldFZhbHVlKHZhbHVlICogMC44NCk7XG4gIH1cblxuICBtb3ZlQmFjaygpIHtcbiAgICBjb25zdCBhbmltYXRpb24gPSB0aGlzLmJ1aWxkZXIuYnVpbGQoW1xuICAgICAgc3R5bGUoe1xuICAgICAgICB0cmFuc2Zvcm06IGB0cmFuc2xhdGVZKCR7dGhpcy5jdXJyZW50UHJvZ3Jlc3MgKlxuICAgICAgICAgIHRoaXMubWluUHVsbEhlaWdodH1weCkgcm90YXRlWigkezM2MCAqIHRoaXMuY3VycmVudFByb2dyZXNzfWRlZylgXG4gICAgICB9KSxcbiAgICAgIGFuaW1hdGUoJzIwNW1zIGVhc2UtaW4nLCBzdHlsZSh7IHRyYW5zZm9ybTogJ3RyYW5zbGF0ZVkoMCkgcm90YXRlWigwKScgfSkpXG4gICAgXSk7XG4gICAgY29uc3QgcGxheWVyID0gYW5pbWF0aW9uLmNyZWF0ZSh0aGlzLnNwaW5uZXIuZWxlbWVudC5uYXRpdmVFbGVtZW50KTtcblxuICAgIHR3ZWVuKGVhc2VPdXRTaW5lLCAxNDUpXG4gICAgICAucGlwZShcbiAgICAgICAgcmV2ZXJzZSgpLFxuICAgICAgICBtYXAobiA9PlxuICAgICAgICAgIE1hdGgubWF4KFxuICAgICAgICAgICAgMCxcbiAgICAgICAgICAgIE1hdGgubWluKFxuICAgICAgICAgICAgICAxMDAsXG4gICAgICAgICAgICAgICh0aGlzLmN1cnJlbnRQcm9ncmVzcyAqIG4gKiAxMDAgKiB0aGlzLm1heFB1bGxIZWlnaHQpIC9cbiAgICAgICAgICAgICAgICB0aGlzLm1pblB1bGxIZWlnaHRcbiAgICAgICAgICAgIClcbiAgICAgICAgICApXG4gICAgICAgICksXG4gICAgICAgIHRhcCh2YWx1ZSA9PiB0aGlzLnNwaW5uZXIuc2V0VmFsdWUodmFsdWUpKVxuICAgICAgKVxuICAgICAgLnN1YnNjcmliZSgpO1xuICAgIHBsYXllci5wbGF5KCk7XG4gICAgcGxheWVyLm9uRG9uZSgoKSA9PiB7XG4gICAgICB0aGlzLnNldFB1bGxBbmltYXRpb25Qcm9ncmVzcygwKTtcbiAgICAgIHRoaXMuc3Bpbm5lci52aXNpYmxlID0gZmFsc2U7XG4gICAgICBwbGF5ZXIuZGVzdHJveSgpO1xuICAgIH0pO1xuICB9XG5cbiAgb25TcGlubmVyUHJvZ3Jlc3MocHJvZ3Jlc3M6IG51bWJlcikge1xuICAgIHRoaXMuZml2UHJvZ3Jlc3NDaGFuZ2VkLmVtaXQocHJvZ3Jlc3MpO1xuICAgIHRoaXMucmVuZGVyZXJcbiAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTptYXgtbGluZS1sZW5ndGhcbiAgICAgIC5zZXRTdHlsZShcbiAgICAgICAgdGhpcy5zcGlubmVyLmVsZW1lbnQubmF0aXZlRWxlbWVudCxcbiAgICAgICAgJ3RyYW5zZm9ybScsXG4gICAgICAgIGB0cmFuc2xhdGVZKCR7dGhpcy5tYXhQdWxsSGVpZ2h0ICpcbiAgICAgICAgICB0aGlzLmN1cnJlbnRQcm9ncmVzc31weCkgcm90YXRlWigkeygzNjAgKiBwcm9ncmVzcykgLyAyMDB9ZGVnKWBcbiAgICAgICk7XG4gIH1cbn1cbiJdfQ==