UNPKG

jsforce

Version:

Salesforce API Library for JavaScript

546 lines (539 loc) 57 kB
import "core-js/modules/es.error.cause.js"; import "core-js/modules/es.object.to-string.js"; import "core-js/modules/es.regexp.to-string.js"; import _sliceInstanceProperty from "@babel/runtime-corejs3/core-js-stable/instance/slice"; import _Array$from from "@babel/runtime-corejs3/core-js-stable/array/from"; import _Symbol from "@babel/runtime-corejs3/core-js-stable/symbol"; import _getIteratorMethod from "@babel/runtime-corejs3/core-js/get-iterator-method"; import _asyncToGenerator from "@babel/runtime-corejs3/helpers/asyncToGenerator"; import _slicedToArray from "@babel/runtime-corejs3/helpers/slicedToArray"; import _Promise from "@babel/runtime-corejs3/core-js-stable/promise"; import _Array$isArray from "@babel/runtime-corejs3/core-js-stable/array/is-array"; import _Object$keys from "@babel/runtime-corejs3/core-js-stable/object/keys"; import _JSON$stringify from "@babel/runtime-corejs3/core-js-stable/json/stringify"; import _startsWithInstanceProperty from "@babel/runtime-corejs3/core-js-stable/instance/starts-with"; import _concatInstanceProperty from "@babel/runtime-corejs3/core-js-stable/instance/concat"; import _regeneratorRuntime from "@babel/runtime-corejs3/regenerator"; import "core-js/modules/es.function.name.js"; import "core-js/modules/es.regexp.exec.js"; import "core-js/modules/es.regexp.test.js"; import "core-js/modules/es.string.replace.js"; function _createForOfIteratorHelper(r, e) { var t = "undefined" != typeof _Symbol && _getIteratorMethod(r) || r["@@iterator"]; if (!t) { if (_Array$isArray(r) || (t = _unsupportedIterableToArray(r)) || e && r && "number" == typeof r.length) { t && (r = t); var _n = 0, F = function F() {}; return { s: F, n: function n() { return _n >= r.length ? { done: !0 } : { done: !1, value: r[_n++] }; }, e: function e(r) { throw r; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var o, a = !0, u = !1; return { s: function s() { t = t.call(r); }, n: function n() { var r = t.next(); return a = r.done, r; }, e: function e(r) { u = !0, o = r; }, f: function f() { try { a || null == t.return || t.return(); } finally { if (u) throw o; } } }; } function _unsupportedIterableToArray(r, a) { if (r) { var _context6; if ("string" == typeof r) return _arrayLikeToArray(r, a); var t = _sliceInstanceProperty(_context6 = {}.toString.call(r)).call(_context6, 8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? _Array$from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } } function _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; } import fs from 'node:fs'; import xml2js from 'xml2js'; import { castTypeUsingSchema } from '../../soap'; import { isMapObject } from '../../util/function'; /** * */ var WSDLRestrictionSchema = { $: { base: 'string' }, enumeration: [{ $: { value: 'string' } }], 'xsd:enumeration': [{ $: { value: 'string' } }] }; var WSDLSimpleTypeSchema = { $: { name: 'string' }, restriction: WSDLRestrictionSchema, 'xsd:restriction': WSDLRestrictionSchema }; var WSDLElementSchema = { $: { name: 'string', type: 'string', minOccurs: '?number', maxOccurs: '?string', nillable: '?boolean' } }; var WSDLSequenceSchema = { element: ['?', WSDLElementSchema], 'xsd:element': ['?', WSDLElementSchema] }; var WSDLExtensionSchema = { $: { base: 'string' }, sequence: { '?': WSDLSequenceSchema }, 'xsd:sequence': { '?': WSDLSequenceSchema } }; var WSDLComplexContentSchema = { extension: { '?': WSDLExtensionSchema }, 'xsd:extension': { '?': WSDLExtensionSchema } }; var WSDLComplexTypeSchema = { $: { name: 'string' }, sequence: { '?': WSDLSequenceSchema }, 'xsd:sequence': { '?': WSDLSequenceSchema }, complexContent: { '?': WSDLComplexContentSchema }, 'xsd:complexContent': { '?': WSDLComplexContentSchema } }; var WSDLSchemaSchema = { $: 'any', complexType: ['?', 'any'], simpleType: ['?', 'any'], 'xsd:complexType': ['?', 'any'], 'xsd:simpleType': ['?', 'any'] }; var WSDLSchema = { definitions: { $: 'any', types: { schema: ['?', WSDLSchemaSchema], 'xsd:schema': ['?', WSDLSchemaSchema] }, message: ['any'], portType: { $: 'any', operation: ['any'] }, binding: { $: 'any', operation: ['any'] }, service: { $: 'any', documentation: 'string', operation: ['any'] } } }; /** * */ /** * */ function toJsType(xsdType, simpleTypes) { switch (xsdType) { case 'xsd:boolean': return 'boolean'; case 'xsd:string': case 'xsd:date': case 'xsd:dateTime': case 'xsd:time': case 'xsd:base64Binary': return 'string'; case 'xsd:int': case 'xsd:long': case 'xsd:double': return 'number'; case 'xsd:anyType': return 'any'; default: { var _xsdType$split = xsdType.split(':'), _xsdType$split2 = _slicedToArray(_xsdType$split, 2), ns = _xsdType$split2[0], type = _xsdType$split2[1]; if (simpleTypes[type]) { return simpleTypes[type]; } if (ns) { return type; } return xsdType; } } } /** * */ function readWSDLFile(_x) { return _readWSDLFile.apply(this, arguments); } /** * */ function _readWSDLFile() { _readWSDLFile = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee(filePath) { var xmlData, json; return _regeneratorRuntime.wrap(function _callee$(_context) { while (1) switch (_context.prev = _context.next) { case 0: _context.next = 2; return fs.promises.readFile(filePath, 'utf8'); case 2: xmlData = _context.sent; _context.next = 5; return xml2js.parseStringPromise(xmlData, { explicitArray: false }); case 5: json = _context.sent; return _context.abrupt("return", castTypeUsingSchema(json, WSDLSchema)); case 7: case "end": return _context.stop(); } }, _callee); })); return _readWSDLFile.apply(this, arguments); } function getTypeInfo(el, simpleTypes) { var type = toJsType(el.$.type, simpleTypes); var isArray = el.$.maxOccurs === 'unbounded'; var nillable = !isArray && el.$.minOccurs === 0 || el.$.nillable; return isArray ? nillable ? ['?', type] : [type] : nillable ? "?".concat(type) : type; } /** * */ function extractComplexTypes(wsdl) { var _ref, _types$schema, _ref3, _types$schema2; console.log(wsdl.definitions.types['xsd:schema']); var schemas = {}; var simpleTypes = {}; var types = wsdl.definitions.types; var _iterator = _createForOfIteratorHelper((_ref = (_types$schema = types.schema) !== null && _types$schema !== void 0 ? _types$schema : types['xsd:schema']) !== null && _ref !== void 0 ? _ref : []), _step; try { for (_iterator.s(); !(_step = _iterator.n()).done;) { var _ref2, _sc$simpleType; var sc = _step.value; var _iterator3 = _createForOfIteratorHelper((_ref2 = (_sc$simpleType = sc.simpleType) !== null && _sc$simpleType !== void 0 ? _sc$simpleType : sc['xsd:simpleType']) !== null && _ref2 !== void 0 ? _ref2 : []), _step3; try { for (_iterator3.s(); !(_step3 = _iterator3.n()).done;) { var _simpleType$restricti; var st = _step3.value; var simpleType = castTypeUsingSchema(st, WSDLSimpleTypeSchema); var rs = (_simpleType$restricti = simpleType.restriction) !== null && _simpleType$restricti !== void 0 ? _simpleType$restricti : simpleType['xsd:restriction']; var base = rs.$.base.split(':')[1]; simpleTypes[simpleType.$.name] = base; } } catch (err) { _iterator3.e(err); } finally { _iterator3.f(); } } } catch (err) { _iterator.e(err); } finally { _iterator.f(); } console.log({ simpleTypes: simpleTypes }); var _iterator2 = _createForOfIteratorHelper((_ref3 = (_types$schema2 = types.schema) !== null && _types$schema2 !== void 0 ? _types$schema2 : types['xsd:schema']) !== null && _ref3 !== void 0 ? _ref3 : []), _step2; try { for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) { var _ref4, _sc$complexType; var _sc = _step2.value; var _iterator4 = _createForOfIteratorHelper((_ref4 = (_sc$complexType = _sc.complexType) !== null && _sc$complexType !== void 0 ? _sc$complexType : _sc['xsd:complexType']) !== null && _ref4 !== void 0 ? _ref4 : []), _step4; try { for (_iterator4.s(); !(_step4 = _iterator4.n()).done;) { var _complexType$sequence, _seq$element, _complexType$complexC; var ct = _step4.value; var complexType = castTypeUsingSchema(ct, WSDLComplexTypeSchema); var schema = { type: complexType.$.name, props: {} }; var seq = (_complexType$sequence = complexType.sequence) !== null && _complexType$sequence !== void 0 ? _complexType$sequence : complexType['xsd:sequence']; var els = (_seq$element = seq === null || seq === void 0 ? void 0 : seq.element) !== null && _seq$element !== void 0 ? _seq$element : seq === null || seq === void 0 ? void 0 : seq['xsd:element']; var _iterator5 = _createForOfIteratorHelper(els !== null && els !== void 0 ? els : []), _step5; try { for (_iterator5.s(); !(_step5 = _iterator5.n()).done;) { var _el = _step5.value; schema.props[_el.$.name] = getTypeInfo(_el, simpleTypes); } } catch (err) { _iterator5.e(err); } finally { _iterator5.f(); } var cc = (_complexType$complexC = complexType.complexContent) !== null && _complexType$complexC !== void 0 ? _complexType$complexC : complexType['xsd:complexContent']; if (cc) { var _cc$extension; var extension = (_cc$extension = cc.extension) !== null && _cc$extension !== void 0 ? _cc$extension : cc['xsd:extension']; if (extension) { var _extension$sequence, _seq$element2; schema.extends = extension.$.base.split(':')[1]; var _seq = (_extension$sequence = extension.sequence) !== null && _extension$sequence !== void 0 ? _extension$sequence : extension['xsd:sequence']; var _els = (_seq$element2 = _seq === null || _seq === void 0 ? void 0 : _seq.element) !== null && _seq$element2 !== void 0 ? _seq$element2 : _seq === null || _seq === void 0 ? void 0 : _seq['xsd:element']; var _iterator6 = _createForOfIteratorHelper(_els !== null && _els !== void 0 ? _els : []), _step6; try { for (_iterator6.s(); !(_step6 = _iterator6.n()).done;) { var el = _step6.value; schema.props[el.$.name] = getTypeInfo(el, simpleTypes); } } catch (err) { _iterator6.e(err); } finally { _iterator6.f(); } } } schemas[complexType.$.name] = schema; } } catch (err) { _iterator4.e(err); } finally { _iterator4.f(); } } } catch (err) { _iterator2.e(err); } finally { _iterator2.f(); } return schemas; } /** * */ var GENERATED_MESSAGE_COMMENT = "/**\n * This file is generated from WSDL file by wsdl2schema.ts.\n * Do not modify directly.\n * To generate the file, run \"ts-node path/to/wsdl2schema.ts path/to/wsdl.xml path/to/schema.ts\"\n */\n"; /** * */ function dumpSchema(_x2, _x3) { return _dumpSchema.apply(this, arguments); } /** * */ function _dumpSchema() { _dumpSchema = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee2(schemas, outFile) { var out, print, println, writeSchema, writeTypeDef, writeTypeDefs; return _regeneratorRuntime.wrap(function _callee2$(_context4) { while (1) switch (_context4.prev = _context4.next) { case 0: writeTypeDefs = function _writeTypeDefs(schemas) { for (var _i2 = 0, _Object$keys3 = _Object$keys(schemas); _i2 < _Object$keys3.length; _i2++) { var name = _Object$keys3[_i2]; var schema = schemas[name]; print("export type ".concat(name, " = ")); writeTypeDef(schema, schemas); println(';'); println(); } println('export type ApiSchemaTypes = {'); for (var _i3 = 0, _Object$keys4 = _Object$keys(schemas); _i3 < _Object$keys4.length; _i3++) { var _context3; var _name = _Object$keys4[_i3]; println(_concatInstanceProperty(_context3 = "".concat(_name, ": ")).call(_context3, _name, ";"), 2); } println('};'); }; writeTypeDef = function _writeTypeDef(o, schemas) { var indent = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 0; if (typeof o === 'string') { print(o); } else if (isMapObject(o)) { if ('type' in o && 'props' in o) { if ('extends' in o && typeof o.extends === 'string') { print("".concat(o.extends, " & ")); } writeTypeDef(o.props, schemas, indent); return; } var keys = _Object$keys(o); if (keys.length > 0) { println('{'); for (var _i = 0, _Object$keys2 = _Object$keys(o); _i < _Object$keys2.length; _i++) { var _context2; var prop = _Object$keys2[_i]; var value = o[prop]; var nillable = false; var isArray = false; if (_Array$isArray(value)) { isArray = true; var len = value.length; if (len === 2 && value[0] === '?') { nillable = true; value = value[1]; } else { value = value[0]; } } else if (isMapObject(value)) { if ('?' in value) { nillable = true; value = value['?']; } } if (typeof value === 'string' && _startsWithInstanceProperty(value).call(value, '?')) { nillable = true; value = value.substring(1); } print(_concatInstanceProperty(_context2 = "".concat(prop)).call(_context2, nillable ? '?' : '', ": "), indent + 2); writeTypeDef(value, schemas, indent + 2); if (isArray) { print('[]'); } if (nillable) { print(' | null | undefined'); } println(';'); } print('}', indent); } else { print('{}'); } } }; writeSchema = function _writeSchema(o) { var indent = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0; if (indent > 20) { print("'any'"); return; } if (_Array$isArray(o)) { print('['); var i = 0; var _iterator7 = _createForOfIteratorHelper(o), _step7; try { for (_iterator7.s(); !(_step7 = _iterator7.n()).done;) { var co = _step7.value; if (i > 0) { print(', '); } writeSchema(co, indent); i++; } } catch (err) { _iterator7.e(err); } finally { _iterator7.f(); } print(']'); } else if (isMapObject(o)) { var keys = _Object$keys(o); if (keys.length > 0) { println('{'); var _iterator8 = _createForOfIteratorHelper(keys), _step8; try { for (_iterator8.s(); !(_step8 = _iterator8.n()).done;) { var name = _step8.value; var _co = o[name]; var nameId = /^[\w_$]+$/.test(name) ? name : "'".concat(name, "'"); print("".concat(nameId, ": "), indent + 2); writeSchema(_co, indent + 2); println(','); } } catch (err) { _iterator8.e(err); } finally { _iterator8.f(); } print('}', indent); } else { print('{}'); } } else { print(_JSON$stringify(o).replace(/"/g, "'")); } }; out = fs.createWriteStream(outFile, 'utf8'); print = function print(str) { var indent = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0; for (var i = 0; i < indent; i++) { out.write(' '); } out.write(str); }; println = function println() { var str = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : ''; var indent = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0; print(str + '\n', indent); }; return _context4.abrupt("return", new _Promise(function (resolve, reject) { out.on('error', reject); out.on('finish', function () { return resolve(); }); println(GENERATED_MESSAGE_COMMENT); print('export const ApiSchemas = '); writeSchema(schemas); println(' as const;'); println(); writeTypeDefs(schemas); out.end(); })); case 7: case "end": return _context4.stop(); } }, _callee2); })); return _dumpSchema.apply(this, arguments); } function main() { return _main.apply(this, arguments); } function _main() { _main = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee3() { var wsdlFilePath, outFilePath, wsdl, schemas; return _regeneratorRuntime.wrap(function _callee3$(_context5) { while (1) switch (_context5.prev = _context5.next) { case 0: wsdlFilePath = process.argv[2]; if (wsdlFilePath) { _context5.next = 4; break; } console.error('No input WSDL file is specified.'); return _context5.abrupt("return"); case 4: outFilePath = process.argv[3]; if (wsdlFilePath) { _context5.next = 8; break; } console.error('No output typescript schema file is specified.'); return _context5.abrupt("return"); case 8: _context5.next = 10; return readWSDLFile(wsdlFilePath); case 10: wsdl = _context5.sent; schemas = extractComplexTypes(wsdl); dumpSchema(schemas, outFilePath); case 13: case "end": return _context5.stop(); } }, _callee3); })); return _main.apply(this, arguments); } main(); //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJmcyIsInhtbDJqcyIsImNhc3RUeXBlVXNpbmdTY2hlbWEiLCJpc01hcE9iamVjdCIsIldTRExSZXN0cmljdGlvblNjaGVtYSIsIiQiLCJiYXNlIiwiZW51bWVyYXRpb24iLCJ2YWx1ZSIsIldTRExTaW1wbGVUeXBlU2NoZW1hIiwibmFtZSIsInJlc3RyaWN0aW9uIiwiV1NETEVsZW1lbnRTY2hlbWEiLCJ0eXBlIiwibWluT2NjdXJzIiwibWF4T2NjdXJzIiwibmlsbGFibGUiLCJXU0RMU2VxdWVuY2VTY2hlbWEiLCJlbGVtZW50IiwiV1NETEV4dGVuc2lvblNjaGVtYSIsInNlcXVlbmNlIiwiV1NETENvbXBsZXhDb250ZW50U2NoZW1hIiwiZXh0ZW5zaW9uIiwiV1NETENvbXBsZXhUeXBlU2NoZW1hIiwiY29tcGxleENvbnRlbnQiLCJXU0RMU2NoZW1hU2NoZW1hIiwiY29tcGxleFR5cGUiLCJzaW1wbGVUeXBlIiwiV1NETFNjaGVtYSIsImRlZmluaXRpb25zIiwidHlwZXMiLCJzY2hlbWEiLCJtZXNzYWdlIiwicG9ydFR5cGUiLCJvcGVyYXRpb24iLCJiaW5kaW5nIiwic2VydmljZSIsImRvY3VtZW50YXRpb24iLCJ0b0pzVHlwZSIsInhzZFR5cGUiLCJzaW1wbGVUeXBlcyIsIl94c2RUeXBlJHNwbGl0Iiwic3BsaXQiLCJfeHNkVHlwZSRzcGxpdDIiLCJfc2xpY2VkVG9BcnJheSIsIm5zIiwicmVhZFdTRExGaWxlIiwiX3giLCJfcmVhZFdTRExGaWxlIiwiYXBwbHkiLCJhcmd1bWVudHMiLCJfYXN5bmNUb0dlbmVyYXRvciIsIl9yZWdlbmVyYXRvclJ1bnRpbWUiLCJtYXJrIiwiX2NhbGxlZSIsImZpbGVQYXRoIiwieG1sRGF0YSIsImpzb24iLCJ3cmFwIiwiX2NhbGxlZSQiLCJfY29udGV4dCIsInByZXYiLCJuZXh0IiwicHJvbWlzZXMiLCJyZWFkRmlsZSIsInNlbnQiLCJwYXJzZVN0cmluZ1Byb21pc2UiLCJleHBsaWNpdEFycmF5IiwiYWJydXB0Iiwic3RvcCIsImdldFR5cGVJbmZvIiwiZWwiLCJpc0FycmF5IiwiY29uY2F0IiwiZXh0cmFjdENvbXBsZXhUeXBlcyIsIndzZGwiLCJfcmVmIiwiX3R5cGVzJHNjaGVtYSIsIl9yZWYzIiwiX3R5cGVzJHNjaGVtYTIiLCJjb25zb2xlIiwibG9nIiwic2NoZW1hcyIsIl9pdGVyYXRvciIsIl9jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyIiwiX3N0ZXAiLCJzIiwibiIsImRvbmUiLCJfcmVmMiIsIl9zYyRzaW1wbGVUeXBlIiwic2MiLCJfaXRlcmF0b3IzIiwiX3N0ZXAzIiwiX3NpbXBsZVR5cGUkcmVzdHJpY3RpIiwic3QiLCJycyIsImVyciIsImUiLCJmIiwiX2l0ZXJhdG9yMiIsIl9zdGVwMiIsIl9yZWY0IiwiX3NjJGNvbXBsZXhUeXBlIiwiX2l0ZXJhdG9yNCIsIl9zdGVwNCIsIl9jb21wbGV4VHlwZSRzZXF1ZW5jZSIsIl9zZXEkZWxlbWVudCIsIl9jb21wbGV4VHlwZSRjb21wbGV4QyIsImN0IiwicHJvcHMiLCJzZXEiLCJlbHMiLCJfaXRlcmF0b3I1IiwiX3N0ZXA1IiwiY2MiLCJfY2MkZXh0ZW5zaW9uIiwiX2V4dGVuc2lvbiRzZXF1ZW5jZSIsIl9zZXEkZWxlbWVudDIiLCJleHRlbmRzIiwiX2l0ZXJhdG9yNiIsIl9zdGVwNiIsIkdFTkVSQVRFRF9NRVNTQUdFX0NPTU1FTlQiLCJkdW1wU2NoZW1hIiwiX3gyIiwiX3gzIiwiX2R1bXBTY2hlbWEiLCJfY2FsbGVlMiIsIm91dEZpbGUiLCJvdXQiLCJwcmludCIsInByaW50bG4iLCJ3cml0ZVNjaGVtYSIsIndyaXRlVHlwZURlZiIsIndyaXRlVHlwZURlZnMiLCJfY2FsbGVlMiQiLCJfY29udGV4dDQiLCJfd3JpdGVUeXBlRGVmcyIsIl9pMiIsIl9PYmplY3Qka2V5czMiLCJfT2JqZWN0JGtleXMiLCJsZW5ndGgiLCJfaTMiLCJfT2JqZWN0JGtleXM0IiwiX2NvbnRleHQzIiwiX2NvbmNhdEluc3RhbmNlUHJvcGVydHkiLCJjYWxsIiwiX3dyaXRlVHlwZURlZiIsIm8iLCJpbmRlbnQiLCJ1bmRlZmluZWQiLCJrZXlzIiwiX2kiLCJfT2JqZWN0JGtleXMyIiwiX2NvbnRleHQyIiwicHJvcCIsIl9BcnJheSRpc0FycmF5IiwibGVuIiwiX3N0YXJ0c1dpdGhJbnN0YW5jZVByb3BlcnR5Iiwic3Vic3RyaW5nIiwiX3dyaXRlU2NoZW1hIiwiaSIsIl9pdGVyYXRvcjciLCJfc3RlcDciLCJjbyIsIl9pdGVyYXRvcjgiLCJfc3RlcDgiLCJuYW1lSWQiLCJ0ZXN0IiwiX0pTT04kc3RyaW5naWZ5IiwicmVwbGFjZSIsImNyZWF0ZVdyaXRlU3RyZWFtIiwic3RyIiwid3JpdGUiLCJfUHJvbWlzZSIsInJlc29sdmUiLCJyZWplY3QiLCJvbiIsImVuZCIsIm1haW4iLCJfbWFpbiIsIl9jYWxsZWUzIiwid3NkbEZpbGVQYXRoIiwib3V0RmlsZVBhdGgiLCJfY2FsbGVlMyQiLCJfY29udGV4dDUiLCJwcm9jZXNzIiwiYXJndiIsImVycm9yIl0sInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2FwaS93c2RsL3dzZGwyc2NoZW1hLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCB4bWwyanMgZnJvbSAneG1sMmpzJztcbmltcG9ydCB7IGNhc3RUeXBlVXNpbmdTY2hlbWEgfSBmcm9tICcuLi8uLi9zb2FwJztcbmltcG9ydCB7IFNvYXBTY2hlbWFFbGVtZW50VHlwZSwgU29hcFNjaGVtYURlZiB9IGZyb20gJy4uLy4uL3R5cGVzJztcbmltcG9ydCB7IGlzTWFwT2JqZWN0IH0gZnJvbSAnLi4vLi4vdXRpbC9mdW5jdGlvbic7XG5cbi8qKlxuICpcbiAqL1xuY29uc3QgV1NETFJlc3RyaWN0aW9uU2NoZW1hID0ge1xuICAkOiB7IGJhc2U6ICdzdHJpbmcnIH0sXG4gIGVudW1lcmF0aW9uOiBbXG4gICAge1xuICAgICAgJDogeyB2YWx1ZTogJ3N0cmluZycgfSxcbiAgICB9LFxuICBdLFxuICAneHNkOmVudW1lcmF0aW9uJzogW1xuICAgIHtcbiAgICAgICQ6IHsgdmFsdWU6ICdzdHJpbmcnIH0sXG4gICAgfSxcbiAgXSxcbn0gYXMgY29uc3Q7XG5cbmNvbnN0IFdTRExTaW1wbGVUeXBlU2NoZW1hID0ge1xuICAkOiB7IG5hbWU6ICdzdHJpbmcnIH0sXG4gIHJlc3RyaWN0aW9uOiBXU0RMUmVzdHJpY3Rpb25TY2hlbWEsXG4gICd4c2Q6cmVzdHJpY3Rpb24nOiBXU0RMUmVzdHJpY3Rpb25TY2hlbWEsXG59IGFzIGNvbnN0O1xuXG5jb25zdCBXU0RMRWxlbWVudFNjaGVtYSA9IHtcbiAgJDoge1xuICAgIG5hbWU6ICdzdHJpbmcnLFxuICAgIHR5cGU6ICdzdHJpbmcnLFxuICAgIG1pbk9jY3VyczogJz9udW1iZXInLFxuICAgIG1heE9jY3VyczogJz9zdHJpbmcnLFxuICAgIG5pbGxhYmxlOiAnP2Jvb2xlYW4nLFxuICB9LFxufSBhcyBjb25zdDtcblxuY29uc3QgV1NETFNlcXVlbmNlU2NoZW1hID0ge1xuICBlbGVtZW50OiBbJz8nLCBXU0RMRWxlbWVudFNjaGVtYV0sXG4gICd4c2Q6ZWxlbWVudCc6IFsnPycsIFdTRExFbGVtZW50U2NoZW1hXSxcbn0gYXMgY29uc3Q7XG5cbmNvbnN0IFdTRExFeHRlbnNpb25TY2hlbWEgPSB7XG4gICQ6IHsgYmFzZTogJ3N0cmluZycgfSxcbiAgc2VxdWVuY2U6IHsgJz8nOiBXU0RMU2VxdWVuY2VTY2hlbWEgfSxcbiAgJ3hzZDpzZXF1ZW5jZSc6IHsgJz8nOiBXU0RMU2VxdWVuY2VTY2hlbWEgfSxcbn0gYXMgY29uc3Q7XG5cbmNvbnN0IFdTRExDb21wbGV4Q29udGVudFNjaGVtYSA9IHtcbiAgZXh0ZW5zaW9uOiB7ICc/JzogV1NETEV4dGVuc2lvblNjaGVtYSB9LFxuICAneHNkOmV4dGVuc2lvbic6IHsgJz8nOiBXU0RMRXh0ZW5zaW9uU2NoZW1hIH0sXG59IGFzIGNvbnN0O1xuXG5jb25zdCBXU0RMQ29tcGxleFR5cGVTY2hlbWEgPSB7XG4gICQ6IHsgbmFtZTogJ3N0cmluZycgfSxcbiAgc2VxdWVuY2U6IHsgJz8nOiBXU0RMU2VxdWVuY2VTY2hlbWEgfSxcbiAgJ3hzZDpzZXF1ZW5jZSc6IHsgJz8nOiBXU0RMU2VxdWVuY2VTY2hlbWEgfSxcbiAgY29tcGxleENvbnRlbnQ6IHsgJz8nOiBXU0RMQ29tcGxleENvbnRlbnRTY2hlbWEgfSxcbiAgJ3hzZDpjb21wbGV4Q29udGVudCc6IHsgJz8nOiBXU0RMQ29tcGxleENvbnRlbnRTY2hlbWEgfSxcbn0gYXMgY29uc3Q7XG5cbmNvbnN0IFdTRExTY2hlbWFTY2hlbWEgPSB7XG4gICQ6ICdhbnknLFxuICBjb21wbGV4VHlwZTogWyc/JywgJ2FueSddLFxuICBzaW1wbGVUeXBlOiBbJz8nLCAnYW55J10sXG4gICd4c2Q6Y29tcGxleFR5cGUnOiBbJz8nLCAnYW55J10sXG4gICd4c2Q6c2ltcGxlVHlwZSc6IFsnPycsICdhbnknXSxcbn0gYXMgY29uc3Q7XG5cbmNvbnN0IFdTRExTY2hlbWEgPSB7XG4gIGRlZmluaXRpb25zOiB7XG4gICAgJDogJ2FueScsXG4gICAgdHlwZXM6IHtcbiAgICAgIHNjaGVtYTogWyc/JywgV1NETFNjaGVtYVNjaGVtYV0sXG4gICAgICAneHNkOnNjaGVtYSc6IFsnPycsIFdTRExTY2hlbWFTY2hlbWFdLFxuICAgIH0sXG4gICAgbWVzc2FnZTogWydhbnknXSxcbiAgICBwb3J0VHlwZToge1xuICAgICAgJDogJ2FueScsXG4gICAgICBvcGVyYXRpb246IFsnYW55J10sXG4gICAgfSxcbiAgICBiaW5kaW5nOiB7XG4gICAgICAkOiAnYW55JyxcbiAgICAgIG9wZXJhdGlvbjogWydhbnknXSxcbiAgICB9LFxuICAgIHNlcnZpY2U6IHtcbiAgICAgICQ6ICdhbnknLFxuICAgICAgZG9jdW1lbnRhdGlvbjogJ3N0cmluZycsXG4gICAgICBvcGVyYXRpb246IFsnYW55J10sXG4gICAgfSxcbiAgfSxcbn0gYXMgY29uc3Q7XG5cbi8qKlxuICpcbiAqL1xudHlwZSBXU0RMID0gU29hcFNjaGVtYUVsZW1lbnRUeXBlPHR5cGVvZiBXU0RMU2NoZW1hPjtcblxudHlwZSBXU0RMRWxlbWVudCA9IFNvYXBTY2hlbWFFbGVtZW50VHlwZTx0eXBlb2YgV1NETEVsZW1lbnRTY2hlbWE+O1xuXG50eXBlIFdTRExTaW1wbGVUeXBlID0gU29hcFNjaGVtYUVsZW1lbnRUeXBlPHR5cGVvZiBXU0RMU2ltcGxlVHlwZVNjaGVtYT47XG5cbnR5cGUgV1NETENvbXBsZXhUeXBlID0gU29hcFNjaGVtYUVsZW1lbnRUeXBlPHR5cGVvZiBXU0RMQ29tcGxleFR5cGVTY2hlbWE+O1xuXG4vKipcbiAqXG4gKi9cbmZ1bmN0aW9uIHRvSnNUeXBlKHhzZFR5cGU6IHN0cmluZywgc2ltcGxlVHlwZXM6IHsgW3R5cGU6IHN0cmluZ106IHN0cmluZyB9KSB7XG4gIHN3aXRjaCAoeHNkVHlwZSkge1xuICAgIGNhc2UgJ3hzZDpib29sZWFuJzpcbiAgICAgIHJldHVybiAnYm9vbGVhbic7XG4gICAgY2FzZSAneHNkOnN0cmluZyc6XG4gICAgY2FzZSAneHNkOmRhdGUnOlxuICAgIGNhc2UgJ3hzZDpkYXRlVGltZSc6XG4gICAgY2FzZSAneHNkOnRpbWUnOlxuICAgIGNhc2UgJ3hzZDpiYXNlNjRCaW5hcnknOlxuICAgICAgcmV0dXJuICdzdHJpbmcnO1xuICAgIGNhc2UgJ3hzZDppbnQnOlxuICAgIGNhc2UgJ3hzZDpsb25nJzpcbiAgICBjYXNlICd4c2Q6ZG91YmxlJzpcbiAgICAgIHJldHVybiAnbnVtYmVyJztcbiAgICBjYXNlICd4c2Q6YW55VHlwZSc6XG4gICAgICByZXR1cm4gJ2FueSc7XG4gICAgZGVmYXVsdDoge1xuICAgICAgY29uc3QgW25zLCB0eXBlXSA9IHhzZFR5cGUuc3BsaXQoJzonKTtcbiAgICAgIGlmIChzaW1wbGVUeXBlc1t0eXBlXSkge1xuICAgICAgICByZXR1cm4gc2ltcGxlVHlwZXNbdHlwZV07XG4gICAgICB9XG4gICAgICBpZiAobnMpIHtcbiAgICAgICAgcmV0dXJuIHR5cGU7XG4gICAgICB9XG4gICAgICByZXR1cm4geHNkVHlwZTtcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKlxuICovXG5hc3luYyBmdW5jdGlvbiByZWFkV1NETEZpbGUoZmlsZVBhdGg6IHN0cmluZykge1xuICBjb25zdCB4bWxEYXRhID0gYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUoZmlsZVBhdGgsICd1dGY4Jyk7XG4gIGNvbnN0IGpzb24gPSBhd2FpdCB4bWwyanMucGFyc2VTdHJpbmdQcm9taXNlKHhtbERhdGEsIHtcbiAgICBleHBsaWNpdEFycmF5OiBmYWxzZSxcbiAgfSk7XG4gIHJldHVybiBjYXN0VHlwZVVzaW5nU2NoZW1hKGpzb24sIFdTRExTY2hlbWEpIGFzIFdTREw7XG59XG5cbi8qKlxuICpcbiAqL1xuZnVuY3Rpb24gZ2V0VHlwZUluZm8oZWw6IFdTRExFbGVtZW50LCBzaW1wbGVUeXBlczogeyBbbmFtZTogc3RyaW5nXTogc3RyaW5nIH0pIHtcbiAgY29uc3QgdHlwZSA9IHRvSnNUeXBlKGVsLiQudHlwZSwgc2ltcGxlVHlwZXMpO1xuICBjb25zdCBpc0FycmF5ID0gZWwuJC5tYXhPY2N1cnMgPT09ICd1bmJvdW5kZWQnO1xuICBjb25zdCBuaWxsYWJsZSA9ICghaXNBcnJheSAmJiBlbC4kLm1pbk9jY3VycyA9PT0gMCkgfHwgZWwuJC5uaWxsYWJsZTtcbiAgcmV0dXJuIGlzQXJyYXlcbiAgICA/IG5pbGxhYmxlXG4gICAgICA/IFsnPycsIHR5cGVdXG4gICAgICA6IFt0eXBlXVxuICAgIDogbmlsbGFibGVcbiAgICA/IGA/JHt0eXBlfWBcbiAgICA6IHR5cGU7XG59XG5cbi8qKlxuICpcbiAqL1xuZnVuY3Rpb24gZXh0cmFjdENvbXBsZXhUeXBlcyh3c2RsOiBXU0RMKSB7XG4gIGNvbnNvbGUubG9nKHdzZGwuZGVmaW5pdGlvbnMudHlwZXNbJ3hzZDpzY2hlbWEnXSk7XG4gIGNvbnN0IHNjaGVtYXM6IHsgW25hbWU6IHN0cmluZ106IFNvYXBTY2hlbWFEZWYgfSA9IHt9O1xuICBjb25zdCBzaW1wbGVUeXBlczogeyBbdHlwZTogc3RyaW5nXTogc3RyaW5nIH0gPSB7fTtcbiAgY29uc3QgdHlwZXMgPSB3c2RsLmRlZmluaXRpb25zLnR5cGVzO1xuICBmb3IgKGNvbnN0IHNjIG9mIHR5cGVzLnNjaGVtYSA/PyB0eXBlc1sneHNkOnNjaGVtYSddID8/IFtdKSB7XG4gICAgZm9yIChjb25zdCBzdCBvZiBzYy5zaW1wbGVUeXBlID8/IHNjWyd4c2Q6c2ltcGxlVHlwZSddID8/IFtdKSB7XG4gICAgICBjb25zdCBzaW1wbGVUeXBlOiBXU0RMU2ltcGxlVHlwZSA9IGNhc3RUeXBlVXNpbmdTY2hlbWEoXG4gICAgICAgIHN0LFxuICAgICAgICBXU0RMU2ltcGxlVHlwZVNjaGVtYSxcbiAgICAgICk7XG4gICAgICBjb25zdCBycyA9IHNpbXBsZVR5cGUucmVzdHJpY3Rpb24gPz8gc2ltcGxlVHlwZVsneHNkOnJlc3RyaWN0aW9uJ107XG4gICAgICBjb25zdCBiYXNlID0gcnMuJC5iYXNlLnNwbGl0KCc6JylbMV07XG4gICAgICBzaW1wbGVUeXBlc1tzaW1wbGVUeXBlLiQubmFtZV0gPSBiYXNlO1xuICAgIH1cbiAgfVxuICBjb25zb2xlLmxvZyh7IHNpbXBsZVR5cGVzIH0pO1xuICBmb3IgKGNvbnN0IHNjIG9mIHR5cGVzLnNjaGVtYSA/PyB0eXBlc1sneHNkOnNjaGVtYSddID8/IFtdKSB7XG4gICAgZm9yIChjb25zdCBjdCBvZiBzYy5jb21wbGV4VHlwZSA/PyBzY1sneHNkOmNvbXBsZXhUeXBlJ10gPz8gW10pIHtcbiAgICAgIGNvbnN0IGNvbXBsZXhUeXBlOiBXU0RMQ29tcGxleFR5cGUgPSBjYXN0VHlwZVVzaW5nU2NoZW1hKFxuICAgICAgICBjdCxcbiAgICAgICAgV1NETENvbXBsZXhUeXBlU2NoZW1hLFxuICAgICAgKTtcbiAgICAgIGNvbnN0IHNjaGVtYToge1xuICAgICAgICB0eXBlOiBzdHJpbmc7XG4gICAgICAgIGV4dGVuZHM/OiBzdHJpbmc7XG4gICAgICAgIHByb3BzOiB7IFtuYW1lOiBzdHJpbmddOiBhbnkgfTtcbiAgICAgIH0gPSB7XG4gICAgICAgIHR5cGU6IGNvbXBsZXhUeXBlLiQubmFtZSxcbiAgICAgICAgcHJvcHM6IHt9LFxuICAgICAgfTtcbiAgICAgIGNvbnN0IHNlcSA9IGNvbXBsZXhUeXBlLnNlcXVlbmNlID8/IGNvbXBsZXhUeXBlWyd4c2Q6c2VxdWVuY2UnXTtcbiAgICAgIGNvbnN0IGVscyA9IHNlcT8uZWxlbWVudCA/PyBzZXE/LlsneHNkOmVsZW1lbnQnXTtcbiAgICAgIGZvciAoY29uc3QgZWwgb2YgZWxzID8/IFtdKSB7XG4gICAgICAgIHNjaGVtYS5wcm9wc1tlbC4kLm5hbWVdID0gZ2V0VHlwZUluZm8oZWwsIHNpbXBsZVR5cGVzKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGNjID1cbiAgICAgICAgY29tcGxleFR5cGUuY29tcGxleENvbnRlbnQgPz8gY29tcGxleFR5cGVbJ3hzZDpjb21wbGV4Q29udGVudCddO1xuICAgICAgaWYgKGNjKSB7XG4gICAgICAgIGNvbnN0IGV4dGVuc2lvbiA9IGNjLmV4dGVuc2lvbiA/PyBjY1sneHNkOmV4dGVuc2lvbiddO1xuICAgICAgICBpZiAoZXh0ZW5zaW9uKSB7XG4gICAgICAgICAgc2NoZW1hLmV4dGVuZHMgPSBleHRlbnNpb24uJC5iYXNlLnNwbGl0KCc6JylbMV07XG4gICAgICAgICAgY29uc3Qgc2VxID0gZXh0ZW5zaW9uLnNlcXVlbmNlID8/IGV4dGVuc2lvblsneHNkOnNlcXVlbmNlJ107XG4gICAgICAgICAgY29uc3QgZWxzID0gc2VxPy5lbGVtZW50ID8/IHNlcT8uWyd4c2Q6ZWxlbWVudCddO1xuICAgICAgICAgIGZvciAoY29uc3QgZWwgb2YgZWxzID8/IFtdKSB7XG4gICAgICAgICAgICBzY2hlbWEucHJvcHNbZWwuJC5uYW1lXSA9IGdldFR5cGVJbmZvKGVsLCBzaW1wbGVUeXBlcyk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBzY2hlbWFzW2NvbXBsZXhUeXBlLiQubmFtZV0gPSBzY2hlbWE7XG4gICAgfVxuICB9XG4gIHJldHVybiBzY2hlbWFzO1xufVxuXG4vKipcbiAqXG4gKi9cbmNvbnN0IEdFTkVSQVRFRF9NRVNTQUdFX0NPTU1FTlQgPSBgLyoqXG4gKiBUaGlzIGZpbGUgaXMgZ2VuZXJhdGVkIGZyb20gV1NETCBmaWxlIGJ5IHdzZGwyc2NoZW1hLnRzLlxuICogRG8gbm90IG1vZGlmeSBkaXJlY3RseS5cbiAqIFRvIGdlbmVyYXRlIHRoZSBmaWxlLCBydW4gXCJ0cy1ub2RlIHBhdGgvdG8vd3NkbDJzY2hlbWEudHMgcGF0aC90by93c2RsLnhtbCBwYXRoL3RvL3NjaGVtYS50c1wiXG4gKi9cbmA7XG5cbi8qKlxuICpcbiAqL1xuYXN5bmMgZnVuY3Rpb24gZHVtcFNjaGVtYShzY2hlbWFzOiB7IFtuYW1lOiBzdHJpbmddOiBhbnkgfSwgb3V0RmlsZTogc3RyaW5nKSB7XG4gIGNvbnN0IG91dCA9IGZzLmNyZWF0ZVdyaXRlU3RyZWFtKG91dEZpbGUsICd1dGY4Jyk7XG4gIGNvbnN0IHByaW50ID0gKHN0cjogc3RyaW5nLCBpbmRlbnQ6IG51bWJlciA9IDApID0+IHtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGluZGVudDsgaSsrKSB7XG4gICAgICBvdXQud3JpdGUoJyAnKTtcbiAgICB9XG4gICAgb3V0LndyaXRlKHN0cik7XG4gIH07XG4gIGNvbnN0IHByaW50bG4gPSAoc3RyOiBzdHJpbmcgPSAnJywgaW5kZW50OiBudW1iZXIgPSAwKSA9PiB7XG4gICAgcHJpbnQoc3RyICsgJ1xcbicsIGluZGVudCk7XG4gIH07XG4gIHJldHVybiBuZXcgUHJvbWlzZTx2b2lkPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgb3V0Lm9uKCdlcnJvcicsIHJlamVjdCk7XG4gICAgb3V0Lm9uKCdmaW5pc2gnLCAoKSA9PiByZXNvbHZlKCkpO1xuICAgIHByaW50bG4oR0VORVJBVEVEX01FU1NBR0VfQ09NTUVOVCk7XG4gICAgcHJpbnQoJ2V4cG9ydCBjb25zdCBBcGlTY2hlbWFzID0gJyk7XG4gICAgd3JpdGVTY2hlbWEoc2NoZW1hcyk7XG4gICAgcHJpbnRsbignIGFzIGNvbnN0OycpO1xuICAgIHByaW50bG4oKTtcbiAgICB3cml0ZVR5cGVEZWZzKHNjaGVtYXMpO1xuICAgIG91dC5lbmQoKTtcbiAgfSk7XG5cbiAgZnVuY3Rpb24gd3JpdGVTY2hlbWEobzogYW55LCBpbmRlbnQ6IG51bWJlciA9IDApIHtcbiAgICBpZiAoaW5kZW50ID4gMjApIHtcbiAgICAgIHByaW50KFwiJ2FueSdcIik7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChBcnJheS5pc0FycmF5KG8pKSB7XG4gICAgICBwcmludCgnWycpO1xuICAgICAgbGV0IGkgPSAwO1xuICAgICAgZm9yIChjb25zdCBjbyBvZiBvKSB7XG4gICAgICAgIGlmIChpID4gMCkge1xuICAgICAgICAgIHByaW50KCcsICcpO1xuICAgICAgICB9XG4gICAgICAgIHdyaXRlU2NoZW1hKGNvLCBpbmRlbnQpO1xuICAgICAgICBpKys7XG4gICAgICB9XG4gICAgICBwcmludCgnXScpO1xuICAgIH0gZWxzZSBpZiAoaXNNYXBPYmplY3QobykpIHtcbiAgICAgIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyhvKTtcbiAgICAgIGlmIChrZXlzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgcHJpbnRsbigneycpO1xuICAgICAgICBmb3IgKGNvbnN0IG5hbWUgb2Yga2V5cykge1xuICAgICAgICAgIGNvbnN0IGNvID0gb1tuYW1lXTtcbiAgICAgICAgICBjb25zdCBuYW1lSWQgPSAvXltcXHdfJF0rJC8udGVzdChuYW1lKSA/IG5hbWUgOiBgJyR7bmFtZX0nYDtcbiAgICAgICAgICBwcmludChgJHtuYW1lSWR9OiBgLCBpbmRlbnQgKyAyKTtcbiAgICAgICAgICB3cml0ZVNjaGVtYShjbywgaW5kZW50ICsgMik7XG4gICAgICAgICAgcHJpbnRsbignLCcpO1xuICAgICAgICB9XG4gICAgICAgIHByaW50KCd9JywgaW5kZW50KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHByaW50KCd7fScpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBwcmludChKU09OLnN0cmluZ2lmeShvKS5yZXBsYWNlKC9cIi9nLCBcIidcIikpO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIHdyaXRlVHlwZURlZihcbiAgICBvOiBhbnksXG4gICAgc2NoZW1hczogeyBbbmFtZTogc3RyaW5nXTogU29hcFNjaGVtYURlZiB9LFxuICAgIGluZGVudDogbnVtYmVyID0gMCxcbiAgKSB7XG4gICAgaWYgKHR5cGVvZiBvID09PSAnc3RyaW5nJykge1xuICAgICAgcHJpbnQobyk7XG4gICAgfSBlbHNlIGlmIChpc01hcE9iamVjdChvKSkge1xuICAgICAgaWYgKCd0eXBlJyBpbiBvICYmICdwcm9wcycgaW4gbykge1xuICAgICAgICBpZiAoJ2V4dGVuZHMnIGluIG8gJiYgdHlwZW9mIG8uZXh0ZW5kcyA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICBwcmludChgJHtvLmV4dGVuZHN9ICYgYCk7XG4gICAgICAgIH1cbiAgICAgICAgd3JpdGVUeXBlRGVmKG8ucHJvcHMsIHNjaGVtYXMsIGluZGVudCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyhvKTtcbiAgICAgIGlmIChrZXlzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgcHJpbnRsbigneycpO1xuICAgICAgICBmb3IgKGNvbnN0IHByb3Agb2YgT2JqZWN0LmtleXMobykpIHtcbiAgICAgICAgICBsZXQgdmFsdWU6IGFueSA9IG9bcHJvcF07XG4gICAgICAgICAgbGV0IG5pbGxhYmxlID0gZmFsc2U7XG4gICAgICAgICAgbGV0IGlzQXJyYXkgPSBmYWxzZTtcbiAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgICAgIGlzQXJyYXkgPSB0cnVlO1xuICAgICAgICAgICAgY29uc3QgbGVuID0gdmFsdWUubGVuZ3RoO1xuICAgICAgICAgICAgaWYgKGxlbiA9PT0gMiAmJiB2YWx1ZVswXSA9PT0gJz8nKSB7XG4gICAgICAgICAgICAgIG5pbGxhYmxlID0gdHJ1ZTtcbiAgICAgICAgICAgICAgdmFsdWUgPSB2YWx1ZVsxXTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHZhbHVlID0gdmFsdWVbMF07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIGlmIChpc01hcE9iamVjdCh2YWx1ZSkpIHtcbiAgICAgICAgICAgIGlmICgnPycgaW4gdmFsdWUpIHtcbiAgICAgICAgICAgICAgbmlsbGFibGUgPSB0cnVlO1xuICAgICAgICAgICAgICB2YWx1ZSA9IHZhbHVlWyc/J107XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnICYmIHZhbHVlLnN0YXJ0c1dpdGgoJz8nKSkge1xuICAgICAgICAgICAgbmlsbGFibGUgPSB0cnVlO1xuICAgICAgICAgICAgdmFsdWUgPSB2YWx1ZS5zdWJzdHJpbmcoMSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHByaW50KGAke3Byb3B9JHtuaWxsYWJsZSA/ICc/JyA6ICcnfTogYCwgaW5kZW50ICsgMik7XG4gICAgICAgICAgd3JpdGVUeXBlRGVmKHZhbHVlLCBzY2hlbWFzLCBpbmRlbnQgKyAyKTtcbiAgICAgICAgICBpZiAoaXNBcnJheSkge1xuICAgICAgICAgICAgcHJpbnQoJ1tdJyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChuaWxsYWJsZSkge1xuICAgICAgICAgICAgcHJpbnQoJyB8IG51bGwgfCB1bmRlZmluZWQnKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcHJpbnRsbignOycpO1xuICAgICAgICB9XG4gICAgICAgIHByaW50KCd9JywgaW5kZW50KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHByaW50KCd7fScpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIHdyaXRlVHlwZURlZnMoc2NoZW1hczogeyBbbmFtZTogc3RyaW5nXTogU29hcFNjaGVtYURlZiB9KSB7XG4gICAgZm9yIChjb25zdCBuYW1lIG9mIE9iamVjdC5rZXlzKHNjaGVtYXMpKSB7XG4gICAgICBjb25zdCBzY2hlbWEgPSBzY2hlbWFzW25hbWVdO1xuICAgICAgcHJpbnQoYGV4cG9ydCB0eXBlICR7bmFtZX0gPSBgKTtcbiAgICAgIHdyaXRlVHlwZURlZihzY2hlbWEsIHNjaGVtYXMpO1xuICAgICAgcHJpbnRsbignOycpO1xuICAgICAgcHJpbnRsbigpO1xuICAgIH1cbiAgICBwcmludGxuKCdleHBvcnQgdHlwZSBBcGlTY2hlbWFUeXBlcyA9IHsnKTtcbiAgICBmb3IgKGNvbnN0IG5hbWUgb2YgT2JqZWN0LmtleXMoc2NoZW1hcykpIHtcbiAgICAgIHByaW50bG4oYCR7bmFtZX06ICR7bmFtZX07YCwgMik7XG4gICAgfVxuICAgIHByaW50bG4oJ307Jyk7XG4gIH1cbn1cblxuLyoqXG4gKlxuICovXG5hc3luYyBmdW5jdGlvbiBtYWluKCkge1xuICBjb25zdCB3c2RsRmlsZVBhdGggPSBwcm9jZXNzLmFyZ3ZbMl07XG4gIGlmICghd3NkbEZpbGVQYXRoKSB7XG4gICAgY29uc29sZS5lcnJvcignTm8gaW5wdXQgV1NETCBmaWxlIGlzIHNwZWNpZmllZC4nKTtcbiAgICByZXR1cm47XG4gIH1cbiAgY29uc3Qgb3V0RmlsZVBhdGggPSBwcm9jZXNzLmFyZ3ZbM107XG4gIGlmICghd3NkbEZpbGVQYXRoKSB7XG4gICAgY29uc29sZS5lcnJvcignTm8gb3V0cHV0IHR5cGVzY3JpcHQgc2NoZW1hIGZpbGUgaXMgc3BlY2lmaWVkLicpO1xuICAgIHJldHVybjtcbiAgfVxuICBjb25zdCB3c2RsID0gYXdhaXQgcmVhZFdTRExGaWxlKHdzZGxGaWxlUGF0aCk7XG4gIGNvbnN0IHNjaGVtYXMgPSBleHRyYWN0Q29tcGxleFR5cGVzKHdzZGwpO1xuICBkdW1wU2NoZW1hKHNjaGVtYXMsIG91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