ddata-ui-input
Version:
DData UI Input module, components, models & services
90 lines • 15.4 kB
JavaScript
import { Component, EventEmitter, Input, Output } from '@angular/core';
import { DdataCoreModule } from 'ddata-core';
import { InputHelperService } from '../../../services/input/helper/input-helper.service';
import * as i0 from "@angular/core";
import * as i1 from "@angular/common";
import * as i2 from "@angular/forms";
export class DdataSimpleSelectComponent {
constructor() {
this.helperService = DdataCoreModule.InjectorInstance.get(InputHelperService);
this.random = this.helperService.randChars();
// look & feel
this.wrapperClass = 'd-flex flex-wrap';
this.inputBlockClass = 'col-12 d-flex px-0';
this.inputBlockExtraClass = 'col-md-9';
this.unselectedText = 'Válassz';
// behavior
this.isRequire = false;
this.disabledAppearance = false;
this.disabled = false;
this.addEmptyOption = true;
// label
this.labelClass = 'col-12 col-md-3 px-0 col-form-label';
this.showLabel = true;
this.labelText = '';
// additional texts
this.prepend = '';
this.append = '';
this.field = 'id';
this.items = [];
this.text = 'name';
this.valueField = 'id';
this.selected = new EventEmitter();
this.selectModel = new EventEmitter();
}
get id() {
return `${this.field}_${this.random}`;
}
selectItem() {
this.selectedModel = this.items.find(item => item[this.field] === this.model[this.field]);
this.selected.emit(this.model[this.field]);
this.selectModel.emit(this.selectedModel);
}
}
DdataSimpleSelectComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.0.2", ngImport: i0, type: DdataSimpleSelectComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
DdataSimpleSelectComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.0.2", type: DdataSimpleSelectComponent, selector: "simple-select", inputs: { wrapperClass: "wrapperClass", inputBlockClass: "inputBlockClass", inputBlockExtraClass: "inputBlockExtraClass", unselectedText: "unselectedText", isRequire: "isRequire", disabledAppearance: "disabledAppearance", disabled: "disabled", addEmptyOption: "addEmptyOption", labelClass: "labelClass", showLabel: "showLabel", labelText: "labelText", prepend: "prepend", append: "append", model: "model", field: "field", items: "items", text: "text", valueField: "valueField" }, outputs: { selected: "selected", selectModel: "selectModel" }, ngImport: i0, template: "<div [class]=\"wrapperClass\">\n <!-- label -->\n <label\n [class]=\"labelClass\"\n [for]=\"id\"\n *ngIf=\"showLabel\"\n >\n {{ labelText }}:\n\n <span *ngIf=\"isRequired\"> *</span>\n </label>\n\n\n <!-- select -->\n <div\n [class]=\"inputBlockClass\"\n [ngClass]=\"showLabel ? inputBlockExtraClass : ''\"\n >\n\n <!-- prepend -->\n <div class=\"input-group-prepend\" *ngIf=\"!!prepend\">\n <div class=\"input-group-text\">{{ prepend }}</div>\n </div>\n\n <select class=\"form-select\"\n [(ngModel)]=\"model[field]\"\n [class.invalid]=\"model.validationErrors.includes(field)\"\n [class.disable-appearance]=\"disabledAppearance\"\n [disabled]=\"disabled\"\n (change)=\"selectItem()\"\n >\n\n <option *ngIf=\"addEmptyOption\" data-default value=\"0\">\n -- {{ unselectedText }} --\n </option>\n\n <ng-container *ngFor=\"let item of items\">\n <option\n [value]=\"item[valueField]\"\n [selected]=\"item[valueField] === model[field]\"\n >\n {{ item[text] }}\n </option>\n </ng-container>\n\n </select>\n\n <!-- append -->\n <div class=\"input-group-append\" *ngIf=\"!!append\">\n <div class=\"input-group-text\">{{ append }}</div>\n </div>\n </div>\n</div>\n", styles: ["select{padding:.375rem .25rem}.disable-appearance{appearance:none;-webkit-appearance:none;-moz-appearance:none}\n"], dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i2.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i2.SelectControlValueAccessor, selector: "select:not([multiple])[formControlName],select:not([multiple])[formControl],select:not([multiple])[ngModel]", inputs: ["compareWith"] }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }] });
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.0.2", ngImport: i0, type: DdataSimpleSelectComponent, decorators: [{
type: Component,
args: [{ selector: 'simple-select', template: "<div [class]=\"wrapperClass\">\n <!-- label -->\n <label\n [class]=\"labelClass\"\n [for]=\"id\"\n *ngIf=\"showLabel\"\n >\n {{ labelText }}:\n\n <span *ngIf=\"isRequired\"> *</span>\n </label>\n\n\n <!-- select -->\n <div\n [class]=\"inputBlockClass\"\n [ngClass]=\"showLabel ? inputBlockExtraClass : ''\"\n >\n\n <!-- prepend -->\n <div class=\"input-group-prepend\" *ngIf=\"!!prepend\">\n <div class=\"input-group-text\">{{ prepend }}</div>\n </div>\n\n <select class=\"form-select\"\n [(ngModel)]=\"model[field]\"\n [class.invalid]=\"model.validationErrors.includes(field)\"\n [class.disable-appearance]=\"disabledAppearance\"\n [disabled]=\"disabled\"\n (change)=\"selectItem()\"\n >\n\n <option *ngIf=\"addEmptyOption\" data-default value=\"0\">\n -- {{ unselectedText }} --\n </option>\n\n <ng-container *ngFor=\"let item of items\">\n <option\n [value]=\"item[valueField]\"\n [selected]=\"item[valueField] === model[field]\"\n >\n {{ item[text] }}\n </option>\n </ng-container>\n\n </select>\n\n <!-- append -->\n <div class=\"input-group-append\" *ngIf=\"!!append\">\n <div class=\"input-group-text\">{{ append }}</div>\n </div>\n </div>\n</div>\n", styles: ["select{padding:.375rem .25rem}.disable-appearance{appearance:none;-webkit-appearance:none;-moz-appearance:none}\n"] }]
}], propDecorators: { wrapperClass: [{
type: Input
}], inputBlockClass: [{
type: Input
}], inputBlockExtraClass: [{
type: Input
}], unselectedText: [{
type: Input
}], isRequire: [{
type: Input
}], disabledAppearance: [{
type: Input
}], disabled: [{
type: Input
}], addEmptyOption: [{
type: Input
}], labelClass: [{
type: Input
}], showLabel: [{
type: Input
}], labelText: [{
type: Input
}], prepend: [{
type: Input
}], append: [{
type: Input
}], model: [{
type: Input
}], field: [{
type: Input
}], items: [{
type: Input
}], text: [{
type: Input
}], valueField: [{
type: Input
}], selected: [{
type: Output
}], selectModel: [{
type: Output
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2ltcGxlLXNlbGVjdC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9kZGF0YS11aS1pbnB1dC9zcmMvbGliL2NvbXBvbmVudHMvc2VsZWN0L3NpbXBsZS1zZWxlY3Qvc2ltcGxlLXNlbGVjdC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9kZGF0YS11aS1pbnB1dC9zcmMvbGliL2NvbXBvbmVudHMvc2VsZWN0L3NpbXBsZS1zZWxlY3Qvc2ltcGxlLXNlbGVjdC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3ZFLE9BQU8sRUFBc0IsZUFBZSxFQUFtQixNQUFNLFlBQVksQ0FBQztBQUVsRixPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxxREFBcUQsQ0FBQzs7OztBQU96RixNQUFNLE9BQU8sMEJBQTBCO0lBTHZDO1FBTVUsa0JBQWEsR0FDbkIsZUFBZSxDQUFDLGdCQUFnQixDQUFDLEdBQUcsQ0FBOEIsa0JBQWtCLENBQUMsQ0FBQztRQUNoRixXQUFNLEdBQVcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxTQUFTLEVBQUUsQ0FBQztRQUl4RCxjQUFjO1FBQ0wsaUJBQVksR0FBRyxrQkFBa0IsQ0FBQztRQUNsQyxvQkFBZSxHQUFHLG9CQUFvQixDQUFDO1FBQ3ZDLHlCQUFvQixHQUFHLFVBQVUsQ0FBQztRQUNsQyxtQkFBYyxHQUFHLFNBQVMsQ0FBQztRQUVwQyxXQUFXO1FBQ0YsY0FBUyxHQUFHLEtBQUssQ0FBQztRQUNsQix1QkFBa0IsR0FBRyxLQUFLLENBQUM7UUFDM0IsYUFBUSxHQUFHLEtBQUssQ0FBQztRQUNqQixtQkFBYyxHQUFHLElBQUksQ0FBQztRQUUvQixRQUFRO1FBQ0MsZUFBVSxHQUFHLHFDQUFxQyxDQUFDO1FBQ25ELGNBQVMsR0FBRyxJQUFJLENBQUM7UUFDakIsY0FBUyxHQUFHLEVBQUUsQ0FBQztRQUV4QixtQkFBbUI7UUFDVixZQUFPLEdBQUcsRUFBRSxDQUFDO1FBQ2IsV0FBTSxHQUFHLEVBQUUsQ0FBQztRQUlaLFVBQUssR0FBRyxJQUFJLENBQUM7UUFDYixVQUFLLEdBQVUsRUFBRSxDQUFDO1FBQ2xCLFNBQUksR0FBRyxNQUFNLENBQUM7UUFDZCxlQUFVLEdBQUcsSUFBSSxDQUFDO1FBRWpCLGFBQVEsR0FBc0IsSUFBSSxZQUFZLEVBQUUsQ0FBQztRQUNqRCxnQkFBVyxHQUFzQixJQUFJLFlBQVksRUFBRSxDQUFDO0tBWS9EO0lBVkMsSUFBSSxFQUFFO1FBQ0osT0FBTyxHQUFHLElBQUksQ0FBQyxLQUFLLElBQUksSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO0lBQ3hDLENBQUM7SUFFRCxVQUFVO1FBQ1IsSUFBSSxDQUFDLGFBQWEsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztRQUUxRixJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO1FBQzNDLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQztJQUM1QyxDQUFDOzt1SEEvQ1UsMEJBQTBCOzJHQUExQiwwQkFBMEIsb2xCQ1Z2Qyw0eUNBcURBOzJGRDNDYSwwQkFBMEI7a0JBTHRDLFNBQVM7K0JBQ0UsZUFBZTs4QkFZaEIsWUFBWTtzQkFBcEIsS0FBSztnQkFDRyxlQUFlO3NCQUF2QixLQUFLO2dCQUNHLG9CQUFvQjtzQkFBNUIsS0FBSztnQkFDRyxjQUFjO3NCQUF0QixLQUFLO2dCQUdHLFNBQVM7c0JBQWpCLEtBQUs7Z0JBQ0csa0JBQWtCO3NCQUExQixLQUFLO2dCQUNHLFFBQVE7c0JBQWhCLEtBQUs7Z0JBQ0csY0FBYztzQkFBdEIsS0FBSztnQkFHRyxVQUFVO3NCQUFsQixLQUFLO2dCQUNHLFNBQVM7c0JBQWpCLEtBQUs7Z0JBQ0csU0FBUztzQkFBakIsS0FBSztnQkFHRyxPQUFPO3NCQUFmLEtBQUs7Z0JBQ0csTUFBTTtzQkFBZCxLQUFLO2dCQUdHLEtBQUs7c0JBQWIsS0FBSztnQkFDRyxLQUFLO3NCQUFiLEtBQUs7Z0JBQ0csS0FBSztzQkFBYixLQUFLO2dCQUNHLElBQUk7c0JBQVosS0FBSztnQkFDRyxVQUFVO3NCQUFsQixLQUFLO2dCQUVJLFFBQVE7c0JBQWpCLE1BQU07Z0JBQ0csV0FBVztzQkFBcEIsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgRXZlbnRFbWl0dGVyLCBJbnB1dCwgT3V0cHV0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBCYXNlTW9kZWxJbnRlcmZhY2UsIERkYXRhQ29yZU1vZHVsZSwgRmllbGRzSW50ZXJmYWNlIH0gZnJvbSAnZGRhdGEtY29yZSc7XG5pbXBvcnQgeyBJbnB1dEhlbHBlclNlcnZpY2VJbnRlcmZhY2UgfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcy9pbnB1dC9oZWxwZXIvaW5wdXQtaGVscGVyLXNlcnZpY2UuaW50ZXJmYWNlJztcbmltcG9ydCB7IElucHV0SGVscGVyU2VydmljZSB9IGZyb20gJy4uLy4uLy4uL3NlcnZpY2VzL2lucHV0L2hlbHBlci9pbnB1dC1oZWxwZXIuc2VydmljZSc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3NpbXBsZS1zZWxlY3QnLFxuICB0ZW1wbGF0ZVVybDogJy4vc2ltcGxlLXNlbGVjdC5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL3NpbXBsZS1zZWxlY3QuY29tcG9uZW50LnNjc3MnXVxufSlcbmV4cG9ydCBjbGFzcyBEZGF0YVNpbXBsZVNlbGVjdENvbXBvbmVudCB7XG4gIHByaXZhdGUgaGVscGVyU2VydmljZTogSW5wdXRIZWxwZXJTZXJ2aWNlSW50ZXJmYWNlID1cbiAgICBEZGF0YUNvcmVNb2R1bGUuSW5qZWN0b3JJbnN0YW5jZS5nZXQ8SW5wdXRIZWxwZXJTZXJ2aWNlSW50ZXJmYWNlPihJbnB1dEhlbHBlclNlcnZpY2UpO1xuICBwcml2YXRlIHJhbmRvbTogc3RyaW5nID0gdGhpcy5oZWxwZXJTZXJ2aWNlLnJhbmRDaGFycygpO1xuICBwcml2YXRlIHNlbGVjdGVkTW9kZWw6IGFueTtcblxuXG4gIC8vIGxvb2sgJiBmZWVsXG4gIEBJbnB1dCgpIHdyYXBwZXJDbGFzcyA9ICdkLWZsZXggZmxleC13cmFwJztcbiAgQElucHV0KCkgaW5wdXRCbG9ja0NsYXNzID0gJ2NvbC0xMiBkLWZsZXggcHgtMCc7XG4gIEBJbnB1dCgpIGlucHV0QmxvY2tFeHRyYUNsYXNzID0gJ2NvbC1tZC05JztcbiAgQElucHV0KCkgdW5zZWxlY3RlZFRleHQgPSAnVsOhbGFzc3onO1xuXG4gIC8vIGJlaGF2aW9yXG4gIEBJbnB1dCgpIGlzUmVxdWlyZSA9IGZhbHNlO1xuICBASW5wdXQoKSBkaXNhYmxlZEFwcGVhcmFuY2UgPSBmYWxzZTtcbiAgQElucHV0KCkgZGlzYWJsZWQgPSBmYWxzZTtcbiAgQElucHV0KCkgYWRkRW1wdHlPcHRpb24gPSB0cnVlO1xuXG4gIC8vIGxhYmVsXG4gIEBJbnB1dCgpIGxhYmVsQ2xhc3MgPSAnY29sLTEyIGNvbC1tZC0zIHB4LTAgY29sLWZvcm0tbGFiZWwnO1xuICBASW5wdXQoKSBzaG93TGFiZWwgPSB0cnVlO1xuICBASW5wdXQoKSBsYWJlbFRleHQgPSAnJztcblxuICAvLyBhZGRpdGlvbmFsIHRleHRzXG4gIEBJbnB1dCgpIHByZXBlbmQgPSAnJztcbiAgQElucHV0KCkgYXBwZW5kID0gJyc7XG5cbiAgLy8gZGF0YVxuICBASW5wdXQoKSBtb2RlbDogQmFzZU1vZGVsSW50ZXJmYWNlPGFueT4gJiBGaWVsZHNJbnRlcmZhY2U8YW55PjtcbiAgQElucHV0KCkgZmllbGQgPSAnaWQnO1xuICBASW5wdXQoKSBpdGVtczogYW55W10gPSBbXTtcbiAgQElucHV0KCkgdGV4dCA9ICduYW1lJztcbiAgQElucHV0KCkgdmFsdWVGaWVsZCA9ICdpZCc7XG5cbiAgQE91dHB1dCgpIHNlbGVjdGVkOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgQE91dHB1dCgpIHNlbGVjdE1vZGVsOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcblxuICBnZXQgaWQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYCR7dGhpcy5maWVsZH1fJHt0aGlzLnJhbmRvbX1gO1xuICB9XG5cbiAgc2VsZWN0SXRlbSgpOiB2b2lkIHtcbiAgICB0aGlzLnNlbGVjdGVkTW9kZWwgPSB0aGlzLml0ZW1zLmZpbmQoaXRlbSA9PiBpdGVtW3RoaXMuZmllbGRdID09PSB0aGlzLm1vZGVsW3RoaXMuZmllbGRdKTtcblxuICAgIHRoaXMuc2VsZWN0ZWQuZW1pdCh0aGlzLm1vZGVsW3RoaXMuZmllbGRdKTtcbiAgICB0aGlzLnNlbGVjdE1vZGVsLmVtaXQodGhpcy5zZWxlY3RlZE1vZGVsKTtcbiAgfVxufVxuIiwiPGRpdiBbY2xhc3NdPVwid3JhcHBlckNsYXNzXCI+XG4gIDwhLS0gbGFiZWwgLS0+XG4gIDxsYWJlbFxuICAgIFtjbGFzc109XCJsYWJlbENsYXNzXCJcbiAgICBbZm9yXT1cImlkXCJcbiAgICAqbmdJZj1cInNob3dMYWJlbFwiXG4gID5cbiAgICB7eyBsYWJlbFRleHQgfX06XG5cbiAgICA8c3BhbiAqbmdJZj1cImlzUmVxdWlyZWRcIj4gKjwvc3Bhbj5cbiAgPC9sYWJlbD5cblxuXG4gIDwhLS0gc2VsZWN0IC0tPlxuICA8ZGl2XG4gICAgW2NsYXNzXT1cImlucHV0QmxvY2tDbGFzc1wiXG4gICAgW25nQ2xhc3NdPVwic2hvd0xhYmVsID8gaW5wdXRCbG9ja0V4dHJhQ2xhc3MgOiAnJ1wiXG4gID5cblxuICAgIDwhLS0gcHJlcGVuZCAtLT5cbiAgICA8ZGl2IGNsYXNzPVwiaW5wdXQtZ3JvdXAtcHJlcGVuZFwiICpuZ0lmPVwiISFwcmVwZW5kXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwiaW5wdXQtZ3JvdXAtdGV4dFwiPnt7IHByZXBlbmQgfX08L2Rpdj5cbiAgICA8L2Rpdj5cblxuICAgIDxzZWxlY3QgY2xhc3M9XCJmb3JtLXNlbGVjdFwiXG4gICAgICBbKG5nTW9kZWwpXT1cIm1vZGVsW2ZpZWxkXVwiXG4gICAgICBbY2xhc3MuaW52YWxpZF09XCJtb2RlbC52YWxpZGF0aW9uRXJyb3JzLmluY2x1ZGVzKGZpZWxkKVwiXG4gICAgICBbY2xhc3MuZGlzYWJsZS1hcHBlYXJhbmNlXT1cImRpc2FibGVkQXBwZWFyYW5jZVwiXG4gICAgICBbZGlzYWJsZWRdPVwiZGlzYWJsZWRcIlxuICAgICAgKGNoYW5nZSk9XCJzZWxlY3RJdGVtKClcIlxuICAgID5cblxuICAgICAgPG9wdGlvbiAqbmdJZj1cImFkZEVtcHR5T3B0aW9uXCIgZGF0YS1kZWZhdWx0IHZhbHVlPVwiMFwiPlxuICAgICAgICAtLSB7eyB1bnNlbGVjdGVkVGV4dCB9fSAtLVxuICAgICAgPC9vcHRpb24+XG5cbiAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGl0ZW0gb2YgaXRlbXNcIj5cbiAgICAgICAgPG9wdGlvblxuICAgICAgICAgIFt2YWx1ZV09XCJpdGVtW3ZhbHVlRmllbGRdXCJcbiAgICAgICAgICBbc2VsZWN0ZWRdPVwiaXRlbVt2YWx1ZUZpZWxkXSA9PT0gbW9kZWxbZmllbGRdXCJcbiAgICAgICAgPlxuICAgICAgICAgIHt7IGl0ZW1bdGV4dF0gfX1cbiAgICAgICAgPC9vcHRpb24+XG4gICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgIDwvc2VsZWN0PlxuXG4gICAgPCEtLSBhcHBlbmQgLS0+XG4gICAgPGRpdiBjbGFzcz1cImlucHV0LWdyb3VwLWFwcGVuZFwiICpuZ0lmPVwiISFhcHBlbmRcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJpbnB1dC1ncm91cC10ZXh0XCI+e3sgYXBwZW5kIH19PC9kaXY+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuPC9kaXY+XG4iXX0=