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)

139 lines (138 loc) 18.4 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); Object.defineProperty(exports, "default", { enumerable: true, get: function() { return ClientApiClient; } }); const _metaApiclient = /*#__PURE__*/ _interop_require_default(require("../metaApi.client")); const _logger = /*#__PURE__*/ _interop_require_default(require("../../logger")); const _errorHandler = require("../errorHandler"); function _define_property(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } function _interop_require_default(obj) { return obj && obj.__esModule ? obj : { default: obj }; } let ClientApiClient = class ClientApiClient extends _metaApiclient.default { /** * Type hashing ignored field lists * @typedef {Object} TypeHashingIgnoredFieldLists * @property {String[]} specification specification ignored fields * @property {String[]} position position ignored fields * @property {String[]} order order ignored fields */ /** * Hashing ignored field lists * @typedef {Object} HashingIgnoredFieldLists * @property {TypeHashingIgnoredFieldLists} g1 g1 hashing ignored field lists * @property {TypeHashingIgnoredFieldLists} g2 g2 hashing ignored field lists */ /** * Refreshes hashing ignored field lists * @param {String} region account region * @returns {Promise} promise resolving when the hashing field lists are updated. */ async refreshIgnoredFieldLists(region) { if (this._ignoredFieldListsCaches[region] && this._ignoredFieldListsCaches[region].requestPromise) { await this._ignoredFieldListsCaches[region].requestPromise; } else if (this._ignoredFieldListsCaches[region] && Date.now() - this._ignoredFieldListsCaches[region].lastUpdated < this._updateInterval) { return; } else { if (!this._ignoredFieldListsCaches[region]) { this._ignoredFieldListsCaches[region] = { lastUpdated: 0, data: null, requestPromise: null, updateJob: setInterval(()=>this._refreshIgnoredFieldListsJob(region), 60000) }; } let resolve, reject; this._ignoredFieldListsCaches[region].requestPromise = new Promise((res, rej)=>{ resolve = res, reject = rej; }); let isCacheUpdated = false; while(!isCacheUpdated){ try { const host = await this._domainClient.getUrl(this._host, region); const opts = { url: `${host}/hashing-ignored-field-lists`, method: "GET", json: true, headers: { "auth-token": this._token } }; const response = await this._httpClient.request(opts, "getHashingIgnoredFieldLists"); this._ignoredFieldListsCaches[region] = { lastUpdated: Date.now(), data: response, requestPromise: null }; this._ignoredFieldListsFreshestCache = response; resolve(response); isCacheUpdated = true; this._ignoredFieldListsCaches[region].retryIntervalInSeconds = this._retryIntervalInSeconds; } catch (err) { this._logger.error("Failed to update hashing ignored field list", err); this._ignoredFieldListsCaches[region].retryIntervalInSeconds = Math.min(this._ignoredFieldListsCaches[region].retryIntervalInSeconds * 2, 300); await new Promise((res)=>setTimeout(res, this._ignoredFieldListsCaches[region].retryIntervalInSeconds * 1000)); } } } } /** * Retrieves hashing ignored field lists * @param {String} region account region * @returns {HashingIgnoredFieldLists} promise resolving with hashing ignored field lists */ getHashingIgnoredFieldLists(region) { if (region === "combined") { if (this._ignoredFieldListsFreshestCache) { return this._ignoredFieldListsFreshestCache; } else { throw new _errorHandler.NotFoundError("Ignored field lists not found"); } } if (this._ignoredFieldListsCaches[region] && this._ignoredFieldListsCaches[region].data) { return this._ignoredFieldListsCaches[region].data; } else { throw new _errorHandler.NotFoundError(`Ignored field lists for region ${region} not found`); } } async _refreshIgnoredFieldListsJob(region) { if (!this._ignoredFieldListsCaches[region].requestPromise && Date.now() - this._ignoredFieldListsCaches[region].lastUpdated > this._updateInterval) { await this.refreshIgnoredFieldLists(region); } } /** * Constructs client API client instance * @param {HttpClient} httpClient HTTP client * @param {DomainClient} domainClient domain client */ constructor(httpClient, domainClient){ super(httpClient, domainClient); _define_property(this, "_retryIntervalInSeconds", void 0); _define_property(this, "_updateInterval", void 0); _define_property(this, "_ignoredFieldListsCaches", void 0); _define_property(this, "_ignoredFieldListsFreshestCache", void 0); _define_property(this, "_logger", void 0); this._host = "https://mt-client-api-v1"; this._retryIntervalInSeconds = 1; this._updateInterval = 60 * 60 * 1000; this._ignoredFieldListsCaches = {}; this._ignoredFieldListsFreshestCache = null; this._logger = _logger.default.getLogger("ClientApiClient"); } }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIjxhbm9uPiJdLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHN0cmljdCc7XG5cbmltcG9ydCBNZXRhQXBpQ2xpZW50IGZyb20gJy4uL21ldGFBcGkuY2xpZW50JztcbmltcG9ydCBMb2dnZXJNYW5hZ2VyLCB7TG9nZ2VyfSBmcm9tICcuLi8uLi9sb2dnZXInO1xuaW1wb3J0IHtOb3RGb3VuZEVycm9yfSBmcm9tICcuLi9lcnJvckhhbmRsZXInO1xuaW1wb3J0IEh0dHBDbGllbnQgZnJvbSAnLi4vaHR0cENsaWVudCc7XG5pbXBvcnQgRG9tYWluQ2xpZW50IGZyb20gJy4uL2RvbWFpbi5jbGllbnQnO1xuXG4vKipcbiAqIG1ldGFhcGkuY2xvdWQgY2xpZW50IEFQSSBjbGllbnQgKHNlZSBodHRwczovL21ldGFhcGkuY2xvdWQvZG9jcy9jbGllbnQvKVxuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBDbGllbnRBcGlDbGllbnQgZXh0ZW5kcyBNZXRhQXBpQ2xpZW50IHtcbiAgXG4gIHByaXZhdGUgX3JldHJ5SW50ZXJ2YWxJblNlY29uZHM6IG51bWJlcjtcbiAgcHJpdmF0ZSBfdXBkYXRlSW50ZXJ2YWw6IG51bWJlcjtcbiAgcHJpdmF0ZSBfaWdub3JlZEZpZWxkTGlzdHNDYWNoZXM6IHt9O1xuICBwcml2YXRlIF9pZ25vcmVkRmllbGRMaXN0c0ZyZXNoZXN0Q2FjaGU6IG51bGw7XG4gIHByaXZhdGUgX2xvZ2dlcjogTG9nZ2VyO1xuXG4gIC8qKlxuICAgKiBDb25zdHJ1Y3RzIGNsaWVudCBBUEkgY2xpZW50IGluc3RhbmNlXG4gICAqIEBwYXJhbSB7SHR0cENsaWVudH0gaHR0cENsaWVudCBIVFRQIGNsaWVudFxuICAgKiBAcGFyYW0ge0RvbWFpbkNsaWVudH0gZG9tYWluQ2xpZW50IGRvbWFpbiBjbGllbnRcbiAgICovXG4gIGNvbnN0cnVjdG9yKGh0dHBDbGllbnQ6IEh0dHBDbGllbnQsIGRvbWFpbkNsaWVudDogRG9tYWluQ2xpZW50KSB7XG4gICAgc3VwZXIoaHR0cENsaWVudCwgZG9tYWluQ2xpZW50KTtcbiAgICB0aGlzLl9ob3N0ID0gJ2h0dHBzOi8vbXQtY2xpZW50LWFwaS12MSc7XG4gICAgdGhpcy5fcmV0cnlJbnRlcnZhbEluU2Vjb25kcyA9IDE7XG4gICAgdGhpcy5fdXBkYXRlSW50ZXJ2YWwgPSA2MCAqIDYwICogMTAwMDtcbiAgICB0aGlzLl9pZ25vcmVkRmllbGRMaXN0c0NhY2hlcyA9IHt9O1xuICAgIHRoaXMuX2lnbm9yZWRGaWVsZExpc3RzRnJlc2hlc3RDYWNoZSA9IG51bGw7XG4gICAgdGhpcy5fbG9nZ2VyID0gTG9nZ2VyTWFuYWdlci5nZXRMb2dnZXIoJ0NsaWVudEFwaUNsaWVudCcpO1xuICB9XG5cbiAgLyoqXG4gICAqIFR5cGUgaGFzaGluZyBpZ25vcmVkIGZpZWxkIGxpc3RzXG4gICAqIEB0eXBlZGVmIHtPYmplY3R9IFR5cGVIYXNoaW5nSWdub3JlZEZpZWxkTGlzdHNcbiAgICogQHByb3BlcnR5IHtTdHJpbmdbXX0gc3BlY2lmaWNhdGlvbiBzcGVjaWZpY2F0aW9uIGlnbm9yZWQgZmllbGRzXG4gICAqIEBwcm9wZXJ0eSB7U3RyaW5nW119IHBvc2l0aW9uIHBvc2l0aW9uIGlnbm9yZWQgZmllbGRzXG4gICAqIEBwcm9wZXJ0eSB7U3RyaW5nW119IG9yZGVyIG9yZGVyIGlnbm9yZWQgZmllbGRzXG4gICAqL1xuXG4gIC8qKlxuICAgKiBIYXNoaW5nIGlnbm9yZWQgZmllbGQgbGlzdHNcbiAgICogQHR5cGVkZWYge09iamVjdH0gSGFzaGluZ0lnbm9yZWRGaWVsZExpc3RzXG4gICAqIEBwcm9wZXJ0eSB7VHlwZUhhc2hpbmdJZ25vcmVkRmllbGRMaXN0c30gZzEgZzEgaGFzaGluZyBpZ25vcmVkIGZpZWxkIGxpc3RzXG4gICAqIEBwcm9wZXJ0eSB7VHlwZUhhc2hpbmdJZ25vcmVkRmllbGRMaXN0c30gZzIgZzIgaGFzaGluZyBpZ25vcmVkIGZpZWxkIGxpc3RzXG4gICAqL1xuXG4gIC8qKlxuICAgKiBSZWZyZXNoZXMgaGFzaGluZyBpZ25vcmVkIGZpZWxkIGxpc3RzXG4gICAqIEBwYXJhbSB7U3RyaW5nfSByZWdpb24gYWNjb3VudCByZWdpb25cbiAgICogQHJldHVybnMge1Byb21pc2V9IHByb21pc2UgcmVzb2x2aW5nIHdoZW4gdGhlIGhhc2hpbmcgZmllbGQgbGlzdHMgYXJlIHVwZGF0ZWQuXG4gICAqL1xuICBhc3luYyByZWZyZXNoSWdub3JlZEZpZWxkTGlzdHMocmVnaW9uOiBzdHJpbmcpOiBQcm9taXNlPGFueT4ge1xuICAgIGlmKHRoaXMuX2lnbm9yZWRGaWVsZExpc3RzQ2FjaGVzW3JlZ2lvbl0gJiYgdGhpcy5faWdub3JlZEZpZWxkTGlzdHNDYWNoZXNbcmVnaW9uXS5yZXF1ZXN0UHJvbWlzZSkge1xuICAgICAgYXdhaXQgdGhpcy5faWdub3JlZEZpZWxkTGlzdHNDYWNoZXNbcmVnaW9uXS5yZXF1ZXN0UHJvbWlzZTtcbiAgICB9IGVsc2UgaWYgKHRoaXMuX2lnbm9yZWRGaWVsZExpc3RzQ2FjaGVzW3JlZ2lvbl0gJiYgXG4gICAgICBEYXRlLm5vdygpIC0gdGhpcy5faWdub3JlZEZpZWxkTGlzdHNDYWNoZXNbcmVnaW9uXS5sYXN0VXBkYXRlZCA8IHRoaXMuX3VwZGF0ZUludGVydmFsKSB7XG4gICAgICByZXR1cm47XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmKCF0aGlzLl9pZ25vcmVkRmllbGRMaXN0c0NhY2hlc1tyZWdpb25dKSB7XG4gICAgICAgIHRoaXMuX2lnbm9yZWRGaWVsZExpc3RzQ2FjaGVzW3JlZ2lvbl0gPSB7XG4gICAgICAgICAgbGFzdFVwZGF0ZWQ6IDAsXG4gICAgICAgICAgZGF0YTogbnVsbCxcbiAgICAgICAgICByZXF1ZXN0UHJvbWlzZTogbnVsbCxcbiAgICAgICAgICB1cGRhdGVKb2I6IHNldEludGVydmFsKCgpID0+IHRoaXMuX3JlZnJlc2hJZ25vcmVkRmllbGRMaXN0c0pvYihyZWdpb24pLCA2MDAwMClcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIGxldCByZXNvbHZlLCByZWplY3Q7XG4gICAgICB0aGlzLl9pZ25vcmVkRmllbGRMaXN0c0NhY2hlc1tyZWdpb25dLnJlcXVlc3RQcm9taXNlID0gbmV3IFByb21pc2UoKHJlcywgcmVqKSA9PiB7XG4gICAgICAgIHJlc29sdmUgPSByZXMsIHJlamVjdCA9IHJlajtcbiAgICAgIH0pO1xuICAgICAgbGV0IGlzQ2FjaGVVcGRhdGVkID0gZmFsc2U7XG4gICAgICB3aGlsZSghaXNDYWNoZVVwZGF0ZWQpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCBob3N0ID0gYXdhaXQgdGhpcy5fZG9tYWluQ2xpZW50LmdldFVybCh0aGlzLl9ob3N0LCByZWdpb24pO1xuICAgICAgICAgIGNvbnN0IG9wdHMgPSB7XG4gICAgICAgICAgICB1cmw6IGAke2hvc3R9L2hhc2hpbmctaWdub3JlZC1maWVsZC1saXN0c2AsXG4gICAgICAgICAgICBtZXRob2Q6ICdHRVQnLFxuICAgICAgICAgICAganNvbjogdHJ1ZSxcbiAgICAgICAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgICAgICAgJ2F1dGgtdG9rZW4nOiB0aGlzLl90b2tlblxuICAgICAgICAgICAgfVxuICAgICAgICAgIH07XG4gICAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLl9odHRwQ2xpZW50LnJlcXVlc3Qob3B0cywgJ2dldEhhc2hpbmdJZ25vcmVkRmllbGRMaXN0cycpO1xuICAgICAgICAgIHRoaXMuX2lnbm9yZWRGaWVsZExpc3RzQ2FjaGVzW3JlZ2lvbl0gPSB7IGxhc3RVcGRhdGVkOiBEYXRlLm5vdygpLCBkYXRhOiByZXNwb25zZSwgcmVxdWVzdFByb21pc2U6IG51bGwgfTtcbiAgICAgICAgICB0aGlzLl9pZ25vcmVkRmllbGRMaXN0c0ZyZXNoZXN0Q2FjaGUgPSByZXNwb25zZTtcbiAgICAgICAgICByZXNvbHZlKHJlc3BvbnNlKTtcbiAgICAgICAgICBpc0NhY2hlVXBkYXRlZCA9IHRydWU7XG4gICAgICAgICAgdGhpcy5faWdub3JlZEZpZWxkTGlzdHNDYWNoZXNbcmVnaW9uXS5yZXRyeUludGVydmFsSW5TZWNvbmRzID0gdGhpcy5fcmV0cnlJbnRlcnZhbEluU2Vjb25kcztcbiAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKCdGYWlsZWQgdG8gdXBkYXRlIGhhc2hpbmcgaWdub3JlZCBmaWVsZCBsaXN0JywgZXJyKTtcbiAgICAgICAgICB0aGlzLl9pZ25vcmVkRmllbGRMaXN0c0NhY2hlc1tyZWdpb25dLnJldHJ5SW50ZXJ2YWxJblNlY29uZHMgPVxuICAgICAgICAgICAgTWF0aC5taW4odGhpcy5faWdub3JlZEZpZWxkTGlzdHNDYWNoZXNbcmVnaW9uXS5yZXRyeUludGVydmFsSW5TZWNvbmRzICogMiwgMzAwKTtcbiAgICAgICAgICBhd2FpdCBuZXcgUHJvbWlzZShyZXMgPT4gc2V0VGltZW91dChyZXMsIFxuICAgICAgICAgICAgdGhpcy5faWdub3JlZEZpZWxkTGlzdHNDYWNoZXNbcmVnaW9uXS5yZXRyeUludGVydmFsSW5TZWNvbmRzICogMTAwMCkpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJldHJpZXZlcyBoYXNoaW5nIGlnbm9yZWQgZmllbGQgbGlzdHNcbiAgICogQHBhcmFtIHtTdHJpbmd9IHJlZ2lvbiBhY2NvdW50IHJlZ2lvblxuICAgKiBAcmV0dXJucyB7SGFzaGluZ0lnbm9yZWRGaWVsZExpc3RzfSBwcm9taXNlIHJlc29sdmluZyB3aXRoIGhhc2hpbmcgaWdub3JlZCBmaWVsZCBsaXN0c1xuICAgKi9cbiAgZ2V0SGFzaGluZ0lnbm9yZWRGaWVsZExpc3RzKHJlZ2lvbjogc3RyaW5nKTogSGFzaGluZ0lnbm9yZWRGaWVsZExpc3RzIHtcbiAgICBpZihyZWdpb24gPT09ICdjb21iaW5lZCcpIHtcbiAgICAgIGlmICh0aGlzLl9pZ25vcmVkRmllbGRMaXN0c0ZyZXNoZXN0Q2FjaGUpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2lnbm9yZWRGaWVsZExpc3RzRnJlc2hlc3RDYWNoZTtcbiAgICAgIH0gZWxzZXsgXG4gICAgICAgIHRocm93IG5ldyBOb3RGb3VuZEVycm9yKCdJZ25vcmVkIGZpZWxkIGxpc3RzIG5vdCBmb3VuZCcpO1xuICAgICAgfVxuICAgIH1cbiAgICBpZih0aGlzLl9pZ25vcmVkRmllbGRMaXN0c0NhY2hlc1tyZWdpb25dICYmIHRoaXMuX2lnbm9yZWRGaWVsZExpc3RzQ2FjaGVzW3JlZ2lvbl0uZGF0YSkge1xuICAgICAgcmV0dXJuIHRoaXMuX2lnbm9yZWRGaWVsZExpc3RzQ2FjaGVzW3JlZ2lvbl0uZGF0YTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IE5vdEZvdW5kRXJyb3IoYElnbm9yZWQgZmllbGQgbGlzdHMgZm9yIHJlZ2lvbiAke3JlZ2lvbn0gbm90IGZvdW5kYCk7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgX3JlZnJlc2hJZ25vcmVkRmllbGRMaXN0c0pvYihyZWdpb24pIHtcbiAgICBpZighdGhpcy5faWdub3JlZEZpZWxkTGlzdHNDYWNoZXNbcmVnaW9uXS5yZXF1ZXN0UHJvbWlzZSAmJiBcbiAgICAgIERhdGUubm93KCkgLSB0aGlzLl9pZ25vcmVkRmllbGRMaXN0c0NhY2hlc1tyZWdpb25dLmxhc3RVcGRhdGVkID4gdGhpcy5fdXBkYXRlSW50ZXJ2YWwpIHtcbiAgICAgIGF3YWl0IHRoaXMucmVmcmVzaElnbm9yZWRGaWVsZExpc3RzKHJlZ2lvbik7XG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogVHlwZSBoYXNoaW5nIGlnbm9yZWQgZmllbGQgbGlzdHNcbiAqL1xuZXhwb3J0IGRlY2xhcmUgdHlwZSBUeXBlSGFzaGluZ0lnbm9yZWRGaWVsZExpc3RzID0ge1xuXG4gIC8qKlxuICAgKiBzcGVjaWZpY2F0aW9ucyBpZ25vcmVkIGZpZWxkc1xuICAgKi9cbiAgc3BlY2lmaWNhdGlvbjogc3RyaW5nW10sXG5cbiAgLyoqXG4gICAqIHBvc2l0aW9uIGlnbm9yZWQgZmllbGRzXG4gICAqL1xuICBwb3NpdGlvbjogc3RyaW5nW10sXG5cbiAgLyoqXG4gICAqIG9yZGVyIGlnbm9yZWQgZmllbGRzXG4gICAqL1xuICBvcmRlcjogc3RyaW5nW10sXG59XG5cbi8qKlxuICogSGFzaGluZyBpZ25vcmVkIGZpZWxkIGxpc3RzXG4gKi9cbmV4cG9ydCBkZWNsYXJlIHR5cGUgSGFzaGluZ0lnbm9yZWRGaWVsZExpc3RzID0ge1xuXG4gIC8qKlxuICAgKiBnMSBoYXNoaW5nIGlnbm9yZWQgZmllbGQgbGlzdHNcbiAgICovXG4gIGcxOiBUeXBlSGFzaGluZ0lnbm9yZWRGaWVsZExpc3RzLFxuXG4gIC8qKlxuICAgKiBnMiBoYXNoaW5nIGlnbm9yZWQgZmllbGQgbGlzdHNcbiAgICovXG4gIGcyOiBUeXBlSGFzaGluZ0lnbm9yZWRGaWVsZExpc3RzLFxufVxuIl0sIm5hbWVzIjpbIkNsaWVudEFwaUNsaWVudCIsIk1ldGFBcGlDbGllbnQiLCJyZWZyZXNoSWdub3JlZEZpZWxkTGlzdHMiLCJyZWdpb24iLCJfaWdub3JlZEZpZWxkTGlzdHNDYWNoZXMiLCJyZXF1ZXN0UHJvbWlzZSIsIkRhdGUiLCJub3ciLCJsYXN0VXBkYXRlZCIsIl91cGRhdGVJbnRlcnZhbCIsImRhdGEiLCJ1cGRhdGVKb2IiLCJzZXRJbnRlcnZhbCIsIl9yZWZyZXNoSWdub3JlZEZpZWxkTGlzdHNKb2IiLCJyZXNvbHZlIiwicmVqZWN0IiwiUHJvbWlzZSIsInJlcyIsInJlaiIsImlzQ2FjaGVVcGRhdGVkIiwiaG9zdCIsIl9kb21haW5DbGllbnQiLCJnZXRVcmwiLCJfaG9zdCIsIm9wdHMiLCJ1cmwiLCJtZXRob2QiLCJqc29uIiwiaGVhZGVycyIsIl90b2tlbiIsInJlc3BvbnNlIiwiX2h0dHBDbGllbnQiLCJyZXF1ZXN0IiwiX2lnbm9yZWRGaWVsZExpc3RzRnJlc2hlc3RDYWNoZSIsInJldHJ5SW50ZXJ2YWxJblNlY29uZHMiLCJfcmV0cnlJbnRlcnZhbEluU2Vjb25kcyIsImVyciIsIl9sb2dnZXIiLCJlcnJvciIsIk1hdGgiLCJtaW4iLCJzZXRUaW1lb3V0IiwiZ2V0SGFzaGluZ0lnbm9yZWRGaWVsZExpc3RzIiwiTm90Rm91bmRFcnJvciIsImNvbnN0cnVjdG9yIiwiaHR0cENsaWVudCIsImRvbWFpbkNsaWVudCIsIkxvZ2dlck1hbmFnZXIiLCJnZXRMb2dnZXIiXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7O2VBV3FCQTs7O3NFQVRLOytEQUNVOzhCQUNSOzs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBT2IsSUFBQSxBQUFNQSxrQkFBTixNQUFNQSx3QkFBd0JDLHNCQUFhO0lBdUJ4RDs7Ozs7O0dBTUMsR0FFRDs7Ozs7R0FLQyxHQUVEOzs7O0dBSUMsR0FDRCxNQUFNQyx5QkFBeUJDLE1BQWMsRUFBZ0I7UUFDM0QsSUFBRyxJQUFJLENBQUNDLHdCQUF3QixDQUFDRCxPQUFPLElBQUksSUFBSSxDQUFDQyx3QkFBd0IsQ0FBQ0QsT0FBTyxDQUFDRSxjQUFjLEVBQUU7WUFDaEcsTUFBTSxJQUFJLENBQUNELHdCQUF3QixDQUFDRCxPQUFPLENBQUNFLGNBQWM7UUFDNUQsT0FBTyxJQUFJLElBQUksQ0FBQ0Qsd0JBQXdCLENBQUNELE9BQU8sSUFDOUNHLEtBQUtDLEdBQUcsS0FBSyxJQUFJLENBQUNILHdCQUF3QixDQUFDRCxPQUFPLENBQUNLLFdBQVcsR0FBRyxJQUFJLENBQUNDLGVBQWUsRUFBRTtZQUN2RjtRQUNGLE9BQU87WUFDTCxJQUFHLENBQUMsSUFBSSxDQUFDTCx3QkFBd0IsQ0FBQ0QsT0FBTyxFQUFFO2dCQUN6QyxJQUFJLENBQUNDLHdCQUF3QixDQUFDRCxPQUFPLEdBQUc7b0JBQ3RDSyxhQUFhO29CQUNiRSxNQUFNO29CQUNOTCxnQkFBZ0I7b0JBQ2hCTSxXQUFXQyxZQUFZLElBQU0sSUFBSSxDQUFDQyw0QkFBNEIsQ0FBQ1YsU0FBUztnQkFDMUU7WUFDRjtZQUNBLElBQUlXLFNBQVNDO1lBQ2IsSUFBSSxDQUFDWCx3QkFBd0IsQ0FBQ0QsT0FBTyxDQUFDRSxjQUFjLEdBQUcsSUFBSVcsUUFBUSxDQUFDQyxLQUFLQztnQkFDdkVKLFVBQVVHLEtBQUtGLFNBQVNHO1lBQzFCO1lBQ0EsSUFBSUMsaUJBQWlCO1lBQ3JCLE1BQU0sQ0FBQ0EsZUFBZ0I7Z0JBQ3JCLElBQUk7b0JBQ0YsTUFBTUMsT0FBTyxNQUFNLElBQUksQ0FBQ0MsYUFBYSxDQUFDQyxNQUFNLENBQUMsSUFBSSxDQUFDQyxLQUFLLEVBQUVwQjtvQkFDekQsTUFBTXFCLE9BQU87d0JBQ1hDLEtBQUssQ0FBQyxFQUFFTCxLQUFLLDRCQUE0QixDQUFDO3dCQUMxQ00sUUFBUTt3QkFDUkMsTUFBTTt3QkFDTkMsU0FBUzs0QkFDUCxjQUFjLElBQUksQ0FBQ0MsTUFBTTt3QkFDM0I7b0JBQ0Y7b0JBQ0EsTUFBTUMsV0FBVyxNQUFNLElBQUksQ0FBQ0MsV0FBVyxDQUFDQyxPQUFPLENBQUNSLE1BQU07b0JBQ3RELElBQUksQ0FBQ3BCLHdCQUF3QixDQUFDRCxPQUFPLEdBQUc7d0JBQUVLLGFBQWFGLEtBQUtDLEdBQUc7d0JBQUlHLE1BQU1vQjt3QkFBVXpCLGdCQUFnQjtvQkFBSztvQkFDeEcsSUFBSSxDQUFDNEIsK0JBQStCLEdBQUdIO29CQUN2Q2hCLFFBQVFnQjtvQkFDUlgsaUJBQWlCO29CQUNqQixJQUFJLENBQUNmLHdCQUF3QixDQUFDRCxPQUFPLENBQUMrQixzQkFBc0IsR0FBRyxJQUFJLENBQUNDLHVCQUF1QjtnQkFDN0YsRUFBRSxPQUFPQyxLQUFLO29CQUNaLElBQUksQ0FBQ0MsT0FBTyxDQUFDQyxLQUFLLENBQUMsK0NBQStDRjtvQkFDbEUsSUFBSSxDQUFDaEMsd0JBQXdCLENBQUNELE9BQU8sQ0FBQytCLHNCQUFzQixHQUMxREssS0FBS0MsR0FBRyxDQUFDLElBQUksQ0FBQ3BDLHdCQUF3QixDQUFDRCxPQUFPLENBQUMrQixzQkFBc0IsR0FBRyxHQUFHO29CQUM3RSxNQUFNLElBQUlsQixRQUFRQyxDQUFBQSxNQUFPd0IsV0FBV3hCLEtBQ2xDLElBQUksQ0FBQ2Isd0JBQXdCLENBQUNELE9BQU8sQ0FBQytCLHNCQUFzQixHQUFHO2dCQUNuRTtZQUNGO1FBQ0Y7SUFDRjtJQUVBOzs7O0dBSUMsR0FDRFEsNEJBQTRCdkMsTUFBYyxFQUE0QjtRQUNwRSxJQUFHQSxXQUFXLFlBQVk7WUFDeEIsSUFBSSxJQUFJLENBQUM4QiwrQkFBK0IsRUFBRTtnQkFDeEMsT0FBTyxJQUFJLENBQUNBLCtCQUErQjtZQUM3QyxPQUFNO2dCQUNKLE1BQU0sSUFBSVUsMkJBQWEsQ0FBQztZQUMxQjtRQUNGO1FBQ0EsSUFBRyxJQUFJLENBQUN2Qyx3QkFBd0IsQ0FBQ0QsT0FBTyxJQUFJLElBQUksQ0FBQ0Msd0JBQXdCLENBQUNELE9BQU8sQ0FBQ08sSUFBSSxFQUFFO1lBQ3RGLE9BQU8sSUFBSSxDQUFDTix3QkFBd0IsQ0FBQ0QsT0FBTyxDQUFDTyxJQUFJO1FBQ25ELE9BQU87WUFDTCxNQUFNLElBQUlpQywyQkFBYSxDQUFDLENBQUMsK0JBQStCLEVBQUV4QyxPQUFPLFVBQVUsQ0FBQztRQUM5RTtJQUNGO0lBRUEsTUFBTVUsNkJBQTZCVixNQUFNLEVBQUU7UUFDekMsSUFBRyxDQUFDLElBQUksQ0FBQ0Msd0JBQXdCLENBQUNELE9BQU8sQ0FBQ0UsY0FBYyxJQUN0REMsS0FBS0MsR0FBRyxLQUFLLElBQUksQ0FBQ0gsd0JBQXdCLENBQUNELE9BQU8sQ0FBQ0ssV0FBVyxHQUFHLElBQUksQ0FBQ0MsZUFBZSxFQUFFO1lBQ3ZGLE1BQU0sSUFBSSxDQUFDUCx3QkFBd0IsQ0FBQ0M7UUFDdEM7SUFDRjtJQTVHQTs7OztHQUlDLEdBQ0R5QyxZQUFZQyxVQUFzQixFQUFFQyxZQUEwQixDQUFFO1FBQzlELEtBQUssQ0FBQ0QsWUFBWUM7UUFacEIsdUJBQVFYLDJCQUFSLEtBQUE7UUFDQSx1QkFBUTFCLG1CQUFSLEtBQUE7UUFDQSx1QkFBUUwsNEJBQVIsS0FBQTtRQUNBLHVCQUFRNkIsbUNBQVIsS0FBQTtRQUNBLHVCQUFRSSxXQUFSLEtBQUE7UUFTRSxJQUFJLENBQUNkLEtBQUssR0FBRztRQUNiLElBQUksQ0FBQ1ksdUJBQXVCLEdBQUc7UUFDL0IsSUFBSSxDQUFDMUIsZUFBZSxHQUFHLEtBQUssS0FBSztRQUNqQyxJQUFJLENBQUNMLHdCQUF3QixHQUFHLENBQUM7UUFDakMsSUFBSSxDQUFDNkIsK0JBQStCLEdBQUc7UUFDdkMsSUFBSSxDQUFDSSxPQUFPLEdBQUdVLGVBQWEsQ0FBQ0MsU0FBUyxDQUFDO0lBQ3pDO0FBZ0dGIn0=