UNPKG

ngsl-carousel

Version:

This project was generated with [Angular CLI](https://github.com/angular/angular-cli) version 6.2.4.

312 lines (304 loc) 26.9 kB
import { Directive, TemplateRef, Component, ContentChildren, ElementRef, Input, ViewChild, ViewChildren, NgModule } from '@angular/core'; import { animate, AnimationBuilder, style } from '@angular/animations'; import { CommonModule } from '@angular/common'; /** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc */ var NgslCarouselItemDirective = /** @class */ (function () { function NgslCarouselItemDirective(tpl) { this.tpl = tpl; } NgslCarouselItemDirective.decorators = [ { type: Directive, args: [{ // tslint:disable-next-line:directive-selector selector: '[ngslCarouselItem]' },] } ]; /** @nocollapse */ NgslCarouselItemDirective.ctorParameters = function () { return [ { type: TemplateRef } ]; }; return NgslCarouselItemDirective; }()); /** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc */ var NgslCarouselDotDirective = /** @class */ (function () { function NgslCarouselDotDirective(tpl) { this.tpl = tpl; this.isVisible = true; } NgslCarouselDotDirective.decorators = [ { type: Directive, args: [{ // tslint:disable-next-line:directive-selector selector: '[ngslCarouselDot]' },] } ]; /** @nocollapse */ NgslCarouselDotDirective.ctorParameters = function () { return [ { type: TemplateRef } ]; }; return NgslCarouselDotDirective; }()); /** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc */ var CarouselItemElement = /** @class */ (function () { function CarouselItemElement() { } CarouselItemElement.decorators = [ { type: Directive, args: [{ // tslint:disable-next-line:directive-selector selector: '.ngsl-carousel-item-directive' },] } ]; return CarouselItemElement; }()); var CarouselDotElement = /** @class */ (function () { function CarouselDotElement() { } CarouselDotElement.decorators = [ { type: Directive, args: [{ // tslint:disable-next-line:directive-selector selector: '.ngsl-carousel-dot-directive' },] } ]; return CarouselDotElement; }()); var NgslCarouselComponent = /** @class */ (function () { function NgslCarouselComponent(builder) { this.builder = builder; /* carousel end dot */ /* Input props start*/ this.timing = 450; this.rewindTiming = 900; this.arrows = true; this.dots = true; this.infinity = true; this.dynamicTiming = false; this.autoplay = true; this.perView = 1; this.action = null; this.currentSlide = 0; this.prevSlide = null; this.nextSlide = null; this.trackWidth = {}; } /** * @param {?} offset * @return {?} */ NgslCarouselComponent.prototype.buildAnimation = /** * @param {?} offset * @return {?} */ function (offset) { /** @type {?} */ var duration = this.action === 'REWIND' ? this.rewindTiming : this.timing; return this.builder.build([ animate(duration + "ms cubic-bezier(0.165, 0.840, 0.440, 1.000)", style({ transform: "translateX(" + offset + "%)" })) ]); }; /** * @param {?} action * @return {?} */ NgslCarouselComponent.prototype.changeSlide = /** * @param {?} action * @return {?} */ function (action) { this.setSlidesIndex(); /** @type {?} */ var itemW = (100 / this.items.length) / this.perView; /** @type {?} */ var offset = (itemW * this.currentSlide) * this.perView; /** @type {?} */ var myAnimation = this.buildAnimation(-offset); this.player = myAnimation.create(this.carousel.nativeElement); this.player.play(); // console.log(`changeSlide action: ${action}, is current slide: `, this.currentSlide + 1); }; /** * @param {?} index * @return {?} */ NgslCarouselComponent.prototype.goToSlide = /** * @param {?} index * @return {?} */ function (index) { if (this.dynamicTiming) { // В разработке, тестовая опция this.timing = this.timing + (55 * (index - this.currentSlide)); } this.currentSlide = index; this.changeSlide('go to slide'); }; /** * @return {?} */ NgslCarouselComponent.prototype.next = /** * @return {?} */ function () { /** @type {?} */ var countSlides = this.items.length; if (this.currentSlide + 1 === countSlides && this.infinity) { this.currentSlide = 0; this.action = 'REWIND'; this.changeSlide('rewind to first slide'); return; } if (this.currentSlide + 1 === countSlides && !this.infinity) { return; } this.currentSlide++; this.action = 'NEXT_SLIDE'; this.changeSlide('next slide'); }; /** * @return {?} */ NgslCarouselComponent.prototype.prev = /** * @return {?} */ function () { /** @type {?} */ var countSlides = this.items.length; if (this.currentSlide === 0 && this.infinity) { this.currentSlide = countSlides - 1; this.action = 'REWIND'; this.changeSlide('rewind to last slide'); return; } if (this.currentSlide === 0 && !this.infinity) { return; } this.currentSlide--; this.action = 'PREV_SLIDE'; this.changeSlide('prev slide'); }; /** * @return {?} */ NgslCarouselComponent.prototype.setSlidesIndex = /** * @return {?} */ function () { this.prevSlide = this.currentSlide === 0 ? this.items.length - 1 : this.currentSlide - 1; this.nextSlide = this.currentSlide === this.items.length - 1 ? 0 : this.currentSlide + 1; }; /** * @return {?} */ NgslCarouselComponent.prototype.removeDotsInDomElements = /** * @return {?} */ function () { /** @type {?} */ var position = this.perView > 1 ? this.dotsList.length - this.perView : null; this.dotsList.toArray().forEach(function (dot, i) { if (i > position) { dot.isVisible = false; } }); }; /** * @return {?} */ NgslCarouselComponent.prototype.setInitValues = /** * @return {?} */ function () { this.setSlidesIndex(); if (this.perView > 1) { this.removeDotsInDomElements(); } this.trackWidth = { width: (100 * this.items.length) / this.perView + "%" }; }; /** * @return {?} */ NgslCarouselComponent.prototype.ngAfterContentInit = /** * @return {?} */ function () { this.setInitValues(); }; NgslCarouselComponent.decorators = [ { type: Component, args: [{ // tslint:disable-next-line:component-selector selector: 'ngsl-carousel', exportAs: 'ngsl-carousel', template: "<div class=\"ngsl-carousel\">\n <div *ngIf=\"dots\" class=\"dots\" #dotsTrack>\n <div *ngFor=\"let item of dotsList; let i = index\"\n class=\"ngsl-carousel-dot-directive dot\"\n (click)=\"goToSlide(i)\"\n [class.is-current-item]=\"currentSlide === i\">\n <ng-container *ngIf=\"item.isVisible\" [ngTemplateOutlet]=\"item.tpl\"></ng-container>\n </div>\n </div>\n <div class=\"slide\">\n <div class=\"content\">\n <div *ngIf=\"arrows\" class=\"slide-arrows\">\n <input type=\"button\" (click)=\"prev()\" class=\"prev\" [class.is-disabled]=\"currentSlide === 0\" />\n <input type=\"button\" (click)=\"next()\" class=\"next\" [class.is-disabled]=\"currentSlide === items.length - 1\" />\n </div>\n <div class=\"slide-track\" #track [ngStyle]=\"trackWidth\">\n <div *ngFor=\"let item of items\" class=\"ngsl-carousel-item-directive\">\n <ng-container [ngTemplateOutlet]=\"item.tpl\"></ng-container>\n </div>\n </div>\n </div>\n </div>\n</div>\n", styles: [".ngsl-carousel{overflow:hidden;position:relative}.ngsl-carousel .dots{position:absolute;top:30px;right:40px;font-size:0;z-index:10}.ngsl-carousel .dots .dot{display:inline-block;vertical-align:middle;width:10px;height:10px;border-radius:100%;background-color:#768692;box-sizing:border-box;cursor:pointer}.ngsl-carousel .dots .dot+.dot{margin-left:10px}.ngsl-carousel .dots .dot.is-current-item{width:22px;height:22px;position:relative;border:1px solid #fff;background-color:transparent}.ngsl-carousel .dots .dot.is-current-item:after{content:\"\";position:absolute;left:50%;top:50%;-webkit-transform:translate3d(-50%,-50%,0);transform:translate3d(-50%,-50%,0);width:10px;height:10px;border-radius:100%;background-color:#fff}.slide-track{display:flex;flex-direction:row;flex-wrap:nowrap;height:100%}.ngsl-carousel-item-directive{width:100%;height:100%}.slide-arrows input[type=button]{z-index:10;position:absolute;left:0;top:50%;-webkit-transform:translateY(-50%);transform:translateY(-50%);width:40px;height:40px;background-color:#768692;opacity:.7;border:0;cursor:pointer;background-repeat:no-repeat;background-position:center}.slide-arrows input[type=button]:hover{opacity:.9}.slide-arrows input[type=button].is-disabled{background-color:#c4bcb7}.slide-arrows input[type=button].is-disabled:hover{opacity:.7}.slide-arrows input[type=button]:focus{outline:0}.slide-arrows input[type=button].prev{-webkit-transform:translateY(-50%) rotate(-180deg);transform:translateY(-50%) rotate(-180deg)}.slide-arrows input[type=button].next{left:auto;right:0}"] }] } ]; /** @nocollapse */ NgslCarouselComponent.ctorParameters = function () { return [ { type: AnimationBuilder } ]; }; NgslCarouselComponent.propDecorators = { items: [{ type: ContentChildren, args: [NgslCarouselItemDirective,] }], itemsElements: [{ type: ViewChildren, args: [CarouselItemElement, { read: ElementRef },] }], carousel: [{ type: ViewChild, args: ['track',] }], dotsList: [{ type: ContentChildren, args: [NgslCarouselDotDirective,] }], dotElements: [{ type: ViewChildren, args: [CarouselDotElement, { read: ElementRef },] }], dotTrack: [{ type: ViewChild, args: ['dotTrack',] }], timing: [{ type: Input }], rewindTiming: [{ type: Input }], arrows: [{ type: Input }], dots: [{ type: Input }], infinity: [{ type: Input }], dynamicTiming: [{ type: Input }], autoplay: [{ type: Input }], perView: [{ type: Input }] }; return NgslCarouselComponent; }()); /** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc */ var NgslCarouselModule = /** @class */ (function () { function NgslCarouselModule() { } NgslCarouselModule.decorators = [ { type: NgModule, args: [{ imports: [ CommonModule ], declarations: [ NgslCarouselComponent, NgslCarouselItemDirective, NgslCarouselDotDirective, CarouselItemElement, CarouselDotElement ], exports: [ NgslCarouselComponent, NgslCarouselItemDirective, NgslCarouselDotDirective, CarouselItemElement, CarouselDotElement ] },] } ]; return NgslCarouselModule; }()); /** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc */ /** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc */ export { NgslCarouselModule, NgslCarouselDotDirective as ɵe, NgslCarouselItemDirective as ɵd, CarouselDotElement as ɵb, CarouselItemElement as ɵa, NgslCarouselComponent as ɵc }; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmdzbC1jYXJvdXNlbC5qcy5tYXAiLCJzb3VyY2VzIjpbIm5nOi8vbmdzbC1jYXJvdXNlbC9zcmMvYXBwL25nc2wtY2Fyb3VzZWwvbmdzbC1jYXJvdXNlbC1pdGVtLmRpcmVjdGl2ZS50cyIsIm5nOi8vbmdzbC1jYXJvdXNlbC9zcmMvYXBwL25nc2wtY2Fyb3VzZWwvbmdzbC1jYXJvdXNlbC1kb3QuZGlyZWN0aXZlLnRzIiwibmc6Ly9uZ3NsLWNhcm91c2VsL3NyYy9hcHAvbmdzbC1jYXJvdXNlbC9uZ3NsLWNhcm91c2VsLmNvbXBvbmVudC50cyIsIm5nOi8vbmdzbC1jYXJvdXNlbC9zcmMvYXBwL25nc2wtY2Fyb3VzZWwvbmdzbC1jYXJvdXNlbC5tb2R1bGUudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRGlyZWN0aXZlLCBUZW1wbGF0ZVJlZiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5ARGlyZWN0aXZlKHtcbiAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOmRpcmVjdGl2ZS1zZWxlY3RvclxuICBzZWxlY3RvcjogJ1tuZ3NsQ2Fyb3VzZWxJdGVtXSdcbn0pXG5leHBvcnQgY2xhc3MgTmdzbENhcm91c2VsSXRlbURpcmVjdGl2ZSB7XG4gIGNvbnN0cnVjdG9yKHB1YmxpYyB0cGw6IFRlbXBsYXRlUmVmPGFueT4pIHt9XG59XG4iLCJpbXBvcnQgeyBEaXJlY3RpdmUsIFRlbXBsYXRlUmVmIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbkBEaXJlY3RpdmUoe1xuICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6ZGlyZWN0aXZlLXNlbGVjdG9yXG4gIHNlbGVjdG9yOiAnW25nc2xDYXJvdXNlbERvdF0nXG59KVxuZXhwb3J0IGNsYXNzIE5nc2xDYXJvdXNlbERvdERpcmVjdGl2ZSB7XG4gIGlzVmlzaWJsZSA9IHRydWU7XG4gIGNvbnN0cnVjdG9yKHB1YmxpYyB0cGw6IFRlbXBsYXRlUmVmPGFueT4pIHt9XG59XG4iLCJpbXBvcnQge1xuICBBZnRlckNvbnRlbnRJbml0LFxuICBDb21wb25lbnQsXG4gIENvbnRlbnRDaGlsZHJlbixcbiAgRGlyZWN0aXZlLFxuICBFbGVtZW50UmVmLFxuICBJbnB1dCxcbiAgUXVlcnlMaXN0LFxuICBWaWV3Q2hpbGQsXG4gIFZpZXdDaGlsZHJlblxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuaW1wb3J0IHsgTmdzbENhcm91c2VsSXRlbURpcmVjdGl2ZSB9IGZyb20gJy4vbmdzbC1jYXJvdXNlbC1pdGVtLmRpcmVjdGl2ZSc7XG5pbXBvcnQgeyBOZ3NsQ2Fyb3VzZWxEb3REaXJlY3RpdmUgfSBmcm9tICcuL25nc2wtY2Fyb3VzZWwtZG90LmRpcmVjdGl2ZSc7XG5pbXBvcnQge1xuICBhbmltYXRlLFxuICBBbmltYXRpb25CdWlsZGVyLFxuICBBbmltYXRpb25GYWN0b3J5LFxuICBBbmltYXRpb25QbGF5ZXIsXG4gIHN0eWxlXG59IGZyb20gJ0Bhbmd1bGFyL2FuaW1hdGlvbnMnO1xuXG5ARGlyZWN0aXZlKHtcbiAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOmRpcmVjdGl2ZS1zZWxlY3RvclxuICBzZWxlY3RvcjogJy5uZ3NsLWNhcm91c2VsLWl0ZW0tZGlyZWN0aXZlJ1xufSlcbi8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpkaXJlY3RpdmUtY2xhc3Mtc3VmZml4XG5leHBvcnQgY2xhc3MgQ2Fyb3VzZWxJdGVtRWxlbWVudCB7fVxuQERpcmVjdGl2ZSh7XG4gIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpkaXJlY3RpdmUtc2VsZWN0b3JcbiAgc2VsZWN0b3I6ICcubmdzbC1jYXJvdXNlbC1kb3QtZGlyZWN0aXZlJ1xufSlcbi8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpkaXJlY3RpdmUtY2xhc3Mtc3VmZml4XG5leHBvcnQgY2xhc3MgQ2Fyb3VzZWxEb3RFbGVtZW50IHt9XG5cbkBDb21wb25lbnQoe1xuICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6Y29tcG9uZW50LXNlbGVjdG9yXG4gIHNlbGVjdG9yOiAnbmdzbC1jYXJvdXNlbCcsXG4gIGV4cG9ydEFzOiAnbmdzbC1jYXJvdXNlbCcsXG4gIHRlbXBsYXRlVXJsOiAnLi9uZ3NsLWNhcm91c2VsLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vbmdzbC1jYXJvdXNlbC5jb21wb25lbnQuc2NzcyddXG59KVxuZXhwb3J0IGNsYXNzIE5nc2xDYXJvdXNlbENvbXBvbmVudCBpbXBsZW1lbnRzIEFmdGVyQ29udGVudEluaXQge1xuICAvKiBjYXJvdXNlbCBzdGFydCBpdGVtICovXG4gIEBDb250ZW50Q2hpbGRyZW4oTmdzbENhcm91c2VsSXRlbURpcmVjdGl2ZSkgaXRlbXM6IFF1ZXJ5TGlzdDxOZ3NsQ2Fyb3VzZWxJdGVtRGlyZWN0aXZlPjtcbiAgQFZpZXdDaGlsZHJlbihDYXJvdXNlbEl0ZW1FbGVtZW50LCB7IHJlYWQ6IEVsZW1lbnRSZWYgfSkgcHJpdmF0ZSBpdGVtc0VsZW1lbnRzOiBRdWVyeUxpc3Q8RWxlbWVudFJlZj47XG4gIEBWaWV3Q2hpbGQoJ3RyYWNrJykgcHJpdmF0ZSBjYXJvdXNlbDogRWxlbWVudFJlZjtcbiAgLyogY2Fyb3VzZWwgZW5kIGl0ZW0gKi9cblxuICAvKiBjYXJvdXNlbCBzdGFydCBkb3QgKi9cbiAgQENvbnRlbnRDaGlsZHJlbihOZ3NsQ2Fyb3VzZWxEb3REaXJlY3RpdmUpIGRvdHNMaXN0OiBRdWVyeUxpc3Q8TmdzbENhcm91c2VsRG90RGlyZWN0aXZlPjtcbiAgQFZpZXdDaGlsZHJlbihDYXJvdXNlbERvdEVsZW1lbnQsIHsgcmVhZDogRWxlbWVudFJlZiB9KSBwcml2YXRlIGRvdEVsZW1lbnRzOiBRdWVyeUxpc3Q8RWxlbWVudFJlZj47XG4gIEBWaWV3Q2hpbGQoJ2RvdFRyYWNrJykgcHJpdmF0ZSBkb3RUcmFjazogRWxlbWVudFJlZjtcbiAgLyogY2Fyb3VzZWwgZW5kIGRvdCAqL1xuXG4gIC8qIElucHV0IHByb3BzIHN0YXJ0Ki9cbiAgQElucHV0KCkgdGltaW5nID0gNDUwO1xuICBASW5wdXQoKSByZXdpbmRUaW1pbmcgPSA5MDA7XG4gIEBJbnB1dCgpIGFycm93cyA9IHRydWU7XG4gIEBJbnB1dCgpIGRvdHMgPSB0cnVlO1xuICBASW5wdXQoKSBpbmZpbml0eSA9IHRydWU7XG4gIEBJbnB1dCgpIGR5bmFtaWNUaW1pbmcgPSBmYWxzZTtcbiAgQElucHV0KCkgYXV0b3BsYXkgPSB0cnVlO1xuICBASW5wdXQoKSBwZXJWaWV3ID0gMTtcbiAgLyogSW5wdXQgcHJvcHMgZW5kKi9cbiAgcHJpdmF0ZSBwbGF5ZXI6IEFuaW1hdGlvblBsYXllcjtcbiAgcHJpdmF0ZSBhY3Rpb24gPSBudWxsO1xuICBjdXJyZW50U2xpZGUgPSAwO1xuICBwcmV2U2xpZGUgPSBudWxsO1xuICBuZXh0U2xpZGUgPSBudWxsO1xuICB0cmFja1dpZHRoID0ge307XG5cbiAgcHJpdmF0ZSBidWlsZEFuaW1hdGlvbihvZmZzZXQpIHtcbiAgICBjb25zdCBkdXJhdGlvbiA9IHRoaXMuYWN0aW9uID09PSAnUkVXSU5EJyA/IHRoaXMucmV3aW5kVGltaW5nIDogdGhpcy50aW1pbmc7XG4gICAgcmV0dXJuIHRoaXMuYnVpbGRlci5idWlsZChbXG4gICAgICBhbmltYXRlKGAke2R1cmF0aW9ufW1zIGN1YmljLWJlemllcigwLjE2NSwgMC44NDAsIDAuNDQwLCAxLjAwMClgLCBzdHlsZSh7IHRyYW5zZm9ybTogYHRyYW5zbGF0ZVgoJHtvZmZzZXR9JSlgIH0pKVxuICAgIF0pO1xuICB9XG5cbiAgcHJpdmF0ZSBjaGFuZ2VTbGlkZShhY3Rpb24pIHtcbiAgICB0aGlzLnNldFNsaWRlc0luZGV4KCk7XG4gICAgY29uc3QgaXRlbVcgPSAoMTAwIC8gdGhpcy5pdGVtcy5sZW5ndGgpIC8gdGhpcy5wZXJWaWV3O1xuICAgIGNvbnN0IG9mZnNldCA9IChpdGVtVyAqIHRoaXMuY3VycmVudFNsaWRlKSAqIHRoaXMucGVyVmlldztcbiAgICBjb25zdCBteUFuaW1hdGlvbjogQW5pbWF0aW9uRmFjdG9yeSA9IHRoaXMuYnVpbGRBbmltYXRpb24oLW9mZnNldCk7XG4gICAgdGhpcy5wbGF5ZXIgPSBteUFuaW1hdGlvbi5jcmVhdGUodGhpcy5jYXJvdXNlbC5uYXRpdmVFbGVtZW50KTtcbiAgICB0aGlzLnBsYXllci5wbGF5KCk7XG4gICAgLy8gY29uc29sZS5sb2coYGNoYW5nZVNsaWRlIGFjdGlvbjogJHthY3Rpb259LCBpcyBjdXJyZW50IHNsaWRlOiBgLCB0aGlzLmN1cnJlbnRTbGlkZSArIDEpO1xuICB9XG5cbiAgZ29Ub1NsaWRlKGluZGV4KSB7XG4gICAgaWYgKHRoaXMuZHluYW1pY1RpbWluZykge1xuICAgICAgLy8gw5DCkiDDkcKAw5DCsMOQwrfDkcKAw5DCsMOQwrHDkMK+w5HCgsOQwrrDkMK1LCDDkcKCw5DCtcORwoHDkcKCw5DCvsOQwrLDkMKww5HCjyDDkMK+w5DCv8ORwobDkMK4w5HCj1xuICAgICAgdGhpcy50aW1pbmcgPSB0aGlzLnRpbWluZyArICg1NSAqIChpbmRleCAtIHRoaXMuY3VycmVudFNsaWRlKSk7XG4gICAgfVxuICAgIHRoaXMuY3VycmVudFNsaWRlID0gaW5kZXg7XG4gICAgdGhpcy5jaGFuZ2VTbGlkZSgnZ28gdG8gc2xpZGUnKTtcbiAgfVxuXG4gIG5leHQoKSB7XG4gICAgY29uc3QgY291bnRTbGlkZXMgPSB0aGlzLml0ZW1zLmxlbmd0aDtcbiAgICBpZiAodGhpcy5jdXJyZW50U2xpZGUgKyAxID09PSBjb3VudFNsaWRlcyAmJiB0aGlzLmluZmluaXR5KSB7XG4gICAgICB0aGlzLmN1cnJlbnRTbGlkZSA9IDA7XG4gICAgICB0aGlzLmFjdGlvbiA9ICdSRVdJTkQnO1xuICAgICAgdGhpcy5jaGFuZ2VTbGlkZSgncmV3aW5kIHRvIGZpcnN0IHNsaWRlJyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICh0aGlzLmN1cnJlbnRTbGlkZSArIDEgPT09IGNvdW50U2xpZGVzICYmICF0aGlzLmluZmluaXR5KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5jdXJyZW50U2xpZGUrKztcbiAgICB0aGlzLmFjdGlvbiA9ICdORVhUX1NMSURFJztcbiAgICB0aGlzLmNoYW5nZVNsaWRlKCduZXh0IHNsaWRlJyk7XG4gIH1cblxuICBwcmV2KCkge1xuICAgIGNvbnN0IGNvdW50U2xpZGVzID0gdGhpcy5pdGVtcy5sZW5ndGg7XG4gICAgaWYgKHRoaXMuY3VycmVudFNsaWRlID09PSAwICYmIHRoaXMuaW5maW5pdHkpIHtcbiAgICAgIHRoaXMuY3VycmVudFNsaWRlID0gY291bnRTbGlkZXMgLSAxO1xuICAgICAgdGhpcy5hY3Rpb24gPSAnUkVXSU5EJztcbiAgICAgIHRoaXMuY2hhbmdlU2xpZGUoJ3Jld2luZCB0byBsYXN0IHNsaWRlJyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICh0aGlzLmN1cnJlbnRTbGlkZSA9PT0gMCAmJiAhdGhpcy5pbmZpbml0eSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuY3VycmVudFNsaWRlLS07XG4gICAgdGhpcy5hY3Rpb24gPSAnUFJFVl9TTElERSc7XG4gICAgdGhpcy5jaGFuZ2VTbGlkZSgncHJldiBzbGlkZScpO1xuICB9XG5cbiAgcHJpdmF0ZSBzZXRTbGlkZXNJbmRleCgpIHtcbiAgICB0aGlzLnByZXZTbGlkZSA9IHRoaXMuY3VycmVudFNsaWRlID09PSAwID8gdGhpcy5pdGVtcy5sZW5ndGggLSAxIDogdGhpcy5jdXJyZW50U2xpZGUgLSAxO1xuICAgIHRoaXMubmV4dFNsaWRlID0gdGhpcy5jdXJyZW50U2xpZGUgPT09IHRoaXMuaXRlbXMubGVuZ3RoIC0gMSA/IDAgOiB0aGlzLmN1cnJlbnRTbGlkZSArIDE7XG4gIH1cblxuICBwcml2YXRlIHJlbW92ZURvdHNJbkRvbUVsZW1lbnRzKCkge1xuICAgIGNvbnN0IHBvc2l0aW9uID0gdGhpcy5wZXJWaWV3ID4gMSA/IHRoaXMuZG90c0xpc3QubGVuZ3RoIC0gdGhpcy5wZXJWaWV3IDogbnVsbDtcbiAgICB0aGlzLmRvdHNMaXN0LnRvQXJyYXkoKS5mb3JFYWNoKChkb3QsIGkpID0+IHtcbiAgICAgIGlmIChpID4gcG9zaXRpb24pIHsgZG90LmlzVmlzaWJsZSA9IGZhbHNlOyB9XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIHNldEluaXRWYWx1ZXMoKSB7XG4gICAgdGhpcy5zZXRTbGlkZXNJbmRleCgpO1xuICAgIGlmICh0aGlzLnBlclZpZXcgPiAxKSB7XG4gICAgICB0aGlzLnJlbW92ZURvdHNJbkRvbUVsZW1lbnRzKCk7XG4gICAgfVxuICAgIHRoaXMudHJhY2tXaWR0aCA9IHtcbiAgICAgIHdpZHRoOiBgJHsoMTAwICogdGhpcy5pdGVtcy5sZW5ndGgpIC8gdGhpcy5wZXJWaWV3fSVgXG4gICAgfTtcbiAgfVxuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgYnVpbGRlcjogQW5pbWF0aW9uQnVpbGRlcikge31cblxuICBuZ0FmdGVyQ29udGVudEluaXQoKSB7XG4gICAgdGhpcy5zZXRJbml0VmFsdWVzKCk7XG4gIH1cbn1cbiIsImltcG9ydCB7IE5nTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgTmdzbENhcm91c2VsQ29tcG9uZW50LCBDYXJvdXNlbEl0ZW1FbGVtZW50LCBDYXJvdXNlbERvdEVsZW1lbnQgfSBmcm9tICcuL25nc2wtY2Fyb3VzZWwuY29tcG9uZW50JztcbmltcG9ydCB7IE5nc2xDYXJvdXNlbEl0ZW1EaXJlY3RpdmUgfSBmcm9tICcuL25nc2wtY2Fyb3VzZWwtaXRlbS5kaXJlY3RpdmUnO1xuaW1wb3J0IHsgTmdzbENhcm91c2VsRG90RGlyZWN0aXZlIH0gZnJvbSAnLi9uZ3NsLWNhcm91c2VsLWRvdC5kaXJlY3RpdmUnO1xuXG5ATmdNb2R1bGUoe1xuICBpbXBvcnRzOiBbXG4gICAgQ29tbW9uTW9kdWxlXG4gIF0sXG4gIGRlY2xhcmF0aW9uczogW1xuICAgIE5nc2xDYXJvdXNlbENvbXBvbmVudCxcbiAgICBOZ3NsQ2Fyb3VzZWxJdGVtRGlyZWN0aXZlLFxuICAgIE5nc2xDYXJvdXNlbERvdERpcmVjdGl2ZSxcbiAgICBDYXJvdXNlbEl0ZW1FbGVtZW50LFxuICAgIENhcm91c2VsRG90RWxlbWVudFxuICBdLFxuICBleHBvcnRzOiBbXG4gICAgTmdzbENhcm91c2VsQ29tcG9uZW50LFxuICAgIE5nc2xDYXJvdXNlbEl0ZW1EaXJlY3RpdmUsXG4gICAgTmdzbENhcm91c2VsRG90RGlyZWN0aXZlLFxuICAgIENhcm91c2VsSXRlbUVsZW1lbnQsXG4gICAgQ2Fyb3VzZWxEb3RFbGVtZW50XG4gIF1cblxufSlcbmV4cG9ydCBjbGFzcyBOZ3NsQ2Fyb3VzZWxNb2R1bGUgeyB9XG4iXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7QUFBQTtJQU9FLG1DQUFtQixHQUFxQjtRQUFyQixRQUFHLEdBQUgsR0FBRyxDQUFrQjtLQUFJOztnQkFMN0MsU0FBUyxTQUFDOztvQkFFVCxRQUFRLEVBQUUsb0JBQW9CO2lCQUMvQjs7OztnQkFMbUIsV0FBVzs7b0NBQS9COzs7Ozs7O0FDQUE7SUFRRSxrQ0FBbUIsR0FBcUI7UUFBckIsUUFBRyxHQUFILEdBQUcsQ0FBa0I7eUJBRDVCLElBQUk7S0FDNEI7O2dCQU43QyxTQUFTLFNBQUM7O29CQUVULFFBQVEsRUFBRSxtQkFBbUI7aUJBQzlCOzs7O2dCQUxtQixXQUFXOzttQ0FBL0I7Ozs7Ozs7QUNBQTs7OztnQkFzQkMsU0FBUyxTQUFDOztvQkFFVCxRQUFRLEVBQUUsK0JBQStCO2lCQUMxQzs7OEJBekJEOzs7Ozs7Z0JBNEJDLFNBQVMsU0FBQzs7b0JBRVQsUUFBUSxFQUFFLDhCQUE4QjtpQkFDekM7OzZCQS9CRDs7O0lBMEpFLCtCQUFvQixPQUF5QjtRQUF6QixZQUFPLEdBQVAsT0FBTyxDQUFrQjs7O3NCQWxHM0IsR0FBRzs0QkFDRyxHQUFHO3NCQUNULElBQUk7b0JBQ04sSUFBSTt3QkFDQSxJQUFJOzZCQUNDLEtBQUs7d0JBQ1YsSUFBSTt1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