UNPKG

ngx-schema-forms

Version:

New features: - Ajv schema validator. - Angular forms compatible: Property tree is created using FormGroup, FormArray and FormControl classes. - Array now properly loads initial data from model. - WidgetTyep: WidgetRegistry now supports WidgetType, now wo

310 lines (309 loc) 27 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc */ import * as tslib_1 from "tslib"; import { Component, Input, ContentChildren, QueryList, ElementRef, EventEmitter } from '@angular/core'; import { merge } from 'rxjs'; import { filter } from 'rxjs/operators'; import { ActionRegistry } from '../../model/actionregistry'; import { SchemaPropertyType } from '../../schema'; import { TemplateSchemaService } from '../template-schema.service'; import { ButtonComponent } from '../button/button.component'; import { FieldParent } from './field-parent'; import { ItemComponent } from './item/item.component'; import { TemplateSchemaElementRegistry } from '../template-schema-element-registry'; var FieldComponent = /** @class */ (function (_super) { tslib_1.__extends(FieldComponent, _super); function FieldComponent(elementRef, templateSchemaService, templateRegistry, actionRegistry) { var _this = _super.call(this) || this; _this.elementRef = elementRef; _this.templateSchemaService = templateSchemaService; _this.templateRegistry = templateRegistry; _this.actionRegistry = actionRegistry; _this.schema = {}; // changes that can be reflected in the widget components without rebuild _this.changes = new EventEmitter(); return _this; } /** * @return {?} */ FieldComponent.prototype.getSchema = /** * @return {?} */ function () { var _this = this; var _a = this.getFieldsSchema(this.childFields.filter(function (field) { return field !== _this; })), properties = _a.properties, items = _a.items, required = _a.required; /** @type {?} */ var oneOf = this.getOneOf(); /** @type {?} */ var type; if (!this.type && properties) { type = SchemaPropertyType.Object; } else if (!this.type) { type = SchemaPropertyType.String; } else { type = this.type; } /** @type {?} */ var schema = /** @type {?} */ ({ type: type }); if (this.title !== undefined) { schema.title = this.title; } if (properties !== undefined) { schema.properties = properties; } if (items !== undefined) { schema.items = items; } // requried child fields if (required !== undefined) { schema.required = required; } if (oneOf !== undefined) { schema.oneOf = oneOf; } if (this.description !== undefined) { schema.description = this.description; } if (this.placeholder !== undefined) { schema.placeholder = this.placeholder; } if (this.format !== undefined) { schema.format = this.format; } if (this.widget !== undefined) { schema.widget = this.widget; } if (this.readOnly !== undefined) { schema.readOnly = this.readOnly; } /** @type {?} */ var buttons = this.getButtons(); if (buttons.length > 0) { schema.buttons = buttons; } // @Input schema takes precedence return Object.assign(schema, this.schema); }; /** * @return {?} */ FieldComponent.prototype.getValidators = /** * @return {?} */ function () { var _this = this; /** @type {?} */ var childValidators = this.getFieldsValidators(/** @type {?} */ (this.childFields.filter(function (field) { return field !== _this; }))); /** @type {?} */ var _validators = childValidators.map(function (_a) { var path = _a.path, validators = _a.validators; return { path: _this.path + path, validators: validators }; }); if (!this.validators) { return _validators; } _validators.push({ path: this.path, validators: this.validators }); return _validators; }; /** * @param {?=} parentFieldPath * @return {?} */ FieldComponent.prototype.register = /** * @param {?=} parentFieldPath * @return {?} */ function (parentFieldPath) { var _this = this; if (parentFieldPath === void 0) { parentFieldPath = ''; } /** @type {?} */ var path = parentFieldPath + this.path; this.templateRegistry.register(path, this); if (this.childFields.length) { this.childFields.forEach(function (field) { if (field === _this) { return; } field.register(path); }); } }; /** * @param {?} changes * @return {?} */ FieldComponent.prototype.ngOnChanges = /** * @param {?} changes * @return {?} */ function (changes) { // TODO check for particular properties change (widget.id, validator, etc.) if (changes["type"] || changes["name"] || changes["format"] || changes["validators"]) { this.templateSchemaService.changed(); } else { // changes that dont need to rebuild the schema if (this.childFields) { /** @type {?} */ var schema = this.getSchema(); delete schema.name; delete schema.format; if (typeof schema.widget === 'string') { delete schema.widget; } else if (schema.widget && schema.width.id) { delete schema.widget.id; } this.changes.emit(schema); } } /* // this is old way to update controls on field input changes, // now we have the to types, changes that need rebuild of schema and the // ones that not rebuilding schema const keys = Object.keys(changes); for (const key of keys) { if (!changes[key].isFirstChange()) { // on any input change, force schema change generation this.templateSchemaService.changed(); break; } } */ }; /** * @return {?} */ FieldComponent.prototype.getOneOf = /** * @return {?} */ function () { if (this.childItems.length === 0) { return; } /** @type {?} */ var items = this.childItems.map(function (_a) { var value = _a.value, description = _a.description; if (!Array.isArray(value)) { return { enum: [value], description: description }; } return { enum: value, description: description }; }); if (items.length === 0) { return; } return items; }; /** * @return {?} */ FieldComponent.prototype.setTitleFromContent = /** * @return {?} */ function () { /** @type {?} */ var textContent = this.getTextContent(this.elementRef); // title as @Input takes priority over content text if (textContent && !this.title) { this.title = textContent; } }; /** * @return {?} */ FieldComponent.prototype.ngAfterContentInit = /** * @return {?} */ function () { var _this = this; // cache it this.setTitleFromContent(); merge(this.childFields.changes, this.childItems.changes, this.childButtons.changes) .pipe(filter(function (value) { return Boolean(value); })) .subscribe(function () { _this.templateSchemaService.changed(); }); }; FieldComponent.decorators = [ { type: Component, args: [{ selector: 'sf-field', template: "<ng-content ></ng-content>\n" }] } ]; /** @nocollapse */ FieldComponent.ctorParameters = function () { return [ { type: ElementRef }, { type: TemplateSchemaService }, { type: TemplateSchemaElementRegistry }, { type: ActionRegistry } ]; }; FieldComponent.propDecorators = { childFields: [{ type: ContentChildren, args: [FieldComponent,] }], childItems: [{ type: ContentChildren, args: [ItemComponent,] }], childButtons: [{ type: ContentChildren, args: [ButtonComponent,] }], name: [{ type: Input }], type: [{ type: Input }], format: [{ type: Input }], required: [{ type: Input }], readOnly: [{ type: Input }], title: [{ type: Input }], description: [{ type: Input }], placeholder: [{ type: Input }], widget: [{ type: Input }], validators: [{ type: Input }], schema: [{ type: Input }] }; return FieldComponent; }(FieldParent)); export { FieldComponent }; if (false) { /** @type {?} */ FieldComponent.prototype.childFields; /** @type {?} */ FieldComponent.prototype.childItems; /** @type {?} */ FieldComponent.prototype.childButtons; /** @type {?} */ FieldComponent.prototype.name; /** @type {?} */ FieldComponent.prototype.type; /** @type {?} */ FieldComponent.prototype.format; /** @type {?} */ FieldComponent.prototype.required; /** @type {?} */ FieldComponent.prototype.readOnly; /** @type {?} */ FieldComponent.prototype.title; /** @type {?} */ FieldComponent.prototype.description; /** @type {?} */ FieldComponent.prototype.placeholder; /** @type {?} */ FieldComponent.prototype.widget; /** @type {?} */ FieldComponent.prototype.validators; /** @type {?} */ FieldComponent.prototype.schema; /** @type {?} */ FieldComponent.prototype.changes; /** @type {?} */ FieldComponent.prototype.elementRef; /** @type {?} */ FieldComponent.prototype.templateSchemaService; /** @type {?} */ FieldComponent.prototype.templateRegistry; /** @type {?} */ FieldComponent.prototype.actionRegistry; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmllbGQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6Im5nOi8vbmd4LXNjaGVtYS1mb3Jtcy8iLCJzb3VyY2VzIjpbImxpYi90ZW1wbGF0ZS1zY2hlbWEvZmllbGQvZmllbGQuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsT0FBTyxFQUNMLFNBQVMsRUFDVCxLQUFLLEVBSUwsZUFBZSxFQUVmLFNBQVMsRUFDVCxVQUFVLEVBS1YsWUFBWSxFQUNiLE1BQU0sZUFBZSxDQUFDO0FBRXZCLE9BQU8sRUFBYyxLQUFLLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDekMsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBR3hDLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUM1RCxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFHbEQsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDbkUsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBRTdELE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUU3QyxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDdEQsT0FBTyxFQUNMLDZCQUE2QixFQUM5QixNQUFNLHFDQUFxQyxDQUFDOztJQVNULDBDQUFXO0lBZ0Q3Qyx3QkFDVSxZQUNBLHVCQUNFLGdCQUErQyxFQUMvQyxjQUE4QjtRQUoxQyxZQU1FLGlCQUFPLFNBQ1I7UUFOUyxnQkFBVSxHQUFWLFVBQVU7UUFDViwyQkFBcUIsR0FBckIscUJBQXFCO1FBQ25CLHNCQUFnQixHQUFoQixnQkFBZ0IsQ0FBK0I7UUFDL0Msb0JBQWMsR0FBZCxjQUFjLENBQWdCO3VCQVQ1QixFQUFHOzt3QkFHUCxJQUFJLFlBQVksRUFBRTs7S0FTM0I7Ozs7SUFFRCxrQ0FBUzs7O0lBQVQ7UUFBQSxpQkFz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RUFBRSw4QkFDWDtpQkFDQTs7OztnQkFoQ0MsVUFBVTtnQkFnQkgscUJBQXFCO2dCQU81Qiw2QkFBNkI7Z0JBWHRCLGNBQWM7Ozs4QkF3QnBCLGVBQWUsU0FBQyxjQUFjOzZCQUc5QixlQUFlLFNBQUMsYUFBYTsrQkFHN0IsZUFBZSxTQUFDLGVBQWU7dUJBRy9CLEtBQUs7dUJBR0wsS0FBSzt5QkFHTCxLQUFLOzJCQUdMLEtBQUs7MkJBR0wsS0FBSzt3QkFHTCxLQUFLOzhCQUdMLEtBQUs7OEJBR0wsS0FBSzt5QkFHTCxLQUFLOzZCQUdMLEtBQUs7eUJBR0wsS0FBSzs7eUJBcEZSO0VBMENvQyxXQUFXO1NBQWxDLGNBQWMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBDb21wb25lbnQsXG4gIElucHV0LFxuICBPdXRwdXQsXG4gIE9uSW5pdCxcbiAgQWZ0ZXJDb250ZW50SW5pdCxcbiAgQ29udGVudENoaWxkcmVuLFxuICBWaWV3Q2hpbGQsXG4gIFF1ZXJ5TGlzdCxcbiAgRWxlbWVudFJlZixcbiAgZm9yd2FyZFJlZixcbiAgU2ltcGxlQ2hhbmdlcyxcbiAgU2ltcGxlQ2hhbmdlLFxuICBPbkNoYW5nZXMsXG4gIEV2ZW50RW1pdHRlclxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFZhbGlkYXRvckZuIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgT2JzZXJ2YWJsZSwgbWVyZ2UgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IGZpbHRlciB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcblxuaW1wb3J0IHsgQWN0aW9uIH0gZnJvbSAnLi4vLi4vbW9kZWwvYWN0aW9uJztcbmltcG9ydCB7IEFjdGlvblJlZ2lzdHJ5IH0gZnJvbSAnLi4vLi4vbW9kZWwvYWN0aW9ucmVnaXN0cnknO1xuaW1wb3J0IHsgU2NoZW1hUHJvcGVydHlUeXBlIH0gZnJvbSAnLi4vLi4vc2NoZW1hJztcblxuaW1wb3J0IHsgVGVtcGxhdGVTY2hlbWFFbGVtZW50IH0gZnJvbSAnLi4vdGVtcGxhdGUtc2NoZW1hLWVsZW1lbnQnO1xuaW1wb3J0IHsgVGVtcGxhdGVTY2hlbWFTZXJ2aWNlIH0gZnJvbSAnLi4vdGVtcGxhdGUtc2NoZW1hLnNlcnZpY2UnO1xuaW1wb3J0IHsgQnV0dG9uQ29tcG9uZW50IH0gZnJvbSAnLi4vYnV0dG9uL2J1dHRvbi5jb21wb25lbnQnO1xuXG5pbXBvcnQgeyBGaWVsZFBhcmVudCB9IGZyb20gJy4vZmllbGQtcGFyZW50JztcbmltcG9ydCB7IEZpZWxkIH0gZnJvbSAnLi9maWVsZCc7XG5pbXBvcnQgeyBJdGVtQ29tcG9uZW50IH0gZnJvbSAnLi9pdGVtL2l0ZW0uY29tcG9uZW50JztcbmltcG9ydCB7XG4gIFRlbXBsYXRlU2NoZW1hRWxlbWVudFJlZ2lzdHJ5XG59IGZyb20gJy4uL3RlbXBsYXRlLXNjaGVtYS1lbGVtZW50LXJlZ2lzdHJ5JztcblxuXG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3NmLWZpZWxkJyxcbiAgdGVtcGxhdGU6IGA8bmctY29udGVudCA+PC9uZy1jb250ZW50PlxuYFxufSlcbmV4cG9ydCBjbGFzcyBGaWVsZENvbXBvbmVudCBleHRlbmRzIEZpZWxkUGFyZW50XG5pbXBsZW1lbnRzIEZpZWxkLCBPbkNoYW5nZXMsIEFmdGVyQ29udGVudEluaXQge1xuXG4gIEBDb250ZW50Q2hpbGRyZW4oRmllbGRDb21wb25lbnQpXG4gIGNoaWxkRmllbGRzOiBRdWVyeUxpc3Q8RmllbGRDb21wb25lbnQ+O1xuXG4gIEBDb250ZW50Q2hpbGRyZW4oSXRlbUNvbXBvbmVudClcbiAgY2hpbGRJdGVtczogUXVlcnlMaXN0PEl0ZW1Db21wb25lbnQ+O1xuXG4gIEBDb250ZW50Q2hpbGRyZW4oQnV0dG9uQ29tcG9uZW50KVxuICBjaGlsZEJ1dHRvbnM6IFF1ZXJ5TGlzdDxCdXR0b25Db21wb25lbnQ+O1xuXG4gIEBJbnB1dCgpXG4gIG5hbWU6IHN0cmluZztcblxuICBASW5wdXQoKVxuICB0eXBlOiBTY2hlbWFQcm9wZXJ0eVR5cGU7XG5cbiAgQElucHV0KClcbiAgZm9ybWF0OiBzdHJpbmc7XG5cbiAgQElucHV0KClcbiAgcmVxdWlyZWQ6IGJvb2xlYW47XG5cbiAgQElucHV0KClcbiAgcmVhZE9ubHk6IGJvb2xlYW47XG5cbiAgQElucHV0KClcbiAgdGl0bGU6IHN0cmluZztcblxuICBASW5wdXQoKVxuICBkZXNjcmlwdGlvbjogc3RyaW5nO1xuXG4gIEBJbnB1dCgpXG4gIHBsYWNlaG9sZGVyOiBzdHJpbmc7XG5cbiAgQElucHV0KClcbiAgd2lkZ2V0OiBzdHJpbmcgfCBvYmplY3Q7XG5cbiAgQElucHV0KClcbiAgdmFsaWRhdG9yczogVmFsaWRhdG9yRm4gfCBWYWxpZGF0b3JGbltdO1xuXG4gIEBJbnB1dCgpXG4gIHNjaGVtYTogYW55ID0geyB9O1xuXG4gIC8vIGNoYW5nZXMgdGhhdCBjYW4gYmUgcmVmbGVjdGVkIGluIHRoZSB3aWRnZXQgY29tcG9uZW50cyB3aXRob3V0IHJlYnVpbGRcbiAgY2hhbmdlcyA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIGVsZW1lbnRSZWY6IEVsZW1lbnRSZWYsXG4gICAgcHJpdmF0ZSB0ZW1wbGF0ZVNjaGVtYVNlcnZpY2U6IFRlbXBsYXRlU2NoZW1hU2VydmljZSxcbiAgICBwcm90ZWN0ZWQgdGVtcGxhdGVSZWdpc3RyeTogVGVtcGxhdGVTY2hlbWFFbGVtZW50UmVnaXN0cnksXG4gICAgcHJvdGVjdGVkIGFjdGlvblJlZ2lzdHJ5OiBBY3Rpb25SZWdpc3RyeSxcbiAgKSB7XG4gICAgc3VwZXIoKTtcbiAgfVxuXG4gIGdldFNjaGVtYSgpOiBhbnkge1xuXG4gICAgY29uc3QgeyBwcm9wZXJ0aWVzLCBpdGVtcywgcmVxdWlyZWQgfSA9IHRoaXMuZ2V0RmllbGRzU2NoZW1hKFxuICAgICAgdGhpcy5jaGlsZEZpZWxkcy5maWx0ZXIoZmllbGQgPT4gZmllbGQgIT09IHRoaXMpXG4gICAgKTtcblxuICAgIGNvbnN0IG9uZU9mID0gdGhpcy5nZXRPbmVPZigpO1xuXG4gICAgbGV0IHR5cGU6IHN0cmluZztcbiAgICBpZiAoIXRoaXMudHlwZSAmJiBwcm9wZXJ0aWVzKSB7XG4gICAgICB0eXBlID0gU2NoZW1hUHJvcGVydHlUeXBlLk9iamVjdDtcbiAgICB9IGVsc2UgaWYgKCF0aGlzLnR5cGUpIHtcbiAgICAgIHR5cGUgPSBTY2hlbWFQcm9wZXJ0eVR5cGUuU3RyaW5nO1xuICAgIH0gZWxzZSB7XG4gICAgICB0eXBlID0gdGhpcy50eXBlO1xuICAgIH1cblxuICAgIGNvbnN0IHNjaGVtYSA9IDxhbnk+e1xuICAgICAgdHlwZVxuICAgIH07XG5cbiAgICBpZiAodGhpcy50aXRsZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBzY2hlbWEudGl0bGUgPSB0aGlzLnRpdGxlO1xuICAgIH1cblxuICAgIGlmIChwcm9wZXJ0aWVzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHNjaGVtYS5wcm9wZXJ0aWVzID0gcHJvcGVydGllcztcbiAgICB9XG5cbiAgICBpZiAoaXRlbXMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgc2NoZW1hLml0ZW1zID0gaXRlbXM7XG4gICAgfVxuXG4gICAgLy8gcmVxdXJpZWQgY2hpbGQgZmllbGRzXG4gICAgaWYgKHJlcXVpcmVkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHNjaGVtYS5yZXF1aXJlZCA9IHJlcXVpcmVkO1xuICAgIH1cblxuICAgIGlmIChvbmVPZiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBzY2hlbWEub25lT2YgPSBvbmVPZjtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5kZXNjcmlwdGlvbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBzY2hlbWEuZGVzY3JpcHRpb24gPSB0aGlzLmRlc2NyaXB0aW9uO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnBsYWNlaG9sZGVyICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHNjaGVtYS5wbGFjZWhvbGRlciA9IHRoaXMucGxhY2Vob2xkZXI7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuZm9ybWF0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHNjaGVtYS5mb3JtYXQgPSB0aGlzLmZvcm1hdDtcbiAgICB9XG5cbiAgICBpZiAodGhpcy53aWRnZXQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgc2NoZW1hLndpZGdldCA9IHRoaXMud2lkZ2V0O1xuICAgIH1cblxuICAgIGlmICh0aGlzLnJlYWRPbmx5ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHNjaGVtYS5yZWFkT25seSA9IHRoaXMucmVhZE9ubHk7XG4gICAgfVxuXG4gICAgY29uc3QgYnV0dG9ucyA9IHRoaXMuZ2V0QnV0dG9ucygpO1xuICAgIGlmIChidXR0b25zLmxlbmd0aCA+IDApIHtcbiAgICAgIHNjaGVtYS5idXR0b25zID0gYnV0dG9ucztcbiAgICB9XG5cbiAgICAvLyBASW5wdXQgc2NoZW1hIHRha2VzIHByZWNlZGVuY2VcbiAgICByZXR1cm4gT2JqZWN0LmFzc2lnbihzY2hlbWEsIHRoaXMuc2NoZW1hKTtcblxuICB9XG5cbiAgZ2V0VmFsaWRhdG9ycygpOiB7IHBhdGg6IHN0cmluZywgdmFsaWRhdG9yczogVmFsaWRhdG9yRm4gfCBWYWxpZGF0b3JGbltdIH1bXSB7XG5cbiAgICAvLyByZWdpc3RlcmluZyB2YWxpZGF0b3IgaGVyZSBpcyBub3QgcG9zc2libGUgc2luY2UgcHJvcCBmdWxsIHBhdGggaXMgbmVlZGVkXG4gICAgY29uc3QgY2hpbGRWYWxpZGF0b3JzID0gdGhpcy5nZXRGaWVsZHNWYWxpZGF0b3JzKFxuICAgICAgPEZpZWxkW10+dGhpcy5jaGlsZEZpZWxkcy5maWx0ZXIoZmllbGQgPT4gZmllbGQgIT09IHRoaXMpXG4gICAgKTtcbiAgICBjb25zdCBfdmFsaWRhdG9ycyA9IGNoaWxkVmFsaWRhdG9ycy5tYXAoKHsgcGF0aCwgdmFsaWRhdG9ycyB9KSA9PiB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBwYXRoOiB0aGlzLnBhdGggKyBwYXRoLFxuICAgICAgICB2YWxpZGF0b3JzXG4gICAgICB9O1xuICAgIH0pO1xuXG4gICAgaWYgKCF0aGlzLnZhbGlkYXRvcnMpIHtcbiAgICAgIHJldHVybiBfdmFsaWRhdG9ycztcbiAgICB9XG5cbiAgICBfdmFsaWRhdG9ycy5wdXNoKHsgcGF0aDogdGhpcy5wYXRoLCB2YWxpZGF0b3JzOiB0aGlzLnZhbGlkYXRvcnMgfSk7XG4gICAgcmV0dXJuIF92YWxpZGF0b3JzO1xuICB9XG5cbiAgcmVnaXN0ZXIocGFyZW50RmllbGRQYXRoID0gJycpIHtcbiAgICBjb25zdCBwYXRoID0gcGFyZW50RmllbGRQYXRoICsgdGhpcy5wYXRoO1xuICAgIHRoaXMudGVtcGxhdGVSZWdpc3RyeS5yZWdpc3RlcihwYXRoLCB0aGlzKTtcbiAgICBpZiAodGhpcy5jaGlsZEZpZWxkcy5sZW5ndGgpIHtcbiAgICAgIHRoaXMuY2hpbGRGaWVsZHMuZm9yRWFjaCgoZmllbGQpID0+IHtcbiAgICAgICAgaWYgKGZpZWxkID09PSB0aGlzKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgZmllbGQucmVnaXN0ZXIocGF0aCk7XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKSB7XG5cbiAgICAvLyBUT0RPIGNoZWNrIGZvciBwYXJ0aWN1bGFyIHByb3BlcnRpZXMgY2hhbmdlICh3aWRnZXQuaWQsIHZhbGlkYXRvciwgZXRjLilcbiAgICBpZiAoY2hhbmdlcy50eXBlIHx8IGNoYW5nZXMubmFtZSB8fCBjaGFuZ2VzLmZvcm1hdCB8fCBjaGFuZ2VzLnZhbGlkYXRvcnMpIHtcbiAgICAgIHRoaXMudGVtcGxhdGVTY2hlbWFTZXJ2aWNlLmNoYW5nZWQoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gY2hhbmdlcyB0aGF0IGRvbnQgbmVlZCB0byByZWJ1aWxkIHRoZSBzY2hlbWFcbiAgICAgIGlmICh0aGlzLmNoaWxkRmllbGRzKSB7XG4gICAgICAgIGNvbnN0IHNjaGVtYSA9IHRoaXMuZ2V0U2NoZW1hKCk7XG4gICAgICAgIGRlbGV0ZSBzY2hlbWEubmFtZTtcbiAgICAgICAgZGVsZXRlIHNjaGVtYS5mb3JtYXQ7XG4gICAgICAgIGlmICh0eXBlb2Ygc2NoZW1hLndpZGdldCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICBkZWxldGUgc2NoZW1hLndpZGdldDtcbiAgICAgICAgfSBlbHNlIGlmIChzY2hlbWEud2lkZ2V0ICYmIHNjaGVtYS53aWR0aC5pZCkge1xuICAgICAgICAgIGRlbGV0ZSBzY2hlbWEud2lkZ2V0LmlkO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuY2hhbmdlcy5lbWl0KHNjaGVtYSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLypcbiAgICAvLyB0aGlzIGlzIG9sZCB3YXkgdG8gdXBkYXRlIGNvbnRyb2xzIG9uIGZpZWxkIGlucHV0IGNoYW5nZXMsXG4gICAgLy8gbm93IHdlIGhhdmUgdGhlIHRvIHR5cGVzLCBjaGFuZ2VzIHRoYXQgbmVlZCByZWJ1aWxkIG9mIHNjaGVtYSBhbmQgdGhlXG4gICAgLy8gb25lcyB0aGF0IG5vdCByZWJ1aWxkaW5nIHNjaGVtYVxuICAgIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyhjaGFuZ2VzKTtcbiAgICBmb3IgKGNvbnN0IGtleSBvZiBrZXlzKSB7XG4gICAgICBpZiAoIWNoYW5nZXNba2V5XS5pc0ZpcnN0Q2hhbmdlKCkpIHtcbiAgICAgICAgLy8gb24gYW55IGlucHV0IGNoYW5nZSwgZm9yY2Ugc2NoZW1hIGNoYW5nZSBnZW5lcmF0aW9uXG4gICAgICAgIHRoaXMudGVtcGxhdGVTY2hlbWFTZXJ2aWNlLmNoYW5nZWQoKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICAgICAqL1xuXG5cbiAgfVxuXG5cbiAgcHJpdmF0ZSBnZXRPbmVPZigpIHtcblxuICAgIGlmICh0aGlzLmNoaWxkSXRlbXMubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgaXRlbXMgPSB0aGlzLmNoaWxkSXRlbXMubWFwKCh7IHZhbHVlLCBkZXNjcmlwdGlvbiB9KSA9PiB7XG4gICAgICBpZiAoIUFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgIHJldHVybiB7IGVudW06IFt2YWx1ZV0sIGRlc2NyaXB0aW9uIH07XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB7IGVudW06IHZhbHVlLCBkZXNjcmlwdGlvbiB9O1xuICAgIH0pO1xuXG4gICAgaWYgKGl0ZW1zLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHJldHVybiBpdGVtcztcbiAgfVxuXG5cbiAgcHJpdmF0ZSBzZXRUaXRsZUZyb21Db250ZW50KCkge1xuICAgIGNvbnN0IHRleHRDb250ZW50ID0gdGhpcy5nZXRUZXh0Q29udGVudCh0aGlzLmVsZW1lbnRSZWYpO1xuXG4gICAgLy8gIHRpdGxlIGFzIEBJbnB1dCB0YWtlcyBwcmlvcml0eSBvdmVyIGNvbnRlbnQgdGV4dFxuICAgIGlmICh0ZXh0Q29udGVudCAmJiAhdGhpcy50aXRsZSkge1xuICAgICAgdGhpcy50aXRsZSA9IHRleHRDb250ZW50O1xuICAgIH1cbiAgfVxuXG4gIG5nQWZ0ZXJDb250ZW50SW5pdCgpIHtcblxuICAgIC8vIGNhY2hlIGl0XG4gICAgdGhpcy5zZXRUaXRsZUZyb21Db250ZW50KCk7XG5cbiAgICBtZXJnZShcbiAgICAgIHRoaXMuY2hpbGRGaWVsZHMuY2hhbmdlcyxcbiAgICAgIHRoaXMuY2hpbGRJdGVtcy5jaGFuZ2VzLFxuICAgICAgdGhpcy5jaGlsZEJ1dHRvbnMuY2hhbmdlc1xuICAgIClcbiAgICAucGlwZShmaWx0ZXIoKHZhbHVlKSA9PiBCb29sZWFuKHZhbHVlKSkpXG4gICAgLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICB0aGlzLnRlbXBsYXRlU2NoZW1hU2VydmljZS5jaGFuZ2VkKCk7XG4gICAgfSk7XG4gIH1cblxufVxuIl19