UNPKG

@microsoft/windows-admin-center-sdk

Version:

Microsoft - Windows Admin Center Shell

484 lines 55.4 kB
import { Component, ContentChildren, EventEmitter, forwardRef, Inject, Injector, Input, Optional, Output, QueryList, SkipSelf, TemplateRef, ViewChild } from '@angular/core'; import { CoreBaseComponent } from '../common/base.component'; import { SME_LAYOUT_PROVIDER } from '../common/layout'; import { PropertyGridItemComponent } from './property-grid-item.component'; import { PropertyGridResponsiveWindowManager } from './property-grid-responsive-window-manager'; import * as i0 from "@angular/core"; import * as i1 from "@angular/router"; import * as i2 from "@angular/common"; import * as i3 from "../layout/layout.component"; import * as i4 from "../layout/layout-item.component"; import * as i5 from "../layout/layout-definition.component"; import * as i6 from "../loading-wheel/loading-wheel.component"; import * as i7 from "../icon/layered-icon/status/status-icon.component"; import * as i8 from "../tooltip/tooltip.directive"; import * as i9 from "../tooltip/tooltip-zone.directive"; const _c0 = ["readonlyTemplate"]; const _c1 = ["actionLinkTemplate"]; const _c2 = ["internalLinkTemplate"]; const _c3 = ["externalLinkTemplate"]; function PropertyGridComponent_sme_layout_definition_3_Template(rf, ctx) { if (rf & 1) { i0.ɵɵelement(0, "sme-layout-definition", 11); } if (rf & 2) { const ctx_r1 = i0.ɵɵnextContext(); i0.ɵɵproperty("until", ctx_r1.layoutItemWidth * 2)("columns", 2); } } function PropertyGridComponent_sme_layout_definition_4_Template(rf, ctx) { if (rf & 1) { i0.ɵɵelement(0, "sme-layout-definition", 12); } if (rf & 2) { i0.ɵɵproperty("columns", 3); } } function PropertyGridComponent_sme_layout_item_5_span_6_Template(rf, ctx) { if (rf & 1) { i0.ɵɵelement(0, "span", 20); } if (rf & 2) { const item_r14 = i0.ɵɵnextContext().$implicit; const _r16 = i0.ɵɵreference(2); i0.ɵɵproperty("title", item_r14.tooltip)("tooltipZone", _r16); } } function PropertyGridComponent_sme_layout_item_5_ng_container_9_Template(rf, ctx) { if (rf & 1) { i0.ɵɵelementContainer(0); } } const _c4 = function (a0, a1) { return { $implicit: a0, index: a1 }; }; function PropertyGridComponent_sme_layout_item_5_Template(rf, ctx) { if (rf & 1) { i0.ɵɵelementStart(0, "sme-layout-item", 13)(1, "div", 14, 15)(3, "label", 16)(4, "span"); i0.ɵɵtext(5); i0.ɵɵelementEnd(); i0.ɵɵtemplate(6, PropertyGridComponent_sme_layout_item_5_span_6_Template, 1, 2, "span", 17); i0.ɵɵelementStart(7, "span", 18); i0.ɵɵtext(8); i0.ɵɵelementEnd()(); i0.ɵɵtemplate(9, PropertyGridComponent_sme_layout_item_5_ng_container_9_Template, 1, 0, "ng-container", 19); i0.ɵɵelementEnd()(); } if (rf & 2) { const item_r14 = ctx.$implicit; const i_r15 = ctx.index; const ctx_r3 = i0.ɵɵnextContext(); i0.ɵɵproperty("columnSpan", item_r14.columnSpan)("maxWidth", ctx_r3.orientation === "vertical" ? null : item_r14.columnSpan * ctx_r3.layoutItemWidth); i0.ɵɵadvance(5); i0.ɵɵtextInterpolate(item_r14.label); i0.ɵɵadvance(1); i0.ɵɵproperty("ngIf", item_r14.tooltip); i0.ɵɵadvance(2); i0.ɵɵtextInterpolate(item_r14.tooltip); i0.ɵɵadvance(1); i0.ɵɵproperty("ngTemplateOutlet", ctx_r3.getTemplate(item_r14))("ngTemplateOutletContext", i0.ɵɵpureFunction2(7, _c4, item_r14, i_r15)); } } function PropertyGridComponent_ng_template_6_sme_loading_wheel_0_Template(rf, ctx) { if (rf & 1) { i0.ɵɵelement(0, "sme-loading-wheel", 23); } if (rf & 2) { i0.ɵɵproperty("inline", true)("isBackgroundTransparent", true); } } function PropertyGridComponent_ng_template_6_ng_container_1_ng_container_2_Template(rf, ctx) { if (rf & 1) { i0.ɵɵelementContainer(0); } } function PropertyGridComponent_ng_template_6_ng_container_1_span_3_Template(rf, ctx) { if (rf & 1) { i0.ɵɵelementStart(0, "span"); i0.ɵɵtext(1); i0.ɵɵelementEnd(); } if (rf & 2) { const item_r20 = i0.ɵɵnextContext(2).$implicit; const ctx_r25 = i0.ɵɵnextContext(); i0.ɵɵadvance(1); i0.ɵɵtextInterpolate(ctx_r25.stringifyValue(item_r20.value)); } } function PropertyGridComponent_ng_template_6_ng_container_1_Template(rf, ctx) { if (rf & 1) { i0.ɵɵelementContainerStart(0); i0.ɵɵelementStart(1, "p", 24); i0.ɵɵtemplate(2, PropertyGridComponent_ng_template_6_ng_container_1_ng_container_2_Template, 1, 0, "ng-container", 19); i0.ɵɵtemplate(3, PropertyGridComponent_ng_template_6_ng_container_1_span_3_Template, 2, 1, "span", 22); i0.ɵɵelementEnd(); i0.ɵɵelementContainerEnd(); } if (rf & 2) { const ctx_r27 = i0.ɵɵnextContext(); const i_r21 = ctx_r27.index; const item_r20 = ctx_r27.$implicit; const ctx_r23 = i0.ɵɵnextContext(); const _r12 = i0.ɵɵreference(15); i0.ɵɵadvance(1); i0.ɵɵattribute("aria-labelledby", ctx_r23.idBag.labelSpan + i_r21)("aria-describedby", ctx_r23.idBag.detailsSpan + i_r21); i0.ɵɵadvance(1); i0.ɵɵproperty("ngTemplateOutlet", _r12)("ngTemplateOutletContext", i0.ɵɵpureFunction2(5, _c4, item_r20, i_r21)); i0.ɵɵadvance(1); i0.ɵɵproperty("ngIf", !item_r20.link && !item_r20.action); } } function PropertyGridComponent_ng_template_6_Template(rf, ctx) { if (rf & 1) { i0.ɵɵtemplate(0, PropertyGridComponent_ng_template_6_sme_loading_wheel_0_Template, 1, 2, "sme-loading-wheel", 21); i0.ɵɵtemplate(1, PropertyGridComponent_ng_template_6_ng_container_1_Template, 4, 8, "ng-container", 22); } if (rf & 2) { const item_r20 = ctx.$implicit; i0.ɵɵproperty("ngIf", item_r20.loading && item_r20.isAsync); i0.ɵɵadvance(1); i0.ɵɵproperty("ngIf", !item_r20.loading || !item_r20.isAsync); } } function PropertyGridComponent_ng_template_8_ng_container_1_Template(rf, ctx) { if (rf & 1) { i0.ɵɵelementContainer(0); } } function PropertyGridComponent_ng_template_8_span_2_Template(rf, ctx) { if (rf & 1) { i0.ɵɵelementStart(0, "span", 27); i0.ɵɵtext(1); i0.ɵɵelementEnd(); } if (rf & 2) { const item_r28 = i0.ɵɵnextContext().$implicit; i0.ɵɵadvance(1); i0.ɵɵtextInterpolate(item_r28.prefixString); } } function PropertyGridComponent_ng_template_8_Template(rf, ctx) { if (rf & 1) { const _r34 = i0.ɵɵgetCurrentView(); i0.ɵɵelementStart(0, "p"); i0.ɵɵtemplate(1, PropertyGridComponent_ng_template_8_ng_container_1_Template, 1, 0, "ng-container", 19); i0.ɵɵtemplate(2, PropertyGridComponent_ng_template_8_span_2_Template, 2, 1, "span", 25); i0.ɵɵelementStart(3, "a", 26); i0.ɵɵlistener("click", function PropertyGridComponent_ng_template_8_Template_a_click_3_listener() { const restoredCtx = i0.ɵɵrestoreView(_r34); const item_r28 = restoredCtx.$implicit; return i0.ɵɵresetView(item_r28.action(item_r28)); }); i0.ɵɵtext(4); i0.ɵɵelementEnd()(); } if (rf & 2) { const item_r28 = ctx.$implicit; const i_r29 = ctx.index; const ctx_r7 = i0.ɵɵnextContext(); const _r12 = i0.ɵɵreference(15); i0.ɵɵadvance(1); i0.ɵɵproperty("ngTemplateOutlet", _r12)("ngTemplateOutletContext", i0.ɵɵpureFunction2(6, _c4, item_r28, i_r29)); i0.ɵɵadvance(1); i0.ɵɵproperty("ngIf", item_r28.prefixString); i0.ɵɵadvance(1); i0.ɵɵattribute("aria-labelledby", ctx_r7.idBag.labelSpan + i_r29 + " " + (ctx_r7.idBag.valueSpan + i_r29))("aria-describedby", ctx_r7.idBag.detailsSpan + i_r29); i0.ɵɵadvance(1); i0.ɵɵtextInterpolate(item_r28.value); } } function PropertyGridComponent_ng_template_10_ng_container_1_Template(rf, ctx) { if (rf & 1) { i0.ɵɵelementContainer(0); } } function PropertyGridComponent_ng_template_10_span_2_Template(rf, ctx) { if (rf & 1) { i0.ɵɵelementStart(0, "span", 27); i0.ɵɵtext(1); i0.ɵɵelementEnd(); } if (rf & 2) { const item_r35 = i0.ɵɵnextContext().$implicit; i0.ɵɵadvance(1); i0.ɵɵtextInterpolate(item_r35.prefixString); } } function PropertyGridComponent_ng_template_10_Template(rf, ctx) { if (rf & 1) { i0.ɵɵelementStart(0, "p"); i0.ɵɵtemplate(1, PropertyGridComponent_ng_template_10_ng_container_1_Template, 1, 0, "ng-container", 19); i0.ɵɵtemplate(2, PropertyGridComponent_ng_template_10_span_2_Template, 2, 1, "span", 25); i0.ɵɵelementStart(3, "a", 28); i0.ɵɵtext(4); i0.ɵɵelementEnd(); i0.ɵɵelementStart(5, "span", 29); i0.ɵɵtext(6); i0.ɵɵelementEnd()(); } if (rf & 2) { const item_r35 = ctx.$implicit; const i_r36 = ctx.index; const ctx_r9 = i0.ɵɵnextContext(); const _r12 = i0.ɵɵreference(15); i0.ɵɵadvance(1); i0.ɵɵproperty("ngTemplateOutlet", _r12)("ngTemplateOutletContext", i0.ɵɵpureFunction2(8, _c4, item_r35, i_r36)); i0.ɵɵadvance(1); i0.ɵɵproperty("ngIf", item_r35.prefixString); i0.ɵɵadvance(1); i0.ɵɵproperty("routerLink", item_r35.link); i0.ɵɵattribute("aria-describedby", ctx_r9.idBag.detailsSpan + i_r36); i0.ɵɵadvance(1); i0.ɵɵtextInterpolate(item_r35.value); i0.ɵɵadvance(1); i0.ɵɵproperty("id", ctx_r9.idBag.detailsSpan + i_r36); i0.ɵɵadvance(1); i0.ɵɵtextInterpolate(ctx_r9.getInternalLinkDescription(item_r35)); } } function PropertyGridComponent_ng_template_12_ng_container_1_Template(rf, ctx) { if (rf & 1) { i0.ɵɵelementContainer(0); } } function PropertyGridComponent_ng_template_12_span_2_Template(rf, ctx) { if (rf & 1) { i0.ɵɵelementStart(0, "span", 27); i0.ɵɵtext(1); i0.ɵɵelementEnd(); } if (rf & 2) { const item_r40 = i0.ɵɵnextContext().$implicit; i0.ɵɵadvance(1); i0.ɵɵtextInterpolate(item_r40.prefixString); } } function PropertyGridComponent_ng_template_12_Template(rf, ctx) { if (rf & 1) { i0.ɵɵelementStart(0, "p"); i0.ɵɵtemplate(1, PropertyGridComponent_ng_template_12_ng_container_1_Template, 1, 0, "ng-container", 19); i0.ɵɵtemplate(2, PropertyGridComponent_ng_template_12_span_2_Template, 2, 1, "span", 25); i0.ɵɵelementStart(3, "a", 30); i0.ɵɵtext(4); i0.ɵɵelementEnd(); i0.ɵɵelementStart(5, "span", 29); i0.ɵɵtext(6); i0.ɵɵelementEnd()(); } if (rf & 2) { const item_r40 = ctx.$implicit; const i_r41 = ctx.index; const ctx_r11 = i0.ɵɵnextContext(); const _r12 = i0.ɵɵreference(15); i0.ɵɵadvance(1); i0.ɵɵproperty("ngTemplateOutlet", _r12)("ngTemplateOutletContext", i0.ɵɵpureFunction2(8, _c4, item_r40, i_r41)); i0.ɵɵadvance(1); i0.ɵɵproperty("ngIf", item_r40.prefixString); i0.ɵɵadvance(1); i0.ɵɵproperty("href", item_r40.link, i0.ɵɵsanitizeUrl); i0.ɵɵattribute("aria-describedby", ctx_r11.idBag.detailsSpan + i_r41); i0.ɵɵadvance(1); i0.ɵɵtextInterpolate(item_r40.value); i0.ɵɵadvance(1); i0.ɵɵproperty("id", ctx_r11.idBag.detailsSpan + i_r41); i0.ɵɵadvance(1); i0.ɵɵtextInterpolate(ctx_r11.getExternalLinkDescription(item_r40)); } } function PropertyGridComponent_ng_template_14_span_0_Template(rf, ctx) { if (rf & 1) { i0.ɵɵelement(0, "span"); } if (rf & 2) { const item_r45 = i0.ɵɵnextContext().$implicit; i0.ɵɵclassMapInterpolate1("sme-margin-right-xs sme-icon ", item_r45.iconClass, ""); } } function PropertyGridComponent_ng_template_14_sme_status_icon_1_Template(rf, ctx) { if (rf & 1) { i0.ɵɵelement(0, "sme-status-icon", 33); } if (rf & 2) { const item_r45 = i0.ɵɵnextContext().$implicit; i0.ɵɵproperty("status", item_r45.status); } } function PropertyGridComponent_ng_template_14_Template(rf, ctx) { if (rf & 1) { i0.ɵɵtemplate(0, PropertyGridComponent_ng_template_14_span_0_Template, 1, 3, "span", 31); i0.ɵɵtemplate(1, PropertyGridComponent_ng_template_14_sme_status_icon_1_Template, 1, 1, "sme-status-icon", 32); } if (rf & 2) { const item_r45 = ctx.$implicit; i0.ɵɵproperty("ngIf", !!item_r45.iconClass); i0.ɵɵadvance(1); i0.ɵɵproperty("ngIf", item_r45.status !== undefined && item_r45.status !== null && !item_r45.iconClass); } } /** * * @smeDoc {@label Property Grid @id sme-property-grid-component} * * @overview * @file {@filepath ./examples/overview.md} * * @example {@label Basic Usage @id basic-usage} * @file {@filename component.html @filepath ./examples/basic-usage.component.html} * * @example {@label Vertical Orientation @id vertical-orientation} * @file {@filename component.html @filepath ./examples/vertical-orientation.component.html} * * @example {@label Item with a Link @id link-item} * @file {@filename component.html @filepath ./examples/link-item.component.html} * * @example {@label Item with a Tooltip @id tooltip-item} * @file {@filename component.html @filepath ./examples/tooltip-item.component.html} * * @example {@label Item with a Action @id action-item} * @file {@filename component.ts @filepath ./examples/action-item.component.ts} * @file {@filename component.html @filepath ./examples/action-item.component.html} * * @example {@label Item Spanning Multiple Columns @id multi-column} * @file {@filename component.html @filepath ./examples/multi-column-item.component.html} * * @example {@label Items with Status and Icons @id status-and-icons} * @file {@filename component.html @filepath ./examples/status-item.component.html} * * @example {@label Items with complex value types @id complex-value} * @file {@filename component.html @filepath ./examples/complex-values.component.html} * */ export class PropertyGridComponent extends CoreBaseComponent { constructor(injector, layout) { super(injector); /** * The basic column width for the property grid items. */ this.layoutItemWidth = 300; /** * The orientation for the property grid */ this.orientation = 'horizontal'; /** * Implementation of the Layout interface */ this.layoutChanged = new EventEmitter(); /** * Implementation of the Layout interface */ this.windowBreakpointChanged = new EventEmitter(); this.propertyGridResponsiveWindowManager = new PropertyGridResponsiveWindowManager(); // old style supported sme-property-grid-arrange-vertical class. default to vertical orientation if this class is applied. const hasVerticalClass = this.hostElement.nativeElement.classList.contains('sme-property-grid-arrange-vertical'); this.orientation = hasVerticalClass ? 'vertical' : 'horizontal'; // on parent layout changes, re-emit the layout change to our event if (layout) { this.subscriptions.push(layout.layoutChanged.subscribe(() => { this.layoutChanged.emit(); setTimeout(() => { this.propertyGridResponsiveWindowManager.onWindowSizeChanged(this.hostElement.nativeElement); }); })); } } /** * The source name to use for logging */ get logSourceName() { return 'PropertyGridComponent'; } stringifyValue(value) { if (MsftSme.isNullOrWhiteSpace(value)) { return '-'; } if (Array.isArray(value)) { return value.map(v => this.stringifyValue(v)).join(',\n'); } if (MsftSme.isObject(value)) { try { return JSON.stringify(value, null, 2); } catch (error) { return value; } } return `${value}`; } getTemplate(item) { if (item.action) { return this.actionLinkTemplate; } if (item.link) { if (item.isExternalLink) { return this.externalLinkTemplate; } else { return this.internalLinkTemplate; } } return this.readonlyTemplate; } ngOnChanges(changes) { super.ngOnChanges(changes); if (changes.orientation) { this.layoutChanged.emit(); } } /** * It handles the undefined value won't be updated situation for async property item. * Angular issue that the property item value initialized with undefined, if after async time, the value being set is still undefined, * Angular will not be able to trigger the value on changed event. Thus we have to manually call to refresh it. * * @param index The index that needs to hard refresh. */ hardRefreshItem(index) { if (!this.items) { return; } const items = this.items.toArray(); if (!items[index]) { return; } const item = items[index]; if (item.isAsync && item.value === undefined) { item.loading = false; } } getInternalLinkDescription(item) { return this.strings.MsftSmeShell.Angular.PropertyGrid.InternalLink.label.format(item.link); } getExternalLinkDescription(item) { return this.strings.MsftSmeShell.Angular.PropertyGrid.ExternalLink.label.format(item.link); } /** * Creates the idBag used by this component to store unique element ids. * id values will be assigned be the @see BaseComponent super class. */ createIdBag() { return { detailsSpan: '', labelSpan: '', valueSpan: '' }; } /** * Gets the initial host classes to be applied to this element */ getInitialHostClasses() { return super.getInitialHostClasses().concat([ 'sme-property-grid', 'sme-layout-relative', 'sme-focus-zone' ]); } } /** @nocollapse */ PropertyGridComponent.ɵfac = function PropertyGridComponent_Factory(t) { return new (t || PropertyGridComponent)(i0.ɵɵdirectiveInject(i0.Injector), i0.ɵɵdirectiveInject(SME_LAYOUT_PROVIDER, 12)); }; /** @nocollapse */ PropertyGridComponent.ɵcmp = /** @pureOrBreakMyCode */ i0.ɵɵdefineComponent({ type: PropertyGridComponent, selectors: [["sme-property-grid"]], contentQueries: function PropertyGridComponent_ContentQueries(rf, ctx, dirIndex) { if (rf & 1) { i0.ɵɵcontentQuery(dirIndex, PropertyGridItemComponent, 4); } if (rf & 2) { let _t; i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.items = _t); } }, viewQuery: function PropertyGridComponent_Query(rf, ctx) { if (rf & 1) { i0.ɵɵviewQuery(_c0, 7); i0.ɵɵviewQuery(_c1, 7); i0.ɵɵviewQuery(_c2, 7); i0.ɵɵviewQuery(_c3, 7); } if (rf & 2) { let _t; i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.readonlyTemplate = _t.first); i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.actionLinkTemplate = _t.first); i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.internalLinkTemplate = _t.first); i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.externalLinkTemplate = _t.first); } }, inputs: { orientation: "orientation" }, outputs: { layoutChanged: "layoutChanged", windowBreakpointChanged: "windowBreakpointChanged" }, features: [i0.ɵɵProvidersFeature([ { provide: SME_LAYOUT_PROVIDER, useExisting: forwardRef((() => PropertyGridComponent)) } ]), i0.ɵɵInheritDefinitionFeature, i0.ɵɵNgOnChangesFeature], decls: 16, vars: 7, consts: [[1, "sme-position-inset-none", "sme-position-stretch-h", 3, "padLastItem", "oneColumn"], ["layout", ""], ["name", "narrow", 3, "until", "columns"], ["name", "medium", 3, "until", "columns", 4, "ngIf"], ["name", "wide", 3, "columns", 4, "ngIf"], [3, "columnSpan", "maxWidth", 4, "ngFor", "ngForOf"], ["readonlyTemplate", ""], ["actionLinkTemplate", ""], ["internalLinkTemplate", ""], ["externalLinkTemplate", ""], ["iconTemplate", ""], ["name", "medium", 3, "until", "columns"], ["name", "wide", 3, "columns"], [3, "columnSpan", "maxWidth"], ["tabindex", "0", "aria-live", "polite", "aria-atomic", "true", "smeTooltipZone", "", 1, "sme-property-grid-item"], ["zone", "smeTooltipZone"], [1, "sme-arrange-stack-h"], ["class", "sme-position-flex-none sme-icon sme-icon-info sme-info-bubble sme-margin-left-xs", "aria-hidden", "true", "tabindex", "0", 3, "title", "tooltipZone", 4, "ngIf"], [1, "sme-screen-reader"], [4, "ngTemplateOutlet", "ngTemplateOutletContext"], ["aria-hidden", "true", "tabindex", "0", 1, "sme-position-flex-none", "sme-icon", "sme-icon-info", "sme-info-bubble", "sme-margin-left-xs", 3, "title", "tooltipZone"], ["size", "extra-small", 3, "inline", "isBackgroundTransparent", 4, "ngIf"], [4, "ngIf"], ["size", "extra-small", 3, "inline", "isBackgroundTransparent"], [1, "sme-read-only-template"], ["class", "sme-padding-right-xs", 4, "ngIf"], ["tabindex", "0", "role", "link", 1, "sme-link", "sme-focus-zone", "sme-action-link-template", 3, "click"], [1, "sme-padding-right-xs"], ["role", "link", 1, "sme-link", "sme-focus-zone", 3, "routerLink"], [1, "sme-screen-reader", 3, "id"], ["role", "link", "target", "_blank", 1, "sme-link", "sme-focus-zone", "sme-icon", "sme-icon-after", "sme-icon-openInNewWindow", 3, "href"], [3, "class", 4, "ngIf"], ["class", "sme-layout-inline-block sme-margin-right-xs ", "size", "16px", 3, "status", 4, "ngIf"], ["size", "16px", 1, "sme-layout-inline-block", "sme-margin-right-xs", 3, "status"]], template: function PropertyGridComponent_Template(rf, ctx) { if (rf & 1) { i0.ɵɵelementStart(0, "sme-layout", 0, 1); i0.ɵɵelement(2, "sme-layout-definition", 2); i0.ɵɵtemplate(3, PropertyGridComponent_sme_layout_definition_3_Template, 1, 2, "sme-layout-definition", 3); i0.ɵɵtemplate(4, PropertyGridComponent_sme_layout_definition_4_Template, 1, 1, "sme-layout-definition", 4); i0.ɵɵtemplate(5, PropertyGridComponent_sme_layout_item_5_Template, 10, 10, "sme-layout-item", 5); i0.ɵɵelementEnd(); i0.ɵɵtemplate(6, PropertyGridComponent_ng_template_6_Template, 2, 2, "ng-template", null, 6, i0.ɵɵtemplateRefExtractor); i0.ɵɵtemplate(8, PropertyGridComponent_ng_template_8_Template, 5, 9, "ng-template", null, 7, i0.ɵɵtemplateRefExtractor); i0.ɵɵtemplate(10, PropertyGridComponent_ng_template_10_Template, 7, 11, "ng-template", null, 8, i0.ɵɵtemplateRefExtractor); i0.ɵɵtemplate(12, PropertyGridComponent_ng_template_12_Template, 7, 11, "ng-template", null, 9, i0.ɵɵtemplateRefExtractor); i0.ɵɵtemplate(14, PropertyGridComponent_ng_template_14_Template, 2, 2, "ng-template", null, 10, i0.ɵɵtemplateRefExtractor); } if (rf & 2) { i0.ɵɵproperty("padLastItem", true)("oneColumn", ctx.orientation === "vertical"); i0.ɵɵadvance(2); i0.ɵɵproperty("until", ctx.layoutItemWidth)("columns", 1); i0.ɵɵadvance(1); i0.ɵɵproperty("ngIf", ctx.orientation !== "vertical"); i0.ɵɵadvance(1); i0.ɵɵproperty("ngIf", ctx.orientation !== "vertical"); i0.ɵɵadvance(1); i0.ɵɵproperty("ngForOf", ctx.items); } }, dependencies: [i1.RouterLink, i2.NgForOf, i2.NgIf, i2.NgTemplateOutlet, i3.LayoutComponent, i4.LayoutItemComponent, i5.LayoutDefinitionComponent, i6.LoadingWheelComponent, i7.StatusIconComponent, i8.TooltipDirective, i9.TooltipZoneDirective], encapsulation: 2 }); (function () { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(PropertyGridComponent, [{ type: Component, args: [{ selector: 'sme-property-grid', providers: [ { provide: SME_LAYOUT_PROVIDER, useExisting: forwardRef((() => PropertyGridComponent)) } ], template: "<sme-layout #layout [padLastItem]=\"true\" class=\"sme-position-inset-none sme-position-stretch-h\" [oneColumn]=\"orientation === 'vertical'\">\r\n <sme-layout-definition name=\"narrow\" [until]=\"layoutItemWidth\" [columns]=\"1\"></sme-layout-definition>\r\n <sme-layout-definition *ngIf=\"orientation !== 'vertical'\" name=\"medium\" [until]=\"layoutItemWidth*2\" [columns]=\"2\"></sme-layout-definition>\r\n <sme-layout-definition *ngIf=\"orientation !== 'vertical'\" name=\"wide\" [columns]=\"3\"></sme-layout-definition>\r\n <sme-layout-item *ngFor=\"let item of items; index as i\" [columnSpan]=\"item.columnSpan\"\r\n [maxWidth]=\"orientation === 'vertical' ? null : item.columnSpan * layoutItemWidth\">\r\n <div class=\"sme-property-grid-item\" tabindex=\"0\" aria-live=\"polite\" aria-atomic=\"true\" #zone=\"smeTooltipZone\" smeTooltipZone>\r\n <label class=\"sme-arrange-stack-h\">\r\n <span>{{ item.label }}</span>\r\n <span *ngIf=\"item.tooltip\" class=\"sme-position-flex-none sme-icon sme-icon-info sme-info-bubble sme-margin-left-xs\"\r\n [title]=\"item.tooltip\" [tooltipZone]=\"zone\" aria-hidden=\"true\" tabindex=\"0\"></span>\r\n <!-- in scan mode screen reader does not focus on the info icon properly to read the title -->\r\n <span class=\"sme-screen-reader\">{{ item.tooltip }}</span>\r\n </label>\r\n <ng-container *ngTemplateOutlet=\"getTemplate(item);context:{$implicit:item, index: i}\"></ng-container>\r\n </div>\r\n </sme-layout-item>\r\n</sme-layout>\r\n\r\n<!-- Read only -->\r\n<ng-template #readonlyTemplate let-item let-i=\"index\">\r\n <sme-loading-wheel *ngIf=\"item.loading && item.isAsync\" size=\"extra-small\" [inline]=\"true\" [isBackgroundTransparent]=\"true\"></sme-loading-wheel>\r\n <ng-container *ngIf=\"!item.loading || !item.isAsync\">\r\n <p class=\"sme-read-only-template\" [attr.aria-labelledby]=\"idBag.labelSpan + i\" [attr.aria-describedby]=\"idBag.detailsSpan + i\">\r\n <ng-container *ngTemplateOutlet=\"iconTemplate;context:{$implicit:item, index: i}\"></ng-container>\r\n <span *ngIf=\"!item.link && !item.action\">{{ stringifyValue(item.value) }}</span>\r\n </p>\r\n </ng-container>\r\n</ng-template>\r\n\r\n<!-- Action link (role button) -->\r\n<ng-template #actionLinkTemplate let-item let-i=\"index\">\r\n <p>\r\n <ng-container *ngTemplateOutlet=\"iconTemplate;context:{$implicit:item, index: i}\"></ng-container>\r\n <span *ngIf=\"item.prefixString\" class=\"sme-padding-right-xs\">{{ item.prefixString }}</span>\r\n <a tabindex=\"0\" class=\"sme-link sme-focus-zone sme-action-link-template\" role=\"link\" (click)=\"item.action(item)\"\r\n [attr.aria-labelledby]=\"(idBag.labelSpan + i) + ' ' + (idBag.valueSpan + i)\"\r\n [attr.aria-describedby]=\"idBag.detailsSpan + i\">{{ item.value }}</a>\r\n </p>\r\n</ng-template>\r\n\r\n<!-- Internal link -->\r\n<ng-template #internalLinkTemplate let-item let-i=\"index\">\r\n <p>\r\n <ng-container *ngTemplateOutlet=\"iconTemplate;context:{$implicit:item, index: i}\"></ng-container>\r\n <span *ngIf=\"item.prefixString\" class=\"sme-padding-right-xs\">{{ item.prefixString }}</span>\r\n <a class=\"sme-link sme-focus-zone\" role=\"link\" [routerLink]=\"item.link\"\r\n [attr.aria-describedby]=\"idBag.detailsSpan + i\">{{ item.value }}</a>\r\n <span class=\"sme-screen-reader\" [id]=\"idBag.detailsSpan + i\">{{ getInternalLinkDescription(item) }}</span>\r\n </p>\r\n</ng-template>\r\n\r\n<!-- External link -->\r\n<ng-template #externalLinkTemplate let-item let-i=\"index\">\r\n <p>\r\n <ng-container *ngTemplateOutlet=\"iconTemplate;context:{$implicit:item, index: i}\"></ng-container>\r\n <span *ngIf=\"item.prefixString\" class=\"sme-padding-right-xs\">{{ item.prefixString }}</span>\r\n <a class=\"sme-link sme-focus-zone sme-icon sme-icon-after sme-icon-openInNewWindow\" role=\"link\" [href]=\"item.link\" target=\"_blank\"\r\n [attr.aria-describedby]=\"idBag.detailsSpan + i\">{{ item.value }}</a>\r\n <span class=\"sme-screen-reader\" [id]=\"idBag.detailsSpan + i\">{{ getExternalLinkDescription(item) }}</span>\r\n </p>\r\n</ng-template>\r\n\r\n<!-- Icon Template -->\r\n<ng-template #iconTemplate let-item let-i=\"index\">\r\n <span *ngIf=\"!!item.iconClass\" class=\"sme-margin-right-xs sme-icon {{item.iconClass}}\"></span>\r\n <sme-status-icon *ngIf=\"item.status !== undefined && item.status !== null && !item.iconClass\" class=\"sme-layout-inline-block sme-margin-right-xs \"\r\n [status]=\"item.status\" size=\"16px\"></sme-status-icon>\r\n</ng-template>\r\n" }] }], function () { return [{ type: i0.Injector }, { type: undefined, decorators: [{ type: SkipSelf }, { type: Optional }, { type: Inject, args: [SME_LAYOUT_PROVIDER] }] }]; }, { items: [{ type: ContentChildren, args: [PropertyGridItemComponent] }], readonlyTemplate: [{ type: ViewChild, args: ['readonlyTemplate', { static: true }] }], actionLinkTemplate: [{ type: ViewChild, args: ['actionLinkTemplate', { static: true }] }], internalLinkTemplate: [{ type: ViewChild, args: ['internalLinkTemplate', { static: true }] }], externalLinkTemplate: [{ type: ViewChild, args: ['externalLinkTemplate', { static: true }] }], orientation: [{ type: Input }], layoutChanged: [{ type: Output }], windowBreakpointChanged: [{ type: Output }] }); })(); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvcGVydHktZ3JpZC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9hbmd1bGFyL3NyYy9jb250cm9scy9wcm9wZXJ0eS1ncmlkL3Byb3BlcnR5LWdyaWQuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vYW5ndWxhci9zcmMvY29udHJvbHMvcHJvcGVydHktZ3JpZC9wcm9wZXJ0eS1ncmlkLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDSCxTQUFTLEVBQ1QsZUFBZSxFQUNmLFlBQVksRUFDWixVQUFVLEVBQ1YsTUFBTSxFQUNOLFFBQVEsRUFDUixLQUFLLEVBRUwsUUFBUSxFQUNSLE1BQU0sRUFDTixTQUFTLEVBRVQsUUFBUSxFQUNSLFdBQVcsRUFDWCxTQUFTLEVBQ1osTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDN0QsT0FBTyxFQUFVLG1CQUFtQixFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDL0QsT0FBTyxFQUFFLHlCQUF5QixFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFDM0UsT0FBTyxFQUFFLG1DQUFtQyxFQUFFLE1BQU0sMkNBQTJDLENBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7SUNsQjlGLDRDQUEwSTs7O0lBQWxFLGtEQUEyQixjQUFBOzs7SUFDbkcsNENBQTRHOztJQUF0QywyQkFBYTs7O0lBTTdFLDJCQUNxRjs7OztJQUFuRix3Q0FBc0IscUJBQUE7OztJQUkxQix3QkFBc0c7Ozs7SUFWMUcsMkNBQ3FGLGtCQUFBLGdCQUFBLFdBQUE7SUFHekUsWUFBZ0I7SUFBQSxpQkFBTztJQUM3QiwyRkFDcUY7SUFFckYsZ0NBQWdDO0lBQUEsWUFBa0I7SUFBQSxpQkFBTyxFQUFBO0lBRTNELDJHQUFzRztJQUN4RyxpQkFBTSxFQUFBOzs7OztJQVhnRCxnREFB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XG4gICAgQ29udGVudENoaWxkcmVuLFxyXG4gICAgRXZlbnRFbWl0dGVyLFxyXG4gICAgZm9yd2FyZFJlZixcclxuICAgIEluamVjdCxcclxuICAgIEluamVjdG9yLFxyXG4gICAgSW5wdXQsXHJcbiAgICBPbkNoYW5nZXMsXHJcbiAgICBPcHRpb25hbCxcclxuICAgIE91dHB1dCxcclxuICAgIFF1ZXJ5TGlzdCxcclxuICAgIFNpbXBsZUNoYW5nZXMsXHJcbiAgICBTa2lwU2VsZixcclxuICAgIFRlbXBsYXRlUmVmLFxyXG4gICAgVmlld0NoaWxkXHJcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IENvcmVCYXNlQ29tcG9uZW50IH0gZnJvbSAnLi4vY29tbW9uL2Jhc2UuY29tcG9uZW50JztcclxuaW1wb3J0IHsgTGF5b3V0LCBTTUVfTEFZT1VUX1BST1ZJREVSIH0gZnJvbSAnLi4vY29tbW9uL2xheW91dCc7XHJcbmltcG9ydCB7IFByb3BlcnR5R3JpZEl0ZW1Db21wb25lbnQgfSBmcm9tICcuL3Byb3BlcnR5LWdyaWQtaXRlbS5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBQcm9wZXJ0eUdyaWRSZXNwb25zaXZlV2luZG93TWFuYWdlciB9IGZyb20gJy4vcHJvcGVydHktZ3JpZC1yZXNwb25zaXZlLXdpbmRvdy1tYW5hZ2VyJztcclxuXHJcbi8qKlxyXG4gKiBUaGUgcGFuZSBvcmllbnRhdGlvbiBvZiB0aGUgc3BsaXQgdmlldy5cclxuICovXHJcbmV4cG9ydCB0eXBlIFByb3BlcnR5R3JpZE9yaWVudGF0aW9uID0gJ3ZlcnRpY2FsJyB8ICdob3Jpem9udGFsJztcclxuXHJcbi8qKlxyXG4gKlxyXG4gKiBAc21lRG9jIHtAbGFiZWwgUHJvcGVydHkgR3JpZCBAaWQgc21lLXByb3BlcnR5LWdyaWQtY29tcG9uZW50fVxyXG4gKlxyXG4gKiBAb3ZlcnZpZXdcclxuICogQGZpbGUge0BmaWxlcGF0aCAuL2V4YW1wbGVzL292ZXJ2aWV3Lm1kfVxyXG4gKlxyXG4gKiBAZXhhbXBsZSB7QGxhYmVsIEJhc2ljIFVzYWdlIEBpZCBiYXNpYy11c2FnZX1cclxuICogQGZpbGUge0BmaWxlbmFtZSBjb21wb25lbnQuaHRtbCBAZmlsZXBhdGggLi9leGFtcGxlcy9iYXNpYy11c2FnZS5jb21wb25lbnQuaHRtbH1cclxuICpcclxuICogQGV4YW1wbGUge0BsYWJlbCBWZXJ0aWNhbCBPcmllbnRhdGlvbiBAaWQgdmVydGljYWwtb3JpZW50YXRpb259XHJcbiAqIEBmaWxlIHtAZmlsZW5hbWUgY29tcG9uZW50Lmh0bWwgQGZpbGVwYXRoIC4vZXhhbXBsZXMvdmVydGljYWwtb3JpZW50YXRpb24uY29tcG9uZW50Lmh0bWx9XHJcbiAqXHJcbiAqIEBleGFtcGxlIHtAbGFiZWwgSXRlbSB3aXRoIGEgTGluayBAaWQgbGluay1pdGVtfVxyXG4gKiBAZmlsZSB7QGZpbGVuYW1lIGNvbXBvbmVudC5odG1sIEBmaWxlcGF0aCAuL2V4YW1wbGVzL2xpbmstaXRlbS5jb21wb25lbnQuaHRtbH1cclxuICpcclxuICogQGV4YW1wbGUge0BsYWJlbCBJdGVtIHdpdGggYSBUb29sdGlwIEBpZCB0b29sdGlwLWl0ZW19XHJcbiAqIEBmaWxlIHtAZmlsZW5hbWUgY29tcG9uZW50Lmh0bWwgQGZpbGVwYXRoIC4vZXhhbXBsZXMvdG9vbHRpcC1pdGVtLmNvbXBvbmVudC5odG1sfVxyXG4gKlxyXG4gKiBAZXhhbXBsZSB7QGxhYmVsIEl0ZW0gd2l0aCBhIEFjdGlvbiBAaWQgYWN0aW9uLWl0ZW19XHJcbiAqIEBmaWxlIHtAZmlsZW5hbWUgY29tcG9uZW50LnRzIEBmaWxlcGF0aCAuL2V4YW1wbGVzL2FjdGlvbi1pdGVtLmNvbXBvbmVudC50c31cclxuICogQGZpbGUge0BmaWxlbmFtZSBjb21wb25lbnQuaHRtbCBAZmlsZXBhdGggLi9leGFtcGxlcy9hY3Rpb24taXRlbS5jb21wb25lbnQuaHRtbH1cclxuICpcclxuICogQGV4YW1wbGUge0BsYWJlbCBJdGVtIFNwYW5uaW5nIE11bHRpcGxlIENvbHVtbnMgQGlkIG11bHRpLWNvbHVtbn1cclxuICogQGZpbGUge0BmaWxlbmFtZSBjb21wb25lbnQuaHRtbCBAZmlsZXBhdGggLi9leGFtcGxlcy9tdWx0aS1jb2x1bW4taXRlbS5jb21wb25lbnQuaHRtbH1cclxuICpcclxuICogQGV4YW1wbGUge0BsYWJlbCBJdGVtcyB3aXRoIFN0YXR1cyBhbmQgSWNvbnMgQGlkIHN0YXR1cy1hbmQtaWNvbnN9XHJcbiAqIEBmaWxlIHtAZmlsZW5hbWUgY29tcG9uZW50Lmh0bWwgQGZpbGVwYXRoIC4vZXhhbXBsZXMvc3RhdHVzLWl0ZW0uY29tcG9uZW50Lmh0bWx9XHJcbiAqXHJcbiAqIEBleGFtcGxlIHtAbGFiZWwgSXRlbXMgd2l0aCBjb21wbGV4IHZhbHVlIHR5cGVzIEBpZCBjb21wbGV4LXZhbHVlfVxyXG4gKiBAZmlsZSB7QGZpbGVuYW1lIGNvbXBvbmVudC5odG1sIEBmaWxlcGF0aCAuL2V4YW1wbGVzL2NvbXBsZXgtdmFsdWVzLmNvbXBvbmVudC5odG1sfVxyXG4gKlxyXG4gKi9cclxuQENvbXBvbmVudCh7XHJcbiAgICBzZWxlY3RvcjogJ3NtZS1wcm9wZXJ0eS1ncmlkJyxcclxuICAgIHRlbXBsYXRlVXJsOiAnLi9wcm9wZXJ0eS1ncmlkLmNvbXBvbmVudC5odG1sJyxcclxuICAgIHByb3ZpZGVyczogW1xyXG4gICAgICAgIHsgcHJvdmlkZTogU01FX0xBWU9VVF9QUk9WSURFUiwgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gUHJvcGVydHlHcmlkQ29tcG9uZW50KSB9XHJcbiAgICBdXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBQcm9wZXJ0eUdyaWRDb21wb25lbnQgZXh0ZW5kcyBDb3JlQmFzZUNvbXBvbmVudCBpbXBsZW1lbnRzIExheW91dCwgT25DaGFuZ2VzIHtcclxuICAgIC8qKlxyXG4gICAgICogVGhlIGJhc2ljIGNvbHVtbiB3aWR0aCBmb3IgdGhlIHByb3BlcnR5IGdyaWQgaXRlbXMuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBsYXlvdXRJdGVtV2lkdGggPSAzMDA7XHJcblxyXG4gICAgQENvbnRlbnRDaGlsZHJlbihQcm9wZXJ0eUdyaWRJdGVtQ29tcG9uZW50KVxyXG4gICAgcHVibGljIGl0ZW1zOiBRdWVyeUxpc3Q8UHJvcGVydHlHcmlkSXRlbUNvbXBvbmVudD47XHJcblxyXG4gICAgQFZpZXdDaGlsZCgncmVhZG9ubHlUZW1wbGF0ZScsIHsgc3RhdGljOiB0cnVlIH0pXHJcbiAgICBwdWJsaWMgcmVhZG9ubHlUZW1wbGF0ZTogVGVtcGxhdGVSZWY8UHJvcGVydHlHcmlkSXRlbUNvbXBvbmVudD47XHJcblxyXG4gICAgQFZpZXdDaGlsZCgnYWN0aW9uTGlua1RlbXBsYXRlJywgeyBzdGF0aWM6IHRydWUgfSlcclxuICAgIHB1YmxpYyBhY3Rpb25MaW5rVGVtcGxhdGU6IFRlbXBsYXRlUmVmPFByb3BlcnR5R3JpZEl0ZW1Db21wb25lbnQ+O1xyXG5cclxuICAgIEBWaWV3Q2hpbGQoJ2ludGVybmFsTGlua1RlbXBsYXRlJywgeyBzdGF0aWM6IHRydWUgfSlcclxuICAgIHB1YmxpYyBpbnRlcm5hbExpbmtUZW1wbGF0ZTogVGVtcGxhdGVSZWY8UHJvcGVydHlHcmlkSXRlbUNvbXBvbmVudD47XHJcblxyXG4gICAgQFZpZXdDaGlsZCgnZXh0ZXJuYWxMaW5rVGVtcGxhdGUnLCB7IHN0YXRpYzogdHJ1ZSB9KVxyXG4gICAgcHVibGljIGV4dGVybmFsTGlua1RlbXBsYXRlOiBUZW1wbGF0ZVJlZjxQcm9wZXJ0eUdyaWRJdGVtQ29tcG9uZW50PjtcclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoZSBzb3VyY2UgbmFtZSB0byB1c2UgZm9yIGxvZ2dpbmdcclxuICAgICAqL1xyXG4gICAgcHJvdGVjdGVkIGdldCBsb2dTb3VyY2VOYW1lKCkge1xyXG4gICAgICAgIHJldHVybiAnUHJvcGVydHlHcmlkQ29tcG9uZW50JztcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoZSBvcmllbnRhdGlvbiBmb3IgdGhlIHByb3BlcnR5IGdyaWRcclxuICAgICAqL1xyXG4gICAgQElucHV0KClcclxuICAgIHB1YmxpYyBvcmllbnRhdGlvbjogUHJvcGVydHlHcmlkT3JpZW50YXRpb24gPSAnaG9yaXpvbnRhbCc7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBJbXBsZW1lbnRhdGlvbiBvZiB0aGUgTGF5b3V0IGludGVyZmFjZVxyXG4gICAgICovXHJcbiAgICBAT3V0cHV0KClcclxuICAgIHB1YmxpYyBsYXlvdXRDaGFuZ2VkOiBFdmVudEVtaXR0ZXI8dm9pZD4gPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBJbXBsZW1lbnRhdGlvbiBvZiB0aGUgTGF5b3V0IGludGVyZmFjZVxyXG4gICAgICovXHJcbiAgICBAT3V0cHV0KClcclxuICAgIHB1YmxpYyB3aW5kb3dCcmVha3BvaW50Q2hhbmdlZDogRXZlbnRFbWl0dGVyPHZvaWQ+ID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xyXG5cclxuICAgIHByaXZhdGUgcHJvcGVydHlHcmlkUmVzcG9uc2l2ZVdpbmRvd01hbmFnZXIgPSBuZXcgUHJvcGVydHlHcmlkUmVzcG9uc2l2ZVdpbmRvd01hbmFnZXIoKTtcclxuXHJcbiAgICBjb25zdHJ1Y3RvcihpbmplY3RvcjogSW5qZWN0b3IsIEBTa2lwU2VsZigpIEBPcHRpb25hbCgpIEBJbmplY3QoU01FX0xBWU9VVF9QUk9WSURFUikgbGF5b3V0OiBMYXlvdXQpIHtcclxuICAgICAgICBzdXBlcihpbmplY3Rvcik7XHJcbiAgICAgICAgLy8gb2xkIHN0eWxlIHN1cHBvcnRlZCBzbWUtcHJvcGVydHktZ3JpZC1hcnJhbmdlLXZlcnRpY2FsIGNsYXNzLiBkZWZhdWx0IHRvIHZlcnRpY2FsIG9yaWVudGF0aW9uIGlmIHRoaXMgY2xhc3MgaXMgYXBwbGllZC5cclxuICAgICAgICBjb25zdCBoYXNWZXJ0aWNhbENsYXNzID0gKDxIVE1MRWxlbWVudD50aGlzLmhvc3RFbGVtZW50Lm5hdGl2ZUVsZW1lbnQpLmNsYXNzTGlzdC5jb250YWlucygnc21lLXByb3BlcnR5LWdyaWQtYXJyYW5nZS12ZXJ0aWNhbCcpO1xyXG4gICAgICAgIHRoaXMub3JpZW50YXRpb24gPSBoYXNWZXJ0aWNhbENsYXNzID8gJ3ZlcnRpY2FsJyA6ICdob3Jpem9udGFsJztcclxuXHJcbiAgICAgICAgLy8gb24gcGFyZW50IGxheW91dCBjaGFuZ2VzLCByZS1lbWl0IHRoZSBsYXlvdXQgY2hhbmdlIHRvIG91ciBldmVudFxyXG4gICAgICAgIGlmIChsYXlvdXQpIHtcclxuICAgICAgICAgICAgdGhpcy5zdWJzY3JpcHRpb25zLnB1c2goXHJcbiAgICAgICAgICAgICAgICBsYXlvdXQubGF5b3V0Q2hhbmdlZC5zdWJzY3JpYmUoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMubGF5b3V0Q2hhbmdlZC5lbWl0KCk7XHJcbiAgICAgICAgICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucHJvcGVydHlHcmlkUmVzcG9uc2l2ZVdpbmRvd01hbmFnZXIub25XaW5kb3dTaXplQ2hhbmdlZCh0aGlzLmhvc3RFbGVtZW50Lm5hdGl2ZUVsZW1lbnQpO1xyXG4gICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHN0cmluZ2lmeVZhbHVlKHZhbHVlOiBhbnkpIHtcclxuICAgICAgICBpZiAoTXNmdFNtZS5pc051bGxPcldoaXRlU3BhY2UodmFsdWUpKSB7XHJcbiAgICAgICAgICAgIHJldHVybiAnLSc7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xyXG4gICAgICAgICAgICByZXR1cm4gdmFsdWUubWFwKHYgPT4gdGhpcy5zdHJpbmdpZnlWYWx1ZSh2KSkuam9pbignLFxcbicpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoTXNmdFNtZS5pc09iamVjdCh2YWx1ZSkpIHtcclxuICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBKU09OLnN0cmluZ2lmeSh2YWx1ZSwgbnVsbCwgMik7XHJcbiAgICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGAke3ZhbHVlfWA7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldFRlbXBsYXRlKGl0ZW06IFByb3BlcnR5R3JpZEl0ZW1Db21wb25lbnQpIHtcclxuICAgICAgICBpZiAoaXRlbS5hY3Rpb24pIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuYWN0aW9uTGlua1RlbXBsYXRlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoaXRlbS5saW5rKSB7XHJcbiAgICAgICAgICAgIGlmIChpdGVtLmlzRXh0ZXJuYWxMaW5rKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5leHRlcm5hbExpbmtUZW1wbGF0ZTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmludGVybmFsTGlua1RlbXBsYXRlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB0aGlzLnJlYWRvbmx5VGVtcGxhdGU7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpIHtcclxuICAgICAgICBzdXBlci5uZ09uQ2hhbmdlcyhjaGFuZ2VzKTtcclxuICAgICAgICBpZiAoY2hhbmdlcy5vcmllbnRhdGlvbikge1xyXG4gICAgICAgICAgICB0aGlzLmxheW91dENoYW5nZWQuZW1pdCgpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEl0IGhhbmRsZXMgdGhlIHVuZGVmaW5lZCB2YWx1ZSB3b24ndCBiZSB1cGRhdGVkIHNpdHVhdGlvbiBmb3IgYXN5bmMgcHJvcGVydHkgaXRlbS5cclxuICAgICAqIEFuZ3VsYXIgaXNzdWUgdGhhdCB0aGUgcHJvcGVydHkgaXRlbSB2YWx1ZSBpbml0aWFsaXplZCB3aXRoIHVuZGVmaW5lZCwgaWYgYWZ0ZXIgYXN5bmMgdGltZSwgdGhlIHZhbHVlIGJlaW5nIHNldCBpcyBzdGlsbCB1bmRlZmluZWQsXHJcbiAgICAgKiBBbmd1bGFyIHdpbGwgbm90IGJlIGFibGUgdG8gdHJpZ2dlciB0aGUgdmFsdWUgb24gY2hhbmdlZCBldmVudC4gVGh1cyB3ZSBoYXZlIHRvIG1hbnVhbGx5IGNhbGwgdG8gcmVmcmVzaCBpdC5cclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0gaW5kZXggVGhlIGluZGV4IHRoYXQgbmVlZHMgdG8gaGFyZCByZWZyZXNoLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgaGFyZFJlZnJlc2hJdGVtKGluZGV4OiBudW1iZXIpOiB2b2lkIHtcclxuICAgICAgICBpZiAoIXRoaXMuaXRlbXMpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3QgaXRlbXMgPSB0aGlzLml0ZW1zLnRvQXJyYXkoKTtcclxuICAgICAgICBpZiAoIWl0ZW1zW2luZGV4XSkge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCBpdGVtID0gaXRlbXNbaW5kZXhdO1xyXG4gICAgICAgIGlmIChpdGVtLmlzQXN5bmMgJiYgaXRlbS52YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIGl0ZW0ubG9hZGluZyA9IGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0SW50ZXJuYWxMaW5rRGVzY3JpcHRpb24oaXRlbTogUHJvcGVydHlHcmlkSXRlbUNvbXBvbmVudCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLnN0cmluZ3MuTXNmdFNtZVNoZWxsLkFuZ3VsYXIuUHJvcGVydHlHcmlkLkludGVybmFsTGluay5sYWJlbC5mb3JtYXQoaXRlbS5saW5rKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0RXh0ZXJuYWxMaW5rRGVzY3JpcHRpb24oaXRlbTogUHJvcGVydHlHcmlkSXRlbUNvbXBvbmVudCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLnN0cmluZ3MuTXNmdFNtZVNoZWxsLkFuZ3VsYXIuUHJvcGVydHlHcmlkLkV4dGVybmFsTGluay5sYWJlbC5mb3JtYXQoaXRlbS5saW5rKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIENyZWF0ZXMgdGhlIGlkQmFnIHVzZWQgYnkgdGhpcyBjb21wb25lbnQgdG8gc3RvcmUgdW5pcXVlIGVsZW1lbnQgaWRzLlxyXG4gICAgICogaWQgdmFsdWVzIHdpbGwgYmUgYXNzaWduZWQgYmUgdGhlIEBzZWUgQmFzZUNvbXBvbmVudCBzdXBlciBjbGFzcy5cclxuICAgICAqL1xyXG4gICAgcHJvdGVjdGVkIGNyZWF0ZUlkQmFnKCk6IE1zZnRTbWUuU3RyaW5nTWFwPHN0cmluZz4ge1xyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgIGRldGFpbHNTcGFuOiAnJyxcclxuICAgICAgICAgICAgbGFiZWxTcGFuOiAnJyxcclxuICAgICAgICAgICAgdmFsdWVTcGFuOiAnJ1xyXG4gICAgICAgIH07XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBHZXRzIHRoZSBpbml0aWFsIGhvc3QgY2xhc3NlcyB0byBiZSBhcHBsaWVkIHRvIHRoaXMgZWxlbWVudFxyXG4gICAgICovXHJcbiAgICBwcm90ZWN0ZWQgZ2V0SW5pdGlhbEhvc3RDbGFzc2VzKCkge1xyXG4gICAgICAgIHJldHVybiBzdXBlci5nZXRJbml0aWFsSG9zdENsYXNzZXMoKS5jb25jYXQoW1xyXG4gICAgICAgICAgICAnc21lLXByb3BlcnR5LWdyaWQnLFxyXG4gICAgICAgICAgICAnc21lLWxheW91dC1yZWxhdGl2ZScsXHJcbiAgICAgICAgICAgICdzbWUtZm9jdXMtem9uZSdcclxuICAgICAgICBdKTtcclxuICAgIH1cclxufVxyXG4iLCI8c21lLWxheW91dCAjbGF5b3V0IFtwYWRMYXN0SXRlbV09XCJ0cnVlXCIgY2xhc3M9XCJzbWUtcG9zaXRpb24taW5zZXQtbm9uZSBzbWUtcG9zaXRpb24tc3RyZXRjaC1oXCIgW29uZUNvbHVtbl09XCJvcmllbnRhdGlvbiA9PT0gJ3ZlcnRpY2FsJ1wiPlxyXG4gIDxzbWUtbGF5b3V0LWRlZmluaXRpb24gbmFtZT1cIm5hcnJvd1wiIFt1bnRpbF09XCJsYXlvdXRJdGVtV2lkdGhcIiBbY29sdW1uc109XCIxXCI+PC9zbWUtbGF5b3V0LWRlZmluaXRpb24+XHJcbiAgPHNtZS1sYXlvdXQtZGVmaW5pdGlvbiAqbmdJZj1cIm9yaWVudGF0aW9uICE9PSAndmVydGljYWwnXCIgbmFtZT1cIm1lZGl1bVwiIFt1bnRpbF09XCJsYXlvdXRJdGVtV2lkdGgqMlwiIFtjb2x1bW5zXT1cIjJcIj48L3NtZS1sYXlvdXQtZGVmaW5pdGlvbj5cclxuICA8c21lLWxheW91dC1kZWZpbml0aW9uICpuZ0lmPVwib3JpZW50YXRpb24gIT09ICd2ZXJ0aWNhbCdcIiBuYW1lPVwid2lkZVwiIFtjb2x1bW5zXT1cIjNcIj48L3NtZS1sYXlvdXQtZGVmaW5pdGlvbj5cclxuICA8c21lLWxheW91dC1pdGVtICpuZ0Zvcj1cImxldCBpdGVtIG9mIGl0ZW1zOyBpbmRleCBhcyBpXCIgW2NvbHVtblNwYW5dPVwiaXRlbS5jb2x1bW5TcGFuXCJcclxuICAgIFttYXhXaWR0aF09XCJvcmllbnRhdGlvbiA9PT0gJ3ZlcnRpY2FsJyA/IG51bGwgOiBpdGVtLmNvbHVtblNwYW4gKiBsYXlvdXRJdGVtV2lkdGhcIj5cclxuICAgIDxkaXYgY2xhc3M9XCJzbWUtcHJvcGVydHktZ3JpZC1pdGVtXCIgdGFiaW5kZXg9XCIwXCIgYXJpYS1saXZlPVwicG9saXRlXCIgYXJpYS1hdG9taWM9XCJ0cnVlXCIgI3pvbmU9XCJzbWVUb29sdGlwWm9uZVwiIHNtZVRvb2x0aXBab25lPlxyXG4gICAgICA8bGFiZWwgY2xhc3M9XCJzbWUtYXJyYW5nZS1zdGFjay1oXCI+XHJcbiAgICAgICAgPHNwYW4+e