UNPKG

ngx-slice-kit

Version:

[![npm version](https://badge.fury.io/js/ngx-slice-kit.svg)](https://badge.fury.io/js/ngx-slice-kit)

261 lines 45.4 kB
import { Component, ContentChildren, HostListener, Input, ViewChild } from '@angular/core'; import { SlideComponent } from './slide/slide.component'; import { fromEvent, interval } from 'rxjs'; import { filter, repeatWhen, takeUntil } from 'rxjs/operators'; import * as i0 from "@angular/core"; import * as i1 from "@angular/common"; import * as i2 from "../dots/dots.component"; import * as i3 from "../../buttons/icon/icon.component"; import * as i4 from "../../buttons/button/button.component"; export class CarouselComponent { constructor(el, renderer) { this.el = el; this.renderer = renderer; this.dots = false; this.infinity = false; this.pauseByHover = false; this.arrows = true; this.slidesToScroll = 1; this.slidesToShow = 1; this.timeout = 5000; this.offset = 0; this.slidesArr = []; this.activeSlideIndex = 0; this.curCarouselPosition = 0; this.pagePenalty = 0; this.isGrabbed = false; this.isViewInit = false; } get dotsCount() { return Math.ceil(this.slidesArr.length / this.slidesToScroll); } windowResizeHandler() { if (this.carouselWrapper.nativeElement.offsetWidth !== this.carouselWrapperRects?.width) { this.updateSlider(); } } pointerUpHandler() { if (!this.isGrabbed) { return; } this.isGrabbed = false; if (this.scrollOffset < this.curCarouselPosition - 100) { this.move('forward'); } else if (this.scrollOffset > this.curCarouselPosition + 100) { this.move('back'); } else { this.animate(this.curCarouselPosition); } this.scrollOffset = 0; } pointerMoveHandler(event) { if (this.isGrabbed) { this.scrollOffset = this.curCarouselPosition + event.clientX - this.scrollStartX; this.renderer.setStyle(this.carouselRow.nativeElement, 'transform', `translateX(${this.scrollOffset}px)`); } } animate(newPosition) { this.isScrolling = true; this.renderer.setStyle(this.carouselRow.nativeElement, 'transition', `400ms`); this.renderer.setStyle(this.carouselRow.nativeElement, 'transform', `translateX(${newPosition}px)`); this.updatePosition(); if (this.activeSlideIndex + 1 > this.dotsCount) { this.activeSlideIndex = 0; setTimeout(() => { this.curCarouselPosition = -(this.slidesToScroll * this.slideWidth); this.renderer.setStyle(this.carouselRow.nativeElement, 'transform', `translateX(${this.curCarouselPosition}px)`); this.carouselRowRects = this.carouselRow.nativeElement.getBoundingClientRect(); }, 500); } if (this.activeSlideIndex === -1) { this.activeSlideIndex = this.dotsCount - 1; setTimeout(() => { this.curCarouselPosition = -(this.slidesToScroll * this.slideWidth) * this.dotsCount; this.renderer.setStyle(this.carouselRow.nativeElement, 'transform', `translateX(${this.curCarouselPosition}px)`); this.carouselRowRects = this.carouselRow.nativeElement.getBoundingClientRect(); }, 500); } } grab(event) { event.preventDefault(); this.isGrabbed = true; this.scrollStartX = event.clientX; } move(direction) { this.carouselWrapperRects = this.carouselWrapper.nativeElement.getBoundingClientRect(); const widthPenalty = (this.activeSlideIndex === 0 ? this.slideWidth * (this.dotsCount * this.slidesToScroll - this.slidesArr.length) : 0); if (this.isScrolling) { return; } switch (direction) { case 'back': this.curCarouselPosition += this.carouselRowRects.left + this.scrollStep > this.carouselWrapperRects.left ? this.carouselWrapperRects.left - this.carouselRowRects.left : this.scrollStep - widthPenalty; break; case 'forward': this.curCarouselPosition += this.carouselRowRects.right - this.scrollStep < this.carouselWrapperRects.right ? -(this.carouselRowRects.right - this.carouselWrapperRects.right) : -this.scrollStep; break; } const prevIndex = this.activeSlideIndex; this.activeSlideIndex = Math.ceil(Math.abs(this.curCarouselPosition + this.pagePenalty) / (this.scrollStep)) % (this.dotsCount + 1); if (prevIndex === 0 && this.activeSlideIndex === 1 && direction === 'back') { this.activeSlideIndex = -1; } this.animate(this.curCarouselPosition); } selectSlide(slideIndex) { this.activeSlideIndex = slideIndex; let notMultipleDif = 0; if (slideIndex + 1 === this.dotsCount) { notMultipleDif = (this.slidesArr.length % this.slidesToScroll) * this.slideWidth; } this.curCarouselPosition = -(this.activeSlideIndex * this.slideWidth * this.slidesToScroll - notMultipleDif) - this.pagePenalty; this.animate(this.curCarouselPosition); } updatePosition() { setTimeout(() => { this.carouselRowRects = this.carouselRow.nativeElement.getBoundingClientRect(); this.renderer.removeStyle(this.carouselRow.nativeElement, 'transition'); this.isScrolling = false; }, 500); } setSlideStyles() { this.slidesArr.forEach(slide => { if (this.offset) { this.renderer.setStyle(slide.el.nativeElement, 'padding', this.offset + 'px'); } this.renderer.setStyle(slide.el.nativeElement, 'width', this.slideWidth + 'px'); }); } checkSlidesToScroll() { if (this.slidesToScroll > this.slidesArr.length) { this.slidesToScroll = this.slidesArr.length; } } createClones() { this.lastPageClones = [...this.slidesArr].slice(-this.slidesToShow).map(this.cloneNode.bind(this)).reverse(); this.firstPageClones = [...this.slidesArr].slice(0, this.slidesToShow).map(this.cloneNode.bind(this)); } cloneNode(node) { const clone = node.el.nativeElement.cloneNode(true); this.renderer.addClass(clone, 'sdk-slide--clone'); return clone; } insertClones() { for (const clone of this.lastPageClones) { this.renderer.insertBefore(this.carouselRow.nativeElement, clone, this.carouselRow.nativeElement.firstChild); } for (const clone of this.firstPageClones) { this.renderer.appendChild(this.carouselRow.nativeElement, clone); } } removeClones() { for (const clone of this.firstPageClones) { this.renderer.removeChild(this.carouselRow.nativeElement, clone); } for (const clone of this.lastPageClones) { this.renderer.removeChild(this.carouselRow.nativeElement, clone); } } updateSlider() { this.carouselWrapperRects = this.carouselWrapper.nativeElement.getBoundingClientRect(); this.slideWidth = this.carouselWrapper.nativeElement.offsetWidth / this.slidesToShow; this.scrollStep = this.slidesToScroll * this.slideWidth; this.setSlideStyles(); this.checkSlidesToScroll(); if (this.infinity) { this.pagePenalty = this.scrollStep; if (this.firstPageClones || this.lastPageClones) { this.removeClones(); } this.createClones(); this.insertClones(); this.curCarouselPosition = -(this.slidesToScroll * this.slideWidth); this.renderer.setStyle(this.carouselRow.nativeElement, 'transform', `translateX(${this.curCarouselPosition}px)`); this.updatePosition(); } this.carouselRowRects = this.carouselRow.nativeElement.getBoundingClientRect(); } ngOnInit() { this.sub = fromEvent(this.carouselRow.nativeElement, 'pointerdown').subscribe(pointerEvent => { this.grab(pointerEvent); }); } ngAfterContentInit() { this.slideWidth = this.carouselWrapper.nativeElement.offsetWidth / this.slidesToShow; this.slidesArr = this.carouselSlides.toArray(); } ngAfterViewInit() { const pointerEnter$ = fromEvent(this.el.nativeElement, 'pointerenter').pipe(filter(() => this.pauseByHover)); const pointerLeave$ = fromEvent(this.el.nativeElement, 'pointerleave'); const pointerLeave = pointerLeave$.subscribe(() => { this.pointerUpHandler(); }); this.isViewInit = true; this.updateSlider(); this.sub.add(pointerLeave); if (this.timeout) { const slideTimeout = interval(this.timeout) .pipe(takeUntil(pointerEnter$), repeatWhen(() => pointerLeave$)) .subscribe(() => { this.move('forward'); }); this.sub.add(slideTimeout); } } // ngOnChanges(changes): void { // if (this.isViewInit) { // if (changes.slidesToScroll || changes.slidesToShow) { // this.updateSlider(); // } // } // } ngOnDestroy() { this.sub?.unsubscribe(); } } CarouselComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.0.3", ngImport: i0, type: CarouselComponent, deps: [{ token: i0.ElementRef }, { token: i0.Renderer2 }], target: i0.ɵɵFactoryTarget.Component }); CarouselComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.0.3", type: CarouselComponent, selector: "sdk-carousel", inputs: { dots: "dots", infinity: "infinity", pauseByHover: "pauseByHover", arrows: "arrows", slidesToScroll: "slidesToScroll", slidesToShow: "slidesToShow", timeout: "timeout", offset: "offset" }, host: { listeners: { "window:resize": "windowResizeHandler()", "pointerup": "pointerUpHandler()", "pointermove": "pointerMoveHandler($event)" } }, queries: [{ propertyName: "carouselSlides", predicate: SlideComponent }], viewQueries: [{ propertyName: "carouselWrapper", first: true, predicate: ["carouselWrapper"], descendants: true, static: true }, { propertyName: "carouselRow", first: true, predicate: ["carouselRow"], descendants: true, static: true }], ngImport: i0, template: "<div class=\"sdk-carousel\">\n <div class=\"sdk-carousel__wrapper\" #carouselWrapper>\n <ng-container *ngIf=\"arrows\">\n <button sdk-round-button class=\"sdk-carousel__arrow sdk-carousel__arrow--left\" color=\"basic\"\n (click)=\"move('back')\">\n <sdk-icon icon=\"chevron_left\" [size]=\"24\"></sdk-icon>\n </button>\n <button sdk-round-button class=\"sdk-carousel__arrow sdk-carousel__arrow--right\" color=\"basic\"\n (click)=\"move('forward')\">\n <sdk-icon icon=\"chevron_right\" [size]=\"24\"></sdk-icon>\n </button>\n </ng-container>\n <div class=\"sdk-carousel__row\" #carouselRow draggable=\"false\">\n <ng-content select=\"sdk-slide\"></ng-content>\n </div>\n </div>\n <div class=\"sdk-carousel__dots\" *ngIf=\"dots\" [style.bottom.px]=\"-offset\">\n <sdk-dots [activeIndex]=\"activeSlideIndex\" [count]=\"dotsCount\" (selected)=\"selectSlide($event)\"></sdk-dots>\n </div>\n</div>\n", styles: [".sdk-carousel__wrapper{display:flex;position:relative;overflow:hidden}.sdk-carousel__arrow{position:absolute;height:44px;width:44px;background-color:var(--background-a100);box-shadow:0 0 4px #0000004d;transition:all .4s;z-index:1;top:calc(50% - 22px)}.sdk-carousel__arrow:hover{box-shadow:0 0 6px -3px #0000004d}.sdk-carousel__arrow:active{box-shadow:inset 0 0 4px 2px #0000004d}.sdk-carousel__arrow--right{right:2px}.sdk-carousel__arrow--left{left:2px}.sdk-carousel__dots{margin-top:12px;width:100%;display:flex;justify-content:center}.sdk-carousel__row{display:flex;position:relative;align-items:center;left:0}.sdk-carousel__row img{-webkit-user-select:none;user-select:none}\n"], dependencies: [{ kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i2.DotsComponent, selector: "sdk-dots", inputs: ["count", "activeIndex", "small"], outputs: ["selected"] }, { kind: "component", type: i3.IconComponent, selector: "sdk-icon", inputs: ["icon", "image", "inline", "size", "color"] }, { kind: "component", type: i4.ButtonComponent, selector: "[sdk-base-button], [sdk-flat-button], [sdk-raised-button], [sdk-stroked-button], [sdk-round-button], [sdk-icon-button]", inputs: ["color", "size", "small", "disabled"] }] }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.0.3", ngImport: i0, type: CarouselComponent, decorators: [{ type: Component, args: [{ selector: 'sdk-carousel', template: "<div class=\"sdk-carousel\">\n <div class=\"sdk-carousel__wrapper\" #carouselWrapper>\n <ng-container *ngIf=\"arrows\">\n <button sdk-round-button class=\"sdk-carousel__arrow sdk-carousel__arrow--left\" color=\"basic\"\n (click)=\"move('back')\">\n <sdk-icon icon=\"chevron_left\" [size]=\"24\"></sdk-icon>\n </button>\n <button sdk-round-button class=\"sdk-carousel__arrow sdk-carousel__arrow--right\" color=\"basic\"\n (click)=\"move('forward')\">\n <sdk-icon icon=\"chevron_right\" [size]=\"24\"></sdk-icon>\n </button>\n </ng-container>\n <div class=\"sdk-carousel__row\" #carouselRow draggable=\"false\">\n <ng-content select=\"sdk-slide\"></ng-content>\n </div>\n </div>\n <div class=\"sdk-carousel__dots\" *ngIf=\"dots\" [style.bottom.px]=\"-offset\">\n <sdk-dots [activeIndex]=\"activeSlideIndex\" [count]=\"dotsCount\" (selected)=\"selectSlide($event)\"></sdk-dots>\n </div>\n</div>\n", styles: [".sdk-carousel__wrapper{display:flex;position:relative;overflow:hidden}.sdk-carousel__arrow{position:absolute;height:44px;width:44px;background-color:var(--background-a100);box-shadow:0 0 4px #0000004d;transition:all .4s;z-index:1;top:calc(50% - 22px)}.sdk-carousel__arrow:hover{box-shadow:0 0 6px -3px #0000004d}.sdk-carousel__arrow:active{box-shadow:inset 0 0 4px 2px #0000004d}.sdk-carousel__arrow--right{right:2px}.sdk-carousel__arrow--left{left:2px}.sdk-carousel__dots{margin-top:12px;width:100%;display:flex;justify-content:center}.sdk-carousel__row{display:flex;position:relative;align-items:center;left:0}.sdk-carousel__row img{-webkit-user-select:none;user-select:none}\n"] }] }], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: i0.Renderer2 }]; }, propDecorators: { carouselSlides: [{ type: ContentChildren, args: [SlideComponent] }], carouselWrapper: [{ type: ViewChild, args: ['carouselWrapper', { static: true }] }], carouselRow: [{ type: ViewChild, args: ['carouselRow', { static: true }] }], dots: [{ type: Input }], infinity: [{ type: Input }], pauseByHover: [{ type: Input }], arrows: [{ type: Input }], slidesToScroll: [{ type: Input }], slidesToShow: [{ type: Input }], timeout: [{ type: Input }], offset: [{ type: Input }], windowResizeHandler: [{ type: HostListener, args: ['window:resize'] }], pointerUpHandler: [{ type: HostListener, args: ['pointerup'] }], pointerMoveHandler: [{ type: HostListener, args: ['pointermove', ['$event']] }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2Fyb3VzZWwuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9uZ3gtc2xpY2Uta2l0L3NyYy9saWIvbGF5b3V0L2Nhcm91c2VsL2Nhcm91c2VsLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvbmd4LXNsaWNlLWtpdC9zcmMvbGliL2xheW91dC9jYXJvdXNlbC9jYXJvdXNlbC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBR0gsU0FBUyxFQUNULGVBQWUsRUFFZixZQUFZLEVBQ1osS0FBSyxFQUtMLFNBQVMsRUFDWixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUMsY0FBYyxFQUFDLE1BQU0seUJBQXlCLENBQUM7QUFDdkQsT0FBTyxFQUFDLFNBQVMsRUFBRSxRQUFRLEVBQWUsTUFBTSxNQUFNLENBQUM7QUFDdkQsT0FBTyxFQUFDLE1BQU0sRUFBRSxVQUFVLEVBQUUsU0FBUyxFQUFDLE1BQU0sZ0JBQWdCLENBQUM7Ozs7OztBQU83RCxNQUFNLE9BQU8saUJBQWlCO0lBeUMxQixZQUNZLEVBQWMsRUFDZCxRQUFtQjtRQURuQixPQUFFLEdBQUYsRUFBRSxDQUFZO1FBQ2QsYUFBUSxHQUFSLFFBQVEsQ0FBVztRQXBDZixTQUFJLEdBQVksS0FBSyxDQUFDO1FBQ3RCLGFBQVEsR0FBWSxLQUFLLENBQUM7UUFDMUIsaUJBQVksR0FBWSxLQUFLLENBQUM7UUFDOUIsV0FBTSxHQUFZLElBQUksQ0FBQztRQUN2QixtQkFBYyxHQUFXLENBQUMsQ0FBQztRQUMzQixpQkFBWSxHQUFXLENBQUMsQ0FBQztRQUN6QixZQUFPLEdBQVcsSUFBSSxDQUFDO1FBQ3ZCLFdBQU0sR0FBVyxDQUFDLENBQUM7UUFFNUIsY0FBUyxHQUFxQixFQUFFLENBQUM7UUFJakMscUJBQWdCLEdBQVcsQ0FBQyxDQUFDO1FBQzdCLHdCQUFtQixHQUFXLENBQUMs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QUk7SUFFRyxXQUFXO1FBQ2QsSUFBSSxDQUFDLEdBQUcsRUFBRSxXQUFXLEVBQUUsQ0FBQztJQUM1QixDQUFDOzs4R0FsUlEsaUJBQWlCO2tHQUFqQixpQkFBaUIsNGFBRVQsY0FBYywwUUN6Qm5DLHlpQ0FvQkE7MkZER2EsaUJBQWlCO2tCQUw3QixTQUFTOytCQUNJLGNBQWM7eUhBTWdCLGNBQWM7c0JBQXJELGVBQWU7dUJBQUMsY0FBYztnQkFFc0IsZUFBZTtzQkFBbkUsU0FBUzt1QkFBQyxpQkFBaUIsRUFBRSxFQUFDLE1BQU0sRUFBRSxJQUFJLEVBQUM7Z0JBQ0ssV0FBVztzQkFBM0QsU0FBUzt1QkFBQyxhQUFhLEVBQUUsRUFBQyxNQUFNLEVBQUUsSUFBSSxFQUFDO2dCQUV4QixJQUFJO3NCQUFuQixLQUFLO2dCQUNVLFFBQVE7c0JBQXZCLEtBQUs7Z0JBQ1UsWUFBWTtzQkFBM0IsS0FBSztnQkFDVSxNQUFNO3NCQUFyQixLQUFLO2dCQUNVLGNBQWM7c0JBQTdCLEtBQUs7Z0JBQ1UsWUFBWTtzQkFBM0IsS0FBSztnQkFDVSxPQUFPO3NCQUF0QixLQUFLO2dCQUNVLE1BQU07c0JBQXJCLEtBQUs7Z0JBa0NDLG1CQUFtQjtzQkFEekIsWUFBWTt1QkFBQyxlQUFlO2dCQVF0QixnQkFBZ0I7c0JBRHRCLFlBQVk7dUJBQUMsV0FBVztnQkFtQmxCLGtCQUFrQjtzQkFEeEIsWUFBWTt1QkFBQyxhQUFhLEVBQUUsQ0FBQyxRQUFRLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICAgIEFmdGVyQ29udGVudEluaXQsXG4gICAgQWZ0ZXJWaWV3SW5pdCxcbiAgICBDb21wb25lbnQsXG4gICAgQ29udGVudENoaWxkcmVuLFxuICAgIEVsZW1lbnRSZWYsXG4gICAgSG9zdExpc3RlbmVyLFxuICAgIElucHV0LFxuICAgIE9uRGVzdHJveSxcbiAgICBPbkluaXQsXG4gICAgUXVlcnlMaXN0LFxuICAgIFJlbmRlcmVyMixcbiAgICBWaWV3Q2hpbGRcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge1NsaWRlQ29tcG9uZW50fSBmcm9tICcuL3NsaWRlL3NsaWRlLmNvbXBvbmVudCc7XG5pbXBvcnQge2Zyb21FdmVudCwgaW50ZXJ2YWwsIFN1YnNjcmlwdGlvbn0gZnJvbSAncnhqcyc7XG5pbXBvcnQge2ZpbHRlciwgcmVwZWF0V2hlbiwgdGFrZVVudGlsfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5cbkBDb21wb25lbnQoe1xuICAgIHNlbGVjdG9yOiAnc2RrLWNhcm91c2VsJyxcbiAgICB0ZW1wbGF0ZVVybDogJy4vY2Fyb3VzZWwuY29tcG9uZW50Lmh0bWwnLFxuICAgIHN0eWxlVXJsczogWycuL2Nhcm91c2VsLmNvbXBvbmVudC5zY3NzJ10sXG59KVxuZXhwb3J0IGNsYXNzIENhcm91c2VsQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBBZnRlckNvbnRlbnRJbml0LCBBZnRlclZpZXdJbml0LCBPbkRlc3Ryb3kge1xuXG4gICAgQENvbnRlbnRDaGlsZHJlbihTbGlkZUNvbXBvbmVudCkgcHVibGljIGNhcm91c2VsU2xpZGVzOiBRdWVyeUxpc3Q8U2xpZGVDb21wb25lbnQ+O1xuXG4gICAgQFZpZXdDaGlsZCgnY2Fyb3VzZWxXcmFwcGVyJywge3N0YXRpYzogdHJ1ZX0pIHB1YmxpYyBjYXJvdXNlbFdyYXBwZXI6IEVsZW1lbnRSZWY7XG4gICAgQFZpZXdDaGlsZCgnY2Fyb3VzZWxSb3cnLCB7c3RhdGljOiB0cnVlfSkgcHVibGljIGNhcm91c2VsUm93OiBFbGVtZW50UmVmO1xuXG4gICAgQElucHV0KCkgcHVibGljIGRvdHM6IGJvb2xlYW4gPSBmYWxzZTtcbiAgICBASW5wdXQoKSBwdWJsaWMgaW5maW5pdHk6IGJvb2xlYW4gPSBmYWxzZTtcbiAgICBASW5wdXQoKSBwdWJsaWMgcGF1c2VCeUhvdmVyOiBib29sZWFuID0gZmFsc2U7XG4gICAgQElucHV0KCkgcHVibGljIGFycm93czogYm9vbGVhbiA9IHRydWU7XG4gICAgQElucHV0KCkgcHVibGljIHNsaWRlc1RvU2Nyb2xsOiBudW1iZXIgPSAxO1xuICAgIEBJbnB1dCgpIHB1YmxpYyBzbGlkZXNUb1Nob3c6IG51bWJlciA9IDE7XG4gICAgQElucHV0KCkgcHVibGljIHRpbWVvdXQ6IG51bWJlciA9IDUwMDA7XG4gICAgQElucHV0KCkgcHVibGljIG9mZnNldDogbnVtYmVyID0gMDtcblxuICAgIHB1YmxpYyBzbGlkZXNBcnI6IFNsaWRlQ29tcG9uZW50W10gPSBbXTtcbiAgICBwdWJsaWMgZmlyc3RQYWdlQ2xvbmVzOiBTbGlkZUNvbXBvbmVudFtdO1xuICAgIHB1YmxpYyBsYXN0UGFnZUNsb25lczogU2xpZGVDb21wb25lbnRbXTtcblxuICAgIHB1YmxpYyBhY3RpdmVTbGlkZUluZGV4OiBudW1iZXIgPSAwO1xuICAgIHB1YmxpYyBjdXJDYXJvdXNlbFBvc2l0aW9uOiBudW1iZXIgPSAwO1xuICAgIHB1YmxpYyBwYWdlUGVuYWx0eTogbnVtYmVyID0gMDtcbiAgICBwdWJsaWMgc2xpZGVXaWR0aDogbnVtYmVyO1xuICAgIHB1YmxpYyBzY3JvbGxTdGVwOiBudW1iZXI7XG4gICAgcHVibGljIHNjcm9sbFN0YXJ0WDogbnVtYmVyO1xuICAgIHB1YmxpYyBzY3JvbGxPZmZzZXQ6IG51bWJlcjtcblxuICAgIHB1YmxpYyBpc1Njcm9sbGluZzogYm9vbGVhbjtcbiAgICBwdWJsaWMgaXNHcmFiYmVkOiBib29sZWFuID0gZmFsc2U7XG4gICAgcHVibGljIGlzVmlld0luaXQ6IGJvb2xlYW4gPSBmYWxzZTtcblxuICAgIHB1YmxpYyBjYXJvdXNlbFdyYXBwZXJSZWN0czogQ2xpZW50UmVjdDtcbiAgICBwdWJsaWMgY2Fyb3VzZWxSb3dSZWN0czogQ2xpZW50UmVjdDtcblxuICAgIHB1YmxpYyBzdWI6IFN1YnNjcmlwdGlvbjtcblxuICAgIHB1YmxpYyBnZXQgZG90c0NvdW50KCk6IG51bWJlciB7XG4gICAgICAgIHJldHVybiBNYXRoLmNlaWwodGhpcy5zbGlkZXNBcnIubGVuZ3RoIC8gdGhpcy5zbGlkZXNUb1Njcm9sbCk7XG4gICAgfVxuXG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIHByaXZhdGUgZWw6IEVsZW1lbnRSZWYsXG4gICAgICAgIHByaXZhdGUgcmVuZGVyZXI6IFJlbmRlcmVyMixcbiAgICApIHtcbiAgICB9XG5cbiAgICBASG9zdExpc3RlbmVyKCd3aW5kb3c6cmVzaXplJylcbiAgICBwdWJsaWMgd2luZG93UmVzaXplSGFuZGxlcigpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMuY2Fyb3VzZWxXcmFwcGVyLm5hdGl2ZUVsZW1lbnQub2Zmc2V0V2lkdGggIT09IHRoaXMuY2Fyb3VzZWxXcmFwcGVyUmVjdHM/LndpZHRoKSB7XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZVNsaWRlcigpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgQEhvc3RMaXN0ZW5lcigncG9pbnRlcnVwJylcbiAgICBwdWJsaWMgcG9pbnRlclVwSGFuZGxlcigpOiB2b2lkIHtcbiAgICAgICAgaWYgKCF0aGlzLmlzR3JhYmJlZCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5pc0dyYWJiZWQgPSBmYWxzZTtcblxuICAgICAgICBpZiAodGhpcy5zY3JvbGxPZmZzZXQgPCB0aGlzLmN1ckNhcm91c2VsUG9zaXRpb24gLSAxMDApIHtcbiAgICAgICAgICAgIHRoaXMubW92ZSgnZm9yd2FyZCcpO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuc2Nyb2xsT2Zmc2V0ID4gdGhpcy5jdXJDYXJvdXNlbFBvc2l0aW9uICsgMTAwKSB7XG4gICAgICAgICAgICB0aGlzLm1vdmUoJ2JhY2snKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuYW5pbWF0ZSh0aGlzLmN1ckNhcm91c2VsUG9zaXRpb24pO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuc2Nyb2xsT2Zmc2V0ID0gMDtcbiAgICB9XG5cbiAgICBASG9zdExpc3RlbmVyKCdwb2ludGVybW92ZScsIFsnJGV2ZW50J10pXG4gICAgcHVibGljIHBvaW50ZXJNb3ZlSGFuZGxlcihldmVudDogUG9pbnRlckV2ZW50KTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLmlzR3JhYmJlZCkge1xuICAgICAgICAgICAgdGhpcy5zY3JvbGxPZmZzZXQgPSB0aGlzLmN1ckNhcm91c2VsUG9zaXRpb24gKyBldmVudC5jbGllbnRYIC0gdGhpcy5zY3JvbGxTdGFydFg7XG4gICAgICAgICAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHRoaXMuY2Fyb3VzZWxSb3cubmF0aXZlRWxlbWVudCwgJ3RyYW5zZm9ybScsIGB0cmFuc2xhdGVYKCR7dGhpcy5zY3JvbGxPZmZzZXR9cHgpYCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgYW5pbWF0ZShuZXdQb3NpdGlvbik6IHZvaWQge1xuICAgICAgICB0aGlzLmlzU2Nyb2xsaW5nID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZSh0aGlzLmNhcm91c2VsUm93Lm5hdGl2ZUVsZW1lbnQsICd0cmFuc2l0aW9uJywgYDQwMG1zYCk7XG4gICAgICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUodGhpcy5jYXJvdXNlbFJvdy5uYXRpdmVFbGVtZW50LCAndHJhbnNmb3JtJywgYHRyYW5zbGF0ZVgoJHtuZXdQb3NpdGlvbn1weClgKTtcbiAgICAgICAgdGhpcy51cGRhdGVQb3NpdGlvbigpO1xuXG4gICAgICAgIGlmICh0aGlzLmFjdGl2ZVNsaWRlSW5kZXggKyAxID4gdGhpcy5kb3RzQ291bnQpIHtcbiAgICAgICAgICAgIHRoaXMuYWN0aXZlU2xpZGVJbmRleCA9IDA7XG4gICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLmN1ckNhcm91c2VsUG9zaXRpb24gPSAtKHRoaXMuc2xpZGVzVG9TY3JvbGwgKiB0aGlzLnNsaWRlV2lkdGgpO1xuICAgICAgICAgICAgICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUodGhpcy5jYXJvdXNlbFJvdy5uYXRpdmVFbGVtZW50LCAndHJhbnNmb3JtJywgYHRyYW5zbGF0ZVgoJHt0aGlzLmN1ckNhcm91c2VsUG9zaXRpb259cHgpYCk7XG4gICAgICAgICAgICAgICAgdGhpcy5jYXJvdXNlbFJvd1JlY3RzID0gdGhpcy5jYXJvdXNlbFJvdy5uYXRpdmVFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgICAgICAgfSwgNTAwKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmFjdGl2ZVNsaWRlSW5kZXggPT09IC0xKSB7XG4gICAgICAgICAgICB0aGlzLmFjdGl2ZVNsaWRlSW5kZXggPSB0aGlzLmRvdHNDb3VudCAtIDE7XG4gICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLmN1ckNhcm91c2VsUG9zaXRpb24gPSAtKHRoaXMuc2xpZGVzVG9TY3JvbGwgKiB0aGlzLnNsaWRlV2lkdGgpICogdGhpcy5kb3RzQ291bnQ7XG4gICAgICAgICAgICAgICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZSh0aGlzLmNhcm91c2VsUm93Lm5hdGl2ZUVsZW1lbnQsICd0cmFuc2Zvcm0nLCBgdHJhbnNsYXRlWCgke3RoaXMuY3VyQ2Fyb3VzZWxQb3NpdGlvbn1weClgKTtcbiAgICAgICAgICAgICAgICB0aGlzLmNhcm91c2VsUm93UmVjdHMgPSB0aGlzLmNhcm91c2VsUm93Lm5hdGl2ZUVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICAgICAgICB9LCA1MDApO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIGdyYWIoZXZlbnQ6IFBvaW50ZXJFdmVudCk6IHZvaWQge1xuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuXG4gICAgICAgIHRoaXMuaXNHcmFiYmVkID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5zY3JvbGxTdGFydFggPSBldmVudC5jbGllbnRYO1xuICAgIH1cblxuICAgIHB1YmxpYyBtb3ZlKGRpcmVjdGlvbjogJ2ZvcndhcmQnIHwgJ2JhY2snKTogdm9pZCB7XG4gICAgICAgIHRoaXMuY2Fyb3VzZWxXcmFwcGVyUmVjdHMgPSB0aGlzLmNhcm91c2VsV3JhcHBlci5uYXRpdmVFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgICBjb25zdCB3aWR0aFBlbmFsdHkgPSAodGhpcy5hY3RpdmVTbGlkZUluZGV4ID09PSAwID9cbiAgICAgICAgICAgIHRoaXMuc2xpZGVXaWR0aCAqICh0aGlzLmRvdHNDb3VudCAqIHRoaXMuc2xpZGVzVG9TY3JvbGwgLSB0aGlzLnNsaWRlc0Fyci5sZW5ndGgpIDogMCk7XG5cbiAgICAgICAgaWYgKHRoaXMuaXNTY3JvbGxpbmcpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBzd2l0Y2ggKGRpcmVjdGlvbikge1xuICAgICAgICAgICAgY2FzZSAnYmFjayc6XG4gICAgICAgICAgICAgICAgdGhpcy5jdXJDYXJvdXNlbFBvc2l0aW9uICs9IHRoaXMuY2Fyb3VzZWxSb3dSZWN0cy5sZWZ0ICsgdGhpcy5zY3JvbGxTdGVwID4gdGhpcy5jYXJvdXNlbFdyYXBwZXJSZWN0cy5sZWZ0ID9cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jYXJvdXNlbFdyYXBwZXJSZWN0cy5sZWZ0IC0gdGhpcy5jYXJvdXNlbFJvd1JlY3RzLmxlZnQgOiB0aGlzLnNjcm9sbFN0ZXAgLSB3aWR0aFBlbmFsdHk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdmb3J3YXJkJzpcbiAgICAgICAgICAgICAgICB0aGlzLmN1ckNhcm91c2VsUG9zaXRpb24gKz0gdGhpcy5jYXJvdXNlbFJvd1JlY3RzLnJpZ2h0IC0gdGhpcy5zY3JvbGxTdGVwIDwgdGhpcy5jYXJvdXNlbFdyYXBwZXJSZWN0cy5yaWdodCA/XG4gICAgICAgICAgICAgICAgICAgIC0odGhpcy5jYXJvdXNlbFJvd1JlY3RzLnJpZ2h0IC0gdGhpcy5jYXJvdXNlbFdyYXBwZXJSZWN0cy5yaWdodCkgOiAtdGhpcy5zY3JvbGxTdGVwO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcHJldkluZGV4ID0gdGhpcy5hY3RpdmVTbGlkZUluZGV4O1xuICAgICAgICB0aGlzLmFjdGl2ZVNsaWRlSW5kZXggPSBNYXRoLmNlaWwoTWF0aC5hYnModGhpcy5jdXJDYXJvdXNlbFBvc2l0aW9uICsgdGhpcy5wYWdlUGVuYWx0eSkgLyAodGhpcy5zY3JvbGxTdGVwKSkgJSAodGhpcy5kb3RzQ291bnQgKyAxKTtcblxuICAgICAgICBpZiAocHJldkluZGV4ID09PSAwICYmIHRoaXMuYWN0aXZlU2xpZGVJbmRleCA9PT0gMSAmJiBkaXJlY3Rpb24gPT09ICdiYWNrJykge1xuICAgICAgICAgICAgdGhpcy5hY3RpdmVTbGlkZUluZGV4ID0gLTE7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmFuaW1hdGUodGhpcy5jdXJDYXJvdXNlbFBvc2l0aW9uKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc2VsZWN0U2xpZGUoc2xpZGVJbmRleDogbnVtYmVyKTogdm9pZCB7XG4gICAgICAgIHRoaXMuYWN0aXZlU2xpZGVJbmRleCA9IHNsaWRlSW5kZXg7XG5cbiAgICAgICAgbGV0IG5vdE11bHRpcGxlRGlmID0gMDtcbiAgICAgICAgaWYgKHNsaWRlSW5kZXggKyAxID09PSB0aGlzLmRvdHNDb3VudCkge1xuICAgICAgICAgICAgbm90TXVsdGlwbGVEaWYgPSAodGhpcy5zbGlkZXNBcnIubGVuZ3RoICUgdGhpcy5zbGlkZXNUb1Njcm9sbCkgKiB0aGlzLnNsaWRlV2lkdGg7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmN1ckNhcm91c2VsUG9zaXRpb24gPSAtKHRoaXMuYWN0aXZlU2xpZGVJbmRleCAqIHRoaXMuc2xpZGVXaWR0aCAqIHRoaXMuc2xpZGVzVG9TY3JvbGwgLSBub3RNdWx0aXBsZURpZikgLSB0aGlzLnBhZ2VQZW5hbHR5O1xuICAgICAgICB0aGlzLmFuaW1hdGUodGhpcy5jdXJDYXJvdXNlbFBvc2l0aW9uKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgdXBkYXRlUG9zaXRpb24oKTogdm9pZCB7XG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5jYXJvdXNlbFJvd1JlY3RzID0gdGhpcy5jYXJvdXNlbFJvdy5uYXRpdmVFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgICAgICAgdGhpcy5yZW5kZXJlci5yZW1vdmVTdHlsZSh0aGlzLmNhcm91c2VsUm93Lm5hdGl2ZUVsZW1lbnQsICd0cmFuc2l0aW9uJyk7XG4gICAgICAgICAgICB0aGlzLmlzU2Nyb2xsaW5nID0gZmFsc2U7XG4gICAgICAgIH0sIDUwMCk7XG4gICAgfVxuXG4gICAgcHVibGljIHNldFNsaWRlU3R5bGVzKCk6IHZvaWQge1xuICAgICAgICB0aGlzLnNsaWRlc0Fyci5mb3JFYWNoKHNsaWRlID0+IHtcbiAgICAgICAgICAgIGlmICh0aGlzLm9mZnNldCkge1xuICAgICAgICAgICAgICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUoc2xpZGUuZWwubmF0aXZlRWxlbWVudCwgJ3BhZGRpbmcnLCB0aGlzLm9mZnNldCArICdweCcpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZShzbGlkZS5lbC5uYXRpdmVFbGVtZW50LCAnd2lkdGgnLCB0aGlzLnNsaWRlV2lkdGggKyAncHgnKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHVibGljIGNoZWNrU2xpZGVzVG9TY3JvbGwoKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLnNsaWRlc1RvU2Nyb2xsID4gdGhpcy5zbGlkZXNBcnIubGVuZ3RoKSB7XG4gICAgICAgICAgICB0aGlzLnNsaWRlc1RvU2Nyb2xsID0gdGhpcy5zbGlkZXNBcnIubGVuZ3RoO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIGNyZWF0ZUNsb25lcygpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5sYXN0UGFnZUNsb25lcyA9IFsuLi50aGlzLnNsaWRlc0Fycl0uc2xpY2UoLXRoaXMuc2xpZGVzVG9TaG93KS5tYXAodGhpcy5jbG9uZU5vZGUuYmluZCh0aGlzKSkucmV2ZXJzZSgpIGFzIFNsaWRlQ29tcG9uZW50W107XG4gICAgICAgIHRoaXMuZmlyc3RQYWdlQ2xvbmVzID0gWy4uLnRoaXMuc2xpZGVzQXJyXS5zbGljZSgwLCB0aGlzLnNsaWRlc1RvU2hvdykubWFwKHRoaXMuY2xvbmVOb2RlLmJpbmQodGhpcykpO1xuICAgIH1cblxuICAgIHB1YmxpYyBjbG9uZU5vZGUobm9kZSk6IEhUTUxFbGVtZW50IHtcbiAgICAgICAgY29uc3QgY2xvbmU6IEhUTUxFbGVtZW50ID0gbm9kZS5lbC5uYXRpdmVFbGVtZW50LmNsb25lTm9kZSh0cnVlKTtcbiAgICAgICAgdGhpcy5yZW5kZXJlci5hZGRDbGFzcyhjbG9uZSwgJ3Nkay1zbGlkZS0tY2xvbmUnKTtcbiAgICAgICAgcmV0dXJuIGNsb25lO1xuICAgIH1cblxuICAgIHB1YmxpYyBpbnNlcnRDbG9uZXMoKTogdm9pZCB7XG4gICAgICAgIGZvciAoY29uc3QgY2xvbmUgb2YgdGhpcy5sYXN0UGFnZUNsb25lcykge1xuICAgICAgICAgICAgdGhpcy5yZW5kZXJlci5pbnNlcnRCZWZvcmUodGhpcy5jYXJvdXNlbFJvdy5uYXRpdmVFbGVtZW50LCBjbG9uZSwgdGhpcy5jYXJvdXNlbFJvdy5uYXRpdmVFbGVtZW50LmZpcnN0Q2hpbGQpO1xuICAgICAgICB9XG4gICAgICAgIGZvciAoY29uc3QgY2xvbmUgb2YgdGhpcy5maXJzdFBhZ2VDbG9uZXMpIHtcbiAgICAgICAgICAgIHRoaXMucmVuZGVyZXIuYXBwZW5kQ2hpbGQodGhpcy5jYXJvdXNlbFJvdy5uYXRpdmVFbGVtZW50LCBjbG9uZSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgcmVtb3ZlQ2xvbmVzKCk6IHZvaWQge1xuICAgICAgICBmb3IgKGNvbnN0IGNsb25lIG9mIHRoaXMuZmlyc3RQYWdlQ2xvbmVzKSB7XG4gICAgICAgICAgICB0aGlzLnJlbmRlcmVyLnJlbW92ZUNoaWxkKHRoaXMuY2Fyb3VzZWxSb3cubmF0aXZlRWxlbWVudCwgY2xvbmUpO1xuICAgICAgICB9XG4gICAgICAgIGZvciAoY29uc3QgY2xvbmUgb2YgdGhpcy5sYXN0UGFnZUNsb25lcykge1xuICAgICAgICAgICAgdGhpcy5yZW5kZXJlci5yZW1vdmVDaGlsZCh0aGlzLmNhcm91c2VsUm93Lm5hdGl2ZUVsZW1lbnQsIGNsb25lKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyB1cGRhdGVTbGlkZXIoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuY2Fyb3VzZWxXcmFwcGVyUmVjdHMgPSB0aGlzLmNhcm91c2VsV3JhcHBlci5uYXRpdmVFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgICB0aGlzLnNsaWRlV2lkdGggPSB0aGlzLmNhcm91c2VsV3JhcHBlci5uYXRpdmVFbGVtZW50Lm9mZnNldFdpZHRoIC8gdGhpcy5zbGlkZXNUb1Nob3c7XG4gICAgICAgIHRoaXMuc2Nyb2xsU3RlcCA9IHRoaXMuc2xpZGVzVG9TY3JvbGwgKiB0aGlzLnNsaWRlV2lkdGg7XG5cbiAgICAgICAgdGhpcy5zZXRTbGlkZVN0eWxlcygpO1xuICAgICAgICB0aGlzLmNoZWNrU2xpZGVzVG9TY3JvbGwoKTtcblxuICAgICAgICBpZiAodGhpcy5pbmZpbml0eSkge1xuICAgICAgICAgICAgdGhpcy5wYWdlUGVuYWx0eSA9IHRoaXMuc2Nyb2xsU3RlcDtcbiAgICAgICAgICAgIGlmICh0aGlzLmZpcnN0UGFnZUNsb25lcyB8fCB0aGlzLmxhc3RQYWdlQ2xvbmVzKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5yZW1vdmVDbG9uZXMoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuY3JlYXRlQ2xvbmVzKCk7XG4gICAgICAgICAgICB0aGlzLmluc2VydENsb25lcygpO1xuXG4gICAgICAgICAgICB0aGlzLmN1ckNhcm91c2VsUG9zaXRpb24gPSAtKHRoaXMuc2xpZGVzVG9TY3JvbGwgKiB0aGlzLnNsaWRlV2lkdGgpO1xuICAgICAgICAgICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZSh0aGlzLmNhcm91c2VsUm93Lm5hdGl2ZUVsZW1lbnQsICd0cmFuc2Zvcm0nLCBgdHJhbnNsYXRlWCgke3RoaXMuY3VyQ2Fyb3VzZWxQb3NpdGlvbn1weClgKTtcbiAgICAgICAgICAgIHRoaXMudXBkYXRlUG9zaXRpb24oKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmNhcm91c2VsUm93UmVjdHMgPSB0aGlzLmNhcm91c2VsUm93Lm5hdGl2ZUVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgfVxuXG4gICAgcHVibGljIG5nT25Jbml0KCk6IHZvaWQge1xuICAgICAgICB0aGlzLnN1YiA9IGZyb21FdmVudCh0aGlzLmNhcm91c2VsUm93Lm5hdGl2ZUVsZW1lbnQsICdwb2ludGVyZG93bicpLnN1YnNjcmliZShwb2ludGVyRXZlbnQgPT4ge1xuICAgICAgICAgICAgdGhpcy5ncmFiKHBvaW50ZXJFdmVudCBhcyBQb2ludGVyRXZlbnQpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgbmdBZnRlckNvbnRlbnRJbml0KCk6IHZvaWQge1xuICAgICAgICB0aGlzLnNsaWRlV2lkdGggPSB0aGlzLmNhcm91c2VsV3JhcHBlci5uYXRpdmVFbGVtZW50Lm9mZnNldFdpZHRoIC8gdGhpcy5zbGlkZXNUb1Nob3c7XG4gICAgICAgIHRoaXMuc2xpZGVzQXJyID0gdGhpcy5jYXJvdXNlbFNsaWRlcy50b0FycmF5KCk7XG4gICAgfVxuXG4gICAgcHVibGljIG5nQWZ0ZXJWaWV3SW5pdCgpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgcG9pbnRlckVudGVyJCA9IGZyb21FdmVudCh0aGlzLmVsLm5hdGl2ZUVsZW1lbnQsICdwb2ludGVyZW50ZXInKS5waXBlKGZpbHRlcigoKSA9PiB0aGlzLnBhdXNlQnlIb3ZlcikpO1xuICAgICAgICBjb25zdCBwb2ludGVyTGVhdmUkID0gZnJvbUV2ZW50KHRoaXMuZWwubmF0aXZlRWxlbWVudCwgJ3BvaW50ZXJsZWF2ZScpO1xuICAgICAgICBjb25zdCBwb2ludGVyTGVhdmUgPSBwb2ludGVyTGVhdmUkLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnBvaW50ZXJVcEhhbmRsZXIoKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5pc1ZpZXdJbml0ID0gdHJ1ZTtcbiAgICAgICAgdGhpcy51cGRhdGVTbGlkZXIoKTtcbiAgICAgICAgdGhpcy5zdWIuYWRkKHBvaW50ZXJMZWF2ZSk7XG5cbiAgICAgICAgaWYgKHRoaXMudGltZW91dCkge1xuICAgICAgICAgICAgY29uc3Qgc2xpZGVUaW1lb3V0ID0gaW50ZXJ2YWwodGhpcy50aW1lb3V0KVxuICAgICAgICAgICAgICAgIC5waXBlKFxuICAgICAgICAgICAgICAgICAgICB0YWtlVW50aWwocG9pbnRlckVudGVyJCksXG4gICAgICAgICAgICAgICAgICAgIHJlcGVhdFdoZW4oKCkgPT4gcG9pbnRlckxlYXZlJClcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubW92ZSgnZm9yd2FyZCcpO1xuICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICB0aGlzLnN1Yi5hZGQoc2xpZGVUaW1lb3V0KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIG5nT25DaGFuZ2VzKGNoYW5nZXMpOiB2b2lkIHtcbiAgICAvLyAgICAgaWYgKHRoaXMuaXNWaWV3SW5pdCkge1xuICAgIC8vICAgICAgICAgaWYgKGNoYW5nZXMuc2xpZGVzVG9TY3JvbGwgfHwgY2hhbmdlcy5zbGlkZXNUb1Nob3cpIHtcbiAgICAvLyAgICAgICAgICAgICB0aGlzLnVwZGF0ZVNsaWRlcigpO1xuICAgIC8vICAgICAgICAgfVxuICAgIC8vICAgICB9XG4gICAgLy8gfVxuXG4gICAgcHVibGljIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgICAgICB0aGlzLnN1Yj8udW5zdWJzY3JpYmUoKTtcbiAgICB9XG59XG4iLCI8ZGl2IGNsYXNzPVwic2RrLWNhcm91c2VsXCI+XG4gICAgPGRpdiBjbGFzcz1cInNkay1jYXJvdXNlbF9fd3JhcHBlclwiICNjYXJvdXNlbFdyYXBwZXI+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJhcnJvd3NcIj5cbiAgICAgICAgICAgIDxidXR0b24gc2RrLXJvdW5kLWJ1dHRvbiBjbGFzcz1cInNkay1jYXJvdXNlbF9fYXJyb3cgc2RrLWNhcm91c2VsX19hcnJvdy0tbGVmdFwiIGNvbG9yPVwiYmFzaWNcIlxuICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwibW92ZSgnYmFjaycpXCI+XG4gICAgICAgICAgICAgICAgPHNkay1pY29uIGljb249XCJjaGV2cm9uX2xlZnRcIiBbc2l6ZV09XCIyNFwiPjwvc2RrLWljb24+XG4gICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgIDxidXR0b24gc2RrLXJvdW5kLWJ1dHRvbiBjbGFzcz1cInNkay1jYXJvdXNlbF9fYXJyb3cgc2RrLWNhcm91c2VsX19hcnJvdy0tcmlnaHRcIiBjb2xvcj1cImJhc2ljXCJcbiAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIm1vdmUoJ2ZvcndhcmQnKVwiPlxuICAgICAgICAgICAgICAgIDxzZGstaWNvbiBpY29uPVwiY2hldnJvbl9yaWdodFwiIFtzaXplXT1cIjI0XCI+PC9zZGstaWNvbj5cbiAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPGRpdiBjbGFzcz1cInNkay1jYXJvdXNlbF9fcm93XCIgI2Nhcm91c2VsUm93IGRyYWdnYWJsZT1cImZhbHNlXCI+XG4gICAgICAgICAgICA8bmctY29udGVudCBzZWxlY3Q9XCJzZGstc2xpZGVcIj48L25nLWNvbnRlbnQ+XG4gICAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICAgIDxkaXYgY2xhc3M9XCJzZGstY2Fyb3VzZWxfX2RvdHNcIiAqbmdJZj1cImRvdHNcIiBbc3R5bGUuYm90dG9tLnB4XT1cIi1vZmZzZXRcIj5cbiAgICAgICAgPHNkay1kb3RzIFthY3RpdmVJbmRleF09XCJhY3RpdmVTbGlkZUluZGV4XCIgW2NvdW50XT1cImRvdHNDb3VudFwiIChzZWxlY3RlZCk9XCJzZWxlY3RTbGlkZSgkZXZlbnQpXCI+PC9zZGstZG90cz5cbiAgICA8L2Rpdj5cbjwvZGl2PlxuIl19