jsforce
Version:
Salesforce API Library for JavaScript
386 lines (385 loc) • 38.3 kB
JavaScript
import _toConsumableArray from "@babel/runtime-corejs3/helpers/toConsumableArray";
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 _regeneratorRuntime from "@babel/runtime-corejs3/regenerator";
import "core-js/modules/es.error.cause.js";
import "core-js/modules/es.array.join.js";
import "core-js/modules/es.function.name.js";
import "core-js/modules/es.object.keys.js";
import "core-js/modules/es.object.to-string.js";
import "core-js/modules/es.regexp.to-string.js";
import _concatInstanceProperty from "@babel/runtime-corejs3/core-js-stable/instance/concat";
import _mapInstanceProperty from "@babel/runtime-corejs3/core-js-stable/instance/map";
import _Object$keys from "@babel/runtime-corejs3/core-js-stable/object/keys";
import _Promise from "@babel/runtime-corejs3/core-js-stable/promise";
import _filterInstanceProperty from "@babel/runtime-corejs3/core-js-stable/instance/filter";
import { exec } from 'child_process';
import { stripVTControlCharacters } from 'util';
import Connection from '../connection';
function isNotNullOrUndefined(v) {
return v != null;
}
/**
*
*/
export var SfdxRegistry = /*#__PURE__*/function () {
function SfdxRegistry(_ref) {
var cliPath = _ref.cliPath;
_classCallCheck(this, SfdxRegistry);
_defineProperty(this, "_orgInfoMap", {});
this._cliPath = cliPath;
}
return _createClass(SfdxRegistry, [{
key: "_createCommand",
value: function _createCommand(command) {
var _context, _context2, _context3, _context4;
var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
var args = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : [];
return _concatInstanceProperty(_context = _concatInstanceProperty(_context2 = _concatInstanceProperty(_context3 = "".concat(this._cliPath ? this._cliPath + '/' : '', "sfdx ")).call(_context3, command, " ")).call(_context2, _mapInstanceProperty(_context4 = _Object$keys(options)).call(_context4, function (option) {
var _context5, _context6;
return _concatInstanceProperty(_context5 = _concatInstanceProperty(_context6 = "".concat(option.length > 1 ? '--' : '-')).call(_context6, option)).call(_context5, options[option] != null ? ' ' + options[option] : '');
}).join(' '), " --json ")).call(_context, args.join(' '));
}
}, {
key: "_execCommand",
value: function () {
var _execCommand2 = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee(command) {
var options,
args,
cmd,
buf,
body,
ret,
err,
_args = arguments;
return _regeneratorRuntime.wrap(function _callee$(_context7) {
while (1) switch (_context7.prev = _context7.next) {
case 0:
options = _args.length > 1 && _args[1] !== undefined ? _args[1] : {};
args = _args.length > 2 && _args[2] !== undefined ? _args[2] : [];
cmd = this._createCommand(command, options, args);
_context7.next = 5;
return new _Promise(function (resolve, reject) {
exec(cmd, function (err, ret) {
if (err && !ret) {
reject(err);
} else {
resolve(ret);
}
});
});
case 5:
buf = _context7.sent;
body = stripVTControlCharacters(buf.toString());
_context7.prev = 7;
ret = JSON.parse(body);
_context7.next = 14;
break;
case 11:
_context7.prev = 11;
_context7.t0 = _context7["catch"](7);
throw new Error("Unexpectedd output from Sfdx cli: ".concat(body));
case 14:
if (!(ret.status === 0 && ret.result)) {
_context7.next = 18;
break;
}
return _context7.abrupt("return", ret.result);
case 18:
err = new Error(ret.message);
err.name = ret.name;
throw err;
case 21:
case "end":
return _context7.stop();
}
}, _callee, this, [[7, 11]]);
}));
function _execCommand(_x) {
return _execCommand2.apply(this, arguments);
}
return _execCommand;
}()
}, {
key: "_getOrgList",
value: function () {
var _getOrgList2 = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee2() {
return _regeneratorRuntime.wrap(function _callee2$(_context8) {
while (1) switch (_context8.prev = _context8.next) {
case 0:
if (!this._orgList) {
this._orgList = this._execCommand('force:org:list');
}
return _context8.abrupt("return", this._orgList);
case 2:
case "end":
return _context8.stop();
}
}, _callee2, this);
}));
function _getOrgList() {
return _getOrgList2.apply(this, arguments);
}
return _getOrgList;
}()
}, {
key: "getConnectionNames",
value: function () {
var _getConnectionNames = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee3() {
var _context9, _context10, _context11;
var _yield$this$_getOrgLi, nonScratchOrgs, scratchOrgs;
return _regeneratorRuntime.wrap(function _callee3$(_context12) {
while (1) switch (_context12.prev = _context12.next) {
case 0:
_context12.next = 2;
return this._getOrgList();
case 2:
_yield$this$_getOrgLi = _context12.sent;
nonScratchOrgs = _yield$this$_getOrgLi.nonScratchOrgs;
scratchOrgs = _yield$this$_getOrgLi.scratchOrgs;
return _context12.abrupt("return", _concatInstanceProperty(_context9 = []).call(_context9, _toConsumableArray(_filterInstanceProperty(_context10 = _mapInstanceProperty(nonScratchOrgs).call(nonScratchOrgs, function (o) {
return o.alias;
})).call(_context10, isNotNullOrUndefined)), _toConsumableArray(_filterInstanceProperty(_context11 = _mapInstanceProperty(scratchOrgs).call(scratchOrgs, function (o) {
return o.alias;
})).call(_context11, isNotNullOrUndefined)), _toConsumableArray(_mapInstanceProperty(nonScratchOrgs).call(nonScratchOrgs, function (o) {
return o.username;
})), _toConsumableArray(_mapInstanceProperty(scratchOrgs).call(scratchOrgs, function (o) {
return o.username;
}))));
case 6:
case "end":
return _context12.stop();
}
}, _callee3, this);
}));
function getConnectionNames() {
return _getConnectionNames.apply(this, arguments);
}
return getConnectionNames;
}()
}, {
key: "getConnection",
value: function () {
var _getConnection = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee4(name) {
var config;
return _regeneratorRuntime.wrap(function _callee4$(_context13) {
while (1) switch (_context13.prev = _context13.next) {
case 0:
_context13.next = 2;
return this.getConnectionConfig(name);
case 2:
config = _context13.sent;
return _context13.abrupt("return", config ? new Connection(config) : null);
case 4:
case "end":
return _context13.stop();
}
}, _callee4, this);
}));
function getConnection(_x2) {
return _getConnection.apply(this, arguments);
}
return getConnection;
}()
}, {
key: "_getOrgInfo",
value: function () {
var _getOrgInfo2 = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee5(username) {
var options, pOrgInfo, orgInfo;
return _regeneratorRuntime.wrap(function _callee5$(_context14) {
while (1) switch (_context14.prev = _context14.next) {
case 0:
options = username ? {
u: username
} : {};
if (!username || !this._orgInfoMap[username]) {
pOrgInfo = this._execCommand('force:org:display', options);
this._memoOrgInfo(pOrgInfo, username);
}
orgInfo = username ? this._orgInfoMap[username] : this._defaultOrgInfo;
if (orgInfo) {
_context14.next = 5;
break;
}
throw new Error('no orginfo found');
case 5:
return _context14.abrupt("return", orgInfo);
case 6:
case "end":
return _context14.stop();
}
}, _callee5, this);
}));
function _getOrgInfo(_x3) {
return _getOrgInfo2.apply(this, arguments);
}
return _getOrgInfo;
}()
}, {
key: "_memoOrgInfo",
value: function _memoOrgInfo(pOrgInfo, username) {
var _this = this;
var pOrgInfo_ = pOrgInfo.then(function (orgInfo) {
_this._orgInfoMap[orgInfo.username] = pOrgInfo_;
if (orgInfo.alias) {
_this._orgInfoMap[orgInfo.alias] = pOrgInfo_;
}
return orgInfo;
});
if (username) {
this._orgInfoMap[username] = pOrgInfo_;
} else {
this._defaultOrgInfo = pOrgInfo_;
}
}
}, {
key: "getConnectionConfig",
value: function () {
var _getConnectionConfig = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee6(name) {
var orgInfo, accessToken, instanceUrl, loginUrl;
return _regeneratorRuntime.wrap(function _callee6$(_context15) {
while (1) switch (_context15.prev = _context15.next) {
case 0:
_context15.next = 2;
return this._getOrgInfo(name);
case 2:
orgInfo = _context15.sent;
if (orgInfo) {
_context15.next = 5;
break;
}
return _context15.abrupt("return", null);
case 5:
accessToken = orgInfo.accessToken, instanceUrl = orgInfo.instanceUrl, loginUrl = orgInfo.loginUrl;
return _context15.abrupt("return", {
accessToken: accessToken,
instanceUrl: instanceUrl,
loginUrl: loginUrl
});
case 7:
case "end":
return _context15.stop();
}
}, _callee6, this);
}));
function getConnectionConfig(_x4) {
return _getConnectionConfig.apply(this, arguments);
}
return getConnectionConfig;
}()
}, {
key: "saveConnectionConfig",
value: function () {
var _saveConnectionConfig = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee7(_name, _connConfig) {
return _regeneratorRuntime.wrap(function _callee7$(_context16) {
while (1) switch (_context16.prev = _context16.next) {
case 0:
case "end":
return _context16.stop();
}
}, _callee7);
}));
function saveConnectionConfig(_x5, _x6) {
return _saveConnectionConfig.apply(this, arguments);
}
return saveConnectionConfig;
}()
}, {
key: "setDefaultConnection",
value: function () {
var _setDefaultConnection = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee8(_name) {
return _regeneratorRuntime.wrap(function _callee8$(_context17) {
while (1) switch (_context17.prev = _context17.next) {
case 0:
case "end":
return _context17.stop();
}
}, _callee8);
}));
function setDefaultConnection(_x7) {
return _setDefaultConnection.apply(this, arguments);
}
return setDefaultConnection;
}()
}, {
key: "removeConnectionConfig",
value: function () {
var _removeConnectionConfig = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee9(name) {
return _regeneratorRuntime.wrap(function _callee9$(_context18) {
while (1) switch (_context18.prev = _context18.next) {
case 0:
_context18.next = 2;
return this._execCommand('force:org:delete', {
u: name
});
case 2:
case "end":
return _context18.stop();
}
}, _callee9, this);
}));
function removeConnectionConfig(_x8) {
return _removeConnectionConfig.apply(this, arguments);
}
return removeConnectionConfig;
}() // eslint-disable-next-line @typescript-eslint/require-await
}, {
key: "getClientConfig",
value: function () {
var _getClientConfig = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee10(_name) {
return _regeneratorRuntime.wrap(function _callee10$(_context19) {
while (1) switch (_context19.prev = _context19.next) {
case 0:
return _context19.abrupt("return", null);
case 1:
case "end":
return _context19.stop();
}
}, _callee10);
}));
function getClientConfig(_x9) {
return _getClientConfig.apply(this, arguments);
}
return getClientConfig;
}() // eslint-disable-next-line @typescript-eslint/require-await
}, {
key: "getClientNames",
value: function () {
var _getClientNames = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee11() {
return _regeneratorRuntime.wrap(function _callee11$(_context20) {
while (1) switch (_context20.prev = _context20.next) {
case 0:
return _context20.abrupt("return", []);
case 1:
case "end":
return _context20.stop();
}
}, _callee11);
}));
function getClientNames() {
return _getClientNames.apply(this, arguments);
}
return getClientNames;
}()
}, {
key: "registerClientConfig",
value: function () {
var _registerClientConfig = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee12(_name, _clientConfig) {
return _regeneratorRuntime.wrap(function _callee12$(_context21) {
while (1) switch (_context21.prev = _context21.next) {
case 0:
case "end":
return _context21.stop();
}
}, _callee12);
}));
function registerClientConfig(_x10, _x11) {
return _registerClientConfig.apply(this, arguments);
}
return registerClientConfig;
}()
}]);
}();
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJleGVjIiwic3RyaXBWVENvbnRyb2xDaGFyYWN0ZXJzIiwiQ29ubmVjdGlvbiIsImlzTm90TnVsbE9yVW5kZWZpbmVkIiwidiIsIlNmZHhSZWdpc3RyeSIsIl9yZWYiLCJjbGlQYXRoIiwiX2NsYXNzQ2FsbENoZWNrIiwiX2RlZmluZVByb3BlcnR5IiwiX2NsaVBhdGgiLCJfY3JlYXRlQ2xhc3MiLCJrZXkiLCJ2YWx1ZSIsIl9jcmVhdGVDb21tYW5kIiwiY29tbWFuZCIsIl9jb250ZXh0IiwiX2NvbnRleHQyIiwiX2NvbnRleHQzIiwiX2NvbnRleHQ0Iiwib3B0aW9ucyIsImFyZ3VtZW50cyIsImxlbmd0aCIsInVuZGVmaW5lZCIsImFyZ3MiLCJfY29uY2F0SW5zdGFuY2VQcm9wZXJ0eSIsImNvbmNhdCIsImNhbGwiLCJfbWFwSW5zdGFuY2VQcm9wZXJ0eSIsIl9PYmplY3Qka2V5cyIsIm9wdGlvbiIsIl9jb250ZXh0NSIsIl9jb250ZXh0NiIsImpvaW4iLCJfZXhlY0NvbW1hbmQyIiwiX2FzeW5jVG9HZW5lcmF0b3IiLCJfcmVnZW5lcmF0b3JSdW50aW1lIiwibWFyayIsIl9jYWxsZWUiLCJjbWQiLCJidWYiLCJib2R5IiwicmV0IiwiZXJyIiwiX2FyZ3MiLCJ3cmFwIiwiX2NhbGxlZSQiLCJfY29udGV4dDciLCJwcmV2IiwibmV4dCIsIl9Qcm9taXNlIiwicmVzb2x2ZSIsInJlamVjdCIsInNlbnQiLCJ0b1N0cmluZyIsIkpTT04iLCJwYXJzZSIsInQwIiwiRXJyb3IiLCJzdGF0dXMiLCJyZXN1bHQiLCJhYnJ1cHQiLCJtZXNzYWdlIiwibmFtZSIsInN0b3AiLCJfZXhlY0NvbW1hbmQiLCJfeCIsImFwcGx5IiwiX2dldE9yZ0xpc3QyIiwiX2NhbGxlZTIiLCJfY2FsbGVlMiQiLCJfY29udGV4dDgiLCJfb3JnTGlzdCIsIl9nZXRPcmdMaXN0IiwiX2dldENvbm5lY3Rpb25OYW1lcyIsIl9jYWxsZWUzIiwiX2NvbnRleHQ5IiwiX2NvbnRleHQxMCIsIl9jb250ZXh0MTEiLCJfeWllbGQkdGhpcyRfZ2V0T3JnTGkiLCJub25TY3JhdGNoT3JncyIsInNjcmF0Y2hPcmdzIiwiX2NhbGxlZTMkIiwiX2NvbnRleHQxMiIsIl90b0NvbnN1bWFibGVBcnJheSIsIl9maWx0ZXJJbnN0YW5jZVByb3BlcnR5IiwibyIsImFsaWFzIiwidXNlcm5hbWUiLCJnZXRDb25uZWN0aW9uTmFtZXMiLCJfZ2V0Q29ubmVjdGlvbiIsIl9jYWxsZWU0IiwiY29uZmlnIiwiX2NhbGxlZTQkIiwiX2NvbnRleHQxMyIsImdldENvbm5lY3Rpb25Db25maWciLCJnZXRDb25uZWN0aW9uIiwiX3gyIiwiX2dldE9yZ0luZm8yIiwiX2NhbGxlZTUiLCJwT3JnSW5mbyIsIm9yZ0luZm8iLCJfY2FsbGVlNSQiLCJfY29udGV4dDE0IiwidSIsIl9vcmdJbmZvTWFwIiwiX21lbW9PcmdJbmZvIiwiX2RlZmF1bHRPcmdJbmZvIiwiX2dldE9yZ0luZm8iLCJfeDMiLCJfdGhpcyIsInBPcmdJbmZvXyIsInRoZW4iLCJfZ2V0Q29ubmVjdGlvbkNvbmZpZyIsIl9jYWxsZWU2IiwiYWNjZXNzVG9rZW4iLCJpbnN0YW5jZVVybCIsImxvZ2luVXJsIiwiX2NhbGxlZTYkIiwiX2NvbnRleHQxNSIsIl94NCIsIl9zYXZlQ29ubmVjdGlvbkNvbmZpZyIsIl9jYWxsZWU3IiwiX25hbWUiLCJfY29ubkNvbmZpZyIsIl9jYWxsZWU3JCIsIl9jb250ZXh0MTYiLCJzYXZlQ29ubmVjdGlvbkNvbmZpZyIsIl94NSIsIl94NiIsIl9zZXREZWZhdWx0Q29ubmVjdGlvbiIsIl9jYWxsZWU4IiwiX2NhbGxlZTgkIiwiX2NvbnRleHQxNyIsInNldERlZmF1bHRDb25uZWN0aW9uIiwiX3g3IiwiX3JlbW92ZUNvbm5lY3Rpb25Db25maWciLCJfY2FsbGVlOSIsIl9jYWxsZWU5JCIsIl9jb250ZXh0MTgiLCJyZW1vdmVDb25uZWN0aW9uQ29uZmlnIiwiX3g4IiwiX2dldENsaWVudENvbmZpZyIsIl9jYWxsZWUxMCIsIl9jYWxsZWUxMCQiLCJfY29udGV4dDE5IiwiZ2V0Q2xpZW50Q29uZmlnIiwiX3g5IiwiX2dldENsaWVudE5hbWVzIiwiX2NhbGxlZTExIiwiX2NhbGxlZTExJCIsIl9jb250ZXh0MjAiLCJnZXRDbGllbnROYW1lcyIsIl9yZWdpc3RlckNsaWVudENvbmZpZyIsIl9jYWxsZWUxMiIsIl9jbGllbnRDb25maWciLCJfY2FsbGVlMTIkIiwiX2NvbnRleHQyMSIsInJlZ2lzdGVyQ2xpZW50Q29uZmlnIiwiX3gxMCIsIl94MTEiXSwic291cmNlcyI6WyIuLi8uLi9zcmMvcmVnaXN0cnkvc2ZkeC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBleGVjIH0gZnJvbSAnY2hpbGRfcHJvY2Vzcyc7XG5pbXBvcnQgeyBzdHJpcFZUQ29udHJvbENoYXJhY3RlcnMgfSBmcm9tICd1dGlsJztcbmltcG9ydCBDb25uZWN0aW9uIGZyb20gJy4uL2Nvbm5lY3Rpb24nO1xuaW1wb3J0IHsgUmVnaXN0cnksIENvbm5lY3Rpb25Db25maWcsIENsaWVudENvbmZpZyB9IGZyb20gJy4vdHlwZXMnO1xuaW1wb3J0IHsgU2NoZW1hIH0gZnJvbSAnLi4vdHlwZXMnO1xuXG50eXBlIFNmZHhDb21tYW5kT3V0cHV0ID0ge1xuICBzdGF0dXM6IG51bWJlcjtcbiAgbmFtZT86IHN0cmluZztcbiAgbWVzc2FnZT86IHN0cmluZztcbiAgcmVzdWx0PzogYW55O1xufTtcblxudHlwZSBTZmR4T3JnTGlzdCA9IHtcbiAgbm9uU2NyYXRjaE9yZ3M6IFNmZHhPcmdJbmZvW107XG4gIHNjcmF0Y2hPcmdzOiBTZmR4T3JnSW5mb1tdO1xufTtcblxudHlwZSBTZmR4T3JnSW5mbyA9IHtcbiAgb3JnSWQ6IHN0cmluZztcbiAgYWNjZXNzVG9rZW46IHN0cmluZztcbiAgaW5zdGFuY2VVcmw6IHN0cmluZztcbiAgbG9naW5Vcmw6IHN0cmluZztcbiAgdXNlcm5hbWU6IHN0cmluZztcbiAgY2xpZW50SWQ6IHN0cmluZztcbiAgaXNEZXZIdWI6IGJvb2xlYW47XG4gIGNvbm5lY3RlZFN0YXR1czogc3RyaW5nO1xuICBsYXN0VXNlZDogc3RyaW5nO1xuICBhbGlhcz86IHN0cmluZztcbn07XG5cbmZ1bmN0aW9uIGlzTm90TnVsbE9yVW5kZWZpbmVkPFQ+KHY6IFQgfCBudWxsIHwgdW5kZWZpbmVkKTogdiBpcyBUIHtcbiAgcmV0dXJuIHYgIT0gbnVsbDtcbn1cblxuLyoqXG4gKlxuICovXG5leHBvcnQgY2xhc3MgU2ZkeFJlZ2lzdHJ5IGltcGxlbWVudHMgUmVnaXN0cnkge1xuICBfY2xpUGF0aDogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICBfb3JnTGlzdDogUHJvbWlzZTxTZmR4T3JnTGlzdD4gfCB1bmRlZmluZWQ7XG4gIF9vcmdJbmZvTWFwOiB7IFtuYW1lOiBzdHJpbmddOiBQcm9taXNlPFNmZHhPcmdJbmZvPiB9ID0ge307XG4gIF9kZWZhdWx0T3JnSW5mbzogUHJvbWlzZTxTZmR4T3JnSW5mbz4gfCB1bmRlZmluZWQ7XG5cbiAgY29uc3RydWN0b3IoeyBjbGlQYXRoIH06IHsgY2xpUGF0aD86IHN0cmluZyB9KSB7XG4gICAgdGhpcy5fY2xpUGF0aCA9IGNsaVBhdGg7XG4gIH1cblxuICBfY3JlYXRlQ29tbWFuZChcbiAgICBjb21tYW5kOiBzdHJpbmcsXG4gICAgb3B0aW9uczogeyBbb3B0aW9uOiBzdHJpbmddOiBhbnkgfSA9IHt9LFxuICAgIGFyZ3M6IHN0cmluZ1tdID0gW10sXG4gICkge1xuICAgIHJldHVybiBgJHtcbiAgICAgIHRoaXMuX2NsaVBhdGggPyB0aGlzLl9jbGlQYXRoICsgJy8nIDogJydcbiAgICB9c2ZkeCAke2NvbW1hbmR9ICR7T2JqZWN0LmtleXMob3B0aW9ucylcbiAgICAgIC5tYXAoXG4gICAgICAgIChvcHRpb24pID0+XG4gICAgICAgICAgYCR7b3B0aW9uLmxlbmd0aCA+IDEgPyAnLS0nIDogJy0nfSR7b3B0aW9ufSR7XG4gICAgICAgICAgICBvcHRpb25zW29wdGlvbl0gIT0gbnVsbCA/ICcgJyArIG9wdGlvbnNbb3B0aW9uXSA6ICcnXG4gICAgICAgICAgfWAsXG4gICAgICApXG4gICAgICAuam9pbignICcpfSAtLWpzb24gJHthcmdzLmpvaW4oJyAnKX1gO1xuICB9XG5cbiAgYXN5bmMgX2V4ZWNDb21tYW5kPFQ+KFxuICAgIGNvbW1hbmQ6IHN0cmluZyxcbiAgICBvcHRpb25zOiB7IFtvcHRpb246IHN0cmluZ106IGFueSB9ID0ge30sXG4gICAgYXJnczogc3RyaW5nW10gPSBbXSxcbiAgKSB7XG4gICAgY29uc3QgY21kID0gdGhpcy5fY3JlYXRlQ29tbWFuZChjb21tYW5kLCBvcHRpb25zLCBhcmdzKTtcbiAgICBjb25zdCBidWYgPSBhd2FpdCBuZXcgUHJvbWlzZTxzdHJpbmc+KChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIGV4ZWMoY21kLCAoZXJyLCByZXQpID0+IHtcbiAgICAgICAgaWYgKGVyciAmJiAhcmV0KSB7XG4gICAgICAgICAgcmVqZWN0KGVycik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmVzb2x2ZShyZXQpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9KTtcbiAgICBjb25zdCBib2R5ID0gc3RyaXBWVENvbnRyb2xDaGFyYWN0ZXJzKGJ1Zi50b1N0cmluZygpKTtcbiAgICBsZXQgcmV0OiBTZmR4Q29tbWFuZE91dHB1dDtcbiAgICB0cnkge1xuICAgICAgcmV0ID0gSlNPTi5wYXJzZShib2R5KSBhcyBTZmR4Q29tbWFuZE91dHB1dDtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFVuZXhwZWN0ZWRkIG91dHB1dCBmcm9tIFNmZHggY2xpOiAke2JvZHl9YCk7XG4gICAgfVxuICAgIGlmIChyZXQuc3RhdHVzID09PSAwICYmIHJldC5yZXN1bHQpIHtcbiAgICAgIHJldHVybiByZXQucmVzdWx0IGFzIFQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGVyciA9IG5ldyBFcnJvcihyZXQubWVzc2FnZSBhcyBzdHJpbmcpO1xuICAgICAgZXJyLm5hbWUgPSByZXQubmFtZSBhcyBzdHJpbmc7XG4gICAgICB0aHJvdyBlcnI7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgX2dldE9yZ0xpc3QoKSB7XG4gICAgaWYgKCF0aGlzLl9vcmdMaXN0KSB7XG4gICAgICB0aGlzLl9vcmdMaXN0ID0gdGhpcy5fZXhlY0NvbW1hbmQ8U2ZkeE9yZ0xpc3Q+KCdmb3JjZTpvcmc6bGlzdCcpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fb3JnTGlzdDtcbiAgfVxuXG4gIGFzeW5jIGdldENvbm5lY3Rpb25OYW1lcygpIHtcbiAgICBjb25zdCB7IG5vblNjcmF0Y2hPcmdzLCBzY3JhdGNoT3JncyB9ID0gYXdhaXQgdGhpcy5fZ2V0T3JnTGlzdCgpO1xuICAgIHJldHVybiBbXG4gICAgICAuLi5ub25TY3JhdGNoT3Jncy5tYXAoKG8pID0+IG8uYWxpYXMpLmZpbHRlcihpc05vdE51bGxPclVuZGVmaW5lZCksXG4gICAgICAuLi5zY3JhdGNoT3Jncy5tYXAoKG8pID0+IG8uYWxpYXMpLmZpbHRlcihpc05vdE51bGxPclVuZGVmaW5lZCksXG4gICAgICAuLi5ub25TY3JhdGNoT3Jncy5tYXAoKG8pID0+IG8udXNlcm5hbWUpLFxuICAgICAgLi4uc2NyYXRjaE9yZ3MubWFwKChvKSA9PiBvLnVzZXJuYW1lKSxcbiAgICBdO1xuICB9XG5cbiAgYXN5bmMgZ2V0Q29ubmVjdGlvbjxTIGV4dGVuZHMgU2NoZW1hID0gU2NoZW1hPihuYW1lPzogc3RyaW5nKSB7XG4gICAgY29uc3QgY29uZmlnID0gYXdhaXQgdGhpcy5nZXRDb25uZWN0aW9uQ29uZmlnKG5hbWUpO1xuICAgIHJldHVybiBjb25maWcgPyBuZXcgQ29ubmVjdGlvbjxTPihjb25maWcpIDogbnVsbDtcbiAgfVxuXG4gIGFzeW5jIF9nZXRPcmdJbmZvKHVzZXJuYW1lPzogc3RyaW5nKSB7XG4gICAgY29uc3Qgb3B0aW9ucyA9IHVzZXJuYW1lID8geyB1OiB1c2VybmFtZSB9IDoge307XG4gICAgaWYgKCF1c2VybmFtZSB8fCAhdGhpcy5fb3JnSW5mb01hcFt1c2VybmFtZV0pIHtcbiAgICAgIGNvbnN0IHBPcmdJbmZvID0gdGhpcy5fZXhlY0NvbW1hbmQ8U2ZkeE9yZ0luZm8+KFxuICAgICAgICAnZm9yY2U6b3JnOmRpc3BsYXknLFxuICAgICAgICBvcHRpb25zLFxuICAgICAgKTtcbiAgICAgIHRoaXMuX21lbW9PcmdJbmZvKHBPcmdJbmZvLCB1c2VybmFtZSk7XG4gICAgfVxuICAgIGNvbnN0IG9yZ0luZm8gPSB1c2VybmFtZVxuICAgICAgPyB0aGlzLl9vcmdJbmZvTWFwW3VzZXJuYW1lXVxuICAgICAgOiB0aGlzLl9kZWZhdWx0T3JnSW5mbztcbiAgICBpZiAoIW9yZ0luZm8pIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignbm8gb3JnaW5mbyBmb3VuZCcpO1xuICAgIH1cbiAgICByZXR1cm4gb3JnSW5mbztcbiAgfVxuXG4gIF9tZW1vT3JnSW5mbyhwT3JnSW5mbzogUHJvbWlzZTxTZmR4T3JnSW5mbz4sIHVzZXJuYW1lPzogc3RyaW5nKSB7XG4gICAgY29uc3QgcE9yZ0luZm9fID0gcE9yZ0luZm8udGhlbigob3JnSW5mbykgPT4ge1xuICAgICAgdGhpcy5fb3JnSW5mb01hcFtvcmdJbmZvLnVzZXJuYW1lXSA9IHBPcmdJbmZvXztcbiAgICAgIGlmIChvcmdJbmZvLmFsaWFzKSB7XG4gICAgICAgIHRoaXMuX29yZ0luZm9NYXBbb3JnSW5mby5hbGlhc10gPSBwT3JnSW5mb187XG4gICAgICB9XG4gICAgICByZXR1cm4gb3JnSW5mbztcbiAgICB9KTtcbiAgICBpZiAodXNlcm5hbWUpIHtcbiAgICAgIHRoaXMuX29yZ0luZm9NYXBbdXNlcm5hbWVdID0gcE9yZ0luZm9fO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9kZWZhdWx0T3JnSW5mbyA9IHBPcmdJbmZvXztcbiAgICB9XG4gIH1cblxuICBhc3luYyBnZXRDb25uZWN0aW9uQ29uZmlnKG5hbWU/OiBzdHJpbmcpIHtcbiAgICBjb25zdCBvcmdJbmZvID0gYXdhaXQgdGhpcy5fZ2V0T3JnSW5mbyhuYW1lKTtcbiAgICBpZiAoIW9yZ0luZm8pIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICBjb25zdCB7IGFjY2Vzc1Rva2VuLCBpbnN0YW5jZVVybCwgbG9naW5VcmwgfSA9IG9yZ0luZm87XG4gICAgcmV0dXJuIHsgYWNjZXNzVG9rZW4sIGluc3RhbmNlVXJsLCBsb2dpblVybCB9O1xuICB9XG5cbiAgYXN5bmMgc2F2ZUNvbm5lY3Rpb25Db25maWcoX25hbWU6IHN0cmluZywgX2Nvbm5Db25maWc6IENvbm5lY3Rpb25Db25maWcpIHtcbiAgICAvLyBub3RoaW5nIHRvIGRvXG4gIH1cblxuICBhc3luYyBzZXREZWZhdWx0Q29ubmVjdGlvbihfbmFtZTogc3RyaW5nKSB7XG4gICAgLy8gbm90aGluZyB0byBkb1xuICB9XG5cbiAgYXN5bmMgcmVtb3ZlQ29ubmVjdGlvbkNvbmZpZyhuYW1lOiBzdHJpbmcpIHtcbiAgICBhd2FpdCB0aGlzLl9leGVjQ29tbWFuZCgnZm9yY2U6b3JnOmRlbGV0ZScsIHsgdTogbmFtZSB9KTtcbiAgfVxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L3JlcXVpcmUtYXdhaXRcbiAgYXN5bmMgZ2V0Q2xpZW50Q29uZmlnKF9uYW1lOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvcmVxdWlyZS1hd2FpdFxuICBhc3luYyBnZXRDbGllbnROYW1lcygpIHtcbiAgICByZXR1cm4gW107XG4gIH1cblxuICBhc3luYyByZWdpc3RlckNsaWVudENvbmZpZyhfbmFtZTogc3RyaW5nLCBfY2xpZW50Q29uZmlnOiBDbGllbnRDb25maWcpIHtcbiAgICAvLyBub3RoaW5nIHRvIGRvXG4gIH1cbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSxTQUFTQSxJQUFJLFFB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QSxVQUFBLENBQUFqRyxJQUFBLEdBQUFpRyxVQUFBLENBQUFoRyxJQUFBO1lBQUE7Y0FBQSxPQUFBZ0csVUFBQSxDQUFBcEYsTUFBQSxXQUMxQixJQUFJO1lBQUE7WUFBQTtjQUFBLE9BQUFvRixVQUFBLENBQUFqRixJQUFBO1VBQUE7UUFBQSxHQUFBK0UsU0FBQTtNQUFBLENBQ1o7TUFBQSxTQUZLRyxlQUFlQSxDQUFBQyxHQUFBO1FBQUEsT0FBQUwsZ0JBQUEsQ0FBQTNFLEtBQUEsT0FBQTlDLFNBQUE7TUFBQTtNQUFBLE9BQWY2SCxlQUFlO0lBQUEsSUFJckI7RUFBQTtJQUFBdEksR0FBQTtJQUFBQyxLQUFBO01BQUEsSUFBQXVJLGVBQUEsR0FBQWpILGlCQUFBLGNBQUFDLG1CQUFBLENBQUFDLElBQUEsQ0FDQSxTQUFBZ0gsVUFBQTtRQUFBLE9BQUFqSCxtQkFBQSxDQUFBUyxJQUFBLFVBQUF5RyxXQUFBQyxVQUFBO1VBQUEsa0JBQUFBLFVBQUEsQ0FBQXZHLElBQUEsR0FBQXVHLFVBQUEsQ0FBQXRHLElBQUE7WUFBQTtjQUFBLE9BQUFzRyxVQUFBLENBQUExRixNQUFBLFdBQ1MsRUFBRTtZQUFBO1lBQUE7Y0FBQSxPQUFBMEYsVUFBQSxDQUFBdkYsSUFBQTtVQUFBO1FBQUEsR0FBQXFGLFNBQUE7TUFBQSxDQUNWO01BQUEsU0FGS0csY0FBY0EsQ0FBQTtRQUFBLE9BQUFKLGVBQUEsQ0FBQWpGLEtBQUEsT0FBQTlDLFNBQUE7TUFBQTtNQUFBLE9BQWRtSSxjQUFjO0lBQUE7RUFBQTtJQUFBNUksR0FBQTtJQUFBQyxLQUFBO01BQUEsSUFBQTRJLHFCQUFBLEdBQUF0SCxpQkFBQSxjQUFBQyxtQkFBQSxDQUFBQyxJQUFBLENBSXBCLFNBQUFxSCxVQUEyQi9CLEtBQWEsRUFBRWdDLGFBQTJCO1FBQUEsT0FBQXZILG1CQUFBLENBQUFTLElBQUEsVUFBQStHLFdBQUFDLFVBQUE7VUFBQSxrQkFBQUEsVUFBQSxDQUFBN0csSUFBQSxHQUFBNkcsVUFBQSxDQUFBNUcsSUFBQTtZQUFBO1lBQUE7Y0FBQSxPQUFBNEcsVUFBQSxDQUFBN0YsSUFBQTtVQUFBO1FBQUEsR0FBQTBGLFNBQUE7TUFBQSxDQUVwRTtNQUFBLFNBRktJLG9CQUFvQkEsQ0FBQUMsSUFBQSxFQUFBQyxJQUFBO1FBQUEsT0FBQVAscUJBQUEsQ0FBQXRGLEtBQUEsT0FBQTlDLFNBQUE7TUFBQTtNQUFBLE9BQXBCeUksb0JBQW9CO0lBQUE7RUFBQTtBQUFBIiwiaWdub3JlTGlzdCI6W119