From e5fe29319dfa54bfba5c61f7aa3eb276a44bd97f Mon Sep 17 00:00:00 2001 From: Noah Robison-Cox Date: Tue, 28 Mar 2017 09:48:58 -0400 Subject: [PATCH] render schemas inside types to support JSON schema version 3 --- dist/bundle.js | 36 +++++++++++++++++++++++++++++++----- dist/bundle.min.js | 2 +- dist/style.css | 2 +- dist/style.min.css | 2 +- src/index.js | 42 ++++++++++++++++++++++++++++++++++++++++-- test/spec.js | 41 +++++++++++++++++++++++++++++++++++++++++ 6 files changed, 115 insertions(+), 10 deletions(-) diff --git a/dist/bundle.js b/dist/bundle.js index eceb975..f10476f 100644 --- a/dist/bundle.js +++ b/dist/bundle.js @@ -76,7 +76,8 @@ var _templateObject = _taggedTemplateLiteral(['\n
\n _templateObject22 = _taggedTemplateLiteral(['\n
\n ', ' {', '\n\n
\n ', '\n \n
\n\n ', '\n\n ', '\n ', '\n ', '\n\n ', '\n
\n '], ['\n
\n ', ' {', '\n\n
\n ', '\n \n
\n\n ', '\n\n ', '\n ', '\n ', '\n\n ', '\n
\n ']), _templateObject23 = _taggedTemplateLiteral(['\n }\n '], ['\n }\n ']), _templateObject24 = _taggedTemplateLiteral(['\n }\n '], ['\n }\n ']), - _templateObject25 = _taggedTemplateLiteral(['\n
\n Enum:\n
\n '], ['\n
\n Enum:\n
\n ']); + _templateObject25 = _taggedTemplateLiteral(['\n
\n ', '\n ', '\n
\n ', '\n \n
\n
\n '], ['\n
\n ', '\n ', '\n
\n ', '\n \n
\n
\n ']), + _templateObject26 = _taggedTemplateLiteral(['\n
\n Enum:\n
\n '], ['\n
\n Enum:\n
\n ']); function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } } @@ -114,6 +115,9 @@ var JSONSchemaView = (function () { this.options = options; this.isCollapsed = open <= 0; + // Guard against empty schemas + if (!this.schema) return ''; + // if schema is an empty object which means any JOSN this.isAny = typeof schema === 'object' && !Array.isArray(schema) && !Object.keys(schema).filter(function (k) { return ['title', 'description'].indexOf(k) === -1; @@ -122,10 +126,15 @@ var JSONSchemaView = (function () { // Determine if a schema is an array this.isArray = !this.isAny && this.schema && this.schema.type === 'array'; + // Determine if a schema is a collection of types (an Array with at least one object in it) + this.isCollectionOfTypes = this.schema && Array.isArray(this.schema.type) && this.schema.type.reduce(function (item) { + return typeof item === 'object'; + }); + this.isObject = this.schema && (this.schema.type === 'object' || this.schema.properties || this.schema.anyOf || this.schema.oneof || this.schema.allOf); // Determine if a schema is a primitive - this.isPrimitive = !this.isAny && !this.isArray && !this.isObject; + this.isPrimitive = !this.isAny && !this.isArray && !this.isObject && !this.isCollectionOfTypes; // this.showToggle = this.schema.description || this.schema.title || this.isPrimitive && (this.schema.minimum || this.schema.maximum || this.schema.exclusiveMinimum || this.schema.exclusiveMaximum || this.schema.format || this.schema['default'] || this.schema.minLength || this.schema.maxLength || this.schema['enum']); @@ -138,6 +147,13 @@ var JSONSchemaView = (function () { } }); } + + // Create a list of types as a string for Collections of types + if (this.isCollectionOfTypes) { + this.typeList = this.schema.type.reduce(function (prev, curr) { + return prev.type + ', ' + curr.type; + }); + } } /* @@ -152,7 +168,7 @@ var JSONSchemaView = (function () { return ''; } - return ('\n \n ' + (0, _helpersJs._if)(this.isAny)(_templateObject, (0, _helpersJs._if)(this.showToggle)(_templateObject2, this.schema.title || ''), (0, _helpersJs._if)(this.schema.description && !this.isCollapsed)(_templateObject3, this.schema.description)) + '\n\n \n ' + (0, _helpersJs._if)(this.isPrimitive)(_templateObject4, (0, _helpersJs._if)(this.showToggle)(_templateObject2, this.schema.title || ''), this.schema.type, (0, _helpersJs._if)(this.schema.isRequired)(_templateObject5), (0, _helpersJs._if)(!this.isCollapsed && this.schema.format)(_templateObject6, this.schema.format), (0, _helpersJs._if)(!this.isCollapsed && this.schema['default'])(_templateObject7, this.schema['default']), (0, _helpersJs._if)(!this.isCollapsed && this.schema.minimum)(_templateObject8, this.schema.minimum), (0, _helpersJs._if)(!this.isCollapsed && this.schema.exclusiveMinimum)(_templateObject9, this.schema.exclusiveMinimum), (0, _helpersJs._if)(!this.isCollapsed && this.schema.maximum)(_templateObject10, this.schema.maximum), (0, _helpersJs._if)(!this.isCollapsed && this.schema.exclusiveMaximum)(_templateObject11, this.schema.exclusiveMaximum), (0, _helpersJs._if)(!this.isCollapsed && this.schema.minLength)(_templateObject12, this.schema.minLength), (0, _helpersJs._if)(!this.isCollapsed && this.schema.maxLength)(_templateObject13, this.schema.maxLength), (0, _helpersJs._if)(this.schema.description && !this.isCollapsed)(_templateObject3, this.schema.description), (0, _helpersJs._if)(!this.isCollapsed && this.schema['enum'])(_templateObject14, this['enum'](this.schema, this.isCollapsed, this.open)), (0, _helpersJs._if)(this.schema.allOf && !this.isCollapsed)(_templateObject15, this.xOf(this.schema, 'allOf')), (0, _helpersJs._if)(this.schema.oneOf && !this.isCollapsed)(_templateObject15, this.xOf(this.schema, 'oneOf')), (0, _helpersJs._if)(this.schema.anyOf && !this.isCollapsed)(_templateObject15, this.xOf(this.schema, 'anyOf'))) + '\n\n\n \n ' + (0, _helpersJs._if)(this.isArray)(_templateObject16, this.schema.title || '', (0, _helpersJs._if)(this.isCollapsed)(_templateObject17), (0, _helpersJs._if)(!this.isCollapsed && (this.schema.uniqueItems || this.schema.minItems || this.schema.maxItems))(_templateObject18, this.schema.minItems || 0, this.schema.maxItems || '∞', (0, _helpersJs._if)(!this.isCollapsed && this.schema.uniqueItems)(_templateObject19)), (0, _helpersJs._if)(!this.isCollapsed && this.schema.description)(_templateObject20, this.schema.description), (0, _helpersJs._if)(!this.isCollapsed && this.schema['enum'])(_templateObject14, this['enum'](this.schema, this.isCollapsed, this.open)), (0, _helpersJs._if)(this.schema.allOf && !this.isCollapsed)(_templateObject15, this.xOf(this.schema, 'allOf')), (0, _helpersJs._if)(this.schema.oneOf && !this.isCollapsed)(_templateObject15, this.xOf(this.schema, 'oneOf')), (0, _helpersJs._if)(this.schema.anyOf && !this.isCollapsed)(_templateObject15, this.xOf(this.schema, 'anyOf')), (0, _helpersJs._if)(!this.isCollapsed)(_templateObject21)) + '\n\n \n ' + (0, _helpersJs._if)(!this.isPrimitive && !this.isArray && !this.isAny)(_templateObject22, this.schema.title || '', (0, _helpersJs._if)(this.isCollapsed)(_templateObject23), (0, _helpersJs._if)(!this.isCollapsed && this.schema.description)(_templateObject20, this.schema.description), (0, _helpersJs._if)(!this.isCollapsed && this.schema['enum'])(_templateObject14, this['enum'](this.schema, this.isCollapsed, this.open)), (0, _helpersJs._if)(this.schema.allOf && !this.isCollapsed)(_templateObject15, this.xOf(this.schema, 'allOf')), (0, _helpersJs._if)(this.schema.oneOf && !this.isCollapsed)(_templateObject15, this.xOf(this.schema, 'oneOf')), (0, _helpersJs._if)(this.schema.anyOf && !this.isCollapsed)(_templateObject15, this.xOf(this.schema, 'anyOf')), (0, _helpersJs._if)(!this.isCollapsed)(_templateObject24)) + '\n').replace(/\s*\n/g, '\n').replace(/(\<\!\-\-).+/g, '').trim(); + return ('\n \n ' + (0, _helpersJs._if)(this.isAny)(_templateObject, (0, _helpersJs._if)(this.showToggle)(_templateObject2, this.schema.title || ''), (0, _helpersJs._if)(this.schema.description && !this.isCollapsed)(_templateObject3, this.schema.description)) + '\n\n \n ' + (0, _helpersJs._if)(this.isPrimitive)(_templateObject4, (0, _helpersJs._if)(this.showToggle)(_templateObject2, this.schema.title || ''), this.schema.type, (0, _helpersJs._if)(this.schema.isRequired)(_templateObject5), (0, _helpersJs._if)(!this.isCollapsed && this.schema.format)(_templateObject6, this.schema.format), (0, _helpersJs._if)(!this.isCollapsed && this.schema['default'])(_templateObject7, this.schema['default']), (0, _helpersJs._if)(!this.isCollapsed && this.schema.minimum)(_templateObject8, this.schema.minimum), (0, _helpersJs._if)(!this.isCollapsed && this.schema.exclusiveMinimum)(_templateObject9, this.schema.exclusiveMinimum), (0, _helpersJs._if)(!this.isCollapsed && this.schema.maximum)(_templateObject10, this.schema.maximum), (0, _helpersJs._if)(!this.isCollapsed && this.schema.exclusiveMaximum)(_templateObject11, this.schema.exclusiveMaximum), (0, _helpersJs._if)(!this.isCollapsed && this.schema.minLength)(_templateObject12, this.schema.minLength), (0, _helpersJs._if)(!this.isCollapsed && this.schema.maxLength)(_templateObject13, this.schema.maxLength), (0, _helpersJs._if)(this.schema.description && !this.isCollapsed)(_templateObject3, this.schema.description), (0, _helpersJs._if)(!this.isCollapsed && this.schema['enum'])(_templateObject14, this['enum'](this.schema, this.isCollapsed, this.open)), (0, _helpersJs._if)(this.schema.allOf && !this.isCollapsed)(_templateObject15, this.xOf(this.schema, 'allOf')), (0, _helpersJs._if)(this.schema.oneOf && !this.isCollapsed)(_templateObject15, this.xOf(this.schema, 'oneOf')), (0, _helpersJs._if)(this.schema.anyOf && !this.isCollapsed)(_templateObject15, this.xOf(this.schema, 'anyOf'))) + '\n\n\n \n ' + (0, _helpersJs._if)(this.isArray)(_templateObject16, this.schema.title || '', (0, _helpersJs._if)(this.isCollapsed)(_templateObject17), (0, _helpersJs._if)(!this.isCollapsed && (this.schema.uniqueItems || this.schema.minItems || this.schema.maxItems))(_templateObject18, this.schema.minItems || 0, this.schema.maxItems || '∞', (0, _helpersJs._if)(!this.isCollapsed && this.schema.uniqueItems)(_templateObject19)), (0, _helpersJs._if)(!this.isCollapsed && this.schema.description)(_templateObject20, this.schema.description), (0, _helpersJs._if)(!this.isCollapsed && this.schema['enum'])(_templateObject14, this['enum'](this.schema, this.isCollapsed, this.open)), (0, _helpersJs._if)(this.schema.allOf && !this.isCollapsed)(_templateObject15, this.xOf(this.schema, 'allOf')), (0, _helpersJs._if)(this.schema.oneOf && !this.isCollapsed)(_templateObject15, this.xOf(this.schema, 'oneOf')), (0, _helpersJs._if)(this.schema.anyOf && !this.isCollapsed)(_templateObject15, this.xOf(this.schema, 'anyOf')), (0, _helpersJs._if)(!this.isCollapsed)(_templateObject21)) + '\n\n \n ' + (0, _helpersJs._if)(!this.isPrimitive && !this.isArray && !this.isAny && !this.isCollectionOfTypes)(_templateObject22, this.schema.title || '', (0, _helpersJs._if)(this.isCollapsed)(_templateObject23), (0, _helpersJs._if)(!this.isCollapsed && this.schema.description)(_templateObject20, this.schema.description), (0, _helpersJs._if)(!this.isCollapsed && this.schema['enum'])(_templateObject14, this['enum'](this.schema, this.isCollapsed, this.open)), (0, _helpersJs._if)(this.schema.allOf && !this.isCollapsed)(_templateObject15, this.xOf(this.schema, 'allOf')), (0, _helpersJs._if)(this.schema.oneOf && !this.isCollapsed)(_templateObject15, this.xOf(this.schema, 'oneOf')), (0, _helpersJs._if)(this.schema.anyOf && !this.isCollapsed)(_templateObject15, this.xOf(this.schema, 'anyOf')), (0, _helpersJs._if)(!this.isCollapsed)(_templateObject24)) + '\n\n \n ' + (0, _helpersJs._if)(this.isCollectionOfTypes)(_templateObject25, this.schema.title || '', this.typeList, (0, _helpersJs._if)(this.schema.description && !this.isCollapsed)(_templateObject20, this.schema.description)) + '\n').replace(/\s*\n/g, '\n').replace(/(\<\!\-\-).+/g, '').trim(); } /* @@ -170,7 +186,7 @@ var JSONSchemaView = (function () { }, { key: 'enum', value: function _enum(schema, isCollapsed, open) { - return '\n ' + (0, _helpersJs._if)(!isCollapsed && schema['enum'])(_templateObject25) + '\n '; + return '\n ' + (0, _helpersJs._if)(!isCollapsed && schema['enum'])(_templateObject26) + '\n '; } /* @@ -247,6 +263,16 @@ var JSONSchemaView = (function () { inner.appendChild(view.render()); } + if (this.isCollectionOfTypes) { + (function () { + var openLevel = _this2.open - 1; + _this2.schema.type.forEach(function (type) { + var view = new JSONSchemaView(type, openLevel); + inner.appendChild(view.render()); + }); + })(); + } + if (typeof this.schema.properties === 'object') { Object.keys(this.schema.properties).forEach(function (propertyName) { var property = _this2.schema.properties[propertyName]; @@ -293,4 +319,4 @@ module.exports = exports['default']; },{"./helpers.js":1}]},{},[2])(2) }); -//# sourceMappingURL=data:application/json;charset:utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIm5vZGVfbW9kdWxlcy9icm93c2VyLXBhY2svX3ByZWx1ZGUuanMiLCIvVXNlcnMvbWF6aW1pL1Byb2plY3RzL2pzb24tc2NoZW1hLXZpZXctanMvc3JjL2hlbHBlcnMuanMiLCIvVXNlcnMvbWF6aW1pL1Byb2plY3RzL2pzb24tc2NoZW1hLXZpZXctanMvc3JjL2luZGV4LmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBO0FDQUEsWUFBWSxDQUFDOzs7Ozs7Ozs7O0FBSU4sU0FBUyxVQUFVLENBQUMsSUFBSSxFQUFFO0FBQy9CLFNBQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDO0NBQ3JDOzs7Ozs7Ozs7Ozs7O0FBWU0sU0FBUyxHQUFHLENBQUMsU0FBUyxFQUFFO0FBQzdCLFNBQU8sU0FBUyxHQUFHLE1BQU0sR0FBRyxLQUFLLENBQUM7Q0FDbkM7O0FBQ0QsU0FBUyxLQUFLLEdBQUU7QUFDZCxTQUFPLEVBQUUsQ0FBQztDQUNYO0FBQ0QsU0FBUyxNQUFNLENBQUUsUUFBUSxFQUFrQjtvQ0FBYixXQUFXO0FBQVgsZUFBVzs7O0FBQ3ZDLFNBQU8sUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsVUFBQyxXQUFXLEVBQUUsSUFBSSxFQUFFLENBQUMsRUFBSztBQUN4RCxXQUFPLFdBQVcsR0FBRyxXQUFXLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDO0dBQzVDLEVBQUUsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7Q0FDakI7OztBQzVCRCxZQUFZLENBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7eUJBT04sY0FBYzs7Ozs7Ozs7SUFRQSxjQUFjOzs7Ozs7Ozs7Ozs7QUFXdEIsV0FYUSxjQUFjLENBV3JCLE1BQU0sRUFBRSxJQUFJLEVBQTJCOzs7UUFBekIsT0FBTyx5REFBRyxFQUFDLEtBQUssRUFBRSxJQUFJLEVBQUM7OzBCQVg5QixjQUFjOztBQVkvQixRQUFJLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQztBQUNyQixRQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQztBQUNqQixRQUFJLENBQUMsT0FBTyxHQUFHLE9BQU8sQ0FBQztBQUN2QixRQUFJLENBQUMsV0FBVyxHQUFHLElBQUksSUFBSSxDQUFDLENBQUM7OztBQUc3QixRQUFJLENBQUMsS0FBSyxHQUFHLE9BQU8sTUFBTSxLQUFLLFFBQVEsSUFDckMsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxJQUN0QixDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQ25CLE1BQU0sQ0FBQyxVQUFBLENBQUM7YUFBRyxDQUFDLE9BQU8sRUFBRSxhQUFhLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDO0tBQUEsQ0FBQyxDQUFDLE1BQU0sQ0FBQzs7O0FBR2pFLFFBQUksQ0FBQyxPQUFPLEdBQUcsQ0FBQyxJQUFJLENBQUMsS0FBSyxJQUFJLElBQUksQ0FBQyxNQUFNLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEtBQUssT0FBTyxDQUFDOztBQUUxRSxRQUFJLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQyxNQUFNLEtBQ3hCLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxLQUFLLFFBQVEsSUFDN0IsSUFBSSxDQUFDLE1BQU0sQ0FBQyxVQUFVLElBQ3RCLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxJQUNqQixJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssSUFDakIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUEsQUFBQyxDQUFDOzs7QUFHdEIsUUFBSSxDQUFDLFdBQVcsR0FBRyxDQUFDLElBQUksQ0FBQyxLQUFLLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQzs7O0FBR2xFLFFBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxXQUFXLElBQ3ZDLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxJQUNoQixJQUFJLENBQUMsV0FBVyxLQUNmLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxJQUNuQixJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sSUFDbkIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxnQkFBZ0IsSUFDNUIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxnQkFBZ0IsSUFDNUIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLElBQ2xCLElBQUksQ0FBQyxNQUFNLFdBQVEsSUFDbkIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTLElBQ3JCLElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxJQUNyQixJQUFJLENBQUMsTUFBTSxRQUFLLENBQUEsQUFBQyxBQUNsQixDQUFDOzs7QUFHSixRQUFJLElBQUksQ0FBQyxNQUFNLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxFQUFFO0FBQ3RELFVBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxVQUFBLGdCQUFnQixFQUFJO0FBQy9DLFlBQUksT0FBTyxNQUFLLE1BQU0sQ0FBQyxVQUFVLENBQUMsZ0JBQWdCLENBQUMsS0FBSyxRQUFRLEVBQUU7QUFDaEUsZ0JBQUssTUFBTSxDQUFDLFVBQVUsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUM7U0FDNUQ7T0FDRixDQUFDLENBQUM7S0FDSjtHQUNGOzs7Ozs7O2VBM0RrQixjQUFjOztXQWlFekIsb0JBQUc7QUFDVCxVQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRTtBQUNoQixlQUFPLEVBQUUsQ0FBQztPQUNYOztBQUVELGFBQU8sa0NBRUgsb0JBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxrQkFFWCxvQkFBSSxJQUFJLENBQUMsVUFBVSxDQUFDLG1CQUNrQyxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssSUFBSSxFQUFFLEdBSzdFLG9CQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsV0FBVyxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxtQkFDaEIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxXQUFXLDhDQU01RCxvQkFBSSxJQUFJLENBQUMsV0FBVyxDQUFDLG1CQUVqQixvQkFBSSxJQUFJLENBQUMsVUFBVSxDQUFDLG1CQUNrQyxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssSUFBSSxFQUFFLEdBR3hELElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUVyQyxvQkFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxvQkFJM0Isb0JBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLG1CQUNwQixJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sR0FHMUMsb0JBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxJQUFJLElBQUksQ0FBQyxNQUFNLFdBQVEsQ0FBQyxtQkFDWixJQUFJLENBQUMsTUFBTSxXQUFRLEdBR3BELG9CQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxtQkFDUCxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sR0FHekQsb0JBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsZ0JBQWdCLENBQUMsbUJBQ0gsSUFBSSxDQUFDLE1BQU0sQ0FBQyxnQkFBZ0IsR0FHL0Usb0JBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLG9CQUNQLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxHQUd6RCxvQkFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxvQkFDSCxJQUFJLENBQUMsTUFBTSxDQUFDLGdCQUFnQixHQUcvRSxvQkFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsb0JBQ0wsSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTLEdBRy9ELG9CQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxvQkFDTCxJQUFJLENBQUMsTUFBTSxDQUFDLFNBQVMsR0FHL0Qsb0JBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxXQUFXLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLG1CQUNoQixJQUFJLENBQUMsTUFBTSxDQUFDLFdBQVcsR0FHeEQsb0JBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxJQUFJLElBQUksQ0FBQyxNQUFNLFFBQUssQ0FBQyxvQkFDeEMsSUFBSSxRQUFLLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsV0FBVyxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsR0FHckQsb0JBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLG9CQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxPQUFPLENBQUMsR0FDNUUsb0JBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLG9CQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxPQUFPLENBQUMsR0FDNUUsb0JBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLG9CQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxPQUFPLENBQUMsNENBTWhGLG9CQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsb0JBRXVDLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxJQUFJLEVBQUUsRUFBeUMsb0JBQUksSUFBSSxDQUFDLFdBQVcsQ0FBQyxxQkFDekksb0JBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxLQUFLLElBQUksQ0FBQyxNQUFNLENBQUMsV0FBVyxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFBLEFBQUMsQ0FBQyxvQkFFdEUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLElBQUksQ0FBQyxFQUFLLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxJQUFJLEdBQUcsRUFDcEYsb0JBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLHNCQUlqRCxvQkFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsb0JBQ3RCLElBQUksQ0FBQyxNQUFNLENBQUMsV0FBVyxHQUlwRCxvQkFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLElBQUksSUFBSSxDQUFDLE1BQU0sUUFBSyxDQUFDLG9CQUN4QyxJQUFJLFFBQUssQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxXQUFXLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUdyRCxvQkFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsb0JBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLE9BQU8sQ0FBQyxHQUM1RSxvQkFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsb0JBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLE9BQU8sQ0FBQyxHQUM1RSxvQkFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsb0JBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLE9BQU8sQ0FBQyxHQUU1RSxvQkFBSSxDQUFDLElBQUksQ0FBQyxXQUFX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QUMsQ0FBQztPQUFFOztBQUV6RCxlQUFTLFNBQVMsQ0FBQyxJQUFJLEVBQUU7OztBQUN2QixZQUFNLFVBQVUsR0FBRyxPQUFPLENBQUMsYUFBYSxhQUFXLElBQUksQ0FBRyxDQUFDOztBQUUzRCxZQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLE9BQU8sQ0FBQyxVQUFBLE1BQU0sRUFBSTtBQUNsQyxjQUFNLEtBQUssR0FBRyxRQUFRLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxDQUFDO0FBQzVDLGVBQUssQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFDO0FBQzdCLGNBQU0sSUFBSSxHQUFHLElBQUksY0FBYyxDQUFDLE1BQU0sRUFBRSxPQUFLLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQztBQUN2RCxlQUFLLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDO0FBQ2pDLG9CQUFVLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxDQUFDO1NBQy9CLENBQUMsQ0FBQztPQUNKO0tBQ0Y7OztTQXhVa0IsY0FBYzs7O3FCQUFkLGNBQWMiLCJmaWxlIjoiZ2VuZXJhdGVkLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXNDb250ZW50IjpbIihmdW5jdGlvbiBlKHQsbixyKXtmdW5jdGlvbiBzKG8sdSl7aWYoIW5bb10pe2lmKCF0W29dKXt2YXIgYT10eXBlb2YgcmVxdWlyZT09XCJmdW5jdGlvblwiJiZyZXF1aXJlO2lmKCF1JiZhKXJldHVybiBhKG8sITApO2lmKGkpcmV0dXJuIGkobywhMCk7dmFyIGY9bmV3IEVycm9yKFwiQ2Fubm90IGZpbmQgbW9kdWxlICdcIitvK1wiJ1wiKTt0aHJvdyBmLmNvZGU9XCJNT0RVTEVfTk9UX0ZPVU5EXCIsZn12YXIgbD1uW29dPXtleHBvcnRzOnt9fTt0W29dWzBdLmNhbGwobC5leHBvcnRzLGZ1bmN0aW9uKGUpe3ZhciBuPXRbb11bMV1bZV07cmV0dXJuIHMobj9uOmUpfSxsLGwuZXhwb3J0cyxlLHQsbixyKX1yZXR1cm4gbltvXS5leHBvcnRzfXZhciBpPXR5cGVvZiByZXF1aXJlPT1cImZ1bmN0aW9uXCImJnJlcXVpcmU7Zm9yKHZhciBvPTA7bzxyLmxlbmd0aDtvKyspcyhyW29dKTtyZXR1cm4gc30pIiwiJ3VzZSBzdHJpY3QnO1xuLypcbiAqIENvbnZlcnRzIGFueU9mLCBhbGxPZiBhbmQgb25lT2YgdG8gaHVtYW4gcmVhZGFibGUgc3RyaW5nXG4qL1xuZXhwb3J0IGZ1bmN0aW9uIGNvbnZlcnRYT2YodHlwZSkge1xuICByZXR1cm4gdHlwZS5zdWJzdHJpbmcoMCwgMykgKyAnIG9mJztcbn1cblxuLypcbiAqIGlmIGNvbmRpdGlvbiBmb3IgRVM2IHRlbXBsYXRlIHN0cmluZ3NcbiAqIHRvIGJlIHVzZWQgb25seSBpbiB0ZW1wbGF0ZSBzdHJpbmdcbiAqXG4gKiBAZXhhbXBsZSBteXN0ciA9IGBSYW5kb20gaXMgJHtfaWYoTWF0aC5yYW5kb20oKSA+IDAuNSlgZ3JlYXRlciB0aGFuIDAuNWBgXG4gKlxuICogQHBhcmFtIHtib29sZWFufSBjb25kaXRpb25cbiAqXG4gKiBAcmV0dXJucyB7ZnVuY3Rpb259IHRoZSB0ZW1wbGF0ZSBmdW5jdGlvblxuKi9cbmV4cG9ydCBmdW5jdGlvbiBfaWYoY29uZGl0aW9uKSB7XG4gIHJldHVybiBjb25kaXRpb24gPyBub3JtYWwgOiBlbXB0eTtcbn1cbmZ1bmN0aW9uIGVtcHR5KCl7XG4gIHJldHVybiAnJztcbn1cbmZ1bmN0aW9uIG5vcm1hbCAodGVtcGxhdGUsIC4uLmV4cHJlc3Npb25zKSB7XG4gIHJldHVybiB0ZW1wbGF0ZS5zbGljZSgxKS5yZWR1Y2UoKGFjY3VtdWxhdG9yLCBwYXJ0LCBpKSA9PiB7XG4gICAgcmV0dXJuIGFjY3VtdWxhdG9yICsgZXhwcmVzc2lvbnNbaV0gKyBwYXJ0O1xuICB9LCB0ZW1wbGF0ZVswXSk7XG59IiwiJ3VzZSBzdHJpY3QnO1xuXG4vKiBnbG9iYWxzIEpTT05TY2hlbWFWaWV3ICovXG5cbmltcG9ydCB7XG4gIGNvbnZlcnRYT2YsXG4gIF9pZlxufSBmcm9tICcuL2hlbHBlcnMuanMnO1xuXG5cbi8qKlxuICogQGNsYXNzIEpTT05TY2hlbWFWaWV3XG4gKlxuICogQSBwdXJlIEphdmFTY3JpcHQgY29tcG9uZW50IGZvciByZW5kZXJpbmcgSlNPTiBTY2hlbWEgaW4gSFRNTC5cbiovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBKU09OU2NoZW1hVmlldyB7XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBzY2hlbWEgVGhlIEpTT04gU2NoZW1hIG9iamVjdFxuICAgKlxuICAgKiBAcGFyYW0ge251bWJlcn0gW29wZW49MV0gaGlzIG51bWJlciBpbmRpY2F0ZXMgdXAgdG8gaG93IG1hbnkgbGV2ZWxzIHRoZVxuICAgKiByZW5kZXJlZCB0cmVlIHNob3VsZCBleHBhbmQuIFNldCBpdCB0byBgMGAgdG8gbWFrZSB0aGUgd2hvbGUgdHJlZSBjb2xsYXBzZWRcbiAgICogb3Igc2V0IGl0IHRvIGBJbmZpbml0eWAgdG8gZXhwYW5kIHRoZSB0cmVlIGRlZXBseVxuICAgKiBAcGFyYW0ge29iamVjdH0gb3B0aW9ucy5cbiAgICogIHRoZW1lIHtzdHJpbmd9OiBvbmUgb2YgdGhlIGZvbGxvd2luZyBvcHRpb25zOiBbJ2RhcmsnXVxuICAqL1xuICBjb25zdHJ1Y3RvcihzY2hlbWEsIG9wZW4sIG9wdGlvbnMgPSB7dGhlbWU6IG51bGx9KSB7XG4gICAgdGhpcy5zY2hlbWEgPSBzY2hlbWE7XG4gICAgdGhpcy5vcGVuID0gb3BlbjtcbiAgICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zO1xuICAgIHRoaXMuaXNDb2xsYXBzZWQgPSBvcGVuIDw9IDA7XG5cbiAgICAvLyBpZiBzY2hlbWEgaXMgYW4gZW1wdHkgb2JqZWN0IHdoaWNoIG1lYW5zIGFueSBKT1NOXG4gICAgdGhpcy5pc0FueSA9IHR5cGVvZiBzY2hlbWEgPT09ICdvYmplY3QnICYmXG4gICAgICAhQXJyYXkuaXNBcnJheShzY2hlbWEpICYmXG4gICAgICAhT2JqZWN0LmtleXMoc2NoZW1hKVxuICAgICAgLmZpbHRlcihrPT4gWyd0aXRsZScsICdkZXNjcmlwdGlvbiddLmluZGV4T2YoaykgPT09IC0xKS5sZW5ndGg7XG5cbiAgICAvLyBEZXRlcm1pbmUgaWYgYSBzY2hlbWEgaXMgYW4gYXJyYXlcbiAgICB0aGlzLmlzQXJyYXkgPSAhdGhpcy5pc0FueSAmJiB0aGlzLnNjaGVtYSAmJiB0aGlzLnNjaGVtYS50eXBlID09PSAnYXJyYXknO1xuXG4gICAgdGhpcy5pc09iamVjdCA9IHRoaXMuc2NoZW1hICYmXG4gICAgICAodGhpcy5zY2hlbWEudHlwZSA9PT0gJ29iamVjdCcgfHxcbiAgICAgICB0aGlzLnNjaGVtYS5wcm9wZXJ0aWVzIHx8XG4gICAgICAgdGhpcy5zY2hlbWEuYW55T2YgfHxcbiAgICAgICB0aGlzLnNjaGVtYS5vbmVvZiB8fFxuICAgICAgIHRoaXMuc2NoZW1hLmFsbE9mKTtcblxuICAgIC8vIERldGVybWluZSBpZiBhIHNjaGVtYSBpcyBhIHByaW1pdGl2ZVxuICAgIHRoaXMuaXNQcmltaXRpdmUgPSAhdGhpcy5pc0FueSAmJiAhdGhpcy5pc0FycmF5ICYmICF0aGlzLmlzT2JqZWN0O1xuXG4gICAgLy9cbiAgICB0aGlzLnNob3dUb2dnbGUgPSB0aGlzLnNjaGVtYS5kZXNjcmlwdGlvbiB8fFxuICAgICAgdGhpcy5zY2hlbWEudGl0bGUgfHxcbiAgICAgICh0aGlzLmlzUHJpbWl0aXZlICYmIChcbiAgICAgICAgdGhpcy5zY2hlbWEubWluaW11bSB8fFxuICAgICAgICB0aGlzLnNjaGVtYS5tYXhpbXVtIHx8XG4gICAgICAgIHRoaXMuc2NoZW1hLmV4Y2x1c2l2ZU1pbmltdW0gfHxcbiAgICAgICAgdGhpcy5zY2hlbWEuZXhjbHVzaXZlTWF4aW11bSB8fFxuICAgICAgICB0aGlzLnNjaGVtYS5mb3JtYXQgfHwgICAgICAgIFxuICAgICAgICB0aGlzLnNjaGVtYS5kZWZhdWx0IHx8XG4gICAgICAgIHRoaXMuc2NoZW1hLm1pbkxlbmd0aCB8fFxuICAgICAgICB0aGlzLnNjaGVtYS5tYXhMZW5ndGggfHxcbiAgICAgICAgdGhpcy5zY2hlbWEuZW51bSlcbiAgICAgICk7XG5cbiAgICAvLyBwb3B1bGF0ZSBpc1JlcXVpcmVkIHByb3BlcnR5IGRvd24gdG8gcHJvcGVydGllc1xuICAgIGlmICh0aGlzLnNjaGVtYSAmJiBBcnJheS5pc0FycmF5KHRoaXMuc2NoZW1hLnJlcXVpcmVkKSkge1xuICAgICAgdGhpcy5zY2hlbWEucmVxdWlyZWQuZm9yRWFjaChyZXF1aXJlZFByb3BlcnR5ID0+IHtcbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLnNjaGVtYS5wcm9wZXJ0aWVzW3JlcXVpcmVkUHJvcGVydHldID09PSAnb2JqZWN0Jykge1xuICAgICAgICAgIHRoaXMuc2NoZW1hLnByb3BlcnRpZXNbcmVxdWlyZWRQcm9wZXJ0eV0uaXNSZXF1aXJlZCA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIC8qXG4gICAqIFJldHVybnMgdGhlIHRlbXBsYXRlIHdpdGggcG9wdWxhdGVkIHByb3BlcnRpZXMuXG4gICAqIFRoaXMgdGVtcGxhdGUgZG9lcyBub3QgaGF2ZSB0aGUgY2hpbGRyZW5cbiAgKi9cbiAgdGVtcGxhdGUoKSB7XG4gICAgaWYgKCF0aGlzLnNjaGVtYSkge1xuICAgICAgcmV0dXJuICcnO1xuICAgIH1cblxuICAgIHJldHVybiBgXG4gICAgICA8IS0tIEFueSAtLT5cbiAgICAgICR7X2lmKHRoaXMuaXNBbnkpYFxuICAgICAgICA8ZGl2IGNsYXNzPVwiYW55XCI+XG4gICAgICAgICAgJHtfaWYodGhpcy5zaG93VG9nZ2xlKWBcbiAgICAgICAgICAgIDxhIGNsYXNzPVwidGl0bGVcIj48c3BhbiBjbGFzcz1cInRvZ2dsZS1oYW5kbGVcIj48L3NwYW4+JHt0aGlzLnNjaGVtYS50aXRsZSB8fCAnJ30gPC9hPlxuICAgICAgICAgIGB9XG5cbiAgICAgICAgICA8c3BhbiBjbGFzcz1cInR5cGUgdHlwZS1hbnlcIj4mbHQ7YW55Jmd0Ozwvc3Bhbj5cblxuICAgICAgICAgICR7X2lmKHRoaXMuc2NoZW1hLmRlc2NyaXB0aW9uICYmICF0aGlzLmlzQ29sbGFwc2VkKWBcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJpbm5lciBkZXNjcmlwdGlvblwiPiR7dGhpcy5zY2hlbWEuZGVzY3JpcHRpb259PC9kaXY+XG4gICAgICAgICAgYH1cbiAgICAgICAgPC9kaXY+XG4gICAgICBgfVxuXG4gICAgICA8IS0tIFByaW1pdGl2ZSAtLT5cbiAgICAgICR7X2lmKHRoaXMuaXNQcmltaXRpdmUpYFxuICAgICAgICA8ZGl2IGNsYXNzPVwicHJpbWl0aXZlXCI+XG4gICAgICAgICAgJHtfaWYodGhpcy5zaG93VG9nZ2xlKWBcbiAgICAgICAgICAgIDxhIGNsYXNzPVwidGl0bGVcIj48c3BhbiBjbGFzcz1cInRvZ2dsZS1oYW5kbGVcIj48L3NwYW4+JHt0aGlzLnNjaGVtYS50aXRsZSB8fCAnJ30gPC9hPlxuICAgICAgICAgIGB9XG5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidHlwZVwiPiR7dGhpcy5zY2hlbWEudHlwZX08L3NwYW4+XG5cbiAgICAgICAgICAke19pZih0aGlzLnNjaGVtYS5pc1JlcXVpcmVkKWBcbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwicmVxdWlyZWRcIj4qPC9zcGFuPlxuICAgICAgICAgIGB9XG5cbiAgICAgICAgICAke19pZighdGhpcy5pc0NvbGxhcHNlZCAmJiB0aGlzLnNjaGVtYS5mb3JtYXQpYFxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJmb3JtYXRcIj4oJHt0aGlzLnNjaGVtYS5mb3JtYXR9KTwvc3Bhbj5cbiAgICAgICAgICBgfVxuXG4gICAgICAgICAgJHtfaWYoIXRoaXMuaXNDb2xsYXBzZWQgJiYgdGhpcy5zY2hlbWEuZGVmYXVsdClgXG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cImRlZmF1bHRcIj5kZWZhdWx0OiAke3RoaXMuc2NoZW1hLmRlZmF1bHR9PC9zcGFuPlxuICAgICAgICAgIGB9IFxuXG4gICAgICAgICAgJHtfaWYoIXRoaXMuaXNDb2xsYXBzZWQgJiYgdGhpcy5zY2hlbWEubWluaW11bSlgXG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cInJhbmdlIG1pbmltdW1cIj5taW5pbXVtOiR7dGhpcy5zY2hlbWEubWluaW11bX08L3NwYW4+XG4gICAgICAgICAgYH1cblxuICAgICAgICAgICR7X2lmKCF0aGlzLmlzQ29sbGFwc2VkICYmIHRoaXMuc2NoZW1hLmV4Y2x1c2l2ZU1pbmltdW0pYFxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJyYW5nZSBleGNsdXNpdmVNaW5pbXVtXCI+KGV4KW1pbmltdW06JHt0aGlzLnNjaGVtYS5leGNsdXNpdmVNaW5pbXVtfTwvc3Bhbj5cbiAgICAgICAgICBgfVxuXG4gICAgICAgICAgJHtfaWYoIXRoaXMuaXNDb2xsYXBzZWQgJiYgdGhpcy5zY2hlbWEubWF4aW11bSlgXG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cInJhbmdlIG1heGltdW1cIj5tYXhpbXVtOiR7dGhpcy5zY2hlbWEubWF4aW11bX08L3NwYW4+XG4gICAgICAgICAgYH1cblxuICAgICAgICAgICR7X2lmKCF0aGlzLmlzQ29sbGFwc2VkICYmIHRoaXMuc2NoZW1hLmV4Y2x1c2l2ZU1heGltdW0pYFxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJyYW5nZSBleGNsdXNpdmVNYXhpbXVtXCI+KGV4KW1heGltdW06JHt0aGlzLnNjaGVtYS5leGNsdXNpdmVNYXhpbXVtfTwvc3Bhbj5cbiAgICAgICAgICBgfVxuXG4gICAgICAgICAgJHtfaWYoIXRoaXMuaXNDb2xsYXBzZWQgJiYgdGhpcy5zY2hlbWEubWluTGVuZ3RoKWBcbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwicmFuZ2UgbWluTGVuZ3RoXCI+bWluTGVuZ3RoOiR7dGhpcy5zY2hlbWEubWluTGVuZ3RofTwvc3Bhbj5cbiAgICAgICAgICBgfVxuXG4gICAgICAgICAgJHtfaWYoIXRoaXMuaXNDb2xsYXBzZWQgJiYgdGhpcy5zY2hlbWEubWF4TGVuZ3RoKWBcbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwicmFuZ2UgbWF4TGVuZ3RoXCI+bWF4TGVuZ3RoOiR7dGhpcy5zY2hlbWEubWF4TGVuZ3RofTwvc3Bhbj5cbiAgICAgICAgICBgfVxuXG4gICAgICAgICAgJHtfaWYodGhpcy5zY2hlbWEuZGVzY3JpcHRpb24gJiYgIXRoaXMuaXNDb2xsYXBzZWQpYFxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImlubmVyIGRlc2NyaXB0aW9uXCI+JHt0aGlzLnNjaGVtYS5kZXNjcmlwdGlvbn08L2Rpdj5cbiAgICAgICAgICBgfVxuXG4gICAgICAgICAgJHtfaWYoIXRoaXMuaXNDb2xsYXBzZWQgJiYgdGhpcy5zY2hlbWEuZW51bSlgXG4gICAgICAgICAgICAke3RoaXMuZW51bSh0aGlzLnNjaGVtYSwgdGhpcy5pc0NvbGxhcHNlZCwgdGhpcy5vcGVuKX1cbiAgICAgICAgICBgfVxuXG4gICAgICAgICAgJHtfaWYodGhpcy5zY2hlbWEuYWxsT2YgJiYgIXRoaXMuaXNDb2xsYXBzZWQpYCR7dGhpcy54T2YodGhpcy5zY2hlbWEsICdhbGxPZicpfWB9XG4gICAgICAgICAgJHtfaWYodGhpcy5zY2hlbWEub25lT2YgJiYgIXRoaXMuaXNDb2xsYXBzZWQpYCR7dGhpcy54T2YodGhpcy5zY2hlbWEsICdvbmVPZicpfWB9XG4gICAgICAgICAgJHtfaWYodGhpcy5zY2hlbWEuYW55T2YgJiYgIXRoaXMuaXNDb2xsYXBzZWQpYCR7dGhpcy54T2YodGhpcy5zY2hlbWEsICdhbnlPZicpfWB9XG4gICAgICAgIDwvZGl2PlxuICAgICAgYH1cblxuXG4gICAgICA8IS0tIEFycmF5IC0tPlxuICAgICAgJHtfaWYodGhpcy5pc0FycmF5KWBcbiAgICAgICAgPGRpdiBjbGFzcz1cImFycmF5XCI+XG4gICAgICAgICAgPGEgY2xhc3M9XCJ0aXRsZVwiPjxzcGFuIGNsYXNzPVwidG9nZ2xlLWhhbmRsZVwiPjwvc3Bhbj4ke3RoaXMuc2NoZW1hLnRpdGxlIHx8ICcnfTxzcGFuIGNsYXNzPVwib3BlbmluZyBicmFja2V0XCI+Wzwvc3Bhbj4ke19pZih0aGlzLmlzQ29sbGFwc2VkKWA8c3BhbiBjbGFzcz1cImNsb3NpbmcgYnJhY2tldFwiPl08L3NwYW4+YH08L2E+XG4gICAgICAgICAgJHtfaWYoIXRoaXMuaXNDb2xsYXBzZWQgJiYgKHRoaXMuc2NoZW1hLnVuaXF1ZUl0ZW1zIHx8IHRoaXMuc2NoZW1hLm1pbkl0ZW1zIHx8IHRoaXMuc2NoZW1hLm1heEl0ZW1zKSlgXG4gICAgICAgICAgPHNwYW4+XG4gICAgICAgICAgICA8c3BhbiB0aXRsZT1cIml0ZW1zIHJhbmdlXCI+KCR7dGhpcy5zY2hlbWEubWluSXRlbXMgfHwgMH0uLiR7dGhpcy5zY2hlbWEubWF4SXRlbXMgfHwgJ+KInid9KTwvc3Bhbj5cbiAgICAgICAgICAgICR7X2lmKCF0aGlzLmlzQ29sbGFwc2VkICYmIHRoaXMuc2NoZW1hLnVuaXF1ZUl0ZW1zKWA8c3BhbiB0aXRsZT1cInVuaXF1ZVwiIGNsYXNzPVwidW5pcXVlSXRlbXNcIj7imaY8L3NwYW4+YH1cbiAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgYH1cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiaW5uZXJcIj5cbiAgICAgICAgICAgICR7X2lmKCF0aGlzLmlzQ29sbGFwc2VkICYmIHRoaXMuc2NoZW1hLmRlc2NyaXB0aW9uKWBcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRlc2NyaXB0aW9uXCI+JHt0aGlzLnNjaGVtYS5kZXNjcmlwdGlvbn08L2Rpdj5cbiAgICAgICAgICAgIGB9XG4gICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAke19pZighdGhpcy5pc0NvbGxhcHNlZCAmJiB0aGlzLnNjaGVtYS5lbnVtKWBcbiAgICAgICAgICAgICR7dGhpcy5lbnVtKHRoaXMuc2NoZW1hLCB0aGlzLmlzQ29sbGFwc2VkLCB0aGlzLm9wZW4pfVxuICAgICAgICAgIGB9XG5cbiAgICAgICAgICAke19pZih0aGlzLnNjaGVtYS5hbGxPZiAmJiAhdGhpcy5pc0NvbGxhcHNlZClgJHt0aGlzLnhPZih0aGlzLnNjaGVtYSwgJ2FsbE9mJyl9YH1cbiAgICAgICAgICAke19pZih0aGlzLnNjaGVtYS5vbmVPZiAmJiAhdGhpcy5pc0NvbGxhcHNlZClgJHt0aGlzLnhPZih0aGlzLnNjaGVtYSwgJ29uZU9mJyl9YH1cbiAgICAgICAgICAke19pZih0aGlzLnNjaGVtYS5hbnlPZiAmJiAhdGhpcy5pc0NvbGxhcHNlZClgJHt0aGlzLnhPZih0aGlzLnNjaGVtYSwgJ2FueU9mJyl9YH1cblxuICAgICAgICAgICR7X2lmKCF0aGlzLmlzQ29sbGFwc2VkKWBcbiAgICAgICAgICA8c3BhbiBjbGFzcz1cImNsb3NpbmcgYnJhY2tldFwiPl08L3NwYW4+XG4gICAgICAgICAgYH1cbiAgICAgICAgPC9kaXY+XG4gICAgICBgfVxuXG4gICAgICA8IS0tIE9iamVjdCAtLT5cbiAgICAgICR7X2lmKCF0aGlzLmlzUHJpbWl0aXZlICYmICF0aGlzLmlzQXJyYXkgJiYgIXRoaXMuaXNBbnkpYFxuICAgICAgICA8ZGl2IGNsYXNzPVwib2JqZWN0XCI+XG4gICAgICAgICAgPGEgY2xhc3M9XCJ0aXRsZVwiPjxzcGFuXG4gICAgICAgICAgICBjbGFzcz1cInRvZ2dsZS1oYW5kbGVcIj48L3NwYW4+JHt0aGlzLnNjaGVtYS50aXRsZSB8fCAnJ30gPHNwYW5cbiAgICAgICAgICAgIGNsYXNzPVwib3BlbmluZyBicmFjZVwiPns8L3NwYW4+JHtfaWYodGhpcy5pc0NvbGxhcHNlZClgXG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY2xvc2luZyBicmFjZVwiIG5nLWlmPVwiaXNDb2xsYXBzZWRcIj59PC9zcGFuPlxuICAgICAgICAgIGB9PC9hPlxuXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImlubmVyXCI+XG4gICAgICAgICAgICAke19pZighdGhpcy5pc0NvbGxhcHNlZCAmJiB0aGlzLnNjaGVtYS5kZXNjcmlwdGlvbilgXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkZXNjcmlwdGlvblwiPiR7dGhpcy5zY2hlbWEuZGVzY3JpcHRpb259PC9kaXY+XG4gICAgICAgICAgICBgfVxuICAgICAgICAgICAgPCEtLSBjaGlsZHJlbiBnbyBoZXJlIC0tPlxuICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgJHtfaWYoIXRoaXMuaXNDb2xsYXBzZWQgJiYgdGhpcy5zY2hlbWEuZW51bSlgXG4gICAgICAgICAgICAke3RoaXMuZW51bSh0aGlzLnNjaGVtYSwgdGhpcy5pc0NvbGxhcHNlZCwgdGhpcy5vcGVuKX1cbiAgICAgICAgICBgfVxuXG4gICAgICAgICAgJHtfaWYodGhpcy5zY2hlbWEuYWxsT2YgJiYgIXRoaXMuaXNDb2xsYXBzZWQpYCR7dGhpcy54T2YodGhpcy5zY2hlbWEsICdhbGxPZicpfWB9XG4gICAgICAgICAgJHtfaWYodGhpcy5zY2hlbWEub25lT2YgJiYgIXRoaXMuaXNDb2xsYXBzZWQpYCR7dGhpcy54T2YodGhpcy5zY2hlbWEsICdvbmVPZicpfWB9XG4gICAgICAgICAgJHtfaWYodGhpcy5zY2hlbWEuYW55T2YgJiYgIXRoaXMuaXNDb2xsYXBzZWQpYCR7dGhpcy54T2YodGhpcy5zY2hlbWEsICdhbnlPZicpfWB9XG5cbiAgICAgICAgICAke19pZighdGhpcy5pc0NvbGxhcHNlZClgXG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJjbG9zaW5nIGJyYWNlXCI+fTwvc3Bhbj5cbiAgICAgICAgICBgfVxuICAgICAgICA8L2Rpdj5cbiAgICAgIGB9XG5gLnJlcGxhY2UoL1xccypcXG4vZywgJ1xcbicpLnJlcGxhY2UoLyhcXDxcXCFcXC1cXC0pLisvZywgJycpLnRyaW0oKTtcbiAgfVxuXG4gIC8qXG4gICAqIFRlbXBsYXRlIGZvciBvbmVPZiwgYW55T2YgYW5kIGFsbE9mXG4gICovXG4gIHhPZihzY2hlbWEsIHR5cGUpIHtcbiAgICByZXR1cm4gYFxuICAgICAgPGRpdiBjbGFzcz1cImlubmVyICR7dHlwZX1cIj5cbiAgICAgICAgPGI+JHtjb252ZXJ0WE9mKHR5cGUpfTo8L2I+XG4gICAgICA8L2Rpdj5cbiAgICBgO1xuICB9XG5cbiAgLypcbiAgICogVGVtcGxhdGUgZm9yIGVudW1zXG4gICovXG4gIGVudW0oc2NoZW1hLCBpc0NvbGxhcHNlZCwgb3Blbikge1xuICAgIHJldHVybiBgXG4gICAgICAke19pZighaXNDb2xsYXBzZWQgJiYgc2NoZW1hLmVudW0pYFxuICAgICAgICA8ZGl2IGNsYXNzPVwiaW5uZXIgZW51bXNcIj5cbiAgICAgICAgICA8Yj5FbnVtOjwvYj5cbiAgICAgICAgPC9kaXY+XG4gICAgICBgfVxuICAgIGA7XG4gIH1cblxuICAvKlxuICAgKiBUb2dnbGVzIHRoZSAnY29sbGFwc2VkJyBzdGF0ZVxuICAqL1xuICB0b2dnbGUoKSB7XG4gICAgdGhpcy5pc0NvbGxhcHNlZCA9ICF0aGlzLmlzQ29sbGFwc2VkO1xuICAgIHRoaXMucmVuZGVyKCk7XG4gIH1cblxuICAvKlxuICAgKiBSZW5kZXJzIHRoZSBlbGVtZW50IGFuZCByZXR1cm5zIGl0XG4gICovXG4gIHJlbmRlcigpIHtcbiAgICBpZiAoIXRoaXMuZWxlbWVudCkge1xuICAgICAgdGhpcy5lbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICB0aGlzLmVsZW1lbnQuY2xhc3NMaXN0LmFkZCgnanNvbi1zY2hlbWEtdmlldycpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmlzQ29sbGFwc2VkKSB7XG4gICAgICB0aGlzLmVsZW1lbnQuY2xhc3NMaXN0LmFkZCgnY29sbGFwc2VkJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuZWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKCdjb2xsYXBzZWQnKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5vcHRpb25zLnRoZW1lKSB7XG4gICAgICB0aGlzLmVsZW1lbnQuY2xhc3NMaXN0LmFkZChganNvbi1zY2hlbWEtdmlldy0ke3RoaXMub3B0aW9ucy50aGVtZX1gKTtcbiAgICB9XG5cbiAgICB0aGlzLmVsZW1lbnQuaW5uZXJIVE1MID0gdGhpcy50ZW1wbGF0ZSgpO1xuXG4gICAgaWYgKCF0aGlzLnNjaGVtYSkge1xuICAgICAgcmV0dXJuIHRoaXMuZWxlbWVudDtcbiAgICB9XG5cbiAgICBpZiAoIXRoaXMuaXNDb2xsYXBzZWQpIHtcbiAgICAgIHRoaXMuYXBwZW5kQ2hpbGRyZW4odGhpcy5lbGVtZW50KTtcbiAgICB9XG5cbiAgICAvLyBhZGQgZXZlbnQgbGlzdGVuZXIgZm9yIHRvZ2dsaW5nXG4gICAgaWYgKHRoaXMuZWxlbWVudC5xdWVyeVNlbGVjdG9yKCdhLnRpdGxlJykpIHtcbiAgICAgIHRoaXMuZWxlbWVudC5xdWVyeVNlbGVjdG9yKCdhLnRpdGxlJykuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCB0aGlzLnRvZ2dsZS5iaW5kKHRoaXMpKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuZWxlbWVudDtcbiAgfVxuXG4gIC8qXG4gICAqIEFwcGVuZHMgY2hpbGRyZW4gdG8gZ2l2ZW4gZWxlbWVudCBiYXNlZCBvbiBjdXJyZW50IHNjaGVtYVxuICAqL1xuICBhcHBlbmRDaGlsZHJlbihlbGVtZW50KSB7XG4gICAgY29uc3QgaW5uZXIgPSBlbGVtZW50LnF1ZXJ5U2VsZWN0b3IoJy5pbm5lcicpO1xuXG4gICAgaWYgKCFpbm5lcikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnNjaGVtYS5lbnVtKSB7XG4gICAgICBjb25zdCBmb3JtYXR0ZXIgPSBuZXcgSlNPTkZvcm1hdHRlcih0aGlzLnNjaGVtYS5lbnVtLCB0aGlzLm9wZW4gLSAxKTtcbiAgICAgIGNvbnN0IGZvcm1hdHRlckVsID0gZm9ybWF0dGVyLnJlbmRlcigpO1xuICAgICAgZm9ybWF0dGVyRWwuY2xhc3NMaXN0LmFkZCgnaW5uZXInKTtcbiAgICAgIGVsZW1lbnQucXVlcnlTZWxlY3RvcignLmVudW1zLmlubmVyJykuYXBwZW5kQ2hpbGQoZm9ybWF0dGVyRWwpO1xuXG4gICAgfVxuXG4gICAgaWYgKHRoaXMuaXNBcnJheSkge1xuICAgICAgY29uc3QgdmlldyA9IG5ldyBKU09OU2NoZW1hVmlldyh0aGlzLnNjaGVtYS5pdGVtcywgdGhpcy5vcGVuIC0gMSlcbiAgICAgIGlubmVyLmFwcGVuZENoaWxkKHZpZXcucmVuZGVyKCkpO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgdGhpcy5zY2hlbWEucHJvcGVydGllcyA9PT0gJ29iamVjdCcpIHtcbiAgICAgIE9iamVjdC5rZXlzKHRoaXMuc2NoZW1hLnByb3BlcnRpZXMpLmZvckVhY2gocHJvcGVydHlOYW1lID0+IHtcbiAgICAgICAgY29uc3QgcHJvcGVydHkgPSB0aGlzLnNjaGVtYS5wcm9wZXJ0aWVzW3Byb3BlcnR5TmFtZV07XG4gICAgICAgIGNvbnN0IHRlbXBEaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTs7XG4gICAgICAgIHRlbXBEaXYuaW5uZXJIVE1MID0gYDxkaXYgY2xhc3M9XCJwcm9wZXJ0eVwiPlxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwibmFtZVwiPiR7cHJvcGVydHlOYW1lfTo8L3NwYW4+XG4gICAgICAgIDwvZGl2PmA7XG4gICAgICAgIGNvbnN0IHZpZXcgPSBuZXcgSlNPTlNjaGVtYVZpZXcocHJvcGVydHksIHRoaXMub3BlbiAtIDEpO1xuICAgICAgICB0ZW1wRGl2LnF1ZXJ5U2VsZWN0b3IoJy5wcm9wZXJ0eScpLmFwcGVuZENoaWxkKHZpZXcucmVuZGVyKCkpO1xuXG4gICAgICAgIGlubmVyLmFwcGVuZENoaWxkKHRlbXBEaXYucXVlcnlTZWxlY3RvcignLnByb3BlcnR5JykpO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuc2NoZW1hLmFsbE9mKSB7IGFwcGVuZFhPZi5jYWxsKHRoaXMsICdhbGxPZicpOyB9XG4gICAgaWYgKHRoaXMuc2NoZW1hLm9uZU9mKSB7IGFwcGVuZFhPZi5jYWxsKHRoaXMsICdvbmVPZicpOyB9XG4gICAgaWYgKHRoaXMuc2NoZW1hLmFueU9mKSB7IGFwcGVuZFhPZi5jYWxsKHRoaXMsICdhbnlPZicpOyB9XG5cbiAgICBmdW5jdGlvbiBhcHBlbmRYT2YodHlwZSkge1xuICAgICAgY29uc3QgaW5uZXJBbGxPZiA9IGVsZW1lbnQucXVlcnlTZWxlY3RvcihgLmlubmVyLiR7dHlwZX1gKTtcblxuICAgICAgdGhpcy5zY2hlbWFbdHlwZV0uZm9yRWFjaChzY2hlbWEgPT4ge1xuICAgICAgICBjb25zdCBpbm5lciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgICBpbm5lci5jbGFzc0xpc3QuYWRkKCdpbm5lcicpO1xuICAgICAgICBjb25zdCB2aWV3ID0gbmV3IEpTT05TY2hlbWFWaWV3KHNjaGVtYSwgdGhpcy5vcGVuIC0gMSk7XG4gICAgICAgIGlubmVyLmFwcGVuZENoaWxkKHZpZXcucmVuZGVyKCkpO1xuICAgICAgICBpbm5lckFsbE9mLmFwcGVuZENoaWxkKGlubmVyKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxufVxuIl19 +//# sourceMappingURL=data:application/json;charset:utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIm5vZGVfbW9kdWxlcy9icm93c2VyLXBhY2svX3ByZWx1ZGUuanMiLCIvVXNlcnMvbnJvYmlzb25jb3gvY29kZS9qc29uLXNjaGVtYS12aWV3LWpzL3NyYy9oZWxwZXJzLmpzIiwiL1VzZXJzL25yb2Jpc29uY294L2NvZGUvanNvbi1zY2hlbWEtdmlldy1qcy9zcmMvaW5kZXguanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7QUNBQSxZQUFZLENBQUM7Ozs7Ozs7Ozs7QUFJTixTQUFTLFVBQVUsQ0FBQyxJQUFJLEVBQUU7QUFDL0IsU0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUM7Q0FDckM7Ozs7Ozs7Ozs7Ozs7QUFZTSxTQUFTLEdBQUcsQ0FBQyxTQUFTLEVBQUU7QUFDN0IsU0FBTyxTQUFTLEdBQUcsTUFBTSxHQUFHLEtBQUssQ0FBQztDQUNuQzs7QUFDRCxTQUFTLEtBQUssR0FBRTtBQUNkLFNBQU8sRUFBRSxDQUFDO0NBQ1g7QUFDRCxTQUFTLE1BQU0sQ0FBRSxRQUFRLEVBQWtCO29DQUFiLFdBQVc7QUFBWCxlQUFXOzs7QUFDdkMsU0FBTyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxVQUFDLFdBQVcsRUFBRSxJQUFJLEVBQUUsQ0FBQyxFQUFLO0FBQ3hELFdBQU8sV0FBVyxHQUFHLFdBQVcsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUM7R0FDNUMsRUFBRSxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztDQUNqQjs7O0FDNUJELFlBQVksQ0FBQzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7eUJBT04sY0FBYzs7Ozs7Ozs7SUFRQSxjQUFjOzs7Ozs7Ozs7Ozs7QUFXdEIsV0FYUSxjQUFjLENBV3JCLE1BQU0sRUFBRSxJQUFJLEVBQTJCOzs7UUFBekIsT0FBTyx5REFBRyxFQUFDLEtBQUssRUFBRSxJQUFJ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QyxNQUFNLENBQUMsS0FBSyxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxvQkFBRyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsT0FBTyxDQUFDLEdBQzVFLG9CQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxvQkFBRyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsT0FBTyxDQUFDLEdBQzVFLG9CQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxvQkFBRyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsT0FBTyxDQUFDLDRDQU1oRixvQkFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLG9CQUV1QyxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssSUFBSSxFQUFFLEVBQXlDLG9CQUFJLElBQUksQ0FBQyxXQUFXLENBQUMscUJBQ3pJLG9CQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsS0FBSyxJQUFJLENBQUMsTUFBTSxDQUFDLFdBQVcsSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQSxBQUFDLENBQUMsb0JBRXRFLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxJQUFJLENBQUMsRUFBSyxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsSUFBSSxHQUFHLEVBQ3BGLG9CQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQyxzQkFJakQsb0JBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLG9CQUN0QixJQUFJLENBQUMsTUFBTSxDQUFDLFdBQVcsR0FJcEQsb0JBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxJQUFJLElBQUksQ0FBQyxNQUFNLFFBQUss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QUFFO0FBQ3pELFVBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUU7QUFBRSxpQkFBUyxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsT0FBTyxDQUFDLENBQUM7T0FBRTs7QUFFekQsZUFBUyxTQUFTLENBQUMsSUFBSSxFQUFFOzs7QUFDdkIsWUFBTSxVQUFVLEdBQUcsT0FBTyxDQUFDLGFBQWEsYUFBVyxJQUFJLENBQUcsQ0FBQzs7QUFFM0QsWUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxPQUFPLENBQUMsVUFBQSxNQUFNLEVBQUk7QUFDbEMsY0FBTSxLQUFLLEdBQUcsUUFBUSxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsQ0FBQztBQUM1QyxlQUFLLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQztBQUM3QixjQUFNLElBQUksR0FBRyxJQUFJLGNBQWMsQ0FBQyxNQUFNLEVBQUUsT0FBSyxJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUM7QUFDdkQsZUFBSyxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQztBQUNqQyxvQkFBVSxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsQ0FBQztTQUMvQixDQUFDLENBQUM7T0FDSjtLQUNGOzs7U0E5V2tCLGNBQWM7OztxQkFBZCxjQUFjIiwiZmlsZSI6ImdlbmVyYXRlZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzQ29udGVudCI6WyIoZnVuY3Rpb24gZSh0LG4scil7ZnVuY3Rpb24gcyhvLHUpe2lmKCFuW29dKXtpZighdFtvXSl7dmFyIGE9dHlwZW9mIHJlcXVpcmU9PVwiZnVuY3Rpb25cIiYmcmVxdWlyZTtpZighdSYmYSlyZXR1cm4gYShvLCEwKTtpZihpKXJldHVybiBpKG8sITApO3ZhciBmPW5ldyBFcnJvcihcIkNhbm5vdCBmaW5kIG1vZHVsZSAnXCIrbytcIidcIik7dGhyb3cgZi5jb2RlPVwiTU9EVUxFX05PVF9GT1VORFwiLGZ9dmFyIGw9bltvXT17ZXhwb3J0czp7fX07dFtvXVswXS5jYWxsKGwuZXhwb3J0cyxmdW5jdGlvbihlKXt2YXIgbj10W29dWzFdW2VdO3JldHVybiBzKG4/bjplKX0sbCxsLmV4cG9ydHMsZSx0LG4scil9cmV0dXJuIG5bb10uZXhwb3J0c312YXIgaT10eXBlb2YgcmVxdWlyZT09XCJmdW5jdGlvblwiJiZyZXF1aXJlO2Zvcih2YXIgbz0wO288ci5sZW5ndGg7bysrKXMocltvXSk7cmV0dXJuIHN9KSIsIid1c2Ugc3RyaWN0Jztcbi8qXG4gKiBDb252ZXJ0cyBhbnlPZiwgYWxsT2YgYW5kIG9uZU9mIHRvIGh1bWFuIHJlYWRhYmxlIHN0cmluZ1xuKi9cbmV4cG9ydCBmdW5jdGlvbiBjb252ZXJ0WE9mKHR5cGUpIHtcbiAgcmV0dXJuIHR5cGUuc3Vic3RyaW5nKDAsIDMpICsgJyBvZic7XG59XG5cbi8qXG4gKiBpZiBjb25kaXRpb24gZm9yIEVTNiB0ZW1wbGF0ZSBzdHJpbmdzXG4gKiB0byBiZSB1c2VkIG9ubHkgaW4gdGVtcGxhdGUgc3RyaW5nXG4gKlxuICogQGV4YW1wbGUgbXlzdHIgPSBgUmFuZG9tIGlzICR7X2lmKE1hdGgucmFuZG9tKCkgPiAwLjUpYGdyZWF0ZXIgdGhhbiAwLjVgYFxuICpcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gY29uZGl0aW9uXG4gKlxuICogQHJldHVybnMge2Z1bmN0aW9ufSB0aGUgdGVtcGxhdGUgZnVuY3Rpb25cbiovXG5leHBvcnQgZnVuY3Rpb24gX2lmKGNvbmRpdGlvbikge1xuICByZXR1cm4gY29uZGl0aW9uID8gbm9ybWFsIDogZW1wdHk7XG59XG5mdW5jdGlvbiBlbXB0eSgpe1xuICByZXR1cm4gJyc7XG59XG5mdW5jdGlvbiBub3JtYWwgKHRlbXBsYXRlLCAuLi5leHByZXNzaW9ucykge1xuICByZXR1cm4gdGVtcGxhdGUuc2xpY2UoMSkucmVkdWNlKChhY2N1bXVsYXRvciwgcGFydCwgaSkgPT4ge1xuICAgIHJldHVybiBhY2N1bXVsYXRvciArIGV4cHJlc3Npb25zW2ldICsgcGFydDtcbiAgfSwgdGVtcGxhdGVbMF0pO1xufSIsIid1c2Ugc3RyaWN0JztcblxuLyogZ2xvYmFscyBKU09OU2NoZW1hVmlldyAqL1xuXG5pbXBvcnQge1xuICBjb252ZXJ0WE9mLFxuICBfaWZcbn0gZnJvbSAnLi9oZWxwZXJzLmpzJztcblxuXG4vKipcbiAqIEBjbGFzcyBKU09OU2NoZW1hVmlld1xuICpcbiAqIEEgcHVyZSBKYXZhU2NyaXB0IGNvbXBvbmVudCBmb3IgcmVuZGVyaW5nIEpTT04gU2NoZW1hIGluIEhUTUwuXG4qL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgSlNPTlNjaGVtYVZpZXcge1xuXG4gIC8qKlxuICAgKiBAcGFyYW0ge29iamVjdH0gc2NoZW1hIFRoZSBKU09OIFNjaGVtYSBvYmplY3RcbiAgICpcbiAgICogQHBhcmFtIHtudW1iZXJ9IFtvcGVuPTFdIGhpcyBudW1iZXIgaW5kaWNhdGVzIHVwIHRvIGhvdyBtYW55IGxldmVscyB0aGVcbiAgICogcmVuZGVyZWQgdHJlZSBzaG91bGQgZXhwYW5kLiBTZXQgaXQgdG8gYDBgIHRvIG1ha2UgdGhlIHdob2xlIHRyZWUgY29sbGFwc2VkXG4gICAqIG9yIHNldCBpdCB0byBgSW5maW5pdHlgIHRvIGV4cGFuZCB0aGUgdHJlZSBkZWVwbHlcbiAgICogQHBhcmFtIHtvYmplY3R9IG9wdGlvbnMuXG4gICAqICB0aGVtZSB7c3RyaW5nfTogb25lIG9mIHRoZSBmb2xsb3dpbmcgb3B0aW9uczogWydkYXJrJ11cbiAgKi9cbiAgY29uc3RydWN0b3Ioc2NoZW1hLCBvcGVuLCBvcHRpb25zID0ge3RoZW1lOiBudWxsfSkge1xuICAgIHRoaXMuc2NoZW1hID0gc2NoZW1hO1xuICAgIHRoaXMub3BlbiA9IG9wZW47XG4gICAgdGhpcy5vcHRpb25zID0gb3B0aW9ucztcbiAgICB0aGlzLmlzQ29sbGFwc2VkID0gb3BlbiA8PSAwO1xuXG4gICAgLy8gR3VhcmQgYWdhaW5zdCBlbXB0eSBzY2hlbWFzXG4gICAgaWYgKCF0aGlzLnNjaGVtYSkgcmV0dXJuICcnO1xuXG4gICAgLy8gaWYgc2NoZW1hIGlzIGFuIGVtcHR5IG9iamVjdCB3aGljaCBtZWFucyBhbnkgSk9TTlxuICAgIHRoaXMuaXNBbnkgPSB0eXBlb2Ygc2NoZW1hID09PSAnb2JqZWN0JyAmJlxuICAgICAgIUFycmF5LmlzQXJyYXkoc2NoZW1hKSAmJlxuICAgICAgIU9iamVjdC5rZXlzKHNjaGVtYSlcbiAgICAgIC5maWx0ZXIoaz0+IFsndGl0bGUnLCAnZGVzY3JpcHRpb24nXS5pbmRleE9mKGspID09PSAtMSkubGVuZ3RoO1xuXG4gICAgLy8gRGV0ZXJtaW5lIGlmIGEgc2NoZW1hIGlzIGFuIGFycmF5XG4gICAgdGhpcy5pc0FycmF5ID0gIXRoaXMuaXNBbnkgJiYgdGhpcy5zY2hlbWEgJiYgdGhpcy5zY2hlbWEudHlwZSA9PT0gJ2FycmF5JztcblxuICAgIC8vIERldGVybWluZSBpZiBhIHNjaGVtYSBpcyBhIGNvbGxlY3Rpb24gb2YgdHlwZXMgKGFuIEFycmF5IHdpdGggYXQgbGVhc3Qgb25lIG9iamVjdCBpbiBpdClcbiAgICB0aGlzLmlzQ29sbGVjdGlvbk9mVHlwZXMgPSB0aGlzLnNjaGVtYSAmJlxuICAgICAgQXJyYXkuaXNBcnJheSh0aGlzLnNjaGVtYS50eXBlKSAmJlxuICAgICAgdGhpcy5zY2hlbWEudHlwZS5yZWR1Y2UoKGl0ZW0pID0+IHR5cGVvZiBpdGVtID09PSAnb2JqZWN0Jyk7XG5cbiAgICB0aGlzLmlzT2JqZWN0ID0gdGhpcy5zY2hlbWEgJiZcbiAgICAgICh0aGlzLnNjaGVtYS50eXBlID09PSAnb2JqZWN0JyB8fFxuICAgICAgIHRoaXMuc2NoZW1hLnByb3BlcnRpZXMgfHxcbiAgICAgICB0aGlzLnNjaGVtYS5hbnlPZiB8fFxuICAgICAgIHRoaXMuc2NoZW1hLm9uZW9mIHx8XG4gICAgICAgdGhpcy5zY2hlbWEuYWxsT2YpO1xuXG4gICAgLy8gRGV0ZXJtaW5lIGlmIGEgc2NoZW1hIGlzIGEgcHJpbWl0aXZlXG4gICAgdGhpcy5pc1ByaW1pdGl2ZSA9ICF0aGlzLmlzQW55ICYmICF0aGlzLmlzQXJyYXkgJiYgIXRoaXMuaXNPYmplY3QgJiYgIXRoaXMuaXNDb2xsZWN0aW9uT2ZUeXBlcztcblxuICAgIC8vXG4gICAgdGhpcy5zaG93VG9nZ2xlID0gdGhpcy5zY2hlbWEuZGVzY3JpcHRpb24gfHxcbiAgICAgIHRoaXMuc2NoZW1hLnRpdGxlIHx8XG4gICAgICAodGhpcy5pc1ByaW1pdGl2ZSAmJiAoXG4gICAgICAgIHRoaXMuc2NoZW1hLm1pbmltdW0gfHxcbiAgICAgICAgdGhpcy5zY2hlbWEubWF4aW11bSB8fFxuICAgICAgICB0aGlzLnNjaGVtYS5leGNsdXNpdmVNaW5pbXVtIHx8XG4gICAgICAgIHRoaXMuc2NoZW1hLmV4Y2x1c2l2ZU1heGltdW0gfHxcbiAgICAgICAgdGhpcy5zY2hlbWEuZm9ybWF0IHx8ICAgICAgICBcbiAgICAgICAgdGhpcy5zY2hlbWEuZGVmYXVsdCB8fFxuICAgICAgICB0aGlzLnNjaGVtYS5taW5MZW5ndGggfHxcbiAgICAgICAgdGhpcy5zY2hlbWEubWF4TGVuZ3RoIHx8XG4gICAgICAgIHRoaXMuc2NoZW1hLmVudW0pXG4gICAgICApO1xuXG4gICAgLy8gcG9wdWxhdGUgaXNSZXF1aXJlZCBwcm9wZXJ0eSBkb3duIHRvIHByb3BlcnRpZXNcbiAgICBpZiAodGhpcy5zY2hlbWEgJiYgQXJyYXkuaXNBcnJheSh0aGlzLnNjaGVtYS5yZXF1aXJlZCkpIHtcbiAgICAgIHRoaXMuc2NoZW1hLnJlcXVpcmVkLmZvckVhY2gocmVxdWlyZWRQcm9wZXJ0eSA9PiB7XG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5zY2hlbWEucHJvcGVydGllc1tyZXF1aXJlZFByb3BlcnR5XSA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgICB0aGlzLnNjaGVtYS5wcm9wZXJ0aWVzW3JlcXVpcmVkUHJvcGVydHldLmlzUmVxdWlyZWQgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyBDcmVhdGUgYSBsaXN0IG9mIHR5cGVzIGFzIGEgc3RyaW5nIGZvciBDb2xsZWN0aW9ucyBvZiB0eXBlc1xuICAgIGlmKHRoaXMuaXNDb2xsZWN0aW9uT2ZUeXBlcykge1xuICAgICAgdGhpcy50eXBlTGlzdCA9IHRoaXMuc2NoZW1hLnR5cGUucmVkdWNlKChwcmV2LCBjdXJyKSA9PiB7XG4gICAgICAgIHJldHVybiBwcmV2LnR5cGUgKyAnLCAnICsgY3Vyci50eXBlO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgLypcbiAgICogUmV0dXJucyB0aGUgdGVtcGxhdGUgd2l0aCBwb3B1bGF0ZWQgcHJvcGVydGllcy5cbiAgICogVGhpcyB0ZW1wbGF0ZSBkb2VzIG5vdCBoYXZlIHRoZSBjaGlsZHJlblxuICAqL1xuICB0ZW1wbGF0ZSgpIHtcbiAgICBpZiAoIXRoaXMuc2NoZW1hKSB7XG4gICAgICByZXR1cm4gJyc7XG4gICAgfVxuXG4gICAgcmV0dXJuIGBcbiAgICAgIDwhLS0gQW55IC0tPlxuICAgICAgJHtfaWYodGhpcy5pc0FueSlgXG4gICAgICAgIDxkaXYgY2xhc3M9XCJhbnlcIj5cbiAgICAgICAgICAke19pZih0aGlzLnNob3dUb2dnbGUpYFxuICAgICAgICAgICAgPGEgY2xhc3M9XCJ0aXRsZVwiPjxzcGFuIGNsYXNzPVwidG9nZ2xlLWhhbmRsZVwiPjwvc3Bhbj4ke3RoaXMuc2NoZW1hLnRpdGxlIHx8ICcnfSA8L2E+XG4gICAgICAgICAgYH1cblxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwidHlwZSB0eXBlLWFueVwiPiZsdDthbnkmZ3Q7PC9zcGFuPlxuXG4gICAgICAgICAgJHtfaWYodGhpcy5zY2hlbWEuZGVzY3JpcHRpb24gJiYgIXRoaXMuaXNDb2xsYXBzZWQpYFxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImlubmVyIGRlc2NyaXB0aW9uXCI+JHt0aGlzLnNjaGVtYS5kZXNjcmlwdGlvbn08L2Rpdj5cbiAgICAgICAgICBgfVxuICAgICAgICA8L2Rpdj5cbiAgICAgIGB9XG5cbiAgICAgIDwhLS0gUHJpbWl0aXZlIC0tPlxuICAgICAgJHtfaWYodGhpcy5pc1ByaW1pdGl2ZSlgXG4gICAgICAgIDxkaXYgY2xhc3M9XCJwcmltaXRpdmVcIj5cbiAgICAgICAgICAke19pZih0aGlzLnNob3dUb2dnbGUpYFxuICAgICAgICAgICAgPGEgY2xhc3M9XCJ0aXRsZVwiPjxzcGFuIGNsYXNzPVwidG9nZ2xlLWhhbmRsZVwiPjwvc3Bhbj4ke3RoaXMuc2NoZW1hLnRpdGxlIHx8ICcnfSA8L2E+XG4gICAgICAgICAgYH1cblxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ0eXBlXCI+JHt0aGlzLnNjaGVtYS50eXBlfTwvc3Bhbj5cblxuICAgICAgICAgICR7X2lmKHRoaXMuc2NoZW1hLmlzUmVxdWlyZWQpYFxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJyZXF1aXJlZFwiPio8L3NwYW4+XG4gICAgICAgICAgYH1cblxuICAgICAgICAgICR7X2lmKCF0aGlzLmlzQ29sbGFwc2VkICYmIHRoaXMuc2NoZW1hLmZvcm1hdClgXG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cImZvcm1hdFwiPigke3RoaXMuc2NoZW1hLmZvcm1hdH0pPC9zcGFuPlxuICAgICAgICAgIGB9XG5cbiAgICAgICAgICAke19pZighdGhpcy5pc0NvbGxhcHNlZCAmJiB0aGlzLnNjaGVtYS5kZWZhdWx0KWBcbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZGVmYXVsdFwiPmRlZmF1bHQ6ICR7dGhpcy5zY2hlbWEuZGVmYXVsdH08L3NwYW4+XG4gICAgICAgICAgYH0gXG5cbiAgICAgICAgICAke19pZighdGhpcy5pc0NvbGxhcHNlZCAmJiB0aGlzLnNjaGVtYS5taW5pbXVtKWBcbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwicmFuZ2UgbWluaW11bVwiPm1pbmltdW06JHt0aGlzLnNjaGVtYS5taW5pbXVtfTwvc3Bhbj5cbiAgICAgICAgICBgfVxuXG4gICAgICAgICAgJHtfaWYoIXRoaXMuaXNDb2xsYXBzZWQgJiYgdGhpcy5zY2hlbWEuZXhjbHVzaXZlTWluaW11bSlgXG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cInJhbmdlIGV4Y2x1c2l2ZU1pbmltdW1cIj4oZXgpbWluaW11bToke3RoaXMuc2NoZW1hLmV4Y2x1c2l2ZU1pbmltdW19PC9zcGFuPlxuICAgICAgICAgIGB9XG5cbiAgICAgICAgICAke19pZighdGhpcy5pc0NvbGxhcHNlZCAmJiB0aGlzLnNjaGVtYS5tYXhpbXVtKWBcbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwicmFuZ2UgbWF4aW11bVwiPm1heGltdW06JHt0aGlzLnNjaGVtYS5tYXhpbXVtfTwvc3Bhbj5cbiAgICAgICAgICBgfVxuXG4gICAgICAgICAgJHtfaWYoIXRoaXMuaXNDb2xsYXBzZWQgJiYgdGhpcy5zY2hlbWEuZXhjbHVzaXZlTWF4aW11bSlgXG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cInJhbmdlIGV4Y2x1c2l2ZU1heGltdW1cIj4oZXgpbWF4aW11bToke3RoaXMuc2NoZW1hLmV4Y2x1c2l2ZU1heGltdW19PC9zcGFuPlxuICAgICAgICAgIGB9XG5cbiAgICAgICAgICAke19pZighdGhpcy5pc0NvbGxhcHNlZCAmJiB0aGlzLnNjaGVtYS5taW5MZW5ndGgpYFxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJyYW5nZSBtaW5MZW5ndGhcIj5taW5MZW5ndGg6JHt0aGlzLnNjaGVtYS5taW5MZW5ndGh9PC9zcGFuPlxuICAgICAgICAgIGB9XG5cbiAgICAgICAgICAke19pZighdGhpcy5pc0NvbGxhcHNlZCAmJiB0aGlzLnNjaGVtYS5tYXhMZW5ndGgpYFxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJyYW5nZSBtYXhMZW5ndGhcIj5tYXhMZW5ndGg6JHt0aGlzLnNjaGVtYS5tYXhMZW5ndGh9PC9zcGFuPlxuICAgICAgICAgIGB9XG5cbiAgICAgICAgICAke19pZih0aGlzLnNjaGVtYS5kZXNjcmlwdGlvbiAmJiAhdGhpcy5pc0NvbGxhcHNlZClgXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaW5uZXIgZGVzY3JpcHRpb25cIj4ke3RoaXMuc2NoZW1hLmRlc2NyaXB0aW9ufTwvZGl2PlxuICAgICAgICAgIGB9XG5cbiAgICAgICAgICAke19pZighdGhpcy5pc0NvbGxhcHNlZCAmJiB0aGlzLnNjaGVtYS5lbnVtKWBcbiAgICAgICAgICAgICR7dGhpcy5lbnVtKHRoaXMuc2NoZW1hLCB0aGlzLmlzQ29sbGFwc2VkLCB0aGlzLm9wZW4pfVxuICAgICAgICAgIGB9XG5cbiAgICAgICAgICAke19pZih0aGlzLnNjaGVtYS5hbGxPZiAmJiAhdGhpcy5pc0NvbGxhcHNlZClgJHt0aGlzLnhPZih0aGlzLnNjaGVtYSwgJ2FsbE9mJyl9YH1cbiAgICAgICAgICAke19pZih0aGlzLnNjaGVtYS5vbmVPZiAmJiAhdGhpcy5pc0NvbGxhcHNlZClgJHt0aGlzLnhPZih0aGlzLnNjaGVtYSwgJ29uZU9mJyl9YH1cbiAgICAgICAgICAke19pZih0aGlzLnNjaGVtYS5hbnlPZiAmJiAhdGhpcy5pc0NvbGxhcHNlZClgJHt0aGlzLnhPZih0aGlzLnNjaGVtYSwgJ2FueU9mJyl9YH1cbiAgICAgICAgPC9kaXY+XG4gICAgICBgfVxuXG5cbiAgICAgIDwhLS0gQXJyYXkgLS0+XG4gICAgICAke19pZih0aGlzLmlzQXJyYXkpYFxuICAgICAgICA8ZGl2IGNsYXNzPVwiYXJyYXlcIj5cbiAgICAgICAgICA8YSBjbGFzcz1cInRpdGxlXCI+PHNwYW4gY2xhc3M9XCJ0b2dnbGUtaGFuZGxlXCI+PC9zcGFuPiR7dGhpcy5zY2hlbWEudGl0bGUgfHwgJyd9PHNwYW4gY2xhc3M9XCJvcGVuaW5nIGJyYWNrZXRcIj5bPC9zcGFuPiR7X2lmKHRoaXMuaXNDb2xsYXBzZWQpYDxzcGFuIGNsYXNzPVwiY2xvc2luZyBicmFja2V0XCI+XTwvc3Bhbj5gfTwvYT5cbiAgICAgICAgICAke19pZighdGhpcy5pc0NvbGxhcHNlZCAmJiAodGhpcy5zY2hlbWEudW5pcXVlSXRlbXMgfHwgdGhpcy5zY2hlbWEubWluSXRlbXMgfHwgdGhpcy5zY2hlbWEubWF4SXRlbXMpKWBcbiAgICAgICAgICA8c3Bhbj5cbiAgICAgICAgICAgIDxzcGFuIHRpdGxlPVwiaXRlbXMgcmFuZ2VcIj4oJHt0aGlzLnNjaGVtYS5taW5JdGVtcyB8fCAwfS4uJHt0aGlzLnNjaGVtYS5tYXhJdGVtcyB8fCAn4oieJ30pPC9zcGFuPlxuICAgICAgICAgICAgJHtfaWYoIXRoaXMuaXNDb2xsYXBzZWQgJiYgdGhpcy5zY2hlbWEudW5pcXVlSXRlbXMpYDxzcGFuIHRpdGxlPVwidW5pcXVlXCIgY2xhc3M9XCJ1bmlxdWVJdGVtc1wiPuKZpjwvc3Bhbj5gfVxuICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICBgfVxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJpbm5lclwiPlxuICAgICAgICAgICAgJHtfaWYoIXRoaXMuaXNDb2xsYXBzZWQgJiYgdGhpcy5zY2hlbWEuZGVzY3JpcHRpb24pYFxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGVzY3JpcHRpb25cIj4ke3RoaXMuc2NoZW1hLmRlc2NyaXB0aW9ufTwvZGl2PlxuICAgICAgICAgICAgYH1cbiAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICR7X2lmKCF0aGlzLmlzQ29sbGFwc2VkICYmIHRoaXMuc2NoZW1hLmVudW0pYFxuICAgICAgICAgICAgJHt0aGlzLmVudW0odGhpcy5zY2hlbWEsIHRoaXMuaXNDb2xsYXBzZWQsIHRoaXMub3Blbil9XG4gICAgICAgICAgYH1cblxuICAgICAgICAgICR7X2lmKHRoaXMuc2NoZW1hLmFsbE9mICYmICF0aGlzLmlzQ29sbGFwc2VkKWAke3RoaXMueE9mKHRoaXMuc2NoZW1hLCAnYWxsT2YnKX1gfVxuICAgICAgICAgICR7X2lmKHRoaXMuc2NoZW1hLm9uZU9mICYmICF0aGlzLmlzQ29sbGFwc2VkKWAke3RoaXMueE9mKHRoaXMuc2NoZW1hLCAnb25lT2YnKX1gfVxuICAgICAgICAgICR7X2lmKHRoaXMuc2NoZW1hLmFueU9mICYmICF0aGlzLmlzQ29sbGFwc2VkKWAke3RoaXMueE9mKHRoaXMuc2NoZW1hLCAnYW55T2YnKX1gfVxuXG4gICAgICAgICAgJHtfaWYoIXRoaXMuaXNDb2xsYXBzZWQpYFxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY2xvc2luZyBicmFja2V0XCI+XTwvc3Bhbj5cbiAgICAgICAgICBgfVxuICAgICAgICA8L2Rpdj5cbiAgICAgIGB9XG5cbiAgICAgIDwhLS0gT2JqZWN0IC0tPlxuICAgICAgJHtfaWYoIXRoaXMuaXNQcmltaXRpdmUgJiYgIXRoaXMuaXNBcnJheSAmJiAhdGhpcy5pc0FueSAmJiAhdGhpcy5pc0NvbGxlY3Rpb25PZlR5cGVzKWBcbiAgICAgICAgPGRpdiBjbGFzcz1cIm9iamVjdFwiPlxuICAgICAgICAgIDxhIGNsYXNzPVwidGl0bGVcIj48c3BhblxuICAgICAgICAgICAgY2xhc3M9XCJ0b2dnbGUtaGFuZGxlXCI+PC9zcGFuPiR7dGhpcy5zY2hlbWEudGl0bGUgfHwgJyd9IDxzcGFuXG4gICAgICAgICAgICBjbGFzcz1cIm9wZW5pbmcgYnJhY2VcIj57PC9zcGFuPiR7X2lmKHRoaXMuaXNDb2xsYXBzZWQpYFxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNsb3NpbmcgYnJhY2VcIiBuZy1pZj1cImlzQ29sbGFwc2VkXCI+fTwvc3Bhbj5cbiAgICAgICAgICBgfTwvYT5cblxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJpbm5lclwiPlxuICAgICAgICAgICAgJHtfaWYoIXRoaXMuaXNDb2xsYXBzZWQgJiYgdGhpcy5zY2hlbWEuZGVzY3JpcHRpb24pYFxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGVzY3JpcHRpb25cIj4ke3RoaXMuc2NoZW1hLmRlc2NyaXB0aW9ufTwvZGl2PlxuICAgICAgICAgICAgYH1cbiAgICAgICAgICAgIDwhLS0gY2hpbGRyZW4gZ28gaGVyZSAtLT5cbiAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICR7X2lmKCF0aGlzLmlzQ29sbGFwc2VkICYmIHRoaXMuc2NoZW1hLmVudW0pYFxuICAgICAgICAgICAgJHt0aGlzLmVudW0odGhpcy5zY2hlbWEsIHRoaXMuaXNDb2xsYXBzZWQsIHRoaXMub3Blbil9XG4gICAgICAgICAgYH1cblxuICAgICAgICAgICR7X2lmKHRoaXMuc2NoZW1hLmFsbE9mICYmICF0aGlzLmlzQ29sbGFwc2VkKWAke3RoaXMueE9mKHRoaXMuc2NoZW1hLCAnYWxsT2YnKX1gfVxuICAgICAgICAgICR7X2lmKHRoaXMuc2NoZW1hLm9uZU9mICYmICF0aGlzLmlzQ29sbGFwc2VkKWAke3RoaXMueE9mKHRoaXMuc2NoZW1hLCAnb25lT2YnKX1gfVxuICAgICAgICAgICR7X2lmKHRoaXMuc2NoZW1hLmFueU9mICYmICF0aGlzLmlzQ29sbGFwc2VkKWAke3RoaXMueE9mKHRoaXMuc2NoZW1hLCAnYW55T2YnKX1gfVxuXG4gICAgICAgICAgJHtfaWYoIXRoaXMuaXNDb2xsYXBzZWQpYFxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY2xvc2luZyBicmFjZVwiPn08L3NwYW4+XG4gICAgICAgICAgYH1cbiAgICAgICAgPC9kaXY+XG4gICAgICBgfVxuXG4gICAgICA8IS0tIFR5cGUgQXJyYXkgLS0+XG4gICAgICAke19pZih0aGlzLmlzQ29sbGVjdGlvbk9mVHlwZXMpYFxuICAgICAgICA8ZGl2IGNsYXNzPVwiY29sbGVjdGlvbk9mVHlwZXNcIj5cbiAgICAgICAgICA8YSBjbGFzcz1cInRpdGxlXCI+PHNwYW4gY2xhc3M9XCJ0b2dnbGUtaGFuZGxlXCI+PC9zcGFuPiR7dGhpcy5zY2hlbWEudGl0bGUgfHwgJyd9PC9hPlxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwidHlwZVwiPiR7dGhpcy50eXBlTGlzdH08L3NwYW4+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImlubmVyXCI+XG4gICAgICAgICAgICAke19pZih0aGlzLnNjaGVtYS5kZXNjcmlwdGlvbiAmJiAhdGhpcy5pc0NvbGxhcHNlZClgXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkZXNjcmlwdGlvblwiPiR7dGhpcy5zY2hlbWEuZGVzY3JpcHRpb259PC9kaXY+XG4gICAgICAgICAgICBgfVxuICAgICAgICAgICAgIDwhLS0gY2hpbGRyZW4gZ28gaGVyZSAtLT5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICBgfVxuYC5yZXBsYWNlKC9cXHMqXFxuL2csICdcXG4nKS5yZXBsYWNlKC8oXFw8XFwhXFwtXFwtKS4rL2csICcnKS50cmltKCk7XG4gIH1cblxuICAvKlxuICAgKiBUZW1wbGF0ZSBmb3Igb25lT2YsIGFueU9mIGFuZCBhbGxPZlxuICAqL1xuICB4T2Yoc2NoZW1hLCB0eXBlKSB7XG4gICAgcmV0dXJuIGBcbiAgICAgIDxkaXYgY2xhc3M9XCJpbm5lciAke3R5cGV9XCI+XG4gICAgICAgIDxiPiR7Y29udmVydFhPZih0eXBlKX06PC9iPlxuICAgICAgPC9kaXY+XG4gICAgYDtcbiAgfVxuXG4gIC8qXG4gICAqIFRlbXBsYXRlIGZvciBlbnVtc1xuICAqL1xuICBlbnVtKHNjaGVtYSwgaXNDb2xsYXBzZWQsIG9wZW4pIHtcbiAgICByZXR1cm4gYFxuICAgICAgJHtfaWYoIWlzQ29sbGFwc2VkICYmIHNjaGVtYS5lbnVtKWBcbiAgICAgICAgPGRpdiBjbGFzcz1cImlubmVyIGVudW1zXCI+XG4gICAgICAgICAgPGI+RW51bTo8L2I+XG4gICAgICAgIDwvZGl2PlxuICAgICAgYH1cbiAgICBgO1xuICB9XG5cbiAgLypcbiAgICogVG9nZ2xlcyB0aGUgJ2NvbGxhcHNlZCcgc3RhdGVcbiAgKi9cbiAgdG9nZ2xlKCkge1xuICAgIHRoaXMuaXNDb2xsYXBzZWQgPSAhdGhpcy5pc0NvbGxhcHNlZDtcbiAgICB0aGlzLnJlbmRlcigpO1xuICB9XG5cbiAgLypcbiAgICogUmVuZGVycyB0aGUgZWxlbWVudCBhbmQgcmV0dXJucyBpdFxuICAqL1xuICByZW5kZXIoKSB7XG4gICAgaWYgKCF0aGlzLmVsZW1lbnQpIHtcbiAgICAgIHRoaXMuZWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgdGhpcy5lbGVtZW50LmNsYXNzTGlzdC5hZGQoJ2pzb24tc2NoZW1hLXZpZXcnKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5pc0NvbGxhcHNlZCkge1xuICAgICAgdGhpcy5lbGVtZW50LmNsYXNzTGlzdC5hZGQoJ2NvbGxhcHNlZCcpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmVsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZSgnY29sbGFwc2VkJyk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMub3B0aW9ucy50aGVtZSkge1xuICAgICAgdGhpcy5lbGVtZW50LmNsYXNzTGlzdC5hZGQoYGpzb24tc2NoZW1hLXZpZXctJHt0aGlzLm9wdGlvbnMudGhlbWV9YCk7XG4gICAgfVxuXG4gICAgdGhpcy5lbGVtZW50LmlubmVySFRNTCA9IHRoaXMudGVtcGxhdGUoKTtcblxuICAgIGlmICghdGhpcy5zY2hlbWEpIHtcbiAgICAgIHJldHVybiB0aGlzLmVsZW1lbnQ7XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLmlzQ29sbGFwc2VkKSB7XG4gICAgICB0aGlzLmFwcGVuZENoaWxkcmVuKHRoaXMuZWxlbWVudCk7XG4gICAgfVxuXG4gICAgLy8gYWRkIGV2ZW50IGxpc3RlbmVyIGZvciB0b2dnbGluZ1xuICAgIGlmICh0aGlzLmVsZW1lbnQucXVlcnlTZWxlY3RvcignYS50aXRsZScpKSB7XG4gICAgICB0aGlzLmVsZW1lbnQucXVlcnlTZWxlY3RvcignYS50aXRsZScpLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgdGhpcy50b2dnbGUuYmluZCh0aGlzKSk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmVsZW1lbnQ7XG4gIH1cblxuICAvKlxuICAgKiBBcHBlbmRzIGNoaWxkcmVuIHRvIGdpdmVuIGVsZW1lbnQgYmFzZWQgb24gY3VycmVudCBzY2hlbWFcbiAgKi9cbiAgYXBwZW5kQ2hpbGRyZW4oZWxlbWVudCkge1xuICAgIGNvbnN0IGlubmVyID0gZWxlbWVudC5xdWVyeVNlbGVjdG9yKCcuaW5uZXInKTtcblxuICAgIGlmICghaW5uZXIpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5zY2hlbWEuZW51bSkge1xuICAgICAgY29uc3QgZm9ybWF0dGVyID0gbmV3IEpTT05Gb3JtYXR0ZXIodGhpcy5zY2hlbWEuZW51bSwgdGhpcy5vcGVuIC0gMSk7XG4gICAgICBjb25zdCBmb3JtYXR0ZXJFbCA9IGZvcm1hdHRlci5yZW5kZXIoKTtcbiAgICAgIGZvcm1hdHRlckVsLmNsYXNzTGlzdC5hZGQoJ2lubmVyJyk7XG4gICAgICBlbGVtZW50LnF1ZXJ5U2VsZWN0b3IoJy5lbnVtcy5pbm5lcicpLmFwcGVuZENoaWxkKGZvcm1hdHRlckVsKTtcblxuICAgIH1cblxuICAgIGlmICh0aGlzLmlzQXJyYXkpIHtcbiAgICAgIGNvbnN0IHZpZXcgPSBuZXcgSlNPTlNjaGVtYVZpZXcodGhpcy5zY2hlbWEuaXRlbXMsIHRoaXMub3BlbiAtIDEpXG4gICAgICBpbm5lci5hcHBlbmRDaGlsZCh2aWV3LnJlbmRlcigpKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5pc0NvbGxlY3Rpb25PZlR5cGVzKSB7XG4gICAgICBjb25zdCBvcGVuTGV2ZWwgPSB0aGlzLm9wZW4gLSAxO1xuICAgICAgdGhpcy5zY2hlbWEudHlwZS5mb3JFYWNoKCh0eXBlKSA9PiB7XG4gICAgICAgIGNvbnN0IHZpZXcgPSBuZXcgSlNPTlNjaGVtYVZpZXcodHlwZSwgb3BlbkxldmVsKTtcbiAgICAgICAgaW5uZXIuYXBwZW5kQ2hpbGQodmlldy5yZW5kZXIoKSk7XG4gICAgICB9KTtcblxuICAgIH1cblxuICAgIGlmICh0eXBlb2YgdGhpcy5zY2hlbWEucHJvcGVydGllcyA9PT0gJ29iamVjdCcpIHtcbiAgICAgIE9iamVjdC5rZXlzKHRoaXMuc2NoZW1hLnByb3BlcnRpZXMpLmZvckVhY2gocHJvcGVydHlOYW1lID0+IHtcbiAgICAgICAgY29uc3QgcHJvcGVydHkgPSB0aGlzLnNjaGVtYS5wcm9wZXJ0aWVzW3Byb3BlcnR5TmFtZV07XG4gICAgICAgIGNvbnN0IHRlbXBEaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTs7XG4gICAgICAgIHRlbXBEaXYuaW5uZXJIVE1MID0gYDxkaXYgY2xhc3M9XCJwcm9wZXJ0eVwiPlxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwibmFtZVwiPiR7cHJvcGVydHlOYW1lfTo8L3NwYW4+XG4gICAgICAgIDwvZGl2PmA7XG4gICAgICAgIGNvbnN0IHZpZXcgPSBuZXcgSlNPTlNjaGVtYVZpZXcocHJvcGVydHksIHRoaXMub3BlbiAtIDEpO1xuICAgICAgICB0ZW1wRGl2LnF1ZXJ5U2VsZWN0b3IoJy5wcm9wZXJ0eScpLmFwcGVuZENoaWxkKHZpZXcucmVuZGVyKCkpO1xuXG4gICAgICAgIGlubmVyLmFwcGVuZENoaWxkKHRlbXBEaXYucXVlcnlTZWxlY3RvcignLnByb3BlcnR5JykpO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuc2NoZW1hLmFsbE9mKSB7IGFwcGVuZFhPZi5jYWxsKHRoaXMsICdhbGxPZicpOyB9XG4gICAgaWYgKHRoaXMuc2NoZW1hLm9uZU9mKSB7IGFwcGVuZFhPZi5jYWxsKHRoaXMsICdvbmVPZicpOyB9XG4gICAgaWYgKHRoaXMuc2NoZW1hLmFueU9mKSB7IGFwcGVuZFhPZi5jYWxsKHRoaXMsICdhbnlPZicpOyB9XG5cbiAgICBmdW5jdGlvbiBhcHBlbmRYT2YodHlwZSkge1xuICAgICAgY29uc3QgaW5uZXJBbGxPZiA9IGVsZW1lbnQucXVlcnlTZWxlY3RvcihgLmlubmVyLiR7dHlwZX1gKTtcblxuICAgICAgdGhpcy5zY2hlbWFbdHlwZV0uZm9yRWFjaChzY2hlbWEgPT4ge1xuICAgICAgICBjb25zdCBpbm5lciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgICBpbm5lci5jbGFzc0xpc3QuYWRkKCdpbm5lcicpO1xuICAgICAgICBjb25zdCB2aWV3ID0gbmV3IEpTT05TY2hlbWFWaWV3KHNjaGVtYSwgdGhpcy5vcGVuIC0gMSk7XG4gICAgICAgIGlubmVyLmFwcGVuZENoaWxkKHZpZXcucmVuZGVyKCkpO1xuICAgICAgICBpbm5lckFsbE9mLmFwcGVuZENoaWxkKGlubmVyKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxufVxuIl19 diff --git a/dist/bundle.min.js b/dist/bundle.min.js index 8918879..699537f 100644 --- a/dist/bundle.min.js +++ b/dist/bundle.min.js @@ -1 +1 @@ -!function(s){if("object"==typeof exports&&"undefined"!=typeof module)module.exports=s();else if("function"==typeof define&&define.amd)define([],s);else{var n;n="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:this,n.JSONSchemaView=s()}}(function(){return function s(n,e,i){function a(h,l){if(!e[h]){if(!n[h]){var c="function"==typeof require&&require;if(!l&&c)return c(h,!0);if(t)return t(h,!0);var r=new Error("Cannot find module '"+h+"'");throw r.code="MODULE_NOT_FOUND",r}var m=e[h]={exports:{}};n[h][0].call(m.exports,function(s){var e=n[h][1][s];return a(e?e:s)},m,m.exports,s,n,e,i)}return e[h].exports}for(var t="function"==typeof require&&require,h=0;h1?n-1:0),i=1;i\n ','\n\n <any>\n\n ',"\n
\n "],['\n
\n ','\n\n <any>\n\n ',"\n
\n "]),l=a(['\n '," \n "],['\n '," \n "]),c=a(['\n
',"
\n "],['\n
',"
\n "]),r=a(['\n
\n ','\n\n ',"\n\n ","\n\n ","\n\n "," \n\n ","\n\n ","\n\n ","\n\n ","\n\n ","\n\n ","\n\n ","\n\n ","\n\n ","\n ","\n ","\n
\n "],['\n
\n ','\n\n ',"\n\n ","\n\n ","\n\n "," \n\n ","\n\n ","\n\n ","\n\n ","\n\n ","\n\n ","\n\n ","\n\n ","\n\n ","\n ","\n ","\n
\n "]),m=a(['\n *\n '],['\n *\n ']),p=a(['\n (',")\n "],['\n (',")\n "]),o=a(['\n default: ',"\n "],['\n default: ',"\n "]),d=a(['\n minimum:',"\n "],['\n minimum:',"\n "]),f=a(['\n (ex)minimum:',"\n "],['\n (ex)minimum:',"\n "]),u=a(['\n maximum:',"\n "],['\n maximum:',"\n "]),v=a(['\n (ex)maximum:',"\n "],['\n (ex)maximum:',"\n "]),g=a(['\n minLength:',"\n "],['\n minLength:',"\n "]),y=a(['\n maxLength:',"\n "],['\n maxLength:',"\n "]),x=a(["\n ","\n "],["\n ","\n "]),O=a(["",""],["",""]),C=a(['\n
\n ','[',"\n ",'\n
\n ',"\n
\n\n ","\n\n ","\n ","\n ","\n\n ","\n
\n "],['\n
\n ','[',"\n ",'\n
\n ',"\n
\n\n ","\n\n ","\n ","\n ","\n\n ","\n
\n "]),_=a([']'],[']']),b=a(['\n \n (',"..",")\n ","\n \n "],['\n \n (',"..",")\n ","\n \n "]),L=a([''],['']),q=a(['\n
',"
\n "],['\n
',"
\n "]),j=a(['\n ]\n '],['\n ]\n ']),w=a(['\n
\n ',' {','\n\n
\n ',"\n \n
\n\n ","\n\n ","\n ","\n ","\n\n ","\n
\n "],['\n
\n ',' {','\n\n
\n ',"\n \n
\n\n ","\n\n ","\n ","\n ","\n\n ","\n
\n "]),A=a(['\n }\n '],['\n }\n ']),k=a(['\n }\n '],['\n }\n ']),M=a(['\n
\n Enum:\n
\n '],['\n
\n Enum:\n
\n ']),E=s("./helpers.js"),S=function(){function s(n,e){var a=this,t=arguments.length<=2||void 0===arguments[2]?{theme:null}:arguments[2];i(this,s),this.schema=n,this.open=e,this.options=t,this.isCollapsed=e<=0,this.isAny="object"==typeof n&&!Array.isArray(n)&&!Object.keys(n).filter(function(s){return["title","description"].indexOf(s)===-1}).length,this.isArray=!this.isAny&&this.schema&&"array"===this.schema.type,this.isObject=this.schema&&("object"===this.schema.type||this.schema.properties||this.schema.anyOf||this.schema.oneof||this.schema.allOf),this.isPrimitive=!this.isAny&&!this.isArray&&!this.isObject,this.showToggle=this.schema.description||this.schema.title||this.isPrimitive&&(this.schema.minimum||this.schema.maximum||this.schema.exclusiveMinimum||this.schema.exclusiveMaximum||this.schema.format||this.schema["default"]||this.schema.minLength||this.schema.maxLength||this.schema["enum"]),this.schema&&Array.isArray(this.schema.required)&&this.schema.required.forEach(function(s){"object"==typeof a.schema.properties[s]&&(a.schema.properties[s].isRequired=!0)})}return t(s,[{key:"template",value:function(){return this.schema?("\n \n "+(0,E._if)(this.isAny)(h,(0,E._if)(this.showToggle)(l,this.schema.title||""),(0,E._if)(this.schema.description&&!this.isCollapsed)(c,this.schema.description))+"\n\n \n "+(0,E._if)(this.isPrimitive)(r,(0,E._if)(this.showToggle)(l,this.schema.title||""),this.schema.type,(0,E._if)(this.schema.isRequired)(m),(0,E._if)(!this.isCollapsed&&this.schema.format)(p,this.schema.format),(0,E._if)(!this.isCollapsed&&this.schema["default"])(o,this.schema["default"]),(0,E._if)(!this.isCollapsed&&this.schema.minimum)(d,this.schema.minimum),(0,E._if)(!this.isCollapsed&&this.schema.exclusiveMinimum)(f,this.schema.exclusiveMinimum),(0,E._if)(!this.isCollapsed&&this.schema.maximum)(u,this.schema.maximum),(0,E._if)(!this.isCollapsed&&this.schema.exclusiveMaximum)(v,this.schema.exclusiveMaximum),(0,E._if)(!this.isCollapsed&&this.schema.minLength)(g,this.schema.minLength),(0,E._if)(!this.isCollapsed&&this.schema.maxLength)(y,this.schema.maxLength),(0,E._if)(this.schema.description&&!this.isCollapsed)(c,this.schema.description),(0,E._if)(!this.isCollapsed&&this.schema["enum"])(x,this["enum"](this.schema,this.isCollapsed,this.open)),(0,E._if)(this.schema.allOf&&!this.isCollapsed)(O,this.xOf(this.schema,"allOf")),(0,E._if)(this.schema.oneOf&&!this.isCollapsed)(O,this.xOf(this.schema,"oneOf")),(0,E._if)(this.schema.anyOf&&!this.isCollapsed)(O,this.xOf(this.schema,"anyOf")))+"\n\n\n \n "+(0,E._if)(this.isArray)(C,this.schema.title||"",(0,E._if)(this.isCollapsed)(_),(0,E._if)(!this.isCollapsed&&(this.schema.uniqueItems||this.schema.minItems||this.schema.maxItems))(b,this.schema.minItems||0,this.schema.maxItems||"∞",(0,E._if)(!this.isCollapsed&&this.schema.uniqueItems)(L)),(0,E._if)(!this.isCollapsed&&this.schema.description)(q,this.schema.description),(0,E._if)(!this.isCollapsed&&this.schema["enum"])(x,this["enum"](this.schema,this.isCollapsed,this.open)),(0,E._if)(this.schema.allOf&&!this.isCollapsed)(O,this.xOf(this.schema,"allOf")),(0,E._if)(this.schema.oneOf&&!this.isCollapsed)(O,this.xOf(this.schema,"oneOf")),(0,E._if)(this.schema.anyOf&&!this.isCollapsed)(O,this.xOf(this.schema,"anyOf")),(0,E._if)(!this.isCollapsed)(j))+"\n\n \n "+(0,E._if)(!this.isPrimitive&&!this.isArray&&!this.isAny)(w,this.schema.title||"",(0,E._if)(this.isCollapsed)(A),(0,E._if)(!this.isCollapsed&&this.schema.description)(q,this.schema.description),(0,E._if)(!this.isCollapsed&&this.schema["enum"])(x,this["enum"](this.schema,this.isCollapsed,this.open)),(0,E._if)(this.schema.allOf&&!this.isCollapsed)(O,this.xOf(this.schema,"allOf")),(0,E._if)(this.schema.oneOf&&!this.isCollapsed)(O,this.xOf(this.schema,"oneOf")),(0,E._if)(this.schema.anyOf&&!this.isCollapsed)(O,this.xOf(this.schema,"anyOf")),(0,E._if)(!this.isCollapsed)(k))+"\n").replace(/\s*\n/g,"\n").replace(/(\<\!\-\-).+/g,"").trim():""}},{key:"xOf",value:function(s,n){return'\n
\n '+(0,E.convertXOf)(n)+":\n
\n "}},{key:"enum",value:function(s,n,e){return"\n "+(0,E._if)(!n&&s["enum"])(M)+"\n "}},{key:"toggle",value:function(){this.isCollapsed=!this.isCollapsed,this.render()}},{key:"render",value:function(){return this.element||(this.element=document.createElement("div"),this.element.classList.add("json-schema-view")),this.isCollapsed?this.element.classList.add("collapsed"):this.element.classList.remove("collapsed"),this.options.theme&&this.element.classList.add("json-schema-view-"+this.options.theme),this.element.innerHTML=this.template(),this.schema?(this.isCollapsed||this.appendChildren(this.element),this.element.querySelector("a.title")&&this.element.querySelector("a.title").addEventListener("click",this.toggle.bind(this)),this.element):this.element}},{key:"appendChildren",value:function(n){function e(e){var i=this,a=n.querySelector(".inner."+e);this.schema[e].forEach(function(n){var e=document.createElement("div");e.classList.add("inner");var t=new s(n,i.open-1);e.appendChild(t.render()),a.appendChild(e)})}var i=this,a=n.querySelector(".inner");if(a){if(this.schema["enum"]){var t=new JSONFormatter(this.schema["enum"],this.open-1),h=t.render();h.classList.add("inner"),n.querySelector(".enums.inner").appendChild(h)}if(this.isArray){var l=new s(this.schema.items,this.open-1);a.appendChild(l.render())}"object"==typeof this.schema.properties&&Object.keys(this.schema.properties).forEach(function(n){var e=i.schema.properties[n],t=document.createElement("div");t.innerHTML='
\n '+n+":\n
";var h=new s(e,i.open-1);t.querySelector(".property").appendChild(h.render()),a.appendChild(t.querySelector(".property"))}),this.schema.allOf&&e.call(this,"allOf"),this.schema.oneOf&&e.call(this,"oneOf"),this.schema.anyOf&&e.call(this,"anyOf")}}}]),s}();e["default"]=S,n.exports=e["default"]},{"./helpers.js":1}]},{},[2])(2)}); \ No newline at end of file +!function(s){if("object"==typeof exports&&"undefined"!=typeof module)module.exports=s();else if("function"==typeof define&&define.amd)define([],s);else{var n;n="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:this,n.JSONSchemaView=s()}}(function(){return function s(n,e,i){function a(h,l){if(!e[h]){if(!n[h]){var c="function"==typeof require&&require;if(!l&&c)return c(h,!0);if(t)return t(h,!0);var r=new Error("Cannot find module '"+h+"'");throw r.code="MODULE_NOT_FOUND",r}var p=e[h]={exports:{}};n[h][0].call(p.exports,function(s){var e=n[h][1][s];return a(e?e:s)},p,p.exports,s,n,e,i)}return e[h].exports}for(var t="function"==typeof require&&require,h=0;h1?n-1:0),i=1;i\n ','\n\n <any>\n\n ',"\n \n "],['\n
\n ','\n\n <any>\n\n ',"\n
\n "]),l=a(['\n '," \n "],['\n '," \n "]),c=a(['\n
',"
\n "],['\n
',"
\n "]),r=a(['\n
\n ','\n\n ',"\n\n ","\n\n ","\n\n "," \n\n ","\n\n ","\n\n ","\n\n ","\n\n ","\n\n ","\n\n ","\n\n ","\n\n ","\n ","\n ","\n
\n "],['\n
\n ','\n\n ',"\n\n ","\n\n ","\n\n "," \n\n ","\n\n ","\n\n ","\n\n ","\n\n ","\n\n ","\n\n ","\n\n ","\n\n ","\n ","\n ","\n
\n "]),p=a(['\n *\n '],['\n *\n ']),m=a(['\n (',")\n "],['\n (',")\n "]),o=a(['\n default: ',"\n "],['\n default: ',"\n "]),d=a(['\n minimum:',"\n "],['\n minimum:',"\n "]),f=a(['\n (ex)minimum:',"\n "],['\n (ex)minimum:',"\n "]),u=a(['\n maximum:',"\n "],['\n maximum:',"\n "]),v=a(['\n (ex)maximum:',"\n "],['\n (ex)maximum:',"\n "]),y=a(['\n minLength:',"\n "],['\n minLength:',"\n "]),g=a(['\n maxLength:',"\n "],['\n maxLength:',"\n "]),O=a(["\n ","\n "],["\n ","\n "]),C=a(["",""],["",""]),x=a(['\n
\n ','[',"\n ",'\n
\n ',"\n
\n\n ","\n\n ","\n ","\n ","\n\n ","\n
\n "],['\n
\n ','[',"\n ",'\n
\n ',"\n
\n\n ","\n\n ","\n ","\n ","\n\n ","\n
\n "]),_=a([']'],[']']),b=a(['\n \n (',"..",")\n ","\n \n "],['\n \n (',"..",")\n ","\n \n "]),L=a([''],['']),j=a(['\n
',"
\n "],['\n
',"
\n "]),q=a(['\n ]\n '],['\n ]\n ']),w=a(['\n
\n ',' {','\n\n
\n ',"\n \n
\n\n ","\n\n ","\n ","\n ","\n\n ","\n
\n "],['\n
\n ',' {','\n\n
\n ',"\n \n
\n\n ","\n\n ","\n ","\n ","\n\n ","\n
\n "]),A=a(['\n }\n '],['\n }\n ']),k=a(['\n }\n '],['\n }\n ']),T=a(['\n
\n ','\n ','\n
\n ',"\n \n
\n
\n "],['\n
\n ','\n ','\n
\n ',"\n \n
\n
\n "]),M=a(['\n
\n Enum:\n
\n '],['\n
\n Enum:\n
\n ']),E=s("./helpers.js"),S=function(){function s(n,e){var a=this,t=arguments.length<=2||void 0===arguments[2]?{theme:null}:arguments[2];return i(this,s),this.schema=n,this.open=e,this.options=t,this.isCollapsed=e<=0,this.schema?(this.isAny="object"==typeof n&&!Array.isArray(n)&&!Object.keys(n).filter(function(s){return["title","description"].indexOf(s)===-1}).length,this.isArray=!this.isAny&&this.schema&&"array"===this.schema.type,this.isCollectionOfTypes=this.schema&&Array.isArray(this.schema.type)&&this.schema.type.reduce(function(s){return"object"==typeof s}),this.isObject=this.schema&&("object"===this.schema.type||this.schema.properties||this.schema.anyOf||this.schema.oneof||this.schema.allOf),this.isPrimitive=!(this.isAny||this.isArray||this.isObject||this.isCollectionOfTypes),this.showToggle=this.schema.description||this.schema.title||this.isPrimitive&&(this.schema.minimum||this.schema.maximum||this.schema.exclusiveMinimum||this.schema.exclusiveMaximum||this.schema.format||this.schema["default"]||this.schema.minLength||this.schema.maxLength||this.schema["enum"]),this.schema&&Array.isArray(this.schema.required)&&this.schema.required.forEach(function(s){"object"==typeof a.schema.properties[s]&&(a.schema.properties[s].isRequired=!0)}),void(this.isCollectionOfTypes&&(this.typeList=this.schema.type.reduce(function(s,n){return s.type+", "+n.type})))):""}return t(s,[{key:"template",value:function(){return this.schema?("\n \n "+(0,E._if)(this.isAny)(h,(0,E._if)(this.showToggle)(l,this.schema.title||""),(0,E._if)(this.schema.description&&!this.isCollapsed)(c,this.schema.description))+"\n\n \n "+(0,E._if)(this.isPrimitive)(r,(0,E._if)(this.showToggle)(l,this.schema.title||""),this.schema.type,(0,E._if)(this.schema.isRequired)(p),(0,E._if)(!this.isCollapsed&&this.schema.format)(m,this.schema.format),(0,E._if)(!this.isCollapsed&&this.schema["default"])(o,this.schema["default"]),(0,E._if)(!this.isCollapsed&&this.schema.minimum)(d,this.schema.minimum),(0,E._if)(!this.isCollapsed&&this.schema.exclusiveMinimum)(f,this.schema.exclusiveMinimum),(0,E._if)(!this.isCollapsed&&this.schema.maximum)(u,this.schema.maximum),(0,E._if)(!this.isCollapsed&&this.schema.exclusiveMaximum)(v,this.schema.exclusiveMaximum),(0,E._if)(!this.isCollapsed&&this.schema.minLength)(y,this.schema.minLength),(0,E._if)(!this.isCollapsed&&this.schema.maxLength)(g,this.schema.maxLength),(0,E._if)(this.schema.description&&!this.isCollapsed)(c,this.schema.description),(0,E._if)(!this.isCollapsed&&this.schema["enum"])(O,this["enum"](this.schema,this.isCollapsed,this.open)),(0,E._if)(this.schema.allOf&&!this.isCollapsed)(C,this.xOf(this.schema,"allOf")),(0,E._if)(this.schema.oneOf&&!this.isCollapsed)(C,this.xOf(this.schema,"oneOf")),(0,E._if)(this.schema.anyOf&&!this.isCollapsed)(C,this.xOf(this.schema,"anyOf")))+"\n\n\n \n "+(0,E._if)(this.isArray)(x,this.schema.title||"",(0,E._if)(this.isCollapsed)(_),(0,E._if)(!this.isCollapsed&&(this.schema.uniqueItems||this.schema.minItems||this.schema.maxItems))(b,this.schema.minItems||0,this.schema.maxItems||"∞",(0,E._if)(!this.isCollapsed&&this.schema.uniqueItems)(L)),(0,E._if)(!this.isCollapsed&&this.schema.description)(j,this.schema.description),(0,E._if)(!this.isCollapsed&&this.schema["enum"])(O,this["enum"](this.schema,this.isCollapsed,this.open)),(0,E._if)(this.schema.allOf&&!this.isCollapsed)(C,this.xOf(this.schema,"allOf")),(0,E._if)(this.schema.oneOf&&!this.isCollapsed)(C,this.xOf(this.schema,"oneOf")),(0,E._if)(this.schema.anyOf&&!this.isCollapsed)(C,this.xOf(this.schema,"anyOf")),(0,E._if)(!this.isCollapsed)(q))+"\n\n \n "+(0,E._if)(!(this.isPrimitive||this.isArray||this.isAny||this.isCollectionOfTypes))(w,this.schema.title||"",(0,E._if)(this.isCollapsed)(A),(0,E._if)(!this.isCollapsed&&this.schema.description)(j,this.schema.description),(0,E._if)(!this.isCollapsed&&this.schema["enum"])(O,this["enum"](this.schema,this.isCollapsed,this.open)),(0,E._if)(this.schema.allOf&&!this.isCollapsed)(C,this.xOf(this.schema,"allOf")),(0,E._if)(this.schema.oneOf&&!this.isCollapsed)(C,this.xOf(this.schema,"oneOf")),(0,E._if)(this.schema.anyOf&&!this.isCollapsed)(C,this.xOf(this.schema,"anyOf")),(0,E._if)(!this.isCollapsed)(k))+"\n\n \n "+(0,E._if)(this.isCollectionOfTypes)(T,this.schema.title||"",this.typeList,(0,E._if)(this.schema.description&&!this.isCollapsed)(j,this.schema.description))+"\n").replace(/\s*\n/g,"\n").replace(/(\<\!\-\-).+/g,"").trim():""}},{key:"xOf",value:function(s,n){return'\n
\n '+(0,E.convertXOf)(n)+":\n
\n "}},{key:"enum",value:function(s,n,e){return"\n "+(0,E._if)(!n&&s["enum"])(M)+"\n "}},{key:"toggle",value:function(){this.isCollapsed=!this.isCollapsed,this.render()}},{key:"render",value:function(){return this.element||(this.element=document.createElement("div"),this.element.classList.add("json-schema-view")),this.isCollapsed?this.element.classList.add("collapsed"):this.element.classList.remove("collapsed"),this.options.theme&&this.element.classList.add("json-schema-view-"+this.options.theme),this.element.innerHTML=this.template(),this.schema?(this.isCollapsed||this.appendChildren(this.element),this.element.querySelector("a.title")&&this.element.querySelector("a.title").addEventListener("click",this.toggle.bind(this)),this.element):this.element}},{key:"appendChildren",value:function(n){function e(e){var i=this,a=n.querySelector(".inner."+e);this.schema[e].forEach(function(n){var e=document.createElement("div");e.classList.add("inner");var t=new s(n,i.open-1);e.appendChild(t.render()),a.appendChild(e)})}var i=this,a=n.querySelector(".inner");if(a){if(this.schema["enum"]){var t=new JSONFormatter(this.schema["enum"],this.open-1),h=t.render();h.classList.add("inner"),n.querySelector(".enums.inner").appendChild(h)}if(this.isArray){var l=new s(this.schema.items,this.open-1);a.appendChild(l.render())}this.isCollectionOfTypes&&!function(){var n=i.open-1;i.schema.type.forEach(function(e){var i=new s(e,n);a.appendChild(i.render())})}(),"object"==typeof this.schema.properties&&Object.keys(this.schema.properties).forEach(function(n){var e=i.schema.properties[n],t=document.createElement("div");t.innerHTML='
\n '+n+":\n
";var h=new s(e,i.open-1);t.querySelector(".property").appendChild(h.render()),a.appendChild(t.querySelector(".property"))}),this.schema.allOf&&e.call(this,"allOf"),this.schema.oneOf&&e.call(this,"oneOf"),this.schema.anyOf&&e.call(this,"anyOf")}}}]),s}();e["default"]=S,n.exports=e["default"]},{"./helpers.js":1}]},{},[2])(2)}); \ No newline at end of file diff --git a/dist/style.css b/dist/style.css index 33035a6..13ae7db 100644 --- a/dist/style.css +++ b/dist/style.css @@ -1,7 +1,7 @@ /*! * json-schema-view-js * https://github.com/mohsen1/json-schema-view-js#readme - * Version: 0.4.1 - 2016-12-26T23:51:39.556Z + * Version: 1.0.0 - 2017-03-28T13:46:23.580Z * License: MIT */ diff --git a/dist/style.min.css b/dist/style.min.css index e66a5e8..b682da0 100644 --- a/dist/style.min.css +++ b/dist/style.min.css @@ -1,6 +1,6 @@ /*! * json-schema-view-js * https://github.com/mohsen1/json-schema-view-js#readme - * Version: 0.4.1 - 2016-12-26T23:51:39.556Z + * Version: 1.0.0 - 2017-03-28T13:46:23.580Z * License: MIT */.json-schema-view .toggle-handle:after,.json-schema-view.json-schema-view-dark .toggle-handle:after,json-schema-view .toggle-handle:after,json-schema-view[json-schema-view-dark] .toggle-handle:after{content:"▼"}.json-schema-view .title,.json-schema-view.json-schema-view-dark .title,json-schema-view .title,json-schema-view[json-schema-view-dark] .title{font-weight:700;cursor:pointer}.json-schema-view,json-schema-view{font-family:monospace;font-size:0;display:table-cell}.json-schema-view>*,json-schema-view>*{font-size:14px}.json-schema-view .toggle-handle,json-schema-view .toggle-handle{cursor:pointer;margin:auto .3em;font-size:10px;display:inline-block;transform-origin:50% 40%;transition:transform 150ms ease-in}.json-schema-view .toggle-handle,.json-schema-view .toggle-handle:hover,json-schema-view .toggle-handle,json-schema-view .toggle-handle:hover{text-decoration:none;color:#333}.json-schema-view .description,json-schema-view .description{color:gray;font-style:italic}.json-schema-view .title,.json-schema-view .title:hover,json-schema-view .title,json-schema-view .title:hover{text-decoration:none;color:#333}.json-schema-view .brace,.json-schema-view .bracket,.json-schema-view .title,json-schema-view .brace,json-schema-view .bracket,json-schema-view .title{color:#333}.json-schema-view .property,json-schema-view .property{font-size:0;display:table-row}.json-schema-view .property>*,json-schema-view .property>*{font-size:14px;padding:.2em}.json-schema-view .name,json-schema-view .name{color:#00f;display:table-cell;vertical-align:top}.json-schema-view .type,json-schema-view .type{color:green}.json-schema-view .type-any,json-schema-view .type-any{color:#33f}.json-schema-view .required,json-schema-view .required{color:red}.json-schema-view .enums,.json-schema-view .format,json-schema-view .enums,json-schema-view .format{color:#000}.json-schema-view .inner,json-schema-view .inner{padding-left:18px}.json-schema-view.collapsed .description,.json-schema-view.collapsed .property,json-schema-view.collapsed .description,json-schema-view.collapsed .property{display:none}.json-schema-view.collapsed .closeing.brace,json-schema-view.collapsed .closeing.brace{display:inline-block}.json-schema-view.collapsed .toggle-handle,json-schema-view.collapsed .toggle-handle{transform:rotate(-90deg)}.json-schema-view.json-schema-view-dark,json-schema-view[json-schema-view-dark]{font-family:monospace;font-size:0;display:table-cell}.json-schema-view.json-schema-view-dark>*,json-schema-view[json-schema-view-dark]>*{font-size:14px}.json-schema-view.json-schema-view-dark .toggle-handle,json-schema-view[json-schema-view-dark] .toggle-handle{cursor:pointer;margin:auto .3em;font-size:10px;display:inline-block;transform-origin:50% 40%;transition:transform 150ms ease-in}.json-schema-view.json-schema-view-dark .toggle-handle,.json-schema-view.json-schema-view-dark .toggle-handle:hover,json-schema-view[json-schema-view-dark] .toggle-handle,json-schema-view[json-schema-view-dark] .toggle-handle:hover{text-decoration:none;color:#eee}.json-schema-view.json-schema-view-dark .description,json-schema-view[json-schema-view-dark] .description{color:gray;font-style:italic}.json-schema-view.json-schema-view-dark .title,.json-schema-view.json-schema-view-dark .title:hover,json-schema-view[json-schema-view-dark] .title,json-schema-view[json-schema-view-dark] .title:hover{text-decoration:none;color:#eee}.json-schema-view.json-schema-view-dark .brace,.json-schema-view.json-schema-view-dark .bracket,.json-schema-view.json-schema-view-dark .title,json-schema-view[json-schema-view-dark] .brace,json-schema-view[json-schema-view-dark] .bracket,json-schema-view[json-schema-view-dark] .title{color:#eee}.json-schema-view.json-schema-view-dark .property,json-schema-view[json-schema-view-dark] .property{font-size:0;display:table-row}.json-schema-view.json-schema-view-dark .property>*,json-schema-view[json-schema-view-dark] .property>*{font-size:14px;padding:.2em}.json-schema-view.json-schema-view-dark .name,json-schema-view[json-schema-view-dark] .name{color:#add8e6;display:table-cell;vertical-align:top}.json-schema-view.json-schema-view-dark .type,json-schema-view[json-schema-view-dark] .type{color:#90ee90}.json-schema-view.json-schema-view-dark .type-any,json-schema-view[json-schema-view-dark] .type-any{color:#d4ebf2}.json-schema-view.json-schema-view-dark .required,json-schema-view[json-schema-view-dark] .required{color:#fe0000}.json-schema-view.json-schema-view-dark .enums,.json-schema-view.json-schema-view-dark .format,json-schema-view[json-schema-view-dark] .enums,json-schema-view[json-schema-view-dark] .format{color:#fff}.json-schema-view.json-schema-view-dark .inner,json-schema-view[json-schema-view-dark] .inner{padding-left:18px}.json-schema-view.json-schema-view-dark.collapsed .description,.json-schema-view.json-schema-view-dark.collapsed .property,json-schema-view[json-schema-view-dark].collapsed .description,json-schema-view[json-schema-view-dark].collapsed .property{display:none}.json-schema-view.json-schema-view-dark.collapsed .closeing.brace,json-schema-view[json-schema-view-dark].collapsed .closeing.brace{display:inline-block}.json-schema-view.json-schema-view-dark.collapsed .toggle-handle,json-schema-view[json-schema-view-dark].collapsed .toggle-handle{transform:rotate(-90deg)} \ No newline at end of file diff --git a/src/index.js b/src/index.js index 14bc4bb..bca8e7e 100644 --- a/src/index.js +++ b/src/index.js @@ -30,6 +30,9 @@ export default class JSONSchemaView { this.options = options; this.isCollapsed = open <= 0; + // Guard against empty schemas + if (!this.schema) return ''; + // if schema is an empty object which means any JOSN this.isAny = typeof schema === 'object' && !Array.isArray(schema) && @@ -39,6 +42,11 @@ export default class JSONSchemaView { // Determine if a schema is an array this.isArray = !this.isAny && this.schema && this.schema.type === 'array'; + // Determine if a schema is a collection of types (an Array with at least one object in it) + this.isCollectionOfTypes = this.schema && + Array.isArray(this.schema.type) && + this.schema.type.reduce((item) => typeof item === 'object'); + this.isObject = this.schema && (this.schema.type === 'object' || this.schema.properties || @@ -47,7 +55,7 @@ export default class JSONSchemaView { this.schema.allOf); // Determine if a schema is a primitive - this.isPrimitive = !this.isAny && !this.isArray && !this.isObject; + this.isPrimitive = !this.isAny && !this.isArray && !this.isObject && !this.isCollectionOfTypes; // this.showToggle = this.schema.description || @@ -72,6 +80,13 @@ export default class JSONSchemaView { } }); } + + // Create a list of types as a string for Collections of types + if(this.isCollectionOfTypes) { + this.typeList = this.schema.type.reduce((prev, curr) => { + return prev.type + ', ' + curr.type; + }); + } } /* @@ -190,7 +205,7 @@ export default class JSONSchemaView { `} - ${_if(!this.isPrimitive && !this.isArray && !this.isAny)` + ${_if(!this.isPrimitive && !this.isArray && !this.isAny && !this.isCollectionOfTypes)`
${this.schema.title || ''} `} + + + ${_if(this.isCollectionOfTypes)` +
+ ${this.schema.title || ''} + ${this.typeList} +
+ ${_if(this.schema.description && !this.isCollapsed)` +
${this.schema.description}
+ `} + +
+
+ `} `.replace(/\s*\n/g, '\n').replace(/(\<\!\-\-).+/g, '').trim(); } @@ -312,6 +341,15 @@ export default class JSONSchemaView { inner.appendChild(view.render()); } + if (this.isCollectionOfTypes) { + const openLevel = this.open - 1; + this.schema.type.forEach((type) => { + const view = new JSONSchemaView(type, openLevel); + inner.appendChild(view.render()); + }); + + } + if (typeof this.schema.properties === 'object') { Object.keys(this.schema.properties).forEach(propertyName => { const property = this.schema.properties[propertyName]; diff --git a/test/spec.js b/test/spec.js index 5e6bf2f..84f43e5 100644 --- a/test/spec.js +++ b/test/spec.js @@ -27,6 +27,32 @@ const schema = { ] }; +const v3Schema = { + title: 'BloodType', + type: [ + { + type: 'object', + title: 'BloodType', + description: 'Blood type with structured group and RhD', + properties: { + group: { + type: 'string', + enum: ['A', 'B', 'AB', 'O'] + }, + 'RhD': { + type: 'string', + enum: ['+', '-', 'Null'] + } + } + }, + { + type: 'string', + description: 'Blood type in a string', + enum: ['A+', 'A-', 'O+', 'O-', 'AB+', 'AB-', 'A', 'B', 'AB', 'O'] + } + ] +}; + describe('rendering', ()=> { describe('blood type', ()=> { it('renders collapsed with 0 for open', ()=> { @@ -45,4 +71,19 @@ describe('rendering', ()=> { expect(el.querySelector('.inner.oneOf').innerHTML.trim()).not.to.equal(''); }); }); + describe('blood type JSON Schema version 3', () => { + it('renders multiple types inside type', () => { + const view = new JSONSchemaView(v3Schema, 2); + const el = view.render(); + + expect(el.querySelector('.type').innerHTML.trim()).to.equal('object, string'); + }); + + it('renders schemas inside collectionOfTypes', () => { + const view = new JSONSchemaView(v3Schema, 2); + const el = view.render(); + + expect(el.querySelectorAll('.collectionOfTypes .inner > .json-schema-view').length).to.equal(2); + }) + }); }); \ No newline at end of file