UNPKG

@noaestudio/forms

Version:

Dynamic forms extension for Covalent

315 lines (314 loc) 30.7 kB
/** * @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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHluYW1pYy1mb3Jtcy5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6Im5nOi8vQGNvdmFsZW50L2R5bmFtaWMtZm9ybXMvIiwic291cmNlcyI6WyJzZXJ2aWNlcy9keW5hbWljLWZvcm1zLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7OztBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQVksUUFBUSxFQUFFLFFBQVEsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUN6RSxPQUFPLEVBQUUsVUFBVSxFQUFlLFdBQVcsRUFBbUIsTUFBTSxnQkFBZ0IsQ0FBQztBQUV2RixPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSwyREFBMkQsQ0FBQztBQUNwRyxPQUFPLEVBQUUsMkJBQTJCLEVBQUUsTUFBTSxxRUFBcUUsQ0FBQztBQUNsSCxPQUFPLEVBQUUsMEJBQTBCLEVBQUUsTUFBTSxpRUFBaUUsQ0FBQztBQUM3RyxPQUFPLEVBQUUsNkJBQTZCLEVBQUUsTUFBTSx5RUFBeUUsQ0FBQztBQUN4SCxPQUFPLEVBQUUsMEJBQTBCLEVBQUUsTUFBTSxpRUFBaUUsQ0FBQztBQUM3RyxPQUFPLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSw2REFBNkQsQ0FBQztBQUN2RyxPQUFPLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSw2REFBNkQsQ0FBQztBQUN2RyxPQUFPLEVBQUUsNEJBQTRCLEVBQUUsTUFBTSxxRUFBcUUsQ0FBQztBQUVuSCxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSx1REFBdUQsQ0FBQztBQUM1RixPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSx5REFBeUQsQ0FBQztBQUMvRixPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSx1REFBdUQsQ0FBQztBQUM1RixPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSxpRUFBaUUsQ0FBQztBQUMxRyxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxzREFBc0QsQ0FBQztBQUMxRixPQUFPLEVBQUUseUJBQXlCLEVBQUUsTUFBTSxtRUFBbUUsQ0FBQztBQUM5RyxPQUFPLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSxpRUFBaUUsQ0FBQztBQUMzRyxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSwyREFBMkQsQ0FBQztBQUNsRyxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSw2REFBNkQsQ0FBQztBQUNyRyxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSwyREFBMkQsQ0FBQzs7O1VBRzFGLE1BQU07YUFDSCxTQUFTO1lBQ1YsUUFBUTtXQUNULE9BQU87VUFDUixNQUFNOzs7OztXQUlMLE9BQU87Z0JBQ0YsWUFBWTtjQUNkLFVBQVU7Y0FDVixVQUFVO1lBQ1osUUFBUTtpQkFDSCxjQUFjO2NBQ2pCLFVBQVU7WUFDWixRQUFRO2VBQ0wsWUFBWTtnQkFDWCxhQUFhO2lCQUNaLGNBQWM7Z0JBQ2YsYUFBYTtvQkFDVCxrQkFBa0I7a0JBQ3BCLGNBQWM7cUJBQ1gsa0JBQWtCO2tCQUNyQixlQUFlO21CQUNkLGdCQUFnQjtrQkFDakIsZUFBZTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUE0Qy9CLE1BQU0sQ0FBQyxxQkFBTSwwQkFBMEIsR0FBVyxnQkFBZ0IsQ0FBQzs7OztJQUtsRTs7O01BR0U7Ozs7Ozs7SUFDRiwwREFBMEI7Ozs7OztJQUExQixVQUEyQixJQUFZO1FBQ3RDLEVBQUUsQ0FBQyxDQUFDLENBQUMsMEJBQTBCLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUM1QyxNQUFNLElBQUksS0FBSyxDQUFDLCtDQUErQyxDQUFDLENBQUM7U0FDakU7S0FDRDtJQUVEOzs7TUFHRTs7Ozs7Ozs7SUFDRixpREFBaUI7Ozs7Ozs7SUFBakIsVUFBa0IsT0FBeUMsRUFBRSxTQUEyQjtRQUEzQiwwQkFBQSxFQUFBLGlCQUEyQjtRQUN2RixFQUFFLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDO1lBQ2YsTUFBTSxDQUFDLGtCQUFrQixDQUFDO1NBQzFCO1FBRUQsTUFBTSxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQztZQUNqQixLQUFLLGFBQWEsQ0FBQyxJQUFJLENBQUM7WUFDeEIsS0FBSyxhQUFhLENBQUMsTUFBTSxDQUFDO1lBQzFCLEtBQUssZ0JBQWdCLENBQUMsS0FBSyxDQUFDO1lBQzVCLEtBQUssZ0JBQWdCLENBQUMsUUFBUTtnQkFDN0IsTUFBTSxDQUFDLHVCQUF1QixDQUFDO1lBQ2hDLEtBQUssZ0JBQWdCLENBQUMsUUFBUTtnQkFDN0IsTUFBTSxDQUFDLDBCQUEwQixDQUFDO1lBQ25DLEtBQUssYUFBYSxDQUFDLE9BQU8sQ0FBQztZQUMzQixLQUFLLGdCQUFnQixDQUFDLFdBQVc7Z0JBQ2hDLE1BQU0sQ0FBQyw2QkFBNkIsQ0FBQztZQUN0QyxLQUFLLGdCQUFnQixDQUFDLFFBQVE7Z0JBQzdCLE1BQU0sQ0FBQywwQkFBMEIsQ0FBQztZQUNuQyxLQUFLLGdCQUFnQixDQUFDLE1BQU07Z0JBQzNCLE1BQU0sQ0FBQyx3QkFBd0IsQ0FBQztZQUNqQyxLQUFLLGFBQWEsQ0FBQyxLQUFLLENBQUM7WUFDekIsS0FBSyxnQkFBZ0IsQ0FBQyxNQUFNO2dCQUMzQixNQUFNLENBQUMsd0JBQXdCLENBQUM7WUFDakMsS0FBSyxnQkFBZ0IsQ0FBQyxTQUFTO2dCQUM5QixNQUFNLENBQUMsMkJBQTJCLENBQUM7WUFDcEMsS0FBSyxnQkFBZ0IsQ0FBQyxVQUFVLENBQUM7WUFDakMsS0FBSyxhQUFhLENBQUMsSUFBSTtnQkFDdEIsTUFBTSxDQUFDLDRCQUE0QixDQUFDO1lBQ3JDLEtBQUssZ0JBQWdCLENBQUMsVUFBVTtnQkFDL0IsTUFBTSxDQUFDLG1CQUFtQixDQUFDO1lBQzVCLEtBQUssZ0JBQWdCLENBQUMsV0FBVztnQkFDaEMsTUFBTSxDQUFDLG9CQUFvQixDQUFDO1lBQzdCLEtBQUssZ0JBQWdCLENBQUMsVUFBVTtnQkFDL0IsTUFBTSxDQUFDLG1CQUFtQixDQUFDO1lBQzVCLEtBQUssZ0JBQWdCLENBQUMsY0FBYztnQkFDbkMsTUFBTSxDQUFDLHVCQUF1QixDQUFDO1lBQ2hDLEtBQUssZ0JBQWdCLENBQUMsWUFBWTtnQkFDakMsTUFBTSxDQUFDLHlCQUF5QixDQUFDO1lBQ2xDLEtBQUssZ0JBQWdCLENBQUMsZUFBZTtnQkFDcEMsTUFBTSxDQUFDLHdCQUF3QixDQUFDO1lBQ2pDLEtBQUssZ0JBQWdCLENBQUMsWUFBWTtnQkFDakMsTUFBTSxDQUFDLHFCQUFxQixDQUFDO1lBQzlCLEtBQUssZ0JBQWdCLENBQUMsYUFBYTtnQkFDbEMsTUFBTSxDQUFDLHNCQUFzQixDQUFDO1lBQy9CLEtBQUssZ0JBQWdCLENBQUMsWUFBWTtnQkFDakMsTUFBTSxDQUFDLHFCQUFxQixDQUFDO1lBQzlCO2dCQUNDLE1BQU0sSUFBSSxLQUFLLENBQUMsaUJBQWUsT0FBTyxzQ0FBbUMsQ0FBQyxDQUFDO1NBQzVFO0tBQ0Q7SUFFRDs7TUFFRTs7Ozs7O0lBQ0YsaURBQWlCOzs7OztJQUFqQixVQUFrQixNQUErQjtRQUNoRCxxQkFBSSxTQUFTLEdBQWdCLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUMzRCxNQUFNLENBQUMsSUFBSSxXQUFXLENBQUMsRUFBQyxLQUFLLEVBQUUsTUFBTSxDQUFDLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxDQUFDLFFBQVEsRUFBQyxFQUFFLFNBQVMsQ0FBQyxDQUFDO0tBQ3RGO0lBRUQ7O01BRUU7Ozs7OztJQUNGLGdEQUFnQjs7Ozs7SUFBaEIsVUFBaUIsTUFBK0I7UUFDL0MscUJBQUksU0FBc0IsQ0FBQztRQUMzQixFQUFFLENBQUMsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQztZQUNyQixTQUFTLEdBQUcsVUFBVSxDQUFDLFFBQVEsQ0FBQztTQUNoQztRQUNELEVBQUUsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxHQUFHLElBQUksTUFBTSxDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ3BDLFNBQVMsR0FBRyxVQUFVLENBQUMsT0FBTyxDQUFDLENBQUMsU0FBUyxFQUFFLFVBQVUsQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUNwRjtRQUNELEVBQUUsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxHQUFHLElBQUksTUFBTSxDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ3BDLFNBQVMsR0FBRyxVQUFVLENBQUMsT0FBTyxDQUFDLENBQUMsU0FBUyxFQUFFLFVBQVUsQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUNwRjtRQUNELEVBQUUsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxTQUFTLElBQUksTUFBTSxDQUFDLFNBQVMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ2hELFNBQVMsR0FBRyxVQUFVLENBQUMsT0FBTyxDQUFDLENBQUMsU0FBUyxFQUFFLFVBQVUsQ0FBQyxTQUFTLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUNoRztRQUNELEVBQUUsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxTQUFTLElBQUksTUFBTSxDQUFDLFNBQVMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ2hELFNBQVMsR0FBRyxVQUFVLENBQUMsT0FBTyxDQUFDLENBQUMsU0FBUyxFQUFFLFVBQVUsQ0FBQyxTQUFTLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUNoRzs7UUFFRCxFQUFFLENBQUMsQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQztZQUN2QixNQUFNLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxVQUFDLGVBQTJDO2dCQUNyRSxTQUFTLEdBQUcsVUFBVSxDQUFDLE9BQU8sQ0FBQyxDQUFDLFNBQVMsRUFBRSxlQUFlLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQzthQUN2RSxDQUFDLENBQUM7U0FDSDtRQUNELE1BQU0sQ0FBQyxTQUFTLENBQUM7S0FDakI7O2dCQXZHRCxVQUFVOzs7O2dDQS9GWDs7U0FnR2EscUJBQXFCOzs7Ozs7Ozs7Ozs7OztBQXlHbEMsTUFBTSx5Q0FDTCxNQUE2QjtJQUM1QixNQUFNLENBQUMsTUFBTSxJQUFJLElBQUkscUJBQXFCLEVBQUUsQ0FBQztDQUM3QztBQUVELE1BQU0sQ0FBQyxxQkFBTSxzQkFBc0IsR0FBYTs7SUFFL0MsT0FBTyxFQUFFLHFCQUFxQjtJQUM5QixJQUFJLEVBQUUsQ0FBQyxDQUFDLElBQUksUUFBUSxFQUFFLEVBQUUsSUFBSSxRQUFRLEVBQUUsRUFBRSxxQkFBcUIsQ0FBQyxDQUFDO0lBQy9ELFVBQVUsRUFBRSw4QkFBOEI7Q0FDMUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUsIFByb3ZpZGVyLCBTa2lwU2VsZiwgT3B0aW9uYWwgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgVmFsaWRhdG9ycywgVmFsaWRhdG9yRm4sIEZvcm1Db250cm9sLCBBYnN0cmFjdENvbnRyb2wgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XHJcblxyXG5pbXBvcnQgeyBUZER5bmFtaWNJbnB1dENvbXBvbmVudCB9IGZyb20gJy4uL2R5bmFtaWMtZWxlbWVudHMvZHluYW1pYy1pbnB1dC9keW5hbWljLWlucHV0LmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IFRkRHluYW1pY0ZpbGVJbnB1dENvbXBvbmVudCB9IGZyb20gJy4uL2R5bmFtaWMtZWxlbWVudHMvZHluYW1pYy1maWxlLWlucHV0L2R5bmFtaWMtZmlsZS1pbnB1dC5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBUZER5bmFtaWNUZXh0YXJlYUNvbXBvbmVudCB9IGZyb20gJy4uL2R5bmFtaWMtZWxlbWVudHMvZHluYW1pYy10ZXh0YXJlYS9keW5hbWljLXRleHRhcmVhLmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IFRkRHluYW1pY1NsaWRlVG9nZ2xlQ29tcG9uZW50IH0gZnJvbSAnLi4vZHluYW1pYy1lbGVtZW50cy9keW5hbWljLXNsaWRlLXRvZ2dsZS9keW5hbWljLXNsaWRlLXRvZ2dsZS5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBUZER5bmFtaWNDaGVja2JveENvbXBvbmVudCB9IGZyb20gJy4uL2R5bmFtaWMtZWxlbWVudHMvZHluYW1pYy1jaGVja2JveC9keW5hbWljLWNoZWNrYm94LmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IFRkRHluYW1pY1NsaWRlckNvbXBvbmVudCB9IGZyb20gJy4uL2R5bmFtaWMtZWxlbWVudHMvZHluYW1pYy1zbGlkZXIvZHluYW1pYy1zbGlkZXIuY29tcG9uZW50JztcclxuaW1wb3J0IHsgVGREeW5hbWljU2VsZWN0Q29tcG9uZW50IH0gZnJvbSAnLi4vZHluYW1pYy1lbGVtZW50cy9keW5hbWljLXNlbGVjdC9keW5hbWljLXNlbGVjdC5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBUZER5bmFtaWNEYXRlcGlja2VyQ29tcG9uZW50IH0gZnJvbSAnLi4vZHluYW1pYy1lbGVtZW50cy9keW5hbWljLWRhdGVwaWNrZXIvZHluYW1pYy1kYXRlcGlja2VyLmNvbXBvbmVudCc7XHJcblxyXG5pbXBvcnQgeyBUZXh0RWRpdG9yQ29tcG9uZW50IH0gZnJvbSAnLi4vZHluYW1pYy1lbGVtZW50cy90ZXh0LWVkaXRvci90ZXh0LWVkaXRvci5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBDb2xvclBpY2tlckNvbXBvbmVudCB9IGZyb20gJy4uL2R5bmFtaWMtZWxlbWVudHMvY29sb3ItcGlja2VyL2NvbG9yLXBpY2tlci5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBUaW1lUGlja2VyQ29tcG9uZW50IH0gZnJvbSAnLi4vZHluYW1pYy1lbGVtZW50cy90aW1lLXBpY2tlci90aW1lLXBpY2tlci5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBEYXRlVGltZVBpY2tlckNvbXBvbmVudCB9IGZyb20gJy4uL2R5bmFtaWMtZWxlbWVudHMvZGF0ZS10aW1lLXBpY2tlci9kYXRlLXRpbWUtcGlja2VyLmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IFRyYW5zbGF0ZUNvbXBvbmVudCB9IGZyb20gJy4uL2R5bmFtaWMtZWxlbWVudHMvdHJhbnNsYXRhYmxlL3RyYW5zbGF0ZS5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBGb3JtT3JnYW5pemF0aW9uQ29tcG9uZW50IH0gZnJvbSAnLi4vZHluYW1pYy1lbGVtZW50cy9mb3JtLW9yZ2FuaXphdGlvbi9mb3JtLW9yZ2FuaXphdGlvbi5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBHYWxsZXJ5U2VsZWN0b3JDb21wb25lbnQgfSBmcm9tICcuLi9keW5hbWljLWVsZW1lbnRzL2dhbGxlcnktc2VsZWN0b3IvZ2FsbGVyeS1zZWxlY3Rvci5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBUcmVlU2VsZWN0b3JDb21wb25lbnQgfSBmcm9tICcuLi9keW5hbWljLWVsZW1lbnRzL3RyZWUtc2VsZWN0b3IvdHJlZS1zZWxlY3Rvci5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBFZGl0YWJsZVRhYmxlQ29tcG9uZW50IH0gZnJvbSAnLi4vZHluYW1pYy1lbGVtZW50cy9lZGl0YWJsZS10YWJsZS9lZGl0YWJsZS10YWJsZS5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBDaGlwU2VsZWN0b3JDb21wb25lbnQgfSBmcm9tICcuLi9keW5hbWljLWVsZW1lbnRzL2NoaXAtc2VsZWN0b3IvY2hpcC1zZWxlY3Rvci5jb21wb25lbnQnO1xyXG5cclxuZXhwb3J0IGVudW0gVGREeW5hbWljVHlwZSB7XHJcblx0VGV4dCA9ICd0ZXh0JyxcclxuXHRCb29sZWFuID0gJ2Jvb2xlYW4nLFxyXG5cdE51bWJlciA9ICdudW1iZXInLFxyXG5cdEFycmF5ID0gJ2FycmF5JyxcclxuXHREYXRlID0gJ2RhdGUnXHJcbn1cclxuXHJcbmV4cG9ydCBlbnVtIFRkRHluYW1pY0VsZW1lbnQge1xyXG5cdElucHV0ID0gJ2lucHV0JyxcclxuXHREYXRlcGlja2VyID0gJ2RhdGVwaWNrZXInLFxyXG5cdFBhc3N3b3JkID0gJ3Bhc3N3b3JkJyxcclxuXHRUZXh0YXJlYSA9ICd0ZXh0YXJlYScsXHJcblx0U2xpZGVyID0gJ3NsaWRlcicsXHJcblx0U2xpZGVUb2dnbGUgPSAnc2xpZGUtdG9nZ2xlJyxcclxuXHRDaGVja2JveCA9ICdjaGVja2JveCcsXHJcblx0U2VsZWN0ID0gJ3NlbGVjdCcsXHJcblx0RmlsZUlucHV0ID0gJ2ZpbGUtaW5wdXQnLFxyXG5cdFRleHRFZGl0b3IgPSAndGV4dC1lZGl0b3InLFxyXG5cdENvbG9yUGlja2VyID0gJ2NvbG9yLXBpY2tlcicsXHJcblx0VGltZVBpY2tlciA9ICd0aW1lLXBpY2tlcicsXHJcblx0RGF0ZVRpbWVQaWNrZXIgPSAnZGF0ZS10aW1lLXBpY2tlcicsXHJcblx0T3JnYW5pemF0aW9uID0gJ29yZ2FuaXphdGlvbicsXHJcblx0R2FsbGVyeVNlbGVjdG9yID0gJ2dhbGxlcnktc2VsZWN0b3InLFxyXG5cdFRyZWVTZWxlY3RvciA9ICd0cmVlLXNlbGVjdG9yJyxcclxuXHRFZGl0YWJsZVRhYmxlID0gJ2VkaXRhYmxlLXRhYmxlJyxcclxuXHRDaGlwU2VsZWN0b3IgPSAnY2hpcC1zZWxlY3RvcidcclxufVxyXG5cclxuZXhwb3J0IGVudW0gVmlzaWJpbGl0eSB7XHJcblx0Tm9uZSA9IC0xLFxyXG5cdEFsbCA9IDAsXHJcblx0QWRkID0gMSxcclxuXHRFZGl0ID0gMlxyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIElUZER5bmFtaWNFbGVtZW50VmFsaWRhdG9yIHtcclxuXHR2YWxpZGF0b3I6IFZhbGlkYXRvckZuO1xyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIElUZER5bmFtaWNFbGVtZW50Q29uZmlnIHtcclxuXHRsYWJlbD86IHN0cmluZztcclxuXHRuYW1lOiBzdHJpbmc7XHJcblx0dHlwZTogVGREeW5hbWljVHlwZSB8IFRkRHluYW1pY0VsZW1lbnQ7XHJcblx0cmVxdWlyZWQ/OiBib29sZWFuO1xyXG5cdGRpc2FibGVkPzogYm9vbGVhbjtcclxuXHRoaWRkZW4/OiBib29sZWFuO1xyXG5cdG1pbj86IGFueTtcclxuXHRtYXg/OiBhbnk7XHJcblx0bWluTGVuZ3RoPzogYW55O1xyXG5cdG1heExlbmd0aD86IGFueTtcclxuXHRzdGVwPzogbnVtYmVyLFxyXG5cdHNlbGVjdGlvbnM/OiBzdHJpbmdbXSB8IHsgdmFsdWU6IGFueSwgbGFiZWw6IHN0cmluZyB9W107XHJcblx0ZGVmYXVsdD86IGFueTtcclxuXHRmbGV4PzogbnVtYmVyO1xyXG5cdHZhbGlkYXRvcnM/OiBJVGREeW5hbWljRWxlbWVudFZhbGlkYXRvcltdO1xyXG5cdHZpc2liaWxpdHk/IDogVmlzaWJpbGl0eTtcclxuXHRzZWxlY3RDb21wbGV4PyA6IGJvb2xlYW47XHJcblx0c2VsZWN0TXVsdGlwbGU/IDogYm9vbGVhbjtcclxuXHRzZWFyY2hhYmxlPzogYm9vbGVhbjtcclxuXHR0cmFuc2xhdGU/IDogYm9vbGVhbjtcclxuXHR0cmVlSXRlbXM/OiBhbnk7XHJcblx0YWN0aW9uPyA6ICh2YWx1ZT8gOiBhbnkpID0+IFByb21pc2U8YW55PjtcclxuXHRzY2hlbWE/IDogYW55O1xyXG5cdGRyYWdnYWJsZT8gOiBhbnk7XHJcblx0ZXh0cmFzPyA6IGFueTtcclxuXHRleHRyYUZpZWxkcz86IHN0cmluZ1tdO1xyXG5cdGNoaXBzPyA6IHsgdmFsdWUgOiBhbnkgLCBsYWJlbCA6IHN0cmluZywgYWN0aXZlIDogYm9vbGVhbn1bXTtcclxufVxyXG5cclxuZXhwb3J0IGNvbnN0IERZTkFNSUNfRUxFTUVOVF9OQU1FX1JFR0VYOiBSZWdFeHAgPSAvXlteMC05XVteXFxAXSokLztcclxuXHJcbkBJbmplY3RhYmxlKClcclxuZXhwb3J0IGNsYXNzIFRkRHluYW1pY0Zvcm1zU2VydmljZSB7XHJcblxyXG5cdC8qKlxyXG5cdCogTWV0aG9kIHRvIHZhbGlkYXRlIGlmIHRoZSBbbmFtZV0gaXMgYSBwcm9wZXIgZWxlbWVudCBuYW1lLlxyXG5cdCogVGhyb3dzIGVycm9yIGlmIG5hbWUgaXMgbm90IHZhbGlkLlxyXG5cdCovXHJcblx0dmFsaWRhdGVEeW5hbWljRWxlbWVudE5hbWUobmFtZTogc3RyaW5nKTogdm9pZCB7XHJcblx0XHRpZiAoIURZTkFNSUNfRUxFTUVOVF9OQU1FX1JFR0VYLnRlc3QobmFtZSkpIHtcclxuXHRcdFx0dGhyb3cgbmV3IEVycm9yKCdEeW5hbWljIGVsZW1lbnQgbmFtZTogXCIke25hbWV9XCIgaXMgbm90IHZhbGlkLicpO1xyXG5cdFx0fVxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0KiBHZXRzIGNvbXBvbmVudCB0byBiZSByZW5kZXJlZCBkZXBlbmRpbmcgb24gW1RkRHluYW1pY0VsZW1lbnQgfCBUZER5bmFtaWNUeXBlXVxyXG5cdCogVGhyb3dzIGVycm9yIGlmIGl0IGRvZXMgbm90IGV4aXN0cyBvciBub3Qgc3VwcG9ydGVkLlxyXG5cdCovXHJcblx0Z2V0RHluYW1pY0VsZW1lbnQoZWxlbWVudDogVGREeW5hbWljRWxlbWVudCB8IFRkRHluYW1pY1R5cGUsIHRyYW5zbGF0ZSA6IGJvb2xlYW4gPSBmYWxzZSk6IGFueSB7XHJcblx0XHRpZiAodHJhbnNsYXRlKSB7XHJcblx0XHRcdHJldHVybiBUcmFuc2xhdGVDb21wb25lbnQ7XHJcblx0XHR9XHJcblxyXG5cdFx0c3dpdGNoIChlbGVtZW50KSB7XHJcblx0XHRcdGNhc2UgVGREeW5hbWljVHlwZS5UZXh0OlxyXG5cdFx0XHRjYXNlIFRkRHluYW1pY1R5cGUuTnVtYmVyOlxyXG5cdFx0XHRjYXNlIFRkRHluYW1pY0VsZW1lbnQuSW5wdXQ6XHJcblx0XHRcdGNhc2UgVGREeW5hbWljRWxlbWVudC5QYXNzd29yZDpcclxuXHRcdFx0XHRyZXR1cm4gVGREeW5hbWljSW5wdXRDb21wb25lbnQ7XHJcblx0XHRcdGNhc2UgVGREeW5hbWljRWxlbWVudC5UZXh0YXJlYTpcclxuXHRcdFx0XHRyZXR1cm4gVGREeW5hbWljVGV4dGFyZWFDb21wb25lbnQ7XHJcblx0XHRcdGNhc2UgVGREeW5hbWljVHlwZS5Cb29sZWFuOlxyXG5cdFx0XHRjYXNlIFRkRHluYW1pY0VsZW1lbnQuU2xpZGVUb2dnbGU6XHJcblx0XHRcdFx0cmV0dXJuIFRkRHluYW1pY1NsaWRlVG9nZ2xlQ29tcG9uZW50O1xyXG5cdFx0XHRjYXNlIFRkRHluYW1pY0VsZW1lbnQuQ2hlY2tib3g6XHJcblx0XHRcdFx0cmV0dXJuIFRkRHluYW1pY0NoZWNrYm94Q29tcG9uZW50O1xyXG5cdFx0XHRjYXNlIFRkRHluYW1pY0VsZW1lbnQuU2xpZGVyOlxyXG5cdFx0XHRcdHJldHVybiBUZER5bmFtaWNTbGlkZXJDb21wb25lbnQ7XHJcblx0XHRcdGNhc2UgVGREeW5hbWljVHlwZS5BcnJheTpcclxuXHRcdFx0Y2FzZSBUZER5bmFtaWNFbGVtZW50LlNlbGVjdDpcclxuXHRcdFx0XHRyZXR1cm4gVGREeW5hbWljU2VsZWN0Q29tcG9uZW50O1xyXG5cdFx0XHRjYXNlIFRkRHluYW1pY0VsZW1lbnQuRmlsZUlucHV0OlxyXG5cdFx0XHRcdHJldHVybiBUZER5bmFtaWNGaWxlSW5wdXRDb21wb25lbnQ7XHJcblx0XHRcdGNhc2UgVGREeW5hbWljRWxlbWVudC5EYXRlcGlja2VyOlxyXG5cdFx0XHRjYXNlIFRkRHluYW1pY1R5cGUuRGF0ZTpcclxuXHRcdFx0XHRyZXR1cm4gVGREeW5hbWljRGF0ZXBpY2tlckNvbXBvbmVudDtcclxuXHRcdFx0Y2FzZSBUZER5bmFtaWNFbGVtZW50LlRleHRFZGl0b3I6XHJcblx0XHRcdFx0cmV0dXJuIFRleHRFZGl0b3JDb21wb25lbnQ7XHJcblx0XHRcdGNhc2UgVGREeW5hbWljRWxlbWVudC5Db2xvclBpY2tlcjpcclxuXHRcdFx0XHRyZXR1cm4gQ29sb3JQaWNrZXJDb21wb25lbnQ7XHJcblx0XHRcdGNhc2UgVGREeW5hbWljRWxlbWVudC5UaW1lUGlja2VyOlxyXG5cdFx0XHRcdHJldHVybiBUaW1lUGlja2VyQ29tcG9uZW50O1xyXG5cdFx0XHRjYXNlIFRkRHluYW1pY0VsZW1lbnQuRGF0ZVRpbWVQaWNrZXI6XHJcblx0XHRcdFx0cmV0dXJuIERhdGVUaW1lUGlja2VyQ29tcG9uZW50O1xyXG5cdFx0XHRjYXNlIFRkRHluYW1pY0VsZW1lbnQuT3JnYW5pemF0aW9uOlxyXG5cdFx0XHRcdHJldHVybiBGb3JtT3JnYW5pemF0aW9uQ29tcG9uZW50O1xyXG5cdFx0XHRjYXNlIFRkRHluYW1pY0VsZW1lbnQuR2FsbGVyeVNlbGVjdG9yOlxyXG5cdFx0XHRcdHJldHVybiBHYWxsZXJ5U2VsZWN0b3JDb21wb25lbnQ7XHJcblx0XHRcdGNhc2UgVGREeW5hbWljRWxlbWVudC5UcmVlU2VsZWN0b3I6XHJcblx0XHRcdFx0cmV0dXJuIFRyZWVTZWxlY3RvckNvbXBvbmVudDtcclxuXHRcdFx0Y2FzZSBUZER5bmFtaWNFbGVtZW50LkVkaXRhYmxlVGFibGU6XHJcblx0XHRcdFx0cmV0dXJuIEVkaXRhYmxlVGFibGVDb21wb25lbnQ7XHJcblx0XHRcdGNhc2UgVGREeW5hbWljRWxlbWVudC5DaGlwU2VsZWN0b3I6XHJcblx0XHRcdFx0cmV0dXJuIENoaXBTZWxlY3RvckNvbXBvbmVudDtcclxuXHRcdFx0ZGVmYXVsdDpcclxuXHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IoYEVycm9yOiB0eXBlICR7ZWxlbWVudH0gZG9lcyBub3QgZXhpc3Qgb3Igbm90IHN1cHBvcnRlZC5gKTtcclxuXHRcdH1cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCogQ3JlYXRlcyBmb3JtIGNvbnRyb2wgZm9yIGVsZW1lbnQgZGVwZW5kaW5nIFtJVGREeW5hbWljRWxlbWVudENvbmZpZ10gcHJvcGVydGllcy5cclxuXHQqL1xyXG5cdGNyZWF0ZUZvcm1Db250cm9sKGNvbmZpZzogSVRkRHluYW1pY0VsZW1lbnRDb25maWcpOiBGb3JtQ29udHJvbCB7XHJcblx0XHRsZXQgdmFsaWRhdG9yOiBWYWxpZGF0b3JGbiA9IHRoaXMuY3JlYXRlVmFsaWRhdG9ycyhjb25maWcpO1xyXG5cdFx0cmV0dXJuIG5ldyBGb3JtQ29udHJvbCh7dmFsdWU6IGNvbmZpZy5kZWZhdWx0LCBkaXNhYmxlZDogY29uZmlnLmRpc2FibGVkfSwgdmFsaWRhdG9yKTtcclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCogQ3JlYXRlcyBmb3JtIHZhbGlkYXRpb25kZXBlbmRpbmcgW0lUZER5bmFtaWNFbGVtZW50Q29uZmlnXSBwcm9wZXJ0aWVzLlxyXG5cdCovXHJcblx0Y3JlYXRlVmFsaWRhdG9ycyhjb25maWc6IElUZER5bmFtaWNFbGVtZW50Q29uZmlnKTogVmFsaWRhdG9yRm4ge1xyXG5cdFx0bGV0IHZhbGlkYXRvcjogVmFsaWRhdG9yRm47XHJcblx0XHRpZiAoY29uZmlnLnJlcXVpcmVkKSB7XHJcblx0XHRcdHZhbGlkYXRvciA9IFZhbGlkYXRvcnMucmVxdWlyZWQ7XHJcblx0XHR9XHJcblx0XHRpZiAoY29uZmlnLm1heCB8fCBjb25maWcubWF4ID09PSAwKSB7XHJcblx0XHRcdHZhbGlkYXRvciA9IFZhbGlkYXRvcnMuY29tcG9zZShbdmFsaWRhdG9yLCBWYWxpZGF0b3JzLm1heChwYXJzZUZsb2F0KGNvbmZpZy5tYXgpKV0pO1xyXG5cdFx0fVxyXG5cdFx0aWYgKGNvbmZpZy5taW4gfHwgY29uZmlnLm1pbiA9PT0gMCkge1xyXG5cdFx0XHR2YWxpZGF0b3IgPSBWYWxpZGF0b3JzLmNvbXBvc2UoW3ZhbGlkYXRvciwgVmFsaWRhdG9ycy5taW4ocGFyc2VGbG9hdChjb25maWcubWluKSldKTtcclxuXHRcdH1cclxuXHRcdGlmIChjb25maWcubWF4TGVuZ3RoIHx8IGNvbmZpZy5tYXhMZW5ndGggPT09IDApIHtcclxuXHRcdFx0dmFsaWRhdG9yID0gVmFsaWRhdG9ycy5jb21wb3NlKFt2YWxpZGF0b3IsIFZhbGlkYXRvcnMubWF4TGVuZ3RoKHBhcnNlRmxvYXQoY29uZmlnLm1heExlbmd0aCkpXSk7XHJcblx0XHR9XHJcblx0XHRpZiAoY29uZmlnLm1pbkxlbmd0aCB8fCBjb25maWcubWluTGVuZ3RoID09PSAwKSB7XHJcblx0XHRcdHZhbGlkYXRvciA9IFZhbGlkYXRvcnMuY29tcG9zZShbdmFsaWRhdG9yLCBWYWxpZGF0b3JzLm1pbkxlbmd0aChwYXJzZUZsb2F0KGNvbmZpZy5taW5MZW5ndGgpKV0pO1xyXG5cdFx0fVxyXG5cdFx0Ly8gQWRkIHByb3ZpZGVkIGN1c3RvbSB2YWxpZGF0b3JzIHRvIHRoZSB2YWxpZGF0b3IgZnVuY3Rpb25cclxuXHRcdGlmIChjb25maWcudmFsaWRhdG9ycykge1xyXG5cdFx0XHRjb25maWcudmFsaWRhdG9ycy5mb3JFYWNoKCh2YWxpZGF0b3JDb25maWc6IElUZER5bmFtaWNFbGVtZW50VmFsaWRhdG9yKSA9PiB7XHJcblx0XHRcdFx0dmFsaWRhdG9yID0gVmFsaWRhdG9ycy5jb21wb3NlKFt2YWxpZGF0b3IsIHZhbGlkYXRvckNvbmZpZy52YWxpZGF0b3JdKTtcclxuXHRcdFx0fSk7XHJcblx0XHR9XHJcblx0XHRyZXR1cm4gdmFsaWRhdG9yO1xyXG5cdH1cclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIERZTkFNSUNfRk9STVNfUFJPVklERVJfRkFDVE9SWShcclxuXHRwYXJlbnQ6IFRkRHluYW1pY0Zvcm1zU2VydmljZSk6IFRkRHluYW1pY0Zvcm1zU2VydmljZSB7XHJcblx0XHRyZXR1cm4gcGFyZW50IHx8IG5ldyBUZER5bmFtaWNGb3Jtc1NlcnZpY2UoKTtcclxuXHR9XHJcblxyXG5cdGV4cG9ydCBjb25zdCBEWU5BTUlDX0ZPUk1TX1BST1ZJREVSOiBQcm92aWRlciA9IHtcclxuXHRcdC8vIElmIHRoZXJlIGlzIGFscmVhZHkgYSBzZXJ2aWNlIGF2YWlsYWJsZSwgdXNlIHRoYXQuIE90aGVyd2lzZSwgcHJvdmlkZSBhIG5ldyBvbmUuXHJcblx0XHRwcm92aWRlOiBUZER5bmFtaWNGb3Jtc1NlcnZpY2UsXHJcblx0XHRkZXBzOiBbW25ldyBPcHRpb25hbCgpLCBuZXcgU2tpcFNlbGYoKSwgVGREeW5hbWljRm9ybXNTZXJ2aWNlXV0sXHJcblx0XHR1c2VGYWN0b3J5OiBEWU5BTUlDX0ZPUk1TX1BST1ZJREVSX0ZBQ1RPUlksXHJcblx0fTtcclxuIl19