UNPKG

@rudderstack/integrations-lib

Version:
273 lines 35.8 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); const axios_1 = __importDefault(require("axios")); const utils_1 = require("./utils"); class SFMC { constructor(authObject) { SFMC.validateAuthObject(authObject); this.authObject = authObject; } static validateAuthObject(authObject) { if (!authObject) { throw new Error('authObject is required. See the readme.'); } const validations = [ { key: 'clientId', type: 'string', required: true }, { key: 'clientSecret', type: 'string', required: true }, { key: 'subDomain', type: 'string', required: true, regex: /^\w{28}$/gm, regexMessage: 'subDomain must be a string of length 28', }, ]; validations.forEach(({ key, type, required, regex, regexMessage }) => { const value = authObject[key]; if (required && !value) { throw new Error(`${key} is missing or invalid`); } if (typeof value !== type) { throw new TypeError(`${key} must be a ${type}`); } if (regex && !regex.test(value)) { throw new Error(regexMessage || `${key} does not match the required format`); } }); return authObject; } /** * This function returns the access token. If the token is expired, it will generate a new token. * @returns {Promise<AuthObject>} It returns the access token or error */ async getAccessToken() { if ((0, utils_1.isExpired)(this.authObject)) { try { await (0, utils_1.getToken)(this.authObject); } catch (e) { throw new Error(`Unable to generate token, with error:${e}`); } } return this.authObject; } /** * This method fetches the fields of a data extension. It requires the data extension id. The method returns the fields of the data extension. If the data extension is not found, it returns a RestError. * @param dataExtensionId Id of the data extension whose fields are to be fetched * @returns */ async getDestinationFields(dataExtensionId) { try { const restHeaders = { Authorization: `Bearer ${(await this.getAccessToken()).access_token}`, }; const requestOptions = { method: 'GET', baseURL: (0, utils_1.getUrl)(this.authObject.subDomain), url: `/data/v1/customobjects/${dataExtensionId}/fields`, headers: restHeaders, }; const resp = await (0, axios_1.default)(requestOptions); return resp.data; } catch (err) { throw new utils_1.RestError(err); } } /** * This method fetches the contact attributes. The method returns the contact attributes. If the contact attributes are not found, it returns a RestError. * @returns */ async getContactAttributes() { try { const restHeaders = { Authorization: `Bearer ${(await this.getAccessToken()).access_token}`, }; const requestOptions = { method: 'GET', baseURL: (0, utils_1.getUrl)(this.authObject.subDomain), url: '/contacts/v1/attributeSetDefinitions', headers: restHeaders, }; const resp = await (0, axios_1.default)(requestOptions); return resp.data; } catch (err) { throw new utils_1.RestError(err); } } /** * This method creates a data extension. It requires the data extension fields. The method returns the data extension created. If the data extension is not created, it returns a RestError. * @param body DataExtension fields * @returns */ async createDataExtension(body) { try { const restHeaders = { Authorization: `Bearer ${(await this.getAccessToken()).access_token}`, }; const requestOptions = { method: 'POST', baseURL: (0, utils_1.getUrl)(this.authObject.subDomain), url: '/data/v1/customobjects', headers: restHeaders, data: body, }; const resp = await (0, axios_1.default)(requestOptions); return resp.data; } catch (err) { throw new utils_1.RestError(err); } } /** * This method fetches the business units. The method returns the business units. If the business units are not found, it returns a SoapError. * @returns */ async getBusinessUnits() { try { const accessToken = (await this.getAccessToken()).access_token; const requestOptions = { method: 'POST', baseURL: `https://${this.authObject.subDomain}.soap.marketingcloudapis.com`, url: '/Service.asmx', headers: { SOAPAction: 'Retrieve', 'Content-Type': 'text/xml', }, data: await (0, utils_1.xmlBuilder)('BusinessUnit', ['name', 'id'], accessToken), }; const resp = await (0, axios_1.default)(requestOptions); const parsedData = (0, utils_1.parseXML)(resp.data); const res = parsedData.RetrieveResponseMsg?.Results; const businessUnits = []; if (res) { const createBusinessUnit = (response) => { const { PartnerProperties } = response; const entry = {}; PartnerProperties.forEach((prop) => { switch (prop.Name) { case 'name': entry.Name = prop.Value; break; case 'id': entry.ID = prop.Value; break; default: throw new utils_1.SoapError(`Unknown property: ${prop}`); } }); return entry; }; if (Array.isArray(res)) { res.forEach((eachRes) => { businessUnits.push(createBusinessUnit(eachRes)); }); } else { businessUnits.push(createBusinessUnit(res)); } return businessUnits; } throw new utils_1.SoapError('No Business Units found'); } catch (err) { throw new utils_1.SoapError(err); } } /** * This method fetches the data folders. It business unit id is provided all data folder under that business id would be retrieved otherwise all the data folder will be retrieved. The method returns the data folders. If the data folders are not found, it returns a SoapError. * @param businessUnitId this is the id of the business unit * @returns */ async getDataFolders(businessUnitId) { try { const accessToken = (await this.getAccessToken()).access_token; const requestOptions = { method: 'POST', baseURL: `https://${this.authObject.subDomain}.soap.marketingcloudapis.com`, url: '/Service.asmx', headers: { SOAPAction: 'Retrieve', 'Content-Type': 'text/xml', }, data: businessUnitId ? await (0, utils_1.xmlBuilder)('DataFolder', ['Name', 'ID', 'ParentFolder.ID'], accessToken, (0, utils_1.parseFilter)({ leftOperand: 'Client.ID', rightOperand: businessUnitId })) : await (0, utils_1.xmlBuilder)('DataFolder', ['Name', 'ID', 'ParentFolder.ID'], accessToken), }; const resp = await (0, axios_1.default)(requestOptions); const parsedData = (0, utils_1.parseXML)(resp.data); const res = parsedData.RetrieveResponseMsg?.Results; const dataFolders = []; if (res) { if (Array.isArray(res)) { res.forEach((eachRes) => { dataFolders.push(eachRes); }); } else { dataFolders.push(res); } return dataFolders; } throw new utils_1.SoapError('No Data Folder found'); } catch (err) { throw new utils_1.SoapError(err); } } /** * This function fetches the data extensions. It the data folder id is provided all the data extension under that data folder will be retrieved otherwise all the data extensions under the access token will be fetched. The method returns the data extensions. If the data extensions are not found, it returns a SoapError. * @param dataFolderId Id of the data folder * @returns */ async getDataExtensions(dataFolderId) { try { const accessToken = (await this.getAccessToken()).access_token; const requestOptions = { method: 'POST', baseURL: `https://${this.authObject.subDomain}.soap.marketingcloudapis.com`, url: '/Service.asmx', headers: { SOAPAction: 'Retrieve', 'Content-Type': 'text/xml', }, data: dataFolderId ? await (0, utils_1.xmlBuilder)('DataExtension', ['NAME', 'ObjectId', 'CategoryId'], accessToken, (0, utils_1.parseFilter)({ leftOperand: 'CategoryId', rightOperand: dataFolderId })) : await (0, utils_1.xmlBuilder)('DataExtension', ['NAME', 'ObjectId', 'CategoryId'], accessToken), }; const resp = await (0, axios_1.default)(requestOptions); const parsedData = (0, utils_1.parseXML)(resp.data); const res = parsedData.RetrieveResponseMsg?.Results; const dataExtensions = []; if (res) { if (Array.isArray(res)) { res.forEach((eachRes) => { dataExtensions.push({ ObjectId: eachRes.PartnerProperties[0].Value, Name: eachRes.PartnerProperties[1].Value, CategoryId: eachRes.PartnerProperties[2].Value, }); }); } else { dataExtensions.push({ ObjectId: res.PartnerProperties[0].Value, Name: res.PartnerProperties[1].Value, CategoryId: res.PartnerProperties[2].Value, }); } return dataExtensions; } throw new utils_1.SoapError('No Data Extension found'); } catch (err) { throw new utils_1.SoapError(err); } } } exports.default = SFMC; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvc2Rrcy9zZm1jL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsa0RBQTBCO0FBWTFCLG1DQVNpQjtBQUVqQixNQUFxQixJQUFJO0lBR3ZCLFlBQVksVUFBVTtRQUNwQixJQUFJLENBQUMsa0JBQWtCLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDcEMsSUFBSSxDQUFDLFVBQVUsR0FBRyxVQUFVLENBQUM7SUFDL0IsQ0FBQztJQUVPLE1BQU0sQ0FBQyxrQkFBa0IsQ0FBQyxVQUFlO1FBQy9DLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztZQUNoQixNQUFNLElBQUksS0FBSyxDQUFDLHlDQUF5QyxDQUFDLENBQUM7UUFDN0QsQ0FBQztRQUVELE1BQU0sV0FBVyxHQUFHO1lBQ2xCLEVBQUUsR0FBRyxFQUFFLFVBQVUsRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUU7WUFDbkQsRUFBRSxHQUFHLEVBQUUsY0FBYyxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRTtZQUN2RDtnQkFDRSxHQUFHLEVBQUUsV0FBVztnQkFDaEIsSUFBSSxFQUFFLFFBQVE7Z0JBQ2QsUUFBUSxFQUFFLElBQUk7Z0JBQ2QsS0FBSyxFQUFFLFlBQVk7Z0JBQ25CLFlBQVksRUFBRSx5Q0FBeUM7YUFDeEQ7U0FDRixDQUFDO1FBRUYsV0FBVyxDQUFDLE9BQU8sQ0FBQyxDQUFDLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFFLFlBQVksRUFBRSxFQUFFLEVBQUU7WUFDbkUsTUFBTSxLQUFLLEdBQUcsVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQzlCLElBQUksUUFBUSxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7Z0JBQ3ZCLE1BQU0sSUFBSSxLQUFLLENBQUMsR0FBRyxHQUFHLHdC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QkFDeEMsSUFBSSxFQUFFLEdBQUcsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLO3dCQUNwQyxVQUFVLEVBQUUsR0FBRyxDQUFDLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUs7cUJBQzNDLENBQUMsQ0FBQztnQkFDTCxDQUFDO2dCQUNELE9BQU8sY0FBYyxDQUFDO1lBQ3hCLENBQUM7WUFDRCxNQUFNLElBQUksaUJBQVMsQ0FBQyx5QkFBeUIsQ0FBQyxDQUFDO1FBQ2pELENBQUM7UUFBQyxPQUFPLEdBQUcsRUFBRSxDQUFDO1lBQ2IsTUFBTSxJQUFJLGlCQUFTLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDM0IsQ0FBQztJQUNILENBQUM7Q0FDRjtBQTNSRCx1QkEyUkMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgYXhpb3MgZnJvbSAnYXhpb3MnO1xuaW1wb3J0IHtcbiAgQXV0aE9iamVjdCxcbiAgQnVzaW5lc3NVbml0LFxuICBCdXNpbmVzc1VuaXRSZXNwb25zZSxcbiAgQ29udGFjdEF0dHJpYnV0ZXNSZXNwb25zZSxcbiAgQ3JlYXRlRGF0YUV4dGVuc2lvblJlc3BvbnNlLFxuICBEYXRhRXh0ZW5zaW9uLFxuICBEYXRhRXh0ZW5zaW9uQm9keSxcbiAgRGF0YUV4dGVuc2lvblJlc3BvbnNlLFxuICBEYXRhRm9sZGVyLFxufSBmcm9tICcuL3R5cGUnO1xuaW1wb3J0IHtcbiAgZ2V0VXJsLFxuICBpc0V4cGlyZWQsXG4gIHBhcnNlRmlsdGVyLFxuICBwYXJzZVhNTCxcbiAgZ2V0VG9rZW4sXG4gIFJlc3RFcnJvcixcbiAgU29hcEVycm9yLFxuICB4bWxCdWlsZGVyLFxufSBmcm9tICcuL3V0aWxzJztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgU0ZNQyB7XG4gIGF1dGhPYmplY3Q6IEF1dGhPYmplY3Q7XG5cbiAgY29uc3RydWN0b3IoYXV0aE9iamVjdCkge1xuICAgIFNGTUMudmFsaWRhdGVBdXRoT2JqZWN0KGF1dGhPYmplY3QpO1xuICAgIHRoaXMuYXV0aE9iamVjdCA9IGF1dGhPYmplY3Q7XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyB2YWxpZGF0ZUF1dGhPYmplY3QoYXV0aE9iamVjdDogYW55KTogYW55IHtcbiAgICBpZiAoIWF1dGhPYmplY3QpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignYXV0aE9iamVjdCBpcyByZXF1aXJlZC4gU2VlIHRoZSByZWFkbWUuJyk7XG4gICAgfVxuXG4gICAgY29uc3QgdmFsaWRhdGlvbnMgPSBbXG4gICAgICB7IGtleTogJ2NsaWVudElkJywgdHlwZTogJ3N0cmluZycsIHJlcXVpcmVkOiB0cnVlIH0sXG4gICAgICB7IGtleTogJ2NsaWVudFNlY3JldCcsIHR5cGU6ICdzdHJpbmcnLCByZXF1aXJlZDogdHJ1ZSB9LFxuICAgICAge1xuICAgICAgICBrZXk6ICdzdWJEb21haW4nLFxuICAgICAgICB0eXBlOiAnc3RyaW5nJyxcbiAgICAgICAgcmVxdWlyZWQ6IHRydWUsXG4gICAgICAgIHJlZ2V4OiAvXlxcd3syOH0kL2dtLFxuICAgICAgICByZWdleE1lc3NhZ2U6ICdzdWJEb21haW4gbXVzdCBiZSBhIHN0cmluZyBvZiBsZW5ndGggMjgnLFxuICAgICAgfSxcbiAgICBdO1xuXG4gICAgdmFsaWRhdGlvbnMuZm9yRWFjaCgoeyBrZXksIHR5cGUsIHJlcXVpcmVkLCByZWdleCwgcmVnZXhNZXNzYWdlIH0pID0+IHtcbiAgICAgIGNvbnN0IHZhbHVlID0gYXV0aE9iamVjdFtrZXldO1xuICAgICAgaWYgKHJlcXVpcmVkICYmICF2YWx1ZSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7a2V5fSBpcyBtaXNzaW5nIG9yIGludmFsaWRgKTtcbiAgICAgIH1cbiAgICAgIGlmICh0eXBlb2YgdmFsdWUgIT09IHR5cGUpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihgJHtrZXl9IG11c3QgYmUgYSAke3R5cGV9YCk7XG4gICAgICB9XG4gICAgICBpZiAocmVnZXggJiYgIXJlZ2V4LnRlc3QodmFsdWUpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihyZWdleE1lc3NhZ2UgfHwgYCR7a2V5fSBkb2VzIG5vdCBtYXRjaCB0aGUgcmVxdWlyZWQgZm9ybWF0YCk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICByZXR1cm4gYXV0aE9iamVjdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlIGFjY2VzcyB0b2tlbi4gSWYgdGhlIHRva2VuIGlzIGV4cGlyZWQsIGl0IHdpbGwgZ2VuZXJhdGUgYSBuZXcgdG9rZW4uXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPEF1dGhPYmplY3Q+fSAgSXQgcmV0dXJucyB0aGUgYWNjZXNzIHRva2VuIG9yIGVycm9yXG4gICAqL1xuICBhc3luYyBnZXRBY2Nlc3NUb2tlbigpIHtcbiAgICBpZiAoaXNFeHBpcmVkKHRoaXMuYXV0aE9iamVjdCkpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IGdldFRva2VuKHRoaXMuYXV0aE9iamVjdCk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5hYmxlIHRvIGdlbmVyYXRlIHRva2VuLCB3aXRoIGVycm9yOiR7ZX1gKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuYXV0aE9iamVjdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGlzIG1ldGhvZCBmZXRjaGVzIHRoZSBmaWVsZHMgb2YgYSBkYXRhIGV4dGVuc2lvbi4gSXQgcmVxdWlyZXMgdGhlIGRhdGEgZXh0ZW5zaW9uIGlkLiBUaGUgbWV0aG9kIHJldHVybnMgdGhlIGZpZWxkcyBvZiB0aGUgZGF0YSBleHRlbnNpb24uIElmIHRoZSBkYXRhIGV4dGVuc2lvbiBpcyBub3QgZm91bmQsIGl0IHJldHVybnMgYSBSZXN0RXJyb3IuXG4gICAqIEBwYXJhbSBkYXRhRXh0ZW5zaW9uSWQgSWQgb2YgdGhlIGRhdGEgZXh0ZW5zaW9uIHdob3NlIGZpZWxkcyBhcmUgdG8gYmUgZmV0Y2hlZFxuICAgKiBAcmV0dXJuc1xuICAgKi9cbiAgYXN5bmMgZ2V0RGVzdGluYXRpb25GaWVsZHMoZGF0YUV4dGVuc2lvbklkOiBzdHJpbmcpOiBQcm9taXNlPERhdGFFeHRlbnNpb25Cb2R5IHwgUmVzdEVycm9yPiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlc3RIZWFkZXJzID0ge1xuICAgICAgICBBdXRob3JpemF0aW9uOiBgQmVhcmVyICR7KGF3YWl0IHRoaXMuZ2V0QWNjZXNzVG9rZW4oKSkuYWNjZXNzX3Rva2VufWAsXG4gICAgICB9O1xuICAgICAgY29uc3QgcmVxdWVzdE9wdGlvbnMgPSB7XG4gICAgICAgIG1ldGhvZDogJ0dFVCcsXG4gICAgICAgIGJhc2VVUkw6IGdldFVybCh0aGlzLmF1dGhPYmplY3Quc3ViRG9tYWluKSxcbiAgICAgICAgdXJsOiBgL2RhdGEvdjEvY3VzdG9tb2JqZWN0cy8ke2RhdGFFeHRlbnNpb25JZH0vZmllbGRzYCxcbiAgICAgICAgaGVhZGVyczogcmVzdEhlYWRlcnMsXG4gICAgICB9O1xuICAgICAgY29uc3QgcmVzcCA9IGF3YWl0IGF4aW9zKHJlcXVlc3RPcHRpb25zKTtcbiAgICAgIHJldHVybiByZXNwLmRhdGE7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICB0aHJvdyBuZXcgUmVzdEVycm9yKGVycik7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFRoaXMgbWV0aG9kIGZldGNoZXMgdGhlIGNvbnRhY3QgYXR0cmlidXRlcy4gVGhlIG1ldGhvZCByZXR1cm5zIHRoZSBjb250YWN0IGF0dHJpYnV0ZXMuIElmIHRoZSBjb250YWN0IGF0dHJpYnV0ZXMgYXJlIG5vdCBmb3VuZCwgaXQgcmV0dXJucyBhIFJlc3RFcnJvci5cbiAgICogQHJldHVybnNcbiAgICovXG4gIGFzeW5jIGdldENvbnRhY3RBdHRyaWJ1dGVzKCk6IFByb21pc2U8Q29udGFjdEF0dHJpYnV0ZXNSZXNwb25zZSB8IFJlc3RFcnJvcj4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXN0SGVhZGVycyA9IHtcbiAgICAgICAgQXV0aG9yaXphdGlvbjogYEJlYXJlciAkeyhhd2FpdCB0aGlzLmdldEFjY2Vzc1Rva2VuKCkpLmFjY2Vzc190b2tlbn1gLFxuICAgICAgfTtcbiAgICAgIGNvbnN0IHJlcXVlc3RPcHRpb25zID0ge1xuICAgICAgICBtZXRob2Q6ICdHRVQnLFxuICAgICAgICBiYXNlVVJMOiBnZXRVcmwodGhpcy5hdXRoT2JqZWN0LnN1YkRvbWFpbiksXG4gICAgICAgIHVybDogJy9jb250YWN0cy92MS9hdHRyaWJ1dGVTZXREZWZpbml0aW9ucycsXG4gICAgICAgIGhlYWRlcnM6IHJlc3RIZWFkZXJzLFxuICAgICAgfTtcbiAgICAgIGNvbnN0IHJlc3AgPSBhd2FpdCBheGlvcyhyZXF1ZXN0T3B0aW9ucyk7XG4gICAgICByZXR1cm4gcmVzcC5kYXRhO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgdGhyb3cgbmV3IFJlc3RFcnJvcihlcnIpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBUaGlzIG1ldGhvZCBjcmVhdGVzIGEgZGF0YSBleHRlbnNpb24uIEl0IHJlcXVpcmVzIHRoZSBkYXRhIGV4dGVuc2lvbiBmaWVsZHMuIFRoZSBtZXRob2QgcmV0dXJucyB0aGUgZGF0YSBleHRlbnNpb24gY3JlYXRlZC4gSWYgdGhlIGRhdGEgZXh0ZW5zaW9uIGlzIG5vdCBjcmVhdGVkLCBpdCByZXR1cm5zIGEgUmVzdEVycm9yLlxuICAgKiBAcGFyYW0gYm9keSBEYXRhRXh0ZW5zaW9uIGZpZWxkc1xuICAgKiBAcmV0dXJuc1xuICAgKi9cbiAgYXN5bmMgY3JlYXRlRGF0YUV4dGVuc2lvbihcbiAgICBib2R5OiBEYXRhRXh0ZW5zaW9uQm9keSxcbiAgKTogUHJvbWlzZTxDcmVhdGVEYXRhRXh0ZW5zaW9uUmVzcG9uc2UgfCBSZXN0RXJyb3I+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzdEhlYWRlcnMgPSB7XG4gICAgICAgIEF1dGhvcml6YXRpb246IGBCZWFyZXIgJHsoYXdhaXQgdGhpcy5nZXRBY2Nlc3NUb2tlbigpKS5hY2Nlc3NfdG9rZW59YCxcbiAgICAgIH07XG4gICAgICBjb25zdCByZXF1ZXN0T3B0aW9ucyA9IHtcbiAgICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICAgIGJhc2VVUkw6IGdldFVybCh0aGlzLmF1dGhPYmplY3Quc3ViRG9tYWluKSxcbiAgICAgICAgdXJsOiAnL2RhdGEvdjEvY3VzdG9tb2JqZWN0cycsXG4gICAgICAgIGhlYWRlcnM6IHJlc3RIZWFkZXJzLFxuICAgICAgICBkYXRhOiBib2R5LFxuICAgICAgfTtcbiAgICAgIGNvbnN0IHJlc3AgPSBhd2FpdCBheGlvcyhyZXF1ZXN0T3B0aW9ucyk7XG4gICAgICByZXR1cm4gcmVzcC5kYXRhO1xuICAgIH0gY2F0Y2ggKGVycjogYW55KSB7XG4gICAgICB0aHJvdyBuZXcgUmVzdEVycm9yKGVycik7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFRoaXMgbWV0aG9kIGZldGNoZXMgdGhlIGJ1c2luZXNzIHVuaXRzLiBUaGUgbWV0aG9kIHJldHVybnMgdGhlIGJ1c2luZXNzIHVuaXRzLiBJZiB0aGUgYnVzaW5lc3MgdW5pdHMgYXJlIG5vdCBmb3VuZCwgaXQgcmV0dXJucyBhIFNvYXBFcnJvci5cbiAgICogQHJldHVybnNcbiAgICovXG4gIGFzeW5jIGdldEJ1c2luZXNzVW5pdHMoKTogUHJvbWlzZTxCdXNpbmVzc1VuaXRbXSB8IFNvYXBFcnJvcj4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBhY2Nlc3NUb2tlbiA9IChhd2FpdCB0aGlzLmdldEFjY2Vzc1Rva2VuKCkpLmFjY2Vzc190b2tlbjtcbiAgICAgIGNvbnN0IHJlcXVlc3RPcHRpb25zID0ge1xuICAgICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgICAgYmFzZVVSTDogYGh0dHBzOi8vJHt0aGlzLmF1dGhPYmplY3Quc3ViRG9tYWlufS5zb2FwLm1hcmtldGluZ2Nsb3VkYXBpcy5jb21gLFxuICAgICAgICB1cmw6ICcvU2VydmljZS5hc214JyxcbiAgICAgICAgaGVhZGVyczoge1xuICAgICAgICAgIFNPQVBBY3Rpb246ICdSZXRyaWV2ZScsXG4gICAgICAgICAgJ0NvbnRlbnQtVHlwZSc6ICd0ZXh0L3htbCcsXG4gICAgICAgIH0sXG4gICAgICAgIGRhdGE6IGF3YWl0IHhtbEJ1aWxkZXIoJ0J1c2luZXNzVW5pdCcsIFsnbmFtZScsICdpZCddLCBhY2Nlc3NUb2tlbiksXG4gICAgICB9O1xuICAgICAgY29uc3QgcmVzcCA9IGF3YWl0IGF4aW9zKHJlcXVlc3RPcHRpb25zKTtcbiAgICAgIGNvbnN0IHBhcnNlZERhdGEgPSBwYXJzZVhNTChyZXNwLmRhdGEpO1xuICAgICAgY29uc3QgcmVzID0gcGFyc2VkRGF0YS5SZXRyaWV2ZVJlc3BvbnNlTXNnPy5SZXN1bHRzIGFzXG4gICAgICAgIHwgQnVzaW5lc3NVbml0UmVzcG9uc2VcbiAgICAgICAgfCBCdXNpbmVzc1VuaXRSZXNwb25zZVtdO1xuICAgICAgY29uc3QgYnVzaW5lc3NVbml0czogQnVzaW5lc3NVbml0W10gPSBbXTtcbiAgICAgIGlmIChyZXMpIHtcbiAgICAgICAgY29uc3QgY3JlYXRlQnVzaW5lc3NVbml0ID0gKHJlc3BvbnNlOiBCdXNpbmVzc1VuaXRSZXNwb25zZSkgPT4ge1xuICAgICAgICAgIGNvbnN0IHsgUGFydG5lclByb3BlcnRpZXMgfSA9IHJlc3BvbnNlO1xuICAgICAgICAgIGNvbnN0IGVudHJ5ID0ge30gYXMgQnVzaW5lc3NVbml0O1xuICAgICAgICAgIFBhcnRuZXJQcm9wZXJ0aWVzLmZvckVhY2goKHByb3ApID0+IHtcbiAgICAgICAgICAgIHN3aXRjaCAocHJvcC5OYW1lKSB7XG4gICAgICAgICAgICAgIGNhc2UgJ25hbWUnOlxuICAgICAgICAgICAgICAgIGVudHJ5Lk5hbWUgPSBwcm9wLlZhbHVlIGFzIHN0cmluZztcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgY2FzZSAnaWQnOlxuICAgICAgICAgICAgICAgIGVudHJ5LklEID0gcHJvcC5WYWx1ZSBhcyBudW1iZXI7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFNvYXBFcnJvcihgVW5rbm93biBwcm9wZXJ0eTogJHtwcm9wfWApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgICAgIHJldHVybiBlbnRyeTtcbiAgICAgICAgfTtcblxuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShyZXMpKSB7XG4gICAgICAgICAgcmVzLmZvckVhY2goKGVhY2hSZXMpID0+IHtcbiAgICAgICAgICAgIGJ1c2luZXNzVW5pdHMucHVzaChjcmVhdGVCdXNpbmVzc1VuaXQoZWFjaFJlcykpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGJ1c2luZXNzVW5pdHMucHVzaChjcmVhdGVCdXNpbmVzc1VuaXQocmVzKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGJ1c2luZXNzVW5pdHM7XG4gICAgICB9XG4gICAgICB0aHJvdyBuZXcgU29hcEVycm9yKCdObyBCdXNpbmVzcyBVbml0cyBmb3VuZCcpO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgdGhyb3cgbmV3IFNvYXBFcnJvcihlcnIpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBUaGlzIG1ldGhvZCBmZXRjaGVzIHRoZSBkYXRhIGZvbGRlcnMuIEl0IGJ1c2luZXNzIHVuaXQgaWQgaXMgcHJvdmlkZWQgYWxsIGRhdGEgZm9sZGVyIHVuZGVyIHRoYXQgYnVzaW5lc3MgaWQgd291bGQgYmUgcmV0cmlldmVkIG90aGVyd2lzZSBhbGwgdGhlIGRhdGEgZm9sZGVyIHdpbGwgYmUgcmV0cmlldmVkLiBUaGUgbWV0aG9kIHJldHVybnMgdGhlIGRhdGEgZm9sZGVycy4gSWYgdGhlIGRhdGEgZm9sZGVycyBhcmUgbm90IGZvdW5kLCBpdCByZXR1cm5zIGEgU29hcEVycm9yLlxuICAgKiBAcGFyYW0gYnVzaW5lc3NVbml0SWQgdGhpcyBpcyB0aGUgaWQgb2YgdGhlIGJ1c2luZXNzIHVuaXRcbiAgICogQHJldHVybnNcbiAgICovXG4gIGFzeW5jIGdldERhdGFGb2xkZXJzKGJ1c2luZXNzVW5pdElkPzogc3RyaW5nKTogUHJvbWlzZTxEYXRhRm9sZGVyW10gfCBTb2FwRXJyb3I+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgYWNjZXNzVG9rZW4gPSAoYXdhaXQgdGhpcy5nZXRBY2Nlc3NUb2tlbigpKS5hY2Nlc3NfdG9rZW47XG4gICAgICBjb25zdCByZXF1ZXN0T3B0aW9ucyA9IHtcbiAgICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICAgIGJhc2VVUkw6IGBodHRwczovLyR7dGhpcy5hdXRoT2JqZWN0LnN1YkRvbWFpbn0uc29hcC5tYXJrZXRpbmdjbG91ZGFwaXMuY29tYCxcbiAgICAgICAgdXJsOiAnL1NlcnZpY2UuYXNteCcsXG4gICAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgICBTT0FQQWN0aW9uOiAnUmV0cmlldmUnLFxuICAgICAgICAgICdDb250ZW50LVR5cGUnOiAndGV4dC94bWwnLFxuICAgICAgICB9LFxuICAgICAgICBkYXRhOiBidXNpbmVzc1VuaXRJZFxuICAgICAgICAgID8gYXdhaXQgeG1sQnVpbGRlcihcbiAgICAgICAgICAgICAgJ0RhdGFGb2xkZXInLFxuICAgICAgICAgICAgICBbJ05hbWUnLCAnSUQnLCAnUGFyZW50Rm9sZGVyLklEJ10sXG4gICAgICAgICAgICAgIGFjY2Vzc1Rva2VuLFxuICAgICAgICAgICAgICBwYXJzZUZpbHRlcih7IGxlZnRPcGVyYW5kOiAnQ2xpZW50LklEJywgcmlnaHRPcGVyYW5kOiBidXNpbmVzc1VuaXRJZCB9KSxcbiAgICAgICAgICAgIClcbiAgICAgICAgICA6IGF3YWl0IHhtbEJ1aWxkZXIoJ0RhdGFGb2xkZXInLCBbJ05hbWUnLCAnSUQnLCAnUGFyZW50Rm9sZGVyLklEJ10sIGFjY2Vzc1Rva2VuKSxcbiAgICAgIH07XG4gICAgICBjb25zdCByZXNwID0gYXdhaXQgYXhpb3MocmVxdWVzdE9wdGlvbnMpO1xuICAgICAgY29uc3QgcGFyc2VkRGF0YSA9IHBhcnNlWE1MKHJlc3AuZGF0YSk7XG4gICAgICBjb25zdCByZXMgPSBwYXJzZWREYXRhLlJldHJpZXZlUmVzcG9uc2VNc2c/LlJlc3VsdHMgYXMgRGF0YUZvbGRlciB8IERhdGFGb2xkZXJbXTtcbiAgICAgIGNvbnN0IGRhdGFGb2xkZXJzOiBEYXRhRm9sZGVyW10gPSBbXTtcbiAgICAgIGlmIChyZXMpIHtcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkocmVzKSkge1xuICAgICAgICAgIHJlcy5mb3JFYWNoKChlYWNoUmVzKSA9PiB7XG4gICAgICAgICAgICBkYXRhRm9sZGVycy5wdXNoKGVhY2hSZXMpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGRhdGFGb2xkZXJzLnB1c2gocmVzKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZGF0YUZvbGRlcnM7XG4gICAgICB9XG4gICAgICB0aHJvdyBuZXcgU29hcEVycm9yKCdObyBEYXRhIEZvbGRlciBmb3VuZCcpO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgdGhyb3cgbmV3IFNvYXBFcnJvcihlcnIpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBUaGlzIGZ1bmN0aW9uIGZldGNoZXMgdGhlIGRhdGEgZXh0ZW5zaW9ucy4gSXQgdGhlIGRhdGEgZm9sZGVyIGlkIGlzIHByb3ZpZGVkIGFsbCB0aGUgZGF0YSBleHRlbnNpb24gdW5kZXIgdGhhdCBkYXRhIGZvbGRlciB3aWxsIGJlIHJldHJpZXZlZCBvdGhlcndpc2UgYWxsIHRoZSBkYXRhIGV4dGVuc2lvbnMgdW5kZXIgdGhlIGFjY2VzcyB0b2tlbiB3aWxsIGJlIGZldGNoZWQuIFRoZSBtZXRob2QgcmV0dXJucyB0aGUgZGF0YSBleHRlbnNpb25zLiBJZiB0aGUgZGF0YSBleHRlbnNpb25zIGFyZSBub3QgZm91bmQsIGl0IHJldHVybnMgYSBTb2FwRXJyb3IuXG4gICAqIEBwYXJhbSBkYXRhRm9sZGVySWQgSWQgb2YgdGhlIGRhdGEgZm9sZGVyXG4gICAqIEByZXR1cm5zXG4gICAqL1xuICBhc3luYyBnZXREYXRhRXh0ZW5zaW9ucyhkYXRhRm9sZGVySWQ/OiBzdHJpbmcpOiBQcm9taXNlPERhdGFFeHRlbnNpb25bXSB8IFNvYXBFcnJvcj4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBhY2Nlc3NUb2tlbiA9IChhd2FpdCB0aGlzLmdldEFjY2Vzc1Rva2VuKCkpLmFjY2Vzc190b2tlbjtcbiAgICAgIGNvbnN0IHJlcXVlc3RPcHRpb25zID0ge1xuICAgICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgICAgYmFzZVVSTDogYGh0dHBzOi8vJHt0aGlzLmF1dGhPYmplY3Quc3ViRG9tYWlufS5zb2FwLm1hcmtldGluZ2Nsb3VkYXBpcy5jb21gLFxuICAgICAgICB1cmw6ICcvU2VydmljZS5hc214JyxcbiAgICAgICAgaGVhZGVyczoge1xuICAgICAgICAgIFNPQVBBY3Rpb246ICdSZXRyaWV2ZScsXG4gICAgICAgICAgJ0NvbnRlbnQtVHlwZSc6ICd0ZXh0L3htbCcsXG4gICAgICAgIH0sXG4gICAgICAgIGRhdGE6IGRhdGFGb2xkZXJJZFxuICAgICAgICAgID8gYXdhaXQgeG1sQnVpbGRlcihcbiAgICAgICAgICAgICAgJ0RhdGFFeHRlbnNpb24nLFxuICAgICAgICAgICAgICBbJ05BTUUnLCAnT2JqZWN0SWQnLCAnQ2F0ZWdvcnlJZCddLFxuICAgICAgICAgICAgICBhY2Nlc3NUb2tlbixcbiAgICAgICAgICAgICAgcGFyc2VGaWx0ZXIoeyBsZWZ0T3BlcmFuZDogJ0NhdGVnb3J5SWQnLCByaWdodE9wZXJhbmQ6IGRhdGFGb2xkZXJJZCB9KSxcbiAgICAgICAgICAgIClcbiAgICAgICAgICA6IGF3YWl0IHhtbEJ1aWxkZXIoJ0RhdGFFeHRlbnNpb24nLCBbJ05BTUUnLCAnT2JqZWN0SWQnLCAnQ2F0ZWdvcnlJZCddLCBhY2Nlc3NUb2tlbiksXG4gICAgICB9O1xuICAgICAgY29uc3QgcmVzcCA9IGF3YWl0IGF4aW9zKHJlcXVlc3RPcHRpb25zKTtcbiAgICAgIGNvbnN0IHBhcnNlZERhdGEgPSBwYXJzZVhNTChyZXNwLmRhdGEpO1xuICAgICAgY29uc3QgcmVzID0gcGFyc2VkRGF0YS5SZXRyaWV2ZVJlc3BvbnNlTXNnPy5SZXN1bHRzIGFzXG4gICAgICAgIHwgRGF0YUV4dGVuc2lvblJlc3BvbnNlXG4gICAgICAgIHwgRGF0YUV4dGVuc2lvblJlc3BvbnNlW107XG4gICAgICBjb25zdCBkYXRhRXh0ZW5zaW9uczogRGF0YUV4dGVuc2lvbltdID0gW107XG4gICAgICBpZiAocmVzKSB7XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KHJlcykpIHtcbiAgICAgICAgICByZXMuZm9yRWFjaCgoZWFjaFJlcykgPT4ge1xuICAgICAgICAgICAgZGF0YUV4dGVuc2lvbnMucHVzaCh7XG4gICAgICAgICAgICAgIE9iamVjdElkOiBlYWNoUmVzLlBhcnRuZXJQcm9wZXJ0aWVzWzBdLlZhbHVlLFxuICAgICAgICAgICAgICBOYW1lOiBlYWNoUmVzLlBhcnRuZXJQcm9wZXJ0aWVzWzFdLlZhbHVlLFxuICAgICAgICAgICAgICBDYXRlZ29yeUlkOiBlYWNoUmVzLlBhcnRuZXJQcm9wZXJ0aWVzWzJdLlZhbHVlLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZGF0YUV4dGVuc2lvbnMucHVzaCh7XG4gICAgICAgICAgICBPYmplY3RJZDogcmVzLlBhcnRuZXJQcm9wZXJ0aWVzWzBdLlZhbHVlLFxuICAgICAgICAgICAgTmFtZTogcmVzLlBhcnRuZXJQcm9wZXJ0aWVzWzFdLlZhbHVlLFxuICAgICAgICAgICAgQ2F0ZWdvcnlJZDogcmVzLlBhcnRuZXJQcm9wZXJ0aWVzWzJdLlZhbHVlLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBkYXRhRXh0ZW5zaW9ucztcbiAgICAgIH1cbiAgICAgIHRocm93IG5ldyBTb2FwRXJyb3IoJ05vIERhdGEgRXh0ZW5zaW9uIGZvdW5kJyk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICB0aHJvdyBuZXcgU29hcEVycm9yKGVycik7XG4gICAgfVxuICB9XG59XG4iXX0=