UNPKG

@bimeister/pupakit.kit

Version:

PupaKit is an open source collection of Angular components based on an atomic approach to building interfaces, which guarantees better performance and greater development flexibility.

120 lines 18.4 kB
import { DOCUMENT } from '@angular/common'; import { Directive, ElementRef, HostBinding, Inject, Input, NgZone, Optional, } from '@angular/core'; import '@bimeister/utilities'; import { BehaviorSubject, fromEvent, merge, Subscription } from 'rxjs'; import { switchMap, take } from 'rxjs/operators'; import '../../../declarations/classes/opened-dropdown.class'; import '../../../declarations/interfaces/dropdown-directive-params.interface'; import '../../../declarations/interfaces/dropdown-host.interface'; import '../components/dropdown-template/dropdown-template.component'; import { subscribeInsideAngular, subscribeOutsideAngular, ThemeService } from '@bimeister/pupakit.common'; import { DropdownsService } from '../../../services/dropdowns.service'; import { ThemeWrapperService } from '../../theme-wrapper/services/theme-wrapper.service'; import * as i0 from "@angular/core"; import * as i1 from "../../../services/dropdowns.service"; import * as i2 from "@bimeister/pupakit.common"; import * as i3 from "../../theme-wrapper/services/theme-wrapper.service"; const CURSOR_POINTER = 'pointer'; export class DropdownDirective { constructor(triggerRef, dropdownsService, ngZone, themeService, document, themeWrapperService) { this.triggerRef = triggerRef; this.dropdownsService = dropdownsService; this.ngZone = ngZone; this.themeService = themeService; this.document = document; this.themeWrapperService = themeWrapperService; this.pupaDropdownDisabled = false; this.cursorStyle = CURSOR_POINTER; this.opened$ = new BehaviorSubject(false); this.theme$ = this.themeWrapperService?.theme$ ?? this.themeService.theme$; this.subscription = new Subscription(); this.isTriggerTouched$ = new BehaviorSubject(false); this.dropdown = null; this.outsideTouchEventSubscription = null; this.params = null; } ngAfterViewInit() { this.subscription.add(this.handleTriggerClickEvents()); this.subscription.add(this.handleTriggerTouchEvents()); } ngOnDestroy() { this.subscription.unsubscribe(); } setDropdownParams(params) { this.params = params; } open() { if (this.params === null) { throw new Error('[DropdownDirective] dropdownParams has not set. You can set *pupaDropdownTemplate on element'); } if (this.pupaDropdownDisabled) { return; } this.theme$ .pipe(take(1), switchMap((theme) => { this.dropdown = this.dropdownsService.open({ target: this.pupaDropdownRealTriggerElement ?? this.triggerRef.nativeElement, widthType: this.params.widthType, horizontalPosition: this.params.horizontalPosition, theme, data: { templateRef: this.params.templateRef, }, }); this.opened$.next(true); this.isTriggerTouched$.next(false); this.outsideTouchEventSubscription = this.handleOutsideTriggerTouchEvents(); return this.dropdown.closed$; })) .subscribe(() => { this.outsideTouchEventSubscription?.unsubscribe(); this.opened$.next(false); this.dropdown = null; }); } close() { this.dropdown?.close(); } toggle() { this.opened$ .pipe(take(1), subscribeInsideAngular(this.ngZone)) .subscribe((opened) => (opened ? this.close() : this.open())); } handleTriggerClickEvents() { return fromEvent(this.triggerRef.nativeElement, 'click').subscribe(() => this.toggle()); } handleTriggerTouchEvents() { return merge(fromEvent(this.triggerRef.nativeElement, 'touchstart'), fromEvent(this.triggerRef.nativeElement, 'mousedown')) .pipe(subscribeOutsideAngular(this.ngZone)) .subscribe(() => { this.isTriggerTouched$.next(true); }); } handleOutsideTriggerTouchEvents() { return merge(fromEvent(this.document, 'mousedown'), fromEvent(this.document, 'touchstart')) .pipe(switchMap(() => this.isTriggerTouched$.pipe(take(1))), subscribeOutsideAngular(this.ngZone)) .subscribe((isTriggerTouched) => (isTriggerTouched ? this.isTriggerTouched$.next(false) : this.close())); } } DropdownDirective.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: DropdownDirective, deps: [{ token: i0.ElementRef }, { token: i1.DropdownsService }, { token: i0.NgZone }, { token: i2.ThemeService }, { token: DOCUMENT }, { token: i3.ThemeWrapperService, optional: true }], target: i0.ɵɵFactoryTarget.Directive }); DropdownDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "14.2.12", type: DropdownDirective, selector: "[pupaDropdown]", inputs: { pupaDropdownDisabled: "pupaDropdownDisabled", pupaDropdownRealTriggerElement: "pupaDropdownRealTriggerElement" }, host: { properties: { "style.cursor": "this.cursorStyle" } }, exportAs: ["pupaDropdown"], ngImport: i0 }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: DropdownDirective, decorators: [{ type: Directive, args: [{ selector: '[pupaDropdown]', exportAs: 'pupaDropdown', }] }], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: i1.DropdownsService }, { type: i0.NgZone }, { type: i2.ThemeService }, { type: Document, decorators: [{ type: Inject, args: [DOCUMENT] }] }, { type: i3.ThemeWrapperService, decorators: [{ type: Optional }] }]; }, propDecorators: { pupaDropdownDisabled: [{ type: Input }], pupaDropdownRealTriggerElement: [{ type: Input }], cursorStyle: [{ type: HostBinding, args: ['style.cursor'] }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHJvcGRvd24uZGlyZWN0aXZlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2NvbXBvbmVudHMvZHJvcGRvd24vZGlyZWN0aXZlcy9kcm9wZG93bi5kaXJlY3RpdmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQzNDLE9BQU8sRUFFTCxTQUFTLEVBQ1QsVUFBVSxFQUNWLFdBQVcsRUFDWCxNQUFNLEVBQ04sS0FBSyxFQUNMLE1BQU0sRUFFTixRQUFRLEdBQ1QsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBeUIsc0JBQXNCLENBQUM7QUFDaEQsT0FBTyxFQUFFLGVBQWUsRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFjLFlBQVksRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUNuRixPQUFPLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ2pELE9BQStCLHFEQUFxRCxDQUFDO0FBQ3JGLE9BQXdDLHNFQUFzRSxDQUFDO0FBQy9HLE9BQTZCLDBEQUEwRCxDQUFDO0FBQ3hGLE9BQTBDLDZEQUE2RCxDQUFDO0FBQ3hHLE9BQU8sRUFBRSxzQkFBc0IsRUFBRSx1QkFBdUIsRUFBUyxZQUFZLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUNqSCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxxQ0FBcUMsQ0FBQztBQUN2RSxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxvREFBb0QsQ0FBQzs7Ozs7QUFFekYsTUFBTSxjQUFjLEdBQVcsU0FBUyxDQUFDO0FBTXpDLE1BQU0sT0FBTyxpQkFBaUI7SUFrQjVCLFlBQ2tCLFVBQW1DLEVBQ2xDLGdCQUFrQyxFQUNsQyxNQUFjLEVBQ2QsWUFBMEIsRUFDUixRQUFrQixFQUN4QixtQkFBeUM7UUFMdEQsZUFBVSxHQUFWLFVBQVUsQ0FBeUI7UUFDbEMscUJBQWdCLEdBQWhCLGdCQUFnQixDQUFrQjtRQUNsQyxXQUFNLEdBQU4sTUFBTSxDQUFRO1FBQ2QsaUJBQVksR0FBWixZQUFZLENBQWM7UUFDUixhQUFRLEdBQVIsUUFBUSxDQUFVO1FBQ3hCLHdCQUFtQixHQUFuQixtQkFBbUIsQ0FBc0I7UUF2QnhELHlCQUFvQixHQUFZLEtBQUssQ0FBQztRQUdsQixnQkFBVyxHQUFXLGNBQWMsQ0FBQztRQUV6RCxZQUFPLEdBQTZCLElBQUksZUFBZSxDQUFVLEtBQUssQ0FBQyxDQUFDO1FBRXZFLFdBQU0sR0FBc0IsSUFBSSxDQUFDLG1CQUFtQixFQUFFLE1BQU0sSUFBSSxJQUFJLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQztRQUV6RixpQkFBWSxHQUFpQixJQUFJLFlBQVksRUFBRSxDQUFDO1FBQ2hELHNCQUFpQixHQUE2QixJQUFJLGVBQWUsQ0FBVSxLQUFLLENBQUMsQ0FBQztRQUUzRixhQUFRLEdBQTZCLElBQUksQ0FBQztRQUMxQyxrQ0FBNkIsR0FBMkIsSUFBSSxDQUFDO1FBRTdELFdBQU0sR0FBbUMsSUFBSSxDQUFDO0lBU25ELENBQUM7SUFFRyxlQUFlO1FBQ3BCLElBQUksQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyx3QkFBd0IsRUFBRSxDQUFDLENBQUM7UUFDdkQsSUFBSSxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLHdCQUF3QixFQUFFLENBQUMsQ0FBQztJQUN6RCxDQUFDO0lBRU0sV0FBVztRQUNoQixJQUFJLENBQUMsWUFBWSxDQUFDLFdBQVcsRUFBRSxDQUFDO0lBQ2xDLENBQUM7SUFFTSxpQkFBaUIsQ0FBQyxNQUErQjtRQUN0RCxJQUFJLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQztJQUN2QixDQUFDO0lBRU0sSUFBSTtRQUNULElBQUksSUFBSSxDQUFDLE1BQU0sS0FBSyxJQUFJLEVBQUU7WUFDeEIsTUFBTSxJQUFJLEtBQUssQ0FBQyw4RkFBOEYsQ0FBQyxDQUFDO1NBQ2pIO1FBRUQsSUFBSSxJQUFJLENBQUMsb0JBQW9CLEVBQUU7WUFDN0IsT0FBTztTQUNSO1FBRUQsSUFBSSxDQUFDLE1BQU07YUFDUixJQUFJLENBQ0gsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUNQLFNBQVMsQ0FBQyxDQUFDLEtBQVksRUFBRSxFQUFFO1lBQ3pCLElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBcUM7Z0JBQzdFLE1BQU0sRUFBRSxJQUFJLENBQUMsOEJBQThCLElBQUksSUFBSSxDQUFDLFVBQVUsQ0FBQyxhQUFhO2dCQUM1RSxTQUFTLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTO2dCQUNoQyxrQkFBa0IsRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLGtCQUFrQjtnQkFDbEQsS0FBSztnQkFDTCxJQUFJLEVBQUU7b0JBQ0osV0FBVyxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsV0FBVztpQkFDckM7YUFDRixDQUFDLENBQUM7WUFFSCxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUN4QixJQUFJLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ25DLElBQUksQ0FBQyw2QkFBNkIsR0FBRyxJQUFJLENBQUMsK0JBQStCLEVBQUUsQ0FBQztZQUU1RSxPQUFPLElBQUksQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDO1FBQy9CLENBQUMsQ0FBQyxDQUNIO2FBQ0EsU0FBUyxDQUFDLEdBQUcsRUFBRTtZQUNkLElBQUksQ0FBQyw2QkFBNkIsRUFBRSxXQUFXLEVBQUUsQ0FBQztZQUNsRCxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUN6QixJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQztRQUN2QixDQUFDLENBQUMsQ0FBQztJQUNQLENBQUM7SUFFTSxLQUFLO1FBQ1YsSUFBSSxDQUFDLFFBQVEsRUFBRSxLQUFLLEVBQUUsQ0FBQztJQUN6QixDQUFDO0lBRU0sTUFBTTtRQUNYLElBQUksQ0FBQyxPQUFPO2FBQ1QsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxzQkFBc0IsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7YUFDbEQsU0FBUyxDQUFDLENBQUMsTUFBZSxFQUFFLEVBQUUsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQzNFLENBQUM7SUFFTyx3QkFBd0I7UUFDOUIsT0FBTyxTQUFTLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxhQUFhLEVBQUUsT0FBTyxDQUFDLENBQUMsU0FBUyxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDO0lBQzFGLENBQUM7SUFFTyx3QkFBd0I7UUFDOUIsT0FBTyxLQUFLLENBQ1YsU0FBUyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsYUFBYSxFQUFFLFlBQVksQ0FBQyxFQUN0RCxTQUFTLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxhQUFhLEVBQUUsV0FBVyxDQUFDLENBQ3REO2FBQ0UsSUFBSSxDQUFDLHVCQUF1QixDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQzthQUMxQyxTQUFTLENBQUMsR0FBRyxFQUFFO1lBQ2QsSUFBSSxDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNwQyxDQUFDLENBQUMsQ0FBQztJQUNQLENBQUM7SUFFTywrQkFBK0I7UUFDckMsT0FBTyxLQUFLLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsV0FBVyxDQUFDLEVBQUUsU0FBUyxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsWUFBWSxDQUFDLENBQUM7YUFDeEYsSUFBSSxDQUNILFNBQVMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQ3JELHVCQUF1QixDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FDckM7YUFDQSxTQUFTLENBQUMsQ0FBQyxnQkFBeUIsRUFBRSxFQUFFLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQztJQUN0SCxDQUFDOzsrR0E3R1UsaUJBQWlCLDhIQXVCbEIsUUFBUTttR0F2QlAsaUJBQWlCOzRGQUFqQixpQkFBaUI7a0JBSjdCLFNBQVM7bUJBQUM7b0JBQ1QsUUFBUSxFQUFFLGdCQUFnQjtvQkFDMUIsUUFBUSxFQUFFLGNBQWM7aUJBQ3pCOzswQkF3QkksTUFBTTsyQkFBQyxRQUFROzswQkFDZixRQUFROzRDQXZCSyxvQkFBb0I7c0JBQW5DLEtBQUs7Z0JBQ1UsOEJBQThCO3NCQUE3QyxLQUFLO2dCQUU4QixXQUFXO3NCQUE5QyxXQUFXO3VCQUFDLGNBQWMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBET0NVTUVOVCB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQge1xuICBBZnRlclZpZXdJbml0LFxuICBEaXJlY3RpdmUsXG4gIEVsZW1lbnRSZWYsXG4gIEhvc3RCaW5kaW5nLFxuICBJbmplY3QsXG4gIElucHV0LFxuICBOZ1pvbmUsXG4gIE9uRGVzdHJveSxcbiAgT3B0aW9uYWwsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgTnVsbGFibGUgfSBmcm9tICdAYmltZWlzdGVyL3V0aWxpdGllcyc7XG5pbXBvcnQgeyBCZWhhdmlvclN1YmplY3QsIGZyb21FdmVudCwgbWVyZ2UsIE9ic2VydmFibGUsIFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgc3dpdGNoTWFwLCB0YWtlIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHsgT3BlbmVkRHJvcGRvd24gfSBmcm9tICcuLi8uLi8uLi9kZWNsYXJhdGlvbnMvY2xhc3Nlcy9vcGVuZWQtZHJvcGRvd24uY2xhc3MnO1xuaW1wb3J0IHsgRHJvcGRvd25EaXJlY3RpdmVQYXJhbXMgfSBmcm9tICcuLi8uLi8uLi9kZWNsYXJhdGlvbnMvaW50ZXJmYWNlcy9kcm9wZG93bi1kaXJlY3RpdmUtcGFyYW1zLmludGVyZmFjZSc7XG5pbXBvcnQgeyBEcm9wZG93bkhvc3QgfSBmcm9tICcuLi8uLi8uLi9kZWNsYXJhdGlvbnMvaW50ZXJmYWNlcy9kcm9wZG93bi1ob3N0LmludGVyZmFjZSc7XG5pbXBvcnQgeyBEcm9wZG93blRlbXBsYXRlQ29tcG9uZW50IH0gZnJvbSAnLi4vY29tcG9uZW50cy9kcm9wZG93bi10ZW1wbGF0ZS9kcm9wZG93bi10ZW1wbGF0ZS5jb21wb25lbnQnO1xuaW1wb3J0IHsgc3Vic2NyaWJlSW5zaWRlQW5ndWxhciwgc3Vic2NyaWJlT3V0c2lkZUFuZ3VsYXIsIFRoZW1lLCBUaGVtZVNlcnZpY2UgfSBmcm9tICdAYmltZWlzdGVyL3B1cGFraXQuY29tbW9uJztcbmltcG9ydCB7IERyb3Bkb3duc1NlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcy9kcm9wZG93bnMuc2VydmljZSc7XG5pbXBvcnQgeyBUaGVtZVdyYXBwZXJTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vdGhlbWUtd3JhcHBlci9zZXJ2aWNlcy90aGVtZS13cmFwcGVyLnNlcnZpY2UnO1xuXG5jb25zdCBDVVJTT1JfUE9JTlRFUjogc3RyaW5nID0gJ3BvaW50ZXInO1xuXG5ARGlyZWN0aXZlKHtcbiAgc2VsZWN0b3I6ICdbcHVwYURyb3Bkb3duXScsXG4gIGV4cG9ydEFzOiAncHVwYURyb3Bkb3duJyxcbn0pXG5leHBvcnQgY2xhc3MgRHJvcGRvd25EaXJlY3RpdmUgaW1wbGVtZW50cyBBZnRlclZpZXdJbml0LCBPbkRlc3Ryb3ksIERyb3Bkb3duSG9zdCB7XG4gIEBJbnB1dCgpIHB1YmxpYyBwdXBhRHJvcGRvd25EaXNhYmxlZDogYm9vbGVhbiA9IGZhbHNlO1xuICBASW5wdXQoKSBwdWJsaWMgcHVwYURyb3Bkb3duUmVhbFRyaWdnZXJFbGVtZW50PzogSFRNTEVsZW1lbnQ7XG5cbiAgQEhvc3RCaW5kaW5nKCdzdHlsZS5jdXJzb3InKSBwdWJsaWMgY3Vyc29yU3R5bGU6IHN0cmluZyA9IENVUlNPUl9QT0lOVEVSO1xuXG4gIHB1YmxpYyByZWFkb25seSBvcGVuZWQkOiBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4gPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+KGZhbHNlKTtcblxuICBwcml2YXRlIHJlYWRvbmx5IHRoZW1lJDogT2JzZXJ2YWJsZTxUaGVtZT4gPSB0aGlzLnRoZW1lV3JhcHBlclNlcnZpY2U/LnRoZW1lJCA/PyB0aGlzLnRoZW1lU2VydmljZS50aGVtZSQ7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBzdWJzY3JpcHRpb246IFN1YnNjcmlwdGlvbiA9IG5ldyBTdWJzY3JpcHRpb24oKTtcbiAgcHJpdmF0ZSByZWFkb25seSBpc1RyaWdnZXJUb3VjaGVkJDogQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPihmYWxzZSk7XG5cbiAgcHJpdmF0ZSBkcm9wZG93bjogTnVsbGFibGU8T3BlbmVkRHJvcGRvd24+ID0gbnVsbDtcbiAgcHJpdmF0ZSBvdXRzaWRlVG91Y2hFdmVudFN1YnNjcmlwdGlvbjogTnVsbGFibGU8U3Vic2NyaXB0aW9uPiA9IG51bGw7XG5cbiAgcHJpdmF0ZSBwYXJhbXM6IERyb3Bkb3duRGlyZWN0aXZlUGFyYW1zIHwgbnVsbCA9IG51bGw7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHVibGljIHJlYWRvbmx5IHRyaWdnZXJSZWY6IEVsZW1lbnRSZWY8SFRNTEVsZW1lbnQ+LFxuICAgIHByaXZhdGUgcmVhZG9ubHkgZHJvcGRvd25zU2VydmljZTogRHJvcGRvd25zU2VydmljZSxcbiAgICBwcml2YXRlIHJlYWRvbmx5IG5nWm9uZTogTmdab25lLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgdGhlbWVTZXJ2aWNlOiBUaGVtZVNlcnZpY2UsXG4gICAgQEluamVjdChET0NVTUVOVCkgcHJpdmF0ZSByZWFkb25seSBkb2N1bWVudDogRG9jdW1lbnQsXG4gICAgQE9wdGlvbmFsKCkgcHJpdmF0ZSByZWFkb25seSB0aGVtZVdyYXBwZXJTZXJ2aWNlPzogVGhlbWVXcmFwcGVyU2VydmljZVxuICApIHt9XG5cbiAgcHVibGljIG5nQWZ0ZXJWaWV3SW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLnN1YnNjcmlwdGlvbi5hZGQodGhpcy5oYW5kbGVUcmlnZ2VyQ2xpY2tFdmVudHMoKSk7XG4gICAgdGhpcy5zdWJzY3JpcHRpb24uYWRkKHRoaXMuaGFuZGxlVHJpZ2dlclRvdWNoRXZlbnRzKCkpO1xuICB9XG5cbiAgcHVibGljIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMuc3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gIH1cblxuICBwdWJsaWMgc2V0RHJvcGRvd25QYXJhbXMocGFyYW1zOiBEcm9wZG93bkRpcmVjdGl2ZVBhcmFtcyk6IHZvaWQge1xuICAgIHRoaXMucGFyYW1zID0gcGFyYW1zO1xuICB9XG5cbiAgcHVibGljIG9wZW4oKTogdm9pZCB7XG4gICAgaWYgKHRoaXMucGFyYW1zID09PSBudWxsKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1tEcm9wZG93bkRpcmVjdGl2ZV0gZHJvcGRvd25QYXJhbXMgaGFzIG5vdCBzZXQuIFlvdSBjYW4gc2V0ICpwdXBhRHJvcGRvd25UZW1wbGF0ZSBvbiBlbGVtZW50Jyk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMucHVwYURyb3Bkb3duRGlzYWJsZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLnRoZW1lJFxuICAgICAgLnBpcGUoXG4gICAgICAgIHRha2UoMSksXG4gICAgICAgIHN3aXRjaE1hcCgodGhlbWU6IFRoZW1lKSA9PiB7XG4gICAgICAgICAgdGhpcy5kcm9wZG93biA9IHRoaXMuZHJvcGRvd25zU2VydmljZS5vcGVuPERyb3Bkb3duVGVtcGxhdGVDb21wb25lbnQ8dW5rbm93bj4+KHtcbiAgICAgICAgICAgIHRhcmdldDogdGhpcy5wdXBhRHJvcGRvd25SZWFsVHJpZ2dlckVsZW1lbnQgPz8gdGhpcy50cmlnZ2VyUmVmLm5hdGl2ZUVsZW1lbnQsXG4gICAgICAgICAgICB3aWR0aFR5cGU6IHRoaXMucGFyYW1zLndpZHRoVHlwZSxcbiAgICAgICAgICAgIGhvcml6b250YWxQb3NpdGlvbjogdGhpcy5wYXJhbXMuaG9yaXpvbnRhbFBvc2l0aW9uLFxuICAgICAgICAgICAgdGhlbWUsXG4gICAgICAgICAgICBkYXRhOiB7XG4gICAgICAgICAgICAgIHRlbXBsYXRlUmVmOiB0aGlzLnBhcmFtcy50ZW1wbGF0ZVJlZixcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICB0aGlzLm9wZW5lZCQubmV4dCh0cnVlKTtcbiAgICAgICAgICB0aGlzLmlzVHJpZ2dlclRvdWNoZWQkLm5leHQoZmFsc2UpO1xuICAgICAgICAgIHRoaXMub3V0c2lkZVRvdWNoRXZlbnRTdWJzY3JpcHRpb24gPSB0aGlzLmhhbmRsZU91dHNpZGVUcmlnZ2VyVG91Y2hFdmVudHMoKTtcblxuICAgICAgICAgIHJldHVybiB0aGlzLmRyb3Bkb3duLmNsb3NlZCQ7XG4gICAgICAgIH0pXG4gICAgICApXG4gICAgICAuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgdGhpcy5vdXRzaWRlVG91Y2hFdmVudFN1YnNjcmlwdGlvbj8udW5zdWJzY3JpYmUoKTtcbiAgICAgICAgdGhpcy5vcGVuZWQkLm5leHQoZmFsc2UpO1xuICAgICAgICB0aGlzLmRyb3Bkb3duID0gbnVsbDtcbiAgICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGNsb3NlKCk6IHZvaWQge1xuICAgIHRoaXMuZHJvcGRvd24/LmNsb3NlKCk7XG4gIH1cblxuICBwdWJsaWMgdG9nZ2xlKCk6IHZvaWQge1xuICAgIHRoaXMub3BlbmVkJFxuICAgICAgLnBpcGUodGFrZSgxKSwgc3Vic2NyaWJlSW5zaWRlQW5ndWxhcih0aGlzLm5nWm9uZSkpXG4gICAgICAuc3Vic2NyaWJlKChvcGVuZWQ6IGJvb2xlYW4pID0+IChvcGVuZWQgPyB0aGlzLmNsb3NlKCkgOiB0aGlzLm9wZW4oKSkpO1xuICB9XG5cbiAgcHJpdmF0ZSBoYW5kbGVUcmlnZ2VyQ2xpY2tFdmVudHMoKTogU3Vic2NyaXB0aW9uIHtcbiAgICByZXR1cm4gZnJvbUV2ZW50KHRoaXMudHJpZ2dlclJlZi5uYXRpdmVFbGVtZW50LCAnY2xpY2snKS5zdWJzY3JpYmUoKCkgPT4gdGhpcy50b2dnbGUoKSk7XG4gIH1cblxuICBwcml2YXRlIGhhbmRsZVRyaWdnZXJUb3VjaEV2ZW50cygpOiBTdWJzY3JpcHRpb24ge1xuICAgIHJldHVybiBtZXJnZShcbiAgICAgIGZyb21FdmVudCh0aGlzLnRyaWdnZXJSZWYubmF0aXZlRWxlbWVudCwgJ3RvdWNoc3RhcnQnKSxcbiAgICAgIGZyb21FdmVudCh0aGlzLnRyaWdnZXJSZWYubmF0aXZlRWxlbWVudCwgJ21vdXNlZG93bicpXG4gICAgKVxuICAgICAgLnBpcGUoc3Vic2NyaWJlT3V0c2lkZUFuZ3VsYXIodGhpcy5uZ1pvbmUpKVxuICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgIHRoaXMuaXNUcmlnZ2VyVG91Y2hlZCQubmV4dCh0cnVlKTtcbiAgICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBoYW5kbGVPdXRzaWRlVHJpZ2dlclRvdWNoRXZlbnRzKCk6IFN1YnNjcmlwdGlvbiB7XG4gICAgcmV0dXJuIG1lcmdlKGZyb21FdmVudCh0aGlzLmRvY3VtZW50LCAnbW91c2Vkb3duJyksIGZyb21FdmVudCh0aGlzLmRvY3VtZW50LCAndG91Y2hzdGFydCcpKVxuICAgICAgLnBpcGUoXG4gICAgICAgIHN3aXRjaE1hcCgoKSA9PiB0aGlzLmlzVHJpZ2dlclRvdWNoZWQkLnBpcGUodGFrZSgxKSkpLFxuICAgICAgICBzdWJzY3JpYmVPdXRzaWRlQW5ndWxhcih0aGlzLm5nWm9uZSlcbiAgICAgIClcbiAgICAgIC5zdWJzY3JpYmUoKGlzVHJpZ2dlclRvdWNoZWQ6IGJvb2xlYW4pID0+IChpc1RyaWdnZXJUb3VjaGVkID8gdGhpcy5pc1RyaWdnZXJUb3VjaGVkJC5uZXh0KGZhbHNlKSA6IHRoaXMuY2xvc2UoKSkpO1xuICB9XG59XG4iXX0=