@noaestudio/forms
Version:
Dynamic forms extension for Covalent
315 lines (314 loc) • 30.7 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes} checked by tsc
*/
import { Injectable, SkipSelf, Optional } from '@angular/core';
import { Validators, FormControl } from '@angular/forms';
import { TdDynamicInputComponent } from '../dynamic-elements/dynamic-input/dynamic-input.component';
import { TdDynamicFileInputComponent } from '../dynamic-elements/dynamic-file-input/dynamic-file-input.component';
import { TdDynamicTextareaComponent } from '../dynamic-elements/dynamic-textarea/dynamic-textarea.component';
import { TdDynamicSlideToggleComponent } from '../dynamic-elements/dynamic-slide-toggle/dynamic-slide-toggle.component';
import { TdDynamicCheckboxComponent } from '../dynamic-elements/dynamic-checkbox/dynamic-checkbox.component';
import { TdDynamicSliderComponent } from '../dynamic-elements/dynamic-slider/dynamic-slider.component';
import { TdDynamicSelectComponent } from '../dynamic-elements/dynamic-select/dynamic-select.component';
import { TdDynamicDatepickerComponent } from '../dynamic-elements/dynamic-datepicker/dynamic-datepicker.component';
import { TextEditorComponent } from '../dynamic-elements/text-editor/text-editor.component';
import { ColorPickerComponent } from '../dynamic-elements/color-picker/color-picker.component';
import { TimePickerComponent } from '../dynamic-elements/time-picker/time-picker.component';
import { DateTimePickerComponent } from '../dynamic-elements/date-time-picker/date-time-picker.component';
import { TranslateComponent } from '../dynamic-elements/translatable/translate.component';
import { FormOrganizationComponent } from '../dynamic-elements/form-organization/form-organization.component';
import { GallerySelectorComponent } from '../dynamic-elements/gallery-selector/gallery-selector.component';
import { TreeSelectorComponent } from '../dynamic-elements/tree-selector/tree-selector.component';
import { EditableTableComponent } from '../dynamic-elements/editable-table/editable-table.component';
import { ChipSelectorComponent } from '../dynamic-elements/chip-selector/chip-selector.component';
/** @enum {string} */
var TdDynamicType = {
Text: 'text',
Boolean: 'boolean',
Number: 'number',
Array: 'array',
Date: 'date',
};
export { TdDynamicType };
/** @enum {string} */
var TdDynamicElement = {
Input: 'input',
Datepicker: 'datepicker',
Password: 'password',
Textarea: 'textarea',
Slider: 'slider',
SlideToggle: 'slide-toggle',
Checkbox: 'checkbox',
Select: 'select',
FileInput: 'file-input',
TextEditor: 'text-editor',
ColorPicker: 'color-picker',
TimePicker: 'time-picker',
DateTimePicker: 'date-time-picker',
Organization: 'organization',
GallerySelector: 'gallery-selector',
TreeSelector: 'tree-selector',
EditableTable: 'editable-table',
ChipSelector: 'chip-selector',
};
export { TdDynamicElement };
/** @enum {number} */
var Visibility = {
None: -1,
All: 0,
Add: 1,
Edit: 2,
};
export { Visibility };
Visibility[Visibility.None] = "None";
Visibility[Visibility.All] = "All";
Visibility[Visibility.Add] = "Add";
Visibility[Visibility.Edit] = "Edit";
/**
* @record
*/
export function ITdDynamicElementValidator() { }
function ITdDynamicElementValidator_tsickle_Closure_declarations() {
/** @type {?} */
ITdDynamicElementValidator.prototype.validator;
}
/**
* @record
*/
export function ITdDynamicElementConfig() { }
function ITdDynamicElementConfig_tsickle_Closure_declarations() {
/** @type {?|undefined} */
ITdDynamicElementConfig.prototype.label;
/** @type {?} */
ITdDynamicElementConfig.prototype.name;
/** @type {?} */
ITdDynamicElementConfig.prototype.type;
/** @type {?|undefined} */
ITdDynamicElementConfig.prototype.required;
/** @type {?|undefined} */
ITdDynamicElementConfig.prototype.disabled;
/** @type {?|undefined} */
ITdDynamicElementConfig.prototype.hidden;
/** @type {?|undefined} */
ITdDynamicElementConfig.prototype.min;
/** @type {?|undefined} */
ITdDynamicElementConfig.prototype.max;
/** @type {?|undefined} */
ITdDynamicElementConfig.prototype.minLength;
/** @type {?|undefined} */
ITdDynamicElementConfig.prototype.maxLength;
/** @type {?|undefined} */
ITdDynamicElementConfig.prototype.step;
/** @type {?|undefined} */
ITdDynamicElementConfig.prototype.selections;
/** @type {?|undefined} */
ITdDynamicElementConfig.prototype.default;
/** @type {?|undefined} */
ITdDynamicElementConfig.prototype.flex;
/** @type {?|undefined} */
ITdDynamicElementConfig.prototype.validators;
/** @type {?|undefined} */
ITdDynamicElementConfig.prototype.visibility;
/** @type {?|undefined} */
ITdDynamicElementConfig.prototype.selectComplex;
/** @type {?|undefined} */
ITdDynamicElementConfig.prototype.selectMultiple;
/** @type {?|undefined} */
ITdDynamicElementConfig.prototype.searchable;
/** @type {?|undefined} */
ITdDynamicElementConfig.prototype.translate;
/** @type {?|undefined} */
ITdDynamicElementConfig.prototype.treeItems;
/** @type {?|undefined} */
ITdDynamicElementConfig.prototype.action;
/** @type {?|undefined} */
ITdDynamicElementConfig.prototype.schema;
/** @type {?|undefined} */
ITdDynamicElementConfig.prototype.draggable;
/** @type {?|undefined} */
ITdDynamicElementConfig.prototype.extras;
/** @type {?|undefined} */
ITdDynamicElementConfig.prototype.extraFields;
/** @type {?|undefined} */
ITdDynamicElementConfig.prototype.chips;
}
export var /** @type {?} */ DYNAMIC_ELEMENT_NAME_REGEX = /^[^0-9][^\@]*$/;
var TdDynamicFormsService = /** @class */ (function () {
function TdDynamicFormsService() {
}
/**
* Method to validate if the [name] is a proper element name.
* Throws error if name is not valid.
*/
/**
* Method to validate if the [name] is a proper element name.
* Throws error if name is not valid.
* @param {?} name
* @return {?}
*/
TdDynamicFormsService.prototype.validateDynamicElementName = /**
* Method to validate if the [name] is a proper element name.
* Throws error if name is not valid.
* @param {?} name
* @return {?}
*/
function (name) {
if (!DYNAMIC_ELEMENT_NAME_REGEX.test(name)) {
throw new Error('Dynamic element name: "${name}" is not valid.');
}
};
/**
* Gets component to be rendered depending on [TdDynamicElement | TdDynamicType]
* Throws error if it does not exists or not supported.
*/
/**
* Gets component to be rendered depending on [TdDynamicElement | TdDynamicType]
* Throws error if it does not exists or not supported.
* @param {?} element
* @param {?=} translate
* @return {?}
*/
TdDynamicFormsService.prototype.getDynamicElement = /**
* Gets component to be rendered depending on [TdDynamicElement | TdDynamicType]
* Throws error if it does not exists or not supported.
* @param {?} element
* @param {?=} translate
* @return {?}
*/
function (element, translate) {
if (translate === void 0) { translate = false; }
if (translate) {
return TranslateComponent;
}
switch (element) {
case TdDynamicType.Text:
case TdDynamicType.Number:
case TdDynamicElement.Input:
case TdDynamicElement.Password:
return TdDynamicInputComponent;
case TdDynamicElement.Textarea:
return TdDynamicTextareaComponent;
case TdDynamicType.Boolean:
case TdDynamicElement.SlideToggle:
return TdDynamicSlideToggleComponent;
case TdDynamicElement.Checkbox:
return TdDynamicCheckboxComponent;
case TdDynamicElement.Slider:
return TdDynamicSliderComponent;
case TdDynamicType.Array:
case TdDynamicElement.Select:
return TdDynamicSelectComponent;
case TdDynamicElement.FileInput:
return TdDynamicFileInputComponent;
case TdDynamicElement.Datepicker:
case TdDynamicType.Date:
return TdDynamicDatepickerComponent;
case TdDynamicElement.TextEditor:
return TextEditorComponent;
case TdDynamicElement.ColorPicker:
return ColorPickerComponent;
case TdDynamicElement.TimePicker:
return TimePickerComponent;
case TdDynamicElement.DateTimePicker:
return DateTimePickerComponent;
case TdDynamicElement.Organization:
return FormOrganizationComponent;
case TdDynamicElement.GallerySelector:
return GallerySelectorComponent;
case TdDynamicElement.TreeSelector:
return TreeSelectorComponent;
case TdDynamicElement.EditableTable:
return EditableTableComponent;
case TdDynamicElement.ChipSelector:
return ChipSelectorComponent;
default:
throw new Error("Error: type " + element + " does not exist or not supported.");
}
};
/**
* Creates form control for element depending [ITdDynamicElementConfig] properties.
*/
/**
* Creates form control for element depending [ITdDynamicElementConfig] properties.
* @param {?} config
* @return {?}
*/
TdDynamicFormsService.prototype.createFormControl = /**
* Creates form control for element depending [ITdDynamicElementConfig] properties.
* @param {?} config
* @return {?}
*/
function (config) {
var /** @type {?} */ validator = this.createValidators(config);
return new FormControl({ value: config.default, disabled: config.disabled }, validator);
};
/**
* Creates form validationdepending [ITdDynamicElementConfig] properties.
*/
/**
* Creates form validationdepending [ITdDynamicElementConfig] properties.
* @param {?} config
* @return {?}
*/
TdDynamicFormsService.prototype.createValidators = /**
* Creates form validationdepending [ITdDynamicElementConfig] properties.
* @param {?} config
* @return {?}
*/
function (config) {
var /** @type {?} */ validator;
if (config.required) {
validator = Validators.required;
}
if (config.max || config.max === 0) {
validator = Validators.compose([validator, Validators.max(parseFloat(config.max))]);
}
if (config.min || config.min === 0) {
validator = Validators.compose([validator, Validators.min(parseFloat(config.min))]);
}
if (config.maxLength || config.maxLength === 0) {
validator = Validators.compose([validator, Validators.maxLength(parseFloat(config.maxLength))]);
}
if (config.minLength || config.minLength === 0) {
validator = Validators.compose([validator, Validators.minLength(parseFloat(config.minLength))]);
}
// Add provided custom validators to the validator function
if (config.validators) {
config.validators.forEach(function (validatorConfig) {
validator = Validators.compose([validator, validatorConfig.validator]);
});
}
return validator;
};
TdDynamicFormsService.decorators = [
{ type: Injectable },
];
/** @nocollapse */
TdDynamicFormsService.ctorParameters = function () { return []; };
return TdDynamicFormsService;
}());
export { TdDynamicFormsService };
function TdDynamicFormsService_tsickle_Closure_declarations() {
/** @type {!Array<{type: !Function, args: (undefined|!Array<?>)}>} */
TdDynamicFormsService.decorators;
/**
* @nocollapse
* @type {function(): !Array<(null|{type: ?, decorators: (undefined|!Array<{type: !Function, args: (undefined|!Array<?>)}>)})>}
*/
TdDynamicFormsService.ctorParameters;
}
/**
* @param {?} parent
* @return {?}
*/
export function DYNAMIC_FORMS_PROVIDER_FACTORY(parent) {
return parent || new TdDynamicFormsService();
}
export var /** @type {?} */ DYNAMIC_FORMS_PROVIDER = {
// If there is already a service available, use that. Otherwise, provide a new one.
provide: TdDynamicFormsService,
deps: [[new Optional(), new SkipSelf(), TdDynamicFormsService]],
useFactory: DYNAMIC_FORMS_PROVIDER_FACTORY,
};
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHluYW1pYy1mb3Jtcy5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6Im5nOi8vQGNvdmFsZW50L2R5bmFtaWMtZm9ybXMvIiwic291cmNlcyI6WyJzZXJ2aWNlcy9keW5hbWljLWZvcm1zLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7OztBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQVksUUFBUSxFQUFFLFFBQVEsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUN6RSxPQUFPLEVBQUUsVUFBVSxFQUFlLFdBQVcsRUFBbUIsTUFBTSxnQkFBZ0IsQ0FBQztBQUV2RixPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSwyREFBMkQsQ0FBQztBQUNwRyxPQUFPLEVBQUUsMkJBQTJCLEVBQUUsTUFBTSxxRUFBcUUsQ0FBQztBQUNsSCxPQUFPLEVBQUUsMEJBQTBCLEVBQUUsTUFBTSxpRUFBaUUsQ0FBQztBQUM3RyxPQUFPLEVBQUUsNkJBQTZCLEVBQUUsTUFBTSx5RUFBeUUsQ0FBQztBQUN4SCxPQUFPLEVBQUUsMEJBQTBCLEVBQUUsTUFBTSxpRUFBaUUsQ0FBQztBQUM3RyxPQUFPLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSw2REFBNkQsQ0FBQztBQUN2RyxPQUFPLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSw2REFBNkQsQ0FBQztBQUN2RyxPQUFPLEVBQUUsNEJBQTRCLEVBQUUsTUFBTSxxRUFBcUUsQ0FBQztBQUVuSCxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSx1REFBdUQsQ0FBQztBQUM1RixPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSx5REFBeUQsQ0FBQztBQUMvRixPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSx1REFBdUQsQ0FBQztBQUM1RixPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSxpRUFBaUUsQ0FBQztBQUMxRyxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxzREFBc0QsQ0FBQztBQUMxRixPQUFPLEVBQUUseUJBQXlCLEVBQUUsTUFBTSxt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QUN2RSxDQUFDLENBQUM7U0FDSDtRQUNELE1BQU0sQ0FBQyxTQUFTLENBQUM7S0FDakI7O2dCQXZHRCxVQUFVOzs7O2dDQS9GWDs7U0FnR2EscUJBQXFCOzs7Ozs7Ozs7Ozs7OztBQXlHbEMsTUFBTSx5Q0FDTCxNQUE2QjtJQUM1QixNQUFNLENBQUMsTUFBTSxJQUFJLElBQUkscUJBQXFCLEVBQUUsQ0FBQztDQUM3QztBQUVELE1BQU0sQ0FBQyxxQkFBTSxzQkFBc0IsR0FBYTs7SUFFL0MsT0FBTyxFQUFFLHFCQUFxQjtJQUM5QixJQUFJLEVBQUUsQ0FBQyxDQUFDLElBQUksUUFBUSxFQUFFLEVBQUUsSUFBSSxRQUFRLEVBQUUsRUFBRSxxQkFBcUIsQ0FBQyxDQUFDO0lBQy9ELFVBQVUsRUFBRSw4QkFBOEI7Q0FDMUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUsIFByb3ZpZGVyLCBTa2lwU2VsZiwgT3B0aW9uYWwgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgVmFsaWRhdG9ycywgVmFsaWRhdG9yRm4sIEZvcm1Db250cm9sLCBBYnN0cmFjdENvbnRyb2wgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XHJcblxyXG5pbXBvcnQgeyBUZER5bmFtaWNJbnB1dENvbXBvbmVudCB9IGZyb20gJy4uL2R5bmFtaWMtZWxlbWVudHMvZHluYW1pYy1pbnB1dC9keW5hbWljLWlucHV0LmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IFRkRHluYW1pY0ZpbGVJbnB1dENvbXBvbmVudCB9IGZyb20gJy4uL2R5bmFtaWMtZWxlbWVudHMvZHluYW1pYy1maWxlLWlucHV0L2R5bmFtaWMtZmlsZS1pbnB1dC5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBUZER5bmFtaWNUZXh0YXJlYUNvbXBvbmVudCB9IGZyb20gJy4uL2R5bmFtaWMtZWxlbWVudHMvZHluYW1pYy10ZXh0YXJlYS9keW5hbWljLXRleHRhcmVhLmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IFRkRHluYW1pY1NsaWRlVG9nZ2xlQ29tcG9uZW50IH0gZnJvbSAnLi4vZHluYW1pYy1lbGVtZW50cy9keW5hbWljLXNsaWRlLXRvZ2dsZS9keW5hbWljLXNsaWRlLXRvZ2dsZS5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBUZER5bmFtaWNDaGVja2JveENvbXBvbmVudCB9IGZyb20gJy4uL2R5bmFtaWMtZWxlbWVudHMvZHluYW1pYy1jaGVja2JveC9keW5hbWljLWNoZWNrYm94LmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IFRkRHluYW1pY1NsaWRlckNvbXBvbmVudCB9IGZyb20gJy4uL2R5bmFtaWMtZWxlbWVudHMvZHluYW1pYy1zbGlkZXIvZHluYW1pYy1zbGlkZXIuY29tcG9uZW50JztcclxuaW1wb3J0IHsgVGREeW5hbWljU2VsZWN0Q29tcG9uZW50IH0gZnJvbSAnLi4vZHluYW1pYy1lbGVtZW50cy9keW5hbWljLXNlbGVjdC9keW5hbWljLXNlbGVjdC5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBUZER5bmFtaWNEYXRlcGlja2VyQ29tcG9uZW50IH0gZnJvbSAnLi4vZHluYW1pYy1lbGVtZW50cy9keW5hbWljLWRhdGVwaWNrZXIvZHluYW1pYy1kYXRlcGlja2VyLmNvbXBvbmVudCc7XHJcblxyXG5pbXBvcnQgeyBUZXh0RWRpdG9yQ29tcG9uZW50IH0gZnJvbSAnLi4vZHluYW1pYy1lbGVtZW50cy90ZXh0LWVkaXRvci90ZXh0LWVkaXRvci5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBDb2xvclBpY2tlckNvbXBvbmVudCB9IGZyb20gJy4uL2R5bmFtaWMtZWxlbWVudHMvY29sb3ItcGlja2VyL2NvbG9yLXBpY2tlci5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBUaW1lUGlja2VyQ29tcG9uZW50IH0gZnJvbSAnLi4vZHluYW1pYy1lbGVtZW50cy90aW1lLXBpY2tlci90aW1lLXBpY2tlci5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBEYXRlVGltZVBpY2tlckNvbXBvbmVudCB9IGZyb20gJy4uL2R5bmFtaWMtZWxlbWVudHMvZGF0ZS10aW1lLXBpY2tlci9kYXRlLXRpbWUtcGlja2VyLmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IFRyYW5zbGF0ZUNvbXBvbmVudCB9IGZyb20gJy4uL2R5bmFtaWMtZWxlbWVudHMvdHJhbnNsYXRhYmxlL3RyYW5zbGF0ZS5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBGb3JtT3JnYW5pemF0aW9uQ29tcG9uZW50IH0gZnJvbSAnLi4vZHluYW1pYy1lbGVtZW50cy9mb3JtLW9yZ2FuaXphdGlvbi9mb3JtLW9yZ2FuaXphdGlvbi5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBHYWxsZXJ5U2VsZWN0b3JDb21wb25lbnQgfSBmcm9tICcuLi9keW5hbWljLWVsZW1lbnRzL2dhbGxlcnktc2VsZWN0b3IvZ2FsbGVyeS1zZWxlY3Rvci5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBUcmVlU2VsZWN0b3JDb21wb25lbnQgfSBmcm9tICcuLi9keW5hbWljLWVsZW1lbnRzL3RyZWUtc2VsZWN0b3IvdHJlZS1zZWxlY3Rvci5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBFZGl0YWJsZVRhYmxlQ29tcG9uZW50IH0gZnJvbSAnLi4vZHluYW1pYy1lbGVtZW50cy9lZGl0YWJsZS10YWJsZS9lZGl0YWJsZS10YWJsZS5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBDaGlwU2VsZWN0b3JDb21wb25lbnQgfSBmcm9tICcuLi9keW5hbWljLWVsZW1lbnRzL2NoaXAtc2VsZWN0b3IvY2hpcC1zZWxlY3Rvci5jb21wb25lbnQnO1xyXG5cclxuZXhwb3J0IGVudW0gVGREeW5hbWljVHlwZSB7XHJcblx0VGV4dCA9ICd0ZXh0JyxcclxuXHRCb29sZWFuID0gJ2Jvb2xlYW4nLFxyXG5cdE51bWJlciA9ICdudW1iZXInLFxyXG5cdEFycmF5ID0gJ2FycmF5JyxcclxuXHREYXRlID0gJ2RhdGUnXHJcbn1cclxuXHJcbmV4cG9ydCBlbnVtIFRkRHluYW1pY0VsZW1lbnQge1xyXG5cdElucHV0ID0gJ2lucHV0JyxcclxuXHREYXRlcGlja2VyID0gJ2RhdGVwaWNrZXInLFxyXG5cdFBhc3N3b3JkID0gJ3Bhc3N3b3JkJyxcclxuXHRUZXh0YXJlYSA9ICd0ZXh0YXJlYScsXHJcblx0U2xpZGVyID0gJ3NsaWRlcicsXHJcblx0U2xpZGVUb2dnbGUgPSAnc2xpZGUtdG9nZ2xlJyxcclxuXHRDaGVja2JveCA9ICdjaGVja2JveCcsXHJcblx0U2VsZWN0ID0gJ3NlbGVjdCcsXHJcblx0RmlsZUlucHV0ID0gJ2ZpbGUtaW5wdXQnLFxyXG5cdFRleHRFZGl0b3IgPSAndGV4dC1lZGl0b3InLFxyXG5cdENvbG9yUGlja2VyID0gJ2NvbG9yLXBpY2tlcicsXHJcblx0VGltZVBpY2tlciA9ICd0aW1lLXBpY2tlcicsXHJcblx0RGF0ZVRpbWVQaWNrZXIgPSAnZGF0ZS10aW1lLXBpY2tlcicsXHJcblx0T3JnYW5pemF0aW9uID0gJ29yZ2FuaXphdGlvbicsXHJcblx0R2FsbGVyeVNlbGVjdG9yID0gJ2dhbGxlcnktc2VsZWN0b3InLFxyXG5cdFRyZWVTZWxlY3RvciA9ICd0cmVlLXNlbGVjdG9yJyxcclxuXHRFZGl0YWJsZVRhYmxlID0gJ2VkaXRhYmxlLXRhYmxlJyxcclxuXHRDaGlwU2VsZWN0b3IgPSAnY2hpcC1zZWxlY3RvcidcclxufVxyXG5cclxuZXhwb3J0IGVudW0gVmlzaWJpbGl0eSB7XHJcblx0Tm9uZSA9IC0xLFxyXG5cdEFsbCA9IDAsXHJcblx0QWRkID0gMSxcclxuXHRFZGl0ID0gMlxyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIElUZER5bmFtaWNFbGVtZW50VmFsaWRhdG9yIHtcclxuXHR2YWxpZGF0b3I6IFZhbGlkYXRvckZuO1xyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIElUZER5bmFtaWNFbGVtZW50Q29uZmlnIHtcclxuXHRsYWJlbD86IHN0cmluZztcclxuXHRuYW1lOiBzdHJpbmc7XHJcblx0dHlwZTogVGREeW5hbWljVHlwZSB8IFRkRHluYW1pY0VsZW1lbnQ7XHJcblx0cmVxdWlyZWQ/OiBib29sZWFuO1xyXG5cdGRpc2FibGVkPzogYm9vbGVhbjtcclxuXHRoaWRkZW4/OiBib29sZWFuO1xyXG5cdG1pbj86IGFueTtcclxuXHRtYXg/OiBhbnk7XHJcblx0bWluTGVuZ3RoPzogYW55O1xyXG5cdG1heExlbmd0aD86IGFueTtcclxuXHRzdGVwPzogbnVtYmVyLFxyXG5cdHNlbGVjdGlvbnM/OiBzdHJpbmdbXSB8IHsgdmFsdWU6IGFueSwgbGFiZWw6IHN0cmluZyB9W107XHJcblx0ZGVmYXVsdD86IGFueTtcclxuXHRmbGV4PzogbnVtYmVyO1xyXG5cdHZhbGlkYXRvcnM/OiBJVGREeW5hbWljRWxlbWVudFZhbGlkYXRvcltdO1xyXG5cdHZpc2liaWxpdHk/IDogVmlzaWJpbGl0eTtcclxuXHRzZWxlY3RDb21wbGV4PyA6IGJvb2xlYW47XHJcblx0c2VsZWN0TXVsdGlwbGU/IDogYm9vbGVhbjtcclxuXHRzZWFyY2hhYmxlPzogYm9vbGVhbjtcclxuXHR0cmFuc2xhdGU/IDogYm9vbGVhbjtcclxuXHR0cmVlSXRlbXM/OiBhbnk7XHJcblx0YWN0aW9uPyA6ICh2YWx1ZT8gOiBhbnkpID0+IFByb21pc2U8YW55PjtcclxuXHRzY2hlbWE/IDogYW55O1xyXG5cdGRyYWdnYWJsZT8gOiBhbnk7XHJcblx0ZXh0cmFzPyA6IGFueTtcclxuXHRleHRyYUZpZWxkcz86IHN0cmluZ1tdO1xyXG5cdGNoaXBzPyA6IHsgdmFsdWUgOiBhbnkgLCBsYWJlbCA6IHN0cmluZywgYWN0aXZlIDogYm9vbGVhbn1bXTtcclxufVxyXG5cclxuZXhwb3J0IGNvbnN0IERZTkFNSUNfRUxFTUVOVF9OQU1FX1JFR0VYOiBSZWdFeHAgPSAvXlteMC05XVteXFxAXSokLztcclxuXHJcbkBJbmplY3RhYmxlKClcclxuZXhwb3J0IGNsYXNzIFRkRHluYW1pY0Zvcm1zU2VydmljZSB7XHJcblxyXG5cdC8qKlxyXG5cdCogTWV0aG9kIHRvIHZhbGlkYXRlIGlmIHRoZSBbbmFtZV0gaXMgYSBwcm9wZXIgZWxlbWVudCBuYW1lLlxyXG5cdCogVGhyb3dzIGVycm9yIGlmIG5hbWUgaXMgbm90IHZhbGlkLlxyXG5cdCovXHJcblx0dmFsaWRhdGVEeW5hbWljRWxlbWVudE5hbWUobmFtZTogc3RyaW5nKTogdm9pZCB7XHJcblx0XHRpZiAoIURZTkFNSUNfRUxFTUVOVF9OQU1FX1JFR0VYLnRlc3QobmFtZSkpIHtcclxuXHRcdFx0dGhyb3cgbmV3IEVycm9yKCdEeW5hbWljIGVsZW1lbnQgbmFtZTogXCIke25hbWV9XCIgaXMgbm90IHZhbGlkLicpO1xyXG5cdFx0fVxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0KiBHZXRzIGNvbXBvbmVudCB0byBiZSByZW5kZXJlZCBkZXBlbmRpbmcgb24gW1RkRHluYW1pY0VsZW1lbnQgfCBUZER5bmFtaWNUeXBlXVxyXG5cdCogVGhyb3dzIGVycm9yIGlmIGl0IGRvZXMgbm90IGV4aXN0cyBvciBub3Qgc3VwcG9ydGVkLlxyXG5cdCovXHJcblx0Z2V0RHluYW1pY0VsZW1lbnQoZWxlbWVudDogVGREeW5hbWljRWxlbWVudCB8IFRkRHluYW1pY1R5cGUsIHRyYW5zbGF0ZSA6IGJvb2xlYW4gPSBmYWxzZSk6IGFueSB7XHJcblx0XHRpZiAodHJhbnNsYXRlKSB7XHJcblx0XHRcdHJldHVybiBUcmFuc2xhdGVDb21wb25lbnQ7XHJcblx0XHR9XHJcblxyXG5cdFx0c3dpdGNoIChlbGVtZW50KSB7XHJcblx0XHRcdGNhc2UgVGREeW5hbWljVHlwZS5UZXh0OlxyXG5cdFx0XHRjYXNlIFRkRHluYW1pY1R5cGUuTnVtYmVyOlxyXG5cdFx0XHRjYXNlIFRkRHluYW1pY0VsZW1lbnQuSW5wdXQ6XHJcblx0XHRcdGNhc2UgVGREeW5hbWljRWxlbWVudC5QYXNzd29yZDpcclxuXHRcdFx0XHRyZXR1cm4gVGREeW5hbWljSW5wdXRDb21wb25lbnQ7XHJcblx0XHRcdGNhc2UgVGREeW5hbWljRWxlbWVudC5UZXh0YXJlYTpcclxuXHRcdFx0XHRyZXR1cm4gVGREeW5hbWljVGV4dGFyZWFDb21wb25lbnQ7XHJcblx0XHRcdGNhc2UgVGREeW5hbWljVHlwZS5Cb29sZWFuOlxyXG5cdFx0XHRjYXNlIFRkRHluYW1pY0VsZW1lbnQuU2xpZGVUb2dnbGU6XHJcblx0XHRcdFx0cmV0dXJuIFRkRHluYW1pY1NsaWRlVG9nZ2xlQ29tcG9uZW50O1xyXG5cdFx0XHRjYXNlIFRkRHluYW1pY0VsZW1lbnQuQ2hlY2tib3g6XHJcblx0XHRcdFx0cmV0dXJuIFRkRHluYW1pY0NoZWNrYm94Q29tcG9uZW50O1xyXG5cdFx0XHRjYXNlIFRkRHluYW1pY0VsZW1lbnQuU2xpZGVyOlxyXG5cdFx0XHRcdHJldHVybiBUZER5bmFtaWNTbGlkZXJDb21wb25lbnQ7XHJcblx0XHRcdGNhc2UgVGREeW5hbWljVHlwZS5BcnJheTpcclxuXHRcdFx0Y2FzZSBUZER5bmFtaWNFbGVtZW50LlNlbGVjdDpcclxuXHRcdFx0XHRyZXR1cm4gVGREeW5hbWljU2VsZWN0Q29tcG9uZW50O1xyXG5cdFx0XHRjYXNlIFRkRHluYW1pY0VsZW1lbnQuRmlsZUlucHV0OlxyXG5cdFx0XHRcdHJldHVybiBUZER5bmFtaWNGaWxlSW5wdXRDb21wb25lbnQ7XHJcblx0XHRcdGNhc2UgVGREeW5hbWljRWxlbWVudC5EYXRlcGlja2VyOlxyXG5cdFx0XHRjYXNlIFRkRHluYW1pY1R5cGUuRGF0ZTpcclxuXHRcdFx0XHRyZXR1cm4gVGREeW5hbWljRGF0ZXBpY2tlckNvbXBvbmVudDtcclxuXHRcdFx0Y2FzZSBUZER5bmFtaWNFbGVtZW50LlRleHRFZGl0b3I6XHJcblx0XHRcdFx0cmV0dXJuIFRleHRFZGl0b3JDb21wb25lbnQ7XHJcblx0XHRcdGNhc2UgVGREeW5hbWljRWxlbWVudC5Db2xvclBpY2tlcjpcclxuXHRcdFx0XHRyZXR1cm4gQ29sb3JQaWNrZXJDb21wb25lbnQ7XHJcblx0XHRcdGNhc2UgVGREeW5hbWljRWxlbWVudC5UaW1lUGlja2VyOlxyXG5cdFx0XHRcdHJldHVybiBUaW1lUGlja2VyQ29tcG9uZW50O1xyXG5cdFx0XHRjYXNlIFRkRHluYW1pY0VsZW1lbnQuRGF0ZVRpbWVQaWNrZXI6XHJcblx0XHRcdFx0cmV0dXJuIERhdGVUaW1lUGlja2VyQ29tcG9uZW50O1xyXG5cdFx0XHRjYXNlIFRkRHluYW1pY0VsZW1lbnQuT3JnYW5pemF0aW9uOlxyXG5cdFx0XHRcdHJldHVybiBGb3JtT3JnYW5pemF0aW9uQ29tcG9uZW50O1xyXG5cdFx0XHRjYXNlIFRkRHluYW1pY0VsZW1lbnQuR2FsbGVyeVNlbGVjdG9yOlxyXG5cdFx0XHRcdHJldHVybiBHYWxsZXJ5U2VsZWN0b3JDb21wb25lbnQ7XHJcblx0XHRcdGNhc2UgVGREeW5hbWljRWxlbWVudC5UcmVlU2VsZWN0b3I6XHJcblx0XHRcdFx0cmV0dXJuIFRyZWVTZWxlY3RvckNvbXBvbmVudDtcclxuXHRcdFx0Y2FzZSBUZER5bmFtaWNFbGVtZW50LkVkaXRhYmxlVGFibGU6XHJcblx0XHRcdFx0cmV0dXJuIEVkaXRhYmxlVGFibGVDb21wb25lbnQ7XHJcblx0XHRcdGNhc2UgVGREeW5hbWljRWxlbWVudC5DaGlwU2VsZWN0b3I6XHJcblx0XHRcdFx0cmV0dXJuIENoaXBTZWxlY3RvckNvbXBvbmVudDtcclxuXHRcdFx0ZGVmYXVsdDpcclxuXHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IoYEVycm9yOiB0eXBlICR7ZWxlbWVudH0gZG9lcyBub3QgZXhpc3Qgb3Igbm90IHN1cHBvcnRlZC5gKTtcclxuXHRcdH1cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCogQ3JlYXRlcyBmb3JtIGNvbnRyb2wgZm9yIGVsZW1lbnQgZGVwZW5kaW5nIFtJVGREeW5hbWljRWxlbWVudENvbmZpZ10gcHJvcGVydGllcy5cclxuXHQqL1xyXG5cdGNyZWF0ZUZvcm1Db250cm9sKGNvbmZpZzogSVRkRHluYW1pY0VsZW1lbnRDb25maWcpOiBGb3JtQ29udHJvbCB7XHJcblx0XHRsZXQgdmFsaWRhdG9yOiBWYWxpZGF0b3JGbiA9IHRoaXMuY3JlYXRlVmFsaWRhdG9ycyhjb25maWcpO1xyXG5cdFx0cmV0dXJuIG5ldyBGb3JtQ29udHJvbCh7dmFsdWU6IGNvbmZpZy5kZWZhdWx0LCBkaXNhYmxlZDogY29uZmlnLmRpc2FibGVkfSwgdmFsaWRhdG9yKTtcclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCogQ3JlYXRlcyBmb3JtIHZhbGlkYXRpb25kZXBlbmRpbmcgW0lUZER5bmFtaWNFbGVtZW50Q29uZmlnXSBwcm9wZXJ0aWVzLlxyXG5cdCovXHJcblx0Y3JlYXRlVmFsaWRhdG9ycyhjb25maWc6IElUZER5bmFtaWNFbGVtZW50Q29uZmlnKTogVmFsaWRhdG9yRm4ge1xyXG5cdFx0bGV0IHZhbGlkYXRvcjogVmFsaWRhdG9yRm47XHJcblx0XHRpZiAoY29uZmlnLnJlcXVpcmVkKSB7XHJcblx0XHRcdHZhbGlkYXRvciA9IFZhbGlkYXRvcnMucmVxdWlyZWQ7XHJcblx0XHR9XHJcblx0XHRpZiAoY29uZmlnLm1heCB8fCBjb25maWcubWF4ID09PSAwKSB7XHJcblx0XHRcdHZhbGlkYXRvciA9IFZhbGlkYXRvcnMuY29tcG9zZShbdmFsaWRhdG9yLCBWYWxpZGF0b3JzLm1heChwYXJzZUZsb2F0KGNvbmZpZy5tYXgpKV0pO1xyXG5cdFx0fVxyXG5cdFx0aWYgKGNvbmZpZy5taW4gfHwgY29uZmlnLm1pbiA9PT0gMCkge1xyXG5cdFx0XHR2YWxpZGF0b3IgPSBWYWxpZGF0b3JzLmNvbXBvc2UoW3ZhbGlkYXRvciwgVmFsaWRhdG9ycy5taW4ocGFyc2VGbG9hdChjb25maWcubWluKSldKTtcclxuXHRcdH1cclxuXHRcdGlmIChjb25maWcubWF4TGVuZ3RoIHx8IGNvbmZpZy5tYXhMZW5ndGggPT09IDApIHtcclxuXHRcdFx0dmFsaWRhdG9yID0gVmFsaWRhdG9ycy5jb21wb3NlKFt2YWxpZGF0b3IsIFZhbGlkYXRvcnMubWF4TGVuZ3RoKHBhcnNlRmxvYXQoY29uZmlnLm1heExlbmd0aCkpXSk7XHJcblx0XHR9XHJcblx0XHRpZiAoY29uZmlnLm1pbkxlbmd0aCB8fCBjb25maWcubWluTGVuZ3RoID09PSAwKSB7XHJcblx0XHRcdHZhbGlkYXRvciA9IFZhbGlkYXRvcnMuY29tcG9zZShbdmFsaWRhdG9yLCBWYWxpZGF0b3JzLm1pbkxlbmd0aChwYXJzZUZsb2F0KGNvbmZpZy5taW5MZW5ndGgpKV0pO1xyXG5cdFx0fVxyXG5cdFx0Ly8gQWRkIHByb3ZpZGVkIGN1c3RvbSB2YWxpZGF0b3JzIHRvIHRoZSB2YWxpZGF0b3IgZnVuY3Rpb25cclxuXHRcdGlmIChjb25maWcudmFsaWRhdG9ycykge1xyXG5cdFx0XHRjb25maWcudmFsaWRhdG9ycy5mb3JFYWNoKCh2YWxpZGF0b3JDb25maWc6IElUZER5bmFtaWNFbGVtZW50VmFsaWRhdG9yKSA9PiB7XHJcblx0XHRcdFx0dmFsaWRhdG9yID0gVmFsaWRhdG9ycy5jb21wb3NlKFt2YWxpZGF0b3IsIHZhbGlkYXRvckNvbmZpZy52YWxpZGF0b3JdKTtcclxuXHRcdFx0fSk7XHJcblx0XHR9XHJcblx0XHRyZXR1cm4gdmFsaWRhdG9yO1xyXG5cdH1cclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIERZTkFNSUNfRk9STVNfUFJPVklERVJfRkFDVE9SWShcclxuXHRwYXJlbnQ6IFRkRHluYW1pY0Zvcm1zU2VydmljZSk6IFRkRHluYW1pY0Zvcm1zU2VydmljZSB7XHJcblx0XHRyZXR1cm4gcGFyZW50IHx8IG5ldyBUZER5bmFtaWNGb3Jtc1NlcnZpY2UoKTtcclxuXHR9XHJcblxyXG5cdGV4cG9ydCBjb25zdCBEWU5BTUlDX0ZPUk1TX1BST1ZJREVSOiBQcm92aWRlciA9IHtcclxuXHRcdC8vIElmIHRoZXJlIGlzIGFscmVhZHkgYSBzZXJ2aWNlIGF2YWlsYWJsZSwgdXNlIHRoYXQuIE90aGVyd2lzZSwgcHJvdmlkZSBhIG5ldyBvbmUuXHJcblx0XHRwcm92aWRlOiBUZER5bmFtaWNGb3Jtc1NlcnZpY2UsXHJcblx0XHRkZXBzOiBbW25ldyBPcHRpb25hbCgpLCBuZXcgU2tpcFNlbGYoKSwgVGREeW5hbWljRm9ybXNTZXJ2aWNlXV0sXHJcblx0XHR1c2VGYWN0b3J5OiBEWU5BTUlDX0ZPUk1TX1BST1ZJREVSX0ZBQ1RPUlksXHJcblx0fTtcclxuIl19