@doku-dev/doku-fragment
Version:
A new Angular UI library that moving away from Bootstrap and built from scratch.
176 lines • 22.7 kB
JavaScript
import { CommonModule } from '@angular/common';
import { ChangeDetectionStrategy, Component, ContentChildren, EventEmitter, HostBinding, Input, Output, ViewEncapsulation, } from '@angular/core';
import { ReplaySubject, map, pairwise, shareReplay, startWith, takeUntil } from 'rxjs';
import { DOKU_TAB, DOKU_TABS } from './token';
import { ViewElement } from './view-element';
import * as i0 from "@angular/core";
export class DokuTabs {
constructor(elementRef, renderer, appRef) {
this.elementRef = elementRef;
this.renderer = renderer;
this.appRef = appRef;
/**
* Initial active id of the tab.
* Default to first tab.
*/
this.activeId = '';
/**
* Whether to use content card styles for the tab body.
*
* @default false
*/
this.useContentCard = false;
/**
* Listen to active tab change.
*/
this.activeTabChange = new EventEmitter();
this.classes = 'd-tabs';
this.destroy$ = new ReplaySubject();
/**
* It used in tab component.
*/
this.tabChangeForChild$ = this.activeTabChange
.asObservable()
.pipe(shareReplay(), takeUntil(this.destroy$));
}
ngAfterContentInit() {
// Create tabs header and body, then append them.
this.tabsHeaderElement = ViewElement.createTabsHeader({ renderer: this.renderer });
this.tabsBodyElement = ViewElement.createTabsBody({ renderer: this.renderer });
this.elementRef.nativeElement.append(this.tabsHeaderElement, this.tabsBodyElement);
// Set initial active tab
const activeId = this.tabItems?.first ? this.tabItems.first.id : null;
if (!this.isValidActiveId(this.activeId) && activeId) {
this.updateActiveId(activeId);
}
this.tabItems?.changes
.pipe(startWith(this.tabItems), map((items) => items.toArray()), startWith([]), pairwise(), takeUntil(this.destroy$))
.subscribe(([prevItems, currentItems]) => {
this.updateTabs(prevItems, currentItems);
this.notifyTabChange(this.activeId);
});
}
ngOnDestroy() {
this.destroy$.next(true);
this.destroy$.complete();
}
/**
* Change the active tab.
* @param id Tab id.
*/
changeActiveTab(id) {
this.updateActiveId(id, { emitTabChange: true });
}
updateActiveId(id, options) {
if (this.activeId === id)
return;
this.activeId = id;
if (options?.emitTabChange)
this.notifyTabChange(id);
}
notifyTabChange(itemId) {
const tab = this.getTabById(itemId);
if (!tab)
return;
this.activeTabChange.emit(tab);
}
getTabById(id) {
return this.tabItems?.find((tab) => tab.id === id) || null;
}
isValidActiveId(id) {
return !!this.tabItems?.some((tab) => tab.id === id);
}
/**
* Update tab elements when adding more or removing tab items.
*/
updateTabs(prevItems, currentItems) {
const removedItems = prevItems.filter((prevItem) => !currentItems.some((currentItem) => prevItem.id === currentItem.id));
const newItems = currentItems.filter((currentItem) => !prevItems.some((prevItem) => currentItem.id === prevItem.id));
removedItems.forEach((item) => {
this.removeTabLabel(item);
this.removeTabContent(item);
});
newItems.forEach((item) => {
this.addTabLabel(item);
this.addTabContent(item);
});
}
addTabLabel(item) {
if (!this.tabsHeaderElement || !item['labelTemplate'])
return;
if (item['labelElement'] || item['labelViewRef'])
return;
item['labelElement'] = ViewElement.createTabLabel({ renderer: this.renderer });
item['labelViewRef'] = ViewElement.appendLabelToTabsHeader({
applicationRef: this.appRef,
renderer: this.renderer,
headerElement: this.tabsHeaderElement,
labelElement: item['labelElement'],
labelTemplate: item['labelTemplate'],
});
}
removeTabLabel(item) {
item['labelElement']?.remove();
item['labelViewRef']?.destroy();
}
addTabContent(item) {
if (!this.tabsBodyElement || !item['contentTemplate'])
return;
if (item['contentElement'] || item['contentViewRef'])
return;
item['contentElement'] = ViewElement.createTabContent({ renderer: this.renderer });
item['contentViewRef'] = ViewElement.appendContentToTabsBody({
applicationRef: this.appRef,
renderer: this.renderer,
bodyElement: this.tabsBodyElement,
contentElement: item['contentElement'],
contentTemplate: item['contentTemplate'],
lazyLoad: item.lazyLoad,
});
}
removeTabContent(item) {
item['contentElement']?.remove();
item['contentViewRef']?.destroy();
}
}
DokuTabs.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: DokuTabs, deps: [{ token: i0.ElementRef }, { token: i0.Renderer2 }, { token: i0.ApplicationRef }], target: i0.ɵɵFactoryTarget.Component });
DokuTabs.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.9", type: DokuTabs, isStandalone: true, selector: "doku-tabs", inputs: { activeId: "activeId", useContentCard: "useContentCard" }, outputs: { activeTabChange: "activeTabChange" }, host: { properties: { "class.d-tabs-content-card": "this.useContentCard", "class": "this.classes" } }, providers: [
{
provide: DOKU_TABS,
useExisting: DokuTabs,
},
], queries: [{ propertyName: "tabItems", predicate: DOKU_TAB }], exportAs: ["dokuTabs"], ngImport: i0, template: '', isInline: true, dependencies: [{ kind: "ngmodule", type: CommonModule }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: DokuTabs, decorators: [{
type: Component,
args: [{
selector: 'doku-tabs',
exportAs: 'dokuTabs',
standalone: true,
imports: [CommonModule],
template: '',
encapsulation: ViewEncapsulation.None,
changeDetection: ChangeDetectionStrategy.OnPush,
providers: [
{
provide: DOKU_TABS,
useExisting: DokuTabs,
},
],
}]
}], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: i0.Renderer2 }, { type: i0.ApplicationRef }]; }, propDecorators: { activeId: [{
type: Input
}], useContentCard: [{
type: HostBinding,
args: ['class.d-tabs-content-card']
}, {
type: Input
}], activeTabChange: [{
type: Output
}], classes: [{
type: HostBinding,
args: ['class']
}], tabItems: [{
type: ContentChildren,
args: [DOKU_TAB, { descendants: false }]
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFicy5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9kb2t1LWZyYWdtZW50L3NyYy9saWIvdGFicy90YWJzLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsWUFBWSxFQUFXLE1BQU0saUJBQWlCLENBQUM7QUFDeEQsT0FBTyxFQUdMLHVCQUF1QixFQUN2QixTQUFTLEVBQ1QsZUFBZSxFQUVmLFlBQVksRUFDWixXQUFXLEVBQ1gsS0FBSyxFQUVMLE1BQU0sRUFHTixpQkFBaUIsR0FDbEIsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLGFBQWEsRUFBRSxHQUFHLEVBQUUsUUFBUSxFQUFFLFdBQVcsRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBRXZGLE9BQU8sRUFBRSxRQUFRLEVBQUUsU0FBUyxFQUFFLE1BQU0sU0FBUyxDQUFDO0FBQzlDLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQzs7QUFpQjdDLE1BQU0sT0FBTyxRQUFRO0lBc0NuQixZQUNVLFVBQXNCLEVBQ3RCLFFBQW1CLEVBQ25CLE1BQXNCO1FBRnRCLGVBQVUsR0FBVixVQUFVLENBQVk7UUFDdEIsYUFBUSxHQUFSLFFBQVEsQ0FBVztRQUNuQixXQUFNLEdBQU4sTUFBTSxDQUFnQjtRQXhDaEM7OztXQUdHO1FBQ00sYUFBUSxHQUFHLEVBQUUsQ0FBQztRQUV2Qjs7OztXQUlHO1FBR0gsbUJBQWMsR0FBRyxLQUFLLENBQUM7UUFFdkI7O1dBRUc7UUFDTyxvQkFBZSxHQUFHLElBQUksWUFBWSxFQUFXLENBQUM7UUFHckMsWUFBTyxHQUF1QixRQUFRLENBQUM7UUFPbEQsYUFBUSxHQUFHLElBQUksYUFBYSxFQUFFLENBQUM7UUFFdkM7O1dBRUc7UUFDTyx1QkFBa0IsR0FBRyxJQUFJLENBQUMsZUFBZTthQUNoRCxZQUFZLEVB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QUFXLEVBQUUsS0FBSyxFQUFFIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tbW9uTW9kdWxlLCBOZ0NsYXNzIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7XG4gIEFmdGVyQ29udGVudEluaXQsXG4gIEFwcGxpY2F0aW9uUmVmLFxuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgQ29tcG9uZW50LFxuICBDb250ZW50Q2hpbGRyZW4sXG4gIEVsZW1lbnRSZWYsXG4gIEV2ZW50RW1pdHRlcixcbiAgSG9zdEJpbmRpbmcsXG4gIElucHV0LFxuICBPbkRlc3Ryb3ksXG4gIE91dHB1dCxcbiAgUXVlcnlMaXN0LFxuICBSZW5kZXJlcjIsXG4gIFZpZXdFbmNhcHN1bGF0aW9uLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFJlcGxheVN1YmplY3QsIG1hcCwgcGFpcndpc2UsIHNoYXJlUmVwbGF5LCBzdGFydFdpdGgsIHRha2VVbnRpbCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgRG9rdVRhYiB9IGZyb20gJy4vdGFiLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBET0tVX1RBQiwgRE9LVV9UQUJTIH0gZnJvbSAnLi90b2tlbic7XG5pbXBvcnQgeyBWaWV3RWxlbWVudCB9IGZyb20gJy4vdmlldy1lbGVtZW50JztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnZG9rdS10YWJzJyxcbiAgZXhwb3J0QXM6ICdkb2t1VGFicycsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtDb21tb25Nb2R1bGVdLFxuICB0ZW1wbGF0ZTogJycsXG4gIGVuY2Fwc3VsYXRpb246IFZpZXdFbmNhcHN1bGF0aW9uLk5vbmUsXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxuICBwcm92aWRlcnM6IFtcbiAgICB7XG4gICAgICBwcm92aWRlOiBET0tVX1RBQlMsXG4gICAgICB1c2VFeGlzdGluZzogRG9rdVRhYnMsXG4gICAgfSxcbiAgXSxcbn0pXG5leHBvcnQgY2xhc3MgRG9rdVRhYnMgaW1wbGVtZW50cyBBZnRlckNvbnRlbnRJbml0LCBPbkRlc3Ryb3kge1xuICAvKipcbiAgICogSW5pdGlhbCBhY3RpdmUgaWQgb2YgdGhlIHRhYi5cbiAgICogRGVmYXVsdCB0byBmaXJzdCB0YWIuXG4gICAqL1xuICBASW5wdXQoKSBhY3RpdmVJZCA9ICcnO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIHVzZSBjb250ZW50IGNhcmQgc3R5bGVzIGZvciB0aGUgdGFiIGJvZHkuXG4gICAqXG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqL1xuICBASG9zdEJpbmRpbmcoJ2NsYXNzLmQtdGFicy1jb250ZW50LWNhcmQnKVxuICBASW5wdXQoKVxuICB1c2VDb250ZW50Q2FyZCA9IGZhbHNlO1xuXG4gIC8qKlxuICAgKiBMaXN0ZW4gdG8gYWN0aXZlIHRhYiBjaGFuZ2UuXG4gICAqL1xuICBAT3V0cHV0KCkgYWN0aXZlVGFiQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxEb2t1VGFiPigpO1xuXG4gIEBIb3N0QmluZGluZygnY2xhc3MnKVxuICBwcm90ZWN0ZWQgcmVhZG9ubHkgY2xhc3NlczogTmdDbGFzc1snbmdDbGFzcyddID0gJ2QtdGFicyc7XG5cbiAgQENvbnRlbnRDaGlsZHJlbihET0tVX1RBQiwgeyBkZXNjZW5kYW50czogZmFsc2UgfSkgcHJpdmF0ZSB0YWJJdGVtcz86IFF1ZXJ5TGlzdDxEb2t1VGFiPjtcblxuICBwcml2YXRlIHRhYnNIZWFkZXJFbGVtZW50PzogSFRNTERpdkVsZW1lbnQ7XG4gIHByaXZhdGUgdGFic0JvZHlFbGVtZW50PzogSFRNTERpdkVsZW1lbnQ7XG5cbiAgcHJpdmF0ZSBkZXN0cm95JCA9IG5ldyBSZXBsYXlTdWJqZWN0KCk7XG5cbiAgLyoqXG4gICAqIEl0IHVzZWQgaW4gdGFiIGNvbXBvbmVudC5cbiAgICovXG4gIHByb3RlY3RlZCB0YWJDaGFuZ2VGb3JDaGlsZCQgPSB0aGlzLmFjdGl2ZVRhYkNoYW5nZVxuICAgIC5hc09ic2VydmFibGUoKVxuICAgIC5waXBlKHNoYXJlUmVwbGF5KCksIHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSk7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBlbGVtZW50UmVmOiBFbGVtZW50UmVmLFxuICAgIHByaXZhdGUgcmVuZGVyZXI6IFJlbmRlcmVyMixcbiAgICBwcml2YXRlIGFwcFJlZjogQXBwbGljYXRpb25SZWZcbiAgKSB7fVxuXG4gIG5nQWZ0ZXJDb250ZW50SW5pdCgpOiB2b2lkIHtcbiAgICAvLyBDcmVhdGUgdGFicyBoZWFkZXIgYW5kIGJvZHksIHRoZW4gYXBwZW5kIHRoZW0uXG4gICAgdGhpcy50YWJzSGVhZGVyRWxlbWVudCA9IFZpZXdFbGVtZW50LmNyZWF0ZVRhYnNIZWFkZXIoeyByZW5kZXJlcjogdGhpcy5yZW5kZXJlciB9KTtcbiAgICB0aGlzLnRhYnNCb2R5RWxlbWVudCA9IFZpZXdFbGVtZW50LmNyZWF0ZVRhYnNCb2R5KHsgcmVuZGVyZXI6IHRoaXMucmVuZGVyZXIgfSk7XG4gICAgKHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50IGFzIEhUTUxFbGVtZW50KS5hcHBlbmQoXG4gICAgICB0aGlzLnRhYnNIZWFkZXJFbGVtZW50LFxuICAgICAgdGhpcy50YWJzQm9keUVsZW1lbnRcbiAgICApO1xuXG4gICAgLy8gU2V0IGluaXRpYWwgYWN0aXZlIHRhYlxuICAgIGNvbnN0IGFjdGl2ZUlkID0gdGhpcy50YWJJdGVtcz8uZmlyc3QgPyB0aGlzLnRhYkl0ZW1zLmZpcnN0LmlkIDogbnVsbDtcbiAgICBpZiAoIXRoaXMuaXNWYWxpZEFjdGl2ZUlkKHRoaXMuYWN0aXZlSWQpICYmIGFjdGl2ZUlkKSB7XG4gICAgICB0aGlzLnVwZGF0ZUFjdGl2ZUlkKGFjdGl2ZUlkKTtcbiAgICB9XG5cbiAgICB0aGlzLnRhYkl0ZW1zPy5jaGFuZ2VzXG4gICAgICAucGlwZShcbiAgICAgICAgc3RhcnRXaXRoKHRoaXMudGFiSXRlbXMpLFxuICAgICAgICBtYXAoKGl0ZW1zOiBRdWVyeUxpc3Q8RG9rdVRhYj4pID0+IGl0ZW1zLnRvQXJyYXkoKSksXG4gICAgICAgIHN0YXJ0V2l0aChbXSksXG4gICAgICAgIHBhaXJ3aXNlKCksXG4gICAgICAgIHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKVxuICAgICAgKVxuICAgICAgLnN1YnNjcmliZSgoW3ByZXZJdGVtcywgY3VycmVudEl0ZW1zXSkgPT4ge1xuICAgICAgICB0aGlzLnVwZGF0ZVRhYnMocHJldkl0ZW1zLCBjdXJyZW50SXRlbXMpO1xuICAgICAgICB0aGlzLm5vdGlmeVRhYkNoYW5nZSh0aGlzLmFjdGl2ZUlkKTtcbiAgICAgIH0pO1xuICB9XG5cbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgdGhpcy5kZXN0cm95JC5uZXh0KHRydWUpO1xuICAgIHRoaXMuZGVzdHJveSQuY29tcGxldGUoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGFuZ2UgdGhlIGFjdGl2ZSB0YWIuXG4gICAqIEBwYXJhbSBpZCBUYWIgaWQuXG4gICAqL1xuICBjaGFuZ2VBY3RpdmVUYWIoaWQ6IHN0cmluZykge1xuICAgIHRoaXMudXBkYXRlQWN0aXZlSWQoaWQsIHsgZW1pdFRhYkNoYW5nZTogdHJ1ZSB9KTtcbiAgfVxuXG4gIHByaXZhdGUgdXBkYXRlQWN0aXZlSWQoaWQ6IHN0cmluZywgb3B0aW9ucz86IHsgZW1pdFRhYkNoYW5nZT86IGJvb2xlYW4gfSkge1xuICAgIGlmICh0aGlzLmFjdGl2ZUlkID09PSBpZCkgcmV0dXJuO1xuICAgIHRoaXMuYWN0aXZlSWQgPSBpZDtcbiAgICBpZiAob3B0aW9ucz8uZW1pdFRhYkNoYW5nZSkgdGhpcy5ub3RpZnlUYWJDaGFuZ2UoaWQpO1xuICB9XG5cbiAgcHJpdmF0ZSBub3RpZnlUYWJDaGFuZ2UoaXRlbUlkOiBzdHJpbmcpIHtcbiAgICBjb25zdCB0YWIgPSB0aGlzLmdldFRhYkJ5SWQoaXRlbUlkKTtcbiAgICBpZiAoIXRhYikgcmV0dXJuO1xuICAgIHRoaXMuYWN0aXZlVGFiQ2hhbmdlLmVtaXQodGFiKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0VGFiQnlJZChpZDogc3RyaW5nKTogRG9rdVRhYiB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLnRhYkl0ZW1zPy5maW5kKCh0YWIpID0+IHRhYi5pZCA9PT0gaWQpIHx8IG51bGw7XG4gIH1cblxuICBwcml2YXRlIGlzVmFsaWRBY3RpdmVJZChpZDogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICEhdGhpcy50YWJJdGVtcz8uc29tZSgodGFiKSA9PiB0YWIuaWQgPT09IGlkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBVcGRhdGUgdGFiIGVsZW1lbnRzIHdoZW4gYWRkaW5nIG1vcmUgb3IgcmVtb3ZpbmcgdGFiIGl0ZW1zLlxuICAgKi9cbiAgcHJpdmF0ZSB1cGRhdGVUYWJzKHByZXZJdGVtczogRG9rdVRhYltdLCBjdXJyZW50SXRlbXM6IERva3VUYWJbXSkge1xuICAgIGNvbnN0IHJlbW92ZWRJdGVtcyA9IHByZXZJdGVtcy5maWx0ZXIoXG4gICAgICAocHJldkl0ZW0pID0+ICFjdXJyZW50SXRlbXMuc29tZSgoY3VycmVudEl0ZW0pID0+IHByZXZJdGVtLmlkID09PSBjdXJyZW50SXRlbS5pZClcbiAgICApO1xuICAgIGNvbnN0IG5ld0l0ZW1zID0gY3VycmVudEl0ZW1zLmZpbHRlcihcbiAgICAgIChjdXJyZW50SXRlbSkgPT4gIXByZXZJdGVtcy5zb21lKChwcmV2SXRlbSkgPT4gY3VycmVudEl0ZW0uaWQgPT09IHByZXZJdGVtLmlkKVxuICAgICk7XG5cbiAgICByZW1vdmVkSXRlbXMuZm9yRWFjaCgoaXRlbSkgPT4ge1xuICAgICAgdGhpcy5yZW1vdmVUYWJMYWJlbChpdGVtKTtcbiAgICAgIHRoaXMucmVtb3ZlVGFiQ29udGVudChpdGVtKTtcbiAgICB9KTtcblxuICAgIG5ld0l0ZW1zLmZvckVhY2goKGl0ZW0pID0+IHtcbiAgICAgIHRoaXMuYWRkVGFiTGFiZWwoaXRlbSk7XG4gICAgICB0aGlzLmFkZFRhYkNvbnRlbnQoaXRlbSk7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGFkZFRhYkxhYmVsKGl0ZW06IERva3VUYWIpIHtcbiAgICBpZiAoIXRoaXMudGFic0hlYWRlckVsZW1lbnQgfHwgIWl0ZW1bJ2xhYmVsVGVtcGxhdGUnXSkgcmV0dXJuO1xuICAgIGlmIChpdGVtWydsYWJlbEVsZW1lbnQnXSB8fCBpdGVtWydsYWJlbFZpZXdSZWYnXSkgcmV0dXJuO1xuXG4gICAgaXRlbVsnbGFiZWxFbGVtZW50J10gPSBWaWV3RWxlbWVudC5jcmVhdGVUYWJMYWJlbCh7IHJlbmRlcmVyOiB0aGlzLnJlbmRlcmVyIH0pO1xuICAgIGl0ZW1bJ2xhYmVsVmlld1JlZiddID0gVmlld0VsZW1lbnQuYXBwZW5kTGFiZWxUb1RhYnNIZWFkZXIoe1xuICAgICAgYXBwbGljYXRpb25SZWY6IHRoaXMuYXBwUmVmLFxuICAgICAgcmVuZGVyZXI6IHRoaXMucmVuZGVyZXIsXG4gICAgICBoZWFkZXJFbGVtZW50OiB0aGlzLnRhYnNIZWFkZXJFbGVtZW50LFxuICAgICAgbGFiZWxFbGVtZW50OiBpdGVtWydsYWJlbEVsZW1lbnQnXSxcbiAgICAgIGxhYmVsVGVtcGxhdGU6IGl0ZW1bJ2xhYmVsVGVtcGxhdGUnXSxcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgcmVtb3ZlVGFiTGFiZWwoaXRlbTogRG9rdVRhYikge1xuICAgIGl0ZW1bJ2xhYmVsRWxlbWVudCddPy5yZW1vdmUoKTtcbiAgICBpdGVtWydsYWJlbFZpZXdSZWYnXT8uZGVzdHJveSgpO1xuICB9XG5cbiAgcHJpdmF0ZSBhZGRUYWJDb250ZW50KGl0ZW06IERva3VUYWIpIHtcbiAgICBpZiAoIXRoaXMudGFic0JvZHlFbGVtZW50IHx8ICFpdGVtWydjb250ZW50VGVtcGxhdGUnXSkgcmV0dXJuO1xuICAgIGlmIChpdGVtWydjb250ZW50RWxlbWVudCddIHx8IGl0ZW1bJ2NvbnRlbnRWaWV3UmVmJ10pIHJldHVybjtcblxuICAgIGl0ZW1bJ2NvbnRlbnRFbGVtZW50J10gPSBWaWV3RWxlbWVudC5jcmVhdGVUYWJDb250ZW50KHsgcmVuZGVyZXI6IHRoaXMucmVuZGVyZXIgfSk7XG4gICAgaXRlbVsnY29udGVudFZpZXdSZWYnXSA9IFZpZXdFbGVtZW50LmFwcGVuZENvbnRlbnRUb1RhYnNCb2R5KHtcbiAgICAgIGFwcGxpY2F0aW9uUmVmOiB0aGlzLmFwcFJlZixcbiAgICAgIHJlbmRlcmVyOiB0aGlzLnJlbmRlcmVyLFxuICAgICAgYm9keUVsZW1lbnQ6IHRoaXMudGFic0JvZHlFbGVtZW50LFxuICAgICAgY29udGVudEVsZW1lbnQ6IGl0ZW1bJ2NvbnRlbnRFbGVtZW50J10sXG4gICAgICBjb250ZW50VGVtcGxhdGU6IGl0ZW1bJ2NvbnRlbnRUZW1wbGF0ZSddLFxuICAgICAgbGF6eUxvYWQ6IGl0ZW0ubGF6eUxvYWQsXG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIHJlbW92ZVRhYkNvbnRlbnQoaXRlbTogRG9rdVRhYikge1xuICAgIGl0ZW1bJ2NvbnRlbnRFbGVtZW50J10/LnJlbW92ZSgpO1xuICAgIGl0ZW1bJ2NvbnRlbnRWaWV3UmVmJ10/LmRlc3Ryb3koKTtcbiAgfVxufVxuIl19