UNPKG

@koalarx/ui

Version:

Koala UI is a Design System developed in Angular whose objective is to facilitate and make your development faster and simpler, making this framework your greatest ally.

212 lines 33.9 kB
import { Injectable } from '@angular/core'; import { DynamicFormTypeFieldEnum } from './enums/dynamic-form-type-field.enum'; import { Validators } from '@angular/forms'; import { BehaviorSubject, Observable } from 'rxjs'; import { DynamicFormBuilder } from "./builder/dynamic-form.builder"; import { koala } from "@koalarx/utils"; import { DateMinValidator } from "./validators/date-min.validator"; import { DateMaxValidator } from "./validators/date-max.validator"; import { unmaskCoin } from "@koalarx/utils/operators/string"; import * as i0 from "@angular/core"; import * as i1 from "@angular/forms"; import * as i2 from "ngx-device-detector"; export class KoalaDynamicFormService { constructor(fb, deviceService) { this.fb = fb; this.deviceService = deviceService; } build() { return new DynamicFormBuilder(this.fb, this.deviceService); } updateValidator(formGroup, name, type, value) { if (type === 'required' && typeof value !== 'boolean') { throw new Error(`Type required cannot be a ${typeof value}`); } else if ((type === 'min' || type === 'max') && typeof value === "boolean") { throw new Error(`Type ${type} cannot be a boolean`); } const formArray = formGroup.get('formData'); const control = formArray.controls.find(control => control.get('name').value === name); if (control) { const currentMin = control.get('min').value; const currentMax = control.get('max').value; const validators = []; control.get('value').clearValidators(); control.get('value').setErrors(null); if (type === "required" && value) { validators.push(Validators.required); control.get('value').setErrors({ required: true }); } if ((type === "min" || currentMin)) { if (typeof value === "number") { validators.push(Validators.min((type === "min" ? value : currentMin))); control.get('value').setErrors({ min: true }); } else if (typeof value === "string") { validators.push(DateMinValidator((type === "min" ? value : currentMin))); control.get('value').setErrors({ dateMin: true }); } } if ((type === "max" || currentMax)) { if (typeof value === "number") { validators.push(Validators.max((type === "max" ? value : currentMax))); control.get('value').setErrors({ max: true }); } else if (typeof value === "string") { validators.push(DateMaxValidator((type === "max" ? value : currentMax))); control.get('value').setErrors({ dateMax: true }); } } if (type === "required") { control.get('required').setValue(value); } else if (type === "min") { control.get('min').setValue(value); } else if (type === "max") { control.get('max').setValue(value); } control.get('value').setValidators(validators); control.get('value').updateValueAndValidity(); } } disableFields(formGroup, disabled, fields) { const formArray = formGroup.get('formData'); fields.forEach(field => { const controlValue = formArray.controls.find(control => field === control.get('name').value)?.get('value'); if (controlValue && disabled) { controlValue.disable(); } else if (controlValue && !disabled) { controlValue.enable(); } const controlDisabled = formArray.controls.find(control => field === control.get('name').value)?.get('disabled'); controlDisabled.setValue(disabled); }); } emitData(form) { const data = {}; const formArray = form.get('formData'); formArray?.controls.forEach(control => { if (control.get('show').value.getValue() !== false) { let value = control.get('value').value; if (control.get('type').value === DynamicFormTypeFieldEnum.valueList) { if (value === null || value === undefined) { value = ''; } value = koala(value).string().split().getValue(); } else if (control.get('type').value === DynamicFormTypeFieldEnum.moreItems) { const moreItems = control.get('moreItemsConfig').value; value = []; moreItems.forEach(item => { value.push(this.emitData(item.form)); }); } else if (control.get('type').value === DynamicFormTypeFieldEnum.autocomplete) { if (control.get('multiple').value) { const options = control.get('autocompleteSelectedValue').value; value = options?.map(item => item?.value); } else { value = (control.get('autocompleteSelectedValue').value?.value ? control.get('autocompleteSelectedValue').value.value : control.get('autocompleteSelectedValue').value); } } else if (control.get('type').value === DynamicFormTypeFieldEnum.dynamicForm) { const dynamicFormConfig = control.get('dynamicFormConfig').value; value = this.emitData(dynamicFormConfig.getValue().form); } else if (control.get('type').value === DynamicFormTypeFieldEnum.number) { value = parseInt(value); } else if ((control.get('type').value === DynamicFormTypeFieldEnum.float || control.get('type').value === DynamicFormTypeFieldEnum.percent) && typeof value === "string") { value = parseFloat(value.replace(/,/g, '.')); } else if (control.get('type').value === DynamicFormTypeFieldEnum.coin && typeof value === "string") { value = unmaskCoin(value); } data[control.get('name').value] = value; } }); return data; } resetForm(form) { const formArray = form.get('formData'); formArray.controls.forEach(control => { if (control.get('type').value === DynamicFormTypeFieldEnum.moreItems) { control.get('moreItemsConfig').setValue([]); } else { control.get('value').reset(); } }); } setValuesInMoreItemsForm(subject, values) { const valuesMoreItems = []; values.forEach(itemValue => { valuesMoreItems.push(new BehaviorSubject(itemValue)); }); subject.next(valuesMoreItems); } autocompleteFilterOnServer(request, nameConfig, indexNameByValue) { return new Observable(observe => { request().then(response => { const options = []; response.forEach(item => { let value = ''; if (indexNameByValue?.indexOf(' > ') >= 0) { value = this.getValueByStringPath(indexNameByValue, item); } else if (indexNameByValue) { value = item[indexNameByValue]; } else { value = item; } options.push({ name: koala(item).object().toString(nameConfig.propsByName, (nameConfig.delimiter ?? ' ')).getValue(), value }); }); observe.next(options); }); }); } showFields(subject, names, show, clearCurrentValue = false) { const fields = []; names.forEach(name => { fields.push({ name, show, clearCurrentValue }); }); subject.next(fields); } getValueByStringPath(indexNameByValue, item) { let value; const partsIndex = indexNameByValue.split(' > '); let partIndex = 0; do { if (!value) { value = item[partsIndex[partIndex]]; } else { value = value[partsIndex[partIndex]]; } partIndex++; } while (partIndex < partsIndex.length); return value; } } KoalaDynamicFormService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: KoalaDynamicFormService, deps: [{ token: i1.UntypedFormBuilder }, { token: i2.DeviceDetectorService }], target: i0.ɵɵFactoryTarget.Injectable }); KoalaDynamicFormService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: KoalaDynamicFormService, providedIn: "any" }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: KoalaDynamicFormService, decorators: [{ type: Injectable, args: [{ providedIn: "any" }] }], ctorParameters: function () { return [{ type: i1.UntypedFormBuilder }, { type: i2.DeviceDetectorService }]; } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoia29hbGEuZHluYW1pYy1mb3JtLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9mb3JtL3NyYy9saWIvZHluYW1pYy1mb3JtL2tvYWxhLmR5bmFtaWMtZm9ybS5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDM0MsT0FBTyxFQUFFLHdCQUF3QixFQUFFLE1BQU0sc0NBQXNDLENBQUM7QUFDaEYsT0FBTyxFQUEwRCxVQUFVLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUVwRyxPQUFPLEVBQUUsZUFBZSxFQUFFLFVBQVUsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUluRCxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUNwRSxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDdkMsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFDbkUsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFFbkUsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGlDQUFpQyxDQUFDOzs7O0FBSzdELE1BQU0sT0FBTyx1QkFBdUI7SUFFbEMsWUFDWSxFQUFzQixFQUN0QixhQUFvQztRQURwQyxPQUFFLEdBQUYsRUFBRSxDQUFvQjtRQUN0QixrQkFBYSxHQUFiLGFBQWEsQ0FBdUI7SUFDaEQsQ0FBQztJQUVNLEtBQUs7UUFDVixPQUFPLElBQUksa0JBQWtCLENBQUMsSUFBSSxDQUFDLEVBQUUsRUFBRSxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUM7SUFDN0QsQ0FBQztJQUVNLGVBQWUsQ0FBQyxTQUEyQixFQUFFLElBQVksRUFBRSxJQUFtQyxFQUFFLEtBQWdDO1FBQ3JJLElBQUksSUFBSSxLQUFLLFVBQVUsSUFBSSxPQUFPLEtBQUssS0FBSyxT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QzlELElBQUksS0FBSyxDQUFDO1FBQ1YsTUFBTSxVQUFVLEdBQUcsZ0JBQWdCLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ2pELElBQUksU0FBUyxHQUFHLENBQUMsQ0FBQztRQUNsQixHQUFHO1lBQ0QsSUFBSSxDQUFDLEtBQUssRUFBRTtnQkFDVixLQUFLLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDO2FBQ3JDO2lCQUFNO2dCQUNMLEtBQUssR0FBRyxLQUFLLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUM7YUFDdEM7WUFDRCxTQUFTLEVBQUUsQ0FBQztTQUNiLFFBQVEsU0FBUyxHQUFHLFVBQVUsQ0FBQyxNQUFNLEVBQUU7UUFFeEMsT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDOztvSEEzTlUsdUJBQXVCO3dIQUF2Qix1QkFBdUIsY0FEWCxLQUFLOzJGQUNqQix1QkFBdUI7a0JBRG5DLFVBQVU7bUJBQUMsRUFBQyxVQUFVLEVBQUUsS0FBSyxFQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgRHluYW1pY0Zvcm1UeXBlRmllbGRFbnVtIH0gZnJvbSAnLi9lbnVtcy9keW5hbWljLWZvcm0tdHlwZS1maWVsZC5lbnVtJztcbmltcG9ydCB7IFVudHlwZWRGb3JtQXJyYXksIFVudHlwZWRGb3JtQnVpbGRlciwgVW50eXBlZEZvcm1Hcm91cCwgVmFsaWRhdG9ycyB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IEtvYWxhRHluYW1pY1NldFZhbHVlSW50ZXJmYWNlIH0gZnJvbSAnLi9pbnRlcmZhY2VzL2tvYWxhLmR5bmFtaWMtc2V0LXZhbHVlLmludGVyZmFjZSc7XG5pbXBvcnQgeyBCZWhhdmlvclN1YmplY3QsIE9ic2VydmFibGUgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IEtvYWxhRHluYW1pY0F1dG9jb21wbGV0ZU9wdGlvbnNJbnRlcmZhY2UgfSBmcm9tICcuL2ludGVyZmFjZXMva29hbGEuZHluYW1pYy1hdXRvY29tcGxldGUtb3B0aW9ucy5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgS29hbGFEeW5hbWljRm9ybVNob3dGaWVsZEludGVyZmFjZSB9IGZyb20gJy4vaW50ZXJmYWNlcy9rb2FsYS5keW5hbWljLWZvcm0tc2hvdy1maWVsZC5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgS29hbGFEeW5hbWljRm9ybUNvbmZpZ0ludGVyZmFjZSB9IGZyb20gJy4vaW50ZXJmYWNlcy9rb2FsYS5keW5hbWljLWZvcm0tY29uZmlnLmludGVyZmFjZSc7XG5pbXBvcnQgeyBEeW5hbWljRm9ybUJ1aWxkZXIgfSBmcm9tIFwiLi9idWlsZGVyL2R5bmFtaWMtZm9ybS5idWlsZGVyXCI7XG5pbXBvcnQgeyBrb2FsYSB9IGZyb20gXCJAa29hbGFyeC91dGlsc1wiO1xuaW1wb3J0IHsgRGF0ZU1pblZhbGlkYXRvciB9IGZyb20gXCIuL3ZhbGlkYXRvcnMvZGF0ZS1taW4udmFsaWRhdG9yXCI7XG5pbXBvcnQgeyBEYXRlTWF4VmFsaWRhdG9yIH0gZnJvbSBcIi4vdmFsaWRhdG9ycy9kYXRlLW1heC52YWxpZGF0b3JcIjtcbmltcG9ydCB7IERldmljZURldGVjdG9yU2VydmljZSB9IGZyb20gXCJuZ3gtZGV2aWNlLWRldGVjdG9yXCI7XG5pbXBvcnQgeyB1bm1hc2tDb2luIH0gZnJvbSBcIkBrb2FsYXJ4L3V0aWxzL29wZXJhdG9ycy9zdHJpbmdcIjtcblxuZXhwb3J0IHR5cGUgS29hbGFEeW5hbWljRm9ybVZhbGlkYXRvclR5cGUgPSAncmVxdWlyZWQnIHwgJ21pbicgfCAnbWF4JztcblxuQEluamVjdGFibGUoe3Byb3ZpZGVkSW46IFwiYW55XCJ9KVxuZXhwb3J0IGNsYXNzIEtvYWxhRHluYW1pY0Zvcm1TZXJ2aWNlIHtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcm90ZWN0ZWQgZmI6IFVudHlwZWRGb3JtQnVpbGRlcixcbiAgICBwcm90ZWN0ZWQgZGV2aWNlU2VydmljZTogRGV2aWNlRGV0ZWN0b3JTZXJ2aWNlKSB7XG4gIH1cblxuICBwdWJsaWMgYnVpbGQoKSB7XG4gICAgcmV0dXJuIG5ldyBEeW5hbWljRm9ybUJ1aWxkZXIodGhpcy5mYiwgdGhpcy5kZXZpY2VTZXJ2aWNlKTtcbiAgfVxuXG4gIHB1YmxpYyB1cGRhdGVWYWxpZGF0b3IoZm9ybUdyb3VwOiBVbnR5cGVkRm9ybUdyb3VwLCBuYW1lOiBzdHJpbmcsIHR5cGU6IEtvYWxhRHluYW1pY0Zvcm1WYWxpZGF0b3JUeXBlLCB2YWx1ZTogYm9vbGVhbiB8IG51bWJlciB8IHN0cmluZykge1xuICAgIGlmICh0eXBlID09PSAncmVxdWlyZWQnICYmIHR5cGVvZiB2YWx1ZSAhPT0gJ2Jvb2xlYW4nKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFR5cGUgcmVxdWlyZWQgY2Fubm90IGJlIGEgJHt0eXBlb2YgdmFsdWV9YCk7XG4gICAgfSBlbHNlIGlmICgodHlwZSA9PT0gJ21pbicgfHwgdHlwZSA9PT0gJ21heCcpICYmIHR5cGVvZiB2YWx1ZSA9PT0gXCJib29sZWFuXCIpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgVHlwZSAke3R5cGV9IGNhbm5vdCBiZSBhIGJvb2xlYW5gKTtcbiAgICB9XG5cbiAgICBjb25zdCBmb3JtQXJyYXkgPSBmb3JtR3JvdXAuZ2V0KCdmb3JtRGF0YScpIGFzIFVudHlwZWRGb3JtQXJyYXk7XG4gICAgY29uc3QgY29udHJvbCA9IGZvcm1BcnJheS5jb250cm9scy5maW5kKGNvbnRyb2wgPT4gY29udHJvbC5nZXQoJ25hbWUnKS52YWx1ZSA9PT0gbmFtZSk7XG5cbiAgICBpZiAoY29udHJvbCkge1xuICAgICAgY29uc3QgY3VycmVudE1pbiA9IGNvbnRyb2wuZ2V0KCdtaW4nKS52YWx1ZTtcbiAgICAgIGNvbnN0IGN1cnJlbnRNYXggPSBjb250cm9sLmdldCgnbWF4JykudmFsdWU7XG4gICAgICBjb25zdCB2YWxpZGF0b3JzID0gW107XG5cbiAgICAgIGNvbnRyb2wuZ2V0KCd2YWx1ZScpLmNsZWFyVmFsaWRhdG9ycygpO1xuICAgICAgY29udHJvbC5nZXQoJ3ZhbHVlJykuc2V0RXJyb3JzKG51bGwpO1xuXG4gICAgICBpZiAodHlwZSA9PT0gXCJyZXF1aXJlZFwiICYmIHZhbHVlKSB7XG4gICAgICAgIHZhbGlkYXRvcnMucHVzaChWYWxpZGF0b3JzLnJlcXVpcmVkKTtcbiAgICAgICAgY29udHJvbC5nZXQoJ3ZhbHVlJykuc2V0RXJyb3JzKHtyZXF1aXJlZDogdHJ1ZX0pO1xuICAgICAgfVxuICAgICAgaWYgKCh0eXBlID09PSBcIm1pblwiIHx8IGN1cnJlbnRNaW4pKSB7XG4gICAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09IFwibnVtYmVyXCIpIHtcbiAgICAgICAgICB2YWxpZGF0b3JzLnB1c2goVmFsaWRhdG9ycy5taW4oKHR5cGUgPT09IFwibWluXCIgPyB2YWx1ZSA6IGN1cnJlbnRNaW4pKSk7XG4gICAgICAgICAgY29udHJvbC5nZXQoJ3ZhbHVlJykuc2V0RXJyb3JzKHttaW46IHRydWV9KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICh0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICB2YWxpZGF0b3JzLnB1c2goRGF0ZU1pblZhbGlkYXRvcigodHlwZSA9PT0gXCJtaW5cIiA/IHZhbHVlIDogY3VycmVudE1pbikpKTtcbiAgICAgICAgICBjb250cm9sLmdldCgndmFsdWUnKS5zZXRFcnJvcnMoe2RhdGVNaW46IHRydWV9KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKCh0eXBlID09PSBcIm1heFwiIHx8IGN1cnJlbnRNYXgpKSB7XG4gICAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09IFwibnVtYmVyXCIpIHtcbiAgICAgICAgICB2YWxpZGF0b3JzLnB1c2goVmFsaWRhdG9ycy5tYXgoKHR5cGUgPT09IFwibWF4XCIgPyB2YWx1ZSA6IGN1cnJlbnRNYXgpKSk7XG4gICAgICAgICAgY29udHJvbC5nZXQoJ3ZhbHVlJykuc2V0RXJyb3JzKHttYXg6IHRydWV9KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICh0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICB2YWxpZGF0b3JzLnB1c2goRGF0ZU1heFZhbGlkYXRvcigodHlwZSA9PT0gXCJtYXhcIiA/IHZhbHVlIDogY3VycmVudE1heCkpKTtcbiAgICAgICAgICBjb250cm9sLmdldCgndmFsdWUnKS5zZXRFcnJvcnMoe2RhdGVNYXg6IHRydWV9KTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAodHlwZSA9PT0gXCJyZXF1aXJlZFwiKSB7XG4gICAgICAgIGNvbnRyb2wuZ2V0KCdyZXF1aXJlZCcpLnNldFZhbHVlKHZhbHVlKTtcbiAgICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gXCJtaW5cIikge1xuICAgICAgICBjb250cm9sLmdldCgnbWluJykuc2V0VmFsdWUodmFsdWUpO1xuICAgICAgfSBlbHNlIGlmICh0eXBlID09PSBcIm1heFwiKSB7XG4gICAgICAgIGNvbnRyb2wuZ2V0KCdtYXgnKS5zZXRWYWx1ZSh2YWx1ZSk7XG4gICAgICB9XG4gICAgICBjb250cm9sLmdldCgndmFsdWUnKS5zZXRWYWxpZGF0b3JzKHZhbGlkYXRvcnMpO1xuICAgICAgY29udHJvbC5nZXQoJ3ZhbHVlJykudXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBkaXNhYmxlRmllbGRzKGZvcm1Hcm91cDogVW50eXBlZEZvcm1Hcm91cCwgZGlzYWJsZWQ6IGJvb2xlYW4sIGZpZWxkczogc3RyaW5nW10pIHtcbiAgICBjb25zdCBmb3JtQXJyYXkgPSBmb3JtR3JvdXAuZ2V0KCdmb3JtRGF0YScpIGFzIFVudHlwZWRGb3JtQXJyYXk7XG5cbiAgICBmaWVsZHMuZm9yRWFjaChmaWVsZCA9PiB7XG4gICAgICBjb25zdCBjb250cm9sVmFsdWUgPSBmb3JtQXJyYXkuY29udHJvbHMuZmluZChjb250cm9sID0+IGZpZWxkID09PSBjb250cm9sLmdldCgnbmFtZScpLnZhbHVlKT8uZ2V0KCd2YWx1ZScpO1xuXG4gICAgICBpZiAoY29udHJvbFZhbHVlICYmIGRpc2FibGVkKSB7XG4gICAgICAgIGNvbnRyb2xWYWx1ZS5kaXNhYmxlKCk7XG4gICAgICB9IGVsc2UgaWYgKGNvbnRyb2xWYWx1ZSAmJiAhZGlzYWJsZWQpIHtcbiAgICAgICAgY29udHJvbFZhbHVlLmVuYWJsZSgpO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBjb250cm9sRGlzYWJsZWQgPSBmb3JtQXJyYXkuY29udHJvbHMuZmluZChjb250cm9sID0+IGZpZWxkID09PSBjb250cm9sLmdldCgnbmFtZScpLnZhbHVlKT8uZ2V0KCdkaXNhYmxlZCcpO1xuICAgICAgY29udHJvbERpc2FibGVkLnNldFZhbHVlKGRpc2FibGVkKTtcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBlbWl0RGF0YShmb3JtOiBVbnR5cGVkRm9ybUdyb3VwKSB7XG4gICAgY29uc3QgZGF0YSA9IHt9O1xuICAgIGNvbnN0IGZvcm1BcnJheSA9IGZvcm0uZ2V0KCdmb3JtRGF0YScpIGFzIFVudHlwZWRGb3JtQXJyYXk7XG4gICAgZm9ybUFycmF5Py5jb250cm9scy5mb3JFYWNoKGNvbnRyb2wgPT4ge1xuICAgICAgaWYgKGNvbnRyb2wuZ2V0KCdzaG93JykudmFsdWUuZ2V0VmFsdWUoKSAhPT0gZmFsc2UpIHtcbiAgICAgICAgbGV0IHZhbHVlOiBhbnkgPSBjb250cm9sLmdldCgndmFsdWUnKS52YWx1ZTtcbiAgICAgICAgaWYgKGNvbnRyb2wuZ2V0KCd0eXBlJykudmFsdWUgPT09IER5bmFtaWNGb3JtVHlwZUZpZWxkRW51bS52YWx1ZUxpc3QpIHtcbiAgICAgICAgICBpZiAodmFsdWUgPT09IG51bGwgfHwgdmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdmFsdWUgPSAnJztcbiAgICAgICAgICB9XG4gICAgICAgICAgdmFsdWUgPSBrb2FsYSh2YWx1ZSkuc3RyaW5nKCkuc3BsaXQoKS5nZXRWYWx1ZSgpO1xuICAgICAgICB9IGVsc2UgaWYgKGNvbnRyb2wuZ2V0KCd0eXBlJykudmFsdWUgPT09IER5bmFtaWNGb3JtVHlwZUZpZWxkRW51bS5tb3JlSXRlbXMpIHtcbiAgICAgICAgICBjb25zdCBtb3JlSXRlbXMgPSBjb250cm9sLmdldCgnbW9yZUl0ZW1zQ29uZmlnJykudmFsdWUgYXMgeyBmb3JtOiBVbnR5cGVkRm9ybUdyb3VwIH1bXTtcbiAgICAgICAgICB2YWx1ZSA9IFtdO1xuICAgICAgICAgIG1vcmVJdGVtcy5mb3JFYWNoKGl0ZW0gPT4ge1xuICAgICAgICAgICAgdmFsdWUucHVzaCh0aGlzLmVtaXREYXRhKGl0ZW0uZm9ybSkpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2UgaWYgKGNvbnRyb2wuZ2V0KCd0eXBlJykudmFsdWUgPT09IER5bmFtaWNGb3JtVHlwZUZpZWxkRW51bS5hdXRvY29tcGxldGUpIHtcbiAgICAgICAgICBpZiAoY29udHJvbC5nZXQoJ211bHRpcGxlJykudmFsdWUpIHtcbiAgICAgICAgICAgIGNvbnN0IG9wdGlvbnMgPSBjb250cm9sLmdldCgnYXV0b2NvbXBsZXRlU2VsZWN0ZWRWYWx1ZScpLnZhbHVlIGFzIEtvYWxhRHluYW1pY0F1dG9jb21wbGV0ZU9wdGlvbnNJbnRlcmZhY2VbXTtcbiAgICAgICAgICAgIHZhbHVlID0gb3B0aW9ucz8ubWFwKGl0ZW0gPT4gaXRlbT8udmFsdWUpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB2YWx1ZSA9IChjb250cm9sLmdldCgnYXV0b2NvbXBsZXRlU2VsZWN0ZWRWYWx1ZScpLnZhbHVlPy52YWx1ZSA/XG4gICAgICAgICAgICAgICAgICAgICBjb250cm9sLmdldCgnYXV0b2NvbXBsZXRlU2VsZWN0ZWRWYWx1ZScpLnZhbHVlLnZhbHVlIDpcbiAgICAgICAgICAgICAgICAgICAgIGNvbnRyb2wuZ2V0KCdhdXRvY29tcGxldGVTZWxlY3RlZFZhbHVlJykudmFsdWVcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKGNvbnRyb2wuZ2V0KCd0eXBlJykudmFsdWUgPT09IER5bmFtaWNGb3JtVHlwZUZpZWxkRW51bS5keW5hbWljRm9ybSkge1xuICAgICAgICAgIGNvbnN0IGR5bmFtaWNGb3JtQ29uZmlnID0gY29udHJvbC5nZXQoJ2R5bmFtaWNGb3JtQ29uZmlnJykudmFsdWUgYXMgQmVoYXZpb3JTdWJqZWN0PEtvYWxhRHluYW1pY0Zvcm1Db25maWdJbnRlcmZhY2U+O1xuICAgICAgICAgIHZhbHVlID0gdGhpcy5lbWl0RGF0YShkeW5hbWljRm9ybUNvbmZpZy5nZXRWYWx1ZSgpLmZvcm0pO1xuICAgICAgICB9IGVsc2UgaWYgKGNvbnRyb2wuZ2V0KCd0eXBlJykudmFsdWUgPT09IER5bmFtaWNGb3JtVHlwZUZpZWxkRW51bS5udW1iZXIpIHtcbiAgICAgICAgICB2YWx1ZSA9IHBhcnNlSW50KHZhbHVlKTtcbiAgICAgICAgfSBlbHNlIGlmICgoXG4gICAgICAgICAgY29udHJvbC5nZXQoJ3R5cGUnKS52YWx1ZSA9PT0gRHluYW1pY0Zvcm1UeXBlRmllbGRFbnVtLmZsb2F0IHx8XG4gICAgICAgICAgY29udHJvbC5nZXQoJ3R5cGUnKS52YWx1ZSA9PT0gRHluYW1pY0Zvcm1UeXBlRmllbGRFbnVtLnBlcmNlbnRcbiAgICAgICAgKSAmJiB0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICB2YWx1ZSA9IHBhcnNlRmxvYXQodmFsdWUucmVwbGFjZSgvLC9nLCAnLicpKTtcbiAgICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgICBjb250cm9sLmdldCgndHlwZScpLnZhbHVlID09PSBEeW5hbWljRm9ybVR5cGVGaWVsZEVudW0uY29pbiAmJlxuICAgICAgICAgIHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIlxuICAgICAgICApIHtcbiAgICAgICAgICB2YWx1ZSA9IHVubWFza0NvaW4odmFsdWUpO1xuICAgICAgICB9XG4gICAgICAgIGRhdGFbY29udHJvbC5nZXQoJ25hbWUnKS52YWx1ZV0gPSB2YWx1ZTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHJldHVybiBkYXRhO1xuICB9XG5cbiAgcHVibGljIHJlc2V0Rm9ybShmb3JtOiBVbnR5cGVkRm9ybUdyb3VwKSB7XG4gICAgY29uc3QgZm9ybUFycmF5ID0gZm9ybS5nZXQoJ2Zvcm1EYXRhJykgYXMgVW50eXBlZEZvcm1BcnJheTtcbiAgICBmb3JtQXJyYXkuY29udHJvbHMuZm9yRWFjaChjb250cm9sID0+IHtcbiAgICAgIGlmIChjb250cm9sLmdldCgndHlwZScpLnZhbHVlID09PSBEeW5hbWljRm9ybVR5cGVGaWVsZEVudW0ubW9yZUl0ZW1zKSB7XG4gICAgICAgIGNvbnRyb2wuZ2V0KCdtb3JlSXRlbXNDb25maWcnKS5zZXRWYWx1ZShbXSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb250cm9sLmdldCgndmFsdWUnKS5yZXNldCgpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIHNldFZhbHVlc0luTW9yZUl0ZW1zRm9ybShcbiAgICBzdWJqZWN0OiBCZWhhdmlvclN1YmplY3Q8QmVoYXZpb3JTdWJqZWN0PEtvYWxhRHluYW1pY1NldFZhbHVlSW50ZXJmYWNlW10+W10+LFxuICAgIHZhbHVlczogS29hbGFEeW5hbWljU2V0VmFsdWVJbnRlcmZhY2VbXVtdXG4gICkge1xuICAgIGNvbnN0IHZhbHVlc01vcmVJdGVtcyA9IFtdO1xuICAgIHZhbHVlcy5mb3JFYWNoKGl0ZW1WYWx1ZSA9PiB7XG4gICAgICB2YWx1ZXNNb3JlSXRlbXMucHVzaChuZXcgQmVoYXZpb3JTdWJqZWN0PEtvYWxhRHluYW1pY1NldFZhbHVlSW50ZXJmYWNlW10+KGl0ZW1WYWx1ZSkpO1xuICAgIH0pO1xuICAgIHN1YmplY3QubmV4dCh2YWx1ZXNNb3JlSXRlbXMpO1xuICB9XG5cbiAgcHVibGljIGF1dG9jb21wbGV0ZUZpbHRlck9uU2VydmVyKFxuICAgIHJlcXVlc3Q6ICgpID0+IFByb21pc2U8YW55W10+LFxuICAgIG5hbWVDb25maWc6IHtcbiAgICAgIHByb3BzQnlOYW1lOiBzdHJpbmdbXTtcbiAgICAgIGRlbGltaXRlcjogc3RyaW5nO1xuICAgIH0sXG4gICAgaW5kZXhOYW1lQnlWYWx1ZT86IHN0cmluZ1xuICApIHtcbiAgICByZXR1cm4gbmV3IE9ic2VydmFibGU8S29hbGFEeW5hbWljQXV0b2NvbXBsZXRlT3B0aW9uc0ludGVyZmFjZVtdPihvYnNlcnZlID0+IHtcbiAgICAgIHJlcXVlc3QoKS50aGVuKHJlc3BvbnNlID0+IHtcbiAgICAgICAgY29uc3Qgb3B0aW9uczogS29hbGFEeW5hbWljQXV0b2NvbXBsZXRlT3B0aW9uc0ludGVyZmFjZVtdID0gW107XG4gICAgICAgIHJlc3BvbnNlLmZvckVhY2goaXRlbSA9PiB7XG4gICAgICAgICAgbGV0IHZhbHVlID0gJyc7XG4gICAgICAgICAgaWYgKGluZGV4TmFtZUJ5VmFsdWU/LmluZGV4T2YoJyA+ICcpID49IDApIHtcbiAgICAgICAgICAgIHZhbHVlID0gdGhpcy5nZXRWYWx1ZUJ5U3RyaW5nUGF0aChpbmRleE5hbWVCeVZhbHVlLCBpdGVtKTtcbiAgICAgICAgICB9IGVsc2UgaWYgKGluZGV4TmFtZUJ5VmFsdWUpIHtcbiAgICAgICAgICAgIHZhbHVlID0gaXRlbVtpbmRleE5hbWVCeVZhbHVlXTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdmFsdWUgPSBpdGVtO1xuICAgICAgICAgIH1cbiAgICAgICAgICBvcHRpb25zLnB1c2goe1xuICAgICAgICAgICAgbmFtZToga29hbGEoaXRlbSkub2JqZWN0KCkudG9TdHJpbmcoXG4gICAgICAgICAgICAgIG5hbWVDb25maWcucHJvcHNCeU5hbWUsXG4gICAgICAgICAgICAgIChuYW1lQ29uZmlnLmRlbGltaXRlciA/PyAnICcpXG4gICAgICAgICAgICApLmdldFZhbHVlKCksXG4gICAgICAgICAgICB2YWx1ZVxuICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICAgICAgb2JzZXJ2ZS5uZXh0KG9wdGlvbnMpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgc2hvd0ZpZWxkcyhcbiAgICBzdWJqZWN0OiBCZWhhdmlvclN1YmplY3Q8S29hbGFEeW5hbWljRm9ybVNob3dGaWVsZEludGVyZmFjZVtdPixcbiAgICBuYW1lczogc3RyaW5nW10sXG4gICAgc2hvdzogYm9vbGVhbixcbiAgICBjbGVhckN1cnJlbnRWYWx1ZSA9IGZhbHNlXG4gICkge1xuICAgIGNvbnN0IGZpZWxkczogS29hbGFEeW5hbWljRm9ybVNob3dGaWVsZEludGVyZmFjZVtdID0gW107XG4gICAgbmFtZXMuZm9yRWFjaChuYW1lID0+IHtcbiAgICAgIGZpZWxkcy5wdXNoKHtcbiAgICAgICAgbmFtZSxcbiAgICAgICAgc2hvdyxcbiAgICAgICAgY2xlYXJDdXJyZW50VmFsdWVcbiAgICAgIH0pO1xuICAgIH0pO1xuICAgIHN1YmplY3QubmV4dChmaWVsZHMpO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRWYWx1ZUJ5U3RyaW5nUGF0aChpbmRleE5hbWVCeVZhbHVlOiBzdHJpbmcsIGl0ZW06IGFueSkge1xuICAgIGxldCB2YWx1ZTtcbiAgICBjb25zdCBwYXJ0c0luZGV4ID0gaW5kZXhOYW1lQnlWYWx1ZS5zcGxpdCgnID4gJyk7XG4gICAgbGV0IHBhcnRJbmRleCA9IDA7XG4gICAgZG8ge1xuICAgICAgaWYgKCF2YWx1ZSkge1xuICAgICAgICB2YWx1ZSA9IGl0ZW1bcGFydHNJbmRleFtwYXJ0SW5kZXhdXTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZhbHVlID0gdmFsdWVbcGFydHNJbmRleFtwYXJ0SW5kZXhdXTtcbiAgICAgIH1cbiAgICAgIHBhcnRJbmRleCsrO1xuICAgIH0gd2hpbGUgKHBhcnRJbmRleCA8IHBhcnRzSW5kZXgubGVuZ3RoKTtcblxuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxufVxuIl19