@netgrif/components-core
Version:
Netgrif Application engine frontend core Angular library
181 lines • 29.4 kB
JavaScript
import { Component, Input } from '@angular/core';
import { HttpParams } from "@angular/common/http";
import { PaginationParams } from "../../utility/pagination/pagination-params";
import { SimpleFilter } from "../../filter/models/simple-filter";
import { take } from "rxjs/operators";
import { BehaviorSubject } from "rxjs";
import * as i0 from "@angular/core";
import * as i1 from "../service/path.service";
import * as i2 from "../../resources/engine-endpoint/case-resource.service";
import * as i3 from "@angular/router";
import * as i4 from "../../routing/dynamic-navigation-route-provider/dynamic-navigation-route-provider.service";
import * as i5 from "@ngx-translate/core";
import * as i6 from "../../logger/services/logger.service";
export class AbstractBreadcrumbsComponent {
_pathService;
_caseResourceService;
_activatedRoute;
_router;
_dynamicRoutingService;
_translateService;
_log;
showHome = true;
showFilter = true;
redirectOnClick = true;
lengthOfPath = 30;
partsAfterDots = 2;
filterName;
breadcrumbsParts;
static DOTS = '...';
static DELIMETER = '/';
static NODE_PATH = 'nodePath';
static ITEM_SETTINGS = 'item_settings';
_showPaths = false;
nicePath;
redirectUrls;
nicePathSubscription;
constructor(_pathService, _caseResourceService, _activatedRoute, _router, _dynamicRoutingService, _translateService, _log) {
this._pathService = _pathService;
this._caseResourceService = _caseResourceService;
this._activatedRoute = _activatedRoute;
this._router = _router;
this._dynamicRoutingService = _dynamicRoutingService;
this._translateService = _translateService;
this._log = _log;
this.nicePath = new BehaviorSubject(undefined);
this.redirectUrls = new Map();
this.initNicePath();
}
ngAfterViewInit() {
this.resolveBreadcrumbs();
}
ngOnDestroy() {
if (!!this.nicePathSubscription) {
this.nicePathSubscription.unsubscribe();
}
}
resolveBreadcrumbs() {
const filterId = this._activatedRoute.snapshot.params.filterCaseId;
if (!filterId) {
this._log.error("Missing required data for resolving breadcrumbs.");
return;
}
const splitPath = this._pathService.splitPath(this._pathService.activePath);
const fullPath = this.createFullPath(splitPath);
const fullPathQueries = fullPath.map(p => '(processIdentifier:menu_item AND dataSet.nodePath.textValue.keyword:\"' + p + '\")');
fullPathQueries.push('(taskMongoIds:\"' + filterId + '\")');
const searchBody = {
query: fullPathQueries.join(" OR ")
};
let httpParams = new HttpParams()
.set(PaginationParams.PAGE_SIZE, 25)
.set(PaginationParams.PAGE_NUMBER, 0);
this._caseResourceService.searchCases(SimpleFilter.fromCaseQuery(searchBody), httpParams).pipe(take(1)).subscribe(result => {
const cases = result.content;
const filterCaseIndex = cases.findIndex(c => c.tasks.some(t => t.task === filterId) && !fullPath.includes(this.immediateValue(c, AbstractBreadcrumbsComponent.NODE_PATH)));
if (filterCaseIndex >= 0) {
const filterCase = cases.splice(cases.findIndex(c => c.tasks.some(t => t.task === filterId) && !fullPath.includes(this.immediateValue(c, AbstractBreadcrumbsComponent.NODE_PATH))), 1)[0];
this.filterName = this.getTranslation(this.immediateValue(filterCase, 'menu_name'));
}
cases.sort((a, b) => fullPath.indexOf(this.immediateValue(a, AbstractBreadcrumbsComponent.NODE_PATH)) - fullPath.indexOf(this.immediateValue(b, AbstractBreadcrumbsComponent.NODE_PATH)));
if (this.redirectOnClick) {
cases.forEach(c => this.redirectUrls.set(this.immediateValue(c, AbstractBreadcrumbsComponent.NODE_PATH), [this._dynamicRoutingService.route, c.tasks.find(t => t.transition === AbstractBreadcrumbsComponent.ITEM_SETTINGS).task]));
}
this.nicePath.next(["", ...cases.map(c => this.getTranslation(this.immediateValue(c, 'menu_name')))]);
});
}
initNicePath() {
this.nicePathSubscription = this.nicePath.subscribe(np => {
if (!!np) {
const path = np;
if (path?.length > this.partsAfterDots + 1 && this._pathService.activePath.length > this.lengthOfPath && !this._showPaths) {
const newPath = [path[0], AbstractBreadcrumbsComponent.DOTS];
for (let i = path.length - this.partsAfterDots; i < path.length; i++) {
newPath.push(path[i]);
}
this.breadcrumbsParts = newPath;
return;
}
this.breadcrumbsParts = path === undefined ? [] : path;
}
});
}
redirect() {
if (!this.redirectOnClick) {
return;
}
const target = this.redirectUrls.get(this._pathService.activePath);
if (target) {
this._router.navigate(target).then(r => { });
}
else {
this._log.error("Missing required data for redirecting breadcrumbs.");
}
}
reset() {
this.filterName = undefined;
this._pathService.reset();
this.nicePath.next([""]);
}
changePath(path, count) {
if (path === AbstractBreadcrumbsComponent.DOTS && count === 1) {
this._showPaths = true;
this.nicePath.next(this.nicePath.value);
return;
}
let fullPath = '';
const tmp = this._pathService.splitPath(this._pathService.activePath);
if (tmp === undefined)
return;
const control = this.resultCounter(count, tmp);
for (let i = 0; i <= control; i++) {
fullPath += tmp[i];
if (i !== control)
fullPath += AbstractBreadcrumbsComponent.DELIMETER;
}
this._pathService.activePath = fullPath;
this.filterName = undefined;
this.nicePath.next(this.nicePath.value.slice(0, control + 1));
this.redirect();
}
resultCounter(count, tmp) {
if (tmp?.length > this.partsAfterDots + 1 && this._pathService.activePath?.length > this.lengthOfPath && !this._showPaths) {
return tmp.length - this.partsAfterDots + (count - 2);
}
return count;
}
createFullPath(splitPath) {
let tmp = '';
return splitPath.filter(s => s !== "").map((value) => {
tmp += AbstractBreadcrumbsComponent.DELIMETER + value;
return tmp?.replace("//", AbstractBreadcrumbsComponent.DELIMETER);
});
}
immediateValue(aCase, fieldId) {
return aCase.immediateData.find(s => s.stringId === fieldId)?.value;
}
getTranslation(value) {
const locale = this._translateService.currentLang.split('-')[0];
return locale in value.translations ? value.translations[locale] : value.defaultValue;
}
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: AbstractBreadcrumbsComponent, deps: [{ token: i1.PathService }, { token: i2.CaseResourceService }, { token: i3.ActivatedRoute }, { token: i3.Router }, { token: i4.DynamicNavigationRouteProviderService }, { token: i5.TranslateService }, { token: i6.LoggerService }], target: i0.ɵɵFactoryTarget.Component });
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: AbstractBreadcrumbsComponent, selector: "ncc-breadcrumbs-component", inputs: { showHome: "showHome", showFilter: "showFilter", redirectOnClick: "redirectOnClick", lengthOfPath: "lengthOfPath", partsAfterDots: "partsAfterDots" }, ngImport: i0, template: '', isInline: true });
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: AbstractBreadcrumbsComponent, decorators: [{
type: Component,
args: [{
selector: 'ncc-breadcrumbs-component',
template: ''
}]
}], ctorParameters: () => [{ type: i1.PathService }, { type: i2.CaseResourceService }, { type: i3.ActivatedRoute }, { type: i3.Router }, { type: i4.DynamicNavigationRouteProviderService }, { type: i5.TranslateService }, { type: i6.LoggerService }], propDecorators: { showHome: [{
type: Input
}], showFilter: [{
type: Input
}], redirectOnClick: [{
type: Input
}], lengthOfPath: [{
type: Input
}], partsAfterDots: [{
type: Input
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWJzdHJhY3QtYnJlYWRjcnVtYnMuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmV0Z3JpZi1jb21wb25lbnRzLWNvcmUvc3JjL2xpYi9uYXZpZ2F0aW9uL2JyZWFkY3J1bWJzL2Fic3RyYWN0LWJyZWFkY3J1bWJzLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQWdCLFNBQVMsRUFBRSxLQUFLLEVBQVksTUFBTSxlQUFlLENBQUM7QUFJekUsT0FBTyxFQUFDLFVBQVUsRUFBQyxNQUFNLHNCQUFzQixDQUFDO0FBQ2hELE9BQU8sRUFBQyxnQkFBZ0IsRUFBQyxNQUFNLDRDQUE0QyxDQUFDO0FBQzVFLE9BQU8sRUFBQyxZQUFZLEVBQUMsTUFBTSxtQ0FBbUMsQ0FBQztBQUMvRCxPQUFPLEVBQUMsSUFBSSxFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFDcEMsT0FBTyxFQUFDLGVBQWUsRUFBZSxNQUFNLE1BQU0sQ0FBQzs7Ozs7Ozs7QUFjbkQsTUFBTSxPQUFnQiw0QkFBNEI7SUFvQmQ7SUFDQTtJQUNBO0lBQ0E7SUFDQTtJQUNBO0lBQ0E7SUF4QnZCLFFBQVEsR0FBWSxJQUFJLENBQUM7SUFDekIsVUFBVSxHQUFZLElBQUksQ0FBQztJQUMzQixlQUFlLEdBQVksSUFBSSxDQUFDO0lBQ2hDLFlBQVksR0FBVyxFQUFFLENBQUM7SUFDMUIsY0FBYyxHQUFXLENBQUMsQ0FBQztJQUVwQyxVQUFVLENBQVM7SUFDbkIsZ0JBQWdCLENBQWdCO0lBRXhCLE1BQU0sQ0FBQyxJQUFJLEdBQVcsS0FBSyxDQUFDO0lBQzVCLE1BQU0sQ0FBQyxTQUFTLEdBQVcsR0FBRyxDQUFDO0lBQy9CLE1BQU0sQ0FBQyxTQUFTLEdBQVcsVUFBVSxDQUFDO0lBQ3RDLE1BQU0sQ0FBQyxhQUFhLEdBQVcsZUFBZSxDQUFDO0lBQy9DLFVBQVUsR0FBWSxLQUFLLENBQUM7SUFDNUIs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e0FmdGVyVmlld0luaXQsIENvbXBvbmVudCwgSW5wdXQsIE9uRGVzdHJveX0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge1BhdGhTZXJ2aWNlfSBmcm9tICcuLi9zZXJ2aWNlL3BhdGguc2VydmljZSc7XG5pbXBvcnQge0Nhc2VSZXNvdXJjZVNlcnZpY2V9IGZyb20gXCIuLi8uLi9yZXNvdXJjZXMvZW5naW5lLWVuZHBvaW50L2Nhc2UtcmVzb3VyY2Uuc2VydmljZVwiO1xuaW1wb3J0IHtDYXNlU2VhcmNoUmVxdWVzdEJvZHl9IGZyb20gXCIuLi8uLi9maWx0ZXIvbW9kZWxzL2Nhc2Utc2VhcmNoLXJlcXVlc3QtYm9keVwiO1xuaW1wb3J0IHtIdHRwUGFyYW1zfSBmcm9tIFwiQGFuZ3VsYXIvY29tbW9uL2h0dHBcIjtcbmltcG9ydCB7UGFnaW5hdGlvblBhcmFtc30gZnJvbSBcIi4uLy4uL3V0aWxpdHkvcGFnaW5hdGlvbi9wYWdpbmF0aW9uLXBhcmFtc1wiO1xuaW1wb3J0IHtTaW1wbGVGaWx0ZXJ9IGZyb20gXCIuLi8uLi9maWx0ZXIvbW9kZWxzL3NpbXBsZS1maWx0ZXJcIjtcbmltcG9ydCB7dGFrZX0gZnJvbSBcInJ4anMvb3BlcmF0b3JzXCI7XG5pbXBvcnQge0JlaGF2aW9yU3ViamVjdCwgU3Vic2NyaXB0aW9ufSBmcm9tIFwicnhqc1wiO1xuaW1wb3J0IHtBY3RpdmF0ZWRSb3V0ZSwgUm91dGVyfSBmcm9tIFwiQGFuZ3VsYXIvcm91dGVyXCI7XG5pbXBvcnQge1xuICAgIER5bmFtaWNOYXZpZ2F0aW9uUm91dGVQcm92aWRlclNlcnZpY2Vcbn0gZnJvbSBcIi4uLy4uL3JvdXRpbmcvZHluYW1pYy1uYXZpZ2F0aW9uLXJvdXRlLXByb3ZpZGVyL2R5bmFtaWMtbmF2aWdhdGlvbi1yb3V0ZS1wcm92aWRlci5zZXJ2aWNlXCI7XG5pbXBvcnQge0Nhc2V9IGZyb20gXCIuLi8uLi9yZXNvdXJjZXMvaW50ZXJmYWNlL2Nhc2VcIjtcbmltcG9ydCB7STE4bkZpZWxkVmFsdWV9IGZyb20gXCIuLi8uLi9kYXRhLWZpZWxkcy9pMThuLWZpZWxkL21vZGVscy9pMThuLWZpZWxkLXZhbHVlXCI7XG5pbXBvcnQge1RyYW5zbGF0ZVNlcnZpY2V9IGZyb20gXCJAbmd4LXRyYW5zbGF0ZS9jb3JlXCI7XG5pbXBvcnQge0xvZ2dlclNlcnZpY2V9IGZyb20gXCIuLi8uLi9sb2dnZXIvc2VydmljZXMvbG9nZ2VyLnNlcnZpY2VcIjtcblxuQENvbXBvbmVudCh7XG4gICAgc2VsZWN0b3I6ICduY2MtYnJlYWRjcnVtYnMtY29tcG9uZW50JyxcbiAgICB0ZW1wbGF0ZTogJydcbn0pXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RCcmVhZGNydW1ic0NvbXBvbmVudCBpbXBsZW1lbnRzIE9uRGVzdHJveSwgQWZ0ZXJWaWV3SW5pdCB7XG5cbiAgICBASW5wdXQoKSBzaG93SG9tZTogYm9vbGVhbiA9IHRydWU7XG4gICAgQElucHV0KCkgc2hvd0ZpbHRlcjogYm9vbGVhbiA9IHRydWU7XG4gICAgQElucHV0KCkgcmVkaXJlY3RPbkNsaWNrOiBib29sZWFuID0gdHJ1ZTtcbiAgICBASW5wdXQoKSBsZW5ndGhPZlBhdGg6IG51bWJlciA9IDMwO1xuICAgIEBJbnB1dCgpIHBhcnRzQWZ0ZXJEb3RzOiBudW1iZXIgPSAyO1xuXG4gICAgZmlsdGVyTmFtZTogc3RyaW5nO1xuICAgIGJyZWFkY3J1bWJzUGFydHM6IEFycmF5PHN0cmluZz47XG5cbiAgICBwcml2YXRlIHN0YXRpYyBET1RTOiBzdHJpbmcgPSAnLi4uJztcbiAgICBwcml2YXRlIHN0YXRpYyBERUxJTUVURVI6IHN0cmluZyA9ICcvJztcbiAgICBwcml2YXRlIHN0YXRpYyBOT0RFX1BBVEg6IHN0cmluZyA9ICdub2RlUGF0aCc7XG4gICAgcHJpdmF0ZSBzdGF0aWMgSVRFTV9TRVRUSU5HUzogc3RyaW5nID0gJ2l0ZW1fc2V0dGluZ3MnO1xuICAgIHByaXZhdGUgX3Nob3dQYXRoczogYm9vbGVhbiA9IGZhbHNlO1xuICAgIHByaXZhdGUgbmljZVBhdGg6IEJlaGF2aW9yU3ViamVjdDxBcnJheTxzdHJpbmc+PjtcbiAgICBwcml2YXRlIHJlZGlyZWN0VXJsczogTWFwPHN0cmluZywgQXJyYXk8c3RyaW5nPj47XG4gICAgcHJpdmF0ZSBuaWNlUGF0aFN1YnNjcmlwdGlvbjogU3Vic2NyaXB0aW9uO1xuXG4gICAgcHJvdGVjdGVkIGNvbnN0cnVjdG9yKHByb3RlY3RlZCBfcGF0aFNlcnZpY2U6IFBhdGhTZXJ2aWNlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBwcm90ZWN0ZWQgX2Nhc2VSZXNvdXJjZVNlcnZpY2U6IENhc2VSZXNvdXJjZVNlcnZpY2UsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHByb3RlY3RlZCBfYWN0aXZhdGVkUm91dGU6IEFjdGl2YXRlZFJvdXRlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBwcm90ZWN0ZWQgX3JvdXRlcjogUm91dGVyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBwcm90ZWN0ZWQgX2R5bmFtaWNSb3V0aW5nU2VydmljZTogRHluYW1pY05hdmlnYXRpb25Sb3V0ZVByb3ZpZGVyU2VydmljZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvdGVjdGVkIF90cmFuc2xhdGVTZXJ2aWNlOiBUcmFuc2xhdGVTZXJ2aWNlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBwcm90ZWN0ZWQgX2xvZzogTG9nZ2VyU2VydmljZSkge1xuICAgICAgICB0aGlzLm5pY2VQYXRoID0gbmV3IEJlaGF2aW9yU3ViamVjdDxBcnJheTxzdHJpbmc+Pih1bmRlZmluZWQpO1xuICAgICAgICB0aGlzLnJlZGlyZWN0VXJscyA9IG5ldyBNYXA8c3RyaW5nLCBBcnJheTxzdHJpbmc+PigpO1xuICAgICAgICB0aGlzLmluaXROaWNlUGF0aCgpO1xuICAgIH1cblxuICAgIG5nQWZ0ZXJWaWV3SW5pdCgpIHtcbiAgICAgICAgdGhpcy5yZXNvbHZlQnJlYWRjcnVtYnMoKTtcbiAgICB9XG5cbiAgICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICAgICAgaWYgKCEhdGhpcy5uaWNlUGF0aFN1YnNjcmlwdGlvbikge1xuICAgICAgICAgICAgdGhpcy5uaWNlUGF0aFN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIHJlc29sdmVCcmVhZGNydW1icygpIHtcbiAgICAgICAgY29uc3QgZmlsdGVySWQgPSB0aGlzLl9hY3RpdmF0ZWRSb3V0ZS5zbmFwc2hvdC5wYXJhbXMuZmlsdGVyQ2FzZUlkXG4gICAgICAgIGlmICghZmlsdGVySWQpIHtcbiAgICAgICAgICAgIHRoaXMuX2xvZy5lcnJvcihcIk1pc3NpbmcgcmVxdWlyZWQgZGF0YSBmb3IgcmVzb2x2aW5nIGJyZWFkY3J1bWJzLlwiKVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHNwbGl0UGF0aCA9IHRoaXMuX3BhdGhTZXJ2aWNlLnNwbGl0UGF0aCh0aGlzLl9wYXRoU2VydmljZS5hY3RpdmVQYXRoKTtcbiAgICAgICAgY29uc3QgZnVsbFBhdGggPSB0aGlzLmNyZWF0ZUZ1bGxQYXRoKHNwbGl0UGF0aCk7XG4gICAgICAgIGNvbnN0IGZ1bGxQYXRoUXVlcmllcyA9IGZ1bGxQYXRoLm1hcChwID0+ICcocHJvY2Vzc0lkZW50aWZpZXI6bWVudV9pdGVtIEFORCBkYXRhU2V0Lm5vZGVQYXRoLnRleHRWYWx1ZS5rZXl3b3JkOlxcXCInICsgcCArICdcXFwiKScpXG4gICAgICAgIGZ1bGxQYXRoUXVlcmllcy5wdXNoKCcodGFza01vbmdvSWRzOlxcXCInICsgZmlsdGVySWQgKyAnXFxcIiknKVxuXG4gICAgICAgIGNvbnN0IHNlYXJjaEJvZHk6IENhc2VTZWFyY2hSZXF1ZXN0Qm9keSA9IHtcbiAgICAgICAgICAgIHF1ZXJ5OiBmdWxsUGF0aFF1ZXJpZXMuam9pbihcIiBPUiBcIilcbiAgICAgICAgfTtcbiAgICAgICAgbGV0IGh0dHBQYXJhbXMgPSBuZXcgSHR0cFBhcmFtcygpXG4gICAgICAgICAgICAuc2V0KFBhZ2luYXRpb25QYXJhbXMuUEFHRV9TSVpFLCAyNSlcbiAgICAgICAgICAgIC5zZXQoUGFnaW5hdGlvblBhcmFtcy5QQUdFX05VTUJFUiwgMCk7XG5cbiAgICAgICAgdGhpcy5fY2FzZVJlc291cmNlU2VydmljZS5zZWFyY2hDYXNlcyhTaW1wbGVGaWx0ZXIuZnJvbUNhc2VRdWVyeShzZWFyY2hCb2R5KSwgaHR0cFBhcmFtcykucGlwZSh0YWtlKDEpKS5zdWJzY3JpYmUocmVzdWx0ID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGNhc2VzID0gcmVzdWx0LmNvbnRlbnQ7XG4gICAgICAgICAgICBjb25zdCBmaWx0ZXJDYXNlSW5kZXggPSBjYXNlcy5maW5kSW5kZXgoYyA9PiBjLnRhc2tzLnNvbWUodCA9PiB0LnRhc2sgPT09IGZpbHRlcklkKSAmJiAhZnVsbFBhdGguaW5jbHVkZXModGhpcy5pbW1lZGlhdGVWYWx1ZShjLCBBYnN0cmFjdEJyZWFkY3J1bWJzQ29tcG9uZW50Lk5PREVfUEFUSCkpKTtcbiAgICAgICAgICAgIGlmIChmaWx0ZXJDYXNlSW5kZXggPj0gMCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGZpbHRlckNhc2UgPSBjYXNlcy5zcGxpY2UoY2FzZXMuZmluZEluZGV4KGMgPT4gYy50YXNrcy5zb21lKHQgPT4gdC50YXNrID09PSBmaWx0ZXJJZCkgJiYgIWZ1bGxQYXRoLmluY2x1ZGVzKHRoaXMuaW1tZWRpYXRlVmFsdWUoYywgQWJzdHJhY3RCcmVhZGNydW1ic0NvbXBvbmVudC5OT0RFX1BBVEgpKSksIDEpWzBdO1xuICAgICAgICAgICAgICAgIHRoaXMuZmlsdGVyTmFtZSA9IHRoaXMuZ2V0VHJhbnNsYXRpb24odGhpcy5pbW1lZGlhdGVWYWx1ZShmaWx0ZXJDYXNlLCAnbWVudV9uYW1lJykpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2FzZXMuc29ydCgoYSwgYikgPT4gZnVsbFBhdGguaW5kZXhPZih0aGlzLmltbWVkaWF0ZVZhbHVlKGEsIEFic3RyYWN0QnJlYWRjcnVtYnNDb21wb25lbnQuTk9ERV9QQVRIKSkgLSBmdWxsUGF0aC5pbmRleE9mKHRoaXMuaW1tZWRpYXRlVmFsdWUoYiwgQWJzdHJhY3RCcmVhZGNydW1ic0NvbXBvbmVudC5OT0RFX1BBVEgpKSk7XG4gICAgICAgICAgICBpZiAodGhpcy5yZWRpcmVjdE9uQ2xpY2spIHtcbiAgICAgICAgICAgICAgICBjYXNlcy5mb3JFYWNoKGMgPT4gdGhpcy5yZWRpcmVjdFVybHMuc2V0KHRoaXMuaW1tZWRpYXRlVmFsdWUoYywgQWJzdHJhY3RCcmVhZGNydW1ic0NvbXBvbmVudC5OT0RFX1BBVEgpLCBbdGhpcy5fZHluYW1pY1JvdXRpbmdTZXJ2aWNlLnJvdXRlLCBjLnRhc2tzLmZpbmQodCA9PiB0LnRyYW5zaXRpb24gPT09IEFic3RyYWN0QnJlYWRjcnVtYnNDb21wb25lbnQuSVRFTV9TRVRUSU5HUykudGFza10pKVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5uaWNlUGF0aC5uZXh0KFtcIlwiLCAuLi5jYXNlcy5tYXAoYyA9PiB0aGlzLmdldFRyYW5zbGF0aW9uKHRoaXMuaW1tZWRpYXRlVmFsdWUoYywgJ21lbnVfbmFtZScpKSldKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHVibGljIGluaXROaWNlUGF0aCgpIHtcbiAgICAgICAgdGhpcy5uaWNlUGF0aFN1YnNjcmlwdGlvbiA9IHRoaXMubmljZVBhdGguc3Vic2NyaWJlKG5wID0+IHtcbiAgICAgICAgICAgIGlmICghIW5wKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcGF0aCA9IG5wO1xuICAgICAgICAgICAgICAgIGlmIChwYXRoPy5sZW5ndGggPiB0aGlzLnBhcnRzQWZ0ZXJEb3RzICsgMSAmJiB0aGlzLl9wYXRoU2VydmljZS5hY3RpdmVQYXRoLmxlbmd0aCA+IHRoaXMubGVuZ3RoT2ZQYXRoICYmICF0aGlzLl9zaG93UGF0aHMpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbmV3UGF0aCA9IFtwYXRoWzBdLCBBYnN0cmFjdEJyZWFkY3J1bWJzQ29tcG9uZW50LkRPVFNdO1xuICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gcGF0aC5sZW5ndGggLSB0aGlzLnBhcnRzQWZ0ZXJEb3RzOyBpIDwgcGF0aC5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgbmV3UGF0aC5wdXNoKHBhdGhbaV0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYnJlYWRjcnVtYnNQYXJ0cyA9IG5ld1BhdGg7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhpcy5icmVhZGNydW1ic1BhcnRzID0gcGF0aCA9PT0gdW5kZWZpbmVkID8gW10gOiBwYXRoO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgcmVkaXJlY3QoKSB7XG4gICAgICAgIGlmICghdGhpcy5yZWRpcmVjdE9uQ2xpY2spIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB0YXJnZXQgPSB0aGlzLnJlZGlyZWN0VXJscy5nZXQodGhpcy5fcGF0aFNlcnZpY2UuYWN0aXZlUGF0aCk7XG4gICAgICAgIGlmICh0YXJnZXQpIHtcbiAgICAgICAgICAgIHRoaXMuX3JvdXRlci5uYXZpZ2F0ZSh0YXJnZXQpLnRoZW4ociA9PiB7fSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLl9sb2cuZXJyb3IoXCJNaXNzaW5nIHJlcXVpcmVkIGRhdGEgZm9yIHJlZGlyZWN0aW5nIGJyZWFkY3J1bWJzLlwiKVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIHJlc2V0KCk6IHZvaWQge1xuICAgICAgICB0aGlzLmZpbHRlck5hbWUgPSB1bmRlZmluZWQ7XG4gICAgICAgIHRoaXMuX3BhdGhTZXJ2aWNlLnJlc2V0KCk7XG4gICAgICAgIHRoaXMubmljZVBhdGgubmV4dChbXCJcIl0pXG4gICAgfVxuXG4gICAgcHVibGljIGNoYW5nZVBhdGgocGF0aDogc3RyaW5nLCBjb3VudDogbnVtYmVyKSB7XG4gICAgICAgIGlmIChwYXRoID09PSBBYnN0cmFjdEJyZWFkY3J1bWJzQ29tcG9uZW50LkRPVFMgJiYgY291bnQgPT09IDEpIHtcbiAgICAgICAgICAgIHRoaXMuX3Nob3dQYXRocyA9IHRydWU7XG4gICAgICAgICAgICB0aGlzLm5pY2VQYXRoLm5leHQodGhpcy5uaWNlUGF0aC52YWx1ZSk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgbGV0IGZ1bGxQYXRoOiBzdHJpbmcgPSAnJztcbiAgICAgICAgY29uc3QgdG1wID0gdGhpcy5fcGF0aFNlcnZpY2Uuc3BsaXRQYXRoKHRoaXMuX3BhdGhTZXJ2aWNlLmFjdGl2ZVBhdGgpO1xuICAgICAgICBpZiAodG1wID09PSB1bmRlZmluZWQpIHJldHVybjtcbiAgICAgICAgY29uc3QgY29udHJvbCA9IHRoaXMucmVzdWx0Q291bnRlcihjb3VudCwgdG1wKTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPD0gY29udHJvbDsgaSsrKSB7XG4gICAgICAgICAgICBmdWxsUGF0aCArPSB0bXBbaV07XG4gICAgICAgICAgICBpZiAoaSAhPT0gY29udHJvbCkgZnVsbFBhdGggKz0gQWJzdHJhY3RCcmVhZGNydW1ic0NvbXBvbmVudC5ERUxJTUVURVI7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fcGF0aFNlcnZpY2UuYWN0aXZlUGF0aCA9IGZ1bGxQYXRoO1xuICAgICAgICB0aGlzLmZpbHRlck5hbWUgPSB1bmRlZmluZWQ7XG4gICAgICAgIHRoaXMubmljZVBhdGgubmV4dCh0aGlzLm5pY2VQYXRoLnZhbHVlLnNsaWNlKDAsIGNvbnRyb2wgKyAxKSlcbiAgICAgICAgdGhpcy5yZWRpcmVjdCgpO1xuICAgIH1cblxuICAgIHByaXZhdGUgcmVzdWx0Q291bnRlcihjb3VudDogbnVtYmVyLCB0bXA6IHN0cmluZ1tdKTogbnVtYmVyIHtcbiAgICAgICAgaWYgKHRtcD8ubGVuZ3RoID4gdGhpcy5wYXJ0c0FmdGVyRG90cyArIDEgJiYgdGhpcy5fcGF0aFNlcnZpY2UuYWN0aXZlUGF0aD8ubGVuZ3RoID4gdGhpcy5sZW5ndGhPZlBhdGggJiYgIXRoaXMuX3Nob3dQYXRocykge1xuICAgICAgICAgICAgcmV0dXJuIHRtcC5sZW5ndGggLSB0aGlzLnBhcnRzQWZ0ZXJEb3RzICsgKGNvdW50IC0gMik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNvdW50O1xuICAgIH1cblxuICAgIHByaXZhdGUgY3JlYXRlRnVsbFBhdGgoc3BsaXRQYXRoOiBBcnJheTxzdHJpbmc+KTogQXJyYXk8c3RyaW5nPiB7XG4gICAgICAgIGxldCB0bXAgPSAnJztcbiAgICAgICAgcmV0dXJuIHNwbGl0UGF0aC5maWx0ZXIocyA9PiBzICE9PSBcIlwiKS5tYXAoKHZhbHVlKSA9PiB7XG4gICAgICAgICAgICB0bXAgKz0gQWJzdHJhY3RCcmVhZGNydW1ic0NvbXBvbmVudC5ERUxJTUVURVIgKyB2YWx1ZTtcbiAgICAgICAgICAgIHJldHVybiB0bXA/LnJlcGxhY2UoXCIvL1wiLCBBYnN0cmFjdEJyZWFkY3J1bWJzQ29tcG9uZW50LkRFTElNRVRFUilcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBpbW1lZGlhdGVWYWx1ZShhQ2FzZTogQ2FzZSwgZmllbGRJZDogc3RyaW5nKTogYW55IHtcbiAgICAgICAgcmV0dXJuIGFDYXNlLmltbWVkaWF0ZURhdGEuZmluZChzID0+IHMuc3RyaW5nSWQgPT09IGZpZWxkSWQpPy52YWx1ZVxuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0VHJhbnNsYXRpb24odmFsdWU6IEkxOG5GaWVsZFZhbHVlKTogc3RyaW5nIHtcbiAgICAgICAgY29uc3QgbG9jYWxlID0gdGhpcy5fdHJhbnNsYXRlU2VydmljZS5jdXJyZW50TGFuZy5zcGxpdCgnLScpWzBdO1xuICAgICAgICByZXR1cm4gbG9jYWxlIGluIHZhbHVlLnRyYW5zbGF0aW9ucyA/IHZhbHVlLnRyYW5zbGF0aW9uc1tsb2NhbGVdIDogdmFsdWUuZGVmYXVsdFZhbHVlO1xuICAgIH1cbn1cbiJdfQ==