UNPKG

@netgrif/components-core

Version:

Netgrif Application engine frontend core Angular library

138 lines 23.1 kB
import { Injectable } from '@angular/core'; import { AllowedNetsService } from '../allowed-nets.service'; import { switchMap } from 'rxjs/operators'; import { BehaviorSubject, of } from 'rxjs'; import { getImmediateData } from '../../../utility/get-immediate-data'; import { UserFilterConstants } from '../../../filter/models/user-filter-constants'; import { getFieldFromDataGroups } from '../../../utility/get-field'; import { HttpParams } from '@angular/common/http'; import { PaginationParams } from '../../../utility/pagination/pagination-params'; import * as i0 from "@angular/core"; import * as i1 from "../../../process/process.service"; import * as i2 from "../../../resources/engine-endpoint/petri-net-resource.service"; import * as i3 from "../../../configuration/configuration.service"; import * as i4 from "../../../logger/services/logger.service"; function addAllowedNets(allowedNets, existingAllowedNets) { if (!!allowedNets && allowedNets.length > 0) { existingAllowedNets.next([...allowedNets]); } } /** * Convenience method that can be used as an allowed nets factory for tabbed task views. * If no allowed nets are provided in the injected data then an {@link AllowedNetsService} with no allowed nets is created. * It has a dependency on this class and {@link NAE_TAB_DATA} injection token. */ export function tabbedAllowedNetsServiceFactory(factory, tabData) { return factory.createFromArray(tabData?.allowedNets ?? []); } /** * Convenience method that can be used as an allowed nets factory for views that are loaded from filter process instances. * It has a dependency on this class and {@link NAE_NAVIGATION_ITEM_TASK_DATA} injection token. */ export function navigationItemTaskAllowedNetsServiceFactory(factory, baseAllowedNets, navigationItemTaskData) { if (!navigationItemTaskData) { return factory.createWithAllNets(); } const filterField = getFieldFromDataGroups(navigationItemTaskData, UserFilterConstants.FILTER_FIELD_ID); const allowedNetsField = getFieldFromDataGroups(navigationItemTaskData, UserFilterConstants.ALLOWED_NETS_FIELD_ID); if (filterField === undefined) { throw new Error(`Provided navigation item task data does not contain a filter field with ID '${UserFilterConstants.FILTER_FIELD_ID}'! Allowed nets cannot be generated from it!`); } const nets = new BehaviorSubject(Array.from(new Set([...filterField.allowedNets]))); if (filterField.filterMetadata.inheritAllowedNets) { baseAllowedNets.allowedNets$.subscribe(allowedNets => { const netSet = new Set(allowedNets); nets.next(Array.from(netSet)); }); } if (!!allowedNetsField) { addAllowedNets(allowedNetsField.value, nets); allowedNetsField.valueChanges().subscribe(allowedNets => { addAllowedNets(allowedNetsField.value, nets); }); } return factory.createFromObservable(nets.asObservable()); } /** * Simplifies the creation of {@link AllowedNetsService} instances */ export class AllowedNetsServiceFactory { _processService; _petriNetResource; _configService; _log; constructor(_processService, _petriNetResource, _configService, _log) { this._processService = _processService; this._petriNetResource = _petriNetResource; this._configService = _configService; this._log = _log; } /** * Creates an instance of {@link AllowedNetsService} without having to provide all the dependencies yourself. * @returns an instance of {@link AllowedNetsService} with all nets set as the `allowedNets` */ createWithAllNets() { let httpParams = new HttpParams() .set(PaginationParams.PAGE_SIZE, 10000); return new AllowedNetsService(this._petriNetResource.getAll(httpParams).pipe(switchMap(nets => { if (nets && Array.isArray(nets)) { return of(nets.map(n => n.identifier)); } else { return of([]); } })), this._processService); } /** * Creates an instance of {@link AllowedNetsService} without having to provide all the dependencies yourself. * @param allowedNetsIdentifiers identifiers of the allowed nets */ createFromArray(allowedNetsIdentifiers) { return new AllowedNetsService(of(allowedNetsIdentifiers), this._processService); } /** * Creates an instance of {@link AllowedNetsService} without having to provide all the dependencies yourself. * @param webViewPath path to the view as specified in its configuration. No leading backslash. * Allowed nets are loaded from the configuration of the view. */ createFromConfig(webViewPath) { const view = this._configService.getViewByPath(webViewPath); if (view?.layout?.params === undefined) { throw new Error(`Can't load configuration for view with webPath: '${webViewPath}'`); } const viewParams = view.layout.params; if (viewParams.allowedNets === undefined) { this._log.warn(`No 'allowedNets' provided for view with webPath '${webViewPath}'`); } return new AllowedNetsService(of(viewParams.allowedNets ?? []), this._processService); } /** * Creates an instance of {@link AllowedNetsService} without having to provide all the dependencies yourself. * @param netIdentifiers$ observable containing the identifiers of the allowed nets. * When a new value is emitted the allowed nets will be updated. */ createFromObservable(netIdentifiers$) { return new AllowedNetsService(netIdentifiers$, this._processService); } /** * Creates an instance of {@link AllowedNetsService} without having to provide all the dependencies yourself. * @param filterCase a filter process instance * Allowed nets are set from filter process immediate data */ createFromFilterCase(filterCase) { const filterData = getImmediateData(filterCase, UserFilterConstants.FILTER_FIELD_ID); if (filterData === undefined) { throw new Error(`Cannot get filter from case '${filterCase.title}' with id '${filterCase.stringId}'`); } return new AllowedNetsService(of(filterData.allowedNets), this._processService); } static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: AllowedNetsServiceFactory, deps: [{ token: i1.ProcessService }, { token: i2.PetriNetResourceService }, { token: i3.ConfigurationService }, { token: i4.LoggerService }], target: i0.ɵɵFactoryTarget.Injectable }); static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: AllowedNetsServiceFactory, providedIn: 'root' }); } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: AllowedNetsServiceFactory, decorators: [{ type: Injectable, args: [{ providedIn: 'root' }] }], ctorParameters: () => [{ type: i1.ProcessService }, { type: i2.PetriNetResourceService }, { type: i3.ConfigurationService }, { type: i4.LoggerService }] }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWxsb3dlZC1uZXRzLXNlcnZpY2UtZmFjdG9yeS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25ldGdyaWYtY29tcG9uZW50cy1jb3JlL3NyYy9saWIvYWxsb3dlZC1uZXRzL3NlcnZpY2VzL2ZhY3RvcnkvYWxsb3dlZC1uZXRzLXNlcnZpY2UtZmFjdG9yeS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUMsVUFBVSxFQUFDLE1BQU0sZUFBZSxDQUFDO0FBRXpDLE9BQU8sRUFBQyxrQkFBa0IsRUFBQyxNQUFNLHlCQUF5QixDQUFDO0FBQzNELE9BQU8sRUFBQyxTQUFTLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUN6QyxPQUFPLEVBQUUsZUFBZSxFQUFjLEVBQUUsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQVF2RCxPQUFPLEVBQUMsZ0JBQWdCLEVBQUMsTUFBTSxxQ0FBcUMsQ0FBQztBQUNyRSxPQUFPLEVBQUMsbUJBQW1CLEVBQUMsTUFBTSw4Q0FBOEMsQ0FBQztBQUVqRixPQUFPLEVBQUMsc0JBQXNCLEVBQUMsTUFBTSw0QkFBNEIsQ0FBQztBQUlsRSxPQUFPLEVBQUMsVUFBVSxFQUFDLE1BQU0sc0JBQXNCLENBQUM7QUFDaEQsT0FBTyxFQUFDLGdCQUFnQixFQUFDLE1BQU0sK0NBQStDLENBQUM7Ozs7OztBQUUvRSxTQUFTLGNBQWMsQ0FBQyxXQUFXLEVBQUUsbUJBQW1CO0lBQ3BELElBQUksQ0FBQyxDQUFDLFdBQVcsSUFBSSxXQUFXLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtRQUN6QyxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLFdBQVcsQ0FBQyxDQUFDLENBQUM7S0FDOUM7QUFDTCxDQUFDO0FBRUQ7Ozs7R0FJRztBQUNILE1BQU0sVUFBVSwrQkFBK0IsQ0FBQyxPQUFrQyxFQUNsQyxPQUFtQztJQUMvRSxPQUFPLE9BQU8sQ0FBQyxlQUFlLENBQUMs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Q0FBZ0MsVUFBVSxDQUFDLEtBQUssY0FBYyxVQUFVLENBQUMsUUFBUSxHQUFHLENBQUMsQ0FBQztTQUN6RztRQUNELE9BQU8sSUFBSSxrQkFBa0IsQ0FDekIsRUFBRSxDQUFDLFVBQVUsQ0FBQyxXQUFXLENBQUMsRUFDMUIsSUFBSSxDQUFDLGVBQWUsQ0FDdkIsQ0FBQztJQUNOLENBQUM7d0dBdEZRLHlCQUF5Qjs0R0FBekIseUJBQXlCLGNBRnRCLE1BQU07OzRGQUVULHlCQUF5QjtrQkFIckMsVUFBVTttQkFBQztvQkFDUixVQUFVLEVBQUUsTUFBTTtpQkFDckIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0luamVjdGFibGV9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtQcm9jZXNzU2VydmljZX0gZnJvbSAnLi4vLi4vLi4vcHJvY2Vzcy9wcm9jZXNzLnNlcnZpY2UnO1xuaW1wb3J0IHtBbGxvd2VkTmV0c1NlcnZpY2V9IGZyb20gJy4uL2FsbG93ZWQtbmV0cy5zZXJ2aWNlJztcbmltcG9ydCB7c3dpdGNoTWFwfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBCZWhhdmlvclN1YmplY3QsIE9ic2VydmFibGUsIG9mIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQge1BldHJpTmV0UmVzb3VyY2VTZXJ2aWNlfSBmcm9tICcuLi8uLi8uLi9yZXNvdXJjZXMvZW5naW5lLWVuZHBvaW50L3BldHJpLW5ldC1yZXNvdXJjZS5zZXJ2aWNlJztcbmltcG9ydCB7Q29uZmlndXJhdGlvblNlcnZpY2V9IGZyb20gJy4uLy4uLy4uL2NvbmZpZ3VyYXRpb24vY29uZmlndXJhdGlvbi5zZXJ2aWNlJztcbmltcG9ydCB7Q2FzZVZpZXdQYXJhbXN9IGZyb20gJy4uLy4uLy4uL3ZpZXcvY2FzZS12aWV3L21vZGVscy9jYXNlLXZpZXctcGFyYW1zJztcbmltcG9ydCB7TG9nZ2VyU2VydmljZX0gZnJvbSAnLi4vLi4vLi4vbG9nZ2VyL3NlcnZpY2VzL2xvZ2dlci5zZXJ2aWNlJztcbmltcG9ydCB7VGFza1ZpZXdQYXJhbXN9IGZyb20gJy4uLy4uLy4uL3ZpZXcvdGFzay12aWV3L21vZGVscy90YXNrLXZpZXctcGFyYW1zJztcbmltcG9ydCB7SW5qZWN0ZWRUYWJiZWRUYXNrVmlld0RhdGF9IGZyb20gJy4uLy4uLy4uL3ZpZXcvdGFzay12aWV3L21vZGVscy9pbmplY3RlZC10YWJiZWQtdGFzay12aWV3LWRhdGEnO1xuaW1wb3J0IHtDYXNlfSBmcm9tICcuLi8uLi8uLi9yZXNvdXJjZXMvaW50ZXJmYWNlL2Nhc2UnO1xuaW1wb3J0IHtnZXRJbW1lZGlhdGVEYXRhfSBmcm9tICcuLi8uLi8uLi91dGlsaXR5L2dldC1pbW1lZGlhdGUtZGF0YSc7XG5pbXBvcnQge1VzZXJGaWx0ZXJDb25zdGFudHN9IGZyb20gJy4uLy4uLy4uL2ZpbHRlci9tb2RlbHMvdXNlci1maWx0ZXItY29uc3RhbnRzJztcbmltcG9ydCB7RGF0YUdyb3VwfSBmcm9tICcuLi8uLi8uLi9yZXNvdXJjZXMvcHVibGljLWFwaSc7XG5pbXBvcnQge2dldEZpZWxkRnJvbURhdGFHcm91cHN9IGZyb20gJy4uLy4uLy4uL3V0aWxpdHkvZ2V0LWZpZWxkJztcbmltcG9ydCB7RmlsdGVyRmllbGR9IGZyb20gJy4uLy4uLy4uL2RhdGEtZmllbGRzL2ZpbHRlci1maWVsZC9tb2RlbHMvZmlsdGVyLWZpZWxkJztcbmltcG9ydCB7QmFzZUFsbG93ZWROZXRzU2VydmljZX0gZnJvbSAnLi4vYmFzZS1hbGxvd2VkLW5ldHMuc2VydmljZSc7XG5pbXBvcnQge011bHRpY2hvaWNlRmllbGR9IGZyb20gJy4uLy4uLy4uL2RhdGEtZmllbGRzL211bHRpY2hvaWNlLWZpZWxkL21vZGVscy9tdWx0aWNob2ljZS1maWVsZCc7XG5pbXBvcnQge0h0dHBQYXJhbXN9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9odHRwJztcbmltcG9ydCB7UGFnaW5hdGlvblBhcmFtc30gZnJvbSAnLi4vLi4vLi4vdXRpbGl0eS9wYWdpbmF0aW9uL3BhZ2luYXRpb24tcGFyYW1zJztcblxuZnVuY3Rpb24gYWRkQWxsb3dlZE5ldHMoYWxsb3dlZE5ldHMsIGV4aXN0aW5nQWxsb3dlZE5ldHMpIHtcbiAgICBpZiAoISFhbGxvd2VkTmV0cyAmJiBhbGxvd2VkTmV0cy5sZW5ndGggPiAwKSB7XG4gICAgICAgIGV4aXN0aW5nQWxsb3dlZE5ldHMubmV4dChbLi4uYWxsb3dlZE5ldHNdKTtcbiAgICB9XG59XG5cbi8qKlxuICogQ29udmVuaWVuY2UgbWV0aG9kIHRoYXQgY2FuIGJlIHVzZWQgYXMgYW4gYWxsb3dlZCBuZXRzIGZhY3RvcnkgZm9yIHRhYmJlZCB0YXNrIHZpZXdzLlxuICogSWYgbm8gYWxsb3dlZCBuZXRzIGFyZSBwcm92aWRlZCBpbiB0aGUgaW5qZWN0ZWQgZGF0YSB0aGVuIGFuIHtAbGluayBBbGxvd2VkTmV0c1NlcnZpY2V9IHdpdGggbm8gYWxsb3dlZCBuZXRzIGlzIGNyZWF0ZWQuXG4gKiBJdCBoYXMgYSBkZXBlbmRlbmN5IG9uIHRoaXMgY2xhc3MgYW5kIHtAbGluayBOQUVfVEFCX0RBVEF9IGluamVjdGlvbiB0b2tlbi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRhYmJlZEFsbG93ZWROZXRzU2VydmljZUZhY3RvcnkoZmFjdG9yeTogQWxsb3dlZE5ldHNTZXJ2aWNlRmFjdG9yeSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhYkRhdGE6IEluamVjdGVkVGFiYmVkVGFza1ZpZXdEYXRhKTogQWxsb3dlZE5ldHNTZXJ2aWNlIHtcbiAgICByZXR1cm4gZmFjdG9yeS5jcmVhdGVGcm9tQXJyYXkodGFiRGF0YT8uYWxsb3dlZE5ldHMgPz8gW10pO1xufVxuXG4vKipcbiAqIENvbnZlbmllbmNlIG1ldGhvZCB0aGF0IGNhbiBiZSB1c2VkIGFzIGFuIGFsbG93ZWQgbmV0cyBmYWN0b3J5IGZvciB2aWV3cyB0aGF0IGFyZSBsb2FkZWQgZnJvbSBmaWx0ZXIgcHJvY2VzcyBpbnN0YW5jZXMuXG4gKiBJdCBoYXMgYSBkZXBlbmRlbmN5IG9uIHRoaXMgY2xhc3MgYW5kIHtAbGluayBOQUVfTkFWSUdBVElPTl9JVEVNX1RBU0tfREFUQX0gaW5qZWN0aW9uIHRva2VuLlxuICovXG5leHBvcnQgZnVuY3Rpb24gbmF2aWdhdGlvbkl0ZW1UYXNrQWxsb3dlZE5ldHNTZXJ2aWNlRmFjdG9yeShmYWN0b3J5OiBBbGxvd2VkTmV0c1NlcnZpY2VGYWN0b3J5LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZUFsbG93ZWROZXRzOiBCYXNlQWxsb3dlZE5ldHNTZXJ2aWNlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmF2aWdhdGlvbkl0ZW1UYXNrRGF0YT86IEFycmF5PERhdGFHcm91cD4pOiBBbGxvd2VkTmV0c1NlcnZpY2Uge1xuICAgIGlmICghbmF2aWdhdGlvbkl0ZW1UYXNrRGF0YSkge1xuICAgICAgICByZXR1cm4gZmFjdG9yeS5jcmVhdGVXaXRoQWxsTmV0cygpO1xuICAgIH1cbiAgICBjb25zdCBmaWx0ZXJGaWVsZCA9IGdldEZpZWxkRnJvbURhdGFHcm91cHMobmF2aWdhdGlvbkl0ZW1UYXNrRGF0YSwgVXNlckZpbHRlckNvbnN0YW50cy5GSUxURVJfRklFTERfSUQpIGFzIEZpbHRlckZpZWxkO1xuICAgIGNvbnN0IGFsbG93ZWROZXRzRmllbGQgPSBnZXRGaWVsZEZyb21EYXRhR3JvdXBzKG5hdmlnYXRpb25JdGVtVGFza0RhdGEsIFVzZXJGaWx0ZXJDb25zdGFudHMuQUxMT1dFRF9ORVRTX0ZJRUxEX0lEKSBhcyBNdWx0aWNob2ljZUZpZWxkO1xuXG4gICAgaWYgKGZpbHRlckZpZWxkID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBQcm92aWRlZCBuYXZpZ2F0aW9uIGl0ZW0gdGFzayBkYXRhIGRvZXMgbm90IGNvbnRhaW4gYSBmaWx0ZXIgZmllbGQgd2l0aCBJRCAnJHtVc2VyRmlsdGVyQ29uc3RhbnRzLkZJTFRFUl9GSUVMRF9JRFxuICAgICAgICB9JyEgQWxsb3dlZCBuZXRzIGNhbm5vdCBiZSBnZW5lcmF0ZWQgZnJvbSBpdCFgKTtcbiAgICB9XG4gICAgY29uc3QgbmV0cyA9IG5ldyBCZWhhdmlvclN1YmplY3Q8QXJyYXk8c3RyaW5nPj4oQXJyYXkuZnJvbShuZXcgU2V0PHN0cmluZz4oWy4uLmZpbHRlckZpZWxkLmFsbG93ZWROZXRzXSkpKTtcbiAgICBpZiAoZmlsdGVyRmllbGQuZmlsdGVyTWV0YWRhdGEuaW5oZXJpdEFsbG93ZWROZXRzKSB7XG4gICAgICAgIGJhc2VBbGxvd2VkTmV0cy5hbGxvd2VkTmV0cyQuc3Vic2NyaWJlKGFsbG93ZWROZXRzID0+IHtcbiAgICAgICAgICAgIGNvbnN0IG5ldFNldCA9IG5ldyBTZXQ8c3RyaW5nPihhbGxvd2VkTmV0cyk7XG4gICAgICAgICAgICBuZXRzLm5leHQoQXJyYXkuZnJvbShuZXRTZXQpKTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGlmICghIWFsbG93ZWROZXRzRmllbGQpIHtcbiAgICAgICAgYWRkQWxsb3dlZE5ldHMoYWxsb3dlZE5ldHNGaWVsZC52YWx1ZSwgbmV0cyk7XG4gICAgICAgIGFsbG93ZWROZXRzRmllbGQudmFsdWVDaGFuZ2VzKCkuc3Vic2NyaWJlKGFsbG93ZWROZXRzID0+IHtcbiAgICAgICAgICAgIGFkZEFsbG93ZWROZXRzKGFsbG93ZWROZXRzRmllbGQudmFsdWUsIG5ldHMpO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIGZhY3RvcnkuY3JlYXRlRnJvbU9ic2VydmFibGUobmV0cy5hc09ic2VydmFibGUoKSk7XG59XG5cbi8qKlxuICogU2ltcGxpZmllcyB0aGUgY3JlYXRpb24gb2Yge0BsaW5rIEFsbG93ZWROZXRzU2VydmljZX0gaW5zdGFuY2VzXG4gKi9cbkBJbmplY3RhYmxlKHtcbiAgICBwcm92aWRlZEluOiAncm9vdCdcbn0pXG5leHBvcnQgY2xhc3MgQWxsb3dlZE5ldHNTZXJ2aWNlRmFjdG9yeSB7XG5cbiAgICBjb25zdHJ1Y3Rvcihwcm90ZWN0ZWQgX3Byb2Nlc3NTZXJ2aWNlOiBQcm9jZXNzU2VydmljZSxcbiAgICAgICAgICAgICAgICBwcm90ZWN0ZWQgX3BldHJpTmV0UmVzb3VyY2U6IFBldHJpTmV0UmVzb3VyY2VTZXJ2aWNlLFxuICAgICAgICAgICAgICAgIHByb3RlY3RlZCBfY29uZmlnU2VydmljZTogQ29uZmlndXJhdGlvblNlcnZpY2UsXG4gICAgICAgICAgICAgICAgcHJvdGVjdGVkIF9sb2c6IExvZ2dlclNlcnZpY2UpIHtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHtAbGluayBBbGxvd2VkTmV0c1NlcnZpY2V9IHdpdGhvdXQgaGF2aW5nIHRvIHByb3ZpZGUgYWxsIHRoZSBkZXBlbmRlbmNpZXMgeW91cnNlbGYuXG4gICAgICogQHJldHVybnMgYW4gaW5zdGFuY2Ugb2Yge0BsaW5rIEFsbG93ZWROZXRzU2VydmljZX0gd2l0aCBhbGwgbmV0cyBzZXQgYXMgdGhlIGBhbGxvd2VkTmV0c2BcbiAgICAgKi9cbiAgICBwdWJsaWMgY3JlYXRlV2l0aEFsbE5ldHMoKTogQWxsb3dlZE5ldHNTZXJ2aWNlIHtcbiAgICAgICAgbGV0IGh0dHBQYXJhbXMgPSBuZXcgSHR0cFBhcmFtcygpXG4gICAgICAgICAgICAuc2V0KFBhZ2luYXRpb25QYXJhbXMuUEFHRV9TSVpFLCAxMDAwMClcbiAgICAgICAgcmV0dXJuIG5ldyBBbGxvd2VkTmV0c1NlcnZpY2UoXG4gICAgICAgICAgICB0aGlzLl9wZXRyaU5ldFJlc291cmNlLmdldEFsbChodHRwUGFyYW1zKS5waXBlKFxuICAgICAgICAgICAgICAgIHN3aXRjaE1hcChuZXRzID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG5ldHMgJiYgQXJyYXkuaXNBcnJheShuZXRzKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG9mKG5ldHMubWFwKG4gPT4gbi5pZGVudGlmaWVyKSk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gb2YoW10pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICksXG4gICAgICAgICAgICB0aGlzLl9wcm9jZXNzU2VydmljZVxuICAgICAgICApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2Yge0BsaW5rIEFsbG93ZWROZXRzU2VydmljZX0gd2l0aG91dCBoYXZpbmcgdG8gcHJvdmlkZSBhbGwgdGhlIGRlcGVuZGVuY2llcyB5b3Vyc2VsZi5cbiAgICAgKiBAcGFyYW0gYWxsb3dlZE5ldHNJZGVudGlmaWVycyBpZGVudGlmaWVycyBvZiB0aGUgYWxsb3dlZCBuZXRzXG4gICAgICovXG4gICAgcHVibGljIGNyZWF0ZUZyb21BcnJheShhbGxvd2VkTmV0c0lkZW50aWZpZXJzOiBBcnJheTxzdHJpbmc+KTogQWxsb3dlZE5ldHNTZXJ2aWNlIHtcbiAgICAgICAgcmV0dXJuIG5ldyBBbGxvd2VkTmV0c1NlcnZpY2UoXG4gICAgICAgICAgICBvZihhbGxvd2VkTmV0c0lkZW50aWZpZXJzKSxcbiAgICAgICAgICAgIHRoaXMuX3Byb2Nlc3NTZXJ2aWNlXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB7QGxpbmsgQWxsb3dlZE5ldHNTZXJ2aWNlfSB3aXRob3V0IGhhdmluZyB0byBwcm92aWRlIGFsbCB0aGUgZGVwZW5kZW5jaWVzIHlvdXJzZWxmLlxuICAgICAqIEBwYXJhbSB3ZWJWaWV3UGF0aCBwYXRoIHRvIHRoZSB2aWV3IGFzIHNwZWNpZmllZCBpbiBpdHMgY29uZmlndXJhdGlvbi4gTm8gbGVhZGluZyBiYWNrc2xhc2guXG4gICAgICogQWxsb3dlZCBuZXRzIGFyZSBsb2FkZWQgZnJvbSB0aGUgY29uZmlndXJhdGlvbiBvZiB0aGUgdmlldy5cbiAgICAgKi9cbiAgICBwdWJsaWMgY3JlYXRlRnJvbUNvbmZpZyh3ZWJWaWV3UGF0aDogc3RyaW5nKTogQWxsb3dlZE5ldHNTZXJ2aWNlIHtcbiAgICAgICAgY29uc3QgdmlldyA9IHRoaXMuX2NvbmZpZ1NlcnZpY2UuZ2V0Vmlld0J5UGF0aCh3ZWJWaWV3UGF0aCk7XG4gICAgICAgIGlmICh2aWV3Py5sYXlvdXQ/LnBhcmFtcyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYENhbid0IGxvYWQgY29uZmlndXJhdGlvbiBmb3IgdmlldyB3aXRoIHdlYlBhdGg6ICcke3dlYlZpZXdQYXRofSdgKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB2aWV3UGFyYW1zID0gdmlldy5sYXlvdXQucGFyYW1zIGFzIENhc2VWaWV3UGFyYW1zIHwgVGFza1ZpZXdQYXJhbXM7XG4gICAgICAgIGlmICh2aWV3UGFyYW1zLmFsbG93ZWROZXRzID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRoaXMuX2xvZy53YXJuKGBObyAnYWxsb3dlZE5ldHMnIHByb3ZpZGVkIGZvciB2aWV3IHdpdGggd2ViUGF0aCAnJHt3ZWJWaWV3UGF0aH0nYCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBBbGxvd2VkTmV0c1NlcnZpY2UoXG4gICAgICAgICAgICBvZih2aWV3UGFyYW1zLmFsbG93ZWROZXRzID8/IFtdKSxcbiAgICAgICAgICAgIHRoaXMuX3Byb2Nlc3NTZXJ2aWNlXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB7QGxpbmsgQWxsb3dlZE5ldHNTZXJ2aWNlfSB3aXRob3V0IGhhdmluZyB0byBwcm92aWRlIGFsbCB0aGUgZGVwZW5kZW5jaWVzIHlvdXJzZWxmLlxuICAgICAqIEBwYXJhbSBuZXRJZGVudGlmaWVycyQgb2JzZXJ2YWJsZSBjb250YWluaW5nIHRoZSBpZGVudGlmaWVycyBvZiB0aGUgYWxsb3dlZCBuZXRzLlxuICAgICAqIFdoZW4gYSBuZXcgdmFsdWUgaXMgZW1pdHRlZCB0aGUgYWxsb3dlZCBuZXRzIHdpbGwgYmUgdXBkYXRlZC5cbiAgICAgKi9cbiAgICBwdWJsaWMgY3JlYXRlRnJvbU9ic2VydmFibGUobmV0SWRlbnRpZmllcnMkOiBPYnNlcnZhYmxlPEFycmF5PHN0cmluZz4+KTogQWxsb3dlZE5ldHNTZXJ2aWNlIHtcbiAgICAgICAgcmV0dXJuIG5ldyBBbGxvd2VkTmV0c1NlcnZpY2UoXG4gICAgICAgICAgICBuZXRJZGVudGlmaWVycyQsXG4gICAgICAgICAgICB0aGlzLl9wcm9jZXNzU2VydmljZVxuICAgICAgICApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2Yge0BsaW5rIEFsbG93ZWROZXRzU2VydmljZX0gd2l0aG91dCBoYXZpbmcgdG8gcHJvdmlkZSBhbGwgdGhlIGRlcGVuZGVuY2llcyB5b3Vyc2VsZi5cbiAgICAgKiBAcGFyYW0gZmlsdGVyQ2FzZSBhIGZpbHRlciBwcm9jZXNzIGluc3RhbmNlXG4gICAgICogQWxsb3dlZCBuZXRzIGFyZSBzZXQgZnJvbSBmaWx0ZXIgcHJvY2VzcyBpbW1lZGlhdGUgZGF0YVxuICAgICAqL1xuICAgIHB1YmxpYyBjcmVhdGVGcm9tRmlsdGVyQ2FzZShmaWx0ZXJDYXNlOiBDYXNlKTogQWxsb3dlZE5ldHNTZXJ2aWNlIHtcbiAgICAgICAgY29uc3QgZmlsdGVyRGF0YSA9IGdldEltbWVkaWF0ZURhdGEoZmlsdGVyQ2FzZSwgVXNlckZpbHRlckNvbnN0YW50cy5GSUxURVJfRklFTERfSUQpO1xuICAgICAgICBpZiAoZmlsdGVyRGF0YSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYENhbm5vdCBnZXQgZmlsdGVyIGZyb20gY2FzZSAnJHtmaWx0ZXJDYXNlLnRpdGxlfScgd2l0aCBpZCAnJHtmaWx0ZXJDYXNlLnN0cmluZ0lkfSdgKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3IEFsbG93ZWROZXRzU2VydmljZShcbiAgICAgICAgICAgIG9mKGZpbHRlckRhdGEuYWxsb3dlZE5ldHMpLFxuICAgICAgICAgICAgdGhpcy5fcHJvY2Vzc1NlcnZpY2VcbiAgICAgICAgKTtcbiAgICB9XG59XG4iXX0=