UNPKG

matrix-react-sdk

Version:
112 lines (109 loc) 16.9 kB
"use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.getSlashCommand = getSlashCommand; exports.isSlashCommand = isSlashCommand; exports.runSlashCommand = runSlashCommand; exports.shouldSendAnyway = shouldSendAnyway; var _react = _interopRequireDefault(require("react")); var _logger = require("matrix-js-sdk/src/logger"); var _parts = require("./parts"); var _SlashCommands = require("../SlashCommands"); var _languageHandler = require("../languageHandler"); var _Modal = _interopRequireDefault(require("../Modal")); var _ErrorDialog = _interopRequireDefault(require("../components/views/dialogs/ErrorDialog")); var _QuestionDialog = _interopRequireDefault(require("../components/views/dialogs/QuestionDialog")); /* Copyright 2024 New Vector Ltd. Copyright 2019-2022 The Matrix.org Foundation C.I.C. SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only Please see LICENSE files in the repository root for full details. */ function isSlashCommand(model) { const parts = model.parts; const firstPart = parts[0]; if (firstPart) { if (firstPart.type === _parts.Type.Command && firstPart.text.startsWith("/") && !firstPart.text.startsWith("//")) { return true; } if (firstPart.text.startsWith("/") && !firstPart.text.startsWith("//") && (firstPart.type === _parts.Type.Plain || firstPart.type === _parts.Type.PillCandidate)) { return true; } } return false; } function getSlashCommand(model) { const commandText = model.parts.reduce((text, part) => { // use mxid to textify user pills in a command and room alias/id for room pills if (part.type === _parts.Type.UserPill || part.type === _parts.Type.RoomPill) { return text + part.resourceId; } return text + part.text; }, ""); const { cmd, args } = (0, _SlashCommands.getCommand)(commandText); return [cmd, args, commandText]; } async function runSlashCommand(matrixClient, cmd, args, roomId, threadId) { const result = cmd.run(matrixClient, roomId, threadId, args); let messageContent = null; let error = result.error; if (result.promise) { try { if (cmd.category === _SlashCommands.CommandCategories.messages || cmd.category === _SlashCommands.CommandCategories.effects) { messageContent = (await result.promise) ?? null; } else { await result.promise; } } catch (err) { error = err; } } if (error) { _logger.logger.error(`Command failure: ${error}`); // assume the error is a server error when the command is async const isServerError = !!result.promise; const title = isServerError ? (0, _languageHandler._td)("slash_command|server_error") : (0, _languageHandler._td)("slash_command|command_error"); let errText; if (typeof error === "string") { errText = error; } else if (error instanceof _languageHandler.UserFriendlyError) { errText = error.translatedMessage; } else if (error.message) { errText = error.message; } else { errText = (0, _languageHandler._t)("slash_command|server_error_detail"); } _Modal.default.createDialog(_ErrorDialog.default, { title: (0, _languageHandler._t)(title), description: errText }); return [null, false]; } else { _logger.logger.log("Command success."); return [messageContent, true]; } } async function shouldSendAnyway(commandText) { // ask the user if their unknown command should be sent as a message const { finished } = _Modal.default.createDialog(_QuestionDialog.default, { title: (0, _languageHandler._t)("slash_command|unknown_command"), description: /*#__PURE__*/_react.default.createElement("div", null, /*#__PURE__*/_react.default.createElement("p", null, (0, _languageHandler._t)("slash_command|unknown_command_detail", { commandText })), /*#__PURE__*/_react.default.createElement("p", null, (0, _languageHandler._t)("slash_command|unknown_command_help", {}, { code: t => /*#__PURE__*/_react.default.createElement("code", null, t) })), /*#__PURE__*/_react.default.createElement("p", null, (0, _languageHandler._t)("slash_command|unknown_command_hint", {}, { code: t => /*#__PURE__*/_react.default.createElement("code", null, t) }))), button: (0, _languageHandler._t)("slash_command|unknown_command_button") }); const [sendAnyway] = await finished; return sendAnyway || false; } //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfcmVhY3QiLCJfaW50ZXJvcFJlcXVpcmVEZWZhdWx0IiwicmVxdWlyZSIsIl9sb2dnZXIiLCJfcGFydHMiLCJfU2xhc2hDb21tYW5kcyIsIl9sYW5ndWFnZUhhbmRsZXIiLCJfTW9kYWwiLCJfRXJyb3JEaWFsb2ciLCJfUXVlc3Rpb25EaWFsb2ciLCJpc1NsYXNoQ29tbWFuZCIsIm1vZGVsIiwicGFydHMiLCJmaXJzdFBhcnQiLCJ0eXBlIiwiVHlwZSIsIkNvbW1hbmQiLCJ0ZXh0Iiwic3RhcnRzV2l0aCIsIlBsYWluIiwiUGlsbENhbmRpZGF0ZSIsImdldFNsYXNoQ29tbWFuZCIsImNvbW1hbmRUZXh0IiwicmVkdWNlIiwicGFydCIsIlVzZXJQaWxsIiwiUm9vbVBpbGwiLCJyZXNvdXJjZUlkIiwiY21kIiwiYXJncyIsImdldENvbW1hbmQiLCJydW5TbGFzaENvbW1hbmQiLCJtYXRyaXhDbGllbnQiLCJyb29tSWQiLCJ0aHJlYWRJZCIsInJlc3VsdCIsInJ1biIsIm1lc3NhZ2VDb250ZW50IiwiZXJyb3IiLCJwcm9taXNlIiwiY2F0ZWdvcnkiLCJDb21tYW5kQ2F0ZWdvcmllcyIsIm1lc3NhZ2VzIiwiZWZmZWN0cyIsImVyciIsImxvZ2dlciIsImlzU2VydmVyRXJyb3IiLCJ0aXRsZSIsIl90ZCIsImVyclRleHQiLCJVc2VyRnJpZW5kbHlFcnJvciIsInRyYW5zbGF0ZWRNZXNzYWdlIiwibWVzc2FnZSIsIl90IiwiTW9kYWwiLCJjcmVhdGVEaWFsb2ciLCJFcnJvckRpYWxvZyIsImRlc2NyaXB0aW9uIiwibG9nIiwic2hvdWxkU2VuZEFueXdheSIsImZpbmlzaGVkIiwiUXVlc3Rpb25EaWFsb2ciLCJkZWZhdWx0IiwiY3JlYXRlRWxlbWVudCIsImNvZGUiLCJ0IiwiYnV0dG9uIiwic2VuZEFueXdheSJdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9lZGl0b3IvY29tbWFuZHMudHN4Il0sInNvdXJjZXNDb250ZW50IjpbIi8qXG5Db3B5cmlnaHQgMjAyNCBOZXcgVmVjdG9yIEx0ZC5cbkNvcHlyaWdodCAyMDE5LTIwMjIgVGhlIE1hdHJpeC5vcmcgRm91bmRhdGlvbiBDLkkuQy5cblxuU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFHUEwtMy4wLW9ubHkgT1IgR1BMLTMuMC1vbmx5XG5QbGVhc2Ugc2VlIExJQ0VOU0UgZmlsZXMgaW4gdGhlIHJlcG9zaXRvcnkgcm9vdCBmb3IgZnVsbCBkZXRhaWxzLlxuKi9cblxuaW1wb3J0IFJlYWN0IGZyb20gXCJyZWFjdFwiO1xuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSBcIm1hdHJpeC1qcy1zZGsvc3JjL2xvZ2dlclwiO1xuaW1wb3J0IHsgTWF0cml4Q2xpZW50IH0gZnJvbSBcIm1hdHJpeC1qcy1zZGsvc3JjL21hdHJpeFwiO1xuaW1wb3J0IHsgUm9vbU1lc3NhZ2VFdmVudENvbnRlbnQgfSBmcm9tIFwibWF0cml4LWpzLXNkay9zcmMvdHlwZXNcIjtcblxuaW1wb3J0IEVkaXRvck1vZGVsIGZyb20gXCIuL21vZGVsXCI7XG5pbXBvcnQgeyBUeXBlIH0gZnJvbSBcIi4vcGFydHNcIjtcbmltcG9ydCB7IENvbW1hbmQsIENvbW1hbmRDYXRlZ29yaWVzLCBnZXRDb21tYW5kIH0gZnJvbSBcIi4uL1NsYXNoQ29tbWFuZHNcIjtcbmltcG9ydCB7IFVzZXJGcmllbmRseUVycm9yLCBfdCwgX3RkIH0gZnJvbSBcIi4uL2xhbmd1YWdlSGFuZGxlclwiO1xuaW1wb3J0IE1vZGFsIGZyb20gXCIuLi9Nb2RhbFwiO1xuaW1wb3J0IEVycm9yRGlhbG9nIGZyb20gXCIuLi9jb21wb25lbnRzL3ZpZXdzL2RpYWxvZ3MvRXJyb3JEaWFsb2dcIjtcbmltcG9ydCBRdWVzdGlvbkRpYWxvZyBmcm9tIFwiLi4vY29tcG9uZW50cy92aWV3cy9kaWFsb2dzL1F1ZXN0aW9uRGlhbG9nXCI7XG5cbmV4cG9ydCBmdW5jdGlvbiBpc1NsYXNoQ29tbWFuZChtb2RlbDogRWRpdG9yTW9kZWwpOiBib29sZWFuIHtcbiAgICBjb25zdCBwYXJ0cyA9IG1vZGVsLnBhcnRzO1xuICAgIGNvbnN0IGZpcnN0UGFydCA9IHBhcnRzWzBdO1xuICAgIGlmIChmaXJzdFBhcnQpIHtcbiAgICAgICAgaWYgKGZpcnN0UGFydC50eXBlID09PSBUeXBlLkNvbW1hbmQgJiYgZmlyc3RQYXJ0LnRleHQuc3RhcnRzV2l0aChcIi9cIikgJiYgIWZpcnN0UGFydC50ZXh0LnN0YXJ0c1dpdGgoXCIvL1wiKSkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoXG4gICAgICAgICAgICBmaXJzdFBhcnQudGV4dC5zdGFydHNXaXRoKFwiL1wiKSAmJlxuICAgICAgICAgICAgIWZpcnN0UGFydC50ZXh0LnN0YXJ0c1dpdGgoXCIvL1wiKSAmJlxuICAgICAgICAgICAgKGZpcnN0UGFydC50eXBlID09PSBUeXBlLlBsYWluIHx8IGZpcnN0UGFydC50eXBlID09PSBUeXBlLlBpbGxDYW5kaWRhdGUpXG4gICAgICAgICkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0U2xhc2hDb21tYW5kKG1vZGVsOiBFZGl0b3JNb2RlbCk6IFtDb21tYW5kIHwgdW5kZWZpbmVkLCBzdHJpbmcgfCB1bmRlZmluZWQsIHN0cmluZ10ge1xuICAgIGNvbnN0IGNvbW1hbmRUZXh0ID0gbW9kZWwucGFydHMucmVkdWNlKCh0ZXh0LCBwYXJ0KSA9PiB7XG4gICAgICAgIC8vIHVzZSBteGlkIHRvIHRleHRpZnkgdXNlciBwaWxscyBpbiBhIGNvbW1hbmQgYW5kIHJvb20gYWxpYXMvaWQgZm9yIHJvb20gcGlsbHNcbiAgICAgICAgaWYgKHBhcnQudHlwZSA9PT0gVHlwZS5Vc2VyUGlsbCB8fCBwYXJ0LnR5cGUgPT09IFR5cGUuUm9vbVBpbGwpIHtcbiAgICAgICAgICAgIHJldHVybiB0ZXh0ICsgcGFydC5yZXNvdXJjZUlkO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0ZXh0ICsgcGFydC50ZXh0O1xuICAgIH0sIFwiXCIpO1xuICAgIGNvbnN0IHsgY21kLCBhcmdzIH0gPSBnZXRDb21tYW5kKGNvbW1hbmRUZXh0KTtcbiAgICByZXR1cm4gW2NtZCwgYXJncywgY29tbWFuZFRleHRdO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcnVuU2xhc2hDb21tYW5kKFxuICAgIG1hdHJpeENsaWVudDogTWF0cml4Q2xpZW50LFxuICAgIGNtZDogQ29tbWFuZCxcbiAgICBhcmdzOiBzdHJpbmcgfCB1bmRlZmluZWQsXG4gICAgcm9vbUlkOiBzdHJpbmcsXG4gICAgdGhyZWFkSWQ6IHN0cmluZyB8IG51bGwsXG4pOiBQcm9taXNlPFtjb250ZW50OiBSb29tTWVzc2FnZUV2ZW50Q29udGVudCB8IG51bGwsIHN1Y2Nlc3M6IGJvb2xlYW5dPiB7XG4gICAgY29uc3QgcmVzdWx0ID0gY21kLnJ1bihtYXRyaXhDbGllbnQsIHJvb21JZCwgdGhyZWFkSWQsIGFyZ3MpO1xuICAgIGxldCBtZXNzYWdlQ29udGVudDogUm9vbU1lc3NhZ2VFdmVudENvbnRlbnQgfCBudWxsID0gbnVsbDtcbiAgICBsZXQgZXJyb3I6IGFueSA9IHJlc3VsdC5lcnJvcjtcbiAgICBpZiAocmVzdWx0LnByb21pc2UpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGlmIChjbWQuY2F0ZWdvcnkgPT09IENvbW1hbmRDYXRlZ29yaWVzLm1lc3NhZ2VzIHx8IGNtZC5jYXRlZ29yeSA9PT0gQ29tbWFuZENhdGVnb3JpZXMuZWZmZWN0cykge1xuICAgICAgICAgICAgICAgIG1lc3NhZ2VDb250ZW50ID0gKGF3YWl0IHJlc3VsdC5wcm9taXNlKSA/PyBudWxsO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBhd2FpdCByZXN1bHQucHJvbWlzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICBlcnJvciA9IGVycjtcbiAgICAgICAgfVxuICAgIH1cbiAgICBpZiAoZXJyb3IpIHtcbiAgICAgICAgbG9nZ2VyLmVycm9yKGBDb21tYW5kIGZhaWx1cmU6ICR7ZXJyb3J9YCk7XG4gICAgICAgIC8vIGFzc3VtZSB0aGUgZXJyb3IgaXMgYSBzZXJ2ZXIgZXJyb3Igd2hlbiB0aGUgY29tbWFuZCBpcyBhc3luY1xuICAgICAgICBjb25zdCBpc1NlcnZlckVycm9yID0gISFyZXN1bHQucHJvbWlzZTtcbiAgICAgICAgY29uc3QgdGl0bGUgPSBpc1NlcnZlckVycm9yID8gX3RkKFwic2xhc2hfY29tbWFuZHxzZXJ2ZXJfZXJyb3JcIikgOiBfdGQoXCJzbGFzaF9jb21tYW5kfGNvbW1hbmRfZXJyb3JcIik7XG5cbiAgICAgICAgbGV0IGVyclRleHQ7XG4gICAgICAgIGlmICh0eXBlb2YgZXJyb3IgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICAgIGVyclRleHQgPSBlcnJvcjtcbiAgICAgICAgfSBlbHNlIGlmIChlcnJvciBpbnN0YW5jZW9mIFVzZXJGcmllbmRseUVycm9yKSB7XG4gICAgICAgICAgICBlcnJUZXh0ID0gZXJyb3IudHJhbnNsYXRlZE1lc3NhZ2U7XG4gICAgICAgIH0gZWxzZSBpZiAoZXJyb3IubWVzc2FnZSkge1xuICAgICAgICAgICAgZXJyVGV4dCA9IGVycm9yLm1lc3NhZ2U7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBlcnJUZXh0ID0gX3QoXCJzbGFzaF9jb21tYW5kfHNlcnZlcl9lcnJvcl9kZXRhaWxcIik7XG4gICAgICAgIH1cblxuICAgICAgICBNb2RhbC5jcmVhdGVEaWFsb2coRXJyb3JEaWFsb2csIHtcbiAgICAgICAgICAgIHRpdGxlOiBfdCh0aXRsZSksXG4gICAgICAgICAgICBkZXNjcmlwdGlvbjogZXJyVGV4dCxcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBbbnVsbCwgZmFsc2VdO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIGxvZ2dlci5sb2coXCJDb21tYW5kIHN1Y2Nlc3MuXCIpO1xuICAgICAgICByZXR1cm4gW21lc3NhZ2VDb250ZW50LCB0cnVlXTtcbiAgICB9XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzaG91bGRTZW5kQW55d2F5KGNvbW1hbmRUZXh0OiBzdHJpbmcpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICAvLyBhc2sgdGhlIHVzZXIgaWYgdGhlaXIgdW5rbm93biBjb21tYW5kIHNob3VsZCBiZSBzZW50IGFzIGEgbWVzc2FnZVxuICAgIGNvbnN0IHsgZmluaXNoZWQgfSA9IE1vZGFsLmNyZWF0ZURpYWxvZyhRdWVzdGlvbkRpYWxvZywge1xuICAgICAgICB0aXRsZTogX3QoXCJzbGFzaF9jb21tYW5kfHVua25vd25fY29tbWFuZFwiKSxcbiAgICAgICAgZGVzY3JpcHRpb246IChcbiAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgICAgPHA+e190KFwic2xhc2hfY29tbWFuZHx1bmtub3duX2NvbW1hbmRfZGV0YWlsXCIsIHsgY29tbWFuZFRleHQgfSl9PC9wPlxuICAgICAgICAgICAgICAgIDxwPlxuICAgICAgICAgICAgICAgICAgICB7X3QoXG4gICAgICAgICAgICAgICAgICAgICAgICBcInNsYXNoX2NvbW1hbmR8dW5rbm93bl9jb21tYW5kX2hlbHBcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIHt9LFxuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGU6ICh0KSA9PiA8Y29kZT57dH08L2NvZGU+LFxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgKX1cbiAgICAgICAgICAgICAgICA8L3A+XG4gICAgICAgICAgICAgICAgPHA+XG4gICAgICAgICAgICAgICAgICAgIHtfdChcbiAgICAgICAgICAgICAgICAgICAgICAgIFwic2xhc2hfY29tbWFuZHx1bmtub3duX2NvbW1hbmRfaGludFwiLFxuICAgICAgICAgICAgICAgICAgICAgICAge30sXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZTogKHQpID0+IDxjb2RlPnt0fTwvY29kZT4sXG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICApfVxuICAgICAgICAgICAgICAgIDwvcD5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICApLFxuICAgICAgICBidXR0b246IF90KFwic2xhc2hfY29tbWFuZHx1bmtub3duX2NvbW1hbmRfYnV0dG9uXCIpLFxuICAgIH0pO1xuICAgIGNvbnN0IFtzZW5kQW55d2F5XSA9IGF3YWl0IGZpbmlzaGVkO1xuICAgIHJldHVybiBzZW5kQW55d2F5IHx8IGZhbHNlO1xufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7O0FBUUEsSUFBQUEsTUFBQSxHQUFBQyxzQkFBQSxDQUFBQyxPQUFBO0FBQ0EsSUFBQUMsT0FBQSxHQUFBRCxPQUFBO0FBS0EsSUFBQUUsTUFBQSxHQUFBRixPQUFBO0FBQ0EsSUFBQUcsY0FBQSxHQUFBSCxPQUFBO0FBQ0EsSUFBQUksZ0JBQUEsR0FBQUosT0FBQTtBQUNBLElBQUFLLE1BQUEsR0FBQU4sc0JBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFNLFlBQUEsR0FBQVAsc0JBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFPLGVBQUEsR0FBQVIsc0JBQUEsQ0FBQUMsT0FBQTtBQW5CQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFlTyxTQUFTUSxjQUFjQSxDQUFDQyxLQUFrQixFQUFXO0VBQ3hELE1BQU1DLEtBQUssR0FBR0QsS0FBSyxDQUFDQyxLQUFLO0VBQ3pCLE1BQU1DLFNBQVMsR0FBR0QsS0FBSyxDQUFDLENBQUMsQ0FBQztFQUMxQixJQUFJQyxTQUFTLEVBQUU7SUFDWCxJQUFJQSxTQUFTLENBQUNDLElBQUksS0FBS0MsV0FBSSxDQUFDQyxPQUFPLElBQUlILFNBQVMsQ0FBQ0ksSUFBSSxDQUFDQyxVQUFVLENB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LE9BQU87SUFDM0IsQ0FBQyxNQUFNO01BQ0hILE9BQU8sR0FBRyxJQUFBSSxtQkFBRSxFQUFDLG1DQUFtQyxDQUFDO0lBQ3JEO0lBRUFDLGNBQUssQ0FBQ0MsWUFBWSxDQUFDQyxvQkFBVyxFQUFFO01BQzVCVCxLQUFLLEVBQUUsSUFBQU0sbUJBQUUsRUFBQ04sS0FBSyxDQUFDO01BQ2hCVSxXQUFXLEVBQUVSO0lBQ2pCLENBQUMsQ0FBQztJQUNGLE9BQU8sQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDO0VBQ3hCLENBQUMsTUFBTTtJQUNISixjQUFNLENBQUNhLEdBQUcsQ0FBQyxrQkFBa0IsQ0FBQztJQUM5QixPQUFPLENBQUNyQixjQUFjLEVBQUUsSUFBSSxDQUFDO0VBQ2pDO0FBQ0o7QUFFTyxlQUFlc0IsZ0JBQWdCQSxDQUFDckMsV0FBbUIsRUFBb0I7RUFDMUU7RUFDQSxNQUFNO0lBQUVzQztFQUFTLENBQUMsR0FBR04sY0FBSyxDQUFDQyxZQUFZLENBQUNNLHVCQUFjLEVBQUU7SUFDcERkLEtBQUssRUFBRSxJQUFBTSxtQkFBRSxFQUFDLCtCQUErQixDQUFDO0lBQzFDSSxXQUFXLGVBQ1B6RCxNQUFBLENBQUE4RCxPQUFBLENBQUFDLGFBQUEsMkJBQ0kvRCxNQUFBLENBQUE4RCxPQUFBLENBQUFDLGFBQUEsWUFBSSxJQUFBVixtQkFBRSxFQUFDLHNDQUFzQyxFQUFFO01BQUUvQjtJQUFZLENBQUMsQ0FBSyxDQUFDLGVBQ3BFdEIsTUFBQSxDQUFBOEQsT0FBQSxDQUFBQyxhQUFBLFlBQ0ssSUFBQVYsbUJBQUUsRUFDQyxvQ0FBb0MsRUFDcEMsQ0FBQyxDQUFDLEVBQ0Y7TUFDSVcsSUFBSSxFQUFHQyxDQUFDLGlCQUFLakUsTUFBQSxDQUFBOEQsT0FBQSxDQUFBQyxhQUFBLGVBQU9FLENBQVE7SUFDaEMsQ0FDSixDQUNELENBQUMsZUFDSmpFLE1BQUEsQ0FBQThELE9BQUEsQ0FBQUMsYUFBQSxZQUNLLElBQUFWLG1CQUFFLEVBQ0Msb0NBQW9DLEVBQ3BDLENBQUMsQ0FBQyxFQUNGO01BQ0lXLElBQUksRUFBR0MsQ0FBQyxpQkFBS2pFLE1BQUEsQ0FBQThELE9BQUEsQ0FBQUMsYUFBQSxlQUFPRSxDQUFRO0lBQ2hDLENBQ0osQ0FDRCxDQUNGLENBQ1I7SUFDREMsTUFBTSxFQUFFLElBQUFiLG1CQUFFLEVBQUMsc0NBQXNDO0VBQ3JELENBQUMsQ0FBQztFQUNGLE1BQU0sQ0FBQ2MsVUFBVSxDQUFDLEdBQUcsTUFBTVAsUUFBUTtFQUNuQyxPQUFPTyxVQUFVLElBQUksS0FBSztBQUM5QiIsImlnbm9yZUxpc3QiOltdfQ==