UNPKG

@spartacus/storefront

Version:

Spartacus Storefront is a package that you can include in your application, which allows you to add default storefront features.

139 lines 22.4 kB
import { ChangeDetectionStrategy, Component, HostBinding, HostListener, TemplateRef, } from '@angular/core'; import { NavigationStart } from '@angular/router'; import { filter } from 'rxjs/operators'; import { PopoverEvent } from './popover.model'; import { ICON_TYPE } from '../../../cms-components/misc/icon/icon.model'; import * as i0 from "@angular/core"; import * as i1 from "../../services/positioning/positioning.service"; import * as i2 from "@spartacus/core"; import * as i3 from "@angular/router"; import * as i4 from "../../../cms-components/misc/icon/icon.component"; import * as i5 from "../../../layout/a11y/keyboard-focus/focus.directive"; import * as i6 from "@angular/common"; export class PopoverComponent { constructor(positioningService, winRef, changeDetectionRef, renderer, router) { this.positioningService = positioningService; this.winRef = winRef; this.changeDetectionRef = changeDetectionRef; this.renderer = renderer; this.router = router; /** * Icon types for close button icon. */ this.iconTypes = ICON_TYPE; } /** * Listens for click inside popover component wrapper. */ insideClick() { this.eventSubject.next(PopoverEvent.INSIDE_CLICK); } /** * Listens for every document click and ignores clicks * inside component. */ outsideClick(event) { if (!this.isClickedOnPopover(event) && !this.isClickedOnDirective(event)) { this.eventSubject.next(PopoverEvent.OUTSIDE_CLICK); } } /** * Listens for `escape` keydown event. */ escapeKeydown() { this.eventSubject.next(PopoverEvent.ESCAPE_KEYDOWN); } isClickedOnPopover(event) { return this.popoverInstance.location.nativeElement.contains(event.target); } isClickedOnDirective(event) { return this.triggerElement.nativeElement.contains(event.target); } /** * Emits close event trigger. */ close(event) { event.preventDefault(); if (event instanceof MouseEvent) { this.eventSubject.next(PopoverEvent.CLOSE_BUTTON_CLICK); } else { this.eventSubject.next(PopoverEvent.CLOSE_BUTTON_KEYDOWN); } } /** * Method uses `Renderer2` service to listen window scroll event. * * Registered only if property `positionOnScroll` is set to `true`. */ triggerScrollEvent() { this.scrollEventUnlistener = this.renderer.listen(this.winRef.nativeWindow, 'scroll', () => this.positionPopover()); } /** * Method uses positioning service calculation and based on that * updates class name for popover component instance. */ positionPopover() { this.popoverClass = this.positioningService.positionElements(this.triggerElement.nativeElement, this.popoverInstance.location.nativeElement, this.positioningService.getPositioningClass(this.position, this.autoPositioning), this.appendToBody); this.changeDetectionRef.markForCheck(); this.baseClass = `${this.customClass} ${this.popoverClass} opened`; } ngOnInit() { this.isTemplate = this.content instanceof TemplateRef; if (!this.customClass) this.customClass = 'cx-popover'; if (!this.position) this.position = 'top'; if (this.autoPositioning === undefined) this.autoPositioning = true; this.baseClass = `${this.customClass}`; this.resizeSub = this.winRef.resize$.subscribe(() => { this.positionPopover(); }); this.routeChangeSub = this.router.events .pipe(filter((event) => event instanceof NavigationStart)) .subscribe(() => { this.eventSubject.next(PopoverEvent.ROUTE_CHANGE); }); if (this.positionOnScroll) { this.triggerScrollEvent(); } } ngAfterViewChecked() { this.positionPopover(); } ngOnDestroy() { if (this.resizeSub) { this.resizeSub.unsubscribe(); } if (this.routeChangeSub) { this.routeChangeSub.unsubscribe(); } if (this.scrollEventUnlistener) { this.scrollEventUnlistener(); } } } PopoverComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.0.5", ngImport: i0, type: PopoverComponent, deps: [{ token: i1.PositioningService }, { token: i2.WindowRef }, { token: i0.ChangeDetectorRef }, { token: i0.Renderer2 }, { token: i3.Router }], target: i0.ɵɵFactoryTarget.Component }); PopoverComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.0.5", type: PopoverComponent, selector: "cx-popover", host: { listeners: { "click": "insideClick()", "document:click": "outsideClick($event)", "keydown.escape": "escapeKeydown()" }, properties: { "className": "this.baseClass" } }, ngImport: i0, template: "<div class=\"arrow\"></div>\n<div class=\"popover-body\" [cxFocus]=\"focusConfig\">\n <div class=\"cx-close-row\">\n <button\n *ngIf=\"displayCloseButton\"\n type=\"button\"\n class=\"close\"\n (keydown.enter)=\"close($event)\"\n (keydown.space)=\"close($event)\"\n (click)=\"close($event)\"\n >\n <cx-icon [type]=\"iconTypes.CLOSE\"></cx-icon>\n </button>\n </div>\n <ng-container *ngIf=\"isTemplate\">\n <ng-container *ngTemplateOutlet=\"content\"></ng-container>\n </ng-container>\n <span *ngIf=\"!isTemplate\">{{ content }}</span>\n</div>\n", components: [{ type: i4.IconComponent, selector: "cx-icon,[cxIcon]", inputs: ["cxIcon", "type"] }], directives: [{ type: i5.FocusDirective, selector: "[cxFocus]", inputs: ["cxFocus"] }, { type: i6.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i6.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.0.5", ngImport: i0, type: PopoverComponent, decorators: [{ type: Component, args: [{ selector: 'cx-popover', templateUrl: './popover.component.html', changeDetection: ChangeDetectionStrategy.OnPush, }] }], ctorParameters: function () { return [{ type: i1.PositioningService }, { type: i2.WindowRef }, { type: i0.ChangeDetectorRef }, { type: i0.Renderer2 }, { type: i3.Router }]; }, propDecorators: { baseClass: [{ type: HostBinding, args: ['className'] }], insideClick: [{ type: HostListener, args: ['click'] }], outsideClick: [{ type: HostListener, args: ['document:click', ['$event']] }], escapeKeydown: [{ type: HostListener, args: ['keydown.escape'] }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicG9wb3Zlci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9zdG9yZWZyb250bGliL3NoYXJlZC9jb21wb25lbnRzL3BvcG92ZXIvcG9wb3Zlci5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9zdG9yZWZyb250bGliL3NoYXJlZC9jb21wb25lbnRzL3BvcG92ZXIvcG9wb3Zlci5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBRUwsdUJBQXVCLEVBRXZCLFNBQVMsRUFHVCxXQUFXLEVBQ1gsWUFBWSxFQUlaLFdBQVcsR0FDWixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsZUFBZSxFQUFVLE1BQU0saUJBQWlCLENBQUM7QUFDMUQsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBR3hDLE9BQU8sRUFBRSxZQUFZLEVBQW1CLE1BQU0saUJBQWlCLENBQUM7QUFHaEUsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLDhDQUE4QyxDQUFDOzs7Ozs7OztBQU96RSxNQUFNLE9BQU8sZ0JBQWdCO0lBb08zQixZQUNZLGtCQUFzQyxFQUN0QyxNQUFpQixFQUNqQixrQkFBcUMsRUFDckMsUUFBbUIsRUFDbkIsTUFBYztRQUpkLHVCQUFrQixHQUFsQixrQkFBa0IsQ0FBb0I7UUFDdEMsV0FBTSxHQUFOLE1BQU0sQ0FBVztRQUNqQix1QkFBa0IsR0FBbEIsa0JBQWtCLENBQW1CO1FBQ3JDLGFBQVEsR0FBUixRQUFRLENBQVc7UUFDbkIsV0FBTSxHQUFOLE1BQU0sQ0FBUTtRQWxKMUI7O1dBRUc7UUFDSCxjQUFTLEdBQUcsU0FBUyxDQUFDO0lBZ0puQixDQUFDO0lBL0hKOztPQUVHO0lBRUgsV0FBVztRQUNULElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxZQUFZLENBQUMsQ0FB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QVEsQ0FBQztnQkFXMUMsYUFBYTtzQkFEWixZQUFZO3VCQUFDLGdCQUFnQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIEFmdGVyVmlld0NoZWNrZWQsXG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICBDaGFuZ2VEZXRlY3RvclJlZixcbiAgQ29tcG9uZW50LFxuICBDb21wb25lbnRSZWYsXG4gIEVsZW1lbnRSZWYsXG4gIEhvc3RCaW5kaW5nLFxuICBIb3N0TGlzdGVuZXIsXG4gIE9uRGVzdHJveSxcbiAgT25Jbml0LFxuICBSZW5kZXJlcjIsXG4gIFRlbXBsYXRlUmVmLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IE5hdmlnYXRpb25TdGFydCwgUm91dGVyIH0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcbmltcG9ydCB7IGZpbHRlciB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7IFN1YmplY3QsIFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgV2luZG93UmVmIH0gZnJvbSAnQHNwYXJ0YWN1cy9jb3JlJztcbmltcG9ydCB7IFBvcG92ZXJFdmVudCwgUG9wb3ZlclBvc2l0aW9uIH0gZnJvbSAnLi9wb3BvdmVyLm1vZGVsJztcbmltcG9ydCB7IFBvc2l0aW9uaW5nU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL3Bvc2l0aW9uaW5nL3Bvc2l0aW9uaW5nLnNlcnZpY2UnO1xuaW1wb3J0IHsgRm9jdXNDb25maWcgfSBmcm9tICcuLi8uLi8uLi9sYXlvdXQvYTExeS9rZXlib2FyZC1mb2N1cy9rZXlib2FyZC1mb2N1cy5tb2RlbCc7XG5pbXBvcnQgeyBJQ09OX1RZUEUgfSBmcm9tICcuLi8uLi8uLi9jbXMtY29tcG9uZW50cy9taXNjL2ljb24vaWNvbi5tb2RlbCc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2N4LXBvcG92ZXInLFxuICB0ZW1wbGF0ZVVybDogJy4vcG9wb3Zlci5jb21wb25lbnQuaHRtbCcsXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxufSlcbmV4cG9ydCBjbGFzcyBQb3BvdmVyQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3ksIEFmdGVyVmlld0NoZWNrZWQge1xuICAvKipcbiAgICogU3RyaW5nIG9yIHRlbXBsYXRlIHRvIGJlIHJlbmRlcmVkIGluc2lkZSBwb3BvdmVyIHdyYXBwZXIgY29tcG9uZW50LlxuICAgKi9cbiAgY29udGVudDogc3RyaW5nIHwgVGVtcGxhdGVSZWY8YW55PjtcblxuICAvKipcbiAgICogRWxlbWVudCB3aGljaCB0cmlnZ2VycyBkaXNwbGF5aW5nIHBvcG92ZXIgY29tcG9uZW50LlxuICAgKiBUaGlzIHByb3BlcnR5IGlzIG5lZWRlZCB0byBjYWxjdWxhdGUgdmFsaWQgcG9zaXRpb24gZm9yIHBvcG92ZXIuXG4gICAqL1xuICB0cmlnZ2VyRWxlbWVudDogRWxlbWVudFJlZjtcblxuICAvKipcbiAgICogQ3VycmVudCBpbml0aWF0ZWQgcG9wb3ZlciBpbnN0YW5jZS5cbiAgICovXG4gIHBvcG92ZXJJbnN0YW5jZTogQ29tcG9uZW50UmVmPFBvcG92ZXJDb21wb25lbnQ+O1xuXG4gIC8qKlxuICAgKiBGbGFnIHdoaWNoIGluZm9ybXMgcG9zaXRpb25pbmcgc2VydmljZSBpZiBwb3BvdmVyIGNvbXBvbmVudFxuICAgKiBzaG91bGQgYmUgYXBwZW5kZWQgdG8gYm9keS4gT3RoZXJ3aXNlIHBvcG92ZXIgaXMgZGlzcGxheWVkIHJpZ2h0IGFmdGVyXG4gICAqIHRyaWdnZXIgZWxlbWVudCBpbiBET00uXG4gICAqL1xuICBhcHBlbmRUb0JvZHk/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBUaGUgcHJlZmVycmVkIHBsYWNlbWVudCBvZiB0aGUgcG9wb3Zlci4gRGVmYXVsdCBwb3BvdmVyIHBvc2l0aW9uIGlzICd0b3AnLlxuICAgKlxuICAgKiBBbGxvd2VkIHBvcG92ZXIgcG9zaXRpb25zOiAnYXV0bycsICd0b3AnLCAnYm90dG9tJywgJ2xlZnQnLCAncmlnaHQnLFxuICAgKiAndG9wLWxlZnQnLCAndG9wLXJpZ2h0JywgJ2JvdHRvbS1sZWZ0JywgJ2JvdHRvbS1yaWdodCcsXG4gICAqICdsZWZ0LXRvcCcsICdsZWZ0LWJvdHRvbScsICdyaWdodC10b3AnLCAncmlnaHQtYm90dG9tJy5cbiAgICovXG4gIHBvc2l0aW9uPzogUG9wb3ZlclBvc2l0aW9uO1xuXG4gIC8qKlxuICAgKiBGbGFnIHVzZWQgdG8gZGVmaW5lIGlmIHBvcG92ZXIgc2hvdWxkIGxvb2sgZm9yIHRoZSBiZXN0IHBsYWNlbWVudFxuICAgKiBpbiBjYXNlIGlmIHRoZXJlIGlzIG5vdCBlbm91Z2ggc3BhY2UgaW4gdmlld3BvcnQgZm9yIHByZWZlcnJlZCBwb3NpdGlvbi5cbiAgICpcbiAgICogQnkgZGVmYXVsdCB0aGlzIHByb3BlcnR5IGlzIHNldCB0byBgdHJ1ZWAuXG4gICAqXG4gICAqIFZhbHVlIG9mIHRoaXMgZmxhZyBpcyBvbWl0dGVkIGlmIHByZWZlcnJlZCBwb3NpdGlvbiBpcyBzZXQgdG8gYGF1dG9gLlxuICAgKi9cbiAgYXV0b1Bvc2l0aW9uaW5nPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogQ3VzdG9tIGNsYXNzIG5hbWUgcGFzc2VkIHRvIHBvcG92ZXIgY29tcG9uZW50LlxuICAgKlxuICAgKiBJZiB0aGlzIHByb3BlcnR5IGlzIG5vdCBzZXQgdGhlIGRlZmF1bHQgcG9wb3ZlciBjbGFzcyBpcyBgY3gtcG9wb3ZlcmAuXG4gICAqL1xuICBjdXN0b21DbGFzcz86IHN0cmluZztcblxuICAvKipcbiAgICogRmxhZyB1c2VkIHRvIHNob3cvaGlkZSBjbG9zZSBidXR0b24gaW4gcG9wb3ZlciBjb21wb25lbnQuXG4gICAqL1xuICBkaXNwbGF5Q2xvc2VCdXR0b24/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBGbGFnIHdoaWNoIGluZGljYXRlcyBpZiBwYXNzZWQgY29udGVudCBpcyBhIFRlbXBsYXRlUmVmIG9yIHN0cmluZy5cbiAgICovXG4gIGlzVGVtcGxhdGU6IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEFmdGVyIHBvcG92ZXIgY29tcG9uZW50IGlzIGluaXRpYWxpemVkIHBvc2l0aW9uIG5lZWRzIHRvIGJlIGNoYW5naW5nIGR5bmFtaWNhbGx5XG4gICAqIGluIGNhc2UgaWYgYW55IHZpZXdwb3J0IGNoYW5nZXMgaGFwcGVuZWQuXG4gICAqL1xuICByZXNpemVTdWI6IFN1YnNjcmlwdGlvbjtcblxuICAvKipcbiAgICogQWZ0ZXIgcG9wb3ZlciBjb21wb25lbnQgaXMgaW5pdGlhbGl6ZWQgcG9wb3ZlciBzaG91bGQgYmUgY2xvc2VkIGluIGNhc2VcbiAgICogaWYgY3VycmVudCByb3V0ZSBoYXMgYmVlbiBjaGFuZ2VkLlxuICAgKi9cbiAgcm91dGVDaGFuZ2VTdWI6IFN1YnNjcmlwdGlvbjtcblxuICAvKipcbiAgICogQ2xhc3MgbmFtZSBnZW5lcmF0ZWQgYnkgcG9zaXRpb25pbmcgc2VydmljZSBpbmRpY2F0aW5nIHBvc2l0aW9uIG9mIHBvcG92ZXIuXG4gICAqL1xuICBwb3BvdmVyQ2xhc3M6IFBvcG92ZXJQb3NpdGlvbjtcblxuICAvKipcbiAgICogQ29uZmlndXJhdGlvbiBmb3IgYTExeSBpbXByb3ZlbWVudHMuXG4gICAqL1xuICBmb2N1c0NvbmZpZzogRm9jdXNDb25maWc7XG5cbiAgLyoqXG4gICAqIEZsYWcgaW5kaWNhdGVzIGlmIHBvcG92ZXIgc2hvdWxkIGJlIHJlLXBvc2l0aW9uZWQgb24gc2Nyb2xsIGV2ZW50LlxuICAgKi9cbiAgcG9zaXRpb25PblNjcm9sbD86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEljb24gdHlwZXMgZm9yIGNsb3NlIGJ1dHRvbiBpY29uLlxuICAgKi9cbiAgaWNvblR5cGVzID0gSUNPTl9UWVBFO1xuXG4gIC8qKlxuICAgKiBTdWJqZWN0IHdoaWNoIGVtaXRzIHNwZWNpZmljIHR5cGUgb2YgYFBvcG92ZXJFdmVudGAuXG4gICAqL1xuICBldmVudFN1YmplY3Q6IFN1YmplY3Q8UG9wb3ZlckV2ZW50PjtcblxuICAvKipcbiAgICogU2Nyb2xsIGV2ZW50IHVubGlzdGVuZXIuXG4gICAqL1xuICBzY3JvbGxFdmVudFVubGlzdGVuZXI6ICgpID0+IHZvaWQ7XG5cbiAgLyoqXG4gICAqIEJpbmRpbmcgY2xhc3MgbmFtZSBwcm9wZXJ0eS5cbiAgICovXG4gIEBIb3N0QmluZGluZygnY2xhc3NOYW1lJykgYmFzZUNsYXNzOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIExpc3RlbnMgZm9yIGNsaWNrIGluc2lkZSBwb3BvdmVyIGNvbXBvbmVudCB3cmFwcGVyLlxuICAgKi9cbiAgQEhvc3RMaXN0ZW5lcignY2xpY2snKVxuICBpbnNpZGVDbGljaygpIHtcbiAgICB0aGlzLmV2ZW50U3ViamVjdC5uZXh0KFBvcG92ZXJFdmVudC5JTlNJREVfQ0xJQ0spO1xuICB9XG5cbiAgLyoqXG4gICAqIExpc3RlbnMgZm9yIGV2ZXJ5IGRvY3VtZW50IGNsaWNrIGFuZCBpZ25vcmVzIGNsaWNrc1xuICAgKiBpbnNpZGUgY29tcG9uZW50LlxuICAgKi9cbiAgQEhvc3RMaXN0ZW5lcignZG9jdW1lbnQ6Y2xpY2snLCBbJyRldmVudCddKVxuICBvdXRzaWRlQ2xpY2soZXZlbnQ6IE1vdXNlRXZlbnQpIHtcbiAgICBpZiAoIXRoaXMuaXNDbGlja2VkT25Qb3BvdmVyKGV2ZW50KSAmJiAhdGhpcy5pc0NsaWNrZWRPbkRpcmVjdGl2ZShldmVudCkpIHtcbiAgICAgIHRoaXMuZXZlbnRTdWJqZWN0Lm5leHQoUG9wb3ZlckV2ZW50Lk9VVFNJREVfQ0xJQ0spO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBMaXN0ZW5zIGZvciBgZXNjYXBlYCBrZXlkb3duIGV2ZW50LlxuICAgKi9cbiAgQEhvc3RMaXN0ZW5lcigna2V5ZG93bi5lc2NhcGUnKVxuICBlc2NhcGVLZXlkb3duKCkge1xuICAgIHRoaXMuZXZlbnRTdWJqZWN0Lm5leHQoUG9wb3ZlckV2ZW50LkVTQ0FQRV9LRVlET1dOKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBpc0NsaWNrZWRPblBvcG92ZXIoZXZlbnQpIHtcbiAgICByZXR1cm4gdGhpcy5wb3BvdmVySW5zdGFuY2UubG9jYXRpb24ubmF0aXZlRWxlbWVudC5jb250YWlucyhldmVudC50YXJnZXQpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGlzQ2xpY2tlZE9uRGlyZWN0aXZlKGV2ZW50KSB7XG4gICAgcmV0dXJuIHRoaXMudHJpZ2dlckVsZW1lbnQubmF0aXZlRWxlbWVudC5jb250YWlucyhldmVudC50YXJnZXQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEVtaXRzIGNsb3NlIGV2ZW50IHRyaWdnZXIuXG4gICAqL1xuICBjbG9zZShldmVudDogTW91c2VFdmVudCB8IEtleWJvYXJkRXZlbnQpIHtcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIGlmIChldmVudCBpbnN0YW5jZW9mIE1vdXNlRXZlbnQpIHtcbiAgICAgIHRoaXMuZXZlbnRTdWJqZWN0Lm5leHQoUG9wb3ZlckV2ZW50LkNMT1NFX0JVVFRPTl9DTElDSyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuZXZlbnRTdWJqZWN0Lm5leHQoUG9wb3ZlckV2ZW50LkNMT1NFX0JVVFRPTl9LRVlET1dOKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogTWV0aG9kIHVzZXMgYFJlbmRlcmVyMmAgc2VydmljZSB0byBsaXN0ZW4gd2luZG93IHNjcm9sbCBldmVudC5cbiAgICpcbiAgICogUmVnaXN0ZXJlZCBvbmx5IGlmIHByb3BlcnR5IGBwb3NpdGlvbk9uU2Nyb2xsYCBpcyBzZXQgdG8gYHRydWVgLlxuICAgKi9cbiAgdHJpZ2dlclNjcm9sbEV2ZW50KCkge1xuICAgIHRoaXMuc2Nyb2xsRXZlbnRVbmxpc3RlbmVyID0gdGhpcy5yZW5kZXJlci5saXN0ZW4oXG4gICAgICB0aGlzLndpblJlZi5uYXRpdmVXaW5kb3csXG4gICAgICAnc2Nyb2xsJyxcbiAgICAgICgpID0+IHRoaXMucG9zaXRpb25Qb3BvdmVyKClcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIE1ldGhvZCB1c2VzIHBvc2l0aW9uaW5nIHNlcnZpY2UgY2FsY3VsYXRpb24gYW5kIGJhc2VkIG9uIHRoYXRcbiAgICogdXBkYXRlcyBjbGFzcyBuYW1lIGZvciBwb3BvdmVyIGNvbXBvbmVudCBpbnN0YW5jZS5cbiAgICovXG4gIHBvc2l0aW9uUG9wb3ZlcigpIHtcbiAgICB0aGlzLnBvcG92ZXJDbGFzcyA9IHRoaXMucG9zaXRpb25pbmdTZXJ2aWNlLnBvc2l0aW9uRWxlbWVudHMoXG4gICAgICB0aGlzLnRyaWdnZXJFbGVtZW50Lm5hdGl2ZUVsZW1lbnQsXG4gICAgICB0aGlzLnBvcG92ZXJJbnN0YW5jZS5sb2NhdGlvbi5uYXRpdmVFbGVtZW50LFxuICAgICAgdGhpcy5wb3NpdGlvbmluZ1NlcnZpY2UuZ2V0UG9zaXRpb25pbmdDbGFzcyhcbiAgICAgICAgdGhpcy5wb3NpdGlvbixcbiAgICAgICAgdGhpcy5hdXRvUG9zaXRpb25pbmdcbiAgICAgICksXG4gICAgICB0aGlzLmFwcGVuZFRvQm9keVxuICAgICk7XG5cbiAgICB0aGlzLmNoYW5nZURldGVjdGlvblJlZi5tYXJrRm9yQ2hlY2soKTtcbiAgICB0aGlzLmJhc2VDbGFzcyA9IGAke3RoaXMuY3VzdG9tQ2xhc3N9ICR7dGhpcy5wb3BvdmVyQ2xhc3N9IG9wZW5lZGA7XG4gIH1cblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLmlzVGVtcGxhdGUgPSB0aGlzLmNvbnRlbnQgaW5zdGFuY2VvZiBUZW1wbGF0ZVJlZjtcblxuICAgIGlmICghdGhpcy5jdXN0b21DbGFzcykgdGhpcy5jdXN0b21DbGFzcyA9ICdjeC1wb3BvdmVyJztcbiAgICBpZiAoIXRoaXMucG9zaXRpb24pIHRoaXMucG9zaXRpb24gPSAndG9wJztcbiAgICBpZiAodGhpcy5hdXRvUG9zaXRpb25pbmcgPT09IHVuZGVmaW5lZCkgdGhpcy5hdXRvUG9zaXRpb25pbmcgPSB0cnVlO1xuXG4gICAgdGhpcy5iYXNlQ2xhc3MgPSBgJHt0aGlzLmN1c3RvbUNsYXNzfWA7XG5cbiAgICB0aGlzLnJlc2l6ZVN1YiA9IHRoaXMud2luUmVmLnJlc2l6ZSQuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgIHRoaXMucG9zaXRpb25Qb3BvdmVyKCk7XG4gICAgfSk7XG5cbiAgICB0aGlzLnJvdXRlQ2hhbmdlU3ViID0gdGhpcy5yb3V0ZXIuZXZlbnRzXG4gICAgICAucGlwZShmaWx0ZXIoKGV2ZW50KSA9PiBldmVudCBpbnN0YW5jZW9mIE5hdmlnYXRpb25TdGFydCkpXG4gICAgICAuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgdGhpcy5ldmVudFN1YmplY3QubmV4dChQb3BvdmVyRXZlbnQuUk9VVEVfQ0hBTkdFKTtcbiAgICAgIH0pO1xuXG4gICAgaWYgKHRoaXMucG9zaXRpb25PblNjcm9sbCkge1xuICAgICAgdGhpcy50cmlnZ2VyU2Nyb2xsRXZlbnQoKTtcbiAgICB9XG4gIH1cblxuICBuZ0FmdGVyVmlld0NoZWNrZWQoKTogdm9pZCB7XG4gICAgdGhpcy5wb3NpdGlvblBvcG92ZXIoKTtcbiAgfVxuXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIGlmICh0aGlzLnJlc2l6ZVN1Yikge1xuICAgICAgdGhpcy5yZXNpemVTdWIudW5zdWJzY3JpYmUoKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5yb3V0ZUNoYW5nZVN1Yikge1xuICAgICAgdGhpcy5yb3V0ZUNoYW5nZVN1Yi51bnN1YnNjcmliZSgpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnNjcm9sbEV2ZW50VW5saXN0ZW5lcikge1xuICAgICAgdGhpcy5zY3JvbGxFdmVudFVubGlzdGVuZXIoKTtcbiAgICB9XG4gIH1cblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcm90ZWN0ZWQgcG9zaXRpb25pbmdTZXJ2aWNlOiBQb3NpdGlvbmluZ1NlcnZpY2UsXG4gICAgcHJvdGVjdGVkIHdpblJlZjogV2luZG93UmVmLFxuICAgIHByb3RlY3RlZCBjaGFuZ2VEZXRlY3Rpb25SZWY6IENoYW5nZURldGVjdG9yUmVmLFxuICAgIHByb3RlY3RlZCByZW5kZXJlcjogUmVuZGVyZXIyLFxuICAgIHByb3RlY3RlZCByb3V0ZXI6IFJvdXRlclxuICApIHt9XG59XG4iLCI8ZGl2IGNsYXNzPVwiYXJyb3dcIj48L2Rpdj5cbjxkaXYgY2xhc3M9XCJwb3BvdmVyLWJvZHlcIiBbY3hGb2N1c109XCJmb2N1c0NvbmZpZ1wiPlxuICA8ZGl2IGNsYXNzPVwiY3gtY2xvc2Utcm93XCI+XG4gICAgPGJ1dHRvblxuICAgICAgKm5nSWY9XCJkaXNwbGF5Q2xvc2VCdXR0b25cIlxuICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICBjbGFzcz1cImNsb3NlXCJcbiAgICAgIChrZXlkb3duLmVudGVyKT1cImNsb3NlKCRldmVudClcIlxuICAgICAgKGtleWRvd24uc3BhY2UpPVwiY2xvc2UoJGV2ZW50KVwiXG4gICAgICAoY2xpY2spPVwiY2xvc2UoJGV2ZW50KVwiXG4gICAgPlxuICAgICAgPGN4LWljb24gW3R5cGVdPVwiaWNvblR5cGVzLkNMT1NFXCI+PC9jeC1pY29uPlxuICAgIDwvYnV0dG9uPlxuICA8L2Rpdj5cbiAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImlzVGVtcGxhdGVcIj5cbiAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiY29udGVudFwiPjwvbmctY29udGFpbmVyPlxuICA8L25nLWNvbnRhaW5lcj5cbiAgPHNwYW4gKm5nSWY9XCIhaXNUZW1wbGF0ZVwiPnt7IGNvbnRlbnQgfX08L3NwYW4+XG48L2Rpdj5cbiJdfQ==