@c8y/ngx-components
Version:
Angular modules for Cumulocity IoT applications
126 lines • 18.7 kB
JavaScript
import { Injectable, Injector } from '@angular/core';
import { OptionsService } from '../common/options.service';
import { documentationItems } from './defaults.items';
import { AppStateService } from '../common/ui-state.service';
import { HOOK_DOCS } from './docs.models';
import { ExtensionPointWithoutStateForPlugins, fromTriggerOnce, getInjectedHooks } from '../common/extension-hooks';
import { Router } from '@angular/router';
import { shareReplay, first, filter, distinctUntilChanged } from 'rxjs/operators';
import { isUndefined, get } from 'lodash-es';
import { PluginsResolveService } from '../plugins';
import * as i0 from "@angular/core";
import * as i1 from "../common/options.service";
import * as i2 from "../common/ui-state.service";
import * as i3 from "@angular/router";
import * as i4 from "../plugins";
export class DocsService extends ExtensionPointWithoutStateForPlugins {
constructor(options, app, rootInjector, router, plugins) {
super(rootInjector, plugins);
this.options = options;
this.app = app;
this.router = router;
/**
* Default documentation URL.
*/
this.DEFAULT_DOCS_BASE_URL = 'https://cumulocity.com';
this.items$ = this.setupItemsObservable();
}
getBaseUrl(uiVersion) {
const docsBaseUrl = this.options.get('docsBaseUrl', this.DEFAULT_DOCS_BASE_URL);
return this.getUrlWithDocsVersion(docsBaseUrl, uiVersion);
}
/**
* Takes a URL and replaces all `{{ version }}` placeholders with the relevant docs version
* (the version is derived from the app state or from the provided parameter).
* @param url Any URL that contains `{{ version }}` placeholders.
* @param uiVersion A version string or object, defaults to the app state version.
* @returns The URL with replaced `{{ version }}` placeholders.
*/
getUrlWithDocsVersion(url, uiVersion = this.app.uiVersion) {
const version = typeof uiVersion === 'string' ? uiVersion : get(uiVersion, 'ngx');
let docsVersion = '';
if (!(isUndefined(version) || version === '')) {
docsVersion = this.getDocsVersionForUiVersion(version);
}
return url.replace(/{{\s*version\s*}}/g, docsVersion).replace(/\/+$/g, '');
}
get templateStr() {
return this.options.get('guideHrefTemplate', '${docsBaseUrl}${partialUrl}');
}
getUserGuideLink(link) {
if (/^https?:/.test(link)) {
return link;
}
if (this.getBaseUrl === null) {
return null;
}
return this.getLink(this.templateStr, link);
}
list() {
return this.items$
.pipe(filter(i => !!i.length), first())
.toPromise();
}
get() {
// use the function as a factory
const { links, noDefault, excludeDefault = [] } = this.options.get('docs', {});
let staticLinks = noDefault
? []
: documentationItems
.map((item) => ({ ...item, url: this.getUserGuideLink(item.url) }))
.filter(({ url }) => !excludeDefault.some(e => new RegExp(e).test(url)));
if (links) {
// backwards compatibility
links.map((lnk) => {
if (isUndefined(lnk.type)) {
lnk.type = 'doc';
return lnk;
}
});
staticLinks = staticLinks.concat(links);
}
return staticLinks;
}
setupItemsObservable() {
const supportUrlRefreshTrigger = this.app.map(({ supportUrl }) => supportUrl);
return fromTriggerOnce(this.router, [supportUrlRefreshTrigger, this.refresh$], [getInjectedHooks(HOOK_DOCS, this.injectors), () => this.factories, this]).pipe(shareReplay(1), distinctUntilChanged());
}
getLink(templateStr, partialLink) {
if (!templateStr) {
return undefined;
}
return templateStr
.replace(/\${docsBaseUrl}/, this.getBaseUrl())
.replace(/\${partialUrl}/, this.prefixWithSlash(partialLink));
}
prefixWithSlash(partialLink = '') {
const shouldPrefix = !(partialLink && /^\//.test(partialLink));
const prefix = shouldPrefix ? '/' : '';
return `${prefix}${partialLink}`;
}
/**
* Returns the most relevant version of documentation for the given version of UI.
* For maintenance versions, it's the first version in the line, e.g. 1017.0.123 -> 10.17.0.
* For develop versions, it's the next minor one, e.g. 1017.123.0-SNAPSHOT -> 10.18.0.
*
* @param uiVersion The version of UI.
* @private
*/
getDocsVersionForUiVersion(uiVersion) {
const [majorMinorStr, patchStr] = uiVersion.split('.');
const patchNumber = parseInt(patchStr, 10);
const takeNextMinor = patchNumber > 0;
const majorNumber = Math.floor(parseInt(majorMinorStr, 10) / 100);
const minorNumber = parseInt(majorMinorStr, 10) - majorNumber * 100 + (takeNextMinor ? 1 : 0);
return `${majorNumber}.${minorNumber}.0`;
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: DocsService, deps: [{ token: i1.OptionsService }, { token: i2.AppStateService }, { token: i0.Injector }, { token: i3.Router }, { token: i4.PluginsResolveService }], target: i0.ɵɵFactoryTarget.Injectable }); }
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: DocsService, providedIn: 'root' }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: DocsService, decorators: [{
type: Injectable,
args: [{
providedIn: 'root'
}]
}], ctorParameters: () => [{ type: i1.OptionsService }, { type: i2.AppStateService }, { type: i0.Injector }, { type: i3.Router }, { type: i4.PluginsResolveService }] });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZG9jcy5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vY29yZS9kb2NzL2RvY3Muc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLFFBQVEsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNyRCxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDM0QsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDdEQsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQzdELE9BQU8sRUFBVyxTQUFTLEVBQW9CLE1BQU0sZUFBZSxDQUFDO0FBQ3JFLE9BQU8sRUFDTCxvQ0FBb0MsRUFDcEMsZUFBZSxFQUNmLGdCQUFnQixFQUNqQixNQUFNLDJCQUEyQixDQUFDO0FBRW5DLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUN6QyxPQUFPLEVBQUUsV0FBVyxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNsRixPQUFPLEVBQUUsV0FBVyxFQUFFLEdBQUcsRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUM3QyxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSxZQUFZLENBQUM7Ozs7OztBQUtuRCxNQUFNLE9BQU8sV0FBWSxTQUFRLG9DQUE2QztJQUs1RSxZQUNVLE9BQXVCLEVBQ3ZCLEdBQW9CLEVBQzVCLFlBQXNCLEVBQ2QsTUFBYyxFQUN0QixPQUE4QjtRQUU5QixLQUFLLENBQUMsWUFBWSxFQUFFLE9BQU8sQ0FBQyxDQUFDO1FBTnJCLFlBQU8sR0FBUCxPQUFPLENBQWdCO1FBQ3ZCLFFBQUcsR0FBSCxHQUFHLENBQWlCO1FBRXBCLFdBQU0sR0FBTixNQUFNLENBQVE7UUFSeEI7O1dBRUc7UUFDTSwwQkFBcUIsR0FBRyx3QkFBd0IsQ0FBQztRQVN4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QyxDQUFDLFdBQVcsSUFBSSxLQUFLLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUM7UUFDL0QsTUFBTSxNQUFNLEdBQUcsWUFBWSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUN2QyxPQUFPLEdBQUcsTUFBTSxHQUFHLFdBQVcsRUFBRSxDQUFDO0lBQ25DLENBQUM7SUFFRDs7Ozs7OztPQU9HO0lBQ0ssMEJBQTBCLENBQUMsU0FBaUI7UUFDbEQsTUFBTSxDQUFDLGFBQWEsRUFBRSxRQUFRLENBQUMsR0FBRyxTQUFTLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ3ZELE1BQU0sV0FBVyxHQUFHLFFBQVEsQ0FBQyxRQUFRLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFDM0MsTUFBTSxhQUFhLEdBQUcsV0FBVyxHQUFHLENBQUMsQ0FBQztRQUN0QyxNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxhQUFhLEVBQUUsRUFBRSxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUM7UUFDbEUsTUFBTSxXQUFXLEdBQUcsUUFBUSxDQUFDLGFBQWEsRUFBRSxFQUFFLENBQUMsR0FBRyxXQUFXLEdBQUcsR0FBRyxHQUFHLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzlGLE9BQU8sR0FBRyxXQUFXLElBQUksV0FBVyxJQUFJLENBQUM7SUFDM0MsQ0FBQzsrR0E1SFUsV0FBVzttSEFBWCxXQUFXLGNBRlYsTUFBTTs7NEZBRVAsV0FBVztrQkFIdkIsVUFBVTttQkFBQztvQkFDVixVQUFVLEVBQUUsTUFBTTtpQkFDbkIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlLCBJbmplY3RvciB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgT3B0aW9uc1NlcnZpY2UgfSBmcm9tICcuLi9jb21tb24vb3B0aW9ucy5zZXJ2aWNlJztcbmltcG9ydCB7IGRvY3VtZW50YXRpb25JdGVtcyB9IGZyb20gJy4vZGVmYXVsdHMuaXRlbXMnO1xuaW1wb3J0IHsgQXBwU3RhdGVTZXJ2aWNlIH0gZnJvbSAnLi4vY29tbW9uL3VpLXN0YXRlLnNlcnZpY2UnO1xuaW1wb3J0IHsgRG9jTGluaywgSE9PS19ET0NTLCBEb2NMaW5rV2l0aExhYmVsIH0gZnJvbSAnLi9kb2NzLm1vZGVscyc7XG5pbXBvcnQge1xuICBFeHRlbnNpb25Qb2ludFdpdGhvdXRTdGF0ZUZvclBsdWdpbnMsXG4gIGZyb21UcmlnZ2VyT25jZSxcbiAgZ2V0SW5qZWN0ZWRIb29rc1xufSBmcm9tICcuLi9jb21tb24vZXh0ZW5zaW9uLWhvb2tzJztcbmltcG9ydCB7IE9ic2VydmFibGUgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IFJvdXRlciB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XG5pbXBvcnQgeyBzaGFyZVJlcGxheSwgZmlyc3QsIGZpbHRlciwgZGlzdGluY3RVbnRpbENoYW5nZWQgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBpc1VuZGVmaW5lZCwgZ2V0IH0gZnJvbSAnbG9kYXNoLWVzJztcbmltcG9ydCB7IFBsdWdpbnNSZXNvbHZlU2VydmljZSB9IGZyb20gJy4uL3BsdWdpbnMnO1xuXG5ASW5qZWN0YWJsZSh7XG4gIHByb3ZpZGVkSW46ICdyb290J1xufSlcbmV4cG9ydCBjbGFzcyBEb2NzU2VydmljZSBleHRlbmRzIEV4dGVuc2lvblBvaW50V2l0aG91dFN0YXRlRm9yUGx1Z2luczxEb2NMaW5rPiB7XG4gIC8qKlxuICAgKiBEZWZhdWx0IGRvY3VtZW50YXRpb24gVVJMLlxuICAgKi9cbiAgcmVhZG9ubHkgREVGQVVMVF9ET0NTX0JBU0VfVVJMID0gJ2h0dHBzOi8vY3VtdWxvY2l0eS5jb20nO1xuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIG9wdGlvbnM6IE9wdGlvbnNTZXJ2aWNlLFxuICAgIHByaXZhdGUgYXBwOiBBcHBTdGF0ZVNlcnZpY2UsXG4gICAgcm9vdEluamVjdG9yOiBJbmplY3RvcixcbiAgICBwcml2YXRlIHJvdXRlcjogUm91dGVyLFxuICAgIHBsdWdpbnM6IFBsdWdpbnNSZXNvbHZlU2VydmljZVxuICApIHtcbiAgICBzdXBlcihyb290SW5qZWN0b3IsIHBsdWdpbnMpO1xuICAgIHRoaXMuaXRlbXMkID0gdGhpcy5zZXR1cEl0ZW1zT2JzZXJ2YWJsZSgpO1xuICB9XG5cbiAgZ2V0QmFzZVVybCh1aVZlcnNpb24/OiBzdHJpbmcgfCB7IG5neDogc3RyaW5nIH0pOiBzdHJpbmcge1xuICAgIGNvbnN0IGRvY3NCYXNlVXJsID0gdGhpcy5vcHRpb25zLmdldDxzdHJpbmc+KCdkb2NzQmFzZVVybCcsIHRoaXMuREVGQVVMVF9ET0NTX0JBU0VfVVJMKTtcbiAgICByZXR1cm4gdGhpcy5nZXRVcmxXaXRoRG9jc1ZlcnNpb24oZG9jc0Jhc2VVcmwsIHVpVmVyc2lvbik7XG4gIH1cblxuICAvKipcbiAgICogVGFrZXMgYSBVUkwgYW5kIHJlcGxhY2VzIGFsbCBge3sgdmVyc2lvbiB9fWAgcGxhY2Vob2xkZXJzIHdpdGggdGhlIHJlbGV2YW50IGRvY3MgdmVyc2lvblxuICAgKiAodGhlIHZlcnNpb24gaXMgZGVyaXZlZCBmcm9tIHRoZSBhcHAgc3RhdGUgb3IgZnJvbSB0aGUgcHJvdmlkZWQgcGFyYW1ldGVyKS5cbiAgICogQHBhcmFtIHVybCBBbnkgVVJMIHRoYXQgY29udGFpbnMgYHt7IHZlcnNpb24gfX1gIHBsYWNlaG9sZGVycy5cbiAgICogQHBhcmFtIHVpVmVyc2lvbiBBIHZlcnNpb24gc3RyaW5nIG9yIG9iamVjdCwgZGVmYXVsdHMgdG8gdGhlIGFwcCBzdGF0ZSB2ZXJzaW9uLlxuICAgKiBAcmV0dXJucyBUaGUgVVJMIHdpdGggcmVwbGFjZWQgYHt7IHZlcnNpb24gfX1gIHBsYWNlaG9sZGVycy5cbiAgICovXG4gIGdldFVybFdpdGhEb2NzVmVyc2lvbihcbiAgICB1cmw6IHN0cmluZyxcbiAgICB1aVZlcnNpb246IHN0cmluZyB8IHsgbmd4OiBzdHJpbmcgfSA9IHRoaXMuYXBwLnVpVmVyc2lvblxuICApOiBzdHJpbmcge1xuICAgIGNvbnN0IHZlcnNpb246IHN0cmluZyA9IHR5cGVvZiB1aVZlcnNpb24gPT09ICdzdHJpbmcnID8gdWlWZXJzaW9uIDogZ2V0KHVpVmVyc2lvbiwgJ25neCcpO1xuICAgIGxldCBkb2NzVmVyc2lvbiA9ICcnO1xuICAgIGlmICghKGlzVW5kZWZpbmVkKHZlcnNpb24pIHx8IHZlcnNpb24gPT09ICcnKSkge1xuICAgICAgZG9jc1ZlcnNpb24gPSB0aGlzLmdldERvY3NWZXJzaW9uRm9yVWlWZXJzaW9uKHZlcnNpb24pO1xuICAgIH1cbiAgICByZXR1cm4gdXJsLnJlcGxhY2UoL3t7XFxzKnZlcnNpb25cXHMqfX0vZywgZG9jc1ZlcnNpb24pLnJlcGxhY2UoL1xcLyskL2csICcnKTtcbiAgfVxuXG4gIGdldCB0ZW1wbGF0ZVN0cigpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLm9wdGlvbnMuZ2V0KCdndWlkZUhyZWZUZW1wbGF0ZScsICcke2RvY3NCYXNlVXJsfSR7cGFydGlhbFVybH0nKTtcbiAgfVxuXG4gIGdldFVzZXJHdWlkZUxpbmsobGluaykge1xuICAgIGlmICgvXmh0dHBzPzovLnRlc3QobGluaykpIHtcbiAgICAgIHJldHVybiBsaW5rO1xuICAgIH1cbiAgICBpZiAodGhpcy5nZXRCYXNlVXJsID09PSBudWxsKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuZ2V0TGluayh0aGlzLnRlbXBsYXRlU3RyLCBsaW5rKTtcbiAgfVxuXG4gIGxpc3QoKSB7XG4gICAgcmV0dXJuIHRoaXMuaXRlbXMkXG4gICAgICAucGlwZShcbiAgICAgICAgZmlsdGVyKGkgPT4gISFpLmxlbmd0aCksXG4gICAgICAgIGZpcnN0KClcbiAgICAgIClcbiAgICAgIC50b1Byb21pc2UoKTtcbiAgfVxuXG4gIGdldCgpIHtcbiAgICAvLyB1c2UgdGhlIGZ1bmN0aW9uIGFzIGEgZmFjdG9yeVxuICAgIGNvbnN0IHsgbGlua3MsIG5vRGVmYXVsdCwgZXhjbHVkZURlZmF1bHQgPSBbXSB9ID0gdGhpcy5vcHRpb25zLmdldCgnZG9jcycsIHt9KTtcbiAgICBsZXQgc3RhdGljTGlua3M6IERvY0xpbmtbXSA9IG5vRGVmYXVsdFxuICAgICAgPyBbXVxuICAgICAgOiBkb2N1bWVudGF0aW9uSXRlbXNcbiAgICAgICAgICAubWFwKChpdGVtOiBEb2NMaW5rV2l0aExhYmVsKSA9PiAoeyAuLi5pdGVtLCB1cmw6IHRoaXMuZ2V0VXNlckd1aWRlTGluayhpdGVtLnVybCkgfSkpXG4gICAgICAgICAgLmZpbHRlcigoeyB1cmwgfSkgPT4gIWV4Y2x1ZGVEZWZhdWx0LnNvbWUoZSA9PiBuZXcgUmVnRXhwKGUpLnRlc3QodXJsKSkpO1xuXG4gICAgaWYgKGxpbmtzKSB7XG4gICAgICAvLyBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eVxuICAgICAgbGlua3MubWFwKChsbms6IERvY0xpbmspID0+IHtcbiAgICAgICAgaWYgKGlzVW5kZWZpbmVkKGxuay50eXBlKSkge1xuICAgICAgICAgIGxuay50eXBlID0gJ2RvYyc7XG4gICAgICAgICAgcmV0dXJuIGxuaztcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICBzdGF0aWNMaW5rcyA9IHN0YXRpY0xpbmtzLmNvbmNhdChsaW5rcyk7XG4gICAgfVxuICAgIHJldHVybiBzdGF0aWNMaW5rcztcbiAgfVxuXG4gIHByb3RlY3RlZCBzZXR1cEl0ZW1zT2JzZXJ2YWJsZSgpOiBPYnNlcnZhYmxlPERvY0xpbmtbXT4ge1xuICAgIGNvbnN0IHN1cHBvcnRVcmxSZWZyZXNoVHJpZ2dlciA9IHRoaXMuYXBwLm1hcCgoeyBzdXBwb3J0VXJsIH0pID0+IHN1cHBvcnRVcmwpO1xuICAgIHJldHVybiBmcm9tVHJpZ2dlck9uY2U8RG9jTGluaz4oXG4gICAgICB0aGlzLnJvdXRlcixcbiAgICAgIFtzdXBwb3J0VXJsUmVmcmVzaFRyaWdnZXIsIHRoaXMucmVmcmVzaCRdLFxuICAgICAgW2dldEluamVjdGVkSG9va3M8RG9jTGluaz4oSE9PS19ET0NTLCB0aGlzLmluamVjdG9ycyksICgpID0+IHRoaXMuZmFjdG9yaWVzLCB0aGlzXVxuICAgICkucGlwZShzaGFyZVJlcGxheSgxKSwgZGlzdGluY3RVbnRpbENoYW5nZWQoKSk7XG4gIH1cblxuICBwcml2YXRlIGdldExpbmsodGVtcGxhdGVTdHIsIHBhcnRpYWxMaW5rKSB7XG4gICAgaWYgKCF0ZW1wbGF0ZVN0cikge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gICAgcmV0dXJuIHRlbXBsYXRlU3RyXG4gICAgICAucmVwbGFjZSgvXFwke2RvY3NCYXNlVXJsfS8sIHRoaXMuZ2V0QmFzZVVybCgpKVxuICAgICAgLnJlcGxhY2UoL1xcJHtwYXJ0aWFsVXJsfS8sIHRoaXMucHJlZml4V2l0aFNsYXNoKHBhcnRpYWxMaW5rKSk7XG4gIH1cblxuICBwcml2YXRlIHByZWZpeFdpdGhTbGFzaChwYXJ0aWFsTGluayA9ICcnKSB7XG4gICAgY29uc3Qgc2hvdWxkUHJlZml4ID0gIShwYXJ0aWFsTGluayAmJiAvXlxcLy8udGVzdChwYXJ0aWFsTGluaykpO1xuICAgIGNvbnN0IHByZWZpeCA9IHNob3VsZFByZWZpeCA/ICcvJyA6ICcnO1xuICAgIHJldHVybiBgJHtwcmVmaXh9JHtwYXJ0aWFsTGlua31gO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIG1vc3QgcmVsZXZhbnQgdmVyc2lvbiBvZiBkb2N1bWVudGF0aW9uIGZvciB0aGUgZ2l2ZW4gdmVyc2lvbiBvZiBVSS5cbiAgICogRm9yIG1haW50ZW5hbmNlIHZlcnNpb25zLCBpdCdzIHRoZSBmaXJzdCB2ZXJzaW9uIGluIHRoZSBsaW5lLCBlLmcuIDEwMTcuMC4xMjMgLT4gMTAuMTcuMC5cbiAgICogRm9yIGRldmVsb3AgdmVyc2lvbnMsIGl0J3MgdGhlIG5leHQgbWlub3Igb25lLCBlLmcuIDEwMTcuMTIzLjAtU05BUFNIT1QgLT4gMTAuMTguMC5cbiAgICpcbiAgICogQHBhcmFtIHVpVmVyc2lvbiBUaGUgdmVyc2lvbiBvZiBVSS5cbiAgICogQHByaXZhdGVcbiAgICovXG4gIHByaXZhdGUgZ2V0RG9jc1ZlcnNpb25Gb3JVaVZlcnNpb24odWlWZXJzaW9uOiBzdHJpbmcpIHtcbiAgICBjb25zdCBbbWFqb3JNaW5vclN0ciwgcGF0Y2hTdHJdID0gdWlWZXJzaW9uLnNwbGl0KCcuJyk7XG4gICAgY29uc3QgcGF0Y2hOdW1iZXIgPSBwYXJzZUludChwYXRjaFN0ciwgMTApO1xuICAgIGNvbnN0IHRha2VOZXh0TWlub3IgPSBwYXRjaE51bWJlciA+IDA7XG4gICAgY29uc3QgbWFqb3JOdW1iZXIgPSBNYXRoLmZsb29yKHBhcnNlSW50KG1ham9yTWlub3JTdHIsIDEwKSAvIDEwMCk7XG4gICAgY29uc3QgbWlub3JOdW1iZXIgPSBwYXJzZUludChtYWpvck1pbm9yU3RyLCAxMCkgLSBtYWpvck51bWJlciAqIDEwMCArICh0YWtlTmV4dE1pbm9yID8gMSA6IDApO1xuICAgIHJldHVybiBgJHttYWpvck51bWJlcn0uJHttaW5vck51bWJlcn0uMGA7XG4gIH1cbn1cbiJdfQ==