UNPKG

gentics-ui-core

Version:

This is the common core framework for the Gentics CMS and Mesh UI, and other Angular applications.

164 lines 19.8 kB
import { ChangeDetectorRef, Component, ElementRef, EventEmitter, forwardRef, Input, Output, Renderer2, ViewChild } from '@angular/core'; import { NG_VALUE_ACCESSOR } from '@angular/forms'; import * as i0 from "@angular/core"; import * as i1 from "ngx-autosize"; const GTX_TEXTAREA_VALUE_ACCESSOR = { provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => Textarea), multi: true }; /** * The Textarea wraps the native `<textarea>` form element. Textareas automatically grow to accommodate their content. * * ```html * <gtx-textarea label="Message" [(ngModel)]="message"></gtx-textarea> * ``` */ export class Textarea { constructor(renderer, changeDetector, elementRef) { this.renderer = renderer; this.changeDetector = changeDetector; this.elementRef = elementRef; /** * Sets the textarea to be auto-focused. Handled by `AutofocusDirective`. */ this.autofocus = false; /** * Sets the disabled state. */ this.disabled = false; /** * Sets the readonly state. */ this.readonly = false; /** * Sets the required state. */ this.required = false; /** * Sets the value of the control. */ this.value = ''; /** * Sets the label of the control. */ this.label = ''; /** * Blur event. */ this.blur = new EventEmitter(); /** * Focus event. */ this.focus = new EventEmitter(); /** * Change event. */ this.change = new EventEmitter(); this.valueIsValid = true; } /** * Sets the maximum number of characters permitted. */ set maxlength(val) { if (val != null && !isNaN(val) && val > 0) { this._maxlength = Number(val); } else { this._maxlength = undefined; } } get maxlength() { return this._maxlength; } ngOnChanges(changes) { const valueChange = changes['value']; if (valueChange) { this.writeValue(valueChange.currentValue); } } onBlur(e) { e.stopPropagation(); const value = e.target.value; this.blur.emit(this.normalizeValue(value)); this.onTouched(); } onChangeEvent(e) { e.stopPropagation(); } onFocus(e) { const value = e.target.value; this.focus.emit(value); } onInput(e) { const value = this.currentValue = e.target.value; this.onChange(value); this.change.emit(value); this.onTouched(); setTimeout(() => { const element = this.elementRef.nativeElement; this.valueIsValid = !element.classList.contains('ng-touched') || !element.classList.contains('ng-invalid'); }); } writeValue(valueToWrite) { const value = this.normalizeValue(valueToWrite); if (value !== this.currentValue) { this.renderer.setProperty(this.nativeTextarea.nativeElement, 'value', this.currentValue = value); } } registerOnChange(fn) { this.onChange = fn; } registerOnTouched(fn) { this.onTouched = fn; } setDisabledState(disabled) { this.disabled = disabled; this.changeDetector.markForCheck(); } onChange(newValue) { } onTouched() { } normalizeValue(value) { return (value == null ? '' : String(value)).replace(/\r\n?/g, '\n'); } } /** @nocollapse */ Textarea.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.8", ngImport: i0, type: Textarea, deps: [{ token: i0.Renderer2 }, { token: i0.ChangeDetectorRef }, { token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Component }); /** @nocollapse */ Textarea.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.3.8", type: Textarea, selector: "gtx-textarea", inputs: { autofocus: "autofocus", disabled: "disabled", maxlength: "maxlength", name: "name", pattern: "pattern", placeholder: "placeholder", readonly: "readonly", required: "required", validationErrorTooltip: "validationErrorTooltip", value: "value", label: "label", id: "id" }, outputs: { blur: "blur", focus: "focus", change: "change" }, providers: [GTX_TEXTAREA_VALUE_ACCESSOR], viewQueries: [{ propertyName: "nativeTextarea", first: true, predicate: ["textarea"], descendants: true, static: true }], usesOnChanges: true, ngImport: i0, template: "<textarea\n class=\"materialize-textarea\"\n autosize\n [minRows]=\"1\"\n [attr.id]=\"id\"\n [attr.maxlength]=\"maxlength\"\n [attr.name]=\"name\"\n [attr.pattern]=\"pattern\"\n [attr.placeholder]=\"placeholder\"\n [attr.title]=\"(!valueIsValid && validationErrorTooltip) ? validationErrorTooltip : ''\"\n\n [disabled]=\"disabled\"\n [readonly]=\"readonly\"\n [required]=\"required\"\n\n (blur)=\"onBlur($event)\"\n (change)=\"onChangeEvent($event)\"\n (focus)=\"onFocus($event)\"\n (input)=\"onInput($event)\"\n\n #textarea\n></textarea>\n<label [attr.for]=\"id\">{{ label }}</label>\n", directives: [{ type: i1.AutosizeDirective, selector: "[autosize]", inputs: ["onlyGrow", "useImportant", "minRows", "autosize", "maxRows"], outputs: ["resized"] }] }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.8", ngImport: i0, type: Textarea, decorators: [{ type: Component, args: [{ selector: 'gtx-textarea', providers: [GTX_TEXTAREA_VALUE_ACCESSOR], template: "<textarea\n class=\"materialize-textarea\"\n autosize\n [minRows]=\"1\"\n [attr.id]=\"id\"\n [attr.maxlength]=\"maxlength\"\n [attr.name]=\"name\"\n [attr.pattern]=\"pattern\"\n [attr.placeholder]=\"placeholder\"\n [attr.title]=\"(!valueIsValid && validationErrorTooltip) ? validationErrorTooltip : ''\"\n\n [disabled]=\"disabled\"\n [readonly]=\"readonly\"\n [required]=\"required\"\n\n (blur)=\"onBlur($event)\"\n (change)=\"onChangeEvent($event)\"\n (focus)=\"onFocus($event)\"\n (input)=\"onInput($event)\"\n\n #textarea\n></textarea>\n<label [attr.for]=\"id\">{{ label }}</label>\n" }] }], ctorParameters: function () { return [{ type: i0.Renderer2 }, { type: i0.ChangeDetectorRef }, { type: i0.ElementRef }]; }, propDecorators: { autofocus: [{ type: Input }], disabled: [{ type: Input }], maxlength: [{ type: Input }], name: [{ type: Input }], pattern: [{ type: Input }], placeholder: [{ type: Input }], readonly: [{ type: Input }], required: [{ type: Input }], validationErrorTooltip: [{ type: Input }], value: [{ type: Input }], label: [{ type: Input }], id: [{ type: Input }], blur: [{ type: Output }], focus: [{ type: Output }], change: [{ type: Output }], nativeTextarea: [{ type: ViewChild, args: ['textarea', { static: true }] }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGV4dGFyZWEuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2NvbXBvbmVudHMvdGV4dGFyZWEvdGV4dGFyZWEuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vc3JjL2NvbXBvbmVudHMvdGV4dGFyZWEvdGV4dGFyZWEudHBsLmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNILGlCQUFpQixFQUNqQixTQUFTLEVBQ1QsVUFBVSxFQUNWLFlBQVksRUFDWixVQUFVLEVBQ1YsS0FBSyxFQUVMLE1BQU0sRUFDTixTQUFTLEVBRVQsU0FBUyxFQUNaLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBdUIsaUJBQWlCLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQzs7O0FBR3ZFLE1BQU0sMkJBQTJCLEdBQUc7SUFDaEMsT0FBTyxFQUFFLGlCQUFpQjtJQUMxQixXQUFXLEVBQUUsVUFBVSxDQUFDLEdBQUcsRUFBRSxDQUFDLFFBQVEsQ0FBQztJQUN2QyxLQUFLLEVBQUUsSUFBSTtDQUNkLENBQUM7QUFFRjs7Ozs7O0dBTUc7QUFNSCxNQUFNLE9BQU8sUUFBUTtJQThGakIsWUFDWSxRQUFtQixFQUNuQixjQUFpQyxFQUNqQyxVQUFzQjtRQUZ0QixhQUFRLEdBQVIsUUFBUSxDQUFXO1FBQ25CLG1CQUFjLEdBQWQsY0FBYyxDQUFtQjtRQUNqQyxlQUFVLEdBQVYsVUFBVSxDQUFZO1FBaEdsQzs7V0FFRztRQUNNLGNBQVMsR0FBWSxLQUFLLENBQUM7UUFFcEM7O1dBRUc7UUFDTSxhQUFRLEdBQVksS0FBSyxDQUFDO1FBaUNuQzs7V0FFRztRQUNNLGFBQVEsR0FBWSxLQUFLLENBQUM7UUFFbkM7O1dBRUc7UUFDTSxhQUFRLEdBQVksS0FBSyxDQUFDO1FBT25DOztXQUVHO1FBQ00sVUFBSyxHQUFXLEVBQUUsQ0FBQztRQUU1Qjs7V0FFRztRQUNNLFVBQUssR0FBVyxFQUFFLENBQUM7UUFP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RUFBRSxJQUFJLEVBQUUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICAgIENoYW5nZURldGVjdG9yUmVmLFxuICAgIENvbXBvbmVudCxcbiAgICBFbGVtZW50UmVmLFxuICAgIEV2ZW50RW1pdHRlcixcbiAgICBmb3J3YXJkUmVmLFxuICAgIElucHV0LFxuICAgIE9uQ2hhbmdlcyxcbiAgICBPdXRwdXQsXG4gICAgUmVuZGVyZXIyLFxuICAgIFNpbXBsZUNoYW5nZXMsXG4gICAgVmlld0NoaWxkXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtDb250cm9sVmFsdWVBY2Nlc3NvciwgTkdfVkFMVUVfQUNDRVNTT1J9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcblxuXG5jb25zdCBHVFhfVEVYVEFSRUFfVkFMVUVfQUNDRVNTT1IgPSB7XG4gICAgcHJvdmlkZTogTkdfVkFMVUVfQUNDRVNTT1IsXG4gICAgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gVGV4dGFyZWEpLFxuICAgIG11bHRpOiB0cnVlXG59O1xuXG4vKipcbiAqIFRoZSBUZXh0YXJlYSB3cmFwcyB0aGUgbmF0aXZlIGA8dGV4dGFyZWE+YCBmb3JtIGVsZW1lbnQuIFRleHRhcmVhcyBhdXRvbWF0aWNhbGx5IGdyb3cgdG8gYWNjb21tb2RhdGUgdGhlaXIgY29udGVudC5cbiAqXG4gKiBgYGBodG1sXG4gKiA8Z3R4LXRleHRhcmVhIGxhYmVsPVwiTWVzc2FnZVwiIFsobmdNb2RlbCldPVwibWVzc2FnZVwiPjwvZ3R4LXRleHRhcmVhPlxuICogYGBgXG4gKi9cbkBDb21wb25lbnQoe1xuICAgIHNlbGVjdG9yOiAnZ3R4LXRleHRhcmVhJyxcbiAgICB0ZW1wbGF0ZVVybDogJy4vdGV4dGFyZWEudHBsLmh0bWwnLFxuICAgIHByb3ZpZGVyczogW0dUWF9URVhUQVJFQV9WQUxVRV9BQ0NFU1NPUl1cbn0pXG5leHBvcnQgY2xhc3MgVGV4dGFyZWEgaW1wbGVtZW50cyBDb250cm9sVmFsdWVBY2Nlc3NvciwgT25DaGFuZ2VzIHtcbiAgICAvKipcbiAgICAgKiBTZXRzIHRoZSB0ZXh0YXJlYSB0byBiZSBhdXRvLWZvY3VzZWQuIEhhbmRsZWQgYnkgYEF1dG9mb2N1c0RpcmVjdGl2ZWAuXG4gICAgICovXG4gICAgQElucHV0KCkgYXV0b2ZvY3VzOiBib29sZWFuID0gZmFsc2U7XG5cbiAgICAvKipcbiAgICAgKiBTZXRzIHRoZSBkaXNhYmxlZCBzdGF0ZS5cbiAgICAgKi9cbiAgICBASW5wdXQoKSBkaXNhYmxlZDogYm9vbGVhbiA9IGZhbHNlO1xuXG4gICAgLyoqXG4gICAgICogU2V0cyB0aGUgbWF4aW11bSBudW1iZXIgb2YgY2hhcmFjdGVycyBwZXJtaXR0ZWQuXG4gICAgICovXG4gICAgQElucHV0KCkgc2V0IG1heGxlbmd0aCh2YWw6IGFueSkge1xuICAgICAgICBpZiAodmFsICE9IG51bGwgJiYgIWlzTmFOKHZhbCkgJiYgdmFsID4gMCkge1xuICAgICAgICAgICAgdGhpcy5fbWF4bGVuZ3RoID0gTnVtYmVyKHZhbCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLl9tYXhsZW5ndGggPSB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZ2V0IG1heGxlbmd0aCgpOiBhbnkge1xuICAgICAgICByZXR1cm4gdGhpcy5fbWF4bGVuZ3RoO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBuYW1lIG9mIHRoZSBjb250cm9sLlxuICAgICAqL1xuICAgIEBJbnB1dCgpIG5hbWU6IHN0cmluZztcblxuICAgIC8qKlxuICAgICAqIFJlZ2V4IHBhdHRlcm4gZm9yIGNvbXBsZXggdmFsaWRhdGlvbi5cbiAgICAgKiBUaGlzIHJlcXVpcmVzIHRoYXQgdGhpcyBjb250cm9sIGlzIGVpdGhlciBwYXJ0IG9mIGEgZm9ybSBvciB0aGF0XG4gICAgICogaXRzIHZhbHVlIGlzIGJvdW5kIHdpdGggbmdNb2RlbC5cbiAgICAgKi9cbiAgICBASW5wdXQoKSBwYXR0ZXJuOiBzdHJpbmc7XG5cbiAgICAvKipcbiAgICAgKiBBIHBsYWNlaG9sZGVyIHRleHQgdG8gZGlzcGxheSB3aGVuIHRoZSBjb250cm9sIGlzIGVtcHR5LlxuICAgICAqL1xuICAgIEBJbnB1dCgpIHBsYWNlaG9sZGVyOiBzdHJpbmc7XG5cbiAgICAvKipcbiAgICAgKiBTZXRzIHRoZSByZWFkb25seSBzdGF0ZS5cbiAgICAgKi9cbiAgICBASW5wdXQoKSByZWFkb25seTogYm9vbGVhbiA9IGZhbHNlO1xuXG4gICAgLyoqXG4gICAgICogU2V0cyB0aGUgcmVxdWlyZWQgc3RhdGUuXG4gICAgICovXG4gICAgQElucHV0KCkgcmVxdWlyZWQ6IGJvb2xlYW4gPSBmYWxzZTtcblxuICAgIC8qKlxuICAgICAqIFRvb2x0aXAgZm9yIHZhbGlkYXRpb24gZXJyb3JzLlxuICAgICAqL1xuICAgIEBJbnB1dCgpIHZhbGlkYXRpb25FcnJvclRvb2x0aXA6IHN0cmluZztcblxuICAgIC8qKlxuICAgICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSBjb250cm9sLlxuICAgICAqL1xuICAgIEBJbnB1dCgpIHZhbHVlOiBzdHJpbmcgPSAnJztcblxuICAgIC8qKlxuICAgICAqIFNldHMgdGhlIGxhYmVsIG9mIHRoZSBjb250cm9sLlxuICAgICAqL1xuICAgIEBJbnB1dCgpIGxhYmVsOiBzdHJpbmcgPSAnJztcblxuICAgIC8qKlxuICAgICAqIFNldHMgYW4gaWQgZm9yIHRoZSBjb250cm9sLlxuICAgICAqL1xuICAgIEBJbnB1dCgpIGlkOiBzdHJpbmc7XG5cbiAgICAvKipcbiAgICAgKiBCbHVyIGV2ZW50LlxuICAgICAqL1xuICAgIEBPdXRwdXQoKSBibHVyID0gbmV3IEV2ZW50RW1pdHRlcjxzdHJpbmc+KCk7XG5cbiAgICAvKipcbiAgICAgKiBGb2N1cyBldmVudC5cbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgZm9jdXMgPSBuZXcgRXZlbnRFbWl0dGVyPHN0cmluZz4oKTtcblxuICAgIC8qKlxuICAgICAqIENoYW5nZSBldmVudC5cbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgY2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxzdHJpbmc+KCk7XG5cbiAgICB2YWx1ZUlzVmFsaWQ6IGJvb2xlYW4gPSB0cnVlO1xuXG4gICAgQFZpZXdDaGlsZCgndGV4dGFyZWEnLCB7IHN0YXRpYzogdHJ1ZSB9KSBwcml2YXRlIG5hdGl2ZVRleHRhcmVhOiBFbGVtZW50UmVmO1xuICAgIHByaXZhdGUgX21heGxlbmd0aDogbnVtYmVyO1xuICAgIHByaXZhdGUgY3VycmVudFZhbHVlOiBzdHJpbmc7XG4gICAgcHJpdmF0ZSBwcmV2aW91c0hlaWdodDogbnVtYmVyO1xuXG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIHByaXZhdGUgcmVuZGVyZXI6IFJlbmRlcmVyMixcbiAgICAgICAgcHJpdmF0ZSBjaGFuZ2VEZXRlY3RvcjogQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gICAgICAgIHByaXZhdGUgZWxlbWVudFJlZjogRWxlbWVudFJlZlxuICAgICkgeyB9XG5cbiAgICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHZhbHVlQ2hhbmdlID0gY2hhbmdlc1sndmFsdWUnXTtcbiAgICAgICAgaWYgKHZhbHVlQ2hhbmdlKSB7XG4gICAgICAgICAgICB0aGlzLndyaXRlVmFsdWUodmFsdWVDaGFuZ2UuY3VycmVudFZhbHVlKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIG9uQmx1cihlOiBFdmVudCk6IHZvaWQge1xuICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICBjb25zdCB2YWx1ZSA9IChlLnRhcmdldCBhcyBIVE1MVGV4dEFyZWFFbGVtZW50KS52YWx1ZTtcbiAgICAgICAgdGhpcy5ibHVyLmVtaXQodGhpcy5ub3JtYWxpemVWYWx1ZSh2YWx1ZSkpO1xuICAgICAgICB0aGlzLm9uVG91Y2hlZCgpO1xuICAgIH1cblxuICAgIG9uQ2hhbmdlRXZlbnQoZTogRXZlbnQpOiB2b2lkIHtcbiAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICB9XG5cbiAgICBvbkZvY3VzKGU6IEV2ZW50KTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gKGUudGFyZ2V0IGFzIEhUTUxUZXh0QXJlYUVsZW1lbnQpLnZhbHVlO1xuICAgICAgICB0aGlzLmZvY3VzLmVtaXQodmFsdWUpO1xuICAgIH1cblxuICAgIG9uSW5wdXQoZTogRXZlbnQpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgdmFsdWUgPSB0aGlzLmN1cnJlbnRWYWx1ZSA9IChlLnRhcmdldCBhcyBIVE1MVGV4dEFyZWFFbGVtZW50KS52YWx1ZTtcbiAgICAgICAgdGhpcy5vbkNoYW5nZSh2YWx1ZSk7XG4gICAgICAgIHRoaXMuY2hhbmdlLmVtaXQodmFsdWUpO1xuICAgICAgICB0aGlzLm9uVG91Y2hlZCgpO1xuXG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgZWxlbWVudDogSFRNTFRleHRBcmVhRWxlbWVudCA9IHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50O1xuICAgICAgICAgICAgdGhpcy52YWx1ZUlzVmFsaWQgPSAhZWxlbWVudC5jbGFzc0xpc3QuY29udGFpbnMoJ25nLXRvdWNoZWQnKSB8fCAhZWxlbWVudC5jbGFzc0xpc3QuY29udGFpbnMoJ25nLWludmFsaWQnKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgd3JpdGVWYWx1ZSh2YWx1ZVRvV3JpdGU6IGFueSk6IHZvaWQge1xuICAgICAgICBjb25zdCB2YWx1ZSA9IHRoaXMubm9ybWFsaXplVmFsdWUodmFsdWVUb1dyaXRlKTtcbiAgICAgICAgaWYgKHZhbHVlICE9PSB0aGlzLmN1cnJlbnRWYWx1ZSkge1xuICAgICAgICAgICAgdGhpcy5yZW5kZXJlci5zZXRQcm9wZXJ0eSh0aGlzLm5hdGl2ZVRleHRhcmVhLm5hdGl2ZUVsZW1lbnQsICd2YWx1ZScsIHRoaXMuY3VycmVudFZhbHVlID0gdmFsdWUpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmVnaXN0ZXJPbkNoYW5nZShmbjogKG5ld1ZhbHVlOiBzdHJpbmcpID0+IHZvaWQpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5vbkNoYW5nZSA9IGZuO1xuICAgIH1cblxuICAgIHJlZ2lzdGVyT25Ub3VjaGVkKGZuOiAoKSA9PiB2b2lkKTogdm9pZCB7XG4gICAgICAgIHRoaXMub25Ub3VjaGVkID0gZm47XG4gICAgfVxuXG4gICAgc2V0RGlzYWJsZWRTdGF0ZShkaXNhYmxlZDogYm9vbGVhbik6IHZvaWQge1xuICAgICAgICB0aGlzLmRpc2FibGVkID0gZGlzYWJsZWQ7XG4gICAgICAgIHRoaXMuY2hhbmdlRGV0ZWN0b3IubWFya0ZvckNoZWNrKCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBvbkNoYW5nZShuZXdWYWx1ZTogc3RyaW5nKTogdm9pZCB7IH1cbiAgICBwcml2YXRlIG9uVG91Y2hlZCgpOiB2b2lkIHsgfVxuXG4gICAgcHJpdmF0ZSBub3JtYWxpemVWYWx1ZSh2YWx1ZTogYW55KTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuICh2YWx1ZSA9PSBudWxsID8gJycgOiBTdHJpbmcodmFsdWUpKS5yZXBsYWNlKC9cXHJcXG4/L2csICdcXG4nKTtcbiAgICB9XG59XG4iLCI8dGV4dGFyZWFcbiAgICBjbGFzcz1cIm1hdGVyaWFsaXplLXRleHRhcmVhXCJcbiAgICBhdXRvc2l6ZVxuICAgIFttaW5Sb3dzXT1cIjFcIlxuICAgIFthdHRyLmlkXT1cImlkXCJcbiAgICBbYXR0ci5tYXhsZW5ndGhdPVwibWF4bGVuZ3RoXCJcbiAgICBbYXR0ci5uYW1lXT1cIm5hbWVcIlxuICAgIFthdHRyLnBhdHRlcm5dPVwicGF0dGVyblwiXG4gICAgW2F0dHIucGxhY2Vob2xkZXJdPVwicGxhY2Vob2xkZXJcIlxuICAgIFthdHRyLnRpdGxlXT1cIighdmFsdWVJc1ZhbGlkICYmIHZhbGlkYXRpb25FcnJvclRvb2x0aXApID8gdmFsaWRhdGlvbkVycm9yVG9vbHRpcCA6ICcnXCJcblxuICAgIFtkaXNhYmxlZF09XCJkaXNhYmxlZFwiXG4gICAgW3JlYWRvbmx5XT1cInJlYWRvbmx5XCJcbiAgICBbcmVxdWlyZWRdPVwicmVxdWlyZWRcIlxuXG4gICAgKGJsdXIpPVwib25CbHVyKCRldmVudClcIlxuICAgIChjaGFuZ2UpPVwib25DaGFuZ2VFdmVudCgkZXZlbnQpXCJcbiAgICAoZm9jdXMpPVwib25Gb2N1cygkZXZlbnQpXCJcbiAgICAoaW5wdXQpPVwib25JbnB1dCgkZXZlbnQpXCJcblxuICAgICN0ZXh0YXJlYVxuPjwvdGV4dGFyZWE+XG48bGFiZWwgW2F0dHIuZm9yXT1cImlkXCI+e3sgbGFiZWwgfX08L2xhYmVsPlxuIl19