UNPKG

ngx-slick-carousel

Version:

[![npm version](https://badge.fury.io/js/ngx-slick-carousel.svg)](https://badge.fury.io/js/ngx-slick-carousel) [![Build Status](https://travis-ci.com/leo6104/ngx-slick-carousel.svg?branch=master)](https://travis-ci.com/leo6104/ngx-slick-carousel)

520 lines 34.7 kB
/** * @fileoverview added by tsickle * Generated from: slick.component.ts * @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ import { isPlatformBrowser, isPlatformServer } from '@angular/common'; import { Component, Directive, ElementRef, EventEmitter, forwardRef, Host, Inject, Input, NgZone, Output, PLATFORM_ID } from '@angular/core'; import { NG_VALUE_ACCESSOR } from '@angular/forms'; /** * Slick component */ var SlickCarouselComponent = /** @class */ (function () { /** * Constructor */ function SlickCarouselComponent(el, zone, platformId) { this.el = el; this.zone = zone; this.platformId = platformId; this.afterChange = new EventEmitter(); this.beforeChange = new EventEmitter(); this.breakpoint = new EventEmitter(); this.destroy = new EventEmitter(); this.init = new EventEmitter(); // access from parent component can be a problem with change detection timing. Please use afterChange output this.currentIndex = 0; this.slides = []; this.initialized = false; this._removedSlides = []; this._addedSlides = []; } /** * On component destroy */ /** * On component destroy * @return {?} */ SlickCarouselComponent.prototype.ngOnDestroy = /** * On component destroy * @return {?} */ function () { this.unslick(); }; /** * @return {?} */ SlickCarouselComponent.prototype.ngAfterViewInit = /** * @return {?} */ function () { this.ngAfterViewChecked(); }; /** * On component view checked */ /** * On component view checked * @return {?} */ SlickCarouselComponent.prototype.ngAfterViewChecked = /** * On component view checked * @return {?} */ function () { var _this = this; if (isPlatformServer(this.platformId)) { return; } if (this._addedSlides.length > 0 || this._removedSlides.length > 0) { /** @type {?} */ var nextSlidesLength = this.slides.length - this._removedSlides.length + this._addedSlides.length; if (!this.initialized) { if (nextSlidesLength > 0) { this.initSlick(); } // if nextSlidesLength is zere, do nothing } else if (nextSlidesLength === 0) { // unslick case this.unslick(); } else { this._addedSlides.forEach((/** * @param {?} slickItem * @return {?} */ function (slickItem) { _this.slides.push(slickItem); _this.zone.runOutsideAngular((/** * @return {?} */ function () { _this.$instance.slick('slickAdd', slickItem.el.nativeElement); })); })); this._addedSlides = []; this._removedSlides.forEach((/** * @param {?} slickItem * @return {?} */ function (slickItem) { /** @type {?} */ var idx = _this.slides.indexOf(slickItem); _this.slides = _this.slides.filter((/** * @param {?} s * @return {?} */ function (s) { return s !== slickItem; })); _this.zone.runOutsideAngular((/** * @return {?} */ function () { _this.$instance.slick('slickRemove', idx); })); })); this._removedSlides = []; } } }; /** * init slick */ /** * init slick * @return {?} */ SlickCarouselComponent.prototype.initSlick = /** * init slick * @return {?} */ function () { var _this = this; this.slides = this._addedSlides; this._addedSlides = []; this._removedSlides = []; this.zone.runOutsideAngular((/** * @return {?} */ function () { _this.$instance = jQuery(_this.el.nativeElement); _this.$instance.on('init', (/** * @param {?} event * @param {?} slick * @return {?} */ function (event, slick) { _this.zone.run((/** * @return {?} */ function () { _this.init.emit({ event: event, slick: slick }); })); })); _this.$instance.slick(_this.config); _this.zone.run((/** * @return {?} */ function () { var _a; _this.initialized = true; _this.currentIndex = ((_a = _this.config) === null || _a === void 0 ? void 0 : _a.initialSlide) || 0; })); _this.$instance.on('afterChange', (/** * @param {?} event * @param {?} slick * @param {?} currentSlide * @return {?} */ function (event, slick, currentSlide) { _this.zone.run((/** * @return {?} */ function () { _this.afterChange.emit({ event: event, slick: slick, currentSlide: currentSlide, first: currentSlide === 0, last: slick.$slides.length === currentSlide + slick.options.slidesToScroll }); _this.currentIndex = currentSlide; })); })); _this.$instance.on('beforeChange', (/** * @param {?} event * @param {?} slick * @param {?} currentSlide * @param {?} nextSlide * @return {?} */ function (event, slick, currentSlide, nextSlide) { _this.zone.run((/** * @return {?} */ function () { _this.beforeChange.emit({ event: event, slick: slick, currentSlide: currentSlide, nextSlide: nextSlide }); _this.currentIndex = nextSlide; })); })); _this.$instance.on('breakpoint', (/** * @param {?} event * @param {?} slick * @param {?} breakpoint * @return {?} */ function (event, slick, breakpoint) { _this.zone.run((/** * @return {?} */ function () { _this.breakpoint.emit({ event: event, slick: slick, breakpoint: breakpoint }); })); })); _this.$instance.on('destroy', (/** * @param {?} event * @param {?} slick * @return {?} */ function (event, slick) { _this.zone.run((/** * @return {?} */ function () { _this.destroy.emit({ event: event, slick: slick }); _this.initialized = false; })); })); })); }; /** * @param {?} slickItem * @return {?} */ SlickCarouselComponent.prototype.addSlide = /** * @param {?} slickItem * @return {?} */ function (slickItem) { this._addedSlides.push(slickItem); }; /** * @param {?} slickItem * @return {?} */ SlickCarouselComponent.prototype.removeSlide = /** * @param {?} slickItem * @return {?} */ function (slickItem) { this._removedSlides.push(slickItem); }; /** * Slick Method */ /** * Slick Method * @param {?} index * @return {?} */ SlickCarouselComponent.prototype.slickGoTo = /** * Slick Method * @param {?} index * @return {?} */ function (index) { var _this = this; this.zone.runOutsideAngular((/** * @return {?} */ function () { _this.$instance.slick('slickGoTo', index); })); }; /** * @return {?} */ SlickCarouselComponent.prototype.slickNext = /** * @return {?} */ function () { var _this = this; this.zone.runOutsideAngular((/** * @return {?} */ function () { _this.$instance.slick('slickNext'); })); }; /** * @return {?} */ SlickCarouselComponent.prototype.slickPrev = /** * @return {?} */ function () { var _this = this; this.zone.runOutsideAngular((/** * @return {?} */ function () { _this.$instance.slick('slickPrev'); })); }; /** * @return {?} */ SlickCarouselComponent.prototype.slickPause = /** * @return {?} */ function () { var _this = this; this.zone.runOutsideAngular((/** * @return {?} */ function () { _this.$instance.slick('slickPause'); })); }; /** * @return {?} */ SlickCarouselComponent.prototype.slickPlay = /** * @return {?} */ function () { var _this = this; this.zone.runOutsideAngular((/** * @return {?} */ function () { _this.$instance.slick('slickPlay'); })); }; /** * @return {?} */ SlickCarouselComponent.prototype.unslick = /** * @return {?} */ function () { var _this = this; if (this.$instance) { this.zone.runOutsideAngular((/** * @return {?} */ function () { _this.$instance.slick('unslick'); })); this.$instance = undefined; } this.initialized = false; }; /** * @param {?} changes * @return {?} */ SlickCarouselComponent.prototype.ngOnChanges = /** * @param {?} changes * @return {?} */ function (changes) { var _this = this; if (this.initialized) { /** @type {?} */ var config = changes['config']; if (config.previousValue !== config.currentValue && config.currentValue !== undefined) { /** @type {?} */ var refresh_1 = config.currentValue['refresh']; /** @type {?} */ var newOptions_1 = Object.assign({}, config.currentValue); delete newOptions_1['refresh']; this.zone.runOutsideAngular((/** * @return {?} */ function () { _this.$instance.slick('slickSetOption', newOptions_1, refresh_1); })); } } }; SlickCarouselComponent.decorators = [ { type: Component, args: [{ selector: 'ngx-slick-carousel', exportAs: 'slick-carousel', providers: [{ provide: NG_VALUE_ACCESSOR, useExisting: forwardRef((/** * @return {?} */ function () { return SlickCarouselComponent; })), multi: true }], template: '<ng-content></ng-content>' }] } ]; /** @nocollapse */ SlickCarouselComponent.ctorParameters = function () { return [ { type: ElementRef }, { type: NgZone }, { type: String, decorators: [{ type: Inject, args: [PLATFORM_ID,] }] } ]; }; SlickCarouselComponent.propDecorators = { config: [{ type: Input }], afterChange: [{ type: Output }], beforeChange: [{ type: Output }], breakpoint: [{ type: Output }], destroy: [{ type: Output }], init: [{ type: Output }] }; return SlickCarouselComponent; }()); export { SlickCarouselComponent }; if (false) { /** @type {?} */ SlickCarouselComponent.prototype.config; /** @type {?} */ SlickCarouselComponent.prototype.afterChange; /** @type {?} */ SlickCarouselComponent.prototype.beforeChange; /** @type {?} */ SlickCarouselComponent.prototype.breakpoint; /** @type {?} */ SlickCarouselComponent.prototype.destroy; /** @type {?} */ SlickCarouselComponent.prototype.init; /** @type {?} */ SlickCarouselComponent.prototype.$instance; /** * @type {?} * @private */ SlickCarouselComponent.prototype.currentIndex; /** @type {?} */ SlickCarouselComponent.prototype.slides; /** @type {?} */ SlickCarouselComponent.prototype.initialized; /** * @type {?} * @private */ SlickCarouselComponent.prototype._removedSlides; /** * @type {?} * @private */ SlickCarouselComponent.prototype._addedSlides; /** * @type {?} * @private */ SlickCarouselComponent.prototype.el; /** * @type {?} * @private */ SlickCarouselComponent.prototype.zone; /** * @type {?} * @private */ SlickCarouselComponent.prototype.platformId; } var SlickItemDirective = /** @class */ (function () { function SlickItemDirective(el, platformId, carousel) { this.el = el; this.platformId = platformId; this.carousel = carousel; } /** * @return {?} */ SlickItemDirective.prototype.ngOnInit = /** * @return {?} */ function () { if (isPlatformBrowser(this.platformId)) { this.carousel.addSlide(this); } }; /** * @return {?} */ SlickItemDirective.prototype.ngOnDestroy = /** * @return {?} */ function () { if (isPlatformBrowser(this.platformId)) { this.carousel.removeSlide(this); } }; SlickItemDirective.decorators = [ { type: Directive, args: [{ selector: '[ngxSlickItem]', },] } ]; /** @nocollapse */ SlickItemDirective.ctorParameters = function () { return [ { type: ElementRef }, { type: String, decorators: [{ type: Inject, args: [PLATFORM_ID,] }] }, { type: SlickCarouselComponent, decorators: [{ type: Host }] } ]; }; return SlickItemDirective; }()); export { SlickItemDirective }; if (false) { /** @type {?} */ SlickItemDirective.prototype.el; /** * @type {?} * @private */ SlickItemDirective.prototype.platformId; /** * @type {?} * @private */ SlickItemDirective.prototype.carousel; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2xpY2suY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6Im5nOi8vbmd4LXNsaWNrLWNhcm91c2VsLyIsInNvdXJjZXMiOlsic2xpY2suY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsT0FBTyxFQUFFLGlCQUFpQixFQUFFLGdCQUFnQixFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDdEUsT0FBTyxFQUdMLFNBQVMsRUFDVCxTQUFTLEVBQ1QsVUFBVSxFQUNWLFlBQVksRUFDWixVQUFVLEVBQ1YsSUFBSSxFQUNKLE1BQU0sRUFDTixLQUFLLEVBQ0wsTUFBTSxFQUlOLE1BQU0sRUFDTixXQUFXLEVBRVosTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7Ozs7QUFPbkQ7SUE2QkU7O09BRUc7SUFDSCxnQ0FBb0IsRUFBYyxFQUNkLElBQVksRUFDUyxVQUFrQjtRQUZ2QyxPQUFFLEdBQUYsRUFBRSxDQUFZO1FBQ2QsU0FBSSxHQUFKLElBQUksQ0FBUTtRQUNTLGVBQVUsR0FBVixVQUFVLENBQVE7UUFyQi9DLGdCQUFXLEdBQWtHLElBQUksWUFBWSxFQUFFLENBQUM7UUFDaEksaUJBQVksR0FBc0YsSUFBSSxZQUFZLEVBQUUsQ0FBQztRQUNySCxlQUFVLEdBQThELElBQUksWUFBWSxFQUFFLENBQUM7UUFDM0YsWUFBTyxHQUE2QyxJQUFJLFlBQVksRUFBRSxDQUFDO1FBQ3ZFLFNBQUksR0FBNkMsSUFBSSxZQUFZLEVBQUUsQ0FBQzs7UUFLeEUsaUJBQVksR0FBRyxDQUFDLENBQUM7UUFFbEIsV0FBTSxHQUFVLEVBQUUsQ0FBQztRQUNuQixnQkFBVyxHQUFHLEtBQUssQ0FBQztRQUNuQixtQkFBYyxHQUF5QixFQUFFLENBQUM7UUFDMUMsaUJBQVksR0FBeUIsRUFBRSxDQUFDO0lBUWhELENBQUM7SUFFRDs7T0FFRzs7Ozs7SUFDSCw0Q0FBVzs7OztJQUFYO1FBQ0UsSUFBSSxD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O0NBQUEsQUFwQkQsSUFvQkM7U0FqQlksa0JBQWtCOzs7SUFDakIsZ0NBQXFCOzs7OztJQUNyQix3Q0FBK0M7Ozs7O0lBQy9DLHNDQUFnRCIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGlzUGxhdGZvcm1Ccm93c2VyLCBpc1BsYXRmb3JtU2VydmVyIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7XG4gIEFmdGVyVmlld0NoZWNrZWQsXG4gIEFmdGVyVmlld0luaXQsXG4gIENvbXBvbmVudCxcbiAgRGlyZWN0aXZlLFxuICBFbGVtZW50UmVmLFxuICBFdmVudEVtaXR0ZXIsXG4gIGZvcndhcmRSZWYsXG4gIEhvc3QsXG4gIEluamVjdCxcbiAgSW5wdXQsXG4gIE5nWm9uZSxcbiAgT25DaGFuZ2VzLFxuICBPbkRlc3Ryb3ksXG4gIE9uSW5pdCxcbiAgT3V0cHV0LFxuICBQTEFURk9STV9JRCxcbiAgU2ltcGxlQ2hhbmdlc1xufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IE5HX1ZBTFVFX0FDQ0VTU09SIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuXG5kZWNsYXJlIGNvbnN0IGpRdWVyeTogYW55O1xuXG4vKipcbiAqIFNsaWNrIGNvbXBvbmVudFxuICovXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICduZ3gtc2xpY2stY2Fyb3VzZWwnLFxuICBleHBvcnRBczogJ3NsaWNrLWNhcm91c2VsJyxcbiAgcHJvdmlkZXJzOiBbe1xuICAgIHByb3ZpZGU6IE5HX1ZBTFVFX0FDQ0VTU09SLFxuICAgIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgpID0+IFNsaWNrQ2Fyb3VzZWxDb21wb25lbnQpLFxuICAgIG11bHRpOiB0cnVlXG4gIH1dLFxuICB0ZW1wbGF0ZTogJzxuZy1jb250ZW50PjwvbmctY29udGVudD4nLFxufSlcbmV4cG9ydCBjbGFzcyBTbGlja0Nhcm91c2VsQ29tcG9uZW50IGltcGxlbWVudHMgT25EZXN0cm95LCBPbkNoYW5nZXMsIEFmdGVyVmlld0luaXQsIEFmdGVyVmlld0NoZWNrZWQge1xuXG4gICAgQElucHV0KCkgY29uZmlnOiBhbnk7XG4gICAgQE91dHB1dCgpIGFmdGVyQ2hhbmdlOiBFdmVudEVtaXR0ZXI8eyBldmVudDogYW55LCBzbGljazogYW55LCBjdXJyZW50U2xpZGU6IG51bWJlciwgZmlyc3Q6IGJvb2xlYW4sIGxhc3Q6IGJvb2xlYW4gfT4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gICAgQE91dHB1dCgpIGJlZm9yZUNoYW5nZTogRXZlbnRFbWl0dGVyPHsgZXZlbnQ6IGFueSwgc2xpY2s6IGFueSwgY3VycmVudFNsaWRlOiBudW1iZXIsIG5leHRTbGlkZTogbnVtYmVyIH0+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICAgIEBPdXRwdXQoKSBicmVha3BvaW50OiBFdmVudEVtaXR0ZXI8eyBldmVudDogYW55LCBzbGljazogYW55LCBicmVha3BvaW50OiBhbnkgfT4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gICAgQE91dHB1dCgpIGRlc3Ryb3k6IEV2ZW50RW1pdHRlcjx7IGV2ZW50OiBhbnksIHNsaWNrOiBhbnkgfT4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gICAgQE91dHB1dCgpIGluaXQ6IEV2ZW50RW1pdHRlcjx7IGV2ZW50OiBhbnksIHNsaWNrOiBhbnkgfT4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG5cbiAgcHVibGljICRpbnN0YW5jZTogYW55O1xuXG4gIC8vIGFjY2VzcyBmcm9tIHBhcmVudCBjb21wb25lbnQgY2FuIGJlIGEgcHJvYmxlbSB3aXRoIGNoYW5nZSBkZXRlY3Rpb24gdGltaW5nLiBQbGVhc2UgdXNlIGFmdGVyQ2hhbmdlIG91dHB1dFxuICBwcml2YXRlIGN1cnJlbnRJbmRleCA9IDA7XG5cbiAgcHVibGljIHNsaWRlczogYW55W10gPSBbXTtcbiAgcHVibGljIGluaXRpYWxpemVkID0gZmFsc2U7XG4gIHByaXZhdGUgX3JlbW92ZWRTbGlkZXM6IFNsaWNrSXRlbURpcmVjdGl2ZVtdID0gW107XG4gIHByaXZhdGUgX2FkZGVkU2xpZGVzOiBTbGlja0l0ZW1EaXJlY3RpdmVbXSA9IFtdO1xuXG4gIC8qKlxuICAgKiBDb25zdHJ1Y3RvclxuICAgKi9cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBlbDogRWxlbWVudFJlZixcbiAgICAgICAgICAgICAgcHJpdmF0ZSB6b25lOiBOZ1pvbmUsXG4gICAgICAgICAgICAgIEBJbmplY3QoUExBVEZPUk1fSUQpIHByaXZhdGUgcGxhdGZvcm1JZDogc3RyaW5nKSB7XG4gIH1cblxuICAvKipcbiAgICogT24gY29tcG9uZW50IGRlc3Ryb3lcbiAgICovXG4gIG5nT25EZXN0cm95KCkge1xuICAgIHRoaXMudW5zbGljaygpO1xuICB9XG5cbiAgbmdBZnRlclZpZXdJbml0KCk6IHZvaWQge1xuICAgIHRoaXMubmdBZnRlclZpZXdDaGVja2VkKCk7XG4gIH1cblxuICAvKipcbiAgICogT24gY29tcG9uZW50IHZpZXcgY2hlY2tlZFxuICAgKi9cbiAgbmdBZnRlclZpZXdDaGVja2VkKCkge1xuICAgIGlmIChpc1BsYXRmb3JtU2VydmVyKHRoaXMucGxhdGZvcm1JZCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHRoaXMuX2FkZGVkU2xpZGVzLmxlbmd0aCA+IDAgfHwgdGhpcy5fcmVtb3ZlZFNsaWRlcy5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCBuZXh0U2xpZGVzTGVuZ3RoID0gdGhpcy5zbGlkZXMubGVuZ3RoIC0gdGhpcy5fcmVtb3ZlZFNsaWRlcy5sZW5ndGggKyB0aGlzLl9hZGRlZFNsaWRlcy5sZW5ndGg7XG4gICAgICBpZiAoIXRoaXMuaW5pdGlhbGl6ZWQpIHtcbiAgICAgICAgaWYgKG5leHRTbGlkZXNMZW5ndGggPiAwKSB7XG4gICAgICAgICAgdGhpcy5pbml0U2xpY2soKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBpZiBuZXh0U2xpZGVzTGVuZ3RoIGlzIHplcmUsIGRvIG5vdGhpbmdcbiAgICAgIH0gZWxzZSBpZiAobmV4dFNsaWRlc0xlbmd0aCA9PT0gMCkgeyAvLyB1bnNsaWNrIGNhc2VcbiAgICAgICAgdGhpcy51bnNsaWNrKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLl9hZGRlZFNsaWRlcy5mb3JFYWNoKHNsaWNrSXRlbSA9PiB7XG4gICAgICAgICAgdGhpcy5zbGlkZXMucHVzaChzbGlja0l0ZW0pO1xuICAgICAgICAgIHRoaXMuem9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLiRpbnN0YW5jZS5zbGljaygnc2xpY2tBZGQnLCBzbGlja0l0ZW0uZWwubmF0aXZlRWxlbWVudCk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLl9hZGRlZFNsaWRlcyA9IFtdO1xuXG4gICAgICAgIHRoaXMuX3JlbW92ZWRTbGlkZXMuZm9yRWFjaChzbGlja0l0ZW0gPT4ge1xuICAgICAgICAgIGNvbnN0IGlkeCA9IHRoaXMuc2xpZGVzLmluZGV4T2Yoc2xpY2tJdGVtKTtcbiAgICAgICAgICB0aGlzLnNsaWRlcyA9IHRoaXMuc2xpZGVzLmZpbHRlcihzID0+IHMgIT09IHNsaWNrSXRlbSk7XG4gICAgICAgICAgdGhpcy56b25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuJGluc3RhbmNlLnNsaWNrKCdzbGlja1JlbW92ZScsIGlkeCk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLl9yZW1vdmVkU2xpZGVzID0gW107XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIGluaXQgc2xpY2tcbiAgICovXG4gIGluaXRTbGljaygpIHtcbiAgICB0aGlzLnNsaWRlcyA9IHRoaXMuX2FkZGVkU2xpZGVzO1xuICAgIHRoaXMuX2FkZGVkU2xpZGVzID0gW107XG4gICAgdGhpcy5fcmVtb3ZlZFNsaWRlcyA9IFtdO1xuICAgIHRoaXMuem9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKSA9PiB7XG4gICAgICB0aGlzLiRpbnN0YW5jZSA9IGpRdWVyeSh0aGlzLmVsLm5hdGl2ZUVsZW1lbnQpO1xuXG4gICAgICB0aGlzLiRpbnN0YW5jZS5vbignaW5pdCcsIChldmVudCwgc2xpY2spID0+IHtcbiAgICAgICAgdGhpcy56b25lLnJ1bigoKSA9PiB7XG4gICAgICAgICAgdGhpcy5pbml0LmVtaXQoeyBldmVudCwgc2xpY2sgfSk7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG5cbiAgICAgIHRoaXMuJGluc3RhbmNlLnNsaWNrKHRoaXMuY29uZmlnKTtcblxuICAgICAgdGhpcy56b25lLnJ1bigoKSA9PiB7XG4gICAgICAgIHRoaXMuaW5pdGlhbGl6ZWQgPSB0cnVlO1xuXG4gICAgICAgIHRoaXMuY3VycmVudEluZGV4ID0gdGhpcy5jb25maWc/LmluaXRpYWxTbGlkZSB8fCAwO1xuICAgICAgfSk7XG5cbiAgICAgICAgICAgIHRoaXMuJGluc3RhbmNlLm9uKCdhZnRlckNoYW5nZScsIChldmVudCwgc2xpY2ssIGN1cnJlbnRTbGlkZSkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuem9uZS5ydW4oKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmFmdGVyQ2hhbmdlLmVtaXQoe1xuICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnQsXG4gICAgICAgICAgICAgICAgICAgICAgICBzbGljayxcbiAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRTbGlkZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0OiBjdXJyZW50U2xpZGUgPT09IDAsXG4gICAgICAgICAgICAgICAgICAgICAgICBsYXN0OiBzbGljay4kc2xpZGVzLmxlbmd0aCA9PT0gY3VycmVudFNsaWRlICsgc2xpY2sub3B0aW9ucy5zbGlkZXNUb1Njcm9sbFxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jdXJyZW50SW5kZXggPSBjdXJyZW50U2xpZGU7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgdGhpcy4kaW5zdGFuY2Uub24oJ2JlZm9yZUNoYW5nZScsIChldmVudCwgc2xpY2ssIGN1cnJlbnRTbGlkZSwgbmV4dFNsaWRlKSA9PiB7XG4gICAgICAgIHRoaXMuem9uZS5ydW4oKCkgPT4ge1xuICAgICAgICAgIHRoaXMuYmVmb3JlQ2hhbmdlLmVtaXQoeyBldmVudCwgc2xpY2ssIGN1cnJlbnRTbGlkZSwgbmV4dFNsaWRlIH0pO1xuICAgICAgICAgIHRoaXMuY3VycmVudEluZGV4ID0gbmV4dFNsaWRlO1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuXG4gICAgICB0aGlzLiRpbnN0YW5jZS5vbignYnJlYWtwb2ludCcsIChldmVudCwgc2xpY2ssIGJyZWFrcG9pbnQpID0+IHtcbiAgICAgICAgdGhpcy56b25lLnJ1bigoKSA9PiB7XG4gICAgICAgICAgdGhpcy5icmVha3BvaW50LmVtaXQoeyBldmVudCwgc2xpY2ssIGJyZWFrcG9pbnQgfSk7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG5cbiAgICAgIHRoaXMuJGluc3RhbmNlLm9uKCdkZXN0cm95JywgKGV2ZW50LCBzbGljaykgPT4ge1xuICAgICAgICB0aGlzLnpvbmUucnVuKCgpID0+IHtcbiAgICAgICAgICB0aGlzLmRlc3Ryb3kuZW1pdCh7IGV2ZW50LCBzbGljayB9KTtcbiAgICAgICAgICB0aGlzLmluaXRpYWxpemVkID0gZmFsc2U7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICBhZGRTbGlkZShzbGlja0l0ZW06IFNsaWNrSXRlbURpcmVjdGl2ZSkge1xuICAgIHRoaXMuX2FkZGVkU2xpZGVzLnB1c2goc2xpY2tJdGVtKTtcbiAgfVxuXG4gIHJlbW92ZVNsaWRlKHNsaWNrSXRlbTogU2xpY2tJdGVtRGlyZWN0aXZlKSB7XG4gICAgdGhpcy5fcmVtb3ZlZFNsaWRlcy5wdXNoKHNsaWNrSXRlbSk7XG4gIH1cblxuICAvKipcbiAgICogU2xpY2sgTWV0aG9kXG4gICAqL1xuICBwdWJsaWMgc2xpY2tHb1RvKGluZGV4OiBudW1iZXIpIHtcbiAgICB0aGlzLnpvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCkgPT4ge1xuICAgICAgdGhpcy4kaW5zdGFuY2Uuc2xpY2soJ3NsaWNrR29UbycsIGluZGV4KTtcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBzbGlja05leHQoKSB7XG4gICAgdGhpcy56b25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+IHtcbiAgICAgIHRoaXMuJGluc3RhbmNlLnNsaWNrKCdzbGlja05leHQnKTtcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBzbGlja1ByZXYoKSB7XG4gICAgdGhpcy56b25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+IHtcbiAgICAgIHRoaXMuJGluc3RhbmNlLnNsaWNrKCdzbGlja1ByZXYnKTtcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBzbGlja1BhdXNlKCkge1xuICAgIHRoaXMuem9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKSA9PiB7XG4gICAgICB0aGlzLiRpbnN0YW5jZS5zbGljaygnc2xpY2tQYXVzZScpO1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIHNsaWNrUGxheSgpIHtcbiAgICB0aGlzLnpvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCkgPT4ge1xuICAgICAgdGhpcy4kaW5zdGFuY2Uuc2xpY2soJ3NsaWNrUGxheScpO1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIHVuc2xpY2soKSB7XG4gICAgaWYgKHRoaXMuJGluc3RhbmNlKSB7XG4gICAgICB0aGlzLnpvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCkgPT4ge1xuICAgICAgICB0aGlzLiRpbnN0YW5jZS5zbGljaygndW5zbGljaycpO1xuICAgICAgfSk7XG4gICAgICB0aGlzLiRpbnN0YW5jZSA9IHVuZGVmaW5lZDtcbiAgICB9XG4gICAgdGhpcy5pbml0aWFsaXplZCA9IGZhbHNlO1xuICB9XG5cbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xuICAgIGlmICh0aGlzLmluaXRpYWxpemVkKSB7XG4gICAgICBjb25zdCBjb25maWcgPSBjaGFuZ2VzWydjb25maWcnXTtcbiAgICAgIGlmIChjb25maWcucHJldmlvdXNWYWx1ZSAhPT0gY29uZmlnLmN1cnJlbnRWYWx1ZSAmJiBjb25maWcuY3VycmVudFZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgY29uc3QgcmVmcmVzaCA9IGNvbmZpZy5jdXJyZW50VmFsdWVbJ3JlZnJlc2gnXTtcbiAgICAgICAgY29uc3QgbmV3T3B0aW9ucyA9IE9iamVjdC5hc3NpZ24oe30sIGNvbmZpZy5jdXJyZW50VmFsdWUpO1xuICAgICAgICBkZWxldGUgbmV3T3B0aW9uc1sncmVmcmVzaCddO1xuXG4gICAgICAgIHRoaXMuem9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKSA9PiB7XG4gICAgICAgICAgdGhpcy4kaW5zdGFuY2Uuc2xpY2soJ3NsaWNrU2V0T3B0aW9uJywgbmV3T3B0aW9ucywgcmVmcmVzaCk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG59XG5cbkBEaXJlY3RpdmUoe1xuICBzZWxlY3RvcjogJ1tuZ3hTbGlja0l0ZW1dJyxcbn0pXG5leHBvcnQgY2xhc3MgU2xpY2tJdGVtRGlyZWN0aXZlIGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3kge1xuICBjb25zdHJ1Y3RvcihwdWJsaWMgZWw6IEVsZW1lbnRSZWYsXG4gICAgICAgICAgICAgIEBJbmplY3QoUExBVEZPUk1fSUQpIHByaXZhdGUgcGxhdGZvcm1JZDogc3RyaW5nLFxuICAgICAgICAgICAgICBASG9zdCgpIHByaXZhdGUgY2Fyb3VzZWw6IFNsaWNrQ2Fyb3VzZWxDb21wb25lbnQpIHtcbiAgfVxuXG4gIG5nT25Jbml0KCkge1xuICAgIGlmIChpc1BsYXRmb3JtQnJvd3Nlcih0aGlzLnBsYXRmb3JtSWQpKSB7XG4gICAgICB0aGlzLmNhcm91c2VsLmFkZFNsaWRlKHRoaXMpO1xuICAgIH1cbiAgfVxuXG4gIG5nT25EZXN0cm95KCkge1xuICAgIGlmIChpc1BsYXRmb3JtQnJvd3Nlcih0aGlzLnBsYXRmb3JtSWQpKSB7XG4gICAgICB0aGlzLmNhcm91c2VsLnJlbW92ZVNsaWRlKHRoaXMpO1xuICAgIH1cbiAgfVxufVxuIl19