@noaestudio/forms
Version:
Dynamic forms extension for Covalent
484 lines (483 loc) • 33.3 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes} checked by tsc
*/
import * as tslib_1 from "tslib";
import { Component, Directive, Input, HostBinding, TemplateRef } from '@angular/core';
import { ViewChild, ViewContainerRef } from '@angular/core';
import { ComponentFactoryResolver, forwardRef } from '@angular/core';
import { NG_VALUE_ACCESSOR, FormControl } from '@angular/forms';
import { TemplatePortalDirective } from '@angular/cdk/portal';
import { TdDynamicFormsService } from './services/dynamic-forms.service';
import { AbstractControlValueAccessor } from './dynamic-elements/abstract-control-value-accesor';
var /** @type {?} */ noop = function () {
// empty method
};
var ɵ0 = noop;
export var /** @type {?} */ ELEMENT_INPUT_CONTROL_VALUE_ACCESSOR = {
provide: NG_VALUE_ACCESSOR,
useExisting: forwardRef(function () { return TdDynamicElementComponent; }),
multi: true,
};
var TdDynamicFormsErrorTemplate = /** @class */ (function (_super) {
tslib_1.__extends(TdDynamicFormsErrorTemplate, _super);
function TdDynamicFormsErrorTemplate(templateRef, viewContainerRef) {
return _super.call(this, templateRef, viewContainerRef) || this;
}
TdDynamicFormsErrorTemplate.decorators = [
{ type: Directive, args: [{ selector: '[tdDynamicFormsError]ng-template' },] },
];
/** @nocollapse */
TdDynamicFormsErrorTemplate.ctorParameters = function () { return [
{ type: TemplateRef, },
{ type: ViewContainerRef, },
]; };
TdDynamicFormsErrorTemplate.propDecorators = {
"tdDynamicFormsError": [{ type: Input },],
};
return TdDynamicFormsErrorTemplate;
}(TemplatePortalDirective));
export { TdDynamicFormsErrorTemplate };
function TdDynamicFormsErrorTemplate_tsickle_Closure_declarations() {
/** @type {!Array<{type: !Function, args: (undefined|!Array<?>)}>} */
TdDynamicFormsErrorTemplate.decorators;
/**
* @nocollapse
* @type {function(): !Array<(null|{type: ?, decorators: (undefined|!Array<{type: !Function, args: (undefined|!Array<?>)}>)})>}
*/
TdDynamicFormsErrorTemplate.ctorParameters;
/** @type {!Object<string,!Array<{type: !Function, args: (undefined|!Array<?>)}>>} */
TdDynamicFormsErrorTemplate.propDecorators;
/** @type {?} */
TdDynamicFormsErrorTemplate.prototype.tdDynamicFormsError;
}
var TdDynamicElementDirective = /** @class */ (function () {
function TdDynamicElementDirective(viewContainer) {
this.viewContainer = viewContainer;
}
TdDynamicElementDirective.decorators = [
{ type: Directive, args: [{
selector: '[tdDynamicContainer]',
},] },
];
/** @nocollapse */
TdDynamicElementDirective.ctorParameters = function () { return [
{ type: ViewContainerRef, },
]; };
return TdDynamicElementDirective;
}());
export { TdDynamicElementDirective };
function TdDynamicElementDirective_tsickle_Closure_declarations() {
/** @type {!Array<{type: !Function, args: (undefined|!Array<?>)}>} */
TdDynamicElementDirective.decorators;
/**
* @nocollapse
* @type {function(): !Array<(null|{type: ?, decorators: (undefined|!Array<{type: !Function, args: (undefined|!Array<?>)}>)})>}
*/
TdDynamicElementDirective.ctorParameters;
/** @type {?} */
TdDynamicElementDirective.prototype.viewContainer;
}
var TdDynamicElementComponent = /** @class */ (function (_super) {
tslib_1.__extends(TdDynamicElementComponent, _super);
function TdDynamicElementComponent(_componentFactoryResolver, _dynamicFormsService) {
var _this = _super.call(this) || this;
_this._componentFactoryResolver = _componentFactoryResolver;
_this._dynamicFormsService = _dynamicFormsService;
/**
* Sets label to be displayed.
*/
_this.label = '';
/**
* Sets type or element of element to be rendered.
* Throws error if does not exist or no supported.
*/
_this.type = undefined;
/**
* Sets required validation checkup (if supported by element).
*/
_this.required = undefined;
_this.hidden = false;
/**
* Sets min validation checkup (if supported by element).
*/
_this.min = undefined;
/**
* Sets max validation checkup (if supported by element).
*/
_this.max = undefined;
/**
* Sets minLength validation checkup (if supported by element).
*/
_this.minLength = undefined;
/**
* Sets maxLength validation checkup (if supported by element).
*/
_this.maxLength = undefined;
/**
* Sets selections for array elements (if supported by element).
*/
_this.selections = undefined;
/**
* Makes the select complex (if supported by element)
*/
_this.selectComplex = false;
/**
* Makes the select multiple (if supported by element).
*/
_this.selectMultiple = false;
/**
* Is the component searchable? (Tree selector only)
*/
_this.searchable = false;
/**
* Flex for inputs that do not do flex automatically
*/
_this.flex = 100;
/**
* Makes the components translatable
*/
_this.translate = false;
/**
* Step for number inputs
*/
_this.step = 1;
/**
* Generic delayed action for a button
*/
_this.action = function () { return new Promise(function (resolve) { resolve({}); }); };
/**
* Array hierarchical for render a tree
*/
_this.treeItems = null;
/**
* Defines data structure for components wich renders flexible data
*/
_this.schema = null;
/**
* Determinate if an item can be dragged
*/
_this.draggable = false;
/**
* Allow pass meta info or functions that can be used by some components
*/
_this.extras = null;
/**
* Extra fields for Organization. Could be used for other components.
*/
_this.extraFields = [];
_this.chips = [];
_this.onModelChange = function (_) { return noop; };
return _this;
}
Object.defineProperty(TdDynamicElementComponent.prototype, "value", {
get: /**
* @return {?}
*/
function () {
return this._value;
},
set: /**
* @param {?} v
* @return {?}
*/
function (v) {
if (v !== this._value) {
this._value = v;
this.onChange(v);
this.onModelChange(v);
}
},
enumerable: true,
configurable: true
});
Object.defineProperty(TdDynamicElementComponent.prototype, "maxAttr", {
get: /**
* @return {?}
*/
function () {
return this.max;
},
enumerable: true,
configurable: true
});
Object.defineProperty(TdDynamicElementComponent.prototype, "minAttr", {
get: /**
* @return {?}
*/
function () {
return this.min;
},
enumerable: true,
configurable: true
});
Object.defineProperty(TdDynamicElementComponent.prototype, "stepAttr", {
get: /**
* @return {?}
*/
function () {
return this.step;
},
enumerable: true,
configurable: true
});
/**
* @return {?}
*/
TdDynamicElementComponent.prototype.ngOnInit = /**
* @return {?}
*/
function () {
var _this = this;
var /** @type {?} */ ref = this._componentFactoryResolver
.resolveComponentFactory(this._dynamicFormsService.getDynamicElement(this.type, this.translate))
.create(this.childElement.viewContainer.injector);
this.childElement.viewContainer.insert(ref.hostView);
this._instance = ref.instance;
this._instance.control = this.dynamicControl;
this._instance.label = this.label;
this._instance.type = this.type;
this._instance.value = this.value;
this._instance.required = this.required;
this._instance.hidden = this.hidden;
this._instance.min = this.min;
this._instance.max = this.max;
this._instance.minLength = this.minLength;
this._instance.maxLength = this.maxLength;
this._instance.selections = this.selections;
this._instance.flex = this.flex;
this._instance.selectComplex = this.selectComplex;
this._instance.selectMultiple = this.selectMultiple;
this._instance.searchable = this.searchable;
this._instance.translate = this.translate;
this._instance.step = this.step;
this._instance.treeItems = this.treeItems;
this._instance.action = this.action;
this._instance.schema = this.schema;
this._instance.draggable = this.draggable;
this._instance.extras = this.extras;
this._instance.extraFields = this.extraFields;
this._instance.chips = this.chips;
this._instance.registerOnChange(function (value) {
_this.value = value;
});
this.registerOnModelChange(function (value) {
// fix to check if value is NaN (type=number)
if (!Number.isNaN(value)) {
_this._instance.value = value;
}
});
};
/**
* Reassign any inputs that have changed
*/
/**
* Reassign any inputs that have changed
* @param {?} changes
* @return {?}
*/
TdDynamicElementComponent.prototype.ngOnChanges = /**
* Reassign any inputs that have changed
* @param {?} changes
* @return {?}
*/
function (changes) {
if (this._instance) {
for (var /** @type {?} */ prop in changes) {
this._instance[prop] = changes[prop].currentValue;
}
}
};
/**
* Implemented as part of ControlValueAccessor.
*/
/**
* Implemented as part of ControlValueAccessor.
* @param {?} fn
* @return {?}
*/
TdDynamicElementComponent.prototype.registerOnModelChange = /**
* Implemented as part of ControlValueAccessor.
* @param {?} fn
* @return {?}
*/
function (fn) {
this.onModelChange = fn;
};
TdDynamicElementComponent.decorators = [
{ type: Component, args: [{
providers: [TdDynamicFormsService, ELEMENT_INPUT_CONTROL_VALUE_ACCESSOR],
selector: 'td-dynamic-element',
template: '<div tdDynamicContainer></div>',
},] },
];
/** @nocollapse */
TdDynamicElementComponent.ctorParameters = function () { return [
{ type: ComponentFactoryResolver, },
{ type: TdDynamicFormsService, },
]; };
TdDynamicElementComponent.propDecorators = {
"dynamicControl": [{ type: Input },],
"label": [{ type: Input },],
"type": [{ type: Input },],
"required": [{ type: Input },],
"hidden": [{ type: Input },],
"min": [{ type: Input },],
"max": [{ type: Input },],
"minLength": [{ type: Input },],
"maxLength": [{ type: Input },],
"selections": [{ type: Input },],
"selectComplex": [{ type: Input },],
"selectMultiple": [{ type: Input },],
"searchable": [{ type: Input },],
"flex": [{ type: Input },],
"translate": [{ type: Input },],
"step": [{ type: Input },],
"action": [{ type: Input },],
"treeItems": [{ type: Input },],
"schema": [{ type: Input },],
"draggable": [{ type: Input },],
"extras": [{ type: Input },],
"extraFields": [{ type: Input },],
"chips": [{ type: Input },],
"childElement": [{ type: ViewChild, args: [TdDynamicElementDirective,] },],
"maxAttr": [{ type: HostBinding, args: ['attr.max',] },],
"minAttr": [{ type: HostBinding, args: ['attr.min',] },],
"stepAttr": [{ type: HostBinding, args: ['attr.step',] },],
};
return TdDynamicElementComponent;
}(AbstractControlValueAccessor));
export { TdDynamicElementComponent };
function TdDynamicElementComponent_tsickle_Closure_declarations() {
/** @type {!Array<{type: !Function, args: (undefined|!Array<?>)}>} */
TdDynamicElementComponent.decorators;
/**
* @nocollapse
* @type {function(): !Array<(null|{type: ?, decorators: (undefined|!Array<{type: !Function, args: (undefined|!Array<?>)}>)})>}
*/
TdDynamicElementComponent.ctorParameters;
/** @type {!Object<string,!Array<{type: !Function, args: (undefined|!Array<?>)}>>} */
TdDynamicElementComponent.propDecorators;
/** @type {?} */
TdDynamicElementComponent.prototype._instance;
/**
* Sets form control of the element.
* @type {?}
*/
TdDynamicElementComponent.prototype.dynamicControl;
/**
* Sets label to be displayed.
* @type {?}
*/
TdDynamicElementComponent.prototype.label;
/**
* Sets type or element of element to be rendered.
* Throws error if does not exist or no supported.
* @type {?}
*/
TdDynamicElementComponent.prototype.type;
/**
* Sets required validation checkup (if supported by element).
* @type {?}
*/
TdDynamicElementComponent.prototype.required;
/** @type {?} */
TdDynamicElementComponent.prototype.hidden;
/**
* Sets min validation checkup (if supported by element).
* @type {?}
*/
TdDynamicElementComponent.prototype.min;
/**
* Sets max validation checkup (if supported by element).
* @type {?}
*/
TdDynamicElementComponent.prototype.max;
/**
* Sets minLength validation checkup (if supported by element).
* @type {?}
*/
TdDynamicElementComponent.prototype.minLength;
/**
* Sets maxLength validation checkup (if supported by element).
* @type {?}
*/
TdDynamicElementComponent.prototype.maxLength;
/**
* Sets selections for array elements (if supported by element).
* @type {?}
*/
TdDynamicElementComponent.prototype.selections;
/**
* Makes the select complex (if supported by element)
* @type {?}
*/
TdDynamicElementComponent.prototype.selectComplex;
/**
* Makes the select multiple (if supported by element).
* @type {?}
*/
TdDynamicElementComponent.prototype.selectMultiple;
/**
* Is the component searchable? (Tree selector only)
* @type {?}
*/
TdDynamicElementComponent.prototype.searchable;
/**
* Flex for inputs that do not do flex automatically
* @type {?}
*/
TdDynamicElementComponent.prototype.flex;
/**
* Makes the components translatable
* @type {?}
*/
TdDynamicElementComponent.prototype.translate;
/**
* Step for number inputs
* @type {?}
*/
TdDynamicElementComponent.prototype.step;
/**
* Generic delayed action for a button
* @type {?}
*/
TdDynamicElementComponent.prototype.action;
/**
* Array hierarchical for render a tree
* @type {?}
*/
TdDynamicElementComponent.prototype.treeItems;
/**
* Defines data structure for components wich renders flexible data
* @type {?}
*/
TdDynamicElementComponent.prototype.schema;
/**
* Determinate if an item can be dragged
* @type {?}
*/
TdDynamicElementComponent.prototype.draggable;
/**
* Allow pass meta info or functions that can be used by some components
* @type {?}
*/
TdDynamicElementComponent.prototype.extras;
/**
* Extra fields for Organization. Could be used for other components.
* @type {?}
*/
TdDynamicElementComponent.prototype.extraFields;
/** @type {?} */
TdDynamicElementComponent.prototype.chips;
/** @type {?} */
TdDynamicElementComponent.prototype.childElement;
/** @type {?} */
TdDynamicElementComponent.prototype.onModelChange;
/** @type {?} */
TdDynamicElementComponent.prototype._componentFactoryResolver;
/** @type {?} */
TdDynamicElementComponent.prototype._dynamicFormsService;
}
export { ɵ0 };
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHluYW1pYy1lbGVtZW50LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiJuZzovL0Bjb3ZhbGVudC9keW5hbWljLWZvcm1zLyIsInNvdXJjZXMiOlsiZHluYW1pYy1lbGVtZW50LmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxXQUFXLEVBQW9DLFdBQVcsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUN4SCxPQUFPLEVBQUUsU0FBUyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzVELE9BQU8sRUFBRSx3QkFBd0IsRUFBZ0IsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ25GLE9BQU8sRUFBd0IsaUJBQWlCLEVBQUUsV0FBVyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDdEYsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFFOUQsT0FBTyxFQUFtQyxxQkFBcUIsRUFBRSxNQUFNLGtDQUFrQyxDQUFDO0FBQzFHLE9BQU8sRUFBRSw0QkFBNEIsRUFBRSxNQUFNLG1EQUFtRCxDQUFDO0FBRWpHLHFCQUFNLElBQUksR0FBUTs7Q0FFakIsQ0FBQzs7QUFFRixNQUFNLENBQUMscUJBQU0sb0NBQW9DLEdBQVE7SUFDeEQsT0FBTyxFQUFFLGlCQUFpQjtJQUMxQixXQUFXLEVBQUUsVUFBVSxDQUFDLGNBQU0sT0FBQSx5QkFBeUIsRUFBekIsQ0FBeUIsQ0FBQztJQUN4RCxLQUFLLEVBQUUsSUFBSTtDQUNYLENBQUM7O0lBRytDLHVEQUF1QjtJQUd2RSxxQ0FBWSxXQUE2QixFQUFFLGdCQUFrQztlQUM1RSxrQkFBTSxXQUFXLEVBQUUsZ0JBQWdCLENBQUM7S0FDcEM7O2dCQU5ELFNBQVMsU0FBQyxFQUFDLFFBQVEsRUFBRSxrQ0FBa0MsRUFBQzs7OztnQkFuQjRCLFdBQVc7Z0JBQzVFLGdCQUFnQjs7O3dDQXFCbEMsS0FB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U0FBUyxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDO1FBQ3hDLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUM7UUFDcEMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQztRQUM5QixJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDO1FBQzlCLElBQUksQ0FBQyxTQUFTLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUM7UUFDMUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQztRQUMxQyxJQUFJLENBQUMsU0FBUyxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDO1FBQzVDLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUM7UUFDaEMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxhQUFhLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQztRQUNsRCxJQUFJLENBQUMsU0FBUyxDQUFDLGNBQWMsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDO1FBQ3BELElBQUksQ0FBQyxTQUFTLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUM7UUFDNUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQztRQUMxQyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDO1FBQ2hDLElBQUksQ0FBQyxTQUFTLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUM7UUFDMUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQztRQUNwQyxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDO1FBQ3BDLElBQUksQ0FBQyxTQUFTLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUM7UUFDMUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQztRQUNwQyxJQUFJLENBQUMsU0FBUyxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDO1FBQzlDLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUM7UUFFbEMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxnQkFBZ0IsQ0FBQyxVQUFDLEtBQVU7WUFDMUMsS0FBSSxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUM7U0FDbkIsQ0FBQyxDQUFDO1FBQ0gsSUFBSSxDQUFDLHFCQUFxQixDQUFDLFVBQUMsS0FBVTs7WUFFckMsRUFBRSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDMUIsS0FBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDO2FBQzdCO1NBRUQsQ0FBQyxDQUFDO0tBQ0g7SUFFRjs7TUFFRTs7Ozs7O0lBQ0YsK0NBQVc7Ozs7O0lBQVgsVUFBWSxPQUFzQjtRQUNqQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQztZQUNwQixHQUFHLENBQUMsQ0FBQyxxQkFBSSxJQUFJLElBQUksT0FBTyxDQUFDLENBQUMsQ0FBQztnQkFDMUIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsWUFBWSxDQUFDO2FBQ2xEO1NBQ0Q7S0FDRDtJQUVEOztNQUVFOzs7Ozs7SUFDRix5REFBcUI7Ozs7O0lBQXJCLFVBQXNCLEVBQU87UUFDNUIsSUFBSSxDQUFDLGFBQWEsR0FBRyxFQUFFLENBQUM7S0FDeEI7O2dCQW5ORCxTQUFTLFNBQUM7b0JBQ1YsU0FBUyxFQUFFLENBQUUscUJBQXFCLEVBQUUsb0NBQW9DLENBQUU7b0JBQzFFLFFBQVEsRUFBRSxvQkFBb0I7b0JBQzlCLFFBQVEsRUFBRSxnQ0FBZ0M7aUJBQzFDOzs7O2dCQXJDUSx3QkFBd0I7Z0JBSVMscUJBQXFCOzs7bUNBb0Q3RCxLQUFLOzBCQUtMLEtBQUs7eUJBTUwsS0FBSzs2QkFLTCxLQUFLOzJCQUVMLEtBQUs7d0JBS0wsS0FBSzt3QkFLTCxLQUFLOzhCQUtMLEtBQUs7OEJBS0wsS0FBSzsrQkFLTCxLQUFLO2tDQUtMLEtBQUs7bUNBS0wsS0FBSzsrQkFLTCxLQUFLO3lCQUtMLEtBQUs7OEJBS0wsS0FBSzt5QkFLTCxLQUFLOzJCQUtMLEtBQUs7OEJBS0wsS0FBSzsyQkFLTCxLQUFLOzhCQUtMLEtBQUs7MkJBS0wsS0FBSztnQ0FLTCxLQUFLOzBCQUVMLEtBQUs7aUNBRUwsU0FBUyxTQUFDLHlCQUF5Qjs0QkFFbkMsV0FBVyxTQUFDLFVBQVU7NEJBS3RCLFdBQVcsU0FBQyxVQUFVOzZCQUt0QixXQUFXLFNBQUMsV0FBVzs7b0NBakx6QjtFQXdDK0MsNEJBQTRCO1NBQTlELHlCQUF5QiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgRGlyZWN0aXZlLCBJbnB1dCwgSG9zdEJpbmRpbmcsIE9uSW5pdCwgU2ltcGxlQ2hhbmdlcywgT25DaGFuZ2VzLCBUZW1wbGF0ZVJlZiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBWaWV3Q2hpbGQsIFZpZXdDb250YWluZXJSZWYgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgQ29tcG9uZW50RmFjdG9yeVJlc29sdmVyLCBDb21wb25lbnRSZWYsIGZvcndhcmRSZWYgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgQ29udHJvbFZhbHVlQWNjZXNzb3IsIE5HX1ZBTFVFX0FDQ0VTU09SLCBGb3JtQ29udHJvbCB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcclxuaW1wb3J0IHsgVGVtcGxhdGVQb3J0YWxEaXJlY3RpdmUgfSBmcm9tICdAYW5ndWxhci9jZGsvcG9ydGFsJztcclxuXHJcbmltcG9ydCB7IFRkRHluYW1pY0VsZW1lbnQsIFRkRHluYW1pY1R5cGUsIFRkRHluYW1pY0Zvcm1zU2VydmljZSB9IGZyb20gJy4vc2VydmljZXMvZHluYW1pYy1mb3Jtcy5zZXJ2aWNlJztcclxuaW1wb3J0IHsgQWJzdHJhY3RDb250cm9sVmFsdWVBY2Nlc3NvciB9IGZyb20gJy4vZHluYW1pYy1lbGVtZW50cy9hYnN0cmFjdC1jb250cm9sLXZhbHVlLWFjY2Vzb3InO1xyXG5cclxuY29uc3Qgbm9vcDogYW55ID0gKCkgPT4ge1xyXG5cdC8vIGVtcHR5IG1ldGhvZFxyXG59O1xyXG5cclxuZXhwb3J0IGNvbnN0IEVMRU1FTlRfSU5QVVRfQ09OVFJPTF9WQUxVRV9BQ0NFU1NPUjogYW55ID0ge1xyXG5cdHByb3ZpZGU6IE5HX1ZBTFVFX0FDQ0VTU09SLFxyXG5cdHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgpID0+IFRkRHluYW1pY0VsZW1lbnRDb21wb25lbnQpLFxyXG5cdG11bHRpOiB0cnVlLFxyXG59O1xyXG5cclxuQERpcmVjdGl2ZSh7c2VsZWN0b3I6ICdbdGREeW5hbWljRm9ybXNFcnJvcl1uZy10ZW1wbGF0ZSd9KVxyXG5leHBvcnQgY2xhc3MgVGREeW5hbWljRm9ybXNFcnJvclRlbXBsYXRlIGV4dGVuZHMgVGVtcGxhdGVQb3J0YWxEaXJlY3RpdmUge1xyXG5cclxuXHRASW5wdXQoKSB0ZER5bmFtaWNGb3Jtc0Vycm9yOiBzdHJpbmc7XHJcblx0Y29uc3RydWN0b3IodGVtcGxhdGVSZWY6IFRlbXBsYXRlUmVmPGFueT4sIHZpZXdDb250YWluZXJSZWY6IFZpZXdDb250YWluZXJSZWYpIHtcclxuXHRcdHN1cGVyKHRlbXBsYXRlUmVmLCB2aWV3Q29udGFpbmVyUmVmKTtcclxuXHR9XHJcbn1cclxuXHJcbkBEaXJlY3RpdmUoe1xyXG5cdHNlbGVjdG9yOiAnW3RkRHluYW1pY0NvbnRhaW5lcl0nLFxyXG59KVxyXG5leHBvcnQgY2xhc3MgVGREeW5hbWljRWxlbWVudERpcmVjdGl2ZSB7XHJcblx0Y29uc3RydWN0b3IocHVibGljIHZpZXdDb250YWluZXI6IFZpZXdDb250YWluZXJSZWYpIHsgfVxyXG59XHJcblxyXG5AQ29tcG9uZW50KHtcclxuXHRwcm92aWRlcnM6IFsgVGREeW5hbWljRm9ybXNTZXJ2aWNlLCBFTEVNRU5UX0lOUFVUX0NPTlRST0xfVkFMVUVfQUNDRVNTT1IgXSxcclxuXHRzZWxlY3RvcjogJ3RkLWR5bmFtaWMtZWxlbWVudCcsXHJcblx0dGVtcGxhdGU6ICc8ZGl2IHRkRHluYW1pY0NvbnRhaW5lcj48L2Rpdj4nLFxyXG59KVxyXG5leHBvcnQgY2xhc3MgVGREeW5hbWljRWxlbWVudENvbXBvbmVudCBleHRlbmRzIEFic3RyYWN0Q29udHJvbFZhbHVlQWNjZXNzb3IgaW1wbGVtZW50cyBDb250cm9sVmFsdWVBY2Nlc3NvciwgT25Jbml0LCBPbkNoYW5nZXMge1xyXG5cclxuXHRwcml2YXRlIF9pbnN0YW5jZTogYW55O1xyXG5cclxuXHRzZXQgdmFsdWUodjogYW55KSB7XHJcblx0XHRpZiAodiAhPT0gdGhpcy5fdmFsdWUpIHtcclxuXHRcdFx0dGhpcy5fdmFsdWUgPSB2O1xyXG5cdFx0XHR0aGlzLm9uQ2hhbmdlKHYpO1xyXG5cdFx0XHR0aGlzLm9uTW9kZWxDaGFuZ2Uodik7XHJcblx0XHR9XHJcblx0fVxyXG5cdGdldCB2YWx1ZSgpOiBhbnkge1xyXG5cdFx0cmV0dXJuIHRoaXMuX3ZhbHVlO1xyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0KiBTZXRzIGZvcm0gY29udHJvbCBvZiB0aGUgZWxlbWVudC5cclxuXHQqL1xyXG5cdEBJbnB1dCgpIGR5bmFtaWNDb250cm9sOiBGb3JtQ29udHJvbDtcclxuXHJcblx0LyoqXHJcblx0KiBTZXRzIGxhYmVsIHRvIGJlIGRpc3BsYXllZC5cclxuXHQqL1xyXG5cdEBJbnB1dCgpIGxhYmVsOiBzdHJpbmcgPSAnJztcclxuXHJcblx0LyoqXHJcblx0KiBTZXRzIHR5cGUgb3IgZWxlbWVudCBvZiBlbGVtZW50IHRvIGJlIHJlbmRlcmVkLlxyXG5cdCogVGhyb3dzIGVycm9yIGlmIGRvZXMgbm90IGV4aXN0IG9yIG5vIHN1cHBvcnRlZC5cclxuXHQqL1xyXG5cdEBJbnB1dCgpIHR5cGU6IFRkRHluYW1pY0VsZW1lbnQgfCBUZER5bmFtaWNUeXBlID0gdW5kZWZpbmVkO1xyXG5cclxuXHQvKipcclxuXHQqIFNldHMgcmVxdWlyZWQgdmFsaWRhdGlvbiBjaGVja3VwIChpZiBzdXBwb3J0ZWQgYnkgZWxlbWVudCkuXHJcblx0Ki9cclxuXHRASW5wdXQoKSByZXF1aXJlZDogYm9vbGVhbiA9IHVuZGVmaW5lZDtcclxuXHJcblx0QElucHV0KCkgaGlkZGVuIDogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuXHQvKipcclxuXHQqIFNldHMgbWluIHZhbGlkYXRpb24gY2hlY2t1cCAoaWYgc3VwcG9ydGVkIGJ5IGVsZW1lbnQpLlxyXG5cdCovXHJcblx0QElucHV0KCkgbWluOiBudW1iZXIgPSB1bmRlZmluZWQ7XHJcblxyXG5cdC8qKlxyXG5cdCogU2V0cyBtYXggdmFsaWRhdGlvbiBjaGVja3VwIChpZiBzdXBwb3J0ZWQgYnkgZWxlbWVudCkuXHJcblx0Ki9cclxuXHRASW5wdXQoKSBtYXg6IG51bWJlciA9IHVuZGVmaW5lZDtcclxuXHJcblx0LyoqXHJcblx0KiBTZXRzIG1pbkxlbmd0aCB2YWxpZGF0aW9uIGNoZWNrdXAgKGlmIHN1cHBvcnRlZCBieSBlbGVtZW50KS5cclxuXHQqL1xyXG5cdEBJbnB1dCgpIG1pbkxlbmd0aDogbnVtYmVyID0gdW5kZWZpbmVkO1xyXG5cclxuXHQvKipcclxuXHQqIFNldHMgbWF4TGVuZ3RoIHZhbGlkYXRpb24gY2hlY2t1cCAoaWYgc3VwcG9ydGVkIGJ5IGVsZW1lbnQpLlxyXG5cdCovXHJcblx0QElucHV0KCkgbWF4TGVuZ3RoOiBudW1iZXIgPSB1bmRlZmluZWQ7XHJcblxyXG5cdC8qKlxyXG5cdCogU2V0cyBzZWxlY3Rpb25zIGZvciBhcnJheSBlbGVtZW50cyAoaWYgc3VwcG9ydGVkIGJ5IGVsZW1lbnQpLlxyXG5cdCovXHJcblx0QElucHV0KCkgc2VsZWN0aW9uczogYW55W10gPSB1bmRlZmluZWQ7XHJcblxyXG5cdC8qKlxyXG5cdCogTWFrZXMgdGhlIHNlbGVjdCBjb21wbGV4IChpZiBzdXBwb3J0ZWQgYnkgZWxlbWVudClcclxuXHQqL1xyXG5cdEBJbnB1dCgpIHNlbGVjdENvbXBsZXggOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG5cdC8qKlxyXG5cdCogTWFrZXMgdGhlIHNlbGVjdCBtdWx0aXBsZSAoaWYgc3VwcG9ydGVkIGJ5IGVsZW1lbnQpLlxyXG5cdCovXHJcblx0QElucHV0KCkgc2VsZWN0TXVsdGlwbGUgOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG5cdC8qKlxyXG5cdCogSXMgdGhlIGNvbXBvbmVudCBzZWFyY2hhYmxlPyAoVHJlZSBzZWxlY3RvciBvbmx5KVxyXG5cdCovXHJcblx0QElucHV0KCkgc2VhcmNoYWJsZSA6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcblx0LyoqXHJcblx0KiBGbGV4IGZvciBpbnB1dHMgdGhhdCBkbyBub3QgZG8gZmxleCBhdXRvbWF0aWNhbGx5XHJcblx0Ki9cclxuXHRASW5wdXQoKSBmbGV4IDogbnVtYmVyID0gMTAwO1xyXG5cclxuXHQvKipcclxuXHQqIE1ha2VzIHRoZSBjb21wb25lbnRzIHRyYW5zbGF0YWJsZVxyXG5cdCovXHJcblx0QElucHV0KCkgdHJhbnNsYXRlIDogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuXHQvKipcclxuXHQqIFN0ZXAgZm9yIG51bWJlciBpbnB1dHNcclxuXHQqL1xyXG5cdEBJbnB1dCgpIHN0ZXAgOiBudW1iZXIgPSAxO1xyXG5cclxuXHQvKipcclxuXHQqIEdlbmVyaWMgZGVsYXllZCBhY3Rpb24gZm9yIGEgYnV0dG9uXHJcblx0Ki9cclxuXHRASW5wdXQoKSBhY3Rpb24gOiAoKSA9PiBQcm9taXNlPGFueT4gPSAoKSA9PiBuZXcgUHJvbWlzZTxhbnk+KHJlc29sdmUgPT4geyByZXNvbHZlKHt9KTsgfSkgO1xyXG5cclxuXHQvKipcclxuXHQqIEFycmF5IGhpZXJhcmNoaWNhbCBmb3IgcmVuZGVyIGEgdHJlZVxyXG5cdCovXHJcblx0QElucHV0KCkgdHJlZUl0ZW1zIDogYW55ID0gbnVsbDtcclxuXHJcblx0LyoqXHJcblx0KiBEZWZpbmVzIGRhdGEgc3RydWN0dXJlIGZvciBjb21wb25lbnRzIHdpY2ggcmVuZGVycyBmbGV4aWJsZSBkYXRhXHJcblx0Ki9cclxuXHRASW5wdXQoKSBzY2hlbWEgOiBhbnkgPSBudWxsO1xyXG5cclxuXHQvKipcclxuXHQqIERldGVybWluYXRlIGlmIGFuIGl0ZW0gY2FuIGJlIGRyYWdnZWRcclxuXHQqL1xyXG5cdEBJbnB1dCgpIGRyYWdnYWJsZSA6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcblx0LyoqXHJcblx0KiBBbGxvdyBwYXNzIG1ldGEgaW5mbyBvciBmdW5jdGlvbnMgdGhhdCBjYW4gYmUgdXNlZCBieSBzb21lIGNvbXBvbmVudHNcclxuXHQqL1xyXG5cdEBJbnB1dCgpIGV4dHJhcyA6IGFueSA9IG51bGw7XHJcblxyXG5cdC8qKlxyXG5cdCogRXh0cmEgZmllbGRzIGZvciBPcmdhbml6YXRpb24uIENvdWxkIGJlIHVzZWQgZm9yIG90aGVyIGNvbXBvbmVudHMuXHJcblx0Ki9cclxuXHRASW5wdXQoKSBleHRyYUZpZWxkcyA6IHN0cmluZ1tdID0gW107XHJcblxyXG5cdEBJbnB1dCgpIGNoaXBzIDogYW55W10gPSBbXTtcclxuXHJcblx0QFZpZXdDaGlsZChUZER5bmFtaWNFbGVtZW50RGlyZWN0aXZlKSBjaGlsZEVsZW1lbnQ6IFRkRHluYW1pY0VsZW1lbnREaXJlY3RpdmU7XHJcblxyXG5cdEBIb3N0QmluZGluZygnYXR0ci5tYXgnKVxyXG5cdGdldCBtYXhBdHRyKCk6IGFueSB7XHJcblx0XHRyZXR1cm4gdGhpcy5tYXg7XHJcblx0fVxyXG5cclxuXHRASG9zdEJpbmRpbmcoJ2F0dHIubWluJylcclxuXHRnZXQgbWluQXR0cigpOiBhbnkge1xyXG5cdFx0cmV0dXJuIHRoaXMubWluO1xyXG5cdH1cclxuXHJcblx0QEhvc3RCaW5kaW5nKCdhdHRyLnN0ZXAnKVxyXG5cdGdldCBzdGVwQXR0cigpOiBhbnkge1xyXG5cdFx0cmV0dXJuIHRoaXMuc3RlcDtcclxuXHR9XHJcblxyXG5cdGNvbnN0cnVjdG9yKHByaXZhdGUgX2NvbXBvbmVudEZhY3RvcnlSZXNvbHZlcjogQ29tcG9uZW50RmFjdG9yeVJlc29sdmVyLFxyXG5cdFx0cHJpdmF0ZSBfZHluYW1pY0Zvcm1zU2VydmljZTogVGREeW5hbWljRm9ybXNTZXJ2aWNlKSB7XHJcblx0XHRcdHN1cGVyKCk7XHJcblx0XHR9XHJcblxyXG5cdFx0bmdPbkluaXQoKTogdm9pZCB7XHJcblx0XHRcdGxldCByZWY6IENvbXBvbmVudFJlZjxhbnk+ID0gdGhpcy5fY29tcG9uZW50RmFjdG9yeVJlc29sdmVyXHJcblx0XHRcdFx0LnJlc29sdmVDb21wb25lbnRGYWN0b3J5KHRoaXMuX2R5bmFtaWNGb3Jtc1NlcnZpY2UuZ2V0RHluYW1pY0VsZW1lbnQodGhpcy50eXBlLHRoaXMudHJhbnNsYXRlKSlcclxuXHRcdFx0XHQuY3JlYXRlKHRoaXMuY2hpbGRFbGVtZW50LnZpZXdDb250YWluZXIuaW5qZWN0b3IpO1xyXG5cdFx0XHR0aGlzLmNoaWxkRWxlbWVudC52aWV3Q29udGFpbmVyLmluc2VydChyZWYuaG9zdFZpZXcpO1xyXG5cdFx0XHR0aGlzLl9pbnN0YW5jZSA9IHJlZi5pbnN0YW5jZTtcclxuXHRcdFx0dGhpcy5faW5zdGFuY2UuY29udHJvbCA9IHRoaXMuZHluYW1pY0NvbnRyb2w7XHJcblx0XHRcdHRoaXMuX2luc3RhbmNlLmxhYmVsID0gdGhpcy5sYWJlbDtcclxuXHRcdFx0dGhpcy5faW5zdGFuY2UudHlwZSA9IHRoaXMudHlwZTtcclxuXHRcdFx0dGhpcy5faW5zdGFuY2UudmFsdWUgPSB0aGlzLnZhbHVlO1xyXG5cdFx0XHR0aGlzLl9pbnN0YW5jZS5yZXF1aXJlZCA9IHRoaXMucmVxdWlyZWQ7XHJcblx0XHRcdHRoaXMuX2luc3RhbmNlLmhpZGRlbiA9IHRoaXMuaGlkZGVuO1xyXG5cdFx0XHR0aGlzLl9pbnN0YW5jZS5taW4gPSB0aGlzLm1pbjtcclxuXHRcdFx0dGhpcy5faW5zdGFuY2UubWF4ID0gdGhpcy5tYXg7XHJcblx0XHRcdHRoaXMuX2luc3RhbmNlLm1pbkxlbmd0aCA9IHRoaXMubWluTGVuZ3RoO1xyXG5cdFx0XHR0aGlzLl9pbnN0YW5jZS5tYXhMZW5ndGggPSB0aGlzLm1heExlbmd0aDtcclxuXHRcdFx0dGhpcy5faW5zdGFuY2Uuc2VsZWN0aW9ucyA9IHRoaXMuc2VsZWN0aW9ucztcclxuXHRcdFx0dGhpcy5faW5zdGFuY2UuZmxleCA9IHRoaXMuZmxleDtcclxuXHRcdFx0dGhpcy5faW5zdGFuY2Uuc2VsZWN0Q29tcGxleCA9IHRoaXMuc2VsZWN0Q29tcGxleDtcclxuXHRcdFx0dGhpcy5faW5zdGFuY2Uuc2VsZWN0TXVsdGlwbGUgPSB0aGlzLnNlbGVjdE11bHRpcGxlO1xyXG5cdFx0XHR0aGlzLl9pbnN0YW5jZS5zZWFyY2hhYmxlID0gdGhpcy5zZWFyY2hhYmxlO1xyXG5cdFx0XHR0aGlzLl9pbnN0YW5jZS50cmFuc2xhdGUgPSB0aGlzLnRyYW5zbGF0ZTtcclxuXHRcdFx0dGhpcy5faW5zdGFuY2Uuc3RlcCA9IHRoaXMuc3RlcDtcclxuXHRcdFx0dGhpcy5faW5zdGFuY2UudHJlZUl0ZW1zID0gdGhpcy50cmVlSXRlbXM7XHJcblx0XHRcdHRoaXMuX2luc3RhbmNlLmFjdGlvbiA9IHRoaXMuYWN0aW9uO1xyXG5cdFx0XHR0aGlzLl9pbnN0YW5jZS5zY2hlbWEgPSB0aGlzLnNjaGVtYTtcclxuXHRcdFx0dGhpcy5faW5zdGFuY2UuZHJhZ2dhYmxlID0gdGhpcy5kcmFnZ2FibGU7XHJcblx0XHRcdHRoaXMuX2luc3RhbmNlLmV4dHJhcyA9IHRoaXMuZXh0cmFzO1xyXG5cdFx0XHR0aGlzLl9pbnN0YW5jZS5leHRyYUZpZWxkcyA9IHRoaXMuZXh0cmFGaWVsZHM7XHJcblx0XHRcdHRoaXMuX2luc3RhbmNlLmNoaXBzID0gdGhpcy5jaGlwcztcclxuXHJcblx0XHRcdHRoaXMuX2luc3RhbmNlLnJlZ2lzdGVyT25DaGFuZ2UoKHZhbHVlOiBhbnkpID0+IHtcclxuXHRcdFx0XHR0aGlzLnZhbHVlID0gdmFsdWU7XHJcblx0XHRcdH0pO1xyXG5cdFx0XHR0aGlzLnJlZ2lzdGVyT25Nb2RlbENoYW5nZSgodmFsdWU6IGFueSkgPT4ge1xyXG5cdFx0XHRcdC8vIGZpeCB0byBjaGVjayBpZiB2YWx1ZSBpcyBOYU4gKHR5cGU9bnVtYmVyKVxyXG5cdFx0XHRcdGlmICghTnVtYmVyLmlzTmFOKHZhbHVlKSkge1xyXG5cdFx0XHRcdFx0dGhpcy5faW5zdGFuY2UudmFsdWUgPSB2YWx1ZTtcclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHR9KTtcclxuXHRcdH1cclxuXHJcblx0LyoqXHJcblx0KiBSZWFzc2lnbiBhbnkgaW5wdXRzIHRoYXQgaGF2ZSBjaGFuZ2VkXHJcblx0Ki9cclxuXHRuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XHJcblx0XHRpZiAodGhpcy5faW5zdGFuY2UpIHtcclxuXHRcdFx0Zm9yIChsZXQgcHJvcCBpbiBjaGFuZ2VzKSB7XHJcblx0XHRcdFx0dGhpcy5faW5zdGFuY2VbcHJvcF0gPSBjaGFuZ2VzW3Byb3BdLmN1cnJlbnRWYWx1ZTtcclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0KiBJbXBsZW1lbnRlZCBhcyBwYXJ0IG9mIENvbnRyb2xWYWx1ZUFjY2Vzc29yLlxyXG5cdCovXHJcblx0cmVnaXN0ZXJPbk1vZGVsQ2hhbmdlKGZuOiBhbnkpOiB2b2lkIHtcclxuXHRcdHRoaXMub25Nb2RlbENoYW5nZSA9IGZuO1xyXG5cdH1cclxuXHJcblx0b25Nb2RlbENoYW5nZSA9IChfOiBhbnkpID0+IG5vb3A7XHJcbn1cclxuIl19