UNPKG

@rangertechnologies/ngnxt

Version:

This library was used for creating dymanic UI based on the input JSON/data

188 lines 26.7 kB
// Changes commented out due to Angular version compatibility; will apply after upgrade. // // RS 06JAN2025 import { Component, EventEmitter, Input, Output } from '@angular/core'; import { QuillEditorComponent } from 'ngx-quill'; import { FormsModule } from '@angular/forms'; import Quill from 'quill'; import { Mention } from 'quill-mention'; import ImageResizor from 'quill-image-resizor'; import { CommonModule } from '@angular/common'; import * as i0 from "@angular/core"; import * as i1 from "../../i18n.service"; import * as i2 from "../../services/change.service"; import * as i3 from "@angular/forms"; import * as i4 from "@angular/common"; // RS 17JAN2025 // An array fontFamilyArr is created containing a list of font family names as strings. const fontFamilyArr = ["Roboto", "Roboto Condensed", "Arial", "Verdana", "Tahoma", "Trebuchet MS", "Georgia", "Times New Roman", "Courier New", "Palatino Linotype", "Segoe UI", "Calibri", "Calibri Light", "Sans-Serif", "Helvetica", "Impact", "Garamond", "Comic Sans MS", "Lucida Console", "Franklin Gothic Medium"]; // Register Quill modules Quill.register('modules/mention', Mention); ImageResizor.Quill = Quill; Quill.register('modules/imageResizor', ImageResizor); // RS 17JAN2025 //The Quill font style attributor is imported and it is registered with Quil let fonts = Quill.import("attributors/style/font"); fonts.whitelist = fontFamilyArr; Quill.register(fonts, true); export const QuillConfiguration = { imageResizor: {}, toolbar: { container: [ [{ 'font': fontFamilyArr }], //RS 17JAN2025 Added font family dropdown ['bold', 'italic', 'underline', 'strike'], ['blockquote', 'code-block'], [{ header: [1, 2, 3, 4, 5, 6, false] }], [{ list: 'ordered' }, { list: 'bullet' }], [{ color: [] }, { background: [] }], [{ align: [] }], ['link', 'image', 'video'], ['formula'], ['clean'], ], }, mention: { allowedChars: /^[A-Za-z\sÅÄÖåäö]*$/, mentionDenotationChars: ['@', '#'], source: function (searchTerm, renderList) { const values = [ { id: 1, value: 'User 1' }, { id: 2, value: 'User 2' }, ]; if (searchTerm.length === 0) { renderList(values, searchTerm); } else { const matches = values.filter((item) => item.value.toLowerCase().includes(searchTerm.toLowerCase())); renderList(matches, searchTerm); } }, }, }; // resize: { // displaySize: true, // modules: ['Resize', 'DisplaySize', 'Toolbar'], // toolbarStyles: { // backgroundColor: 'black', // border: 'none', // color: 'white' // }, // handleStyles: { // backgroundColor: 'black', // border: 'none', // color: 'white' // } // }, export class CustomRichTextComponent { i18nService; changeService; value = ''; placeholder; error; question; rows; //The number of visible text lines for the control readOnly = false; textValueChange = new EventEmitter(); minLength; maxLength; // @Input() value: any = ''; // Set default value quillConfiguration = QuillConfiguration; subscription; constructor(i18nService, changeService) { this.i18nService = i18nService; this.changeService = changeService; } ngOnInit() { console.log('Rich Text Init:', { value: this.value, question: this.question }); if (this.value === undefined || this.value === null) { this.value = ''; this.textValueChange.emit(''); } this.initializeDependency(); } // Separated dependency initialization for better organization initializeDependency() { // AP-25MAR25 Parse subText if it's not already an object this.question['subText'] = typeof this.question?.subText === 'object' ? this.question?.subText : JSON.parse(this.question['subText'] || {}); if (this.question?.subText) { console.log('subText:', this.question.subText); try { const dependencyObj = this.question.subText; if (dependencyObj?.sourceQuestionId) { this.subscription = this.changeService.changeAnnounced$.subscribe((changeValue) => { console.log('Change Value:', changeValue); if (changeValue && changeValue.valueObj && changeValue.fromQuestionId === dependencyObj.sourceQuestionId) { this.value = changeValue.valueObj[dependencyObj.valueField]; this.textValueChange.emit(this.value); } this.changeService.confirmChange(dependencyObj.sourceQuestionId); }); } } catch (error) { console.error('Error parsing subText:', error); } } } // onEditorChange(event: any): void { // if (event && event.html !== undefined) { // this.textValueChange.emit(event.html); // } else { // this.textValueChange.emit(''); // } // } // onEditorChange(event: any): void { // console.log('Typing detected...', event.html); // if (this.typingTimer) { // clearTimeout(this.typingTimer); // Clear previous timer // } // this.typingTimer = setTimeout(() => { // console.log('Debounced event fired:', event.html); // const newValue = event?.html ? event.html : ''; // Ensure empty values are handled // this.textValueChange.emit(newValue); // }, this.doneTypingInterval); // } // RS 28JAN2015 onEditorFocusOut() { const currentValue = this.value || ''; this.textValueChange.emit(currentValue); console.log('Rich Text Editor Focus Out - Emitting Value:', currentValue); } // Added ngOnDestroy to prevent memory leaks ngOnDestroy() { if (this.subscription) { this.subscription.unsubscribe(); } } static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: CustomRichTextComponent, deps: [{ token: i1.I18nService }, { token: i2.ChangeService }], target: i0.ɵɵFactoryTarget.Component }); static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: CustomRichTextComponent, isStandalone: true, selector: "app-custom-rich-text", inputs: { value: "value", placeholder: "placeholder", error: "error", question: "question", rows: "rows", readOnly: "readOnly", minLength: "minLength", maxLength: "maxLength" }, outputs: { textValueChange: "textValueChange" }, ngImport: i0, template: "<!-- RS 06JAN25 -->\n<div class=\"rich-text-container\">\n <quill-editor\n [(ngModel)]=\"value\"\n [placeholder]=\"placeholder\"\n [modules]=\"quillConfiguration\"\n [readOnly]=\"readOnly\"\n (focusout)=\"onEditorFocusOut()\"\n [class.error]=\"error\">\n </quill-editor>\n <div *ngIf=\"error\" class=\"error-message\">\n {{ error }}\n </div>\n</div>", styles: [".rich-text-container{width:100%;margin:10px 0}.error{border:1px solid red}:is() .ql-editor img{cursor:pointer}:is() .image-resizer{display:block!important;visibility:visible!important}:is() .ql-editor .image-resizer{border:1px dashed #000;position:absolute}:is() .ql-editor .image-resizer .handle{background-color:#000;border:1px solid #fff;border-radius:50%;height:12px;width:12px;position:absolute}quill-editor{width:100%}\n"], dependencies: [{ kind: "component", type: QuillEditorComponent, selector: "quill-editor" }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i3.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }] }); } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: CustomRichTextComponent, decorators: [{ type: Component, args: [{ imports: [QuillEditorComponent, FormsModule, CommonModule], selector: 'app-custom-rich-text', standalone: true, template: "<!-- RS 06JAN25 -->\n<div class=\"rich-text-container\">\n <quill-editor\n [(ngModel)]=\"value\"\n [placeholder]=\"placeholder\"\n [modules]=\"quillConfiguration\"\n [readOnly]=\"readOnly\"\n (focusout)=\"onEditorFocusOut()\"\n [class.error]=\"error\">\n </quill-editor>\n <div *ngIf=\"error\" class=\"error-message\">\n {{ error }}\n </div>\n</div>", styles: [".rich-text-container{width:100%;margin:10px 0}.error{border:1px solid red}:is() .ql-editor img{cursor:pointer}:is() .image-resizer{display:block!important;visibility:visible!important}:is() .ql-editor .image-resizer{border:1px dashed #000;position:absolute}:is() .ql-editor .image-resizer .handle{background-color:#000;border:1px solid #fff;border-radius:50%;height:12px;width:12px;position:absolute}quill-editor{width:100%}\n"] }] }], ctorParameters: () => [{ type: i1.I18nService }, { type: i2.ChangeService }], propDecorators: { value: [{ type: Input }], placeholder: [{ type: Input }], error: [{ type: Input }], question: [{ type: Input }], rows: [{ type: Input }], readOnly: [{ type: Input }], textValueChange: [{ type: Output }], minLength: [{ type: Input }], maxLength: [{ type: Input }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3VzdG9tLXJpY2gtdGV4dC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9ueHQtYXBwL3NyYy9saWIvY29tcG9uZW50cy9jdXN0b20tcmljaC10ZXh0L2N1c3RvbS1yaWNoLXRleHQuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbnh0LWFwcC9zcmMvbGliL2NvbXBvbmVudHMvY3VzdG9tLXJpY2gtdGV4dC9jdXN0b20tcmljaC10ZXh0LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLHdGQUF3RjtBQUN4RixrQkFBa0I7QUFDbEIsT0FBTyxFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFVLE1BQU0sRUFBcUMsTUFBTSxlQUFlLENBQUM7QUFLbEgsT0FBTyxFQUFFLG9CQUFvQixFQUFnQixNQUFNLFdBQVcsQ0FBQztBQUMvRCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sZ0JBQWdCLENBQUE7QUFDNUMsT0FBTyxLQUFLLE1BQU0sT0FBTyxDQUFDO0FBQzFCLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDeEMsT0FBTyxZQUFZLE1BQU0scUJBQXFCLENBQUE7QUFDOUMsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDOzs7Ozs7QUFFL0MsZUFBZTtBQUNmLHVGQUF1RjtBQUN2RixNQUFNLGFBQWEsR0FBRyxDQUFDLFFBQVEsRUFBRSxrQkFBa0IsRUFBRSxPQUFPLEVBQUUsU0FBUyxFQUFFLFFBQVEsRUFBRSxjQUFjO0lBQy9GLFNBQVMsRUFBRSxpQkFBaUIsRUFBRSxhQUFhLEVBQUUsbUJBQW1CO0lBQ2hFLFVBQVUsRUFBRSxTQUFTLEVBQUUsZUFBZSxFQUFFLFlBQVksRUFBRSxXQUFXO0lBQ2pFLFFBQVEsRUFBRSxVQUFVLEVBQUUsZUFBZSxFQUFFLGdCQUFnQixFQUFFLHdC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QUE0QjtJQUM1Qiw4REFBOEQ7SUFDOUQsTUFBTTtJQUNOLDBDQUEwQztJQUMxQyx5REFBeUQ7SUFFekQseUZBQXlGO0lBQ3pGLDJDQUEyQztJQUMzQyxpQ0FBaUM7SUFDakMsSUFBSTtJQUVKLGVBQWU7SUFDZixnQkFBZ0I7UUFDZCxNQUFNLFlBQVksR0FBRyxJQUFJLENBQUMsS0FBSyxJQUFJLEVBQUUsQ0FBQztRQUN0QyxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUN4QyxPQUFPLENBQUMsR0FBRyxDQUFDLDhDQUE4QyxFQUFFLFlBQVksQ0FBQyxDQUFDO0lBQzVFLENBQUM7SUFFQyw0Q0FBNEM7SUFDNUMsV0FBVztRQUNULElBQUksSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO1lBQ3RCLElBQUksQ0FBQyxZQUFZLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDbEMsQ0FBQztJQUNILENBQUM7d0dBOUZVLHVCQUF1Qjs0RkFBdkIsdUJBQXVCLG1UQzNGcEMsd1hBYU0sb2VEdUVRLG9CQUFvQix3REFBRSxXQUFXLDhWQUFFLFlBQVk7OzRGQU9oRCx1QkFBdUI7a0JBUm5DLFNBQVM7OEJBQ0csQ0FBQyxvQkFBb0IsRUFBRSxXQUFXLEVBQUUsWUFBWSxDQUFDLFlBQ2hELHNCQUFzQixjQUNwQixJQUFJOzRHQU1ULEtBQUs7c0JBQWIsS0FBSztnQkFDRyxXQUFXO3NCQUFuQixLQUFLO2dCQUNHLEtBQUs7c0JBQWIsS0FBSztnQkFDRyxRQUFRO3NCQUFoQixLQUFLO2dCQUNHLElBQUk7c0JBQVosS0FBSztnQkFDRyxRQUFRO3NCQUFoQixLQUFLO2dCQUNJLGVBQWU7c0JBQXhCLE1BQU07Z0JBQ0UsU0FBUztzQkFBakIsS0FBSztnQkFDRyxTQUFTO3NCQUFqQixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQ2hhbmdlcyBjb21tZW50ZWQgb3V0IGR1ZSB0byBBbmd1bGFyIHZlcnNpb24gY29tcGF0aWJpbGl0eTsgd2lsbCBhcHBseSBhZnRlciB1cGdyYWRlLlxuLy8gLy8gUlMgMDZKQU4yMDI1XG5pbXBvcnQgeyBDb21wb25lbnQsIEV2ZW50RW1pdHRlciwgSW5wdXQsIE9uSW5pdCwgT3V0cHV0LCBPbkRlc3Ryb3ksIENVU1RPTV9FTEVNRU5UU19TQ0hFTUEgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEkxOG5TZXJ2aWNlIH0gZnJvbSAnLi4vLi4vaTE4bi5zZXJ2aWNlJztcbmltcG9ydCB7IFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgQ2hhbmdlU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL2NoYW5nZS5zZXJ2aWNlJztcbmltcG9ydCB7IERlcGVuZGVuY3lNZXRhIH0gZnJvbSAnLi4vLi4vaW50ZXJmYWNlcy9kZXBlbmRlbmN5TWV0YSc7XG5pbXBvcnQgeyBRdWlsbEVkaXRvckNvbXBvbmVudCwgUXVpbGxNb2R1bGVzIH0gZnJvbSAnbmd4LXF1aWxsJztcbmltcG9ydCB7IEZvcm1zTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnXG5pbXBvcnQgUXVpbGwgZnJvbSAncXVpbGwnO1xuaW1wb3J0IHsgTWVudGlvbiB9IGZyb20gJ3F1aWxsLW1lbnRpb24nO1xuaW1wb3J0IEltYWdlUmVzaXpvciBmcm9tICdxdWlsbC1pbWFnZS1yZXNpem9yJ1xuaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcblxuLy8gUlMgMTdKQU4yMDI1XG4vLyBBbiBhcnJheSBmb250RmFtaWx5QXJyIGlzIGNyZWF0ZWQgY29udGFpbmluZyBhIGxpc3Qgb2YgZm9udCBmYW1pbHkgbmFtZXMgYXMgc3RyaW5ncy5cbmNvbnN0IGZvbnRGYW1pbHlBcnIgPSBbXCJSb2JvdG9cIiwgXCJSb2JvdG8gQ29uZGVuc2VkXCIsIFwiQXJpYWxcIiwgXCJWZXJkYW5hXCIsIFwiVGFob21hXCIsIFwiVHJlYnVjaGV0IE1TXCIsXG4gIFwiR2VvcmdpYVwiLCBcIlRpbWVzIE5ldyBSb21hblwiLCBcIkNvdXJpZXIgTmV3XCIsIFwiUGFsYXRpbm8gTGlub3R5cGVcIixcbiAgXCJTZWdvZSBVSVwiLCBcIkNhbGlicmlcIiwgXCJDYWxpYnJpIExpZ2h0XCIsIFwiU2Fucy1TZXJpZlwiLCBcIkhlbHZldGljYVwiLFxuICBcIkltcGFjdFwiLCBcIkdhcmFtb25kXCIsIFwiQ29taWMgU2FucyBNU1wiLCBcIkx1Y2lkYSBDb25zb2xlXCIsIFwiRnJhbmtsaW4gR290aGljIE1lZGl1bVwiXTtcblxuLy8gUmVnaXN0ZXIgUXVpbGwgbW9kdWxlc1xuUXVpbGwucmVnaXN0ZXIoJ21vZHVsZXMvbWVudGlvbicsIE1lbnRpb24pO1xuSW1hZ2VSZXNpem9yLlF1aWxsID0gUXVpbGxcblF1aWxsLnJlZ2lzdGVyKCdtb2R1bGVzL2ltYWdlUmVzaXpvcicsIEltYWdlUmVzaXpvcilcblxuLy8gUlMgMTdKQU4yMDI1XG4vL1RoZSBRdWlsbCBmb250IHN0eWxlIGF0dHJpYnV0b3IgaXMgaW1wb3J0ZWQgYW5kIGl0IGlzIHJlZ2lzdGVyZWQgd2l0aCBRdWlsXG5sZXQgZm9udHM6IGFueSA9IFF1aWxsLmltcG9ydChcImF0dHJpYnV0b3JzL3N0eWxlL2ZvbnRcIik7XG5mb250cy53aGl0ZWxpc3QgPSBmb250RmFtaWx5QXJyO1xuUXVpbGwucmVnaXN0ZXIoZm9udHMsIHRydWUpO1xuXG5leHBvcnQgY29uc3QgUXVpbGxDb25maWd1cmF0aW9uOiBRdWlsbE1vZHVsZXMgPSB7XG4gICAgaW1hZ2VSZXNpem9yOiB7fSxcbiAgdG9vbGJhcjoge1xuICAgIGNvbnRhaW5lcjogW1xuICAgICAgW3sgJ2ZvbnQnOiBmb250RmFtaWx5QXJyIH1dLCAgLy9SUyAxN0pBTjIwMjUgIEFkZGVkIGZvbnQgZmFtaWx5IGRyb3Bkb3duXG4gICAgICBbJ2JvbGQnLCAnaXRhbGljJywgJ3VuZGVybGluZScsICdzdHJpa2UnXSxcbiAgICAgIFsnYmxvY2txdW90ZScsICdjb2RlLWJsb2NrJ10sXG4gICAgICBbeyBoZWFkZXI6IFsxLCAyLCAzLCA0LCA1LCA2LCBmYWxzZV0gfV0sXG4gICAgICBbeyBsaXN0OiAnb3JkZXJlZCcgfSwgeyBsaXN0OiAnYnVsbGV0JyB9XSxcbiAgICAgIFt7IGNvbG9yOiBbXSB9LCB7IGJhY2tncm91bmQ6IFtdIH1dLFxuICAgICAgW3sgYWxpZ246IFtdIH1dLFxuICAgICAgWydsaW5rJywgJ2ltYWdlJywgJ3ZpZGVvJ10sXG4gICAgICBbJ2Zvcm11bGEnXSxcbiAgICAgIFsnY2xlYW4nXSxcbiAgICBdLFxuICB9LFxuICBtZW50aW9uOiB7XG4gICAgYWxsb3dlZENoYXJzOiAvXltBLVphLXpcXHPDhcOEw5bDpcOkw7ZdKiQvLFxuICAgIG1lbnRpb25EZW5vdGF0aW9uQ2hhcnM6IFsnQCcsICcjJ10sXG4gICAgc291cmNlOiBmdW5jdGlvbiAoc2VhcmNoVGVybTogc3RyaW5nLCByZW5kZXJMaXN0OiBhbnkpIHtcbiAgICAgIGNvbnN0IHZhbHVlcyA9IFtcbiAgICAgICAgeyBpZDogMSwgdmFsdWU6ICdVc2VyIDEnIH0sXG4gICAgICAgIHsgaWQ6IDIsIHZhbHVlOiAnVXNlciAyJyB9LFxuICAgICAgXTtcblxuICAgICAgaWYgKHNlYXJjaFRlcm0ubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHJlbmRlckxpc3QodmFsdWVzLCBzZWFyY2hUZXJtKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IG1hdGNoZXMgPSB2YWx1ZXMuZmlsdGVyKChpdGVtKSA9PlxuICAgICAgICAgIGl0ZW0udmFsdWUudG9Mb3dlckNhc2UoKS5pbmNsdWRlcyhzZWFyY2hUZXJtLnRvTG93ZXJDYXNlKCkpXG4gICAgICAgICk7XG4gICAgICAgIHJlbmRlckxpc3QobWF0Y2hlcywgc2VhcmNoVGVybSk7XG4gICAgICB9XG4gICAgfSxcbiAgfSxcbn07XG5cbi8vIHJlc2l6ZToge1xuLy8gICAgIGRpc3BsYXlTaXplOiB0cnVlLFxuLy8gICAgIG1vZHVsZXM6IFsnUmVzaXplJywgJ0Rpc3BsYXlTaXplJywgJ1Rvb2xiYXInXSxcbi8vICAgICB0b29sYmFyU3R5bGVzOiB7XG4vLyAgICAgICAgIGJhY2tncm91bmRDb2xvcjogJ2JsYWNrJyxcbi8vICAgICAgICAgYm9yZGVyOiAnbm9uZScsXG4vLyAgICAgICAgIGNvbG9yOiAnd2hpdGUnXG4vLyAgICAgfSxcbi8vICAgICBoYW5kbGVTdHlsZXM6IHtcbi8vICAgICAgICAgYmFja2dyb3VuZENvbG9yOiAnYmxhY2snLFxuLy8gICAgICAgICBib3JkZXI6ICdub25lJyxcbi8vICAgICAgICAgY29sb3I6ICd3aGl0ZSdcbi8vICAgICB9XG4vLyB9LFxuQENvbXBvbmVudCh7XG4gICAgaW1wb3J0czogW1F1aWxsRWRpdG9yQ29tcG9uZW50LCBGb3Jtc01vZHVsZSAsQ29tbW9uTW9kdWxlXSxcbiAgICBzZWxlY3RvcjogJ2FwcC1jdXN0b20tcmljaC10ZXh0JyxcbiAgICBzdGFuZGFsb25lOiB0cnVlLFxuICAgIHRlbXBsYXRlVXJsOiAnLi9jdXN0b20tcmljaC10ZXh0LmNvbXBvbmVudC5odG1sJyxcbiAgICBzdHlsZVVybHM6IFsnLi9jdXN0b20tcmljaC10ZXh0LmNvbXBvbmVudC5jc3MnXVxufSlcblxuZXhwb3J0IGNsYXNzIEN1c3RvbVJpY2hUZXh0Q29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3kge1xuICBASW5wdXQoKSB2YWx1ZTogYW55IHwgYW55W10gPSAnJztcbiAgQElucHV0KCkgcGxhY2Vob2xkZXI6IHN0cmluZztcbiAgQElucHV0KCkgZXJyb3I6IGFueTtcbiAgQElucHV0KCkgcXVlc3Rpb246IGFueTtcbiAgQElucHV0KCkgcm93czpOdW1iZXI7IC8vVGhlIG51bWJlciBvZiB2aXNpYmxlIHRleHQgbGluZXMgZm9yIHRoZSBjb250cm9sXG4gIEBJbnB1dCgpIHJlYWRPbmx5ID0gZmFsc2U7XG4gIEBPdXRwdXQoKSB0ZXh0VmFsdWVDaGFuZ2U6IEV2ZW50RW1pdHRlcjxzdHJpbmc+ID0gbmV3IEV2ZW50RW1pdHRlcjxzdHJpbmc+KCk7XG4gIEBJbnB1dCgpIG1pbkxlbmd0aD86IG51bWJlcjtcbiAgQElucHV0KCkgbWF4TGVuZ3RoPzogbnVtYmVyO1xuICAvLyBASW5wdXQoKSB2YWx1ZTogYW55ID0gJyc7IC8vIFNldCBkZWZhdWx0IHZhbHVlXG5cbiAgcXVpbGxDb25maWd1cmF0aW9uOiBRdWlsbE1vZHVsZXMgPSBRdWlsbENvbmZpZ3VyYXRpb247XG4gIHN1YnNjcmlwdGlvbjogU3Vic2NyaXB0aW9uO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHB1YmxpYyBpMThuU2VydmljZTogSTE4blNlcnZpY2UsXG4gICAgcHJpdmF0ZSBjaGFuZ2VTZXJ2aWNlOiBDaGFuZ2VTZXJ2aWNlXG4gICkgeyB9XG5cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgY29uc29sZS5sb2coJ1JpY2ggVGV4dCBJbml0OicsIHtcbiAgICAgIHZhbHVlOiB0aGlzLnZhbHVlLFxuICAgICAgcXVlc3Rpb246IHRoaXMucXVlc3Rpb25cbiAgICB9KTtcbiAgICBpZiAodGhpcy52YWx1ZSA9PT0gdW5kZWZpbmVkIHx8IHRoaXMudmFsdWUgPT09IG51bGwpIHtcbiAgICAgIHRoaXMudmFsdWUgPSAnJztcbiAgICAgIHRoaXMudGV4dFZhbHVlQ2hhbmdlLmVtaXQoJycpO1xuXG4gICAgfVxuICAgIHRoaXMuaW5pdGlhbGl6ZURlcGVuZGVuY3koKTtcbiAgfVxuXG4gIC8vIFNlcGFyYXRlZCBkZXBlbmRlbmN5IGluaXRpYWxpemF0aW9uIGZvciBiZXR0ZXIgb3JnYW5pemF0aW9uXG4gIHByaXZhdGUgaW5pdGlhbGl6ZURlcGVuZGVuY3koKTogdm9pZCB7XG4gICAgLy8gQVAtMjVNQVIyNSBQYXJzZSBzdWJUZXh0IGlmIGl0J3Mgbm90IGFscmVhZHkgYW4gb2JqZWN0XG4gICAgdGhpcy5xdWVzdGlvblsnc3ViVGV4dCddID0gdHlwZW9mIHRoaXMucXVlc3Rpb24/LnN1YlRleHQgPT09ICdvYmplY3QnID8gdGhpcy5xdWVzdGlvbj8uc3ViVGV4dCA6IEpTT04ucGFyc2UodGhpcy5xdWVzdGlvblsnc3ViVGV4dCddIHx8IHt9KTtcbiAgICBpZiAodGhpcy5xdWVzdGlvbj8uc3ViVGV4dCkge1xuICAgICAgICBjb25zb2xlLmxvZygnc3ViVGV4dDonLCB0aGlzLnF1ZXN0aW9uLnN1YlRleHQpO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgZGVwZW5kZW5jeU9iajogRGVwZW5kZW5jeU1ldGEgPSB0aGlzLnF1ZXN0aW9uLnN1YlRleHQ7XG4gICAgICAgICAgICBpZiAoZGVwZW5kZW5jeU9iaj8uc291cmNlUXVlc3Rpb25JZCkge1xuICAgICAgICAgICAgICAgIHRoaXMuc3Vic2NyaXB0aW9uID0gdGhpcy5jaGFuZ2VTZXJ2aWNlLmNoYW5nZUFubm91bmNlZCQuc3Vic2NyaWJlKFxuICAgICAgICAgICAgICAgICAgICAoY2hhbmdlVmFsdWUpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdDaGFuZ2UgVmFsdWU6JywgY2hhbmdlVmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNoYW5nZVZhbHVlICYmIGNoYW5nZVZhbHVlLnZhbHVlT2JqICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhbmdlVmFsdWUuZnJvbVF1ZXN0aW9uSWQgPT09IGRlcGVuZGVuY3lPYmouc291cmNlUXVlc3Rpb25JZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudmFsdWUgPSBjaGFuZ2VWYWx1ZS52YWx1ZU9ialtkZXBlbmRlbmN5T2JqLnZhbHVlRmllbGRdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudGV4dFZhbHVlQ2hhbmdlLmVtaXQodGhpcy52YWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNoYW5nZVNlcnZpY2UuY29uZmlybUNoYW5nZShkZXBlbmRlbmN5T2JqLnNvdXJjZVF1ZXN0aW9uSWQpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yIHBhcnNpbmcgc3ViVGV4dDonLCBlcnJvcik7XG4gICAgICAgIH1cbiAgICB9XG59XG5cblxuLy8gb25FZGl0b3JDaGFuZ2UoZXZlbnQ6IGFueSk6IHZvaWQge1xuLy8gICBpZiAoZXZlbnQgJiYgZXZlbnQuaHRtbCAhPT0gdW5kZWZpbmVkKSB7XG4vLyAgICAgdGhpcy50ZXh0VmFsdWVDaGFuZ2UuZW1pdChldmVudC5odG1sKTtcbi8vICAgfSBlbHNlIHtcbi8vICAgICB0aGlzLnRleHRWYWx1ZUNoYW5nZS5lbWl0KCcnKTtcbi8vICAgfVxuLy8gfVxuLy8gb25FZGl0b3JDaGFuZ2UoZXZlbnQ6IGFueSk6IHZvaWQge1xuLy8gICBjb25zb2xlLmxvZygnVHlwaW5nIGRldGVjdGVkLi4uJywgZXZlbnQuaHRtbCk7XG5cbi8vICAgaWYgKHRoaXMudHlwaW5nVGltZXIpIHtcbi8vICAgICBjbGVhclRpbWVvdXQodGhpcy50eXBpbmdUaW1lcik7IC8vIENsZWFyIHByZXZpb3VzIHRpbWVyXG4vLyAgIH1cbi8vICAgdGhpcy50eXBpbmdUaW1lciA9IHNldFRpbWVvdXQoKCkgPT4ge1xuLy8gICAgIGNvbnNvbGUubG9nKCdEZWJvdW5jZWQgZXZlbnQgZmlyZWQ6JywgZXZlbnQuaHRtbCk7XG5cbi8vICAgICBjb25zdCBuZXdWYWx1ZSA9IGV2ZW50Py5odG1sID8gZXZlbnQuaHRtbCA6ICcnOyAvLyBFbnN1cmUgZW1wdHkgdmFsdWVzIGFyZSBoYW5kbGVkXG4vLyAgICAgdGhpcy50ZXh0VmFsdWVDaGFuZ2UuZW1pdChuZXdWYWx1ZSk7XG4vLyAgIH0sIHRoaXMuZG9uZVR5cGluZ0ludGVydmFsKTtcbi8vIH1cblxuLy8gUlMgMjhKQU4yMDE1XG5vbkVkaXRvckZvY3VzT3V0KCk6IHZvaWQge1xuICBjb25zdCBjdXJyZW50VmFsdWUgPSB0aGlzLnZhbHVlIHx8ICcnO1xuICB0aGlzLnRleHRWYWx1ZUNoYW5nZS5lbWl0KGN1cnJlbnRWYWx1ZSk7XG4gIGNvbnNvbGUubG9nKCdSaWNoIFRleHQgRWRpdG9yIEZvY3VzIE91dCAtIEVtaXR0aW5nIFZhbHVlOicsIGN1cnJlbnRWYWx1ZSk7XG59XG5cbiAgLy8gQWRkZWQgbmdPbkRlc3Ryb3kgdG8gcHJldmVudCBtZW1vcnkgbGVha3NcbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuc3Vic2NyaXB0aW9uKSB7XG4gICAgICB0aGlzLnN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICAgIH1cbiAgfVxufVxuXG5cbiIsIjwhLS0gUlMgMDZKQU4yNSAtLT5cbjxkaXYgY2xhc3M9XCJyaWNoLXRleHQtY29udGFpbmVyXCI+XG4gIDxxdWlsbC1lZGl0b3JcbiAgICBbKG5nTW9kZWwpXT1cInZhbHVlXCJcbiAgICBbcGxhY2Vob2xkZXJdPVwicGxhY2Vob2xkZXJcIlxuICAgIFttb2R1bGVzXT1cInF1aWxsQ29uZmlndXJhdGlvblwiXG4gICAgW3JlYWRPbmx5XT1cInJlYWRPbmx5XCJcbiAgICAoZm9jdXNvdXQpPVwib25FZGl0b3JGb2N1c091dCgpXCJcbiAgICBbY2xhc3MuZXJyb3JdPVwiZXJyb3JcIj5cbiAgPC9xdWlsbC1lZGl0b3I+XG4gIDxkaXYgKm5nSWY9XCJlcnJvclwiIGNsYXNzPVwiZXJyb3ItbWVzc2FnZVwiPlxuICAgIHt7IGVycm9yIH19XG4gIDwvZGl2PlxuPC9kaXY+Il19