UNPKG

jsforce

Version:

Salesforce API Library for JavaScript

381 lines (371 loc) 39.8 kB
import _asyncToGenerator from "@babel/runtime-corejs3/helpers/asyncToGenerator"; import _classCallCheck from "@babel/runtime-corejs3/helpers/classCallCheck"; import _createClass from "@babel/runtime-corejs3/helpers/createClass"; import _defineProperty from "@babel/runtime-corejs3/helpers/defineProperty"; import _objectWithoutProperties from "@babel/runtime-corejs3/helpers/objectWithoutProperties"; var _excluded = ["type", "attributes"]; import _regeneratorRuntime from "@babel/runtime-corejs3/regenerator"; function ownKeys(e, r) { var t = _Object$keys(e); if (_Object$getOwnPropertySymbols) { var o = _Object$getOwnPropertySymbols(e); r && (o = _filterInstanceProperty(o).call(o, function (r) { return _Object$getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; } function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var _context12, _context13; var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? _forEachInstanceProperty(_context12 = ownKeys(Object(t), !0)).call(_context12, function (r) { _defineProperty(e, r, t[r]); }) : _Object$getOwnPropertyDescriptors ? _Object$defineProperties(e, _Object$getOwnPropertyDescriptors(t)) : _forEachInstanceProperty(_context13 = ownKeys(Object(t))).call(_context13, function (r) { _Object$defineProperty(e, r, _Object$getOwnPropertyDescriptor(t, r)); }); } return e; } function _createForOfIteratorHelper(o, allowArrayLike) { var it = typeof _Symbol !== "undefined" && _getIteratorMethod(o) || o["@@iterator"]; if (!it) { if (_Array$isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e) { throw _e; }, 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 normalCompletion = true, didErr = false, err; return { s: function s() { it = it.call(o); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e2) { didErr = true; err = _e2; }, f: function f() { try { if (!normalCompletion && it.return != null) it.return(); } finally { if (didErr) throw err; } } }; } function _unsupportedIterableToArray(o, minLen) { var _context11; if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = _sliceInstanceProperty(_context11 = Object.prototype.toString.call(o)).call(_context11, 8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return _Array$from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); } function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i]; return arr2; } import "core-js/modules/es.error.cause.js"; import "core-js/modules/es.array.push.js"; import "core-js/modules/es.function.name.js"; import "core-js/modules/es.object.to-string.js"; import "core-js/modules/es.regexp.exec.js"; import "core-js/modules/es.regexp.test.js"; import "core-js/modules/es.regexp.to-string.js"; import _mapInstanceProperty from "@babel/runtime-corejs3/core-js-stable/instance/map"; import _Array$isArray from "@babel/runtime-corejs3/core-js-stable/array/is-array"; import _filterInstanceProperty from "@babel/runtime-corejs3/core-js-stable/instance/filter"; import _Object$keys from "@babel/runtime-corejs3/core-js-stable/object/keys"; import _concatInstanceProperty from "@babel/runtime-corejs3/core-js-stable/instance/concat"; 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 _Object$getOwnPropertySymbols from "@babel/runtime-corejs3/core-js-stable/object/get-own-property-symbols"; import _Object$getOwnPropertyDescriptor from "@babel/runtime-corejs3/core-js-stable/object/get-own-property-descriptor"; import _forEachInstanceProperty from "@babel/runtime-corejs3/core-js-stable/instance/for-each"; import _Object$getOwnPropertyDescriptors from "@babel/runtime-corejs3/core-js-stable/object/get-own-property-descriptors"; import _Object$defineProperties from "@babel/runtime-corejs3/core-js-stable/object/define-properties"; import _Object$defineProperty from "@babel/runtime-corejs3/core-js-stable/object/define-property"; /** * @file Salesforce SOAP API * @author Shinichi Tomita <shinichi.tomita@gmail.com> */ import { registerModule } from '../jsforce'; import SOAP from '../soap'; import { ApiSchemas } from './soap/schema'; /** * */ function toSoapRecord(records) { var _context; return _mapInstanceProperty(_context = _Array$isArray(records) ? records : [records]).call(_context, function (record) { var _context2; var type = record.type, attributes = record.attributes, rec = _objectWithoutProperties(record, _excluded); var t = type || (attributes === null || attributes === void 0 ? void 0 : attributes.type); if (!t) { throw new Error('Given record is not including sObject type information'); } var fieldsToNull = _filterInstanceProperty(_context2 = _Object$keys(rec)).call(_context2, function (field) { return record[field] === null; }); var _iterator = _createForOfIteratorHelper(fieldsToNull), _step; try { for (_iterator.s(); !(_step = _iterator.n()).done;) { var field = _step.value; delete rec[field]; } } catch (err) { _iterator.e(err); } finally { _iterator.f(); } return fieldsToNull.length > 0 ? _objectSpread({ type: t, fieldsToNull: fieldsToNull }, rec) : _objectSpread({ type: t }, rec); }); } /** * API class for Partner SOAP call */ export var SoapApi = /*#__PURE__*/function () { function SoapApi(conn) { _classCallCheck(this, SoapApi); this._conn = conn; } /** * Call SOAP Api (Partner) endpoint * @private */ return _createClass(SoapApi, [{ key: "_invoke", value: (function () { var _invoke2 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee(method, message, schema) { var _context3; var soapEndpoint, res; return _regeneratorRuntime.wrap(function _callee$(_context4) { while (1) switch (_context4.prev = _context4.next) { case 0: soapEndpoint = new SOAP(this._conn, { xmlns: 'urn:partner.soap.sforce.com', endpointUrl: _concatInstanceProperty(_context3 = "".concat(this._conn.instanceUrl, "/services/Soap/u/")).call(_context3, this._conn.version) }); _context4.next = 3; return soapEndpoint.invoke(method, message, schema ? { result: schema } : undefined, ApiSchemas); case 3: res = _context4.sent; return _context4.abrupt("return", res.result); case 5: case "end": return _context4.stop(); } }, _callee, this); })); function _invoke(_x, _x2, _x3) { return _invoke2.apply(this, arguments); } return _invoke; }() /** * Converts a Lead into an Account, Contact, or (optionally) an Opportunity. */ ) }, { key: "convertLead", value: function () { var _convertLead = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee2(leadConverts) { var schema; return _regeneratorRuntime.wrap(function _callee2$(_context5) { while (1) switch (_context5.prev = _context5.next) { case 0: schema = _Array$isArray(leadConverts) ? [ApiSchemas.LeadConvertResult] : ApiSchemas.LeadConvertResult; return _context5.abrupt("return", this._invoke('convertLead', { leadConverts: leadConverts }, schema)); case 2: case "end": return _context5.stop(); } }, _callee2, this); })); function convertLead(_x4) { return _convertLead.apply(this, arguments); } return convertLead; }() /** * Merge up to three records into one */ }, { key: "merge", value: function () { var _merge = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee3(mergeRequests) { var schema; return _regeneratorRuntime.wrap(function _callee3$(_context6) { while (1) switch (_context6.prev = _context6.next) { case 0: schema = _Array$isArray(mergeRequests) ? [ApiSchemas.MergeResult] : ApiSchemas.MergeResult; return _context6.abrupt("return", this._invoke('merge', { mergeRequests: mergeRequests }, schema)); case 2: case "end": return _context6.stop(); } }, _callee3, this); })); function merge(_x5) { return _merge.apply(this, arguments); } return merge; }() /** * Delete records from the recycle bin immediately */ }, { key: "emptyRecycleBin", value: (function () { var _emptyRecycleBin = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee4(ids) { return _regeneratorRuntime.wrap(function _callee4$(_context7) { while (1) switch (_context7.prev = _context7.next) { case 0: return _context7.abrupt("return", this._invoke('emptyRecycleBin', { ids: ids }, [ApiSchemas.EmptyRecycleBinResult])); case 1: case "end": return _context7.stop(); } }, _callee4, this); })); function emptyRecycleBin(_x6) { return _emptyRecycleBin.apply(this, arguments); } return emptyRecycleBin; }() /** * Returns information about the standard and custom apps available to the logged-in user */ ) }, { key: "describeTabs", value: (function () { var _describeTabs = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee5() { return _regeneratorRuntime.wrap(function _callee5$(_context8) { while (1) switch (_context8.prev = _context8.next) { case 0: return _context8.abrupt("return", this._invoke('describeTabs', {}, [ApiSchemas.DescribeTabSetResult])); case 1: case "end": return _context8.stop(); } }, _callee5, this); })); function describeTabs() { return _describeTabs.apply(this, arguments); } return describeTabs; }() /** * Retrieves the current system timestamp (Coordinated Universal Time (UTC) time zone) from the API */ ) }, { key: "getServerTimestamp", value: (function () { var _getServerTimestamp = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee6() { return _regeneratorRuntime.wrap(function _callee6$(_context9) { while (1) switch (_context9.prev = _context9.next) { case 0: return _context9.abrupt("return", this._invoke('getServerTimestamp', {}, ApiSchemas.GetServerTimestampResult)); case 1: case "end": return _context9.stop(); } }, _callee6, this); })); function getServerTimestamp() { return _getServerTimestamp.apply(this, arguments); } return getServerTimestamp; }() /** * Retrieves personal information for the user associated with the current session */ ) }, { key: "getUserInfo", value: (function () { var _getUserInfo = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee7() { return _regeneratorRuntime.wrap(function _callee7$(_context10) { while (1) switch (_context10.prev = _context10.next) { case 0: return _context10.abrupt("return", this._invoke('getUserInfo', {}, ApiSchemas.GetUserInfoResult)); case 1: case "end": return _context10.stop(); } }, _callee7, this); })); function getUserInfo() { return _getUserInfo.apply(this, arguments); } return getUserInfo; }() /** * Sets the specified user’s password to the specified value */ ) }, { key: "setPassword", value: function setPassword(userId, password) { return this._invoke('setPassword', { userId: userId, password: password }, 'string'); } /** * Resets the specified user’s password */ }, { key: "resetPassword", value: function resetPassword(userId) { return this._invoke('resetPassword', { userId: userId }, ApiSchemas.ResetPasswordResult); } /** * Adds one or more new records to your organization’s data */ }, { key: "create", value: function create(sObjects) { var schema = _Array$isArray(sObjects) ? [ApiSchemas.SaveResult] : ApiSchemas.SaveResult; var args = { '@xmlns': 'urn:partner.soap.sforce.com', '@xmlns:ns1': 'sobject.partner.soap.sforce.com', 'ns1:sObjects': toSoapRecord(sObjects) }; return this._invoke('create', args, schema); } /** * Updates one or more existing records in your organization’s data. */ }, { key: "update", value: function update(sObjects) { var schema = _Array$isArray(sObjects) ? [ApiSchemas.SaveResult] : ApiSchemas.SaveResult; var args = { '@xmlns': 'urn:partner.soap.sforce.com', '@xmlns:ns1': 'sobject.partner.soap.sforce.com', 'ns1:sObjects': toSoapRecord(sObjects) }; return this._invoke('update', args, schema); } /** * Creates new records and updates existing records in your organization’s data. */ }, { key: "upsert", value: function upsert(externalIdFieldName, sObjects) { var schema = _Array$isArray(sObjects) ? [ApiSchemas.UpsertResult] : ApiSchemas.UpsertResult; var args = { '@xmlns': 'urn:partner.soap.sforce.com', '@xmlns:ns1': 'sobject.partner.soap.sforce.com', 'ns1:externalIDFieldName': externalIdFieldName, 'ns1:sObjects': toSoapRecord(sObjects) }; return this._invoke('upsert', args, schema); } /** * Deletes one or more records from your organization’s data */ }, { key: "delete", value: function _delete(ids) { var schema = _Array$isArray(ids) ? [ApiSchemas.DeleteResult] : ApiSchemas.DeleteResult; var args = { '@xmlns': 'urn:partner.soap.sforce.com', '@xmlns:ns1': 'sobject.partner.soap.sforce.com', 'ns1:ids': ids }; return this._invoke('delete', args, schema); } /** * Undelete records from the recycle bin immediately */ }, { key: "undelete", value: function undelete(ids) { var schema = [ApiSchemas.UndeleteResult]; var args = { '@xmlns': 'urn:partner.soap.sforce.com', '@xmlns:ns1': 'sobject.partner.soap.sforce.com', 'ns1:ids': ids }; return this._invoke('undelete', args, schema); } }]); }(); /*--------------------------------------------*/ /* * Register hook in connection instantiation for dynamically adding this API module features */ registerModule('soap', function (conn) { return new SoapApi(conn); }); export default SoapApi; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJyZWdpc3Rlck1vZHVsZSIsIlNPQVAiLCJBcGlTY2hlbWFzIiwidG9Tb2FwUmVjb3JkIiwicmVjb3JkcyIsIl9jb250ZXh0IiwiX21hcEluc3RhbmNlUHJvcGVydHkiLCJfQXJyYXkkaXNBcnJheSIsImNhbGwiLCJyZWNvcmQiLCJfY29udGV4dDIiLCJ0eXBlIiwiYXR0cmlidXRlcyIsInJlYyIsIl9vYmplY3RXaXRob3V0UHJvcGVydGllcyIsIl9leGNsdWRlZCIsInQiLCJFcnJvciIsImZpZWxkc1RvTnVsbCIsIl9maWx0ZXJJbnN0YW5jZVByb3BlcnR5IiwiX09iamVjdCRrZXlzIiwiZmllbGQiLCJfaXRlcmF0b3IiLCJfY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlciIsIl9zdGVwIiwicyIsIm4iLCJkb25lIiwidmFsdWUiLCJlcnIiLCJlIiwiZiIsImxlbmd0aCIsIl9vYmplY3RTcHJlYWQiLCJTb2FwQXBpIiwiY29ubiIsIl9jbGFzc0NhbGxDaGVjayIsIl9jb25uIiwiX2NyZWF0ZUNsYXNzIiwia2V5IiwiX2ludm9rZTIiLCJfYXN5bmNUb0dlbmVyYXRvciIsIl9yZWdlbmVyYXRvclJ1bnRpbWUiLCJtYXJrIiwiX2NhbGxlZSIsIm1ldGhvZCIsIm1lc3NhZ2UiLCJzY2hlbWEiLCJfY29udGV4dDMiLCJzb2FwRW5kcG9pbnQiLCJyZXMiLCJ3cmFwIiwiX2NhbGxlZSQiLCJfY29udGV4dDQiLCJwcmV2IiwibmV4dCIsInhtbG5zIiwiZW5kcG9pbnRVcmwiLCJfY29uY2F0SW5zdGFuY2VQcm9wZXJ0eSIsImNvbmNhdCIsImluc3RhbmNlVXJsIiwidmVyc2lvbiIsImludm9rZSIsInJlc3VsdCIsInVuZGVmaW5lZCIsInNlbnQiLCJhYnJ1cHQiLCJzdG9wIiwiX2ludm9rZSIsIl94IiwiX3gyIiwiX3gzIiwiYXBwbHkiLCJhcmd1bWVudHMiLCJfY29udmVydExlYWQiLCJfY2FsbGVlMiIsImxlYWRDb252ZXJ0cyIsIl9jYWxsZWUyJCIsIl9jb250ZXh0NSIsIkxlYWRDb252ZXJ0UmVzdWx0IiwiY29udmVydExlYWQiLCJfeDQiLCJfbWVyZ2UiLCJfY2FsbGVlMyIsIm1lcmdlUmVxdWVzdHMiLCJfY2FsbGVlMyQiLCJfY29udGV4dDYiLCJNZXJnZVJlc3VsdCIsIm1lcmdlIiwiX3g1IiwiX2VtcHR5UmVjeWNsZUJpbiIsIl9jYWxsZWU0IiwiaWRzIiwiX2NhbGxlZTQkIiwiX2NvbnRleHQ3IiwiRW1wdHlSZWN5Y2xlQmluUmVzdWx0IiwiZW1wdHlSZWN5Y2xlQmluIiwiX3g2IiwiX2Rlc2NyaWJlVGFicyIsIl9jYWxsZWU1IiwiX2NhbGxlZTUkIiwiX2NvbnRleHQ4IiwiRGVzY3JpYmVUYWJTZXRSZXN1bHQiLCJkZXNjcmliZVRhYnMiLCJfZ2V0U2VydmVyVGltZXN0YW1wIiwiX2NhbGxlZTYiLCJfY2FsbGVlNiQiLCJfY29udGV4dDkiLCJHZXRTZXJ2ZXJUaW1lc3RhbXBSZXN1bHQiLCJnZXRTZXJ2ZXJUaW1lc3RhbXAiLCJfZ2V0VXNlckluZm8iLCJfY2FsbGVlNyIsIl9jYWxsZWU3JCIsIl9jb250ZXh0MTAiLCJHZXRVc2VySW5mb1Jlc3VsdCIsImdldFVzZXJJbmZvIiwic2V0UGFzc3dvcmQiLCJ1c2VySWQiLCJwYXNzd29yZCIsInJlc2V0UGFzc3dvcmQiLCJSZXNldFBhc3N3b3JkUmVzdWx0IiwiY3JlYXRlIiwic09iamVjdHMiLCJTYXZlUmVzdWx0IiwiYXJncyIsInVwZGF0ZSIsInVwc2VydCIsImV4dGVybmFsSWRGaWVsZE5hbWUiLCJVcHNlcnRSZXN1bHQiLCJfZGVsZXRlIiwiRGVsZXRlUmVzdWx0IiwidW5kZWxldGUiLCJVbmRlbGV0ZVJlc3VsdCJdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9hcGkvc29hcC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBmaWxlIFNhbGVzZm9yY2UgU09BUCBBUElcbiAqIEBhdXRob3IgU2hpbmljaGkgVG9taXRhIDxzaGluaWNoaS50b21pdGFAZ21haWwuY29tPlxuICovXG5pbXBvcnQgeyByZWdpc3Rlck1vZHVsZSB9IGZyb20gJy4uL2pzZm9yY2UnO1xuaW1wb3J0IENvbm5lY3Rpb24gZnJvbSAnLi4vY29ubmVjdGlvbic7XG5pbXBvcnQgU09BUCBmcm9tICcuLi9zb2FwJztcbmltcG9ydCB7IFNjaGVtYSwgUmVjb3JkLCBTb2FwU2NoZW1hRGVmLCBTb2FwU2NoZW1hIH0gZnJvbSAnLi4vdHlwZXMnO1xuaW1wb3J0IHtcbiAgQXBpU2NoZW1hcyxcbiAgTGVhZENvbnZlcnQsXG4gIExlYWRDb252ZXJ0UmVzdWx0LFxuICBNZXJnZVJlcXVlc3QsXG4gIE1lcmdlUmVzdWx0LFxuICBFbXB0eVJlY3ljbGVCaW5SZXN1bHQsXG4gIFVuZGVsZXRlUmVzdWx0LFxuICBEZXNjcmliZVRhYlNldFJlc3VsdCxcbiAgR2V0U2VydmVyVGltZXN0YW1wUmVzdWx0LFxuICBHZXRVc2VySW5mb1Jlc3VsdCxcbiAgUmVzZXRQYXNzd29yZFJlc3VsdCxcbiAgU2F2ZVJlc3VsdCxcbiAgVXBzZXJ0UmVzdWx0LFxuICBEZWxldGVSZXN1bHQsXG59IGZyb20gJy4vc29hcC9zY2hlbWEnO1xuXG4vKipcbiAqXG4gKi9cbmZ1bmN0aW9uIHRvU29hcFJlY29yZChyZWNvcmRzOiBSZWNvcmQgfCBSZWNvcmRbXSk6IFJlY29yZCB8IFJlY29yZFtdIHtcbiAgcmV0dXJuIChBcnJheS5pc0FycmF5KHJlY29yZHMpID8gcmVjb3JkcyA6IFtyZWNvcmRzXSkubWFwKChyZWNvcmQpID0+IHtcbiAgICBjb25zdCB7IHR5cGUsIGF0dHJpYnV0ZXMsIC4uLnJlYyB9ID0gcmVjb3JkO1xuICAgIGNvbnN0IHQgPSB0eXBlIHx8IGF0dHJpYnV0ZXM/LnR5cGU7XG4gICAgaWYgKCF0KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0dpdmVuIHJlY29yZCBpcyBub3QgaW5jbHVkaW5nIHNPYmplY3QgdHlwZSBpbmZvcm1hdGlvbicpO1xuICAgIH1cbiAgICBjb25zdCBmaWVsZHNUb051bGwgPSBPYmplY3Qua2V5cyhyZWMpLmZpbHRlcihcbiAgICAgIChmaWVsZCkgPT4gcmVjb3JkW2ZpZWxkXSA9PT0gbnVsbCxcbiAgICApO1xuICAgIGZvciAoY29uc3QgZmllbGQgb2YgZmllbGRzVG9OdWxsKSB7XG4gICAgICBkZWxldGUgcmVjW2ZpZWxkXTtcbiAgICB9XG4gICAgcmV0dXJuIGZpZWxkc1RvTnVsbC5sZW5ndGggPiAwXG4gICAgICA/IHsgdHlwZTogdCwgZmllbGRzVG9OdWxsLCAuLi5yZWMgfVxuICAgICAgOiB7IHR5cGU6IHQsIC4uLnJlYyB9O1xuICB9KTtcbn1cblxuLyoqXG4gKiBBUEkgY2xhc3MgZm9yIFBhcnRuZXIgU09BUCBjYWxsXG4gKi9cbmV4cG9ydCBjbGFzcyBTb2FwQXBpPFMgZXh0ZW5kcyBTY2hlbWE+IHtcbiAgX2Nvbm46IENvbm5lY3Rpb248Uz47XG5cbiAgY29uc3RydWN0b3IoY29ubjogQ29ubmVjdGlvbjxTPikge1xuICAgIHRoaXMuX2Nvbm4gPSBjb25uO1xuICB9XG5cbiAgLyoqXG4gICAqIENhbGwgU09BUCBBcGkgKFBhcnRuZXIpIGVuZHBvaW50XG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBhc3luYyBfaW52b2tlKFxuICAgIG1ldGhvZDogc3RyaW5nLFxuICAgIG1lc3NhZ2U6IG9iamVjdCxcbiAgICBzY2hlbWE6IFNvYXBTY2hlbWEgfCBTb2FwU2NoZW1hRGVmLFxuICApIHtcbiAgICBjb25zdCBzb2FwRW5kcG9pbnQgPSBuZXcgU09BUCh0aGlzLl9jb25uLCB7XG4gICAgICB4bWxuczogJ3VybjpwYXJ0bmVyLnNvYXAuc2ZvcmNlLmNvbScsXG4gICAgICBlbmRwb2ludFVybDogYCR7dGhpcy5fY29ubi5pbnN0YW5jZVVybH0vc2VydmljZXMvU29hcC91LyR7dGhpcy5fY29ubi52ZXJzaW9ufWAsXG4gICAgfSk7XG4gICAgY29uc3QgcmVzID0gYXdhaXQgc29hcEVuZHBvaW50Lmludm9rZShcbiAgICAgIG1ldGhvZCxcbiAgICAgIG1lc3NhZ2UsXG4gICAgICBzY2hlbWEgPyAoeyByZXN1bHQ6IHNjaGVtYSB9IGFzIFNvYXBTY2hlbWEpIDogdW5kZWZpbmVkLFxuICAgICAgQXBpU2NoZW1hcyxcbiAgICApO1xuICAgIHJldHVybiByZXMucmVzdWx0O1xuICB9XG5cbiAgLyoqXG4gICAqIENvbnZlcnRzIGEgTGVhZCBpbnRvIGFuIEFjY291bnQsIENvbnRhY3QsIG9yIChvcHRpb25hbGx5KSBhbiBPcHBvcnR1bml0eS5cbiAgICovXG4gIGNvbnZlcnRMZWFkKFxuICAgIGxlYWRDb252ZXJ0czogQXJyYXk8UGFydGlhbDxMZWFkQ29udmVydD4+LFxuICApOiBQcm9taXNlPExlYWRDb252ZXJ0UmVzdWx0W10+O1xuICBjb252ZXJ0TGVhZChsZWFkQ29udmVydDogUGFydGlhbDxMZWFkQ29udmVydD4pOiBQcm9taXNlPExlYWRDb252ZXJ0UmVzdWx0PjtcbiAgY29udmVydExlYWQoXG4gICAgbGVhZENvbnZlcnQ6IFBhcnRpYWw8TGVhZENvbnZlcnQ+IHwgQXJyYXk8UGFydGlhbDxMZWFkQ29udmVydD4+LFxuICApOiBQcm9taXNlPExlYWRDb252ZXJ0UmVzdWx0IHwgTGVhZENvbnZlcnRSZXN1bHRbXT47XG4gIGFzeW5jIGNvbnZlcnRMZWFkKFxuICAgIGxlYWRDb252ZXJ0czogUGFydGlhbDxMZWFkQ29udmVydD4gfCBBcnJheTxQYXJ0aWFsPExlYWRDb252ZXJ0Pj4sXG4gICkge1xuICAgIGNvbnN0IHNjaGVtYSA9IEFycmF5LmlzQXJyYXkobGVhZENvbnZlcnRzKVxuICAgICAgPyBbQXBpU2NoZW1hcy5MZWFkQ29udmVydFJlc3VsdF1cbiAgICAgIDogQXBpU2NoZW1hcy5MZWFkQ29udmVydFJlc3VsdDtcbiAgICByZXR1cm4gdGhpcy5faW52b2tlKCdjb252ZXJ0TGVhZCcsIHsgbGVhZENvbnZlcnRzIH0sIHNjaGVtYSk7XG4gIH1cblxuICAvKipcbiAgICogTWVyZ2UgdXAgdG8gdGhyZWUgcmVjb3JkcyBpbnRvIG9uZVxuICAgKi9cbiAgbWVyZ2UobWVyZ2VSZXF1ZXN0czogQXJyYXk8UGFydGlhbDxNZXJnZVJlcXVlc3Q+Pik6IFByb21pc2U8TWVyZ2VSZXN1bHRbXT47XG4gIG1lcmdlKG1lcmdlUmVxdWVzdDogUGFydGlhbDxNZXJnZVJlcXVlc3Q+KTogUHJvbWlzZTxNZXJnZVJlc3VsdD47XG4gIG1lcmdlKFxuICAgIG1lcmdlUmVxdWVzdDogUGFydGlhbDxNZXJnZVJlcXVlc3Q+IHwgQXJyYXk8UGFydGlhbDxNZXJnZVJlcXVlc3Q+PixcbiAgKTogUHJvbWlzZTxNZXJnZVJlc3VsdCB8IE1lcmdlUmVzdWx0W10+O1xuICBhc3luYyBtZXJnZShcbiAgICBtZXJnZVJlcXVlc3RzOiBQYXJ0aWFsPE1lcmdlUmVxdWVzdD4gfCBBcnJheTxQYXJ0aWFsPE1lcmdlUmVxdWVzdD4+LFxuICApIHtcbiAgICBjb25zdCBzY2hlbWEgPSBBcnJheS5pc0FycmF5KG1lcmdlUmVxdWVzdHMpXG4gICAgICA/IFtBcGlTY2hlbWFzLk1lcmdlUmVzdWx0XVxuICAgICAgOiBBcGlTY2hlbWFzLk1lcmdlUmVzdWx0O1xuICAgIHJldHVybiB0aGlzLl9pbnZva2UoJ21lcmdlJywgeyBtZXJnZVJlcXVlc3RzIH0sIHNjaGVtYSk7XG4gIH1cblxuICAvKipcbiAgICogRGVsZXRlIHJlY29yZHMgZnJvbSB0aGUgcmVjeWNsZSBiaW4gaW1tZWRpYXRlbHlcbiAgICovXG4gIGFzeW5jIGVtcHR5UmVjeWNsZUJpbihpZHM6IHN0cmluZ1tdKTogUHJvbWlzZTxFbXB0eVJlY3ljbGVCaW5SZXN1bHQ+IHtcbiAgICByZXR1cm4gdGhpcy5faW52b2tlKCdlbXB0eVJlY3ljbGVCaW4nLCB7IGlkcyB9LCBbXG4gICAgICBBcGlTY2hlbWFzLkVtcHR5UmVjeWNsZUJpblJlc3VsdCxcbiAgICBdKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGluZm9ybWF0aW9uIGFib3V0IHRoZSBzdGFuZGFyZCBhbmQgY3VzdG9tIGFwcHMgYXZhaWxhYmxlIHRvIHRoZSBsb2dnZWQtaW4gdXNlclxuICAgKi9cbiAgYXN5bmMgZGVzY3JpYmVUYWJzKCk6IFByb21pc2U8RGVzY3JpYmVUYWJTZXRSZXN1bHRbXT4ge1xuICAgIHJldHVybiB0aGlzLl9pbnZva2UoJ2Rlc2NyaWJlVGFicycsIHt9LCBbQXBpU2NoZW1hcy5EZXNjcmliZVRhYlNldFJlc3VsdF0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHJpZXZlcyB0aGUgY3VycmVudCBzeXN0ZW0gdGltZXN0YW1wIChDb29yZGluYXRlZCBVbml2ZXJzYWwgVGltZSAoVVRDKSB0aW1lIHpvbmUpIGZyb20gdGhlIEFQSVxuICAgKi9cbiAgYXN5bmMgZ2V0U2VydmVyVGltZXN0YW1wKCk6IFByb21pc2U8R2V0U2VydmVyVGltZXN0YW1wUmVzdWx0PiB7XG4gICAgcmV0dXJuIHRoaXMuX2ludm9rZShcbiAgICAgICdnZXRTZXJ2ZXJUaW1lc3RhbXAnLFxuICAgICAge30sXG4gICAgICBBcGlTY2hlbWFzLkdldFNlcnZlclRpbWVzdGFtcFJlc3VsdCxcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHJpZXZlcyBwZXJzb25hbCBpbmZvcm1hdGlvbiBmb3IgdGhlIHVzZXIgYXNzb2NpYXRlZCB3aXRoIHRoZSBjdXJyZW50IHNlc3Npb25cbiAgICovXG4gIGFzeW5jIGdldFVzZXJJbmZvKCk6IFByb21pc2U8R2V0VXNlckluZm9SZXN1bHQ+IHtcbiAgICByZXR1cm4gdGhpcy5faW52b2tlKCdnZXRVc2VySW5mbycsIHt9LCBBcGlTY2hlbWFzLkdldFVzZXJJbmZvUmVzdWx0KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIHRoZSBzcGVjaWZpZWQgdXNlcuKAmXMgcGFzc3dvcmQgdG8gdGhlIHNwZWNpZmllZCB2YWx1ZVxuICAgKi9cbiAgc2V0UGFzc3dvcmQodXNlcklkOiBzdHJpbmcsIHBhc3N3b3JkOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIHJldHVybiB0aGlzLl9pbnZva2UoJ3NldFBhc3N3b3JkJywgeyB1c2VySWQsIHBhc3N3b3JkIH0sICdzdHJpbmcnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNldHMgdGhlIHNwZWNpZmllZCB1c2Vy4oCZcyBwYXNzd29yZFxuICAgKi9cbiAgcmVzZXRQYXNzd29yZCh1c2VySWQ6IHN0cmluZyk6IFByb21pc2U8UmVzZXRQYXNzd29yZFJlc3VsdD4ge1xuICAgIHJldHVybiB0aGlzLl9pbnZva2UoXG4gICAgICAncmVzZXRQYXNzd29yZCcsXG4gICAgICB7IHVzZXJJZCB9LFxuICAgICAgQXBpU2NoZW1hcy5SZXNldFBhc3N3b3JkUmVzdWx0LFxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogQWRkcyBvbmUgb3IgbW9yZSBuZXcgcmVjb3JkcyB0byB5b3VyIG9yZ2FuaXphdGlvbuKAmXMgZGF0YVxuICAgKi9cbiAgY3JlYXRlKHNPYmplY3Q6IFJlY29yZFtdKTogUHJvbWlzZTxTYXZlUmVzdWx0W10+O1xuICBjcmVhdGUoc09iamVjdDogUmVjb3JkKTogUHJvbWlzZTxTYXZlUmVzdWx0PjtcbiAgY3JlYXRlKHNPYmplY3RzOiBSZWNvcmQgfCBSZWNvcmRbXSk6IFByb21pc2U8U2F2ZVJlc3VsdCB8IFNhdmVSZXN1bHRbXT47XG4gIGNyZWF0ZShzT2JqZWN0czogUmVjb3JkIHwgUmVjb3JkW10pIHtcbiAgICBjb25zdCBzY2hlbWEgPSBBcnJheS5pc0FycmF5KHNPYmplY3RzKVxuICAgICAgPyBbQXBpU2NoZW1hcy5TYXZlUmVzdWx0XVxuICAgICAgOiBBcGlTY2hlbWFzLlNhdmVSZXN1bHQ7XG4gICAgY29uc3QgYXJncyA9IHtcbiAgICAgICdAeG1sbnMnOiAndXJuOnBhcnRuZXIuc29hcC5zZm9yY2UuY29tJyxcbiAgICAgICdAeG1sbnM6bnMxJzogJ3NvYmplY3QucGFydG5lci5zb2FwLnNmb3JjZS5jb20nLFxuICAgICAgJ25zMTpzT2JqZWN0cyc6IHRvU29hcFJlY29yZChzT2JqZWN0cyksXG4gICAgfTtcbiAgICByZXR1cm4gdGhpcy5faW52b2tlKCdjcmVhdGUnLCBhcmdzLCBzY2hlbWEpO1xuICB9XG5cbiAgLyoqXG4gICAqIFVwZGF0ZXMgb25lIG9yIG1vcmUgZXhpc3RpbmcgcmVjb3JkcyBpbiB5b3VyIG9yZ2FuaXphdGlvbuKAmXMgZGF0YS5cbiAgICovXG4gIHVwZGF0ZShzT2JqZWN0OiBSZWNvcmRbXSk6IFByb21pc2U8U2F2ZVJlc3VsdFtdPjtcbiAgdXBkYXRlKHNPYmplY3Q6IFJlY29yZCk6IFByb21pc2U8U2F2ZVJlc3VsdD47XG4gIHVwZGF0ZShzT2JqZWN0czogUmVjb3JkIHwgUmVjb3JkW10pOiBQcm9taXNlPFNhdmVSZXN1bHQgfCBTYXZlUmVzdWx0W10+O1xuICB1cGRhdGUoc09iamVjdHM6IFJlY29yZCB8IFJlY29yZFtdKSB7XG4gICAgY29uc3Qgc2NoZW1hID0gQXJyYXkuaXNBcnJheShzT2JqZWN0cylcbiAgICAgID8gW0FwaVNjaGVtYXMuU2F2ZVJlc3VsdF1cbiAgICAgIDogQXBpU2NoZW1hcy5TYXZlUmVzdWx0O1xuICAgIGNvbnN0IGFyZ3MgPSB7XG4gICAgICAnQHhtbG5zJzogJ3VybjpwYXJ0bmVyLnNvYXAuc2ZvcmNlLmNvbScsXG4gICAgICAnQHhtbG5zOm5zMSc6ICdzb2JqZWN0LnBhcnRuZXIuc29hcC5zZm9yY2UuY29tJyxcbiAgICAgICduczE6c09iamVjdHMnOiB0b1NvYXBSZWNvcmQoc09iamVjdHMpLFxuICAgIH07XG4gICAgcmV0dXJuIHRoaXMuX2ludm9rZSgndXBkYXRlJywgYXJncywgc2NoZW1hKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIG5ldyByZWNvcmRzIGFuZCB1cGRhdGVzIGV4aXN0aW5nIHJlY29yZHMgaW4geW91ciBvcmdhbml6YXRpb27igJlzIGRhdGEuXG4gICAqL1xuICB1cHNlcnQoXG4gICAgZXh0ZXJuYWxJZEZpZWxkTmFtZTogc3RyaW5nLFxuICAgIHNPYmplY3RzOiBSZWNvcmRbXSxcbiAgKTogUHJvbWlzZTxVcHNlcnRSZXN1bHRbXT47XG4gIHVwc2VydChleHRlcm5hbElkRmllbGROYW1lOiBzdHJpbmcsIHNPYmplY3Q6IFJlY29yZCk6IFByb21pc2U8VXBzZXJ0UmVzdWx0PjtcbiAgdXBzZXJ0KFxuICAgIGV4dGVybmFsSWRGaWVsZE5hbWU6IHN0cmluZyxcbiAgICBzT2JqZWN0czogUmVjb3JkIHwgUmVjb3JkW10sXG4gICk6IFByb21pc2U8VXBzZXJ0UmVzdWx0IHwgVXBzZXJ0UmVzdWx0W10+O1xuICB1cHNlcnQoZXh0ZXJuYWxJZEZpZWxkTmFtZTogc3RyaW5nLCBzT2JqZWN0czogUmVjb3JkIHwgUmVjb3JkW10pIHtcbiAgICBjb25zdCBzY2hlbWEgPSBBcnJheS5pc0FycmF5KHNPYmplY3RzKVxuICAgICAgPyBbQXBpU2NoZW1hcy5VcHNlcnRSZXN1bHRdXG4gICAgICA6IEFwaVNjaGVtYXMuVXBzZXJ0UmVzdWx0O1xuICAgIGNvbnN0IGFyZ3MgPSB7XG4gICAgICAnQHhtbG5zJzogJ3VybjpwYXJ0bmVyLnNvYXAuc2ZvcmNlLmNvbScsXG4gICAgICAnQHhtbG5zOm5zMSc6ICdzb2JqZWN0LnBhcnRuZXIuc29hcC5zZm9yY2UuY29tJyxcbiAgICAgICduczE6ZXh0ZXJuYWxJREZpZWxkTmFtZSc6IGV4dGVybmFsSWRGaWVsZE5hbWUsXG4gICAgICAnbnMxOnNPYmplY3RzJzogdG9Tb2FwUmVjb3JkKHNPYmplY3RzKSxcbiAgICB9O1xuICAgIHJldHVybiB0aGlzLl9pbnZva2UoJ3Vwc2VydCcsIGFyZ3MsIHNjaGVtYSk7XG4gIH1cblxuICAvKipcbiAgICogRGVsZXRlcyBvbmUgb3IgbW9yZSByZWNvcmRzIGZyb20geW91ciBvcmdhbml6YXRpb27igJlzIGRhdGFcbiAgICovXG4gIGRlbGV0ZShpZHM6IHN0cmluZyB8IHN0cmluZ1tdKTogUHJvbWlzZTxEZWxldGVSZXN1bHRbXT47XG4gIGRlbGV0ZShpZDogc3RyaW5nKTogUHJvbWlzZTxEZWxldGVSZXN1bHQ+O1xuICBkZWxldGUoaWRzOiBzdHJpbmcgfCBzdHJpbmdbXSk6IFByb21pc2U8RGVsZXRlUmVzdWx0IHwgRGVsZXRlUmVzdWx0W10+O1xuICBkZWxldGUoaWRzOiBzdHJpbmcgfCBzdHJpbmdbXSkge1xuICAgIGNvbnN0IHNjaGVtYSA9IEFycmF5LmlzQXJyYXkoaWRzKVxuICAgICAgPyBbQXBpU2NoZW1hcy5EZWxldGVSZXN1bHRdXG4gICAgICA6IEFwaVNjaGVtYXMuRGVsZXRlUmVzdWx0O1xuICAgIGNvbnN0IGFyZ3MgPSB7XG4gICAgICAnQHhtbG5zJzogJ3VybjpwYXJ0bmVyLnNvYXAuc2ZvcmNlLmNvbScsXG4gICAgICAnQHhtbG5zOm5zMSc6ICdzb2JqZWN0LnBhcnRuZXIuc29hcC5zZm9yY2UuY29tJyxcbiAgICAgICduczE6aWRzJzogaWRzLFxuICAgIH07XG4gICAgcmV0dXJuIHRoaXMuX2ludm9rZSgnZGVsZXRlJywgYXJncywgc2NoZW1hKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBVbmRlbGV0ZSByZWNvcmRzIGZyb20gdGhlIHJlY3ljbGUgYmluIGltbWVkaWF0ZWx5XG4gICAqL1xuICB1bmRlbGV0ZShpZHM6IHN0cmluZ1tdKTogUHJvbWlzZTxVbmRlbGV0ZVJlc3VsdFtdPiB7XG4gICAgY29uc3Qgc2NoZW1hID0gW0FwaVNjaGVtYXMuVW5kZWxldGVSZXN1bHRdO1xuICAgIGNvbnN0IGFyZ3MgPSB7XG4gICAgICAnQHhtbG5zJzogJ3VybjpwYXJ0bmVyLnNvYXAuc2ZvcmNlLmNvbScsXG4gICAgICAnQHhtbG5zOm5zMSc6ICdzb2JqZWN0LnBhcnRuZXIuc29hcC5zZm9yY2UuY29tJyxcbiAgICAgICduczE6aWRzJzogaWRzLFxuICAgIH07XG4gICAgcmV0dXJuIHRoaXMuX2ludm9rZSgndW5kZWxldGUnLCBhcmdzLCBzY2hlbWEpO1xuICB9XG59XG5cbi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL1xuLypcbiAqIFJlZ2lzdGVyIGhvb2sgaW4gY29ubmVjdGlvbiBpbnN0YW50aWF0aW9uIGZvciBkeW5hbWljYWxseSBhZGRpbmcgdGhpcyBBUEkgbW9kdWxlIGZlYXR1cmVzXG4gKi9cbnJlZ2lzdGVyTW9kdWxlKCdzb2FwJywgKGNvbm4pID0+IG5ldyBTb2FwQXBpKGNvbm4pKTtcblxuZXhwb3J0IGRlZmF1bHQgU29hcEFwaTtcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBU0EsY0FBYyxRQUFRLFlBQVk7QUFFM0MsT0FBT0MsSUFBSSxNQUFNLFNBQVM7QUFFMUIsU0FDRUMsVUFBVSxRQWNMLGVBQWU7O0FBRXRCO0FBQ0E7QUFDQTtBQUNBLFNBQVNDLFlBQVlBLENBQUNDLE9BQTBCLEVBQXFCO0VBQUEsSUFBQUMsUUFBQTtFQUNuRSxPQUFPQyxvQkFBQSxDQUFBRCxRQUFBLEdBQUNFLGNBQUEsQ0FBY0gsT0FBTyxDQUFDLEdBQUdBLE9BQU8sR0FBRyxDQUFDQSxPQUFPLENBQUMsRUFBQUksSUFBQSxDQUFBSCxRQUFBLEVBQU0sVUFBQ0ksTUFBTSxFQUFLO0lBQUEsSUFBQUMsU0FBQTtJQUNwRSxJQUFRQyxJQUFJLEdBQXlCRixNQUFNLENBQW5DRSxJQUFJO01BQUVDLFVBQVUsR0FBYUgsTUFBTSxDQUE3QkcsVUFBVTtNQUFLQyxHQUFHLEdBQUFDLHdCQUFBLENBQUtMLE1BQU0sRUFBQU0sU0FBQTtJQUMzQyxJQUFNQyxDQUFDLEdBQUdMLElBQUksS0FBSUMsVUFBVSxhQUFWQSxVQUFVLHVCQUFWQSxVQUFVLENBQUVELElBQUk7SUFDbEMsSUFBSSxDQUFDSyxDQUFDLEVBQUU7TUFDTixNQUFNLElBQUlDLEtBQUssQ0FBQyx3REFBd0QsQ0FBQztJQUMzRTtJQUNBLElBQU1DLFlBQVksR0FBR0MsdUJBQUEsQ0FBQVQsU0FBQSxHQUFBVSxZQUFBLENBQVlQLEdBQUcsQ0FBQyxFQUFBTCxJQUFBLENBQUFFLFNBQUEsRUFDbkMsVUFBQ1csS0FBSztNQUFBLE9BQUtaLE1BQU0sQ0FBQ1ksS0FBSyxDQUFDLEtBQUssSUFBSTtJQUFBLENBQ25DLENBQUM7SUFBQyxJQUFBQyxTQUFBLEdBQUFDLDBCQUFBLENBQ2tCTCxZQUFZO01BQUFN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