ng-devui
Version:
DevUI components based on Angular
349 lines • 47.8 kB
JavaScript
import { __decorate, __metadata } from "tslib";
import { DOWN_ARROW, ENTER, ESCAPE, LEFT_ARROW, RIGHT_ARROW, TAB, UP_ARROW } from '@angular/cdk/keycodes';
import { ConnectionPositionPair, Overlay, OverlayConfig } from '@angular/cdk/overlay';
import { ComponentPortal } from '@angular/cdk/portal';
import { ChangeDetectorRef, Directive, ElementRef, EventEmitter, Host, HostBinding, HostListener, Input, Optional, Output, Self, TemplateRef, ViewContainerRef, } from '@angular/core';
import { NgModel } from '@angular/forms';
import { DevConfigService, WithConfig } from 'ng-devui/utils';
import { Subject, fromEvent } from 'rxjs';
import { debounceTime } from 'rxjs/operators';
import { MentionComponent } from './mention.component';
import { DEFAULT_MENTION_BOTTOM_POSITIONS } from './position';
import { getCaretCoordinates } from './utils';
import * as i0 from "@angular/core";
import * as i1 from "@angular/forms";
import * as i2 from "@angular/cdk/overlay";
import * as i3 from "ng-devui/utils";
export class MentionDirective {
get hasGlowStyle() {
return this.showGlowStyle;
}
get nativeElement() {
return this.el.nativeElement;
}
constructor(ngModelInstance, el, viewContainerRef, cdr, overlay, devConfigService) {
this.ngModelInstance = ngModelInstance;
this.el = el;
this.viewContainerRef = viewContainerRef;
this.cdr = cdr;
this.overlay = overlay;
this.devConfigService = devConfigService;
this.mentionNotFoundContent = 'No suggestion matched';
this.mentionSuggestions = [];
this.mentionLoading = false;
this.mentionTrigger = ['@'];
this.mentionSeparator = ' ';
this.mentionSeparatorToggle = { prefix: false, suffix: false };
this.mentionPosition = 'bottom';
this.endWithCursorPos = false;
this.mentionValueParse = (value) => value;
this.mentionSelectItem = new EventEmitter();
this.mentionSearchChange = new EventEmitter();
this.mentionAfterMentionInit = new EventEmitter();
this.showGlowStyle = true;
this.isOpen = false;
this.activeIndex = -1;
this.unsubscribe$ = new Subject();
this.defaultNotFoundText = '';
this.value = '';
this.previousValue = '';
this.overlayRef = null;
this.filterSuggestions = [];
}
onKeyDown(event) {
if (this.mentionRef) {
const keyCode = event.keyCode;
if (this.isOpen && keyCode === ENTER && this.activeIndex !== -1 && this.filterSuggestions.length) {
this.selectSuggestion(this.filterSuggestions[this.activeIndex]);
event.preventDefault();
}
else if (keyCode === LEFT_ARROW || keyCode === RIGHT_ARROW) {
if (keyCode === LEFT_ARROW) {
this.cursorMentionStart = this.cursorMentionStart - 1;
}
else {
this.cursorMentionStart = this.cursorMentionStart + 1;
}
event.stopPropagation();
setTimeout(() => {
this.resetMention();
});
}
else {
if (this.isOpen && (keyCode === TAB || keyCode === ESCAPE)) {
this.hideMention();
return;
}
if (this.isOpen && keyCode === UP_ARROW) {
event.preventDefault();
event.stopPropagation();
this.setPreviousItemActive();
}
if (this.isOpen && keyCode === DOWN_ARROW) {
event.preventDefault();
event.stopPropagation();
this.setNextItemActive();
}
}
this.setMentionData();
}
}
onClick(e) {
if (this.overlayRef && this.isOpen) {
if (!this.nativeElement.contains(e.target)) {
this.hideMention();
}
}
else if (this.nativeElement.contains(e.target)) {
this.resetMention();
}
}
ngOnChanges(changes) {
const { mentionSuggestions } = changes;
if (mentionSuggestions && this.isOpen) {
this.previousValue = null;
this.activeIndex = -1;
this.resetMention(false);
}
}
ngOnInit() {
this.mentionAfterMentionInit.emit(this);
}
ngAfterViewInit() {
fromEvent(this.el.nativeElement, 'input')
.pipe(debounceTime(300))
.subscribe(() => {
this.resetMention();
});
}
ngOnDestroy() {
if (this.overlayRef) {
this.overlayRef.dispose();
}
}
resetMention(emit = true) {
this.checkMention();
if (!this.cursorMention) {
this.hideMention();
return;
}
this.suggestionsFilter(this.cursorMention, emit);
if (this.mentionSeparatorToggle.suffix || (this.filterSuggestions.length && !this.mentionSeparatorToggle.suffix)) {
const activeIndex = this.filterSuggestions.indexOf(this.value);
this.activeIndex = activeIndex >= 0 ? activeIndex : 0;
this.showMention();
}
else if (this.mentionLoading) {
this.showMention();
}
else {
this.hideMention();
}
}
checkMention() {
const value = this.nativeElement.value.replace(/[\r\n]/g, this.mentionSeparator) || '';
const selectionStart = this.nativeElement.selectionStart;
let i = this.mentionTrigger.length;
while (i >= 0) {
const startPos = value.lastIndexOf(this.mentionTrigger[i], selectionStart);
const resPos = value.indexOf(this.mentionSeparator, selectionStart) > -1 ? value.indexOf(this.mentionSeparator, selectionStart) : value.length;
const endPos = this.endWithCursorPos ? selectionStart : resPos;
const mention = value.substring(startPos, selectionStart);
if ((this.mentionSeparatorToggle.prefix && startPos > 0 && value[startPos - 1] !== this.mentionSeparator) ||
startPos < 0 ||
mention.includes(this.mentionTrigger[i], 1) ||
(this.mentionSeparatorToggle.suffix && mention.includes(this.mentionSeparator))) {
this.cursorMention = null;
this.cursorMentionStart = -1;
this.cursorMentionEnd = -1;
this.cursorEnd = -1;
this.value = '';
}
else {
this.cursorMention = mention[0];
this.cursorMentionStart = startPos;
this.cursorMentionEnd = endPos;
this.cursorEnd = selectionStart;
this.value = mention.slice(1);
return;
}
i--;
}
}
hideMention() {
if (this.overlayRef && this.overlayRef.hasAttached()) {
this.overlayRef.detach();
this.cdr.markForCheck();
this.isOpen = false;
}
}
showMention() {
this.attachOverlay();
this.isOpen = true;
this.cdr.markForCheck();
}
attachOverlay() {
if (!this.overlayRef) {
this.portal = new ComponentPortal(MentionComponent, this.viewContainerRef);
this.overlayRef = this.overlay.create(this.getOverlayConfig());
}
if (this.overlayRef && !this.overlayRef.hasAttached()) {
this.mentionRef = this.overlayRef.attach(this.portal);
this.mentionRef.instance.mentionHeaderTemplate = this.mentionHeaderTemplate;
this.mentionRef.instance.mentionItemTemplate = this.mentionItemTemplate;
this.mentionRef.instance.mentionNotFoundContent = this.mentionNotFoundContent;
}
this.updatePositions();
}
getOverlayConfig() {
const target = this.el;
return new OverlayConfig({
positionStrategy: this.getOverlayPosition(target),
scrollStrategy: this.overlay.scrollStrategies.reposition(),
disposeOnNavigation: true,
});
}
getOverlayPosition(target) {
const positions = [
new ConnectionPositionPair({ originX: 'start', originY: 'bottom' }, { overlayX: 'start', overlayY: 'top' }),
new ConnectionPositionPair({ originX: 'start', originY: 'top' }, { overlayX: 'start', overlayY: 'bottom' }),
];
this.positionStrategy = this.overlay
.position()
.flexibleConnectedTo(target)
.withPositions(positions)
.withFlexibleDimensions(false)
.withPush(false);
return this.positionStrategy;
}
updatePositions() {
const coordinates = getCaretCoordinates(this.nativeElement, this.cursorEnd);
const top = coordinates.top - this.nativeElement.getBoundingClientRect().height - this.nativeElement.scrollTop;
const left = coordinates.left - this.nativeElement.scrollLeft;
this.positionStrategy.withDefaultOffsetX(left).withDefaultOffsetY(top);
this.positionStrategy.withPositions([...DEFAULT_MENTION_BOTTOM_POSITIONS]);
this.positionStrategy.apply();
this.setMentionData();
}
suggestionsFilter(value, emit) {
if (this.previousValue === value && value !== this.cursorMention[0]) {
return;
}
this.previousValue = value;
if (emit) {
this.mentionSearchChange.emit({
value: this.value,
trigger: this.cursorMention,
});
}
const searchValue = this.value.toLowerCase();
this.filterSuggestions = this.mentionSuggestions.filter((suggestion) => this.mentionValueParse(suggestion).toLowerCase().includes(searchValue));
}
setMentionData() {
Object.assign(this.mentionRef.instance, {
suggestions: this.filterSuggestions,
activeIndex: this.activeIndex,
loading: this.mentionLoading,
trigger: this,
position: this.mentionPosition,
});
}
selectSuggestion(suggestion) {
const value = this.mentionValueParse(suggestion);
this.insertMention({
mention: value,
startPos: this.cursorMentionStart,
endPos: this.cursorMentionEnd,
});
this.mentionSelectItem.emit(suggestion);
this.hideMention();
this.activeIndex = -1;
}
insertMention(mention) {
const value = this.el.nativeElement.value;
const insertValue = `${mention.mention.trim()}${this.mentionSeparatorToggle.suffix ? this.mentionSeparator : ''}`;
const newValue = [value.slice(0, mention.startPos + 1), insertValue, value.slice(mention.endPos, value.length)].join('');
this.el.nativeElement.value = newValue;
this.value = newValue;
if (this.ngModelInstance) {
this.ngModelInstance.control.setValue(newValue);
}
}
setPreviousItemActive() {
this.activeIndex = this.activeIndex - 1 < 0 ? this.filterSuggestions.length - 1 : this.activeIndex - 1;
this.cdr.markForCheck();
setTimeout(() => {
if (this.mentionRef) {
this.mentionRef.instance.scrollToFocusItem();
}
});
}
setNextItemActive() {
this.activeIndex = this.activeIndex + 1 <= this.filterSuggestions.length - 1 ? this.activeIndex + 1 : 0;
this.cdr.markForCheck();
setTimeout(() => {
if (this.mentionRef) {
this.mentionRef.instance.scrollToFocusItem();
}
});
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: MentionDirective, deps: [{ token: i1.NgModel, host: true, optional: true, self: true }, { token: i0.ElementRef }, { token: i0.ViewContainerRef }, { token: i0.ChangeDetectorRef }, { token: i2.Overlay }, { token: i3.DevConfigService }], target: i0.ɵɵFactoryTarget.Directive }); }
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "18.2.13", type: MentionDirective, selector: "[dMention]", inputs: { mentionNotFoundContent: "mentionNotFoundContent", mentionSuggestions: "mentionSuggestions", mentionLoading: "mentionLoading", mentionTrigger: "mentionTrigger", mentionSeparator: "mentionSeparator", mentionSeparatorToggle: "mentionSeparatorToggle", mentionPosition: "mentionPosition", mentionHeaderTemplate: "mentionHeaderTemplate", mentionItemTemplate: "mentionItemTemplate", endWithCursorPos: "endWithCursorPos", mentionValueParse: "mentionValueParse", showGlowStyle: "showGlowStyle" }, outputs: { mentionSelectItem: "mentionSelectItem", mentionSearchChange: "mentionSearchChange", mentionAfterMentionInit: "mentionAfterMentionInit" }, host: { listeners: { "keydown": "onKeyDown($event)", "document:click": "onClick($event)" }, properties: { "class.devui-glow-style": "this.hasGlowStyle" } }, exportAs: ["dMention"], usesOnChanges: true, ngImport: i0 }); }
}
__decorate([
WithConfig(),
__metadata("design:type", Object)
], MentionDirective.prototype, "showGlowStyle", void 0);
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: MentionDirective, decorators: [{
type: Directive,
args: [{
selector: '[dMention]',
exportAs: 'dMention',
}]
}], ctorParameters: () => [{ type: i1.NgModel, decorators: [{
type: Optional
}, {
type: Host
}, {
type: Self
}] }, { type: i0.ElementRef }, { type: i0.ViewContainerRef }, { type: i0.ChangeDetectorRef }, { type: i2.Overlay }, { type: i3.DevConfigService }], propDecorators: { mentionNotFoundContent: [{
type: Input
}], mentionSuggestions: [{
type: Input
}], mentionLoading: [{
type: Input
}], mentionTrigger: [{
type: Input
}], mentionSeparator: [{
type: Input
}], mentionSeparatorToggle: [{
type: Input
}], mentionPosition: [{
type: Input
}], mentionHeaderTemplate: [{
type: Input
}], mentionItemTemplate: [{
type: Input
}], endWithCursorPos: [{
type: Input
}], mentionValueParse: [{
type: Input
}], mentionSelectItem: [{
type: Output
}], mentionSearchChange: [{
type: Output
}], mentionAfterMentionInit: [{
type: Output
}], showGlowStyle: [{
type: Input
}], hasGlowStyle: [{
type: HostBinding,
args: ['class.devui-glow-style']
}], onKeyDown: [{
type: HostListener,
args: ['keydown', ['$event']]
}], onClick: [{
type: HostListener,
args: ['document:click', ['$event']]
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWVudGlvbi5kaXJlY3RpdmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9kZXZ1aS9tZW50aW9uL21lbnRpb24uZGlyZWN0aXZlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFFLFdBQVcsRUFBRSxHQUFHLEVBQUUsUUFBUSxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDMUcsT0FBTyxFQUFFLHNCQUFzQixFQUFxQyxPQUFPLEVBQUUsYUFBYSxFQUFjLE1BQU0sc0JBQXNCLENBQUM7QUFDckksT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ3RELE9BQU8sRUFFTCxpQkFBaUIsRUFFakIsU0FBUyxFQUNULFVBQVUsRUFDVixZQUFZLEVBQ1osSUFBSSxFQUNKLFdBQVcsRUFDWCxZQUFZLEVBQ1osS0FBSyxFQUlMLFFBQVEsRUFDUixNQUFNLEVBQ04sSUFBSSxFQUVKLFdBQVcsRUFDWCxnQkFBZ0IsR0FDakIsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3pDLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxVQUFVLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUM5RCxPQUFPLEVBQUUsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUMxQyxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDOUMsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFFdkQsT0FBTyxFQUFFLGdDQUFnQyxFQUFFLE1BQU0sWUFBWSxDQUFDO0FBQzlELE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLFNBQVMsQ0FBQzs7Ozs7QUFNOUMsTUFBTSxPQUFPLGdCQUFnQjtJQWlCM0IsSUFBMkMsWUFBWTtRQUNyRCxPQUFPLElB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QkFBdEQsV0FBVzt1QkFBQyx3QkFBd0I7Z0JBbUNyQyxTQUFTO3NCQURSLFlBQVk7dUJBQUMsU0FBUyxFQUFFLENBQUMsUUFBUSxDQUFDO2dCQXdDbkMsT0FBTztzQkFETixZQUFZO3VCQUFDLGdCQUFnQixFQUFFLENBQUMsUUFBUSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRE9XTl9BUlJPVywgRU5URVIsIEVTQ0FQRSwgTEVGVF9BUlJPVywgUklHSFRfQVJST1csIFRBQiwgVVBfQVJST1cgfSBmcm9tICdAYW5ndWxhci9jZGsva2V5Y29kZXMnO1xyXG5pbXBvcnQgeyBDb25uZWN0aW9uUG9zaXRpb25QYWlyLCBGbGV4aWJsZUNvbm5lY3RlZFBvc2l0aW9uU3RyYXRlZ3ksIE92ZXJsYXksIE92ZXJsYXlDb25maWcsIE92ZXJsYXlSZWYgfSBmcm9tICdAYW5ndWxhci9jZGsvb3ZlcmxheSc7XHJcbmltcG9ydCB7IENvbXBvbmVudFBvcnRhbCB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9wb3J0YWwnO1xyXG5pbXBvcnQge1xyXG4gIEFmdGVyVmlld0luaXQsXHJcbiAgQ2hhbmdlRGV0ZWN0b3JSZWYsXHJcbiAgQ29tcG9uZW50UmVmLFxyXG4gIERpcmVjdGl2ZSxcclxuICBFbGVtZW50UmVmLFxyXG4gIEV2ZW50RW1pdHRlcixcclxuICBIb3N0LFxyXG4gIEhvc3RCaW5kaW5nLFxyXG4gIEhvc3RMaXN0ZW5lcixcclxuICBJbnB1dCxcclxuICBPbkNoYW5nZXMsXHJcbiAgT25EZXN0cm95LFxyXG4gIE9uSW5pdCxcclxuICBPcHRpb25hbCxcclxuICBPdXRwdXQsXHJcbiAgU2VsZixcclxuICBTaW1wbGVDaGFuZ2VzLFxyXG4gIFRlbXBsYXRlUmVmLFxyXG4gIFZpZXdDb250YWluZXJSZWYsXHJcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IE5nTW9kZWwgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XHJcbmltcG9ydCB7IERldkNvbmZpZ1NlcnZpY2UsIFdpdGhDb25maWcgfSBmcm9tICduZy1kZXZ1aS91dGlscyc7XHJcbmltcG9ydCB7IFN1YmplY3QsIGZyb21FdmVudCB9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQgeyBkZWJvdW5jZVRpbWUgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XHJcbmltcG9ydCB7IE1lbnRpb25Db21wb25lbnQgfSBmcm9tICcuL21lbnRpb24uY29tcG9uZW50JztcclxuaW1wb3J0IHsgTWVudGlvbiwgTWVudGlvbk9uU2VhcmNoVHlwZXMsIE1lbnRpb25Qb3NpdGlvblR5cGUgfSBmcm9tICcuL21lbnRpb24udHlwZXMnO1xyXG5pbXBvcnQgeyBERUZBVUxUX01FTlRJT05fQk9UVE9NX1BPU0lUSU9OUyB9IGZyb20gJy4vcG9zaXRpb24nO1xyXG5pbXBvcnQgeyBnZXRDYXJldENvb3JkaW5hdGVzIH0gZnJvbSAnLi91dGlscyc7XHJcblxyXG5ARGlyZWN0aXZlKHtcclxuICBzZWxlY3RvcjogJ1tkTWVudGlvbl0nLFxyXG4gIGV4cG9ydEFzOiAnZE1lbnRpb24nLFxyXG59KVxyXG5leHBvcnQgY2xhc3MgTWVudGlvbkRpcmVjdGl2ZSBpbXBsZW1lbnRzIE9uSW5pdCwgT25DaGFuZ2VzLCBBZnRlclZpZXdJbml0LCBPbkRlc3Ryb3kge1xyXG4gIEBJbnB1dCgpIG1lbnRpb25Ob3RGb3VuZENvbnRlbnQgPSAnTm8gc3VnZ2VzdGlvbiBtYXRjaGVkJztcclxuICBASW5wdXQoKSBtZW50aW9uU3VnZ2VzdGlvbnMgPSBbXTtcclxuICBASW5wdXQoKSBtZW50aW9uTG9hZGluZyA9IGZhbHNlO1xyXG4gIEBJbnB1dCgpIG1lbnRpb25UcmlnZ2VyID0gWydAJ107XHJcbiAgQElucHV0KCkgbWVudGlvblNlcGFyYXRvciA9ICcgJztcclxuICBASW5wdXQoKSBtZW50aW9uU2VwYXJhdG9yVG9nZ2xlID0geyBwcmVmaXg6IGZhbHNlLCBzdWZmaXg6IGZhbHNlIH07XHJcbiAgQElucHV0KCkgbWVudGlvblBvc2l0aW9uOiBNZW50aW9uUG9zaXRpb25UeXBlID0gJ2JvdHRvbSc7XHJcbiAgQElucHV0KCkgbWVudGlvbkhlYWRlclRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxhbnk+O1xyXG4gIEBJbnB1dCgpIG1lbnRpb25JdGVtVGVtcGxhdGU6IFRlbXBsYXRlUmVmPGFueT47XHJcbiAgQElucHV0KCkgZW5kV2l0aEN1cnNvclBvcyA9IGZhbHNlO1xyXG4gIEBJbnB1dCgpIG1lbnRpb25WYWx1ZVBhcnNlOiAodmFsdWU6IHN0cmluZykgPT4gc3RyaW5nID0gKHZhbHVlKSA9PiB2YWx1ZTtcclxuICBAT3V0cHV0KCkgbWVudGlvblNlbGVjdEl0ZW0gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XHJcbiAgQE91dHB1dCgpIG1lbnRpb25TZWFyY2hDaGFuZ2U6IEV2ZW50RW1pdHRlcjxNZW50aW9uT25TZWFyY2hUeXBlcz4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XHJcbiAgQE91dHB1dCgpIG1lbnRpb25BZnRlck1lbnRpb25Jbml0OiBFdmVudEVtaXR0ZXI8TWVudGlvbkRpcmVjdGl2ZT4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XHJcblxyXG4gIEBJbnB1dCgpIEBXaXRoQ29uZmlnKCkgc2hvd0dsb3dTdHlsZSA9IHRydWU7XHJcbiAgQEhvc3RCaW5kaW5nKCdjbGFzcy5kZXZ1aS1nbG93LXN0eWxlJykgZ2V0IGhhc0dsb3dTdHlsZSgpIHtcclxuICAgIHJldHVybiB0aGlzLnNob3dHbG93U3R5bGU7XHJcbiAgfVxyXG5cclxuICBpc09wZW4gPSBmYWxzZTtcclxuICBhY3RpdmVJbmRleCA9IC0xO1xyXG4gIHVuc3Vic2NyaWJlJCA9IG5ldyBTdWJqZWN0KCk7XHJcbiAgZGVmYXVsdE5vdEZvdW5kVGV4dCA9ICcnO1xyXG5cclxuICBnZXQgbmF0aXZlRWxlbWVudCgpIHtcclxuICAgIHJldHVybiB0aGlzLmVsLm5hdGl2ZUVsZW1lbnQ7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHZhbHVlID0gJyc7XHJcbiAgcHJpdmF0ZSBwcmV2aW91c1ZhbHVlID0gJyc7XHJcbiAgcHJpdmF0ZSBjdXJzb3JNZW50aW9uOiBhbnk7XHJcbiAgcHJpdmF0ZSBjdXJzb3JNZW50aW9uU3RhcnQ6IG51bWJlcjtcclxuICBwcml2YXRlIGN1cnNvck1lbnRpb25FbmQ6IG51bWJlcjtcclxuICBwcml2YXRlIGN1cnNvckVuZDogbnVtYmVyO1xyXG4gIHByaXZhdGUgb3ZlcmxheVJlZjogT3ZlcmxheVJlZiB8IG51bGwgPSBudWxsO1xyXG4gIHByaXZhdGUgcG9ydGFsPzogQ29tcG9uZW50UG9ydGFsPE1lbnRpb25Db21wb25lbnQ+O1xyXG4gIHByaXZhdGUgcG9zaXRpb25TdHJhdGVneSE6IEZsZXhpYmxlQ29ubmVjdGVkUG9zaXRpb25TdHJhdGVneTtcclxuICBwcml2YXRlIG1lbnRpb25SZWY6IENvbXBvbmVudFJlZjxNZW50aW9uQ29tcG9uZW50PjtcclxuICBwcml2YXRlIGZpbHRlclN1Z2dlc3Rpb25zID0gW107XHJcblxyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgQE9wdGlvbmFsKCkgQEhvc3QoKSBAU2VsZigpIHByaXZhdGUgbmdNb2RlbEluc3RhbmNlOiBOZ01vZGVsLFxyXG4gICAgcHJpdmF0ZSBlbDogRWxlbWVudFJlZixcclxuICAgIHByaXZhdGUgdmlld0NvbnRhaW5lclJlZjogVmlld0NvbnRhaW5lclJlZixcclxuICAgIHByaXZhdGUgY2RyOiBDaGFuZ2VEZXRlY3RvclJlZixcclxuICAgIHByaXZhdGUgb3ZlcmxheTogT3ZlcmxheSxcclxuICAgIHByaXZhdGUgZGV2Q29uZmlnU2VydmljZTogRGV2Q29uZmlnU2VydmljZVxyXG4gICkge31cclxuXHJcbiAgQEhvc3RMaXN0ZW5lcigna2V5ZG93bicsIFsnJGV2ZW50J10pXHJcbiAgb25LZXlEb3duKGV2ZW50KSB7XHJcbiAgICBpZiAodGhpcy5tZW50aW9uUmVmKSB7XHJcbiAgICAgIGNvbnN0IGtleUNvZGUgPSBldmVudC5rZXlDb2RlO1xyXG4gICAgICBpZiAodGhpcy5pc09wZW4gJiYga2V5Q29kZSA9PT0gRU5URVIgJiYgdGhpcy5hY3RpdmVJbmRleCAhPT0gLTEgJiYgdGhpcy5maWx0ZXJTdWdnZXN0aW9ucy5sZW5ndGgpIHtcclxuICAgICAgICB0aGlzLnNlbGVjdFN1Z2dlc3Rpb24odGhpcy5maWx0ZXJTdWdnZXN0aW9uc1t0aGlzLmFjdGl2ZUluZGV4XSk7XHJcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgfSBlbHNlIGlmIChrZXlDb2RlID09PSBMRUZUX0FSUk9XIHx8IGtleUNvZGUgPT09IFJJR0hUX0FSUk9XKSB7XHJcbiAgICAgICAgaWYgKGtleUNvZGUgPT09IExFRlRfQVJST1cpIHtcclxuICAgICAgICAgIHRoaXMuY3Vyc29yTWVudGlvblN0YXJ0ID0gdGhpcy5jdXJzb3JNZW50aW9uU3RhcnQgLSAxO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICB0aGlzLmN1cnNvck1lbnRpb25TdGFydCA9IHRoaXMuY3Vyc29yTWVudGlvblN0YXJ0ICsgMTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XHJcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICB0aGlzLnJlc2V0TWVudGlvbigpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGlmICh0aGlzLmlzT3BlbiAmJiAoa2V5Q29kZSA9PT0gVEFCIHx8IGtleUNvZGUgPT09IEVTQ0FQRSkpIHtcclxuICAgICAgICAgIHRoaXMuaGlkZU1lbnRpb24oKTtcclxuICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh0aGlzLmlzT3BlbiAmJiBrZXlDb2RlID09PSBVUF9BUlJPVykge1xyXG4gICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xyXG4gICAgICAgICAgdGhpcy5zZXRQcmV2aW91c0l0ZW1BY3RpdmUoKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh0aGlzLmlzT3BlbiAmJiBrZXlDb2RlID09PSBET1dOX0FSUk9XKSB7XHJcbiAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XHJcbiAgICAgICAgICB0aGlzLnNldE5leHRJdGVtQWN0aXZlKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIHRoaXMuc2V0TWVudGlvbkRhdGEoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIEBIb3N0TGlzdGVuZXIoJ2RvY3VtZW50OmNsaWNrJywgWyckZXZlbnQnXSlcclxuICBvbkNsaWNrKGUpIHtcclxuICAgIGlmICh0aGlzLm92ZXJsYXlSZWYgJiYgdGhpcy5pc09wZW4pIHtcclxuICAgICAgaWYgKCF0aGlzLm5hdGl2ZUVsZW1lbnQuY29udGFpbnMoZS50YXJnZXQpKSB7XHJcbiAgICAgICAgdGhpcy5oaWRlTWVudGlvbigpO1xyXG4gICAgICB9XHJcbiAgICB9IGVsc2UgaWYgKHRoaXMubmF0aXZlRWxlbWVudC5jb250YWlucyhlLnRhcmdldCkpIHtcclxuICAgICAgdGhpcy5yZXNldE1lbnRpb24oKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcclxuICAgIGNvbnN0IHsgbWVudGlvblN1Z2dlc3Rpb25zIH0gPSBjaGFuZ2VzO1xyXG4gICAgaWYgKG1lbnRpb25TdWdnZXN0aW9ucyAmJiB0aGlzLmlzT3Blbikge1xyXG4gICAgICB0aGlzLnByZXZpb3VzVmFsdWUgPSBudWxsO1xyXG4gICAgICB0aGlzLmFjdGl2ZUluZGV4ID0gLTE7XHJcbiAgICAgIHRoaXMucmVzZXRNZW50aW9uKGZhbHNlKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIG5nT25Jbml0KCk6IHZvaWQge1xyXG4gICAgdGhpcy5tZW50aW9uQWZ0ZXJNZW50aW9uSW5pdC5lbWl0KHRoaXMpO1xyXG4gIH1cclxuXHJcbiAgbmdBZnRlclZpZXdJbml0KCk6IHZvaWQge1xyXG4gICAgZnJvbUV2ZW50KHRoaXMuZWwubmF0aXZlRWxlbWVudCwgJ2lucHV0JylcclxuICAgICAgLnBpcGUoZGVib3VuY2VUaW1lKDMwMCkpXHJcbiAgICAgIC5zdWJzY3JpYmUoKCkgPT4ge1xyXG4gICAgICAgIHRoaXMucmVzZXRNZW50aW9uKCk7XHJcbiAgICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgbmdPbkRlc3Ryb3koKSB7XHJcbiAgICBpZiAodGhpcy5vdmVybGF5UmVmKSB7XHJcbiAgICAgIHRoaXMub3ZlcmxheVJlZi5kaXNwb3NlKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICByZXNldE1lbnRpb24oZW1pdCA9IHRydWUpIHtcclxuICAgIHRoaXMuY2hlY2tNZW50aW9uKCk7XHJcbiAgICBpZiAoIXRoaXMuY3Vyc29yTWVudGlvbikge1xyXG4gICAgICB0aGlzLmhpZGVNZW50aW9uKCk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIHRoaXMuc3VnZ2VzdGlvbnNGaWx0ZXIodGhpcy5jdXJzb3JNZW50aW9uLCBlbWl0KTtcclxuICAgIGlmICh0aGlzLm1lbnRpb25TZXBhcmF0b3JUb2dnbGUuc3VmZml4IHx8ICh0aGlzLmZpbHRlclN1Z2dlc3Rpb25zLmxlbmd0aCAmJiAhdGhpcy5tZW50aW9uU2VwYXJhdG9yVG9nZ2xlLnN1ZmZpeCkpIHtcclxuICAgICAgY29uc3QgYWN0aXZlSW5kZXggPSB0aGlzLmZpbHRlclN1Z2dlc3Rpb25zLmluZGV4T2YodGhpcy52YWx1ZSk7XHJcbiAgICAgIHRoaXMuYWN0aXZlSW5kZXggPSBhY3RpdmVJbmRleCA+PSAwID8gYWN0aXZlSW5kZXggOiAwO1xyXG4gICAgICB0aGlzLnNob3dNZW50aW9uKCk7XHJcbiAgICB9IGVsc2UgaWYgKHRoaXMubWVudGlvbkxvYWRpbmcpIHtcclxuICAgICAgdGhpcy5zaG93TWVudGlvbigpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5oaWRlTWVudGlvbigpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgY2hlY2tNZW50aW9uKCkge1xyXG4gICAgY29uc3QgdmFsdWUgPSB0aGlzLm5hdGl2ZUVsZW1lbnQudmFsdWUucmVwbGFjZSgvW1xcclxcbl0vZywgdGhpcy5tZW50aW9uU2VwYXJhdG9yKSB8fCAnJztcclxuICAgIGNvbnN0IHNlbGVjdGlvblN0YXJ0ID0gdGhpcy5uYXRpdmVFbGVtZW50LnNlbGVjdGlvblN0YXJ0O1xyXG4gICAgbGV0IGkgPSB0aGlzLm1lbnRpb25UcmlnZ2VyLmxlbmd0aDtcclxuICAgIHdoaWxlIChpID49IDApIHtcclxuICAgICAgY29uc3Qgc3RhcnRQb3MgPSB2YWx1ZS5sYXN0SW5kZXhPZih0aGlzLm1lbnRpb25UcmlnZ2VyW2ldLCBzZWxlY3Rpb25TdGFydCk7XHJcbiAgICAgIGNvbnN0IHJlc1BvcyA9XHJcbiAgICAgICAgdmFsdWUuaW5kZXhPZih0aGlzLm1lbnRpb25TZXBhcmF0b3IsIHNlbGVjdGlvblN0YXJ0KSA+IC0xID8gdmFsdWUuaW5kZXhPZih0aGlzLm1lbnRpb25TZXBhcmF0b3IsIHNlbGVjdGlvblN0YXJ0KSA6IHZhbHVlLmxlbmd0aDtcclxuICAgICAgY29uc3QgZW5kUG9zID0gdGhpcy5lbmRXaXRoQ3Vyc29yUG9zID8gc2VsZWN0aW9uU3RhcnQgOiByZXNQb3M7XHJcbiAgICAgIGNvbnN0IG1lbnRpb24gPSB2YWx1ZS5zdWJzdHJpbmcoc3RhcnRQb3MsIHNlbGVjdGlvblN0YXJ0KTtcclxuICAgICAgaWYgKFxyXG4gICAgICAgICh0aGlzLm1lbnRpb25TZXBhcmF0b3JUb2dnbGUucHJlZml4ICYmIHN0YXJ0UG9zID4gMCAmJiB2YWx1ZVtzdGFydFBvcyAtIDFdICE9PSB0aGlzLm1lbnRpb25TZXBhcmF0b3IpIHx8XHJcbiAgICAgICAgc3RhcnRQb3MgPCAwIHx8XHJcbiAgICAgICAgbWVudGlvbi5pbmNsdWRlcyh0aGlzLm1lbnRpb25UcmlnZ2VyW2ldLCAxKSB8fFxyXG4gICAgICAgICh0aGlzLm1lbnRpb25TZXBhcmF0b3JUb2dnbGUuc3VmZml4ICYmIG1lbnRpb24uaW5jbHVkZXModGhpcy5tZW50aW9uU2VwYXJhdG9yKSlcclxuICAgICAgKSB7XHJcbiAgICAgICAgdGhpcy5jdXJzb3JNZW50aW9uID0gbnVsbDtcclxuICAgICAgICB0aGlzLmN1cnNvck1lbnRpb25TdGFydCA9IC0xO1xyXG4gICAgICAgIHRoaXMuY3Vyc29yTWVudGlvbkVuZCA9IC0xO1xyXG4gICAgICAgIHRoaXMuY3Vyc29yRW5kID0gLTE7XHJcbiAgICAgICAgdGhpcy52YWx1ZSA9ICcnO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHRoaXMuY3Vyc29yTWVudGlvbiA9IG1lbnRpb25bMF07XHJcbiAgICAgICAgdGhpcy5jdXJzb3JNZW50aW9uU3RhcnQgPSBzdGFydFBvcztcclxuICAgICAgICB0aGlzLmN1cnNvck1lbnRpb25FbmQgPSBlbmRQb3M7XHJcbiAgICAgICAgdGhpcy5jdXJzb3JFbmQgPSBzZWxlY3Rpb25TdGFydDtcclxuICAgICAgICB0aGlzLnZhbHVlID0gbWVudGlvbi5zbGljZSgxKTtcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuICAgICAgaS0tO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgaGlkZU1lbnRpb24oKSB7XHJcbiAgICBpZiAodGhpcy5vdmVybGF5UmVmICYmIHRoaXMub3ZlcmxheVJlZi5oYXNBdHRhY2hlZCgpKSB7XHJcbiAgICAgIHRoaXMub3ZlcmxheVJlZi5kZXRhY2goKTtcclxuICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XHJcbiAgICAgIHRoaXMuaXNPcGVuID0gZmFsc2U7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBzaG93TWVudGlvbigpIHtcclxuICAgIHRoaXMuYXR0YWNoT3ZlcmxheSgpO1xyXG4gICAgdGhpcy5pc09wZW4gPSB0cnVlO1xyXG4gICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XHJcbiAgfVxyXG5cclxuICBhdHRhY2hPdmVybGF5KCkge1xyXG4gICAgaWYgKCF0aGlzLm92ZXJsYXlSZWYpIHtcclxuICAgICAgdGhpcy5wb3J0YWwgPSBuZXcgQ29tcG9uZW50UG9ydGFsKE1lbnRpb25Db21wb25lbnQsIHRoaXMudmlld0NvbnRhaW5lclJlZik7XHJcbiAgICAgIHRoaXMub3ZlcmxheVJlZiA9IHRoaXMub3ZlcmxheS5jcmVhdGUodGhpcy5nZXRPdmVybGF5Q29uZmlnKCkpO1xyXG4gICAgfVxyXG4gICAgaWYgKHRoaXMub3ZlcmxheVJlZiAmJiAhdGhpcy5vdmVybGF5UmVmLmhhc0F0dGFjaGVkKCkpIHtcclxuICAgICAgdGhpcy5tZW50aW9uUmVmID0gdGhpcy5vdmVybGF5UmVmLmF0dGFjaCh0aGlzLnBvcnRhbCk7XHJcbiAgICAgIHRoaXMubWVudGlvblJlZi5pbnN0YW5jZS5tZW50aW9uSGVhZGVyVGVtcGxhdGUgPSB0aGlzLm1lbnRpb25IZWFkZXJUZW1wbGF0ZTtcclxuICAgICAgdGhpcy5tZW50aW9uUmVmLmluc3RhbmNlLm1lbnRpb25JdGVtVGVtcGxhdGUgPSB0aGlzLm1lbnRpb25JdGVtVGVtcGxhdGU7XHJcbiAgICAgIHRoaXMubWVudGlvblJlZi5pbnN0YW5jZS5tZW50aW9uTm90Rm91bmRDb250ZW50ID0gdGhpcy5tZW50aW9uTm90Rm91bmRDb250ZW50O1xyXG4gICAgfVxyXG4gICAgdGhpcy51cGRhdGVQb3NpdGlvbnMoKTtcclxuICB9XHJcblxyXG4gIGdldE92ZXJsYXlDb25maWcoKSB7XHJcbiAgICBjb25zdCB0YXJnZXQgPSB0aGlzLmVsO1xyXG4gICAgcmV0dXJuIG5ldyBPdmVybGF5Q29uZmlnKHtcclxuICAgICAgcG9zaXRpb25TdHJhdGVneTogdGhpcy5nZXRPdmVybGF5UG9zaXRpb24odGFyZ2V0KSxcclxuICAgICAgc2Nyb2xsU3RyYXRlZ3k6IHRoaXMub3ZlcmxheS5zY3JvbGxTdHJhdGVnaWVzLnJlcG9zaXRpb24oKSxcclxuICAgICAgZGlzcG9zZU9uTmF2aWdhdGlvbjogdHJ1ZSxcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgZ2V0T3ZlcmxheVBvc2l0aW9uKHRhcmdldCkge1xyXG4gICAgY29uc3QgcG9zaXRpb25zID0gW1xyXG4gICAgICBuZXcgQ29ubmVjdGlvblBvc2l0aW9uUGFpcih7IG9yaWdpblg6ICdzdGFydCcsIG9yaWdpblk6ICdib3R0b20nIH0sIHsgb3ZlcmxheVg6ICdzdGFydCcsIG92ZXJsYXlZOiAndG9wJyB9KSxcclxuICAgICAgbmV3IENvbm5lY3Rpb25Qb3NpdGlvblBhaXIoeyBvcmlnaW5YOiAnc3RhcnQnLCBvcmlnaW5ZOiAndG9wJyB9LCB7IG92ZXJsYXlYOiAnc3RhcnQnLCBvdmVybGF5WTogJ2JvdHRvbScgfSksXHJcbiAgICBdO1xyXG4gICAgdGhpcy5wb3NpdGlvblN0cmF0ZWd5ID0gdGhpcy5vdmVybGF5XHJcbiAgICAgIC5wb3NpdGlvbigpXHJcbiAgICAgIC5mbGV4aWJsZUNvbm5lY3RlZFRvKHRhcmdldClcclxuICAgICAgLndpdGhQb3NpdGlvbnMocG9zaXRpb25zKVxyXG4gICAgICAud2l0aEZsZXhpYmxlRGltZW5zaW9ucyhmYWxzZSlcclxuICAgICAgLndpdGhQdXNoKGZhbHNlKTtcclxuICAgIHJldHVybiB0aGlzLnBvc2l0aW9uU3RyYXRlZ3k7XHJcbiAgfVxyXG5cclxuICB1cGRhdGVQb3NpdGlvbnMoKSB7XHJcbiAgICBjb25zdCBjb29yZGluYXRlcyA9IGdldENhcmV0Q29vcmRpbmF0ZXModGhpcy5uYXRpdmVFbGVtZW50LCB0aGlzLmN1cnNvckVuZCk7XHJcbiAgICBjb25zdCB0b3AgPSBjb29yZGluYXRlcy50b3AgLSB0aGlzLm5hdGl2ZUVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkuaGVpZ2h0IC0gdGhpcy5uYXRpdmVFbGVtZW50LnNjcm9sbFRvcDtcclxuICAgIGNvbnN0IGxlZnQgPSBjb29yZGluYXRlcy5sZWZ0IC0gdGhpcy5uYXRpdmVFbGVtZW50LnNjcm9sbExlZnQ7XHJcbiAgICB0aGlzLnBvc2l0aW9uU3RyYXRlZ3kud2l0aERlZmF1bHRPZmZzZXRYKGxlZnQpLndpdGhEZWZhdWx0T2Zmc2V0WSh0b3ApO1xyXG4gICAgdGhpcy5wb3NpdGlvblN0cmF0ZWd5LndpdGhQb3NpdGlvbnMoWy4uLkRFRkFVTFRfTUVOVElPTl9CT1RUT01fUE9TSVRJT05TXSk7XHJcbiAgICB0aGlzLnBvc2l0aW9uU3RyYXRlZ3kuYXBwbHkoKTtcclxuICAgIHRoaXMuc2V0TWVudGlvbkRhdGEoKTtcclxuICB9XHJcblxyXG4gIHN1Z2dlc3Rpb25zRmlsdGVyKHZhbHVlOiBzdHJpbmcsIGVtaXQ6IGJvb2xlYW4pIHtcclxuICAgIGlmICh0aGlzLnByZXZpb3VzVmFsdWUgPT09IHZhbHVlICYmIHZhbHVlICE9PSB0aGlzLmN1cnNvck1lbnRpb25bMF0pIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgdGhpcy5wcmV2aW91c1ZhbHVlID0gdmFsdWU7XHJcbiAgICBpZiAoZW1pdCkge1xyXG4gICAgICB0aGlzLm1lbnRpb25TZWFyY2hDaGFuZ2UuZW1pdCh7XHJcbiAgICAgICAgdmFsdWU6IHRoaXMudmFsdWUsXHJcbiAgICAgICAgdHJpZ2dlcjogdGhpcy5jdXJzb3JNZW50aW9uLFxyXG4gICAgICB9KTtcclxuICAgIH1cclxuICAgIGNvbnN0IHNlYXJjaFZhbHVlID0gdGhpcy52YWx1ZS50b0xvd2VyQ2FzZSgpO1xyXG4gICAgdGhpcy5maWx0ZXJTdWdnZXN0aW9ucyA9IHRoaXMubWVudGlvblN1Z2dlc3Rpb25zLmZpbHRlcigoc3VnZ2VzdGlvbikgPT5cclxuICAgICAgdGhpcy5tZW50aW9uVmFsdWVQYXJzZShzdWdnZXN0aW9uKS50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKHNlYXJjaFZhbHVlKVxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIHNldE1lbnRpb25EYXRhKCkge1xyXG4gICAgT2JqZWN0LmFzc2lnbih0aGlzLm1lbnRpb25SZWYuaW5zdGFuY2UsIHtcclxuICAgICAgc3VnZ2VzdGlvbnM6IHRoaXMuZmlsdGVyU3VnZ2VzdGlvbnMsXHJcbiAgICAgIGFjdGl2ZUluZGV4OiB0aGlzLmFjdGl2ZUluZGV4LFxyXG4gICAgICBsb2FkaW5nOiB0aGlzLm1lbnRpb25Mb2FkaW5nLFxyXG4gICAgICB0cmlnZ2VyOiB0aGlzLFxyXG4gICAgICBwb3NpdGlvbjogdGhpcy5tZW50aW9uUG9zaXRpb24sXHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHNlbGVjdFN1Z2dlc3Rpb24oc3VnZ2VzdGlvbikge1xyXG4gICAgY29uc3QgdmFsdWUgPSB0aGlzLm1lbnRpb25WYWx1ZVBhcnNlKHN1Z2dlc3Rpb24pO1xyXG4gICAgdGhpcy5pbnNlcnRNZW50aW9uKHtcclxuICAgICAgbWVudGlvbjogdmFsdWUsXHJcbiAgICAgIHN0YXJ0UG9zOiB0aGlzLmN1cnNvck1lbnRpb25TdGFydCxcclxuICAgICAgZW5kUG9zOiB0aGlzLmN1cnNvck1lbnRpb25FbmQsXHJcbiAgICB9KTtcclxuICAgIHRoaXMubWVudGlvblNlbGVjdEl0ZW0uZW1pdChzdWdnZXN0aW9uKTtcclxuICAgIHRoaXMuaGlkZU1lbnRpb24oKTtcclxuICAgIHRoaXMuYWN0aXZlSW5kZXggPSAtMTtcclxuICB9XHJcblxyXG4gIGluc2VydE1lbnRpb24obWVudGlvbjogTWVudGlvbikge1xyXG4gICAgY29uc3QgdmFsdWU6IHN0cmluZyA9IHRoaXMuZWwubmF0aXZlRWxlbWVudC52YWx1ZTtcclxuICAgIGNvbnN0IGluc2VydFZhbHVlID0gYCR7bWVudGlvbi5tZW50aW9uLnRyaW0oKX0ke3RoaXMubWVudGlvblNlcGFyYXRvclRvZ2dsZS5zdWZmaXggPyB0aGlzLm1lbnRpb25TZXBhcmF0b3IgOiAnJ31gO1xyXG4gICAgY29uc3QgbmV3VmFsdWUgPSBbdmFsdWUuc2xpY2UoMCwgbWVudGlvbi5zdGFydFBvcyArIDEpLCBpbnNlcnRWYWx1ZSwgdmFsdWUuc2xpY2UobWVudGlvbi5lbmRQb3MsIHZhbHVlLmxlbmd0aCldLmpvaW4oJycpO1xyXG4gICAgdGhpcy5lbC5uYXRpdmVFbGVtZW50LnZhbHVlID0gbmV3VmFsdWU7XHJcbiAgICB0aGlzLnZhbHVlID0gbmV3VmFsdWU7XHJcbiAgICBpZiAodGhpcy5uZ01vZGVsSW5zdGFuY2UpIHtcclxuICAgICAgdGhpcy5uZ01vZGVsSW5zdGFuY2UuY29udHJvbC5zZXRWYWx1ZShuZXdWYWx1ZSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBzZXRQcmV2aW91c0l0ZW1BY3RpdmUoKSB7XHJcbiAgICB0aGlzLmFjdGl2ZUluZGV4ID0gdGhpcy5hY3RpdmVJbmRleCAtIDEgPCAwID8gdGhpcy5maWx0ZXJTdWdnZXN0aW9ucy5sZW5ndGggLSAxIDogdGhpcy5hY3RpdmVJbmRleCAtIDE7XHJcbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcclxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICBpZiAodGhpcy5tZW50aW9uUmVmKSB7XHJcbiAgICAgICAgdGhpcy5tZW50aW9uUmVmLmluc3RhbmNlLnNjcm9sbFRvRm9jdXNJdGVtKCk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgc2V0TmV4dEl0ZW1BY3RpdmUoKSB7XHJcbiAgICB0aGlzLmFjdGl2ZUluZGV4ID0gdGhpcy5hY3RpdmVJbmRleCArIDEgPD0gdGhpcy5maWx0ZXJTdWdnZXN0aW9ucy5sZW5ndGggLSAxID8gdGhpcy5hY3RpdmVJbmRleCArIDEgOiAwO1xyXG4gICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XHJcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgaWYgKHRoaXMubWVudGlvblJlZikge1xyXG4gICAgICAgIHRoaXMubWVudGlvblJlZi5pbnN0YW5jZS5zY3JvbGxUb0ZvY3VzSXRlbSgpO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9XHJcbn1cclxuIl19