@linid-dm/directory-manager-client-core
Version:
Core package by providing a set of angular components for the Directory Manager app.
249 lines • 67.3 kB
JavaScript
import { __decorate } from "tslib";
import { Component, EventEmitter, Input, Output, } from '@angular/core';
import { Select } from '@ngxs/store';
import { Subject, takeUntil, tap } from 'rxjs';
import { Data, DataState, EComponentName, Routing, UiState, getChipValue, getFlatResource, getOrderedKeysSimpleAttributes, getSucceededNotifications, isAttributeValueMatchingChip, isLinkObject, setDataAttribute, setLinkAttributeResource, setTabTitle, } from '../../shared';
import * as i0 from "@angular/core";
import * as i1 from "../../shared";
import * as i2 from "@ngxs/store";
import * as i3 from "@angular/common";
import * as i4 from "@angular/router";
import * as i5 from "@angular/platform-browser";
import * as i6 from "@angular/flex-layout/flex";
import * as i7 from "@angular/flex-layout/extended";
import * as i8 from "@angular/material/icon";
import * as i9 from "../../shared/directives/flex-grow-fit-content.directive";
export class DataDetailSimpleAttributesComponent {
set selectedResourceTypeId(selectedResourceTypeId) {
if (selectedResourceTypeId) {
this._selectedResourceTypeId = selectedResourceTypeId;
this._simpleAttributesConfig = this.configs.byId[this._selectedResourceTypeId].attributes.filter((attribute) => attribute.value.field.componentName !== EComponentName.array);
}
}
get selectedResourceTypeId() {
return this._selectedResourceTypeId;
}
set dataDetail(dataDetail) {
this._dataDetail = dataDetail;
if (this._dataDetail) {
const config = this.configs.byId[this._selectedResourceTypeId];
const externalId = this._dataDetail.externalId;
const succeededElement = {
id: this._dataDetail.id,
externalId,
label: externalId,
};
this._dataDetail = getFlatResource(this._dataDetail, config);
const orderKeysByAttributeId = getOrderedKeysSimpleAttributes(this._simpleAttributesConfig, this._dataDetail);
this.nbSimpleAttributes = 0;
const authorizedEndpoints = this.resourcesTypes.allIds
.filter((resourceTypeId) => this.configs.allIds.includes(resourceTypeId))
.map((resourceTypeId) => this.resourcesTypes.byId[resourceTypeId].endpoint);
const previousSimpleAttributes = this.simpleAttributes;
this.simpleAttributes = [];
let advancedSearchChips = [];
const areUpdatedAttributesMatchingAdvancedSearch = [];
if (this.isUpdatingDataDetail) {
if (externalId.toLocaleUpperCase() !==
this.selectedEntryIds.externalId.toLocaleUpperCase()) {
this._updateExternalId(externalId);
}
advancedSearchChips = this._store$.selectSnapshot(DataState.getAdvancedSearchChips);
}
orderKeysByAttributeId.forEach((key) => {
// Get current attribute configuration
const attributeConfig = config.attributes.find((attribute) => attribute.modelRef === key);
const attributeComponentName = attributeConfig.value.field.componentName;
if (attributeComponentName !== EComponentName.array) {
if (attributeConfig.isDetailTitle) {
this.displayName = this._dataDetail[key];
}
if (attributeConfig.props.isTreeNodeName ||
attributeConfig.props.isListItemName) {
succeededElement.label = this._dataDetail[key];
}
if (this.isUpdatingDataDetail) {
const previousDataDetailField = previousSimpleAttributes.find((dataDetailField) => dataDetailField.id === key);
const matchedChip = advancedSearchChips.find((chip) => chip.modelRef === key);
if (!!previousDataDetailField &&
this._dataDetail[key] !== previousDataDetailField.dataValue) {
if (!!matchedChip) {
const attributeValue = isLinkObject(this._dataDetail[key])
? this._dataDetail[key].id
: this._dataDetail[key];
areUpdatedAttributesMatchingAdvancedSearch.push(isAttributeValueMatchingChip(getChipValue(matchedChip), attributeValue, attributeConfig));
}
if (attributeConfig.props.isTreeNodeName ||
attributeConfig.props.isListItemName) {
succeededElement.label = this._dataDetail[key];
if (attributeConfig.props.isTreeNodeName) {
this._interactionsService.updateTreeNodeName(this._dataDetail[key]);
}
else {
this._interactionsService.updateListItemName(this._dataDetail[key]);
}
}
}
}
const value = attributeConfig.props
.isBackendLinkObject
? setLinkAttributeResource(this._dataDetail[key], attributeConfig.getValuesParams.requestTarget, authorizedEndpoints)
: this._dataDetail[key];
this.simpleAttributes.push(setDataAttribute(value, attributeConfig, this._envService.ui.displayDateFormat));
this.nbSimpleAttributes++;
}
});
if (areUpdatedAttributesMatchingAdvancedSearch.length > 0) {
this._interactionsService.updateFilteredDetailAttributes(areUpdatedAttributesMatchingAdvancedSearch.reduce((acc, curr) => acc && curr));
}
this.setFxFlexPropertyForAllAttributes();
if (this.isUpdatingDataDetail) {
const message = getSucceededNotifications([succeededElement], this.editAction);
this.evtSuccess.emit(message);
}
this.evtSimpleAttributesProcessed.emit(this.simpleAttributes);
}
}
get dataDetail() {
return this._dataDetail;
}
constructor(_interactionsService, _store$, _location, _router, _titleService, _envService) {
this._interactionsService = _interactionsService;
this._store$ = _store$;
this._location = _location;
this._router = _router;
this._titleService = _titleService;
this._envService = _envService;
this._onDestroy$ = new Subject();
this.detailAttributesFxFlexProperty = {};
this.componentNameType = EComponentName;
this.evtSimpleAttributesProcessed = new EventEmitter();
this.evtSuccess = new EventEmitter();
}
ngOnInit() {
this.screenSize$
.pipe(takeUntil(this._onDestroy$), tap((ss) => {
this._screenSize = ss;
this.setFxFlexPropertyForAllAttributes();
this._setFieldMinWidth(ss);
}))
.subscribe();
}
ngOnDestroy() {
this._onDestroy$.next();
this._onDestroy$.complete();
}
getOnDetail(id) {
this._store$.dispatch(new Data.SetSelectedEntryId({ id }));
}
setFxFlex(attributeId, screenSize = null) {
let flexGrow = 0;
let flexShrink = 0;
let flexBasis = 'auto';
const currentAttribute = this.configs.byId[this._selectedResourceTypeId].attributes.find((attribute) => attribute.modelRef === attributeId);
const isTextArea = currentAttribute?.value.field.componentName === EComponentName.textarea;
if (currentAttribute?.props?.isMultiple ||
isTextArea ||
currentAttribute?.props?.isExternalLink) {
flexGrow = 1;
flexShrink = 1;
if (isTextArea || currentAttribute?.props?.isExternalLink) {
flexBasis = '100%';
}
}
else if (this.nbSimpleAttributes > 2) {
switch (screenSize) {
case 'sm':
case 'xs':
flexBasis = '100%';
break;
case 'md':
flexBasis = '50%';
break;
default:
flexBasis = '33.3%';
break;
}
}
this.detailAttributesFxFlexProperty[attributeId] =
flexGrow + ' ' + flexShrink + ' ' + flexBasis;
}
_setFieldMinWidth(screenSize) {
switch (screenSize) {
case 'sm':
case 'xs':
this.fieldMinWidth = '100%';
break;
case 'md':
this.fieldMinWidth = '50%';
break;
default:
this.fieldMinWidth = '33.3%';
break;
}
}
setFxFlexPropertyForAllAttributes() {
this.detailAttributesFxFlexProperty = {};
this.simpleAttributes.forEach((attribute) => this.setFxFlex(attribute.id, this._screenSize));
}
_updateExternalId(newValue) {
this._interactionsService.updateExternalId(newValue);
const updatedUrl = this._router.url.replace(/[^/]+$/g, encodeURIComponent(newValue.toLowerCase()));
this.selectedEntryIds.externalId = newValue;
this._store$.dispatch([
new Data.SetSelectedEntryExternalId({
externalId: newValue,
}),
new Routing.UpdateSelectedEntryRoute({
route: {
url: updatedUrl,
extras: {
ids: this.selectedEntryIds,
parentIds: this.selectedEntryParentIds,
},
},
}),
]);
setTabTitle(this.tab, this._titleService, null, this.configs.byId[this._selectedResourceTypeId], this.selectedEntryParentIds, this.selectedEntryIds);
this._location.replaceState(updatedUrl, '', this._location.getState());
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.4", ngImport: i0, type: DataDetailSimpleAttributesComponent, deps: [{ token: i1.InteractionsService }, { token: i2.Store }, { token: i3.Location }, { token: i4.Router }, { token: i5.Title }, { token: i1.EnvService }], target: i0.ɵɵFactoryTarget.Component }); }
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.4", type: DataDetailSimpleAttributesComponent, selector: "dm-data-detail-simple-attributes", inputs: { tab: "tab", configs: "configs", resourcesTypes: "resourcesTypes", selectedEntryIds: "selectedEntryIds", selectedEntryParentIds: "selectedEntryParentIds", editAction: "editAction", editableAttributesFromBackend: "editableAttributesFromBackend", isUpdatingDataDetail: "isUpdatingDataDetail", areSimpleAttributesProcessed: "areSimpleAttributesProcessed", selectedResourceTypeId: "selectedResourceTypeId", dataDetail: "dataDetail" }, outputs: { evtSimpleAttributesProcessed: "evtSimpleAttributesProcessed", evtSuccess: "evtSuccess" }, ngImport: i0, template: "<!-- Copyright (C) 2020-2024 Linagora\n\nThis program is free software: you can redistribute it and/or modify it under\nthe terms of the GNU Affero General Public License as published by the Free\nSoftware Foundation, either version 3 of the License, or (at your option) any\nlater version, provided you comply with the Additional Terms applicable for\nLinID Directory Manager software by LINAGORA pursuant to Section 7 of the GNU\nAffero General Public License, subsections (b), (c), and (e), pursuant to\nwhich these Appropriate Legal Notices must notably (i) retain the display of\nthe \"LinID\u2122\" trademark/logo at the top of the interface window, the display\nof the \u201CYou are using the Open Source and free version of LinID\u2122, powered by\nLinagora \u00A9 2009\u20132013. Contribute to LinID R&D by subscribing to an Enterprise\noffer!\u201D infobox and in the e-mails sent with the Program, notice appended to\nany type of outbound messages (e.g. e-mail and meeting requests) as well as\nin the LinID Directory Manager user interface, (ii) retain all hypertext\nlinks between LinID Directory Manager and https://linid.org/, as well as\nbetween LINAGORA and LINAGORA.com, and (iii) refrain from infringing LINAGORA\nintellectual property rights over its trademarks and commercial brands. Other\nAdditional Terms apply, see <http://www.linagora.com/licenses/> for more\ndetails.\n\nThis program is distributed in the hope that it will be useful, but WITHOUT\nANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS\nFOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more\ndetails.\n\nYou should have received a copy of the GNU Affero General Public License and\nits applicable Additional Terms for LinID Directory Manager along with this\nprogram. If not, see <http://www.gnu.org/licenses/> for the GNU Affero\nGeneral Public License version 3 and <http://www.linagora.com/licenses/> for\nthe Additional Terms applicable to the LinID Directory Manager software. -->\n\n<div\n *ngIf=\"areSimpleAttributesProcessed\"\n fxLayout=\"{{ nbSimpleAttributes > 2 ? 'row wrap' : 'column' }}\"\n class=\"div-simple-attributes\"\n>\n <ng-container *ngFor=\"let detail of simpleAttributes\">\n <div\n flexGrowFitContent\n *ngIf=\"detail?.isVisible && detail?.componentName !== 'array'\"\n [style.minWidth]=\"fieldMinWidth\"\n [style.flex]=\"detailAttributesFxFlexProperty[detail.id]\"\n [ngClass]=\"[\n detail.componentName !== 'img-input' ? 'detail' : '',\n detail.id\n ]\"\n [minWidth]=\"fieldMinWidth\"\n >\n <div\n *ngIf=\"detail?.componentName === 'img-input'; else displayData\"\n class=\"detail-img-div\"\n >\n <img\n #currentImg\n [src]=\"'data:image/jpeg;base64,' + detail.dataValue.toString()\"\n [alt]=\"detail.label.long\"\n [ngClass]=\"\n currentImg.width / currentImg.height > 1\n ? 'detail-img-landscape'\n : 'detail-img-portrait'\n \"\n />\n </div>\n <ng-template #displayData>\n <div fxLayout=\"row\" fxLayoutAlign=\"start center\" class=\"detail-label\">\n <mat-icon aria-hidden=\"true\" class=\"detail-icon\">{{\n detail.icon\n }}</mat-icon>\n <span [title]=\"detail.label.long\" class=\"label ellipsis\">\n {{ detail.label.long }} :\n </span>\n </div>\n <div\n *ngIf=\"!detail?.isBackendLinkObject; else linkObjectField\"\n [title]=\"detail.booleanDisplayedValue ?? detail.dataValue\"\n [ngClass]=\"\n detail.componentName !== componentNameType.textarea\n ? 'ellipsis'\n : 'break-word'\n \"\n class=\"text-field\"\n >\n <a\n *ngIf=\"detail?.isExternalLink; else textField\"\n draggable=\"false\"\n target=\"_blank\"\n [href]=\"detail.dataValue\"\n class=\"external-link\"\n >\n {{ detail.dataValue }}\n </a>\n <ng-template #textField>\n {{ detail.booleanDisplayedValue ?? detail.dataValue }}\n </ng-template>\n </div>\n <ng-template #linkObjectField>\n <ng-template\n #dataDetailResourceTemplate\n let-dataDetailResource=\"dataDetailResource\"\n >\n <span\n *ngIf=\"dataDetailResource.isClickable; else noClickableValue\"\n [routerLink]=\"dataDetailResource.routerLinkValue\"\n (click)=\"getOnDetail(dataDetailResource.id)\"\n [ngClass]=\"{ ellipsis: !detail?.isMultiple }\"\n class=\"text-field-link\"\n >\n {{ dataDetailResource.value }}\n </span>\n <ng-template #noClickableValue>\n <span\n [ngClass]=\"{ ellipsis: !detail?.isMultiple }\"\n class=\"ellipsis\"\n >{{ dataDetailResource.value }}</span\n >\n </ng-template>\n </ng-template>\n <div fxLayout=\"row wrap\" class=\"text-field\">\n <ng-container\n *ngIf=\"!detail?.isMultiple; else multipleLinks\"\n [ngTemplateOutlet]=\"dataDetailResourceTemplate\"\n [ngTemplateOutletContext]=\"{\n dataDetailResource: detail.dataValue\n }\"\n >\n </ng-container>\n <ng-template #multipleLinks>\n <ng-container\n *ngFor=\"let value of detail.dataValue; let i = index\"\n >\n <ng-container\n [ngTemplateOutlet]=\"dataDetailResourceTemplate\"\n [ngTemplateOutletContext]=\"{ dataDetailResource: value }\"\n ></ng-container>\n <span *ngIf=\"i < detail?.dataValue?.length - 1\"> , </span>\n </ng-container>\n </ng-template>\n </div>\n </ng-template>\n </ng-template>\n </div>\n </ng-container>\n</div>\n", styles: ["@charset \"UTF-8\";.div-simple-attributes{padding:16px 20px}.detail{padding-top:10px}.detail .detail-label .detail-icon{margin-right:6px;color:#0000008a}.detail .detail-label .label{width:calc(90% - 12px);color:#0000008a}.detail-img-div{margin-bottom:10px}.text-field{margin-left:30px;white-space:pre-line}.text-field-link,.external-link{cursor:pointer}.text-field-link:hover,.external-link:hover{font-weight:700}a.external-link{text-decoration:none}.break-word{overflow-wrap:break-word}\n"], dependencies: [{ kind: "directive", type: i3.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i3.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i4.RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }, { kind: "directive", type: i6.DefaultLayoutDirective, selector: " [fxLayout], [fxLayout.xs], [fxLayout.sm], [fxLayout.md], [fxLayout.lg], [fxLayout.xl], [fxLayout.lt-sm], [fxLayout.lt-md], [fxLayout.lt-lg], [fxLayout.lt-xl], [fxLayout.gt-xs], [fxLayout.gt-sm], [fxLayout.gt-md], [fxLayout.gt-lg]", inputs: ["fxLayout", "fxLayout.xs", "fxLayout.sm", "fxLayout.md", "fxLayout.lg", "fxLayout.xl", "fxLayout.lt-sm", "fxLayout.lt-md", "fxLayout.lt-lg", "fxLayout.lt-xl", "fxLayout.gt-xs", "fxLayout.gt-sm", "fxLayout.gt-md", "fxLayout.gt-lg"] }, { kind: "directive", type: i6.DefaultLayoutAlignDirective, selector: " [fxLayoutAlign], [fxLayoutAlign.xs], [fxLayoutAlign.sm], [fxLayoutAlign.md], [fxLayoutAlign.lg], [fxLayoutAlign.xl], [fxLayoutAlign.lt-sm], [fxLayoutAlign.lt-md], [fxLayoutAlign.lt-lg], [fxLayoutAlign.lt-xl], [fxLayoutAlign.gt-xs], [fxLayoutAlign.gt-sm], [fxLayoutAlign.gt-md], [fxLayoutAlign.gt-lg]", inputs: ["fxLayoutAlign", "fxLayoutAlign.xs", "fxLayoutAlign.sm", "fxLayoutAlign.md", "fxLayoutAlign.lg", "fxLayoutAlign.xl", "fxLayoutAlign.lt-sm", "fxLayoutAlign.lt-md", "fxLayoutAlign.lt-lg", "fxLayoutAlign.lt-xl", "fxLayoutAlign.gt-xs", "fxLayoutAlign.gt-sm", "fxLayoutAlign.gt-md", "fxLayoutAlign.gt-lg"] }, { kind: "directive", type: i7.DefaultClassDirective, selector: " [ngClass], [ngClass.xs], [ngClass.sm], [ngClass.md], [ngClass.lg], [ngClass.xl], [ngClass.lt-sm], [ngClass.lt-md], [ngClass.lt-lg], [ngClass.lt-xl], [ngClass.gt-xs], [ngClass.gt-sm], [ngClass.gt-md], [ngClass.gt-lg]", inputs: ["ngClass", "ngClass.xs", "ngClass.sm", "ngClass.md", "ngClass.lg", "ngClass.xl", "ngClass.lt-sm", "ngClass.lt-md", "ngClass.lt-lg", "ngClass.lt-xl", "ngClass.gt-xs", "ngClass.gt-sm", "ngClass.gt-md", "ngClass.gt-lg"] }, { kind: "component", type: i8.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: i9.FlexGrowFitContentDirective, selector: "[flexGrowFitContent]", inputs: ["minWidth"] }] }); }
}
__decorate([
Select(UiState.getScreenSize)
], DataDetailSimpleAttributesComponent.prototype, "screenSize$", void 0);
__decorate([
Select(DataState.getAdvancedSearchChips)
], DataDetailSimpleAttributesComponent.prototype, "advancedSearchChips$", void 0);
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.4", ngImport: i0, type: DataDetailSimpleAttributesComponent, decorators: [{
type: Component,
args: [{ selector: 'dm-data-detail-simple-attributes', template: "<!-- Copyright (C) 2020-2024 Linagora\n\nThis program is free software: you can redistribute it and/or modify it under\nthe terms of the GNU Affero General Public License as published by the Free\nSoftware Foundation, either version 3 of the License, or (at your option) any\nlater version, provided you comply with the Additional Terms applicable for\nLinID Directory Manager software by LINAGORA pursuant to Section 7 of the GNU\nAffero General Public License, subsections (b), (c), and (e), pursuant to\nwhich these Appropriate Legal Notices must notably (i) retain the display of\nthe \"LinID\u2122\" trademark/logo at the top of the interface window, the display\nof the \u201CYou are using the Open Source and free version of LinID\u2122, powered by\nLinagora \u00A9 2009\u20132013. Contribute to LinID R&D by subscribing to an Enterprise\noffer!\u201D infobox and in the e-mails sent with the Program, notice appended to\nany type of outbound messages (e.g. e-mail and meeting requests) as well as\nin the LinID Directory Manager user interface, (ii) retain all hypertext\nlinks between LinID Directory Manager and https://linid.org/, as well as\nbetween LINAGORA and LINAGORA.com, and (iii) refrain from infringing LINAGORA\nintellectual property rights over its trademarks and commercial brands. Other\nAdditional Terms apply, see <http://www.linagora.com/licenses/> for more\ndetails.\n\nThis program is distributed in the hope that it will be useful, but WITHOUT\nANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS\nFOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more\ndetails.\n\nYou should have received a copy of the GNU Affero General Public License and\nits applicable Additional Terms for LinID Directory Manager along with this\nprogram. If not, see <http://www.gnu.org/licenses/> for the GNU Affero\nGeneral Public License version 3 and <http://www.linagora.com/licenses/> for\nthe Additional Terms applicable to the LinID Directory Manager software. -->\n\n<div\n *ngIf=\"areSimpleAttributesProcessed\"\n fxLayout=\"{{ nbSimpleAttributes > 2 ? 'row wrap' : 'column' }}\"\n class=\"div-simple-attributes\"\n>\n <ng-container *ngFor=\"let detail of simpleAttributes\">\n <div\n flexGrowFitContent\n *ngIf=\"detail?.isVisible && detail?.componentName !== 'array'\"\n [style.minWidth]=\"fieldMinWidth\"\n [style.flex]=\"detailAttributesFxFlexProperty[detail.id]\"\n [ngClass]=\"[\n detail.componentName !== 'img-input' ? 'detail' : '',\n detail.id\n ]\"\n [minWidth]=\"fieldMinWidth\"\n >\n <div\n *ngIf=\"detail?.componentName === 'img-input'; else displayData\"\n class=\"detail-img-div\"\n >\n <img\n #currentImg\n [src]=\"'data:image/jpeg;base64,' + detail.dataValue.toString()\"\n [alt]=\"detail.label.long\"\n [ngClass]=\"\n currentImg.width / currentImg.height > 1\n ? 'detail-img-landscape'\n : 'detail-img-portrait'\n \"\n />\n </div>\n <ng-template #displayData>\n <div fxLayout=\"row\" fxLayoutAlign=\"start center\" class=\"detail-label\">\n <mat-icon aria-hidden=\"true\" class=\"detail-icon\">{{\n detail.icon\n }}</mat-icon>\n <span [title]=\"detail.label.long\" class=\"label ellipsis\">\n {{ detail.label.long }} :\n </span>\n </div>\n <div\n *ngIf=\"!detail?.isBackendLinkObject; else linkObjectField\"\n [title]=\"detail.booleanDisplayedValue ?? detail.dataValue\"\n [ngClass]=\"\n detail.componentName !== componentNameType.textarea\n ? 'ellipsis'\n : 'break-word'\n \"\n class=\"text-field\"\n >\n <a\n *ngIf=\"detail?.isExternalLink; else textField\"\n draggable=\"false\"\n target=\"_blank\"\n [href]=\"detail.dataValue\"\n class=\"external-link\"\n >\n {{ detail.dataValue }}\n </a>\n <ng-template #textField>\n {{ detail.booleanDisplayedValue ?? detail.dataValue }}\n </ng-template>\n </div>\n <ng-template #linkObjectField>\n <ng-template\n #dataDetailResourceTemplate\n let-dataDetailResource=\"dataDetailResource\"\n >\n <span\n *ngIf=\"dataDetailResource.isClickable; else noClickableValue\"\n [routerLink]=\"dataDetailResource.routerLinkValue\"\n (click)=\"getOnDetail(dataDetailResource.id)\"\n [ngClass]=\"{ ellipsis: !detail?.isMultiple }\"\n class=\"text-field-link\"\n >\n {{ dataDetailResource.value }}\n </span>\n <ng-template #noClickableValue>\n <span\n [ngClass]=\"{ ellipsis: !detail?.isMultiple }\"\n class=\"ellipsis\"\n >{{ dataDetailResource.value }}</span\n >\n </ng-template>\n </ng-template>\n <div fxLayout=\"row wrap\" class=\"text-field\">\n <ng-container\n *ngIf=\"!detail?.isMultiple; else multipleLinks\"\n [ngTemplateOutlet]=\"dataDetailResourceTemplate\"\n [ngTemplateOutletContext]=\"{\n dataDetailResource: detail.dataValue\n }\"\n >\n </ng-container>\n <ng-template #multipleLinks>\n <ng-container\n *ngFor=\"let value of detail.dataValue; let i = index\"\n >\n <ng-container\n [ngTemplateOutlet]=\"dataDetailResourceTemplate\"\n [ngTemplateOutletContext]=\"{ dataDetailResource: value }\"\n ></ng-container>\n <span *ngIf=\"i < detail?.dataValue?.length - 1\"> , </span>\n </ng-container>\n </ng-template>\n </div>\n </ng-template>\n </ng-template>\n </div>\n </ng-container>\n</div>\n", styles: ["@charset \"UTF-8\";.div-simple-attributes{padding:16px 20px}.detail{padding-top:10px}.detail .detail-label .detail-icon{margin-right:6px;color:#0000008a}.detail .detail-label .label{width:calc(90% - 12px);color:#0000008a}.detail-img-div{margin-bottom:10px}.text-field{margin-left:30px;white-space:pre-line}.text-field-link,.external-link{cursor:pointer}.text-field-link:hover,.external-link:hover{font-weight:700}a.external-link{text-decoration:none}.break-word{overflow-wrap:break-word}\n"] }]
}], ctorParameters: () => [{ type: i1.InteractionsService }, { type: i2.Store }, { type: i3.Location }, { type: i4.Router }, { type: i5.Title }, { type: i1.EnvService }], propDecorators: { screenSize$: [], advancedSearchChips$: [], tab: [{
type: Input
}], configs: [{
type: Input
}], resourcesTypes: [{
type: Input
}], selectedEntryIds: [{
type: Input
}], selectedEntryParentIds: [{
type: Input
}], editAction: [{
type: Input
}], editableAttributesFromBackend: [{
type: Input
}], isUpdatingDataDetail: [{
type: Input
}], areSimpleAttributesProcessed: [{
type: Input
}], selectedResourceTypeId: [{
type: Input
}], dataDetail: [{
type: Input
}], evtSimpleAttributesProcessed: [{
type: Output
}], evtSuccess: [{
type: Output
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0YS1kZXRhaWwtc2ltcGxlLWF0dHJpYnV0ZXMuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvbGlicy9jbGllbnQtY29yZS9zcmMvbGliL3VpL2RhdGEtZGV0YWlsLXNpbXBsZS1hdHRyaWJ1dGVzL2RhdGEtZGV0YWlsLXNpbXBsZS1hdHRyaWJ1dGVzLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL2xpYnMvY2xpZW50LWNvcmUvc3JjL2xpYi91aS9kYXRhLWRldGFpbC1zaW1wbGUtYXR0cmlidXRlcy9kYXRhLWRldGFpbC1zaW1wbGUtYXR0cmlidXRlcy5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBbUNBLE9BQU8sRUFDTCxTQUFTLEVBQ1QsWUFBWSxFQUNaLEtBQUssRUFHTCxNQUFNLEdBQ1AsTUFBTSxlQUFlLENBQUM7QUFHdkIsT0FBTyxFQUFFLE1BQU0sRUFBUyxNQUFNLGFBQWEsQ0FBQztBQUM1QyxPQUFPLEVBQWMsT0FBTyxFQUFFLFNBQVMsRUFBRSxHQUFHLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDM0QsT0FBTyxFQUNMLElBQUksRUFDSixTQUFTLEVBRVQsY0FBYyxFQWFkLE9BQU8sRUFFUCxPQUFPLEVBQ1AsWUFBWSxFQUNaLGVBQWUsRUFDZiw4QkFBOEIsRUFDOUIseUJBQXlCLEVBQ3pCLDRCQUE0QixFQUM1QixZQUFZLEVBQ1osZ0JBQWdCLEVBQ2hCLHdCQUF3QixFQUN4QixXQUFXLEdBQ1osTUFBTSxjQUFjLENBQUM7Ozs7Ozs7Ozs7O0FBT3RCLE1BQU0sT0FBTyxtQ0FBbUM7SUErQjlDLElBQWEsc0JBQXNCLENBQUMsc0JBQThCO1FBQ2hFLElBQUksc0JBQXNCLEVBQUUsQ0FBQztZQUMzQixJQUFJLENBQUMsdUJBQXVCLEdBQUcsc0JBQXNCLENBQUM7WUFDdEQsSUFBSSxDQUFDLHVC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LEVBQUUsRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUM7SUFDekUsQ0FBQzs4R0F4VVUsbUNBQW1DO2tHQUFuQyxtQ0FBbUMscW1CQ25GaEQsNGdNQWdKQTs7QUQ3Q2lDO0lBQTlCLE1BQU0sQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDO3dFQUFxQztBQUduRTtJQURDLE1BQU0sQ0FBQyxTQUFTLENBQUMsc0JBQXNCLENBQUM7aUZBQ2U7MkZBbkI3QyxtQ0FBbUM7a0JBTC9DLFNBQVM7K0JBQ0Usa0NBQWtDO3FNQW9CYixXQUFXLE1BRzFDLG9CQUFvQixNQUVYLEdBQUc7c0JBQVgsS0FBSztnQkFDRyxPQUFPO3NCQUFmLEtBQUs7Z0JBQ0csY0FBYztzQkFBdEIsS0FBSztnQkFDRyxnQkFBZ0I7c0JBQXhCLEtBQUs7Z0JBQ0csc0JBQXNCO3NCQUE5QixLQUFLO2dCQUNHLFVBQVU7c0JBQWxCLEtBQUs7Z0JBQ0csNkJBQTZCO3NCQUFyQyxLQUFLO2dCQUNHLG9CQUFvQjtzQkFBNUIsS0FBSztnQkFDRyw0QkFBNEI7c0JBQXBDLEtBQUs7Z0JBRU8sc0JBQXNCO3NCQUFsQyxLQUFLO2dCQWdCTyxVQUFVO3NCQUF0QixLQUFLO2dCQTRKSSw0QkFBNEI7c0JBQXJDLE1BQU07Z0JBQ0csVUFBVTtzQkFBbkIsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQ29weXJpZ2h0IChDKSAyMDIwLTIwMjQgTGluYWdvcmFcbiAqXG4gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTogeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlclxuICogdGhlIHRlcm1zIG9mIHRoZSBHTlUgQWZmZXJvIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlXG4gKiBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueVxuICogbGF0ZXIgdmVyc2lvbiwgcHJvdmlkZWQgeW91IGNvbXBseSB3aXRoIHRoZSBBZGRpdGlvbmFsIFRlcm1zIGFwcGxpY2FibGUgZm9yXG4gKiBMaW5JRCBEaXJlY3RvcnkgTWFuYWdlciBzb2Z0d2FyZSBieSBMSU5BR09SQSBwdXJzdWFudCB0byBTZWN0aW9uIDcgb2YgdGhlIEdOVVxuICogQWZmZXJvIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsIHN1YnNlY3Rpb25zIChiKSwgKGMpLCBhbmQgKGUpLCBwdXJzdWFudCB0b1xuICogd2hpY2ggdGhlc2UgQXBwcm9wcmlhdGUgTGVnYWwgTm90aWNlcyBtdXN0IG5vdGFibHkgKGkpIHJldGFpbiB0aGUgZGlzcGxheSBvZlxuICogdGhlIFwiTGluSUTihKJcIiB0cmFkZW1hcmsvbG9nbyBhdCB0aGUgdG9wIG9mIHRoZSBpbnRlcmZhY2Ugd2luZG93LCB0aGUgZGlzcGxheVxuICogb2YgdGhlIOKAnFlvdSBhcmUgdXNpbmcgdGhlIE9wZW4gU291cmNlIGFuZCBmcmVlIHZlcnNpb24gb2YgTGluSUTihKIsIHBvd2VyZWQgYnlcbiAqIExpbmFnb3JhIMKpIDIwMDnigJMyMDEzLiBDb250cmlidXRlIHRvIExpbklEIFImRCBieSBzdWJzY3JpYmluZyB0byBhbiBFbnRlcnByaXNlXG4gKiBvZmZlciHigJ0gaW5mb2JveCBhbmQgaW4gdGhlIGUtbWFpbHMgc2VudCB3aXRoIHRoZSBQcm9ncmFtLCBub3RpY2UgYXBwZW5kZWQgdG9cbiAqIGFueSB0eXBlIG9mIG91dGJvdW5kIG1lc3NhZ2VzIChlLmcuIGUtbWFpbCBhbmQgbWVldGluZyByZXF1ZXN0cykgYXMgd2VsbCBhc1xuICogaW4gdGhlIExpbklEIERpcmVjdG9yeSBNYW5hZ2VyIHVzZXIgaW50ZXJmYWNlLCAoaWkpIHJldGFpbiBhbGwgaHlwZXJ0ZXh0XG4gKiBsaW5rcyBiZXR3ZWVuIExpbklEIERpcmVjdG9yeSBNYW5hZ2VyIGFuZCBodHRwczovL2xpbmlkLm9yZy8sIGFzIHdlbGwgYXNcbiAqIGJldHdlZW4gTElOQUdPUkEgYW5kIExJTkFHT1JBLmNvbSwgYW5kIChpaWkpIHJlZnJhaW4gZnJvbSBpbmZyaW5naW5nIExJTkFHT1JBXG4gKiBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIG92ZXIgaXRzIHRyYWRlbWFya3MgYW5kIGNvbW1lcmNpYWwgYnJhbmRzLiBPdGhlclxuICogQWRkaXRpb25hbCBUZXJtcyBhcHBseSwgc2VlIDxodHRwOi8vd3d3LmxpbmFnb3JhLmNvbS9saWNlbnNlcy8+IGZvciBtb3JlXG4gKiBkZXRhaWxzLlxuICpcbiAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVFxuICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1NcbiAqIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUgQWZmZXJvIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmVcbiAqIGRldGFpbHMuXG4gKlxuICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEFmZmVybyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZFxuICogaXRzIGFwcGxpY2FibGUgQWRkaXRpb25hbCBUZXJtcyBmb3IgTGluSUQgRGlyZWN0b3J5IE1hbmFnZXIgYWxvbmcgd2l0aCB0aGlzXG4gKiBwcm9ncmFtLiBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4gZm9yIHRoZSBHTlUgQWZmZXJvXG4gKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMyBhbmQgPGh0dHA6Ly93d3cubGluYWdvcmEuY29tL2xpY2Vuc2VzLz4gZm9yXG4gKiB0aGUgQWRkaXRpb25hbCBUZXJtcyBhcHBsaWNhYmxlIHRvIHRoZSBMaW5JRCBEaXJlY3RvcnkgTWFuYWdlciBzb2Z0d2FyZS5cbiAqL1xuXG5pbXBvcnQgeyBMb2NhdGlvbiB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQge1xuICBDb21wb25lbnQsXG4gIEV2ZW50RW1pdHRlcixcbiAgSW5wdXQsXG4gIE9uRGVzdHJveSxcbiAgT25Jbml0LFxuICBPdXRwdXQsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgVGl0bGUgfSBmcm9tICdAYW5ndWxhci9wbGF0Zm9ybS1icm93c2VyJztcbmltcG9ydCB7IFJvdXRlciB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XG5pbXBvcnQgeyBTZWxlY3QsIFN0b3JlIH0gZnJvbSAnQG5neHMvc3RvcmUnO1xuaW1wb3J0IHsgT2JzZXJ2YWJsZSwgU3ViamVjdCwgdGFrZVVudGlsLCB0YXAgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7XG4gIERhdGEsXG4gIERhdGFTdGF0ZSxcbiAgRGV0YWlsRGF0YVZhbHVlVHlwZXMsXG4gIEVDb21wb25lbnROYW1lLFxuICBFbnZTZXJ2aWNlLFxuICBJQWR2YW5jZWRTZWFyY2hDaGlwLFxuICBJQXR0cmlidXRlLFxuICBJQnRuTGFiZWwsXG4gIElDb25maWcsXG4gIElEYXRhRGV0YWlsLFxuICBJRW50cnlJZHMsXG4gIElSZXNvdXJjZVR5cGUsXG4gIElUYWJQcm9wcyxcbiAgSVVpRW50cnlJZHMsXG4gIEludGVyYWN0aW9uc1NlcnZpY2UsXG4gIEpzVGFibGUsXG4gIFJvdXRpbmcsXG4gIFNjcmVlblNpemUsXG4gIFVpU3RhdGUsXG4gIGdldENoaXBWYWx1ZSxcbiAgZ2V0RmxhdFJlc291cmNlLFxuICBnZXRPcmRlcmVkS2V5c1NpbXBsZUF0dHJpYnV0ZXMsXG4gIGdldFN1Y2NlZWRlZE5vdGlmaWNhdGlvbnMsXG4gIGlzQXR0cmlidXRlVmFsdWVNYXRjaGluZ0NoaXAsXG4gIGlzTGlua09iamVjdCxcbiAgc2V0RGF0YUF0dHJpYnV0ZSxcbiAgc2V0TGlua0F0dHJpYnV0ZVJlc291cmNlLFxuICBzZXRUYWJUaXRsZSxcbn0gZnJvbSAnLi4vLi4vc2hhcmVkJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnZG0tZGF0YS1kZXRhaWwtc2ltcGxlLWF0dHJpYnV0ZXMnLFxuICB0ZW1wbGF0ZVVybDogJy4vZGF0YS1kZXRhaWwtc2ltcGxlLWF0dHJpYnV0ZXMuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9kYXRhLWRldGFpbC1zaW1wbGUtYXR0cmlidXRlcy5jb21wb25lbnQuc2NzcyddLFxufSlcbmV4cG9ydCBjbGFzcyBEYXRhRGV0YWlsU2ltcGxlQXR0cmlidXRlc0NvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95IHtcbiAgcHJpdmF0ZSBfZGF0YURldGFpbDogYW55O1xuICBwcml2YXRlIF9vbkRlc3Ryb3kkID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcbiAgcHJpdmF0ZSBfc2NyZWVuU2l6ZTogU2NyZWVuU2l6ZTtcbiAgcHJpdmF0ZSBfc2ltcGxlQXR0cmlidXRlc0NvbmZpZzogSUF0dHJpYnV0ZVtdO1xuICBwcml2YXRlIF9zZWxlY3RlZFJlc291cmNlVHlwZUlkOiBzdHJpbmc7XG5cbiAgcHVibGljIGRpc3BsYXlOYW1lOiBzdHJpbmc7XG4gIHB1YmxpYyBzaW1wbGVBdHRyaWJ1dGVzOiBJRGF0YURldGFpbFtdO1xuICBwdWJsaWMgZGV0YWlsQXR0cmlidXRlc0Z4RmxleFByb3BlcnR5OiB7XG4gICAgW2lkOiBzdHJpbmddOiBzdHJpbmc7XG4gIH0gPSB7fTtcbiAgcHVibGljIGNvbXBvbmVudE5hbWVUeXBlID0gRUNvbXBvbmVudE5hbWU7XG4gIHB1YmxpYyBuYlNpbXBsZUF0dHJpYnV0ZXM6IG51bWJlcjtcbiAgcHVibGljIGZpZWxkTWluV2lkdGg6IHN0cmluZztcblxuICBAU2VsZWN0KFVpU3RhdGUuZ2V0U2NyZWVuU2l6ZSkgc2NyZWVuU2l6ZSQ6IE9ic2VydmFibGU8U2NyZWVuU2l6ZT47XG5cbiAgQFNlbGVjdChEYXRhU3RhdGUuZ2V0QWR2YW5jZWRTZWFyY2hDaGlwcylcbiAgYWR2YW5jZWRTZWFyY2hDaGlwcyQ6IE9ic2VydmFibGU8SUFkdmFuY2VkU2VhcmNoQ2hpcFtdPjtcblxuICBASW5wdXQoKSB0YWI6IElUYWJQcm9wcztcbiAgQElucHV0KCkgY29uZmlnczogSnNUYWJsZTxJQ29uZmlnPjtcbiAgQElucHV0KCkgcmVzb3VyY2VzVHlwZXM6IEpzVGFibGU8SVJlc291cmNlVHlwZT47XG4gIEBJbnB1dCgpIHNlbGVjdGVkRW50cnlJZHM6IElFbnRyeUlkcztcbiAgQElucHV0KCkgc2VsZWN0ZWRFbnRyeVBhcmVudElkczogSUVudHJ5SWRzO1xuICBASW5wdXQoKSBlZGl0QWN0aW9uOiBJQnRuTGFiZWw7XG4gIEBJbnB1dCgpIGVkaXRhYmxlQXR0cmlidXRlc0Zyb21CYWNrZW5kOiBzdHJpbmdbXTtcbiAgQElucHV0KCkgaXNVcGRhdGluZ0RhdGFEZXRhaWw6IGJvb2xlYW47XG4gIEBJbnB1dCgpIGFyZVNpbXBsZUF0dHJpYnV0ZXNQcm9jZXNzZWQ6IGJvb2xlYW47XG5cbiAgQElucHV0KCkgc2V0IHNlbGVjdGVkUmVzb3VyY2VUeXBlSWQoc2VsZWN0ZWRSZXNvdXJjZVR5cGVJZDogc3RyaW5nKSB7XG4gICAgaWYgKHNlbGVjdGVkUmVzb3VyY2VUeXBlSWQpIHtcbiAgICAgIHRoaXMuX3NlbGVjdGVkUmVzb3VyY2VUeXBlSWQgPSBzZWxlY3RlZFJlc291cmNlVHlwZUlkO1xuICAgICAgdGhpcy5fc2ltcGxlQXR0cmlidXRlc0NvbmZpZyA9IHRoaXMuY29uZmlncy5ieUlkW1xuICAgICAgICB0aGlzLl9zZWxlY3RlZFJlc291cmNlVHlwZUlkXG4gICAgICBdLmF0dHJpYnV0ZXMuZmlsdGVyKFxuICAgICAgICAoYXR0cmlidXRlOiBJQXR0cmlidXRlKSA9PlxuICAgICAgICAgIGF0dHJpYnV0ZS52YWx1ZS5maWVsZC5jb21wb25lbnROYW1lICE9PSBFQ29tcG9uZW50TmFtZS5hcnJheVxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICBnZXQgc2VsZWN0ZWRSZXNvdXJjZVR5cGVJZCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9zZWxlY3RlZFJlc291cmNlVHlwZUlkO1xuICB9XG5cbiAgQElucHV0KCkgc2V0IGRhdGFEZXRhaWwoZGF0YURldGFpbDogYW55KSB7XG4gICAgdGhpcy5fZGF0YURldGFpbCA9IGRhdGFEZXRhaWw7XG5cbiAgICBpZiAodGhpcy5fZGF0YURldGFpbCkge1xuICAgICAgY29uc3QgY29uZmlnID0gdGhpcy5jb25maWdzLmJ5SWRbdGhpcy5fc2VsZWN0ZWRSZXNvdXJjZVR5cGVJZF07XG4gICAgICBjb25zdCBleHRlcm5hbElkOiBzdHJpbmcgPSB0aGlzLl9kYXRhRGV0YWlsLmV4dGVybmFsSWQ7XG4gICAgICBjb25zdCBzdWNjZWVkZWRFbGVtZW50OiBJVWlFbnRyeUlkcyA9IHtcbiAgICAgICAgaWQ6IHRoaXMuX2RhdGFEZXRhaWwuaWQsXG4gICAgICAgIGV4dGVybmFsSWQsXG4gICAgICAgIGxhYmVsOiBleHRlcm5hbElkLFxuICAgICAgfTtcbiAgICAgIHRoaXMuX2RhdGFEZXRhaWwgPSBnZXRGbGF0UmVzb3VyY2UodGhpcy5fZGF0YURldGFpbCwgY29uZmlnKTtcbiAgICAgIGNvbnN0IG9yZGVyS2V5c0J5QXR0cmlidXRlSWQ6IHN0cmluZ1tdID0gZ2V0T3JkZXJlZEtleXNTaW1wbGVBdHRyaWJ1dGVzKFxuICAgICAgICB0aGlzLl9zaW1wbGVBdHRyaWJ1dGVzQ29uZmlnLFxuICAgICAgICB0aGlzLl9kYXRhRGV0YWlsXG4gICAgICApO1xuICAgICAgdGhpcy5uYlNpbXBsZUF0dHJpYnV0ZXMgPSAwO1xuXG4gICAgICBjb25zdCBhdXRob3JpemVkRW5kcG9pbnRzOiBzdHJpbmdbXSA9IHRoaXMucmVzb3VyY2VzVHlwZXMuYWxsSWRzXG4gICAgICAgIC5maWx0ZXIoKHJlc291cmNlVHlwZUlkOiBzdHJpbmcpID0+XG4gICAgICAgICAgdGhpcy5jb25maWdzLmFsbElkcy5pbmNsdWRlcyhyZXNvdXJjZVR5cGVJZClcbiAgICAgICAgKVxuICAgICAgICAubWFwKFxuICAgICAgICAgIChyZXNvdXJjZVR5cGVJZDogc3RyaW5nKSA9PlxuICAgICAgICAgICAgdGhpcy5yZXNvdXJjZXNUeXBlcy5ieUlkW3Jlc291cmNlVHlwZUlkXS5lbmRwb2ludFxuICAgICAgICApO1xuXG4gICAgICBjb25zdCBwcmV2aW91c1NpbXBsZUF0dHJpYnV0ZXM6IElEYXRhRGV0YWlsW10gPSB0aGlzLnNpbXBsZUF0dHJpYnV0ZXM7XG4gICAgICB0aGlzLnNpbXBsZUF0dHJpYnV0ZXMgPSBbXTtcbiAgICAgIGxldCBhZHZhbmNlZFNlYXJjaENoaXBzOiBJQWR2YW5jZWRTZWFyY2hDaGlwW10gPSBbXTtcbiAgICAgIGNvbnN0IGFyZVVwZGF0ZWRBdHRyaWJ1dGVzTWF0Y2hpbmdBZHZhbmNlZFNlYXJjaDogYm9vbGVhbltdID0gW107XG4gICAgICBpZiAodGhpcy5pc1VwZGF0aW5nRGF0YURldGFpbCkge1xuICAgICAgICBpZiAoXG4gICAgICAgICAgZXh0ZXJuYWxJZC50b0xvY2FsZVVwcGVyQ2FzZSgpICE9PVxuICAgICAgICAgIHRoaXMuc2VsZWN0ZWRFbnRyeUlkcy5leHRlcm5hbElkLnRvTG9jYWxlVXBwZXJDYXNlKClcbiAgICAgICAgKSB7XG4gICAgICAgICAgdGhpcy5fdXBkYXRlRXh0ZXJuYWxJZChleHRlcm5hbElkKTtcbiAgICAgICAgfVxuICAgICAgICBhZHZhbmNlZFNlYXJjaENoaXBzID0gdGhpcy5fc3RvcmUkLnNlbGVjdFNuYXBzaG90KFxuICAgICAgICAgIERhdGFTdGF0ZS5nZXRBZHZhbmNlZFNlYXJjaENoaXBzXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIG9yZGVyS2V5c0J5QXR0cmlidXRlSWQuZm9yRWFjaCgoa2V5OiBzdHJpbmcpID0+IHtcbiAgICAgICAgLy8gR2V0IGN1cnJlbnQgYXR0cmlidXRlIGNvbmZpZ3VyYXRpb25cbiAgICAgICAgY29uc3QgYXR0cmlidXRlQ29uZmlnOiBJQXR0cmlidXRlID0gY29uZmlnLmF0dHJpYnV0ZXMuZmluZChcbiAgICAgICAgICAoYXR0cmlidXRlKSA9PiBhdHRyaWJ1dGUubW9kZWxSZWYgPT09IGtleVxuICAgICAgICApO1xuXG4gICAgICAgIGNvbnN0IGF0dHJpYnV0ZUNvbXBvbmVudE5hbWU6IHN0cmluZyA9XG4gICAgICAgICAgYXR0cmlidXRlQ29uZmlnLnZhbHVlLmZpZWxkLmNvbXBvbmVudE5hbWU7XG5cbiAgICAgICAgaWYgKGF0dHJpYnV0ZUNvbXBvbmVudE5hbWUgIT09IEVDb21wb25lbnROYW1lLmFycmF5KSB7XG4gICAgICAgICAgaWYgKGF0dHJpYnV0ZUNvbmZpZy5pc0RldGFpbFRpdGxlKSB7XG4gICAgICAgICAgICB0aGlzLmRpc3BsYXlOYW1lID0gdGhpcy5fZGF0YURldGFpbFtrZXldO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChcbiAg