UNPKG

ng-prime-tools

Version:

An advanced PrimeNG table for Angular

250 lines 43.1 kB
import { Component, Input, Output, EventEmitter, } from '@angular/core'; import { ConfirmationService, ConfirmEventType, MessageService, } from 'primeng/api'; import { SeverityEnum } from '../enums'; import * as i0 from "@angular/core"; import * as i1 from "primeng/api"; import * as i2 from "@angular/common"; import * as i3 from "primeng/confirmdialog"; // Default Styles for Different Dialog Types const DIALOG_STYLES = { [SeverityEnum.WARNING]: { header: { text: 'Warning', color: '#d98300' }, content: { text: 'This is a warning message!', color: '#d98300' }, confirmButtonConfig: { backgroundColor: '#d98300', fontColor: '#fff' }, cancelButtonConfig: { backgroundColor: '#6c757d', fontColor: '#fff' }, }, [SeverityEnum.SUCCESS]: { header: { text: 'Success', color: '#28a745' }, content: { text: 'Operation was successful!', color: '#28a745' }, confirmButtonConfig: { backgroundColor: '#28a745', fontColor: '#fff' }, cancelButtonConfig: { backgroundColor: '#6c757d', fontColor: '#fff' }, }, [SeverityEnum.DANGER]: { header: { text: 'Error', color: '#dc3545' }, content: { text: 'An error occurred!', color: '#dc3545' }, confirmButtonConfig: { backgroundColor: '#dc3545', fontColor: '#fff' }, cancelButtonConfig: { backgroundColor: '#6c757d', fontColor: '#fff' }, }, [SeverityEnum.INFO]: { header: { text: 'Information', color: '#007bff' }, content: { text: 'Here is some important information.', color: '#007bff' }, confirmButtonConfig: { backgroundColor: '#007bff', fontColor: '#fff' }, cancelButtonConfig: { backgroundColor: '#6c757d', fontColor: '#fff' }, }, }; // Centralized Default Values const DEFAULT_DIALOG_CONFIG = { header: { text: 'Confirmation' }, visible: false, width: '400px', height: 'auto', content: 'Do you want to proceed?', confirmButtonConfig: { label: 'Confirm', fontColor: '#fff', backgroundColor: '#007bff', }, cancelButtonConfig: { label: 'Cancel', fontColor: '#fff', backgroundColor: '#6c757d', }, dialogStyle: SeverityEnum.INFO, }; export class PTDialogComponent { constructor(confirmationService, messageService, renderer, el) { this.confirmationService = confirmationService; this.messageService = messageService; this.renderer = renderer; this.el = el; this.dialogConfig = { ...DEFAULT_DIALOG_CONFIG }; this.confirm = new EventEmitter(); this.cancel = new EventEmitter(); } ngOnChanges(changes) { if (changes['dialogConfig']) { if (changes['dialogConfig'].currentValue?.dialogStyle !== changes['dialogConfig'].previousValue?.dialogStyle) { this.applyDialogStyle(); } if (this.dialogConfig.visible) { this.showDialog(); } } } applyDialogStyle() { const dialogStyle = this.dialogConfig.dialogStyle || SeverityEnum.INFO; const styleConfig = DIALOG_STYLES[dialogStyle] || {}; this.dialogConfig = { ...DEFAULT_DIALOG_CONFIG, ...styleConfig, confirmButtonConfig: { ...DEFAULT_DIALOG_CONFIG.confirmButtonConfig, ...styleConfig.confirmButtonConfig, }, cancelButtonConfig: { ...DEFAULT_DIALOG_CONFIG.cancelButtonConfig, ...styleConfig.cancelButtonConfig, }, }; } showDialog() { this.confirmationService.confirm({ header: this.getDialogHeaderText(), message: this.getDialogContentText(), acceptLabel: this.dialogConfig.confirmButtonConfig?.label || 'Confirm', rejectLabel: this.dialogConfig.cancelButtonConfig?.label || 'Cancel', acceptButtonStyleClass: this.getButtonStyle(this.dialogConfig.confirmButtonConfig, true), rejectButtonStyleClass: this.getButtonStyle(this.dialogConfig.cancelButtonConfig, false), acceptIcon: this.dialogConfig.confirmButtonConfig?.icon || 'pi pi-check', rejectIcon: this.dialogConfig.cancelButtonConfig?.icon || 'pi pi-times', accept: () => { this.confirm.emit(); if (this.dialogConfig.toastOnConfirm) { } }, reject: (type) => { this.cancel.emit(); if (type === ConfirmEventType.REJECT && this.dialogConfig.toastOnCancel) { } }, }); // Use renderer to apply dynamic styles setTimeout(() => { const dialogElement = this.el.nativeElement.querySelector('.p-dialog'); if (dialogElement) { this.renderer.setStyle(dialogElement, 'width', this.dialogConfig.width || '400px'); this.renderer.setStyle(dialogElement, 'height', this.dialogConfig.height || 'auto'); } }, 0); } getButtonStyle(buttonConfig, isConfirm = false) { let styleClass = buttonConfig?.styleClass ?? 'p-button-sm'; // ✅ Apply width dynamically if provided, otherwise default to 100% const buttonWidth = buttonConfig?.width ?? '100%'; // ✅ Set default severity: SUCCESS for confirm, SECONDARY for cancel const defaultSeverity = isConfirm ? SeverityEnum.DANGER : SeverityEnum.INFO; const severity = buttonConfig?.severity ?? defaultSeverity; // ✅ Apply severity-based styles only if no custom background color is set if (!buttonConfig?.backgroundColor) { switch (severity) { case SeverityEnum.WARNING: styleClass += ' p-button-warning'; break; case SeverityEnum.DANGER: styleClass += ' p-button-danger'; break; case SeverityEnum.SUCCESS: styleClass += ' p-button-success'; break; case SeverityEnum.INFO: default: styleClass += ' p-button-secondary'; break; } } return `${styleClass.trim()} width-${buttonWidth.replace('%', '')}`; } getDialogHeaderText() { const header = this.dialogConfig.header; const dialogStyle = this.dialogConfig.dialogStyle ?? SeverityEnum.INFO; const styleHeader = DIALOG_STYLES[dialogStyle]?.header; return typeof header === 'object' && header !== null && 'text' in header ? header.text : typeof header === 'string' ? header : typeof styleHeader === 'object' && styleHeader !== null && 'text' in styleHeader ? styleHeader.text : 'Confirmation'; // ✅ Default value } getDialogHeaderStyle() { const header = this.dialogConfig.header; const dialogStyle = this.dialogConfig.dialogStyle ?? SeverityEnum.INFO; const styleHeader = DIALOG_STYLES[dialogStyle]?.header; return typeof header === 'object' && header !== null ? { color: header.color || (typeof styleHeader === 'object' ? styleHeader?.color : '#333'), fontSize: header.fontSize || '25px', } : { color: typeof styleHeader === 'object' ? styleHeader?.color : '#333', fontSize: '25px', }; } getDialogIconClass() { const header = this.dialogConfig.header; const dialogStyle = this.dialogConfig.dialogStyle ?? SeverityEnum.INFO; // ✅ Ensure dialogStyle is always defined const styleHeader = DIALOG_STYLES[dialogStyle]?.header; // ✅ Store the style header separately // ✅ Ensure header.icon exists and is an object before accessing .code const icon = typeof header === 'object' && header !== null && 'icon' in header ? header.icon : typeof styleHeader === 'object' && 'icon' in styleHeader ? styleHeader.icon : undefined; // ✅ If `icon` is an object, extract `.code`, otherwise return as string or default value return typeof icon === 'string' ? icon : icon?.code || 'pi pi-exclamation-circle'; } getDialogIconStyle() { const header = this.dialogConfig.header; const dialogStyle = this.dialogConfig.dialogStyle ?? SeverityEnum.INFO; const styleHeader = DIALOG_STYLES[dialogStyle]?.header; const icon = typeof header === 'object' && header !== null && 'icon' in header ? header.icon : undefined; return { color: icon?.color || (typeof styleHeader === 'object' ? styleHeader?.color : '#f39c12'), fontSize: icon?.fontSize || '1.5rem', backgroundColor: icon?.backgroundColor || 'transparent', borderRadius: icon?.shape === 'circular' ? '50%' : '4px', padding: '5px', }; } getDialogContentText() { const content = this.dialogConfig.content; const dialogStyle = this.dialogConfig.dialogStyle ?? SeverityEnum.INFO; const styleContent = DIALOG_STYLES[dialogStyle]?.content; return typeof content === 'string' ? content : content?.text || (typeof styleContent === 'object' ? styleContent?.text : 'Are you sure?'); } getDialogContentStyle() { const content = this.dialogConfig.content; const dialogStyle = this.dialogConfig.dialogStyle ?? SeverityEnum.INFO; const styleContent = DIALOG_STYLES[dialogStyle]?.content; return typeof content === 'object' && content !== null ? { color: content.color || (typeof styleContent === 'object' ? styleContent?.color : '#333'), fontSize: content.fontSize || '20px', textAlign: content.position || 'left', } : { color: typeof styleContent === 'object' ? styleContent?.color : '#333', fontSize: '20px', textAlign: 'left', }; } static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.11", ngImport: i0, type: PTDialogComponent, deps: [{ token: i1.ConfirmationService }, { token: i1.MessageService }, { token: i0.Renderer2 }, { token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Component }); } static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.11", type: PTDialogComponent, selector: "pt-dialog", inputs: { dialogConfig: "dialogConfig" }, outputs: { confirm: "confirm", cancel: "cancel" }, providers: [ConfirmationService, MessageService], usesOnChanges: true, ngImport: i0, template: "<div class=\"pt-dialog\">\n <p-confirmDialog>\n <!-- Header with Icon and Title aligned horizontally -->\n <ng-template pTemplate=\"header\">\n <div class=\"popup-header bordered-section\">\n <i [class]=\"getDialogIconClass()\" [ngStyle]=\"getDialogIconStyle()\"></i>\n <span class=\"popup-title\" [ngStyle]=\"getDialogHeaderStyle()\">\n {{ getDialogHeaderText() }}\n </span>\n </div>\n </ng-template>\n\n <!-- Message Content with Divider -->\n <ng-template pTemplate=\"message\" let-message>\n <div\n class=\"popup-content bordered-section\"\n [ngStyle]=\"getDialogContentStyle()\"\n >\n <p>{{ getDialogContentText() }}</p>\n </div>\n </ng-template>\n </p-confirmDialog>\n</div>\n", styles: ["::ng-deep .pt-dialog .p-dialog .p-dialog-header{padding-bottom:0}::ng-deep .pt-dialog .p-dialog .p-dialog-content{padding:0}::ng-deep .pt-dialog .full-width-button{width:100%;display:block;text-align:center}::ng-deep .pt-dialog .p-dialog-footer{display:flex;justify-content:center;gap:10px;width:100%;padding:10px}::ng-deep .pt-dialog .p-confirm-dialog-accept,::ng-deep .pt-dialog .p-confirm-dialog-reject{flex:1;max-width:50%;text-align:center;display:flex;justify-content:center;align-items:center;height:40px}::ng-deep .pt-dialog .p-confirm-dialog-accept i,::ng-deep .pt-dialog .p-confirm-dialog-reject i{margin-right:5px}::ng-deep .pt-dialog .p-confirm-dialog-accept .p-button-label,::ng-deep .pt-dialog .p-confirm-dialog-reject .p-button-label{font-weight:700;flex-grow:1;text-align:center}.pt-dialog .popup-header{display:flex;align-items:center;gap:10px;font-size:1.2rem;font-weight:700;padding-bottom:10px;width:100%}.pt-dialog .popup-title{color:#333;font-size:1.2rem}.pt-dialog .bordered-section{width:100%;border-bottom:1px solid rgba(0,0,0,.2);padding-bottom:10px;margin-bottom:10px}.pt-dialog .popup-content{display:flex;justify-content:center;text-align:center;padding:15px;width:100%}\n"], dependencies: [{ kind: "directive", type: i2.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "directive", type: i1.PrimeTemplate, selector: "[pTemplate]", inputs: ["type", "pTemplate"] }, { kind: "component", type: i3.ConfirmDialog, selector: "p-confirmDialog", inputs: ["header", "icon", "message", "style", "styleClass", "maskStyleClass", "acceptIcon", "acceptLabel", "closeAriaLabel", "acceptAriaLabel", "acceptVisible", "rejectIcon", "rejectLabel", "rejectAriaLabel", "rejectVisible", "acceptButtonStyleClass", "rejectButtonStyleClass", "closeOnEscape", "dismissableMask", "blockScroll", "rtl", "closable", "appendTo", "key", "autoZIndex", "baseZIndex", "transitionOptions", "focusTrap", "defaultFocus", "breakpoints", "visible", "position"], outputs: ["onHide"] }] }); } } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.11", ngImport: i0, type: PTDialogComponent, decorators: [{ type: Component, args: [{ selector: 'pt-dialog', providers: [ConfirmationService, MessageService], template: "<div class=\"pt-dialog\">\n <p-confirmDialog>\n <!-- Header with Icon and Title aligned horizontally -->\n <ng-template pTemplate=\"header\">\n <div class=\"popup-header bordered-section\">\n <i [class]=\"getDialogIconClass()\" [ngStyle]=\"getDialogIconStyle()\"></i>\n <span class=\"popup-title\" [ngStyle]=\"getDialogHeaderStyle()\">\n {{ getDialogHeaderText() }}\n </span>\n </div>\n </ng-template>\n\n <!-- Message Content with Divider -->\n <ng-template pTemplate=\"message\" let-message>\n <div\n class=\"popup-content bordered-section\"\n [ngStyle]=\"getDialogContentStyle()\"\n >\n <p>{{ getDialogContentText() }}</p>\n </div>\n </ng-template>\n </p-confirmDialog>\n</div>\n", styles: ["::ng-deep .pt-dialog .p-dialog .p-dialog-header{padding-bottom:0}::ng-deep .pt-dialog .p-dialog .p-dialog-content{padding:0}::ng-deep .pt-dialog .full-width-button{width:100%;display:block;text-align:center}::ng-deep .pt-dialog .p-dialog-footer{display:flex;justify-content:center;gap:10px;width:100%;padding:10px}::ng-deep .pt-dialog .p-confirm-dialog-accept,::ng-deep .pt-dialog .p-confirm-dialog-reject{flex:1;max-width:50%;text-align:center;display:flex;justify-content:center;align-items:center;height:40px}::ng-deep .pt-dialog .p-confirm-dialog-accept i,::ng-deep .pt-dialog .p-confirm-dialog-reject i{margin-right:5px}::ng-deep .pt-dialog .p-confirm-dialog-accept .p-button-label,::ng-deep .pt-dialog .p-confirm-dialog-reject .p-button-label{font-weight:700;flex-grow:1;text-align:center}.pt-dialog .popup-header{display:flex;align-items:center;gap:10px;font-size:1.2rem;font-weight:700;padding-bottom:10px;width:100%}.pt-dialog .popup-title{color:#333;font-size:1.2rem}.pt-dialog .bordered-section{width:100%;border-bottom:1px solid rgba(0,0,0,.2);padding-bottom:10px;margin-bottom:10px}.pt-dialog .popup-content{display:flex;justify-content:center;text-align:center;padding:15px;width:100%}\n"] }] }], ctorParameters: () => [{ type: i1.ConfirmationService }, { type: i1.MessageService }, { type: i0.Renderer2 }, { type: i0.ElementRef }], propDecorators: { dialogConfig: [{ type: Input }], confirm: [{ type: Output }], cancel: [{ type: Output }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHQtZGlhbG9nLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25nLXByaW1lLXRvb2xzL3NyYy9saWIvcHQtZGlhbG9nL3B0LWRpYWxvZy5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZy1wcmltZS10b29scy9zcmMvbGliL3B0LWRpYWxvZy9wdC1kaWFsb2cuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLFNBQVMsRUFDVCxLQUFLLEVBQ0wsTUFBTSxFQUNOLFlBQVksR0FLYixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQ0wsbUJBQW1CLEVBQ25CLGdCQUFnQixFQUNoQixjQUFjLEdBQ2YsTUFBTSxhQUFhLENBQUM7QUFJckIsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLFVBQVUsQ0FBQzs7Ozs7QUFFeEMsNENBQTRDO0FBQzVDLE1BQU0sYUFBYSxHQUFnRDtJQUNqRSxDQUFDLFlBQVksQ0FBQyxPQUFPLENBQUMsRUFBRTtRQUN0QixNQUFNLEVBQUUsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUU7UUFDN0MsT0FBTyxFQUFFLEVBQUUsSUFBSSxFQUFFLDRCQUE0QixFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUU7UUFDakUsbUJBQW1CLEVBQUUsRUFBRSxlQUFlLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQUU7UUFDdEUsa0JBQWtCLEVBQUUsRUFBRSxlQUFlLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQUU7S0FDdEU7SUFDRCxDQUFDLFlBQVksQ0FBQyxPQUFPLENBQUMsRUFBRTtRQUN0QixNQUFNLEVBQUUsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUU7UUFDN0MsT0FBTyxFQUFFLEVBQUUsSUFBSSxFQUFFLDJC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LFlBQVksS0FBSyxRQUFRLENBQUMsQ0FBQyxDQUFDLFlBQVksRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQztnQkFDbkUsUUFBUSxFQUFFLE9BQU8sQ0FBQyxRQUFRLElBQUksTUFBTTtnQkFDcEMsU0FBUyxFQUFFLE9BQU8sQ0FBQyxRQUFRLElBQUksTUFBTTthQUN0QztZQUNILENBQUMsQ0FBQztnQkFDRSxLQUFLLEVBQ0gsT0FBTyxZQUFZLEtBQUssUUFBUSxDQUFDLENBQUMsQ0FBQyxZQUFZLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQyxNQUFNO2dCQUNqRSxRQUFRLEVBQUUsTUFBTTtnQkFDaEIsU0FBUyxFQUFFLE1BQU07YUFDbEIsQ0FBQztJQUNSLENBQUM7K0dBM09VLGlCQUFpQjttR0FBakIsaUJBQWlCLGlJQUZqQixDQUFDLG1CQUFtQixFQUFFLGNBQWMsQ0FBQywrQ0N4RWxELDR3QkF1QkE7OzRGRG1EYSxpQkFBaUI7a0JBTjdCLFNBQVM7K0JBQ0UsV0FBVyxhQUdWLENBQUMsbUJBQW1CLEVBQUUsY0FBYyxDQUFDO3NLQUd2QyxZQUFZO3NCQUFwQixLQUFLO2dCQUNJLE9BQU87c0JBQWhCLE1BQU07Z0JBQ0csTUFBTTtzQkFBZixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQ29tcG9uZW50LFxuICBJbnB1dCxcbiAgT3V0cHV0LFxuICBFdmVudEVtaXR0ZXIsXG4gIFJlbmRlcmVyMixcbiAgRWxlbWVudFJlZixcbiAgU2ltcGxlQ2hhbmdlcyxcbiAgT25DaGFuZ2VzLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7XG4gIENvbmZpcm1hdGlvblNlcnZpY2UsXG4gIENvbmZpcm1FdmVudFR5cGUsXG4gIE1lc3NhZ2VTZXJ2aWNlLFxufSBmcm9tICdwcmltZW5nL2FwaSc7XG5pbXBvcnQgeyBEaWFsb2dDb25maWcgfSBmcm9tICcuLi9tb2RlbHMvZGlhbG9nLWNvbmZpZy5tb2RlbCc7XG5pbXBvcnQgeyBCdXR0b25Nb2RlbCB9IGZyb20gJy4uL21vZGVscy9idXR0b24ubW9kZWwnO1xuaW1wb3J0IHsgSWNvblN0eWxlIH0gZnJvbSAnLi4vbW9kZWxzJztcbmltcG9ydCB7IFNldmVyaXR5RW51bSB9IGZyb20gJy4uL2VudW1zJztcblxuLy8gRGVmYXVsdCBTdHlsZXMgZm9yIERpZmZlcmVudCBEaWFsb2cgVHlwZXNcbmNvbnN0IERJQUxPR19TVFlMRVM6IFJlY29yZDxTZXZlcml0eUVudW0sIFBhcnRpYWw8RGlhbG9nQ29uZmlnPj4gPSB7XG4gIFtTZXZlcml0eUVudW0uV0FSTklOR106IHtcbiAgICBoZWFkZXI6IHsgdGV4dDogJ1dhcm5pbmcnLCBjb2xvcjogJyNkOTgzMDAnIH0sXG4gICAgY29udGVudDogeyB0ZXh0OiAnVGhpcyBpcyBhIHdhcm5pbmcgbWVzc2FnZSEnLCBjb2xvcjogJyNkOTgzMDAnIH0sXG4gICAgY29uZmlybUJ1dHRvbkNvbmZpZzogeyBiYWNrZ3JvdW5kQ29sb3I6ICcjZDk4MzAwJywgZm9udENvbG9yOiAnI2ZmZicgfSxcbiAgICBjYW5jZWxCdXR0b25Db25maWc6IHsgYmFja2dyb3VuZENvbG9yOiAnIzZjNzU3ZCcsIGZvbnRDb2xvcjogJyNmZmYnIH0sXG4gIH0sXG4gIFtTZXZlcml0eUVudW0uU1VDQ0VTU106IHtcbiAgICBoZWFkZXI6IHsgdGV4dDogJ1N1Y2Nlc3MnLCBjb2xvcjogJyMyOGE3NDUnIH0sXG4gICAgY29udGVudDogeyB0ZXh0OiAnT3BlcmF0aW9uIHdhcyBzdWNjZXNzZnVsIScsIGNvbG9yOiAnIzI4YTc0NScgfSxcbiAgICBjb25maXJtQnV0dG9uQ29uZmlnOiB7IGJhY2tncm91bmRDb2xvcjogJyMyOGE3NDUnLCBmb250Q29sb3I6ICcjZmZmJyB9LFxuICAgIGNhbmNlbEJ1dHRvbkNvbmZpZzogeyBiYWNrZ3JvdW5kQ29sb3I6ICcjNmM3NTdkJywgZm9udENvbG9yOiAnI2ZmZicgfSxcbiAgfSxcbiAgW1NldmVyaXR5RW51bS5EQU5HRVJdOiB7XG4gICAgaGVhZGVyOiB7IHRleHQ6ICdFcnJvcicsIGNvbG9yOiAnI2RjMzU0NScgfSxcbiAgICBjb250ZW50OiB7IHRleHQ6ICdBbiBlcnJvciBvY2N1cnJlZCEnLCBjb2xvcjogJyNkYzM1NDUnIH0sXG4gICAgY29uZmlybUJ1dHRvbkNvbmZpZzogeyBiYWNrZ3JvdW5kQ29sb3I6ICcjZGMzNTQ1JywgZm9udENvbG9yOiAnI2ZmZicgfSxcbiAgICBjYW5jZWxCdXR0b25Db25maWc6IHsgYmFja2dyb3VuZENvbG9yOiAnIzZjNzU3ZCcsIGZvbnRDb2xvcjogJyNmZmYnIH0sXG4gIH0sXG4gIFtTZXZlcml0eUVudW0uSU5GT106IHtcbiAgICBoZWFkZXI6IHsgdGV4dDogJ0luZm9ybWF0aW9uJywgY29sb3I6ICcjMDA3YmZmJyB9LFxuICAgIGNvbnRlbnQ6IHsgdGV4dDogJ0hlcmUgaXMgc29tZSBpbXBvcnRhbnQgaW5mb3JtYXRpb24uJywgY29sb3I6ICcjMDA3YmZmJyB9LFxuICAgIGNvbmZpcm1CdXR0b25Db25maWc6IHsgYmFja2dyb3VuZENvbG9yOiAnIzAwN2JmZicsIGZvbnRDb2xvcjogJyNmZmYnIH0sXG4gICAgY2FuY2VsQnV0dG9uQ29uZmlnOiB7IGJhY2tncm91bmRDb2xvcjogJyM2Yzc1N2QnLCBmb250Q29sb3I6ICcjZmZmJyB9LFxuICB9LFxufTtcblxuLy8gQ2VudHJhbGl6ZWQgRGVmYXVsdCBWYWx1ZXNcbmNvbnN0IERFRkFVTFRfRElBTE9HX0NPTkZJRzogRGlhbG9nQ29uZmlnID0ge1xuICBoZWFkZXI6IHsgdGV4dDogJ0NvbmZpcm1hdGlvbicgfSxcbiAgdmlzaWJsZTogZmFsc2UsXG4gIHdpZHRoOiAnNDAwcHgnLFxuICBoZWlnaHQ6ICdhdXRvJyxcbiAgY29udGVudDogJ0RvIHlvdSB3YW50IHRvIHByb2NlZWQ/JyxcbiAgY29uZmlybUJ1dHRvbkNvbmZpZzoge1xuICAgIGxhYmVsOiAnQ29uZmlybScsXG4gICAgZm9udENvbG9yOiAnI2ZmZicsXG4gICAgYmFja2dyb3VuZENvbG9yOiAnIzAwN2JmZicsXG4gIH0sXG4gIGNhbmNlbEJ1dHRvbkNvbmZpZzoge1xuICAgIGxhYmVsOiAnQ2FuY2VsJyxcbiAgICBmb250Q29sb3I6ICcjZmZmJyxcbiAgICBiYWNrZ3JvdW5kQ29sb3I6ICcjNmM3NTdkJyxcbiAgfSxcbiAgZGlhbG9nU3R5bGU6IFNldmVyaXR5RW51bS5JTkZPLFxufTtcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAncHQtZGlhbG9nJyxcbiAgdGVtcGxhdGVVcmw6ICcuL3B0LWRpYWxvZy5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL3B0LWRpYWxvZy5jb21wb25lbnQuY3NzJ10sXG4gIHByb3ZpZGVyczogW0NvbmZpcm1hdGlvblNlcnZpY2UsIE1lc3NhZ2VTZXJ2aWNlXSxcbn0pXG5leHBvcnQgY2xhc3MgUFREaWFsb2dDb21wb25lbnQgaW1wbGVtZW50cyBPbkNoYW5nZXMge1xuICBASW5wdXQoKSBkaWFsb2dDb25maWc6IERpYWxvZ0NvbmZpZyA9IHsgLi4uREVGQVVMVF9ESUFMT0dfQ09ORklHIH07XG4gIEBPdXRwdXQoKSBjb25maXJtOiBFdmVudEVtaXR0ZXI8dm9pZD4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gIEBPdXRwdXQoKSBjYW5jZWw6IEV2ZW50RW1pdHRlcjx2b2lkPiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIGNvbmZpcm1hdGlvblNlcnZpY2U6IENvbmZpcm1hdGlvblNlcnZpY2UsXG4gICAgcHJpdmF0ZSBtZXNzYWdlU2VydmljZTogTWVzc2FnZVNlcnZpY2UsXG4gICAgcHJpdmF0ZSByZW5kZXJlcjogUmVuZGVyZXIyLFxuICAgIHByaXZhdGUgZWw6IEVsZW1lbnRSZWZcbiAgKSB7fVxuXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcbiAgICBpZiAoY2hhbmdlc1snZGlhbG9nQ29uZmlnJ10pIHtcbiAgICAgIGlmIChcbiAgICAgICAgY2hhbmdlc1snZGlhbG9nQ29uZmlnJ10uY3VycmVudFZhbHVlPy5kaWFsb2dTdHlsZSAhPT1cbiAgICAgICAgY2hhbmdlc1snZGlhbG9nQ29uZmlnJ10ucHJldmlvdXNWYWx1ZT8uZGlhbG9nU3R5bGVcbiAgICAgICkge1xuICAgICAgICB0aGlzLmFwcGx5RGlhbG9nU3R5bGUoKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMuZGlhbG9nQ29uZmlnLnZpc2libGUpIHtcbiAgICAgICAgdGhpcy5zaG93RGlhbG9nKCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhcHBseURpYWxvZ1N0eWxlKCk6IHZvaWQge1xuICAgIGNvbnN0IGRpYWxvZ1N0eWxlID0gdGhpcy5kaWFsb2dDb25maWcuZGlhbG9nU3R5bGUgfHwgU2V2ZXJpdHlFbnVtLklORk87XG4gICAgY29uc3Qgc3R5bGVDb25maWcgPSBESUFMT0dfU1RZTEVTW2RpYWxvZ1N0eWxlXSB8fCB7fTtcblxuICAgIHRoaXMuZGlhbG9nQ29uZmlnID0ge1xuICAgICAgLi4uREVGQVVMVF9ESUFMT0dfQ09ORklHLFxuICAgICAgLi4uc3R5bGVDb25maWcsXG4gICAgICBjb25maXJtQnV0dG9uQ29uZmlnOiB7XG4gICAgICAgIC4uLkRFRkFVTFRfRElBTE9HX0NPTkZJRy5jb25maXJtQnV0dG9uQ29uZmlnLFxuICAgICAgICAuLi5zdHlsZUNvbmZpZy5jb25maXJtQnV0dG9uQ29uZmlnLFxuICAgICAgfSxcbiAgICAgIGNhbmNlbEJ1dHRvbkNvbmZpZzoge1xuICAgICAgICAuLi5ERUZBVUxUX0RJQUxPR19DT05GSUcuY2FuY2VsQnV0dG9uQ29uZmlnLFxuICAgICAgICAuLi5zdHlsZUNvbmZpZy5jYW5jZWxCdXR0b25Db25maWcsXG4gICAgICB9LFxuICAgIH07XG4gIH1cblxuICBzaG93RGlhbG9nKCk6IHZvaWQge1xuICAgIHRoaXMuY29uZmlybWF0aW9uU2VydmljZS5jb25maXJtKHtcbiAgICAgIGhlYWRlcjogdGhpcy5nZXREaWFsb2dIZWFkZXJUZXh0KCksXG4gICAgICBtZXNzYWdlOiB0aGlzLmdldERpYWxvZ0NvbnRlbnRUZXh0KCksXG4gICAgICBhY2NlcHRMYWJlbDogdGhpcy5kaWFsb2dDb25maWcuY29uZmlybUJ1dHRvbkNvbmZpZz8ubGFiZWwgfHwgJ0NvbmZpcm0nLFxuICAgICAgcmVqZWN0TGFiZWw6IHRoaXMuZGlhbG9nQ29uZmlnLmNhbmNlbEJ1dHRvbkNvbmZpZz8ubGFiZWwgfHwgJ0NhbmNlbCcsXG4gICAgICBhY2NlcHRCdXR0b25TdHlsZUNsYXNzOiB0aGlzLmdldEJ1dHRvblN0eWxlKFxuICAgICAgICB0aGlzLmRpYWxvZ0NvbmZpZy5jb25maXJtQnV0dG9uQ29uZmlnLFxuICAgICAgICB0cnVlXG4gICAgICApLFxuICAgICAgcmVqZWN0QnV0dG9uU3R5bGVDbGFzczogdGhpcy5nZXRCdXR0b25TdHlsZShcbiAgICAgICAgdGhpcy5kaWFsb2dDb25maWcuY2FuY2VsQnV0dG9uQ29uZmlnLFxuICAgICAgICBmYWxzZVxuICAgICAgKSxcbiAgICAgIGFjY2VwdEljb246IHRoaXMuZGlhbG9nQ29uZmlnLmNvbmZpcm1CdXR0b25Db25maWc/Lmljb24gfHwgJ3BpIHBpLWNoZWNrJyxcbiAgICAgIHJlamVjdEljb246IHRoaXMuZGlhbG9nQ29uZmlnLmNhbmNlbEJ1dHRvbkNvbmZpZz8uaWNvbiB8fCAncGkgcGktdGltZXMnLFxuICAgICAgYWNjZXB0OiAoKSA9PiB7XG4gICAgICAgIHRoaXMuY29uZmlybS5lbWl0KCk7XG4gICAgICAgIGlmICh0aGlzLmRpYWxvZ0NvbmZpZy50b2FzdE9uQ29uZmlybSkge1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgcmVqZWN0OiAodHlwZTogQ29uZmlybUV2ZW50VHlwZSkgPT4ge1xuICAgICAgICB0aGlzLmNhbmNlbC5lbWl0KCk7XG4gICAgICAgIGlmIChcbiAgICAgICAgICB0eXBlID09PSBDb25maXJtRXZlbnRUeXBlLlJFSkVDVCAmJlxuICAgICAgICAgIHRoaXMuZGlhbG9nQ29uZmlnLnRvYXN0T25DYW5jZWxcbiAgICAgICAgKSB7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgfSk7XG5cbiAgICAvLyBVc2UgcmVuZGVyZXIgdG8gYXBwbHkgZHluYW1pYyBzdHlsZXNcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIGNvbnN0IGRpYWxvZ0VsZW1lbnQgPSB0aGlzLmVsLm5hdGl2ZUVsZW1lbnQucXVlcnlTZWxlY3RvcignLnAtZGlhbG9nJyk7XG4gICAgICBpZiAoZGlhbG9nRWxlbWVudCkge1xuICAgICAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKFxuICAgICAgICAgIGRpYWxvZ0VsZW1lbnQsXG4gICAgICAgICAgJ3dpZHRoJyxcbiAgICAgICAgICB0aGlzLmRpYWxvZ0NvbmZpZy53aWR0aCB8fCAnNDAwcHgnXG4gICAgICAgICk7XG4gICAgICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUoXG4gICAgICAgICAgZGlhbG9nRWxlbWVudCxcbiAgICAgICAgICAnaGVpZ2h0JyxcbiAgICAgICAgICB0aGlzLmRpYWxvZ0NvbmZpZy5oZWlnaHQgfHwgJ2F1dG8nXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfSwgMCk7XG4gIH1cblxuICBwcml2YXRlIGdldEJ1dHRvblN0eWxlKFxuICAgIGJ1dHRvbkNvbmZpZz86IEJ1dHRvbk1vZGVsLFxuICAgIGlzQ29uZmlybTogYm9vbGVhbiA9IGZhbHNlXG4gICk6IHN0cmluZyB7XG4gICAgbGV0IHN0eWxlQ2xhc3MgPSBidXR0b25Db25maWc/LnN0eWxlQ2xhc3MgPz8gJ3AtYnV0dG9uLXNtJztcblxuICAgIC8vIOKchSBBcHBseSB3aWR0aCBkeW5hbWljYWxseSBpZiBwcm92aWRlZCwgb3RoZXJ3aXNlIGRlZmF1bHQgdG8gMTAwJVxuICAgIGNvbnN0IGJ1dHRvbldpZHRoID0gYnV0dG9uQ29uZmlnPy53aWR0aCA/PyAnMTAwJSc7XG5cbiAgICAvLyDinIUgU2V0IGRlZmF1bHQgc2V2ZXJpdHk6IFNVQ0NFU1MgZm9yIGNvbmZpcm0sIFNFQ09OREFSWSBmb3IgY2FuY2VsXG4gICAgY29uc3QgZGVmYXVsdFNldmVyaXR5ID0gaXNDb25maXJtID8gU2V2ZXJpdHlFbnVtLkRBTkdFUiA6IFNldmVyaXR5RW51bS5JTkZPO1xuICAgIGNvbnN0IHNldmVyaXR5ID0gYnV0dG9uQ29uZmlnPy5zZXZlcml0eSA/PyBkZWZhdWx0U2V2ZXJpdHk7XG5cbiAgICAvLyDinIUgQXBwbHkgc2V2ZXJpdHktYmFzZWQgc3R5bGVzIG9ubHkgaWYgbm8gY3VzdG9tIGJhY2tncm91bmQgY29sb3IgaXMgc2V0XG4gICAgaWYgKCFidXR0b25Db25maWc/LmJhY2tncm91bmRDb2xvcikge1xuICAgICAgc3dpdGNoIChzZXZlcml0eSkge1xuICAgICAgICBjYXNlIFNldmVyaXR5RW51bS5XQVJOSU5HOlxuICAgICAgICAgIHN0eWxlQ2xhc3MgKz0gJyBwLWJ1dHRvbi13YXJuaW5nJztcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBTZXZlcml0eUVudW0uREFOR0VSOlxuICAgICAgICAgIHN0eWxlQ2xhc3MgKz0gJyBwLWJ1dHRvbi1kYW5nZXInO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFNldmVyaXR5RW51bS5TVUNDRVNTOlxuICAgICAgICAgIHN0eWxlQ2xhc3MgKz0gJyBwLWJ1dHRvbi1zdWNjZXNzJztcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBTZXZlcml0eUVudW0uSU5GTzpcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICBzdHlsZUNsYXNzICs9ICcgcC1idXR0b24tc2Vjb25kYXJ5JztcbiAgICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gYCR7c3R5bGVDbGFzcy50cmltKCl9IHdpZHRoLSR7YnV0dG9uV2lkdGgucmVwbGFjZSgnJScsICcnKX1gO1xuICB9XG5cbiAgZ2V0RGlhbG9nSGVhZGVyVGV4dCgpOiBzdHJpbmcge1xuICAgIGNvbnN0IGhlYWRlciA9IHRoaXMuZGlhbG9nQ29uZmlnLmhlYWRlcjtcbiAgICBjb25zdCBkaWFsb2dTdHlsZSA9IHRoaXMuZGlhbG9nQ29uZmlnLmRpYWxvZ1N0eWxlID8/IFNldmVyaXR5RW51bS5JTkZPO1xuICAgIGNvbnN0IHN0eWxlSGVhZGVyID0gRElBTE9HX1NUWUxFU1tkaWFsb2dTdHlsZV0/LmhlYWRlcjtcblxuICAgIHJldHVybiB0eXBlb2YgaGVhZGVyID09PSAnb2JqZWN0JyAmJiBoZWFkZXIgIT09IG51bGwgJiYgJ3RleHQnIGluIGhlYWRlclxuICAgICAgPyBoZWFkZXIudGV4dFxuICAgICAgOiB0eXBlb2YgaGVhZGVyID09PSAnc3RyaW5nJ1xuICAgICAgPyBoZWFkZXJcbiAgICAgIDogdHlwZW9mIHN0eWxlSGVhZGVyID09PSAnb2JqZWN0JyAmJlxuICAgICAgICBzdHlsZUhlYWRlciAhPT0gbnVsbCAmJlxuICAgICAgICAndGV4dCcgaW4gc3R5bGVIZWFkZXJcbiAgICAgID8gc3R5bGVIZWFkZXIudGV4dFxuICAgICAgOiAnQ29uZmlybWF0aW9uJzsgLy8g4pyFIERlZmF1bHQgdmFsdWVcbiAgfVxuXG4gIGdldERpYWxvZ0hlYWRlclN0eWxlKCk6IGFueSB7XG4gICAgY29uc3QgaGVhZGVyID0gdGhpcy5kaWFsb2dDb25maWcuaGVhZGVyO1xuICAgIGNvbnN0IGRpYWxvZ1N0eWxlID0gdGhpcy5kaWFsb2dDb25maWcuZGlhbG9nU3R5bGUgPz8gU2V2ZXJpdHlFbnVtLklORk87XG4gICAgY29uc3Qgc3R5bGVIZWFkZXIgPSBESUFMT0dfU1RZTEVTW2RpYWxvZ1N0eWxlXT8uaGVhZGVyO1xuXG4gICAgcmV0dXJuIHR5cGVvZiBoZWFkZXIgPT09ICdvYmplY3QnICYmIGhlYWRlciAhPT0gbnVsbFxuICAgICAgPyB7XG4gICAgICAgICAgY29sb3I6XG4gICAgICAgICAgICBoZWFkZXIuY29sb3IgfHxcbiAgICAgICAgICAgICh0eXBlb2Ygc3R5bGVIZWFkZXIgPT09ICdvYmplY3QnID8gc3R5bGVIZWFkZXI/LmNvbG9yIDogJyMzMzMnKSxcbiAgICAgICAgICBmb250U2l6ZTogaGVhZGVyLmZvbnRTaXplIHx8ICcyNXB4JyxcbiAgICAgICAgfVxuICAgICAgOiB7XG4gICAgICAgICAgY29sb3I6IHR5cGVvZiBzdHlsZUhlYWRlciA9PT0gJ29iamVjdCcgPyBzdHlsZUhlYWRlcj8uY29sb3IgOiAnIzMzMycsXG4gICAgICAgICAgZm9udFNpemU6ICcyNXB4JyxcbiAgICAgICAgfTtcbiAgfVxuXG4gIGdldERpYWxvZ0ljb25DbGFzcygpOiBzdHJpbmcge1xuICAgIGNvbnN0IGhlYWRlciA9IHRoaXMuZGlhbG9nQ29uZmlnLmhlYWRlcjtcbiAgICBjb25zdCBkaWFsb2dTdHlsZSA9IHRoaXMuZGlhbG9nQ29uZmlnLmRpYWxvZ1N0eWxlID8/IFNldmVyaXR5RW51bS5JTkZPOyAvLyDinIUgRW5zdXJlIGRpYWxvZ1N0eWxlIGlzIGFsd2F5cyBkZWZpbmVkXG4gICAgY29uc3Qgc3R5bGVIZWFkZXIgPSBESUFMT0dfU1RZTEVTW2RpYWxvZ1N0eWxlXT8uaGVhZGVyOyAvLyDinIUgU3RvcmUgdGhlIHN0eWxlIGhlYWRlciBzZXBhcmF0ZWx5XG5cbiAgICAvLyDinIUgRW5zdXJlIGhlYWRlci5pY29uIGV4aXN0cyBhbmQgaXMgYW4gb2JqZWN0IGJlZm9yZSBhY2Nlc3NpbmcgLmNvZGVcbiAgICBjb25zdCBpY29uID1cbiAgICAgIHR5cGVvZiBoZWFkZXIgPT09ICdvYmplY3QnICYmIGhlYWRlciAhPT0gbnVsbCAmJiAnaWNvbicgaW4gaGVhZGVyXG4gICAgICAgID8gaGVhZGVyLmljb25cbiAgICAgICAgOiB0eXBlb2Ygc3R5bGVIZWFkZXIgPT09ICdvYmplY3QnICYmICdpY29uJyBpbiBzdHlsZUhlYWRlclxuICAgICAgICA/IHN0eWxlSGVhZGVyLmljb25cbiAgICAgICAgOiB1bmRlZmluZWQ7XG5cbiAgICAvLyDinIUgSWYgYGljb25gIGlzIGFuIG9iamVjdCwgZXh0cmFjdCBgLmNvZGVgLCBvdGhlcndpc2UgcmV0dXJuIGFzIHN0cmluZyBvciBkZWZhdWx0IHZhbHVlXG4gICAgcmV0dXJuIHR5cGVvZiBpY29uID09PSAnc3RyaW5nJ1xuICAgICAgPyBpY29uXG4gICAgICA6IChpY29uIGFzIEljb25TdHlsZSk/LmNvZGUgfHwgJ3BpIHBpLWV4Y2xhbWF0aW9uLWNpcmNsZSc7XG4gIH1cblxuICBnZXREaWFsb2dJY29uU3R5bGUoKTogYW55IHtcbiAgICBjb25zdCBoZWFkZXIgPSB0aGlzLmRpYWxvZ0NvbmZpZy5oZWFkZXI7XG4gICAgY29uc3QgZGlhbG9nU3R5bGUgPSB0aGlzLmRpYWxvZ0NvbmZpZy5kaWFsb2dTdHlsZSA/PyBTZXZlcml0eUVudW0uSU5GTztcbiAgICBjb25zdCBzdHlsZUhlYWRlciA9IERJQUxPR19TVFlMRVNbZGlhbG9nU3R5bGVdPy5oZWFkZXI7XG5cbiAgICBjb25zdCBpY29uOiBJY29uU3R5bGUgfCB1bmRlZmluZWQgPVxuICAgICAgdHlwZW9mIGhlYWRlciA9PT0gJ29iamVjdCcgJiYgaGVhZGVyICE9PSBudWxsICYmICdpY29uJyBpbiBoZWFkZXJcbiAgICAgICAgPyAoaGVhZGVyLmljb24gYXMgSWNvblN0eWxlKVxuICAgICAgICA6IHVuZGVmaW5lZDtcblxuICAgIHJldHVybiB7XG4gICAgICBjb2xvcjpcbiAgICAgICAgaWNvbj8uY29sb3IgfHxcbiAgICAgICAgKHR5cGVvZiBzdHlsZUhlYWRlciA9PT0gJ29iamVjdCcgPyBzdHlsZUhlYWRlcj8uY29sb3IgOiAnI2YzOWMxMicpLFxuICAgICAgZm9udFNpemU6IGljb24/LmZvbnRTaXplIHx8ICcxLjVyZW0nLFxuICAgICAgYmFja2dyb3VuZENvbG9yOiBpY29uPy5iYWNrZ3JvdW5kQ29sb3IgfHwgJ3RyYW5zcGFyZW50JyxcbiAgICAgIGJvcmRlclJhZGl1czogaWNvbj8uc2hhcGUgPT09ICdjaXJjdWxhcicgPyAnNTAlJyA6ICc0cHgnLFxuICAgICAgcGFkZGluZzogJzVweCcsXG4gICAgfTtcbiAgfVxuXG4gIGdldERpYWxvZ0NvbnRlbnRUZXh0KCk6IHN0cmluZyB7XG4gICAgY29uc3QgY29udGVudCA9IHRoaXMuZGlhbG9nQ29uZmlnLmNvbnRlbnQ7XG4gICAgY29uc3QgZGlhbG9nU3R5bGUgPSB0aGlzLmRpYWxvZ0NvbmZpZy5kaWFsb2dTdHlsZSA/PyBTZXZlcml0eUVudW0uSU5GTztcbiAgICBjb25zdCBzdHlsZUNvbnRlbnQgPSBESUFMT0dfU1RZTEVTW2RpYWxvZ1N0eWxlXT8uY29udGVudDtcblxuICAgIHJldHVybiB0eXBlb2YgY29udGVudCA9PT0gJ3N0cmluZydcbiAgICAgID8gY29udGVudFxuICAgICAgOiBjb250ZW50Py50ZXh0IHx8XG4gICAgICAgICAgKHR5cGVvZiBzdHlsZUNvbnRlbnQgPT09ICdvYmplY3QnXG4gICAgICAgICAgICA/IHN0eWxlQ29udGVudD8udGV4dFxuICAgICAgICAgICAgOiAnQXJlIHlvdSBzdXJlPycpO1xuICB9XG5cbiAgZ2V0RGlhbG9nQ29udGVudFN0eWxlKCk6IGFueSB7XG4gICAgY29uc3QgY29udGVudCA9IHRoaXMuZGlhbG9nQ29uZmlnLmNvbnRlbnQ7XG4gICAgY29uc3QgZGlhbG9nU3R5bGUgPSB0aGlzLmRpYWxvZ0NvbmZpZy5kaWFsb2dTdHlsZSA/PyBTZXZlcml0eUVudW0uSU5GTztcbiAgICBjb25zdCBzdHlsZUNvbnRlbnQgPSBESUFMT0dfU1RZTEVTW2RpYWxvZ1N0eWxlXT8uY29udGVudDtcblxuICAgIHJldHVybiB0eXBlb2YgY29udGVudCA9PT0gJ29iamVjdCcgJiYgY29udGVudCAhPT0gbnVsbFxuICAgICAgPyB7XG4gICAgICAgICAgY29sb3I6XG4gICAgICAgICAgICBjb250ZW50LmNvbG9yIHx8XG4gICAgICAgICAgICAodHlwZW9mIHN0eWxlQ29udGVudCA9PT0gJ29iamVjdCcgPyBzdHlsZUNvbnRlbnQ/LmNvbG9yIDogJyMzMzMnKSxcbiAgICAgICAgICBmb250U2l6ZTogY29udGVudC5mb250U2l6ZSB8fCAnMjBweCcsXG4gICAgICAgICAgdGV4dEFsaWduOiBjb250ZW50LnBvc2l0aW9uIHx8ICdsZWZ0JyxcbiAgICAgICAgfVxuICAgICAgOiB7XG4gICAgICAgICAgY29sb3I6XG4gICAgICAgICAgICB0eXBlb2Ygc3R5bGVDb250ZW50ID09PSAnb2JqZWN0JyA/IHN0eWxlQ29udGVudD8uY29sb3IgOiAnIzMzMycsXG4gICAgICAgICAgZm9udFNpemU6ICcyMHB4JyxcbiAgICAgICAgICB0ZXh0QWxpZ246ICdsZWZ0JyxcbiAgICAgICAgfTtcbiAgfVxufVxuIiwiPGRpdiBjbGFzcz1cInB0LWRpYWxvZ1wiPlxuICA8cC1jb25maXJtRGlhbG9nPlxuICAgIDwhLS0gSGVhZGVyIHdpdGggSWNvbiBhbmQgVGl0bGUgYWxpZ25lZCBob3Jpem9udGFsbHkgLS0+XG4gICAgPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cImhlYWRlclwiPlxuICAgICAgPGRpdiBjbGFzcz1cInBvcHVwLWhlYWRlciBib3JkZXJlZC1zZWN0aW9uXCI+XG4gICAgICAgIDxpIFtjbGFzc109XCJnZXREaWFsb2dJY29uQ2xhc3MoKVwiIFtuZ1N0eWxlXT1cImdldERpYWxvZ0ljb25TdHlsZSgpXCI+PC9pPlxuICAgICAgICA8c3BhbiBjbGFzcz1cInBvcHVwLXRpdGxlXCIgW25nU3R5bGVdPVwiZ2V0RGlhbG9nSGVhZGVyU3R5bGUoKVwiPlxuICAgICAgICAgIHt7IGdldERpYWxvZ0hlYWRlclRleHQoKSB9fVxuICAgICAgICA8L3NwYW4+XG4gICAgICA8L2Rpdj5cbiAgICA8L25nLXRlbXBsYXRlPlxuXG4gICAgPCEtLSBNZXNzYWdlIENvbnRlbnQgd2l0aCBEaXZpZGVyIC0tPlxuICAgIDxuZy10ZW1wbGF0ZSBwVGVtcGxhdGU9XCJtZXNzYWdlXCIgbGV0LW1lc3NhZ2U+XG4gICAgICA8ZGl2XG4gICAgICAgIGNsYXNzPVwicG9wdXAtY29udGVudCBib3JkZXJlZC1zZWN0aW9uXCJcbiAgICAgICAgW25nU3R5bGVdPVwiZ2V0RGlhbG9nQ29udGVudFN0eWxlKClcIlxuICAgICAgPlxuICAgICAgICA8cD57eyBnZXREaWFsb2dDb250ZW50VGV4dCgpIH19PC9wPlxuICAgICAgPC9kaXY+XG4gICAgPC9uZy10ZW1wbGF0ZT5cbiAgPC9wLWNvbmZpcm1EaWFsb2c+XG48L2Rpdj5cbiJdfQ==