mss-engine-forms
Version:
A simple typehead library developed by MSS development team to be used for dynamic forms
122 lines • 20.6 kB
JavaScript
import { Component, EventEmitter, Input, Output } from "@angular/core";
import { FormControl, FormGroup, Validators } from "@angular/forms";
import * as i0 from "@angular/core";
import * as i1 from "@angular/forms";
import * as i2 from "@angular/common";
import * as i3 from "./components/dynamic-field/dynamic-field.component";
import * as i4 from "./components/dynamic-error/dynamic-error.component";
import * as i5 from "./_helpers/breakpoints.pipe";
export class MssFormsComponent {
constructor(_fb) {
this._fb = _fb;
this.isLoading = false;
this.cancelBtnOptions = null;
this.onSubmit = new EventEmitter();
this.fields = [];
}
ngOnInit() {
// this.buildForm();
}
ngOnChanges(changes) {
if (changes['model']) {
this.fields = [];
this.buildForm();
}
}
buildForm() {
const formGroupFields = this.getFormControlsFields();
// if (!this.dynamicFormGroup) {
this.dynamicFormGroup = new FormGroup(formGroupFields);
for (const field of Object.keys(this.model)) {
const fieldProps = this.model[field];
if (fieldProps?.disabled)
this.dynamicFormGroup.get(field).disable();
this.dynamicFormGroup.get(field)?.updateValueAndValidity();
}
// } else {
// this.getNewFormControlsFields()
// }
}
getFormControlsFields() {
const formGroupFields = {};
for (const field of Object.keys(this.model)) {
const fieldProps = this.model[field];
const validators = this.addValidator(fieldProps.rules);
formGroupFields[field] = new FormControl(fieldProps.value, validators);
let index = this.fields.findIndex((f) => {
if (f.fieldName == field)
return true;
return false;
});
if (index === -1)
this.fields.push({ ...fieldProps, fieldName: field });
}
return formGroupFields;
}
getNewFormControlsFields() {
Object.keys(this.model).map((model) => {
const fieldProps = this.model[model];
const validators = this.addValidator(fieldProps.rules);
if (!this.dynamicFormGroup['controls'][model]) {
this.dynamicFormGroup.addControl(model, this._fb.control({ value: fieldProps.value, disabled: fieldProps?.disabled ? true : false }, validators));
// this.dynamicFormGroup.get()
}
});
}
addValidator(rules) {
if (!rules) {
return [];
}
const validators = Object.keys(rules).map((rule, index) => {
switch (rule) {
case "required":
return Validators.required;
case "email":
return Validators.email;
case "minLength":
return Validators.minLength(Object.values(rules)[index]);
case "maxLength":
return Validators.maxLength(Object.values(rules)[index]);
case "pattern":
return Validators.pattern(Object.values(rules)[index]);
case "min":
return Validators.min(Object.values(rules)[index]);
case "max":
return Validators.max(Object.values(rules)[index]);
default:
return;
//add more case for future.
}
});
return validators;
}
submit() {
this.onSubmit.emit(this.dynamicFormGroup);
}
resetForm() {
this.dynamicFormGroup.reset();
}
setRule(formControlName, validators) {
if (this.dynamicFormGroup['controls'][formControlName])
this.dynamicFormGroup['controls'][formControlName].setValidators(validators);
}
}
MssFormsComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: MssFormsComponent, deps: [{ token: i1.FormBuilder }], target: i0.ɵɵFactoryTarget.Component });
MssFormsComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.10", type: MssFormsComponent, selector: "lib-mss-forms", inputs: { model: "model", isLoading: "isLoading", submitBtnOptions: "submitBtnOptions", cancelBtnOptions: "cancelBtnOptions", error: "error" }, outputs: { onSubmit: "onSubmit" }, usesOnChanges: true, ngImport: i0, template: "<form [formGroup]=\"dynamicFormGroup\" (ngSubmit)=\"submit()\" (keyup.enter)=\"submit()\">\n <div class=\"row\">\n <div *ngFor=\"let field of fields\" class=\"col-12 custom-engine-field-container\" [ngClass]=\"field | breakpoint\">\n <app-field-input [field]=\"field\"></app-field-input>\n <app-dynamic-error [field]=\"field\"></app-dynamic-error>\n </div>\n <div *ngIf=\"cancelBtnOptions\" class=\"col-12\" [ngClass]=\"cancelBtnOptions | breakpoint\">\n <button type=\"button\" (click)=\"cancelBtnOptions?.submit()\"\n class=\"w-100 d-flex align-items-center justify-content-center btn-default\">\n {{cancelBtnOptions?.content}}\n </button>\n </div>\n <div class=\"col-12\" [ngClass]=\"submitBtnOptions | breakpoint\">\n <button type=\"submit\" [disabled]=\"isLoading || dynamicFormGroup.invalid\"\n class=\"w-100 d-flex align-items-center justify-content-center btn-primary\">\n <div *ngIf=\"isLoading\" class=\"spinner-border text-primary\"></div>\n <ng-container *ngIf=\"!isLoading\">{{submitBtnOptions?.content}}</ng-container>\n </button>\n </div>\n </div>\n\n</form>", dependencies: [{ kind: "directive", type: i2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "component", type: i3.DynamicFieldComponent, selector: "app-field-input", inputs: ["field"] }, { kind: "component", type: i4.DynamicErrorComponent, selector: "app-dynamic-error", inputs: ["field"] }, { kind: "pipe", type: i5.BreakpointPipe, name: "breakpoint" }] });
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: MssFormsComponent, decorators: [{
type: Component,
args: [{ selector: 'lib-mss-forms', template: "<form [formGroup]=\"dynamicFormGroup\" (ngSubmit)=\"submit()\" (keyup.enter)=\"submit()\">\n <div class=\"row\">\n <div *ngFor=\"let field of fields\" class=\"col-12 custom-engine-field-container\" [ngClass]=\"field | breakpoint\">\n <app-field-input [field]=\"field\"></app-field-input>\n <app-dynamic-error [field]=\"field\"></app-dynamic-error>\n </div>\n <div *ngIf=\"cancelBtnOptions\" class=\"col-12\" [ngClass]=\"cancelBtnOptions | breakpoint\">\n <button type=\"button\" (click)=\"cancelBtnOptions?.submit()\"\n class=\"w-100 d-flex align-items-center justify-content-center btn-default\">\n {{cancelBtnOptions?.content}}\n </button>\n </div>\n <div class=\"col-12\" [ngClass]=\"submitBtnOptions | breakpoint\">\n <button type=\"submit\" [disabled]=\"isLoading || dynamicFormGroup.invalid\"\n class=\"w-100 d-flex align-items-center justify-content-center btn-primary\">\n <div *ngIf=\"isLoading\" class=\"spinner-border text-primary\"></div>\n <ng-container *ngIf=\"!isLoading\">{{submitBtnOptions?.content}}</ng-container>\n </button>\n </div>\n </div>\n\n</form>" }]
}], ctorParameters: function () { return [{ type: i1.FormBuilder }]; }, propDecorators: { model: [{
type: Input
}], isLoading: [{
type: Input
}], submitBtnOptions: [{
type: Input
}], cancelBtnOptions: [{
type: Input
}], error: [{
type: Input
}], onSubmit: [{
type: Output
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibXNzLWZvcm1zLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL21zcy1mb3Jtcy9zcmMvbGliL21zcy1mb3Jtcy5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi9wcm9qZWN0cy9tc3MtZm9ybXMvc3JjL2xpYi9tc3MtZm9ybXMuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUEyQixTQUFTLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBcUIsTUFBTSxFQUFpQixNQUFNLGVBQWUsQ0FBQztBQUNsSSxPQUFPLEVBQWUsV0FBVyxFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQzs7Ozs7OztBQVFqRixNQUFNLE9BQU8saUJBQWlCO0lBWTVCLFlBQW9CLEdBQWdCO1FBQWhCLFFBQUcsR0FBSCxHQUFHLENBQWE7UUFUM0IsY0FBUyxHQUFZLEtBQUssQ0FBQztRQUczQixxQkFBZ0IsR0FBUSxJQUFJLENBQUE7UUFFM0IsYUFBUSxHQUFHLElBQUksWUFBWSxFQUFFLENBQUM7UUFFakMsV0FBTSxHQUFRLEVBQUUsQ0FBQztJQUVnQixDQUFDO0lBRXpDLFFBQVE7UUFDTixvQkFBb0I7SUFDdEIsQ0FBQztJQUVELFdBQVcsQ0FBQyxPQUFzQjtRQUNoQyxJQUFJLE9BQU8sQ0FBQyxPQUFPLENBQUMsRUFBRTtZQUNwQixJQUFJLENBQUMsTUFBTSxHQUFHLEVBQUUsQ0FBQTtZQUNoQixJQUFJLENBQUMsU0FBUyxFQUFFLENBQUE7U0FDakI7SUFDSCxDQUFDO0lBSU8sU0FBUztRQUNmLE1BQU0sZUFBZSxHQUFHLElBQUksQ0FBQyxxQkFBcUIsRUFBRSxDQUFDO1FBQ3JELGdDQUFnQztRQUNoQyxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsSUFBSSxTQUFTLENBQUMsZUFBZSxDQUFDLENBQUE7UUFDdEQsS0FBSyxNQUFNLEtBQUssSUFBSSxNQUFNLENBQUMs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OytHQTlHVSxpQkFBaUI7bUdBQWpCLGlCQUFpQiw2UENUOUIsZ3ZDQXFCTzs0RkRaTSxpQkFBaUI7a0JBTjdCLFNBQVM7K0JBQ0UsZUFBZTtrR0FPaEIsS0FBSztzQkFBYixLQUFLO2dCQUNHLFNBQVM7c0JBQWpCLEtBQUs7Z0JBRUcsZ0JBQWdCO3NCQUF4QixLQUFLO2dCQUNHLGdCQUFnQjtzQkFBeEIsS0FBSztnQkFDRyxLQUFLO3NCQUFiLEtBQUs7Z0JBQ0ksUUFBUTtzQkFBakIsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENoYW5nZURldGVjdGlvblN0cmF0ZWd5LCBDb21wb25lbnQsIEV2ZW50RW1pdHRlciwgSW5wdXQsIE9uQ2hhbmdlcywgT25Jbml0LCBPdXRwdXQsIFNpbXBsZUNoYW5nZXMgfSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xuaW1wb3J0IHsgRm9ybUJ1aWxkZXIsIEZvcm1Db250cm9sLCBGb3JtR3JvdXAsIFZhbGlkYXRvcnMgfSBmcm9tIFwiQGFuZ3VsYXIvZm9ybXNcIjtcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnbGliLW1zcy1mb3JtcycsXG4gIHRlbXBsYXRlVXJsOiAnLi9tc3MtZm9ybXMuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZXM6IFtcbiAgXVxufSlcbmV4cG9ydCBjbGFzcyBNc3NGb3Jtc0NvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25DaGFuZ2VzIHtcblxuICBASW5wdXQoKSBtb2RlbDogYW55O1xuICBASW5wdXQoKSBpc0xvYWRpbmc6IGJvb2xlYW4gPSBmYWxzZTtcbiAgLy8gQElucHV0KCkgc3VibWl0QnRuVHh0OiBzdHJpbmcgPSBcIlwiO1xuICBASW5wdXQoKSBzdWJtaXRCdG5PcHRpb25zOiBhbnlcbiAgQElucHV0KCkgY2FuY2VsQnRuT3B0aW9uczogYW55ID0gbnVsbFxuICBASW5wdXQoKSBlcnJvcjogYW55O1xuICBAT3V0cHV0KCkgb25TdWJtaXQgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gIHB1YmxpYyBkeW5hbWljRm9ybUdyb3VwOiBhbnk7XG4gIHB1YmxpYyBmaWVsZHM6IGFueSA9IFtdO1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgX2ZiOiBGb3JtQnVpbGRlcikgeyB9XG5cbiAgbmdPbkluaXQoKSB7XG4gICAgLy8gdGhpcy5idWlsZEZvcm0oKTtcbiAgfVxuXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcbiAgICBpZiAoY2hhbmdlc1snbW9kZWwnXSkge1xuICAgICAgdGhpcy5maWVsZHMgPSBbXVxuICAgICAgdGhpcy5idWlsZEZvcm0oKVxuICAgIH1cbiAgfVxuXG5cblxuICBwcml2YXRlIGJ1aWxkRm9ybSgpIHtcbiAgICBjb25zdCBmb3JtR3JvdXBGaWVsZHMgPSB0aGlzLmdldEZvcm1Db250cm9sc0ZpZWxkcygpO1xuICAgIC8vIGlmICghdGhpcy5keW5hbWljRm9ybUdyb3VwKSB7XG4gICAgdGhpcy5keW5hbWljRm9ybUdyb3VwID0gbmV3IEZvcm1Hcm91cChmb3JtR3JvdXBGaWVsZHMpXG4gICAgZm9yIChjb25zdCBmaWVsZCBvZiBPYmplY3Qua2V5cyh0aGlzLm1vZGVsKSkge1xuICAgICAgY29uc3QgZmllbGRQcm9wcyA9IHRoaXMubW9kZWxbZmllbGRdO1xuICAgICAgaWYgKGZpZWxkUHJvcHM/LmRpc2FibGVkKSB0aGlzLmR5bmFtaWNGb3JtR3JvdXAuZ2V0KGZpZWxkKS5kaXNhYmxlKClcbiAgICAgIHRoaXMuZHluYW1pY0Zvcm1Hcm91cC5nZXQoZmllbGQpPy51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KClcbiAgICB9XG4gICAgLy8gfSBlbHNlIHtcbiAgICAvLyAgIHRoaXMuZ2V0TmV3Rm9ybUNvbnRyb2xzRmllbGRzKClcbiAgICAvLyB9XG4gIH1cblxuICBwcml2YXRlIGdldEZvcm1Db250cm9sc0ZpZWxkcygpIHtcbiAgICBjb25zdCBmb3JtR3JvdXBGaWVsZHM6IGFueSA9IHt9O1xuICAgIGZvciAoY29uc3QgZmllbGQgb2YgT2JqZWN0LmtleXModGhpcy5tb2RlbCkpIHtcblxuICAgICAgY29uc3QgZmllbGRQcm9wcyA9IHRoaXMubW9kZWxbZmllbGRdO1xuICAgICAgY29uc3QgdmFsaWRhdG9yczogYW55ID0gdGhpcy5hZGRWYWxpZGF0b3IoZmllbGRQcm9wcy5ydWxlcyk7XG5cbiAgICAgIGZvcm1Hcm91cEZpZWxkc1tmaWVsZF0gPSBuZXcgRm9ybUNvbnRyb2woZmllbGRQcm9wcy52YWx1ZSwgdmFsaWRhdG9ycyk7XG5cbiAgICAgIGxldCBpbmRleCA9IHRoaXMuZmllbGRzLmZpbmRJbmRleCgoZjogYW55KSA9PiB7XG4gICAgICAgIGlmIChmLmZpZWxkTmFtZSA9PSBmaWVsZCkgcmV0dXJuIHRydWVcbiAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgICB9KVxuICAgICAgaWYgKGluZGV4ID09PSAtMSkgdGhpcy5maWVsZHMucHVzaCh7IC4uLmZpZWxkUHJvcHMsIGZpZWxkTmFtZTogZmllbGQgfSk7XG4gICAgfVxuICAgIHJldHVybiBmb3JtR3JvdXBGaWVsZHM7XG4gIH1cblxuICBwcml2YXRlIGdldE5ld0Zvcm1Db250cm9sc0ZpZWxkcygpIHtcbiAgICBPYmplY3Qua2V5cyh0aGlzLm1vZGVsKS5tYXAoKG1vZGVsKSA9PiB7XG4gICAgICBjb25zdCBmaWVsZFByb3BzID0gdGhpcy5tb2RlbFttb2RlbF07XG4gICAgICBjb25zdCB2YWxpZGF0b3JzOiBhbnkgPSB0aGlzLmFkZFZhbGlkYXRvcihmaWVsZFByb3BzLnJ1bGVzKTtcbiAgICAgIGlmICghdGhpcy5keW5hbWljRm9ybUdyb3VwWydjb250cm9scyddW21vZGVsXSkge1xuICAgICAgICB0aGlzLmR5bmFtaWNGb3JtR3JvdXAuYWRkQ29udHJvbChtb2RlbCwgdGhpcy5fZmIuY29udHJvbCh7IHZhbHVlOiBmaWVsZFByb3BzLnZhbHVlLCBkaXNhYmxlZDogZmllbGRQcm9wcz8uZGlzYWJsZWQgPyB0cnVlIDogZmFsc2UgfSwgdmFsaWRhdG9ycykpXG4gICAgICAgIC8vIHRoaXMuZHluYW1pY0Zvcm1Hcm91cC5nZXQoKVxuICAgICAgfVxuICAgIH0pXG4gIH1cblxuICBwcml2YXRlIGFkZFZhbGlkYXRvcihydWxlczogYW55KSB7XG4gICAgaWYgKCFydWxlcykge1xuICAgICAgcmV0dXJuIFtdO1xuICAgIH1cblxuICAgIGNvbnN0IHZhbGlkYXRvcnMgPSBPYmplY3Qua2V5cyhydWxlcykubWFwKChydWxlLCBpbmRleCkgPT4ge1xuICAgICAgc3dpdGNoIChydWxlKSB7XG4gICAgICAgIGNhc2UgXCJyZXF1aXJlZFwiOlxuICAgICAgICAgIHJldHVybiBWYWxpZGF0b3JzLnJlcXVpcmVkO1xuICAgICAgICBjYXNlIFwiZW1haWxcIjpcbiAgICAgICAgICByZXR1cm4gVmFsaWRhdG9ycy5lbWFpbDtcbiAgICAgICAgY2FzZSBcIm1pbkxlbmd0aFwiOlxuICAgICAgICAgIHJldHVybiBWYWxpZGF0b3JzLm1pbkxlbmd0aChPYmplY3QudmFsdWVzKHJ1bGVzKVtpbmRleF0gYXMgbnVtYmVyKTtcbiAgICAgICAgY2FzZSBcIm1heExlbmd0aFwiOlxuICAgICAgICAgIHJldHVybiBWYWxpZGF0b3JzLm1heExlbmd0aChPYmplY3QudmFsdWVzKHJ1bGVzKVtpbmRleF0gYXMgbnVtYmVyKTtcbiAgICAgICAgY2FzZSBcInBhdHRlcm5cIjpcbiAgICAgICAgICByZXR1cm4gVmFsaWRhdG9ycy5wYXR0ZXJuKE9iamVjdC52YWx1ZXMocnVsZXMpW2luZGV4XSBhcyBzdHJpbmcpO1xuICAgICAgICBjYXNlIFwibWluXCI6XG4gICAgICAgICAgcmV0dXJuIFZhbGlkYXRvcnMubWluKE9iamVjdC52YWx1ZXMocnVsZXMpW2luZGV4XSBhcyBudW1iZXIpXG4gICAgICAgIGNhc2UgXCJtYXhcIjpcbiAgICAgICAgICByZXR1cm4gVmFsaWRhdG9ycy5tYXgoT2JqZWN0LnZhbHVlcyhydWxlcylbaW5kZXhdIGFzIG51bWJlcilcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICByZXR1cm5cbiAgICAgICAgLy9hZGQgbW9yZSBjYXNlIGZvciBmdXR1cmUuXG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIHZhbGlkYXRvcnM7XG4gIH1cblxuXG4gIHN1Ym1pdCgpIHtcbiAgICB0aGlzLm9uU3VibWl0LmVtaXQodGhpcy5keW5hbWljRm9ybUdyb3VwKVxuICB9XG5cbiAgcmVzZXRGb3JtKCkge1xuICAgIHRoaXMuZHluYW1pY0Zvcm1Hcm91cC5yZXNldCgpXG4gIH1cblxuICBzZXRSdWxlKGZvcm1Db250cm9sTmFtZTogc3RyaW5nLCB2YWxpZGF0b3JzOiBhbnkpIHtcbiAgICBpZiAodGhpcy5keW5hbWljRm9ybUdyb3VwWydjb250cm9scyddW2Zvcm1Db250cm9sTmFtZV0pIHRoaXMuZHluYW1pY0Zvcm1Hcm91cFsnY29udHJvbHMnXVtmb3JtQ29udHJvbE5hbWVdLnNldFZhbGlkYXRvcnModmFsaWRhdG9ycylcbiAgfVxufVxuIiwiPGZvcm0gW2Zvcm1Hcm91cF09XCJkeW5hbWljRm9ybUdyb3VwXCIgKG5nU3VibWl0KT1cInN1Ym1pdCgpXCIgKGtleXVwLmVudGVyKT1cInN1Ym1pdCgpXCI+XG4gICAgPGRpdiBjbGFzcz1cInJvd1wiPlxuICAgICAgICA8ZGl2ICpuZ0Zvcj1cImxldCBmaWVsZCBvZiBmaWVsZHNcIiBjbGFzcz1cImNvbC0xMiBjdXN0b20tZW5naW5lLWZpZWxkLWNvbnRhaW5lclwiIFtuZ0NsYXNzXT1cImZpZWxkIHwgYnJlYWtwb2ludFwiPlxuICAgICAgICAgICAgPGFwcC1maWVsZC1pbnB1dCBbZmllbGRdPVwiZmllbGRcIj48L2FwcC1maWVsZC1pbnB1dD5cbiAgICAgICAgICAgIDxhcHAtZHluYW1pYy1lcnJvciBbZmllbGRdPVwiZmllbGRcIj48L2FwcC1keW5hbWljLWVycm9yPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiAqbmdJZj1cImNhbmNlbEJ0bk9wdGlvbnNcIiBjbGFzcz1cImNvbC0xMlwiIFtuZ0NsYXNzXT1cImNhbmNlbEJ0bk9wdGlvbnMgfCBicmVha3BvaW50XCI+XG4gICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiAoY2xpY2spPVwiY2FuY2VsQnRuT3B0aW9ucz8uc3VibWl0KClcIlxuICAgICAgICAgICAgICAgIGNsYXNzPVwidy0xMDAgZC1mbGV4IGFsaWduLWl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNvbnRlbnQtY2VudGVyIGJ0bi1kZWZhdWx0XCI+XG4gICAgICAgICAgICAgICAge3tjYW5jZWxCdG5PcHRpb25zPy5jb250ZW50fX1cbiAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImNvbC0xMlwiIFtuZ0NsYXNzXT1cInN1Ym1pdEJ0bk9wdGlvbnMgfCBicmVha3BvaW50XCI+XG4gICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJzdWJtaXRcIiBbZGlzYWJsZWRdPVwiaXNMb2FkaW5nIHx8IGR5bmFtaWNGb3JtR3JvdXAuaW52YWxpZFwiXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJ3LTEwMCBkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyIGp1c3RpZnktY29udGVudC1jZW50ZXIgYnRuLXByaW1hcnlcIj5cbiAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiaXNMb2FkaW5nXCIgY2xhc3M9XCJzcGlubmVyLWJvcmRlciB0ZXh0LXByaW1hcnlcIj48L2Rpdj5cbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIWlzTG9hZGluZ1wiPnt7c3VibWl0QnRuT3B0aW9ucz8uY29udGVudH19PC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG5cbjwvZm9ybT4iXX0=