shipxanh-oalazada
Version:
Lazada Open Platform SDK for Node.js
308 lines (214 loc) • 28 kB
JavaScript
;
var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; };
/**
* Determind if response is successful
* @param {LazadaOpenPlatformAPIResponse} response
* @return {boolean} success
*/
var _requestPromise = require("request-promise");
var _requestPromise2 = _interopRequireDefault(_requestPromise);
var _formData = require("form-data");
var _formData2 = _interopRequireDefault(_formData);
var _fs = require("fs");
var _constants = require("./constants");
var _signature = require("./signature");
var _Common = require("../types/Common");
var _Request = require("./types/Request");
var _Response = require("./types/Response");
var _flowRuntime = require("flow-runtime");
var _flowRuntime2 = _interopRequireDefault(_flowRuntime);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
var LazadaOpenPlatformAPIResponse = _flowRuntime2.default.tdz(function () {
return _Response.LazadaOpenPlatformAPIResponse;
});
var SDKRequestMetaData = _flowRuntime2.default.tdz(function () {
return _Request.SDKRequestMetaData;
});
var SystemQueryParams = _flowRuntime2.default.tdz(function () {
return _Request.SystemQueryParams;
});
var KeyValueDictionary = _flowRuntime2.default.tdz(function () {
return _Common.KeyValueDictionary;
});
var isResponseSuccessful = _flowRuntime2.default.annotate(function isResponseSuccessful(response) {
var _responseType = _flowRuntime2.default.union(_flowRuntime2.default.ref(LazadaOpenPlatformAPIResponse), _flowRuntime2.default.any());
var _returnType = _flowRuntime2.default.return(_flowRuntime2.default.boolean());
_flowRuntime2.default.param("response", _responseType).assert(response);
return _returnType.assert((typeof response === "undefined" ? "undefined" : _typeof(response)) === "object" && response !== null && response.hasOwnProperty("code") && response.code === _constants.RESPONSE.SUCCESS.CODE);
}, _flowRuntime2.default.function(_flowRuntime2.default.param("response", _flowRuntime2.default.union(_flowRuntime2.default.ref(LazadaOpenPlatformAPIResponse), _flowRuntime2.default.any())), _flowRuntime2.default.return(_flowRuntime2.default.boolean())));
var handleLazadaResponse = _flowRuntime2.default.annotate(function handleLazadaResponse(response, meta) {
var _responseType2 = _flowRuntime2.default.ref(LazadaOpenPlatformAPIResponse);
var _metaType = _flowRuntime2.default.ref(SDKRequestMetaData);
var _returnType2 = _flowRuntime2.default.return(_flowRuntime2.default.ref(LazadaOpenPlatformAPIResponse));
_flowRuntime2.default.param("response", _responseType2).assert(response);
_flowRuntime2.default.param("meta", _metaType).assert(meta);
// for debug only
var _log_request = _flowRuntime2.default.annotate(function _log_request(_arg, response) {
var _t$ref$assert = _flowRuntime2.default.ref(SDKRequestMetaData).assert(_arg),
method = _t$ref$assert.method,
apiPath = _t$ref$assert.apiPath,
payload = _t$ref$assert.payload,
query = _t$ref$assert.query;
console.info("[%s] ".replace(/%s/, method) + apiPath, " ", payload, " ", query);
}, _flowRuntime2.default.function(_flowRuntime2.default.param("_arg", _flowRuntime2.default.ref(SDKRequestMetaData)), _flowRuntime2.default.param("response", _flowRuntime2.default.any())));
// _log_request(meta, response)
if (isResponseSuccessful(response)) {
return Promise.resolve(response).then(function (_arg2) {
return _returnType2.assert(_arg2);
});
} else {
return Promise.reject(response).then(function (_arg3) {
return _returnType2.assert(_arg3);
});
}
}, _flowRuntime2.default.function(_flowRuntime2.default.param("response", _flowRuntime2.default.ref(LazadaOpenPlatformAPIResponse)), _flowRuntime2.default.param("meta", _flowRuntime2.default.ref(SDKRequestMetaData)), _flowRuntime2.default.return(_flowRuntime2.default.ref("Promise", _flowRuntime2.default.ref(LazadaOpenPlatformAPIResponse)))));
var get = _flowRuntime2.default.annotate(function get(base, appKey, appSecret, apiPath, accessToken, params) {
var _baseType = _flowRuntime2.default.string();
var _appKeyType = _flowRuntime2.default.string();
var _appSecretType = _flowRuntime2.default.string();
var _apiPathType = _flowRuntime2.default.string();
var _accessTokenType = _flowRuntime2.default.nullable(_flowRuntime2.default.string());
var _paramsType = _flowRuntime2.default.ref(KeyValueDictionary);
var _returnType3 = _flowRuntime2.default.return(_flowRuntime2.default.ref(LazadaOpenPlatformAPIResponse));
_flowRuntime2.default.param("base", _baseType).assert(base);
_flowRuntime2.default.param("appKey", _appKeyType).assert(appKey);
_flowRuntime2.default.param("appSecret", _appSecretType).assert(appSecret);
_flowRuntime2.default.param("apiPath", _apiPathType).assert(apiPath);
_flowRuntime2.default.param("accessToken", _accessTokenType).assert(accessToken);
_flowRuntime2.default.param("params", _paramsType, true).assert(params);
var qs = Object.assign({}, params, getSystemQueryParamObject(appKey, appSecret, apiPath, accessToken, params));
return (0, _requestPromise2.default)({
url: base + apiPath,
qs: qs,
json: true
}).then(function (response) {
var meta = {
method: "GET",
apiPath: apiPath,
payload: params,
query: qs
};
return handleLazadaResponse(response, meta);
}).then(function (_arg4) {
return _returnType3.assert(_arg4);
});
}, _flowRuntime2.default.function(_flowRuntime2.default.param("base", _flowRuntime2.default.string()), _flowRuntime2.default.param("appKey", _flowRuntime2.default.string()), _flowRuntime2.default.param("appSecret", _flowRuntime2.default.string()), _flowRuntime2.default.param("apiPath", _flowRuntime2.default.string()), _flowRuntime2.default.param("accessToken", _flowRuntime2.default.nullable(_flowRuntime2.default.string())), _flowRuntime2.default.param("params", _flowRuntime2.default.ref(KeyValueDictionary)), _flowRuntime2.default.return(_flowRuntime2.default.ref("Promise", _flowRuntime2.default.ref(LazadaOpenPlatformAPIResponse)))));
var post = _flowRuntime2.default.annotate(function post(base, appKey, appSecret, apiPath, accessToken, body, extendBody) {
var _baseType2 = _flowRuntime2.default.string();
var _appKeyType2 = _flowRuntime2.default.string();
var _appSecretType2 = _flowRuntime2.default.string();
var _apiPathType2 = _flowRuntime2.default.string();
var _accessTokenType2 = _flowRuntime2.default.nullable(_flowRuntime2.default.string());
var _bodyType = _flowRuntime2.default.ref(KeyValueDictionary);
var _extendBodyType = _flowRuntime2.default.ref(KeyValueDictionary);
var _returnType4 = _flowRuntime2.default.return(_flowRuntime2.default.ref(LazadaOpenPlatformAPIResponse));
_flowRuntime2.default.param("base", _baseType2).assert(base);
_flowRuntime2.default.param("appKey", _appKeyType2).assert(appKey);
_flowRuntime2.default.param("appSecret", _appSecretType2).assert(appSecret);
_flowRuntime2.default.param("apiPath", _apiPathType2).assert(apiPath);
_flowRuntime2.default.param("accessToken", _accessTokenType2).assert(accessToken);
_flowRuntime2.default.param("body", _bodyType, true).assert(body);
_flowRuntime2.default.param("extendBody", _extendBodyType, true).assert(extendBody);
// turns out even it's HTTP POST, Lazada expect `body` to be part of query string
var qs = Object.assign({}, body, getSystemQueryParamObject(appKey, appSecret, apiPath, accessToken, body));
return (0, _requestPromise2.default)({
method: "POST",
uri: base + apiPath,
qs: qs,
json: true,
body: Object.assign(body, extendBody)
}).then(function (response) {
var meta = {
method: "POST",
apiPath: apiPath,
payload: body,
query: qs
};
return handleLazadaResponse(response, meta);
}).then(function (_arg5) {
return _returnType4.assert(_arg5);
});
}, _flowRuntime2.default.function(_flowRuntime2.default.param("base", _flowRuntime2.default.string()), _flowRuntime2.default.param("appKey", _flowRuntime2.default.string()), _flowRuntime2.default.param("appSecret", _flowRuntime2.default.string()), _flowRuntime2.default.param("apiPath", _flowRuntime2.default.string()), _flowRuntime2.default.param("accessToken", _flowRuntime2.default.nullable(_flowRuntime2.default.string())), _flowRuntime2.default.param("body", _flowRuntime2.default.ref(KeyValueDictionary)), _flowRuntime2.default.param("extendBody", _flowRuntime2.default.ref(KeyValueDictionary)), _flowRuntime2.default.return(_flowRuntime2.default.ref("Promise", _flowRuntime2.default.ref(LazadaOpenPlatformAPIResponse)))));
var uploadFile = _flowRuntime2.default.annotate(function uploadFile(base, appKey, appSecret, apiPath, accessToken, filePath, body) {
var _baseType3 = _flowRuntime2.default.string();
var _appKeyType3 = _flowRuntime2.default.string();
var _appSecretType3 = _flowRuntime2.default.string();
var _apiPathType3 = _flowRuntime2.default.string();
var _accessTokenType3 = _flowRuntime2.default.nullable(_flowRuntime2.default.string());
var _filePathType = _flowRuntime2.default.string();
var _bodyType2 = _flowRuntime2.default.ref(KeyValueDictionary);
var _returnType5 = _flowRuntime2.default.return(_flowRuntime2.default.ref(LazadaOpenPlatformAPIResponse));
_flowRuntime2.default.param("base", _baseType3).assert(base);
_flowRuntime2.default.param("appKey", _appKeyType3).assert(appKey);
_flowRuntime2.default.param("appSecret", _appSecretType3).assert(appSecret);
_flowRuntime2.default.param("apiPath", _apiPathType3).assert(apiPath);
_flowRuntime2.default.param("accessToken", _accessTokenType3).assert(accessToken);
_flowRuntime2.default.param("filePath", _filePathType).assert(filePath);
_flowRuntime2.default.param("body", _bodyType2, true).assert(body);
// turns out even it's HTTP POST, Lazada expect `body` to be part of query string
var qs = Object.assign({}, body, getSystemQueryParamObject(appKey, appSecret, apiPath, accessToken, body));
//get formdata from body
var formData = Object.assign(body, {
file: (0, _fs.createReadStream)(filePath)
});
return (0, _requestPromise2.default)({
method: "POST",
uri: base + apiPath,
qs: qs,
json: true,
formData: formData
}).then(function (response) {
var meta = {
method: "POST",
apiPath: apiPath,
payload: body,
query: qs
};
return handleLazadaResponse(response, meta);
}).then(function (_arg6) {
return _returnType5.assert(_arg6);
});
}, _flowRuntime2.default.function(_flowRuntime2.default.param("base", _flowRuntime2.default.string()), _flowRuntime2.default.param("appKey", _flowRuntime2.default.string()), _flowRuntime2.default.param("appSecret", _flowRuntime2.default.string()), _flowRuntime2.default.param("apiPath", _flowRuntime2.default.string()), _flowRuntime2.default.param("accessToken", _flowRuntime2.default.nullable(_flowRuntime2.default.string())), _flowRuntime2.default.param("filePath", _flowRuntime2.default.string()), _flowRuntime2.default.param("body", _flowRuntime2.default.ref(KeyValueDictionary)), _flowRuntime2.default.return(_flowRuntime2.default.ref("Promise", _flowRuntime2.default.ref(LazadaOpenPlatformAPIResponse)))));
/**
* Gather system and business parameters to compute signature
* @param {string} appKey
* @param {string} appSecret
* @param {string} apiPath
* @param {string?} accessToken
* @param {KeyValueDictionary?} payload
* @return {SystemQueryParams}
*/
var getSystemQueryParamObject = _flowRuntime2.default.annotate(function getSystemQueryParamObject(appKey, appSecret, apiPath, accessToken, payload) {
var _appKeyType4 = _flowRuntime2.default.string();
var _appSecretType4 = _flowRuntime2.default.string();
var _apiPathType4 = _flowRuntime2.default.string();
var _accessTokenType4 = _flowRuntime2.default.nullable(_flowRuntime2.default.string());
var _payloadType = _flowRuntime2.default.ref(KeyValueDictionary);
var _returnType6 = _flowRuntime2.default.return(_flowRuntime2.default.ref(SystemQueryParams));
_flowRuntime2.default.param("appKey", _appKeyType4).assert(appKey);
_flowRuntime2.default.param("appSecret", _appSecretType4).assert(appSecret);
_flowRuntime2.default.param("apiPath", _apiPathType4).assert(apiPath);
_flowRuntime2.default.param("accessToken", _accessTokenType4).assert(accessToken);
_flowRuntime2.default.param("payload", _payloadType, true).assert(payload);
var systemParams = _flowRuntime2.default.object(_flowRuntime2.default.property("app_key", _flowRuntime2.default.string()), _flowRuntime2.default.property("timestamp", _flowRuntime2.default.string()), _flowRuntime2.default.property("sign_method", _flowRuntime2.default.string()), _flowRuntime2.default.property("access_token", _flowRuntime2.default.string(), true)).assert({
app_key: appKey,
timestamp: Date.now().toString(),
sign_method: "sha256"
});
if (accessToken) {
systemParams.access_token = accessToken;
}
return _returnType6.assert(Object.assign({}, {
sign: (0, _signature.signRequest)(appSecret, apiPath, Object.assign({}, payload, systemParams))
}, systemParams));
}, _flowRuntime2.default.function(_flowRuntime2.default.param("appKey", _flowRuntime2.default.string()), _flowRuntime2.default.param("appSecret", _flowRuntime2.default.string()), _flowRuntime2.default.param("apiPath", _flowRuntime2.default.string()), _flowRuntime2.default.param("accessToken", _flowRuntime2.default.nullable(_flowRuntime2.default.string())), _flowRuntime2.default.param("payload", _flowRuntime2.default.ref(KeyValueDictionary)), _flowRuntime2.default.return(_flowRuntime2.default.ref(SystemQueryParams))));
// constructor
module.exports = {
get: get,
post: post,
uploadFile: uploadFile,
isResponseSuccessful: isResponseSuccessful,
// helper
getSystemQueryParamObject: getSystemQueryParamObject
};
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9MYXphZGFSZXF1ZXN0L2luZGV4LmpzIl0sIm5hbWVzIjpbImlzUmVzcG9uc2VTdWNjZXNzZnVsIiwicmVzcG9uc2UiLCJoYXNPd25Qcm9wZXJ0eSIsImNvZGUiLCJSRVNQT05TRSIsIlNVQ0NFU1MiLCJDT0RFIiwiaGFuZGxlTGF6YWRhUmVzcG9uc2UiLCJtZXRhIiwiX2xvZ19yZXF1ZXN0IiwibWV0aG9kIiwiYXBpUGF0aCIsInBheWxvYWQiLCJxdWVyeSIsImNvbnNvbGUiLCJpbmZvIiwicmVwbGFjZSIsIlByb21pc2UiLCJyZXNvbHZlIiwicmVqZWN0IiwiZ2V0IiwiYmFzZSIsImFwcEtleSIsImFwcFNlY3JldCIsImFjY2Vzc1Rva2VuIiwicGFyYW1zIiwicXMiLCJPYmplY3QiLCJhc3NpZ24iLCJnZXRTeXN0ZW1RdWVyeVBhcmFtT2JqZWN0IiwidXJsIiwianNvbiIsInRoZW4iLCJwb3N0IiwiYm9keSIsImV4dGVuZEJvZHkiLCJ1cmkiLCJ1cGxvYWRGaWxlIiwiZmlsZVBhdGgiLCJmb3JtRGF0YSIsImZpbGUiLCJhcHBfa2V5IiwidGltZXN0YW1wIiwiRGF0ZSIsIm5vdyIsInRvU3RyaW5nIiwic2lnbl9tZXRob2QiLCJzeXN0ZW1QYXJhbXMiLCJhY2Nlc3NfdG9rZW4iLCJzaWduIiwibW9kdWxlIiwiZXhwb3J0cyJdLCJtYXBwaW5ncyI6IkFBQ0E7Ozs7QUFZQTs7Ozs7OztBQVZBOzs7O0FBQ0E7Ozs7QUFDQTs7QUFFQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBT0EsSUFBTUEsc0RBQXVCLDhCQUMzQkMsUUFEMkIsRUFFZjtBQUFBLHNCQURKLDRCQUFFLHdEQUFGLEVBQWtDLDJCQUFsQyxDQUNJOztBQUFBLGlEQUFYLCtCQUFXOztBQUFBOztBQUNaLDRCQUNFLFFBQU9BLFFBQVAseUNBQU9BLFFBQVAsT0FBb0IsUUFBcEIsSUFDQUEsYUFBYSxJQURiLElBRUFBLFNBQVNDLGNBQVQs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MkJBO0FBTlosQ0FBakIiLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBAZmxvd1xuXCJ1c2Ugc3RyaWN0XCI7XG5cbmltcG9ydCBycCBmcm9tIFwicmVxdWVzdC1wcm9taXNlXCI7XG5pbXBvcnQgRm9ybURhdGEgZnJvbSBcImZvcm0tZGF0YVwiO1xuaW1wb3J0IHsgY3JlYXRlUmVhZFN0cmVhbSB9IGZyb20gXCJmc1wiO1xuXG5pbXBvcnQgeyBSRVNQT05TRSB9IGZyb20gXCIuL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgc2lnblJlcXVlc3QgfSBmcm9tIFwiLi9zaWduYXR1cmVcIjtcbmltcG9ydCB0eXBlIHsgS2V5VmFsdWVEaWN0aW9uYXJ5IH0gZnJvbSBcInNyYy90eXBlcy9Db21tb25cIjtcbmltcG9ydCB0eXBlIHsgU0RLUmVxdWVzdE1ldGFEYXRhLCBTeXN0ZW1RdWVyeVBhcmFtcyB9IGZyb20gXCIuL3R5cGVzL1JlcXVlc3RcIjtcbmltcG9ydCB0eXBlIHsgTGF6YWRhT3BlblBsYXRmb3JtQVBJUmVzcG9uc2UgfSBmcm9tIFwiLi90eXBlcy9SZXNwb25zZVwiO1xuXG4vKipcbiAqIERldGVybWluZCBpZiByZXNwb25zZSBpcyBzdWNjZXNzZnVsXG4gKiBAcGFyYW0ge0xhemFkYU9wZW5QbGF0Zm9ybUFQSVJlc3BvbnNlfSByZXNwb25zZVxuICogQHJldHVybiB7Ym9vbGVhbn0gc3VjY2Vzc1xuICovXG5jb25zdCBpc1Jlc3BvbnNlU3VjY2Vzc2Z1bCA9IChcbiAgcmVzcG9uc2U6IExhemFkYU9wZW5QbGF0Zm9ybUFQSVJlc3BvbnNlIHwgYW55XG4pOiBib29sZWFuID0+IHtcbiAgcmV0dXJuIChcbiAgICB0eXBlb2YgcmVzcG9uc2UgPT09IFwib2JqZWN0XCIgJiZcbiAgICByZXNwb25zZSAhPT0gbnVsbCAmJlxuICAgIHJlc3BvbnNlLmhhc093blByb3BlcnR5KFwiY29kZVwiKSAmJlxuICAgIHJlc3BvbnNlLmNvZGUgPT09IFJFU1BPTlNFLlNVQ0NFU1MuQ09ERVxuICApO1xufTtcblxuY29uc3QgaGFuZGxlTGF6YWRhUmVzcG9uc2UgPSAoXG4gIHJlc3BvbnNlOiBMYXphZGFPcGVuUGxhdGZvcm1BUElSZXNwb25zZSxcbiAgbWV0YTogU0RLUmVxdWVzdE1ldGFEYXRhXG4pOiBQcm9taXNlPExhemFkYU9wZW5QbGF0Zm9ybUFQSVJlc3BvbnNlPiA9PiB7XG4gIC8vIGZvciBkZWJ1ZyBvbmx5XG4gIGNvbnN0IF9sb2dfcmVxdWVzdCA9IChcbiAgICB7IG1ldGhvZCwgYXBpUGF0aCwgcGF5bG9hZCwgcXVlcnkgfTogU0RLUmVxdWVzdE1ldGFEYXRhLFxuICAgIHJlc3BvbnNlXG4gICkgPT4ge1xuICAgIGNvbnNvbGUuaW5mbyhcbiAgICAgIFwiWyVzXSBcIi5yZXBsYWNlKC8lcy8sIG1ldGhvZCkgKyBhcGlQYXRoLFxuICAgICAgXCIgXCIsXG4gICAgICBwYXlsb2FkLFxuICAgICAgXCIgXCIsXG4gICAgICBxdWVyeVxuICAgICk7XG4gIH07XG4gIC8vIF9sb2dfcmVxdWVzdChtZXRhLCByZXNwb25zZSlcbiAgaWYgKGlzUmVzcG9uc2VTdWNjZXNzZnVsKHJlc3BvbnNlKSkge1xuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUocmVzcG9uc2UpO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBQcm9taXNlLnJlamVjdChyZXNwb25zZSk7XG4gIH1cbn07XG5cbmNvbnN0IGdldCA9IChcbiAgYmFzZTogc3RyaW5nLFxuICBhcHBLZXk6IHN0cmluZyxcbiAgYXBwU2VjcmV0OiBzdHJpbmcsXG4gIGFwaVBhdGg6IHN0cmluZyxcbiAgYWNjZXNzVG9rZW46ID9zdHJpbmcsXG4gIHBhcmFtcz86IEtleVZhbHVlRGljdGlvbmFyeVxuKTogUHJvbWlzZTxMYXphZGFPcGVuUGxhdGZvcm1BUElSZXNwb25zZT4gPT4ge1xuICBjb25zdCBxcyA9IE9iamVjdC5hc3NpZ24oXG4gICAge30sXG4gICAgcGFyYW1zLFxuICAgIGdldFN5c3RlbVF1ZXJ5UGFyYW1PYmplY3QoYXBwS2V5LCBhcHBTZWNyZXQsIGFwaVBhdGgsIGFjY2Vzc1Rva2VuLCBwYXJhbXMpXG4gICk7XG5cbiAgcmV0dXJuIHJwKHtcbiAgICB1cmw6IGJhc2UgKyBhcGlQYXRoLFxuICAgIHFzLFxuICAgIGpzb246IHRydWUsXG4gIH0pLnRoZW4oKHJlc3BvbnNlKSA9PiB7XG4gICAgY29uc3QgbWV0YSA9IHtcbiAgICAgIG1ldGhvZDogXCJHRVRcIixcbiAgICAgIGFwaVBhdGgsXG4gICAgICBwYXlsb2FkOiBwYXJhbXMsXG4gICAgICBxdWVyeTogcXMsXG4gICAgfTtcbiAgICByZXR1cm4gaGFuZGxlTGF6YWRhUmVzcG9uc2UocmVzcG9uc2UsIG1ldGEpO1xuICB9KTtcbn07XG5cbmNvbnN0IHBvc3QgPSAoXG4gIGJhc2U6IHN0cmluZyxcbiAgYXBwS2V5OiBzdHJpbmcsXG4gIGFwcFNlY3JldDogc3RyaW5nLFxuICBhcGlQYXRoOiBzdHJpbmcsXG4gIGFjY2Vzc1Rva2VuOiA/c3RyaW5nLFxuICBib2R5PzogS2V5VmFsdWVEaWN0aW9uYXJ5LFxuICBleHRlbmRCb2R5PzogS2V5VmFsdWVEaWN0aW9uYXJ5XG4pOiBQcm9taXNlPExhemFkYU9wZW5QbGF0Zm9ybUFQSVJlc3BvbnNlPiA9PiB7XG4gIC8vIHR1cm5zIG91dCBldmVuIGl0J3MgSFRUUCBQT1NULCBMYXphZGEgZXhwZWN0IGBib2R5YCB0byBiZSBwYXJ0IG9mIHF1ZXJ5IHN0cmluZ1xuICBjb25zdCBxcyA9IE9iamVjdC5hc3NpZ24oXG4gICAge30sXG4gICAgYm9keSxcbiAgICBnZXRTeXN0ZW1RdWVyeVBhcmFtT2JqZWN0KGFwcEtleSwgYXBwU2VjcmV0LCBhcGlQYXRoLCBhY2Nlc3NUb2tlbiwgYm9keSlcbiAgKTtcblxuICByZXR1cm4gcnAoe1xuICAgIG1ldGhvZDogXCJQT1NUXCIsXG4gICAgdXJpOiBiYXNlICsgYXBpUGF0aCxcbiAgICBxcyxcbiAgICBqc29uOiB0cnVlLFxuICAgIGJvZHk6IE9iamVjdC5hc3NpZ24oYm9keSwgZXh0ZW5kQm9keSksXG4gIH0pLnRoZW4oKHJlc3BvbnNlKSA9PiB7XG4gICAgY29uc3QgbWV0YSA9IHtcbiAgICAgIG1ldGhvZDogXCJQT1NUXCIsXG4gICAgICBhcGlQYXRoLFxuICAgICAgcGF5bG9hZDogYm9keSxcbiAgICAgIHF1ZXJ5OiBxcyxcbiAgICB9O1xuICAgIHJldHVybiBoYW5kbGVMYXphZGFSZXNwb25zZShyZXNwb25zZSwgbWV0YSk7XG4gIH0pO1xufTtcblxuY29uc3QgdXBsb2FkRmlsZSA9IChcbiAgYmFzZTogc3RyaW5nLFxuICBhcHBLZXk6IHN0cmluZyxcbiAgYXBwU2VjcmV0OiBzdHJpbmcsXG4gIGFwaVBhdGg6IHN0cmluZyxcbiAgYWNjZXNzVG9rZW46ID9zdHJpbmcsXG4gIGZpbGVQYXRoOiBzdHJpbmcsXG4gIGJvZHk/OiBLZXlWYWx1ZURpY3Rpb25hcnlcbik6IFByb21pc2U8TGF6YWRhT3BlblBsYXRmb3JtQVBJUmVzcG9uc2U+ID0+IHtcbiAgLy8gdHVybnMgb3V0IGV2ZW4gaXQncyBIVFRQIFBPU1QsIExhemFkYSBleHBlY3QgYGJvZHlgIHRvIGJlIHBhcnQgb2YgcXVlcnkgc3RyaW5nXG4gIGNvbnN0IHFzID0gT2JqZWN0LmFzc2lnbihcbiAgICB7fSxcbiAgICBib2R5LFxuICAgIGdldFN5c3RlbVF1ZXJ5UGFyYW1PYmplY3QoYXBwS2V5LCBhcHBTZWNyZXQsIGFwaVBhdGgsIGFjY2Vzc1Rva2VuLCBib2R5KVxuICApO1xuICAvL2dldCBmb3JtZGF0YSBmcm9tIGJvZHlcbiAgbGV0IGZvcm1EYXRhID0gT2JqZWN0LmFzc2lnbihib2R5LCB7XG4gICAgZmlsZTogY3JlYXRlUmVhZFN0cmVhbShmaWxlUGF0aCksXG4gIH0pO1xuICByZXR1cm4gcnAoe1xuICAgIG1ldGhvZDogXCJQT1NUXCIsXG4gICAgdXJpOiBiYXNlICsgYXBpUGF0aCxcbiAgICBxcyxcbiAgICBqc29uOiB0cnVlLFxuICAgIGZvcm1EYXRhLFxuICB9KS50aGVuKChyZXNwb25zZSkgPT4ge1xuICAgIGNvbnN0IG1ldGEgPSB7XG4gICAgICBtZXRob2Q6IFwiUE9TVFwiLFxuICAgICAgYXBpUGF0aCxcbiAgICAgIHBheWxvYWQ6IGJvZHksXG4gICAgICBxdWVyeTogcXMsXG4gICAgfTtcbiAgICByZXR1cm4gaGFuZGxlTGF6YWRhUmVzcG9uc2UocmVzcG9uc2UsIG1ldGEpO1xuICB9KTtcbn07XG5cbi8qKlxuICogR2F0aGVyIHN5c3RlbSBhbmQgYnVzaW5lc3MgcGFyYW1ldGVycyB0byBjb21wdXRlIHNpZ25hdHVyZVxuICogQHBhcmFtIHtzdHJpbmd9IGFwcEtleVxuICogQHBhcmFtIHtzdHJpbmd9IGFwcFNlY3JldFxuICogQHBhcmFtIHtzdHJpbmd9IGFwaVBhdGhcbiAqIEBwYXJhbSB7c3RyaW5nP30gYWNjZXNzVG9rZW5cbiAqIEBwYXJhbSB7S2V5VmFsdWVEaWN0aW9uYXJ5P30gcGF5bG9hZFxuICogQHJldHVybiB7U3lzdGVtUXVlcnlQYXJhbXN9XG4gKi9cbmNvbnN0IGdldFN5c3RlbVF1ZXJ5UGFyYW1PYmplY3QgPSAoXG4gIGFwcEtleTogc3RyaW5nLFxuICBhcHBTZWNyZXQ6IHN0cmluZyxcbiAgYXBpUGF0aDogc3RyaW5nLFxuICBhY2Nlc3NUb2tlbjogP3N0cmluZyxcbiAgcGF5bG9hZD86IEtleVZhbHVlRGljdGlvbmFyeVxuKTogU3lzdGVtUXVlcnlQYXJhbXMgPT4ge1xuICBjb25zdCBzeXN0ZW1QYXJhbXM6IHtcbiAgICBhcHBfa2V5OiBzdHJpbmcsXG4gICAgdGltZXN0YW1wOiBzdHJpbmcsXG4gICAgc2lnbl9tZXRob2Q6IHN0cmluZyxcbiAgICBhY2Nlc3NfdG9rZW4/OiBzdHJpbmcsXG4gIH0gPSB7XG4gICAgYXBwX2tleTogYXBwS2V5LFxuICAgIHRpbWVzdGFtcDogRGF0ZS5ub3coKS50b1N0cmluZygpLFxuICAgIHNpZ25fbWV0aG9kOiBcInNoYTI1NlwiLFxuICB9O1xuXG4gIGlmIChhY2Nlc3NUb2tlbikge1xuICAgIHN5c3RlbVBhcmFtcy5hY2Nlc3NfdG9rZW4gPSBhY2Nlc3NUb2tlbjtcbiAgfVxuXG4gIHJldHVybiBPYmplY3QuYXNzaWduKFxuICAgIHt9LFxuICAgIHtcbiAgICAgIHNpZ246IHNpZ25SZXF1ZXN0KFxuICAgICAgICBhcHBTZWNyZXQsXG4gICAgICAgIGFwaVBhdGgsXG4gICAgICAgIE9iamVjdC5hc3NpZ24oe30sIHBheWxvYWQsIHN5c3RlbVBhcmFtcylcbiAgICAgICksXG4gICAgfSxcbiAgICBzeXN0ZW1QYXJhbXNcbiAgKTtcbn07XG5cbi8vIGNvbnN0cnVjdG9yXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgZ2V0OiBnZXQsXG4gIHBvc3Q6IHBvc3QsXG4gIHVwbG9hZEZpbGU6IHVwbG9hZEZpbGUsXG4gIGlzUmVzcG9uc2VTdWNjZXNzZnVsOiBpc1Jlc3BvbnNlU3VjY2Vzc2Z1bCxcbiAgLy8gaGVscGVyXG4gIGdldFN5c3RlbVF1ZXJ5UGFyYW1PYmplY3Q6IGdldFN5c3RlbVF1ZXJ5UGFyYW1PYmplY3QsXG59O1xuIl19