@ux-aspects/ux-aspects
Version:
Open source user interface framework for building modern, responsive, mobile big data applications
91 lines • 18.2 kB
JavaScript
import { ChangeDetectionStrategy, Component, ContentChild, EventEmitter, inject, Input, Output, TemplateRef } from '@angular/core';
import { Subject } from 'rxjs';
import { takeUntil } from 'rxjs/operators';
import { HierarchyBarNodeIconDirective } from './hierarchy-bar-node/hierarchy-bar-node-icon.directive';
import { HierarchyBarService } from './hierarchy-bar.service';
import * as i0 from "@angular/core";
import * as i1 from "@angular/common";
import * as i2 from "./hierarchy-bar-standard/hierarchy-bar-standard.component";
import * as i3 from "./hierarchy-bar-collapsed/hierarchy-bar-collapsed.component";
export class HierarchyBarComponent {
/** Define the root node of the hierarchy bar */
set root(node) {
this._hierarchyBar.setRootNode(node);
}
/** Define the selected node in the hierarchy bar */
set selected(node) {
this._hierarchyBar.selectNode(node);
}
/** Provide a custom loading indicator */
set loadingIndicator(loadingIndicator) {
this._hierarchyBar.loadingIndicator = loadingIndicator;
}
/** Provide a custom overflow template */
set overflowTemplate(overflowTemplate) {
this._hierarchyBar.overflowTemplate = overflowTemplate;
}
/** Define the events that show the popover when interacting with the arrows */
set popoverShowTriggers(popoverShowTriggers) {
this._hierarchyBar.popoverShowTriggers = popoverShowTriggers;
}
/** Define the events that hide the popover when interacting with the arrows */
set popoverHideTriggers(popoverHideTriggers) {
this._hierarchyBar.popoverHideTriggers = popoverHideTriggers;
}
/** Define the aria label for the show siblings popover button */
set showSiblingsAriaLabel(label) {
this._hierarchyBar.showSiblingsAriaLabel = label;
}
/** Allow a custom icon to be specified */
set icon(icon) {
this._hierarchyBar.icon = icon;
}
constructor() {
this._hierarchyBar = inject(HierarchyBarService);
/** Define which presentational mode we should display */
this.mode = 'standard';
/** hierarchy bar as being readonly - default false */
this.readonly = false;
/** Emit when the selected node changes */
this.selectedChange = new EventEmitter();
/** Unsubscribe from all subscriptions when component is destroyed */
this._onDestroy = new Subject();
// emit the latest selection value
this._hierarchyBar.selection$.pipe(takeUntil(this._onDestroy))
.subscribe(selection => this.selectedChange.next(selection));
}
ngOnDestroy() {
this._onDestroy.next();
this._onDestroy.complete();
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.12", ngImport: i0, type: HierarchyBarComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.12", type: HierarchyBarComponent, selector: "ux-hierarchy-bar", inputs: { mode: "mode", readonly: "readonly", root: "root", selected: "selected", loadingIndicator: "loadingIndicator", overflowTemplate: "overflowTemplate", popoverShowTriggers: "popoverShowTriggers", popoverHideTriggers: "popoverHideTriggers", showSiblingsAriaLabel: "showSiblingsAriaLabel" }, outputs: { selectedChange: "selectedChange" }, queries: [{ propertyName: "icon", first: true, predicate: HierarchyBarNodeIconDirective, descendants: true, read: TemplateRef }], ngImport: i0, template: "<!-- Hierarchy Bar - Standard Layout -->\n@if (mode !== 'collapsed') {\n <ux-hierarchy-bar-standard [readonly]=\"readonly\" [mode]=\"mode\">\n <!-- Forward the content to the correct layout -->\n <ng-container ngProjectAs=\"left-addons\" [ngTemplateOutlet]=\"leftAddons\"></ng-container>\n <ng-container ngProjectAs=\"trailing-addons\" [ngTemplateOutlet]=\"trailingAddons\"></ng-container>\n <ng-container ngProjectAs=\"right-addons\" [ngTemplateOutlet]=\"rightAddons\"></ng-container>\n </ux-hierarchy-bar-standard>\n}\n\n<!-- Hierarchy Bar - Collapsed Layout -->\n@if (mode === 'collapsed') {\n <ux-hierarchy-bar-collapsed [readonly]=\"readonly\">\n <!-- Forward the content to the correct layout -->\n <ng-container ngProjectAs=\"left-addons\" [ngTemplateOutlet]=\"leftAddons\"></ng-container>\n <ng-container ngProjectAs=\"trailing-addons\" [ngTemplateOutlet]=\"trailingAddons\"></ng-container>\n <ng-container ngProjectAs=\"right-addons\" [ngTemplateOutlet]=\"rightAddons\"></ng-container>\n </ux-hierarchy-bar-collapsed>\n}\n\n<!-- We can only have one ng-content so this allows us to use it more than once -->\n<ng-template #leftAddons>\n <ng-content select=\"[uxHierarchyBarLeftAddon]\"></ng-content>\n</ng-template>\n\n<ng-template #trailingAddons>\n <ng-content select=\"[uxHierarchyBarTrailingAddon]\"></ng-content>\n</ng-template>\n\n<ng-template #rightAddons>\n <ng-content select=\"[uxHierarchyBarRightAddon]\"></ng-content>\n</ng-template>", dependencies: [{ kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: i2.HierarchyBarStandardComponent, selector: "ux-hierarchy-bar-standard", inputs: ["mode", "readonly"] }, { kind: "component", type: i3.HierarchyBarCollapsedComponent, selector: "ux-hierarchy-bar-collapsed", inputs: ["readonly"] }], viewProviders: [HierarchyBarService], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.12", ngImport: i0, type: HierarchyBarComponent, decorators: [{
type: Component,
args: [{ selector: 'ux-hierarchy-bar', changeDetection: ChangeDetectionStrategy.OnPush, viewProviders: [HierarchyBarService], template: "<!-- Hierarchy Bar - Standard Layout -->\n@if (mode !== 'collapsed') {\n <ux-hierarchy-bar-standard [readonly]=\"readonly\" [mode]=\"mode\">\n <!-- Forward the content to the correct layout -->\n <ng-container ngProjectAs=\"left-addons\" [ngTemplateOutlet]=\"leftAddons\"></ng-container>\n <ng-container ngProjectAs=\"trailing-addons\" [ngTemplateOutlet]=\"trailingAddons\"></ng-container>\n <ng-container ngProjectAs=\"right-addons\" [ngTemplateOutlet]=\"rightAddons\"></ng-container>\n </ux-hierarchy-bar-standard>\n}\n\n<!-- Hierarchy Bar - Collapsed Layout -->\n@if (mode === 'collapsed') {\n <ux-hierarchy-bar-collapsed [readonly]=\"readonly\">\n <!-- Forward the content to the correct layout -->\n <ng-container ngProjectAs=\"left-addons\" [ngTemplateOutlet]=\"leftAddons\"></ng-container>\n <ng-container ngProjectAs=\"trailing-addons\" [ngTemplateOutlet]=\"trailingAddons\"></ng-container>\n <ng-container ngProjectAs=\"right-addons\" [ngTemplateOutlet]=\"rightAddons\"></ng-container>\n </ux-hierarchy-bar-collapsed>\n}\n\n<!-- We can only have one ng-content so this allows us to use it more than once -->\n<ng-template #leftAddons>\n <ng-content select=\"[uxHierarchyBarLeftAddon]\"></ng-content>\n</ng-template>\n\n<ng-template #trailingAddons>\n <ng-content select=\"[uxHierarchyBarTrailingAddon]\"></ng-content>\n</ng-template>\n\n<ng-template #rightAddons>\n <ng-content select=\"[uxHierarchyBarRightAddon]\"></ng-content>\n</ng-template>" }]
}], ctorParameters: () => [], propDecorators: { mode: [{
type: Input
}], readonly: [{
type: Input
}], root: [{
type: Input
}], selected: [{
type: Input
}], loadingIndicator: [{
type: Input
}], overflowTemplate: [{
type: Input
}], popoverShowTriggers: [{
type: Input
}], popoverHideTriggers: [{
type: Input
}], showSiblingsAriaLabel: [{
type: Input
}], selectedChange: [{
type: Output
}], icon: [{
type: ContentChild,
args: [HierarchyBarNodeIconDirective, { read: TemplateRef, static: false }]
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGllcmFyY2h5LWJhci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvY29tcG9uZW50cy9oaWVyYXJjaHktYmFyL2hpZXJhcmNoeS1iYXIuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vc3JjL2NvbXBvbmVudHMvaGllcmFyY2h5LWJhci9oaWVyYXJjaHktYmFyLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLFlBQVksRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFhLE1BQU0sRUFBRSxXQUFXLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDOUksT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUMvQixPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFM0MsT0FBTyxFQUFFLDZCQUE2QixFQUFFLE1BQU0sd0RBQXdELENBQUM7QUFDdkcsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0seUJBQXlCLENBQUM7Ozs7O0FBVzlELE1BQU0sT0FBTyxxQkFBcUI7SUFTOUIsZ0RBQWdEO0lBQ2hELElBQWEsSUFBSSxDQUFDLElBQXNCO1FBQ3BDLElBQUksQ0FBQyxhQUFhLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ3pDLENBQUM7SUFFRCxvREFBb0Q7SUFDcEQsSUFBYSxRQUFRLENBQUMsSUFBc0I7UUFDeEMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDeEMsQ0FBQztJQUVELHlDQUF5QztJQUN6QyxJQUFhLGdCQUFnQixDQUFDLGdCQUFtQztRQUM3RCxJQUFJLENBQUMsYUFBYSxDQUFDLGdCQUFnQixHQUFHLGdCQUFnQixDQUFDO0lBQzNELENBQUM7SUFFRCx5Q0FBeUM7SUFDekMsSUFBYSxnQkFBZ0IsQ0FBQyxnQkFBbUM7UUFDN0QsSUFBSSxDQUFDLGFBQWEsQ0FBQyxnQkFBZ0IsR0FBRyxnQkFBZ0IsQ0FBQztJQUMzRCxDQUFDO0lBRUQsK0VBQStFO0lBQy9FLElBQWEsbUJBQW1CLENBQUMsbUJBQXFDO1FBQ2xFLElBQUksQ0FBQyxhQUFhLENBQUMsbUJBQW1CLEdBQUcsbUJBQW1CLENBQUM7SUFDakUsQ0FBQztJQUVELCtFQUErRTtJQUMvRSxJQUFhLG1CQUFtQixDQUFDLG1CQUFxQztRQUNsRSxJQUFJLENBQUMsYUFBYSxDQUFDLG1CQUFtQixHQUFHLG1CQUFtQixDQUFDO0lBQ2pFLENBQUM7SUFFRCxpRUFBaUU7SUFDakUsSUFBYSxxQkFBcUIsQ0FBQyxLQUFhO1FBQzVDLElBQUksQ0FBQyxhQUFhLENBQUMscUJBQXFCLEdBQUcsS0FBSyxDQUFDO0lBQ3JELENBQUM7SUFLRCwwQ0FBMEM7SUFDMUMsSUFDSSxJQUFJLENBQUMsSUFBMEM7UUFDL0MsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDO0lBQ25DLENBQUM7SUFLRDtRQXZEaUIsa0JBQWEsR0FBRyxNQUFNLENBQUMsbUJBQW1CLENBQUMsQ0FBQztRQUU3RCx5REFBeUQ7UUFDaEQsU0FBSSxHQUFxQixVQUFVLENBQUM7UUFFN0Msc0RBQXNEO1FBQzdDLGFBQVEsR0FBWSxLQUFLLENBQUM7UUFxQ25DLDBDQUEwQztRQUNoQyxtQkFBYyxHQUFHLElBQUksWUFBWSxFQUFvQixDQUFDO1FBUWhFLHFFQUFxRTtRQUNwRCxlQUFVLEdBQUcsSUFBSSxPQUFPLEVBQVEsQ0FBQztRQUk5QyxrQ0FBa0M7UUFDbEMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7YUFDekQsU0FBUyxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQztJQUNyRSxDQUFDO0lBRUQsV0FBVztRQUNQLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDdkIsSUFBSSxDQUFDLFVBQVUsQ0FBQyxRQUFRLEVBQUUsQ0FBQztJQUMvQixDQUFDOytHQWxFUSxxQkFBcUI7bUdBQXJCLHFCQUFxQixpYkFnRGhCLDZCQUE2QiwyQkFBVSxXQUFXLDZCQ2hFcEUsKzhDQStCYywwY0RqQkssQ0FBQyxtQkFBbUIsQ0FBQzs7NEZBRTNCLHFCQUFxQjtrQkFOakMsU0FBUzsrQkFDSSxrQkFBa0IsbUJBRVgsdUJBQXVCLENBQUMsTUFBTSxpQkFDaEMsQ0FBQyxtQkFBbUIsQ0FBQzt3REFNM0IsSUFBSTtzQkFBWixLQUFLO2dCQUdHLFFBQVE7c0JBQWhCLEtBQUs7Z0JBR08sSUFBSTtzQkFBaEIsS0FBSztnQkFLTyxRQUFRO3NCQUFwQixLQUFLO2dCQUtPLGdCQUFnQjtzQkFBNUIsS0FBSztnQkFLTyxnQkFBZ0I7c0JBQTVCLEtBQUs7Z0JBS08sbUJBQW1CO3NCQUEvQixLQUFLO2dCQUtPLG1CQUFtQjtzQkFBL0IsS0FBSztnQkFLTyxxQkFBcUI7c0JBQWpDLEtBQUs7Z0JBS0ksY0FBYztzQkFBdkIsTUFBTTtnQkFJSCxJQUFJO3NCQURQLFlBQVk7dUJBQUMsNkJBQTZCLEVBQUUsRUFBRSxJQUFJLEVBQUUsV0FBVyxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSwgQ29tcG9uZW50LCBDb250ZW50Q2hpbGQsIEV2ZW50RW1pdHRlciwgaW5qZWN0LCBJbnB1dCwgT25EZXN0cm95LCBPdXRwdXQsIFRlbXBsYXRlUmVmIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBTdWJqZWN0IH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyB0YWtlVW50aWwgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBPdmVybGF5VHJpZ2dlciB9IGZyb20gJy4uL3Rvb2x0aXAvaW5kZXgnO1xuaW1wb3J0IHsgSGllcmFyY2h5QmFyTm9kZUljb25EaXJlY3RpdmUgfSBmcm9tICcuL2hpZXJhcmNoeS1iYXItbm9kZS9oaWVyYXJjaHktYmFyLW5vZGUtaWNvbi5kaXJlY3RpdmUnO1xuaW1wb3J0IHsgSGllcmFyY2h5QmFyU2VydmljZSB9IGZyb20gJy4vaGllcmFyY2h5LWJhci5zZXJ2aWNlJztcbmltcG9ydCB7IEhpZXJhcmNoeUJhckljb25Db250ZXh0IH0gZnJvbSAnLi9pbnRlcmZhY2VzL2hpZXJhcmNoeS1iYXItbm9kZS1pY29uLWNvbnRleHQuaW50ZXJmYWNlJztcbmltcG9ydCB7IEhpZXJhcmNoeUJhck5vZGUgfSBmcm9tICcuL2ludGVyZmFjZXMvaGllcmFyY2h5LWJhci1ub2RlLmludGVyZmFjZSc7XG5pbXBvcnQgeyBIaWVyYXJjaHlCYXJNb2RlLCBJSGllcmFjaHlCYXJDb21wb25lbnQgfSBmcm9tICcuL2ludGVyZmFjZXMvaGllcmFyY2h5LWJhci5pbnRlcmZhY2UnO1xuXG5AQ29tcG9uZW50KHtcbiAgICBzZWxlY3RvcjogJ3V4LWhpZXJhcmNoeS1iYXInLFxuICAgIHRlbXBsYXRlVXJsOiAnLi9oaWVyYXJjaHktYmFyLmNvbXBvbmVudC5odG1sJyxcbiAgICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgICB2aWV3UHJvdmlkZXJzOiBbSGllcmFyY2h5QmFyU2VydmljZV1cbn0pXG5leHBvcnQgY2xhc3MgSGllcmFyY2h5QmFyQ29tcG9uZW50IGltcGxlbWVudHMgSUhpZXJhY2h5QmFyQ29tcG9uZW50LCBPbkRlc3Ryb3kge1xuICAgIHByaXZhdGUgcmVhZG9ubHkgX2hpZXJhcmNoeUJhciA9IGluamVjdChIaWVyYXJjaHlCYXJTZXJ2aWNlKTtcblxuICAgIC8qKiBEZWZpbmUgd2hpY2ggcHJlc2VudGF0aW9uYWwgbW9kZSB3ZSBzaG91bGQgZGlzcGxheSAqL1xuICAgIEBJbnB1dCgpIG1vZGU6IEhpZXJhcmNoeUJhck1vZGUgPSAnc3RhbmRhcmQnO1xuXG4gICAgLyoqIGhpZXJhcmNoeSBiYXIgYXMgYmVpbmcgcmVhZG9ubHkgLSBkZWZhdWx0IGZhbHNlICovXG4gICAgQElucHV0KCkgcmVhZG9ubHk6IGJvb2xlYW4gPSBmYWxzZTtcblxuICAgIC8qKiBEZWZpbmUgdGhlIHJvb3Qgbm9kZSBvZiB0aGUgaGllcmFyY2h5IGJhciAqL1xuICAgIEBJbnB1dCgpIHNldCByb290KG5vZGU6IEhpZXJhcmNoeUJhck5vZGUpIHtcbiAgICAgICAgdGhpcy5faGllcmFyY2h5QmFyLnNldFJvb3ROb2RlKG5vZGUpO1xuICAgIH1cblxuICAgIC8qKiBEZWZpbmUgdGhlIHNlbGVjdGVkIG5vZGUgaW4gdGhlIGhpZXJhcmNoeSBiYXIgKi9cbiAgICBASW5wdXQoKSBzZXQgc2VsZWN0ZWQobm9kZTogSGllcmFyY2h5QmFyTm9kZSkge1xuICAgICAgICB0aGlzLl9oaWVyYXJjaHlCYXIuc2VsZWN0Tm9kZShub2RlKTtcbiAgICB9XG5cbiAgICAvKiogUHJvdmlkZSBhIGN1c3RvbSBsb2FkaW5nIGluZGljYXRvciAqL1xuICAgIEBJbnB1dCgpIHNldCBsb2FkaW5nSW5kaWNhdG9yKGxvYWRpbmdJbmRpY2F0b3I6IFRlbXBsYXRlUmVmPHZvaWQ+KSB7XG4gICAgICAgIHRoaXMuX2hpZXJhcmNoeUJhci5sb2FkaW5nSW5kaWNhdG9yID0gbG9hZGluZ0luZGljYXRvcjtcbiAgICB9XG5cbiAgICAvKiogUHJvdmlkZSBhIGN1c3RvbSBvdmVyZmxvdyB0ZW1wbGF0ZSAqL1xuICAgIEBJbnB1dCgpIHNldCBvdmVyZmxvd1RlbXBsYXRlKG92ZXJmbG93VGVtcGxhdGU6IFRlbXBsYXRlUmVmPHZvaWQ+KSB7XG4gICAgICAgIHRoaXMuX2hpZXJhcmNoeUJhci5vdmVyZmxvd1RlbXBsYXRlID0gb3ZlcmZsb3dUZW1wbGF0ZTtcbiAgICB9XG5cbiAgICAvKiogRGVmaW5lIHRoZSBldmVudHMgdGhhdCBzaG93IHRoZSBwb3BvdmVyIHdoZW4gaW50ZXJhY3Rpbmcgd2l0aCB0aGUgYXJyb3dzICovXG4gICAgQElucHV0KCkgc2V0IHBvcG92ZXJTaG93VHJpZ2dlcnMocG9wb3ZlclNob3dUcmlnZ2VyczogT3ZlcmxheVRyaWdnZXJbXSkge1xuICAgICAgICB0aGlzLl9oaWVyYXJjaHlCYXIucG9wb3ZlclNob3dUcmlnZ2VycyA9IHBvcG92ZXJTaG93VHJpZ2dlcnM7XG4gICAgfVxuXG4gICAgLyoqIERlZmluZSB0aGUgZXZlbnRzIHRoYXQgaGlkZSB0aGUgcG9wb3ZlciB3aGVuIGludGVyYWN0aW5nIHdpdGggdGhlIGFycm93cyAqL1xuICAgIEBJbnB1dCgpIHNldCBwb3BvdmVySGlkZVRyaWdnZXJzKHBvcG92ZXJIaWRlVHJpZ2dlcnM6IE92ZXJsYXlUcmlnZ2VyW10pIHtcbiAgICAgICAgdGhpcy5faGllcmFyY2h5QmFyLnBvcG92ZXJIaWRlVHJpZ2dlcnMgPSBwb3BvdmVySGlkZVRyaWdnZXJzO1xuICAgIH1cblxuICAgIC8qKiBEZWZpbmUgdGhlIGFyaWEgbGFiZWwgZm9yIHRoZSBzaG93IHNpYmxpbmdzIHBvcG92ZXIgYnV0dG9uICovXG4gICAgQElucHV0KCkgc2V0IHNob3dTaWJsaW5nc0FyaWFMYWJlbChsYWJlbDogc3RyaW5nKSB7XG4gICAgICAgIHRoaXMuX2hpZXJhcmNoeUJhci5zaG93U2libGluZ3NBcmlhTGFiZWwgPSBsYWJlbDtcbiAgICB9XG5cbiAgICAvKiogRW1pdCB3aGVuIHRoZSBzZWxlY3RlZCBub2RlIGNoYW5nZXMgKi9cbiAgICBAT3V0cHV0KCkgc2VsZWN0ZWRDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPEhpZXJhcmNoeUJhck5vZGU+KCk7XG5cbiAgICAvKiogQWxsb3cgYSBjdXN0b20gaWNvbiB0byBiZSBzcGVjaWZpZWQgKi9cbiAgICBAQ29udGVudENoaWxkKEhpZXJhcmNoeUJhck5vZGVJY29uRGlyZWN0aXZlLCB7IHJlYWQ6IFRlbXBsYXRlUmVmLCBzdGF0aWM6IGZhbHNlIH0pXG4gICAgc2V0IGljb24oaWNvbjogVGVtcGxhdGVSZWY8SGllcmFyY2h5QmFySWNvbkNvbnRleHQ+KSB7XG4gICAgICAgIHRoaXMuX2hpZXJhcmNoeUJhci5pY29uID0gaWNvbjtcbiAgICB9XG5cbiAgICAvKiogVW5zdWJzY3JpYmUgZnJvbSBhbGwgc3Vic2NyaXB0aW9ucyB3aGVuIGNvbXBvbmVudCBpcyBkZXN0cm95ZWQgKi9cbiAgICBwcml2YXRlIHJlYWRvbmx5IF9vbkRlc3Ryb3kgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xuXG4gICAgY29uc3RydWN0b3IoKSB7XG5cbiAgICAgICAgLy8gZW1pdCB0aGUgbGF0ZXN0IHNlbGVjdGlvbiB2YWx1ZVxuICAgICAgICB0aGlzLl9oaWVyYXJjaHlCYXIuc2VsZWN0aW9uJC5waXBlKHRha2VVbnRpbCh0aGlzLl9vbkRlc3Ryb3kpKVxuICAgICAgICAgICAgLnN1YnNjcmliZShzZWxlY3Rpb24gPT4gdGhpcy5zZWxlY3RlZENoYW5nZS5uZXh0KHNlbGVjdGlvbikpO1xuICAgIH1cblxuICAgIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgICAgICB0aGlzLl9vbkRlc3Ryb3kubmV4dCgpO1xuICAgICAgICB0aGlzLl9vbkRlc3Ryb3kuY29tcGxldGUoKTtcbiAgICB9XG59XG4iLCI8IS0tIEhpZXJhcmNoeSBCYXIgLSBTdGFuZGFyZCBMYXlvdXQgLS0+XG5AaWYgKG1vZGUgIT09ICdjb2xsYXBzZWQnKSB7XG4gIDx1eC1oaWVyYXJjaHktYmFyLXN0YW5kYXJkIFtyZWFkb25seV09XCJyZWFkb25seVwiIFttb2RlXT1cIm1vZGVcIj5cbiAgICA8IS0tIEZvcndhcmQgdGhlIGNvbnRlbnQgdG8gdGhlIGNvcnJlY3QgbGF5b3V0IC0tPlxuICAgIDxuZy1jb250YWluZXIgbmdQcm9qZWN0QXM9XCJsZWZ0LWFkZG9uc1wiIFtuZ1RlbXBsYXRlT3V0bGV0XT1cImxlZnRBZGRvbnNcIj48L25nLWNvbnRhaW5lcj5cbiAgICA8bmctY29udGFpbmVyIG5nUHJvamVjdEFzPVwidHJhaWxpbmctYWRkb25zXCIgW25nVGVtcGxhdGVPdXRsZXRdPVwidHJhaWxpbmdBZGRvbnNcIj48L25nLWNvbnRhaW5lcj5cbiAgICA8bmctY29udGFpbmVyIG5nUHJvamVjdEFzPVwicmlnaHQtYWRkb25zXCIgW25nVGVtcGxhdGVPdXRsZXRdPVwicmlnaHRBZGRvbnNcIj48L25nLWNvbnRhaW5lcj5cbiAgPC91eC1oaWVyYXJjaHktYmFyLXN0YW5kYXJkPlxufVxuXG48IS0tIEhpZXJhcmNoeSBCYXIgLSBDb2xsYXBzZWQgTGF5b3V0IC0tPlxuQGlmIChtb2RlID09PSAnY29sbGFwc2VkJykge1xuICA8dXgtaGllcmFyY2h5LWJhci1jb2xsYXBzZWQgW3JlYWRvbmx5XT1cInJlYWRvbmx5XCI+XG4gICAgPCEtLSBGb3J3YXJkIHRoZSBjb250ZW50IHRvIHRoZSBjb3JyZWN0IGxheW91dCAtLT5cbiAgICA8bmctY29udGFpbmVyIG5nUHJvamVjdEFzPVwibGVmdC1hZGRvbnNcIiBbbmdUZW1wbGF0ZU91dGxldF09XCJsZWZ0QWRkb25zXCI+PC9uZy1jb250YWluZXI+XG4gICAgPG5nLWNvbnRhaW5lciBuZ1Byb2plY3RBcz1cInRyYWlsaW5nLWFkZG9uc1wiIFtuZ1RlbXBsYXRlT3V0bGV0XT1cInRyYWlsaW5nQWRkb25zXCI+PC9uZy1jb250YWluZXI+XG4gICAgPG5nLWNvbnRhaW5lciBuZ1Byb2plY3RBcz1cInJpZ2h0LWFkZG9uc1wiIFtuZ1RlbXBsYXRlT3V0bGV0XT1cInJpZ2h0QWRkb25zXCI+PC9uZy1jb250YWluZXI+XG4gIDwvdXgtaGllcmFyY2h5LWJhci1jb2xsYXBzZWQ+XG59XG5cbjwhLS0gV2UgY2FuIG9ubHkgaGF2ZSBvbmUgbmctY29udGVudCBzbyB0aGlzIGFsbG93cyB1cyB0byB1c2UgaXQgbW9yZSB0aGFuIG9uY2UgLS0+XG48bmctdGVtcGxhdGUgI2xlZnRBZGRvbnM+XG4gIDxuZy1jb250ZW50IHNlbGVjdD1cIlt1eEhpZXJhcmNoeUJhckxlZnRBZGRvbl1cIj48L25nLWNvbnRlbnQ+XG48L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGUgI3RyYWlsaW5nQWRkb25zPlxuICA8bmctY29udGVudCBzZWxlY3Q9XCJbdXhIaWVyYXJjaHlCYXJUcmFpbGluZ0FkZG9uXVwiPjwvbmctY29udGVudD5cbjwvbmctdGVtcGxhdGU+XG5cbjxuZy10ZW1wbGF0ZSAjcmlnaHRBZGRvbnM+XG4gIDxuZy1jb250ZW50IHNlbGVjdD1cIlt1eEhpZXJhcmNoeUJhclJpZ2h0QWRkb25dXCI+PC9uZy1jb250ZW50PlxuPC9uZy10ZW1wbGF0ZT4iXX0=