@zodiac-ui/formula
Version:
Formula is a powerful form generator built for Angular. Inspired by Angular Router, Formula provides a declarative interface for building reactive forms.
201 lines • 17.2 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
import { Directive, EventEmitter, Inject, Injector, Input, Optional, Output, SkipSelf, ViewContainerRef, } from "@angular/core";
import { createRenderer } from "./renderer/renderers";
import { createModel } from "./node/utils";
import { FORMULA_OUTLET } from "./constants";
import { takeUntil } from "rxjs/operators";
import { createFormulaNode } from "./node/nodes";
/**
* Creates a {link FormulaNode} tree that is used to render a form. `FormulaDirective` provides a declarative
* approach for dynamic forms creation
*
* `FormulaDirective` requires a {link Formula}, if a falsy value is set the view will clear and the
* form will get destroyed.
*
* ### Usage
*
* The simplest case is a formula with a single field.
*
* ```ts
* \@Component({
* selector: "z-example",
* template: `
* <z-formula [formula]="formula" [value]="value"></z-formula>
* `,
* })
* export class ExampleComponent {
* value = {
* exampleText: null
* }
* formula: Formula = {
* type: FormulaType.CONTROL,
* name: "exampleText",
* component: TextFieldComponent,
* data: {
* label: "Example Text",
* placeholder: "Type text here"
* },
* }
* }
* ```
*
* In this example we are declaring a `formula` that contains a single form control called
* `exampleText`. It is rendered with a component, which is up to the user to implement. The
* concept is similar to that of Angular route components. For example, the `TextFieldComponent`
* may be as simple as this:
*
* ```ts
* \@Component({
* selector: "z-text-field",
* template: `
* <label [innerHTML]="ctx.data.label"></label>
* <input [formControl]="ctx.model" />
* `,
* })
* export class TextFieldComponent {
* constructor(public ctx: FormulaContext) {}
* }
* ```
*
* Every Formula component receives a {link FormulaContext} containing the model, data and resolve
* data defined for that node in the `FormulaNode` tree
*
*/
export class FormulaDirective {
/**
* @param {?} injector
* @param {?} vcr
* @param {?} parent
*/
constructor(injector, vcr, parent) {
this.valueChanges = new EventEmitter();
this.statusChanges = new EventEmitter();
this.submit = new EventEmitter();
this.injector = Injector.create({
parent: injector,
providers: [
{
provide: ViewContainerRef,
useValue: vcr,
},
],
});
this.parent = parent;
this.root = parent ? parent.root : this;
}
/**
* @param {?} changes
* @return {?}
*/
ngOnChanges(changes) {
if (changes.formula) {
if (!changes.formula.isFirstChange()) {
this.renderer.destroy();
}
if (this.formula) {
this.renderer = createRenderer(this.formula, this.injector);
this.render();
}
}
if (changes.value) {
this.setValue(this.value);
}
}
/**
* @return {?}
*/
ngOnDestroy() {
if (this.renderer) {
this.renderer.destroy();
}
}
/**
* @param {?} value
* @return {?}
*/
setValue(value) {
if (this.node) {
this.node.setValue(value);
}
}
/**
* @param {?} form
* @return {?}
*/
setForm(form) {
if (this.form) {
throw new Error("Only one top level NgForm is allowed");
}
this.form = form;
form.ngSubmit.subscribe(this.submit);
}
/**
* @private
* @return {?}
*/
render() {
this.model = createModel(this.formula, this.parent ? this.parent.node.model : null);
this.node = createFormulaNode(this.formula, this.model, this.parent ? this.parent.node : null);
this.renderer.render(this.node);
this.model.valueChanges
.pipe(takeUntil(this.renderer.destroyed$))
.subscribe(this.valueChanges);
this.model.statusChanges
.pipe(takeUntil(this.renderer.destroyed$))
.subscribe(this.statusChanges);
}
}
FormulaDirective.decorators = [
{ type: Directive, args: [{
selector: "z-formula, [zFormula]",
providers: [
{
provide: FORMULA_OUTLET,
useExisting: FormulaDirective,
},
],
},] }
];
/** @nocollapse */
FormulaDirective.ctorParameters = () => [
{ type: Injector },
{ type: ViewContainerRef },
{ type: undefined, decorators: [{ type: SkipSelf }, { type: Optional }, { type: Inject, args: [FORMULA_OUTLET,] }] }
];
FormulaDirective.propDecorators = {
formula: [{ type: Input }],
value: [{ type: Input }],
valueChanges: [{ type: Output }],
statusChanges: [{ type: Output }],
submit: [{ type: Output }]
};
if (false) {
/** @type {?} */
FormulaDirective.prototype.node;
/** @type {?} */
FormulaDirective.prototype.model;
/** @type {?} */
FormulaDirective.prototype.renderer;
/** @type {?} */
FormulaDirective.prototype.injector;
/** @type {?} */
FormulaDirective.prototype.parent;
/** @type {?} */
FormulaDirective.prototype.root;
/** @type {?} */
FormulaDirective.prototype.form;
/** @type {?} */
FormulaDirective.prototype.formula;
/** @type {?} */
FormulaDirective.prototype.value;
/** @type {?} */
FormulaDirective.prototype.valueChanges;
/** @type {?} */
FormulaDirective.prototype.statusChanges;
/** @type {?} */
FormulaDirective.prototype.submit;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9ybXVsYS5kaXJlY3RpdmUuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9Aem9kaWFjLXVpL2Zvcm11bGEvIiwic291cmNlcyI6WyJsaWIvZm9ybXVsYS5kaXJlY3RpdmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7OztBQUFBLE9BQU8sRUFDSCxTQUFTLEVBQ1QsWUFBWSxFQUNaLE1BQU0sRUFDTixRQUFRLEVBQ1IsS0FBSyxFQUdMLFFBQVEsRUFDUixNQUFNLEVBQ04sUUFBUSxFQUNSLGdCQUFnQixHQUNuQixNQUFNLGVBQWUsQ0FBQTtBQUd0QixPQUFPLEVBQUUsY0FBYyxFQUFtQixNQUFNLHNCQUFzQixDQUFBO0FBQ3RFLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxjQUFjLENBQUE7QUFDMUMsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLGFBQWEsQ0FBQTtBQUM1QyxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUE7QUFDMUMsT0FBTyxFQUFFLGlCQUFpQixFQUFlLE1BQU0sY0FBYyxDQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFvRTdELE1BQU0sT0FBTyxnQkFBZ0I7Ozs7OztJQXdCekIsWUFDSSxRQUFrQixFQUNsQixHQUFxQixFQUMyQixNQUFxQjtRQVh6RCxpQkFBWSxHQUFzQixJQUFJLFlBQVksRUFBRSxDQUFBO1FBR3BELGtCQUFhLEdBQXNCLElBQUksWUFBWSxFQUFFLENBQUE7UUFHckQsV0FBTSxHQUFzQixJQUFJLFlBQVksRUFBRSxDQUFBO1FBTzFELElBQUksQ0FBQyxRQUFRLEdBQUcsUUFBUSxDQUFDLE1BQU0sQ0FBQztZQUM1QixNQUFNLEVBQUUsUUFBUTtZQUNoQixTQUFTLEVBQUU7Z0JBQ1A7b0JBQ0ksT0FBTyxFQUFFLGdCQUFnQjtvQkFDekIsUUFBUSxFQUFFLEdBQUc7aUJBQ2hCO2FBQ0o7U0FDSixDQUFDLENBQUE7UUFDRixJQUFJLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQTtRQUNwQixJQUFJLENBQUMsSUFBSSxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFBO0lBQzNDLENBQUM7Ozs7O0lBRU0sV0FBVyxDQUFDLE9BQU87UUFDdEIsSUFBSSxPQUFPLENBQUMsT0FBTyxFQUFFO1lBQ2pCLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLGFBQWEsRUFBRSxFQUFFO2dCQUNsQyxJQUFJLENBQUMsUUFBUSxDQUFDLE9BQU8sRUFBRSxDQUFBO2FBQzFCO1lBQ0QsSUFBSSxJQUFJLENBQUMsT0FBTyxFQUFFO2dCQUNkLElBQUksQ0FBQyxRQUFRLEdBQUcsY0FBYyxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFBO2dCQUUzRCxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUE7YUFDaEI7U0FDSjtRQUNELElBQUksT0FBTyxDQUFDLEtBQUssRUFBRTtZQUNmLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFBO1NBQzVCO0lBQ0wsQ0FBQzs7OztJQUVNLFdBQVc7UUFDZCxJQUFJLElBQUksQ0FBQyxRQUFRLEVBQUU7WUFDZixJQUFJLENBQUMsUUFBUSxDQUFDLE9BQU8sRUFBRSxDQUFBO1NBQzFCO0lBQ0wsQ0FBQzs7Ozs7SUFFTSxRQUFRLENBQUMsS0FBSztRQUNqQixJQUFJLElBQUksQ0FBQyxJQUFJLEVBQUU7WUFDWCxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQTtTQUM1QjtJQUNMLENBQUM7Ozs7O0lBRU0sT0FBTyxDQUFDLElBQVk7UUFDdkIsSUFBSSxJQUFJLENBQUMsSUFBSSxFQUFFO1lBQ1gsTUFBTSxJQUFJLEtBQUssQ0FBQyxzQ0FBc0MsQ0FBQyxDQUFBO1NBQzFEO1FBRUQsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUE7UUFFaEIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFBO0lBQ3hDLENBQUM7Ozs7O0lBRU8sTUFBTTtRQUNWLElBQUksQ0FBQyxLQUFLLEdBQUcsV0FBVyxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQTtRQUNuRixJQUFJLENBQUMsSUFBSSxHQUFHLGlCQUFpQixDQUN6QixJQUFJLENBQUMsT0FBTyxFQUNaLElBQUksQ0FBQyxLQUFLLEVBQ1YsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FDeEMsQ0FBQTtRQUNELElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQTtRQUUvQixJQUFJLENBQUMsS0FBSyxDQUFDLFlBQVk7YUFDbEIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxDQUFDO2FBQ3pDLFNBQVMsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUE7UUFFakMsSUFBSSxDQUFDLEtBQUssQ0FBQyxhQUFhO2FBQ25CLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsQ0FBQzthQUN6QyxTQUFTLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFBO0lBQ3RDLENBQUM7OztZQXpHSixTQUFTLFNBQUM7Z0JBQ1AsUUFBUSxFQUFFLHVCQUF1QjtnQkFDakMsU0FBUyxFQUFFO29CQUNQO3dCQUNJLE9BQU8sRUFBRSxjQUFjO3dCQUN2QixXQUFXLEVBQUUsZ0JBQWdCO3FCQUNoQztpQkFDSjthQUNKOzs7O1lBbEZHLFFBQVE7WUFPUixnQkFBZ0I7NENBdUdYLFFBQVEsWUFBSSxRQUFRLFlBQUksTUFBTSxTQUFDLGNBQWM7OztzQkFsQmpELEtBQUs7b0JBR0wsS0FBSzsyQkFHTCxNQUFNOzRCQUdOLE1BQU07cUJBR04sTUFBTTs7OztJQXBCUCxnQ0FBd0I7O0lBQ3hCLGlDQUE2Qjs7SUFDN0Isb0NBQWdDOztJQUNoQyxvQ0FBeUI7O0lBQ3pCLGtDQUE0Qjs7SUFDNUIsZ0NBQXdCOztJQUN4QixnQ0FBbUI7O0lBRW5CLG1DQUN1Qjs7SUFFdkIsaUNBQ2lCOztJQUVqQix3Q0FDb0U7O0lBRXBFLHlDQUNxRTs7SUFFckUsa0NBQzhEIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcclxuICAgIERpcmVjdGl2ZSxcclxuICAgIEV2ZW50RW1pdHRlcixcclxuICAgIEluamVjdCxcclxuICAgIEluamVjdG9yLFxyXG4gICAgSW5wdXQsXHJcbiAgICBPbkNoYW5nZXMsXHJcbiAgICBPbkRlc3Ryb3ksXHJcbiAgICBPcHRpb25hbCxcclxuICAgIE91dHB1dCxcclxuICAgIFNraXBTZWxmLFxyXG4gICAgVmlld0NvbnRhaW5lclJlZixcclxufSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiXHJcbmltcG9ydCB7IEZvcm11bGEsIEZvcm11bGFPdXRsZXQsIEZvcm11bGFSb290IH0gZnJvbSBcIi4vaW50ZXJmYWNlc1wiXHJcbmltcG9ydCB7IEFic3RyYWN0Q29udHJvbCwgTmdGb3JtIH0gZnJvbSBcIkBhbmd1bGFyL2Zvcm1zXCJcclxuaW1wb3J0IHsgY3JlYXRlUmVuZGVyZXIsIEZvcm11bGFSZW5kZXJlciB9IGZyb20gXCIuL3JlbmRlcmVyL3JlbmRlcmVyc1wiXHJcbmltcG9ydCB7IGNyZWF0ZU1vZGVsIH0gZnJvbSBcIi4vbm9kZS91dGlsc1wiXHJcbmltcG9ydCB7IEZPUk1VTEFfT1VUTEVUIH0gZnJvbSBcIi4vY29uc3RhbnRzXCJcclxuaW1wb3J0IHsgdGFrZVVudGlsIH0gZnJvbSBcInJ4anMvb3BlcmF0b3JzXCJcclxuaW1wb3J0IHsgY3JlYXRlRm9ybXVsYU5vZGUsIEZvcm11bGFOb2RlIH0gZnJvbSBcIi4vbm9kZS9ub2Rlc1wiXHJcblxyXG4vKipcbiAqIENyZWF0ZXMgYSB7bGluayBGb3JtdWxhTm9kZX0gdHJlZSB0aGF0IGlzIHVzZWQgdG8gcmVuZGVyIGEgZm9ybS4gYEZvcm11bGFEaXJlY3RpdmVgIHByb3ZpZGVzIGEgZGVjbGFyYXRpdmVcbiAqIGFwcHJvYWNoIGZvciBkeW5hbWljIGZvcm1zIGNyZWF0aW9uXG4gKlxuICogYEZvcm11bGFEaXJlY3RpdmVgIHJlcXVpcmVzIGEge2xpbmsgRm9ybXVsYX0sIGlmIGEgZmFsc3kgdmFsdWUgaXMgc2V0IHRoZSB2aWV3IHdpbGwgY2xlYXIgYW5kIHRoZVxuICogZm9ybSB3aWxsIGdldCBkZXN0cm95ZWQuXG4gKlxuICogIyMjIFVzYWdlXG4gKlxuICogVGhlIHNpbXBsZXN0IGNhc2UgaXMgYSBmb3JtdWxhIHdpdGggYSBzaW5nbGUgZmllbGQuXG4gKlxuICogYGBgdHNcbkBDb21wb25lbnQoe1xuICAgIHNlbGVjdG9yOiBcInotZXhhbXBsZVwiLFxuICAgIHRlbXBsYXRlOiBgXG4gICAgICAgIDx6LWZvcm11bGEgW2Zvcm11bGFdPVwiZm9ybXVsYVwiIFt2YWx1ZV09XCJ2YWx1ZVwiPjwvei1mb3JtdWxhPlxuICAgIGAsXG59KVxuZXhwb3J0IGNsYXNzIEV4YW1wbGVDb21wb25lbnQge1xuICAgIHZhbHVlID0ge1xuICAgICAgICBleGFtcGxlVGV4dDogbnVsbFxuICAgIH1cblxuICAgIGZvcm11bGE6IEZvcm11bGEgPSB7XG4gICAgICAgIHR5cGU6IEZvcm11bGFUeXBlLkNPTlRST0wsXG4gICAgICAgIG5hbWU6IFwiZXhhbXBsZVRleHRcIixcbiAgICAgICAgY29tcG9uZW50OiBUZXh0RmllbGRDb21wb25lbnQsXG4gICAgICAgIGRhdGE6IHtcbiAgICAgICAgICAgIGxhYmVsOiBcIkV4YW1wbGUgVGV4dFwiLFxuICAgICAgICAgICAgcGxhY2Vob2xkZXI6IFwiVHlwZSB0ZXh0IGhlcmVcIlxuICAgICAgICB9LFxuICAgIH1cbn1cbiAqIGBgYFxuICpcbiAqIEluIHRoaXMgZXhhbXBsZSB3ZSBhcmUgZGVjbGFyaW5nIGEgYGZvcm11bGFgIHRoYXQgY29udGFpbnMgYSBzaW5nbGUgZm9ybSBjb250cm9sIGNhbGxlZFxuICogYGV4YW1wbGVUZXh0YC4gSXQgaXMgcmVuZGVyZWQgd2l0aCBhIGNvbXBvbmVudCwgd2hpY2ggaXMgdXAgdG8gdGhlIHVzZXIgdG8gaW1wbGVtZW50LiBUaGVcbiAqIGNvbmNlcHQgaXMgc2ltaWxhciB0byB0aGF0IG9mIEFuZ3VsYXIgcm91dGUgY29tcG9uZW50cy4gRm9yIGV4YW1wbGUsIHRoZSBgVGV4dEZpZWxkQ29tcG9uZW50YFxuICogbWF5IGJlIGFzIHNpbXBsZSBhcyB0aGlzOlxuICpcbiAqIGBgYHRzXG4gQENvbXBvbmVudCh7XG4gICAgc2VsZWN0b3I6IFwiei10ZXh0LWZpZWxkXCIsXG4gICAgdGVtcGxhdGU6IGBcbiAgICAgICAgPGxhYmVsIFtpbm5lckhUTUxdPVwiY3R4LmRhdGEubGFiZWxcIj48L2xhYmVsPlxuICAgICAgICA8aW5wdXQgW2Zvcm1Db250cm9sXT1cImN0eC5tb2RlbFwiIC8+XG4gICAgYCxcbn0pXG5leHBvcnQgY2xhc3MgVGV4dEZpZWxkQ29tcG9uZW50IHtcbiAgICBjb25zdHJ1Y3RvcihwdWJsaWMgY3R4OiBGb3JtdWxhQ29udGV4dCkge31cbn1cbiAqIGBgYFxuICpcbiAqIEV2ZXJ5IEZvcm11bGEgY29tcG9uZW50IHJlY2VpdmVzIGEge2xpbmsgRm9ybXVsYUNvbnRleHR9IGNvbnRhaW5pbmcgdGhlIG1vZGVsLCBkYXRhIGFuZCByZXNvbHZlXG4gKiBkYXRhIGRlZmluZWQgZm9yIHRoYXQgbm9kZSBpbiB0aGUgYEZvcm11bGFOb2RlYCB0cmVlXG4gKlxuICovXHJcbkBEaXJlY3RpdmUoe1xyXG4gICAgc2VsZWN0b3I6IFwiei1mb3JtdWxhLCBbekZvcm11bGFdXCIsXHJcbiAgICBwcm92aWRlcnM6IFtcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHByb3ZpZGU6IEZPUk1VTEFfT1VUTEVULFxyXG4gICAgICAgICAgICB1c2VFeGlzdGluZzogRm9ybXVsYURpcmVjdGl2ZSxcclxuICAgICAgICB9LFxyXG4gICAgXSxcclxufSlcclxuZXhwb3J0IGNsYXNzIEZvcm11bGFEaXJlY3RpdmUgaW1wbGVtZW50cyBGb3JtdWxhT3V0bGV0LCBPbkNoYW5nZXMsIE9uRGVzdHJveSB7XHJcbiAgICBwdWJsaWMgbm9kZTogRm9ybXVsYU5vZGVcclxuICAgIHB1YmxpYyBtb2RlbDogQWJzdHJhY3RDb250cm9sXHJcbiAgICBwdWJsaWMgcmVuZGVyZXI6IEZvcm11bGFSZW5kZXJlclxyXG4gICAgcHVibGljIGluamVjdG9yOiBJbmplY3RvclxyXG4gICAgcHVibGljIHBhcmVudDogRm9ybXVsYU91dGxldFxyXG4gICAgcHVibGljIHJvb3Q6IEZvcm11bGFSb290XHJcbiAgICBwdWJsaWMgZm9ybTogTmdGb3JtXHJcblxyXG4gICAgQElucHV0KClcclxuICAgIHB1YmxpYyBmb3JtdWxhOiBGb3JtdWxhXHJcblxyXG4gICAgQElucHV0KClcclxuICAgIHB1YmxpYyB2YWx1ZTogYW55XHJcblxyXG4gICAgQE91dHB1dCgpXHJcbiAgICBwdWJsaWMgcmVhZG9ubHkgdmFsdWVDaGFuZ2VzOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXIoKVxyXG5cclxuICAgIEBPdXRwdXQoKVxyXG4gICAgcHVibGljIHJlYWRvbmx5IHN0YXR1c0NoYW5nZXM6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcigpXHJcblxyXG4gICAgQE91dHB1dCgpXHJcbiAgICBwdWJsaWMgcmVhZG9ubHkgc3VibWl0OiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXIoKVxyXG5cclxuICAgIGNvbnN0cnVjdG9yKFxyXG4gICAgICAgIGluamVjdG9yOiBJbmplY3RvcixcclxuICAgICAgICB2Y3I6IFZpZXdDb250YWluZXJSZWYsXHJcbiAgICAgICAgQFNraXBTZWxmKCkgQE9wdGlvbmFsKCkgQEluamVjdChGT1JNVUxBX09VVExFVCkgcGFyZW50OiBGb3JtdWxhT3V0bGV0LFxyXG4gICAgKSB7XHJcbiAgICAgICAgdGhpcy5pbmplY3RvciA9IEluamVjdG9yLmNyZWF0ZSh7XHJcbiAgICAgICAgICAgIHBhcmVudDogaW5qZWN0b3IsXHJcbiAgICAgICAgICAgIHByb3ZpZGVyczogW1xyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIHByb3ZpZGU6IFZpZXdDb250YWluZXJSZWYsXHJcbiAgICAgICAgICAgICAgICAgICAgdXNlVmFsdWU6IHZjcixcclxuICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIF0sXHJcbiAgICAgICAgfSlcclxuICAgICAgICB0aGlzLnBhcmVudCA9IHBhcmVudFxyXG4gICAgICAgIHRoaXMucm9vdCA9IHBhcmVudCA/IHBhcmVudC5yb290IDogdGhpc1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBuZ09uQ2hhbmdlcyhjaGFuZ2VzKSB7XHJcbiAgICAgICAgaWYgKGNoYW5nZXMuZm9ybXVsYSkge1xyXG4gICAgICAgICAgICBpZiAoIWNoYW5nZXMuZm9ybXVsYS5pc0ZpcnN0Q2hhbmdlKCkpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMucmVuZGVyZXIuZGVzdHJveSgpXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKHRoaXMuZm9ybXVsYSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5yZW5kZXJlciA9IGNyZWF0ZVJlbmRlcmVyKHRoaXMuZm9ybXVsYSwgdGhpcy5pbmplY3RvcilcclxuXHJcbiAgICAgICAgICAgICAgICB0aGlzLnJlbmRlcigpXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGNoYW5nZXMudmFsdWUpIHtcclxuICAgICAgICAgICAgdGhpcy5zZXRWYWx1ZSh0aGlzLnZhbHVlKVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgbmdPbkRlc3Ryb3koKSB7XHJcbiAgICAgICAgaWYgKHRoaXMucmVuZGVyZXIpIHtcclxuICAgICAgICAgICAgdGhpcy5yZW5kZXJlci5kZXN0cm95KClcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHNldFZhbHVlKHZhbHVlKSB7XHJcbiAgICAgICAgaWYgKHRoaXMubm9kZSkge1xyXG4gICAgICAgICAgICB0aGlzLm5vZGUuc2V0VmFsdWUodmFsdWUpXHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzZXRGb3JtKGZvcm06IE5nRm9ybSkge1xyXG4gICAgICAgIGlmICh0aGlzLmZvcm0pIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiT25seSBvbmUgdG9wIGxldmVsIE5nRm9ybSBpcyBhbGxvd2VkXCIpXHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLmZvcm0gPSBmb3JtXHJcblxyXG4gICAgICAgIGZvcm0ubmdTdWJtaXQuc3Vic2NyaWJlKHRoaXMuc3VibWl0KVxyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgcmVuZGVyKCkge1xyXG4gICAgICAgIHRoaXMubW9kZWwgPSBjcmVhdGVNb2RlbCh0aGlzLmZvcm11bGEsIHRoaXMucGFyZW50ID8gdGhpcy5wYXJlbnQubm9kZS5tb2RlbCA6IG51bGwpXHJcbiAgICAgICAgdGhpcy5ub2RlID0gY3JlYXRlRm9ybXVsYU5vZGUoXHJcbiAgICAgICAgICAgIHRoaXMuZm9ybXVsYSxcclxuICAgICAgICAgICAgdGhpcy5tb2RlbCxcclxuICAgICAgICAgICAgdGhpcy5wYXJlbnQgPyB0aGlzLnBhcmVudC5ub2RlIDogbnVsbCxcclxuICAgICAgICApXHJcbiAgICAgICAgdGhpcy5yZW5kZXJlci5yZW5kZXIodGhpcy5ub2RlKVxyXG5cclxuICAgICAgICB0aGlzLm1vZGVsLnZhbHVlQ2hhbmdlc1xyXG4gICAgICAgICAgICAucGlwZSh0YWtlVW50aWwodGhpcy5yZW5kZXJlci5kZXN0cm95ZWQkKSlcclxuICAgICAgICAgICAgLnN1YnNjcmliZSh0aGlzLnZhbHVlQ2hhbmdlcylcclxuXHJcbiAgICAgICAgdGhpcy5tb2RlbC5zdGF0dXNDaGFuZ2VzXHJcbiAgICAgICAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLnJlbmRlcmVyLmRlc3Ryb3llZCQpKVxyXG4gICAgICAgICAgICAuc3Vic2NyaWJlKHRoaXMuc3RhdHVzQ2hhbmdlcylcclxuICAgIH1cclxufVxyXG4iXX0=