UNPKG

metaapi.cloud-sdk

Version:

SDK for MetaApi, a professional cloud forex API which includes MetaTrader REST API and MetaTrader websocket API. Supports both MetaTrader 5 (MT5) and MetaTrader 4 (MT4). CopyFactory copy trading API included. (https://metaapi.cloud)

215 lines (214 loc) 26 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); Object.defineProperty(exports, "default", { enumerable: true, get: function() { return ProvisioningProfileClient; } }); const _fs = /*#__PURE__*/ _interop_require_default(require("fs")); const _metaApiclient = /*#__PURE__*/ _interop_require_default(require("../metaApi.client")); const _formdata = /*#__PURE__*/ _interop_require_default(require("form-data")); function _interop_require_default(obj) { return obj && obj.__esModule ? obj : { default: obj }; } let ProvisioningProfileClient = class ProvisioningProfileClient extends _metaApiclient.default { /** * Provisioning profile model * @typedef {Object} ProvisioningProfileDto * @property {String} _id provisioning profile unique identifier * @property {String} name provisioning profile name * @property {Number} version MetaTrader version (allowed values are 4 and 5) * @property {String} status provisioning profile status (allowed values are new and active) * @property {String} brokerTimezone broker timezone name from Time Zone Database * @property {String} brokerDSTSwitchTimezone broker DST switch timezone name from Time Zone Database */ /** * MT version * @typedef {4 | 5} Version */ /** * Provisioning profile type * @typedef {'mtTerminal' | 'managerApi'} ProvisioningProfileType */ /** * Provisioning profile status * @typedef {'new' | 'active'} ProvisioningProfileStatus */ /** * Get provisioning profiles API version * @typedef {'1' | '2'} GetProvisioningProfilesApiVersion */ /** * @typedef {Object} ProvisioningProfilesFilter * @property {number} [offset] Search offset (defaults to 0) (must be greater or equal to 0) * @property {number} [limit] Search limit (defaults to 1000) * (must be greater or equal to 1 and less or equal to 1000) * @property {Version} [version] MT version * @property {ProvisioningProfileType} [type] Profile type * @property {ProvisioningProfileStatus} [status] Profile status * @property {string} [query] Partially search over provisioning profile name to match query */ /** * Provisioning profiles list model * @typedef {Object} ProvisioningProfilesListDto * @property {String} count provisioning profiles count * @property {Array<ProvisioningProfileDto>} items provisioning profiles list */ /** * Retrieves provisioning profiles owned by user * (see https://metaapi.cloud/docs/provisioning/api/provisioningProfile/readProvisioningProfiles/) * Method is accessible only with API access token * @param {ProvisioningProfilesFilter} [profilesFilter] provisioning profiles filter * @param {GetProvisioningProfilesApiVersion} [apiVersion] api version to use * @return {Promise<Array<ProvisioningProfileDto> | ProvisioningProfilesListDto>} promise resolving with provisioning profiles found */ getProvisioningProfiles(profilesFilter = {}, apiVersion) { if (this._isNotJwtToken()) { return this._handleNoAccessError("getProvisioningProfiles"); } const opts = { url: `${this._host}/users/current/provisioning-profiles`, method: "GET", params: profilesFilter, headers: { "auth-token": this._token }, json: true }; if (apiVersion) { opts.headers["api-version"] = apiVersion; } return this._httpClient.request(opts, "getProvisioningProfiles"); } /** * Retrieves a provisioning profile by id (see * https://metaapi.cloud/docs/provisioning/api/provisioningProfile/readProvisioningProfile/). Throws an error if * profile is not found. * Method is accessible only with API access token * @param {String} id provisioning profile id * @return {Promise<ProvisioningProfileDto>} promise resolving with provisioning profile found */ getProvisioningProfile(id) { if (this._isNotJwtToken()) { return this._handleNoAccessError("getProvisioningProfile"); } const opts = { url: `${this._host}/users/current/provisioning-profiles/${id}`, method: "GET", headers: { "auth-token": this._token }, json: true }; return this._httpClient.request(opts, "getProvisioningProfile"); } /** * New provisioning profile model * @typedef {Object} NewProvisioningProfileDto * @property {String} name provisioning profile name * @property {Number} version MetaTrader version (allowed values are 4 and 5) * @property {String} brokerTimezone broker timezone name from Time Zone Database * @property {String} brokerDSTSwitchTimezone broker DST switch timezone name from Time Zone Database */ /** * Provisioning profile id model * @typedef {Object} ProvisioningProfileIdDto * @property {String} id provisioning profile unique identifier */ /** * Creates a new provisioning profile (see * https://metaapi.cloud/docs/provisioning/api/provisioningProfile/createNewProvisioningProfile/). After creating a * provisioning profile you are required to upload extra files in order to activate the profile for further use. * Method is accessible only with API access token * @param {NewProvisioningProfileDto} provisioningProfile provisioning profile to create * @return {Promise<ProvisioningProfileIdDto>} promise resolving with an id of the provisioning profile created */ createProvisioningProfile(provisioningProfile) { if (this._isNotJwtToken()) { return this._handleNoAccessError("createProvisioningProfile"); } const opts = { url: `${this._host}/users/current/provisioning-profiles`, method: "POST", headers: { "auth-token": this._token }, json: true, data: provisioningProfile }; return this._httpClient.request(opts, "createProvisioningProfile"); } /** * Uploads a file to a provisioning profile (see * https://metaapi.cloud/docs/provisioning/api/provisioningProfile/uploadFilesToProvisioningProfile/). Uploading a * file by name is allowed only for Node.js. * Method is accessible only with API access token * @param {String} provisioningProfileId provisioning profile id to upload file to * @param {String} fileName name of the file to upload. Allowed values are servers.dat for MT5 profile, broker.srv for * MT4 profile * @param {String|Buffer} file path to a file to upload or buffer containing file contents * @return {Promise} promise resolving when file upload is completed */ uploadProvisioningProfileFile(provisioningProfileId, fileName, file) { if (this._isNotJwtToken()) { return this._handleNoAccessError("uploadProvisioningProfileFile"); } const formData = new _formdata.default(); if (typeof file === "string") { file = _fs.default.createReadStream(file); formData.append("file", file); } else { formData.append("file", file, "serverFile"); } const opts = { method: "PUT", url: `${this._host}/users/current/provisioning-profiles/${provisioningProfileId}/${fileName}`, data: formData, headers: { ...formData.getHeaders(), "auth-token": this._token } }; return this._httpClient.request(opts, "uploadProvisioningProfileFile"); } /** * Deletes a provisioning profile (see * https://metaapi.cloud/docs/provisioning/api/provisioningProfile/deleteProvisioningProfile/). Please note that in * order to delete a provisioning profile you need to delete MT accounts connected to it first. * Method is accessible only with API access token * @param {String} id provisioning profile id * @return {Promise} promise resolving when provisioning profile is deleted */ deleteProvisioningProfile(id) { if (this._isNotJwtToken()) { return this._handleNoAccessError("deleteProvisioningProfile"); } const opts = { url: `${this._host}/users/current/provisioning-profiles/${id}`, method: "DELETE", headers: { "auth-token": this._token }, json: true }; return this._httpClient.request(opts, "deleteProvisioningProfile"); } /** * Updated provisioning profile data * @typedef {Object} ProvisioningProfileUpdateDto * @property {String} name provisioning profile name */ /** * Updates existing provisioning profile data (see * https://metaapi.cloud/docs/provisioning/api/provisioningProfile/updateProvisioningProfile/). * Method is accessible only with API access token * @param {String} id provisioning profile id * @param {ProvisioningProfileUpdateDto} provisioningProfile updated provisioning profile * @return {Promise} promise resolving when provisioning profile is updated */ updateProvisioningProfile(id, provisioningProfile) { if (this._isNotJwtToken()) { return this._handleNoAccessError("updateProvisioningProfile"); } const opts = { url: `${this._host}/users/current/provisioning-profiles/${id}`, method: "PUT", headers: { "auth-token": this._token }, json: true, data: provisioningProfile }; return this._httpClient.request(opts, "updateProvisioningProfile"); } }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIjxhbm9uPiJdLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHN0cmljdCc7XG5cbmltcG9ydCBmcyBmcm9tICdmcyc7XG5cbmltcG9ydCBNZXRhQXBpQ2xpZW50IGZyb20gJy4uL21ldGFBcGkuY2xpZW50JztcbmltcG9ydCBGb3JtRGF0YSBmcm9tICdmb3JtLWRhdGEnO1xuXG4vKipcbiAqIG1ldGFhcGkuY2xvdWQgcHJvdmlzaW9uaW5nIHByb2ZpbGUgQVBJIGNsaWVudCAoc2VlIGh0dHBzOi8vbWV0YWFwaS5jbG91ZC9kb2NzL3Byb3Zpc2lvbmluZy8pXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFByb3Zpc2lvbmluZ1Byb2ZpbGVDbGllbnQgZXh0ZW5kcyBNZXRhQXBpQ2xpZW50IHtcblxuICAvKipcbiAgICogUHJvdmlzaW9uaW5nIHByb2ZpbGUgbW9kZWxcbiAgICogQHR5cGVkZWYge09iamVjdH0gUHJvdmlzaW9uaW5nUHJvZmlsZUR0b1xuICAgKiBAcHJvcGVydHkge1N0cmluZ30gX2lkIHByb3Zpc2lvbmluZyBwcm9maWxlIHVuaXF1ZSBpZGVudGlmaWVyXG4gICAqIEBwcm9wZXJ0eSB7U3RyaW5nfSBuYW1lIHByb3Zpc2lvbmluZyBwcm9maWxlIG5hbWVcbiAgICogQHByb3BlcnR5IHtOdW1iZXJ9IHZlcnNpb24gTWV0YVRyYWRlciB2ZXJzaW9uIChhbGxvd2VkIHZhbHVlcyBhcmUgNCBhbmQgNSlcbiAgICogQHByb3BlcnR5IHtTdHJpbmd9IHN0YXR1cyBwcm92aXNpb25pbmcgcHJvZmlsZSBzdGF0dXMgKGFsbG93ZWQgdmFsdWVzIGFyZSBuZXcgYW5kIGFjdGl2ZSlcbiAgICogQHByb3BlcnR5IHtTdHJpbmd9IGJyb2tlclRpbWV6b25lIGJyb2tlciB0aW1lem9uZSBuYW1lIGZyb20gVGltZSBab25lIERhdGFiYXNlXG4gICAqIEBwcm9wZXJ0eSB7U3RyaW5nfSBicm9rZXJEU1RTd2l0Y2hUaW1lem9uZSBicm9rZXIgRFNUIHN3aXRjaCB0aW1lem9uZSBuYW1lIGZyb20gVGltZSBab25lIERhdGFiYXNlXG4gICAqL1xuXG4gIC8qKlxuICAgKiBNVCB2ZXJzaW9uXG4gICAqIEB0eXBlZGVmIHs0IHwgNX0gVmVyc2lvblxuICAgKi9cblxuICAvKipcbiAgICogUHJvdmlzaW9uaW5nIHByb2ZpbGUgdHlwZVxuICAgKiBAdHlwZWRlZiB7J210VGVybWluYWwnIHwgJ21hbmFnZXJBcGknfSBQcm92aXNpb25pbmdQcm9maWxlVHlwZVxuICAgKi9cblxuICAvKipcbiAgICogUHJvdmlzaW9uaW5nIHByb2ZpbGUgc3RhdHVzXG4gICAqIEB0eXBlZGVmIHsnbmV3JyB8ICdhY3RpdmUnfSBQcm92aXNpb25pbmdQcm9maWxlU3RhdHVzXG4gICAqL1xuXG4gIC8qKlxuICAgKiBHZXQgcHJvdmlzaW9uaW5nIHByb2ZpbGVzIEFQSSB2ZXJzaW9uXG4gICAqIEB0eXBlZGVmIHsnMScgfCAnMid9IEdldFByb3Zpc2lvbmluZ1Byb2ZpbGVzQXBpVmVyc2lvblxuICAgKi9cblxuICAvKipcbiAgICogQHR5cGVkZWYge09iamVjdH0gUHJvdmlzaW9uaW5nUHJvZmlsZXNGaWx0ZXJcbiAgICogQHByb3BlcnR5IHtudW1iZXJ9IFtvZmZzZXRdIFNlYXJjaCBvZmZzZXQgKGRlZmF1bHRzIHRvIDApIChtdXN0IGJlIGdyZWF0ZXIgb3IgZXF1YWwgdG8gMClcbiAgICogQHByb3BlcnR5IHtudW1iZXJ9IFtsaW1pdF0gU2VhcmNoIGxpbWl0IChkZWZhdWx0cyB0byAxMDAwKSBcbiAgICogKG11c3QgYmUgZ3JlYXRlciBvciBlcXVhbCB0byAxIGFuZCBsZXNzIG9yIGVxdWFsIHRvIDEwMDApXG4gICAqIEBwcm9wZXJ0eSB7VmVyc2lvbn0gW3ZlcnNpb25dIE1UIHZlcnNpb25cbiAgICogQHByb3BlcnR5IHtQcm92aXNpb25pbmdQcm9maWxlVHlwZX0gW3R5cGVdIFByb2ZpbGUgdHlwZVxuICAgKiBAcHJvcGVydHkge1Byb3Zpc2lvbmluZ1Byb2ZpbGVTdGF0dXN9IFtzdGF0dXNdIFByb2ZpbGUgc3RhdHVzXG4gICAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbcXVlcnldIFBhcnRpYWxseSBzZWFyY2ggb3ZlciBwcm92aXNpb25pbmcgcHJvZmlsZSBuYW1lIHRvIG1hdGNoIHF1ZXJ5XG4gICAqL1xuXG4gIC8qKlxuICAgKiBQcm92aXNpb25pbmcgcHJvZmlsZXMgbGlzdCBtb2RlbFxuICAgKiBAdHlwZWRlZiB7T2JqZWN0fSBQcm92aXNpb25pbmdQcm9maWxlc0xpc3REdG9cbiAgICogQHByb3BlcnR5IHtTdHJpbmd9IGNvdW50IHByb3Zpc2lvbmluZyBwcm9maWxlcyBjb3VudFxuICAgKiBAcHJvcGVydHkge0FycmF5PFByb3Zpc2lvbmluZ1Byb2ZpbGVEdG8+fSBpdGVtcyBwcm92aXNpb25pbmcgcHJvZmlsZXMgbGlzdFxuICAgKi9cblxuXG4gIC8qKlxuICAgKiBSZXRyaWV2ZXMgcHJvdmlzaW9uaW5nIHByb2ZpbGVzIG93bmVkIGJ5IHVzZXJcbiAgICogKHNlZSBodHRwczovL21ldGFhcGkuY2xvdWQvZG9jcy9wcm92aXNpb25pbmcvYXBpL3Byb3Zpc2lvbmluZ1Byb2ZpbGUvcmVhZFByb3Zpc2lvbmluZ1Byb2ZpbGVzLylcbiAgICogTWV0aG9kIGlzIGFjY2Vzc2libGUgb25seSB3aXRoIEFQSSBhY2Nlc3MgdG9rZW5cbiAgICogQHBhcmFtIHtQcm92aXNpb25pbmdQcm9maWxlc0ZpbHRlcn0gW3Byb2ZpbGVzRmlsdGVyXSBwcm92aXNpb25pbmcgcHJvZmlsZXMgZmlsdGVyXG4gICAqIEBwYXJhbSB7R2V0UHJvdmlzaW9uaW5nUHJvZmlsZXNBcGlWZXJzaW9ufSBbYXBpVmVyc2lvbl0gYXBpIHZlcnNpb24gdG8gdXNlXG4gICAqIEByZXR1cm4ge1Byb21pc2U8QXJyYXk8UHJvdmlzaW9uaW5nUHJvZmlsZUR0bz4gfCBQcm92aXNpb25pbmdQcm9maWxlc0xpc3REdG8+fSBwcm9taXNlIHJlc29sdmluZyB3aXRoIHByb3Zpc2lvbmluZyBwcm9maWxlcyBmb3VuZFxuICAgKi9cbiAgZ2V0UHJvdmlzaW9uaW5nUHJvZmlsZXMocHJvZmlsZXNGaWx0ZXIgPSB7fSwgYXBpVmVyc2lvbikge1xuICAgIGlmICh0aGlzLl9pc05vdEp3dFRva2VuKCkpIHtcbiAgICAgIHJldHVybiB0aGlzLl9oYW5kbGVOb0FjY2Vzc0Vycm9yKCdnZXRQcm92aXNpb25pbmdQcm9maWxlcycpO1xuICAgIH1cbiAgICBjb25zdCBvcHRzID0ge1xuICAgICAgdXJsOiBgJHt0aGlzLl9ob3N0fS91c2Vycy9jdXJyZW50L3Byb3Zpc2lvbmluZy1wcm9maWxlc2AsXG4gICAgICBtZXRob2Q6ICdHRVQnLFxuICAgICAgcGFyYW1zOiBwcm9maWxlc0ZpbHRlcixcbiAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgJ2F1dGgtdG9rZW4nOiB0aGlzLl90b2tlblxuICAgICAgfSxcbiAgICAgIGpzb246IHRydWVcbiAgICB9O1xuICAgIGlmIChhcGlWZXJzaW9uKSB7XG4gICAgICBvcHRzLmhlYWRlcnNbJ2FwaS12ZXJzaW9uJ10gPSBhcGlWZXJzaW9uO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5faHR0cENsaWVudC5yZXF1ZXN0KG9wdHMsICdnZXRQcm92aXNpb25pbmdQcm9maWxlcycpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHJpZXZlcyBhIHByb3Zpc2lvbmluZyBwcm9maWxlIGJ5IGlkIChzZWVcbiAgICogaHR0cHM6Ly9tZXRhYXBpLmNsb3VkL2RvY3MvcHJvdmlzaW9uaW5nL2FwaS9wcm92aXNpb25pbmdQcm9maWxlL3JlYWRQcm92aXNpb25pbmdQcm9maWxlLykuIFRocm93cyBhbiBlcnJvciBpZlxuICAgKiBwcm9maWxlIGlzIG5vdCBmb3VuZC5cbiAgICogTWV0aG9kIGlzIGFjY2Vzc2libGUgb25seSB3aXRoIEFQSSBhY2Nlc3MgdG9rZW5cbiAgICogQHBhcmFtIHtTdHJpbmd9IGlkIHByb3Zpc2lvbmluZyBwcm9maWxlIGlkXG4gICAqIEByZXR1cm4ge1Byb21pc2U8UHJvdmlzaW9uaW5nUHJvZmlsZUR0bz59IHByb21pc2UgcmVzb2x2aW5nIHdpdGggcHJvdmlzaW9uaW5nIHByb2ZpbGUgZm91bmRcbiAgICovXG4gIGdldFByb3Zpc2lvbmluZ1Byb2ZpbGUoaWQpIHtcbiAgICBpZiAodGhpcy5faXNOb3RKd3RUb2tlbigpKSB7XG4gICAgICByZXR1cm4gdGhpcy5faGFuZGxlTm9BY2Nlc3NFcnJvcignZ2V0UHJvdmlzaW9uaW5nUHJvZmlsZScpO1xuICAgIH1cbiAgICBjb25zdCBvcHRzID0ge1xuICAgICAgdXJsOiBgJHt0aGlzLl9ob3N0fS91c2Vycy9jdXJyZW50L3Byb3Zpc2lvbmluZy1wcm9maWxlcy8ke2lkfWAsXG4gICAgICBtZXRob2Q6ICdHRVQnLFxuICAgICAgaGVhZGVyczoge1xuICAgICAgICAnYXV0aC10b2tlbic6IHRoaXMuX3Rva2VuXG4gICAgICB9LFxuICAgICAganNvbjogdHJ1ZVxuICAgIH07XG4gICAgcmV0dXJuIHRoaXMuX2h0dHBDbGllbnQucmVxdWVzdChvcHRzLCAnZ2V0UHJvdmlzaW9uaW5nUHJvZmlsZScpO1xuICB9XG5cbiAgLyoqXG4gICAqIE5ldyBwcm92aXNpb25pbmcgcHJvZmlsZSBtb2RlbFxuICAgKiBAdHlwZWRlZiB7T2JqZWN0fSBOZXdQcm92aXNpb25pbmdQcm9maWxlRHRvXG4gICAqIEBwcm9wZXJ0eSB7U3RyaW5nfSBuYW1lIHByb3Zpc2lvbmluZyBwcm9maWxlIG5hbWVcbiAgICogQHByb3BlcnR5IHtOdW1iZXJ9IHZlcnNpb24gTWV0YVRyYWRlciB2ZXJzaW9uIChhbGxvd2VkIHZhbHVlcyBhcmUgNCBhbmQgNSlcbiAgICogQHByb3BlcnR5IHtTdHJpbmd9IGJyb2tlclRpbWV6b25lIGJyb2tlciB0aW1lem9uZSBuYW1lIGZyb20gVGltZSBab25lIERhdGFiYXNlXG4gICAqIEBwcm9wZXJ0eSB7U3RyaW5nfSBicm9rZXJEU1RTd2l0Y2hUaW1lem9uZSBicm9rZXIgRFNUIHN3aXRjaCB0aW1lem9uZSBuYW1lIGZyb20gVGltZSBab25lIERhdGFiYXNlXG4gICAqL1xuXG4gIC8qKlxuICAgKiBQcm92aXNpb25pbmcgcHJvZmlsZSBpZCBtb2RlbFxuICAgKiBAdHlwZWRlZiB7T2JqZWN0fSBQcm92aXNpb25pbmdQcm9maWxlSWREdG9cbiAgICogQHByb3BlcnR5IHtTdHJpbmd9IGlkIHByb3Zpc2lvbmluZyBwcm9maWxlIHVuaXF1ZSBpZGVudGlmaWVyXG4gICAqL1xuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgbmV3IHByb3Zpc2lvbmluZyBwcm9maWxlIChzZWVcbiAgICogaHR0cHM6Ly9tZXRhYXBpLmNsb3VkL2RvY3MvcHJvdmlzaW9uaW5nL2FwaS9wcm92aXNpb25pbmdQcm9maWxlL2NyZWF0ZU5ld1Byb3Zpc2lvbmluZ1Byb2ZpbGUvKS4gQWZ0ZXIgY3JlYXRpbmcgYVxuICAgKiBwcm92aXNpb25pbmcgcHJvZmlsZSB5b3UgYXJlIHJlcXVpcmVkIHRvIHVwbG9hZCBleHRyYSBmaWxlcyBpbiBvcmRlciB0byBhY3RpdmF0ZSB0aGUgcHJvZmlsZSBmb3IgZnVydGhlciB1c2UuXG4gICAqIE1ldGhvZCBpcyBhY2Nlc3NpYmxlIG9ubHkgd2l0aCBBUEkgYWNjZXNzIHRva2VuXG4gICAqIEBwYXJhbSB7TmV3UHJvdmlzaW9uaW5nUHJvZmlsZUR0b30gcHJvdmlzaW9uaW5nUHJvZmlsZSBwcm92aXNpb25pbmcgcHJvZmlsZSB0byBjcmVhdGVcbiAgICogQHJldHVybiB7UHJvbWlzZTxQcm92aXNpb25pbmdQcm9maWxlSWREdG8+fSBwcm9taXNlIHJlc29sdmluZyB3aXRoIGFuIGlkIG9mIHRoZSBwcm92aXNpb25pbmcgcHJvZmlsZSBjcmVhdGVkXG4gICAqL1xuICBjcmVhdGVQcm92aXNpb25pbmdQcm9maWxlKHByb3Zpc2lvbmluZ1Byb2ZpbGUpIHtcbiAgICBpZiAodGhpcy5faXNOb3RKd3RUb2tlbigpKSB7XG4gICAgICByZXR1cm4gdGhpcy5faGFuZGxlTm9BY2Nlc3NFcnJvcignY3JlYXRlUHJvdmlzaW9uaW5nUHJvZmlsZScpO1xuICAgIH1cbiAgICBjb25zdCBvcHRzID0ge1xuICAgICAgdXJsOiBgJHt0aGlzLl9ob3N0fS91c2Vycy9jdXJyZW50L3Byb3Zpc2lvbmluZy1wcm9maWxlc2AsXG4gICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgJ2F1dGgtdG9rZW4nOiB0aGlzLl90b2tlblxuICAgICAgfSxcbiAgICAgIGpzb246IHRydWUsXG4gICAgICBkYXRhOiBwcm92aXNpb25pbmdQcm9maWxlXG4gICAgfTtcbiAgICByZXR1cm4gdGhpcy5faHR0cENsaWVudC5yZXF1ZXN0KG9wdHMsICdjcmVhdGVQcm92aXNpb25pbmdQcm9maWxlJyk7XG4gIH1cblxuICAvKipcbiAgICogVXBsb2FkcyBhIGZpbGUgdG8gYSBwcm92aXNpb25pbmcgcHJvZmlsZSAoc2VlXG4gICAqIGh0dHBzOi8vbWV0YWFwaS5jbG91ZC9kb2NzL3Byb3Zpc2lvbmluZy9hcGkvcHJvdmlzaW9uaW5nUHJvZmlsZS91cGxvYWRGaWxlc1RvUHJvdmlzaW9uaW5nUHJvZmlsZS8pLiBVcGxvYWRpbmcgYVxuICAgKiBmaWxlIGJ5IG5hbWUgaXMgYWxsb3dlZCBvbmx5IGZvciBOb2RlLmpzLlxuICAgKiBNZXRob2QgaXMgYWNjZXNzaWJsZSBvbmx5IHdpdGggQVBJIGFjY2VzcyB0b2tlblxuICAgKiBAcGFyYW0ge1N0cmluZ30gcHJvdmlzaW9uaW5nUHJvZmlsZUlkIHByb3Zpc2lvbmluZyBwcm9maWxlIGlkIHRvIHVwbG9hZCBmaWxlIHRvXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBmaWxlTmFtZSBuYW1lIG9mIHRoZSBmaWxlIHRvIHVwbG9hZC4gQWxsb3dlZCB2YWx1ZXMgYXJlIHNlcnZlcnMuZGF0IGZvciBNVDUgcHJvZmlsZSwgYnJva2VyLnNydiBmb3JcbiAgICogTVQ0IHByb2ZpbGVcbiAgICogQHBhcmFtIHtTdHJpbmd8QnVmZmVyfSBmaWxlIHBhdGggdG8gYSBmaWxlIHRvIHVwbG9hZCBvciBidWZmZXIgY29udGFpbmluZyBmaWxlIGNvbnRlbnRzXG4gICAqIEByZXR1cm4ge1Byb21pc2V9IHByb21pc2UgcmVzb2x2aW5nIHdoZW4gZmlsZSB1cGxvYWQgaXMgY29tcGxldGVkXG4gICAqL1xuICB1cGxvYWRQcm92aXNpb25pbmdQcm9maWxlRmlsZShwcm92aXNpb25pbmdQcm9maWxlSWQsIGZpbGVOYW1lLCBmaWxlKSB7XG4gICAgaWYgKHRoaXMuX2lzTm90Snd0VG9rZW4oKSkge1xuICAgICAgcmV0dXJuIHRoaXMuX2hhbmRsZU5vQWNjZXNzRXJyb3IoJ3VwbG9hZFByb3Zpc2lvbmluZ1Byb2ZpbGVGaWxlJyk7XG4gICAgfVxuXG4gICAgY29uc3QgZm9ybURhdGEgPSBuZXcgRm9ybURhdGEoKTtcbiAgICBpZiAodHlwZW9mIGZpbGUgPT09ICdzdHJpbmcnKSB7XG4gICAgICBmaWxlID0gZnMuY3JlYXRlUmVhZFN0cmVhbShmaWxlKTtcbiAgICAgIGZvcm1EYXRhLmFwcGVuZCgnZmlsZScsIGZpbGUpO1xuICAgIH0gZWxzZSB7XG4gICAgICBmb3JtRGF0YS5hcHBlbmQoJ2ZpbGUnLCBmaWxlLCAnc2VydmVyRmlsZScpO1xuICAgIH1cblxuICAgIGNvbnN0IG9wdHMgPSB7XG4gICAgICBtZXRob2Q6ICdQVVQnLFxuICAgICAgdXJsOiBgJHt0aGlzLl9ob3N0fS91c2Vycy9jdXJyZW50L3Byb3Zpc2lvbmluZy1wcm9maWxlcy8ke3Byb3Zpc2lvbmluZ1Byb2ZpbGVJZH0vJHtmaWxlTmFtZX1gLFxuICAgICAgZGF0YTogZm9ybURhdGEsXG4gICAgICBoZWFkZXJzOiB7XG4gICAgICAgIC4uLmZvcm1EYXRhLmdldEhlYWRlcnMoKSxcbiAgICAgICAgJ2F1dGgtdG9rZW4nOiB0aGlzLl90b2tlbixcbiAgICAgIH1cbiAgICB9O1xuICAgIHJldHVybiB0aGlzLl9odHRwQ2xpZW50LnJlcXVlc3Qob3B0cywgJ3VwbG9hZFByb3Zpc2lvbmluZ1Byb2ZpbGVGaWxlJyk7XG4gIH1cblxuICAvKipcbiAgICogRGVsZXRlcyBhIHByb3Zpc2lvbmluZyBwcm9maWxlIChzZWVcbiAgICogaHR0cHM6Ly9tZXRhYXBpLmNsb3VkL2RvY3MvcHJvdmlzaW9uaW5nL2FwaS9wcm92aXNpb25pbmdQcm9maWxlL2RlbGV0ZVByb3Zpc2lvbmluZ1Byb2ZpbGUvKS4gUGxlYXNlIG5vdGUgdGhhdCBpblxuICAgKiBvcmRlciB0byBkZWxldGUgYSBwcm92aXNpb25pbmcgcHJvZmlsZSB5b3UgbmVlZCB0byBkZWxldGUgTVQgYWNjb3VudHMgY29ubmVjdGVkIHRvIGl0IGZpcnN0LlxuICAgKiBNZXRob2QgaXMgYWNjZXNzaWJsZSBvbmx5IHdpdGggQVBJIGFjY2VzcyB0b2tlblxuICAgKiBAcGFyYW0ge1N0cmluZ30gaWQgcHJvdmlzaW9uaW5nIHByb2ZpbGUgaWRcbiAgICogQHJldHVybiB7UHJvbWlzZX0gcHJvbWlzZSByZXNvbHZpbmcgd2hlbiBwcm92aXNpb25pbmcgcHJvZmlsZSBpcyBkZWxldGVkXG4gICAqL1xuICBkZWxldGVQcm92aXNpb25pbmdQcm9maWxlKGlkKSB7XG4gICAgaWYgKHRoaXMuX2lzTm90Snd0VG9rZW4oKSkge1xuICAgICAgcmV0dXJuIHRoaXMuX2hhbmRsZU5vQWNjZXNzRXJyb3IoJ2RlbGV0ZVByb3Zpc2lvbmluZ1Byb2ZpbGUnKTtcbiAgICB9XG4gICAgY29uc3Qgb3B0cyA9IHtcbiAgICAgIHVybDogYCR7dGhpcy5faG9zdH0vdXNlcnMvY3VycmVudC9wcm92aXNpb25pbmctcHJvZmlsZXMvJHtpZH1gLFxuICAgICAgbWV0aG9kOiAnREVMRVRFJyxcbiAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgJ2F1dGgtdG9rZW4nOiB0aGlzLl90b2tlblxuICAgICAgfSxcbiAgICAgIGpzb246IHRydWVcbiAgICB9O1xuICAgIHJldHVybiB0aGlzLl9odHRwQ2xpZW50LnJlcXVlc3Qob3B0cywgJ2RlbGV0ZVByb3Zpc2lvbmluZ1Byb2ZpbGUnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBVcGRhdGVkIHByb3Zpc2lvbmluZyBwcm9maWxlIGRhdGFcbiAgICogQHR5cGVkZWYge09iamVjdH0gUHJvdmlzaW9uaW5nUHJvZmlsZVVwZGF0ZUR0b1xuICAgKiBAcHJvcGVydHkge1N0cmluZ30gbmFtZSBwcm92aXNpb25pbmcgcHJvZmlsZSBuYW1lXG4gICAqL1xuXG4gIC8qKlxuICAgKiBVcGRhdGVzIGV4aXN0aW5nIHByb3Zpc2lvbmluZyBwcm9maWxlIGRhdGEgKHNlZVxuICAgKiBodHRwczovL21ldGFhcGkuY2xvdWQvZG9jcy9wcm92aXNpb25pbmcvYXBpL3Byb3Zpc2lvbmluZ1Byb2ZpbGUvdXBkYXRlUHJvdmlzaW9uaW5nUHJvZmlsZS8pLlxuICAgKiBNZXRob2QgaXMgYWNjZXNzaWJsZSBvbmx5IHdpdGggQVBJIGFjY2VzcyB0b2tlblxuICAgKiBAcGFyYW0ge1N0cmluZ30gaWQgcHJvdmlzaW9uaW5nIHByb2ZpbGUgaWRcbiAgICogQHBhcmFtIHtQcm92aXNpb25pbmdQcm9maWxlVXBkYXRlRHRvfSBwcm92aXNpb25pbmdQcm9maWxlIHVwZGF0ZWQgcHJvdmlzaW9uaW5nIHByb2ZpbGVcbiAgICogQHJldHVybiB7UHJvbWlzZX0gcHJvbWlzZSByZXNvbHZpbmcgd2hlbiBwcm92aXNpb25pbmcgcHJvZmlsZSBpcyB1cGRhdGVkXG4gICAqL1xuICB1cGRhdGVQcm92aXNpb25pbmdQcm9maWxlKGlkLCBwcm92aXNpb25pbmdQcm9maWxlKSB7XG4gICAgaWYgKHRoaXMuX2lzTm90Snd0VG9rZW4oKSkge1xuICAgICAgcmV0dXJuIHRoaXMuX2hhbmRsZU5vQWNjZXNzRXJyb3IoJ3VwZGF0ZVByb3Zpc2lvbmluZ1Byb2ZpbGUnKTtcbiAgICB9XG4gICAgY29uc3Qgb3B0cyA9IHtcbiAgICAgIHVybDogYCR7dGhpcy5faG9zdH0vdXNlcnMvY3VycmVudC9wcm92aXNpb25pbmctcHJvZmlsZXMvJHtpZH1gLFxuICAgICAgbWV0aG9kOiAnUFVUJyxcbiAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgJ2F1dGgtdG9rZW4nOiB0aGlzLl90b2tlblxuICAgICAgfSxcbiAgICAgIGpzb246IHRydWUsXG4gICAgICBkYXRhOiBwcm92aXNpb25pbmdQcm9maWxlXG4gICAgfTtcbiAgICByZXR1cm4gdGhpcy5faHR0cENsaWVudC5yZXF1ZXN0KG9wdHMsICd1cGRhdGVQcm92aXNpb25pbmdQcm9maWxlJyk7XG4gIH1cblxufVxuIl0sIm5hbWVzIjpbIlByb3Zpc2lvbmluZ1Byb2ZpbGVDbGllbnQiLCJNZXRhQXBpQ2xpZW50IiwiZ2V0UHJvdmlzaW9uaW5nUHJvZmlsZXMiLCJwcm9maWxlc0ZpbHRlciIsImFwaVZlcnNpb24iLCJfaXNOb3RKd3RUb2tlbiIsIl9oYW5kbGVOb0FjY2Vzc0Vycm9yIiwib3B0cyIsInVybCIsIl9ob3N0IiwibWV0aG9kIiwicGFyYW1zIiwiaGVhZGVycyIsIl90b2tlbiIsImpzb24iLCJfaHR0cENsaWVudCIsInJlcXVlc3QiLCJnZXRQcm92aXNpb25pbmdQcm9maWxlIiwiaWQiLCJjcmVhdGVQcm92aXNpb25pbmdQcm9maWxlIiwicHJvdmlzaW9uaW5nUHJvZmlsZSIsImRhdGEiLCJ1cGxvYWRQcm92aXNpb25pbmdQcm9maWxlRmlsZSIsInByb3Zpc2lvbmluZ1Byb2ZpbGVJZCIsImZpbGVOYW1lIiwiZmlsZSIsImZvcm1EYXRhIiwiRm9ybURhdGEiLCJmcyIsImNyZWF0ZVJlYWRTdHJlYW0iLCJhcHBlbmQiLCJnZXRIZWFkZXJzIiwiZGVsZXRlUHJvdmlzaW9uaW5nUHJvZmlsZSIsInVwZGF0ZVByb3Zpc2lvbmluZ1Byb2ZpbGUiXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7O2VBVXFCQTs7OzJEQVJOO3NFQUVXO2lFQUNMOzs7Ozs7QUFLTixJQUFBLEFBQU1BLDRCQUFOLE1BQU1BLGtDQUFrQ0Msc0JBQWE7SUFFbEU7Ozs7Ozs7OztHQVNDLEdBRUQ7OztHQUdDLEdBRUQ7OztHQUdDLEdBRUQ7OztHQUdDLEdBRUQ7OztHQUdDLEdBRUQ7Ozs7Ozs7OztHQVNDLEdBRUQ7Ozs7O0dBS0MsR0FHRDs7Ozs7OztHQU9DLEdBQ0RDLHdCQUF3QkMs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