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
200 lines (199 loc) • 19.8 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
*/
import { startWith } from 'rxjs/operators';
import { SchemaPropertyType } from '../schema';
import { GenericProperty } from './generic-property';
import { NumberProperty } from './number-property';
import { BooleanProperty } from './boolean-property';
import { StringProperty } from './string-property';
import { ArrayProperty } from './array-property';
import { ObjectProperty } from './object-property';
import { SchemaPreprocessor } from './schemapreprocessor';
/** @typedef {?} */
var PropertyParent;
export { PropertyParent };
var FormPropertyFactory = /** @class */ (function () {
function FormPropertyFactory(schemaValidatorFactory, validatorRegistry) {
this.schemaValidatorFactory = schemaValidatorFactory;
this.validatorRegistry = validatorRegistry;
}
/**
* @param {?} schema
* @param {?=} propertyParent
* @param {?=} propertyKey
* @return {?}
*/
FormPropertyFactory.prototype.createProperty = /**
* @param {?} schema
* @param {?=} propertyParent
* @param {?=} propertyKey
* @return {?}
*/
function (schema, propertyParent, propertyKey) {
/** @type {?} */
var property;
/** @type {?} */
var path = this.generatePath(propertyParent, propertyKey);
SchemaPreprocessor.preprocess(schema, path);
// TODO test for parsing for reference schema
if (schema["$ref"]) {
/** @type {?} */
var refSchema = this.schemaValidatorFactory.getSchema((/** @type {?} */ (propertyParent.root)).schema, schema["$ref"]);
property = this.createProperty(refSchema, propertyParent, propertyKey || path);
}
else {
switch (schema["type"]) {
case SchemaPropertyType.Integer:
case SchemaPropertyType.Number:
property = new NumberProperty(path, schema);
break;
case SchemaPropertyType.String:
property = new StringProperty(path, schema);
break;
case SchemaPropertyType.Boolean:
property = new BooleanProperty(path, schema);
break;
case SchemaPropertyType.Object:
property = new ObjectProperty(path, schema);
break;
case SchemaPropertyType.Array:
if (schema["widget"].id === 'array') {
property = new ArrayProperty(this, path, schema);
}
else {
schema["default"] = [];
property = new GenericProperty(path, schema);
}
break;
default:
throw new TypeError("Undefined type " + schema["type"]);
}
}
this.initializeFormProperty(property, propertyParent);
return property;
};
/**
* @param {?} property
* @param {?=} propertyParent
* @return {?}
*/
FormPropertyFactory.prototype.initializeFormProperty = /**
* @param {?} property
* @param {?=} propertyParent
* @return {?}
*/
function (property, propertyParent) {
if (propertyParent) {
property.setParent(propertyParent);
}
this.bindCustomValidator(property);
if (property instanceof ObjectProperty) {
for (var key in property.schema["properties"]) {
if (property.schema["properties"].hasOwnProperty(key)) {
/** @type {?} */
var _schema = property.schema["properties"][key];
/** @type {?} */
var _property = this.createProperty(_schema, property, key);
property.addControl(key, _property);
}
}
}
if (property.isRoot) {
this.bindSchemaValidator(property);
// needs to run after entire property tree is built
property.bindVisibility();
}
};
/**
* @param {?} property
* @return {?}
*/
FormPropertyFactory.prototype.bindSchemaValidator = /**
* @param {?} property
* @return {?}
*/
function (property) {
/** @type {?} */
var validate = this.schemaValidatorFactory.createValidatorFn(property.schema);
// TODO use pipe startWith to do initial run
property.valueChanges
.pipe(startWith(null))
.subscribe(function () {
/** @type {?} */
var value = property.nonEmptyValue;
property.nonEmptyValueChanges.emit(value);
/** @type {?} */
var errors = validate(value);
if (!errors) {
return;
}
Object.keys(errors).forEach(function (path) {
/** @type {?} */
var control = property.get(path);
if (control) {
// set error to specific control
control.setErrors(errors[path], { emitEvent: true });
}
});
});
};
/**
* @param {?} property
* @return {?}
*/
FormPropertyFactory.prototype.bindCustomValidator = /**
* @param {?} property
* @return {?}
*/
function (property) {
/** @type {?} */
var validators = this.validatorRegistry.get(property.path);
if (validators) {
property.setValidators(validators);
}
};
/**
* @param {?=} propertyParent
* @param {?=} propertyKey
* @return {?}
*/
FormPropertyFactory.prototype.generatePath = /**
* @param {?=} propertyParent
* @param {?=} propertyKey
* @return {?}
*/
function (propertyParent, propertyKey) {
if (!propertyParent) {
return '/';
}
/** @type {?} */
var path = '';
path += propertyParent.path;
if (propertyParent.parent !== undefined) {
path += '/';
}
switch (propertyParent.schema["type"]) {
case SchemaPropertyType.Object:
path += propertyKey;
break;
case SchemaPropertyType.Array:
path += (/** @type {?} */ (propertyParent)).controls.length;
break;
default:
// TODO move to class
throw new Error('Instantiation of a FormProperty with an unknown parent type: ' + propertyParent.schema["type"]);
}
return path;
};
return FormPropertyFactory;
}());
export { FormPropertyFactory };
if (false) {
/** @type {?} */
FormPropertyFactory.prototype.schemaValidatorFactory;
/** @type {?} */
FormPropertyFactory.prototype.validatorRegistry;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9ybS1wcm9wZXJ0eS1mYWN0b3J5LmpzIiwic291cmNlUm9vdCI6Im5nOi8vbmd4LXNjaGVtYS1mb3Jtcy8iLCJzb3VyY2VzIjpbImxpYi9tb2RlbC9mb3JtLXByb3BlcnR5LWZhY3RvcnkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7OztBQVFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQU0zQyxPQUFPLEVBQVUsa0JBQWtCLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFHdkQsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQ3JELE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUNuRCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDckQsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQ25ELE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUNqRCxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDbkQsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sc0JBQXNCLENBQUM7Ozs7QUFNMUQsSUFBQTtJQUVFLDZCQUNVLHdCQUNBO1FBREEsMkJBQXNCLEdBQXRCLHNCQUFzQjtRQUN0QixzQkFBaUIsR0FBakIsaUJBQWlCO0tBQ3RCOzs7Ozs7O0lBRUwsNENBQWM7Ozs7OztJQUFkLFVBQ0UsTUFBYyxFQUNkLGNBQStCLEVBQy9CLFdBQW9COztRQUlwQixJQUFJLFFBQVEsQ0FBZTs7UUFDM0IsSUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxjQUFjLEVBQUUsV0FBVyxDQUFDLENBQUM7UUFFNUQsa0JBQWtCLENBQUMsVUFBVSxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsQ0FBQzs7UUFHNUMsRUFBRSxDQUFDLENBQUMsTUFBTSxVQUFPLENBQUM7O1lBQ2hCLElBQU0sU0FBUyxHQUFHLElB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Ozs7Ozs7SUFHSywwQ0FBWTs7Ozs7Y0FDbEIsY0FBK0IsRUFDL0IsV0FBb0I7UUFHcEIsRUFBRSxDQUFDLENBQUMsQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDO1lBQ3BCLE1BQU0sQ0FBQyxHQUFHLENBQUM7U0FDWjs7UUFFRCxJQUFJLElBQUksR0FBRyxFQUFFLENBQUM7UUFDZCxJQUFJLElBQUksY0FBYyxDQUFDLElBQUksQ0FBQztRQUc1QixFQUFFLENBQUMsQ0FBQyxjQUFjLENBQUMsTUFBTSxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUM7WUFDeEMsSUFBSSxJQUFJLEdBQUcsQ0FBQztTQUNiO1FBRUQsTUFBTSxDQUFDLENBQUMsY0FBYyxDQUFDLE1BQU0sVUFBTyxDQUFDO1lBQ25DLEtBQUssa0JBQWtCLENBQUMsTUFBTTtnQkFDNUIsSUFBSSxJQUFJLFdBQVcsQ0FBQztnQkFDcEIsS0FBSyxDQUFDO1lBRVIsS0FBSyxrQkFBa0IsQ0FBQyxLQUFLO2dCQUMzQixJQUFJLElBQUksbUJBQWdCLGNBQWMsRUFBQyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUM7Z0JBQ3hELEtBQUssQ0FBQztZQUVSOztnQkFFRSxNQUFNLElBQUksS0FBSyxDQUNiLCtEQUErRCxHQUM3RCxjQUFjLENBQUMsTUFBTSxRQUFLLENBQzdCLENBQUM7U0FDTDtRQUVELE1BQU0sQ0FBQyxJQUFJLENBQUM7OzhCQWpNaEI7SUFtTUMsQ0FBQTtBQXRLRCwrQkFzS0MiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBFdmVudEVtaXR0ZXIgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7XG4gIEFic3RyYWN0Q29udHJvbCxcbiAgRm9ybUNvbnRyb2wsXG4gIEZvcm1Hcm91cCxcbiAgRm9ybUFycmF5LFxuICBWYWxpZGF0b3JzXG59IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IHN0YXJ0V2l0aCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcblxuXG5cbmltcG9ydCB7IFNjaGVtYVZhbGlkYXRvckZhY3RvcnkgfSBmcm9tICcuLi9zY2hlbWF2YWxpZGF0b3JmYWN0b3J5JztcbmltcG9ydCB7IFZhbGlkYXRvclJlZ2lzdHJ5IH0gZnJvbSAnLi4vbW9kZWwvdmFsaWRhdG9ycmVnaXN0cnknO1xuaW1wb3J0IHsgU2NoZW1hLCBTY2hlbWFQcm9wZXJ0eVR5cGUgfSBmcm9tICcuLi9zY2hlbWEnO1xuXG5pbXBvcnQgeyBGb3JtUHJvcGVydHkgfSBmcm9tICcuL2Zvcm0tcHJvcGVydHknO1xuaW1wb3J0IHsgR2VuZXJpY1Byb3BlcnR5IH0gZnJvbSAnLi9nZW5lcmljLXByb3BlcnR5JztcbmltcG9ydCB7IE51bWJlclByb3BlcnR5IH0gZnJvbSAnLi9udW1iZXItcHJvcGVydHknO1xuaW1wb3J0IHsgQm9vbGVhblByb3BlcnR5IH0gZnJvbSAnLi9ib29sZWFuLXByb3BlcnR5JztcbmltcG9ydCB7IFN0cmluZ1Byb3BlcnR5IH0gZnJvbSAnLi9zdHJpbmctcHJvcGVydHknO1xuaW1wb3J0IHsgQXJyYXlQcm9wZXJ0eSB9IGZyb20gJy4vYXJyYXktcHJvcGVydHknO1xuaW1wb3J0IHsgT2JqZWN0UHJvcGVydHkgfSBmcm9tICcuL29iamVjdC1wcm9wZXJ0eSc7XG5pbXBvcnQgeyBTY2hlbWFQcmVwcm9jZXNzb3IgfSBmcm9tICcuL3NjaGVtYXByZXByb2Nlc3Nvcic7XG5cblxuZXhwb3J0IHR5cGUgUHJvcGVydHlQYXJlbnQgPSBPYmplY3RQcm9wZXJ0eSB8IEFycmF5UHJvcGVydHk7XG5cblxuZXhwb3J0IGNsYXNzIEZvcm1Qcm9wZXJ0eUZhY3Rvcnkge1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgc2NoZW1hVmFsaWRhdG9yRmFjdG9yeTogU2NoZW1hVmFsaWRhdG9yRmFjdG9yeSxcbiAgICBwcml2YXRlIHZhbGlkYXRvclJlZ2lzdHJ5OiBWYWxpZGF0b3JSZWdpc3RyeVxuICApIHsgfVxuXG4gIGNyZWF0ZVByb3BlcnR5KFxuICAgIHNjaGVtYTogU2NoZW1hLFxuICAgIHByb3BlcnR5UGFyZW50PzogUHJvcGVydHlQYXJlbnQsXG4gICAgcHJvcGVydHlLZXk/OiBzdHJpbmdcbiAgKTogRm9ybVByb3BlcnR5IHtcblxuXG4gICAgbGV0IHByb3BlcnR5OiBGb3JtUHJvcGVydHk7XG4gICAgY29uc3QgcGF0aCA9IHRoaXMuZ2VuZXJhdGVQYXRoKHByb3BlcnR5UGFyZW50LCBwcm9wZXJ0eUtleSk7XG5cbiAgICBTY2hlbWFQcmVwcm9jZXNzb3IucHJlcHJvY2VzcyhzY2hlbWEsIHBhdGgpO1xuXG4gICAgLy8gVE9ETyB0ZXN0IGZvciBwYXJzaW5nIGZvciByZWZlcmVuY2Ugc2NoZW1hXG4gICAgaWYgKHNjaGVtYS4kcmVmKSB7XG4gICAgICBjb25zdCByZWZTY2hlbWEgPSB0aGlzLnNjaGVtYVZhbGlkYXRvckZhY3RvcnkuZ2V0U2NoZW1hKFxuICAgICAgICAoPEZvcm1Qcm9wZXJ0eT5wcm9wZXJ0eVBhcmVudC5yb290KS5zY2hlbWEsXG4gICAgICAgIHNjaGVtYS4kcmVmXG4gICAgICApO1xuXG4gICAgICBwcm9wZXJ0eSA9IHRoaXMuY3JlYXRlUHJvcGVydHkoXG4gICAgICAgIHJlZlNjaGVtYSxcbiAgICAgICAgcHJvcGVydHlQYXJlbnQsXG4gICAgICAgIHByb3BlcnR5S2V5IHx8IHBhdGhcbiAgICAgICk7XG5cbiAgICB9IGVsc2Uge1xuICAgICAgc3dpdGNoIChzY2hlbWEudHlwZSkge1xuICAgICAgICBjYXNlIFNjaGVtYVByb3BlcnR5VHlwZS5JbnRlZ2VyOlxuICAgICAgICBjYXNlIFNjaGVtYVByb3BlcnR5VHlwZS5OdW1iZXI6XG4gICAgICAgICAgcHJvcGVydHkgPSBuZXcgTnVtYmVyUHJvcGVydHkocGF0aCwgc2NoZW1hKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBTY2hlbWFQcm9wZXJ0eVR5cGUuU3RyaW5nOlxuICAgICAgICAgIHByb3BlcnR5ID0gbmV3IFN0cmluZ1Byb3BlcnR5KHBhdGgsIHNjaGVtYSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgU2NoZW1hUHJvcGVydHlUeXBlLkJvb2xlYW46XG4gICAgICAgICAgcHJvcGVydHkgPSBuZXcgQm9vbGVhblByb3BlcnR5KHBhdGgsIHNjaGVtYSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgU2NoZW1hUHJvcGVydHlUeXBlLk9iamVjdDpcbiAgICAgICAgICBwcm9wZXJ0eSA9IG5ldyBPYmplY3RQcm9wZXJ0eShwYXRoLCBzY2hlbWEpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFNjaGVtYVByb3BlcnR5VHlwZS5BcnJheTpcbiAgICAgICAgICBpZiAoc2NoZW1hLndpZGdldC5pZCA9PT0gJ2FycmF5Jykge1xuICAgICAgICAgICAgcHJvcGVydHkgPSBuZXcgQXJyYXlQcm9wZXJ0eSh0aGlzLCBwYXRoLCBzY2hlbWEpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBzY2hlbWEuZGVmYXVsdCA9IFtdO1xuICAgICAgICAgICAgcHJvcGVydHkgPSBuZXcgR2VuZXJpY1Byb3BlcnR5KHBhdGgsIHNjaGVtYSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoYFVuZGVmaW5lZCB0eXBlICR7c2NoZW1hLnR5cGV9YCk7XG4gICAgICB9XG4gICAgfVxuXG5cbiAgICB0aGlzLmluaXRpYWxpemVGb3JtUHJvcGVydHkocHJvcGVydHksIHByb3BlcnR5UGFyZW50KTtcblxuXG4gICAgcmV0dXJuIHByb3BlcnR5O1xuICB9XG5cbiAgcHJpdmF0ZSBpbml0aWFsaXplRm9ybVByb3BlcnR5KFxuICAgIHByb3BlcnR5OiBGb3JtUHJvcGVydHksXG4gICAgcHJvcGVydHlQYXJlbnQ/OiBQcm9wZXJ0eVBhcmVudCxcbiAgKSB7XG5cbiAgICBpZiAocHJvcGVydHlQYXJlbnQpIHtcbiAgICAgIHByb3BlcnR5LnNldFBhcmVudChwcm9wZXJ0eVBhcmVudCk7XG4gICAgfVxuXG4gICAgdGhpcy5iaW5kQ3VzdG9tVmFsaWRhdG9yKHByb3BlcnR5KTtcblxuICAgIGlmIChwcm9wZXJ0eSBpbnN0YW5jZW9mIE9iamVjdFByb3BlcnR5KSB7XG4gICAgICBmb3IgKGNvbnN0IGtleSBpbiBwcm9wZXJ0eS5zY2hlbWEucHJvcGVydGllcykge1xuICAgICAgICBpZiAocHJvcGVydHkuc2NoZW1hLnByb3BlcnRpZXMuaGFzT3duUHJvcGVydHkoa2V5KSkge1xuICAgICAgICAgIGNvbnN0IF9zY2hlbWEgPSBwcm9wZXJ0eS5zY2hlbWEucHJvcGVydGllc1trZXldO1xuICAgICAgICAgIGNvbnN0IF9wcm9wZXJ0eSA9IHRoaXMuY3JlYXRlUHJvcGVydHkoX3NjaGVtYSwgcHJvcGVydHksIGtleSk7XG4gICAgICAgICAgcHJvcGVydHkuYWRkQ29udHJvbChrZXksIF9wcm9wZXJ0eSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAocHJvcGVydHkuaXNSb290KSB7XG4gICAgICB0aGlzLmJpbmRTY2hlbWFWYWxpZGF0b3IocHJvcGVydHkpO1xuICAgICAgLy8gbmVlZHMgdG8gcnVuIGFmdGVyIGVudGlyZSBwcm9wZXJ0eSB0cmVlIGlzIGJ1aWx0XG4gICAgICBwcm9wZXJ0eS5iaW5kVmlzaWJpbGl0eSgpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYmluZFNjaGVtYVZhbGlkYXRvcihwcm9wZXJ0eTogRm9ybVByb3BlcnR5KSB7XG5cbiAgICBjb25zdCB2YWxpZGF0ZSA9IHRoaXMuc2NoZW1hVmFsaWRhdG9yRmFjdG9yeS5jcmVhdGVWYWxpZGF0b3JGbihcbiAgICAgIHByb3BlcnR5LnNjaGVtYVxuICAgICk7XG5cbiAgICAvLyBUT0RPIHVzZSBwaXBlIHN0YXJ0V2l0aCB0byBkbyBpbml0aWFsIHJ1blxuICAgIHByb3BlcnR5LnZhbHVlQ2hhbmdlc1xuICAgICAgLnBpcGUoc3RhcnRXaXRoKG51bGwpKVxuICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gcHJvcGVydHkubm9uRW1wdHlWYWx1ZTtcbiAgICAgICAgcHJvcGVydHkubm9uRW1wdHlWYWx1ZUNoYW5nZXMuZW1pdCh2YWx1ZSk7XG5cbiAgICAgICAgY29uc3QgZXJyb3JzID0gdmFsaWRhdGUodmFsdWUpO1xuICAgICAgICBpZiAoIWVycm9ycykge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIE9iamVjdC5rZXlzKGVycm9ycykuZm9yRWFjaCgocGF0aDogc3RyaW5nKSA9PiB7XG4gICAgICAgICAgY29uc3QgY29udHJvbCA9IHByb3BlcnR5LmdldChwYXRoKTtcbiAgICAgICAgICBpZiAoY29udHJvbCkge1xuICAgICAgICAgICAgLy8gc2V0IGVycm9yIHRvIHNwZWNpZmljIGNvbnRyb2xcbiAgICAgICAgICAgIGNvbnRyb2wuc2V0RXJyb3JzKGVycm9yc1twYXRoXSwgeyBlbWl0RXZlbnQ6IHRydWUgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBiaW5kQ3VzdG9tVmFsaWRhdG9yKHByb3BlcnR5OiBGb3JtUHJvcGVydHkpIHtcbiAgICBjb25zdCB2YWxpZGF0b3JzID0gdGhpcy52YWxpZGF0b3JSZWdpc3RyeS5nZXQocHJvcGVydHkucGF0aCk7XG4gICAgaWYgKHZhbGlkYXRvcnMpIHtcbiAgICAgIHByb3BlcnR5LnNldFZhbGlkYXRvcnModmFsaWRhdG9ycyk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBnZW5lcmF0ZVBhdGgoXG4gICAgcHJvcGVydHlQYXJlbnQ/OiBQcm9wZXJ0eVBhcmVudCxcbiAgICBwcm9wZXJ0eUtleT86IHN0cmluZ1xuICApOiBzdHJpbmcge1xuXG4gICAgaWYgKCFwcm9wZXJ0eVBhcmVudCkge1xuICAgICAgcmV0dXJuICcvJztcbiAgICB9XG5cbiAgICBsZXQgcGF0aCA9ICcnO1xuICAgIHBhdGggKz0gcHJvcGVydHlQYXJlbnQucGF0aDtcblxuXG4gICAgaWYgKHByb3BlcnR5UGFyZW50LnBhcmVudCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBwYXRoICs9ICcvJztcbiAgICB9XG5cbiAgICBzd2l0Y2ggKHByb3BlcnR5UGFyZW50LnNjaGVtYS50eXBlKSB7XG4gICAgICBjYXNlIFNjaGVtYVByb3BlcnR5VHlwZS5PYmplY3Q6XG4gICAgICAgIHBhdGggKz0gcHJvcGVydHlLZXk7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlIFNjaGVtYVByb3BlcnR5VHlwZS5BcnJheTpcbiAgICAgICAgcGF0aCArPSAoPEFycmF5UHJvcGVydHk+cHJvcGVydHlQYXJlbnQpLmNvbnRyb2xzLmxlbmd0aDtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIC8vIFRPRE8gbW92ZSB0byBjbGFzc1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgJ0luc3RhbnRpYXRpb24gb2YgYSBGb3JtUHJvcGVydHkgd2l0aCBhbiB1bmtub3duIHBhcmVudCB0eXBlOiAnICtcbiAgICAgICAgICAgIHByb3BlcnR5UGFyZW50LnNjaGVtYS50eXBlXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHBhdGg7XG4gIH1cbn1cbiJdfQ==