matrix-react-sdk
Version:
SDK for matrix.org using React
190 lines (187 loc) • 28.3 kB
JavaScript
;
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.StateEventEditor = exports.RoomStateExplorer = void 0;
var _react = _interopRequireWildcard(require("react"));
var _classnames = _interopRequireDefault(require("classnames"));
var _languageHandler = require("../../../../languageHandler");
var _BaseTool = _interopRequireWildcard(require("./BaseTool"));
var _MatrixClientContext = _interopRequireDefault(require("../../../../contexts/MatrixClientContext"));
var _Event = require("./Event");
var _FilteredList = _interopRequireDefault(require("./FilteredList"));
var _Spinner = _interopRequireDefault(require("../../elements/Spinner"));
var _SyntaxHighlight = _interopRequireDefault(require("../../elements/SyntaxHighlight"));
var _useAsyncMemo = require("../../../../hooks/useAsyncMemo");
function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function (e) { return e ? t : r; })(e); }
function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != typeof e && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && {}.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; }
/*
Copyright 2024 New Vector Ltd.
Copyright 2023 The Matrix.org Foundation C.I.C.
Copyright 2022 Michael Telatynski <7t3chguy@gmail.com>
SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only
Please see LICENSE files in the repository root for full details.
*/
const StateEventEditor = ({
mxEvent,
onBack
}) => {
const context = (0, _react.useContext)(_BaseTool.DevtoolsContext);
const cli = (0, _react.useContext)(_MatrixClientContext.default);
const fields = (0, _react.useMemo)(() => [(0, _Event.eventTypeField)(mxEvent?.getType()), (0, _Event.stateKeyField)(mxEvent?.getStateKey())], [mxEvent]);
const onSend = async ([eventType, stateKey], content) => {
await cli.sendStateEvent(context.room.roomId, eventType, content, stateKey);
};
const defaultContent = mxEvent ? (0, _Event.stringify)(mxEvent.getContent()) : undefined;
return /*#__PURE__*/_react.default.createElement(_Event.EventEditor, {
fieldDefs: fields,
defaultContent: defaultContent,
onSend: onSend,
onBack: onBack
});
};
exports.StateEventEditor = StateEventEditor;
const RoomStateHistory = ({
mxEvent,
onBack
}) => {
const cli = (0, _react.useContext)(_MatrixClientContext.default);
const events = (0, _useAsyncMemo.useAsyncMemo)(async () => {
const events = [mxEvent.event];
while (!!events[0].unsigned?.replaces_state) {
try {
events.unshift(await cli.fetchRoomEvent(mxEvent.getRoomId(), events[0].unsigned.replaces_state));
} catch (e) {
events.unshift({
event_id: events[0].unsigned.replaces_state,
unsigned: {
error: e instanceof Error ? e.message : String(e)
}
});
}
}
return events;
}, [cli, mxEvent], null);
let body = /*#__PURE__*/_react.default.createElement(_Spinner.default, null);
if (events !== null) {
body = /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, events.map(ev => /*#__PURE__*/_react.default.createElement(_SyntaxHighlight.default, {
language: "json",
key: ev.event_id
}, (0, _Event.stringify)(ev))));
}
return /*#__PURE__*/_react.default.createElement(_BaseTool.default, {
onBack: onBack
}, body);
};
const StateEventButton = ({
label,
onClick
}) => {
const trimmed = label.trim();
let content = label;
if (!trimmed) {
content = label.length > 0 ? (0, _languageHandler._t)("devtools|spaces", {
count: label.length
}) : (0, _languageHandler._t)("devtools|empty_string");
}
return /*#__PURE__*/_react.default.createElement("button", {
className: (0, _classnames.default)("mx_DevTools_button", {
mx_DevTools_RoomStateExplorer_button_hasSpaces: trimmed.length !== label.length,
mx_DevTools_RoomStateExplorer_button_emptyString: !trimmed
}),
onClick: onClick
}, content);
};
const RoomStateExplorerEventType = ({
eventType,
onBack
}) => {
const context = (0, _react.useContext)(_BaseTool.DevtoolsContext);
const [query, setQuery] = (0, _react.useState)("");
const [event, setEvent] = (0, _react.useState)(null);
const [history, setHistory] = (0, _react.useState)(false);
const events = context.room.currentState.events.get(eventType);
(0, _react.useEffect)(() => {
if (events.size === 1 && events.has("")) {
setEvent(events.get(""));
} else {
setEvent(null);
}
}, [events]);
if (event && history) {
const _onBack = () => {
setHistory(false);
};
return /*#__PURE__*/_react.default.createElement(RoomStateHistory, {
mxEvent: event,
onBack: _onBack
});
}
if (event) {
const _onBack = () => {
if (events?.size === 1 && events.has("")) {
onBack();
} else {
setEvent(null);
}
};
const onHistoryClick = () => {
setHistory(true);
};
const extraButton = /*#__PURE__*/_react.default.createElement("button", {
onClick: onHistoryClick
}, (0, _languageHandler._t)("devtools|see_history"));
return /*#__PURE__*/_react.default.createElement(_Event.EventViewer, {
mxEvent: event,
onBack: _onBack,
Editor: StateEventEditor,
extraButton: extraButton
});
}
return /*#__PURE__*/_react.default.createElement(_BaseTool.default, {
onBack: onBack
}, /*#__PURE__*/_react.default.createElement(_FilteredList.default, {
query: query,
onChange: setQuery
}, Array.from(events.entries()).map(([stateKey, ev]) => /*#__PURE__*/_react.default.createElement(StateEventButton, {
key: stateKey,
label: stateKey,
onClick: () => setEvent(ev)
}))));
};
const RoomStateExplorer = ({
onBack,
setTool
}) => {
const context = (0, _react.useContext)(_BaseTool.DevtoolsContext);
const [query, setQuery] = (0, _react.useState)("");
const [eventType, setEventType] = (0, _react.useState)(null);
const events = context.room.currentState.events;
if (eventType !== null) {
const onBack = () => {
setEventType(null);
};
return /*#__PURE__*/_react.default.createElement(RoomStateExplorerEventType, {
eventType: eventType,
onBack: onBack
});
}
const onAction = async () => {
setTool((0, _languageHandler._td)("devtools|send_custom_state_event"), StateEventEditor);
};
return /*#__PURE__*/_react.default.createElement(_BaseTool.default, {
onBack: onBack,
actionLabel: (0, _languageHandler._td)("devtools|send_custom_state_event"),
onAction: onAction
}, /*#__PURE__*/_react.default.createElement(_FilteredList.default, {
query: query,
onChange: setQuery
}, Array.from(events.keys()).map(eventType => /*#__PURE__*/_react.default.createElement(StateEventButton, {
key: eventType,
label: eventType,
onClick: () => setEventType(eventType)
}))));
};
exports.RoomStateExplorer = RoomStateExplorer;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfcmVhY3QiLCJfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZCIsInJlcXVpcmUiLCJfY2xhc3NuYW1lcyIsIl9pbnRlcm9wUmVxdWlyZURlZmF1bHQiLCJfbGFuZ3VhZ2VIYW5kbGVyIiwiX0Jhc2VUb29sIiwiX01hdHJpeENsaWVudENvbnRleHQiLCJfRXZlbnQiLCJfRmlsdGVyZWRMaXN0IiwiX1NwaW5uZXIiLCJfU3ludGF4SGlnaGxpZ2h0IiwiX3VzZUFzeW5jTWVtbyIsIl9nZXRSZXF1aXJlV2lsZGNhcmRDYWNoZSIsImUiLCJXZWFrTWFwIiwiciIsInQiLCJfX2VzTW9kdWxlIiwiZGVmYXVsdCIsImhhcyIsImdldCIsIm4iLCJfX3Byb3RvX18iLCJhIiwiT2JqZWN0IiwiZGVmaW5lUHJvcGVydHkiLCJnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IiLCJ1IiwiaGFzT3duUHJvcGVydHkiLCJjYWxsIiwiaSIsInNldCIsIlN0YXRlRXZlbnRFZGl0b3IiLCJteEV2ZW50Iiwib25CYWNrIiwiY29udGV4dCIsInVzZUNvbnRleHQiLCJEZXZ0b29sc0NvbnRleHQiLCJjbGkiLCJNYXRyaXhDbGllbnRDb250ZXh0IiwiZmllbGRzIiwidXNlTWVtbyIsImV2ZW50VHlwZUZpZWxkIiwiZ2V0VHlwZSIsInN0YXRlS2V5RmllbGQiLCJnZXRTdGF0ZUtleSIsIm9uU2VuZCIsImV2ZW50VHlwZSIsInN0YXRlS2V5IiwiY29udGVudCIsInNlbmRTdGF0ZUV2ZW50Iiwicm9vbSIsInJvb21JZCIsImRlZmF1bHRDb250ZW50Iiwic3RyaW5naWZ5IiwiZ2V0Q29udGVudCIsInVuZGVmaW5lZCIsImNyZWF0ZUVsZW1lbnQiLCJFdmVudEVkaXRvciIsImZpZWxkRGVmcyIsImV4cG9ydHMiLCJSb29tU3RhdGVIaXN0b3J5IiwiZXZlbnRzIiwidXNlQXN5bmNNZW1vIiwiZXZlbnQiLCJ1bnNpZ25lZCIsInJlcGxhY2VzX3N0YXRlIiwidW5zaGlmdCIsImZldGNoUm9vbUV2ZW50IiwiZ2V0Um9vbUlkIiwiZXZlbnRfaWQiLCJlcnJvciIsIkVycm9yIiwibWVzc2FnZSIsIlN0cmluZyIsImJvZHkiLCJGcmFnbWVudCIsIm1hcCIsImV2IiwibGFuZ3VhZ2UiLCJrZXkiLCJTdGF0ZUV2ZW50QnV0dG9uIiwibGFiZWwiLCJvbkNsaWNrIiwidHJpbW1lZCIsInRyaW0iLCJsZW5ndGgiLCJfdCIsImNvdW50IiwiY2xhc3NOYW1lIiwiY2xhc3NOYW1lcyIsIm14X0RldlRvb2xzX1Jvb21TdGF0ZUV4cGxvcmVyX2J1dHRvbl9oYXNTcGFjZXMiLCJteF9EZXZUb29sc19Sb29tU3RhdGVFeHBsb3Jlcl9idXR0b25fZW1wdHlTdHJpbmciLCJSb29tU3RhdGVFeHBsb3JlckV2ZW50VHlwZSIsInF1ZXJ5Iiwic2V0UXVlcnkiLCJ1c2VTdGF0ZSIsInNldEV2ZW50IiwiaGlzdG9yeSIsInNldEhpc3RvcnkiLCJjdXJyZW50U3RhdGUiLCJ1c2VFZmZlY3QiLCJzaXplIiwiX29uQmFjayIsIm9uSGlzdG9yeUNsaWNrIiwiZXh0cmFCdXR0b24iLCJFdmVudFZpZXdlciIsIkVkaXRvciIsIm9uQ2hhbmdlIiwiQXJyYXkiLCJmcm9tIiwiZW50cmllcyIsIlJvb21TdGF0ZUV4cGxvcmVyIiwic2V0VG9vbCIsInNldEV2ZW50VHlwZSIsIm9uQWN0aW9uIiwiX3RkIiwiYWN0aW9uTGFiZWwiLCJrZXlzIl0sInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2NvbXBvbmVudHMvdmlld3MvZGlhbG9ncy9kZXZ0b29scy9Sb29tU3RhdGUudHN4Il0sInNvdXJjZXNDb250ZW50IjpbIi8qXG5Db3B5cmlnaHQgMjAyNCBOZXcgVmVjdG9yIEx0ZC5cbkNvcHlyaWdodCAyMDIzIFRoZSBNYXRyaXgub3JnIEZvdW5kYXRpb24gQy5JLkMuXG5Db3B5cmlnaHQgMjAyMiBNaWNoYWVsIFRlbGF0eW5za2kgPDd0M2NoZ3V5QGdtYWlsLmNvbT5cblxuU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFHUEwtMy4wLW9ubHkgT1IgR1BMLTMuMC1vbmx5XG5QbGVhc2Ugc2VlIExJQ0VOU0UgZmlsZXMgaW4gdGhlIHJlcG9zaXRvcnkgcm9vdCBmb3IgZnVsbCBkZXRhaWxzLlxuKi9cblxuaW1wb3J0IFJlYWN0LCB7IHVzZUNvbnRleHQsIHVzZUVmZmVjdCwgdXNlTWVtbywgdXNlU3RhdGUgfSBmcm9tIFwicmVhY3RcIjtcbmltcG9ydCB7IElDb250ZW50LCBNYXRyaXhFdmVudCB9IGZyb20gXCJtYXRyaXgtanMtc2RrL3NyYy9tYXRyaXhcIjtcbmltcG9ydCBjbGFzc05hbWVzIGZyb20gXCJjbGFzc25hbWVzXCI7XG5cbmltcG9ydCB7IF90LCBfdGQgfSBmcm9tIFwiLi4vLi4vLi4vLi4vbGFuZ3VhZ2VIYW5kbGVyXCI7XG5pbXBvcnQgQmFzZVRvb2wsIHsgRGV2dG9vbHNDb250ZXh0LCBJRGV2dG9vbHNQcm9wcyB9IGZyb20gXCIuL0Jhc2VUb29sXCI7XG5pbXBvcnQgTWF0cml4Q2xpZW50Q29udGV4dCBmcm9tIFwiLi4vLi4vLi4vLi4vY29udGV4dHMvTWF0cml4Q2xpZW50Q29udGV4dFwiO1xuaW1wb3J0IHsgRXZlbnRFZGl0b3IsIEV2ZW50Vmlld2VyLCBldmVudFR5cGVGaWVsZCwgc3RhdGVLZXlGaWVsZCwgSUVkaXRvclByb3BzLCBzdHJpbmdpZnkgfSBmcm9tIFwiLi9FdmVudFwiO1xuaW1wb3J0IEZpbHRlcmVkTGlzdCBmcm9tIFwiLi9GaWx0ZXJlZExpc3RcIjtcbmltcG9ydCBTcGlubmVyIGZyb20gXCIuLi8uLi9lbGVtZW50cy9TcGlubmVyXCI7XG5pbXBvcnQgU3ludGF4SGlnaGxpZ2h0IGZyb20gXCIuLi8uLi9lbGVtZW50cy9TeW50YXhIaWdobGlnaHRcIjtcbmltcG9ydCB7IHVzZUFzeW5jTWVtbyB9IGZyb20gXCIuLi8uLi8uLi8uLi9ob29rcy91c2VBc3luY01lbW9cIjtcblxuZXhwb3J0IGNvbnN0IFN0YXRlRXZlbnRFZGl0b3I6IFJlYWN0LkZDPElFZGl0b3JQcm9wcz4gPSAoeyBteEV2ZW50LCBvbkJhY2sgfSkgPT4ge1xuICAgIGNvbnN0IGNvbnRleHQgPSB1c2VDb250ZXh0KERldnRvb2xzQ29udGV4dCk7XG4gICAgY29uc3QgY2xpID0gdXNlQ29udGV4dChNYXRyaXhDbGllbnRDb250ZXh0KTtcblxuICAgIGNvbnN0IGZpZWxkcyA9IHVzZU1lbW8oXG4gICAgICAgICgpID0+IFtldmVudFR5cGVGaWVsZChteEV2ZW50Py5nZXRUeXBlKCkpLCBzdGF0ZUtleUZpZWxkKG14RXZlbnQ/LmdldFN0YXRlS2V5KCkpXSxcbiAgICAgICAgW214RXZlbnRdLFxuICAgICk7XG5cbiAgICBjb25zdCBvblNlbmQgPSBhc3luYyAoW2V2ZW50VHlwZSwgc3RhdGVLZXldOiBzdHJpbmdbXSwgY29udGVudDogSUNvbnRlbnQpOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgICAgICAgYXdhaXQgY2xpLnNlbmRTdGF0ZUV2ZW50KGNvbnRleHQucm9vbS5yb29tSWQsIGV2ZW50VHlwZSBhcyBhbnksIGNvbnRlbnQsIHN0YXRlS2V5KTtcbiAgICB9O1xuXG4gICAgY29uc3QgZGVmYXVsdENvbnRlbnQgPSBteEV2ZW50ID8gc3RyaW5naWZ5KG14RXZlbnQuZ2V0Q29udGVudCgpKSA6IHVuZGVmaW5lZDtcbiAgICByZXR1cm4gPEV2ZW50RWRpdG9yIGZpZWxkRGVmcz17ZmllbGRzfSBkZWZhdWx0Q29udGVudD17ZGVmYXVsdENvbnRlbnR9IG9uU2VuZD17b25TZW5kfSBvbkJhY2s9e29uQmFja30gLz47XG59O1xuXG5pbnRlcmZhY2UgU3RhdGVFdmVudEJ1dHRvblByb3BzIHtcbiAgICBsYWJlbDogc3RyaW5nO1xuICAgIG9uQ2xpY2soKTogdm9pZDtcbn1cblxuY29uc3QgUm9vbVN0YXRlSGlzdG9yeTogUmVhY3QuRkM8e1xuICAgIG14RXZlbnQ6IE1hdHJpeEV2ZW50O1xuICAgIG9uQmFjaygpOiB2b2lkO1xufT4gPSAoeyBteEV2ZW50LCBvbkJhY2sgfSkgPT4ge1xuICAgIGNvbnN0IGNsaSA9IHVzZUNvbnRleHQoTWF0cml4Q2xpZW50Q29udGV4dCk7XG4gICAgY29uc3QgZXZlbnRzID0gdXNlQXN5bmNNZW1vKFxuICAgICAgICBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBldmVudHMgPSBbbXhFdmVudC5ldmVudF07XG4gICAgICAgICAgICB3aGlsZSAoISFldmVudHNbMF0udW5zaWduZWQ/LnJlcGxhY2VzX3N0YXRlKSB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgZXZlbnRzLnVuc2hpZnQoYXdhaXQgY2xpLmZldGNoUm9vbUV2ZW50KG14RXZlbnQuZ2V0Um9vbUlkKCkhLCBldmVudHNbMF0udW5zaWduZWQucmVwbGFjZXNfc3RhdGUpKTtcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgIGV2ZW50cy51bnNoaWZ0KHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50X2lkOiBldmVudHNbMF0udW5zaWduZWQucmVwbGFjZXNfc3RhdGUsXG4gICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZDoge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yOiBlIGluc3RhbmNlb2YgRXJyb3IgPyBlLm1lc3NhZ2UgOiBTdHJpbmcoZSksXG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gZXZlbnRzO1xuICAgICAgICB9LFxuICAgICAgICBbY2xpLCBteEV2ZW50XSxcbiAgICAgICAgbnVsbCxcbiAgICApO1xuXG4gICAgbGV0IGJvZHkgPSA8U3Bpbm5lciAvPjtcbiAgICBpZiAoZXZlbnRzICE9PSBudWxsKSB7XG4gICAgICAgIGJvZHkgPSAoXG4gICAgICAgICAgICA8PlxuICAgICAgICAgICAgICAgIHtldmVudHMubWFwKChldikgPT4gKFxuICAgICAgICAgICAgICAgICAgICA8U3ludGF4SGlnaGxpZ2h0IGxhbmd1YWdlPVwianNvblwiIGtleT17ZXYuZXZlbnRfaWR9PlxuICAgICAgICAgICAgICAgICAgICAgICAge3N0cmluZ2lmeShldil9XG4gICAgICAgICAgICAgICAgICAgIDwvU3ludGF4SGlnaGxpZ2h0PlxuICAgICAgICAgICAgICAgICkpfVxuICAgICAgICAgICAgPC8+XG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgcmV0dXJuIDxCYXNlVG9vbCBvbkJhY2s9e29uQmFja30+e2JvZHl9PC9CYXNlVG9vbD47XG59O1xuXG5jb25zdCBTdGF0ZUV2ZW50QnV0dG9uOiBSZWFjdC5GQzxTdGF0ZUV2ZW50QnV0dG9uUHJvcHM+ID0gKHsgbGFiZWwsIG9uQ2xpY2sgfSkgPT4ge1xuICAgIGNvbnN0IHRyaW1tZWQgPSBsYWJlbC50cmltKCk7XG5cbiAgICBsZXQgY29udGVudCA9IGxhYmVsO1xuICAgIGlmICghdHJpbW1lZCkge1xuICAgICAgICBjb250ZW50ID0gbGFiZWwubGVuZ3RoID4gMCA/IF90KFwiZGV2dG9vbHN8c3BhY2VzXCIsIHsgY291bnQ6IGxhYmVsLmxlbmd0aCB9KSA6IF90KFwiZGV2dG9vbHN8ZW1wdHlfc3RyaW5nXCIpO1xuICAgIH1cblxuICAgIHJldHVybiAoXG4gICAgICAgIDxidXR0b25cbiAgICAgICAgICAgIGNsYXNzTmFtZT17Y2xhc3NOYW1lcyhcIm14X0RldlRvb2xzX2J1dHRvblwiLCB7XG4gICAgICAgICAgICAgICAgbXhfRGV2VG9vbHNfUm9vbVN0YXRlRXhwbG9yZXJfYnV0dG9uX2hhc1NwYWNlczogdHJpbW1lZC5sZW5ndGggIT09IGxhYmVsLmxlbmd0aCxcbiAgICAgICAgICAgICAgICBteF9EZXZUb29sc19Sb29tU3RhdGVFeHBsb3Jlcl9idXR0b25fZW1wdHlTdHJpbmc6ICF0cmltbWVkLFxuICAgICAgICAgICAgfSl9XG4gICAgICAgICAgICBvbkNsaWNrPXtvbkNsaWNrfVxuICAgICAgICA+XG4gICAgICAgICAgICB7Y29udGVudH1cbiAgICAgICAgPC9idXR0b24+XG4gICAgKTtcbn07XG5cbmludGVyZmFjZSBJRXZlbnRUeXBlUHJvcHMgZXh0ZW5kcyBQaWNrPElEZXZ0b29sc1Byb3BzLCBcIm9uQmFja1wiPiB7XG4gICAgZXZlbnRUeXBlOiBzdHJpbmc7XG59XG5cbmNvbnN0IFJvb21TdGF0ZUV4cGxvcmVyRXZlbnRUeXBlOiBSZWFjdC5GQzxJRXZlbnRUeXBlUHJvcHM+ID0gKHsgZXZlbnRUeXBlLCBvbkJhY2sgfSkgPT4ge1xuICAgIGNvbnN0IGNvbnRleHQgPSB1c2VDb250ZXh0KERldnRvb2xzQ29udGV4dCk7XG4gICAgY29uc3QgW3F1ZXJ5LCBzZXRRdWVyeV0gPSB1c2VTdGF0ZShcIlwiKTtcbiAgICBjb25zdCBbZXZlbnQsIHNldEV2ZW50XSA9IHVzZVN0YXRlPE1hdHJpeEV2ZW50IHwgbnVsbD4obnVsbCk7XG4gICAgY29uc3QgW2hpc3RvcnksIHNldEhpc3RvcnldID0gdXNlU3RhdGUoZmFsc2UpO1xuXG4gICAgY29uc3QgZXZlbnRzID0gY29udGV4dC5yb29tLmN1cnJlbnRTdGF0ZS5ldmVudHMuZ2V0KGV2ZW50VHlwZSkhO1xuXG4gICAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICAgICAgaWYgKGV2ZW50cy5zaXplID09PSAxICYmIGV2ZW50cy5oYXMoXCJcIikpIHtcbiAgICAgICAgICAgIHNldEV2ZW50KGV2ZW50cy5nZXQoXCJcIikhKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHNldEV2ZW50KG51bGwpO1xuICAgICAgICB9XG4gICAgfSwgW2V2ZW50c10pO1xuXG4gICAgaWYgKGV2ZW50ICYmIGhpc3RvcnkpIHtcbiAgICAgICAgY29uc3QgX29uQmFjayA9ICgpOiB2b2lkID0+IHtcbiAgICAgICAgICAgIHNldEhpc3RvcnkoZmFsc2UpO1xuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gPFJvb21TdGF0ZUhpc3RvcnkgbXhFdmVudD17ZXZlbnR9IG9uQmFjaz17X29uQmFja30gLz47XG4gICAgfVxuICAgIGlmIChldmVudCkge1xuICAgICAgICBjb25zdCBfb25CYWNrID0gKCk6IHZvaWQgPT4ge1xuICAgICAgICAgICAgaWYgKGV2ZW50cz8uc2l6ZSA9PT0gMSAmJiBldmVudHMuaGFzKFwiXCIpKSB7XG4gICAgICAgICAgICAgICAgb25CYWNrKCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHNldEV2ZW50KG51bGwpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICBjb25zdCBvbkhpc3RvcnlDbGljayA9ICgpOiB2b2lkID0+IHtcbiAgICAgICAgICAgIHNldEhpc3RvcnkodHJ1ZSk7XG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IGV4dHJhQnV0dG9uID0gPGJ1dHRvbiBvbkNsaWNrPXtvbkhpc3RvcnlDbGlja30+e190KFwiZGV2dG9vbHN8c2VlX2hpc3RvcnlcIil9PC9idXR0b24+O1xuICAgICAgICByZXR1cm4gPEV2ZW50Vmlld2VyIG14RXZlbnQ9e2V2ZW50fSBvbkJhY2s9e19vbkJhY2t9IEVkaXRvcj17U3RhdGVFdmVudEVkaXRvcn0gZXh0cmFCdXR0b249e2V4dHJhQnV0dG9ufSAvPjtcbiAgICB9XG5cbiAgICByZXR1cm4gKFxuICAgICAgICA8QmFzZVRvb2wgb25CYWNrPXtvbkJhY2t9PlxuICAgICAgICAgICAgPEZpbHRlcmVkTGlzdCBxdWVyeT17cXVlcnl9IG9uQ2hhbmdlPXtzZXRRdWVyeX0+XG4gICAgICAgICAgICAgICAge0FycmF5LmZyb20oZXZlbnRzLmVudHJpZXMoKSkubWFwKChbc3RhdGVLZXksIGV2XSkgPT4gKFxuICAgICAgICAgICAgICAgICAgICA8U3RhdGVFdmVudEJ1dHRvbiBrZXk9e3N0YXRlS2V5fSBsYWJlbD17c3RhdGVLZXl9IG9uQ2xpY2s9eygpID0+IHNldEV2ZW50KGV2KX0gLz5cbiAgICAgICAgICAgICAgICApKX1cbiAgICAgICAgICAgIDwvRmlsdGVyZWRMaXN0PlxuICAgICAgICA8L0Jhc2VUb29sPlxuICAgICk7XG59O1xuXG5leHBvcnQgY29uc3QgUm9vbVN0YXRlRXhwbG9yZXI6IFJlYWN0LkZDPElEZXZ0b29sc1Byb3BzPiA9ICh7IG9uQmFjaywgc2V0VG9vbCB9KSA9PiB7XG4gICAgY29uc3QgY29udGV4dCA9IHVzZUNvbnRleHQoRGV2dG9vbHNDb250ZXh0KTtcbiAgICBjb25zdCBbcXVlcnksIHNldFF1ZXJ5XSA9IHVzZVN0YXRlKFwiXCIpO1xuICAgIGNvbnN0IFtldmVudFR5cGUsIHNldEV2ZW50VHlwZV0gPSB1c2VTdGF0ZTxzdHJpbmcgfCBudWxsPihudWxsKTtcblxuICAgIGNvbnN0IGV2ZW50cyA9IGNvbnRleHQucm9vbS5jdXJyZW50U3RhdGUuZXZlbnRzO1xuXG4gICAgaWYgKGV2ZW50VHlwZSAhPT0gbnVsbCkge1xuICAgICAgICBjb25zdCBvbkJhY2sgPSAoKTogdm9pZCA9PiB7XG4gICAgICAgICAgICBzZXRFdmVudFR5cGUobnVsbCk7XG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiA8Um9vbVN0YXRlRXhwbG9yZXJFdmVudFR5cGUgZXZlbnRUeXBlPXtldmVudFR5cGV9IG9uQmFjaz17b25CYWNrfSAvPjtcbiAgICB9XG5cbiAgICBjb25zdCBvbkFjdGlvbiA9IGFzeW5jICgpOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgICAgICAgc2V0VG9vbChfdGQoXCJkZXZ0b29sc3xzZW5kX2N1c3RvbV9zdGF0ZV9ldmVudFwiKSwgU3RhdGVFdmVudEVkaXRvcik7XG4gICAgfTtcblxuICAgIHJldHVybiAoXG4gICAgICAgIDxCYXNlVG9vbCBvbkJhY2s9e29uQmFja30gYWN0aW9uTGFiZWw9e190ZChcImRldnRvb2xzfHNlbmRfY3VzdG9tX3N0YXRlX2V2ZW50XCIpfSBvbkFjdGlvbj17b25BY3Rpb259PlxuICAgICAgICAgICAgPEZpbHRlcmVkTGlzdCBxdWVyeT17cXVlcnl9IG9uQ2hhbmdlPXtzZXRRdWVyeX0+XG4gICAgICAgICAgICAgICAge0FycmF5LmZyb20oZXZlbnRzLmtleXMoKSkubWFwKChldmVudFR5cGUpID0+IChcbiAgICAgICAgICAgICAgICAgICAgPFN0YXRlRXZlbnRCdXR0b24ga2V5PXtldmVudFR5cGV9IGxhYmVsPXtldmVudFR5cGV9IG9uQ2xpY2s9eygpID0+IHNldEV2ZW50VHlwZShldmVudFR5cGUpfSAvPlxuICAgICAgICAgICAgICAgICkpfVxuICAgICAgICAgICAgPC9GaWx0ZXJlZExpc3Q+XG4gICAgICAgIDwvQmFzZVRvb2w+XG4gICAgKTtcbn07XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7QUFTQSxJQUFBQSxNQUFBLEdBQUFDLHVCQUFBLENBQUFDLE9BQUE7QUFFQSxJQUFBQyxXQUFBLEdBQUFDLHNCQUFBLENBQUFGLE9BQUE7QUFFQSxJQUFBRyxnQkFBQSxHQUFBSCxPQUFBO0FBQ0EsSUFBQUksU0FBQSxHQUFBTCx1QkFBQSxDQUFBQyxPQUFBO0FBQ0EsSUFBQUssb0JBQUEsR0FBQUgsc0JBQUEsQ0FBQUYsT0FBQTtBQUNBLElBQUFNLE1BQUEsR0FBQU4sT0FBQTtBQUNBLElBQUFPLGFBQUEsR0FBQUwsc0JBQUEsQ0FBQUYsT0FBQTtBQUNBLElBQUFRLFFBQUEsR0FBQU4sc0JBQUEsQ0FBQUYsT0FBQTtBQUNBLElBQUFTLGdCQUFBLEdBQUFQLHNCQUFBLENBQUFGLE9BQUE7QUFDQSxJQUFBVSxhQUFBLEdBQUFWLE9BQUE7QUFBOEQsU0FBQVcseUJBQUFDLENBQUEsNkJBQUFDLE9BQUEsbUJBQUFDLENBQUEsT0FBQUQsT0FBQSxJQUFBRSxDQUFBLE9BQUFGLE9BQUEsWUFBQUYsd0JBQUEsWUFBQUEsQ0FBQUMsQ0FBQSxXQUFBQSxDQUFBLEdBQUFHLENBQUEsR0FBQUQsQ0FBQSxLQUFBRixDQUFBO0FBQUEsU0FBQWIsd0JBQUFhLENBQUEsRUFBQUUsQ0FBQSxTQUFBQSxDQUFBLElBQUFGLENBQUEsSUFBQUEsQ0FBQSxDQUFBSSxVQUFBLFNBQUFKLENBQUEsZUFBQUEsQ0FBQSx1QkFBQUEsQ0FBQSx5QkFBQUEsQ0FBQSxXQUFBSyxP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T0FBTyxHQUFHLElBQUFDLGlCQUFVLEVBQUNDLHlCQUFlLENBQUM7RUFDM0MsTUFBTSxDQUFDeUQsS0FBSyxFQUFFQyxRQUFRLENBQUMsR0FBRyxJQUFBQyxlQUFRLEVBQUMsRUFBRSxDQUFDO0VBQ3RDLE1BQU0sQ0FBQ2pELFNBQVMsRUFBRW1FLFlBQVksQ0FBQyxHQUFHLElBQUFsQixlQUFRLEVBQWdCLElBQUksQ0FBQztFQUUvRCxNQUFNbEMsTUFBTSxHQUFHM0IsT0FBTyxDQUFDZ0IsSUFBSSxDQUFDaUQsWUFBWSxDQUFDdEMsTUFBTTtFQUUvQyxJQUFJZixTQUFTLEtBQUssSUFBSSxFQUFFO0lBQ3BCLE1BQU1iLE1BQU0sR0FBR0EsQ0FBQSxLQUFZO01BQ3ZCZ0YsWUFBWSxDQUFDLElBQUksQ0FBQztJQUN0QixDQUFDO0lBQ0Qsb0JBQU9uSCxNQUFBLENBQUFtQixPQUFBLENBQUF1QyxhQUFBLENBQUNvQywwQkFBMEI7TUFBQzlDLFNBQVMsRUFBRUEsU0FBVTtNQUFDYixNQUFNLEVBQUVBO0lBQU8sQ0FBRSxDQUFDO0VBQy9FO0VBRUEsTUFBTWlGLFFBQVEsR0FBRyxNQUFBQSxDQUFBLEtBQTJCO0lBQ3hDRixPQUFPLENBQUMsSUFBQUcsb0JBQUcsRUFBQyxrQ0FBa0MsQ0FBQyxFQUFFcEYsZ0JBQWdCLENBQUM7RUFDdEUsQ0FBQztFQUVELG9CQUNJakMsTUFBQSxDQUFBbUIsT0FBQSxDQUFBdUMsYUFBQSxDQUFDcEQsU0FBQSxDQUFBYSxPQUFRO0lBQUNnQixNQUFNLEVBQUVBLE1BQU87SUFBQ21GLFdBQVcsRUFBRSxJQUFBRCxvQkFBRyxFQUFDLGtDQUFrQyxDQUFFO0lBQUNELFFBQVEsRUFBRUE7RUFBUyxnQkFDL0ZwSCxNQUFBLENBQUFtQixPQUFBLENBQUF1QyxhQUFBLENBQUNqRCxhQUFBLENBQUFVLE9BQVk7SUFBQzRFLEtBQUssRUFBRUEsS0FBTTtJQUFDYyxRQUFRLEVBQUViO0VBQVMsR0FDMUNjLEtBQUssQ0FBQ0MsSUFBSSxDQUFDaEQsTUFBTSxDQUFDd0QsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDekMsR0FBRyxDQUFFOUIsU0FBUyxpQkFDckNoRCxNQUFBLENBQUFtQixPQUFBLENBQUF1QyxhQUFBLENBQUN3QixnQkFBZ0I7SUFBQ0QsR0FBRyxFQUFFakMsU0FBVTtJQUFDbUMsS0FBSyxFQUFFbkMsU0FBVTtJQUFDb0MsT0FBTyxFQUFFQSxDQUFBLEtBQU0rQixZQUFZLENBQUNuRSxTQUFTO0VBQUUsQ0FBRSxDQUNoRyxDQUNTLENBQ1IsQ0FBQztBQUVuQixDQUFDO0FBQUNhLE9BQUEsQ0FBQW9ELGlCQUFBLEdBQUFBLGlCQUFBIiwiaWdub3JlTGlzdCI6W119