UNPKG

@netgrif/components-core

Version:

Netgrif Application engine frontend core Angular library

181 lines 29.4 kB
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==