NeahNew/.next/server/app/api/rocket-chat/messages/route.js
2025-05-03 14:17:46 +02:00

243 lines
85 KiB
JavaScript

/*
* 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/).
*/
(() => {
var exports = {};
exports.id = "app/api/rocket-chat/messages/route";
exports.ids = ["app/api/rocket-chat/messages/route"];
exports.modules = {
/***/ "(rsc)/./app/api/auth/[...nextauth]/route.ts":
/*!*********************************************!*\
!*** ./app/api/auth/[...nextauth]/route.ts ***!
\*********************************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ GET: () => (/* binding */ handler),\n/* harmony export */ POST: () => (/* binding */ handler),\n/* harmony export */ authOptions: () => (/* binding */ authOptions)\n/* harmony export */ });\n/* harmony import */ var next_auth__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! next-auth */ \"(rsc)/./node_modules/next-auth/index.js\");\n/* harmony import */ var next_auth__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(next_auth__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var next_auth_providers_keycloak__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! next-auth/providers/keycloak */ \"(rsc)/./node_modules/next-auth/providers/keycloak.js\");\n/* harmony import */ var jwt_decode__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! jwt-decode */ \"(rsc)/./node_modules/jwt-decode/build/esm/index.js\");\n\n\n\nfunction getRequiredEnvVar(name) {\n const value = process.env[name];\n if (!value) {\n throw new Error(`Missing required environment variable: ${name}`);\n }\n return value;\n}\nasync function refreshAccessToken(token) {\n try {\n const response = await fetch(`${process.env.KEYCLOAK_ISSUER}/protocol/openid-connect/token`, {\n headers: {\n \"Content-Type\": \"application/x-www-form-urlencoded\"\n },\n body: new URLSearchParams({\n client_id: process.env.KEYCLOAK_CLIENT_ID,\n client_secret: process.env.KEYCLOAK_CLIENT_SECRET,\n grant_type: \"refresh_token\",\n refresh_token: token.refreshToken\n }),\n method: \"POST\"\n });\n const refreshedTokens = await response.json();\n if (!response.ok) {\n throw refreshedTokens;\n }\n return {\n ...token,\n accessToken: refreshedTokens.access_token,\n refreshToken: refreshedTokens.refresh_token ?? token.refreshToken,\n accessTokenExpires: Date.now() + refreshedTokens.expires_in * 1000\n };\n } catch (error) {\n console.error(\"Error refreshing access token:\", error);\n return {\n ...token,\n error: \"RefreshAccessTokenError\"\n };\n }\n}\nconst authOptions = {\n providers: [\n (0,next_auth_providers_keycloak__WEBPACK_IMPORTED_MODULE_1__[\"default\"])({\n clientId: getRequiredEnvVar(\"KEYCLOAK_CLIENT_ID\"),\n clientSecret: getRequiredEnvVar(\"KEYCLOAK_CLIENT_SECRET\"),\n issuer: getRequiredEnvVar(\"KEYCLOAK_ISSUER\"),\n authorization: {\n params: {\n scope: \"openid profile email roles\"\n }\n },\n profile (profile) {\n console.log('Keycloak profile callback:', {\n rawProfile: profile,\n rawRoles: profile.roles,\n realmAccess: profile.realm_access,\n groups: profile.groups\n });\n // Get roles from realm_access\n const roles = profile.realm_access?.roles || [];\n console.log('Profile callback raw roles:', roles);\n // Clean up roles by removing ROLE_ prefix and converting to lowercase\n const cleanRoles = roles.map((role)=>role.replace(/^ROLE_/, '').toLowerCase());\n console.log('Profile callback cleaned roles:', cleanRoles);\n return {\n id: profile.sub,\n name: profile.name ?? profile.preferred_username,\n email: profile.email,\n first_name: profile.given_name ?? '',\n last_name: profile.family_name ?? '',\n username: profile.preferred_username ?? profile.email?.split('@')[0] ?? '',\n role: cleanRoles\n };\n }\n })\n ],\n session: {\n strategy: \"jwt\",\n maxAge: 30 * 24 * 60 * 60\n },\n callbacks: {\n async jwt ({ token, account, profile }) {\n if (account && profile) {\n const keycloakProfile = profile;\n const roles = keycloakProfile.realm_access?.roles || [];\n const cleanRoles = roles.map((role)=>role.replace(/^ROLE_/, '').toLowerCase());\n token.accessToken = account.access_token ?? '';\n token.refreshToken = account.refresh_token ?? '';\n token.accessTokenExpires = account.expires_at ?? 0;\n token.sub = keycloakProfile.sub;\n token.role = cleanRoles;\n token.username = keycloakProfile.preferred_username ?? '';\n token.first_name = keycloakProfile.given_name ?? '';\n token.last_name = keycloakProfile.family_name ?? '';\n } else if (token.accessToken) {\n try {\n const decoded = (0,jwt_decode__WEBPACK_IMPORTED_MODULE_2__.jwtDecode)(token.accessToken);\n if (decoded.realm_access?.roles) {\n const roles = decoded.realm_access.roles;\n const cleanRoles = roles.map((role)=>role.replace(/^ROLE_/, '').toLowerCase());\n token.role = cleanRoles;\n }\n } catch (error) {\n console.error('Error decoding token:', error);\n }\n }\n if (Date.now() < token.accessTokenExpires * 1000) {\n return token;\n }\n return refreshAccessToken(token);\n },\n async session ({ session, token }) {\n if (token.error) {\n throw new Error(token.error);\n }\n const userRoles = Array.isArray(token.role) ? token.role : [];\n session.user = {\n id: token.sub ?? '',\n email: token.email ?? null,\n name: token.name ?? null,\n image: null,\n username: token.username ?? '',\n first_name: token.first_name ?? '',\n last_name: token.last_name ?? '',\n role: userRoles,\n nextcloudInitialized: false\n };\n session.accessToken = token.accessToken;\n return session;\n }\n },\n pages: {\n signIn: '/signin',\n error: '/signin'\n },\n debug: \"development\" === 'development'\n};\nconst handler = next_auth__WEBPACK_IMPORTED_MODULE_0___default()(authOptions);\n\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKHJzYykvLi9hcHAvYXBpL2F1dGgvWy4uLm5leHRhdXRoXS9yb3V0ZS50cyIsIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7O0FBQXNEO0FBQ007QUFDckI7QUFxRHZDLFNBQVNHLGtCQUFrQkMsSUFBWTtJQUNyQyxNQUFNQyxRQUFRQyxRQUFRQyxHQUFHLENBQUNILEtBQUs7SUFDL0IsSUFBSSxDQUFDQyxPQUFPO1FBQ1YsTUFBTSxJQUFJRyxNQUFNLENBQUMsdUNBQXVDLEVBQUVKLE1BQU07SUFDbEU7SUFDQSxPQUFPQztBQUNUO0FBRUEsZUFBZUksbUJBQW1CQyxLQUFVO0lBQzFDLElBQUk7UUFDRixNQUFNQyxXQUFXLE1BQU1DLE1BQU0sR0FBR04sUUFBUUMsR0FBRyxDQUFDTSxlQUFlLENBQUMsOEJBQThCLENBQUMsRUFBRTtZQUMzRkMsU0FBUztnQkFBRSxnQkFBZ0I7WUFBb0M7WUFDL0RDLE1BQU0sSUFBSUMsZ0JBQWdCO2dCQUN4QkMsV0FBV1gsUUFBUUMsR0FBRyxDQUFDVyxrQkFBa0I7Z0JBQ3pDQyxlQUFlYixRQUFRQyxHQUFHLENBQUNhLHNCQUFzQjtnQkFDakRDLFlBQVk7Z0JBQ1pDLGVBQWVaLE1BQU1hLFlBQVk7WUFDbkM7WUFDQUMsUUFBUTtRQUNWO1FBRUEsTUFBTUMsa0JBQWtCLE1BQU1kLFNBQVNlLElBQUk7UUFFM0MsSUFBSSxDQUFDZixTQUFTZ0IsRUFBRSxFQUFFO1lBQ2hCLE1BQU1GO1FBQ1I7UUFFQSxPQUFPO1lBQ0wsR0FBR2YsS0FBSztZQUNSa0IsYUFBYUgsZ0JBQWdCSSxZQUFZO1lBQ3pDTixjQUFjRSxnQkFBZ0JILGFBQWEsSUFBSVosTUFBTWEsWUFBWTtZQUNqRU8sb0JBQW9CQyxLQUFLQyxHQUFHLEtBQUtQLGdCQUFnQlEsVUFBVSxHQUFHO1FBQ2hFO0lBQ0YsRUFBRSxPQUFPQyxPQUFPO1FBQ2RDLFFBQVFELEtBQUssQ0FBQyxrQ0FBa0NBO1FBQ2hELE9BQU87WUFDTCxHQUFHeEIsS0FBSztZQUNSd0IsT0FBTztRQUNUO0lBQ0Y7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O1lBRUEsSUFBSUgsS0FBS0MsR0FBRyxLQUFLLE1BQU9GLGtCQUFrQixHQUFjLE1BQU07Z0JBQzVELE9BQU9wQjtZQUNUO1lBRUEsT0FBT0QsbUJBQW1CQztRQUM1QjtRQUNBLE1BQU15RCxTQUFRLEVBQUVBLE9BQU8sRUFBRXpELEtBQUssRUFBRTtZQUM5QixJQUFJQSxNQUFNd0IsS0FBSyxFQUFFO2dCQUNmLE1BQU0sSUFBSTFCLE1BQU1FLE1BQU13QixLQUFLO1lBQzdCO1lBRUEsTUFBTTBDLFlBQVlDLE1BQU1DLE9BQU8sQ0FBQ3BFLE1BQU00QyxJQUFJLElBQUk1QyxNQUFNNEMsSUFBSSxHQUFHLEVBQUU7WUFDN0RhLFFBQVFZLElBQUksR0FBRztnQkFDYnRCLElBQUkvQyxNQUFNZ0QsR0FBRyxJQUFJO2dCQUNqQkUsT0FBT2xELE1BQU1rRCxLQUFLLElBQUk7Z0JBQ3RCeEQsTUFBTU0sTUFBTU4sSUFBSSxJQUFJO2dCQUNwQjRFLE9BQU87Z0JBQ1BmLFVBQVV2RCxNQUFNdUQsUUFBUSxJQUFJO2dCQUM1QkosWUFBWW5ELE1BQU1tRCxVQUFVLElBQUk7Z0JBQ2hDRSxXQUFXckQsTUFBTXFELFNBQVMsSUFBSTtnQkFDOUJULE1BQU1zQjtnQkFDTkssc0JBQXNCO1lBQ3hCO1lBQ0FkLFFBQVF2QyxXQUFXLEdBQUdsQixNQUFNa0IsV0FBVztZQUV2QyxPQUFPdUM7UUFDVDtJQUNGO0lBQ0FlLE9BQU87UUFDTEMsUUFBUTtRQUNSakQsT0FBTztJQUNUO0lBQ0FrRCxPQUFPOUUsa0JBQXlCO0FBQ2xDLEVBQUU7QUFFRixNQUFNK0UsVUFBVXJGLGdEQUFRQSxDQUFDb0M7QUFDa0IiLCJzb3VyY2VzIjpbIi9ob21lL2FsbWEvbmV4dGdlbi9OZWFoLW1haWwvYXBwL2FwaS9hdXRoL1suLi5uZXh0YXV0aF0vcm91dGUudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IE5leHRBdXRoLCB7IE5leHRBdXRoT3B0aW9ucyB9IGZyb20gXCJuZXh0LWF1dGhcIjtcbmltcG9ydCBLZXljbG9ha1Byb3ZpZGVyIGZyb20gXCJuZXh0LWF1dGgvcHJvdmlkZXJzL2tleWNsb2FrXCI7XG5pbXBvcnQgeyBqd3REZWNvZGUgfSBmcm9tIFwiand0LWRlY29kZVwiO1xuXG5pbnRlcmZhY2UgS2V5Y2xvYWtQcm9maWxlIHtcbiAgc3ViOiBzdHJpbmc7XG4gIGVtYWlsPzogc3RyaW5nO1xuICBuYW1lPzogc3RyaW5nO1xuICByb2xlcz86IHN0cmluZ1tdO1xuICBwcmVmZXJyZWRfdXNlcm5hbWU/OiBzdHJpbmc7XG4gIGdpdmVuX25hbWU/OiBzdHJpbmc7XG4gIGZhbWlseV9uYW1lPzogc3RyaW5nO1xuICByZWFsbV9hY2Nlc3M/OiB7XG4gICAgcm9sZXM6IHN0cmluZ1tdO1xuICB9O1xufVxuXG5pbnRlcmZhY2UgRGVjb2RlZFRva2VuIHtcbiAgcmVhbG1fYWNjZXNzPzoge1xuICAgIHJvbGVzOiBzdHJpbmdbXTtcbiAgfTtcbiAgW2tleTogc3RyaW5nXTogYW55O1xufVxuXG5kZWNsYXJlIG1vZHVsZSBcIm5leHQtYXV0aFwiIHtcbiAgaW50ZXJmYWNlIFNlc3Npb24ge1xuICAgIHVzZXI6IHtcbiAgICAgIGlkOiBzdHJpbmc7XG4gICAgICBuYW1lPzogc3RyaW5nIHwgbnVsbDtcbiAgICAgIGVtYWlsPzogc3RyaW5nIHwgbnVsbDtcbiAgICAgIGltYWdlPzogc3RyaW5nIHwgbnVsbDtcbiAgICAgIHVzZXJuYW1lOiBzdHJpbmc7XG4gICAgICBmaXJzdF9uYW1lOiBzdHJpbmc7XG4gICAgICBsYXN0X25hbWU6IHN0cmluZztcbiAgICAgIHJvbGU6IHN0cmluZ1tdO1xuICAgICAgbmV4dGNsb3VkSW5pdGlhbGl6ZWQ/OiBib29sZWFuO1xuICAgIH07XG4gICAgYWNjZXNzVG9rZW4/OiBzdHJpbmc7XG4gIH1cblxuICBpbnRlcmZhY2UgSldUIHtcbiAgICBzdWI/OiBzdHJpbmc7XG4gICAgYWNjZXNzVG9rZW4/OiBzdHJpbmc7XG4gICAgcmVmcmVzaFRva2VuPzogc3RyaW5nO1xuICAgIGFjY2Vzc1Rva2VuRXhwaXJlcz86IG51bWJlcjtcbiAgICByb2xlPzogc3RyaW5nW107XG4gICAgdXNlcm5hbWU/OiBzdHJpbmc7XG4gICAgZmlyc3RfbmFtZT86IHN0cmluZztcbiAgICBsYXN0X25hbWU/OiBzdHJpbmc7XG4gICAgZXJyb3I/OiBzdHJpbmc7XG4gICAgZW1haWw/OiBzdHJpbmcgfCBudWxsO1xuICAgIG5hbWU/OiBzdHJpbmcgfCBudWxsO1xuICB9XG59XG5cbmZ1bmN0aW9uIGdldFJlcXVpcmVkRW52VmFyKG5hbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IHZhbHVlID0gcHJvY2Vzcy5lbnZbbmFtZV07XG4gIGlmICghdmFsdWUpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYE1pc3NpbmcgcmVxdWlyZWQgZW52aXJvbm1lbnQgdmFyaWFibGU6ICR7bmFtZX1gKTtcbiAgfVxuICByZXR1cm4gdmFsdWU7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHJlZnJlc2hBY2Nlc3NUb2tlbih0b2tlbjogSldUKSB7XG4gIHRyeSB7XG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaChgJHtwcm9jZXNzLmVudi5LRVlDTE9BS19JU1NVRVJ9L3Byb3RvY29sL29wZW5pZC1jb25uZWN0L3Rva2VuYCwge1xuICAgICAgaGVhZGVyczogeyBcIkNvbnRlbnQtVHlwZVwiOiBcImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZFwiIH0sXG4gICAgICBib2R5OiBuZXcgVVJMU2VhcmNoUGFyYW1zKHtcbiAgICAgICAgY2xpZW50X2lkOiBwcm9jZXNzLmVudi5LRVlDTE9BS19DTElFTlRfSUQhLFxuICAgICAgICBjbGllbnRfc2VjcmV0OiBwcm9jZXNzLmVudi5LRVlDTE9BS19DTElFTlRfU0VDUkVUISxcbiAgICAgICAgZ3JhbnRfdHlwZTogXCJyZWZyZXNoX3Rva2VuXCIsXG4gICAgICAgIHJlZnJlc2hfdG9rZW46IHRva2VuLnJlZnJlc2hUb2tlbixcbiAgICAgIH0pLFxuICAgICAgbWV0aG9kOiBcIlBPU1RcIixcbiAgICB9KTtcblxuICAgIGNvbnN0IHJlZnJlc2hlZFRva2VucyA9IGF3YWl0IHJlc3BvbnNlLmpzb24oKTtcblxuICAgIGlmICghcmVzcG9uc2Uub2spIHtcbiAgICAgIHRocm93IHJlZnJlc2hlZFRva2VucztcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgLi4udG9rZW4sXG4gICAgICBhY2Nlc3NUb2tlbjogcmVmcmVzaGVkVG9rZW5zLmFjY2Vzc190b2tlbixcbiAgICAgIHJlZnJlc2hUb2tlbjogcmVmcmVzaGVkVG9rZW5zLnJlZnJlc2hfdG9rZW4gPz8gdG9rZW4ucmVmcmVzaFRva2VuLFxuICAgICAgYWNjZXNzVG9rZW5FeHBpcmVzOiBEYXRlLm5vdygpICsgcmVmcmVzaGVkVG9rZW5zLmV4cGlyZXNfaW4gKiAxMDAwLFxuICAgIH07XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgY29uc29sZS5lcnJvcihcIkVycm9yIHJlZnJlc2hpbmcgYWNjZXNzIHRva2VuOlwiLCBlcnJvcik7XG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLnRva2VuLFxuICAgICAgZXJyb3I6IFwiUmVmcmVzaEFjY2Vzc1Rva2VuRXJyb3JcIixcbiAgICB9O1xuICB9XG59XG5cbmV4cG9ydCBjb25zdCBhdXRoT3B0aW9uczogTmV4dEF1dGhPcHRpb25zID0ge1xuICBwcm92aWRlcnM6IFtcbiAgICBLZXljbG9ha1Byb3ZpZGVyKHtcbiAgICAgIGNsaWVudElkOiBnZXRSZXF1aXJlZEVudlZhcihcIktFWUNMT0FLX0NMSUVOVF9JRFwiKSxcbiAgICAgIGNsaWVudFNlY3JldDogZ2V0UmVxdWlyZWRFbnZWYXIoXCJLRVlDTE9BS19DTElFTlRfU0VDUkVUXCIpLFxuICAgICAgaXNzdWVyOiBnZXRSZXF1aXJlZEVudlZhcihcIktFWUNMT0FLX0lTU1VFUlwiKSxcbiAgICAgIGF1dGhvcml6YXRpb246IHtcbiAgICAgICAgcGFyYW1zOiB7XG4gICAgICAgICAgc2NvcGU6IFwib3BlbmlkIHByb2ZpbGUgZW1haWwgcm9sZXNcIlxuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgcHJvZmlsZShwcm9maWxlKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKCdLZXljbG9hayBwcm9maWxlIGNhbGxiYWNrOicsIHtcbiAgICAgICAgICByYXdQcm9maWxlOiBwcm9maWxlLFxuICAgICAgICAgIHJhd1JvbGVzOiBwcm9maWxlLnJvbGVzLFxuICAgICAgICAgIHJlYWxtQWNjZXNzOiBwcm9maWxlLnJlYWxtX2FjY2VzcyxcbiAgICAgICAgICBncm91cHM6IHByb2ZpbGUuZ3JvdXBzXG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIEdldCByb2xlcyBmcm9tIHJlYWxtX2FjY2Vzc1xuICAgICAgICBjb25zdCByb2xlcyA9IHByb2ZpbGUucmVhbG1fYWNjZXNzPy5yb2xlcyB8fCBbXTtcbiAgICAgICAgY29uc29sZS5sb2coJ1Byb2ZpbGUgY2FsbGJhY2sgcmF3IHJvbGVzOicsIHJvbGVzKTtcblxuICAgICAgICAvLyBDbGVhbiB1cCByb2xlcyBieSByZW1vdmluZyBST0xFXyBwcmVmaXggYW5kIGNvbnZlcnRpbmcgdG8gbG93ZXJjYXNlXG4gICAgICAgIGNvbnN0IGNsZWFuUm9sZXMgPSByb2xlcy5tYXAoKHJvbGU6IHN0cmluZykgPT4gXG4gICAgICAgICAgcm9sZS5yZXBsYWNlKC9eUk9MRV8vLCAnJykudG9Mb3dlckNhc2UoKVxuICAgICAgICApO1xuXG4gICAgICAgIGNvbnNvbGUubG9nKCdQcm9maWxlIGNhbGxiYWNrIGNsZWFuZWQgcm9sZXM6JywgY2xlYW5Sb2xlcyk7XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBpZDogcHJvZmlsZS5zdWIsXG4gICAgICAgICAgbmFtZTogcHJvZmlsZS5uYW1lID8/IHByb2ZpbGUucHJlZmVycmVkX3VzZXJuYW1lLFxuICAgICAgICAgIGVtYWlsOiBwcm9maWxlLmVtYWlsLFxuICAgICAgICAgIGZpcnN0X25hbWU6IHByb2ZpbGUuZ2l2ZW5fbmFtZSA/PyAnJyxcbiAgICAgICAgICBsYXN0X25hbWU6IHByb2ZpbGUuZmFtaWx5X25hbWUgPz8gJycsXG4gICAgICAgICAgdXNlcm5hbWU6IHByb2ZpbGUucHJlZmVycmVkX3VzZXJuYW1lID8/IHByb2ZpbGUuZW1haWw/LnNwbGl0KCdAJylbMF0gPz8gJycsXG4gICAgICAgICAgcm9sZTogY2xlYW5Sb2xlcyxcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICB9KSxcbiAgXSxcbiAgc2Vzc2lvbjoge1xuICAgIHN0cmF0ZWd5OiBcImp3dFwiLFxuICAgIG1heEFnZTogMzAgKiAyNCAqIDYwICogNjAsIC8vIDMwIGRheXNcbiAgfSxcbiAgY2FsbGJhY2tzOiB7XG4gICAgYXN5bmMgand0KHsgdG9rZW4sIGFjY291bnQsIHByb2ZpbGUgfSkge1xuICAgICAgaWYgKGFjY291bnQgJiYgcHJvZmlsZSkge1xuICAgICAgICBjb25zdCBrZXljbG9ha1Byb2ZpbGUgPSBwcm9maWxlIGFzIEtleWNsb2FrUHJvZmlsZTtcbiAgICAgICAgY29uc3Qgcm9sZXMgPSBrZXljbG9ha1Byb2ZpbGUucmVhbG1fYWNjZXNzPy5yb2xlcyB8fCBbXTtcbiAgICAgICAgY29uc3QgY2xlYW5Sb2xlcyA9IHJvbGVzLm1hcCgocm9sZTogc3RyaW5nKSA9PiBcbiAgICAgICAgICByb2xlLnJlcGxhY2UoL15ST0xFXy8sICcnKS50b0xvd2VyQ2FzZSgpXG4gICAgICAgICk7XG5cbiAgICAgICAgdG9rZW4uYWNjZXNzVG9rZW4gPSBhY2NvdW50LmFjY2Vzc190b2tlbiA/PyAnJztcbiAgICAgICAgdG9rZW4ucmVmcmVzaFRva2VuID0gYWNjb3VudC5yZWZyZXNoX3Rva2VuID8/ICcnO1xuICAgICAgICB0b2tlbi5hY2Nlc3NUb2tlbkV4cGlyZXMgPSBhY2NvdW50LmV4cGlyZXNfYXQgPz8gMDtcbiAgICAgICAgdG9rZW4uc3ViID0ga2V5Y2xvYWtQcm9maWxlLnN1YjtcbiAgICAgICAgdG9rZW4ucm9sZSA9IGNsZWFuUm9sZXM7XG4gICAgICAgIHRva2VuLnVzZXJuYW1lID0ga2V5Y2xvYWtQcm9maWxlLnByZWZlcnJlZF91c2VybmFtZSA/PyAnJztcbiAgICAgICAgdG9rZW4uZmlyc3RfbmFtZSA9IGtleWNsb2FrUHJvZmlsZS5naXZlbl9uYW1lID8/ICcnO1xuICAgICAgICB0b2tlbi5sYXN0X25hbWUgPSBrZXljbG9ha1Byb2ZpbGUuZmFtaWx5X25hbWUgPz8gJyc7XG4gICAgICB9IGVsc2UgaWYgKHRva2VuLmFjY2Vzc1Rva2VuKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgZGVjb2RlZCA9IGp3dERlY29kZTxEZWNvZGVkVG9rZW4+KHRva2VuLmFjY2Vzc1Rva2VuKTtcbiAgICAgICAgICBpZiAoZGVjb2RlZC5yZWFsbV9hY2Nlc3M/LnJvbGVzKSB7XG4gICAgICAgICAgICBjb25zdCByb2xlcyA9IGRlY29kZWQucmVhbG1fYWNjZXNzLnJvbGVzO1xuICAgICAgICAgICAgY29uc3QgY2xlYW5Sb2xlcyA9IHJvbGVzLm1hcCgocm9sZTogc3RyaW5nKSA9PiBcbiAgICAgICAgICAgICAgcm9sZS5yZXBsYWNlKC9eUk9MRV8vLCAnJykudG9Mb3dlckNhc2UoKVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIHRva2VuLnJvbGUgPSBjbGVhblJvbGVzO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKCdFcnJvciBkZWNvZGluZyB0b2tlbjonLCBlcnJvcik7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKERhdGUubm93KCkgPCAodG9rZW4uYWNjZXNzVG9rZW5FeHBpcmVzIGFzIG51bWJlcikgKiAxMDAwKSB7XG4gICAgICAgIHJldHVybiB0b2tlbjtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHJlZnJlc2hBY2Nlc3NUb2tlbih0b2tlbik7XG4gICAgfSxcbiAgICBhc3luYyBzZXNzaW9uKHsgc2Vzc2lvbiwgdG9rZW4gfSkge1xuICAgICAgaWYgKHRva2VuLmVycm9yKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcih0b2tlbi5lcnJvcik7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHVzZXJSb2xlcyA9IEFycmF5LmlzQXJyYXkodG9rZW4ucm9sZSkgPyB0b2tlbi5yb2xlIDogW107XG4gICAgICBzZXNzaW9uLnVzZXIgPSB7XG4gICAgICAgIGlkOiB0b2tlbi5zdWIgPz8gJycsXG4gICAgICAgIGVtYWlsOiB0b2tlbi5lbWFpbCA/PyBudWxsLFxuICAgICAgICBuYW1lOiB0b2tlbi5uYW1lID8/IG51bGwsXG4gICAgICAgIGltYWdlOiBudWxsLFxuICAgICAgICB1c2VybmFtZTogdG9rZW4udXNlcm5hbWUgPz8gJycsXG4gICAgICAgIGZpcnN0X25hbWU6IHRva2VuLmZpcnN0X25hbWUgPz8gJycsXG4gICAgICAgIGxhc3RfbmFtZTogdG9rZW4ubGFzdF9uYW1lID8/ICcnLFxuICAgICAgICByb2xlOiB1c2VyUm9sZXMsXG4gICAgICAgIG5leHRjbG91ZEluaXRpYWxpemVkOiBmYWxzZSxcbiAgICAgIH07XG4gICAgICBzZXNzaW9uLmFjY2Vzc1Rva2VuID0gdG9rZW4uYWNjZXNzVG9rZW47XG5cbiAgICAgIHJldHVybiBzZXNzaW9uO1xuICAgIH1cbiAgfSxcbiAgcGFnZXM6IHtcbiAgICBzaWduSW46ICcvc2lnbmluJyxcbiAgICBlcnJvcjogJy9zaWduaW4nLFxuICB9LFxuICBkZWJ1ZzogcHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09ICdkZXZlbG9wbWVudCcsXG59O1xuXG5jb25zdCBoYW5kbGVyID0gTmV4dEF1dGgoYXV0aE9wdGlvbnMpO1xuZXhwb3J0IHsgaGFuZGxlciBhcyBHRVQsIGhhbmRsZXIgYXMgUE9TVCB9O1xuXG5pbnRlcmZhY2UgSldUIHtcbiAgYWNjZXNzVG9rZW46IHN0cmluZztcbiAgcmVmcmVzaFRva2VuOiBzdHJpbmc7XG4gIGFjY2Vzc1Rva2VuRXhwaXJlczogbnVtYmVyO1xufVxuXG5pbnRlcmZhY2UgUHJvZmlsZSB7XG4gIHN1Yj86IHN0cmluZztcbiAgZW1haWw/OiBzdHJpbmc7XG4gIG5hbWU/OiBzdHJpbmc7XG4gIHJvbGVzPzogc3RyaW5nW107XG59XG5cbiJdLCJuYW1lcyI6WyJOZXh0QXV0aCIsIktleWNsb2FrUHJvdmlkZXIiLCJqd3REZWNvZGUiLCJnZXRSZXF1aXJlZEVudlZhciIsIm5hbWUiLCJ2YWx1ZSIsInByb2Nlc3MiLCJlbnYiLCJFcnJvciIsInJlZnJlc2hBY2Nlc3NUb2tlbiIsInRva2VuIiwicmVzcG9uc2UiLCJmZXRjaCIsIktFWUNMT0FLX0lTU1VFUiIsImhlYWRlcnMiLCJib2R5IiwiVVJMU2VhcmNoUGFyYW1zIiwiY2xpZW50X2lkIiwiS0VZQ0xPQUtfQ0xJRU5UX0lEIiwiY2xpZW50X3NlY3JldCIsIktFWUNMT0FLX0NMSUVOVF9TRUNSRVQiLCJncmFudF90eXBlIiwicmVmcmVzaF90b2tlbiIsInJlZnJlc2hUb2tlbiIsIm1ldGhvZCIsInJlZnJlc2hlZFRva2VucyIsImpzb24iLCJvayIsImFjY2Vzc1Rva2VuIiwiYWNjZXNzX3Rva2VuIiwiYWNjZXNzVG9rZW5FeHBpcmVzIiwiRGF0ZSIsIm5vdyIsImV4cGlyZXNfaW4iLCJlcnJvciIsImNvbnNvbGUiLCJhdXRoT3B0aW9ucyIsInByb3ZpZGVycyIsImNsaWVudElkIiwiY2xpZW50U2VjcmV0IiwiaXNzdWVyIiwiYXV0aG9yaXphdGlvbiIsInBhcmFtcyIsInNjb3BlIiwicHJvZmlsZSIsImxvZyIsInJhd1Byb2ZpbGUiLCJyYXdSb2xlcyIsInJvbGVzIiwicmVhbG1BY2Nlc3MiLCJyZWFsbV9hY2Nlc3MiLCJncm91cHMiLCJjbGVhblJvbGVzIiwibWFwIiwicm9sZSIsInJlcGxhY2UiLCJ0b0xvd2VyQ2FzZSIsImlkIiwic3ViIiwicHJlZmVycmVkX3VzZXJuYW1lIiwiZW1haWwiLCJmaXJzdF9uYW1lIiwiZ2l2ZW5fbmFtZSIsImxhc3RfbmFtZSIsImZhbWlseV9uYW1lIiwidXNlcm5hbWUiLCJzcGxpdCIsInNlc3Npb24iLCJzdHJhdGVneSIsIm1heEFnZSIsImNhbGxiYWNrcyIsImp3dCIsImFjY291bnQiLCJrZXljbG9ha1Byb2ZpbGUiLCJleHBpcmVzX2F0IiwiZGVjb2RlZCIsInVzZXJSb2xlcyIsIkFycmF5IiwiaXNBcnJheSIsInVzZXIiLCJpbWFnZSIsIm5leHRjbG91ZEluaXRpYWxpemVkIiwicGFnZXMiLCJzaWduSW4iLCJkZWJ1ZyIsImhhbmRsZXIiLCJHRVQiLCJQT1NUIl0sImlnbm9yZUxpc3QiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///(rsc)/./app/api/auth/[...nextauth]/route.ts\n");
/***/ }),
/***/ "(rsc)/./app/api/rocket-chat/messages/route.ts":
/*!***********************************************!*\
!*** ./app/api/rocket-chat/messages/route.ts ***!
\***********************************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ GET: () => (/* binding */ GET)\n/* harmony export */ });\n/* harmony import */ var next_auth__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! next-auth */ \"(rsc)/./node_modules/next-auth/index.js\");\n/* harmony import */ var next_auth__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(next_auth__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _app_api_auth_nextauth_route__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @/app/api/auth/[...nextauth]/route */ \"(rsc)/./app/api/auth/[...nextauth]/route.ts\");\n/* harmony import */ var next_server__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! next/server */ \"(rsc)/./node_modules/next/dist/api/server.js\");\n\n\n\n// Helper function to get user token using admin credentials\nasync function getUserToken(baseUrl) {\n try {\n // Step 1: Use admin token to authenticate\n const adminHeaders = {\n 'X-Auth-Token': process.env.ROCKET_CHAT_TOKEN,\n 'X-User-Id': process.env.ROCKET_CHAT_USER_ID,\n 'Content-Type': 'application/json'\n };\n // Step 2: Create user token using admin credentials\n const createTokenResponse = await fetch(`${baseUrl}/api/v1/users.createToken`, {\n method: 'POST',\n headers: adminHeaders\n });\n if (!createTokenResponse.ok) {\n console.error('Failed to create user token:', createTokenResponse.status);\n return null;\n }\n const tokenData = await createTokenResponse.json();\n return {\n authToken: tokenData.data.authToken,\n userId: tokenData.data.userId\n };\n } catch (error) {\n console.error('Error getting user token:', error);\n return null;\n }\n}\nasync function GET(request) {\n try {\n const session = await (0,next_auth__WEBPACK_IMPORTED_MODULE_0__.getServerSession)(_app_api_auth_nextauth_route__WEBPACK_IMPORTED_MODULE_1__.authOptions);\n if (!session?.user?.email) {\n console.error('No valid session or email found');\n return next_server__WEBPACK_IMPORTED_MODULE_2__.NextResponse.json({\n messages: []\n }, {\n status: 200\n });\n }\n const baseUrl = \"https://parole.slm-lab.net/channel/City\"?.split('/channel')[0];\n if (!baseUrl) {\n console.error('Failed to get Rocket.Chat base URL');\n return next_server__WEBPACK_IMPORTED_MODULE_2__.NextResponse.json({\n error: 'Server configuration error'\n }, {\n status: 500\n });\n }\n console.log('Using Rocket.Chat base URL:', baseUrl);\n // Step 1: Use admin token to authenticate\n const adminHeaders = {\n 'X-Auth-Token': process.env.ROCKET_CHAT_TOKEN,\n 'X-User-Id': process.env.ROCKET_CHAT_USER_ID,\n 'Content-Type': 'application/json'\n };\n // Step 2: Get the current user's Rocket.Chat ID\n const username = session.user.email.split('@')[0];\n if (!username) {\n console.error('No username found in session email');\n return next_server__WEBPACK_IMPORTED_MODULE_2__.NextResponse.json({\n messages: []\n }, {\n status: 200\n });\n }\n // Get all users to find the current user\n const usersResponse = await fetch(`${baseUrl}/api/v1/users.list`, {\n method: 'GET',\n headers: adminHeaders\n });\n if (!usersResponse.ok) {\n console.error('Failed to get users list:', usersResponse.status);\n return next_server__WEBPACK_IMPORTED_MODULE_2__.NextResponse.json({\n messages: []\n }, {\n status: 200\n });\n }\n const usersData = await usersResponse.json();\n console.log('Users list response:', {\n success: usersData.success,\n count: usersData.count,\n usersCount: usersData.users?.length\n });\n // Find the current user in the list\n const currentUser = usersData.users.find((user)=>user.username === username || user.emails?.some((email)=>email.address === session.user.email));\n if (!currentUser) {\n console.error('User not found in users list');\n return next_server__WEBPACK_IMPORTED_MODULE_2__.NextResponse.json({\n messages: []\n }, {\n status: 200\n });\n }\n console.log('Found Rocket.Chat user:', {\n username: currentUser.username,\n id: currentUser._id\n });\n // Step 3: Create a token for the current user\n const createTokenResponse = await fetch(`${baseUrl}/api/v1/users.createToken`, {\n method: 'POST',\n headers: adminHeaders,\n body: JSON.stringify({\n userId: currentUser._id\n })\n });\n if (!createTokenResponse.ok) {\n console.error('Failed to create user token:', createTokenResponse.status);\n const errorText = await createTokenResponse.text();\n console.error('Create token error details:', errorText);\n return next_server__WEBPACK_IMPORTED_MODULE_2__.NextResponse.json({\n messages: []\n }, {\n status: 200\n });\n }\n const tokenData = await createTokenResponse.json();\n // Use the user's token for subsequent requests\n const userHeaders = {\n 'X-Auth-Token': tokenData.data.authToken,\n 'X-User-Id': currentUser._id,\n 'Content-Type': 'application/json'\n };\n // Step 4: Get user's subscriptions using user token\n const subscriptionsResponse = await fetch(`${baseUrl}/api/v1/subscriptions.get`, {\n method: 'GET',\n headers: userHeaders\n });\n if (!subscriptionsResponse.ok) {\n console.error('Failed to get subscriptions:', subscriptionsResponse.status);\n const errorText = await subscriptionsResponse.text();\n console.error('Subscriptions error details:', errorText);\n return next_server__WEBPACK_IMPORTED_MODULE_2__.NextResponse.json({\n messages: []\n }, {\n status: 200\n });\n }\n const subscriptionsData = await subscriptionsResponse.json();\n if (!subscriptionsData.success || !Array.isArray(subscriptionsData.update)) {\n console.error('Invalid subscriptions response structure');\n return next_server__WEBPACK_IMPORTED_MODULE_2__.NextResponse.json({\n messages: []\n }, {\n status: 200\n });\n }\n // Filter subscriptions for the current user\n const userSubscriptions = subscriptionsData.update.filter((sub)=>{\n // Only include rooms with unread messages or alerts\n if (!(sub.unread > 0 || sub.alert)) {\n return false;\n }\n // Include all types of rooms the user is subscribed to\n return [\n 'd',\n 'c',\n 'p'\n ].includes(sub.t);\n });\n console.log('Filtered user subscriptions:', {\n userId: currentUser._id,\n username: currentUser.username,\n totalSubscriptions: userSubscriptions.length,\n subscriptionDetails: userSubscriptions.map((sub)=>({\n type: sub.t,\n name: sub.fname || sub.name,\n rid: sub.rid,\n alert: sub.alert,\n unread: sub.unread,\n userMentions: sub.userMentions\n }))\n });\n const messages = [];\n const processedRooms = new Set();\n const latestMessagePerRoom = {};\n // Step 5: Fetch messages using user token\n for (const subscription of userSubscriptions){\n try {\n // Determine the correct endpoint and parameters based on room type\n let endpoint;\n switch(subscription.t){\n case 'c':\n endpoint = 'channels.messages';\n break;\n case 'p':\n endpoint = 'groups.messages';\n break;\n case 'd':\n endpoint = 'im.messages';\n break;\n default:\n continue;\n }\n const queryParams = new URLSearchParams({\n roomId: subscription.rid,\n count: String(Math.max(subscription.unread, 5)) // Fetch at least the number of unread messages\n });\n const messagesResponse = await fetch(`${baseUrl}/api/v1/${endpoint}?${queryParams}`, {\n method: 'GET',\n headers: userHeaders\n });\n if (!messagesResponse.ok) {\n console.error(`Failed to get messages for room ${subscription.name}:`, messagesResponse.status);\n continue;\n }\n const messageData = await messagesResponse.json();\n console.log(`Messages for room ${subscription.fname || subscription.name}:`, {\n success: messageData.success,\n count: messageData.count,\n hasMessages: messageData.messages?.length > 0\n });\n if (messageData.success && messageData.messages?.length > 0) {\n // Filter out system messages and join notifications for channels\n const validMessages = messageData.messages.filter((message)=>{\n // Skip messages sent by the current user\n if (message.u._id === currentUser._id) {\n return false;\n }\n // For channels, apply strict filtering\n if (subscription.t === 'c') {\n if (!message.msg || // No message text\n message.t || // System message\n !message.u || // No user info\n message.msg.includes('has joined the channel') || message.msg.includes('has left the channel') || message.msg.includes('added') || message.msg.includes('removed')) {\n return false;\n }\n }\n return true;\n });\n // Only process the latest valid message from this room\n if (validMessages.length > 0) {\n // Get the latest message (they should already be sorted by timestamp)\n const latestMessage = validMessages[0];\n const messageUser = latestMessage.u || {};\n const username = messageUser.username || 'unknown';\n // Skip if this is our own message (double-check)\n if (messageUser._id === currentUser._id) {\n continue;\n }\n // Get proper display names\n let roomDisplayName = subscription.fname || subscription.name;\n let userDisplayName = messageUser.name || username;\n // Handle call messages\n let messageText = latestMessage.msg || '';\n if (messageText.includes('started a call')) {\n messageText = '📞 Call received';\n }\n // Format timestamp\n const timestamp = new Date(latestMessage.ts);\n const now = new Date();\n let formattedTime = '';\n if (isNaN(timestamp.getTime())) {\n formattedTime = 'Invalid Date';\n } else if (timestamp.toDateString() === now.toDateString()) {\n formattedTime = timestamp.toLocaleTimeString('fr-FR', {\n hour: '2-digit',\n minute: '2-digit'\n });\n } else {\n formattedTime = timestamp.toLocaleDateString('fr-FR', {\n day: '2-digit',\n month: 'short'\n });\n }\n // Create initials for the sender\n const initials = userDisplayName.split(' ').map((n)=>n[0]).slice(0, 2).join('').toUpperCase();\n const processedMessage = {\n id: latestMessage._id,\n text: messageText,\n timestamp: formattedTime,\n rawTimestamp: latestMessage.ts,\n roomName: roomDisplayName,\n roomType: subscription.t,\n sender: {\n _id: messageUser._id,\n username: username,\n name: userDisplayName,\n initials: initials,\n color: getAvatarColor(username)\n },\n isOwnMessage: messageUser._id === currentUser._id,\n room: {\n id: subscription.rid,\n type: subscription.t,\n name: roomDisplayName,\n isChannel: subscription.t === 'c',\n isPrivateGroup: subscription.t === 'p',\n isDirect: subscription.t === 'd',\n link: `${baseUrl}/${subscription.t === 'd' ? 'direct' : subscription.t === 'p' ? 'group' : 'channel'}/${subscription.name}`,\n unread: subscription.unread,\n alert: subscription.alert,\n userMentions: subscription.userMentions\n }\n };\n // Store this message if it's the latest for this room\n if (!latestMessagePerRoom[subscription.rid] || new Date(latestMessage.ts).getTime() > new Date(latestMessagePerRoom[subscription.rid].rawTimestamp).getTime()) {\n latestMessagePerRoom[subscription.rid] = processedMessage;\n }\n }\n }\n } catch (error) {\n console.error(`Error fetching messages for room ${subscription.name}:`, error);\n continue;\n }\n }\n // Convert the latest messages object to an array and sort by timestamp\n const sortedMessages = Object.values(latestMessagePerRoom).sort((a, b)=>{\n const dateA = new Date(a.rawTimestamp);\n const dateB = new Date(b.rawTimestamp);\n return dateB.getTime() - dateA.getTime();\n }).slice(0, 10);\n return next_server__WEBPACK_IMPORTED_MODULE_2__.NextResponse.json({\n messages: sortedMessages,\n total: Object.keys(latestMessagePerRoom).length,\n hasMore: Object.keys(latestMessagePerRoom).length > 10\n }, {\n status: 200\n });\n } catch (error) {\n console.error('Error in messages endpoint:', error);\n return next_server__WEBPACK_IMPORTED_MODULE_2__.NextResponse.json({\n messages: [],\n total: 0,\n hasMore: false\n }, {\n status: 200\n });\n }\n}\n// Helper function to generate consistent avatar colors\nfunction getAvatarColor(username) {\n const colors = [\n '#FF7452',\n '#4CAF50',\n '#2196F3',\n '#9C27B0',\n '#FF9800',\n '#00BCD4',\n '#795548',\n '#607D8B' // Blue Grey\n ];\n // Generate a consistent index based on username\n const index = username.split('').reduce((acc, char)=>acc + char.charCodeAt(0), 0) % colors.length;\n return colors[index];\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKHJzYykvLi9hcHAvYXBpL3JvY2tldC1jaGF0L21lc3NhZ2VzL3JvdXRlLnRzIiwibWFwcGluZ3MiOiI7Ozs7Ozs7O0FBQTZDO0FBQ29CO0FBQ3RCO0FBRTNDLDREQUE0RDtBQUM1RCxlQUFlRyxhQUFhQyxPQUFlO0lBQ3pDLElBQUk7UUFDRiwwQ0FBMEM7UUFDMUMsTUFBTUMsZUFBZTtZQUNuQixnQkFBZ0JDLFFBQVFDLEdBQUcsQ0FBQ0MsaUJBQWlCO1lBQzdDLGFBQWFGLFFBQVFDLEdBQUcsQ0FBQ0UsbUJBQW1CO1lBQzVDLGdCQUFnQjtRQUNsQjtRQUVBLG9EQUFvRDtRQUNwRCxNQUFNQyxzQkFBc0IsTUFBTUMsTUFBTSxHQUFHUCxRQUFRLHlCQUF5QixDQUFDLEVBQUU7WUFDN0VRLFFBQVE7WUFDUkMsU0FBU1I7UUFDWDtRQUVBLElBQUksQ0FBQ0ssb0JBQW9CSSxFQUFFLEVBQUU7WUFDM0JDLFFBQVFDLEtBQUssQ0FBQyxnQ0FBZ0NOLG9CQUFvQk8sTUFBTTtZQUN4RSxPQUFPO1FBQ1Q7UUFFQSxNQUFNQyxZQUFZLE1BQU1SLG9CQUFvQlMsSUFBSTtRQUNoRCxPQUFPO1lBQ0xDLFdBQVdGLFVBQVVHLElBQUksQ0FBQ0QsU0FBUztZQUNuQ0UsUUFBUUosVUFBVUcsSUFBSSxDQUFDQyxNQUFNO1FBQy9CO0lBQ0YsRUFBRSxPQUFPTixPQUFPO1FBQ2RELFFBQVFDLEtBQUssQ0FBQyw2QkFBNkJBO1FBQzNDLE9BQU87SUFDVDtBQUNGO0FBRU8sZUFBZU8sSUFBSUMsT0FBZ0I7SUFDeEMsSUFBSTtRQUNGLE1BQU1DLFVBQVUsTUFBTXpCLDJEQUFnQkEsQ0FBQ0MscUVBQVdBO1FBRWxELElBQUksQ0FBQ3dCLFNBQVNDLE1BQU1DLE9BQU87WUFDekJaLFFBQVFDLEtBQUssQ0FBQztZQUNkLE9BQU9kLHFEQUFZQSxDQUFDaUIsSUFBSSxDQUFDO2dCQUFFUyxVQUFVLEVBQUU7WUFBQyxHQUFHO2dCQUFFWCxRQUFRO1lBQUk7UUFDM0Q7UUFFQSxNQUFNYixVQUFVRSx5Q0FBeUMsRUFBRXdCLE1BQU0sV0FBVyxDQUFDLEVBQUU7UUFDL0UsSUFBSSxDQUFDMUIsU0FBUztZQUNaVyxRQUFRQyxLQUFLLENBQUM7WUFDZCxPQUFPZCxxREFBWUEsQ0FBQ2lCLElBQUksQ0FBQztnQkFBRUgsT0FBTztZQUE2QixHQUFHO2dCQUFFQyxRQUFRO1lBQUk7UUFDbEY7UUFFQUYsUUFBUWdCLEdBQUcsQ0FBQywrQkFBK0IzQjtRQUUzQywwQ0FBMEM7UUFDMUMsTUFBTUMsZUFBZTtZQUNuQixnQkFBZ0JDLFFBQVFDLEdBQUcsQ0FBQ0MsaUJBQWlCO1lBQzdDLGFBQWFGLFFBQVFDLEdBQUcsQ0FBQ0UsbUJBQW1CO1lBQzVDLGdCQUFnQjtRQUNsQjtRQUVBLGdEQUFnRDtRQUNoRCxNQUFNdUIsV0FBV1AsUUFBUUMsSUFBSSxDQUFDQyxLQUFLLENBQUNHLEtBQUssQ0FBQyxJQUFJLENBQUMsRUFBRTtRQUNqRCxJQUFJLENBQUNFLFVBQVU7WUFDYmpCLFFBQVFDLEtBQUssQ0FBQztZQUNkLE9BQU9kLHFEQUFZQSxDQUFDaUIsSUFBSSxDQUFDO2dCQUFFUyxVQUFVLEVBQUU7WUFBQyxHQUFHO2dCQUFFWCxRQUFRO1lBQUk7UUFDM0Q7UUFFQSx5Q0FBeUM7UUFDekMsTUFBTWdCLGdCQUFnQixNQUFNdEIsTUFBTSxHQUFHUCxRQUFRLGtCQUFrQixDQUFDLEVBQUU7WUFDaEVRLFFBQVE7WUFDUkMsU0FBU1I7UUFDWDtRQUVBLElBQUksQ0FBQzRCLGNBQWNuQixFQUFFLEVBQUU7WUFDckJDLFFBQVFDLEtBQUssQ0FBQyw2QkFBNkJpQixjQUFjaEIsTUFBTTtZQUMvRCxPQUFPZixxREFBWUEsQ0FBQ2lCLElBQUksQ0FBQztnQkFBRVMsVUFBVSxFQUFFO1lBQUMsR0FBRztnQkFBRVgsUUFBUTtZQUFJO1FBQzNEO1FBRUEsTUFBTWlCLFlBQVksTUFBTUQsY0FBY2QsSUFBSTtRQUMxQ0osUUFBUWdCLEdBQUcsQ0FBQyx3QkFBd0I7WUFDbENJLFNBQVNELFVBQVVDLE9BQU87WUFDMUJDLE9BQU9GLFVBQVVFLEtBQUs7WUFDdEJDLFlBQVlILFVBQVVJLEtBQUssRUFBRUM7UUFDL0I7UUFFQSxvQ0FBb0M7UUFDcEMsTUFBTUMsY0FBY04sVUFBVUksS0FBSyxDQUFDRyxJQUFJLENBQUMsQ0FBQ2YsT0FDeENBLEtBQUtNLFFBQVEsS0FBS0EsWUFBWU4sS0FBS2dCLE1BQU0sRUFBRUMsS0FBSyxDQUFDaEIsUUFBZUEsTUFBTWlCLE9BQU8sS0FBS25CLFFBQVFDLElBQUksQ0FBQ0MsS0FBSztRQUd0RyxJQUFJLENBQUNhLGFBQWE7WUFDaEJ6QixRQUFRQyxLQUFLLENBQUM7WUFDZCxPQUFPZCxxREFBWUEsQ0FBQ2lCLElBQUksQ0FBQztnQkFBRVMsVUFBVSxFQUFFO1lBQUMsR0FBRztnQkFBRVgsUUFBUTtZQUFJO1FBQzNEO1FBRUFGLFFBQVFnQixHQUFHLENBQUMsMkJBQTJCO1lBQ3JDQyxVQUFVUSxZQUFZUixRQUFRO1lBQzlCYSxJQUFJTCxZQUFZTSxHQUFHO1FBQ3JCO1FBRUEsOENBQThDO1FBQzlDLE1BQU1wQyxzQkFBc0IsTUFBTUMsTUFBTSxHQUFHUCxRQUFRLHlCQUF5QixDQUFDLEVBQUU7WUFDN0VRLFFBQVE7WUFDUkMsU0FBU1I7WUFDVDBDLE1BQU1DLEtBQUtDLFNBQVMsQ0FBQztnQkFDbkIzQixRQUFRa0IsWUFBWU0sR0FBRztZQUN6QjtRQUNGO1FBRUEsSUFBSSxDQUFDcEMsb0JBQW9CSSxFQUFFLEVBQUU7WUFDM0JDLFFBQVFDLEtBQUssQ0FBQyxnQ0FBZ0NOLG9CQUFvQk8sTUFBTTtZQUN4RSxNQUFNaUMsWUFBWSxNQUFNeEMsb0JBQW9CeUMsSUFBSTtZQUNoRHBDLFFBQVFDLEtBQUssQ0FBQywrQkFBK0JrQztZQUM3QyxPQUFPaEQscURBQVlBLENBQUNpQixJQUFJLENBQUM7Z0JBQUVTLFVBQVUsRUFBRTtZQUFDLEdBQUc7Z0JBQUVYLFFBQVE7WUFBSTtRQUMzRDtRQUVBLE1BQU1DLFlBQVksTUFBTVIsb0JBQW9CUyxJQUFJO1FBRWhELCtDQUErQztRQUMvQyxNQUFNaUMsY0FBYztZQUNsQixnQkFBZ0JsQyxVQUFVRyxJQUFJLENBQUNELFNBQVM7WUFDeEMsYUFBYW9CLFlBQVlNLEdBQUc7WUFDNUIsZ0JBQWdCO1FBQ2xCO1FBRUEsb0RBQW9EO1FBQ3BELE1BQU1PLHdCQUF3QixNQUFNMUMsTUFBTSxHQUFHUCxRQUFRLHlCQUF5QixDQUFDLEVBQUU7WUFDL0VRLFFBQVE7WUFDUkMsU0FBU3VDO1FBQ1g7UUFFQSxJQUFJLENBQUNDLHNCQUFzQnZDLEVBQUUsRUFBRTtZQUM3QkMsUUFBUUMsS0FBSyxDQUFDLGdDQUFnQ3FDLHNCQUFzQnBDLE1BQU07WUFDMUUsTUFBTWlDLFlBQVksTUFBTUcsc0JBQXNCRixJQUFJO1lBQ2xEcEMsUUFBUUMsS0FBSyxDQUFDLGdDQUFnQ2tDO1lBQzlDLE9BQU9oRCxxREFBWUEsQ0FBQ2lCLElBQUksQ0FBQztnQkFBRVMsVUFBVSxFQUFFO1lBQUMsR0FBRztnQkFBRVgsUUFBUTtZQUFJO1FBQzNEO1FBRUEsTUFBTXFDLG9CQUFvQixNQUFNRCxzQkFBc0JsQyxJQUFJO1FBRTFELElBQUksQ0FBQ21DLGtCQUFrQm5CLE9BQU8sSUFBSSxDQUFDb0IsTUFBTUMsT0FBTyxDQUFDRixrQkFBa0JHLE1BQU0sR0FBRztZQUMxRTFDLFFBQVFDLEtBQUssQ0FBQztZQUNkLE9BQU9kLHFEQUFZQSxDQUFDaUIsSUFBSSxDQUFDO2dCQUFFUyxVQUFVLEVBQUU7WUFBQyxHQUFHO2dCQUFFWCxRQUFRO1lBQUk7UUFDM0Q7UUFFQSw0Q0FBNEM7UUFDNUMsTUFBTXlDLG9CQUFvQkosa0JBQWtCRyxNQUFNLENBQUNFLE1BQU0sQ0FBQyxDQUFDQztZQUN6RCxvREFBb0Q7WUFDcEQsSUFBSSxDQUFFQSxDQUFBQSxJQUFJQyxNQUFNLEdBQUcsS0FBS0QsSUFBSUUsS0FBSyxHQUFHO2dCQUNsQyxPQUFPO1lBQ1Q7WUFDQSx1REFBdUQ7WUFDdkQsT0FBTztnQkFBQztnQkFBSztnQkFBSzthQUFJLENBQUNDLFFBQVEsQ0FBQ0gsSUFBSUksQ0FBQztRQUN2QztRQUVBakQsUUFBUWdCLEdBQUcsQ0FBQyxnQ0FBZ0M7WUFDMUNULFFBQVFrQixZQUFZTSxHQUFHO1lBQ3ZCZCxVQUFVUSxZQUFZUixRQUFRO1lBQzlCaUMsb0JBQW9CUCxrQkFBa0JuQixNQUFNO1lBQzVDMkIscUJBQXFCUixrQkFBa0JTLEdBQUcsQ0FBQyxDQUFDUCxNQUFjO29CQUN4RFEsTUFBTVIsSUFBSUksQ0FBQztvQkFDWEssTUFBTVQsSUFBSVUsS0FBSyxJQUFJVixJQUFJUyxJQUFJO29CQUMzQkUsS0FBS1gsSUFBSVcsR0FBRztvQkFDWlQsT0FBT0YsSUFBSUUsS0FBSztvQkFDaEJELFFBQVFELElBQUlDLE1BQU07b0JBQ2xCVyxjQUFjWixJQUFJWSxZQUFZO2dCQUNoQztRQUNGO1FBRUEsTUFBTTVDLFdBQWtCLEVBQUU7UUFDMUIsTUFBTTZDLGlCQUFpQixJQUFJQztRQUMzQixNQUFNQyx1QkFBK0MsQ0FBQztRQUV0RCwwQ0FBMEM7UUFDMUMsS0FBSyxNQUFNQyxnQkFBZ0JsQixrQkFBbUI7WUFDNUMsSUFBSTtnQkFDRixtRUFBbUU7Z0JBQ25FLElBQUltQjtnQkFDSixPQUFRRCxhQUFhWixDQUFDO29CQUNwQixLQUFLO3dCQUNIYSxXQUFXO3dCQUNYO29CQUNGLEtBQUs7d0JBQ0hBLFdBQVc7d0JBQ1g7b0JBQ0YsS0FBSzt3QkFDSEEsV0FBVzt3QkFDWDtvQkFDRjt3QkFDRTtnQkFDSjtnQkFFQSxNQUFNQyxjQUFjLElBQUlDLGdCQUFnQjtvQkFDdENDLFFBQVFKLGFBQWFMLEdBQUc7b0JBQ3hCbkMsT0FBTzZDLE9BQU9DLEtBQUtDLEdBQUcsQ0FBQ1AsYUFBYWYsTUFBTSxFQUFFLElBQUssK0NBQStDO2dCQUNsRztnQkFFQSxNQUFNdUIsbUJBQW1CLE1BQU16RSxNQUM3QixHQUFHUCxRQUFRLFFBQVEsRUFBRXlFLFNBQVMsQ0FBQyxFQUFFQyxhQUFhLEVBQUU7b0JBQzlDbEUsUUFBUTtvQkFDUkMsU0FBU3VDO2dCQUNYO2dCQUdGLElBQUksQ0FBQ2dDLGlCQUFpQnRFLEVBQUUsRUFBRTtvQkFDeEJDLFFBQVFDLEtBQUssQ0FBQyxDQUFDLGdDQUFnQyxFQUFFNEQsYUFBYVAsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFZSxpQkFBaUJuRSxNQUFNO29CQUM5RjtnQkFDRjtnQkFFQSxNQUFNb0UsY0FBYyxNQUFNRCxpQkFBaUJqRSxJQUFJO2dCQUMvQ0osUUFBUWdCLEdBQUcsQ0FBQyxDQUFDLGtCQUFrQixFQUFFNkMsYUFBYU4sS0FBSyxJQUFJTSxhQUFhUCxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUU7b0JBQzNFbEMsU0FBU2tELFlBQVlsRCxPQUFPO29CQUM1QkMsT0FBT2lELFlBQVlqRCxLQUFLO29CQUN4QmtELGFBQWFELFlBQVl6RCxRQUFRLEVBQUVXLFNBQVM7Z0JBQzlDO2dCQUVBLElBQUk4QyxZQUFZbEQsT0FBTyxJQUFJa0QsWUFBWXpELFFBQVEsRUFBRVcsU0FBUyxHQUFHO29CQUMzRCxpRUFBaUU7b0JBQ2pFLE1BQU1nRCxnQkFBZ0JGLFlBQVl6RCxRQUFRLENBQUMrQixNQUFNLENBQUMsQ0FBQzZCO3dCQUNqRCx5Q0FBeUM7d0JBQ3pDLElBQUlBLFFBQVFDLENBQUMsQ0FBQzNDLEdBQUcsS0FBS04sWUFBWU0sR0FBRyxFQUFFOzRCQUNyQyxPQUFPO3dCQUNUO3dCQUVBLHVDQUF1Qzt3QkFDdkMsSUFBSThCLGFBQWFaLENBQUMsS0FBSyxLQUFLOzRCQUMxQixJQUFJLENBQUN3QixRQUFRRSxHQUFHLElBQUksa0JBQWtCOzRCQUNsQ0YsUUFBUXhCLENBQUMsSUFBSSxpQkFBaUI7NEJBQzlCLENBQUN3QixRQUFRQyxDQUFDLElBQUksZUFBZTs0QkFDN0JELFFBQVFFLEdBQUcsQ0FBQzNCLFFBQVEsQ0FBQyw2QkFDckJ5QixRQUFRRSxHQUFHLENBQUMzQixRQUFRLENBQUMsMkJBQ3JCeUIsUUFBUUUsR0FBRyxDQUFDM0IsUUFBUSxDQUFDLFlBQ3JCeUIsUUFBUUUsR0FBRyxDQUFDM0IsUUFBUSxDQUFDLFlBQVk7Z0NBQ25DLE9BQU87NEJBQ1Q7d0JBQ0Y7d0JBQ0EsT0FBTztvQkFDVDtvQkFFQSx1REFBdUQ7b0JBQ3ZELElBQUl3QixjQUFjaEQsTUFBTSxHQUFHLEdBQUc7d0JBQzVCLHNFQUFzRTt3QkFDdEUsTUFBTW9ELGdCQUFnQkosYUFBYSxDQUFDLEVBQUU7d0JBQ3RDLE1BQU1LLGNBQWNELGNBQWNGLENBQUMsSUFBSSxDQUFDO3dCQUN4QyxNQUFNekQsV0FBVzRELFlBQVk1RCxRQUFRLElBQUk7d0JBRXpDLGlEQUFpRDt3QkFDakQsSUFBSTRELFlBQVk5QyxHQUFHLEtBQUtOLFlBQVlNLEdBQUcsRUFBRTs0QkFDdkM7d0JBQ0Y7d0JBRUEsMkJBQTJCO3dCQUMzQixJQUFJK0Msa0JBQWtCakIsYUFBYU4sS0FBSyxJQUFJTSxhQUFhUCxJQUFJO3dCQUM3RCxJQUFJeUIsa0JBQWtCRixZQUFZdkIsSUFBSSxJQUFJckM7d0JBRTFDLHVCQUF1Qjt3QkFDdkIsSUFBSStELGNBQWNKLGNBQWNELEdBQUcsSUFBSTt3QkFDdkMsSUFBSUssWUFBWWhDLFFBQVEsQ0FBQyxtQkFBbUI7NEJBQzFDZ0MsY0FBYzt3QkFDaEI7d0JBRUEsbUJBQW1CO3dCQUNuQixNQUFNQyxZQUFZLElBQUlDLEtBQUtOLGNBQWNPLEVBQUU7d0JBQzNDLE1BQU1DLE1BQU0sSUFBSUY7d0JBQ2hCLElBQUlHLGdCQUFnQjt3QkFFcEIsSUFBSUMsTUFBTUwsVUFBVU0sT0FBTyxLQUFLOzRCQUM5QkYsZ0JBQWdCO3dCQUNsQixPQUFPLElBQUlKLFVBQVVPLFlBQVksT0FBT0osSUFBSUksWUFBWSxJQUFJOzRCQUMxREgsZ0JBQWdCSixVQUFVUSxrQkFBa0IsQ0FBQyxTQUFTO2dDQUNwREMsTUFBTTtnQ0FDTkMsUUFBUTs0QkFDVjt3QkFDRixPQUFPOzRCQUNMTixnQkFBZ0JKLFVBQVVXLGtCQUFrQixDQUFDLFNBQVM7Z0NBQ3BEQyxLQUFLO2dDQUNMQyxPQUFPOzRCQUNUO3dCQUNGO3dCQUVBLGlDQUFpQzt3QkFDakMsTUFBTUMsV0FBV2hCLGdCQUNkaEUsS0FBSyxDQUFDLEtBQ05xQyxHQUFHLENBQUMsQ0FBQzRDLElBQWNBLENBQUMsQ0FBQyxFQUFFLEVBQ3ZCQyxLQUFLLENBQUMsR0FBRyxHQUNUQyxJQUFJLENBQUMsSUFDTEMsV0FBVzt3QkFFZCxNQUFNQyxtQkFBbUI7NEJBQ3ZCdEUsSUFBSThDLGNBQWM3QyxHQUFHOzRCQUNyQkssTUFBTTRDOzRCQUNOQyxXQUFXSTs0QkFDWGdCLGNBQWN6QixjQUFjTyxFQUFFOzRCQUM5Qm1CLFVBQVV4Qjs0QkFDVnlCLFVBQVUxQyxhQUFhWixDQUFDOzRCQUN4QnVELFFBQVE7Z0NBQ056RSxLQUFLOEMsWUFBWTlDLEdBQUc7Z0NBQ3BCZCxVQUFVQTtnQ0FDVnFDLE1BQU15QjtnQ0FDTmdCLFVBQVVBO2dDQUNWVSxPQUFPQyxlQUFlekY7NEJBQ3hCOzRCQUNBMEYsY0FBYzlCLFlBQVk5QyxHQUFHLEtBQUtOLFlBQVlNLEdBQUc7NEJBQ2pENkUsTUFBTTtnQ0FDSjlFLElBQUkrQixhQUFhTCxHQUFHO2dDQUNwQkgsTUFBTVEsYUFBYVosQ0FBQztnQ0FDcEJLLE1BQU13QjtnQ0FDTitCLFdBQVdoRCxhQUFhWixDQUFDLEtBQUs7Z0NBQzlCNkQsZ0JBQWdCakQsYUFBYVosQ0FBQyxLQUFLO2dDQUNuQzhELFVBQVVsRCxhQUFhWixDQUFDLEtBQUs7Z0NBQzdCK0QsTUFBTSxHQUFHM0gsUUFBUSxDQUFDLEVBQUV3RSxhQUFhWixDQUFDLEtBQUssTUFBTSxXQUFXWSxhQUFhWixDQUFDLEtBQUssTUFBTSxVQUFVLFVBQVUsQ0FBQyxFQUFFWSxhQUFhUCxJQUFJLEVBQUU7Z0NBQzNIUixRQUFRZSxhQUFhZixNQUFNO2dDQUMzQkMsT0FBT2MsYUFBYWQsS0FBSztnQ0FDekJVLGNBQWNJLGFBQWFKLFlBQVk7NEJBQ3pDO3dCQUNGO3dCQUVBLHNEQUFzRDt3QkFDdEQsSUFBSSxDQUFDRyxvQkFBb0IsQ0FBQ0MsYUFBYUwsR0FBRyxDQUFDLElBQ3ZDLElBQUkwQixLQUFLTixjQUFjTyxFQUFFLEVBQUVJLE9BQU8sS0FBSyxJQUFJTCxLQUFLdEIsb0JBQW9CLENBQUNDLGFBQWFMLEdBQUcsQ0FBQyxDQUFDNkMsWUFBWSxFQUFFZCxPQUFPLElBQUk7NEJBQ2xIM0Isb0JBQW9CLENBQUNDLGFBQWFMLEdBQUcsQ0FBQyxHQUFHNEM7d0JBQzNDO29CQUNGO2dCQUNGO1lBQ0YsRUFBRSxPQUFPbkcsT0FBTztnQkFDZEQsUUFBUUMsS0FBSyxDQUFDLENBQUMsaUNBQWlDLEVBQUU0RCxhQUFhUCxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUVyRDtnQkFDeEU7WUFDRjtRQUNGO1FBRUEsdUVBQXVFO1FBQ3ZFLE1BQU1nSCxpQkFBaUJDLE9BQU9DLE1BQU0sQ0FBQ3ZELHNCQUNsQ3dELElBQUksQ0FBQyxDQUFDQyxHQUFHQztZQUNSLE1BQU1DLFFBQVEsSUFBSXJDLEtBQUttQyxFQUFFaEIsWUFBWTtZQUNyQyxNQUFNbUIsUUFBUSxJQUFJdEMsS0FBS29DLEVBQUVqQixZQUFZO1lBQ3JDLE9BQU9tQixNQUFNakMsT0FBTyxLQUFLZ0MsTUFBTWhDLE9BQU87UUFDeEMsR0FDQ1UsS0FBSyxDQUFDLEdBQUc7UUFFWixPQUFPOUcscURBQVlBLENBQUNpQixJQUFJLENBQUM7WUFDdkJTLFVBQVVvRztZQUNWUSxPQUFPUCxPQUFPUSxJQUFJLENBQUM5RCxzQkFBc0JwQyxNQUFNO1lBQy9DbUcsU0FBU1QsT0FBT1EsSUFBSSxDQUFDOUQsc0JBQXNCcEMsTUFBTSxHQUFHO1FBQ3RELEdBQUc7WUFBRXRCLFFBQVE7UUFBSTtJQUNuQixFQUFFLE9BQU9ELE9BQU87UUFDZEQsUUFBUUMsS0FBSyxDQUFDLCtCQUErQkE7UUFDN0MsT0FBT2QscURBQVlBLENBQUNpQixJQUFJLENBQUM7WUFBRVMsVUFBVSxFQUFFO1lBQUU0RyxPQUFPO1lBQUdFLFNBQVM7UUFBTSxHQUFHO1lBQUV6SCxRQUFRO1FBQUk7SUFDckY7QUFDRjtBQUVBLHVEQUF1RDtBQUN2RCxTQUFTd0csZUFBZXpGLFFBQWdCO0lBQ3RDLE1BQU0yRyxTQUFTO1FBQ2I7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQSxVQUFXLFlBQVk7S0FDeEI7SUFFRCxnREFBZ0Q7SUFDaEQsTUFBTUMsUUFBUTVHLFNBQ1hGLEtBQUssQ0FBQyxJQUNOK0csTUFBTSxDQUFDLENBQUNDLEtBQUtDLE9BQVNELE1BQU1DLEtBQUtDLFVBQVUsQ0FBQyxJQUFJLEtBQUtMLE9BQU9wRyxNQUFNO0lBRXJFLE9BQU9vRyxNQUFNLENBQUNDLE1BQU07QUFDdEIiLCJzb3VyY2VzIjpbIi9ob21lL2FsbWEvbmV4dGdlbi9OZWFoLW1haWwvYXBwL2FwaS9yb2NrZXQtY2hhdC9tZXNzYWdlcy9yb3V0ZS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBnZXRTZXJ2ZXJTZXNzaW9uIH0gZnJvbSBcIm5leHQtYXV0aFwiO1xuaW1wb3J0IHsgYXV0aE9wdGlvbnMgfSBmcm9tIFwiQC9hcHAvYXBpL2F1dGgvWy4uLm5leHRhdXRoXS9yb3V0ZVwiO1xuaW1wb3J0IHsgTmV4dFJlc3BvbnNlIH0gZnJvbSBcIm5leHQvc2VydmVyXCI7XG5cbi8vIEhlbHBlciBmdW5jdGlvbiB0byBnZXQgdXNlciB0b2tlbiB1c2luZyBhZG1pbiBjcmVkZW50aWFsc1xuYXN5bmMgZnVuY3Rpb24gZ2V0VXNlclRva2VuKGJhc2VVcmw6IHN0cmluZykge1xuICB0cnkge1xuICAgIC8vIFN0ZXAgMTogVXNlIGFkbWluIHRva2VuIHRvIGF1dGhlbnRpY2F0ZVxuICAgIGNvbnN0IGFkbWluSGVhZGVycyA9IHtcbiAgICAgICdYLUF1dGgtVG9rZW4nOiBwcm9jZXNzLmVudi5ST0NLRVRfQ0hBVF9UT0tFTiEsXG4gICAgICAnWC1Vc2VyLUlkJzogcHJvY2Vzcy5lbnYuUk9DS0VUX0NIQVRfVVNFUl9JRCEsXG4gICAgICAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nXG4gICAgfTtcblxuICAgIC8vIFN0ZXAgMjogQ3JlYXRlIHVzZXIgdG9rZW4gdXNpbmcgYWRtaW4gY3JlZGVudGlhbHNcbiAgICBjb25zdCBjcmVhdGVUb2tlblJlc3BvbnNlID0gYXdhaXQgZmV0Y2goYCR7YmFzZVVybH0vYXBpL3YxL3VzZXJzLmNyZWF0ZVRva2VuYCwge1xuICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICBoZWFkZXJzOiBhZG1pbkhlYWRlcnNcbiAgICB9KTtcblxuICAgIGlmICghY3JlYXRlVG9rZW5SZXNwb25zZS5vaykge1xuICAgICAgY29uc29sZS5lcnJvcignRmFpbGVkIHRvIGNyZWF0ZSB1c2VyIHRva2VuOicsIGNyZWF0ZVRva2VuUmVzcG9uc2Uuc3RhdHVzKTtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGNvbnN0IHRva2VuRGF0YSA9IGF3YWl0IGNyZWF0ZVRva2VuUmVzcG9uc2UuanNvbigpO1xuICAgIHJldHVybiB7XG4gICAgICBhdXRoVG9rZW46IHRva2VuRGF0YS5kYXRhLmF1dGhUb2tlbixcbiAgICAgIHVzZXJJZDogdG9rZW5EYXRhLmRhdGEudXNlcklkXG4gICAgfTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBjb25zb2xlLmVycm9yKCdFcnJvciBnZXR0aW5nIHVzZXIgdG9rZW46JywgZXJyb3IpO1xuICAgIHJldHVybiBudWxsO1xuICB9XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBHRVQocmVxdWVzdDogUmVxdWVzdCkge1xuICB0cnkge1xuICAgIGNvbnN0IHNlc3Npb24gPSBhd2FpdCBnZXRTZXJ2ZXJTZXNzaW9uKGF1dGhPcHRpb25zKTtcbiAgICBcbiAgICBpZiAoIXNlc3Npb24/LnVzZXI/LmVtYWlsKSB7XG4gICAgICBjb25zb2xlLmVycm9yKCdObyB2YWxpZCBzZXNzaW9uIG9yIGVtYWlsIGZvdW5kJyk7XG4gICAgICByZXR1cm4gTmV4dFJlc3BvbnNlLmpzb24oeyBtZXNzYWdlczogW10gfSwgeyBzdGF0dXM6IDIwMCB9KTtcbiAgICB9XG5cbiAgICBjb25zdCBiYXNlVXJsID0gcHJvY2Vzcy5lbnYuTkVYVF9QVUJMSUNfSUZSQU1FX1BBUk9MRV9VUkw/LnNwbGl0KCcvY2hhbm5lbCcpWzBdO1xuICAgIGlmICghYmFzZVVybCkge1xuICAgICAgY29uc29sZS5lcnJvcignRmFpbGVkIHRvIGdldCBSb2NrZXQuQ2hhdCBiYXNlIFVSTCcpO1xuICAgICAgcmV0dXJuIE5leHRSZXNwb25zZS5qc29uKHsgZXJyb3I6ICdTZXJ2ZXIgY29uZmlndXJhdGlvbiBlcnJvcicgfSwgeyBzdGF0dXM6IDUwMCB9KTtcbiAgICB9XG5cbiAgICBjb25zb2xlLmxvZygnVXNpbmcgUm9ja2V0LkNoYXQgYmFzZSBVUkw6JywgYmFzZVVybCk7XG5cbiAgICAvLyBTdGVwIDE6IFVzZSBhZG1pbiB0b2tlbiB0byBhdXRoZW50aWNhdGVcbiAgICBjb25zdCBhZG1pbkhlYWRlcnMgPSB7XG4gICAgICAnWC1BdXRoLVRva2VuJzogcHJvY2Vzcy5lbnYuUk9DS0VUX0NIQVRfVE9LRU4hLFxuICAgICAgJ1gtVXNlci1JZCc6IHByb2Nlc3MuZW52LlJPQ0tFVF9DSEFUX1VTRVJfSUQhLFxuICAgICAgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJ1xuICAgIH07XG5cbiAgICAvLyBTdGVwIDI6IEdldCB0aGUgY3VycmVudCB1c2VyJ3MgUm9ja2V0LkNoYXQgSURcbiAgICBjb25zdCB1c2VybmFtZSA9IHNlc3Npb24udXNlci5lbWFpbC5zcGxpdCgnQCcpWzBdO1xuICAgIGlmICghdXNlcm5hbWUpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ05vIHVzZXJuYW1lIGZvdW5kIGluIHNlc3Npb24gZW1haWwnKTtcbiAgICAgIHJldHVybiBOZXh0UmVzcG9uc2UuanNvbih7IG1lc3NhZ2VzOiBbXSB9LCB7IHN0YXR1czogMjAwIH0pO1xuICAgIH1cblxuICAgIC8vIEdldCBhbGwgdXNlcnMgdG8gZmluZCB0aGUgY3VycmVudCB1c2VyXG4gICAgY29uc3QgdXNlcnNSZXNwb25zZSA9IGF3YWl0IGZldGNoKGAke2Jhc2VVcmx9L2FwaS92MS91c2Vycy5saXN0YCwge1xuICAgICAgbWV0aG9kOiAnR0VUJyxcbiAgICAgIGhlYWRlcnM6IGFkbWluSGVhZGVyc1xuICAgIH0pO1xuXG4gICAgaWYgKCF1c2Vyc1Jlc3BvbnNlLm9rKSB7XG4gICAgICBjb25zb2xlLmVycm9yKCdGYWlsZWQgdG8gZ2V0IHVzZXJzIGxpc3Q6JywgdXNlcnNSZXNwb25zZS5zdGF0dXMpO1xuICAgICAgcmV0dXJuIE5leHRSZXNwb25zZS5qc29uKHsgbWVzc2FnZXM6IFtdIH0sIHsgc3RhdHVzOiAyMDAgfSk7XG4gICAgfVxuXG4gICAgY29uc3QgdXNlcnNEYXRhID0gYXdhaXQgdXNlcnNSZXNwb25zZS5qc29uKCk7XG4gICAgY29uc29sZS5sb2coJ1VzZXJzIGxpc3QgcmVzcG9uc2U6Jywge1xuICAgICAgc3VjY2VzczogdXNlcnNEYXRhLnN1Y2Nlc3MsXG4gICAgICBjb3VudDogdXNlcnNEYXRhLmNvdW50LFxuICAgICAgdXNlcnNDb3VudDogdXNlcnNEYXRhLnVzZXJzPy5sZW5ndGhcbiAgICB9KTtcblxuICAgIC8vIEZpbmQgdGhlIGN1cnJlbnQgdXNlciBpbiB0aGUgbGlzdFxuICAgIGNvbnN0IGN1cnJlbnRVc2VyID0gdXNlcnNEYXRhLnVzZXJzLmZpbmQoKHVzZXI6IGFueSkgPT4gXG4gICAgICB1c2VyLnVzZXJuYW1lID09PSB1c2VybmFtZSB8fCB1c2VyLmVtYWlscz8uc29tZSgoZW1haWw6IGFueSkgPT4gZW1haWwuYWRkcmVzcyA9PT0gc2Vzc2lvbi51c2VyLmVtYWlsKVxuICAgICk7XG5cbiAgICBpZiAoIWN1cnJlbnRVc2VyKSB7XG4gICAgICBjb25zb2xlLmVycm9yKCdVc2VyIG5vdCBmb3VuZCBpbiB1c2VycyBsaXN0Jyk7XG4gICAgICByZXR1cm4gTmV4dFJlc3BvbnNlLmpzb24oeyBtZXNzYWdlczogW10gfSwgeyBzdGF0dXM6IDIwMCB9KTtcbiAgICB9XG5cbiAgICBjb25zb2xlLmxvZygnRm91bmQgUm9ja2V0LkNoYXQgdXNlcjonLCB7XG4gICAgICB1c2VybmFtZTogY3VycmVudFVzZXIudXNlcm5hbWUsXG4gICAgICBpZDogY3VycmVudFVzZXIuX2lkXG4gICAgfSk7XG5cbiAgICAvLyBTdGVwIDM6IENyZWF0ZSBhIHRva2VuIGZvciB0aGUgY3VycmVudCB1c2VyXG4gICAgY29uc3QgY3JlYXRlVG9rZW5SZXNwb25zZSA9IGF3YWl0IGZldGNoKGAke2Jhc2VVcmx9L2FwaS92MS91c2Vycy5jcmVhdGVUb2tlbmAsIHtcbiAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgaGVhZGVyczogYWRtaW5IZWFkZXJzLFxuICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICB1c2VySWQ6IGN1cnJlbnRVc2VyLl9pZFxuICAgICAgfSlcbiAgICB9KTtcblxuICAgIGlmICghY3JlYXRlVG9rZW5SZXNwb25zZS5vaykge1xuICAgICAgY29uc29sZS5lcnJvcignRmFpbGVkIHRvIGNyZWF0ZSB1c2VyIHRva2VuOicsIGNyZWF0ZVRva2VuUmVzcG9uc2Uuc3RhdHVzKTtcbiAgICAgIGNvbnN0IGVycm9yVGV4dCA9IGF3YWl0IGNyZWF0ZVRva2VuUmVzcG9uc2UudGV4dCgpO1xuICAgICAgY29uc29sZS5lcnJvcignQ3JlYXRlIHRva2VuIGVycm9yIGRldGFpbHM6JywgZXJyb3JUZXh0KTtcbiAgICAgIHJldHVybiBOZXh0UmVzcG9uc2UuanNvbih7IG1lc3NhZ2VzOiBbXSB9LCB7IHN0YXR1czogMjAwIH0pO1xuICAgIH1cblxuICAgIGNvbnN0IHRva2VuRGF0YSA9IGF3YWl0IGNyZWF0ZVRva2VuUmVzcG9uc2UuanNvbigpO1xuICAgIFxuICAgIC8vIFVzZSB0aGUgdXNlcidzIHRva2VuIGZvciBzdWJzZXF1ZW50IHJlcXVlc3RzXG4gICAgY29uc3QgdXNlckhlYWRlcnMgPSB7XG4gICAgICAnWC1BdXRoLVRva2VuJzogdG9rZW5EYXRhLmRhdGEuYXV0aFRva2VuLFxuICAgICAgJ1gtVXNlci1JZCc6IGN1cnJlbnRVc2VyLl9pZCxcbiAgICAgICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbidcbiAgICB9O1xuXG4gICAgLy8gU3RlcCA0OiBHZXQgdXNlcidzIHN1YnNjcmlwdGlvbnMgdXNpbmcgdXNlciB0b2tlblxuICAgIGNvbnN0IHN1YnNjcmlwdGlvbnNSZXNwb25zZSA9IGF3YWl0IGZldGNoKGAke2Jhc2VVcmx9L2FwaS92MS9zdWJzY3JpcHRpb25zLmdldGAsIHtcbiAgICAgIG1ldGhvZDogJ0dFVCcsXG4gICAgICBoZWFkZXJzOiB1c2VySGVhZGVyc1xuICAgIH0pO1xuXG4gICAgaWYgKCFzdWJzY3JpcHRpb25zUmVzcG9uc2Uub2spIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ0ZhaWxlZCB0byBnZXQgc3Vic2NyaXB0aW9uczonLCBzdWJzY3JpcHRpb25zUmVzcG9uc2Uuc3RhdHVzKTtcbiAgICAgIGNvbnN0IGVycm9yVGV4dCA9IGF3YWl0IHN1YnNjcmlwdGlvbnNSZXNwb25zZS50ZXh0KCk7XG4gICAgICBjb25zb2xlLmVycm9yKCdTdWJzY3JpcHRpb25zIGVycm9yIGRldGFpbHM6JywgZXJyb3JUZXh0KTtcbiAgICAgIHJldHVybiBOZXh0UmVzcG9uc2UuanNvbih7IG1lc3NhZ2VzOiBbXSB9LCB7IHN0YXR1czogMjAwIH0pO1xuICAgIH1cblxuICAgIGNvbnN0IHN1YnNjcmlwdGlvbnNEYXRhID0gYXdhaXQgc3Vic2NyaXB0aW9uc1Jlc3BvbnNlLmpzb24oKTtcblxuICAgIGlmICghc3Vic2NyaXB0aW9uc0RhdGEuc3VjY2VzcyB8fCAhQXJyYXkuaXNBcnJheShzdWJzY3JpcHRpb25zRGF0YS51cGRhdGUpKSB7XG4gICAgICBjb25zb2xlLmVycm9yKCdJbnZhbGlkIHN1YnNjcmlwdGlvbnMgcmVzcG9uc2Ugc3RydWN0dXJlJyk7XG4gICAgICByZXR1cm4gTmV4dFJlc3BvbnNlLmpzb24oeyBtZXNzYWdlczogW10gfSwgeyBzdGF0dXM6IDIwMCB9KTtcbiAgICB9XG5cbiAgICAvLyBGaWx0ZXIgc3Vic2NyaXB0aW9ucyBmb3IgdGhlIGN1cnJlbnQgdXNlclxuICAgIGNvbnN0IHVzZXJTdWJzY3JpcHRpb25zID0gc3Vic2NyaXB0aW9uc0RhdGEudXBkYXRlLmZpbHRlcigoc3ViOiBhbnkpID0+IHtcbiAgICAgIC8vIE9ubHkgaW5jbHVkZSByb29tcyB3aXRoIHVucmVhZCBtZXNzYWdlcyBvciBhbGVydHNcbiAgICAgIGlmICghKHN1Yi51bnJlYWQgPiAwIHx8IHN1Yi5hbGVydCkpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgLy8gSW5jbHVkZSBhbGwgdHlwZXMgb2Ygcm9vbXMgdGhlIHVzZXIgaXMgc3Vic2NyaWJlZCB0b1xuICAgICAgcmV0dXJuIFsnZCcsICdjJywgJ3AnXS5pbmNsdWRlcyhzdWIudCk7XG4gICAgfSk7XG5cbiAgICBjb25zb2xlLmxvZygnRmlsdGVyZWQgdXNlciBzdWJzY3JpcHRpb25zOicsIHtcbiAgICAgIHVzZXJJZDogY3VycmVudFVzZXIuX2lkLFxuICAgICAgdXNlcm5hbWU6IGN1cnJlbnRVc2VyLnVzZXJuYW1lLFxuICAgICAgdG90YWxTdWJzY3JpcHRpb25zOiB1c2VyU3Vic2NyaXB0aW9ucy5sZW5ndGgsXG4gICAgICBzdWJzY3JpcHRpb25EZXRhaWxzOiB1c2VyU3Vic2NyaXB0aW9ucy5tYXAoKHN1YjogYW55KSA9PiAoe1xuICAgICAgICB0eXBlOiBzdWIudCxcbiAgICAgICAgbmFtZTogc3ViLmZuYW1lIHx8IHN1Yi5uYW1lLFxuICAgICAgICByaWQ6IHN1Yi5yaWQsXG4gICAgICAgIGFsZXJ0OiBzdWIuYWxlcnQsXG4gICAgICAgIHVucmVhZDogc3ViLnVucmVhZCxcbiAgICAgICAgdXNlck1lbnRpb25zOiBzdWIudXNlck1lbnRpb25zXG4gICAgICB9KSlcbiAgICB9KTtcblxuICAgIGNvbnN0IG1lc3NhZ2VzOiBhbnlbXSA9IFtdO1xuICAgIGNvbnN0IHByb2Nlc3NlZFJvb21zID0gbmV3IFNldCgpO1xuICAgIGNvbnN0IGxhdGVzdE1lc3NhZ2VQZXJSb29tOiB7IFtrZXk6IHN0cmluZ106IGFueSB9ID0ge307XG5cbiAgICAvLyBTdGVwIDU6IEZldGNoIG1lc3NhZ2VzIHVzaW5nIHVzZXIgdG9rZW5cbiAgICBmb3IgKGNvbnN0IHN1YnNjcmlwdGlvbiBvZiB1c2VyU3Vic2NyaXB0aW9ucykge1xuICAgICAgdHJ5IHtcbiAgICAgICAgLy8gRGV0ZXJtaW5lIHRoZSBjb3JyZWN0IGVuZHBvaW50IGFuZCBwYXJhbWV0ZXJzIGJhc2VkIG9uIHJvb20gdHlwZVxuICAgICAgICBsZXQgZW5kcG9pbnQ7XG4gICAgICAgIHN3aXRjaCAoc3Vic2NyaXB0aW9uLnQpIHtcbiAgICAgICAgICBjYXNlICdjJzpcbiAgICAgICAgICAgIGVuZHBvaW50ID0gJ2NoYW5uZWxzLm1lc3NhZ2VzJztcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgJ3AnOlxuICAgICAgICAgICAgZW5kcG9pbnQgPSAnZ3JvdXBzLm1lc3NhZ2VzJztcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgJ2QnOlxuICAgICAgICAgICAgZW5kcG9pbnQgPSAnaW0ubWVzc2FnZXMnO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcXVlcnlQYXJhbXMgPSBuZXcgVVJMU2VhcmNoUGFyYW1zKHtcbiAgICAgICAgICByb29tSWQ6IHN1YnNjcmlwdGlvbi5yaWQsXG4gICAgICAgICAgY291bnQ6IFN0cmluZyhNYXRoLm1heChzdWJzY3JpcHRpb24udW5yZWFkLCA1KSkgIC8vIEZldGNoIGF0IGxlYXN0IHRoZSBudW1iZXIgb2YgdW5yZWFkIG1lc3NhZ2VzXG4gICAgICAgIH0pO1xuICAgICAgICBcbiAgICAgICAgY29uc3QgbWVzc2FnZXNSZXNwb25zZSA9IGF3YWl0IGZldGNoKFxuICAgICAgICAgIGAke2Jhc2VVcmx9L2FwaS92MS8ke2VuZHBvaW50fT8ke3F1ZXJ5UGFyYW1zfWAsIHtcbiAgICAgICAgICAgIG1ldGhvZDogJ0dFVCcsXG4gICAgICAgICAgICBoZWFkZXJzOiB1c2VySGVhZGVyc1xuICAgICAgICAgIH1cbiAgICAgICAgKTtcblxuICAgICAgICBpZiAoIW1lc3NhZ2VzUmVzcG9uc2Uub2spIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKGBGYWlsZWQgdG8gZ2V0IG1lc3NhZ2VzIGZvciByb29tICR7c3Vic2NyaXB0aW9uLm5hbWV9OmAsIG1lc3NhZ2VzUmVzcG9uc2Uuc3RhdHVzKTtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IG1lc3NhZ2VEYXRhID0gYXdhaXQgbWVzc2FnZXNSZXNwb25zZS5qc29uKCk7XG4gICAgICAgIGNvbnNvbGUubG9nKGBNZXNzYWdlcyBmb3Igcm9vbSAke3N1YnNjcmlwdGlvbi5mbmFtZSB8fCBzdWJzY3JpcHRpb24ubmFtZX06YCwge1xuICAgICAgICAgIHN1Y2Nlc3M6IG1lc3NhZ2VEYXRhLnN1Y2Nlc3MsXG4gICAgICAgICAgY291bnQ6IG1lc3NhZ2VEYXRhLmNvdW50LFxuICAgICAgICAgIGhhc01lc3NhZ2VzOiBtZXNzYWdlRGF0YS5tZXNzYWdlcz8ubGVuZ3RoID4gMFxuICAgICAgICB9KTtcblxuICAgICAgICBpZiAobWVzc2FnZURhdGEuc3VjY2VzcyAmJiBtZXNzYWdlRGF0YS5tZXNzYWdlcz8ubGVuZ3RoID4gMCkge1xuICAgICAgICAgIC8vIEZpbHRlciBvdXQgc3lzdGVtIG1lc3NhZ2VzIGFuZCBqb2luIG5vdGlmaWNhdGlvbnMgZm9yIGNoYW5uZWxzXG4gICAgICAgICAgY29uc3QgdmFsaWRNZXNzYWdlcyA9IG1lc3NhZ2VEYXRhLm1lc3NhZ2VzLmZpbHRlcigobWVzc2FnZTogYW55KSA9PiB7XG4gICAgICAgICAgICAvLyBTa2lwIG1lc3NhZ2VzIHNlbnQgYnkgdGhlIGN1cnJlbnQgdXNlclxuICAgICAgICAgICAgaWYgKG1lc3NhZ2UudS5faWQgPT09IGN1cnJlbnRVc2VyLl9pZCkge1xuICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIEZvciBjaGFubmVscywgYXBwbHkgc3RyaWN0IGZpbHRlcmluZ1xuICAgICAgICAgICAgaWYgKHN1YnNjcmlwdGlvbi50ID09PSAnYycpIHtcbiAgICAgICAgICAgICAgaWYgKCFtZXNzYWdlLm1zZyB8fCAvLyBObyBtZXNzYWdlIHRleHRcbiAgICAgICAgICAgICAgICAgIG1lc3NhZ2UudCB8fCAvLyBTeXN0ZW0gbWVzc2FnZVxuICAgICAgICAgICAgICAgICAgIW1lc3NhZ2UudSB8fCAvLyBObyB1c2VyIGluZm9cbiAgICAgICAgICAgICAgICAgIG1lc3NhZ2UubXNnLmluY2x1ZGVzKCdoYXMgam9pbmVkIHRoZSBjaGFubmVsJykgfHxcbiAgICAgICAgICAgICAgICAgIG1lc3NhZ2UubXNnLmluY2x1ZGVzKCdoYXMgbGVmdCB0aGUgY2hhbm5lbCcpIHx8XG4gICAgICAgICAgICAgICAgICBtZXNzYWdlLm1zZy5pbmNsdWRlcygnYWRkZWQnKSB8fFxuICAgICAgICAgICAgICAgICAgbWVzc2FnZS5tc2cuaW5jbHVkZXMoJ3JlbW92ZWQnKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICAvLyBPbmx5IHByb2Nlc3MgdGhlIGxhdGVzdCB2YWxpZCBtZXNzYWdlIGZyb20gdGhpcyByb29tXG4gICAgICAgICAgaWYgKHZhbGlkTWVzc2FnZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgLy8gR2V0IHRoZSBsYXRlc3QgbWVzc2FnZSAodGhleSBzaG91bGQgYWxyZWFkeSBiZSBzb3J0ZWQgYnkgdGltZXN0YW1wKVxuICAgICAgICAgICAgY29uc3QgbGF0ZXN0TWVzc2FnZSA9IHZhbGlkTWVzc2FnZXNbMF07XG4gICAgICAgICAgICBjb25zdCBtZXNzYWdlVXNlciA9IGxhdGVzdE1lc3NhZ2UudSB8fCB7fTtcbiAgICAgICAgICAgIGNvbnN0IHVzZXJuYW1lID0gbWVzc2FnZVVzZXIudXNlcm5hbWUgfHwgJ3Vua25vd24nO1xuICAgICAgICAgICAgXG4gICAgICAgICAgICAvLyBTa2lwIGlmIHRoaXMgaXMgb3VyIG93biBtZXNzYWdlIChkb3VibGUtY2hlY2spXG4gICAgICAgICAgICBpZiAobWVzc2FnZVVzZXIuX2lkID09PSBjdXJyZW50VXNlci5faWQpIHtcbiAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIC8vIEdldCBwcm9wZXIgZGlzcGxheSBuYW1lc1xuICAgICAgICAgICAgbGV0IHJvb21EaXNwbGF5TmFtZSA9IHN1YnNjcmlwdGlvbi5mbmFtZSB8fCBzdWJzY3JpcHRpb24ubmFtZTtcbiAgICAgICAgICAgIGxldCB1c2VyRGlzcGxheU5hbWUgPSBtZXNzYWdlVXNlci5uYW1lIHx8IHVzZXJuYW1lO1xuICAgICAgICAgICAgXG4gICAgICAgICAgICAvLyBIYW5kbGUgY2FsbCBtZXNzYWdlc1xuICAgICAgICAgICAgbGV0IG1lc3NhZ2VUZXh0ID0gbGF0ZXN0TWVzc2FnZS5tc2cgfHwgJyc7XG4gICAgICAgICAgICBpZiAobWVzc2FnZVRleHQuaW5jbHVkZXMoJ3N0YXJ0ZWQgYSBjYWxsJykpIHtcbiAgICAgICAgICAgICAgbWVzc2FnZVRleHQgPSAn8J+TniBDYWxsIHJlY2VpdmVkJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIFxuICAgICAgICAgICAgLy8gRm9ybWF0IHRpbWVzdGFtcFxuICAgICAgICAgICAgY29uc3QgdGltZXN0YW1wID0gbmV3IERhdGUobGF0ZXN0TWVzc2FnZS50cyk7XG4gICAgICAgICAgICBjb25zdCBub3cgPSBuZXcgRGF0ZSgpO1xuICAgICAgICAgICAgbGV0IGZvcm1hdHRlZFRpbWUgPSAnJztcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgaWYgKGlzTmFOKHRpbWVzdGFtcC5nZXRUaW1lKCkpKSB7XG4gICAgICAgICAgICAgIGZvcm1hdHRlZFRpbWUgPSAnSW52YWxpZCBEYXRlJztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodGltZXN0YW1wLnRvRGF0ZVN0cmluZygpID09PSBub3cudG9EYXRlU3RyaW5nKCkpIHtcbiAgICAgICAgICAgICAgZm9ybWF0dGVkVGltZSA9IHRpbWVzdGFtcC50b0xvY2FsZVRpbWVTdHJpbmcoJ2ZyLUZSJywgeyBcbiAgICAgICAgICAgICAgICBob3VyOiAnMi1kaWdpdCcsIFxuICAgICAgICAgICAgICAgIG1pbnV0ZTogJzItZGlnaXQnIFxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGZvcm1hdHRlZFRpbWUgPSB0aW1lc3RhbXAudG9Mb2NhbGVEYXRlU3RyaW5nKCdmci1GUicsIHtcbiAgICAgICAgICAgICAgICBkYXk6ICcyLWRpZ2l0JyxcbiAgICAgICAgICAgICAgICBtb250aDogJ3Nob3J0J1xuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gQ3JlYXRlIGluaXRpYWxzIGZvciB0aGUgc2VuZGVyXG4gICAgICAgICAgICBjb25zdCBpbml0aWFscyA9IHVzZXJEaXNwbGF5TmFtZVxuICAgICAgICAgICAgICAuc3BsaXQoJyAnKVxuICAgICAgICAgICAgICAubWFwKChuOiBzdHJpbmcpID0+IG5bMF0pXG4gICAgICAgICAgICAgIC5zbGljZSgwLCAyKVxuICAgICAgICAgICAgICAuam9pbignJylcbiAgICAgICAgICAgICAgLnRvVXBwZXJDYXNlKCk7XG5cbiAgICAgICAgICAgIGNvbnN0IHByb2Nlc3NlZE1lc3NhZ2UgPSB7XG4gICAgICAgICAgICAgIGlkOiBsYXRlc3RNZXNzYWdlLl9pZCxcbiAgICAgICAgICAgICAgdGV4dDogbWVzc2FnZVRleHQsXG4gICAgICAgICAgICAgIHRpbWVzdGFtcDogZm9ybWF0dGVkVGltZSxcbiAgICAgICAgICAgICAgcmF3VGltZXN0YW1wOiBsYXRlc3RNZXNzYWdlLnRzLFxuICAgICAgICAgICAgICByb29tTmFtZTogcm9vbURpc3BsYXlOYW1lLFxuICAgICAgICAgICAgICByb29tVHlwZTogc3Vic2NyaXB0aW9uLnQsXG4gICAgICAgICAgICAgIHNlbmRlcjoge1xuICAgICAgICAgICAgICAgIF9pZDogbWVzc2FnZVVzZXIuX2lkLFxuICAgICAgICAgICAgICAgIHVzZXJuYW1lOiB1c2VybmFtZSxcbiAgICAgICAgICAgICAgICBuYW1lOiB1c2VyRGlzcGxheU5hbWUsXG4gICAgICAgICAgICAgICAgaW5pdGlhbHM6IGluaXRpYWxzLFxuICAgICAgICAgICAgICAgIGNvbG9yOiBnZXRBdmF0YXJDb2xvcih1c2VybmFtZSlcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgaXNPd25NZXNzYWdlOiBtZXNzYWdlVXNlci5faWQgPT09IGN1cnJlbnRVc2VyLl9pZCxcbiAgICAgICAgICAgICAgcm9vbToge1xuICAgICAgICAgICAgICAgIGlkOiBzdWJzY3JpcHRpb24ucmlkLFxuICAgICAgICAgICAgICAgIHR5cGU6IHN1YnNjcmlwdGlvbi50LFxuICAgICAgICAgICAgICAgIG5hbWU6IHJvb21EaXNwbGF5TmFtZSxcbiAgICAgICAgICAgICAgICBpc0NoYW5uZWw6IHN1YnNjcmlwdGlvbi50ID09PSAnYycsXG4gICAgICAgICAgICAgICAgaXNQcml2YXRlR3JvdXA6IHN1YnNjcmlwdGlvbi50ID09PSAncCcsXG4gICAgICAgICAgICAgICAgaXNEaXJlY3Q6IHN1YnNjcmlwdGlvbi50ID09PSAnZCcsXG4gICAgICAgICAgICAgICAgbGluazogYCR7YmFzZVVybH0vJHtzdWJzY3JpcHRpb24udCA9PT0gJ2QnID8gJ2RpcmVjdCcgOiBzdWJzY3JpcHRpb24udCA9PT0gJ3AnID8gJ2dyb3VwJyA6ICdjaGFubmVsJ30vJHtzdWJzY3JpcHRpb24ubmFtZX1gLFxuICAgICAgICAgICAgICAgIHVucmVhZDogc3Vic2NyaXB0aW9uLnVucmVhZCxcbiAgICAgICAgICAgICAgICBhbGVydDogc3Vic2NyaXB0aW9uLmFsZXJ0LFxuICAgICAgICAgICAgICAgIHVzZXJNZW50aW9uczogc3Vic2NyaXB0aW9uLnVzZXJNZW50aW9uc1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICAvLyBTdG9yZSB0aGlzIG1lc3NhZ2UgaWYgaXQncyB0aGUgbGF0ZXN0IGZvciB0aGlzIHJvb21cbiAgICAgICAgICAgIGlmICghbGF0ZXN0TWVzc2FnZVBlclJvb21bc3Vic2NyaXB0aW9uLnJpZF0gfHwgXG4gICAgICAgICAgICAgICAgbmV3IERhdGUobGF0ZXN0TWVzc2FnZS50cykuZ2V0VGltZSgpID4gbmV3IERhdGUobGF0ZXN0TWVzc2FnZVBlclJvb21bc3Vic2NyaXB0aW9uLnJpZF0ucmF3VGltZXN0YW1wKS5nZXRUaW1lKCkpIHtcbiAgICAgICAgICAgICAgbGF0ZXN0TWVzc2FnZVBlclJvb21bc3Vic2NyaXB0aW9uLnJpZF0gPSBwcm9jZXNzZWRNZXNzYWdlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihgRXJyb3IgZmV0Y2hpbmcgbWVzc2FnZXMgZm9yIHJvb20gJHtzdWJzY3JpcHRpb24ubmFtZX06YCwgZXJyb3IpO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBDb252ZXJ0IHRoZSBsYXRlc3QgbWVzc2FnZXMgb2JqZWN0IHRvIGFuIGFycmF5IGFuZCBzb3J0IGJ5IHRpbWVzdGFtcFxuICAgIGNvbnN0IHNvcnRlZE1lc3NhZ2VzID0gT2JqZWN0LnZhbHVlcyhsYXRlc3RNZXNzYWdlUGVyUm9vbSlcbiAgICAgIC5zb3J0KChhLCBiKSA9PiB7XG4gICAgICAgIGNvbnN0IGRhdGVBID0gbmV3IERhdGUoYS5yYXdUaW1lc3RhbXApO1xuICAgICAgICBjb25zdCBkYXRlQiA9IG5ldyBEYXRlKGIucmF3VGltZXN0YW1wKTtcbiAgICAgICAgcmV0dXJuIGRhdGVCLmdldFRpbWUoKSAtIGRhdGVBLmdldFRpbWUoKTtcbiAgICAgIH0pXG4gICAgICAuc2xpY2UoMCwgMTApO1xuXG4gICAgcmV0dXJuIE5leHRSZXNwb25zZS5qc29uKHtcbiAgICAgIG1lc3NhZ2VzOiBzb3J0ZWRNZXNzYWdlcyxcbiAgICAgIHRvdGFsOiBPYmplY3Qua2V5cyhsYXRlc3RNZXNzYWdlUGVyUm9vbSkubGVuZ3RoLFxuICAgICAgaGFzTW9yZTogT2JqZWN0LmtleXMobGF0ZXN0TWVzc2FnZVBlclJvb20pLmxlbmd0aCA+IDEwXG4gICAgfSwgeyBzdGF0dXM6IDIwMCB9KTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBjb25zb2xlLmVycm9yKCdFcnJvciBpbiBtZXNzYWdlcyBlbmRwb2ludDonLCBlcnJvcik7XG4gICAgcmV0dXJuIE5leHRSZXNwb25zZS5qc29uKHsgbWVzc2FnZXM6IFtdLCB0b3RhbDogMCwgaGFzTW9yZTogZmFsc2UgfSwgeyBzdGF0dXM6IDIwMCB9KTtcbiAgfVxufVxuXG4vLyBIZWxwZXIgZnVuY3Rpb24gdG8gZ2VuZXJhdGUgY29uc2lzdGVudCBhdmF0YXIgY29sb3JzXG5mdW5jdGlvbiBnZXRBdmF0YXJDb2xvcih1c2VybmFtZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3QgY29sb3JzID0gW1xuICAgICcjRkY3NDUyJywgLy8gQ29yYWxcbiAgICAnIzRDQUY1MCcsIC8vIEdyZWVuXG4gICAgJyMyMTk2RjMnLCAvLyBCbHVlXG4gICAgJyM5QzI3QjAnLCAvLyBQdXJwbGVcbiAgICAnI0ZGOTgwMCcsIC8vIE9yYW5nZVxuICAgICcjMDBCQ0Q0JywgLy8gQ3lhblxuICAgICcjNzk1NTQ4JywgLy8gQnJvd25cbiAgICAnIzYwN0Q4QicgIC8vIEJsdWUgR3JleVxuICBdO1xuICBcbiAgLy8gR2VuZXJhdGUgYSBjb25zaXN0ZW50IGluZGV4IGJhc2VkIG9uIHVzZXJuYW1lXG4gIGNvbnN0IGluZGV4ID0gdXNlcm5hbWVcbiAgICAuc3BsaXQoJycpXG4gICAgLnJlZHVjZSgoYWNjLCBjaGFyKSA9PiBhY2MgKyBjaGFyLmNoYXJDb2RlQXQoMCksIDApICUgY29sb3JzLmxlbmd0aDtcbiAgXG4gIHJldHVybiBjb2xvcnNbaW5kZXhdO1xufSAiXSwibmFtZXMiOlsiZ2V0U2VydmVyU2Vzc2lvbiIsImF1dGhPcHRpb25zIiwiTmV4dFJlc3BvbnNlIiwiZ2V0VXNlclRva2VuIiwiYmFzZVVybCIsImFkbWluSGVhZGVycyIsInByb2Nlc3MiLCJlbnYiLCJST0NLRVRfQ0hBVF9UT0tFTiIsIlJPQ0tFVF9DSEFUX1VTRVJfSUQiLCJjcmVhdGVUb2tlblJlc3BvbnNlIiwiZmV0Y2giLCJtZXRob2QiLCJoZWFkZXJzIiwib2siLCJjb25zb2xlIiwiZXJyb3IiLCJzdGF0dXMiLCJ0b2tlbkRhdGEiLCJqc29uIiwiYXV0aFRva2VuIiwiZGF0YSIsInVzZXJJZCIsIkdFVCIsInJlcXVlc3QiLCJzZXNzaW9uIiwidXNlciIsImVtYWlsIiwibWVzc2FnZXMiLCJORVhUX1BVQkxJQ19JRlJBTUVfUEFST0xFX1VSTCIsInNwbGl0IiwibG9nIiwidXNlcm5hbWUiLCJ1c2Vyc1Jlc3BvbnNlIiwidXNlcnNEYXRhIiwic3VjY2VzcyIsImNvdW50IiwidXNlcnNDb3VudCIsInVzZXJzIiwibGVuZ3RoIiwiY3VycmVudFVzZXIiLCJmaW5kIiwiZW1haWxzIiwic29tZSIsImFkZHJlc3MiLCJpZCIsIl9pZCIsImJvZHkiLCJKU09OIiwic3RyaW5naWZ5IiwiZXJyb3JUZXh0IiwidGV4dCIsInVzZXJIZWFkZXJzIiwic3Vic2NyaXB0aW9uc1Jlc3BvbnNlIiwic3Vic2NyaXB0aW9uc0RhdGEiLCJBcnJheSIsImlzQXJyYXkiLCJ1cGRhdGUiLCJ1c2VyU3Vic2NyaXB0aW9ucyIsImZpbHRlciIsInN1YiIsInVucmVhZCIsImFsZXJ0IiwiaW5jbHVkZXMiLCJ0IiwidG90YWxTdWJzY3JpcHRpb25zIiwic3Vic2NyaXB0aW9uRGV0YWlscyIsIm1hcCIsInR5cGUiLCJuYW1lIiwiZm5hbWUiLCJyaWQiLCJ1c2VyTWVudGlvbnMiLCJwcm9jZXNzZWRSb29tcyIsIlNldCIsImxhdGVzdE1lc3NhZ2VQZXJSb29tIiwic3Vic2NyaXB0aW9uIiwiZW5kcG9pbnQiLCJxdWVyeVBhcmFtcyIsIlVSTFNlYXJjaFBhcmFtcyIsInJvb21JZCIsIlN0cmluZyIsIk1hdGgiLCJtYXgiLCJtZXNzYWdlc1Jlc3BvbnNlIiwibWVzc2FnZURhdGEiLCJoYXNNZXNzYWdlcyIsInZhbGlkTWVzc2FnZXMiLCJtZXNzYWdlIiwidSIsIm1zZyIsImxhdGVzdE1lc3NhZ2UiLCJtZXNzYWdlVXNlciIsInJvb21EaXNwbGF5TmFtZSIsInVzZXJEaXNwbGF5TmFtZSIsIm1lc3NhZ2VUZXh0IiwidGltZXN0YW1wIiwiRGF0ZSIsInRzIiwibm93IiwiZm9ybWF0dGVkVGltZSIsImlzTmFOIiwiZ2V0VGltZSIsInRvRGF0ZVN0cmluZyIsInRvTG9jYWxlVGltZVN0cmluZyIsImhvdXIiLCJtaW51dGUiLCJ0b0xvY2FsZURhdGVTdHJpbmciLCJkYXkiLCJtb250aCIsImluaXRpYWxzIiwibiIsInNsaWNlIiwiam9pbiIsInRvVXBwZXJDYXNlIiwicHJvY2Vzc2VkTWVzc2FnZSIsInJhd1RpbWVzdGFtcCIsInJvb21OYW1lIiwicm9vbVR5cGUiLCJzZW5kZXIiLCJjb2xvciIsImdldEF2YXRhckNvbG9yIiwiaXNPd25NZXNzYWdlIiwicm9vbSIsImlzQ2hhbm5lbCIsImlzUHJpdmF0ZUdyb3VwIiwiaXNEaXJlY3QiLCJsaW5rIiwic29ydGVkTWVzc2FnZXMiLCJPYmplY3QiLCJ2YWx1ZXMiLCJzb3J0IiwiYSIsImIiLCJkYXRlQSIsImRhdGVCIiwidG90YWwiLCJrZXlzIiwiaGFzTW9yZSIsImNvbG9ycyIsImluZGV4IiwicmVkdWNlIiwiYWNjIiwiY2hhciIsImNoYXJDb2RlQXQiXSwiaWdub3JlTGlzdCI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///(rsc)/./app/api/rocket-chat/messages/route.ts\n");
/***/ }),
/***/ "(rsc)/./node_modules/next/dist/build/webpack/loaders/next-app-loader/index.js?name=app%2Fapi%2Frocket-chat%2Fmessages%2Froute&page=%2Fapi%2Frocket-chat%2Fmessages%2Froute&appPaths=&pagePath=private-next-app-dir%2Fapi%2Frocket-chat%2Fmessages%2Froute.ts&appDir=%2Fhome%2Falma%2Fnextgen%2FNeah-mail%2Fapp&pageExtensions=tsx&pageExtensions=ts&pageExtensions=jsx&pageExtensions=js&rootDir=%2Fhome%2Falma%2Fnextgen%2FNeah-mail&isDev=true&tsconfigPath=tsconfig.json&basePath=&assetPrefix=&nextConfigOutput=&preferredRegion=&middlewareConfig=e30%3D!":
/*!****************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************!*\
!*** ./node_modules/next/dist/build/webpack/loaders/next-app-loader/index.js?name=app%2Fapi%2Frocket-chat%2Fmessages%2Froute&page=%2Fapi%2Frocket-chat%2Fmessages%2Froute&appPaths=&pagePath=private-next-app-dir%2Fapi%2Frocket-chat%2Fmessages%2Froute.ts&appDir=%2Fhome%2Falma%2Fnextgen%2FNeah-mail%2Fapp&pageExtensions=tsx&pageExtensions=ts&pageExtensions=jsx&pageExtensions=js&rootDir=%2Fhome%2Falma%2Fnextgen%2FNeah-mail&isDev=true&tsconfigPath=tsconfig.json&basePath=&assetPrefix=&nextConfigOutput=&preferredRegion=&middlewareConfig=e30%3D! ***!
\****************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ patchFetch: () => (/* binding */ patchFetch),\n/* harmony export */ routeModule: () => (/* binding */ routeModule),\n/* harmony export */ serverHooks: () => (/* binding */ serverHooks),\n/* harmony export */ workAsyncStorage: () => (/* binding */ workAsyncStorage),\n/* harmony export */ workUnitAsyncStorage: () => (/* binding */ workUnitAsyncStorage)\n/* harmony export */ });\n/* harmony import */ var next_dist_server_route_modules_app_route_module_compiled__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! next/dist/server/route-modules/app-route/module.compiled */ \"(rsc)/./node_modules/next/dist/server/route-modules/app-route/module.compiled.js\");\n/* harmony import */ var next_dist_server_route_modules_app_route_module_compiled__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(next_dist_server_route_modules_app_route_module_compiled__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var next_dist_server_route_kind__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! next/dist/server/route-kind */ \"(rsc)/./node_modules/next/dist/server/route-kind.js\");\n/* harmony import */ var next_dist_server_lib_patch_fetch__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! next/dist/server/lib/patch-fetch */ \"(rsc)/./node_modules/next/dist/server/lib/patch-fetch.js\");\n/* harmony import */ var next_dist_server_lib_patch_fetch__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(next_dist_server_lib_patch_fetch__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var _home_alma_nextgen_Neah_mail_app_api_rocket_chat_messages_route_ts__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./app/api/rocket-chat/messages/route.ts */ \"(rsc)/./app/api/rocket-chat/messages/route.ts\");\n\n\n\n\n// We inject the nextConfigOutput here so that we can use them in the route\n// module.\nconst nextConfigOutput = \"\"\nconst routeModule = new next_dist_server_route_modules_app_route_module_compiled__WEBPACK_IMPORTED_MODULE_0__.AppRouteRouteModule({\n definition: {\n kind: next_dist_server_route_kind__WEBPACK_IMPORTED_MODULE_1__.RouteKind.APP_ROUTE,\n page: \"/api/rocket-chat/messages/route\",\n pathname: \"/api/rocket-chat/messages\",\n filename: \"route\",\n bundlePath: \"app/api/rocket-chat/messages/route\"\n },\n resolvedPagePath: \"/home/alma/nextgen/Neah-mail/app/api/rocket-chat/messages/route.ts\",\n nextConfigOutput,\n userland: _home_alma_nextgen_Neah_mail_app_api_rocket_chat_messages_route_ts__WEBPACK_IMPORTED_MODULE_3__\n});\n// Pull out the exports that we need to expose from the module. This should\n// be eliminated when we've moved the other routes to the new format. These\n// are used to hook into the route.\nconst { workAsyncStorage, workUnitAsyncStorage, serverHooks } = routeModule;\nfunction patchFetch() {\n return (0,next_dist_server_lib_patch_fetch__WEBPACK_IMPORTED_MODULE_2__.patchFetch)({\n workAsyncStorage,\n workUnitAsyncStorage\n });\n}\n\n\n//# sourceMappingURL=app-route.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKHJzYykvLi9ub2RlX21vZHVsZXMvbmV4dC9kaXN0L2J1aWxkL3dlYnBhY2svbG9hZGVycy9uZXh0LWFwcC1sb2FkZXIvaW5kZXguanM/bmFtZT1hcHAlMkZhcGklMkZyb2NrZXQtY2hhdCUyRm1lc3NhZ2VzJTJGcm91dGUmcGFnZT0lMkZhcGklMkZyb2NrZXQtY2hhdCUyRm1lc3NhZ2VzJTJGcm91dGUmYXBwUGF0aHM9JnBhZ2VQYXRoPXByaXZhdGUtbmV4dC1hcHAtZGlyJTJGYXBpJTJGcm9ja2V0LWNoYXQlMkZtZXNzYWdlcyUyRnJvdXRlLnRzJmFwcERpcj0lMkZob21lJTJGYWxtYSUyRm5leHRnZW4lMkZOZWFoLW1haWwlMkZhcHAmcGFnZUV4dGVuc2lvbnM9dHN4JnBhZ2VFeHRlbnNpb25zPXRzJnBhZ2VFeHRlbnNpb25zPWpzeCZwYWdlRXh0ZW5zaW9ucz1qcyZyb290RGlyPSUyRmhvbWUlMkZhbG1hJTJGbmV4dGdlbiUyRk5lYWgtbWFpbCZpc0Rldj10cnVlJnRzY29uZmlnUGF0aD10c2NvbmZpZy5qc29uJmJhc2VQYXRoPSZhc3NldFByZWZpeD0mbmV4dENvbmZpZ091dHB1dD0mcHJlZmVycmVkUmVnaW9uPSZtaWRkbGV3YXJlQ29uZmlnPWUzMCUzRCEiLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7QUFBK0Y7QUFDdkM7QUFDcUI7QUFDa0I7QUFDL0Y7QUFDQTtBQUNBO0FBQ0Esd0JBQXdCLHlHQUFtQjtBQUMzQztBQUNBLGNBQWMsa0VBQVM7QUFDdkI7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLFlBQVk7QUFDWixDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0EsUUFBUSxzREFBc0Q7QUFDOUQ7QUFDQSxXQUFXLDRFQUFXO0FBQ3RCO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDMEY7O0FBRTFGIiwic291cmNlcyI6WyIiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQXBwUm91dGVSb3V0ZU1vZHVsZSB9IGZyb20gXCJuZXh0L2Rpc3Qvc2VydmVyL3JvdXRlLW1vZHVsZXMvYXBwLXJvdXRlL21vZHVsZS5jb21waWxlZFwiO1xuaW1wb3J0IHsgUm91dGVLaW5kIH0gZnJvbSBcIm5leHQvZGlzdC9zZXJ2ZXIvcm91dGUta2luZFwiO1xuaW1wb3J0IHsgcGF0Y2hGZXRjaCBhcyBfcGF0Y2hGZXRjaCB9IGZyb20gXCJuZXh0L2Rpc3Qvc2VydmVyL2xpYi9wYXRjaC1mZXRjaFwiO1xuaW1wb3J0ICogYXMgdXNlcmxhbmQgZnJvbSBcIi9ob21lL2FsbWEvbmV4dGdlbi9OZWFoLW1haWwvYXBwL2FwaS9yb2NrZXQtY2hhdC9tZXNzYWdlcy9yb3V0ZS50c1wiO1xuLy8gV2UgaW5qZWN0IHRoZSBuZXh0Q29uZmlnT3V0cHV0IGhlcmUgc28gdGhhdCB3ZSBjYW4gdXNlIHRoZW0gaW4gdGhlIHJvdXRlXG4vLyBtb2R1bGUuXG5jb25zdCBuZXh0Q29uZmlnT3V0cHV0ID0gXCJcIlxuY29uc3Qgcm91dGVNb2R1bGUgPSBuZXcgQXBwUm91dGVSb3V0ZU1vZHVsZSh7XG4gICAgZGVmaW5pdGlvbjoge1xuICAgICAgICBraW5kOiBSb3V0ZUtpbmQuQVBQX1JPVVRFLFxuICAgICAgICBwYWdlOiBcIi9hcGkvcm9ja2V0LWNoYXQvbWVzc2FnZXMvcm91dGVcIixcbiAgICAgICAgcGF0aG5hbWU6IFwiL2FwaS9yb2NrZXQtY2hhdC9tZXNzYWdlc1wiLFxuICAgICAgICBmaWxlbmFtZTogXCJyb3V0ZVwiLFxuICAgICAgICBidW5kbGVQYXRoOiBcImFwcC9hcGkvcm9ja2V0LWNoYXQvbWVzc2FnZXMvcm91dGVcIlxuICAgIH0sXG4gICAgcmVzb2x2ZWRQYWdlUGF0aDogXCIvaG9tZS9hbG1hL25leHRnZW4vTmVhaC1tYWlsL2FwcC9hcGkvcm9ja2V0LWNoYXQvbWVzc2FnZXMvcm91dGUudHNcIixcbiAgICBuZXh0Q29uZmlnT3V0cHV0LFxuICAgIHVzZXJsYW5kXG59KTtcbi8vIFB1bGwgb3V0IHRoZSBleHBvcnRzIHRoYXQgd2UgbmVlZCB0byBleHBvc2UgZnJvbSB0aGUgbW9kdWxlLiBUaGlzIHNob3VsZFxuLy8gYmUgZWxpbWluYXRlZCB3aGVuIHdlJ3ZlIG1vdmVkIHRoZSBvdGhlciByb3V0ZXMgdG8gdGhlIG5ldyBmb3JtYXQuIFRoZXNlXG4vLyBhcmUgdXNlZCB0byBob29rIGludG8gdGhlIHJvdXRlLlxuY29uc3QgeyB3b3JrQXN5bmNTdG9yYWdlLCB3b3JrVW5pdEFzeW5jU3RvcmFnZSwgc2VydmVySG9va3MgfSA9IHJvdXRlTW9kdWxlO1xuZnVuY3Rpb24gcGF0Y2hGZXRjaCgpIHtcbiAgICByZXR1cm4gX3BhdGNoRmV0Y2goe1xuICAgICAgICB3b3JrQXN5bmNTdG9yYWdlLFxuICAgICAgICB3b3JrVW5pdEFzeW5jU3RvcmFnZVxuICAgIH0pO1xufVxuZXhwb3J0IHsgcm91dGVNb2R1bGUsIHdvcmtBc3luY1N0b3JhZ2UsIHdvcmtVbml0QXN5bmNTdG9yYWdlLCBzZXJ2ZXJIb29rcywgcGF0Y2hGZXRjaCwgIH07XG5cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWFwcC1yb3V0ZS5qcy5tYXAiXSwibmFtZXMiOltdLCJpZ25vcmVMaXN0IjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///(rsc)/./node_modules/next/dist/build/webpack/loaders/next-app-loader/index.js?name=app%2Fapi%2Frocket-chat%2Fmessages%2Froute&page=%2Fapi%2Frocket-chat%2Fmessages%2Froute&appPaths=&pagePath=private-next-app-dir%2Fapi%2Frocket-chat%2Fmessages%2Froute.ts&appDir=%2Fhome%2Falma%2Fnextgen%2FNeah-mail%2Fapp&pageExtensions=tsx&pageExtensions=ts&pageExtensions=jsx&pageExtensions=js&rootDir=%2Fhome%2Falma%2Fnextgen%2FNeah-mail&isDev=true&tsconfigPath=tsconfig.json&basePath=&assetPrefix=&nextConfigOutput=&preferredRegion=&middlewareConfig=e30%3D!\n");
/***/ }),
/***/ "(rsc)/./node_modules/next/dist/build/webpack/loaders/next-flight-client-entry-loader.js?server=true!":
/*!******************************************************************************************************!*\
!*** ./node_modules/next/dist/build/webpack/loaders/next-flight-client-entry-loader.js?server=true! ***!
\******************************************************************************************************/
/***/ (() => {
/***/ }),
/***/ "(ssr)/./node_modules/next/dist/build/webpack/loaders/next-flight-client-entry-loader.js?server=true!":
/*!******************************************************************************************************!*\
!*** ./node_modules/next/dist/build/webpack/loaders/next-flight-client-entry-loader.js?server=true! ***!
\******************************************************************************************************/
/***/ (() => {
/***/ }),
/***/ "../app-render/after-task-async-storage.external":
/*!***********************************************************************************!*\
!*** external "next/dist/server/app-render/after-task-async-storage.external.js" ***!
\***********************************************************************************/
/***/ ((module) => {
"use strict";
module.exports = require("next/dist/server/app-render/after-task-async-storage.external.js");
/***/ }),
/***/ "../app-render/work-async-storage.external":
/*!*****************************************************************************!*\
!*** external "next/dist/server/app-render/work-async-storage.external.js" ***!
\*****************************************************************************/
/***/ ((module) => {
"use strict";
module.exports = require("next/dist/server/app-render/work-async-storage.external.js");
/***/ }),
/***/ "./work-unit-async-storage.external":
/*!**********************************************************************************!*\
!*** external "next/dist/server/app-render/work-unit-async-storage.external.js" ***!
\**********************************************************************************/
/***/ ((module) => {
"use strict";
module.exports = require("next/dist/server/app-render/work-unit-async-storage.external.js");
/***/ }),
/***/ "assert":
/*!*************************!*\
!*** external "assert" ***!
\*************************/
/***/ ((module) => {
"use strict";
module.exports = require("assert");
/***/ }),
/***/ "buffer":
/*!*************************!*\
!*** external "buffer" ***!
\*************************/
/***/ ((module) => {
"use strict";
module.exports = require("buffer");
/***/ }),
/***/ "crypto":
/*!*************************!*\
!*** external "crypto" ***!
\*************************/
/***/ ((module) => {
"use strict";
module.exports = require("crypto");
/***/ }),
/***/ "events":
/*!*************************!*\
!*** external "events" ***!
\*************************/
/***/ ((module) => {
"use strict";
module.exports = require("events");
/***/ }),
/***/ "http":
/*!***********************!*\
!*** external "http" ***!
\***********************/
/***/ ((module) => {
"use strict";
module.exports = require("http");
/***/ }),
/***/ "https":
/*!************************!*\
!*** external "https" ***!
\************************/
/***/ ((module) => {
"use strict";
module.exports = require("https");
/***/ }),
/***/ "next/dist/compiled/next-server/app-page.runtime.dev.js":
/*!*************************************************************************!*\
!*** external "next/dist/compiled/next-server/app-page.runtime.dev.js" ***!
\*************************************************************************/
/***/ ((module) => {
"use strict";
module.exports = require("next/dist/compiled/next-server/app-page.runtime.dev.js");
/***/ }),
/***/ "next/dist/compiled/next-server/app-route.runtime.dev.js":
/*!**************************************************************************!*\
!*** external "next/dist/compiled/next-server/app-route.runtime.dev.js" ***!
\**************************************************************************/
/***/ ((module) => {
"use strict";
module.exports = require("next/dist/compiled/next-server/app-route.runtime.dev.js");
/***/ }),
/***/ "querystring":
/*!******************************!*\
!*** external "querystring" ***!
\******************************/
/***/ ((module) => {
"use strict";
module.exports = require("querystring");
/***/ }),
/***/ "url":
/*!**********************!*\
!*** external "url" ***!
\**********************/
/***/ ((module) => {
"use strict";
module.exports = require("url");
/***/ }),
/***/ "util":
/*!***********************!*\
!*** external "util" ***!
\***********************/
/***/ ((module) => {
"use strict";
module.exports = require("util");
/***/ }),
/***/ "zlib":
/*!***********************!*\
!*** external "zlib" ***!
\***********************/
/***/ ((module) => {
"use strict";
module.exports = require("zlib");
/***/ })
};
;
// load runtime
var __webpack_require__ = require("../../../../webpack-runtime.js");
__webpack_require__.C(exports);
var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId))
var __webpack_exports__ = __webpack_require__.X(0, ["vendor-chunks/next","vendor-chunks/jose","vendor-chunks/next-auth","vendor-chunks/openid-client","vendor-chunks/@babel","vendor-chunks/oauth","vendor-chunks/preact","vendor-chunks/uuid","vendor-chunks/yallist","vendor-chunks/preact-render-to-string","vendor-chunks/cookie","vendor-chunks/oidc-token-hash","vendor-chunks/@panva","vendor-chunks/jwt-decode"], () => (__webpack_exec__("(rsc)/./node_modules/next/dist/build/webpack/loaders/next-app-loader/index.js?name=app%2Fapi%2Frocket-chat%2Fmessages%2Froute&page=%2Fapi%2Frocket-chat%2Fmessages%2Froute&appPaths=&pagePath=private-next-app-dir%2Fapi%2Frocket-chat%2Fmessages%2Froute.ts&appDir=%2Fhome%2Falma%2Fnextgen%2FNeah-mail%2Fapp&pageExtensions=tsx&pageExtensions=ts&pageExtensions=jsx&pageExtensions=js&rootDir=%2Fhome%2Falma%2Fnextgen%2FNeah-mail&isDev=true&tsconfigPath=tsconfig.json&basePath=&assetPrefix=&nextConfigOutput=&preferredRegion=&middlewareConfig=e30%3D!")));
module.exports = __webpack_exports__;
})();