UNPKG

ng2-formobject

Version:

Create forms from objects with Angular2

150 lines 18 kB
"use strict"; /** * Created by haiko on 18-4-16. * * Creates a ControlGroup and Controls for fields from given Object. Traverses object tree until primary type are encountered ( string, number, boolean ). */ var common_1 = require('@angular/common'); require('rxjs/add/operator/debounceTime'); var _ = require('lodash'); var form_validators_1 = require('./form.validators'); var decorator = require('./decorators'); var FormObjectBuilder = (function () { /** * Construct a new ControlGroup and Controls for given object. * Names for controls * * @param object */ function FormObjectBuilder(object) { this.controls = {}; this.formModel = object; this._createControls(this.formModel, ''); this.controlGroup = new common_1.ControlGroup(this.controls); } /** * Retrieve FormObject. */ FormObjectBuilder.prototype.getFormObject = function () { return this.formModel; }; FormObjectBuilder.prototype.getControlGroup = function () { return this.controlGroup; }; /** * Return Control for given key * * @param name key for Control. * @returns {Control} */ FormObjectBuilder.prototype.getControl = function (name) { return this.controls[name]; }; /** * Mark all controls dirty. */ FormObjectBuilder.prototype.dirtyControls = function () { for (var controlKey in this.controls) { var control = this.controls[controlKey]; control.markAsDirty(); } }; /** * Return all invalid controls with propertyname as key. * * @returns {key:Control} */ FormObjectBuilder.prototype.getInvalidControls = function () { var invalid = {}; for (var controlKey in this.controls) { var control = this.controls[controlKey]; if (!control.valid) { invalid[controlKey] = control; } } return invalid; }; /** * Create controls for properties of object and nested object * * NULL and UNDEFINED values throws errors!! * * @param object an Object * @param prefix creating navigating path on object to get property. * @private */ FormObjectBuilder.prototype._createControls = function (object, prefix) { var _loop_1 = function(property) { if (object.hasOwnProperty(property)) { if (object[property] === null || object[property] === 'undefined') { throw new Error('cannot determine type of ' + property); } if (this_1._isPrimitive(object, property)) { var propertyName_1 = property; if (prefix) { propertyName_1 = prefix.concat('.').concat(property); } var validatorComponents = []; this_1._addValidators(object, property, validatorComponents); var control = null; if (validatorComponents.length > 0) { control = new common_1.Control(object[property], common_1.Validators.compose(validatorComponents)); } else { control = new common_1.Control(object[property]); } this_1.controls[propertyName_1] = control; var self_1 = this_1; control.valueChanges.debounceTime(500 /* ms */) .subscribe(function (newValue) { // touch value to make it work. var value = newValue; _.set(self_1.formModel, propertyName_1, value); }); } else if (typeof object[property] === 'object' && !Array.isArray(object[property])) { this_1._createControls(object[property], property); } else { console.log(property + ' not found in given object'); } } }; var this_1 = this; for (var property in object) { _loop_1(property); } }; FormObjectBuilder.prototype._addValidators = function (object, property, validatorComponents) { if (Reflect.hasMetadata(decorator.VALIDATORS, object, property)) { var validators = Reflect.getMetadata(decorator.VALIDATORS, object, property); // required if (validators.indexOf('required') > -1) { validatorComponents.push(common_1.Validators.required); } // email if (validators.indexOf('emailCheck') > -1) { validatorComponents.push(form_validators_1.FormValidators.isMailAddress); } // NaN check if (validators.indexOf('numberCheck') > -1) { validatorComponents.push(form_validators_1.FormValidators.isNumber); } } }; /** * Check properties on given object. * * @param object * @param property * @returns {boolean|boolean} */ FormObjectBuilder.prototype._isPrimitive = function (object, property) { return typeof object[property] === 'number' || typeof object[property] === 'string' || typeof object[property] === 'boolean' || (typeof object[property] === 'object' && Array.isArray(object[property])) || (typeof object[property] === 'object' && Object.prototype.toString.call(object[property]) === '[object Date]'); }; return FormObjectBuilder; }()); exports.FormObjectBuilder = FormObjectBuilder; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9ybS1vYmplY3QuYnVpbGRlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9mb3JtLW9iamVjdC5idWlsZGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTs7OztHQUlHO0FBQ0gsdUJBQWtELGlCQUFpQixDQUFDLENBQUE7QUFDcEUsUUFBTyxnQ0FBZ0MsQ0FBQyxDQUFBO0FBQ3hDLElBQVksQ0FBQyxXQUFNLFFBQVEsQ0FBQyxDQUFBO0FBQzVCLGdDQUErQixtQkFBbUIsQ0FBQyxDQUFBO0FBQ25ELElBQVksU0FBUyxXQUFNLGNBQWMsQ0FBQyxDQUFBO0FBSTFDO0lBU0U7Ozs7O09BS0c7SUFDSCwyQkFBWSxNQUFXO1FBWGYsYUFBUSxHQUE4QixFQUFFLENBQUM7UUFhL0MsSUFBSSxDQUFDLFNBQVMsR0FBRyxNQUFNLENBQUM7UUFDeEIsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLEVBQUUsQ0FBQyxDQUFBO1FBQ3hDLElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxxQkFBWSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUN0RCxDQUFDO0lBR0Q7O09BRUc7SUFDSCx5Q0FBYSxHQUFiO1FBQ0UsTUFBTSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUM7SUFDeEIsQ0FBQztJQUVELDJDQUFlLEdBQWY7UUFDRSxNQUFNLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQztJQUMzQixDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSCxzQ0FBVSxHQUFWLFVBQVcsSUFBWTtRQUNyQixNQUFNLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUM3QixDQUFDO0lBRUQ7O09BRUc7SUFDSCx5Q0FBYSxHQUFiO1FBQ0UsR0FBRyxDQUFDLENBQUMsSUFBSSxVQUFVLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUM7WUFDckMsSUFBSSxPQUFPLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsQ0FBQztZQUN4QyxPQUFPLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDeEIsQ0FBQztJQUNILENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsOENBQWtCLEdBQWxCO1FBQ0UsSUFBSSxPQUFPLEdBQThCLEVBQUUsQ0FBQztRQUU1QyxHQUFHLENBQUMsQ0FBQyxJQUFJLFVBQVUsSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQztZQUNyQyxJQUFJLE9BQU8sR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1lBRXhDLEVBQUUsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7Z0JBQ25CLE9BQU8sQ0FBQyxVQUFVLENBQUMsR0FBSSxPQUFPLENBQUM7WUFDakMsQ0FBQztRQUNILENBQUM7UUFDRCxNQUFNLENBQUMsT0FBTyxDQUFDO0lBQ2pCLENBQUM7SUFFRDs7Ozs7Ozs7T0FRRztJQUNILDJDQUFlLEdBQWYsVUFBZ0IsTUFBVyxFQUFFLE1BQWM7UUFDekM7WUFDRSxFQUFFLENBQUMsQ0FBQyxNQUFNLENBQUMsY0FBYyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDcEMsRUFBRSxDQUFDLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxLQUFLLElBQUksSUFBSSxNQUFNLENBQUMsUUFBUSxDQUFDLEtBQUssV0FBVyxDQUFDLENBQUMsQ0FBQztvQkFDbEUsTUFBTSxJQUFJLEtBQUssQ0FBQywyQkFBMkIsR0FBRyxRQUFRLENBQUMsQ0FBQztnQkFDMUQsQ0FBQztnQkFFRCxFQUFFLENBQUMsQ0FBQyxNQUFJLENBQUMsWUFBWSxDQUFDLE1BQU0sRUFBRSxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUM7b0JBQ3hDLElBQUksY0FBWSxHQUFHLFFBQVEsQ0FBQztvQkFFNUIsRUFBRSxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQzt3QkFDWCxjQUFZLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUM7b0JBQ3JELENBQUM7b0JBRUQsSUFBSSxtQkFBbUIsR0FBZSxFQUFFLENBQUM7b0JBRXpDLE1BQUksQ0FBQyxjQUFjLENBQUMsTUFBTSxFQUFFLFFBQVEsRUFBRSxtQkFBbUIsQ0FBQyxDQUFDO29CQUUzRCxJQUFJLE9BQU8sR0FBUSxJQUFJLENBQUM7b0JBRXhCLEVBQUUsQ0FBQyxDQUFDLG1CQUFtQixDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO3dCQUNuQyxPQUFPLEdBQUcsSUFBSSxnQkFBTyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsRUFBRSxtQkFBVSxDQUFDLE9BQU8sQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLENBQUM7b0JBQ25GLENBQUM7b0JBQ0QsSUFBSSxDQUFDLENBQUM7d0JBQ0osT0FBTyxHQUFHLElBQUksZ0JBQU8sQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQztvQkFDMUMsQ0FBQztvQkFFRCxNQUFJLENBQUMsUUFBUSxDQUFDLGNBQVksQ0FBQyxHQUFHLE9BQU8sQ0FBQztvQkFFdEMsSUFBSSxNQUFJLEdBQUcsTUFBSSxDQUFDO29CQUVoQixPQUFPLENBQUMsWUFBWSxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDO3lCQUM1QyxTQUFTLENBQUMsVUFBQyxRQUFhO3dCQUV2QiwrQkFBK0I7d0JBQy9CLElBQUksS0FBSyxHQUFHLFFBQVEsQ0FBQzt3QkFDckIsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxNQUFJLENBQUMsU0FBUyxFQUFFLGNBQVksRUFBRSxLQUFLLENBQUMsQ0FBQztvQkFDN0MsQ0FBQyxDQUFDLENBQUM7Z0JBRVAsQ0FBQztnQkFBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsT0FBTyxNQUFNLENBQUMsUUFBUSxDQUFDLEtBQUssUUFBUSxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7b0JBQ3BGLE1BQUksQ0FBQyxlQUFlLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxFQUFFLFFBQVEsQ0FBQyxDQUFDO2dCQUNuRCxDQUFDO2dCQUFDLElBQUksQ0FBQyxDQUFDO29CQUNOLE9BQU8sQ0FBQyxHQUFHLENBQUMsUUFBUSxHQUFHLDRCQUE0QixDQUFDLENBQUM7Z0JBQ3ZELENBQUM7WUFDSCxDQUFDOzs7UUEzQ0gsR0FBRyxDQUFDLENBQUMsSUFBSSxRQUFRLElBQUksTUFBTSxDQUFDOztTQTRDM0I7SUFDSCxDQUFDO0lBRU8sMENBQWMsR0FBdEIsVUFBdUIsTUFBVyxFQUFFLFFBQWdCLEVBQUUsbUJBQStCO1FBQy9FLEVBQUUsQ0FBQyxDQUFFLE9BQU8sQ0FBQyxXQUFXLENBQUMsU0FBUyxDQUFDLFVBQVUsRUFBRSxNQUFNLEVBQUcsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBRWxFLElBQUksVUFBVSxHQUFrQixPQUFPLENBQUMsV0FBVyxDQUFDLFNBQVMsQ0FBQyxVQUFVLEVBQUUsTUFBTSxFQUFFLFFBQVEsQ0FBQyxDQUFDO1lBRTVGLFdBQVc7WUFDWCxFQUFFLENBQUMsQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsQ0FBRSxDQUFDLENBQUMsQ0FBQztnQkFDekMsbUJBQW1CLENBQUMsSUFBSSxDQUFDLG1CQUFVLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDaEQsQ0FBQztZQUVELFFBQVE7WUFDUixFQUFFLENBQUMsQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsQ0FBRSxDQUFDLENBQUMsQ0FBQztnQkFDM0MsbUJBQW1CLENBQUMsSUFBSSxDQUFDLGdDQUFjLENBQUMsYUFBYSxDQUFDLENBQUM7WUFDekQsQ0FBQztZQUVELFlBQVk7WUFDWixFQUFFLENBQUMsQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsQ0FBRSxDQUFDLENBQUMsQ0FBQztnQkFDNUMsbUJBQW1CLENBQUMsSUFBSSxDQUFDLGdDQUFjLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDcEQsQ0FBQztRQUNILENBQUM7SUFDSCxDQUFDO0lBRUw7Ozs7OztPQU1HO0lBQ0ssd0NBQVksR0FBcEIsVUFBcUIsTUFBVyxFQUFFLFFBQWdCO1FBQzlDLE1BQU0sQ0FBQyxPQUFPLE1BQU0sQ0FBQyxRQUFRLENBQUMsS0FBSyxRQUFRLElBQUksT0FBTyxNQUFNLENBQUMsUUFBUSxDQUFDLEtBQUssUUFBUSxJQUFJLE9BQU8sTUFBTSxDQUFDLFFBQVEsQ0FBQyxLQUFLLFNBQVM7ZUFDckgsQ0FBQyxPQUFPLE1BQU0sQ0FBQyxRQUFRLENBQUMsS0FBSyxRQUFRLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQztlQUN6RSxDQUFDLE9BQU8sTUFBTSxDQUFDLFFBQVEsQ0FBQyxLQUFLLFFBQVEsSUFBSSxNQUFNLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDLEtBQUssZUFBZSxDQUFDLENBQUM7SUFDdEgsQ0FBQztJQUNQLHdCQUFDO0FBQUQsQ0FBQyxBQW5LRCxJQW1LQztBQW5LWSx5QkFBaUIsb0JBbUs3QixDQUFBIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBDcmVhdGVkIGJ5IGhhaWtvIG9uIDE4LTQtMTYuXG4gKlxuICogQ3JlYXRlcyBhIENvbnRyb2xHcm91cCBhbmQgQ29udHJvbHMgZm9yIGZpZWxkcyBmcm9tIGdpdmVuIE9iamVjdC4gVHJhdmVyc2VzIG9iamVjdCB0cmVlIHVudGlsIHByaW1hcnkgdHlwZSBhcmUgZW5jb3VudGVyZWQgKCBzdHJpbmcsIG51bWJlciwgYm9vbGVhbiApLlxuICovXG5pbXBvcnQgeyBWYWxpZGF0b3JzLCBDb250cm9sLCBDb250cm9sR3JvdXAgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0ICdyeGpzL2FkZC9vcGVyYXRvci9kZWJvdW5jZVRpbWUnO1xuaW1wb3J0ICogYXMgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IHsgRm9ybVZhbGlkYXRvcnMgfSBmcm9tICcuL2Zvcm0udmFsaWRhdG9ycyc7XG5pbXBvcnQgKiBhcyBkZWNvcmF0b3IgZnJvbSAnLi9kZWNvcmF0b3JzJztcblxuXG5cbmV4cG9ydCBjbGFzcyBGb3JtT2JqZWN0QnVpbGRlcjxUPiB7XG5cbiAgcHVibGljIGNvbnRyb2xHcm91cDogQ29udHJvbEdyb3VwO1xuXG4gIHByaXZhdGUgY29udHJvbHM6IHsgW2tleTogc3RyaW5nXTogQ29udHJvbH0gPSB7fTtcblxuICBwcml2YXRlIGZvcm1Nb2RlbDogYW55O1xuXG5cbiAgLyoqXG4gICAqICBDb25zdHJ1Y3QgYSBuZXcgQ29udHJvbEdyb3VwIGFuZCBDb250cm9scyBmb3IgZ2l2ZW4gb2JqZWN0LlxuICAgKiAgTmFtZXMgZm9yIGNvbnRyb2xzXG4gICAqXG4gICAqIEBwYXJhbSBvYmplY3RcbiAgICovXG4gIGNvbnN0cnVjdG9yKG9iamVjdDogYW55KSB7XG5cbiAgICB0aGlzLmZvcm1Nb2RlbCA9IG9iamVjdDtcbiAgICB0aGlzLl9jcmVhdGVDb250cm9scyh0aGlzLmZvcm1Nb2RlbCwgJycpXG4gICAgdGhpcy5jb250cm9sR3JvdXAgPSBuZXcgQ29udHJvbEdyb3VwKHRoaXMuY29udHJvbHMpO1xuICB9XG5cblxuICAvKipcbiAgICogIFJldHJpZXZlIEZvcm1PYmplY3QuXG4gICAqL1xuICBnZXRGb3JtT2JqZWN0PFQgZXh0ZW5kcyBPYmplY3Q+KCkge1xuICAgIHJldHVybiB0aGlzLmZvcm1Nb2RlbDtcbiAgfVxuXG4gIGdldENvbnRyb2xHcm91cCgpIHtcbiAgICByZXR1cm4gdGhpcy5jb250cm9sR3JvdXA7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJuIENvbnRyb2wgZm9yIGdpdmVuIGtleVxuICAgKlxuICAgKiBAcGFyYW0gbmFtZSBrZXkgZm9yIENvbnRyb2wuXG4gICAqIEByZXR1cm5zIHtDb250cm9sfVxuICAgKi9cbiAgZ2V0Q29udHJvbChuYW1lOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5jb250cm9sc1tuYW1lXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBNYXJrIGFsbCBjb250cm9scyBkaXJ0eS5cbiAgICovXG4gIGRpcnR5Q29udHJvbHMoKSB7XG4gICAgZm9yIChsZXQgY29udHJvbEtleSBpbiB0aGlzLmNvbnRyb2xzKSB7XG4gICAgICBsZXQgY29udHJvbCA9IHRoaXMuY29udHJvbHNbY29udHJvbEtleV07XG4gICAgICBjb250cm9sLm1hcmtBc0RpcnR5KCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybiBhbGwgaW52YWxpZCBjb250cm9scyB3aXRoIHByb3BlcnR5bmFtZSBhcyBrZXkuXG4gICAqXG4gICAqIEByZXR1cm5zIHtrZXk6Q29udHJvbH1cbiAgICovXG4gIGdldEludmFsaWRDb250cm9scygpIHtcbiAgICBsZXQgaW52YWxpZDogeyBba2V5OiBzdHJpbmddOiBDb250cm9sfSA9IHt9O1xuXG4gICAgZm9yIChsZXQgY29udHJvbEtleSBpbiB0aGlzLmNvbnRyb2xzKSB7XG4gICAgICBsZXQgY29udHJvbCA9IHRoaXMuY29udHJvbHNbY29udHJvbEtleV07XG5cbiAgICAgIGlmICghY29udHJvbC52YWxpZCkge1xuICAgICAgICBpbnZhbGlkW2NvbnRyb2xLZXldID0gIGNvbnRyb2w7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBpbnZhbGlkO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBjb250cm9scyBmb3IgcHJvcGVydGllcyBvZiBvYmplY3QgYW5kIG5lc3RlZCBvYmplY3RcbiAgICpcbiAgICogTlVMTCBhbmQgVU5ERUZJTkVEIHZhbHVlcyB0aHJvd3MgZXJyb3JzISFcbiAgICpcbiAgICogQHBhcmFtIG9iamVjdCBhbiBPYmplY3RcbiAgICogQHBhcmFtIHByZWZpeCBjcmVhdGluZyBuYXZpZ2F0aW5nIHBhdGggb24gb2JqZWN0IHRvIGdldCBwcm9wZXJ0eS5cbiAgICogQHByaXZhdGVcbiAgICovXG4gIF9jcmVhdGVDb250cm9scyhvYmplY3Q6IGFueSwgcHJlZml4OiBzdHJpbmcpIHtcbiAgICBmb3IgKGxldCBwcm9wZXJ0eSBpbiBvYmplY3QpIHtcbiAgICAgIGlmIChvYmplY3QuaGFzT3duUHJvcGVydHkocHJvcGVydHkpKSB7XG4gICAgICAgIGlmIChvYmplY3RbcHJvcGVydHldID09PSBudWxsIHx8IG9iamVjdFtwcm9wZXJ0eV0gPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdjYW5ub3QgZGV0ZXJtaW5lIHR5cGUgb2YgJyArIHByb3BlcnR5KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLl9pc1ByaW1pdGl2ZShvYmplY3QsIHByb3BlcnR5KSkge1xuICAgICAgICAgIGxldCBwcm9wZXJ0eU5hbWUgPSBwcm9wZXJ0eTtcblxuICAgICAgICAgIGlmIChwcmVmaXgpIHtcbiAgICAgICAgICAgIHByb3BlcnR5TmFtZSA9IHByZWZpeC5jb25jYXQoJy4nKS5jb25jYXQocHJvcGVydHkpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGxldCB2YWxpZGF0b3JDb21wb25lbnRzOiBBcnJheTxhbnk+ID0gW107XG5cbiAgICAgICAgICB0aGlzLl9hZGRWYWxpZGF0b3JzKG9iamVjdCwgcHJvcGVydHksIHZhbGlkYXRvckNvbXBvbmVudHMpO1xuXG4gICAgICAgICAgbGV0IGNvbnRyb2w6IGFueSA9IG51bGw7XG5cbiAgICAgICAgICBpZiAodmFsaWRhdG9yQ29tcG9uZW50cy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBjb250cm9sID0gbmV3IENvbnRyb2wob2JqZWN0W3Byb3BlcnR5XSwgVmFsaWRhdG9ycy5jb21wb3NlKHZhbGlkYXRvckNvbXBvbmVudHMpKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBjb250cm9sID0gbmV3IENvbnRyb2wob2JqZWN0W3Byb3BlcnR5XSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdGhpcy5jb250cm9sc1twcm9wZXJ0eU5hbWVdID0gY29udHJvbDtcblxuICAgICAgICAgIGxldCBzZWxmID0gdGhpcztcblxuICAgICAgICAgIGNvbnRyb2wudmFsdWVDaGFuZ2VzLmRlYm91bmNlVGltZSg1MDAgLyogbXMgKi8pXG4gICAgICAgICAgICAuc3Vic2NyaWJlKChuZXdWYWx1ZTogYW55KSA9PiB7XG5cbiAgICAgICAgICAgICAgLy8gdG91Y2ggdmFsdWUgdG8gbWFrZSBpdCB3b3JrLlxuICAgICAgICAgICAgICBsZXQgdmFsdWUgPSBuZXdWYWx1ZTtcbiAgICAgICAgICAgICAgXy5zZXQoc2VsZi5mb3JtTW9kZWwsIHByb3BlcnR5TmFtZSwgdmFsdWUpO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgfSBlbHNlIGlmICh0eXBlb2Ygb2JqZWN0W3Byb3BlcnR5XSA9PT0gJ29iamVjdCcgJiYgIUFycmF5LmlzQXJyYXkob2JqZWN0W3Byb3BlcnR5XSkpIHtcbiAgICAgICAgICB0aGlzLl9jcmVhdGVDb250cm9scyhvYmplY3RbcHJvcGVydHldLCBwcm9wZXJ0eSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29uc29sZS5sb2cocHJvcGVydHkgKyAnIG5vdCBmb3VuZCBpbiBnaXZlbiBvYmplY3QnKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgX2FkZFZhbGlkYXRvcnMob2JqZWN0OiBhbnksIHByb3BlcnR5OiBzdHJpbmcsIHZhbGlkYXRvckNvbXBvbmVudHM6IEFycmF5PGFueT4pIHtcbiAgICAgICAgaWYgKCBSZWZsZWN0Lmhhc01ldGFkYXRhKGRlY29yYXRvci5WQUxJREFUT1JTLCBvYmplY3QsICBwcm9wZXJ0eSkpIHtcblxuICAgICAgICAgIGxldCB2YWxpZGF0b3JzOiBBcnJheTxzdHJpbmc+ID0gUmVmbGVjdC5nZXRNZXRhZGF0YShkZWNvcmF0b3IuVkFMSURBVE9SUywgb2JqZWN0LCBwcm9wZXJ0eSk7XG5cbiAgICAgICAgICAvLyByZXF1aXJlZFxuICAgICAgICAgIGlmICh2YWxpZGF0b3JzLmluZGV4T2YoJ3JlcXVpcmVkJykgPiAtMSApIHtcbiAgICAgICAgICAgIHZhbGlkYXRvckNvbXBvbmVudHMucHVzaChWYWxpZGF0b3JzLnJlcXVpcmVkKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBlbWFpbFxuICAgICAgICAgIGlmICh2YWxpZGF0b3JzLmluZGV4T2YoJ2VtYWlsQ2hlY2snKSA+IC0xICkge1xuICAgICAgICAgICAgdmFsaWRhdG9yQ29tcG9uZW50cy5wdXNoKEZvcm1WYWxpZGF0b3JzLmlzTWFpbEFkZHJlc3MpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIE5hTiBjaGVja1xuICAgICAgICAgIGlmICh2YWxpZGF0b3JzLmluZGV4T2YoJ251bWJlckNoZWNrJykgPiAtMSApIHtcbiAgICAgICAgICAgIHZhbGlkYXRvckNvbXBvbmVudHMucHVzaChGb3JtVmFsaWRhdG9ycy5pc051bWJlcik7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIHByb3BlcnRpZXMgb24gZ2l2ZW4gb2JqZWN0LlxuICAgKlxuICAgKiBAcGFyYW0gb2JqZWN0XG4gICAqIEBwYXJhbSBwcm9wZXJ0eVxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbnxib29sZWFufVxuICAgKi9cbiAgcHJpdmF0ZSBfaXNQcmltaXRpdmUob2JqZWN0OiBhbnksIHByb3BlcnR5OiBzdHJpbmcpIHtcbiAgICAgIHJldHVybiB0eXBlb2Ygb2JqZWN0W3Byb3BlcnR5XSA9PT0gJ251bWJlcicgfHwgdHlwZW9mIG9iamVjdFtwcm9wZXJ0eV0gPT09ICdzdHJpbmcnIHx8IHR5cGVvZiBvYmplY3RbcHJvcGVydHldID09PSAnYm9vbGVhbidcbiAgICAgICAgICB8fCAodHlwZW9mIG9iamVjdFtwcm9wZXJ0eV0gPT09ICdvYmplY3QnICYmIEFycmF5LmlzQXJyYXkob2JqZWN0W3Byb3BlcnR5XSkpXG4gICAgICAgICAgfHwgKHR5cGVvZiBvYmplY3RbcHJvcGVydHldID09PSAnb2JqZWN0JyAmJiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwob2JqZWN0W3Byb3BlcnR5XSkgPT09ICdbb2JqZWN0IERhdGVdJyk7XG4gICAgICB9XG59XG4iXX0=