ng-prime-tools
Version:
An advanced PrimeNG table for Angular
93 lines • 16 kB
JavaScript
import { Component, Input } from '@angular/core';
import * as i0 from "@angular/core";
import * as i1 from "@angular/router";
import * as i2 from "@angular/common";
import * as i3 from "../pt-card/pt-card.component";
export class PTMetricPanelComponent {
constructor(router) {
this.router = router;
this.cardConfig = this.getDefaultCardConfig();
}
ngOnInit() { }
getDefaultCardConfig() {
return {
backgroundColor: '#fff',
borderColor: '#ddd',
borderWidth: '1px',
padding: '20px',
margin: '10px 0',
borderRadius: '8px',
boxShadow: '0 4px 6px rgba(0, 0, 0, 0.1)',
};
}
getTitleText() {
return typeof this.panelData.title === 'object'
? this.panelData.title.text
: this.panelData.title || '';
}
getTitleStyles() {
if (typeof this.panelData.title === 'object') {
return {
color: this.panelData.title.color || '#333',
fontSize: this.panelData.title.fontSize || '1.5rem',
textAlign: this.panelData.title.position || 'left',
};
}
return {};
}
getIconClass(icon) {
return icon ? icon : '';
}
getIconStyles(icon) {
if (typeof icon === 'object') {
return {
color: icon.color || '#333',
fontSize: icon.fontSize || '1.2rem',
backgroundColor: icon.backgroundColor || 'transparent',
borderRadius: icon.shape === 'circular' ? '50%' : '8px',
padding: '6px',
display: 'inline-block',
};
}
return {};
}
getValueStyles(value) {
if (typeof value === 'object' && 'text' in value) {
return {
color: value.color || '#2d3748',
fontSize: value.fontSize || '1rem',
fontWeight: value.fontWeight || 'bold',
};
}
return {};
}
isTitleObject() {
return typeof this.panelData.title === 'object';
}
getTitleIcon() {
if (this.isTitleObject()) {
const icon = this.panelData.title.icon;
return typeof icon === 'string' ? icon : icon?.code;
}
return undefined;
}
isTitleStyle(value) {
return typeof value === 'object' && value !== null && 'text' in value;
}
handleClick(url) {
if (url) {
this.router.navigate([url]);
}
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.11", ngImport: i0, type: PTMetricPanelComponent, deps: [{ token: i1.Router }], target: i0.ɵɵFactoryTarget.Component }); }
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.11", type: PTMetricPanelComponent, selector: "pt-metric-panel", inputs: { panelData: "panelData", cardConfig: "cardConfig" }, ngImport: i0, template: "<pt-card [config]=\"cardConfig\">\n <!-- Panel Title -->\n <div class=\"panel-header\" [ngStyle]=\"getTitleStyles()\">\n <i\n *ngIf=\"getTitleIcon()\"\n [ngClass]=\"getIconClass(getTitleIcon())\"\n [ngStyle]=\"getIconStyles(getTitleIcon())\"\n ></i>\n <span>{{ getTitleText() }}</span>\n </div>\n\n <hr />\n\n <!-- Metric Indicators -->\n <div class=\"metric-list\">\n <div\n *ngFor=\"let item of panelData.indicators\"\n class=\"metric-item\"\n [ngStyle]=\"{ cursor: item?.url ? 'pointer' : 'default' }\"\n (click)=\"handleClick(item?.url)\"\n [attr.title]=\"item?.url ? 'Go to ' + item.url : ''\"\n >\n <i\n *ngIf=\"item.icon\"\n [ngClass]=\"getIconClass(item.icon.code)\"\n [ngStyle]=\"getIconStyles(item.icon)\"\n ></i>\n <span class=\"metric-title\">\n {{ isTitleStyle(item.title) ? item.title.text : item.title }}\n </span>\n\n <span class=\"metric-value\" [ngStyle]=\"getValueStyles(item.value)\">\n {{ isTitleStyle(item.value) ? item.value.text : item.value }}\n </span>\n </div>\n </div>\n</pt-card>\n", styles: [".panel-header{display:flex;align-items:center;font-size:1.3rem;font-weight:700;color:#333;gap:10px}hr{border:0;height:1px;background:#ddd;margin:10px 0}.metric-list{display:flex;flex-direction:column;gap:12px}.metric-item{display:flex;justify-content:space-between;align-items:center;padding:8px;border-radius:5px;background:#fff;transition:.3s ease-in-out}.metric-item:hover{background:#f1f1f1}.metric-title{flex-grow:1;font-size:1rem;color:#333}.metric-value{font-size:1rem;font-weight:700;color:#2d3748}.metric-item[ngStyle]{cursor:pointer}\n"], dependencies: [{ kind: "directive", type: i2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "component", type: i3.PTCardComponent, selector: "pt-card", inputs: ["config"] }] }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.11", ngImport: i0, type: PTMetricPanelComponent, decorators: [{
type: Component,
args: [{ selector: 'pt-metric-panel', template: "<pt-card [config]=\"cardConfig\">\n <!-- Panel Title -->\n <div class=\"panel-header\" [ngStyle]=\"getTitleStyles()\">\n <i\n *ngIf=\"getTitleIcon()\"\n [ngClass]=\"getIconClass(getTitleIcon())\"\n [ngStyle]=\"getIconStyles(getTitleIcon())\"\n ></i>\n <span>{{ getTitleText() }}</span>\n </div>\n\n <hr />\n\n <!-- Metric Indicators -->\n <div class=\"metric-list\">\n <div\n *ngFor=\"let item of panelData.indicators\"\n class=\"metric-item\"\n [ngStyle]=\"{ cursor: item?.url ? 'pointer' : 'default' }\"\n (click)=\"handleClick(item?.url)\"\n [attr.title]=\"item?.url ? 'Go to ' + item.url : ''\"\n >\n <i\n *ngIf=\"item.icon\"\n [ngClass]=\"getIconClass(item.icon.code)\"\n [ngStyle]=\"getIconStyles(item.icon)\"\n ></i>\n <span class=\"metric-title\">\n {{ isTitleStyle(item.title) ? item.title.text : item.title }}\n </span>\n\n <span class=\"metric-value\" [ngStyle]=\"getValueStyles(item.value)\">\n {{ isTitleStyle(item.value) ? item.value.text : item.value }}\n </span>\n </div>\n </div>\n</pt-card>\n", styles: [".panel-header{display:flex;align-items:center;font-size:1.3rem;font-weight:700;color:#333;gap:10px}hr{border:0;height:1px;background:#ddd;margin:10px 0}.metric-list{display:flex;flex-direction:column;gap:12px}.metric-item{display:flex;justify-content:space-between;align-items:center;padding:8px;border-radius:5px;background:#fff;transition:.3s ease-in-out}.metric-item:hover{background:#f1f1f1}.metric-title{flex-grow:1;font-size:1rem;color:#333}.metric-value{font-size:1rem;font-weight:700;color:#2d3748}.metric-item[ngStyle]{cursor:pointer}\n"] }]
}], ctorParameters: () => [{ type: i1.Router }], propDecorators: { panelData: [{
type: Input
}], cardConfig: [{
type: Input
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHQtbWV0cmljLXBhbmVsLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25nLXByaW1lLXRvb2xzL3NyYy9saWIvcHQtbWV0cmljLXBhbmVsL3B0LW1ldHJpYy1wYW5lbC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZy1wcmltZS10b29scy9zcmMvbGliL3B0LW1ldHJpYy1wYW5lbC9wdC1tZXRyaWMtcGFuZWwuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQVUsTUFBTSxlQUFlLENBQUM7Ozs7O0FBVXpELE1BQU0sT0FBTyxzQkFBc0I7SUFJakMsWUFBb0IsTUFBYztRQUFkLFdBQU0sR0FBTixNQUFNLENBQVE7UUFGekIsZUFBVSxHQUFlLElBQUksQ0FBQyxvQkFBb0IsRUFBRSxDQUFDO0lBRXpCLENBQUM7SUFFdEMsUUFBUSxLQUFVLENBQUM7SUFFbkIsb0JBQW9CO1FBQ2xCLE9BQU87WUFDTCxlQUFlLEVBQUUsTUFBTTtZQUN2QixXQUFXLEVBQUUsTUFBTTtZQUNuQixXQUFXLEVBQUUsS0FBSztZQUNsQixPQUFPLEVBQUUsTUFBTTtZQUNmLE1BQU0sRUFBRSxRQUFRO1lBQ2hCLFlBQVksRUFBRSxLQUFLO1lBQ25CLFNBQVMsRUFBRSw4QkFBOEI7U0FDMUMsQ0FBQztJQUNKLENBQUM7SUFFRCxZQUFZO1FBQ1YsT0FBTyxPQUFPLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxLQUFLLFFBQVE7WUFDN0MsQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLElBQUk7WUFDM0IsQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxJQUFJLEVBQUUsQ0FBQztJQUNqQyxDQUFDO0lBRUQsY0FBYztRQUNaLElBQUksT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssS0FBSyxRQUFRLEVBQUUsQ0FBQztZQUM3QyxPQUFPO2dCQUNMLEtBQUssRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxLQUFLLElBQUksTUFBTTtnQkFDM0MsUUFBUSxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLFFBQVEsSUFBSSxRQUFRO2dCQUNuRCxTQUFTLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsUUFBUSxJQUFJLE1BQU07YUFDbkQsQ0FBQztRQUNKLENBQUM7UUFDRCxPQUFPLEVBQUUsQ0FBQztJQUNaLENBQUM7SUFFRCxZQUFZLENBQUMsSUFBYTtRQUN4QixPQUFPLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7SUFDMUIsQ0FBQztJQUVELGFBQWEsQ0FBQyxJQUFVO1FBQ3RCLElBQUksT0FBTyxJQUFJLEtBQUssUUFBUSxFQUFFLENBQUM7WUFDN0IsT0FBTztnQkFDTCxLQUFLLEVBQUUsSUFBSSxDQUFDLEtBQUssSUFBSSxNQUFNO2dCQUMzQixRQUFRLEVBQUUsSUFBSSxDQUFDLFFBQVEsSUFBSSxRQUFRO2dCQUNuQyxlQUFlLEVBQUUsSUFBSSxDQUFDLGVBQWUsSUFBSSxhQUFhO2dCQUN0RCxZQUFZLEVBQUUsSUFBSSxDQUFDLEtBQUssS0FBSyxVQUFVLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSztnQkFDdkQsT0FBTyxFQUFFLEtBQUs7Z0JBQ2QsT0FBTyxFQUFFLGNBQWM7YUFDeEIsQ0FBQztRQUNKLENBQUM7UUFDRCxPQUFPLEVBQUUsQ0FBQztJQUNaLENBQUM7SUFFRCxjQUFjLENBQUMsS0FBVTtRQUN2QixJQUFJLE9BQU8sS0FBSyxLQUFLLFFBQVEsSUFBSSxNQUFNLElBQUksS0FBSyxFQUFFLENBQUM7WUFDakQsT0FBTztnQkFDTCxLQUFLLEVBQUUsS0FBSyxDQUFDLEtBQUssSUFBSSxTQUFTO2dCQUMvQixRQUFRLEVBQUUsS0FBSyxDQUFDLFFBQVEsSUFBSSxNQUFNO2dCQUNsQyxVQUFVLEVBQUUsS0FBSyxDQUFDLFVBQVUsSUFBSSxNQUFNO2FBQ3ZDLENBQUM7UUFDSixDQUFDO1FBQ0QsT0FBTyxFQUFFLENBQUM7SUFDWixDQUFDO0lBRUQsYUFBYTtRQUNYLE9BQU8sT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssS0FBSyxRQUFRLENBQUM7SUFDbEQsQ0FBQztJQUVELFlBQVk7UUFDVixJQUFJLElBQUksQ0FBQyxhQUFhLEVBQUUsRUFBRSxDQUFDO1lBQ3pCLE1BQU0sSUFBSSxHQUFJLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBb0IsQ0FBQyxJQUFJLENBQUM7WUFDdkQsT0FBTyxPQUFPLElBQUksS0FBSyxRQUFRLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQztRQUN0RCxDQUFDO1FBQ0QsT0FBTyxTQUFTLENBQUM7SUFDbkIsQ0FBQztJQUVELFlBQVksQ0FBQyxLQUFVO1FBQ3JCLE9BQU8sT0FBTyxLQUFLLEtBQUssUUFBUSxJQUFJLEtBQUssS0FBSyxJQUFJLElBQUksTUFBTSxJQUFJLEtBQUssQ0FBQztJQUN4RSxDQUFDO0lBRUQsV0FBVyxDQUFDLEdBQVk7UUFDdEIsSUFBSSxHQUFHLEVBQUUsQ0FBQztZQUNSLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztRQUM5QixDQUFDO0lBQ0gsQ0FBQzsrR0F0RlUsc0JBQXNCO21HQUF0QixzQkFBc0IscUhDVm5DLHNuQ0FxQ0E7OzRGRDNCYSxzQkFBc0I7a0JBTGxDLFNBQVM7K0JBQ0UsaUJBQWlCOzJFQUtsQixTQUFTO3NCQUFqQixLQUFLO2dCQUNHLFVBQVU7c0JBQWxCLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIElucHV0LCBPbkluaXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IE1ldHJpY1BhbmVsRGF0YSB9IGZyb20gJy4uL21vZGVscy9tZXRyaWMtcGFuZWwtZGF0YS5tb2RlbCc7XG5pbXBvcnQgeyBDYXJkQ29uZmlnLCBUaXRsZVN0eWxlIH0gZnJvbSAnLi4vbW9kZWxzJztcbmltcG9ydCB7IFJvdXRlciB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3B0LW1ldHJpYy1wYW5lbCcsXG4gIHRlbXBsYXRlVXJsOiAnLi9wdC1tZXRyaWMtcGFuZWwuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9wdC1tZXRyaWMtcGFuZWwuY29tcG9uZW50LmNzcyddLFxufSlcbmV4cG9ydCBjbGFzcyBQVE1ldHJpY1BhbmVsQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcbiAgQElucHV0KCkgcGFuZWxEYXRhITogTWV0cmljUGFuZWxEYXRhO1xuICBASW5wdXQoKSBjYXJkQ29uZmlnOiBDYXJkQ29uZmlnID0gdGhpcy5nZXREZWZhdWx0Q2FyZENvbmZpZygpO1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgcm91dGVyOiBSb3V0ZXIpIHt9XG5cbiAgbmdPbkluaXQoKTogdm9pZCB7fVxuXG4gIGdldERlZmF1bHRDYXJkQ29uZmlnKCk6IENhcmRDb25maWcge1xuICAgIHJldHVybiB7XG4gICAgICBiYWNrZ3JvdW5kQ29sb3I6ICcjZmZmJyxcbiAgICAgIGJvcmRlckNvbG9yOiAnI2RkZCcsXG4gICAgICBib3JkZXJXaWR0aDogJzFweCcsXG4gICAgICBwYWRkaW5nOiAnMjBweCcsXG4gICAgICBtYXJnaW46ICcxMHB4IDAnLFxuICAgICAgYm9yZGVyUmFkaXVzOiAnOHB4JyxcbiAgICAgIGJveFNoYWRvdzogJzAgNHB4IDZweCByZ2JhKDAsIDAsIDAsIDAuMSknLFxuICAgIH07XG4gIH1cblxuICBnZXRUaXRsZVRleHQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdHlwZW9mIHRoaXMucGFuZWxEYXRhLnRpdGxlID09PSAnb2JqZWN0J1xuICAgICAgPyB0aGlzLnBhbmVsRGF0YS50aXRsZS50ZXh0XG4gICAgICA6IHRoaXMucGFuZWxEYXRhLnRpdGxlIHx8ICcnO1xuICB9XG5cbiAgZ2V0VGl0bGVTdHlsZXMoKSB7XG4gICAgaWYgKHR5cGVvZiB0aGlzLnBhbmVsRGF0YS50aXRsZSA9PT0gJ29iamVjdCcpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGNvbG9yOiB0aGlzLnBhbmVsRGF0YS50aXRsZS5jb2xvciB8fCAnIzMzMycsXG4gICAgICAgIGZvbnRTaXplOiB0aGlzLnBhbmVsRGF0YS50aXRsZS5mb250U2l6ZSB8fCAnMS41cmVtJyxcbiAgICAgICAgdGV4dEFsaWduOiB0aGlzLnBhbmVsRGF0YS50aXRsZS5wb3NpdGlvbiB8fCAnbGVmdCcsXG4gICAgICB9O1xuICAgIH1cbiAgICByZXR1cm4ge307XG4gIH1cblxuICBnZXRJY29uQ2xhc3MoaWNvbj86IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGljb24gPyBpY29uIDogJyc7XG4gIH1cblxuICBnZXRJY29uU3R5bGVzKGljb24/OiBhbnkpIHtcbiAgICBpZiAodHlwZW9mIGljb24gPT09ICdvYmplY3QnKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBjb2xvcjogaWNvbi5jb2xvciB8fCAnIzMzMycsXG4gICAgICAgIGZvbnRTaXplOiBpY29uLmZvbnRTaXplIHx8ICcxLjJyZW0nLFxuICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6IGljb24uYmFja2dyb3VuZENvbG9yIHx8ICd0cmFuc3BhcmVudCcsXG4gICAgICAgIGJvcmRlclJhZGl1czogaWNvbi5zaGFwZSA9PT0gJ2NpcmN1bGFyJyA/ICc1MCUnIDogJzhweCcsXG4gICAgICAgIHBhZGRpbmc6ICc2cHgnLFxuICAgICAgICBkaXNwbGF5OiAnaW5saW5lLWJsb2NrJyxcbiAgICAgIH07XG4gICAgfVxuICAgIHJldHVybiB7fTtcbiAgfVxuXG4gIGdldFZhbHVlU3R5bGVzKHZhbHVlOiBhbnkpIHtcbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiAndGV4dCcgaW4gdmFsdWUpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGNvbG9yOiB2YWx1ZS5jb2xvciB8fCAnIzJkMzc0OCcsXG4gICAgICAgIGZvbnRTaXplOiB2YWx1ZS5mb250U2l6ZSB8fCAnMXJlbScsXG4gICAgICAgIGZvbnRXZWlnaHQ6IHZhbHVlLmZvbnRXZWlnaHQgfHwgJ2JvbGQnLFxuICAgICAgfTtcbiAgICB9XG4gICAgcmV0dXJuIHt9O1xuICB9XG5cbiAgaXNUaXRsZU9iamVjdCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdHlwZW9mIHRoaXMucGFuZWxEYXRhLnRpdGxlID09PSAnb2JqZWN0JztcbiAgfVxuXG4gIGdldFRpdGxlSWNvbigpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIGlmICh0aGlzLmlzVGl0bGVPYmplY3QoKSkge1xuICAgICAgY29uc3QgaWNvbiA9ICh0aGlzLnBhbmVsRGF0YS50aXRsZSBhcyBUaXRsZVN0eWxlKS5pY29uO1xuICAgICAgcmV0dXJuIHR5cGVvZiBpY29uID09PSAnc3RyaW5nJyA/IGljb24gOiBpY29uPy5jb2RlO1xuICAgIH1cbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgaXNUaXRsZVN0eWxlKHZhbHVlOiBhbnkpOiB2YWx1ZSBpcyBUaXRsZVN0eWxlIHtcbiAgICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiB2YWx1ZSAhPT0gbnVsbCAmJiAndGV4dCcgaW4gdmFsdWU7XG4gIH1cblxuICBoYW5kbGVDbGljayh1cmw/OiBzdHJpbmcpIHtcbiAgICBpZiAodXJsKSB7XG4gICAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbdXJsXSk7XG4gICAgfVxuICB9XG59XG4iLCI8cHQtY2FyZCBbY29uZmlnXT1cImNhcmRDb25maWdcIj5cbiAgPCEtLSBQYW5lbCBUaXRsZSAtLT5cbiAgPGRpdiBjbGFzcz1cInBhbmVsLWhlYWRlclwiIFtuZ1N0eWxlXT1cImdldFRpdGxlU3R5bGVzKClcIj5cbiAgICA8aVxuICAgICAgKm5nSWY9XCJnZXRUaXRsZUljb24oKVwiXG4gICAgICBbbmdDbGFzc109XCJnZXRJY29uQ2xhc3MoZ2V0VGl0bGVJY29uKCkpXCJcbiAgICAgIFtuZ1N0eWxlXT1cImdldEljb25TdHlsZXMoZ2V0VGl0bGVJY29uKCkpXCJcbiAgICA+PC9pPlxuICAgIDxzcGFuPnt7IGdldFRpdGxlVGV4dCgpIH19PC9zcGFuPlxuICA8L2Rpdj5cblxuICA8aHIgLz5cblxuICA8IS0tIE1ldHJpYyBJbmRpY2F0b3JzIC0tPlxuICA8ZGl2IGNsYXNzPVwibWV0cmljLWxpc3RcIj5cbiAgICA8ZGl2XG4gICAgICAqbmdGb3I9XCJsZXQgaXRlbSBvZiBwYW5lbERhdGEuaW5kaWNhdG9yc1wiXG4gICAgICBjbGFzcz1cIm1ldHJpYy1pdGVtXCJcbiAgICAgIFtuZ1N0eWxlXT1cInsgY3Vyc29yOiBpdGVtPy51cmwgPyAncG9pbnRlcicgOiAnZGVmYXVsdCcgfVwiXG4gICAgICAoY2xpY2spPVwiaGFuZGxlQ2xpY2soaXRlbT8udXJsKVwiXG4gICAgICBbYXR0ci50aXRsZV09XCJpdGVtPy51cmwgPyAnR28gdG8gJyArIGl0ZW0udXJsIDogJydcIlxuICAgID5cbiAgICAgIDxpXG4gICAgICAgICpuZ0lmPVwiaXRlbS5pY29uXCJcbiAgICAgICAgW25nQ2xhc3NdPVwiZ2V0SWNvbkNsYXNzKGl0ZW0uaWNvbi5jb2RlKVwiXG4gICAgICAgIFtuZ1N0eWxlXT1cImdldEljb25TdHlsZXMoaXRlbS5pY29uKVwiXG4gICAgICA+PC9pPlxuICAgICAgPHNwYW4gY2xhc3M9XCJtZXRyaWMtdGl0bGVcIj5cbiAgICAgICAge3sgaXNUaXRsZVN0eWxlKGl0ZW0udGl0bGUpID8gaXRlbS50aXRsZS50ZXh0IDogaXRlbS50aXRsZSB9fVxuICAgICAgPC9zcGFuPlxuXG4gICAgICA8c3BhbiBjbGFzcz1cIm1ldHJpYy12YWx1ZVwiIFtuZ1N0eWxlXT1cImdldFZhbHVlU3R5bGVzKGl0ZW0udmFsdWUpXCI+XG4gICAgICAgIHt7IGlzVGl0bGVTdHlsZShpdGVtLnZhbHVlKSA/IGl0ZW0udmFsdWUudGV4dCA6IGl0ZW0udmFsdWUgfX1cbiAgICAgIDwvc3Bhbj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG48L3B0LWNhcmQ+XG4iXX0=