UNPKG

matrix-react-sdk

Version:
685 lines (530 loc) 80.7 kB
"use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); Object.defineProperty(exports, "__esModule", { value: true }); exports.createMessageContent = createMessageContent; exports.isQuickReaction = isQuickReaction; exports.default = void 0; var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); var _react = _interopRequireDefault(require("react")); var _propTypes = _interopRequireDefault(require("prop-types")); var _dispatcher = _interopRequireDefault(require("../../../dispatcher/dispatcher")); var _model = _interopRequireDefault(require("../../../editor/model")); var _serialize = require("../../../editor/serialize"); var _parts = require("../../../editor/parts"); var _BasicMessageComposer = _interopRequireDefault(require("./BasicMessageComposer")); var _ReplyThread = _interopRequireDefault(require("../elements/ReplyThread")); var _deserialize = require("../../../editor/deserialize"); var _EventUtils = require("../../../utils/EventUtils"); var _SendHistoryManager = _interopRequireDefault(require("../../../SendHistoryManager")); var _SlashCommands = require("../../../SlashCommands"); var sdk = _interopRequireWildcard(require("../../../index")); var _Modal = _interopRequireDefault(require("../../../Modal")); var _languageHandler = require("../../../languageHandler"); var _ContentMessages = _interopRequireDefault(require("../../../ContentMessages")); var _MatrixClientContext = _interopRequireDefault(require("../../../contexts/MatrixClientContext")); var _ratelimitedfunc = _interopRequireDefault(require("../../../ratelimitedfunc")); var _actions = require("../../../dispatcher/actions"); var _utils = require("../../../effects/utils"); var _effects = require("../../../effects"); var _CountlyAnalytics = _interopRequireDefault(require("../../../CountlyAnalytics")); var _MatrixClientPeg = require("../../../MatrixClientPeg"); var _emojibaseRegex = _interopRequireDefault(require("emojibase-regex")); var _KeyBindingsManager = require("../../../KeyBindingsManager"); var _replaceableComponent = require("../../../utils/replaceableComponent"); var _SettingsStore = _interopRequireDefault(require("../../../settings/SettingsStore")); var _dec, _class, _class2, _temp; function addReplyToMessageContent(content, repliedToEvent, permalinkCreator) { const replyContent = _ReplyThread.default.makeReplyMixIn(repliedToEvent); Object.assign(content, replyContent); // Part of Replies fallback support - prepend the text we're sending // with the text we're replying to const nestedReply = _ReplyThread.default.getNestedReplyText(repliedToEvent, permalinkCreator); if (nestedReply) { if (content.formatted_body) { content.formatted_body = nestedReply.html + content.formatted_body; } content.body = nestedReply.body + content.body; } } // exported for tests function createMessageContent(model, permalinkCreator, replyToEvent) { const isEmote = (0, _serialize.containsEmote)(model); if (isEmote) { model = (0, _serialize.stripEmoteCommand)(model); } if ((0, _serialize.startsWith)(model, "//")) { model = (0, _serialize.stripPrefix)(model, "/"); } model = (0, _serialize.unescapeMessage)(model); const body = (0, _serialize.textSerialize)(model); const content = { msgtype: isEmote ? "m.emote" : "m.text", body: body }; const formattedBody = (0, _serialize.htmlSerializeIfNeeded)(model, { forceHTML: !!replyToEvent }); if (formattedBody) { content.format = "org.matrix.custom.html"; content.formatted_body = formattedBody; } if (replyToEvent) { addReplyToMessageContent(content, replyToEvent, permalinkCreator); } return content; } // exported for tests function isQuickReaction(model) { const parts = model.parts; if (parts.length == 0) return false; const text = (0, _serialize.textSerialize)(model); // shortcut takes the form "+:emoji:" or "+ :emoji:"" // can be in 1 or 2 parts if (parts.length <= 2) { const hasShortcut = text.startsWith("+") || text.startsWith("+ "); const emojiMatch = text.match(_emojibaseRegex.default); if (hasShortcut && emojiMatch && emojiMatch.length == 1) { return emojiMatch[0] === text.substring(1) || emojiMatch[0] === text.substring(2); } } return false; } let SendMessageComposer = (_dec = (0, _replaceableComponent.replaceableComponent)("views.rooms.SendMessageComposer"), _dec(_class = (_temp = _class2 = class SendMessageComposer extends _react.default.Component { constructor(props, context) { super(props, context); (0, _defineProperty2.default)(this, "_setEditorRef", ref => { this._editorRef = ref; }); (0, _defineProperty2.default)(this, "_onKeyDown", event => { // ignore any keypress while doing IME compositions if (this._editorRef.isComposing(event)) { return; } const action = (0, _KeyBindingsManager.getKeyBindingsManager)().getMessageComposerAction(event); switch (action) { case _KeyBindingsManager.MessageComposerAction.Send: this._sendMessage(); event.preventDefault(); break; case _KeyBindingsManager.MessageComposerAction.SelectPrevSendHistory: case _KeyBindingsManager.MessageComposerAction.SelectNextSendHistory: { // Try select composer history const selected = this.selectSendHistory(action === _KeyBindingsManager.MessageComposerAction.SelectPrevSendHistory); if (selected) { // We're selecting history, so prevent the key event from doing anything else event.preventDefault(); } break; } case _KeyBindingsManager.MessageComposerAction.EditPrevMessage: // selection must be collapsed and caret at start if (this._editorRef.isSelectionCollapsed() && this._editorRef.isCaretAtStart()) { const editEvent = (0, _EventUtils.findEditableEvent)(this.props.room, false); if (editEvent) { // We're selecting history, so prevent the key event from doing anything else event.preventDefault(); _dispatcher.default.dispatch({ action: 'edit_event', event: editEvent }); } } break; case _KeyBindingsManager.MessageComposerAction.CancelEditing: _dispatcher.default.dispatch({ action: 'reply_to_event', event: null }); break; default: if (this._prepareToEncrypt) { // This needs to be last! this._prepareToEncrypt(); } } }); (0, _defineProperty2.default)(this, "_shouldSaveStoredEditorState", () => { return !this.model.isEmpty || this.props.replyToEvent; }); (0, _defineProperty2.default)(this, "_saveStoredEditorState", () => { if (this._shouldSaveStoredEditorState()) { const item = _SendHistoryManager.default.createItem(this.model, this.props.replyToEvent); localStorage.setItem(this._editorStateKey, JSON.stringify(item)); } else { this._clearStoredEditorState(); } }); (0, _defineProperty2.default)(this, "onAction", payload => { // don't let the user into the composer if it is disabled - all of these branches lead // to the cursor being in the composer if (this.props.disabled) return; switch (payload.action) { case 'reply_to_event': case _actions.Action.FocusComposer: this._editorRef && this._editorRef.focus(); break; case 'insert_mention': this._insertMention(payload.user_id); break; case 'quote': this._insertQuotedMessage(payload.event); break; case 'insert_emoji': this._insertEmoji(payload.emoji); break; } }); (0, _defineProperty2.default)(this, "_insertEmoji", emoji => { const { model } = this; const { partCreator } = model; const caret = this._editorRef.getCaret(); const position = model.positionForOffset(caret.offset, caret.atNodeEnd); model.transform(() => { const addedLen = model.insert([partCreator.plain(emoji)], position); return model.positionForOffset(caret.offset + addedLen, true); }); }); (0, _defineProperty2.default)(this, "_onPaste", event => { const { clipboardData } = event; // Prioritize text on the clipboard over files as Office on macOS puts a bitmap // in the clipboard as well as the content being copied. if (clipboardData.files.length && !clipboardData.types.some(t => t === "text/plain")) { // This actually not so much for 'files' as such (at time of writing // neither chrome nor firefox let you paste a plain file copied // from Finder) but more images copied from a different website // / word processor etc. _ContentMessages.default.sharedInstance().sendContentListToRoom(Array.from(clipboardData.files), this.props.room.roomId, this.context); return true; // to skip internal onPaste handler } }); (0, _defineProperty2.default)(this, "onChange", () => { if (this.props.onChange) this.props.onChange(this.model); }); this.model = null; this._editorRef = null; this.currentlyComposedEditorState = null; if (this.context.isCryptoEnabled() && this.context.isRoomEncrypted(this.props.room.roomId)) { this._prepareToEncrypt = new _ratelimitedfunc.default(() => { this.context.prepareToEncrypt(this.props.room); }, 60000); } window.addEventListener("beforeunload", this._saveStoredEditorState); } // we keep sent messages/commands in a separate history (separate from undo history) // so you can alt+up/down in them selectSendHistory(up) { const delta = up ? -1 : 1; // True if we are not currently selecting history, but composing a message if (this.sendHistoryManager.currentIndex === this.sendHistoryManager.history.length) { // We can't go any further - there isn't any more history, so nop. if (!up) { return; } this.currentlyComposedEditorState = this.model.serializeParts(); } else if (this.sendHistoryManager.currentIndex + delta === this.sendHistoryManager.history.length) { // True when we return to the message being composed currently this.model.reset(this.currentlyComposedEditorState); this.sendHistoryManager.currentIndex = this.sendHistoryManager.history.length; return; } const { parts, replyEventId } = this.sendHistoryManager.getItem(delta); _dispatcher.default.dispatch({ action: 'reply_to_event', event: replyEventId ? this.props.room.findEventById(replyEventId) : null }); if (parts) { this.model.reset(parts); this._editorRef.focus(); } } _isSlashCommand() { const parts = this.model.parts; const firstPart = parts[0]; if (firstPart) { if (firstPart.type === "command" && firstPart.text.startsWith("/") && !firstPart.text.startsWith("//")) { return true; } // be extra resilient when somehow the AutocompleteWrapperModel or // CommandPartCreator fails to insert a command part, so we don't send // a command as a message if (firstPart.text.startsWith("/") && !firstPart.text.startsWith("//") && (firstPart.type === "plain" || firstPart.type === "pill-candidate")) { return true; } } return false; } _sendQuickReaction() { const timeline = this.props.room.getLiveTimeline(); const events = timeline.getEvents(); const reaction = this.model.parts[1].text; for (let i = events.length - 1; i >= 0; i--) { if (events[i].getType() === "m.room.message") { let shouldReact = true; const lastMessage = events[i]; const userId = _MatrixClientPeg.MatrixClientPeg.get().getUserId(); const messageReactions = this.props.room.getUnfilteredTimelineSet().getRelationsForEvent(lastMessage.getId(), "m.annotation", "m.reaction"); // if we have already sent this reaction, don't redact but don't re-send if (messageReactions) { const myReactionEvents = messageReactions.getAnnotationsBySender()[userId] || []; const myReactionKeys = [...myReactionEvents].filter(event => !event.isRedacted()).map(event => event.getRelation().key); shouldReact = !myReactionKeys.includes(reaction); } if (shouldReact) { _MatrixClientPeg.MatrixClientPeg.get().sendEvent(lastMessage.getRoomId(), "m.reaction", { "m.relates_to": { "rel_type": "m.annotation", "event_id": lastMessage.getId(), "key": reaction } }); _dispatcher.default.dispatch({ action: "message_sent" }); } break; } } } _getSlashCommand() { const commandText = this.model.parts.reduce((text, part) => { // use mxid to textify user pills in a command if (part.type === "user-pill") { return text + part.resourceId; } return text + part.text; }, ""); const { cmd, args } = (0, _SlashCommands.getCommand)(commandText); return [cmd, args, commandText]; } async _runSlashCommand(cmd, args) { const result = cmd.run(this.props.room.roomId, args); let messageContent; let error = result.error; if (result.promise) { try { if (cmd.category === _SlashCommands.CommandCategories.messages) { // The command returns a modified message that we need to pass on messageContent = await result.promise; } else { await result.promise; } } catch (err) { error = err; } } if (error) { console.error("Command failure: %s", error); const ErrorDialog = sdk.getComponent("dialogs.ErrorDialog"); // assume the error is a server error when the command is async const isServerError = !!result.promise; const title = isServerError ? (0, _languageHandler._td)("Server error") : (0, _languageHandler._td)("Command error"); let errText; if (typeof error === 'string') { errText = error; } else if (error.message) { errText = error.message; } else { errText = (0, _languageHandler._t)("Server unavailable, overloaded, or something else went wrong."); } _Modal.default.createTrackedDialog(title, '', ErrorDialog, { title: (0, _languageHandler._t)(title), description: errText }); } else { console.log("Command success."); if (messageContent) return messageContent; } } async _sendMessage() { if (this.model.isEmpty) { return; } const replyToEvent = this.props.replyToEvent; let shouldSend = true; let content; if (!(0, _serialize.containsEmote)(this.model) && this._isSlashCommand()) { const [cmd, args, commandText] = this._getSlashCommand(); if (cmd) { if (cmd.category === _SlashCommands.CommandCategories.messages) { content = await this._runSlashCommand(cmd, args); if (replyToEvent) { addReplyToMessageContent(content, replyToEvent, this.props.permalinkCreator); } } else { this._runSlashCommand(cmd, args); shouldSend = false; } } else { // ask the user if their unknown command should be sent as a message const QuestionDialog = sdk.getComponent("dialogs.QuestionDialog"); const { finished } = _Modal.default.createTrackedDialog("Unknown command", "", QuestionDialog, { title: (0, _languageHandler._t)("Unknown Command"), description: /*#__PURE__*/_react.default.createElement("div", null, /*#__PURE__*/_react.default.createElement("p", null, (0, _languageHandler._t)("Unrecognised command: %(commandText)s", { commandText })), /*#__PURE__*/_react.default.createElement("p", null, (0, _languageHandler._t)("You can use <code>/help</code> to list available commands. " + "Did you mean to send this as a message?", {}, { code: t => /*#__PURE__*/_react.default.createElement("code", null, t) })), /*#__PURE__*/_react.default.createElement("p", null, (0, _languageHandler._t)("Hint: Begin your message with <code>//</code> to start it with a slash.", {}, { code: t => /*#__PURE__*/_react.default.createElement("code", null, t) }))), button: (0, _languageHandler._t)('Send as message') }); const [sendAnyway] = await finished; // if !sendAnyway bail to let the user edit the composer and try again if (!sendAnyway) return; } } if (isQuickReaction(this.model)) { shouldSend = false; this._sendQuickReaction(); } if (shouldSend) { const startTime = _CountlyAnalytics.default.getTimestamp(); const { roomId } = this.props.room; if (!content) { content = createMessageContent(this.model, this.props.permalinkCreator, replyToEvent); } // don't bother sending an empty message if (!content.body.trim()) return; const prom = this.context.sendMessage(roomId, content); if (replyToEvent) { // Clear reply_to_event as we put the message into the queue // if the send fails, retry will handle resending. _dispatcher.default.dispatch({ action: 'reply_to_event', event: null }); } _dispatcher.default.dispatch({ action: "message_sent" }); _effects.CHAT_EFFECTS.forEach(effect => { if ((0, _utils.containsEmoji)(content, effect.emojis)) { _dispatcher.default.dispatch({ action: `effects.${effect.command}` }); } }); _CountlyAnalytics.default.instance.trackSendMessage(startTime, prom, roomId, false, !!replyToEvent, content); } this.sendHistoryManager.save(this.model, replyToEvent); // clear composer this.model.reset([]); this._editorRef.clearUndoHistory(); this._editorRef.focus(); this._clearStoredEditorState(); if (_SettingsStore.default.getValue("scrollToBottomOnMessageSent")) { _dispatcher.default.dispatch({ action: "scroll_to_bottom" }); } } componentWillUnmount() { _dispatcher.default.unregister(this.dispatcherRef); window.removeEventListener("beforeunload", this._saveStoredEditorState); this._saveStoredEditorState(); } // TODO: [REACT-WARNING] Move this to constructor UNSAFE_componentWillMount() { // eslint-disable-line camelcase const partCreator = new _parts.CommandPartCreator(this.props.room, this.context); const parts = this._restoreStoredEditorState(partCreator) || []; this.model = new _model.default(parts, partCreator); this.dispatcherRef = _dispatcher.default.register(this.onAction); this.sendHistoryManager = new _SendHistoryManager.default(this.props.room.roomId, 'mx_cider_history_'); } get _editorStateKey() { return `mx_cider_state_${this.props.room.roomId}`; } _clearStoredEditorState() { localStorage.removeItem(this._editorStateKey); } _restoreStoredEditorState(partCreator) { const json = localStorage.getItem(this._editorStateKey); if (json) { try { const { parts: serializedParts, replyEventId } = JSON.parse(json); const parts = serializedParts.map(p => partCreator.deserializePart(p)); if (replyEventId) { _dispatcher.default.dispatch({ action: 'reply_to_event', event: this.props.room.findEventById(replyEventId) }); } return parts; } catch (e) { console.error(e); } } } // should save state when editor has contents or reply is open _insertMention(userId) { const { model } = this; const { partCreator } = model; const member = this.props.room.getMember(userId); const displayName = member ? member.rawDisplayName : userId; const caret = this._editorRef.getCaret(); const position = model.positionForOffset(caret.offset, caret.atNodeEnd); // Insert suffix only if the caret is at the start of the composer const parts = partCreator.createMentionParts(caret.offset === 0, displayName, userId); model.transform(() => { const addedLen = model.insert(parts, position); return model.positionForOffset(caret.offset + addedLen, true); }); // refocus on composer, as we just clicked "Mention" this._editorRef && this._editorRef.focus(); } _insertQuotedMessage(event) { const { model } = this; const { partCreator } = model; const quoteParts = (0, _deserialize.parseEvent)(event, partCreator, { isQuotedMessage: true }); // add two newlines quoteParts.push(partCreator.newline()); quoteParts.push(partCreator.newline()); model.transform(() => { const addedLen = model.insert(quoteParts, model.positionForOffset(0)); return model.positionForOffset(addedLen, true); }); // refocus on composer, as we just clicked "Quote" this._editorRef && this._editorRef.focus(); } render() { return /*#__PURE__*/_react.default.createElement("div", { className: "mx_SendMessageComposer", onClick: this.focusComposer, onKeyDown: this._onKeyDown }, /*#__PURE__*/_react.default.createElement(_BasicMessageComposer.default, { onChange: this.onChange, ref: this._setEditorRef, model: this.model, room: this.props.room, label: this.props.placeholder, placeholder: this.props.placeholder, onPaste: this._onPaste, disabled: this.props.disabled })); } }, (0, _defineProperty2.default)(_class2, "propTypes", { room: _propTypes.default.object.isRequired, placeholder: _propTypes.default.string, permalinkCreator: _propTypes.default.object.isRequired, replyToEvent: _propTypes.default.object, onChange: _propTypes.default.func, disabled: _propTypes.default.bool }), (0, _defineProperty2.default)(_class2, "contextType", _MatrixClientContext.default), _temp)) || _class); exports.default = SendMessageComposer; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9jb21wb25lbnRzL3ZpZXdzL3Jvb21zL1NlbmRNZXNzYWdlQ29tcG9zZXIuanMiXSwibmFtZXMiOlsiYWRkUmVwbHlUb01lc3NhZ2VDb250ZW50IiwiY29udGVudCIsInJlcGxpZWRUb0V2ZW50IiwicGVybWFsaW5rQ3JlYXRvciIsInJlcGx5Q29udGVudCIsIlJlcGx5VGhyZWFkIiwibWFrZVJlcGx5TWl4SW4iLCJPYmplY3QiLCJhc3NpZ24iLCJuZXN0ZWRSZXBseSIsImdldE5lc3RlZFJlcGx5VGV4dCIsImZvcm1hdHRlZF9ib2R5IiwiaHRtbCIsImJvZHkiLCJjcmVhdGVNZXNzYWdlQ29udGVudCIsIm1vZGVsIiwicmVwbHlUb0V2ZW50IiwiaXNFbW90ZSIsIm1zZ3R5cGUiLCJmb3JtYXR0ZWRCb2R5IiwiZm9yY2VIVE1MIiwiZm9ybWF0IiwiaXNRdWlja1JlYWN0aW9uIiwicGFydHMiLCJsZW5ndGgiLCJ0ZXh0IiwiaGFzU2hvcnRjdXQiLCJzdGFydHNXaXRoIiwiZW1vamlNYXRjaCIsIm1hdGNoIiwiRU1PSklfUkVHRVgiLCJzdWJzdHJpbmciLCJTZW5kTWVzc2FnZUNvbXBvc2VyIiwiUmVhY3QiLCJDb21wb25lbnQiLCJjb25zdHJ1Y3RvciIsInByb3BzIiwiY29udGV4dCIsInJlZiIsIl9lZGl0b3JSZWYiLCJldmVudCIsImlzQ29tcG9zaW5nIiwiYWN0aW9uIiwiZ2V0TWVzc2FnZUNvbXBvc2VyQWN0aW9uIiwiTWVzc2FnZUNvbXBvc2VyQWN0aW9uIiwiU2VuZCIsIl9zZW5kTWVzc2FnZSIsInByZXZlbnREZWZhdWx0IiwiU2VsZWN0UHJldlNlbmRIaXN0b3J5IiwiU2VsZWN0TmV4dFNlbmRIaXN0b3J5Iiwic2VsZWN0ZWQiLCJzZWxlY3RTZW5kSGlzdG9yeSIsIkVkaXRQcmV2TWVzc2FnZSIsImlzU2VsZWN0aW9uQ29sbGFwc2VkIiwiaXNDYXJldEF0U3RhcnQiLCJlZGl0RXZlbnQiLCJyb29tIiwiZGlzIiwiZGlzcGF0Y2giLCJDYW5jZWxFZGl0aW5nIiwiX3ByZXBhcmVUb0VuY3J5cHQiLCJpc0VtcHR5IiwiX3Nob3VsZFNhdmVTdG9yZWRFZGl0b3JTdGF0ZSIsIml0ZW0iLCJTZW5kSGlzdG9yeU1hbmFnZXIiLCJjcmVhdGVJdGVtIiwibG9jYWxTdG9yYWdlIiwic2V0SXRlbSIsIl9lZGl0b3JTdGF0ZUtleSIsIkpTT04iLCJzdHJpbmdpZnkiLCJfY2xlYXJTdG9yZWRFZGl0b3JTdGF0ZSIsInBheWxvYWQiLCJkaXNhYmxlZCIsIkFjdGlvbiIsIkZvY3VzQ29tcG9zZXIiLCJmb2N1cyIsIl9pbnNlcnRNZW50aW9uIiwidXNlcl9pZCIsIl9pbnNlcnRRdW90ZWRNZXNzYWdlIiwiX2luc2VydEVtb2ppIiwiZW1vamkiLCJwYXJ0Q3JlYXRvciIsImNhcmV0IiwiZ2V0Q2FyZXQiLCJwb3NpdGlvbiIsInBvc2l0aW9uRm9yT2Zmc2V0Iiwib2Zmc2V0IiwiYXROb2RlRW5kIiwidHJhbnNmb3JtIiwiYWRkZWRMZW4iLCJpbnNlcnQiLCJwbGFpbiIsImNsaXBib2FyZERhdGEiLCJmaWxlcyIsInR5cGVzIiwic29tZSIsInQiLCJDb250ZW50TWVzc2FnZXMiLCJzaGFyZWRJbnN0YW5jZSIsInNlbmRDb250ZW50TGlzdFRvUm9vbSIsIkFycmF5IiwiZnJvbSIsInJvb21JZCIsIm9uQ2hhbmdlIiwiY3VycmVudGx5Q29tcG9zZWRFZGl0b3JTdGF0ZSIsImlzQ3J5cHRvRW5hYmxlZCIsImlzUm9vbUVuY3J5cHRlZCIsIlJhdGVMaW1pdGVkRnVuYyIsInByZXBhcmVUb0VuY3J5cHQiLCJ3aW5kb3ciLCJhZGRFdmVudExpc3RlbmVyIiwiX3NhdmVTdG9yZWRFZGl0b3JTdGF0ZSIsInVwIiwiZGVsdGEiLCJzZW5kSGlzdG9yeU1hbmFnZXIiLCJjdXJyZW50SW5kZXgiLCJoaXN0b3J5Iiwic2VyaWFsaXplUGFydHMiLCJyZXNldCIsInJlcGx5RXZlbnRJZCIsImdldEl0ZW0iLCJmaW5kRXZlbnRCeUlkIiwiX2lzU2xhc2hDb21tYW5kIiwiZmlyc3RQYXJ0IiwidHlwZSIsIl9zZW5kUXVpY2tSZWFjdGlvbiIsInRpbWVsaW5lIiwiZ2V0TGl2ZVRpbWVsaW5lIiwiZXZlbnRzIiwiZ2V0RXZlbnRzIiwicmVhY3Rpb24iLCJpIiwiZ2V0VHlwZSIsInNob3VsZFJlYWN0IiwibGFzdE1lc3NhZ2UiLCJ1c2VySWQiLCJNYXRyaXhDbGllbnRQZWciLCJnZXQiLCJnZXRVc2VySWQiLCJtZXNzYWdlUmVhY3Rpb25zIiwiZ2V0VW5maWx0ZXJlZFRpbWVsaW5lU2V0IiwiZ2V0UmVsYXRpb25zRm9yRXZlbnQiLCJnZXRJZCIsIm15UmVhY3Rpb25FdmVudHMiLCJnZXRBbm5vdGF0aW9uc0J5U2VuZGVyIiwibXlSZWFjdGlvbktleXMiLCJmaWx0ZXIiLCJpc1JlZGFjdGVkIiwibWFwIiwiZ2V0UmVsYXRpb24iLCJrZXkiLCJpbmNsdWRlcyIsInNlbmRFdmVudCIsImdldFJvb21JZCIsIl9nZXRTbGFzaENvbW1hbmQiLCJjb21tYW5kVGV4dCIsInJlZHVjZSIsInBhcnQiLCJyZXNvdXJjZUlkIiwiY21kIiwiYXJncyIsIl9ydW5TbGFzaENvbW1hbmQiLCJyZXN1bHQiLCJydW4iLCJtZXNzYWdlQ29udGVudCIsImVycm9yIiwicHJvbWlzZSIsImNhdGVnb3J5IiwiQ29tbWFuZENhdGVnb3JpZXMiLCJtZXNzYWdlcyIsImVyciIsImNvbnNvbGUiLCJFcnJvckRpYWxvZyIsInNkayIsImdldENvbXBvbmVudCIsImlzU2VydmVyRXJyb3IiLCJ0aXRsZSIsImVyclRleHQiLCJtZXNzYWdlIiwiTW9kYWwiLCJjcmVhdGVUcmFja2VkRGlhbG9nIiwiZGVzY3JpcHRpb24iLCJsb2ciLCJzaG91bGRTZW5kIiwiUXVlc3Rpb25EaWFsb2ciLCJmaW5pc2hlZCIsImNvZGUiLCJidXR0b24iLCJzZW5kQW55d2F5Iiwic3RhcnRUaW1lIiwiQ291bnRseUFuYWx5dGljcyIsImdldFRpbWVzdGFtcCIsInRyaW0iLCJwcm9tIiwic2VuZE1lc3NhZ2UiLCJDSEFUX0VGRkVDVFMiLCJmb3JFYWNoIiwiZWZmZWN0IiwiZW1vamlzIiwiY29tbWFuZCIsImluc3RhbmNlIiwidHJhY2tTZW5kTWVzc2FnZSIsInNhdmUiLCJjbGVhclVuZG9IaXN0b3J5IiwiU2V0dGluZ3NTdG9yZSIsImdldFZhbHVlIiwiY29tcG9uZW50V2lsbFVubW91bnQiLCJ1bnJlZ2lzdGVyIiwiZGlzcGF0Y2hlclJlZiIsInJlbW92ZUV2ZW50TGlzdGVuZXIiLCJVTlNBRkVfY29tcG9uZW50V2lsbE1vdW50IiwiQ29tbWFuZFBhcnRDcmVhdG9yIiwiX3Jlc3RvcmVTdG9yZWRFZGl0b3JTdGF0ZSIsIkVkaXRvck1vZGVsIiwicmVnaXN0ZXIiLCJvbkFjdGlvbiIsInJlbW92ZUl0ZW0iLCJqc29uIiwic2VyaWFsaXplZFBhcnRzIiwicGFyc2UiLCJwIiwiZGVzZXJpYWxpemVQYXJ0IiwiZSIsIm1lbWJlciIsImdldE1lbWJlciIsImRpc3BsYXlOYW1lIiwicmF3RGlzcGxheU5hbWUiLCJjcmVhdGVNZW50aW9uUGFydHMiLCJxdW90ZVBhcnRzIiwiaXNRdW90ZWRNZXNzYWdlIiwicHVzaCIsIm5ld2xpbmUiLCJyZW5kZXIiLCJmb2N1c0NvbXBvc2VyIiwiX29uS2V5RG93biIsIl9zZXRFZGl0b3JSZWYiLCJwbGFjZWhvbGRlciIsIl9vblBhc3RlIiwiUHJvcFR5cGVzIiwib2JqZWN0IiwiaXNSZXF1aXJlZCIsInN0cmluZyIsImZ1bmMiLCJib29sIiwiTWF0cml4Q2xpZW50Q29udGV4dCJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7O0FBZ0JBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQVNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOzs7O0FBRUEsU0FBU0Esd0JBQVQsQ0FBa0NDLE9BQWxDLEVBQTJDQyxjQUEzQyxFQUEy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QkFBRDtBQUNJLE1BQUEsUUFBUSxFQUFFLEtBQUtuSSxRQURuQjtBQUVJLE1BQUEsR0FBRyxFQUFFLEtBQUtvSSxhQUZkO0FBR0ksTUFBQSxLQUFLLEVBQUUsS0FBSzdOLEtBSGhCO0FBSUksTUFBQSxJQUFJLEVBQUUsS0FBS3FCLEtBQUwsQ0FBV29CLElBSnJCO0FBS0ksTUFBQSxLQUFLLEVBQUUsS0FBS3BCLEtBQUwsQ0FBV3lNLFdBTHRCO0FBTUksTUFBQSxXQUFXLEVBQUUsS0FBS3pNLEtBQUwsQ0FBV3lNLFdBTjVCO0FBT0ksTUFBQSxPQUFPLEVBQUUsS0FBS0MsUUFQbEI7QUFRSSxNQUFBLFFBQVEsRUFBRSxLQUFLMU0sS0FBTCxDQUFXcUM7QUFSekIsTUFESixDQURKO0FBY0g7O0FBaGQ0RCxDLHNEQUMxQztBQUNmakIsRUFBQUEsSUFBSSxFQUFFdUwsbUJBQVVDLE1BQVYsQ0FBaUJDLFVBRFI7QUFFZkosRUFBQUEsV0FBVyxFQUFFRSxtQkFBVUcsTUFGUjtBQUdmL08sRUFBQUEsZ0JBQWdCLEVBQUU0TyxtQkFBVUMsTUFBVixDQUFpQkMsVUFIcEI7QUFJZmpPLEVBQUFBLFlBQVksRUFBRStOLG1CQUFVQyxNQUpUO0FBS2Z4SSxFQUFBQSxRQUFRLEVBQUV1SSxtQkFBVUksSUFMTDtBQU1mMUssRUFBQUEsUUFBUSxFQUFFc0ssbUJBQVVLO0FBTkwsQyx5REFTRUMsNEIiLCJzb3VyY2VzQ29udGVudCI6WyIvKlxuQ29weXJpZ2h0IDIwMTkgTmV3IFZlY3RvciBMdGRcbkNvcHlyaWdodCAyMDE5IFRoZSBNYXRyaXgub3JnIEZvdW5kYXRpb24gQy5JLkMuXG5cbkxpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG55b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG5Zb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcblxuICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuXG5Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG5kaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG5XSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cblNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbmxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKi9cbmltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgUHJvcFR5cGVzIGZyb20gJ3Byb3AtdHlwZXMnO1xuaW1wb3J0IGRpcyBmcm9tICcuLi8uLi8uLi9kaXNwYXRjaGVyL2Rpc3BhdGNoZXInO1xuaW1wb3J0IEVkaXRvck1vZGVsIGZyb20gJy4uLy4uLy4uL2VkaXRvci9tb2RlbCc7XG5pbXBvcnQge1xuICAgIGh0bWxTZXJpYWxpemVJZk5lZWRlZCxcbiAgICB0ZXh0U2VyaWFsaXplLFxuICAgIGNvbnRhaW5zRW1vdGUsXG4gICAgc3RyaXBFbW90ZUNvbW1hbmQ