UNPKG

@sedeh/into-pipes

Version:

Have you ever wanted to transform data in different parts of your application into interactive objects without writing a single line of code?

161 lines 19.7 kB
import { Component, ViewChild, Output, EventEmitter } from '@angular/core'; import * as i0 from "@angular/core"; import * as i1 from "@angular/common"; export class TextComponent { constructor(renderer) { this.renderer = renderer; this.rows = 4; this.limit = 0; this.editName = false; this.counter = false; this.locked = false; this.disabled = false; this.active = true; this.validate = (item, newValue) => true; this.onIntoComponentChange = new EventEmitter(); } keyup(event) { if (!this.disabled) { const code = event.which; if ((code === 48) || (code === 8)) { this.source = event.target.value; } else if (((code > 48) && (code <= 90)) || ((code >= 96) && (code <= 111)) || (code == 32) || ((code >= 186) && (code <= 222))) { if (!this.limit || this.source.length < this.limit) { this.source = event.target.value; } } else if ((code === 13) || (code === 9) || (code === 27)) { this.updateValue(code); } } } updateValue(code) { if (!this.disabled) { if (this.oldValue !== String(this.source)) { if (this.validate(this.data, String(this.source))) { this.editName = false; this.onIntoComponentChange.emit({ id: this.id, name: this.name, value: this.source, type: 'blur', item: this.oldValue }); this.oldValue = String(this.source); } else { this.source = this.oldValue; this.editName = false; } } } if (code === 9 || code === 0) { this.editName = false; } } blur(event) { event.stopPropagation(); event.preventDefault(); this.updateValue(0); } focus(event) { if (!this.disabled) { this.click(event); } } click(event) { event.stopPropagation(); event.preventDefault(); if (!this.disabled) { this.editName = true; setTimeout(() => { if (this.nameEditor) { this.renderer.selectRootElement(this.nameEditor.nativeElement).focus(); } }, 99); } } static settingsPatterns() { return ['text:::true:false', 'text:::true:true']; //rows, limit, counter, locked by default } transform(source, data, args) { this.data = data; this.source = source; this.oldValue = source; this.rows = args?.length ? args[0] : 4; this.limit = args?.length > 1 ? args[1] : 0; this.counter = (args?.length && args[2].length) > 2 ? (args[2] === 'true') : false; this.locked = (args?.length > 3 && args[3].length) ? args[3] === 'true' : false; } } TextComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: TextComponent, deps: [{ token: i0.Renderer2 }], target: i0.ɵɵFactoryTarget.Component }); TextComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.10", type: TextComponent, selector: "text-component", outputs: { onIntoComponentChange: "onIntoComponentChange" }, viewQueries: [{ propertyName: "nameEditor", first: true, predicate: ["nameEditor"], descendants: true }, { propertyName: "nameHolder", first: true, predicate: ["nameHolder"], descendants: true }], ngImport: i0, template: ` <span class="text-wrapper" *ngIf="locked || editName"> <textarea #nameEditor [id]="id" [name]="name" [value]="source" [disabled]="disabled" [attr.maxlength]="limit ? limit : null" [rows]="rows" (blur)="blur($event)" (keyup)='keyup($event)'> </textarea> <span *ngIf="counter" class="counter" [textContent]="limit ? (limit - source.length) + ' remaining' : source.length + ' typed'"> </span> </span> <span #nameHolder *ngIf="!locked && !editName" class="locked {{disabled ? 'disabled' : ''}}" tabindex="{{active ? 0 : -1}}" (click)="click($event)" (keyup)="focus($event)" [innerHTML]="source"> </span> `, isInline: true, styles: [".locked{display:block;cursor:pointer;min-height:var(--sedeh-min-height, 25px);min-width:var(--sedeh-min-width, 25px);-webkit-user-select:none;user-select:none;border:1px solid transparent}.text-wrapper{box-sizing:border-box;display:table;width:100%}.text-wrapper textarea{box-sizing:border-box;display:block;cursor:beam;width:100%}.counter{display:table;float:right}:host{box-sizing:border-box;width:100%;display:table;float:left;min-height:var(--sedeh-min-height, 25px);min-width:var(--sedeh-min-width, 25px)}:host .locked:hover{border:var(--sedeh-solid-border, 1px solid #fabdab)}:host .locked.disabled:hover{border-color:transparent;cursor:default}\n"], dependencies: [{ kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }] }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: TextComponent, decorators: [{ type: Component, args: [{ selector: 'text-component', template: ` <span class="text-wrapper" *ngIf="locked || editName"> <textarea #nameEditor [id]="id" [name]="name" [value]="source" [disabled]="disabled" [attr.maxlength]="limit ? limit : null" [rows]="rows" (blur)="blur($event)" (keyup)='keyup($event)'> </textarea> <span *ngIf="counter" class="counter" [textContent]="limit ? (limit - source.length) + ' remaining' : source.length + ' typed'"> </span> </span> <span #nameHolder *ngIf="!locked && !editName" class="locked {{disabled ? 'disabled' : ''}}" tabindex="{{active ? 0 : -1}}" (click)="click($event)" (keyup)="focus($event)" [innerHTML]="source"> </span> `, styles: [".locked{display:block;cursor:pointer;min-height:var(--sedeh-min-height, 25px);min-width:var(--sedeh-min-width, 25px);-webkit-user-select:none;user-select:none;border:1px solid transparent}.text-wrapper{box-sizing:border-box;display:table;width:100%}.text-wrapper textarea{box-sizing:border-box;display:block;cursor:beam;width:100%}.counter{display:table;float:right}:host{box-sizing:border-box;width:100%;display:table;float:left;min-height:var(--sedeh-min-height, 25px);min-width:var(--sedeh-min-width, 25px)}:host .locked:hover{border:var(--sedeh-solid-border, 1px solid #fabdab)}:host .locked.disabled:hover{border-color:transparent;cursor:default}\n"] }] }], ctorParameters: function () { return [{ type: i0.Renderer2 }]; }, propDecorators: { nameEditor: [{ type: ViewChild, args: ["nameEditor"] }], nameHolder: [{ type: ViewChild, args: ["nameHolder"] }], onIntoComponentChange: [{ type: Output, args: ["onIntoComponentChange"] }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGV4dC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9pbnRvLXBpcGVzL3NyYy9saWIvdGV4dC90ZXh0LmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBYSxNQUFNLEVBQUUsWUFBWSxFQUFFLE1BQU0sZUFBZSxDQUFDOzs7QUFzRHRGLE1BQU0sT0FBTyxhQUFhO0lBeUJ4QixZQUFvQixRQUFtQjtRQUFuQixhQUFRLEdBQVIsUUFBUSxDQUFXO1FBbkJ2QyxTQUFJLEdBQUcsQ0FBQyxDQUFDO1FBQ1QsVUFBSyxHQUFHLENBQUMsQ0FBQztRQUNWLGFBQVEsR0FBRyxLQUFLLENBQUM7UUFDakIsWUFBTyxHQUFHLEtBQUssQ0FBQztRQUNoQixXQUFNLEdBQUcsS0FBSyxDQUFDO1FBRWYsYUFBUSxHQUFHLEtBQUssQ0FBQztRQUNqQixXQUFNLEdBQUcsSUFBSSxDQUFDO1FBQ2QsYUFBUSxHQUFHLENBQUMsSUFBUyxFQUFFLFFBQWEsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDO1FBUzlDLDBCQUFxQixHQUFHLElBQUksWUFBWSxFQUFFLENBQUM7SUFJM0MsQ0FBQztJQUNELEtBQUssQ0FBQyxLQUFVO1FBQ2QsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUU7WUFDbEIsTUFBTSxJQUFJLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQztZQUN6QixJQUFJLENBQUMsSUFBSSxLQUFLLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxLQUFLLENBQUMsQ0FBQyxFQUFFO2dCQUNqQyxJQUFJLENBQUMsTUFBTSxHQUFHLEtBQUssQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDO2FBQ2xDO2lCQUFNLElBQUksQ0FBQyxDQUFDLElBQUksR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLElBQUksSUFBSSxFQUFFLENBQUMsQ0FBQztnQkFDcEMs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ekIsU0FBUzsrQkFDSSxnQkFBZ0IsWUFDaEI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0tBMEJUO2dHQXdDSCxVQUFVO3NCQURULFNBQVM7dUJBQUMsWUFBWTtnQkFJdkIsVUFBVTtzQkFEVCxTQUFTO3VCQUFDLFlBQVk7Z0JBSXZCLHFCQUFxQjtzQkFEcEIsTUFBTTt1QkFBQyx1QkFBdUIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIFZpZXdDaGlsZCwgUmVuZGVyZXIyLCBPdXRwdXQsIEV2ZW50RW1pdHRlciB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBQaXBlQ29tcG9uZW50SW50ZXJmYWNlIH0gZnJvbSAnLi4vY29tbW9uL3BpcGUuY29tcG9uZW50LmludGVyZmFjZSc7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICAgIHNlbGVjdG9yOiAndGV4dC1jb21wb25lbnQnLFxyXG4gICAgdGVtcGxhdGU6IGBcclxuICAgIDxzcGFuIGNsYXNzPVwidGV4dC13cmFwcGVyXCIgKm5nSWY9XCJsb2NrZWQgfHwgZWRpdE5hbWVcIj5cclxuICAgICAgPHRleHRhcmVhICNuYW1lRWRpdG9yXHJcbiAgICAgICAgW2lkXT1cImlkXCJcclxuICAgICAgICBbbmFtZV09XCJuYW1lXCJcclxuICAgICAgICBbdmFsdWVdPVwic291cmNlXCJcclxuICAgICAgICBbZGlzYWJsZWRdPVwiZGlzYWJsZWRcIlxyXG4gICAgICAgIFthdHRyLm1heGxlbmd0aF09XCJsaW1pdCA/IGxpbWl0IDogbnVsbFwiXHJcbiAgICAgICAgW3Jvd3NdPVwicm93c1wiXHJcbiAgICAgICAgKGJsdXIpPVwiYmx1cigkZXZlbnQpXCIgXHJcbiAgICAgICAgKGtleXVwKT0na2V5dXAoJGV2ZW50KSc+XHJcbiAgICAgIDwvdGV4dGFyZWE+XHJcbiAgICAgIDxzcGFuIFxyXG4gICAgICAgICpuZ0lmPVwiY291bnRlclwiIFxyXG4gICAgICAgIGNsYXNzPVwiY291bnRlclwiIFxyXG4gICAgICAgIFt0ZXh0Q29udGVudF09XCJsaW1pdCA/IChsaW1pdCAtIHNvdXJjZS5sZW5ndGgpICsgJyByZW1haW5pbmcnIDogc291cmNlLmxlbmd0aCArICcgdHlwZWQnXCI+XHJcbiAgICAgIDwvc3Bhbj5cclxuICAgIDwvc3Bhbj5cclxuICAgIDxzcGFuICNuYW1lSG9sZGVyXHJcbiAgICAgICAgKm5nSWY9XCIhbG9ja2VkICYmICFlZGl0TmFtZVwiXHJcbiAgICAgICAgY2xhc3M9XCJsb2NrZWQge3tkaXNhYmxlZCA/ICdkaXNhYmxlZCcgOiAnJ319XCJcclxuICAgICAgICB0YWJpbmRleD1cInt7YWN0aXZlID8gMCA6IC0xfX1cIlxyXG4gICAgICAgIChjbGljayk9XCJjbGljaygkZXZlbnQpXCJcclxuICAgICAgICAoa2V5dXApPVwiZm9jdXMoJGV2ZW50KVwiXHJcbiAgICAgICAgW2lubmVySFRNTF09XCJzb3VyY2VcIj5cclxuICAgIDwvc3Bhbj5cclxuICAgIGAsXHJcbiAgICBzdHlsZXM6IFtcclxuICAgICAgICBgXHJcbiAgICAgICAgLmxvY2tlZCB7XHJcbiAgICAgICAgICBkaXNwbGF5OiBibG9jaztcclxuICAgICAgICAgIGN1cnNvcjogcG9pbnRlcjtcclxuICAgICAgICAgIG1pbi1oZWlnaHQ6IHZhcigtLXNlZGVoLW1pbi1oZWlnaHQsIDI1cHgpO1xyXG4gICAgICAgICAgbWluLXdpZHRoOiB2YXIoLS1zZWRlaC1taW4td2lkdGgsIDI1cHgpO1xyXG4gICAgICAgICAgLXdlYmtpdC11c2VyLXNlbGVjdDogbm9uZTsgICAgICAgXHJcbiAgICAgICAgICAtbW96LXVzZXItc2VsZWN0OiBub25lO1xyXG4gICAgICAgICAgLW1zLXVzZXItc2VsZWN0OiBub25lO1xyXG4gICAgICAgICAgdXNlci1zZWxlY3Q6IG5vbmU7XHJcbiAgICAgICAgICBib3JkZXI6IDFweCBzb2xpZCB0cmFuc3BhcmVudDtcclxuICAgICAgICB9XHJcbiAgICAgICAgLnRleHQtd3JhcHBlcntib3gtc2l6aW5nOiBib3JkZXItYm94O2Rpc3BsYXk6dGFibGU7d2lkdGg6IDEwMCU7fVxyXG4gICAgICAgIC50ZXh0LXdyYXBwZXIgdGV4dGFyZWEge2JveC1zaXppbmc6IGJvcmRlci1ib3g7ZGlzcGxheTpibG9jaztjdXJzb3I6IGJlYW07d2lkdGg6IDEwMCU7fVxyXG4gICAgICAgIC5jb3VudGVye2Rpc3BsYXk6IHRhYmxlO2Zsb2F0OnJpZ2h0O31cclxuICAgICAgICA6aG9zdCB7Ym94LXNpemluZzogYm9yZGVyLWJveDt3aWR0aDogMTAwJTtkaXNwbGF5OnRhYmxlO2Zsb2F0OmxlZnQ7bWluLWhlaWdodDogdmFyKC0tc2VkZWgtbWluLWhlaWdodCwgMjVweCk7bWluLXdpZHRoOiB2YXIoLS1zZWRlaC1taW4td2lkdGgsIDI1cHgpO31cclxuICAgICAgICA6aG9zdCAubG9ja2VkOmhvdmVye2JvcmRlcjogdmFyKC0tc2VkZWgtc29saWQtYm9yZGVyLCAxcHggc29saWQgI2ZhYmRhYik7fVxyXG4gICAgICAgIDpob3N0IC5sb2NrZWQuZGlzYWJsZWQ6aG92ZXJ7Ym9yZGVyLWNvbG9yOiB0cmFuc3BhcmVudDtjdXJzb3I6IGRlZmF1bHQ7fVxyXG4gICAgICAgIGBcclxuICAgIF1cclxufSlcclxuZXhwb3J0IGNsYXNzIFRleHRDb21wb25lbnQgaW1wbGVtZW50cyBQaXBlQ29tcG9uZW50SW50ZXJmYWNlIHtcclxuXHJcbiAgc291cmNlITogc3RyaW5nO1xyXG4gIGRhdGE6IGFueTtcclxuICBpZCE6IHN0cmluZztcclxuICBuYW1lITogc3RyaW5nO1xyXG4gIHJvd3MgPSA0O1xyXG4gIGxpbWl0ID0gMDtcclxuICBlZGl0TmFtZSA9IGZhbHNlO1xyXG4gIGNvdW50ZXIgPSBmYWxzZTtcclxuICBsb2NrZWQgPSBmYWxzZTtcclxuICBvbGRWYWx1ZSE6IHN0cmluZztcclxuICBkaXNhYmxlZCA9IGZhbHNlO1xyXG4gIGFjdGl2ZSA9IHRydWU7XHJcbiAgdmFsaWRhdGUgPSAoaXRlbTogYW55LCBuZXdWYWx1ZTogYW55KSA9PiB0cnVlO1xyXG5cclxuICBAVmlld0NoaWxkKFwibmFtZUVkaXRvclwiKVxyXG4gIG5hbWVFZGl0b3I6IGFueTtcclxuXHJcbiAgQFZpZXdDaGlsZChcIm5hbWVIb2xkZXJcIilcclxuICBuYW1lSG9sZGVyOiBhbnlcclxuXHJcbiAgQE91dHB1dChcIm9uSW50b0NvbXBvbmVudENoYW5nZVwiKVxyXG4gIG9uSW50b0NvbXBvbmVudENoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcclxuXHJcbiAgY29uc3RydWN0b3IocHJpdmF0ZSByZW5kZXJlcjogUmVuZGVyZXIyKSB7XHJcblxyXG4gIH1cclxuICBrZXl1cChldmVudDogYW55KSB7ICAgXHJcbiAgICBpZiAoIXRoaXMuZGlzYWJsZWQpIHtcclxuICAgICAgY29uc3QgY29kZSA9IGV2ZW50LndoaWNoO1xyXG4gICAgICBpZiAoKGNvZGUgPT09IDQ4KSB8fCAoY29kZSA9PT0gOCkpIHtcclxuICAgICAgICB0aGlzLnNvdXJjZSA9IGV2ZW50LnRhcmdldC52YWx1ZTtcclxuICAgICAgfSBlbHNlIGlmICgoKGNvZGUgPiA0OCkgJiYgKGNvZGUgPD0gOTApKSB8fFxyXG4gICAgICAgICAgKChjb2RlID49IDk2KSAmJiAoY29kZSA8PSAxMTEpKSB8fCAoY29kZSA9PSAzMikgfHxcclxuICAgICAgICAgICgoY29kZSA+PSAxODYpICYmIChjb2RlIDw9IDIyMikpKSB7XHJcbiAgICAgICAgICAgIGlmICghdGhpcy5saW1pdCB8fCB0aGlzLnNvdXJjZS5sZW5ndGggPCB0aGlzLmxpbWl0KSB7XHJcbiAgICAgICAgICAgICAgdGhpcy5zb3VyY2UgPSBldmVudC50YXJnZXQudmFsdWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgfSBlbHNlIGlmICgoY29kZSA9PT0gMTMpIHx8IChjb2RlID09PSA5KSB8fCAoY29kZSA9PT0gMjcpICkge1xyXG4gICAgICAgIHRoaXMudXBkYXRlVmFsdWUoY29kZSk7XHJcbiAgICAgIH1cclxuICAgIH0gXHJcbiAgfVxyXG4gIHByaXZhdGUgdXBkYXRlVmFsdWUoY29kZTogbnVtYmVyKSB7XHJcbiAgICBpZiAoIXRoaXMuZGlzYWJsZWQpIHtcclxuICAgICAgaWYgKHRoaXMub2xkVmFsdWUgIT09IFN0cmluZyh0aGlzLnNvdXJjZSkpIHtcclxuICAgICAgICBpZiAodGhpcy52YWxpZGF0ZSh0aGlzLmRhdGEsIFN0cmluZyh0aGlzLnNvdXJjZSkpKSB7XHJcbiAgICAgICAgICB0aGlzLmVkaXROYW1lID0gZmFsc2U7XHJcbiAgICAgICAgICB0aGlzLm9uSW50b0NvbXBvbmVudENoYW5nZS5lbWl0KHtcclxuICAgICAgICAgICAgaWQ6IHRoaXMuaWQsXHJcbiAgICAgICAgICAgIG5hbWU6IHRoaXMubmFtZSxcclxuICAgICAgICAgICAgdmFsdWU6IHRoaXMuc291cmNlLFxyXG4gICAgICAgICAgICB0eXBlOiAnYmx1cicsXHJcbiAgICAgICAgICAgIGl0ZW06IHRoaXMub2xkVmFsdWVcclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgdGhpcy5vbGRWYWx1ZSA9IFN0cmluZyh0aGlzLnNvdXJjZSk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIHRoaXMuc291cmNlID0gdGhpcy5vbGRWYWx1ZTtcclxuICAgICAgICAgIHRoaXMuZWRpdE5hbWUgPSBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGlmIChjb2RlID09PSA5IHx8IGNvZGUgPT09IDApIHtcclxuICAgICAgdGhpcy5lZGl0TmFtZSA9IGZhbHNlO1xyXG4gICAgfVxyXG4gIH1cclxuICBibHVyKGV2ZW50OiBhbnkpIHtcclxuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xyXG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuICAgIHRoaXMudXBkYXRlVmFsdWUoMCk7XHJcbiAgfVxyXG4gIGZvY3VzKGV2ZW50OiBhbnkpIHtcclxuICAgIGlmICghdGhpcy5kaXNhYmxlZCkge1xyXG4gICAgICB0aGlzLmNsaWNrKGV2ZW50KTtcclxuICAgIH1cclxuICB9XHJcbiAgY2xpY2soZXZlbnQ6IGFueSkge1xyXG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XHJcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gIFxyXG4gICAgaWYgKCF0aGlzLmRpc2FibGVkKSB7XHJcbiAgICAgIHRoaXMuZWRpdE5hbWUgPSB0cnVlO1xyXG5cclxuICAgICAgc2V0VGltZW91dCgoKT0+e1xyXG4gICAgICAgIGlmICh0aGlzLm5hbWVFZGl0b3IpIHtcclxuICAgICAgICAgIHRoaXMucmVuZGVyZXIuc2VsZWN0Um9vdEVsZW1lbnQodGhpcy5uYW1lRWRpdG9yLm5hdGl2ZUVsZW1lbnQpLmZvY3VzKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9LDk5KTtcclxuICAgIH1cclxuICB9XHJcbiAgc3RhdGljIHNldHRpbmdzUGF0dGVybnMoKSB7XHJcbiAgICByZXR1cm4gWyd0ZXh0Ojo6dHJ1ZTpmYWxzZScsICd0ZXh0Ojo6dHJ1ZTp0cnVlJ107IC8vcm93cywgbGltaXQsIGNvdW50ZXIsIGxvY2tlZCBieSBkZWZhdWx0XHJcbiAgfVxyXG4gIHRyYW5zZm9ybShzb3VyY2U6IGFueSwgZGF0YTogYW55LCBhcmdzOiBhbnlbXSkge1xyXG4gICAgdGhpcy5kYXRhID0gZGF0YTtcclxuICAgIHRoaXMuc291cmNlID0gc291cmNlO1xyXG4gICAgdGhpcy5vbGRWYWx1ZSA9IHNvdXJjZTtcclxuICAgIHRoaXMucm93cyA9IGFyZ3M/Lmxlbmd0aCA/IGFyZ3NbMF0gOiA0O1xyXG4gICAgdGhpcy5saW1pdCA9IGFyZ3M/Lmxlbmd0aCA+IDEgPyBhcmdzWzFdIDogMDtcclxuICAgIHRoaXMuY291bnRlciA9IChhcmdzPy5sZW5ndGggJiYgYXJnc1syXS5sZW5ndGgpID4gMiA/IChhcmdzWzJdID09PSAndHJ1ZScpIDogZmFsc2U7XHJcbiAgICB0aGlzLmxvY2tlZCA9IChhcmdzPy5sZW5ndGggPiAzICYmIGFyZ3NbM10ubGVuZ3RoKSA/IGFyZ3NbM10gPT09ICd0cnVlJyA6IGZhbHNlO1xyXG4gIH1cclxufVxyXG4iXX0=