@onecx/angular-accelerator 4.30.0 → 4.31.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -38,6 +38,7 @@ export class PageHeaderComponent {
38
38
  this.save = new EventEmitter();
39
39
  this.overflowActions = [];
40
40
  this.dd = new Date();
41
+ this.figureImageLoadError = false;
41
42
  this.breadcrumbs = breadcrumbs;
42
43
  this.home$ = concat(of({ menuItem: { icon: PrimeIcons.HOME, routerLink: '/' } }), this.appStateService.currentPortal$.pipe(map((portal) => ({
43
44
  menuItem: {
@@ -72,6 +73,9 @@ export class PageHeaderComponent {
72
73
  break;
73
74
  }
74
75
  }
76
+ handleImageError() {
77
+ this.figureImageLoadError = true;
78
+ }
75
79
  generateItemStyle(item) {
76
80
  let style = '';
77
81
  if (item.icon)
@@ -162,10 +166,10 @@ export class PageHeaderComponent {
162
166
  }
163
167
  }
164
168
  PageHeaderComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: PageHeaderComponent, deps: [{ token: i1.BreadcrumbService }, { token: i2.TranslateService }, { token: i3.AppStateService }, { token: i3.UserService }], target: i0.ɵɵFactoryTarget.Component });
165
- PageHeaderComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.10", type: PageHeaderComponent, selector: "ocx-page-header", inputs: { header: "header", loading: "loading", figureBackground: "figureBackground", showFigure: "showFigure", figureImage: "figureImage", disableDefaultActions: "disableDefaultActions", subheader: "subheader", actions: "actions", objectDetails: "objectDetails", showBreadcrumbs: "showBreadcrumbs", manualBreadcrumbs: "manualBreadcrumbs" }, outputs: { save: "save" }, queries: [{ propertyName: "additionalToolbarContent", first: true, predicate: ["additionalToolbarContent"], descendants: true }, { propertyName: "additionalToolbarContentLeft", first: true, predicate: ["additionalToolbarContentLeft"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<div class=\"onecx-page-header\" name=\"ocx-page-header-wrapper\">\n <ng-container *ngIf=\"showBreadcrumbs\">\n <p-breadcrumb\n [model]=\"items\"\n *ngIf=\"breadcrumbs$ | async as items\"\n [home]=\"(home$ | async)?.menuItem ?? {}\"\n [homeAriaLabel]=\"(home$ | async)?.page ? ('OCX_PAGE_HEADER.HOME_ARIA_LABEL' | translate: { page: (home$ | async)?.page}) : ('OCX_PAGE_HEADER.HOME_DEFAULT_ARIA_LABEL' | translate)\"\n [attr.manual]=\"manualBreadcrumbs\"\n ></p-breadcrumb>\n </ng-container>\n <div class=\"title-bar flex flex-row md:justify-content-between p-2 md:p-3\">\n <div class=\"title-wrap\">\n <div class=\"figure flex h-2rem w-2rem md:h-3rem md:w-3rem\" *ngIf=\"showFigure\">\n <div #previewImage class=\"figure-image absolute top-0 left-0 right-0 bottom-0\">\n <ng-content select=\"[figureImage]\"></ng-content>\n <img *ngIf=\"figureImage\" [ocxSrc]=\"figureImage\" alt=\"Figure image\" class=\"w-full\" />\n </div>\n <div class=\"colorblob flex-1 border-round\" *ngIf=\"previewImage.children.length === 0\"></div>\n </div>\n <ng-template #skeletonBar>\n <div class=\"header justify-content-evenly\">\n <p-skeleton width=\"10rem\"></p-skeleton>\n <p-skeleton width=\"10rem\"></p-skeleton>\n </div>\n </ng-template>\n <div class=\"header\" *ngIf=\"!loading; else skeletonBar\">\n <h1 id=\"page-header\" *ngIf=\"!!header\">{{ header }}</h1>\n <h2 id='page-subheader' *ngIf=\"!!subheader\">{{ subheader }}</h2>\n </div>\n </div>\n <div class=\"action-items-wrap mt-2 md:mt-0\">\n <ng-container *ngIf=\"additionalToolbarContentLeft\" [ngTemplateOutlet]=\"additionalToolbarContentLeft\"> </ng-container>\n\n <ng-container *ngIf=\"!disableDefaultActions\"> </ng-container>\n <ng-template #skeletonActions>\n <div class=\"flex\">\n <p-skeleton width=\"5rem\" height=\"2rem\" styleClass=\"mr-2\"></p-skeleton>\n <p-skeleton width=\"2rem\" height=\"2rem\" styleClass=\"mb-2\"></p-skeleton>\n </div>\n </ng-template>\n <ng-container *ngIf=\"!loading; else skeletonActions\">\n <div *ngIf=\"inlineActions && inlineActions.length > 0\" class=\"toolbar flex flex-wrap gap-1 sm:gap-2\">\n <ng-container *ngFor=\"let action of inlineActions\">\n <p-button\n id=\"{{ action.id }}\"\n [icon]=\"action.icon ?? ''\"\n type=\"button\"\n class=\"action-button\"\n [label]=\"action.labelKey ? (action.labelKey | translate) : action.label\"\n (onClick)=\"action.actionCallback()\"\n [title]=\"(action.titleKey ? (action.titleKey | translate) : action.title) || (action.labelKey ? (action.labelKey | translate) : action.label)\"\n [disabled]=\"action.disabled ? action.disabled : false\"\n [attr.name]=\"action.icon ? 'ocx-page-header-inline-action-icon-button' : 'ocx-page-header-inline-action-button'\"\n [ariaLabel]=\"(action.titleKey ? (action.titleKey | translate) : action.title) || (action.labelKey ? (action.labelKey | translate) : action.label)\"\n ></p-button>\n </ng-container>\n </div>\n <ng-content select=\"[toolbarItems]\"></ng-content>\n <ng-container>\n <div *ngIf=\"overflowActions.length !== 0\">\n <button\n id=\"pageHeaderMenuButton\"\n type=\"button\"\n pButton\n icon=\"pi pi-ellipsis-v\"\n title=\"{{ 'OCX_PAGE_HEADER.MORE_ACTIONS' | translate }}\"\n class=\"more-actions-menu-button action-button ml-2\"\n (click)=\"menu.toggle($event)\"\n name=\"ocx-page-header-overflow-action-button\"\n [ariaLabel]=\"('OCX_PAGE_HEADER.MORE_ACTIONS' | translate)\"\n ></button>\n <p-menu #menu [popup]=\"true\" [model]=\"overflowActions\" appendTo=\"body\"></p-menu>\n </div>\n </ng-container>\n </ng-container>\n <ng-container *ngIf=\"additionalToolbarContent\" [ngTemplateOutlet]=\"additionalToolbarContent\"> </ng-container>\n </div>\n </div>\n\n <div\n class=\"object-panel flex-column md:flex-row\"\n [class.justify-content-evenly]=\"objectDetails\"\n [class.justify-content-start]=\"!objectDetails\"\n >\n <ng-container *ngIf=\"objectDetails\">\n <div\n class=\"object-info flex flex-row md:flex-column align-items-baseline md:align-items-center justify-content-between\"\n *ngFor=\"let item of objectDetails\"\n >\n <label class=\"flex font-medium text-600\" name=\"object-detail-label\">{{ item.label | dynamicPipe:item.labelPipe }}</label>\n <span\n *ngIf=\"item.icon || item.value\"\n class=\"flex text-900 mt-2\"\n [ngClass]=\"generateItemStyle(item)\"\n [title]=\"item.tooltip || ''\"\n name=\"object-detail-value\"\n >\n <i *ngIf=\"item.icon\" class=\"{{item.icon}}\" name=\"object-detail-icon\"></i>\n {{ item.value | dynamicPipe:item.valuePipe:item.valuePipeArgs}}</span\n >\n </div>\n </ng-container>\n <ng-content></ng-content>\n </div>\n</div>\n", styles: [":host(.p-button-label){font-weight:400}:host ::ng-deep .action-button{padding:.5rem;font-weight:400}.onecx-page-header{display:flex;flex-flow:column;border-radius:.25rem;overflow:hidden;background:#fff;box-shadow:0 2px 2px #0000001a;border:1px solid #cdd0d3}.onecx-page-header .title-bar{display:flex;flex-wrap:wrap;justify-content:space-between;align-items:center;gap:.5rem;background-color:#f8f9fa;border-top-right-radius:inherit;border-top-left-radius:inherit}.onecx-page-header .title-bar .figure{width:3rem;height:3rem;margin-right:.5rem;position:relative}.onecx-page-header .title-bar .figure .figure-image img{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%)}.onecx-page-header .title-bar .figure .colorblob{background-color:var(--primary-color);position:absolute;inset:0}.onecx-page-header .title-bar .title-wrap{display:flex;flex-flow:row;align-items:center;gap:.25rem}.onecx-page-header .title-bar .title-wrap .header{display:flex;align-items:flex-start;justify-content:center;flex-direction:column}.onecx-page-header .title-bar .title-wrap h1{font-size:1em;font-weight:700;margin:0;padding:0}.onecx-page-header .title-bar .title-wrap h2{font-size:1em;font-weight:400;margin:0;padding:0}.onecx-page-header .title-bar .action-items-wrap{display:flex;height:-moz-fit-content;height:fit-content;gap:.5rem;align-items:center;justify-content:space-between}.onecx-page-header .title-bar .action-items-wrap button{padding:.5rem}.onecx-page-header .object-panel{border-top:1px solid #cdd0d3;padding:1rem;display:flex}.onecx-page-header .object-panel:empty{display:none}.badge-container{display:flex;align-items:center;justify-content:center;width:100%;height:100%}.scale{transform:scale(2)}\n"], dependencies: [{ kind: "directive", type: i4.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i4.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: i5.Breadcrumb, selector: "p-breadcrumb", inputs: ["model", "style", "styleClass", "home", "homeAriaLabel"], outputs: ["onItemClick"] }, { kind: "directive", type: i6.ButtonDirective, selector: "[pButton]", inputs: ["iconPos", "loadingIcon", "label", "icon", "loading"] }, { kind: "component", type: i6.Button, selector: "p-button", inputs: ["type", "iconPos", "icon", "badge", "label", "disabled", "loading", "loadingIcon", "style", "styleClass", "badgeClass", "ariaLabel"], outputs: ["onClick", "onFocus", "onBlur"] }, { kind: "component", type: i7.Menu, selector: "p-menu", inputs: ["model", "popup", "style", "styleClass", "appendTo", "autoZIndex", "baseZIndex", "showTransitionOptions", "hideTransitionOptions"], outputs: ["onShow", "onHide"] }, { kind: "component", type: i8.Skeleton, selector: "p-skeleton", inputs: ["styleClass", "style", "shape", "animation", "borderRadius", "size", "width", "height"] }, { kind: "directive", type: i9.SrcDirective, selector: "[ocxSrc]", inputs: ["ocxSrc"] }, { kind: "pipe", type: i4.AsyncPipe, name: "async" }, { kind: "pipe", type: i2.TranslatePipe, name: "translate" }, { kind: "pipe", type: i10.DynamicPipe, name: "dynamicPipe" }], encapsulation: i0.ViewEncapsulation.None });
169
+ PageHeaderComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.10", type: PageHeaderComponent, selector: "ocx-page-header", inputs: { header: "header", loading: "loading", figureBackground: "figureBackground", showFigure: "showFigure", figureImage: "figureImage", disableDefaultActions: "disableDefaultActions", subheader: "subheader", actions: "actions", objectDetails: "objectDetails", showBreadcrumbs: "showBreadcrumbs", manualBreadcrumbs: "manualBreadcrumbs" }, outputs: { save: "save" }, queries: [{ propertyName: "additionalToolbarContent", first: true, predicate: ["additionalToolbarContent"], descendants: true }, { propertyName: "additionalToolbarContentLeft", first: true, predicate: ["additionalToolbarContentLeft"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<div class=\"onecx-page-header\" name=\"ocx-page-header-wrapper\">\n <ng-container *ngIf=\"showBreadcrumbs\">\n <p-breadcrumb\n [model]=\"items\"\n *ngIf=\"breadcrumbs$ | async as items\"\n [home]=\"(home$ | async)?.menuItem ?? {}\"\n [homeAriaLabel]=\"(home$ | async)?.page ? ('OCX_PAGE_HEADER.HOME_ARIA_LABEL' | translate: { page: (home$ | async)?.page}) : ('OCX_PAGE_HEADER.HOME_DEFAULT_ARIA_LABEL' | translate)\"\n [attr.manual]=\"manualBreadcrumbs\"\n ></p-breadcrumb>\n </ng-container>\n <div class=\"title-bar flex flex-row md:justify-content-between p-2 md:p-3\">\n <div class=\"title-wrap\">\n <div class=\"figure flex h-2rem w-2rem md:h-3rem md:w-3rem\" *ngIf=\"showFigure\">\n <div #previewImage class=\"figure-image absolute top-0 left-0 right-0 bottom-0\">\n <ng-content select=\"[figureImage]\"></ng-content>\n <img\n *ngIf=\"figureImage && !figureImageLoadError\"\n [ocxSrc]=\"figureImage\"\n alt=\"Figure image\"\n class=\"w-full\"\n (error)=\"handleImageError()\"\n />\n </div>\n <div\n class=\"colorblob flex-1 border-round\"\n *ngIf=\"previewImage.children.length === 0 || figureImageLoadError\"\n ></div>\n </div>\n <ng-template #skeletonBar>\n <div class=\"header justify-content-evenly\">\n <p-skeleton width=\"10rem\"></p-skeleton>\n <p-skeleton width=\"10rem\"></p-skeleton>\n </div>\n </ng-template>\n <div class=\"header\" *ngIf=\"!loading; else skeletonBar\">\n <h1 id=\"page-header\" *ngIf=\"!!header\">{{ header }}</h1>\n <h2 id=\"page-subheader\" *ngIf=\"!!subheader\">{{ subheader }}</h2>\n </div>\n </div>\n <div class=\"action-items-wrap mt-2 md:mt-0\">\n <ng-container *ngIf=\"additionalToolbarContentLeft\" [ngTemplateOutlet]=\"additionalToolbarContentLeft\">\n </ng-container>\n\n <ng-container *ngIf=\"!disableDefaultActions\"> </ng-container>\n <ng-template #skeletonActions>\n <div class=\"flex\">\n <p-skeleton width=\"5rem\" height=\"2rem\" styleClass=\"mr-2\"></p-skeleton>\n <p-skeleton width=\"2rem\" height=\"2rem\" styleClass=\"mb-2\"></p-skeleton>\n </div>\n </ng-template>\n <ng-container *ngIf=\"!loading; else skeletonActions\">\n <div *ngIf=\"inlineActions && inlineActions.length > 0\" class=\"toolbar flex flex-wrap gap-1 sm:gap-2\">\n <ng-container *ngFor=\"let action of inlineActions\">\n <p-button\n id=\"{{ action.id }}\"\n [icon]=\"action.icon ?? ''\"\n type=\"button\"\n class=\"action-button\"\n [label]=\"action.labelKey ? (action.labelKey | translate) : action.label\"\n (onClick)=\"action.actionCallback()\"\n [title]=\"(action.titleKey ? (action.titleKey | translate) : action.title) || (action.labelKey ? (action.labelKey | translate) : action.label)\"\n [disabled]=\"action.disabled ? action.disabled : false\"\n [attr.name]=\"action.icon ? 'ocx-page-header-inline-action-icon-button' : 'ocx-page-header-inline-action-button'\"\n [ariaLabel]=\"(action.titleKey ? (action.titleKey | translate) : action.title) || (action.labelKey ? (action.labelKey | translate) : action.label)\"\n ></p-button>\n </ng-container>\n </div>\n <ng-content select=\"[toolbarItems]\"></ng-content>\n <ng-container>\n <div *ngIf=\"overflowActions.length !== 0\">\n <button\n id=\"pageHeaderMenuButton\"\n type=\"button\"\n pButton\n icon=\"pi pi-ellipsis-v\"\n title=\"{{ 'OCX_PAGE_HEADER.MORE_ACTIONS' | translate }}\"\n class=\"more-actions-menu-button action-button ml-2\"\n (click)=\"menu.toggle($event)\"\n name=\"ocx-page-header-overflow-action-button\"\n [ariaLabel]=\"('OCX_PAGE_HEADER.MORE_ACTIONS' | translate)\"\n ></button>\n <p-menu #menu [popup]=\"true\" [model]=\"overflowActions\" appendTo=\"body\"></p-menu>\n </div>\n </ng-container>\n </ng-container>\n <ng-container *ngIf=\"additionalToolbarContent\" [ngTemplateOutlet]=\"additionalToolbarContent\"> </ng-container>\n </div>\n </div>\n\n <div\n class=\"object-panel flex-column md:flex-row\"\n [class.justify-content-evenly]=\"objectDetails\"\n [class.justify-content-start]=\"!objectDetails\"\n >\n <ng-container *ngIf=\"objectDetails\">\n <div\n class=\"object-info flex flex-row md:flex-column align-items-baseline md:align-items-center justify-content-between\"\n *ngFor=\"let item of objectDetails\"\n >\n <label class=\"flex font-medium text-600\" name=\"object-detail-label\"\n >{{ item.label | dynamicPipe:item.labelPipe }}</label\n >\n <span\n *ngIf=\"item.icon || item.value\"\n class=\"flex text-900 mt-2\"\n [ngClass]=\"generateItemStyle(item)\"\n [title]=\"item.tooltip || ''\"\n name=\"object-detail-value\"\n >\n <i *ngIf=\"item.icon\" class=\"{{item.icon}}\" name=\"object-detail-icon\"></i>\n {{ item.value | dynamicPipe:item.valuePipe:item.valuePipeArgs}}</span\n >\n </div>\n </ng-container>\n <ng-content></ng-content>\n </div>\n</div>\n", styles: [":host(.p-button-label){font-weight:400}:host ::ng-deep .action-button{padding:.5rem;font-weight:400}.onecx-page-header{display:flex;flex-flow:column;border-radius:.25rem;overflow:hidden;background:#fff;box-shadow:0 2px 2px #0000001a;border:1px solid #cdd0d3}.onecx-page-header .title-bar{display:flex;flex-wrap:wrap;justify-content:space-between;align-items:center;gap:.5rem;background-color:#f8f9fa;border-top-right-radius:inherit;border-top-left-radius:inherit}.onecx-page-header .title-bar .figure{width:3rem;height:3rem;margin-right:.5rem;position:relative}.onecx-page-header .title-bar .figure .figure-image img{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%)}.onecx-page-header .title-bar .figure .colorblob{background-color:var(--primary-color);position:absolute;inset:0}.onecx-page-header .title-bar .title-wrap{display:flex;flex-flow:row;align-items:center;gap:.25rem}.onecx-page-header .title-bar .title-wrap .header{display:flex;align-items:flex-start;justify-content:center;flex-direction:column}.onecx-page-header .title-bar .title-wrap h1{font-size:1em;font-weight:700;margin:0;padding:0}.onecx-page-header .title-bar .title-wrap h2{font-size:1em;font-weight:400;margin:0;padding:0}.onecx-page-header .title-bar .action-items-wrap{display:flex;height:-moz-fit-content;height:fit-content;gap:.5rem;align-items:center;justify-content:space-between}.onecx-page-header .title-bar .action-items-wrap button{padding:.5rem}.onecx-page-header .object-panel{border-top:1px solid #cdd0d3;padding:1rem;display:flex}.onecx-page-header .object-panel:empty{display:none}.badge-container{display:flex;align-items:center;justify-content:center;width:100%;height:100%}.scale{transform:scale(2)}\n"], dependencies: [{ kind: "directive", type: i4.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i4.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: i5.Breadcrumb, selector: "p-breadcrumb", inputs: ["model", "style", "styleClass", "home", "homeAriaLabel"], outputs: ["onItemClick"] }, { kind: "directive", type: i6.ButtonDirective, selector: "[pButton]", inputs: ["iconPos", "loadingIcon", "label", "icon", "loading"] }, { kind: "component", type: i6.Button, selector: "p-button", inputs: ["type", "iconPos", "icon", "badge", "label", "disabled", "loading", "loadingIcon", "style", "styleClass", "badgeClass", "ariaLabel"], outputs: ["onClick", "onFocus", "onBlur"] }, { kind: "component", type: i7.Menu, selector: "p-menu", inputs: ["model", "popup", "style", "styleClass", "appendTo", "autoZIndex", "baseZIndex", "showTransitionOptions", "hideTransitionOptions"], outputs: ["onShow", "onHide"] }, { kind: "component", type: i8.Skeleton, selector: "p-skeleton", inputs: ["styleClass", "style", "shape", "animation", "borderRadius", "size", "width", "height"] }, { kind: "directive", type: i9.SrcDirective, selector: "[ocxSrc]", inputs: ["ocxSrc"] }, { kind: "pipe", type: i4.AsyncPipe, name: "async" }, { kind: "pipe", type: i2.TranslatePipe, name: "translate" }, { kind: "pipe", type: i10.DynamicPipe, name: "dynamicPipe" }], encapsulation: i0.ViewEncapsulation.None });
166
170
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: PageHeaderComponent, decorators: [{
167
171
  type: Component,
168
- args: [{ selector: 'ocx-page-header', encapsulation: ViewEncapsulation.None, template: "<div class=\"onecx-page-header\" name=\"ocx-page-header-wrapper\">\n <ng-container *ngIf=\"showBreadcrumbs\">\n <p-breadcrumb\n [model]=\"items\"\n *ngIf=\"breadcrumbs$ | async as items\"\n [home]=\"(home$ | async)?.menuItem ?? {}\"\n [homeAriaLabel]=\"(home$ | async)?.page ? ('OCX_PAGE_HEADER.HOME_ARIA_LABEL' | translate: { page: (home$ | async)?.page}) : ('OCX_PAGE_HEADER.HOME_DEFAULT_ARIA_LABEL' | translate)\"\n [attr.manual]=\"manualBreadcrumbs\"\n ></p-breadcrumb>\n </ng-container>\n <div class=\"title-bar flex flex-row md:justify-content-between p-2 md:p-3\">\n <div class=\"title-wrap\">\n <div class=\"figure flex h-2rem w-2rem md:h-3rem md:w-3rem\" *ngIf=\"showFigure\">\n <div #previewImage class=\"figure-image absolute top-0 left-0 right-0 bottom-0\">\n <ng-content select=\"[figureImage]\"></ng-content>\n <img *ngIf=\"figureImage\" [ocxSrc]=\"figureImage\" alt=\"Figure image\" class=\"w-full\" />\n </div>\n <div class=\"colorblob flex-1 border-round\" *ngIf=\"previewImage.children.length === 0\"></div>\n </div>\n <ng-template #skeletonBar>\n <div class=\"header justify-content-evenly\">\n <p-skeleton width=\"10rem\"></p-skeleton>\n <p-skeleton width=\"10rem\"></p-skeleton>\n </div>\n </ng-template>\n <div class=\"header\" *ngIf=\"!loading; else skeletonBar\">\n <h1 id=\"page-header\" *ngIf=\"!!header\">{{ header }}</h1>\n <h2 id='page-subheader' *ngIf=\"!!subheader\">{{ subheader }}</h2>\n </div>\n </div>\n <div class=\"action-items-wrap mt-2 md:mt-0\">\n <ng-container *ngIf=\"additionalToolbarContentLeft\" [ngTemplateOutlet]=\"additionalToolbarContentLeft\"> </ng-container>\n\n <ng-container *ngIf=\"!disableDefaultActions\"> </ng-container>\n <ng-template #skeletonActions>\n <div class=\"flex\">\n <p-skeleton width=\"5rem\" height=\"2rem\" styleClass=\"mr-2\"></p-skeleton>\n <p-skeleton width=\"2rem\" height=\"2rem\" styleClass=\"mb-2\"></p-skeleton>\n </div>\n </ng-template>\n <ng-container *ngIf=\"!loading; else skeletonActions\">\n <div *ngIf=\"inlineActions && inlineActions.length > 0\" class=\"toolbar flex flex-wrap gap-1 sm:gap-2\">\n <ng-container *ngFor=\"let action of inlineActions\">\n <p-button\n id=\"{{ action.id }}\"\n [icon]=\"action.icon ?? ''\"\n type=\"button\"\n class=\"action-button\"\n [label]=\"action.labelKey ? (action.labelKey | translate) : action.label\"\n (onClick)=\"action.actionCallback()\"\n [title]=\"(action.titleKey ? (action.titleKey | translate) : action.title) || (action.labelKey ? (action.labelKey | translate) : action.label)\"\n [disabled]=\"action.disabled ? action.disabled : false\"\n [attr.name]=\"action.icon ? 'ocx-page-header-inline-action-icon-button' : 'ocx-page-header-inline-action-button'\"\n [ariaLabel]=\"(action.titleKey ? (action.titleKey | translate) : action.title) || (action.labelKey ? (action.labelKey | translate) : action.label)\"\n ></p-button>\n </ng-container>\n </div>\n <ng-content select=\"[toolbarItems]\"></ng-content>\n <ng-container>\n <div *ngIf=\"overflowActions.length !== 0\">\n <button\n id=\"pageHeaderMenuButton\"\n type=\"button\"\n pButton\n icon=\"pi pi-ellipsis-v\"\n title=\"{{ 'OCX_PAGE_HEADER.MORE_ACTIONS' | translate }}\"\n class=\"more-actions-menu-button action-button ml-2\"\n (click)=\"menu.toggle($event)\"\n name=\"ocx-page-header-overflow-action-button\"\n [ariaLabel]=\"('OCX_PAGE_HEADER.MORE_ACTIONS' | translate)\"\n ></button>\n <p-menu #menu [popup]=\"true\" [model]=\"overflowActions\" appendTo=\"body\"></p-menu>\n </div>\n </ng-container>\n </ng-container>\n <ng-container *ngIf=\"additionalToolbarContent\" [ngTemplateOutlet]=\"additionalToolbarContent\"> </ng-container>\n </div>\n </div>\n\n <div\n class=\"object-panel flex-column md:flex-row\"\n [class.justify-content-evenly]=\"objectDetails\"\n [class.justify-content-start]=\"!objectDetails\"\n >\n <ng-container *ngIf=\"objectDetails\">\n <div\n class=\"object-info flex flex-row md:flex-column align-items-baseline md:align-items-center justify-content-between\"\n *ngFor=\"let item of objectDetails\"\n >\n <label class=\"flex font-medium text-600\" name=\"object-detail-label\">{{ item.label | dynamicPipe:item.labelPipe }}</label>\n <span\n *ngIf=\"item.icon || item.value\"\n class=\"flex text-900 mt-2\"\n [ngClass]=\"generateItemStyle(item)\"\n [title]=\"item.tooltip || ''\"\n name=\"object-detail-value\"\n >\n <i *ngIf=\"item.icon\" class=\"{{item.icon}}\" name=\"object-detail-icon\"></i>\n {{ item.value | dynamicPipe:item.valuePipe:item.valuePipeArgs}}</span\n >\n </div>\n </ng-container>\n <ng-content></ng-content>\n </div>\n</div>\n", styles: [":host(.p-button-label){font-weight:400}:host ::ng-deep .action-button{padding:.5rem;font-weight:400}.onecx-page-header{display:flex;flex-flow:column;border-radius:.25rem;overflow:hidden;background:#fff;box-shadow:0 2px 2px #0000001a;border:1px solid #cdd0d3}.onecx-page-header .title-bar{display:flex;flex-wrap:wrap;justify-content:space-between;align-items:center;gap:.5rem;background-color:#f8f9fa;border-top-right-radius:inherit;border-top-left-radius:inherit}.onecx-page-header .title-bar .figure{width:3rem;height:3rem;margin-right:.5rem;position:relative}.onecx-page-header .title-bar .figure .figure-image img{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%)}.onecx-page-header .title-bar .figure .colorblob{background-color:var(--primary-color);position:absolute;inset:0}.onecx-page-header .title-bar .title-wrap{display:flex;flex-flow:row;align-items:center;gap:.25rem}.onecx-page-header .title-bar .title-wrap .header{display:flex;align-items:flex-start;justify-content:center;flex-direction:column}.onecx-page-header .title-bar .title-wrap h1{font-size:1em;font-weight:700;margin:0;padding:0}.onecx-page-header .title-bar .title-wrap h2{font-size:1em;font-weight:400;margin:0;padding:0}.onecx-page-header .title-bar .action-items-wrap{display:flex;height:-moz-fit-content;height:fit-content;gap:.5rem;align-items:center;justify-content:space-between}.onecx-page-header .title-bar .action-items-wrap button{padding:.5rem}.onecx-page-header .object-panel{border-top:1px solid #cdd0d3;padding:1rem;display:flex}.onecx-page-header .object-panel:empty{display:none}.badge-container{display:flex;align-items:center;justify-content:center;width:100%;height:100%}.scale{transform:scale(2)}\n"] }]
172
+ args: [{ selector: 'ocx-page-header', encapsulation: ViewEncapsulation.None, template: "<div class=\"onecx-page-header\" name=\"ocx-page-header-wrapper\">\n <ng-container *ngIf=\"showBreadcrumbs\">\n <p-breadcrumb\n [model]=\"items\"\n *ngIf=\"breadcrumbs$ | async as items\"\n [home]=\"(home$ | async)?.menuItem ?? {}\"\n [homeAriaLabel]=\"(home$ | async)?.page ? ('OCX_PAGE_HEADER.HOME_ARIA_LABEL' | translate: { page: (home$ | async)?.page}) : ('OCX_PAGE_HEADER.HOME_DEFAULT_ARIA_LABEL' | translate)\"\n [attr.manual]=\"manualBreadcrumbs\"\n ></p-breadcrumb>\n </ng-container>\n <div class=\"title-bar flex flex-row md:justify-content-between p-2 md:p-3\">\n <div class=\"title-wrap\">\n <div class=\"figure flex h-2rem w-2rem md:h-3rem md:w-3rem\" *ngIf=\"showFigure\">\n <div #previewImage class=\"figure-image absolute top-0 left-0 right-0 bottom-0\">\n <ng-content select=\"[figureImage]\"></ng-content>\n <img\n *ngIf=\"figureImage && !figureImageLoadError\"\n [ocxSrc]=\"figureImage\"\n alt=\"Figure image\"\n class=\"w-full\"\n (error)=\"handleImageError()\"\n />\n </div>\n <div\n class=\"colorblob flex-1 border-round\"\n *ngIf=\"previewImage.children.length === 0 || figureImageLoadError\"\n ></div>\n </div>\n <ng-template #skeletonBar>\n <div class=\"header justify-content-evenly\">\n <p-skeleton width=\"10rem\"></p-skeleton>\n <p-skeleton width=\"10rem\"></p-skeleton>\n </div>\n </ng-template>\n <div class=\"header\" *ngIf=\"!loading; else skeletonBar\">\n <h1 id=\"page-header\" *ngIf=\"!!header\">{{ header }}</h1>\n <h2 id=\"page-subheader\" *ngIf=\"!!subheader\">{{ subheader }}</h2>\n </div>\n </div>\n <div class=\"action-items-wrap mt-2 md:mt-0\">\n <ng-container *ngIf=\"additionalToolbarContentLeft\" [ngTemplateOutlet]=\"additionalToolbarContentLeft\">\n </ng-container>\n\n <ng-container *ngIf=\"!disableDefaultActions\"> </ng-container>\n <ng-template #skeletonActions>\n <div class=\"flex\">\n <p-skeleton width=\"5rem\" height=\"2rem\" styleClass=\"mr-2\"></p-skeleton>\n <p-skeleton width=\"2rem\" height=\"2rem\" styleClass=\"mb-2\"></p-skeleton>\n </div>\n </ng-template>\n <ng-container *ngIf=\"!loading; else skeletonActions\">\n <div *ngIf=\"inlineActions && inlineActions.length > 0\" class=\"toolbar flex flex-wrap gap-1 sm:gap-2\">\n <ng-container *ngFor=\"let action of inlineActions\">\n <p-button\n id=\"{{ action.id }}\"\n [icon]=\"action.icon ?? ''\"\n type=\"button\"\n class=\"action-button\"\n [label]=\"action.labelKey ? (action.labelKey | translate) : action.label\"\n (onClick)=\"action.actionCallback()\"\n [title]=\"(action.titleKey ? (action.titleKey | translate) : action.title) || (action.labelKey ? (action.labelKey | translate) : action.label)\"\n [disabled]=\"action.disabled ? action.disabled : false\"\n [attr.name]=\"action.icon ? 'ocx-page-header-inline-action-icon-button' : 'ocx-page-header-inline-action-button'\"\n [ariaLabel]=\"(action.titleKey ? (action.titleKey | translate) : action.title) || (action.labelKey ? (action.labelKey | translate) : action.label)\"\n ></p-button>\n </ng-container>\n </div>\n <ng-content select=\"[toolbarItems]\"></ng-content>\n <ng-container>\n <div *ngIf=\"overflowActions.length !== 0\">\n <button\n id=\"pageHeaderMenuButton\"\n type=\"button\"\n pButton\n icon=\"pi pi-ellipsis-v\"\n title=\"{{ 'OCX_PAGE_HEADER.MORE_ACTIONS' | translate }}\"\n class=\"more-actions-menu-button action-button ml-2\"\n (click)=\"menu.toggle($event)\"\n name=\"ocx-page-header-overflow-action-button\"\n [ariaLabel]=\"('OCX_PAGE_HEADER.MORE_ACTIONS' | translate)\"\n ></button>\n <p-menu #menu [popup]=\"true\" [model]=\"overflowActions\" appendTo=\"body\"></p-menu>\n </div>\n </ng-container>\n </ng-container>\n <ng-container *ngIf=\"additionalToolbarContent\" [ngTemplateOutlet]=\"additionalToolbarContent\"> </ng-container>\n </div>\n </div>\n\n <div\n class=\"object-panel flex-column md:flex-row\"\n [class.justify-content-evenly]=\"objectDetails\"\n [class.justify-content-start]=\"!objectDetails\"\n >\n <ng-container *ngIf=\"objectDetails\">\n <div\n class=\"object-info flex flex-row md:flex-column align-items-baseline md:align-items-center justify-content-between\"\n *ngFor=\"let item of objectDetails\"\n >\n <label class=\"flex font-medium text-600\" name=\"object-detail-label\"\n >{{ item.label | dynamicPipe:item.labelPipe }}</label\n >\n <span\n *ngIf=\"item.icon || item.value\"\n class=\"flex text-900 mt-2\"\n [ngClass]=\"generateItemStyle(item)\"\n [title]=\"item.tooltip || ''\"\n name=\"object-detail-value\"\n >\n <i *ngIf=\"item.icon\" class=\"{{item.icon}}\" name=\"object-detail-icon\"></i>\n {{ item.value | dynamicPipe:item.valuePipe:item.valuePipeArgs}}</span\n >\n </div>\n </ng-container>\n <ng-content></ng-content>\n </div>\n</div>\n", styles: [":host(.p-button-label){font-weight:400}:host ::ng-deep .action-button{padding:.5rem;font-weight:400}.onecx-page-header{display:flex;flex-flow:column;border-radius:.25rem;overflow:hidden;background:#fff;box-shadow:0 2px 2px #0000001a;border:1px solid #cdd0d3}.onecx-page-header .title-bar{display:flex;flex-wrap:wrap;justify-content:space-between;align-items:center;gap:.5rem;background-color:#f8f9fa;border-top-right-radius:inherit;border-top-left-radius:inherit}.onecx-page-header .title-bar .figure{width:3rem;height:3rem;margin-right:.5rem;position:relative}.onecx-page-header .title-bar .figure .figure-image img{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%)}.onecx-page-header .title-bar .figure .colorblob{background-color:var(--primary-color);position:absolute;inset:0}.onecx-page-header .title-bar .title-wrap{display:flex;flex-flow:row;align-items:center;gap:.25rem}.onecx-page-header .title-bar .title-wrap .header{display:flex;align-items:flex-start;justify-content:center;flex-direction:column}.onecx-page-header .title-bar .title-wrap h1{font-size:1em;font-weight:700;margin:0;padding:0}.onecx-page-header .title-bar .title-wrap h2{font-size:1em;font-weight:400;margin:0;padding:0}.onecx-page-header .title-bar .action-items-wrap{display:flex;height:-moz-fit-content;height:fit-content;gap:.5rem;align-items:center;justify-content:space-between}.onecx-page-header .title-bar .action-items-wrap button{padding:.5rem}.onecx-page-header .object-panel{border-top:1px solid #cdd0d3;padding:1rem;display:flex}.onecx-page-header .object-panel:empty{display:none}.badge-container{display:flex;align-items:center;justify-content:center;width:100%;height:100%}.scale{transform:scale(2)}\n"] }]
169
173
  }], ctorParameters: function () { return [{ type: i1.BreadcrumbService }, { type: i2.TranslateService }, { type: i3.AppStateService }, { type: i3.UserService }]; }, propDecorators: { header: [{
170
174
  type: Input
171
175
  }], loading: [{
@@ -197,4 +201,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImpo
197
201
  type: ContentChild,
198
202
  args: ['additionalToolbarContentLeft']
199
203
  }] } });
200
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFnZS1oZWFkZXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9hbmd1bGFyLWFjY2VsZXJhdG9yL3NyYy9saWIvY29tcG9uZW50cy9wYWdlLWhlYWRlci9wYWdlLWhlYWRlci5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL2FuZ3VsYXItYWNjZWxlcmF0b3Ivc3JjL2xpYi9jb21wb25lbnRzL3BhZ2UtaGVhZGVyL3BhZ2UtaGVhZGVyLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxTQUFTLEVBQ1QsWUFBWSxFQUNaLFlBQVksRUFDWixLQUFLLEVBR0wsTUFBTSxFQUlOLGlCQUFpQixHQUNsQixNQUFNLGVBQWUsQ0FBQTtBQUN0QixPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQTtBQUN0RCxPQUFPLEVBQVksVUFBVSxFQUFFLE1BQU0sYUFBYSxDQUFBO0FBQ2xELE9BQU8sRUFBRSxNQUFNLEVBQUUsR0FBRyxFQUFjLEVBQUUsRUFBRSxNQUFNLE1BQU0sQ0FBQTtBQUNsRCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sc0NBQXNDLENBQUE7QUFDdEUsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLHNDQUFzQyxDQUFBO0FBQ2xFLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLG1DQUFtQyxDQUFBOzs7Ozs7Ozs7Ozs7QUFpRHJFLE1BQU0sT0FBTyxtQkFBbUI7SUF3QjlCLElBQ0ksT0FBTztRQUNULE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQTtJQUN0QixDQUFDO0lBQ0QsSUFBSSxPQUFPLENBQUMsS0FBSztRQUNmLElBQUksQ0FBQyxRQUFRLEdBQUcsS0FBSyxDQUFBO1FBQ3JCLElBQUksQ0FBQyxxQkFBcUIsRUFBRSxDQUFBO1FBQzVCLElBQUksQ0FBQyx1QkFBdUIsRUFBRSxDQUFBO0lB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QVk7dUJBQUMsMEJBQTBCO2dCQUl4Qyw0QkFBNEI7c0JBRDNCLFlBQVk7dUJBQUMsOEJBQThCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQ29tcG9uZW50LFxuICBDb250ZW50Q2hpbGQsXG4gIEV2ZW50RW1pdHRlcixcbiAgSW5wdXQsXG4gIE9uQ2hhbmdlcyxcbiAgT25Jbml0LFxuICBPdXRwdXQsXG4gIFNpbXBsZUNoYW5nZXMsXG4gIFRlbXBsYXRlUmVmLFxuICBUeXBlLFxuICBWaWV3RW5jYXBzdWxhdGlvbixcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSdcbmltcG9ydCB7IFRyYW5zbGF0ZVNlcnZpY2UgfSBmcm9tICdAbmd4LXRyYW5zbGF0ZS9jb3JlJ1xuaW1wb3J0IHsgTWVudUl0ZW0sIFByaW1lSWNvbnMgfSBmcm9tICdwcmltZW5nL2FwaSdcbmltcG9ydCB7IGNvbmNhdCwgbWFwLCBPYnNlcnZhYmxlLCBvZiB9IGZyb20gJ3J4anMnXG5pbXBvcnQgeyBBcHBTdGF0ZVNlcnZpY2UgfSBmcm9tICdAb25lY3gvYW5ndWxhci1pbnRlZ3JhdGlvbi1pbnRlcmZhY2UnXG5pbXBvcnQgeyBVc2VyU2VydmljZSB9IGZyb20gJ0BvbmVjeC9hbmd1bGFyLWludGVncmF0aW9uLWludGVyZmFjZSdcbmltcG9ydCB7IEJyZWFkY3J1bWJTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvYnJlYWRjcnVtYi5zZXJ2aWNlJ1xuaW1wb3J0IHsgUHJpbWVJY29uIH0gZnJvbSAnLi4vLi4vdXRpbHMvcHJpbWVpY29uLnV0aWxzJ1xuXG4vKipcbiAqIEFjdGlvbiBkZWZpbml0aW9uLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEFjdGlvbiB7XG4gIGlkPzogc3RyaW5nXG4gIGxhYmVsPzogc3RyaW5nXG4gIGxhYmVsS2V5Pzogc3RyaW5nXG4gIGljb24/OiBzdHJpbmdcbiAgLyoqXG4gICAqIFBlcm1pc3Npb24gZm9yIHRoaXMgYWN0aW9uLiBJZiB0aGUgY3VycmVudCB1c2VyIGRvZXMgbm90IGhhdmUgdGhpcyBwZXJtaXNzaW9uLCB0aGUgYWN0aW9uIHdpbGwgbm90IGJlIHNob3duLlxuICAgKi9cbiAgcGVybWlzc2lvbj86IHN0cmluZ1xuICB0aXRsZT86IHN0cmluZ1xuICB0aXRsZUtleT86IHN0cmluZ1xuICBidG5DbGFzcz86IHN0cmluZ1xuICBhY3Rpb25DYWxsYmFjaygpOiB2b2lkXG4gIGRpc2FibGVkPzogYm9vbGVhblxuICBzaG93PzogJ2Fsd2F5cycgfCAnYXNPdmVyZmxvdydcbiAgY29uZGl0aW9uYWw/OiBib29sZWFuXG4gIC8vIE5vdGU6IFRoaXMgY3VycmVudGx5IGRvZXNuJ3Qgd29yayB3aXRoIGR5bmFtaWMgdmFsdWVzLCBzaW5jZSBhIHBhc3NlZCBpbiBBY3Rpb24gaXMganVzdCBhIGNvcHkgb2YgdGhlIG9yaWdpbmFsIG9iamVjdC5cbiAgLy8gQXMgYSB3b3JrYXJvdW5kLCB5b3UgY2FuIG1hbnVhbGx5IHVwZGF0ZS9yZXBsYWNlIHRoZSBwYXNzZWQgaW4gQWN0aW9uIGlmIHlvdSB3aXNoIHRvIHVwZGF0ZSBhIHNob3dDb25kaXRpb25cbiAgc2hvd0NvbmRpdGlvbj86IGJvb2xlYW5cbn1cblxuZXhwb3J0IGludGVyZmFjZSBPYmplY3REZXRhaWxJdGVtIHtcbiAgbGFiZWw6IHN0cmluZ1xuICB2YWx1ZT86IHN0cmluZ1xuICB0b29sdGlwPzogc3RyaW5nXG4gIGljb24/OiBQcmltZUljb25cbiAgbGFiZWxQaXBlPzogVHlwZTxhbnk+XG4gIHZhbHVlUGlwZT86IFR5cGU8YW55PlxuICB2YWx1ZVBpcGVBcmdzPzogc3RyaW5nXG4gIHZhbHVlQ3NzQ2xhc3M/OiBzdHJpbmdcbn1cblxuZXhwb3J0IGludGVyZmFjZSBIb21lSXRlbSB7XG4gIG1lbnVJdGVtOiBNZW51SXRlbVxuICBwYWdlPzogc3RyaW5nXG59XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ29jeC1wYWdlLWhlYWRlcicsXG4gIHRlbXBsYXRlVXJsOiAnLi9wYWdlLWhlYWRlci5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL3BhZ2UtaGVhZGVyLmNvbXBvbmVudC5zY3NzJ10sXG4gIGVuY2Fwc3VsYXRpb246IFZpZXdFbmNhcHN1bGF0aW9uLk5vbmUsXG59KVxuZXhwb3J0IGNsYXNzIFBhZ2VIZWFkZXJDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uQ2hhbmdlcyB7XG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBoZWFkZXI6IHN0cmluZyB8IHVuZGVmaW5lZFxuXG4gIEBJbnB1dCgpXG4gIGxvYWRpbmcgPSBmYWxzZVxuXG4gIEBJbnB1dCgpXG4gIGZpZ3VyZUJhY2tncm91bmQgPSB0cnVlXG5cbiAgQElucHV0KClcbiAgc2hvd0ZpZ3VyZSA9IHRydWVcblxuICAvL2ltYWdlIGZvdCBwcmV2aWV3IGluIHRvcC1oZWFkZXIgbGVmdCBzaWRlXG4gIEBJbnB1dCgpXG4gIGZpZ3VyZUltYWdlOiBzdHJpbmcgfCB1bmRlZmluZWRcblxuICBASW5wdXQoKVxuICBkaXNhYmxlRGVmYXVsdEFjdGlvbnMgPSBmYWxzZVxuXG4gIEBJbnB1dCgpXG4gIHN1YmhlYWRlcjogc3RyaW5nIHwgdW5kZWZpbmVkXG5cbiAgX2FjdGlvbnM6IEFjdGlvbltdIHwgdW5kZWZpbmVkXG4gIEBJbnB1dCgpXG4gIGdldCBhY3Rpb25zKCkge1xuICAgIHJldHVybiB0aGlzLl9hY3Rpb25zXG4gIH1cbiAgc2V0IGFjdGlvbnModmFsdWUpIHtcbiAgICB0aGlzLl9hY3Rpb25zID0gdmFsdWVcbiAgICB0aGlzLmdlbmVyYXRlSW5saW5lQWN0aW9ucygpXG4gICAgdGhpcy5nZW5lcmF0ZU92ZXJmbG93QWN0aW9ucygpXG4gIH1cblxuICBASW5wdXQoKVxuICBvYmplY3REZXRhaWxzOiBPYmplY3REZXRhaWxJdGVtW10gfCB1bmRlZmluZWRcblxuICBASW5wdXQoKVxuICBzaG93QnJlYWRjcnVtYnMgPSB0cnVlXG5cbiAgQElucHV0KClcbiAgbWFudWFsQnJlYWRjcnVtYnMgPSBmYWxzZVxuXG4gIEBPdXRwdXQoKVxuICBzYXZlID0gbmV3IEV2ZW50RW1pdHRlcigpXG5cbiAgQENvbnRlbnRDaGlsZCgnYWRkaXRpb25hbFRvb2xiYXJDb250ZW50JylcbiAgYWRkaXRpb25hbFRvb2xiYXJDb250ZW50OiBUZW1wbGF0ZVJlZjxhbnk+IHwgdW5kZWZpbmVkXG5cbiAgQENvbnRlbnRDaGlsZCgnYWRkaXRpb25hbFRvb2xiYXJDb250ZW50TGVmdCcpXG4gIGFkZGl0aW9uYWxUb29sYmFyQ29udGVudExlZnQ6IFRlbXBsYXRlUmVmPGFueT4gfCB1bmRlZmluZWRcblxuICBvdmVyZmxvd0FjdGlvbnM6IE1lbnVJdGVtW10gPSBbXVxuICBpbmxpbmVBY3Rpb25zOiBBY3Rpb25bXSB8IHVuZGVmaW5lZFxuICBkZCA9IG5ldyBEYXRlKClcbiAgYnJlYWRjcnVtYnMkITogT2JzZXJ2YWJsZTxNZW51SXRlbVtdPlxuXG4gIGhvbWUkITogT2JzZXJ2YWJsZTxIb21lSXRlbT5cblxuICBwcm90ZWN0ZWQgYnJlYWRjcnVtYnM6IEJyZWFkY3J1bWJTZXJ2aWNlXG5cbiAgY29uc3RydWN0b3IoXG4gICAgYnJlYWRjcnVtYnM6IEJyZWFkY3J1bWJTZXJ2aWNlLFxuICAgIHByaXZhdGUgdHJhbnNsYXRlU2VydmljZTogVHJhbnNsYXRlU2VydmljZSxcbiAgICBwcml2YXRlIGFwcFN0YXRlU2VydmljZTogQXBwU3RhdGVTZXJ2aWNlLFxuICAgIHByaXZhdGUgdXNlclNlcnZpY2U6IFVzZXJTZXJ2aWNlXG4gICkge1xuICAgIHRoaXMuYnJlYWRjcnVtYnMgPSBicmVhZGNydW1ic1xuICAgIHRoaXMuaG9tZSQgPSBjb25jYXQoXG4gICAgICBvZih7IG1lbnVJdGVtOiB7IGljb246IFByaW1lSWNvbnMuSE9NRSwgcm91dGVyTGluazogJy8nIH0gfSksXG4gICAgICB0aGlzLmFwcFN0YXRlU2VydmljZS5jdXJyZW50UG9ydGFsJC5waXBlKFxuICAgICAgICBtYXAoKHBvcnRhbCkgPT4gKHtcbiAgICAgICAgICBtZW51SXRlbToge1xuICAgICAgICAgICAgaWNvbjogUHJpbWVJY29ucy5IT01FLFxuICAgICAgICAgICAgcm91dGVyTGluazogcG9ydGFsLmJhc2VVcmwsXG4gICAgICAgICAgfSxcbiAgICAgICAgICBwYWdlOiBwb3J0YWwucG9ydGFsTmFtZSxcbiAgICAgICAgfSkpXG4gICAgICApXG4gICAgKVxuICB9XG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcbiAgICBpZiAoY2hhbmdlc1snYWN0aW9ucyddKSB7XG4gICAgICB0aGlzLmdlbmVyYXRlSW5saW5lQWN0aW9ucygpXG4gICAgICB0aGlzLmdlbmVyYXRlT3ZlcmZsb3dBY3Rpb25zKClcbiAgICB9XG4gIH1cblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMubWFudWFsQnJlYWRjcnVtYnMpIHtcbiAgICAgIHRoaXMuYnJlYWRjcnVtYnMkID0gdGhpcy5icmVhZGNydW1icy5nZW5lcmF0ZWRJdGVtc1NvdXJjZVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmJyZWFkY3J1bWJzJCA9IHRoaXMuYnJlYWRjcnVtYnMuaXRlbXNIYW5kbGVyXG4gICAgfVxuICAgIHRoaXMuZ2VuZXJhdGVJbmxpbmVBY3Rpb25zKClcbiAgICB0aGlzLmdlbmVyYXRlT3ZlcmZsb3dBY3Rpb25zKClcbiAgfVxuXG4gIG9uQWN0aW9uKGFjdGlvbjogc3RyaW5nKSB7XG4gICAgc3dpdGNoIChhY3Rpb24pIHtcbiAgICAgIGNhc2UgJ3NhdmUnOlxuICAgICAgICB0aGlzLnNhdmUuZW1pdCgpXG4gICAgICAgIGJyZWFrXG4gICAgICBkZWZhdWx0OlxuICAgICAgICBicmVha1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBnZW5lcmF0ZUl0ZW1TdHlsZShpdGVtOiBPYmplY3REZXRhaWxJdGVtKTogc3RyaW5nIHtcbiAgICBsZXQgc3R5bGUgPSAnJ1xuICAgIGlmIChpdGVtLmljb24pIHN0eWxlID0gc3R5bGUuY29uY2F0KHN0eWxlLCAnICcsICdnYXAtMSBhbGlnbi1pdGVtcy1jZW50ZXInKVxuICAgIGlmIChpdGVtLnZhbHVlQ3NzQ2xhc3MpIHN0eWxlID0gc3R5bGUuY29uY2F0KHN0eWxlLCAnICcsIGl0ZW0udmFsdWVDc3NDbGFzcylcbiAgICByZXR1cm4gc3R5bGVcbiAgfVxuXG4gIC8qKlxuICAgKiBHZW5lcmF0ZXMgYSBsaXN0IG9mIGFjdGlvbnMgdGhhdCBzaG91bGQgYmUgcmVuZGVyZWQgaW4gYW4gb3ZlcmZsb3cgbWVudVxuICAgKi9cbiAgcHJpdmF0ZSBnZW5lcmF0ZU92ZXJmbG93QWN0aW9ucygpIHtcbiAgICBpZiAodGhpcy5hY3Rpb25zKSB7XG4gICAgICBjb25zdCB0cmFuc2xhdGlvbktleXM6IHN0cmluZ1tdID0gW1xuICAgICAgICAuLi50aGlzLmFjdGlvbnMubWFwKChhKSA9PiBhLmxhYmVsS2V5IHx8ICcnKS5maWx0ZXIoKGEpID0+ICEhYSksXG4gICAgICAgIC4uLnRoaXMuYWN0aW9ucy5tYXAoKGEpID0+IGEudGl0bGVLZXkgfHwgJycpLmZpbHRlcigoYSkgPT4gISFhKSxcbiAgICAgIF1cbiAgICAgIGNvbnN0IHRyYW5zbGF0aW9ucyQgPSB0cmFuc2xhdGlvbktleXMubGVuZ3RoID8gdGhpcy50cmFuc2xhdGVTZXJ2aWNlLmdldCh0cmFuc2xhdGlvbktleXMpIDogb2YoW10pXG4gICAgICB0cmFuc2xhdGlvbnMkLnN1YnNjcmliZSgodHJhbnNsYXRpb25zKSA9PiB7XG4gICAgICAgIGNvbnN0IGFsbG93ZWRBY3Rpb25zOiBBY3Rpb25bXSA9IFtdXG4gICAgICAgIGlmICh0aGlzLmFjdGlvbnMpIHtcbiAgICAgICAgICB0aGlzLmFjdGlvbnNcbiAgICAgICAgICAgIC5maWx0ZXIoKGEpID0+IGEuc2hvdyA9PT0gJ2FzT3ZlcmZsb3cnKVxuICAgICAgICAgICAgLmZpbHRlcigoYSkgPT4ge1xuICAgICAgICAgICAgICBpZiAoYS5jb25kaXRpb25hbCkge1xuICAgICAgICAgICAgICAgIGlmIChhLnNob3dDb25kaXRpb24pIHJldHVybiBhXG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGxcbiAgICAgICAgICAgICAgfSBlbHNlIHJldHVybiBhXG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgLmZvckVhY2goKGFjdGlvbikgPT4ge1xuICAgICAgICAgICAgICB0aGlzLmNoZWNrQWN0aW9uUGVybWlzc2lvbihhbGxvd2VkQWN0aW9ucywgYWN0aW9uKVxuICAgICAgICAgICAgfSlcbiAgICAgICAgICB0aGlzLm92ZXJmbG93QWN0aW9ucyA9IFtcbiAgICAgICAgICAgIC4uLmFsbG93ZWRBY3Rpb25zLm1hcDxNZW51SXRlbT4oKGEpID0+ICh7XG4gICAgICAgICAgICAgIGxhYmVsOiBhLmxhYmVsS2V5ID8gdHJhbnNsYXRpb25zW2EubGFiZWxLZXldIDogYS5sYWJlbCxcbiAgICAgICAgICAgICAgaWNvbjogYS5pY29uLFxuICAgICAgICAgICAgICB0aXRsZTpcbiAgICAgICAgICAgICAgICAoYS50aXRsZUtleSA/IHRyYW5zbGF0aW9uc1thLnRpdGxlS2V5XSA6IGEudGl0bGUpIHx8IChhLmxhYmVsS2V5ID8gdHJhbnNsYXRpb25zW2EubGFiZWxLZXldIDogYS5sYWJlbCksXG4gICAgICAgICAgICAgIGNvbW1hbmQ6IGEuYWN0aW9uQ2FsbGJhY2ssXG4gICAgICAgICAgICAgIGRpc2FibGVkOiBhLmRpc2FibGVkLFxuICAgICAgICAgICAgfSkpLFxuICAgICAgICAgIF1cbiAgICAgICAgfVxuICAgICAgfSlcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogR2VuZXJhdGVzIGEgbGlzdCBvZiBhY3Rpb25zIHRoYXQgc2hvdWxkIGJlIHJlbmRlcmVkIGFzIGlubGluZSBidXR0b25zXG4gICAqL1xuICBwcml2YXRlIGdlbmVyYXRlSW5saW5lQWN0aW9ucygpIHtcbiAgICBpZiAodGhpcy5hY3Rpb25zKSB7XG4gICAgICAvLyBUZW1wIGFycmF5IHRvIGhvbGQgYWxsIGlubGluZSBhY3Rpb25zIHRoYXQgc2hvdWxkIGJlIHZpc2libGUgdG8gdGhlIGN1cnJlbnQgdXNlclxuICAgICAgY29uc3QgYWxsb3dlZEFjdGlvbnM6IEFjdGlvbltdID0gW11cbiAgICAgIC8vIENoZWNrIHBlcm1pc3Npb25zIGZvciBhbGwgYWN0aW9ucyB0aGF0IHNob3VsZCBiZSByZW5kZXJlZCAnYWx3YXlzJ1xuICAgICAgdGhpcy5hY3Rpb25zXG4gICAgICAgIC5maWx0ZXIoKGEpID0+IGEuc2hvdyA9PT0gJ2Fsd2F5cycpXG4gICAgICAgIC5maWx0ZXIoKGEpID0+IHtcbiAgICAgICAgICBpZiAoYS5jb25kaXRpb25hbCkge1xuICAgICAgICAgICAgcmV0dXJuIGEuc2hvd0NvbmRpdGlvbiA/IGEgOiBudWxsXG4gICAgICAgICAgfSBlbHNlIHJldHVybiBhXG4gICAgICAgIH0pXG4gICAgICAgIC5mb3JFYWNoKChhY3Rpb24pID0+IHtcbiAgICAgICAgICB0aGlzLmNoZWNrQWN0aW9uUGVybWlzc2lvbihhbGxvd2VkQWN0aW9ucywgYWN0aW9uKVxuICAgICAgICB9KVxuICAgICAgdGhpcy5pbmxpbmVBY3Rpb25zID0gWy4uLmFsbG93ZWRBY3Rpb25zXVxuICAgIH1cbiAgfVxuICAvKipcbiAgICogQWRkcyBhIGdpdmVuIGFjdGlvbiB0byBhIGdpdmVuIGFycmF5IGlmIHRoZSBjdXJyZW50IHVzZXIgaXMgYWxsb3dlZCB0byBzZWUgaXRcbiAgICogQHBhcmFtIGFsbG93ZWRBY3Rpb25zIEFycmF5IHRoYXQgdGhlIGFjdGlvbiBzaG91bGQgYmUgYWRkZWQgdG8gaWYgdGhlIGN1cnJlbnQgdXNlciBpcyBhbGxvd2VkIHRvIHNlZSBpdFxuICAgKiBAcGFyYW0gYWN0aW9uIEFjdGlvbiBmb3Igd2hpY2ggYSBwZXJtaXNzaW9uIGNoZWNrIHNob3VsZCBiZSBleGVjdXRlZFxuICAgKi9cbiAgcHJpdmF0ZSBjaGVja0FjdGlvblBlcm1pc3Npb24oYWxsb3dlZEFjdGlvbnM6IEFjdGlvbltdLCBhY3Rpb246IEFjdGlvbikge1xuICAgIGlmIChhY3Rpb24ucGVybWlzc2lvbikge1xuICAgICAgaWYgKHRoaXMudXNlclNlcnZpY2UuaGFzUGVybWlzc2lvbihhY3Rpb24ucGVybWlzc2lvbikpIHtcbiAgICAgICAgLy8gUHVzaCBhY3Rpb24gdG8gYWxsb3dlZCBhcnJheSBpZiB1c2VyIGhhcyBzdWZmaWNpZW50IHBlcm1pc3Npb25zXG4gICAgICAgIGFsbG93ZWRBY3Rpb25zLnB1c2goYWN0aW9uKVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAvLyBQdXNoIGFjdGlvbiB0byBhbGxvd2VkIGFycmF5IGlmIG5vIHBlcm1pc3Npb24gd2FzIHNwZWNpZmllZFxuICAgICAgYWxsb3dlZEFjdGlvbnMucHVzaChhY3Rpb24pXG4gICAgfVxuICB9XG59XG4iLCI8ZGl2IGNsYXNzPVwib25lY3gtcGFnZS1oZWFkZXJcIiBuYW1lPVwib2N4LXBhZ2UtaGVhZGVyLXdyYXBwZXJcIj5cbiAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInNob3dCcmVhZGNydW1ic1wiPlxuICAgIDxwLWJyZWFkY3J1bWJcbiAgICAgIFttb2RlbF09XCJpdGVtc1wiXG4gICAgICAqbmdJZj1cImJyZWFkY3J1bWJzJCB8IGFzeW5jICBhcyBpdGVtc1wiXG4gICAgICBbaG9tZV09XCIoaG9tZSQgfCBhc3luYyk/Lm1lbnVJdGVtID8/IHt9XCJcbiAgICAgIFtob21lQXJpYUxhYmVsXT1cIihob21lJCB8IGFzeW5jKT8ucGFnZSA/ICgnT0NYX1BBR0VfSEVBREVSLkhPTUVfQVJJQV9MQUJFTCcgfCB0cmFuc2xhdGU6IHsgcGFnZTogKGhvbWUkIHwgYXN5bmMpPy5wYWdlfSkgOiAoJ09DWF9QQUdFX0hFQURFUi5IT01FX0RFRkFVTFRfQVJJQV9MQUJFTCcgfCB0cmFuc2xhdGUpXCJcbiAgICAgIFthdHRyLm1hbnVhbF09XCJtYW51YWxCcmVhZGNydW1ic1wiXG4gICAgPjwvcC1icmVhZGNydW1iPlxuICA8L25nLWNvbnRhaW5lcj5cbiAgPGRpdiBjbGFzcz1cInRpdGxlLWJhciBmbGV4IGZsZXgtcm93IG1kOmp1c3RpZnktY29udGVudC1iZXR3ZWVuIHAtMiBtZDpwLTNcIj5cbiAgICA8ZGl2IGNsYXNzPVwidGl0bGUtd3JhcFwiPlxuICAgICAgPGRpdiBjbGFzcz1cImZpZ3VyZSBmbGV4IGgtMnJlbSB3LTJyZW0gbWQ6aC0zcmVtIG1kOnctM3JlbVwiICpuZ0lmPVwic2hvd0ZpZ3VyZVwiPlxuICAgICAgICA8ZGl2ICNwcmV2aWV3SW1hZ2UgY2xhc3M9XCJmaWd1cmUtaW1hZ2UgYWJzb2x1dGUgdG9wLTAgbGVmdC0wIHJpZ2h0LTAgYm90dG9tLTBcIj5cbiAgICAgICAgICA8bmctY29udGVudCBzZWxlY3Q9XCJbZmlndXJlSW1hZ2VdXCI+PC9uZy1jb250ZW50PlxuICAgICAgICAgIDxpbWcgKm5nSWY9XCJmaWd1cmVJbWFnZVwiIFtvY3hTcmNdPVwiZmlndXJlSW1hZ2VcIiBhbHQ9XCJGaWd1cmUgaW1hZ2VcIiBjbGFzcz1cInctZnVsbFwiIC8+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwiY29sb3JibG9iIGZsZXgtMSBib3JkZXItcm91bmRcIiAqbmdJZj1cInByZXZpZXdJbWFnZS5jaGlsZHJlbi5sZW5ndGggPT09IDBcIj48L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgICAgPG5nLXRlbXBsYXRlICNza2VsZXRvbkJhcj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImhlYWRlciBqdXN0aWZ5LWNvbnRlbnQtZXZlbmx5XCI+XG4gICAgICAgICAgPHAtc2tlbGV0b24gd2lkdGg9XCIxMHJlbVwiPjwvcC1za2VsZXRvbj5cbiAgICAgICAgICA8cC1za2VsZXRvbiB3aWR0aD1cIjEwcmVtXCI+PC9wLXNrZWxldG9uPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICA8ZGl2IGNsYXNzPVwiaGVhZGVyXCIgKm5nSWY9XCIhbG9hZGluZzsgZWxzZSBza2VsZXRvbkJhclwiPlxuICAgICAgICA8aDEgaWQ9XCJwYWdlLWhlYWRlclwiICpuZ0lmPVwiISFoZWFkZXJcIj57eyBoZWFkZXIgfX08L2gxPlxuICAgICAgICA8aDIgaWQ9J3BhZ2Utc3ViaGVhZGVyJyAqbmdJZj1cIiEhc3ViaGVhZGVyXCI+e3sgc3ViaGVhZGVyIH19PC9oMj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICAgIDxkaXYgY2xhc3M9XCJhY3Rpb24taXRlbXMtd3JhcCBtdC0yIG1kOm10LTBcIj5cbiAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJhZGRpdGlvbmFsVG9vbGJhckNvbnRlbnRMZWZ0XCIgW25nVGVtcGxhdGVPdXRsZXRdPVwiYWRkaXRpb25hbFRvb2xiYXJDb250ZW50TGVmdFwiPiA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFkaXNhYmxlRGVmYXVsdEFjdGlvbnNcIj4gPC9uZy1jb250YWluZXI+XG4gICAgICA8bmctdGVtcGxhdGUgI3NrZWxldG9uQWN0aW9ucz5cbiAgICAgICAgPGRpdiBjbGFzcz1cImZsZXhcIj5cbiAgICAgICAgICA8cC1za2VsZXRvbiB3aWR0aD1cIjVyZW1cIiBoZWlnaHQ9XCIycmVtXCIgc3R5bGVDbGFzcz1cIm1yLTJcIj48L3Atc2tlbGV0b24+XG4gICAgICAgICAgPHAtc2tlbGV0b24gd2lkdGg9XCIycmVtXCIgaGVpZ2h0PVwiMnJlbVwiIHN0eWxlQ2xhc3M9XCJtYi0yXCI+PC9wLXNrZWxldG9uPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIWxvYWRpbmc7IGVsc2Ugc2tlbGV0b25BY3Rpb25zXCI+XG4gICAgICAgIDxkaXYgKm5nSWY9XCJpbmxpbmVBY3Rpb25zICYmIGlubGluZUFjdGlvbnMubGVuZ3RoID4gMFwiIGNsYXNzPVwidG9vbGJhciBmbGV4IGZsZXgtd3JhcCBnYXAtMSBzbTpnYXAtMlwiPlxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGFjdGlvbiBvZiBpbmxpbmVBY3Rpb25zXCI+XG4gICAgICAgICAgICA8cC1idXR0b25cbiAgICAgICAgICAgICAgaWQ9XCJ7eyBhY3Rpb24uaWQgfX1cIlxuICAgICAgICAgICAgICBbaWNvbl09XCJhY3Rpb24uaWNvbiA/PyAnJ1wiXG4gICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICBjbGFzcz1cImFjdGlvbi1idXR0b25cIlxuICAgICAgICAgICAgICBbbGFiZWxdPVwiYWN0aW9uLmxhYmVsS2V5ID8gKGFjdGlvbi5sYWJlbEtleSB8IHRyYW5zbGF0ZSkgOiBhY3Rpb24ubGFiZWxcIlxuICAgICAgICAgICAgICAob25DbGljayk9XCJhY3Rpb24uYWN0aW9uQ2FsbGJhY2soKVwiXG4gICAgICAgICAgICAgIFt0aXRsZV09XCIoYWN0aW9uLnRpdGxlS2V5ID8gKGFjdGlvbi50aXRsZUtleSB8IHRyYW5zbGF0ZSkgOiBhY3Rpb24udGl0bGUpIHx8IChhY3Rpb24ubGFiZWxLZXkgPyAoYWN0aW9uLmxhYmVsS2V5IHwgdHJhbnNsYXRlKSA6IGFjdGlvbi5sYWJlbClcIlxuICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiYWN0aW9uLmRpc2FibGVkID8gYWN0aW9uLmRpc2FibGVkIDogZmFsc2VcIlxuICAgICAgICAgICAgICBbYXR0ci5uYW1lXT1cImFjdGlvbi5pY29uID8gJ29jeC1wYWdlLWhlYWRlci1pbmxpbmUtYWN0aW9uLWljb24tYnV0dG9uJyA6ICdvY3gtcGFnZS1oZWFkZXItaW5saW5lLWFjdGlvbi1idXR0b24nXCJcbiAgICAgICAgICAgICAgW2FyaWFMYWJlbF09XCIoYWN0aW9uLnRpdGxlS2V5ID8gKGFjdGlvbi50aXRsZUtleSB8IHRyYW5zbGF0ZSkgOiBhY3Rpb24udGl0bGUpIHx8IChhY3Rpb24ubGFiZWxLZXkgPyAoYWN0aW9uLmxhYmVsS2V5IHwgdHJhbnNsYXRlKSA6IGFjdGlvbi5sYWJlbClcIlxuICAgICAgICAgICAgPjwvcC1idXR0b24+XG4gICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8bmctY29udGVudCBzZWxlY3Q9XCJbdG9vbGJhckl0ZW1zXVwiPjwvbmctY29udGVudD5cbiAgICAgICAgPG5nLWNvbnRhaW5lcj5cbiAgICAgICAgICA8ZGl2ICpuZ0lmPVwib3ZlcmZsb3dBY3Rpb25zLmxlbmd0aCAhPT0gMFwiPlxuICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICBpZD1cInBhZ2VIZWFkZXJNZW51QnV0dG9uXCJcbiAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgIHBCdXR0b25cbiAgICAgICAgICAgICAgaWNvbj1cInBpIHBpLWVsbGlwc2lzLXZcIlxuICAgICAgICAgICAgICB0aXRsZT1cInt7ICdPQ1hfUEFHRV9IRUFERVIuTU9SRV9BQ1RJT05TJyB8IHRyYW5zbGF0ZSB9fVwiXG4gICAgICAgICAgICAgIGNsYXNzPVwibW9yZS1hY3Rpb25zLW1lbnUtYnV0dG9uIGFjdGlvbi1idXR0b24gbWwtMlwiXG4gICAgICAgICAgICAgIChjbGljayk9XCJtZW51LnRvZ2dsZSgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgbmFtZT1cIm9jeC1wYWdlLWhlYWRlci1vdmVyZmxvdy1hY3Rpb24tYnV0dG9uXCJcbiAgICAgICAgICAgICAgW2FyaWFMYWJlbF09XCIoJ09DWF9QQUdFX0hFQURFUi5NT1JFX0FDVElPTlMnIHwgdHJhbnNsYXRlKVwiXG4gICAgICAgICAgICA+PC9idXR0b24+XG4gICAgICAgICAgICA8cC1tZW51ICNtZW51IFtwb3B1cF09XCJ0cnVlXCIgW21vZGVsXT1cIm92ZXJmbG93QWN0aW9uc1wiIGFwcGVuZFRvPVwiYm9keVwiPjwvcC1tZW51PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImFkZGl0aW9uYWxUb29sYmFyQ29udGVudFwiIFtuZ1RlbXBsYXRlT3V0bGV0XT1cImFkZGl0aW9uYWxUb29sYmFyQ29udGVudFwiPiA8L25nLWNvbnRhaW5lcj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG5cbiAgPGRpdlxuICAgIGNsYXNzPVwib2JqZWN0LXBhbmVsIGZsZXgtY29sdW1uIG1kOmZsZXgtcm93XCJcbiAgICBbY2xhc3MuanVzdGlmeS1jb250ZW50LWV2ZW5seV09XCJvYmplY3REZXRhaWxzXCJcbiAgICBbY2xhc3MuanVzdGlmeS1jb250ZW50LXN0YXJ0XT1cIiFvYmplY3REZXRhaWxzXCJcbiAgPlxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJvYmplY3REZXRhaWxzXCI+XG4gICAgICA8ZGl2XG4gICAgICAgIGNsYXNzPVwib2JqZWN0LWluZm8gZmxleCBmbGV4LXJvdyBtZDpmbGV4LWNvbHVtbiBhbGlnbi1pdGVtcy1iYXNlbGluZSBtZDphbGlnbi1pdGVtcy1jZW50ZXIganVzdGlmeS1jb250ZW50LWJldHdlZW5cIlxuICAgICAgICAqbmdGb3I9XCJsZXQgaXRlbSBvZiBvYmplY3REZXRhaWxzXCJcbiAgICAgID5cbiAgICAgICAgPGxhYmVsIGNsYXNzPVwiZmxleCBmb250LW1lZGl1bSB0ZXh0LTYwMFwiIG5hbWU9XCJvYmplY3QtZGV0YWlsLWxhYmVsXCI+e3sgaXRlbS5sYWJlbCB8IGR5bmFtaWNQaXBlOml0ZW0ubGFiZWxQaXBlIH19PC9sYWJlbD5cbiAgICAgICAgPHNwYW5cbiAgICAgICAgICAqbmdJZj1cIml0ZW0uaWNvbiB8fCBpdGVtLnZhbHVlXCJcbiAgICAgICAgICBjbGFzcz1cImZsZXggdGV4dC05MDAgbXQtMlwiXG4gICAgICAgICAgW25nQ2xhc3NdPVwiZ2VuZXJhdGVJdGVtU3R5bGUoaXRlbSlcIlxuICAgICAgICAgIFt0aXRsZV09XCJpdGVtLnRvb2x0aXAgfHwgJydcIlxuICAgICAgICAgIG5hbWU9XCJvYmplY3QtZGV0YWlsLXZhbHVlXCJcbiAgICAgICAgPlxuICAgICAgICAgIDxpICpuZ0lmPVwiaXRlbS5pY29uXCIgY2xhc3M9XCJ7e2l0ZW0uaWNvbn19XCIgbmFtZT1cIm9iamVjdC1kZXRhaWwtaWNvblwiPjwvaT5cbiAgICAgICAgICB7eyBpdGVtLnZhbHVlIHwgZHluYW1pY1BpcGU6aXRlbS52YWx1ZVBpcGU6aXRlbS52YWx1ZVBpcGVBcmdzfX08L3NwYW5cbiAgICAgICAgPlxuICAgICAgPC9kaXY+XG4gICAgPC9uZy1jb250YWluZXI+XG4gICAgPG5nLWNvbnRlbnQ+PC9uZy1jb250ZW50PlxuICA8L2Rpdj5cbjwvZGl2PlxuIl19
204
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFnZS1oZWFkZXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9hbmd1bGFyLWFjY2VsZXJhdG9yL3NyYy9saWIvY29tcG9uZW50cy9wYWdlLWhlYWRlci9wYWdlLWhlYWRlci5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL2FuZ3VsYXItYWNjZWxlcmF0b3Ivc3JjL2xpYi9jb21wb25lbnRzL3BhZ2UtaGVhZGVyL3BhZ2UtaGVhZGVyLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxTQUFTLEVBQ1QsWUFBWSxFQUNaLFlBQVksRUFDWixLQUFLLEVBR0wsTUFBTSxFQUlOLGlCQUFpQixHQUNsQixNQUFNLGVBQWUsQ0FBQTtBQUN0QixPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQTtBQUN0RCxPQUFPLEVBQVksVUFBVSxFQUFFLE1BQU0sYUFBYSxDQUFBO0FBQ2xELE9BQU8sRUFBRSxNQUFNLEVBQUUsR0FBRyxFQUFjLEVBQUUsRUFBRSxNQUFNLE1BQU0sQ0FBQTtBQUNsRCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sc0NBQXNDLENBQUE7QUFDdEUsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLHNDQUFzQyxDQUFBO0FBQ2xFLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLG1DQUFtQyxDQUFBOzs7Ozs7Ozs7Ozs7QUFpRHJFLE1BQU0sT0FBTyxtQkFBbUI7SUF3QjlCLElBQ0ksT0FBTztRQUNULE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQTtJQUN0QixDQUFDO0lBQ0QsSUFBSSxPQUFPLENBQUMsS0FBSztRQUNmLElBQUksQ0FBQyxRQUFRLEdBQUcsS0FBSyxDQUFBO1FBQ3JCLElBQUksQ0FBQyxxQkFBcUIsRUFBRSxDQUFBO1FBQzVCLElBQUksQ0FBQyx1QkFBdUIsRUFBRSxDQUFBO0lB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SU4sZUFBZTtzQkFEZCxLQUFLO2dCQUlOLGlCQUFpQjtzQkFEaEIsS0FBSztnQkFJTixJQUFJO3NCQURILE1BQU07Z0JBSVAsd0JBQXdCO3NCQUR2QixZQUFZO3VCQUFDLDBCQUEwQjtnQkFJeEMsNEJBQTRCO3NCQUQzQixZQUFZO3VCQUFDLDhCQUE4QiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIENvbXBvbmVudCxcbiAgQ29udGVudENoaWxkLFxuICBFdmVudEVtaXR0ZXIsXG4gIElucHV0LFxuICBPbkNoYW5nZXMsXG4gIE9uSW5pdCxcbiAgT3V0cHV0LFxuICBTaW1wbGVDaGFuZ2VzLFxuICBUZW1wbGF0ZVJlZixcbiAgVHlwZSxcbiAgVmlld0VuY2Fwc3VsYXRpb24sXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnXG5pbXBvcnQgeyBUcmFuc2xhdGVTZXJ2aWNlIH0gZnJvbSAnQG5neC10cmFuc2xhdGUvY29yZSdcbmltcG9ydCB7IE1lbnVJdGVtLCBQcmltZUljb25zIH0gZnJvbSAncHJpbWVuZy9hcGknXG5pbXBvcnQgeyBjb25jYXQsIG1hcCwgT2JzZXJ2YWJsZSwgb2YgfSBmcm9tICdyeGpzJ1xuaW1wb3J0IHsgQXBwU3RhdGVTZXJ2aWNlIH0gZnJvbSAnQG9uZWN4L2FuZ3VsYXItaW50ZWdyYXRpb24taW50ZXJmYWNlJ1xuaW1wb3J0IHsgVXNlclNlcnZpY2UgfSBmcm9tICdAb25lY3gvYW5ndWxhci1pbnRlZ3JhdGlvbi1pbnRlcmZhY2UnXG5pbXBvcnQgeyBCcmVhZGNydW1iU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL2JyZWFkY3J1bWIuc2VydmljZSdcbmltcG9ydCB7IFByaW1lSWNvbiB9IGZyb20gJy4uLy4uL3V0aWxzL3ByaW1laWNvbi51dGlscydcblxuLyoqXG4gKiBBY3Rpb24gZGVmaW5pdGlvbi5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBY3Rpb24ge1xuICBpZD86IHN0cmluZ1xuICBsYWJlbD86IHN0cmluZ1xuICBsYWJlbEtleT86IHN0cmluZ1xuICBpY29uPzogc3RyaW5nXG4gIC8qKlxuICAgKiBQZXJtaXNzaW9uIGZvciB0aGlzIGFjdGlvbi4gSWYgdGhlIGN1cnJlbnQgdXNlciBkb2VzIG5vdCBoYXZlIHRoaXMgcGVybWlzc2lvbiwgdGhlIGFjdGlvbiB3aWxsIG5vdCBiZSBzaG93bi5cbiAgICovXG4gIHBlcm1pc3Npb24/OiBzdHJpbmdcbiAgdGl0bGU/OiBzdHJpbmdcbiAgdGl0bGVLZXk/OiBzdHJpbmdcbiAgYnRuQ2xhc3M/OiBzdHJpbmdcbiAgYWN0aW9uQ2FsbGJhY2soKTogdm9pZFxuICBkaXNhYmxlZD86IGJvb2xlYW5cbiAgc2hvdz86ICdhbHdheXMnIHwgJ2FzT3ZlcmZsb3cnXG4gIGNvbmRpdGlvbmFsPzogYm9vbGVhblxuICAvLyBOb3RlOiBUaGlzIGN1cnJlbnRseSBkb2Vzbid0IHdvcmsgd2l0aCBkeW5hbWljIHZhbHVlcywgc2luY2UgYSBwYXNzZWQgaW4gQWN0aW9uIGlzIGp1c3QgYSBjb3B5IG9mIHRoZSBvcmlnaW5hbCBvYmplY3QuXG4gIC8vIEFzIGEgd29ya2Fyb3VuZCwgeW91IGNhbiBtYW51YWxseSB1cGRhdGUvcmVwbGFjZSB0aGUgcGFzc2VkIGluIEFjdGlvbiBpZiB5b3Ugd2lzaCB0byB1cGRhdGUgYSBzaG93Q29uZGl0aW9uXG4gIHNob3dDb25kaXRpb24/OiBib29sZWFuXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgT2JqZWN0RGV0YWlsSXRlbSB7XG4gIGxhYmVsOiBzdHJpbmdcbiAgdmFsdWU/OiBzdHJpbmdcbiAgdG9vbHRpcD86IHN0cmluZ1xuICBpY29uPzogUHJpbWVJY29uXG4gIGxhYmVsUGlwZT86IFR5cGU8YW55PlxuICB2YWx1ZVBpcGU/OiBUeXBlPGFueT5cbiAgdmFsdWVQaXBlQXJncz86IHN0cmluZ1xuICB2YWx1ZUNzc0NsYXNzPzogc3RyaW5nXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSG9tZUl0ZW0ge1xuICBtZW51SXRlbTogTWVudUl0ZW1cbiAgcGFnZT86IHN0cmluZ1xufVxuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdvY3gtcGFnZS1oZWFkZXInLFxuICB0ZW1wbGF0ZVVybDogJy4vcGFnZS1oZWFkZXIuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9wYWdlLWhlYWRlci5jb21wb25lbnQuc2NzcyddLFxuICBlbmNhcHN1bGF0aW9uOiBWaWV3RW5jYXBzdWxhdGlvbi5Ob25lLFxufSlcbmV4cG9ydCBjbGFzcyBQYWdlSGVhZGVyQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkNoYW5nZXMge1xuICBASW5wdXQoKVxuICBwdWJsaWMgaGVhZGVyOiBzdHJpbmcgfCB1bmRlZmluZWRcblxuICBASW5wdXQoKVxuICBsb2FkaW5nID0gZmFsc2VcblxuICBASW5wdXQoKVxuICBmaWd1cmVCYWNrZ3JvdW5kID0gdHJ1ZVxuXG4gIEBJbnB1dCgpXG4gIHNob3dGaWd1cmUgPSB0cnVlXG5cbiAgLy9pbWFnZSBmb3QgcHJldmlldyBpbiB0b3AtaGVhZGVyIGxlZnQgc2lkZVxuICBASW5wdXQoKVxuICBmaWd1cmVJbWFnZTogc3RyaW5nIHwgdW5kZWZpbmVkXG5cbiAgQElucHV0KClcbiAgZGlzYWJsZURlZmF1bHRBY3Rpb25zID0gZmFsc2VcblxuICBASW5wdXQoKVxuICBzdWJoZWFkZXI6IHN0cmluZyB8IHVuZGVmaW5lZFxuXG4gIF9hY3Rpb25zOiBBY3Rpb25bXSB8IHVuZGVmaW5lZFxuICBASW5wdXQoKVxuICBnZXQgYWN0aW9ucygpIHtcbiAgICByZXR1cm4gdGhpcy5fYWN0aW9uc1xuICB9XG4gIHNldCBhY3Rpb25zKHZhbHVlKSB7XG4gICAgdGhpcy5fYWN0aW9ucyA9IHZhbHVlXG4gICAgdGhpcy5nZW5lcmF0ZUlubGluZUFjdGlvbnMoKVxuICAgIHRoaXMuZ2VuZXJhdGVPdmVyZmxvd0FjdGlvbnMoKVxuICB9XG5cbiAgQElucHV0KClcbiAgb2JqZWN0RGV0YWlsczogT2JqZWN0RGV0YWlsSXRlbVtdIHwgdW5kZWZpbmVkXG5cbiAgQElucHV0KClcbiAgc2hvd0JyZWFkY3J1bWJzID0gdHJ1ZVxuXG4gIEBJbnB1dCgpXG4gIG1hbnVhbEJyZWFkY3J1bWJzID0gZmFsc2VcblxuICBAT3V0cHV0KClcbiAgc2F2ZSA9IG5ldyBFdmVudEVtaXR0ZXIoKVxuXG4gIEBDb250ZW50Q2hpbGQoJ2FkZGl0aW9uYWxUb29sYmFyQ29udGVudCcpXG4gIGFkZGl0aW9uYWxUb29sYmFyQ29udGVudDogVGVtcGxhdGVSZWY8YW55PiB8IHVuZGVmaW5lZFxuXG4gIEBDb250ZW50Q2hpbGQoJ2FkZGl0aW9uYWxUb29sYmFyQ29udGVudExlZnQnKVxuICBhZGRpdGlvbmFsVG9vbGJhckNvbnRlbnRMZWZ0OiBUZW1wbGF0ZVJlZjxhbnk+IHwgdW5kZWZpbmVkXG5cbiAgb3ZlcmZsb3dBY3Rpb25zOiBNZW51SXRlbVtdID0gW11cbiAgaW5saW5lQWN0aW9uczogQWN0aW9uW10gfCB1bmRlZmluZWRcbiAgZGQgPSBuZXcgRGF0ZSgpXG4gIGJyZWFkY3J1bWJzJCE6IE9ic2VydmFibGU8TWVudUl0ZW1bXT5cblxuICBob21lJCE6IE9ic2VydmFibGU8SG9tZUl0ZW0+XG5cbiAgZmlndXJlSW1hZ2VMb2FkRXJyb3IgPSBmYWxzZTtcblxuICBwcm90ZWN0ZWQgYnJlYWRjcnVtYnM6IEJyZWFkY3J1bWJTZXJ2aWNlXG5cbiAgY29uc3RydWN0b3IoXG4gICAgYnJlYWRjcnVtYnM6IEJyZWFkY3J1bWJTZXJ2aWNlLFxuICAgIHByaXZhdGUgdHJhbnNsYXRlU2VydmljZTogVHJhbnNsYXRlU2VydmljZSxcbiAgICBwcml2YXRlIGFwcFN0YXRlU2VydmljZTogQXBwU3RhdGVTZXJ2aWNlLFxuICAgIHByaXZhdGUgdXNlclNlcnZpY2U6IFVzZXJTZXJ2aWNlXG4gICkge1xuICAgIHRoaXMuYnJlYWRjcnVtYnMgPSBicmVhZGNydW1ic1xuICAgIHRoaXMuaG9tZSQgPSBjb25jYXQoXG4gICAgICBvZih7IG1lbnVJdGVtOiB7IGljb246IFByaW1lSWNvbnMuSE9NRSwgcm91dGVyTGluazogJy8nIH0gfSksXG4gICAgICB0aGlzLmFwcFN0YXRlU2VydmljZS5jdXJyZW50UG9ydGFsJC5waXBlKFxuICAgICAgICBtYXAoKHBvcnRhbCkgPT4gKHtcbiAgICAgICAgICBtZW51SXRlbToge1xuICAgICAgICAgICAgaWNvbjogUHJpbWVJY29ucy5IT01FLFxuICAgICAgICAgICAgcm91dGVyTGluazogcG9ydGFsLmJhc2VVcmwsXG4gICAgICAgICAgfSxcbiAgICAgICAgICBwYWdlOiBwb3J0YWwucG9ydGFsTmFtZSxcbiAgICAgICAgfSkpXG4gICAgICApXG4gICAgKVxuICB9XG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcbiAgICBpZiAoY2hhbmdlc1snYWN0aW9ucyddKSB7XG4gICAgICB0aGlzLmdlbmVyYXRlSW5saW5lQWN0aW9ucygpXG4gICAgICB0aGlzLmdlbmVyYXRlT3ZlcmZsb3dBY3Rpb25zKClcbiAgICB9XG4gIH1cblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMubWFudWFsQnJlYWRjcnVtYnMpIHtcbiAgICAgIHRoaXMuYnJlYWRjcnVtYnMkID0gdGhpcy5icmVhZGNydW1icy5nZW5lcmF0ZWRJdGVtc1NvdXJjZVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmJyZWFkY3J1bWJzJCA9IHRoaXMuYnJlYWRjcnVtYnMuaXRlbXNIYW5kbGVyXG4gICAgfVxuICAgIHRoaXMuZ2VuZXJhdGVJbmxpbmVBY3Rpb25zKClcbiAgICB0aGlzLmdlbmVyYXRlT3ZlcmZsb3dBY3Rpb25zKClcbiAgfVxuXG4gIG9uQWN0aW9uKGFjdGlvbjogc3RyaW5nKSB7XG4gICAgc3dpdGNoIChhY3Rpb24pIHtcbiAgICAgIGNhc2UgJ3NhdmUnOlxuICAgICAgICB0aGlzLnNhdmUuZW1pdCgpXG4gICAgICAgIGJyZWFrXG4gICAgICBkZWZhdWx0OlxuICAgICAgICBicmVha1xuICAgIH1cbiAgfVxuXG4gIGhhbmRsZUltYWdlRXJyb3IoKSB7XG4gICAgdGhpcy5maWd1cmVJbWFnZUxvYWRFcnJvciA9IHRydWVcbiAgfVxuXG4gIHB1YmxpYyBnZW5lcmF0ZUl0ZW1TdHlsZShpdGVtOiBPYmplY3REZXRhaWxJdGVtKTogc3RyaW5nIHtcbiAgICBsZXQgc3R5bGUgPSAnJ1xuICAgIGlmIChpdGVtLmljb24pIHN0eWxlID0gc3R5bGUuY29uY2F0KHN0eWxlLCAnICcsICdnYXAtMSBhbGlnbi1pdGVtcy1jZW50ZXInKVxuICAgIGlmIChpdGVtLnZhbHVlQ3NzQ2xhc3MpIHN0eWxlID0gc3R5bGUuY29uY2F0KHN0eWxlLCAnICcsIGl0ZW0udmFsdWVDc3NDbGFzcylcbiAgICByZXR1cm4gc3R5bGVcbiAgfVxuXG4gIC8qKlxuICAgKiBHZW5lcmF0ZXMgYSBsaXN0IG9mIGFjdGlvbnMgdGhhdCBzaG91bGQgYmUgcmVuZGVyZWQgaW4gYW4gb3ZlcmZsb3cgbWVudVxuICAgKi9cbiAgcHJpdmF0ZSBnZW5lcmF0ZU92ZXJmbG93QWN0aW9ucygpIHtcbiAgICBpZiAodGhpcy5hY3Rpb25zKSB7XG4gICAgICBjb25zdCB0cmFuc2xhdGlvbktleXM6IHN0cmluZ1tdID0gW1xuICAgICAgICAuLi50aGlzLmFjdGlvbnMubWFwKChhKSA9PiBhLmxhYmVsS2V5IHx8ICcnKS5maWx0ZXIoKGEpID0+ICEhYSksXG4gICAgICAgIC4uLnRoaXMuYWN0aW9ucy5tYXAoKGEpID0+IGEudGl0bGVLZXkgfHwgJycpLmZpbHRlcigoYSkgPT4gISFhKSxcbiAgICAgIF1cbiAgICAgIGNvbnN0IHRyYW5zbGF0aW9ucyQgPSB0cmFuc2xhdGlvbktleXMubGVuZ3RoID8gdGhpcy50cmFuc2xhdGVTZXJ2aWNlLmdldCh0cmFuc2xhdGlvbktleXMpIDogb2YoW10pXG4gICAgICB0cmFuc2xhdGlvbnMkLnN1YnNjcmliZSgodHJhbnNsYXRpb25zKSA9PiB7XG4gICAgICAgIGNvbnN0IGFsbG93ZWRBY3Rpb25zOiBBY3Rpb25bXSA9IFtdXG4gICAgICAgIGlmICh0aGlzLmFjdGlvbnMpIHtcbiAgICAgICAgICB0aGlzLmFjdGlvbnNcbiAgICAgICAgICAgIC5maWx0ZXIoKGEpID0+IGEuc2hvdyA9PT0gJ2FzT3ZlcmZsb3cnKVxuICAgICAgICAgICAgLmZpbHRlcigoYSkgPT4ge1xuICAgICAgICAgICAgICBpZiAoYS5jb25kaXRpb25hbCkge1xuICAgICAgICAgICAgICAgIGlmIChhLnNob3dDb25kaXRpb24pIHJldHVybiBhXG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGxcbiAgICAgICAgICAgICAgfSBlbHNlIHJldHVybiBhXG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgLmZvckVhY2goKGFjdGlvbikgPT4ge1xuICAgICAgICAgICAgICB0aGlzLmNoZWNrQWN0aW9uUGVybWlzc2lvbihhbGxvd2VkQWN0aW9ucywgYWN0aW9uKVxuICAgICAgICAgICAgfSlcbiAgICAgICAgICB0aGlzLm92ZXJmbG93QWN0aW9ucyA9IFtcbiAgICAgICAgICAgIC4uLmFsbG93ZWRBY3Rpb25zLm1hcDxNZW51SXRlbT4oKGEpID0+ICh7XG4gICAgICAgICAgICAgIGxhYmVsOiBhLmxhYmVsS2V5ID8gdHJhbnNsYXRpb25zW2EubGFiZWxLZXldIDogYS5sYWJlbCxcbiAgICAgICAgICAgICAgaWNvbjogYS5pY29uLFxuICAgICAgICAgICAgICB0aXRsZTpcbiAgICAgICAgICAgICAgICAoYS50aXRsZUtleSA/IHRyYW5zbGF0aW9uc1thLnRpdGxlS2V5XSA6IGEudGl0bGUpIHx8IChhLmxhYmVsS2V5ID8gdHJhbnNsYXRpb25zW2EubGFiZWxLZXldIDogYS5sYWJlbCksXG4gICAgICAgICAgICAgIGNvbW1hbmQ6IGEuYWN0aW9uQ2FsbGJhY2ssXG4gICAgICAgICAgICAgIGRpc2FibGVkOiBhLmRpc2FibGVkLFxuICAgICAgICAgICAgfSkpLFxuICAgICAgICAgIF1cbiAgICAgICAgfVxuICAgICAgfSlcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogR2VuZXJhdGVzIGEgbGlzdCBvZiBhY3Rpb25zIHRoYXQgc2hvdWxkIGJlIHJlbmRlcmVkIGFzIGlubGluZSBidXR0b25zXG4gICAqL1xuICBwcml2YXRlIGdlbmVyYXRlSW5saW5lQWN0aW9ucygpIHtcbiAgICBpZiAodGhpcy5hY3Rpb25zKSB7XG4gICAgICAvLyBUZW1wIGFycmF5IHRvIGhvbGQgYWxsIGlubGluZSBhY3Rpb25zIHRoYXQgc2hvdWxkIGJlIHZpc2libGUgdG8gdGhlIGN1cnJlbnQgdXNlclxuICAgICAgY29uc3QgYWxsb3dlZEFjdGlvbnM6IEFjdGlvbltdID0gW11cbiAgICAgIC8vIENoZWNrIHBlcm1pc3Npb25zIGZvciBhbGwgYWN0aW9ucyB0aGF0IHNob3VsZCBiZSByZW5kZXJlZCAnYWx3YXlzJ1xuICAgICAgdGhpcy5hY3Rpb25zXG4gICAgICAgIC5maWx0ZXIoKGEpID0+IGEuc2hvdyA9PT0gJ2Fsd2F5cycpXG4gICAgICAgIC5maWx0ZXIoKGEpID0+IHtcbiAgICAgICAgICBpZiAoYS5jb25kaXRpb25hbCkge1xuICAgICAgICAgICAgcmV0dXJuIGEuc2hvd0NvbmRpdGlvbiA/IGEgOiBudWxsXG4gICAgICAgICAgfSBlbHNlIHJldHVybiBhXG4gICAgICAgIH0pXG4gICAgICAgIC5mb3JFYWNoKChhY3Rpb24pID0+IHtcbiAgICAgICAgICB0aGlzLmNoZWNrQWN0aW9uUGVybWlzc2lvbihhbGxvd2VkQWN0aW9ucywgYWN0aW9uKVxuICAgICAgICB9KVxuICAgICAgdGhpcy5pbmxpbmVBY3Rpb25zID0gWy4uLmFsbG93ZWRBY3Rpb25zXVxuICAgIH1cbiAgfVxuICAvKipcbiAgICogQWRkcyBhIGdpdmVuIGFjdGlvbiB0byBhIGdpdmVuIGFycmF5IGlmIHRoZSBjdXJyZW50IHVzZXIgaXMgYWxsb3dlZCB0byBzZWUgaXRcbiAgICogQHBhcmFtIGFsbG93ZWRBY3Rpb25zIEFycmF5IHRoYXQgdGhlIGFjdGlvbiBzaG91bGQgYmUgYWRkZWQgdG8gaWYgdGhlIGN1cnJlbnQgdXNlciBpcyBhbGxvd2VkIHRvIHNlZSBpdFxuICAgKiBAcGFyYW0gYWN0aW9uIEFjdGlvbiBmb3Igd2hpY2ggYSBwZXJtaXNzaW9uIGNoZWNrIHNob3VsZCBiZSBleGVjdXRlZFxuICAgKi9cbiAgcHJpdmF0ZSBjaGVja0FjdGlvblBlcm1pc3Npb24oYWxsb3dlZEFjdGlvbnM6IEFjdGlvbltdLCBhY3Rpb246IEFjdGlvbikge1xuICAgIGlmIChhY3Rpb24ucGVybWlzc2lvbikge1xuICAgICAgaWYgKHRoaXMudXNlclNlcnZpY2UuaGFzUGVybWlzc2lvbihhY3Rpb24ucGVybWlzc2lvbikpIHtcbiAgICAgICAgLy8gUHVzaCBhY3Rpb24gdG8gYWxsb3dlZCBhcnJheSBpZiB1c2VyIGhhcyBzdWZmaWNpZW50IHBlcm1pc3Npb25zXG4gICAgICAgIGFsbG93ZWRBY3Rpb25zLnB1c2goYWN0aW9uKVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAvLyBQdXNoIGFjdGlvbiB0byBhbGxvd2VkIGFycmF5IGlmIG5vIHBlcm1pc3Npb24gd2FzIHNwZWNpZmllZFxuICAgICAgYWxsb3dlZEFjdGlvbnMucHVzaChhY3Rpb24pXG4gICAgfVxuICB9XG59XG4iLCI8ZGl2IGNsYXNzPVwib25lY3gtcGFnZS1oZWFkZXJcIiBuYW1lPVwib2N4LXBhZ2UtaGVhZGVyLXdyYXBwZXJcIj5cbiAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInNob3dCcmVhZGNydW1ic1wiPlxuICAgIDxwLWJyZWFkY3J1bWJcbiAgICAgIFttb2RlbF09XCJpdGVtc1wiXG4gICAgICAqbmdJZj1cImJyZWFkY3J1bWJzJCB8IGFzeW5jICBhcyBpdGVtc1wiXG4gICAgICBbaG9tZV09XCIoaG9tZSQgfCBhc3luYyk/Lm1lbnVJdGVtID8/IHt9XCJcbiAgICAgIFtob21lQXJpYUxhYmVsXT1cIihob21lJCB8IGFzeW5jKT8ucGFnZSA/ICgnT0NYX1BBR0VfSEVBREVSLkhPTUVfQVJJQV9MQUJFTCcgfCB0cmFuc2xhdGU6IHsgcGFnZTogKGhvbWUkIHwgYXN5bmMpPy5wYWdlfSkgOiAoJ09DWF9QQUdFX0hFQURFUi5IT01FX0RFRkFVTFRfQVJJQV9MQUJFTCcgfCB0cmFuc2xhdGUpXCJcbiAgICAgIFthdHRyLm1hbnVhbF09XCJtYW51YWxCcmVhZGNydW1ic1wiXG4gICAgPjwvcC1icmVhZGNydW1iPlxuICA8L25nLWNvbnRhaW5lcj5cbiAgPGRpdiBjbGFzcz1cInRpdGxlLWJhciBmbGV4IGZsZXgtcm93IG1kOmp1c3RpZnktY29udGVudC1iZXR3ZWVuIHAtMiBtZDpwLTNcIj5cbiAgICA8ZGl2IGNsYXNzPVwidGl0bGUtd3JhcFwiPlxuICAgICAgPGRpdiBjbGFzcz1cImZpZ3VyZSBmbGV4IGgtMnJlbSB3LTJyZW0gbWQ6aC0zcmVtIG1kOnctM3JlbVwiICpuZ0lmPVwic2hvd0ZpZ3VyZVwiPlxuICAgICAgICA8ZGl2ICNwcmV2aWV3SW1hZ2UgY2xhc3M9XCJmaWd1cmUtaW1hZ2UgYWJzb2x1dGUgdG9wLTAgbGVmdC0wIHJpZ2h0LTAgYm90dG9tLTBcIj5cbiAgICAgICAgICA8bmctY29udGVudCBzZWxlY3Q9XCJbZmlndXJlSW1hZ2VdXCI+PC9uZy1jb250ZW50PlxuICAgICAgICAgIDxpbWdcbiAgICAgICAgICAgICpuZ0lmPVwiZmlndXJlSW1hZ2UgJiYgIWZpZ3VyZUltYWdlTG9hZEVycm9yXCJcbiAgICAgICAgICAgIFtvY3hTcmNdPVwiZmlndXJlSW1hZ2VcIlxuICAgICAgICAgICAgYWx0PVwiRmlndXJlIGltYWdlXCJcbiAgICAgICAgICAgIGNsYXNzPVwidy1mdWxsXCJcbiAgICAgICAgICAgIChlcnJvcik9XCJoYW5kbGVJbWFnZUVycm9yKClcIlxuICAgICAgICAgIC8+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2XG4gICAgICAgICAgY2xhc3M9XCJjb2xvcmJsb2IgZmxleC0xIGJvcmRlci1yb3VuZFwiXG4gICAgICAgICAgKm5nSWY9XCJwcmV2aWV3SW1hZ2UuY2hpbGRyZW4ubGVuZ3RoID09PSAwIHx8IGZpZ3VyZUltYWdlTG9hZEVycm9yXCJcbiAgICAgICAgPjwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgICA8bmctdGVtcGxhdGUgI3NrZWxldG9uQmFyPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiaGVhZGVyIGp1c3RpZnktY29udGVudC1ldmVubHlcIj5cbiAgICAgICAgICA8cC1za2VsZXRvbiB3aWR0aD1cIjEwcmVtXCI+PC9wLXNrZWxldG9uPlxuICAgICAgICAgIDxwLXNrZWxldG9uIHdpZHRoPVwiMTByZW1cIj48L3Atc2tlbGV0b24+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgIDxkaXYgY2xhc3M9XCJoZWFkZXJcIiAqbmdJZj1cIiFsb2FkaW5nOyBlbHNlIHNrZWxldG9uQmFyXCI+XG4gICAgICAgIDxoMSBpZD1cInBhZ2UtaGVhZGVyXCIgKm5nSWY9XCIhIWhlYWRlclwiPnt7IGhlYWRlciB9fTwvaDE+XG4gICAgICAgIDxoMiBpZD1cInBhZ2Utc3ViaGVhZGVyXCIgKm5nSWY9XCIhIXN1YmhlYWRlclwiPnt7IHN1YmhlYWRlciB9fTwvaDI+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IGNsYXNzPVwiYWN0aW9uLWl0ZW1zLXdyYXAgbXQtMiBtZDptdC0wXCI+XG4gICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiYWRkaXRpb25hbFRvb2xiYXJDb250ZW50TGVmdFwiIFtuZ1RlbXBsYXRlT3V0bGV0XT1cImFkZGl0aW9uYWxUb29sYmFyQ29udGVudExlZnRcIj5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIWRpc2FibGVEZWZhdWx0QWN0aW9uc1wiPiA8L25nLWNvbnRhaW5lcj5cbiAgICAgIDxuZy10ZW1wbGF0ZSAjc2tlbGV0b25BY3Rpb25zPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleFwiPlxuICAgICAgICAgIDxwLXNrZWxldG9uIHdpZHRoPVwiNXJlbVwiIGhlaWdodD1cIjJyZW1cIiBzdHlsZUNsYXNzPVwibXItMlwiPjwvcC1za2VsZXRvbj5cbiAgICAgICAgICA8cC1za2VsZXRvbiB3aWR0aD1cIjJyZW1cIiBoZWlnaHQ9XCIycmVtXCIgc3R5bGVDbGFzcz1cIm1iLTJcIj48L3Atc2tlbGV0b24+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhbG9hZGluZzsgZWxzZSBza2VsZXRvbkFjdGlvbnNcIj5cbiAgICAgICAgPGRpdiAqbmdJZj1cImlubGluZUFjdGlvbnMgJiYgaW5saW5lQWN0aW9ucy5sZW5ndGggPiAwXCIgY2xhc3M9XCJ0b29sYmFyIGZsZXggZmxleC13cmFwIGdhcC0xIHNtOmdhcC0yXCI+XG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgYWN0aW9uIG9mIGlubGluZUFjdGlvbnNcIj5cbiAgICAgICAgICAgIDxwLWJ1dHRvblxuICAgICAgICAgICAgICBpZD1cInt7IGFjdGlvbi5pZCB9fVwiXG4gICAgICAgICAgICAgIFtpY29uXT1cImFjdGlvbi5pY29uID8/ICcnXCJcbiAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgIGNsYXNzPVwiYWN0aW9uLWJ1dHRvblwiXG4gICAgICAgICAgICAgIFtsYWJlbF09XCJhY3Rpb24ubGFiZWxLZXkgPyAoYWN0aW9uLmxhYmVsS2V5IHwgdHJhbnNsYXRlKSA6IGFjdGlvbi5sYWJlbFwiXG4gICAgICAgICAgICAgIChvbkNsaWNrKT1cImFjdGlvbi5hY3Rpb25DYWxsYmFjaygpXCJcbiAgICAgICAgICAgICAgW3RpdGxlXT1cIihhY3Rpb24udGl0bGVLZXkgPyAoYWN0aW9uLnRpdGxlS2V5IHwgdHJhbnNsYXRlKSA6IGFjdGlvbi50aXRsZSkgfHwgKGFjdGlvbi5sYWJlbEtleSA/IChhY3Rpb24ubGFiZWxLZXkgfCB0cmFuc2xhdGUpIDogYWN0aW9uLmxhYmVsKVwiXG4gICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJhY3Rpb24uZGlzYWJsZWQgPyBhY3Rpb24uZGlzYWJsZWQgOiBmYWxzZVwiXG4gICAgICAgICAgICAgIFthdHRyLm5hbWVdPVwiYWN0aW9uLmljb24gPyAnb2N4LXBhZ2UtaGVhZGVyLWlubGluZS1hY3Rpb24taWNvbi1idXR0b24nIDogJ29jeC1wYWdlLWhlYWRlci1pbmxpbmUtYWN0aW9uLWJ1dHRvbidcIlxuICAgICAgICAgICAgICBbYXJpYUxhYmVsXT1cIihhY3Rpb24udGl0bGVLZXkgPyAoYWN0aW9uLnRpdGxlS2V5IHwgdHJhbnNsYXRlKSA6IGFjdGlvbi50aXRsZSkgfHwgKGFjdGlvbi5sYWJlbEtleSA/IChhY3Rpb24ubGFiZWxLZXkgfCB0cmFuc2xhdGUpIDogYWN0aW9uLmxhYmVsKVwiXG4gICAgICAgICAgICA+PC9wLWJ1dHRvbj5cbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxuZy1jb250ZW50IHNlbGVjdD1cIlt0b29sYmFySXRlbXNdXCI+PC9uZy1jb250ZW50PlxuICAgICAgICA8bmctY29udGFpbmVyPlxuICAgICAgICAgIDxkaXYgKm5nSWY9XCJvdmVyZmxvd0FjdGlvbnMubGVuZ3RoICE9PSAwXCI+XG4gICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgIGlkPVwicGFnZUhlYWRlck1lbnVCdXR0b25cIlxuICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgcEJ1dHRvblxuICAgICAgICAgICAgICBpY29uPVwicGkgcGktZWxsaXBzaXMtdlwiXG4gICAgICAgICAgICAgIHRpdGxlPVwie3sgJ09DWF9QQUdFX0hFQURFUi5NT1JFX0FDVElPTlMnIHwgdHJhbnNsYXRlIH19XCJcbiAgICAgICAgICAgICAgY2xhc3M9XCJtb3JlLWFjdGlvbnMtbWVudS1idXR0b24gYWN0aW9uLWJ1dHRvbiBtbC0yXCJcbiAgICAgICAgICAgICAgKGNsaWNrKT1cIm1lbnUudG9nZ2xlKCRldmVudClcIlxuICAgICAgICAgICAgICBuYW1lPVwib2N4LXBhZ2UtaGVhZGVyLW92ZXJmbG93LWFjdGlvbi1idXR0b25cIlxuICAgICAgICAgICAgICBbYXJpYUxhYmVsXT1cIignT0NYX1BBR0VfSEVBREVSLk1PUkVfQUNUSU9OUycgfCB0cmFuc2xhdGUpXCJcbiAgICAgICAgICAgID48L2J1dHRvbj5cbiAgICAgICAgICAgIDxwLW1lbnUgI21lbnUgW3BvcHVwXT1cInRydWVcIiBbbW9kZWxdPVwib3ZlcmZsb3dBY3Rpb25zXCIgYXBwZW5kVG89XCJib2R5XCI+PC9wLW1lbnU+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiYWRkaXRpb25hbFRvb2xiYXJDb250ZW50XCIgW25nVGVtcGxhdGVPdXRsZXRdPVwiYWRkaXRpb25hbFRvb2xiYXJDb250ZW50XCI+IDwvbmctY29udGFpbmVyPlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cblxuICA8ZGl2XG4gICAgY2xhc3M9XCJvYmplY3QtcGFuZWwgZmxleC1jb2x1bW4gbWQ6ZmxleC1yb3dcIlxuICAgIFtjbGFzcy5qdXN0aWZ5LWNvbnRlbnQtZXZlbmx5XT1cIm9iamVjdERldGFpbHNcIlxuICAgIFtjbGFzcy5qdXN0aWZ5LWNvbnRlbnQtc3RhcnRdPVwiIW9iamVjdERldGFpbHNcIlxuICA+XG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIm9iamVjdERldGFpbHNcIj5cbiAgICAgIDxkaXZcbiAgICAgICAgY2xhc3M9XCJvYmplY3QtaW5mbyBmbGV4IGZsZXgtcm93IG1kOmZsZXgtY29sdW1uIGFsaWduLWl0ZW1zLWJhc2VsaW5lIG1kOmFsaWduLWl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNvbnRlbnQtYmV0d2VlblwiXG4gICAgICAgICpuZ0Zvcj1cImxldCBpdGVtIG9mIG9iamVjdERldGFpbHNcIlxuICAgICAgPlxuICAgICAgICA8bGFiZWwgY2xhc3M9XCJmbGV4IGZvbnQtbWVkaXVtIHRleHQtNjAwXCIgbmFtZT1cIm9iamVjdC1kZXRhaWwtbGFiZWxcIlxuICAgICAgICAgID57eyBpdGVtLmxhYmVsIHwgZHluYW1pY1BpcGU6aXRlbS5sYWJlbFBpcGUgfX08L2xhYmVsXG4gICAgICAgID5cbiAgICAgICAgPHNwYW5cbiAgICAgICAgICAqbmdJZj1cIml0ZW0uaWNvbiB8fCBpdGVtLnZhbHVlXCJcbiAgICAgICAgICBjbGFzcz1cImZsZXggdGV4dC05MDAgbXQtMlwiXG4gICAgICAgICAgW25nQ2xhc3NdPVwiZ2VuZXJhdGVJdGVtU3R5bGUoaXRlbSlcIlxuICAgICAgICAgIFt0aXRsZV09XCJpdGVtLnRvb2x0aXAgfHwgJydcIlxuICAgICAgICAgIG5hbWU9XCJvYmplY3QtZGV0YWlsLXZhbHVlXCJcbiAgICAgICAgPlxuICAgICAgICAgIDxpICpuZ0lmPVwiaXRlbS5pY29uXCIgY2xhc3M9XCJ7e2l0ZW0uaWNvbn19XCIgbmFtZT1cIm9iamVjdC1kZXRhaWwtaWNvblwiPjwvaT5cbiAgICAgICAgICB7eyBpdGVtLnZhbHVlIHwgZHluYW1pY1BpcGU6aXRlbS52YWx1ZVBpcGU6aXRlbS52YWx1ZVBpcGVBcmdzfX08L3NwYW5cbiAgICAgICAgPlxuICAgICAgPC9kaXY+XG4gICAgPC9uZy1jb250YWluZXI+XG4gICAgPG5nLWNvbnRlbnQ+PC9uZy1jb250ZW50PlxuICA8L2Rpdj5cbjwvZGl2PlxuIl19
@@ -375,6 +375,7 @@ class PageHeaderComponent {
375
375
  this.save = new EventEmitter();
376
376
  this.overflowActions = [];
377
377
  this.dd = new Date();
378
+ this.figureImageLoadError = false;
378
379
  this.breadcrumbs = breadcrumbs;
379
380
  this.home$ = concat(of({ menuItem: { icon: PrimeIcons.HOME, routerLink: '/' } }), this.appStateService.currentPortal$.pipe(map((portal) => ({
380
381
  menuItem: {
@@ -409,6 +410,9 @@ class PageHeaderComponent {
409
410
  break;
410
411
  }
411
412
  }
413
+ handleImageError() {
414
+ this.figureImageLoadError = true;
415
+ }
412
416
  generateItemStyle(item) {
413
417
  let style = '';
414
418
  if (item.icon)
@@ -499,10 +503,10 @@ class PageHeaderComponent {
499
503
  }
500
504
  }
501
505
  PageHeaderComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: PageHeaderComponent, deps: [{ token: BreadcrumbService }, { token: i1$1.TranslateService }, { token: i3.AppStateService }, { token: i3.UserService }], target: i0.ɵɵFactoryTarget.Component });
502
- PageHeaderComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.10", type: PageHeaderComponent, selector: "ocx-page-header", inputs: { header: "header", loading: "loading", figureBackground: "figureBackground", showFigure: "showFigure", figureImage: "figureImage", disableDefaultActions: "disableDefaultActions", subheader: "subheader", actions: "actions", objectDetails: "objectDetails", showBreadcrumbs: "showBreadcrumbs", manualBreadcrumbs: "manualBreadcrumbs" }, outputs: { save: "save" }, queries: [{ propertyName: "additionalToolbarContent", first: true, predicate: ["additionalToolbarContent"], descendants: true }, { propertyName: "additionalToolbarContentLeft", first: true, predicate: ["additionalToolbarContentLeft"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<div class=\"onecx-page-header\" name=\"ocx-page-header-wrapper\">\n <ng-container *ngIf=\"showBreadcrumbs\">\n <p-breadcrumb\n [model]=\"items\"\n *ngIf=\"breadcrumbs$ | async as items\"\n [home]=\"(home$ | async)?.menuItem ?? {}\"\n [homeAriaLabel]=\"(home$ | async)?.page ? ('OCX_PAGE_HEADER.HOME_ARIA_LABEL' | translate: { page: (home$ | async)?.page}) : ('OCX_PAGE_HEADER.HOME_DEFAULT_ARIA_LABEL' | translate)\"\n [attr.manual]=\"manualBreadcrumbs\"\n ></p-breadcrumb>\n </ng-container>\n <div class=\"title-bar flex flex-row md:justify-content-between p-2 md:p-3\">\n <div class=\"title-wrap\">\n <div class=\"figure flex h-2rem w-2rem md:h-3rem md:w-3rem\" *ngIf=\"showFigure\">\n <div #previewImage class=\"figure-image absolute top-0 left-0 right-0 bottom-0\">\n <ng-content select=\"[figureImage]\"></ng-content>\n <img *ngIf=\"figureImage\" [ocxSrc]=\"figureImage\" alt=\"Figure image\" class=\"w-full\" />\n </div>\n <div class=\"colorblob flex-1 border-round\" *ngIf=\"previewImage.children.length === 0\"></div>\n </div>\n <ng-template #skeletonBar>\n <div class=\"header justify-content-evenly\">\n <p-skeleton width=\"10rem\"></p-skeleton>\n <p-skeleton width=\"10rem\"></p-skeleton>\n </div>\n </ng-template>\n <div class=\"header\" *ngIf=\"!loading; else skeletonBar\">\n <h1 id=\"page-header\" *ngIf=\"!!header\">{{ header }}</h1>\n <h2 id='page-subheader' *ngIf=\"!!subheader\">{{ subheader }}</h2>\n </div>\n </div>\n <div class=\"action-items-wrap mt-2 md:mt-0\">\n <ng-container *ngIf=\"additionalToolbarContentLeft\" [ngTemplateOutlet]=\"additionalToolbarContentLeft\"> </ng-container>\n\n <ng-container *ngIf=\"!disableDefaultActions\"> </ng-container>\n <ng-template #skeletonActions>\n <div class=\"flex\">\n <p-skeleton width=\"5rem\" height=\"2rem\" styleClass=\"mr-2\"></p-skeleton>\n <p-skeleton width=\"2rem\" height=\"2rem\" styleClass=\"mb-2\"></p-skeleton>\n </div>\n </ng-template>\n <ng-container *ngIf=\"!loading; else skeletonActions\">\n <div *ngIf=\"inlineActions && inlineActions.length > 0\" class=\"toolbar flex flex-wrap gap-1 sm:gap-2\">\n <ng-container *ngFor=\"let action of inlineActions\">\n <p-button\n id=\"{{ action.id }}\"\n [icon]=\"action.icon ?? ''\"\n type=\"button\"\n class=\"action-button\"\n [label]=\"action.labelKey ? (action.labelKey | translate) : action.label\"\n (onClick)=\"action.actionCallback()\"\n [title]=\"(action.titleKey ? (action.titleKey | translate) : action.title) || (action.labelKey ? (action.labelKey | translate) : action.label)\"\n [disabled]=\"action.disabled ? action.disabled : false\"\n [attr.name]=\"action.icon ? 'ocx-page-header-inline-action-icon-button' : 'ocx-page-header-inline-action-button'\"\n [ariaLabel]=\"(action.titleKey ? (action.titleKey | translate) : action.title) || (action.labelKey ? (action.labelKey | translate) : action.label)\"\n ></p-button>\n </ng-container>\n </div>\n <ng-content select=\"[toolbarItems]\"></ng-content>\n <ng-container>\n <div *ngIf=\"overflowActions.length !== 0\">\n <button\n id=\"pageHeaderMenuButton\"\n type=\"button\"\n pButton\n icon=\"pi pi-ellipsis-v\"\n title=\"{{ 'OCX_PAGE_HEADER.MORE_ACTIONS' | translate }}\"\n class=\"more-actions-menu-button action-button ml-2\"\n (click)=\"menu.toggle($event)\"\n name=\"ocx-page-header-overflow-action-button\"\n [ariaLabel]=\"('OCX_PAGE_HEADER.MORE_ACTIONS' | translate)\"\n ></button>\n <p-menu #menu [popup]=\"true\" [model]=\"overflowActions\" appendTo=\"body\"></p-menu>\n </div>\n </ng-container>\n </ng-container>\n <ng-container *ngIf=\"additionalToolbarContent\" [ngTemplateOutlet]=\"additionalToolbarContent\"> </ng-container>\n </div>\n </div>\n\n <div\n class=\"object-panel flex-column md:flex-row\"\n [class.justify-content-evenly]=\"objectDetails\"\n [class.justify-content-start]=\"!objectDetails\"\n >\n <ng-container *ngIf=\"objectDetails\">\n <div\n class=\"object-info flex flex-row md:flex-column align-items-baseline md:align-items-center justify-content-between\"\n *ngFor=\"let item of objectDetails\"\n >\n <label class=\"flex font-medium text-600\" name=\"object-detail-label\">{{ item.label | dynamicPipe:item.labelPipe }}</label>\n <span\n *ngIf=\"item.icon || item.value\"\n class=\"flex text-900 mt-2\"\n [ngClass]=\"generateItemStyle(item)\"\n [title]=\"item.tooltip || ''\"\n name=\"object-detail-value\"\n >\n <i *ngIf=\"item.icon\" class=\"{{item.icon}}\" name=\"object-detail-icon\"></i>\n {{ item.value | dynamicPipe:item.valuePipe:item.valuePipeArgs}}</span\n >\n </div>\n </ng-container>\n <ng-content></ng-content>\n </div>\n</div>\n", styles: [":host(.p-button-label){font-weight:400}:host ::ng-deep .action-button{padding:.5rem;font-weight:400}.onecx-page-header{display:flex;flex-flow:column;border-radius:.25rem;overflow:hidden;background:#fff;box-shadow:0 2px 2px #0000001a;border:1px solid #cdd0d3}.onecx-page-header .title-bar{display:flex;flex-wrap:wrap;justify-content:space-between;align-items:center;gap:.5rem;background-color:#f8f9fa;border-top-right-radius:inherit;border-top-left-radius:inherit}.onecx-page-header .title-bar .figure{width:3rem;height:3rem;margin-right:.5rem;position:relative}.onecx-page-header .title-bar .figure .figure-image img{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%)}.onecx-page-header .title-bar .figure .colorblob{background-color:var(--primary-color);position:absolute;inset:0}.onecx-page-header .title-bar .title-wrap{display:flex;flex-flow:row;align-items:center;gap:.25rem}.onecx-page-header .title-bar .title-wrap .header{display:flex;align-items:flex-start;justify-content:center;flex-direction:column}.onecx-page-header .title-bar .title-wrap h1{font-size:1em;font-weight:700;margin:0;padding:0}.onecx-page-header .title-bar .title-wrap h2{font-size:1em;font-weight:400;margin:0;padding:0}.onecx-page-header .title-bar .action-items-wrap{display:flex;height:-moz-fit-content;height:fit-content;gap:.5rem;align-items:center;justify-content:space-between}.onecx-page-header .title-bar .action-items-wrap button{padding:.5rem}.onecx-page-header .object-panel{border-top:1px solid #cdd0d3;padding:1rem;display:flex}.onecx-page-header .object-panel:empty{display:none}.badge-container{display:flex;align-items:center;justify-content:center;width:100%;height:100%}.scale{transform:scale(2)}\n"], dependencies: [{ kind: "directive", type: i3$1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i3$1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i3$1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i3$1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: i5.Breadcrumb, selector: "p-breadcrumb", inputs: ["model", "style", "styleClass", "home", "homeAriaLabel"], outputs: ["onItemClick"] }, { kind: "directive", type: i6.ButtonDirective, selector: "[pButton]", inputs: ["iconPos", "loadingIcon", "label", "icon", "loading"] }, { kind: "component", type: i6.Button, selector: "p-button", inputs: ["type", "iconPos", "icon", "badge", "label", "disabled", "loading", "loadingIcon", "style", "styleClass", "badgeClass", "ariaLabel"], outputs: ["onClick", "onFocus", "onBlur"] }, { kind: "component", type: i7.Menu, selector: "p-menu", inputs: ["model", "popup", "style", "styleClass", "appendTo", "autoZIndex", "baseZIndex", "showTransitionOptions", "hideTransitionOptions"], outputs: ["onShow", "onHide"] }, { kind: "component", type: i8.Skeleton, selector: "p-skeleton", inputs: ["styleClass", "style", "shape", "animation", "borderRadius", "size", "width", "height"] }, { kind: "directive", type: SrcDirective, selector: "[ocxSrc]", inputs: ["ocxSrc"] }, { kind: "pipe", type: i3$1.AsyncPipe, name: "async" }, { kind: "pipe", type: i1$1.TranslatePipe, name: "translate" }, { kind: "pipe", type: DynamicPipe, name: "dynamicPipe" }], encapsulation: i0.ViewEncapsulation.None });
506
+ PageHeaderComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.10", type: PageHeaderComponent, selector: "ocx-page-header", inputs: { header: "header", loading: "loading", figureBackground: "figureBackground", showFigure: "showFigure", figureImage: "figureImage", disableDefaultActions: "disableDefaultActions", subheader: "subheader", actions: "actions", objectDetails: "objectDetails", showBreadcrumbs: "showBreadcrumbs", manualBreadcrumbs: "manualBreadcrumbs" }, outputs: { save: "save" }, queries: [{ propertyName: "additionalToolbarContent", first: true, predicate: ["additionalToolbarContent"], descendants: true }, { propertyName: "additionalToolbarContentLeft", first: true, predicate: ["additionalToolbarContentLeft"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<div class=\"onecx-page-header\" name=\"ocx-page-header-wrapper\">\n <ng-container *ngIf=\"showBreadcrumbs\">\n <p-breadcrumb\n [model]=\"items\"\n *ngIf=\"breadcrumbs$ | async as items\"\n [home]=\"(home$ | async)?.menuItem ?? {}\"\n [homeAriaLabel]=\"(home$ | async)?.page ? ('OCX_PAGE_HEADER.HOME_ARIA_LABEL' | translate: { page: (home$ | async)?.page}) : ('OCX_PAGE_HEADER.HOME_DEFAULT_ARIA_LABEL' | translate)\"\n [attr.manual]=\"manualBreadcrumbs\"\n ></p-breadcrumb>\n </ng-container>\n <div class=\"title-bar flex flex-row md:justify-content-between p-2 md:p-3\">\n <div class=\"title-wrap\">\n <div class=\"figure flex h-2rem w-2rem md:h-3rem md:w-3rem\" *ngIf=\"showFigure\">\n <div #previewImage class=\"figure-image absolute top-0 left-0 right-0 bottom-0\">\n <ng-content select=\"[figureImage]\"></ng-content>\n <img\n *ngIf=\"figureImage && !figureImageLoadError\"\n [ocxSrc]=\"figureImage\"\n alt=\"Figure image\"\n class=\"w-full\"\n (error)=\"handleImageError()\"\n />\n </div>\n <div\n class=\"colorblob flex-1 border-round\"\n *ngIf=\"previewImage.children.length === 0 || figureImageLoadError\"\n ></div>\n </div>\n <ng-template #skeletonBar>\n <div class=\"header justify-content-evenly\">\n <p-skeleton width=\"10rem\"></p-skeleton>\n <p-skeleton width=\"10rem\"></p-skeleton>\n </div>\n </ng-template>\n <div class=\"header\" *ngIf=\"!loading; else skeletonBar\">\n <h1 id=\"page-header\" *ngIf=\"!!header\">{{ header }}</h1>\n <h2 id=\"page-subheader\" *ngIf=\"!!subheader\">{{ subheader }}</h2>\n </div>\n </div>\n <div class=\"action-items-wrap mt-2 md:mt-0\">\n <ng-container *ngIf=\"additionalToolbarContentLeft\" [ngTemplateOutlet]=\"additionalToolbarContentLeft\">\n </ng-container>\n\n <ng-container *ngIf=\"!disableDefaultActions\"> </ng-container>\n <ng-template #skeletonActions>\n <div class=\"flex\">\n <p-skeleton width=\"5rem\" height=\"2rem\" styleClass=\"mr-2\"></p-skeleton>\n <p-skeleton width=\"2rem\" height=\"2rem\" styleClass=\"mb-2\"></p-skeleton>\n </div>\n </ng-template>\n <ng-container *ngIf=\"!loading; else skeletonActions\">\n <div *ngIf=\"inlineActions && inlineActions.length > 0\" class=\"toolbar flex flex-wrap gap-1 sm:gap-2\">\n <ng-container *ngFor=\"let action of inlineActions\">\n <p-button\n id=\"{{ action.id }}\"\n [icon]=\"action.icon ?? ''\"\n type=\"button\"\n class=\"action-button\"\n [label]=\"action.labelKey ? (action.labelKey | translate) : action.label\"\n (onClick)=\"action.actionCallback()\"\n [title]=\"(action.titleKey ? (action.titleKey | translate) : action.title) || (action.labelKey ? (action.labelKey | translate) : action.label)\"\n [disabled]=\"action.disabled ? action.disabled : false\"\n [attr.name]=\"action.icon ? 'ocx-page-header-inline-action-icon-button' : 'ocx-page-header-inline-action-button'\"\n [ariaLabel]=\"(action.titleKey ? (action.titleKey | translate) : action.title) || (action.labelKey ? (action.labelKey | translate) : action.label)\"\n ></p-button>\n </ng-container>\n </div>\n <ng-content select=\"[toolbarItems]\"></ng-content>\n <ng-container>\n <div *ngIf=\"overflowActions.length !== 0\">\n <button\n id=\"pageHeaderMenuButton\"\n type=\"button\"\n pButton\n icon=\"pi pi-ellipsis-v\"\n title=\"{{ 'OCX_PAGE_HEADER.MORE_ACTIONS' | translate }}\"\n class=\"more-actions-menu-button action-button ml-2\"\n (click)=\"menu.toggle($event)\"\n name=\"ocx-page-header-overflow-action-button\"\n [ariaLabel]=\"('OCX_PAGE_HEADER.MORE_ACTIONS' | translate)\"\n ></button>\n <p-menu #menu [popup]=\"true\" [model]=\"overflowActions\" appendTo=\"body\"></p-menu>\n </div>\n </ng-container>\n </ng-container>\n <ng-container *ngIf=\"additionalToolbarContent\" [ngTemplateOutlet]=\"additionalToolbarContent\"> </ng-container>\n </div>\n </div>\n\n <div\n class=\"object-panel flex-column md:flex-row\"\n [class.justify-content-evenly]=\"objectDetails\"\n [class.justify-content-start]=\"!objectDetails\"\n >\n <ng-container *ngIf=\"objectDetails\">\n <div\n class=\"object-info flex flex-row md:flex-column align-items-baseline md:align-items-center justify-content-between\"\n *ngFor=\"let item of objectDetails\"\n >\n <label class=\"flex font-medium text-600\" name=\"object-detail-label\"\n >{{ item.label | dynamicPipe:item.labelPipe }}</label\n >\n <span\n *ngIf=\"item.icon || item.value\"\n class=\"flex text-900 mt-2\"\n [ngClass]=\"generateItemStyle(item)\"\n [title]=\"item.tooltip || ''\"\n name=\"object-detail-value\"\n >\n <i *ngIf=\"item.icon\" class=\"{{item.icon}}\" name=\"object-detail-icon\"></i>\n {{ item.value | dynamicPipe:item.valuePipe:item.valuePipeArgs}}</span\n >\n </div>\n </ng-container>\n <ng-content></ng-content>\n </div>\n</div>\n", styles: [":host(.p-button-label){font-weight:400}:host ::ng-deep .action-button{padding:.5rem;font-weight:400}.onecx-page-header{display:flex;flex-flow:column;border-radius:.25rem;overflow:hidden;background:#fff;box-shadow:0 2px 2px #0000001a;border:1px solid #cdd0d3}.onecx-page-header .title-bar{display:flex;flex-wrap:wrap;justify-content:space-between;align-items:center;gap:.5rem;background-color:#f8f9fa;border-top-right-radius:inherit;border-top-left-radius:inherit}.onecx-page-header .title-bar .figure{width:3rem;height:3rem;margin-right:.5rem;position:relative}.onecx-page-header .title-bar .figure .figure-image img{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%)}.onecx-page-header .title-bar .figure .colorblob{background-color:var(--primary-color);position:absolute;inset:0}.onecx-page-header .title-bar .title-wrap{display:flex;flex-flow:row;align-items:center;gap:.25rem}.onecx-page-header .title-bar .title-wrap .header{display:flex;align-items:flex-start;justify-content:center;flex-direction:column}.onecx-page-header .title-bar .title-wrap h1{font-size:1em;font-weight:700;margin:0;padding:0}.onecx-page-header .title-bar .title-wrap h2{font-size:1em;font-weight:400;margin:0;padding:0}.onecx-page-header .title-bar .action-items-wrap{display:flex;height:-moz-fit-content;height:fit-content;gap:.5rem;align-items:center;justify-content:space-between}.onecx-page-header .title-bar .action-items-wrap button{padding:.5rem}.onecx-page-header .object-panel{border-top:1px solid #cdd0d3;padding:1rem;display:flex}.onecx-page-header .object-panel:empty{display:none}.badge-container{display:flex;align-items:center;justify-content:center;width:100%;height:100%}.scale{transform:scale(2)}\n"], dependencies: [{ kind: "directive", type: i3$1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i3$1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i3$1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i3$1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: i5.Breadcrumb, selector: "p-breadcrumb", inputs: ["model", "style", "styleClass", "home", "homeAriaLabel"], outputs: ["onItemClick"] }, { kind: "directive", type: i6.ButtonDirective, selector: "[pButton]", inputs: ["iconPos", "loadingIcon", "label", "icon", "loading"] }, { kind: "component", type: i6.Button, selector: "p-button", inputs: ["type", "iconPos", "icon", "badge", "label", "disabled", "loading", "loadingIcon", "style", "styleClass", "badgeClass", "ariaLabel"], outputs: ["onClick", "onFocus", "onBlur"] }, { kind: "component", type: i7.Menu, selector: "p-menu", inputs: ["model", "popup", "style", "styleClass", "appendTo", "autoZIndex", "baseZIndex", "showTransitionOptions", "hideTransitionOptions"], outputs: ["onShow", "onHide"] }, { kind: "component", type: i8.Skeleton, selector: "p-skeleton", inputs: ["styleClass", "style", "shape", "animation", "borderRadius", "size", "width", "height"] }, { kind: "directive", type: SrcDirective, selector: "[ocxSrc]", inputs: ["ocxSrc"] }, { kind: "pipe", type: i3$1.AsyncPipe, name: "async" }, { kind: "pipe", type: i1$1.TranslatePipe, name: "translate" }, { kind: "pipe", type: DynamicPipe, name: "dynamicPipe" }], encapsulation: i0.ViewEncapsulation.None });
503
507
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: PageHeaderComponent, decorators: [{
504
508
  type: Component,
505
- args: [{ selector: 'ocx-page-header', encapsulation: ViewEncapsulation.None, template: "<div class=\"onecx-page-header\" name=\"ocx-page-header-wrapper\">\n <ng-container *ngIf=\"showBreadcrumbs\">\n <p-breadcrumb\n [model]=\"items\"\n *ngIf=\"breadcrumbs$ | async as items\"\n [home]=\"(home$ | async)?.menuItem ?? {}\"\n [homeAriaLabel]=\"(home$ | async)?.page ? ('OCX_PAGE_HEADER.HOME_ARIA_LABEL' | translate: { page: (home$ | async)?.page}) : ('OCX_PAGE_HEADER.HOME_DEFAULT_ARIA_LABEL' | translate)\"\n [attr.manual]=\"manualBreadcrumbs\"\n ></p-breadcrumb>\n </ng-container>\n <div class=\"title-bar flex flex-row md:justify-content-between p-2 md:p-3\">\n <div class=\"title-wrap\">\n <div class=\"figure flex h-2rem w-2rem md:h-3rem md:w-3rem\" *ngIf=\"showFigure\">\n <div #previewImage class=\"figure-image absolute top-0 left-0 right-0 bottom-0\">\n <ng-content select=\"[figureImage]\"></ng-content>\n <img *ngIf=\"figureImage\" [ocxSrc]=\"figureImage\" alt=\"Figure image\" class=\"w-full\" />\n </div>\n <div class=\"colorblob flex-1 border-round\" *ngIf=\"previewImage.children.length === 0\"></div>\n </div>\n <ng-template #skeletonBar>\n <div class=\"header justify-content-evenly\">\n <p-skeleton width=\"10rem\"></p-skeleton>\n <p-skeleton width=\"10rem\"></p-skeleton>\n </div>\n </ng-template>\n <div class=\"header\" *ngIf=\"!loading; else skeletonBar\">\n <h1 id=\"page-header\" *ngIf=\"!!header\">{{ header }}</h1>\n <h2 id='page-subheader' *ngIf=\"!!subheader\">{{ subheader }}</h2>\n </div>\n </div>\n <div class=\"action-items-wrap mt-2 md:mt-0\">\n <ng-container *ngIf=\"additionalToolbarContentLeft\" [ngTemplateOutlet]=\"additionalToolbarContentLeft\"> </ng-container>\n\n <ng-container *ngIf=\"!disableDefaultActions\"> </ng-container>\n <ng-template #skeletonActions>\n <div class=\"flex\">\n <p-skeleton width=\"5rem\" height=\"2rem\" styleClass=\"mr-2\"></p-skeleton>\n <p-skeleton width=\"2rem\" height=\"2rem\" styleClass=\"mb-2\"></p-skeleton>\n </div>\n </ng-template>\n <ng-container *ngIf=\"!loading; else skeletonActions\">\n <div *ngIf=\"inlineActions && inlineActions.length > 0\" class=\"toolbar flex flex-wrap gap-1 sm:gap-2\">\n <ng-container *ngFor=\"let action of inlineActions\">\n <p-button\n id=\"{{ action.id }}\"\n [icon]=\"action.icon ?? ''\"\n type=\"button\"\n class=\"action-button\"\n [label]=\"action.labelKey ? (action.labelKey | translate) : action.label\"\n (onClick)=\"action.actionCallback()\"\n [title]=\"(action.titleKey ? (action.titleKey | translate) : action.title) || (action.labelKey ? (action.labelKey | translate) : action.label)\"\n [disabled]=\"action.disabled ? action.disabled : false\"\n [attr.name]=\"action.icon ? 'ocx-page-header-inline-action-icon-button' : 'ocx-page-header-inline-action-button'\"\n [ariaLabel]=\"(action.titleKey ? (action.titleKey | translate) : action.title) || (action.labelKey ? (action.labelKey | translate) : action.label)\"\n ></p-button>\n </ng-container>\n </div>\n <ng-content select=\"[toolbarItems]\"></ng-content>\n <ng-container>\n <div *ngIf=\"overflowActions.length !== 0\">\n <button\n id=\"pageHeaderMenuButton\"\n type=\"button\"\n pButton\n icon=\"pi pi-ellipsis-v\"\n title=\"{{ 'OCX_PAGE_HEADER.MORE_ACTIONS' | translate }}\"\n class=\"more-actions-menu-button action-button ml-2\"\n (click)=\"menu.toggle($event)\"\n name=\"ocx-page-header-overflow-action-button\"\n [ariaLabel]=\"('OCX_PAGE_HEADER.MORE_ACTIONS' | translate)\"\n ></button>\n <p-menu #menu [popup]=\"true\" [model]=\"overflowActions\" appendTo=\"body\"></p-menu>\n </div>\n </ng-container>\n </ng-container>\n <ng-container *ngIf=\"additionalToolbarContent\" [ngTemplateOutlet]=\"additionalToolbarContent\"> </ng-container>\n </div>\n </div>\n\n <div\n class=\"object-panel flex-column md:flex-row\"\n [class.justify-content-evenly]=\"objectDetails\"\n [class.justify-content-start]=\"!objectDetails\"\n >\n <ng-container *ngIf=\"objectDetails\">\n <div\n class=\"object-info flex flex-row md:flex-column align-items-baseline md:align-items-center justify-content-between\"\n *ngFor=\"let item of objectDetails\"\n >\n <label class=\"flex font-medium text-600\" name=\"object-detail-label\">{{ item.label | dynamicPipe:item.labelPipe }}</label>\n <span\n *ngIf=\"item.icon || item.value\"\n class=\"flex text-900 mt-2\"\n [ngClass]=\"generateItemStyle(item)\"\n [title]=\"item.tooltip || ''\"\n name=\"object-detail-value\"\n >\n <i *ngIf=\"item.icon\" class=\"{{item.icon}}\" name=\"object-detail-icon\"></i>\n {{ item.value | dynamicPipe:item.valuePipe:item.valuePipeArgs}}</span\n >\n </div>\n </ng-container>\n <ng-content></ng-content>\n </div>\n</div>\n", styles: [":host(.p-button-label){font-weight:400}:host ::ng-deep .action-button{padding:.5rem;font-weight:400}.onecx-page-header{display:flex;flex-flow:column;border-radius:.25rem;overflow:hidden;background:#fff;box-shadow:0 2px 2px #0000001a;border:1px solid #cdd0d3}.onecx-page-header .title-bar{display:flex;flex-wrap:wrap;justify-content:space-between;align-items:center;gap:.5rem;background-color:#f8f9fa;border-top-right-radius:inherit;border-top-left-radius:inherit}.onecx-page-header .title-bar .figure{width:3rem;height:3rem;margin-right:.5rem;position:relative}.onecx-page-header .title-bar .figure .figure-image img{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%)}.onecx-page-header .title-bar .figure .colorblob{background-color:var(--primary-color);position:absolute;inset:0}.onecx-page-header .title-bar .title-wrap{display:flex;flex-flow:row;align-items:center;gap:.25rem}.onecx-page-header .title-bar .title-wrap .header{display:flex;align-items:flex-start;justify-content:center;flex-direction:column}.onecx-page-header .title-bar .title-wrap h1{font-size:1em;font-weight:700;margin:0;padding:0}.onecx-page-header .title-bar .title-wrap h2{font-size:1em;font-weight:400;margin:0;padding:0}.onecx-page-header .title-bar .action-items-wrap{display:flex;height:-moz-fit-content;height:fit-content;gap:.5rem;align-items:center;justify-content:space-between}.onecx-page-header .title-bar .action-items-wrap button{padding:.5rem}.onecx-page-header .object-panel{border-top:1px solid #cdd0d3;padding:1rem;display:flex}.onecx-page-header .object-panel:empty{display:none}.badge-container{display:flex;align-items:center;justify-content:center;width:100%;height:100%}.scale{transform:scale(2)}\n"] }]
509
+ args: [{ selector: 'ocx-page-header', encapsulation: ViewEncapsulation.None, template: "<div class=\"onecx-page-header\" name=\"ocx-page-header-wrapper\">\n <ng-container *ngIf=\"showBreadcrumbs\">\n <p-breadcrumb\n [model]=\"items\"\n *ngIf=\"breadcrumbs$ | async as items\"\n [home]=\"(home$ | async)?.menuItem ?? {}\"\n [homeAriaLabel]=\"(home$ | async)?.page ? ('OCX_PAGE_HEADER.HOME_ARIA_LABEL' | translate: { page: (home$ | async)?.page}) : ('OCX_PAGE_HEADER.HOME_DEFAULT_ARIA_LABEL' | translate)\"\n [attr.manual]=\"manualBreadcrumbs\"\n ></p-breadcrumb>\n </ng-container>\n <div class=\"title-bar flex flex-row md:justify-content-between p-2 md:p-3\">\n <div class=\"title-wrap\">\n <div class=\"figure flex h-2rem w-2rem md:h-3rem md:w-3rem\" *ngIf=\"showFigure\">\n <div #previewImage class=\"figure-image absolute top-0 left-0 right-0 bottom-0\">\n <ng-content select=\"[figureImage]\"></ng-content>\n <img\n *ngIf=\"figureImage && !figureImageLoadError\"\n [ocxSrc]=\"figureImage\"\n alt=\"Figure image\"\n class=\"w-full\"\n (error)=\"handleImageError()\"\n />\n </div>\n <div\n class=\"colorblob flex-1 border-round\"\n *ngIf=\"previewImage.children.length === 0 || figureImageLoadError\"\n ></div>\n </div>\n <ng-template #skeletonBar>\n <div class=\"header justify-content-evenly\">\n <p-skeleton width=\"10rem\"></p-skeleton>\n <p-skeleton width=\"10rem\"></p-skeleton>\n </div>\n </ng-template>\n <div class=\"header\" *ngIf=\"!loading; else skeletonBar\">\n <h1 id=\"page-header\" *ngIf=\"!!header\">{{ header }}</h1>\n <h2 id=\"page-subheader\" *ngIf=\"!!subheader\">{{ subheader }}</h2>\n </div>\n </div>\n <div class=\"action-items-wrap mt-2 md:mt-0\">\n <ng-container *ngIf=\"additionalToolbarContentLeft\" [ngTemplateOutlet]=\"additionalToolbarContentLeft\">\n </ng-container>\n\n <ng-container *ngIf=\"!disableDefaultActions\"> </ng-container>\n <ng-template #skeletonActions>\n <div class=\"flex\">\n <p-skeleton width=\"5rem\" height=\"2rem\" styleClass=\"mr-2\"></p-skeleton>\n <p-skeleton width=\"2rem\" height=\"2rem\" styleClass=\"mb-2\"></p-skeleton>\n </div>\n </ng-template>\n <ng-container *ngIf=\"!loading; else skeletonActions\">\n <div *ngIf=\"inlineActions && inlineActions.length > 0\" class=\"toolbar flex flex-wrap gap-1 sm:gap-2\">\n <ng-container *ngFor=\"let action of inlineActions\">\n <p-button\n id=\"{{ action.id }}\"\n [icon]=\"action.icon ?? ''\"\n type=\"button\"\n class=\"action-button\"\n [label]=\"action.labelKey ? (action.labelKey | translate) : action.label\"\n (onClick)=\"action.actionCallback()\"\n [title]=\"(action.titleKey ? (action.titleKey | translate) : action.title) || (action.labelKey ? (action.labelKey | translate) : action.label)\"\n [disabled]=\"action.disabled ? action.disabled : false\"\n [attr.name]=\"action.icon ? 'ocx-page-header-inline-action-icon-button' : 'ocx-page-header-inline-action-button'\"\n [ariaLabel]=\"(action.titleKey ? (action.titleKey | translate) : action.title) || (action.labelKey ? (action.labelKey | translate) : action.label)\"\n ></p-button>\n </ng-container>\n </div>\n <ng-content select=\"[toolbarItems]\"></ng-content>\n <ng-container>\n <div *ngIf=\"overflowActions.length !== 0\">\n <button\n id=\"pageHeaderMenuButton\"\n type=\"button\"\n pButton\n icon=\"pi pi-ellipsis-v\"\n title=\"{{ 'OCX_PAGE_HEADER.MORE_ACTIONS' | translate }}\"\n class=\"more-actions-menu-button action-button ml-2\"\n (click)=\"menu.toggle($event)\"\n name=\"ocx-page-header-overflow-action-button\"\n [ariaLabel]=\"('OCX_PAGE_HEADER.MORE_ACTIONS' | translate)\"\n ></button>\n <p-menu #menu [popup]=\"true\" [model]=\"overflowActions\" appendTo=\"body\"></p-menu>\n </div>\n </ng-container>\n </ng-container>\n <ng-container *ngIf=\"additionalToolbarContent\" [ngTemplateOutlet]=\"additionalToolbarContent\"> </ng-container>\n </div>\n </div>\n\n <div\n class=\"object-panel flex-column md:flex-row\"\n [class.justify-content-evenly]=\"objectDetails\"\n [class.justify-content-start]=\"!objectDetails\"\n >\n <ng-container *ngIf=\"objectDetails\">\n <div\n class=\"object-info flex flex-row md:flex-column align-items-baseline md:align-items-center justify-content-between\"\n *ngFor=\"let item of objectDetails\"\n >\n <label class=\"flex font-medium text-600\" name=\"object-detail-label\"\n >{{ item.label | dynamicPipe:item.labelPipe }}</label\n >\n <span\n *ngIf=\"item.icon || item.value\"\n class=\"flex text-900 mt-2\"\n [ngClass]=\"generateItemStyle(item)\"\n [title]=\"item.tooltip || ''\"\n name=\"object-detail-value\"\n >\n <i *ngIf=\"item.icon\" class=\"{{item.icon}}\" name=\"object-detail-icon\"></i>\n {{ item.value | dynamicPipe:item.valuePipe:item.valuePipeArgs}}</span\n >\n </div>\n </ng-container>\n <ng-content></ng-content>\n </div>\n</div>\n", styles: [":host(.p-button-label){font-weight:400}:host ::ng-deep .action-button{padding:.5rem;font-weight:400}.onecx-page-header{display:flex;flex-flow:column;border-radius:.25rem;overflow:hidden;background:#fff;box-shadow:0 2px 2px #0000001a;border:1px solid #cdd0d3}.onecx-page-header .title-bar{display:flex;flex-wrap:wrap;justify-content:space-between;align-items:center;gap:.5rem;background-color:#f8f9fa;border-top-right-radius:inherit;border-top-left-radius:inherit}.onecx-page-header .title-bar .figure{width:3rem;height:3rem;margin-right:.5rem;position:relative}.onecx-page-header .title-bar .figure .figure-image img{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%)}.onecx-page-header .title-bar .figure .colorblob{background-color:var(--primary-color);position:absolute;inset:0}.onecx-page-header .title-bar .title-wrap{display:flex;flex-flow:row;align-items:center;gap:.25rem}.onecx-page-header .title-bar .title-wrap .header{display:flex;align-items:flex-start;justify-content:center;flex-direction:column}.onecx-page-header .title-bar .title-wrap h1{font-size:1em;font-weight:700;margin:0;padding:0}.onecx-page-header .title-bar .title-wrap h2{font-size:1em;font-weight:400;margin:0;padding:0}.onecx-page-header .title-bar .action-items-wrap{display:flex;height:-moz-fit-content;height:fit-content;gap:.5rem;align-items:center;justify-content:space-between}.onecx-page-header .title-bar .action-items-wrap button{padding:.5rem}.onecx-page-header .object-panel{border-top:1px solid #cdd0d3;padding:1rem;display:flex}.onecx-page-header .object-panel:empty{display:none}.badge-container{display:flex;align-items:center;justify-content:center;width:100%;height:100%}.scale{transform:scale(2)}\n"] }]
506
510
  }], ctorParameters: function () { return [{ type: BreadcrumbService }, { type: i1$1.TranslateService }, { type: i3.AppStateService }, { type: i3.UserService }]; }, propDecorators: { header: [{
507
511
  type: Input
508
512
  }], loading: [{