UNPKG

@bsachref/ng-form

Version:

A dynamic form component for Angular using PrimeNG or Angular Material

121 lines 54.1 kB
/** * PrimeNgFormsComponent is a standalone Angular component that dynamically generates * a form based on the provided configuration. It leverages PrimeNG UI components * and Angular Reactive Forms for form creation and validation. * * @selector primeng-forms * @standalone true * @imports [ * CommonModule, * FormsModule, * ReactiveFormsModule, * ValidationMessagesComponent, * InputTextModule, * MultiSelectModule, * TextareaModule, * CheckboxModule, * RadioButtonModule, * DatePickerModule, * ToggleButtonModule, * FileUploadModule, * SliderModule, * ButtonModule, * SelectModule, * FileUploadValueAccessor * ] * @templateUrl ./prime-form.component.html * @styleUrl ./prime-form.component.css * @changeDetection ChangeDetectionStrategy.OnPush * * @property {string} formName - The name of the form. * @property {FormControlConfig[]} controls - The configuration for the form controls. * @property {EventEmitter<Record<string, any>>} formSubmit - Event emitter for form submission. * @property {FormGroup} form - The reactive form group. * @property {BehaviorSubject<boolean>} formChanges$ - Observable to track form changes. * * @constructor * @param {FormBuilder} fb - FormBuilder service to create form controls. * @param {ChangeDetectorRef} cdr - ChangeDetectorRef to manually trigger change detection. * * @method ngOnInit - Lifecycle hook that initializes the form. * @method initializeForm - Initializes the form controls and sets up value change subscriptions. * @method getValidators - Returns an array of validators for a given form control configuration. * @param {FormControlConfig} control - The configuration for a form control. * @returns {ValidatorFn[]} - An array of validator functions. * @method updateValidators - Updates the validators for a form control based on its value. * @param {AbstractControl} control - The form control to update. * @param {any} value - The current value of the form control. * @method shouldRequireValidation - Determines if a form control should require validation. * @param {any} value - The current value of the form control. * @returns {boolean} - True if validation is required, false otherwise. * @method onFileSelect - Handles file selection for file upload controls. * @param {any} event - The file selection event. * @param {string} controlName - The name of the form control. * @method onSubmit - Handles form submission, validates the form, and emits the form value. */ import { CommonModule } from '@angular/common'; import { ChangeDetectionStrategy, Component } from '@angular/core'; import { ReactiveFormsModule, FormsModule } from '@angular/forms'; import { ValidationMessagesComponent } from '../validation-messages/validation-messages.component'; import { InputTextModule } from 'primeng/inputtext'; import { MultiSelectModule } from 'primeng/multiselect'; import { TextareaModule } from 'primeng/textarea'; import { CheckboxModule } from 'primeng/checkbox'; import { RadioButtonModule } from 'primeng/radiobutton'; import { ToggleButtonModule } from 'primeng/togglebutton'; import { FileUploadModule } from 'primeng/fileupload'; import { SliderModule } from 'primeng/slider'; import { ButtonModule } from 'primeng/button'; import { DatePickerModule } from 'primeng/datepicker'; import { SelectModule } from 'primeng/select'; import { BaseFormsComponent } from '../base.component'; import * as i0 from "@angular/core"; import * as i1 from "@angular/common"; import * as i2 from "@angular/forms"; import * as i3 from "primeng/inputtext"; import * as i4 from "primeng/multiselect"; import * as i5 from "primeng/textarea"; import * as i6 from "primeng/checkbox"; import * as i7 from "primeng/radiobutton"; import * as i8 from "primeng/datepicker"; import * as i9 from "primeng/togglebutton"; import * as i10 from "primeng/slider"; import * as i11 from "primeng/button"; import * as i12 from "primeng/select"; export class PrimeNgFormsComponent extends BaseFormsComponent { onFileSelect(event, controlName) { const file = event.files[0]; if (file) { this.form.get(controlName)?.setValue(file); this.form.get(controlName)?.updateValueAndValidity(); const controlConfig = this.controls().find((control) => control.name === controlName); if (controlConfig?.events?.onUpload) { controlConfig.events.onUpload(event); } } } static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: PrimeNgFormsComponent, deps: null, target: i0.ɵɵFactoryTarget.Component }); static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.13", type: PrimeNgFormsComponent, isStandalone: true, selector: "primeng-forms", usesInheritance: true, ngImport: i0, template: "<form [formGroup]=\"form\" [attr.name]=\"formName()\" (ngSubmit)=\"onSubmit()\">\n @for (control of controls(); track $index) {\n @if (control.uiFramework === \"primeng\" || !control.uiFramework) {\n @if (form.get(control.name)) {\n <section [ngClass]=\"control.class\" [ngStyle]=\"control.style\">\n @if (control.label) {\n <label\n [attr.for]=\"control.name\"\n [ngClass]=\"control.labelClass\"\n [ngStyle]=\"control.labelStyle\"\n >\n {{ control.label }}\n </label>\n }\n\n @switch (control.type) {\n @case (\"text\") {\n <input\n pInputText\n [formControlName]=\"control.name\"\n [id]=\"control.name\"\n (change)=\"control.events?.onChange?.($event)\"\n (focus)=\"control.events?.onFocus?.($event)\"\n (blur)=\"control.events?.onBlur?.($event)\"\n (keyup)=\"control.events?.onKeyUp?.($event)\"\n (keydown)=\"control.events?.onKeyDown?.($event)\"\n (paste)=\"control.events?.onPaste?.($event)\"\n />\n }\n @case (\"number\") {\n <input\n pInputText\n type=\"number\"\n [formControlName]=\"control.name\"\n [id]=\"control.name\"\n (change)=\"control.events?.onChange?.($event)\"\n (focus)=\"control.events?.onFocus?.($event)\"\n (blur)=\"control.events?.onBlur?.($event)\"\n (keyup)=\"control.events?.onKeyUp?.($event)\"\n (keydown)=\"control.events?.onKeyDown?.($event)\"\n (paste)=\"control.events?.onPaste?.($event)\"\n />\n }\n @case (\"password\") {\n <input\n pInputText\n type=\"password\"\n [formControlName]=\"control.name\"\n [id]=\"control.name\"\n (change)=\"control.events?.onChange?.($event)\"\n (focus)=\"control.events?.onFocus?.($event)\"\n (blur)=\"control.events?.onBlur?.($event)\"\n (keyup)=\"control.events?.onKeyUp?.($event)\"\n (keydown)=\"control.events?.onKeyDown?.($event)\"\n (paste)=\"control.events?.onPaste?.($event)\"\n />\n }\n @case (\"email\") {\n <input\n pInputText\n type=\"email\"\n [formControlName]=\"control.name\"\n [id]=\"control.name\"\n (change)=\"control.events?.onChange?.($event)\"\n (focus)=\"control.events?.onFocus?.($event)\"\n (blur)=\"control.events?.onBlur?.($event)\"\n (keyup)=\"control.events?.onKeyUp?.($event)\"\n (keydown)=\"control.events?.onKeyDown?.($event)\"\n (paste)=\"control.events?.onPaste?.($event)\"\n />\n }\n @case (\"select\") {\n <p-select\n [options]=\"control.options\"\n [formControlName]=\"control.name\"\n (onChange)=\"control.events?.onChange?.($event)\"\n (onFocus)=\"control.events?.onFocus?.($event)\"\n (onBlur)=\"control.events?.onBlur?.($event)\"\n />\n }\n @case (\"multi-select\") {\n <p-multiSelect\n [options]=\"control.options\"\n [formControlName]=\"control.name\"\n (onChange)=\"control.events?.onChange?.($event)\"\n (onFocus)=\"control.events?.onFocus?.($event)\"\n (onBlur)=\"control.events?.onBlur?.($event)\"\n ></p-multiSelect>\n }\n @case (\"textarea\") {\n <textarea\n pTextarea\n [formControlName]=\"control.name\"\n [id]=\"control.name\"\n (change)=\"control.events?.onChange?.($event)\"\n (focus)=\"control.events?.onFocus?.($event)\"\n (blur)=\"control.events?.onBlur?.($event)\"\n (keyup)=\"control.events?.onKeyUp?.($event)\"\n (keydown)=\"control.events?.onKeyDown?.($event)\"\n (paste)=\"control.events?.onPaste?.($event)\"\n ></textarea>\n }\n @case (\"checkbox\") {\n <p-checkbox\n [binary]=\"true\"\n [formControlName]=\"control.name\"\n (onChange)=\"control.events?.onChange?.($event)\"\n (onFocus)=\"control.events?.onFocus?.($event)\"\n (onBlur)=\"control.events?.onBlur?.($event)\"\n ></p-checkbox>\n }\n @case (\"radio\") {\n @for (option of control.options ?? []; track $index) {\n <div>\n <p-radioButton\n [name]=\"control.name\"\n [formControlName]=\"control.name\"\n [value]=\"option\"\n [inputId]=\"'radio-' + option\"\n (onChange)=\"control.events?.onChange?.($event)\"\n (onFocus)=\"control.events?.onFocus?.($event)\"\n (onBlur)=\"control.events?.onBlur?.($event)\"\n ></p-radioButton>\n <label [for]=\"'radio-' + option\">{{ option }}</label>\n </div>\n }\n }\n @case (\"date\") {\n <p-datepicker\n [formControlName]=\"control.name\"\n (onSelect)=\"control.events?.onSelect?.($event)\"\n (onFocus)=\"control.events?.onFocus?.($event)\"\n (onBlur)=\"control.events?.onBlur?.($event)\"\n />\n }\n @case (\"toggle\") {\n <p-toggleButton\n [formControlName]=\"control.name\"\n (onChange)=\"control.events?.onChange?.($event)\"\n (onFocus)=\"control.events?.onFocus?.($event)\"\n (onBlur)=\"control.events?.onBlur?.($event)\"\n ></p-toggleButton>\n }\n <!-- @case (\"file\") {\n <p-fileUpload \n [customUpload]=\"true\"\n [formControlName]=\"control.name\"\n (onSelect)=\"control.events?.onSelect?.($event)\"\n (onClear)=\"control.events?.onClear?.($event)\"\n (onRemove)=\"control.events?.onRemove?.($event)\"\n (onError)=\"control.events?.onError?.($event)\"\n (onBeforeUpload)=\"control.events?.onBeforeUpload?.($event)\"\n (onProgress)=\"control.events?.onProgress?.($event)\"\n (onUpload)=\"control.events?.onUpload?.($event)\"\n >\n\n <p-fileUpload\n [customUpload]=\"true\"\n (onUpload)=\"onFileSelect($event, control.name)\"\n [formControlName]=\"control.name\"\n [id]=\"control.name\"\n [chooseLabel]=\"control.primeng?.chooseLabel\"\n [uploadLabel]=\"control.primeng?.uploadLabel\"\n [cancelLabel]=\"control.primeng?.cancelLabel\"\n [auto]=\"control.primeng?.auto\"\n [url]=\"control.primeng?.url\"\n [withCredentials]=\"control.primeng?.withCredentials\"\n [multiple]=\"control.primeng?.multiple\"\n [maxFileSize]=\"control.primeng?.maxFileSize\"\n [customUpload]=\"control.primeng?.customUpload\"\n [showUploadButton]=\"control.primeng?.showUploadButton\"\n [showCancelButton]=\"control.primeng?.showCancelButton\"\n [accept]=\"control.primeng?.accept\"\n [mode]=\"control.primeng?.mode\"\n [previewWidth]=\"control.primeng?.previewWidth\"\n (onSelect)=\"control.events?.onSelect?.($event)\"\n (onClear)=\"control.events?.onClear?.($event)\"\n (onRemove)=\"control.events?.onRemove?.($event)\"\n (onError)=\"control.events?.onError?.($event)\"\n (onBeforeUpload)=\"control.events?.onBeforeUpload?.($event)\"\n (onProgress)=\"control.events?.onProgress?.($event)\"\n (onUpload)=\"control.events?.onUpload?.($event)\"\n >\n <ng-template pTemplate=\"content\">\n <p-button label=\"Choose File\" icon=\"pi pi-upload\"></p-button>\n </ng-template>\n </p-fileUpload>\n } -->\n @case (\"slider\") {\n <p-slider\n [formControlName]=\"control.name\"\n (onChange)=\"control.events?.onChange?.($event)\"\n (onSlideEnd)=\"control.events?.onSlideEnd?.($event)\"\n ></p-slider>\n }\n }\n\n <validation-messages\n [control]=\"form.get(control.name)\"\n [controlName]=\"control.name\"\n [config]=\"control\"\n ></validation-messages>\n </section>\n }\n }\n }\n <button\n pButton\n type=\"submit\"\n [disabled]=\"form.invalid\"\n label=\"Submit\"\n ></button>\n</form>\n", dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i2.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i2.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i2.NumberValueAccessor, selector: "input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]" }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i2.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i2.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "component", type: ValidationMessagesComponent, selector: "validation-messages", inputs: ["control", "controlName", "config"] }, { kind: "ngmodule", type: InputTextModule }, { kind: "directive", type: i3.InputText, selector: "[pInputText]", inputs: ["variant", "fluid", "pSize"] }, { kind: "ngmodule", type: MultiSelectModule }, { kind: "component", type: i4.MultiSelect, selector: "p-multiSelect, p-multiselect, p-multi-select", inputs: ["id", "ariaLabel", "style", "styleClass", "panelStyle", "panelStyleClass", "inputId", "disabled", "fluid", "readonly", "group", "filter", "filterPlaceHolder", "filterLocale", "overlayVisible", "tabindex", "variant", "appendTo", "dataKey", "name", "ariaLabelledBy", "displaySelectedLabel", "maxSelectedLabels", "selectionLimit", "selectedItemsLabel", "showToggleAll", "emptyFilterMessage", "emptyMessage", "resetFilterOnHide", "dropdownIcon", "chipIcon", "optionLabel", "optionValue", "optionDisabled", "optionGroupLabel", "optionGroupChildren", "showHeader", "filterBy", "scrollHeight", "lazy", "virtualScroll", "loading", "virtualScrollItemSize", "loadingIcon", "virtualScrollOptions", "overlayOptions", "ariaFilterLabel", "filterMatchMode", "tooltip", "tooltipPosition", "tooltipPositionStyle", "tooltipStyleClass", "autofocusFilter", "display", "autocomplete", "size", "showClear", "autofocus", "autoZIndex", "baseZIndex", "showTransitionOptions", "hideTransitionOptions", "defaultLabel", "placeholder", "options", "filterValue", "itemSize", "selectAll", "focusOnHover", "filterFields", "selectOnFocus", "autoOptionFocus"], outputs: ["onChange", "onFilter", "onFocus", "onBlur", "onClick", "onClear", "onPanelShow", "onPanelHide", "onLazyLoad", "onRemove", "onSelectAllChange"] }, { kind: "ngmodule", type: TextareaModule }, { kind: "directive", type: i5.Textarea, selector: "[pTextarea]", inputs: ["autoResize", "variant", "fluid", "pSize"], outputs: ["onResize"] }, { kind: "ngmodule", type: CheckboxModule }, { kind: "component", type: i6.Checkbox, selector: "p-checkbox, p-checkBox, p-check-box", inputs: ["value", "name", "disabled", "binary", "ariaLabelledBy", "ariaLabel", "tabindex", "inputId", "style", "inputStyle", "styleClass", "inputClass", "indeterminate", "size", "formControl", "checkboxIcon", "readonly", "required", "autofocus", "trueValue", "falseValue", "variant"], outputs: ["onChange", "onFocus", "onBlur"] }, { kind: "ngmodule", type: RadioButtonModule }, { kind: "component", type: i7.RadioButton, selector: "p-radioButton, p-radiobutton, p-radio-button", inputs: ["value", "formControlName", "name", "disabled", "variant", "size", "tabindex", "inputId", "ariaLabelledBy", "ariaLabel", "style", "styleClass", "autofocus", "binary"], outputs: ["onClick", "onFocus", "onBlur"] }, { kind: "ngmodule", type: DatePickerModule }, { kind: "component", type: i8.DatePicker, selector: "p-datePicker, p-datepicker, p-date-picker", inputs: ["iconDisplay", "style", "styleClass", "inputStyle", "inputId", "name", "inputStyleClass", "placeholder", "ariaLabelledBy", "ariaLabel", "iconAriaLabel", "disabled", "dateFormat", "multipleSeparator", "rangeSeparator", "inline", "showOtherMonths", "selectOtherMonths", "showIcon", "fluid", "icon", "appendTo", "readonlyInput", "shortYearCutoff", "monthNavigator", "yearNavigator", "hourFormat", "timeOnly", "stepHour", "stepMinute", "stepSecond", "showSeconds", "required", "showOnFocus", "showWeek", "startWeekFromFirstDayOfYear", "showClear", "dataType", "selectionMode", "maxDateCount", "showButtonBar", "todayButtonStyleClass", "clearButtonStyleClass", "autofocus", "autoZIndex", "baseZIndex", "panelStyleClass", "panelStyle", "keepInvalid", "hideOnDateTimeSelect", "touchUI", "timeSeparator", "focusTrap", "showTransitionOptions", "hideTransitionOptions", "tabindex", "variant", "size", "minDate", "maxDate", "disabledDates", "disabledDays", "yearRange", "showTime", "responsiveOptions", "numberOfMonths", "firstDayOfWeek", "locale", "view", "defaultDate"], outputs: ["onFocus", "onBlur", "onClose", "onSelect", "onClear", "onInput", "onTodayClick", "onClearClick", "onMonthChange", "onYearChange", "onClickOutside", "onShow"] }, { kind: "ngmodule", type: ToggleButtonModule }, { kind: "component", type: i9.ToggleButton, selector: "p-toggleButton, p-togglebutton, p-toggle-button", inputs: ["onLabel", "offLabel", "onIcon", "offIcon", "ariaLabel", "ariaLabelledBy", "disabled", "style", "styleClass", "inputId", "tabindex", "size", "iconPos", "autofocus", "allowEmpty"], outputs: ["onChange"] }, { kind: "ngmodule", type: FileUploadModule }, { kind: "ngmodule", type: SliderModule }, { kind: "component", type: i10.Slider, selector: "p-slider", inputs: ["animate", "disabled", "min", "max", "orientation", "step", "range", "style", "styleClass", "ariaLabel", "ariaLabelledBy", "tabindex", "autofocus"], outputs: ["onChange", "onSlideEnd"] }, { kind: "ngmodule", type: ButtonModule }, { kind: "directive", type: i11.ButtonDirective, selector: "[pButton]", inputs: ["iconPos", "loadingIcon", "loading", "severity", "raised", "rounded", "text", "outlined", "size", "plain", "fluid", "label", "icon", "buttonProps"] }, { kind: "ngmodule", type: SelectModule }, { kind: "component", type: i12.Select, selector: "p-select", inputs: ["id", "scrollHeight", "filter", "name", "style", "panelStyle", "styleClass", "panelStyleClass", "readonly", "required", "editable", "appendTo", "tabindex", "placeholder", "loadingIcon", "filterPlaceholder", "filterLocale", "variant", "inputId", "dataKey", "filterBy", "filterFields", "autofocus", "resetFilterOnHide", "checkmark", "dropdownIcon", "loading", "optionLabel", "optionValue", "optionDisabled", "optionGroupLabel", "optionGroupChildren", "autoDisplayFirst", "group", "showClear", "emptyFilterMessage", "emptyMessage", "lazy", "virtualScroll", "virtualScrollItemSize", "virtualScrollOptions", "size", "overlayOptions", "ariaFilterLabel", "ariaLabel", "ariaLabelledBy", "filterMatchMode", "maxlength", "tooltip", "tooltipPosition", "tooltipPositionStyle", "tooltipStyleClass", "focusOnHover", "selectOnFocus", "autoOptionFocus", "autofocusFilter", "fluid", "disabled", "itemSize", "autoZIndex", "baseZIndex", "showTransitionOptions", "hideTransitionOptions", "filterValue", "options"], outputs: ["onChange", "onFilter", "onFocus", "onBlur", "onClick", "onShow", "onHide", "onClear", "onLazyLoad"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: PrimeNgFormsComponent, decorators: [{ type: Component, args: [{ selector: 'primeng-forms', standalone: true, imports: [ BaseFormsComponent, CommonModule, FormsModule, ReactiveFormsModule, ValidationMessagesComponent, InputTextModule, MultiSelectModule, TextareaModule, CheckboxModule, RadioButtonModule, DatePickerModule, ToggleButtonModule, FileUploadModule, SliderModule, ButtonModule, SelectModule, ], changeDetection: ChangeDetectionStrategy.OnPush, template: "<form [formGroup]=\"form\" [attr.name]=\"formName()\" (ngSubmit)=\"onSubmit()\">\n @for (control of controls(); track $index) {\n @if (control.uiFramework === \"primeng\" || !control.uiFramework) {\n @if (form.get(control.name)) {\n <section [ngClass]=\"control.class\" [ngStyle]=\"control.style\">\n @if (control.label) {\n <label\n [attr.for]=\"control.name\"\n [ngClass]=\"control.labelClass\"\n [ngStyle]=\"control.labelStyle\"\n >\n {{ control.label }}\n </label>\n }\n\n @switch (control.type) {\n @case (\"text\") {\n <input\n pInputText\n [formControlName]=\"control.name\"\n [id]=\"control.name\"\n (change)=\"control.events?.onChange?.($event)\"\n (focus)=\"control.events?.onFocus?.($event)\"\n (blur)=\"control.events?.onBlur?.($event)\"\n (keyup)=\"control.events?.onKeyUp?.($event)\"\n (keydown)=\"control.events?.onKeyDown?.($event)\"\n (paste)=\"control.events?.onPaste?.($event)\"\n />\n }\n @case (\"number\") {\n <input\n pInputText\n type=\"number\"\n [formControlName]=\"control.name\"\n [id]=\"control.name\"\n (change)=\"control.events?.onChange?.($event)\"\n (focus)=\"control.events?.onFocus?.($event)\"\n (blur)=\"control.events?.onBlur?.($event)\"\n (keyup)=\"control.events?.onKeyUp?.($event)\"\n (keydown)=\"control.events?.onKeyDown?.($event)\"\n (paste)=\"control.events?.onPaste?.($event)\"\n />\n }\n @case (\"password\") {\n <input\n pInputText\n type=\"password\"\n [formControlName]=\"control.name\"\n [id]=\"control.name\"\n (change)=\"control.events?.onChange?.($event)\"\n (focus)=\"control.events?.onFocus?.($event)\"\n (blur)=\"control.events?.onBlur?.($event)\"\n (keyup)=\"control.events?.onKeyUp?.($event)\"\n (keydown)=\"control.events?.onKeyDown?.($event)\"\n (paste)=\"control.events?.onPaste?.($event)\"\n />\n }\n @case (\"email\") {\n <input\n pInputText\n type=\"email\"\n [formControlName]=\"control.name\"\n [id]=\"control.name\"\n (change)=\"control.events?.onChange?.($event)\"\n (focus)=\"control.events?.onFocus?.($event)\"\n (blur)=\"control.events?.onBlur?.($event)\"\n (keyup)=\"control.events?.onKeyUp?.($event)\"\n (keydown)=\"control.events?.onKeyDown?.($event)\"\n (paste)=\"control.events?.onPaste?.($event)\"\n />\n }\n @case (\"select\") {\n <p-select\n [options]=\"control.options\"\n [formControlName]=\"control.name\"\n (onChange)=\"control.events?.onChange?.($event)\"\n (onFocus)=\"control.events?.onFocus?.($event)\"\n (onBlur)=\"control.events?.onBlur?.($event)\"\n />\n }\n @case (\"multi-select\") {\n <p-multiSelect\n [options]=\"control.options\"\n [formControlName]=\"control.name\"\n (onChange)=\"control.events?.onChange?.($event)\"\n (onFocus)=\"control.events?.onFocus?.($event)\"\n (onBlur)=\"control.events?.onBlur?.($event)\"\n ></p-multiSelect>\n }\n @case (\"textarea\") {\n <textarea\n pTextarea\n [formControlName]=\"control.name\"\n [id]=\"control.name\"\n (change)=\"control.events?.onChange?.($event)\"\n (focus)=\"control.events?.onFocus?.($event)\"\n (blur)=\"control.events?.onBlur?.($event)\"\n (keyup)=\"control.events?.onKeyUp?.($event)\"\n (keydown)=\"control.events?.onKeyDown?.($event)\"\n (paste)=\"control.events?.onPaste?.($event)\"\n ></textarea>\n }\n @case (\"checkbox\") {\n <p-checkbox\n [binary]=\"true\"\n [formControlName]=\"control.name\"\n (onChange)=\"control.events?.onChange?.($event)\"\n (onFocus)=\"control.events?.onFocus?.($event)\"\n (onBlur)=\"control.events?.onBlur?.($event)\"\n ></p-checkbox>\n }\n @case (\"radio\") {\n @for (option of control.options ?? []; track $index) {\n <div>\n <p-radioButton\n [name]=\"control.name\"\n [formControlName]=\"control.name\"\n [value]=\"option\"\n [inputId]=\"'radio-' + option\"\n (onChange)=\"control.events?.onChange?.($event)\"\n (onFocus)=\"control.events?.onFocus?.($event)\"\n (onBlur)=\"control.events?.onBlur?.($event)\"\n ></p-radioButton>\n <label [for]=\"'radio-' + option\">{{ option }}</label>\n </div>\n }\n }\n @case (\"date\") {\n <p-datepicker\n [formControlName]=\"control.name\"\n (onSelect)=\"control.events?.onSelect?.($event)\"\n (onFocus)=\"control.events?.onFocus?.($event)\"\n (onBlur)=\"control.events?.onBlur?.($event)\"\n />\n }\n @case (\"toggle\") {\n <p-toggleButton\n [formControlName]=\"control.name\"\n (onChange)=\"control.events?.onChange?.($event)\"\n (onFocus)=\"control.events?.onFocus?.($event)\"\n (onBlur)=\"control.events?.onBlur?.($event)\"\n ></p-toggleButton>\n }\n <!-- @case (\"file\") {\n <p-fileUpload \n [customUpload]=\"true\"\n [formControlName]=\"control.name\"\n (onSelect)=\"control.events?.onSelect?.($event)\"\n (onClear)=\"control.events?.onClear?.($event)\"\n (onRemove)=\"control.events?.onRemove?.($event)\"\n (onError)=\"control.events?.onError?.($event)\"\n (onBeforeUpload)=\"control.events?.onBeforeUpload?.($event)\"\n (onProgress)=\"control.events?.onProgress?.($event)\"\n (onUpload)=\"control.events?.onUpload?.($event)\"\n >\n\n <p-fileUpload\n [customUpload]=\"true\"\n (onUpload)=\"onFileSelect($event, control.name)\"\n [formControlName]=\"control.name\"\n [id]=\"control.name\"\n [chooseLabel]=\"control.primeng?.chooseLabel\"\n [uploadLabel]=\"control.primeng?.uploadLabel\"\n [cancelLabel]=\"control.primeng?.cancelLabel\"\n [auto]=\"control.primeng?.auto\"\n [url]=\"control.primeng?.url\"\n [withCredentials]=\"control.primeng?.withCredentials\"\n [multiple]=\"control.primeng?.multiple\"\n [maxFileSize]=\"control.primeng?.maxFileSize\"\n [customUpload]=\"control.primeng?.customUpload\"\n [showUploadButton]=\"control.primeng?.showUploadButton\"\n [showCancelButton]=\"control.primeng?.showCancelButton\"\n [accept]=\"control.primeng?.accept\"\n [mode]=\"control.primeng?.mode\"\n [previewWidth]=\"control.primeng?.previewWidth\"\n (onSelect)=\"control.events?.onSelect?.($event)\"\n (onClear)=\"control.events?.onClear?.($event)\"\n (onRemove)=\"control.events?.onRemove?.($event)\"\n (onError)=\"control.events?.onError?.($event)\"\n (onBeforeUpload)=\"control.events?.onBeforeUpload?.($event)\"\n (onProgress)=\"control.events?.onProgress?.($event)\"\n (onUpload)=\"control.events?.onUpload?.($event)\"\n >\n <ng-template pTemplate=\"content\">\n <p-button label=\"Choose File\" icon=\"pi pi-upload\"></p-button>\n </ng-template>\n </p-fileUpload>\n } -->\n @case (\"slider\") {\n <p-slider\n [formControlName]=\"control.name\"\n (onChange)=\"control.events?.onChange?.($event)\"\n (onSlideEnd)=\"control.events?.onSlideEnd?.($event)\"\n ></p-slider>\n }\n }\n\n <validation-messages\n [control]=\"form.get(control.name)\"\n [controlName]=\"control.name\"\n [config]=\"control\"\n ></validation-messages>\n </section>\n }\n }\n }\n <button\n pButton\n type=\"submit\"\n [disabled]=\"form.invalid\"\n label=\"Submit\"\n ></button>\n</form>\n" }] }] }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJpbWUtZm9ybS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9uZ0Zvcm0vc3JjL2FwcC9wcmltZS1mb3JtL3ByaW1lLWZvcm0uY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vbmdGb3JtL3NyYy9hcHAvcHJpbWUtZm9ybS9wcmltZS1mb3JtLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FzREc7QUFDSCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDL0MsT0FBTyxFQUFFLHVCQUF1QixFQUFFLFNBQVMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNuRSxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsV0FBVyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDbEUsT0FBTyxFQUFFLDJCQUEyQixFQUFFLE1BQU0sc0RBQXNELENBQUM7QUFDbkcsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQ3BELE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ3hELE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUNsRCxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDbEQsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDeEQsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDMUQsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDdEQsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzlDLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUM5QyxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUN0RCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDOUMsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sbUJBQW1CLENBQUM7Ozs7Ozs7Ozs7Ozs7O0FBMEJ2RCxNQUFNLE9BQU8scUJBQXNCLFNBQVEsa0JBQWtCO0lBQzNELFlBQVksQ0FBQyxLQUFVLEVBQUUsV0FBbUI7UUFDMUMsTUFBTSxJQUFJLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUM1QixJQUFJLElBQUksRUFBRSxDQUFDO1lBQ1QsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsV0FBVyxDQUFDLEVBQUUsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQzNDLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLFdBQVcsQ0FBQyxFQUFFLHNCQUFzQixFQUFFLENBQUM7WUFFckQsTUFBTSxhQUFhLEdBQUcsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDLElBQUksQ0FDeEMsQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDLE9BQU8sQ0FBQyxJQUFJLEtBQUssV0FBVyxDQUMxQyxDQUFDO1lBQ0YsSUFBSSxhQUFhLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxDQUFDO2dCQUNwQyxhQUFhLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUN2QyxDQUFDO1FBQ0gsQ0FBQztJQUNILENBQUM7d0dBZFUscUJBQXFCOzRGQUFyQixxQkFBcUIsZ0dDaEdsQyw2dFNBcU5BLDJDRHhJSSxZQUFZLGlOQUNaLFdBQVcsNnpCQUNYLG1CQUFtQixnVkFDbkIsMkJBQTJCLDZHQUMzQixlQUFlLDBJQUNmLGlCQUFpQixnNUNBQ2pCLGNBQWMsNktBQ2QsY0FBYyxrY0FDZCxpQkFBaUIsaVdBQ2pCLGdCQUFnQiwwMUNBQ2hCLGtCQUFrQiw2VkFDbEIsZ0JBQWdCLDhCQUNoQixZQUFZLGdTQUNaLFlBQVkscVFBQ1osWUFBWTs7NEZBS0gscUJBQXFCO2tCQXhCakMsU0FBUzsrQkFDRSxlQUFlLGNBQ2IsSUFBSSxXQUNQO3dCQUNQLGtCQUFrQjt3QkFDbEIsWUFBWTt3QkFDWixXQUFXO3dCQUNYLG1CQUFtQjt3QkFDbkIsMkJBQTJCO3dCQUMzQixlQUFlO3dCQUNmLGlCQUFpQjt3QkFDakIsY0FBYzt3QkFDZCxjQUFjO3dCQUNkLGlCQUFpQjt3QkFDakIsZ0JBQWdCO3dCQUNoQixrQkFBa0I7d0JBQ2xCLGdCQUFnQjt3QkFDaEIsWUFBWTt3QkFDWixZQUFZO3dCQUNaLFlBQVk7cUJBQ2IsbUJBRWdCLHVCQUF1QixDQUFDLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFByaW1lTmdGb3Jtc0NvbXBvbmVudCBpcyBhIHN0YW5kYWxvbmUgQW5ndWxhciBjb21wb25lbnQgdGhhdCBkeW5hbWljYWxseSBnZW5lcmF0ZXNcbiAqIGEgZm9ybSBiYXNlZCBvbiB0aGUgcHJvdmlkZWQgY29uZmlndXJhdGlvbi4gSXQgbGV2ZXJhZ2VzIFByaW1lTkcgVUkgY29tcG9uZW50c1xuICogYW5kIEFuZ3VsYXIgUmVhY3RpdmUgRm9ybXMgZm9yIGZvcm0gY3JlYXRpb24gYW5kIHZhbGlkYXRpb24uXG4gKlxuICogQHNlbGVjdG9yIHByaW1lbmctZm9ybXNcbiAqIEBzdGFuZGFsb25lIHRydWVcbiAqIEBpbXBvcnRzIFtcbiAqICAgQ29tbW9uTW9kdWxlLFxuICogICBGb3Jtc01vZHVsZSxcbiAqICAgUmVhY3RpdmVGb3Jtc01vZHVsZSxcbiAqICAgVmFsaWRhdGlvbk1lc3NhZ2VzQ29tcG9uZW50LFxuICogICBJbnB1dFRleHRNb2R1bGUsXG4gKiAgIE11bHRpU2VsZWN0TW9kdWxlLFxuICogICBUZXh0YXJlYU1vZHVsZSxcbiAqICAgQ2hlY2tib3hNb2R1bGUsXG4gKiAgIFJhZGlvQnV0dG9uTW9kdWxlLFxuICogICBEYXRlUGlja2VyTW9kdWxlLFxuICogICBUb2dnbGVCdXR0b25Nb2R1bGUsXG4gKiAgIEZpbGVVcGxvYWRNb2R1bGUsXG4gKiAgIFNsaWRlck1vZHVsZSxcbiAqICAgQnV0dG9uTW9kdWxlLFxuICogICBTZWxlY3RNb2R1bGUsXG4gKiAgIEZpbGVVcGxvYWRWYWx1ZUFjY2Vzc29yXG4gKiBdXG4gKiBAdGVtcGxhdGVVcmwgLi9wcmltZS1mb3JtLmNvbXBvbmVudC5odG1sXG4gKiBAc3R5bGVVcmwgLi9wcmltZS1mb3JtLmNvbXBvbmVudC5jc3NcbiAqIEBjaGFuZ2VEZXRlY3Rpb24gQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoXG4gKlxuICogQHByb3BlcnR5IHtzdHJpbmd9IGZvcm1OYW1lIC0gVGhlIG5hbWUgb2YgdGhlIGZvcm0uXG4gKiBAcHJvcGVydHkge0Zvcm1Db250cm9sQ29uZmlnW119IGNvbnRyb2xzIC0gVGhlIGNvbmZpZ3VyYXRpb24gZm9yIHRoZSBmb3JtIGNvbnRyb2xzLlxuICogQHByb3BlcnR5IHtFdmVudEVtaXR0ZXI8UmVjb3JkPHN0cmluZywgYW55Pj59IGZvcm1TdWJtaXQgLSBFdmVudCBlbWl0dGVyIGZvciBmb3JtIHN1Ym1pc3Npb24uXG4gKiBAcHJvcGVydHkge0Zvcm1Hcm91cH0gZm9ybSAtIFRoZSByZWFjdGl2ZSBmb3JtIGdyb3VwLlxuICogQHByb3BlcnR5IHtCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj59IGZvcm1DaGFuZ2VzJCAtIE9ic2VydmFibGUgdG8gdHJhY2sgZm9ybSBjaGFuZ2VzLlxuICpcbiAqIEBjb25zdHJ1Y3RvclxuICogQHBhcmFtIHtGb3JtQnVpbGRlcn0gZmIgLSBGb3JtQnVpbGRlciBzZXJ2aWNlIHRvIGNyZWF0ZSBmb3JtIGNvbnRyb2xzLlxuICogQHBhcmFtIHtDaGFuZ2VEZXRlY3RvclJlZn0gY2RyIC0gQ2hhbmdlRGV0ZWN0b3JSZWYgdG8gbWFudWFsbHkgdHJpZ2dlciBjaGFuZ2UgZGV0ZWN0aW9uLlxuICpcbiAqIEBtZXRob2QgbmdPbkluaXQgLSBMaWZlY3ljbGUgaG9vayB0aGF0IGluaXRpYWxpemVzIHRoZSBmb3JtLlxuICogQG1ldGhvZCBpbml0aWFsaXplRm9ybSAtIEluaXRpYWxpemVzIHRoZSBmb3JtIGNvbnRyb2xzIGFuZCBzZXRzIHVwIHZhbHVlIGNoYW5nZSBzdWJzY3JpcHRpb25zLlxuICogQG1ldGhvZCBnZXRWYWxpZGF0b3JzIC0gUmV0dXJucyBhbiBhcnJheSBvZiB2YWxpZGF0b3JzIGZvciBhIGdpdmVuIGZvcm0gY29udHJvbCBjb25maWd1cmF0aW9uLlxuICogQHBhcmFtIHtGb3JtQ29udHJvbENvbmZpZ30gY29udHJvbCAtIFRoZSBjb25maWd1cmF0aW9uIGZvciBhIGZvcm0gY29udHJvbC5cbiAqIEByZXR1cm5zIHtWYWxpZGF0b3JGbltdfSAtIEFuIGFycmF5IG9mIHZhbGlkYXRvciBmdW5jdGlvbnMuXG4gKiBAbWV0aG9kIHVwZGF0ZVZhbGlkYXRvcnMgLSBVcGRhdGVzIHRoZSB2YWxpZGF0b3JzIGZvciBhIGZvcm0gY29udHJvbCBiYXNlZCBvbiBpdHMgdmFsdWUuXG4gKiBAcGFyYW0ge0Fic3RyYWN0Q29udHJvbH0gY29udHJvbCAtIFRoZSBmb3JtIGNvbnRyb2wgdG8gdXBkYXRlLlxuICogQHBhcmFtIHthbnl9IHZhbHVlIC0gVGhlIGN1cnJlbnQgdmFsdWUgb2YgdGhlIGZvcm0gY29udHJvbC5cbiAqIEBtZXRob2Qgc2hvdWxkUmVxdWlyZVZhbGlkYXRpb24gLSBEZXRlcm1pbmVzIGlmIGEgZm9ybSBjb250cm9sIHNob3VsZCByZXF1aXJlIHZhbGlkYXRpb24uXG4gKiBAcGFyYW0ge2FueX0gdmFsdWUgLSBUaGUgY3VycmVudCB2YWx1ZSBvZiB0aGUgZm9ybSBjb250cm9sLlxuICogQHJldHVybnMge2Jvb2xlYW59IC0gVHJ1ZSBpZiB2YWxpZGF0aW9uIGlzIHJlcXVpcmVkLCBmYWxzZSBvdGhlcndpc2UuXG4gKiBAbWV0aG9kIG9uRmlsZVNlbGVjdCAtIEhhbmRsZXMgZmlsZSBzZWxlY3Rpb24gZm9yIGZpbGUgdXBsb2FkIGNvbnRyb2xzLlxuICogQHBhcmFtIHthbnl9IGV2ZW50IC0gVGhlIGZpbGUgc2VsZWN0aW9uIGV2ZW50LlxuICogQHBhcmFtIHtzdHJpbmd9IGNvbnRyb2xOYW1lIC0gVGhlIG5hbWUgb2YgdGhlIGZvcm0gY29udHJvbC5cbiAqIEBtZXRob2Qgb25TdWJtaXQgLSBIYW5kbGVzIGZvcm0gc3VibWlzc2lvbiwgdmFsaWRhdGVzIHRoZSBmb3JtLCBhbmQgZW1pdHMgdGhlIGZvcm0gdmFsdWUuXG4gKi9cbmltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSwgQ29tcG9uZW50IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBSZWFjdGl2ZUZvcm1zTW9kdWxlLCBGb3Jtc01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IFZhbGlkYXRpb25NZXNzYWdlc0NvbXBvbmVudCB9IGZyb20gJy4uL3ZhbGlkYXRpb24tbWVzc2FnZXMvdmFsaWRhdGlvbi1tZXNzYWdlcy5jb21wb25lbnQnO1xuaW1wb3J0IHsgSW5wdXRUZXh0TW9kdWxlIH0gZnJvbSAncHJpbWVuZy9pbnB1dHRleHQnO1xuaW1wb3J0IHsgTXVsdGlTZWxlY3RNb2R1bGUgfSBmcm9tICdwcmltZW5nL211bHRpc2VsZWN0JztcbmltcG9ydCB7IFRleHRhcmVhTW9kdWxlIH0gZnJvbSAncHJpbWVuZy90ZXh0YXJlYSc7XG5pbXBvcnQgeyBDaGVja2JveE1vZHVsZSB9IGZyb20gJ3ByaW1lbmcvY2hlY2tib3gnO1xuaW1wb3J0IHsgUmFkaW9CdXR0b25Nb2R1bGUgfSBmcm9tICdwcmltZW5nL3JhZGlvYnV0dG9uJztcbmltcG9ydCB7IFRvZ2dsZUJ1dHRvbk1vZHVsZSB9IGZyb20gJ3ByaW1lbmcvdG9nZ2xlYnV0dG9uJztcbmltcG9ydCB7IEZpbGVVcGxvYWRNb2R1bGUgfSBmcm9tICdwcmltZW5nL2ZpbGV1cGxvYWQnO1xuaW1wb3J0IHsgU2xpZGVyTW9kdWxlIH0gZnJvbSAncHJpbWVuZy9zbGlkZXInO1xuaW1wb3J0IHsgQnV0dG9uTW9kdWxlIH0gZnJvbSAncHJpbWVuZy9idXR0b24nO1xuaW1wb3J0IHsgRGF0ZVBpY2tlck1vZHVsZSB9IGZyb20gJ3ByaW1lbmcvZGF0ZXBpY2tlcic7XG5pbXBvcnQgeyBTZWxlY3RNb2R1bGUgfSBmcm9tICdwcmltZW5nL3NlbGVjdCc7XG5pbXBvcnQgeyBCYXNlRm9ybXNDb21wb25lbnQgfSBmcm9tICcuLi9iYXNlLmNvbXBvbmVudCc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3ByaW1lbmctZm9ybXMnLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbXG4gICAgQmFzZUZvcm1zQ29tcG9uZW50LFxuICAgIENvbW1vbk1vZHVsZSxcbiAgICBGb3Jtc01vZHVsZSxcbiAgICBSZWFjdGl2ZUZvcm1zTW9kdWxlLFxuICAgIFZhbGlkYXRpb25NZXNzYWdlc0NvbXBvbmVudCxcbiAgICBJbnB1dFRleHRNb2R1bGUsXG4gICAgTXVsdGlTZWxlY3RNb2R1bGUsXG4gICAgVGV4dGFyZWFNb2R1bGUsXG4gICAgQ2hlY2tib3hNb2R1bGUsXG4gICAgUmFkaW9CdXR0b25Nb2R1bGUsXG4gICAgRGF0ZVBpY2tlck1vZHVsZSxcbiAgICBUb2dnbGVCdXR0b25Nb2R1bGUsXG4gICAgRmlsZVVwbG9hZE1vZHVsZSxcbiAgICBTbGlkZXJNb2R1bGUsXG4gICAgQnV0dG9uTW9kdWxlLFxuICAgIFNlbGVjdE1vZHVsZSxcbiAgXSxcbiAgdGVtcGxhdGVVcmw6ICcuL3ByaW1lLWZvcm0uY29tcG9uZW50Lmh0bWwnLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbn0pXG5leHBvcnQgY2xhc3MgUHJpbWVOZ0Zvcm1zQ29tcG9uZW50IGV4dGVuZHMgQmFzZUZvcm1zQ29tcG9uZW50IHtcbiAgb25GaWxlU2VsZWN0KGV2ZW50OiBhbnksIGNvbnRyb2xOYW1lOiBzdHJpbmcpIHtcbiAgICBjb25zdCBmaWxlID0gZXZlbnQuZmlsZXNbMF07XG4gICAgaWYgKGZpbGUpIHtcbiAgICAgIHRoaXMuZm9ybS5nZXQoY29udHJvbE5hbWUpPy5zZXRWYWx1ZShmaWxlKTtcbiAgICAgIHRoaXMuZm9ybS5nZXQoY29udHJvbE5hbWUpPy51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KCk7XG5cbiAgICAgIGNvbnN0IGNvbnRyb2xDb25maWcgPSB0aGlzLmNvbnRyb2xzKCkuZmluZChcbiAgICAgICAgKGNvbnRyb2wpID0+IGNvbnRyb2wubmFtZSA9PT0gY29udHJvbE5hbWVcbiAgICAgICk7XG4gICAgICBpZiAoY29udHJvbENvbmZpZz8uZXZlbnRzPy5vblVwbG9hZCkge1xuICAgICAgICBjb250cm9sQ29uZmlnLmV2ZW50cy5vblVwbG9hZChldmVudCk7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG4iLCI8Zm9ybSBbZm9ybUdyb3VwXT1cImZvcm1cIiBbYXR0ci5uYW1lXT1cImZvcm1OYW1lKClcIiAobmdTdWJtaXQpPVwib25TdWJtaXQoKVwiPlxuICBAZm9yIChjb250cm9sIG9mIGNvbnRyb2xzKCk7IHRyYWNrICRpbmRleCkge1xuICAgIEBpZiAoY29udHJvbC51aUZyYW1ld29yayA9PT0gXCJwcmltZW5nXCIgfHwgIWNvbnRyb2wudWlGcmFtZXdvcmspIHtcbiAgICAgIEBpZiAoZm9ybS5nZXQoY29udHJvbC5uYW1lKSkge1xuICAgICAgICA8c2VjdGlvbiBbbmdDbGFzc109XCJjb250cm9sLmNsYXNzXCIgW25nU3R5bGVdPVwiY29udHJvbC5zdHlsZVwiPlxuICAgICAgICAgIEBpZiAoY29udHJvbC5sYWJlbCkge1xuICAgICAgICAgICAgPGxhYmVsXG4gICAgICAgICAgICAgIFthdHRyLmZvcl09XCJjb250cm9sLm5hbWVcIlxuICAgICAgICAgICAgICBbbmdDbGFzc109XCJjb250cm9sLmxhYmVsQ2xhc3NcIlxuICAgICAgICAgICAgICBbbmdTdHlsZV09XCJjb250cm9sLmxhYmVsU3R5bGVcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICB7eyBjb250cm9sLmxhYmVsIH19XG4gICAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgIH1cblxuICAgICAgICAgIEBzd2l0Y2ggKGNvbnRyb2wudHlwZSkge1xuICAgICAgICAgICAgQGNhc2UgKFwidGV4dFwiKSB7XG4gICAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAgIHBJbnB1dFRleHRcbiAgICAgICAgICAgICAgICBbZm9ybUNvbnRyb2xOYW1lXT1cImNvbnRyb2wubmFtZVwiXG4gICAgICAgICAgICAgICAgW2lkXT1cImNvbnRyb2wubmFtZVwiXG4gICAgICAgICAgICAgICAgKGNoYW5nZSk9XCJjb250cm9sLmV2ZW50cz8ub25DaGFuZ2U/LigkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAoZm9jdXMpPVwiY29udHJvbC5ldmVudHM/Lm9uRm9jdXM/LigkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAoYmx1cik9XCJjb250cm9sLmV2ZW50cz8ub25CbHVyPy4oJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgKGtleXVwKT1cImNvbnRyb2wuZXZlbnRzPy5vbktleVVwPy4oJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgKGtleWRvd24pPVwiY29udHJvbC5ldmVudHM/Lm9uS2V5RG93bj8uKCRldmVudClcIlxuICAgICAgICAgICAgICAgIChwYXN0ZSk9XCJjb250cm9sLmV2ZW50cz8ub25QYXN0ZT8uKCRldmVudClcIlxuICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgQGNhc2UgKFwibnVtYmVyXCIpIHtcbiAgICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgICAgcElucHV0VGV4dFxuICAgICAgICAgICAgICAgIHR5cGU9XCJudW1iZXJcIlxuICAgICAgICAgICAgICAgIFtmb3JtQ29udHJvbE5hbWVdPVwiY29udHJvbC5uYW1lXCJcbiAgICAgICAgICAgICAgICBbaWRdPVwiY29udHJvbC5uYW1lXCJcbiAgICAgICAgICAgICAgICAoY2hhbmdlKT1cImNvbnRyb2wuZXZlbnRzPy5vbkNoYW5nZT8uKCRldmVudClcIlxuICAgICAgICAgICAgICAgIChmb2N1cyk9XCJjb250cm9sLmV2ZW50cz8ub25Gb2N1cz8uKCRldmVudClcIlxuICAgICAgICAgICAgICAgIChibHVyKT1cImNvbnRyb2wuZXZlbnRzPy5vbkJsdXI/LigkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAoa2V5dXApPVwiY29udHJvbC5ldmVudHM/Lm9uS2V5VXA/LigkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAoa2V5ZG93bik9XCJjb250cm9sLmV2ZW50cz8ub25LZXlEb3duPy4oJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgKHBhc3RlKT1cImNvbnRyb2wuZXZlbnRzPy5vblBhc3RlPy4oJGV2ZW50KVwiXG4gICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBAY2FzZSAoXCJwYXNzd29yZFwiKSB7XG4gICAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAgIHBJbnB1dFRleHRcbiAgICAgICAgICAgICAgICB0eXBlPVwicGFzc3dvcmRcIlxuICAgICAgICAgICAgICAgIFtmb3JtQ29udHJvbE5hbWVdPVwiY29udHJvbC5uYW1lXCJcbiAgICAgICAgICAgICAgICBbaWRdPVwiY29udHJvbC5uYW1lXCJcbiAgICAgICAgICAgICAgICAoY2hhbmdlKT1cImNvbnRyb2wuZXZlbnRzPy5vbkNoYW5nZT8uKCRldmVudClcIlxuICAgICAgICAgICAgICAgIChmb2N1cyk9XCJjb250cm9sLmV2ZW50cz8ub25Gb2N1cz8uKCRldmVudClcIlxuICAgICAgICAgICAgICAgIChibHVyKT1cImNvbnRyb2wuZXZlbnRzPy5vbkJsdXI/LigkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAoa2V5dXApPVwiY29udHJvbC5ldmVudHM/Lm9uS2V5VXA/LigkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAoa2V5ZG93bik9XCJjb250cm9sLmV2ZW50cz8ub25LZXlEb3duPy4oJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgKHBhc3RlKT1cImNvbnRyb2wuZXZlbnRzPy5vblBhc3RlPy4oJGV2ZW50KVwiXG4gICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBAY2FzZSAoXCJlbWFpbFwiKSB7XG4gICAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAgIHBJbnB1dFRleHRcbiAgICAgICAgICAgICAgICB0eXBlPVwiZW1haWxcIlxuICAgICAgICAgICAgICAgIFtmb3JtQ29udHJvbE5hbWVdPVwiY29udHJvbC5uYW1lXCJcbiAgICAgICAgICAgICAgICBbaWRdPVwiY29udHJvbC5uYW1lXCJcbiAgICAgICAgICAgICAgICAoY2hhbmdlKT1cImNvbnRyb2wuZXZlbnRzPy5vbkNoYW5nZT8uKCRldmVudClcIlxuICAgICAgICAgICAgICAgIChmb2N1cyk9XCJjb250cm9sLmV2ZW50cz8ub25Gb2N1cz8uKCRldmVudClcIlxuICAgICAgICAgICAgICAgIChibHVyKT1cImNvbnRyb2wuZXZlbnRzPy5vbkJsdXI/LigkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAoa2V5dXApPVwiY29udHJvbC5ldmVudHM/Lm9uS2V5VXA/LigkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAoa2V5ZG93bik9XCJjb250cm9sLmV2ZW50cz8ub25LZXlEb3duPy4oJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgKHBhc3RlKT1cImNvbnRyb2wuZXZlbnRzPy5vblBhc3RlPy4oJGV2ZW50KVwiXG4gICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBAY2FzZSAoXCJzZWxlY3RcIikge1xuICAgICAgICAgICAgICA8cC1zZWxlY3RcbiAgICAgICAgICAgICAgICBbb3B0aW9uc109XCJjb250cm9sLm9wdGlvbnNcIlxuICAgICAgICAgICAgICAgIFtmb3JtQ29udHJvbE5hbWVdPVwiY29udHJvbC5uYW1lXCJcbiAgICAgICAgICAgICAgICAob25DaGFuZ2UpPVwiY29udHJvbC5ldmVudHM/Lm9uQ2hhbmdlPy4oJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgKG9uRm9jdXMpPVwiY29udHJvbC5ldmVudHM/Lm9uRm9jdXM/LigkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAob25CbHVyKT1cImNvbnRyb2wuZXZlbnRzPy5vbkJsdXI/LigkZXZlbnQpXCJcbiAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIEBjYXNlIChcIm11bHRpLXNlbGVjdFwiKSB7XG4gICAgICAgICAgICAgIDxwLW11bHRpU2VsZWN0XG4gICAgICAgICAgICAgICAgW29wdGlvbnNdPVwiY29udHJvbC5vcHRpb25zXCJcbiAgICAgICAgICAgICAgICBbZm9ybUNvbnRyb2xOYW1lXT1cImNvbnRyb2wubmFtZVwiXG4gICAgICAgICAgICAgICAgKG9uQ2hhbmdlKT1cImNvbnRyb2wuZXZlbnRzPy5vbkNoYW5nZT8uKCRldmVudClcIlxuICAgICAgICAgICAgICAgIChvbkZvY3VzKT1cImNvbnRyb2wuZXZlbnRzPy5vbkZvY3VzPy4oJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgKG9uQmx1cik9XCJjb250cm9sLmV2ZW50cz8ub25CbHVyPy4oJGV2ZW50KVwiXG4gICAgICAgICAgICAgID48L3AtbXVsdGlTZWxlY3Q+XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBAY2FzZSAoXCJ0ZXh0YXJlYVwiKSB7XG4gICAgICAgICAgICAgIDx0ZXh0YXJlYVxuICAgICAgICAgICAgICAgIHBUZXh0YXJlYVxuICAgICAgICAgICAgICAgIFtmb3JtQ29udHJvbE5hbWVdPVwiY29udHJvbC5uYW1lXCJcbiAgICAgICAgICAgICAgICBbaWRdPVwiY29udHJvbC5uYW1lXCJcbiAgICAgICAgICAgICAgICAoY2hhbmdlKT1cImNvbnRyb2wuZXZlbnRzPy5vbkNoYW5nZT8uKCRldmVudClcIlxuICAgICAgICAgICAgICAgIChmb2N1cyk9XCJjb250cm9sLmV2ZW50cz8ub25Gb2N1cz8uKCRldmVudClcIlxuICAgICAgICAgICAgICAgIChibHVyKT1cImNvbnRyb2wuZXZlbnRzPy5vbkJsdXI/LigkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAoa2V5dXApPVwiY29udHJvbC5ldmVudHM/Lm9uS2V5VXA/LigkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAoa2V5ZG93bik9XCJjb250cm9sLmV2ZW50cz8ub25LZXlEb3duPy4oJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgKHBhc3RlKT1cImNvbnRyb2wuZXZlbnRzPy5vblBhc3RlPy4oJGV2ZW50KVwiXG4gICAgICAgICAgICAgID48L3RleHRhcmVhPlxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgQGNhc2UgKFwiY2hlY2tib3hcIikge1xuICAgICAgICAgICAgICA8cC1jaGVja2JveFxuICAgICAgICAgICAgICAgIFtiaW5hcnldPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgW2Zvcm1Db250cm9sTmFtZV09XCJjb250cm9sLm5hbWVcIlxuICAgICAgICAgICAgICAgIChvbkNoYW5nZSk9XCJjb250cm9sLmV2ZW50cz8ub25DaGFuZ2U/LigkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAob25Gb2N1cyk9XCJjb250cm9sLmV2ZW50cz8ub25Gb2N1cz8uKCRldmVudClcIlxuICAgICAgICAgICAgICAgIChvbkJsdXIpPVwiY29udHJvbC5ldmVudHM/Lm9uQmx1cj8uKCRldmVudClcIlxuICAgICAgICAgICAgICA+PC9wLWNoZWNrYm94PlxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgQGNhc2UgKFwicmFkaW9cIikge1xuICAgICAgICAgICAgICBAZm9yIChvcHRpb24gb2YgY29udHJvbC5vcHRpb25zID8/IFtdOyB0cmFjayAkaW5kZXgpIHtcbiAgICAgICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICAgICAgPHAtcmFkaW9CdXR0b25cbiAgICAgICAgICAgICAgICAgICAgW25hbWVdPVwiY29udHJvbC5uYW1lXCJcbiAgICAgICAgICAgICAgICAgICAgW2Zvcm1Db250cm9sTmFtZV09XCJjb250cm9sLm5hbWVcIlxuICAgICAgICAgICAgICAgICAgICBbdmFsdWVdPVwib3B0aW9uXCJcbiAgICAgICAgICAgICAgICAgICAgW2lucHV0SWRdPVwiJ3JhZGlvLScgKyBvcHRpb25cIlxuICAgICAgICAgICAgICAgICAgICAob25DaGFuZ2UpPVwiY29udHJvbC5ldmVudHM/Lm9uQ2hhbmdlPy4oJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgIChvbkZvY3VzKT1cImNvbnRyb2wuZXZlbnRzPy5vbkZvY3VzPy4oJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgIChvbkJsdXIpPVwiY29udHJvbC5ldmVudHM/Lm9uQmx1cj8uKCRldmVudClcIlxuICAgICAgICAgICAgICAgICAgPjwvcC1yYWRpb0J1dHRvbj5cbiAgICAgICAgICAgICAgICAgIDxsYWJlbCBbZm9yXT1cIidyYWRpby0nICsgb3B0aW9uXCI+e3sgb3B0aW9uIH19PC9sYWJlbD5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgQGNhc2UgKFwiZGF0ZVwiKSB7XG4gICAgICAgICAgICAgIDxwLWRhdGVwaWNrZXJcbiAgICAgICAgICAgICAgICBbZm9ybUNvbnRyb2xOYW1lXT1cImNvbnRyb2wubmFtZVwiXG4gICAgICAgICAgICAgICAgKG9uU2VsZWN0KT1cImNvbnRyb2wuZXZlbnRzPy5vblNlbGVjdD8uKCRldmVudClcIlxuICAgICAgICAgICAgICAgIChvbkZvY3VzKT1cImNvbnRyb2wuZXZlbnRzPy5vbkZvY3VzPy4oJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgKG9uQmx1cik9XCJjb250cm9sLmV2ZW50cz8ub25CbHVyPy4oJGV2ZW50KVwiXG4gICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBAY2FzZSAoXCJ0b2dnbGVcIikge1xuICAgICAgICAgICAgICA8cC10b2dnbGVCdXR0b25cbiAgICAgICAgICAgICAgICBbZm9ybUNvbnRyb2xOYW1lXT1cImNvbnRyb2wubmFtZVwiXG4gICAgICAgICAgICAgICAgKG9uQ2hhbmdlKT1cImNvbnRyb2wuZXZlbnRzPy5vbkNoYW5nZT8uKCRldmVudClcIlxuICAgICAgICAgICAgICAgIChvbkZvY3VzKT1cImNvbnRyb2wuZXZlbnRzPy5vbkZvY3VzPy4oJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgKG9uQmx1cik9XCJjb250cm9sLmV2ZW50cz8ub25CbHVyPy4oJGV2ZW50KVwiXG4gICAgICAgICAgICAgID48L3AtdG9nZ2xlQnV0dG9uPlxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgPCEtLSBAY2FzZSAoXCJmaWxlXCIpIHtcb