jsforce
Version:
Salesforce API Library for JavaScript
388 lines (383 loc) • 43.2 kB
JavaScript
import _Object$keys from "@babel/runtime-corejs3/core-js-stable/object/keys";
import _Object$getOwnPropertySymbols from "@babel/runtime-corejs3/core-js-stable/object/get-own-property-symbols";
import _filterInstanceProperty from "@babel/runtime-corejs3/core-js-stable/instance/filter";
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";
import _Reflect$construct from "@babel/runtime-corejs3/core-js-stable/reflect/construct";
import _possibleConstructorReturn from "@babel/runtime-corejs3/helpers/possibleConstructorReturn";
import _getPrototypeOf from "@babel/runtime-corejs3/helpers/getPrototypeOf";
import _inherits from "@babel/runtime-corejs3/helpers/inherits";
import _wrapNativeSuper from "@babel/runtime-corejs3/helpers/wrapNativeSuper";
import _asyncToGenerator from "@babel/runtime-corejs3/helpers/asyncToGenerator";
import _defineProperty from "@babel/runtime-corejs3/helpers/defineProperty";
import _classCallCheck from "@babel/runtime-corejs3/helpers/classCallCheck";
import _createClass from "@babel/runtime-corejs3/helpers/createClass";
function _callSuper(t, o, e) { return o = _getPrototypeOf(o), _possibleConstructorReturn(t, _isNativeReflectConstruct() ? _Reflect$construct(o, e || [], _getPrototypeOf(t).constructor) : o.apply(t, e)); }
function _isNativeReflectConstruct() { try { var t = !Boolean.prototype.valueOf.call(_Reflect$construct(Boolean, [], function () {})); } catch (t) {} return (_isNativeReflectConstruct = function _isNativeReflectConstruct() { return !!t; })(); }
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; }
import _sliceInstanceProperty from "@babel/runtime-corejs3/core-js-stable/instance/slice";
import _endsWithInstanceProperty from "@babel/runtime-corejs3/core-js-stable/instance/ends-with";
import _concatInstanceProperty from "@babel/runtime-corejs3/core-js-stable/instance/concat";
import _includesInstanceProperty from "@babel/runtime-corejs3/core-js-stable/instance/includes";
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.array.push.js";
import "core-js/modules/es.object.to-string.js";
import "core-js/modules/es.regexp.exec.js";
import "core-js/modules/es.regexp.to-string.js";
import "core-js/modules/es.string.replace.js";
/**
*
*/
import { createHash, randomBytes } from 'crypto';
import querystring from 'querystring';
import Transport, { HttpProxyTransport, XdProxyTransport } from './transport';
var defaultOAuth2Config = {
loginUrl: 'https://login.salesforce.com'
};
// Makes a nodejs base64 encoded string compatible with rfc4648 alternative encoding for urls.
// @param base64Encoded a nodejs base64 encoded string
function base64UrlEscape(base64Encoded) {
// builtin node js base 64 encoding is not 64 url compatible.
// See https://toolsn.ietf.org/html/rfc4648#section-5
return base64Encoded.replace(/\+/g, '-').replace(/\//g, '_').replace(/=/g, '');
}
/**
* type defs
*/
/**
* OAuth2 class
*/
export var OAuth2 = /*#__PURE__*/function () {
/**
*
*/
function OAuth2(config) {
_classCallCheck(this, OAuth2);
var loginUrl = config.loginUrl,
authzServiceUrl = config.authzServiceUrl,
tokenServiceUrl = config.tokenServiceUrl,
revokeServiceUrl = config.revokeServiceUrl,
clientId = config.clientId,
clientSecret = config.clientSecret,
redirectUri = config.redirectUri,
proxyUrl = config.proxyUrl,
httpProxy = config.httpProxy,
useVerifier = config.useVerifier;
if (authzServiceUrl && tokenServiceUrl) {
var _context;
this.loginUrl = _sliceInstanceProperty(_context = authzServiceUrl.split('/')).call(_context, 0, 3).join('/');
this.authzServiceUrl = authzServiceUrl;
this.tokenServiceUrl = tokenServiceUrl;
this.revokeServiceUrl = revokeServiceUrl || "".concat(this.loginUrl, "/services/oauth2/revoke");
} else {
var _context2, _context3, _context4, _context5;
this.loginUrl = loginUrl !== null && loginUrl !== void 0 ? loginUrl : defaultOAuth2Config.loginUrl;
var maybeSlash = _endsWithInstanceProperty(_context2 = this.loginUrl).call(_context2, '/') ? '' : '/';
this.authzServiceUrl = _concatInstanceProperty(_context3 = "".concat(this.loginUrl)).call(_context3, maybeSlash, "services/oauth2/authorize");
this.tokenServiceUrl = _concatInstanceProperty(_context4 = "".concat(this.loginUrl)).call(_context4, maybeSlash, "services/oauth2/token");
this.revokeServiceUrl = _concatInstanceProperty(_context5 = "".concat(this.loginUrl)).call(_context5, maybeSlash, "services/oauth2/revoke");
}
this.clientId = clientId;
this.clientSecret = clientSecret;
this.redirectUri = redirectUri;
if (proxyUrl) {
this._transport = new XdProxyTransport(proxyUrl);
} else if (httpProxy) {
this._transport = new HttpProxyTransport(httpProxy);
} else {
this._transport = new Transport();
}
if (useVerifier) {
// Set a code verifier string for OAuth authorization
this.codeVerifier = base64UrlEscape(randomBytes(Math.ceil(128)).toString('base64'));
}
}
/**
* Get Salesforce OAuth2 authorization page URL to redirect user agent.
*/
return _createClass(OAuth2, [{
key: "getAuthorizationUrl",
value: function getAuthorizationUrl() {
var _context6;
var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
if (this.codeVerifier) {
// code verifier must be a base 64 url encoded hash of 128 bytes of random data. Our random data is also
// base 64 url encoded. See Connection.create();
params.code_challenge = base64UrlEscape(createHash('sha256').update(this.codeVerifier).digest('base64'));
}
var _params = _objectSpread(_objectSpread({}, params), {}, {
response_type: 'code',
client_id: this.clientId,
redirect_uri: this.redirectUri
});
return this.authzServiceUrl + (_includesInstanceProperty(_context6 = this.authzServiceUrl).call(_context6, '?') ? '&' : '?') + querystring.stringify(_params);
}
/**
* OAuth2 Refresh Token Flow
*/
}, {
key: "refreshToken",
value: (function () {
var _refreshToken2 = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee(_refreshToken) {
var params, ret;
return _regeneratorRuntime.wrap(function _callee$(_context7) {
while (1) switch (_context7.prev = _context7.next) {
case 0:
if (this.clientId) {
_context7.next = 2;
break;
}
throw new Error('No OAuth2 client id information is specified');
case 2:
params = {
grant_type: 'refresh_token',
refresh_token: _refreshToken,
client_id: this.clientId
};
if (this.clientSecret) {
params.client_secret = this.clientSecret;
}
_context7.next = 6;
return this._postParams(params);
case 6:
ret = _context7.sent;
return _context7.abrupt("return", ret);
case 8:
case "end":
return _context7.stop();
}
}, _callee, this);
}));
function refreshToken(_x) {
return _refreshToken2.apply(this, arguments);
}
return refreshToken;
}()
/**
* Send access token request to the token endpoint.
* When a code (string) is passed in first argument, it will use Web Server Authentication Flow (Authorization Code Grant).
* Otherwise, it will use the specified `grant_type` and pass parameters to the endpoint.
*/
)
}, {
key: "requestToken",
value: (function () {
var _requestToken = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee2(codeOrParams) {
var params,
_params,
ret,
_args2 = arguments;
return _regeneratorRuntime.wrap(function _callee2$(_context8) {
while (1) switch (_context8.prev = _context8.next) {
case 0:
params = _args2.length > 1 && _args2[1] !== undefined ? _args2[1] : {};
if (!(typeof codeOrParams === 'string' && (!this.clientId || !this.redirectUri))) {
_context8.next = 3;
break;
}
throw new Error('No OAuth2 client id or redirect uri configuration is specified');
case 3:
_params = _objectSpread(_objectSpread({}, params), typeof codeOrParams === 'string' ? {
grant_type: 'authorization_code',
code: codeOrParams
} : codeOrParams);
if (this.clientId) {
_params.client_id = this.clientId;
}
if (this.clientSecret) {
_params.client_secret = this.clientSecret;
}
if (this.redirectUri) {
_params.redirect_uri = this.redirectUri;
}
_context8.next = 9;
return this._postParams(_params);
case 9:
ret = _context8.sent;
return _context8.abrupt("return", ret);
case 11:
case "end":
return _context8.stop();
}
}, _callee2, this);
}));
function requestToken(_x2) {
return _requestToken.apply(this, arguments);
}
return requestToken;
}()
/**
* OAuth2 Username-Password Flow (Resource Owner Password Credentials)
*/
)
}, {
key: "authenticate",
value: (function () {
var _authenticate = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee3(username, password) {
var ret;
return _regeneratorRuntime.wrap(function _callee3$(_context9) {
while (1) switch (_context9.prev = _context9.next) {
case 0:
if (!(!this.clientId || !this.clientSecret)) {
_context9.next = 2;
break;
}
throw new Error('No valid OAuth2 client configuration set');
case 2:
_context9.next = 4;
return this._postParams({
grant_type: 'password',
username: username,
password: password,
client_id: this.clientId,
client_secret: this.clientSecret
});
case 4:
ret = _context9.sent;
return _context9.abrupt("return", ret);
case 6:
case "end":
return _context9.stop();
}
}, _callee3, this);
}));
function authenticate(_x3, _x4) {
return _authenticate.apply(this, arguments);
}
return authenticate;
}()
/**
* OAuth2 Revoke Session Token
*/
)
}, {
key: "revokeToken",
value: (function () {
var _revokeToken = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee4(token) {
var response, res;
return _regeneratorRuntime.wrap(function _callee4$(_context10) {
while (1) switch (_context10.prev = _context10.next) {
case 0:
_context10.next = 2;
return this._transport.httpRequest({
method: 'POST',
url: this.revokeServiceUrl,
body: querystring.stringify({
token: token
}),
headers: {
'content-type': 'application/x-www-form-urlencoded'
}
});
case 2:
response = _context10.sent;
if (!(response.statusCode >= 400)) {
_context10.next = 7;
break;
}
res = querystring.parse(response.body);
if (!res || !res.error) {
res = {
error: "ERROR_HTTP_".concat(response.statusCode),
error_description: response.body
};
}
throw new (/*#__PURE__*/function (_Error) {
function _class(_ref) {
var _this;
var error = _ref.error,
error_description = _ref.error_description;
_classCallCheck(this, _class);
_this = _callSuper(this, _class, [error_description]);
_this.name = error;
return _this;
}
_inherits(_class, _Error);
return _createClass(_class);
}(/*#__PURE__*/_wrapNativeSuper(Error)))(res);
case 7:
case "end":
return _context10.stop();
}
}, _callee4, this);
}));
function revokeToken(_x5) {
return _revokeToken.apply(this, arguments);
}
return revokeToken;
}()
/**
* @private
*/
)
}, {
key: "_postParams",
value: (function () {
var _postParams2 = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee5(params) {
var response, res;
return _regeneratorRuntime.wrap(function _callee5$(_context11) {
while (1) switch (_context11.prev = _context11.next) {
case 0:
if (this.codeVerifier) params.code_verifier = this.codeVerifier;
_context11.next = 3;
return this._transport.httpRequest({
method: 'POST',
url: this.tokenServiceUrl,
body: querystring.stringify(params),
headers: {
'content-type': 'application/x-www-form-urlencoded'
}
});
case 3:
response = _context11.sent;
try {
res = JSON.parse(response.body);
} catch (e) {
/* eslint-disable no-empty */
}
if (!(response.statusCode >= 400)) {
_context11.next = 8;
break;
}
res = res || {
error: "ERROR_HTTP_".concat(response.statusCode),
error_description: response.body
};
throw new (/*#__PURE__*/function (_Error2) {
function _class2(_ref2) {
var _this2;
var error = _ref2.error,
error_description = _ref2.error_description;
_classCallCheck(this, _class2);
_this2 = _callSuper(this, _class2, [error_description]);
_this2.name = error;
return _this2;
}
_inherits(_class2, _Error2);
return _createClass(_class2);
}(/*#__PURE__*/_wrapNativeSuper(Error)))(res);
case 8:
return _context11.abrupt("return", res);
case 9:
case "end":
return _context11.stop();
}
}, _callee5, this);
}));
function _postParams(_x6) {
return _postParams2.apply(this, arguments);
}
return _postParams;
}())
}]);
}();
export default OAuth2;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJjcmVhdGVIYXNoIiwicmFuZG9tQnl0ZXMiLCJxdWVyeXN0cmluZyIsIlRyYW5zcG9ydCIsIkh0dHBQcm94eVRyYW5zcG9ydCIsIlhkUHJveHlUcmFuc3BvcnQiLCJkZWZhdWx0T0F1dGgyQ29uZmlnIiwibG9naW5VcmwiLCJiYXNlNjRVcmxFc2NhcGUiLCJiYXNlNjRFbmNvZGVkIiwicmVwbGFjZSIsIk9BdXRoMiIsImNvbmZpZyIsIl9jbGFzc0NhbGxDaGVjayIsImF1dGh6U2VydmljZVVybCIsInRva2VuU2VydmljZVVybCIsInJldm9rZVNlcnZpY2VVcmwiLCJjbGllbnRJZCIsImNsaWVudFNlY3JldCIsInJlZGlyZWN0VXJpIiwicHJveHlVcmwiLCJodHRwUHJveHkiLCJ1c2VWZXJpZmllciIsIl9jb250ZXh0IiwiX3NsaWNlSW5zdGFuY2VQcm9wZXJ0eSIsInNwbGl0IiwiY2FsbCIsImpvaW4iLCJjb25jYXQiLCJfY29udGV4dDIiLCJfY29udGV4dDMiLCJfY29udGV4dDQiLCJfY29udGV4dDUiLCJtYXliZVNsYXNoIiwiX2VuZHNXaXRoSW5zdGFuY2VQcm9wZXJ0eSIsIl9jb25jYXRJbnN0YW5jZVByb3BlcnR5IiwiX3RyYW5zcG9ydCIsImNvZGVWZXJpZmllciIsIk1hdGgiLCJjZWlsIiwidG9TdHJpbmciLCJfY3JlYXRlQ2xhc3MiLCJrZXkiLCJ2YWx1ZSIsImdldEF1dGhvcml6YXRpb25VcmwiLCJfY29udGV4dDYiLCJwYXJhbXMiLCJhcmd1bWVudHMiLCJsZW5ndGgiLCJ1bmRlZmluZWQiLCJjb2RlX2NoYWxsZW5nZSIsInVwZGF0ZSIsImRpZ2VzdCIsIl9wYXJhbXMiLCJfb2JqZWN0U3ByZWFkIiwicmVzcG9uc2VfdHlwZSIsImNsaWVudF9pZCIsInJlZGlyZWN0X3VyaSIsIl9pbmNsdWRlc0luc3RhbmNlUHJvcGVydHkiLCJzdHJpbmdpZnkiLCJfcmVmcmVzaFRva2VuMiIsIl9hc3luY1RvR2VuZXJhdG9yIiwiX3JlZ2VuZXJhdG9yUnVudGltZSIsIm1hcmsiLCJfY2FsbGVlIiwicmVmcmVzaFRva2VuIiwicmV0Iiwid3JhcCIsIl9jYWxsZWUkIiwiX2NvbnRleHQ3IiwicHJldiIsIm5leHQiLCJFcnJvciIsImdyYW50X3R5cGUiLCJyZWZyZXNoX3Rva2VuIiwiY2xpZW50X3NlY3JldCIsIl9wb3N0UGFyYW1zIiwic2VudCIsImFicnVwdCIsInN0b3AiLCJfeCIsImFwcGx5IiwiX3JlcXVlc3RUb2tlbiIsIl9jYWxsZWUyIiwiY29kZU9yUGFyYW1zIiwiX2FyZ3MyIiwiX2NhbGxlZTIkIiwiX2NvbnRleHQ4IiwiY29kZSIsInJlcXVlc3RUb2tlbiIsIl94MiIsIl9hdXRoZW50aWNhdGUiLCJfY2FsbGVlMyIsInVzZXJuYW1lIiwicGFzc3dvcmQiLCJfY2FsbGVlMyQiLCJfY29udGV4dDkiLCJhdXRoZW50aWNhdGUiLCJfeDMiLCJfeDQiLCJfcmV2b2tlVG9rZW4iLCJfY2FsbGVlNCIsInRva2VuIiwicmVzcG9uc2UiLCJyZXMiLCJfY2FsbGVlNCQiLCJfY29udGV4dDEwIiwiaHR0cFJlcXVlc3QiLCJtZXRob2QiLCJ1cmwiLCJib2R5IiwiaGVhZGVycyIsInN0YXR1c0NvZGUiLCJwYXJzZSIsImVycm9yIiwiZXJyb3JfZGVzY3JpcHRpb24iLCJfRXJyb3IiLCJfY2xhc3MiLCJfcmVmIiwiX3RoaXMiLCJfY2FsbFN1cGVyIiwibmFtZSIsIl9pbmhlcml0cyIsIl93cmFwTmF0aXZlU3VwZXIiLCJyZXZva2VUb2tlbiIsIl94NSIsIl9wb3N0UGFyYW1zMiIsIl9jYWxsZWU1IiwiX2NhbGxlZTUkIiwiX2NvbnRleHQxMSIsImNvZGVfdmVyaWZpZXIiLCJKU09OIiwiZSIsIl9FcnJvcjIiLCJfY2xhc3MyIiwiX3JlZjIiLCJfdGhpczIiLCJfeDYiXSwic291cmNlcyI6WyIuLi9zcmMvb2F1dGgyLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICpcbiAqL1xuaW1wb3J0IHtjcmVhdGVIYXNoLCByYW5kb21CeXRlc30gZnJvbSAnY3J5cHRvJztcbmltcG9ydCBxdWVyeXN0cmluZyBmcm9tICdxdWVyeXN0cmluZyc7XG5pbXBvcnQgVHJhbnNwb3J0LCB7SHR0cFByb3h5VHJhbnNwb3J0LCBYZFByb3h5VHJhbnNwb3J0fSBmcm9tICcuL3RyYW5zcG9ydCc7XG5pbXBvcnQge09wdGlvbmFsfSBmcm9tICcuL3R5cGVzJztcblxuY29uc3QgZGVmYXVsdE9BdXRoMkNvbmZpZyA9IHtcbiAgbG9naW5Vcmw6ICdodHRwczovL2xvZ2luLnNhbGVzZm9yY2UuY29tJyxcbn07XG5cbi8vIE1ha2VzIGEgbm9kZWpzIGJhc2U2NCBlbmNvZGVkIHN0cmluZyBjb21wYXRpYmxlIHdpdGggcmZjNDY0OCBhbHRlcm5hdGl2ZSBlbmNvZGluZyBmb3IgdXJscy5cbi8vIEBwYXJhbSBiYXNlNjRFbmNvZGVkIGEgbm9kZWpzIGJhc2U2NCBlbmNvZGVkIHN0cmluZ1xuZnVuY3Rpb24gYmFzZTY0VXJsRXNjYXBlKGJhc2U2NEVuY29kZWQ6IHN0cmluZyk6IHN0cmluZyB7XG4gIC8vIGJ1aWx0aW4gbm9kZSBqcyBiYXNlIDY0IGVuY29kaW5nIGlzIG5vdCA2NCB1cmwgY29tcGF0aWJsZS5cbiAgLy8gU2VlIGh0dHBzOi8vdG9vbHNuLmlldGYub3JnL2h0bWwvcmZjNDY0OCNzZWN0aW9uLTVcbiAgcmV0dXJuIGJhc2U2NEVuY29kZWRcbiAgICAucmVwbGFjZSgvXFwrL2csICctJylcbiAgICAucmVwbGFjZSgvXFwvL2csICdfJylcbiAgICAucmVwbGFjZSgvPS9nLCAnJyk7XG59XG5cbi8qKlxuICogdHlwZSBkZWZzXG4gKi9cbmV4cG9ydCB0eXBlIE9BdXRoMkNvbmZpZyA9IHtcbiAgY2xpZW50SWQ/OiBzdHJpbmc7XG4gIGNsaWVudFNlY3JldD86IHN0cmluZztcbiAgcmVkaXJlY3RVcmk/OiBzdHJpbmc7XG4gIGxvZ2luVXJsPzogc3RyaW5nO1xuICBhdXRoelNlcnZpY2VVcmw/OiBzdHJpbmc7XG4gIHRva2VuU2VydmljZVVybD86IHN0cmluZztcbiAgcmV2b2tlU2VydmljZVVybD86IHN0cmluZztcbiAgcHJveHlVcmw/OiBzdHJpbmc7XG4gIGh0dHBQcm94eT86IHN0cmluZztcbiAgdXNlVmVyaWZpZXI/OiBib29sZWFuO1xufTtcblxuZXhwb3J0IHR5cGUgQXV0aHpSZXF1ZXN0UGFyYW1zID0ge1xuICBzY29wZT86IHN0cmluZztcbiAgc3RhdGU/OiBzdHJpbmc7XG4gIGNvZGVfY2hhbGxlbmdlPzogc3RyaW5nO1xufSAmIHtcbiAgW2F0dHI6IHN0cmluZ106IHN0cmluZztcbn07XG5cbmV4cG9ydCB0eXBlIFRva2VuUmVzcG9uc2UgPSB7XG4gIHRva2VuX3R5cGU6ICdCZWFyZXInO1xuICAvKipcbiAgICogU3BhY2Utc2VwYXJhdGVkIGxpc3Qgb2YgT0F1dGggc2NvcGVzIGFzc29jaWF0ZWQgd2l0aCB0aGUgYWNjZXNzIHRva2VuXG4gICAqXG4gICAqIEZvciB0aGUgT0F1dGggMi4wIFdlYiBTZXJ2ZXIgRmxvdywgdGhpcyBjYW4gYmUgYSBzdWJzZXQgb2YgdGhlIHJlZ2lzdGVyZWQgc2NvcGVzIGlmIHNwZWNpZmllZCB3aGVuIHJlcXVlc3RpbmcgdGhlIGF1dGggY29kZS5cbiAgICpcbiAgICogU2VlOiBodHRwczovL2hlbHAuc2FsZXNmb3JjZS5jb20vcy9hcnRpY2xlVmlldz9pZD14Y2xvdWQucmVtb3RlYWNjZXNzX29hdXRoX3Rva2Vuc19zY29wZXMuaHRtJnR5cGU9NVxuICAgKi9cbiAgc2NvcGU6IHN0cmluZztcbiAgLyoqXG4gICAqIElkZW50aXR5IFVSTFxuICAgKlxuICAgKiBUaGUgZm9ybWF0IG9mIHRoZSBVUkwgaXMgaHR0cHM6Ly9sb2dpbi5zYWxlc2ZvcmNlLmNvbS9pZC9vcmdJRC91c2VySUQuXG4gICAqL1xuICBpZDogc3RyaW5nO1xuICBhY2Nlc3NfdG9rZW46IHN0cmluZztcbiAgcmVmcmVzaF90b2tlbj86IHN0cmluZztcbiAgc2lnbmF0dXJlOiBzdHJpbmc7XG4gIGlzc3VlZF9hdDogc3RyaW5nO1xuICBpbnN0YW5jZV91cmw6IHN0cmluZztcbiAgc2ZkY19jb21tdW5pdHlfdXJsPzogc3RyaW5nO1xuICBzZmRjX2NvbW11bml0eV9pZD86IHN0cmluZztcbn07XG5cbi8qKlxuICogT0F1dGgyIGNsYXNzXG4gKi9cbmV4cG9ydCBjbGFzcyBPQXV0aDIge1xuICBsb2dpblVybDogc3RyaW5nO1xuICBhdXRoelNlcnZpY2VVcmw6IHN0cmluZztcbiAgdG9rZW5TZXJ2aWNlVXJsOiBzdHJpbmc7XG4gIHJldm9rZVNlcnZpY2VVcmw6IHN0cmluZztcbiAgY2xpZW50SWQ6IE9wdGlvbmFsPHN0cmluZz47XG4gIGNsaWVudFNlY3JldDogT3B0aW9uYWw8c3RyaW5nPjtcbiAgcmVkaXJlY3RVcmk6IE9wdGlvbmFsPHN0cmluZz47XG4gIGNvZGVWZXJpZmllcjogT3B0aW9uYWw8c3RyaW5nPjtcblxuICBfdHJhbnNwb3J0OiBUcmFuc3BvcnQ7XG5cbiAgLyoqXG4gICAqXG4gICAqL1xuICBjb25zdHJ1Y3Rvcihjb25maWc6IE9BdXRoMkNvbmZpZykge1xuICAgIGNvbnN0IHtcbiAgICAgIGxvZ2luVXJsLFxuICAgICAgYXV0aHpTZXJ2aWNlVXJsLFxuICAgICAgdG9rZW5TZXJ2aWNlVXJsLFxuICAgICAgcmV2b2tlU2VydmljZVVybCxcbiAgICAgIGNsaWVudElkLFxuICAgICAgY2xpZW50U2VjcmV0LFxuICAgICAgcmVkaXJlY3RVcmksXG4gICAgICBwcm94eVVybCxcbiAgICAgIGh0dHBQcm94eSxcbiAgICAgIHVzZVZlcmlmaWVyLFxuICAgIH0gPSBjb25maWc7XG4gICAgaWYgKGF1dGh6U2VydmljZVVybCAmJiB0b2tlblNlcnZpY2VVcmwpIHtcbiAgICAgIHRoaXMubG9naW5VcmwgPSBhdXRoelNlcnZpY2VVcmwuc3BsaXQoJy8nKS5zbGljZSgwLCAzKS5qb2luKCcvJyk7XG4gICAgICB0aGlzLmF1dGh6U2VydmljZVVybCA9IGF1dGh6U2VydmljZVVybDtcbiAgICAgIHRoaXMudG9rZW5TZXJ2aWNlVXJsID0gdG9rZW5TZXJ2aWNlVXJsO1xuICAgICAgdGhpcy5yZXZva2VTZXJ2aWNlVXJsID1cbiAgICAgICAgcmV2b2tlU2VydmljZVVybCB8fCBgJHt0aGlzLmxvZ2luVXJsfS9zZXJ2aWNlcy9vYXV0aDIvcmV2b2tlYDtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5sb2dpblVybCA9IGxvZ2luVXJsID8/IGRlZmF1bHRPQXV0aDJDb25maWcubG9naW5VcmxcblxuICAgICAgY29uc3QgbWF5YmVTbGFzaCA9IHRoaXMubG9naW5VcmwuZW5kc1dpdGgoJy8nKSA/ICcnIDogJy8nXG5cbiAgICAgIHRoaXMuYXV0aHpTZXJ2aWNlVXJsID0gYCR7dGhpcy5sb2dpblVybH0ke21heWJlU2xhc2h9c2VydmljZXMvb2F1dGgyL2F1dGhvcml6ZWBcbiAgICAgIHRoaXMudG9rZW5TZXJ2aWNlVXJsID0gYCR7dGhpcy5sb2dpblVybH0ke21heWJlU2xhc2h9c2VydmljZXMvb2F1dGgyL3Rva2VuYFxuICAgICAgdGhpcy5yZXZva2VTZXJ2aWNlVXJsID0gYCR7dGhpcy5sb2dpblVybH0ke21heWJlU2xhc2h9c2VydmljZXMvb2F1dGgyL3Jldm9rZWBcbiAgICB9XG4gICAgdGhpcy5jbGllbnRJZCA9IGNsaWVudElkO1xuICAgIHRoaXMuY2xpZW50U2VjcmV0ID0gY2xpZW50U2VjcmV0O1xuICAgIHRoaXMucmVkaXJlY3RVcmkgPSByZWRpcmVjdFVyaTtcbiAgICBpZiAocHJveHlVcmwpIHtcbiAgICAgIHRoaXMuX3RyYW5zcG9ydCA9IG5ldyBYZFByb3h5VHJhbnNwb3J0KHByb3h5VXJsKTtcbiAgICB9IGVsc2UgaWYgKGh0dHBQcm94eSkge1xuICAgICAgdGhpcy5fdHJhbnNwb3J0ID0gbmV3IEh0dHBQcm94eVRyYW5zcG9ydChodHRwUHJveHkpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl90cmFuc3BvcnQgPSBuZXcgVHJhbnNwb3J0KCk7XG4gICAgfVxuICAgIGlmICh1c2VWZXJpZmllcikge1xuICAgICAgLy8gU2V0IGEgY29kZSB2ZXJpZmllciBzdHJpbmcgZm9yIE9BdXRoIGF1dGhvcml6YXRpb25cbiAgICAgIHRoaXMuY29kZVZlcmlmaWVyID0gYmFzZTY0VXJsRXNjYXBlKFxuICAgICAgICByYW5kb21CeXRlcyhNYXRoLmNlaWwoMTI4KSkudG9TdHJpbmcoJ2Jhc2U2NCcpLFxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogR2V0IFNhbGVzZm9yY2UgT0F1dGgyIGF1dGhvcml6YXRpb24gcGFnZSBVUkwgdG8gcmVkaXJlY3QgdXNlciBhZ2VudC5cbiAgICovXG4gIGdldEF1dGhvcml6YXRpb25VcmwocGFyYW1zOiBBdXRoelJlcXVlc3RQYXJhbXMgPSB7fSkge1xuICAgIGlmICh0aGlzLmNvZGVWZXJpZmllcikge1xuICAgICAgLy8gY29kZSB2ZXJpZmllciBtdXN0IGJlIGEgYmFzZSA2NCB1cmwgZW5jb2RlZCBoYXNoIG9mIDEyOCBieXRlcyBvZiByYW5kb20gZGF0YS4gT3VyIHJhbmRvbSBkYXRhIGlzIGFsc29cbiAgICAgIC8vIGJhc2UgNjQgdXJsIGVuY29kZWQuIFNlZSBDb25uZWN0aW9uLmNyZWF0ZSgpO1xuICAgICAgcGFyYW1zLmNvZGVfY2hhbGxlbmdlID0gYmFzZTY0VXJsRXNjYXBlKFxuICAgICAgICBjcmVhdGVIYXNoKCdzaGEyNTYnKS51cGRhdGUodGhpcy5jb2RlVmVyaWZpZXIpLmRpZ2VzdCgnYmFzZTY0JyksXG4gICAgICApO1xuICAgIH1cblxuICAgIGNvbnN0IF9wYXJhbXMgPSB7XG4gICAgICAuLi5wYXJhbXMsXG4gICAgICByZXNwb25zZV90eXBlOiAnY29kZScsXG4gICAgICBjbGllbnRfaWQ6IHRoaXMuY2xpZW50SWQsXG4gICAgICByZWRpcmVjdF91cmk6IHRoaXMucmVkaXJlY3RVcmksXG4gICAgfTtcbiAgICByZXR1cm4gKFxuICAgICAgdGhpcy5hdXRoelNlcnZpY2VVcmwgK1xuICAgICAgKHRoaXMuYXV0aHpTZXJ2aWNlVXJsLmluY2x1ZGVzKCc/JykgPyAnJicgOiAnPycpICtcbiAgICAgIHF1ZXJ5c3RyaW5nLnN0cmluZ2lmeShfcGFyYW1zIGFzIHsgW25hbWU6IHN0cmluZ106IGFueSB9KVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogT0F1dGgyIFJlZnJlc2ggVG9rZW4gRmxvd1xuICAgKi9cbiAgYXN5bmMgcmVmcmVzaFRva2VuKHJlZnJlc2hUb2tlbjogc3RyaW5nKTogUHJvbWlzZTxUb2tlblJlc3BvbnNlPiB7XG4gICAgaWYgKCF0aGlzLmNsaWVudElkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ05vIE9BdXRoMiBjbGllbnQgaWQgaW5mb3JtYXRpb24gaXMgc3BlY2lmaWVkJyk7XG4gICAgfVxuICAgIGNvbnN0IHBhcmFtczogeyBbcHJvcDogc3RyaW5nXTogc3RyaW5nIH0gPSB7XG4gICAgICBncmFudF90eXBlOiAncmVmcmVzaF90b2tlbicsXG4gICAgICByZWZyZXNoX3Rva2VuOiByZWZyZXNoVG9rZW4sXG4gICAgICBjbGllbnRfaWQ6IHRoaXMuY2xpZW50SWQsXG4gICAgfTtcbiAgICBpZiAodGhpcy5jbGllbnRTZWNyZXQpIHtcbiAgICAgIHBhcmFtcy5jbGllbnRfc2VjcmV0ID0gdGhpcy5jbGllbnRTZWNyZXQ7XG4gICAgfVxuICAgIGNvbnN0IHJldCA9IGF3YWl0IHRoaXMuX3Bvc3RQYXJhbXMocGFyYW1zKTtcbiAgICByZXR1cm4gcmV0IGFzIFRva2VuUmVzcG9uc2U7XG4gIH1cblxuICAvKipcbiAgICogU2VuZCBhY2Nlc3MgdG9rZW4gcmVxdWVzdCB0byB0aGUgdG9rZW4gZW5kcG9pbnQuXG4gICAqIFdoZW4gYSBjb2RlIChzdHJpbmcpIGlzIHBhc3NlZCBpbiBmaXJzdCBhcmd1bWVudCwgaXQgd2lsbCB1c2UgV2ViIFNlcnZlciBBdXRoZW50aWNhdGlvbiBGbG93IChBdXRob3JpemF0aW9uIENvZGUgR3JhbnQpLlxuICAgKiBPdGhlcndpc2UsIGl0IHdpbGwgdXNlIHRoZSBzcGVjaWZpZWQgYGdyYW50X3R5cGVgIGFuZCBwYXNzIHBhcmFtZXRlcnMgdG8gdGhlIGVuZHBvaW50LlxuICAgKi9cbiAgYXN5bmMgcmVxdWVzdFRva2VuKFxuICAgIGNvZGVPclBhcmFtczogc3RyaW5nIHwgeyBncmFudF90eXBlOiBzdHJpbmc7IFtuYW1lOiBzdHJpbmddOiBzdHJpbmcgfSxcbiAgICBwYXJhbXM6IHsgW3Byb3A6IHN0cmluZ106IHN0cmluZyB9ID0ge30sXG4gICk6IFByb21pc2U8VG9rZW5SZXNwb25zZT4ge1xuICAgIGlmIChcbiAgICAgIHR5cGVvZiBjb2RlT3JQYXJhbXMgPT09ICdzdHJpbmcnICYmXG4gICAgICAoIXRoaXMuY2xpZW50SWQgfHwgIXRoaXMucmVkaXJlY3RVcmkpXG4gICAgKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICdObyBPQXV0aDIgY2xpZW50IGlkIG9yIHJlZGlyZWN0IHVyaSBjb25maWd1cmF0aW9uIGlzIHNwZWNpZmllZCcsXG4gICAgICApO1xuICAgIH1cbiAgICBjb25zdCBfcGFyYW1zOiB7IFtwcm9wOiBzdHJpbmddOiBzdHJpbmcgfSA9IHtcbiAgICAgIC4uLnBhcmFtcyxcbiAgICAgIC4uLih0eXBlb2YgY29kZU9yUGFyYW1zID09PSAnc3RyaW5nJ1xuICAgICAgICA/IHsgZ3JhbnRfdHlwZTogJ2F1dGhvcml6YXRpb25fY29kZScsIGNvZGU6IGNvZGVPclBhcmFtcyB9XG4gICAgICAgIDogY29kZU9yUGFyYW1zKSxcbiAgICB9O1xuICAgIGlmICh0aGlzLmNsaWVudElkKSB7XG4gICAgICBfcGFyYW1zLmNsaWVudF9pZCA9IHRoaXMuY2xpZW50SWQ7XG4gICAgfVxuICAgIGlmICh0aGlzLmNsaWVudFNlY3JldCkge1xuICAgICAgX3BhcmFtcy5jbGllbnRfc2VjcmV0ID0gdGhpcy5jbGllbnRTZWNyZXQ7XG4gICAgfVxuICAgIGlmICh0aGlzLnJlZGlyZWN0VXJpKSB7XG4gICAgICBfcGFyYW1zLnJlZGlyZWN0X3VyaSA9IHRoaXMucmVkaXJlY3RVcmk7XG4gICAgfVxuICAgIGNvbnN0IHJldCA9IGF3YWl0IHRoaXMuX3Bvc3RQYXJhbXMoX3BhcmFtcyk7XG4gICAgcmV0dXJuIHJldCBhcyBUb2tlblJlc3BvbnNlO1xuICB9XG5cbiAgLyoqXG4gICAqIE9BdXRoMiBVc2VybmFtZS1QYXNzd29yZCBGbG93IChSZXNvdXJjZSBPd25lciBQYXNzd29yZCBDcmVkZW50aWFscylcbiAgICovXG4gIGFzeW5jIGF1dGhlbnRpY2F0ZShcbiAgICB1c2VybmFtZTogc3RyaW5nLFxuICAgIHBhc3N3b3JkOiBzdHJpbmcsXG4gICk6IFByb21pc2U8VG9rZW5SZXNwb25zZT4ge1xuICAgIGlmICghdGhpcy5jbGllbnRJZCB8fCAhdGhpcy5jbGllbnRTZWNyZXQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignTm8gdmFsaWQgT0F1dGgyIGNsaWVudCBjb25maWd1cmF0aW9uIHNldCcpO1xuICAgIH1cbiAgICBjb25zdCByZXQgPSBhd2FpdCB0aGlzLl9wb3N0UGFyYW1zKHtcbiAgICAgIGdyYW50X3R5cGU6ICdwYXNzd29yZCcsXG4gICAgICB1c2VybmFtZSxcbiAgICAgIHBhc3N3b3JkLFxuICAgICAgY2xpZW50X2lkOiB0aGlzLmNsaWVudElkLFxuICAgICAgY2xpZW50X3NlY3JldDogdGhpcy5jbGllbnRTZWNyZXQsXG4gICAgfSk7XG4gICAgcmV0dXJuIHJldCBhcyBUb2tlblJlc3BvbnNlO1xuICB9XG5cbiAgLyoqXG4gICAqIE9BdXRoMiBSZXZva2UgU2Vzc2lvbiBUb2tlblxuICAgKi9cbiAgYXN5bmMgcmV2b2tlVG9rZW4odG9rZW46IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy5fdHJhbnNwb3J0Lmh0dHBSZXF1ZXN0KHtcbiAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgdXJsOiB0aGlzLnJldm9rZVNlcnZpY2VVcmwsXG4gICAgICBib2R5OiBxdWVyeXN0cmluZy5zdHJpbmdpZnkoeyB0b2tlbiB9KSxcbiAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgJ2NvbnRlbnQtdHlwZSc6ICdhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQnLFxuICAgICAgfSxcbiAgICB9KTtcbiAgICBpZiAocmVzcG9uc2Uuc3RhdHVzQ29kZSA+PSA0MDApIHtcbiAgICAgIGxldCByZXM6IGFueSA9IHF1ZXJ5c3RyaW5nLnBhcnNlKHJlc3BvbnNlLmJvZHkpO1xuICAgICAgaWYgKCFyZXMgfHwgIXJlcy5lcnJvcikge1xuICAgICAgICByZXMgPSB7XG4gICAgICAgICAgZXJyb3I6IGBFUlJPUl9IVFRQXyR7cmVzcG9uc2Uuc3RhdHVzQ29kZX1gLFxuICAgICAgICAgIGVycm9yX2Rlc2NyaXB0aW9uOiByZXNwb25zZS5ib2R5LFxuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgdGhyb3cgbmV3IChjbGFzcyBleHRlbmRzIEVycm9yIHtcbiAgICAgICAgY29uc3RydWN0b3Ioe1xuICAgICAgICAgIGVycm9yLFxuICAgICAgICAgIGVycm9yX2Rlc2NyaXB0aW9uLFxuICAgICAgICB9OiB7XG4gICAgICAgICAgZXJyb3I6IHN0cmluZztcbiAgICAgICAgICBlcnJvcl9kZXNjcmlwdGlvbjogc3RyaW5nO1xuICAgICAgICB9KSB7XG4gICAgICAgICAgc3VwZXIoZXJyb3JfZGVzY3JpcHRpb24pO1xuICAgICAgICAgIHRoaXMubmFtZSA9IGVycm9yO1xuICAgICAgICB9XG4gICAgICB9KShyZXMpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgYXN5bmMgX3Bvc3RQYXJhbXMocGFyYW1zOiB7IFtuYW1lOiBzdHJpbmddOiBzdHJpbmcgfSk6IFByb21pc2U8YW55PiB7XG4gICAgaWYgKHRoaXMuY29kZVZlcmlmaWVyKSBwYXJhbXMuY29kZV92ZXJpZmllciA9IHRoaXMuY29kZVZlcmlmaWVyO1xuXG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLl90cmFuc3BvcnQuaHR0cFJlcXVlc3Qoe1xuICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICB1cmw6IHRoaXMudG9rZW5TZXJ2aWNlVXJsLFxuICAgICAgYm9keTogcXVlcnlzdHJpbmcuc3RyaW5naWZ5KHBhcmFtcyksXG4gICAgICBoZWFkZXJzOiB7XG4gICAgICAgICdjb250ZW50LXR5cGUnOiAnYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkJyxcbiAgICAgIH0sXG4gICAgfSk7XG4gICAgbGV0IHJlcztcbiAgICB0cnkge1xuICAgICAgcmVzID0gSlNPTi5wYXJzZShyZXNwb25zZS5ib2R5KTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAvKiBlc2xpbnQtZGlzYWJsZSBuby1lbXB0eSAqL1xuICAgIH1cbiAgICBpZiAocmVzcG9uc2Uuc3RhdHVzQ29kZSA+PSA0MDApIHtcbiAgICAgIHJlcyA9IHJlcyB8fCB7XG4gICAgICAgIGVycm9yOiBgRVJST1JfSFRUUF8ke3Jlc3BvbnNlLnN0YXR1c0NvZGV9YCxcbiAgICAgICAgZXJyb3JfZGVzY3JpcHRpb246IHJlc3BvbnNlLmJvZHksXG4gICAgICB9O1xuICAgICAgdGhyb3cgbmV3IChjbGFzcyBleHRlbmRzIEVycm9yIHtcbiAgICAgICAgY29uc3RydWN0b3Ioe1xuICAgICAgICAgIGVycm9yLFxuICAgICAgICAgIGVycm9yX2Rlc2NyaXB0aW9uLFxuICAgICAgICB9OiB7XG4gICAgICAgICAgZXJyb3I6IHN0cmluZztcbiAgICAgICAgICBlcnJvcl9kZXNjcmlwdGlvbjogc3RyaW5nO1xuICAgICAgICB9KSB7XG4gICAgICAgICAgc3VwZXIoZXJyb3JfZGVzY3JpcHRpb24pO1xuICAgICAgICAgIHRoaXMubmFtZSA9IGVycm9yO1xuICAgICAgICB9XG4gICAgICB9KShyZXMpO1xuICAgIH1cbiAgICByZXR1cm4gcmVzO1xuICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IE9BdXRoMjtcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUNB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