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)

665 lines (664 loc) 91.2 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); Object.defineProperty(exports, "default", { enumerable: true, get: function() { return MetatraderAccountClient; } }); const _metaApiclient = /*#__PURE__*/ _interop_require_default(require("../metaApi.client")); const _randomstring = /*#__PURE__*/ _interop_require_default(require("randomstring")); function _interop_require_default(obj) { return obj && obj.__esModule ? obj : { default: obj }; } let MetatraderAccountClient = class MetatraderAccountClient extends _metaApiclient.default { /** * Metatrader account replica model * @typedef {Object} MetatraderAccountReplicaDto * @property {string} _id Unique account replica id * @property {State} state Current account replica state * @property {number} magic Magic value the trades should be performed using * @property {ConnectionStatus} connectionStatus Connection status of the MetaTrader terminal to the application * @property {string} quoteStreamingIntervalInSeconds Quote streaming interval in seconds. Set to 0 in order to * receive quotes on each tick. Intervals less than 2.5 seconds are supported only for G2 * @property {string} [symbol] Any symbol provided by broker (required for G1 only) * @property {Reliability} reliability Used to increase the reliability of the account replica. High is a recommended value * for production environment * @property {Array<string>} tags User-defined account replica tags * @property {Object} [metadata] Extra information which can be stored together with your account replica. * Total length of this field after serializing it to JSON is limited to 1024 characters * @property {number} resourceSlots Number of resource slots to allocate to account replica. Allocating extra resource slots * results in better account performance under load which is useful for some applications. E.g. if you have many * accounts copying the same strategy via CooyFactory API, then you can increase resourceSlots to get a lower trade * copying latency. Please note that allocating extra resource slots is a paid option. Please note that high * reliability accounts use redundant infrastructure, so that each resource slot for a high reliability account * is billed as 2 standard resource slots. * @property {number} copyFactoryResourceSlots Number of CopyFactory 2 resource slots to allocate to account replica. * Allocating extra resource slots results in lower trade copying latency. Please note that allocating extra resource * slots is a paid option. Please also note that CopyFactory 2 uses redundant infrastructure so that * each CopyFactory resource slot is billed as 2 standard resource slots. You will be billed for CopyFactory 2 * resource slots only if you have added your account to CopyFactory 2 by specifying copyFactoryRoles field. * @property {string} region Region id to deploy account replica at. One of returned by the /users/current/regions endpoint * @property {string} createdAt The time account replica was created at, in ISO format * @property {MetatraderAccountDto} primaryAccount Primary account */ /** * MetaTrader account model * @typedef {Object} MetatraderAccountDto * @property {string} _id Unique account id * @property {State} state Current account state * @property {number} magic Magic value the trades should be performed using * @property {ConnectionStatus} connectionStatus Connection status of the MetaTrader terminal to the application * @property {string} quoteStreamingIntervalInSeconds Quote streaming interval in seconds. Set to 0 in order to * receive quotes on each tick. Intervals less than 2.5 seconds are supported only for G2 * @property {string} [symbol] Any symbol provided by broker (required for G1 only) * @property {Reliability} reliability Used to increase the reliability of the account. High is a recommended value * for production environment * @property {Array<string>} tags User-defined account tags * @property {Object} [metadata] Extra information which can be stored together with your account. * Total length of this field after serializing it to JSON is limited to 1024 characters * @property {number} resourceSlots Number of resource slots to allocate to account. Allocating extra resource slots * results in better account performance under load which is useful for some applications. E.g. if you have many * accounts copying the same strategy via CooyFactory API, then you can increase resourceSlots to get a lower trade * copying latency. Please note that allocating extra resource slots is a paid option. Please note that high * reliability accounts use redundant infrastructure, so that each resource slot for a high reliability account * is billed as 2 standard resource slots. * @property {number} copyFactoryResourceSlots Number of CopyFactory 2 resource slots to allocate to account. * Allocating extra resource slots results in lower trade copying latency. Please note that allocating extra resource * slots is a paid option. Please also note that CopyFactory 2 uses redundant infrastructure so that * each CopyFactory resource slot is billed as 2 standard resource slots. You will be billed for CopyFactory 2 * resource slots only if you have added your account to CopyFactory 2 by specifying copyFactoryRoles field. * @property {string} region Region id to deploy account at. One of returned by the /users/current/regions endpoint * @property {string} createdAt The time account was created at, in ISO format * @property {string} name Human-readable account name * @property {boolean} manualTrades Flag indicating if trades should be placed as manual trades. Supported on G2 only * @property {number} [slippage] Default trade slippage in points. Should be greater or equal to zero. If not * specified, system internal setting will be used which we believe is reasonable for most cases * @property {string} [provisioningProfileId] Id of the provisioning profile that was used as the basis for * creating this account * @property {string} [login] MetaTrader account login * @property {string} server MetaTrader server name to connect to * @property {Type} type Account type. Executing accounts as cloud-g2 is faster and cheaper * @property {Version} version MetaTrader version * @property {number} hash Hash-code of the account * @property {string} baseCurrency 3-character ISO currency code of the account base currency. * The setting is to be used for copy trading accounts which use national currencies only, such as some Brazilian * brokers. You should not alter this setting unless you understand what you are doing. * @property {Array<CopyFactoryRoles>} copyFactoryRoles Account roles for CopyFactory2 application * @property {boolean} riskManagementApiEnabled Flag indicating that risk management API is enabled on * account * @property {boolean} metastatsApiEnabled Flag indicating that MetaStats API is enabled on account * @property {Array<AccountConnection>} connections Active account connections * @property {boolean} primaryReplica Flag indicating that account is primary * @property {string} userId User id * @property {string} [primaryAccountId] Primary account id. Only replicas can have this field * @property {Array<MetatraderAccountReplicaDto>} accountReplicas MetaTrader account replicas */ /** * MetaTrader account list model * @typedef {Object} MetatraderAccountListDto * @property {number} count MetaTrader accounts count * @property {Array<MetatraderAccountDto>} items MetaTrader accounts list */ /** * Account connection * @typedef {Object} AccountConnection * @property {string} region Region the account is connected at * @property {string} zone Availability zone the account is connected at * @property {string} application Application the account is connected to, one of `MetaApi`, `CopyFactory subscriber`, * `CopyFactory provider`, `CopyFactory history import`, `Risk management` */ /** * MT version * @typedef {4 | 5} Version */ /** * MT platform * @typedef {'mt4' | 'mt5'} Platform */ /** * Account type * @typedef {'cloud-g1' | 'cloud-g2'} Type */ /** * Account state * @typedef {'CREATED' | 'DEPLOYING' | 'DEPLOYED' | 'DEPLOY_FAILED' | 'UNDEPLOYING' | 'UNDEPLOYED' | * 'UNDEPLOY_FAILED' | 'DELETING' | 'DELETE_FAILED' | 'REDEPLOY_FAILED' | 'DRAFT'} State */ /** * Account connection status * @typedef {'CONNECTED' | 'DISCONNECTED' | 'DISCONNECTED_FROM_BROKER'} ConnectionStatus */ /** * Account reliability * @typedef {'high' | 'regular'} Reliability */ /** * CopyFactory roles * @typedef {'SUBSCRIBER' | 'PROVIDER'} CopyFactoryRoles */ /** * Sort order * @typedef {'asc' | 'desc'} SortOrder */ /** * Get accounts api version * @typedef {'1' | '2'} GetAccountsApiVersion */ /** * @typedef {Object} AccountsFilter * @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 {Array<Version> | Version} [version] MT version * @property {Array<Type> | Type} [type] Account type * @property {Array<State> | State} [state] Account state * @property {Array<ConnectionStatus> | ConnectionStatus} [connectionStatus] Connection status * @property {string} [query] Searches over _id, name, server and login to match query * @property {string} [provisioningProfileId] Provisioning profile id * @property {SortOrder} [sortOrder] Sort order for stateChangedAt field, default is no order * @property {Array<string> | string} [region] Available region * @property {Array<CopyFactoryRoles> | CopyFactoryRoles} [copyFactoryRoles] Account roles for CopyFactory2 API */ /** * Returns trading accounts belonging to the current user (see https://metaapi.cloud/docs/provisioning/api/account/readAccounts/) * Method is accessible only with API access token * @param {AccountsFilter} [accountsFilter] optional filter * @param {GetAccountsApiVersion} [apiVersion] api version to use * @return {Promise<Array<MetatraderAccountDto> | MetatraderAccountListDto>} promise resolving with MetaTrader accounts found */ getAccounts(accountsFilter = {}, apiVersion) { if (this._isNotJwtToken()) { return this._handleNoAccessError("getAccounts"); } const opts = { url: `${this._host}/users/current/accounts`, method: "GET", params: accountsFilter, headers: { "auth-token": this._token }, json: true }; if (apiVersion) { opts.headers["api-version"] = apiVersion; } return this._httpClient.request(opts, "getAccounts"); } /** * Returns trading account by id (see https://metaapi.cloud/docs/provisioning/api/account/readAccount/) * Method is accessible only with API access token * @param {string} id MetaTrader account id * @return {Promise<MetatraderAccountDto>} promise resolving with MetaTrader account found */ getAccount(id) { const opts = { url: `${this._host}/users/current/accounts/${id}`, method: "GET", headers: { "auth-token": this._token }, json: true }; return this._httpClient.request(opts, "getAccount"); } /** * Returns trading account replica by trading account id and replica id (see * https://metaapi.cloud/docs/provisioning/api/accountReplica/readAccountReplica/) * Method is accessible only with API access token * @param {string} accountId MetaTrader primary account id * @param {string} replicaId MetaTrader account replica id * @return {Promise<MetatraderAccountReplicaDto>} promise resolving with MetaTrader account replica found */ getAccountReplica(accountId, replicaId) { const opts = { url: `${this._host}/users/current/accounts/${accountId}/replicas/${replicaId}`, method: "GET", headers: { "auth-token": this._token }, json: true }; return this._httpClient.request(opts, "getAccountReplica"); } /** * Returns replicas for a trading account (see * https://metaapi.cloud/docs/provisioning/api/accountReplica/readAccountReplicas/) * Method is accessible only with API access token * @param {string} accountId Primary account id * @return {Promise<Array<MetatraderAccountReplicaDto>>} promise resolving with MetaTrader account replicas found */ getAccountReplicas(accountId) { const opts = { url: `${this._host}/users/current/accounts/${accountId}/replicas`, method: "GET", headers: { "auth-token": this._token }, json: true }; return this._httpClient.request(opts, "getAccountReplicas"); } /** * MetaTrader account id model * @typedef {Object} MetatraderAccountIdDto * @property {string} id MetaTrader account unique identifier * @property {string} state State of the account. Possible values are 'UNDEPLOYED', 'DEPLOYED', 'DRAFT' */ /** * Adds a trading account and starts a cloud API server for the trading account (see * https://metaapi.cloud/docs/provisioning/api/account/createAccount/). * It can take some time for the API server and trading terminal to start and connect to broker. * You can use the `connectionStatus` replica field to monitor the current status of the trading account. * Method is accessible only with API access token * @param {NewMetatraderAccountDto} account MetaTrader account data * @return {Promise<MetatraderAccountIdDto>} promise resolving with an id and state of the MetaTrader account created */ createAccount(account) { if (this._isNotJwtToken()) { return this._handleNoAccessError("createAccount"); } const opts = { url: `${this._host}/users/current/accounts`, method: "POST", headers: { "auth-token": this._token, "transaction-id": _randomstring.default.generate(32) }, json: true, data: account }; return this._httpClient.request(opts, "createAccount"); } /** * New MetaTrader account replica model * @typedef {Object} NewMetaTraderAccountReplicaDto * @property {string} [symbol] Any MetaTrader symbol your broker provides historical market data for. * This value should be specified for G1 accounts only and only in case your MT account fails to connect to broker. * @property {number} magic Magic value the trades should be performed using. * When manualTrades field is set to true, magic value must be 0 * @property {string} [quoteStreamingIntervalInSeconds] Quote streaming interval in seconds. Set to 0 in order to * receive quotes on each tick. Default value is 2.5 seconds. Intervals less than 2.5 seconds are supported only for G2 * @property {Array<string>} [tags] User-defined account replica tags * @property {Object} [metadata] Extra information which can be stored together with your account replica. * Total length of this field after serializing it to JSON is limited to 1024 characters * @property {Reliability} [reliability] Used to increase the reliability of the account replica. High is a recommended value * for production environment. Default value is high * @property {number} [resourceSlots] Number of resource slots to allocate to account replica. Allocating extra resource slots * results in better account performance under load which is useful for some applications. E.g. if you have many * accounts copying the same strategy via CooyFactory API, then you can increase resourceSlots to get a lower trade * copying latency. Please note that allocating extra resource slots is a paid option. Please note that high * reliability accounts use redundant infrastructure, so that each resource slot for a high reliability account * is billed as 2 standard resource slots. Default is 1. * @property {number} [copyFactoryResourceSlots] Number of CopyFactory 2 resource slots to allocate to account replica. * Allocating extra resource slots results in lower trade copying latency. Please note that allocating extra resource * slots is a paid option. Please also note that CopyFactory 2 uses redundant infrastructure so that * each CopyFactory resource slot is billed as 2 standard resource slots. You will be billed for CopyFactory 2 * resource slots only if you have added your account to CopyFactory 2 by specifying copyFactoryRoles field. * Default is 1. * @property {string} region Region id to deploy account replica at. One of returned by the /users/current/regions endpoint */ /** * Creates a trading account replica in a region different from trading account region and starts a cloud API server for it * (see https://metaapi.cloud/docs/provisioning/api/accountReplica/createAccountReplica/). * It can take some time for the API server and trading terminal to start and connect to broker. * You can use the `connectionStatus` replica field to monitor the current status of the replica. * Method is accessible only with API access token * @param {string} accountId primary account id * @param {NewMetaTraderAccountReplicaDto} account MetaTrader account data * @return {Promise<MetatraderAccountIdDto>} promise resolving with an id and state of the MetaTrader account replica created */ createAccountReplica(accountId, account) { if (this._isNotJwtToken()) { return this._handleNoAccessError("createAccountReplica"); } const opts = { url: `${this._host}/users/current/accounts/${accountId}/replicas`, method: "POST", headers: { "auth-token": this._token, "transaction-id": _randomstring.default.generate(32) }, json: true, data: account }; return this._httpClient.request(opts, "createAccountReplica"); } /** * Starts API server and trading terminal for trading account. * This request will be ignored if the account is already deployed. * (see https://metaapi.cloud/docs/provisioning/api/account/deployAccount/) * Method is accessible only with API access token * @param {string} id MetaTrader account id * @return {Promise} promise resolving when MetaTrader account is scheduled for deployment */ deployAccount(id) { if (this._isNotJwtToken()) { return this._handleNoAccessError("deployAccount"); } const opts = { url: `${this._host}/users/current/accounts/${id}/deploy`, method: "POST", headers: { "auth-token": this._token }, json: true }; return this._httpClient.request(opts, "deployAccount"); } /** * Starts API server and trading terminal for trading account replica. * This request will be ignored if the replica is already deployed * (see https://metaapi.cloud/docs/provisioning/api/accountReplica/deployAccountReplica/) * Method is accessible only with API access token * @param {string} accountId MetaTrader account id * @param {string} replicaId MetaTrader account replica id * @return {Promise} promise resolving when MetaTrader account replica is scheduled for deployment */ deployAccountReplica(accountId, replicaId) { if (this._isNotJwtToken()) { return this._handleNoAccessError("deployAccountReplica"); } const opts = { url: `${this._host}/users/current/accounts/${accountId}/replicas/${replicaId}/deploy`, method: "POST", headers: { "auth-token": this._token }, json: true }; return this._httpClient.request(opts, "deployAccountReplica"); } /** * Stops API server and trading terminal for trading account. * This request will be ignored if trading account is already undeployed * (see https://metaapi.cloud/docs/provisioning/api/account/undeployAccount/) * Method is accessible only with API access token * @param {string} id MetaTrader account id * @return {Promise} promise resolving when MetaTrader account is scheduled for undeployment */ undeployAccount(id) { if (this._isNotJwtToken()) { return this._handleNoAccessError("undeployAccount"); } const opts = { url: `${this._host}/users/current/accounts/${id}/undeploy`, method: "POST", headers: { "auth-token": this._token }, json: true }; return this._httpClient.request(opts, "undeployAccount"); } /** * Stops API server and trading terminal for trading account replica. * The request will be ignored if trading account replica is already undeployed * (see https://metaapi.cloud/docs/provisioning/api/accountReplica/undeployAccountReplica/) * Method is accessible only with API access token * @param {string} accountId MetaTrader primary account id * @param {string} replicaId MetaTrader account replica id * @return {Promise} promise resolving when MetaTrader account replica is scheduled for undeployment */ undeployAccountReplica(accountId, replicaId) { if (this._isNotJwtToken()) { return this._handleNoAccessError("undeployAccountReplica"); } const opts = { url: `${this._host}/users/current/accounts/${accountId}/replicas/${replicaId}/undeploy`, method: "POST", headers: { "auth-token": this._token }, json: true }; return this._httpClient.request(opts, "undeployAccountReplica"); } /** * Redeploys trading account. This is equivalent to undeploy immediately followed by deploy * (see https://metaapi.cloud/docs/provisioning/api/account/redeployAccount/) * Method is accessible only with API access token * @param {string} id MetaTrader account id * @return {Promise} promise resolving when MetaTrader account is scheduled for redeployment */ redeployAccount(id) { if (this._isNotJwtToken()) { return this._handleNoAccessError("redeployAccount"); } const opts = { url: `${this._host}/users/current/accounts/${id}/redeploy`, method: "POST", headers: { "auth-token": this._token }, json: true }; return this._httpClient.request(opts, "redeployAccount"); } /** * Redeploys trading account replica. This is equivalent to undeploy immediately followed by deploy. * (see https://metaapi.cloud/docs/provisioning/api/account/redeployAccountReplica/) * Method is accessible only with API access token * @param {string} accountId MetaTrader primary account id * @param {string} replicaId MetaTrader account replica id * @return {Promise} promise resolving when MetaTrader account replica is scheduled for redeployment */ redeployAccountReplica(accountId, replicaId) { if (this._isNotJwtToken()) { return this._handleNoAccessError("redeployAccountReplica"); } const opts = { url: `${this._host}/users/current/accounts/${accountId}/replicas/${replicaId}/redeploy`, method: "POST", headers: { "auth-token": this._token }, json: true }; return this._httpClient.request(opts, "redeployAccountReplica"); } /** * Removes a trading account and stops the API server serving the account. * The account state such as downloaded market data history will be removed as well when you remove the account. * (see https://metaapi.cloud/docs/provisioning/api/account/deleteAccount/). * Method is accessible only with API access token * @param {string} id Id of the account to be deleted * @return {Promise} promise resolving when MetaTrader account is scheduled for deletion */ deleteAccount(id) { if (this._isNotJwtToken()) { return this._handleNoAccessError("deleteAccount"); } const opts = { url: `${this._host}/users/current/accounts/${id}`, method: "DELETE", headers: { "auth-token": this._token }, json: true }; return this._httpClient.request(opts, "deleteAccount"); } /** * Removes a trading account replica and stops the API server serving the replica * (see https://metaapi.cloud/docs/provisioning/api/account/deleteAccountReplica/). * Method is accessible only with API access token * @param {string} accountId primary account id * @param {string} replicaId Id of the account replica to be deleted * @return {Promise} promise resolving when MetaTrader account replica is scheduled for deletion */ deleteAccountReplica(accountId, replicaId) { if (this._isNotJwtToken()) { return this._handleNoAccessError("deleteAccountReplica"); } const opts = { url: `${this._host}/users/current/accounts/${accountId}/replicas/${replicaId}`, method: "DELETE", headers: { "auth-token": this._token }, json: true }; return this._httpClient.request(opts, "deleteAccountReplica"); } /** * Updates trading account. * Please redeploy the trading account in order for updated settings to take effect * (see https://metaapi.cloud/docs/provisioning/api/account/updateAccount/). * Method is accessible only with API access token * @param {string} id MetaTrader account id * @param {MetatraderAccountUpdateDto} account updated account information * @return {Promise} promise resolving when MetaTrader account is updated */ updateAccount(id, account) { if (this._isNotJwtToken()) { return this._handleNoAccessError("updateAccount"); } const opts = { url: `${this._host}/users/current/accounts/${id}`, method: "PUT", headers: { "auth-token": this._token }, json: true, data: account }; return this._httpClient.request(opts, "updateAccount"); } /** * Updated MetaTrader account replica data * @typedef {Object} UpdatedMetatraderAccountReplicaDto * @property {number} [magic] Magic value the trades should be performed using. * When manualTrades field is set to true, magic value must be 0 * @property {number} [quoteStreamingIntervalInSeconds] Quote streaming interval in seconds. Set to 0 in order to * receive quotes on each tick. Default value is 2.5 seconds. Intervals less than 2.5 seconds are supported * only for G2 * @property {Array<string>} [tags] MetaTrader account tags * @property {Object} [metadata] extra information which can be stored together with your account * @property {number} [resourceSlots] Number of resource slots to allocate to account. Allocating extra resource slots * results in better account performance under load which is useful for some applications. E.g. if you have many * accounts copying the same strategy via CooyFactory API, then you can increase resourceSlots to get a lower trade * copying latency. Please note that allocating extra resource slots is a paid option. Default is 1 * @property {number} [copyFactoryResourceSlots] Number of CopyFactory 2 resource slots to allocate to account. * Allocating extra resource slots results in lower trade copying latency. Please note that allocating extra resource * slots is a paid option. Please also note that CopyFactory 2 uses redundant infrastructure so that * each CopyFactory resource slot is billed as 2 standard resource slots. You will be billed for CopyFactory 2 * resource slots only if you have added your account to CopyFactory 2 by specifying copyFactoryRoles field. * Default is 1. */ /** * Updates trading account replica (see * https://metaapi.cloud/docs/provisioning/api/account/updateAccountReplica/). * Method is accessible only with API access token * @param {string} accountId MetaTrader primary account id * @param {string} replicaId MetaTrader account replica id * @param {UpdatedMetatraderAccountReplicaDto} metatraderAccount updated account replica information * @return {Promise} promise resolving when MetaTrader account replica is updated */ updateAccountReplica(accountId, replicaId, metatraderAccount) { if (this._isNotJwtToken()) { return this._handleNoAccessError("updateAccountReplica"); } const opts = { url: `${this._host}/users/current/accounts/${accountId}/replicas/${replicaId}`, method: "PUT", headers: { "auth-token": this._token }, json: true, data: metatraderAccount }; return this._httpClient.request(opts, "updateAccountReplica"); } /** * Increases trading account reliability in order to increase the expected account uptime. * The account will be temporary stopped to perform this action. * Note that increasing reliability is a paid option (see * https://metaapi.cloud/docs/provisioning/api/account/increaseReliability/). * Method is accessible only with API access token * @param {string} id MetaTrader account id * @return {Promise} promise resolving when MetaTrader account reliability is increased */ increaseReliability(id) { if (this._isNotJwtToken()) { return this._handleNoAccessError("increaseReliability"); } const opts = { url: `${this._host}/users/current/accounts/${id}/increase-reliability`, method: "POST", headers: { "auth-token": this._token }, json: true }; return this._httpClient.request(opts, "increaseReliability"); } /** * Enables risk management API for trading account. * The account will be temporary stopped to perform this action. * Note that risk management API is a paid option (see * https://metaapi.cloud/docs/provisioning/api/account/enableRiskManagementApi/). * Method is accessible only with API access token * @param {string} id MetaTrader account id * @return {Promise} promise resolving when account risk management is enabled */ enableRiskManagementApi(id) { if (this._isNotJwtToken()) { return this._handleNoAccessError("enableRiskManagementApi"); } const opts = { url: `${this._host}/users/current/accounts/${id}/enable-risk-management-api`, method: "POST", headers: { "auth-token": this._token }, json: true }; return this._httpClient.request(opts, "enableRiskManagementApi"); } /** * Enables copy factory API for trading account. * The account will be temporary stopped to perform this action. * Note that copy factory API is a paid option (see * https://metaapi.cloud/docs/provisioning/api/account/enableCopyFactoryApi/). * @param {string} id MetaTrader account id * @param {Array<CopyFactoryRoles>} copyFactoryRoles Copy factory roles * @param {number} copyFactoryResourceSlots Copy factory resource slots * @return {Promise} promise resolving when account copy factory is enabled */ enableCopyFactoryApi(id, copyFactoryRoles, copyFactoryResourceSlots) { const opts = { url: `${this._host}/users/current/accounts/${id}/enable-copy-factory-api`, method: "POST", headers: { "auth-token": this._token }, json: true, data: { copyFactoryRoles, copyFactoryResourceSlots } }; return this._httpClient.request(opts, "enableCopyFactoryApi"); } /** * Enables MetaStats API for trading account. * The account will be temporary stopped to perform this action. * Note that this is a paid option (see * https://metaapi.cloud/docs/provisioning/api/account/enableMetaStatsApi/). * Method is accessible only with API access token * @param {string} id MetaTrader account id * @return {Promise} promise resolving when account MetaStats API is enabled */ enableMetaStatsApi(id) { if (this._isNotJwtToken()) { return this._handleNoAccessError("enableMetaStatsApi"); } const opts = { url: `${this._host}/users/current/accounts/${id}/enable-metastats-api`, method: "POST", headers: { "auth-token": this._token }, json: true }; return this._httpClient.request(opts, "enableMetaStatsApi"); } /** * Configuration link * @typedef {Object} ConfigurationLink * @property {string} configurationLink Secure link to allow end user to configure account directly */ /** * Generates trading account configuration link by account id. * (see https://metaapi.cloud/docs/provisioning/api/account/createConfigurationLink/) * This link can be used by the end user to enter trading account login and password or change the password. * Method is accessible only with API access token * @param {string} accountId Trading account id * @param {number} [ttlInDays] Lifetime of the link in days. Default is 7. * @return {Promise<ConfigurationLink>} promise resolving with configuration link */ createConfigurationLink(accountId, ttlInDays) { if (this._isNotJwtToken()) { return this._handleNoAccessError("createConfigurationLink"); } const opts = { url: `${this._host}/users/current/accounts/${accountId}/configuration-link`, method: "PUT", headers: { "auth-token": this._token }, params: { ttlInDays: ttlInDays }, json: true }; return this._httpClient.request(opts, "createConfigurationLink"); } }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIjxhbm9uPiJdLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHN0cmljdCc7XG5cbmltcG9ydCB7TmV3TWV0YXRyYWRlckFjY291bnREdG8sIE1ldGF0cmFkZXJBY2NvdW50VXBkYXRlRHRvfSBmcm9tICcuL21ldGF0cmFkZXJBY2NvdW50LmNsaWVudCc7XG5pbXBvcnQgTWV0YUFwaUNsaWVudCBmcm9tICcuLi9tZXRhQXBpLmNsaWVudCc7XG5pbXBvcnQgcmFuZG9tc3RyaW5nIGZyb20gJ3JhbmRvbXN0cmluZyc7XG5cbi8qKlxuICogbWV0YWFwaS5jbG91ZCBNZXRhVHJhZGVyIGFjY291bnQgQVBJIGNsaWVudCAoc2VlIGh0dHBzOi8vbWV0YWFwaS5jbG91ZC9kb2NzL3Byb3Zpc2lvbmluZy8pXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIE1ldGF0cmFkZXJBY2NvdW50Q2xpZW50IGV4dGVuZHMgTWV0YUFwaUNsaWVudCB7XG5cbiAgLyoqXG4gICAqIE1ldGF0cmFkZXIgYWNjb3VudCByZXBsaWNhIG1vZGVsXG4gICAqIEB0eXBlZGVmIHtPYmplY3R9IE1ldGF0cmFkZXJBY2NvdW50UmVwbGljYUR0b1xuICAgKiBAcHJvcGVydHkge3N0cmluZ30gX2lkIFVuaXF1ZSBhY2NvdW50IHJlcGxpY2EgaWRcbiAgICogQHByb3BlcnR5IHtTdGF0ZX0gc3RhdGUgQ3VycmVudCBhY2NvdW50IHJlcGxpY2Egc3RhdGVcbiAgICogQHByb3BlcnR5IHtudW1iZXJ9IG1hZ2ljIE1hZ2ljIHZhbHVlIHRoZSB0cmFkZXMgc2hvdWxkIGJlIHBlcmZvcm1lZCB1c2luZ1xuICAgKiBAcHJvcGVydHkge0Nvbm5lY3Rpb25TdGF0dXN9IGNvbm5lY3Rpb25TdGF0dXMgQ29ubmVjdGlvbiBzdGF0dXMgb2YgdGhlIE1ldGFUcmFkZXIgdGVybWluYWwgdG8gdGhlIGFwcGxpY2F0aW9uXG4gICAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBxdW90ZVN0cmVhbWluZ0ludGVydmFsSW5TZWNvbmRzIFF1b3RlIHN0cmVhbWluZyBpbnRlcnZhbCBpbiBzZWNvbmRzLiBTZXQgdG8gMCBpbiBvcmRlciB0byBcbiAgICogcmVjZWl2ZSBxdW90ZXMgb24gZWFjaCB0aWNrLiBJbnRlcnZhbHMgbGVzcyB0aGFuIDIuNSBzZWNvbmRzIGFyZSBzdXBwb3J0ZWQgb25seSBmb3IgRzJcbiAgICogQHByb3BlcnR5IHtzdHJpbmd9IFtzeW1ib2xdIEFueSBzeW1ib2wgcHJvdmlkZWQgYnkgYnJva2VyIChyZXF1aXJlZCBmb3IgRzEgb25seSlcbiAgICogQHByb3BlcnR5IHtSZWxpYWJpbGl0eX0gcmVsaWFiaWxpdHkgVXNlZCB0byBpbmNyZWFzZSB0aGUgcmVsaWFiaWxpdHkgb2YgdGhlIGFjY291bnQgcmVwbGljYS4gSGlnaCBpcyBhIHJlY29tbWVuZGVkIHZhbHVlXG4gICAqIGZvciBwcm9kdWN0aW9uIGVudmlyb25tZW50XG4gICAqIEBwcm9wZXJ0eSB7QXJyYXk8c3RyaW5nPn0gdGFncyBVc2VyLWRlZmluZWQgYWNjb3VudCByZXBsaWNhIHRhZ3NcbiAgICogQHByb3BlcnR5IHtPYmplY3R9IFttZXRhZGF0YV0gRXh0cmEgaW5mb3JtYXRpb24gd2hpY2ggY2FuIGJlIHN0b3JlZCB0b2dldGhlciB3aXRoIHlvdXIgYWNjb3VudCByZXBsaWNhLiBcbiAgICogVG90YWwgbGVuZ3RoIG9mIHRoaXMgZmllbGQgYWZ0ZXIgc2VyaWFsaXppbmcgaXQgdG8gSlNPTiBpcyBsaW1pdGVkIHRvIDEwMjQgY2hhcmFjdGVyc1xuICAgKiBAcHJvcGVydHkge251bWJlcn0gcmVzb3VyY2VTbG90cyBOdW1iZXIgb2YgcmVzb3VyY2Ugc2xvdHMgdG8gYWxsb2NhdGUgdG8gYWNjb3VudCByZXBsaWNhLiBBbGxvY2F0aW5nIGV4dHJhIHJlc291cmNlIHNsb3RzXG4gICAqIHJlc3VsdHMgaW4gYmV0dGVyIGFjY291bnQgcGVyZm9ybWFuY2UgdW5kZXIgbG9hZCB3aGljaCBpcyB1c2VmdWwgZm9yIHNvbWUgYXBwbGljYXRpb25zLiBFLmcuIGlmIHlvdSBoYXZlIG1hbnlcbiAgICogYWNjb3VudHMgY29weWluZyB0aGUgc2FtZSBzdHJhdGVneSB2aWEgQ29veUZhY3RvcnkgQVBJLCB0aGVuIHlvdSBjYW4gaW5jcmVhc2UgcmVzb3VyY2VTbG90cyB0byBnZXQgYSBsb3dlciB0cmFkZVxuICAgKiBjb3B5aW5nIGxhdGVuY3kuIFBsZWFzZSBub3RlIHRoYXQgYWxsb2NhdGluZyBleHRyYSByZXNvdXJjZSBzbG90cyBpcyBhIHBhaWQgb3B0aW9uLiBQbGVhc2Ugbm90ZSB0aGF0IGhpZ2hcbiAgICogcmVsaWFiaWxpdHkgYWNjb3VudHMgdXNlIHJlZHVuZGFudCBpbmZyYXN0cnVjdHVyZSwgc28gdGhhdCBlYWNoIHJlc291cmNlIHNsb3QgZm9yIGEgaGlnaCByZWxpYWJpbGl0eSBhY2NvdW50XG4gICAqIGlzIGJpbGxlZCBhcyAyIHN0YW5kYXJkIHJlc291cmNlIHNsb3RzLlxuICAgKiBAcHJvcGVydHkge251bWJlcn0gY29weUZhY3RvcnlSZXNvdXJjZVNsb3RzIE51bWJlciBvZiBDb3B5RmFjdG9yeSAyIHJlc291cmNlIHNsb3RzIHRvIGFsbG9jYXRlIHRvIGFjY291bnQgcmVwbGljYS5cbiAgICogQWxsb2NhdGluZyBleHRyYSByZXNvdXJjZSBzbG90cyByZXN1bHRzIGluIGxvd2VyIHRyYWRlIGNvcHlpbmcgbGF0ZW5jeS4gUGxlYXNlIG5vdGUgdGhhdCBhbGxvY2F0aW5nIGV4dHJhIHJlc291cmNlXG4gICAqIHNsb3RzIGlzIGEgcGFpZCBvcHRpb24uIFBsZWFzZSBhbHNvIG5vdGUgdGhhdCBDb3B5RmFjdG9yeSAyIHVzZXMgcmVkdW5kYW50IGluZnJhc3RydWN0dXJlIHNvIHRoYXRcbiAgICogZWFjaCBDb3B5RmFjdG9yeSByZXNvdXJjZSBzbG90IGlzIGJpbGxlZCBhcyAyIHN0YW5kYXJkIHJlc291cmNlIHNsb3RzLiBZb3Ugd2lsbCBiZSBiaWxsZWQgZm9yIENvcHlGYWN0b3J5IDJcbiAgICogcmVzb3VyY2Ugc2xvdHMgb25seSBpZiB5b3UgaGF2ZSBhZGRlZCB5b3VyIGFjY291bnQgdG8gQ29weUZhY3RvcnkgMiBieSBzcGVjaWZ5aW5nIGNvcHlGYWN0b3J5Um9sZXMgZmllbGQuXG4gICAqIEBwcm9wZXJ0eSB7c3RyaW5nfSByZWdpb24gUmVnaW9uIGlkIHRvIGRlcGxveSBhY2NvdW50IHJlcGxpY2EgYXQuIE9uZSBvZiByZXR1cm5lZCBieSB0aGUgL3VzZXJzL2N1cnJlbnQvcmVnaW9ucyBlbmRwb2ludFxuICAgKiBAcHJvcGVydHkge3N0cmluZ30gY3JlYXRlZEF0IFRoZSB0aW1lIGFjY291bnQgcmVwbGljYSB3YXMgY3JlYXRlZCBhdCwgaW4gSVNPIGZvcm1hdFxuICAgKiBAcHJvcGVydHkge01ldGF0cmFkZXJBY2NvdW50RHRvfSBwcmltYXJ5QWNjb3VudCBQcmltYXJ5IGFjY291bnRcbiAgICovXG5cbiAgLyoqXG4gICAqIE1ldGFUcmFkZXIgYWNjb3VudCBtb2RlbFxuICAgKiBAdHlwZWRlZiB7T2JqZWN0fSBNZXRhdHJhZGVyQWNjb3VudER0b1xuICAgKiBAcHJvcGVydHkge3N0cmluZ30gX2lkIFVuaXF1ZSBhY2NvdW50IGlkXG4gICAqIEBwcm9wZXJ0eSB7U3RhdGV9IHN0YXRlIEN1cnJlbnQgYWNjb3VudCBzdGF0ZVxuICAgKiBAcHJvcGVydHkge251bWJlcn0gbWFnaWMgTWFnaWMgdmFsdWUgdGhlIHRyYWRlcyBzaG91bGQgYmUgcGVyZm9ybWVkIHVzaW5nXG4gICAqIEBwcm9wZXJ0eSB7Q29ubmVjdGlvblN0YXR1c30gY29ubmVjdGlvblN0YXR1cyBDb25uZWN0aW9uIHN0YXR1cyBvZiB0aGUgTWV0YVRyYWRlciB0ZXJtaW5hbCB0byB0aGUgYXBwbGljYXRpb25cbiAgICogQHByb3BlcnR5IHtzdHJpbmd9IHF1b3RlU3RyZWFtaW5nSW50ZXJ2YWxJblNlY29uZHMgUXVvdGUgc3RyZWFtaW5nIGludGVydmFsIGluIHNlY29uZHMuIFNldCB0byAwIGluIG9yZGVyIHRvIFxuICAgKiByZWNlaXZlIHF1b3RlcyBvbiBlYWNoIHRpY2suIEludGVydmFscyBsZXNzIHRoYW4gMi41IHNlY29uZHMgYXJlIHN1cHBvcnRlZCBvbmx5IGZvciBHMlxuICAgKiBAcHJvcGVydHkge3N0cmluZ30gW3N5bWJvbF0gQW55IHN5bWJvbCBwcm92aWRlZCBieSBicm9rZXIgKHJlcXVpcmVkIGZvciBHMSBvbmx5KVxuICAgKiBAcHJvcGVydHkge1JlbGlhYmlsaXR5fSByZWxpYWJpbGl0eSBVc2VkIHRvIGluY3JlYXNlIHRoZSByZWxpYWJpbGl0eSBvZiB0aGUgYWNjb3VudC4gSGlnaCBpcyBhIHJlY29tbWVuZGVkIHZhbHVlXG4gICAqIGZvciBwcm9kdWN0aW9uIGVudmlyb25tZW50XG4gICAqIEBwcm9wZXJ0eSB7QXJyYXk8c3RyaW5nPn0gdGFncyBVc2VyLWRlZmluZWQgYWNjb3VudCB0YWdzXG4gICAqIEBwcm9wZXJ0eSB7T2JqZWN0fSBbbWV0YWRhdGFdIEV4dHJhIGluZm9ybWF0aW9uIHdoaWNoIGNhbiBiZSBzdG9yZWQgdG9nZXRoZXIgd2l0aCB5b3VyIGFjY291bnQuIFxuICAgKiBUb3RhbCBsZW5ndGggb2YgdGhpcyBmaWVsZCBhZnRlciBzZXJpYWxpemluZyBpdCB0byBKU09OIGlzIGxpbWl0ZWQgdG8gMTAyNCBjaGFyYWN0ZXJzXG4gICAqIEBwcm9wZXJ0eSB7bnVtYmVyfSByZXNvdXJjZVNsb3RzIE51bWJlciBvZiByZXNvdXJjZSBzbG90cyB0byBhbGxvY2F0ZSB0byBhY2NvdW50LiBBbGxvY2F0aW5nIGV4dHJhIHJlc291cmNlIHNsb3RzXG4gICAqIHJlc3VsdHMgaW4gYmV0dGVyIGFjY291bnQgcGVyZm9ybWFuY2UgdW5kZXIgbG9hZCB3aGljaCBpcyB1c2VmdWwgZm9yIHNvbWUgYXBwbGljYXRpb25zLiBFLmcuIGlmIHlvdSBoYXZlIG1hbnlcbiAgICogYWNjb3VudHMgY29weWluZyB0aGUgc2FtZSBzdHJhdGVneSB2aWEgQ29veUZhY3RvcnkgQVBJLCB0aGVuIHlvdSBjYW4gaW5jcmVhc2UgcmVzb3VyY2VTbG90cyB0byBnZXQgYSBsb3dlciB0cmFkZVxuICAgKiBjb3B5aW5nIGxhdGVuY3kuIFBsZWFzZSBub3RlIHRoYXQgYWxsb2NhdGluZyBleHRyYSByZXNvdXJjZSBzbG90cyBpcyBhIHBhaWQgb3B0aW9uLiBQbGVhc2Ugbm90ZSB0aGF0IGhpZ2hcbiAgICogcmVsaWFiaWxpdHkgYWNjb3VudHMgdXNlIHJlZHVuZGFudCBpbmZyYXN0cnVjdHVyZSwgc28gdGhhdCBlYWNoIHJlc291cmNlIHNsb3QgZm9yIGEgaGlnaCByZWxpYWJpbGl0eSBhY2NvdW50XG4gICAqIGlzIGJpbGxlZCBhcyAyIHN0YW5kYXJkIHJlc291cmNlIHNsb3RzLlxuICAgKiBAcHJvcGVydHkge251bWJlcn0gY29weUZhY3RvcnlSZXNvdXJjZVNsb3RzIE51bWJlciBvZiBDb3B5RmFjdG9yeSAyIHJlc291cmNlIHNsb3RzIHRvIGFsbG9jYXRlIHRvIGFjY291bnQuXG4gICAqIEFsbG9jYXRpbmcgZXh0cmEgcmVzb3VyY2Ugc2xvdHMgcmVzdWx0cyBpbiBsb3dlciB0cmFkZSBjb3B5aW5nIGxhdGVuY3kuIFBsZWFzZSBub3RlIHRoYXQgYWxsb2NhdGluZyBleHRyYSByZXNvdXJjZVxuICAgKiBzbG90cyBpcyBhIHBhaWQgb3B0aW9uLiBQbGVhc2UgYWxzbyBub3RlIHRoYXQgQ29weUZhY3RvcnkgMiB1c2VzIHJlZHVuZGFudCBpbmZyYXN0cnVjdHVyZSBzbyB0aGF0XG4gICAqIGVhY2ggQ29weUZhY3RvcnkgcmVzb3VyY2Ugc2xvdCBpcyBiaWxsZWQgYXMgMiBzdGFuZGFyZCByZXNvdXJjZSBzbG90cy4gWW91IHdpbGwgYmUgYmlsbGVkIGZvciBDb3B5RmFjdG9yeSAyXG4gICAqIHJlc291cmNlIHNsb3RzIG9ubHkgaWYgeW91IGhhdmUgYWRkZWQgeW91ciBhY2NvdW50IHRvIENvcHlGYWN0b3J5IDIgYnkgc3BlY2lmeWluZyBjb3B5RmFjdG9yeVJvbGVzIGZpZWxkLlxuICAgKiBAcHJvcGVydHkge3N0cmluZ30gcmVnaW9uIFJlZ2lvbiBpZCB0byBkZXBsb3kgYWNjb3VudCBhdC4gT25lIG9mIHJldHVybmVkIGJ5IHRoZSAvdXNlcnMvY3VycmVudC9yZWdpb25zIGVuZHBvaW50XG4gICAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBjcmVhdGVkQXQgVGhlIHRpbWUgYWNjb3VudCB3YXMgY3JlYXRlZCBhdCwgaW4gSVNPIGZvcm1hdFxuICAgKiBAcHJvcGVydHkge3N0cmluZ30gbmFtZSBIdW1hbi1yZWFkYWJsZSBhY2NvdW50IG5hbWVcbiAgICogQHByb3BlcnR5IHtib29sZWFufSBtYW51YWxUcmFkZXMgRmxhZyBpbmRpY2F0aW5nIGlmIHRyYWRlcyBzaG91bGQgYmUgcGxhY2VkIGFzIG1hbnVhbCB0cmFkZXMuIFN1cHBvcnRlZCBvbiBHMiBvbmx5XG4gICAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBbc2xpcHBhZ2VdIERlZmF1bHQgdHJhZGUgc2xpcHBhZ2UgaW4gcG9pbnRzLiBTaG91bGQgYmUgZ3JlYXRlciBvciBlcXVhbCB0byB6ZXJvLiBJZiBub3RcbiAgICogc3BlY2lmaWVkLCBzeXN0ZW0gaW50ZXJuYWwgc2V0dGluZyB3aWxsIGJlIHVzZWQgd2hpY2ggd2UgYmVsaWV2ZSBpcyByZWFzb25hYmxlIGZvciBtb3N0IGNhc2VzXG4gICAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbcHJvdmlzaW9uaW5nUHJvZmlsZUlkXSBJZCBvZiB0aGUgcHJvdmlzaW9uaW5nIHByb2ZpbGUgdGhhdCB3YXMgdXNlZCBhcyB0aGUgYmFzaXMgZm9yIFxuICAgKiBjcmVhdGluZyB0aGlzIGFjY291bnRcbiAgICogQHByb3BlcnR5IHtzdHJpbmd9IFtsb2dpbl0gTWV0YVRyYWRlciBhY2NvdW50IGxvZ2luXG4gICAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBzZXJ2ZXIgTWV0YVRyYWRlciBzZXJ2ZXIgbmFtZSB0byBjb25uZWN0IHRvIFxuICAgKiBAcHJvcGVydHkge1R5cGV9IHR5cGUgQWNjb3VudCB0eXBlLiBFeGVjdXRpbmcgYWNjb3VudHMgYXMgY2xvdWQtZzIgaXMgZmFzdGVyIGFuZCBjaGVhcGVyXG4gICAqIEBwcm9wZXJ0eSB7VmVyc2lvbn0gdmVyc2lvbiBNZXRhVHJhZGVyIHZlcnNpb25cbiAgICogQHByb3BlcnR5IHtudW1iZXJ9IGhhc2ggSGFzaC1jb2RlIG9mIHRoZSBhY2NvdW50XG4gICAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBiYXNlQ3VycmVuY3kgMy1jaGFyYWN0ZXIgSVNPIGN1cnJlbmN5IGNvZGUgb2YgdGhlIGFjY291bnQgYmFzZSBjdXJyZW5jeS5cbiAgICogVGhlIHNldHRpbmcgaXMgdG8gYmUgdXNlZCBmb3IgY29weSB0cmFkaW5nIGFjY291bnRzIHdoaWNoIHVzZSBuYXRpb25hbCBjdXJyZW5jaWVzIG9ubHksIHN1Y2ggYXMgc29tZSBCcmF6aWxpYW5cbiAgICogYnJva2Vycy4gWW91IHNob3VsZCBub3QgYWx0ZXIgdGhpcyBzZXR0aW5nIHVubGVzcyB5b3UgdW5kZXJzdGFuZCB3aGF0IHlvdSBhcmUgZG9pbmcuXG4gICAqIEBwcm9wZXJ0eSB7QXJyYXk8Q29weUZhY3RvcnlSb2xlcz59IGNvcHlGYWN0b3J5Um9sZXMgQWNjb3VudCByb2xlcyBmb3IgQ29weUZhY3RvcnkyIGFwcGxpY2F0aW9uXG4gICAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gcmlza01hbmFnZW1lbnRBcGlFbmFibGVkIEZsYWcgaW5kaWNhdGluZyB0aGF0IHJpc2sgbWFuYWdlbWVudCBBUEkgaXMgZW5hYmxlZCBvblxuICAgKiBhY2NvdW50XG4gICAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gbWV0YXN0YXRzQXBpRW5hYmxlZCBGbGFnIGluZGljYXRpbmcgdGhhdCBNZXRhU3RhdHMgQVBJIGlzIGVuYWJsZWQgb24gYWNjb3VudFxuICAgKiBAcHJvcGVydHkge0FycmF5PEFjY291bnRDb25uZWN0aW9uPn0gY29ubmVjdGlvbnMgQWN0aXZlIGFjY291bnQgY29ubmVjdGlvbnNcbiAgICogQHByb3BlcnR5IHtib29sZWFufSBwcmltYXJ5UmVwbGljYSBGbGFnIGluZGljYXRpbmcgdGhhdCBhY2NvdW50IGlzIHByaW1hcnlcbiAgICogQHByb3BlcnR5IHtzdHJpbmd9IHVzZXJJZCBVc2VyIGlkXG4gICAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbcHJpbWFyeUFjY291bnRJZF0gUHJpbWFyeSBhY2NvdW50IGlkLiBPbmx5IHJlcGxpY2FzIGNhbiBoYXZlIHRoaXMgZmllbGRcbiAgICogQHByb3BlcnR5IHtBcnJheTxNZXRhdHJhZGVyQWNjb3VudFJlcGxpY2FEdG8+fSBhY2NvdW50UmVwbGljYXMgTWV0YVRyYWRlciBhY2NvdW50IHJlcGxpY2FzXG4gICAqL1xuXG5cbiAgLyoqXG4gICAqIE1ldGFUcmFkZXIgYWNjb3VudCBsaXN0IG1vZGVsXG4gICAqIEB0eXBlZGVmIHtPYmplY3R9IE1ldGF0cmFkZXJBY2NvdW50TGlzdER0b1xuICAgKiBAcHJvcGVydHkge251bWJlcn0gY291bnQgTWV0YVRyYWRlciBhY2NvdW50cyBjb3VudFxuICAgKiBAcHJvcGVydHkge0FycmF5PE1ldGF0cmFkZXJBY2NvdW50RHRvPn0gaXRlbXMgTWV0YVRyYWRlciBhY2NvdW50cyBsaXN0XG4gICAqL1xuXG4gIC8qKlxuICAgKiBBY2NvdW50IGNvbm5lY3Rpb25cbiAgICogQHR5cGVkZWYge09iamVjdH0gQWNjb3VudENvbm5lY3Rpb25cbiAgICogQHByb3BlcnR5IHtzdHJpbmd9IHJlZ2lvbiBSZWdpb24gdGhlIGFjY291bnQgaXMgY29ubmVjdGVkIGF0XG4gICAqIEBwcm9wZXJ0eSB7c3RyaW5nfSB6b25lIEF2YWlsYWJpbGl0eSB6b25lIHRoZSBhY2NvdW50IGlzIGNvbm5lY3RlZCBhdFxuICAgKiBAcHJvcGVydHkge3N0cmluZ30gYXBwbGljYXRpb24gQXBwbGljYXRpb24gdGhlIGFjY291bnQgaXMgY29ubmVjdGVkIHRvLCBvbmUgb2YgYE1ldGFBcGlgLCBgQ29weUZhY3Rvcnkgc3Vic2NyaWJlcmAsXG4gICAqIGBDb3B5RmFjdG9yeSBwcm92aWRlcmAsIGBDb3B5RmFjdG9yeSBoaXN0b3J5IGltcG9ydGAsIGBSaXNrIG1hbmFnZW1lbnRgXG4gICAqL1xuXG4gIC8qKlxuICAgKiBNVCB2ZXJzaW9uXG4gICAqIEB0eXBlZGVmIHs0IHwgNX0gVmVyc2lvblxuICAgKi9cblxuICAvKipcbiAgICogTVQgcGxhdGZvcm1cbiAgICogQHR5cGVkZWYgeydtdDQnIHwgJ210NSd9IFBsYXRmb3JtXG4gICAqL1xuXG4gIC8qKlxuICAgKiBBY2NvdW50IHR5cGVcbiAgICogQHR5cGVkZWYgeydjbG91ZC1nMScgfCAnY2xvdWQtZzInfSBUeXBlXG4gICAqL1xuXG4gIC8qKlxuICAgKiBBY2NvdW50IHN0YXRlXG4gICAqIEB0eXBlZGVmIHsnQ1JFQVRFRCcgfCAnREVQTE9ZSU5HJyB8ICdERVBMT1lFRCcgfCAnREVQTE9ZX0ZBSUxFRCcgfCAnVU5ERVBMT1lJTkcnIHwgJ1VOREVQTE9ZRUQnIHxcbiAgICogJ1VOREVQTE9ZX0ZBSUxFRCcgfCAnREVMRVRJTkcnIHwgJ0RFTEVURV9GQUlMRUQnIHwgJ1JFREVQTE9ZX0ZBSUxFRCcgfCAnRFJBRlQnfSBTdGF0ZVxuICAgKi9cblxuICAvKipcbiAgICogQWNjb3VudCBjb25uZWN0aW9uIHN0YXR1c1xuICAgKiBAdHlwZWRlZiB7J0NPTk5FQ1RFRCcgfCAnRElTQ09OTkVDVEVEJyB8ICdESVNDT05ORUNURURfRlJPTV9CUk9LRVInfSBDb25uZWN0aW9uU3RhdHVzXG4gICAqL1xuXG4gIC8qKlxuICAgKiBBY2NvdW50IHJlbGlhYmlsaXR5XG4gICAqIEB0eXBlZGVmIHsnaGlnaCcgfCAncmVndWxhcid9IFJlbGlhYmlsaXR5XG4gICAqL1xuXG4gIC8qKlxuICAgKiBDb3B5RmFjdG9yeSByb2xlc1xuICAgKiBAdHlwZWRlZiB7J1NVQlNDUklCRVInIHwgJ1BST1ZJREVSJ30gQ29weUZhY3RvcnlSb2xlc1xuICAgKi9cblxuICAvKipcbiAgICogU29ydCBvcmRlclxuICAgKiBAdHlwZWRlZiB7J2FzYycgfCAnZGVzYyd9IFNvcnRPcmRlclxuICAgKi9cblxuICAvKipcbiAgICogR2V0IGFjY291bnRzIGFwaSB2ZXJzaW9uXG4gICAqIEB0eXBlZGVmIHsnMScgfCAnMid9IEdldEFjY291bnRzQXBpVmVyc2lvblxuICAgKi9cblxuICAvKipcbiAgICogQHR5cGVkZWYge09iamVjdH0gQWNjb3VudHNGaWx0ZXJcbiAgICogQHByb3BlcnR5IHtudW1iZXJ9IFtvZmZzZXRdIFNlYXJjaCBvZmZzZXQgKGRlZmF1bHRzIHRvIDApIChtdXN0IGJlIGdyZWF0ZXIgb3IgZXF1YWwgdG8gMClcbiAgICogQHByb3BlcnR5IHtudW1iZXJ9IFtsaW1pdF0gU2VhcmNoIGxpbWl0IChkZWZhdWx0cyB0byAxMDAwKSBcbiAgICogKG11c3QgYmUgZ3JlYXRlciBvciBlcXVhbCB0byAxIGFuZCBsZXNzIG9yIGVxdWFsIHRvIDEwMDApXG4gICAqIEBwcm9wZXJ0eSB7QXJyYXk8VmVyc2lvbj4gfCBWZXJzaW9ufSBbdmVyc2lvbl0gTVQgdmVyc2lvblxuICAgKiBAcHJvcGVydHkge0FycmF5PFR5cGU+IHwgVHlwZX0gW3R5cGVdIEFjY291bnQgdHlwZVxuICAgKiBAcHJvcGVydHkge0FycmF5PFN0YXRlPiB8IFN0YXRlfSBbc3RhdGVdIEFjY291bnQgc3RhdGVcbiAgICogQHByb3BlcnR5IHtBcnJheTxDb25uZWN0aW9uU3RhdHVzPiB8IENvbm5lY3Rpb25TdGF0dXN9IFtjb25uZWN0aW9uU3RhdHVzXSBDb25uZWN0aW9uIHN0YXR1c1xuICAgKiBAcHJvcGVydHkge3N0cmluZ30gW3F1ZXJ5XSBTZWFyY2hlcyBvdmVyIF9pZCwgbmFtZSwgc2VydmVyIGFuZCBsb2dpbiB0byBtYXRjaCBxdWVyeVxuICAgKiBAcHJvcGVydHkge3N0cmluZ30gW3Byb3Zpc2lvbmluZ1Byb2ZpbGVJZF0gUHJvdmlzaW9uaW5nIHByb2ZpbGUgaWRcbiAgICogQHByb3BlcnR5IHtTb3J0T3JkZXJ9IFtzb3J0T3JkZXJdIFNvcnQgb3JkZXIgZm9yIHN0YXRlQ2hhbmdlZEF0IGZpZWxkLCBkZWZhdWx0IGlzIG5vIG9yZGVyXG4gICAqIEBwcm9wZXJ0eSB7QXJyYXk8c3RyaW5nPiB8IHN0cmluZ30gW3JlZ2lvbl0gQXZhaWxhYmxlIHJlZ2lvblxuICAgKiBAcHJvcGVydHkge0FycmF5PENvcHlGYWN0b3J5Um9sZXM+IHwgQ29weUZhY3RvcnlSb2xlc30gW2NvcHlGYWN0b3J5Um9sZXNdIEFjY291bnQgcm9sZXMgZm9yIENvcHlGYWN0b3J5MiBBUElcbiAgICovXG5cbiAgLyoqXG4gICAqIFJldHVybnMgdHJhZGluZyBhY2NvdW50cyBiZWxvbmdpbmcgdG8gdGhlIGN1cnJlbnQgdXNlciAoc2VlIGh0dHBzOi8vbWV0YWFwaS5jbG91ZC9kb2NzL3Byb3Zpc2lvbmluZy9hcGkvYWNjb3VudC9yZWFkQWNjb3VudHMvKVxuICAgKiBNZXRob2QgaXMgYWNjZXNzaWJsZSBvbmx5IHdpdGggQVBJIGFjY2VzcyB0b2tlblxuICAgKiBAcGFyYW0ge0FjY291bnRzRmlsdGVyfSBbYWNjb3VudHNGaWx0ZXJdIG9wdGlvbmFsIGZpbHRlclxuICAgKiBAcGFyYW0ge0dldEFjY291bnRzQXBpVmVyc2lvbn0gW2FwaVZlcnNpb25dIGFwaSB2ZXJzaW9uIHRvIHVzZVxuICAgKiBAcmV0dXJuIHtQcm9taXNlPEFycmF5PE1ldGF0cmFkZXJBY2NvdW50RHRvPiB8IE1ldGF0cmFkZXJBY2NvdW50TGlzdER0bz59IHByb21pc2UgcmVzb2x2aW5nIHdpdGggTWV0YVRyYWRlciBhY2NvdW50cyBmb3VuZFxuICAgKi9cbiAgZ2V0QWNjb3VudHMoYWNjb3VudHNGaWx0ZXIgPSB7fSwgYXBpVmVyc2lvbikge1xuICAgIGlmICh0aGlzLl9pc05vdEp3dFRva2VuKCkpIHtcbiAgICAgIHJldHVybiB0aGlzLl9oYW5kbGVOb0FjY2Vzc0Vycm9yKCdnZXRBY2NvdW50cycpO1xuICAgIH1cbiAgICBjb25zdCBvcHRzID0ge1xuICAgICAgdXJsOiBgJHt0aGlzLl9ob3N0fS91c2Vycy9jdXJyZW50L2FjY291bnRzYCxcbiAgICAgIG1ldGhvZDogJ0dFVCcsXG4gICAgICBwYXJhbXM6IGFjY291bnRzRmlsdGVyLFxuICAgICAgaGVhZGVyczoge1xuICAgICAgICAnYXV0aC10b2tlbic6IHRoaXMuX3Rva2VuLFxuICAgICAgfSxcbiAgICAgIGpzb246IHRydWVcbiAgICB9O1xuICAgIGlmIChhcGlWZXJzaW9uKSB7XG4gICAgICBvcHRzLmhlYWRlcnNbJ2FwaS12ZXJzaW9uJ10gPSBhcGlWZXJzaW9uO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5faHR0cENsaWVudC5yZXF1ZXN0KG9wdHMsICdnZXRBY2NvdW50cycpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdHJhZGluZyBhY2NvdW50IGJ5IGlkIChzZWUgaHR0cHM6Ly9tZXRhYXBpLmNsb3VkL2RvY3MvcHJvdmlzaW9uaW5nL2FwaS9hY2NvdW50L3JlYWRBY2NvdW50LylcbiAgICogTWV0aG9kIGlzIGFjY2Vzc2libGUgb25seSB3aXRoIEFQSSBhY2Nlc3MgdG9rZW5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGlkIE1ldGFUcmFkZXIgYWNjb3VudCBpZFxuICAgKiBAcmV0dXJuIHtQcm9taXNlPE1ldGF0cmFkZXJBY2NvdW50RHRvPn0gcHJvbWlzZSByZXNvbHZpbmcgd2l0aCBNZXRhVHJhZGVyIGFjY291bnQgZm91bmRcbiA