You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
NextWeb/.next/static/webpack/_app-pages-browser_app_comp...

22 lines
351 KiB
JavaScript

"use strict";
/*
* ATTENTION: An "eval-source-map" devtool has been used.
* This devtool is neither made for production nor for readable output files.
* It uses "eval()" calls to create a separate source file with attached SourceMaps in the browser devtools.
* If you are trying to read the output file, select a different devtool (https://webpack.js.org/configuration/devtool/)
* or disable the default devtool with "devtool: false".
* If you are looking for production-ready output files, see mode: "production" (https://webpack.js.org/configuration/mode/).
*/
self["webpackHotUpdate_N_E"]("_app-pages-browser_app_components_chat_tsx",{
/***/ "(app-pages-browser)/./app/components/chat.tsx":
/*!*********************************!*\
!*** ./app/components/chat.tsx ***!
\*********************************/
/***/ (function(module, __webpack_exports__, __webpack_require__) {
eval(__webpack_require__.ts("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Chat: function() { return /* binding */ Chat; },\n/* harmony export */ ChatAction: function() { return /* binding */ ChatAction; },\n/* harmony export */ ChatActions: function() { return /* binding */ ChatActions; },\n/* harmony export */ DeleteImageButton: function() { return /* binding */ DeleteImageButton; },\n/* harmony export */ EditMessageModal: function() { return /* binding */ EditMessageModal; },\n/* harmony export */ PromptHints: function() { return /* binding */ PromptHints; },\n/* harmony export */ SessionConfigModel: function() { return /* binding */ SessionConfigModel; },\n/* harmony export */ ShortcutKeyModal: function() { return /* binding */ ShortcutKeyModal; }\n/* harmony export */ });\n/* harmony import */ var react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react/jsx-dev-runtime */ \"(app-pages-browser)/./node_modules/next/dist/compiled/react/jsx-dev-runtime.js\");\n/* harmony import */ var use_debounce__WEBPACK_IMPORTED_MODULE_58__ = __webpack_require__(/*! use-debounce */ \"(app-pages-browser)/./node_modules/use-debounce/dist/index.module.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react */ \"(app-pages-browser)/./node_modules/next/dist/compiled/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var _icons_send_white_svg__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../icons/send-white.svg */ \"(app-pages-browser)/./app/icons/send-white.svg\");\n/* harmony import */ var _icons_brain_svg__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../icons/brain.svg */ \"(app-pages-browser)/./app/icons/brain.svg\");\n/* harmony import */ var _icons_rename_svg__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../icons/rename.svg */ \"(app-pages-browser)/./app/icons/rename.svg\");\n/* harmony import */ var _icons_share_svg__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../icons/share.svg */ \"(app-pages-browser)/./app/icons/share.svg\");\n/* harmony import */ var _icons_return_svg__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../icons/return.svg */ \"(app-pages-browser)/./app/icons/return.svg\");\n/* harmony import */ var _icons_copy_svg__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../icons/copy.svg */ \"(app-pages-browser)/./app/icons/copy.svg\");\n/* harmony import */ var _icons_speak_svg__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../icons/speak.svg */ \"(app-pages-browser)/./app/icons/speak.svg\");\n/* harmony import */ var _icons_speak_stop_svg__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../icons/speak-stop.svg */ \"(app-pages-browser)/./app/icons/speak-stop.svg\");\n/* harmony import */ var _icons_three_dots_svg__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../icons/three-dots.svg */ \"(app-pages-browser)/./app/icons/three-dots.svg\");\n/* harmony import */ var _icons_loading_svg__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ../icons/loading.svg */ \"(app-pages-browser)/./app/icons/loading.svg\");\n/* harmony import */ var _icons_max_svg__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ../icons/max.svg */ \"(app-pages-browser)/./app/icons/max.svg\");\n/* harmony import */ var _icons_min_svg__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ../icons/min.svg */ \"(app-pages-browser)/./app/icons/min.svg\");\n/* harmony import */ var _icons_reload_svg__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ../icons/reload.svg */ \"(app-pages-browser)/./app/icons/reload.svg\");\n/* harmony import */ var _icons_chat_settings_svg__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ../icons/chat-settings.svg */ \"(app-pages-browser)/./app/icons/chat-settings.svg\");\n/* harmony import */ var _icons_clear_svg__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ../icons/clear.svg */ \"(app-pages-browser)/./app/icons/clear.svg\");\n/* harmony import */ var _icons_pin_svg__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! ../icons/pin.svg */ \"(app-pages-browser)/./app/icons/pin.svg\");\n/* harmony import */ var _icons_confirm_svg__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! ../icons/confirm.svg */ \"(app-pages-browser)/./app/icons/confirm.svg\");\n/* harmony import */ var _icons_close_svg__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! ../icons/close.svg */ \"(app-pages-browser)/./app/icons/close.svg\");\n/* harmony import */ var _icons_cancel_svg__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(/*! ../icons/cancel.svg */ \"(app-pages-browser)/./app/icons/cancel.svg\");\n/* harmony import */ var _icons_image_svg__WEBPACK_IMPORTED_MODULE_21__ = __webpack_require__(/*! ../icons/image.svg */ \"(app-pages-browser)/./app/icons/image.svg\");\n/* harmony import */ var _icons_bottom_svg__WEBPACK_IMPORTED_MODULE_22__ = __webpack_require__(/*! ../icons/bottom.svg */ \"(app-pages-browser)/./app/icons/bottom.svg\");\n/* harmony import */ var _icons_pause_svg__WEBPACK_IMPORTED_MODULE_23__ = __webpack_require__(/*! ../icons/pause.svg */ \"(app-pages-browser)/./app/icons/pause.svg\");\n/* harmony import */ var _icons_robot_svg__WEBPACK_IMPORTED_MODULE_24__ = __webpack_require__(/*! ../icons/robot.svg */ \"(app-pages-browser)/./app/icons/robot.svg\");\n/* harmony import */ var _icons_size_svg__WEBPACK_IMPORTED_MODULE_25__ = __webpack_require__(/*! ../icons/size.svg */ \"(app-pages-browser)/./app/icons/size.svg\");\n/* harmony import */ var _icons_hd_svg__WEBPACK_IMPORTED_MODULE_26__ = __webpack_require__(/*! ../icons/hd.svg */ \"(app-pages-browser)/./app/icons/hd.svg\");\n/* harmony import */ var _icons_palette_svg__WEBPACK_IMPORTED_MODULE_27__ = __webpack_require__(/*! ../icons/palette.svg */ \"(app-pages-browser)/./app/icons/palette.svg\");\n/* harmony import */ var _icons_plugin_svg__WEBPACK_IMPORTED_MODULE_28__ = __webpack_require__(/*! ../icons/plugin.svg */ \"(app-pages-browser)/./app/icons/plugin.svg\");\n/* harmony import */ var _icons_tool_svg__WEBPACK_IMPORTED_MODULE_29__ = __webpack_require__(/*! ../icons/tool.svg */ \"(app-pages-browser)/./app/icons/tool.svg\");\n/* harmony import */ var _icons_headphone_svg__WEBPACK_IMPORTED_MODULE_30__ = __webpack_require__(/*! ../icons/headphone.svg */ \"(app-pages-browser)/./app/icons/headphone.svg\");\n/* harmony import */ var _store__WEBPACK_IMPORTED_MODULE_31__ = __webpack_require__(/*! ../store */ \"(app-pages-browser)/./app/store/index.ts\");\n/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_32__ = __webpack_require__(/*! ../utils */ \"(app-pages-browser)/./app/utils.ts\");\n/* harmony import */ var _app_utils_chat__WEBPACK_IMPORTED_MODULE_33__ = __webpack_require__(/*! @/app/utils/chat */ \"(app-pages-browser)/./app/utils/chat.ts\");\n/* harmony import */ var next_dynamic__WEBPACK_IMPORTED_MODULE_34__ = __webpack_require__(/*! next/dynamic */ \"(app-pages-browser)/./node_modules/next/dist/api/app-dynamic.js\");\n/* harmony import */ var _client_controller__WEBPACK_IMPORTED_MODULE_35__ = __webpack_require__(/*! ../client/controller */ \"(app-pages-browser)/./app/client/controller.ts\");\n/* harmony import */ var _store_prompt__WEBPACK_IMPORTED_MODULE_36__ = __webpack_require__(/*! ../store/prompt */ \"(app-pages-browser)/./app/store/prompt.ts\");\n/* harmony import */ var _locales__WEBPACK_IMPORTED_MODULE_37__ = __webpack_require__(/*! ../locales */ \"(app-pages-browser)/./app/locales/index.ts\");\n/* harmony import */ var _button__WEBPACK_IMPORTED_MODULE_38__ = __webpack_require__(/*! ./button */ \"(app-pages-browser)/./app/components/button.tsx\");\n/* harmony import */ var _chat_module_scss__WEBPACK_IMPORTED_MODULE_57__ = __webpack_require__(/*! ./chat.module.scss */ \"(app-pages-browser)/./app/components/chat.module.scss\");\n/* harmony import */ var _chat_module_scss__WEBPACK_IMPORTED_MODULE_57___default = /*#__PURE__*/__webpack_require__.n(_chat_module_scss__WEBPACK_IMPORTED_MODULE_57__);\n/* harmony import */ var _ui_lib__WEBPACK_IMPORTED_MODULE_39__ = __webpack_require__(/*! ./ui-lib */ \"(app-pages-browser)/./app/components/ui-lib.tsx\");\n/* harmony import */ var react_router_dom__WEBPACK_IMPORTED_MODULE_56__ = __webpack_require__(/*! react-router-dom */ \"(app-pages-browser)/./node_modules/react-router/dist/index.js\");\n/* harmony import */ var _constant__WEBPACK_IMPORTED_MODULE_40__ = __webpack_require__(/*! ../constant */ \"(app-pages-browser)/./app/constant.ts\");\n/* harmony import */ var _emoji__WEBPACK_IMPORTED_MODULE_41__ = __webpack_require__(/*! ./emoji */ \"(app-pages-browser)/./app/components/emoji.tsx\");\n/* harmony import */ var _mask__WEBPACK_IMPORTED_MODULE_42__ = __webpack_require__(/*! ./mask */ \"(app-pages-browser)/./app/components/mask.tsx\");\n/* harmony import */ var _store_mask__WEBPACK_IMPORTED_MODULE_43__ = __webpack_require__(/*! ../store/mask */ \"(app-pages-browser)/./app/store/mask.ts\");\n/* harmony import */ var _command__WEBPACK_IMPORTED_MODULE_44__ = __webpack_require__(/*! ../command */ \"(app-pages-browser)/./app/command.ts\");\n/* harmony import */ var _utils_format__WEBPACK_IMPORTED_MODULE_45__ = __webpack_require__(/*! ../utils/format */ \"(app-pages-browser)/./app/utils/format.ts\");\n/* harmony import */ var _exporter__WEBPACK_IMPORTED_MODULE_46__ = __webpack_require__(/*! ./exporter */ \"(app-pages-browser)/./app/components/exporter.tsx\");\n/* harmony import */ var _config_client__WEBPACK_IMPORTED_MODULE_47__ = __webpack_require__(/*! ../config/client */ \"(app-pages-browser)/./app/config/client.ts\");\n/* harmony import */ var _utils_hooks__WEBPACK_IMPORTED_MODULE_48__ = __webpack_require__(/*! ../utils/hooks */ \"(app-pages-browser)/./app/utils/hooks.ts\");\n/* harmony import */ var _client_api__WEBPACK_IMPORTED_MODULE_49__ = __webpack_require__(/*! ../client/api */ \"(app-pages-browser)/./app/client/api.ts\");\n/* harmony import */ var _utils_audio__WEBPACK_IMPORTED_MODULE_50__ = __webpack_require__(/*! ../utils/audio */ \"(app-pages-browser)/./app/utils/audio.ts\");\n/* harmony import */ var _utils_ms_edge_tts__WEBPACK_IMPORTED_MODULE_51__ = __webpack_require__(/*! ../utils/ms_edge_tts */ \"(app-pages-browser)/./app/utils/ms_edge_tts.ts\");\n/* harmony import */ var _barrel_optimize_names_isEmpty_lodash_es__WEBPACK_IMPORTED_MODULE_59__ = __webpack_require__(/*! __barrel_optimize__?names=isEmpty!=!lodash-es */ \"(app-pages-browser)/./node_modules/lodash-es/isEmpty.js\");\n/* harmony import */ var _utils_model__WEBPACK_IMPORTED_MODULE_52__ = __webpack_require__(/*! ../utils/model */ \"(app-pages-browser)/./app/utils/model.ts\");\n/* harmony import */ var _app_components_realtime_chat__WEBPACK_IMPORTED_MODULE_53__ = __webpack_require__(/*! @/app/components/realtime-chat */ \"(app-pages-browser)/./app/components/realtime-chat/index.ts\");\n/* harmony import */ var clsx__WEBPACK_IMPORTED_MODULE_54__ = __webpack_require__(/*! clsx */ \"(app-pages-browser)/./node_modules/clsx/dist/clsx.mjs\");\n/* harmony import */ var _mcp_actions__WEBPACK_IMPORTED_MODULE_55__ = __webpack_require__(/*! ../mcp/actions */ \"(app-pages-browser)/./app/mcp/actions.ts\");\n\nvar _s = $RefreshSig$(), _s1 = $RefreshSig$(), _s2 = $RefreshSig$(), _s3 = $RefreshSig$(), _s4 = $RefreshSig$(), _s5 = $RefreshSig$(), _s6 = $RefreshSig$(), _s7 = $RefreshSig$(), _s8 = $RefreshSig$(), _s9 = $RefreshSig$(), _s10 = $RefreshSig$(), _s11 = $RefreshSig$();\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nconst localStorage = (0,_utils__WEBPACK_IMPORTED_MODULE_32__.safeLocalStorage)();\nconst ttsPlayer = (0,_utils_audio__WEBPACK_IMPORTED_MODULE_50__.createTTSPlayer)();\nconst Markdown = (0,next_dynamic__WEBPACK_IMPORTED_MODULE_34__[\"default\"])(async ()=>(await __webpack_require__.e(/*! import() */ \"_app-pages-browser_app_components_markdown_tsx\").then(__webpack_require__.bind(__webpack_require__, /*! ./markdown */ \"(app-pages-browser)/./app/components/markdown.tsx\"))).Markdown, {\n loadableGenerated: {\n modules: [\n \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx -> \" + \"./markdown\"\n ]\n },\n loading: ()=>/*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(_icons_three_dots_svg__WEBPACK_IMPORTED_MODULE_10__[\"default\"], {}, void 0, false, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 134,\n columnNumber: 18\n }, undefined)\n});\n_c = Markdown;\nconst MCPAction = ()=>{\n _s();\n const navigate = (0,react_router_dom__WEBPACK_IMPORTED_MODULE_56__.useNavigate)();\n const [count, setCount] = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)(0);\n const [mcpEnabled, setMcpEnabled] = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)(false);\n (0,react__WEBPACK_IMPORTED_MODULE_1__.useEffect)(()=>{\n const checkMcpStatus = async ()=>{\n const enabled = await (0,_mcp_actions__WEBPACK_IMPORTED_MODULE_55__.isMcpEnabled)();\n setMcpEnabled(enabled);\n if (enabled) {\n const count = await (0,_mcp_actions__WEBPACK_IMPORTED_MODULE_55__.getAvailableClientsCount)();\n setCount(count);\n }\n };\n checkMcpStatus();\n }, []);\n if (!mcpEnabled) return null;\n return /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(ChatAction, {\n onClick: ()=>navigate(_constant__WEBPACK_IMPORTED_MODULE_40__.Path.McpMarket),\n text: \"MCP\".concat(count ? \" (\".concat(count, \")\") : \"\"),\n icon: /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(_icons_tool_svg__WEBPACK_IMPORTED_MODULE_29__[\"default\"], {}, void 0, false, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 160,\n columnNumber: 13\n }, void 0)\n }, void 0, false, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 157,\n columnNumber: 5\n }, undefined);\n};\n_s(MCPAction, \"dt9esIgBk3FGVQflPUmBpxVsVks=\", false, function() {\n return [\n react_router_dom__WEBPACK_IMPORTED_MODULE_56__.useNavigate\n ];\n});\n_c1 = MCPAction;\nfunction SessionConfigModel(props) {\n _s1();\n const chatStore = (0,_store__WEBPACK_IMPORTED_MODULE_31__.useChatStore)();\n const session = chatStore.currentSession();\n const maskStore = (0,_store_mask__WEBPACK_IMPORTED_MODULE_43__.useMaskStore)();\n const navigate = (0,react_router_dom__WEBPACK_IMPORTED_MODULE_56__.useNavigate)();\n return /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"modal-mask\",\n children: /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(_ui_lib__WEBPACK_IMPORTED_MODULE_39__.Modal, {\n title: _locales__WEBPACK_IMPORTED_MODULE_37__[\"default\"].Context.Edit,\n onClose: ()=>props.onClose(),\n actions: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(_button__WEBPACK_IMPORTED_MODULE_38__.IconButton, {\n icon: /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(_icons_reload_svg__WEBPACK_IMPORTED_MODULE_14__[\"default\"], {}, void 0, false, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 179,\n columnNumber: 19\n }, void 0),\n bordered: true,\n text: _locales__WEBPACK_IMPORTED_MODULE_37__[\"default\"].Chat.Config.Reset,\n onClick: async ()=>{\n if (await (0,_ui_lib__WEBPACK_IMPORTED_MODULE_39__.showConfirm)(_locales__WEBPACK_IMPORTED_MODULE_37__[\"default\"].Memory.ResetConfirm)) {\n chatStore.updateTargetSession(session, (session)=>session.memoryPrompt = \"\");\n }\n }\n }, \"reset\", false, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 177,\n columnNumber: 11\n }, void 0),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(_button__WEBPACK_IMPORTED_MODULE_38__.IconButton, {\n icon: /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(_icons_copy_svg__WEBPACK_IMPORTED_MODULE_7__[\"default\"], {}, void 0, false, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 193,\n columnNumber: 19\n }, void 0),\n bordered: true,\n text: _locales__WEBPACK_IMPORTED_MODULE_37__[\"default\"].Chat.Config.SaveAs,\n onClick: ()=>{\n navigate(_constant__WEBPACK_IMPORTED_MODULE_40__.Path.Masks);\n setTimeout(()=>{\n maskStore.create(session.mask);\n }, 500);\n }\n }, \"copy\", false, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 191,\n columnNumber: 11\n }, void 0)\n ],\n children: /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(_mask__WEBPACK_IMPORTED_MODULE_42__.MaskConfig, {\n mask: session.mask,\n updateMask: (updater)=>{\n const mask = {\n ...session.mask\n };\n updater(mask);\n chatStore.updateTargetSession(session, (session)=>session.mask = mask);\n },\n shouldSyncFromGlobal: true,\n extraListItems: session.mask.modelConfig.sendMemory ? /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(_ui_lib__WEBPACK_IMPORTED_MODULE_39__.ListItem, {\n className: \"copyable\",\n title: \"\".concat(_locales__WEBPACK_IMPORTED_MODULE_37__[\"default\"].Memory.Title, \" (\").concat(session.lastSummarizeIndex, \" of \").concat(session.messages.length, \")\"),\n subTitle: session.memoryPrompt || _locales__WEBPACK_IMPORTED_MODULE_37__[\"default\"].Memory.EmptyContent\n }, void 0, false, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 218,\n columnNumber: 15\n }, void 0) : /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.Fragment, {}, void 0, false)\n }, void 0, false, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 205,\n columnNumber: 9\n }, this)\n }, void 0, false, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 173,\n columnNumber: 7\n }, this)\n }, void 0, false, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 172,\n columnNumber: 5\n }, this);\n}\n_s1(SessionConfigModel, \"z78RVOGmEODqWKBe7iegWqnpLi4=\", false, function() {\n return [\n _store__WEBPACK_IMPORTED_MODULE_31__.useChatStore,\n _store_mask__WEBPACK_IMPORTED_MODULE_43__.useMaskStore,\n react_router_dom__WEBPACK_IMPORTED_MODULE_56__.useNavigate\n ];\n});\n_c2 = SessionConfigModel;\nfunction PromptToast(props) {\n _s2();\n const chatStore = (0,_store__WEBPACK_IMPORTED_MODULE_31__.useChatStore)();\n const session = chatStore.currentSession();\n const context = session.mask.context;\n return /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: (_chat_module_scss__WEBPACK_IMPORTED_MODULE_57___default()[\"prompt-toast\"]),\n children: [\n props.showToast && context.length > 0 && /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: (0,clsx__WEBPACK_IMPORTED_MODULE_54__[\"default\"])((_chat_module_scss__WEBPACK_IMPORTED_MODULE_57___default()[\"prompt-toast-inner\"]), \"clickable\"),\n role: \"button\",\n onClick: ()=>props.setShowModal(true),\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(_icons_brain_svg__WEBPACK_IMPORTED_MODULE_3__[\"default\"], {}, void 0, false, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 250,\n columnNumber: 11\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"span\", {\n className: (_chat_module_scss__WEBPACK_IMPORTED_MODULE_57___default()[\"prompt-toast-content\"]),\n children: _locales__WEBPACK_IMPORTED_MODULE_37__[\"default\"].Context.Toast(context.length)\n }, void 0, false, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 251,\n columnNumber: 11\n }, this)\n ]\n }, void 0, true, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 245,\n columnNumber: 9\n }, this),\n props.showModal && /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(SessionConfigModel, {\n onClose: ()=>props.setShowModal(false)\n }, void 0, false, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 257,\n columnNumber: 9\n }, this)\n ]\n }, \"prompt-toast\", true, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 243,\n columnNumber: 5\n }, this);\n}\n_s2(PromptToast, \"VEZRjRiHFhGEe/E6z12rT6r9BBA=\", false, function() {\n return [\n _store__WEBPACK_IMPORTED_MODULE_31__.useChatStore\n ];\n});\n_c3 = PromptToast;\nfunction useSubmitHandler() {\n _s3();\n const config = (0,_store__WEBPACK_IMPORTED_MODULE_31__.useAppConfig)();\n const submitKey = config.submitKey;\n const isComposing = (0,react__WEBPACK_IMPORTED_MODULE_1__.useRef)(false);\n (0,react__WEBPACK_IMPORTED_MODULE_1__.useEffect)(()=>{\n const onCompositionStart = ()=>{\n isComposing.current = true;\n };\n const onCompositionEnd = ()=>{\n isComposing.current = false;\n };\n window.addEventListener(\"compositionstart\", onCompositionStart);\n window.addEventListener(\"compositionend\", onCompositionEnd);\n return ()=>{\n window.removeEventListener(\"compositionstart\", onCompositionStart);\n window.removeEventListener(\"compositionend\", onCompositionEnd);\n };\n }, []);\n const shouldSubmit = (e)=>{\n // Fix Chinese input method \"Enter\" on Safari\n if (e.keyCode == 229) return false;\n if (e.key !== \"Enter\") return false;\n if (e.key === \"Enter\" && (e.nativeEvent.isComposing || isComposing.current)) return false;\n return config.submitKey === _store__WEBPACK_IMPORTED_MODULE_31__.SubmitKey.AltEnter && e.altKey || config.submitKey === _store__WEBPACK_IMPORTED_MODULE_31__.SubmitKey.CtrlEnter && e.ctrlKey || config.submitKey === _store__WEBPACK_IMPORTED_MODULE_31__.SubmitKey.ShiftEnter && e.shiftKey || config.submitKey === _store__WEBPACK_IMPORTED_MODULE_31__.SubmitKey.MetaEnter && e.metaKey || config.submitKey === _store__WEBPACK_IMPORTED_MODULE_31__.SubmitKey.Enter && !e.altKey && !e.ctrlKey && !e.shiftKey && !e.metaKey;\n };\n return {\n submitKey,\n shouldSubmit\n };\n}\n_s3(useSubmitHandler, \"RhLmiAbheqFHJx+YtGZ+eIpCF80=\", false, function() {\n return [\n _store__WEBPACK_IMPORTED_MODULE_31__.useAppConfig\n ];\n});\nfunction PromptHints(props) {\n _s4();\n const noPrompts = props.prompts.length === 0;\n const [selectIndex, setSelectIndex] = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)(0);\n const selectedRef = (0,react__WEBPACK_IMPORTED_MODULE_1__.useRef)(null);\n (0,react__WEBPACK_IMPORTED_MODULE_1__.useEffect)(()=>{\n setSelectIndex(0);\n }, [\n props.prompts.length\n ]);\n (0,react__WEBPACK_IMPORTED_MODULE_1__.useEffect)(()=>{\n const onKeyDown = (e)=>{\n if (noPrompts || e.metaKey || e.altKey || e.ctrlKey) {\n return;\n }\n // arrow up / down to select prompt\n const changeIndex = (delta)=>{\n var _selectedRef_current;\n e.stopPropagation();\n e.preventDefault();\n const nextIndex = Math.max(0, Math.min(props.prompts.length - 1, selectIndex + delta));\n setSelectIndex(nextIndex);\n (_selectedRef_current = selectedRef.current) === null || _selectedRef_current === void 0 ? void 0 : _selectedRef_current.scrollIntoView({\n block: \"center\"\n });\n };\n if (e.key === \"ArrowUp\") {\n changeIndex(1);\n } else if (e.key === \"ArrowDown\") {\n changeIndex(-1);\n } else if (e.key === \"Enter\") {\n const selectedPrompt = props.prompts.at(selectIndex);\n if (selectedPrompt) {\n props.onPromptSelect(selectedPrompt);\n }\n }\n };\n window.addEventListener(\"keydown\", onKeyDown);\n return ()=>window.removeEventListener(\"keydown\", onKeyDown);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [\n props.prompts.length,\n selectIndex\n ]);\n if (noPrompts) return null;\n return /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: (_chat_module_scss__WEBPACK_IMPORTED_MODULE_57___default()[\"prompt-hints\"]),\n children: props.prompts.map((prompt, i)=>/*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n ref: i === selectIndex ? selectedRef : null,\n className: (0,clsx__WEBPACK_IMPORTED_MODULE_54__[\"default\"])((_chat_module_scss__WEBPACK_IMPORTED_MODULE_57___default()[\"prompt-hint\"]), {\n [(_chat_module_scss__WEBPACK_IMPORTED_MODULE_57___default()[\"prompt-hint-selected\"])]: i === selectIndex\n }),\n onClick: ()=>props.onPromptSelect(prompt),\n onMouseEnter: ()=>setSelectIndex(i),\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: (_chat_module_scss__WEBPACK_IMPORTED_MODULE_57___default()[\"hint-title\"]),\n children: prompt.title\n }, void 0, false, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 374,\n columnNumber: 11\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: (_chat_module_scss__WEBPACK_IMPORTED_MODULE_57___default()[\"hint-content\"]),\n children: prompt.content\n }, void 0, false, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 375,\n columnNumber: 11\n }, this)\n ]\n }, prompt.title + i.toString(), true, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 365,\n columnNumber: 9\n }, this))\n }, void 0, false, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 363,\n columnNumber: 5\n }, this);\n}\n_s4(PromptHints, \"qRy81yzrODnly+hCrZ8AH+LDmLY=\");\n_c4 = PromptHints;\nfunction ClearContextDivider() {\n _s5();\n const chatStore = (0,_store__WEBPACK_IMPORTED_MODULE_31__.useChatStore)();\n const session = chatStore.currentSession();\n return /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: (_chat_module_scss__WEBPACK_IMPORTED_MODULE_57___default()[\"clear-context\"]),\n onClick: ()=>chatStore.updateTargetSession(session, (session)=>session.clearContextIndex = undefined),\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: (_chat_module_scss__WEBPACK_IMPORTED_MODULE_57___default()[\"clear-context-tips\"]),\n children: _locales__WEBPACK_IMPORTED_MODULE_37__[\"default\"].Context.Clear\n }, void 0, false, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 396,\n columnNumber: 7\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: (_chat_module_scss__WEBPACK_IMPORTED_MODULE_57___default()[\"clear-context-revert-btn\"]),\n children: _locales__WEBPACK_IMPORTED_MODULE_37__[\"default\"].Context.Revert\n }, void 0, false, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 397,\n columnNumber: 7\n }, this)\n ]\n }, void 0, true, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 387,\n columnNumber: 5\n }, this);\n}\n_s5(ClearContextDivider, \"VEZRjRiHFhGEe/E6z12rT6r9BBA=\", false, function() {\n return [\n _store__WEBPACK_IMPORTED_MODULE_31__.useChatStore\n ];\n});\n_c5 = ClearContextDivider;\nfunction ChatAction(props) {\n _s6();\n const iconRef = (0,react__WEBPACK_IMPORTED_MODULE_1__.useRef)(null);\n const textRef = (0,react__WEBPACK_IMPORTED_MODULE_1__.useRef)(null);\n const [width, setWidth] = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)({\n full: 16,\n icon: 16\n });\n function updateWidth() {\n if (!iconRef.current || !textRef.current) return;\n const getWidth = (dom)=>dom.getBoundingClientRect().width;\n const textWidth = getWidth(textRef.current);\n const iconWidth = getWidth(iconRef.current);\n setWidth({\n full: textWidth + iconWidth,\n icon: iconWidth\n });\n }\n return /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: (0,clsx__WEBPACK_IMPORTED_MODULE_54__[\"default\"])((_chat_module_scss__WEBPACK_IMPORTED_MODULE_57___default()[\"chat-input-action\"]), \"clickable\"),\n onClick: ()=>{\n props.onClick();\n setTimeout(updateWidth, 1);\n },\n onMouseEnter: updateWidth,\n onTouchStart: updateWidth,\n style: {\n \"--icon-width\": \"\".concat(width.icon, \"px\"),\n \"--full-width\": \"\".concat(width.full, \"px\")\n },\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n ref: iconRef,\n className: (_chat_module_scss__WEBPACK_IMPORTED_MODULE_57___default().icon),\n children: props.icon\n }, void 0, false, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 443,\n columnNumber: 7\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: (_chat_module_scss__WEBPACK_IMPORTED_MODULE_57___default().text),\n ref: textRef,\n children: props.text\n }, void 0, false, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 446,\n columnNumber: 7\n }, this)\n ]\n }, void 0, true, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 428,\n columnNumber: 5\n }, this);\n}\n_s6(ChatAction, \"Gy4HVhM4xnpJH9376EHJy8nmbtU=\");\n_c6 = ChatAction;\nfunction useScrollToBottom(scrollRef) {\n let detach = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : false, messages = arguments.length > 2 ? arguments[2] : void 0;\n _s7();\n // for auto-scroll\n const [autoScroll, setAutoScroll] = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)(true);\n const scrollDomToBottom = (0,react__WEBPACK_IMPORTED_MODULE_1__.useCallback)(()=>{\n const dom = scrollRef.current;\n if (dom) {\n requestAnimationFrame(()=>{\n setAutoScroll(true);\n dom.scrollTo(0, dom.scrollHeight);\n });\n }\n }, [\n scrollRef\n ]);\n // auto scroll\n (0,react__WEBPACK_IMPORTED_MODULE_1__.useEffect)(()=>{\n if (autoScroll && !detach) {\n scrollDomToBottom();\n }\n });\n // auto scroll when messages length changes\n const lastMessagesLength = (0,react__WEBPACK_IMPORTED_MODULE_1__.useRef)(messages.length);\n (0,react__WEBPACK_IMPORTED_MODULE_1__.useEffect)(()=>{\n if (messages.length > lastMessagesLength.current && !detach) {\n scrollDomToBottom();\n }\n lastMessagesLength.current = messages.length;\n }, [\n messages.length,\n detach,\n scrollDomToBottom\n ]);\n return {\n scrollRef,\n autoScroll,\n setAutoScroll,\n scrollDomToBottom\n };\n}\n_s7(useScrollToBottom, \"ORowTWNZz/Ptf/vqqgFxsaSQ0Mg=\");\nfunction ChatActions(props) {\n var _session_mask_modelConfig, _session_mask_modelConfig1, _session_mask_modelConfig2, _session_mask_modelConfig3, _chatStore_currentSession_mask;\n _s8();\n const config = (0,_store__WEBPACK_IMPORTED_MODULE_31__.useAppConfig)();\n const navigate = (0,react_router_dom__WEBPACK_IMPORTED_MODULE_56__.useNavigate)();\n const chatStore = (0,_store__WEBPACK_IMPORTED_MODULE_31__.useChatStore)();\n const pluginStore = (0,_store__WEBPACK_IMPORTED_MODULE_31__.usePluginStore)();\n const session = chatStore.currentSession();\n // switch themes\n const theme = config.theme;\n function nextTheme() {\n const themes = [\n _store__WEBPACK_IMPORTED_MODULE_31__.Theme.Auto,\n _store__WEBPACK_IMPORTED_MODULE_31__.Theme.Light,\n _store__WEBPACK_IMPORTED_MODULE_31__.Theme.Dark\n ];\n const themeIndex = themes.indexOf(theme);\n const nextIndex = (themeIndex + 1) % themes.length;\n const nextTheme = themes[nextIndex];\n config.update((config)=>config.theme = nextTheme);\n }\n // stop all responses\n const couldStop = _client_controller__WEBPACK_IMPORTED_MODULE_35__.ChatControllerPool.hasPending();\n const stopAll = ()=>_client_controller__WEBPACK_IMPORTED_MODULE_35__.ChatControllerPool.stopAll();\n // switch model\n const currentModel = session.mask.modelConfig.model;\n const currentProviderName = ((_session_mask_modelConfig = session.mask.modelConfig) === null || _session_mask_modelConfig === void 0 ? void 0 : _session_mask_modelConfig.providerName) || _constant__WEBPACK_IMPORTED_MODULE_40__.ServiceProvider.OpenAI;\n const allModels = (0,_utils_hooks__WEBPACK_IMPORTED_MODULE_48__.useAllModels)();\n const models = (0,react__WEBPACK_IMPORTED_MODULE_1__.useMemo)(()=>{\n const filteredModels = allModels.filter((m)=>m.available);\n const defaultModel = filteredModels.find((m)=>m.isDefault);\n if (defaultModel) {\n const arr = [\n defaultModel,\n ...filteredModels.filter((m)=>m !== defaultModel)\n ];\n return arr;\n } else {\n return filteredModels;\n }\n }, [\n allModels\n ]);\n const currentModelName = (0,react__WEBPACK_IMPORTED_MODULE_1__.useMemo)(()=>{\n const model = models.find((m)=>{\n var _m_provider;\n return m.name == currentModel && (m === null || m === void 0 ? void 0 : (_m_provider = m.provider) === null || _m_provider === void 0 ? void 0 : _m_provider.providerName) == currentProviderName;\n });\n var _model_displayName;\n return (_model_displayName = model === null || model === void 0 ? void 0 : model.displayName) !== null && _model_displayName !== void 0 ? _model_displayName : \"\";\n }, [\n models,\n currentModel,\n currentProviderName\n ]);\n const [showModelSelector, setShowModelSelector] = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)(false);\n const [showPluginSelector, setShowPluginSelector] = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)(false);\n const [showUploadImage, setShowUploadImage] = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)(false);\n const [showSizeSelector, setShowSizeSelector] = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)(false);\n const [showQualitySelector, setShowQualitySelector] = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)(false);\n const [showStyleSelector, setShowStyleSelector] = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)(false);\n const modelSizes = (0,_utils__WEBPACK_IMPORTED_MODULE_32__.getModelSizes)(currentModel);\n const dalle3Qualitys = [\n \"standard\",\n \"hd\"\n ];\n const dalle3Styles = [\n \"vivid\",\n \"natural\"\n ];\n var _session_mask_modelConfig_size;\n const currentSize = (_session_mask_modelConfig_size = (_session_mask_modelConfig1 = session.mask.modelConfig) === null || _session_mask_modelConfig1 === void 0 ? void 0 : _session_mask_modelConfig1.size) !== null && _session_mask_modelConfig_size !== void 0 ? _session_mask_modelConfig_size : \"1024x1024\";\n var _session_mask_modelConfig_quality;\n const currentQuality = (_session_mask_modelConfig_quality = (_session_mask_modelConfig2 = session.mask.modelConfig) === null || _session_mask_modelConfig2 === void 0 ? void 0 : _session_mask_modelConfig2.quality) !== null && _session_mask_modelConfig_quality !== void 0 ? _session_mask_modelConfig_quality : \"standard\";\n var _session_mask_modelConfig_style;\n const currentStyle = (_session_mask_modelConfig_style = (_session_mask_modelConfig3 = session.mask.modelConfig) === null || _session_mask_modelConfig3 === void 0 ? void 0 : _session_mask_modelConfig3.style) !== null && _session_mask_modelConfig_style !== void 0 ? _session_mask_modelConfig_style : \"vivid\";\n const isMobileScreen = (0,_utils__WEBPACK_IMPORTED_MODULE_32__.useMobileScreen)();\n (0,react__WEBPACK_IMPORTED_MODULE_1__.useEffect)(()=>{\n const show = (0,_utils__WEBPACK_IMPORTED_MODULE_32__.isVisionModel)(currentModel);\n setShowUploadImage(show);\n if (!show) {\n props.setAttachImages([]);\n props.setUploading(false);\n }\n // if current model is not available\n // switch to first available model\n const isUnavailableModel = !models.some((m)=>m.name === currentModel);\n if (isUnavailableModel && models.length > 0) {\n var _nextModel_provider;\n // show next model to default model if exist\n let nextModel = models.find((model)=>model.isDefault) || models[0];\n chatStore.updateTargetSession(session, (session)=>{\n var _nextModel_provider;\n session.mask.modelConfig.model = nextModel.name;\n session.mask.modelConfig.providerName = nextModel === null || nextModel === void 0 ? void 0 : (_nextModel_provider = nextModel.provider) === null || _nextModel_provider === void 0 ? void 0 : _nextModel_provider.providerName;\n });\n (0,_ui_lib__WEBPACK_IMPORTED_MODULE_39__.showToast)((nextModel === null || nextModel === void 0 ? void 0 : (_nextModel_provider = nextModel.provider) === null || _nextModel_provider === void 0 ? void 0 : _nextModel_provider.providerName) == \"ByteDance\" ? nextModel.displayName : nextModel.name);\n }\n }, [\n chatStore,\n currentModel,\n models,\n session\n ]);\n return /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: (_chat_module_scss__WEBPACK_IMPORTED_MODULE_57___default()[\"chat-input-actions\"]),\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.Fragment, {\n children: [\n couldStop && /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(ChatAction, {\n onClick: stopAll,\n text: _locales__WEBPACK_IMPORTED_MODULE_37__[\"default\"].Chat.InputActions.Stop,\n icon: /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(_icons_pause_svg__WEBPACK_IMPORTED_MODULE_23__[\"default\"], {}, void 0, false, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 606,\n columnNumber: 19\n }, void 0)\n }, void 0, false, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 603,\n columnNumber: 11\n }, this),\n !props.hitBottom && /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(ChatAction, {\n onClick: props.scrollToBottom,\n text: _locales__WEBPACK_IMPORTED_MODULE_37__[\"default\"].Chat.InputActions.ToBottom,\n icon: /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(_icons_bottom_svg__WEBPACK_IMPORTED_MODULE_22__[\"default\"], {}, void 0, false, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 613,\n columnNumber: 19\n }, void 0)\n }, void 0, false, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 610,\n columnNumber: 11\n }, this),\n props.hitBottom && /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(ChatAction, {\n onClick: props.showPromptModal,\n text: _locales__WEBPACK_IMPORTED_MODULE_37__[\"default\"].Chat.InputActions.Settings,\n icon: /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(_icons_chat_settings_svg__WEBPACK_IMPORTED_MODULE_15__[\"default\"], {}, void 0, false, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 620,\n columnNumber: 19\n }, void 0)\n }, void 0, false, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 617,\n columnNumber: 11\n }, this),\n showUploadImage && /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(ChatAction, {\n onClick: props.uploadImage,\n text: _locales__WEBPACK_IMPORTED_MODULE_37__[\"default\"].Chat.InputActions.UploadImage,\n icon: props.uploading ? /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(_icons_loading_svg__WEBPACK_IMPORTED_MODULE_11__[\"default\"], {}, void 0, false, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 628,\n columnNumber: 37\n }, void 0) : /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(_icons_image_svg__WEBPACK_IMPORTED_MODULE_21__[\"default\"], {}, void 0, false, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 628,\n columnNumber: 61\n }, void 0)\n }, void 0, false, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 625,\n columnNumber: 11\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(ChatAction, {\n onClick: ()=>setShowModelSelector(true),\n text: currentModelName,\n icon: /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(_icons_robot_svg__WEBPACK_IMPORTED_MODULE_24__[\"default\"], {}, void 0, false, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 635,\n columnNumber: 17\n }, void 0)\n }, void 0, false, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 632,\n columnNumber: 9\n }, this),\n showModelSelector && /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(_ui_lib__WEBPACK_IMPORTED_MODULE_39__.Selector, {\n defaultSelectedValue: \"\".concat(currentModel, \"@\").concat(currentProviderName),\n items: models.map((m)=>{\n var _m_provider, _m_provider1, _m_provider2;\n return {\n title: \"\".concat(m.displayName).concat((m === null || m === void 0 ? void 0 : (_m_provider = m.provider) === null || _m_provider === void 0 ? void 0 : _m_provider.providerName) ? \" (\" + (m === null || m === void 0 ? void 0 : (_m_provider1 = m.provider) === null || _m_provider1 === void 0 ? void 0 : _m_provider1.providerName) + \")\" : \"\"),\n value: \"\".concat(m.name, \"@\").concat(m === null || m === void 0 ? void 0 : (_m_provider2 = m.provider) === null || _m_provider2 === void 0 ? void 0 : _m_provider2.providerName)\n };\n }),\n onClose: ()=>setShowModelSelector(false),\n onSelection: (s)=>{\n if (s.length === 0) return;\n const [model, providerName] = (0,_utils_model__WEBPACK_IMPORTED_MODULE_52__.getModelProvider)(s[0]);\n chatStore.updateTargetSession(session, (session)=>{\n session.mask.modelConfig.model = model;\n session.mask.modelConfig.providerName = providerName;\n session.mask.syncGlobalConfig = false;\n });\n if (providerName == \"ByteDance\") {\n const selectedModel = models.find((m)=>{\n var _m_provider;\n return m.name == model && (m === null || m === void 0 ? void 0 : (_m_provider = m.provider) === null || _m_provider === void 0 ? void 0 : _m_provider.providerName) == providerName;\n });\n var _selectedModel_displayName;\n (0,_ui_lib__WEBPACK_IMPORTED_MODULE_39__.showToast)((_selectedModel_displayName = selectedModel === null || selectedModel === void 0 ? void 0 : selectedModel.displayName) !== null && _selectedModel_displayName !== void 0 ? _selectedModel_displayName : \"\");\n } else {\n (0,_ui_lib__WEBPACK_IMPORTED_MODULE_39__.showToast)(model);\n }\n }\n }, void 0, false, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 639,\n columnNumber: 11\n }, this),\n (0,_utils__WEBPACK_IMPORTED_MODULE_32__.supportsCustomSize)(currentModel) && /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(ChatAction, {\n onClick: ()=>setShowSizeSelector(true),\n text: currentSize,\n icon: /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(_icons_size_svg__WEBPACK_IMPORTED_MODULE_25__[\"default\"], {}, void 0, false, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 677,\n columnNumber: 19\n }, void 0)\n }, void 0, false, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 674,\n columnNumber: 11\n }, this),\n showSizeSelector && /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(_ui_lib__WEBPACK_IMPORTED_MODULE_39__.Selector, {\n defaultSelectedValue: currentSize,\n items: modelSizes.map((m)=>({\n title: m,\n value: m\n })),\n onClose: ()=>setShowSizeSelector(false),\n onSelection: (s)=>{\n if (s.length === 0) return;\n const size = s[0];\n chatStore.updateTargetSession(session, (session)=>{\n session.mask.modelConfig.size = size;\n });\n (0,_ui_lib__WEBPACK_IMPORTED_MODULE_39__.showToast)(size);\n }\n }, void 0, false, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 682,\n columnNumber: 11\n }, this),\n (0,_utils__WEBPACK_IMPORTED_MODULE_32__.isDalle3)(currentModel) && /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(ChatAction, {\n onClick: ()=>setShowQualitySelector(true),\n text: currentQuality,\n icon: /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(_icons_hd_svg__WEBPACK_IMPORTED_MODULE_26__[\"default\"], {}, void 0, false, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 704,\n columnNumber: 19\n }, void 0)\n }, void 0, false, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 701,\n columnNumber: 11\n }, this),\n showQualitySelector && /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(_ui_lib__WEBPACK_IMPORTED_MODULE_39__.Selector, {\n defaultSelectedValue: currentQuality,\n items: dalle3Qualitys.map((m)=>({\n title: m,\n value: m\n })),\n onClose: ()=>setShowQualitySelector(false),\n onSelection: (q)=>{\n if (q.length === 0) return;\n const quality = q[0];\n chatStore.updateTargetSession(session, (session)=>{\n session.mask.modelConfig.quality = quality;\n });\n (0,_ui_lib__WEBPACK_IMPORTED_MODULE_39__.showToast)(quality);\n }\n }, void 0, false, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 709,\n columnNumber: 11\n }, this),\n (0,_utils__WEBPACK_IMPORTED_MODULE_32__.isDalle3)(currentModel) && /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(ChatAction, {\n onClick: ()=>setShowStyleSelector(true),\n text: currentStyle,\n icon: /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(_icons_palette_svg__WEBPACK_IMPORTED_MODULE_27__[\"default\"], {}, void 0, false, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 731,\n columnNumber: 19\n }, void 0)\n }, void 0, false, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 728,\n columnNumber: 11\n }, this),\n showStyleSelector && /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(_ui_lib__WEBPACK_IMPORTED_MODULE_39__.Selector, {\n defaultSelectedValue: currentStyle,\n items: dalle3Styles.map((m)=>({\n title: m,\n value: m\n })),\n onClose: ()=>setShowStyleSelector(false),\n onSelection: (s)=>{\n if (s.length === 0) return;\n const style = s[0];\n chatStore.updateTargetSession(session, (session)=>{\n session.mask.modelConfig.style = style;\n });\n (0,_ui_lib__WEBPACK_IMPORTED_MODULE_39__.showToast)(style);\n }\n }, void 0, false, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 736,\n columnNumber: 11\n }, this),\n (0,_utils__WEBPACK_IMPORTED_MODULE_32__.showPlugins)(currentProviderName, currentModel) && /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(ChatAction, {\n onClick: ()=>{\n if (pluginStore.getAll().length == 0) {\n navigate(_constant__WEBPACK_IMPORTED_MODULE_40__.Path.Plugins);\n } else {\n setShowPluginSelector(true);\n }\n },\n text: _locales__WEBPACK_IMPORTED_MODULE_37__[\"default\"].Plugin.Name,\n icon: /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(_icons_plugin_svg__WEBPACK_IMPORTED_MODULE_28__[\"default\"], {}, void 0, false, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 764,\n columnNumber: 19\n }, void 0)\n }, void 0, false, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 755,\n columnNumber: 11\n }, this),\n showPluginSelector && /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(_ui_lib__WEBPACK_IMPORTED_MODULE_39__.Selector, {\n multiple: true,\n defaultSelectedValue: (_chatStore_currentSession_mask = chatStore.currentSession().mask) === null || _chatStore_currentSession_mask === void 0 ? void 0 : _chatStore_currentSession_mask.plugin,\n items: pluginStore.getAll().map((item)=>({\n title: \"\".concat(item === null || item === void 0 ? void 0 : item.title, \"@\").concat(item === null || item === void 0 ? void 0 : item.version),\n value: item === null || item === void 0 ? void 0 : item.id\n })),\n onClose: ()=>setShowPluginSelector(false),\n onSelection: (s)=>{\n chatStore.updateTargetSession(session, (session)=>{\n session.mask.plugin = s;\n });\n }\n }, void 0, false, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 768,\n columnNumber: 11\n }, this)\n ]\n }, void 0, true),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: (_chat_module_scss__WEBPACK_IMPORTED_MODULE_57___default()[\"chat-input-actions-end\"]),\n children: config.realtimeConfig.enable && /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(ChatAction, {\n onClick: ()=>props.setShowChatSidePanel(true),\n text: \"Realtime Chat\",\n icon: /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(_icons_headphone_svg__WEBPACK_IMPORTED_MODULE_30__[\"default\"], {}, void 0, false, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 790,\n columnNumber: 19\n }, void 0)\n }, void 0, false, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 787,\n columnNumber: 11\n }, this)\n }, void 0, false, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 785,\n columnNumber: 7\n }, this)\n ]\n }, void 0, true, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 600,\n columnNumber: 5\n }, this);\n}\n_s8(ChatActions, \"06YQ6I8I25ydwS6/9kU9y8x3Ods=\", false, function() {\n return [\n _store__WEBPACK_IMPORTED_MODULE_31__.useAppConfig,\n react_router_dom__WEBPACK_IMPORTED_MODULE_56__.useNavigate,\n _store__WEBPACK_IMPORTED_MODULE_31__.useChatStore,\n _store__WEBPACK_IMPORTED_MODULE_31__.usePluginStore,\n _utils_hooks__WEBPACK_IMPORTED_MODULE_48__.useAllModels,\n _utils__WEBPACK_IMPORTED_MODULE_32__.useMobileScreen\n ];\n});\n_c7 = ChatActions;\nfunction EditMessageModal(props) {\n _s9();\n const chatStore = (0,_store__WEBPACK_IMPORTED_MODULE_31__.useChatStore)();\n const session = chatStore.currentSession();\n const [messages, setMessages] = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)(session.messages.slice());\n return /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"modal-mask\",\n children: /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(_ui_lib__WEBPACK_IMPORTED_MODULE_39__.Modal, {\n title: _locales__WEBPACK_IMPORTED_MODULE_37__[\"default\"].Chat.EditMessage.Title,\n onClose: props.onClose,\n actions: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(_button__WEBPACK_IMPORTED_MODULE_38__.IconButton, {\n text: _locales__WEBPACK_IMPORTED_MODULE_37__[\"default\"].UI.Cancel,\n icon: /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(_icons_cancel_svg__WEBPACK_IMPORTED_MODULE_20__[\"default\"], {}, void 0, false, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 811,\n columnNumber: 19\n }, void 0),\n onClick: ()=>{\n props.onClose();\n }\n }, \"cancel\", false, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 809,\n columnNumber: 11\n }, void 0),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(_button__WEBPACK_IMPORTED_MODULE_38__.IconButton, {\n type: \"primary\",\n text: _locales__WEBPACK_IMPORTED_MODULE_37__[\"default\"].UI.Confirm,\n icon: /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(_icons_confirm_svg__WEBPACK_IMPORTED_MODULE_18__[\"default\"], {}, void 0, false, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 820,\n columnNumber: 19\n }, void 0),\n onClick: ()=>{\n chatStore.updateTargetSession(session, (session)=>session.messages = messages);\n props.onClose();\n }\n }, \"ok\", false, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 817,\n columnNumber: 11\n }, void 0)\n ],\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(_ui_lib__WEBPACK_IMPORTED_MODULE_39__.List, {\n children: /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(_ui_lib__WEBPACK_IMPORTED_MODULE_39__.ListItem, {\n title: _locales__WEBPACK_IMPORTED_MODULE_37__[\"default\"].Chat.EditMessage.Topic.Title,\n subTitle: _locales__WEBPACK_IMPORTED_MODULE_37__[\"default\"].Chat.EditMessage.Topic.SubTitle,\n children: /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"input\", {\n type: \"text\",\n value: session.topic,\n onInput: (e)=>chatStore.updateTargetSession(session, (session)=>session.topic = e.currentTarget.value)\n }, void 0, false, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 837,\n columnNumber: 13\n }, this)\n }, void 0, false, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 833,\n columnNumber: 11\n }, this)\n }, void 0, false, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 832,\n columnNumber: 9\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(_mask__WEBPACK_IMPORTED_MODULE_42__.ContextPrompts, {\n context: messages,\n updateContext: (updater)=>{\n const newMessages = messages.slice();\n updater(newMessages);\n setMessages(newMessages);\n }\n }, void 0, false, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 849,\n columnNumber: 9\n }, this)\n ]\n }, void 0, true, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 805,\n columnNumber: 7\n }, this)\n }, void 0, false, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 804,\n columnNumber: 5\n }, this);\n}\n_s9(EditMessageModal, \"PNpuWAMa1wFKZALzUiT027BVX2s=\", false, function() {\n return [\n _store__WEBPACK_IMPORTED_MODULE_31__.useChatStore\n ];\n});\n_c8 = EditMessageModal;\nfunction DeleteImageButton(props) {\n return /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: (_chat_module_scss__WEBPACK_IMPORTED_MODULE_57___default()[\"delete-image\"]),\n onClick: props.deleteImage,\n children: /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(_icons_clear_svg__WEBPACK_IMPORTED_MODULE_16__[\"default\"], {}, void 0, false, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 865,\n columnNumber: 7\n }, this)\n }, void 0, false, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 864,\n columnNumber: 5\n }, this);\n}\n_c9 = DeleteImageButton;\nfunction ShortcutKeyModal(props) {\n const isMac = navigator.platform.toUpperCase().indexOf(\"MAC\") >= 0;\n const shortcuts = [\n {\n title: _locales__WEBPACK_IMPORTED_MODULE_37__[\"default\"].Chat.ShortcutKey.newChat,\n keys: isMac ? [\n \"⌘\",\n \"Shift\",\n \"O\"\n ] : [\n \"Ctrl\",\n \"Shift\",\n \"O\"\n ]\n },\n {\n title: _locales__WEBPACK_IMPORTED_MODULE_37__[\"default\"].Chat.ShortcutKey.focusInput,\n keys: [\n \"Shift\",\n \"Esc\"\n ]\n },\n {\n title: _locales__WEBPACK_IMPORTED_MODULE_37__[\"default\"].Chat.ShortcutKey.copyLastCode,\n keys: isMac ? [\n \"⌘\",\n \"Shift\",\n \";\"\n ] : [\n \"Ctrl\",\n \"Shift\",\n \";\"\n ]\n },\n {\n title: _locales__WEBPACK_IMPORTED_MODULE_37__[\"default\"].Chat.ShortcutKey.copyLastMessage,\n keys: isMac ? [\n \"⌘\",\n \"Shift\",\n \"C\"\n ] : [\n \"Ctrl\",\n \"Shift\",\n \"C\"\n ]\n },\n {\n title: _locales__WEBPACK_IMPORTED_MODULE_37__[\"default\"].Chat.ShortcutKey.showShortcutKey,\n keys: isMac ? [\n \"⌘\",\n \"/\"\n ] : [\n \"Ctrl\",\n \"/\"\n ]\n },\n {\n title: _locales__WEBPACK_IMPORTED_MODULE_37__[\"default\"].Chat.ShortcutKey.clearContext,\n keys: isMac ? [\n \"⌘\",\n \"Shift\",\n \"backspace\"\n ] : [\n \"Ctrl\",\n \"Shift\",\n \"backspace\"\n ]\n }\n ];\n return /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"modal-mask\",\n children: /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(_ui_lib__WEBPACK_IMPORTED_MODULE_39__.Modal, {\n title: _locales__WEBPACK_IMPORTED_MODULE_37__[\"default\"].Chat.ShortcutKey.Title,\n onClose: props.onClose,\n actions: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(_button__WEBPACK_IMPORTED_MODULE_38__.IconButton, {\n type: \"primary\",\n text: _locales__WEBPACK_IMPORTED_MODULE_37__[\"default\"].UI.Confirm,\n icon: /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(_icons_confirm_svg__WEBPACK_IMPORTED_MODULE_18__[\"default\"], {}, void 0, false, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 906,\n columnNumber: 19\n }, void 0),\n onClick: ()=>{\n props.onClose();\n }\n }, \"ok\", false, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 903,\n columnNumber: 11\n }, void 0)\n ],\n children: /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: (_chat_module_scss__WEBPACK_IMPORTED_MODULE_57___default()[\"shortcut-key-container\"]),\n children: /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: (_chat_module_scss__WEBPACK_IMPORTED_MODULE_57___default()[\"shortcut-key-grid\"]),\n children: shortcuts.map((shortcut, index)=>/*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: (_chat_module_scss__WEBPACK_IMPORTED_MODULE_57___default()[\"shortcut-key-item\"]),\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: (_chat_module_scss__WEBPACK_IMPORTED_MODULE_57___default()[\"shortcut-key-title\"]),\n children: shortcut.title\n }, void 0, false, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 918,\n columnNumber: 17\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: (_chat_module_scss__WEBPACK_IMPORTED_MODULE_57___default()[\"shortcut-key-keys\"]),\n children: shortcut.keys.map((key, i)=>/*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: (_chat_module_scss__WEBPACK_IMPORTED_MODULE_57___default()[\"shortcut-key\"]),\n children: /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"span\", {\n children: key\n }, void 0, false, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 924,\n columnNumber: 23\n }, this)\n }, i, false, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 923,\n columnNumber: 21\n }, this))\n }, void 0, false, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 921,\n columnNumber: 17\n }, this)\n ]\n }, index, true, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 917,\n columnNumber: 15\n }, this))\n }, void 0, false, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 915,\n columnNumber: 11\n }, this)\n }, void 0, false, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 914,\n columnNumber: 9\n }, this)\n }, void 0, false, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 899,\n columnNumber: 7\n }, this)\n }, void 0, false, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 898,\n columnNumber: 5\n }, this);\n}\n_c10 = ShortcutKeyModal;\nfunction _Chat() {\n var _scrollRef_current, _session_messages_at;\n _s10();\n const chatStore = (0,_store__WEBPACK_IMPORTED_MODULE_31__.useChatStore)();\n const session = chatStore.currentSession();\n const config = (0,_store__WEBPACK_IMPORTED_MODULE_31__.useAppConfig)();\n const fontSize = config.fontSize;\n const fontFamily = config.fontFamily;\n const [showExport, setShowExport] = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)(false);\n const inputRef = (0,react__WEBPACK_IMPORTED_MODULE_1__.useRef)(null);\n const [userInput, setUserInput] = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)(\"\");\n const [isLoading, setIsLoading] = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)(false);\n const { submitKey, shouldSubmit } = useSubmitHandler();\n const scrollRef = (0,react__WEBPACK_IMPORTED_MODULE_1__.useRef)(null);\n const isScrolledToBottom = (scrollRef === null || scrollRef === void 0 ? void 0 : scrollRef.current) ? Math.abs(scrollRef.current.scrollHeight - (scrollRef.current.scrollTop + scrollRef.current.clientHeight)) <= 1 : false;\n const isAttachWithTop = (0,react__WEBPACK_IMPORTED_MODULE_1__.useMemo)(()=>{\n var _scrollRef_current;\n const lastMessage = (_scrollRef_current = scrollRef.current) === null || _scrollRef_current === void 0 ? void 0 : _scrollRef_current.lastElementChild;\n // if scrolllRef is not ready or no message, return false\n if (!(scrollRef === null || scrollRef === void 0 ? void 0 : scrollRef.current) || !lastMessage) return false;\n const topDistance = lastMessage.getBoundingClientRect().top - scrollRef.current.getBoundingClientRect().top;\n // leave some space for user question\n return topDistance < 100;\n }, [\n scrollRef === null || scrollRef === void 0 ? void 0 : (_scrollRef_current = scrollRef.current) === null || _scrollRef_current === void 0 ? void 0 : _scrollRef_current.scrollHeight\n ]);\n const isTyping = userInput !== \"\";\n // if user is typing, should auto scroll to bottom\n // if user is not typing, should auto scroll to bottom only if already at bottom\n const { setAutoScroll, scrollDomToBottom } = useScrollToBottom(scrollRef, (isScrolledToBottom || isAttachWithTop) && !isTyping, session.messages);\n const [hitBottom, setHitBottom] = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)(true);\n const isMobileScreen = (0,_utils__WEBPACK_IMPORTED_MODULE_32__.useMobileScreen)();\n const navigate = (0,react_router_dom__WEBPACK_IMPORTED_MODULE_56__.useNavigate)();\n const [attachImages, setAttachImages] = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)([]);\n const [uploading, setUploading] = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)(false);\n // prompt hints\n const promptStore = (0,_store_prompt__WEBPACK_IMPORTED_MODULE_36__.usePromptStore)();\n const [promptHints, setPromptHints] = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)([]);\n const onSearch = (0,use_debounce__WEBPACK_IMPORTED_MODULE_58__.useDebouncedCallback)((text)=>{\n const matchedPrompts = promptStore.search(text);\n setPromptHints(matchedPrompts);\n }, 100, {\n leading: true,\n trailing: true\n });\n // auto grow input\n const [inputRows, setInputRows] = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)(2);\n const measure = (0,use_debounce__WEBPACK_IMPORTED_MODULE_58__.useDebouncedCallback)(()=>{\n const rows = inputRef.current ? (0,_utils__WEBPACK_IMPORTED_MODULE_32__.autoGrowTextArea)(inputRef.current) : 1;\n const inputRows = Math.min(20, Math.max(2 + Number(!isMobileScreen), rows));\n setInputRows(inputRows);\n }, 100, {\n leading: true,\n trailing: true\n });\n // eslint-disable-next-line react-hooks/exhaustive-deps\n (0,react__WEBPACK_IMPORTED_MODULE_1__.useEffect)(measure, [\n userInput\n ]);\n // chat commands shortcuts\n const chatCommands = (0,_command__WEBPACK_IMPORTED_MODULE_44__.useChatCommand)({\n new: ()=>chatStore.newSession(),\n newm: ()=>navigate(_constant__WEBPACK_IMPORTED_MODULE_40__.Path.NewChat),\n prev: ()=>chatStore.nextSession(-1),\n next: ()=>chatStore.nextSession(1),\n clear: ()=>chatStore.updateTargetSession(session, (session)=>session.clearContextIndex = session.messages.length),\n fork: ()=>chatStore.forkSession(),\n del: ()=>chatStore.deleteSession(chatStore.currentSessionIndex)\n });\n // only search prompts when user input is short\n const SEARCH_TEXT_LIMIT = 30;\n const onInput = (text)=>{\n setUserInput(text);\n const n = text.trim().length;\n // clear search results\n if (n === 0) {\n setPromptHints([]);\n } else if (text.match(_command__WEBPACK_IMPORTED_MODULE_44__.ChatCommandPrefix)) {\n setPromptHints(chatCommands.search(text));\n } else if (!config.disablePromptHint && n < SEARCH_TEXT_LIMIT) {\n // check if need to trigger auto completion\n if (text.startsWith(\"/\")) {\n let searchText = text.slice(1);\n onSearch(searchText);\n }\n }\n };\n const doSubmit = (userInput)=>{\n var _inputRef_current;\n if (userInput.trim() === \"\" && (0,_barrel_optimize_names_isEmpty_lodash_es__WEBPACK_IMPORTED_MODULE_59__[\"default\"])(attachImages)) return;\n const matchCommand = chatCommands.match(userInput);\n if (matchCommand.matched) {\n setUserInput(\"\");\n setPromptHints([]);\n matchCommand.invoke();\n return;\n }\n setIsLoading(true);\n chatStore.onUserInput(userInput, attachImages).then(()=>setIsLoading(false));\n setAttachImages([]);\n chatStore.setLastInput(userInput);\n setUserInput(\"\");\n setPromptHints([]);\n if (!isMobileScreen) (_inputRef_current = inputRef.current) === null || _inputRef_current === void 0 ? void 0 : _inputRef_current.focus();\n setAutoScroll(true);\n };\n const onPromptSelect = (prompt)=>{\n setTimeout(()=>{\n var _inputRef_current;\n setPromptHints([]);\n const matchedChatCommand = chatCommands.match(prompt.content);\n if (matchedChatCommand.matched) {\n // if user is selecting a chat command, just trigger it\n matchedChatCommand.invoke();\n setUserInput(\"\");\n } else {\n // or fill the prompt\n setUserInput(prompt.content);\n }\n (_inputRef_current = inputRef.current) === null || _inputRef_current === void 0 ? void 0 : _inputRef_current.focus();\n }, 30);\n };\n // stop response\n const onUserStop = (messageId)=>{\n _client_controller__WEBPACK_IMPORTED_MODULE_35__.ChatControllerPool.stop(session.id, messageId);\n };\n (0,react__WEBPACK_IMPORTED_MODULE_1__.useEffect)(()=>{\n chatStore.updateTargetSession(session, (session)=>{\n const stopTiming = Date.now() - _constant__WEBPACK_IMPORTED_MODULE_40__.REQUEST_TIMEOUT_MS;\n session.messages.forEach((m)=>{\n // check if should stop all stale messages\n if (m.isError || new Date(m.date).getTime() < stopTiming) {\n if (m.streaming) {\n m.streaming = false;\n }\n if (m.content.length === 0) {\n m.isError = true;\n m.content = (0,_utils_format__WEBPACK_IMPORTED_MODULE_45__.prettyObject)({\n error: true,\n message: \"empty response\"\n });\n }\n }\n });\n // auto sync mask config from global config\n if (session.mask.syncGlobalConfig) {\n console.log(\"[Mask] syncing from global, name = \", session.mask.name);\n session.mask.modelConfig = {\n ...config.modelConfig\n };\n }\n });\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [\n session\n ]);\n // check if should send message\n const onInputKeyDown = (e)=>{\n // if ArrowUp and no userInput, fill with last input\n if (e.key === \"ArrowUp\" && userInput.length <= 0 && !(e.metaKey || e.altKey || e.ctrlKey)) {\n var _chatStore_lastInput;\n setUserInput((_chatStore_lastInput = chatStore.lastInput) !== null && _chatStore_lastInput !== void 0 ? _chatStore_lastInput : \"\");\n e.preventDefault();\n return;\n }\n if (shouldSubmit(e) && promptHints.length === 0) {\n doSubmit(userInput);\n e.preventDefault();\n }\n };\n const onRightClick = (e, message)=>{\n // copy to clipboard\n if ((0,_utils__WEBPACK_IMPORTED_MODULE_32__.selectOrCopy)(e.currentTarget, (0,_utils__WEBPACK_IMPORTED_MODULE_32__.getMessageTextContent)(message))) {\n if (userInput.length === 0) {\n setUserInput((0,_utils__WEBPACK_IMPORTED_MODULE_32__.getMessageTextContent)(message));\n }\n e.preventDefault();\n }\n };\n const deleteMessage = (msgId)=>{\n chatStore.updateTargetSession(session, (session)=>session.messages = session.messages.filter((m)=>m.id !== msgId));\n };\n const onDelete = (msgId)=>{\n deleteMessage(msgId);\n };\n const onResend = (message)=>{\n var _inputRef_current;\n // when it is resending a message\n // 1. for a user's message, find the next bot response\n // 2. for a bot's message, find the last user's input\n // 3. delete original user input and bot's message\n // 4. resend the user's input\n const resendingIndex = session.messages.findIndex((m)=>m.id === message.id);\n if (resendingIndex < 0 || resendingIndex >= session.messages.length) {\n console.error(\"[Chat] failed to find resending message\", message);\n return;\n }\n let userMessage;\n let botMessage;\n if (message.role === \"assistant\") {\n // if it is resending a bot's message, find the user input for it\n botMessage = message;\n for(let i = resendingIndex; i >= 0; i -= 1){\n if (session.messages[i].role === \"user\") {\n userMessage = session.messages[i];\n break;\n }\n }\n } else if (message.role === \"user\") {\n // if it is resending a user's input, find the bot's response\n userMessage = message;\n for(let i = resendingIndex; i < session.messages.length; i += 1){\n if (session.messages[i].role === \"assistant\") {\n botMessage = session.messages[i];\n break;\n }\n }\n }\n if (userMessage === undefined) {\n console.error(\"[Chat] failed to resend\", message);\n return;\n }\n // delete the original messages\n deleteMessage(userMessage.id);\n deleteMessage(botMessage === null || botMessage === void 0 ? void 0 : botMessage.id);\n // resend the message\n setIsLoading(true);\n const textContent = (0,_utils__WEBPACK_IMPORTED_MODULE_32__.getMessageTextContent)(userMessage);\n const images = (0,_utils__WEBPACK_IMPORTED_MODULE_32__.getMessageImages)(userMessage);\n chatStore.onUserInput(textContent, images).then(()=>setIsLoading(false));\n (_inputRef_current = inputRef.current) === null || _inputRef_current === void 0 ? void 0 : _inputRef_current.focus();\n };\n const onPinMessage = (message)=>{\n chatStore.updateTargetSession(session, (session)=>session.mask.context.push(message));\n (0,_ui_lib__WEBPACK_IMPORTED_MODULE_39__.showToast)(_locales__WEBPACK_IMPORTED_MODULE_37__[\"default\"].Chat.Actions.PinToastContent, {\n text: _locales__WEBPACK_IMPORTED_MODULE_37__[\"default\"].Chat.Actions.PinToastAction,\n onClick: ()=>{\n setShowPromptModal(true);\n }\n });\n };\n const accessStore = (0,_store__WEBPACK_IMPORTED_MODULE_31__.useAccessStore)();\n const [speechStatus, setSpeechStatus] = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)(false);\n const [speechLoading, setSpeechLoading] = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)(false);\n async function openaiSpeech(text) {\n if (speechStatus) {\n ttsPlayer.stop();\n setSpeechStatus(false);\n } else {\n var api;\n api = new _client_api__WEBPACK_IMPORTED_MODULE_49__.ClientApi(_constant__WEBPACK_IMPORTED_MODULE_40__.ModelProvider.GPT);\n const config = _store__WEBPACK_IMPORTED_MODULE_31__.useAppConfig.getState();\n setSpeechLoading(true);\n ttsPlayer.init();\n let audioBuffer;\n const { markdownToTxt } = __webpack_require__(/*! markdown-to-txt */ \"(app-pages-browser)/./node_modules/markdown-to-txt/dist/markdown-to-txt.js\");\n const textContent = markdownToTxt(text);\n if (config.ttsConfig.engine !== _constant__WEBPACK_IMPORTED_MODULE_40__.DEFAULT_TTS_ENGINE) {\n const edgeVoiceName = accessStore.edgeVoiceName();\n const tts = new _utils_ms_edge_tts__WEBPACK_IMPORTED_MODULE_51__.MsEdgeTTS();\n await tts.setMetadata(edgeVoiceName, _utils_ms_edge_tts__WEBPACK_IMPORTED_MODULE_51__.OUTPUT_FORMAT.AUDIO_24KHZ_96KBITRATE_MONO_MP3);\n audioBuffer = await tts.toArrayBuffer(textContent);\n } else {\n audioBuffer = await api.llm.speech({\n model: config.ttsConfig.model,\n input: textContent,\n voice: config.ttsConfig.voice,\n speed: config.ttsConfig.speed\n });\n }\n setSpeechStatus(true);\n ttsPlayer.play(audioBuffer, ()=>{\n setSpeechStatus(false);\n }).catch((e)=>{\n console.error(\"[OpenAI Speech]\", e);\n (0,_ui_lib__WEBPACK_IMPORTED_MODULE_39__.showToast)((0,_utils_format__WEBPACK_IMPORTED_MODULE_45__.prettyObject)(e));\n setSpeechStatus(false);\n }).finally(()=>setSpeechLoading(false));\n }\n }\n const context = (0,react__WEBPACK_IMPORTED_MODULE_1__.useMemo)(()=>{\n return session.mask.hideContext ? [] : session.mask.context.slice();\n }, [\n session.mask.context,\n session.mask.hideContext\n ]);\n if (context.length === 0 && ((_session_messages_at = session.messages.at(0)) === null || _session_messages_at === void 0 ? void 0 : _session_messages_at.content) !== _store__WEBPACK_IMPORTED_MODULE_31__.BOT_HELLO.content) {\n const copiedHello = Object.assign({}, _store__WEBPACK_IMPORTED_MODULE_31__.BOT_HELLO);\n if (!accessStore.isAuthorized()) {\n copiedHello.content = _locales__WEBPACK_IMPORTED_MODULE_37__[\"default\"].Error.Unauthorized;\n }\n context.push(copiedHello);\n }\n // preview messages\n const renderMessages = (0,react__WEBPACK_IMPORTED_MODULE_1__.useMemo)(()=>{\n return context.concat(session.messages).concat(isLoading ? [\n {\n ...(0,_store__WEBPACK_IMPORTED_MODULE_31__.createMessage)({\n role: \"assistant\",\n content: \"……\"\n }),\n preview: true\n }\n ] : []).concat(userInput.length > 0 && config.sendPreviewBubble ? [\n {\n ...(0,_store__WEBPACK_IMPORTED_MODULE_31__.createMessage)({\n role: \"user\",\n content: userInput\n }),\n preview: true\n }\n ] : []);\n }, [\n config.sendPreviewBubble,\n context,\n isLoading,\n session.messages,\n userInput\n ]);\n const [msgRenderIndex, _setMsgRenderIndex] = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)(Math.max(0, renderMessages.length - _constant__WEBPACK_IMPORTED_MODULE_40__.CHAT_PAGE_SIZE));\n function setMsgRenderIndex(newIndex) {\n newIndex = Math.min(renderMessages.length - _constant__WEBPACK_IMPORTED_MODULE_40__.CHAT_PAGE_SIZE, newIndex);\n newIndex = Math.max(0, newIndex);\n _setMsgRenderIndex(newIndex);\n }\n const messages = (0,react__WEBPACK_IMPORTED_MODULE_1__.useMemo)(()=>{\n const endRenderIndex = Math.min(msgRenderIndex + 3 * _constant__WEBPACK_IMPORTED_MODULE_40__.CHAT_PAGE_SIZE, renderMessages.length);\n return renderMessages.slice(msgRenderIndex, endRenderIndex);\n }, [\n msgRenderIndex,\n renderMessages\n ]);\n const onChatBodyScroll = (e)=>{\n const bottomHeight = e.scrollTop + e.clientHeight;\n const edgeThreshold = e.clientHeight;\n const isTouchTopEdge = e.scrollTop <= edgeThreshold;\n const isTouchBottomEdge = bottomHeight >= e.scrollHeight - edgeThreshold;\n const isHitBottom = bottomHeight >= e.scrollHeight - (isMobileScreen ? 4 : 10);\n const prevPageMsgIndex = msgRenderIndex - _constant__WEBPACK_IMPORTED_MODULE_40__.CHAT_PAGE_SIZE;\n const nextPageMsgIndex = msgRenderIndex + _constant__WEBPACK_IMPORTED_MODULE_40__.CHAT_PAGE_SIZE;\n if (isTouchTopEdge && !isTouchBottomEdge) {\n setMsgRenderIndex(prevPageMsgIndex);\n } else if (isTouchBottomEdge) {\n setMsgRenderIndex(nextPageMsgIndex);\n }\n setHitBottom(isHitBottom);\n setAutoScroll(isHitBottom);\n };\n function scrollToBottom() {\n setMsgRenderIndex(renderMessages.length - _constant__WEBPACK_IMPORTED_MODULE_40__.CHAT_PAGE_SIZE);\n scrollDomToBottom();\n }\n var _session_clearContextIndex;\n // clear context index = context length + index in messages\n const clearContextIndex = ((_session_clearContextIndex = session.clearContextIndex) !== null && _session_clearContextIndex !== void 0 ? _session_clearContextIndex : -1) >= 0 ? session.clearContextIndex + context.length - msgRenderIndex : -1;\n const [showPromptModal, setShowPromptModal] = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)(false);\n const clientConfig = (0,react__WEBPACK_IMPORTED_MODULE_1__.useMemo)(()=>(0,_config_client__WEBPACK_IMPORTED_MODULE_47__.getClientConfig)(), []);\n const autoFocus = !isMobileScreen; // wont auto focus on mobile screen\n const showMaxIcon = !isMobileScreen && !(clientConfig === null || clientConfig === void 0 ? void 0 : clientConfig.isApp);\n (0,_command__WEBPACK_IMPORTED_MODULE_44__.useCommand)({\n fill: setUserInput,\n submit: (text)=>{\n doSubmit(text);\n },\n code: (text)=>{\n if (accessStore.disableFastLink) return;\n console.log(\"[Command] got code from url: \", text);\n (0,_ui_lib__WEBPACK_IMPORTED_MODULE_39__.showConfirm)(_locales__WEBPACK_IMPORTED_MODULE_37__[\"default\"].URLCommand.Code + \"code = \".concat(text)).then((res)=>{\n if (res) {\n accessStore.update((access)=>access.accessCode = text);\n }\n });\n },\n settings: (text)=>{\n if (accessStore.disableFastLink) return;\n try {\n const payload = JSON.parse(text);\n console.log(\"[Command] got settings from url: \", payload);\n if (payload.key || payload.url) {\n (0,_ui_lib__WEBPACK_IMPORTED_MODULE_39__.showConfirm)(_locales__WEBPACK_IMPORTED_MODULE_37__[\"default\"].URLCommand.Settings + \"\\n\".concat(JSON.stringify(payload, null, 4))).then((res)=>{\n if (!res) return;\n if (payload.key) {\n accessStore.update((access)=>access.openaiApiKey = payload.key);\n }\n if (payload.url) {\n accessStore.update((access)=>access.openaiUrl = payload.url);\n }\n accessStore.update((access)=>access.useCustomConfig = true);\n });\n }\n } catch (e) {\n console.error(\"[Command] failed to get settings from url: \", text);\n }\n }\n });\n // edit / insert message modal\n const [isEditingMessage, setIsEditingMessage] = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)(false);\n // remember unfinished input\n (0,react__WEBPACK_IMPORTED_MODULE_1__.useEffect)(()=>{\n // try to load from local storage\n const key = (0,_constant__WEBPACK_IMPORTED_MODULE_40__.UNFINISHED_INPUT)(session.id);\n const mayBeUnfinishedInput = localStorage.getItem(key);\n if (mayBeUnfinishedInput && userInput.length === 0) {\n setUserInput(mayBeUnfinishedInput);\n localStorage.removeItem(key);\n }\n const dom = inputRef.current;\n return ()=>{\n var _dom_value;\n localStorage.setItem(key, (_dom_value = dom === null || dom === void 0 ? void 0 : dom.value) !== null && _dom_value !== void 0 ? _dom_value : \"\");\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n const handlePaste = (0,react__WEBPACK_IMPORTED_MODULE_1__.useCallback)(async (event)=>{\n const currentModel = chatStore.currentSession().mask.modelConfig.model;\n if (!(0,_utils__WEBPACK_IMPORTED_MODULE_32__.isVisionModel)(currentModel)) {\n return;\n }\n const items = (event.clipboardData || window.clipboardData).items;\n for (const item of items){\n if (item.kind === \"file\" && item.type.startsWith(\"image/\")) {\n event.preventDefault();\n const file = item.getAsFile();\n if (file) {\n const images = [];\n images.push(...attachImages);\n images.push(...await new Promise((res, rej)=>{\n setUploading(true);\n const imagesData = [];\n (0,_app_utils_chat__WEBPACK_IMPORTED_MODULE_33__.uploadImage)(file).then((dataUrl)=>{\n imagesData.push(dataUrl);\n setUploading(false);\n res(imagesData);\n }).catch((e)=>{\n setUploading(false);\n rej(e);\n });\n }));\n const imagesLength = images.length;\n if (imagesLength > 3) {\n images.splice(3, imagesLength - 3);\n }\n setAttachImages(images);\n }\n }\n }\n }, [\n attachImages,\n chatStore\n ]);\n async function uploadImage() {\n const images = [];\n images.push(...attachImages);\n images.push(...await new Promise((res, rej)=>{\n const fileInput = document.createElement(\"input\");\n fileInput.type = \"file\";\n fileInput.accept = \"image/png, image/jpeg, image/webp, image/heic, image/heif\";\n fileInput.multiple = true;\n fileInput.onchange = (event)=>{\n setUploading(true);\n const files = event.target.files;\n const imagesData = [];\n for(let i = 0; i < files.length; i++){\n const file = event.target.files[i];\n (0,_app_utils_chat__WEBPACK_IMPORTED_MODULE_33__.uploadImage)(file).then((dataUrl)=>{\n imagesData.push(dataUrl);\n if (imagesData.length === 3 || imagesData.length === files.length) {\n setUploading(false);\n res(imagesData);\n }\n }).catch((e)=>{\n setUploading(false);\n rej(e);\n });\n }\n };\n fileInput.click();\n }));\n const imagesLength = images.length;\n if (imagesLength > 3) {\n images.splice(3, imagesLength - 3);\n }\n setAttachImages(images);\n }\n // 快捷键 shortcut keys\n const [showShortcutKeyModal, setShowShortcutKeyModal] = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)(false);\n (0,react__WEBPACK_IMPORTED_MODULE_1__.useEffect)(()=>{\n const handleKeyDown = (event)=>{\n // 打开新聊天 command + shift + o\n if ((event.metaKey || event.ctrlKey) && event.shiftKey && event.key.toLowerCase() === \"o\") {\n event.preventDefault();\n setTimeout(()=>{\n chatStore.newSession();\n navigate(_constant__WEBPACK_IMPORTED_MODULE_40__.Path.Chat);\n }, 10);\n } else if (event.shiftKey && event.key.toLowerCase() === \"escape\") {\n var _inputRef_current;\n event.preventDefault();\n (_inputRef_current = inputRef.current) === null || _inputRef_current === void 0 ? void 0 : _inputRef_current.focus();\n } else if ((event.metaKey || event.ctrlKey) && event.shiftKey && event.code === \"Semicolon\") {\n event.preventDefault();\n const copyCodeButton = document.querySelectorAll(\".copy-code-button\");\n if (copyCodeButton.length > 0) {\n copyCodeButton[copyCodeButton.length - 1].click();\n }\n } else if ((event.metaKey || event.ctrlKey) && event.shiftKey && event.key.toLowerCase() === \"c\") {\n event.preventDefault();\n const lastNonUserMessage = messages.filter((message)=>message.role !== \"user\").pop();\n if (lastNonUserMessage) {\n const lastMessageContent = (0,_utils__WEBPACK_IMPORTED_MODULE_32__.getMessageTextContent)(lastNonUserMessage);\n (0,_utils__WEBPACK_IMPORTED_MODULE_32__.copyToClipboard)(lastMessageContent);\n }\n } else if ((event.metaKey || event.ctrlKey) && event.key === \"/\") {\n event.preventDefault();\n setShowShortcutKeyModal(true);\n } else if ((event.metaKey || event.ctrlKey) && event.shiftKey && event.key.toLowerCase() === \"backspace\") {\n event.preventDefault();\n chatStore.updateTargetSession(session, (session)=>{\n if (session.clearContextIndex === session.messages.length) {\n session.clearContextIndex = undefined;\n } else {\n session.clearContextIndex = session.messages.length;\n session.memoryPrompt = \"\"; // will clear memory\n }\n });\n }\n };\n document.addEventListener(\"keydown\", handleKeyDown);\n return ()=>{\n document.removeEventListener(\"keydown\", handleKeyDown);\n };\n }, [\n messages,\n chatStore,\n navigate,\n session\n ]);\n const [showChatSidePanel, setShowChatSidePanel] = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)(false);\n return /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.Fragment, {\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: (_chat_module_scss__WEBPACK_IMPORTED_MODULE_57___default().chat),\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"window-header\",\n \"data-tauri-drag-region\": true,\n children: [\n isMobileScreen && /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"window-actions\",\n children: /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"window-action-button\",\n children: /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(_button__WEBPACK_IMPORTED_MODULE_38__.IconButton, {\n icon: /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(_icons_return_svg__WEBPACK_IMPORTED_MODULE_6__[\"default\"], {}, void 0, false, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 1638,\n columnNumber: 25\n }, void 0),\n bordered: true,\n title: _locales__WEBPACK_IMPORTED_MODULE_37__[\"default\"].Chat.Actions.ChatList,\n onClick: ()=>navigate(_constant__WEBPACK_IMPORTED_MODULE_40__.Path.Home)\n }, void 0, false, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 1637,\n columnNumber: 17\n }, this)\n }, void 0, false, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 1636,\n columnNumber: 15\n }, this)\n }, void 0, false, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 1635,\n columnNumber: 13\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: (0,clsx__WEBPACK_IMPORTED_MODULE_54__[\"default\"])(\"window-header-title\", (_chat_module_scss__WEBPACK_IMPORTED_MODULE_57___default()[\"chat-body-title\"])),\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: (0,clsx__WEBPACK_IMPORTED_MODULE_54__[\"default\"])(\"window-header-main-title\", (_chat_module_scss__WEBPACK_IMPORTED_MODULE_57___default()[\"chat-body-main-title\"])),\n onClickCapture: ()=>setIsEditingMessage(true),\n children: !session.topic ? _store__WEBPACK_IMPORTED_MODULE_31__.DEFAULT_TOPIC : session.topic\n }, void 0, false, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 1650,\n columnNumber: 13\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"window-header-sub-title\",\n children: _locales__WEBPACK_IMPORTED_MODULE_37__[\"default\"].Chat.SubTitle(session.messages.length)\n }, void 0, false, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 1659,\n columnNumber: 13\n }, this)\n ]\n }, void 0, true, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 1647,\n columnNumber: 11\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"window-actions\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"window-action-button\",\n children: /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(_button__WEBPACK_IMPORTED_MODULE_38__.IconButton, {\n icon: /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(_icons_reload_svg__WEBPACK_IMPORTED_MODULE_14__[\"default\"], {}, void 0, false, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 1666,\n columnNumber: 23\n }, void 0),\n bordered: true,\n title: _locales__WEBPACK_IMPORTED_MODULE_37__[\"default\"].Chat.Actions.RefreshTitle,\n onClick: ()=>{\n (0,_ui_lib__WEBPACK_IMPORTED_MODULE_39__.showToast)(_locales__WEBPACK_IMPORTED_MODULE_37__[\"default\"].Chat.Actions.RefreshToast);\n chatStore.summarizeSession(true, session);\n }\n }, void 0, false, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 1665,\n columnNumber: 15\n }, this)\n }, void 0, false, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 1664,\n columnNumber: 13\n }, this),\n !isMobileScreen && /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"window-action-button\",\n children: /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(_button__WEBPACK_IMPORTED_MODULE_38__.IconButton, {\n icon: /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(_icons_rename_svg__WEBPACK_IMPORTED_MODULE_4__[\"default\"], {}, void 0, false, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 1678,\n columnNumber: 25\n }, void 0),\n bordered: true,\n title: _locales__WEBPACK_IMPORTED_MODULE_37__[\"default\"].Chat.EditMessage.Title,\n aria: _locales__WEBPACK_IMPORTED_MODULE_37__[\"default\"].Chat.EditMessage.Title,\n onClick: ()=>setIsEditingMessage(true)\n }, void 0, false, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 1677,\n columnNumber: 17\n }, this)\n }, void 0, false, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 1676,\n columnNumber: 15\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"window-action-button\",\n children: /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(_button__WEBPACK_IMPORTED_MODULE_38__.IconButton, {\n icon: /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(_icons_share_svg__WEBPACK_IMPORTED_MODULE_5__[\"default\"], {}, void 0, false, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 1688,\n columnNumber: 23\n }, void 0),\n bordered: true,\n title: _locales__WEBPACK_IMPORTED_MODULE_37__[\"default\"].Chat.Actions.Export,\n onClick: ()=>{\n setShowExport(true);\n }\n }, void 0, false, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 1687,\n columnNumber: 15\n }, this)\n }, void 0, false, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 1686,\n columnNumber: 13\n }, this),\n showMaxIcon && /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"window-action-button\",\n children: /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(_button__WEBPACK_IMPORTED_MODULE_38__.IconButton, {\n icon: config.tightBorder ? /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(_icons_min_svg__WEBPACK_IMPORTED_MODULE_13__[\"default\"], {}, void 0, false, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 1699,\n columnNumber: 46\n }, void 0) : /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(_icons_max_svg__WEBPACK_IMPORTED_MODULE_12__[\"default\"], {}, void 0, false, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 1699,\n columnNumber: 60\n }, void 0),\n bordered: true,\n title: _locales__WEBPACK_IMPORTED_MODULE_37__[\"default\"].Chat.Actions.FullScreen,\n aria: _locales__WEBPACK_IMPORTED_MODULE_37__[\"default\"].Chat.Actions.FullScreen,\n onClick: ()=>{\n config.update((config)=>config.tightBorder = !config.tightBorder);\n }\n }, void 0, false, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 1698,\n columnNumber: 17\n }, this)\n }, void 0, false, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 1697,\n columnNumber: 15\n }, this)\n ]\n }, void 0, true, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 1663,\n columnNumber: 11\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(PromptToast, {\n showToast: !hitBottom,\n showModal: showPromptModal,\n setShowModal: setShowPromptModal\n }, void 0, false, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 1713,\n columnNumber: 11\n }, this)\n ]\n }, void 0, true, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 1633,\n columnNumber: 9\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: (_chat_module_scss__WEBPACK_IMPORTED_MODULE_57___default()[\"chat-main\"]),\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: (_chat_module_scss__WEBPACK_IMPORTED_MODULE_57___default()[\"chat-body-container\"]),\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: (_chat_module_scss__WEBPACK_IMPORTED_MODULE_57___default()[\"chat-body\"]),\n ref: scrollRef,\n onScroll: (e)=>onChatBodyScroll(e.currentTarget),\n onMouseDown: ()=>{\n var _inputRef_current;\n return (_inputRef_current = inputRef.current) === null || _inputRef_current === void 0 ? void 0 : _inputRef_current.blur();\n },\n onTouchStart: ()=>{\n var _inputRef_current;\n (_inputRef_current = inputRef.current) === null || _inputRef_current === void 0 ? void 0 : _inputRef_current.blur();\n setAutoScroll(false);\n },\n children: messages// TODO\n // .filter((m) => !m.isMcpResponse)\n .map((message, i)=>{\n var _message_tools, _message_tools1, _message_tools2;\n const isUser = message.role === \"user\";\n const isContext = i < context.length;\n const showActions = i > 0 && !(message.preview || message.content.length === 0) && !isContext;\n const showTyping = message.preview || message.streaming;\n const shouldShowClearContextDivider = i === clearContextIndex - 1;\n return /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(react__WEBPACK_IMPORTED_MODULE_1__.Fragment, {\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: isUser ? (_chat_module_scss__WEBPACK_IMPORTED_MODULE_57___default()[\"chat-message-user\"]) : (_chat_module_scss__WEBPACK_IMPORTED_MODULE_57___default()[\"chat-message\"]),\n children: /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: (_chat_module_scss__WEBPACK_IMPORTED_MODULE_57___default()[\"chat-message-container\"]),\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: (_chat_module_scss__WEBPACK_IMPORTED_MODULE_57___default()[\"chat-message-header\"]),\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: (_chat_module_scss__WEBPACK_IMPORTED_MODULE_57___default()[\"chat-message-avatar\"]),\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: (_chat_module_scss__WEBPACK_IMPORTED_MODULE_57___default()[\"chat-message-edit\"]),\n children: /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(_button__WEBPACK_IMPORTED_MODULE_38__.IconButton, {\n icon: /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(_icons_rename_svg__WEBPACK_IMPORTED_MODULE_4__[\"default\"], {}, void 0, false, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 1760,\n columnNumber: 41\n }, void 0),\n aria: _locales__WEBPACK_IMPORTED_MODULE_37__[\"default\"].Chat.Actions.Edit,\n onClick: async ()=>{\n const newMessage = await (0,_ui_lib__WEBPACK_IMPORTED_MODULE_39__.showPrompt)(_locales__WEBPACK_IMPORTED_MODULE_37__[\"default\"].Chat.Actions.Edit, (0,_utils__WEBPACK_IMPORTED_MODULE_32__.getMessageTextContent)(message), 10);\n let newContent = newMessage;\n const images = (0,_utils__WEBPACK_IMPORTED_MODULE_32__.getMessageImages)(message);\n if (images.length > 0) {\n newContent = [\n {\n type: \"text\",\n text: newMessage\n }\n ];\n for(let i = 0; i < images.length; i++){\n newContent.push({\n type: \"image_url\",\n image_url: {\n url: images[i]\n }\n });\n }\n }\n chatStore.updateTargetSession(session, (session)=>{\n const m = session.mask.context.concat(session.messages).find((m)=>m.id === message.id);\n if (m) {\n m.content = newContent;\n }\n });\n }\n }, void 0, false, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 1759,\n columnNumber: 33\n }, this)\n }, void 0, false, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 1758,\n columnNumber: 31\n }, this),\n isUser ? /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(_emoji__WEBPACK_IMPORTED_MODULE_41__.Avatar, {\n avatar: config.avatar\n }, void 0, false, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 1800,\n columnNumber: 33\n }, this) : /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.Fragment, {\n children: [\n \"system\"\n ].includes(message.role) ? /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(_emoji__WEBPACK_IMPORTED_MODULE_41__.Avatar, {\n avatar: \"2699-fe0f\"\n }, void 0, false, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 1804,\n columnNumber: 37\n }, this) : /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(_mask__WEBPACK_IMPORTED_MODULE_42__.MaskAvatar, {\n avatar: session.mask.avatar,\n model: message.model || session.mask.modelConfig.model\n }, void 0, false, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 1806,\n columnNumber: 37\n }, this)\n }, void 0, false)\n ]\n }, void 0, true, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 1757,\n columnNumber: 29\n }, this),\n !isUser && /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: (_chat_module_scss__WEBPACK_IMPORTED_MODULE_57___default()[\"chat-model-name\"]),\n children: message.model\n }, void 0, false, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 1818,\n columnNumber: 31\n }, this),\n showActions && /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: (_chat_module_scss__WEBPACK_IMPORTED_MODULE_57___default()[\"chat-message-actions\"]),\n children: /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: (_chat_module_scss__WEBPACK_IMPORTED_MODULE_57___default()[\"chat-input-actions\"]),\n children: message.streaming ? /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(ChatAction, {\n text: _locales__WEBPACK_IMPORTED_MODULE_37__[\"default\"].Chat.Actions.Stop,\n icon: /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(_icons_pause_svg__WEBPACK_IMPORTED_MODULE_23__[\"default\"], {}, void 0, false, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 1829,\n columnNumber: 45\n }, void 0),\n onClick: ()=>{\n var _message_id;\n return onUserStop((_message_id = message.id) !== null && _message_id !== void 0 ? _message_id : i);\n }\n }, void 0, false, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 1827,\n columnNumber: 37\n }, this) : /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.Fragment, {\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(ChatAction, {\n text: _locales__WEBPACK_IMPORTED_MODULE_37__[\"default\"].Chat.Actions.Retry,\n icon: /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(_icons_reload_svg__WEBPACK_IMPORTED_MODULE_14__[\"default\"], {}, void 0, false, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 1838,\n columnNumber: 47\n }, void 0),\n onClick: ()=>onResend(message)\n }, void 0, false, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 1836,\n columnNumber: 39\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(ChatAction, {\n text: _locales__WEBPACK_IMPORTED_MODULE_37__[\"default\"].Chat.Actions.Delete,\n icon: /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(_icons_clear_svg__WEBPACK_IMPORTED_MODULE_16__[\"default\"], {}, void 0, false, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 1844,\n columnNumber: 47\n }, void 0),\n onClick: ()=>{\n var _message_id;\n return onDelete((_message_id = message.id) !== null && _message_id !== void 0 ? _message_id : i);\n }\n }, void 0, false, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 1842,\n columnNumber: 39\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(ChatAction, {\n text: _locales__WEBPACK_IMPORTED_MODULE_37__[\"default\"].Chat.Actions.Pin,\n icon: /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(_icons_pin_svg__WEBPACK_IMPORTED_MODULE_17__[\"default\"], {}, void 0, false, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 1852,\n columnNumber: 47\n }, void 0),\n onClick: ()=>onPinMessage(message)\n }, void 0, false, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 1850,\n columnNumber: 39\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(ChatAction, {\n text: _locales__WEBPACK_IMPORTED_MODULE_37__[\"default\"].Chat.Actions.Copy,\n icon: /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(_icons_copy_svg__WEBPACK_IMPORTED_MODULE_7__[\"default\"], {}, void 0, false, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 1857,\n columnNumber: 47\n }, void 0),\n onClick: ()=>(0,_utils__WEBPACK_IMPORTED_MODULE_32__.copyToClipboard)((0,_utils__WEBPACK_IMPORTED_MODULE_32__.getMessageTextContent)(message))\n }, void 0, false, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 1855,\n columnNumber: 39\n }, this),\n config.ttsConfig.enable && /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(ChatAction, {\n text: speechStatus ? _locales__WEBPACK_IMPORTED_MODULE_37__[\"default\"].Chat.Actions.StopSpeech : _locales__WEBPACK_IMPORTED_MODULE_37__[\"default\"].Chat.Actions.Speech,\n icon: speechStatus ? /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(_icons_speak_stop_svg__WEBPACK_IMPORTED_MODULE_9__[\"default\"], {}, void 0, false, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 1873,\n columnNumber: 47\n }, void 0) : /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(_icons_speak_svg__WEBPACK_IMPORTED_MODULE_8__[\"default\"], {}, void 0, false, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 1875,\n columnNumber: 47\n }, void 0),\n onClick: ()=>openaiSpeech((0,_utils__WEBPACK_IMPORTED_MODULE_32__.getMessageTextContent)(message))\n }, void 0, false, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 1865,\n columnNumber: 41\n }, this)\n ]\n }, void 0, true)\n }, void 0, false, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 1825,\n columnNumber: 33\n }, this)\n }, void 0, false, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 1824,\n columnNumber: 31\n }, this)\n ]\n }, void 0, true, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 1756,\n columnNumber: 27\n }, this),\n (message === null || message === void 0 ? void 0 : (_message_tools = message.tools) === null || _message_tools === void 0 ? void 0 : _message_tools.length) == 0 && showTyping && /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: (_chat_module_scss__WEBPACK_IMPORTED_MODULE_57___default()[\"chat-message-status\"]),\n children: _locales__WEBPACK_IMPORTED_MODULE_37__[\"default\"].Chat.Typing\n }, void 0, false, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 1892,\n columnNumber: 29\n }, this),\n (message === null || message === void 0 ? void 0 : (_message_tools1 = message.tools) === null || _message_tools1 === void 0 ? void 0 : _message_tools1.length) > 0 && /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: (_chat_module_scss__WEBPACK_IMPORTED_MODULE_57___default()[\"chat-message-tools\"]),\n children: message === null || message === void 0 ? void 0 : (_message_tools2 = message.tools) === null || _message_tools2 === void 0 ? void 0 : _message_tools2.map((tool)=>{\n var _tool_function;\n return /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n title: tool === null || tool === void 0 ? void 0 : tool.errorMsg,\n className: (_chat_module_scss__WEBPACK_IMPORTED_MODULE_57___default()[\"chat-message-tool\"]),\n children: [\n tool.isError === false ? /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(_icons_confirm_svg__WEBPACK_IMPORTED_MODULE_18__[\"default\"], {}, void 0, false, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 1906,\n columnNumber: 37\n }, this) : tool.isError === true ? /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(_icons_close_svg__WEBPACK_IMPORTED_MODULE_19__[\"default\"], {}, void 0, false, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 1908,\n columnNumber: 37\n }, this) : /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(_icons_loading_svg__WEBPACK_IMPORTED_MODULE_11__[\"default\"], {}, void 0, false, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 1910,\n columnNumber: 37\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"span\", {\n children: tool === null || tool === void 0 ? void 0 : (_tool_function = tool.function) === null || _tool_function === void 0 ? void 0 : _tool_function.name\n }, void 0, false, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 1912,\n columnNumber: 35\n }, this)\n ]\n }, tool.id, true, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 1900,\n columnNumber: 33\n }, this);\n })\n }, void 0, false, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 1898,\n columnNumber: 29\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: (_chat_module_scss__WEBPACK_IMPORTED_MODULE_57___default()[\"chat-message-item\"]),\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(Markdown, {\n content: (0,_utils__WEBPACK_IMPORTED_MODULE_32__.getMessageTextContent)(message),\n loading: (message.preview || message.streaming) && message.content.length === 0 && !isUser,\n // onContextMenu={(e) => onRightClick(e, message)} // hard to use\n onDoubleClickCapture: ()=>{\n if (!isMobileScreen) return;\n setUserInput((0,_utils__WEBPACK_IMPORTED_MODULE_32__.getMessageTextContent)(message));\n },\n fontSize: fontSize,\n fontFamily: fontFamily,\n parentRef: scrollRef,\n defaultShow: i >= messages.length - 6\n }, message.streaming ? \"loading\" : \"done\", false, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 1918,\n columnNumber: 29\n }, this),\n (0,_utils__WEBPACK_IMPORTED_MODULE_32__.getMessageImages)(message).length == 1 && /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"img\", {\n className: (_chat_module_scss__WEBPACK_IMPORTED_MODULE_57___default()[\"chat-message-item-image\"]),\n src: (0,_utils__WEBPACK_IMPORTED_MODULE_32__.getMessageImages)(message)[0],\n alt: \"\"\n }, void 0, false, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 1937,\n columnNumber: 31\n }, this),\n (0,_utils__WEBPACK_IMPORTED_MODULE_32__.getMessageImages)(message).length > 1 && /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: (_chat_module_scss__WEBPACK_IMPORTED_MODULE_57___default()[\"chat-message-item-images\"]),\n style: {\n \"--image-count\": (0,_utils__WEBPACK_IMPORTED_MODULE_32__.getMessageImages)(message).length\n },\n children: (0,_utils__WEBPACK_IMPORTED_MODULE_32__.getMessageImages)(message).map((image, index)=>{\n return /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"img\", {\n className: (_chat_module_scss__WEBPACK_IMPORTED_MODULE_57___default()[\"chat-message-item-image-multi\"]),\n src: image,\n alt: \"\"\n }, index, false, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 1956,\n columnNumber: 39\n }, this);\n })\n }, void 0, false, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 1944,\n columnNumber: 31\n }, this)\n ]\n }, void 0, true, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 1917,\n columnNumber: 27\n }, this),\n (message === null || message === void 0 ? void 0 : message.audio_url) && /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: (_chat_module_scss__WEBPACK_IMPORTED_MODULE_57___default()[\"chat-message-audio\"]),\n children: /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"audio\", {\n src: message.audio_url,\n controls: true\n }, void 0, false, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 1974,\n columnNumber: 31\n }, this)\n }, void 0, false, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 1973,\n columnNumber: 29\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: (_chat_module_scss__WEBPACK_IMPORTED_MODULE_57___default()[\"chat-message-action-date\"]),\n children: isContext ? _locales__WEBPACK_IMPORTED_MODULE_37__[\"default\"].Chat.IsContext : message.date.toLocaleString()\n }, void 0, false, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 1978,\n columnNumber: 27\n }, this)\n ]\n }, void 0, true, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 1755,\n columnNumber: 25\n }, this)\n }, void 0, false, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 1748,\n columnNumber: 23\n }, this),\n shouldShowClearContextDivider && /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(ClearContextDivider, {}, void 0, false, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 1985,\n columnNumber: 57\n }, this)\n ]\n }, message.id, true, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 1747,\n columnNumber: 21\n }, this);\n })\n }, void 0, false, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 1721,\n columnNumber: 13\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: (_chat_module_scss__WEBPACK_IMPORTED_MODULE_57___default()[\"chat-input-panel\"]),\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(PromptHints, {\n prompts: promptHints,\n onPromptSelect: onPromptSelect\n }, void 0, false, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 1991,\n columnNumber: 15\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(ChatActions, {\n uploadImage: uploadImage,\n setAttachImages: setAttachImages,\n setUploading: setUploading,\n showPromptModal: ()=>setShowPromptModal(true),\n scrollToBottom: scrollToBottom,\n hitBottom: hitBottom,\n uploading: uploading,\n showPromptHints: ()=>{\n var _inputRef_current;\n // Click again to close\n if (promptHints.length > 0) {\n setPromptHints([]);\n return;\n }\n (_inputRef_current = inputRef.current) === null || _inputRef_current === void 0 ? void 0 : _inputRef_current.focus();\n setUserInput(\"/\");\n onSearch(\"\");\n },\n setShowShortcutKeyModal: setShowShortcutKeyModal,\n setUserInput: setUserInput,\n setShowChatSidePanel: setShowChatSidePanel\n }, void 0, false, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 1996,\n columnNumber: 15\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"label\", {\n className: (0,clsx__WEBPACK_IMPORTED_MODULE_54__[\"default\"])((_chat_module_scss__WEBPACK_IMPORTED_MODULE_57___default()[\"chat-input-panel-inner\"]), {\n [(_chat_module_scss__WEBPACK_IMPORTED_MODULE_57___default()[\"chat-input-panel-inner-attach\"])]: attachImages.length !== 0\n }),\n htmlFor: \"chat-input\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"textarea\", {\n id: \"chat-input\",\n ref: inputRef,\n className: (_chat_module_scss__WEBPACK_IMPORTED_MODULE_57___default()[\"chat-input\"]),\n placeholder: _locales__WEBPACK_IMPORTED_MODULE_37__[\"default\"].Chat.Input(submitKey),\n onInput: (e)=>onInput(e.currentTarget.value),\n value: userInput,\n onKeyDown: onInputKeyDown,\n onFocus: scrollToBottom,\n onClick: scrollToBottom,\n onPaste: handlePaste,\n rows: inputRows,\n autoFocus: autoFocus,\n style: {\n fontSize: config.fontSize,\n fontFamily: config.fontFamily\n }\n }, void 0, false, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 2026,\n columnNumber: 17\n }, this),\n attachImages.length != 0 && /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: (_chat_module_scss__WEBPACK_IMPORTED_MODULE_57___default()[\"attach-images\"]),\n children: attachImages.map((image, index)=>{\n return /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: (_chat_module_scss__WEBPACK_IMPORTED_MODULE_57___default()[\"attach-image\"]),\n style: {\n backgroundImage: 'url(\"'.concat(image, '\")')\n },\n children: /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: (_chat_module_scss__WEBPACK_IMPORTED_MODULE_57___default()[\"attach-image-mask\"]),\n children: /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(DeleteImageButton, {\n deleteImage: ()=>{\n setAttachImages(attachImages.filter((_, i)=>i !== index));\n }\n }, void 0, false, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 2054,\n columnNumber: 29\n }, this)\n }, void 0, false, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 2053,\n columnNumber: 27\n }, this)\n }, index, false, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 2048,\n columnNumber: 25\n }, this);\n })\n }, void 0, false, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 2045,\n columnNumber: 19\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(_button__WEBPACK_IMPORTED_MODULE_38__.IconButton, {\n icon: /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(_icons_send_white_svg__WEBPACK_IMPORTED_MODULE_2__[\"default\"], {}, void 0, false, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 2068,\n columnNumber: 25\n }, void 0),\n text: _locales__WEBPACK_IMPORTED_MODULE_37__[\"default\"].Chat.Send,\n className: (_chat_module_scss__WEBPACK_IMPORTED_MODULE_57___default()[\"chat-input-send\"]),\n type: \"primary\",\n onClick: ()=>doSubmit(userInput)\n }, void 0, false, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 2067,\n columnNumber: 17\n }, this)\n ]\n }, void 0, true, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 2019,\n columnNumber: 15\n }, this)\n ]\n }, void 0, true, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 1990,\n columnNumber: 13\n }, this)\n ]\n }, void 0, true, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 1720,\n columnNumber: 11\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: (0,clsx__WEBPACK_IMPORTED_MODULE_54__[\"default\"])((_chat_module_scss__WEBPACK_IMPORTED_MODULE_57___default()[\"chat-side-panel\"]), {\n [(_chat_module_scss__WEBPACK_IMPORTED_MODULE_57___default().mobile)]: isMobileScreen,\n [(_chat_module_scss__WEBPACK_IMPORTED_MODULE_57___default()[\"chat-side-panel-show\"])]: showChatSidePanel\n }),\n children: showChatSidePanel && /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(_app_components_realtime_chat__WEBPACK_IMPORTED_MODULE_53__.RealtimeChat, {\n onClose: ()=>{\n setShowChatSidePanel(false);\n },\n onStartVoice: async ()=>{\n console.log(\"start voice\");\n }\n }, void 0, false, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 2084,\n columnNumber: 15\n }, this)\n }, void 0, false, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 2077,\n columnNumber: 11\n }, this)\n ]\n }, void 0, true, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 1719,\n columnNumber: 9\n }, this)\n ]\n }, session.id, true, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 1632,\n columnNumber: 7\n }, this),\n showExport && /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(_exporter__WEBPACK_IMPORTED_MODULE_46__.ExportMessageModal, {\n onClose: ()=>setShowExport(false)\n }, void 0, false, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 2097,\n columnNumber: 9\n }, this),\n isEditingMessage && /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(EditMessageModal, {\n onClose: ()=>{\n setIsEditingMessage(false);\n }\n }, void 0, false, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 2101,\n columnNumber: 9\n }, this),\n showShortcutKeyModal && /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(ShortcutKeyModal, {\n onClose: ()=>setShowShortcutKeyModal(false)\n }, void 0, false, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 2109,\n columnNumber: 9\n }, this)\n ]\n }, void 0, true);\n}\n_s10(_Chat, \"l8awPbehI2cJMzYrqPhf7FG0hns=\", false, function() {\n return [\n _store__WEBPACK_IMPORTED_MODULE_31__.useChatStore,\n _store__WEBPACK_IMPORTED_MODULE_31__.useAppConfig,\n useSubmitHandler,\n useScrollToBottom,\n _utils__WEBPACK_IMPORTED_MODULE_32__.useMobileScreen,\n react_router_dom__WEBPACK_IMPORTED_MODULE_56__.useNavigate,\n _store_prompt__WEBPACK_IMPORTED_MODULE_36__.usePromptStore,\n use_debounce__WEBPACK_IMPORTED_MODULE_58__.useDebouncedCallback,\n use_debounce__WEBPACK_IMPORTED_MODULE_58__.useDebouncedCallback,\n _command__WEBPACK_IMPORTED_MODULE_44__.useChatCommand,\n _store__WEBPACK_IMPORTED_MODULE_31__.useAccessStore,\n _command__WEBPACK_IMPORTED_MODULE_44__.useCommand\n ];\n});\nfunction Chat() {\n _s11();\n const chatStore = (0,_store__WEBPACK_IMPORTED_MODULE_31__.useChatStore)();\n const session = chatStore.currentSession();\n return /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(_Chat, {}, session.id, false, {\n fileName: \"D:\\\\NextChatCD\\\\app\\\\components\\\\chat.tsx\",\n lineNumber: 2118,\n columnNumber: 10\n }, this);\n}\n_s11(Chat, \"VEZRjRiHFhGEe/E6z12rT6r9BBA=\", false, function() {\n return [\n _store__WEBPACK_IMPORTED_MODULE_31__.useChatStore\n ];\n});\n_c11 = Chat;\nvar _c, _c1, _c2, _c3, _c4, _c5, _c6, _c7, _c8, _c9, _c10, _c11;\n$RefreshReg$(_c, \"Markdown\");\n$RefreshReg$(_c1, \"MCPAction\");\n$RefreshReg$(_c2, \"SessionConfigModel\");\n$RefreshReg$(_c3, \"PromptToast\");\n$RefreshReg$(_c4, \"PromptHints\");\n$RefreshReg$(_c5, \"ClearContextDivider\");\n$RefreshReg$(_c6, \"ChatAction\");\n$RefreshReg$(_c7, \"ChatActions\");\n$RefreshReg$(_c8, \"EditMessageModal\");\n$RefreshReg$(_c9, \"DeleteImageButton\");\n$RefreshReg$(_c10, \"ShortcutKeyModal\");\n$RefreshReg$(_c11, \"Chat\");\n\n\n;\n // Wrapped in an IIFE to avoid polluting the global scope\n ;\n (function () {\n var _a, _b;\n // Legacy CSS implementations will `eval` browser code in a Node.js context\n // to extract CSS. For backwards compatibility, we need to check we're in a\n // browser context before continuing.\n if (typeof self !== 'undefined' &&\n // AMP / No-JS mode does not inject these helpers:\n '$RefreshHelpers$' in self) {\n // @ts-ignore __webpack_module__ is global\n var currentExports = module.exports;\n // @ts-ignore __webpack_module__ is global\n var prevSignature = (_b = (_a = module.hot.data) === null || _a === void 0 ? void 0 : _a.prevSignature) !== null && _b !== void 0 ? _b : null;\n // This cannot happen in MainTemplate because the exports mismatch between\n // templating and execution.\n self.$RefreshHelpers$.registerExportsForReactRefresh(currentExports, module.id);\n // A module can be accepted automatically based on its exports, e.g. when\n // it is a Refresh Boundary.\n if (self.$RefreshHelpers$.isReactRefreshBoundary(currentExports)) {\n // Save the previous exports signature on update so we can compare the boundary\n // signatures. We avoid saving exports themselves since it causes memory leaks (https://github.com/vercel/next.js/pull/53797)\n module.hot.dispose(function (data) {\n data.prevSignature =\n self.$RefreshHelpers$.getRefreshBoundarySignature(currentExports);\n });\n // Unconditionally accept an update to this module, we'll check if it's\n // still a Refresh Boundary later.\n // @ts-ignore importMeta is replaced in the loader\n module.hot.accept();\n // This field is set when the previous version of this module was a\n // Refresh Boundary, letting us know we need to check for invalidation or\n // enqueue an update.\n if (prevSignature !== null) {\n // A boundary can become ineligible if its exports are incompatible\n // with the previous exports.\n //\n // For example, if you add/remove/change exports, we'll want to\n // re-execute the importing modules, and force those components to\n // re-render. Similarly, if you convert a class component to a\n // function, we want to invalidate the boundary.\n if (self.$RefreshHelpers$.shouldInvalidateReactRefreshBoundary(prevSignature, self.$RefreshHelpers$.getRefreshBoundarySignature(currentExports))) {\n module.hot.invalidate();\n }\n else {\n self.$RefreshHelpers$.scheduleUpdate();\n }\n }\n }\n else {\n // Since we just executed the code for the module, it's possible that the\n // new exports made it ineligible for being a boundary.\n // We only care about the case when we were _previously_ a boundary,\n // because we already accepted this update (accidental side effect).\n var isNoLongerABoundary = prevSignature !== null;\n if (isNoLongerABoundary) {\n module.hot.invalidate();\n }\n }\n }\n })();\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL2FwcC9jb21wb25lbnRzL2NoYXQudHN4IiwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFvRDtBQVNyQztBQUVxQztBQUNUO0FBQ0U7QUFDRjtBQUNDO0FBQ0M7QUFDSjtBQUNFO0FBQ1M7QUFDRjtBQUNHO0FBR2Q7QUFDQTtBQUNLO0FBQ0M7QUFFUztBQUNWO0FBQ0w7QUFDUTtBQUNKO0FBQ0U7QUFDRjtBQUtFO0FBQ0g7QUFDQztBQUNGO0FBQ0M7QUFDRztBQUNBO0FBRUQ7QUFDTztBQWFqQztBQWVBO0FBRWtEO0FBRWpDO0FBRXVCO0FBRUQ7QUFDekI7QUFFTTtBQUNFO0FBVXRCO0FBQzZCO0FBUzFCO0FBQ1k7QUFDK0I7QUFDbkI7QUFDOEI7QUFDNUI7QUFDQztBQUNHO0FBQ0w7QUFDZTtBQUNaO0FBQ2U7QUFFNUI7QUFDYztBQUNZO0FBQ3RDO0FBQ2dEO0FBRXhFLE1BQU15RyxlQUFlbkQseURBQWdCQTtBQUVyQyxNQUFNb0QsWUFBWVYsOERBQWVBO0FBRWpDLE1BQU1XLFdBQVc3Qyx5REFBT0EsQ0FBQyxVQUFZLENBQUMsTUFBTSxrTkFBbUIsRUFBRzZDLFFBQVE7Ozs7OztJQUN4RUMsU0FBUyxrQkFBTSw4REFBQzNGLDhEQUFXQTs7Ozs7O0tBRHZCMEY7QUFJTixNQUFNRSxZQUFZOztJQUNoQixNQUFNQyxXQUFXbkMsOERBQVdBO0lBQzVCLE1BQU0sQ0FBQ29DLE9BQU9DLFNBQVMsR0FBR3pHLCtDQUFRQSxDQUFTO0lBQzNDLE1BQU0sQ0FBQzBHLFlBQVlDLGNBQWMsR0FBRzNHLCtDQUFRQSxDQUFDO0lBRTdDSCxnREFBU0EsQ0FBQztRQUNSLE1BQU0rRyxpQkFBaUI7WUFDckIsTUFBTUMsVUFBVSxNQUFNWiwyREFBWUE7WUFDbENVLGNBQWNFO1lBQ2QsSUFBSUEsU0FBUztnQkFDWCxNQUFNTCxRQUFR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PzhkNjIiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgdXNlRGVib3VuY2VkQ2FsbGJhY2sgfSBmcm9tIFwidXNlLWRlYm91bmNlXCI7XHJcbmltcG9ydCBSZWFjdCwge1xyXG4gIEZyYWdtZW50LFxyXG4gIFJlZk9iamVjdCxcclxuICB1c2VDYWxsYmFjayxcclxuICB1c2VFZmZlY3QsXHJcbiAgdXNlTWVtbyxcclxuICB1c2VSZWYsXHJcbiAgdXNlU3RhdGUsXHJcbn0gZnJvbSBcInJlYWN0XCI7XHJcblxyXG5pbXBvcnQgU2VuZFdoaXRlSWNvbiBmcm9tIFwiLi4vaWNvbnMvc2VuZC13aGl0ZS5zdmdcIjtcclxuaW1wb3J0IEJyYWluSWNvbiBmcm9tIFwiLi4vaWNvbnMvYnJhaW4uc3ZnXCI7XHJcbmltcG9ydCBSZW5hbWVJY29uIGZyb20gXCIuLi9pY29ucy9yZW5hbWUuc3ZnXCI7XHJcbmltcG9ydCBFZGl0SWNvbiBmcm9tIFwiLi4vaWNvbnMvcmVuYW1lLnN2Z1wiO1xyXG5pbXBvcnQgRXhwb3J0SWNvbiBmcm9tIFwiLi4vaWNvbnMvc2hhcmUuc3ZnXCI7XHJcbmltcG9ydCBSZXR1cm5JY29uIGZyb20gXCIuLi9pY29ucy9yZXR1cm4uc3ZnXCI7XHJcbmltcG9ydCBDb3B5SWNvbiBmcm9tIFwiLi4vaWNvbnMvY29weS5zdmdcIjtcclxuaW1wb3J0IFNwZWFrSWNvbiBmcm9tIFwiLi4vaWNvbnMvc3BlYWsuc3ZnXCI7XHJcbmltcG9ydCBTcGVha1N0b3BJY29uIGZyb20gXCIuLi9pY29ucy9zcGVhay1zdG9wLnN2Z1wiO1xyXG5pbXBvcnQgTG9hZGluZ0ljb24gZnJvbSBcIi4uL2ljb25zL3RocmVlLWRvdHMuc3ZnXCI7XHJcbmltcG9ydCBMb2FkaW5nQnV0dG9uSWNvbiBmcm9tIFwiLi4vaWNvbnMvbG9hZGluZy5zdmdcIjtcclxuaW1wb3J0IFByb21wdEljb24gZnJvbSBcIi4uL2ljb25zL3Byb21wdC5zdmdcIjtcclxuaW1wb3J0IE1hc2tJY29uIGZyb20gXCIuLi9pY29ucy9tYXNrLnN2Z1wiO1xyXG5pbXBvcnQgTWF4SWNvbiBmcm9tIFwiLi4vaWNvbnMvbWF4LnN2Z1wiO1xyXG5pbXBvcnQgTWluSWNvbiBmcm9tIFwiLi4vaWNvbnMvbWluLnN2Z1wiO1xyXG5pbXBvcnQgUmVzZXRJY29uIGZyb20gXCIuLi9pY29ucy9yZWxvYWQuc3ZnXCI7XHJcbmltcG9ydCBSZWxvYWRJY29uIGZyb20gXCIuLi9pY29ucy9yZWxvYWQuc3ZnXCI7XHJcbmltcG9ydCBCcmVha0ljb24gZnJvbSBcIi4uL2ljb25zL2JyZWFrLnN2Z1wiO1xyXG5pbXBvcnQgU2V0dGluZ3NJY29uIGZyb20gXCIuLi9pY29ucy9jaGF0LXNldHRpbmdzLnN2Z1wiO1xyXG5pbXBvcnQgRGVsZXRlSWNvbiBmcm9tIFwiLi4vaWNvbnMvY2xlYXIuc3ZnXCI7XHJcbmltcG9ydCBQaW5JY29uIGZyb20gXCIuLi9pY29ucy9waW4uc3ZnXCI7XHJcbmltcG9ydCBDb25maXJtSWNvbiBmcm9tIFwiLi4vaWNvbnMvY29uZmlybS5zdmdcIjtcclxuaW1wb3J0IENsb3NlSWNvbiBmcm9tIFwiLi4vaWNvbnMvY2xvc2Uuc3ZnXCI7XHJcbmltcG9ydCBDYW5jZWxJY29uIGZyb20gXCIuLi9pY29ucy9jYW5jZWwuc3ZnXCI7XHJcbmltcG9ydCBJbWFnZUljb24gZnJvbSBcIi4uL2ljb25zL2ltYWdlLnN2Z1wiO1xyXG5cclxuaW1wb3J0IExpZ2h0SWNvbiBmcm9tIFwiLi4vaWNvbnMvbGlnaHQuc3ZnXCI7XHJcbmltcG9ydCBEYXJrSWNvbiBmcm9tIFwiLi4vaWNvbnMvZGFyay5zdmdcIjtcclxuaW1wb3J0IEF1dG9JY29uIGZyb20gXCIuLi9pY29ucy9hdXRvLnN2Z1wiO1xyXG5pbXBvcnQgQm90dG9tSWNvbiBmcm9tIFwiLi4vaWNvbnMvYm90dG9tLnN2Z1wiO1xyXG5pbXBvcnQgU3RvcEljb24gZnJvbSBcIi4uL2ljb25zL3BhdXNlLnN2Z1wiO1xyXG5pbXBvcnQgUm9ib3RJY29uIGZyb20gXCIuLi9pY29ucy9yb2JvdC5zdmdcIjtcclxuaW1wb3J0IFNpemVJY29uIGZyb20gXCIuLi9pY29ucy9zaXplLnN2Z1wiO1xyXG5pbXBvcnQgUXVhbGl0eUljb24gZnJvbSBcIi4uL2ljb25zL2hkLnN2Z1wiO1xyXG5pbXBvcnQgU3R5bGVJY29uIGZyb20gXCIuLi9pY29ucy9wYWxldHRlLnN2Z1wiO1xyXG5pbXBvcnQgUGx1Z2luSWNvbiBmcm9tIFwiLi4vaWNvbnMvcGx1Z2luLnN2Z1wiO1xyXG5pbXBvcnQgU2hvcnRjdXRrZXlJY29uIGZyb20gXCIuLi9pY29ucy9zaG9ydGN1dGtleS5zdmdcIjtcclxuaW1wb3J0IE1jcFRvb2xJY29uIGZyb20gXCIuLi9pY29ucy90b29sLnN2Z1wiO1xyXG5pbXBvcnQgSGVhZHBob25lSWNvbiBmcm9tIFwiLi4vaWNvbnMvaGVhZHBob25lLnN2Z1wiO1xyXG5pbXBvcnQge1xyXG4gIEJPVF9IRUxMTyxcclxuICBDaGF0TWVzc2FnZSxcclxuICBjcmVhdGVNZXNzYWdlLFxyXG4gIERFRkFVTFRfVE9QSUMsXHJcbiAgTW9kZWxUeXBlLFxyXG4gIFN1Ym1pdEtleSxcclxuICBUaGVtZSxcclxuICB1c2VBY2Nlc3NTdG9yZSxcclxuICB1c2VBcHBDb25maWcsXHJcbiAgdXNlQ2hhdFN0b3JlLFxyXG4gIHVzZVBsdWdpblN0b3JlLFxyXG59IGZyb20gXCIuLi9zdG9yZVwiO1xyXG5cclxuaW1wb3J0IHtcclxuICBhdXRvR3Jvd1RleHRBcmVhLFxyXG4gIGNvcHlUb0NsaXBib2FyZCxcclxuICBnZXRNZXNzYWdlSW1hZ2VzLFxyXG4gIGdldE1lc3NhZ2VUZXh0Q29udGVudCxcclxuICBpc0RhbGxlMyxcclxuICBpc1Zpc2lvbk1vZGVsLFxyXG4gIHNhZmVMb2NhbFN0b3JhZ2UsXHJcbiAgZ2V0TW9kZWxTaXplcyxcclxuICBzdXBwb3J0c0N1c3RvbVNpemUsXHJcbiAgdXNlTW9iaWxlU2NyZWVuLFxyXG4gIHNlbGVjdE9yQ29weSxcclxuICBzaG93UGx1Z2lucyxcclxufSBmcm9tIFwiLi4vdXRpbHNcIjtcclxuXHJcbmltcG9ydCB7IHVwbG9hZEltYWdlIGFzIHVwbG9hZEltYWdlUmVtb3RlIH0gZnJvbSBcIkAvYXBwL3V0aWxzL2NoYXRcIjtcclxuXHJcbmltcG9ydCBkeW5hbWljIGZyb20gXCJuZXh0L2R5bmFtaWNcIjtcclxuXHJcbmltcG9ydCB7IENoYXRDb250cm9sbGVyUG9vbCB9IGZyb20gXCIuLi9jbGllbnQvY29udHJvbGxlclwiO1xyXG5pbXBvcnQgeyBEYWxsZVF1YWxpdHksIERhbGxlU3R5bGUsIE1vZGVsU2l6ZSB9IGZyb20gXCIuLi90eXBpbmdcIjtcclxuaW1wb3J0IHsgUHJvbXB0LCB1c2VQcm9tcHRTdG9yZSB9IGZyb20gXCIuLi9zdG9yZS9wcm9tcHRcIjtcclxuaW1wb3J0IExvY2FsZSBmcm9tIFwiLi4vbG9jYWxlc1wiO1xyXG5cclxuaW1wb3J0IHsgSWNvbkJ1dHRvbiB9IGZyb20gXCIuL2J1dHRvblwiO1xyXG5pbXBvcnQgc3R5bGVzIGZyb20gXCIuL2NoYXQubW9kdWxlLnNjc3NcIjtcclxuXHJcbmltcG9ydCB7XHJcbiAgTGlzdCxcclxuICBMaXN0SXRlbSxcclxuICBNb2RhbCxcclxuICBTZWxlY3RvcixcclxuICBzaG93Q29uZmlybSxcclxuICBzaG93UHJvbXB0LFxyXG4gIHNob3dUb2FzdCxcclxufSBmcm9tIFwiLi91aS1saWJcIjtcclxuaW1wb3J0IHsgdXNlTmF2aWdhdGUgfSBmcm9tIFwicmVhY3Qtcm91dGVyLWRvbVwiO1xyXG5pbXBvcnQge1xyXG4gIENIQVRfUEFHRV9TSVpFLFxyXG4gIERFRkFVTFRfVFRTX0VOR0lORSxcclxuICBNb2RlbFByb3ZpZGVyLFxyXG4gIFBhdGgsXHJcbiAgUkVRVUVTVF9USU1FT1VUX01TLFxyXG4gIFNlcnZpY2VQcm92aWRlcixcclxuICBVTkZJTklTSEVEX0lOUFVULFxyXG59IGZyb20gXCIuLi9jb25zdGFudFwiO1xyXG5pbXBvcnQgeyBBdmF0YXIgfSBmcm9tIFwiLi9lbW9qaVwiO1xyXG5pbXBvcnQgeyBDb250ZXh0UHJvbXB0cywgTWFza0F2YXRhciwgTWFza0NvbmZpZyB9IGZyb20gXCIuL21hc2tcIjtcclxuaW1wb3J0IHsgdXNlTWFza1N0b3JlIH0gZnJvbSBcIi4uL3N0b3JlL21hc2tcIjtcclxuaW1wb3J0IHsgQ2hhdENvbW1hbmRQcmVmaXgsIHVzZUNoYXRDb21tYW5kLCB1c2VDb21tYW5kIH0gZnJvbSBcIi4uL2NvbW1hbmRcIjtcclxuaW1wb3J0IHsgcHJldHR5T2JqZWN0IH0gZnJvbSBcIi4uL3V0aWxzL2Zvcm1hdFwiO1xyXG5pbXBvcnQgeyBFeHBvcnRNZXNzYWdlTW9kYWwgfSBmcm9tIFwiLi9leHBvcnRlclwiO1xyXG5pbXBvcnQgeyBnZXRDbGllbnRDb25maWcgfSBmcm9tIFwiLi4vY29uZmlnL2NsaWVudFwiO1xyXG5pbXBvcnQgeyB1c2VBbGxNb2RlbHMgfSBmcm9tIFwiLi4vdXRpbHMvaG9va3NcIjtcclxuaW1wb3J0IHsgQ2xpZW50QXBpLCBNdWx0aW1vZGFsQ29udGVudCB9IGZyb20gXCIuLi9jbGllbnQvYXBpXCI7XHJcbmltcG9ydCB7IGNyZWF0ZVRUU1BsYXllciB9IGZyb20gXCIuLi91dGlscy9hdWRpb1wiO1xyXG5pbXBvcnQgeyBNc0VkZ2VUVFMsIE9VVFBVVF9GT1JNQVQgfSBmcm9tIFwiLi4vdXRpbHMvbXNfZWRnZV90dHNcIjtcclxuXHJcbmltcG9ydCB7IGlzRW1wdHkgfSBmcm9tIFwibG9kYXNoLWVzXCI7XHJcbmltcG9ydCB7IGdldE1vZGVsUHJvdmlkZXIgfSBmcm9tIFwiLi4vdXRpbHMvbW9kZWxcIjtcclxuaW1wb3J0IHsgUmVhbHRpbWVDaGF0IH0gZnJvbSBcIkAvYXBwL2NvbXBvbmVudHMvcmVhbHRpbWUtY2hhdFwiO1xyXG5pbXBvcnQgY2xzeCBmcm9tIFwiY2xzeFwiO1xyXG5pbXBvcnQgeyBnZXRBdmFpbGFibGVDbGllbnRzQ291bnQsIGlzTWNwRW5hYmxlZCB9IGZyb20gXCIuLi9tY3AvYWN0aW9uc1wiO1xyXG5cclxuY29uc3QgbG9jYWxTdG9yYWdlID0gc2FmZUxvY2FsU3RvcmFnZSgpO1xyXG5cclxuY29uc3QgdHRzUGxheWVyID0gY3JlYXRlVFRTUGxheWVyKCk7XHJcblxyXG5jb25zdCBNYXJrZG93biA9IGR5bmFtaWMoYXN5bmMgKCkgPT4gKGF3YWl0IGltcG9ydChcIi4vbWFya2Rvd25cIikpLk1hcmtkb3duLCB7XHJcbiAgbG9hZGluZzogKCkgPT4gPExvYWRpbmdJY29uIC8+LFxyXG59KTtcclxuXHJcbmNvbnN0IE1DUEFjdGlvbiA9ICgpID0+IHtcclxuICBjb25zdCBuYXZpZ2F0ZSA9IHVzZU5hdmlnYXRlKCk7XHJcbiAgY29uc3QgW2NvdW50LCBzZXRDb3VudF0gPSB1c2VTdGF0ZTxudW1iZXI+KDApO1xyXG4gIGNvbnN0IFttY3BFbmFibGVkLCBzZXRNY3BFbmFibGVkXSA9IHVzZVN0YXRlKGZhbHNlKTtcclxuXHJcbiAgdXNlRWZmZWN0KCgpID0+IHtcclxuICAgIGNvbnN0IGNoZWNrTWNwU3RhdHVzID0gYXN5bmMgKCkgPT4ge1xyXG4gICAgICBjb25zdCBlbmFibGVkID0gYXdhaXQgaXNNY3BFbmFibGVkKCk7XHJcbiAgICAgIHNldE1jcEVuYWJsZWQoZW5hYmxlZCk7XHJcbiAgICAgIGlmIChlbmFibGVkKSB7XHJcbiAgICAgICAgY29uc3QgY291bnQgPSBhd2FpdCBnZXRBdmFpbGFibGVDbGllbnRzQ291bnQoKTtcclxuICAgICAgICBzZXRDb3VudChjb3VudCk7XHJcbiAgICAgIH1cclxuICAgIH07XHJcbiAgICBjaGVja01jcFN0YXR1cygpO1xyXG4gIH0sIFtdKTtcclxuXHJcbiAgaWYgKCFtY3BFbmFibGVkKSByZXR1cm4gbnVsbDtcclxuXHJcbiAgcmV0dXJuIChcclxuICAgIDxDaGF0QWN0aW9uXHJcbiAgICAgIG9uQ2xpY2s9eygpID0+IG5hdmlnYXRlKFBhdGguTWNwTWFya2V0KX1cclxuICAgICAgdGV4dD17YE1DUCR7Y291bnQgPyBgICgke2NvdW50fSlgIDogXCJcIn1gfVxyXG4gICAgICBpY29uPXs8TWNwVG9vbEljb24gLz59XHJcbiAgICAvPlxyXG4gICk7XHJcbn07XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gU2Vzc2lvbkNvbmZpZ01vZGVsKHByb3BzOiB7IG9uQ2xvc2U6ICgpID0+IHZvaWQgfSkge1xyXG4gIGNvbnN0IGNoYXRTdG9yZSA9IHVzZUNoYXRTdG9yZSgpO1xyXG4gIGNvbnN0IHNlc3Npb24gPSBjaGF0U3RvcmUuY3VycmVudFNlc3Npb24oKTtcclxuICBjb25zdCBtYXNrU3RvcmUgPSB1c2VNYXNrU3RvcmUoKTtcclxuICBjb25zdCBuYXZpZ2F0ZSA9IHVzZU5hdmlnYXRlKCk7XHJcblxyXG4gIHJldHVybiAoXHJcbiAgICA8ZGl2IGNsYXNzTmFtZT1cIm1vZGFsLW1hc2tcIj5cclxuICAgICAgPE1vZGFsXHJcbiAgICAgICAgdGl0bGU9e0xvY2FsZS5Db250ZXh0LkVkaXR9XHJcbiAgICAgICAgb25DbG9zZT17KCkgPT4gcHJvcHMub25DbG9zZSgpfVxyXG4gICAgICAgIGFjdGlvbnM9e1tcclxuICAgICAgICAgIDxJY29uQnV0dG9uXHJcbiAgICAgICAgICAgIGtleT1cInJlc2V0XCJcclxuICAgICAgICAgICAgaWNvbj17PFJlc2V0SWNvbiAvPn1cclxuICAgICAgICAgICAgYm9yZGVyZWRcclxuICAgICAgICAgICAgdGV4dD17TG9jYWxlLkNoYXQuQ29uZmlnLlJlc2V0fVxyXG4gICAgICAgICAgICBvbkNsaWNrPXthc3luYyAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgaWYgKGF3YWl0IHNob3dDb25maXJtKExvY2FsZS5NZW1vcnkuUmVzZXRDb25maXJtKSkge1xyXG4gICAgICAgICAgICAgICAgY2hhdFN0b3JlLnVwZGF0ZVRhcmdldFNlc3Npb24oXHJcbiAgICAgICAgICAgICAgICAgIHNlc3Npb24sXHJcbiAgICAgICAgICAgICAgICAgIChzZXNzaW9uKSA9PiAoc2Vzc2lvbi5tZW1vcnlQcm9tcHQgPSBcIlwiKSxcclxuICAgICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9fVxyXG4gICAgICAgICAgLz4sXHJcbiAgICAgICAgICA8SWNvbkJ1dHRvblxyXG4gICAgICAgICAgICBrZXk9XCJjb3B5XCJcclxuICAgICAgICAgICAgaWNvbj17PENvcHlJY29uIC8+fVxyXG4gICAgICAgICAgICBib3JkZXJlZFxyXG4gICAgICAgICAgICB0ZXh0PXtMb2NhbGUuQ2hhdC5Db25maWcuU2F2ZUFzfVxyXG4gICAgICAgICAgICBvbkNsaWNrPXsoKSA9PiB7XHJcbiAgICAgICAgICAgICAgbmF2aWdhdGUoUGF0aC5NYXNrcyk7XHJcbiAgICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBtYXNrU3RvcmUuY3JlYXRlKHNlc3Npb24ubWFzayk7XHJcbiAgICAgICAgICAgICAgfSwgNTAwKTtcclxuICAgICAgICAgICAgfX1cclxuICAgICAgICAgIC8+LFxyXG4gICAgICAgIF19XHJcbiAgICAgID5cclxuICAgICAgICA8TWFza0NvbmZpZ1xyXG4gICAgICAgICAgbWFzaz17c2Vzc2lvbi5tYXNrfVxyXG4gICAgICAgICAgdXBkYXRlTWFzaz17KHVwZGF0ZXIpID0+IHtcclxuICAgICAgICAgICAgY29uc3QgbWFzayA9IHsgLi4uc2Vzc2lvbi5tYXNrIH07XHJcbiAgICAgICAgICAgIHVwZGF0ZXIobWFzayk7XHJcbiAgICAgICAgICAgIGNoYXRTdG9yZS51cGRhdGVUYXJnZXRTZXNzaW9uKFxyXG4gICAgICAgICAgICAgIHNlc3Npb24sXHJcbiAgICAgICAgICAgICAgKHNlc3Npb24pID0+IChzZXNzaW9uLm1hc2sgPSBtYXNrKSxcclxuICAgICAgICAgICAgKTtcclxuICAgICAgICAgIH19XHJcbiAgICAgICAgICBzaG91bGRTeW5jRnJvbUdsb2JhbFxyXG4gICAgICAgICAgZXh0cmFMaXN0SXRlbXM9e1xyXG4gICAgICAgICAgICBzZXNzaW9uLm1hc2subW9kZWxDb25maWcuc2VuZE1lbW9yeSA/IChcclxuICAgICAgICAgICAgICA8TGlzdEl0ZW1cclxuICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cImNvcHlhYmxlXCJcclxuICAgICAgICAgICAgICAgIHRpdGxlPXtgJHtMb2NhbGUuTWVtb3J5LlRpdGxlfSAoJHtzZXNzaW9uLmxhc3RTdW1tYXJpemVJbmRleH0gb2YgJHtzZXNzaW9uLm1lc3NhZ2VzLmxlbmd0aH0pYH1cclxuICAgICAgICAgICAgICAgIHN1YlRpdGxlPXtzZXNzaW9uLm1lbW9yeVByb21wdCB8fCBMb2NhbGUuTWVtb3J5LkVtcHR5Q29udGVudH1cclxuICAgICAgICAgICAgICA+PC9MaXN0SXRlbT5cclxuICAgICAgICAgICAgKSA6IChcclxuICAgICAgICAgICAgICA8PjwvPlxyXG4gICAgICAgICAgICApXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgPjwvTWFza0NvbmZpZz5cclxuICAgICAgPC9Nb2RhbD5cclxuICAgIDwvZGl2PlxyXG4gICk7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIFByb21wdFRvYXN0KHByb3BzOiB7XHJcbiAgc2hvd1RvYXN0PzogYm9vbGVhbjtcclxuICBzaG93TW9kYWw/OiBib29sZWFuO1xyXG4gIHNldFNob3dNb2RhbDogKF86IGJvb2xlYW4pID0+IHZvaWQ7XHJcbn0pIHtcclxuICBjb25zdCBjaGF0U3RvcmUgPSB1c2VDaGF0U3RvcmUoKTtcclxuICBjb25zdCBzZXNzaW9uID0gY2hhdFN0b3JlLmN1cnJlbnRTZXNzaW9uKCk7XHJcbiAgY29uc3QgY29udGV4dCA9IHNlc3Npb24ubWFzay5jb250ZXh0O1xyXG5cclxuICByZXR1cm4gKFxyXG4gICAgPGRpdiBjbGFzc05hbWU9e3N0eWxlc1tcInByb21wdC10b2FzdFwiXX0ga2V5PVwicHJvbXB0LXRvYXN0XCI+XHJcbiAgICAgIHtwcm9wcy5zaG93VG9hc3QgJiYgY29udGV4dC5sZW5ndGggPiAwICYmIChcclxuICAgICAgICA8ZGl2XHJcbiAgICAgICAgICBjbGFzc05hbWU9e2Nsc3goc3R5bGVzW1wicHJvbXB0LXRvYXN0LWlubmVyXCJdLCBcImNsaWNrYWJsZVwiKX1cclxuICAgICAgICAgIHJvbGU9XCJidXR0b25cIlxyXG4gICAgICAgICAgb25DbGljaz17KCkgPT4gcHJvcHMuc2V0U2hvd01vZGFsKHRydWUpfVxyXG4gICAgICAgID5cclxuICAgICAgICAgIDxCcmFpbkljb24gLz5cclxuICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT17c3R5bGVzW1wicHJvbXB0LXRvYXN0LWNvbnRlbnRcIl19PlxyXG4gICAgICAgICAgICB7TG9jYWxlLkNvbnRleHQuVG9hc3QoY29udGV4dC5sZW5ndGgpfVxyXG4gICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICApfVxyXG4gICAgICB7cHJvcHMuc2hvd01vZGFsICYmIChcclxuICAgICAgICA8U2Vzc2lvbkNvbmZpZ01vZGVsIG9uQ2xvc2U9eygpID0+IHByb3BzLnNldFNob3dNb2RhbChmYWxzZSl9IC8+XHJcbiAgICAgICl9XHJcbiAgICA8L2Rpdj5cclxuICApO1xyXG59XHJcblxyXG5mdW5jdGlvbiB1c2VTdWJtaXRIYW5kbGVyKCkge1xyXG4gIGNvbnN0IGNvbmZpZyA9IHVzZUFwcENvbmZpZygpO1xyXG4gIGNvbnN0IHN1Ym1pdEtleSA9IGNvbmZpZy5zdWJtaXRLZXk7XHJcbiAgY29uc3QgaXNDb21wb3NpbmcgPSB1c2VSZWYoZmFsc2UpO1xyXG5cclxuICB1c2VFZmZlY3QoKCkgPT4ge1xyXG4gICAgY29uc3Qgb25Db21wb3NpdGlvblN0YXJ0ID0gKCkgPT4ge1xyXG4gICAgICBpc0NvbXBvc2luZy5jdXJyZW50ID0gdHJ1ZTtcclxuICAgIH07XHJcbiAgICBjb25zdCBvbkNvbXBvc2l0aW9uRW5kID0gKCkgPT4ge1xyXG4gICAgICBpc0NvbXBvc2luZy5jdXJyZW50ID0gZmFsc2U7XHJcbiAgICB9O1xyXG5cclxuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKFwiY29tcG9zaXRpb25zdGFydFwiLCBvbkNvbXBvc2l0aW9uU3RhcnQpO1xyXG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoXCJjb21wb3NpdGlvbmVuZFwiLCBvbkNvbXBvc2l0aW9uRW5kKTtcclxuXHJcbiAgICByZXR1cm4gKCkgPT4ge1xyXG4gICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcihcImNvbXBvc2l0aW9uc3RhcnRcIiwgb25Db21wb3NpdGlvblN0YXJ0KTtcclxuICAgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJjb21wb3NpdGlvbmVuZFwiLCBvbkNvbXBvc2l0aW9uRW5kKTtcclxuICAgIH07XHJcbiAgfSwgW10pO1xyXG5cclxuICBjb25zdCBzaG91bGRTdWJtaXQgPSAoZTogUmVhY3QuS2V5Ym9hcmRFdmVudDxIVE1MVGV4dEFyZWFFbGVtZW50PikgPT4ge1xyXG4gICAgLy8gRml4IENoaW5lc2UgaW5wdXQgbWV0aG9kIFwiRW50ZXJcIiBvbiBTYWZhcmlcclxuICAgIGlmIChlLmtleUNvZGUgPT0gMjI5KSByZXR1cm4gZmFsc2U7XHJcbiAgICBpZiAoZS5rZXkgIT09IFwiRW50ZXJcIikgcmV0dXJuIGZhbHNlO1xyXG4gICAgaWYgKGUua2V5ID09PSBcIkVudGVyXCIgJiYgKGUubmF0aXZlRXZlbnQuaXNDb21wb3NpbmcgfHwgaXNDb21wb3NpbmcuY3VycmVudCkpXHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIHJldHVybiAoXHJcbiAgICAgIChjb25maWcuc3VibWl0S2V5ID09PSBTdWJtaXRLZXkuQWx0RW50ZXIgJiYgZS5hbHRLZXkpIHx8XHJcbiAgICAgIChjb25maWcuc3VibWl0S2V5ID09PSBTdWJtaXRLZXkuQ3RybEVudGVyICYmIGUuY3RybEtleSkgfHxcclxuICAgICAgKGNvbmZpZy5zdWJtaXRLZXkgPT09IFN1Ym1pdEtleS5TaGlmdEVudGVyICYmIGUuc2hpZnRLZXkpIHx8XHJcbiAgICAgIChjb25maWcuc3VibWl0S2V5ID09PSBTdWJtaXRLZXkuTWV0YUVudGVyICYmIGUubWV0YUtleSkgfHxcclxuICAgICAgKGNvbmZpZy5zdWJtaXRLZXkgPT09IFN1Ym1pdEtleS5FbnRlciAmJlxyXG4gICAgICAgICFlLmFsdEtleSAmJlxyXG4gICAgICAgICFlLmN0cmxLZXkgJiZcclxuICAgICAgICAhZS5zaGlmdEtleSAmJlxyXG4gICAgICAgICFlLm1ldGFLZXkpXHJcbiAgICApO1xyXG4gIH07XHJcblxyXG4gIHJldHVybiB7XHJcbiAgICBzdWJtaXRLZXksXHJcbiAgICBzaG91bGRTdWJtaXQsXHJcbiAgfTtcclxufVxyXG5cclxuZXhwb3J0IHR5cGUgUmVuZGVyUHJvbXB0ID0gUGljazxQcm9tcHQsIFwidGl0bGVcIiB8IFwiY29udGVudFwiPjtcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBQcm9tcHRIaW50cyhwcm9wczoge1xyXG4gIHByb21wdHM6IFJlbmRlclByb21wdFtdO1xyXG4gIG9uUHJvbXB0U2VsZWN0OiAocHJvbXB0OiBSZW5kZXJQcm9tcHQpID0+IHZvaWQ7XHJcbn0pIHtcclxuICBjb25zdCBub1Byb21wdHMgPSBwcm9wcy5wcm9tcHRzLmxlbmd0aCA9PT0gMDtcclxuICBjb25zdCBbc2VsZWN0SW5kZXgsIHNldFNlbGVjdEluZGV4XSA9IHVzZVN0YXRlKDApO1xyXG4gIGNvbnN0IHNlbGVjdGVkUmVmID0gdXNlUmVmPEhUTUxEaXZFbGVtZW50PihudWxsKTtcclxuXHJcbiAgdXNlRWZmZWN0KCgpID0+IHtcclxuICAgIHNldFNlbGVjdEluZGV4KDApO1xyXG4gIH0sIFtwcm9wcy5wcm9tcHRzLmxlbmd0aF0pO1xyXG5cclxuICB1c2VFZmZlY3QoKCkgPT4ge1xyXG4gICAgY29uc3Qgb25LZXlEb3duID0gKGU6IEtleWJvYXJkRXZlbnQpID0+IHtcclxuICAgICAgaWYgKG5vUHJvbXB0cyB8fCBlLm1ldGFLZXkgfHwgZS5hbHRLZXkgfHwgZS5jdHJsS2V5KSB7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9XHJcbiAgICAgIC8vIGFycm93IHVwIC8gZG93biB0byBzZWxlY3QgcHJvbXB0XHJcbiAgICAgIGNvbnN0IGNoYW5nZUluZGV4ID0gKGRlbHRhOiBudW1iZXIpID0+IHtcclxuICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xyXG4gICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgICBjb25zdCBuZXh0SW5kZXggPSBNYXRoLm1heChcclxuICAgICAgICAgIDAsXHJcbiAgICAgICAgICBNYXRoLm1pbihwcm9wcy5wcm9tcHRzLmxlbmd0aCAtIDEsIHNlbGVjdEluZGV4ICsgZGVsdGEpLFxyXG4gICAgICAgICk7XHJcbiAgICAgICAgc2V0U2VsZWN0SW5kZXgobmV4dEluZGV4KTtcclxuICAgICAgICBzZWxlY3RlZFJlZi5jdXJyZW50Py5zY3JvbGxJbnRvVmlldyh7XHJcbiAgICAgICAgICBibG9jazogXCJjZW50ZXJcIixcclxuICAgICAgICB9KTtcclxuICAgICAgfTtcclxuXHJcbiAgICAgIGlmIChlLmtleSA9PT0gXCJBcnJvd1VwXCIpIHtcclxuICAgICAgICBjaGFuZ2VJbmRleCgxKTtcclxuICAgICAgfSBlbHNlIGlmIChlLmtleSA9PT0gXCJBcnJvd0Rvd25cIikge1xyXG4gICAgICAgIGNoYW5nZUluZGV4KC0xKTtcclxuICAgICAgfSBlbHNlIGlmIChlLmtleSA9PT0gXCJFbnRlclwiKSB7XHJcbiAgICAgICAgY29uc3Qgc2VsZWN0ZWRQcm9tcHQgPSBwcm9wcy5wcm9tcHRzLmF0KHNlbGVjdEluZGV4KTtcclxuICAgICAgICBpZiAoc2VsZWN0ZWRQcm9tcHQpIHtcclxuICAgICAgICAgIHByb3BzLm9uUHJvbXB0U2VsZWN0KHNlbGVjdGVkUHJvbXB0KTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH07XHJcblxyXG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoXCJrZXlkb3duXCIsIG9uS2V5RG93bik7XHJcblxyXG4gICAgcmV0dXJuICgpID0+IHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKFwia2V5ZG93blwiLCBvbktleURvd24pO1xyXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHJlYWN0LWhvb2tzL2V4aGF1c3RpdmUtZGVwc1xyXG4gIH0sIFtwcm9wcy5wcm9tcHRzLmxlbmd0aCwgc2VsZWN0SW5kZXhdKTtcclxuXHJcbiAgaWYgKG5vUHJvbXB0cykgcmV0dXJuIG51bGw7XHJcbiAgcmV0dXJuIChcclxuICAgIDxkaXYgY2xhc3NOYW1lPXtzdHlsZXNbXCJwcm9tcHQtaGludHNcIl19PlxyXG4gICAgICB7cHJvcHMucHJvbXB0cy5tYXAoKHByb21wdCwgaSkgPT4gKFxyXG4gICAgICAgIDxkaXZcclxuICAgICAgICAgIHJlZj17aSA9PT0gc2VsZWN0SW5kZXggPyBzZWxlY3RlZFJlZiA6IG51bGx9XHJcbiAgICAgICAgICBjbGFzc05hbWU9e2Nsc3goc3R5bGVzW1wicHJvbXB0LWhpbnRcIl0sIHtcclxuICAgICAgICAgICAgW3N0eWxlc1tcInByb21wdC1oaW50LXNlbGVjdGVkXCJdXTogaSA9PT0gc2VsZWN0SW5kZXgsXHJcbiAgICAgICAgICB9KX1cclxuICAgICAgICAgIGtleT17cHJvbXB0LnRpdGxlICsgaS50b1N0cmluZygpfVxyXG4gICAgICAgICAgb25DbGljaz17KCkgPT4gcHJvcHMub25Qcm9tcHRTZWxlY3QocHJvbXB0KX1cclxuICAgICAgICAgIG9uTW91c2VFbnRlcj17KCkgPT4gc2V0U2VsZWN0SW5kZXgoaSl9XHJcbiAgICAgICAgPlxyXG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9e3N0eWxlc1tcImhpbnQtdGl0bGVcIl19Pntwcm9tcHQudGl0bGV9PC9kaXY+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT17c3R5bGVzW1wiaGludC1jb250ZW50XCJdfT57cHJvbXB0LmNvbnRlbnR9PC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICkpfVxyXG4gICAgPC9kaXY+XHJcbiAgKTtcclxufVxyXG5cclxuZnVuY3Rpb24gQ2xlYXJDb250ZXh0RGl2aWRlcigpIHtcclxuICBjb25zdCBjaGF0U3RvcmUgPSB1c2VDaGF0U3RvcmUoKTtcclxuICBjb25zdCBzZXNzaW9uID0gY2hhdFN0b3JlLmN1cnJlbnRTZXNzaW9uKCk7XHJcblxyXG4gIHJldHVybiAoXHJcbiAgICA8ZGl2XHJcbiAgICAgIGNsYXNzTmFtZT17c3R5bGVzW1wiY2xlYXItY29udGV4dFwiXX1cclxuICAgICAgb25DbGljaz17KCkgPT5cclxuICAgICAgICBjaGF0U3RvcmUudXBkYXRlVGFyZ2V0U2Vzc2lvbihcclxuICAgICAgICAgIHNlc3Npb24sXHJcbiAgICAgICAgICAoc2Vzc2lvbikgPT4gKHNlc3Npb24uY2xlYXJDb250ZXh0SW5kZXggPSB1bmRlZmluZWQpLFxyXG4gICAgICAgIClcclxuICAgICAgfVxyXG4gICAgPlxyXG4gICAgICA8ZGl2IGNsYXNzTmFtZT17c3R5bGVzW1wiY2xlYXItY29udGV4dC10aXBzXCJdfT57TG9jYWxlLkNvbnRleHQuQ2xlYXJ9PC9kaXY+XHJcbiAgICAgIDxkaXYgY2xhc3NOYW1lPXtzdHlsZXNbXCJjbGVhci1jb250ZXh0LXJldmVydC1idG5cIl19PlxyXG4gICAgICAgIHtMb2NhbGUuQ29udGV4dC5SZXZlcnR9XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbiAgKTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIENoYXRBY3Rpb24ocHJvcHM6IHtcclxuICB0ZXh0OiBzdHJpbmc7XHJcbiAgaWNvbjogSlNYLkVsZW1lbnQ7XHJcbiAgb25DbGljazogKCkgPT4gdm9pZDtcclxufSkge1xyXG4gIGNvbnN0IGljb25SZWYgPSB1c2VSZWY8SFRNTERpdkVsZW1lbnQ+KG51bGwpO1xyXG4gIGNvbnN0IHRleHRSZWYgPSB1c2VSZWY8SFRNTERpdkVsZW1lbnQ+KG51bGwpO1xyXG4gIGNvbnN0IFt3aWR0aCwgc2V0V2lkdGhdID0gdXNlU3RhdGUoe1xyXG4gICAgZnVsbDogMTYsXHJcbiAgICBpY29uOiAxNixcclxuICB9KTtcclxuXHJcbiAgZnVuY3Rpb24gdXBkYXRlV2lkdGgoKSB7XHJcbiAgICBpZiAoIWljb25SZWYuY3VycmVudCB8fCAhdGV4dFJlZi5jdXJyZW50KSByZXR1cm47XHJcbiAgICBjb25zdCBnZXRXaWR0aCA9IChkb206IEhUTUxEaXZFbGVtZW50KSA9PiBkb20uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkud2lkdGg7XHJcbiAgICBjb25zdCB0ZXh0V2lkdGggPSBnZXRXaWR0aCh0ZXh0UmVmLmN1cnJlbnQpO1xyXG4gICAgY29uc3QgaWNvbldpZHRoID0gZ2V0V2lkdGgoaWNvblJlZi5jdXJyZW50KTtcclxuICAgIHNldFdpZHRoKHtcclxuICAgICAgZnVsbDogdGV4dFdpZHRoICsgaWNvbldpZHRoLFxyXG4gICAgICBpY29uOiBpY29uV2lkdGgsXHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHJldHVybiAoXHJcbiAgICA8ZGl2XHJcbiAgICAgIGNsYXNzTmFtZT17Y2xzeChzdHlsZXNbXCJjaGF0LWlucHV0LWFjdGlvblwiXSwgXCJjbGlja2FibGVcIil9XHJcbiAgICAgIG9uQ2xpY2s9eygpID0+IHtcclxuICAgICAgICBwcm9wcy5vbkNsaWNrKCk7XHJcbiAgICAgICAgc2V0VGltZW91dCh1cGRhdGVXaWR0aCwgMSk7XHJcbiAgICAgIH19XHJcbiAgICAgIG9uTW91c2VFbnRlcj17dXBkYXRlV2lkdGh9XHJcbiAgICAgIG9uVG91Y2hTdGFydD17dXBkYXRlV2lkdGh9XHJcbiAgICAgIHN0eWxlPXtcclxuICAgICAgICB7XHJcbiAgICAgICAgICBcIi0taWNvbi13aWR0aFwiOiBgJHt3aWR0aC5pY29ufXB4YCxcclxuICAgICAgICAgIFwiLS1mdWxsLXdpZHRoXCI6IGAke3dpZHRoLmZ1bGx9cHhgLFxyXG4gICAgICAgIH0gYXMgUmVhY3QuQ1NTUHJvcGVydGllc1xyXG4gICAgICB9XHJcbiAgICA+XHJcbiAgICAgIDxkaXYgcmVmPXtpY29uUmVmfSBjbGFzc05hbWU9e3N0eWxlc1tcImljb25cIl19PlxyXG4gICAgICAgIHtwcm9wcy5pY29ufVxyXG4gICAgICA8L2Rpdj5cclxuICAgICAgPGRpdiBjbGFzc05hbWU9e3N0eWxlc1tcInRleHRcIl19IHJlZj17dGV4dFJlZn0+XHJcbiAgICAgICAge3Byb3BzLnRleHR9XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbiAgKTtcclxufVxyXG5cclxuZnVuY3Rpb24gdXNlU2Nyb2xsVG9Cb3R0b20oXHJcbiAgc2Nyb2xsUmVmOiBSZWZPYmplY3Q8SFRNTERpdkVsZW1lbnQ+LFxyXG4gIGRldGFjaDogYm9vbGVhbiA9IGZhbHNlLFxyXG4gIG1lc3NhZ2VzOiBDaGF0TWVzc2FnZVtdLFxyXG4pIHtcclxuICAvLyBmb3IgYXV0by1zY3JvbGxcclxuICBjb25zdCBbYXV0b1Njcm9sbCwgc2V0QXV0b1Njcm9sbF0gPSB1c2VTdGF0ZSh0cnVlKTtcclxuICBjb25zdCBzY3JvbGxEb21Ub0JvdHRvbSA9IHVzZUNhbGxiYWNrKCgpID0+IHtcclxuICAgIGNvbnN0IGRvbSA9IHNjcm9sbFJlZi5jdXJyZW50O1xyXG4gICAgaWYgKGRvbSkge1xyXG4gICAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4ge1xyXG4gICAgICAgIHNldEF1dG9TY3JvbGwodHJ1ZSk7XHJcbiAgICAgICAgZG9tLnNjcm9sbFRvKDAsIGRvbS5zY3JvbGxIZWlnaHQpO1xyXG4gICAgICB9KTtcclxuICAgIH1cclxuICB9LCBbc2Nyb2xsUmVmXSk7XHJcblxyXG4gIC8vIGF1dG8gc2Nyb2xsXHJcbiAgdXNlRWZmZWN0KCgpID0+IHtcclxuICAgIGlmIChhdXRvU2Nyb2xsICYmICFkZXRhY2gpIHtcclxuICAgICAgc2Nyb2xsRG9tVG9Cb3R0b20oKTtcclxuICAgIH1cclxuICB9KTtcclxuXHJcbiAgLy8gYXV0byBzY3JvbGwgd2hlbiBtZXNzYWdlcyBsZW5ndGggY2hhbmdlc1xyXG4gIGNvbnN0IGxhc3RNZXNzYWdlc0xlbmd0aCA9IHVzZVJlZihtZXNzYWdlcy5sZW5ndGgpO1xyXG4gIHVzZUVmZmVjdCgoKSA9PiB7XHJcbiAgICBpZiAobWVzc2FnZXMubGVuZ3RoID4gbGFzdE1lc3NhZ2VzTGVuZ3RoLmN1cnJlbnQgJiYgIWRldGFjaCkge1xyXG4gICAgICBzY3JvbGxEb21Ub0JvdHRvbSgpO1xyXG4gICAgfVxyXG4gICAgbGFzdE1lc3NhZ2VzTGVuZ3RoLmN1cnJlbnQgPSBtZXNzYWdlcy5sZW5ndGg7XHJcbiAgfSwgW21lc3NhZ2VzLmxlbmd0aCwgZGV0YWNoLCBzY3JvbGxEb21Ub0JvdHRvbV0pO1xyXG5cclxuICByZXR1cm4ge1xyXG4gICAgc2Nyb2xsUmVmLFxyXG4gICAgYXV0b1Njcm9sbCxcclxuICAgIHNldEF1dG9TY3JvbGwsXHJcbiAgICBzY3JvbGxEb21Ub0JvdHRvbSxcclxuICB9O1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gQ2hhdEFjdGlvbnMocHJvcHM6IHtcclxuICB1cGxvYWRJbWFnZTogKCkgPT4gdm9pZDtcclxuICBzZXRBdHRhY2hJbWFnZXM6IChpbWFnZXM6IHN0cmluZ1tdKSA9PiB2b2lkO1xyXG4gIHNldFVwbG9hZGluZzogKHVwbG9hZGluZzogYm9vbGVhbikgPT4gdm9pZDtcclxuICBzaG93UHJvbXB0TW9kYWw6ICgpID0+IHZvaWQ7XHJcbiAgc2Nyb2xsVG9Cb3R0b206ICgpID0+IHZvaWQ7XHJcbiAgc2hvd1Byb21wdEhpbnRzOiAoKSA9PiB2b2lkO1xyXG4gIGhpdEJvdHRvbTogYm9vbGVhbjtcclxuICB1cGxvYWRpbmc6IGJvb2xlYW47XHJcbiAgc2V0U2hvd1Nob3J0Y3V0S2V5TW9kYWw6IFJlYWN0LkRpc3BhdGNoPFJlYWN0LlNldFN0YXRlQWN0aW9uPGJvb2xlYW4+PjtcclxuICBzZXRVc2VySW5wdXQ6IChpbnB1dDogc3RyaW5nKSA9PiB2b2lkO1xyXG4gIHNldFNob3dDaGF0U2lkZVBhbmVsOiBSZWFjdC5EaXNwYXRjaDxSZWFjdC5TZXRTdGF0ZUFjdGlvbjxib29sZWFuPj47XHJcbn0pIHtcclxuICBjb25zdCBjb25maWcgPSB1c2VBcHBDb25maWcoKTtcclxuICBjb25zdCBuYXZpZ2F0ZSA9IHVzZU5hdmlnYXRlKCk7XHJcbiAgY29uc3QgY2hhdFN0b3JlID0gdXNlQ2hhdFN0b3JlKCk7XHJcbiAgY29uc3QgcGx1Z2luU3RvcmUgPSB1c2VQbHVnaW5TdG9yZSgpO1xyXG4gIGNvbnN0IHNlc3Npb24gPSBjaGF0U3RvcmUuY3VycmVudFNlc3Npb24oKTtcclxuXHJcbiAgLy8gc3dpdGNoIHRoZW1lc1xyXG4gIGNvbnN0IHRoZW1lID0gY29uZmlnLnRoZW1lO1xyXG5cclxuICBmdW5jdGlvbiBuZXh0VGhlbWUoKSB7XHJcbiAgICBjb25zdCB0aGVtZXMgPSBbVGhlbWUuQXV0bywgVGhlbWUuTGlnaHQsIFRoZW1lLkRhcmtdO1xyXG4gICAgY29uc3QgdGhlbWVJbmRleCA9IHRoZW1lcy5pbmRleE9mKHRoZW1lKTtcclxuICAgIGNvbnN0IG5leHRJbmRleCA9ICh0aGVtZUluZGV4ICsgMSkgJSB0aGVtZXMubGVuZ3RoO1xyXG4gICAgY29uc3QgbmV4dFRoZW1lID0gdGhlbWVzW25leHRJbmRleF07XHJcbiAgICBjb25maWcudXBkYXRlKChjb25maWcpID0+IChjb25maWcudGhlbWUgPSBuZXh0VGhlbWUpKTtcclxuICB9XHJcblxyXG4gIC8vIHN0b3AgYWxsIHJlc3BvbnNlc1xyXG4gIGNvbnN0IGNvdWxkU3RvcCA9IENoYXRDb250cm9sbGVyUG9vbC5oYXNQZW5kaW5nKCk7XHJcbiAgY29uc3Qgc3RvcEFsbCA9ICgpID0+IENoYXRDb250cm9sbGVyUG9vbC5zdG9wQWxsKCk7XHJcblxyXG4gIC8vIHN3aXRjaCBtb2RlbFxyXG4gIGNvbnN0IGN1cnJlbnRNb2RlbCA9IHNlc3Npb24ubWFzay5tb2RlbENvbmZpZy5tb2RlbDtcclxuICBjb25zdCBjdXJyZW50UHJvdmlkZXJOYW1lID1cclxuICAgIHNlc3Npb24ubWFzay5tb2RlbENvbmZpZz8ucHJvdmlkZXJOYW1lIHx8IFNlcnZpY2VQcm92aWRlci5PcGVuQUk7XHJcbiAgY29uc3QgYWxsTW9kZWxzID0gdXNlQWxsTW9kZWxzKCk7XHJcbiAgY29uc3QgbW9kZWxzID0gdXNlTWVtbygoKSA9PiB7XHJcbiAgICBjb25zdCBmaWx0ZXJlZE1vZGVscyA9IGFsbE1vZGVscy5maWx0ZXIoKG0pID0+IG0uYXZhaWxhYmxlKTtcclxuICAgIGNvbnN0IGRlZmF1bHRNb2RlbCA9IGZpbHRlcmVkTW9kZWxzLmZpbmQoKG0pID0+IG0uaXNEZWZhdWx0KTtcclxuXHJcbiAgICBpZiAoZGVmYXVsdE1vZGVsKSB7XHJcbiAgICAgIGNvbnN0IGFyciA9IFtcclxuICAgICAgICBkZWZhdWx0TW9kZWwsXHJcbiAgICAgICAgLi4uZmlsdGVyZWRNb2RlbHMuZmlsdGVyKChtKSA9PiBtICE9PSBkZWZhdWx0TW9kZWwpLFxyXG4gICAgICBdO1xyXG4gICAgICByZXR1cm4gYXJyO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgcmV0dXJuIGZpbHRlcmVkTW9kZWxzO1xyXG4gICAgfVxyXG4gIH0sIFthbGxNb2RlbHNdKTtcclxuICBjb25zdCBjdXJyZW50TW9kZWxOYW1lID0gdXNlTWVtbygoKSA9PiB7XHJcbiAgICBjb25zdCBtb2RlbCA9IG1vZGVscy5maW5kKFxyXG4gICAgICAobSkgPT5cclxuICAgICAgICBtLm5hbWUgPT0gY3VycmVudE1vZGVsICYmXHJcbiAgICAgICAgbT8ucHJvdmlkZXI/LnByb3ZpZGVyTmFtZSA9PSBjdXJyZW50UHJvdmlkZXJOYW1lLFxyXG4gICAgKTtcclxuICAgIHJldHVybiBtb2RlbD8uZGlzcGxheU5hbWUgPz8gXCJcIjtcclxuICB9LCBbbW9kZWxzLCBjdXJyZW50TW9kZWwsIGN1cnJlbnRQcm92aWRlck5hbWVdKTtcclxuICBjb25zdCBbc2hvd01vZGVsU2VsZWN0b3IsIHNldFNob3dNb2RlbFNlbGVjdG9yXSA9IHVzZVN0YXRlKGZhbHNlKTtcclxuICBjb25zdCBbc2hvd1BsdWdpblNlbGVjdG9yLCBzZXRTaG93UGx1Z2luU2VsZWN0b3JdID0gdXNlU3RhdGUoZmFsc2UpO1xyXG4gIGNvbnN0IFtzaG93VXBsb2FkSW1hZ2UsIHNldFNob3dVcGxvYWRJbWFnZV0gPSB1c2VTdGF0ZShmYWxzZSk7XHJcblxyXG4gIGNvbnN0IFtzaG93U2l6ZVNlbGVjdG9yLCBzZXRTaG93U2l6ZVNlbGVjdG9yXSA9IHVzZVN0YXRlKGZhbHNlKTtcclxuICBjb25zdCBbc2hvd1F1YWxpdHlTZWxlY3Rvciwgc2V0U2hvd1F1YWxpdHlTZWxlY3Rvcl0gPSB1c2VTdGF0ZShmYWxzZSk7XHJcbiAgY29uc3QgW3Nob3dTdHlsZVNlbGVjdG9yLCBzZXRTaG93U3R5bGVTZWxlY3Rvcl0gPSB1c2VTdGF0ZShmYWxzZSk7XHJcbiAgY29uc3QgbW9kZWxTaXplcyA9IGdldE1vZGVsU2l6ZXMoY3VycmVudE1vZGVsKTtcclxuICBjb25zdCBkYWxsZTNRdWFsaXR5czogRGFsbGVRdWFsaXR5W10gPSBbXCJzdGFuZGFyZFwiLCBcImhkXCJdO1xyXG4gIGNvbnN0IGRhbGxlM1N0eWxlczogRGFsbGVTdHlsZVtdID0gW1widml2aWRcIiwgXCJuYXR1cmFsXCJdO1xyXG4gIGNvbnN0IGN1cnJlbnRTaXplID1cclxuICAgIHNlc3Npb24ubWFzay5tb2RlbENvbmZpZz8uc2l6ZSA/PyAoXCIxMDI0eDEwMjRcIiBhcyBNb2RlbFNpemUpO1xyXG4gIGNvbnN0IGN1cnJlbnRRdWFsaXR5ID0gc2Vzc2lvbi5tYXNrLm1vZGVsQ29uZmlnPy5xdWFsaXR5ID8/IFwic3RhbmRhcmRcIjtcclxuICBjb25zdCBjdXJyZW50U3R5bGUgPSBzZXNzaW9uLm1hc2subW9kZWxDb25maWc/LnN0eWxlID8/IFwidml2aWRcIjtcclxuXHJcbiAgY29uc3QgaXNNb2JpbGVTY3JlZW4gPSB1c2VNb2JpbGVTY3JlZW4oKTtcclxuXHJcbiAgdXNlRWZmZWN0KCgpID0+IHtcclxuICAgIGNvbnN0IHNob3cgPSBpc1Zpc2lvbk1vZGVsKGN1cnJlbnRNb2RlbCk7XHJcbiAgICBzZXRTaG93VXBsb2FkSW1hZ2Uoc2hvdyk7XHJcbiAgICBpZiAoIXNob3cpIHtcclxuICAgICAgcHJvcHMuc2V0QXR0YWNoSW1hZ2VzKFtdKTtcclxuICAgICAgcHJvcHMuc2V0VXBsb2FkaW5nKGZhbHNlKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBpZiBjdXJyZW50IG1vZGVsIGlzIG5vdCBhdmFpbGFibGVcclxuICAgIC8vIHN3aXRjaCB0byBmaXJzdCBhdmFpbGFibGUgbW9kZWxcclxuICAgIGNvbnN0IGlzVW5hdmFpbGFibGVNb2RlbCA9ICFtb2RlbHMuc29tZSgobSkgPT4gbS5uYW1lID09PSBjdXJyZW50TW9kZWwpO1xyXG4gICAgaWYgKGlzVW5hdmFpbGFibGVNb2RlbCAmJiBtb2RlbHMubGVuZ3RoID4gMCkge1xyXG4gICAgICAvLyBzaG93IG5leHQgbW9kZWwgdG8gZGVmYXVsdCBtb2RlbCBpZiBleGlzdFxyXG4gICAgICBsZXQgbmV4dE1vZGVsID0gbW9kZWxzLmZpbmQoKG1vZGVsKSA9PiBtb2RlbC5pc0RlZmF1bHQpIHx8IG1vZGVsc1swXTtcclxuICAgICAgY2hhdFN0b3JlLnVwZGF0ZVRhcmdldFNlc3Npb24oc2Vzc2lvbiwgKHNlc3Npb24pID0+IHtcclxuICAgICAgICBzZXNzaW9uLm1hc2subW9kZWxDb25maWcubW9kZWwgPSBuZXh0TW9kZWwubmFtZTtcclxuICAgICAgICBzZXNzaW9uLm1hc2subW9kZWxDb25maWcucHJvdmlkZXJOYW1lID0gbmV4dE1vZGVsPy5wcm92aWRlclxyXG4gICAgICAgICAgPy5wcm92aWRlck5hbWUgYXMgU2VydmljZVByb3ZpZGVyO1xyXG4gICAgICB9KTtcclxuICAgICAgc2hvd1RvYXN0KFxyXG4gICAgICAgIG5leHRNb2RlbD8ucHJvdmlkZXI/LnByb3ZpZGVyTmFtZSA9PSBcIkJ5dGVEYW5jZVwiXHJcbiAgICAgICAgICA/IG5leHRNb2RlbC5kaXNwbGF5TmFtZVxyXG4gICAgICAgICAgOiBuZXh0TW9kZWwubmFtZSxcclxuICAgICAgKTtcclxuICAgIH1cclxuICB9LCBbY2hhdFN0b3JlLCBjdXJyZW50TW9kZWwsIG1vZGVscywgc2Vzc2lvbl0pO1xyXG5cclxuICByZXR1cm4gKFxyXG4gICAgPGRpdiBjbGFzc05hbWU9e3N0eWxlc1tcImNoYXQtaW5wdXQtYWN0aW9uc1wiXX0+XHJcbiAgICAgIDw+XHJcbiAgICAgICAge2NvdWxkU3RvcCAmJiAoXHJcbiAgICAgICAgICA8Q2hhdEFjdGlvblxyXG4gICAgICAgICAgICBvbkNsaWNrPXtzdG9wQWxsfVxyXG4gICAgICAgICAgICB0ZXh0PXtMb2NhbGUuQ2hhdC5JbnB1dEFjdGlvbnMuU3RvcH1cclxuICAgICAgICAgICAgaWNvbj17PFN0b3BJY29uIC8+fVxyXG4gICAgICAgICAgLz5cclxuICAgICAgICApfVxyXG4gICAgICAgIHshcHJvcHMuaGl0Qm90dG9tICYmIChcclxuICAgICAgICAgIDxDaGF0QWN0aW9uXHJcbiAgICAgICAgICAgIG9uQ2xpY2s9e3Byb3BzLnNjcm9sbFRvQm90dG9tfVxyXG4gICAgICAgICAgICB0ZXh0PXtMb2NhbGUuQ2hhdC5JbnB1dEFjdGlvbnMuVG9Cb3R0b219XHJcbiAgICAgICAgICAgIGljb249ezxCb3R0b21JY29uIC8+fVxyXG4gICAgICAgICAgLz5cclxuICAgICAgICApfVxyXG4gICAgICAgIHtwcm9wcy5oaXRCb3R0b20gJiYgKFxyXG4gICAgICAgICAgPENoYXRBY3Rpb25cclxuICAgICAgICAgICAgb25DbGljaz17cHJvcHMuc2hvd1Byb21wdE1vZGFsfVxyXG4gICAgICAgICAgICB0ZXh0PXtMb2NhbGUuQ2hhdC5JbnB1dEFjdGlvbnMuU2V0dGluZ3N9XHJcbiAgICAgICAgICAgIGljb249ezxTZXR0aW5nc0ljb24gLz59XHJcbiAgICAgICAgICAvPlxyXG4gICAgICAgICl9XHJcblxyXG4gICAgICAgIHtzaG93VXBsb2FkSW1hZ2UgJiYgKFxyXG4gICAgICAgICAgPENoYXRBY3Rpb25cclxuICAgICAgICAgICAgb25DbGljaz17cHJvcHMudXBsb2FkSW1hZ2V9XHJcbiAgICAgICAgICAgIHRleHQ9e0xvY2FsZS5DaGF0LklucHV0QWN0aW9ucy5VcGxvYWRJbWFnZX1cclxuICAgICAgICAgICAgaWNvbj17cHJvcHMudXBsb2FkaW5nID8gPExvYWRpbmdCdXR0b25JY29uIC8+IDogPEltYWdlSWNvbiAvPn1cclxuICAgICAgICAgIC8+XHJcbiAgICAgICAgKX1cclxuXHJcbiAgICAgICAgPENoYXRBY3Rpb25cclxuICAgICAgICAgIG9uQ2xpY2s9eygpID0+IHNldFNob3dNb2RlbFNlbGVjdG9yKHRydWUpfVxyXG4gICAgICAgICAgdGV4dD17Y3VycmVudE1vZGVsTmFtZX1cclxuICAgICAgICAgIGljb249ezxSb2JvdEljb24gLz59XHJcbiAgICAgICAgLz5cclxuXHJcbiAgICAgICAge3Nob3dNb2RlbFNlbGVjdG9yICYmIChcclxuICAgICAgICAgIDxTZWxlY3RvclxyXG4gICAgICAgICAgICBkZWZhdWx0U2VsZWN0ZWRWYWx1ZT17YCR7Y3VycmVudE1vZGVsfUAke2N1cnJlbnRQcm92aWRlck5hbWV9YH1cclxuICAgICAgICAgICAgaXRlbXM9e21vZGVscy5tYXAoKG0pID0+ICh7XHJcbiAgICAgICAgICAgICAgdGl0bGU6IGAke20uZGlzcGxheU5hbWV9JHtcclxuICAgICAgICAgICAgICAgIG0/LnByb3ZpZGVyPy5wcm92aWRlck5hbWVcclxuICAgICAgICAgICAgICAgICAgPyBcIiAoXCIgKyBtPy5wcm92aWRlcj8ucHJvdmlkZXJOYW1lICsgXCIpXCJcclxuICAgICAgICAgICAgICAgICAgOiBcIlwiXHJcbiAgICAgICAgICAgICAgfWAsXHJcbiAgICAgICAgICAgICAgdmFsdWU6IGAke20ubmFtZX1AJHttPy5wcm92aWRlcj8ucHJvdmlkZXJOYW1lfWAsXHJcbiAgICAgICAgICAgIH0pKX1cclxuICAgICAgICAgICAgb25DbG9zZT17KCkgPT4gc2V0U2hvd01vZGVsU2VsZWN0b3IoZmFsc2UpfVxyXG4gICAgICAgICAgICBvblNlbGVjdGlvbj17KHMpID0+IHtcclxuICAgICAgICAgICAgICBpZiAocy5sZW5ndGggPT09IDApIHJldHVybjtcclxuICAgICAgICAgICAgICBjb25zdCBbbW9kZWwsIHByb3ZpZGVyTmFtZV0gPSBnZXRNb2RlbFByb3ZpZGVyKHNbMF0pO1xyXG4gICAgICAgICAgICAgIGNoYXRTdG9yZS51cGRhdGVUYXJnZXRTZXNzaW9uKHNlc3Npb24sIChzZXNzaW9uKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBzZXNzaW9uLm1hc2subW9kZWxDb25maWcubW9kZWwgPSBtb2RlbCBhcyBNb2RlbFR5cGU7XHJcbiAgICAgICAgICAgICAgICBzZXNzaW9uLm1hc2subW9kZWxDb25maWcucHJvdmlkZXJOYW1lID1cclxuICAgICAgICAgICAgICAgICAgcHJvdmlkZXJOYW1lIGFzIFNlcnZpY2VQcm92aWRlcjtcclxuICAgICAgICAgICAgICAgIHNlc3Npb24ubWFzay5zeW5jR2xvYmFsQ29uZmlnID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgaWYgKHByb3ZpZGVyTmFtZSA9PSBcIkJ5dGVEYW5jZVwiKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBzZWxlY3RlZE1vZGVsID0gbW9kZWxzLmZpbmQoXHJcbiAgICAgICAgICAgICAgICAgIChtKSA9PlxyXG4gICAgICAgICAgICAgICAgICAgIG0ubmFtZSA9PSBtb2RlbCAmJlxyXG4gICAgICAgICAgICAgICAgICAgIG0/LnByb3ZpZGVyPy5wcm92aWRlck5hbWUgPT0gcHJvdmlkZXJOYW1lLFxyXG4gICAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgICAgIHNob3dUb2FzdChzZWxlY3RlZE1vZGVsPy5kaXNwbGF5TmFtZSA/PyBcIlwiKTtcclxuICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgc2hvd1RvYXN0KG1vZGVsKTtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH19XHJcbiAgICAgICAgICAvPlxyXG4gICAgICAgICl9XHJcblxyXG4gICAgICAgIHtzdXBwb3J0c0N1c3RvbVNpemUoY3VycmVudE1vZGVsKSAmJiAoXHJcbiAgICAgICAgICA8Q2hhdEFjdGlvblxyXG4gICAgICAgICAgICBvbkNsaWNrPXsoKSA9PiBzZXRTaG93U2l6ZVNlbGVjdG9yKHRydWUpfVxyXG4gICAgICAgICAgICB0ZXh0PXtjdXJyZW50U2l6ZX1cclxuICAgICAgICAgICAgaWNvbj17PFNpemVJY29uIC8+fVxyXG4gICAgICAgICAgLz5cclxuICAgICAgICApfVxyXG5cclxuICAgICAgICB7c2hvd1NpemVTZWxlY3RvciAmJiAoXHJcbiAgICAgICAgICA8U2VsZWN0b3JcclxuICAgICAgICAgICAgZGVmYXVsdFNlbGVjdGVkVmFsdWU9e2N1cnJlbnRTaXplfVxyXG4gICAgICAgICAgICBpdGVtcz17bW9kZWxTaXplcy5tYXAoKG0pID0+ICh7XHJcbiAgICAgICAgICAgICAgdGl0bGU6IG0sXHJcbiAgICAgICAgICAgICAgdmFsdWU6IG0sXHJcbiAgICAgICAgICAgIH0pKX1cclxuICAgICAgICAgICAgb25DbG9zZT17KCkgPT4gc2V0U2hvd1NpemVTZWxlY3RvcihmYWxzZSl9XHJcbiAgICAgICAgICAgIG9uU2VsZWN0aW9uPXsocykgPT4ge1xyXG4gICAgICAgICAgICAgIGlmIChzLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xyXG4gICAgICAgICAgICAgIGNvbnN0IHNpemUgPSBzWzBdO1xyXG4gICAgICAgICAgICAgIGNoYXRTdG9yZS51cGRhdGVUYXJnZXRTZXNzaW9uKHNlc3Npb24sIChzZXNzaW9uKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBzZXNzaW9uLm1hc2subW9kZWxDb25maWcuc2l6ZSA9IHNpemU7XHJcbiAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgc2hvd1RvYXN0KHNpemUpO1xyXG4gICAgICAgICAgICB9fVxyXG4gICAgICAgICAgLz5cclxuICAgICAgICApfVxyXG5cclxuICAgICAgICB7aXNEYWxsZTMoY3VycmVudE1vZGVsKSAmJiAoXHJcbiAgICAgICAgICA8Q2hhdEFjdGlvblxyXG4gICAgICAgICAgICBvbkNsaWNrPXsoKSA9PiBzZXRTaG93UXVhbGl0eVNlbGVjdG9yKHRydWUpfVxyXG4gICAgICAgICAgICB0ZXh0PXtjdXJyZW50UXVhbGl0eX1cclxuICAgICAgICAgICAgaWNvbj17PFF1YWxpdHlJY29uIC8+fVxyXG4gICAgICAgICAgLz5cclxuICAgICAgICApfVxyXG5cclxuICAgICAgICB7c2hvd1F1YWxpdHlTZWxlY3RvciAmJiAoXHJcbiAgICAgICAgICA8U2VsZWN0b3JcclxuICAgICAgICAgICAgZGVmYXVsdFNlbGVjdGVkVmFsdWU9e2N1cnJlbnRRdWFsaXR5fVxyXG4gICAgICAgICAgICBpdGVtcz17ZGFsbGUzUXVhbGl0eXMubWFwKChtKSA9PiAoe1xyXG4gICAgICAgICAgICAgIHRpdGxlOiBtLFxyXG4gICAgICAgICAgICAgIHZhbHVlOiBtLFxyXG4gICAgICAgICAgICB9KSl9XHJcbiAgICAgICAgICAgIG9uQ2xvc2U9eygpID0+IHNldFNob3dRdWFsaXR5U2VsZWN0b3IoZmFsc2UpfVxyXG4gICAgICAgICAgICBvblNlbGVjdGlvbj17KHEpID0+IHtcclxuICAgICAgICAgICAgICBpZiAocS5sZW5ndGggPT09IDApIHJldHVybjtcclxuICAgICAgICAgICAgICBjb25zdCBxdWFsaXR5ID0gcVswXTtcclxuICAgICAgICAgICAgICBjaGF0U3RvcmUudXBkYXRlVGFyZ2V0U2Vzc2lvbihzZXNzaW9uLCAoc2Vzc2lvbikgPT4ge1xyXG4gICAgICAgICAgICAgICAgc2Vzc2lvbi5tYXNrLm1vZGVsQ29uZmlnLnF1YWxpdHkgPSBxdWFsaXR5O1xyXG4gICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgIHNob3dUb2FzdChxdWFsaXR5KTtcclxuICAgICAgICAgICAgfX1cclxuICAgICAgICAgIC8+XHJcbiAgICAgICAgKX1cclxuXHJcbiAgICAgICAge2lzRGFsbGUzKGN1cnJlbnRNb2RlbCkgJiYgKFxyXG4gICAgICAgICAgPENoYXRBY3Rpb25cclxuICAgICAgICAgICAgb25DbGljaz17KCkgPT4gc2V0U2hvd1N0eWxlU2VsZWN0b3IodHJ1ZSl9XHJcbiAgICAgICAgICAgIHRleHQ9e2N1cnJlbnRTdHlsZX1cclxuICAgICAgICAgICAgaWNvbj17PFN0eWxlSWNvbiAvPn1cclxuICAgICAgICAgIC8+XHJcbiAgICAgICAgKX1cclxuXHJcbiAgICAgICAge3Nob3dTdHlsZVNlbGVjdG9yICYmIChcclxuICAgICAgICAgIDxTZWxlY3RvclxyXG4gICAgICAgICAgICBkZWZhdWx0U2VsZWN0ZWRWYWx1ZT17Y3VycmVudFN0eWxlfVxyXG4gICAgICAgICAgICBpdGVtcz17ZGFsbGUzU3R5bGVzLm1hcCgobSkgPT4gKHtcclxuICAgICAgICAgICAgICB0aXRsZTogbSxcclxuICAgICAgICAgICAgICB2YWx1ZTogbSxcclxuICAgICAgICAgICAgfSkpfVxyXG4gICAgICAgICAgICBvbkNsb3NlPXsoKSA9PiBzZXRTaG93U3R5bGVTZWxlY3RvcihmYWxzZSl9XHJcbiAgICAgICAgICAgIG9uU2VsZWN0aW9uPXsocykgPT4ge1xyXG4gICAgICAgICAgICAgIGlmIChzLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xyXG4gICAgICAgICAgICAgIGNvbnN0IHN0eWxlID0gc1swXTtcclxuICAgICAgICAgICAgICBjaGF0U3RvcmUudXBkYXRlVGFyZ2V0U2Vzc2lvbihzZXNzaW9uLCAoc2Vzc2lvbikgPT4ge1xyXG4gICAgICAgICAgICAgICAgc2Vzc2lvbi5tYXNrLm1vZGVsQ29uZmlnLnN0eWxlID0gc3R5bGU7XHJcbiAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgc2hvd1RvYXN0KHN0eWxlKTtcclxuICAgICAgICAgICAgfX1cclxuICAgICAgICAgIC8+XHJcbiAgICAgICAgKX1cclxuXHJcbiAgICAgICAge3Nob3dQbHVnaW5zKGN1cnJlbnRQcm92aWRlck5hbWUsIGN1cnJlbnRNb2RlbCkgJiYgKFxyXG4gICAgICAgICAgPENoYXRBY3Rpb25cclxuICAgICAgICAgICAgb25DbGljaz17KCkgPT4ge1xyXG4gICAgICAgICAgICAgIGlmIChwbHVnaW5TdG9yZS5nZXRBbGwoKS5sZW5ndGggPT0gMCkge1xyXG4gICAgICAgICAgICAgICAgbmF2aWdhdGUoUGF0aC5QbHVnaW5zKTtcclxuICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgc2V0U2hvd1BsdWdpblNlbGVjdG9yKHRydWUpO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfX1cclxuICAgICAgICAgICAgdGV4dD17TG9jYWxlLlBsdWdpbi5OYW1lfVxyXG4gICAgICAgICAgICBpY29uPXs8UGx1Z2luSWNvbiAvPn1cclxuICAgICAgICAgIC8+XHJcbiAgICAgICAgKX1cclxuICAgICAgICB7c2hvd1BsdWdpblNlbGVjdG9yICYmIChcclxuICAgICAgICAgIDxTZWxlY3RvclxyXG4gICAgICAgICAgICBtdWx0aXBsZVxyXG4gICAgICAgICAgICBkZWZhdWx0U2VsZWN0ZWRWYWx1ZT17Y2hhdFN0b3JlLmN1cnJlbnRTZXNzaW9uKCkubWFzaz8ucGx1Z2lufVxyXG4gICAgICAgICAgICBpdGVtcz17cGx1Z2luU3RvcmUuZ2V0QWxsKCkubWFwKChpdGVtKSA9PiAoe1xyXG4gICAgICAgICAgICAgIHRpdGxlOiBgJHtpdGVtPy50aXRsZX1AJHtpdGVtPy52ZXJzaW9ufWAsXHJcbiAgICAgICAgICAgICAgdmFsdWU6IGl0ZW0/LmlkLFxyXG4gICAgICAgICAgICB9KSl9XHJcbiAgICAgICAgICAgIG9uQ2xvc2U9eygpID0+IHNldFNob3dQbHVnaW5TZWxlY3RvcihmYWxzZSl9XHJcbiAgICAgICAgICAgIG9uU2VsZWN0aW9uPXsocykgPT4ge1xyXG4gICAgICAgICAgICAgIGNoYXRTdG9yZS51cGRhdGVUYXJnZXRTZXNzaW9uKHNlc3Npb24sIChzZXNzaW9uKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBzZXNzaW9uLm1hc2sucGx1Z2luID0gcyBhcyBzdHJpbmdbXTtcclxuICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfX1cclxuICAgICAgICAgIC8+XHJcbiAgICAgICAgKX1cclxuXHJcbiAgICAgIDwvPlxyXG4gICAgICA8ZGl2IGNsYXNzTmFtZT17c3R5bGVzW1wiY2hhdC1pbnB1dC1hY3Rpb25zLWVuZFwiXX0+XHJcbiAgICAgICAge2NvbmZpZy5yZWFsdGltZUNvbmZpZy5lbmFibGUgJiYgKFxyXG4gICAgICAgICAgPENoYXRBY3Rpb25cclxuICAgICAgICAgICAgb25DbGljaz17KCkgPT4gcHJvcHMuc2V0U2hvd0NoYXRTaWRlUGFuZWwodHJ1ZSl9XHJcbiAgICAgICAgICAgIHRleHQ9e1wiUmVhbHRpbWUgQ2hhdFwifVxyXG4gICAgICAgICAgICBpY29uPXs8SGVhZHBob25lSWNvbiAvPn1cclxuICAgICAgICAgIC8+XHJcbiAgICAgICAgKX1cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuICApO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gRWRpdE1lc3NhZ2VNb2RhbChwcm9wczogeyBvbkNsb3NlOiAoKSA9PiB2b2lkIH0pIHtcclxuICBjb25zdCBjaGF0U3RvcmUgPSB1c2VDaGF0U3RvcmUoKTtcclxuICBjb25zdCBzZXNzaW9uID0gY2hhdFN0b3JlLmN1cnJlbnRTZXNzaW9uKCk7XHJcbiAgY29uc3QgW21lc3NhZ2VzLCBzZXRNZXNzYWdlc10gPSB1c2VTdGF0ZShzZXNzaW9uLm1lc3NhZ2VzLnNsaWNlKCkpO1xyXG5cclxuICByZXR1cm4gKFxyXG4gICAgPGRpdiBjbGFzc05hbWU9XCJtb2RhbC1tYXNrXCI+XHJcbiAgICAgIDxNb2RhbFxyXG4gICAgICAgIHRpdGxlPXtMb2NhbGUuQ2hhdC5FZGl0TWVzc2FnZS5UaXRsZX1cclxuICAgICAgICBvbkNsb3NlPXtwcm9wcy5vbkNsb3NlfVxyXG4gICAgICAgIGFjdGlvbnM9e1tcclxuICAgICAgICAgIDxJY29uQnV0dG9uXHJcbiAgICAgICAgICAgIHRleHQ9e0xvY2FsZS5VSS5DYW5jZWx9XHJcbiAgICAgICAgICAgIGljb249ezxDYW5jZWxJY29uIC8+fVxyXG4gICAgICAgICAgICBrZXk9XCJjYW5jZWxcIlxyXG4gICAgICAgICAgICBvbkNsaWNrPXsoKSA9PiB7XHJcbiAgICAgICAgICAgICAgcHJvcHMub25DbG9zZSgpO1xyXG4gICAgICAgICAgICB9fVxyXG4gICAgICAgICAgLz4sXHJcbiAgICAgICAgICA8SWNvbkJ1dHRvblxyXG4gICAgICAgICAgICB0eXBlPVwicHJpbWFyeVwiXHJcbiAgICAgICAgICAgIHRleHQ9e0xvY2FsZS5VSS5Db25maXJtfVxyXG4gICAgICAgICAgICBpY29uPXs8Q29uZmlybUljb24gLz59XHJcbiAgICAgICAgICAgIGtleT1cIm9rXCJcclxuICAgICAgICAgICAgb25DbGljaz17KCkgPT4ge1xyXG4gICAgICAgICAgICAgIGNoYXRTdG9yZS51cGRhdGVUYXJnZXRTZXNzaW9uKFxyXG4gICAgICAgICAgICAgICAgc2Vzc2lvbixcclxuICAgICAgICAgICAgICAgIChzZXNzaW9uKSA9PiAoc2Vzc2lvbi5tZXNzYWdlcyA9IG1lc3NhZ2VzKSxcclxuICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICAgIHByb3BzLm9uQ2xvc2UoKTtcclxuICAgICAgICAgICAgfX1cclxuICAgICAgICAgIC8+LFxyXG4gICAgICAgIF19XHJcbiAgICAgID5cclxuICAgICAgICA8TGlzdD5cclxuICAgICAgICAgIDxMaXN0SXRlbVxyXG4gICAgICAgICAgICB0aXRsZT17TG9jYWxlLkNoYXQuRWRpdE1lc3NhZ2UuVG9waWMuVGl0bGV9XHJcbiAgICAgICAgICAgIHN1YlRpdGxlPXtMb2NhbGUuQ2hhdC5FZGl0TWVzc2FnZS5Ub3BpYy5TdWJUaXRsZX1cclxuICAgICAgICAgID5cclxuICAgICAgICAgICAgPGlucHV0XHJcbiAgICAgICAgICAgICAgdHlwZT1cInRleHRcIlxyXG4gICAgICAgICAgICAgIHZhbHVlPXtzZXNzaW9uLnRvcGljfVxyXG4gICAgICAgICAgICAgIG9uSW5wdXQ9eyhlKSA9PlxyXG4gICAgICAgICAgICAgICAgY2hhdFN0b3JlLnVwZGF0ZVRhcmdldFNlc3Npb24oXHJcbiAgICAgICAgICAgICAgICAgIHNlc3Npb24sXHJcbiAgICAgICAgICAgICAgICAgIChzZXNzaW9uKSA9PiAoc2Vzc2lvbi50b3BpYyA9IGUuY3VycmVudFRhcmdldC52YWx1ZSksXHJcbiAgICAgICAgICAgICAgICApXHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICA+PC9pbnB1dD5cclxuICAgICAgICAgIDwvTGlzdEl0ZW0+XHJcbiAgICAgICAgPC9MaXN0PlxyXG4gICAgICAgIDxDb250ZXh0UHJvbXB0c1xyXG4gICAgICAgICAgY29udGV4dD17bWVzc2FnZXN9XHJcbiAgICAgICAgICB1cGRhdGVDb250ZXh0PXsodXBkYXRlcikgPT4ge1xyXG4gICAgICAgICAgICBjb25zdCBuZXdNZXNzYWdlcyA9IG1lc3NhZ2VzLnNsaWNlKCk7XHJcbiAgICAgICAgICAgIHVwZGF0ZXIobmV3TWVzc2FnZXMpO1xyXG4gICAgICAgICAgICBzZXRNZXNzYWdlcyhuZXdNZXNzYWdlcyk7XHJcbiAgICAgICAgICB9fVxyXG4gICAgICAgIC8+XHJcbiAgICAgIDwvTW9kYWw+XHJcbiAgICA8L2Rpdj5cclxuICApO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gRGVsZXRlSW1hZ2VCdXR0b24ocHJvcHM6IHsgZGVsZXRlSW1hZ2U6ICgpID0+IHZvaWQgfSkge1xyXG4gIHJldHVybiAoXHJcbiAgICA8ZGl2IGNsYXNzTmFtZT17c3R5bGVzW1wiZGVsZXRlLWltYWdlXCJdfSBvbkNsaWNrPXtwcm9wcy5kZWxldGVJbWFnZX0+XHJcbiAgICAgIDxEZWxldGVJY29uIC8+XHJcbiAgICA8L2Rpdj5cclxuICApO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gU2hvcnRjdXRLZXlNb2RhbChwcm9wczogeyBvbkNsb3NlOiAoKSA9PiB2b2lkIH0pIHtcclxuICBjb25zdCBpc01hYyA9IG5hdmlnYXRvci5wbGF0Zm9ybS50b1VwcGVyQ2FzZSgpLmluZGV4T2YoXCJNQUNcIikgPj0gMDtcclxuICBjb25zdCBzaG9ydGN1dHMgPSBbXHJcbiAgICB7XHJcbiAgICAgIHRpdGxlOiBMb2NhbGUuQ2hhdC5TaG9ydGN1dEtleS5uZXdDaGF0LFxyXG4gICAgICBrZXlzOiBpc01hYyA/IFtcIuKMmFwiLCBcIlNoaWZ0XCIsIFwiT1wiXSA6IFtcIkN0cmxcIiwgXCJTaGlmdFwiLCBcIk9cIl0sXHJcbiAgICB9LFxyXG4gICAgeyB0aXRsZTogTG9jYWxlLkNoYXQuU2hvcnRjdXRLZXkuZm9jdXNJbnB1dCwga2V5czogW1wiU2hpZnRcIiwgXCJFc2NcIl0gfSxcclxuICAgIHtcclxuICAgICAgdGl0bGU6IExvY2FsZS5DaGF0LlNob3J0Y3V0S2V5LmNvcHlMYXN0Q29kZSxcclxuICAgICAga2V5czogaXNNYWMgPyBbXCLijJhcIiwgXCJTaGlmdFwiLCBcIjtcIl0gOiBbXCJDdHJsXCIsIFwiU2hpZnRcIiwgXCI7XCJdLFxyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgdGl0bGU6IExvY2FsZS5DaGF0LlNob3J0Y3V0S2V5LmNvcHlMYXN0TWVzc2FnZSxcclxuICAgICAga2V5czogaXNNYWMgPyBbXCLijJhcIiwgXCJTaGlmdFwiLCBcIkNcIl0gOiBbXCJDdHJsXCIsIFwiU2hpZnRcIiwgXCJDXCJdLFxyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgdGl0bGU6IExvY2FsZS5DaGF0LlNob3J0Y3V0S2V5LnNob3dTaG9ydGN1dEtleSxcclxuICAgICAga2V5czogaXNNYWMgPyBbXCLijJhcIiwgXCIvXCJdIDogW1wiQ3RybFwiLCBcIi9cIl0sXHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICB0aXRsZTogTG9jYWxlLkNoYXQuU2hvcnRjdXRLZXkuY2xlYXJDb250ZXh0LFxyXG4gICAgICBrZXlzOiBpc01hY1xyXG4gICAgICAgID8gW1wi4oyYXCIsIFwiU2hpZnRcIiwgXCJiYWNrc3BhY2VcIl1cclxuICAgICAgICA6IFtcIkN0cmxcIiwgXCJTaGlmdFwiLCBcImJhY2tzcGFjZVwiXSxcclxuICAgIH0sXHJcbiAgXTtcclxuICByZXR1cm4gKFxyXG4gICAgPGRpdiBjbGFzc05hbWU9XCJtb2RhbC1tYXNrXCI+XHJcbiAgICAgIDxNb2RhbFxyXG4gICAgICAgIHRpdGxlPXtMb2NhbGUuQ2hhdC5TaG9ydGN1dEtleS5UaXRsZX1cclxuICAgICAgICBvbkNsb3NlPXtwcm9wcy5vbkNsb3NlfVxyXG4gICAgICAgIGFjdGlvbnM9e1tcclxuICAgICAgICAgIDxJY29uQnV0dG9uXHJcbiAgICAgICAgICAgIHR5cGU9XCJwcmltYXJ5XCJcclxuICAgICAgICAgICAgdGV4dD17TG9jYWxlLlVJLkNvbmZpcm19XHJcbiAgICAgICAgICAgIGljb249ezxDb25maXJtSWNvbiAvPn1cclxuICAgICAgICAgICAga2V5PVwib2tcIlxyXG4gICAgICAgICAgICBvbkNsaWNrPXsoKSA9PiB7XHJcbiAgICAgICAgICAgICAgcHJvcHMub25DbG9zZSgpO1xyXG4gICAgICAgICAgICB9fVxyXG4gICAgICAgICAgLz4sXHJcbiAgICAgICAgXX1cclxuICAgICAgPlxyXG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPXtzdHlsZXNbXCJzaG9ydGN1dC1rZXktY29udGFpbmVyXCJdfT5cclxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPXtzdHlsZXNbXCJzaG9ydGN1dC1rZXktZ3JpZFwiXX0+XHJcbiAgICAgICAgICAgIHtzaG9ydGN1dHMubWFwKChzaG9ydGN1dCwgaW5kZXgpID0+IChcclxuICAgICAgICAgICAgICA8ZGl2IGtleT17aW5kZXh9IGNsYXNzTmFtZT17c3R5bGVzW1wic2hvcnRjdXQta2V5LWl0ZW1cIl19PlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9e3N0eWxlc1tcInNob3J0Y3V0LWtleS10aXRsZVwiXX0+XHJcbiAgICAgICAgICAgICAgICAgIHtzaG9ydGN1dC50aXRsZX1cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9e3N0eWxlc1tcInNob3J0Y3V0LWtleS1rZXlzXCJdfT5cclxuICAgICAgICAgICAgICAgICAge3Nob3J0Y3V0LmtleXMubWFwKChrZXksIGkpID0+IChcclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGtleT17aX0gY2xhc3NOYW1lPXtzdHlsZXNbXCJzaG9ydGN1dC1rZXlcIl19PlxyXG4gICAgICAgICAgICAgICAgICAgICAgPHNwYW4+e2tleX08L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICkpfVxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICkpfVxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvTW9kYWw+XHJcbiAgICA8L2Rpdj5cclxuICApO1xyXG59XHJcblxyXG5mdW5jdGlvbiBfQ2hhdCgpIHtcclxuICB0eXBlIFJlbmRlck1lc3NhZ2UgPSBDaGF0TWVzc2FnZSAmIHsgcHJldmlldz86IGJvb2xlYW4gfTtcclxuXHJcbiAgY29uc3QgY2hhdFN0b3JlID0gdXNlQ2hhdFN0b3JlKCk7XHJcbiAgY29uc3Qgc2Vzc2lvbiA9IGNoYXRTdG9yZS5jdXJyZW50U2Vzc2lvbigpO1xyXG4gIGNvbnN0IGNvbmZpZyA9IHVzZUFwcENvbmZpZygpO1xyXG4gIGNvbnN0IGZvbnRTaXplID0gY29uZmlnLmZvbnRTaXplO1xyXG4gIGNvbnN0IGZvbnRGYW1pbHkgPSBjb25maWcuZm9udEZhbWlseTtcclxuXHJcbiAgY29uc3QgW3Nob3dFeHBvcnQsIHNldFNob3dFeHBvcnRdID0gdXNlU3RhdGUoZmFsc2UpO1xyXG5cclxuICBjb25zdCBpbnB1dFJlZiA9IHVzZVJlZjxIVE1MVGV4dEFyZWFFbGVtZW50PihudWxsKTtcclxuICBjb25zdCBbdXNlcklucHV0LCBzZXRVc2VySW5wdXRdID0gdXNlU3RhdGUoXCJcIik7XHJcbiAgY29uc3QgW2lzTG9hZGluZywgc2V0SXNMb2FkaW5nXSA9IHVzZVN0YXRlKGZhbHNlKTtcclxuICBjb25zdCB7IHN1Ym1pdEtleSwgc2hvdWxkU3VibWl0IH0gPSB1c2VTdWJtaXRIYW5kbGVyKCk7XHJcbiAgY29uc3Qgc2Nyb2xsUmVmID0gdXNlUmVmPEhUTUxEaXZFbGVtZW50PihudWxsKTtcclxuICBjb25zdCBpc1Njcm9sbGVkVG9Cb3R0b20gPSBzY3JvbGxSZWY/LmN1cnJlbnRcclxuICAgID8gTWF0aC5hYnMoXHJcbiAgICAgICAgc2Nyb2xsUmVmLmN1cnJlbnQuc2Nyb2xsSGVpZ2h0IC1cclxuICAgICAgICAgIChzY3JvbGxSZWYuY3VycmVudC5zY3JvbGxUb3AgKyBzY3JvbGxSZWYuY3VycmVudC5jbGllbnRIZWlnaHQpLFxyXG4gICAgICApIDw9IDFcclxuICAgIDogZmFsc2U7XHJcbiAgY29uc3QgaXNBdHRhY2hXaXRoVG9wID0gdXNlTWVtbygoKSA9PiB7XHJcbiAgICBjb25zdCBsYXN0TWVzc2FnZSA9IHNjcm9sbFJlZi5jdXJyZW50Py5sYXN0RWxlbWVudENoaWxkIGFzIEhUTUxFbGVtZW50O1xyXG4gICAgLy8gaWYgc2Nyb2xsbFJlZiBpcyBub3QgcmVhZHkgb3Igbm8gbWVzc2FnZSwgcmV0dXJuIGZhbHNlXHJcbiAgICBpZiAoIXNjcm9sbFJlZj8uY3VycmVudCB8fCAhbGFzdE1lc3NhZ2UpIHJldHVybiBmYWxzZTtcclxuICAgIGNvbnN0IHRvcERpc3RhbmNlID1cclxuICAgICAgbGFzdE1lc3NhZ2UhLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLnRvcCAtXHJcbiAgICAgIHNjcm9sbFJlZi5jdXJyZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLnRvcDtcclxuICAgIC8vIGxlYXZlIHNvbWUgc3BhY2UgZm9yIHVzZXIgcXVlc3Rpb25cclxuICAgIHJldHVybiB0b3BEaXN0YW5jZSA8IDEwMDtcclxuICB9LCBbc2Nyb2xsUmVmPy5jdXJyZW50Py5zY3JvbGxIZWlnaHRdKTtcclxuXHJcbiAgY29uc3QgaXNUeXBpbmcgPSB1c2VySW5wdXQgIT09IFwiXCI7XHJcblxyXG4gIC8vIGlmIHVzZXIgaXMgdHlwaW5nLCBzaG91bGQgYXV0byBzY3JvbGwgdG8gYm90dG9tXHJcbiAgLy8gaWYgdXNlciBpcyBub3QgdHlwaW5nLCBzaG91bGQgYXV0byBzY3JvbGwgdG8gYm90dG9tIG9ubHkgaWYgYWxyZWFkeSBhdCBib3R0b21cclxuICBjb25zdCB7IHNldEF1dG9TY3JvbGwsIHNjcm9sbERvbVRvQm90dG9tIH0gPSB1c2VTY3JvbGxUb0JvdHRvbShcclxuICAgIHNjcm9sbFJlZixcclxuICAgIChpc1Njcm9sbGVkVG9Cb3R0b20gfHwgaXNBdHRhY2hXaXRoVG9wKSAmJiAhaXNUeXBpbmcsXHJcbiAgICBzZXNzaW9uLm1lc3NhZ2VzLFxyXG4gICk7XHJcbiAgY29uc3QgW2hpdEJvdHRvbSwgc2V0SGl0Qm90dG9tXSA9IHVzZVN0YXRlKHRydWUpO1xyXG4gIGNvbnN0IGlzTW9iaWxlU2NyZWVuID0gdXNlTW9iaWxlU2NyZWVuKCk7XHJcbiAgY29uc3QgbmF2aWdhdGUgPSB1c2VOYXZpZ2F0ZSgpO1xyXG4gIGNvbnN0IFthdHRhY2hJbWFnZXMsIHNldEF0dGFjaEltYWdlc10gPSB1c2VTdGF0ZTxzdHJpbmdbXT4oW10pO1xyXG4gIGNvbnN0IFt1cGxvYWRpbmcsIHNldFVwbG9hZGluZ10gPSB1c2VTdGF0ZShmYWxzZSk7XHJcblxyXG4gIC8vIHByb21wdCBoaW50c1xyXG4gIGNvbnN0IHByb21wdFN0b3JlID0gdXNlUHJvbXB0U3RvcmUoKTtcclxuICBjb25zdCBbcHJvbXB0SGludHMsIHNldFByb21wdEhpbnRzXSA9IHVzZVN0YXRlPFJlbmRlclByb21wdFtdPihbXSk7XHJcbiAgY29uc3Qgb25TZWFyY2ggPSB1c2VEZWJvdW5jZWRDYWxsYmFjayhcclxuICAgICh0ZXh0OiBzdHJpbmcpID0+IHtcclxuICAgICAgY29uc3QgbWF0Y2hlZFByb21wdHMgPSBwcm9tcHRTdG9yZS5zZWFyY2godGV4dCk7XHJcbiAgICAgIHNldFByb21wdEhpbnRzKG1hdGNoZWRQcm9tcHRzKTtcclxuICAgIH0sXHJcbiAgICAxMDAsXHJcbiAgICB7IGxlYWRpbmc6IHRydWUsIHRyYWlsaW5nOiB0cnVlIH0sXHJcbiAgKTtcclxuXHJcbiAgLy8gYXV0byBncm93IGlucHV0XHJcbiAgY29uc3QgW2lucHV0Um93cywgc2V0SW5wdXRSb3dzXSA9IHVzZVN0YXRlKDIpO1xyXG4gIGNvbnN0IG1lYXN1cmUgPSB1c2VEZWJvdW5jZWRDYWxsYmFjayhcclxuICAgICgpID0+IHtcclxuICAgICAgY29uc3Qgcm93cyA9IGlucHV0UmVmLmN1cnJlbnQgPyBhdXRvR3Jvd1RleHRBcmVhKGlucHV0UmVmLmN1cnJlbnQpIDogMTtcclxuICAgICAgY29uc3QgaW5wdXRSb3dzID0gTWF0aC5taW4oXHJcbiAgICAgICAgMjAsXHJcbiAgICAgICAgTWF0aC5tYXgoMiArIE51bWJlcighaXNNb2JpbGVTY3JlZW4pLCByb3dzKSxcclxuICAgICAgKTtcclxuICAgICAgc2V0SW5wdXRSb3dzKGlucHV0Um93cyk7XHJcbiAgICB9LFxyXG4gICAgMTAwLFxyXG4gICAge1xyXG4gICAgICBsZWFkaW5nOiB0cnVlLFxyXG4gICAgICB0cmFpbGluZzogdHJ1ZSxcclxuICAgIH0sXHJcbiAgKTtcclxuXHJcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHJlYWN0LWhvb2tzL2V4aGF1c3RpdmUtZGVwc1xyXG4gIHVzZUVmZmVjdChtZWFzdXJlLCBbdXNlcklucHV0XSk7XHJcblxyXG4gIC8vIGNoYXQgY29tbWFuZHMgc2hvcnRjdXRzXHJcbiAgY29uc3QgY2hhdENvbW1hbmRzID0gdXNlQ2hhdENvbW1hbmQoe1xyXG4gICAgbmV3OiAoKSA9PiBjaGF0U3RvcmUubmV3U2Vzc2lvbigpLFxyXG4gICAgbmV3bTogKCkgPT4gbmF2aWdhdGUoUGF0aC5OZXdDaGF0KSxcclxuICAgIHByZXY6ICgpID0+IGNoYXRTdG9yZS5uZXh0U2Vzc2lvbigtMSksXHJcbiAgICBuZXh0OiAoKSA9PiBjaGF0U3RvcmUubmV4dFNlc3Npb24oMSksXHJcbiAgICBjbGVhcjogKCkgPT5cclxuICAgICAgY2hhdFN0b3JlLnVwZGF0ZVRhcmdldFNlc3Npb24oXHJcbiAgICAgICAgc2Vzc2lvbixcclxuICAgICAgICAoc2Vzc2lvbikgPT4gKHNlc3Npb24uY2xlYXJDb250ZXh0SW5kZXggPSBzZXNzaW9uLm1lc3NhZ2VzLmxlbmd0aCksXHJcbiAgICAgICksXHJcbiAgICBmb3JrOiAoKSA9PiBjaGF0U3RvcmUuZm9ya1Nlc3Npb24oKSxcclxuICAgIGRlbDogKCkgPT4gY2hhdFN0b3JlLmRlbGV0ZVNlc3Npb24oY2hhdFN0b3JlLmN1cnJlbnRTZXNzaW9uSW5kZXgpLFxyXG4gIH0pO1xyXG5cclxuICAvLyBvbmx5IHNlYXJjaCBwcm9tcHRzIHdoZW4gdXNlciBpbnB1dCBpcyBzaG9ydFxyXG4gIGNvbnN0IFNFQVJDSF9URVhUX0xJTUlUID0gMzA7XHJcbiAgY29uc3Qgb25JbnB1dCA9ICh0ZXh0OiBzdHJpbmcpID0+IHtcclxuICAgIHNldFVzZXJJbnB1dCh0ZXh0KTtcclxuICAgIGNvbnN0IG4gPSB0ZXh0LnRyaW0oKS5sZW5ndGg7XHJcblxyXG4gICAgLy8gY2xlYXIgc2VhcmNoIHJlc3VsdHNcclxuICAgIGlmIChuID09PSAwKSB7XHJcbiAgICAgIHNldFByb21wdEhpbnRzKFtdKTtcclxuICAgIH0gZWxzZSBpZiAodGV4dC5tYXRjaChDaGF0Q29tbWFuZFByZWZpeCkpIHtcclxuICAgICAgc2V0UHJvbXB0SGludHMoY2hhdENvbW1hbmRzLnNlYXJjaCh0ZXh0KSk7XHJcbiAgICB9IGVsc2UgaWYgKCFjb25maWcuZGlzYWJsZVByb21wdEhpbnQgJiYgbiA8IFNFQVJDSF9URVhUX0xJTUlUKSB7XHJcbiAgICAgIC8vIGNoZWNrIGlmIG5lZWQgdG8gdHJpZ2dlciBhdXRvIGNvbXBsZXRpb25cclxuICAgICAgaWYgKHRleHQuc3RhcnRzV2l0aChcIi9cIikpIHtcclxuICAgICAgICBsZXQgc2VhcmNoVGV4dCA9IHRleHQuc2xpY2UoMSk7XHJcbiAgICAgICAgb25TZWFyY2goc2VhcmNoVGV4dCk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9O1xyXG5cclxuICBjb25zdCBkb1N1Ym1pdCA9ICh1c2VySW5wdXQ6IHN0cmluZykgPT4ge1xyXG4gICAgaWYgKHVzZXJJbnB1dC50cmltKCkgPT09IFwiXCIgJiYgaXNFbXB0eShhdHRhY2hJbWFnZXMpKSByZXR1cm47XHJcbiAgICBjb25zdCBtYXRjaENvbW1hbmQgPSBjaGF0Q29tbWFuZHMubWF0Y2godXNlcklucHV0KTtcclxuICAgIGlmIChtYXRjaENvbW1hbmQubWF0Y2hlZCkge1xyXG4gICAgICBzZXRVc2VySW5wdXQoXCJcIik7XHJcbiAgICAgIHNldFByb21wdEhpbnRzKFtdKTtcclxuICAgICAgbWF0Y2hDb21tYW5kLmludm9rZSgpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBzZXRJc0xvYWRpbmcodHJ1ZSk7XHJcbiAgICBjaGF0U3RvcmVcclxuICAgICAgLm9uVXNlcklucHV0KHVzZXJJbnB1dCwgYXR0YWNoSW1hZ2VzKVxyXG4gICAgICAudGhlbigoKSA9PiBzZXRJc0xvYWRpbmcoZmFsc2UpKTtcclxuICAgIHNldEF0dGFjaEltYWdlcyhbXSk7XHJcbiAgICBjaGF0U3RvcmUuc2V0TGFzdElucHV0KHVzZXJJbnB1dCk7XHJcbiAgICBzZXRVc2VySW5wdXQoXCJcIik7XHJcbiAgICBzZXRQcm9tcHRIaW50cyhbXSk7XHJcbiAgICBpZiAoIWlzTW9iaWxlU2NyZWVuKSBpbnB1dFJlZi5jdXJyZW50Py5mb2N1cygpO1xyXG4gICAgc2V0QXV0b1Njcm9sbCh0cnVlKTtcclxuICB9O1xyXG5cclxuICBjb25zdCBvblByb21wdFNlbGVjdCA9IChwcm9tcHQ6IFJlbmRlclByb21wdCkgPT4ge1xyXG4gICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgIHNldFByb21wdEhpbnRzKFtdKTtcclxuXHJcbiAgICAgIGNvbnN0IG1hdGNoZWRDaGF0Q29tbWFuZCA9IGNoYXRDb21tYW5kcy5tYXRjaChwcm9tcHQuY29udGVudCk7XHJcbiAgICAgIGlmIChtYXRjaGVkQ2hhdENvbW1hbmQubWF0Y2hlZCkge1xyXG4gICAgICAgIC8vIGlmIHVzZXIgaXMgc2VsZWN0aW5nIGEgY2hhdCBjb21tYW5kLCBqdXN0IHRyaWdnZXIgaXRcclxuICAgICAgICBtYXRjaGVkQ2hhdENvbW1hbmQuaW52b2tlKCk7XHJcbiAgICAgICAgc2V0VXNlcklucHV0KFwiXCIpO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIC8vIG9yIGZpbGwgdGhlIHByb21wdFxyXG4gICAgICAgIHNldFVzZXJJbnB1dChwcm9tcHQuY29udGVudCk7XHJcbiAgICAgIH1cclxuICAgICAgaW5wdXRSZWYuY3VycmVudD8uZm9jdXMoKTtcclxuICAgIH0sIDMwKTtcclxuICB9O1xyXG5cclxuICAvLyBzdG9wIHJlc3BvbnNlXHJcbiAgY29uc3Qgb25Vc2VyU3RvcCA9IChtZXNzYWdlSWQ6IHN0cmluZykgPT4ge1xyXG4gICAgQ2hhdENvbnRyb2xsZXJQb29sLnN0b3Aoc2Vzc2lvbi5pZCwgbWVzc2FnZUlkKTtcclxuICB9O1xyXG5cclxuICB1c2VFZmZlY3QoKCkgPT4ge1xyXG4gICAgY2hhdFN0b3JlLnVwZGF0ZVRhcmdldFNlc3Npb24oc2Vzc2lvbiwgKHNlc3Npb24pID0+IHtcclxuICAgICAgY29uc3Qgc3RvcFRpbWluZyA9IERhdGUubm93KCkgLSBSRVFVRVNUX1RJTUVPVVRfTVM7XHJcbiAgICAgIHNlc3Npb24ubWVzc2FnZXMuZm9yRWFjaCgobSkgPT4ge1xyXG4gICAgICAgIC8vIGNoZWNrIGlmIHNob3VsZCBzdG9wIGFsbCBzdGFsZSBtZXNzYWdlc1xyXG4gICAgICAgIGlmIChtLmlzRXJyb3IgfHwgbmV3IERhdGUobS5kYXRlKS5nZXRUaW1lKCkgPCBzdG9wVGltaW5nKSB7XHJcbiAgICAgICAgICBpZiAobS5zdHJlYW1pbmcpIHtcclxuICAgICAgICAgICAgbS5zdHJlYW1pbmcgPSBmYWxzZTtcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICBpZiAobS5jb250ZW50Lmxlbmd0aCA9PT0gMCkge1xyXG4gICAgICAgICAgICBtLmlzRXJyb3IgPSB0cnVlO1xyXG4gICAgICAgICAgICBtLmNvbnRlbnQgPSBwcmV0dHlPYmplY3Qoe1xyXG4gICAgICAgICAgICAgIGVycm9yOiB0cnVlLFxyXG4gICAgICAgICAgICAgIG1lc3NhZ2U6IFwiZW1wdHkgcmVzcG9uc2VcIixcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuXHJcbiAgICAgIC8vIGF1dG8gc3luYyBtYXNrIGNvbmZpZyBmcm9tIGdsb2JhbCBjb25maWdcclxuICAgICAgaWYgKHNlc3Npb24ubWFzay5zeW5jR2xvYmFsQ29uZmlnKSB7XHJcbiAgICAgICAgY29uc29sZS5sb2coXCJbTWFza10gc3luY2luZyBmcm9tIGdsb2JhbCwgbmFtZSA9IFwiLCBzZXNzaW9uLm1hc2submFtZSk7XHJcbiAgICAgICAgc2Vzc2lvbi5tYXNrLm1vZGVsQ29uZmlnID0geyAuLi5jb25maWcubW9kZWxDb25maWcgfTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcmVhY3QtaG9va3MvZXhoYXVzdGl2ZS1kZXBzXHJcbiAgfSwgW3Nlc3Npb25dKTtcclxuXHJcbiAgLy8gY2hlY2sgaWYgc2hvdWxkIHNlbmQgbWVzc2FnZVxyXG4gIGNvbnN0IG9uSW5wdXRLZXlEb3duID0gKGU6IFJlYWN0LktleWJvYXJkRXZlbnQ8SFRNTFRleHRBcmVhRWxlbWVudD4pID0+IHtcclxuICAgIC8vIGlmIEFycm93VXAgYW5kIG5vIHVzZXJJbnB1dCwgZmlsbCB3aXRoIGxhc3QgaW5wdXRcclxuICAgIGlmIChcclxuICAgICAgZS5rZXkgPT09IFwiQXJyb3dVcFwiICYmXHJcbiAgICAgIHVzZXJJbnB1dC5sZW5ndGggPD0gMCAmJlxyXG4gICAgICAhKGUubWV0YUtleSB8fCBlLmFsdEtleSB8fCBlLmN0cmxLZXkpXHJcbiAgICApIHtcclxuICAgICAgc2V0VXNlcklucHV0KGNoYXRTdG9yZS5sYXN0SW5wdXQgPz8gXCJcIik7XHJcbiAgICAgIGUucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgaWYgKHNob3VsZFN1Ym1pdChlKSAmJiBwcm9tcHRIaW50cy5sZW5ndGggPT09IDApIHtcclxuICAgICAgZG9TdWJtaXQodXNlcklucHV0KTtcclxuICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgfVxyXG4gIH07XHJcbiAgY29uc3Qgb25SaWdodENsaWNrID0gKGU6IGFueSwgbWVzc2FnZTogQ2hhdE1lc3NhZ2UpID0+IHtcclxuICAgIC8vIGNvcHkgdG8gY2xpcGJvYXJkXHJcbiAgICBpZiAoc2VsZWN0T3JDb3B5KGUuY3VycmVudFRhcmdldCwgZ2V0TWVzc2FnZVRleHRDb250ZW50KG1lc3NhZ2UpKSkge1xyXG4gICAgICBpZiAodXNlcklucHV0Lmxlbmd0aCA9PT0gMCkge1xyXG4gICAgICAgIHNldFVzZXJJbnB1dChnZXRNZXNzYWdlVGV4dENvbnRlbnQobWVzc2FnZSkpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBlLnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICB9XHJcbiAgfTtcclxuXHJcbiAgY29uc3QgZGVsZXRlTWVzc2FnZSA9IChtc2dJZD86IHN0cmluZykgPT4ge1xyXG4gICAgY2hhdFN0b3JlLnVwZGF0ZVRhcmdldFNlc3Npb24oXHJcbiAgICAgIHNlc3Npb24sXHJcbiAgICAgIChzZXNzaW9uKSA9PlxyXG4gICAgICAgIChzZXNzaW9uLm1lc3NhZ2VzID0gc2Vzc2lvbi5tZXNzYWdlcy5maWx0ZXIoKG0pID0+IG0uaWQgIT09IG1zZ0lkKSksXHJcbiAgICApO1xyXG4gIH07XHJcblxyXG4gIGNvbnN0IG9uRGVsZXRlID0gKG1zZ0lkOiBzdHJpbmcpID0+IHtcclxuICAgIGRlbGV0ZU1lc3NhZ2UobXNnSWQpO1xyXG4gIH07XHJcblxyXG4gIGNvbnN0IG9uUmVzZW5kID0gKG1lc3NhZ2U6IENoYXRNZXNzYWdlKSA9PiB7XHJcbiAgICAvLyB3aGVuIGl0IGlzIHJlc2VuZGluZyBhIG1lc3NhZ2VcclxuICAgIC8vIDEuIGZvciBhIHVzZXIncyBtZXNzYWdlLCBmaW5kIHRoZSBuZXh0IGJvdCByZXNwb25zZVxyXG4gICAgLy8gMi4gZm9yIGEgYm90J3MgbWVzc2FnZSwgZmluZCB0aGUgbGFzdCB1c2VyJ3MgaW5wdXRcclxuICAgIC8vIDMuIGRlbGV0ZSBvcmlnaW5hbCB1c2VyIGlucHV0IGFuZCBib3QncyBtZXNzYWdlXHJcbiAgICAvLyA0LiByZXNlbmQgdGhlIHVzZXIncyBpbnB1dFxyXG5cclxuICAgIGNvbnN0IHJlc2VuZGluZ0luZGV4ID0gc2Vzc2lvbi5tZXNzYWdlcy5maW5kSW5kZXgoXHJcbiAgICAgIChtKSA9PiBtLmlkID09PSBtZXNzYWdlLmlkLFxyXG4gICAgKTtcclxuXHJcbiAgICBpZiAocmVzZW5kaW5nSW5kZXggPCAwIHx8IHJlc2VuZGluZ0luZGV4ID49IHNlc3Npb24ubWVzc2FnZXMubGVuZ3RoKSB7XHJcbiAgICAgIGNvbnNvbGUuZXJyb3IoXCJbQ2hhdF0gZmFpbGVkIHRvIGZpbmQgcmVzZW5kaW5nIG1lc3NhZ2VcIiwgbWVzc2FnZSk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBsZXQgdXNlck1lc3NhZ2U6IENoYXRNZXNzYWdlIHwgdW5kZWZpbmVkO1xyXG4gICAgbGV0IGJvdE1lc3NhZ2U6IENoYXRNZXNzYWdlIHwgdW5kZWZpbmVkO1xyXG5cclxuICAgIGlmIChtZXNzYWdlLnJvbGUgPT09IFwiYXNzaXN0YW50XCIpIHtcclxuICAgICAgLy8gaWYgaXQgaXMgcmVzZW5kaW5nIGEgYm90J3MgbWVzc2FnZSwgZmluZCB0aGUgdXNlciBpbnB1dCBmb3IgaXRcclxuICAgICAgYm90TWVzc2FnZSA9IG1lc3NhZ2U7XHJcbiAgICAgIGZvciAobGV0IGkgPSByZXNlbmRpbmdJbmRleDsgaSA+PSAwOyBpIC09IDEpIHtcclxuICAgICAgICBpZiAoc2Vzc2lvbi5tZXNzYWdlc1tpXS5yb2xlID09PSBcInVzZXJcIikge1xyXG4gICAgICAgICAgdXNlck1lc3NhZ2UgPSBzZXNzaW9uLm1lc3NhZ2VzW2ldO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9IGVsc2UgaWYgKG1lc3NhZ2Uucm9sZSA9PT0gXCJ1c2VyXCIpIHtcclxuICAgICAgLy8gaWYgaXQgaXMgcmVzZW5kaW5nIGEgdXNlcidzIGlucHV0LCBmaW5kIHRoZSBib3QncyByZXNwb25zZVxyXG4gICAgICB1c2VyTWVzc2FnZSA9IG1lc3NhZ2U7XHJcbiAgICAgIGZvciAobGV0IGkgPSByZXNlbmRpbmdJbmRleDsgaSA8IHNlc3Npb24ubWVzc2FnZXMubGVuZ3RoOyBpICs9IDEpIHtcclxuICAgICAgICBpZiAoc2Vzc2lvbi5tZXNzYWdlc1tpXS5yb2xlID09PSBcImFzc2lzdGFudFwiKSB7XHJcbiAgICAgICAgICBib3RNZXNzYWdlID0gc2Vzc2lvbi5tZXNzYWdlc1tpXTtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGlmICh1c2VyTWVzc2FnZSA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgIGNvbnNvbGUuZXJyb3IoXCJbQ2hhdF0gZmFpbGVkIHRvIHJlc2VuZFwiLCBtZXNzYWdlKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIGRlbGV0ZSB0aGUgb3JpZ2luYWwgbWVzc2FnZXNcclxuICAgIGRlbGV0ZU1lc3NhZ2UodXNlck1lc3NhZ2UuaWQpO1xyXG4gICAgZGVsZXRlTWVzc2FnZShib3RNZXNzYWdlPy5pZCk7XHJcblxyXG4gICAgLy8gcmVzZW5kIHRoZSBtZXNzYWdlXHJcbiAgICBzZXRJc0xvYWRpbmcodHJ1ZSk7XHJcbiAgICBjb25zdCB0ZXh0Q29udGVudCA9IGdldE1lc3NhZ2VUZXh0Q29udGVudCh1c2VyTWVzc2FnZSk7XHJcbiAgICBjb25zdCBpbWFnZXMgPSBnZXRNZXNzYWdlSW1hZ2VzKHVzZXJNZXNzYWdlKTtcclxuICAgIGNoYXRTdG9yZS5vblVzZXJJbnB1dCh0ZXh0Q29udGVudCwgaW1hZ2VzKS50aGVuKCgpID0+IHNldElzTG9hZGluZyhmYWxzZSkpO1xyXG4gICAgaW5wdXRSZWYuY3VycmVudD8uZm9jdXMoKTtcclxuICB9O1xyXG5cclxuICBjb25zdCBvblBpbk1lc3NhZ2UgPSAobWVzc2FnZTogQ2hhdE1lc3NhZ2UpID0+IHtcclxuICAgIGNoYXRTdG9yZS51cGRhdGVUYXJnZXRTZXNzaW9uKHNlc3Npb24sIChzZXNzaW9uKSA9PlxyXG4gICAgICBzZXNzaW9uLm1hc2suY29udGV4dC5wdXNoKG1lc3NhZ2UpLFxyXG4gICAgKTtcclxuXHJcbiAgICBzaG93VG9hc3QoTG9jYWxlLkNoYXQuQWN0aW9ucy5QaW5Ub2FzdENvbnRlbnQsIHtcclxuICAgICAgdGV4dDogTG9jYWxlLkNoYXQuQWN0aW9ucy5QaW5Ub2FzdEFjdGlvbixcclxuICAgICAgb25DbGljazogKCkgPT4ge1xyXG4gICAgICAgIHNldFNob3dQcm9tcHRNb2RhbCh0cnVlKTtcclxuICAgICAgfSxcclxuICAgIH0pO1xyXG4gIH07XHJcblxyXG4gIGNvbnN0IGFjY2Vzc1N0b3JlID0gdXNlQWNjZXNzU3RvcmUoKTtcclxuICBjb25zdCBbc3BlZWNoU3RhdHVzLCBzZXRTcGVlY2hTdGF0dXNdID0gdXNlU3RhdGUoZmFsc2UpO1xyXG4gIGNvbnN0IFtzcGVlY2hMb2FkaW5nLCBzZXRTcGVlY2hMb2FkaW5nXSA9IHVzZVN0YXRlKGZhbHNlKTtcclxuXHJcbiAgYXN5bmMgZnVuY3Rpb24gb3BlbmFpU3BlZWNoKHRleHQ6IHN0cmluZykge1xyXG4gICAgaWYgKHNwZWVjaFN0YXR1cykge1xyXG4gICAgICB0dHNQbGF5ZXIuc3RvcCgpO1xyXG4gICAgICBzZXRTcGVlY2hTdGF0dXMoZmFsc2UpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdmFyIGFwaTogQ2xpZW50QXBpO1xyXG4gICAgICBhcGkgPSBuZXcgQ2xpZW50QXBpKE1vZGVsUHJvdmlkZXIuR1BUKTtcclxuICAgICAgY29uc3QgY29uZmlnID0gdXNlQXBwQ29uZmlnLmdldFN0YXRlKCk7XHJcbiAgICAgIHNldFNwZWVjaExvYWRpbmcodHJ1ZSk7XHJcbiAgICAgIHR0c1BsYXllci5pbml0KCk7XHJcbiAgICAgIGxldCBhdWRpb0J1ZmZlcjogQXJyYXlCdWZmZXI7XHJcbiAgICAgIGNvbnN0IHsgbWFya2Rvd25Ub1R4dCB9ID0gcmVxdWlyZShcIm1hcmtkb3duLXRvLXR4dFwiKTtcclxuICAgICAgY29uc3QgdGV4dENvbnRlbnQgPSBtYXJrZG93blRvVHh0KHRleHQpO1xyXG4gICAgICBpZiAoY29uZmlnLnR0c0NvbmZpZy5lbmdpbmUgIT09IERFRkFVTFRfVFRTX0VOR0lORSkge1xyXG4gICAgICAgIGNvbnN0IGVkZ2VWb2ljZU5hbWUgPSBhY2Nlc3NTdG9yZS5lZGdlVm9pY2VOYW1lKCk7XHJcbiAgICAgICAgY29uc3QgdHRzID0gbmV3IE1zRWRnZVRUUygpO1xyXG4gICAgICAgIGF3YWl0IHR0cy5zZXRNZXRhZGF0YShcclxuICAgICAgICAgIGVkZ2VWb2ljZU5hbWUsXHJcbiAgICAgICAgICBPVVRQVVRfRk9STUFULkFVRElPXzI0S0haXzk2S0JJVFJBVEVfTU9OT19NUDMsXHJcbiAgICAgICAgKTtcclxuICAgICAgICBhdWRpb0J1ZmZlciA9IGF3YWl0IHR0cy50b0FycmF5QnVmZmVyKHRleHRDb250ZW50KTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBhdWRpb0J1ZmZlciA9IGF3YWl0IGFwaS5sbG0uc3BlZWNoKHtcclxuICAgICAgICAgIG1vZGVsOiBjb25maWcudHRzQ29uZmlnLm1vZGVsLFxyXG4gICAgICAgICAgaW5wdXQ6IHRleHRDb250ZW50LFxyXG4gICAgICAgICAgdm9pY2U6IGNvbmZpZy50dHNDb25maWcudm9pY2UsXHJcbiAgICAgICAgICBzcGVlZDogY29uZmlnLnR0c0NvbmZpZy5zcGVlZCxcclxuICAgICAgICB9KTtcclxuICAgICAgfVxyXG4gICAgICBzZXRTcGVlY2hTdGF0dXModHJ1ZSk7XHJcbiAgICAgIHR0c1BsYXllclxyXG4gICAgICAgIC5wbGF5KGF1ZGlvQnVmZmVyLCAoKSA9PiB7XHJcbiAgICAgICAgICBzZXRTcGVlY2hTdGF0dXMoZmFsc2UpO1xyXG4gICAgICAgIH0pXHJcbiAgICAgICAgLmNhdGNoKChlKSA9PiB7XHJcbiAgICAgICAgICBjb25zb2xlLmVycm9yKFwiW09wZW5BSSBTcGVlY2hdXCIsIGUpO1xyXG4gICAgICAgICAgc2hvd1RvYXN0KHByZXR0eU9iamVjdChlKSk7XHJcbiAgICAgICAgICBzZXRTcGVlY2hTdGF0dXMoZmFsc2UpO1xyXG4gICAgICAgIH0pXHJcbiAgICAgICAgLmZpbmFsbHkoKCkgPT4gc2V0U3BlZWNoTG9hZGluZyhmYWxzZSkpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgY29uc3QgY29udGV4dDogUmVuZGVyTWVzc2FnZVtdID0gdXNlTWVtbygoKSA9PiB7XHJcbiAgICByZXR1cm4gc2Vzc2lvbi5tYXNrLmhpZGVDb250ZXh0ID8gW10gOiBzZXNzaW9uLm1hc2suY29udGV4dC5zbGljZSgpO1xyXG4gIH0sIFtzZXNzaW9uLm1hc2suY29udGV4dCwgc2Vzc2lvbi5tYXNrLmhpZGVDb250ZXh0XSk7XHJcblxyXG4gIGlmIChcclxuICAgIGNvbnRleHQubGVuZ3RoID09PSAwICYmXHJcbiAgICBzZXNzaW9uLm1lc3NhZ2VzLmF0KDApPy5jb250ZW50ICE9PSBCT1RfSEVMTE8uY29udGVudFxyXG4gICkge1xyXG4gICAgY29uc3QgY29waWVkSGVsbG8gPSBPYmplY3QuYXNzaWduKHt9LCBCT1RfSEVMTE8pO1xyXG4gICAgaWYgKCFhY2Nlc3NTdG9yZS5pc0F1dGhvcml6ZWQoKSkge1xyXG4gICAgICBjb3BpZWRIZWxsby5jb250ZW50ID0gTG9jYWxlLkVycm9yLlVuYXV0aG9yaXplZDtcclxuICAgIH1cclxuICAgIGNvbnRleHQucHVzaChjb3BpZWRIZWxsbyk7XHJcbiAgfVxyXG5cclxuICAvLyBwcmV2aWV3IG1lc3NhZ2VzXHJcbiAgY29uc3QgcmVuZGVyTWVzc2FnZXMgPSB1c2VNZW1vKCgpID0+IHtcclxuICAgIHJldHVybiBjb250ZXh0XHJcbiAgICAgIC5jb25jYXQoc2Vzc2lvbi5tZXNzYWdlcyBhcyBSZW5kZXJNZXNzYWdlW10pXHJcbiAgICAgIC5jb25jYXQoXHJcbiAgICAgICAgaXNMb2FkaW5nXHJcbiAgICAgICAgICA/IFtcclxuICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAuLi5jcmVhdGVNZXNzYWdlKHtcclxuICAgICAgICAgICAgICAgICAgcm9sZTogXCJhc3Npc3RhbnRcIixcclxuICAgICAgICAgICAgICAgICAgY29udGVudDogXCLigKbigKZcIixcclxuICAgICAgICAgICAgICAgIH0pLFxyXG4gICAgICAgICAgICAgICAgcHJldmlldzogdHJ1ZSxcclxuICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBdXHJcbiAgICAgICAgICA6IFtdLFxyXG4gICAgICApXHJcbiAgICAgIC5jb25jYXQoXHJcbiAgICAgICAgdXNlcklucHV0Lmxlbmd0aCA+IDAgJiYgY29uZmlnLnNlbmRQcmV2aWV3QnViYmxlXHJcbiAgICAgICAgICA/IFtcclxuICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAuLi5jcmVhdGVNZXNzYWdlKHtcclxuICAgICAgICAgICAgICAgICAgcm9sZTogXCJ1c2VyXCIsXHJcbiAgICAgICAgICAgICAgICAgIGNvbnRlbnQ6IHVzZXJJbnB1dCxcclxuICAgICAgICAgICAgICAgIH0pLFxyXG4gICAgICAgICAgICAgICAgcHJldmlldzogdHJ1ZSxcclxuICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBdXHJcbiAgICAgICAgICA6IFtdLFxyXG4gICAgICApO1xyXG4gIH0sIFtcclxuICAgIGNvbmZpZy5zZW5kUHJldmlld0J1YmJsZSxcclxuICAgIGNvbnRleHQsXHJcbiAgICBpc0xvYWRpbmcsXHJcbiAgICBzZXNzaW9uLm1lc3NhZ2VzLFxyXG4gICAgdXNlcklucHV0LFxyXG4gIF0pO1xyXG5cclxuICBjb25zdCBbbXNnUmVuZGVySW5kZXgsIF9zZXRNc2dSZW5kZXJJbmRleF0gPSB1c2VTdGF0ZShcclxuICAgIE1hdGgubWF4KDAsIHJlbmRlck1lc3NhZ2VzLmxlbmd0aCAtIENIQVRfUEFHRV9TSVpFKSxcclxuICApO1xyXG5cclxuICBmdW5jdGlvbiBzZXRNc2dSZW5kZXJJbmRleChuZXdJbmRleDogbnVtYmVyKSB7XHJcbiAgICBuZXdJbmRleCA9IE1hdGgubWluKHJlbmRlck1lc3NhZ2VzLmxlbmd0aCAtIENIQVRfUEFHRV9TSVpFLCBuZXdJbmRleCk7XHJcbiAgICBuZXdJbmRleCA9IE1hdGgubWF4KDAsIG5ld0luZGV4KTtcclxuICAgIF9zZXRNc2dSZW5kZXJJbmRleChuZXdJbmRleCk7XHJcbiAgfVxyXG5cclxuICBjb25zdCBtZXNzYWdlcyA9IHVzZU1lbW8oKCkgPT4ge1xyXG4gICAgY29uc3QgZW5kUmVuZGVySW5kZXggPSBNYXRoLm1pbihcclxuICAgICAgbXNnUmVuZGVySW5kZXggKyAzICogQ0hBVF9QQUdFX1NJWkUsXHJcbiAgICAgIHJlbmRlck1lc3NhZ2VzLmxlbmd0aCxcclxuICAgICk7XHJcbiAgICByZXR1cm4gcmVuZGVyTWVzc2FnZXMuc2xpY2UobXNnUmVuZGVySW5kZXgsIGVuZFJlbmRlckluZGV4KTtcclxuICB9LCBbbXNnUmVuZGVySW5kZXgsIHJlbmRlck1lc3NhZ2VzXSk7XHJcblxyXG4gIGNvbnN0IG9uQ2hhdEJvZHlTY3JvbGwgPSAoZTogSFRNTEVsZW1lbnQpID0+IHtcclxuICAgIGNvbnN0IGJvdHRvbUhlaWdodCA9IGUuc2Nyb2xsVG9wICsgZS5jbGllbnRIZWlnaHQ7XHJcbiAgICBjb25zdCBlZGdlVGhyZXNob2xkID0gZS5jbGllbnRIZWlnaHQ7XHJcblxyXG4gICAgY29uc3QgaXNUb3VjaFRvcEVkZ2UgPSBlLnNjcm9sbFRvcCA8PSBlZGdlVGhyZXNob2xkO1xyXG4gICAgY29uc3QgaXNUb3VjaEJvdHRvbUVkZ2UgPSBib3R0b21IZWlnaHQgPj0gZS5zY3JvbGxIZWlnaHQgLSBlZGdlVGhyZXNob2xkO1xyXG4gICAgY29uc3QgaXNIaXRCb3R0b20gPVxyXG4gICAgICBib3R0b21IZWlnaHQgPj0gZS5zY3JvbGxIZWlnaHQgLSAoaXNNb2JpbGVTY3JlZW4gPyA0IDogMTApO1xyXG5cclxuICAgIGNvbnN0IHByZXZQYWdlTXNnSW5kZXggPSBtc2dSZW5kZXJJbmRleCAtIENIQVRfUEFHRV9TSVpFO1xyXG4gICAgY29uc3QgbmV4dFBhZ2VNc2dJbmRleCA9IG1zZ1JlbmRlckluZGV4ICsgQ0hBVF9QQUdFX1NJWkU7XHJcblxyXG4gICAgaWYgKGlzVG91Y2hUb3BFZGdlICYmICFpc1RvdWNoQm90dG9tRWRnZSkge1xyXG4gICAgICBzZXRNc2dSZW5kZXJJbmRleChwcmV2UGFnZU1zZ0luZGV4KTtcclxuICAgIH0gZWxzZSBpZiAoaXNUb3VjaEJvdHRvbUVkZ2UpIHtcclxuICAgICAgc2V0TXNnUmVuZGVySW5kZXgobmV4dFBhZ2VNc2dJbmRleCk7XHJcbiAgICB9XHJcblxyXG4gICAgc2V0SGl0Qm90dG9tKGlzSGl0Qm90dG9tKTtcclxuICAgIHNldEF1dG9TY3JvbGwoaXNIaXRCb3R0b20pO1xyXG4gIH07XHJcblxyXG4gIGZ1bmN0aW9uIHNjcm9sbFRvQm90dG9tKCkge1xyXG4gICAgc2V0TXNnUmVuZGVySW5kZXgocmVuZGVyTWVzc2FnZXMubGVuZ3RoIC0gQ0hBVF9QQUdFX1NJWkUpO1xyXG4gICAgc2Nyb2xsRG9tVG9Cb3R0b20oKTtcclxuICB9XHJcblxyXG4gIC8vIGNsZWFyIGNvbnRleHQgaW5kZXggPSBjb250ZXh0IGxlbmd0aCArIGluZGV4IGluIG1lc3NhZ2VzXHJcbiAgY29uc3QgY2xlYXJDb250ZXh0SW5kZXggPVxyXG4gICAgKHNlc3Npb24uY2xlYXJDb250ZXh0SW5kZXggPz8gLTEpID49IDBcclxuICAgICAgPyBzZXNzaW9uLmNsZWFyQ29udGV4dEluZGV4ISArIGNvbnRleHQubGVuZ3RoIC0gbXNnUmVuZGVySW5kZXhcclxuICAgICAgOiAtMTtcclxuXHJcbiAgY29uc3QgW3Nob3dQcm9tcHRNb2RhbCwgc2V0U2hvd1Byb21wdE1vZGFsXSA9IHVzZVN0YXRlKGZhbHNlKTtcclxuXHJcbiAgY29uc3QgY2xpZW50Q29uZmlnID0gdXNlTWVtbygoKSA9PiBnZXRDbGllbnRDb25maWcoKSwgW10pO1xyXG5cclxuICBjb25zdCBhdXRvRm9jdXMgPSAhaXNNb2JpbGVTY3JlZW47IC8vIHdvbnQgYXV0byBmb2N1cyBvbiBtb2JpbGUgc2NyZWVuXHJcbiAgY29uc3Qgc2hvd01heEljb24gPSAhaXNNb2JpbGVTY3JlZW4gJiYgIWNsaWVudENvbmZpZz8uaXNBcHA7XHJcblxyXG4gIHVzZUNvbW1hbmQoe1xyXG4gICAgZmlsbDogc2V0VXNlcklucHV0LFxyXG4gICAgc3VibWl0OiAodGV4dCkgPT4ge1xyXG4gICAgICBkb1N1Ym1pdCh0ZXh0KTtcclxuICAgIH0sXHJcbiAgICBjb2RlOiAodGV4dCkgPT4ge1xyXG4gICAgICBpZiAoYWNjZXNzU3RvcmUuZGlzYWJsZUZhc3RMaW5rKSByZXR1cm47XHJcbiAgICAgIGNvbnNvbGUubG9nKFwiW0NvbW1hbmRdIGdvdCBjb2RlIGZyb20gdXJsOiBcIiwgdGV4dCk7XHJcbiAgICAgIHNob3dDb25maXJtKExvY2FsZS5VUkxDb21tYW5kLkNvZGUgKyBgY29kZSA9ICR7dGV4dH1gKS50aGVuKChyZXMpID0+IHtcclxuICAgICAgICBpZiAocmVzKSB7XHJcbiAgICAgICAgICBhY2Nlc3NTdG9yZS51cGRhdGUoKGFjY2VzcykgPT4gKGFjY2Vzcy5hY2Nlc3NDb2RlID0gdGV4dCkpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgICB9LFxyXG4gICAgc2V0dGluZ3M6ICh0ZXh0KSA9PiB7XHJcbiAgICAgIGlmIChhY2Nlc3NTdG9yZS5kaXNhYmxlRmFzdExpbmspIHJldHVybjtcclxuXHJcbiAgICAgIHRyeSB7XHJcbiAgICAgICAgY29uc3QgcGF5bG9hZCA9IEpTT04ucGFyc2UodGV4dCkgYXMge1xyXG4gICAgICAgICAga2V5Pzogc3RyaW5nO1xyXG4gICAgICAgICAgdXJsPzogc3RyaW5nO1xyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIGNvbnNvbGUubG9nKFwiW0NvbW1hbmRdIGdvdCBzZXR0aW5ncyBmcm9tIHVybDogXCIsIHBheWxvYWQpO1xyXG5cclxuICAgICAgICBpZiAocGF5bG9hZC5rZXkgfHwgcGF5bG9hZC51cmwpIHtcclxuICAgICAgICAgIHNob3dDb25maXJtKFxyXG4gICAgICAgICAgICBMb2NhbGUuVVJMQ29tbWFuZC5TZXR0aW5ncyArXHJcbiAgICAgICAgICAgICAgYFxcbiR7SlNPTi5zdHJpbmdpZnkocGF5bG9hZCwgbnVsbCwgNCl9YCxcclxuICAgICAgICAgICkudGhlbigocmVzKSA9PiB7XHJcbiAgICAgICAgICAgIGlmICghcmVzKSByZXR1cm47XHJcbiAgICAgICAgICAgIGlmIChwYXlsb2FkLmtleSkge1xyXG4gICAgICAgICAgICAgIGFjY2Vzc1N0b3JlLnVwZGF0ZShcclxuICAgICAgICAgICAgICAgIChhY2Nlc3MpID0+IChhY2Nlc3Mub3BlbmFpQXBpS2V5ID0gcGF5bG9hZC5rZXkhKSxcclxuICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmIChwYXlsb2FkLnVybCkge1xyXG4gICAgICAgICAgICAgIGFjY2Vzc1N0b3JlLnVwZGF0ZSgoYWNjZXNzKSA9PiAoYWNjZXNzLm9wZW5haVVybCA9IHBheWxvYWQudXJsISkpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGFjY2Vzc1N0b3JlLnVwZGF0ZSgoYWNjZXNzKSA9PiAoYWNjZXNzLnVzZUN1c3RvbUNvbmZpZyA9IHRydWUpKTtcclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgICAgfSBjYXRjaCB7XHJcbiAgICAgICAgY29uc29sZS5lcnJvcihcIltDb21tYW5kXSBmYWlsZWQgdG8gZ2V0IHNldHRpbmdzIGZyb20gdXJsOiBcIiwgdGV4dCk7XHJcbiAgICAgIH1cclxuICAgIH0sXHJcbiAgfSk7XHJcblxyXG4gIC8vIGVkaXQgLyBpbnNlcnQgbWVzc2FnZSBtb2RhbFxyXG4gIGNvbnN0IFtpc0VkaXRpbmdNZXNzYWdlLCBzZXRJc0VkaXRpbmdNZXNzYWdlXSA9IHVzZVN0YXRlKGZhbHNlKTtcclxuXHJcbiAgLy8gcmVtZW1iZXIgdW5maW5pc2hlZCBpbnB1dFxyXG4gIHVzZUVmZmVjdCgoKSA9PiB7XHJcbiAgICAvLyB0cnkgdG8gbG9hZCBmcm9tIGxvY2FsIHN0b3JhZ2VcclxuICAgIGNvbnN0IGtleSA9IFVORklOSVNIRURfSU5QVVQoc2Vzc2lvbi5pZCk7XHJcbiAgICBjb25zdCBtYXlCZVVuZmluaXNoZWRJbnB1dCA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKGtleSk7XHJcbiAgICBpZiAobWF5QmVVbmZpbmlzaGVkSW5wdXQgJiYgdXNlcklucHV0Lmxlbmd0aCA9PT0gMCkge1xyXG4gICAgICBzZXRVc2VySW5wdXQobWF5QmVVbmZpbmlzaGVkSW5wdXQpO1xyXG4gICAgICBsb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbShrZXkpO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IGRvbSA9IGlucHV0UmVmLmN1cnJlbnQ7XHJcbiAgICByZXR1cm4gKCkgPT4ge1xyXG4gICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShrZXksIGRvbT8udmFsdWUgPz8gXCJcIik7XHJcbiAgICB9O1xyXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHJlYWN0LWhvb2tzL2V4aGF1c3RpdmUtZGVwc1xyXG4gIH0sIFtdKTtcclxuXHJcbiAgY29uc3QgaGFuZGxlUGFzdGUgPSB1c2VDYWxsYmFjayhcclxuICAgIGFzeW5jIChldmVudDogUmVhY3QuQ2xpcGJvYXJkRXZlbnQ8SFRNTFRleHRBcmVhRWxlbWVudD4pID0+IHtcclxuICAgICAgY29uc3QgY3VycmVudE1vZGVsID0gY2hhdFN0b3JlLmN1cnJlbnRTZXNzaW9uKCkubWFzay5tb2RlbENvbmZpZy5tb2RlbDtcclxuICAgICAgaWYgKCFpc1Zpc2lvbk1vZGVsKGN1cnJlbnRNb2RlbCkpIHtcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuICAgICAgY29uc3QgaXRlbXMgPSAoZXZlbnQuY2xpcGJvYXJkRGF0YSB8fCB3aW5kb3cuY2xpcGJvYXJkRGF0YSkuaXRlbXM7XHJcbiAgICAgIGZvciAoY29uc3QgaXRlbSBvZiBpdGVtcykge1xyXG4gICAgICAgIGlmIChpdGVtLmtpbmQgPT09IFwiZmlsZVwiICYmIGl0ZW0udHlwZS5zdGFydHNXaXRoKFwiaW1hZ2UvXCIpKSB7XHJcbiAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICAgICAgY29uc3QgZmlsZSA9IGl0ZW0uZ2V0QXNGaWxlKCk7XHJcbiAgICAgICAgICBpZiAoZmlsZSkge1xyXG4gICAgICAgICAgICBjb25zdCBpbWFnZXM6IHN0cmluZ1tdID0gW107XHJcbiAgICAgICAgICAgIGltYWdlcy5wdXNoKC4uLmF0dGFjaEltYWdlcyk7XHJcbiAgICAgICAgICAgIGltYWdlcy5wdXNoKFxyXG4gICAgICAgICAgICAgIC4uLihhd2FpdCBuZXcgUHJvbWlzZTxzdHJpbmdbXT4oKHJlcywgcmVqKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBzZXRVcGxvYWRpbmcodHJ1ZSk7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBpbWFnZXNEYXRhOiBzdHJpbmdbXSA9IFtdO1xyXG4gICAgICAgICAgICAgICAgdXBsb2FkSW1hZ2VSZW1vdGUoZmlsZSlcclxuICAgICAgICAgICAgICAgICAgLnRoZW4oKGRhdGFVcmwpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBpbWFnZXNEYXRhLnB1c2goZGF0YVVybCk7XHJcbiAgICAgICAgICAgICAgICAgICAgc2V0VXBsb2FkaW5nKGZhbHNlKTtcclxuICAgICAgICAgICAgICAgICAgICByZXMoaW1hZ2VzRGF0YSk7XHJcbiAgICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgICAgICAgIC5jYXRjaCgoZSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHNldFVwbG9hZGluZyhmYWxzZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgcmVqKGUpO1xyXG4gICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICB9KSksXHJcbiAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgIGNvbnN0IGltYWdlc0xlbmd0aCA9IGltYWdlcy5sZW5ndGg7XHJcblxyXG4gICAgICAgICAgICBpZiAoaW1hZ2VzTGVuZ3RoID4gMykge1xyXG4gICAgICAgICAgICAgIGltYWdlcy5zcGxpY2UoMywgaW1hZ2VzTGVuZ3RoIC0gMyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgc2V0QXR0YWNoSW1hZ2VzKGltYWdlcyk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9LFxyXG4gICAgW2F0dGFjaEltYWdlcywgY2hhdFN0b3JlXSxcclxuICApO1xyXG5cclxuICBhc3luYyBmdW5jdGlvbiB1cGxvYWRJbWFnZSgpIHtcclxuICAgIGNvbnN0IGltYWdlczogc3RyaW5nW10gPSBbXTtcclxuICAgIGltYWdlcy5wdXNoKC4uLmF0dGFjaEltYWdlcyk7XHJcblxyXG4gICAgaW1hZ2VzLnB1c2goXHJcbiAgICAgIC4uLihhd2FpdCBuZXcgUHJvbWlzZTxzdHJpbmdbXT4oKHJlcywgcmVqKSA9PiB7XHJcbiAgICAgICAgY29uc3QgZmlsZUlucHV0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImlucHV0XCIpO1xyXG4gICAgICAgIGZpbGVJbnB1dC50eXBlID0gXCJmaWxlXCI7XHJcbiAgICAgICAgZmlsZUlucHV0LmFjY2VwdCA9XHJcbiAgICAgICAgICBcImltYWdlL3BuZywgaW1hZ2UvanBlZywgaW1hZ2Uvd2VicCwgaW1hZ2UvaGVpYywgaW1hZ2UvaGVpZlwiO1xyXG4gICAgICAgIGZpbGVJbnB1dC5tdWx0aXBsZSA9IHRydWU7XHJcbiAgICAgICAgZmlsZUlucHV0Lm9uY2hhbmdlID0gKGV2ZW50OiBhbnkpID0+IHtcclxuICAgICAgICAgIHNldFVwbG9hZGluZyh0cnVlKTtcclxuICAgICAgICAgIGNvbnN0IGZpbGVzID0gZXZlbnQudGFyZ2V0LmZpbGVzO1xyXG4gICAgICAgICAgY29uc3QgaW1hZ2VzRGF0YTogc3RyaW5nW10gPSBbXTtcclxuICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZmlsZXMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgY29uc3QgZmlsZSA9IGV2ZW50LnRhcmdldC5maWxlc1tpXTtcclxuICAgICAgICAgICAgdXBsb2FkSW1hZ2VSZW1vdGUoZmlsZSlcclxuICAgICAgICAgICAgICAudGhlbigoZGF0YVVybCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgaW1hZ2VzRGF0YS5wdXNoKGRhdGFVcmwpO1xyXG4gICAgICAgICAgICAgICAgaWYgKFxyXG4gICAgICAgICAgICAgICAgICBpbWFnZXNEYXRhLmxlbmd0aCA9PT0gMyB8fFxyXG4gICAgICAgICAgICAgICAgICBpbWFnZXNEYXRhLmxlbmd0aCA9PT0gZmlsZXMubGVuZ3RoXHJcbiAgICAgICAgICAgICAgICApIHtcclxuICAgICAgICAgICAgICAgICAgc2V0VXBsb2FkaW5nKGZhbHNlKTtcclxuICAgICAgICAgICAgICAgICAgcmVzKGltYWdlc0RhdGEpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgICAgLmNhdGNoKChlKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBzZXRVcGxvYWRpbmcoZmFsc2UpO1xyXG4gICAgICAgICAgICAgICAgcmVqKGUpO1xyXG4gICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH07XHJcbiAgICAgICAgZmlsZUlucHV0LmNsaWNrKCk7XHJcbiAgICAgIH0pKSxcclxuICAgICk7XHJcblxyXG4gICAgY29uc3QgaW1hZ2VzTGVuZ3RoID0gaW1hZ2VzLmxlbmd0aDtcclxuICAgIGlmIChpbWFnZXNMZW5ndGggPiAzKSB7XHJcbiAgICAgIGltYWdlcy5zcGxpY2UoMywgaW1hZ2VzTGVuZ3RoIC0gMyk7XHJcbiAgICB9XHJcbiAgICBzZXRBdHRhY2hJbWFnZXMoaW1hZ2VzKTtcclxuICB9XHJcblxyXG4gIC8vIOW/q+aNt+mUriBzaG9ydGN1dCBrZXlzXHJcbiAgY29uc3QgW3Nob3dTaG9ydGN1dEtleU1vZGFsLCBzZXRTaG93U2hvcnRjdXRLZXlNb2RhbF0gPSB1c2VTdGF0ZShmYWxzZSk7XHJcblxyXG4gIHVzZUVmZmVjdCgoKSA9PiB7XHJcbiAgICBjb25zdCBoYW5kbGVLZXlEb3duID0gKGV2ZW50OiBLZXlib2FyZEV2ZW50KSA9PiB7XHJcbiAgICAgIC8vIOaJk+W8gOaWsOiBiuWkqSBjb21tYW5kICsgc2hpZnQgKyBvXHJcbiAgICAgIGlmIChcclxuICAgICAgICAoZXZlbnQubWV0YUtleSB8fCBldmVudC5jdHJsS2V5KSAmJlxyXG4gICAgICAgIGV2ZW50LnNoaWZ0S2V5ICYmXHJcbiAgICAgICAgZXZlbnQua2V5LnRvTG93ZXJDYXNlKCkgPT09IFwib1wiXHJcbiAgICAgICkge1xyXG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICBjaGF0U3RvcmUubmV3U2Vzc2lvbigpO1xyXG4gICAgICAgICAgbmF2aWdhdGUoUGF0aC5DaGF0KTtcclxuICAgICAgICB9LCAxMCk7XHJcbiAgICAgIH1cclxuICAgICAgLy8g6IGa54Sm6IGK5aSp6L6T5YWlIHNoaWZ0ICsgZXNjXHJcbiAgICAgIGVsc2UgaWYgKGV2ZW50LnNoaWZ0S2V5ICYmIGV2ZW50LmtleS50b0xvd2VyQ2FzZSgpID09PSBcImVzY2FwZVwiKSB7XHJcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgICBpbnB1dFJlZi5jdXJyZW50Py5mb2N1cygpO1xyXG4gICAgICB9XHJcbiAgICAgIC8vIOWkjeWItuacgOWQjuS4gOS4quS7o+eggeWdlyBjb21tYW5kICsgc2hpZnQgKyA7XHJcbiAgICAgIGVsc2UgaWYgKFxyXG4gICAgICAgIChldmVudC5tZXRhS2V5IHx8IGV2ZW50LmN0cmxLZXkpICYmXHJcbiAgICAgICAgZXZlbnQuc2hpZnRLZXkgJiZcclxuICAgICAgICBldmVudC5jb2RlID09PSBcIlNlbWljb2xvblwiXHJcbiAgICAgICkge1xyXG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgICAgY29uc3QgY29weUNvZGVCdXR0b24gPVxyXG4gICAgICAgICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbDxIVE1MRWxlbWVudD4oXCIuY29weS1jb2RlLWJ1dHRvblwiKTtcclxuICAgICAgICBpZiAoY29weUNvZGVCdXR0b24ubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgY29weUNvZGVCdXR0b25bY29weUNvZGVCdXR0b24ubGVuZ3RoIC0gMV0uY2xpY2soKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgLy8g5aSN5Yi25pyA5ZCO5LiA5Liq5Zue5aSNIGNvbW1hbmQgKyBzaGlmdCArIGNcclxuICAgICAgZWxzZSBpZiAoXHJcbiAgICAgICAgKGV2ZW50Lm1ldGFLZXkgfHwgZXZlbnQuY3RybEtleSkgJiZcclxuICAgICAgICBldmVudC5zaGlmdEtleSAmJlxyXG4gICAgICAgIGV2ZW50LmtleS50b0xvd2VyQ2FzZSgpID09PSBcImNcIlxyXG4gICAgICApIHtcclxuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICAgIGNvbnN0IGxhc3ROb25Vc2VyTWVzc2FnZSA9IG1lc3NhZ2VzXHJcbiAgICAgICAgICAuZmlsdGVyKChtZXNzYWdlKSA9PiBtZXNzYWdlLnJvbGUgIT09IFwidXNlclwiKVxyXG4gICAgICAgICAgLnBvcCgpO1xyXG4gICAgICAgIGlmIChsYXN0Tm9uVXNlck1lc3NhZ2UpIHtcclxuICAgICAgICAgIGNvbnN0IGxhc3RNZXNzYWdlQ29udGVudCA9IGdldE1lc3NhZ2VUZXh0Q29udGVudChsYXN0Tm9uVXNlck1lc3NhZ2UpO1xyXG4gICAgICAgICAgY29weVRvQ2xpcGJvYXJkKGxhc3RNZXNzYWdlQ29udGVudCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIC8vIOWxleekuuW/q+aNt+mUriBjb21tYW5kICsgL1xyXG4gICAgICBlbHNlIGlmICgoZXZlbnQubWV0YUtleSB8fCBldmVudC5jdHJsS2V5KSAmJiBldmVudC5rZXkgPT09IFwiL1wiKSB7XHJcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgICBzZXRTaG93U2hvcnRjdXRLZXlNb2RhbCh0cnVlKTtcclxuICAgICAgfVxyXG4gICAgICAvLyDmuIXpmaTkuIrkuIvmlocgY29tbWFuZCArIHNoaWZ0ICsgYmFja3NwYWNlXHJcbiAgICAgIGVsc2UgaWYgKFxyXG4gICAgICAgIChldmVudC5tZXRhS2V5IHx8IGV2ZW50LmN0cmxLZXkpICYmXHJcbiAgICAgICAgZXZlbnQuc2hpZnRLZXkgJiZcclxuICAgICAgICBldmVudC5rZXkudG9Mb3dlckNhc2UoKSA9PT0gXCJiYWNrc3BhY2VcIlxyXG4gICAgICApIHtcclxuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICAgIGNoYXRTdG9yZS51cGRhdGVUYXJnZXRTZXNzaW9uKHNlc3Npb24sIChzZXNzaW9uKSA9PiB7XHJcbiAgICAgICAgICBpZiAoc2Vzc2lvbi5jbGVhckNvbnRleHRJbmRleCA9PT0gc2Vzc2lvbi5tZXNzYWdlcy5sZW5ndGgpIHtcclxuICAgICAgICAgICAgc2Vzc2lvbi5jbGVhckNvbnRleHRJbmRleCA9IHVuZGVmaW5lZDtcclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHNlc3Npb24uY2xlYXJDb250ZXh0SW5kZXggPSBzZXNzaW9uLm1lc3NhZ2VzLmxlbmd0aDtcclxuICAgICAgICAgICAgc2Vzc2lvbi5tZW1vcnlQcm9tcHQgPSBcIlwiOyAvLyB3aWxsIGNsZWFyIG1lbW9yeVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgICB9XHJcbiAgICB9O1xyXG5cclxuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJrZXlkb3duXCIsIGhhbmRsZUtleURvd24pO1xyXG5cclxuICAgIHJldHVybiAoKSA9PiB7XHJcbiAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJrZXlkb3duXCIsIGhhbmRsZUtleURvd24pO1xyXG4gICAgfTtcclxuICB9LCBbbWVzc2FnZXMsIGNoYXRTdG9yZSwgbmF2aWdhdGUsIHNlc3Npb25dKTtcclxuXHJcbiAgY29uc3QgW3Nob3dDaGF0U2lkZVBhbmVsLCBzZXRTaG93Q2hhdFNpZGVQYW5lbF0gPSB1c2VTdGF0ZShmYWxzZSk7XHJcblxyXG4gIHJldHVybiAoXHJcbiAgICA8PlxyXG4gICAgICA8ZGl2IGNsYXNzTmFtZT17c3R5bGVzLmNoYXR9IGtleT17c2Vzc2lvbi5pZH0+XHJcbiAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJ3aW5kb3ctaGVhZGVyXCIgZGF0YS10YXVyaS1kcmFnLXJlZ2lvbj5cclxuICAgICAgICAgIHtpc01vYmlsZVNjcmVlbiAmJiAoXHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwid2luZG93LWFjdGlvbnNcIj5cclxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT17XCJ3aW5kb3ctYWN0aW9uLWJ1dHRvblwifT5cclxuICAgICAgICAgICAgICAgIDxJY29uQnV0dG9uXHJcbiAgICAgICAgICAgICAgICAgIGljb249ezxSZXR1cm5JY29uIC8+fVxyXG4gICAgICAgICAgICAgICAgICBib3JkZXJlZFxyXG4gICAgICAgICAgICAgICAgICB0aXRsZT17TG9jYWxlLkNoYXQuQWN0aW9ucy5DaGF0TGlzdH1cclxuICAgICAgICAgICAgICAgICAgb25DbGljaz17KCkgPT4gbmF2aWdhdGUoUGF0aC5Ib21lKX1cclxuICAgICAgICAgICAgICAgIC8+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgKX1cclxuXHJcbiAgICAgICAgICA8ZGl2XHJcbiAgICAgICAgICAgIGNsYXNzTmFtZT17Y2xzeChcIndpbmRvdy1oZWFkZXItdGl0bGVcIiwgc3R5bGVzW1wiY2hhdC1ib2R5LXRpdGxlXCJdKX1cclxuICAgICAgICAgID5cclxuICAgICAgICAgICAgPGRpdlxyXG4gICAgICAgICAgICAgIGNsYXNzTmFtZT17Y2xzeChcclxuICAgICAgICAgICAgICAgIFwid2luZG93LWhlYWRlci1tYWluLXRpdGxlXCIsXHJcbiAgICAgICAgICAgICAgICBzdHlsZXNbXCJjaGF0LWJvZHktbWFpbi10aXRsZVwiXSxcclxuICAgICAgICAgICAgICApfVxyXG4gICAgICAgICAgICAgIG9uQ2xpY2tDYXB0dXJlPXsoKSA9PiBzZXRJc0VkaXRpbmdNZXNzYWdlKHRydWUpfVxyXG4gICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgeyFzZXNzaW9uLnRvcGljID8gREVGQVVMVF9UT1BJQyA6IHNlc3Npb24udG9waWN9XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cIndpbmRvdy1oZWFkZXItc3ViLXRpdGxlXCI+XHJcbiAgICAgICAgICAgICAge0xvY2FsZS5DaGF0LlN1YlRpdGxlKHNlc3Npb24ubWVzc2FnZXMubGVuZ3RoKX1cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwid2luZG93LWFjdGlvbnNcIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJ3aW5kb3ctYWN0aW9uLWJ1dHRvblwiPlxyXG4gICAgICAgICAgICAgIDxJY29uQnV0dG9uXHJcbiAgICAgICAgICAgICAgICBpY29uPXs8UmVsb2FkSWNvbiAvPn1cclxuICAgICAgICAgICAgICAgIGJvcmRlcmVkXHJcbiAgICAgICAgICAgICAgICB0aXRsZT17TG9jYWxlLkNoYXQuQWN0aW9ucy5SZWZyZXNoVGl0bGV9XHJcbiAgICAgICAgICAgICAgICBvbkNsaWNrPXsoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgIHNob3dUb2FzdChMb2NhbGUuQ2hhdC5BY3Rpb25zLlJlZnJlc2hUb2FzdCk7XHJcbiAgICAgICAgICAgICAgICAgIGNoYXRTdG9yZS5zdW1tYXJpemVTZXNzaW9uKHRydWUsIHNlc3Npb24pO1xyXG4gICAgICAgICAgICAgICAgfX1cclxuICAgICAgICAgICAgICAvPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgeyFpc01vYmlsZVNjcmVlbiAmJiAoXHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJ3aW5kb3ctYWN0aW9uLWJ1dHRvblwiPlxyXG4gICAgICAgICAgICAgICAgPEljb25CdXR0b25cclxuICAgICAgICAgICAgICAgICAgaWNvbj17PFJlbmFtZUljb24gLz59XHJcbiAgICAgICAgICAgICAgICAgIGJvcmRlcmVkXHJcbiAgICAgICAgICAgICAgICAgIHRpdGxlPXtMb2NhbGUuQ2hhdC5FZGl0TWVzc2FnZS5UaXRsZX1cclxuICAgICAgICAgICAgICAgICAgYXJpYT17TG9jYWxlLkNoYXQuRWRpdE1lc3NhZ2UuVGl0bGV9XHJcbiAgICAgICAgICAgICAgICAgIG9uQ2xpY2s9eygpID0+IHNldElzRWRpdGluZ01lc3NhZ2UodHJ1ZSl9XHJcbiAgICAgICAgICAgICAgICAvPlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICApfVxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cIndpbmRvdy1hY3Rpb24tYnV0dG9uXCI+XHJcbiAgICAgICAgICAgICAgPEljb25CdXR0b25cclxuICAgICAgICAgICAgICAgIGljb249ezxFeHBvcnRJY29uIC8+fVxyXG4gICAgICAgICAgICAgICAgYm9yZGVyZWRcclxuICAgICAgICAgICAgICAgIHRpdGxlPXtMb2NhbGUuQ2hhdC5BY3Rpb25zLkV4cG9ydH1cclxuICAgICAgICAgICAgICAgIG9uQ2xpY2s9eygpID0+IHtcclxuICAgICAgICAgICAgICAgICAgc2V0U2hvd0V4cG9ydCh0cnVlKTtcclxuICAgICAgICAgICAgICAgIH19XHJcbiAgICAgICAgICAgICAgLz5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIHtzaG93TWF4SWNvbiAmJiAoXHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJ3aW5kb3ctYWN0aW9uLWJ1dHRvblwiPlxyXG4gICAgICAgICAgICAgICAgPEljb25CdXR0b25cclxuICAgICAgICAgICAgICAgICAgaWNvbj17Y29uZmlnLnRpZ2h0Qm9yZGVyID8gPE1pbkljb24gLz4gOiA8TWF4SWNvbiAvPn1cclxuICAgICAgICAgICAgICAgICAgYm9yZGVyZWRcclxuICAgICAgICAgICAgICAgICAgdGl0bGU9e0xvY2FsZS5DaGF0LkFjdGlvbnMuRnVsbFNjcmVlbn1cclxuICAgICAgICAgICAgICAgICAgYXJpYT17TG9jYWxlLkNoYXQuQWN0aW9ucy5GdWxsU2NyZWVufVxyXG4gICAgICAgICAgICAgICAgICBvbkNsaWNrPXsoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uZmlnLnVwZGF0ZShcclxuICAgICAgICAgICAgICAgICAgICAgIChjb25maWcpID0+IChjb25maWcudGlnaHRCb3JkZXIgPSAhY29uZmlnLnRpZ2h0Qm9yZGVyKSxcclxuICAgICAgICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICAgICAgICB9fVxyXG4gICAgICAgICAgICAgICAgLz5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgKX1cclxuICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgIDxQcm9tcHRUb2FzdFxyXG4gICAgICAgICAgICBzaG93VG9hc3Q9eyFoaXRCb3R0b219XHJcbiAgICAgICAgICAgIHNob3dNb2RhbD17c2hvd1Byb21wdE1vZGFsfVxyXG4gICAgICAgICAgICBzZXRTaG93TW9kYWw9e3NldFNob3dQcm9tcHRNb2RhbH1cclxuICAgICAgICAgIC8+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzc05hbWU9e3N0eWxlc1tcImNoYXQtbWFpblwiXX0+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT17c3R5bGVzW1wiY2hhdC1ib2R5LWNvbnRhaW5lclwiXX0+XHJcbiAgICAgICAgICAgIDxkaXZcclxuICAgICAgICAgICAgICBjbGFzc05hbWU9e3N0eWxlc1tcImNoYXQtYm9keVwiXX1cclxuICAgICAgICAgICAgICByZWY9e3Njcm9sbFJlZn1cclxuICAgICAgICAgICAgICBvblNjcm9sbD17KGUpID0+IG9uQ2hhdEJvZHlTY3JvbGwoZS5jdXJyZW50VGFyZ2V0KX1cclxuICAgICAgICAgICAgICBvbk1vdXNlRG93bj17KCkgPT4gaW5wdXRSZWYuY3VycmVudD8uYmx1cigpfVxyXG4gICAgICAgICAgICAgIG9uVG91Y2hTdGFydD17KCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgaW5wdXRSZWYuY3VycmVudD8uYmx1cigpO1xyXG4gICAgICAgICAgICAgICAgc2V0QXV0b1Njcm9sbChmYWxzZSk7XHJcbiAgICAgICAgICAgICAgfX1cclxuICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgIHttZXNzYWdlc1xyXG4gICAgICAgICAgICAgICAgLy8gVE9ET1xyXG4gICAgICAgICAgICAgICAgLy8gLmZpbHRlcigobSkgPT4gIW0uaXNNY3BSZXNwb25zZSlcclxuICAgICAgICAgICAgICAgIC5tYXAoKG1lc3NhZ2UsIGkpID0+IHtcclxuICAgICAgICAgICAgICAgICAgY29uc3QgaXNVc2VyID0gbWVzc2FnZS5yb2xlID09PSBcInVzZXJcIjtcclxuICAgICAgICAgICAgICAgICAgY29uc3QgaXNDb250ZXh0ID0gaSA8IGNvbnRleHQubGVuZ3RoO1xyXG4gICAgICAgICAgICAgICAgICBjb25zdCBzaG93QWN0aW9ucyA9XHJcbiAgICAgICAgICAgICAgICAgICAgaSA+IDAgJiZcclxuICAgICAgICAgICAgICAgICAgICAhKG1lc3NhZ2UucHJldmlldyB8fCBtZXNzYWdlLmNvbnRlbnQubGVuZ3RoID09PSAwKSAmJlxyXG4gICAgICAgICAgICAgICAgICAgICFpc0NvbnRleHQ7XHJcbiAgICAgICAgICAgICAgICAgIGNvbnN0IHNob3dUeXBpbmcgPSBtZXNzYWdlLnByZXZpZXcgfHwgbWVzc2FnZS5zdHJlYW1pbmc7XHJcblxyXG4gICAgICAgICAgICAgICAgICBjb25zdCBzaG91bGRTaG93Q2xlYXJDb250ZXh0RGl2aWRlciA9XHJcbiAgICAgICAgICAgICAgICAgICAgaSA9PT0gY2xlYXJDb250ZXh0SW5kZXggLSAxO1xyXG5cclxuICAgICAgICAgICAgICAgICAgcmV0dXJuIChcclxuICAgICAgICAgICAgICAgICAgICA8RnJhZ21lbnQga2V5PXttZXNzYWdlLmlkfT5cclxuICAgICAgICAgICAgICAgICAgICAgIDxkaXZcclxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBpc1VzZXJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gc3R5bGVzW1wiY2hhdC1tZXNzYWdlLXVzZXJcIl1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogc3R5bGVzW1wiY2hhdC1tZXNzYWdlXCJdXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9e3N0eWxlc1tcImNoYXQtbWVzc2FnZS1jb250YWluZXJcIl19PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPXtzdHlsZXNbXCJjaGF0LW1lc3NhZ2UtaGVhZGVyXCJdfT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPXtzdHlsZXNbXCJjaGF0LW1lc3NhZ2UtYXZhdGFyXCJdfT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9e3N0eWxlc1tcImNoYXQtbWVzc2FnZS1lZGl0XCJdfT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8SWNvbkJ1dHRvblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWNvbj17PEVkaXRJY29uIC8+fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJpYT17TG9jYWxlLkNoYXQuQWN0aW9ucy5FZGl0fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25DbGljaz17YXN5bmMgKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBuZXdNZXNzYWdlID0gYXdhaXQgc2hvd1Byb21wdChcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2NhbGUuQ2hhdC5BY3Rpb25zLkVkaXQsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0TWVzc2FnZVRleHRDb250ZW50KG1lc3NhZ2UpLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEwLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgbmV3Q29udGVudDpcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHN0cmluZ1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgTXVsdGltb2RhbENvbnRlbnRbXSA9IG5ld01lc3NhZ2U7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGltYWdlcyA9IGdldE1lc3NhZ2VJbWFnZXMobWVzc2FnZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbWFnZXMubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0NvbnRlbnQgPSBbXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IHR5cGU6IFwidGV4dFwiLCB0ZXh0OiBuZXdNZXNzYWdlIH0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGltYWdlcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3Q29udGVudC5wdXNoKHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogXCJpbWFnZV91cmxcIixcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1hZ2VfdXJsOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXJsOiBpbWFnZXNbaV0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhdFN0b3JlLnVwZGF0ZVRhcmdldFNlc3Npb24oXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbixcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc2Vzc2lvbikgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbSA9IHNlc3Npb24ubWFzay5jb250ZXh0XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5jb25jYXQoc2Vzc2lvbi5tZXNzYWdlcylcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmZpbmQoKG0pID0+IG0uaWQgPT09IG1lc3NhZ2UuaWQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG0pIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbS5jb250ZW50ID0gbmV3Q29udGVudDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+PC9JY29uQnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge2lzVXNlciA/IChcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8QXZhdGFyIGF2YXRhcj17Y29uZmlnLmF2YXRhcn0gLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSA6IChcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge1tcInN5c3RlbVwiXS5pbmNsdWRlcyhtZXNzYWdlLnJvbGUpID8gKFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8QXZhdGFyIGF2YXRhcj1cIjI2OTktZmUwZlwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApIDogKFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8TWFza0F2YXRhclxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2YXRhcj17c2Vzc2lvbi5tYXNrLmF2YXRhcn1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2RlbD17XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLm1vZGVsIHx8XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXNzaW9uLm1hc2subW9kZWxDb25maWcubW9kZWxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICApfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IWlzVXNlciAmJiAoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPXtzdHlsZXNbXCJjaGF0LW1vZGVsLW5hbWVcIl19PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHttZXNzYWdlLm1vZGVsfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICl9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge3Nob3dBY3Rpb25zICYmIChcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9e3N0eWxlc1tcImNoYXQtbWVzc2FnZS1hY3Rpb25zXCJdfT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT17c3R5bGVzW1wiY2hhdC1pbnB1dC1hY3Rpb25zXCJdfT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHttZXNzYWdlLnN0cmVhbWluZyA/IChcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPENoYXRBY3Rpb25cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0PXtMb2NhbGUuQ2hhdC5BY3Rpb25zLlN0b3B9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWNvbj17PFN0b3BJY29uIC8+fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uQ2xpY2s9eygpID0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvblVzZXJTdG9wKG1lc3NhZ2UuaWQgPz8gaSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApIDogKFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxDaGF0QWN0aW9uXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0PXtMb2NhbGUuQ2hhdC5BY3Rpb25zLlJldHJ5fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWNvbj17PFJlc2V0SWNvbiAvPn1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uQ2xpY2s9eygpID0+IG9uUmVzZW5kKG1lc3NhZ2UpfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxDaGF0QWN0aW9uXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0PXtMb2NhbGUuQ2hhdC5BY3Rpb25zLkRlbGV0ZX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGljb249ezxEZWxldGVJY29uIC8+fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25DbGljaz17KCkgPT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25EZWxldGUobWVzc2FnZS5pZCA/PyBpKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxDaGF0QWN0aW9uXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0PXtMb2NhbGUuQ2hhdC5BY3Rpb25zLlBpbn1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGljb249ezxQaW5JY29uIC8+fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25DbGljaz17KCkgPT4gb25QaW5NZXNzYWdlKG1lc3NhZ2UpfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPENoYXRBY3Rpb25cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHQ9e0xvY2FsZS5DaGF0LkFjdGlvbnMuQ29weX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGljb249ezxDb3B5SWNvbiAvPn1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uQ2xpY2s9eygpID0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvcHlUb0NsaXBib2FyZChcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRNZXNzYWdlVGV4dENvbnRlbnQobWVzc2FnZSksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIClcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtjb25maWcudHRzQ29uZmlnLmVuYWJsZSAmJiAoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Q2hhdEFjdGlvblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0PXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcGVlY2hTdGF0dXNcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gTG9jYWxlLkNoYXQuQWN0aW9ucy5TdG9wU3BlZWNoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IExvY2FsZS5DaGF0LkFjdGlvbnMuU3BlZWNoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWNvbj17XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3BlZWNoU3RhdHVzID8gKFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPFNwZWFrU3RvcEljb24gLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApIDogKFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPFNwZWFrSWNvbiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIClcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbkNsaWNrPXsoKSA9PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wZW5haVNwZWVjaChcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldE1lc3NhZ2VUZXh0Q29udGVudChtZXNzYWdlKSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICl9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAge21lc3NhZ2U/LnRvb2xzPy5sZW5ndGggPT0gMCAmJiBzaG93VHlwaW5nICYmIChcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPXtzdHlsZXNbXCJjaGF0LW1lc3NhZ2Utc3RhdHVzXCJdfT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge0xvY2FsZS5DaGF0LlR5cGluZ31cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICl9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgey8qQHRzLWlnbm9yZSovfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHttZXNzYWdlPy50b29scz8ubGVuZ3RoID4gMCAmJiAoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT17c3R5bGVzW1wiY2hhdC1tZXNzYWdlLXRvb2xzXCJdfT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge21lc3NhZ2U/LnRvb2xzPy5tYXAoKHRvb2wpID0+IChcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXk9e3Rvb2wuaWR9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aXRsZT17dG9vbD8uZXJyb3JNc2d9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9e3N0eWxlc1tcImNoYXQtbWVzc2FnZS10b29sXCJdfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt0b29sLmlzRXJyb3IgPT09IGZhbHNlID8gKFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Q29uZmlybUljb24gLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkgOiB0b29sLmlzRXJyb3IgPT09IHRydWUgPyAoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxDbG9zZUljb24gLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkgOiAoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxMb2FkaW5nQnV0dG9uSWNvbiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuPnt0b29sPy5mdW5jdGlvbj8ubmFtZX08L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkpfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT17c3R5bGVzW1wiY2hhdC1tZXNzYWdlLWl0ZW1cIl19PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPE1hcmtkb3duXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleT17bWVzc2FnZS5zdHJlYW1pbmcgPyBcImxvYWRpbmdcIiA6IFwiZG9uZVwifVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50PXtnZXRNZXNzYWdlVGV4dENvbnRlbnQobWVzc2FnZSl9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvYWRpbmc9e1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChtZXNzYWdlLnByZXZpZXcgfHwgbWVzc2FnZS5zdHJlYW1pbmcpICYmXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5jb250ZW50Lmxlbmd0aCA9PT0gMCAmJlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICFpc1VzZXJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgIG9uQ29udGV4dE1lbnU9eyhlKSA9PiBvblJpZ2h0Q2xpY2soZSwgbWVzc2FnZSl9IC8vIGhhcmQgdG8gdXNlXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uRG91YmxlQ2xpY2tDYXB0dXJlPXsoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFpc01vYmlsZVNjcmVlbikgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldFVzZXJJbnB1dChnZXRNZXNzYWdlVGV4dENvbnRlbnQobWVzc2FnZSkpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb250U2l6ZT17Zm9udFNpemV9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvbnRGYW1pbHk9e2ZvbnRGYW1pbHl9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmVudFJlZj17c2Nyb2xsUmVmfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0U2hvdz17aSA+PSBtZXNzYWdlcy5sZW5ndGggLSA2fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtnZXRNZXNzYWdlSW1hZ2VzKG1lc3NhZ2UpLmxlbmd0aCA9PSAxICYmIChcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGltZ1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT17c3R5bGVzW1wiY2hhdC1tZXNzYWdlLWl0ZW0taW1hZ2VcIl19XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjPXtnZXRNZXNzYWdlSW1hZ2VzKG1lc3NhZ2UpWzBdfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsdD1cIlwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge2dldE1lc3NhZ2VJbWFnZXMobWVzc2FnZSkubGVuZ3RoID4gMSAmJiAoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXZcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9e3N0eWxlc1tcImNoYXQtbWVzc2FnZS1pdGVtLWltYWdlc1wiXX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHlsZT17XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiLS1pbWFnZS1jb3VudFwiOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldE1lc3NhZ2VJbWFnZXMobWVzc2FnZSkubGVuZ3RoLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBhcyBSZWFjdC5DU1NQcm9wZXJ0aWVzXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge2dldE1lc3NhZ2VJbWFnZXMobWVzc2FnZSkubWFwKFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGltYWdlLCBpbmRleCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbWdcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT17XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlc1tcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImNoYXQtbWVzc2FnZS1pdGVtLWltYWdlLW11bHRpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5PXtpbmRleH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYz17aW1hZ2V9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbHQ9XCJcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICl9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICB7bWVzc2FnZT8uYXVkaW9fdXJsICYmIChcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPXtzdHlsZXNbXCJjaGF0LW1lc3NhZ2UtYXVkaW9cIl19PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXVkaW8gc3JjPXttZXNzYWdlLmF1ZGlvX3VybH0gY29udHJvbHMgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICl9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPXtzdHlsZXNbXCJjaGF0LW1lc3NhZ2UtYWN0aW9uLWRhdGVcIl19PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge2lzQ29udGV4dFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IExvY2FsZS5DaGF0LklzQ29udGV4dFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IG1lc3NhZ2UuZGF0ZS50b0xvY2FsZVN0cmluZygpfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAge3Nob3VsZFNob3dDbGVhckNvbnRleHREaXZpZGVyICYmIDxDbGVhckNvbnRleHREaXZpZGVyIC8+fVxyXG4gICAgICAgICAgICAgICAgICAgIDwvRnJhZ21lbnQ+XHJcbiAgICAgICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgICAgICB9KX1cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPXtzdHlsZXNbXCJjaGF0LWlucHV0LXBhbmVsXCJdfT5cclxuICAgICAgICAgICAgICA8UHJvbXB0SGludHNcclxuICAgICAgICAgICAgICAgIHByb21wdHM9e3Byb21wdEhpbnRzfVxyXG4gICAgICAgICAgICAgICAgb25Qcm9tcHRTZWxlY3Q9e29uUHJvbXB0U2VsZWN0fVxyXG4gICAgICAgICAgICAgIC8+XHJcblxyXG4gICAgICAgICAgICAgIDxDaGF0QWN0aW9uc1xyXG4gICAgICAgICAgICAgICAgdXBsb2FkSW1hZ2U9e3VwbG9hZEltYWdlfVxyXG4gICAgICAgICAgICAgICAgc2V0QXR0YWNoSW1hZ2VzPXtzZXRBdHRhY2hJbWFnZXN9XHJcbiAgICAgICAgICAgICAgICBzZXRVcGxvYWRpbmc9e3NldFVwbG9hZGluZ31cclxuICAgICAgICAgICAgICAgIHNob3dQcm9tcHRNb2RhbD17KCkgPT4gc2V0U2hvd1Byb21wdE1vZGFsKHRydWUpfVxyXG4gICAgICAgICAgICAgICAgc2Nyb2xsVG9Cb3R0b209e3Njcm9sbFRvQm90dG9tfVxyXG4gICAgICAgICAgICAgICAgaGl0Qm90dG9tPXtoaXRCb3R0b219XHJcbiAgICAgICAgICAgICAgICB1cGxvYWRpbmc9e3VwbG9hZGluZ31cclxuICAgICAgICAgICAgICAgIHNob3dQcm9tcHRIaW50cz17KCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAvLyBDbGljayBhZ2FpbiB0byBjbG9zZVxyXG4gICAgICAgICAgICAgICAgICBpZiAocHJvbXB0SGludHMubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHNldFByb21wdEhpbnRzKFtdKTtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgIGlucHV0UmVmLmN1cnJlbnQ/LmZvY3VzKCk7XHJcbiAgICAgICAgICAgICAgICAgIHNldFVzZXJJbnB1dChcIi9cIik7XHJcbiAgICAgICAgICAgICAgICAgIG9uU2VhcmNoKFwiXCIpO1xyXG4gICAgICAgICAgICAgICAgfX1cclxuICAgICAgICAgICAgICAgIHNldFNob3dTaG9ydGN1dEtleU1vZGFsPXtzZXRTaG93U2hvcnRjdXRLZXlNb2RhbH1cclxuICAgICAgICAgICAgICAgIHNldFVzZXJJbnB1dD17c2V0VXNlcklucHV0fVxyXG4gICAgICAgICAgICAgICAgc2V0U2hvd0NoYXRTaWRlUGFuZWw9e3NldFNob3dDaGF0U2lkZVBhbmVsfVxyXG4gICAgICAgICAgICAgIC8+XHJcbiAgICAgICAgICAgICAgPGxhYmVsXHJcbiAgICAgICAgICAgICAgICBjbGFzc05hbWU9e2Nsc3goc3R5bGVzW1wiY2hhdC1pbnB1dC1wYW5lbC1pbm5lclwiXSwge1xyXG4gICAgICAgICAgICAgICAgICBbc3R5bGVzW1wiY2hhdC1pbnB1dC1wYW5lbC1pbm5lci1hdHRhY2hcIl1dOlxyXG4gICAgICAgICAgICAgICAgICAgIGF0dGFjaEltYWdlcy5sZW5ndGggIT09IDAsXHJcbiAgICAgICAgICAgICAgICB9KX1cclxuICAgICAgICAgICAgICAgIGh0bWxGb3I9XCJjaGF0LWlucHV0XCJcclxuICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICA8dGV4dGFyZWFcclxuICAgICAgICAgICAgICAgICAgaWQ9XCJjaGF0LWlucHV0XCJcclxuICAgICAgICAgICAgICAgICAgcmVmPXtpbnB1dFJlZn1cclxuICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPXtzdHlsZXNbXCJjaGF0LWlucHV0XCJdfVxyXG4gICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj17TG9jYWxlLkNoYXQuSW5wdXQoc3VibWl0S2V5KX1cclxuICAgICAgICAgICAgICAgICAgb25JbnB1dD17KGUpID0+IG9uSW5wdXQoZS5jdXJyZW50VGFyZ2V0LnZhbHVlKX1cclxuICAgICAgICAgICAgICAgICAgdmFsdWU9e3VzZXJJbnB1dH1cclxuICAgICAgICAgICAgICAgICAgb25LZXlEb3duPXtvbklucHV0S2V5RG93bn1cclxuICAgICAgICAgICAgICAgICAgb25Gb2N1cz17c2Nyb2xsVG9Cb3R0b219XHJcbiAgICAgICAgICAgICAgICAgIG9uQ2xpY2s9e3Njcm9sbFRvQm90dG9tfVxyXG4gICAgICAgICAgICAgICAgICBvblBhc3RlPXtoYW5kbGVQYXN0ZX1cclxuICAgICAgICAgICAgICAgICAgcm93cz17aW5wdXRSb3dzfVxyXG4gICAgICAgICAgICAgICAgICBhdXRvRm9jdXM9e2F1dG9Gb2N1c31cclxuICAgICAgICAgICAgICAgICAgc3R5bGU9e3tcclxuICAgICAgICAgICAgICAgICAgICBmb250U2l6ZTogY29uZmlnLmZvbnRTaXplLFxyXG4gICAgICAgICAgICAgICAgICAgIGZvbnRGYW1pbHk6IGNvbmZpZy5mb250RmFtaWx5LFxyXG4gICAgICAgICAgICAgICAgICB9fVxyXG4gICAgICAgICAgICAgICAgLz5cclxuICAgICAgICAgICAgICAgIHthdHRhY2hJbWFnZXMubGVuZ3RoICE9IDAgJiYgKFxyXG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT17c3R5bGVzW1wiYXR0YWNoLWltYWdlc1wiXX0+XHJcbiAgICAgICAgICAgICAgICAgICAge2F0dGFjaEltYWdlcy5tYXAoKGltYWdlLCBpbmRleCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChcclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGtleT17aW5kZXh9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPXtzdHlsZXNbXCJhdHRhY2gtaW1hZ2VcIl19XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGU9e3sgYmFja2dyb3VuZEltYWdlOiBgdXJsKFwiJHtpbWFnZX1cIilgIH19XHJcbiAgICAgICAgICAgICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT17c3R5bGVzW1wiYXR0YWNoLWltYWdlLW1hc2tcIl19PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPERlbGV0ZUltYWdlQnV0dG9uXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZUltYWdlPXsoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0QXR0YWNoSW1hZ2VzKFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0YWNoSW1hZ2VzLmZpbHRlcigoXywgaSkgPT4gaSAhPT0gaW5kZXgpLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH19XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgICAgICAgICAgfSl9XHJcbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgKX1cclxuICAgICAgICAgICAgICAgIDxJY29uQnV0dG9uXHJcbiAgICAgICAgICAgICAgICAgIGljb249ezxTZW5kV2hpdGVJY29uIC8+fVxyXG4gICAgICAgICAgICAgICAgICB0ZXh0PXtMb2NhbGUuQ2hhdC5TZW5kfVxyXG4gICAgICAgICAgICAgICAgICBjbGFzc05hbWU9e3N0eWxlc1tcImNoYXQtaW5wdXQtc2VuZFwiXX1cclxuICAgICAgICAgICAgICAgICAgdHlwZT1cInByaW1hcnlcIlxyXG4gICAgICAgICAgICAgICAgICBvbkNsaWNrPXsoKSA9PiBkb1N1Ym1pdCh1c2VySW5wdXQpfVxyXG4gICAgICAgICAgICAgICAgLz5cclxuICAgICAgICAgICAgICA8L2xhYmVsPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPGRpdlxyXG4gICAgICAgICAgICBjbGFzc05hbWU9e2Nsc3goc3R5bGVzW1wiY2hhdC1zaWRlLXBhbmVsXCJdLCB7XHJcbiAgICAgICAgICAgICAgW3N0eWxlc1tcIm1vYmlsZVwiXV06IGlzTW9iaWxlU2NyZWVuLFxyXG4gICAgICAgICAgICAgIFtzdHlsZXNbXCJjaGF0LXNpZGUtcGFuZWwtc2hvd1wiXV06IHNob3dDaGF0U2lkZVBhbmVsLFxyXG4gICAgICAgICAgICB9KX1cclxuICAgICAgICAgID5cclxuICAgICAgICAgICAge3Nob3dDaGF0U2lkZVBhbmVsICYmIChcclxuICAgICAgICAgICAgICA8UmVhbHRpbWVDaGF0XHJcbiAgICAgICAgICAgICAgICBvbkNsb3NlPXsoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgIHNldFNob3dDaGF0U2lkZVBhbmVsKGZhbHNlKTtcclxuICAgICAgICAgICAgICAgIH19XHJcbiAgICAgICAgICAgICAgICBvblN0YXJ0Vm9pY2U9e2FzeW5jICgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCJzdGFydCB2b2ljZVwiKTtcclxuICAgICAgICAgICAgICAgIH19XHJcbiAgICAgICAgICAgICAgLz5cclxuICAgICAgICAgICAgKX1cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICA8L2Rpdj5cclxuICAgICAge3Nob3dFeHBvcnQgJiYgKFxyXG4gICAgICAgIDxFeHBvcnRNZXNzYWdlTW9kYWwgb25DbG9zZT17KCkgPT4gc2V0U2hvd0V4cG9ydChmYWxzZSl9IC8+XHJcbiAgICAgICl9XHJcblxyXG4gICAgICB7aXNFZGl0aW5nTWVzc2FnZSAmJiAoXHJcbiAgICAgICAgPEVkaXRNZXNzYWdlTW9kYWxcclxuICAgICAgICAgIG9uQ2xvc2U9eygpID0+IHtcclxuICAgICAgICAgICAgc2V0SXNFZGl0aW5nTWVzc2FnZShmYWxzZSk7XHJcbiAgICAgICAgICB9fVxyXG4gICAgICAgIC8+XHJcbiAgICAgICl9XHJcblxyXG4gICAgICB7c2hvd1Nob3J0Y3V0S2V5TW9kYWwgJiYgKFxyXG4gICAgICAgIDxTaG9ydGN1dEtleU1vZGFsIG9uQ2xvc2U9eygpID0+IHNldFNob3dTaG9ydGN1dEtleU1vZGFsKGZhbHNlKX0gLz5cclxuICAgICAgKX1cclxuICAgIDwvPlxyXG4gICk7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBDaGF0KCkge1xyXG4gIGNvbnN0IGNoYXRTdG9yZSA9IHVzZUNoYXRTdG9yZSgpO1xyXG4gIGNvbnN0IHNlc3Npb24gPSBjaGF0U3RvcmUuY3VycmVudFNlc3Npb24oKTtcclxuICByZXR1cm4gPF9DaGF0IGtleT17c2Vzc2lvbi5pZH0+PC9fQ2hhdD47XHJcbn1cclxuIl0sIm5hbWVzIjpbInVzZURlYm91bmNlZENhbGxiYWNrIiwiUmVhY3QiLCJGcmFnbWVudCIsInVzZUNhbGxiYWNrIiwidXNlRWZmZWN0IiwidXNlTWVtbyIsInVzZVJlZiIsInVzZVN0YXRlIiwiU2VuZFdoaXRlSWNvbiIsIkJyYWluSWNvbiIsIlJlbmFtZUljb24iLCJFZGl0SWNvbiIsIkV4cG9ydEljb24iLCJSZXR1cm5JY29uIiwiQ29weUljb24iLCJTcGVha0ljb24iLCJTcGVha1N0b3BJY29uIiwiTG9hZGluZ0ljb24iLCJMb2FkaW5nQnV0dG9uSWNvbiIsIk1heEljb24iLCJNaW5JY29uIiwiUmVzZXRJY29uIiwiUmVsb2FkSWNvbiIsIlNldHRpbmdzSWNvbiIsIkRlbGV0ZUljb24iLCJQaW5JY29uIiwiQ29uZmlybUljb24iLCJDbG9zZUljb24iLCJDYW5jZWxJY29uIiwiSW1hZ2VJY29uIiwiQm90dG9tSWNvbiIsIlN0b3BJY29uIiwiUm9ib3RJY29uIiwiU2l6ZUljb24iLCJRdWFsaXR5SWNvbiIsIlN0eWxlSWNvbiIsIlBsdWdpbkljb24iLCJNY3BUb29sSWNvbiIsIkhlYWRwaG9uZUljb24iLCJCT1RfSEVMTE8iLCJjcmVhdGVNZXNzYWdlIiwiREVGQVVMVF9UT1BJQyIsIlN1Ym1pdEtleSIsIlRoZW1lIiwidXNlQWNjZXNzU3RvcmUiLCJ1c2VBcHBDb25maWciLCJ1c2VDaGF0U3RvcmUiLCJ1c2VQbHVnaW5TdG9yZSIsImF1dG9Hcm93VGV4dEFyZWEiLCJjb3B5VG9DbGlwYm9hcmQiLCJnZXRNZXNzYWdlSW1hZ2VzIiwiZ2V0TWVzc2FnZVRleHRDb250ZW50IiwiaXNEYWxsZTMiLCJpc1Zpc2lvbk1vZGVsIiwic2FmZUxvY2FsU3RvcmFnZSIsImdldE1vZGVsU2l6ZXMiLCJzdXBwb3J0c0N1c3RvbVNpemUiLCJ1c2VNb2JpbGVTY3JlZW4iLCJzZWxlY3RPckNvcHkiLCJzaG93UGx1Z2lucyIsInVwbG9hZEltYWdlIiwidXBsb2FkSW1hZ2VSZW1vdGUiLCJkeW5hbWljIiwiQ2hhdENvbnRyb2xsZXJQb29sIiwidXNlUHJvbXB0U3RvcmUiLCJMb2NhbGUiLCJJY29uQnV0dG9uIiwic3R5bGVzIiwiTGlzdCIsIkxpc3RJdGVtIiwiTW9kYWwiLCJTZWxlY3RvciIsInNob3dDb25maXJtIiwic2hvd1Byb21wdCIsInNob3dUb2FzdCIsInVzZU5hdmlnYXRlIiwiQ0hBVF9QQUdFX1NJWkUiLCJERUZBVUxUX1RUU19FTkdJTkUiLCJNb2RlbFByb3ZpZGVyIiwiUGF0aCIsIlJFUVVFU1RfVElNRU9VVF9NUyIsIlNlcnZpY2VQcm92aWRlciIsIlVORklOSVNIRURfSU5QVVQiLCJBdmF0YXIiLCJDb250ZXh0UHJvbXB0cyIsIk1hc2tBdmF0YXIiLCJNYXNrQ29uZmlnIiwidXNlTWFza1N0b3JlIiwiQ2hhdENvbW1hbmRQcmVmaXgiLCJ1c2VDaGF0Q29tbWFuZCIsInVzZUNvbW1hbmQiLCJwcmV0dHlPYmplY3QiLCJFeHBvcnRNZXNzYWdlTW9kYWwiLCJnZXRDbGllbnRDb25maWciLCJ1c2VBbGxNb2RlbHMiLCJDbGllbnRBcGkiLCJjcmVhdGVUVFNQbGF5ZXIiLCJNc0VkZ2VUVFMiLCJPVVRQVVRfRk9STUFUIiwiaXNFbXB0eSIsImdldE1vZGVsUHJvdmlkZXIiLCJSZWFsdGltZUNoYXQiLCJjbHN4IiwiZ2V0QXZhaWxhYmxlQ2xpZW50c0NvdW50IiwiaXNNY3BFbmFibGVkIiwibG9jYWxTdG9yYWdlIiwidHRzUGxheWVyIiwiTWFya2Rvd24iLCJsb2FkaW5nIiwiTUNQQWN0aW9uIiwibmF2aWdhdGUiLCJjb3VudCIsInNldENvdW50IiwibWNwRW5hYmxlZCIsInNldE1jcEVuYWJsZWQiLCJjaGVja01jcFN0YXR1cyIsImVuYWJsZWQiLCJDaGF0QWN0aW9uIiwib25DbGljayIsIk1jcE1hcmtldCIsInRleHQiLCJpY29uIiwiU2Vzc2lvbkNvbmZpZ01vZGVsIiwicHJvcHMiLCJjaGF0U3RvcmUiLCJzZXNzaW9uIiwiY3VycmVudFNlc3Npb24iLCJtYXNrU3RvcmUiLCJkaXYiLCJjbGFzc05hbWUiLCJ0aXRsZSIsIkNvbnRleHQiLCJFZGl0Iiwib25DbG9zZSIsImFjdGlvbnMiLCJib3JkZXJlZCIsIkNoYXQiLCJDb25maWciLCJSZXNldCIsIk1lbW9yeSIsIlJlc2V0Q29uZmlybSIsInVwZGF0ZVRhcmdldFNlc3Npb24iLCJtZW1vcnlQcm9tcHQiLCJTYXZlQXMiLCJNYXNrcyIsInNldFRpbWVvdXQiLCJjcmVhdGUiLCJtYXNrIiwidXBkYXRlTWFzayIsInVwZGF0ZXIiLCJzaG91bGRTeW5jRnJvbUdsb2JhbCIsImV4dHJhTGlzdEl0ZW1zIiwibW9kZWxDb25maWciLCJzZW5kTWVtb3J5IiwiVGl0bGUiLCJsYXN0U3VtbWFyaXplSW5kZXgiLCJtZXNzYWdlcyIsImxlbmd0aCIsInN1YlRpdGxlIiwiRW1wdHlDb250ZW50IiwiUHJvbXB0VG9hc3QiLCJjb250ZXh0Iiwicm9sZSIsInNldFNob3dNb2RhbCIsInNwYW4iLCJUb2FzdCIsInNob3dNb2RhbCIsInVzZVN1Ym1pdEhhbmRsZXIiLCJjb25maWciLCJzdWJtaXRLZXkiLCJpc0NvbXBvc2luZyIsIm9uQ29tcG9zaXRpb25TdGFydCIsImN1cnJlbnQiLCJvbkNvbXBvc2l0aW9uRW5kIiwid2luZG93IiwiYWRkRXZlbnRMaXN0ZW5lciIsInJlbW92ZUV2ZW50TGlzdGVuZXIiLCJzaG91bGRTdWJtaXQiLCJlIiwia2V5Q29kZSIsImtleSIsIm5hdGl2ZUV2ZW50IiwiQWx0RW50ZXIiLCJhbHRLZXkiLCJDdHJsRW50ZXIiLCJjdHJsS2V5IiwiU2hpZnRFbnRlciIsInNoaWZ0S2V5IiwiTWV0YUVudGVyIiwibWV0YUtleSIsIkVudGVyIiwiUHJvbXB0SGludHMiLCJub1Byb21wdHMiLCJwcm9tcHRzIiwic2VsZWN0SW5kZXgiLCJzZXRTZWxlY3RJbmRleCIsInNlbGVjdGVkUmVmIiwib25LZXlEb3duIiwiY2hhbmdlSW5kZXgiLCJkZWx0YSIsInN0b3BQcm9wYWdhdGlvbiIsInByZXZlbnREZWZhdWx0IiwibmV4dEluZGV4IiwiTWF0aCIsIm1heCIsIm1pbiIsInNjcm9sbEludG9WaWV3IiwiYmxvY2siLCJzZWxlY3RlZFByb21wdCIsImF0Iiwib25Qcm9tcHRTZWxlY3QiLCJtYXAiLCJwcm9tcHQiLCJpIiwicmVmIiwib25Nb3VzZUVudGVyIiwiY29udGVudCIsInRvU3RyaW5nIiwiQ2xlYXJDb250ZXh0RGl2aWRlciIsImNsZWFyQ29udGV4dEluZGV4IiwidW5kZWZpbmVkIiwiQ2xlYXIiLCJSZXZlcnQiLCJpY29uUmVmIiwidGV4dFJlZiIsIndpZHRoIiwic2V0V2lkdGgiLCJmdWxsIiwidXBkYXRlV2lkdGgiLCJnZXRXaWR0aCIsImRvbSIsImdldEJvdW5kaW5nQ2xpZW50UmVjdCIsInRleHRXaWR0aCIsImljb25XaWR0aCIsIm9uVG91Y2hTdGFydCIsInN0eWxlIiwidXNlU2Nyb2xsVG9Cb3R0b20iLCJzY3JvbGxSZWYiLCJkZXRhY2giLCJhdXRvU2Nyb2xsIiwic2V0QXV0b1Njcm9sbCIsInNjcm9sbERvbVRvQm90dG9tIiwicmVxdWVzdEFuaW1hdGlvbkZyYW1lIiwic2Nyb2xsVG8iLCJzY3JvbGxIZWlnaHQiLCJsYXN0TWVzc2FnZXNMZW5ndGgiLCJDaGF0QWN0aW9ucyIsInBsdWdpblN0b3JlIiwidGhlbWUiLCJuZXh0VGhlbWUiLCJ0aGVtZXMiLCJBdXRvIiwiTGlnaHQiLCJEYXJrIiwidGhlbWVJbmRleCIsImluZGV4T2YiLCJ1cGRhdGUiLCJjb3VsZFN0b3AiLCJoYXNQZW5kaW5nIiwic3RvcEFsbCIsImN1cnJlbnRNb2RlbCIsIm1vZGVsIiwiY3VycmVudFByb3ZpZGVyTmFtZSIsInByb3ZpZGVyTmFtZSIsIk9wZW5BSSIsImFsbE1vZGVscyIsIm1vZGVscyIsImZpbHRlcmVkTW9kZWxzIiwiZmlsdGVyIiwibSIsImF2YWlsYWJsZSIsImRlZmF1bHRNb2RlbCIsImZpbmQiLCJpc0RlZmF1bHQiLCJhcnIiLCJjdXJyZW50TW9kZWxOYW1lIiwibmFtZSIsInByb3ZpZGVyIiwiZGlzcGxheU5hbWUiLCJzaG93TW9kZWxTZWxlY3RvciIsInNldFNob3dNb2RlbFNlbGVjdG9yIiwic2hvd1BsdWdpblNlbGVjdG9yIiwic2V0U2hvd1BsdWdpblNlbGVjdG9yIiwic2hvd1VwbG9hZEltYWdlIiwic2V0U2hvd1VwbG9hZEltYWdlIiwic2hvd1NpemVTZWxlY3RvciIsInNldFNob3dTaXplU2VsZWN0b3IiLCJzaG93UXVhbGl0eVNlbGVjdG9yIiwic2V0U2hvd1F1YWxpdHlTZWxlY3RvciIsInNob3dTdHlsZVNlbGVjdG9yIiwic2V0U2hvd1N0eWxlU2VsZWN0b3IiLCJtb2RlbFNpemVzIiwiZGFsbGUzUXVhbGl0eXMiLCJkYWxsZTNTdHlsZXMiLCJjdXJyZW50U2l6ZSIsInNpemUiLCJjdXJyZW50UXVhbGl0eSIsInF1YWxpdHkiLCJjdXJyZW50U3R5bGUiLCJpc01vYmlsZVNjcmVlbiIsInNob3ciLCJzZXRBdHRhY2hJbWFnZXMiLCJzZXRVcGxvYWRpbmciLCJpc1VuYXZhaWxhYmxlTW9kZWwiLCJzb21lIiwibmV4dE1vZGVsIiwiSW5wdXRBY3Rpb25zIiwiU3RvcCIsImhpdEJvdHRvbSIsInNjcm9sbFRvQm90dG9tIiwiVG9Cb3R0b20iLCJzaG93UHJvbXB0TW9kYWwiLCJTZXR0aW5ncyIsIlVwbG9hZEltYWdlIiwidXBsb2FkaW5nIiwiZGVmYXVsdFNlbGVjdGVkVmFsdWUiLCJpdGVtcyIsInZhbHVlIiwib25TZWxlY3Rpb24iLCJzIiwic3luY0dsb2JhbENvbmZpZyIsInNlbGVjdGVkTW9kZWwiLCJxIiwiZ2V0QWxsIiwiUGx1Z2lucyIsIlBsdWdpbiIsIk5hbWUiLCJtdWx0aXBsZSIsInBsdWdpbiIsIml0ZW0iLCJ2ZXJzaW9uIiwiaWQiLCJyZWFsdGltZUNvbmZpZyIsImVuYWJsZSIsInNldFNob3dDaGF0U2lkZVBhbmVsIiwiRWRpdE1lc3NhZ2VNb2RhbCIsInNldE1lc3NhZ2VzIiwic2xpY2UiLCJFZGl0TWVzc2FnZSIsIlVJIiwiQ2FuY2VsIiwidHlwZSIsIkNvbmZpcm0iLCJUb3BpYyIsIlN1YlRpdGxlIiwiaW5wdXQiLCJ0b3BpYyIsIm9uSW5wdXQiLCJjdXJyZW50VGFyZ2V0IiwidXBkYXRlQ29udGV4dCIsIm5ld01lc3NhZ2VzIiwiRGVsZXRlSW1hZ2VCdXR0b24iLCJkZWxldGVJbWFnZSIsIlNob3J0Y3V0S2V5TW9kYWwiLCJpc01hYyIsIm5hdmlnYXRvciIsInBsYXRmb3JtIiwidG9VcHBlckNhc2UiLCJzaG9ydGN1dHMiLCJTaG9ydGN1dEtleSIsIm5ld0NoYXQiLCJrZXlzIiwiZm9jdXNJbnB1dCIsImNvcHlMYXN0Q29kZSIsImNvcHlMYXN0TWVzc2FnZSIsInNob3dTaG9ydGN1dEtleSIsImNsZWFyQ29udGV4dCIsInNob3J0Y3V0IiwiaW5kZXgiLCJfQ2hhdCIsImZvbnRTaXplIiwiZm9udEZhbWlseSIsInNob3dFeHBvcnQiLCJzZXRTaG93RXhwb3J0IiwiaW5wdXRSZWYiLCJ1c2VySW5wdXQiLCJzZXRVc2VySW5wdXQiLCJpc0xvYWRpbmciLCJzZXRJc0xvYWRpbmciLCJpc1Njcm9sbGVkVG9Cb3R0b20iLCJhYnMiLCJzY3JvbGxUb3AiLCJjbGllbnRIZWlnaHQiLCJpc0F0dGFjaFdpdGhUb3AiLCJsYXN0TWVzc2FnZSIsImxhc3RFbGVtZW50Q2hpbGQiLCJ0b3BEaXN0YW5jZSIsInRvcCIsImlzVHlwaW5nIiwic2V0SGl0Qm90dG9tIiwiYXR0YWNoSW1hZ2VzIiwicHJvbXB0U3RvcmUiLCJwcm9tcHRIaW50cyIsInNldFByb21wdEhpbnRzIiwib25TZWFyY2giLCJtYXRjaGVkUHJvbXB0cyIsInNlYXJjaCIsImxlYWRpbmciLCJ0cmFpbGluZyIsImlucHV0Um93cyIsInNldElucHV0Um93cyIsIm1lYXN1cmUiLCJyb3dzIiwiTnVtYmVyIiwiY2hhdENvbW1hbmRzIiwibmV3IiwibmV3U2Vzc2lvbiIsIm5ld20iLCJOZXdDaGF0IiwicHJldiIsIm5leHRTZXNzaW9uIiwibmV4dCIsImNsZWFyIiwiZm9yayIsImZvcmtTZXNzaW9uIiwiZGVsIiwiZGVsZXRlU2Vzc2lvbiIsImN1cnJlbnRTZXNzaW9uSW5kZXgiLCJTRUFSQ0hfVEVYVF9MSU1JVCIsIm4iLCJ0cmltIiwibWF0Y2giLCJkaXNhYmxlUHJvbXB0SGludCIsInN0YXJ0c1dpdGgiLCJzZWFyY2hUZXh0IiwiZG9TdWJtaXQiLCJtYXRjaENvbW1hbmQiLCJtYXRjaGVkIiwiaW52b2tlIiwib25Vc2VySW5wdXQiLCJ0aGVuIiwic2V0TGFzdElucHV0IiwiZm9jdXMiLCJtYXRjaGVkQ2hhdENvbW1hbmQiLCJvblVzZXJTdG9wIiwibWVzc2FnZUlkIiwic3RvcCIsInN0b3BUaW1pbmciLCJEYXRlIiwibm93IiwiZm9yRWFjaCIsImlzRXJyb3IiLCJkYXRlIiwiZ2V0VGltZSIsInN0cmVhbWluZyIsImVycm9yIiwibWVzc2FnZSIsImNvbnNvbGUiLCJsb2ciLCJvbklucHV0S2V5RG93biIsImxhc3RJbnB1dCIsIm9uUmlnaHRDbGljayIsImRlbGV0ZU1lc3NhZ2UiLCJtc2dJZCIsIm9uRGVsZXRlIiwib25SZXNlbmQiLCJyZXNlbmRpbmdJbmRleCIsImZpbmRJbmRleCIsInVzZXJNZXNzYWdlIiwiYm90TWVzc2FnZSIsInRleHRDb250ZW50IiwiaW1hZ2VzIiwib25QaW5NZXNzYWdlIiwicHVzaCIsIkFjdGlvbnMiLCJQaW5Ub2FzdENvbnRlbnQiLCJQaW5Ub2FzdEFjdGlvbiIsInNldFNob3dQcm9tcHRNb2RhbCIsImFjY2Vzc1N0b3JlIiwic3BlZWNoU3RhdHVzIiwic2V0U3BlZWNoU3RhdHVzIiwic3BlZWNoTG9hZGluZyIsInNldFNwZWVjaExvYWRpbmciLCJvcGVuYWlTcGVlY2giLCJhcGkiLCJHUFQiLCJnZXRTdGF0ZSIsImluaXQiLCJhdWRpb0J1ZmZlciIsIm1hcmtkb3duVG9UeHQiLCJyZXF1aXJlIiwidHRzQ29uZmlnIiwiZW5naW5lIiwiZWRnZVZvaWNlTmFtZSIsInR0cyIsInNldE1ldGFkYXRhIiwiQVVESU9fMjRLSFpfOTZLQklUUkFURV9NT05PX01QMyIsInRvQXJyYXlCdWZmZXIiLCJsbG0iLCJzcGVlY2giLCJ2b2ljZSIsInNwZWVkIiwicGxheSIsImNhdGNoIiwiZmluYWxseSIsImhpZGVDb250ZXh0IiwiY29waWVkSGVsbG8iLCJPYmplY3QiLCJhc3NpZ24iLCJpc0F1dGhvcml6ZWQiLCJFcnJvciIsIlVuYXV0aG9yaXplZCIsInJlbmRlck1lc3NhZ2VzIiwiY29uY2F0IiwicHJldmlldyIsInNlbmRQcmV2aWV3QnViYmxlIiwibXNnUmVuZGVySW5kZXgiLCJfc2V0TXNnUmVuZGVySW5kZXgiLCJzZXRNc2dSZW5kZXJJbmRleCIsIm5ld0luZGV4IiwiZW5kUmVuZGVySW5kZXgiLCJvbkNoYXRCb2R5U2Nyb2xsIiwiYm90dG9tSGVpZ2h0IiwiZWRnZVRocmVzaG9sZCIsImlzVG91Y2hUb3BFZGdlIiwiaXNUb3VjaEJvdHRvbUVkZ2UiLCJpc0hpdEJvdHRvbSIsInByZXZQYWdlTXNnSW5kZXgiLCJuZXh0UGFnZU1zZ0luZGV4IiwiY2xpZW50Q29uZmlnIiwiYXV0b0ZvY3VzIiwic2hvd01heEljb24iLCJpc0FwcCIsImZpbGwiLCJzdWJtaXQiLCJjb2RlIiwiZGlzYWJsZUZhc3RMaW5rIiwiVVJMQ29tbWFuZCIsIkNvZGUiLCJyZXMiLCJhY2Nlc3MiLCJhY2Nlc3NDb2RlIiwic2V0dGluZ3MiLCJwYXlsb2FkIiwiSlNPTiIsInBhcnNlIiwidXJsIiwic3RyaW5naWZ5Iiwib3BlbmFpQXBpS2V5Iiwib3BlbmFpVXJsIiwidXNlQ3VzdG9tQ29uZmlnIiwiaXNFZGl0aW5nTWVzc2FnZSIsInNldElzRWRpdGluZ01lc3NhZ2UiLCJtYXlCZVVuZmluaXNoZWRJbnB1dCIsImdldEl0ZW0iLCJyZW1vdmVJdGVtIiwic2V0SXRlbSIsImhhbmRsZVBhc3RlIiwiZXZlbnQiLCJjbGlwYm9hcmREYXRhIiwia2luZCIsImZpbGUiLCJnZXRBc0ZpbGUiLCJQcm9taXNlIiwicmVqIiwiaW1hZ2VzRGF0YSIsImRhdGFVcmwiLCJpbWFnZXNMZW5ndGgiLCJzcGxpY2UiLCJmaWxlSW5wdXQiLCJkb2N1bWVudCIsImNyZWF0ZUVsZW1lbnQiLCJhY2NlcHQiLCJvbmNoYW5nZSIsImZpbGVzIiwidGFyZ2V0IiwiY2xpY2siLCJzaG93U2hvcnRjdXRLZXlNb2RhbCIsInNldFNob3dTaG9ydGN1dEtleU1vZGFsIiwiaGFuZGxlS2V5RG93biIsInRvTG93ZXJDYXNlIiwiY29weUNvZGVCdXR0b24iLCJxdWVyeVNlbGVjdG9yQWxsIiwibGFzdE5vblVzZXJNZXNzYWdlIiwicG9wIiwibGFzdE1lc3NhZ2VDb250ZW50Iiwic2hvd0NoYXRTaWRlUGFuZWwiLCJjaGF0IiwiZGF0YS10YXVyaS1kcmFnLXJlZ2lvbiIsIkNoYXRMaXN0IiwiSG9tZSIsIm9uQ2xpY2tDYXB0dXJlIiwiUmVmcmVzaFRpdGxlIiwiUmVmcmVzaFRvYXN0Iiwic3VtbWFyaXplU2Vzc2lvbiIsImFyaWEiLCJFeHBvcnQiLCJ0aWdodEJvcmRlciIsIkZ1bGxTY3JlZW4iLCJvblNjcm9sbCIsIm9uTW91c2VEb3duIiwiYmx1ciIsImlzVXNlciIsImlzQ29udGV4dCIsInNob3dBY3Rpb25zIiwic2hvd1R5cGluZyIsInNob3VsZFNob3dDbGVhckNvbnRleHREaXZpZGVyIiwibmV3TWVzc2FnZSIsIm5ld0NvbnRlbnQiLCJpbWFnZV91cmwiLCJhdmF0YXIiLCJpbmNsdWRlcyIsIlJldHJ5IiwiRGVsZXRlIiwiUGluIiwiQ29weSIsIlN0b3BTcGVlY2giLCJTcGVlY2giLCJ0b29scyIsIlR5cGluZyIsInRvb2wiLCJlcnJvck1zZyIsImZ1bmN0aW9uIiwib25Eb3VibGVDbGlja0NhcHR1cmUiLCJwYXJlbnRSZWYiLCJkZWZhdWx0U2hvdyIsImltZyIsInNyYyIsImFsdCIsImltYWdlIiwiYXVkaW9fdXJsIiwiYXVkaW8iLCJjb250cm9scyIsIklzQ29udGV4dCIsInRvTG9jYWxlU3RyaW5nIiwic2hvd1Byb21wdEhpbnRzIiwibGFiZWwiLCJodG1sRm9yIiwidGV4dGFyZWEiLCJwbGFjZWhvbGRlciIsIklucHV0Iiwib25Gb2N1cyIsIm9uUGFzdGUiLCJiYWNrZ3JvdW5kSW1hZ2UiLCJfIiwiU2VuZCIsIm9uU3RhcnRWb2ljZSJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///(app-pages-browser)/./app/components/chat.tsx\n"));
/***/ })
});