@c8y/ngx-components
Version:
Angular modules for Cumulocity IoT applications
138 lines • 18.3 kB
JavaScript
import { Injectable, InjectionToken, Injector, ViewContainerRef } from '@angular/core';
import { Router } from '@angular/router';
import { TranslateService } from '@ngx-translate/core';
import { distinctUntilChanged, filter, first, map, shareReplay } from 'rxjs/operators';
import { fromTrigger, hookGeneric, getInjectedHooks, stateToFactory, ExtensionPointForPlugins } from '../common/extension-hooks';
import { OptionsService } from '../common/options.service';
import { PluginsResolveService } from '../plugins/plugins-resolve.service';
import * as i0 from "@angular/core";
import * as i1 from "@angular/router";
import * as i2 from "@ngx-translate/core";
import * as i3 from "../common/options.service";
import * as i4 from "../plugins/plugins-resolve.service";
/**
* A hook to use for Multi Provider extension.
* @deprecated Consider using the `hookTab` function instead.
*/
export const HOOK_TABS = new InjectionToken('HOOK_TABS');
/**
* You can either provide a single `Tab` as parameter:
* ```typescript
* hookTab(...)
* ```
*
* Or an array to directly register multiple:
* ```typescript
* hookTab([...])
* ```
*
* Or you provide an Service that implements `ExtensionFactory<Tab>`
* ```typescript
* export class MyTabFactory implements ExtensionFactory<Tab> {...}
* ...
* hookTab(MyTabFactory)
* ```
* A typed alternative to `HOOK_TABS`.
* @param tabs The `Tab`'s or `ExtensionFactory` to be provided.
* @returns An `Provider` to be provided in your module.
*/
export function hookTab(tabs, options) {
return hookGeneric(tabs, HOOK_TABS, options);
}
/**
* A service which defines the used tabs.
*/
export class TabsService extends ExtensionPointForPlugins {
constructor(rootInjector, router, translateService, options, plugins) {
super(rootInjector, plugins);
this.router = router;
this.translateService = translateService;
this.options = options;
this.items$ = this.setupItemsObservable();
this.orientation$ = this.items$.pipe(map((tabs) => {
const firstTabWithDefinedOrientation = tabs.find(tab => tab.orientation);
if (firstTabWithDefinedOrientation) {
return firstTabWithDefinedOrientation.orientation;
}
return this.options.tabsHorizontal ? 'horizontal' : 'vertical';
}), distinctUntilChanged());
}
prepareTabs(tabs) {
return this.sortTabs(tabs
.map(tab => {
tab.template = tab.template instanceof ViewContainerRef ? tab.template : undefined;
return tab;
})
.filter((tab, index, self) => tab.component || index === self.findIndex(t => t.path === tab.path) || !!tab.tabsOutlet));
}
sortTabs(tabs) {
return tabs.sort((a, b) => {
const priorityOrder = (b.priority || 0) - (a.priority || 0);
if (!!priorityOrder) {
return priorityOrder;
}
if (!a.label) {
return 1;
}
if (!b.label) {
return -1;
}
const aTranslatedLabel = this.translateService.instant(a.label);
const bTranslatedLabel = this.translateService.instant(b.label);
const translatedLabelOrder = aTranslatedLabel.localeCompare(bTranslatedLabel);
return translatedLabelOrder;
});
}
/**
* Returns the current state.
* @readonly
* @returns The current set of actions.
*/
get state() {
return this.state$.value;
}
/**
* Adds a new item to tabs and emits state change
* @param item The item to add.
*/
add(item) {
this.state.add(item);
this.emitNewState();
}
/**
* Removes a tab and emits a state change.
* @param item The item to remove.
*/
remove(item) {
this.state.delete(item);
this.emitNewState();
}
get firstTab$() {
return this.items$.pipe(map(tabs => tabs[0]), filter(Boolean), first());
}
/**
* Checks if at least one of the tabs is available.
* @param tabLabels The array of tab labels to check.
* @returns Returns true if at least one of the tabs is available.
*/
areAvailable(tabLabels) {
const currentTabsSetArray = Array.from(this.state);
return tabLabels.some(tabLabel => currentTabsSetArray.some(tab => tab.label === tabLabel));
}
setupItemsObservable() {
return fromTrigger(this.router, this.refresh$, [
getInjectedHooks(HOOK_TABS, this.injectors),
() => this.factories,
stateToFactory(this.state$)
]).pipe(distinctUntilChanged(), map(tabs => this.prepareTabs(tabs)), shareReplay(1));
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: TabsService, deps: [{ token: i0.Injector }, { token: i1.Router }, { token: i2.TranslateService }, { token: i3.OptionsService }, { token: i4.PluginsResolveService }], target: i0.ɵɵFactoryTarget.Injectable }); }
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: TabsService, providedIn: 'root' }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: TabsService, decorators: [{
type: Injectable,
args: [{
providedIn: 'root'
}]
}], ctorParameters: () => [{ type: i0.Injector }, { type: i1.Router }, { type: i2.TranslateService }, { type: i3.OptionsService }, { type: i4.PluginsResolveService }] });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFicy5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vY29yZS90YWJzL3RhYnMuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLGNBQWMsRUFBRSxRQUFRLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDdkYsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ3pDLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBRXZELE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLEdBQUcsRUFBRSxXQUFXLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUN2RixPQUFPLEVBRUwsV0FBVyxFQUVYLFdBQVcsRUFDWCxnQkFBZ0IsRUFDaEIsY0FBYyxFQUNkLHdCQUF3QixFQUV6QixNQUFNLDJCQUEyQixDQUFDO0FBQ25DLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUMzRCxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQzs7Ozs7O0FBdUIzRTs7O0dBR0c7QUFDSCxNQUFNLENBQUMsTUFBTSxTQUFTLEdBQUcsSUFBSSxjQUFjLENBQWlCLFdBQVcsQ0FBQyxDQUFDO0FBRXpFOzs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQW9CRztBQUNILE1BQU0sVUFBVSxPQUFPLENBQUMsSUFBMEIsRUFBRSxPQUFxQztJQUN2RixPQUFPLFdBQVcsQ0FBTSxJQUFJLEVBQUUsU0FBUyxFQUFFLE9BQU8sQ0FBQyxDQUFDO0FBQ3BELENBQUM7QUFFRDs7R0FFRztBQUlILE1BQU0sT0FBTyxXQUFZLFNBQVEsd0JBQTZCO0lBSTVELFlBQ0UsWUFBc0IsRUFDZCxNQUFjLEVBQ2QsZ0JBQWtDLEVBQ2xDLE9BQXVCLEVBQy9CLE9BQThCO1FBRTlCLEtBQUssQ0FBQyxZQUFZLEVB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SSxDQUFDLENBQUMsRUFDbkMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUNmLENBQUM7SUFDSixDQUFDOytHQXZIVSxXQUFXO21IQUFYLFdBQVcsY0FGVixNQUFNOzs0RkFFUCxXQUFXO2tCQUh2QixVQUFVO21CQUFDO29CQUNWLFVBQVUsRUFBRSxNQUFNO2lCQUNuQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUsIEluamVjdGlvblRva2VuLCBJbmplY3RvciwgVmlld0NvbnRhaW5lclJlZiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgUm91dGVyIH0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcbmltcG9ydCB7IFRyYW5zbGF0ZVNlcnZpY2UgfSBmcm9tICdAbmd4LXRyYW5zbGF0ZS9jb3JlJztcbmltcG9ydCB7IE9ic2VydmFibGUgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IGRpc3RpbmN0VW50aWxDaGFuZ2VkLCBmaWx0ZXIsIGZpcnN0LCBtYXAsIHNoYXJlUmVwbGF5IH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHtcbiAgRXh0ZW5zaW9uRmFjdG9yeSxcbiAgZnJvbVRyaWdnZXIsXG4gIEdlbmVyaWNIb29rVHlwZSxcbiAgaG9va0dlbmVyaWMsXG4gIGdldEluamVjdGVkSG9va3MsXG4gIHN0YXRlVG9GYWN0b3J5LFxuICBFeHRlbnNpb25Qb2ludEZvclBsdWdpbnMsXG4gIEdlbmVyaWNIb29rT3B0aW9uc1xufSBmcm9tICcuLi9jb21tb24vZXh0ZW5zaW9uLWhvb2tzJztcbmltcG9ydCB7IE9wdGlvbnNTZXJ2aWNlIH0gZnJvbSAnLi4vY29tbW9uL29wdGlvbnMuc2VydmljZSc7XG5pbXBvcnQgeyBQbHVnaW5zUmVzb2x2ZVNlcnZpY2UgfSBmcm9tICcuLi9wbHVnaW5zL3BsdWdpbnMtcmVzb2x2ZS5zZXJ2aWNlJztcbmltcG9ydCB7IFRhYiB9IGZyb20gJy4vdGFiLm1vZGVsJztcblxuLyoqXG4gKiBBbiBleHRlbnNpb24gSE9PSyBjYW4gdXNlIGVpdGhlciBhIHB1cmUgdmFsdWU6XG4gKiBgYGB0eXBlc2NyaXB0XG4gKiAgeyBwcm92aWRlOiBIT09LX1gsIHVzZVZhbHVlOiB7IC4uLmhvb2tWYWx1ZSB9LCBtdWx0aTogdHJ1ZSB9XG4gKiBgYGBcbiAqXG4gKiBPciBhbiBhcnJheSB0byBkaXJlY3RseSByZWdpc3RlciBtdWx0aXBsZTpcbiAqIGBgYHR5cGVzY3JpcHRcbiAqICB7IHByb3ZpZGU6IEhPT0tfWCwgdXNlVmFsdWU6IFt7IC4uLmhvb2tWYWx1ZXMgfV0sIG11bHRpOiB0cnVlIH1cbiAqIGBgYFxuICpcbiAqIE9yIGFuIEV4dGVuc2lvbkZhY3Rvcnkgd2hpY2ggYWxsb3dzIHRvIGRlZmluZSBhIGdldCgpIGZ1bmN0aW9uLiBUaGlzIGZ1bmN0aW9uXG4gKiBnZXRzIGNhbGxlZCBvbiBlYWNoIG5hdmlnYXRpb24gd2l0aCB0aGUgY3VycmVudCByb3V0ZSBhbmQgY2FuIHJldHVybiB2YWx1ZXNcbiAqIGFzeW5jIChvYnNlcnZhYmxlIG9yIHByb21pc2UpLlxuICogYGBgdHlwZXNjcmlwdFxuICogIHsgcHJvdmlkZTogSE9PS19YLCB1c2VGYWN0b3J5OiB7IGdldDogKHJvdXRlKSA9PiBkb1NvbWV0aGluZ0FzeW5jKHJvdXRlKSB9LCBtdWx0aTogdHJ1ZSB9XG4gKiBgYGBcbiAqL1xuZXhwb3J0IHR5cGUgVGFiRXh0ZW5zaW9uID0gVGFiIHwgVGFiW10gfCBFeHRlbnNpb25GYWN0b3J5PFRhYj47XG5cbi8qKlxuICogQSBob29rIHRvIHVzZSBmb3IgTXVsdGkgUHJvdmlkZXIgZXh0ZW5zaW9uLlxuICogQGRlcHJlY2F0ZWQgQ29uc2lkZXIgdXNpbmcgdGhlIGBob29rVGFiYCBmdW5jdGlvbiBpbnN0ZWFkLlxuICovXG5leHBvcnQgY29uc3QgSE9PS19UQUJTID0gbmV3IEluamVjdGlvblRva2VuPFRhYkV4dGVuc2lvbltdPignSE9PS19UQUJTJyk7XG5cbi8qKlxuICogWW91IGNhbiBlaXRoZXIgcHJvdmlkZSBhIHNpbmdsZSBgVGFiYCBhcyBwYXJhbWV0ZXI6XG4gKiBgYGB0eXBlc2NyaXB0XG4gKiAgaG9va1RhYiguLi4pXG4gKiBgYGBcbiAqXG4gKiBPciBhbiBhcnJheSB0byBkaXJlY3RseSByZWdpc3RlciBtdWx0aXBsZTpcbiAqIGBgYHR5cGVzY3JpcHRcbiAqICBob29rVGFiKFsuLi5dKVxuICogYGBgXG4gKlxuICogT3IgeW91IHByb3ZpZGUgYW4gU2VydmljZSB0aGF0IGltcGxlbWVudHMgYEV4dGVuc2lvbkZhY3Rvcnk8VGFiPmBcbiAqIGBgYHR5cGVzY3JpcHRcbiAqICBleHBvcnQgY2xhc3MgTXlUYWJGYWN0b3J5IGltcGxlbWVudHMgRXh0ZW5zaW9uRmFjdG9yeTxUYWI+IHsuLi59XG4gKiAgLi4uXG4gKiAgaG9va1RhYihNeVRhYkZhY3RvcnkpXG4gKiBgYGBcbiAqIEEgdHlwZWQgYWx0ZXJuYXRpdmUgdG8gYEhPT0tfVEFCU2AuXG4gKiBAcGFyYW0gdGFicyBUaGUgYFRhYmAncyBvciBgRXh0ZW5zaW9uRmFjdG9yeWAgdG8gYmUgcHJvdmlkZWQuXG4gKiBAcmV0dXJucyBBbiBgUHJvdmlkZXJgIHRvIGJlIHByb3ZpZGVkIGluIHlvdXIgbW9kdWxlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaG9va1RhYih0YWJzOiBHZW5lcmljSG9va1R5cGU8VGFiPiwgb3B0aW9ucz86IFBhcnRpYWw8R2VuZXJpY0hvb2tPcHRpb25zPikge1xuICByZXR1cm4gaG9va0dlbmVyaWM8VGFiPih0YWJzLCBIT09LX1RBQlMsIG9wdGlvbnMpO1xufVxuXG4vKipcbiAqIEEgc2VydmljZSB3aGljaCBkZWZpbmVzIHRoZSB1c2VkIHRhYnMuXG4gKi9cbkBJbmplY3RhYmxlKHtcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnXG59KVxuZXhwb3J0IGNsYXNzIFRhYnNTZXJ2aWNlIGV4dGVuZHMgRXh0ZW5zaW9uUG9pbnRGb3JQbHVnaW5zPFRhYj4ge1xuICBpdGVtcyQ6IE9ic2VydmFibGU8VGFiW10+O1xuICBvcmllbnRhdGlvbiQ6IE9ic2VydmFibGU8J3ZlcnRpY2FsJyB8ICdob3Jpem9udGFsJz47XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcm9vdEluamVjdG9yOiBJbmplY3RvcixcbiAgICBwcml2YXRlIHJvdXRlcjogUm91dGVyLFxuICAgIHByaXZhdGUgdHJhbnNsYXRlU2VydmljZTogVHJhbnNsYXRlU2VydmljZSxcbiAgICBwcml2YXRlIG9wdGlvbnM6IE9wdGlvbnNTZXJ2aWNlLFxuICAgIHBsdWdpbnM6IFBsdWdpbnNSZXNvbHZlU2VydmljZVxuICApIHtcbiAgICBzdXBlcihyb290SW5qZWN0b3IsIHBsdWdpbnMpO1xuICAgIHRoaXMuaXRlbXMkID0gdGhpcy5zZXR1cEl0ZW1zT2JzZXJ2YWJsZSgpO1xuXG4gICAgdGhpcy5vcmllbnRhdGlvbiQgPSB0aGlzLml0ZW1zJC5waXBlKFxuICAgICAgbWFwKCh0YWJzOiBUYWJbXSkgPT4ge1xuICAgICAgICBjb25zdCBmaXJzdFRhYldpdGhEZWZpbmVkT3JpZW50YXRpb24gPSB0YWJzLmZpbmQodGFiID0+IHRhYi5vcmllbnRhdGlvbik7XG4gICAgICAgIGlmIChmaXJzdFRhYldpdGhEZWZpbmVkT3JpZW50YXRpb24pIHtcbiAgICAgICAgICByZXR1cm4gZmlyc3RUYWJXaXRoRGVmaW5lZE9yaWVudGF0aW9uLm9yaWVudGF0aW9uO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLm9wdGlvbnMudGFic0hvcml6b250YWwgPyAnaG9yaXpvbnRhbCcgOiAndmVydGljYWwnO1xuICAgICAgfSksXG4gICAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZCgpXG4gICAgKTtcbiAgfVxuXG4gIHByZXBhcmVUYWJzKHRhYnMpIHtcbiAgICByZXR1cm4gdGhpcy5zb3J0VGFicyhcbiAgICAgIHRhYnNcbiAgICAgICAgLm1hcCh0YWIgPT4ge1xuICAgICAgICAgIHRhYi50ZW1wbGF0ZSA9IHRhYi50ZW1wbGF0ZSBpbnN0YW5jZW9mIFZpZXdDb250YWluZXJSZWYgPyB0YWIudGVtcGxhdGUgOiB1bmRlZmluZWQ7XG4gICAgICAgICAgcmV0dXJuIHRhYjtcbiAgICAgICAgfSlcbiAgICAgICAgLmZpbHRlcihcbiAgICAgICAgICAodGFiLCBpbmRleCwgc2VsZikgPT5cbiAgICAgICAgICAgIHRhYi5jb21wb25lbnQgfHwgaW5kZXggPT09IHNlbGYuZmluZEluZGV4KHQgPT4gdC5wYXRoID09PSB0YWIucGF0aCkgfHwgISF0YWIudGFic091dGxldFxuICAgICAgICApXG4gICAgKTtcbiAgfVxuXG4gIHNvcnRUYWJzKHRhYnMpIHtcbiAgICByZXR1cm4gdGFicy5zb3J0KChhLCBiKSA9PiB7XG4gICAgICBjb25zdCBwcmlvcml0eU9yZGVyID0gKGIucHJpb3JpdHkgfHwgMCkgLSAoYS5wcmlvcml0eSB8fCAwKTtcblxuICAgICAgaWYgKCEhcHJpb3JpdHlPcmRlcikge1xuICAgICAgICByZXR1cm4gcHJpb3JpdHlPcmRlcjtcbiAgICAgIH1cblxuICAgICAgaWYgKCFhLmxhYmVsKSB7XG4gICAgICAgIHJldHVybiAxO1xuICAgICAgfVxuXG4gICAgICBpZiAoIWIubGFiZWwpIHtcbiAgICAgICAgcmV0dXJuIC0xO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBhVHJhbnNsYXRlZExhYmVsID0gdGhpcy50cmFuc2xhdGVTZXJ2aWNlLmluc3RhbnQoYS5sYWJlbCk7XG4gICAgICBjb25zdCBiVHJhbnNsYXRlZExhYmVsID0gdGhpcy50cmFuc2xhdGVTZXJ2aWNlLmluc3RhbnQoYi5sYWJlbCk7XG4gICAgICBjb25zdCB0cmFuc2xhdGVkTGFiZWxPcmRlciA9IGFUcmFuc2xhdGVkTGFiZWwubG9jYWxlQ29tcGFyZShiVHJhbnNsYXRlZExhYmVsKTtcblxuICAgICAgcmV0dXJuIHRyYW5zbGF0ZWRMYWJlbE9yZGVyO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIGN1cnJlbnQgc3RhdGUuXG4gICAqIEByZWFkb25seVxuICAgKiBAcmV0dXJucyBUaGUgY3VycmVudCBzZXQgb2YgYWN0aW9ucy5cbiAgICovXG4gIGdldCBzdGF0ZSgpOiBTZXQ8VGFiPiB7XG4gICAgcmV0dXJuIHRoaXMuc3RhdGUkLnZhbHVlO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgYSBuZXcgaXRlbSB0byB0YWJzIGFuZCBlbWl0cyBzdGF0ZSBjaGFuZ2VcbiAgICogQHBhcmFtIGl0ZW0gVGhlIGl0ZW0gdG8gYWRkLlxuICAgKi9cbiAgYWRkKGl0ZW06IFRhYikge1xuICAgIHRoaXMuc3RhdGUuYWRkKGl0ZW0pO1xuICAgIHRoaXMuZW1pdE5ld1N0YXRlKCk7XG4gIH1cblxuICAvKipcbiAgICogUmVtb3ZlcyBhIHRhYiBhbmQgZW1pdHMgYSBzdGF0ZSBjaGFuZ2UuXG4gICAqIEBwYXJhbSBpdGVtIFRoZSBpdGVtIHRvIHJlbW92ZS5cbiAgICovXG4gIHJlbW92ZShpdGVtOiBUYWIpIHtcbiAgICB0aGlzLnN0YXRlLmRlbGV0ZShpdGVtKTtcbiAgICB0aGlzLmVtaXROZXdTdGF0ZSgpO1xuICB9XG5cbiAgZ2V0IGZpcnN0VGFiJCgpIHtcbiAgICByZXR1cm4gdGhpcy5pdGVtcyQucGlwZShcbiAgICAgIG1hcCh0YWJzID0+IHRhYnNbMF0pLFxuICAgICAgZmlsdGVyKEJvb2xlYW4pLFxuICAgICAgZmlyc3QoKVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2tzIGlmIGF0IGxlYXN0IG9uZSBvZiB0aGUgdGFicyBpcyBhdmFpbGFibGUuXG4gICAqIEBwYXJhbSB0YWJMYWJlbHMgVGhlIGFycmF5IG9mIHRhYiBsYWJlbHMgdG8gY2hlY2suXG4gICAqIEByZXR1cm5zIFJldHVybnMgdHJ1ZSBpZiBhdCBsZWFzdCBvbmUgb2YgdGhlIHRhYnMgaXMgYXZhaWxhYmxlLlxuICAgKi9cbiAgYXJlQXZhaWxhYmxlKHRhYkxhYmVsczogc3RyaW5nW10pOiBib29sZWFuIHtcbiAgICBjb25zdCBjdXJyZW50VGFic1NldEFycmF5ID0gQXJyYXkuZnJvbSh0aGlzLnN0YXRlKTtcbiAgICByZXR1cm4gdGFiTGFiZWxzLnNvbWUodGFiTGFiZWwgPT4gY3VycmVudFRhYnNTZXRBcnJheS5zb21lKHRhYiA9PiB0YWIubGFiZWwgPT09IHRhYkxhYmVsKSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgc2V0dXBJdGVtc09ic2VydmFibGUoKTogT2JzZXJ2YWJsZTxUYWJbXT4ge1xuICAgIHJldHVybiBmcm9tVHJpZ2dlcjxUYWI+KHRoaXMucm91dGVyLCB0aGlzLnJlZnJlc2gkLCBbXG4gICAgICBnZXRJbmplY3RlZEhvb2tzPFRhYj4oSE9PS19UQUJTLCB0aGlzLmluamVjdG9ycyksXG4gICAgICAoKSA9PiB0aGlzLmZhY3RvcmllcyxcbiAgICAgIHN0YXRlVG9GYWN0b3J5KHRoaXMuc3RhdGUkKVxuICAgIF0pLnBpcGUoXG4gICAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZCgpLFxuICAgICAgbWFwKHRhYnMgPT4gdGhpcy5wcmVwYXJlVGFicyh0YWJzKSksXG4gICAgICBzaGFyZVJlcGxheSgxKVxuICAgICk7XG4gIH1cbn1cbiJdfQ==